vgxness 1.20.4 → 1.20.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (375) hide show
  1. package/dist/adapters/claude/agent-renderer.js +82 -0
  2. package/dist/{mcp → adapters/claude/install}/claude-code-agent-config.js +64 -9
  3. package/dist/{mcp → adapters/claude/install}/claude-code-config.js +28 -6
  4. package/dist/{mcp → adapters/claude/install}/claude-code-project-memory.js +35 -5
  5. package/dist/{mcp → adapters/claude/install}/claude-code-scope.js +12 -3
  6. package/dist/{mcp → adapters/claude/install}/claude-code-user-config.js +26 -5
  7. package/dist/{mcp → adapters/claude/install}/claude-code-user-memory.js +47 -7
  8. package/dist/{mcp → adapters/claude/install}/client-install-claude-code-contract.js +45 -8
  9. package/dist/{mcp → adapters/claude/install}/client-install-claude-code.js +98 -14
  10. package/dist/adapters/json/agent-renderer.js +104 -0
  11. package/dist/adapters/opencode/agent-renderer.js +113 -0
  12. package/dist/{mcp → adapters/opencode/install}/client-install-opencode-contract.js +2 -2
  13. package/dist/{mcp → adapters/opencode/install}/client-install-opencode.js +1 -1
  14. package/dist/{mcp → adapters/opencode/install}/opencode-default-agent-config.js +2 -2
  15. package/dist/{mcp → adapters/opencode/install}/opencode-handoff-preview.js +60 -7
  16. package/dist/{mcp → adapters/opencode/install}/opencode-visibility.js +1 -1
  17. package/dist/adapters/provider-renderer.js +6 -0
  18. package/dist/agents/agent-activation-service.js +1 -263
  19. package/dist/agents/agent-lookup-contexts.js +1 -28
  20. package/dist/agents/agent-registry-service.js +1 -81
  21. package/dist/agents/agent-resolver.js +1 -287
  22. package/dist/agents/agent-seed-service.js +1 -157
  23. package/dist/agents/agent-seed-upgrade-service.js +1 -231
  24. package/dist/agents/agent-selector-resolver.js +1 -28
  25. package/dist/agents/boot-upgrade.js +1 -59
  26. package/dist/agents/canonical-agent-manifest.js +1 -245
  27. package/dist/agents/canonical-agent-projection.js +1 -236
  28. package/dist/agents/manager-profile-overlay-service.js +1 -60
  29. package/dist/agents/profile-model-routing.js +1 -30
  30. package/dist/agents/renderers/claude-renderer.js +1 -82
  31. package/dist/agents/renderers/index.js +1 -14
  32. package/dist/agents/renderers/json-renderer.js +1 -104
  33. package/dist/agents/renderers/opencode-renderer.js +1 -113
  34. package/dist/agents/renderers/provider-adapter.js +1 -6
  35. package/dist/agents/repositories/agent-seed-history.js +1 -128
  36. package/dist/agents/repositories/agents.js +1 -200
  37. package/dist/agents/repositories/manager-profile-overlays.js +1 -90
  38. package/dist/agents/schema.js +1 -1
  39. package/dist/application/agents/agent-activation-service.js +261 -0
  40. package/dist/application/agents/agent-lookup-contexts.js +28 -0
  41. package/dist/application/agents/agent-registry-service.js +81 -0
  42. package/dist/application/agents/agent-resolver.js +287 -0
  43. package/dist/application/agents/agent-seed-service.js +157 -0
  44. package/dist/application/agents/agent-seed-upgrade-service.js +231 -0
  45. package/dist/application/agents/agent-selector-resolver.js +28 -0
  46. package/dist/application/agents/boot-upgrade.js +59 -0
  47. package/dist/application/agents/canonical-agent-projection.js +236 -0
  48. package/dist/application/agents/manager-profile-overlay-service.js +68 -0
  49. package/dist/application/agents/profile-model-routing.js +30 -0
  50. package/dist/application/agents/renderers/claude-renderer.js +1 -0
  51. package/dist/application/agents/renderers/index.js +14 -0
  52. package/dist/application/agents/renderers/json-renderer.js +1 -0
  53. package/dist/application/agents/renderers/opencode-renderer.js +1 -0
  54. package/dist/application/agents/renderers/provider-adapter.js +1 -0
  55. package/dist/application/memory/active-work-preview.js +75 -0
  56. package/dist/application/memory/agent-memory-capture-service.js +498 -0
  57. package/dist/application/memory/import/dry-run-planner.js +58 -0
  58. package/dist/application/memory/import/index.js +3 -0
  59. package/dist/application/memory/import/observation-writer.js +226 -0
  60. package/dist/application/memory/import/package.js +179 -0
  61. package/dist/application/memory/memory-service.js +202 -0
  62. package/dist/application/memory/search.js +11 -0
  63. package/dist/{mcp → application/provider-setup}/provider-change-plan.js +74 -13
  64. package/dist/{mcp → application/provider-setup}/provider-doctor.js +201 -31
  65. package/dist/{mcp → application/provider-setup}/provider-health-types.js +1 -1
  66. package/dist/{mcp → application/provider-setup}/provider-status.js +170 -33
  67. package/dist/application/runs/execution-planning.js +180 -0
  68. package/dist/application/runs/operation-execution.js +1 -0
  69. package/dist/application/runs/operation-retry.js +129 -0
  70. package/dist/application/runs/resume-after-approval-result.js +88 -0
  71. package/dist/application/runs/run-insights.js +270 -0
  72. package/dist/application/runs/run-service.js +1480 -0
  73. package/dist/application/runs/run-snapshot-export-service.js +31 -0
  74. package/dist/application/runs/sandbox-process-execution.js +244 -0
  75. package/dist/application/runs/sandbox-worktree-planning.js +59 -0
  76. package/dist/application/runs/task-scoped-command-grant-service.js +224 -0
  77. package/dist/application/sdd/artifact-portability-service.js +137 -0
  78. package/dist/application/sdd/cockpit-read-model.js +195 -0
  79. package/dist/application/sdd/sdd-continuation-plan.js +265 -0
  80. package/dist/application/sdd/sdd-workflow-service.js +892 -0
  81. package/dist/application/skills/boot-seed.js +42 -0
  82. package/dist/application/skills/personal-skills.js +41 -0
  83. package/dist/application/skills/skill-export-service.js +34 -0
  84. package/dist/application/skills/skill-index-service.js +126 -0
  85. package/dist/application/skills/skill-payload.js +186 -0
  86. package/dist/application/skills/skill-registry-service.js +648 -0
  87. package/dist/application/skills/skill-resolver.js +368 -0
  88. package/dist/application/skills/skill-seed-service.js +242 -0
  89. package/dist/application/skills/skill-status-service.js +147 -0
  90. package/dist/cli/bun-bin.js +0 -0
  91. package/dist/cli/cli-flags.js +1 -387
  92. package/dist/cli/cli-help.js +1 -173
  93. package/dist/cli/cli-helpers.js +1 -77
  94. package/dist/cli/cli-types.js +1 -1
  95. package/dist/cli/commands/agent-skill-dispatcher.js +1 -700
  96. package/dist/cli/commands/index.js +1 -9
  97. package/dist/cli/commands/interactive-entrypoint-dispatcher.js +1 -14
  98. package/dist/cli/commands/mcp-dispatcher.js +1 -232
  99. package/dist/cli/commands/memory-sdd-dispatcher.js +1 -367
  100. package/dist/cli/commands/run-permission-dispatcher.js +1 -455
  101. package/dist/cli/commands/setup-dispatcher.js +1 -496
  102. package/dist/cli/commands/status-dispatcher.js +1 -130
  103. package/dist/cli/commands/verification-dispatcher.js +1 -47
  104. package/dist/cli/commands/workflow-dispatcher.js +1 -566
  105. package/dist/cli/dispatcher.js +1 -247
  106. package/dist/cli/doctor-renderer.js +1 -26
  107. package/dist/cli/home-tui-app.js +1 -411
  108. package/dist/cli/home-tui-controller.js +1 -314
  109. package/dist/cli/mcp-start-path.js +1 -21
  110. package/dist/cli/product-resume-renderer.js +1 -32
  111. package/dist/cli/product-status-renderer.js +1 -81
  112. package/dist/cli/sdd-renderer.js +1 -247
  113. package/dist/cli/setup-plan-renderer.js +1 -79
  114. package/dist/cli/setup-status-renderer.js +1 -50
  115. package/dist/cli/setup-tui-app.js +1 -130
  116. package/dist/cli/setup-tui-controller.js +1 -89
  117. package/dist/cli/tui/focus-reducer.js +1 -0
  118. package/dist/cli/tui/focus-types.js +1 -0
  119. package/dist/cli/tui/ink/app-shell.js +1 -0
  120. package/dist/cli/tui/ink/components.js +1 -38
  121. package/dist/cli/tui/ink/help-overlay.js +1 -0
  122. package/dist/cli/tui/ink/state-components.js +1 -0
  123. package/dist/cli/tui/ink/theme.js +1 -36
  124. package/dist/cli/tui/key-intents.js +1 -0
  125. package/dist/cli/tui/keymap.js +1 -20
  126. package/dist/cli/tui/navigation.js +1 -10
  127. package/dist/cli/tui/screen-registry.js +1 -0
  128. package/dist/cli/tui/terminal-capabilities.js +1 -12
  129. package/dist/cli/tui/tui-types.js +1 -1
  130. package/dist/cli/tui/visual/badges.js +1 -19
  131. package/dist/cli/tui/visual/footer.js +1 -27
  132. package/dist/cli/tui/visual/index.js +1 -3
  133. package/dist/cli/tui/visual/viewport.js +1 -11
  134. package/dist/cli/tui-render-helpers.js +1 -200
  135. package/dist/cli/verification-plan-renderer.js +1 -25
  136. package/dist/cli/verification-report-renderer.js +1 -19
  137. package/dist/domain/agents/canonical-agent-manifest.js +355 -0
  138. package/dist/domain/agents/schema.js +1 -0
  139. package/dist/domain/memory/active-work-topics.js +64 -0
  140. package/dist/domain/memory/memory-capture-schema.js +1 -0
  141. package/dist/domain/memory/schema.js +1 -0
  142. package/dist/domain/runs/schema.js +5 -0
  143. package/dist/domain/sdd/cockpit-types.js +1 -0
  144. package/dist/domain/sdd/schema.js +111 -0
  145. package/dist/domain/skills/schema.js +1 -0
  146. package/dist/governance/risk-classifier.js +2 -0
  147. package/dist/interfaces/cli/bun-bin.js +46 -0
  148. package/dist/interfaces/cli/cli-flags.js +391 -0
  149. package/dist/interfaces/cli/cli-help.js +173 -0
  150. package/dist/interfaces/cli/cli-helpers.js +77 -0
  151. package/dist/interfaces/cli/cli-types.js +1 -0
  152. package/dist/interfaces/cli/commands/agent-skill-dispatcher.js +700 -0
  153. package/dist/interfaces/cli/commands/index.js +9 -0
  154. package/dist/interfaces/cli/commands/interactive-entrypoint-dispatcher.js +14 -0
  155. package/dist/interfaces/cli/commands/mcp-dispatcher.js +252 -0
  156. package/dist/interfaces/cli/commands/memory-sdd-dispatcher.js +367 -0
  157. package/dist/interfaces/cli/commands/run-permission-dispatcher.js +460 -0
  158. package/dist/interfaces/cli/commands/setup-dispatcher.js +496 -0
  159. package/dist/interfaces/cli/commands/status-dispatcher.js +130 -0
  160. package/dist/interfaces/cli/commands/verification-dispatcher.js +47 -0
  161. package/dist/interfaces/cli/commands/workflow-dispatcher.js +566 -0
  162. package/dist/interfaces/cli/dispatcher.js +247 -0
  163. package/dist/interfaces/cli/doctor-renderer.js +26 -0
  164. package/dist/interfaces/cli/home-tui-app.js +462 -0
  165. package/dist/interfaces/cli/home-tui-controller.js +341 -0
  166. package/dist/interfaces/cli/index.js +27 -0
  167. package/dist/interfaces/cli/mcp-start-path.js +21 -0
  168. package/dist/interfaces/cli/product-resume-renderer.js +32 -0
  169. package/dist/interfaces/cli/product-status-renderer.js +81 -0
  170. package/dist/interfaces/cli/sdd-renderer.js +247 -0
  171. package/dist/interfaces/cli/setup-plan-renderer.js +79 -0
  172. package/dist/interfaces/cli/setup-status-renderer.js +50 -0
  173. package/dist/interfaces/cli/setup-tui-app.js +135 -0
  174. package/dist/interfaces/cli/setup-tui-controller.js +89 -0
  175. package/dist/interfaces/cli/tui/focus-reducer.js +60 -0
  176. package/dist/interfaces/cli/tui/focus-types.js +10 -0
  177. package/dist/interfaces/cli/tui/ink/app-shell.js +16 -0
  178. package/dist/interfaces/cli/tui/ink/components.js +38 -0
  179. package/dist/interfaces/cli/tui/ink/help-overlay.js +6 -0
  180. package/dist/interfaces/cli/tui/ink/state-components.js +22 -0
  181. package/dist/interfaces/cli/tui/ink/theme.js +36 -0
  182. package/dist/interfaces/cli/tui/key-intents.js +33 -0
  183. package/dist/interfaces/cli/tui/keymap.js +20 -0
  184. package/dist/interfaces/cli/tui/navigation.js +10 -0
  185. package/dist/interfaces/cli/tui/screen-registry.js +43 -0
  186. package/dist/interfaces/cli/tui/terminal-capabilities.js +12 -0
  187. package/dist/interfaces/cli/tui/tui-types.js +1 -0
  188. package/dist/interfaces/cli/tui/visual/badges.js +19 -0
  189. package/dist/interfaces/cli/tui/visual/footer.js +27 -0
  190. package/dist/interfaces/cli/tui/visual/index.js +3 -0
  191. package/dist/interfaces/cli/tui/visual/viewport.js +11 -0
  192. package/dist/interfaces/cli/tui-render-helpers.js +200 -0
  193. package/dist/interfaces/cli/verification-plan-renderer.js +25 -0
  194. package/dist/interfaces/cli/verification-report-renderer.js +19 -0
  195. package/dist/interfaces/mcp/contracts/agents.js +1 -0
  196. package/dist/interfaces/mcp/contracts/context.js +1 -0
  197. package/dist/interfaces/mcp/contracts/governance.js +1 -0
  198. package/dist/interfaces/mcp/contracts/index.js +1 -0
  199. package/dist/interfaces/mcp/contracts/memory.js +1 -0
  200. package/dist/interfaces/mcp/contracts/providers.js +1 -0
  201. package/dist/interfaces/mcp/contracts/runs.js +1 -0
  202. package/dist/interfaces/mcp/contracts/sdd.js +1 -0
  203. package/dist/interfaces/mcp/contracts/sessions.js +1 -0
  204. package/dist/interfaces/mcp/contracts/skills.js +1 -0
  205. package/dist/interfaces/mcp/contracts/verification.js +1 -0
  206. package/dist/interfaces/mcp/control-plane/handlers/agents.js +38 -0
  207. package/dist/interfaces/mcp/control-plane/handlers/context.js +12 -0
  208. package/dist/interfaces/mcp/control-plane/handlers/memory.js +95 -0
  209. package/dist/interfaces/mcp/control-plane/handlers/providers.js +19 -0
  210. package/dist/interfaces/mcp/control-plane/handlers/runs.js +134 -0
  211. package/dist/interfaces/mcp/control-plane/handlers/sdd.js +225 -0
  212. package/dist/interfaces/mcp/control-plane/handlers/sessions.js +39 -0
  213. package/dist/interfaces/mcp/control-plane/handlers/skills.js +82 -0
  214. package/dist/interfaces/mcp/control-plane/handlers/verification.js +11 -0
  215. package/dist/interfaces/mcp/control-plane/types.js +1 -0
  216. package/dist/interfaces/mcp/control-plane.js +235 -0
  217. package/dist/interfaces/mcp/schema.js +174 -0
  218. package/dist/interfaces/mcp/schemas/common.js +121 -0
  219. package/dist/interfaces/mcp/schemas/inputs/agents.js +69 -0
  220. package/dist/interfaces/mcp/schemas/inputs/context.js +32 -0
  221. package/dist/interfaces/mcp/schemas/inputs/governance.js +23 -0
  222. package/dist/interfaces/mcp/schemas/inputs/index.js +10 -0
  223. package/dist/interfaces/mcp/schemas/inputs/memory.js +50 -0
  224. package/dist/interfaces/mcp/schemas/inputs/providers.js +35 -0
  225. package/dist/interfaces/mcp/schemas/inputs/runs.js +146 -0
  226. package/dist/interfaces/mcp/schemas/inputs/sdd.js +102 -0
  227. package/dist/interfaces/mcp/schemas/inputs/sessions.js +32 -0
  228. package/dist/interfaces/mcp/schemas/inputs/skills.js +231 -0
  229. package/dist/interfaces/mcp/schemas/inputs/verification.js +9 -0
  230. package/dist/interfaces/mcp/schemas/outputs/index.js +2 -0
  231. package/dist/interfaces/mcp/schemas/outputs/providers.js +28 -0
  232. package/dist/interfaces/mcp/schemas/outputs/sdd.js +166 -0
  233. package/dist/interfaces/mcp/stdio-server.js +116 -0
  234. package/dist/interfaces/mcp/validation/agents.js +189 -0
  235. package/dist/interfaces/mcp/validation/common.js +415 -0
  236. package/dist/interfaces/mcp/validation/governance.js +50 -0
  237. package/dist/interfaces/mcp/validation/memory.js +133 -0
  238. package/dist/interfaces/mcp/validation/providers.js +94 -0
  239. package/dist/interfaces/mcp/validation/runs.js +514 -0
  240. package/dist/interfaces/mcp/validation/sdd.js +247 -0
  241. package/dist/interfaces/mcp/validation/sessions.js +51 -0
  242. package/dist/interfaces/mcp/validation/skills.js +685 -0
  243. package/dist/interfaces/mcp/validation/verification.js +24 -0
  244. package/dist/interfaces/mcp/validation.js +149 -0
  245. package/dist/mcp/control-plane-snapshot-service.js +65 -2
  246. package/dist/mcp/control-plane.js +1 -646
  247. package/dist/mcp/doctor.js +1 -1
  248. package/dist/mcp/index.js +17 -17
  249. package/dist/mcp/schema.js +1 -1072
  250. package/dist/mcp/stdio-server.js +1 -116
  251. package/dist/mcp/validation.js +1 -2239
  252. package/dist/memory/active-work-preview.js +1 -75
  253. package/dist/memory/active-work-topics.js +1 -64
  254. package/dist/memory/agent-memory-capture-service.js +1 -497
  255. package/dist/memory/import/dry-run-planner.js +1 -58
  256. package/dist/memory/import/index.js +1 -3
  257. package/dist/memory/import/observation-writer.js +1 -226
  258. package/dist/memory/import/package.js +1 -179
  259. package/dist/memory/memory-capture-schema.js +1 -1
  260. package/dist/memory/memory-service.js +1 -201
  261. package/dist/memory/repositories/artifacts.js +1 -67
  262. package/dist/memory/repositories/observations.js +1 -217
  263. package/dist/memory/repositories/sessions.js +1 -125
  264. package/dist/memory/repositories/traces.js +1 -78
  265. package/dist/memory/schema.js +1 -1
  266. package/dist/memory/search.js +1 -11
  267. package/dist/memory/sqlite/database.js +1 -228
  268. package/dist/memory/storage-paths.js +1 -72
  269. package/dist/payload/context-budget-policy.js +10 -0
  270. package/dist/payload/context-budget-service.js +26 -0
  271. package/dist/payload/payload-diagnostics.js +50 -0
  272. package/dist/permissions/explicit-request-authorization.js +126 -0
  273. package/dist/permissions/policy-evaluator.js +54 -14
  274. package/dist/runs/execution-planning.js +1 -178
  275. package/dist/runs/operation-execution.js +1 -1
  276. package/dist/runs/operation-retry.js +1 -129
  277. package/dist/runs/repositories/runs.js +1 -676
  278. package/dist/runs/repositories/task-scoped-command-grants.js +1 -462
  279. package/dist/runs/resume-after-approval-result.js +1 -84
  280. package/dist/runs/run-insights.js +1 -270
  281. package/dist/runs/run-service.js +1 -1439
  282. package/dist/runs/run-snapshot-export-service.js +1 -31
  283. package/dist/runs/sandbox-process-execution.js +1 -240
  284. package/dist/runs/sandbox-worktree-planning.js +1 -59
  285. package/dist/runs/schema.js +1 -5
  286. package/dist/runs/task-scoped-command-grant-service.js +1 -216
  287. package/dist/sdd/artifact-portability-service.js +1 -137
  288. package/dist/sdd/cockpit-read-model.js +1 -195
  289. package/dist/sdd/cockpit-types.js +1 -1
  290. package/dist/sdd/schema.js +1 -111
  291. package/dist/sdd/sdd-continuation-plan.js +1 -265
  292. package/dist/sdd/sdd-workflow-service.js +1 -822
  293. package/dist/setup/providers/claude-setup-adapter.js +11 -4
  294. package/dist/setup/providers/opencode-setup-adapter.js +10 -7
  295. package/dist/setup/setup-plan.js +20 -7
  296. package/dist/skills/boot-seed.js +1 -42
  297. package/dist/skills/personal-skills.js +1 -41
  298. package/dist/skills/repositories/skill-evaluation-requests.js +1 -190
  299. package/dist/skills/repositories/skill-evaluation-scenarios.js +1 -305
  300. package/dist/skills/repositories/skill-improvement-proposals.js +1 -355
  301. package/dist/skills/repositories/skills.js +1 -1077
  302. package/dist/skills/schema.js +1 -1
  303. package/dist/skills/skill-export-service.js +1 -34
  304. package/dist/skills/skill-index-service.js +1 -126
  305. package/dist/skills/skill-payload.js +1 -186
  306. package/dist/skills/skill-registry-service.js +1 -644
  307. package/dist/skills/skill-resolver.js +1 -368
  308. package/dist/skills/skill-seed-service.js +1 -242
  309. package/dist/skills/skill-status-service.js +1 -147
  310. package/dist/storage/agents/repositories/agent-seed-history.js +128 -0
  311. package/dist/storage/agents/repositories/agents.js +200 -0
  312. package/dist/storage/agents/repositories/manager-profile-overlays.js +90 -0
  313. package/dist/storage/memory/repositories/artifacts.js +67 -0
  314. package/dist/storage/memory/repositories/observations.js +217 -0
  315. package/dist/storage/memory/repositories/sessions.js +125 -0
  316. package/dist/storage/memory/repositories/traces.js +78 -0
  317. package/dist/storage/memory/sqlite/database.js +228 -0
  318. package/dist/storage/memory/storage-paths.js +72 -0
  319. package/dist/storage/runs/repositories/runs.js +676 -0
  320. package/dist/storage/runs/repositories/task-scoped-command-grants.js +464 -0
  321. package/dist/storage/skills/repositories/skill-evaluation-requests.js +190 -0
  322. package/dist/storage/skills/repositories/skill-evaluation-scenarios.js +305 -0
  323. package/dist/storage/skills/repositories/skill-improvement-proposals.js +355 -0
  324. package/dist/storage/skills/repositories/skills.js +1084 -0
  325. package/docs/architecture.md +2 -2
  326. package/docs/glossary.md +1 -1
  327. package/docs/mcp.md +1 -1
  328. package/docs/module-boundaries.md +114 -0
  329. package/docs/prd.md +1 -1
  330. package/docs/project-health-audit-v1.10.x.md +1 -1
  331. package/docs/providers.md +2 -2
  332. package/docs/safety.md +3 -3
  333. package/docs/sdd/archive/2026-06-26-ambitious-structure-reorganization/apply-progress.md +122 -0
  334. package/docs/sdd/archive/2026-06-26-ambitious-structure-reorganization/archive-report.md +61 -0
  335. package/docs/sdd/archive/2026-06-26-ambitious-structure-reorganization/design.md +66 -0
  336. package/docs/sdd/archive/2026-06-26-ambitious-structure-reorganization/proposal.md +79 -0
  337. package/docs/sdd/archive/2026-06-26-ambitious-structure-reorganization/spec.md +67 -0
  338. package/docs/sdd/archive/2026-06-26-ambitious-structure-reorganization/tasks.md +63 -0
  339. package/docs/sdd/archive/2026-06-26-ambitious-structure-reorganization/verify-report.md +71 -0
  340. package/docs/sdd/archive/2026-06-26-legacy-facade-cleanup/apply-progress.md +68 -0
  341. package/docs/sdd/archive/2026-06-26-legacy-facade-cleanup/archive-report.md +61 -0
  342. package/docs/sdd/archive/2026-06-26-legacy-facade-cleanup/design.md +43 -0
  343. package/docs/sdd/archive/2026-06-26-legacy-facade-cleanup/proposal.md +61 -0
  344. package/docs/sdd/archive/2026-06-26-legacy-facade-cleanup/spec.md +31 -0
  345. package/docs/sdd/archive/2026-06-26-legacy-facade-cleanup/tasks.md +27 -0
  346. package/docs/sdd/archive/2026-06-26-legacy-facade-cleanup/verify-report.md +58 -0
  347. package/docs/sdd/archive/2026-06-26-provider-install-adapter-boundary/apply-progress.md +65 -0
  348. package/docs/sdd/archive/2026-06-26-provider-install-adapter-boundary/archive-report.md +53 -0
  349. package/docs/sdd/archive/2026-06-26-provider-install-adapter-boundary/design.md +64 -0
  350. package/docs/sdd/archive/2026-06-26-provider-install-adapter-boundary/proposal.md +62 -0
  351. package/docs/sdd/archive/2026-06-26-provider-install-adapter-boundary/spec.md +51 -0
  352. package/docs/sdd/archive/2026-06-26-provider-install-adapter-boundary/tasks.md +50 -0
  353. package/docs/sdd/archive/2026-06-26-provider-install-adapter-boundary/verify-report.md +66 -0
  354. package/docs/storage.md +2 -2
  355. package/package.json +2 -2
  356. /package/dist/{mcp → adapters/claude/install}/claude-code-cli.js +0 -0
  357. /package/dist/{memory → storage/memory}/sqlite/migrations/001_initial.sql +0 -0
  358. /package/dist/{memory → storage/memory}/sqlite/migrations/002_observation_revisions.sql +0 -0
  359. /package/dist/{memory → storage/memory}/sqlite/migrations/003_agent_registry.sql +0 -0
  360. /package/dist/{memory → storage/memory}/sqlite/migrations/004_run_runtime.sql +0 -0
  361. /package/dist/{memory → storage/memory}/sqlite/migrations/005_run_approvals.sql +0 -0
  362. /package/dist/{memory → storage/memory}/sqlite/migrations/006_run_operation_attempts.sql +0 -0
  363. /package/dist/{memory → storage/memory}/sqlite/migrations/007_abandoned_operation_attempts.sql +0 -0
  364. /package/dist/{memory → storage/memory}/sqlite/migrations/008_run_execution_plan_events.sql +0 -0
  365. /package/dist/{memory → storage/memory}/sqlite/migrations/009_multiple_operation_attempts.sql +0 -0
  366. /package/dist/{memory → storage/memory}/sqlite/migrations/010_skill_registry.sql +0 -0
  367. /package/dist/{memory → storage/memory}/sqlite/migrations/011_skill_usage_resolution_outcomes.sql +0 -0
  368. /package/dist/{memory → storage/memory}/sqlite/migrations/012_skill_improvement_proposals.sql +0 -0
  369. /package/dist/{memory → storage/memory}/sqlite/migrations/013_skill_evaluation_scenarios.sql +0 -0
  370. /package/dist/{memory → storage/memory}/sqlite/migrations/014_manager_profile_overlays.sql +0 -0
  371. /package/dist/{memory → storage/memory}/sqlite/migrations/015_artifact_metadata.sql +0 -0
  372. /package/dist/{memory → storage/memory}/sqlite/migrations/016_agent_seed_history.sql +0 -0
  373. /package/dist/{memory → storage/memory}/sqlite/migrations/017_intent_signal_skill_targets.sql +0 -0
  374. /package/dist/{memory → storage/memory}/sqlite/migrations/018_skill_system_v2.sql +0 -0
  375. /package/dist/{memory → storage/memory}/sqlite/migrations/019_task_scoped_command_grants.sql +0 -0
