@jokerized/getresearchdone 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/plugin.json +103 -0
- package/README.md +211 -0
- package/agents/grd-baseline-assessor.md +684 -0
- package/agents/grd-code-reviewer.md +300 -0
- package/agents/grd-codebase-mapper.md +355 -0
- package/agents/grd-critique-agent.md +119 -0
- package/agents/grd-debugger.md +519 -0
- package/agents/grd-deep-diver.md +737 -0
- package/agents/grd-eval-planner.md +913 -0
- package/agents/grd-eval-reporter.md +717 -0
- package/agents/grd-executor.md +683 -0
- package/agents/grd-feasibility-analyst.md +624 -0
- package/agents/grd-integration-checker.md +367 -0
- package/agents/grd-knowledge-miner.md +81 -0
- package/agents/grd-migrator.md +88 -0
- package/agents/grd-phase-researcher.md +697 -0
- package/agents/grd-plan-checker.md +443 -0
- package/agents/grd-planner.md +1532 -0
- package/agents/grd-product-owner.md +562 -0
- package/agents/grd-project-researcher.md +513 -0
- package/agents/grd-research-synthesizer.md +273 -0
- package/agents/grd-roadmapper.md +798 -0
- package/agents/grd-surveyor.md +566 -0
- package/agents/grd-verifier.md +893 -0
- package/bin/gd.js +4 -0
- package/bin/gd.ts +227 -0
- package/bin/grd-manifest.js +4 -0
- package/bin/grd-manifest.ts +286 -0
- package/bin/grd-mcp-server.js +4 -0
- package/bin/grd-mcp-server.ts +124 -0
- package/bin/grd-tools.js +4 -0
- package/bin/grd-tools.ts +2471 -0
- package/bin/postinstall.js +4 -0
- package/bin/postinstall.ts +80 -0
- package/commands/add-phase.md +123 -0
- package/commands/add-todo.md +87 -0
- package/commands/assess-baseline.md +289 -0
- package/commands/autopilot.md +100 -0
- package/commands/autoplan.md +55 -0
- package/commands/check-todos.md +87 -0
- package/commands/compare-methods.md +262 -0
- package/commands/complete-milestone.md +225 -0
- package/commands/debug.md +372 -0
- package/commands/deep-dive.md +288 -0
- package/commands/discover.md +281 -0
- package/commands/discuss-phase.md +188 -0
- package/commands/discuss.md +55 -0
- package/commands/eval-report.md +310 -0
- package/commands/evolve.md +79 -0
- package/commands/execute-phase.md +1017 -0
- package/commands/feasibility.md +292 -0
- package/commands/help.md +407 -0
- package/commands/init.md +1508 -0
- package/commands/insert-phase.md +113 -0
- package/commands/iterate.md +327 -0
- package/commands/list-phase-assumptions.md +217 -0
- package/commands/long-term-roadmap.md +202 -0
- package/commands/map-codebase.md +111 -0
- package/commands/migrate.md +159 -0
- package/commands/new-milestone.md +169 -0
- package/commands/pause-work.md +83 -0
- package/commands/plan-milestone-gaps.md +373 -0
- package/commands/plan-phase.md +655 -0
- package/commands/principles.md +328 -0
- package/commands/product-plan.md +319 -0
- package/commands/progress.md +481 -0
- package/commands/quick.md +167 -0
- package/commands/reapply-patches.md +154 -0
- package/commands/remove-phase.md +97 -0
- package/commands/requirement.md +96 -0
- package/commands/resume-project.md +113 -0
- package/commands/settings.md +1144 -0
- package/commands/survey.md +242 -0
- package/commands/sync.md +246 -0
- package/commands/tracker-setup.md +322 -0
- package/commands/update.md +202 -0
- package/commands/verify-phase.md +335 -0
- package/commands/verify-work.md +701 -0
- package/commands/wireup.md +29 -0
- package/dist/bin/gd.d.ts +3 -0
- package/dist/bin/gd.d.ts.map +1 -0
- package/dist/bin/gd.js +178 -0
- package/dist/bin/gd.js.map +1 -0
- package/dist/bin/grd-manifest.d.ts +3 -0
- package/dist/bin/grd-manifest.d.ts.map +1 -0
- package/dist/bin/grd-manifest.js +202 -0
- package/dist/bin/grd-manifest.js.map +1 -0
- package/dist/bin/grd-mcp-server.d.ts +3 -0
- package/dist/bin/grd-mcp-server.d.ts.map +1 -0
- package/dist/bin/grd-mcp-server.js +71 -0
- package/dist/bin/grd-mcp-server.js.map +1 -0
- package/dist/bin/grd-tools.d.ts +3 -0
- package/dist/bin/grd-tools.d.ts.map +1 -0
- package/dist/bin/grd-tools.js +1680 -0
- package/dist/bin/grd-tools.js.map +1 -0
- package/dist/bin/postinstall.d.ts +3 -0
- package/dist/bin/postinstall.d.ts.map +1 -0
- package/dist/bin/postinstall.js +61 -0
- package/dist/bin/postinstall.js.map +1 -0
- package/dist/lib/autopilot-milestone.d.ts +2 -0
- package/dist/lib/autopilot-milestone.d.ts.map +1 -0
- package/dist/lib/autopilot-milestone.js +94 -0
- package/dist/lib/autopilot-milestone.js.map +1 -0
- package/dist/lib/autopilot-pipeline.d.ts +2 -0
- package/dist/lib/autopilot-pipeline.d.ts.map +1 -0
- package/dist/lib/autopilot-pipeline.js +830 -0
- package/dist/lib/autopilot-pipeline.js.map +1 -0
- package/dist/lib/autopilot-waves.d.ts +2 -0
- package/dist/lib/autopilot-waves.d.ts.map +1 -0
- package/dist/lib/autopilot-waves.js +266 -0
- package/dist/lib/autopilot-waves.js.map +1 -0
- package/dist/lib/autopilot.d.ts +2 -0
- package/dist/lib/autopilot.d.ts.map +1 -0
- package/dist/lib/autopilot.js +1314 -0
- package/dist/lib/autopilot.js.map +1 -0
- package/dist/lib/autoplan.d.ts +2 -0
- package/dist/lib/autoplan.d.ts.map +1 -0
- package/dist/lib/autoplan.js +198 -0
- package/dist/lib/autoplan.js.map +1 -0
- package/dist/lib/autoresearch.d.ts +2 -0
- package/dist/lib/autoresearch.d.ts.map +1 -0
- package/dist/lib/autoresearch.js +626 -0
- package/dist/lib/autoresearch.js.map +1 -0
- package/dist/lib/backend.d.ts +2 -0
- package/dist/lib/backend.d.ts.map +1 -0
- package/dist/lib/backend.js +1036 -0
- package/dist/lib/backend.js.map +1 -0
- package/dist/lib/benchmark.d.ts +99 -0
- package/dist/lib/benchmark.d.ts.map +1 -0
- package/dist/lib/benchmark.js +278 -0
- package/dist/lib/benchmark.js.map +1 -0
- package/dist/lib/citations.d.ts +2 -0
- package/dist/lib/citations.d.ts.map +1 -0
- package/dist/lib/citations.js +642 -0
- package/dist/lib/citations.js.map +1 -0
- package/dist/lib/cleanup.d.ts +2 -0
- package/dist/lib/cleanup.d.ts.map +1 -0
- package/dist/lib/cleanup.js +1222 -0
- package/dist/lib/cleanup.js.map +1 -0
- package/dist/lib/cli/adapters.d.ts +10 -0
- package/dist/lib/cli/adapters.d.ts.map +1 -0
- package/dist/lib/cli/adapters.js +27 -0
- package/dist/lib/cli/adapters.js.map +1 -0
- package/dist/lib/cli/agent.d.ts +17 -0
- package/dist/lib/cli/agent.d.ts.map +1 -0
- package/dist/lib/cli/agent.js +53 -0
- package/dist/lib/cli/agent.js.map +1 -0
- package/dist/lib/cli/index.d.ts +21 -0
- package/dist/lib/cli/index.d.ts.map +1 -0
- package/dist/lib/cli/index.js +264 -0
- package/dist/lib/cli/index.js.map +1 -0
- package/dist/lib/cli/output.d.ts +20 -0
- package/dist/lib/cli/output.d.ts.map +1 -0
- package/dist/lib/cli/output.js +22 -0
- package/dist/lib/cli/output.js.map +1 -0
- package/dist/lib/cli/scan-dispatch.d.ts +9 -0
- package/dist/lib/cli/scan-dispatch.d.ts.map +1 -0
- package/dist/lib/cli/scan-dispatch.js +107 -0
- package/dist/lib/cli/scan-dispatch.js.map +1 -0
- package/dist/lib/cli/tools.d.ts +16 -0
- package/dist/lib/cli/tools.d.ts.map +1 -0
- package/dist/lib/cli/tools.js +168 -0
- package/dist/lib/cli/tools.js.map +1 -0
- package/dist/lib/commands/_dashboard-parsers.d.ts +2 -0
- package/dist/lib/commands/_dashboard-parsers.d.ts.map +1 -0
- package/dist/lib/commands/_dashboard-parsers.js +192 -0
- package/dist/lib/commands/_dashboard-parsers.js.map +1 -0
- package/dist/lib/commands/analysis.d.ts +2 -0
- package/dist/lib/commands/analysis.d.ts.map +1 -0
- package/dist/lib/commands/analysis.js +1418 -0
- package/dist/lib/commands/analysis.js.map +1 -0
- package/dist/lib/commands/assumptions.d.ts +2 -0
- package/dist/lib/commands/assumptions.d.ts.map +1 -0
- package/dist/lib/commands/assumptions.js +166 -0
- package/dist/lib/commands/assumptions.js.map +1 -0
- package/dist/lib/commands/blame.d.ts +2 -0
- package/dist/lib/commands/blame.d.ts.map +1 -0
- package/dist/lib/commands/blame.js +133 -0
- package/dist/lib/commands/blame.js.map +1 -0
- package/dist/lib/commands/budget.d.ts +2 -0
- package/dist/lib/commands/budget.d.ts.map +1 -0
- package/dist/lib/commands/budget.js +100 -0
- package/dist/lib/commands/budget.js.map +1 -0
- package/dist/lib/commands/check-plans.d.ts +2 -0
- package/dist/lib/commands/check-plans.d.ts.map +1 -0
- package/dist/lib/commands/check-plans.js +190 -0
- package/dist/lib/commands/check-plans.js.map +1 -0
- package/dist/lib/commands/config.d.ts +2 -0
- package/dist/lib/commands/config.d.ts.map +1 -0
- package/dist/lib/commands/config.js +188 -0
- package/dist/lib/commands/config.js.map +1 -0
- package/dist/lib/commands/dashboard.d.ts +2 -0
- package/dist/lib/commands/dashboard.d.ts.map +1 -0
- package/dist/lib/commands/dashboard.js +466 -0
- package/dist/lib/commands/dashboard.js.map +1 -0
- package/dist/lib/commands/estimate.d.ts +2 -0
- package/dist/lib/commands/estimate.d.ts.map +1 -0
- package/dist/lib/commands/estimate.js +148 -0
- package/dist/lib/commands/estimate.js.map +1 -0
- package/dist/lib/commands/eval-diff.d.ts +2 -0
- package/dist/lib/commands/eval-diff.d.ts.map +1 -0
- package/dist/lib/commands/eval-diff.js +213 -0
- package/dist/lib/commands/eval-diff.js.map +1 -0
- package/dist/lib/commands/freshness.d.ts +2 -0
- package/dist/lib/commands/freshness.d.ts.map +1 -0
- package/dist/lib/commands/freshness.js +163 -0
- package/dist/lib/commands/freshness.js.map +1 -0
- package/dist/lib/commands/health.d.ts +2 -0
- package/dist/lib/commands/health.d.ts.map +1 -0
- package/dist/lib/commands/health.js +435 -0
- package/dist/lib/commands/health.js.map +1 -0
- package/dist/lib/commands/index.d.ts +2 -0
- package/dist/lib/commands/index.d.ts.map +1 -0
- package/dist/lib/commands/index.js +128 -0
- package/dist/lib/commands/index.js.map +1 -0
- package/dist/lib/commands/install.d.ts +56 -0
- package/dist/lib/commands/install.d.ts.map +1 -0
- package/dist/lib/commands/install.js +214 -0
- package/dist/lib/commands/install.js.map +1 -0
- package/dist/lib/commands/knowhow-aggregator.d.ts +2 -0
- package/dist/lib/commands/knowhow-aggregator.d.ts.map +1 -0
- package/dist/lib/commands/knowhow-aggregator.js +279 -0
- package/dist/lib/commands/knowhow-aggregator.js.map +1 -0
- package/dist/lib/commands/knowledge-search.d.ts +2 -0
- package/dist/lib/commands/knowledge-search.d.ts.map +1 -0
- package/dist/lib/commands/knowledge-search.js +113 -0
- package/dist/lib/commands/knowledge-search.js.map +1 -0
- package/dist/lib/commands/long-term-roadmap.d.ts +2 -0
- package/dist/lib/commands/long-term-roadmap.d.ts.map +1 -0
- package/dist/lib/commands/long-term-roadmap.js +272 -0
- package/dist/lib/commands/long-term-roadmap.js.map +1 -0
- package/dist/lib/commands/patterns.d.ts +91 -0
- package/dist/lib/commands/patterns.d.ts.map +1 -0
- package/dist/lib/commands/patterns.js +391 -0
- package/dist/lib/commands/patterns.js.map +1 -0
- package/dist/lib/commands/phase-info.d.ts +2 -0
- package/dist/lib/commands/phase-info.d.ts.map +1 -0
- package/dist/lib/commands/phase-info.js +509 -0
- package/dist/lib/commands/phase-info.js.map +1 -0
- package/dist/lib/commands/plan-lint.d.ts +56 -0
- package/dist/lib/commands/plan-lint.d.ts.map +1 -0
- package/dist/lib/commands/plan-lint.js +481 -0
- package/dist/lib/commands/plan-lint.js.map +1 -0
- package/dist/lib/commands/plan-phase.d.ts +53 -0
- package/dist/lib/commands/plan-phase.d.ts.map +1 -0
- package/dist/lib/commands/plan-phase.js +288 -0
- package/dist/lib/commands/plan-phase.js.map +1 -0
- package/dist/lib/commands/progress.d.ts +2 -0
- package/dist/lib/commands/progress.d.ts.map +1 -0
- package/dist/lib/commands/progress.js +266 -0
- package/dist/lib/commands/progress.js.map +1 -0
- package/dist/lib/commands/quality.d.ts +2 -0
- package/dist/lib/commands/quality.d.ts.map +1 -0
- package/dist/lib/commands/quality.js +80 -0
- package/dist/lib/commands/quality.js.map +1 -0
- package/dist/lib/commands/rollback.d.ts +2 -0
- package/dist/lib/commands/rollback.d.ts.map +1 -0
- package/dist/lib/commands/rollback.js +145 -0
- package/dist/lib/commands/rollback.js.map +1 -0
- package/dist/lib/commands/scan.d.ts +25 -0
- package/dist/lib/commands/scan.d.ts.map +1 -0
- package/dist/lib/commands/scan.js +28 -0
- package/dist/lib/commands/scan.js.map +1 -0
- package/dist/lib/commands/search.d.ts +2 -0
- package/dist/lib/commands/search.d.ts.map +1 -0
- package/dist/lib/commands/search.js +212 -0
- package/dist/lib/commands/search.js.map +1 -0
- package/dist/lib/commands/select-candidate.d.ts +128 -0
- package/dist/lib/commands/select-candidate.d.ts.map +1 -0
- package/dist/lib/commands/select-candidate.js +518 -0
- package/dist/lib/commands/select-candidate.js.map +1 -0
- package/dist/lib/commands/singularity.d.ts +2 -0
- package/dist/lib/commands/singularity.d.ts.map +1 -0
- package/dist/lib/commands/singularity.js +185 -0
- package/dist/lib/commands/singularity.js.map +1 -0
- package/dist/lib/commands/slug-timestamp.d.ts +2 -0
- package/dist/lib/commands/slug-timestamp.d.ts.map +1 -0
- package/dist/lib/commands/slug-timestamp.js +54 -0
- package/dist/lib/commands/slug-timestamp.js.map +1 -0
- package/dist/lib/commands/tail.d.ts +2 -0
- package/dist/lib/commands/tail.d.ts.map +1 -0
- package/dist/lib/commands/tail.js +100 -0
- package/dist/lib/commands/tail.js.map +1 -0
- package/dist/lib/commands/todo.d.ts +2 -0
- package/dist/lib/commands/todo.d.ts.map +1 -0
- package/dist/lib/commands/todo.js +200 -0
- package/dist/lib/commands/todo.js.map +1 -0
- package/dist/lib/commands/watch.d.ts +2 -0
- package/dist/lib/commands/watch.d.ts.map +1 -0
- package/dist/lib/commands/watch.js +72 -0
- package/dist/lib/commands/watch.js.map +1 -0
- package/dist/lib/complexity.d.ts +55 -0
- package/dist/lib/complexity.d.ts.map +1 -0
- package/dist/lib/complexity.js +80 -0
- package/dist/lib/complexity.js.map +1 -0
- package/dist/lib/context/agents.d.ts +2 -0
- package/dist/lib/context/agents.d.ts.map +1 -0
- package/dist/lib/context/agents.js +344 -0
- package/dist/lib/context/agents.js.map +1 -0
- package/dist/lib/context/base.d.ts +2 -0
- package/dist/lib/context/base.d.ts.map +1 -0
- package/dist/lib/context/base.js +81 -0
- package/dist/lib/context/base.js.map +1 -0
- package/dist/lib/context/execute.d.ts +2 -0
- package/dist/lib/context/execute.d.ts.map +1 -0
- package/dist/lib/context/execute.js +753 -0
- package/dist/lib/context/execute.js.map +1 -0
- package/dist/lib/context/index.d.ts +2 -0
- package/dist/lib/context/index.d.ts.map +1 -0
- package/dist/lib/context/index.js +88 -0
- package/dist/lib/context/index.js.map +1 -0
- package/dist/lib/context/progress.d.ts +2 -0
- package/dist/lib/context/progress.d.ts.map +1 -0
- package/dist/lib/context/progress.js +178 -0
- package/dist/lib/context/progress.js.map +1 -0
- package/dist/lib/context/project.d.ts +2 -0
- package/dist/lib/context/project.d.ts.map +1 -0
- package/dist/lib/context/project.js +413 -0
- package/dist/lib/context/project.js.map +1 -0
- package/dist/lib/context/research.d.ts +2 -0
- package/dist/lib/context/research.d.ts.map +1 -0
- package/dist/lib/context/research.js +466 -0
- package/dist/lib/context/research.js.map +1 -0
- package/dist/lib/dead-ends.d.ts +28 -0
- package/dist/lib/dead-ends.d.ts.map +1 -0
- package/dist/lib/dead-ends.js +451 -0
- package/dist/lib/dead-ends.js.map +1 -0
- package/dist/lib/deps.d.ts +2 -0
- package/dist/lib/deps.d.ts.map +1 -0
- package/dist/lib/deps.js +630 -0
- package/dist/lib/deps.js.map +1 -0
- package/dist/lib/discussion.d.ts +2 -0
- package/dist/lib/discussion.d.ts.map +1 -0
- package/dist/lib/discussion.js +1041 -0
- package/dist/lib/discussion.js.map +1 -0
- package/dist/lib/drift.d.ts +36 -0
- package/dist/lib/drift.d.ts.map +1 -0
- package/dist/lib/drift.js +481 -0
- package/dist/lib/drift.js.map +1 -0
- package/dist/lib/evolve/_dimensions-features.d.ts +2 -0
- package/dist/lib/evolve/_dimensions-features.d.ts.map +1 -0
- package/dist/lib/evolve/_dimensions-features.js +369 -0
- package/dist/lib/evolve/_dimensions-features.js.map +1 -0
- package/dist/lib/evolve/_dimensions.d.ts +2 -0
- package/dist/lib/evolve/_dimensions.d.ts.map +1 -0
- package/dist/lib/evolve/_dimensions.js +358 -0
- package/dist/lib/evolve/_dimensions.js.map +1 -0
- package/dist/lib/evolve/_product-ideation.d.ts +2 -0
- package/dist/lib/evolve/_product-ideation.d.ts.map +1 -0
- package/dist/lib/evolve/_product-ideation.js +281 -0
- package/dist/lib/evolve/_product-ideation.js.map +1 -0
- package/dist/lib/evolve/_prompts.d.ts +2 -0
- package/dist/lib/evolve/_prompts.d.ts.map +1 -0
- package/dist/lib/evolve/_prompts.js +153 -0
- package/dist/lib/evolve/_prompts.js.map +1 -0
- package/dist/lib/evolve/cli.d.ts +2 -0
- package/dist/lib/evolve/cli.d.ts.map +1 -0
- package/dist/lib/evolve/cli.js +224 -0
- package/dist/lib/evolve/cli.js.map +1 -0
- package/dist/lib/evolve/discovery.d.ts +2 -0
- package/dist/lib/evolve/discovery.d.ts.map +1 -0
- package/dist/lib/evolve/discovery.js +391 -0
- package/dist/lib/evolve/discovery.js.map +1 -0
- package/dist/lib/evolve/index.d.ts +2 -0
- package/dist/lib/evolve/index.d.ts.map +1 -0
- package/dist/lib/evolve/index.js +88 -0
- package/dist/lib/evolve/index.js.map +1 -0
- package/dist/lib/evolve/orchestrator.d.ts +2 -0
- package/dist/lib/evolve/orchestrator.d.ts.map +1 -0
- package/dist/lib/evolve/orchestrator.js +851 -0
- package/dist/lib/evolve/orchestrator.js.map +1 -0
- package/dist/lib/evolve/scoring.d.ts +2 -0
- package/dist/lib/evolve/scoring.d.ts.map +1 -0
- package/dist/lib/evolve/scoring.js +118 -0
- package/dist/lib/evolve/scoring.js.map +1 -0
- package/dist/lib/evolve/state.d.ts +2 -0
- package/dist/lib/evolve/state.d.ts.map +1 -0
- package/dist/lib/evolve/state.js +264 -0
- package/dist/lib/evolve/state.js.map +1 -0
- package/dist/lib/evolve/types.d.ts +249 -0
- package/dist/lib/evolve/types.d.ts.map +1 -0
- package/dist/lib/evolve/types.js +3 -0
- package/dist/lib/evolve/types.js.map +1 -0
- package/dist/lib/frontmatter.d.ts +2 -0
- package/dist/lib/frontmatter.d.ts.map +1 -0
- package/dist/lib/frontmatter.js +513 -0
- package/dist/lib/frontmatter.js.map +1 -0
- package/dist/lib/gates.d.ts +2 -0
- package/dist/lib/gates.d.ts.map +1 -0
- package/dist/lib/gates.js +578 -0
- package/dist/lib/gates.js.map +1 -0
- package/dist/lib/genome.d.ts +10 -0
- package/dist/lib/genome.d.ts.map +1 -0
- package/dist/lib/genome.js +368 -0
- package/dist/lib/genome.js.map +1 -0
- package/dist/lib/got.d.ts +2 -0
- package/dist/lib/got.d.ts.map +1 -0
- package/dist/lib/got.js +280 -0
- package/dist/lib/got.js.map +1 -0
- package/dist/lib/invariants.d.ts +2 -0
- package/dist/lib/invariants.d.ts.map +1 -0
- package/dist/lib/invariants.js +298 -0
- package/dist/lib/invariants.js.map +1 -0
- package/dist/lib/knowledge.d.ts +2 -0
- package/dist/lib/knowledge.d.ts.map +1 -0
- package/dist/lib/knowledge.js +658 -0
- package/dist/lib/knowledge.js.map +1 -0
- package/dist/lib/long-term-roadmap.d.ts +2 -0
- package/dist/lib/long-term-roadmap.d.ts.map +1 -0
- package/dist/lib/long-term-roadmap.js +602 -0
- package/dist/lib/long-term-roadmap.js.map +1 -0
- package/dist/lib/markdown-split.d.ts +2 -0
- package/dist/lib/markdown-split.d.ts.map +1 -0
- package/dist/lib/markdown-split.js +199 -0
- package/dist/lib/markdown-split.js.map +1 -0
- package/dist/lib/mcp-server.d.ts +2 -0
- package/dist/lib/mcp-server.d.ts.map +1 -0
- package/dist/lib/mcp-server.js +2424 -0
- package/dist/lib/mcp-server.js.map +1 -0
- package/dist/lib/metrics.d.ts +16 -0
- package/dist/lib/metrics.d.ts.map +1 -0
- package/dist/lib/metrics.js +48 -0
- package/dist/lib/metrics.js.map +1 -0
- package/dist/lib/overstory.d.ts +2 -0
- package/dist/lib/overstory.d.ts.map +1 -0
- package/dist/lib/overstory.js +211 -0
- package/dist/lib/overstory.js.map +1 -0
- package/dist/lib/parallel.d.ts +2 -0
- package/dist/lib/parallel.d.ts.map +1 -0
- package/dist/lib/parallel.js +349 -0
- package/dist/lib/parallel.js.map +1 -0
- package/dist/lib/paths.d.ts +2 -0
- package/dist/lib/paths.d.ts.map +1 -0
- package/dist/lib/paths.js +254 -0
- package/dist/lib/paths.js.map +1 -0
- package/dist/lib/phase-complete-llm.d.ts +22 -0
- package/dist/lib/phase-complete-llm.d.ts.map +1 -0
- package/dist/lib/phase-complete-llm.js +331 -0
- package/dist/lib/phase-complete-llm.js.map +1 -0
- package/dist/lib/phase-complete.d.ts +46 -0
- package/dist/lib/phase-complete.d.ts.map +1 -0
- package/dist/lib/phase-complete.js +278 -0
- package/dist/lib/phase-complete.js.map +1 -0
- package/dist/lib/phase-io.d.ts +2 -0
- package/dist/lib/phase-io.d.ts.map +1 -0
- package/dist/lib/phase-io.js +126 -0
- package/dist/lib/phase-io.js.map +1 -0
- package/dist/lib/phase.d.ts +2 -0
- package/dist/lib/phase.d.ts.map +1 -0
- package/dist/lib/phase.js +1344 -0
- package/dist/lib/phase.js.map +1 -0
- package/dist/lib/plan-tournament.d.ts +63 -0
- package/dist/lib/plan-tournament.d.ts.map +1 -0
- package/dist/lib/plan-tournament.js +353 -0
- package/dist/lib/plan-tournament.js.map +1 -0
- package/dist/lib/refinement.d.ts +74 -0
- package/dist/lib/refinement.d.ts.map +1 -0
- package/dist/lib/refinement.js +283 -0
- package/dist/lib/refinement.js.map +1 -0
- package/dist/lib/requirements.d.ts +2 -0
- package/dist/lib/requirements.d.ts.map +1 -0
- package/dist/lib/requirements.js +355 -0
- package/dist/lib/requirements.js.map +1 -0
- package/dist/lib/research-bundle.d.ts +2 -0
- package/dist/lib/research-bundle.d.ts.map +1 -0
- package/dist/lib/research-bundle.js +246 -0
- package/dist/lib/research-bundle.js.map +1 -0
- package/dist/lib/roadmap.d.ts +2 -0
- package/dist/lib/roadmap.d.ts.map +1 -0
- package/dist/lib/roadmap.js +541 -0
- package/dist/lib/roadmap.js.map +1 -0
- package/dist/lib/sample.d.ts +16 -0
- package/dist/lib/sample.d.ts.map +1 -0
- package/dist/lib/sample.js +20 -0
- package/dist/lib/sample.js.map +1 -0
- package/dist/lib/scaffold.d.ts +2 -0
- package/dist/lib/scaffold.d.ts.map +1 -0
- package/dist/lib/scaffold.js +355 -0
- package/dist/lib/scaffold.js.map +1 -0
- package/dist/lib/scan/_utils.d.ts +11 -0
- package/dist/lib/scan/_utils.d.ts.map +1 -0
- package/dist/lib/scan/_utils.js +36 -0
- package/dist/lib/scan/_utils.js.map +1 -0
- package/dist/lib/scan/base64.d.ts +15 -0
- package/dist/lib/scan/base64.d.ts.map +1 -0
- package/dist/lib/scan/base64.js +66 -0
- package/dist/lib/scan/base64.js.map +1 -0
- package/dist/lib/scan/ignorefile.d.ts +30 -0
- package/dist/lib/scan/ignorefile.d.ts.map +1 -0
- package/dist/lib/scan/ignorefile.js +101 -0
- package/dist/lib/scan/ignorefile.js.map +1 -0
- package/dist/lib/scan/injection.d.ts +14 -0
- package/dist/lib/scan/injection.d.ts.map +1 -0
- package/dist/lib/scan/injection.js +39 -0
- package/dist/lib/scan/injection.js.map +1 -0
- package/dist/lib/scan/patterns.d.ts +17 -0
- package/dist/lib/scan/patterns.d.ts.map +1 -0
- package/dist/lib/scan/patterns.js +123 -0
- package/dist/lib/scan/patterns.js.map +1 -0
- package/dist/lib/scan/strip-markdown.d.ts +7 -0
- package/dist/lib/scan/strip-markdown.d.ts.map +1 -0
- package/dist/lib/scan/strip-markdown.js +38 -0
- package/dist/lib/scan/strip-markdown.js.map +1 -0
- package/dist/lib/scan/types.d.ts +23 -0
- package/dist/lib/scan/types.d.ts.map +1 -0
- package/dist/lib/scan/types.js +3 -0
- package/dist/lib/scan/types.js.map +1 -0
- package/dist/lib/scheduler-wait.d.ts +2 -0
- package/dist/lib/scheduler-wait.d.ts.map +1 -0
- package/dist/lib/scheduler-wait.js +59 -0
- package/dist/lib/scheduler-wait.js.map +1 -0
- package/dist/lib/scheduler.d.ts +254 -0
- package/dist/lib/scheduler.d.ts.map +1 -0
- package/dist/lib/scheduler.js +1147 -0
- package/dist/lib/scheduler.js.map +1 -0
- package/dist/lib/state.d.ts +2 -0
- package/dist/lib/state.d.ts.map +1 -0
- package/dist/lib/state.js +744 -0
- package/dist/lib/state.js.map +1 -0
- package/dist/lib/think.d.ts +18 -0
- package/dist/lib/think.d.ts.map +1 -0
- package/dist/lib/think.js +317 -0
- package/dist/lib/think.js.map +1 -0
- package/dist/lib/tracker.d.ts +2 -0
- package/dist/lib/tracker.d.ts.map +1 -0
- package/dist/lib/tracker.js +1121 -0
- package/dist/lib/tracker.js.map +1 -0
- package/dist/lib/types.d.ts +1514 -0
- package/dist/lib/types.d.ts.map +1 -0
- package/dist/lib/types.js +4 -0
- package/dist/lib/types.js.map +1 -0
- package/dist/lib/utils.d.ts +2 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/utils.js +1363 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/lib/verify.d.ts +2 -0
- package/dist/lib/verify.d.ts.map +1 -0
- package/dist/lib/verify.js +1153 -0
- package/dist/lib/verify.js.map +1 -0
- package/dist/lib/wireup/autofix.d.ts +2 -0
- package/dist/lib/wireup/autofix.d.ts.map +1 -0
- package/dist/lib/wireup/autofix.js +188 -0
- package/dist/lib/wireup/autofix.js.map +1 -0
- package/dist/lib/wireup/cli.d.ts +2 -0
- package/dist/lib/wireup/cli.d.ts.map +1 -0
- package/dist/lib/wireup/cli.js +194 -0
- package/dist/lib/wireup/cli.js.map +1 -0
- package/dist/lib/wireup/detection.d.ts +47 -0
- package/dist/lib/wireup/detection.d.ts.map +1 -0
- package/dist/lib/wireup/detection.js +410 -0
- package/dist/lib/wireup/detection.js.map +1 -0
- package/dist/lib/wireup/discovery.d.ts +2 -0
- package/dist/lib/wireup/discovery.d.ts.map +1 -0
- package/dist/lib/wireup/discovery.js +934 -0
- package/dist/lib/wireup/discovery.js.map +1 -0
- package/dist/lib/wireup/execution.d.ts +2 -0
- package/dist/lib/wireup/execution.d.ts.map +1 -0
- package/dist/lib/wireup/execution.js +573 -0
- package/dist/lib/wireup/execution.js.map +1 -0
- package/dist/lib/wireup/index.d.ts +2 -0
- package/dist/lib/wireup/index.d.ts.map +1 -0
- package/dist/lib/wireup/index.js +85 -0
- package/dist/lib/wireup/index.js.map +1 -0
- package/dist/lib/wireup/orchestrator.d.ts +2 -0
- package/dist/lib/wireup/orchestrator.d.ts.map +1 -0
- package/dist/lib/wireup/orchestrator.js +366 -0
- package/dist/lib/wireup/orchestrator.js.map +1 -0
- package/dist/lib/wireup/report.d.ts +47 -0
- package/dist/lib/wireup/report.d.ts.map +1 -0
- package/dist/lib/wireup/report.js +201 -0
- package/dist/lib/wireup/report.js.map +1 -0
- package/dist/lib/wireup/scenarios.d.ts +2 -0
- package/dist/lib/wireup/scenarios.d.ts.map +1 -0
- package/dist/lib/wireup/scenarios.js +516 -0
- package/dist/lib/wireup/scenarios.js.map +1 -0
- package/dist/lib/wireup/state.d.ts +2 -0
- package/dist/lib/wireup/state.d.ts.map +1 -0
- package/dist/lib/wireup/state.js +102 -0
- package/dist/lib/wireup/state.js.map +1 -0
- package/dist/lib/wireup/types.d.ts +376 -0
- package/dist/lib/wireup/types.d.ts.map +1 -0
- package/dist/lib/wireup/types.js +3 -0
- package/dist/lib/wireup/types.js.map +1 -0
- package/dist/lib/worktree.d.ts +2 -0
- package/dist/lib/worktree.d.ts.map +1 -0
- package/dist/lib/worktree.js +999 -0
- package/dist/lib/worktree.js.map +1 -0
- package/lib/autopilot-milestone.ts +136 -0
- package/lib/autopilot-pipeline.ts +1179 -0
- package/lib/autopilot-waves.ts +361 -0
- package/lib/autopilot.ts +1874 -0
- package/lib/autoplan.ts +280 -0
- package/lib/autoresearch.js +4 -0
- package/lib/autoresearch.ts +886 -0
- package/lib/backend.ts +1252 -0
- package/lib/benchmark.ts +341 -0
- package/lib/citations.ts +760 -0
- package/lib/cleanup.ts +1588 -0
- package/lib/cli/adapters.ts +41 -0
- package/lib/cli/agent.ts +83 -0
- package/lib/cli/index.ts +273 -0
- package/lib/cli/output.ts +33 -0
- package/lib/cli/scan-dispatch.ts +130 -0
- package/lib/cli/tools.ts +198 -0
- package/lib/commands/_dashboard-parsers.ts +275 -0
- package/lib/commands/analysis.ts +1851 -0
- package/lib/commands/assumptions.ts +232 -0
- package/lib/commands/blame.ts +174 -0
- package/lib/commands/budget.ts +148 -0
- package/lib/commands/check-plans.ts +233 -0
- package/lib/commands/config.ts +287 -0
- package/lib/commands/dashboard.ts +680 -0
- package/lib/commands/estimate.ts +204 -0
- package/lib/commands/eval-diff.ts +252 -0
- package/lib/commands/freshness.ts +213 -0
- package/lib/commands/health.ts +607 -0
- package/lib/commands/index.ts +266 -0
- package/lib/commands/install.ts +307 -0
- package/lib/commands/knowhow-aggregator.ts +345 -0
- package/lib/commands/knowledge-search.ts +153 -0
- package/lib/commands/long-term-roadmap.ts +390 -0
- package/lib/commands/patterns.ts +465 -0
- package/lib/commands/phase-info.ts +698 -0
- package/lib/commands/plan-lint.ts +546 -0
- package/lib/commands/plan-phase.ts +375 -0
- package/lib/commands/progress.ts +319 -0
- package/lib/commands/quality.ts +138 -0
- package/lib/commands/rollback.ts +195 -0
- package/lib/commands/scan.ts +72 -0
- package/lib/commands/search.ts +300 -0
- package/lib/commands/select-candidate.ts +687 -0
- package/lib/commands/singularity.ts +222 -0
- package/lib/commands/slug-timestamp.ts +74 -0
- package/lib/commands/tail.ts +129 -0
- package/lib/commands/todo.ts +273 -0
- package/lib/commands/watch.ts +80 -0
- package/lib/complexity.ts +117 -0
- package/lib/context/agents.ts +505 -0
- package/lib/context/base.ts +123 -0
- package/lib/context/execute.ts +977 -0
- package/lib/context/index.ts +110 -0
- package/lib/context/progress.ts +278 -0
- package/lib/context/project.ts +531 -0
- package/lib/context/research.ts +646 -0
- package/lib/dead-ends.ts +506 -0
- package/lib/deps.ts +773 -0
- package/lib/discussion.ts +1275 -0
- package/lib/drift.ts +519 -0
- package/lib/evolve/_dimensions-features.ts +525 -0
- package/lib/evolve/_dimensions.ts +511 -0
- package/lib/evolve/_product-ideation.ts +405 -0
- package/lib/evolve/_prompts.ts +178 -0
- package/lib/evolve/cli.ts +330 -0
- package/lib/evolve/discovery.ts +571 -0
- package/lib/evolve/index.ts +105 -0
- package/lib/evolve/orchestrator.ts +1139 -0
- package/lib/evolve/scoring.ts +167 -0
- package/lib/evolve/state.ts +330 -0
- package/lib/evolve/types.ts +290 -0
- package/lib/frontmatter.ts +615 -0
- package/lib/gates.ts +695 -0
- package/lib/genome.ts +402 -0
- package/lib/got.js +4 -0
- package/lib/got.ts +361 -0
- package/lib/invariants.ts +378 -0
- package/lib/knowledge.ts +768 -0
- package/lib/long-term-roadmap.ts +806 -0
- package/lib/markdown-split.ts +273 -0
- package/lib/mcp-server.ts +3292 -0
- package/lib/metrics.ts +49 -0
- package/lib/overstory.ts +270 -0
- package/lib/parallel.ts +570 -0
- package/lib/paths.ts +293 -0
- package/lib/phase-complete-llm.ts +376 -0
- package/lib/phase-complete.ts +366 -0
- package/lib/phase-io.ts +101 -0
- package/lib/phase.ts +1981 -0
- package/lib/plan-tournament.ts +426 -0
- package/lib/refinement.ts +349 -0
- package/lib/requirements.ts +469 -0
- package/lib/research-bundle.ts +300 -0
- package/lib/roadmap.ts +775 -0
- package/lib/scaffold.ts +480 -0
- package/lib/scan/_utils.ts +37 -0
- package/lib/scan/base64.ts +90 -0
- package/lib/scan/ignorefile.ts +109 -0
- package/lib/scan/injection.ts +67 -0
- package/lib/scan/patterns.ts +139 -0
- package/lib/scan/strip-markdown.ts +39 -0
- package/lib/scan/types.ts +28 -0
- package/lib/scheduler-wait.ts +58 -0
- package/lib/scheduler.ts +1370 -0
- package/lib/state.ts +1000 -0
- package/lib/think.ts +365 -0
- package/lib/tracker.ts +1591 -0
- package/lib/types.ts +1663 -0
- package/lib/utils.ts +1479 -0
- package/lib/verify.ts +1434 -0
- package/lib/wireup/autofix.ts +241 -0
- package/lib/wireup/cli.ts +278 -0
- package/lib/wireup/detection.ts +542 -0
- package/lib/wireup/discovery.ts +1063 -0
- package/lib/wireup/execution.ts +686 -0
- package/lib/wireup/index.ts +117 -0
- package/lib/wireup/orchestrator.ts +519 -0
- package/lib/wireup/report.ts +286 -0
- package/lib/wireup/scenarios.ts +616 -0
- package/lib/wireup/state.ts +139 -0
- package/lib/wireup/types.ts +436 -0
- package/lib/worktree.ts +1309 -0
- package/package.json +67 -0
package/lib/drift.ts
ADDED
|
@@ -0,0 +1,519 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* GRD project-drift score.
|
|
5
|
+
*
|
|
6
|
+
* Tier-2 #7 of the Ouroboros integration. The proposal required
|
|
7
|
+
* concrete data sources before shipping a weighted formula; this
|
|
8
|
+
* module supplies them:
|
|
9
|
+
*
|
|
10
|
+
* goal — ROADMAP.md phase Title+Description+Scope tokens
|
|
11
|
+
* vs SUMMARY.md ## Accomplishments tokens.
|
|
12
|
+
* Jaccard distance, mean over recent phases.
|
|
13
|
+
*
|
|
14
|
+
* constraint — Count of banned-phrasing occurrences (locked by
|
|
15
|
+
* tests/integration/verifier-evidence.test.ts) in
|
|
16
|
+
* recent {phase}-VERIFICATION.md and {phase}-SUMMARY.md
|
|
17
|
+
* files, normalised and clamped to [0, 1].
|
|
18
|
+
*
|
|
19
|
+
* ontology — Vocabulary Jaccard distance between recent phases'
|
|
20
|
+
* SUMMARY frontmatter (tech-stack.added,
|
|
21
|
+
* patterns-established) and the baseline first phases'.
|
|
22
|
+
*
|
|
23
|
+
* Weighted aggregate: 0.5·goal + 0.3·constraint + 0.2·ontology
|
|
24
|
+
* (matches Q00 / Ouroboros). Threshold default ≤ 0.3 = healthy.
|
|
25
|
+
*
|
|
26
|
+
* All three components are pure functions of files on disk — no LLM
|
|
27
|
+
* calls, no embeddings, no network. Insufficient data → score 0 with
|
|
28
|
+
* sufficient_data: false so callers can decide what to do.
|
|
29
|
+
*/
|
|
30
|
+
|
|
31
|
+
import * as fs from 'fs';
|
|
32
|
+
import * as path from 'path';
|
|
33
|
+
|
|
34
|
+
const { planningDir: getPlanningDir }: { planningDir: (cwd: string) => string } = require('./paths');
|
|
35
|
+
const { safeReadFile }: { safeReadFile: (p: string) => string | null } = require('./utils');
|
|
36
|
+
const { extractFrontmatter }: { extractFrontmatter: (content: string) => Record<string, unknown> } =
|
|
37
|
+
require('./frontmatter');
|
|
38
|
+
|
|
39
|
+
// ─── Domain Types ──────────────────────────────────────────────────────────
|
|
40
|
+
|
|
41
|
+
export interface ComponentResult {
|
|
42
|
+
/** Drift score for this component, in [0, 1]. 0 = no drift. */
|
|
43
|
+
score: number;
|
|
44
|
+
/** True if there was enough data to compute a meaningful score. */
|
|
45
|
+
sufficient_data: boolean;
|
|
46
|
+
/** Human-readable reason when sufficient_data is false. */
|
|
47
|
+
reason?: string;
|
|
48
|
+
/** Component-specific structured detail for the caller to surface. */
|
|
49
|
+
detail?: Record<string, unknown>;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export interface DriftWeights {
|
|
53
|
+
goal: number;
|
|
54
|
+
constraint: number;
|
|
55
|
+
ontology: number;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export const DEFAULT_WEIGHTS: DriftWeights = { goal: 0.5, constraint: 0.3, ontology: 0.2 };
|
|
59
|
+
|
|
60
|
+
export interface DriftScore {
|
|
61
|
+
weighted: number;
|
|
62
|
+
threshold: number;
|
|
63
|
+
exceeded: boolean;
|
|
64
|
+
weights: DriftWeights;
|
|
65
|
+
goal: ComponentResult;
|
|
66
|
+
constraint: ComponentResult;
|
|
67
|
+
ontology: ComponentResult;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// ─── Tokenisation helpers ──────────────────────────────────────────────────
|
|
71
|
+
|
|
72
|
+
/** Tokenise a string into lowercase alphanumeric word tokens of length ≥ 3. */
|
|
73
|
+
function _tokens(text: string): Set<string> {
|
|
74
|
+
const set = new Set<string>();
|
|
75
|
+
const matches = text.toLowerCase().match(/[a-z0-9][a-z0-9_-]{2,}/g);
|
|
76
|
+
if (!matches) return set;
|
|
77
|
+
for (const t of matches) {
|
|
78
|
+
if (_STOP_WORDS.has(t)) continue;
|
|
79
|
+
set.add(t);
|
|
80
|
+
}
|
|
81
|
+
return set;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
const _STOP_WORDS: Set<string> = new Set([
|
|
85
|
+
'the', 'and', 'for', 'with', 'from', 'into', 'over', 'this', 'that',
|
|
86
|
+
'are', 'was', 'were', 'has', 'have', 'had', 'will', 'would', 'should',
|
|
87
|
+
'phase', 'plan', 'summary', 'roadmap', 'task', 'goal',
|
|
88
|
+
]);
|
|
89
|
+
|
|
90
|
+
/** Jaccard distance between two sets: 1 - |A∩B| / |A∪B|. 0 if both empty. */
|
|
91
|
+
function _jaccardDistance(a: Set<string>, b: Set<string>): number {
|
|
92
|
+
if (a.size === 0 && b.size === 0) return 0;
|
|
93
|
+
let intersection = 0;
|
|
94
|
+
for (const x of a) if (b.has(x)) intersection++;
|
|
95
|
+
const union = a.size + b.size - intersection;
|
|
96
|
+
return union === 0 ? 0 : 1 - intersection / union;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// ─── Phase enumeration ─────────────────────────────────────────────────────
|
|
100
|
+
|
|
101
|
+
interface PhaseInfo {
|
|
102
|
+
phase_number: string;
|
|
103
|
+
phase_dir: string;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* List completed phase directories across all milestones, sorted by
|
|
108
|
+
* the leading numeric prefix (componentwise — `01.10` > `01.9`). A
|
|
109
|
+
* phase is "completed" when it has at least one *-SUMMARY.md file.
|
|
110
|
+
*/
|
|
111
|
+
function _listCompletedPhases(cwd: string): PhaseInfo[] {
|
|
112
|
+
const planning = getPlanningDir(cwd);
|
|
113
|
+
const milestones = path.join(planning, 'milestones');
|
|
114
|
+
if (!fs.existsSync(milestones)) return [];
|
|
115
|
+
|
|
116
|
+
const found: PhaseInfo[] = [];
|
|
117
|
+
for (const ms of fs.readdirSync(milestones, { withFileTypes: true })) {
|
|
118
|
+
if (!ms.isDirectory()) continue;
|
|
119
|
+
const phasesDir = path.join(milestones, ms.name, 'phases');
|
|
120
|
+
if (!fs.existsSync(phasesDir)) continue;
|
|
121
|
+
for (const ph of fs.readdirSync(phasesDir, { withFileTypes: true })) {
|
|
122
|
+
if (!ph.isDirectory()) continue;
|
|
123
|
+
const m = ph.name.match(/^(\d+(?:\.\d+)?)/);
|
|
124
|
+
if (!m) continue;
|
|
125
|
+
const phaseDir = path.join(phasesDir, ph.name);
|
|
126
|
+
const hasSummary = fs
|
|
127
|
+
.readdirSync(phaseDir)
|
|
128
|
+
.some((f) => /-SUMMARY\.md$/i.test(f) || f === 'SUMMARY.md');
|
|
129
|
+
if (!hasSummary) continue;
|
|
130
|
+
found.push({ phase_number: m[1], phase_dir: phaseDir });
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
found.sort((a, b) => _comparePhaseIds(a.phase_number, b.phase_number));
|
|
134
|
+
return found;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/** Componentwise phase-id comparison (matches lib/context/execute.ts). */
|
|
138
|
+
function _comparePhaseIds(a: string, b: string): number {
|
|
139
|
+
const pa = a.split('.').map((p) => parseInt(p, 10));
|
|
140
|
+
const pb = b.split('.').map((p) => parseInt(p, 10));
|
|
141
|
+
const n = Math.max(pa.length, pb.length);
|
|
142
|
+
for (let i = 0; i < n; i++) {
|
|
143
|
+
const ai = pa[i] ?? 0;
|
|
144
|
+
const bi = pb[i] ?? 0;
|
|
145
|
+
if (ai !== bi) return ai - bi;
|
|
146
|
+
}
|
|
147
|
+
return 0;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// ─── Goal drift ────────────────────────────────────────────────────────────
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Extract the {Title, Scope items, Description} text for a given phase
|
|
154
|
+
* from ROADMAP.md. Returns null if the phase block cannot be found.
|
|
155
|
+
*
|
|
156
|
+
* Heading levels: GRD ROADMAPs use `## Phase` (flat), `### Phase`
|
|
157
|
+
* (milestone-grouped), or `#### Phase` (milestone-grouped under an H3
|
|
158
|
+
* version heading). All three forms are accepted. codex r3 P2: prior
|
|
159
|
+
* regex only matched `### Phase`, missing real ROADMAPs with `#### Phase`.
|
|
160
|
+
*/
|
|
161
|
+
function _extractRoadmapGoal(roadmap: string, phaseNumber: string): string | null {
|
|
162
|
+
// codex r3 P2 on PR #41 (applied here for consistency): accept padded
|
|
163
|
+
// decimal phase IDs in ROADMAP headings (`Phase 06.1` vs `Phase 6.1`).
|
|
164
|
+
const trim = phaseNumber.replace(/^0+/, '') || '0';
|
|
165
|
+
const numberPattern = trim
|
|
166
|
+
.split('.')
|
|
167
|
+
.map((p) => `0*${p.replace(/^0+/, '') || '0'}`)
|
|
168
|
+
.join('\\.');
|
|
169
|
+
// Note: no `m` flag — `$` must mean end-of-input, not end-of-line, so
|
|
170
|
+
// the body capture extends to the next heading or EOF (not the very
|
|
171
|
+
// first newline). The `\n` literals in the body and the stop lookahead
|
|
172
|
+
// already provide the boundary semantics we need.
|
|
173
|
+
const re = new RegExp(
|
|
174
|
+
`(#{2,4})\\s+Phase ${numberPattern}:[^\\n]*\\n([\\s\\S]*?)(?=\\n#{2,4}\\s+Phase\\s|\\n##[^#]|$)`,
|
|
175
|
+
'i'
|
|
176
|
+
);
|
|
177
|
+
const m = roadmap.match(re);
|
|
178
|
+
if (!m) return null;
|
|
179
|
+
return m[0]; // heading + body together
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/** Extract the `## Accomplishments` section body from a SUMMARY.md. */
|
|
183
|
+
function _extractSummaryAccomplishments(summary: string): string | null {
|
|
184
|
+
const m = summary.match(/##\s+Accomplishments\s*\n([\s\S]*?)(?=\n##\s|$)/i);
|
|
185
|
+
return m ? m[1] : null;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
function computeGoalDrift(cwd: string, recentK = 3): ComponentResult {
|
|
189
|
+
const planning = getPlanningDir(cwd);
|
|
190
|
+
const roadmap = safeReadFile(path.join(planning, 'ROADMAP.md'));
|
|
191
|
+
if (!roadmap) {
|
|
192
|
+
return { score: 0, sufficient_data: false, reason: 'ROADMAP.md not found' };
|
|
193
|
+
}
|
|
194
|
+
const completed = _listCompletedPhases(cwd);
|
|
195
|
+
const recent = completed.slice(-recentK);
|
|
196
|
+
if (recent.length === 0) {
|
|
197
|
+
return { score: 0, sufficient_data: false, reason: 'No completed phases' };
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
const perPhase: Array<{ phase: string; distance: number; comparable: boolean }> = [];
|
|
201
|
+
for (const phase of recent) {
|
|
202
|
+
const goalText = _extractRoadmapGoal(roadmap, phase.phase_number);
|
|
203
|
+
// Aggregate accomplishments from ALL SUMMARY.md files in the phase
|
|
204
|
+
// dir — phases routinely have multiple plans (e.g. 01-01-SUMMARY.md,
|
|
205
|
+
// 01-02-SUMMARY.md). codex r2 P2: prior code used .find() and read
|
|
206
|
+
// only one arbitrary summary.
|
|
207
|
+
const summaryFiles = fs
|
|
208
|
+
.readdirSync(phase.phase_dir)
|
|
209
|
+
.filter((f) => /-SUMMARY\.md$/i.test(f) || f === 'SUMMARY.md');
|
|
210
|
+
const accomplishmentChunks: string[] = [];
|
|
211
|
+
for (const sf of summaryFiles) {
|
|
212
|
+
const c = safeReadFile(path.join(phase.phase_dir, sf));
|
|
213
|
+
if (!c) continue;
|
|
214
|
+
const a = _extractSummaryAccomplishments(c);
|
|
215
|
+
if (a) accomplishmentChunks.push(a);
|
|
216
|
+
}
|
|
217
|
+
if (!goalText || accomplishmentChunks.length === 0) {
|
|
218
|
+
perPhase.push({ phase: phase.phase_number, distance: 0, comparable: false });
|
|
219
|
+
continue;
|
|
220
|
+
}
|
|
221
|
+
const distance = _jaccardDistance(_tokens(goalText), _tokens(accomplishmentChunks.join('\n')));
|
|
222
|
+
perPhase.push({ phase: phase.phase_number, distance, comparable: true });
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
const comparable = perPhase.filter((p) => p.comparable);
|
|
226
|
+
if (comparable.length === 0) {
|
|
227
|
+
return {
|
|
228
|
+
score: 0,
|
|
229
|
+
sufficient_data: false,
|
|
230
|
+
reason: 'No phase has both ROADMAP goal block and SUMMARY ## Accomplishments',
|
|
231
|
+
detail: { per_phase: perPhase },
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
const score = comparable.reduce((s, p) => s + p.distance, 0) / comparable.length;
|
|
235
|
+
return {
|
|
236
|
+
score,
|
|
237
|
+
sufficient_data: true,
|
|
238
|
+
detail: { per_phase: perPhase, recent_k: recentK },
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
// ─── Constraint drift ──────────────────────────────────────────────────────
|
|
243
|
+
|
|
244
|
+
/**
|
|
245
|
+
* Banned phrasings from the Evidence Standard (locked by
|
|
246
|
+
* tests/integration/verifier-evidence.test.ts). Each occurrence in a
|
|
247
|
+
* recent VERIFICATION.md or SUMMARY.md counts as one constraint violation.
|
|
248
|
+
*/
|
|
249
|
+
const _BANNED_PHRASINGS: readonly RegExp[] = [
|
|
250
|
+
/\blooks good\b/i,
|
|
251
|
+
/\bseems fine\b/i,
|
|
252
|
+
/\blooks correct\b/i,
|
|
253
|
+
/\bappears to work\b/i,
|
|
254
|
+
/\bshould work\b/i,
|
|
255
|
+
/\bI verified this\b/i,
|
|
256
|
+
];
|
|
257
|
+
|
|
258
|
+
function computeConstraintDrift(cwd: string, recentK = 3): ComponentResult {
|
|
259
|
+
const completed = _listCompletedPhases(cwd);
|
|
260
|
+
const recent = completed.slice(-recentK);
|
|
261
|
+
if (recent.length === 0) {
|
|
262
|
+
return { score: 0, sufficient_data: false, reason: 'No completed phases' };
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
let violations = 0;
|
|
266
|
+
let opportunities = 0;
|
|
267
|
+
const perPhase: Array<{ phase: string; violations: number; files_scanned: number }> = [];
|
|
268
|
+
for (const phase of recent) {
|
|
269
|
+
const files = fs
|
|
270
|
+
.readdirSync(phase.phase_dir)
|
|
271
|
+
.filter(
|
|
272
|
+
(f) =>
|
|
273
|
+
/-VERIFICATION\.md$/i.test(f) ||
|
|
274
|
+
f === 'VERIFICATION.md' ||
|
|
275
|
+
/-SUMMARY\.md$/i.test(f) ||
|
|
276
|
+
f === 'SUMMARY.md'
|
|
277
|
+
);
|
|
278
|
+
let phaseViolations = 0;
|
|
279
|
+
for (const f of files) {
|
|
280
|
+
const content = safeReadFile(path.join(phase.phase_dir, f)) ?? '';
|
|
281
|
+
for (const re of _BANNED_PHRASINGS) {
|
|
282
|
+
const matches = content.match(new RegExp(re.source, re.flags + 'g'));
|
|
283
|
+
if (matches) phaseViolations += matches.length;
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
perPhase.push({ phase: phase.phase_number, violations: phaseViolations, files_scanned: files.length });
|
|
287
|
+
violations += phaseViolations;
|
|
288
|
+
// Each phase × each rule is an opportunity to violate.
|
|
289
|
+
opportunities += _BANNED_PHRASINGS.length;
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
if (opportunities === 0) {
|
|
293
|
+
return { score: 0, sufficient_data: false, reason: 'No verifiable phase artifacts' };
|
|
294
|
+
}
|
|
295
|
+
// Clamp to [0, 1]. A single phase with N rule-violations contributes
|
|
296
|
+
// N/RULES to its slot, capped so a degenerate file cannot dominate.
|
|
297
|
+
const raw = violations / opportunities;
|
|
298
|
+
const score = Math.min(1, raw);
|
|
299
|
+
return {
|
|
300
|
+
score,
|
|
301
|
+
sufficient_data: true,
|
|
302
|
+
detail: { per_phase: perPhase, violations, opportunities, recent_k: recentK },
|
|
303
|
+
};
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
// ─── Ontology drift ────────────────────────────────────────────────────────
|
|
307
|
+
|
|
308
|
+
/**
|
|
309
|
+
* Extract the vocabulary set for one phase from its SUMMARY.md
|
|
310
|
+
* frontmatter via the shared extractFrontmatter parser. Supports the
|
|
311
|
+
* three shapes seen in the wild:
|
|
312
|
+
*
|
|
313
|
+
* tech_stack: (canonical — used by recent planner output)
|
|
314
|
+
* added: [...]
|
|
315
|
+
* patterns: [...]
|
|
316
|
+
* tech-stack: (legacy / test fixtures — hyphenated)
|
|
317
|
+
* added: [...]
|
|
318
|
+
* patterns: [...]
|
|
319
|
+
* tech-stack: (older fixtures — `patterns-established` instead of `patterns`)
|
|
320
|
+
* added: [...]
|
|
321
|
+
* patterns-established: [...]
|
|
322
|
+
*
|
|
323
|
+
* Block-list and inline-list forms are both handled by extractFrontmatter.
|
|
324
|
+
* codex r2 P2: prior regex-only extractor missed `tech_stack` and
|
|
325
|
+
* block-list shapes entirely, producing false high drift.
|
|
326
|
+
*/
|
|
327
|
+
function _extractPhaseVocab(summaryContent: string): Set<string> {
|
|
328
|
+
const vocab = new Set<string>();
|
|
329
|
+
const fm = extractFrontmatter(summaryContent);
|
|
330
|
+
|
|
331
|
+
// Source 1: nested tech_stack / tech-stack section
|
|
332
|
+
const sections: unknown[] = [fm['tech_stack'], fm['tech-stack']];
|
|
333
|
+
for (const sec of sections) {
|
|
334
|
+
if (!sec || typeof sec !== 'object') continue;
|
|
335
|
+
const obj = sec as Record<string, unknown>;
|
|
336
|
+
for (const fieldName of ['added', 'patterns', 'patterns-established', 'patterns_established']) {
|
|
337
|
+
const arr = obj[fieldName];
|
|
338
|
+
if (!Array.isArray(arr)) continue;
|
|
339
|
+
for (const item of arr) {
|
|
340
|
+
if (typeof item !== 'string') continue;
|
|
341
|
+
const v = item.trim();
|
|
342
|
+
if (v) vocab.add(v.toLowerCase());
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
// Source 2: top-level patterns-established (real GRD summaries shape).
|
|
348
|
+
// codex r3 P2: previously ignored, which dropped a documented data
|
|
349
|
+
// source. Also accept the underscore variant for symmetry.
|
|
350
|
+
for (const topKey of ['patterns-established', 'patterns_established']) {
|
|
351
|
+
const arr = fm[topKey];
|
|
352
|
+
if (!Array.isArray(arr)) continue;
|
|
353
|
+
for (const item of arr) {
|
|
354
|
+
if (typeof item !== 'string') continue;
|
|
355
|
+
const v = item.trim();
|
|
356
|
+
if (v) vocab.add(v.toLowerCase());
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
return vocab;
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
function computeOntologyDrift(cwd: string, recentK = 3, baselineK = 3): ComponentResult {
|
|
364
|
+
const completed = _listCompletedPhases(cwd);
|
|
365
|
+
if (completed.length < 2) {
|
|
366
|
+
return {
|
|
367
|
+
score: 0,
|
|
368
|
+
sufficient_data: false,
|
|
369
|
+
reason: `Need at least 2 completed phases for ontology drift (have ${completed.length})`,
|
|
370
|
+
};
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
// baseline = first baselineK phases; recent = last recentK phases.
|
|
374
|
+
// If the project has only a handful of phases, baseline and recent may
|
|
375
|
+
// overlap — that is acceptable: the score just trends toward 0.
|
|
376
|
+
const baselinePhases = completed.slice(0, baselineK);
|
|
377
|
+
const recentPhases = completed.slice(-recentK);
|
|
378
|
+
|
|
379
|
+
// Aggregate vocab across ALL SUMMARY.md files in each phase (a phase
|
|
380
|
+
// can have multiple plans). codex r2 P2: prior code used .find() and
|
|
381
|
+
// sampled only one summary, making the score sensitive to filesystem
|
|
382
|
+
// order rather than the whole phase output.
|
|
383
|
+
const collectVocab = (phases: PhaseInfo[]): Set<string> => {
|
|
384
|
+
const v = new Set<string>();
|
|
385
|
+
for (const p of phases) {
|
|
386
|
+
const summaryFiles = fs
|
|
387
|
+
.readdirSync(p.phase_dir)
|
|
388
|
+
.filter((f) => /-SUMMARY\.md$/i.test(f) || f === 'SUMMARY.md');
|
|
389
|
+
for (const sf of summaryFiles) {
|
|
390
|
+
const content = safeReadFile(path.join(p.phase_dir, sf));
|
|
391
|
+
if (!content) continue;
|
|
392
|
+
for (const term of _extractPhaseVocab(content)) v.add(term);
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
return v;
|
|
396
|
+
};
|
|
397
|
+
|
|
398
|
+
const baselineVocab = collectVocab(baselinePhases);
|
|
399
|
+
const recentVocab = collectVocab(recentPhases);
|
|
400
|
+
if (baselineVocab.size === 0 || recentVocab.size === 0) {
|
|
401
|
+
return {
|
|
402
|
+
score: 0,
|
|
403
|
+
sufficient_data: false,
|
|
404
|
+
reason: 'No tech-stack/patterns-established vocab extractable from SUMMARYs',
|
|
405
|
+
detail: { baseline_size: baselineVocab.size, recent_size: recentVocab.size },
|
|
406
|
+
};
|
|
407
|
+
}
|
|
408
|
+
let intersection = 0;
|
|
409
|
+
for (const t of recentVocab) if (baselineVocab.has(t)) intersection++;
|
|
410
|
+
const union = baselineVocab.size + recentVocab.size - intersection;
|
|
411
|
+
const score = union === 0 ? 0 : 1 - intersection / union;
|
|
412
|
+
return {
|
|
413
|
+
score,
|
|
414
|
+
sufficient_data: true,
|
|
415
|
+
detail: {
|
|
416
|
+
baseline_size: baselineVocab.size,
|
|
417
|
+
recent_size: recentVocab.size,
|
|
418
|
+
intersection,
|
|
419
|
+
union,
|
|
420
|
+
recent_k: recentK,
|
|
421
|
+
baseline_k: baselineK,
|
|
422
|
+
},
|
|
423
|
+
};
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
// ─── Convergence check ─────────────────────────────────────────────────────
|
|
427
|
+
|
|
428
|
+
export interface ConvergenceResult {
|
|
429
|
+
/** True if baseline/recent vocab are similar enough to declare convergence. */
|
|
430
|
+
converged: boolean;
|
|
431
|
+
/** Similarity = 1 - ontology_drift. Present when converged === true. */
|
|
432
|
+
similarity?: number;
|
|
433
|
+
/** Threshold used. */
|
|
434
|
+
threshold: number;
|
|
435
|
+
/** Why convergence was not declared, when converged === false. */
|
|
436
|
+
reason?: string;
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
/**
|
|
440
|
+
* Check whether ontology has converged: similarity (1 - drift) >= threshold,
|
|
441
|
+
* AND the baseline/recent windows are NON-OVERLAPPING (so similarity is a
|
|
442
|
+
* real measurement, not the trivial "same set" 1.0). Used by autopilot's
|
|
443
|
+
* opt-in termination criterion (Tier-3 #10 of the Ouroboros integration).
|
|
444
|
+
*
|
|
445
|
+
* codex r1 P2 on PR #40: prior wiring used computeOntologyDrift directly,
|
|
446
|
+
* which reports sufficient_data with only 2 completed phases. With default
|
|
447
|
+
* K=3 baseline + K=3 recent, the windows overlap entirely for any project
|
|
448
|
+
* with <= 3 completed phases, producing similarity 1.0 regardless of actual
|
|
449
|
+
* vocab change. This helper requires `completed_phases >= 2 * recentK`
|
|
450
|
+
* (default 6) before declaring convergence.
|
|
451
|
+
*/
|
|
452
|
+
function isOntologyConverged(
|
|
453
|
+
cwd: string,
|
|
454
|
+
threshold = 0.95,
|
|
455
|
+
recentK = 3
|
|
456
|
+
): ConvergenceResult {
|
|
457
|
+
const completed = _listCompletedPhases(cwd);
|
|
458
|
+
if (completed.length < 2 * recentK) {
|
|
459
|
+
return {
|
|
460
|
+
converged: false,
|
|
461
|
+
threshold,
|
|
462
|
+
reason: `Need >= ${2 * recentK} completed phases for non-overlapping ontology windows (have ${completed.length})`,
|
|
463
|
+
};
|
|
464
|
+
}
|
|
465
|
+
const drift = computeOntologyDrift(cwd, recentK, recentK);
|
|
466
|
+
if (!drift.sufficient_data) {
|
|
467
|
+
return { converged: false, threshold, reason: drift.reason ?? 'insufficient drift data' };
|
|
468
|
+
}
|
|
469
|
+
const similarity = 1 - drift.score;
|
|
470
|
+
if (similarity < threshold) {
|
|
471
|
+
return {
|
|
472
|
+
converged: false,
|
|
473
|
+
threshold,
|
|
474
|
+
reason: `similarity ${similarity.toFixed(3)} < ${threshold}`,
|
|
475
|
+
};
|
|
476
|
+
}
|
|
477
|
+
return { converged: true, similarity, threshold };
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
// ─── Aggregator ────────────────────────────────────────────────────────────
|
|
481
|
+
|
|
482
|
+
/**
|
|
483
|
+
* Compute the weighted drift score. Each component is computed
|
|
484
|
+
* independently; if a component reports sufficient_data: false, its
|
|
485
|
+
* score contributes 0 to the weighted aggregate (so the absence of
|
|
486
|
+
* data is treated as "no drift", not "max drift").
|
|
487
|
+
*/
|
|
488
|
+
function computeDriftScore(
|
|
489
|
+
cwd: string,
|
|
490
|
+
weights: DriftWeights = DEFAULT_WEIGHTS,
|
|
491
|
+
threshold = 0.3,
|
|
492
|
+
recentK = 3
|
|
493
|
+
): DriftScore {
|
|
494
|
+
const goal = computeGoalDrift(cwd, recentK);
|
|
495
|
+
const constraint = computeConstraintDrift(cwd, recentK);
|
|
496
|
+
const ontology = computeOntologyDrift(cwd, recentK);
|
|
497
|
+
const weighted =
|
|
498
|
+
weights.goal * goal.score +
|
|
499
|
+
weights.constraint * constraint.score +
|
|
500
|
+
weights.ontology * ontology.score;
|
|
501
|
+
return {
|
|
502
|
+
weighted,
|
|
503
|
+
threshold,
|
|
504
|
+
exceeded: weighted > threshold,
|
|
505
|
+
weights,
|
|
506
|
+
goal,
|
|
507
|
+
constraint,
|
|
508
|
+
ontology,
|
|
509
|
+
};
|
|
510
|
+
}
|
|
511
|
+
|
|
512
|
+
module.exports = {
|
|
513
|
+
computeGoalDrift,
|
|
514
|
+
computeConstraintDrift,
|
|
515
|
+
computeOntologyDrift,
|
|
516
|
+
computeDriftScore,
|
|
517
|
+
isOntologyConverged,
|
|
518
|
+
DEFAULT_WEIGHTS,
|
|
519
|
+
};
|