projscan 4.3.1 → 4.4.0

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 (677) hide show
  1. package/CONTRIBUTING.md +5 -1
  2. package/PRIVACY.md +1 -0
  3. package/README.md +253 -229
  4. package/THIRD-PARTY-NOTICES.md +31 -31
  5. package/dist/analyzers/architectureCheck.js.map +1 -1
  6. package/dist/analyzers/crossPackageImportCheck.js +3 -2
  7. package/dist/analyzers/crossPackageImportCheck.js.map +1 -1
  8. package/dist/analyzers/deadCodeCheck.js +10 -2
  9. package/dist/analyzers/deadCodeCheck.js.map +1 -1
  10. package/dist/analyzers/dependencyRiskCheck.js +1 -5
  11. package/dist/analyzers/dependencyRiskCheck.js.map +1 -1
  12. package/dist/analyzers/eslintCheck.js +3 -1
  13. package/dist/analyzers/eslintCheck.js.map +1 -1
  14. package/dist/analyzers/prettierCheck.js +16 -3
  15. package/dist/analyzers/prettierCheck.js.map +1 -1
  16. package/dist/analyzers/pythonDependencyRiskCheck.js +4 -17
  17. package/dist/analyzers/pythonDependencyRiskCheck.js.map +1 -1
  18. package/dist/analyzers/pythonLinterCheck.js +2 -12
  19. package/dist/analyzers/pythonLinterCheck.js.map +1 -1
  20. package/dist/analyzers/securityCheck.js +26 -9
  21. package/dist/analyzers/securityCheck.js.map +1 -1
  22. package/dist/analyzers/supplyChainCheck.js +6 -2
  23. package/dist/analyzers/supplyChainCheck.js.map +1 -1
  24. package/dist/analyzers/testCheck.js +10 -1
  25. package/dist/analyzers/testCheck.js.map +1 -1
  26. package/dist/analyzers/unusedDependencyCheck.js +8 -8
  27. package/dist/analyzers/unusedDependencyCheck.js.map +1 -1
  28. package/dist/cli/_shared.d.ts +2 -1
  29. package/dist/cli/_shared.js +14 -2
  30. package/dist/cli/_shared.js.map +1 -1
  31. package/dist/cli/commands/agentBrief.js +7 -1
  32. package/dist/cli/commands/agentBrief.js.map +1 -1
  33. package/dist/cli/commands/analyze.js.map +1 -1
  34. package/dist/cli/commands/applyFix.js +1 -1
  35. package/dist/cli/commands/applyFix.js.map +1 -1
  36. package/dist/cli/commands/audit.js +4 -2
  37. package/dist/cli/commands/audit.js.map +1 -1
  38. package/dist/cli/commands/badge.js.map +1 -1
  39. package/dist/cli/commands/bugHunt.js +2 -2
  40. package/dist/cli/commands/bugHunt.js.map +1 -1
  41. package/dist/cli/commands/ci.js.map +1 -1
  42. package/dist/cli/commands/claim.js +3 -3
  43. package/dist/cli/commands/claim.js.map +1 -1
  44. package/dist/cli/commands/collision.js +4 -2
  45. package/dist/cli/commands/collision.js.map +1 -1
  46. package/dist/cli/commands/coordinate.js +4 -2
  47. package/dist/cli/commands/coordinate.js.map +1 -1
  48. package/dist/cli/commands/coupling.js.map +1 -1
  49. package/dist/cli/commands/coverage.js.map +1 -1
  50. package/dist/cli/commands/dataflow.js.map +1 -1
  51. package/dist/cli/commands/dependencies.js +1 -1
  52. package/dist/cli/commands/dependencies.js.map +1 -1
  53. package/dist/cli/commands/diff.js.map +1 -1
  54. package/dist/cli/commands/doctor.js.map +1 -1
  55. package/dist/cli/commands/dogfood.js +30 -5
  56. package/dist/cli/commands/dogfood.js.map +1 -1
  57. package/dist/cli/commands/evidencePack.js.map +1 -1
  58. package/dist/cli/commands/explainIssue.js +1 -1
  59. package/dist/cli/commands/explainIssue.js.map +1 -1
  60. package/dist/cli/commands/feedback.js +19 -5
  61. package/dist/cli/commands/feedback.js.map +1 -1
  62. package/dist/cli/commands/file.js +1 -1
  63. package/dist/cli/commands/file.js.map +1 -1
  64. package/dist/cli/commands/fix.js.map +1 -1
  65. package/dist/cli/commands/fixSuggest.js +12 -4
  66. package/dist/cli/commands/fixSuggest.js.map +1 -1
  67. package/dist/cli/commands/hotspots.js.map +1 -1
  68. package/dist/cli/commands/impact.js +1 -1
  69. package/dist/cli/commands/impact.js.map +1 -1
  70. package/dist/cli/commands/init.js +13 -5
  71. package/dist/cli/commands/init.js.map +1 -1
  72. package/dist/cli/commands/installHook.js +2 -2
  73. package/dist/cli/commands/installHook.js.map +1 -1
  74. package/dist/cli/commands/mcp.js.map +1 -1
  75. package/dist/cli/commands/memory.js +5 -2
  76. package/dist/cli/commands/memory.js.map +1 -1
  77. package/dist/cli/commands/mergeRisk.js +1 -1
  78. package/dist/cli/commands/mergeRisk.js.map +1 -1
  79. package/dist/cli/commands/missionProof.js +13 -12
  80. package/dist/cli/commands/missionProof.js.map +1 -1
  81. package/dist/cli/commands/outdated.js +1 -1
  82. package/dist/cli/commands/outdated.js.map +1 -1
  83. package/dist/cli/commands/plugin.js +10 -6
  84. package/dist/cli/commands/plugin.js.map +1 -1
  85. package/dist/cli/commands/prDiff.js +1 -1
  86. package/dist/cli/commands/prDiff.js.map +1 -1
  87. package/dist/cli/commands/preflight.js +1 -5
  88. package/dist/cli/commands/preflight.js.map +1 -1
  89. package/dist/cli/commands/privacyCheck.js +3 -1
  90. package/dist/cli/commands/privacyCheck.js.map +1 -1
  91. package/dist/cli/commands/qualityScorecard.js.map +1 -1
  92. package/dist/cli/commands/recipes.js.map +1 -1
  93. package/dist/cli/commands/regressionPlan.js.map +1 -1
  94. package/dist/cli/commands/releaseTrain.js.map +1 -1
  95. package/dist/cli/commands/review.js +1 -1
  96. package/dist/cli/commands/review.js.map +1 -1
  97. package/dist/cli/commands/route.js.map +1 -1
  98. package/dist/cli/commands/search.js +5 -2
  99. package/dist/cli/commands/search.js.map +1 -1
  100. package/dist/cli/commands/semanticGraph.js.map +1 -1
  101. package/dist/cli/commands/session.js +2 -2
  102. package/dist/cli/commands/session.js.map +1 -1
  103. package/dist/cli/commands/start.js +3 -1177
  104. package/dist/cli/commands/start.js.map +1 -1
  105. package/dist/cli/commands/startAction.d.ts +36 -0
  106. package/dist/cli/commands/startAction.js +70 -0
  107. package/dist/cli/commands/startAction.js.map +1 -0
  108. package/dist/cli/commands/startConsole.d.ts +7 -0
  109. package/dist/cli/commands/startConsole.js +309 -0
  110. package/dist/cli/commands/startConsole.js.map +1 -0
  111. package/dist/cli/commands/startMissionBundle.d.ts +41 -0
  112. package/dist/cli/commands/startMissionBundle.js +645 -0
  113. package/dist/cli/commands/startMissionBundle.js.map +1 -0
  114. package/dist/cli/commands/startOutput.d.ts +31 -0
  115. package/dist/cli/commands/startOutput.js +232 -0
  116. package/dist/cli/commands/startOutput.js.map +1 -0
  117. package/dist/cli/commands/startShortcuts.d.ts +26 -0
  118. package/dist/cli/commands/startShortcuts.js +117 -0
  119. package/dist/cli/commands/startShortcuts.js.map +1 -0
  120. package/dist/cli/commands/telemetry.js +2 -1
  121. package/dist/cli/commands/telemetry.js.map +1 -1
  122. package/dist/cli/commands/trial.js +19 -4
  123. package/dist/cli/commands/trial.js.map +1 -1
  124. package/dist/cli/commands/understand.js +3 -1
  125. package/dist/cli/commands/understand.js.map +1 -1
  126. package/dist/cli/commands/upgrade.js.map +1 -1
  127. package/dist/cli/commands/watch.js +1 -1
  128. package/dist/cli/commands/watch.js.map +1 -1
  129. package/dist/cli/commands/workplan.js.map +1 -1
  130. package/dist/cli/commands/workspace.js +1 -1
  131. package/dist/cli/commands/workspace.js.map +1 -1
  132. package/dist/cli/commands/workspaces.js +1 -1
  133. package/dist/cli/commands/workspaces.js.map +1 -1
  134. package/dist/cli/index.js +2 -117
  135. package/dist/cli/index.js.map +1 -1
  136. package/dist/cli/registerCommands.d.ts +4 -0
  137. package/dist/cli/registerCommands.js +125 -0
  138. package/dist/cli/registerCommands.js.map +1 -0
  139. package/dist/core/adoption.d.ts +2 -1
  140. package/dist/core/adoption.js +40 -13
  141. package/dist/core/adoption.js.map +1 -1
  142. package/dist/core/agentBrief.js +19 -6
  143. package/dist/core/agentBrief.js.map +1 -1
  144. package/dist/core/applyFix.js.map +1 -1
  145. package/dist/core/ast.js +30 -19
  146. package/dist/core/ast.js.map +1 -1
  147. package/dist/core/auditRunner.js.map +1 -1
  148. package/dist/core/bugHunt.js +119 -17
  149. package/dist/core/bugHunt.js.map +1 -1
  150. package/dist/core/claims.js +5 -2
  151. package/dist/core/claims.js.map +1 -1
  152. package/dist/core/codeGraph.js +10 -0
  153. package/dist/core/codeGraph.js.map +1 -1
  154. package/dist/core/codeGraphReexports.d.ts +9 -0
  155. package/dist/core/codeGraphReexports.js +59 -0
  156. package/dist/core/codeGraphReexports.js.map +1 -0
  157. package/dist/core/collisionDetector.js +14 -4
  158. package/dist/core/collisionDetector.js.map +1 -1
  159. package/dist/core/coordination.js +4 -6
  160. package/dist/core/coordination.js.map +1 -1
  161. package/dist/core/couplingAnalyzer.d.ts +2 -1
  162. package/dist/core/couplingAnalyzer.js.map +1 -1
  163. package/dist/core/coverageParser.js.map +1 -1
  164. package/dist/core/dataflow.js +11 -2
  165. package/dist/core/dataflow.js.map +1 -1
  166. package/dist/core/dataflowFilters.js +8 -3
  167. package/dist/core/dataflowFilters.js.map +1 -1
  168. package/dist/core/dependencyAnalyzer.js +4 -1
  169. package/dist/core/dependencyAnalyzer.js.map +1 -1
  170. package/dist/core/dogfood.d.ts +1 -1
  171. package/dist/core/dogfood.js +39 -5
  172. package/dist/core/dogfood.js.map +1 -1
  173. package/dist/core/embeddings.js.map +1 -1
  174. package/dist/core/evidenceComment.js +34 -12
  175. package/dist/core/evidenceComment.js.map +1 -1
  176. package/dist/core/explainIssue.js +1 -2
  177. package/dist/core/explainIssue.js.map +1 -1
  178. package/dist/core/feedback.d.ts +1 -1
  179. package/dist/core/feedback.js +15 -4
  180. package/dist/core/feedback.js.map +1 -1
  181. package/dist/core/fileInspector.js +8 -2
  182. package/dist/core/fileInspector.js.map +1 -1
  183. package/dist/core/fixFirst.d.ts +3 -1
  184. package/dist/core/fixFirst.js +17 -4
  185. package/dist/core/fixFirst.js.map +1 -1
  186. package/dist/core/fixSuggest.js +20 -12
  187. package/dist/core/fixSuggest.js.map +1 -1
  188. package/dist/core/frameworkDetector.js +5 -3
  189. package/dist/core/frameworkDetector.js.map +1 -1
  190. package/dist/core/frameworkSources.js +22 -2
  191. package/dist/core/frameworkSources.js.map +1 -1
  192. package/dist/core/graphCorpus.d.ts +1 -1
  193. package/dist/core/graphCorpus.js +9 -1
  194. package/dist/core/graphCorpus.js.map +1 -1
  195. package/dist/core/graphQuery.js.map +1 -1
  196. package/dist/core/hotspotAnalyzer.js +26 -6
  197. package/dist/core/hotspotAnalyzer.js.map +1 -1
  198. package/dist/core/impact.d.ts +1 -1
  199. package/dist/core/impact.js.map +1 -1
  200. package/dist/core/importGraph.js.map +1 -1
  201. package/dist/core/indexCache.js.map +1 -1
  202. package/dist/core/intent.d.ts +1 -1
  203. package/dist/core/intent.js +143 -46
  204. package/dist/core/intent.js.map +1 -1
  205. package/dist/core/intentRouter.js +5467 -445
  206. package/dist/core/intentRouter.js.map +1 -1
  207. package/dist/core/issueEngine.js +1 -1
  208. package/dist/core/issueEngine.js.map +1 -1
  209. package/dist/core/languageDetector.js +1 -9
  210. package/dist/core/languageDetector.js.map +1 -1
  211. package/dist/core/languages/cppAdapter.js +3 -1
  212. package/dist/core/languages/cppAdapter.js.map +1 -1
  213. package/dist/core/languages/cppExports.js +6 -1
  214. package/dist/core/languages/cppExports.js.map +1 -1
  215. package/dist/core/languages/cppFunctions.js +3 -1
  216. package/dist/core/languages/cppFunctions.js.map +1 -1
  217. package/dist/core/languages/csharpAdapter.js.map +1 -1
  218. package/dist/core/languages/csharpFunctions.js +3 -1
  219. package/dist/core/languages/csharpFunctions.js.map +1 -1
  220. package/dist/core/languages/csharpImports.js +2 -1
  221. package/dist/core/languages/csharpImports.js.map +1 -1
  222. package/dist/core/languages/goAdapter.js.map +1 -1
  223. package/dist/core/languages/goExports.js.map +1 -1
  224. package/dist/core/languages/goFunctions.js +9 -3
  225. package/dist/core/languages/goFunctions.js.map +1 -1
  226. package/dist/core/languages/javaAdapter.js +1 -2
  227. package/dist/core/languages/javaAdapter.js.map +1 -1
  228. package/dist/core/languages/javaFunctions.js +6 -2
  229. package/dist/core/languages/javaFunctions.js.map +1 -1
  230. package/dist/core/languages/javascriptAdapter.js +43 -8
  231. package/dist/core/languages/javascriptAdapter.js.map +1 -1
  232. package/dist/core/languages/kotlinAdapter.js +5 -2
  233. package/dist/core/languages/kotlinAdapter.js.map +1 -1
  234. package/dist/core/languages/kotlinFunctions.js +5 -6
  235. package/dist/core/languages/kotlinFunctions.js.map +1 -1
  236. package/dist/core/languages/kotlinImports.js +3 -1
  237. package/dist/core/languages/kotlinImports.js.map +1 -1
  238. package/dist/core/languages/kotlinManifests.js +7 -1
  239. package/dist/core/languages/kotlinManifests.js.map +1 -1
  240. package/dist/core/languages/phpAdapter.js +4 -1
  241. package/dist/core/languages/phpAdapter.js.map +1 -1
  242. package/dist/core/languages/phpExports.js.map +1 -1
  243. package/dist/core/languages/phpFunctions.js +18 -6
  244. package/dist/core/languages/phpFunctions.js.map +1 -1
  245. package/dist/core/languages/phpManifests.js.map +1 -1
  246. package/dist/core/languages/pythonAdapter.js.map +1 -1
  247. package/dist/core/languages/pythonFunctions.js +9 -3
  248. package/dist/core/languages/pythonFunctions.js.map +1 -1
  249. package/dist/core/languages/pythonManifests.js.map +1 -1
  250. package/dist/core/languages/rubyAdapter.js.map +1 -1
  251. package/dist/core/languages/rubyFunctions.js +6 -2
  252. package/dist/core/languages/rubyFunctions.js.map +1 -1
  253. package/dist/core/languages/rustAdapter.js.map +1 -1
  254. package/dist/core/languages/rustFunctions.js +6 -2
  255. package/dist/core/languages/rustFunctions.js.map +1 -1
  256. package/dist/core/languages/swiftAdapter.js +3 -1
  257. package/dist/core/languages/swiftAdapter.js.map +1 -1
  258. package/dist/core/languages/swiftCyclomatic.js.map +1 -1
  259. package/dist/core/languages/swiftFunctions.js +3 -1
  260. package/dist/core/languages/swiftFunctions.js.map +1 -1
  261. package/dist/core/languages/swiftImports.js.map +1 -1
  262. package/dist/core/mergeRisk.js +5 -1
  263. package/dist/core/mergeRisk.js.map +1 -1
  264. package/dist/core/missionOutcome.d.ts +1 -1
  265. package/dist/core/missionOutcome.js +9 -4
  266. package/dist/core/missionOutcome.js.map +1 -1
  267. package/dist/core/missionProof.d.ts +1 -1
  268. package/dist/core/missionProof.js +8 -6
  269. package/dist/core/missionProof.js.map +1 -1
  270. package/dist/core/missionProofBaseline.d.ts +1 -1
  271. package/dist/core/missionProofBaseline.js +8 -2
  272. package/dist/core/missionProofBaseline.js.map +1 -1
  273. package/dist/core/missionProofMarkdown.d.ts +1 -1
  274. package/dist/core/missionProofMarkdown.js +4 -1
  275. package/dist/core/missionProofMarkdown.js.map +1 -1
  276. package/dist/core/missionProofSummary.d.ts +1 -1
  277. package/dist/core/monorepo.d.ts +1 -1
  278. package/dist/core/monorepo.js +4 -2
  279. package/dist/core/monorepo.js.map +1 -1
  280. package/dist/core/onboarding.d.ts +2 -1
  281. package/dist/core/onboarding.js.map +1 -1
  282. package/dist/core/outdatedDetector.js +5 -1
  283. package/dist/core/outdatedDetector.js.map +1 -1
  284. package/dist/core/ownership.js +3 -1
  285. package/dist/core/ownership.js.map +1 -1
  286. package/dist/core/pathClassifiers.js.map +1 -1
  287. package/dist/core/pluginDx.js +2 -1
  288. package/dist/core/pluginDx.js.map +1 -1
  289. package/dist/core/pluginTrust.js +1 -3
  290. package/dist/core/pluginTrust.js.map +1 -1
  291. package/dist/core/plugins.js +5 -5
  292. package/dist/core/plugins.js.map +1 -1
  293. package/dist/core/prDiff.d.ts +1 -2
  294. package/dist/core/prDiff.js +5 -1
  295. package/dist/core/prDiff.js.map +1 -1
  296. package/dist/core/preflight.js +15 -6
  297. package/dist/core/preflight.js.map +1 -1
  298. package/dist/core/privacy.js.map +1 -1
  299. package/dist/core/qualityScorecard.d.ts +1 -1
  300. package/dist/core/qualityScorecard.js +43 -11
  301. package/dist/core/qualityScorecard.js.map +1 -1
  302. package/dist/core/regressionPlan.js +25 -7
  303. package/dist/core/regressionPlan.js.map +1 -1
  304. package/dist/core/releaseEvidence.js +41 -17
  305. package/dist/core/releaseEvidence.js.map +1 -1
  306. package/dist/core/releaseTrain.js +66 -38
  307. package/dist/core/releaseTrain.js.map +1 -1
  308. package/dist/core/repositoryScanner.js +1 -3
  309. package/dist/core/repositoryScanner.js.map +1 -1
  310. package/dist/core/review.d.ts +1 -1
  311. package/dist/core/review.js +72 -10
  312. package/dist/core/review.js.map +1 -1
  313. package/dist/core/reviewDataflow.js +7 -1
  314. package/dist/core/reviewDataflow.js.map +1 -1
  315. package/dist/core/reviewPublicSurface.d.ts +13 -0
  316. package/dist/core/reviewPublicSurface.js +134 -0
  317. package/dist/core/reviewPublicSurface.js.map +1 -0
  318. package/dist/core/roadmapCatalog.js +122 -23
  319. package/dist/core/roadmapCatalog.js.map +1 -1
  320. package/dist/core/searchIndex.js +124 -17
  321. package/dist/core/searchIndex.js.map +1 -1
  322. package/dist/core/semanticGraph.js.map +1 -1
  323. package/dist/core/semanticSearch.js +20 -4
  324. package/dist/core/semanticSearch.js.map +1 -1
  325. package/dist/core/session.js +1 -2
  326. package/dist/core/session.js.map +1 -1
  327. package/dist/core/sessionResources.js +6 -2
  328. package/dist/core/sessionResources.js.map +1 -1
  329. package/dist/core/start.d.ts +3 -9
  330. package/dist/core/start.js +22 -3231
  331. package/dist/core/start.js.map +1 -1
  332. package/dist/core/startAdoptionLoop.d.ts +2 -0
  333. package/dist/core/startAdoptionLoop.js +41 -0
  334. package/dist/core/startAdoptionLoop.js.map +1 -0
  335. package/dist/core/startEvidence.d.ts +5 -0
  336. package/dist/core/startEvidence.js +62 -0
  337. package/dist/core/startEvidence.js.map +1 -0
  338. package/dist/core/startExecutionPlan.d.ts +16 -0
  339. package/dist/core/startExecutionPlan.js +185 -0
  340. package/dist/core/startExecutionPlan.js.map +1 -0
  341. package/dist/core/startHarness.d.ts +3 -0
  342. package/dist/core/startHarness.js +47 -0
  343. package/dist/core/startHarness.js.map +1 -0
  344. package/dist/core/startIntentTargets.d.ts +24 -0
  345. package/dist/core/startIntentTargets.js +1106 -0
  346. package/dist/core/startIntentTargets.js.map +1 -0
  347. package/dist/core/startMissionControl.d.ts +16 -0
  348. package/dist/core/startMissionControl.js +145 -0
  349. package/dist/core/startMissionControl.js.map +1 -0
  350. package/dist/core/startMissionPolicy.d.ts +19 -0
  351. package/dist/core/startMissionPolicy.js +246 -0
  352. package/dist/core/startMissionPolicy.js.map +1 -0
  353. package/dist/core/startMode.d.ts +11 -0
  354. package/dist/core/startMode.js +139 -0
  355. package/dist/core/startMode.js.map +1 -0
  356. package/dist/core/startOptions.d.ts +18 -0
  357. package/dist/core/startOptions.js +29 -0
  358. package/dist/core/startOptions.js.map +1 -0
  359. package/dist/core/startResume.d.ts +7 -0
  360. package/dist/core/startResume.js +468 -0
  361. package/dist/core/startResume.js.map +1 -0
  362. package/dist/core/startReviewGate.d.ts +11 -0
  363. package/dist/core/startReviewGate.js +200 -0
  364. package/dist/core/startReviewGate.js.map +1 -0
  365. package/dist/core/startRouteActions.d.ts +7 -0
  366. package/dist/core/startRouteActions.js +497 -0
  367. package/dist/core/startRouteActions.js.map +1 -0
  368. package/dist/core/startRunbook.d.ts +24 -0
  369. package/dist/core/startRunbook.js +271 -0
  370. package/dist/core/startRunbook.js.map +1 -0
  371. package/dist/core/startSuccessCriteria.d.ts +14 -0
  372. package/dist/core/startSuccessCriteria.js +497 -0
  373. package/dist/core/startSuccessCriteria.js.map +1 -0
  374. package/dist/core/taint.js +12 -3
  375. package/dist/core/taint.js.map +1 -1
  376. package/dist/core/telemetry.js +19 -5
  377. package/dist/core/telemetry.js.map +1 -1
  378. package/dist/core/trial.d.ts +1 -1
  379. package/dist/core/trial.js +15 -6
  380. package/dist/core/trial.js.map +1 -1
  381. package/dist/core/understand.d.ts +1 -1
  382. package/dist/core/understand.js +165 -51
  383. package/dist/core/understand.js.map +1 -1
  384. package/dist/core/upgradePreview.js +1 -1
  385. package/dist/core/upgradePreview.js.map +1 -1
  386. package/dist/core/watcher.js +18 -3
  387. package/dist/core/watcher.js.map +1 -1
  388. package/dist/core/workplan.js +87 -17
  389. package/dist/core/workplan.js.map +1 -1
  390. package/dist/core/workspace.js.map +1 -1
  391. package/dist/index.d.ts +9 -9
  392. package/dist/index.js +7 -7
  393. package/dist/index.js.map +1 -1
  394. package/dist/mcp/pagination.js.map +1 -1
  395. package/dist/mcp/prompts.js +28 -20
  396. package/dist/mcp/prompts.js.map +1 -1
  397. package/dist/mcp/server.js +6 -74
  398. package/dist/mcp/server.js.map +1 -1
  399. package/dist/mcp/serverPayload.d.ts +13 -0
  400. package/dist/mcp/serverPayload.js +61 -0
  401. package/dist/mcp/serverPayload.js.map +1 -0
  402. package/dist/mcp/tokenBudget.js.map +1 -1
  403. package/dist/mcp/tools/_shared.js.map +1 -1
  404. package/dist/mcp/tools/agentBrief.js +7 -1
  405. package/dist/mcp/tools/agentBrief.js.map +1 -1
  406. package/dist/mcp/tools/applyFix.js +1 -1
  407. package/dist/mcp/tools/applyFix.js.map +1 -1
  408. package/dist/mcp/tools/audit.js.map +1 -1
  409. package/dist/mcp/tools/bugHunt.js +2 -2
  410. package/dist/mcp/tools/bugHunt.js.map +1 -1
  411. package/dist/mcp/tools/claim.js +8 -3
  412. package/dist/mcp/tools/claim.js.map +1 -1
  413. package/dist/mcp/tools/collision.js +3 -1
  414. package/dist/mcp/tools/collision.js.map +1 -1
  415. package/dist/mcp/tools/coordinate.js.map +1 -1
  416. package/dist/mcp/tools/coordinateWatch.js +5 -2
  417. package/dist/mcp/tools/coordinateWatch.js.map +1 -1
  418. package/dist/mcp/tools/costSummary.js.map +1 -1
  419. package/dist/mcp/tools/coupling.js.map +1 -1
  420. package/dist/mcp/tools/coverage.js.map +1 -1
  421. package/dist/mcp/tools/dataflow.js.map +1 -1
  422. package/dist/mcp/tools/dependencies.js +4 -1
  423. package/dist/mcp/tools/dependencies.js.map +1 -1
  424. package/dist/mcp/tools/doctor.js.map +1 -1
  425. package/dist/mcp/tools/explainIssue.js +4 -1
  426. package/dist/mcp/tools/explainIssue.js.map +1 -1
  427. package/dist/mcp/tools/fixSuggest.js +5 -2
  428. package/dist/mcp/tools/fixSuggest.js.map +1 -1
  429. package/dist/mcp/tools/hotspots.js +4 -1
  430. package/dist/mcp/tools/hotspots.js.map +1 -1
  431. package/dist/mcp/tools/impact.js +10 -3
  432. package/dist/mcp/tools/impact.js.map +1 -1
  433. package/dist/mcp/tools/mergeRisk.js.map +1 -1
  434. package/dist/mcp/tools/plugin.js +6 -1
  435. package/dist/mcp/tools/plugin.js.map +1 -1
  436. package/dist/mcp/tools/prDiff.js.map +1 -1
  437. package/dist/mcp/tools/preflight.js +1 -5
  438. package/dist/mcp/tools/preflight.js.map +1 -1
  439. package/dist/mcp/tools/review.js.map +1 -1
  440. package/dist/mcp/tools/reviewWatch.d.ts +1 -1
  441. package/dist/mcp/tools/reviewWatch.js +9 -9
  442. package/dist/mcp/tools/reviewWatch.js.map +1 -1
  443. package/dist/mcp/tools/route.js +1 -1
  444. package/dist/mcp/tools/route.js.map +1 -1
  445. package/dist/mcp/tools/search.js.map +1 -1
  446. package/dist/mcp/tools/semanticGraph.js +8 -2
  447. package/dist/mcp/tools/semanticGraph.js.map +1 -1
  448. package/dist/mcp/tools/start.js.map +1 -1
  449. package/dist/mcp/tools/structure.js +7 -1
  450. package/dist/mcp/tools/structure.js.map +1 -1
  451. package/dist/mcp/tools/understand.js.map +1 -1
  452. package/dist/mcp/tools/workspaceGraph.js +10 -1
  453. package/dist/mcp/tools/workspaceGraph.js.map +1 -1
  454. package/dist/mcp/tools.js +3 -1
  455. package/dist/mcp/tools.js.map +1 -1
  456. package/dist/projscan-sbom.cdx.json +2136 -904
  457. package/dist/reporters/consoleAnalysisReporter.d.ts +2 -0
  458. package/dist/reporters/consoleAnalysisReporter.js +89 -0
  459. package/dist/reporters/consoleAnalysisReporter.js.map +1 -0
  460. package/dist/reporters/consoleArchitectureReporter.d.ts +3 -0
  461. package/dist/reporters/consoleArchitectureReporter.js +47 -0
  462. package/dist/reporters/consoleArchitectureReporter.js.map +1 -0
  463. package/dist/reporters/consoleAuditReporter.d.ts +2 -0
  464. package/dist/reporters/consoleAuditReporter.js +46 -0
  465. package/dist/reporters/consoleAuditReporter.js.map +1 -0
  466. package/dist/reporters/consoleCiReporter.d.ts +2 -0
  467. package/dist/reporters/consoleCiReporter.js +27 -0
  468. package/dist/reporters/consoleCiReporter.js.map +1 -0
  469. package/dist/reporters/consoleCouplingReporter.d.ts +2 -0
  470. package/dist/reporters/consoleCouplingReporter.js +53 -0
  471. package/dist/reporters/consoleCouplingReporter.js.map +1 -0
  472. package/dist/reporters/consoleCoverageReporter.d.ts +2 -0
  473. package/dist/reporters/consoleCoverageReporter.js +62 -0
  474. package/dist/reporters/consoleCoverageReporter.js.map +1 -0
  475. package/dist/reporters/consoleDependencyReporter.d.ts +2 -0
  476. package/dist/reporters/consoleDependencyReporter.js +64 -0
  477. package/dist/reporters/consoleDependencyReporter.js.map +1 -0
  478. package/dist/reporters/consoleDiffReporter.d.ts +2 -0
  479. package/dist/reporters/consoleDiffReporter.js +80 -0
  480. package/dist/reporters/consoleDiffReporter.js.map +1 -0
  481. package/dist/reporters/consoleExplanationReporter.d.ts +2 -0
  482. package/dist/reporters/consoleExplanationReporter.js +33 -0
  483. package/dist/reporters/consoleExplanationReporter.js.map +1 -0
  484. package/dist/reporters/consoleFileReporter.d.ts +2 -0
  485. package/dist/reporters/consoleFileReporter.js +133 -0
  486. package/dist/reporters/consoleFileReporter.js.map +1 -0
  487. package/dist/reporters/consoleFixGuidanceReporter.d.ts +8 -0
  488. package/dist/reporters/consoleFixGuidanceReporter.js +135 -0
  489. package/dist/reporters/consoleFixGuidanceReporter.js.map +1 -0
  490. package/dist/reporters/consoleHealthReporter.d.ts +13 -0
  491. package/dist/reporters/consoleHealthReporter.js +111 -0
  492. package/dist/reporters/consoleHealthReporter.js.map +1 -0
  493. package/dist/reporters/consoleHotspotReporter.d.ts +2 -0
  494. package/dist/reporters/consoleHotspotReporter.js +68 -0
  495. package/dist/reporters/consoleHotspotReporter.js.map +1 -0
  496. package/dist/reporters/consoleImpactReporter.d.ts +2 -0
  497. package/dist/reporters/consoleImpactReporter.js +65 -0
  498. package/dist/reporters/consoleImpactReporter.js.map +1 -0
  499. package/dist/reporters/consoleOutdatedReporter.d.ts +2 -0
  500. package/dist/reporters/consoleOutdatedReporter.js +54 -0
  501. package/dist/reporters/consoleOutdatedReporter.js.map +1 -0
  502. package/dist/reporters/consolePrDiffReporter.d.ts +2 -0
  503. package/dist/reporters/consolePrDiffReporter.js +75 -0
  504. package/dist/reporters/consolePrDiffReporter.js.map +1 -0
  505. package/dist/reporters/consoleReporter.d.ts +21 -38
  506. package/dist/reporters/consoleReporter.js +19 -1000
  507. package/dist/reporters/consoleReporter.js.map +1 -1
  508. package/dist/reporters/consoleReviewReporter.d.ts +2 -0
  509. package/dist/reporters/consoleReviewReporter.js +101 -0
  510. package/dist/reporters/consoleReviewReporter.js.map +1 -0
  511. package/dist/reporters/consoleUpgradeReporter.d.ts +2 -0
  512. package/dist/reporters/consoleUpgradeReporter.js +67 -0
  513. package/dist/reporters/consoleUpgradeReporter.js.map +1 -0
  514. package/dist/reporters/consoleWorkspaceReporter.d.ts +2 -0
  515. package/dist/reporters/consoleWorkspaceReporter.js +24 -0
  516. package/dist/reporters/consoleWorkspaceReporter.js.map +1 -0
  517. package/dist/reporters/htmlReporter.d.ts +2 -1
  518. package/dist/reporters/htmlReporter.js +9 -3
  519. package/dist/reporters/htmlReporter.js.map +1 -1
  520. package/dist/reporters/jsonReporter.d.ts +2 -1
  521. package/dist/reporters/jsonReporter.js.map +1 -1
  522. package/dist/reporters/markdownAnalysisReporter.d.ts +2 -0
  523. package/dist/reporters/markdownAnalysisReporter.js +40 -0
  524. package/dist/reporters/markdownAnalysisReporter.js.map +1 -0
  525. package/dist/reporters/markdownAuditReporter.d.ts +2 -0
  526. package/dist/reporters/markdownAuditReporter.js +27 -0
  527. package/dist/reporters/markdownAuditReporter.js.map +1 -0
  528. package/dist/reporters/markdownDependencyReporter.d.ts +2 -0
  529. package/dist/reporters/markdownDependencyReporter.js +33 -0
  530. package/dist/reporters/markdownDependencyReporter.js.map +1 -0
  531. package/dist/reporters/markdownDiffReporter.d.ts +2 -0
  532. package/dist/reporters/markdownDiffReporter.js +65 -0
  533. package/dist/reporters/markdownDiffReporter.js.map +1 -0
  534. package/dist/reporters/markdownFileReporter.d.ts +2 -0
  535. package/dist/reporters/markdownFileReporter.js +92 -0
  536. package/dist/reporters/markdownFileReporter.js.map +1 -0
  537. package/dist/reporters/markdownFixGuidanceReporter.d.ts +8 -0
  538. package/dist/reporters/markdownFixGuidanceReporter.js +95 -0
  539. package/dist/reporters/markdownFixGuidanceReporter.js.map +1 -0
  540. package/dist/reporters/markdownImpactReporter.d.ts +2 -0
  541. package/dist/reporters/markdownImpactReporter.js +52 -0
  542. package/dist/reporters/markdownImpactReporter.js.map +1 -0
  543. package/dist/reporters/markdownReporter.d.ts +10 -16
  544. package/dist/reporters/markdownReporter.js +9 -452
  545. package/dist/reporters/markdownReporter.js.map +1 -1
  546. package/dist/reporters/markdownReviewReporter.d.ts +2 -0
  547. package/dist/reporters/markdownReviewReporter.js +84 -0
  548. package/dist/reporters/markdownReviewReporter.js.map +1 -0
  549. package/dist/reporters/markdownUpgradeReporter.d.ts +2 -0
  550. package/dist/reporters/markdownUpgradeReporter.js +47 -0
  551. package/dist/reporters/markdownUpgradeReporter.js.map +1 -0
  552. package/dist/reporters/sarifReporter.js.map +1 -1
  553. package/dist/tool-manifest.json +4 -4
  554. package/dist/types/agentBrief.d.ts +48 -0
  555. package/dist/types/agentBrief.js +2 -0
  556. package/dist/types/agentBrief.js.map +1 -0
  557. package/dist/types/analysis.d.ts +32 -0
  558. package/dist/types/analysis.js +2 -0
  559. package/dist/types/analysis.js.map +1 -0
  560. package/dist/types/baseline.d.ts +59 -0
  561. package/dist/types/baseline.js +2 -0
  562. package/dist/types/baseline.js.map +1 -0
  563. package/dist/types/bugHunt.d.ts +41 -0
  564. package/dist/types/bugHunt.js +2 -0
  565. package/dist/types/bugHunt.js.map +1 -0
  566. package/dist/types/common.d.ts +34 -0
  567. package/dist/types/common.js +2 -0
  568. package/dist/types/common.js.map +1 -0
  569. package/dist/types/config.d.ts +56 -0
  570. package/dist/types/config.js +2 -0
  571. package/dist/types/config.js.map +1 -0
  572. package/dist/types/coupling.d.ts +40 -0
  573. package/dist/types/coupling.js +2 -0
  574. package/dist/types/coupling.js.map +1 -0
  575. package/dist/types/coverage.d.ts +32 -0
  576. package/dist/types/coverage.js +2 -0
  577. package/dist/types/coverage.js.map +1 -0
  578. package/dist/types/dependencyHealth.d.ts +61 -0
  579. package/dist/types/dependencyHealth.js +2 -0
  580. package/dist/types/dependencyHealth.js.map +1 -0
  581. package/dist/types/dogfood.d.ts +185 -0
  582. package/dist/types/dogfood.js +2 -0
  583. package/dist/types/dogfood.js.map +1 -0
  584. package/dist/types/evidencePack.d.ts +76 -0
  585. package/dist/types/evidencePack.js +2 -0
  586. package/dist/types/evidencePack.js.map +1 -0
  587. package/dist/types/fixes.d.ts +77 -0
  588. package/dist/types/fixes.js +2 -0
  589. package/dist/types/fixes.js.map +1 -0
  590. package/dist/types/graph.d.ts +80 -0
  591. package/dist/types/graph.js +2 -0
  592. package/dist/types/graph.js.map +1 -0
  593. package/dist/types/graphCorpus.d.ts +16 -0
  594. package/dist/types/graphCorpus.js +2 -0
  595. package/dist/types/graphCorpus.js.map +1 -0
  596. package/dist/types/hotspots.d.ts +42 -0
  597. package/dist/types/hotspots.js +2 -0
  598. package/dist/types/hotspots.js.map +1 -0
  599. package/dist/types/impact.d.ts +62 -0
  600. package/dist/types/impact.js +2 -0
  601. package/dist/types/impact.js.map +1 -0
  602. package/dist/types/inspection.d.ts +47 -0
  603. package/dist/types/inspection.js +2 -0
  604. package/dist/types/inspection.js.map +1 -0
  605. package/dist/types/mcp.d.ts +39 -0
  606. package/dist/types/mcp.js +2 -0
  607. package/dist/types/mcp.js.map +1 -0
  608. package/dist/types/pluginDx.d.ts +42 -0
  609. package/dist/types/pluginDx.js +2 -0
  610. package/dist/types/pluginDx.js.map +1 -0
  611. package/dist/types/prDiff.d.ts +41 -0
  612. package/dist/types/prDiff.js +2 -0
  613. package/dist/types/prDiff.js.map +1 -0
  614. package/dist/types/preflight.d.ts +122 -0
  615. package/dist/types/preflight.js +2 -0
  616. package/dist/types/preflight.js.map +1 -0
  617. package/dist/types/qualityScorecard.d.ts +34 -0
  618. package/dist/types/qualityScorecard.js +2 -0
  619. package/dist/types/qualityScorecard.js.map +1 -0
  620. package/dist/types/regressionPlan.d.ts +32 -0
  621. package/dist/types/regressionPlan.js +2 -0
  622. package/dist/types/regressionPlan.js.map +1 -0
  623. package/dist/types/releaseTrain.d.ts +37 -0
  624. package/dist/types/releaseTrain.js +2 -0
  625. package/dist/types/releaseTrain.js.map +1 -0
  626. package/dist/types/review.d.ts +203 -0
  627. package/dist/types/review.js +2 -0
  628. package/dist/types/review.js.map +1 -0
  629. package/dist/types/reviewContract.d.ts +9 -0
  630. package/dist/types/reviewContract.js +2 -0
  631. package/dist/types/reviewContract.js.map +1 -0
  632. package/dist/types/scanning.d.ts +111 -0
  633. package/dist/types/scanning.js +2 -0
  634. package/dist/types/scanning.js.map +1 -0
  635. package/dist/types/session.d.ts +42 -0
  636. package/dist/types/session.js +2 -0
  637. package/dist/types/session.js.map +1 -0
  638. package/dist/types/start.d.ts +437 -0
  639. package/dist/types/start.js +2 -0
  640. package/dist/types/start.js.map +1 -0
  641. package/dist/types/trial.d.ts +27 -0
  642. package/dist/types/trial.js +2 -0
  643. package/dist/types/trial.js.map +1 -0
  644. package/dist/types/understand.d.ts +153 -0
  645. package/dist/types/understand.js +2 -0
  646. package/dist/types/understand.js.map +1 -0
  647. package/dist/types/workplan.d.ts +67 -0
  648. package/dist/types/workplan.js +2 -0
  649. package/dist/types/workplan.js.map +1 -0
  650. package/dist/types/workplanHandoff.d.ts +11 -0
  651. package/dist/types/workplanHandoff.js +2 -0
  652. package/dist/types/workplanHandoff.js.map +1 -0
  653. package/dist/types/workspace.d.ts +18 -0
  654. package/dist/types/workspace.js +2 -0
  655. package/dist/types/workspace.js.map +1 -0
  656. package/dist/types.d.ts +34 -2348
  657. package/dist/types.js +0 -1
  658. package/dist/types.js.map +1 -1
  659. package/dist/utils/banner.js +15 -6
  660. package/dist/utils/banner.js.map +1 -1
  661. package/dist/utils/baseline.js +11 -9
  662. package/dist/utils/baseline.js.map +1 -1
  663. package/dist/utils/changedFiles.js +1 -1
  664. package/dist/utils/changedFiles.js.map +1 -1
  665. package/dist/utils/config.d.ts +2 -1
  666. package/dist/utils/config.js.map +1 -1
  667. package/dist/utils/formatSupport.d.ts +1 -1
  668. package/dist/utils/formatSupport.js +7 -1
  669. package/dist/utils/formatSupport.js.map +1 -1
  670. package/dist/utils/packageJsonLocator.js.map +1 -1
  671. package/docs/GUIDE.md +186 -146
  672. package/docs/PLUGIN-GALLERY.md +9 -1
  673. package/docs/ROADMAP.md +69 -68
  674. package/docs/demos/projscan-4-1-demo.html +46 -79
  675. package/docs/examples/plugins/graph-context.mjs +1 -2
  676. package/docs/examples/plugins/security-sensitive-files.mjs +2 -1
  677. package/package.json +10 -5
