@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,358 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const fs = require('fs');
|
|
4
|
+
const path = require('path');
|
|
5
|
+
const { safeReadFile, } = require('../utils');
|
|
6
|
+
const { createWorkItem, readLibFileCached, } = require('./state');
|
|
7
|
+
// ─── Helpers ────────────────────────────────────────────────────────────────
|
|
8
|
+
/**
|
|
9
|
+
* Strip .js or .ts extension from a filename for slug generation.
|
|
10
|
+
*/
|
|
11
|
+
function stripExt(filename) {
|
|
12
|
+
return filename.replace(/\.[jt]s$/, '');
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* List source files in a directory, preferring .ts over .js CJS proxies.
|
|
16
|
+
* Returns filenames (not full paths) that represent real source files.
|
|
17
|
+
*/
|
|
18
|
+
function listSourceFiles(dirPath, ext) {
|
|
19
|
+
const entries = fs
|
|
20
|
+
.readdirSync(dirPath, { withFileTypes: true })
|
|
21
|
+
.filter((e) => e.isFile());
|
|
22
|
+
const names = new Set(entries.map((e) => e.name));
|
|
23
|
+
const result = [];
|
|
24
|
+
for (const e of entries) {
|
|
25
|
+
const name = e.name;
|
|
26
|
+
if (ext) {
|
|
27
|
+
if (!name.endsWith(ext))
|
|
28
|
+
continue;
|
|
29
|
+
result.push(name);
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
// Prefer .ts when both .ts and .js exist (skip the .js proxy)
|
|
33
|
+
if (name.endsWith('.js') && names.has(name.replace(/\.js$/, '.ts')))
|
|
34
|
+
continue;
|
|
35
|
+
if (name.endsWith('.js') || name.endsWith('.ts')) {
|
|
36
|
+
result.push(name);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return result;
|
|
40
|
+
}
|
|
41
|
+
// ─── Dimension Discoverers ──────────────────────────────────────────────────
|
|
42
|
+
/**
|
|
43
|
+
* Discover productivity improvement opportunities.
|
|
44
|
+
* Scans lib/ for long functions, duplicate exports, and missing init workflows.
|
|
45
|
+
*/
|
|
46
|
+
function discoverProductivityItems(cwd) {
|
|
47
|
+
const items = [];
|
|
48
|
+
const libDir = path.join(cwd, 'lib');
|
|
49
|
+
try {
|
|
50
|
+
const libFiles = listSourceFiles(libDir);
|
|
51
|
+
for (const file of libFiles) {
|
|
52
|
+
const content = readLibFileCached(path.join(libDir, file));
|
|
53
|
+
if (!content)
|
|
54
|
+
continue;
|
|
55
|
+
// Check for long functions (>80 lines)
|
|
56
|
+
const funcPattern = /^(?:function\s+(\w+)|(?:const|let|var)\s+(\w+)\s*=\s*(?:function|\())/gm;
|
|
57
|
+
let funcMatch;
|
|
58
|
+
while ((funcMatch = funcPattern.exec(content)) !== null) {
|
|
59
|
+
const funcName = funcMatch[1] || funcMatch[2];
|
|
60
|
+
const startIdx = funcMatch.index;
|
|
61
|
+
const startLine = content.substring(0, startIdx).split('\n').length;
|
|
62
|
+
let depth = 0;
|
|
63
|
+
let foundOpen = false;
|
|
64
|
+
let endLine = startLine;
|
|
65
|
+
const lines = content.split('\n');
|
|
66
|
+
for (let i = startLine - 1; i < lines.length; i++) {
|
|
67
|
+
const line = lines[i];
|
|
68
|
+
for (const ch of line) {
|
|
69
|
+
if (ch === '{') {
|
|
70
|
+
depth++;
|
|
71
|
+
foundOpen = true;
|
|
72
|
+
}
|
|
73
|
+
else if (ch === '}') {
|
|
74
|
+
depth--;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
if (foundOpen && depth <= 0) {
|
|
78
|
+
endLine = i + 1;
|
|
79
|
+
break;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
const funcLength = endLine - startLine + 1;
|
|
83
|
+
if (funcLength > 80) {
|
|
84
|
+
items.push(createWorkItem('productivity', `split-${stripExt(file)}-${funcName}`, `Split long function ${funcName} in ${file}`, `Function ${funcName} in lib/${file} is ${funcLength} lines long (threshold: 80). Consider splitting into smaller helper functions for readability and maintainability.`, { effort: 'medium' }));
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
catch (err) {
|
|
90
|
+
if (err &&
|
|
91
|
+
err.code &&
|
|
92
|
+
err.code !== 'ENOENT')
|
|
93
|
+
throw err;
|
|
94
|
+
}
|
|
95
|
+
return items;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Discover quality improvement opportunities.
|
|
99
|
+
* Checks for todo/fixme/hack marker comments and missing test files.
|
|
100
|
+
*/
|
|
101
|
+
function discoverQualityItems(cwd) {
|
|
102
|
+
const items = [];
|
|
103
|
+
const libDir = path.join(cwd, 'lib');
|
|
104
|
+
const testDir = path.join(cwd, 'tests', 'unit');
|
|
105
|
+
try {
|
|
106
|
+
const libFiles = listSourceFiles(libDir);
|
|
107
|
+
for (const file of libFiles) {
|
|
108
|
+
const base = stripExt(file);
|
|
109
|
+
const testFileName = `${base}.test.ts`;
|
|
110
|
+
const testFileNameJs = `${base}.test.js`;
|
|
111
|
+
const testPath = path.join(testDir, testFileName);
|
|
112
|
+
const testPathJs = path.join(testDir, testFileNameJs);
|
|
113
|
+
let hasTest = false;
|
|
114
|
+
try {
|
|
115
|
+
fs.statSync(testPath);
|
|
116
|
+
hasTest = true;
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
/* */
|
|
120
|
+
}
|
|
121
|
+
if (!hasTest) {
|
|
122
|
+
try {
|
|
123
|
+
fs.statSync(testPathJs);
|
|
124
|
+
hasTest = true;
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
/* */
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
if (!hasTest) {
|
|
131
|
+
items.push(createWorkItem('quality', `add-tests-${base}`, `Add test file for ${file}`, `lib/${file} has no corresponding test file at tests/unit/${testFileName}. Add unit tests to ensure code correctness.`, { effort: 'medium' }));
|
|
132
|
+
}
|
|
133
|
+
const content = readLibFileCached(path.join(libDir, file));
|
|
134
|
+
if (!content)
|
|
135
|
+
continue;
|
|
136
|
+
const todoPattern = /(?:\/\/|\/?\*+)\s*(TODO|FIXME|HACK)\b[:\s]*(.*)/g;
|
|
137
|
+
let todoMatch;
|
|
138
|
+
while ((todoMatch = todoPattern.exec(content)) !== null) {
|
|
139
|
+
const tag = todoMatch[1];
|
|
140
|
+
const desc = todoMatch[2].trim().substring(0, 80);
|
|
141
|
+
const lineNum = content.substring(0, todoMatch.index).split('\n').length;
|
|
142
|
+
const slug = `resolve-${tag.toLowerCase()}-${base}-L${lineNum}`;
|
|
143
|
+
items.push(createWorkItem('quality', slug, `Resolve ${tag} in ${file} line ${lineNum}`, `${tag} comment found in lib/${file} at line ${lineNum}: "${desc}". Review and resolve this marker.`, { effort: 'small' }));
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
catch (err) {
|
|
148
|
+
if (err &&
|
|
149
|
+
err.code &&
|
|
150
|
+
err.code !== 'ENOENT')
|
|
151
|
+
throw err;
|
|
152
|
+
}
|
|
153
|
+
try {
|
|
154
|
+
const jestConfigContent = safeReadFile(path.join(cwd, 'jest.config.js'));
|
|
155
|
+
if (jestConfigContent) {
|
|
156
|
+
const thresholdPattern = /'\.\/lib\/([^']+)':\s*\{[^}]*lines:\s*(\d+)/g;
|
|
157
|
+
let thresholdMatch;
|
|
158
|
+
while ((thresholdMatch = thresholdPattern.exec(jestConfigContent)) !== null) {
|
|
159
|
+
const moduleName = thresholdMatch[1];
|
|
160
|
+
const linesCoverage = parseInt(thresholdMatch[2], 10);
|
|
161
|
+
if (linesCoverage < 90) {
|
|
162
|
+
items.push(createWorkItem('quality', `improve-coverage-${path.basename(moduleName, '.js')}`, `Improve test coverage for ${moduleName}`, `lib/${moduleName} has a coverage threshold of ${linesCoverage}% lines (target: 90%). Increase test coverage to strengthen code quality.`, { effort: 'medium' }));
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
catch {
|
|
168
|
+
/* jest.config.js not found */
|
|
169
|
+
}
|
|
170
|
+
return items;
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Discover usability improvement opportunities.
|
|
174
|
+
*/
|
|
175
|
+
function discoverUsabilityItems(cwd) {
|
|
176
|
+
const items = [];
|
|
177
|
+
const cmdDir = path.join(cwd, 'commands');
|
|
178
|
+
try {
|
|
179
|
+
const cmdFiles = fs
|
|
180
|
+
.readdirSync(cmdDir, { withFileTypes: true })
|
|
181
|
+
.filter((e) => e.isFile() && e.name.endsWith('.md'))
|
|
182
|
+
.map((e) => e.name);
|
|
183
|
+
for (const file of cmdFiles) {
|
|
184
|
+
const content = safeReadFile(path.join(cmdDir, file));
|
|
185
|
+
if (!content)
|
|
186
|
+
continue;
|
|
187
|
+
const fmMatch = content.match(/^---\n([\s\S]*?)\n---/);
|
|
188
|
+
if (fmMatch) {
|
|
189
|
+
const frontmatter = fmMatch[1];
|
|
190
|
+
if (!frontmatter.includes('description:') || frontmatter.match(/description:\s*$/m)) {
|
|
191
|
+
items.push(createWorkItem('usability', `add-description-${path.basename(file, '.md')}`, `Add description to command ${file}`, `Command file commands/${file} is missing a description in its frontmatter. Add a clear description to improve discoverability.`, { effort: 'small' }));
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
catch {
|
|
197
|
+
/* commands/ directory missing */
|
|
198
|
+
}
|
|
199
|
+
const libDir = path.join(cwd, 'lib');
|
|
200
|
+
try {
|
|
201
|
+
const libFiles = listSourceFiles(libDir);
|
|
202
|
+
for (const file of libFiles) {
|
|
203
|
+
const content = readLibFileCached(path.join(libDir, file));
|
|
204
|
+
if (!content)
|
|
205
|
+
continue;
|
|
206
|
+
const exportBlock = content.match(/module\.exports\s*=\s*\{([^}]+)\}/s);
|
|
207
|
+
if (!exportBlock)
|
|
208
|
+
continue;
|
|
209
|
+
const exportedNames = exportBlock[1]
|
|
210
|
+
.split(',')
|
|
211
|
+
.map((s) => s.trim())
|
|
212
|
+
.filter(Boolean)
|
|
213
|
+
.map((s) => {
|
|
214
|
+
const m = s.match(/^(\w+)/);
|
|
215
|
+
return m ? m[1] : '';
|
|
216
|
+
})
|
|
217
|
+
.filter(Boolean);
|
|
218
|
+
for (const name of exportedNames) {
|
|
219
|
+
const funcIdx = content.indexOf(`function ${name}(`);
|
|
220
|
+
if (funcIdx === -1)
|
|
221
|
+
continue;
|
|
222
|
+
const beforeFunc = content.substring(0, funcIdx);
|
|
223
|
+
const beforeLines = beforeFunc.split('\n');
|
|
224
|
+
const startCheck = Math.max(0, beforeLines.length - 6);
|
|
225
|
+
const contextLines = beforeLines.slice(startCheck).join('\n');
|
|
226
|
+
if (!contextLines.includes('/**')) {
|
|
227
|
+
items.push(createWorkItem('usability', `add-jsdoc-${stripExt(file)}-${name}`, `Add JSDoc to ${name} in ${file}`, `Exported function ${name} in lib/${file} lacks JSDoc documentation. Add parameter and return type annotations.`, { effort: 'small' }));
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
catch (err) {
|
|
233
|
+
if (err &&
|
|
234
|
+
err.code &&
|
|
235
|
+
err.code !== 'ENOENT')
|
|
236
|
+
throw err;
|
|
237
|
+
}
|
|
238
|
+
return items;
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Discover consistency improvement opportunities.
|
|
242
|
+
*/
|
|
243
|
+
function discoverConsistencyItems(cwd) {
|
|
244
|
+
const items = [];
|
|
245
|
+
const libDir = path.join(cwd, 'lib');
|
|
246
|
+
try {
|
|
247
|
+
const libFiles = listSourceFiles(libDir);
|
|
248
|
+
for (const file of libFiles) {
|
|
249
|
+
const content = readLibFileCached(path.join(libDir, file));
|
|
250
|
+
if (!content)
|
|
251
|
+
continue;
|
|
252
|
+
if (content.includes('process.exit(')) {
|
|
253
|
+
items.push(createWorkItem('consistency', `remove-process-exit-${stripExt(file)}`, `Replace process.exit calls in ${file}`, `lib/${file} uses process.exit() directly. Use the error() utility function instead for consistent error handling.`, { effort: 'small' }));
|
|
254
|
+
}
|
|
255
|
+
const firstLines = content.split('\n').slice(0, 5).join('\n');
|
|
256
|
+
if (!firstLines.includes('/**')) {
|
|
257
|
+
items.push(createWorkItem('consistency', `add-module-header-${stripExt(file)}`, `Add module JSDoc header to ${file}`, `lib/${file} is missing the standard JSDoc module header comment at the top of the file.`, { effort: 'small' }));
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
catch (err) {
|
|
262
|
+
if (err &&
|
|
263
|
+
err.code &&
|
|
264
|
+
err.code !== 'ENOENT')
|
|
265
|
+
throw err;
|
|
266
|
+
}
|
|
267
|
+
return items;
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Discover stability improvement opportunities.
|
|
271
|
+
*/
|
|
272
|
+
function discoverStabilityItems(cwd) {
|
|
273
|
+
const items = [];
|
|
274
|
+
const libDir = path.join(cwd, 'lib');
|
|
275
|
+
try {
|
|
276
|
+
const libFiles = listSourceFiles(libDir);
|
|
277
|
+
for (const file of libFiles) {
|
|
278
|
+
const base = stripExt(file);
|
|
279
|
+
const content = readLibFileCached(path.join(libDir, file));
|
|
280
|
+
if (!content)
|
|
281
|
+
continue;
|
|
282
|
+
const emptyCatchPattern = /catch\s*(?:\([^)]*\))?\s*\{\s*\}/g;
|
|
283
|
+
let catchMatch;
|
|
284
|
+
while ((catchMatch = emptyCatchPattern.exec(content)) !== null) {
|
|
285
|
+
const lineNum = content.substring(0, catchMatch.index).split('\n').length;
|
|
286
|
+
items.push(createWorkItem('stability', `fix-empty-catch-${base}-L${lineNum}`, `Handle error in empty catch block in ${file} line ${lineNum}`, `lib/${file} has an empty catch block at line ${lineNum} that silently swallows errors. Add error logging or explicit comment explaining why the error is intentionally ignored.`, { effort: 'small' }));
|
|
287
|
+
}
|
|
288
|
+
if (base !== 'paths' && base !== 'evolve') {
|
|
289
|
+
const hardcodedPathPattern = /['"]\.planning\//g;
|
|
290
|
+
let pathMatch;
|
|
291
|
+
while ((pathMatch = hardcodedPathPattern.exec(content)) !== null) {
|
|
292
|
+
const lineNum = content.substring(0, pathMatch.index).split('\n').length;
|
|
293
|
+
items.push(createWorkItem('stability', `use-paths-module-${base}-L${lineNum}`, `Use paths module instead of hardcoded path in ${file}`, `lib/${file} has a hardcoded ".planning/" path at line ${lineNum}. Use lib/paths module functions for path resolution to ensure consistency across environments.`, { effort: 'small' }));
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
catch (err) {
|
|
299
|
+
if (err &&
|
|
300
|
+
err.code &&
|
|
301
|
+
err.code !== 'ENOENT')
|
|
302
|
+
throw err;
|
|
303
|
+
}
|
|
304
|
+
return items;
|
|
305
|
+
}
|
|
306
|
+
// ─── Orchestration ──────────────────────────────────────────────────────────
|
|
307
|
+
/**
|
|
308
|
+
* Run a single dimension discoverer defensively.
|
|
309
|
+
*/
|
|
310
|
+
function _discoverDimension(name, finder, cwd) {
|
|
311
|
+
try {
|
|
312
|
+
return finder(cwd);
|
|
313
|
+
}
|
|
314
|
+
catch (err) {
|
|
315
|
+
if (err &&
|
|
316
|
+
err.code &&
|
|
317
|
+
err.code !== 'ENOENT') {
|
|
318
|
+
process.stderr.write(`[evolve] discoverer error (${name}, ${err.code}): ${err.message}\n`);
|
|
319
|
+
}
|
|
320
|
+
return [];
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* Analyze the codebase and produce categorized work items across all 7 dimensions.
|
|
325
|
+
*/
|
|
326
|
+
function analyzeCodebaseForItems(cwd) {
|
|
327
|
+
const { discoverImproveFeatureItems, discoverNewFeatureItems, } = require('./_dimensions-features');
|
|
328
|
+
// Note: 'product-ideation' dimension is NOT included in the hardcoded fallback.
|
|
329
|
+
// Product ideation requires Claude (it reads project vision, roadmap, etc. and
|
|
330
|
+
// generates creative feature ideas). It only runs via the Claude-powered discovery
|
|
331
|
+
// path in discovery.ts:discoverWithClaude -> _product-ideation.ts:discoverProductIdeationItems.
|
|
332
|
+
const discoverers = [
|
|
333
|
+
['improve-features', discoverImproveFeatureItems],
|
|
334
|
+
['new-features', discoverNewFeatureItems],
|
|
335
|
+
['productivity', discoverProductivityItems],
|
|
336
|
+
['quality', discoverQualityItems],
|
|
337
|
+
['usability', discoverUsabilityItems],
|
|
338
|
+
['consistency', discoverConsistencyItems],
|
|
339
|
+
['stability', discoverStabilityItems],
|
|
340
|
+
];
|
|
341
|
+
const items = [];
|
|
342
|
+
for (const [name, finder] of discoverers) {
|
|
343
|
+
items.push(..._discoverDimension(name, finder, cwd));
|
|
344
|
+
}
|
|
345
|
+
return items;
|
|
346
|
+
}
|
|
347
|
+
// ─── Exports ────────────────────────────────────────────────────────────────
|
|
348
|
+
module.exports = {
|
|
349
|
+
listSourceFiles,
|
|
350
|
+
stripExt,
|
|
351
|
+
discoverProductivityItems,
|
|
352
|
+
discoverQualityItems,
|
|
353
|
+
discoverUsabilityItems,
|
|
354
|
+
discoverConsistencyItems,
|
|
355
|
+
discoverStabilityItems,
|
|
356
|
+
analyzeCodebaseForItems,
|
|
357
|
+
};
|
|
358
|
+
//# sourceMappingURL=_dimensions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_dimensions.js","sourceRoot":"","sources":["../../../lib/evolve/_dimensions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_product-ideation.d.ts","sourceRoot":"","sources":["../../../lib/evolve/_product-ideation.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const path = require('path');
|
|
4
|
+
const fs = require('fs');
|
|
5
|
+
const { safeReadFile, } = require('../utils');
|
|
6
|
+
const { spawnClaudeAsync, } = require('../autopilot');
|
|
7
|
+
const { createWorkItem, SONNET_MODEL, } = require('./state');
|
|
8
|
+
// ── Context Gathering ────────────────────────────────────────────────────────
|
|
9
|
+
/**
|
|
10
|
+
* Gather product context from planning files and codebase structure.
|
|
11
|
+
* Each file read is wrapped in try/catch; missing files produce null/empty fallbacks.
|
|
12
|
+
*/
|
|
13
|
+
function gatherProductContext(cwd) {
|
|
14
|
+
const planningDir = path.join(cwd, '.planning');
|
|
15
|
+
// PROJECT.md -- extract first 3000 chars (vision section)
|
|
16
|
+
let projectVision = null;
|
|
17
|
+
try {
|
|
18
|
+
const raw = safeReadFile(path.join(planningDir, 'PROJECT.md'));
|
|
19
|
+
if (raw) {
|
|
20
|
+
projectVision = raw.substring(0, 3000);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
catch (err) {
|
|
24
|
+
process.stderr.write(`[evolve] Product ideation: failed to read PROJECT.md: ${err.message}\n`);
|
|
25
|
+
}
|
|
26
|
+
// LONG-TERM-ROADMAP.md -- extract first 2000 chars
|
|
27
|
+
let longTermGoals = null;
|
|
28
|
+
try {
|
|
29
|
+
const raw = safeReadFile(path.join(planningDir, 'LONG-TERM-ROADMAP.md'));
|
|
30
|
+
if (raw) {
|
|
31
|
+
longTermGoals = raw.substring(0, 2000);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
catch (err) {
|
|
35
|
+
process.stderr.write(`[evolve] Product ideation: failed to read LONG-TERM-ROADMAP.md: ${err.message}\n`);
|
|
36
|
+
}
|
|
37
|
+
// PRODUCT-QUALITY.md -- extract first 1500 chars if exists
|
|
38
|
+
let productQuality = null;
|
|
39
|
+
try {
|
|
40
|
+
const raw = safeReadFile(path.join(planningDir, 'PRODUCT-QUALITY.md'));
|
|
41
|
+
if (raw) {
|
|
42
|
+
productQuality = raw.substring(0, 1500);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
catch (err) {
|
|
46
|
+
process.stderr.write(`[evolve] Product ideation: failed to read PRODUCT-QUALITY.md: ${err.message}\n`);
|
|
47
|
+
}
|
|
48
|
+
// commands/ directory -- list .md files, extract command names
|
|
49
|
+
let existingCommands = [];
|
|
50
|
+
try {
|
|
51
|
+
const cmdDir = path.join(cwd, 'commands');
|
|
52
|
+
const entries = fs.readdirSync(cmdDir, { withFileTypes: true });
|
|
53
|
+
existingCommands = entries
|
|
54
|
+
.filter((e) => e.isFile() && e.name.endsWith('.md'))
|
|
55
|
+
.map((e) => e.name.replace(/\.md$/, ''));
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
// commands/ directory missing -- not critical
|
|
59
|
+
}
|
|
60
|
+
// agents/ directory -- list .md files, extract agent names
|
|
61
|
+
let existingAgents = [];
|
|
62
|
+
try {
|
|
63
|
+
const agentDir = path.join(cwd, 'agents');
|
|
64
|
+
const entries = fs.readdirSync(agentDir, { withFileTypes: true });
|
|
65
|
+
existingAgents = entries
|
|
66
|
+
.filter((e) => e.isFile() && e.name.endsWith('.md'))
|
|
67
|
+
.map((e) => e.name.replace(/\.md$/, ''));
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
// agents/ directory missing -- not critical
|
|
71
|
+
}
|
|
72
|
+
// ROADMAP.md -- extract last ~2000 chars (recent phases)
|
|
73
|
+
let recentPhases = null;
|
|
74
|
+
try {
|
|
75
|
+
const raw = safeReadFile(path.join(planningDir, 'ROADMAP.md'));
|
|
76
|
+
if (raw) {
|
|
77
|
+
recentPhases = raw.length > 2000 ? raw.substring(raw.length - 2000) : raw;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
catch (err) {
|
|
81
|
+
process.stderr.write(`[evolve] Product ideation: failed to read ROADMAP.md: ${err.message}\n`);
|
|
82
|
+
}
|
|
83
|
+
return {
|
|
84
|
+
projectVision,
|
|
85
|
+
longTermGoals,
|
|
86
|
+
existingCommands,
|
|
87
|
+
existingAgents,
|
|
88
|
+
recentPhases,
|
|
89
|
+
productQuality,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
// ── Prompt Construction ──────────────────────────────────────────────────────
|
|
93
|
+
/**
|
|
94
|
+
* Build a product-manager-focused prompt for Claude.
|
|
95
|
+
* This is fundamentally different from buildDiscoveryPrompt in discovery.ts --
|
|
96
|
+
* it asks for creative feature ideas, not code-quality improvements.
|
|
97
|
+
*/
|
|
98
|
+
function buildProductIdeationPrompt(context) {
|
|
99
|
+
const sections = [];
|
|
100
|
+
sections.push('You are a product manager for a developer tools company. Your job is to generate creative, high-value feature ideas for this product.');
|
|
101
|
+
sections.push('');
|
|
102
|
+
sections.push('## Product Vision');
|
|
103
|
+
if (context.projectVision) {
|
|
104
|
+
sections.push(context.projectVision);
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
sections.push('(No PROJECT.md found -- infer from existing commands and agents.)');
|
|
108
|
+
}
|
|
109
|
+
if (context.longTermGoals) {
|
|
110
|
+
sections.push('');
|
|
111
|
+
sections.push('## Long-Term Roadmap Goals');
|
|
112
|
+
sections.push(context.longTermGoals);
|
|
113
|
+
}
|
|
114
|
+
if (context.productQuality) {
|
|
115
|
+
sections.push('');
|
|
116
|
+
sections.push('## Known Product Quality Gaps');
|
|
117
|
+
sections.push(context.productQuality);
|
|
118
|
+
}
|
|
119
|
+
sections.push('');
|
|
120
|
+
sections.push('## What Already Exists');
|
|
121
|
+
if (context.existingCommands.length > 0) {
|
|
122
|
+
sections.push('');
|
|
123
|
+
sections.push('### Commands');
|
|
124
|
+
sections.push(context.existingCommands.map((c) => `- /${c}`).join('\n'));
|
|
125
|
+
}
|
|
126
|
+
if (context.existingAgents.length > 0) {
|
|
127
|
+
sections.push('');
|
|
128
|
+
sections.push('### Agents');
|
|
129
|
+
sections.push(context.existingAgents.map((a) => `- ${a}`).join('\n'));
|
|
130
|
+
}
|
|
131
|
+
if (context.recentPhases) {
|
|
132
|
+
sections.push('');
|
|
133
|
+
sections.push('## Recently Built (for context on momentum)');
|
|
134
|
+
sections.push(context.recentPhases);
|
|
135
|
+
}
|
|
136
|
+
sections.push('');
|
|
137
|
+
sections.push('## Your Task');
|
|
138
|
+
sections.push('');
|
|
139
|
+
sections.push('Generate creative feature ideas across these categories:');
|
|
140
|
+
sections.push('- New user-facing commands or workflows');
|
|
141
|
+
sections.push('- New integrations with external tools/services');
|
|
142
|
+
sections.push('- UX improvements to existing workflows');
|
|
143
|
+
sections.push('- Developer experience enhancements');
|
|
144
|
+
sections.push('- New analysis or insight capabilities');
|
|
145
|
+
sections.push('- Automation or productivity features');
|
|
146
|
+
sections.push('');
|
|
147
|
+
sections.push('## Output Format');
|
|
148
|
+
sections.push('');
|
|
149
|
+
sections.push('Output ONLY a JSON array. Each item:');
|
|
150
|
+
sections.push('{"dimension":"product-ideation","slug":"<kebab-id>","title":"<short title>","description":"<what it does + why users need it + what pain point it solves>","effort":"small|medium|large"}');
|
|
151
|
+
sections.push('');
|
|
152
|
+
sections.push('## Rules');
|
|
153
|
+
sections.push('- Think about USER VALUE, not code hygiene');
|
|
154
|
+
sections.push('- Each idea should solve a real user problem or unlock a new capability');
|
|
155
|
+
sections.push('- Be creative but realistic -- ideas must be directly implementable as code');
|
|
156
|
+
sections.push('- Include the "why" -- what user pain point does this address?');
|
|
157
|
+
sections.push('- Each description MUST specify: which files to create/modify, what the implementation looks like, entry point');
|
|
158
|
+
sections.push('- Bad: "Add a dashboard for metrics" (too vague)');
|
|
159
|
+
sections.push('- Good: "Add `gd metrics` CLI command in bin/grd-tools.ts that reads .planning/EVOLVE-STATE.json and outputs iteration success rate, avg items/iteration, and top themes — helps users understand evolve effectiveness"');
|
|
160
|
+
sections.push('- 3-5 items only — each must be specific enough to implement in one session');
|
|
161
|
+
sections.push('- ONLY the JSON array, no other text');
|
|
162
|
+
sections.push('- Every item MUST have dimension "product-ideation"');
|
|
163
|
+
sections.push('- Slugs should be descriptive kebab-case (e.g. "auto-changelog-generation", "dependency-impact-analysis")');
|
|
164
|
+
return sections.join('\n');
|
|
165
|
+
}
|
|
166
|
+
// ── Output Parsing ───────────────────────────────────────────────────────────
|
|
167
|
+
/**
|
|
168
|
+
* Parse Claude's product ideation output into validated WorkItem objects.
|
|
169
|
+
* Only accepts items where dimension === 'product-ideation'.
|
|
170
|
+
* Returns empty array if parsing fails (no crash).
|
|
171
|
+
*/
|
|
172
|
+
function parseProductIdeationOutput(raw) {
|
|
173
|
+
let jsonStr = raw.trim();
|
|
174
|
+
// Strip markdown fences if present
|
|
175
|
+
const fenceMatch = jsonStr.match(/```(?:json)?\s*\n?([\s\S]*?)\n?\s*```/);
|
|
176
|
+
if (fenceMatch) {
|
|
177
|
+
jsonStr = fenceMatch[1].trim();
|
|
178
|
+
}
|
|
179
|
+
let parsed;
|
|
180
|
+
try {
|
|
181
|
+
parsed = JSON.parse(jsonStr);
|
|
182
|
+
}
|
|
183
|
+
catch {
|
|
184
|
+
return [];
|
|
185
|
+
}
|
|
186
|
+
if (!Array.isArray(parsed)) {
|
|
187
|
+
return [];
|
|
188
|
+
}
|
|
189
|
+
const validEfforts = ['small', 'medium', 'large'];
|
|
190
|
+
const items = [];
|
|
191
|
+
for (const entry of parsed) {
|
|
192
|
+
if (!entry ||
|
|
193
|
+
typeof entry.dimension !== 'string' ||
|
|
194
|
+
typeof entry.slug !== 'string' ||
|
|
195
|
+
typeof entry.title !== 'string' ||
|
|
196
|
+
typeof entry.description !== 'string') {
|
|
197
|
+
continue;
|
|
198
|
+
}
|
|
199
|
+
// Only accept product-ideation dimension
|
|
200
|
+
if (entry.dimension !== 'product-ideation') {
|
|
201
|
+
continue;
|
|
202
|
+
}
|
|
203
|
+
const effort = validEfforts.includes(entry.effort)
|
|
204
|
+
? entry.effort
|
|
205
|
+
: 'medium';
|
|
206
|
+
try {
|
|
207
|
+
items.push(createWorkItem(entry.dimension, entry.slug, entry.title, entry.description, { effort }));
|
|
208
|
+
}
|
|
209
|
+
catch {
|
|
210
|
+
// Skip invalid items (e.g., if createWorkItem rejects the dimension)
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
return items;
|
|
214
|
+
}
|
|
215
|
+
// ── Main Discovery Function ──────────────────────────────────────────────────
|
|
216
|
+
/**
|
|
217
|
+
* Discover product-level feature ideas by spawning Claude with a product-manager prompt.
|
|
218
|
+
* Returns empty array on failure (graceful fallback, no crash).
|
|
219
|
+
*/
|
|
220
|
+
async function discoverProductIdeationItems(cwd, opts) {
|
|
221
|
+
const context = gatherProductContext(cwd);
|
|
222
|
+
// If no PROJECT.md found, skip product ideation entirely
|
|
223
|
+
if (context.projectVision === null) {
|
|
224
|
+
process.stderr.write('[evolve] Product ideation skipped: no PROJECT.md found\n');
|
|
225
|
+
return [];
|
|
226
|
+
}
|
|
227
|
+
const DEFAULT_IDEATION_TIMEOUT = 10_800_000; // 3 hours
|
|
228
|
+
const effectiveTimeout = opts?.timeoutMs || DEFAULT_IDEATION_TIMEOUT;
|
|
229
|
+
const scheduler = opts?.scheduler;
|
|
230
|
+
const prompt = buildProductIdeationPrompt(context);
|
|
231
|
+
try {
|
|
232
|
+
const result = scheduler
|
|
233
|
+
? await scheduler.spawn(prompt, {
|
|
234
|
+
model: SONNET_MODEL,
|
|
235
|
+
maxTurns: 15,
|
|
236
|
+
timeout: effectiveTimeout,
|
|
237
|
+
captureOutput: true,
|
|
238
|
+
cwd,
|
|
239
|
+
workItemId: `evolve-discovery-product-ideation-${Date.now()}`,
|
|
240
|
+
agentType: 'grd-planner',
|
|
241
|
+
})
|
|
242
|
+
: await spawnClaudeAsync(cwd, prompt, {
|
|
243
|
+
captureOutput: true,
|
|
244
|
+
model: SONNET_MODEL,
|
|
245
|
+
maxTurns: 15,
|
|
246
|
+
timeout: effectiveTimeout,
|
|
247
|
+
outputFormat: 'text',
|
|
248
|
+
});
|
|
249
|
+
if (result.timedOut) {
|
|
250
|
+
process.stderr.write(`[evolve] Product ideation timed out after ${Math.round(effectiveTimeout / 1000)}s, returning empty\n`);
|
|
251
|
+
return [];
|
|
252
|
+
}
|
|
253
|
+
if (result.exitCode !== 0 || !result.stdout) {
|
|
254
|
+
process.stderr.write(`[evolve] Product ideation failed (exit=${result.exitCode}), returning empty\n`);
|
|
255
|
+
return [];
|
|
256
|
+
}
|
|
257
|
+
// Check for error message in stdout (e.g., max-turns exceeded)
|
|
258
|
+
if (result.stdout.startsWith('Error:')) {
|
|
259
|
+
process.stderr.write(`[evolve] Product ideation error: ${result.stdout.trim()}, returning empty\n`);
|
|
260
|
+
return [];
|
|
261
|
+
}
|
|
262
|
+
const items = parseProductIdeationOutput(result.stdout);
|
|
263
|
+
if (items.length === 0) {
|
|
264
|
+
process.stderr.write(`[evolve] Product ideation returned unparseable output (${result.stdout.length} chars), returning empty\n`);
|
|
265
|
+
return [];
|
|
266
|
+
}
|
|
267
|
+
return items;
|
|
268
|
+
}
|
|
269
|
+
catch (err) {
|
|
270
|
+
process.stderr.write(`[evolve] Product ideation threw: ${err.message}, returning empty\n`);
|
|
271
|
+
return [];
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
// ── Exports ──────────────────────────────────────────────────────────────────
|
|
275
|
+
module.exports = {
|
|
276
|
+
gatherProductContext,
|
|
277
|
+
buildProductIdeationPrompt,
|
|
278
|
+
parseProductIdeationOutput,
|
|
279
|
+
discoverProductIdeationItems,
|
|
280
|
+
};
|
|
281
|
+
//# sourceMappingURL=_product-ideation.js.map
|