vgxness 1.20.5 → 1.20.7

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 (377) 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 -246
  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 +364 -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/interfaces/cli/bun-bin.js +46 -0
  147. package/dist/interfaces/cli/cli-flags.js +391 -0
  148. package/dist/interfaces/cli/cli-help.js +173 -0
  149. package/dist/interfaces/cli/cli-helpers.js +77 -0
  150. package/dist/interfaces/cli/cli-types.js +1 -0
  151. package/dist/interfaces/cli/commands/agent-skill-dispatcher.js +700 -0
  152. package/dist/interfaces/cli/commands/index.js +9 -0
  153. package/dist/interfaces/cli/commands/interactive-entrypoint-dispatcher.js +14 -0
  154. package/dist/interfaces/cli/commands/mcp-dispatcher.js +252 -0
  155. package/dist/interfaces/cli/commands/memory-sdd-dispatcher.js +367 -0
  156. package/dist/interfaces/cli/commands/run-permission-dispatcher.js +460 -0
  157. package/dist/interfaces/cli/commands/setup-dispatcher.js +496 -0
  158. package/dist/interfaces/cli/commands/status-dispatcher.js +130 -0
  159. package/dist/interfaces/cli/commands/verification-dispatcher.js +47 -0
  160. package/dist/interfaces/cli/commands/workflow-dispatcher.js +566 -0
  161. package/dist/interfaces/cli/dispatcher.js +247 -0
  162. package/dist/interfaces/cli/doctor-renderer.js +26 -0
  163. package/dist/interfaces/cli/home-tui-app.js +462 -0
  164. package/dist/interfaces/cli/home-tui-controller.js +341 -0
  165. package/dist/interfaces/cli/index.js +27 -0
  166. package/dist/interfaces/cli/mcp-start-path.js +21 -0
  167. package/dist/interfaces/cli/product-resume-renderer.js +32 -0
  168. package/dist/interfaces/cli/product-status-renderer.js +81 -0
  169. package/dist/interfaces/cli/sdd-renderer.js +247 -0
  170. package/dist/interfaces/cli/setup-plan-renderer.js +79 -0
  171. package/dist/interfaces/cli/setup-status-renderer.js +50 -0
  172. package/dist/interfaces/cli/setup-tui-app.js +135 -0
  173. package/dist/interfaces/cli/setup-tui-controller.js +89 -0
  174. package/dist/interfaces/cli/tui/focus-reducer.js +60 -0
  175. package/dist/interfaces/cli/tui/focus-types.js +10 -0
  176. package/dist/interfaces/cli/tui/ink/app-shell.js +16 -0
  177. package/dist/interfaces/cli/tui/ink/components.js +38 -0
  178. package/dist/interfaces/cli/tui/ink/help-overlay.js +6 -0
  179. package/dist/interfaces/cli/tui/ink/state-components.js +22 -0
  180. package/dist/interfaces/cli/tui/ink/theme.js +36 -0
  181. package/dist/interfaces/cli/tui/key-intents.js +33 -0
  182. package/dist/interfaces/cli/tui/keymap.js +20 -0
  183. package/dist/interfaces/cli/tui/navigation.js +10 -0
  184. package/dist/interfaces/cli/tui/screen-registry.js +43 -0
  185. package/dist/interfaces/cli/tui/terminal-capabilities.js +12 -0
  186. package/dist/interfaces/cli/tui/tui-types.js +1 -0
  187. package/dist/interfaces/cli/tui/visual/badges.js +19 -0
  188. package/dist/interfaces/cli/tui/visual/footer.js +27 -0
  189. package/dist/interfaces/cli/tui/visual/index.js +3 -0
  190. package/dist/interfaces/cli/tui/visual/viewport.js +11 -0
  191. package/dist/interfaces/cli/tui-render-helpers.js +200 -0
  192. package/dist/interfaces/cli/verification-plan-renderer.js +25 -0
  193. package/dist/interfaces/cli/verification-report-renderer.js +19 -0
  194. package/dist/interfaces/mcp/contracts/agents.js +1 -0
  195. package/dist/interfaces/mcp/contracts/context.js +1 -0
  196. package/dist/interfaces/mcp/contracts/governance.js +1 -0
  197. package/dist/interfaces/mcp/contracts/index.js +1 -0
  198. package/dist/interfaces/mcp/contracts/memory.js +1 -0
  199. package/dist/interfaces/mcp/contracts/providers.js +1 -0
  200. package/dist/interfaces/mcp/contracts/runs.js +1 -0
  201. package/dist/interfaces/mcp/contracts/sdd.js +1 -0
  202. package/dist/interfaces/mcp/contracts/sessions.js +1 -0
  203. package/dist/interfaces/mcp/contracts/skills.js +1 -0
  204. package/dist/interfaces/mcp/contracts/verification.js +1 -0
  205. package/dist/interfaces/mcp/control-plane/handlers/agents.js +38 -0
  206. package/dist/interfaces/mcp/control-plane/handlers/context.js +12 -0
  207. package/dist/interfaces/mcp/control-plane/handlers/memory.js +95 -0
  208. package/dist/interfaces/mcp/control-plane/handlers/providers.js +19 -0
  209. package/dist/interfaces/mcp/control-plane/handlers/runs.js +134 -0
  210. package/dist/interfaces/mcp/control-plane/handlers/sdd.js +225 -0
  211. package/dist/interfaces/mcp/control-plane/handlers/sessions.js +39 -0
  212. package/dist/interfaces/mcp/control-plane/handlers/skills.js +82 -0
  213. package/dist/interfaces/mcp/control-plane/handlers/verification.js +11 -0
  214. package/dist/interfaces/mcp/control-plane/types.js +1 -0
  215. package/dist/interfaces/mcp/control-plane.js +235 -0
  216. package/dist/interfaces/mcp/schema.js +174 -0
  217. package/dist/interfaces/mcp/schemas/common.js +121 -0
  218. package/dist/interfaces/mcp/schemas/inputs/agents.js +69 -0
  219. package/dist/interfaces/mcp/schemas/inputs/context.js +32 -0
  220. package/dist/interfaces/mcp/schemas/inputs/governance.js +23 -0
  221. package/dist/interfaces/mcp/schemas/inputs/index.js +10 -0
  222. package/dist/interfaces/mcp/schemas/inputs/memory.js +50 -0
  223. package/dist/interfaces/mcp/schemas/inputs/providers.js +35 -0
  224. package/dist/interfaces/mcp/schemas/inputs/runs.js +146 -0
  225. package/dist/interfaces/mcp/schemas/inputs/sdd.js +102 -0
  226. package/dist/interfaces/mcp/schemas/inputs/sessions.js +32 -0
  227. package/dist/interfaces/mcp/schemas/inputs/skills.js +231 -0
  228. package/dist/interfaces/mcp/schemas/inputs/verification.js +9 -0
  229. package/dist/interfaces/mcp/schemas/outputs/index.js +2 -0
  230. package/dist/interfaces/mcp/schemas/outputs/providers.js +28 -0
  231. package/dist/interfaces/mcp/schemas/outputs/sdd.js +166 -0
  232. package/dist/interfaces/mcp/stdio-server.js +116 -0
  233. package/dist/interfaces/mcp/validation/agents.js +189 -0
  234. package/dist/interfaces/mcp/validation/common.js +415 -0
  235. package/dist/interfaces/mcp/validation/governance.js +50 -0
  236. package/dist/interfaces/mcp/validation/memory.js +133 -0
  237. package/dist/interfaces/mcp/validation/providers.js +94 -0
  238. package/dist/interfaces/mcp/validation/runs.js +514 -0
  239. package/dist/interfaces/mcp/validation/sdd.js +247 -0
  240. package/dist/interfaces/mcp/validation/sessions.js +51 -0
  241. package/dist/interfaces/mcp/validation/skills.js +685 -0
  242. package/dist/interfaces/mcp/validation/verification.js +24 -0
  243. package/dist/interfaces/mcp/validation.js +149 -0
  244. package/dist/mcp/control-plane-snapshot-service.js +65 -2
  245. package/dist/mcp/control-plane.js +1 -646
  246. package/dist/mcp/doctor.js +1 -1
  247. package/dist/mcp/index.js +17 -17
  248. package/dist/mcp/schema.js +1 -1132
  249. package/dist/mcp/stdio-server.js +1 -116
  250. package/dist/mcp/validation.js +1 -2383
  251. package/dist/memory/active-work-preview.js +1 -75
  252. package/dist/memory/active-work-topics.js +1 -64
  253. package/dist/memory/agent-memory-capture-service.js +1 -497
  254. package/dist/memory/import/dry-run-planner.js +1 -58
  255. package/dist/memory/import/index.js +1 -3
  256. package/dist/memory/import/observation-writer.js +1 -226
  257. package/dist/memory/import/package.js +1 -179
  258. package/dist/memory/memory-capture-schema.js +1 -1
  259. package/dist/memory/memory-service.js +1 -201
  260. package/dist/memory/repositories/artifacts.js +1 -67
  261. package/dist/memory/repositories/observations.js +1 -217
  262. package/dist/memory/repositories/sessions.js +1 -125
  263. package/dist/memory/repositories/traces.js +1 -78
  264. package/dist/memory/schema.js +1 -1
  265. package/dist/memory/search.js +1 -11
  266. package/dist/memory/sqlite/database.js +1 -228
  267. package/dist/memory/storage-paths.js +1 -72
  268. package/dist/payload/context-budget-policy.js +10 -0
  269. package/dist/payload/context-budget-service.js +26 -0
  270. package/dist/payload/payload-diagnostics.js +50 -0
  271. package/dist/permissions/policy-evaluator.js +12 -5
  272. package/dist/runs/execution-planning.js +1 -178
  273. package/dist/runs/operation-execution.js +1 -1
  274. package/dist/runs/operation-retry.js +1 -129
  275. package/dist/runs/repositories/runs.js +1 -676
  276. package/dist/runs/repositories/task-scoped-command-grants.js +1 -462
  277. package/dist/runs/resume-after-approval-result.js +1 -84
  278. package/dist/runs/run-insights.js +1 -270
  279. package/dist/runs/run-service.js +1 -1470
  280. package/dist/runs/run-snapshot-export-service.js +1 -31
  281. package/dist/runs/sandbox-process-execution.js +1 -240
  282. package/dist/runs/sandbox-worktree-planning.js +1 -59
  283. package/dist/runs/schema.js +1 -5
  284. package/dist/runs/task-scoped-command-grant-service.js +1 -217
  285. package/dist/sdd/artifact-portability-service.js +1 -137
  286. package/dist/sdd/cockpit-read-model.js +1 -195
  287. package/dist/sdd/cockpit-types.js +1 -1
  288. package/dist/sdd/schema.js +1 -111
  289. package/dist/sdd/sdd-continuation-plan.js +1 -265
  290. package/dist/sdd/sdd-workflow-service.js +1 -822
  291. package/dist/setup/providers/claude-setup-adapter.js +11 -4
  292. package/dist/setup/providers/opencode-setup-adapter.js +10 -7
  293. package/dist/setup/setup-plan.js +20 -7
  294. package/dist/skills/boot-seed.js +1 -42
  295. package/dist/skills/personal-skills.js +1 -41
  296. package/dist/skills/repositories/skill-evaluation-requests.js +1 -190
  297. package/dist/skills/repositories/skill-evaluation-scenarios.js +1 -305
  298. package/dist/skills/repositories/skill-improvement-proposals.js +1 -355
  299. package/dist/skills/repositories/skills.js +1 -1077
  300. package/dist/skills/schema.js +1 -1
  301. package/dist/skills/skill-export-service.js +1 -34
  302. package/dist/skills/skill-index-service.js +1 -126
  303. package/dist/skills/skill-payload.js +1 -186
  304. package/dist/skills/skill-registry-service.js +1 -644
  305. package/dist/skills/skill-resolver.js +1 -368
  306. package/dist/skills/skill-seed-service.js +1 -242
  307. package/dist/skills/skill-status-service.js +1 -147
  308. package/dist/storage/agents/repositories/agent-seed-history.js +128 -0
  309. package/dist/storage/agents/repositories/agents.js +200 -0
  310. package/dist/storage/agents/repositories/manager-profile-overlays.js +90 -0
  311. package/dist/storage/memory/repositories/artifacts.js +67 -0
  312. package/dist/storage/memory/repositories/observations.js +217 -0
  313. package/dist/storage/memory/repositories/sessions.js +125 -0
  314. package/dist/storage/memory/repositories/traces.js +78 -0
  315. package/dist/storage/memory/sqlite/database.js +228 -0
  316. package/dist/storage/memory/storage-paths.js +72 -0
  317. package/dist/storage/runs/repositories/runs.js +676 -0
  318. package/dist/storage/runs/repositories/task-scoped-command-grants.js +464 -0
  319. package/dist/storage/skills/repositories/skill-evaluation-requests.js +190 -0
  320. package/dist/storage/skills/repositories/skill-evaluation-scenarios.js +305 -0
  321. package/dist/storage/skills/repositories/skill-improvement-proposals.js +355 -0
  322. package/dist/storage/skills/repositories/skills.js +1084 -0
  323. package/docs/architecture.md +2 -2
  324. package/docs/glossary.md +1 -1
  325. package/docs/mcp.md +1 -1
  326. package/docs/module-boundaries.md +114 -0
  327. package/docs/prd.md +1 -1
  328. package/docs/project-health-audit-v1.10.x.md +1 -1
  329. package/docs/providers.md +2 -2
  330. package/docs/safety.md +3 -3
  331. package/docs/sdd/archive/2026-06-26-ambitious-structure-reorganization/apply-progress.md +122 -0
  332. package/docs/sdd/archive/2026-06-26-ambitious-structure-reorganization/archive-report.md +61 -0
  333. package/docs/sdd/archive/2026-06-26-ambitious-structure-reorganization/design.md +66 -0
  334. package/docs/sdd/archive/2026-06-26-ambitious-structure-reorganization/proposal.md +79 -0
  335. package/docs/sdd/archive/2026-06-26-ambitious-structure-reorganization/spec.md +67 -0
  336. package/docs/sdd/archive/2026-06-26-ambitious-structure-reorganization/tasks.md +63 -0
  337. package/docs/sdd/archive/2026-06-26-ambitious-structure-reorganization/verify-report.md +71 -0
  338. package/docs/sdd/archive/2026-06-26-legacy-facade-cleanup/apply-progress.md +68 -0
  339. package/docs/sdd/archive/2026-06-26-legacy-facade-cleanup/archive-report.md +61 -0
  340. package/docs/sdd/archive/2026-06-26-legacy-facade-cleanup/design.md +43 -0
  341. package/docs/sdd/archive/2026-06-26-legacy-facade-cleanup/proposal.md +61 -0
  342. package/docs/sdd/archive/2026-06-26-legacy-facade-cleanup/spec.md +31 -0
  343. package/docs/sdd/archive/2026-06-26-legacy-facade-cleanup/tasks.md +27 -0
  344. package/docs/sdd/archive/2026-06-26-legacy-facade-cleanup/verify-report.md +58 -0
  345. package/docs/sdd/archive/2026-06-26-provider-install-adapter-boundary/apply-progress.md +65 -0
  346. package/docs/sdd/archive/2026-06-26-provider-install-adapter-boundary/archive-report.md +53 -0
  347. package/docs/sdd/archive/2026-06-26-provider-install-adapter-boundary/design.md +64 -0
  348. package/docs/sdd/archive/2026-06-26-provider-install-adapter-boundary/proposal.md +62 -0
  349. package/docs/sdd/archive/2026-06-26-provider-install-adapter-boundary/spec.md +51 -0
  350. package/docs/sdd/archive/2026-06-26-provider-install-adapter-boundary/tasks.md +50 -0
  351. package/docs/sdd/archive/2026-06-26-provider-install-adapter-boundary/verify-report.md +66 -0
  352. package/docs/sdd/manager-prompt-autonomy/apply-progress.md +28 -0
  353. package/docs/sdd/manager-prompt-autonomy/design.md +63 -0
  354. package/docs/sdd/manager-prompt-autonomy/proposal.md +57 -0
  355. package/docs/sdd/manager-prompt-autonomy/tasks.md +19 -0
  356. package/docs/storage.md +2 -2
  357. package/package.json +2 -2
  358. /package/dist/{mcp → adapters/claude/install}/claude-code-cli.js +0 -0
  359. /package/dist/{memory → storage/memory}/sqlite/migrations/001_initial.sql +0 -0
  360. /package/dist/{memory → storage/memory}/sqlite/migrations/002_observation_revisions.sql +0 -0
  361. /package/dist/{memory → storage/memory}/sqlite/migrations/003_agent_registry.sql +0 -0
  362. /package/dist/{memory → storage/memory}/sqlite/migrations/004_run_runtime.sql +0 -0
  363. /package/dist/{memory → storage/memory}/sqlite/migrations/005_run_approvals.sql +0 -0
  364. /package/dist/{memory → storage/memory}/sqlite/migrations/006_run_operation_attempts.sql +0 -0
  365. /package/dist/{memory → storage/memory}/sqlite/migrations/007_abandoned_operation_attempts.sql +0 -0
  366. /package/dist/{memory → storage/memory}/sqlite/migrations/008_run_execution_plan_events.sql +0 -0
  367. /package/dist/{memory → storage/memory}/sqlite/migrations/009_multiple_operation_attempts.sql +0 -0
  368. /package/dist/{memory → storage/memory}/sqlite/migrations/010_skill_registry.sql +0 -0
  369. /package/dist/{memory → storage/memory}/sqlite/migrations/011_skill_usage_resolution_outcomes.sql +0 -0
  370. /package/dist/{memory → storage/memory}/sqlite/migrations/012_skill_improvement_proposals.sql +0 -0
  371. /package/dist/{memory → storage/memory}/sqlite/migrations/013_skill_evaluation_scenarios.sql +0 -0
  372. /package/dist/{memory → storage/memory}/sqlite/migrations/014_manager_profile_overlays.sql +0 -0
  373. /package/dist/{memory → storage/memory}/sqlite/migrations/015_artifact_metadata.sql +0 -0
  374. /package/dist/{memory → storage/memory}/sqlite/migrations/016_agent_seed_history.sql +0 -0
  375. /package/dist/{memory → storage/memory}/sqlite/migrations/017_intent_signal_skill_targets.sql +0 -0
  376. /package/dist/{memory → storage/memory}/sqlite/migrations/018_skill_system_v2.sql +0 -0
  377. /package/dist/{memory → storage/memory}/sqlite/migrations/019_task_scoped_command_grants.sql +0 -0