@@ -0,0 +1,82 @@
1
+ import { canonicalBehaviorContractVersion } from '../../behavior/behavior-contract-manifest.js';
2
+ import { canonicalPromptContractVersion } from '../../domain/agents/canonical-agent-manifest.js';
3
+ import { ok, validationFailure } from '../provider-renderer.js';
4
+ const previewWarnings = [
5
+ 'Claude rendering returns installable preview artifacts only; it does not install and does not write provider configuration.',
6
+ 'VGX does not execute Claude or run Claude Code from this preview.',
7
+ 'VGXNESS does not install Claude Code or write provider configuration from renderer previews; project-root CLAUDE.md is only managed by confirmed/preflighted Claude project install.',
8
+ 'VGX does not guarantee exact Claude Code configuration compatibility; this output is a neutral preview only.',
9
+ ];
10
+ const _previewSafety = {
11
+ executesProvider: false,
12
+ writesProviderConfig: false,
13
+ installable: true,
14
+ previewOnly: true,
15
+ };
16
+ const claudeCapabilities = {
17
+ supportedAgentFields: ['name', 'description', 'instructions', 'mode', 'adapter model', 'adapter profile', 'permissions', 'memory', 'skills'],
18
+ skillInjectionModes: ['included as neutral skill identifiers in preview output'],
19
+ permissionCategories: ['included as registry permission metadata in preview output'],
20
+ memoryInjectionModes: ['included as registry memory metadata in preview output'],
21
+ delegationModel: 'registry agents and subagents are represented in preview output without executing Claude delegation',
22
+ lifecycleHooks: ['preview render/export only; confirmed install is handled by MCP install service'],
23
+ configFileLocations: ['rendered/claude/.../.mcp.json', 'rendered/claude/.../.claude/agents/*.md'],
24
+ limitations: [
25
+ 'Preview artifacts only; does not execute Claude or Claude Code.',
26
+ 'Does not install Claude Code or provider tooling.',
27
+ 'Renderer preview does not write .claude/, CLAUDE.md, or provider configuration.',
28
+ 'Confirmed apply writes only project .mcp.json, .claude/agents/*.md, and the project-root CLAUDE.md managed block.',
29
+ 'Claude Code compatibility can drift; validate with provider doctor after confirmed install.',
30
+ ],
31
+ render: {
32
+ format: 'claude-code-project-preview',
33
+ artifactContentTypes: ['application/json', 'text/markdown'],
34
+ installable: true,
35
+ previewOnly: true,
36
+ },
37
+ };
38
+ export class ClaudeAgentRenderer {
39
+ provider = 'claude';
40
+ capabilities = claudeCapabilities;
41
+ render(input) {
42
+ const agents = [input.agent, ...(input.subagents ?? [])];
43
+ const artifacts = [
44
+ {
45
+ relativePath: `rendered/claude/${pathSegment(input.agent.project)}/${input.agent.scope}/${pathSegment(input.agent.name)}/.mcp.json`,
46
+ contentType: 'application/json',
47
+ contents: `${JSON.stringify({ mcpServers: { vgxness: { type: 'stdio', command: 'vgxness', args: ['mcp', 'start'] } } }, null, 2)}\n`,
48
+ },
49
+ ];
50
+ const renderedKeys = new Set();
51
+ for (const agent of agents) {
52
+ const key = claudeAgentKey(agent.name);
53
+ if (renderedKeys.has(key))
54
+ return validationFailure(`Rendered Claude agent key collision: ${key}`);
55
+ renderedKeys.add(key);
56
+ artifacts.push({
57
+ relativePath: `rendered/claude/${pathSegment(input.agent.project)}/${input.agent.scope}/${pathSegment(input.agent.name)}/.claude/agents/${key}.md`,
58
+ contentType: 'text/markdown',
59
+ contents: renderClaudeAgentMarkdown(agent, key),
60
+ });
61
+ }
62
+ return ok({
63
+ provider: this.provider,
64
+ installable: true,
65
+ artifacts,
66
+ warnings: previewWarnings,
67
+ });
68
+ }
69
+ }
70
+ function renderClaudeAgentMarkdown(agent, key) {
71
+ return `---\nname: ${JSON.stringify(key)}\ndescription: ${JSON.stringify(agent.description)}\n---\n\n<!-- VGXNESS-GENERATED claude-code-provider-support provider=claude artifact=claude-code-subagent promptContractVersion=${canonicalPromptContractVersion} behaviorContractVersion=${canonicalBehaviorContractVersion} safe-update=true -->\n\n${agent.instructions.value.trim()}\n`;
72
+ }
73
+ function claudeAgentKey(value) {
74
+ return pathSegment(value);
75
+ }
76
+ function pathSegment(value) {
77
+ return (value
78
+ .trim()
79
+ .toLowerCase()
80
+ .replace(/[^a-z0-9._-]+/g, '-')
81
+ .replace(/^-+|-+$/g, '') || 'unnamed');
82
+ }
@@ -1,7 +1,7 @@
1
1
  import { existsSync, readFileSync } from 'node:fs';
