vgxness 1.20.4 → 1.20.6

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 (375) hide show
  1. package/dist/adapters/claude/agent-renderer.js +82 -0
  2. package/dist/{mcp → adapters/claude/install}/claude-code-agent-config.js +64 -9
  3. package/dist/{mcp → adapters/claude/install}/claude-code-config.js +28 -6
  4. package/dist/{mcp → adapters/claude/install}/claude-code-project-memory.js +35 -5
  5. package/dist/{mcp → adapters/claude/install}/claude-code-scope.js +12 -3
  6. package/dist/{mcp → adapters/claude/install}/claude-code-user-config.js +26 -5
  7. package/dist/{mcp → adapters/claude/install}/claude-code-user-memory.js +47 -7
  8. package/dist/{mcp → adapters/claude/install}/client-install-claude-code-contract.js +45 -8
  9. package/dist/{mcp → adapters/claude/install}/client-install-claude-code.js +98 -14
  10. package/dist/adapters/json/agent-renderer.js +104 -0
  11. package/dist/adapters/opencode/agent-renderer.js +113 -0
  12. package/dist/{mcp → adapters/opencode/install}/client-install-opencode-contract.js +2 -2
  13. package/dist/{mcp → adapters/opencode/install}/client-install-opencode.js +1 -1
  14. package/dist/{mcp → adapters/opencode/install}/opencode-default-agent-config.js +2 -2
  15. package/dist/{mcp → adapters/opencode/install}/opencode-handoff-preview.js +60 -7
  16. package/dist/{mcp → adapters/opencode/install}/opencode-visibility.js +1 -1
  17. package/dist/adapters/provider-renderer.js +6 -0
  18. package/dist/agents/agent-activation-service.js +1 -263
  19. package/dist/agents/agent-lookup-contexts.js +1 -28
  20. package/dist/agents/agent-registry-service.js +1 -81
  21. package/dist/agents/agent-resolver.js +1 -287
  22. package/dist/agents/agent-seed-service.js +1 -157
  23. package/dist/agents/agent-seed-upgrade-service.js +1 -231
  24. package/dist/agents/agent-selector-resolver.js +1 -28
  25. package/dist/agents/boot-upgrade.js +1 -59
  26. package/dist/agents/canonical-agent-manifest.js +1 -245
  27. package/dist/agents/canonical-agent-projection.js +1 -236
  28. package/dist/agents/manager-profile-overlay-service.js +1 -60
  29. package/dist/agents/profile-model-routing.js +1 -30
  30. package/dist/agents/renderers/claude-renderer.js +1 -82
  31. package/dist/agents/renderers/index.js +1 -14
  32. package/dist/agents/renderers/json-renderer.js +1 -104
  33. package/dist/agents/renderers/opencode-renderer.js +1 -113
  34. package/dist/agents/renderers/provider-adapter.js +1 -6
  35. package/dist/agents/repositories/agent-seed-history.js +1 -128
  36. package/dist/agents/repositories/agents.js +1 -200
  37. package/dist/agents/repositories/manager-profile-overlays.js +1 -90
  38. package/dist/agents/schema.js +1 -1
  39. package/dist/application/agents/agent-activation-service.js +261 -0
  40. package/dist/application/agents/agent-lookup-contexts.js +28 -0
  41. package/dist/application/agents/agent-registry-service.js +81 -0
  42. package/dist/application/agents/agent-resolver.js +287 -0
  43. package/dist/application/agents/agent-seed-service.js +157 -0
  44. package/dist/application/agents/agent-seed-upgrade-service.js +231 -0
  45. package/dist/application/agents/agent-selector-resolver.js +28 -0
  46. package/dist/application/agents/boot-upgrade.js +59 -0
  47. package/dist/application/agents/canonical-agent-projection.js +236 -0
  48. package/dist/application/agents/manager-profile-overlay-service.js +68 -0
  49. package/dist/application/agents/profile-model-routing.js +30 -0
  50. package/dist/application/agents/renderers/claude-renderer.js +1 -0
  51. package/dist/application/agents/renderers/index.js +14 -0
  52. package/dist/application/agents/renderers/json-renderer.js +1 -0
  53. package/dist/application/agents/renderers/opencode-renderer.js +1 -0
  54. package/dist/application/agents/renderers/provider-adapter.js +1 -0
  55. package/dist/application/memory/active-work-preview.js +75 -0
  56. package/dist/application/memory/agent-memory-capture-service.js +498 -0
  57. package/dist/application/memory/import/dry-run-planner.js +58 -0
  58. package/dist/application/memory/import/index.js +3 -0
  59. package/dist/application/memory/import/observation-writer.js +226 -0
  60. package/dist/application/memory/import/package.js +179 -0
  61. package/dist/application/memory/memory-service.js +202 -0
  62. package/dist/application/memory/search.js +11 -0
  63. package/dist/{mcp → application/provider-setup}/provider-change-plan.js +74 -13
  64. package/dist/{mcp → application/provider-setup}/provider-doctor.js +201 -31
  65. package/dist/{mcp → application/provider-setup}/provider-health-types.js +1 -1
  66. package/dist/{mcp → application/provider-setup}/provider-status.js +170 -33
  67. package/dist/application/runs/execution-planning.js +180 -0
  68. package/dist/application/runs/operation-execution.js +1 -0
  69. package/dist/application/runs/operation-retry.js +129 -0
  70. package/dist/application/runs/resume-after-approval-result.js +88 -0
  71. package/dist/application/runs/run-insights.js +270 -0
  72. package/dist/application/runs/run-service.js +1480 -0
  73. package/dist/application/runs/run-snapshot-export-service.js +31 -0
  74. package/dist/application/runs/sandbox-process-execution.js +244 -0
  75. package/dist/application/runs/sandbox-worktree-planning.js +59 -0
  76. package/dist/application/runs/task-scoped-command-grant-service.js +224 -0
  77. package/dist/application/sdd/artifact-portability-service.js +137 -0
  78. package/dist/application/sdd/cockpit-read-model.js +195 -0
  79. package/dist/application/sdd/sdd-continuation-plan.js +265 -0
  80. package/dist/application/sdd/sdd-workflow-service.js +892 -0
  81. package/dist/application/skills/boot-seed.js +42 -0
  82. package/dist/application/skills/personal-skills.js +41 -0
  83. package/dist/application/skills/skill-export-service.js +34 -0
  84. package/dist/application/skills/skill-index-service.js +126 -0
  85. package/dist/application/skills/skill-payload.js +186 -0
  86. package/dist/application/skills/skill-registry-service.js +648 -0
  87. package/dist/application/skills/skill-resolver.js +368 -0
  88. package/dist/application/skills/skill-seed-service.js +242 -0
  89. package/dist/application/skills/skill-status-service.js +147 -0
  90. package/dist/cli/bun-bin.js +0 -0
  91. package/dist/cli/cli-flags.js +1 -387
  92. package/dist/cli/cli-help.js +1 -173
  93. package/dist/cli/cli-helpers.js +1 -77
  94. package/dist/cli/cli-types.js +1 -1
  95. package/dist/cli/commands/agent-skill-dispatcher.js +1 -700
  96. package/dist/cli/commands/index.js +1 -9
  97. package/dist/cli/commands/interactive-entrypoint-dispatcher.js +1 -14
  98. package/dist/cli/commands/mcp-dispatcher.js +1 -232
  99. package/dist/cli/commands/memory-sdd-dispatcher.js +1 -367
  100. package/dist/cli/commands/run-permission-dispatcher.js +1 -455
  101. package/dist/cli/commands/setup-dispatcher.js +1 -496
  102. package/dist/cli/commands/status-dispatcher.js +1 -130
  103. package/dist/cli/commands/verification-dispatcher.js +1 -47
  104. package/dist/cli/commands/workflow-dispatcher.js +1 -566
  105. package/dist/cli/dispatcher.js +1 -247
  106. package/dist/cli/doctor-renderer.js +1 -26
  107. package/dist/cli/home-tui-app.js +1 -411
  108. package/dist/cli/home-tui-controller.js +1 -314
  109. package/dist/cli/mcp-start-path.js +1 -21
  110. package/dist/cli/product-resume-renderer.js +1 -32
  111. package/dist/cli/product-status-renderer.js +1 -81
  112. package/dist/cli/sdd-renderer.js +1 -247
  113. package/dist/cli/setup-plan-renderer.js +1 -79
  114. package/dist/cli/setup-status-renderer.js +1 -50
  115. package/dist/cli/setup-tui-app.js +1 -130
  116. package/dist/cli/setup-tui-controller.js +1 -89
  117. package/dist/cli/tui/focus-reducer.js +1 -0
  118. package/dist/cli/tui/focus-types.js +1 -0
  119. package/dist/cli/tui/ink/app-shell.js +1 -0
  120. package/dist/cli/tui/ink/components.js +1 -38
  121. package/dist/cli/tui/ink/help-overlay.js +1 -0
  122. package/dist/cli/tui/ink/state-components.js +1 -0
  123. package/dist/cli/tui/ink/theme.js +1 -36
  124. package/dist/cli/tui/key-intents.js +1 -0
  125. package/dist/cli/tui/keymap.js +1 -20
  126. package/dist/cli/tui/navigation.js +1 -10
  127. package/dist/cli/tui/screen-registry.js +1 -0
  128. package/dist/cli/tui/terminal-capabilities.js +1 -12
  129. package/dist/cli/tui/tui-types.js +1 -1
  130. package/dist/cli/tui/visual/badges.js +1 -19
  131. package/dist/cli/tui/visual/footer.js +1 -27
  132. package/dist/cli/tui/visual/index.js +1 -3
  133. package/dist/cli/tui/visual/viewport.js +1 -11
  134. package/dist/cli/tui-render-helpers.js +1 -200
  135. package/dist/cli/verification-plan-renderer.js +1 -25
  136. package/dist/cli/verification-report-renderer.js +1 -19
  137. package/dist/domain/agents/canonical-agent-manifest.js +355 -0
  138. package/dist/domain/agents/schema.js +1 -0
  139. package/dist/domain/memory/active-work-topics.js +64 -0
  140. package/dist/domain/memory/memory-capture-schema.js +1 -0
  141. package/dist/domain/memory/schema.js +1 -0
  142. package/dist/domain/runs/schema.js +5 -0
  143. package/dist/domain/sdd/cockpit-types.js +1 -0
  144. package/dist/domain/sdd/schema.js +111 -0
  145. package/dist/domain/skills/schema.js +1 -0
  146. package/dist/governance/risk-classifier.js +2 -0
  147. package/dist/interfaces/cli/bun-bin.js +46 -0
  148. package/dist/interfaces/cli/cli-flags.js +391 -0
  149. package/dist/interfaces/cli/cli-help.js +173 -0
  150. package/dist/interfaces/cli/cli-helpers.js +77 -0
  151. package/dist/interfaces/cli/cli-types.js +1 -0
  152. package/dist/interfaces/cli/commands/agent-skill-dispatcher.js +700 -0
  153. package/dist/interfaces/cli/commands/index.js +9 -0
  154. package/dist/interfaces/cli/commands/interactive-entrypoint-dispatcher.js +14 -0
  155. package/dist/interfaces/cli/commands/mcp-dispatcher.js +252 -0
  156. package/dist/interfaces/cli/commands/memory-sdd-dispatcher.js +367 -0
  157. package/dist/interfaces/cli/commands/run-permission-dispatcher.js +460 -0
  158. package/dist/interfaces/cli/commands/setup-dispatcher.js +496 -0
  159. package/dist/interfaces/cli/commands/status-dispatcher.js +130 -0
  160. package/dist/interfaces/cli/commands/verification-dispatcher.js +47 -0
  161. package/dist/interfaces/cli/commands/workflow-dispatcher.js +566 -0
  162. package/dist/interfaces/cli/dispatcher.js +247 -0
  163. package/dist/interfaces/cli/doctor-renderer.js +26 -0
  164. package/dist/interfaces/cli/home-tui-app.js +462 -0
  165. package/dist/interfaces/cli/home-tui-controller.js +341 -0
  166. package/dist/interfaces/cli/index.js +27 -0
  167. package/dist/interfaces/cli/mcp-start-path.js +21 -0
  168. package/dist/interfaces/cli/product-resume-renderer.js +32 -0
  169. package/dist/interfaces/cli/product-status-renderer.js +81 -0
  170. package/dist/interfaces/cli/sdd-renderer.js +247 -0
  171. package/dist/interfaces/cli/setup-plan-renderer.js +79 -0
  172. package/dist/interfaces/cli/setup-status-renderer.js +50 -0
  173. package/dist/interfaces/cli/setup-tui-app.js +135 -0
  174. package/dist/interfaces/cli/setup-tui-controller.js +89 -0
  175. package/dist/interfaces/cli/tui/focus-reducer.js +60 -0
  176. package/dist/interfaces/cli/tui/focus-types.js +10 -0
  177. package/dist/interfaces/cli/tui/ink/app-shell.js +16 -0
  178. package/dist/interfaces/cli/tui/ink/components.js +38 -0
  179. package/dist/interfaces/cli/tui/ink/help-overlay.js +6 -0
  180. package/dist/interfaces/cli/tui/ink/state-components.js +22 -0
  181. package/dist/interfaces/cli/tui/ink/theme.js +36 -0
  182. package/dist/interfaces/cli/tui/key-intents.js +33 -0
  183. package/dist/interfaces/cli/tui/keymap.js +20 -0
  184. package/dist/interfaces/cli/tui/navigation.js +10 -0
  185. package/dist/interfaces/cli/tui/screen-registry.js +43 -0
  186. package/dist/interfaces/cli/tui/terminal-capabilities.js +12 -0
  187. package/dist/interfaces/cli/tui/tui-types.js +1 -0
  188. package/dist/interfaces/cli/tui/visual/badges.js +19 -0
  189. package/dist/interfaces/cli/tui/visual/footer.js +27 -0
  190. package/dist/interfaces/cli/tui/visual/index.js +3 -0
  191. package/dist/interfaces/cli/tui/visual/viewport.js +11 -0
  192. package/dist/interfaces/cli/tui-render-helpers.js +200 -0
  193. package/dist/interfaces/cli/verification-plan-renderer.js +25 -0
  194. package/dist/interfaces/cli/verification-report-renderer.js +19 -0
  195. package/dist/interfaces/mcp/contracts/agents.js +1 -0
  196. package/dist/interfaces/mcp/contracts/context.js +1 -0
  197. package/dist/interfaces/mcp/contracts/governance.js +1 -0
  198. package/dist/interfaces/mcp/contracts/index.js +1 -0
  199. package/dist/interfaces/mcp/contracts/memory.js +1 -0
  200. package/dist/interfaces/mcp/contracts/providers.js +1 -0
  201. package/dist/interfaces/mcp/contracts/runs.js +1 -0
  202. package/dist/interfaces/mcp/contracts/sdd.js +1 -0
  203. package/dist/interfaces/mcp/contracts/sessions.js +1 -0
  204. package/dist/interfaces/mcp/contracts/skills.js +1 -0
  205. package/dist/interfaces/mcp/contracts/verification.js +1 -0
  206. package/dist/interfaces/mcp/control-plane/handlers/agents.js +38 -0
  207. package/dist/interfaces/mcp/control-plane/handlers/context.js +12 -0
  208. package/dist/interfaces/mcp/control-plane/handlers/memory.js +95 -0
  209. package/dist/interfaces/mcp/control-plane/handlers/providers.js +19 -0
  210. package/dist/interfaces/mcp/control-plane/handlers/runs.js +134 -0
  211. package/dist/interfaces/mcp/control-plane/handlers/sdd.js +225 -0
  212. package/dist/interfaces/mcp/control-plane/handlers/sessions.js +39 -0
  213. package/dist/interfaces/mcp/control-plane/handlers/skills.js +82 -0
  214. package/dist/interfaces/mcp/control-plane/handlers/verification.js +11 -0
  215. package/dist/interfaces/mcp/control-plane/types.js +1 -0
  216. package/dist/interfaces/mcp/control-plane.js +235 -0
  217. package/dist/interfaces/mcp/schema.js +174 -0
  218. package/dist/interfaces/mcp/schemas/common.js +121 -0
  219. package/dist/interfaces/mcp/schemas/inputs/agents.js +69 -0
  220. package/dist/interfaces/mcp/schemas/inputs/context.js +32 -0
  221. package/dist/interfaces/mcp/schemas/inputs/governance.js +23 -0
  222. package/dist/interfaces/mcp/schemas/inputs/index.js +10 -0
  223. package/dist/interfaces/mcp/schemas/inputs/memory.js +50 -0
  224. package/dist/interfaces/mcp/schemas/inputs/providers.js +35 -0
  225. package/dist/interfaces/mcp/schemas/inputs/runs.js +146 -0
  226. package/dist/interfaces/mcp/schemas/inputs/sdd.js +102 -0
  227. package/dist/interfaces/mcp/schemas/inputs/sessions.js +32 -0
  228. package/dist/interfaces/mcp/schemas/inputs/skills.js +231 -0
  229. package/dist/interfaces/mcp/schemas/inputs/verification.js +9 -0
  230. package/dist/interfaces/mcp/schemas/outputs/index.js +2 -0
  231. package/dist/interfaces/mcp/schemas/outputs/providers.js +28 -0
  232. package/dist/interfaces/mcp/schemas/outputs/sdd.js +166 -0
  233. package/dist/interfaces/mcp/stdio-server.js +116 -0
  234. package/dist/interfaces/mcp/validation/agents.js +189 -0
  235. package/dist/interfaces/mcp/validation/common.js +415 -0
  236. package/dist/interfaces/mcp/validation/governance.js +50 -0
  237. package/dist/interfaces/mcp/validation/memory.js +133 -0
  238. package/dist/interfaces/mcp/validation/providers.js +94 -0
  239. package/dist/interfaces/mcp/validation/runs.js +514 -0
  240. package/dist/interfaces/mcp/validation/sdd.js +247 -0
  241. package/dist/interfaces/mcp/validation/sessions.js +51 -0
  242. package/dist/interfaces/mcp/validation/skills.js +685 -0
  243. package/dist/interfaces/mcp/validation/verification.js +24 -0
  244. package/dist/interfaces/mcp/validation.js +149 -0
  245. package/dist/mcp/control-plane-snapshot-service.js +65 -2
  246. package/dist/mcp/control-plane.js +1 -646
  247. package/dist/mcp/doctor.js +1 -1
  248. package/dist/mcp/index.js +17 -17
  249. package/dist/mcp/schema.js +1 -1072
  250. package/dist/mcp/stdio-server.js +1 -116
  251. package/dist/mcp/validation.js +1 -2239
  252. package/dist/memory/active-work-preview.js +1 -75
  253. package/dist/memory/active-work-topics.js +1 -64
  254. package/dist/memory/agent-memory-capture-service.js +1 -497
  255. package/dist/memory/import/dry-run-planner.js +1 -58
  256. package/dist/memory/import/index.js +1 -3
  257. package/dist/memory/import/observation-writer.js +1 -226
  258. package/dist/memory/import/package.js +1 -179
  259. package/dist/memory/memory-capture-schema.js +1 -1
  260. package/dist/memory/memory-service.js +1 -201
  261. package/dist/memory/repositories/artifacts.js +1 -67
  262. package/dist/memory/repositories/observations.js +1 -217
  263. package/dist/memory/repositories/sessions.js +1 -125
  264. package/dist/memory/repositories/traces.js +1 -78
  265. package/dist/memory/schema.js +1 -1
  266. package/dist/memory/search.js +1 -11
  267. package/dist/memory/sqlite/database.js +1 -228
  268. package/dist/memory/storage-paths.js +1 -72
  269. package/dist/payload/context-budget-policy.js +10 -0
  270. package/dist/payload/context-budget-service.js +26 -0
  271. package/dist/payload/payload-diagnostics.js +50 -0
  272. package/dist/permissions/explicit-request-authorization.js +126 -0
  273. package/dist/permissions/policy-evaluator.js +54 -14
  274. package/dist/runs/execution-planning.js +1 -178
  275. package/dist/runs/operation-execution.js +1 -1
  276. package/dist/runs/operation-retry.js +1 -129
  277. package/dist/runs/repositories/runs.js +1 -676
  278. package/dist/runs/repositories/task-scoped-command-grants.js +1 -462
  279. package/dist/runs/resume-after-approval-result.js +1 -84
  280. package/dist/runs/run-insights.js +1 -270
  281. package/dist/runs/run-service.js +1 -1439
  282. package/dist/runs/run-snapshot-export-service.js +1 -31
  283. package/dist/runs/sandbox-process-execution.js +1 -240
  284. package/dist/runs/sandbox-worktree-planning.js +1 -59
  285. package/dist/runs/schema.js +1 -5
  286. package/dist/runs/task-scoped-command-grant-service.js +1 -216
  287. package/dist/sdd/artifact-portability-service.js +1 -137
  288. package/dist/sdd/cockpit-read-model.js +1 -195
  289. package/dist/sdd/cockpit-types.js +1 -1
  290. package/dist/sdd/schema.js +1 -111
  291. package/dist/sdd/sdd-continuation-plan.js +1 -265
  292. package/dist/sdd/sdd-workflow-service.js +1 -822
  293. package/dist/setup/providers/claude-setup-adapter.js +11 -4
  294. package/dist/setup/providers/opencode-setup-adapter.js +10 -7
  295. package/dist/setup/setup-plan.js +20 -7
  296. package/dist/skills/boot-seed.js +1 -42
  297. package/dist/skills/personal-skills.js +1 -41
  298. package/dist/skills/repositories/skill-evaluation-requests.js +1 -190
  299. package/dist/skills/repositories/skill-evaluation-scenarios.js +1 -305
  300. package/dist/skills/repositories/skill-improvement-proposals.js +1 -355
  301. package/dist/skills/repositories/skills.js +1 -1077
  302. package/dist/skills/schema.js +1 -1
  303. package/dist/skills/skill-export-service.js +1 -34
  304. package/dist/skills/skill-index-service.js +1 -126
  305. package/dist/skills/skill-payload.js +1 -186
  306. package/dist/skills/skill-registry-service.js +1 -644
  307. package/dist/skills/skill-resolver.js +1 -368
  308. package/dist/skills/skill-seed-service.js +1 -242
  309. package/dist/skills/skill-status-service.js +1 -147
  310. package/dist/storage/agents/repositories/agent-seed-history.js +128 -0
  311. package/dist/storage/agents/repositories/agents.js +200 -0
  312. package/dist/storage/agents/repositories/manager-profile-overlays.js +90 -0
  313. package/dist/storage/memory/repositories/artifacts.js +67 -0
  314. package/dist/storage/memory/repositories/observations.js +217 -0
  315. package/dist/storage/memory/repositories/sessions.js +125 -0
  316. package/dist/storage/memory/repositories/traces.js +78 -0
  317. package/dist/storage/memory/sqlite/database.js +228 -0
  318. package/dist/storage/memory/storage-paths.js +72 -0
  319. package/dist/storage/runs/repositories/runs.js +676 -0
  320. package/dist/storage/runs/repositories/task-scoped-command-grants.js +464 -0
  321. package/dist/storage/skills/repositories/skill-evaluation-requests.js +190 -0
  322. package/dist/storage/skills/repositories/skill-evaluation-scenarios.js +305 -0
  323. package/dist/storage/skills/repositories/skill-improvement-proposals.js +355 -0
  324. package/dist/storage/skills/repositories/skills.js +1084 -0
  325. package/docs/architecture.md +2 -2
  326. package/docs/glossary.md +1 -1
  327. package/docs/mcp.md +1 -1
  328. package/docs/module-boundaries.md +114 -0
  329. package/docs/prd.md +1 -1
  330. package/docs/project-health-audit-v1.10.x.md +1 -1
  331. package/docs/providers.md +2 -2
  332. package/docs/safety.md +3 -3
  333. package/docs/sdd/archive/2026-06-26-ambitious-structure-reorganization/apply-progress.md +122 -0
  334. package/docs/sdd/archive/2026-06-26-ambitious-structure-reorganization/archive-report.md +61 -0
  335. package/docs/sdd/archive/2026-06-26-ambitious-structure-reorganization/design.md +66 -0
  336. package/docs/sdd/archive/2026-06-26-ambitious-structure-reorganization/proposal.md +79 -0
  337. package/docs/sdd/archive/2026-06-26-ambitious-structure-reorganization/spec.md +67 -0
  338. package/docs/sdd/archive/2026-06-26-ambitious-structure-reorganization/tasks.md +63 -0
  339. package/docs/sdd/archive/2026-06-26-ambitious-structure-reorganization/verify-report.md +71 -0
  340. package/docs/sdd/archive/2026-06-26-legacy-facade-cleanup/apply-progress.md +68 -0
  341. package/docs/sdd/archive/2026-06-26-legacy-facade-cleanup/archive-report.md +61 -0
  342. package/docs/sdd/archive/2026-06-26-legacy-facade-cleanup/design.md +43 -0
  343. package/docs/sdd/archive/2026-06-26-legacy-facade-cleanup/proposal.md +61 -0
  344. package/docs/sdd/archive/2026-06-26-legacy-facade-cleanup/spec.md +31 -0
  345. package/docs/sdd/archive/2026-06-26-legacy-facade-cleanup/tasks.md +27 -0
  346. package/docs/sdd/archive/2026-06-26-legacy-facade-cleanup/verify-report.md +58 -0
  347. package/docs/sdd/archive/2026-06-26-provider-install-adapter-boundary/apply-progress.md +65 -0
  348. package/docs/sdd/archive/2026-06-26-provider-install-adapter-boundary/archive-report.md +53 -0
  349. package/docs/sdd/archive/2026-06-26-provider-install-adapter-boundary/design.md +64 -0
  350. package/docs/sdd/archive/2026-06-26-provider-install-adapter-boundary/proposal.md +62 -0
  351. package/docs/sdd/archive/2026-06-26-provider-install-adapter-boundary/spec.md +51 -0
  352. package/docs/sdd/archive/2026-06-26-provider-install-adapter-boundary/tasks.md +50 -0
  353. package/docs/sdd/archive/2026-06-26-provider-install-adapter-boundary/verify-report.md +66 -0
  354. package/docs/storage.md +2 -2
  355. package/package.json +2 -2
  356. /package/dist/{mcp → adapters/claude/install}/claude-code-cli.js +0 -0
  357. /package/dist/{memory → storage/memory}/sqlite/migrations/001_initial.sql +0 -0
  358. /package/dist/{memory → storage/memory}/sqlite/migrations/002_observation_revisions.sql +0 -0
  359. /package/dist/{memory → storage/memory}/sqlite/migrations/003_agent_registry.sql +0 -0
  360. /package/dist/{memory → storage/memory}/sqlite/migrations/004_run_runtime.sql +0 -0
  361. /package/dist/{memory → storage/memory}/sqlite/migrations/005_run_approvals.sql +0 -0
  362. /package/dist/{memory → storage/memory}/sqlite/migrations/006_run_operation_attempts.sql +0 -0
  363. /package/dist/{memory → storage/memory}/sqlite/migrations/007_abandoned_operation_attempts.sql +0 -0
  364. /package/dist/{memory → storage/memory}/sqlite/migrations/008_run_execution_plan_events.sql +0 -0
  365. /package/dist/{memory → storage/memory}/sqlite/migrations/009_multiple_operation_attempts.sql +0 -0
  366. /package/dist/{memory → storage/memory}/sqlite/migrations/010_skill_registry.sql +0 -0
  367. /package/dist/{memory → storage/memory}/sqlite/migrations/011_skill_usage_resolution_outcomes.sql +0 -0
  368. /package/dist/{memory → storage/memory}/sqlite/migrations/012_skill_improvement_proposals.sql +0 -0
  369. /package/dist/{memory → storage/memory}/sqlite/migrations/013_skill_evaluation_scenarios.sql +0 -0
  370. /package/dist/{memory → storage/memory}/sqlite/migrations/014_manager_profile_overlays.sql +0 -0
  371. /package/dist/{memory → storage/memory}/sqlite/migrations/015_artifact_metadata.sql +0 -0
  372. /package/dist/{memory → storage/memory}/sqlite/migrations/016_agent_seed_history.sql +0 -0
  373. /package/dist/{memory → storage/memory}/sqlite/migrations/017_intent_signal_skill_targets.sql +0 -0
  374. /package/dist/{memory → storage/memory}/sqlite/migrations/018_skill_system_v2.sql +0 -0
  375. /package/dist/{memory → storage/memory}/sqlite/migrations/019_task_scoped_command_grants.sql +0 -0
