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
@@ -0,0 +1,305 @@
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
+ }
@@ -0,0 +1,355 @@
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
+ }