@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,349 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const { output, loadConfig, findPhaseInternal, getMilestoneInfo, } = require('./utils');
|
|
4
|
+
const { detectBackend, getBackendCapabilities, } = require('./backend');
|
|
5
|
+
const { worktreePath, } = require('./worktree');
|
|
6
|
+
const { buildDependencyGraph, } = require('./deps');
|
|
7
|
+
const { analyzeRoadmap, } = require('./roadmap');
|
|
8
|
+
const { runPreflightGates, } = require('./gates');
|
|
9
|
+
// ─── validateIndependentPhases ──────────────────────────────────────────────
|
|
10
|
+
/**
|
|
11
|
+
* Validate that requested phases have no direct dependency edges between them.
|
|
12
|
+
*
|
|
13
|
+
* Only checks DIRECT edges (not transitive paths). This is correct because the
|
|
14
|
+
* command template already receives parallel_groups from deps analysis for ordering.
|
|
15
|
+
* The validation here prevents the user from requesting two phases where one
|
|
16
|
+
* directly depends on the other.
|
|
17
|
+
* @param graph - Dependency graph containing all phase edges
|
|
18
|
+
* @param requestedPhases - Array of phase number strings to validate
|
|
19
|
+
* @returns Validation result indicating whether phases are independent, with any conflict pairs
|
|
20
|
+
*/
|
|
21
|
+
function validateIndependentPhases(graph, requestedPhases) {
|
|
22
|
+
if (requestedPhases.length <= 1) {
|
|
23
|
+
return { valid: true, phases: requestedPhases };
|
|
24
|
+
}
|
|
25
|
+
const requestedSet = new Set(requestedPhases);
|
|
26
|
+
const conflicts = [];
|
|
27
|
+
for (const edge of graph.edges) {
|
|
28
|
+
if (requestedSet.has(edge.from) && requestedSet.has(edge.to)) {
|
|
29
|
+
conflicts.push({ from: edge.from, to: edge.to });
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
if (conflicts.length > 0) {
|
|
33
|
+
return { valid: false, conflicts, phases: requestedPhases };
|
|
34
|
+
}
|
|
35
|
+
return { valid: true, phases: requestedPhases };
|
|
36
|
+
}
|
|
37
|
+
// ─── buildParallelContext ───────────────────────────────────────────────────
|
|
38
|
+
/**
|
|
39
|
+
* Build structured JSON context for parallel execution of multiple phases.
|
|
40
|
+
*
|
|
41
|
+
* Loads config, detects backend capabilities, resolves per-phase info (directory,
|
|
42
|
+
* plans, worktree paths), and selects parallel vs sequential mode. Returns a
|
|
43
|
+
* context object consumed by the execute-phase command template.
|
|
44
|
+
* @param cwd - Absolute path to the working directory (project root)
|
|
45
|
+
* @param phaseNumbers - Array of phase number strings to build context for
|
|
46
|
+
* @param options - Optional configuration for native worktree availability
|
|
47
|
+
* @returns Full parallel execution context, or an error object if a phase is not found
|
|
48
|
+
*/
|
|
49
|
+
function buildParallelContext(cwd, phaseNumbers, options) {
|
|
50
|
+
const { nativeWorktreeAvailable = false } = options || {};
|
|
51
|
+
const config = loadConfig(cwd);
|
|
52
|
+
const backend = detectBackend(cwd);
|
|
53
|
+
const capabilities = getBackendCapabilities(backend);
|
|
54
|
+
const milestone = getMilestoneInfo(cwd);
|
|
55
|
+
// Determine mode: parallel only if backend supports teams AND config allows it
|
|
56
|
+
const mode = capabilities.teams === true && config.use_teams !== false ? 'parallel' : 'sequential';
|
|
57
|
+
// Build fallback note for sequential mode
|
|
58
|
+
const fallback_note = mode === 'sequential'
|
|
59
|
+
? 'Parallel execution available on Claude Code backend with teams enabled'
|
|
60
|
+
: null;
|
|
61
|
+
// Build per-phase context objects
|
|
62
|
+
const phaseContexts = [];
|
|
63
|
+
for (const phaseNum of phaseNumbers) {
|
|
64
|
+
const phaseInfo = findPhaseInternal(cwd, phaseNum);
|
|
65
|
+
if (!phaseInfo) {
|
|
66
|
+
return { error: `Phase ${phaseNum} not found` };
|
|
67
|
+
}
|
|
68
|
+
const template = config.phase_branch_template || 'grd/{milestone}/{phase}-{slug}';
|
|
69
|
+
const worktree_branch = template
|
|
70
|
+
.replace('{milestone}', milestone.version)
|
|
71
|
+
.replace('{phase}', phaseInfo.phase_number)
|
|
72
|
+
.replace('{slug}', phaseInfo.phase_slug || 'phase');
|
|
73
|
+
// When native isolation is available, skip worktree_path pre-computation
|
|
74
|
+
// Claude Code creates worktrees natively via its isolation: worktree mechanism
|
|
75
|
+
const wt_path = nativeWorktreeAvailable
|
|
76
|
+
? null
|
|
77
|
+
: worktreePath(cwd, milestone.version, phaseInfo.phase_number);
|
|
78
|
+
phaseContexts.push({
|
|
79
|
+
phase_number: phaseInfo.phase_number,
|
|
80
|
+
phase_name: phaseInfo.phase_name,
|
|
81
|
+
phase_slug: phaseInfo.phase_slug,
|
|
82
|
+
phase_dir: phaseInfo.directory,
|
|
83
|
+
worktree_path: wt_path,
|
|
84
|
+
worktree_branch,
|
|
85
|
+
native_isolation: nativeWorktreeAvailable,
|
|
86
|
+
plans: phaseInfo.plans,
|
|
87
|
+
incomplete_plans: phaseInfo.incomplete_plans,
|
|
88
|
+
plan_count: phaseInfo.plans ? phaseInfo.plans.length : 0,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
// Build status tracker with per-phase pending state
|
|
92
|
+
const status_tracker = { phases: {} };
|
|
93
|
+
for (const ctx of phaseContexts) {
|
|
94
|
+
status_tracker.phases[ctx.phase_number] = { status: 'pending' };
|
|
95
|
+
}
|
|
96
|
+
return {
|
|
97
|
+
mode,
|
|
98
|
+
fallback_note,
|
|
99
|
+
backend,
|
|
100
|
+
backend_capabilities: capabilities,
|
|
101
|
+
use_teams: config.use_teams,
|
|
102
|
+
team_timeout_minutes: config.team_timeout_minutes,
|
|
103
|
+
max_concurrent_teammates: config.max_concurrent_teammates,
|
|
104
|
+
milestone_version: milestone.version,
|
|
105
|
+
milestone_name: milestone.name,
|
|
106
|
+
phases: phaseContexts,
|
|
107
|
+
phase_count: phaseNumbers.length,
|
|
108
|
+
status_tracker,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Assign plans to execution waves using a combined dependency model.
|
|
113
|
+
*
|
|
114
|
+
* Merges two dependency mechanisms into a single constraint set per plan:
|
|
115
|
+
* 1. Explicit `depends_on` field in PLAN.md frontmatter (coarse phase-level gates).
|
|
116
|
+
* 2. Fine-grained artifact DAG: for each plan's `requires` entries, look up the
|
|
117
|
+
* provider plan in `artifactDAG.providers` and treat it as a hard dependency.
|
|
118
|
+
*
|
|
119
|
+
* Kahn's level-based topological sort assigns each plan to the earliest wave where
|
|
120
|
+
* all its dependencies have been satisfied. Plans without `provides`/`requires`
|
|
121
|
+
* fields (empty arrays) are backward compatible — they only respect `depends_on`.
|
|
122
|
+
*
|
|
123
|
+
* If a cycle is detected (remaining plans with unresolvable dependencies), all
|
|
124
|
+
* remaining plans are placed in the last wave and a warning is written to stderr.
|
|
125
|
+
*
|
|
126
|
+
* @param plans - Plan artifacts parsed from PLAN.md frontmatter
|
|
127
|
+
* @param options - Optional config including a pre-built ArtifactDAG
|
|
128
|
+
* @returns Array of WaveAssignment objects sorted by wave number
|
|
129
|
+
*/
|
|
130
|
+
function buildWaves(plans, options) {
|
|
131
|
+
if (plans.length === 0) {
|
|
132
|
+
return [];
|
|
133
|
+
}
|
|
134
|
+
const artifactDAG = options?.artifactDAG;
|
|
135
|
+
// Build plan ID for each plan using the same format as buildArtifactDAG
|
|
136
|
+
const planIdOf = (p) => `${p.phase}-${String(p.plan).padStart(2, '0')}`;
|
|
137
|
+
// Build a set of all valid plan IDs for membership checks
|
|
138
|
+
const planIds = new Set(plans.map(planIdOf));
|
|
139
|
+
// Build combined dependency set for each plan
|
|
140
|
+
// combined deps: Set<planId> that must be completed before this plan
|
|
141
|
+
const combinedDeps = new Map();
|
|
142
|
+
for (const plan of plans) {
|
|
143
|
+
const id = planIdOf(plan);
|
|
144
|
+
const deps = new Set();
|
|
145
|
+
// 1. Explicit depends_on: these are plan IDs like "94-01" directly
|
|
146
|
+
for (const dep of plan.depends_on) {
|
|
147
|
+
if (planIds.has(dep)) {
|
|
148
|
+
deps.add(dep);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
// 2. Artifact DAG requires: look up each required artifact's provider plan
|
|
152
|
+
if (artifactDAG !== undefined) {
|
|
153
|
+
for (const artifact of plan.requires) {
|
|
154
|
+
const providerPlanId = artifactDAG.providers[artifact];
|
|
155
|
+
if (providerPlanId !== undefined && providerPlanId !== id && planIds.has(providerPlanId)) {
|
|
156
|
+
deps.add(providerPlanId);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
combinedDeps.set(id, deps);
|
|
161
|
+
}
|
|
162
|
+
// Build in-degree and adjacency for Kahn's algorithm
|
|
163
|
+
// Edge: dependency → dependent (dep must run before dependent)
|
|
164
|
+
const adjacency = new Map(); // dep → [dependents]
|
|
165
|
+
const inDegree = new Map();
|
|
166
|
+
for (const id of planIds) {
|
|
167
|
+
adjacency.set(id, []);
|
|
168
|
+
inDegree.set(id, 0);
|
|
169
|
+
}
|
|
170
|
+
for (const [id, deps] of combinedDeps) {
|
|
171
|
+
for (const dep of deps) {
|
|
172
|
+
adjacency.get(dep).push(id);
|
|
173
|
+
inDegree.set(id, inDegree.get(id) + 1);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
// Level-based Kahn's — each iteration yields one wave
|
|
177
|
+
const waves = [];
|
|
178
|
+
const remaining = new Set(planIds);
|
|
179
|
+
let waveNumber = 1;
|
|
180
|
+
while (remaining.size > 0) {
|
|
181
|
+
const batch = [];
|
|
182
|
+
for (const id of remaining) {
|
|
183
|
+
if (inDegree.get(id) === 0) {
|
|
184
|
+
batch.push(id);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
if (batch.length === 0) {
|
|
188
|
+
// Cycle detected — place all remaining plans in the last wave and warn
|
|
189
|
+
process.stderr.write(`[buildWaves] Warning: cycle detected among plans [${Array.from(remaining).join(', ')}]; placing all in wave ${waveNumber}\n`);
|
|
190
|
+
batch.push(...Array.from(remaining));
|
|
191
|
+
batch.sort();
|
|
192
|
+
waves.push({ wave: waveNumber, plans: batch });
|
|
193
|
+
break;
|
|
194
|
+
}
|
|
195
|
+
// Sort lexicographically for deterministic output
|
|
196
|
+
batch.sort();
|
|
197
|
+
waves.push({ wave: waveNumber, plans: batch });
|
|
198
|
+
// Decrement in-degree for dependents and remove from remaining
|
|
199
|
+
for (const id of batch) {
|
|
200
|
+
remaining.delete(id);
|
|
201
|
+
for (const dependent of adjacency.get(id)) {
|
|
202
|
+
if (remaining.has(dependent)) {
|
|
203
|
+
inDegree.set(dependent, inDegree.get(dependent) - 1);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
waveNumber++;
|
|
208
|
+
}
|
|
209
|
+
return waves;
|
|
210
|
+
}
|
|
211
|
+
// ─── cmdInitExecuteParallel ─────────────────────────────────────────────────
|
|
212
|
+
/**
|
|
213
|
+
* CLI command: Validate phase independence and build parallel execution context.
|
|
214
|
+
*
|
|
215
|
+
* Follows the established cmdInit* pattern: validates inputs, runs preflight gates,
|
|
216
|
+
* checks roadmap for requested phases, validates independence via dependency graph,
|
|
217
|
+
* builds context, and outputs structured JSON.
|
|
218
|
+
* @param cwd - Absolute path to the working directory (project root)
|
|
219
|
+
* @param phaseNumbers - Array of phase number strings requested for parallel execution
|
|
220
|
+
* @param _includes - Unused set of include filters (reserved for future use)
|
|
221
|
+
* @param raw - Whether to output plain text instead of JSON
|
|
222
|
+
* @returns void (outputs JSON or error to stdout)
|
|
223
|
+
*/
|
|
224
|
+
function cmdInitExecuteParallel(cwd, phaseNumbers, _includes, raw) {
|
|
225
|
+
// Validate at least one phase requested
|
|
226
|
+
if (!phaseNumbers || phaseNumbers.length === 0) {
|
|
227
|
+
output({ error: 'At least one phase number is required' }, raw);
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
230
|
+
// Run preflight gates (reuse execute-phase gates with first phase)
|
|
231
|
+
const gates = runPreflightGates(cwd, 'execute-phase', {
|
|
232
|
+
phase: phaseNumbers[0],
|
|
233
|
+
});
|
|
234
|
+
if (!gates.passed) {
|
|
235
|
+
output({ gate_failed: true, gate_errors: gates.errors, gate_warnings: gates.warnings }, raw);
|
|
236
|
+
return;
|
|
237
|
+
}
|
|
238
|
+
// Analyze roadmap to get all phases
|
|
239
|
+
const roadmapResult = analyzeRoadmap(cwd);
|
|
240
|
+
if (roadmapResult.error || !roadmapResult.phases || roadmapResult.phases.length === 0) {
|
|
241
|
+
output({ error: roadmapResult.error || 'ROADMAP.md not found or empty' }, raw);
|
|
242
|
+
return;
|
|
243
|
+
}
|
|
244
|
+
// Verify all requested phases exist in roadmap
|
|
245
|
+
const roadmapPhaseNumbers = new Set(roadmapResult.phases.map((p) => p.number));
|
|
246
|
+
const missing = phaseNumbers.filter((pn) => !roadmapPhaseNumbers.has(pn));
|
|
247
|
+
if (missing.length > 0) {
|
|
248
|
+
output({ error: `Phase(s) not found in roadmap: ${missing.join(', ')}` }, raw);
|
|
249
|
+
return;
|
|
250
|
+
}
|
|
251
|
+
// Build dependency graph and validate independence
|
|
252
|
+
const graph = buildDependencyGraph(roadmapResult.phases);
|
|
253
|
+
const validation = validateIndependentPhases(graph, phaseNumbers);
|
|
254
|
+
if (!validation.valid) {
|
|
255
|
+
const conflictStr = validation
|
|
256
|
+
.conflicts.map((c) => `Phase ${c.from} -> Phase ${c.to}`)
|
|
257
|
+
.join(', ');
|
|
258
|
+
output({
|
|
259
|
+
error: `Phases are not independent: ${conflictStr}`,
|
|
260
|
+
conflicts: validation.conflicts,
|
|
261
|
+
}, raw);
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
// Build parallel context with native isolation awareness
|
|
265
|
+
const backend = detectBackend(cwd);
|
|
266
|
+
const capabilities = getBackendCapabilities(backend);
|
|
267
|
+
const context = buildParallelContext(cwd, phaseNumbers, {
|
|
268
|
+
nativeWorktreeAvailable: capabilities.native_worktree_isolation,
|
|
269
|
+
});
|
|
270
|
+
if (context.error) {
|
|
271
|
+
output(context, raw, `Error: ${context.error}`);
|
|
272
|
+
return;
|
|
273
|
+
}
|
|
274
|
+
// Add independence validation flag
|
|
275
|
+
context.independence_validated = true;
|
|
276
|
+
// Include gate warnings if any
|
|
277
|
+
if (gates.warnings && gates.warnings.length > 0) {
|
|
278
|
+
context.gate_warnings = gates.warnings;
|
|
279
|
+
}
|
|
280
|
+
output(context, raw, `Backend: ${context.backend}, ${context.phase_count} phases, mode: ${context.mode}`);
|
|
281
|
+
}
|
|
282
|
+
// ─── formatProgressBar ──────────────────────────────────────────────────────
|
|
283
|
+
/**
|
|
284
|
+
* Format a progress bar string like `[####______] 40%`
|
|
285
|
+
*/
|
|
286
|
+
function formatProgressBar(current, total, width) {
|
|
287
|
+
const barWidth = width || 20;
|
|
288
|
+
const pct = total === 0 ? 0 : Math.min(1, current / total);
|
|
289
|
+
const filled = Math.round(pct * barWidth);
|
|
290
|
+
const empty = barWidth - filled;
|
|
291
|
+
const bar = '#'.repeat(filled) + '_'.repeat(empty);
|
|
292
|
+
const pctLabel = Math.round(pct * 100) + '%';
|
|
293
|
+
return `[${bar}] ${pctLabel}`;
|
|
294
|
+
}
|
|
295
|
+
// ─── streamPhaseProgress ────────────────────────────────────────────────────
|
|
296
|
+
/**
|
|
297
|
+
* Write formatted phase progress to stderr.
|
|
298
|
+
*/
|
|
299
|
+
function streamPhaseProgress(phaseNum, current, total, status) {
|
|
300
|
+
const padded = String(phaseNum).padStart(2, '0');
|
|
301
|
+
const bar = formatProgressBar(current, total);
|
|
302
|
+
const statusPart = status ? ` [${status}]` : '';
|
|
303
|
+
const line = `Phase ${padded}: ${current} of ${total} ${bar}${statusPart}\n`;
|
|
304
|
+
process.stderr.write(line);
|
|
305
|
+
}
|
|
306
|
+
// ─── cmdParallelProgress ────────────────────────────────────────────────────
|
|
307
|
+
/**
|
|
308
|
+
* CLI command for progress updates during parallel execution.
|
|
309
|
+
* Accepts --phase, --plan, --total-plans, --status args.
|
|
310
|
+
*/
|
|
311
|
+
function cmdParallelProgress(args, raw) {
|
|
312
|
+
// Parse args
|
|
313
|
+
let phase = null;
|
|
314
|
+
let plan = null;
|
|
315
|
+
let totalPlans = null;
|
|
316
|
+
let status = null;
|
|
317
|
+
for (let i = 0; i < args.length; i++) {
|
|
318
|
+
if (args[i] === '--phase' && args[i + 1])
|
|
319
|
+
phase = args[++i];
|
|
320
|
+
else if (args[i] === '--plan' && args[i + 1])
|
|
321
|
+
plan = parseInt(args[++i], 10);
|
|
322
|
+
else if (args[i] === '--total-plans' && args[i + 1])
|
|
323
|
+
totalPlans = parseInt(args[++i], 10);
|
|
324
|
+
else if (args[i] === '--status' && args[i + 1])
|
|
325
|
+
status = args[++i];
|
|
326
|
+
}
|
|
327
|
+
if (phase === null || plan === null || totalPlans === null) {
|
|
328
|
+
output({ error: 'Usage: parallel-progress --phase N --plan M --total-plans T [--status label]' }, raw);
|
|
329
|
+
return;
|
|
330
|
+
}
|
|
331
|
+
const bar = formatProgressBar(plan, totalPlans);
|
|
332
|
+
if (raw) {
|
|
333
|
+
output({ phase, plan, total_plans: totalPlans, bar, status }, raw);
|
|
334
|
+
}
|
|
335
|
+
else {
|
|
336
|
+
streamPhaseProgress(phase, plan, totalPlans, status || undefined);
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
// ─── Exports ──────────────────────────────────────────────────────────────────
|
|
340
|
+
module.exports = {
|
|
341
|
+
validateIndependentPhases,
|
|
342
|
+
buildParallelContext,
|
|
343
|
+
buildWaves,
|
|
344
|
+
cmdInitExecuteParallel,
|
|
345
|
+
formatProgressBar,
|
|
346
|
+
streamPhaseProgress,
|
|
347
|
+
cmdParallelProgress,
|
|
348
|
+
};
|
|
349
|
+
//# sourceMappingURL=parallel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parallel.js","sourceRoot":"","sources":["../../lib/parallel.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../lib/paths.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const fs = require('fs');
|
|
4
|
+
const path = require('path');
|
|
5
|
+
// ─── Milestone Detection ────────────────────────────────────────────────────
|
|
6
|
+
/**
|
|
7
|
+
* Read the current milestone version from STATE.md.
|
|
8
|
+
*
|
|
9
|
+
* Reads the **Milestone:** field from .planning/STATE.md and extracts
|
|
10
|
+
* the version string (e.g., 'v0.2.1'). Returns 'anonymous' when
|
|
11
|
+
* STATE.md is missing, unreadable, has no Milestone field, or the
|
|
12
|
+
* field value contains no version string.
|
|
13
|
+
* @param cwd - Absolute path to the working directory (project root)
|
|
14
|
+
* @returns Current milestone version string (e.g., 'v0.2.1'), or 'anonymous' if not found
|
|
15
|
+
*/
|
|
16
|
+
function currentMilestone(cwd) {
|
|
17
|
+
const statePath = path.join(cwd, '.planning', 'STATE.md');
|
|
18
|
+
let content;
|
|
19
|
+
try {
|
|
20
|
+
content = fs.readFileSync(statePath, 'utf-8');
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return inferMilestoneFromDisk(cwd);
|
|
24
|
+
}
|
|
25
|
+
// Extract the **Milestone:** field value
|
|
26
|
+
const fieldMatch = content.match(/\*\*Milestone:\*\*\s*(.+)/i);
|
|
27
|
+
if (!fieldMatch)
|
|
28
|
+
return inferMilestoneFromDisk(cwd);
|
|
29
|
+
const fieldValue = fieldMatch[1].trim();
|
|
30
|
+
if (!fieldValue)
|
|
31
|
+
return inferMilestoneFromDisk(cwd);
|
|
32
|
+
// Extract just the version string (vX.Y or vX.Y.Z etc.)
|
|
33
|
+
const versionMatch = fieldValue.match(/(v[\d.]+)/);
|
|
34
|
+
if (!versionMatch)
|
|
35
|
+
return inferMilestoneFromDisk(cwd);
|
|
36
|
+
return versionMatch[1];
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Fallback: infer milestone from ROADMAP.md and .planning/milestones/ directory.
|
|
40
|
+
*
|
|
41
|
+
* Mirrors the 4-strategy approach from getMilestoneInfo() in utils.js
|
|
42
|
+
* (duplicated here to avoid circular dependency: utils.js imports paths.js).
|
|
43
|
+
* Falls back to scanning milestones/ directory if ROADMAP.md parsing fails.
|
|
44
|
+
*/
|
|
45
|
+
function inferMilestoneFromDisk(cwd) {
|
|
46
|
+
// Collect active milestone directories on disk
|
|
47
|
+
const msDir = path.join(cwd, '.planning', 'milestones');
|
|
48
|
+
let activeDirs = [];
|
|
49
|
+
try {
|
|
50
|
+
const entries = fs.readdirSync(msDir, { withFileTypes: true });
|
|
51
|
+
activeDirs = entries
|
|
52
|
+
.filter((e) => e.isDirectory() && !e.name.endsWith('-phases') && e.name !== 'anonymous')
|
|
53
|
+
.map((e) => e.name);
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
// milestones dir doesn't exist
|
|
57
|
+
}
|
|
58
|
+
// If exactly one active milestone dir, use it directly
|
|
59
|
+
if (activeDirs.length === 1)
|
|
60
|
+
return activeDirs[0];
|
|
61
|
+
// If multiple dirs exist, disambiguate via ROADMAP.md
|
|
62
|
+
if (activeDirs.length > 1) {
|
|
63
|
+
const fromRoadmap = parseRoadmapMilestone(cwd);
|
|
64
|
+
if (fromRoadmap && activeDirs.includes(fromRoadmap))
|
|
65
|
+
return fromRoadmap;
|
|
66
|
+
}
|
|
67
|
+
return 'anonymous';
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Parse ROADMAP.md for the active milestone version string.
|
|
71
|
+
* Mirrors strategies 1-3 from getMilestoneInfo() in utils.js.
|
|
72
|
+
* (Duplicated here to avoid circular dependency: utils.js imports paths.js.)
|
|
73
|
+
*/
|
|
74
|
+
function parseRoadmapMilestone(cwd) {
|
|
75
|
+
try {
|
|
76
|
+
const raw = fs.readFileSync(path.join(cwd, '.planning', 'ROADMAP.md'), 'utf-8');
|
|
77
|
+
const roadmap = raw.replace(/<details>[\s\S]*?<\/details>/gi, '');
|
|
78
|
+
// Strategy 1: "(in progress)" milestone bullet
|
|
79
|
+
const inProgress = roadmap.match(/-\s+(v[\d.]+)\s+[^\n(]+?\s*\(in progress\)/im);
|
|
80
|
+
if (inProgress)
|
|
81
|
+
return inProgress[1];
|
|
82
|
+
// Strategy 2: Last non-shipped milestone bullet
|
|
83
|
+
const bulletRegex = /-\s+(v[\d.]+)\s+[^\n(]+?(?:\s*\(([^)]*)\))?\s*$/gim;
|
|
84
|
+
let lastNonShipped = null;
|
|
85
|
+
let m;
|
|
86
|
+
while ((m = bulletRegex.exec(roadmap)) !== null) {
|
|
87
|
+
if (!/shipped/i.test(m[2] || ''))
|
|
88
|
+
lastNonShipped = m[1];
|
|
89
|
+
}
|
|
90
|
+
if (lastNonShipped)
|
|
91
|
+
return lastNonShipped;
|
|
92
|
+
// Strategy 3: Heading format "## vX.Y.Z: Name"
|
|
93
|
+
const headingMatch = roadmap.match(/^##\s+(?!#).*?(v\d+\.\d+(?:\.\d+)?)\s*[:\s]+([^\n(]+)/m);
|
|
94
|
+
if (headingMatch)
|
|
95
|
+
return headingMatch[1];
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
// ROADMAP.md doesn't exist
|
|
99
|
+
}
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
// ─── Internal Helper ────────────────────────────────────────────────────────
|
|
103
|
+
/**
|
|
104
|
+
* Return the milestone root directory path.
|
|
105
|
+
*/
|
|
106
|
+
function milestoneRoot(cwd, milestone) {
|
|
107
|
+
return path.join(cwd, '.planning', 'milestones', milestone);
|
|
108
|
+
}
|
|
109
|
+
// ─── Directory Path Functions ───────────────────────────────────────────────
|
|
110
|
+
/**
|
|
111
|
+
* Root milestones container directory.
|
|
112
|
+
*/
|
|
113
|
+
function milestonesDir(cwd) {
|
|
114
|
+
return path.join(cwd, '.planning', 'milestones');
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Milestone-scoped phases directory.
|
|
118
|
+
*
|
|
119
|
+
* Always returns the milestone-scoped path (.planning/milestones/{milestone}/phases/).
|
|
120
|
+
* Callers should use fs.mkdirSync({ recursive: true }) to ensure the directory exists.
|
|
121
|
+
* @param cwd - Absolute path to the working directory (project root)
|
|
122
|
+
* @param milestone - Milestone version string (e.g., 'v0.2.1'); defaults to current milestone if omitted
|
|
123
|
+
* @returns Absolute path to the milestone-scoped phases directory
|
|
124
|
+
*/
|
|
125
|
+
function phasesDir(cwd, milestone) {
|
|
126
|
+
if (milestone == null) {
|
|
127
|
+
milestone = currentMilestone(cwd);
|
|
128
|
+
}
|
|
129
|
+
const milestonesBase = path.join(cwd, '.planning', 'milestones');
|
|
130
|
+
const resolved = path.join(milestoneRoot(cwd, milestone), 'phases');
|
|
131
|
+
if (!resolved.startsWith(milestonesBase + path.sep) && resolved !== milestonesBase) {
|
|
132
|
+
throw new Error(`Invalid milestone: path would escape .planning directory`);
|
|
133
|
+
}
|
|
134
|
+
return resolved;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Specific phase subdirectory within a milestone.
|
|
138
|
+
*
|
|
139
|
+
* Uses phasesDir() for the base path, inheriting its backward-compatible fallback.
|
|
140
|
+
*/
|
|
141
|
+
function phaseDir(cwd, milestone, phaseDirName) {
|
|
142
|
+
const base = phasesDir(cwd, milestone);
|
|
143
|
+
const resolved = path.join(base, phaseDirName);
|
|
144
|
+
if (!resolved.startsWith(base + path.sep) && resolved !== base) {
|
|
145
|
+
throw new Error(`Invalid phase directory: path would escape phases directory`);
|
|
146
|
+
}
|
|
147
|
+
return resolved;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Milestone-scoped research directory.
|
|
151
|
+
*/
|
|
152
|
+
function researchDir(cwd, milestone) {
|
|
153
|
+
if (milestone == null) {
|
|
154
|
+
milestone = currentMilestone(cwd);
|
|
155
|
+
}
|
|
156
|
+
return path.join(milestoneRoot(cwd, milestone), 'research');
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Project-level codebase analysis directory.
|
|
160
|
+
*
|
|
161
|
+
* Always returns .planning/codebase/ -- codebase maps are project-wide,
|
|
162
|
+
* not scoped to a specific milestone.
|
|
163
|
+
* @param cwd - Absolute path to the working directory (project root)
|
|
164
|
+
* @returns Absolute path to the .planning/codebase/ directory
|
|
165
|
+
*/
|
|
166
|
+
function codebaseDir(cwd) {
|
|
167
|
+
return path.join(cwd, '.planning', 'codebase');
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Milestone-scoped todos directory.
|
|
171
|
+
*/
|
|
172
|
+
function todosDir(cwd, milestone) {
|
|
173
|
+
if (milestone == null) {
|
|
174
|
+
milestone = currentMilestone(cwd);
|
|
175
|
+
}
|
|
176
|
+
return path.join(milestoneRoot(cwd, milestone), 'todos');
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Milestone-scoped discussions directory.
|
|
180
|
+
* Created at runtime by runDiscussion() via mkdirSync({ recursive: true }).
|
|
181
|
+
*/
|
|
182
|
+
function discussionsDir(cwd, milestone) {
|
|
183
|
+
if (milestone == null) {
|
|
184
|
+
milestone = currentMilestone(cwd);
|
|
185
|
+
}
|
|
186
|
+
const milestonesBase = path.join(cwd, '.planning', 'milestones');
|
|
187
|
+
const resolved = path.join(milestoneRoot(cwd, milestone), 'discussions');
|
|
188
|
+
if (!resolved.startsWith(milestonesBase + path.sep) && resolved !== milestonesBase) {
|
|
189
|
+
throw new Error('Invalid milestone: path would escape .planning directory');
|
|
190
|
+
}
|
|
191
|
+
return resolved;
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Milestone-scoped quick tasks directory.
|
|
195
|
+
*/
|
|
196
|
+
function quickDir(cwd, milestone) {
|
|
197
|
+
if (milestone == null) {
|
|
198
|
+
milestone = currentMilestone(cwd);
|
|
199
|
+
}
|
|
200
|
+
return path.join(milestoneRoot(cwd, milestone), 'quick');
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Archived phases directory for a completed milestone.
|
|
204
|
+
*
|
|
205
|
+
* Matches the existing archive layout where completed milestone phases
|
|
206
|
+
* are stored as {version}-phases/ directories.
|
|
207
|
+
* @param cwd - Absolute path to the working directory (project root)
|
|
208
|
+
* @param version - Milestone version string used to form the archive directory name (e.g., 'v0.2.1')
|
|
209
|
+
* @returns Absolute path to the archived phases directory (e.g., .planning/milestones/v0.2.1-phases/)
|
|
210
|
+
*/
|
|
211
|
+
function archivedPhasesDir(cwd, version) {
|
|
212
|
+
const milestonesBase = path.join(cwd, '.planning', 'milestones');
|
|
213
|
+
const resolved = path.join(milestonesBase, version + '-phases');
|
|
214
|
+
if (!resolved.startsWith(milestonesBase + path.sep) && resolved !== milestonesBase) {
|
|
215
|
+
throw new Error(`Invalid version: path would escape .planning directory`);
|
|
216
|
+
}
|
|
217
|
+
return resolved;
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Milestone-scoped standards directory.
|
|
221
|
+
*/
|
|
222
|
+
function standardsDir(cwd, milestone) {
|
|
223
|
+
if (milestone == null) {
|
|
224
|
+
milestone = currentMilestone(cwd);
|
|
225
|
+
}
|
|
226
|
+
return path.join(milestoneRoot(cwd, milestone), 'standards');
|
|
227
|
+
}
|
|
228
|
+
// ─── Exports ────────────────────────────────────────────────────────────────
|
|
229
|
+
/**
|
|
230
|
+
* Root .planning directory path.
|
|
231
|
+
*
|
|
232
|
+
* Single source of truth for the .planning/ directory location.
|
|
233
|
+
* Use this instead of hardcoding path.join(cwd, '.planning', ...) constructions.
|
|
234
|
+
* @param cwd - Absolute path to the working directory (project root)
|
|
235
|
+
* @returns Absolute path to the .planning/ directory
|
|
236
|
+
*/
|
|
237
|
+
function planningDir(cwd) {
|
|
238
|
+
return path.join(cwd, '.planning');
|
|
239
|
+
}
|
|
240
|
+
module.exports = {
|
|
241
|
+
currentMilestone,
|
|
242
|
+
planningDir,
|
|
243
|
+
milestonesDir,
|
|
244
|
+
phasesDir,
|
|
245
|
+
phaseDir,
|
|
246
|
+
researchDir,
|
|
247
|
+
codebaseDir,
|
|
248
|
+
todosDir,
|
|
249
|
+
discussionsDir,
|
|
250
|
+
quickDir,
|
|
251
|
+
standardsDir,
|
|
252
|
+
archivedPhasesDir,
|
|
253
|
+
};
|
|
254
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../lib/paths.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { GateViolation, PhaseCompleteResult } from './types';
|
|
2
|
+
import type { Scheduler } from './scheduler';
|
|
3
|
+
export declare function _verifyFallbackOutput(cwd: string, phaseNum: string): {
|
|
4
|
+
ok: boolean;
|
|
5
|
+
checks: {
|
|
6
|
+
name: string;
|
|
7
|
+
passed: boolean;
|
|
8
|
+
}[];
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Attempts to recover from a mechanical phase-completion failure by
|
|
12
|
+
* asking Claude to perform the ROADMAP.md and STATE.md edits directly.
|
|
13
|
+
* Returns a synthetic PhaseCompleteResult on success, null on any
|
|
14
|
+
* failure or when the scheduler is null.
|
|
15
|
+
*
|
|
16
|
+
* Retries up to `phase_complete_llm_fallback_retries` times (default 0)
|
|
17
|
+
* with exponential backoff: 2^attempt seconds between retries (2s, 4s, …).
|
|
18
|
+
*/
|
|
19
|
+
export declare function attemptLlmFallbackCompletion(cwd: string, phaseNum: string, scheduler: Scheduler | null, failure: Error | {
|
|
20
|
+
gate_errors?: GateViolation[];
|
|
21
|
+
}): Promise<PhaseCompleteResult | null>;
|
|
22
|
+
//# sourceMappingURL=phase-complete-llm.d.ts.map
|