@@ -0,0 +1,496 @@
1
+ import { resolve } from 'node:path';
2
+ import { installOpenCodeMcpClient } from '../../../adapters/opencode/install/client-install-opencode.js';
3
+ import { createOpenCodeMcpVisibilityReport } from '../../../adapters/opencode/install/opencode-visibility.js';
4
+ import { AgentRegistryService } from '../../../agents/agent-registry-service.js';
5
+ import { computeEffectiveManagerInstructions } from '../../../agents/manager-profile-overlay-service.js';
6
+ import { resolveAgentProfileModel } from '../../../agents/profile-model-routing.js';
7
+ import { createMcpClientSetupPreview } from '../../../mcp/client-setup-preview.js';
8
+ import { applyRollbackConfigBackup, listProviderConfigBackups, previewRollbackConfigBackup, } from '../../../setup/backup-rollback-service.js';
9
+ import { vgxnessSetupDefaults } from '../../../setup/setup-defaults.js';
10
+ import { SetupLifecycleService } from '../../../setup/setup-lifecycle-service.js';
11
+ import { createSetupPlan } from '../../../setup/setup-plan.js';
12
+ import { databasePathFor, opencodeInstallScopeFlag, optionalStringFlag, providerUserGlobalOnlyMigrationMessage, scopeFlag, setupDatabaseFlags, setupInstallModeFlag, setupProviderFlag, } from '../cli-flags.js';
13
+ import { okText, usageFailure, validationFailure } from '../cli-help.js';
14
+ import { jsonResult, openCliDatabase, resultFailure } from '../cli-helpers.js';
15
+ import { runHomeTuiController } from '../home-tui-controller.js';
16
+ import { renderSetupPlan } from '../setup-plan-renderer.js';
17
+ import { renderSetupStatus } from '../setup-status-renderer.js';
18
+ import { runSetupTuiController } from '../setup-tui-controller.js';
19
+ import { canRunInteractiveTui } from '../tui/terminal-capabilities.js';
20
+ function renderSetupRollbackApply(result, parsed) {
21
+ if (parsed.flags.json === true)
22
+ return jsonResult(result);
23
+ if (!result.ok)
24
+ return resultFailure(result);
25
+ const lines = [
26
+ 'Rollback restored OpenCode config.',
27
+ `Target: ${result.value.targetPath}`,
28
+ `Restored from: ${result.value.backupPath}`,
29
+ ...(result.value.preRollbackBackupPath === undefined ? [] : [`Pre-rollback backup: ${result.value.preRollbackBackupPath}`]),
30
+ 'Next: vgxness doctor; restart OpenCode and verify the vgxness MCP server is visible.',
31
+ ];
32
+ return okText(`${lines.join('\n')}\n`);
33
+ }
34
+ export function runSetupLifecycleCommand(parsed, environment) {
35
+ const [area, command] = parsed.positionals;
36
+ if (area === 'setup' && command === 'plan')
37
+ return runSetupPlanCommand(parsed, environment);
38
+ if (area === 'setup' && command === 'apply')
39
+ return usageFailure('setup apply is available through the async CLI entrypoint; run vgxness setup apply --yes from the installed CLI.');
40
+ if (area === 'setup' && command === 'reinstall')
41
+ return runSetupReinstallCommand(parsed, environment);
42
+ if (area === 'setup' && command === 'backup')
43
+ return runSetupBackupCommand(parsed, environment);
44
+ if (area === 'setup' && command === 'rollback')
45
+ return runSetupRollbackCommand(parsed, environment);
46
+ if (area === 'setup' && command !== 'status')
47
+ return usageFailure(command === undefined ? 'Missing command for setup' : `Unknown setup command: ${command}`);
48
+ const scope = scopeFlag(parsed.flags, 'scope', 'project');
49
+ if (!scope.ok)
50
+ return resultFailure(scope);
51
+ const project = optionalStringFlag(parsed.flags, 'project') ?? 'vgxness';
52
+ const selectedDatabasePath = databasePathFor(parsed.flags, environment);
53
+ if (!selectedDatabasePath.ok)
54
+ return resultFailure(selectedDatabasePath);
55
+ const databasePath = selectedDatabasePath.value;
56
+ const opened = openCliDatabase(databasePath);
57
+ const service = createSetupLifecycleService({ opened, databasePath, environment });
58
+ try {
59
+ const status = service.getStatus({ project, projectRoot: environment.cwd, scope: scope.value, env: environment.env });
60
+ if (!status.ok || parsed.flags.json === true)
61
+ return jsonResult(status);
62
+ return okText(`${renderSetupStatus(status.value)}\n`);
63
+ }
64
+ finally {
65
+ if (opened.ok)
66
+ opened.value.close();
67
+ }
68
+ }
69
+ export function runSetupPlanCommand(parsed, environment) {
70
+ const input = setupPlanInputFromFlags(parsed, environment);
71
+ if (!input.ok)
72
+ return resultFailure(input);
73
+ const plan = createSetupPlan(input.value);
74
+ if (!plan.ok || parsed.flags.json === true)
75
+ return jsonResult(plan);
76
+ return okText(`${renderSetupPlan(plan.value)}\n`);
77
+ }
78
+ export function runSetupReinstallCommand(parsed, environment) {
79
+ const reinstallParsed = withReinstallFlags(parsed);
80
+ const input = setupPlanInputFromFlags(reinstallParsed, environment);
81
+ if (!input.ok)
82
+ return resultFailure(input);
83
+ const plan = createSetupPlan(input.value);
84
+ if (!plan.ok || parsed.flags.json === true)
85
+ return jsonResult(plan);
86
+ return okText(`${renderSetupReinstallPreview(plan.value)}\n`);
87
+ }
88
+ export function runSetupRollbackCommand(parsed, environment) {
89
+ const backupPath = optionalStringFlag(parsed.flags, 'backup');
90
+ if (backupPath === undefined)
91
+ return usageFailure('setup rollback requires --backup <path>');
92
+ const resolvedBackupPath = resolve(environment.cwd, backupPath);
93
+ if (parsed.flags.yes === true)
94
+ return renderSetupRollbackApply(applyRollbackConfigBackup({ backupPath: resolvedBackupPath, confirmed: true }), parsed);
95
+ const result = previewRollbackConfigBackup({ backupPath: resolvedBackupPath });
96
+ if (parsed.flags.json === true)
97
+ return jsonResult(result);
98
+ if (!result.ok)
99
+ return resultFailure(result);
100
+ const lines = [
101
+ result.value.restorable ? 'Rollback preview is restorable; no files were changed.' : 'Rollback preview is blocked; no files were changed.',
102
+ ...(result.value.targetPath === undefined ? [] : [`Target: ${result.value.targetPath}`]),
103
+ `Backup: ${result.value.backupPath}`,
104
+ ...result.value.blockers.map((blocker) => `Blocker: ${blocker}`),
105
+ ...result.value.warnings.map((warning) => `Warning: ${warning}`),
106
+ ...(result.value.restorable ? [`Apply with: vgxness setup rollback --backup ${result.value.backupPath} --yes`] : []),
107
+ ];
108
+ return okText(`${lines.join('\n')}\n`);
109
+ }
110
+ export function runSetupBackupCommand(parsed, environment) {
111
+ const subcommand = parsed.positionals[2];
112
+ if (subcommand !== 'list')
113
+ return usageFailure('setup backup requires list');
114
+ const provider = optionalStringFlag(parsed.flags, 'provider') ?? 'opencode';
115
+ if (provider !== 'opencode')
116
+ return usageFailure('setup backup list supports --provider opencode');
117
+ const scope = optionalStringFlag(parsed.flags, 'scope');
118
+ if (scope !== undefined && scope !== 'project' && scope !== 'user' && scope !== 'global')
119
+ return usageFailure('setup backup list --scope must be project, user, or global');
120
+ const target = optionalStringFlag(parsed.flags, 'target');
121
+ const result = listProviderConfigBackups({
122
+ searchRoot: environment.cwd,
123
+ provider: 'opencode',
124
+ ...(scope === undefined ? {} : { scope: scope }),
125
+ ...(target === undefined ? {} : { targetPath: resolve(target) }),
126
+ });
127
+ if (parsed.flags.json === true)
128
+ return jsonResult(result);
129
+ if (!result.ok)
130
+ return resultFailure(result);
131
+ if (result.value.backups.length === 0)
132
+ return okText('No OpenCode config backups found.\n');
133
+ return okText(`${result.value.backups.map((backup) => `${backup.kind} ${backup.backupPath}${backup.targetPath === undefined ? '' : ` -> ${backup.targetPath}`}`).join('\n')}\n`);
134
+ }
135
+ export async function runSetupApplyCommand(parsed, environment) {
136
+ if (parsed.flags.yes !== true)
137
+ return usageFailure('setup apply writes provider config and requires explicit confirmation with --yes. No provider config was written.');
138
+ const input = setupPlanInputFromFlags(parsed, environment);
139
+ if (!input.ok)
140
+ return resultFailure(input);
141
+ const applied = await applySetupPlanInput(input.value, environment);
142
+ return applied.ok ? jsonResult({ ok: true, value: applied.value }) : resultFailure(applied);
143
+ }
144
+ export async function runSetupReinstallApplyCommand(parsed, environment) {
145
+ if (parsed.flags.yes !== true)
146
+ return usageFailure('setup reinstall rewrites VGXNESS-managed provider entries and requires explicit confirmation with --yes. Unrelated OpenCode config is preserved. No provider config was written.');
147
+ const input = setupPlanInputFromFlags(withReinstallFlags(parsed), environment);
148
+ if (!input.ok)
149
+ return resultFailure(input);
150
+ const applied = await applySetupPlanInput(input.value, environment);
151
+ return applied.ok ? jsonResult({ ok: true, value: applied.value }) : resultFailure(applied);
152
+ }
153
+ export async function applySetupPlanInput(input, environment) {
154
+ const plan = createSetupPlan(input);
155
+ if (!plan.ok)
156
+ return plan;
157
+ if (plan.value.status !== 'ready')
158
+ return validationFailure(`Setup plan is ${plan.value.status}; resolve conflicts before applying.`);
159
+ if (input.provider === 'none')
160
+ return { ok: true, value: { status: 'manual-required', message: 'Provider is none; there is no config to apply.', plan: plan.value } };
161
+ if (input.provider === 'claude')
162
+ return {
163
+ ok: true,
164
+ value: {
165
+ status: 'manual-required',
166
+ message: `Claude setup apply is intentionally non-mutating here; use vgxness mcp install claude --yes --run-id <id> for guarded user-global Claude writes. ${providerUserGlobalOnlyMigrationMessage}`,
167
+ plan: plan.value,
168
+ },
169
+ };
170
+ const opened = openCliDatabase(plan.value.db.path);
171
+ if (!opened.ok)
172
+ return opened;
173
+ let result;
174
+ try {
175
+ const effectiveManagerInstructions = computeEffectiveManagerInstructions(opened.value, input.project);
176
+ result = await installOpenCodeMcpClient({
177
+ cwd: environment.cwd,
178
+ databasePath: plan.value.db.path,
179
+ databasePathSource: plan.value.db.source === 'global-default' || plan.value.db.source === 'environment' ? plan.value.db.source : 'flag',
180
+ scope: input.scope ?? vgxnessSetupDefaults.defaultOpenCodeScope,
181
+ env: environment.env,
182
+ confirmed: true,
183
+ mcpOnly: input.installMode === 'mcp-only',
184
+ ...(input.overwriteVgxness === undefined ? {} : { overwriteVgxness: input.overwriteVgxness }),
185
+ ...(effectiveManagerInstructions === undefined ? {} : { effectiveManagerInstructions }),
186
+ });
187
+ }
188
+ finally {
189
+ opened.value.close();
190
+ }
191
+ return result.status === 'installed'
192
+ ? {
193
+ ok: true,
194
+ value: {
195
+ kind: 'setup-apply-result',
196
+ version: 1,
197
+ status: 'installed',
198
+ plan: plan.value,
199
+ opencode: result,
200
+ nextCommands: ['vgxness doctor', 'Restart OpenCode and verify the vgxness MCP server is visible.'],
201
+ },
202
+ }
203
+ : validationFailure(`${result.reason}: ${result.message}`);
204
+ }
205
+ export function setupPlanInputFromFlags(parsed, environment) {
206
+ const project = optionalStringFlag(parsed.flags, 'project');
207
+ const database = setupDatabaseFlags(parsed.flags);
208
+ if (!database.ok)
209
+ return database;
210
+ const provider = setupProviderFlag(parsed.flags);
211
+ if (!provider.ok)
212
+ return provider;
213
+ const scope = opencodeInstallScopeFlag(parsed.flags, 'scope');
214
+ if (!scope.ok)
215
+ return scope;
216
+ const installMode = setupInstallModeFlag(parsed.flags);
217
+ if (!installMode.ok)
218
+ return installMode;
219
+ const overwriteVgxness = parsed.flags['overwrite-vgxness'] === true || parsed.flags.reinstall === true;
220
+ return {
221
+ ok: true,
222
+ value: {
223
+ ...(project === undefined ? {} : { project }),
224
+ workspaceRoot: environment.cwd,
225
+ env: environment.env,
226
+ databaseMode: database.value.mode,
227
+ ...(database.value.path === undefined ? {} : { databasePath: database.value.path }),
228
+ provider: provider.value,
229
+ scope: scope.value,
230
+ installMode: installMode.value,
231
+ overwriteVgxness,
232
+ },
233
+ };
234
+ }
235
+ function withReinstallFlags(parsed) {
236
+ return { ...parsed, flags: { ...parsed.flags, 'overwrite-vgxness': true, reinstall: true } };
237
+ }
238
+ function renderSetupReinstallPreview(plan) {
239
+ return [
240
+ 'VGXNESS Setup Reinstall Preview',
241
+ '',
242
+ 'Warning: reinstall replaces only VGXNESS-managed OpenCode entries: mcp.vgxness and known VGXNESS agents/instructions.',
243
+ 'Unrelated OpenCode config is preserved. This is not a full opencode.json reset.',
244
+ 'A managed backup is planned before existing user-global OpenCode config is changed.',
245
+ '',
246
+ renderSetupPlan(plan).trimEnd(),
247
+ '',
248
+ 'Apply after review: vgxness setup reinstall --yes',
249
+ ].join('\n');
250
+ }
251
+ function defaultWizardInput(environment) {
252
+ return {
253
+ project: environment.cwd
254
+ .replace(/[\\/]+$/, '')
255
+ .split(/[\\/]/)
256
+ .pop() || 'vgxness',
257
+ databaseMode: vgxnessSetupDefaults.defaultDatabaseMode,
258
+ provider: vgxnessSetupDefaults.defaultProvider,
259
+ scope: vgxnessSetupDefaults.defaultOpenCodeScope,
260
+ installMode: vgxnessSetupDefaults.defaultInstallMode,
261
+ overwriteVgxness: false,
262
+ };
263
+ }
264
+ function defaulted(value, fallback) {
265
+ const trimmed = value.trim();
266
+ return trimmed.length === 0 ? fallback : trimmed;
267
+ }
268
+ const promptBuffers = new WeakMap();
269
+ function promptLine(environment, prompt) {
270
+ environment.stdout?.write(prompt);
271
+ const stdin = environment.stdin;
272
+ if (stdin === undefined)
273
+ return Promise.resolve('');
274
+ const buffered = promptBuffers.get(stdin) ?? '';
275
+ const immediateNewline = buffered.search(/\r?\n/);
276
+ if (immediateNewline >= 0) {
277
+ const line = buffered.slice(0, immediateNewline);
278
+ promptBuffers.set(stdin, buffered.slice(immediateNewline + (buffered[immediateNewline] === '\r' && buffered[immediateNewline + 1] === '\n' ? 2 : 1)));
279
+ return Promise.resolve(line);
280
+ }
281
+ return new Promise((resolveLine) => {
282
+ const listener = (chunk) => {
283
+ const nextBuffered = (promptBuffers.get(stdin) ?? '') + chunk.toString();
284
+ const newline = nextBuffered.search(/\r?\n/);
285
+ if (newline >= 0) {
286
+ cleanup();
287
+ const line = nextBuffered.slice(0, newline);
288
+ promptBuffers.set(stdin, nextBuffered.slice(newline + (nextBuffered[newline] === '\r' && nextBuffered[newline + 1] === '\n' ? 2 : 1)));
289
+ resolveLine(line);
290
+ }
291
+ else {
292
+ promptBuffers.set(stdin, nextBuffered);
293
+ }
294
+ };
295
+ const cleanup = () => {
296
+ if (stdin.off !== undefined)
297
+ stdin.off('data', listener);
298
+ else
299
+ stdin.removeListener?.('data', listener);
300
+ };
301
+ stdin.on('data', listener);
302
+ stdin.resume?.();
303
+ });
304
+ }
305
+ function renderSetupPlanForHumans(plan) {
306
+ const actions = plan.actions.map((action) => `- ${action.description}${action.targetPath === undefined ? '' : ` (${action.targetPath})`}`).join('\n') ||
307
+ '- No provider config writes planned.';
308
+ const backups = plan.backupsPlanned.map((backup) => `- ${backup.targetPath}: ${backup.reason}`).join('\n') || '- None.';
309
+ return `\nSetup plan\nProject: ${plan.project}\nDatabase: ${plan.db.mode} (${plan.db.path})\nProvider: ${plan.provider}\nStatus: ${plan.status}\nActions:\n${actions}\nBackups:\n${backups}\n\n`;
310
+ }
311
+ export function promptSetupWizard(environment, defaults) {
312
+ return (async () => {
313
+ const project = defaulted(await promptLine(environment, `Project name [${defaults.project}]: `), defaults.project);
314
+ const db = defaulted(await promptLine(environment, 'DB location: global default, project-local, custom path [global]: '), defaults.databaseMode);
315
+ const databaseMode = db === 'global default' || db === 'global'
316
+ ? 'global'
317
+ : db === 'project-local'
318
+ ? 'project-local'
319
+ : db === 'custom path' || db === 'custom'
320
+ ? 'custom'
321
+ : undefined;
322
+ if (databaseMode === undefined)
323
+ return validationFailure('DB location must be global, project-local, or custom path.');
324
+ const databasePath = databaseMode === 'custom' ? defaulted(await promptLine(environment, 'Custom DB path: '), '') : undefined;
325
+ if (databaseMode === 'custom' && (databasePath ?? '').length === 0)
326
+ return validationFailure('Custom DB path is required.');
327
+ const providerText = defaulted(await promptLine(environment, 'Provider: OpenCode, none/manual [OpenCode]: '), defaults.provider);
328
+ const provider = providerText.toLowerCase() === 'opencode'
329
+ ? 'opencode'
330
+ : providerText.toLowerCase() === 'none/manual' || providerText.toLowerCase() === 'none' || providerText.toLowerCase() === 'manual'
331
+ ? 'none'
332
+ : undefined;
333
+ if (provider === undefined)
334
+ return validationFailure('Provider must be OpenCode or none/manual.');
335
+ const scopeText = defaulted(await promptLine(environment, 'OpenCode scope: project, user [project]: '), defaults.scope);
336
+ const scope = scopeText === 'project' || scopeText === 'user' ? scopeText : undefined;
337
+ if (scope === undefined)
338
+ return validationFailure('OpenCode scope must be project or user.');
339
+ const modeText = defaulted(await promptLine(environment, 'Install mode: MCP + manager/SDD agents, MCP only [MCP + manager/SDD agents]: '), defaults.installMode);
340
+ const installMode = modeText === 'mcp-plus-agents' || modeText.toLowerCase() === 'mcp + manager/sdd agents'
341
+ ? 'mcp-plus-agents'
342
+ : modeText === 'mcp-only' || modeText.toLowerCase() === 'mcp only'
343
+ ? 'mcp-only'
344
+ : undefined;
345
+ if (installMode === undefined)
346
+ return validationFailure('Install mode must be MCP + manager/SDD agents or MCP only.');
347
+ const overwriteText = defaulted(await promptLine(environment, 'Reinstall VGXNESS entries: overwrite existing mcp.vgxness and VGXNESS agents after final confirmation; preserve unrelated OpenCode config [no]: '), 'no');
348
+ const overwriteVgxness = overwriteText.toLowerCase() === 'yes' || overwriteText.toLowerCase() === 'y' || overwriteText.toLowerCase() === 'true';
349
+ const input = {
350
+ project,
351
+ workspaceRoot: environment.cwd,
352
+ env: environment.env,
353
+ databaseMode,
354
+ ...(databasePath === undefined ? {} : { databasePath }),
355
+ provider,
356
+ scope,
357
+ installMode,
358
+ overwriteVgxness,
359
+ };
360
+ const flags = {
361
+ project,
362
+ db: databaseMode,
363
+ provider,
364
+ scope,
365
+ mode: installMode,
366
+ yes: true,
367
+ ...(overwriteVgxness ? { 'overwrite-vgxness': true } : {}),
368
+ ...(databasePath === undefined ? {} : { 'db-path': databasePath }),
369
+ };
370
+ return { ok: true, value: { input, flags } };
371
+ })();
372
+ }
373
+ export function defaultWizardInputExport(environment) {
374
+ return defaultWizardInput(environment);
375
+ }
376
+ export function defaultedExport(value, fallback) {
377
+ return defaulted(value, fallback);
378
+ }
379
+ export function promptLineExport(environment, prompt) {
380
+ return promptLine(environment, prompt);
381
+ }
382
+ export function renderSetupPlanForHumansExport(plan) {
383
+ return renderSetupPlanForHumans(plan);
384
+ }
385
+ export function resolveInitDispatchMode(parsed, _environment) {
386
+ if (parsed.flags.plan === true || parsed.flags.json === true)
387
+ return 'setup-plan';
388
+ if (parsed.flags.yes === true)
389
+ return 'setup-apply';
390
+ return 'setup-plan';
391
+ }
392
+ export async function runInitCommand(parsed, environment) {
393
+ if (shouldRunSetupTui(parsed, environment)) {
394
+ const input = setupPlanInputFromFlags(parsed, environment);
395
+ if (!input.ok)
396
+ return resultFailure(input);
397
+ const plan = createSetupPlan(input.value);
398
+ if (!plan.ok)
399
+ return resultFailure(plan);
400
+ return runSetupTuiController({ environment, plan: plan.value });
401
+ }
402
+ return runInitCommandWithoutSetupTui(parsed, environment);
403
+ }
404
+ export async function runHomeTuiCommand(parsed, environment) {
405
+ const input = setupPlanInputFromFlags(parsed, environment);
406
+ if (!input.ok)
407
+ return resultFailure(input);
408
+ const plan = createSetupPlan(input.value);
409
+ if (!plan.ok)
410
+ return resultFailure(plan);
411
+ return runHomeTuiController({ environment, plan: plan.value });
412
+ }
413
+ export async function runInitCommandWithoutSetupTui(parsed, environment) {
414
+ const mode = resolveInitDispatchMode(parsed, environment);
415
+ if (mode === 'setup-plan')
416
+ return runSetupPlanCommand(parsed, environment);
417
+ return runSetupApplyCommand({ ...parsed, flags: { ...parsed.flags, yes: true } }, environment);
418
+ }
419
+ function shouldRunSetupTui(parsed, environment) {
420
+ if (parsed.flags.plan === true || parsed.flags.json === true || parsed.flags.yes === true)
421
+ return false;
422
+ return canRunInteractiveTui(environment.stdin, environment.stdout);
423
+ }
424
+ export function createSetupLifecycleService(input) {
425
+ return new SetupLifecycleService({
426
+ store: () => (input.opened.ok ? { ok: true, value: { path: input.databasePath } } : input.opened),
427
+ mcp: (setupInput) => {
428
+ const visibility = createOpenCodeMcpVisibilityReport({ cwd: input.environment.cwd, projectRoot: setupInput.projectRoot, env: input.environment.env });
429
+ const preview = createMcpClientSetupPreview({ provider: 'opencode', databasePath: setupInput.databasePath ?? input.databasePath });
430
+ return {
431
+ ok: true,
432
+ value: {
433
+ ready: visibility.ready,
434
+ evidence: setupMcpEvidence(visibility, preview),
435
+ nextAction: visibility.ready
436
+ ? 'Run `opencode mcp list` from inside the project to verify visibility.'
437
+ : 'Preview OpenCode MCP setup, inspect `mcp install opencode --plan`, then apply with `--yes` only after review.',
438
+ },
439
+ };
440
+ },
441
+ defaultContext: (setupInput) => {
442
+ if (!input.opened.ok)
443
+ return validationFailure('Default context cannot be read until the local store is available.');
444
+ if (setupInput.project === undefined)
445
+ return validationFailure('Default context cannot be read until a project is selected.');
446
+ const registry = new AgentRegistryService(input.opened.value);
447
+ const agent = registry.getAgentByName(setupInput.project, setupInput.scope ?? 'project', setupInput.agentName);
448
+ if (!agent.ok)
449
+ return agent;
450
+ const selection = resolveAgentProfileModel({ agent: agent.value, providerAdapter: 'opencode' });
451
+ if (!selection.ok)
452
+ return selection;
453
+ return {
454
+ ok: true,
455
+ value: {
456
+ agentId: agent.value.id,
457
+ providerAdapter: selection.value.providerAdapter,
458
+ model: selection.value.model,
459
+ ...(selection.value.profile === undefined ? {} : { profile: selection.value.profile }),
460
+ },
461
+ };
462
+ },
463
+ });
464
+ }
465
+ export function readSetupStatus(service, input) {
466
+ return service.getStatus(input);
467
+ }
468
+ export function collectRunInsights(service, runs) {
469
+ const insightsByRunId = {};
470
+ for (const run of runs) {
471
+ const insights = service.getRunInsights(run.id);
472
+ if (!insights.ok)
473
+ return insights;
474
+ insightsByRunId[run.id] = insights.value;
475
+ }
476
+ return { ok: true, value: insightsByRunId };
477
+ }
478
+ export function collectRunDetails(service, runs) {
479
+ const detailsByRunId = {};
480
+ for (const run of runs) {
481
+ const details = service.getRun(run.id);
482
+ if (!details.ok)
483
+ return details;
484
+ detailsByRunId[run.id] = details.value;
485
+ }
486
+ return { ok: true, value: detailsByRunId };
487
+ }
488
+ export function setupMcpEvidence(visibility, preview) {
489
+ return [
490
+ visibility.ready
491
+ ? 'OpenCode project config defines mcp.vgxness and is visible from the current working directory.'
492
+ : `OpenCode MCP visibility is not ready at ${visibility.targetPath}.`,
493
+ `Preview command targets ${preview.server.args.join(' ')}.`,
494
+ ...visibility.guidance,
495
+ ];
496
+ }
@@ -0,0 +1,130 @@
1
+ import { MemoryService } from '../../../memory/memory-service.js';
2
+ import { openMemoryDatabase } from '../../../memory/sqlite/database.js';
3
+ import { buildProductResume } from '../../../resume/product-resume.js';
4
+ import { RunService } from '../../../runs/run-service.js';
5
+ import { SddWorkflowService } from '../../../sdd/sdd-workflow-service.js';
6
+ import { buildProductStatus } from '../../../status/product-status.js';
7
+ import { databasePathFor, optionalStringFlag, requiredFlag } from '../cli-flags.js';
8
+ import { okText, usageFailure } from '../cli-help.js';
9
+ import { jsonResult, resultFailure } from '../cli-helpers.js';
10
+ import { renderProductResume } from '../product-resume-renderer.js';
11
+ import { buildProductNext, renderProductNext, renderProductStatus } from '../product-status-renderer.js';
12
+ export function runProductStatusCommand(parsed, environment) {
13
+ const extraPositionals = rejectExtraPositionals(parsed, 'status');
14
+ if (extraPositionals !== undefined)
15
+ return extraPositionals;
16
+ const status = buildProductStatusForCli(parsed, environment);
17
+ if (!status.ok)
18
+ return status.value;
19
+ return parsed.flags.json === true ? jsonResult({ ok: true, value: status.value }) : okText(renderProductStatus(status.value));
20
+ }
21
+ export function runProductNextCommand(parsed, environment) {
22
+ const extraPositionals = rejectExtraPositionals(parsed, 'next');
23
+ if (extraPositionals !== undefined)
24
+ return extraPositionals;
25
+ const status = buildProductStatusForCli(parsed, environment);
26
+ if (!status.ok)
27
+ return status.value;
28
+ const next = buildProductNext(status.value);
29
+ return parsed.flags.json === true ? jsonResult({ ok: true, value: next }) : okText(renderProductNext(next));
30
+ }
31
+ export function runProductResumeCommand(parsed, environment) {
32
+ const extraPositionals = rejectExtraPositionals(parsed, 'resume');
33
+ if (extraPositionals !== undefined)
34
+ return extraPositionals;
35
+ const resume = buildProductResumeForCli(parsed, environment);
36
+ if (!resume.ok)
37
+ return resume.value;
38
+ return parsed.flags.json === true ? jsonResult({ ok: true, value: resume.value }) : okText(renderProductResume(resume.value));
39
+ }
40
+ function rejectExtraPositionals(parsed, command) {
41
+ const extra = parsed.positionals.slice(1);
42
+ return extra.length === 0 ? undefined : usageFailure(`${command} does not accept positional arguments: ${extra.join(' ')}`);
43
+ }
44
+ function buildProductStatusForCli(parsed, environment) {
45
+ const projectFlag = parsed.flags.project === undefined ? { ok: true, value: undefined } : requiredFlag(parsed.flags, 'project');
46
+ if (!projectFlag.ok)
47
+ return { ok: false, value: resultFailure(projectFlag) };
48
+ const changeFlag = parsed.flags.change === undefined ? { ok: true, value: undefined } : requiredFlag(parsed.flags, 'change');
49
+ if (!changeFlag.ok)
50
+ return { ok: false, value: resultFailure(changeFlag) };
51
+ const project = projectFlag.value;
52
+ const change = changeFlag.value;
53
+ if (change === undefined) {
54
+ const status = buildProductStatus({ cwd: environment.cwd, ...(project === undefined ? {} : { project }) });
55
+ return { ok: true, value: status };
56
+ }
57
+ const selectedDatabasePath = databasePathFor(parsed.flags, environment);
58
+ if (!selectedDatabasePath.ok)
59
+ return { ok: false, value: resultFailure(selectedDatabasePath) };
60
+ const explicitDatabasePath = optionalStringFlag(parsed.flags, 'db');
61
+ const opened = openMemoryDatabase({ path: selectedDatabasePath.value, readonly: true });
62
+ if (!opened.ok) {
63
+ const status = buildProductStatus({
64
+ cwd: environment.cwd,
65
+ ...(project === undefined ? {} : { project }),
66
+ change,
67
+ databasePath: selectedDatabasePath.value,
68
+ databaseError: opened.error.message,
69
+ });
70
+ return { ok: true, value: status };
71
+ }
72
+ try {
73
+ const status = buildProductStatus({
74
+ cwd: environment.cwd,
75
+ ...(project === undefined ? {} : { project }),
76
+ change,
77
+ databasePath: selectedDatabasePath.value,
78
+ ...(explicitDatabasePath === undefined ? {} : { explicitDatabasePath }),
79
+ sdd: new SddWorkflowService(new MemoryService(opened.value)),
80
+ runs: new RunService(opened.value),
81
+ });
82
+ return { ok: true, value: status };
83
+ }
84
+ finally {
85
+ opened.value.close();
86
+ }
87
+ }
88
+ function buildProductResumeForCli(parsed, environment) {
89
+ const projectFlag = parsed.flags.project === undefined ? { ok: true, value: undefined } : requiredFlag(parsed.flags, 'project');
90
+ if (!projectFlag.ok)
91
+ return { ok: false, value: resultFailure(projectFlag) };
92
+ const runIdFlag = parsed.flags['run-id'] === undefined ? { ok: true, value: undefined } : requiredFlag(parsed.flags, 'run-id');
93
+ if (!runIdFlag.ok)
94
+ return { ok: false, value: resultFailure(runIdFlag) };
95
+ const project = projectFlag.value;
96
+ const runId = runIdFlag.value;
97
+ if (runId === undefined && project === undefined) {
98
+ const resume = buildProductResume({ cwd: environment.cwd, ...(project === undefined ? {} : { project }) });
99
+ return { ok: true, value: resume };
100
+ }
101
+ const selectedDatabasePath = databasePathFor(parsed.flags, environment);
102
+ if (!selectedDatabasePath.ok)
103
+ return { ok: false, value: resultFailure(selectedDatabasePath) };
104
+ const opened = openMemoryDatabase({ path: selectedDatabasePath.value, readonly: true });
105
+ if (!opened.ok) {
106
+ const visibleDatabasePath = runId === undefined && parsed.flags.db === undefined ? undefined : selectedDatabasePath.value;
107
+ const resume = buildProductResume({
108
+ cwd: environment.cwd,
109
+ ...(project === undefined ? {} : { project }),
110
+ ...(runId === undefined ? {} : { runId }),
111
+ ...(visibleDatabasePath === undefined ? {} : { databasePath: visibleDatabasePath }),
112
+ databaseError: opened.error.message,
113
+ });
114
+ return { ok: true, value: resume };
115
+ }
116
+ try {
117
+ const flaggedDatabasePath = parsed.flags.db === undefined ? undefined : selectedDatabasePath.value;
118
+ const resume = buildProductResume({
119
+ cwd: environment.cwd,
120
+ ...(project === undefined ? {} : { project }),
121
+ ...(runId === undefined ? {} : { runId }),
122
+ ...(flaggedDatabasePath === undefined ? {} : { databasePath: flaggedDatabasePath }),
123
+ runs: new RunService(opened.value),
124
+ });
125
+ return { ok: true, value: resume };
126
+ }
127
+ finally {
128
+ opened.value.close();
129
+ }
130
+ }
@@ -0,0 +1,47 @@
1
+ import { MemoryService } from '../../../memory/memory-service.js';
2
+ import { SddWorkflowService } from '../../../sdd/sdd-workflow-service.js';
3
+ import { VerificationPlanService, VerificationReportService } from '../../../verification/index.js';
4
+ import { requiredFlag } from '../cli-flags.js';
5
+ import { usageFailure } from '../cli-help.js';
6
+ import { jsonResult, readJsonFile, resultFailure } from '../cli-helpers.js';
7
+ import { renderVerificationPlan } from '../verification-plan-renderer.js';
8
+ import { renderVerificationReportArtifact } from '../verification-report-renderer.js';
9
+ export function runVerificationPlanCommand(command, parsed) {
10
+ if (command !== 'plan')
11
+ return usageFailure(`Unknown verification command: ${command}`);
12
+ const plan = new VerificationPlanService().getPlan(parsed.flags.type);
13
+ if (!plan.ok || parsed.flags.json === true)
14
+ return jsonResult(plan);
15
+ return { exitCode: 0, stdout: renderVerificationPlan(plan.value), stderr: '' };
16
+ }
17
+ export function runVerificationReportCommand(command, parsed, database, environment) {
18
+ if (command !== 'report')
19
+ return usageFailure(`Unknown verification command: ${command}`);
20
+ const subcommand = parsed.positionals[2];
21
+ const project = requiredFlag(parsed.flags, 'project');
22
+ const change = requiredFlag(parsed.flags, 'change');
23
+ if (!project.ok)
24
+ return resultFailure(project);
25
+ if (!change.ok)
26
+ return resultFailure(change);
27
+ const service = new VerificationReportService(new SddWorkflowService(new MemoryService(database)));
28
+ if (subcommand === 'save') {
29
+ const file = requiredFlag(parsed.flags, 'file');
30
+ if (!file.ok)
31
+ return resultFailure(file);
32
+ const report = readJsonFile(file.value, environment);
33
+ if (!report.ok)
34
+ return resultFailure(report);
35
+ const saved = service.saveManualReport({ project: project.value, change: change.value, report: report.value });
36
+ if (!saved.ok || parsed.flags.json === true)
37
+ return jsonResult(saved);
38
+ return { exitCode: 0, stdout: renderVerificationReportArtifact({ project: project.value, change: change.value, artifact: saved.value }), stderr: '' };
39
+ }
40
+ if (subcommand === 'get') {
41
+ const artifact = service.getReportArtifact({ project: project.value, change: change.value });
42
+ if (!artifact.ok || parsed.flags.json === true)
43
+ return jsonResult(artifact);
44
+ return { exitCode: 0, stdout: renderVerificationReportArtifact({ project: project.value, change: change.value, artifact: artifact.value }), stderr: '' };
45
+ }
46
+ return usageFailure(`Unknown verification report command: ${subcommand ?? 'missing'}`);
47
+ }