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
@@ -1,305 +1 @@
1
- import { randomUUID } from 'node:crypto';
2
- export class SkillEvaluationScenarioRepository {
3
- db;
4
- constructor(db) {
5
- this.db = db;
6
- }
7
- createScenario(input) {
8
- const validation = validateScenarioInput(input);
9
- if (!validation.ok)
10
- return validation;
11
- const result = this.db.transaction(() => {
12
- assertSkillExists(this.db, input.skillId);
13
- if (input.versionId !== undefined)
14
- assertVersionBelongsToSkill(this.db, input.versionId, input.skillId);
15
- if (input.proposalId !== undefined)
16
- assertProposalBelongsToSkill(this.db, input.proposalId, input.skillId);
17
- const normalizedName = normalizeScenarioName(input.name);
18
- const proposalContextKey = input.proposalId ?? '';
19
- const versionContextKey = input.versionId ?? '';
20
- const duplicate = this.db.connection
21
- .prepare(`
22
- SELECT id FROM skill_evaluation_scenarios
23
- WHERE skill_id=? AND normalized_name=? AND proposal_context_key=? AND version_context_key=?
24
- `)
25
- .get(input.skillId, normalizedName, proposalContextKey, versionContextKey);
26
- if (duplicate !== undefined)
27
- throw new SkillEvaluationScenarioValidationError(`Skill evaluation scenario already exists: ${normalizedName}`);
28
- const now = new Date().toISOString();
29
- const id = randomUUID();
30
- this.db.connection
31
- .prepare(`
32
- INSERT INTO skill_evaluation_scenarios(
33
- id, skill_id, name, normalized_name, criteria_json,
34
- proposal_id, proposal_context_key, version_id, version_context_key,
35
- created_by, created_at, updated_at
36
- ) VALUES (
37
- @id, @skillId, @name, @normalizedName, @criteriaJson,
38
- @proposalId, @proposalContextKey, @versionId, @versionContextKey,
39
- @createdBy, @createdAt, @updatedAt
40
- )
41
- `)
42
- .run({
43
- id,
44
- skillId: input.skillId,
45
- name: input.name.trim(),
46
- normalizedName,
47
- criteriaJson: JSON.stringify(input.criteria),
48
- proposalId: input.proposalId ?? null,
49
- proposalContextKey,
50
- versionId: input.versionId ?? null,
51
- versionContextKey,
52
- createdBy: input.createdBy.trim(),
53
- createdAt: now,
54
- updatedAt: now,
55
- });
56
- const read = this.getScenario(id);
57
- if (!read.ok)
58
- throw new Error(read.error.message);
59
- return read.value;
60
- });
61
- if (!result.ok && result.error.cause instanceof SkillEvaluationScenarioValidationError)
62
- return validationFailure(result.error.cause.message);
63
- return result;
64
- }
65
- listScenarios(filters) {
66
- if (!filters.skillId.trim())
67
- return validationFailure('Skill id is required');
68
- try {
69
- const where = ['skill_id=@skillId'];
70
- const parameters = { skillId: filters.skillId };
71
- if (filters.proposalId !== undefined) {
72
- where.push('proposal_id=@proposalId');
73
- parameters.proposalId = filters.proposalId;
74
- }
75
- if (filters.versionId !== undefined) {
76
- where.push('version_id=@versionId');
77
- parameters.versionId = filters.versionId;
78
- }
79
- const rows = this.db.connection
80
- .prepare(`
81
- SELECT * FROM skill_evaluation_scenarios
82
- WHERE ${where.join(' AND ')}
83
- ORDER BY normalized_name ASC, created_at ASC, id ASC
84
- `)
85
- .all(parameters);
86
- return ok(rows.map(mapScenario));
87
- }
88
- catch (cause) {
89
- return fail('Failed to list skill evaluation scenarios', cause);
90
- }
91
- }
92
- recordResult(input) {
93
- const validation = validateResultInput(input);
94
- if (!validation.ok)
95
- return validation;
96
- const result = this.db.transaction(() => {
97
- const scenario = assertScenarioExists(this.db, input.scenarioId);
98
- if (input.versionId !== undefined)
99
- assertVersionBelongsToSkill(this.db, input.versionId, scenario.skill_id);
100
- if (input.proposalId !== undefined)
101
- assertProposalBelongsToSkill(this.db, input.proposalId, scenario.skill_id);
102
- const now = new Date().toISOString();
103
- const id = randomUUID();
104
- this.db.connection
105
- .prepare(`
106
- INSERT INTO skill_evaluation_results(
107
- id, scenario_id, status, result_json, observed_behavior,
108
- evaluator, proposal_id, version_id, notes, created_at
109
- ) VALUES (
110
- @id, @scenarioId, @status, @resultJson, @observedBehavior,
111
- @evaluator, @proposalId, @versionId, @notes, @createdAt
112
- )
113
- `)
114
- .run({
115
- id,
116
- scenarioId: input.scenarioId,
117
- status: input.status,
118
- resultJson: JSON.stringify(input.result),
119
- observedBehavior: input.observedBehavior.trim(),
120
- evaluator: input.evaluator.trim(),
121
- proposalId: input.proposalId ?? null,
122
- versionId: input.versionId ?? null,
123
- notes: input.notes?.trim() ? input.notes.trim() : null,
124
- createdAt: now,
125
- });
126
- const read = this.getResult(id);
127
- if (!read.ok)
128
- throw new Error(read.error.message);
129
- return read.value;
130
- });
131
- if (!result.ok && result.error.cause instanceof SkillEvaluationScenarioValidationError)
132
- return validationFailure(result.error.cause.message);
133
- return result;
134
- }
135
- listResults(filters = {}) {
136
- try {
137
- const where = [];
138
- const parameters = {};
139
- if (filters.scenarioId !== undefined) {
140
- where.push('results.scenario_id=@scenarioId');
141
- parameters.scenarioId = filters.scenarioId;
142
- }
143
- if (filters.skillId !== undefined) {
144
- where.push('scenarios.skill_id=@skillId');
145
- parameters.skillId = filters.skillId;
146
- }
147
- if (filters.proposalId !== undefined) {
148
- where.push('results.proposal_id=@proposalId');
149
- parameters.proposalId = filters.proposalId;
150
- }
151
- if (filters.versionId !== undefined) {
152
- where.push('results.version_id=@versionId');
153
- parameters.versionId = filters.versionId;
154
- }
155
- if (filters.evaluator !== undefined) {
156
- where.push('results.evaluator=@evaluator');
157
- parameters.evaluator = filters.evaluator;
158
- }
159
- if (filters.status !== undefined) {
160
- where.push('results.status=@status');
161
- parameters.status = filters.status;
162
- }
163
- const rows = this.db.connection
164
- .prepare(`
165
- SELECT results.* FROM skill_evaluation_results results
166
- JOIN skill_evaluation_scenarios scenarios ON scenarios.id = results.scenario_id
167
- ${where.length ? `WHERE ${where.join(' AND ')}` : ''}
168
- ORDER BY results.created_at ASC, results.rowid ASC
169
- `)
170
- .all(parameters);
171
- return ok(rows.map(mapResult));
172
- }
173
- catch (cause) {
174
- return fail('Failed to list skill evaluation results', cause);
175
- }
176
- }
177
- getScenario(id) {
178
- try {
179
- const row = this.db.connection.prepare('SELECT * FROM skill_evaluation_scenarios WHERE id=?').get(id);
180
- return row ? ok(mapScenario(row)) : missing(`Skill evaluation scenario not found: ${id}`);
181
- }
182
- catch (cause) {
183
- return fail('Failed to read skill evaluation scenario', cause);
184
- }
185
- }
186
- getResult(id) {
187
- try {
188
- const row = this.db.connection.prepare('SELECT * FROM skill_evaluation_results WHERE id=?').get(id);
189
- return row ? ok(mapResult(row)) : missing(`Skill evaluation result not found: ${id}`);
190
- }
191
- catch (cause) {
192
- return fail('Failed to read skill evaluation result', cause);
193
- }
194
- }
195
- }
196
- function validateScenarioInput(input) {
197
- if (!input.skillId.trim())
198
- return validationFailure('Skill id is required');
199
- if (!input.name.trim())
200
- return validationFailure('Skill evaluation scenario name is required');
201
- if (!isJsonObject(input.criteria))
202
- return validationFailure('Skill evaluation scenario criteria must be a JSON object');
203
- if (!input.createdBy.trim())
204
- return validationFailure('Skill evaluation scenario creator is required');
205
- return ok(undefined);
206
- }
207
- function validateResultInput(input) {
208
- if (!input.scenarioId.trim())
209
- return validationFailure('Skill evaluation scenario id is required');
210
- if (!isEvaluationResultStatus(input.status))
211
- return validationFailure(`Invalid skill evaluation result status: ${input.status}`);
212
- if (!isJsonObject(input.result))
213
- return validationFailure('Skill evaluation result must be a JSON object');
214
- if (!input.observedBehavior.trim())
215
- return validationFailure('Skill evaluation observed behavior is required');
216
- if (!input.evaluator.trim())
217
- return validationFailure('Skill evaluation result evaluator is required');
218
- return ok(undefined);
219
- }
220
- function normalizeScenarioName(name) {
221
- return name.trim().toLowerCase().replace(/\s+/g, ' ');
222
- }
223
- function isJsonObject(value) {
224
- return typeof value === 'object' && value !== null && !Array.isArray(value);
225
- }
226
- function isEvaluationResultStatus(value) {
227
- return value === 'passed' || value === 'failed' || value === 'needs-review' || value === 'not-applicable';
228
- }
229
- function assertScenarioExists(db, scenarioId) {
230
- const row = db.connection.prepare('SELECT id, skill_id FROM skill_evaluation_scenarios WHERE id=?').get(scenarioId);
231
- if (row === undefined)
232
- throw new SkillEvaluationScenarioValidationError(`Skill evaluation scenario not found: ${scenarioId}`);
233
- return row;
234
- }
235
- function assertSkillExists(db, skillId) {
236
- const row = db.connection.prepare('SELECT 1 FROM skills WHERE id=?').get(skillId);
237
- if (row === undefined)
238
- throw new SkillEvaluationScenarioValidationError(`Skill not found: ${skillId}`);
239
- }
240
- function assertVersionBelongsToSkill(db, versionId, skillId) {
241
- const row = db.connection.prepare('SELECT skill_id FROM skill_versions WHERE id=?').get(versionId);
242
- if (row === undefined)
243
- throw new SkillEvaluationScenarioValidationError(`Skill version not found: ${versionId}`);
244
- if (row.skill_id !== skillId)
245
- throw new SkillEvaluationScenarioValidationError('Skill version must belong to the evaluated skill');
246
- }
247
- function assertProposalBelongsToSkill(db, proposalId, skillId) {
248
- const row = db.connection.prepare('SELECT skill_id FROM skill_improvement_proposals WHERE id=?').get(proposalId);
249
- if (row === undefined)
250
- throw new SkillEvaluationScenarioValidationError(`Skill improvement proposal not found: ${proposalId}`);
251
- if (row.skill_id !== skillId)
252
- throw new SkillEvaluationScenarioValidationError('Skill improvement proposal must belong to the evaluated skill');
253
- }
254
- function mapScenario(row) {
255
- const scenario = {
256
- id: row.id,
257
- skillId: row.skill_id,
258
- name: row.name,
259
- normalizedName: row.normalized_name,
260
- criteria: JSON.parse(row.criteria_json),
261
- createdBy: row.created_by,
262
- createdAt: row.created_at,
263
- updatedAt: row.updated_at,
264
- };
265
- if (row.proposal_id !== null)
266
- scenario.proposalId = row.proposal_id;
267
- if (row.version_id !== null)
268
- scenario.versionId = row.version_id;
269
- return scenario;
270
- }
271
- function mapResult(row) {
272
- const result = {
273
- id: row.id,
274
- scenarioId: row.scenario_id,
275
- status: row.status,
276
- result: JSON.parse(row.result_json),
277
- observedBehavior: row.observed_behavior,
278
- evaluator: row.evaluator,
279
- createdAt: row.created_at,
280
- };
281
- if (row.proposal_id !== null)
282
- result.proposalId = row.proposal_id;
283
- if (row.version_id !== null)
284
- result.versionId = row.version_id;
285
- if (row.notes !== null)
286
- result.notes = row.notes;
287
- return result;
288
- }
289
- function ok(value) {
290
- return { ok: true, value };
291
- }
292
- function missing(message) {
293
- return { ok: false, error: { code: 'not_found', message } };
294
- }
295
- function validationFailure(message) {
296
- return { ok: false, error: { code: 'validation_failed', message } };
297
- }
298
- function fail(message, cause) {
299
- const error = { code: 'validation_failed', message };
300
- if (cause !== undefined)
301
- error.cause = cause;
302
- return { ok: false, error };
303
- }
304
- class SkillEvaluationScenarioValidationError extends Error {
305
- }
1
+ export * from '../../storage/skills/repositories/skill-evaluation-scenarios.js';
@@ -1,355 +1 @@
1
- import { randomUUID } from 'node:crypto';
2
- import { SkillRepository } from './skills.js';
3
- export class SkillImprovementProposalRepository {
4
- db;
5
- constructor(db) {
6
- this.db = db;
7
- }
8
- create(input) {
9
- const validation = validateCreate(input);
10
- if (!validation.ok)
11
- return validation;
12
- const result = this.db.transaction(() => {
13
- const base = assertBaseVersion(this.db, input.skillId, input.baseVersionId);
14
- assertProposedVersionIsNew(this.db, input.skillId, input.proposedVersion);
15
- const now = new Date().toISOString();
16
- const id = randomUUID();
17
- const proposedCompatibility = input.proposedCompatibility ?? base.compatibility;
18
- const diffSummary = buildDiffSummary(base, input.proposedVersion, input.proposedSource, proposedCompatibility);
19
- this.db.connection
20
- .prepare(`
21
- INSERT INTO skill_improvement_proposals(
22
- id, skill_id, base_version_id, proposed_version,
23
- proposed_source_kind, proposed_source_path, proposed_source_url, proposed_source_inline_metadata_json,
24
- proposed_compatibility_json, rationale, source_signal_json, diff_summary_json,
25
- title, problem, suggested_change, source_run_id, source_agent_id, evidence_json,
26
- status, created_at, updated_at
27
- ) VALUES (
28
- @id, @skillId, @baseVersionId, @proposedVersion,
29
- @sourceKind, @sourcePath, @sourceUrl, @sourceInlineMetadataJson,
30
- @compatibilityJson, @rationale, @sourceSignalJson, @diffSummaryJson,
31
- @title, @problem, @suggestedChange, @sourceRunId, @sourceAgentId, @evidenceJson,
32
- 'draft', @createdAt, @updatedAt
33
- )
34
- `)
35
- .run({
36
- id,
37
- skillId: input.skillId,
38
- baseVersionId: input.baseVersionId,
39
- proposedVersion: input.proposedVersion,
40
- sourceKind: input.proposedSource.kind,
41
- sourcePath: input.proposedSource.path ?? null,
42
- sourceUrl: input.proposedSource.url ?? null,
43
- sourceInlineMetadataJson: JSON.stringify(input.proposedSource.inlineMetadata ?? {}),
44
- compatibilityJson: JSON.stringify(proposedCompatibility),
45
- rationale: input.rationale,
46
- sourceSignalJson: JSON.stringify(input.sourceSignal ?? {}),
47
- diffSummaryJson: JSON.stringify(diffSummary),
48
- title: input.title ?? null,
49
- problem: input.problem ?? null,
50
- suggestedChange: input.suggestedChange ?? null,
51
- sourceRunId: input.sourceRunId ?? null,
52
- sourceAgentId: input.sourceAgentId ?? null,
53
- evidenceJson: input.evidence === undefined ? null : JSON.stringify(input.evidence),
54
- createdAt: now,
55
- updatedAt: now,
56
- });
57
- const read = this.getById(id);
58
- if (!read.ok)
59
- throw new Error(read.error.message);
60
- return read.value;
61
- });
62
- if (!result.ok && result.error.cause instanceof SkillImprovementProposalValidationError)
63
- return validationFailure(result.error.cause.message);
64
- return result;
65
- }
66
- list(filters = {}) {
67
- try {
68
- const where = [];
69
- const parameters = {};
70
- if (filters.project !== undefined) {
71
- where.push('s.project=@project');
72
- parameters.project = filters.project;
73
- }
74
- if (filters.scope !== undefined) {
75
- where.push('s.scope=@scope');
76
- parameters.scope = filters.scope;
77
- }
78
- if (filters.skillId !== undefined) {
79
- where.push('p.skill_id=@skillId');
80
- parameters.skillId = filters.skillId;
81
- }
82
- if (filters.baseVersionId !== undefined) {
83
- where.push('p.base_version_id=@baseVersionId');
84
- parameters.baseVersionId = filters.baseVersionId;
85
- }
86
- if (filters.status !== undefined) {
87
- where.push('p.status=@status');
88
- parameters.status = filters.status;
89
- }
90
- if (filters.runId !== undefined) {
91
- where.push('p.source_run_id=@runId');
92
- parameters.runId = filters.runId;
93
- }
94
- if (filters.agentId !== undefined) {
95
- where.push('p.source_agent_id=@agentId');
96
- parameters.agentId = filters.agentId;
97
- }
98
- const limitClause = filters.limit === undefined ? '' : 'LIMIT @limit';
99
- if (filters.limit !== undefined)
100
- parameters.limit = filters.limit;
101
- const rows = this.db.connection
102
- .prepare(`
103
- SELECT p.* FROM skill_improvement_proposals p
104
- JOIN skills s ON s.id = p.skill_id
105
- ${where.length ? `WHERE ${where.join(' AND ')}` : ''}
106
- ORDER BY p.created_at DESC, p.id ASC
107
- ${limitClause}
108
- `)
109
- .all(parameters);
110
- return ok(rows.map(mapProposal));
111
- }
112
- catch (cause) {
113
- return fail('Failed to list skill improvement proposals', cause);
114
- }
115
- }
116
- getById(id) {
117
- try {
118
- const row = this.db.connection.prepare('SELECT * FROM skill_improvement_proposals WHERE id=?').get(id);
119
- return row ? ok(mapProposal(row)) : missing(`Skill improvement proposal not found: ${id}`);
120
- }
121
- catch (cause) {
122
- return fail('Failed to read skill improvement proposal', cause);
123
- }
124
- }
125
- submitForApproval(input) {
126
- return this.transition(input, 'draft', 'pending-approval', 'submitted_at', 'submitted_by');
127
- }
128
- approve(input) {
129
- return this.resolve(input, 'approved');
130
- }
131
- reject(input) {
132
- return this.resolve(input, 'rejected');
133
- }
134
- cancel(input) {
135
- const proposal = this.getById(input.proposalId);
136
- if (!proposal.ok)
137
- return proposal;
138
- if (proposal.value.status !== 'draft' && proposal.value.status !== 'pending-approval')
139
- return validationFailure(`Cannot cancel proposal with status ${proposal.value.status}`);
140
- return this.resolve(input, 'cancelled', proposal.value.status);
141
- }
142
- apply(input) {
143
- if (!input.actor.trim())
144
- return validationFailure('Proposal actor is required');
145
- const result = this.db.transaction(() => {
146
- const proposal = this.getById(input.proposalId);
147
- if (!proposal.ok)
148
- throw new SkillImprovementProposalValidationError(proposal.error.message);
149
- if (proposal.value.status !== 'approved')
150
- throw new SkillImprovementProposalValidationError(`Cannot apply proposal with status ${proposal.value.status}`);
151
- assertProposedVersionIsNew(this.db, proposal.value.skillId, proposal.value.proposedVersion);
152
- const skills = new SkillRepository(this.db);
153
- const version = skills.addVersion({
154
- skillId: proposal.value.skillId,
155
- version: proposal.value.proposedVersion,
156
- source: proposal.value.proposedSource,
157
- compatibility: proposal.value.proposedCompatibility,
158
- activate: true,
159
- });
160
- if (!version.ok)
161
- throw new SkillImprovementProposalValidationError(version.error.message);
162
- const now = new Date().toISOString();
163
- this.db.connection
164
- .prepare(`
165
- UPDATE skill_improvement_proposals SET
166
- status='applied', updated_at=@updatedAt, applied_at=@appliedAt, applied_by=@appliedBy,
167
- apply_reason=@applyReason, applied_version_id=@appliedVersionId
168
- WHERE id=@id
169
- `)
170
- .run({
171
- id: input.proposalId,
172
- updatedAt: now,
173
- appliedAt: now,
174
- appliedBy: input.actor,
175
- applyReason: input.reason ?? null,
176
- appliedVersionId: version.value.id,
177
- });
178
- const read = this.getById(input.proposalId);
179
- if (!read.ok)
180
- throw new Error(read.error.message);
181
- return read.value;
182
- });
183
- if (!result.ok && result.error.cause instanceof SkillImprovementProposalValidationError)
184
- return validationFailure(result.error.cause.message);
185
- return result;
186
- }
187
- transition(input, from, to, atColumn, byColumn) {
188
- if (!input.actor.trim())
189
- return validationFailure('Proposal actor is required');
190
- const proposal = this.getById(input.proposalId);
191
- if (!proposal.ok)
192
- return proposal;
193
- if (proposal.value.status !== from)
194
- return validationFailure(`Cannot move proposal from ${proposal.value.status} to ${to}`);
195
- const now = new Date().toISOString();
196
- try {
197
- this.db.connection
198
- .prepare(`UPDATE skill_improvement_proposals SET status=?, updated_at=?, ${atColumn}=?, ${byColumn}=? WHERE id=?`)
199
- .run(to, now, now, input.actor, input.proposalId);
200
- return this.getById(input.proposalId);
201
- }
202
- catch (cause) {
203
- return fail('Failed to update skill improvement proposal', cause);
204
- }
205
- }
206
- resolve(input, status, expectedStatus = 'pending-approval') {
207
- if (!input.actor.trim())
208
- return validationFailure('Proposal actor is required');
209
- const proposal = this.getById(input.proposalId);
210
- if (!proposal.ok)
211
- return proposal;
212
- if (proposal.value.status !== expectedStatus)
213
- return validationFailure(`Cannot ${status} proposal with status ${proposal.value.status}`);
214
- const now = new Date().toISOString();
215
- try {
216
- this.db.connection
217
- .prepare(`
218
- UPDATE skill_improvement_proposals SET
219
- status=@status, updated_at=@updatedAt, resolved_at=@resolvedAt,
220
- resolved_by=@resolvedBy, resolution_reason=@resolutionReason
221
- WHERE id=@id
222
- `)
223
- .run({
224
- id: input.proposalId,
225
- status,
226
- updatedAt: now,
227
- resolvedAt: now,
228
- resolvedBy: input.actor,
229
- resolutionReason: input.reason ?? null,
230
- });
231
- return this.getById(input.proposalId);
232
- }
233
- catch (cause) {
234
- return fail('Failed to resolve skill improvement proposal', cause);
235
- }
236
- }
237
- }
238
- function validateCreate(input) {
239
- if (!input.skillId.trim())
240
- return validationFailure('Skill id is required');
241
- if (!input.baseVersionId.trim())
242
- return validationFailure('Base version id is required');
243
- if (!input.proposedVersion.trim())
244
- return validationFailure('Proposed version is required');
245
- if (!input.rationale.trim())
246
- return validationFailure('Proposal rationale is required');
247
- if (input.title !== undefined && !input.title.trim())
248
- return validationFailure('Proposal title must not be empty');
249
- if (input.problem !== undefined && !input.problem.trim())
250
- return validationFailure('Proposal problem must not be empty');
251
- if (input.suggestedChange !== undefined && !input.suggestedChange.trim())
252
- return validationFailure('Proposal suggested change must not be empty');
253
- if (input.proposedSource.kind === 'path' && !input.proposedSource.path?.trim())
254
- return validationFailure('Path proposal sources require proposedSource.path');
255
- if (input.proposedSource.kind === 'url' && !input.proposedSource.url?.trim())
256
- return validationFailure('URL proposal sources require proposedSource.url');
257
- if (input.proposedSource.kind === 'inline' && (input.proposedSource.path !== undefined || input.proposedSource.url !== undefined))
258
- return validationFailure('Inline proposal sources cannot include path or url');
259
- return ok(undefined);
260
- }
261
- function assertBaseVersion(db, skillId, baseVersionId) {
262
- const base = new SkillRepository(db).getVersion(baseVersionId);
263
- if (!base.ok)
264
- throw new SkillImprovementProposalValidationError(base.error.message);
265
- if (base.value.skillId !== skillId)
266
- throw new SkillImprovementProposalValidationError('Base version must belong to the proposed skill');
267
- return base.value;
268
- }
269
- function assertProposedVersionIsNew(db, skillId, proposedVersion) {
270
- const existing = db.connection.prepare('SELECT 1 FROM skill_versions WHERE skill_id=? AND version=?').get(skillId, proposedVersion);
271
- if (existing !== undefined)
272
- throw new SkillImprovementProposalValidationError(`Proposed version already exists for skill: ${proposedVersion}`);
273
- }
274
- function buildDiffSummary(base, proposedVersion, proposedSource, proposedCompatibility) {
275
- const changes = [];
276
- if (base.version !== proposedVersion)
277
- changes.push({ field: 'version', before: base.version, after: proposedVersion });
278
- if (JSON.stringify(base.source) !== JSON.stringify(proposedSource))
279
- changes.push({ field: 'source', before: base.source, after: proposedSource });
280
- if (JSON.stringify(base.compatibility) !== JSON.stringify(proposedCompatibility))
281
- changes.push({ field: 'compatibility', before: base.compatibility, after: proposedCompatibility });
282
- return { baseVersionId: base.id, proposedVersion, changes };
283
- }
284
- function mapProposal(row) {
285
- const proposedSource = { kind: row.proposed_source_kind };
286
- if (row.proposed_source_path !== null)
287
- proposedSource.path = row.proposed_source_path;
288
- if (row.proposed_source_url !== null)
289
- proposedSource.url = row.proposed_source_url;
290
- const inlineMetadata = JSON.parse(row.proposed_source_inline_metadata_json ?? '{}');
291
- if (Object.keys(inlineMetadata).length > 0)
292
- proposedSource.inlineMetadata = inlineMetadata;
293
- const proposal = {
294
- id: row.id,
295
- skillId: row.skill_id,
296
- baseVersionId: row.base_version_id,
297
- proposedVersion: row.proposed_version,
298
- proposedSource,
299
- proposedCompatibility: JSON.parse(row.proposed_compatibility_json),
300
- rationale: row.rationale,
301
- sourceSignal: JSON.parse(row.source_signal_json),
302
- diffSummary: JSON.parse(row.diff_summary_json),
303
- status: row.status,
304
- createdAt: row.created_at,
305
- updatedAt: row.updated_at,
306
- };
307
- if (row.title !== null && row.title !== undefined)
308
- proposal.title = row.title;
309
- if (row.problem !== null && row.problem !== undefined)
310
- proposal.problem = row.problem;
311
- if (row.suggested_change !== null && row.suggested_change !== undefined)
312
- proposal.suggestedChange = row.suggested_change;
313
- if (row.source_run_id !== null && row.source_run_id !== undefined)
314
- proposal.sourceRunId = row.source_run_id;
315
- if (row.source_agent_id !== null && row.source_agent_id !== undefined)
316
- proposal.sourceAgentId = row.source_agent_id;
317
- if (row.evidence_json !== null && row.evidence_json !== undefined)
318
- proposal.evidence = JSON.parse(row.evidence_json);
319
- if (row.submitted_at !== null)
320
- proposal.submittedAt = row.submitted_at;
321
- if (row.submitted_by !== null)
322
- proposal.submittedBy = row.submitted_by;
323
- if (row.resolved_at !== null)
324
- proposal.resolvedAt = row.resolved_at;
325
- if (row.resolved_by !== null)
326
- proposal.resolvedBy = row.resolved_by;
327
- if (row.resolution_reason !== null)
328
- proposal.resolutionReason = row.resolution_reason;
329
- if (row.applied_at !== null)
330
- proposal.appliedAt = row.applied_at;
331
- if (row.applied_by !== null)
332
- proposal.appliedBy = row.applied_by;
333
- if (row.apply_reason !== null)
334
- proposal.applyReason = row.apply_reason;
335
- if (row.applied_version_id !== null)
336
- proposal.appliedVersionId = row.applied_version_id;
337
- return proposal;
338
- }
339
- function ok(value) {
340
- return { ok: true, value };
341
- }
342
- function missing(message) {
343
- return { ok: false, error: { code: 'not_found', message } };
344
- }
345
- function validationFailure(message) {
346
- return { ok: false, error: { code: 'validation_failed', message } };
347
- }
348
- function fail(message, cause) {
349
- const error = { code: 'validation_failed', message };
350
- if (cause !== undefined)
351
- error.cause = cause;
352
- return { ok: false, error };
353
- }
354
- class SkillImprovementProposalValidationError extends Error {
355
- }
1
+ export * from '../../storage/skills/repositories/skill-improvement-proposals.js';