@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,283 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.collectMetrics = collectMetrics;
|
|
4
|
+
exports.detectMinima = detectMinima;
|
|
5
|
+
exports.checkConvergence = checkConvergence;
|
|
6
|
+
exports.classifyBranch = classifyBranch;
|
|
7
|
+
exports.buildCritiquePrompt = buildCritiquePrompt;
|
|
8
|
+
/**
|
|
9
|
+
* Collect quantitative metrics from npm test, tsc, and eslint output.
|
|
10
|
+
*
|
|
11
|
+
* @param testOutput - Raw stdout from `npm test` (Jest output with coverage table)
|
|
12
|
+
* @param tscOutput - Raw stdout/stderr from `tsc --noEmit`
|
|
13
|
+
* @param lintOutput - Raw stdout from `eslint`
|
|
14
|
+
* @returns RefinementMetrics with current ISO timestamp
|
|
15
|
+
*/
|
|
16
|
+
function collectMetrics(testOutput, tscOutput, lintOutput) {
|
|
17
|
+
// Parse test coverage from Jest output: look for "All files" line
|
|
18
|
+
// Jest coverage table format: | All files | XX.XX | XX.XX | XX.XX | ...
|
|
19
|
+
let test_coverage_pct = 0;
|
|
20
|
+
// Jest coverage table "All files" row has 5 columns: File | Stmts | Branch | Funcs | Lines
|
|
21
|
+
// We want the Lines column (4th numeric value after "All files |")
|
|
22
|
+
const coverageLineMatch = testOutput.match(/All files\s*\|\s*([\d.]+)\s*\|\s*([\d.]+)\s*\|\s*([\d.]+)\s*\|\s*([\d.]+)\s*\|/);
|
|
23
|
+
if (coverageLineMatch) {
|
|
24
|
+
// Group 4 = Lines coverage
|
|
25
|
+
test_coverage_pct = parseFloat(coverageLineMatch[4]) || 0;
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
// Fallback: look for "Statements" or "Lines" percentage on a summary line
|
|
29
|
+
const statementsMatch = testOutput.match(/Statements\s*:\s*([\d.]+)%/);
|
|
30
|
+
if (statementsMatch) {
|
|
31
|
+
test_coverage_pct = parseFloat(statementsMatch[1]) || 0;
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
// Try "Lines" percentage
|
|
35
|
+
const linesMatch = testOutput.match(/Lines\s*:\s*([\d.]+)%/);
|
|
36
|
+
if (linesMatch) {
|
|
37
|
+
test_coverage_pct = parseFloat(linesMatch[1]) || 0;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
// Parse type error count from tsc output: count lines matching /error TS\d+/
|
|
42
|
+
const tscErrorMatches = tscOutput.match(/error TS\d+/g);
|
|
43
|
+
const type_error_count = tscErrorMatches ? tscErrorMatches.length : 0;
|
|
44
|
+
// Parse lint violation count from eslint output.
|
|
45
|
+
// Strategy: count individual violation lines AND check the "N problems" summary.
|
|
46
|
+
// Take max of both to handle cases where the summary underreports or is absent.
|
|
47
|
+
// Count individual error/warning lines (indented lines with rule names)
|
|
48
|
+
const violationLines = lintOutput
|
|
49
|
+
.split('\n')
|
|
50
|
+
.filter((line) => /^\s+\d+:\d+\s+(error|warning)\s+/.test(line));
|
|
51
|
+
const individualCount = violationLines.length;
|
|
52
|
+
// Check for summary line "N problems"
|
|
53
|
+
const problemsMatch = lintOutput.match(/(\d+)\s+problems?/);
|
|
54
|
+
const summaryCount = problemsMatch ? (parseInt(problemsMatch[1], 10) || 0) : 0;
|
|
55
|
+
const lint_violation_count = Math.max(individualCount, summaryCount);
|
|
56
|
+
return {
|
|
57
|
+
test_coverage_pct,
|
|
58
|
+
type_error_count,
|
|
59
|
+
lint_violation_count,
|
|
60
|
+
timestamp: new Date().toISOString(),
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Detect metric-minima regions from a time series of MetricSnapshot objects.
|
|
65
|
+
*
|
|
66
|
+
* For test_coverage_pct: finds local minima (dips where coverage < both neighbors).
|
|
67
|
+
* For type_error_count and lint_violation_count: finds local maxima (spikes where
|
|
68
|
+
* count > both neighbors).
|
|
69
|
+
*
|
|
70
|
+
* Adapted from NERFIFY PSNR-minima ROI analysis.
|
|
71
|
+
*
|
|
72
|
+
* @param snapshots - Ordered array of metric snapshots
|
|
73
|
+
* @returns Array of MinimaRegion objects sorted by |delta| descending
|
|
74
|
+
*/
|
|
75
|
+
function detectMinima(snapshots) {
|
|
76
|
+
// Need at least 3 snapshots to detect local minima/maxima (requires both neighbors)
|
|
77
|
+
if (snapshots.length < 3)
|
|
78
|
+
return [];
|
|
79
|
+
const regions = [];
|
|
80
|
+
for (let i = 1; i < snapshots.length - 1; i++) {
|
|
81
|
+
const prev = snapshots[i - 1].metrics;
|
|
82
|
+
const curr = snapshots[i].metrics;
|
|
83
|
+
const next = snapshots[i + 1].metrics;
|
|
84
|
+
// Coverage: find local minima (dips)
|
|
85
|
+
if (curr.test_coverage_pct < prev.test_coverage_pct && curr.test_coverage_pct < next.test_coverage_pct) {
|
|
86
|
+
const neighborAvg = (prev.test_coverage_pct + next.test_coverage_pct) / 2;
|
|
87
|
+
const delta = Math.abs(neighborAvg - curr.test_coverage_pct);
|
|
88
|
+
regions.push({
|
|
89
|
+
dimension: 'test_coverage_pct',
|
|
90
|
+
index: i,
|
|
91
|
+
value: curr.test_coverage_pct,
|
|
92
|
+
delta,
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
// Type errors: find local maxima (spikes)
|
|
96
|
+
if (curr.type_error_count > prev.type_error_count && curr.type_error_count > next.type_error_count) {
|
|
97
|
+
const neighborAvg = (prev.type_error_count + next.type_error_count) / 2;
|
|
98
|
+
const delta = Math.abs(curr.type_error_count - neighborAvg);
|
|
99
|
+
regions.push({
|
|
100
|
+
dimension: 'type_error_count',
|
|
101
|
+
index: i,
|
|
102
|
+
value: curr.type_error_count,
|
|
103
|
+
delta,
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
// Lint violations: find local maxima (spikes)
|
|
107
|
+
if (curr.lint_violation_count > prev.lint_violation_count && curr.lint_violation_count > next.lint_violation_count) {
|
|
108
|
+
const neighborAvg = (prev.lint_violation_count + next.lint_violation_count) / 2;
|
|
109
|
+
const delta = Math.abs(curr.lint_violation_count - neighborAvg);
|
|
110
|
+
regions.push({
|
|
111
|
+
dimension: 'lint_violation_count',
|
|
112
|
+
index: i,
|
|
113
|
+
value: curr.lint_violation_count,
|
|
114
|
+
delta,
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
// Sort by absolute delta descending (worst regions first)
|
|
119
|
+
return regions.sort((a, b) => b.delta - a.delta);
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Check whether metrics have converged (stopped improving meaningfully).
|
|
123
|
+
*
|
|
124
|
+
* @param snapshots - Ordered array of metric snapshots (newest last)
|
|
125
|
+
* @param config - Convergence thresholds and max iteration cap
|
|
126
|
+
* @returns { converged: boolean, reason: string }
|
|
127
|
+
*/
|
|
128
|
+
function checkConvergence(snapshots, config) {
|
|
129
|
+
if (snapshots.length < 2) {
|
|
130
|
+
return { converged: false, reason: 'insufficient data' };
|
|
131
|
+
}
|
|
132
|
+
if (snapshots.length >= config.max_iterations) {
|
|
133
|
+
return { converged: true, reason: 'max iterations reached' };
|
|
134
|
+
}
|
|
135
|
+
const last = snapshots[snapshots.length - 1].metrics;
|
|
136
|
+
const prev = snapshots[snapshots.length - 2].metrics;
|
|
137
|
+
// Codex r43 P1 #3: detect the "no real progress" sentinel — when both
|
|
138
|
+
// snapshots report all zeros, the measurement path is almost
|
|
139
|
+
// certainly broken (e.g. jest/tsc/eslint never ran, or stdout was
|
|
140
|
+
// discarded). Don't celebrate this as convergence.
|
|
141
|
+
const lastAllZero = last.test_coverage_pct === 0 &&
|
|
142
|
+
last.type_error_count === 0 &&
|
|
143
|
+
last.lint_violation_count === 0;
|
|
144
|
+
const prevAllZero = prev.test_coverage_pct === 0 &&
|
|
145
|
+
prev.type_error_count === 0 &&
|
|
146
|
+
prev.lint_violation_count === 0;
|
|
147
|
+
if (lastAllZero && prevAllZero) {
|
|
148
|
+
return {
|
|
149
|
+
converged: false,
|
|
150
|
+
reason: 'no progress (all metrics zero — measurement path likely broken)',
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
const deltaCoverage = Math.abs(last.test_coverage_pct - prev.test_coverage_pct);
|
|
154
|
+
const deltaTypeErrors = Math.abs(last.type_error_count - prev.type_error_count);
|
|
155
|
+
const deltaLint = Math.abs(last.lint_violation_count - prev.lint_violation_count);
|
|
156
|
+
const coverageConverged = deltaCoverage < config.epsilon_coverage;
|
|
157
|
+
const typeErrorsConverged = deltaTypeErrors < config.epsilon_type_errors;
|
|
158
|
+
const lintConverged = deltaLint < config.epsilon_lint;
|
|
159
|
+
if (coverageConverged && typeErrorsConverged && lintConverged) {
|
|
160
|
+
return { converged: true, reason: 'all dimensions within epsilon' };
|
|
161
|
+
}
|
|
162
|
+
const stillChanging = [];
|
|
163
|
+
if (!coverageConverged) {
|
|
164
|
+
stillChanging.push(`coverage (delta=${deltaCoverage.toFixed(2)}, epsilon=${config.epsilon_coverage})`);
|
|
165
|
+
}
|
|
166
|
+
if (!typeErrorsConverged) {
|
|
167
|
+
stillChanging.push(`type_errors (delta=${deltaTypeErrors}, epsilon=${config.epsilon_type_errors})`);
|
|
168
|
+
}
|
|
169
|
+
if (!lintConverged) {
|
|
170
|
+
stillChanging.push(`lint (delta=${deltaLint}, epsilon=${config.epsilon_lint})`);
|
|
171
|
+
}
|
|
172
|
+
return {
|
|
173
|
+
converged: false,
|
|
174
|
+
reason: `still changing: ${stillChanging.join(', ')}`,
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Classify which refinement branch should handle the current metric state.
|
|
179
|
+
*
|
|
180
|
+
* Computes normalized gap for each dimension and routes to the branch
|
|
181
|
+
* with the largest gap to target:
|
|
182
|
+
* - 'macro': coverage gap is largest (metric-minima guided patching)
|
|
183
|
+
* - 'geometry': type error gap is largest (structural validation)
|
|
184
|
+
* - 'generative': lint gap is largest (artifact analysis)
|
|
185
|
+
*
|
|
186
|
+
* @param current - Current metric snapshot
|
|
187
|
+
* @param targets - Target metrics to reach
|
|
188
|
+
* @returns The CritiqueBranch that should handle refinement
|
|
189
|
+
*/
|
|
190
|
+
function classifyBranch(current, targets) {
|
|
191
|
+
// Normalized gap for coverage: (target - current) / target; higher = worse (lower coverage)
|
|
192
|
+
const coverageTarget = targets.test_coverage_pct;
|
|
193
|
+
const coverageGap = coverageTarget > 0
|
|
194
|
+
? Math.max(0, (coverageTarget - current.test_coverage_pct) / coverageTarget)
|
|
195
|
+
: 0;
|
|
196
|
+
// Normalized gap for type errors: (current - target) / max(current, 1); higher = worse (more errors)
|
|
197
|
+
const typeErrorsGap = current.type_error_count > 0
|
|
198
|
+
? (current.type_error_count - targets.type_error_count) / Math.max(current.type_error_count, 1)
|
|
199
|
+
: 0;
|
|
200
|
+
// Normalized gap for lint: (current - target) / max(current, 1); higher = worse (more violations)
|
|
201
|
+
const lintGap = current.lint_violation_count > 0
|
|
202
|
+
? (current.lint_violation_count - targets.lint_violation_count) / Math.max(current.lint_violation_count, 1)
|
|
203
|
+
: 0;
|
|
204
|
+
// Tie-break order: macro > geometry > generative
|
|
205
|
+
if (coverageGap >= typeErrorsGap && coverageGap >= lintGap) {
|
|
206
|
+
return 'macro';
|
|
207
|
+
}
|
|
208
|
+
if (typeErrorsGap >= lintGap) {
|
|
209
|
+
return 'geometry';
|
|
210
|
+
}
|
|
211
|
+
return 'generative';
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Build a structured critique prompt for the refinement agent.
|
|
215
|
+
*
|
|
216
|
+
* @param branch - Which critique branch this prompt is for
|
|
217
|
+
* @param metrics - Current metrics
|
|
218
|
+
* @param targets - Target metrics
|
|
219
|
+
* @param minimaRegions - Top minima regions to surface in the prompt
|
|
220
|
+
* @returns Formatted prompt string for the critique agent
|
|
221
|
+
*/
|
|
222
|
+
function buildCritiquePrompt(branch, metrics, targets, minimaRegions) {
|
|
223
|
+
const topRegions = minimaRegions.slice(0, 3);
|
|
224
|
+
const regionsText = topRegions.length > 0
|
|
225
|
+
? topRegions
|
|
226
|
+
.map((r, i) => ` ${i + 1}. ${r.dimension} at index ${r.index}: value=${r.value}, delta=${r.delta.toFixed(2)}`)
|
|
227
|
+
.join('\n')
|
|
228
|
+
: ' (none detected — first iteration or insufficient history)';
|
|
229
|
+
const branchInstructions = {
|
|
230
|
+
macro: `Focus on coverage recovery:
|
|
231
|
+
- Identify files with the lowest test coverage
|
|
232
|
+
- Add test cases for uncovered branches and lines
|
|
233
|
+
- Prioritize files that appear in minima regions (coverage dips)
|
|
234
|
+
- High-ROI targets: frequently modified files with low coverage`,
|
|
235
|
+
geometry: `Focus on type error resolution:
|
|
236
|
+
- Parse tsc error output and categorize errors by type
|
|
237
|
+
- Fix errors starting from leaf modules (no dependents) toward root
|
|
238
|
+
- Check export consistency: every module.exports key has a matching function/const
|
|
239
|
+
- Verify import chains are correct`,
|
|
240
|
+
generative: `Focus on lint pattern analysis:
|
|
241
|
+
- Cluster ESLint violations by rule
|
|
242
|
+
- Fix violations by cluster (all no-unused-vars together, all no-explicit-any together)
|
|
243
|
+
- Identify code patterns generating violations and refactor the pattern
|
|
244
|
+
- Never disable ESLint rules — fix the code`,
|
|
245
|
+
};
|
|
246
|
+
return `CRITIQUE BRANCH: ${branch.toUpperCase()}
|
|
247
|
+
|
|
248
|
+
## Current Metrics
|
|
249
|
+
|
|
250
|
+
- test_coverage_pct: ${metrics.test_coverage_pct.toFixed(2)}%
|
|
251
|
+
- type_error_count: ${metrics.type_error_count}
|
|
252
|
+
- lint_violation_count: ${metrics.lint_violation_count}
|
|
253
|
+
- collected_at: ${metrics.timestamp}
|
|
254
|
+
|
|
255
|
+
## Target Metrics
|
|
256
|
+
|
|
257
|
+
- test_coverage_pct: ${targets.test_coverage_pct.toFixed(2)}%
|
|
258
|
+
- type_error_count: ${targets.type_error_count}
|
|
259
|
+
- lint_violation_count: ${targets.lint_violation_count}
|
|
260
|
+
|
|
261
|
+
## Top Minima Regions
|
|
262
|
+
|
|
263
|
+
${regionsText}
|
|
264
|
+
|
|
265
|
+
## Branch Instructions
|
|
266
|
+
|
|
267
|
+
${branchInstructions[branch]}
|
|
268
|
+
|
|
269
|
+
## Constraints
|
|
270
|
+
|
|
271
|
+
- Modify at most 5 files per iteration
|
|
272
|
+
- Run npm run build:check after every change to avoid regression
|
|
273
|
+
- Never lower coverage thresholds in jest.config.js
|
|
274
|
+
- Never disable ESLint rules`;
|
|
275
|
+
}
|
|
276
|
+
module.exports = {
|
|
277
|
+
collectMetrics,
|
|
278
|
+
detectMinima,
|
|
279
|
+
checkConvergence,
|
|
280
|
+
classifyBranch,
|
|
281
|
+
buildCritiquePrompt,
|
|
282
|
+
};
|
|
283
|
+
//# sourceMappingURL=refinement.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refinement.js","sourceRoot":"","sources":["../../lib/refinement.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"requirements.d.ts","sourceRoot":"","sources":["../../lib/requirements.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,355 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const fs = require('fs');
|
|
4
|
+
const path = require('path');
|
|
5
|
+
const { safeReadFile, output, error } = require('./utils');
|
|
6
|
+
const { milestonesDir: getMilestonesDirPath } = require('./paths');
|
|
7
|
+
// Module-level cache for REQUIREMENTS.md reads across command calls.
|
|
8
|
+
// Prevents redundant disk reads when multiple requirement commands access the same file in one process.
|
|
9
|
+
const _reqContentCache = new Map();
|
|
10
|
+
/**
|
|
11
|
+
* Read REQUIREMENTS.md with per-process caching.
|
|
12
|
+
*/
|
|
13
|
+
function readCachedRequirements(reqFilePath) {
|
|
14
|
+
if (!_reqContentCache.has(reqFilePath)) {
|
|
15
|
+
const content = safeReadFile(reqFilePath);
|
|
16
|
+
if (content !== null)
|
|
17
|
+
_reqContentCache.set(reqFilePath, content);
|
|
18
|
+
return content;
|
|
19
|
+
}
|
|
20
|
+
return _reqContentCache.get(reqFilePath);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Parse requirements from REQUIREMENTS.md content into structured array.
|
|
24
|
+
*/
|
|
25
|
+
function parseRequirements(content) {
|
|
26
|
+
if (!content)
|
|
27
|
+
return [];
|
|
28
|
+
const requirements = [];
|
|
29
|
+
// Split by ### REQ- headings
|
|
30
|
+
const parts = content.split(/(?=^### REQ-)/m);
|
|
31
|
+
for (const part of parts) {
|
|
32
|
+
const headingMatch = part.match(/^### (REQ-\d+):\s*(.+)/m);
|
|
33
|
+
if (!headingMatch)
|
|
34
|
+
continue;
|
|
35
|
+
const id = headingMatch[1];
|
|
36
|
+
const title = headingMatch[2].trim();
|
|
37
|
+
const priorityMatch = part.match(/\*\*Priority:\*\*\s*(\S+)/);
|
|
38
|
+
const categoryMatch = part.match(/\*\*Category:\*\*\s*(.+)/);
|
|
39
|
+
const deferredMatch = part.match(/\*\*Deferred from:\*\*\s*(.+)/);
|
|
40
|
+
const resolvesMatch = part.match(/\*\*Resolves:\*\*\s*(.+)/);
|
|
41
|
+
// Description: everything after the metadata lines, stop at next section heading or separator
|
|
42
|
+
const lines = part.split('\n');
|
|
43
|
+
const descLines = [];
|
|
44
|
+
let pastHeading = false;
|
|
45
|
+
for (const line of lines) {
|
|
46
|
+
if (/^### REQ-/.test(line)) {
|
|
47
|
+
pastHeading = true;
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
if (!pastHeading)
|
|
51
|
+
continue;
|
|
52
|
+
if (/^\*\*(Priority|Category|Deferred from|Resolves):\*\*/.test(line))
|
|
53
|
+
continue;
|
|
54
|
+
// Stop at next section heading or separator
|
|
55
|
+
if (/^##\s/.test(line) || /^---\s*$/.test(line))
|
|
56
|
+
break;
|
|
57
|
+
descLines.push(line);
|
|
58
|
+
}
|
|
59
|
+
const description = descLines.join('\n').trim();
|
|
60
|
+
requirements.push({
|
|
61
|
+
id,
|
|
62
|
+
title,
|
|
63
|
+
priority: priorityMatch ? priorityMatch[1].trim() : null,
|
|
64
|
+
category: categoryMatch ? categoryMatch[1].trim() : null,
|
|
65
|
+
deferred_from: deferredMatch ? deferredMatch[1].trim() : null,
|
|
66
|
+
resolves: resolvesMatch ? resolvesMatch[1].trim() : null,
|
|
67
|
+
description: description || null,
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
return requirements;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Parse the Traceability Matrix table from REQUIREMENTS.md content.
|
|
74
|
+
*/
|
|
75
|
+
function parseTraceabilityMatrix(content) {
|
|
76
|
+
if (!content)
|
|
77
|
+
return [];
|
|
78
|
+
const matrix = [];
|
|
79
|
+
// Find section starting with ## Traceability Matrix
|
|
80
|
+
const sectionMatch = content.match(/##\s*Traceability Matrix\s*\n([\s\S]*?)(?=\n---|\n##|$)/i);
|
|
81
|
+
if (!sectionMatch)
|
|
82
|
+
return [];
|
|
83
|
+
const tableContent = sectionMatch[1];
|
|
84
|
+
const rows = tableContent.split('\n').filter((r) => r.startsWith('|'));
|
|
85
|
+
// Skip header row and separator row
|
|
86
|
+
const dataRows = rows.filter((r) => !r.match(/^\|\s*REQ\s*\|/i) && !r.match(/^\|[\s-]+\|/));
|
|
87
|
+
for (const row of dataRows) {
|
|
88
|
+
const cells = row
|
|
89
|
+
.split('|')
|
|
90
|
+
.map((c) => c.trim())
|
|
91
|
+
.filter(Boolean);
|
|
92
|
+
if (cells.length >= 5) {
|
|
93
|
+
matrix.push({
|
|
94
|
+
req: cells[0],
|
|
95
|
+
feature: cells[1],
|
|
96
|
+
priority: cells[2],
|
|
97
|
+
phase: cells[3],
|
|
98
|
+
status: cells[4],
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return matrix;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* CLI command: Look up a single requirement by ID, returning structured JSON.
|
|
106
|
+
* Falls back to archived milestone REQUIREMENTS.md files if not in current file.
|
|
107
|
+
*/
|
|
108
|
+
function cmdRequirementGet(cwd, reqId, raw) {
|
|
109
|
+
const reqFilePath = path.join(cwd, '.planning', 'REQUIREMENTS.md');
|
|
110
|
+
const content = readCachedRequirements(reqFilePath);
|
|
111
|
+
// Search current file first
|
|
112
|
+
if (content) {
|
|
113
|
+
const requirements = parseRequirements(content);
|
|
114
|
+
const match = requirements.find((r) => r.id.toLowerCase() === reqId.toLowerCase());
|
|
115
|
+
if (match) {
|
|
116
|
+
// Merge status and phase from traceability matrix
|
|
117
|
+
const matrix = parseTraceabilityMatrix(content);
|
|
118
|
+
const matrixRow = matrix.find((m) => m.req.toLowerCase() === reqId.toLowerCase());
|
|
119
|
+
if (matrixRow) {
|
|
120
|
+
match.status = matrixRow.status;
|
|
121
|
+
match.phase = matrixRow.phase;
|
|
122
|
+
}
|
|
123
|
+
output(match, raw, `${match.id}: ${match.title || ''} [${match.status || 'unknown'}]`);
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
// Fallback: scan archived milestone REQUIREMENTS.md files
|
|
128
|
+
const milestonesDir = getMilestonesDirPath(cwd);
|
|
129
|
+
try {
|
|
130
|
+
const files = fs
|
|
131
|
+
.readdirSync(milestonesDir)
|
|
132
|
+
.filter((f) => f.match(/^v[\d.]+-REQUIREMENTS\.md$/i));
|
|
133
|
+
for (const file of files) {
|
|
134
|
+
const filePath = path.join(milestonesDir, file);
|
|
135
|
+
const archiveContent = safeReadFile(filePath);
|
|
136
|
+
if (!archiveContent)
|
|
137
|
+
continue;
|
|
138
|
+
const archiveReqs = parseRequirements(archiveContent);
|
|
139
|
+
const match = archiveReqs.find((r) => r.id.toLowerCase() === reqId.toLowerCase());
|
|
140
|
+
if (match) {
|
|
141
|
+
// Merge status from archived traceability matrix
|
|
142
|
+
const matrix = parseTraceabilityMatrix(archiveContent);
|
|
143
|
+
const matrixRow = matrix.find((m) => m.req.toLowerCase() === reqId.toLowerCase());
|
|
144
|
+
if (matrixRow) {
|
|
145
|
+
match.status = matrixRow.status;
|
|
146
|
+
match.phase = matrixRow.phase;
|
|
147
|
+
}
|
|
148
|
+
// Extract milestone version from filename
|
|
149
|
+
const versionMatch = file.match(/^(v[\d.]+)-REQUIREMENTS\.md$/i);
|
|
150
|
+
match.milestone = versionMatch ? versionMatch[1] : file;
|
|
151
|
+
output(match, raw, `${match.id}: ${match.title || ''} [${match.status || 'unknown'}]`);
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
catch {
|
|
157
|
+
// milestones directory may not exist
|
|
158
|
+
}
|
|
159
|
+
// Not found anywhere
|
|
160
|
+
output({ error: 'Requirement not found', id: reqId }, raw);
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* CLI command: List requirements with optional filters.
|
|
164
|
+
*/
|
|
165
|
+
function cmdRequirementList(cwd, filters, raw) {
|
|
166
|
+
const f = filters || {};
|
|
167
|
+
const reqFilePath = path.join(cwd, '.planning', 'REQUIREMENTS.md');
|
|
168
|
+
const content = readCachedRequirements(reqFilePath);
|
|
169
|
+
let allReqs = [];
|
|
170
|
+
if (content) {
|
|
171
|
+
allReqs = parseRequirements(content);
|
|
172
|
+
const matrix = parseTraceabilityMatrix(content);
|
|
173
|
+
// Merge status/phase from matrix into each requirement
|
|
174
|
+
for (const req of allReqs) {
|
|
175
|
+
const matrixRow = matrix.find((m) => m.req.toLowerCase() === req.id.toLowerCase());
|
|
176
|
+
if (matrixRow) {
|
|
177
|
+
req.status = matrixRow.status;
|
|
178
|
+
req.phase = matrixRow.phase;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
// If --all, include archived milestone requirements
|
|
183
|
+
if (f.all) {
|
|
184
|
+
const milestonesDir = getMilestonesDirPath(cwd);
|
|
185
|
+
try {
|
|
186
|
+
const files = fs
|
|
187
|
+
.readdirSync(milestonesDir)
|
|
188
|
+
.filter((fname) => fname.match(/^v[\d.]+-REQUIREMENTS\.md$/i));
|
|
189
|
+
for (const file of files) {
|
|
190
|
+
const filePath = path.join(milestonesDir, file);
|
|
191
|
+
const archiveContent = safeReadFile(filePath);
|
|
192
|
+
if (!archiveContent)
|
|
193
|
+
continue;
|
|
194
|
+
const archiveReqs = parseRequirements(archiveContent);
|
|
195
|
+
const archiveMatrix = parseTraceabilityMatrix(archiveContent);
|
|
196
|
+
const versionMatch = file.match(/^(v[\d.]+)-REQUIREMENTS\.md$/i);
|
|
197
|
+
const milestone = versionMatch ? versionMatch[1] : file;
|
|
198
|
+
for (const req of archiveReqs) {
|
|
199
|
+
// Skip if already in current file
|
|
200
|
+
if (allReqs.find((r) => r.id.toLowerCase() === req.id.toLowerCase()))
|
|
201
|
+
continue;
|
|
202
|
+
const matrixRow = archiveMatrix.find((m) => m.req.toLowerCase() === req.id.toLowerCase());
|
|
203
|
+
if (matrixRow) {
|
|
204
|
+
req.status = matrixRow.status;
|
|
205
|
+
req.phase = matrixRow.phase;
|
|
206
|
+
}
|
|
207
|
+
req.milestone = milestone;
|
|
208
|
+
allReqs.push(req);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
catch {
|
|
213
|
+
// milestones directory may not exist
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
// Apply filters (AND logic)
|
|
217
|
+
let filtered = allReqs;
|
|
218
|
+
if (f.phase) {
|
|
219
|
+
filtered = filtered.filter((r) => {
|
|
220
|
+
if (!r.phase)
|
|
221
|
+
return false;
|
|
222
|
+
// Match "Phase N" where N matches filter value
|
|
223
|
+
const phaseNum = r.phase.match(/(\d+)/);
|
|
224
|
+
return phaseNum && phaseNum[1] === String(f.phase);
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
if (f.priority) {
|
|
228
|
+
filtered = filtered.filter((r) => r.priority === f.priority);
|
|
229
|
+
}
|
|
230
|
+
if (f.status) {
|
|
231
|
+
filtered = filtered.filter((r) => r.status === f.status);
|
|
232
|
+
}
|
|
233
|
+
if (f.category) {
|
|
234
|
+
filtered = filtered.filter((r) => r.category === f.category);
|
|
235
|
+
}
|
|
236
|
+
const filtersApplied = {};
|
|
237
|
+
if (f.phase)
|
|
238
|
+
filtersApplied.phase = f.phase;
|
|
239
|
+
if (f.priority)
|
|
240
|
+
filtersApplied.priority = f.priority;
|
|
241
|
+
if (f.status)
|
|
242
|
+
filtersApplied.status = f.status;
|
|
243
|
+
if (f.category)
|
|
244
|
+
filtersApplied.category = f.category;
|
|
245
|
+
if (f.all)
|
|
246
|
+
filtersApplied.all = true;
|
|
247
|
+
const result = {
|
|
248
|
+
requirements: filtered,
|
|
249
|
+
count: filtered.length,
|
|
250
|
+
filters_applied: filtersApplied,
|
|
251
|
+
};
|
|
252
|
+
output(result, raw, `${result.count} requirement(s)`);
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* CLI command: Return traceability matrix as structured JSON.
|
|
256
|
+
*/
|
|
257
|
+
function cmdRequirementTraceability(cwd, filters, raw) {
|
|
258
|
+
const f = filters || {};
|
|
259
|
+
const reqFilePath = path.join(cwd, '.planning', 'REQUIREMENTS.md');
|
|
260
|
+
const content = readCachedRequirements(reqFilePath);
|
|
261
|
+
let matrix = [];
|
|
262
|
+
if (content) {
|
|
263
|
+
matrix = parseTraceabilityMatrix(content);
|
|
264
|
+
}
|
|
265
|
+
// Apply phase filter
|
|
266
|
+
if (f.phase) {
|
|
267
|
+
matrix = matrix.filter((row) => {
|
|
268
|
+
const phaseNum = row.phase.match(/(\d+)/);
|
|
269
|
+
return phaseNum && phaseNum[1] === String(f.phase);
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
const result = { matrix, count: matrix.length };
|
|
273
|
+
output(result, raw, `${result.count} traceability entries`);
|
|
274
|
+
}
|
|
275
|
+
/** Valid requirement statuses */
|
|
276
|
+
const VALID_REQUIREMENT_STATUSES = [
|
|
277
|
+
'Pending',
|
|
278
|
+
'In Progress',
|
|
279
|
+
'Done',
|
|
280
|
+
'Deferred',
|
|
281
|
+
];
|
|
282
|
+
/**
|
|
283
|
+
* CLI command: Update the status of a requirement in the Traceability Matrix.
|
|
284
|
+
* Validates REQ-ID exists and status is valid before writing.
|
|
285
|
+
*/
|
|
286
|
+
function cmdRequirementUpdateStatus(cwd, reqId, newStatus, raw, dryRun) {
|
|
287
|
+
// Validate status
|
|
288
|
+
if (!VALID_REQUIREMENT_STATUSES.includes(newStatus)) {
|
|
289
|
+
error(`Invalid status "${newStatus}". Valid statuses: ${VALID_REQUIREMENT_STATUSES.join(', ')}`);
|
|
290
|
+
}
|
|
291
|
+
const reqFilePath = path.join(cwd, '.planning', 'REQUIREMENTS.md');
|
|
292
|
+
const content = readCachedRequirements(reqFilePath);
|
|
293
|
+
if (!content) {
|
|
294
|
+
error('REQUIREMENTS.md not found');
|
|
295
|
+
}
|
|
296
|
+
// Parse traceability matrix to validate REQ-ID exists and get old status
|
|
297
|
+
const matrix = parseTraceabilityMatrix(content);
|
|
298
|
+
const matrixRow = matrix.find((m) => m.req.toLowerCase() === reqId.toLowerCase());
|
|
299
|
+
if (!matrixRow) {
|
|
300
|
+
error(`Requirement ${reqId} not found in Traceability Matrix. Run "requirement list" to see valid requirement IDs, or check .planning/REQUIREMENTS.md`);
|
|
301
|
+
}
|
|
302
|
+
// After the error() calls above (which call process.exit), TypeScript needs
|
|
303
|
+
// to know matrixRow is defined. The error() function has return type never,
|
|
304
|
+
// so execution cannot reach here if matrixRow is undefined.
|
|
305
|
+
const row = matrixRow;
|
|
306
|
+
const oldStatus = row.status;
|
|
307
|
+
// Use regex to replace the status cell in the matching row
|
|
308
|
+
// Escape special regex characters in reqId and oldStatus
|
|
309
|
+
const escapedReqId = row.req.replace(/[-]/g, '\\-');
|
|
310
|
+
const escapedOldStatus = oldStatus.replace(/\s+/g, '\\s+');
|
|
311
|
+
const reqPattern = new RegExp(`^(\\|\\s*${escapedReqId}\\s*\\|.+\\|)\\s*${escapedOldStatus}\\s*(\\|)\\s*$`, 'im');
|
|
312
|
+
// If old and new status are the same, skip the write but still report success
|
|
313
|
+
if (oldStatus === newStatus) {
|
|
314
|
+
output({
|
|
315
|
+
updated: true,
|
|
316
|
+
id: row.req,
|
|
317
|
+
old_status: oldStatus,
|
|
318
|
+
new_status: newStatus,
|
|
319
|
+
}, raw);
|
|
320
|
+
return;
|
|
321
|
+
}
|
|
322
|
+
const updatedContent = content.replace(reqPattern, `$1 ${newStatus} $2`);
|
|
323
|
+
if (updatedContent === content) {
|
|
324
|
+
error(`Failed to update status for ${reqId} in Traceability Matrix. Ensure the requirement row format matches the expected pattern in .planning/REQUIREMENTS.md`);
|
|
325
|
+
}
|
|
326
|
+
if (dryRun) {
|
|
327
|
+
output({
|
|
328
|
+
dry_run: true,
|
|
329
|
+
id: row.req,
|
|
330
|
+
old_status: oldStatus,
|
|
331
|
+
new_status: newStatus,
|
|
332
|
+
}, raw, `dry-run: would update ${reqId} from "${oldStatus}" to "${newStatus}"`);
|
|
333
|
+
return;
|
|
334
|
+
}
|
|
335
|
+
// Write updated content back to disk and invalidate the cache so subsequent reads see the new content
|
|
336
|
+
fs.writeFileSync(reqFilePath, updatedContent, 'utf-8');
|
|
337
|
+
_reqContentCache.delete(reqFilePath);
|
|
338
|
+
output({
|
|
339
|
+
updated: true,
|
|
340
|
+
id: row.req,
|
|
341
|
+
old_status: oldStatus,
|
|
342
|
+
new_status: newStatus,
|
|
343
|
+
}, raw);
|
|
344
|
+
}
|
|
345
|
+
module.exports = {
|
|
346
|
+
readCachedRequirements,
|
|
347
|
+
parseRequirements,
|
|
348
|
+
parseTraceabilityMatrix,
|
|
349
|
+
VALID_REQUIREMENT_STATUSES,
|
|
350
|
+
cmdRequirementGet,
|
|
351
|
+
cmdRequirementList,
|
|
352
|
+
cmdRequirementTraceability,
|
|
353
|
+
cmdRequirementUpdateStatus,
|
|
354
|
+
};
|
|
355
|
+
//# sourceMappingURL=requirements.js.map
|