| 185 | |
| 186 | |
| 187 | def build_list_parser() -> argparse.ArgumentParser: |
| 188 | parser = argparse.ArgumentParser( |
| 189 | description="List projects discovered from repository metadata." |
| 190 | ) |
| 191 | parser.add_argument( |
| 192 | "--repo-root", |
| 193 | default=".", |
| 194 | help="Repository root. Defaults to current directory.", |
| 195 | ) |
| 196 | parser.add_argument( |
| 197 | "--metadata", |
| 198 | default=None, |
| 199 | help="Metadata JSON path. Defaults to tools/project_metadata.json.", |
| 200 | ) |
| 201 | parser.add_argument( |
| 202 | "--format", |
| 203 | choices=("plain", "json", "github-matrix"), |
| 204 | default="plain", |
| 205 | help="Output format.", |
| 206 | ) |
| 207 | parser.add_argument( |
| 208 | "--changed-from", |
| 209 | default=None, |
| 210 | help="Git base ref for changed-project detection.", |
| 211 | ) |
| 212 | parser.add_argument( |
| 213 | "--changed-to", |
| 214 | default="HEAD", |
| 215 | help="Git head ref for changed-project detection.", |
| 216 | ) |
| 217 | parser.add_argument( |
| 218 | "--validate-metadata", |
| 219 | action="store_true", |
| 220 | help="Validate metadata before listing.", |
| 221 | ) |
| 222 | return parser |
| 223 | |
| 224 | |
| 225 | def list_main(argv: list[str] | None = None) -> int: |