2
2
  import { homedir } from 'node:os';
3
3
  import { join, parse, resolve } from 'node:path';
4
- import { projectCanonicalAgentManifestToClaudeCode } from '../agents/canonical-agent-projection.js';
4
+ import { projectCanonicalAgentManifestToClaudeCode } from '../../../agents/canonical-agent-projection.js';
5
5
  import { assertInsideWorkspace } from './claude-code-config.js';
6
6
  export const claudeCodeGeneratedMarker = 'VGXNESS-GENERATED';
7
7
  export function expectedClaudeCodeAgentFiles(input) {
@@ -18,13 +18,28 @@ export function renderClaudeCodeAgentMarkdown(agent) {
18
18
  }
19
19
  export function inspectClaudeCodeAgents(input) {
20
20
  const target = typeof input === 'string' ? resolveClaudeAgentTarget({ workspaceRoot: input, scope: 'project' }) : resolveClaudeAgentTarget(input);
21
- const expected = expectedClaudeCodeAgentFiles({ workspaceRoot: target.workspaceRoot, scope: target.scope, ...(target.env === undefined ? {} : { env: target.env }) });
22
- return { scope: target.scope, directoryPath: target.directoryPath, directoryExists: existsSync(target.directoryPath), external: target.scope === 'user', agents: expected.map(inspectAgent) };
21
+ const expected = expectedClaudeCodeAgentFiles({
22
+ workspaceRoot: target.workspaceRoot,
23
+ scope: target.scope,
24
+ ...(target.env === undefined ? {} : { env: target.env }),
25
+ });
26
+ return {
27
+ scope: target.scope,
28
+ directoryPath: target.directoryPath,
29
+ directoryExists: existsSync(target.directoryPath),
30
+ external: target.scope === 'user',
31
+ agents: expected.map(inspectAgent),
32
+ };
23
33
  }
24
34
  export function resolveClaudeAgentTarget(input) {
25
35
  const scope = input.scope ?? 'project';
26
36
  if (scope === 'project')
27
- return { workspaceRoot: input.workspaceRoot, scope, directoryPath: join(input.workspaceRoot, '.claude', 'agents'), ...(input.env === undefined ? {} : { env: input.env }) };
37
+ return {
38
+ workspaceRoot: input.workspaceRoot,
39
+ scope,
40
+ directoryPath: join(input.workspaceRoot, '.claude', 'agents'),
41
+ ...(input.env === undefined ? {} : { env: input.env }),
42
+ };
28
43
  const home = safeHomeDirectory(input.env);
29
44
  return { workspaceRoot: input.workspaceRoot, scope, directoryPath: join(home, '.claude', 'agents'), ...(input.env === undefined ? {} : { env: input.env }) };
30
45
  }
@@ -67,7 +82,15 @@ export function parseClaudeAgentFrontmatter(contents) {
67
82
  }
68
83
  function inspectAgent(agent) {
69
84
  if (!existsSync(agent.path))
70
- return { agentName: agent.name, path: agent.path, exists: false, status: 'missing', frontmatter: 'missing', generatedMarker: false, detail: 'Expected Claude agent file is missing.' };
85
+ return {
86
+ agentName: agent.name,
87
+ path: agent.path,
88
+ exists: false,
89
+ status: 'missing',
90
+ frontmatter: 'missing',
91
+ generatedMarker: false,
92
+ detail: 'Expected Claude agent file is missing.',
93
+ };
71
94
  try {
72
95
  const contents = readFileSync(agent.path, 'utf8');
73
96
  const frontmatter = parseClaudeAgentFrontmatter(contents);
@@ -75,14 +98,46 @@ function inspectAgent(agent) {
75
98
  if (!frontmatter.ok)
76
99
  return { agentName: agent.name, path: agent.path, exists: true, status: 'invalid', frontmatter: 'invalid', generatedMarker, detail: frontmatter.reason };
77
100
  if (frontmatter.data.name !== agent.name)
78
- return { agentName: agent.name, path: agent.path, exists: true, status: 'conflicting', frontmatter: 'valid', generatedMarker, detail: `Frontmatter name ${frontmatter.data.name} does not match expected ${agent.name}.` };
101
+ return {
102
+ agentName: agent.name,
103
+ path: agent.path,
104
+ exists: true,
105
+ status: 'conflicting',
106
+ frontmatter: 'valid',
107
+ generatedMarker,
108
+ detail: `Frontmatter name ${frontmatter.data.name} does not match expected ${agent.name}.`,
109
+ };
79
110
  if (!generatedMarker)
80
- return { agentName: agent.name, path: agent.path, exists: true, status: 'conflicting', frontmatter: 'valid', generatedMarker, detail: 'Existing agent file is not marked as VGXNESS-generated.' };
81
- return { agentName: agent.name, path: agent.path, exists: true, status: 'managed', frontmatter: 'valid', generatedMarker, detail: 'Claude agent file is VGXNESS-managed.' };
111
+ return {
112
+ agentName: agent.name,
113
+ path: agent.path,
114
+ exists: true,
115
+ status: 'conflicting',
116
+ frontmatter: 'valid',
117
+ generatedMarker,
118
+ detail: 'Existing agent file is not marked as VGXNESS-generated.',
119
+ };
120
+ return {
121
+ agentName: agent.name,
122
+ path: agent.path,
123
+ exists: true,
124
+ status: 'managed',
125
+ frontmatter: 'valid',
126
+ generatedMarker,
127
+ detail: 'Claude agent file is VGXNESS-managed.',
128
+ };
82
129
  }
83
130
  catch (cause) {
84
131
  const message = cause instanceof Error ? cause.message : String(cause);
85
- return { agentName: agent.name, path: agent.path, exists: true, status: 'invalid', frontmatter: 'invalid', generatedMarker: false, detail: `Unable to read Claude agent file: ${message}` };
132
+ return {
133
+ agentName: agent.name,
134
+ path: agent.path,
135
+ exists: true,
136
+ status: 'invalid',
137
+ frontmatter: 'invalid',
138
+ generatedMarker: false,
139
+ detail: `Unable to read Claude agent file: ${message}`,
140
+ };
86
141
  }
87
142
  }
88
143
  function yamlScalar(value) {
@@ -1,6 +1,6 @@
1
1
  import { existsSync, readFileSync } from 'node:fs';
2
2
  import { join, relative, resolve } from 'node:path';
3
- import { providerConfigPathDiagnostics } from './provider-health-types.js';
3
+ import { providerConfigPathDiagnostics, } from '../../../application/provider-setup/provider-health-types.js';
4
4
  export function resolveClaudeCodeMcpJsonPath(workspaceRoot) {
5
5
  const target = resolve(workspaceRoot, '.mcp.json');
6
6
  assertInsideWorkspace(workspaceRoot, target);
@@ -19,7 +19,8 @@ export function isManagedClaudeArgs(value) {
19
19
  if (!Array.isArray(value) || !value.every((item) => typeof item === 'string'))
20
20
  return false;
21
21
  const dbPath = value[3];
22
- return arraysEqual(value, ['mcp', 'start']) || (value.length === 4 && value[0] === 'mcp' && value[1] === 'start' && value[2] === '--db' && typeof dbPath === 'string' && dbPath.trim().length > 0);
22
+ return (arraysEqual(value, ['mcp', 'start']) ||
23
+ (value.length === 4 && value[0] === 'mcp' && value[1] === 'start' && value[2] === '--db' && typeof dbPath === 'string' && dbPath.trim().length > 0));
23
24
  }
24
25
  export function inspectClaudeCodeMcpConfig(workspaceRoot) {
25
26
  const path = resolveClaudeCodeMcpJsonPath(workspaceRoot);
@@ -34,10 +35,31 @@ export function inspectClaudeCodeMcpConfig(workspaceRoot) {
34
35
  }
35
36
  const entry = isRecord(parsed.mcpServers) ? parsed.mcpServers.vgxness : undefined;
36
37
  if (entry === undefined)
37
- return { status: 'stale', path, exists: true, parsed: true, config: parsed, message: 'Claude project .mcp.json is readable but mcpServers.vgxness is missing.' };
38
+ return {
39
+ status: 'stale',
40
+ path,
41
+ exists: true,
42
+ parsed: true,
43
+ config: parsed,
44
+ message: 'Claude project .mcp.json is readable but mcpServers.vgxness is missing.',
45
+ };
38
46
  if (isManagedClaudeCodeMcpServer(entry))
39
- return { status: 'configured', path, exists: true, parsed: true, config: parsed, message: 'Claude project .mcp.json has a managed mcpServers.vgxness entry.' };
40
- return { status: 'conflicting', path, exists: true, parsed: true, config: parsed, message: 'Claude project .mcp.json has a conflicting mcpServers.vgxness entry.' };
47
+ return {
48
+ status: 'configured',
49
+ path,
50
+ exists: true,
51
+ parsed: true,
52
+ config: parsed,
53
+ message: 'Claude project .mcp.json has a managed mcpServers.vgxness entry.',
54
+ };
55
+ return {
56
+ status: 'conflicting',
57
+ path,
58
+ exists: true,
59
+ parsed: true,
60
+ config: parsed,
61
+ message: 'Claude project .mcp.json has a conflicting mcpServers.vgxness entry.',
62
+ };
41
63
  }
42
64
  catch (cause) {
43
65
  const message = cause instanceof Error ? cause.message : String(cause);
@@ -72,7 +94,7 @@ export function assertInsideWorkspace(workspaceRoot, targetPath) {
72
94
  const root = resolve(workspaceRoot);
73
95
  const target = resolve(targetPath);
74
96
  const rel = relative(root, target);
75
- if (rel === '..' || rel.startsWith(`..${process.platform === 'win32' ? '\\' : '/'}`) || rel === '' && target !== root)
97
+ if (rel === '..' || rel.startsWith(`..${process.platform === 'win32' ? '\\' : '/'}`) || (rel === '' && target !== root))
76
98
  throw new Error(`Target path is outside workspace root: ${targetPath}`);
77
99
  }
78
100
  export function claudeAdvisoryPaths(workspaceRoot) {
@@ -1,6 +1,6 @@
1
1
  import { existsSync, readFileSync } from 'node:fs';
2
2
  import { resolve } from 'node:path';
3
- import { projectCanonicalAgentManifestToClaudeProjectMemory } from '../agents/canonical-agent-projection.js';
3
+ import { projectCanonicalAgentManifestToClaudeProjectMemory } from '../../../agents/canonical-agent-projection.js';
4
4
  import { assertInsideWorkspace } from './claude-code-config.js';
5
5
  export const claudeProjectMemoryBeginMarker = '<!-- BEGIN VGXNESS-MANAGED CLAUDE PROJECT MEMORY -->';
6
6
  export const claudeProjectMemoryEndMarker = '<!-- END VGXNESS-MANAGED CLAUDE PROJECT MEMORY -->';
@@ -47,7 +47,15 @@ export function inspectClaudeProjectMemory(workspaceRoot) {
47
47
  const beginCount = countOccurrences(contents, claudeProjectMemoryBeginMarker);
48
48
  const endCount = countOccurrences(contents, claudeProjectMemoryEndMarker);
49
49
  if (beginCount === 0 && endCount === 0)
50
- return { status: 'unmanaged', path, exists: true, action: 'append-managed-block', backupRequired: true, message: 'Claude project memory exists without a VGXNESS managed block; future apply would append one after backup.', contents };
50
+ return {
51
+ status: 'unmanaged',
52
+ path,
53
+ exists: true,
54
+ action: 'append-managed-block',
55
+ backupRequired: true,
56
+ message: 'Claude project memory exists without a VGXNESS managed block; future apply would append one after backup.',
57
+ contents,
58
+ };
51
59
  if (beginCount === 0)
52
60
  return blocked(path, true, 'missing_begin_marker', 'Claude project memory has an end marker without a begin marker.');
53
61
  if (endCount === 0)
@@ -71,8 +79,27 @@ export function inspectClaudeProjectMemory(workspaceRoot) {
71
79
  const expected = renderClaudeProjectMemoryBlock();
72
80
  const actual = contents.slice(start, end);
73
81
  if (actual === expected)
74
- return { status: 'managed-current', path, exists: true, action: 'none', backupRequired: false, message: 'Claude project memory has the current VGXNESS managed block.', blockRange: { start, end }, contents };
75
- return { status: 'managed-stale', path, exists: true, action: 'update-managed-block', backupRequired: true, message: 'Claude project memory has a stale VGXNESS managed block; future apply would update only that block after backup.', blockRange: { start, end }, staleReasons: ['managed_block_differs_from_canonical_render'], contents };
82
+ return {
83
+ status: 'managed-current',
84
+ path,
85
+ exists: true,
86
+ action: 'none',
87
+ backupRequired: false,
88
+ message: 'Claude project memory has the current VGXNESS managed block.',
89
+ blockRange: { start, end },
90
+ contents,
91
+ };
92
+ return {
93
+ status: 'managed-stale',
94
+ path,
95
+ exists: true,
96
+ action: 'update-managed-block',
97
+ backupRequired: true,
98
+ message: 'Claude project memory has a stale VGXNESS managed block; future apply would update only that block after backup.',
99
+ blockRange: { start, end },
100
+ staleReasons: ['managed_block_differs_from_canonical_render'],
101
+ contents,
102
+ };
76
103
  }
77
104
  export function mergeClaudeProjectMemory(state) {
78
105
  const block = renderClaudeProjectMemoryBlock();
@@ -83,7 +110,10 @@ export function mergeClaudeProjectMemory(state) {
83
110
  return { ok: true, value: { path: state.path, contents: `${state.contents}${separator}${block}\n` } };
84
111
  }
85
112
  if (state.status === 'managed-stale')
86
- return { ok: true, value: { path: state.path, contents: state.contents.slice(0, state.blockRange.start) + block + state.contents.slice(state.blockRange.end) } };
113
+ return {
114
+ ok: true,
115
+ value: { path: state.path, contents: state.contents.slice(0, state.blockRange.start) + block + state.contents.slice(state.blockRange.end) },
116
+ };
87
117
  if (state.status === 'managed-current')
88
118
  return { ok: true, value: { path: state.path, contents: state.contents } };
89
119
  return { ok: false, error: { code: 'validation_failed', message: state.message } };
@@ -1,17 +1,26 @@
1
1
  export const claudeCodeCanonicalScopes = ['local', 'project', 'user'];
2
2
  export function resolveClaudeCodeScope(input, fallback = 'project') {
3
3
  if (input !== undefined && input.trim().length === 0)
4
- return { ok: false, error: { code: 'validation_failed', message: '--scope for Claude must be local, project, or user (compatibility aliases: personal, global).' } };
4
+ return {
5
+ ok: false,
6
+ error: { code: 'validation_failed', message: '--scope for Claude must be local, project, or user (compatibility aliases: personal, global).' },
7
+ };
5
8
  const raw = input?.trim() || fallback;
6
9
  if (raw === 'local' || raw === 'project' || raw === 'user')
7
10
  return { ok: true, value: { canonical: raw, input: raw, warnings: [] } };
8
11
  if (raw === 'personal') {
9
- return { ok: true, value: { canonical: 'user', input: raw, warnings: ['Claude Code scope `personal` is accepted for VGXNESS compatibility and maps to Claude `user`.'] } };
12
+ return {
13
+ ok: true,
14
+ value: { canonical: 'user', input: raw, warnings: ['Claude Code scope `personal` is accepted for VGXNESS compatibility and maps to Claude `user`.'] },
15
+ };
10
16
  }
11
17
  if (raw === 'global') {
12
18
  return { ok: true, value: { canonical: 'user', input: raw, warnings: ['Claude Code legacy scope `global` is deprecated and maps to Claude `user`.'] } };
13
19
  }
14
- return { ok: false, error: { code: 'validation_failed', message: '--scope for Claude must be local, project, or user (compatibility aliases: personal, global).' } };
20
+ return {
21
+ ok: false,
22
+ error: { code: 'validation_failed', message: '--scope for Claude must be local, project, or user (compatibility aliases: personal, global).' },
23
+ };
15
24
  }
16
25
  export function isClaudeCodeUserScope(scope) {
17
26
  return scope === 'user';
@@ -1,8 +1,8 @@
1
1
  import { existsSync, readFileSync } from 'node:fs';
2
2
  import { join } from 'node:path';
3
- import { providerConfigPathDiagnostics } from './provider-health-types.js';
4
- import { isManagedClaudeCodeMcpServer } from './claude-code-config.js';
3
+ import { providerConfigPathDiagnostics, } from '../../../application/provider-setup/provider-health-types.js';
5
4
  import { safeHomeDirectory } from './claude-code-agent-config.js';
5
+ import { isManagedClaudeCodeMcpServer } from './claude-code-config.js';
6
6
  export function resolveClaudeCodeUserMcpJsonPath(env = process.env) {
7
7
  return join(safeHomeDirectory(env), '.claude.json');
8
8
  }
@@ -18,10 +18,31 @@ export function inspectClaudeCodeUserMcpConfig(env = process.env) {
18
18
  return { status: 'invalid', path, exists: true, parsed: false, message: 'Claude user ~/.claude.json mcpServers must be a JSON object.' };
19
19
  const entry = isRecord(parsed.mcpServers) ? parsed.mcpServers.vgxness : undefined;
20
20
  if (entry === undefined)
21
- return { status: 'stale', path, exists: true, parsed: true, config: parsed, message: 'Claude user ~/.claude.json is readable but mcpServers.vgxness is missing.' };
21
+ return {
22
+ status: 'stale',
23
+ path,
24
+ exists: true,
25
+ parsed: true,
26
+ config: parsed,
27
+ message: 'Claude user ~/.claude.json is readable but mcpServers.vgxness is missing.',
28
+ };
22
29
  if (isManagedClaudeCodeMcpServer(entry))
23
- return { status: 'configured', path, exists: true, parsed: true, config: parsed, message: 'Claude user ~/.claude.json has a managed mcpServers.vgxness entry.' };
24
- return { status: 'conflicting', path, exists: true, parsed: true, config: parsed, message: 'Claude user ~/.claude.json has a conflicting mcpServers.vgxness entry.' };
30
+ return {
31
+ status: 'configured',
32
+ path,
33
+ exists: true,
34
+ parsed: true,
35
+ config: parsed,
36
+ message: 'Claude user ~/.claude.json has a managed mcpServers.vgxness entry.',
37
+ };
38
+ return {
39
+ status: 'conflicting',
40
+ path,
41
+ exists: true,
42
+ parsed: true,
43
+ config: parsed,
44
+ message: 'Claude user ~/.claude.json has a conflicting mcpServers.vgxness entry.',
45
+ };
25
46
  }
26
47
  catch (cause) {
27
48
  const message = cause instanceof Error ? cause.message : String(cause);
@@ -1,6 +1,6 @@
1
1
  import { existsSync, readFileSync } from 'node:fs';
2
2
  import { join } from 'node:path';
3
- import { projectCanonicalAgentManifestToClaudeProjectMemory } from '../agents/canonical-agent-projection.js';
3
+ import { projectCanonicalAgentManifestToClaudeProjectMemory } from '../../../agents/canonical-agent-projection.js';
4
4
  import { safeHomeDirectory } from './claude-code-agent-config.js';
5
5
  export const claudeUserMemoryBeginMarker = '<!-- BEGIN VGXNESS-MANAGED CLAUDE USER MEMORY -->';
6
6
  export const claudeUserMemoryEndMarker = '<!-- END VGXNESS-MANAGED CLAUDE USER MEMORY -->';
@@ -25,7 +25,14 @@ export function renderClaudeUserMemoryBlock() {
25
25
  export function inspectClaudeUserMemory(env = process.env) {
26
26
  const path = resolveClaudeUserMemoryPath(env);
27
27
  if (!existsSync(path))
28
- return { status: 'missing', path, exists: false, action: 'create', backupRequired: false, message: 'Claude user memory ~/.claude/CLAUDE.md does not exist.' };
28
+ return {
29
+ status: 'missing',
30
+ path,
31
+ exists: false,
32
+ action: 'create',
33
+ backupRequired: false,
34
+ message: 'Claude user memory ~/.claude/CLAUDE.md does not exist.',
35
+ };
29
36
  let contents;
30
37
  try {
31
38
  const bytes = readFileSync(path);
@@ -39,7 +46,15 @@ export function inspectClaudeUserMemory(env = process.env) {
39
46
  const beginCount = countOccurrences(contents, claudeUserMemoryBeginMarker);
40
47
  const endCount = countOccurrences(contents, claudeUserMemoryEndMarker);
41
48
  if (beginCount === 0 && endCount === 0)
42
- return { status: 'unmanaged', path, exists: true, action: 'append-managed-block', backupRequired: true, message: 'Claude user memory exists without a VGXNESS managed block; apply would append one after backup.', contents };
49
+ return {
50
+ status: 'unmanaged',
51
+ path,
52
+ exists: true,
53
+ action: 'append-managed-block',
54
+ backupRequired: true,
55
+ message: 'Claude user memory exists without a VGXNESS managed block; apply would append one after backup.',
56
+ contents,
57
+ };
43
58
  if (beginCount === 0)
44
59
  return blocked(path, true, 'missing_begin_marker', 'Claude user memory has an end marker without a begin marker.');
45
60
  if (endCount === 0)
@@ -54,13 +69,35 @@ export function inspectClaudeUserMemory(env = process.env) {
54
69
  const inner = contents.slice(start + claudeUserMemoryBeginMarker.length, endMarkerStart);
55
70
  if (inner.includes(claudeUserMemoryBeginMarker) || inner.includes(claudeUserMemoryEndMarker))
56
71
  return blocked(path, true, 'nested_markers', 'Claude user memory has nested VGXNESS managed-block markers.');
57
- if (!inner.includes('owner=vgxness') || !inner.includes('provider=claude') || !inner.includes('artifact=claude-user-memory') || !inner.includes('safe-update=true'))
72
+ if (!inner.includes('owner=vgxness') ||
73
+ !inner.includes('provider=claude') ||
74
+ !inner.includes('artifact=claude-user-memory') ||
75
+ !inner.includes('safe-update=true'))
58
76
  return blocked(path, true, 'conflicting_ownership', 'Claude user memory managed block is not a VGXNESS-owned user-memory block.');
59
77
  const expected = renderClaudeUserMemoryBlock();
60
78
  const actual = contents.slice(start, end);
61
79
  if (actual === expected)
62
- return { status: 'managed-current', path, exists: true, action: 'none', backupRequired: false, message: 'Claude user memory has the current VGXNESS managed block.', blockRange: { start, end }, contents };
63
- return { status: 'managed-stale', path, exists: true, action: 'update-managed-block', backupRequired: true, message: 'Claude user memory has a stale VGXNESS managed block; apply would update only that block after backup.', blockRange: { start, end }, staleReasons: ['managed_block_differs_from_canonical_render'], contents };
80
+ return {
81
+ status: 'managed-current',
82
+ path,
83
+ exists: true,
84
+ action: 'none',
85
+ backupRequired: false,
86
+ message: 'Claude user memory has the current VGXNESS managed block.',
87
+ blockRange: { start, end },
88
+ contents,
89
+ };
90
+ return {
91
+ status: 'managed-stale',
92
+ path,
93
+ exists: true,
94
+ action: 'update-managed-block',
95
+ backupRequired: true,
96
+ message: 'Claude user memory has a stale VGXNESS managed block; apply would update only that block after backup.',
97
+ blockRange: { start, end },
98
+ staleReasons: ['managed_block_differs_from_canonical_render'],
99
+ contents,
100
+ };
64
101
  }
65
102
  export function mergeClaudeUserMemory(state) {
66
103
  const block = renderClaudeUserMemoryBlock();
@@ -71,7 +108,10 @@ export function mergeClaudeUserMemory(state) {
71
108
  return { ok: true, value: { path: state.path, contents: `${state.contents}${separator}${block}\n` } };
72
109
  }
73
110
  if (state.status === 'managed-stale')
74
- return { ok: true, value: { path: state.path, contents: state.contents.slice(0, state.blockRange.start) + block + state.contents.slice(state.blockRange.end) } };
111
+ return {
112
+ ok: true,
113
+ value: { path: state.path, contents: state.contents.slice(0, state.blockRange.start) + block + state.contents.slice(state.blockRange.end) },
114
+ };
75
115
  if (state.status === 'managed-current')
76
116
  return { ok: true, value: { path: state.path, contents: state.contents } };
77
117
  return { ok: false, error: { code: 'validation_failed', message: state.message } };
@@ -1,4 +1,4 @@
1
- import { withEffectiveManagerInstructions } from '../agents/canonical-agent-projection.js';
1
+ import { withEffectiveManagerInstructions } from '../../../agents/canonical-agent-projection.js';
2
2
  import { expectedClaudeCodeAgentFiles, inspectClaudeCodeAgents, renderClaudeCodeAgentMarkdown } from './claude-code-agent-config.js';
3
3
  import { buildClaudeCodeMcpAddCommand } from './claude-code-cli.js';
4
4
  import { createClaudeCodeMcpDoctorCommand, createClaudeCodeMcpServerConfig } from './claude-code-config.js';
@@ -58,23 +58,53 @@ function planUserInstall(input, server, overwriteVgxness, cliCommand, scopeWarni
58
58
  else if (agent.status === 'managed')
59
59
  targets.push({ kind: 'agent-file', path: agent.path, agentName: agent.agentName, scope: 'user', external: true, action: 'update-vgxness' });
60
60
  else
61
- targets.push({ kind: 'agent-file', path: agent.path, agentName: agent.agentName, scope: 'user', external: true, action: 'blocked', reason: agent.detail });
61
+ targets.push({
62
+ kind: 'agent-file',
63
+ path: agent.path,
64
+ agentName: agent.agentName,
65
+ scope: 'user',
66
+ external: true,
67
+ action: 'blocked',
68
+ reason: agent.detail,
69
+ });
62
70
  }
63
71
  const userMemory = inspectClaudeUserMemory(input.env);
64
- targets.push({ kind: 'user-memory', path: userMemory.path, external: true, action: userMemory.action, status: userMemory.status, backupRequired: userMemory.backupRequired, ...(userMemory.status === 'blocked' ? { reason: userMemory.message } : {}) });
72
+ targets.push({
73
+ kind: 'user-memory',
74
+ path: userMemory.path,
75
+ external: true,
76
+ action: userMemory.action,
77
+ status: userMemory.status,
78
+ backupRequired: userMemory.backupRequired,
79
+ ...(userMemory.status === 'blocked' ? { reason: userMemory.message } : {}),
80
+ });
65
81
  const blocked = targets.find((target) => target.action === 'blocked');
66
82
  if (blocked !== undefined) {
67
- const reason = blocked.kind === 'user-mcp-json' ? userMcpRefusalReason(mcpState.status) : blocked.kind === 'user-memory' ? userMemoryRefusalReason(userMemory) : 'existing_vgxness_agent';
83
+ const reason = blocked.kind === 'user-mcp-json'
84
+ ? userMcpRefusalReason(mcpState.status)
85
+ : blocked.kind === 'user-memory'
86
+ ? userMemoryRefusalReason(userMemory)
87
+ : 'existing_vgxness_agent';
68
88
  return refused(input, server, reason, blocked.reason ?? 'Claude user install plan is blocked by an existing conflicting target.', targets, preservedTopLevelKeys, overwriteVgxness);
69
89
  }
70
- const backupRequired = targets.some((target) => (target.kind === 'user-mcp-json' && target.action !== 'create') || (target.kind === 'agent-file' && target.action === 'update-vgxness') || (target.kind === 'user-memory' && target.backupRequired));
71
- return { ...base(input, server, targets, preservedTopLevelKeys, backupRequired, overwriteVgxness, 'user', cliCommand, scopeWarnings), status: 'would_install' };
90
+ const backupRequired = targets.some((target) => (target.kind === 'user-mcp-json' && target.action !== 'create') ||
91
+ (target.kind === 'agent-file' && target.action === 'update-vgxness') ||
92
+ (target.kind === 'user-memory' && target.backupRequired));
93
+ return {
94
+ ...base(input, server, targets, preservedTopLevelKeys, backupRequired, overwriteVgxness, 'user', cliCommand, scopeWarnings),
95
+ status: 'would_install',
96
+ };
72
97
  }
73
98
  function refused(input, server, reason, message, targets, preservedTopLevelKeys, overwriteVgxness) {
74
99
  const resolved = resolveClaudeCodeScope(input.scope, 'user');
75
100
  const canonical = resolved.ok ? resolved.value.canonical : 'user';
76
101
  const cli = canonical === 'user' ? buildClaudeCodeMcpAddCommand({ scope: canonical }) : undefined;
77
- return { ...base(input, server, targets, preservedTopLevelKeys, false, overwriteVgxness, canonical, cli?.ok ? cli.value : undefined, resolved.ok ? resolved.value.warnings : []), status: 'refused', reason, message };
102
+ return {
103
+ ...base(input, server, targets, preservedTopLevelKeys, false, overwriteVgxness, canonical, cli?.ok ? cli.value : undefined, resolved.ok ? resolved.value.warnings : []),
104
+ status: 'refused',
105
+ reason,
106
+ message,
107
+ };
78
108
  }
79
109
  function base(input, server, targets, preservedTopLevelKeys, backupRequired, overwriteVgxness, canonicalClaudeScope, cliCommand, scopeWarnings) {
80
110
  const source = input.databasePathSource ?? 'flag';
@@ -89,7 +119,14 @@ function base(input, server, targets, preservedTopLevelKeys, backupRequired, ove
89
119
  targetPath,
90
120
  targets,
91
121
  backupRequired,
92
- safety: { operation: 'plan', mutating: false, writesProviderConfig: false, targetPath, backupRequired, mergePolicy: backupRequired ? 'merge-preserve-existing' : 'create' },
122
+ safety: {
123
+ operation: 'plan',
124
+ mutating: false,
125
+ writesProviderConfig: false,
126
+ targetPath,
127
+ backupRequired,
128
+ mergePolicy: backupRequired ? 'merge-preserve-existing' : 'create',
129
+ },
93
130
  warnings: [
94
131
  ...scopeWarnings,
95
132
  'Claude Code MCP registration is modeled as structured config/argv, never shell strings.',