peaks-loop 4.1.3 → 4.1.4

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 (402) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/CHANGELOG.md +56 -0
  3. package/README-en.md +1 -1
  4. package/README.md +1 -1
  5. package/dist/cli/commands/asset-command-shared.d.ts +12 -0
  6. package/dist/cli/commands/asset-command-shared.js +45 -0
  7. package/dist/cli/commands/asset-commands.d.ts +6 -1
  8. package/dist/cli/commands/asset-commands.js +11 -372
  9. package/dist/cli/commands/asset-crystallize-command.d.ts +3 -0
  10. package/dist/cli/commands/asset-crystallize-command.js +60 -0
  11. package/dist/cli/commands/asset-crystallize-payload.d.ts +47 -0
  12. package/dist/cli/commands/asset-crystallize-payload.js +85 -0
  13. package/dist/cli/commands/asset-crystallize-runner.d.ts +3 -0
  14. package/dist/cli/commands/asset-crystallize-runner.js +133 -0
  15. package/dist/cli/commands/asset-dispose-command.d.ts +3 -0
  16. package/dist/cli/commands/asset-dispose-command.js +99 -0
  17. package/dist/cli/commands/asset-status-command.d.ts +3 -0
  18. package/dist/cli/commands/asset-status-command.js +100 -0
  19. package/dist/cli/commands/baseline-audit-command.d.ts +3 -0
  20. package/dist/cli/commands/baseline-audit-command.js +64 -0
  21. package/dist/cli/commands/baseline-command-shared.d.ts +23 -0
  22. package/dist/cli/commands/baseline-command-shared.js +39 -0
  23. package/dist/cli/commands/baseline-commands.js +33 -313
  24. package/dist/cli/commands/baseline-freeze-commands.d.ts +4 -0
  25. package/dist/cli/commands/baseline-freeze-commands.js +81 -0
  26. package/dist/cli/commands/baseline-guard-command.d.ts +3 -0
  27. package/dist/cli/commands/baseline-guard-command.js +52 -0
  28. package/dist/cli/commands/baseline-read-commands.d.ts +5 -0
  29. package/dist/cli/commands/baseline-read-commands.js +72 -0
  30. package/dist/cli/commands/baseline-rollback-commands.d.ts +4 -0
  31. package/dist/cli/commands/baseline-rollback-commands.js +88 -0
  32. package/dist/cli/commands/classify-downgrade-command.d.ts +9 -0
  33. package/dist/cli/commands/classify-downgrade-command.js +21 -0
  34. package/dist/cli/commands/classify-run-command.d.ts +9 -0
  35. package/dist/cli/commands/classify-run-command.js +73 -0
  36. package/dist/cli/commands/classify-signals.d.ts +5 -0
  37. package/dist/cli/commands/classify-signals.js +104 -0
  38. package/dist/cli/commands/code-emit-handoff-command.js +40 -3
  39. package/dist/cli/commands/code-gate-step-08-command.js +25 -9
  40. package/dist/cli/commands/codegraph-command-options.d.ts +22 -0
  41. package/dist/cli/commands/codegraph-command-options.js +22 -0
  42. package/dist/cli/commands/codegraph-commands.d.ts +2 -2
  43. package/dist/cli/commands/codegraph-commands.js +14 -397
  44. package/dist/cli/commands/codegraph-config-restore-command.d.ts +3 -0
  45. package/dist/cli/commands/codegraph-config-restore-command.js +200 -0
  46. package/dist/cli/commands/codegraph-proxy-commands.d.ts +10 -0
  47. package/dist/cli/commands/codegraph-proxy-commands.js +159 -0
  48. package/dist/cli/commands/codegraph-repair-commands.d.ts +3 -0
  49. package/dist/cli/commands/codegraph-repair-commands.js +94 -0
  50. package/dist/cli/commands/codegraph-status-command.d.ts +1 -1
  51. package/dist/cli/commands/codegraph-status-command.js +27 -214
  52. package/dist/cli/commands/codegraph-status-integrity.d.ts +44 -0
  53. package/dist/cli/commands/codegraph-status-integrity.js +121 -0
  54. package/dist/cli/commands/codegraph-status-json.d.ts +5 -0
  55. package/dist/cli/commands/codegraph-status-json.js +127 -0
  56. package/dist/cli/commands/container-command-shared.d.ts +60 -0
  57. package/dist/cli/commands/container-command-shared.js +52 -0
  58. package/dist/cli/commands/container-commands.d.ts +1 -1
  59. package/dist/cli/commands/container-commands.js +4 -216
  60. package/dist/cli/commands/container-release-command.d.ts +3 -0
  61. package/dist/cli/commands/container-release-command.js +105 -0
  62. package/dist/cli/commands/container-spawn-command.d.ts +3 -0
  63. package/dist/cli/commands/container-spawn-command.js +148 -0
  64. package/dist/cli/commands/context-check-command.d.ts +3 -0
  65. package/dist/cli/commands/context-check-command.js +81 -0
  66. package/dist/cli/commands/context-commands.d.ts +2 -7
  67. package/dist/cli/commands/context-commands.js +6 -276
  68. package/dist/cli/commands/context-layer-command.d.ts +3 -0
  69. package/dist/cli/commands/context-layer-command.js +34 -0
  70. package/dist/cli/commands/context-layer-fetchers.d.ts +15 -0
  71. package/dist/cli/commands/context-layer-fetchers.js +162 -0
  72. package/dist/cli/commands/context-status-command.d.ts +17 -0
  73. package/dist/cli/commands/context-status-command.js +41 -0
  74. package/dist/cli/commands/contract-write-command.d.ts +3 -0
  75. package/dist/cli/commands/contract-write-command.js +144 -0
  76. package/dist/cli/commands/core/doctor-bindings.d.ts +17 -0
  77. package/dist/cli/commands/core/doctor-bindings.js +30 -0
  78. package/dist/cli/commands/core/doctor-command.d.ts +4 -18
  79. package/dist/cli/commands/core/doctor-command.js +2 -323
  80. package/dist/cli/commands/core/doctor-logs.d.ts +8 -0
  81. package/dist/cli/commands/core/doctor-logs.js +32 -0
  82. package/dist/cli/commands/core/doctor-probes.d.ts +3 -0
  83. package/dist/cli/commands/core/doctor-probes.js +55 -0
  84. package/dist/cli/commands/core/doctor-run-command.d.ts +12 -0
  85. package/dist/cli/commands/core/doctor-run-command.js +172 -0
  86. package/dist/cli/commands/core/doctor-summary.d.ts +7 -0
  87. package/dist/cli/commands/core/doctor-summary.js +39 -0
  88. package/dist/cli/commands/core/memory-command-shared.d.ts +25 -0
  89. package/dist/cli/commands/core/memory-command-shared.js +20 -0
  90. package/dist/cli/commands/core/memory-command.d.ts +1 -1
  91. package/dist/cli/commands/core/memory-command.js +6 -227
  92. package/dist/cli/commands/core/memory-delegated-verbs.d.ts +4 -0
  93. package/dist/cli/commands/core/memory-delegated-verbs.js +178 -0
  94. package/dist/cli/commands/core/memory-extract-command.d.ts +3 -0
  95. package/dist/cli/commands/core/memory-extract-command.js +90 -0
  96. package/dist/cli/commands/core/memory-sync-command.d.ts +3 -0
  97. package/dist/cli/commands/core/memory-sync-command.js +38 -0
  98. package/dist/cli/commands/core/session-command.d.ts +1 -1
  99. package/dist/cli/commands/core/session-command.js +12 -206
  100. package/dist/cli/commands/core/session-info-command.d.ts +3 -0
  101. package/dist/cli/commands/core/session-info-command.js +142 -0
  102. package/dist/cli/commands/core/session-verb-commands.d.ts +5 -0
  103. package/dist/cli/commands/core/session-verb-commands.js +58 -0
  104. package/dist/cli/commands/core/standards-command.d.ts +1 -24
  105. package/dist/cli/commands/core/standards-command.js +33 -201
  106. package/dist/cli/commands/core/standards-init-command.d.ts +3 -0
  107. package/dist/cli/commands/core/standards-init-command.js +87 -0
  108. package/dist/cli/commands/core/standards-lint.d.ts +24 -0
  109. package/dist/cli/commands/core/standards-lint.js +57 -0
  110. package/dist/cli/commands/core/standards-migrate-command.d.ts +3 -0
  111. package/dist/cli/commands/core/standards-migrate-command.js +57 -0
  112. package/dist/cli/commands/cron-scheduler-commands.d.ts +5 -1
  113. package/dist/cli/commands/cron-scheduler-commands.js +36 -206
  114. package/dist/cli/commands/cron-scheduler-run-once-command.d.ts +7 -0
  115. package/dist/cli/commands/cron-scheduler-run-once-command.js +35 -0
  116. package/dist/cli/commands/cron-scheduler-shared.d.ts +6 -0
  117. package/dist/cli/commands/cron-scheduler-shared.js +48 -0
  118. package/dist/cli/commands/cron-scheduler-start-command.d.ts +7 -0
  119. package/dist/cli/commands/cron-scheduler-start-command.js +65 -0
  120. package/dist/cli/commands/cron-scheduler-status-command.d.ts +7 -0
  121. package/dist/cli/commands/cron-scheduler-status-command.js +46 -0
  122. package/dist/cli/commands/cron-scheduler-stop-command.d.ts +7 -0
  123. package/dist/cli/commands/cron-scheduler-stop-command.js +61 -0
  124. package/dist/cli/commands/dispatch-dag-envelope.d.ts +41 -0
  125. package/dist/cli/commands/dispatch-dag-envelope.js +49 -0
  126. package/dist/cli/commands/dispatch-dag-failure.d.ts +18 -0
  127. package/dist/cli/commands/dispatch-dag-failure.js +16 -0
  128. package/dist/cli/commands/dispatch-dag-preflight.d.ts +51 -0
  129. package/dist/cli/commands/dispatch-dag-preflight.js +105 -0
  130. package/dist/cli/commands/dispatch-dag-runners.d.ts +48 -0
  131. package/dist/cli/commands/dispatch-dag-runners.js +73 -0
  132. package/dist/cli/commands/dispatch-from-dag.d.ts +27 -0
  133. package/dist/cli/commands/dispatch-from-dag.js +87 -257
  134. package/dist/cli/commands/final-review-command-envelopes.d.ts +44 -0
  135. package/dist/cli/commands/final-review-command-envelopes.js +100 -0
  136. package/dist/cli/commands/final-review-command-shared.d.ts +52 -0
  137. package/dist/cli/commands/final-review-command-shared.js +35 -0
  138. package/dist/cli/commands/final-review-commands.d.ts +7 -27
  139. package/dist/cli/commands/final-review-commands.js +13 -240
  140. package/dist/cli/commands/final-review-prepare-command.d.ts +3 -0
  141. package/dist/cli/commands/final-review-prepare-command.js +200 -0
  142. package/dist/cli/commands/governance-classify-contract-commands.d.ts +23 -9
  143. package/dist/cli/commands/governance-classify-contract-commands.js +26 -269
  144. package/dist/cli/commands/hooks-command-shared.d.ts +42 -0
  145. package/dist/cli/commands/hooks-command-shared.js +32 -0
  146. package/dist/cli/commands/hooks-commands.d.ts +20 -0
  147. package/dist/cli/commands/hooks-commands.js +75 -309
  148. package/dist/cli/commands/hooks-install-envelopes.d.ts +6 -0
  149. package/dist/cli/commands/hooks-install-envelopes.js +144 -0
  150. package/dist/cli/commands/hooks-status-command.d.ts +3 -0
  151. package/dist/cli/commands/hooks-status-command.js +93 -0
  152. package/dist/cli/commands/hooks-uninstall-command.d.ts +3 -0
  153. package/dist/cli/commands/hooks-uninstall-command.js +43 -0
  154. package/dist/cli/commands/loop-command-shared.d.ts +31 -0
  155. package/dist/cli/commands/loop-command-shared.js +15 -0
  156. package/dist/cli/commands/loop-commands.d.ts +12 -17
  157. package/dist/cli/commands/loop-commands.js +56 -238
  158. package/dist/cli/commands/loop-export-command.d.ts +3 -0
  159. package/dist/cli/commands/loop-export-command.js +73 -0
  160. package/dist/cli/commands/loop-goal-compose-command.d.ts +3 -0
  161. package/dist/cli/commands/loop-goal-compose-command.js +36 -0
  162. package/dist/cli/commands/loop-import-command.d.ts +3 -0
  163. package/dist/cli/commands/loop-import-command.js +86 -0
  164. package/dist/cli/commands/loop-placeholder-commands.d.ts +3 -0
  165. package/dist/cli/commands/loop-placeholder-commands.js +52 -0
  166. package/dist/cli/commands/memory-command-shared.d.ts +59 -0
  167. package/dist/cli/commands/memory-command-shared.js +39 -0
  168. package/dist/cli/commands/memory-commands.d.ts +6 -79
  169. package/dist/cli/commands/memory-commands.js +19 -309
  170. package/dist/cli/commands/memory-ingest-command.d.ts +3 -0
  171. package/dist/cli/commands/memory-ingest-command.js +50 -0
  172. package/dist/cli/commands/memory-list-command.d.ts +16 -0
  173. package/dist/cli/commands/memory-list-command.js +129 -0
  174. package/dist/cli/commands/memory-reindex-command.d.ts +9 -0
  175. package/dist/cli/commands/memory-reindex-command.js +78 -0
  176. package/dist/cli/commands/memory-rotate-command.d.ts +3 -0
  177. package/dist/cli/commands/memory-rotate-command.js +55 -0
  178. package/dist/cli/commands/memory-search-command.d.ts +7 -0
  179. package/dist/cli/commands/memory-search-command.js +46 -0
  180. package/dist/cli/commands/openspec-archive-command.d.ts +3 -0
  181. package/dist/cli/commands/openspec-archive-command.js +55 -0
  182. package/dist/cli/commands/openspec-command-shared.d.ts +62 -0
  183. package/dist/cli/commands/openspec-command-shared.js +135 -0
  184. package/dist/cli/commands/openspec-commands.d.ts +1 -1
  185. package/dist/cli/commands/openspec-commands.js +33 -306
  186. package/dist/cli/commands/openspec-from-doctor-command.d.ts +3 -0
  187. package/dist/cli/commands/openspec-from-doctor-command.js +66 -0
  188. package/dist/cli/commands/openspec-init-command.d.ts +3 -0
  189. package/dist/cli/commands/openspec-init-command.js +49 -0
  190. package/dist/cli/commands/openspec-list-command.d.ts +3 -0
  191. package/dist/cli/commands/openspec-list-command.js +27 -0
  192. package/dist/cli/commands/openspec-render-command.d.ts +3 -0
  193. package/dist/cli/commands/openspec-render-command.js +33 -0
  194. package/dist/cli/commands/openspec-show-command.d.ts +3 -0
  195. package/dist/cli/commands/openspec-show-command.js +33 -0
  196. package/dist/cli/commands/openspec-to-rd-command.d.ts +3 -0
  197. package/dist/cli/commands/openspec-to-rd-command.js +33 -0
  198. package/dist/cli/commands/openspec-validate-command.d.ts +3 -0
  199. package/dist/cli/commands/openspec-validate-command.js +45 -0
  200. package/dist/cli/commands/playwright-browser-command.d.ts +8 -0
  201. package/dist/cli/commands/playwright-browser-command.js +61 -0
  202. package/dist/cli/commands/playwright-commands.d.ts +10 -62
  203. package/dist/cli/commands/playwright-commands.js +77 -400
  204. package/dist/cli/commands/playwright-envelope.d.ts +8 -0
  205. package/dist/cli/commands/playwright-envelope.js +29 -0
  206. package/dist/cli/commands/playwright-ls-stop-commands.d.ts +4 -0
  207. package/dist/cli/commands/playwright-ls-stop-commands.js +74 -0
  208. package/dist/cli/commands/playwright-session-store.d.ts +65 -0
  209. package/dist/cli/commands/playwright-session-store.js +189 -0
  210. package/dist/cli/commands/project-commands.d.ts +19 -0
  211. package/dist/cli/commands/project-commands.js +98 -259
  212. package/dist/cli/commands/project-context-command.d.ts +3 -0
  213. package/dist/cli/commands/project-context-command.js +44 -0
  214. package/dist/cli/commands/project-dashboard-command.d.ts +3 -0
  215. package/dist/cli/commands/project-dashboard-command.js +74 -0
  216. package/dist/cli/commands/project-knowledge-command.d.ts +3 -0
  217. package/dist/cli/commands/project-knowledge-command.js +48 -0
  218. package/dist/cli/commands/project-memories-show-command.d.ts +3 -0
  219. package/dist/cli/commands/project-memories-show-command.js +87 -0
  220. package/dist/cli/commands/project-memory-index-command.d.ts +3 -0
  221. package/dist/cli/commands/project-memory-index-command.js +31 -0
  222. package/dist/cli/commands/qa-archive-screenshots-command.d.ts +3 -0
  223. package/dist/cli/commands/qa-archive-screenshots-command.js +53 -0
  224. package/dist/cli/commands/qa-commands.d.ts +14 -87
  225. package/dist/cli/commands/qa-commands.js +17 -315
  226. package/dist/cli/commands/qa-context-prestep.d.ts +1 -0
  227. package/dist/cli/commands/qa-context-prestep.js +34 -0
  228. package/dist/cli/commands/qa-run-command.d.ts +3 -0
  229. package/dist/cli/commands/qa-run-command.js +105 -0
  230. package/dist/cli/commands/qa-run-options.d.ts +23 -0
  231. package/dist/cli/commands/qa-run-options.js +31 -0
  232. package/dist/cli/commands/qa-run-slice.d.ts +41 -0
  233. package/dist/cli/commands/qa-run-slice.js +145 -0
  234. package/dist/cli/commands/release-canary-command.d.ts +28 -0
  235. package/dist/cli/commands/release-canary-command.js +129 -0
  236. package/dist/cli/commands/release-command-shared.d.ts +13 -0
  237. package/dist/cli/commands/release-command-shared.js +18 -0
  238. package/dist/cli/commands/release-commands.d.ts +10 -18
  239. package/dist/cli/commands/release-commands.js +25 -298
  240. package/dist/cli/commands/release-done-command.d.ts +3 -0
  241. package/dist/cli/commands/release-done-command.js +64 -0
  242. package/dist/cli/commands/release-hotfix-command.d.ts +3 -0
  243. package/dist/cli/commands/release-hotfix-command.js +50 -0
  244. package/dist/cli/commands/release-plan-command.d.ts +3 -0
  245. package/dist/cli/commands/release-plan-command.js +33 -0
  246. package/dist/cli/commands/release-precheck-command.d.ts +3 -0
  247. package/dist/cli/commands/release-precheck-command.js +28 -0
  248. package/dist/cli/commands/release-promote-command.d.ts +3 -0
  249. package/dist/cli/commands/release-promote-command.js +34 -0
  250. package/dist/cli/commands/release-rollback-command.d.ts +3 -0
  251. package/dist/cli/commands/release-rollback-command.js +33 -0
  252. package/dist/cli/commands/release-watch-command.d.ts +3 -0
  253. package/dist/cli/commands/release-watch-command.js +44 -0
  254. package/dist/cli/commands/sediment-argv-flags.d.ts +54 -0
  255. package/dist/cli/commands/sediment-argv-flags.js +116 -0
  256. package/dist/cli/commands/sediment-command-shared.d.ts +15 -0
  257. package/dist/cli/commands/sediment-command-shared.js +5 -0
  258. package/dist/cli/commands/sediment-commands.d.ts +35 -59
  259. package/dist/cli/commands/sediment-commands.js +36 -590
  260. package/dist/cli/commands/sediment-pool-commands.d.ts +9 -0
  261. package/dist/cli/commands/sediment-pool-commands.js +185 -0
  262. package/dist/cli/commands/sediment-query-commands.d.ts +4 -0
  263. package/dist/cli/commands/sediment-query-commands.js +94 -0
  264. package/dist/cli/commands/sediment-release-commands.d.ts +8 -0
  265. package/dist/cli/commands/sediment-release-commands.js +232 -0
  266. package/dist/cli/commands/sop-advance-command.d.ts +3 -0
  267. package/dist/cli/commands/sop-advance-command.js +160 -0
  268. package/dist/cli/commands/sop-check-command.d.ts +3 -0
  269. package/dist/cli/commands/sop-check-command.js +44 -0
  270. package/dist/cli/commands/sop-command-shared.d.ts +23 -0
  271. package/dist/cli/commands/sop-command-shared.js +18 -0
  272. package/dist/cli/commands/sop-commands.d.ts +15 -1
  273. package/dist/cli/commands/sop-commands.js +26 -240
  274. package/dist/cli/commands/sop-init-command.d.ts +3 -0
  275. package/dist/cli/commands/sop-init-command.js +51 -0
  276. package/dist/cli/commands/sop-lint-command.d.ts +3 -0
  277. package/dist/cli/commands/sop-lint-command.js +64 -0
  278. package/dist/cli/commands/sop-register-command.d.ts +3 -0
  279. package/dist/cli/commands/sop-register-command.js +48 -0
  280. package/dist/cli/commands/sop-registry-command.d.ts +3 -0
  281. package/dist/cli/commands/sop-registry-command.js +30 -0
  282. package/dist/cli/commands/statusline-command-shared.d.ts +73 -0
  283. package/dist/cli/commands/statusline-command-shared.js +90 -0
  284. package/dist/cli/commands/statusline-commands.d.ts +1 -19
  285. package/dist/cli/commands/statusline-commands.js +48 -287
  286. package/dist/cli/commands/statusline-compact-command.d.ts +4 -0
  287. package/dist/cli/commands/statusline-compact-command.js +54 -0
  288. package/dist/cli/commands/statusline-install-command.d.ts +3 -0
  289. package/dist/cli/commands/statusline-install-command.js +48 -0
  290. package/dist/cli/commands/statusline-render-command.d.ts +9 -0
  291. package/dist/cli/commands/statusline-render-command.js +55 -0
  292. package/dist/cli/commands/statusline-status-command.d.ts +3 -0
  293. package/dist/cli/commands/statusline-status-command.js +23 -0
  294. package/dist/cli/commands/statusline-uninstall-command.d.ts +3 -0
  295. package/dist/cli/commands/statusline-uninstall-command.js +23 -0
  296. package/dist/cli/commands/test-command-run-helpers.d.ts +27 -0
  297. package/dist/cli/commands/test-command-run-helpers.js +73 -0
  298. package/dist/cli/commands/test-command-runner-resolution.d.ts +57 -0
  299. package/dist/cli/commands/test-command-runner-resolution.js +183 -0
  300. package/dist/cli/commands/test-commands.d.ts +8 -56
  301. package/dist/cli/commands/test-commands.js +26 -249
  302. package/dist/cli/commands/vm-command-shared.d.ts +23 -0
  303. package/dist/cli/commands/vm-command-shared.js +23 -0
  304. package/dist/cli/commands/vm-commands.d.ts +1 -28
  305. package/dist/cli/commands/vm-commands.js +36 -270
  306. package/dist/cli/commands/vm-hypervisor-runtime.d.ts +15 -0
  307. package/dist/cli/commands/vm-hypervisor-runtime.js +64 -0
  308. package/dist/cli/commands/vm-release-command.d.ts +5 -0
  309. package/dist/cli/commands/vm-release-command.js +101 -0
  310. package/dist/cli/commands/vm-spawn-command.d.ts +5 -0
  311. package/dist/cli/commands/vm-spawn-command.js +177 -0
  312. package/dist/cli/commands/web-command-shared.d.ts +12 -0
  313. package/dist/cli/commands/web-command-shared.js +30 -0
  314. package/dist/cli/commands/web-commands.d.ts +7 -14
  315. package/dist/cli/commands/web-commands.js +6 -314
  316. package/dist/cli/commands/web-install-command.d.ts +10 -0
  317. package/dist/cli/commands/web-install-command.js +116 -0
  318. package/dist/cli/commands/web-lifecycle-commands.d.ts +9 -30
  319. package/dist/cli/commands/web-lifecycle-commands.js +14 -322
  320. package/dist/cli/commands/web-login-command.d.ts +14 -0
  321. package/dist/cli/commands/web-login-command.js +189 -0
  322. package/dist/cli/commands/web-op-payload.d.ts +22 -0
  323. package/dist/cli/commands/web-op-payload.js +89 -0
  324. package/dist/cli/commands/web-op-refusals.d.ts +37 -0
  325. package/dist/cli/commands/web-op-refusals.js +73 -0
  326. package/dist/cli/commands/web-op-runner.d.ts +14 -0
  327. package/dist/cli/commands/web-op-runner.js +166 -0
  328. package/dist/cli/commands/web-status-command.d.ts +4 -0
  329. package/dist/cli/commands/web-status-command.js +32 -0
  330. package/dist/cli/commands/web-stop-command.d.ts +10 -0
  331. package/dist/cli/commands/web-stop-command.js +59 -0
  332. package/dist/cli/commands/web-verb-specs.d.ts +18 -0
  333. package/dist/cli/commands/web-verb-specs.js +66 -0
  334. package/dist/cli/commands/workflow-command-shared.d.ts +102 -0
  335. package/dist/cli/commands/workflow-command-shared.js +74 -0
  336. package/dist/cli/commands/workflow-graph-commands.d.ts +3 -0
  337. package/dist/cli/commands/workflow-graph-commands.js +73 -0
  338. package/dist/cli/commands/workflow-init-command.d.ts +3 -0
  339. package/dist/cli/commands/workflow-init-command.js +68 -0
  340. package/dist/cli/commands/workflow-lifecycle-commands.d.ts +9 -59
  341. package/dist/cli/commands/workflow-lifecycle-commands.js +14 -348
  342. package/dist/cli/commands/workflow-node-commands.d.ts +3 -0
  343. package/dist/cli/commands/workflow-node-commands.js +154 -0
  344. package/dist/cli/commands/workflow-terminalize-command.d.ts +3 -0
  345. package/dist/cli/commands/workflow-terminalize-command.js +56 -0
  346. package/dist/services/code/auto-compact-artifacts.d.ts +54 -0
  347. package/dist/services/code/auto-compact-artifacts.js +135 -0
  348. package/dist/services/code/auto-compact-attempt.d.ts +46 -0
  349. package/dist/services/code/auto-compact-attempt.js +88 -0
  350. package/dist/services/code/auto-compact-decision.d.ts +74 -0
  351. package/dist/services/code/auto-compact-decision.js +149 -0
  352. package/dist/services/code/auto-compact-dispatch-gate.d.ts +36 -0
  353. package/dist/services/code/auto-compact-dispatch-gate.js +86 -0
  354. package/dist/services/code/auto-compact-envelopes.d.ts +33 -0
  355. package/dist/services/code/auto-compact-envelopes.js +134 -0
  356. package/dist/services/code/auto-compact-history.d.ts +46 -0
  357. package/dist/services/code/auto-compact-history.js +17 -0
  358. package/dist/services/code/auto-compact-orchestrator.d.ts +11 -240
  359. package/dist/services/code/auto-compact-orchestrator.js +165 -686
  360. package/dist/services/code/auto-compact-run-types.d.ts +123 -0
  361. package/dist/services/code/auto-compact-run-types.js +1 -0
  362. package/dist/services/code/emit-handoff.d.ts +35 -1
  363. package/dist/services/code/emit-handoff.js +128 -7
  364. package/dist/services/code/step-08-gate.d.ts +28 -19
  365. package/dist/services/code/step-08-gate.js +92 -35
  366. package/dist/services/config/config-coercion.d.ts +7 -0
  367. package/dist/services/config/config-coercion.js +156 -0
  368. package/dist/services/config/config-file-io.d.ts +11 -0
  369. package/dist/services/config/config-file-io.js +61 -0
  370. package/dist/services/config/config-get.d.ts +2 -0
  371. package/dist/services/config/config-get.js +36 -0
  372. package/dist/services/config/config-global-loader.d.ts +15 -0
  373. package/dist/services/config/config-global-loader.js +111 -0
  374. package/dist/services/config/config-nested-path.d.ts +3 -0
  375. package/dist/services/config/config-nested-path.js +53 -0
  376. package/dist/services/config/config-primitives.d.ts +16 -0
  377. package/dist/services/config/config-primitives.js +24 -0
  378. package/dist/services/config/config-service.d.ts +9 -33
  379. package/dist/services/config/config-service.js +16 -665
  380. package/dist/services/config/config-validation.d.ts +19 -0
  381. package/dist/services/config/config-validation.js +152 -0
  382. package/dist/services/config/config-workspace.d.ts +10 -0
  383. package/dist/services/config/config-workspace.js +158 -0
  384. package/dist/services/skills/hooks-settings-deny-list.d.ts +61 -0
  385. package/dist/services/skills/hooks-settings-deny-list.js +173 -0
  386. package/dist/services/skills/hooks-settings-envelopes.d.ts +20 -0
  387. package/dist/services/skills/hooks-settings-envelopes.js +79 -0
  388. package/dist/services/skills/hooks-settings-file-shape.d.ts +43 -0
  389. package/dist/services/skills/hooks-settings-file-shape.js +207 -0
  390. package/dist/services/skills/hooks-settings-paths.d.ts +34 -0
  391. package/dist/services/skills/hooks-settings-paths.js +75 -0
  392. package/dist/services/skills/hooks-settings-read-installed.d.ts +39 -0
  393. package/dist/services/skills/hooks-settings-read-installed.js +60 -0
  394. package/dist/services/skills/hooks-settings-service.d.ts +12 -212
  395. package/dist/services/skills/hooks-settings-service.js +71 -657
  396. package/dist/services/skills/hooks-settings-types.d.ts +139 -0
  397. package/dist/services/skills/hooks-settings-types.js +1 -0
  398. package/dist/services/workspace/claude-settings-template-merge.d.ts +89 -0
  399. package/dist/services/workspace/claude-settings-template-merge.js +243 -0
  400. package/dist/services/workspace/claude-settings-template.d.ts +29 -87
  401. package/dist/services/workspace/claude-settings-template.js +81 -236
  402. package/package.json +5 -5