@@ -1,9 +1,5 @@
1
- import fs from 'node:fs/promises';
2
- import path from 'node:path';
3
- import chalk from 'chalk';
4
- import { assertFormatSupported, getRootPath, maybeCompactBanner, program, setupLogLevel, } from '../_shared.js';
5
- import { computeStartReport } from '../../core/start.js';
6
- import { isWorkplanMode } from '../../core/workplan.js';
1
+ import { program } from '../_shared.js';
2
+ import { parsePositiveInt, runStartCommandAction } from './startAction.js';
7
3
  export function registerStart() {
8
4
  program
9
5
  .command('start')
@@ -32,1176 +28,6 @@ export function registerStart() {
32
28
  .option('--mission-script', 'print the Mission Control shell script')
33
29
  .option('--shortcuts', 'print the Mission Control shortcut command index')
34
30
  .option('--shortcuts-json', 'print the Mission Control shortcut command index as JSON')
35
- .action(async (cmdOpts) => {
36
- setupLogLevel();
37
- maybeCompactBanner();
38
- const format = assertFormatSupported('start');
39
- const mode = parseMode(cmdOpts.mode);
40
- const rootPath = getRootPath();
41
- try {
42
- const report = await computeStartReport(rootPath, {
43
- mode,
44
- intent: typeof cmdOpts.intent === 'string' ? cmdOpts.intent : undefined,
45
- missionDir: typeof cmdOpts.mission === 'string' ? cmdOpts.mission : undefined,
46
- maxTasks: cmdOpts.maxTasks,
47
- maxRisks: cmdOpts.maxRisks,
48
- includeHandoff: cmdOpts.includeHandoff === true,
49
- });
50
- if (typeof cmdOpts.saveMission === 'string' && cmdOpts.saveMission.length > 0) {
51
- const missionBundle = await writeMissionBundle(rootPath, cmdOpts.saveMission, report);
52
- if (format === 'json') {
53
- console.log(JSON.stringify({ missionBundle }, null, 2));
54
- return;
55
- }
56
- printMissionBundle(missionBundle);
57
- return;
58
- }
59
- if (format === 'json') {
60
- console.log(JSON.stringify(report, null, 2));
61
- return;
62
- }
63
- if (cmdOpts.nextCommand === true) {
64
- const command = report.missionControl.executionPlan.cursor.command;
65
- if (!command) {
66
- console.error(chalk.red('No runnable Mission Control cursor command is available.'));
67
- process.exit(1);
68
- }
69
- console.log(command);
70
- return;
71
- }
72
- if (cmdOpts.nextToolCall === true) {
73
- const toolCall = nextToolCall(report);
74
- if (!toolCall) {
75
- console.error(chalk.red('No MCP-callable Mission Control cursor tool call is available.'));
76
- process.exit(1);
77
- }
78
- console.log(JSON.stringify(toolCall));
79
- return;
80
- }
81
- if (cmdOpts.readyToolCalls === true) {
82
- const toolCalls = readyToolCalls(report);
83
- if (toolCalls.length === 0) {
84
- console.error(chalk.red('No ready Mission Control MCP tool calls are available.'));
85
- process.exit(1);
86
- }
87
- console.log(JSON.stringify(toolCalls));
88
- return;
89
- }
90
- if (cmdOpts.proofCommands === true) {
91
- const commands = readyProofCommands(report);
92
- if (commands.length === 0) {
93
- console.error(chalk.red('No ready Mission Control proof commands are available.'));
94
- process.exit(1);
95
- }
96
- console.log(commands.join('\n'));
97
- return;
98
- }
99
- if (cmdOpts.checklist === true) {
100
- printChecklistOnly(report);
101
- return;
102
- }
103
- if (cmdOpts.resumeJson === true) {
104
- console.log(JSON.stringify(report.missionControl.resume));
105
- return;
106
- }
107
- if (cmdOpts.handoffJson === true) {
108
- console.log(JSON.stringify(report.missionControl.handoff));
109
- return;
110
- }
111
- if (cmdOpts.runbook === true) {
112
- printRunbookOnly(report);
113
- return;
114
- }
115
- if (cmdOpts.taskCard === true) {
116
- printTaskCardOnly(report);
117
- return;
118
- }
119
- if (cmdOpts.reviewGate === true) {
120
- printReviewGateOnly(report);
121
- return;
122
- }
123
- if (cmdOpts.reviewGateJson === true) {
124
- printReviewGateJsonOnly(report);
125
- return;
126
- }
127
- if (cmdOpts.reviewPolicy === true) {
128
- printReviewPolicyOnly(report);
129
- return;
130
- }
131
- if (cmdOpts.reviewReplies === true) {
132
- printReviewRepliesOnly(report);
133
- return;
134
- }
135
- if (cmdOpts.missionScript === true) {
136
- printMissionScriptOnly(report);
137
- return;
138
- }
139
- if (cmdOpts.shortcuts === true) {
140
- printShortcutsOnly(report, {
141
- intent: typeof cmdOpts.intent === 'string' ? cmdOpts.intent : undefined,
142
- mode,
143
- });
144
- return;
145
- }
146
- if (cmdOpts.shortcutsJson === true) {
147
- printShortcutsJsonOnly(report, {
148
- intent: typeof cmdOpts.intent === 'string' ? cmdOpts.intent : undefined,
149
- mode,
150
- });
151
- return;
152
- }
153
- if (cmdOpts.handoffPrompt === true) {
154
- console.log(report.missionControl.handoffPrompt);
155
- return;
156
- }
157
- printStart(report);
158
- }
159
- catch (err) {
160
- console.error(chalk.red(err instanceof Error ? err.message : String(err)));
161
- process.exit(1);
162
- }
163
- });
164
- }
165
- function parseMode(value) {
166
- if (typeof value === 'undefined')
167
- return undefined;
168
- if (typeof value === 'string' && isWorkplanMode(value))
169
- return value;
170
- console.error(chalk.red(`Unsupported --mode ${String(value)}.`));
171
- console.error(chalk.dim('Supported modes: before_edit, before_commit, before_merge, refactor, release, bug_hunt, hardening'));
172
- process.exit(1);
173
- }
174
- function parsePositiveInt(value) {
175
- const parsed = Number.parseInt(value, 10);
176
- if (!Number.isFinite(parsed) || parsed <= 0) {
177
- throw new Error('value must be a positive integer');
178
- }
179
- return parsed;
180
- }
181
- function printStart(report) {
182
- console.log(chalk.bold(`Start: ${report.mode}`));
183
- console.log(report.summary);
184
- console.log(`Mode: ${modeSourceLabel(report.modeSource)}`);
185
- console.log(chalk.dim(report.modeReason));
186
- console.log(`Health: ${report.evidence.healthScore}/100 (${report.evidence.qualityVerdict})`);
187
- console.log(`Workflow: ${report.recommendedWorkflow.name}`);
188
- console.log('');
189
- printMissionControl(report);
190
- if (report.handoff) {
191
- console.log('');
192
- printAgentRunbook(report);
193
- }
194
- console.log('');
195
- console.log(chalk.bold('First 10 Minutes'));
196
- for (const step of report.firstTenMinutes.commands) {
197
- console.log(`- ${step.label}: ${step.command}`);
198
- }
199
- console.log('');
200
- console.log(chalk.bold('Coordination Hints'));
201
- for (const hint of report.coordinationHints) {
202
- console.log(`- ${hint.label}: ${hint.command}`);
203
- }
204
- console.log('');
205
- console.log(chalk.bold('Next Commands'));
206
- for (const action of report.nextActions.slice(0, 5)) {
207
- if (action.command)
208
- console.log(`- ${action.command}`);
209
- }
210
- console.log('');
211
- console.log(chalk.bold('Top Risks'));
212
- for (const risk of report.topRisks.slice(0, 5))
213
- printRisk(risk);
214
- if (report.adoptionLoop) {
215
- console.log('');
216
- console.log(chalk.bold('Repeat Use Loop'));
217
- console.log(report.adoptionLoop.why);
218
- for (const command of report.adoptionLoop.nextCommands.slice(0, 3))
219
- console.log('- ' + command);
220
- }
221
- if (report.adoptionGaps.length > 0) {
222
- console.log('');
223
- console.log(chalk.bold('Adoption Gaps'));
224
- for (const gap of report.adoptionGaps.slice(0, 5)) {
225
- console.log(`- [${gap.status}] ${gap.title}: ${gap.summary}${gap.command ? ` (${gap.command})` : ''}`);
226
- }
227
- }
228
- }
229
- function printAgentRunbook(report) {
230
- console.log(chalk.bold('Agent Runbook'));
231
- console.log(report.missionControl.runbook.markdown.trimEnd());
232
- }
233
- function modeSourceLabel(source) {
234
- if (source === 'intent')
235
- return 'inferred from intent';
236
- if (source === 'explicit')
237
- return 'explicit';
238
- return 'default';
239
- }
240
- function printMissionControl(report) {
241
- const mission = report.missionControl;
242
- console.log(chalk.bold('Mission Control'));
243
- if (mission.intent)
244
- console.log(`Intent: ${mission.intent}`);
245
- console.log(`Status: ${mission.status}`);
246
- console.log(mission.headline);
247
- if (mission.routedIntent) {
248
- console.log(`Route: ${mission.routedIntent.category} via ${mission.routedIntent.tool} (${routeEvidence(mission.routedIntent)})`);
249
- }
250
- if (mission.primaryAction.command)
251
- console.log(chalk.cyan(mission.primaryAction.command));
252
- console.log(chalk.dim(mission.whyNow));
253
- printExecutionPlan(report);
254
- printResumeChecklist(report);
255
- printHandoffPrompt(report);
256
- printMissionOutcome(report);
257
- printReviewGate(report);
258
- if (mission.actionPlan.length > 0) {
259
- console.log(chalk.bold('Action Plan'));
260
- for (const action of mission.actionPlan.slice(0, 4)) {
261
- if (action.command)
262
- console.log(`- ${action.label}: ${action.command}`);
263
- }
264
- }
265
- if (mission.readyActions.length > 0) {
266
- console.log(chalk.bold('Ready Now'));
267
- for (const action of mission.readyActions.slice(0, 4)) {
268
- if (action.command)
269
- console.log(`- ${action.label}: ${action.command}`);
270
- }
271
- }
272
- if (mission.unresolvedInputs.length > 0) {
273
- console.log(chalk.bold('Needs Input'));
274
- for (const input of mission.unresolvedInputs.slice(0, 4)) {
275
- console.log(`- ${input.name}: replace ${input.placeholder} after ${input.sourceAction}`);
276
- }
277
- }
278
- if (mission.alternatives && mission.alternatives.length > 0) {
279
- console.log(chalk.bold('Also Consider'));
280
- for (const route of mission.alternatives.slice(0, 3)) {
281
- console.log(`- ${route.category}: ${route.cli} (${routeEvidence(route)})`);
282
- }
283
- }
284
- if (mission.successCriteria.length > 0) {
285
- console.log(chalk.bold('Done When'));
286
- for (const criterion of mission.successCriteria.slice(0, 4)) {
287
- console.log(`- ${criterion}`);
288
- }
289
- }
290
- if (mission.proofCommands.length > 0) {
291
- console.log(chalk.bold('Ready Proof'));
292
- console.log(chalk.dim(mission.proofSummary));
293
- const proofCommands = readyProofCommands(report);
294
- for (const command of proofCommands.slice(0, 3)) {
295
- console.log(chalk.dim(`- ${command}`));
296
- }
297
- const proofItems = mission.handoff.readyProof.items ?? [];
298
- if (proofItems.length > 0) {
299
- console.log(chalk.bold('Proof Queue'));
300
- for (const item of proofItems) {
301
- console.log(chalk.dim(`- ${formatConsoleProofItem(item)}`));
302
- }
303
- }
304
- }
305
- }
306
- function printMissionOutcome(report) {
307
- const outcome = report.missionControl.outcome;
308
- if (!outcome)
309
- return;
310
- console.log(chalk.bold('Mission Outcome'));
311
- console.log(`Status: ${outcome.status}`);
312
- if (!outcome.available && outcome.reason)
313
- console.log(`Reason: ${outcome.reason}`);
314
- for (const item of outcome.whatChanged)
315
- console.log(`- Changed: ${item}`);
316
- for (const item of outcome.whatRemains)
317
- console.log(`- Remains: ${item}`);
318
- console.log(`Version candidate: ${outcome.versionCandidate.recommendation}`);
319
- console.log(chalk.dim(outcome.versionCandidate.summary));
320
- }
321
- function nextToolCall(report) {
322
- const resumeToolCall = report.missionControl.resume.toolCall;
323
- if (resumeToolCall)
324
- return resumeToolCall;
325
- const cursor = report.missionControl.executionPlan.cursor;
326
- if (!cursor.tool)
327
- return undefined;
328
- return {
329
- tool: cursor.tool,
330
- ...(typeof cursor.args !== 'undefined' ? { args: cursor.args } : {}),
331
- };
332
- }
333
- function readyToolCalls(report) {
334
- const calls = [];
335
- const current = nextToolCall(report);
336
- if (current)
337
- calls.push(compactToolCall(current));
338
- for (const proofCall of report.missionControl.handoff.readyProof.toolCalls ?? []) {
339
- calls.push(compactToolCall(proofCall));
340
- }
341
- return dedupeToolCalls(calls);
342
- }
343
- function compactToolCall(toolCall) {
344
- return {
345
- tool: toolCall.tool,
346
- ...(typeof toolCall.args !== 'undefined' ? { args: toolCall.args } : {}),
347
- };
348
- }
349
- function dedupeToolCalls(toolCalls) {
350
- const seen = new Set();
351
- const out = [];
352
- for (const toolCall of toolCalls) {
353
- const key = JSON.stringify(toolCall);
354
- if (seen.has(key))
355
- continue;
356
- seen.add(key);
357
- out.push(toolCall);
358
- }
359
- return out;
360
- }
361
- function readyProofCommands(report) {
362
- const mission = report.missionControl;
363
- return mission.handoff.readyProof.commands.length > 0
364
- ? mission.handoff.readyProof.commands
365
- : mission.proofCommands;
366
- }
367
- async function writeMissionBundle(rootPath, bundleDir, report) {
368
- const targetDir = path.resolve(rootPath, bundleDir);
369
- const files = missionBundleFiles(targetDir);
370
- const shortcutOptions = missionShortcutOptions(report);
371
- const manifest = {
372
- schemaVersion: 1,
373
- kind: 'projscan.mission-bundle',
374
- directory: targetDir,
375
- ...(report.missionControl.intent ? { intent: report.missionControl.intent } : {}),
376
- mode: report.mode,
377
- status: report.missionControl.status,
378
- currentStep: missionBundleCurrentStep(report),
379
- quickCommands: missionBundleQuickCommands(),
380
- files,
381
- };
382
- await fs.mkdir(targetDir, { recursive: true });
383
- await fs.writeFile(path.join(targetDir, 'README.md'), missionBundleReadme(report, files), 'utf-8');
384
- await fs.writeFile(path.join(targetDir, 'next-command.txt'), missionBundleNextCommand(report), 'utf-8');
385
- await fs.writeFile(path.join(targetDir, 'next-tool-call.json'), JSON.stringify(nextToolCall(report) ?? null) + '\n', 'utf-8');
386
- await fs.writeFile(path.join(targetDir, 'handoff-prompt.txt'), report.missionControl.handoffPrompt.trimEnd() + '\n', 'utf-8');
387
- await fs.writeFile(path.join(targetDir, 'resume-prompt.txt'), report.missionControl.resume.prompt.trimEnd() + '\n', 'utf-8');
388
- await fs.writeFile(path.join(targetDir, 'task-card.md'), report.missionControl.taskCard.markdown, 'utf-8');
389
- await fs.writeFile(path.join(targetDir, 'review-gate.md'), report.missionControl.reviewGate.markdown, 'utf-8');
390
- await fs.writeFile(path.join(targetDir, 'review-gate.json'), JSON.stringify(report.missionControl.reviewGate, null, 2) + '\n', 'utf-8');
391
- await fs.writeFile(path.join(targetDir, 'review-policy.json'), JSON.stringify(report.missionControl.reviewGate.policy, null, 2) + '\n', 'utf-8');
392
- await fs.writeFile(path.join(targetDir, 'review-replies.txt'), missionReviewReplyLines(report).join('\n') + '\n', 'utf-8');
393
- await fs.writeFile(path.join(targetDir, 'runbook.md'), report.missionControl.runbook.markdown.trimEnd() + '\n', 'utf-8');
394
- await fs.writeFile(path.join(targetDir, 'handoff.json'), JSON.stringify(report.missionControl.handoff, null, 2) + '\n', 'utf-8');
395
- await fs.writeFile(path.join(targetDir, 'resume.json'), JSON.stringify(report.missionControl.resume, null, 2) + '\n', 'utf-8');
396
- await fs.writeFile(path.join(targetDir, 'ready-tool-calls.json'), JSON.stringify(readyToolCalls(report), null, 2) + '\n', 'utf-8');
397
- await fs.writeFile(path.join(targetDir, 'shortcuts.json'), JSON.stringify(buildShortcutIndex(report, shortcutOptions), null, 2) + '\n', 'utf-8');
398
- await fs.mkdir(path.join(targetDir, 'proof-logs'), { recursive: true });
399
- await fs.writeFile(path.join(targetDir, 'proof-logs', 'README.md'), missionProofLogsReadme(report), 'utf-8');
400
- await fs.writeFile(path.join(targetDir, 'proof-logs', 'status.jsonl'), '', 'utf-8');
401
- await fs.writeFile(path.join(targetDir, 'proof-logs', 'run-report.md'), missionInitialRunReport(), 'utf-8');
402
- await fs.writeFile(path.join(targetDir, 'proof-logs', 'summary.json'), JSON.stringify(missionInitialRunSummary(), null, 2) + '\n', 'utf-8');
403
- const missionScriptPath = path.join(targetDir, 'mission.sh');
404
- await fs.writeFile(missionScriptPath, buildMissionScript(report, { proofLogs: true }), 'utf-8');
405
- await fs.chmod(missionScriptPath, 0o755).catch(() => undefined);
406
- const statusScriptPath = path.join(targetDir, 'status.sh');
407
- await fs.writeFile(statusScriptPath, buildMissionStatusScript(), 'utf-8');
408
- await fs.chmod(statusScriptPath, 0o755).catch(() => undefined);
409
- const reviewScriptPath = path.join(targetDir, 'review.sh');
410
- await fs.writeFile(reviewScriptPath, buildMissionReviewScript(report), 'utf-8');
411
- await fs.chmod(reviewScriptPath, 0o755).catch(() => undefined);
412
- await fs.writeFile(path.join(targetDir, 'proof-commands.txt'), readyProofCommands(report).join('\n') + '\n', 'utf-8');
413
- await fs.writeFile(path.join(targetDir, 'manifest.json'), JSON.stringify(manifest, null, 2) + '\n', 'utf-8');
414
- return manifest;
415
- }
416
- function missionBundleQuickCommands() {
417
- return [
418
- {
419
- id: 'run',
420
- command: './mission.sh',
421
- description: 'Run the current command and remaining proof.',
422
- },
423
- {
424
- id: 'status',
425
- command: './status.sh',
426
- description: 'Print the latest mission state and next action.',
427
- },
428
- {
429
- id: 'review',
430
- command: './review.sh',
431
- description: 'Print the review packet for approval.',
432
- },
433
- ];
434
- }
435
- function missionBundleFiles(targetDir) {
436
- return [
437
- {
438
- name: 'README.md',
439
- path: path.join(targetDir, 'README.md'),
440
- description: 'Quickstart for humans opening the bundle.',
441
- },
442
- {
443
- name: 'next-command.txt',
444
- path: path.join(targetDir, 'next-command.txt'),
445
- description: 'Current shell command or resume instruction.',
446
- },
447
- {
448
- name: 'next-tool-call.json',
449
- path: path.join(targetDir, 'next-tool-call.json'),
450
- description: 'Current MCP tool call, or null when no mapped call exists.',
451
- },
452
- {
453
- name: 'handoff-prompt.txt',
454
- path: path.join(targetDir, 'handoff-prompt.txt'),
455
- description: 'Copyable prompt for handing this mission to another agent.',
456
- },
457
- {
458
- name: 'resume-prompt.txt',
459
- path: path.join(targetDir, 'resume-prompt.txt'),
460
- description: 'Focused prompt for resuming the current cursor.',
461
- },
462
- {
463
- name: 'task-card.md',
464
- path: path.join(targetDir, 'task-card.md'),
465
- description: 'Paste-ready Markdown task card for PRs, issues, and handoffs.',
466
- },
467
- {
468
- name: 'review-gate.md',
469
- path: path.join(targetDir, 'review-gate.md'),
470
- description: 'Stop-and-review gate for approving another slice, release, publish, or deploy.',
471
- },
472
- {
473
- name: 'review-gate.json',
474
- path: path.join(targetDir, 'review-gate.json'),
475
- description: 'Machine-readable review gate with policy, proof, decisions, and worktree evidence.',
476
- },
477
- {
478
- name: 'review-policy.json',
479
- path: path.join(targetDir, 'review-policy.json'),
480
- description: 'Machine-readable review approval boundary and blocked actions.',
481
- },
482
- {
483
- name: 'review-replies.txt',
484
- path: path.join(targetDir, 'review-replies.txt'),
485
- description: 'Copy-only reviewer reply choices for approving or redirecting the stopped mission.',
486
- },
487
- {
488
- name: 'runbook.md',
489
- path: path.join(targetDir, 'runbook.md'),
490
- description: 'Human-readable Mission Control runbook.',
491
- },
492
- {
493
- name: 'handoff.json',
494
- path: path.join(targetDir, 'handoff.json'),
495
- description: 'Structured Mission Control handoff object.',
496
- },
497
- {
498
- name: 'resume.json',
499
- path: path.join(targetDir, 'resume.json'),
500
- description: 'Focused resume object for the current cursor.',
501
- },
502
- {
503
- name: 'ready-tool-calls.json',
504
- path: path.join(targetDir, 'ready-tool-calls.json'),
505
- description: 'Current cursor MCP call followed by remaining MCP-callable proof.',
506
- },
507
- {
508
- name: 'shortcuts.json',
509
- path: path.join(targetDir, 'shortcuts.json'),
510
- description: 'Machine-readable Mission Control shortcut command index.',
511
- },
512
- {
513
- name: 'mission.sh',
514
- path: path.join(targetDir, 'mission.sh'),
515
- description: 'Shell script that runs the current cursor command and remaining proof queue.',
516
- },
517
- {
518
- name: 'status.sh',
519
- path: path.join(targetDir, 'status.sh'),
520
- description: 'Shell script that prints the latest mission run state from summary.json.',
521
- },
522
- {
523
- name: 'review.sh',
524
- path: path.join(targetDir, 'review.sh'),
525
- description: 'Shell script that prints status, review evidence, run report, and reviewer replies.',
526
- },
527
- {
528
- name: 'proof-logs/README.md',
529
- path: path.join(targetDir, 'proof-logs', 'README.md'),
530
- description: 'Proof-log index for output written by mission.sh.',
531
- },
532
- {
533
- name: 'proof-logs/status.jsonl',
534
- path: path.join(targetDir, 'proof-logs', 'status.jsonl'),
535
- description: 'Runtime status rows written by mission.sh.',
536
- },
537
- {
538
- name: 'proof-logs/run-report.md',
539
- path: path.join(targetDir, 'proof-logs', 'run-report.md'),
540
- description: 'Human-readable run report refreshed by mission.sh.',
541
- },
542
- {
543
- name: 'proof-logs/summary.json',
544
- path: path.join(targetDir, 'proof-logs', 'summary.json'),
545
- description: 'Machine-readable mission run state refreshed by mission.sh.',
546
- },
547
- {
548
- name: 'proof-commands.txt',
549
- path: path.join(targetDir, 'proof-commands.txt'),
550
- description: 'Remaining ready proof commands, one per line.',
551
- },
552
- {
553
- name: 'manifest.json',
554
- path: path.join(targetDir, 'manifest.json'),
555
- description: 'Bundle index with mode, status, current step, and file paths.',
556
- },
557
- ];
558
- }
559
- function missionBundleReadme(report, files) {
560
- const mission = report.missionControl;
561
- const cursor = mission.executionPlan.cursor;
562
- const lines = [
563
- '# Mission Bundle',
564
- '',
565
- ...(mission.intent ? [`Intent: ${mission.intent}`] : []),
566
- `Mode: ${report.mode}`,
567
- `Status: ${mission.status}`,
568
- `Current step: ${cursor.stepId} in ${cursor.phaseId}`,
569
- '',
570
- '## Quick Commands',
571
- '',
572
- '```sh',
573
- './mission.sh',
574
- './status.sh',
575
- './review.sh',
576
- '```',
577
- '',
578
- '- `./mission.sh` runs the current command and remaining proof.',
579
- '- `./status.sh` prints the latest mission state and next action.',
580
- '- `./review.sh` prints the review packet for approval.',
581
- '',
582
- '## Run Next',
583
- '',
584
- ];
585
- if (cursor.command) {
586
- lines.push('```sh', cursor.command, '```');
587
- }
588
- else {
589
- lines.push(mission.resume.instruction);
590
- }
591
- const toolCall = nextToolCall(report);
592
- if (toolCall) {
593
- lines.push('', `MCP call: \`${toolCall.tool} ${JSON.stringify(toolCall.args ?? {})}\``);
594
- }
595
- const reviewReplyLines = missionReviewReplyLines(report);
596
- if (reviewReplyLines.length > 0) {
597
- lines.push('', '## Reviewer Replies', '', ...reviewReplyLines);
598
- }
599
- lines.push('', '## Files');
600
- for (const file of files) {
601
- lines.push(`- \`${file.name}\`: ${file.description}`);
602
- }
603
- return lines.join('\n').trimEnd() + '\n';
604
- }
605
- function missionBundleNextCommand(report) {
606
- return `${report.missionControl.executionPlan.cursor.command ?? report.missionControl.resume.instruction}\n`;
607
- }
608
- function missionBundleCurrentStep(report) {
609
- const cursor = report.missionControl.executionPlan.cursor;
610
- return {
611
- phaseId: cursor.phaseId,
612
- stepId: cursor.stepId,
613
- ...(cursor.command ? { command: cursor.command } : {}),
614
- ...(cursor.tool ? { toolCall: { tool: cursor.tool, ...(typeof cursor.args !== 'undefined' ? { args: cursor.args } : {}) } } : {}),
615
- };
616
- }
617
- function printMissionBundle(manifest) {
618
- console.log(chalk.green(`Wrote Mission Control bundle to ${manifest.directory}`));
619
- for (const file of manifest.files) {
620
- console.log(`- ${file.name}`);
621
- }
622
- }
623
- function printChecklistOnly(report) {
624
- const checklist = report.missionControl.resume.checklist ?? [];
625
- if (checklist.length === 0) {
626
- console.error(chalk.red('No Mission Control resume checklist is available.'));
627
- process.exit(1);
628
- }
629
- for (const item of checklist) {
630
- console.log(`- ${formatConsoleChecklistItem(item)}`);
631
- }
632
- }
633
- function printRunbookOnly(report) {
634
- const runbook = report.missionControl.runbook.markdown.trimEnd();
635
- if (runbook.length === 0) {
636
- console.error(chalk.red('No Mission Control runbook is available.'));
637
- process.exit(1);
638
- }
639
- console.log(runbook);
640
- }
641
- function printTaskCardOnly(report) {
642
- const taskCard = report.missionControl.taskCard.markdown.trimEnd();
643
- if (taskCard.length === 0) {
644
- console.error(chalk.red('No Mission Control task card is available.'));
645
- process.exit(1);
646
- }
647
- console.log(taskCard);
648
- }
649
- function printReviewGateOnly(report) {
650
- const reviewGate = report.missionControl.reviewGate.markdown.trimEnd();
651
- if (reviewGate.length === 0) {
652
- console.error(chalk.red('No Mission Control review gate is available.'));
653
- process.exit(1);
654
- }
655
- console.log(reviewGate);
656
- }
657
- function printReviewGateJsonOnly(report) {
658
- console.log(JSON.stringify(report.missionControl.reviewGate));
659
- }
660
- function printReviewPolicyOnly(report) {
661
- console.log(JSON.stringify(report.missionControl.reviewGate.policy));
662
- }
663
- function printReviewRepliesOnly(report) {
664
- const replies = missionReviewReplyLines(report);
665
- if (replies.length === 0) {
666
- console.error(chalk.red('No Mission Control reviewer replies are available.'));
667
- process.exit(1);
668
- }
669
- console.log(replies.join('\n'));
670
- }
671
- function printMissionScriptOnly(report) {
672
- console.log(buildMissionScript(report).trimEnd());
673
- }
674
- function buildMissionStatusScript() {
675
- return [
676
- '#!/usr/bin/env sh',
677
- 'set -eu',
678
- '',
679
- 'MISSION_DIR=$(CDPATH= cd "$(dirname "$0")" && pwd)',
680
- 'SUMMARY_FILE="${MISSION_DIR}/proof-logs/summary.json"',
681
- '',
682
- 'if ! command -v node >/dev/null 2>&1; then',
683
- ` ${scriptPrintError('Node.js is required to read proof-logs/summary.json.')}`,
684
- ' exit 2',
685
- 'fi',
686
- '',
687
- 'node - "$SUMMARY_FILE" <<\'NODE\'',
688
- 'const fs = require("node:fs");',
689
- 'const summaryPath = process.argv[2];',
690
- 'let summary;',
691
- 'try {',
692
- ' summary = JSON.parse(fs.readFileSync(summaryPath, "utf8"));',
693
- '} catch (error) {',
694
- ' console.error(`Unable to read ${summaryPath}: ${error.message}`);',
695
- ' process.exit(2);',
696
- '}',
697
- 'const status = typeof summary.status === "string" ? summary.status : "unknown";',
698
- 'console.log(`Mission status: ${status}`);',
699
- 'if (summary.report) console.log(`Report: ${summary.report}`);',
700
- 'if (summary.statusRows) console.log(`Status rows: ${summary.statusRows}`);',
701
- 'if (summary.totalCommands !== undefined) console.log(`Total commands: ${summary.totalCommands}`);',
702
- 'if (summary.failedStep) console.log(`Failed step: ${summary.failedStep}`);',
703
- 'if (summary.exitCode !== undefined) console.log(`Exit code: ${summary.exitCode}`);',
704
- 'if (summary.log) console.log(`Log: ${summary.log}`);',
705
- `const nextActions = ${JSON.stringify(missionRunNextActions)};`,
706
- 'const nextAction = typeof summary.nextAction === "string" ? summary.nextAction : nextActions[status] ?? "inspect proof-logs/summary.json.";',
707
- 'console.log(`Next action: ${nextAction}`);',
708
- 'process.exitCode = status === "passed" ? 0 : status === "failed" ? 1 : 2;',
709
- 'NODE',
710
- '',
711
- ].join('\n');
712
- }
713
- function buildMissionReviewScript(report) {
714
- const evidenceCommands = report.missionControl.reviewGate.commands;
715
- return [
716
- '#!/usr/bin/env sh',
717
- 'set -eu',
718
- '',
719
- 'MISSION_DIR=$(CDPATH= cd "$(dirname "$0")" && pwd)',
720
- 'status_code=2',
721
- '',
722
- scriptPrint('Mission Review'),
723
- scriptPrint(''),
724
- 'if [ -x "${MISSION_DIR}/status.sh" ]; then',
725
- ' set +e',
726
- ' "${MISSION_DIR}/status.sh"',
727
- ' status_code=$?',
728
- ' set -e',
729
- 'else',
730
- ` ${scriptPrintError('Missing status.sh; run projscan start --save-mission again.')}`,
731
- 'fi',
732
- '',
733
- scriptPrint(''),
734
- scriptPrint('Review gate: review-gate.md'),
735
- 'if [ -f "${MISSION_DIR}/review-gate.md" ]; then',
736
- " sed -n '1,220p' \"${MISSION_DIR}/review-gate.md\"",
737
- 'else',
738
- ` ${scriptPrintError('Missing review-gate.md.')}`,
739
- 'fi',
740
- '',
741
- scriptPrint(''),
742
- scriptPrint('Run report: proof-logs/run-report.md'),
743
- 'if [ -f "${MISSION_DIR}/proof-logs/run-report.md" ]; then',
744
- " sed -n '1,220p' \"${MISSION_DIR}/proof-logs/run-report.md\"",
745
- 'else',
746
- ` ${scriptPrintError('Missing proof-logs/run-report.md. Run ./mission.sh to create proof output.')}`,
747
- 'fi',
748
- '',
749
- scriptPrint(''),
750
- scriptPrint('Evidence commands'),
751
- ...evidenceCommands.map((command) => scriptPrint(`- ${command}`)),
752
- '',
753
- scriptPrint(''),
754
- scriptPrint('Reviewer replies:'),
755
- 'if [ -f "${MISSION_DIR}/review-replies.txt" ]; then',
756
- ' cat "${MISSION_DIR}/review-replies.txt"',
757
- 'else',
758
- ` ${scriptPrintError('Missing review-replies.txt.')}`,
759
- 'fi',
760
- '',
761
- 'exit "$status_code"',
762
- '',
763
- ].join('\n');
764
- }
765
- function buildMissionScript(report, options = {}) {
766
- const mission = report.missionControl;
767
- const cursor = mission.executionPlan.cursor;
768
- const proofCommands = readyProofCommands(report);
769
- const totalLoggedCommands = typeof cursor.command === 'string' ? 1 + proofCommands.length : proofCommands.length;
770
- const unsafeCommand = [cursor.command, ...proofCommands]
771
- .filter((command) => typeof command === 'string')
772
- .find(commandHasShellExpansionSyntax);
773
- const proofLogs = options.proofLogs === true && !unsafeCommand && typeof cursor.command === 'string';
774
- const lines = [
775
- '#!/usr/bin/env sh',
776
- 'set -eu',
777
- '',
778
- scriptPrint('projscan Mission Control'),
779
- ...(mission.intent && !unsafeCommand ? [scriptPrint(`Intent: ${mission.intent}`)] : []),
780
- scriptPrint(`Mode: ${report.mode}`),
781
- scriptPrint(`Status: ${mission.status}`),
782
- scriptPrint(`Current step: ${cursor.stepId} in ${cursor.phaseId}`),
783
- scriptPrint(''),
784
- ];
785
- if (unsafeCommand) {
786
- lines.push(scriptPrintError('Blocked: mission command contains shell expansion syntax; inspect --next-command before running it.'), 'exit 2');
787
- return lines.join('\n') + '\n';
788
- }
789
- if (proofLogs) {
790
- lines.push('MISSION_DIR=$(CDPATH= cd "$(dirname "$0")" && pwd)', 'PROOF_LOG_DIR="${MISSION_DIR}/proof-logs"', 'PROOF_STATUS_FILE="${PROOF_LOG_DIR}/status.jsonl"', 'PROOF_REPORT_FILE="${PROOF_LOG_DIR}/run-report.md"', 'PROOF_SUMMARY_FILE="${PROOF_LOG_DIR}/summary.json"', 'mkdir -p "$PROOF_LOG_DIR"', ': > "$PROOF_STATUS_FILE"', ': > "$PROOF_REPORT_FILE"', ...scriptInitRunReport(report), scriptWriteSummaryJson('running'), scriptPrintExpanded('Proof logs: ${PROOF_LOG_DIR}'), scriptPrintExpanded('Run report: ${PROOF_REPORT_FILE}'), scriptPrintExpanded('Summary: ${PROOF_SUMMARY_FILE}'), scriptPrint(''));
791
- }
792
- if (!cursor.command) {
793
- lines.push(scriptPrintError(`Blocked: ${cursor.instruction ?? cursor.label}`), 'exit 2');
794
- return lines.join('\n') + '\n';
795
- }
796
- lines.push(...scriptCommandBlock('Run current command', cursor.command, proofLogs ? { id: `current-${cursor.stepId}`, logName: `current-${cursor.stepId}.log` } : undefined));
797
- if (proofCommands.length > 0) {
798
- lines.push(scriptPrint(''), scriptPrint('Run remaining proof'));
799
- for (const [index, command] of proofCommands.entries()) {
800
- lines.push(...scriptCommandBlock(`Proof ${index + 1}`, command, proofLogs ? { id: `proof-${index + 1}`, logName: `proof-${index + 1}.log` } : undefined));
801
- }
802
- }
803
- if (proofLogs) {
804
- lines.push(...scriptAppendRunReportResult('passed'), scriptWriteSummaryJson('passed', { totalCommands: totalLoggedCommands }), ...scriptAppendRunReportReviewGate(mission.reviewGate.stopCondition, mission.reviewGate.commands));
805
- }
806
- lines.push(scriptPrint(''), scriptPrint('Review gate'), scriptPrint(mission.reviewGate.stopCondition), ...mission.reviewGate.commands.map((command) => scriptPrint(`Capture: ${command}`)));
807
- return lines.join('\n') + '\n';
808
- }
809
- function missionProofLogsReadme(report) {
810
- const entries = missionProofLogEntries(report);
811
- const lines = [
812
- '# Mission Proof Logs',
813
- '',
814
- 'Run `./mission.sh` from this bundle to write command output here.',
815
- 'Read `run-report.md` first for pass/fail proof after `mission.sh` runs.',
816
- 'Read `summary.json` for the latest not_run, running, passed, or failed state.',
817
- 'Read `status.jsonl` for command exit codes after `mission.sh` runs.',
818
- '',
819
- '## Expected Logs',
820
- '',
821
- ];
822
- if (entries.length === 0) {
823
- lines.push('No runnable proof logs are planned for this mission.');
824
- }
825
- else {
826
- for (const entry of entries) {
827
- lines.push(`- \`${entry.name}\`: \`${entry.command}\``);
828
- }
829
- }
830
- return lines.join('\n').trimEnd() + '\n';
831
- }
832
- function missionInitialRunReport() {
833
- return [
834
- '# Mission Run Report',
835
- '',
836
- 'Run `./mission.sh` to refresh this report with command exit codes and log links.',
837
- 'Review `status.jsonl` for machine-readable status rows.',
838
- '',
839
- ].join('\n');
840
- }
841
- function missionInitialRunSummary() {
842
- return {
843
- schemaVersion: 1,
844
- status: 'not_run',
845
- nextAction: missionRunNextActions.not_run,
846
- report: 'proof-logs/run-report.md',
847
- statusRows: 'proof-logs/status.jsonl',
848
- };
849
- }
850
- function missionProofLogEntries(report) {
851
- const cursor = report.missionControl.executionPlan.cursor;
852
- const proofCommands = readyProofCommands(report);
853
- const unsafeCommand = [cursor.command, ...proofCommands]
854
- .filter((command) => typeof command === 'string')
855
- .find(commandHasShellExpansionSyntax);
856
- if (unsafeCommand || !cursor.command)
857
- return [];
858
- return [
859
- { name: `current-${cursor.stepId}.log`, command: cursor.command },
860
- ...proofCommands.map((command, index) => ({ name: `proof-${index + 1}.log`, command })),
861
- ];
862
- }
863
- function scriptCommandBlock(label, command, logTarget) {
864
- if (!logTarget)
865
- return [scriptPrint(label), command];
866
- return [
867
- scriptPrint(label),
868
- scriptPrint(`Writing proof-logs/${logTarget.logName}`),
869
- 'set +e',
870
- '{',
871
- ` ${command}`,
872
- `} > "$PROOF_LOG_DIR/${logTarget.logName}" 2>&1`,
873
- 'status=$?',
874
- 'set -e',
875
- scriptAppendStatusJsonl(logTarget.id, label, logTarget.logName, command),
876
- scriptAppendReportRow(logTarget.id, label, logTarget.logName),
877
- 'if [ "$status" -ne 0 ]; then',
878
- ` ${scriptPrintError(`Command failed. See proof-logs/${logTarget.logName}.`)}`,
879
- ...scriptAppendReportFailure(logTarget.id, logTarget.logName),
880
- ` ${scriptWriteSummaryJson('failed', { failedStep: logTarget.id, logName: logTarget.logName })}`,
881
- ` ${scriptPrintExpanded('Run report: ${PROOF_REPORT_FILE}')}`,
882
- ` ${scriptPrintExpanded('Summary: ${PROOF_SUMMARY_FILE}')}`,
883
- ' exit "$status"',
884
- 'fi',
885
- ];
886
- }
887
- function scriptPrint(value) {
888
- return `printf '%s\\n' ${shellQuote(value)}`;
889
- }
890
- function scriptPrintExpanded(value) {
891
- return `printf '%s\\n' "${value.replace(/(["\\])/g, '\\$1')}"`;
892
- }
893
- function scriptAppendStatusJsonl(id, label, logName, command) {
894
- const prefix = JSON.stringify({
895
- id,
896
- label,
897
- log: logName,
898
- command,
899
- }).replace(/}$/, ',"exitCode":');
900
- return `printf '%s%s%s\\n' ${shellQuote(prefix)} "$status" '}' >> "$PROOF_STATUS_FILE"`;
901
- }
902
- function scriptInitRunReport(report) {
903
- const mission = report.missionControl;
904
- return [
905
- '{',
906
- ` ${scriptPrint('# Mission Run Report')}`,
907
- ` ${scriptPrint('')}`,
908
- ...(mission.intent ? [` ${scriptPrint(`Intent: ${mission.intent}`)}`] : []),
909
- ` ${scriptPrint(`Mode: ${report.mode}`)}`,
910
- ` ${scriptPrint(`Status: ${mission.status}`)}`,
911
- ` ${scriptPrint(`Current step: ${mission.executionPlan.cursor.stepId} in ${mission.executionPlan.cursor.phaseId}`)}`,
912
- ` ${scriptPrint('')}`,
913
- ` ${scriptPrint('| Step | Label | Exit | Log |')}`,
914
- ` ${scriptPrint('| --- | --- | ---: | --- |')}`,
915
- '} >> "$PROOF_REPORT_FILE"',
916
- ];
917
- }
918
- function scriptAppendReportRow(id, label, logName) {
919
- return `printf '| %s | %s | %s | %s |\\n' ${shellQuote(id)} ${shellQuote(label)} "$status" ${shellQuote(`proof-logs/${logName}`)} >> "$PROOF_REPORT_FILE"`;
920
- }
921
- function scriptAppendReportFailure(id, logName) {
922
- return [
923
- ...scriptAppendRunReportResult('failed'),
924
- ' {',
925
- ` ${scriptPrint(`Failed step: ${id}`)}`,
926
- ` ${scriptPrint(`Log: proof-logs/${logName}`)}`,
927
- ' } >> "$PROOF_REPORT_FILE"',
928
- ];
929
- }
930
- const missionRunNextActions = {
931
- not_run: 'run ./mission.sh to generate proof.',
932
- running: 'wait for ./mission.sh to finish, or inspect proof-logs/status.jsonl.',
933
- failed: 'inspect the failed log, fix the issue, then rerun ./mission.sh.',
934
- passed: 'run ./review.sh and choose a reviewer reply.',
935
- };
936
- function scriptWriteSummaryJson(status, options = {}) {
937
- const base = {
938
- schemaVersion: 1,
939
- status,
940
- nextAction: missionRunNextActions[status],
941
- report: 'proof-logs/run-report.md',
942
- statusRows: 'proof-logs/status.jsonl',
943
- ...(typeof options.totalCommands === 'number' ? { totalCommands: options.totalCommands } : {}),
944
- ...(options.failedStep ? { failedStep: options.failedStep } : {}),
945
- ...(options.logName ? { log: `proof-logs/${options.logName}` } : {}),
946
- };
947
- if (status !== 'failed') {
948
- return `printf '%s\\n' ${shellQuote(JSON.stringify(base))} > "$PROOF_SUMMARY_FILE"`;
949
- }
950
- const prefix = JSON.stringify(base).replace(/}$/, ',"exitCode":');
951
- return `printf '%s%s%s\\n' ${shellQuote(prefix)} "$status" '}' > "$PROOF_SUMMARY_FILE"`;
952
- }
953
- function scriptAppendRunReportResult(status) {
954
- const message = status === 'passed'
955
- ? 'All current and proof commands exited 0.'
956
- : 'Mission stopped before completion.';
957
- return [
958
- '{',
959
- ` ${scriptPrint('')}`,
960
- ` ${scriptPrint('## Result')}`,
961
- ` ${scriptPrint(message)}`,
962
- '} >> "$PROOF_REPORT_FILE"',
963
- ];
964
- }
965
- function scriptAppendRunReportReviewGate(stopCondition, commands) {
966
- return [
967
- '{',
968
- ` ${scriptPrint('')}`,
969
- ` ${scriptPrint('## Review Gate')}`,
970
- ` ${scriptPrint(stopCondition)}`,
971
- ...commands.map((command) => ` ${scriptPrint(`- ${command}`)}`),
972
- '} >> "$PROOF_REPORT_FILE"',
973
- ];
974
- }
975
- function scriptPrintError(value) {
976
- return `${scriptPrint(value)} >&2`;
977
- }
978
- function commandHasShellExpansionSyntax(command) {
979
- let backslashCount = 0;
980
- for (const char of command) {
981
- if (char === '\\') {
982
- backslashCount += 1;
983
- continue;
984
- }
985
- const escaped = backslashCount % 2 === 1;
986
- if ((char === '$' || char === '`') && !escaped)
987
- return true;
988
- backslashCount = 0;
989
- }
990
- return false;
991
- }
992
- function printShortcutsOnly(report, options) {
993
- const shortcutIndex = buildShortcutIndex(report, options);
994
- console.log(chalk.bold('Mission Shortcuts'));
995
- if (shortcutIndex.currentCommand) {
996
- console.log('Current command:');
997
- console.log(shortcutIndex.currentCommand);
998
- console.log('');
999
- }
1000
- if (shortcutIndex.currentToolCall) {
1001
- console.log('Current MCP tool call:');
1002
- console.log(JSON.stringify(shortcutIndex.currentToolCall));
1003
- console.log('');
1004
- }
1005
- console.log('Copy from here:');
1006
- for (const shortcut of shortcutIndex.shortcuts)
1007
- console.log(shortcut.command);
1008
- }
1009
- function printShortcutsJsonOnly(report, options) {
1010
- console.log(JSON.stringify(buildShortcutIndex(report, options)));
1011
- }
1012
- function buildShortcutIndex(report, options) {
1013
- const command = report.missionControl.executionPlan.cursor.command;
1014
- const toolCall = nextToolCall(report);
1015
- const entries = [
1016
- shortcutEntry('next-command', 'Current shell command', '--next-command', 'Print only the current Mission Control cursor command.', options),
1017
- shortcutEntry('next-tool-call', 'Current MCP tool call', '--next-tool-call', 'Print only the current Mission Control cursor MCP tool call as compact JSON.', options),
1018
- shortcutEntry('ready-tool-calls', 'Ready MCP calls', '--ready-tool-calls', 'Print the current cursor and remaining MCP-callable proof queue as compact JSON.', options),
1019
- shortcutEntry('proof-commands', 'Ready proof commands', '--proof-commands', 'Print only ready Mission Control proof commands.', options),
1020
- shortcutEntry('checklist', 'Resume checklist', '--checklist', 'Print only the Mission Control resume checklist.', options),
1021
- shortcutEntry('resume-json', 'Resume JSON', '--resume-json', 'Print only the structured Mission Control resume object.', options),
1022
- shortcutEntry('handoff-json', 'Handoff JSON', '--handoff-json', 'Print only the structured Mission Control handoff object.', options),
1023
- shortcutEntry('mission-script', 'Mission script', '--mission-script', 'Print the Mission Control shell script.', options),
1024
- shortcutEntry('save-mission', 'Save mission bundle', '--save-mission .projscan/mission', 'Write the Mission Control bundle to .projscan/mission.', options),
1025
- shortcutEntry('task-card', 'Task card', '--task-card', 'Print only the Mission Control Markdown task card.', options),
1026
- shortcutEntry('review-gate', 'Review gate Markdown', '--review-gate', 'Print only the Mission Control stop-and-review gate.', options),
1027
- shortcutEntry('review-gate-json', 'Review gate JSON', '--review-gate-json', 'Print only the Mission Control review gate as JSON.', options),
1028
- shortcutEntry('review-policy', 'Review policy JSON', '--review-policy', 'Print only the Mission Control review policy as JSON.', options),
1029
- shortcutEntry('review-replies', 'Reviewer replies', '--review-replies', 'Print only copyable Mission Control reviewer replies.', options),
1030
- shortcutEntry('runbook', 'Mission runbook', '--runbook', 'Print only the Mission Control Markdown runbook.', options),
1031
- shortcutEntry('handoff-prompt', 'Handoff prompt', '--handoff-prompt', 'Print only the concise Mission Control handoff prompt.', options),
1032
- {
1033
- id: 'start',
1034
- label: 'Full start report',
1035
- command: startBaseCommand(options),
1036
- description: 'Print the full Mission Control start report.',
1037
- },
1038
- ];
1039
- return {
1040
- schemaVersion: 1,
1041
- kind: 'projscan.start-shortcuts',
1042
- ...(command ? { currentCommand: command } : {}),
1043
- ...(toolCall ? { currentToolCall: toolCall } : {}),
1044
- baseCommand: startBaseCommand(options),
1045
- shortcuts: entries,
1046
- };
1047
- }
1048
- function shortcutEntry(id, label, flag, description, options) {
1049
- return {
1050
- id,
1051
- label,
1052
- command: shortcutCommand(flag, options),
1053
- description,
1054
- };
1055
- }
1056
- function missionShortcutOptions(report) {
1057
- return {
1058
- ...(report.modeSource === 'explicit' ? { mode: report.mode } : {}),
1059
- ...(report.missionControl.intent ? { intent: report.missionControl.intent } : {}),
1060
- };
1061
- }
1062
- function shortcutCommand(flag, options) {
1063
- return ['projscan start', flag, ...startCommandOptionArgs(options)].join(' ');
1064
- }
1065
- function startBaseCommand(options) {
1066
- return ['projscan start', ...startCommandOptionArgs(options)].join(' ');
1067
- }
1068
- function startCommandOptionArgs(options) {
1069
- const args = [];
1070
- if (options.mode)
1071
- args.push('--mode', shellQuote(options.mode));
1072
- if (options.intent)
1073
- args.push('--intent', shellQuote(options.intent));
1074
- return args;
1075
- }
1076
- function shellQuote(value) {
1077
- return `'${value.replace(/'/g, `'\\''`)}'`;
1078
- }
1079
- function printHandoffPrompt(report) {
1080
- const prompt = report.missionControl.handoffPrompt;
1081
- if (prompt.length === 0)
1082
- return;
1083
- console.log(chalk.bold('Handoff Prompt'));
1084
- console.log(chalk.dim(prompt));
1085
- }
1086
- function printReviewGate(report) {
1087
- const gate = report.missionControl.reviewGate;
1088
- console.log(chalk.bold('Review Gate'));
1089
- console.log(gate.stopCondition);
1090
- for (const command of gate.commands)
1091
- console.log(`- ${command}`);
1092
- console.log(gate.worktree.summary);
1093
- printReviewReplies(report);
1094
- const stopLine = gate.checklist.find((item) => item.startsWith('Stop and ask'));
1095
- if (stopLine)
1096
- console.log(chalk.dim(stopLine));
1097
- }
1098
- function missionReviewReplyLines(report) {
1099
- return report.missionControl.reviewGate.decisions.map((decision) => `- ${decision.label}: ${decision.reply}`);
1100
- }
1101
- function printReviewReplies(report) {
1102
- const replies = missionReviewReplyLines(report);
1103
- if (replies.length === 0)
1104
- return;
1105
- console.log(chalk.bold('Reviewer Replies'));
1106
- for (const reply of replies)
1107
- console.log(reply);
1108
- }
1109
- function printExecutionPlan(report) {
1110
- const plan = report.missionControl.executionPlan;
1111
- console.log(chalk.bold('Execution Plan'));
1112
- console.log(chalk.dim(plan.summary));
1113
- for (const phase of plan.phases.slice(0, 6)) {
1114
- console.log(`- [${phase.status}] ${phase.title}`);
1115
- for (const step of phase.steps.slice(0, 4)) {
1116
- if (step.kind === 'input' && step.instruction) {
1117
- console.log(` - ${step.label}: ${step.instruction}`);
1118
- }
1119
- else if (step.kind === 'criterion') {
1120
- console.log(` - ${step.label}`);
1121
- }
1122
- else if (step.command && step.kind === 'proof') {
1123
- console.log(` - ${step.command}`);
1124
- }
1125
- else if (step.command) {
1126
- console.log(` - ${step.label}: ${step.command}`);
1127
- }
1128
- else {
1129
- console.log(` - ${step.label}`);
1130
- }
1131
- if (step.blockedBy && step.blockedBy.length > 0) {
1132
- console.log(` blocked by: ${step.blockedBy.join(', ')}`);
1133
- }
1134
- }
1135
- }
1136
- printExecutionCursor(report);
1137
- }
1138
- function printExecutionCursor(report) {
1139
- const plan = report.missionControl.executionPlan;
1140
- const cursor = plan.cursor;
1141
- const phaseTitle = plan.phases.find((phase) => phase.id === cursor.phaseId)?.title ?? cursor.phaseId;
1142
- console.log(chalk.bold('Run Cursor'));
1143
- console.log(`next: ${cursor.stepId} in ${phaseTitle}`);
1144
- if (cursor.command) {
1145
- console.log(`command: ${cursor.command}`);
1146
- }
1147
- else if (cursor.instruction) {
1148
- console.log(`input: ${cursor.instruction}`);
1149
- }
1150
- else {
1151
- console.log(`step: ${cursor.label}`);
1152
- }
1153
- if (cursor.tool) {
1154
- console.log(`MCP call: ${formatConsoleToolCall({ tool: cursor.tool, ...(typeof cursor.args !== 'undefined' ? { args: cursor.args } : {}) })}`);
1155
- }
1156
- if (cursor.blockedBy && cursor.blockedBy.length > 0) {
1157
- console.log(`blocked by: ${cursor.blockedBy.join(', ')}`);
1158
- }
1159
- if (cursor.unlocks && cursor.unlocks.length > 0) {
1160
- console.log(`unlocks: ${cursor.unlocks.join(', ')}`);
1161
- }
1162
- console.log(chalk.dim(cursor.reason));
1163
- }
1164
- function printResumeChecklist(report) {
1165
- const checklist = report.missionControl.resume.checklist ?? [];
1166
- if (checklist.length === 0)
1167
- return;
1168
- console.log(chalk.bold('Resume Checklist'));
1169
- for (const item of checklist) {
1170
- console.log(chalk.dim(`- ${formatConsoleChecklistItem(item)}`));
1171
- }
1172
- }
1173
- function formatConsoleChecklistItem(item) {
1174
- const action = item.command
1175
- ?? (item.placeholder && item.instruction ? `${item.placeholder} -> ${item.instruction}` : undefined)
1176
- ?? item.instruction
1177
- ?? item.label;
1178
- return `[${item.status}] ${item.kind} ${item.stepId}: ${action}${formatConsoleChecklistAnnotation(item)}`;
1179
- }
1180
- function formatConsoleChecklistAnnotation(item) {
1181
- if (item.tool) {
1182
- return ` (MCP: ${formatConsoleToolCall({ tool: item.tool, ...(typeof item.args !== 'undefined' ? { args: item.args } : {}) })})`;
1183
- }
1184
- if (item.kind === 'run_proof' && item.command)
1185
- return ' (CLI only)';
1186
- return '';
1187
- }
1188
- function formatConsoleProofItem(item) {
1189
- const proofAction = item.toolCall ? `MCP: ${formatConsoleToolCall(item.toolCall)}` : 'CLI only';
1190
- return `${item.stepId}: ${item.command} (${proofAction})`;
1191
- }
1192
- function formatConsoleToolCall(toolCall) {
1193
- return typeof toolCall.args !== 'undefined'
1194
- ? `${toolCall.tool} ${JSON.stringify(toolCall.args)}`
1195
- : toolCall.tool;
1196
- }
1197
- function routeEvidence(route) {
1198
- if (!route)
1199
- return 'confidence: low; matched: none';
1200
- return `confidence: ${route.confidence}; matched: ${route.matchedKeywords.join(', ') || 'none'}`;
1201
- }
1202
- function printRisk(risk) {
1203
- const files = risk.files.length > 0 ? ` (${risk.files.join(', ')})` : '';
1204
- console.log(`- [${risk.priority}] ${risk.title}${files}`);
1205
- console.log(` ${risk.command}`);
31
+ .action(runStartCommandAction);
1206
32
  }
1207
33
  //# sourceMappingURL=start.js.map