@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,426 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* GRD plan-tournament — scoring + selection for candidate PLAN.md files.
|
|
5
|
+
*
|
|
6
|
+
* Tier-3 #9 of the Ouroboros integration. The proposal flagged the full
|
|
7
|
+
* Kargatharaakash-style "generate N plans in parallel, keep best" as
|
|
8
|
+
* expensive + backend-variance-risky. This module ships the scoring +
|
|
9
|
+
* selection half: caller supplies candidate paths, tournament reads them,
|
|
10
|
+
* ranks them, returns the winner. Auto-generation of candidates is a
|
|
11
|
+
* deliberate follow-up so this PR does not block on worktree orchestration.
|
|
12
|
+
*
|
|
13
|
+
* Scoring axes (each in [0, 1], higher is better):
|
|
14
|
+
*
|
|
15
|
+
* completeness — fraction of required PLAN.md frontmatter fields
|
|
16
|
+
* present (phase, plan, type, wave, depends_on,
|
|
17
|
+
* files_modified, autonomous, must_haves)
|
|
18
|
+
* goal_alignment — token Jaccard overlap between PLAN's hypothesis +
|
|
19
|
+
* predicted_outcome and the ROADMAP.md phase goal.
|
|
20
|
+
* Reuses the same vocab approach as lib/drift.ts.
|
|
21
|
+
* hypothesis_quality — 1 if both top-level `hypothesis:` and
|
|
22
|
+
* `predicted_outcome:` scalars are present and
|
|
23
|
+
* non-empty (Tier-1 #1); 0 otherwise.
|
|
24
|
+
* conciseness — sigmoid penalty for token count over a budget,
|
|
25
|
+
* so a clear short plan ranks above a wordy long one
|
|
26
|
+
* with the same content.
|
|
27
|
+
*
|
|
28
|
+
* Default weights: completeness 0.35, goal_alignment 0.30,
|
|
29
|
+
* hypothesis_quality 0.20, conciseness 0.15. Configurable.
|
|
30
|
+
*/
|
|
31
|
+
|
|
32
|
+
import * as path from 'path';
|
|
33
|
+
|
|
34
|
+
const {
|
|
35
|
+
planningDir: getPlanningDir,
|
|
36
|
+
}: { planningDir: (cwd: string) => string } = require('./paths');
|
|
37
|
+
const {
|
|
38
|
+
safeReadFile,
|
|
39
|
+
safeReadMarkdown,
|
|
40
|
+
}: {
|
|
41
|
+
safeReadFile: (p: string) => string | null;
|
|
42
|
+
safeReadMarkdown: (p: string) => string | null;
|
|
43
|
+
} = require('./utils');
|
|
44
|
+
const {
|
|
45
|
+
extractFrontmatter,
|
|
46
|
+
}: { extractFrontmatter: (content: string) => Record<string, unknown> } = require('./frontmatter');
|
|
47
|
+
|
|
48
|
+
// ─── Domain Types ──────────────────────────────────────────────────────────
|
|
49
|
+
|
|
50
|
+
export interface ScoringWeights {
|
|
51
|
+
completeness: number;
|
|
52
|
+
goal_alignment: number;
|
|
53
|
+
hypothesis_quality: number;
|
|
54
|
+
conciseness: number;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export const DEFAULT_WEIGHTS: ScoringWeights = {
|
|
58
|
+
completeness: 0.35,
|
|
59
|
+
goal_alignment: 0.3,
|
|
60
|
+
hypothesis_quality: 0.2,
|
|
61
|
+
conciseness: 0.15,
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
export interface ScoreBreakdown {
|
|
65
|
+
completeness: number;
|
|
66
|
+
goal_alignment: number;
|
|
67
|
+
hypothesis_quality: number;
|
|
68
|
+
conciseness: number;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export interface CandidateResult {
|
|
72
|
+
path: string;
|
|
73
|
+
score: number;
|
|
74
|
+
breakdown: ScoreBreakdown;
|
|
75
|
+
/** Set when the candidate could not be parsed at all. */
|
|
76
|
+
error?: string;
|
|
77
|
+
/**
|
|
78
|
+
* Warning surfaced when the candidate's declared phase does not match
|
|
79
|
+
* the tournament's --phase argument. The candidate is still scored, but
|
|
80
|
+
* goal_alignment is computed against the tournament phase (not the
|
|
81
|
+
* candidate's stale phase), and this flag lets reviewers notice the
|
|
82
|
+
* mismatch in the JSON output.
|
|
83
|
+
*/
|
|
84
|
+
phase_mismatch?: string;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export interface TournamentResult {
|
|
88
|
+
winner: CandidateResult | null;
|
|
89
|
+
ranked: CandidateResult[];
|
|
90
|
+
phase: string;
|
|
91
|
+
weights: ScoringWeights;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// ─── Required frontmatter fields ───────────────────────────────────────────
|
|
95
|
+
|
|
96
|
+
const REQUIRED_FIELDS: readonly string[] = [
|
|
97
|
+
'phase',
|
|
98
|
+
'plan',
|
|
99
|
+
'type',
|
|
100
|
+
'wave',
|
|
101
|
+
'depends_on',
|
|
102
|
+
'files_modified',
|
|
103
|
+
'autonomous',
|
|
104
|
+
'must_haves',
|
|
105
|
+
];
|
|
106
|
+
|
|
107
|
+
const CONCISENESS_TARGET_TOKENS = 2000;
|
|
108
|
+
const CONCISENESS_HARD_CAP_TOKENS = 8000;
|
|
109
|
+
|
|
110
|
+
// ─── Tokenisation (shared with drift) ──────────────────────────────────────
|
|
111
|
+
|
|
112
|
+
const _STOP_WORDS: Set<string> = new Set([
|
|
113
|
+
'the', 'and', 'for', 'with', 'from', 'into', 'over', 'this', 'that',
|
|
114
|
+
'are', 'was', 'were', 'has', 'have', 'had', 'will', 'would', 'should',
|
|
115
|
+
'phase', 'plan', 'summary', 'roadmap', 'task', 'goal',
|
|
116
|
+
]);
|
|
117
|
+
|
|
118
|
+
function _tokens(text: string): Set<string> {
|
|
119
|
+
const set = new Set<string>();
|
|
120
|
+
const matches = text.toLowerCase().match(/[a-z0-9][a-z0-9_-]{2,}/g);
|
|
121
|
+
if (!matches) return set;
|
|
122
|
+
for (const t of matches) {
|
|
123
|
+
if (_STOP_WORDS.has(t)) continue;
|
|
124
|
+
set.add(t);
|
|
125
|
+
}
|
|
126
|
+
return set;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
function _jaccard(a: Set<string>, b: Set<string>): number {
|
|
130
|
+
if (a.size === 0 && b.size === 0) return 0;
|
|
131
|
+
let intersection = 0;
|
|
132
|
+
for (const x of a) if (b.has(x)) intersection++;
|
|
133
|
+
const union = a.size + b.size - intersection;
|
|
134
|
+
return union === 0 ? 0 : intersection / union;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// ─── ROADMAP goal extraction (relaxed heading levels, matches drift) ──────
|
|
138
|
+
|
|
139
|
+
function _extractRoadmapGoal(roadmap: string, phaseNumber: string): string | null {
|
|
140
|
+
// codex r3 P2 on PR #41: ROADMAP headings may use padded forms
|
|
141
|
+
// (`Phase 06.1`) for decimal phases generated by `gd phase insert`.
|
|
142
|
+
// Build the per-component number pattern to accept optional leading
|
|
143
|
+
// zeros at each level so both `Phase 6.1` and `Phase 06.1` match the
|
|
144
|
+
// same phase-number argument.
|
|
145
|
+
const trim = phaseNumber.replace(/^0+/, '') || '0';
|
|
146
|
+
const numberPattern = trim
|
|
147
|
+
.split('.')
|
|
148
|
+
.map((p) => `0*${p.replace(/^0+/, '') || '0'}`)
|
|
149
|
+
.join('\\.');
|
|
150
|
+
const re = new RegExp(
|
|
151
|
+
`(#{2,4})\\s+Phase ${numberPattern}:[^\\n]*\\n([\\s\\S]*?)(?=\\n#{2,4}\\s+Phase\\s|\\n##[^#]|$)`,
|
|
152
|
+
'i'
|
|
153
|
+
);
|
|
154
|
+
const m = roadmap.match(re);
|
|
155
|
+
return m ? m[0] : null;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
// ─── Per-axis scorers ──────────────────────────────────────────────────────
|
|
159
|
+
|
|
160
|
+
function _scoreCompleteness(fm: Record<string, unknown>): number {
|
|
161
|
+
const present = REQUIRED_FIELDS.filter((f) => fm[f] !== undefined && fm[f] !== null);
|
|
162
|
+
return present.length / REQUIRED_FIELDS.length;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
function _scoreHypothesisQuality(fm: Record<string, unknown>): number {
|
|
166
|
+
const hyp = fm['hypothesis'];
|
|
167
|
+
const pred = fm['predicted_outcome'];
|
|
168
|
+
const ok = (v: unknown): boolean => typeof v === 'string' && v.trim().length > 0;
|
|
169
|
+
return ok(hyp) && ok(pred) ? 1 : 0;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
function _scoreGoalAlignment(
|
|
173
|
+
fm: Record<string, unknown>,
|
|
174
|
+
goalText: string | null
|
|
175
|
+
): number {
|
|
176
|
+
if (!goalText) return 0;
|
|
177
|
+
const hyp = typeof fm['hypothesis'] === 'string' ? (fm['hypothesis'] as string) : '';
|
|
178
|
+
const pred = typeof fm['predicted_outcome'] === 'string' ? (fm['predicted_outcome'] as string) : '';
|
|
179
|
+
const claim = `${hyp}\n${pred}`.trim();
|
|
180
|
+
if (claim.length === 0) return 0;
|
|
181
|
+
return _jaccard(_tokens(claim), _tokens(goalText));
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
function _scoreConciseness(content: string): number {
|
|
185
|
+
// Approximate token count as whitespace-separated words. Sigmoid-ish:
|
|
186
|
+
// 1.0 at target or below, decaying smoothly toward 0 by the hard cap.
|
|
187
|
+
const tokens = content.split(/\s+/).filter((s) => s.length > 0).length;
|
|
188
|
+
if (tokens <= CONCISENESS_TARGET_TOKENS) return 1;
|
|
189
|
+
if (tokens >= CONCISENESS_HARD_CAP_TOKENS) return 0;
|
|
190
|
+
// Linear decay between target and hard cap.
|
|
191
|
+
return (
|
|
192
|
+
1 - (tokens - CONCISENESS_TARGET_TOKENS) / (CONCISENESS_HARD_CAP_TOKENS - CONCISENESS_TARGET_TOKENS)
|
|
193
|
+
);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
// ─── Proximity dedup (v0.4 Phase 4) ────────────────────────────────────────
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* v0.4 hardcoded Jaccard-similarity threshold for clustering near-identical
|
|
200
|
+
* plan candidates. Codex r8 P1: v0.4 ships zero new user-facing config knobs
|
|
201
|
+
* besides `effort`, so this is a `const` (not config). Promotion to a knob is
|
|
202
|
+
* deferred to v0.5 (DEFER-v0.4-4-threshold-tuning). Higher → fewer merges:
|
|
203
|
+
* 0.50 over-merges loosely related plans, 0.95 leaves paraphrases separate,
|
|
204
|
+
* 0.85 merges near-clones only.
|
|
205
|
+
*/
|
|
206
|
+
export const PROXIMITY_THRESHOLD = 0.85;
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* Build the clustering vocabulary for a candidate from its
|
|
210
|
+
* `files_modified` frontmatter + reflection `hypothesis` + the full plan
|
|
211
|
+
* body (covers the PLAN.md "files_modified + tasks + reflection.hypothesis"
|
|
212
|
+
* sources). Uses the same tokenizer/stopwords as drift + scoring.
|
|
213
|
+
*/
|
|
214
|
+
export function extractPlanVocabulary(
|
|
215
|
+
content: string,
|
|
216
|
+
fm: Record<string, unknown>
|
|
217
|
+
): Set<string> {
|
|
218
|
+
const filesModified: string[] = Array.isArray(fm['files_modified'])
|
|
219
|
+
? (fm['files_modified'] as unknown[]).map(String)
|
|
220
|
+
: [];
|
|
221
|
+
const hypothesis: string = typeof fm['hypothesis'] === 'string' ? (fm['hypothesis'] as string) : '';
|
|
222
|
+
return _tokens(`${filesModified.join(' ')}\n${hypothesis}\n${content}`);
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/**
|
|
226
|
+
* Single-link agglomerative clustering of candidate vocabularies by Jaccard
|
|
227
|
+
* SIMILARITY. Two candidates are linked when their Jaccard similarity is
|
|
228
|
+
* `>= threshold`; single-link means transitively connected candidates land
|
|
229
|
+
* in the same cluster (A~B and B~C ⇒ {A,B,C} even if A≁C).
|
|
230
|
+
*
|
|
231
|
+
* Returns an array of clusters, each a sorted list of the original indices
|
|
232
|
+
* into `vocabularies`. Deterministic: clusters and their members are
|
|
233
|
+
* returned in ascending-index order. Pure — no I/O, no scoring (the caller
|
|
234
|
+
* picks each cluster's representative).
|
|
235
|
+
*/
|
|
236
|
+
export function clusterByJaccard(
|
|
237
|
+
vocabularies: Set<string>[],
|
|
238
|
+
threshold: number = PROXIMITY_THRESHOLD
|
|
239
|
+
): number[][] {
|
|
240
|
+
const n = vocabularies.length;
|
|
241
|
+
// Union-find over indices.
|
|
242
|
+
const parent: number[] = Array.from({ length: n }, (_, i) => i);
|
|
243
|
+
const find = (x: number): number => {
|
|
244
|
+
let r = x;
|
|
245
|
+
while (parent[r] !== r) r = parent[r];
|
|
246
|
+
// Path compression.
|
|
247
|
+
let c = x;
|
|
248
|
+
while (parent[c] !== r) {
|
|
249
|
+
const next = parent[c];
|
|
250
|
+
parent[c] = r;
|
|
251
|
+
c = next;
|
|
252
|
+
}
|
|
253
|
+
return r;
|
|
254
|
+
};
|
|
255
|
+
const union = (a: number, b: number): void => {
|
|
256
|
+
const ra = find(a);
|
|
257
|
+
const rb = find(b);
|
|
258
|
+
if (ra !== rb) parent[Math.max(ra, rb)] = Math.min(ra, rb);
|
|
259
|
+
};
|
|
260
|
+
|
|
261
|
+
for (let i = 0; i < n; i++) {
|
|
262
|
+
for (let j = i + 1; j < n; j++) {
|
|
263
|
+
if (_jaccard(vocabularies[i], vocabularies[j]) >= threshold) union(i, j);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
const groups = new Map<number, number[]>();
|
|
268
|
+
for (let i = 0; i < n; i++) {
|
|
269
|
+
const root = find(i);
|
|
270
|
+
const g = groups.get(root);
|
|
271
|
+
if (g) g.push(i);
|
|
272
|
+
else groups.set(root, [i]);
|
|
273
|
+
}
|
|
274
|
+
// Sort clusters by their smallest member index for determinism.
|
|
275
|
+
return Array.from(groups.values()).sort((a, b) => a[0] - b[0]);
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
// ─── Public API ────────────────────────────────────────────────────────────
|
|
279
|
+
|
|
280
|
+
/**
|
|
281
|
+
* Score a single candidate PLAN.md file against the tournament's
|
|
282
|
+
* `tournamentPhase` (NOT the candidate's claimed phase — codex r1 P2
|
|
283
|
+
* caught the case where a stale wrong-phase PLAN.md scored against its
|
|
284
|
+
* own ROADMAP section and still won the tournament).
|
|
285
|
+
*
|
|
286
|
+
* If the candidate's declared `phase` does not match `tournamentPhase`,
|
|
287
|
+
* the result carries a `phase_mismatch` warning but is still scored so
|
|
288
|
+
* the caller can see *why* it ranked low instead of being silently
|
|
289
|
+
* filtered out.
|
|
290
|
+
*
|
|
291
|
+
* Returns score 0 with `error` set when the file is unreadable.
|
|
292
|
+
*/
|
|
293
|
+
function scorePlanCandidate(
|
|
294
|
+
candidatePath: string,
|
|
295
|
+
cwd: string,
|
|
296
|
+
tournamentPhase: string,
|
|
297
|
+
weights: ScoringWeights = DEFAULT_WEIGHTS
|
|
298
|
+
): CandidateResult {
|
|
299
|
+
const content = safeReadFile(candidatePath);
|
|
300
|
+
if (!content) {
|
|
301
|
+
return {
|
|
302
|
+
path: candidatePath,
|
|
303
|
+
score: 0,
|
|
304
|
+
breakdown: { completeness: 0, goal_alignment: 0, hypothesis_quality: 0, conciseness: 0 },
|
|
305
|
+
error: 'File not found or unreadable',
|
|
306
|
+
};
|
|
307
|
+
}
|
|
308
|
+
const fm = extractFrontmatter(content);
|
|
309
|
+
const completeness = _scoreCompleteness(fm);
|
|
310
|
+
const hypothesis_quality = _scoreHypothesisQuality(fm);
|
|
311
|
+
const conciseness = _scoreConciseness(content);
|
|
312
|
+
|
|
313
|
+
// codex r1 P2: goal alignment uses the TOURNAMENT phase, not whatever
|
|
314
|
+
// the candidate file declares — otherwise the tournament's --phase
|
|
315
|
+
// flag is ignored and a stale candidate can win against its own goal.
|
|
316
|
+
//
|
|
317
|
+
// codex r2 P3: strip leading zeros from both sides so `--phase 1` and
|
|
318
|
+
// `phase: 01` compare equal — they refer to the same phase, and
|
|
319
|
+
// _extractRoadmapGoal already strips leading zeros internally. Without
|
|
320
|
+
// this normalisation the mismatch warning fired spuriously on every
|
|
321
|
+
// canonical zero-padded plan file.
|
|
322
|
+
const stripLeadingZeros = (s: string): string => {
|
|
323
|
+
const m = s.match(/^(\d+(?:\.\d+)?)/);
|
|
324
|
+
if (!m) return s;
|
|
325
|
+
const major = m[1].split('.')[0].replace(/^0+/, '') || '0';
|
|
326
|
+
const decimal = m[1].includes('.') ? `.${m[1].split('.')[1]}` : '';
|
|
327
|
+
return major + decimal;
|
|
328
|
+
};
|
|
329
|
+
const normalizedTournamentPhase = stripLeadingZeros(tournamentPhase);
|
|
330
|
+
const claimedPhase =
|
|
331
|
+
typeof fm['phase'] === 'string' ? stripLeadingZeros(fm['phase'] as string) : '';
|
|
332
|
+
// codex r1 P2: use safeReadMarkdown so projects with split-format
|
|
333
|
+
// ROADMAP.md (GRD-INDEX partials) reassemble correctly. Pre-fix,
|
|
334
|
+
// safeReadFile only saw the index stub and goal_alignment was always 0.
|
|
335
|
+
const roadmap = safeReadMarkdown(path.join(getPlanningDir(cwd), 'ROADMAP.md'));
|
|
336
|
+
const goalText =
|
|
337
|
+
roadmap && normalizedTournamentPhase
|
|
338
|
+
? _extractRoadmapGoal(roadmap, normalizedTournamentPhase)
|
|
339
|
+
: null;
|
|
340
|
+
const goal_alignment = _scoreGoalAlignment(fm, goalText);
|
|
341
|
+
|
|
342
|
+
const score =
|
|
343
|
+
weights.completeness * completeness +
|
|
344
|
+
weights.goal_alignment * goal_alignment +
|
|
345
|
+
weights.hypothesis_quality * hypothesis_quality +
|
|
346
|
+
weights.conciseness * conciseness;
|
|
347
|
+
|
|
348
|
+
const result: CandidateResult = {
|
|
349
|
+
path: candidatePath,
|
|
350
|
+
score,
|
|
351
|
+
breakdown: { completeness, goal_alignment, hypothesis_quality, conciseness },
|
|
352
|
+
};
|
|
353
|
+
if (claimedPhase && claimedPhase !== normalizedTournamentPhase) {
|
|
354
|
+
result.phase_mismatch = `candidate declares phase "${claimedPhase}" but tournament is for phase "${normalizedTournamentPhase}"`;
|
|
355
|
+
}
|
|
356
|
+
return result;
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
/**
|
|
360
|
+
* Run a tournament over candidate PLAN.md paths. Returns ranked results
|
|
361
|
+
* (highest score first) plus the winner. Ties are broken deterministically
|
|
362
|
+
* by the input order (stable sort).
|
|
363
|
+
*/
|
|
364
|
+
function runTournament(
|
|
365
|
+
candidatePaths: string[],
|
|
366
|
+
cwd: string,
|
|
367
|
+
phase: string,
|
|
368
|
+
weights: ScoringWeights = DEFAULT_WEIGHTS
|
|
369
|
+
): TournamentResult {
|
|
370
|
+
const results: CandidateResult[] = candidatePaths.map((p) =>
|
|
371
|
+
scorePlanCandidate(p, cwd, phase, weights)
|
|
372
|
+
);
|
|
373
|
+
// Stable sort: assign indices, sort by (score desc, index asc).
|
|
374
|
+
const indexed = results.map((r, i) => ({ r, i }));
|
|
375
|
+
indexed.sort((a, b) => {
|
|
376
|
+
if (b.r.score !== a.r.score) return b.r.score - a.r.score;
|
|
377
|
+
return a.i - b.i;
|
|
378
|
+
});
|
|
379
|
+
const ranked = indexed.map((x) => x.r);
|
|
380
|
+
const winner = ranked.length > 0 && ranked[0].score > 0 ? ranked[0] : null;
|
|
381
|
+
return { winner, ranked, phase, weights };
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
// ─── CLI ───────────────────────────────────────────────────────────────────
|
|
385
|
+
|
|
386
|
+
const {
|
|
387
|
+
output,
|
|
388
|
+
error,
|
|
389
|
+
}: {
|
|
390
|
+
output: (result: unknown, raw: boolean, rawValue?: unknown) => never;
|
|
391
|
+
error: (message: string) => never;
|
|
392
|
+
} = require('./utils');
|
|
393
|
+
|
|
394
|
+
function cmdPlanTournament(
|
|
395
|
+
cwd: string,
|
|
396
|
+
opts: { phase: string; candidates: string[]; weights?: ScoringWeights },
|
|
397
|
+
raw: boolean
|
|
398
|
+
): void {
|
|
399
|
+
if (!opts.phase) error('--phase required');
|
|
400
|
+
if (!opts.candidates || opts.candidates.length === 0) {
|
|
401
|
+
error('--candidates required (one or more PLAN.md paths)');
|
|
402
|
+
}
|
|
403
|
+
// Resolve relative paths against cwd
|
|
404
|
+
const resolved = opts.candidates.map((p) =>
|
|
405
|
+
path.isAbsolute(p) ? p : path.join(cwd, p)
|
|
406
|
+
);
|
|
407
|
+
const result = runTournament(resolved, cwd, opts.phase, opts.weights);
|
|
408
|
+
output(
|
|
409
|
+
result,
|
|
410
|
+
raw,
|
|
411
|
+
result.winner
|
|
412
|
+
? `winner: ${path.relative(cwd, result.winner.path)} (score ${result.winner.score.toFixed(3)})`
|
|
413
|
+
: 'no viable winner'
|
|
414
|
+
);
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
module.exports = {
|
|
418
|
+
scorePlanCandidate,
|
|
419
|
+
runTournament,
|
|
420
|
+
cmdPlanTournament,
|
|
421
|
+
DEFAULT_WEIGHTS,
|
|
422
|
+
// v0.4 Phase 4: proximity dedup
|
|
423
|
+
PROXIMITY_THRESHOLD,
|
|
424
|
+
extractPlanVocabulary,
|
|
425
|
+
clusterByJaccard,
|
|
426
|
+
};
|