@@ -4,348 +4,25 @@
4
4
  // `config-restore`, `init`, `affected`, plus the commander registration for
5
5
  // every codegraph subcommand.
6
6
  //
7
- // the shared invocation runtime to `codegraph-command-runtime.ts` and the
8
- // `status` integrity gate to `codegraph-status-command.ts`, both verbatim.
7
+ // The shared invocation runtime lives in `codegraph-command-runtime.ts`, the
8
+ // `status` integrity gate in `codegraph-status-command.ts`, the option shapes
9
+ // in `codegraph-command-options.ts`, the repair pair in
10
+ // `codegraph-repair-commands.ts`, `config-restore` in
11
+ // `codegraph-config-restore-command.ts`, and the upstream proxy verbs in
12
+ // `codegraph-proxy-commands.ts`.
13
+ //
9
14
  // This path keeps its public surface: `registerCodegraphCommands` is defined
10
15
  // here and `rewriteBareCodegraphHints` / `attributeUpstreamUpToDateLine` are
11
16
  // re-exported below, so every existing importer still resolves.
12
- import { InvalidArgumentError } from 'commander';
13
- import { resolve } from 'node:path';
14
- import { assertCodegraphDirContained, resolveProjectRoot, writeCodegraphAffectedContext } from '../../services/codegraph/codegraph-service.js';
15
- import { repairCodegraphExcludeFromProject } from '../../services/codegraph/codegraph-exclude-repair.js';
16
- import { resolveCodegraphConfigSource } from '../../services/codegraph/codegraph-project-config.js';
17
- import { rollbackCodegraphConfig } from '../../services/codegraph/codegraph-config-repair-writer.js';
18
17
  import { runCodegraphInitCommand } from './codegraph-init-command.js';
