@jokerized/getresearchdone 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/plugin.json +103 -0
- package/README.md +211 -0
- package/agents/grd-baseline-assessor.md +684 -0
- package/agents/grd-code-reviewer.md +300 -0
- package/agents/grd-codebase-mapper.md +355 -0
- package/agents/grd-critique-agent.md +119 -0
- package/agents/grd-debugger.md +519 -0
- package/agents/grd-deep-diver.md +737 -0
- package/agents/grd-eval-planner.md +913 -0
- package/agents/grd-eval-reporter.md +717 -0
- package/agents/grd-executor.md +683 -0
- package/agents/grd-feasibility-analyst.md +624 -0
- package/agents/grd-integration-checker.md +367 -0
- package/agents/grd-knowledge-miner.md +81 -0
- package/agents/grd-migrator.md +88 -0
- package/agents/grd-phase-researcher.md +697 -0
- package/agents/grd-plan-checker.md +443 -0
- package/agents/grd-planner.md +1532 -0
- package/agents/grd-product-owner.md +562 -0
- package/agents/grd-project-researcher.md +513 -0
- package/agents/grd-research-synthesizer.md +273 -0
- package/agents/grd-roadmapper.md +798 -0
- package/agents/grd-surveyor.md +566 -0
- package/agents/grd-verifier.md +893 -0
- package/bin/gd.js +4 -0
- package/bin/gd.ts +227 -0
- package/bin/grd-manifest.js +4 -0
- package/bin/grd-manifest.ts +286 -0
- package/bin/grd-mcp-server.js +4 -0
- package/bin/grd-mcp-server.ts +124 -0
- package/bin/grd-tools.js +4 -0
- package/bin/grd-tools.ts +2471 -0
- package/bin/postinstall.js +4 -0
- package/bin/postinstall.ts +80 -0
- package/commands/add-phase.md +123 -0
- package/commands/add-todo.md +87 -0
- package/commands/assess-baseline.md +289 -0
- package/commands/autopilot.md +100 -0
- package/commands/autoplan.md +55 -0
- package/commands/check-todos.md +87 -0
- package/commands/compare-methods.md +262 -0
- package/commands/complete-milestone.md +225 -0
- package/commands/debug.md +372 -0
- package/commands/deep-dive.md +288 -0
- package/commands/discover.md +281 -0
- package/commands/discuss-phase.md +188 -0
- package/commands/discuss.md +55 -0
- package/commands/eval-report.md +310 -0
- package/commands/evolve.md +79 -0
- package/commands/execute-phase.md +1017 -0
- package/commands/feasibility.md +292 -0
- package/commands/help.md +407 -0
- package/commands/init.md +1508 -0
- package/commands/insert-phase.md +113 -0
- package/commands/iterate.md +327 -0
- package/commands/list-phase-assumptions.md +217 -0
- package/commands/long-term-roadmap.md +202 -0
- package/commands/map-codebase.md +111 -0
- package/commands/migrate.md +159 -0
- package/commands/new-milestone.md +169 -0
- package/commands/pause-work.md +83 -0
- package/commands/plan-milestone-gaps.md +373 -0
- package/commands/plan-phase.md +655 -0
- package/commands/principles.md +328 -0
- package/commands/product-plan.md +319 -0
- package/commands/progress.md +481 -0
- package/commands/quick.md +167 -0
- package/commands/reapply-patches.md +154 -0
- package/commands/remove-phase.md +97 -0
- package/commands/requirement.md +96 -0
- package/commands/resume-project.md +113 -0
- package/commands/settings.md +1144 -0
- package/commands/survey.md +242 -0
- package/commands/sync.md +246 -0
- package/commands/tracker-setup.md +322 -0
- package/commands/update.md +202 -0
- package/commands/verify-phase.md +335 -0
- package/commands/verify-work.md +701 -0
- package/commands/wireup.md +29 -0
- package/dist/bin/gd.d.ts +3 -0
- package/dist/bin/gd.d.ts.map +1 -0
- package/dist/bin/gd.js +178 -0
- package/dist/bin/gd.js.map +1 -0
- package/dist/bin/grd-manifest.d.ts +3 -0
- package/dist/bin/grd-manifest.d.ts.map +1 -0
- package/dist/bin/grd-manifest.js +202 -0
- package/dist/bin/grd-manifest.js.map +1 -0
- package/dist/bin/grd-mcp-server.d.ts +3 -0
- package/dist/bin/grd-mcp-server.d.ts.map +1 -0
- package/dist/bin/grd-mcp-server.js +71 -0
- package/dist/bin/grd-mcp-server.js.map +1 -0
- package/dist/bin/grd-tools.d.ts +3 -0
- package/dist/bin/grd-tools.d.ts.map +1 -0
- package/dist/bin/grd-tools.js +1680 -0
- package/dist/bin/grd-tools.js.map +1 -0
- package/dist/bin/postinstall.d.ts +3 -0
- package/dist/bin/postinstall.d.ts.map +1 -0
- package/dist/bin/postinstall.js +61 -0
- package/dist/bin/postinstall.js.map +1 -0
- package/dist/lib/autopilot-milestone.d.ts +2 -0
- package/dist/lib/autopilot-milestone.d.ts.map +1 -0
- package/dist/lib/autopilot-milestone.js +94 -0
- package/dist/lib/autopilot-milestone.js.map +1 -0
- package/dist/lib/autopilot-pipeline.d.ts +2 -0
- package/dist/lib/autopilot-pipeline.d.ts.map +1 -0
- package/dist/lib/autopilot-pipeline.js +830 -0
- package/dist/lib/autopilot-pipeline.js.map +1 -0
- package/dist/lib/autopilot-waves.d.ts +2 -0
- package/dist/lib/autopilot-waves.d.ts.map +1 -0
- package/dist/lib/autopilot-waves.js +266 -0
- package/dist/lib/autopilot-waves.js.map +1 -0
- package/dist/lib/autopilot.d.ts +2 -0
- package/dist/lib/autopilot.d.ts.map +1 -0
- package/dist/lib/autopilot.js +1314 -0
- package/dist/lib/autopilot.js.map +1 -0
- package/dist/lib/autoplan.d.ts +2 -0
- package/dist/lib/autoplan.d.ts.map +1 -0
- package/dist/lib/autoplan.js +198 -0
- package/dist/lib/autoplan.js.map +1 -0
- package/dist/lib/autoresearch.d.ts +2 -0
- package/dist/lib/autoresearch.d.ts.map +1 -0
- package/dist/lib/autoresearch.js +626 -0
- package/dist/lib/autoresearch.js.map +1 -0
- package/dist/lib/backend.d.ts +2 -0
- package/dist/lib/backend.d.ts.map +1 -0
- package/dist/lib/backend.js +1036 -0
- package/dist/lib/backend.js.map +1 -0
- package/dist/lib/benchmark.d.ts +99 -0
- package/dist/lib/benchmark.d.ts.map +1 -0
- package/dist/lib/benchmark.js +278 -0
- package/dist/lib/benchmark.js.map +1 -0
- package/dist/lib/citations.d.ts +2 -0
- package/dist/lib/citations.d.ts.map +1 -0
- package/dist/lib/citations.js +642 -0
- package/dist/lib/citations.js.map +1 -0
- package/dist/lib/cleanup.d.ts +2 -0
- package/dist/lib/cleanup.d.ts.map +1 -0
- package/dist/lib/cleanup.js +1222 -0
- package/dist/lib/cleanup.js.map +1 -0
- package/dist/lib/cli/adapters.d.ts +10 -0
- package/dist/lib/cli/adapters.d.ts.map +1 -0
- package/dist/lib/cli/adapters.js +27 -0
- package/dist/lib/cli/adapters.js.map +1 -0
- package/dist/lib/cli/agent.d.ts +17 -0
- package/dist/lib/cli/agent.d.ts.map +1 -0
- package/dist/lib/cli/agent.js +53 -0
- package/dist/lib/cli/agent.js.map +1 -0
- package/dist/lib/cli/index.d.ts +21 -0
- package/dist/lib/cli/index.d.ts.map +1 -0
- package/dist/lib/cli/index.js +264 -0
- package/dist/lib/cli/index.js.map +1 -0
- package/dist/lib/cli/output.d.ts +20 -0
- package/dist/lib/cli/output.d.ts.map +1 -0
- package/dist/lib/cli/output.js +22 -0
- package/dist/lib/cli/output.js.map +1 -0
- package/dist/lib/cli/scan-dispatch.d.ts +9 -0
- package/dist/lib/cli/scan-dispatch.d.ts.map +1 -0
- package/dist/lib/cli/scan-dispatch.js +107 -0
- package/dist/lib/cli/scan-dispatch.js.map +1 -0
- package/dist/lib/cli/tools.d.ts +16 -0
- package/dist/lib/cli/tools.d.ts.map +1 -0
- package/dist/lib/cli/tools.js +168 -0
- package/dist/lib/cli/tools.js.map +1 -0
- package/dist/lib/commands/_dashboard-parsers.d.ts +2 -0
- package/dist/lib/commands/_dashboard-parsers.d.ts.map +1 -0
- package/dist/lib/commands/_dashboard-parsers.js +192 -0
- package/dist/lib/commands/_dashboard-parsers.js.map +1 -0
- package/dist/lib/commands/analysis.d.ts +2 -0
- package/dist/lib/commands/analysis.d.ts.map +1 -0
- package/dist/lib/commands/analysis.js +1418 -0
- package/dist/lib/commands/analysis.js.map +1 -0
- package/dist/lib/commands/assumptions.d.ts +2 -0
- package/dist/lib/commands/assumptions.d.ts.map +1 -0
- package/dist/lib/commands/assumptions.js +166 -0
- package/dist/lib/commands/assumptions.js.map +1 -0
- package/dist/lib/commands/blame.d.ts +2 -0
- package/dist/lib/commands/blame.d.ts.map +1 -0
- package/dist/lib/commands/blame.js +133 -0
- package/dist/lib/commands/blame.js.map +1 -0
- package/dist/lib/commands/budget.d.ts +2 -0
- package/dist/lib/commands/budget.d.ts.map +1 -0
- package/dist/lib/commands/budget.js +100 -0
- package/dist/lib/commands/budget.js.map +1 -0
- package/dist/lib/commands/check-plans.d.ts +2 -0
- package/dist/lib/commands/check-plans.d.ts.map +1 -0
- package/dist/lib/commands/check-plans.js +190 -0
- package/dist/lib/commands/check-plans.js.map +1 -0
- package/dist/lib/commands/config.d.ts +2 -0
- package/dist/lib/commands/config.d.ts.map +1 -0
- package/dist/lib/commands/config.js +188 -0
- package/dist/lib/commands/config.js.map +1 -0
- package/dist/lib/commands/dashboard.d.ts +2 -0
- package/dist/lib/commands/dashboard.d.ts.map +1 -0
- package/dist/lib/commands/dashboard.js +466 -0
- package/dist/lib/commands/dashboard.js.map +1 -0
- package/dist/lib/commands/estimate.d.ts +2 -0
- package/dist/lib/commands/estimate.d.ts.map +1 -0
- package/dist/lib/commands/estimate.js +148 -0
- package/dist/lib/commands/estimate.js.map +1 -0
- package/dist/lib/commands/eval-diff.d.ts +2 -0
- package/dist/lib/commands/eval-diff.d.ts.map +1 -0
- package/dist/lib/commands/eval-diff.js +213 -0
- package/dist/lib/commands/eval-diff.js.map +1 -0
- package/dist/lib/commands/freshness.d.ts +2 -0
- package/dist/lib/commands/freshness.d.ts.map +1 -0
- package/dist/lib/commands/freshness.js +163 -0
- package/dist/lib/commands/freshness.js.map +1 -0
- package/dist/lib/commands/health.d.ts +2 -0
- package/dist/lib/commands/health.d.ts.map +1 -0
- package/dist/lib/commands/health.js +435 -0
- package/dist/lib/commands/health.js.map +1 -0
- package/dist/lib/commands/index.d.ts +2 -0
- package/dist/lib/commands/index.d.ts.map +1 -0
- package/dist/lib/commands/index.js +128 -0
- package/dist/lib/commands/index.js.map +1 -0
- package/dist/lib/commands/install.d.ts +56 -0
- package/dist/lib/commands/install.d.ts.map +1 -0
- package/dist/lib/commands/install.js +214 -0
- package/dist/lib/commands/install.js.map +1 -0
- package/dist/lib/commands/knowhow-aggregator.d.ts +2 -0
- package/dist/lib/commands/knowhow-aggregator.d.ts.map +1 -0
- package/dist/lib/commands/knowhow-aggregator.js +279 -0
- package/dist/lib/commands/knowhow-aggregator.js.map +1 -0
- package/dist/lib/commands/knowledge-search.d.ts +2 -0
- package/dist/lib/commands/knowledge-search.d.ts.map +1 -0
- package/dist/lib/commands/knowledge-search.js +113 -0
- package/dist/lib/commands/knowledge-search.js.map +1 -0
- package/dist/lib/commands/long-term-roadmap.d.ts +2 -0
- package/dist/lib/commands/long-term-roadmap.d.ts.map +1 -0
- package/dist/lib/commands/long-term-roadmap.js +272 -0
- package/dist/lib/commands/long-term-roadmap.js.map +1 -0
- package/dist/lib/commands/patterns.d.ts +91 -0
- package/dist/lib/commands/patterns.d.ts.map +1 -0
- package/dist/lib/commands/patterns.js +391 -0
- package/dist/lib/commands/patterns.js.map +1 -0
- package/dist/lib/commands/phase-info.d.ts +2 -0
- package/dist/lib/commands/phase-info.d.ts.map +1 -0
- package/dist/lib/commands/phase-info.js +509 -0
- package/dist/lib/commands/phase-info.js.map +1 -0
- package/dist/lib/commands/plan-lint.d.ts +56 -0
- package/dist/lib/commands/plan-lint.d.ts.map +1 -0
- package/dist/lib/commands/plan-lint.js +481 -0
- package/dist/lib/commands/plan-lint.js.map +1 -0
- package/dist/lib/commands/plan-phase.d.ts +53 -0
- package/dist/lib/commands/plan-phase.d.ts.map +1 -0
- package/dist/lib/commands/plan-phase.js +288 -0
- package/dist/lib/commands/plan-phase.js.map +1 -0
- package/dist/lib/commands/progress.d.ts +2 -0
- package/dist/lib/commands/progress.d.ts.map +1 -0
- package/dist/lib/commands/progress.js +266 -0
- package/dist/lib/commands/progress.js.map +1 -0
- package/dist/lib/commands/quality.d.ts +2 -0
- package/dist/lib/commands/quality.d.ts.map +1 -0
- package/dist/lib/commands/quality.js +80 -0
- package/dist/lib/commands/quality.js.map +1 -0
- package/dist/lib/commands/rollback.d.ts +2 -0
- package/dist/lib/commands/rollback.d.ts.map +1 -0
- package/dist/lib/commands/rollback.js +145 -0
- package/dist/lib/commands/rollback.js.map +1 -0
- package/dist/lib/commands/scan.d.ts +25 -0
- package/dist/lib/commands/scan.d.ts.map +1 -0
- package/dist/lib/commands/scan.js +28 -0
- package/dist/lib/commands/scan.js.map +1 -0
- package/dist/lib/commands/search.d.ts +2 -0
- package/dist/lib/commands/search.d.ts.map +1 -0
- package/dist/lib/commands/search.js +212 -0
- package/dist/lib/commands/search.js.map +1 -0
- package/dist/lib/commands/select-candidate.d.ts +128 -0
- package/dist/lib/commands/select-candidate.d.ts.map +1 -0
- package/dist/lib/commands/select-candidate.js +518 -0
- package/dist/lib/commands/select-candidate.js.map +1 -0
- package/dist/lib/commands/singularity.d.ts +2 -0
- package/dist/lib/commands/singularity.d.ts.map +1 -0
- package/dist/lib/commands/singularity.js +185 -0
- package/dist/lib/commands/singularity.js.map +1 -0
- package/dist/lib/commands/slug-timestamp.d.ts +2 -0
- package/dist/lib/commands/slug-timestamp.d.ts.map +1 -0
- package/dist/lib/commands/slug-timestamp.js +54 -0
- package/dist/lib/commands/slug-timestamp.js.map +1 -0
- package/dist/lib/commands/tail.d.ts +2 -0
- package/dist/lib/commands/tail.d.ts.map +1 -0
- package/dist/lib/commands/tail.js +100 -0
- package/dist/lib/commands/tail.js.map +1 -0
- package/dist/lib/commands/todo.d.ts +2 -0
- package/dist/lib/commands/todo.d.ts.map +1 -0
- package/dist/lib/commands/todo.js +200 -0
- package/dist/lib/commands/todo.js.map +1 -0
- package/dist/lib/commands/watch.d.ts +2 -0
- package/dist/lib/commands/watch.d.ts.map +1 -0
- package/dist/lib/commands/watch.js +72 -0
- package/dist/lib/commands/watch.js.map +1 -0
- package/dist/lib/complexity.d.ts +55 -0
- package/dist/lib/complexity.d.ts.map +1 -0
- package/dist/lib/complexity.js +80 -0
- package/dist/lib/complexity.js.map +1 -0
- package/dist/lib/context/agents.d.ts +2 -0
- package/dist/lib/context/agents.d.ts.map +1 -0
- package/dist/lib/context/agents.js +344 -0
- package/dist/lib/context/agents.js.map +1 -0
- package/dist/lib/context/base.d.ts +2 -0
- package/dist/lib/context/base.d.ts.map +1 -0
- package/dist/lib/context/base.js +81 -0
- package/dist/lib/context/base.js.map +1 -0
- package/dist/lib/context/execute.d.ts +2 -0
- package/dist/lib/context/execute.d.ts.map +1 -0
- package/dist/lib/context/execute.js +753 -0
- package/dist/lib/context/execute.js.map +1 -0
- package/dist/lib/context/index.d.ts +2 -0
- package/dist/lib/context/index.d.ts.map +1 -0
- package/dist/lib/context/index.js +88 -0
- package/dist/lib/context/index.js.map +1 -0
- package/dist/lib/context/progress.d.ts +2 -0
- package/dist/lib/context/progress.d.ts.map +1 -0
- package/dist/lib/context/progress.js +178 -0
- package/dist/lib/context/progress.js.map +1 -0
- package/dist/lib/context/project.d.ts +2 -0
- package/dist/lib/context/project.d.ts.map +1 -0
- package/dist/lib/context/project.js +413 -0
- package/dist/lib/context/project.js.map +1 -0
- package/dist/lib/context/research.d.ts +2 -0
- package/dist/lib/context/research.d.ts.map +1 -0
- package/dist/lib/context/research.js +466 -0
- package/dist/lib/context/research.js.map +1 -0
- package/dist/lib/dead-ends.d.ts +28 -0
- package/dist/lib/dead-ends.d.ts.map +1 -0
- package/dist/lib/dead-ends.js +451 -0
- package/dist/lib/dead-ends.js.map +1 -0
- package/dist/lib/deps.d.ts +2 -0
- package/dist/lib/deps.d.ts.map +1 -0
- package/dist/lib/deps.js +630 -0
- package/dist/lib/deps.js.map +1 -0
- package/dist/lib/discussion.d.ts +2 -0
- package/dist/lib/discussion.d.ts.map +1 -0
- package/dist/lib/discussion.js +1041 -0
- package/dist/lib/discussion.js.map +1 -0
- package/dist/lib/drift.d.ts +36 -0
- package/dist/lib/drift.d.ts.map +1 -0
- package/dist/lib/drift.js +481 -0
- package/dist/lib/drift.js.map +1 -0
- package/dist/lib/evolve/_dimensions-features.d.ts +2 -0
- package/dist/lib/evolve/_dimensions-features.d.ts.map +1 -0
- package/dist/lib/evolve/_dimensions-features.js +369 -0
- package/dist/lib/evolve/_dimensions-features.js.map +1 -0
- package/dist/lib/evolve/_dimensions.d.ts +2 -0
- package/dist/lib/evolve/_dimensions.d.ts.map +1 -0
- package/dist/lib/evolve/_dimensions.js +358 -0
- package/dist/lib/evolve/_dimensions.js.map +1 -0
- package/dist/lib/evolve/_product-ideation.d.ts +2 -0
- package/dist/lib/evolve/_product-ideation.d.ts.map +1 -0
- package/dist/lib/evolve/_product-ideation.js +281 -0
- package/dist/lib/evolve/_product-ideation.js.map +1 -0
- package/dist/lib/evolve/_prompts.d.ts +2 -0
- package/dist/lib/evolve/_prompts.d.ts.map +1 -0
- package/dist/lib/evolve/_prompts.js +153 -0
- package/dist/lib/evolve/_prompts.js.map +1 -0
- package/dist/lib/evolve/cli.d.ts +2 -0
- package/dist/lib/evolve/cli.d.ts.map +1 -0
- package/dist/lib/evolve/cli.js +224 -0
- package/dist/lib/evolve/cli.js.map +1 -0
- package/dist/lib/evolve/discovery.d.ts +2 -0
- package/dist/lib/evolve/discovery.d.ts.map +1 -0
- package/dist/lib/evolve/discovery.js +391 -0
- package/dist/lib/evolve/discovery.js.map +1 -0
- package/dist/lib/evolve/index.d.ts +2 -0
- package/dist/lib/evolve/index.d.ts.map +1 -0
- package/dist/lib/evolve/index.js +88 -0
- package/dist/lib/evolve/index.js.map +1 -0
- package/dist/lib/evolve/orchestrator.d.ts +2 -0
- package/dist/lib/evolve/orchestrator.d.ts.map +1 -0
- package/dist/lib/evolve/orchestrator.js +851 -0
- package/dist/lib/evolve/orchestrator.js.map +1 -0
- package/dist/lib/evolve/scoring.d.ts +2 -0
- package/dist/lib/evolve/scoring.d.ts.map +1 -0
- package/dist/lib/evolve/scoring.js +118 -0
- package/dist/lib/evolve/scoring.js.map +1 -0
- package/dist/lib/evolve/state.d.ts +2 -0
- package/dist/lib/evolve/state.d.ts.map +1 -0
- package/dist/lib/evolve/state.js +264 -0
- package/dist/lib/evolve/state.js.map +1 -0
- package/dist/lib/evolve/types.d.ts +249 -0
- package/dist/lib/evolve/types.d.ts.map +1 -0
- package/dist/lib/evolve/types.js +3 -0
- package/dist/lib/evolve/types.js.map +1 -0
- package/dist/lib/frontmatter.d.ts +2 -0
- package/dist/lib/frontmatter.d.ts.map +1 -0
- package/dist/lib/frontmatter.js +513 -0
- package/dist/lib/frontmatter.js.map +1 -0
- package/dist/lib/gates.d.ts +2 -0
- package/dist/lib/gates.d.ts.map +1 -0
- package/dist/lib/gates.js +578 -0
- package/dist/lib/gates.js.map +1 -0
- package/dist/lib/genome.d.ts +10 -0
- package/dist/lib/genome.d.ts.map +1 -0
- package/dist/lib/genome.js +368 -0
- package/dist/lib/genome.js.map +1 -0
- package/dist/lib/got.d.ts +2 -0
- package/dist/lib/got.d.ts.map +1 -0
- package/dist/lib/got.js +280 -0
- package/dist/lib/got.js.map +1 -0
- package/dist/lib/invariants.d.ts +2 -0
- package/dist/lib/invariants.d.ts.map +1 -0
- package/dist/lib/invariants.js +298 -0
- package/dist/lib/invariants.js.map +1 -0
- package/dist/lib/knowledge.d.ts +2 -0
- package/dist/lib/knowledge.d.ts.map +1 -0
- package/dist/lib/knowledge.js +658 -0
- package/dist/lib/knowledge.js.map +1 -0
- package/dist/lib/long-term-roadmap.d.ts +2 -0
- package/dist/lib/long-term-roadmap.d.ts.map +1 -0
- package/dist/lib/long-term-roadmap.js +602 -0
- package/dist/lib/long-term-roadmap.js.map +1 -0
- package/dist/lib/markdown-split.d.ts +2 -0
- package/dist/lib/markdown-split.d.ts.map +1 -0
- package/dist/lib/markdown-split.js +199 -0
- package/dist/lib/markdown-split.js.map +1 -0
- package/dist/lib/mcp-server.d.ts +2 -0
- package/dist/lib/mcp-server.d.ts.map +1 -0
- package/dist/lib/mcp-server.js +2424 -0
- package/dist/lib/mcp-server.js.map +1 -0
- package/dist/lib/metrics.d.ts +16 -0
- package/dist/lib/metrics.d.ts.map +1 -0
- package/dist/lib/metrics.js +48 -0
- package/dist/lib/metrics.js.map +1 -0
- package/dist/lib/overstory.d.ts +2 -0
- package/dist/lib/overstory.d.ts.map +1 -0
- package/dist/lib/overstory.js +211 -0
- package/dist/lib/overstory.js.map +1 -0
- package/dist/lib/parallel.d.ts +2 -0
- package/dist/lib/parallel.d.ts.map +1 -0
- package/dist/lib/parallel.js +349 -0
- package/dist/lib/parallel.js.map +1 -0
- package/dist/lib/paths.d.ts +2 -0
- package/dist/lib/paths.d.ts.map +1 -0
- package/dist/lib/paths.js +254 -0
- package/dist/lib/paths.js.map +1 -0
- package/dist/lib/phase-complete-llm.d.ts +22 -0
- package/dist/lib/phase-complete-llm.d.ts.map +1 -0
- package/dist/lib/phase-complete-llm.js +331 -0
- package/dist/lib/phase-complete-llm.js.map +1 -0
- package/dist/lib/phase-complete.d.ts +46 -0
- package/dist/lib/phase-complete.d.ts.map +1 -0
- package/dist/lib/phase-complete.js +278 -0
- package/dist/lib/phase-complete.js.map +1 -0
- package/dist/lib/phase-io.d.ts +2 -0
- package/dist/lib/phase-io.d.ts.map +1 -0
- package/dist/lib/phase-io.js +126 -0
- package/dist/lib/phase-io.js.map +1 -0
- package/dist/lib/phase.d.ts +2 -0
- package/dist/lib/phase.d.ts.map +1 -0
- package/dist/lib/phase.js +1344 -0
- package/dist/lib/phase.js.map +1 -0
- package/dist/lib/plan-tournament.d.ts +63 -0
- package/dist/lib/plan-tournament.d.ts.map +1 -0
- package/dist/lib/plan-tournament.js +353 -0
- package/dist/lib/plan-tournament.js.map +1 -0
- package/dist/lib/refinement.d.ts +74 -0
- package/dist/lib/refinement.d.ts.map +1 -0
- package/dist/lib/refinement.js +283 -0
- package/dist/lib/refinement.js.map +1 -0
- package/dist/lib/requirements.d.ts +2 -0
- package/dist/lib/requirements.d.ts.map +1 -0
- package/dist/lib/requirements.js +355 -0
- package/dist/lib/requirements.js.map +1 -0
- package/dist/lib/research-bundle.d.ts +2 -0
- package/dist/lib/research-bundle.d.ts.map +1 -0
- package/dist/lib/research-bundle.js +246 -0
- package/dist/lib/research-bundle.js.map +1 -0
- package/dist/lib/roadmap.d.ts +2 -0
- package/dist/lib/roadmap.d.ts.map +1 -0
- package/dist/lib/roadmap.js +541 -0
- package/dist/lib/roadmap.js.map +1 -0
- package/dist/lib/sample.d.ts +16 -0
- package/dist/lib/sample.d.ts.map +1 -0
- package/dist/lib/sample.js +20 -0
- package/dist/lib/sample.js.map +1 -0
- package/dist/lib/scaffold.d.ts +2 -0
- package/dist/lib/scaffold.d.ts.map +1 -0
- package/dist/lib/scaffold.js +355 -0
- package/dist/lib/scaffold.js.map +1 -0
- package/dist/lib/scan/_utils.d.ts +11 -0
- package/dist/lib/scan/_utils.d.ts.map +1 -0
- package/dist/lib/scan/_utils.js +36 -0
- package/dist/lib/scan/_utils.js.map +1 -0
- package/dist/lib/scan/base64.d.ts +15 -0
- package/dist/lib/scan/base64.d.ts.map +1 -0
- package/dist/lib/scan/base64.js +66 -0
- package/dist/lib/scan/base64.js.map +1 -0
- package/dist/lib/scan/ignorefile.d.ts +30 -0
- package/dist/lib/scan/ignorefile.d.ts.map +1 -0
- package/dist/lib/scan/ignorefile.js +101 -0
- package/dist/lib/scan/ignorefile.js.map +1 -0
- package/dist/lib/scan/injection.d.ts +14 -0
- package/dist/lib/scan/injection.d.ts.map +1 -0
- package/dist/lib/scan/injection.js +39 -0
- package/dist/lib/scan/injection.js.map +1 -0
- package/dist/lib/scan/patterns.d.ts +17 -0
- package/dist/lib/scan/patterns.d.ts.map +1 -0
- package/dist/lib/scan/patterns.js +123 -0
- package/dist/lib/scan/patterns.js.map +1 -0
- package/dist/lib/scan/strip-markdown.d.ts +7 -0
- package/dist/lib/scan/strip-markdown.d.ts.map +1 -0
- package/dist/lib/scan/strip-markdown.js +38 -0
- package/dist/lib/scan/strip-markdown.js.map +1 -0
- package/dist/lib/scan/types.d.ts +23 -0
- package/dist/lib/scan/types.d.ts.map +1 -0
- package/dist/lib/scan/types.js +3 -0
- package/dist/lib/scan/types.js.map +1 -0
- package/dist/lib/scheduler-wait.d.ts +2 -0
- package/dist/lib/scheduler-wait.d.ts.map +1 -0
- package/dist/lib/scheduler-wait.js +59 -0
- package/dist/lib/scheduler-wait.js.map +1 -0
- package/dist/lib/scheduler.d.ts +254 -0
- package/dist/lib/scheduler.d.ts.map +1 -0
- package/dist/lib/scheduler.js +1147 -0
- package/dist/lib/scheduler.js.map +1 -0
- package/dist/lib/state.d.ts +2 -0
- package/dist/lib/state.d.ts.map +1 -0
- package/dist/lib/state.js +744 -0
- package/dist/lib/state.js.map +1 -0
- package/dist/lib/think.d.ts +18 -0
- package/dist/lib/think.d.ts.map +1 -0
- package/dist/lib/think.js +317 -0
- package/dist/lib/think.js.map +1 -0
- package/dist/lib/tracker.d.ts +2 -0
- package/dist/lib/tracker.d.ts.map +1 -0
- package/dist/lib/tracker.js +1121 -0
- package/dist/lib/tracker.js.map +1 -0
- package/dist/lib/types.d.ts +1514 -0
- package/dist/lib/types.d.ts.map +1 -0
- package/dist/lib/types.js +4 -0
- package/dist/lib/types.js.map +1 -0
- package/dist/lib/utils.d.ts +2 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/utils.js +1363 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/lib/verify.d.ts +2 -0
- package/dist/lib/verify.d.ts.map +1 -0
- package/dist/lib/verify.js +1153 -0
- package/dist/lib/verify.js.map +1 -0
- package/dist/lib/wireup/autofix.d.ts +2 -0
- package/dist/lib/wireup/autofix.d.ts.map +1 -0
- package/dist/lib/wireup/autofix.js +188 -0
- package/dist/lib/wireup/autofix.js.map +1 -0
- package/dist/lib/wireup/cli.d.ts +2 -0
- package/dist/lib/wireup/cli.d.ts.map +1 -0
- package/dist/lib/wireup/cli.js +194 -0
- package/dist/lib/wireup/cli.js.map +1 -0
- package/dist/lib/wireup/detection.d.ts +47 -0
- package/dist/lib/wireup/detection.d.ts.map +1 -0
- package/dist/lib/wireup/detection.js +410 -0
- package/dist/lib/wireup/detection.js.map +1 -0
- package/dist/lib/wireup/discovery.d.ts +2 -0
- package/dist/lib/wireup/discovery.d.ts.map +1 -0
- package/dist/lib/wireup/discovery.js +934 -0
- package/dist/lib/wireup/discovery.js.map +1 -0
- package/dist/lib/wireup/execution.d.ts +2 -0
- package/dist/lib/wireup/execution.d.ts.map +1 -0
- package/dist/lib/wireup/execution.js +573 -0
- package/dist/lib/wireup/execution.js.map +1 -0
- package/dist/lib/wireup/index.d.ts +2 -0
- package/dist/lib/wireup/index.d.ts.map +1 -0
- package/dist/lib/wireup/index.js +85 -0
- package/dist/lib/wireup/index.js.map +1 -0
- package/dist/lib/wireup/orchestrator.d.ts +2 -0
- package/dist/lib/wireup/orchestrator.d.ts.map +1 -0
- package/dist/lib/wireup/orchestrator.js +366 -0
- package/dist/lib/wireup/orchestrator.js.map +1 -0
- package/dist/lib/wireup/report.d.ts +47 -0
- package/dist/lib/wireup/report.d.ts.map +1 -0
- package/dist/lib/wireup/report.js +201 -0
- package/dist/lib/wireup/report.js.map +1 -0
- package/dist/lib/wireup/scenarios.d.ts +2 -0
- package/dist/lib/wireup/scenarios.d.ts.map +1 -0
- package/dist/lib/wireup/scenarios.js +516 -0
- package/dist/lib/wireup/scenarios.js.map +1 -0
- package/dist/lib/wireup/state.d.ts +2 -0
- package/dist/lib/wireup/state.d.ts.map +1 -0
- package/dist/lib/wireup/state.js +102 -0
- package/dist/lib/wireup/state.js.map +1 -0
- package/dist/lib/wireup/types.d.ts +376 -0
- package/dist/lib/wireup/types.d.ts.map +1 -0
- package/dist/lib/wireup/types.js +3 -0
- package/dist/lib/wireup/types.js.map +1 -0
- package/dist/lib/worktree.d.ts +2 -0
- package/dist/lib/worktree.d.ts.map +1 -0
- package/dist/lib/worktree.js +999 -0
- package/dist/lib/worktree.js.map +1 -0
- package/lib/autopilot-milestone.ts +136 -0
- package/lib/autopilot-pipeline.ts +1179 -0
- package/lib/autopilot-waves.ts +361 -0
- package/lib/autopilot.ts +1874 -0
- package/lib/autoplan.ts +280 -0
- package/lib/autoresearch.js +4 -0
- package/lib/autoresearch.ts +886 -0
- package/lib/backend.ts +1252 -0
- package/lib/benchmark.ts +341 -0
- package/lib/citations.ts +760 -0
- package/lib/cleanup.ts +1588 -0
- package/lib/cli/adapters.ts +41 -0
- package/lib/cli/agent.ts +83 -0
- package/lib/cli/index.ts +273 -0
- package/lib/cli/output.ts +33 -0
- package/lib/cli/scan-dispatch.ts +130 -0
- package/lib/cli/tools.ts +198 -0
- package/lib/commands/_dashboard-parsers.ts +275 -0
- package/lib/commands/analysis.ts +1851 -0
- package/lib/commands/assumptions.ts +232 -0
- package/lib/commands/blame.ts +174 -0
- package/lib/commands/budget.ts +148 -0
- package/lib/commands/check-plans.ts +233 -0
- package/lib/commands/config.ts +287 -0
- package/lib/commands/dashboard.ts +680 -0
- package/lib/commands/estimate.ts +204 -0
- package/lib/commands/eval-diff.ts +252 -0
- package/lib/commands/freshness.ts +213 -0
- package/lib/commands/health.ts +607 -0
- package/lib/commands/index.ts +266 -0
- package/lib/commands/install.ts +307 -0
- package/lib/commands/knowhow-aggregator.ts +345 -0
- package/lib/commands/knowledge-search.ts +153 -0
- package/lib/commands/long-term-roadmap.ts +390 -0
- package/lib/commands/patterns.ts +465 -0
- package/lib/commands/phase-info.ts +698 -0
- package/lib/commands/plan-lint.ts +546 -0
- package/lib/commands/plan-phase.ts +375 -0
- package/lib/commands/progress.ts +319 -0
- package/lib/commands/quality.ts +138 -0
- package/lib/commands/rollback.ts +195 -0
- package/lib/commands/scan.ts +72 -0
- package/lib/commands/search.ts +300 -0
- package/lib/commands/select-candidate.ts +687 -0
- package/lib/commands/singularity.ts +222 -0
- package/lib/commands/slug-timestamp.ts +74 -0
- package/lib/commands/tail.ts +129 -0
- package/lib/commands/todo.ts +273 -0
- package/lib/commands/watch.ts +80 -0
- package/lib/complexity.ts +117 -0
- package/lib/context/agents.ts +505 -0
- package/lib/context/base.ts +123 -0
- package/lib/context/execute.ts +977 -0
- package/lib/context/index.ts +110 -0
- package/lib/context/progress.ts +278 -0
- package/lib/context/project.ts +531 -0
- package/lib/context/research.ts +646 -0
- package/lib/dead-ends.ts +506 -0
- package/lib/deps.ts +773 -0
- package/lib/discussion.ts +1275 -0
- package/lib/drift.ts +519 -0
- package/lib/evolve/_dimensions-features.ts +525 -0
- package/lib/evolve/_dimensions.ts +511 -0
- package/lib/evolve/_product-ideation.ts +405 -0
- package/lib/evolve/_prompts.ts +178 -0
- package/lib/evolve/cli.ts +330 -0
- package/lib/evolve/discovery.ts +571 -0
- package/lib/evolve/index.ts +105 -0
- package/lib/evolve/orchestrator.ts +1139 -0
- package/lib/evolve/scoring.ts +167 -0
- package/lib/evolve/state.ts +330 -0
- package/lib/evolve/types.ts +290 -0
- package/lib/frontmatter.ts +615 -0
- package/lib/gates.ts +695 -0
- package/lib/genome.ts +402 -0
- package/lib/got.js +4 -0
- package/lib/got.ts +361 -0
- package/lib/invariants.ts +378 -0
- package/lib/knowledge.ts +768 -0
- package/lib/long-term-roadmap.ts +806 -0
- package/lib/markdown-split.ts +273 -0
- package/lib/mcp-server.ts +3292 -0
- package/lib/metrics.ts +49 -0
- package/lib/overstory.ts +270 -0
- package/lib/parallel.ts +570 -0
- package/lib/paths.ts +293 -0
- package/lib/phase-complete-llm.ts +376 -0
- package/lib/phase-complete.ts +366 -0
- package/lib/phase-io.ts +101 -0
- package/lib/phase.ts +1981 -0
- package/lib/plan-tournament.ts +426 -0
- package/lib/refinement.ts +349 -0
- package/lib/requirements.ts +469 -0
- package/lib/research-bundle.ts +300 -0
- package/lib/roadmap.ts +775 -0
- package/lib/scaffold.ts +480 -0
- package/lib/scan/_utils.ts +37 -0
- package/lib/scan/base64.ts +90 -0
- package/lib/scan/ignorefile.ts +109 -0
- package/lib/scan/injection.ts +67 -0
- package/lib/scan/patterns.ts +139 -0
- package/lib/scan/strip-markdown.ts +39 -0
- package/lib/scan/types.ts +28 -0
- package/lib/scheduler-wait.ts +58 -0
- package/lib/scheduler.ts +1370 -0
- package/lib/state.ts +1000 -0
- package/lib/think.ts +365 -0
- package/lib/tracker.ts +1591 -0
- package/lib/types.ts +1663 -0
- package/lib/utils.ts +1479 -0
- package/lib/verify.ts +1434 -0
- package/lib/wireup/autofix.ts +241 -0
- package/lib/wireup/cli.ts +278 -0
- package/lib/wireup/detection.ts +542 -0
- package/lib/wireup/discovery.ts +1063 -0
- package/lib/wireup/execution.ts +686 -0
- package/lib/wireup/index.ts +117 -0
- package/lib/wireup/orchestrator.ts +519 -0
- package/lib/wireup/report.ts +286 -0
- package/lib/wireup/scenarios.ts +616 -0
- package/lib/wireup/state.ts +139 -0
- package/lib/wireup/types.ts +436 -0
- package/lib/worktree.ts +1309 -0
- package/package.json +67 -0
|
@@ -0,0 +1,1680 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
/**
|
|
5
|
+
* GRD Tools -- Thin CLI router. All business logic lives in lib/ modules.
|
|
6
|
+
* Usage: node grd-tools.js <command> [args] [--raw]
|
|
7
|
+
*/
|
|
8
|
+
const fs = require('fs');
|
|
9
|
+
const path = require('path');
|
|
10
|
+
// ─── Typed Imports ──────────────────────────────────────────────────────────
|
|
11
|
+
const { parseIncludeFlag, output, error, loadConfig, validatePhaseArg, validateFileArg, validateSubcommand, validateGitRef, findClosestCommand, } = require('../lib/utils');
|
|
12
|
+
const { cmdFrontmatterGet, cmdFrontmatterSet, cmdFrontmatterMerge, cmdFrontmatterValidate, } = require('../lib/frontmatter');
|
|
13
|
+
const { cmdStateLoad, cmdStateGet, cmdStatePatch, cmdStateUpdate, cmdStateAdvancePlan, cmdStateRecordMetric, cmdStateUpdateProgress, cmdStateAddDecision, cmdStateAddBlocker, cmdStateResolveBlocker, cmdStateRecordSession, cmdStateSnapshot, } = require('../lib/state');
|
|
14
|
+
const { cmdRoadmapGetPhase, cmdPhaseNextDecimal, cmdRoadmapAnalyze, } = require('../lib/roadmap');
|
|
15
|
+
const { cmdTemplateSelect, cmdTemplateFill, cmdScaffold, } = require('../lib/scaffold');
|
|
16
|
+
const { cmdVerifySummary, cmdVerifyPlanStructure, cmdVerifyPhaseCompleteness, cmdVerifyReferences, cmdVerifyCommits, cmdVerifyArtifacts, cmdVerifyKeyLinks, cmdVerifyMechanical, } = require('../lib/verify');
|
|
17
|
+
const { cmdPhasesList, cmdPhaseAdd, cmdPhaseInsert, cmdPhaseRemove, cmdPhaseComplete, cmdMilestoneComplete, cmdValidateConsistency, cmdVersionBump, } = require('../lib/phase');
|
|
18
|
+
const { cmdTracker, } = require('../lib/tracker');
|
|
19
|
+
const { cmdWorktreeCreate, cmdWorktreeRemove, cmdWorktreeList, cmdWorktreeRemoveStale, cmdWorktreePushAndPR, cmdWorktreeEnsureMilestoneBranch, cmdWorktreeMerge, cmdWorktreeHookCreate, cmdWorktreeHookRemove, cmdTeammateIdleHook, cmdTaskCompletedHook, cmdInstructionsLoadedHook, cmdStopFailureHook, cmdPostCompactHook, } = require('../lib/worktree');
|
|
20
|
+
const { cmdPhaseAnalyzeDeps, } = require('../lib/deps');
|
|
21
|
+
const { detectOverstory, installOverstory, } = require('../lib/overstory');
|
|
22
|
+
const { cmdAutopilot, cmdInitAutopilot, cmdMultiMilestoneAutopilot, cmdInitMultiMilestoneAutopilot, } = require('../lib/autopilot');
|
|
23
|
+
const { cmdAutoplan, cmdInitAutoplan, } = require('../lib/autoplan');
|
|
24
|
+
const { createScheduler, } = require('../lib/scheduler');
|
|
25
|
+
const { cmdAutoResearch, cmdInitAutoResearch, } = require('../lib/autoresearch');
|
|
26
|
+
const { cmdEvolve, cmdEvolveDiscover, cmdEvolveState, cmdEvolveAdvance, cmdEvolveReset, cmdInitEvolve, } = require('../lib/evolve/index');
|
|
27
|
+
const { cmdInitExecuteParallel, cmdParallelProgress, } = require('../lib/parallel');
|
|
28
|
+
const { cmdWireup, cmdInitWireup, } = require('../lib/wireup/index');
|
|
29
|
+
const { splitMarkdown, isIndexFile, estimateTokens, } = require('../lib/markdown-split');
|
|
30
|
+
const { cmdInitExecutePhase, cmdInitPlanPhase, cmdInitNewProject, cmdInitNewMilestone, cmdInitQuick, cmdInitResume, cmdInitVerifyWork, cmdInitPhaseOp, cmdInitTodos, cmdInitMilestoneOp, cmdInitMapCodebase, cmdInitProgress, cmdInitResearchWorkflow, cmdInitPlanMilestoneGaps, cmdInitDebug, cmdInitIntegrationCheck, cmdInitMigrate, cmdInitPlanCheck, cmdInitPhaseResearch, cmdInitCodeReview, cmdInitAssessBaseline, cmdInitDeepDive, cmdInitEvalPlan, cmdInitEvalReport, cmdInitFeasibility, cmdInitProductOwner, cmdInitProjectResearcher, cmdInitResearchSynthesizer, cmdInitRoadmapper, cmdInitSurveyor, cmdInitVerifier, } = require('../lib/context/index');
|
|
31
|
+
const { cmdGenerateSlug, cmdCurrentTimestamp, cmdListTodos, cmdTodoComplete, cmdVerifyPathExists, cmdConfigEnsureSection, cmdConfigSet, cmdHistoryDigest, cmdResolveModel, cmdFindPhase, cmdCommit, cmdPhasePlanIndex, cmdSummaryExtract, cmdProgressRender, cmdDashboard, cmdPhaseDetail, cmdHealth, cmdDetectBackend, cmdLongTermRoadmap, cmdQualityAnalysis, cmdSetup, cmdRequirementGet, cmdRequirementList, cmdRequirementTraceability, cmdRequirementUpdateStatus, cmdSearch, cmdMigrateDirs, cmdCoverageReport, cmdHealthCheck, cmdPhaseRiskAssessment, cmdCitationBacklinks, cmdEvalRegressionCheck, cmdPhaseTimeBudget, cmdConfigDiff, cmdPhaseReadiness, cmdMilestoneHealth, cmdDecisionTimeline, cmdImportKnowledge, cmdTodoDuplicates, cmdKnowhowList, cmdCitationGraph, cmdArtifactDAG, cmdBenchmarkReport, cmdKnowhowSearch, cmdCheckPlans, cmdEvalDiff, cmdTail, cmdEstimatePhase, cmdImpact, cmdCheckAssumptions, } = require('../lib/commands/index');
|
|
32
|
+
const { cmdDeadEndAdd, cmdDeadEndPromoteFromPhase, } = require('../lib/dead-ends');
|
|
33
|
+
const { cmdPlanTournament, } = require('../lib/plan-tournament');
|
|
34
|
+
const { cmdThink, } = require('../lib/think');
|
|
35
|
+
const { cmdExportResearch, cmdImportResearch, } = require('../lib/research-bundle');
|
|
36
|
+
const { cmdDiagnosePhase, } = require('../lib/verify');
|
|
37
|
+
const { cmdKnowhowAudit, cmdKnowhowDedup, cmdKnowhowRank, } = require('../lib/knowledge');
|
|
38
|
+
const { cmdPhaseDepsVisualize, cmdExecutePhaseDryRun, } = require('../lib/deps');
|
|
39
|
+
const { cmdTodosRank, } = require('../lib/commands/todo');
|
|
40
|
+
const { cmdRollback, } = require('../lib/commands/rollback');
|
|
41
|
+
const { cmdEstimate, } = require('../lib/commands/estimate');
|
|
42
|
+
const { cmdBudget, } = require('../lib/commands/budget');
|
|
43
|
+
const { cmdBlame, } = require('../lib/commands/blame');
|
|
44
|
+
const { cmdKnowhowAggregate, cmdImportKnowhow, } = require('../lib/commands/knowhow-aggregator');
|
|
45
|
+
const { cmdFreshness, } = require('../lib/commands/freshness');
|
|
46
|
+
const { cmdGenomeInit, cmdGenomeShow, cmdGenomeSnapshot, cmdGenomePromoteSuggestion, } = require('../lib/genome');
|
|
47
|
+
const { cmdResearchGaps, } = require('../lib/commands/progress');
|
|
48
|
+
const { cmdDepsRisk, } = require('../lib/commands/phase-info');
|
|
49
|
+
const { cmdWatch, } = require('../lib/commands/watch');
|
|
50
|
+
const { cmdSingularity, } = require('../lib/commands/singularity');
|
|
51
|
+
const { cmdPlanLint, } = require('../lib/commands/plan-lint');
|
|
52
|
+
const { cmdPlanPhase, } = require('../lib/commands/plan-phase');
|
|
53
|
+
const { cmdSelectCandidate, } = require('../lib/commands/select-candidate');
|
|
54
|
+
const { cmdPatterns, } = require('../lib/commands/patterns');
|
|
55
|
+
const { cmdInstall, } = require('../lib/commands/install');
|
|
56
|
+
// ─── Helpers ────────────────────────────────────────────────────────────────
|
|
57
|
+
/** Extract --flag value from args, returns value or fallback */
|
|
58
|
+
function flag(args, name, fallback) {
|
|
59
|
+
const i = args.indexOf(name);
|
|
60
|
+
return i !== -1 ? args[i + 1] : fallback;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Print a deprecation warning to stderr. See docs/DEPRECATIONS.md for the
|
|
64
|
+
* v0.4.x trim plan. Commands listed in DEPRECATED_COMMANDS will be removed
|
|
65
|
+
* in v0.4.0; this helper fires once per invocation.
|
|
66
|
+
*/
|
|
67
|
+
const DEPRECATED_COMMANDS = {
|
|
68
|
+
dashboard: 'Use `gd health` + `gd think` instead',
|
|
69
|
+
'health-check': 'Subset of `gd health`',
|
|
70
|
+
'coverage-report': 'Use `npx jest --coverage` directly',
|
|
71
|
+
'phase-time-budget': 'Subsumed by `gd estimate-phase`',
|
|
72
|
+
'todo-duplicates': 'One-off helper; rarely used',
|
|
73
|
+
'markdown-split': 'Internal infrastructure — surfaced by accident',
|
|
74
|
+
setup: '`gd init` does this',
|
|
75
|
+
};
|
|
76
|
+
function _warnDeprecated(cmd) {
|
|
77
|
+
const replacement = DEPRECATED_COMMANDS[cmd];
|
|
78
|
+
if (!replacement)
|
|
79
|
+
return;
|
|
80
|
+
process.stderr.write(`Warning: \`gd ${cmd}\` is DEPRECATED and will be removed in v0.4.0.\n` +
|
|
81
|
+
` ${replacement}.\n` +
|
|
82
|
+
` See docs/DEPRECATIONS.md.\n`);
|
|
83
|
+
}
|
|
84
|
+
// ─── Descriptor-Based Dispatch Table ────────────────────────────────────────
|
|
85
|
+
/**
|
|
86
|
+
* Descriptor-based dispatch table for simple top-level commands.
|
|
87
|
+
* Each entry maps a command string to a handler function.
|
|
88
|
+
* routeCommand() checks this table first before falling through to the switch.
|
|
89
|
+
*/
|
|
90
|
+
const ROUTE_DESCRIPTORS = [
|
|
91
|
+
{ command: 'generate-slug', handler: (args, _cwd, raw) => cmdGenerateSlug(args[1], raw) },
|
|
92
|
+
{
|
|
93
|
+
command: 'current-timestamp',
|
|
94
|
+
handler: (args, _cwd, raw) => cmdCurrentTimestamp(args[1] || 'full', raw),
|
|
95
|
+
},
|
|
96
|
+
{ command: 'list-todos', handler: (args, cwd, raw) => cmdListTodos(cwd, args[1], raw) },
|
|
97
|
+
{
|
|
98
|
+
command: 'verify-path-exists',
|
|
99
|
+
handler: (args, cwd, raw) => cmdVerifyPathExists(cwd, args[1], raw, args.includes('--dry-run')),
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
command: 'config-ensure-section',
|
|
103
|
+
handler: (args, cwd, raw) => cmdConfigEnsureSection(cwd, raw, args.includes('--dry-run')),
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
command: 'config-set',
|
|
107
|
+
handler: (args, cwd, raw) => cmdConfigSet(cwd, args[1], args[2], raw, args.includes('--dry-run')),
|
|
108
|
+
},
|
|
109
|
+
{ command: 'history-digest', handler: (_args, cwd, raw) => cmdHistoryDigest(cwd, raw) },
|
|
110
|
+
{
|
|
111
|
+
command: 'progress',
|
|
112
|
+
handler: (args, cwd, raw) => cmdProgressRender(cwd, args[1] || 'json', raw),
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
command: 'migrate-dirs',
|
|
116
|
+
handler: (args, cwd, raw) => cmdMigrateDirs(cwd, raw, args.includes('--dry-run')),
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
command: 'dashboard',
|
|
120
|
+
handler: (_args, cwd, raw) => {
|
|
121
|
+
_warnDeprecated('dashboard');
|
|
122
|
+
cmdDashboard(cwd, raw);
|
|
123
|
+
},
|
|
124
|
+
},
|
|
125
|
+
{ command: 'health', handler: (_args, cwd, raw) => cmdHealth(cwd, raw) },
|
|
126
|
+
{ command: 'detect-backend', handler: (_args, cwd, raw) => cmdDetectBackend(cwd, raw) },
|
|
127
|
+
{
|
|
128
|
+
command: 'quality-analysis',
|
|
129
|
+
handler: (args, cwd, raw) => cmdQualityAnalysis(cwd, args.slice(1), raw),
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
command: 'setup',
|
|
133
|
+
handler: (_args, cwd, raw) => {
|
|
134
|
+
_warnDeprecated('setup');
|
|
135
|
+
cmdSetup(cwd, raw);
|
|
136
|
+
},
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
command: 'parallel-progress',
|
|
140
|
+
handler: (args, _cwd, raw) => cmdParallelProgress(args.slice(1), raw),
|
|
141
|
+
},
|
|
142
|
+
{ command: 'resolve-model', handler: (args, cwd, raw) => cmdResolveModel(cwd, args[1], raw) },
|
|
143
|
+
{ command: 'find-phase', handler: (args, cwd, raw) => cmdFindPhase(cwd, args[1], raw) },
|
|
144
|
+
{
|
|
145
|
+
command: 'coverage-report',
|
|
146
|
+
handler: (args, cwd, raw) => {
|
|
147
|
+
_warnDeprecated('coverage-report');
|
|
148
|
+
return cmdCoverageReport(cwd, { threshold: parseInt(flag(args, '--threshold', '85'), 10) }, raw);
|
|
149
|
+
},
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
command: 'health-check',
|
|
153
|
+
handler: (args, cwd, raw) => {
|
|
154
|
+
_warnDeprecated('health-check');
|
|
155
|
+
return cmdHealthCheck(cwd, { fix: args.includes('--fix') }, raw);
|
|
156
|
+
},
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
command: 'phase-detail',
|
|
160
|
+
handler: (args, cwd, raw) => {
|
|
161
|
+
validatePhaseArg(args[1]);
|
|
162
|
+
return cmdPhaseDetail(cwd, args[1], raw);
|
|
163
|
+
},
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
command: 'phase-plan-index',
|
|
167
|
+
handler: (args, cwd, raw) => {
|
|
168
|
+
validatePhaseArg(args[1]);
|
|
169
|
+
return cmdPhasePlanIndex(cwd, args[1], raw);
|
|
170
|
+
},
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
command: 'search',
|
|
174
|
+
handler: (args, cwd, raw) => {
|
|
175
|
+
if (!args[1])
|
|
176
|
+
error('Search query is required');
|
|
177
|
+
return cmdSearch(cwd, args[1], raw);
|
|
178
|
+
},
|
|
179
|
+
},
|
|
180
|
+
{
|
|
181
|
+
command: 'phase-risk',
|
|
182
|
+
handler: (args, cwd, raw) => {
|
|
183
|
+
validatePhaseArg(args[1]);
|
|
184
|
+
return cmdPhaseRiskAssessment(cwd, args[1], raw);
|
|
185
|
+
},
|
|
186
|
+
},
|
|
187
|
+
{ command: 'citation-backlinks', handler: (_args, cwd, raw) => cmdCitationBacklinks(cwd, raw) },
|
|
188
|
+
{
|
|
189
|
+
command: 'eval-regression-check',
|
|
190
|
+
handler: (args, cwd, raw) => {
|
|
191
|
+
validatePhaseArg(args[1]);
|
|
192
|
+
const t = flag(args, '--threshold');
|
|
193
|
+
return cmdEvalRegressionCheck(cwd, args[1], raw, t ? parseFloat(t) : undefined);
|
|
194
|
+
},
|
|
195
|
+
},
|
|
196
|
+
{
|
|
197
|
+
command: 'phase-time-budget',
|
|
198
|
+
handler: (_args, cwd, raw) => {
|
|
199
|
+
_warnDeprecated('phase-time-budget');
|
|
200
|
+
cmdPhaseTimeBudget(cwd, raw);
|
|
201
|
+
},
|
|
202
|
+
},
|
|
203
|
+
{
|
|
204
|
+
command: 'config-diff',
|
|
205
|
+
handler: (args, cwd, raw) => cmdConfigDiff(cwd, raw, args.includes('--reset'), args.includes('--dry-run')),
|
|
206
|
+
},
|
|
207
|
+
{
|
|
208
|
+
command: 'phase-readiness',
|
|
209
|
+
handler: (args, cwd, raw) => {
|
|
210
|
+
validatePhaseArg(args[1]);
|
|
211
|
+
return cmdPhaseReadiness(cwd, args[1], raw);
|
|
212
|
+
},
|
|
213
|
+
},
|
|
214
|
+
{ command: 'milestone-health', handler: (_args, cwd, raw) => cmdMilestoneHealth(cwd, raw) },
|
|
215
|
+
{ command: 'decision-timeline', handler: (_args, cwd, raw) => cmdDecisionTimeline(cwd, raw) },
|
|
216
|
+
{
|
|
217
|
+
command: 'import-knowledge',
|
|
218
|
+
handler: (args, cwd, raw) => {
|
|
219
|
+
if (!args[1])
|
|
220
|
+
error('Source path required');
|
|
221
|
+
return cmdImportKnowledge(cwd, args[1], flag(args, '--types') || 'all', raw, args.includes('--force'), args.includes('--dry-run'));
|
|
222
|
+
},
|
|
223
|
+
},
|
|
224
|
+
{
|
|
225
|
+
command: 'todo-duplicates',
|
|
226
|
+
handler: (args, cwd, raw) => {
|
|
227
|
+
_warnDeprecated('todo-duplicates');
|
|
228
|
+
const t = flag(args, '--threshold');
|
|
229
|
+
return cmdTodoDuplicates(cwd, raw, t ? parseFloat(t) : undefined);
|
|
230
|
+
},
|
|
231
|
+
},
|
|
232
|
+
{ command: 'teammate-idle-hook', handler: (_args, cwd, raw) => cmdTeammateIdleHook(cwd, raw) },
|
|
233
|
+
{ command: 'task-completed-hook', handler: (_args, cwd, raw) => cmdTaskCompletedHook(cwd, raw) },
|
|
234
|
+
{
|
|
235
|
+
command: 'instructions-loaded-hook',
|
|
236
|
+
handler: (_args, cwd, raw) => cmdInstructionsLoadedHook(cwd, raw),
|
|
237
|
+
},
|
|
238
|
+
{ command: 'stop-failure-hook', handler: (_args, cwd, raw) => cmdStopFailureHook(cwd, raw) },
|
|
239
|
+
{ command: 'post-compact-hook', handler: (_args, cwd, raw) => cmdPostCompactHook(cwd, raw) },
|
|
240
|
+
{
|
|
241
|
+
command: 'citation-graph',
|
|
242
|
+
handler: (args, cwd, raw) => cmdCitationGraph(cwd, raw, args.includes('--unresolved')),
|
|
243
|
+
},
|
|
244
|
+
{
|
|
245
|
+
command: 'artifact-dag',
|
|
246
|
+
handler: (args, cwd, raw) => {
|
|
247
|
+
validatePhaseArg(args[1]);
|
|
248
|
+
return cmdArtifactDAG(cwd, args[1], raw);
|
|
249
|
+
},
|
|
250
|
+
},
|
|
251
|
+
{ command: 'benchmark-report', handler: (_args, cwd, raw) => cmdBenchmarkReport(cwd, raw) },
|
|
252
|
+
{
|
|
253
|
+
command: 'diagnose',
|
|
254
|
+
handler: (args, cwd, raw) => {
|
|
255
|
+
if (!args[1])
|
|
256
|
+
error('phase required. Usage: gd diagnose <phase>');
|
|
257
|
+
validatePhaseArg(args[1]);
|
|
258
|
+
return cmdDiagnosePhase(cwd, args[1], raw);
|
|
259
|
+
},
|
|
260
|
+
},
|
|
261
|
+
{
|
|
262
|
+
command: 'export-research',
|
|
263
|
+
handler: (args, cwd, raw) => cmdExportResearch(cwd, flag(args, '--output') ?? null, raw),
|
|
264
|
+
},
|
|
265
|
+
{
|
|
266
|
+
command: 'import-research',
|
|
267
|
+
handler: (args, cwd, raw) => {
|
|
268
|
+
if (!args[1])
|
|
269
|
+
error('bundle path required. Usage: gd import-research <bundle.tar.gz>');
|
|
270
|
+
return cmdImportResearch(cwd, args[1], raw);
|
|
271
|
+
},
|
|
272
|
+
},
|
|
273
|
+
{
|
|
274
|
+
command: 'deps',
|
|
275
|
+
handler: (args, cwd, raw) => cmdPhaseDepsVisualize(cwd, { milestone: flag(args, '--milestone') ?? null, format: flag(args, '--format') ?? null }, raw),
|
|
276
|
+
},
|
|
277
|
+
{
|
|
278
|
+
command: 'todos',
|
|
279
|
+
handler: (args, cwd, raw) => {
|
|
280
|
+
const sub = args[1];
|
|
281
|
+
if (sub === 'rank') {
|
|
282
|
+
const topStr = flag(args, '--top');
|
|
283
|
+
const topN = topStr ? parseInt(topStr, 10) : undefined;
|
|
284
|
+
if (topN !== undefined && (isNaN(topN) || topN < 0)) {
|
|
285
|
+
error('--top must be a non-negative integer');
|
|
286
|
+
}
|
|
287
|
+
return cmdTodosRank(cwd, raw, topN);
|
|
288
|
+
}
|
|
289
|
+
error(`Unknown todos subcommand: ${sub || '(none)'}. Valid: rank`);
|
|
290
|
+
},
|
|
291
|
+
},
|
|
292
|
+
{
|
|
293
|
+
command: 'knowhow',
|
|
294
|
+
handler: (args, cwd, raw) => {
|
|
295
|
+
const sub = args[1];
|
|
296
|
+
if (sub === 'audit')
|
|
297
|
+
return cmdKnowhowAudit(cwd, raw);
|
|
298
|
+
if (sub === 'aggregate' || sub === 'agg')
|
|
299
|
+
return cmdKnowhowAggregate(cwd, raw, args.includes('--export'), args.includes('--dry-run'));
|
|
300
|
+
if (sub === 'dedup') {
|
|
301
|
+
const t = flag(args, '--threshold');
|
|
302
|
+
return cmdKnowhowDedup(cwd, raw, t ? parseFloat(t) : undefined);
|
|
303
|
+
}
|
|
304
|
+
if (sub === 'rank') {
|
|
305
|
+
const query = args[2];
|
|
306
|
+
if (!query)
|
|
307
|
+
error('query required. Usage: gd knowhow rank "<query>"');
|
|
308
|
+
const topStr = flag(args, '--top');
|
|
309
|
+
const topN = topStr ? parseInt(topStr, 10) : 5;
|
|
310
|
+
if (isNaN(topN) || topN <= 0)
|
|
311
|
+
error('--top must be a positive integer');
|
|
312
|
+
return cmdKnowhowRank(cwd, query, topN, raw);
|
|
313
|
+
}
|
|
314
|
+
return cmdKnowhowList(cwd, raw, flag(args, '--module'), flag(args, '--limit') ? parseInt(flag(args, '--limit'), 10) : undefined);
|
|
315
|
+
},
|
|
316
|
+
},
|
|
317
|
+
{
|
|
318
|
+
command: 'budget',
|
|
319
|
+
handler: (args, cwd, raw) => {
|
|
320
|
+
if (!args[1])
|
|
321
|
+
error('phase required. Usage: gd budget <phase>');
|
|
322
|
+
return cmdBudget(cwd, args[1], raw);
|
|
323
|
+
},
|
|
324
|
+
},
|
|
325
|
+
{
|
|
326
|
+
command: 'blame',
|
|
327
|
+
handler: (args, cwd, raw) => {
|
|
328
|
+
if (!args[1])
|
|
329
|
+
error('phase required. Usage: gd blame <phase>');
|
|
330
|
+
return cmdBlame(cwd, args[1], raw);
|
|
331
|
+
},
|
|
332
|
+
},
|
|
333
|
+
{
|
|
334
|
+
command: 'freshness',
|
|
335
|
+
handler: (args, cwd, raw) => cmdFreshness(cwd, args[1] ?? null, raw),
|
|
336
|
+
},
|
|
337
|
+
{
|
|
338
|
+
command: 'rollback',
|
|
339
|
+
handler: (args, cwd, raw) => {
|
|
340
|
+
if (!args[1])
|
|
341
|
+
error('phase required. Usage: gd rollback <phase>');
|
|
342
|
+
validatePhaseArg(args[1]);
|
|
343
|
+
return cmdRollback(cwd, args[1], raw);
|
|
344
|
+
},
|
|
345
|
+
},
|
|
346
|
+
{
|
|
347
|
+
command: 'estimate',
|
|
348
|
+
handler: (args, cwd, raw) => {
|
|
349
|
+
if (!args[1])
|
|
350
|
+
error('phase required. Usage: gd estimate <phase>');
|
|
351
|
+
validatePhaseArg(args[1]);
|
|
352
|
+
return cmdEstimate(cwd, args[1], raw);
|
|
353
|
+
},
|
|
354
|
+
},
|
|
355
|
+
{
|
|
356
|
+
command: 'estimate-phase',
|
|
357
|
+
handler: (args, cwd, raw) => {
|
|
358
|
+
if (!args[1])
|
|
359
|
+
error('phase required. Usage: gd estimate-phase <phase>');
|
|
360
|
+
validatePhaseArg(args[1]);
|
|
361
|
+
return cmdEstimatePhase(cwd, args[1], raw);
|
|
362
|
+
},
|
|
363
|
+
},
|
|
364
|
+
{
|
|
365
|
+
command: 'impact',
|
|
366
|
+
handler: (args, cwd, raw) => {
|
|
367
|
+
if (!args[1])
|
|
368
|
+
error('phase required. Usage: gd impact <phase>');
|
|
369
|
+
validatePhaseArg(args[1]);
|
|
370
|
+
return cmdImpact(cwd, args[1], raw);
|
|
371
|
+
},
|
|
372
|
+
},
|
|
373
|
+
{
|
|
374
|
+
command: 'check-assumptions',
|
|
375
|
+
handler: (args, cwd, raw) => {
|
|
376
|
+
if (!args[1])
|
|
377
|
+
error('phase required. Usage: gd check-assumptions <phase>');
|
|
378
|
+
validatePhaseArg(args[1]);
|
|
379
|
+
return cmdCheckAssumptions(cwd, args[1], raw, args.includes('--skip-assumption-check'));
|
|
380
|
+
},
|
|
381
|
+
},
|
|
382
|
+
{
|
|
383
|
+
command: 'execute-phase',
|
|
384
|
+
handler: (args, cwd, raw) => {
|
|
385
|
+
if (args.includes('--dry-run')) {
|
|
386
|
+
if (!args[1] || args[1].startsWith('--'))
|
|
387
|
+
error('phase required. Usage: gd execute-phase <phase> --dry-run');
|
|
388
|
+
validatePhaseArg(args[1]);
|
|
389
|
+
return cmdExecutePhaseDryRun(cwd, args[1], raw);
|
|
390
|
+
}
|
|
391
|
+
// Non-dry-run execute-phase falls through to init workflow
|
|
392
|
+
const includes = parseIncludeFlag(args);
|
|
393
|
+
const phase = args[1];
|
|
394
|
+
if (!phase || phase.startsWith('--'))
|
|
395
|
+
error('phase required. Usage: gd execute-phase <phase>');
|
|
396
|
+
validatePhaseArg(phase);
|
|
397
|
+
const { cmdInitExecutePhase } = require('../lib/context/index');
|
|
398
|
+
return cmdInitExecutePhase(cwd, phase, includes, raw);
|
|
399
|
+
},
|
|
400
|
+
},
|
|
401
|
+
{
|
|
402
|
+
command: 'knowledge',
|
|
403
|
+
handler: (args, cwd, raw) => {
|
|
404
|
+
const sub = args[1];
|
|
405
|
+
if (sub === 'search') {
|
|
406
|
+
// Codex r3 P2: skip both the flag and its value so e.g.
|
|
407
|
+
// `gd knowledge search cache --top 5` searches for "cache",
|
|
408
|
+
// not "cache 5". Walks the slice, skipping flags and the
|
|
409
|
+
// token immediately following any value-bearing flag.
|
|
410
|
+
const FLAGS_WITH_VALUE = new Set(['--top']);
|
|
411
|
+
const queryParts = [];
|
|
412
|
+
const rest = args.slice(2);
|
|
413
|
+
for (let i = 0; i < rest.length; i++) {
|
|
414
|
+
const a = rest[i];
|
|
415
|
+
if (a.startsWith('--')) {
|
|
416
|
+
if (FLAGS_WITH_VALUE.has(a))
|
|
417
|
+
i++;
|
|
418
|
+
continue;
|
|
419
|
+
}
|
|
420
|
+
queryParts.push(a);
|
|
421
|
+
}
|
|
422
|
+
const query = queryParts.join(' ');
|
|
423
|
+
if (!query)
|
|
424
|
+
error('query required. Usage: gd knowledge search <query>');
|
|
425
|
+
const topN = parseInt(flag(args, '--top') ?? '10', 10);
|
|
426
|
+
return cmdKnowhowSearch(cwd, query, topN, raw);
|
|
427
|
+
}
|
|
428
|
+
error(`Unknown knowledge subcommand: ${sub || '(none)'}. Valid: search`);
|
|
429
|
+
},
|
|
430
|
+
},
|
|
431
|
+
{
|
|
432
|
+
command: 'check-plans',
|
|
433
|
+
handler: (args, cwd, raw) => {
|
|
434
|
+
const phase = flag(args, '--phase') ?? null;
|
|
435
|
+
const milestone = flag(args, '--milestone') ?? null;
|
|
436
|
+
return cmdCheckPlans(cwd, { phase, milestone }, raw);
|
|
437
|
+
},
|
|
438
|
+
},
|
|
439
|
+
{
|
|
440
|
+
command: 'eval',
|
|
441
|
+
handler: (args, cwd, raw) => {
|
|
442
|
+
const sub = args[1];
|
|
443
|
+
if (sub === 'diff') {
|
|
444
|
+
const phaseA = args[2];
|
|
445
|
+
const phaseB = args[3] ?? 'latest';
|
|
446
|
+
if (!phaseA)
|
|
447
|
+
error('Usage: gd eval diff <phaseA> <phaseB> — or: gd eval diff latest');
|
|
448
|
+
if (phaseA !== 'latest')
|
|
449
|
+
validatePhaseArg(phaseA);
|
|
450
|
+
if (phaseB !== 'latest')
|
|
451
|
+
validatePhaseArg(phaseB);
|
|
452
|
+
return cmdEvalDiff(cwd, phaseA, phaseB, raw);
|
|
453
|
+
}
|
|
454
|
+
error(`Unknown eval subcommand: ${sub || '(none)'}. Valid: diff`);
|
|
455
|
+
},
|
|
456
|
+
},
|
|
457
|
+
{
|
|
458
|
+
command: 'tail',
|
|
459
|
+
handler: (args, cwd, raw) => {
|
|
460
|
+
const phaseFilter = flag(args, '--phase') ?? null;
|
|
461
|
+
const follow = args.includes('-f') || args.includes('--follow');
|
|
462
|
+
return cmdTail(cwd, phaseFilter, follow, raw);
|
|
463
|
+
},
|
|
464
|
+
},
|
|
465
|
+
{
|
|
466
|
+
command: 'forecast-phase',
|
|
467
|
+
handler: (args, cwd, raw) => {
|
|
468
|
+
const phase = args[1];
|
|
469
|
+
if (!phase)
|
|
470
|
+
error('phase required. Usage: gd forecast-phase <phase>');
|
|
471
|
+
validatePhaseArg(phase);
|
|
472
|
+
const { phasesDir: _phasesDir } = require('../lib/paths');
|
|
473
|
+
const { safeReadFile: _safeRead, execGit: _execGit } = require('../lib/utils');
|
|
474
|
+
const phasesBase = _phasesDir(cwd);
|
|
475
|
+
let phaseDir = null;
|
|
476
|
+
try {
|
|
477
|
+
// Codex r15 P2: match the canonical zero-padded form too so
|
|
478
|
+
// `gd forecast-phase 1` resolves to `01-test/`.
|
|
479
|
+
const padded = /^\d+$/.test(phase) ? phase.padStart(2, '0') : phase;
|
|
480
|
+
const dirs = fs.readdirSync(phasesBase);
|
|
481
|
+
const match = dirs.find((d) => d === phase || d === padded ||
|
|
482
|
+
d.startsWith(`${phase}-`) || d.startsWith(`${padded}-`));
|
|
483
|
+
if (match)
|
|
484
|
+
phaseDir = path.join(phasesBase, match);
|
|
485
|
+
}
|
|
486
|
+
catch { /* phases dir not found */ }
|
|
487
|
+
if (!phaseDir) {
|
|
488
|
+
output({ phase, error: `Phase ${phase} not found`, files: [] }, raw, `Phase ${phase} not found`);
|
|
489
|
+
return;
|
|
490
|
+
}
|
|
491
|
+
// Extract file paths from all PLAN.md files via regex
|
|
492
|
+
const fileRegex = /(?:^|[\s`"'(,])([a-zA-Z][a-zA-Z0-9_/-]*\.[a-zA-Z]{1,5})(?=$|[\s`"',):])/gm;
|
|
493
|
+
const fileCounts = new Map();
|
|
494
|
+
let planFiles = [];
|
|
495
|
+
try {
|
|
496
|
+
planFiles = fs.readdirSync(phaseDir).filter((f) => f.endsWith('-PLAN.md') || f === 'PLAN.md');
|
|
497
|
+
}
|
|
498
|
+
catch { /* ignore */ }
|
|
499
|
+
for (const pf of planFiles) {
|
|
500
|
+
const content = _safeRead(path.join(phaseDir, pf));
|
|
501
|
+
if (!content)
|
|
502
|
+
continue;
|
|
503
|
+
let m;
|
|
504
|
+
fileRegex.lastIndex = 0;
|
|
505
|
+
while ((m = fileRegex.exec(content)) !== null) {
|
|
506
|
+
const fp = m[1];
|
|
507
|
+
if (fp && fp.length > 3 && fp.includes('.') && !fp.startsWith('.')) {
|
|
508
|
+
fileCounts.set(fp, (fileCounts.get(fp) ?? 0) + 1);
|
|
509
|
+
}
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
const fileScores = [];
|
|
513
|
+
for (const [fp, mentions] of fileCounts) {
|
|
514
|
+
const logResult = _execGit(cwd, ['log', '--oneline', '--', fp]);
|
|
515
|
+
const gitTouches = logResult.exitCode === 0 ? logResult.stdout.trim().split('\n').filter(Boolean).length : 0;
|
|
516
|
+
const lastResult = _execGit(cwd, ['log', '-1', '--format=%ci', '--', fp]);
|
|
517
|
+
const lastModified = lastResult.exitCode === 0 ? lastResult.stdout.trim().slice(0, 10) : '';
|
|
518
|
+
const confidence = Math.round(Math.min(1, mentions * 0.4 + Math.min(gitTouches, 10) * 0.06) * 100) / 100;
|
|
519
|
+
fileScores.push({ file: fp, mentions, git_touches: gitTouches, confidence, last_modified: lastModified });
|
|
520
|
+
}
|
|
521
|
+
fileScores.sort((a, b) => b.confidence - a.confidence || b.mentions - a.mentions);
|
|
522
|
+
const top = fileScores.slice(0, 20);
|
|
523
|
+
// Write FORECAST.md to phase dir
|
|
524
|
+
let forecastPath = null;
|
|
525
|
+
try {
|
|
526
|
+
const lines = [
|
|
527
|
+
`# File Touch Forecast — Phase ${phase}`,
|
|
528
|
+
'',
|
|
529
|
+
`Generated: ${new Date().toISOString().slice(0, 10)}`,
|
|
530
|
+
'',
|
|
531
|
+
'| File | Mentions | Git Touches | Confidence | Last Modified |',
|
|
532
|
+
'|------|----------|-------------|------------|---------------|',
|
|
533
|
+
...top.map((r) => `| \`${r.file}\` | ${r.mentions} | ${r.git_touches} | ${r.confidence} | ${r.last_modified || 'n/a'} |`),
|
|
534
|
+
];
|
|
535
|
+
const fp = path.join(phaseDir, 'FORECAST.md');
|
|
536
|
+
fs.writeFileSync(fp, lines.join('\n') + '\n', 'utf-8');
|
|
537
|
+
forecastPath = path.relative(cwd, fp);
|
|
538
|
+
}
|
|
539
|
+
catch { /* non-fatal */ }
|
|
540
|
+
const summary = top.length > 0
|
|
541
|
+
? `Top predicted files:\n${top.slice(0, 5).map((r, i) => ` ${i + 1}. ${r.file} (confidence: ${r.confidence})`).join('\n')}`
|
|
542
|
+
: 'No file paths found in plan descriptions';
|
|
543
|
+
output({ phase, files_found: fileScores.length, top_files: top, forecast_path: forecastPath }, raw, summary);
|
|
544
|
+
},
|
|
545
|
+
},
|
|
546
|
+
{
|
|
547
|
+
command: 'import-knowhow',
|
|
548
|
+
handler: (args, cwd, raw) => {
|
|
549
|
+
if (!args[1])
|
|
550
|
+
error('source project directory required. Usage: gd import-knowhow <source-dir>');
|
|
551
|
+
const topStr = flag(args, '--top');
|
|
552
|
+
const topN = topStr ? parseInt(topStr, 10) : undefined;
|
|
553
|
+
return cmdImportKnowhow(cwd, args[1], raw, topN, args.includes('--all'), args.includes('--dry-run'));
|
|
554
|
+
},
|
|
555
|
+
},
|
|
556
|
+
{ command: 'research-gaps', handler: (_args, cwd, raw) => cmdResearchGaps(cwd, raw) },
|
|
557
|
+
{
|
|
558
|
+
command: 'deps-risk',
|
|
559
|
+
handler: (args, cwd, raw) => cmdDepsRisk(cwd, args[1] ?? null, raw),
|
|
560
|
+
},
|
|
561
|
+
{ command: 'watch', handler: (_args, cwd, raw) => cmdWatch(cwd, raw) },
|
|
562
|
+
{
|
|
563
|
+
command: 'singularity',
|
|
564
|
+
handler: (args, cwd, raw) => {
|
|
565
|
+
const since = flag(args, '--since') ?? null;
|
|
566
|
+
const all = args.includes('--all');
|
|
567
|
+
const byIteration = args.includes('--by-iteration');
|
|
568
|
+
cmdSingularity(cwd, { since, all, byIteration }, raw);
|
|
569
|
+
},
|
|
570
|
+
},
|
|
571
|
+
{
|
|
572
|
+
command: 'plan-lint',
|
|
573
|
+
handler: (args, cwd, raw) => {
|
|
574
|
+
if (!args[1]) {
|
|
575
|
+
error('milestone name required. Usage: gd plan-lint <milestone>');
|
|
576
|
+
}
|
|
577
|
+
cmdPlanLint(cwd, args[1], raw);
|
|
578
|
+
},
|
|
579
|
+
},
|
|
580
|
+
{
|
|
581
|
+
command: 'plan-candidates',
|
|
582
|
+
handler: (args, cwd, raw) => {
|
|
583
|
+
if (!args[1]) {
|
|
584
|
+
error('phase number required. Usage: gd plan-candidates <N> --candidates K [--input FILE] [--allow-partial-candidates]');
|
|
585
|
+
}
|
|
586
|
+
const phaseNum = args[1];
|
|
587
|
+
const candidatesArg = flag(args, '--candidates');
|
|
588
|
+
const inputFile = flag(args, '--input');
|
|
589
|
+
const allowPartial = args.includes('--allow-partial-candidates');
|
|
590
|
+
const candidates = candidatesArg ? parseInt(candidatesArg, 10) : 0;
|
|
591
|
+
if (candidatesArg && (!Number.isInteger(candidates) || candidates < 1)) {
|
|
592
|
+
error(`--candidates must be a positive integer, got "${candidatesArg}"`);
|
|
593
|
+
}
|
|
594
|
+
cmdPlanPhase(cwd, phaseNum, { candidates, inputFile, allowPartial }, raw);
|
|
595
|
+
},
|
|
596
|
+
},
|
|
597
|
+
{
|
|
598
|
+
command: 'select-candidate',
|
|
599
|
+
handler: (args, cwd, raw) => {
|
|
600
|
+
if (!args[1]) {
|
|
601
|
+
error('phase number required. Usage: gd select-candidate <N> [--dry-run] [--force] [--run-verification-commands]');
|
|
602
|
+
}
|
|
603
|
+
const phaseNum = args[1];
|
|
604
|
+
const dryRun = args.includes('--dry-run');
|
|
605
|
+
const force = args.includes('--force');
|
|
606
|
+
const runVerificationCommands = args.includes('--run-verification-commands');
|
|
607
|
+
cmdSelectCandidate(cwd, phaseNum, { dryRun, force, runVerificationCommands }, raw);
|
|
608
|
+
},
|
|
609
|
+
},
|
|
610
|
+
{
|
|
611
|
+
command: 'patterns',
|
|
612
|
+
handler: (args, cwd, raw) => {
|
|
613
|
+
// --dry-run is the default; --apply requires --yes (never-auto-write).
|
|
614
|
+
const apply = args.includes('--apply');
|
|
615
|
+
const yes = args.includes('--yes');
|
|
616
|
+
const minOcc = flag(args, '--min-occurrences');
|
|
617
|
+
const effSize = flag(args, '--effect-size');
|
|
618
|
+
const fdr = flag(args, '--fdr-q');
|
|
619
|
+
cmdPatterns(cwd, {
|
|
620
|
+
apply,
|
|
621
|
+
yes,
|
|
622
|
+
minOccurrences: minOcc !== undefined ? parseInt(minOcc, 10) : undefined,
|
|
623
|
+
effectSize: effSize !== undefined ? parseFloat(effSize) : undefined,
|
|
624
|
+
fdrQ: fdr !== undefined ? parseFloat(fdr) : undefined,
|
|
625
|
+
}, raw);
|
|
626
|
+
},
|
|
627
|
+
},
|
|
628
|
+
{
|
|
629
|
+
command: 'install',
|
|
630
|
+
handler: (args, cwd, raw) => {
|
|
631
|
+
// Positional harness names (everything after `install` that isn't a flag).
|
|
632
|
+
const harnesses = args
|
|
633
|
+
.slice(1)
|
|
634
|
+
.filter((a) => !a.startsWith('--'));
|
|
635
|
+
cmdInstall(cwd, {
|
|
636
|
+
harnesses,
|
|
637
|
+
all: args.includes('--all'),
|
|
638
|
+
list: args.includes('--list'),
|
|
639
|
+
dryRun: args.includes('--dry-run'),
|
|
640
|
+
}, raw);
|
|
641
|
+
},
|
|
642
|
+
},
|
|
643
|
+
];
|
|
644
|
+
// ─── Subcommand Arrays ──────────────────────────────────────────────────────
|
|
645
|
+
const STATE_SUBS = [
|
|
646
|
+
'load',
|
|
647
|
+
'get',
|
|
648
|
+
'patch',
|
|
649
|
+
'update',
|
|
650
|
+
'advance-plan',
|
|
651
|
+
'record-metric',
|
|
652
|
+
'update-progress',
|
|
653
|
+
'add-decision',
|
|
654
|
+
'add-blocker',
|
|
655
|
+
'resolve-blocker',
|
|
656
|
+
'record-session',
|
|
657
|
+
];
|
|
658
|
+
const TEMPLATE_SUBS = ['select', 'fill'];
|
|
659
|
+
const FRONTMATTER_SUBS = ['get', 'set', 'merge', 'validate'];
|
|
660
|
+
const VERIFY_SUBS = [
|
|
661
|
+
'plan-structure',
|
|
662
|
+
'phase-completeness',
|
|
663
|
+
'references',
|
|
664
|
+
'commits',
|
|
665
|
+
'artifacts',
|
|
666
|
+
'key-links',
|
|
667
|
+
'mechanical',
|
|
668
|
+
];
|
|
669
|
+
const PHASES_SUBS = ['list'];
|
|
670
|
+
const ROADMAP_SUBS = ['get-phase', 'analyze'];
|
|
671
|
+
const PHASE_SUBS = [
|
|
672
|
+
'next-decimal',
|
|
673
|
+
'add',
|
|
674
|
+
'insert',
|
|
675
|
+
'remove',
|
|
676
|
+
'complete',
|
|
677
|
+
'analyze-deps',
|
|
678
|
+
];
|
|
679
|
+
const MILESTONE_SUBS = ['complete'];
|
|
680
|
+
const VALIDATE_SUBS = ['consistency'];
|
|
681
|
+
const TODO_SUBS = ['complete'];
|
|
682
|
+
const TRACKER_SUBS = [
|
|
683
|
+
'get-config',
|
|
684
|
+
'sync-roadmap',
|
|
685
|
+
'sync-phase',
|
|
686
|
+
'update-status',
|
|
687
|
+
'add-comment',
|
|
688
|
+
'sync-status',
|
|
689
|
+
'schedule',
|
|
690
|
+
'prepare-reschedule',
|
|
691
|
+
'prepare-roadmap-sync',
|
|
692
|
+
'prepare-phase-sync',
|
|
693
|
+
'record-mapping',
|
|
694
|
+
'record-status',
|
|
695
|
+
];
|
|
696
|
+
const REQUIREMENT_SUBS = ['get', 'list', 'traceability', 'update-status'];
|
|
697
|
+
const WORKTREE_SUBS = [
|
|
698
|
+
'create',
|
|
699
|
+
'remove',
|
|
700
|
+
'list',
|
|
701
|
+
'push-pr',
|
|
702
|
+
'ensure-milestone-branch',
|
|
703
|
+
'merge',
|
|
704
|
+
'hook',
|
|
705
|
+
];
|
|
706
|
+
const { INIT_WORKFLOWS } = require('../lib/cli/index');
|
|
707
|
+
// ─── Main ───────────────────────────────────────────────────────────────────
|
|
708
|
+
async function main() {
|
|
709
|
+
const args = process.argv.slice(2);
|
|
710
|
+
const rawIndex = args.indexOf('--raw');
|
|
711
|
+
const raw = rawIndex !== -1;
|
|
712
|
+
if (rawIndex !== -1)
|
|
713
|
+
args.splice(rawIndex, 1);
|
|
714
|
+
const command = args[0];
|
|
715
|
+
const cwd = process.cwd();
|
|
716
|
+
if (!command) {
|
|
717
|
+
error('Usage: grd-tools <command> [args] [--raw]\nCommands: state, resolve-model, find-phase, commit, verify-summary, verify, frontmatter, template, generate-slug, current-timestamp, list-todos, verify-path-exists, config-ensure-section, tracker, init, dashboard, phase-detail, health, detect-backend, long-term-roadmap, quality-analysis, setup, search, requirement, worktree, migrate-dirs, coverage-report, health-check, dead-end');
|
|
718
|
+
}
|
|
719
|
+
try {
|
|
720
|
+
await routeCommand(command, args, cwd, raw);
|
|
721
|
+
}
|
|
722
|
+
catch (e) {
|
|
723
|
+
error(e.stack || String(e));
|
|
724
|
+
}
|
|
725
|
+
}
|
|
726
|
+
// ─── Route Command ──────────────────────────────────────────────────────────
|
|
727
|
+
/** Validate and route CLI commands */
|
|
728
|
+
async function routeCommand(command, args, cwd, raw) {
|
|
729
|
+
// Descriptor-based dispatch: check ROUTE_DESCRIPTORS before falling through to switch
|
|
730
|
+
const descriptor = ROUTE_DESCRIPTORS.find((d) => d.command === command);
|
|
731
|
+
if (descriptor) {
|
|
732
|
+
return descriptor.handler(args, cwd, raw);
|
|
733
|
+
}
|
|
734
|
+
switch (command) {
|
|
735
|
+
case 'state': {
|
|
736
|
+
const sub = args[1];
|
|
737
|
+
// No subcommand defaults to load -- only validate if provided
|
|
738
|
+
if (sub)
|
|
739
|
+
validateSubcommand(sub, STATE_SUBS, 'state');
|
|
740
|
+
if (sub === 'update')
|
|
741
|
+
cmdStateUpdate(cwd, args[2], args[3]);
|
|
742
|
+
else if (sub === 'get')
|
|
743
|
+
cmdStateGet(cwd, args[2], raw);
|
|
744
|
+
else if (sub === 'patch') {
|
|
745
|
+
const patches = {};
|
|
746
|
+
for (let i = 2; i < args.length; i += 2) {
|
|
747
|
+
const k = args[i].replace(/^--/, '');
|
|
748
|
+
if (k && args[i + 1] !== undefined)
|
|
749
|
+
patches[k] = args[i + 1];
|
|
750
|
+
}
|
|
751
|
+
cmdStatePatch(cwd, patches, raw);
|
|
752
|
+
}
|
|
753
|
+
else if (sub === 'advance-plan')
|
|
754
|
+
cmdStateAdvancePlan(cwd, raw);
|
|
755
|
+
else if (sub === 'record-metric') {
|
|
756
|
+
cmdStateRecordMetric(cwd, {
|
|
757
|
+
phase: flag(args, '--phase') ?? null,
|
|
758
|
+
plan: flag(args, '--plan') ?? null,
|
|
759
|
+
duration: flag(args, '--duration') ?? null,
|
|
760
|
+
tasks: flag(args, '--tasks') ?? null,
|
|
761
|
+
files: flag(args, '--files') ?? null,
|
|
762
|
+
}, raw);
|
|
763
|
+
}
|
|
764
|
+
else if (sub === 'update-progress')
|
|
765
|
+
cmdStateUpdateProgress(cwd, raw);
|
|
766
|
+
else if (sub === 'add-decision') {
|
|
767
|
+
cmdStateAddDecision(cwd, {
|
|
768
|
+
phase: flag(args, '--phase') ?? null,
|
|
769
|
+
summary: flag(args, '--summary') ?? null,
|
|
770
|
+
rationale: flag(args, '--rationale') ?? '',
|
|
771
|
+
}, raw);
|
|
772
|
+
}
|
|
773
|
+
else if (sub === 'add-blocker')
|
|
774
|
+
cmdStateAddBlocker(cwd, flag(args, '--text') ?? '', raw);
|
|
775
|
+
else if (sub === 'resolve-blocker')
|
|
776
|
+
cmdStateResolveBlocker(cwd, flag(args, '--text') ?? '', raw);
|
|
777
|
+
else if (sub === 'record-session') {
|
|
778
|
+
cmdStateRecordSession(cwd, {
|
|
779
|
+
stopped_at: flag(args, '--stopped-at') ?? null,
|
|
780
|
+
resume_file: flag(args, '--resume-file') ?? 'None',
|
|
781
|
+
}, raw);
|
|
782
|
+
}
|
|
783
|
+
else
|
|
784
|
+
cmdStateLoad(cwd, raw);
|
|
785
|
+
break;
|
|
786
|
+
}
|
|
787
|
+
case 'resolve-model':
|
|
788
|
+
cmdResolveModel(cwd, args[1], raw);
|
|
789
|
+
break;
|
|
790
|
+
case 'find-phase':
|
|
791
|
+
cmdFindPhase(cwd, args[1], raw);
|
|
792
|
+
break;
|
|
793
|
+
case 'commit': {
|
|
794
|
+
const filesIndex = args.indexOf('--files');
|
|
795
|
+
cmdCommit(cwd, args[1], filesIndex !== -1
|
|
796
|
+
? args.slice(filesIndex + 1).filter((a) => !a.startsWith('--'))
|
|
797
|
+
: [], raw, args.includes('--amend'));
|
|
798
|
+
break;
|
|
799
|
+
}
|
|
800
|
+
case 'verify-summary': {
|
|
801
|
+
validateFileArg(args[1], cwd);
|
|
802
|
+
const cc = args.indexOf('--check-count');
|
|
803
|
+
cmdVerifySummary(cwd, args[1], cc !== -1 ? parseInt(args[cc + 1], 10) : 2, raw);
|
|
804
|
+
break;
|
|
805
|
+
}
|
|
806
|
+
case 'template': {
|
|
807
|
+
const sub = args[1];
|
|
808
|
+
validateSubcommand(sub, TEMPLATE_SUBS, 'template');
|
|
809
|
+
if (sub === 'select')
|
|
810
|
+
cmdTemplateSelect(cwd, args[2], raw);
|
|
811
|
+
else if (sub === 'fill') {
|
|
812
|
+
cmdTemplateFill(cwd, args[2], {
|
|
813
|
+
phase: flag(args, '--phase') ?? null,
|
|
814
|
+
plan: flag(args, '--plan') ?? null,
|
|
815
|
+
name: flag(args, '--name') ?? null,
|
|
816
|
+
type: flag(args, '--type') ?? 'execute',
|
|
817
|
+
wave: flag(args, '--wave') ?? '1',
|
|
818
|
+
fields: flag(args, '--fields') ? JSON.parse(flag(args, '--fields')) : {},
|
|
819
|
+
}, raw);
|
|
820
|
+
}
|
|
821
|
+
break;
|
|
822
|
+
}
|
|
823
|
+
case 'frontmatter': {
|
|
824
|
+
const sub = args[1];
|
|
825
|
+
validateSubcommand(sub, FRONTMATTER_SUBS, 'frontmatter');
|
|
826
|
+
const file = args[2];
|
|
827
|
+
validateFileArg(file, cwd);
|
|
828
|
+
if (sub === 'get')
|
|
829
|
+
cmdFrontmatterGet(cwd, file, flag(args, '--field') ?? null, raw);
|
|
830
|
+
else if (sub === 'set')
|
|
831
|
+
cmdFrontmatterSet(cwd, file, flag(args, '--field') ?? '', flag(args, '--value') ?? '', raw);
|
|
832
|
+
else if (sub === 'merge')
|
|
833
|
+
cmdFrontmatterMerge(cwd, file, flag(args, '--data') ?? '', raw);
|
|
834
|
+
else if (sub === 'validate')
|
|
835
|
+
cmdFrontmatterValidate(cwd, file, flag(args, '--schema') ?? '', raw);
|
|
836
|
+
break;
|
|
837
|
+
}
|
|
838
|
+
case 'verify': {
|
|
839
|
+
const sub = args[1];
|
|
840
|
+
validateSubcommand(sub, VERIFY_SUBS, 'verify');
|
|
841
|
+
if (sub === 'commits') {
|
|
842
|
+
for (const ref of args.slice(2))
|
|
843
|
+
validateGitRef(ref);
|
|
844
|
+
cmdVerifyCommits(cwd, args.slice(2), raw);
|
|
845
|
+
}
|
|
846
|
+
else if (sub === 'mechanical') {
|
|
847
|
+
// Bundle: arg is a phase number/name, not a file path
|
|
848
|
+
cmdVerifyMechanical(cwd, args[2], raw);
|
|
849
|
+
}
|
|
850
|
+
else {
|
|
851
|
+
validateFileArg(args[2], cwd);
|
|
852
|
+
if (sub === 'plan-structure')
|
|
853
|
+
cmdVerifyPlanStructure(cwd, args[2], raw);
|
|
854
|
+
else if (sub === 'phase-completeness')
|
|
855
|
+
cmdVerifyPhaseCompleteness(cwd, args[2], raw);
|
|
856
|
+
else if (sub === 'references')
|
|
857
|
+
cmdVerifyReferences(cwd, args[2], raw);
|
|
858
|
+
else if (sub === 'artifacts')
|
|
859
|
+
cmdVerifyArtifacts(cwd, args[2], raw);
|
|
860
|
+
else if (sub === 'key-links')
|
|
861
|
+
cmdVerifyKeyLinks(cwd, args[2], raw);
|
|
862
|
+
}
|
|
863
|
+
break;
|
|
864
|
+
}
|
|
865
|
+
case 'generate-slug':
|
|
866
|
+
cmdGenerateSlug(args[1], raw);
|
|
867
|
+
break;
|
|
868
|
+
case 'current-timestamp':
|
|
869
|
+
cmdCurrentTimestamp(args[1] || 'full', raw);
|
|
870
|
+
break;
|
|
871
|
+
case 'list-todos':
|
|
872
|
+
cmdListTodos(cwd, args[1], raw);
|
|
873
|
+
break;
|
|
874
|
+
case 'verify-path-exists':
|
|
875
|
+
cmdVerifyPathExists(cwd, args[1], raw, args.includes('--dry-run'));
|
|
876
|
+
break;
|
|
877
|
+
case 'config-ensure-section':
|
|
878
|
+
cmdConfigEnsureSection(cwd, raw, args.includes('--dry-run'));
|
|
879
|
+
break;
|
|
880
|
+
case 'config-set':
|
|
881
|
+
cmdConfigSet(cwd, args[1], args[2], raw, args.includes('--dry-run'));
|
|
882
|
+
break;
|
|
883
|
+
case 'history-digest':
|
|
884
|
+
cmdHistoryDigest(cwd, raw);
|
|
885
|
+
break;
|
|
886
|
+
case 'dead-end': {
|
|
887
|
+
const sub = args[1];
|
|
888
|
+
if (sub === 'add') {
|
|
889
|
+
// Collect all --evidence flags (repeatable)
|
|
890
|
+
const evidence = [];
|
|
891
|
+
for (let i = 0; i < args.length; i++) {
|
|
892
|
+
if (args[i] === '--evidence' && args[i + 1])
|
|
893
|
+
evidence.push(args[i + 1]);
|
|
894
|
+
}
|
|
895
|
+
cmdDeadEndAdd(cwd, {
|
|
896
|
+
approach: flag(args, '--approach') ?? '',
|
|
897
|
+
phase: flag(args, '--phase') ?? '',
|
|
898
|
+
verdict: flag(args, '--verdict'),
|
|
899
|
+
evidence,
|
|
900
|
+
notes: flag(args, '--notes'),
|
|
901
|
+
}, raw);
|
|
902
|
+
}
|
|
903
|
+
else if (sub === 'promote-from-phase') {
|
|
904
|
+
// Prefer the explicit --phase flag when present. Fall back to
|
|
905
|
+
// positional args[2], but only if it is NOT itself a flag —
|
|
906
|
+
// otherwise `promote-from-phase --phase 1` would pass the literal
|
|
907
|
+
// string "--phase" to findPhaseInternal (codex r1 P2 on PR #37).
|
|
908
|
+
const flagPhase = flag(args, '--phase');
|
|
909
|
+
const positional = args[2] && !args[2].startsWith('--') ? args[2] : undefined;
|
|
910
|
+
const phaseArg = flagPhase ?? positional ?? '';
|
|
911
|
+
cmdDeadEndPromoteFromPhase(cwd, phaseArg, raw);
|
|
912
|
+
}
|
|
913
|
+
else {
|
|
914
|
+
error(`Unknown dead-end subcommand: ${sub}. Valid: add, promote-from-phase`);
|
|
915
|
+
}
|
|
916
|
+
break;
|
|
917
|
+
}
|
|
918
|
+
case 'genome': {
|
|
919
|
+
const sub = args[1];
|
|
920
|
+
if (sub === 'init') {
|
|
921
|
+
cmdGenomeInit(cwd, raw);
|
|
922
|
+
}
|
|
923
|
+
else if (sub === 'show') {
|
|
924
|
+
cmdGenomeShow(cwd, raw);
|
|
925
|
+
}
|
|
926
|
+
else if (sub === 'snapshot') {
|
|
927
|
+
cmdGenomeSnapshot(cwd, raw);
|
|
928
|
+
}
|
|
929
|
+
else if (sub === 'promote-suggestion') {
|
|
930
|
+
const slug = args[2] && !args[2].startsWith('--') ? args[2] : '';
|
|
931
|
+
cmdGenomePromoteSuggestion(cwd, slug, raw);
|
|
932
|
+
}
|
|
933
|
+
else {
|
|
934
|
+
error(`Unknown genome subcommand: ${sub}. Valid: init, show, snapshot, promote-suggestion`);
|
|
935
|
+
}
|
|
936
|
+
break;
|
|
937
|
+
}
|
|
938
|
+
case 'think': {
|
|
939
|
+
// Tier-3 #11 of the Ouroboros integration. One-shot project-state
|
|
940
|
+
// aggregator. No daemon, no LLM, writes only to .planning/thoughts/.
|
|
941
|
+
//
|
|
942
|
+
// codex r1 P3 on PR #42: strictly validate --limit. Pre-fix:
|
|
943
|
+
// `--limit 1.5` parseInt → 1 (silent truncation)
|
|
944
|
+
// `--limit 3abc` parseInt → 3 (silent truncation)
|
|
945
|
+
// `--limit` (no value) → silently defaulted
|
|
946
|
+
// All three slipped past the positive-integer check downstream.
|
|
947
|
+
let limit;
|
|
948
|
+
if (args.indexOf('--limit') !== -1) {
|
|
949
|
+
const limitRaw = flag(args, '--limit');
|
|
950
|
+
if (limitRaw === undefined || !/^\d+$/.test(limitRaw)) {
|
|
951
|
+
error(`--limit requires a positive integer value (got ${limitRaw === undefined ? '<missing>' : `"${limitRaw}"`})`);
|
|
952
|
+
}
|
|
953
|
+
limit = parseInt(limitRaw, 10);
|
|
954
|
+
}
|
|
955
|
+
cmdThink(cwd, { limit }, raw);
|
|
956
|
+
break;
|
|
957
|
+
}
|
|
958
|
+
case 'plan-tournament': {
|
|
959
|
+
// Tier-3 #9 of the Ouroboros integration. Scoring + selection over
|
|
960
|
+
// N candidate PLAN.md files. Caller supplies paths; this command
|
|
961
|
+
// does NOT auto-generate candidates (that's a deliberate follow-up
|
|
962
|
+
// to avoid worktree orchestration + backend variance per the
|
|
963
|
+
// proposal's caveat).
|
|
964
|
+
const rawCandidates = [];
|
|
965
|
+
for (let i = 0; i < args.length; i++) {
|
|
966
|
+
if (args[i] === '--candidate' && args[i + 1])
|
|
967
|
+
rawCandidates.push(args[i + 1]);
|
|
968
|
+
}
|
|
969
|
+
// Also accept comma-separated list via --candidates "a.md,b.md"
|
|
970
|
+
const csv = flag(args, '--candidates');
|
|
971
|
+
if (csv) {
|
|
972
|
+
for (const p of csv.split(',')) {
|
|
973
|
+
const trimmed = p.trim();
|
|
974
|
+
if (trimmed)
|
|
975
|
+
rawCandidates.push(trimmed);
|
|
976
|
+
}
|
|
977
|
+
}
|
|
978
|
+
// codex r4 P2 on PR #41: validate each candidate path against the
|
|
979
|
+
// project boundary before passing it to the scorer. Without this
|
|
980
|
+
// guard, absolute paths or `../` traversal could read files
|
|
981
|
+
// outside the repo when gd is invoked via automation / MCP.
|
|
982
|
+
//
|
|
983
|
+
// codex r5 P2 on PR #41: validateFileArg's underlying check is
|
|
984
|
+
// prefix-based, so a sibling like `${cwd}-secrets/PLAN.md` would
|
|
985
|
+
// squeak through. Tighten with a path.relative containment check.
|
|
986
|
+
const path_lib = require('path');
|
|
987
|
+
const candidates = rawCandidates.map((p) => {
|
|
988
|
+
const validated = validateFileArg(p, cwd);
|
|
989
|
+
const rel = path_lib.relative(cwd, validated);
|
|
990
|
+
if (rel === '' || rel.startsWith('..') || path_lib.isAbsolute(rel)) {
|
|
991
|
+
error(`Candidate path "${p}" is outside the project directory`);
|
|
992
|
+
}
|
|
993
|
+
return validated;
|
|
994
|
+
});
|
|
995
|
+
// codex r5 P3: validate phase format before interpolating into
|
|
996
|
+
// _extractRoadmapGoal's regex, where a malformed value would
|
|
997
|
+
// crash with a regex syntax error.
|
|
998
|
+
const phaseArg = flag(args, '--phase') ?? '';
|
|
999
|
+
if (phaseArg)
|
|
1000
|
+
validatePhaseArg(phaseArg);
|
|
1001
|
+
cmdPlanTournament(cwd, { phase: phaseArg, candidates }, raw);
|
|
1002
|
+
break;
|
|
1003
|
+
}
|
|
1004
|
+
case 'phases': {
|
|
1005
|
+
const sub = args[1];
|
|
1006
|
+
validateSubcommand(sub, PHASES_SUBS, 'phases');
|
|
1007
|
+
cmdPhasesList(cwd, { type: flag(args, '--type') ?? null, phase: flag(args, '--phase') ?? null }, raw);
|
|
1008
|
+
break;
|
|
1009
|
+
}
|
|
1010
|
+
case 'roadmap': {
|
|
1011
|
+
const sub = args[1];
|
|
1012
|
+
validateSubcommand(sub, ROADMAP_SUBS, 'roadmap');
|
|
1013
|
+
if (sub === 'get-phase') {
|
|
1014
|
+
validatePhaseArg(args[2]);
|
|
1015
|
+
cmdRoadmapGetPhase(cwd, args[2], raw);
|
|
1016
|
+
}
|
|
1017
|
+
else if (sub === 'analyze')
|
|
1018
|
+
cmdRoadmapAnalyze(cwd, raw);
|
|
1019
|
+
break;
|
|
1020
|
+
}
|
|
1021
|
+
case 'phase': {
|
|
1022
|
+
const sub = args[1];
|
|
1023
|
+
validateSubcommand(sub, PHASE_SUBS, 'phase');
|
|
1024
|
+
if (sub === 'next-decimal') {
|
|
1025
|
+
validatePhaseArg(args[2]);
|
|
1026
|
+
cmdPhaseNextDecimal(cwd, args[2], raw);
|
|
1027
|
+
}
|
|
1028
|
+
else if (sub === 'add') {
|
|
1029
|
+
const ctxIdx = args.indexOf('--context');
|
|
1030
|
+
let context;
|
|
1031
|
+
if (ctxIdx !== -1) {
|
|
1032
|
+
context = args.slice(ctxIdx + 1).join(' ');
|
|
1033
|
+
args.splice(ctxIdx);
|
|
1034
|
+
}
|
|
1035
|
+
cmdPhaseAdd(cwd, args.slice(2).join(' '), raw, context);
|
|
1036
|
+
}
|
|
1037
|
+
else if (sub === 'insert') {
|
|
1038
|
+
validatePhaseArg(args[2]);
|
|
1039
|
+
cmdPhaseInsert(cwd, args[2], args.slice(3).join(' '), raw);
|
|
1040
|
+
}
|
|
1041
|
+
else if (sub === 'remove') {
|
|
1042
|
+
validatePhaseArg(args[2]);
|
|
1043
|
+
cmdPhaseRemove(cwd, args[2], { force: args.includes('--force'), dryRun: args.includes('--dry-run') }, raw);
|
|
1044
|
+
}
|
|
1045
|
+
else if (sub === 'complete') {
|
|
1046
|
+
validatePhaseArg(args[2]);
|
|
1047
|
+
await cmdPhaseComplete(cwd, args[2], raw, { dryRun: args.includes('--dry-run') });
|
|
1048
|
+
}
|
|
1049
|
+
else if (sub === 'analyze-deps') {
|
|
1050
|
+
cmdPhaseAnalyzeDeps(cwd, raw);
|
|
1051
|
+
}
|
|
1052
|
+
break;
|
|
1053
|
+
}
|
|
1054
|
+
case 'milestone': {
|
|
1055
|
+
const sub = args[1];
|
|
1056
|
+
validateSubcommand(sub, MILESTONE_SUBS, 'milestone');
|
|
1057
|
+
if (sub === 'complete') {
|
|
1058
|
+
const ni = args.indexOf('--name');
|
|
1059
|
+
const version = args.slice(2).find((a) => !a.startsWith('--')) || null;
|
|
1060
|
+
cmdMilestoneComplete(cwd, version, {
|
|
1061
|
+
name: ni !== -1 ? args[ni + 1] : null,
|
|
1062
|
+
dryRun: args.includes('--dry-run'),
|
|
1063
|
+
}, raw);
|
|
1064
|
+
}
|
|
1065
|
+
break;
|
|
1066
|
+
}
|
|
1067
|
+
case 'version': {
|
|
1068
|
+
const VERSION_SUBS = ['bump'];
|
|
1069
|
+
validateSubcommand(args[1], VERSION_SUBS, 'version');
|
|
1070
|
+
if (args[1] === 'bump') {
|
|
1071
|
+
if (!args[2])
|
|
1072
|
+
error('version string required (e.g., v1.0.0)');
|
|
1073
|
+
cmdVersionBump(cwd, args[2], raw);
|
|
1074
|
+
}
|
|
1075
|
+
break;
|
|
1076
|
+
}
|
|
1077
|
+
case 'validate': {
|
|
1078
|
+
validateSubcommand(args[1], VALIDATE_SUBS, 'validate');
|
|
1079
|
+
cmdValidateConsistency(cwd, raw);
|
|
1080
|
+
break;
|
|
1081
|
+
}
|
|
1082
|
+
case 'progress':
|
|
1083
|
+
cmdProgressRender(cwd, args[1] || 'json', raw);
|
|
1084
|
+
break;
|
|
1085
|
+
case 'todo': {
|
|
1086
|
+
validateSubcommand(args[1], TODO_SUBS, 'todo');
|
|
1087
|
+
cmdTodoComplete(cwd, args[2], raw, args.includes('--dry-run'));
|
|
1088
|
+
break;
|
|
1089
|
+
}
|
|
1090
|
+
case 'scaffold': {
|
|
1091
|
+
const pi = args.indexOf('--phase');
|
|
1092
|
+
const ni = args.indexOf('--name');
|
|
1093
|
+
cmdScaffold(cwd, args[1], {
|
|
1094
|
+
phase: pi !== -1 ? args[pi + 1] : null,
|
|
1095
|
+
name: ni !== -1 ? args.slice(ni + 1).join(' ') : null,
|
|
1096
|
+
}, raw);
|
|
1097
|
+
break;
|
|
1098
|
+
}
|
|
1099
|
+
case 'migrate-dirs':
|
|
1100
|
+
cmdMigrateDirs(cwd, raw, args.includes('--dry-run'));
|
|
1101
|
+
break;
|
|
1102
|
+
case 'init': {
|
|
1103
|
+
const wf = args[1];
|
|
1104
|
+
const includes = parseIncludeFlag(args);
|
|
1105
|
+
validateSubcommand(wf, INIT_WORKFLOWS, 'init');
|
|
1106
|
+
switch (wf) {
|
|
1107
|
+
case 'execute-phase':
|
|
1108
|
+
validatePhaseArg(args[2]);
|
|
1109
|
+
cmdInitExecutePhase(cwd, args[2], includes, raw);
|
|
1110
|
+
break;
|
|
1111
|
+
case 'execute-parallel': {
|
|
1112
|
+
const phases = args.slice(2).filter((a) => !a.startsWith('--'));
|
|
1113
|
+
if (phases.length === 0)
|
|
1114
|
+
error('At least one phase number required for init execute-parallel');
|
|
1115
|
+
for (const p of phases)
|
|
1116
|
+
validatePhaseArg(p);
|
|
1117
|
+
cmdInitExecuteParallel(cwd, phases, includes, raw);
|
|
1118
|
+
break;
|
|
1119
|
+
}
|
|
1120
|
+
case 'plan-phase':
|
|
1121
|
+
validatePhaseArg(args[2]);
|
|
1122
|
+
cmdInitPlanPhase(cwd, args[2], includes, raw);
|
|
1123
|
+
break;
|
|
1124
|
+
case 'new-project':
|
|
1125
|
+
cmdInitNewProject(cwd, raw);
|
|
1126
|
+
break;
|
|
1127
|
+
case 'new-milestone':
|
|
1128
|
+
cmdInitNewMilestone(cwd, raw);
|
|
1129
|
+
break;
|
|
1130
|
+
case 'quick':
|
|
1131
|
+
cmdInitQuick(cwd, args.slice(2).join(' '), raw);
|
|
1132
|
+
break;
|
|
1133
|
+
case 'resume':
|
|
1134
|
+
cmdInitResume(cwd, raw);
|
|
1135
|
+
break;
|
|
1136
|
+
case 'verify-work':
|
|
1137
|
+
validatePhaseArg(args[2]);
|
|
1138
|
+
cmdInitVerifyWork(cwd, args[2], raw);
|
|
1139
|
+
break;
|
|
1140
|
+
case 'phase-op':
|
|
1141
|
+
validatePhaseArg(args[2]);
|
|
1142
|
+
cmdInitPhaseOp(cwd, args[2], raw);
|
|
1143
|
+
break;
|
|
1144
|
+
case 'todos':
|
|
1145
|
+
cmdInitTodos(cwd, args[2], raw);
|
|
1146
|
+
break;
|
|
1147
|
+
case 'milestone-op':
|
|
1148
|
+
cmdInitMilestoneOp(cwd, raw);
|
|
1149
|
+
break;
|
|
1150
|
+
case 'plan-milestone-gaps':
|
|
1151
|
+
cmdInitPlanMilestoneGaps(cwd, raw);
|
|
1152
|
+
break;
|
|
1153
|
+
case 'map-codebase':
|
|
1154
|
+
cmdInitMapCodebase(cwd, raw);
|
|
1155
|
+
break;
|
|
1156
|
+
case 'progress':
|
|
1157
|
+
cmdInitProgress(cwd, includes, raw, args.includes('--refresh'));
|
|
1158
|
+
break;
|
|
1159
|
+
case 'survey':
|
|
1160
|
+
cmdInitSurveyor(cwd, args.slice(2).join(' ') || '', raw);
|
|
1161
|
+
break;
|
|
1162
|
+
case 'deep-dive':
|
|
1163
|
+
cmdInitDeepDive(cwd, args.slice(2).join(' ') || '', raw);
|
|
1164
|
+
break;
|
|
1165
|
+
case 'feasibility':
|
|
1166
|
+
cmdInitFeasibility(cwd, args.slice(2).join(' ') || '', raw);
|
|
1167
|
+
break;
|
|
1168
|
+
case 'eval-plan':
|
|
1169
|
+
cmdInitEvalPlan(cwd, args[2] || null, raw);
|
|
1170
|
+
break;
|
|
1171
|
+
case 'eval-report':
|
|
1172
|
+
cmdInitEvalReport(cwd, args[2] || null, raw);
|
|
1173
|
+
break;
|
|
1174
|
+
case 'assess-baseline':
|
|
1175
|
+
cmdInitAssessBaseline(cwd, raw);
|
|
1176
|
+
break;
|
|
1177
|
+
case 'product-plan':
|
|
1178
|
+
cmdInitProductOwner(cwd, raw);
|
|
1179
|
+
break;
|
|
1180
|
+
case 'iterate':
|
|
1181
|
+
cmdInitResearchWorkflow(cwd, 'iterate', args.slice(2).join(' '), includes, raw);
|
|
1182
|
+
break;
|
|
1183
|
+
case 'project-researcher':
|
|
1184
|
+
cmdInitProjectResearcher(cwd, args.slice(2).join(' ') || '', raw);
|
|
1185
|
+
break;
|
|
1186
|
+
case 'research-synthesizer':
|
|
1187
|
+
cmdInitResearchSynthesizer(cwd, raw);
|
|
1188
|
+
break;
|
|
1189
|
+
case 'roadmapper':
|
|
1190
|
+
cmdInitRoadmapper(cwd, raw);
|
|
1191
|
+
break;
|
|
1192
|
+
case 'verifier':
|
|
1193
|
+
cmdInitVerifier(cwd, args[2] || null, raw);
|
|
1194
|
+
break;
|
|
1195
|
+
case 'autopilot':
|
|
1196
|
+
cmdInitAutopilot(cwd, raw);
|
|
1197
|
+
break;
|
|
1198
|
+
case 'multi-milestone-autopilot':
|
|
1199
|
+
cmdInitMultiMilestoneAutopilot(cwd, raw);
|
|
1200
|
+
break;
|
|
1201
|
+
case 'autoplan':
|
|
1202
|
+
cmdInitAutoplan(cwd, raw);
|
|
1203
|
+
break;
|
|
1204
|
+
case 'autoresearch':
|
|
1205
|
+
cmdInitAutoResearch(cwd, raw);
|
|
1206
|
+
break;
|
|
1207
|
+
case 'evolve':
|
|
1208
|
+
cmdInitEvolve(cwd, raw);
|
|
1209
|
+
break;
|
|
1210
|
+
case 'wireup':
|
|
1211
|
+
cmdInitWireup(cwd, raw);
|
|
1212
|
+
break;
|
|
1213
|
+
case 'debug':
|
|
1214
|
+
cmdInitDebug(cwd, args[2] || null, raw);
|
|
1215
|
+
break;
|
|
1216
|
+
case 'integration-check':
|
|
1217
|
+
cmdInitIntegrationCheck(cwd, args[2] || null, raw);
|
|
1218
|
+
break;
|
|
1219
|
+
case 'migrate':
|
|
1220
|
+
cmdInitMigrate(cwd, raw);
|
|
1221
|
+
break;
|
|
1222
|
+
case 'plan-check':
|
|
1223
|
+
validatePhaseArg(args[2]);
|
|
1224
|
+
cmdInitPlanCheck(cwd, args[2], raw);
|
|
1225
|
+
break;
|
|
1226
|
+
case 'phase-research':
|
|
1227
|
+
validatePhaseArg(args[2]);
|
|
1228
|
+
cmdInitPhaseResearch(cwd, args[2], includes, raw);
|
|
1229
|
+
break;
|
|
1230
|
+
case 'code-review':
|
|
1231
|
+
validatePhaseArg(args[2]);
|
|
1232
|
+
cmdInitCodeReview(cwd, args[2], raw);
|
|
1233
|
+
break;
|
|
1234
|
+
}
|
|
1235
|
+
break;
|
|
1236
|
+
}
|
|
1237
|
+
case 'phase-plan-index':
|
|
1238
|
+
validatePhaseArg(args[1]);
|
|
1239
|
+
cmdPhasePlanIndex(cwd, args[1], raw);
|
|
1240
|
+
break;
|
|
1241
|
+
case 'state-snapshot': {
|
|
1242
|
+
const sinceIdx = args.indexOf('--since');
|
|
1243
|
+
const snapshotOptions = sinceIdx !== -1 ? { since: args[sinceIdx + 1] } : {};
|
|
1244
|
+
cmdStateSnapshot(cwd, raw, snapshotOptions);
|
|
1245
|
+
break;
|
|
1246
|
+
}
|
|
1247
|
+
case 'summary-extract': {
|
|
1248
|
+
validateFileArg(args[1], cwd);
|
|
1249
|
+
const fi = args.indexOf('--fields');
|
|
1250
|
+
cmdSummaryExtract(cwd, args[1], fi !== -1 ? args[fi + 1].split(',') : null, raw);
|
|
1251
|
+
break;
|
|
1252
|
+
}
|
|
1253
|
+
case 'tracker': {
|
|
1254
|
+
validateSubcommand(args[1], TRACKER_SUBS, 'tracker');
|
|
1255
|
+
await cmdTracker(cwd, args[1], args.slice(2), raw);
|
|
1256
|
+
break;
|
|
1257
|
+
}
|
|
1258
|
+
case 'dashboard':
|
|
1259
|
+
cmdDashboard(cwd, raw);
|
|
1260
|
+
break;
|
|
1261
|
+
case 'phase-detail':
|
|
1262
|
+
validatePhaseArg(args[1]);
|
|
1263
|
+
cmdPhaseDetail(cwd, args[1], raw);
|
|
1264
|
+
break;
|
|
1265
|
+
case 'health':
|
|
1266
|
+
cmdHealth(cwd, raw);
|
|
1267
|
+
break;
|
|
1268
|
+
case 'detect-backend':
|
|
1269
|
+
cmdDetectBackend(cwd, raw);
|
|
1270
|
+
break;
|
|
1271
|
+
case 'long-term-roadmap': {
|
|
1272
|
+
const sub = args[1];
|
|
1273
|
+
if (!sub)
|
|
1274
|
+
error('subcommand required: list, add, remove, update, refine, link, unlink, display, init, history, parse, validate');
|
|
1275
|
+
const subArgs = args.slice(2);
|
|
1276
|
+
cmdLongTermRoadmap(cwd, sub, subArgs, raw);
|
|
1277
|
+
break;
|
|
1278
|
+
}
|
|
1279
|
+
case 'quality-analysis':
|
|
1280
|
+
cmdQualityAnalysis(cwd, args.slice(1), raw);
|
|
1281
|
+
break;
|
|
1282
|
+
case 'setup':
|
|
1283
|
+
cmdSetup(cwd, raw);
|
|
1284
|
+
break;
|
|
1285
|
+
case 'search':
|
|
1286
|
+
if (!args[1])
|
|
1287
|
+
error('Search query is required');
|
|
1288
|
+
cmdSearch(cwd, args[1], raw);
|
|
1289
|
+
break;
|
|
1290
|
+
case 'requirement': {
|
|
1291
|
+
const sub = args[1];
|
|
1292
|
+
validateSubcommand(sub, REQUIREMENT_SUBS, 'requirement');
|
|
1293
|
+
if (sub === 'get') {
|
|
1294
|
+
if (!args[2])
|
|
1295
|
+
error('REQ-ID required');
|
|
1296
|
+
cmdRequirementGet(cwd, args[2], raw);
|
|
1297
|
+
}
|
|
1298
|
+
else if (sub === 'list') {
|
|
1299
|
+
cmdRequirementList(cwd, {
|
|
1300
|
+
phase: flag(args, '--phase') ?? null,
|
|
1301
|
+
priority: flag(args, '--priority') ?? null,
|
|
1302
|
+
status: flag(args, '--status') ?? null,
|
|
1303
|
+
category: flag(args, '--category') ?? null,
|
|
1304
|
+
all: args.includes('--all'),
|
|
1305
|
+
}, raw);
|
|
1306
|
+
}
|
|
1307
|
+
else if (sub === 'traceability') {
|
|
1308
|
+
cmdRequirementTraceability(cwd, {
|
|
1309
|
+
phase: flag(args, '--phase') ?? null,
|
|
1310
|
+
}, raw);
|
|
1311
|
+
}
|
|
1312
|
+
else if (sub === 'update-status') {
|
|
1313
|
+
if (!args[2])
|
|
1314
|
+
error('REQ-ID required');
|
|
1315
|
+
if (!args[3])
|
|
1316
|
+
error('Status required (Pending, In Progress, Done, Deferred)');
|
|
1317
|
+
// Handle multi-word status "In Progress" -- args[3] might be "In" and args[4] "Progress"
|
|
1318
|
+
let status = args[3];
|
|
1319
|
+
if (args[3] === 'In' && args[4] === 'Progress') {
|
|
1320
|
+
status = 'In Progress';
|
|
1321
|
+
}
|
|
1322
|
+
cmdRequirementUpdateStatus(cwd, args[2], status, raw, args.includes('--dry-run'));
|
|
1323
|
+
}
|
|
1324
|
+
break;
|
|
1325
|
+
}
|
|
1326
|
+
case 'worktree': {
|
|
1327
|
+
const sub = args[1];
|
|
1328
|
+
validateSubcommand(sub, WORKTREE_SUBS, 'worktree');
|
|
1329
|
+
if (sub === 'create') {
|
|
1330
|
+
cmdWorktreeCreate(cwd, {
|
|
1331
|
+
phase: flag(args, '--phase') ?? null,
|
|
1332
|
+
milestone: flag(args, '--milestone') ?? null,
|
|
1333
|
+
slug: flag(args, '--slug') ?? null,
|
|
1334
|
+
startPoint: flag(args, '--start-point') ?? null,
|
|
1335
|
+
}, raw);
|
|
1336
|
+
}
|
|
1337
|
+
else if (sub === 'remove') {
|
|
1338
|
+
if (args.includes('--stale')) {
|
|
1339
|
+
cmdWorktreeRemoveStale(cwd, raw);
|
|
1340
|
+
}
|
|
1341
|
+
else {
|
|
1342
|
+
cmdWorktreeRemove(cwd, {
|
|
1343
|
+
phase: flag(args, '--phase') ?? null,
|
|
1344
|
+
path: flag(args, '--path') ?? null,
|
|
1345
|
+
milestone: flag(args, '--milestone') ?? null,
|
|
1346
|
+
}, raw);
|
|
1347
|
+
}
|
|
1348
|
+
}
|
|
1349
|
+
else if (sub === 'list') {
|
|
1350
|
+
cmdWorktreeList(cwd, raw);
|
|
1351
|
+
}
|
|
1352
|
+
else if (sub === 'push-pr') {
|
|
1353
|
+
cmdWorktreePushAndPR(cwd, {
|
|
1354
|
+
phase: flag(args, '--phase') ?? null,
|
|
1355
|
+
milestone: flag(args, '--milestone') ?? null,
|
|
1356
|
+
title: flag(args, '--title') ?? null,
|
|
1357
|
+
body: flag(args, '--body') ?? null,
|
|
1358
|
+
base: flag(args, '--base') ?? null,
|
|
1359
|
+
}, raw);
|
|
1360
|
+
}
|
|
1361
|
+
else if (sub === 'ensure-milestone-branch') {
|
|
1362
|
+
cmdWorktreeEnsureMilestoneBranch(cwd, {
|
|
1363
|
+
milestone: flag(args, '--milestone') ?? null,
|
|
1364
|
+
baseBranch: flag(args, '--base-branch') ?? null,
|
|
1365
|
+
}, raw);
|
|
1366
|
+
}
|
|
1367
|
+
else if (sub === 'merge') {
|
|
1368
|
+
cmdWorktreeMerge(cwd, {
|
|
1369
|
+
phase: flag(args, '--phase') ?? null,
|
|
1370
|
+
milestone: flag(args, '--milestone') ?? null,
|
|
1371
|
+
slug: flag(args, '--slug') ?? null,
|
|
1372
|
+
base: flag(args, '--base') ?? null,
|
|
1373
|
+
branch: flag(args, '--branch') ?? null,
|
|
1374
|
+
deleteBranch: args.includes('--delete-branch'),
|
|
1375
|
+
}, raw);
|
|
1376
|
+
}
|
|
1377
|
+
else if (sub === 'hook') {
|
|
1378
|
+
const hookSub = args[2];
|
|
1379
|
+
if (hookSub === 'create') {
|
|
1380
|
+
cmdWorktreeHookCreate(cwd, args[3], args[4], raw);
|
|
1381
|
+
}
|
|
1382
|
+
else if (hookSub === 'remove') {
|
|
1383
|
+
cmdWorktreeHookRemove(cwd, args[3], args[4], raw);
|
|
1384
|
+
}
|
|
1385
|
+
else {
|
|
1386
|
+
error(`Unknown worktree hook subcommand: ${hookSub}. Use 'create' or 'remove'.`);
|
|
1387
|
+
}
|
|
1388
|
+
}
|
|
1389
|
+
break;
|
|
1390
|
+
}
|
|
1391
|
+
case 'settings': {
|
|
1392
|
+
const sub = args[1];
|
|
1393
|
+
if (sub === 'token_profile') {
|
|
1394
|
+
const value = args[2];
|
|
1395
|
+
const validProfiles = ['frugal', 'balanced', 'quality'];
|
|
1396
|
+
if (!value || !validProfiles.includes(value)) {
|
|
1397
|
+
error(`Invalid token_profile value "${value || ''}". Valid values: ${validProfiles.join(', ')}`);
|
|
1398
|
+
}
|
|
1399
|
+
cmdConfigSet(cwd, 'token_profile', value, raw);
|
|
1400
|
+
}
|
|
1401
|
+
else if (sub === 'phase_complete_llm_fallback') {
|
|
1402
|
+
const value = args[2];
|
|
1403
|
+
if (value !== 'true' && value !== 'false') {
|
|
1404
|
+
error(`Invalid phase_complete_llm_fallback value "${value || ''}". Valid values: true, false`);
|
|
1405
|
+
}
|
|
1406
|
+
cmdConfigSet(cwd, 'phase_complete_llm_fallback', value, raw);
|
|
1407
|
+
}
|
|
1408
|
+
else if (sub === 'effort') {
|
|
1409
|
+
// v0.4 Phase 1: effort axis
|
|
1410
|
+
const value = args[2];
|
|
1411
|
+
const validEffortLevels = ['thrifty', 'balanced', 'deep'];
|
|
1412
|
+
if (!value || !validEffortLevels.includes(value)) {
|
|
1413
|
+
error(`Invalid effort value "${value || ''}". Valid values: ${validEffortLevels.join(', ')}`);
|
|
1414
|
+
}
|
|
1415
|
+
cmdConfigSet(cwd, 'effort', value, raw);
|
|
1416
|
+
}
|
|
1417
|
+
else {
|
|
1418
|
+
error(`Unknown settings subcommand "${sub || ''}". Tool-mode settings subcommands: token_profile, effort, phase_complete_llm_fallback`);
|
|
1419
|
+
}
|
|
1420
|
+
break;
|
|
1421
|
+
}
|
|
1422
|
+
case 'evolve': {
|
|
1423
|
+
const sub = args[1];
|
|
1424
|
+
validateSubcommand(sub, ['run', 'discover', 'state', 'advance', 'reset'], 'evolve');
|
|
1425
|
+
switch (sub) {
|
|
1426
|
+
case 'run':
|
|
1427
|
+
await cmdEvolve(cwd, args.slice(2), raw);
|
|
1428
|
+
return;
|
|
1429
|
+
case 'discover':
|
|
1430
|
+
await cmdEvolveDiscover(cwd, args.slice(2), raw);
|
|
1431
|
+
return;
|
|
1432
|
+
case 'state':
|
|
1433
|
+
cmdEvolveState(cwd, args.slice(2), raw);
|
|
1434
|
+
return;
|
|
1435
|
+
case 'advance':
|
|
1436
|
+
cmdEvolveAdvance(cwd, args.slice(2), raw);
|
|
1437
|
+
return;
|
|
1438
|
+
case 'reset':
|
|
1439
|
+
cmdEvolveReset(cwd, args.slice(2), raw);
|
|
1440
|
+
return;
|
|
1441
|
+
}
|
|
1442
|
+
break;
|
|
1443
|
+
}
|
|
1444
|
+
case 'wireup': {
|
|
1445
|
+
const sub = args[1];
|
|
1446
|
+
validateSubcommand(sub, ['run'], 'wireup');
|
|
1447
|
+
if (sub === 'run') {
|
|
1448
|
+
await cmdWireup(cwd, args.slice(2), raw);
|
|
1449
|
+
return;
|
|
1450
|
+
}
|
|
1451
|
+
break;
|
|
1452
|
+
}
|
|
1453
|
+
case 'autopilot':
|
|
1454
|
+
await cmdAutopilot(cwd, args.slice(1), raw);
|
|
1455
|
+
break;
|
|
1456
|
+
case 'multi-milestone-autopilot':
|
|
1457
|
+
await cmdMultiMilestoneAutopilot(cwd, args.slice(1), raw);
|
|
1458
|
+
break;
|
|
1459
|
+
case 'autoplan':
|
|
1460
|
+
await cmdAutoplan(cwd, args.slice(1), raw);
|
|
1461
|
+
break;
|
|
1462
|
+
case 'autoresearch': {
|
|
1463
|
+
const arConfig = loadConfig(cwd);
|
|
1464
|
+
const arScheduler = createScheduler(arConfig.scheduler, arConfig.superpowers);
|
|
1465
|
+
if (arScheduler) {
|
|
1466
|
+
arScheduler.loadPersistedState(path.join(cwd, '.planning'));
|
|
1467
|
+
}
|
|
1468
|
+
await cmdAutoResearch(cwd, args.slice(1), raw, arScheduler);
|
|
1469
|
+
break;
|
|
1470
|
+
}
|
|
1471
|
+
case 'worktree-hook-create':
|
|
1472
|
+
cmdWorktreeHookCreate(cwd, args[1], args[2], raw);
|
|
1473
|
+
break;
|
|
1474
|
+
case 'worktree-hook-remove':
|
|
1475
|
+
cmdWorktreeHookRemove(cwd, args[1], args[2], raw);
|
|
1476
|
+
break;
|
|
1477
|
+
case 'coverage-report':
|
|
1478
|
+
cmdCoverageReport(cwd, { threshold: parseInt(flag(args, '--threshold', '85'), 10) }, raw);
|
|
1479
|
+
break;
|
|
1480
|
+
case 'health-check':
|
|
1481
|
+
cmdHealthCheck(cwd, { fix: args.includes('--fix') }, raw);
|
|
1482
|
+
break;
|
|
1483
|
+
case 'markdown-split': {
|
|
1484
|
+
_warnDeprecated('markdown-split');
|
|
1485
|
+
const sub = args[1];
|
|
1486
|
+
validateSubcommand(sub, ['split', 'check'], 'markdown-split');
|
|
1487
|
+
switch (sub) {
|
|
1488
|
+
case 'split': {
|
|
1489
|
+
const filePath = args[2];
|
|
1490
|
+
if (!filePath)
|
|
1491
|
+
error('file path required for markdown-split split');
|
|
1492
|
+
const absPath = path.resolve(cwd, filePath);
|
|
1493
|
+
if (!fs.existsSync(absPath))
|
|
1494
|
+
error(`File not found: ${absPath}`);
|
|
1495
|
+
const thresholdIdx = args.indexOf('--threshold');
|
|
1496
|
+
const threshold = thresholdIdx !== -1 ? parseInt(args[thresholdIdx + 1], 10) : undefined;
|
|
1497
|
+
const content = fs.readFileSync(absPath, 'utf-8');
|
|
1498
|
+
const basename = path.basename(absPath, '.md');
|
|
1499
|
+
const dir = path.dirname(absPath);
|
|
1500
|
+
const result = splitMarkdown(content, { threshold, basename });
|
|
1501
|
+
if (!result.split_performed) {
|
|
1502
|
+
output({ split_performed: false, reason: result.reason, file: absPath }, raw);
|
|
1503
|
+
break;
|
|
1504
|
+
}
|
|
1505
|
+
// Write index file (overwrite original)
|
|
1506
|
+
fs.writeFileSync(absPath, result.index_content, 'utf-8');
|
|
1507
|
+
// Write partial files
|
|
1508
|
+
const partials = [];
|
|
1509
|
+
for (const part of result.parts || []) {
|
|
1510
|
+
const partPath = path.join(dir, part.filename);
|
|
1511
|
+
fs.writeFileSync(partPath, part.content, 'utf-8');
|
|
1512
|
+
partials.push(partPath);
|
|
1513
|
+
}
|
|
1514
|
+
output({
|
|
1515
|
+
split_performed: true,
|
|
1516
|
+
index_file: absPath,
|
|
1517
|
+
partials,
|
|
1518
|
+
part_count: (result.parts || []).length,
|
|
1519
|
+
}, raw);
|
|
1520
|
+
break;
|
|
1521
|
+
}
|
|
1522
|
+
case 'check': {
|
|
1523
|
+
const filePath = args[2];
|
|
1524
|
+
if (!filePath)
|
|
1525
|
+
error('file path required for markdown-split check');
|
|
1526
|
+
const absPath = path.resolve(cwd, filePath);
|
|
1527
|
+
if (!fs.existsSync(absPath))
|
|
1528
|
+
error(`File not found: ${absPath}`);
|
|
1529
|
+
const content = fs.readFileSync(absPath, 'utf-8');
|
|
1530
|
+
const tokens = estimateTokens(content);
|
|
1531
|
+
const is_index = isIndexFile(content);
|
|
1532
|
+
output({
|
|
1533
|
+
file: absPath,
|
|
1534
|
+
is_index,
|
|
1535
|
+
estimated_tokens: tokens,
|
|
1536
|
+
exceeds_threshold: tokens > 25000,
|
|
1537
|
+
}, raw);
|
|
1538
|
+
break;
|
|
1539
|
+
}
|
|
1540
|
+
}
|
|
1541
|
+
break;
|
|
1542
|
+
}
|
|
1543
|
+
case 'parallel-progress':
|
|
1544
|
+
cmdParallelProgress(args.slice(1), raw);
|
|
1545
|
+
break;
|
|
1546
|
+
case 'overstory': {
|
|
1547
|
+
const sub = validateSubcommand(args[1] || '', ['detect', 'install'], 'overstory');
|
|
1548
|
+
if (sub === 'detect') {
|
|
1549
|
+
const result = detectOverstory(cwd);
|
|
1550
|
+
output(result || { available: false, reason: 'Overstory not detected' }, raw);
|
|
1551
|
+
}
|
|
1552
|
+
else if (sub === 'install') {
|
|
1553
|
+
try {
|
|
1554
|
+
installOverstory(cwd);
|
|
1555
|
+
output({ ok: true, message: 'Overstory installed and initialized' }, raw);
|
|
1556
|
+
}
|
|
1557
|
+
catch (e) {
|
|
1558
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
1559
|
+
output({ ok: false, error: msg }, raw);
|
|
1560
|
+
}
|
|
1561
|
+
}
|
|
1562
|
+
break;
|
|
1563
|
+
}
|
|
1564
|
+
case 'metrics': {
|
|
1565
|
+
const { getCounters } = require('../lib/metrics');
|
|
1566
|
+
const counters = getCounters();
|
|
1567
|
+
output(counters, raw, JSON.stringify(counters, null, 2));
|
|
1568
|
+
break;
|
|
1569
|
+
}
|
|
1570
|
+
default: {
|
|
1571
|
+
const TOP_LEVEL_COMMANDS = [
|
|
1572
|
+
'state',
|
|
1573
|
+
'resolve-model',
|
|
1574
|
+
'find-phase',
|
|
1575
|
+
'commit',
|
|
1576
|
+
'verify-summary',
|
|
1577
|
+
'template',
|
|
1578
|
+
'frontmatter',
|
|
1579
|
+
'verify',
|
|
1580
|
+
'generate-slug',
|
|
1581
|
+
'current-timestamp',
|
|
1582
|
+
'list-todos',
|
|
1583
|
+
'verify-path-exists',
|
|
1584
|
+
'config-ensure-section',
|
|
1585
|
+
'config-set',
|
|
1586
|
+
'history-digest',
|
|
1587
|
+
'phases',
|
|
1588
|
+
'roadmap',
|
|
1589
|
+
'phase',
|
|
1590
|
+
'milestone',
|
|
1591
|
+
'version',
|
|
1592
|
+
'validate',
|
|
1593
|
+
'progress',
|
|
1594
|
+
'todo',
|
|
1595
|
+
'scaffold',
|
|
1596
|
+
'migrate-dirs',
|
|
1597
|
+
'init',
|
|
1598
|
+
'phase-plan-index',
|
|
1599
|
+
'state-snapshot',
|
|
1600
|
+
'summary-extract',
|
|
1601
|
+
'tracker',
|
|
1602
|
+
'dashboard',
|
|
1603
|
+
'phase-detail',
|
|
1604
|
+
'health',
|
|
1605
|
+
'detect-backend',
|
|
1606
|
+
'long-term-roadmap',
|
|
1607
|
+
'quality-analysis',
|
|
1608
|
+
'setup',
|
|
1609
|
+
'search',
|
|
1610
|
+
'requirement',
|
|
1611
|
+
'worktree',
|
|
1612
|
+
'settings',
|
|
1613
|
+
'evolve',
|
|
1614
|
+
'autopilot',
|
|
1615
|
+
'multi-milestone-autopilot',
|
|
1616
|
+
'autoplan',
|
|
1617
|
+
'worktree-hook-create',
|
|
1618
|
+
'worktree-hook-remove',
|
|
1619
|
+
'teammate-idle-hook',
|
|
1620
|
+
'task-completed-hook',
|
|
1621
|
+
'instructions-loaded-hook',
|
|
1622
|
+
'stop-failure-hook',
|
|
1623
|
+
'post-compact-hook',
|
|
1624
|
+
'coverage-report',
|
|
1625
|
+
'health-check',
|
|
1626
|
+
'markdown-split',
|
|
1627
|
+
'parallel-progress',
|
|
1628
|
+
'overstory',
|
|
1629
|
+
'metrics',
|
|
1630
|
+
'diagnose',
|
|
1631
|
+
'export-research',
|
|
1632
|
+
'import-research',
|
|
1633
|
+
'deps',
|
|
1634
|
+
'todos',
|
|
1635
|
+
'knowhow',
|
|
1636
|
+
'budget',
|
|
1637
|
+
'blame',
|
|
1638
|
+
'freshness',
|
|
1639
|
+
'rollback',
|
|
1640
|
+
'estimate',
|
|
1641
|
+
'estimate-phase',
|
|
1642
|
+
'impact',
|
|
1643
|
+
'check-assumptions',
|
|
1644
|
+
'execute-phase',
|
|
1645
|
+
'phase-risk',
|
|
1646
|
+
'citation-backlinks',
|
|
1647
|
+
'eval-regression-check',
|
|
1648
|
+
'phase-time-budget',
|
|
1649
|
+
'config-diff',
|
|
1650
|
+
'phase-readiness',
|
|
1651
|
+
'milestone-health',
|
|
1652
|
+
'decision-timeline',
|
|
1653
|
+
'import-knowledge',
|
|
1654
|
+
'todo-duplicates',
|
|
1655
|
+
'citation-graph',
|
|
1656
|
+
'artifact-dag',
|
|
1657
|
+
'benchmark-report',
|
|
1658
|
+
'forecast-phase',
|
|
1659
|
+
'tail',
|
|
1660
|
+
'eval',
|
|
1661
|
+
'check-plans',
|
|
1662
|
+
'knowledge',
|
|
1663
|
+
'autoresearch',
|
|
1664
|
+
'wireup',
|
|
1665
|
+
'watch',
|
|
1666
|
+
'research-gaps',
|
|
1667
|
+
'deps-risk',
|
|
1668
|
+
'import-knowhow',
|
|
1669
|
+
];
|
|
1670
|
+
const suggestion = findClosestCommand(command, TOP_LEVEL_COMMANDS);
|
|
1671
|
+
const hint = suggestion ? ` Did you mean "${suggestion}"?` : '';
|
|
1672
|
+
error(`Unknown command: "${command}".${hint}`);
|
|
1673
|
+
}
|
|
1674
|
+
}
|
|
1675
|
+
}
|
|
1676
|
+
main().catch((err) => {
|
|
1677
|
+
process.stderr.write(`[grd] fatal error: ${err.message}\n`);
|
|
1678
|
+
process.exit(1);
|
|
1679
|
+
});
|
|
1680
|
+
//# sourceMappingURL=grd-tools.js.map
|