/** * Args parser for feature-triage CLI. * Precedence: CLI flag > env var > default. */ const DEFAULTS = { quarantineDays: 14, overrideThumbs: 5, overrideCommenters: 3, staleNeedsDays: 30, staleDeferDays: 90, ideiaDir: "_ideia", changelog: "CHANGELOG.md", output: null, dryRun: false, verbose: false, onlyIssues: [], }; const ENV_MAP = { quarantineDays: "FEATURE_QUARANTINE_DAYS", overrideThumbs: "FEATURE_OVERRIDE_THUMBS", overrideCommenters: "FEATURE_OVERRIDE_COMMENTERS", staleNeedsDays: "FEATURE_STALE_NEEDS_DAYS", staleDeferDays: "FEATURE_STALE_DEFER_DAYS", }; function takeNext(argv, i) { if (i + 1 >= argv.length) { throw new Error(`${argv[i]} requires a value`); } return argv[i + 1]; } export function parseArgs(argv, env = process.env) { const out = { ...DEFAULTS, owner: null, repo: null }; for (const [key, envKey] of Object.entries(ENV_MAP)) { if (env[envKey] !== undefined) { const n = Number(env[envKey]); if (Number.isFinite(n)) out[key] = n; } } for (let i = 0; i < argv.length; i++) { const a = argv[i]; switch (a) { case "--owner": out.owner = takeNext(argv, i); i++; break; case "--repo": out.repo = takeNext(argv, i); i++; break; case "--quarantine-days": out.quarantineDays = Number(takeNext(argv, i)); i++; break; case "--override-thumbs": out.overrideThumbs = Number(takeNext(argv, i)); i++; break; case "--override-commenters": out.overrideCommenters = Number(takeNext(argv, i)); i++; break; case "--stale-needs-days": out.staleNeedsDays = Number(takeNext(argv, i)); i++; break; case "--stale-defer-days": out.staleDeferDays = Number(takeNext(argv, i)); i++; break; case "--ideia-dir": out.ideiaDir = takeNext(argv, i); i++; break; case "--changelog": out.changelog = takeNext(argv, i); i++; break; case "--output": out.output = takeNext(argv, i); i++; break; case "--dry-run": out.dryRun = true; break; case "--verbose": out.verbose = true; break; case "--only-issues": out.onlyIssues = takeNext(argv, i) .split(",") .map((s) => Number(s.trim())) .filter(Number.isFinite); i++; break; default: throw new Error(`Unknown arg: ${a}`); } } if (!out.owner) throw new Error("--owner is required"); if (!out.repo) throw new Error("--repo is required"); return out; }