19
- import { fail, ok } from 'peaks-loop-shared/result';
20
- import { getErrorMessage, printResult, redactSensitiveErrorMessage } from '../cli-helpers.js';
21
- import { printCodegraphFailure, runCodegraphCommand } from './codegraph-command-runtime.js';
18
+ import { addProjectOption } from './codegraph-command-options.js';
22
19
  import { runCodegraphStatusCommand } from './codegraph-status-command.js';
20
+ import { registerCodegraphRepairCommands } from './codegraph-repair-commands.js';
21
+ import { registerCodegraphConfigRestoreCommand } from './codegraph-config-restore-command.js';
22
+ import { registerCodegraphProxyCommands } from './codegraph-proxy-commands.js';
23
23
  // Re-exported so the D1 split is invisible to importers of THIS path.
24
24
  export { rewriteBareCodegraphHints } from './codegraph-command-runtime.js';
25
25
  export { attributeUpstreamUpToDateLine } from './codegraph-status-command.js';
26
- function addPeaksJsonOption(command) {
27
- return command.option('--peaks-json', 'print Peaks error envelope as machine-readable JSON');
28
- }
29
- function addProjectOption(command) {
30
- return addPeaksJsonOption(command.requiredOption('--project <path>', 'target project root'));
31
- }
32
- function parsePositiveInteger(value) {
33
- if (!/^\d+$/.test(value)) {
34
- throw new InvalidArgumentError('must be a positive integer');
35
- }
36
- const parsed = Number(value);
37
- if (!Number.isSafeInteger(parsed) || parsed < 1) {
38
- throw new InvalidArgumentError('must be a positive integer');
39
- }
40
- return parsed;
41
- }
42
- const REPAIR_MODES = {
43
- exclude: {
44
- commandId: 'codegraph.repair-exclude',
45
- reindex: true,
46
- noopNote: 'Nothing to repair in the codegraph config; nothing was written.'
47
- },
48
- index: {
49
- commandId: 'codegraph.repair-index',
50
- // 'force' is upstream's `clear()` + full re-index — the only documented
51
- // way to drop rows for files deleted in an earlier commit.
52
- reindex: 'force',
53
- noopNote: 'The codegraph config already admits every supported tracked file and blocks none; the index was still rebuilt from scratch.'
54
- }
55
- };
56
- // One sentence, the same shape in both modes, because both modes run the
57
- // same repair — only the rebuild differs.
58
- //
59
- // The include clause this sentence used to carry is gone with the include
60
- // axis (see `codegraph-exclude-repair.ts`), which also removed the reason the
61
- // sentence was once split in two: there is a single axis left, and its own
62
- // counter cannot be read as a verdict on another one.
63
- function appliedRepairNote(report) {
64
- return (`Removed ${report.rulesRemoved.length} exclude rule(s), recovering ${report.filesRecovered} tracked source file(s) that a rule had been hiding.` +
65
- ` Config backed up to ${report.backupPath ?? ''}.`);
66
- }
67
- /**
68
- * Explicit repair path: reconcile the config's `exclude` rules → back it up →
69
- * rewrite it → rebuild the index. Mirrors the automatic step `init` runs
70
- * after a fresh upstream init, for workspaces that were already
71
- * initialized before the integrity gate existed.
72
- */
73
- async function runCodegraphRepairCommand(io, options, asJson, mode) {
74
- const spec = REPAIR_MODES[mode];
75
- let projectRoot;
76
- try {
77
- // `resolveProjectRoot`, not a hand-rolled `resolve` + `statSync`: it is
78
- // the canonicalizer every codegraph invocation already goes through
79
- // (`createCodegraphInvocation`), so the config path this verb reports
80
- // and writes names the SAME directory the spawn and the other verbs use
81
- // even when `--project` is a symlink, a short name or a differently
82
- // cased alias. The error path is unchanged.
83
- projectRoot = resolveProjectRoot(options.project);
84
- }
85
- catch (error) {
86
- printCodegraphFailure(io, spec.commandId, error, asJson);
87
- return;
88
- }
89
- const report = await repairCodegraphExcludeFromProject(projectRoot, undefined, {
90
- reindex: spec.reindex
91
- });
92
- // Where the notes go matters: `printResult` renders every `warnings`
93
- // entry to stderr with a `warning: ` prefix, so a confirmation parked
94
- // in the third slot reads as a problem — and a real warning parked
95
- // there double-prefixes. Confirmations go to `nextActions`; only a
96
- // genuine `report.warning` reaches `warnings`, verbatim.
97
- const confirmations = [report.applied ? appliedRepairNote(report) : spec.noopNote];
98
- if (report.applied || mode === 'index') {
99
- confirmations.push('Re-run `peaks codegraph status --project <root>` to confirm the gap is closed.');
100
- }
101
- printResult(io, ok(spec.commandId, {
102
- applied: report.applied,
103
- rulesRemoved: report.rulesRemoved,
104
- filesRecovered: report.filesRecovered,
105
- configPath: report.configPath,
106
- backupPath: report.backupPath,
107
- reindexed: report.reindexed,
108
- forcedRebuild: report.forcedRebuild,
109
- warning: report.warning
110
- }, report.warning === null ? [] : [report.warning], confirmations), asJson);
111
- // A repair that could not run to completion (or could not reindex)
112
- // must not report success to a shell.
113
- if (report.warning !== null) {
114
- process.exitCode = 1;
115
- }
116
- }
117
- /**
118
- * Exit code for a `config-restore` run that never reached the restore point:
119
- * `--project` is missing or not a directory, or the containment guard refused
120
- * the `.codegraph/` directory.
121
- *
122
- * Deliberately NOT `CODEGRAPH_CONFIG_RESTORE_EXIT_CODE` (77). The two codes
123
- * answer different questions, and a CI job has to be able to tell them apart:
124
- *
125
- * - 1 — the command was never aimed at a usable project. Nothing looked at a
126
- * rollback point, so "your backup is unusable" would be a verdict
127
- * nothing reached, and the remedy is a different one (fix the path, or
128
- * remove the link). The VALUE is 1 because that is what every other
129
- * codegraph verb already exits with for this same input failure —
130
- * `repair-exclude --project <bad>` and `status --project <bad>` both
131
- * exit 1 (measured), so a caller that handles one handles this one.
132
- * - 77 — the restore point WAS examined and the restore did not happen.
133
- *
134
- * Named rather than left as `printCodegraphFailure`'s default `1` so both
135
- * classes are visible in one place, side by side, instead of one of them living
136
- * only in another module's parameter default.
137
- */
138
- const CODEGRAPH_CONFIG_RESTORE_PRECONDITION_EXIT_CODE = 1;
139
- /**
140
- * Exit code for `peaks codegraph config-restore` when the restore did not
141
- * happen: the backup is absent, unreadable, or REFUSED (a symbolic link, a
142
- * hard link or a directory occupies the fixed, guessable `.bak` path), or the
143
- * reverse write itself failed.
144
- *
145
- * Its own code rather than the precondition `1`, for the same reason 73/74/75/76
146
- * have theirs: it is an operator-actionable verdict about the RESTORE POINT, and
147
- * a CI job has to be able to tell it apart from "the command was aimed wrong".
148
- * The cause lives in `data.reason`, which names the path and the shape that was
149
- * refused — a per-cause CODE would need the rollback helper to return a
150
- * discriminated reason rather than a message, which is a change to that helper's
151
- * contract for no operator-visible gain while the message already carries the
152
- * details.
153
- */
154
- const CODEGRAPH_CONFIG_RESTORE_EXIT_CODE = 77;
155
- /**
156
- * The failure envelope for EVERY `config-restore` failure, so all four `data`
157
- * keys are present whatever went wrong.
158
- *
159
- * A JSON consumer reads `data.restored` and `data.reason` unconditionally, so a
160
- * failure envelope that omits them leaves it guessing — and this verb reports a
161
- * `reason` instead of an exit code alone precisely so a failure is never silent.
162
- * Built here rather than delegated to `printCodegraphFailure`, whose `data` is
163
- * always `{}` and therefore cannot satisfy that.
164
- *
165
- * `code` names the VERB's failure for all three cases; the exit code names the
166
- * CLASS (precondition vs restore) and `reason` names the cause. That split is
167
- * deliberate: one `code` a consumer can match on, plus the two facts it needs
168
- * to decide what to do next.
169
- *
170
- * The verb-specific `code` is an INTENTIONAL DIVERGENCE from every other
171
- * codegraph verb, not a consistency with them — `repair-exclude`,
172
- * `repair-index` and `status` all report `CODEGRAPH_COMMAND_FAILED` out of
173
- * `printCodegraphFailure` with `data: {}` (measured, 2026-09-17). Two reasons
174
- * to diverge here anyway:
175
- *
176
- * 1. A generic `code` cannot be paired with a verb-specific `reason`
177
- * contract: this verb's failure ALWAYS carries `restored`/`reason`, which
178
- * `printCodegraphFailure` cannot express at all (`fail()` hard-codes the
179
- * other verbs' `data` to `{}`).
180
- * 2. `CODEGRAPH_CONFIG_RESTORE_FAILED` says WHICH restore failed, and a
181
- * consumer matching on `code` gets that from the envelope rather than from
182
- * the exit code alone.
183
- *
184
- * FOLLOW-UP (recorded, not done here — it is out of this slice's scope):
185
- * `code` naming across the codegraph verb family is now inconsistent, and the
186
- * rest of the family should either adopt verb-specific codes or this one should
187
- * return to the generic one. See this slice's RD artifact,
188
- * `## A1 QA 修复循环 2`.
189
- */
190
- function printConfigRestoreFailure(io, asJson, reason, exitCode, nextActions) {
191
- const redacted = redactSensitiveErrorMessage(reason);
192
- printResult(io, fail('codegraph.config-restore', 'CODEGRAPH_CONFIG_RESTORE_FAILED', redacted, { restored: false, from: null, to: null, reason: redacted }, [...nextActions]), asJson);
193
- process.exitCode = exitCode;
194
- }
195
- /**
196
- * `peaks codegraph config-restore` — put `.codegraph/config.json` back to the
197
- * bytes the last repair backed up to `.codegraph/config.json.bak`.
198
- *
199
- * The EXPLICIT undo of a repair, and the only way the `.bak` is ever read: the
200
- * repair seams leave the copy behind and never consume it, because a repair
201
- * that restored its own write would cancel itself out (the config would be
202
- * exactly as it was found, `status` would still report the gap, and exit 75
203
- * would never clear).
204
- *
205
- * Touches the CONFIG FILE ONLY — no `codegraph` subprocess is spawned, so this
206
- * is safe to run while nothing else is rebuilding. The index still reflects
207
- * whatever config the last rebuild used; the envelope's `nextActions` says so
208
- * rather than silently reindexing.
209
- */
210
- async function runCodegraphConfigRestoreCommand(io, options, asJson) {
211
- let configPath;
212
- try {
213
- // `resolveProjectRoot` for the same reason the repair verbs use it: the
214
- // paths reported here must be the canonical ones, or a `--project` alias
215
- // reports a restore that happened somewhere the operator cannot find.
216
- const projectRoot = resolveProjectRoot(options.project);
217
- // The containment refusal the repair seam makes before IT writes here. A
218
- // `.codegraph/` that resolves outside the canonical project root (a junction
219
- // or a symlink) would otherwise let this verb publish one project's bytes
220
- // into another. Called for its refusal only — the paths below stay derived
221
- // from the caller's canonical `projectRoot`.
222
- assertCodegraphDirContained(projectRoot);
223
- // The same resolver the repair WRITES through, so a restore puts back the
224
- // file the repair replaced — not a same-named file upstream never reads.
225
- configPath = resolveCodegraphConfigSource(projectRoot).configPath;
226
- }
227
- catch (error) {
228
- // The PRECONDITION class: nothing below this line ran, so the envelope says
229
- // the restore did not happen and stops short of blaming the rollback point.
230
- printConfigRestoreFailure(io, asJson, getErrorMessage(error), CODEGRAPH_CONFIG_RESTORE_PRECONDITION_EXIT_CODE, [
231
- 'Check that `--project` names an existing directory whose `.codegraph/` resolves inside it.',
232
- 'Run `peaks codegraph config-restore --project <root>` again once the path is right.'
233
- ]);
234
- return;
235
- }
236
- let result;
237
- try {
238
- result = await rollbackCodegraphConfig(configPath);
239
- }
240
- catch (error) {
241
- // Only the reverse write's own fs failure reaches here (the refusals are
242
- // returned, not thrown). The RESTORE class, and the same code as a refusal:
243
- // the restore was attempted and did not happen, and a script that can read
244
- // one can read the other. What differs is the `reason`, which is this
245
- // error's own message.
246
- printConfigRestoreFailure(io, asJson, getErrorMessage(error), CODEGRAPH_CONFIG_RESTORE_EXIT_CODE, [
247
- 'Check that the `.codegraph/` directory is writable, then re-run.',
248
- 'The config was NOT restored; its bytes are unchanged.'
249
- ]);
250
- return;
251
- }
252
- if (!result.rolledBack) {
253
- // LOUD, never silent: the reason reaches the envelope's `message` (which
254
- // `fail()` redacts) AND `data.reason`, and the exit code is this verb's
255
- // own. A restore that quietly reported success over a `.bak` it refused to
256
- // read is exactly the fail-silent family this release closed.
257
- printConfigRestoreFailure(io, asJson, result.error, CODEGRAPH_CONFIG_RESTORE_EXIT_CODE, [
258
- `There is no usable rollback point at ${result.backupPath}.`,
259
- 'A restore needs the `.bak` that a previous `peaks codegraph repair-exclude` or `repair-index` left next to the config.'
260
- ]);
261
- return;
262
- }
263
- printResult(io, ok('codegraph.config-restore', {
264
- restored: true,
265
- from: result.backupPath,
266
- to: result.configPath,
267
- reason: null
268
- }, [], [
269
- 'Run `peaks codegraph status --project <root>` to see the restored config reflected in the integrity gate.',
270
- 'Run `peaks codegraph index` if the index should reflect the restored config too — this verb does not rebuild it.'
271
- ]), asJson);
272
- }
273
- /**
274
- * probes `.codegraph/` for the peaks-loop marker before invoking the
275
- * upstream binary.
276
- *
277
- * - fresh → proceed to upstream init
278
- * - noop-already-peaks-loop → skip upstream, emit warning
279
- * - conflict-foreign-schema → exit 73 + CODEGRAPH_INIT_CONFLICT envelope
280
- *
281
- * On a successful upstream init, write the marker so the next run
282
- * hits the noop branch instead of the conflict branch.
283
- */
284
- /**
285
- *
286
- * Wraps the generic `runCodegraphCommand` and, after a successful
287
- * upstream invocation, calls `writeCodegraphAffectedContext` so the
288
- * RD / QA handoff can pick up `.peaks/_runtime/<sid>/rd/codegraph-context.md`
289
- * without re-running the (5-30 s) codegraph query.
290
- *
291
- * The envelope write is gated by `--write-envelope` (default off) so
292
- * ad-hoc CLI invocations don't silently mutate the user's session
293
- * directory. peaks-code's RD dispatch hook flips the flag on.
294
- *
295
- * On no-session-binding, we surface a `warning` field instead of
296
- * throwing — the upstream result is still printed so the caller
297
- * always sees the affected list.
298
- */
299
- async function runCodegraphAffectedCommand(io, files, options, asJson) {
300
- // Capture stdout so we can re-emit it into the envelope payload.
301
- // We still forward every line to the original `io.stdout` so the
302
- // user sees the affected list as if the wrapper were transparent.
303
- const capturedLines = [];
304
- const captureIo = {
305
- stdout: (chunk) => {
306
- capturedLines.push(chunk);
307
- io.stdout(chunk);
308
- },
309
- stderr: (chunk) => io.stderr(chunk)
310
- };
311
- await runCodegraphCommand(captureIo, 'codegraph.affected', {
312
- subcommand: 'affected',
313
- project: options.project,
314
- files,
315
- ...(options.json === true ? { json: true } : {})
316
- }, asJson);
317
- if (!options.writeEnvelope) {
318
- return;
319
- }
320
- // The user opted in via --write-envelope. Run the envelope writer
321
- // unconditionally (graceful fallback when no session binding).
322
- const rid = options.rid ?? process.env.PEAKS_RD_RID ?? 'unknown-rid';
323
- const rawStdout = capturedLines.join('\n');
324
- let affectedPayload = rawStdout;
325
- if (options.json === true && typeof affectedPayload === 'string' && affectedPayload.length > 0) {
326
- try {
327
- affectedPayload = JSON.parse(affectedPayload);
328
- }
329
- catch {
330
- // Keep the raw string when JSON parse fails; the envelope
331
- // renderer handles strings cleanly.
332
- }
333
- }
334
- const envelope = writeCodegraphAffectedContext({
335
- projectRoot: resolve(options.project),
336
- rid,
337
- files,
338
- affectedPayload
339
- });
340
- if (envelope.written) {
341
- if (asJson !== true) {
342
- io.stdout(`[codegraph-context] wrote ${envelope.path}\n`);
343
- }
344
- }
345
- else if (asJson !== true) {
346
- io.stdout(`[codegraph-context] skipped: ${envelope.warning}\n`);
347
- }
348
- }
349
26
  export function registerCodegraphCommands(program, io) {
350
27
  const codegraph = program
351
28
  .command('codegraph')
@@ -353,71 +30,11 @@ export function registerCodegraphCommands(program, io) {
353
30
  addProjectOption(codegraph
354
31
  .command('status')
355
32
  .description('Show codegraph status, including the exclude integrity gate')).action((options) => runCodegraphStatusCommand(io, options, options.peaksJson));
356
- addProjectOption(codegraph
357
- .command('repair-exclude')
358
- .description('Drop config exclude rules that block tracked source files, then rebuild the index')).action((options) => runCodegraphRepairCommand(io, options, options.peaksJson, 'exclude'));
359
- addProjectOption(codegraph
360
- .command('repair-index')
361
- .description('Drop config exclude rules that block tracked source files, then rebuild the index from scratch (drops rows for deleted files)')).action((options) => runCodegraphRepairCommand(io, options, options.peaksJson, 'index'));
362
- addProjectOption(codegraph
363
- .command('config-restore')
364
- .description('Restore .codegraph/config.json from the byte-exact .bak a repair left — the explicit undo of a repair')).action((options) => runCodegraphConfigRestoreCommand(io, options, options.peaksJson));
33
+ registerCodegraphRepairCommands(codegraph, io);
34
+ registerCodegraphConfigRestoreCommand(codegraph, io);
365
35
  addProjectOption(codegraph
366
36
  .command('init')
367
37
  .description('Initialize codegraph for a project')
368
38
  .option('--force', 'delete a foreign (non-peaks-loop) .codegraph/ directory and initialize fresh; never follows a link and never deletes a peaks-loop-managed index')).action((options) => runCodegraphInitCommand(io, options, options.peaksJson));
369
- addProjectOption(codegraph
370
- .command('index')
371
- .description('Index a project with codegraph')
372
- .option('--force', 'force reindexing')
373
- .option('--quiet', 'reduce upstream output')).action(async (options) => {
374
- // `runCodegraphCommand` returns "upstream failed" for the one caller
375
- // that ranks exit-code precedence (`status`); every other command just
376
- // awaits it, so it is discarded here rather than leaked to commander.
377
- await runCodegraphCommand(io, 'codegraph.index', {
378
- subcommand: 'index',
379
- project: options.project,
380
- ...(options.force === true ? { force: true } : {}),
381
- ...(options.quiet === true ? { quiet: true } : {})
382
- }, options.peaksJson);
383
- });
384
- addProjectOption(codegraph
385
- .command('query')
386
- .description('Query codegraph')
387
- .argument('<search>', 'search text')
388
- .option('--json', 'forward JSON output flag to upstream codegraph')
389
- .option('--limit <n>', 'maximum result count', parsePositiveInteger)).action(async (search, options) => {
390
- await runCodegraphCommand(io, 'codegraph.query', {
391
- subcommand: 'query',
392
- project: options.project,
393
- search,
394
- ...(options.json === true ? { json: true } : {}),
395
- ...(options.limit !== undefined ? { limit: options.limit } : {})
396
- }, options.peaksJson);
397
- });
398
- addProjectOption(codegraph
399
- .command('files')
400
- .description('List codegraph files')
401
- .option('--json', 'forward JSON output flag to upstream codegraph')
402
- .option('--max-depth <n>', 'maximum traversal depth', parsePositiveInteger)).action(async (options) => {
403
- await runCodegraphCommand(io, 'codegraph.files', {
404
- subcommand: 'files',
405
- project: options.project,
406
- ...(options.json === true ? { json: true } : {}),
407
- ...(options.maxDepth !== undefined ? { maxDepth: options.maxDepth } : {})
408
- }, options.peaksJson);
409
- });
410
- addProjectOption(codegraph
411
- .command('context')
412
- .description('Build task context with codegraph')
413
- .argument('<task>', 'task text')).action(async (task, options) => {
414
- await runCodegraphCommand(io, 'codegraph.context', { subcommand: 'context', project: options.project, task }, options.peaksJson);
415
- });
416
- addProjectOption(codegraph
417
- .command('affected')
418
- .description('Find code affected by files')
419
- .argument('<files...>', 'project-relative file paths')
420
- .option('--json', 'forward JSON output flag to upstream codegraph')
421
- .option('--rid <rid>', 'request id for the codegraph-context envelope (default: env PEAKS_RD_RID or "unknown-rid")')
422
- .option('--write-envelope', 'write codegraph-context.md into the active session')).action((files, options) => runCodegraphAffectedCommand(io, files, options, options.peaksJson));
39
+ registerCodegraphProxyCommands(codegraph, io);
423
40
  }
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ import { type ProgramIO } from '../cli-helpers.js';
3
+ export declare function registerCodegraphConfigRestoreCommand(codegraph: Command, io: ProgramIO): void;
@@ -0,0 +1,200 @@
1
+ // src/cli/commands/codegraph-config-restore-command.ts
2
+ //
3
+ // `peaks codegraph config-restore` — the explicit undo of a repair. Split out
4
+ // of `codegraph-commands.ts`; the verb name, options and envelopes are
5
+ // unchanged.
6
+ import { assertCodegraphDirContained, resolveProjectRoot } from '../../services/codegraph/codegraph-service.js';
7
+ import { resolveCodegraphConfigSource } from '../../services/codegraph/codegraph-project-config.js';
8
+ import { rollbackCodegraphConfig } from '../../services/codegraph/codegraph-config-repair-writer.js';
9
+ import { fail, ok } from 'peaks-loop-shared/result';
10
+ import { getErrorMessage, printResult, redactSensitiveErrorMessage } from '../cli-helpers.js';
11
+ import { addProjectOption } from './codegraph-command-options.js';
12
+ /**
13
+ * Exit code for a `config-restore` run that never reached the restore point:
14
+ * `--project` is missing or not a directory, or the containment guard refused
15
+ * the `.codegraph/` directory.
16
+ *
17
+ * Deliberately NOT `CODEGRAPH_CONFIG_RESTORE_EXIT_CODE` (77). The two codes
18
+ * answer different questions, and a CI job has to be able to tell them apart:
19
+ *
20
+ * - 1 — the command was never aimed at a usable project. Nothing looked at a
21
+ * rollback point, so "your backup is unusable" would be a verdict
22
+ * nothing reached, and the remedy is a different one (fix the path, or
23
+ * remove the link). The VALUE is 1 because that is what every other
24
+ * codegraph verb already exits with for this same input failure —
25
+ * `repair-exclude --project <bad>` and `status --project <bad>` both
26
+ * exit 1 (measured), so a caller that handles one handles this one.
27
+ * - 77 — the restore point WAS examined and the restore did not happen.
28
+ *
29
+ * Named rather than left as `printCodegraphFailure`'s default `1` so both
30
+ * classes are visible in one place, side by side, instead of one of them living
31
+ * only in another module's parameter default.
32
+ */
33
+ const CODEGRAPH_CONFIG_RESTORE_PRECONDITION_EXIT_CODE = 1;
34
+ /**
35
+ * Exit code for `peaks codegraph config-restore` when the restore did not
36
+ * happen: the backup is absent, unreadable, or REFUSED (a symbolic link, a
37
+ * hard link or a directory occupies the fixed, guessable `.bak` path), or the
38
+ * reverse write itself failed.
39
+ *
40
+ * Its own code rather than the precondition `1`, for the same reason 73/74/75/76
41
+ * have theirs: it is an operator-actionable verdict about the RESTORE POINT, and
42
+ * a CI job has to be able to tell it apart from "the command was aimed wrong".
43
+ * The cause lives in `data.reason`, which names the path and the shape that was
44
+ * refused — a per-cause CODE would need the rollback helper to return a
45
+ * discriminated reason rather than a message, which is a change to that helper's
46
+ * contract for no operator-visible gain while the message already carries the
47
+ * details.
48
+ */
49
+ const CODEGRAPH_CONFIG_RESTORE_EXIT_CODE = 77;
50
+ /**
51
+ * The failure envelope for EVERY `config-restore` failure, so all four `data`
52
+ * keys are present whatever went wrong.
53
+ *
54
+ * A JSON consumer reads `data.restored` and `data.reason` unconditionally, so a
55
+ * failure envelope that omits them leaves it guessing — and this verb reports a
56
+ * `reason` instead of an exit code alone precisely so a failure is never silent.
57
+ * Built here rather than delegated to `printCodegraphFailure`, whose `data` is
58
+ * always `{}` and therefore cannot satisfy that.
59
+ *
60
+ * `code` names the VERB's failure for all three cases; the exit code names the
61
+ * CLASS (precondition vs restore) and `reason` names the cause. That split is
62
+ * deliberate: one `code` a consumer can match on, plus the two facts it needs
63
+ * to decide what to do next.
64
+ *
65
+ * The verb-specific `code` is an INTENTIONAL DIVERGENCE from every other
66
+ * codegraph verb, not a consistency with them — `repair-exclude`,
67
+ * `repair-index` and `status` all report `CODEGRAPH_COMMAND_FAILED` out of
68
+ * `printCodegraphFailure` with `data: {}` (measured, 2026-09-17). Two reasons
69
+ * to diverge here anyway:
70
+ *
71
+ * 1. A generic `code` cannot be paired with a verb-specific `reason`
72
+ * contract: this verb's failure ALWAYS carries `restored`/`reason`, which
73
+ * `printCodegraphFailure` cannot express at all (`fail()` hard-codes the
74
+ * other verbs' `data` to `{}`).
75
+ * 2. `CODEGRAPH_CONFIG_RESTORE_FAILED` says WHICH restore failed, and a
76
+ * consumer matching on `code` gets that from the envelope rather than from
77
+ * the exit code alone.
78
+ *
79
+ * FOLLOW-UP (recorded, not done here — it is out of this slice's scope):
80
+ * `code` naming across the codegraph verb family is now inconsistent, and the
81
+ * rest of the family should either adopt verb-specific codes or this one should
82
+ * return to the generic one. See this slice's RD artifact,
83
+ * `## A1 QA 修复循环 2`.
84
+ */
85
+ function printConfigRestoreFailure(io, failure) {
86
+ const redacted = redactSensitiveErrorMessage(failure.reason);
87
+ printResult(io, fail('codegraph.config-restore', 'CODEGRAPH_CONFIG_RESTORE_FAILED', redacted, { restored: false, from: null, to: null, reason: redacted }, [...failure.nextActions]), failure.asJson);
88
+ process.exitCode = failure.exitCode;
89
+ }
90
+ /** The precondition class: nothing below the resolve ran. */
91
+ function printRestorePreconditionFailure(io, asJson, error) {
92
+ printConfigRestoreFailure(io, {
93
+ asJson,
94
+ reason: getErrorMessage(error),
95
+ exitCode: CODEGRAPH_CONFIG_RESTORE_PRECONDITION_EXIT_CODE,
96
+ nextActions: [
97
+ 'Check that `--project` names an existing directory whose `.codegraph/` resolves inside it.',
98
+ 'Run `peaks codegraph config-restore --project <root>` again once the path is right.'
99
+ ]
100
+ });
101
+ }
102
+ /** The restore class: the reverse write itself threw. */
103
+ function printRestoreWriteFailure(io, asJson, error) {
104
+ printConfigRestoreFailure(io, {
105
+ asJson,
106
+ reason: getErrorMessage(error),
107
+ exitCode: CODEGRAPH_CONFIG_RESTORE_EXIT_CODE,
108
+ nextActions: [
109
+ 'Check that the `.codegraph/` directory is writable, then re-run.',
110
+ 'The config was NOT restored; its bytes are unchanged.'
111
+ ]
112
+ });
113
+ }
114
+ /** The restore class: the rollback point was examined and refused. */
115
+ function printRestoreRefusedFailure(io, asJson, result) {
116
+ printConfigRestoreFailure(io, {
117
+ asJson,
118
+ reason: result.error,
119
+ exitCode: CODEGRAPH_CONFIG_RESTORE_EXIT_CODE,
120
+ nextActions: [
121
+ `There is no usable rollback point at ${result.backupPath}.`,
122
+ 'A restore needs the `.bak` that a previous `peaks codegraph repair-exclude` or `repair-index` left next to the config.'
123
+ ]
124
+ });
125
+ }
126
+ function printRestoreSuccess(io, result, asJson) {
127
+ printResult(io, ok('codegraph.config-restore', {
128
+ restored: true,
129
+ from: result.backupPath,
130
+ to: result.configPath,
131
+ reason: null
132
+ }, [], [
133
+ 'Run `peaks codegraph status --project <root>` to see the restored config reflected in the integrity gate.',
134
+ 'Run `peaks codegraph index` if the index should reflect the restored config too — this verb does not rebuild it.'
135
+ ]), asJson);
136
+ }
137
+ /**
138
+ * `peaks codegraph config-restore` — put `.codegraph/config.json` back to the
139
+ * bytes the last repair backed up to `.codegraph/config.json.bak`.
140
+ *
141
+ * The EXPLICIT undo of a repair, and the only way the `.bak` is ever read: the
142
+ * repair seams leave the copy behind and never consume it, because a repair
143
+ * that restored its own write would cancel itself out (the config would be
144
+ * exactly as it was found, `status` would still report the gap, and exit 75
145
+ * would never clear).
146
+ *
147
+ * Touches the CONFIG FILE ONLY — no `codegraph` subprocess is spawned, so this
148
+ * is safe to run while nothing else is rebuilding. The index still reflects
149
+ * whatever config the last rebuild used; the envelope's `nextActions` says so
150
+ * rather than silently reindexing.
151
+ */
152
+ async function runCodegraphConfigRestoreCommand(io, options, asJson) {
153
+ let configPath;
154
+ try {
155
+ // `resolveProjectRoot` for the same reason the repair verbs use it: the
156
+ // paths reported here must be the canonical ones, or a `--project` alias
157
+ // reports a restore that happened somewhere the operator cannot find.
158
+ const projectRoot = resolveProjectRoot(options.project);
159
+ // The containment refusal the repair seam makes before IT writes here. A
160
+ // `.codegraph/` that resolves outside the canonical project root (a junction
161
+ // or a symlink) would otherwise let this verb publish one project's bytes
162
+ // into another. Called for its refusal only — the paths below stay derived
163
+ // from the caller's canonical `projectRoot`.
164
+ assertCodegraphDirContained(projectRoot);
165
+ // The same resolver the repair WRITES through, so a restore puts back the
166
+ // file the repair replaced — not a same-named file upstream never reads.
167
+ configPath = resolveCodegraphConfigSource(projectRoot).configPath;
168
+ }
169
+ catch (error) {
170
+ printRestorePreconditionFailure(io, asJson, error);
171
+ return;
172
+ }
173
+ let result;
174
+ try {
175
+ result = await rollbackCodegraphConfig(configPath);
176
+ }
177
+ catch (error) {
178
+ // Only the reverse write's own fs failure reaches here (the refusals are
179
+ // returned, not thrown). The RESTORE class, and the same code as a refusal:
180
+ // the restore was attempted and did not happen, and a script that can read
181
+ // one can read the other. What differs is the `reason`, which is this
182
+ // error's own message.
183
+ printRestoreWriteFailure(io, asJson, error);
184
+ return;
185
+ }
186
+ if (!result.rolledBack) {
187
+ // LOUD, never silent: the reason reaches the envelope's `message` (which
188
+ // `fail()` redacts) AND `data.reason`, and the exit code is this verb's
189
+ // own. A restore that quietly reported success over a `.bak` it refused to
190
+ // read is exactly the fail-silent family this release closed.
191
+ printRestoreRefusedFailure(io, asJson, result);
192
+ return;
193
+ }
194
+ printRestoreSuccess(io, result, asJson);
195
+ }
196
+ export function registerCodegraphConfigRestoreCommand(codegraph, io) {
197
+ addProjectOption(codegraph
198
+ .command('config-restore')
199
+ .description('Restore .codegraph/config.json from the byte-exact .bak a repair left — the explicit undo of a repair')).action((options) => runCodegraphConfigRestoreCommand(io, options, options.peaksJson));
200
+ }
@@ -0,0 +1,10 @@
1
+ import type { Command } from 'commander';
2
+ import type { ProgramIO } from '../cli-helpers.js';
3
+ export declare function registerCodegraphIndexCommands(codegraph: Command, io: ProgramIO): void;
4
+ export declare function registerCodegraphFileCommands(codegraph: Command, io: ProgramIO): void;
5
+ export declare function registerCodegraphAffectedCommand(codegraph: Command, io: ProgramIO): void;
6
+ /**
7
+ * The proxy verbs in registration order. `index` / `query` and `files` /
8
+ * `context` are paired because each pair shares a module-level helper set.
9
+ */
10
+ export declare function registerCodegraphProxyCommands(codegraph: Command, io: ProgramIO): void;