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
@@ -1,309 +1,19 @@
1
- import { findProjectRoot } from '../../services/config/config-safety.js';
2
- import { resolveCanonicalProjectRoot } from '../../services/config/config-service.js';
3
- import { loadMemoryIndex, searchMemory } from '../../services/memory/memory-search-service.js';
4
- import { executeMemoryReindex, VALID_PROJECT_MEMORY_KINDS } from '../../services/memory/project-memory-service.js';
5
- import { boundedNames, fitSummaryToBytes } from '../../services/context/summary-view.js';
6
- import { executeMemoryIngest } from '../../services/memory/memory-ingest-service.js';
7
- import { executeMemoryRotate } from '../../services/memory/memory-rotate-service.js';
8
- import { pickFromList } from '../../services/fuzzy-matching/fzf-pick-service.js';
9
- import { fail, ok } from 'peaks-loop-shared/result';
10
- import { getErrorMessage, printResult } from '../cli-helpers.js';
11
- import { join } from 'node:path';
12
- const VALID_KINDS = VALID_PROJECT_MEMORY_KINDS;
13
- /**
14
- * `memory reindex`. The full report's arrays stay on disk / in the default
15
- * envelope; this replaces them with `{count, names}` views (≤ 2 KB).
16
- */
17
- export function buildMemoryReindexSummary(report) {
18
- const view = {
19
- view: 'summary',
20
- apply: report.apply,
21
- projectRoot: report.projectRoot,
22
- memoryDir: report.memoryDir,
23
- indexPath: report.indexPath,
24
- memoryMdPath: report.memoryMdPath,
25
- scannedFiles: report.scannedFiles,
26
- indexed: report.indexed,
27
- indexedByKind: report.indexedByKind,
28
- unclassified: boundedNames(report.unclassified.map((u) => `${u.name}${u.rawKind === null ? '' : ` (${u.rawKind})`}`)),
29
- nameConflicts: boundedNames(report.nameConflicts.map((c) => c.name)),
30
- orphanIndex: boundedNames(report.orphanIndex.map((o) => o.name)),
31
- orphanDisk: boundedNames(report.orphanDisk.map((p) => p.split(/[\\/]/).pop() ?? p)),
32
- memoryMd: report.memoryMd,
33
- writtenFiles: boundedNames(report.writtenFiles.map((p) => p.split(/[\\/]/).pop() ?? p))
34
- };
35
- return fitSummaryToBytes(view);
36
- }
37
- /**
38
- * Slice B: bounded view of `memory list`. `count` is the true total; `names`
39
- * carries `name (kind)` labels for the first N entries.
40
- */
41
- export function buildMemoryListSummary(data) {
42
- const label = (e) => `${e.name} (${e.kind})`;
43
- const view = {
44
- view: 'summary',
45
- indexPath: data.snapshot.indexPath,
46
- version: data.snapshot.version,
47
- updatedAt: data.snapshot.updatedAt,
48
- total: data.entries.length,
49
- kindFilter: data.kindFilter ?? null,
50
- entries: boundedNames(data.entries.map(label))
51
- };
52
- if (data.pickedOutputPath !== null) {
53
- view.picked = boundedNames(data.pickedEntries.map(label));
54
- view.pickedOutputPath = data.pickedOutputPath;
55
- view.fzfVersion = data.fzfVersion;
56
- }
57
- return fitSummaryToBytes(view);
58
- }
59
- function resolveMemoryProjectRoot(project) {
60
- return project !== undefined
61
- ? resolveCanonicalProjectRoot(project)
62
- : (findProjectRoot(process.cwd()) ?? process.cwd());
63
- }
64
- export async function runMemoryList(io, options) {
65
- const projectRoot = options.project !== undefined
66
- ? resolveCanonicalProjectRoot(options.project)
67
- : (findProjectRoot(process.cwd()) ?? process.cwd());
68
- try {
69
- const snapshot = loadMemoryIndex(projectRoot);
70
- const kindFilter = options.kind !== undefined && VALID_KINDS.includes(options.kind)
71
- ? options.kind
72
- : undefined;
73
- const entries = kindFilter === undefined
74
- ? snapshot.entries
75
- : snapshot.entries.filter((e) => e.kind === kindFilter);
76
- const warnings = [];
77
- let pickedEntries = entries;
78
- let pickedOutputPath = null;
79
- let fzfVersion = null;
80
- if (options.pick === true) {
81
- const outputPath = join(projectRoot, '.peaks', 'memory', 'picked.json');
82
- const byName = new Map(entries.map((e) => [e.name, e]));
83
- const result = await pickFromList({
84
- items: entries,
85
- formatLine: (entry) => `${entry.name} | ${entry.kind} | ${entry.description.slice(0, 60)}`,
86
- parseLine: (line) => {
87
- const parts = line.split('|').map((p) => p.trim());
88
- if (parts.length < 1)
89
- return null;
90
- const name = parts[0];
91
- if (name === undefined || name.length === 0)
92
- return null;
93
- return byName.get(name) ?? null;
94
- },
95
- outputPath,
96
- meta: { kindFilter: kindFilter ?? null, totalCandidates: entries.length },
97
- ...(options.fzfBin !== undefined ? { fzfBin: options.fzfBin } : {}),
98
- projectRoot,
99
- multi: true,
100
- prompt: 'memory> '
101
- });
102
- pickedEntries = [...result.picked];
103
- pickedOutputPath = result.outputPath;
104
- fzfVersion = result.fzfVersion;
105
- }
106
- const nextActions = [];
107
- if (pickedOutputPath !== null) {
108
- nextActions.push(`Picked ${pickedEntries.length} entr(ies); written to ${pickedOutputPath}`);
109
- }
110
- if (entries.length === 0) {
111
- nextActions.push('No entries match; run `peaks memory extract` to build the index from memory/*.md files.');
112
- }
113
- // Slice B: `--summary` swaps the full entry array for a bounded
114
- // `{count, names}` view. The default (no flag) envelope is byte-identical
115
- // to before — the flag is strictly opt-in.
116
- const data = options.summary === true
117
- ? buildMemoryListSummary({
118
- snapshot,
119
- entries,
120
- kindFilter,
121
- pickedEntries,
122
- pickedOutputPath,
123
- fzfVersion
124
- })
125
- : {
126
- indexPath: snapshot.indexPath,
127
- version: snapshot.version,
128
- updatedAt: snapshot.updatedAt,
129
- total: entries.length,
130
- kindFilter: kindFilter ?? null,
131
- entries,
132
- ...(options.pick === true
133
- ? { picked: pickedEntries, pickedOutputPath, fzfVersion }
134
- : {})
135
- };
136
- printResult(io, ok('memory.list', data, warnings, nextActions), options.json);
137
- }
138
- catch (error) {
139
- const message = getErrorMessage(error);
140
- const code = error.code ?? 'MEMORY_LIST_FAILED';
141
- const suggestions = [];
142
- if (code === 'INDEX_MISSING') {
143
- suggestions.push('Run `peaks memory extract` to build the index from memory/*.md files');
144
- }
145
- printResult(io, fail('memory.list', code, message, { projectRoot }, suggestions), options.json);
146
- process.exitCode = 1;
147
- }
148
- }
149
- /**
150
- * Run the memory search subcommand. Extracted so unit tests can
151
- * exercise the full envelope without spawning a subprocess.
152
- */
153
- export async function runMemorySearch(io, options) {
154
- const projectRoot = options.project !== undefined
155
- ? resolveCanonicalProjectRoot(options.project)
156
- : (findProjectRoot(process.cwd()) ?? process.cwd());
157
- const kindFilter = options.kind !== undefined && VALID_KINDS.includes(options.kind)
158
- ? options.kind
159
- : undefined;
160
- try {
161
- const matches = searchMemory({
162
- query: options.query,
163
- projectRoot,
164
- ...(options.limit !== undefined ? { limit: options.limit } : {}),
165
- ...(kindFilter !== undefined ? { kind: kindFilter } : {})
166
- });
167
- printResult(io, ok('memory.search', {
168
- query: options.query,
169
- total: matches.length,
170
- matches,
171
- warnings: []
172
- }, []), options.json);
173
- }
174
- catch (error) {
175
- const message = getErrorMessage(error);
176
- const code = error.code ?? 'MEMORY_SEARCH_FAILED';
177
- const suggestions = [];
178
- if (code === 'INDEX_MISSING') {
179
- suggestions.push('Run `peaks memory extract --apply` to build the index from memory/*.md files');
180
- }
181
- if (code === 'EMPTY_QUERY') {
182
- suggestions.push('Use `peaks memory index` to list all entries');
183
- }
184
- printResult(io, fail('memory.search', code, message, { projectRoot, query: options.query }, suggestions), options.json);
185
- process.exitCode = 1;
186
- }
187
- }
188
- /**
189
- * `peaks memory reindex` — rebuild `.peaks/memory/index.json` from disk and
190
- * regenerate `MEMORY.md`. Dry-run by default; `--apply` writes.
191
- */
192
- export async function runMemoryReindex(io, options) {
193
- const projectRoot = resolveMemoryProjectRoot(options.project);
194
- if (options.dryRun === true && options.apply === true) {
195
- printResult(io, fail('memory.reindex', 'INVALID_MEMORY_REINDEX_FLAGS', 'Use either --dry-run or --apply, not both', {}, ['Run without --apply to preview the drift report, or pass --apply to rebuild']), options.json);
196
- process.exitCode = 1;
197
- return;
198
- }
199
- try {
200
- const report = executeMemoryReindex({ projectRoot, apply: options.apply === true });
201
- const nextActions = [];
202
- if (options.apply !== true) {
203
- nextActions.push('Preview only — re-run with --apply to rebuild index.json and regenerate MEMORY.md.');
204
- }
205
- if (report.unclassified.length > 0) {
206
- nextActions.push(`${report.unclassified.length} file(s) have no resolvable kind; add \`metadata.type\` (or \`kind:\`) to index them.`);
207
- }
208
- if (report.orphanIndex.length > 0) {
209
- nextActions.push(`${report.orphanIndex.length} previous index entry(ies) point at missing files; they are dropped from the rebuilt index.`);
210
- }
211
- if (report.nameConflicts.length > 0) {
212
- nextActions.push(`${report.nameConflicts.length} name collision(s) across files; both entries are kept — rename one file to disambiguate.`);
213
- }
214
- // Slice B: `--summary` keeps the scalar drift counts + names-of-first-N;
215
- // the full report (with every unclassified/orphan path) stays available
216
- // by omitting the flag. Default shape is unchanged.
217
- const data = options.summary === true ? buildMemoryReindexSummary(report) : report;
218
- printResult(io, ok('memory.reindex', data, [], nextActions), options.json);
219
- }
220
- catch (error) {
221
- const message = getErrorMessage(error);
222
- const code = error.code ?? 'MEMORY_REINDEX_FAILED';
223
- printResult(io, fail('memory.reindex', code, message, { projectRoot }, [
224
- 'Check that the project has a readable .peaks/memory directory'
225
- ]), options.json);
226
- process.exitCode = 1;
227
- }
228
- }
229
- /**
230
- * `peaks memory rotate` — tier-driven retention for `.peaks/memory/`.
231
- * Implements the sediment pruning policy (tier 1: archive, never delete).
232
- * Dry-run by default; `--apply` moves tier-C candidates into `archived/`.
233
- */
234
- export async function runMemoryRotate(io, options) {
235
- const projectRoot = resolveMemoryProjectRoot(options.project);
236
- if (options.dryRun === true && options.apply === true) {
237
- printResult(io, fail('memory.rotate', 'INVALID_MEMORY_ROTATE_FLAGS', 'Use either --dry-run or --apply, not both', {}, [
238
- 'Run without --apply to preview the rotation plan, or pass --apply to archive tier-C candidates'
239
- ]), options.json);
240
- process.exitCode = 1;
241
- return;
242
- }
243
- try {
244
- const report = executeMemoryRotate({ projectRoot, apply: options.apply === true });
245
- const nextActions = [];
246
- if (report.refused) {
247
- nextActions.push(`Refused to apply: ${report.refusalReasons.join('; ')}`);
248
- }
249
- else if (options.apply !== true) {
250
- nextActions.push('Preview only — re-run with --apply to move the tier-C candidates into archived/.');
251
- }
252
- if (report.excluded.length > 0) {
253
- nextActions.push(`${report.excluded.length} candidate(s) excluded by a safety gate (see \`excluded\`).`);
254
- }
255
- const deleteCandidates = report.candidates.filter((candidate) => candidate.action === 'delete-candidate');
256
- if (deleteCandidates.length > 0) {
257
- nextActions.push(`${deleteCandidates.length} tier-D file(s) are delete-candidates only; peaks never deletes them — remove by hand if you are sure.`);
258
- }
259
- printResult(io, ok('memory.rotate', report, report.warnings, nextActions), options.json);
260
- if (report.refused)
261
- process.exitCode = 1;
262
- }
263
- catch (error) {
264
- const message = getErrorMessage(error);
265
- const code = error.code ?? 'MEMORY_ROTATE_FAILED';
266
- printResult(io, fail('memory.rotate', code, message, { projectRoot }, [
267
- 'Check that the project has a readable .peaks/memory directory'
268
- ]), options.json);
269
- process.exitCode = 1;
270
- }
271
- }
272
- /**
273
- * `peaks memory ingest` — import memories written by the IDE-side agent into
274
- * `.peaks/memory/`. The IDE-side source is read-only; dry-run by default.
275
- */
276
- export async function runMemoryIngest(io, options) {
277
- const projectRoot = resolveMemoryProjectRoot(options.project);
278
- if (options.dryRun === true && options.apply === true) {
279
- printResult(io, fail('memory.ingest', 'INVALID_MEMORY_INGEST_FLAGS', 'Use either --dry-run or --apply, not both', {}, ['Run without --apply to preview imports, or pass --apply to write them into .peaks/memory']), options.json);
280
- process.exitCode = 1;
281
- return;
282
- }
283
- try {
284
- const report = executeMemoryIngest({
285
- projectRoot,
286
- ...(options.sourceDir !== undefined ? { sourceDir: options.sourceDir } : {}),
287
- apply: options.apply === true
288
- });
289
- const nextActions = [];
290
- if (options.apply !== true && report.imported.length > 0) {
291
- nextActions.push('Preview only — re-run with --apply to write these memories into .peaks/memory.');
292
- }
293
- if (report.conflicts.length > 0) {
294
- nextActions.push(`${report.conflicts.length} conflict(s) left both copies in place; resolve them by hand.`);
295
- }
296
- if (report.needsClassification.length > 0) {
297
- nextActions.push(`${report.needsClassification.length} file(s) could not be classified; add \`metadata.type\` to the source before re-running.`);
298
- }
299
- printResult(io, ok('memory.ingest', report, report.warnings, nextActions), options.json);
300
- }
301
- catch (error) {
302
- const message = getErrorMessage(error);
303
- const code = error.code ?? 'MEMORY_INGEST_FAILED';
304
- printResult(io, fail('memory.ingest', code, message, { projectRoot }, [
305
- 'Check the --source-dir path and that .peaks/memory is writable'
306
- ]), options.json);
307
- process.exitCode = 1;
308
- }
309
- }
1
+ // src/cli/commands/memory-commands.ts
2
+ //
3
+ // The `peaks memory` run functions, one module per verb:
4
+ //
5
+ // read : `memory-list-command.ts`, `memory-search-command.ts`
6
+ // write : `memory-reindex-command.ts`, `memory-rotate-command.ts`,
7
+ // `memory-ingest-command.ts`
8
+ // shared: `memory-command-shared.ts` (option types, project root, failures)
9
+ //
10
+ // The Commander wiring lives in `core/memory-command.ts`, which reaches these
11
+ // functions by dynamic `import('../memory-commands.js')`; this module is the
12
+ // path it names and keeps re-exporting every symbol it used to define, so
13
+ // `tests/unit/cli/commands/summary-flag.test.ts` and
14
+ // `tests/unit/services/context/summary-view.test.ts` need no edit.
15
+ export { buildMemoryListSummary, runMemoryList } from './memory-list-command.js';
16
+ export { buildMemoryReindexSummary, runMemoryReindex } from './memory-reindex-command.js';
17
+ export { runMemoryIngest } from './memory-ingest-command.js';
18
+ export { runMemoryRotate } from './memory-rotate-command.js';
19
+ export { runMemorySearch } from './memory-search-command.js';
@@ -0,0 +1,3 @@
1
+ import { type ProgramIO } from '../cli-helpers.js';
2
+ import { type MemoryIngestCommandOptions } from './memory-command-shared.js';
3
+ export declare function runMemoryIngest(io: ProgramIO, options: MemoryIngestCommandOptions): Promise<void>;
@@ -0,0 +1,50 @@
1
+ // src/cli/commands/memory-ingest-command.ts
2
+ //
3
+ // `peaks memory ingest` — import memories written by the IDE-side agent into
4
+ // `.peaks/memory/`. The IDE-side source is read-only; dry-run by default.
5
+ // Extracted from `memory-commands.ts`; the envelope, the flags and the exported
6
+ // symbol name are unchanged.
7
+ import { fail, ok } from 'peaks-loop-shared/result';
8
+ import { executeMemoryIngest } from '../../services/memory/memory-ingest-service.js';
9
+ import { printResult } from '../cli-helpers.js';
10
+ import { memoryFailure, resolveMemoryProjectRoot } from './memory-command-shared.js';
11
+ export async function runMemoryIngest(io, options) {
12
+ const projectRoot = resolveMemoryProjectRoot(options.project);
13
+ if (options.dryRun === true && options.apply === true) {
14
+ printResult(io, fail('memory.ingest', 'INVALID_MEMORY_INGEST_FLAGS', 'Use either --dry-run or --apply, not both', {}, ['Run without --apply to preview imports, or pass --apply to write them into .peaks/memory']), options.json);
15
+ process.exitCode = 1;
16
+ return;
17
+ }
18
+ try {
19
+ const report = executeMemoryIngest({
20
+ projectRoot,
21
+ ...(options.sourceDir !== undefined ? { sourceDir: options.sourceDir } : {}),
22
+ apply: options.apply === true
23
+ });
24
+ printResult(io, ok('memory.ingest', report, report.warnings, ingestNextActions(report, options)), options.json);
25
+ }
26
+ catch (error) {
27
+ printResult(io, memoryFailure({
28
+ command: 'memory.ingest',
29
+ fallbackCode: 'MEMORY_INGEST_FAILED',
30
+ error,
31
+ projectRoot,
32
+ suggestions: ['Check the --source-dir path and that .peaks/memory is writable']
33
+ }), options.json);
34
+ process.exitCode = 1;
35
+ }
36
+ }
37
+ /** The preview / conflict / unclassified notices the report earns, in order. */
38
+ function ingestNextActions(report, options) {
39
+ const nextActions = [];
40
+ if (options.apply !== true && report.imported.length > 0) {
41
+ nextActions.push('Preview only — re-run with --apply to write these memories into .peaks/memory.');
42
+ }
43
+ if (report.conflicts.length > 0) {
44
+ nextActions.push(`${report.conflicts.length} conflict(s) left both copies in place; resolve them by hand.`);
45
+ }
46
+ if (report.needsClassification.length > 0) {
47
+ nextActions.push(`${report.needsClassification.length} file(s) could not be classified; add \`metadata.type\` to the source before re-running.`);
48
+ }
49
+ return nextActions;
50
+ }
@@ -0,0 +1,16 @@
1
+ import { type MemoryIndexEntry, type MemoryIndexSnapshot, type ProjectMemoryKind } from '../../services/memory/memory-search-service.js';
2
+ import { type ProgramIO } from '../cli-helpers.js';
3
+ import { type MemoryListCommandOptions } from './memory-command-shared.js';
4
+ /**
5
+ * Slice B: bounded view of `memory list`. `count` is the true total; `names`
6
+ * carries `name (kind)` labels for the first N entries.
7
+ */
8
+ export declare function buildMemoryListSummary(data: {
9
+ snapshot: MemoryIndexSnapshot;
10
+ entries: readonly MemoryIndexEntry[];
11
+ kindFilter: ProjectMemoryKind | undefined;
12
+ pickedEntries: readonly MemoryIndexEntry[];
13
+ pickedOutputPath: string | null;
14
+ fzfVersion: string | null;
15
+ }): Record<string, unknown>;
16
+ export declare function runMemoryList(io: ProgramIO, options: MemoryListCommandOptions): Promise<void>;
@@ -0,0 +1,129 @@
1
+ // src/cli/commands/memory-list-command.ts
2
+ //
3
+ // `peaks memory list` — read `.peaks/memory/index.json`, optionally with fzf
4
+ // multi-select, plus the Slice B `--summary` view. Extracted from
5
+ // `memory-commands.ts`; the envelope, the flags and the exported symbol names
6
+ // are unchanged.
7
+ import { join } from 'node:path';
8
+ import { ok } from 'peaks-loop-shared/result';
9
+ import { boundedNames, fitSummaryToBytes } from '../../services/context/summary-view.js';
10
+ import { pickFromList } from '../../services/fuzzy-matching/fzf-pick-service.js';
11
+ import { loadMemoryIndex } from '../../services/memory/memory-search-service.js';
12
+ import { printResult } from '../cli-helpers.js';
13
+ import { memoryFailure, resolveKindFilter, resolveMemoryProjectRoot } from './memory-command-shared.js';
14
+ /**
15
+ * Slice B: bounded view of `memory list`. `count` is the true total; `names`
16
+ * carries `name (kind)` labels for the first N entries.
17
+ */
18
+ export function buildMemoryListSummary(data) {
19
+ const label = (e) => `${e.name} (${e.kind})`;
20
+ const view = {
21
+ view: 'summary',
22
+ indexPath: data.snapshot.indexPath,
23
+ version: data.snapshot.version,
24
+ updatedAt: data.snapshot.updatedAt,
25
+ total: data.entries.length,
26
+ kindFilter: data.kindFilter ?? null,
27
+ entries: boundedNames(data.entries.map(label))
28
+ };
29
+ if (data.pickedOutputPath !== null) {
30
+ view.picked = boundedNames(data.pickedEntries.map(label));
31
+ view.pickedOutputPath = data.pickedOutputPath;
32
+ view.fzfVersion = data.fzfVersion;
33
+ }
34
+ return fitSummaryToBytes(view);
35
+ }
36
+ export async function runMemoryList(io, options) {
37
+ const projectRoot = resolveMemoryProjectRoot(options.project);
38
+ try {
39
+ const snapshot = loadMemoryIndex(projectRoot);
40
+ const kindFilter = resolveKindFilter(options.kind);
41
+ const entries = kindFilter === undefined
42
+ ? snapshot.entries
43
+ : snapshot.entries.filter((e) => e.kind === kindFilter);
44
+ const picked = await pickMemoryEntries(projectRoot, entries, kindFilter, options);
45
+ const data = memoryListData({ snapshot, entries, kindFilter, options, picked });
46
+ printResult(io, ok('memory.list', data, [], listNextActions(entries, picked)), options.json);
47
+ }
48
+ catch (error) {
49
+ printResult(io, memoryFailure({
50
+ command: 'memory.list',
51
+ fallbackCode: 'MEMORY_LIST_FAILED',
52
+ error,
53
+ projectRoot,
54
+ byCode: {
55
+ INDEX_MISSING: 'Run `peaks memory extract` to build the index from memory/*.md files'
56
+ }
57
+ }), options.json);
58
+ process.exitCode = 1;
59
+ }
60
+ }
61
+ /** The pick notice and the empty-index notice, in that order. */
62
+ function listNextActions(entries, picked) {
63
+ const nextActions = [];
64
+ if (picked.pickedOutputPath !== null) {
65
+ nextActions.push(`Picked ${picked.pickedEntries.length} entr(ies); written to ${picked.pickedOutputPath}`);
66
+ }
67
+ if (entries.length === 0) {
68
+ nextActions.push('No entries match; run `peaks memory extract` to build the index from memory/*.md files.');
69
+ }
70
+ return nextActions;
71
+ }
72
+ /**
73
+ * Slice B: `--summary` swaps the full entry array for a bounded
74
+ * `{count, names}` view. The default (no flag) view is byte-identical to
75
+ * before — the flag is strictly opt-in.
76
+ */
77
+ function memoryListData(input) {
78
+ const { snapshot, entries, kindFilter, options, picked } = input;
79
+ if (options.summary === true) {
80
+ return buildMemoryListSummary({ snapshot, entries, kindFilter, ...picked });
81
+ }
82
+ return {
83
+ indexPath: snapshot.indexPath,
84
+ version: snapshot.version,
85
+ updatedAt: snapshot.updatedAt,
86
+ total: entries.length,
87
+ kindFilter: kindFilter ?? null,
88
+ entries,
89
+ ...(options.pick === true
90
+ ? {
91
+ picked: picked.pickedEntries,
92
+ pickedOutputPath: picked.pickedOutputPath,
93
+ fzfVersion: picked.fzfVersion
94
+ }
95
+ : {})
96
+ };
97
+ }
98
+ /** The `--pick` branch, or the unchanged entry list when the flag is absent. */
99
+ async function pickMemoryEntries(projectRoot, entries, kindFilter, options) {
100
+ if (options.pick !== true) {
101
+ return { pickedEntries: entries, pickedOutputPath: null, fzfVersion: null };
102
+ }
103
+ const outputPath = join(projectRoot, '.peaks', 'memory', 'picked.json');
104
+ const byName = new Map(entries.map((e) => [e.name, e]));
105
+ const result = await pickFromList({
106
+ items: entries,
107
+ formatLine: (entry) => `${entry.name} | ${entry.kind} | ${entry.description.slice(0, 60)}`,
108
+ parseLine: (line) => {
109
+ const parts = line.split('|').map((p) => p.trim());
110
+ if (parts.length < 1)
111
+ return null;
112
+ const name = parts[0];
113
+ if (name === undefined || name.length === 0)
114
+ return null;
115
+ return byName.get(name) ?? null;
116
+ },
117
+ outputPath,
118
+ meta: { kindFilter: kindFilter ?? null, totalCandidates: entries.length },
119
+ ...(options.fzfBin !== undefined ? { fzfBin: options.fzfBin } : {}),
120
+ projectRoot,
121
+ multi: true,
122
+ prompt: 'memory> '
123
+ });
124
+ return {
125
+ pickedEntries: [...result.picked],
126
+ pickedOutputPath: result.outputPath,
127
+ fzfVersion: result.fzfVersion
128
+ };
129
+ }
@@ -0,0 +1,9 @@
1
+ import { type MemoryReindexReport } from '../../services/memory/project-memory-service.js';
2
+ import { type ProgramIO } from '../cli-helpers.js';
3
+ import { type MemoryReindexCommandOptions } from './memory-command-shared.js';
4
+ /**
5
+ * `memory reindex`. The full report's arrays stay on disk / in the default
6
+ * envelope; this replaces them with `{count, names}` views (≤ 2 KB).
7
+ */
8
+ export declare function buildMemoryReindexSummary(report: MemoryReindexReport): Record<string, unknown>;
9
+ export declare function runMemoryReindex(io: ProgramIO, options: MemoryReindexCommandOptions): Promise<void>;
@@ -0,0 +1,78 @@
1
+ // src/cli/commands/memory-reindex-command.ts
2
+ //
3
+ // `peaks memory reindex` — rebuild `.peaks/memory/index.json` from disk and
4
+ // regenerate `MEMORY.md`. Dry-run by default; `--apply` writes. Extracted from
5
+ // `memory-commands.ts`; the envelope, the flags and the exported symbol names
6
+ // are unchanged.
7
+ import { fail, ok } from 'peaks-loop-shared/result';
8
+ import { boundedNames, fitSummaryToBytes } from '../../services/context/summary-view.js';
9
+ import { executeMemoryReindex } from '../../services/memory/project-memory-service.js';
10
+ import { printResult } from '../cli-helpers.js';
11
+ import { memoryFailure, resolveMemoryProjectRoot } from './memory-command-shared.js';
12
+ /**
13
+ * `memory reindex`. The full report's arrays stay on disk / in the default
14
+ * envelope; this replaces them with `{count, names}` views (≤ 2 KB).
15
+ */
16
+ export function buildMemoryReindexSummary(report) {
17
+ const view = {
18
+ view: 'summary',
19
+ apply: report.apply,
20
+ projectRoot: report.projectRoot,
21
+ memoryDir: report.memoryDir,
22
+ indexPath: report.indexPath,
23
+ memoryMdPath: report.memoryMdPath,
24
+ scannedFiles: report.scannedFiles,
25
+ indexed: report.indexed,
26
+ indexedByKind: report.indexedByKind,
27
+ unclassified: boundedNames(report.unclassified.map((u) => `${u.name}${u.rawKind === null ? '' : ` (${u.rawKind})`}`)),
28
+ nameConflicts: boundedNames(report.nameConflicts.map((c) => c.name)),
29
+ orphanIndex: boundedNames(report.orphanIndex.map((o) => o.name)),
30
+ orphanDisk: boundedNames(report.orphanDisk.map((p) => p.split(/[\\/]/).pop() ?? p)),
31
+ memoryMd: report.memoryMd,
32
+ writtenFiles: boundedNames(report.writtenFiles.map((p) => p.split(/[\\/]/).pop() ?? p))
33
+ };
34
+ return fitSummaryToBytes(view);
35
+ }
36
+ export async function runMemoryReindex(io, options) {
37
+ const projectRoot = resolveMemoryProjectRoot(options.project);
38
+ if (options.dryRun === true && options.apply === true) {
39
+ printResult(io, fail('memory.reindex', 'INVALID_MEMORY_REINDEX_FLAGS', 'Use either --dry-run or --apply, not both', {}, ['Run without --apply to preview the drift report, or pass --apply to rebuild']), options.json);
40
+ process.exitCode = 1;
41
+ return;
42
+ }
43
+ try {
44
+ const report = executeMemoryReindex({ projectRoot, apply: options.apply === true });
45
+ // Slice B: `--summary` keeps the scalar drift counts + names-of-first-N;
46
+ // the full report (with every unclassified/orphan path) stays available
47
+ // by omitting the flag. Default shape is unchanged.
48
+ const data = options.summary === true ? buildMemoryReindexSummary(report) : report;
49
+ printResult(io, ok('memory.reindex', data, [], reindexNextActions(report, options)), options.json);
50
+ }
51
+ catch (error) {
52
+ printResult(io, memoryFailure({
53
+ command: 'memory.reindex',
54
+ fallbackCode: 'MEMORY_REINDEX_FAILED',
55
+ error,
56
+ projectRoot,
57
+ suggestions: ['Check that the project has a readable .peaks/memory directory']
58
+ }), options.json);
59
+ process.exitCode = 1;
60
+ }
61
+ }
62
+ /** The drift notices the report earns, in the report's own field order. */
63
+ function reindexNextActions(report, options) {
64
+ const nextActions = [];
65
+ if (options.apply !== true) {
66
+ nextActions.push('Preview only — re-run with --apply to rebuild index.json and regenerate MEMORY.md.');
67
+ }
68
+ if (report.unclassified.length > 0) {
69
+ nextActions.push(`${report.unclassified.length} file(s) have no resolvable kind; add \`metadata.type\` (or \`kind:\`) to index them.`);
70
+ }
71
+ if (report.orphanIndex.length > 0) {
72
+ nextActions.push(`${report.orphanIndex.length} previous index entry(ies) point at missing files; they are dropped from the rebuilt index.`);
73
+ }
74
+ if (report.nameConflicts.length > 0) {
75
+ nextActions.push(`${report.nameConflicts.length} name collision(s) across files; both entries are kept — rename one file to disambiguate.`);
76
+ }
77
+ return nextActions;
78
+ }
@@ -0,0 +1,3 @@
1
+ import { type ProgramIO } from '../cli-helpers.js';
2
+ import { type MemoryRotateCommandOptions } from './memory-command-shared.js';
3
+ export declare function runMemoryRotate(io: ProgramIO, options: MemoryRotateCommandOptions): Promise<void>;