@@ -1,822 +1 @@
1
- import { summarizePayloadContent } from '../payload/payload-summary.js';
2
- import { normalizeSddArtifact, normalizeSddPhaseInput, sddPhases, sddPrerequisites, sddTopicKey, } from './schema.js';
3
- const defaultContext = { actor: 'sdd-workflow-service' };
4
- const validChangePattern = /^[A-Za-z0-9][A-Za-z0-9._-]*$/;
5
- function readAutoAdvanceFromEnv() {
6
- const value = process.env.VGXNESS_SDD_AUTO_ADVANCE;
7
- return value === 'true' || value === '1';
8
- }
9
- function isPrerequisiteSatisfied(status) {
10
- if (status === undefined)
11
- return false;
12
- if (status.legacy === true)
13
- return false;
14
- if (status.accepted === true)
15
- return true;
16
- if (status.state === 'draft')
17
- return true;
18
- return false;
19
- }
20
- export class SddWorkflowService {
21
- memory;
22
- context;
23
- options;
24
- constructor(memory, context = defaultContext, options = {}) {
25
- this.memory = memory;
26
- this.context = context;
27
- this.options = {
28
- ...options,
29
- autoAdvance: options.autoAdvance ?? readAutoAdvanceFromEnv(),
30
- };
31
- }
32
- getWorkflow(change) {
33
- return sddPhases.map((phase) => ({
34
- phase,
35
- topicKey: sddTopicKey(change, phase),
36
- prerequisites: [...sddPrerequisites[phase]],
37
- }));
38
- }
39
- getReady(input) {
40
- const validated = this.validatePhaseInput(input);
41
- if (!validated.ok)
42
- return validated;
43
- const snapshot = this.loadPhaseSnapshot(validated.value.project, validated.value.change);
44
- if (!snapshot.ok)
45
- return snapshot;
46
- const phases = snapshot.value.phases;
47
- const readiness = getReadinessFromStatuses(validated.value.change, validated.value.phase, phases, this.options);
48
- return {
49
- ok: true,
50
- value: {
51
- change: validated.value.change,
52
- phase: validated.value.phase,
53
- ...readiness,
54
- gates: readinessGatesForPhase(validated.value.change, validated.value.phase, phases, readiness),
55
- },
56
- };
57
- }
58
- getStatus(input) {
59
- const validated = validateProjectAndChange(input.project, input.change);
60
- if (!validated.ok)
61
- return validated;
62
- const phases = this.getPhaseStatuses(validated.value.project, validated.value.change);
63
- if (!phases.ok)
64
- return phases;
65
- return statusFromPhases(validated.value.change, phases.value, this.options);
66
- }
67
- getNext(input) {
68
- const validated = validateProjectAndChange(input.project, input.change);
69
- if (!validated.ok)
70
- return validated;
71
- const phases = this.getPhaseStatuses(validated.value.project, validated.value.change);
72
- if (!phases.ok)
73
- return phases;
74
- return ok(nextDecisionFromStatuses(validated.value.change, phases.value, this.options));
75
- }
76
- getCockpit(input) {
77
- const validated = validateProjectAndChange(input.project, input.change);
78
- if (!validated.ok)
79
- return validated;
80
- const snapshot = this.loadPhaseSnapshot(validated.value.project, validated.value.change);
81
- if (!snapshot.ok)
82
- return snapshot;
83
- return ok(this.cockpitFromSnapshot(snapshot.value));
84
- }
85
- getContinuationContext(input) {
86
- const validated = validateProjectAndChange(input.project, input.change);
87
- if (!validated.ok)
88
- return validated;
89
- const snapshot = this.loadPhaseSnapshot(validated.value.project, validated.value.change);
90
- if (!snapshot.ok)
91
- return snapshot;
92
- const cockpit = this.cockpitFromSnapshot(snapshot.value);
93
- return ok({ next: cockpit.next, cockpit });
94
- }
95
- getGovernanceSnapshot(input) {
96
- const validated = validateProjectAndChange(input.project, input.change);
97
- if (!validated.ok)
98
- return validated;
99
- const snapshot = this.loadPhaseSnapshot(validated.value.project, validated.value.change);
100
- if (!snapshot.ok)
101
- return snapshot;
102
- const phases = snapshot.value.phases;
103
- const status = statusFromPhases(validated.value.change, phases, this.options);
104
- if (!status.ok)
105
- return status;
106
- const warnings = [];
107
- const artifacts = phases.flatMap((phase) => {
108
- if (phase.artifact === undefined)
109
- return [];
110
- const envelope = normalizeSddArtifact(phase.artifact);
111
- warnings.push(...envelope.warnings);
112
- if ((input.payloadMode ?? 'compact') === 'compact') {
113
- const compactArtifact = compactGovernanceArtifact(envelope.artifact);
114
- return [
115
- {
116
- phase: phase.phase,
117
- topicKey: phase.topicKey,
118
- artifact: compactArtifact,
119
- envelope: { ...envelope, artifact: compactArtifact },
120
- },
121
- ];
122
- }
123
- return [{ phase: phase.phase, topicKey: phase.topicKey, artifact: phase.artifact, envelope }];
124
- });
125
- const readiness = input.phase === undefined ? undefined : { change: validated.value.change, phase: input.phase, ...getReadinessFromStatuses(validated.value.change, input.phase, phases, this.options) };
126
- return ok({ status: status.value, artifacts, ...(readiness === undefined ? {} : { readiness }), warnings });
127
- }
128
- saveArtifact(input) {
129
- const validated = this.validatePhaseInput(input);
130
- if (!validated.ok)
131
- return validated;
132
- if (input.content.trim().length === 0)
133
- return validationFailure('SDD artifact content must not be empty');
134
- const { project, change, phase } = validated.value;
135
- const topicKey = sddTopicKey(change, phase);
136
- const existing = this.memory.getArtifact(project, topicKey, this.context);
137
- if (existing.ok) {
138
- const envelope = normalizeSddArtifact(existing.value);
139
- const status = envelope.metadata.status;
140
- if (status === 'accepted')
141
- return validationFailure('Cannot overwrite an accepted SDD artifact; supersede it under a new topic key.');
142
- if (status === 'rejected')
143
- return validationFailure('Rejected SDD artifact must be re-opened via SddWorkflowService.reopenArtifact before saving.');
144
- if (status === 'superseded')
145
- return validationFailure('Cannot overwrite a superseded SDD artifact.');
146
- }
147
- return this.memory.saveArtifact({ project, topicKey, phase, content: input.content, metadata: { status: 'draft' } }, this.context);
148
- }
149
- acceptArtifact(input) {
150
- const validated = this.validatePhaseInput(input);
151
- if (!validated.ok)
152
- return validated;
153
- if (input.acceptedBy === undefined)
154
- return validationFailure('SDD artifact acceptance requires an explicit human actor');
155
- if (input.acceptedBy.type !== 'human')
156
- return validationFailure('SDD artifact acceptance must be performed by a human actor');
157
- if (input.acceptedBy.id === undefined || input.acceptedBy.id.trim().length === 0)
158
- return validationFailure('SDD artifact acceptance human actor id must not be empty');
159
- const topicKey = sddTopicKey(validated.value.change, validated.value.phase);
160
- const existing = this.memory.getArtifact(validated.value.project, topicKey, this.context);
161
- if (!existing.ok)
162
- return existing;
163
- const existingEnvelope = normalizeSddArtifact(existing.value);
164
- const existingStatus = existingEnvelope.metadata.status;
165
- if (existingStatus === 'rejected')
166
- return validationFailure('Rejected SDD artifact must be re-opened via SddWorkflowService.reopenArtifact before accepting.');
167
- if (existingStatus === 'superseded')
168
- return validationFailure('Cannot accept a superseded SDD artifact; create a new artifact under a different topic key instead.');
169
- const acceptance = {
170
- actor: {
171
- type: 'human',
172
- id: input.acceptedBy.id,
173
- ...(input.acceptedBy.displayName === undefined ? {} : { displayName: input.acceptedBy.displayName }),
174
- },
175
- acceptedAt: input.acceptedAt ?? new Date().toISOString(),
176
- ...(input.note === undefined ? {} : { note: input.note }),
177
- };
178
- return this.memory.saveArtifact({
179
- project: existing.value.project,
180
- topicKey: existing.value.topicKey,
181
- phase: existing.value.phase,
182
- content: existing.value.content,
183
- metadata: {
184
- ...existingEnvelope.metadata,
185
- status: 'accepted',
186
- acceptance,
187
- updatedAt: acceptance.acceptedAt,
188
- },
189
- }, this.context);
190
- }
191
- reopenArtifact(input) {
192
- const validated = this.validatePhaseInput(input);
193
- if (!validated.ok)
194
- return validated;
195
- if (input.reopenedBy === undefined)
196
- return validationFailure('SDD artifact reopen requires an explicit human actor');
197
- if (input.reopenedBy.type !== 'human')
198
- return validationFailure('SDD artifact reopen must be performed by a human actor');
199
- if (input.reopenedBy.id === undefined || input.reopenedBy.id.trim().length === 0)
200
- return validationFailure('SDD artifact reopen human actor id must not be empty');
201
- const topicKey = sddTopicKey(validated.value.change, validated.value.phase);
202
- const existing = this.memory.getArtifact(validated.value.project, topicKey, this.context);
203
- if (!existing.ok)
204
- return existing;
205
- const existingEnvelope = normalizeSddArtifact(existing.value);
206
- const existingStatus = existingEnvelope.metadata.status;
207
- if (existingStatus !== 'rejected')
208
- return validationFailure(`SDD artifact reopen is only valid for rejected artifacts (current status: ${existingStatus}).`);
209
- const reopenedAt = input.reopenedAt ?? new Date().toISOString();
210
- const reopenRecord = {
211
- actor: {
212
- type: 'human',
213
- id: input.reopenedBy.id,
214
- ...(input.reopenedBy.displayName === undefined ? {} : { displayName: input.reopenedBy.displayName }),
215
- },
216
- reopenedAt,
217
- ...(input.note === undefined ? {} : { note: input.note }),
218
- };
219
- return this.memory.saveArtifact({
220
- project: existing.value.project,
221
- topicKey: existing.value.topicKey,
222
- phase: existing.value.phase,
223
- content: existing.value.content,
224
- metadata: {
225
- ...existingEnvelope.metadata,
226
- status: 'draft',
227
- reopen: reopenRecord,
228
- updatedAt: reopenedAt,
229
- },
230
- }, this.context);
231
- }
232
- getArtifact(input) {
233
- const validated = this.validatePhaseInput(input);
234
- if (!validated.ok)
235
- return validated;
236
- const artifact = this.memory.getArtifact(validated.value.project, sddTopicKey(validated.value.change, validated.value.phase), this.context);
237
- if (!artifact.ok)
238
- return artifact;
239
- if (input.payloadMode !== 'compact')
240
- return artifact;
241
- const statuses = this.getPhaseStatuses(validated.value.project, validated.value.change);
242
- if (!statuses.ok)
243
- return statuses;
244
- return ok(compactArtifactProjection(artifact.value, validated.value.change, validated.value.phase, getReadinessFromStatuses(validated.value.change, validated.value.phase, statuses.value, this.options)));
245
- }
246
- listArtifacts(input) {
247
- const validated = validateProjectAndChange(input.project, input.change);
248
- if (!validated.ok)
249
- return validated;
250
- if (input.payloadMode === 'compact') {
251
- const snapshot = this.loadPhaseSnapshot(validated.value.project, validated.value.change);
252
- if (!snapshot.ok)
253
- return snapshot;
254
- return ok({
255
- project: validated.value.project,
256
- change: validated.value.change,
257
- artifacts: snapshot.value.phases.flatMap((phase) => {
258
- if (phase.artifact === undefined)
259
- return [];
260
- return [compactArtifactProjection(phase.artifact, validated.value.change, phase.phase, getReadinessFromStatuses(validated.value.change, phase.phase, snapshot.value.phases, this.options))];
261
- }),
262
- fullRetrieval: {
263
- tool: 'vgxness_sdd_list_artifacts',
264
- payloadMode: 'verbose',
265
- input: { project: validated.value.project, change: validated.value.change },
266
- },
267
- });
268
- }
269
- const snapshot = this.loadPhaseSnapshot(validated.value.project, validated.value.change);
270
- if (!snapshot.ok)
271
- return snapshot;
272
- const artifacts = snapshot.value.phases.flatMap((phase) => (phase.artifact === undefined ? [] : [phase.artifact]));
273
- return ok({ project: validated.value.project, change: validated.value.change, artifacts });
274
- }
275
- validatePhaseInput(input) {
276
- const validated = validateProjectAndChange(input.project, input.change);
277
- if (!validated.ok)
278
- return validated;
279
- const phase = normalizeSddPhaseInput(input.phase);
280
- if (phase === undefined)
281
- return validationFailure(`Unknown SDD phase: ${input.phase}`);
282
- return { ok: true, value: { ...validated.value, phase } };
283
- }
284
- getPhaseStatuses(project, change) {
285
- const snapshot = this.loadPhaseSnapshot(project, change);
286
- if (!snapshot.ok)
287
- return snapshot;
288
- return ok(snapshot.value.phases.map(({ artifact, acceptance, createdAt, updatedAt, warnings, ...status }) => status));
289
- }
290
- loadPhaseSnapshot(project, change) {
291
- const listed = this.memory.listArtifactsByTopicPrefixNoTrace(project, `sdd/${change}/`);
292
- if (!listed.ok)
293
- return listed;
294
- const artifactsByTopicKey = new Map(listed.value.map((artifact) => [artifact.topicKey, artifact]));
295
- const phases = sddPhases.map((phase) => {
296
- const topicKey = sddTopicKey(change, phase);
297
- const artifact = artifactsByTopicKey.get(topicKey);
298
- if (artifact === undefined)
299
- return { phase, topicKey, present: false, state: 'missing', accepted: false, legacy: false, warnings: [] };
300
- const envelope = normalizeSddArtifact(artifact);
301
- return {
302
- phase,
303
- topicKey,
304
- present: true,
305
- state: envelope.metadata.status,
306
- accepted: envelope.metadata.status === 'accepted',
307
- legacy: envelope.warnings.includes('legacy-artifact-defaulted-to-draft'),
308
- artifactId: artifact.id,
309
- artifact,
310
- ...(envelope.metadata.acceptance === undefined ? {} : { acceptance: envelope.metadata.acceptance }),
311
- createdAt: artifact.createdAt,
312
- updatedAt: artifact.updatedAt,
313
- warnings: envelope.warnings,
314
- };
315
- });
316
- return ok({ project, change, phases });
317
- }
318
- cockpitFromSnapshot(snapshot) {
319
- const phases = snapshot.phases;
320
- const next = nextDecisionFromStatuses(snapshot.change, phases, this.options);
321
- const cockpitPhases = phases.map((phaseStatus) => {
322
- const readiness = {
323
- change: snapshot.change,
324
- phase: phaseStatus.phase,
325
- ...getReadinessFromStatuses(snapshot.change, phaseStatus.phase, phases, this.options),
326
- };
327
- const artifact = phaseStatus.present ? cockpitArtifactSummaryFromSnapshotItem(phaseStatus) : undefined;
328
- const blockers = cockpitBlockersForPhase(phaseStatus, readiness);
329
- const gates = phaseGateFromStatus(phaseStatus, readiness);
330
- return {
331
- phase: phaseStatus.phase,
332
- topicKey: phaseStatus.topicKey,
333
- present: phaseStatus.present,
334
- accepted: phaseStatus.accepted === true,
335
- legacy: phaseStatus.legacy === true,
336
- state: phaseStatus.state ?? 'missing',
337
- readiness,
338
- ...(artifact === undefined ? {} : { artifact }),
339
- blockers,
340
- gates,
341
- };
342
- });
343
- const artifacts = cockpitPhases.map((phase) => phase.artifact).filter((artifact) => artifact !== undefined);
344
- const aggregateBlockers = dedupeCockpitBlockers([
345
- ...cockpitPhases.flatMap((phase) => phase.blockers),
346
- ...(next.missingPrerequisiteTopicKeys ?? []).map((topicKey) => blockerFromTopicKey(snapshot.change, topicKey)),
347
- ...(next.blockedPrerequisites ?? []).map((blocker) => ({
348
- kind: 'readiness',
349
- phase: blocker.phase,
350
- topicKey: blocker.topicKey,
351
- reason: blocker.reason,
352
- ...(blocker.artifactId === undefined ? {} : { artifactId: blocker.artifactId }),
353
- })),
354
- ]);
355
- return {
356
- project: snapshot.project,
357
- change: snapshot.change,
358
- ...(next.nextPhase === undefined ? {} : { actionablePhase: next.nextPhase }),
359
- next,
360
- recommendedAction: cockpitRecommendedAction(next, aggregateBlockers),
361
- phases: cockpitPhases,
362
- artifacts,
363
- acceptedCount: cockpitPhases.filter((phase) => phase.accepted).length,
364
- legacyCount: cockpitPhases.filter((phase) => phase.legacy).length,
365
- aggregateBlockers,
366
- gates: cockpitGatesFromPhases(cockpitPhases, next),
367
- inspectCommand: `vgxness sdd cockpit --project ${snapshot.project} --change ${snapshot.change} --json`,
368
- };
369
- }
370
- }
371
- export function nextDecisionFromStatuses(change, phases, options = {}) {
372
- const blockedPresentPhase = phases.find((status) => {
373
- if (!status.present)
374
- return false;
375
- return (getReadinessFromStatuses(change, status.phase, phases, options).blockedPrerequisites ?? []).length > 0;
376
- });
377
- if (blockedPresentPhase !== undefined) {
378
- const readiness = getReadinessFromStatuses(change, blockedPresentPhase.phase, phases, options);
379
- const blockers = readiness.blockedPrerequisites ?? [];
380
- return {
381
- change,
382
- status: 'blocked',
383
- nextPhase: blockedPresentPhase.phase,
384
- missingArtifactTopicKeys: readiness.missingArtifactTopicKeys,
385
- missingPrerequisiteTopicKeys: readiness.missingPrerequisiteTopicKeys ?? [],
386
- blockedPrerequisites: blockers,
387
- blockerGuidance: readiness.blockerGuidance ?? [],
388
- reason: `${blockedPresentPhase.phase} is blocked by prerequisite artifacts that are not accepted: ${formatBlockers(blockers)}.`,
389
- recommendedAction: blockedRecommendedAction(readiness, 'continuing'),
390
- };
391
- }
392
- const nextMissingPhase = phases.find((status) => !status.present)?.phase;
393
- if (nextMissingPhase === undefined) {
394
- const firstUnacceptedPhase = phases.find((status) => !status.accepted);
395
- if (firstUnacceptedPhase !== undefined) {
396
- return {
397
- change,
398
- status: 'blocked',
399
- nextPhase: firstUnacceptedPhase.phase,
400
- missingArtifactTopicKeys: [firstUnacceptedPhase.topicKey],
401
- missingPrerequisiteTopicKeys: [],
402
- blockedPrerequisites: [
403
- {
404
- phase: firstUnacceptedPhase.phase,
405
- topicKey: firstUnacceptedPhase.topicKey,
406
- reason: blockerReasonForStatus(firstUnacceptedPhase),
407
- ...(firstUnacceptedPhase.artifactId === undefined ? {} : { artifactId: firstUnacceptedPhase.artifactId }),
408
- },
409
- ],
410
- blockerGuidance: [blockerGuidanceForPhaseStatus(firstUnacceptedPhase)],
411
- reason: `${firstUnacceptedPhase.phase} is present but ${firstUnacceptedPhase.state ?? 'draft'}; accepted governance status is required before the change is complete.`,
412
- recommendedAction: `${blockerActionForStatus(firstUnacceptedPhase)} before archiving this SDD change.`,
413
- };
414
- }
415
- return {
416
- change,
417
- status: 'complete',
418
- missingArtifactTopicKeys: [],
419
- blockedPrerequisites: [],
420
- reason: 'All canonical SDD phases are complete.',
421
- recommendedAction: 'No next SDD phase remains for this change.',
422
- };
423
- }
424
- const readiness = getReadinessFromStatuses(change, nextMissingPhase, phases, options);
425
- if (!readiness.ready) {
426
- const blockers = readiness.blockedPrerequisites ?? [];
427
- return {
428
- change,
429
- status: 'blocked',
430
- nextPhase: nextMissingPhase,
431
- missingArtifactTopicKeys: readiness.missingArtifactTopicKeys,
432
- missingPrerequisiteTopicKeys: readiness.missingPrerequisiteTopicKeys ?? [],
433
- blockedPrerequisites: blockers,
434
- blockerGuidance: readiness.blockerGuidance ?? [],
435
- reason: `${nextMissingPhase} is blocked by prerequisite artifacts that are not accepted: ${formatBlockers(blockers)}.`,
436
- recommendedAction: blockedRecommendedAction(readiness, `running ${nextMissingPhase}`),
437
- };
438
- }
439
- return {
440
- change,
441
- status: 'runnable',
442
- nextPhase: nextMissingPhase,
443
- missingArtifactTopicKeys: [],
444
- blockedPrerequisites: [],
445
- reason: `${nextMissingPhase} is ready to run.`,
446
- recommendedAction: `Run the ${nextMissingPhase} SDD phase for ${change}.`,
447
- };
448
- }
449
- function statusFromPhases(change, phases, options = {}) {
450
- const nextReadyPhase = sddPhases.find((phase) => {
451
- if (phases.find((status) => status.phase === phase)?.present)
452
- return false;
453
- return getReadinessFromStatuses(change, phase, phases, options).ready;
454
- });
455
- const status = { change, phases };
456
- if (nextReadyPhase !== undefined)
457
- status.nextReadyPhase = nextReadyPhase;
458
- return { ok: true, value: status };
459
- }
460
- function getReadinessFromStatuses(change, phase, phases, options = {}) {
461
- const satisfiedPrerequisites = [];
462
- const missingArtifactTopicKeys = [];
463
- const missingPrerequisiteTopicKeys = [];
464
- const blockedPrerequisites = [];
465
- const blockerGuidance = [];
466
- const useAutoAdvance = options.autoAdvance === true;
467
- for (const prerequisite of sddPrerequisites[phase]) {
468
- const status = phases.find((candidate) => candidate.phase === prerequisite);
469
- const satisfied = useAutoAdvance ? isPrerequisiteSatisfied(status) : status?.accepted === true;
470
- if (satisfied) {
471
- satisfiedPrerequisites.push(prerequisite);
472
- continue;
473
- }
474
- const topicKey = status?.topicKey ?? sddTopicKey(change, prerequisite);
475
- const reason = status === undefined ? 'missing' : blockerReasonForStatus(status);
476
- missingArtifactTopicKeys.push(topicKey);
477
- if (reason === 'missing')
478
- missingPrerequisiteTopicKeys.push(topicKey);
479
- const blocker = {
480
- phase: prerequisite,
481
- topicKey,
482
- reason,
483
- ...(status?.artifactId === undefined ? {} : { artifactId: status.artifactId }),
484
- };
485
- blockedPrerequisites.push(blocker);
486
- blockerGuidance.push(blockerGuidanceForBlocker(blocker, phase));
487
- }
488
- return {
489
- ready: blockedPrerequisites.length === 0,
490
- satisfiedPrerequisites,
491
- missingArtifactTopicKeys,
492
- missingPrerequisiteTopicKeys,
493
- blockedPrerequisites,
494
- blockerGuidance,
495
- };
496
- }
497
- function compactArtifactProjection(artifact, change, phase, readiness) {
498
- const envelope = normalizeSddArtifact(artifact);
499
- const summary = summarizePayloadContent(artifact.content);
500
- return {
501
- id: artifact.id,
502
- topicKey: artifact.topicKey,
503
- project: artifact.project,
504
- change,
505
- phase,
506
- present: true,
507
- state: envelope.metadata.status,
508
- accepted: envelope.metadata.status === 'accepted',
509
- legacy: envelope.warnings.includes('legacy-artifact-defaulted-to-draft'),
510
- ...(envelope.metadata.acceptance === undefined ? {} : { acceptance: envelope.metadata.acceptance }),
511
- ...summary,
512
- fullRetrieval: { tool: 'vgxness_sdd_get_artifact', payloadMode: 'verbose', input: { project: artifact.project, change, phase } },
513
- readiness: { change, phase, ...readiness },
514
- observationId: artifact.observationId,
515
- createdAt: artifact.createdAt,
516
- updatedAt: artifact.updatedAt,
517
- };
518
- }
519
- function cockpitArtifactSummaryFromSnapshotItem(item) {
520
- if (item.artifact === undefined || item.artifactId === undefined || item.createdAt === undefined || item.updatedAt === undefined)
521
- return undefined;
522
- return {
523
- phase: item.phase,
524
- topicKey: item.topicKey,
525
- present: true,
526
- accepted: item.accepted === true,
527
- legacy: item.legacy === true,
528
- state: item.state ?? 'draft',
529
- artifactId: item.artifactId,
530
- ...(item.acceptance === undefined ? {} : { acceptance: item.acceptance }),
531
- createdAt: item.createdAt,
532
- updatedAt: item.updatedAt,
533
- };
534
- }
535
- function readinessGatesForPhase(change, phase, phases, readiness) {
536
- const targetStatus = phases.find((candidate) => candidate.phase === phase) ?? { phase, topicKey: sddTopicKey(change, phase), present: false, state: 'missing', accepted: false, legacy: false, warnings: [] };
537
- const targetGate = phaseGateFromStatus(targetStatus, readiness);
538
- const prerequisites = sddPrerequisites[phase].map((prerequisite) => {
539
- const prerequisiteStatus = phases.find((candidate) => candidate.phase === prerequisite) ?? {
540
- phase: prerequisite,
541
- topicKey: sddTopicKey(change, prerequisite),
542
- present: false,
543
- state: 'missing',
544
- accepted: false,
545
- legacy: false,
546
- warnings: [],
547
- };
548
- const blocker = readiness.blockedPrerequisites?.find((candidate) => candidate.phase === prerequisite);
549
- return phaseGateFromStatus(prerequisiteStatus, {
550
- ready: blocker === undefined,
551
- blockedPrerequisites: blocker === undefined ? [] : [blocker],
552
- });
553
- });
554
- const blockedReasons = [...targetGate.blockedReasons, ...prerequisites.flatMap((gate) => gate.blockedReasons)];
555
- return {
556
- phase: targetGate,
557
- prerequisites,
558
- runnable: readiness.ready,
559
- blocked: !readiness.ready,
560
- blockedReasons: [...new Set(blockedReasons)],
561
- humanOnly: targetGate.humanOnly || prerequisites.some((gate) => gate.humanOnly),
562
- preflightRequired: targetGate.preflightRequired,
563
- agentCallable: true,
564
- canDraft: targetGate.canDraft,
565
- canMarkReady: targetGate.canMarkReady,
566
- canAccept: targetGate.canAccept || prerequisites.some((gate) => gate.canAccept),
567
- canReopen: targetGate.canReopen || prerequisites.some((gate) => gate.canReopen),
568
- nextAllowedActions: [...new Set([targetGate, ...prerequisites].flatMap((gate) => gate.nextAllowedActions))],
569
- requiresProviderWriteConsent: false,
570
- };
571
- }
572
- function cockpitGatesFromPhases(phases, next) {
573
- const phaseGates = phases.map((phase) => phase.gates ?? phaseGateFromStatus(phase, phase.readiness));
574
- const blockedTransitions = phaseGates.filter((gate) => gate.blocked);
575
- const blockedReasons = [...new Set(blockedTransitions.flatMap((gate) => gate.blockedReasons))];
576
- const runnableNextPhases = phaseGates.filter((gate) => gate.runnable && !gate.artifactPresent).map((gate) => gate.phase);
577
- return {
578
- phases: phaseGates,
579
- changeComplete: phases.length === sddPhases.length && phases.every((phase) => phase.accepted),
580
- ...(next.nextPhase === undefined ? {} : { nextPhase: next.nextPhase }),
581
- nextPhaseRunnable: next.status === 'runnable',
582
- runnableNextPhases,
583
- blockedTransitions,
584
- blockedReasons,
585
- requiresHumanAcceptance: phaseGates.some((gate) => gate.requiresHumanAcceptance),
586
- humanOnly: phaseGates.some((gate) => gate.humanOnly),
587
- preflightRequired: next.status === 'runnable',
588
- agentCallable: true,
589
- canDraft: phaseGates.some((gate) => gate.canDraft),
590
- canMarkReady: phaseGates.some((gate) => gate.canMarkReady),
591
- canAccept: phaseGates.some((gate) => gate.canAccept),
592
- canReopen: phaseGates.some((gate) => gate.canReopen),
593
- nextAllowedActions: [...new Set(phaseGates.flatMap((gate) => gate.nextAllowedActions))],
594
- requiresProviderWriteConsent: false,
595
- };
596
- }
597
- function phaseGateFromStatus(status, readiness) {
598
- const artifactStatus = status.state ?? (status.present ? 'draft' : 'missing');
599
- const acceptedByHuman = status.accepted === true && status.acceptance?.actor.type === 'human';
600
- const blockedPrerequisite = readiness.blockedPrerequisites?.[0];
601
- const blockedReasons = [
602
- ...((readiness.blockedPrerequisites ?? []).map((blocker) => `${blocker.phase}:${blocker.reason}`)),
603
- ...(status.present && status.accepted !== true ? [`${status.phase}:${blockerReasonForStatus(status)}`] : []),
604
- ...(status.legacy === true ? [`${status.phase}:legacy`] : []),
605
- ];
606
- const requiresHumanAcceptance = status.present && !acceptedByHuman && artifactStatus !== 'missing';
607
- const canDraft = readiness.ready && !status.present;
608
- const canMarkReady = readiness.ready;
609
- const canAccept = status.present && !acceptedByHuman && status.legacy !== true && (artifactStatus === 'draft' || artifactStatus === 'accepted');
610
- const canReopen = status.present && artifactStatus === 'rejected';
611
- const nextAllowedActions = phaseNextAllowedActions({ canDraft, canMarkReady, canAccept, canReopen, present: status.present });
612
- return {
613
- phase: status.phase,
614
- topicKey: status.topicKey,
615
- artifactPresent: status.present,
616
- artifactStatus,
617
- artifactState: status.legacy === true ? 'legacy' : artifactStatus,
618
- accepted: status.accepted === true,
619
- acceptedByHuman,
620
- agentCallable: true,
621
- requiresHumanAcceptance,
622
- draftPresent: artifactStatus === 'draft',
623
- contentFrozen: acceptedByHuman,
624
- runnable: readiness.ready && !status.present,
625
- blocked: !readiness.ready || status.legacy === true || (status.present && status.accepted !== true),
626
- blockedReasons: [...new Set(blockedReasons)],
627
- humanOnly: requiresHumanAcceptance,
628
- preflightRequired: readiness.ready && !status.present,
629
- requiresPreflight: readiness.ready && !status.present,
630
- requiresProviderWriteConsent: false,
631
- canDraft,
632
- canMarkReady,
633
- canAccept,
634
- canReopen,
635
- nextAllowedActions,
636
- ...(blockedPrerequisite === undefined ? {} : { requiredPriorPhase: blockedPrerequisite.phase, blockerReason: blockedPrerequisite.reason }),
637
- };
638
- }
639
- function phaseNextAllowedActions(input) {
640
- const actions = ['vgxness_sdd_get_readiness', 'vgxness_sdd_cockpit'];
641
- if (input.canDraft)
642
- actions.push('vgxness_sdd_save_artifact');
643
- if (input.canMarkReady)
644
- actions.push('vgxness_sdd_ready');
645
- if (input.present)
646
- actions.push('vgxness_sdd_get_artifact');
647
- if (input.canAccept)
648
- actions.push('vgxness_sdd_accept_artifact');
649
- if (input.canReopen)
650
- actions.push('vgxness_sdd_reopen_artifact');
651
- return [...new Set(actions)];
652
- }
653
- function compactGovernanceArtifact(artifact) {
654
- return {
655
- id: artifact.id,
656
- project: artifact.project,
657
- topicKey: artifact.topicKey,
658
- phase: artifact.phase,
659
- observationId: artifact.observationId,
660
- createdAt: artifact.createdAt,
661
- updatedAt: artifact.updatedAt,
662
- contentLength: artifact.content.length,
663
- contentOmitted: true,
664
- };
665
- }
666
- function cockpitBlockersForPhase(status, readiness) {
667
- const blockers = [];
668
- if (!status.present)
669
- blockers.push({
670
- kind: 'missing-topic-key',
671
- phase: status.phase,
672
- topicKey: status.topicKey,
673
- reason: 'Canonical SDD artifact is missing.',
674
- action: blockerActionForBlocker({ phase: status.phase, topicKey: status.topicKey, reason: 'missing' }),
675
- });
676
- if (status.present && status.accepted !== true)
677
- blockers.push({
678
- kind: 'unaccepted-phase',
679
- phase: status.phase,
680
- topicKey: status.topicKey,
681
- reason: `${status.phase} is ${status.state ?? 'draft'}; explicit human acceptance is required.`,
682
- action: blockerActionForStatus(status),
683
- ...(status.artifactId === undefined ? {} : { artifactId: status.artifactId }),
684
- });
685
- if (status.legacy === true)
686
- blockers.push({
687
- kind: 'legacy-artifact',
688
- phase: status.phase,
689
- topicKey: status.topicKey,
690
- reason: 'Artifact has legacy or missing governance metadata and is treated as not accepted.',
691
- action: blockerActionForStatus(status),
692
- ...(status.artifactId === undefined ? {} : { artifactId: status.artifactId }),
693
- });
694
- for (const blocker of readiness.blockedPrerequisites ?? []) {
695
- blockers.push({
696
- kind: 'readiness',
697
- phase: blocker.phase,
698
- topicKey: blocker.topicKey,
699
- reason: blocker.reason,
700
- action: blockerActionForBlocker(blocker),
701
- ...(blocker.artifactId === undefined ? {} : { artifactId: blocker.artifactId }),
702
- });
703
- }
704
- return blockers;
705
- }
706
- function blockerFromTopicKey(change, topicKey) {
707
- const phase = phaseFromTopicKey(change, topicKey);
708
- return {
709
- kind: 'missing-topic-key',
710
- phase,
711
- topicKey,
712
- reason: 'Required SDD topic key is missing or not accepted.',
713
- action: blockerActionForBlocker({ phase, topicKey, reason: 'missing' }),
714
- };
715
- }
716
- function dedupeCockpitBlockers(blockers) {
717
- const seen = new Set();
718
- return blockers.filter((blocker) => {
719
- const key = `${blocker.kind}:${blocker.phase}:${blocker.topicKey}:${blocker.reason}`;
720
- if (seen.has(key))
721
- return false;
722
- seen.add(key);
723
- return true;
724
- });
725
- }
726
- function cockpitRecommendedAction(next, blockers) {
727
- if (next.status === 'complete')
728
- return next.recommendedAction;
729
- if (next.status === 'runnable')
730
- return next.recommendedAction;
731
- const legacy = blockers.find((blocker) => blocker.kind === 'legacy-artifact');
732
- if (legacy !== undefined)
733
- return legacy.action ?? `Inspect and explicitly accept or replace legacy artifact ${legacy.topicKey}.`;
734
- const unaccepted = blockers.find((blocker) => blocker.kind === 'unaccepted-phase');
735
- if (unaccepted !== undefined)
736
- return unaccepted.action ?? `Accept or replace ${unaccepted.topicKey} before continuing.`;
737
- return next.recommendedAction;
738
- }
739
- function blockedRecommendedAction(readiness, context) {
740
- const firstGuidance = readiness.blockerGuidance?.[0];
741
- if (firstGuidance !== undefined)
742
- return `${firstGuidance.action} before ${context}.`;
743
- const firstBlocker = readiness.blockedPrerequisites?.[0];
744
- if (firstBlocker !== undefined)
745
- return `${blockerActionForBlocker(firstBlocker)} before ${context}.`;
746
- return `Resolve prerequisite blockers before ${context}.`;
747
- }
748
- function blockerGuidanceForPhaseStatus(status) {
749
- return blockerGuidanceForBlocker({
750
- phase: status.phase,
751
- topicKey: status.topicKey,
752
- reason: blockerReasonForStatus(status),
753
- ...(status.artifactId === undefined ? {} : { artifactId: status.artifactId }),
754
- });
755
- }
756
- function blockerGuidanceForBlocker(blocker, blockedPhase) {
757
- return {
758
- phase: blocker.phase,
759
- topicKey: blocker.topicKey,
760
- reason: blocker.reason,
761
- action: blockerActionForBlocker(blocker, blockedPhase),
762
- ...(blocker.artifactId === undefined ? {} : { artifactId: blocker.artifactId }),
763
- };
764
- }
765
- function blockerActionForStatus(status) {
766
- return blockerActionForBlocker({
767
- phase: status.phase,
768
- topicKey: status.topicKey,
769
- reason: blockerReasonForStatus(status),
770
- ...(status.artifactId === undefined ? {} : { artifactId: status.artifactId }),
771
- });
772
- }
773
- function blockerActionForBlocker(blocker, blockedPhase) {
774
- switch (blocker.reason) {
775
- case 'missing':
776
- return `Run or create the ${blocker.phase} SDD phase artifact at ${blocker.topicKey}`;
777
- case 'draft':
778
- if (blockedPhase !== undefined && isDraftRunPlanningPhase(blockedPhase))
779
- return `Accept ${blocker.topicKey} if it is ready, or continue planning ${blockedPhase} in OpenCode with VGXNESS MCP after explicitly acknowledging that human acceptance is still required and apply-progress remains gated`;
780
- return `Accept ${blocker.topicKey}, or continue and re-run the ${blocker.phase} phase if the draft is incomplete`;
781
- case 'accepted':
782
- return `Inspect ${blocker.topicKey}; it is marked accepted but still appears in blocker data`;
783
- case 'legacy':
784
- return `Inspect ${blocker.topicKey} and explicitly accept or replace the legacy artifact`;
785
- case 'rejected':
786
- return `Reopen ${blocker.topicKey} for revision, or replace it with a new accepted artifact`;
787
- case 'superseded':
788
- return `Use the current replacement for ${blocker.topicKey}, or create and accept a new canonical ${blocker.phase} artifact`;
789
- }
790
- }
791
- function isDraftRunPlanningPhase(phase) {
792
- return phase === 'explore' || phase === 'proposal' || phase === 'spec' || phase === 'design' || phase === 'tasks';
793
- }
794
- function phaseFromTopicKey(change, topicKey) {
795
- const suffix = topicKey.slice(`sdd/${change}/`.length);
796
- const phase = normalizeSddPhaseInput(suffix);
797
- if (phase !== undefined)
798
- return phase;
799
- return 'explore';
800
- }
801
- function blockerReasonForStatus(status) {
802
- if (status.legacy === true)
803
- return 'legacy';
804
- const state = status.state ?? (status.present ? 'draft' : 'missing');
805
- return state;
806
- }
807
- function formatBlockers(blockers) {
808
- return blockers.map((blocker) => `${blocker.phase} (${blocker.reason}: ${blocker.topicKey})`).join(', ');
809
- }
810
- function validateProjectAndChange(project, change) {
811
- if (project.trim().length === 0)
812
- return validationFailure('Project must not be empty');
813
- if (!validChangePattern.test(change))
814
- return validationFailure(`Invalid SDD change id: ${change}`);
815
- return { ok: true, value: { project, change } };
816
- }
817
- function validationFailure(message) {
818
- return { ok: false, error: { code: 'validation_failed', message } };
819
- }
820
- function ok(value) {
821
- return { ok: true, value };
822
- }
1
+ export * from '../application/sdd/sdd-workflow-service.js';