@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.
Files changed (711) hide show
  1. package/.claude-plugin/plugin.json +103 -0
  2. package/README.md +211 -0
  3. package/agents/grd-baseline-assessor.md +684 -0
  4. package/agents/grd-code-reviewer.md +300 -0
  5. package/agents/grd-codebase-mapper.md +355 -0
  6. package/agents/grd-critique-agent.md +119 -0
  7. package/agents/grd-debugger.md +519 -0
  8. package/agents/grd-deep-diver.md +737 -0
  9. package/agents/grd-eval-planner.md +913 -0
  10. package/agents/grd-eval-reporter.md +717 -0
  11. package/agents/grd-executor.md +683 -0
  12. package/agents/grd-feasibility-analyst.md +624 -0
  13. package/agents/grd-integration-checker.md +367 -0
  14. package/agents/grd-knowledge-miner.md +81 -0
  15. package/agents/grd-migrator.md +88 -0
  16. package/agents/grd-phase-researcher.md +697 -0
  17. package/agents/grd-plan-checker.md +443 -0
  18. package/agents/grd-planner.md +1532 -0
  19. package/agents/grd-product-owner.md +562 -0
  20. package/agents/grd-project-researcher.md +513 -0
  21. package/agents/grd-research-synthesizer.md +273 -0
  22. package/agents/grd-roadmapper.md +798 -0
  23. package/agents/grd-surveyor.md +566 -0
  24. package/agents/grd-verifier.md +893 -0
  25. package/bin/gd.js +4 -0
  26. package/bin/gd.ts +227 -0
  27. package/bin/grd-manifest.js +4 -0
  28. package/bin/grd-manifest.ts +286 -0
  29. package/bin/grd-mcp-server.js +4 -0
  30. package/bin/grd-mcp-server.ts +124 -0
  31. package/bin/grd-tools.js +4 -0
  32. package/bin/grd-tools.ts +2471 -0
  33. package/bin/postinstall.js +4 -0
  34. package/bin/postinstall.ts +80 -0
  35. package/commands/add-phase.md +123 -0
  36. package/commands/add-todo.md +87 -0
  37. package/commands/assess-baseline.md +289 -0
  38. package/commands/autopilot.md +100 -0
  39. package/commands/autoplan.md +55 -0
  40. package/commands/check-todos.md +87 -0
  41. package/commands/compare-methods.md +262 -0
  42. package/commands/complete-milestone.md +225 -0
  43. package/commands/debug.md +372 -0
  44. package/commands/deep-dive.md +288 -0
  45. package/commands/discover.md +281 -0
  46. package/commands/discuss-phase.md +188 -0
  47. package/commands/discuss.md +55 -0
  48. package/commands/eval-report.md +310 -0
  49. package/commands/evolve.md +79 -0
  50. package/commands/execute-phase.md +1017 -0
  51. package/commands/feasibility.md +292 -0
  52. package/commands/help.md +407 -0
  53. package/commands/init.md +1508 -0
  54. package/commands/insert-phase.md +113 -0
  55. package/commands/iterate.md +327 -0
  56. package/commands/list-phase-assumptions.md +217 -0
  57. package/commands/long-term-roadmap.md +202 -0
  58. package/commands/map-codebase.md +111 -0
  59. package/commands/migrate.md +159 -0
  60. package/commands/new-milestone.md +169 -0
  61. package/commands/pause-work.md +83 -0
  62. package/commands/plan-milestone-gaps.md +373 -0
  63. package/commands/plan-phase.md +655 -0
  64. package/commands/principles.md +328 -0
  65. package/commands/product-plan.md +319 -0
  66. package/commands/progress.md +481 -0
  67. package/commands/quick.md +167 -0
  68. package/commands/reapply-patches.md +154 -0
  69. package/commands/remove-phase.md +97 -0
  70. package/commands/requirement.md +96 -0
  71. package/commands/resume-project.md +113 -0
  72. package/commands/settings.md +1144 -0
  73. package/commands/survey.md +242 -0
  74. package/commands/sync.md +246 -0
  75. package/commands/tracker-setup.md +322 -0
  76. package/commands/update.md +202 -0
  77. package/commands/verify-phase.md +335 -0
  78. package/commands/verify-work.md +701 -0
  79. package/commands/wireup.md +29 -0
  80. package/dist/bin/gd.d.ts +3 -0
  81. package/dist/bin/gd.d.ts.map +1 -0
  82. package/dist/bin/gd.js +178 -0
  83. package/dist/bin/gd.js.map +1 -0
  84. package/dist/bin/grd-manifest.d.ts +3 -0
  85. package/dist/bin/grd-manifest.d.ts.map +1 -0
  86. package/dist/bin/grd-manifest.js +202 -0
  87. package/dist/bin/grd-manifest.js.map +1 -0
  88. package/dist/bin/grd-mcp-server.d.ts +3 -0
  89. package/dist/bin/grd-mcp-server.d.ts.map +1 -0
  90. package/dist/bin/grd-mcp-server.js +71 -0
  91. package/dist/bin/grd-mcp-server.js.map +1 -0
  92. package/dist/bin/grd-tools.d.ts +3 -0
  93. package/dist/bin/grd-tools.d.ts.map +1 -0
  94. package/dist/bin/grd-tools.js +1680 -0
  95. package/dist/bin/grd-tools.js.map +1 -0
  96. package/dist/bin/postinstall.d.ts +3 -0
  97. package/dist/bin/postinstall.d.ts.map +1 -0
  98. package/dist/bin/postinstall.js +61 -0
  99. package/dist/bin/postinstall.js.map +1 -0
  100. package/dist/lib/autopilot-milestone.d.ts +2 -0
  101. package/dist/lib/autopilot-milestone.d.ts.map +1 -0
  102. package/dist/lib/autopilot-milestone.js +94 -0
  103. package/dist/lib/autopilot-milestone.js.map +1 -0
  104. package/dist/lib/autopilot-pipeline.d.ts +2 -0
  105. package/dist/lib/autopilot-pipeline.d.ts.map +1 -0
  106. package/dist/lib/autopilot-pipeline.js +830 -0
  107. package/dist/lib/autopilot-pipeline.js.map +1 -0
  108. package/dist/lib/autopilot-waves.d.ts +2 -0
  109. package/dist/lib/autopilot-waves.d.ts.map +1 -0
  110. package/dist/lib/autopilot-waves.js +266 -0
  111. package/dist/lib/autopilot-waves.js.map +1 -0
  112. package/dist/lib/autopilot.d.ts +2 -0
  113. package/dist/lib/autopilot.d.ts.map +1 -0
  114. package/dist/lib/autopilot.js +1314 -0
  115. package/dist/lib/autopilot.js.map +1 -0
  116. package/dist/lib/autoplan.d.ts +2 -0
  117. package/dist/lib/autoplan.d.ts.map +1 -0
  118. package/dist/lib/autoplan.js +198 -0
  119. package/dist/lib/autoplan.js.map +1 -0
  120. package/dist/lib/autoresearch.d.ts +2 -0
  121. package/dist/lib/autoresearch.d.ts.map +1 -0
  122. package/dist/lib/autoresearch.js +626 -0
  123. package/dist/lib/autoresearch.js.map +1 -0
  124. package/dist/lib/backend.d.ts +2 -0
  125. package/dist/lib/backend.d.ts.map +1 -0
  126. package/dist/lib/backend.js +1036 -0
  127. package/dist/lib/backend.js.map +1 -0
  128. package/dist/lib/benchmark.d.ts +99 -0
  129. package/dist/lib/benchmark.d.ts.map +1 -0
  130. package/dist/lib/benchmark.js +278 -0
  131. package/dist/lib/benchmark.js.map +1 -0
  132. package/dist/lib/citations.d.ts +2 -0
  133. package/dist/lib/citations.d.ts.map +1 -0
  134. package/dist/lib/citations.js +642 -0
  135. package/dist/lib/citations.js.map +1 -0
  136. package/dist/lib/cleanup.d.ts +2 -0
  137. package/dist/lib/cleanup.d.ts.map +1 -0
  138. package/dist/lib/cleanup.js +1222 -0
  139. package/dist/lib/cleanup.js.map +1 -0
  140. package/dist/lib/cli/adapters.d.ts +10 -0
  141. package/dist/lib/cli/adapters.d.ts.map +1 -0
  142. package/dist/lib/cli/adapters.js +27 -0
  143. package/dist/lib/cli/adapters.js.map +1 -0
  144. package/dist/lib/cli/agent.d.ts +17 -0
  145. package/dist/lib/cli/agent.d.ts.map +1 -0
  146. package/dist/lib/cli/agent.js +53 -0
  147. package/dist/lib/cli/agent.js.map +1 -0
  148. package/dist/lib/cli/index.d.ts +21 -0
  149. package/dist/lib/cli/index.d.ts.map +1 -0
  150. package/dist/lib/cli/index.js +264 -0
  151. package/dist/lib/cli/index.js.map +1 -0
  152. package/dist/lib/cli/output.d.ts +20 -0
  153. package/dist/lib/cli/output.d.ts.map +1 -0
  154. package/dist/lib/cli/output.js +22 -0
  155. package/dist/lib/cli/output.js.map +1 -0
  156. package/dist/lib/cli/scan-dispatch.d.ts +9 -0
  157. package/dist/lib/cli/scan-dispatch.d.ts.map +1 -0
  158. package/dist/lib/cli/scan-dispatch.js +107 -0
  159. package/dist/lib/cli/scan-dispatch.js.map +1 -0
  160. package/dist/lib/cli/tools.d.ts +16 -0
  161. package/dist/lib/cli/tools.d.ts.map +1 -0
  162. package/dist/lib/cli/tools.js +168 -0
  163. package/dist/lib/cli/tools.js.map +1 -0
  164. package/dist/lib/commands/_dashboard-parsers.d.ts +2 -0
  165. package/dist/lib/commands/_dashboard-parsers.d.ts.map +1 -0
  166. package/dist/lib/commands/_dashboard-parsers.js +192 -0
  167. package/dist/lib/commands/_dashboard-parsers.js.map +1 -0
  168. package/dist/lib/commands/analysis.d.ts +2 -0
  169. package/dist/lib/commands/analysis.d.ts.map +1 -0
  170. package/dist/lib/commands/analysis.js +1418 -0
  171. package/dist/lib/commands/analysis.js.map +1 -0
  172. package/dist/lib/commands/assumptions.d.ts +2 -0
  173. package/dist/lib/commands/assumptions.d.ts.map +1 -0
  174. package/dist/lib/commands/assumptions.js +166 -0
  175. package/dist/lib/commands/assumptions.js.map +1 -0
  176. package/dist/lib/commands/blame.d.ts +2 -0
  177. package/dist/lib/commands/blame.d.ts.map +1 -0
  178. package/dist/lib/commands/blame.js +133 -0
  179. package/dist/lib/commands/blame.js.map +1 -0
  180. package/dist/lib/commands/budget.d.ts +2 -0
  181. package/dist/lib/commands/budget.d.ts.map +1 -0
  182. package/dist/lib/commands/budget.js +100 -0
  183. package/dist/lib/commands/budget.js.map +1 -0
  184. package/dist/lib/commands/check-plans.d.ts +2 -0
  185. package/dist/lib/commands/check-plans.d.ts.map +1 -0
  186. package/dist/lib/commands/check-plans.js +190 -0
  187. package/dist/lib/commands/check-plans.js.map +1 -0
  188. package/dist/lib/commands/config.d.ts +2 -0
  189. package/dist/lib/commands/config.d.ts.map +1 -0
  190. package/dist/lib/commands/config.js +188 -0
  191. package/dist/lib/commands/config.js.map +1 -0
  192. package/dist/lib/commands/dashboard.d.ts +2 -0
  193. package/dist/lib/commands/dashboard.d.ts.map +1 -0
  194. package/dist/lib/commands/dashboard.js +466 -0
  195. package/dist/lib/commands/dashboard.js.map +1 -0
  196. package/dist/lib/commands/estimate.d.ts +2 -0
  197. package/dist/lib/commands/estimate.d.ts.map +1 -0
  198. package/dist/lib/commands/estimate.js +148 -0
  199. package/dist/lib/commands/estimate.js.map +1 -0
  200. package/dist/lib/commands/eval-diff.d.ts +2 -0
  201. package/dist/lib/commands/eval-diff.d.ts.map +1 -0
  202. package/dist/lib/commands/eval-diff.js +213 -0
  203. package/dist/lib/commands/eval-diff.js.map +1 -0
  204. package/dist/lib/commands/freshness.d.ts +2 -0
  205. package/dist/lib/commands/freshness.d.ts.map +1 -0
  206. package/dist/lib/commands/freshness.js +163 -0
  207. package/dist/lib/commands/freshness.js.map +1 -0
  208. package/dist/lib/commands/health.d.ts +2 -0
  209. package/dist/lib/commands/health.d.ts.map +1 -0
  210. package/dist/lib/commands/health.js +435 -0
  211. package/dist/lib/commands/health.js.map +1 -0
  212. package/dist/lib/commands/index.d.ts +2 -0
  213. package/dist/lib/commands/index.d.ts.map +1 -0
  214. package/dist/lib/commands/index.js +128 -0
  215. package/dist/lib/commands/index.js.map +1 -0
  216. package/dist/lib/commands/install.d.ts +56 -0
  217. package/dist/lib/commands/install.d.ts.map +1 -0
  218. package/dist/lib/commands/install.js +214 -0
  219. package/dist/lib/commands/install.js.map +1 -0
  220. package/dist/lib/commands/knowhow-aggregator.d.ts +2 -0
  221. package/dist/lib/commands/knowhow-aggregator.d.ts.map +1 -0
  222. package/dist/lib/commands/knowhow-aggregator.js +279 -0
  223. package/dist/lib/commands/knowhow-aggregator.js.map +1 -0
  224. package/dist/lib/commands/knowledge-search.d.ts +2 -0
  225. package/dist/lib/commands/knowledge-search.d.ts.map +1 -0
  226. package/dist/lib/commands/knowledge-search.js +113 -0
  227. package/dist/lib/commands/knowledge-search.js.map +1 -0
  228. package/dist/lib/commands/long-term-roadmap.d.ts +2 -0
  229. package/dist/lib/commands/long-term-roadmap.d.ts.map +1 -0
  230. package/dist/lib/commands/long-term-roadmap.js +272 -0
  231. package/dist/lib/commands/long-term-roadmap.js.map +1 -0
  232. package/dist/lib/commands/patterns.d.ts +91 -0
  233. package/dist/lib/commands/patterns.d.ts.map +1 -0
  234. package/dist/lib/commands/patterns.js +391 -0
  235. package/dist/lib/commands/patterns.js.map +1 -0
  236. package/dist/lib/commands/phase-info.d.ts +2 -0
  237. package/dist/lib/commands/phase-info.d.ts.map +1 -0
  238. package/dist/lib/commands/phase-info.js +509 -0
  239. package/dist/lib/commands/phase-info.js.map +1 -0
  240. package/dist/lib/commands/plan-lint.d.ts +56 -0
  241. package/dist/lib/commands/plan-lint.d.ts.map +1 -0
  242. package/dist/lib/commands/plan-lint.js +481 -0
  243. package/dist/lib/commands/plan-lint.js.map +1 -0
  244. package/dist/lib/commands/plan-phase.d.ts +53 -0
  245. package/dist/lib/commands/plan-phase.d.ts.map +1 -0
  246. package/dist/lib/commands/plan-phase.js +288 -0
  247. package/dist/lib/commands/plan-phase.js.map +1 -0
  248. package/dist/lib/commands/progress.d.ts +2 -0
  249. package/dist/lib/commands/progress.d.ts.map +1 -0
  250. package/dist/lib/commands/progress.js +266 -0
  251. package/dist/lib/commands/progress.js.map +1 -0
  252. package/dist/lib/commands/quality.d.ts +2 -0
  253. package/dist/lib/commands/quality.d.ts.map +1 -0
  254. package/dist/lib/commands/quality.js +80 -0
  255. package/dist/lib/commands/quality.js.map +1 -0
  256. package/dist/lib/commands/rollback.d.ts +2 -0
  257. package/dist/lib/commands/rollback.d.ts.map +1 -0
  258. package/dist/lib/commands/rollback.js +145 -0
  259. package/dist/lib/commands/rollback.js.map +1 -0
  260. package/dist/lib/commands/scan.d.ts +25 -0
  261. package/dist/lib/commands/scan.d.ts.map +1 -0
  262. package/dist/lib/commands/scan.js +28 -0
  263. package/dist/lib/commands/scan.js.map +1 -0
  264. package/dist/lib/commands/search.d.ts +2 -0
  265. package/dist/lib/commands/search.d.ts.map +1 -0
  266. package/dist/lib/commands/search.js +212 -0
  267. package/dist/lib/commands/search.js.map +1 -0
  268. package/dist/lib/commands/select-candidate.d.ts +128 -0
  269. package/dist/lib/commands/select-candidate.d.ts.map +1 -0
  270. package/dist/lib/commands/select-candidate.js +518 -0
  271. package/dist/lib/commands/select-candidate.js.map +1 -0
  272. package/dist/lib/commands/singularity.d.ts +2 -0
  273. package/dist/lib/commands/singularity.d.ts.map +1 -0
  274. package/dist/lib/commands/singularity.js +185 -0
  275. package/dist/lib/commands/singularity.js.map +1 -0
  276. package/dist/lib/commands/slug-timestamp.d.ts +2 -0
  277. package/dist/lib/commands/slug-timestamp.d.ts.map +1 -0
  278. package/dist/lib/commands/slug-timestamp.js +54 -0
  279. package/dist/lib/commands/slug-timestamp.js.map +1 -0
  280. package/dist/lib/commands/tail.d.ts +2 -0
  281. package/dist/lib/commands/tail.d.ts.map +1 -0
  282. package/dist/lib/commands/tail.js +100 -0
  283. package/dist/lib/commands/tail.js.map +1 -0
  284. package/dist/lib/commands/todo.d.ts +2 -0
  285. package/dist/lib/commands/todo.d.ts.map +1 -0
  286. package/dist/lib/commands/todo.js +200 -0
  287. package/dist/lib/commands/todo.js.map +1 -0
  288. package/dist/lib/commands/watch.d.ts +2 -0
  289. package/dist/lib/commands/watch.d.ts.map +1 -0
  290. package/dist/lib/commands/watch.js +72 -0
  291. package/dist/lib/commands/watch.js.map +1 -0
  292. package/dist/lib/complexity.d.ts +55 -0
  293. package/dist/lib/complexity.d.ts.map +1 -0
  294. package/dist/lib/complexity.js +80 -0
  295. package/dist/lib/complexity.js.map +1 -0
  296. package/dist/lib/context/agents.d.ts +2 -0
  297. package/dist/lib/context/agents.d.ts.map +1 -0
  298. package/dist/lib/context/agents.js +344 -0
  299. package/dist/lib/context/agents.js.map +1 -0
  300. package/dist/lib/context/base.d.ts +2 -0
  301. package/dist/lib/context/base.d.ts.map +1 -0
  302. package/dist/lib/context/base.js +81 -0
  303. package/dist/lib/context/base.js.map +1 -0
  304. package/dist/lib/context/execute.d.ts +2 -0
  305. package/dist/lib/context/execute.d.ts.map +1 -0
  306. package/dist/lib/context/execute.js +753 -0
  307. package/dist/lib/context/execute.js.map +1 -0
  308. package/dist/lib/context/index.d.ts +2 -0
  309. package/dist/lib/context/index.d.ts.map +1 -0
  310. package/dist/lib/context/index.js +88 -0
  311. package/dist/lib/context/index.js.map +1 -0
  312. package/dist/lib/context/progress.d.ts +2 -0
  313. package/dist/lib/context/progress.d.ts.map +1 -0
  314. package/dist/lib/context/progress.js +178 -0
  315. package/dist/lib/context/progress.js.map +1 -0
  316. package/dist/lib/context/project.d.ts +2 -0
  317. package/dist/lib/context/project.d.ts.map +1 -0
  318. package/dist/lib/context/project.js +413 -0
  319. package/dist/lib/context/project.js.map +1 -0
  320. package/dist/lib/context/research.d.ts +2 -0
  321. package/dist/lib/context/research.d.ts.map +1 -0
  322. package/dist/lib/context/research.js +466 -0
  323. package/dist/lib/context/research.js.map +1 -0
  324. package/dist/lib/dead-ends.d.ts +28 -0
  325. package/dist/lib/dead-ends.d.ts.map +1 -0
  326. package/dist/lib/dead-ends.js +451 -0
  327. package/dist/lib/dead-ends.js.map +1 -0
  328. package/dist/lib/deps.d.ts +2 -0
  329. package/dist/lib/deps.d.ts.map +1 -0
  330. package/dist/lib/deps.js +630 -0
  331. package/dist/lib/deps.js.map +1 -0
  332. package/dist/lib/discussion.d.ts +2 -0
  333. package/dist/lib/discussion.d.ts.map +1 -0
  334. package/dist/lib/discussion.js +1041 -0
  335. package/dist/lib/discussion.js.map +1 -0
  336. package/dist/lib/drift.d.ts +36 -0
  337. package/dist/lib/drift.d.ts.map +1 -0
  338. package/dist/lib/drift.js +481 -0
  339. package/dist/lib/drift.js.map +1 -0
  340. package/dist/lib/evolve/_dimensions-features.d.ts +2 -0
  341. package/dist/lib/evolve/_dimensions-features.d.ts.map +1 -0
  342. package/dist/lib/evolve/_dimensions-features.js +369 -0
  343. package/dist/lib/evolve/_dimensions-features.js.map +1 -0
  344. package/dist/lib/evolve/_dimensions.d.ts +2 -0
  345. package/dist/lib/evolve/_dimensions.d.ts.map +1 -0
  346. package/dist/lib/evolve/_dimensions.js +358 -0
  347. package/dist/lib/evolve/_dimensions.js.map +1 -0
  348. package/dist/lib/evolve/_product-ideation.d.ts +2 -0
  349. package/dist/lib/evolve/_product-ideation.d.ts.map +1 -0
  350. package/dist/lib/evolve/_product-ideation.js +281 -0
  351. package/dist/lib/evolve/_product-ideation.js.map +1 -0
  352. package/dist/lib/evolve/_prompts.d.ts +2 -0
  353. package/dist/lib/evolve/_prompts.d.ts.map +1 -0
  354. package/dist/lib/evolve/_prompts.js +153 -0
  355. package/dist/lib/evolve/_prompts.js.map +1 -0
  356. package/dist/lib/evolve/cli.d.ts +2 -0
  357. package/dist/lib/evolve/cli.d.ts.map +1 -0
  358. package/dist/lib/evolve/cli.js +224 -0
  359. package/dist/lib/evolve/cli.js.map +1 -0
  360. package/dist/lib/evolve/discovery.d.ts +2 -0
  361. package/dist/lib/evolve/discovery.d.ts.map +1 -0
  362. package/dist/lib/evolve/discovery.js +391 -0
  363. package/dist/lib/evolve/discovery.js.map +1 -0
  364. package/dist/lib/evolve/index.d.ts +2 -0
  365. package/dist/lib/evolve/index.d.ts.map +1 -0
  366. package/dist/lib/evolve/index.js +88 -0
  367. package/dist/lib/evolve/index.js.map +1 -0
  368. package/dist/lib/evolve/orchestrator.d.ts +2 -0
  369. package/dist/lib/evolve/orchestrator.d.ts.map +1 -0
  370. package/dist/lib/evolve/orchestrator.js +851 -0
  371. package/dist/lib/evolve/orchestrator.js.map +1 -0
  372. package/dist/lib/evolve/scoring.d.ts +2 -0
  373. package/dist/lib/evolve/scoring.d.ts.map +1 -0
  374. package/dist/lib/evolve/scoring.js +118 -0
  375. package/dist/lib/evolve/scoring.js.map +1 -0
  376. package/dist/lib/evolve/state.d.ts +2 -0
  377. package/dist/lib/evolve/state.d.ts.map +1 -0
  378. package/dist/lib/evolve/state.js +264 -0
  379. package/dist/lib/evolve/state.js.map +1 -0
  380. package/dist/lib/evolve/types.d.ts +249 -0
  381. package/dist/lib/evolve/types.d.ts.map +1 -0
  382. package/dist/lib/evolve/types.js +3 -0
  383. package/dist/lib/evolve/types.js.map +1 -0
  384. package/dist/lib/frontmatter.d.ts +2 -0
  385. package/dist/lib/frontmatter.d.ts.map +1 -0
  386. package/dist/lib/frontmatter.js +513 -0
  387. package/dist/lib/frontmatter.js.map +1 -0
  388. package/dist/lib/gates.d.ts +2 -0
  389. package/dist/lib/gates.d.ts.map +1 -0
  390. package/dist/lib/gates.js +578 -0
  391. package/dist/lib/gates.js.map +1 -0
  392. package/dist/lib/genome.d.ts +10 -0
  393. package/dist/lib/genome.d.ts.map +1 -0
  394. package/dist/lib/genome.js +368 -0
  395. package/dist/lib/genome.js.map +1 -0
  396. package/dist/lib/got.d.ts +2 -0
  397. package/dist/lib/got.d.ts.map +1 -0
  398. package/dist/lib/got.js +280 -0
  399. package/dist/lib/got.js.map +1 -0
  400. package/dist/lib/invariants.d.ts +2 -0
  401. package/dist/lib/invariants.d.ts.map +1 -0
  402. package/dist/lib/invariants.js +298 -0
  403. package/dist/lib/invariants.js.map +1 -0
  404. package/dist/lib/knowledge.d.ts +2 -0
  405. package/dist/lib/knowledge.d.ts.map +1 -0
  406. package/dist/lib/knowledge.js +658 -0
  407. package/dist/lib/knowledge.js.map +1 -0
  408. package/dist/lib/long-term-roadmap.d.ts +2 -0
  409. package/dist/lib/long-term-roadmap.d.ts.map +1 -0
  410. package/dist/lib/long-term-roadmap.js +602 -0
  411. package/dist/lib/long-term-roadmap.js.map +1 -0
  412. package/dist/lib/markdown-split.d.ts +2 -0
  413. package/dist/lib/markdown-split.d.ts.map +1 -0
  414. package/dist/lib/markdown-split.js +199 -0
  415. package/dist/lib/markdown-split.js.map +1 -0
  416. package/dist/lib/mcp-server.d.ts +2 -0
  417. package/dist/lib/mcp-server.d.ts.map +1 -0
  418. package/dist/lib/mcp-server.js +2424 -0
  419. package/dist/lib/mcp-server.js.map +1 -0
  420. package/dist/lib/metrics.d.ts +16 -0
  421. package/dist/lib/metrics.d.ts.map +1 -0
  422. package/dist/lib/metrics.js +48 -0
  423. package/dist/lib/metrics.js.map +1 -0
  424. package/dist/lib/overstory.d.ts +2 -0
  425. package/dist/lib/overstory.d.ts.map +1 -0
  426. package/dist/lib/overstory.js +211 -0
  427. package/dist/lib/overstory.js.map +1 -0
  428. package/dist/lib/parallel.d.ts +2 -0
  429. package/dist/lib/parallel.d.ts.map +1 -0
  430. package/dist/lib/parallel.js +349 -0
  431. package/dist/lib/parallel.js.map +1 -0
  432. package/dist/lib/paths.d.ts +2 -0
  433. package/dist/lib/paths.d.ts.map +1 -0
  434. package/dist/lib/paths.js +254 -0
  435. package/dist/lib/paths.js.map +1 -0
  436. package/dist/lib/phase-complete-llm.d.ts +22 -0
  437. package/dist/lib/phase-complete-llm.d.ts.map +1 -0
  438. package/dist/lib/phase-complete-llm.js +331 -0
  439. package/dist/lib/phase-complete-llm.js.map +1 -0
  440. package/dist/lib/phase-complete.d.ts +46 -0
  441. package/dist/lib/phase-complete.d.ts.map +1 -0
  442. package/dist/lib/phase-complete.js +278 -0
  443. package/dist/lib/phase-complete.js.map +1 -0
  444. package/dist/lib/phase-io.d.ts +2 -0
  445. package/dist/lib/phase-io.d.ts.map +1 -0
  446. package/dist/lib/phase-io.js +126 -0
  447. package/dist/lib/phase-io.js.map +1 -0
  448. package/dist/lib/phase.d.ts +2 -0
  449. package/dist/lib/phase.d.ts.map +1 -0
  450. package/dist/lib/phase.js +1344 -0
  451. package/dist/lib/phase.js.map +1 -0
  452. package/dist/lib/plan-tournament.d.ts +63 -0
  453. package/dist/lib/plan-tournament.d.ts.map +1 -0
  454. package/dist/lib/plan-tournament.js +353 -0
  455. package/dist/lib/plan-tournament.js.map +1 -0
  456. package/dist/lib/refinement.d.ts +74 -0
  457. package/dist/lib/refinement.d.ts.map +1 -0
  458. package/dist/lib/refinement.js +283 -0
  459. package/dist/lib/refinement.js.map +1 -0
  460. package/dist/lib/requirements.d.ts +2 -0
  461. package/dist/lib/requirements.d.ts.map +1 -0
  462. package/dist/lib/requirements.js +355 -0
  463. package/dist/lib/requirements.js.map +1 -0
  464. package/dist/lib/research-bundle.d.ts +2 -0
  465. package/dist/lib/research-bundle.d.ts.map +1 -0
  466. package/dist/lib/research-bundle.js +246 -0
  467. package/dist/lib/research-bundle.js.map +1 -0
  468. package/dist/lib/roadmap.d.ts +2 -0
  469. package/dist/lib/roadmap.d.ts.map +1 -0
  470. package/dist/lib/roadmap.js +541 -0
  471. package/dist/lib/roadmap.js.map +1 -0
  472. package/dist/lib/sample.d.ts +16 -0
  473. package/dist/lib/sample.d.ts.map +1 -0
  474. package/dist/lib/sample.js +20 -0
  475. package/dist/lib/sample.js.map +1 -0
  476. package/dist/lib/scaffold.d.ts +2 -0
  477. package/dist/lib/scaffold.d.ts.map +1 -0
  478. package/dist/lib/scaffold.js +355 -0
  479. package/dist/lib/scaffold.js.map +1 -0
  480. package/dist/lib/scan/_utils.d.ts +11 -0
  481. package/dist/lib/scan/_utils.d.ts.map +1 -0
  482. package/dist/lib/scan/_utils.js +36 -0
  483. package/dist/lib/scan/_utils.js.map +1 -0
  484. package/dist/lib/scan/base64.d.ts +15 -0
  485. package/dist/lib/scan/base64.d.ts.map +1 -0
  486. package/dist/lib/scan/base64.js +66 -0
  487. package/dist/lib/scan/base64.js.map +1 -0
  488. package/dist/lib/scan/ignorefile.d.ts +30 -0
  489. package/dist/lib/scan/ignorefile.d.ts.map +1 -0
  490. package/dist/lib/scan/ignorefile.js +101 -0
  491. package/dist/lib/scan/ignorefile.js.map +1 -0
  492. package/dist/lib/scan/injection.d.ts +14 -0
  493. package/dist/lib/scan/injection.d.ts.map +1 -0
  494. package/dist/lib/scan/injection.js +39 -0
  495. package/dist/lib/scan/injection.js.map +1 -0
  496. package/dist/lib/scan/patterns.d.ts +17 -0
  497. package/dist/lib/scan/patterns.d.ts.map +1 -0
  498. package/dist/lib/scan/patterns.js +123 -0
  499. package/dist/lib/scan/patterns.js.map +1 -0
  500. package/dist/lib/scan/strip-markdown.d.ts +7 -0
  501. package/dist/lib/scan/strip-markdown.d.ts.map +1 -0
  502. package/dist/lib/scan/strip-markdown.js +38 -0
  503. package/dist/lib/scan/strip-markdown.js.map +1 -0
  504. package/dist/lib/scan/types.d.ts +23 -0
  505. package/dist/lib/scan/types.d.ts.map +1 -0
  506. package/dist/lib/scan/types.js +3 -0
  507. package/dist/lib/scan/types.js.map +1 -0
  508. package/dist/lib/scheduler-wait.d.ts +2 -0
  509. package/dist/lib/scheduler-wait.d.ts.map +1 -0
  510. package/dist/lib/scheduler-wait.js +59 -0
  511. package/dist/lib/scheduler-wait.js.map +1 -0
  512. package/dist/lib/scheduler.d.ts +254 -0
  513. package/dist/lib/scheduler.d.ts.map +1 -0
  514. package/dist/lib/scheduler.js +1147 -0
  515. package/dist/lib/scheduler.js.map +1 -0
  516. package/dist/lib/state.d.ts +2 -0
  517. package/dist/lib/state.d.ts.map +1 -0
  518. package/dist/lib/state.js +744 -0
  519. package/dist/lib/state.js.map +1 -0
  520. package/dist/lib/think.d.ts +18 -0
  521. package/dist/lib/think.d.ts.map +1 -0
  522. package/dist/lib/think.js +317 -0
  523. package/dist/lib/think.js.map +1 -0
  524. package/dist/lib/tracker.d.ts +2 -0
  525. package/dist/lib/tracker.d.ts.map +1 -0
  526. package/dist/lib/tracker.js +1121 -0
  527. package/dist/lib/tracker.js.map +1 -0
  528. package/dist/lib/types.d.ts +1514 -0
  529. package/dist/lib/types.d.ts.map +1 -0
  530. package/dist/lib/types.js +4 -0
  531. package/dist/lib/types.js.map +1 -0
  532. package/dist/lib/utils.d.ts +2 -0
  533. package/dist/lib/utils.d.ts.map +1 -0
  534. package/dist/lib/utils.js +1363 -0
  535. package/dist/lib/utils.js.map +1 -0
  536. package/dist/lib/verify.d.ts +2 -0
  537. package/dist/lib/verify.d.ts.map +1 -0
  538. package/dist/lib/verify.js +1153 -0
  539. package/dist/lib/verify.js.map +1 -0
  540. package/dist/lib/wireup/autofix.d.ts +2 -0
  541. package/dist/lib/wireup/autofix.d.ts.map +1 -0
  542. package/dist/lib/wireup/autofix.js +188 -0
  543. package/dist/lib/wireup/autofix.js.map +1 -0
  544. package/dist/lib/wireup/cli.d.ts +2 -0
  545. package/dist/lib/wireup/cli.d.ts.map +1 -0
  546. package/dist/lib/wireup/cli.js +194 -0
  547. package/dist/lib/wireup/cli.js.map +1 -0
  548. package/dist/lib/wireup/detection.d.ts +47 -0
  549. package/dist/lib/wireup/detection.d.ts.map +1 -0
  550. package/dist/lib/wireup/detection.js +410 -0
  551. package/dist/lib/wireup/detection.js.map +1 -0
  552. package/dist/lib/wireup/discovery.d.ts +2 -0
  553. package/dist/lib/wireup/discovery.d.ts.map +1 -0
  554. package/dist/lib/wireup/discovery.js +934 -0
  555. package/dist/lib/wireup/discovery.js.map +1 -0
  556. package/dist/lib/wireup/execution.d.ts +2 -0
  557. package/dist/lib/wireup/execution.d.ts.map +1 -0
  558. package/dist/lib/wireup/execution.js +573 -0
  559. package/dist/lib/wireup/execution.js.map +1 -0
  560. package/dist/lib/wireup/index.d.ts +2 -0
  561. package/dist/lib/wireup/index.d.ts.map +1 -0
  562. package/dist/lib/wireup/index.js +85 -0
  563. package/dist/lib/wireup/index.js.map +1 -0
  564. package/dist/lib/wireup/orchestrator.d.ts +2 -0
  565. package/dist/lib/wireup/orchestrator.d.ts.map +1 -0
  566. package/dist/lib/wireup/orchestrator.js +366 -0
  567. package/dist/lib/wireup/orchestrator.js.map +1 -0
  568. package/dist/lib/wireup/report.d.ts +47 -0
  569. package/dist/lib/wireup/report.d.ts.map +1 -0
  570. package/dist/lib/wireup/report.js +201 -0
  571. package/dist/lib/wireup/report.js.map +1 -0
  572. package/dist/lib/wireup/scenarios.d.ts +2 -0
  573. package/dist/lib/wireup/scenarios.d.ts.map +1 -0
  574. package/dist/lib/wireup/scenarios.js +516 -0
  575. package/dist/lib/wireup/scenarios.js.map +1 -0
  576. package/dist/lib/wireup/state.d.ts +2 -0
  577. package/dist/lib/wireup/state.d.ts.map +1 -0
  578. package/dist/lib/wireup/state.js +102 -0
  579. package/dist/lib/wireup/state.js.map +1 -0
  580. package/dist/lib/wireup/types.d.ts +376 -0
  581. package/dist/lib/wireup/types.d.ts.map +1 -0
  582. package/dist/lib/wireup/types.js +3 -0
  583. package/dist/lib/wireup/types.js.map +1 -0
  584. package/dist/lib/worktree.d.ts +2 -0
  585. package/dist/lib/worktree.d.ts.map +1 -0
  586. package/dist/lib/worktree.js +999 -0
  587. package/dist/lib/worktree.js.map +1 -0
  588. package/lib/autopilot-milestone.ts +136 -0
  589. package/lib/autopilot-pipeline.ts +1179 -0
  590. package/lib/autopilot-waves.ts +361 -0
  591. package/lib/autopilot.ts +1874 -0
  592. package/lib/autoplan.ts +280 -0
  593. package/lib/autoresearch.js +4 -0
  594. package/lib/autoresearch.ts +886 -0
  595. package/lib/backend.ts +1252 -0
  596. package/lib/benchmark.ts +341 -0
  597. package/lib/citations.ts +760 -0
  598. package/lib/cleanup.ts +1588 -0
  599. package/lib/cli/adapters.ts +41 -0
  600. package/lib/cli/agent.ts +83 -0
  601. package/lib/cli/index.ts +273 -0
  602. package/lib/cli/output.ts +33 -0
  603. package/lib/cli/scan-dispatch.ts +130 -0
  604. package/lib/cli/tools.ts +198 -0
  605. package/lib/commands/_dashboard-parsers.ts +275 -0
  606. package/lib/commands/analysis.ts +1851 -0
  607. package/lib/commands/assumptions.ts +232 -0
  608. package/lib/commands/blame.ts +174 -0
  609. package/lib/commands/budget.ts +148 -0
  610. package/lib/commands/check-plans.ts +233 -0
  611. package/lib/commands/config.ts +287 -0
  612. package/lib/commands/dashboard.ts +680 -0
  613. package/lib/commands/estimate.ts +204 -0
  614. package/lib/commands/eval-diff.ts +252 -0
  615. package/lib/commands/freshness.ts +213 -0
  616. package/lib/commands/health.ts +607 -0
  617. package/lib/commands/index.ts +266 -0
  618. package/lib/commands/install.ts +307 -0
  619. package/lib/commands/knowhow-aggregator.ts +345 -0
  620. package/lib/commands/knowledge-search.ts +153 -0
  621. package/lib/commands/long-term-roadmap.ts +390 -0
  622. package/lib/commands/patterns.ts +465 -0
  623. package/lib/commands/phase-info.ts +698 -0
  624. package/lib/commands/plan-lint.ts +546 -0
  625. package/lib/commands/plan-phase.ts +375 -0
  626. package/lib/commands/progress.ts +319 -0
  627. package/lib/commands/quality.ts +138 -0
  628. package/lib/commands/rollback.ts +195 -0
  629. package/lib/commands/scan.ts +72 -0
  630. package/lib/commands/search.ts +300 -0
  631. package/lib/commands/select-candidate.ts +687 -0
  632. package/lib/commands/singularity.ts +222 -0
  633. package/lib/commands/slug-timestamp.ts +74 -0
  634. package/lib/commands/tail.ts +129 -0
  635. package/lib/commands/todo.ts +273 -0
  636. package/lib/commands/watch.ts +80 -0
  637. package/lib/complexity.ts +117 -0
  638. package/lib/context/agents.ts +505 -0
  639. package/lib/context/base.ts +123 -0
  640. package/lib/context/execute.ts +977 -0
  641. package/lib/context/index.ts +110 -0
  642. package/lib/context/progress.ts +278 -0
  643. package/lib/context/project.ts +531 -0
  644. package/lib/context/research.ts +646 -0
  645. package/lib/dead-ends.ts +506 -0
  646. package/lib/deps.ts +773 -0
  647. package/lib/discussion.ts +1275 -0
  648. package/lib/drift.ts +519 -0
  649. package/lib/evolve/_dimensions-features.ts +525 -0
  650. package/lib/evolve/_dimensions.ts +511 -0
  651. package/lib/evolve/_product-ideation.ts +405 -0
  652. package/lib/evolve/_prompts.ts +178 -0
  653. package/lib/evolve/cli.ts +330 -0
  654. package/lib/evolve/discovery.ts +571 -0
  655. package/lib/evolve/index.ts +105 -0
  656. package/lib/evolve/orchestrator.ts +1139 -0
  657. package/lib/evolve/scoring.ts +167 -0
  658. package/lib/evolve/state.ts +330 -0
  659. package/lib/evolve/types.ts +290 -0
  660. package/lib/frontmatter.ts +615 -0
  661. package/lib/gates.ts +695 -0
  662. package/lib/genome.ts +402 -0
  663. package/lib/got.js +4 -0
  664. package/lib/got.ts +361 -0
  665. package/lib/invariants.ts +378 -0
  666. package/lib/knowledge.ts +768 -0
  667. package/lib/long-term-roadmap.ts +806 -0
  668. package/lib/markdown-split.ts +273 -0
  669. package/lib/mcp-server.ts +3292 -0
  670. package/lib/metrics.ts +49 -0
  671. package/lib/overstory.ts +270 -0
  672. package/lib/parallel.ts +570 -0
  673. package/lib/paths.ts +293 -0
  674. package/lib/phase-complete-llm.ts +376 -0
  675. package/lib/phase-complete.ts +366 -0
  676. package/lib/phase-io.ts +101 -0
  677. package/lib/phase.ts +1981 -0
  678. package/lib/plan-tournament.ts +426 -0
  679. package/lib/refinement.ts +349 -0
  680. package/lib/requirements.ts +469 -0
  681. package/lib/research-bundle.ts +300 -0
  682. package/lib/roadmap.ts +775 -0
  683. package/lib/scaffold.ts +480 -0
  684. package/lib/scan/_utils.ts +37 -0
  685. package/lib/scan/base64.ts +90 -0
  686. package/lib/scan/ignorefile.ts +109 -0
  687. package/lib/scan/injection.ts +67 -0
  688. package/lib/scan/patterns.ts +139 -0
  689. package/lib/scan/strip-markdown.ts +39 -0
  690. package/lib/scan/types.ts +28 -0
  691. package/lib/scheduler-wait.ts +58 -0
  692. package/lib/scheduler.ts +1370 -0
  693. package/lib/state.ts +1000 -0
  694. package/lib/think.ts +365 -0
  695. package/lib/tracker.ts +1591 -0
  696. package/lib/types.ts +1663 -0
  697. package/lib/utils.ts +1479 -0
  698. package/lib/verify.ts +1434 -0
  699. package/lib/wireup/autofix.ts +241 -0
  700. package/lib/wireup/cli.ts +278 -0
  701. package/lib/wireup/detection.ts +542 -0
  702. package/lib/wireup/discovery.ts +1063 -0
  703. package/lib/wireup/execution.ts +686 -0
  704. package/lib/wireup/index.ts +117 -0
  705. package/lib/wireup/orchestrator.ts +519 -0
  706. package/lib/wireup/report.ts +286 -0
  707. package/lib/wireup/scenarios.ts +616 -0
  708. package/lib/wireup/state.ts +139 -0
  709. package/lib/wireup/types.ts +436 -0
  710. package/lib/worktree.ts +1309 -0
  711. package/package.json +67 -0
