@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,525 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* GRD Evolve -- Feature dimension discoverers
|
|
5
|
+
*
|
|
6
|
+
* Two large dimension discoverers: discoverImproveFeatureItems and
|
|
7
|
+
* discoverNewFeatureItems. Separated from _dimensions.ts to stay
|
|
8
|
+
* under the 600-line sub-module limit.
|
|
9
|
+
*
|
|
10
|
+
* Private helper module -- imported only by ./_dimensions.ts.
|
|
11
|
+
*
|
|
12
|
+
* @dependencies ./types, ./state (createWorkItem, readLibFileCached)
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import type { WorkItem } from './types';
|
|
16
|
+
|
|
17
|
+
const fs = require('fs');
|
|
18
|
+
const path = require('path');
|
|
19
|
+
const {
|
|
20
|
+
safeReadFile,
|
|
21
|
+
}: {
|
|
22
|
+
safeReadFile: (filePath: string) => string | null;
|
|
23
|
+
} = require('../utils');
|
|
24
|
+
const {
|
|
25
|
+
createWorkItem,
|
|
26
|
+
readLibFileCached,
|
|
27
|
+
}: {
|
|
28
|
+
createWorkItem: (
|
|
29
|
+
dimension: string,
|
|
30
|
+
slug: string,
|
|
31
|
+
title: string,
|
|
32
|
+
description: string,
|
|
33
|
+
opts?: { effort?: string; source?: string; status?: string; iteration_added?: number }
|
|
34
|
+
) => WorkItem;
|
|
35
|
+
readLibFileCached: (filePath: string) => string | null;
|
|
36
|
+
} = require('./state');
|
|
37
|
+
const {
|
|
38
|
+
listSourceFiles,
|
|
39
|
+
stripExt,
|
|
40
|
+
}: {
|
|
41
|
+
listSourceFiles: (dirPath: string, ext?: string) => string[];
|
|
42
|
+
stripExt: (filename: string) => string;
|
|
43
|
+
} = require('./_dimensions');
|
|
44
|
+
|
|
45
|
+
// ─── Improve Features Discoverer ────────────────────────────────────────────
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Discover feature improvement opportunities.
|
|
49
|
+
* Finds existing features that could be enhanced with better output,
|
|
50
|
+
* error recovery, API consolidation, or UX improvements.
|
|
51
|
+
*/
|
|
52
|
+
function discoverImproveFeatureItems(cwd: string): WorkItem[] {
|
|
53
|
+
const items: WorkItem[] = [];
|
|
54
|
+
const libDir: string = path.join(cwd, 'lib');
|
|
55
|
+
const cmdDir: string = path.join(cwd, 'commands');
|
|
56
|
+
|
|
57
|
+
// 1. Commands that output raw JSON without human-readable formatting option
|
|
58
|
+
try {
|
|
59
|
+
const libFiles: string[] = listSourceFiles(libDir);
|
|
60
|
+
for (const file of libFiles) {
|
|
61
|
+
const content: string | null = readLibFileCached(path.join(libDir, file));
|
|
62
|
+
if (!content) continue;
|
|
63
|
+
const outputPattern = /output\(\s*(\w+)\s*,\s*raw\s*(?:,\s*raw\s*\?)?\s*\)/g;
|
|
64
|
+
let oMatch: RegExpExecArray | null;
|
|
65
|
+
while ((oMatch = outputPattern.exec(content)) !== null) {
|
|
66
|
+
const fullCall: string = content.substring(oMatch.index, oMatch.index + 100);
|
|
67
|
+
if (!/output\([^)]*,[^,]*,[^)]+\)/.test(fullCall)) {
|
|
68
|
+
const lineNum: number = content.substring(0, oMatch.index).split('\n').length;
|
|
69
|
+
items.push(
|
|
70
|
+
createWorkItem(
|
|
71
|
+
'improve-features',
|
|
72
|
+
`improve-output-${stripExt(file)}-L${lineNum}`,
|
|
73
|
+
`Add human-readable output in ${file} line ${lineNum}`,
|
|
74
|
+
`lib/${file} calls output() at line ${lineNum} without a human-readable text format (third argument). When --raw is used, users see nothing useful. Add a formatted text representation.`,
|
|
75
|
+
{ effort: 'small' }
|
|
76
|
+
)
|
|
77
|
+
);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
} catch (err) {
|
|
82
|
+
if (
|
|
83
|
+
err &&
|
|
84
|
+
(err as NodeJS.ErrnoException).code &&
|
|
85
|
+
(err as NodeJS.ErrnoException).code !== 'ENOENT'
|
|
86
|
+
)
|
|
87
|
+
throw err;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// 2. Error paths that don't suggest recovery actions
|
|
91
|
+
try {
|
|
92
|
+
const libFiles: string[] = listSourceFiles(libDir);
|
|
93
|
+
for (const file of libFiles) {
|
|
94
|
+
const content: string | null = readLibFileCached(path.join(libDir, file));
|
|
95
|
+
if (!content) continue;
|
|
96
|
+
const errorPattern = /error\(\s*['"`]([^'"`]{30,})['"`]\s*\)/g;
|
|
97
|
+
let eMatch: RegExpExecArray | null;
|
|
98
|
+
while ((eMatch = errorPattern.exec(content)) !== null) {
|
|
99
|
+
const msg: string = eMatch[1];
|
|
100
|
+
if (!/\b(?:try|run|check|use|set|ensure|add|create|install|verify)\b/i.test(msg)) {
|
|
101
|
+
const lineNum: number = content.substring(0, eMatch.index).split('\n').length;
|
|
102
|
+
items.push(
|
|
103
|
+
createWorkItem(
|
|
104
|
+
'improve-features',
|
|
105
|
+
`add-fallback-${stripExt(file)}-L${lineNum}`,
|
|
106
|
+
`Add recovery hint to error in ${file} line ${lineNum}`,
|
|
107
|
+
`error() in lib/${file} at line ${lineNum} says "${msg.substring(0, 60)}..." but does not suggest what the user should do to fix it. Add an actionable recovery hint.`,
|
|
108
|
+
{ effort: 'small' }
|
|
109
|
+
)
|
|
110
|
+
);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
} catch (err) {
|
|
115
|
+
if (
|
|
116
|
+
err &&
|
|
117
|
+
(err as NodeJS.ErrnoException).code &&
|
|
118
|
+
(err as NodeJS.ErrnoException).code !== 'ENOENT'
|
|
119
|
+
)
|
|
120
|
+
throw err;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// 3. Commands with overlapping functionality that could be consolidated
|
|
124
|
+
try {
|
|
125
|
+
const cmdFiles: string[] = fs
|
|
126
|
+
.readdirSync(cmdDir, { withFileTypes: true })
|
|
127
|
+
.filter((e: { isFile: () => boolean; name: string }) => e.isFile() && e.name.endsWith('.md'))
|
|
128
|
+
.map((e: { name: string }) => e.name);
|
|
129
|
+
const prefixGroups: Record<string, string[]> = {};
|
|
130
|
+
for (const file of cmdFiles) {
|
|
131
|
+
const parts: string[] = file.replace('.md', '').split('-');
|
|
132
|
+
if (parts.length >= 2) {
|
|
133
|
+
const prefix: string = parts[0];
|
|
134
|
+
if (!prefixGroups[prefix]) prefixGroups[prefix] = [];
|
|
135
|
+
prefixGroups[prefix].push(file);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
for (const [prefix, files] of Object.entries(prefixGroups)) {
|
|
139
|
+
if (files.length >= 4) {
|
|
140
|
+
items.push(
|
|
141
|
+
createWorkItem(
|
|
142
|
+
'improve-features',
|
|
143
|
+
`consolidate-${prefix}-commands`,
|
|
144
|
+
`Consider consolidating ${prefix}-* commands (${files.length} commands)`,
|
|
145
|
+
`There are ${files.length} commands with prefix "${prefix}-": ${files.join(', ')}. Consider whether some could be subcommands of a single parent command for a cleaner UX.`,
|
|
146
|
+
{ effort: 'large' }
|
|
147
|
+
)
|
|
148
|
+
);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
} catch {
|
|
152
|
+
/* commands/ dir missing */
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// 4. Lib modules that could benefit from caching
|
|
156
|
+
try {
|
|
157
|
+
const libFiles: string[] = listSourceFiles(libDir);
|
|
158
|
+
for (const file of libFiles) {
|
|
159
|
+
const content: string | null = readLibFileCached(path.join(libDir, file));
|
|
160
|
+
if (!content) continue;
|
|
161
|
+
const readCalls: string[] = [];
|
|
162
|
+
const readPattern = /(?:readFileSync|safeReadFile)\(\s*([^)]+)\)/g;
|
|
163
|
+
let rMatch: RegExpExecArray | null;
|
|
164
|
+
while ((rMatch = readPattern.exec(content)) !== null) {
|
|
165
|
+
readCalls.push(rMatch[1].trim());
|
|
166
|
+
}
|
|
167
|
+
const seen: Record<string, number> = {};
|
|
168
|
+
for (const call of readCalls) {
|
|
169
|
+
seen[call] = (seen[call] || 0) + 1;
|
|
170
|
+
}
|
|
171
|
+
for (const [callExpr, count] of Object.entries(seen)) {
|
|
172
|
+
if (count >= 3 && callExpr.length < 80) {
|
|
173
|
+
items.push(
|
|
174
|
+
createWorkItem(
|
|
175
|
+
'improve-features',
|
|
176
|
+
`enhance-caching-${stripExt(file)}`,
|
|
177
|
+
`Add caching for repeated file reads in ${file}`,
|
|
178
|
+
`lib/${file} reads ${callExpr} ${count} times. Cache the result in a local variable to avoid redundant I/O.`,
|
|
179
|
+
{ effort: 'small' }
|
|
180
|
+
)
|
|
181
|
+
);
|
|
182
|
+
break;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
} catch (err) {
|
|
187
|
+
if (
|
|
188
|
+
err &&
|
|
189
|
+
(err as NodeJS.ErrnoException).code &&
|
|
190
|
+
(err as NodeJS.ErrnoException).code !== 'ENOENT'
|
|
191
|
+
)
|
|
192
|
+
throw err;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
// 5. Agent definitions that could benefit from tool restrictions
|
|
196
|
+
const agentDir: string = path.join(cwd, 'agents');
|
|
197
|
+
try {
|
|
198
|
+
const agentFiles: string[] = fs
|
|
199
|
+
.readdirSync(agentDir, { withFileTypes: true })
|
|
200
|
+
.filter((e: { isFile: () => boolean; name: string }) => e.isFile() && e.name.endsWith('.md'))
|
|
201
|
+
.map((e: { name: string }) => e.name);
|
|
202
|
+
for (const file of agentFiles) {
|
|
203
|
+
const content: string | null = safeReadFile(path.join(agentDir, file));
|
|
204
|
+
if (!content) continue;
|
|
205
|
+
const fmMatch: RegExpMatchArray | null = content.match(/^---\n([\s\S]*?)\n---/);
|
|
206
|
+
if (!fmMatch) continue;
|
|
207
|
+
const frontmatter: string = fmMatch[1];
|
|
208
|
+
const hasToolRestrictions: boolean =
|
|
209
|
+
frontmatter.includes('allowed_tools') ||
|
|
210
|
+
frontmatter.includes('disallowed_tools') ||
|
|
211
|
+
/^tools:/m.test(frontmatter);
|
|
212
|
+
if (!hasToolRestrictions) {
|
|
213
|
+
items.push(
|
|
214
|
+
createWorkItem(
|
|
215
|
+
'improve-features',
|
|
216
|
+
`enhance-agent-${path.basename(file, '.md')}`,
|
|
217
|
+
`Add tool restrictions to ${file} agent`,
|
|
218
|
+
`Agent agents/${file} has no tool restrictions in frontmatter. Adding allowed_tools or disallowed_tools improves safety and focuses the agent on its specific task.`,
|
|
219
|
+
{ effort: 'small' }
|
|
220
|
+
)
|
|
221
|
+
);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
} catch {
|
|
225
|
+
/* agents/ dir missing */
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
return items;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
// ─── New Features Discoverer ────────────────────────────────────────────────
|
|
232
|
+
|
|
233
|
+
/**
|
|
234
|
+
* Discover new feature opportunities.
|
|
235
|
+
* Checks for missing MCP tools, input validation, error quality,
|
|
236
|
+
* dry-run support, integration test coverage, and more.
|
|
237
|
+
*/
|
|
238
|
+
/**
|
|
239
|
+
* Read a lib module by base name, preferring .ts over .js, and
|
|
240
|
+
* for decomposed modules (commands/, context/) concatenate all sub-module sources.
|
|
241
|
+
*/
|
|
242
|
+
function readModuleContent(libDir: string, baseName: string): string | null {
|
|
243
|
+
// Check for decomposed sub-module directory first
|
|
244
|
+
const subDir: string = path.join(libDir, baseName);
|
|
245
|
+
try {
|
|
246
|
+
const stat = fs.statSync(subDir);
|
|
247
|
+
if (stat.isDirectory()) {
|
|
248
|
+
const subFiles: string[] = listSourceFiles(subDir);
|
|
249
|
+
const parts: string[] = [];
|
|
250
|
+
for (const f of subFiles) {
|
|
251
|
+
const content: string | null = readLibFileCached(path.join(subDir, f));
|
|
252
|
+
if (content) parts.push(content);
|
|
253
|
+
}
|
|
254
|
+
return parts.length > 0 ? parts.join('\n') : null;
|
|
255
|
+
}
|
|
256
|
+
} catch {
|
|
257
|
+
/* not a directory */
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
// Try .ts first, then .js
|
|
261
|
+
const tsPath: string = path.join(libDir, `${baseName}.ts`);
|
|
262
|
+
const jsPath: string = path.join(libDir, `${baseName}.js`);
|
|
263
|
+
return readLibFileCached(tsPath) || readLibFileCached(jsPath);
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
function discoverNewFeatureItems(cwd: string): WorkItem[] {
|
|
267
|
+
const items: WorkItem[] = [];
|
|
268
|
+
const libDir: string = path.join(cwd, 'lib');
|
|
269
|
+
const cmdDir: string = path.join(cwd, 'commands');
|
|
270
|
+
const agentDir: string = path.join(cwd, 'agents');
|
|
271
|
+
const commandsContent: string | null = readModuleContent(libDir, 'commands');
|
|
272
|
+
|
|
273
|
+
// 1. Init workflows without MCP tool bindings
|
|
274
|
+
try {
|
|
275
|
+
const contextContent: string | null = readModuleContent(libDir, 'context');
|
|
276
|
+
const mcpContent: string | null = readModuleContent(libDir, 'mcp-server');
|
|
277
|
+
if (contextContent && mcpContent) {
|
|
278
|
+
const initPattern = /function\s+(cmdInit\w+)\s*\(/g;
|
|
279
|
+
let initMatch: RegExpExecArray | null;
|
|
280
|
+
while ((initMatch = initPattern.exec(contextContent)) !== null) {
|
|
281
|
+
const funcName: string = initMatch[1];
|
|
282
|
+
if (!mcpContent.includes(funcName)) {
|
|
283
|
+
items.push(
|
|
284
|
+
createWorkItem(
|
|
285
|
+
'new-features',
|
|
286
|
+
`mcp-tool-${funcName.replace(/^cmdInit/, '').toLowerCase()}`,
|
|
287
|
+
`Add MCP tool for ${funcName}`,
|
|
288
|
+
`Init workflow ${funcName} in lib/context/ does not have a corresponding MCP tool binding in lib/mcp-server. Adding it would expose the workflow to MCP clients.`,
|
|
289
|
+
{ effort: 'medium' }
|
|
290
|
+
)
|
|
291
|
+
);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
} catch {
|
|
296
|
+
/* Files not found */
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
// 2. CLI commands with missing input validation
|
|
300
|
+
try {
|
|
301
|
+
if (commandsContent) {
|
|
302
|
+
const handlerPattern = /function\s+(cmd\w+)\s*\([^)]*args[^)]*\)/g;
|
|
303
|
+
let hMatch: RegExpExecArray | null;
|
|
304
|
+
while ((hMatch = handlerPattern.exec(commandsContent)) !== null) {
|
|
305
|
+
const funcName: string = hMatch[1];
|
|
306
|
+
const bodyStart: number = commandsContent.indexOf('{', hMatch.index);
|
|
307
|
+
if (bodyStart === -1) continue;
|
|
308
|
+
const bodySlice: string = commandsContent.substring(bodyStart, bodyStart + 1500);
|
|
309
|
+
if (
|
|
310
|
+
/args\[\d+\]/.test(bodySlice) &&
|
|
311
|
+
!/args\.length/.test(bodySlice) &&
|
|
312
|
+
!/if\s*\(\s*!args/.test(bodySlice)
|
|
313
|
+
) {
|
|
314
|
+
items.push(
|
|
315
|
+
createWorkItem(
|
|
316
|
+
'new-features',
|
|
317
|
+
`missing-validation-${funcName.replace(/^cmd/, '').toLowerCase()}`,
|
|
318
|
+
`Add input validation to ${funcName}`,
|
|
319
|
+
`Command handler ${funcName} in lib/commands.js accesses args[] without checking argument count. Add validation to give users a helpful error message when arguments are missing.`,
|
|
320
|
+
{ effort: 'small' }
|
|
321
|
+
)
|
|
322
|
+
);
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
} catch {
|
|
327
|
+
/* commands.js not found */
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
// 3. Generic/unhelpful error messages
|
|
331
|
+
try {
|
|
332
|
+
const libFiles: string[] = listSourceFiles(libDir);
|
|
333
|
+
for (const file of libFiles) {
|
|
334
|
+
const content: string | null = readLibFileCached(path.join(libDir, file));
|
|
335
|
+
if (!content) continue;
|
|
336
|
+
const errorCallPattern = /error\(\s*['"`]([^'"`]{1,25})['"`]\s*\)/g;
|
|
337
|
+
let errMatch: RegExpExecArray | null;
|
|
338
|
+
while ((errMatch = errorCallPattern.exec(content)) !== null) {
|
|
339
|
+
const msg: string = errMatch[1];
|
|
340
|
+
if (/^(failed|error|invalid|missing|not found|unknown)\.?$/i.test(msg.trim())) {
|
|
341
|
+
const lineNum: number = content.substring(0, errMatch.index).split('\n').length;
|
|
342
|
+
items.push(
|
|
343
|
+
createWorkItem(
|
|
344
|
+
'new-features',
|
|
345
|
+
`generic-error-${stripExt(file)}-L${lineNum}`,
|
|
346
|
+
`Improve error message in ${file} line ${lineNum}`,
|
|
347
|
+
`error("${msg}") in lib/${file} at line ${lineNum} is too generic. Add context about what failed and what the user should do (e.g., which command, which file, expected format).`,
|
|
348
|
+
{ effort: 'small' }
|
|
349
|
+
)
|
|
350
|
+
);
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
} catch {
|
|
355
|
+
/* lib/ directory missing */
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
// 4. Commands that write files but lack --dry-run support
|
|
359
|
+
try {
|
|
360
|
+
if (commandsContent) {
|
|
361
|
+
const cmdPattern = /function\s+(cmd\w+)\s*\(/g;
|
|
362
|
+
let cMatch: RegExpExecArray | null;
|
|
363
|
+
while ((cMatch = cmdPattern.exec(commandsContent)) !== null) {
|
|
364
|
+
const funcName: string = cMatch[1];
|
|
365
|
+
const bodyStart: number = commandsContent.indexOf('{', cMatch.index);
|
|
366
|
+
if (bodyStart === -1) continue;
|
|
367
|
+
const bodySlice: string = commandsContent.substring(bodyStart, bodyStart + 2000);
|
|
368
|
+
const writesFiles: boolean = /(?:writeFileSync|mkdirSync|scaffold|fs\.write)/.test(
|
|
369
|
+
bodySlice
|
|
370
|
+
);
|
|
371
|
+
const hasDryRun: boolean = /dry.?run|dryRun|--dry-run/.test(bodySlice);
|
|
372
|
+
if (writesFiles && !hasDryRun) {
|
|
373
|
+
items.push(
|
|
374
|
+
createWorkItem(
|
|
375
|
+
'new-features',
|
|
376
|
+
`missing-dry-run-${funcName.replace(/^cmd/, '').toLowerCase()}`,
|
|
377
|
+
`Add --dry-run support to ${funcName}`,
|
|
378
|
+
`Command ${funcName} in lib/commands.js writes files but does not support --dry-run. Adding dry-run would let users preview changes before applying them.`,
|
|
379
|
+
{ effort: 'medium' }
|
|
380
|
+
)
|
|
381
|
+
);
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
} catch {
|
|
386
|
+
/* commands.js not found */
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
// 5. Commands without integration test coverage
|
|
390
|
+
try {
|
|
391
|
+
const cmdFiles: string[] = fs
|
|
392
|
+
.readdirSync(cmdDir, { withFileTypes: true })
|
|
393
|
+
.filter((e: { isFile: () => boolean; name: string }) => e.isFile() && e.name.endsWith('.md'))
|
|
394
|
+
.map((e: { name: string }) => path.basename(e.name, '.md'));
|
|
395
|
+
const integrationDir: string = path.join(cwd, 'tests', 'integration');
|
|
396
|
+
let integrationContent: string = '';
|
|
397
|
+
try {
|
|
398
|
+
const integrationFiles: string[] = listSourceFiles(integrationDir);
|
|
399
|
+
for (const f of integrationFiles) {
|
|
400
|
+
integrationContent += safeReadFile(path.join(integrationDir, f)) || '';
|
|
401
|
+
}
|
|
402
|
+
} catch {
|
|
403
|
+
/* No integration test dir */
|
|
404
|
+
}
|
|
405
|
+
if (integrationContent) {
|
|
406
|
+
for (const cmd of cmdFiles) {
|
|
407
|
+
const normalizedCmd: string = cmd.replace(/-/g, '[- ]?');
|
|
408
|
+
const pattern = new RegExp(normalizedCmd, 'i');
|
|
409
|
+
if (!pattern.test(integrationContent)) {
|
|
410
|
+
items.push(
|
|
411
|
+
createWorkItem(
|
|
412
|
+
'new-features',
|
|
413
|
+
`missing-integration-test-${cmd}`,
|
|
414
|
+
`Add integration test for /${cmd} command`,
|
|
415
|
+
`Command commands/${cmd}.md has no references in tests/integration/. Adding integration tests ensures the command works end-to-end and catches regressions.`,
|
|
416
|
+
{ effort: 'medium' }
|
|
417
|
+
)
|
|
418
|
+
);
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
} catch {
|
|
423
|
+
/* commands/ dir missing */
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
// 6. Agent definitions without init workflows
|
|
427
|
+
try {
|
|
428
|
+
const agentFiles: string[] = fs
|
|
429
|
+
.readdirSync(agentDir, { withFileTypes: true })
|
|
430
|
+
.filter((e: { isFile: () => boolean; name: string }) => e.isFile() && e.name.endsWith('.md'))
|
|
431
|
+
.map((e: { name: string }) => path.basename(e.name, '.md'));
|
|
432
|
+
const contextContent: string | null = readModuleContent(libDir, 'context');
|
|
433
|
+
if (contextContent) {
|
|
434
|
+
for (const agent of agentFiles) {
|
|
435
|
+
const initName: string = `cmdInit${agent.replace(/-(\w)/g, (_: string, c: string) => c.toUpperCase()).replace(/^(\w)/, (c: string) => c.toUpperCase())}`;
|
|
436
|
+
const shortName: string = agent.replace(/^grd-/, '');
|
|
437
|
+
if (
|
|
438
|
+
!contextContent.includes(initName) &&
|
|
439
|
+
!contextContent.includes(`'${shortName}'`) &&
|
|
440
|
+
!contextContent.includes(`"${shortName}"`)
|
|
441
|
+
) {
|
|
442
|
+
items.push(
|
|
443
|
+
createWorkItem(
|
|
444
|
+
'new-features',
|
|
445
|
+
`missing-agent-init-${agent}`,
|
|
446
|
+
`Add init workflow for ${agent} agent`,
|
|
447
|
+
`Agent agents/${agent}.md does not have a corresponding init workflow in lib/context/. Adding one would provide the agent with optimized context (state snapshot, plan index, etc.) instead of raw file reads.`,
|
|
448
|
+
{ effort: 'medium' }
|
|
449
|
+
)
|
|
450
|
+
);
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
} catch {
|
|
455
|
+
/* agents/ dir missing */
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
// 7. Hardcoded magic numbers/strings & 8. Long-running operations without progress
|
|
459
|
+
try {
|
|
460
|
+
const libFiles: string[] = listSourceFiles(libDir);
|
|
461
|
+
for (const file of libFiles) {
|
|
462
|
+
const content: string | null = readLibFileCached(path.join(libDir, file));
|
|
463
|
+
if (!content) continue;
|
|
464
|
+
if (stripExt(file) !== 'evolve') {
|
|
465
|
+
const timeoutPattern = /(?:timeout|TIMEOUT|delay|DELAY)\s*[:=]\s*(\d{4,})/g;
|
|
466
|
+
let tMatch: RegExpExecArray | null;
|
|
467
|
+
while ((tMatch = timeoutPattern.exec(content)) !== null) {
|
|
468
|
+
const value: string = tMatch[1];
|
|
469
|
+
const lineNum: number = content.substring(0, tMatch.index).split('\n').length;
|
|
470
|
+
items.push(
|
|
471
|
+
createWorkItem(
|
|
472
|
+
'new-features',
|
|
473
|
+
`configurable-default-${stripExt(file)}-L${lineNum}`,
|
|
474
|
+
`Make timeout configurable in ${file}`,
|
|
475
|
+
`lib/${file} has a hardcoded timeout value of ${value}ms at line ${lineNum}. Move it to config.json so users can tune it for their environment.`,
|
|
476
|
+
{ effort: 'small' }
|
|
477
|
+
)
|
|
478
|
+
);
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
const loopPattern = /for\s*\((?:const|let|var)\s+(\w+)\s+of\s+(\w+)\)\s*\{/g;
|
|
482
|
+
let lMatch: RegExpExecArray | null;
|
|
483
|
+
while ((lMatch = loopPattern.exec(content)) !== null) {
|
|
484
|
+
const arrayName: string = lMatch[2];
|
|
485
|
+
const loopStart: number = lMatch.index;
|
|
486
|
+
const bodySlice: string = content.substring(loopStart, loopStart + 500);
|
|
487
|
+
const isHeavy: boolean =
|
|
488
|
+
/(?:spawnSync|execSync|spawnClaude(?:Async)?|writeFileSync|appendFileSync)/.test(
|
|
489
|
+
bodySlice
|
|
490
|
+
);
|
|
491
|
+
const hasProgress: boolean = /(?:log\(|process\.stderr\.write|progress|spinner)/.test(
|
|
492
|
+
bodySlice
|
|
493
|
+
);
|
|
494
|
+
if (isHeavy && !hasProgress) {
|
|
495
|
+
const lineNum: number = content.substring(0, loopStart).split('\n').length;
|
|
496
|
+
items.push(
|
|
497
|
+
createWorkItem(
|
|
498
|
+
'new-features',
|
|
499
|
+
`missing-progress-${stripExt(file)}-L${lineNum}`,
|
|
500
|
+
`Add progress output to loop in ${file} line ${lineNum}`,
|
|
501
|
+
`lib/${file} iterates over ${arrayName} at line ${lineNum} performing heavy operations (file I/O or process spawn) without progress feedback. Add a log statement showing N/total to help users track long-running operations.`,
|
|
502
|
+
{ effort: 'small' }
|
|
503
|
+
)
|
|
504
|
+
);
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
} catch (err) {
|
|
509
|
+
if (
|
|
510
|
+
err &&
|
|
511
|
+
(err as NodeJS.ErrnoException).code &&
|
|
512
|
+
(err as NodeJS.ErrnoException).code !== 'ENOENT'
|
|
513
|
+
)
|
|
514
|
+
throw err;
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
return items;
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
// ─── Exports ────────────────────────────────────────────────────────────────
|
|
521
|
+
|
|
522
|
+
module.exports = {
|
|
523
|
+
discoverImproveFeatureItems,
|
|
524
|
+
discoverNewFeatureItems,
|
|
525
|
+
};
|