@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
package/lib/parallel.ts
ADDED
|
@@ -0,0 +1,570 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* GRD Parallel Execution -- Multi-phase independence validation, context building, mode selection
|
|
5
|
+
*
|
|
6
|
+
* Provides tooling for validating that requested phases can execute in parallel
|
|
7
|
+
* (no dependency edges between them), building per-phase execution context with
|
|
8
|
+
* worktree paths, and selecting parallel vs sequential mode based on backend capabilities.
|
|
9
|
+
*
|
|
10
|
+
* Depends on: lib/deps.ts (buildDependencyGraph), lib/utils.ts, lib/backend.ts, lib/roadmap.ts
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
import type {
|
|
15
|
+
DependencyGraph,
|
|
16
|
+
BackendCapabilities,
|
|
17
|
+
GrdConfig,
|
|
18
|
+
MilestoneInfo,
|
|
19
|
+
PhaseInfo,
|
|
20
|
+
GateViolation,
|
|
21
|
+
PreflightResult,
|
|
22
|
+
ArtifactDAG,
|
|
23
|
+
PlanArtifact,
|
|
24
|
+
} from './types';
|
|
25
|
+
|
|
26
|
+
const {
|
|
27
|
+
output,
|
|
28
|
+
loadConfig,
|
|
29
|
+
findPhaseInternal,
|
|
30
|
+
getMilestoneInfo,
|
|
31
|
+
}: {
|
|
32
|
+
output: (result: unknown, raw: boolean, rawValue?: unknown) => void;
|
|
33
|
+
loadConfig: (cwd: string) => GrdConfig;
|
|
34
|
+
findPhaseInternal: (cwd: string, phase: string) => PhaseInfo | null;
|
|
35
|
+
getMilestoneInfo: (cwd: string) => MilestoneInfo;
|
|
36
|
+
} = require('./utils');
|
|
37
|
+
const {
|
|
38
|
+
detectBackend,
|
|
39
|
+
getBackendCapabilities,
|
|
40
|
+
}: {
|
|
41
|
+
detectBackend: (cwd: string) => string;
|
|
42
|
+
getBackendCapabilities: (backend: string) => BackendCapabilities;
|
|
43
|
+
} = require('./backend');
|
|
44
|
+
const {
|
|
45
|
+
worktreePath,
|
|
46
|
+
}: {
|
|
47
|
+
worktreePath: (cwd: string, milestone: string, phase: string) => string;
|
|
48
|
+
} = require('./worktree');
|
|
49
|
+
const {
|
|
50
|
+
buildDependencyGraph,
|
|
51
|
+
}: {
|
|
52
|
+
buildDependencyGraph: (
|
|
53
|
+
phases: Array<{ number: string; name: string; depends_on?: string | null }>
|
|
54
|
+
) => DependencyGraph;
|
|
55
|
+
} = require('./deps');
|
|
56
|
+
const {
|
|
57
|
+
analyzeRoadmap,
|
|
58
|
+
}: {
|
|
59
|
+
analyzeRoadmap: (cwd: string) => {
|
|
60
|
+
error?: string;
|
|
61
|
+
phases?: Array<{
|
|
62
|
+
number: string;
|
|
63
|
+
name: string;
|
|
64
|
+
depends_on?: string | null;
|
|
65
|
+
disk_status?: string;
|
|
66
|
+
roadmap_complete?: boolean;
|
|
67
|
+
}>;
|
|
68
|
+
};
|
|
69
|
+
} = require('./roadmap');
|
|
70
|
+
const {
|
|
71
|
+
runPreflightGates,
|
|
72
|
+
}: {
|
|
73
|
+
runPreflightGates: (cwd: string, command: string, options: { phase: string }) => PreflightResult;
|
|
74
|
+
} = require('./gates');
|
|
75
|
+
|
|
76
|
+
// ─── Domain Types ──────────────────────────────────────────────────────────
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Result of validating whether requested phases are independent (no direct edges).
|
|
80
|
+
*/
|
|
81
|
+
interface ValidationResult {
|
|
82
|
+
valid: boolean;
|
|
83
|
+
conflicts?: Array<{ from: string; to: string }>;
|
|
84
|
+
phases: string[];
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Per-phase context in parallel execution with worktree paths and plan info.
|
|
89
|
+
*/
|
|
90
|
+
interface PhaseContext {
|
|
91
|
+
phase_number: string;
|
|
92
|
+
phase_name: string | null;
|
|
93
|
+
phase_slug: string | null;
|
|
94
|
+
phase_dir: string;
|
|
95
|
+
worktree_path: string | null;
|
|
96
|
+
worktree_branch: string;
|
|
97
|
+
native_isolation: boolean;
|
|
98
|
+
plans: string[];
|
|
99
|
+
incomplete_plans: string[];
|
|
100
|
+
plan_count: number;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Full context returned by buildParallelContext consumed by execute-phase command.
|
|
105
|
+
*/
|
|
106
|
+
interface ParallelContext {
|
|
107
|
+
mode: 'parallel' | 'sequential';
|
|
108
|
+
fallback_note: string | null;
|
|
109
|
+
backend: string;
|
|
110
|
+
backend_capabilities: BackendCapabilities;
|
|
111
|
+
use_teams: boolean;
|
|
112
|
+
team_timeout_minutes: number;
|
|
113
|
+
max_concurrent_teammates: number;
|
|
114
|
+
milestone_version: string;
|
|
115
|
+
milestone_name: string;
|
|
116
|
+
phases: PhaseContext[];
|
|
117
|
+
phase_count: number;
|
|
118
|
+
status_tracker: { phases: Record<string, { status: string }> };
|
|
119
|
+
error?: string;
|
|
120
|
+
independence_validated?: boolean;
|
|
121
|
+
gate_warnings?: GateViolation[];
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Options for buildParallelContext.
|
|
126
|
+
*/
|
|
127
|
+
interface BuildParallelContextOptions {
|
|
128
|
+
nativeWorktreeAvailable?: boolean;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// ─── validateIndependentPhases ──────────────────────────────────────────────
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Validate that requested phases have no direct dependency edges between them.
|
|
135
|
+
*
|
|
136
|
+
* Only checks DIRECT edges (not transitive paths). This is correct because the
|
|
137
|
+
* command template already receives parallel_groups from deps analysis for ordering.
|
|
138
|
+
* The validation here prevents the user from requesting two phases where one
|
|
139
|
+
* directly depends on the other.
|
|
140
|
+
* @param graph - Dependency graph containing all phase edges
|
|
141
|
+
* @param requestedPhases - Array of phase number strings to validate
|
|
142
|
+
* @returns Validation result indicating whether phases are independent, with any conflict pairs
|
|
143
|
+
*/
|
|
144
|
+
function validateIndependentPhases(
|
|
145
|
+
graph: DependencyGraph,
|
|
146
|
+
requestedPhases: string[]
|
|
147
|
+
): ValidationResult {
|
|
148
|
+
if (requestedPhases.length <= 1) {
|
|
149
|
+
return { valid: true, phases: requestedPhases };
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
const requestedSet = new Set(requestedPhases);
|
|
153
|
+
const conflicts: Array<{ from: string; to: string }> = [];
|
|
154
|
+
|
|
155
|
+
for (const edge of graph.edges) {
|
|
156
|
+
if (requestedSet.has(edge.from) && requestedSet.has(edge.to)) {
|
|
157
|
+
conflicts.push({ from: edge.from, to: edge.to });
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
if (conflicts.length > 0) {
|
|
162
|
+
return { valid: false, conflicts, phases: requestedPhases };
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
return { valid: true, phases: requestedPhases };
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// ─── buildParallelContext ───────────────────────────────────────────────────
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* Build structured JSON context for parallel execution of multiple phases.
|
|
172
|
+
*
|
|
173
|
+
* Loads config, detects backend capabilities, resolves per-phase info (directory,
|
|
174
|
+
* plans, worktree paths), and selects parallel vs sequential mode. Returns a
|
|
175
|
+
* context object consumed by the execute-phase command template.
|
|
176
|
+
* @param cwd - Absolute path to the working directory (project root)
|
|
177
|
+
* @param phaseNumbers - Array of phase number strings to build context for
|
|
178
|
+
* @param options - Optional configuration for native worktree availability
|
|
179
|
+
* @returns Full parallel execution context, or an error object if a phase is not found
|
|
180
|
+
*/
|
|
181
|
+
function buildParallelContext(
|
|
182
|
+
cwd: string,
|
|
183
|
+
phaseNumbers: string[],
|
|
184
|
+
options?: BuildParallelContextOptions
|
|
185
|
+
): ParallelContext | { error: string } {
|
|
186
|
+
const { nativeWorktreeAvailable = false } = options || {};
|
|
187
|
+
const config: GrdConfig = loadConfig(cwd);
|
|
188
|
+
const backend: string = detectBackend(cwd);
|
|
189
|
+
const capabilities: BackendCapabilities = getBackendCapabilities(backend);
|
|
190
|
+
const milestone: MilestoneInfo = getMilestoneInfo(cwd);
|
|
191
|
+
|
|
192
|
+
// Determine mode: parallel only if backend supports teams AND config allows it
|
|
193
|
+
const mode: 'parallel' | 'sequential' =
|
|
194
|
+
capabilities.teams === true && config.use_teams !== false ? 'parallel' : 'sequential';
|
|
195
|
+
|
|
196
|
+
// Build fallback note for sequential mode
|
|
197
|
+
const fallback_note: string | null =
|
|
198
|
+
mode === 'sequential'
|
|
199
|
+
? 'Parallel execution available on Claude Code backend with teams enabled'
|
|
200
|
+
: null;
|
|
201
|
+
|
|
202
|
+
// Build per-phase context objects
|
|
203
|
+
const phaseContexts: PhaseContext[] = [];
|
|
204
|
+
for (const phaseNum of phaseNumbers) {
|
|
205
|
+
const phaseInfo: PhaseInfo | null = findPhaseInternal(cwd, phaseNum);
|
|
206
|
+
if (!phaseInfo) {
|
|
207
|
+
return { error: `Phase ${phaseNum} not found` };
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
const template: string = config.phase_branch_template || 'grd/{milestone}/{phase}-{slug}';
|
|
211
|
+
const worktree_branch: string = template
|
|
212
|
+
.replace('{milestone}', milestone.version)
|
|
213
|
+
.replace('{phase}', phaseInfo.phase_number)
|
|
214
|
+
.replace('{slug}', phaseInfo.phase_slug || 'phase');
|
|
215
|
+
|
|
216
|
+
// When native isolation is available, skip worktree_path pre-computation
|
|
217
|
+
// Claude Code creates worktrees natively via its isolation: worktree mechanism
|
|
218
|
+
const wt_path: string | null = nativeWorktreeAvailable
|
|
219
|
+
? null
|
|
220
|
+
: worktreePath(cwd, milestone.version, phaseInfo.phase_number);
|
|
221
|
+
|
|
222
|
+
phaseContexts.push({
|
|
223
|
+
phase_number: phaseInfo.phase_number,
|
|
224
|
+
phase_name: phaseInfo.phase_name,
|
|
225
|
+
phase_slug: phaseInfo.phase_slug,
|
|
226
|
+
phase_dir: phaseInfo.directory,
|
|
227
|
+
worktree_path: wt_path,
|
|
228
|
+
worktree_branch,
|
|
229
|
+
native_isolation: nativeWorktreeAvailable,
|
|
230
|
+
plans: phaseInfo.plans,
|
|
231
|
+
incomplete_plans: phaseInfo.incomplete_plans,
|
|
232
|
+
plan_count: phaseInfo.plans ? phaseInfo.plans.length : 0,
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
// Build status tracker with per-phase pending state
|
|
237
|
+
const status_tracker: { phases: Record<string, { status: string }> } = { phases: {} };
|
|
238
|
+
for (const ctx of phaseContexts) {
|
|
239
|
+
status_tracker.phases[ctx.phase_number] = { status: 'pending' };
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
return {
|
|
243
|
+
mode,
|
|
244
|
+
fallback_note,
|
|
245
|
+
backend,
|
|
246
|
+
backend_capabilities: capabilities,
|
|
247
|
+
use_teams: config.use_teams,
|
|
248
|
+
team_timeout_minutes: config.team_timeout_minutes,
|
|
249
|
+
max_concurrent_teammates: config.max_concurrent_teammates,
|
|
250
|
+
milestone_version: milestone.version,
|
|
251
|
+
milestone_name: milestone.name,
|
|
252
|
+
phases: phaseContexts,
|
|
253
|
+
phase_count: phaseNumbers.length,
|
|
254
|
+
status_tracker,
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
// ─── buildWaves ──────────────────────────────────────────────────────────────
|
|
259
|
+
|
|
260
|
+
/**
|
|
261
|
+
* Wave assignment result: a wave number and the plan IDs that execute in that wave.
|
|
262
|
+
*/
|
|
263
|
+
interface WaveAssignment {
|
|
264
|
+
wave: number;
|
|
265
|
+
plans: string[];
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
/**
|
|
269
|
+
* Options for buildWaves.
|
|
270
|
+
*/
|
|
271
|
+
interface BuildWavesOptions {
|
|
272
|
+
artifactDAG?: ArtifactDAG;
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
/**
|
|
276
|
+
* Assign plans to execution waves using a combined dependency model.
|
|
277
|
+
*
|
|
278
|
+
* Merges two dependency mechanisms into a single constraint set per plan:
|
|
279
|
+
* 1. Explicit `depends_on` field in PLAN.md frontmatter (coarse phase-level gates).
|
|
280
|
+
* 2. Fine-grained artifact DAG: for each plan's `requires` entries, look up the
|
|
281
|
+
* provider plan in `artifactDAG.providers` and treat it as a hard dependency.
|
|
282
|
+
*
|
|
283
|
+
* Kahn's level-based topological sort assigns each plan to the earliest wave where
|
|
284
|
+
* all its dependencies have been satisfied. Plans without `provides`/`requires`
|
|
285
|
+
* fields (empty arrays) are backward compatible — they only respect `depends_on`.
|
|
286
|
+
*
|
|
287
|
+
* If a cycle is detected (remaining plans with unresolvable dependencies), all
|
|
288
|
+
* remaining plans are placed in the last wave and a warning is written to stderr.
|
|
289
|
+
*
|
|
290
|
+
* @param plans - Plan artifacts parsed from PLAN.md frontmatter
|
|
291
|
+
* @param options - Optional config including a pre-built ArtifactDAG
|
|
292
|
+
* @returns Array of WaveAssignment objects sorted by wave number
|
|
293
|
+
*/
|
|
294
|
+
function buildWaves(plans: PlanArtifact[], options?: BuildWavesOptions): WaveAssignment[] {
|
|
295
|
+
if (plans.length === 0) {
|
|
296
|
+
return [];
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
const artifactDAG = options?.artifactDAG;
|
|
300
|
+
|
|
301
|
+
// Build plan ID for each plan using the same format as buildArtifactDAG
|
|
302
|
+
const planIdOf = (p: PlanArtifact): string =>
|
|
303
|
+
`${p.phase}-${String(p.plan).padStart(2, '0')}`;
|
|
304
|
+
|
|
305
|
+
// Build a set of all valid plan IDs for membership checks
|
|
306
|
+
const planIds = new Set<string>(plans.map(planIdOf));
|
|
307
|
+
|
|
308
|
+
// Build combined dependency set for each plan
|
|
309
|
+
// combined deps: Set<planId> that must be completed before this plan
|
|
310
|
+
const combinedDeps = new Map<string, Set<string>>();
|
|
311
|
+
for (const plan of plans) {
|
|
312
|
+
const id = planIdOf(plan);
|
|
313
|
+
const deps = new Set<string>();
|
|
314
|
+
|
|
315
|
+
// 1. Explicit depends_on: these are plan IDs like "94-01" directly
|
|
316
|
+
for (const dep of plan.depends_on) {
|
|
317
|
+
if (planIds.has(dep)) {
|
|
318
|
+
deps.add(dep);
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
// 2. Artifact DAG requires: look up each required artifact's provider plan
|
|
323
|
+
if (artifactDAG !== undefined) {
|
|
324
|
+
for (const artifact of plan.requires) {
|
|
325
|
+
const providerPlanId = artifactDAG.providers[artifact];
|
|
326
|
+
if (providerPlanId !== undefined && providerPlanId !== id && planIds.has(providerPlanId)) {
|
|
327
|
+
deps.add(providerPlanId);
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
combinedDeps.set(id, deps);
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
// Build in-degree and adjacency for Kahn's algorithm
|
|
336
|
+
// Edge: dependency → dependent (dep must run before dependent)
|
|
337
|
+
const adjacency = new Map<string, string[]>(); // dep → [dependents]
|
|
338
|
+
const inDegree = new Map<string, number>();
|
|
339
|
+
|
|
340
|
+
for (const id of planIds) {
|
|
341
|
+
adjacency.set(id, []);
|
|
342
|
+
inDegree.set(id, 0);
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
for (const [id, deps] of combinedDeps) {
|
|
346
|
+
for (const dep of deps) {
|
|
347
|
+
(adjacency.get(dep) as string[]).push(id);
|
|
348
|
+
inDegree.set(id, (inDegree.get(id) as number) + 1);
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
// Level-based Kahn's — each iteration yields one wave
|
|
353
|
+
const waves: WaveAssignment[] = [];
|
|
354
|
+
const remaining = new Set<string>(planIds);
|
|
355
|
+
let waveNumber = 1;
|
|
356
|
+
|
|
357
|
+
while (remaining.size > 0) {
|
|
358
|
+
const batch: string[] = [];
|
|
359
|
+
for (const id of remaining) {
|
|
360
|
+
if ((inDegree.get(id) as number) === 0) {
|
|
361
|
+
batch.push(id);
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
if (batch.length === 0) {
|
|
366
|
+
// Cycle detected — place all remaining plans in the last wave and warn
|
|
367
|
+
process.stderr.write(
|
|
368
|
+
`[buildWaves] Warning: cycle detected among plans [${Array.from(remaining).join(', ')}]; placing all in wave ${waveNumber}\n`
|
|
369
|
+
);
|
|
370
|
+
batch.push(...Array.from(remaining));
|
|
371
|
+
batch.sort();
|
|
372
|
+
waves.push({ wave: waveNumber, plans: batch });
|
|
373
|
+
break;
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
// Sort lexicographically for deterministic output
|
|
377
|
+
batch.sort();
|
|
378
|
+
waves.push({ wave: waveNumber, plans: batch });
|
|
379
|
+
|
|
380
|
+
// Decrement in-degree for dependents and remove from remaining
|
|
381
|
+
for (const id of batch) {
|
|
382
|
+
remaining.delete(id);
|
|
383
|
+
for (const dependent of adjacency.get(id) as string[]) {
|
|
384
|
+
if (remaining.has(dependent)) {
|
|
385
|
+
inDegree.set(dependent, (inDegree.get(dependent) as number) - 1);
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
waveNumber++;
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
return waves;
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
// ─── cmdInitExecuteParallel ─────────────────────────────────────────────────
|
|
397
|
+
|
|
398
|
+
/**
|
|
399
|
+
* CLI command: Validate phase independence and build parallel execution context.
|
|
400
|
+
*
|
|
401
|
+
* Follows the established cmdInit* pattern: validates inputs, runs preflight gates,
|
|
402
|
+
* checks roadmap for requested phases, validates independence via dependency graph,
|
|
403
|
+
* builds context, and outputs structured JSON.
|
|
404
|
+
* @param cwd - Absolute path to the working directory (project root)
|
|
405
|
+
* @param phaseNumbers - Array of phase number strings requested for parallel execution
|
|
406
|
+
* @param _includes - Unused set of include filters (reserved for future use)
|
|
407
|
+
* @param raw - Whether to output plain text instead of JSON
|
|
408
|
+
* @returns void (outputs JSON or error to stdout)
|
|
409
|
+
*/
|
|
410
|
+
function cmdInitExecuteParallel(
|
|
411
|
+
cwd: string,
|
|
412
|
+
phaseNumbers: string[],
|
|
413
|
+
_includes: Set<string>,
|
|
414
|
+
raw: boolean
|
|
415
|
+
): void {
|
|
416
|
+
// Validate at least one phase requested
|
|
417
|
+
if (!phaseNumbers || phaseNumbers.length === 0) {
|
|
418
|
+
output({ error: 'At least one phase number is required' }, raw);
|
|
419
|
+
return;
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
// Run preflight gates (reuse execute-phase gates with first phase)
|
|
423
|
+
const gates: PreflightResult = runPreflightGates(cwd, 'execute-phase', {
|
|
424
|
+
phase: phaseNumbers[0],
|
|
425
|
+
});
|
|
426
|
+
if (!gates.passed) {
|
|
427
|
+
output({ gate_failed: true, gate_errors: gates.errors, gate_warnings: gates.warnings }, raw);
|
|
428
|
+
return;
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
// Analyze roadmap to get all phases
|
|
432
|
+
const roadmapResult = analyzeRoadmap(cwd);
|
|
433
|
+
if (roadmapResult.error || !roadmapResult.phases || roadmapResult.phases.length === 0) {
|
|
434
|
+
output({ error: roadmapResult.error || 'ROADMAP.md not found or empty' }, raw);
|
|
435
|
+
return;
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
// Verify all requested phases exist in roadmap
|
|
439
|
+
const roadmapPhaseNumbers = new Set(roadmapResult.phases.map((p) => p.number));
|
|
440
|
+
const missing: string[] = phaseNumbers.filter((pn) => !roadmapPhaseNumbers.has(pn));
|
|
441
|
+
if (missing.length > 0) {
|
|
442
|
+
output({ error: `Phase(s) not found in roadmap: ${missing.join(', ')}` }, raw);
|
|
443
|
+
return;
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
// Build dependency graph and validate independence
|
|
447
|
+
const graph: DependencyGraph = buildDependencyGraph(roadmapResult.phases);
|
|
448
|
+
const validation: ValidationResult = validateIndependentPhases(graph, phaseNumbers);
|
|
449
|
+
|
|
450
|
+
if (!validation.valid) {
|
|
451
|
+
const conflictStr: string = validation
|
|
452
|
+
.conflicts!.map((c) => `Phase ${c.from} -> Phase ${c.to}`)
|
|
453
|
+
.join(', ');
|
|
454
|
+
output(
|
|
455
|
+
{
|
|
456
|
+
error: `Phases are not independent: ${conflictStr}`,
|
|
457
|
+
conflicts: validation.conflicts,
|
|
458
|
+
},
|
|
459
|
+
raw
|
|
460
|
+
);
|
|
461
|
+
return;
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
// Build parallel context with native isolation awareness
|
|
465
|
+
const backend: string = detectBackend(cwd);
|
|
466
|
+
const capabilities: BackendCapabilities = getBackendCapabilities(backend);
|
|
467
|
+
const context = buildParallelContext(cwd, phaseNumbers, {
|
|
468
|
+
nativeWorktreeAvailable: capabilities.native_worktree_isolation,
|
|
469
|
+
}) as ParallelContext;
|
|
470
|
+
if (context.error) {
|
|
471
|
+
output(context, raw, `Error: ${context.error}`);
|
|
472
|
+
return;
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
// Add independence validation flag
|
|
476
|
+
context.independence_validated = true;
|
|
477
|
+
|
|
478
|
+
// Include gate warnings if any
|
|
479
|
+
if (gates.warnings && gates.warnings.length > 0) {
|
|
480
|
+
context.gate_warnings = gates.warnings;
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
output(
|
|
484
|
+
context,
|
|
485
|
+
raw,
|
|
486
|
+
`Backend: ${context.backend}, ${context.phase_count} phases, mode: ${context.mode}`
|
|
487
|
+
);
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
// ─── formatProgressBar ──────────────────────────────────────────────────────
|
|
491
|
+
|
|
492
|
+
/**
|
|
493
|
+
* Format a progress bar string like `[####______] 40%`
|
|
494
|
+
*/
|
|
495
|
+
function formatProgressBar(current: number, total: number, width?: number): string {
|
|
496
|
+
const barWidth: number = width || 20;
|
|
497
|
+
const pct: number = total === 0 ? 0 : Math.min(1, current / total);
|
|
498
|
+
const filled: number = Math.round(pct * barWidth);
|
|
499
|
+
const empty: number = barWidth - filled;
|
|
500
|
+
const bar: string = '#'.repeat(filled) + '_'.repeat(empty);
|
|
501
|
+
const pctLabel: string = Math.round(pct * 100) + '%';
|
|
502
|
+
return `[${bar}] ${pctLabel}`;
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
// ─── streamPhaseProgress ────────────────────────────────────────────────────
|
|
506
|
+
|
|
507
|
+
/**
|
|
508
|
+
* Write formatted phase progress to stderr.
|
|
509
|
+
*/
|
|
510
|
+
function streamPhaseProgress(
|
|
511
|
+
phaseNum: string,
|
|
512
|
+
current: number,
|
|
513
|
+
total: number,
|
|
514
|
+
status?: string
|
|
515
|
+
): void {
|
|
516
|
+
const padded: string = String(phaseNum).padStart(2, '0');
|
|
517
|
+
const bar: string = formatProgressBar(current, total);
|
|
518
|
+
const statusPart: string = status ? ` [${status}]` : '';
|
|
519
|
+
const line: string = `Phase ${padded}: ${current} of ${total} ${bar}${statusPart}\n`;
|
|
520
|
+
process.stderr.write(line);
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
// ─── cmdParallelProgress ────────────────────────────────────────────────────
|
|
524
|
+
|
|
525
|
+
/**
|
|
526
|
+
* CLI command for progress updates during parallel execution.
|
|
527
|
+
* Accepts --phase, --plan, --total-plans, --status args.
|
|
528
|
+
*/
|
|
529
|
+
function cmdParallelProgress(args: string[], raw: boolean): void {
|
|
530
|
+
// Parse args
|
|
531
|
+
let phase: string | null = null;
|
|
532
|
+
let plan: number | null = null;
|
|
533
|
+
let totalPlans: number | null = null;
|
|
534
|
+
let status: string | null = null;
|
|
535
|
+
|
|
536
|
+
for (let i = 0; i < args.length; i++) {
|
|
537
|
+
if (args[i] === '--phase' && args[i + 1]) phase = args[++i];
|
|
538
|
+
else if (args[i] === '--plan' && args[i + 1]) plan = parseInt(args[++i], 10);
|
|
539
|
+
else if (args[i] === '--total-plans' && args[i + 1]) totalPlans = parseInt(args[++i], 10);
|
|
540
|
+
else if (args[i] === '--status' && args[i + 1]) status = args[++i];
|
|
541
|
+
}
|
|
542
|
+
|
|
543
|
+
if (phase === null || plan === null || totalPlans === null) {
|
|
544
|
+
output(
|
|
545
|
+
{ error: 'Usage: parallel-progress --phase N --plan M --total-plans T [--status label]' },
|
|
546
|
+
raw
|
|
547
|
+
);
|
|
548
|
+
return;
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
const bar: string = formatProgressBar(plan, totalPlans);
|
|
552
|
+
|
|
553
|
+
if (raw) {
|
|
554
|
+
output({ phase, plan, total_plans: totalPlans, bar, status }, raw);
|
|
555
|
+
} else {
|
|
556
|
+
streamPhaseProgress(phase, plan, totalPlans, status || undefined);
|
|
557
|
+
}
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
// ─── Exports ──────────────────────────────────────────────────────────────────
|
|
561
|
+
|
|
562
|
+
module.exports = {
|
|
563
|
+
validateIndependentPhases,
|
|
564
|
+
buildParallelContext,
|
|
565
|
+
buildWaves,
|
|
566
|
+
cmdInitExecuteParallel,
|
|
567
|
+
formatProgressBar,
|
|
568
|
+
streamPhaseProgress,
|
|
569
|
+
cmdParallelProgress,
|
|
570
|
+
};
|