@@ -0,0 +1,542 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * GRD Wireup -- Missing Connection Detection Engine
5
+ *
6
+ * Analyses failed ScenarioResult[] and classifies each failure into a
7
+ * structured MissingConnection report using pure filesystem heuristics.
8
+ *
9
+ * Design constraints:
10
+ * - NO LLM subprocess calls (no spawnClaude, no claude -p)
11
+ * - All classification is done via regex/grep against the local filesystem
12
+ * - Each heuristic is independent and returns MissingConnection | null
13
+ * - Results are deduplicated and sorted high-confidence first
14
+ *
15
+ * @dependencies ./types, child_process (built-in), fs (built-in), path (built-in)
16
+ */
17
+
18
+ import type {
19
+ ScenarioResult,
20
+ StepResult,
21
+ HttpStepResult,
22
+ CliStepResult,
23
+ WireupScenario,
24
+ MissingConnection,
25
+ IssueType,
26
+ Confidence,
27
+ } from './types';
28
+
29
+ const { spawnSync } = require('child_process') as {
30
+ spawnSync: (
31
+ file: string,
32
+ args: string[],
33
+ options: { encoding: 'utf-8'; cwd?: string; timeout?: number }
34
+ ) => { stdout: string; stderr: string; status: number | null; error?: Error };
35
+ };
36
+
37
+ const path = require('path') as typeof import('path');
38
+
39
+ // Suppress unused import warning — IssueType is used as a type guard below
40
+ void (undefined as unknown as IssueType);
41
+
42
+ // ─── Helper: grep wrapper ──────────────────────────────────────────────────────
43
+
44
+ /**
45
+ * Search for a regex pattern across files in `cwd`, optionally filtered by globs.
46
+ *
47
+ * Uses spawnSync with grep — no shell so no injection risk.
48
+ * Returns matching file paths (unique).
49
+ */
50
+ function grepForPattern(cwd: string, pattern: string, globs?: string[]): string[] {
51
+ const includeArgs: string[] =
52
+ globs !== undefined && globs.length > 0
53
+ ? globs.map((g) => `--include=${g}`)
54
+ : ['--include=*.ts', '--include=*.js'];
55
+
56
+ const args = ['-rl', ...includeArgs, pattern, '.'];
57
+
58
+ const result = spawnSync('grep', args, {
59
+ encoding: 'utf-8',
60
+ cwd,
61
+ timeout: 10_000,
62
+ });
63
+
64
+ if (result.error !== undefined || result.status === null) {
65
+ return [];
66
+ }
67
+
68
+ return result.stdout
69
+ .split('\n')
70
+ .map((l) => l.trim())
71
+ .filter((l) => l.length > 0);
72
+ }
73
+
74
+ // ─── Helper: find route/controller files ──────────────────────────────────────
75
+
76
+ /**
77
+ * Heuristic scan for files that likely contain route registrations.
78
+ *
79
+ * Searches for files whose name matches route/router/controller/handler conventions.
80
+ */
81
+ function findRouteFiles(cwd: string): string[] {
82
+ const result = spawnSync(
83
+ 'find',
84
+ [
85
+ '.',
86
+ '-type', 'f',
87
+ '(',
88
+ '-name', '*route*',
89
+ '-o', '-name', '*router*',
90
+ '-o', '-name', '*controller*',
91
+ '-o', '-name', '*handler*',
92
+ ')',
93
+ ],
94
+ { encoding: 'utf-8', cwd, timeout: 5_000 }
95
+ );
96
+
97
+ if (result.error !== undefined) {
98
+ return [];
99
+ }
100
+
101
+ return result.stdout
102
+ .split('\n')
103
+ .map((l) => l.trim().replace(/^\.\//, ''))
104
+ .filter((l) => l.length > 0 && (l.endsWith('.ts') || l.endsWith('.js')));
105
+ }
106
+
107
+ // ─── Helper: parse module name from error string ───────────────────────────────
108
+
109
+ /**
110
+ * Extract a module name from a "Cannot find module" or similar error message.
111
+ *
112
+ * Returns null if no module name can be parsed.
113
+ */
114
+ function parseModuleFromError(stderr: string): string | null {
115
+ // Node.js: Cannot find module 'some-module'
116
+ const nodeMatch = /Cannot find module ['"]([^'"]+)['"]/i.exec(stderr);
117
+ if (nodeMatch !== null) return nodeMatch[1];
118
+
119
+ // Python: ModuleNotFoundError: No module named 'some_module'
120
+ const pyMatch = /No module named ['"]([^'"]+)['"]/i.exec(stderr);
121
+ if (pyMatch !== null) return pyMatch[1];
122
+
123
+ // ImportError: cannot import name 'X' from 'Y'
124
+ const importMatch = /ImportError[^']*'([^']+)'/i.exec(stderr);
125
+ if (importMatch !== null) return importMatch[1];
126
+
127
+ return null;
128
+ }
129
+
130
+ // ─── Helper: type guards ───────────────────────────────────────────────────────
131
+
132
+ function isHttpStepResult(r: StepResult): r is HttpStepResult {
133
+ return r.step_type === 'http';
134
+ }
135
+
136
+ function isCliStepResult(r: StepResult): r is CliStepResult {
137
+ return r.step_type === 'cli';
138
+ }
139
+
140
+ // ─── Heuristic: missing-route ──────────────────────────────────────────────────
141
+
142
+ /**
143
+ * Detect a missing route registration when an HTTP step returns 404.
144
+ *
145
+ * Confidence HIGH when no route matching the URL path is found in the codebase.
146
+ */
147
+ function detectMissingRoute(
148
+ cwd: string,
149
+ step: StepResult,
150
+ scenario: Pick<WireupScenario, 'feature'>
151
+ ): MissingConnection | null {
152
+ if (!isHttpStepResult(step)) return null;
153
+ if (step.status_code !== 404) return null;
154
+
155
+ // Extract URL path from actual result context
156
+ let urlPath = '/unknown';
157
+ if (step.actual !== null && typeof step.actual === 'object') {
158
+ const act = step.actual as Record<string, unknown>;
159
+ if (typeof act['url'] === 'string') urlPath = act['url'];
160
+ }
161
+
162
+ // Check whether a route registration pattern exists for this path
163
+ const routePattern = urlPath.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
164
+ const routeMatches = grepForPattern(cwd, routePattern, ['*.ts', '*.js']);
165
+ const confidence: Confidence = routeMatches.length === 0 ? 'high' : 'medium';
166
+
167
+ const routeFiles = findRouteFiles(cwd);
168
+ const targetFile = routeFiles.length > 0 ? routeFiles[0] : 'routes.ts';
169
+
170
+ return {
171
+ issue_type: 'missing-route',
172
+ source_file: scenario.feature.filePath,
173
+ target_file: targetFile,
174
+ suggested_fix: `Register route for ${urlPath} in ${targetFile}`,
175
+ confidence,
176
+ scenario_id: '',
177
+ step_index: step.step_index,
178
+ error_context: `HTTP 404 for ${urlPath}`,
179
+ };
180
+ }
181
+
182
+ // ─── Heuristic: unconnected-handler ───────────────────────────────────────────
183
+
184
+ /**
185
+ * Detect a handler that exists but is not connected (2xx with empty/unexpected body).
186
+ *
187
+ * Confidence MEDIUM — empty body is a weak signal.
188
+ */
189
+ function detectUnconnectedHandler(
190
+ cwd: string,
191
+ step: StepResult,
192
+ scenario: Pick<WireupScenario, 'feature'>
193
+ ): MissingConnection | null {
194
+ if (!isHttpStepResult(step)) return null;
195
+ if (step.status_code < 200 || step.status_code >= 300) return null;
196
+ if (step.passed) return null;
197
+
198
+ const bodyEmpty =
199
+ step.body.trim().length === 0 ||
200
+ step.body.trim() === '{}' ||
201
+ step.body.trim() === '[]';
202
+ if (!bodyEmpty) return null;
203
+
204
+ const routeFiles = findRouteFiles(cwd);
205
+ const targetFile = routeFiles.length > 0 ? routeFiles[0] : 'handlers.ts';
206
+
207
+ return {
208
+ issue_type: 'unconnected-handler',
209
+ source_file: scenario.feature.filePath,
210
+ target_file: targetFile,
211
+ suggested_fix: `Connect handler logic in ${targetFile} — response body is empty`,
212
+ confidence: 'medium',
213
+ scenario_id: '',
214
+ step_index: step.step_index,
215
+ error_context: `HTTP ${step.status_code} returned empty body`,
216
+ };
217
+ }
218
+
219
+ // ─── Heuristic: missing-import ─────────────────────────────────────────────────
220
+
221
+ /**
222
+ * Detect a missing import when a CLI step fails with a module-not-found error.
223
+ *
224
+ * Confidence HIGH when module name can be parsed from stderr.
225
+ */
226
+ function detectMissingImport(
227
+ cwd: string,
228
+ step: StepResult,
229
+ scenario: Pick<WireupScenario, 'feature'>
230
+ ): MissingConnection | null {
231
+ if (!isCliStepResult(step)) return null;
232
+ if (step.passed) return null;
233
+
234
+ const combined = `${step.stderr} ${step.error ?? ''}`;
235
+ const isModuleError =
236
+ /Cannot find module/i.test(combined) ||
237
+ /ModuleNotFoundError/i.test(combined) ||
238
+ /ImportError/i.test(combined);
239
+
240
+ if (!isModuleError) return null;
241
+
242
+ const moduleName = parseModuleFromError(combined) ?? 'unknown-module';
243
+ const sourceFile = scenario.feature.filePath;
244
+ const targetFile = moduleName.startsWith('.')
245
+ ? path.join(path.dirname(sourceFile), moduleName)
246
+ : moduleName;
247
+
248
+ void cwd;
249
+
250
+ return {
251
+ issue_type: 'missing-import',
252
+ source_file: sourceFile,
253
+ target_file: targetFile,
254
+ suggested_fix: `Add import for '${moduleName}' in ${sourceFile} or create ${targetFile}`,
255
+ confidence: 'high',
256
+ scenario_id: '',
257
+ step_index: step.step_index,
258
+ error_context: combined.slice(0, 200),
259
+ };
260
+ }
261
+
262
+ // ─── Heuristic: missing-middleware ────────────────────────────────────────────
263
+
264
+ /**
265
+ * Detect missing auth middleware when an HTTP step returns 401 or 403.
266
+ *
267
+ * Confidence MEDIUM — status code is suggestive but the route may be intentionally protected.
268
+ */
269
+ function detectMissingMiddleware(
270
+ cwd: string,
271
+ step: StepResult,
272
+ scenario: Pick<WireupScenario, 'feature'>
273
+ ): MissingConnection | null {
274
+ if (!isHttpStepResult(step)) return null;
275
+ if (step.status_code !== 401 && step.status_code !== 403) return null;
276
+
277
+ const authMatches = grepForPattern(cwd, 'auth|middleware|passport|jwt|bearer', ['*.ts', '*.js']);
278
+ const targetFile = authMatches.length > 0 ? authMatches[0] : 'middleware/auth.ts';
279
+
280
+ return {
281
+ issue_type: 'missing-middleware',
282
+ source_file: scenario.feature.filePath,
283
+ target_file: targetFile,
284
+ suggested_fix: `Register authentication middleware for the route — HTTP ${step.status_code} returned`,
285
+ confidence: 'medium',
286
+ scenario_id: '',
287
+ step_index: step.step_index,
288
+ error_context: `HTTP ${step.status_code} Unauthorized/Forbidden`,
289
+ };
290
+ }
291
+
292
+ // ─── Heuristic: broken-nav-link ───────────────────────────────────────────────
293
+
294
+ /**
295
+ * Detect a broken navigation link when a 404 occurs on a path that looks like
296
+ * a page route (not an API endpoint).
297
+ *
298
+ * Confidence LOW — heuristic uses path naming convention only.
299
+ */
300
+ function detectBrokenNavLink(
301
+ cwd: string,
302
+ step: StepResult,
303
+ scenario: Pick<WireupScenario, 'feature'>
304
+ ): MissingConnection | null {
305
+ if (!isHttpStepResult(step)) return null;
306
+ if (step.status_code !== 404) return null;
307
+
308
+ let urlPath = '/unknown';
309
+ if (step.actual !== null && typeof step.actual === 'object') {
310
+ const act = step.actual as Record<string, unknown>;
311
+ if (typeof act['url'] === 'string') urlPath = act['url'];
312
+ }
313
+
314
+ const isPageRoute =
315
+ !urlPath.startsWith('/api/') &&
316
+ !urlPath.includes('.') &&
317
+ !/\.(json|xml|csv|txt|png|jpg|svg|ico)$/.test(urlPath);
318
+
319
+ if (!isPageRoute) return null;
320
+
321
+ const navPattern = urlPath.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
322
+ const navFiles = grepForPattern(cwd, navPattern, [
323
+ '*.tsx', '*.jsx', '*.html', '*.vue', '*.svelte', '*.ts', '*.js',
324
+ ]);
325
+
326
+ const sourceFile = navFiles.length > 0 ? navFiles[0] : scenario.feature.filePath;
327
+
328
+ return {
329
+ issue_type: 'broken-nav-link',
330
+ source_file: sourceFile,
331
+ target_file: scenario.feature.filePath,
332
+ suggested_fix: `Add page route for ${urlPath} or fix navigation link in ${sourceFile}`,
333
+ confidence: 'low',
334
+ scenario_id: '',
335
+ step_index: step.step_index,
336
+ error_context: `HTTP 404 for page-like path ${urlPath}`,
337
+ };
338
+ }
339
+
340
+ // ─── Heuristic: missing-env-var ───────────────────────────────────────────────
341
+
342
+ /**
343
+ * Detect a missing environment variable when the error contains ECONNREFUSED
344
+ * or references to undefined env-var-like identifiers.
345
+ *
346
+ * Confidence HIGH when a specific ENV var pattern can be extracted.
347
+ */
348
+ function detectMissingEnvVar(
349
+ cwd: string,
350
+ step: StepResult,
351
+ scenario: Pick<WireupScenario, 'feature'>
352
+ ): MissingConnection | null {
353
+ const errorText = [
354
+ step.error ?? '',
355
+ isCliStepResult(step) ? step.stderr : '',
356
+ isHttpStepResult(step) ? step.body.slice(0, 300) : '',
357
+ ].join(' ');
358
+
359
+ const hasEnvSignal =
360
+ /ECONNREFUSED/i.test(errorText) ||
361
+ /process\.env\.[A-Z_]+.*undefined/i.test(errorText) ||
362
+ /environment variable.*not set/i.test(errorText) ||
363
+ /missing.*required.*env/i.test(errorText);
364
+
365
+ if (!hasEnvSignal) return null;
366
+
367
+ const envVarMatch =
368
+ /process\.env\.([A-Z_][A-Z0-9_]*)/i.exec(errorText) ??
369
+ /\b([A-Z][A-Z0-9_]{2,})\s*(?:is undefined|not set|missing)/i.exec(errorText);
370
+
371
+ const varName = envVarMatch !== null ? envVarMatch[1] : 'REQUIRED_ENV_VAR';
372
+
373
+ const envFiles = grepForPattern(cwd, varName, ['.env', '.env.*', '*.ts', '*.js']);
374
+ const targetFile = envFiles.length > 0 ? envFiles[0] : '.env';
375
+
376
+ return {
377
+ issue_type: 'missing-env-var',
378
+ source_file: scenario.feature.filePath,
379
+ target_file: targetFile,
380
+ suggested_fix: `Set environment variable ${varName} or add to .env`,
381
+ confidence: envVarMatch !== null ? 'high' : 'medium',
382
+ scenario_id: '',
383
+ step_index: step.step_index,
384
+ error_context: errorText.slice(0, 200),
385
+ };
386
+ }
387
+
388
+ // ─── Heuristic: missing-export (unreferenced export from static analysis) ─────
389
+
390
+ /**
391
+ * Detect an unreferenced export when a static analysis step fails with
392
+ * "has no references outside" message.
393
+ *
394
+ * Confidence HIGH — static analysis is deterministic; the export genuinely
395
+ * has no consumers in the project.
396
+ */
397
+ function detectMissingExport(
398
+ _cwd: string,
399
+ step: StepResult,
400
+ _scenario: Pick<WireupScenario, 'feature'>
401
+ ): MissingConnection | null {
402
+ if (step.step_type !== 'static') return null;
403
+ if (step.passed) return null;
404
+
405
+ const actual = typeof step.actual === 'string' ? step.actual : '';
406
+ const noRefMatch = /Export '([^']+)' has no references outside (.+)/.exec(actual);
407
+ if (noRefMatch === null) return null;
408
+
409
+ const exportName = noRefMatch[1];
410
+ const sourceFile = noRefMatch[2];
411
+
412
+ return {
413
+ issue_type: 'missing-export',
414
+ source_file: sourceFile,
415
+ target_file: sourceFile,
416
+ suggested_fix: `Remove unused export '${exportName}' from ${sourceFile} or wire it into a consumer`,
417
+ confidence: 'high',
418
+ scenario_id: '',
419
+ step_index: step.step_index,
420
+ error_context: actual.slice(0, 200),
421
+ };
422
+ }
423
+
424
+ // ─── Classifier dispatcher ─────────────────────────────────────────────────────
425
+
426
+ /**
427
+ * Run each heuristic in priority order for a single failed step.
428
+ * Returns the first match, or null if no heuristic matches.
429
+ *
430
+ * Priority order (highest confidence heuristics first):
431
+ * 1. missing-export — static analysis: unreferenced export (no I/O)
432
+ * 2. missing-env-var — connection-level failure; ECONNREFUSED
433
+ * 3. missing-import — module-level failure; Cannot find module
434
+ * 4. missing-route — 404 + no route registration found
435
+ * 5. missing-middleware — 401/403 Unauthorized/Forbidden
436
+ * 6. unconnected-handler — 2xx + empty body (step still failed)
437
+ * 7. broken-nav-link — 404 on page-like path (weak signal)
438
+ */
439
+ export function classifyFailure(
440
+ cwd: string,
441
+ step: StepResult,
442
+ scenario: Pick<WireupScenario, 'feature'>
443
+ ): MissingConnection | null {
444
+ return (
445
+ detectMissingExport(cwd, step, scenario) ??
446
+ detectMissingEnvVar(cwd, step, scenario) ??
447
+ detectMissingImport(cwd, step, scenario) ??
448
+ detectMissingRoute(cwd, step, scenario) ??
449
+ detectMissingMiddleware(cwd, step, scenario) ??
450
+ detectUnconnectedHandler(cwd, step, scenario) ??
451
+ detectBrokenNavLink(cwd, step, scenario) ??
452
+ null
453
+ );
454
+ }
455
+
456
+ // ─── Deduplication ────────────────────────────────────────────────────────────
457
+
458
+ /**
459
+ * Deduplicate MissingConnection[] by (issue_type, source_file, target_file).
460
+ * When duplicates exist the first occurrence (highest confidence, per sort) is kept.
461
+ */
462
+ function deduplicateConnections(connections: MissingConnection[]): MissingConnection[] {
463
+ const seen = new Set<string>();
464
+ const result: MissingConnection[] = [];
465
+
466
+ for (const conn of connections) {
467
+ const key = `${conn.issue_type}:${conn.source_file}:${conn.target_file}`;
468
+ if (!seen.has(key)) {
469
+ seen.add(key);
470
+ result.push(conn);
471
+ }
472
+ }
473
+
474
+ return result;
475
+ }
476
+
477
+ // ─── Confidence sort order ────────────────────────────────────────────────────
478
+
479
+ const CONFIDENCE_ORDER: Record<Confidence, number> = { high: 0, medium: 1, low: 2 };
480
+
481
+ // ─── Public API ───────────────────────────────────────────────────────────────
482
+
483
+ /**
484
+ * Analyse failed ScenarioResult[] and return a deduplicated, confidence-sorted
485
+ * array of MissingConnection reports.
486
+ *
487
+ * Only scenarios with overall_passed === false are analysed.
488
+ * Each failed step is passed to classifyFailure().
489
+ * Results with null classification are discarded.
490
+ * Final list is deduplicated by (issue_type, source_file, target_file) and
491
+ * sorted high-confidence first.
492
+ *
493
+ * No LLM subprocess calls are made. All classification is filesystem-based.
494
+ *
495
+ * @param cwd - Absolute path to the project root
496
+ * @param failedResults - ScenarioResult[] to analyse (may include passing ones; they are skipped)
497
+ * @returns Deduplicated MissingConnection[] sorted by confidence
498
+ */
499
+ export function detectMissingConnections(
500
+ cwd: string,
501
+ failedResults: ScenarioResult[]
502
+ ): MissingConnection[] {
503
+ const rawConnections: MissingConnection[] = [];
504
+
505
+ for (const scenarioResult of failedResults) {
506
+ if (scenarioResult.overall_passed) continue;
507
+
508
+ // Build a minimal feature stub for the classifyFailure API
509
+ const scenarioStub: Pick<WireupScenario, 'feature'> = {
510
+ feature: {
511
+ category: 'exported-but-uncalled',
512
+ filePath: scenarioResult.feature_id,
513
+ functionName: scenarioResult.scenario_id,
514
+ suggestedAction: '',
515
+ },
516
+ };
517
+
518
+ for (const step of scenarioResult.step_results) {
519
+ if (step.passed) continue;
520
+
521
+ const connection = classifyFailure(cwd, step, scenarioStub);
522
+ if (connection === null) continue;
523
+
524
+ rawConnections.push({
525
+ ...connection,
526
+ scenario_id: scenarioResult.scenario_id,
527
+ });
528
+ }
529
+ }
530
+
531
+ const deduplicated = deduplicateConnections(rawConnections);
532
+ deduplicated.sort((a, b) => CONFIDENCE_ORDER[a.confidence] - CONFIDENCE_ORDER[b.confidence]);
533
+
534
+ return deduplicated;
535
+ }
536
+
537
+ // ─── CommonJS Exports ─────────────────────────────────────────────────────────
538
+
539
+ module.exports = {
540
+ detectMissingConnections,
541
+ classifyFailure,
542
+ };