peaks-loop 4.0.0-beta.9 → 4.0.3

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 (552) hide show
  1. package/CHANGELOG.md +572 -234
  2. package/README-en.md +67 -30
  3. package/README.md +67 -30
  4. package/agents/karpathy-reviewer.md +33 -0
  5. package/bin/peaks.js +0 -0
  6. package/dist/cli/cli-helpers.d.ts +31 -6
  7. package/dist/cli/cli-helpers.js +48 -25
  8. package/dist/cli/commands/_register.d.ts +3 -0
  9. package/dist/cli/commands/_register.js +139 -0
  10. package/dist/cli/commands/_super.d.ts +10 -0
  11. package/dist/cli/commands/_super.js +97 -0
  12. package/dist/cli/commands/adapter-commands-s2a.js +1 -1
  13. package/dist/cli/commands/asset-commands.js +33 -16
  14. package/dist/cli/commands/audit-commands.js +2 -2
  15. package/dist/cli/commands/autonomous-swarm-commands.d.ts +12 -0
  16. package/dist/cli/commands/autonomous-swarm-commands.js +120 -0
  17. package/dist/cli/commands/bee-commands.js +1 -1
  18. package/dist/cli/commands/capability-commands.js +1 -1
  19. package/dist/cli/commands/capability-worker-config-sc-commands.js +0 -2
  20. package/dist/cli/commands/changeset-commands.d.ts +13 -0
  21. package/dist/cli/commands/changeset-commands.js +46 -0
  22. package/dist/cli/commands/code-commands.d.ts +11 -1
  23. package/dist/cli/commands/code-commands.js +19 -699
  24. package/dist/cli/commands/code-job-shape-commands.d.ts +9 -0
  25. package/dist/cli/commands/code-job-shape-commands.js +164 -0
  26. package/dist/cli/commands/code-mode-gate-commands.d.ts +9 -0
  27. package/dist/cli/commands/code-mode-gate-commands.js +223 -0
  28. package/dist/cli/commands/code-review-commands.js +2 -2
  29. package/dist/cli/commands/code-run-command.d.ts +12 -0
  30. package/dist/cli/commands/code-run-command.js +68 -0
  31. package/dist/cli/commands/code-runtime-commands.d.ts +11 -0
  32. package/dist/cli/commands/code-runtime-commands.js +391 -0
  33. package/dist/cli/commands/codegraph-commands.js +1 -1
  34. package/dist/cli/commands/compact-command.js +53 -1
  35. package/dist/cli/commands/complexity-commands.js +1 -1
  36. package/dist/cli/commands/config-commands.js +4 -75
  37. package/dist/cli/commands/container-commands.d.ts +28 -0
  38. package/dist/cli/commands/container-commands.js +221 -0
  39. package/dist/cli/commands/context-commands.js +3 -2
  40. package/dist/cli/commands/core/artifacts-command.js +1 -1
  41. package/dist/cli/commands/core/binding-commands.js +1 -1
  42. package/dist/cli/commands/core/doctor-command.js +63 -3
  43. package/dist/cli/commands/core/memory-command.js +1 -1
  44. package/dist/cli/commands/core/profile-command.js +1 -1
  45. package/dist/cli/commands/core/proxy-command.js +1 -1
  46. package/dist/cli/commands/core/session-command.js +9 -7
  47. package/dist/cli/commands/core/skill-command.js +7 -4
  48. package/dist/cli/commands/core/standards-command.js +1 -1
  49. package/dist/cli/commands/cron-commands.d.ts +57 -0
  50. package/dist/cli/commands/cron-commands.js +257 -0
  51. package/dist/cli/commands/cron-scheduler-commands.d.ts +47 -0
  52. package/dist/cli/commands/cron-scheduler-commands.js +284 -0
  53. package/dist/cli/commands/dashboard-commands.d.ts +4 -0
  54. package/dist/cli/commands/dashboard-commands.js +10 -0
  55. package/dist/cli/commands/dashboard-long-run.d.ts +25 -0
  56. package/dist/cli/commands/dashboard-long-run.js +122 -0
  57. package/dist/cli/commands/dashboard-summary.d.ts +12 -0
  58. package/dist/cli/commands/dashboard-summary.js +58 -0
  59. package/dist/cli/commands/dispatch-commands.d.ts +0 -7
  60. package/dist/cli/commands/dispatch-commands.js +372 -8
  61. package/dist/cli/commands/dispatch-from-dag.js +4 -1
  62. package/dist/cli/commands/doc-commands.js +1 -1
  63. package/dist/cli/commands/ecc-commands.d.ts +30 -0
  64. package/dist/cli/commands/ecc-commands.js +119 -0
  65. package/dist/cli/commands/evolution-commands.js +1 -1
  66. package/dist/cli/commands/feedback-commands.js +1 -1
  67. package/dist/cli/commands/final-review-commands.js +1 -1
  68. package/dist/cli/commands/fixture-commands.js +1 -1
  69. package/dist/cli/commands/fork-commands.js +1 -1
  70. package/dist/cli/commands/gate-commands.js +128 -6
  71. package/dist/cli/commands/governance-classify-contract-commands.d.ts +21 -0
  72. package/dist/cli/commands/governance-classify-contract-commands.js +273 -0
  73. package/dist/cli/commands/heartbeat-commands.js +76 -5
  74. package/dist/cli/commands/heartbeat-watch-command.d.ts +31 -0
  75. package/dist/cli/commands/heartbeat-watch-command.js +146 -0
  76. package/dist/cli/commands/hook-handle.js +1 -1
  77. package/dist/cli/commands/hooks-commands.js +126 -10
  78. package/dist/cli/commands/ide-commands.js +1 -1
  79. package/dist/cli/commands/impact-commands.js +1 -1
  80. package/dist/cli/commands/job-commands.js +34 -1
  81. package/dist/cli/commands/lease-metrics-commands.d.ts +67 -0
  82. package/dist/cli/commands/lease-metrics-commands.js +231 -0
  83. package/dist/cli/commands/lease-stats-commands.d.ts +65 -0
  84. package/dist/cli/commands/lease-stats-commands.js +107 -0
  85. package/dist/cli/commands/legacy-commands.js +1 -1
  86. package/dist/cli/commands/log-commands.js +1 -1
  87. package/dist/cli/commands/loop-commands.js +1 -1
  88. package/dist/cli/commands/loop-eval-commands.js +1 -1
  89. package/dist/cli/commands/memory-commands.js +1 -1
  90. package/dist/cli/commands/migrate-1-4-1-command.js +1 -1
  91. package/dist/cli/commands/migrate-v2-10-to-v2-11-command.js +1 -1
  92. package/dist/cli/commands/mut-commands.d.ts +1 -1
  93. package/dist/cli/commands/mut-commands.js +1 -5
  94. package/dist/cli/commands/observability-commands.js +1 -1
  95. package/dist/cli/commands/openspec-commands.js +65 -4
  96. package/dist/cli/commands/perf-audit-commands.js +3 -3
  97. package/dist/cli/commands/perf-commands.js +1 -1
  98. package/dist/cli/commands/polyrepo-commands.js +1 -1
  99. package/dist/cli/commands/prd-blocks-commands.js +1 -1
  100. package/dist/cli/commands/prd-commands.js +4 -2
  101. package/dist/cli/commands/preferences-commands.js +23 -3
  102. package/dist/cli/commands/project-commands.js +1 -1
  103. package/dist/cli/commands/qa-business-review-commands.js +1 -1
  104. package/dist/cli/commands/qa-commands.d.ts +1 -1
  105. package/dist/cli/commands/qa-commands.js +39 -3
  106. package/dist/cli/commands/release-commands.d.ts +15 -0
  107. package/dist/cli/commands/release-commands.js +113 -21
  108. package/dist/cli/commands/request-commands.js +1 -1
  109. package/dist/cli/commands/retrospective-commands.js +1 -1
  110. package/dist/cli/commands/reviewer-commands.js +1 -1
  111. package/dist/cli/commands/role-commands.js +1 -1
  112. package/dist/cli/commands/runtime-commands-helpers.d.ts +7 -0
  113. package/dist/cli/commands/runtime-commands-helpers.js +24 -0
  114. package/dist/cli/commands/runtime-commands.js +1 -2
  115. package/dist/cli/commands/sc-commands.js +4 -2
  116. package/dist/cli/commands/scan-commands.js +1 -1
  117. package/dist/cli/commands/security-audit-commands.js +3 -3
  118. package/dist/cli/commands/sediment-commands.js +10 -1
  119. package/dist/cli/commands/session-24h-mode.d.ts +26 -0
  120. package/dist/cli/commands/session-24h-mode.js +196 -0
  121. package/dist/cli/commands/share-commands.d.ts +19 -0
  122. package/dist/cli/commands/share-commands.js +121 -2
  123. package/dist/cli/commands/skill-conformance-commands.js +1 -1
  124. package/dist/cli/commands/skill-loop-engineering-readiness-commands.js +1 -1
  125. package/dist/cli/commands/skill-search-commands.js +4 -1
  126. package/dist/cli/commands/slice-commands.js +1 -1
  127. package/dist/cli/commands/slice-integrate-commands.js +1 -1
  128. package/dist/cli/commands/slice-review-commands.js +1 -1
  129. package/dist/cli/commands/smoke-commands.js +1 -1
  130. package/dist/cli/commands/sop-commands.js +1 -1
  131. package/dist/cli/commands/spill-demo-command.d.ts +7 -0
  132. package/dist/cli/commands/spill-demo-command.js +29 -0
  133. package/dist/cli/commands/statusline-commands.d.ts +12 -0
  134. package/dist/cli/commands/statusline-commands.js +79 -17
  135. package/dist/cli/commands/sub-agent-commands.js +2 -1
  136. package/dist/cli/commands/sub-agent-shared.d.ts +10 -0
  137. package/dist/cli/commands/sub-agent-shared.js +24 -1
  138. package/dist/cli/commands/swarm-commands.d.ts +13 -0
  139. package/dist/cli/commands/swarm-commands.js +77 -0
  140. package/dist/cli/commands/tech-commands.d.ts +64 -0
  141. package/dist/cli/commands/tech-commands.js +195 -0
  142. package/dist/cli/commands/understand-commands.js +1 -1
  143. package/dist/cli/commands/upgrade-commands.d.ts +2 -0
  144. package/dist/cli/commands/upgrade-commands.js +40 -5
  145. package/dist/cli/commands/user-touchpoint-commands.js +1 -1
  146. package/dist/cli/commands/verdict-aggregate-command.js +1 -1
  147. package/dist/cli/commands/vm-commands.d.ts +31 -0
  148. package/dist/cli/commands/vm-commands.js +274 -0
  149. package/dist/cli/commands/workflow-commands.js +24 -1
  150. package/dist/cli/commands/workflow-plan-commands.js +1 -1
  151. package/dist/cli/commands/workspace/init-command.js +1 -1
  152. package/dist/cli/commands/workspace/migrate-command.js +1 -1
  153. package/dist/cli/commands/workspace/reconcile-command.js +1 -1
  154. package/dist/cli/commands/worktree-auth-commands.d.ts +29 -0
  155. package/dist/cli/commands/worktree-auth-commands.js +652 -0
  156. package/dist/cli/index.js +58 -13
  157. package/dist/cli/program.d.ts +2 -2
  158. package/dist/cli/program.js +86 -281
  159. package/dist/services/24h-mode/decider.d.ts +103 -0
  160. package/dist/services/24h-mode/decider.js +144 -0
  161. package/dist/services/24h-mode/index.d.ts +12 -0
  162. package/dist/services/24h-mode/index.js +12 -0
  163. package/dist/services/24h-mode/state.d.ts +48 -0
  164. package/dist/services/24h-mode/state.js +51 -0
  165. package/dist/services/24h-mode/store.d.ts +27 -0
  166. package/dist/services/24h-mode/store.js +119 -0
  167. package/dist/services/artifacts/artifact-prerequisites.js +1 -1
  168. package/dist/services/artifacts/request-artifact-service.js +1 -1
  169. package/dist/services/artifacts/workspace-service.js +1 -1
  170. package/dist/services/audit/enforcers/lint-bee-runtime-contract.d.ts +25 -0
  171. package/dist/services/audit/enforcers/lint-bee-runtime-contract.js +91 -0
  172. package/dist/services/audit/enforcers/lint-peaks-code-runtime.d.ts +16 -0
  173. package/dist/services/audit/enforcers/lint-peaks-code-runtime.js +31 -0
  174. package/dist/services/audit/enforcers/lint-peaks-skill-runtime.d.ts +23 -0
  175. package/dist/services/audit/enforcers/lint-peaks-skill-runtime.js +59 -0
  176. package/dist/services/audit/enforcers/lint-peaks-ui-sc-txt-runtime.d.ts +28 -0
  177. package/dist/services/audit/enforcers/lint-peaks-ui-sc-txt-runtime.js +86 -0
  178. package/dist/services/audit/enforcers/lint-prd-artifact-handoff.d.ts +16 -0
  179. package/dist/services/audit/enforcers/lint-prd-artifact-handoff.js +41 -0
  180. package/dist/services/audit/enforcers/lint-prd-source-snapshot.d.ts +27 -0
  181. package/dist/services/audit/enforcers/lint-prd-source-snapshot.js +47 -0
  182. package/dist/services/audit/enforcers/lint-qa-gateguard-and-runtime.d.ts +19 -0
  183. package/dist/services/audit/enforcers/lint-qa-gateguard-and-runtime.js +47 -0
  184. package/dist/services/audit/enforcers/lint-rd-handoff-coverage.d.ts +18 -0
  185. package/dist/services/audit/enforcers/lint-rd-handoff-coverage.js +70 -0
  186. package/dist/services/audit/enforcers/lint-skill-presence-mandatory.d.ts +25 -0
  187. package/dist/services/audit/enforcers/lint-skill-presence-mandatory.js +53 -0
  188. package/dist/services/audit/red-line-catalog-p2-a.d.ts +0 -6
  189. package/dist/services/audit/red-line-catalog-p2-a.js +230 -1
  190. package/dist/services/audit/static-service.d.ts +32 -25
  191. package/dist/services/audit/static-service.js +30 -109
  192. package/dist/services/audit-independent/index.d.ts +2 -0
  193. package/dist/services/audit-independent/index.js +2 -0
  194. package/dist/services/autonomous-swarm/autonomous-swarm-service.d.ts +127 -0
  195. package/dist/services/autonomous-swarm/autonomous-swarm-service.js +446 -0
  196. package/dist/services/changeset/changeset-check-service.d.ts +22 -0
  197. package/dist/services/changeset/changeset-check-service.js +47 -0
  198. package/dist/services/code/auto-compact-modes.d.ts +30 -0
  199. package/dist/services/code/auto-compact-modes.js +38 -0
  200. package/dist/services/code/auto-compact-orchestrator.d.ts +43 -5
  201. package/dist/services/code/auto-compact-orchestrator.js +101 -21
  202. package/dist/services/code/dag-orchestrator.d.ts +30 -1
  203. package/dist/services/code/dag-orchestrator.js +106 -1
  204. package/dist/services/code/status-line-renderer.d.ts +2 -0
  205. package/dist/services/code/status-line-renderer.js +21 -3
  206. package/dist/services/code-review/ocr-service.d.ts +1 -1
  207. package/dist/services/code-review/ocr-service.js +6 -3
  208. package/dist/services/compact-history/compact-history-service.d.ts +41 -0
  209. package/dist/services/compact-history/compact-history-service.js +62 -0
  210. package/dist/services/compact-statusline/compact-statusline-service.d.ts +16 -0
  211. package/dist/services/compact-statusline/compact-statusline-service.js +83 -0
  212. package/dist/services/config/config-service.d.ts +1 -12
  213. package/dist/services/config/config-service.js +3 -72
  214. package/dist/services/config/config-types.d.ts +2 -4
  215. package/dist/services/config/config-types.js +1 -1
  216. package/dist/services/container/container-lease.d.ts +67 -0
  217. package/dist/services/container/container-lease.js +135 -0
  218. package/dist/services/context/auto-compact-dispatcher.d.ts +40 -5
  219. package/dist/services/context/auto-compact-dispatcher.js +32 -102
  220. package/dist/services/context/auto-compact-reader.js +1 -1
  221. package/dist/services/context/auto-compact-types.d.ts +27 -2
  222. package/dist/services/context/auto-compact-types.js +8 -1
  223. package/dist/services/context/build-dispatch-system-prompt.d.ts +75 -0
  224. package/dist/services/context/build-dispatch-system-prompt.js +117 -0
  225. package/dist/services/context/collector.d.ts +2 -2
  226. package/dist/services/context/context-builder.d.ts +4 -4
  227. package/dist/services/context/context-schema.d.ts +48 -48
  228. package/dist/services/context/ide-detect.d.ts +4 -0
  229. package/dist/services/context/ide-detect.js +24 -0
  230. package/dist/services/context/main-session-monitor.d.ts +1 -4
  231. package/dist/services/context/main-session-monitor.js +1 -24
  232. package/dist/services/context/memory-index-reader.d.ts +8 -0
  233. package/dist/services/context/memory-index-reader.js +57 -0
  234. package/dist/services/context/memory-lru-cache.d.ts +12 -0
  235. package/dist/services/context/memory-lru-cache.js +60 -0
  236. package/dist/services/context/memory-preflight-config.d.ts +19 -0
  237. package/dist/services/context/memory-preflight-config.js +25 -0
  238. package/dist/services/context/memory-preflight-service.d.ts +19 -0
  239. package/dist/services/context/memory-preflight-service.js +120 -0
  240. package/dist/services/context/spillover-store.d.ts +23 -0
  241. package/dist/services/context/spillover-store.js +155 -0
  242. package/dist/services/context/spillover-types.d.ts +18 -0
  243. package/dist/services/context/spillover-types.js +1 -0
  244. package/dist/services/crystallization/crystallization-service.d.ts +22 -5
  245. package/dist/services/crystallization/crystallization-service.js +8 -14
  246. package/dist/services/crystallization/crystallization-types.d.ts +6 -6
  247. package/dist/services/crystallization/evidence-brief-builder.d.ts +1 -1
  248. package/dist/services/crystallization/index.d.ts +13 -0
  249. package/dist/services/crystallization/index.js +13 -0
  250. package/dist/services/dashboard/project-dashboard-service.js +2 -2
  251. package/dist/services/dispatch/await-batch.d.ts +70 -0
  252. package/dist/services/dispatch/await-batch.js +272 -0
  253. package/dist/services/dispatch/batch-counter.js +1 -1
  254. package/dist/services/dispatch/dispatch-record-writer.d.ts +126 -4
  255. package/dist/services/dispatch/dispatch-record-writer.js +239 -9
  256. package/dist/services/dispatch/slice-dag.d.ts +46 -0
  257. package/dist/services/dispatch/slice-dag.js +6 -0
  258. package/dist/services/dispatch/stage-enum.d.ts +27 -0
  259. package/dist/services/dispatch/stage-enum.js +48 -0
  260. package/dist/services/dispatch/startup-timeout.d.ts +86 -0
  261. package/dist/services/dispatch/startup-timeout.js +97 -0
  262. package/dist/services/dispatch/sub-agent-dispatcher.js +40 -89
  263. package/dist/services/dispatch/test-tool-detection.d.ts +25 -1
  264. package/dist/services/dispatch/test-tool-detection.js +80 -0
  265. package/dist/services/doctor/doctor-service/checks/check-id-schema.d.ts +18 -0
  266. package/dist/services/doctor/doctor-service/checks/check-id-schema.js +64 -0
  267. package/dist/services/doctor/doctor-service/checks/codegraph-capability.d.ts +14 -0
  268. package/dist/services/doctor/doctor-service/checks/codegraph-capability.js +69 -0
  269. package/dist/services/doctor/doctor-service/checks/dist-source-version.d.ts +32 -0
  270. package/dist/services/doctor/doctor-service/checks/dist-source-version.js +110 -0
  271. package/dist/services/doctor/doctor-service/checks/gateguard-conflict.d.ts +24 -0
  272. package/dist/services/doctor/doctor-service/checks/gateguard-conflict.js +164 -0
  273. package/dist/services/doctor/doctor-service/checks/l3-memory-health.d.ts +16 -0
  274. package/dist/services/doctor/doctor-service/checks/l3-memory-health.js +57 -0
  275. package/dist/services/doctor/doctor-service/checks/l3-orphan-sessions.d.ts +19 -0
  276. package/dist/services/doctor/doctor-service/checks/l3-orphan-sessions.js +66 -0
  277. package/dist/services/doctor/doctor-service/checks/schema-validity.d.ts +10 -0
  278. package/dist/services/doctor/doctor-service/checks/schema-validity.js +33 -0
  279. package/dist/services/doctor/doctor-service/checks/skill-apply-note.d.ts +20 -0
  280. package/dist/services/doctor/doctor-service/checks/skill-apply-note.js +85 -0
  281. package/dist/services/doctor/doctor-service/checks/skill-existence.d.ts +13 -0
  282. package/dist/services/doctor/doctor-service/checks/skill-existence.js +30 -0
  283. package/dist/services/doctor/doctor-service/checks/skill-name-match.d.ts +10 -0
  284. package/dist/services/doctor/doctor-service/checks/skill-name-match.js +25 -0
  285. package/dist/services/doctor/doctor-service/checks/skill-parse.d.ts +10 -0
  286. package/dist/services/doctor/doctor-service/checks/skill-parse.js +19 -0
  287. package/dist/services/doctor/doctor-service/checks/skill-presence.d.ts +21 -0
  288. package/dist/services/doctor/doctor-service/checks/skill-presence.js +75 -0
  289. package/dist/services/doctor/doctor-service/checks/skill-runbook.d.ts +14 -0
  290. package/dist/services/doctor/doctor-service/checks/skill-runbook.js +47 -0
  291. package/dist/services/doctor/doctor-service/checks/statusline-install.d.ts +14 -0
  292. package/dist/services/doctor/doctor-service/checks/statusline-install.js +32 -0
  293. package/dist/services/doctor/doctor-service/checks/statusline-runtime.d.ts +13 -0
  294. package/dist/services/doctor/doctor-service/checks/statusline-runtime.js +30 -0
  295. package/dist/services/doctor/doctor-service/checks/user-config.d.ts +11 -0
  296. package/dist/services/doctor/doctor-service/checks/user-config.js +27 -0
  297. package/dist/services/doctor/doctor-service/checks/workspace-init.d.ts +16 -0
  298. package/dist/services/doctor/doctor-service/checks/workspace-init.js +34 -0
  299. package/dist/services/doctor/doctor-service/checks/workspace-layout.d.ts +33 -0
  300. package/dist/services/doctor/doctor-service/checks/workspace-layout.js +180 -0
  301. package/dist/services/doctor/doctor-service/index.d.ts +48 -0
  302. package/dist/services/doctor/doctor-service/index.js +254 -0
  303. package/dist/services/doctor/doctor-service/plugin-registry.d.ts +41 -0
  304. package/dist/services/doctor/doctor-service/plugin-registry.js +77 -0
  305. package/dist/services/doctor/doctor-service/report/final-summary.d.ts +20 -0
  306. package/dist/services/doctor/doctor-service/report/final-summary.js +29 -0
  307. package/dist/services/doctor/doctor-service/types.d.ts +245 -0
  308. package/dist/services/doctor/doctor-service/types.js +15 -0
  309. package/dist/services/doctor/doctor-service.d.ts +15 -146
  310. package/dist/services/doctor/doctor-service.js +22 -926
  311. package/dist/services/doctor/index.d.ts +22 -0
  312. package/dist/services/doctor/index.js +22 -0
  313. package/dist/services/env/shell-probe.d.ts +71 -0
  314. package/dist/services/env/shell-probe.js +161 -0
  315. package/dist/services/evolution/evolution-types.d.ts +39 -39
  316. package/dist/services/final-review/final-review-service.d.ts +11 -1
  317. package/dist/services/final-review/index.d.ts +2 -0
  318. package/dist/services/final-review/index.js +1 -0
  319. package/dist/services/hooks/auto-compact-hook-install.d.ts +4 -5
  320. package/dist/services/hooks/auto-compact-hook-install.js +4 -5
  321. package/dist/services/hooks/worktree-authorization-gate.d.ts +205 -0
  322. package/dist/services/hooks/worktree-authorization-gate.js +492 -0
  323. package/dist/services/ide/adapters/claude-code-adapter.js +2 -2
  324. package/dist/services/ide/adapters/qoder-adapter.d.ts +25 -0
  325. package/dist/services/ide/adapters/qoder-adapter.js +57 -0
  326. package/dist/services/ide/adapters/tongyi-lingma-adapter.d.ts +16 -0
  327. package/dist/services/ide/adapters/tongyi-lingma-adapter.js +45 -0
  328. package/dist/services/ide/ide-registry.js +6 -0
  329. package/dist/services/ide/ide-types.d.ts +1 -1
  330. package/dist/services/job/job-types.d.ts +56 -56
  331. package/dist/services/job-snapshot/index.d.ts +8 -0
  332. package/dist/services/job-snapshot/index.js +7 -0
  333. package/dist/services/{job/job-resource-snapshot.d.ts → job-snapshot/snapshot.d.ts} +1 -1
  334. package/dist/services/job-snapshot/types.d.ts +7 -0
  335. package/dist/services/job-snapshot/types.js +1 -0
  336. package/dist/services/karpathy-cost/karpathy-cost-check-service.d.ts +67 -0
  337. package/dist/services/karpathy-cost/karpathy-cost-check-service.js +108 -0
  338. package/dist/services/log/retention.d.ts +16 -0
  339. package/dist/services/log/retention.js +17 -0
  340. package/dist/services/loop/loop-bee-relation-types.d.ts +6 -6
  341. package/dist/services/loop/loop-release-types.d.ts +24 -24
  342. package/dist/services/loop/monotonic-runner.d.ts +17 -11
  343. package/dist/services/loop/monotonic-runner.js +118 -79
  344. package/dist/services/memory/project-memory-service/index/kind-dispatch.d.ts +8 -0
  345. package/dist/services/memory/project-memory-service/index/kind-dispatch.js +253 -0
  346. package/dist/services/memory/project-memory-service/index/ranking.d.ts +6 -0
  347. package/dist/services/memory/project-memory-service/index/ranking.js +171 -0
  348. package/dist/services/memory/project-memory-service/index/search.d.ts +34 -0
  349. package/dist/services/memory/project-memory-service/index/search.js +194 -0
  350. package/dist/services/memory/project-memory-service/index.d.ts +9 -0
  351. package/dist/services/memory/project-memory-service/index.js +24 -0
  352. package/dist/services/memory/project-memory-service/parsers/frontmatter.d.ts +9 -0
  353. package/dist/services/memory/project-memory-service/parsers/frontmatter.js +106 -0
  354. package/dist/services/memory/project-memory-service/parsers/markdown-pure.d.ts +7 -0
  355. package/dist/services/memory/project-memory-service/parsers/markdown-pure.js +96 -0
  356. package/dist/services/memory/project-memory-service/store/atomic-write.d.ts +5 -0
  357. package/dist/services/memory/project-memory-service/store/atomic-write.js +56 -0
  358. package/dist/services/memory/project-memory-service/store/paths.d.ts +8 -0
  359. package/dist/services/memory/project-memory-service/store/paths.js +116 -0
  360. package/dist/services/memory/project-memory-service/types.d.ts +128 -0
  361. package/dist/services/memory/project-memory-service/types.js +9 -0
  362. package/dist/services/memory/project-memory-service.d.ts +1 -167
  363. package/dist/services/memory/project-memory-service.js +19 -816
  364. package/dist/services/migrate-skill-name/schema.d.ts +2 -2
  365. package/dist/services/observability/aggregation.d.ts +27 -0
  366. package/dist/services/observability/aggregation.js +72 -0
  367. package/dist/services/observability/observability-service.d.ts +73 -7
  368. package/dist/services/observability/observability-service.js +87 -1
  369. package/dist/services/openspec/artifact-boundary.d.ts +138 -0
  370. package/dist/services/openspec/artifact-boundary.js +150 -0
  371. package/dist/services/openspec/coverage-evidence-reader.d.ts +191 -0
  372. package/dist/services/openspec/coverage-evidence-reader.js +386 -0
  373. package/dist/services/openspec/openspec-archive-service.d.ts +70 -0
  374. package/dist/services/openspec/openspec-archive-service.js +320 -8
  375. package/dist/services/openspec/openspec-bridge-service.js +1 -1
  376. package/dist/services/openspec/openspec-init-service.js +1 -1
  377. package/dist/services/openspec/openspec-propose-from-doctor-service.js +1 -1
  378. package/dist/services/openspec/openspec-render-service.js +7 -4
  379. package/dist/services/openspec/openspec-scan-service.js +1 -1
  380. package/dist/services/openspec/openspec-validate-service.js +5 -4
  381. package/dist/services/preferences/preferences-service.js +10 -0
  382. package/dist/services/preferences/preferences-types.d.ts +13 -0
  383. package/dist/services/preferences/preferences-types.js +11 -0
  384. package/dist/services/qa/screenshot-archive-service.d.ts +51 -0
  385. package/dist/services/qa/screenshot-archive-service.js +134 -0
  386. package/dist/services/rd/rd-service.js +10 -11
  387. package/dist/services/rd/types.d.ts +32 -32
  388. package/dist/services/rd-swarm/rd-swarm-service.d.ts +60 -0
  389. package/dist/services/rd-swarm/rd-swarm-service.js +93 -0
  390. package/dist/services/recommendations/capability-seed-items.js +0 -1
  391. package/dist/services/recommendations/capability-seed-mappings.js +0 -1
  392. package/dist/services/recommendations/capability-seed-sources.js +0 -1
  393. package/dist/services/release/version-precheck-service.d.ts +51 -0
  394. package/dist/services/release/version-precheck-service.js +257 -0
  395. package/dist/services/scan/acceptance-coverage-service.js +1 -1
  396. package/dist/services/scan/archetype-service.js +1 -1
  397. package/dist/services/scan/existing-system-service.js +1 -1
  398. package/dist/services/scan/libraries-service.js +1 -1
  399. package/dist/services/sediment/json-schema.d.ts +40 -40
  400. package/dist/services/share/bundle-types.d.ts +12 -12
  401. package/dist/services/share/run-state-contract.d.ts +2 -2
  402. package/dist/services/skill/skill-search-service.d.ts +12 -7
  403. package/dist/services/skill/skill-search-service.js +8 -4
  404. package/dist/services/skillhub/migrations/001-initial.sql +71 -0
  405. package/dist/services/skillhub/migrations/002-loop-release.sql +32 -0
  406. package/dist/services/skillhub/migrations/003-loop-bee-relation.sql +35 -0
  407. package/dist/services/skillhub/migrations/004-loop-bee-extension.sql +65 -0
  408. package/dist/services/skillhub/migrations/005-evolution-evaluation.sql +81 -0
  409. package/dist/services/skillhub/migrations/006-crystallization-event.sql +92 -0
  410. package/dist/services/skills/hooks-settings-service.d.ts +75 -0
  411. package/dist/services/skills/hooks-settings-service.js +230 -2
  412. package/dist/services/skills/skill-registry.d.ts +1 -0
  413. package/dist/services/skills/skill-registry.js +6 -4
  414. package/dist/services/skills/skill-runbook-service.js +1 -1
  415. package/dist/services/slice/slice-check-service.js +1 -1
  416. package/dist/services/standards/main-session-monitor-ban-hook.d.ts +14 -0
  417. package/dist/services/standards/main-session-monitor-ban-hook.js +19 -0
  418. package/dist/services/standards/missing-standards-detector.d.ts +25 -0
  419. package/dist/services/standards/missing-standards-detector.js +43 -12
  420. package/dist/services/tech/tech-change-id-service.d.ts +82 -0
  421. package/dist/services/tech/tech-change-id-service.js +117 -0
  422. package/dist/services/understand/understand-hybrid-service.js +1 -1
  423. package/dist/services/understand/understand-scan-service.js +2 -2
  424. package/dist/services/upgrade/upgrade-service.js +4 -3
  425. package/dist/services/verdict/envelopes.d.ts +2 -2
  426. package/dist/services/verdict/envelopes.js +2 -2
  427. package/dist/services/verdict/verdict-aggregator.d.ts +3 -3
  428. package/dist/services/vm/vm-lease.d.ts +40 -0
  429. package/dist/services/vm/vm-lease.js +137 -0
  430. package/dist/services/workflow/autonomous-resume-writer.js +1 -1
  431. package/dist/services/workflow/pipeline-verify-gate-support.d.ts +47 -0
  432. package/dist/services/workflow/pipeline-verify-gate-support.js +194 -0
  433. package/dist/services/workflow/pipeline-verify-service.d.ts +17 -81
  434. package/dist/services/workflow/pipeline-verify-service.js +42 -218
  435. package/dist/services/workflow/pipeline-verify-types.d.ts +90 -0
  436. package/dist/services/workflow/pipeline-verify-types.js +10 -0
  437. package/dist/services/workflow/plan-reader.d.ts +1 -1
  438. package/dist/services/workflow/plan-reader.js +1 -1
  439. package/dist/services/workflow/plan-refresher.d.ts +1 -1
  440. package/dist/services/workflow/plan-refresher.js +1 -1
  441. package/dist/services/workflow/plan-trigger-detector.d.ts +1 -1
  442. package/dist/services/workflow/plan-trigger-detector.js +1 -1
  443. package/dist/services/workflow/workflow-autonomous-resume-helpers.d.ts +1 -1
  444. package/dist/services/workflow/workflow-autonomous-service.d.ts +2 -98
  445. package/dist/services/workflow/workflow-autonomous-types.d.ts +114 -0
  446. package/dist/services/workflow/workflow-autonomous-types.js +21 -0
  447. package/dist/services/workflow/workflow-router-service.js +18 -16
  448. package/dist/services/workflow/workflow-spec-lint.d.ts +13 -0
  449. package/dist/services/workflow/workflow-spec-lint.js +75 -0
  450. package/dist/services/workflow/workflow-spec-types.d.ts +100 -0
  451. package/dist/services/workflow/workflow-spec-types.js +13 -0
  452. package/dist/services/workflow/workflow-spec-yaml.d.ts +17 -0
  453. package/dist/services/workflow/workflow-spec-yaml.js +88 -0
  454. package/dist/services/workflow/workflow-spec.d.ts +11 -91
  455. package/dist/services/workflow/workflow-spec.js +16 -145
  456. package/dist/services/workspace/migrate-service.js +1 -1
  457. package/dist/services/workspace/workspace-service.js +1 -1
  458. package/dist/services/worktree/worktree-lease.d.ts +170 -0
  459. package/dist/services/worktree/worktree-lease.js +242 -0
  460. package/package.json +91 -51
  461. package/scripts/clean-dist.mjs +31 -1
  462. package/scripts/copy-templates.mjs +16 -0
  463. package/scripts/sync-version.mjs +53 -2
  464. package/skills/bee/peaks-perf-audit/SKILL.md +17 -0
  465. package/skills/bee/peaks-prd/SKILL.md +16 -0
  466. package/skills/bee/peaks-prd/test-prompts.json +12 -0
  467. package/skills/bee/peaks-qa/SKILL.md +16 -1
  468. package/skills/bee/peaks-qa/references/qa-sub-agent-dispatch.md +22 -0
  469. package/skills/bee/peaks-qa/test-prompts.json +12 -0
  470. package/skills/bee/peaks-rd/SKILL.md +29 -20
  471. package/skills/bee/peaks-rd/references/rd-sub-agent-dispatch.md +39 -0
  472. package/skills/bee/peaks-rd/test-prompts.json +12 -0
  473. package/skills/bee/peaks-reviewer/SKILL.md +17 -0
  474. package/skills/bee/peaks-sc/SKILL.md +16 -0
  475. package/skills/bee/peaks-security-audit/SKILL.md +17 -0
  476. package/skills/bee/peaks-txt/SKILL.md +16 -0
  477. package/skills/bee/peaks-txt/test-prompts.json +12 -0
  478. package/skills/bee/peaks-ui/SKILL.md +49 -43
  479. package/skills/bee/peaks-ui/test-prompts.json +12 -0
  480. package/skills/peaks-code/SKILL.md +54 -109
  481. package/skills/peaks-code/references/boundaries.md +15 -1
  482. package/skills/peaks-code/references/cron-scheduler-deployment.md +313 -0
  483. package/skills/peaks-code/references/external-skill-invocation.md +27 -0
  484. package/skills/peaks-code/references/lease-dashboard.html +224 -0
  485. package/skills/peaks-code/references/lease-stats.sample.json +26 -0
  486. package/skills/peaks-code/references/peaks-worktree-l2-enforcers.md +208 -0
  487. package/skills/peaks-code/references/periodic-checkpoint.md +4 -4
  488. package/skills/peaks-code/references/runbook.md +63 -1
  489. package/skills/peaks-code/references/startup-sequence.md +110 -0
  490. package/skills/peaks-code/references/step-0-8-gate.md +1 -1
  491. package/skills/peaks-code/references/sub-agent-dispatch.md +92 -1
  492. package/skills/peaks-code/references/worktree-governance.md +123 -0
  493. package/skills/peaks-code/test-prompts.json +12 -0
  494. package/skills/peaks-doctor/SKILL.md +1 -1
  495. package/skills/peaks-ide/SKILL.md +1 -1
  496. package/skills/peaks-solo/SKILL.md +21 -0
  497. package/skills/peaks-solo/references/triage-decision-table.md +6 -0
  498. package/skills/peaks-sop/test-prompts.json +17 -0
  499. package/dist/cli/commands/agent-commands.d.ts +0 -20
  500. package/dist/cli/commands/agent-commands.js +0 -48
  501. package/dist/cli/commands/classify-classify-commands.d.ts +0 -19
  502. package/dist/cli/commands/classify-classify-commands.js +0 -151
  503. package/dist/cli/commands/contract-commands.d.ts +0 -26
  504. package/dist/cli/commands/contract-commands.js +0 -114
  505. package/dist/cli/commands/session-auto-compact-hook-command.d.ts +0 -37
  506. package/dist/cli/commands/session-auto-compact-hook-command.js +0 -127
  507. package/dist/cli/commands/worker-commands.d.ts +0 -3
  508. package/dist/cli/commands/worker-commands.js +0 -52
  509. package/dist/services/agent/ecc-agent-service.d.ts +0 -47
  510. package/dist/services/agent/ecc-agent-service.js +0 -143
  511. package/dist/services/config/provider-service.d.ts +0 -48
  512. package/dist/services/config/provider-service.js +0 -143
  513. package/dist/services/context/dispatch-context-guard.d.ts +0 -27
  514. package/dist/services/context/dispatch-context-guard.js +0 -192
  515. package/dist/services/context/shared-channel.d.ts +0 -93
  516. package/dist/services/context/shared-channel.js +0 -308
  517. package/dist/services/filesystem/file-lock.d.ts +0 -11
  518. package/dist/services/filesystem/file-lock.js +0 -152
  519. package/dist/services/mut/assert-scanner.d.ts +0 -6
  520. package/dist/services/mut/assert-scanner.js +0 -116
  521. package/dist/services/mut/index.d.ts +0 -8
  522. package/dist/services/mut/index.js +0 -7
  523. package/dist/services/mut/mut-runner.d.ts +0 -39
  524. package/dist/services/mut/mut-runner.js +0 -29
  525. package/dist/services/mut/production-stryker.d.ts +0 -2
  526. package/dist/services/mut/production-stryker.js +0 -75
  527. package/dist/services/mut/report-builder.d.ts +0 -11
  528. package/dist/services/mut/report-builder.js +0 -110
  529. package/dist/services/mut/report-loader.d.ts +0 -31
  530. package/dist/services/mut/report-loader.js +0 -78
  531. package/dist/services/mut/thresholds.d.ts +0 -21
  532. package/dist/services/mut/thresholds.js +0 -22
  533. package/dist/services/mut/types.d.ts +0 -336
  534. package/dist/services/mut/types.js +0 -59
  535. package/dist/services/providers/minimax-provider-service.d.ts +0 -24
  536. package/dist/services/providers/minimax-provider-service.js +0 -143
  537. package/dist/services/providers/minimax-worker-service.d.ts +0 -21
  538. package/dist/services/providers/minimax-worker-service.js +0 -83
  539. package/dist/shared/fs.d.ts +0 -4
  540. package/dist/shared/fs.js +0 -26
  541. package/dist/shared/paths.d.ts +0 -6
  542. package/dist/shared/paths.js +0 -50
  543. package/dist/shared/result.d.ts +0 -22
  544. package/dist/shared/result.js +0 -46
  545. package/dist/shared/version.d.ts +0 -1
  546. package/dist/shared/version.js +0 -1
  547. package/examples/video-demo/README.md +0 -142
  548. package/examples/video-demo/out/en-closing-960.png +0 -0
  549. package/examples/video-demo/out/zh-closing-960.png +0 -0
  550. package/examples/video-demo/preview/peaks-loop-demo-en.mp4 +0 -0
  551. package/examples/video-demo/preview/peaks-loop-demo.mp4 +0 -0
  552. /package/dist/services/{job/job-resource-snapshot.js → job-snapshot/snapshot.js} +0 -0
@@ -0,0 +1,253 @@
1
+ // ---------------------------------------------------------------------------
2
+ // Top-level write / dispatch surface for project memory.
3
+ //
4
+ // This module is the orchestrator. It composes the parsers + store +
5
+ // ranking helpers into the four entry points the CLI calls into:
6
+ //
7
+ // - `createProjectMemoryExtractPlan` / `executeProjectMemoryExtract` —
8
+ // `peaks memory extract` (artifact → .peaks/memory/<slug>.md).
9
+ // - `createProjectMemoryBackupPlan` / `executeProjectMemoryBackup` —
10
+ // `peaks memory backup` (.peaks/memory/ → backup workspace).
11
+ // - `extractSessionMemories` — session-dir → .peaks/memory/. Used by
12
+ // `peaks-txt` after a session ends.
13
+ // - `summarizeProjectMemoryExtractResult` /
14
+ // `summarizeProjectMemoryBackupResult` — projector to the small
15
+ // JSON-friendly shape the CLI serializes.
16
+ //
17
+ // Idempotency notes:
18
+ // - Both extract paths skip writes for slugs that already exist in
19
+ // `.peaks/memory/`. The original `peaks memory extract --apply` ran
20
+ // more than once during peaks-code / peaks-txt retries; without this
21
+ // skip the O_EXCL write throws EEXIST and aborts the whole batch.
22
+ // - On `--apply`, the index is regenerated whenever the write phase
23
+ // runs (even if every write was skipped) so the index is always
24
+ // rebuilt against the current directory.
25
+ // ---------------------------------------------------------------------------
26
+ import { copyFileSync, mkdirSync, readFileSync } from 'node:fs';
27
+ import { dirname, join, relative } from 'node:path';
28
+ import { isInsidePath, resolveInputPath, stablePath, stableRealPath } from '../../../../shared/path-utils.js';
29
+ import { renderMemoryFile, slugify } from '../parsers/frontmatter.js';
30
+ import { extractStableProjectMemories, summarizeBackupResult, summarizeExtractResult } from '../parsers/markdown-pure.js';
31
+ import { assertInsideProject, assertSafeProjectMemoryDir, assertSafeSessionDir, normalizeRoot, realPathOrThrow } from '../store/paths.js';
32
+ import { assertSafeMemoryFileContent, writeNewFile } from '../store/atomic-write.js';
33
+ import { generateMemoryIndexFile, readStoredMemoryNames } from './ranking.js';
34
+ import { listMarkdownFiles } from './search.js';
35
+ export function createProjectMemoryExtractPlan(options) {
36
+ const projectRoot = normalizeRoot(options.projectRoot);
37
+ const primaryMemoryDir = assertSafeProjectMemoryDir(projectRoot);
38
+ const extractedMemories = options.artifactPaths.flatMap((artifactPath) => {
39
+ const safeArtifactPath = assertInsideProject(artifactPath, projectRoot);
40
+ const relativeArtifactPath = relative(projectRoot, safeArtifactPath).replaceAll('\\', '/');
41
+ return extractStableProjectMemories(readFileSync(safeArtifactPath, 'utf8'), relativeArtifactPath);
42
+ }).sort((left, right) => slugify(left.title).localeCompare(slugify(right.title)));
43
+ const slugCounts = new Map();
44
+ for (const memory of extractedMemories) {
45
+ const slug = slugify(memory.title);
46
+ slugCounts.set(slug, (slugCounts.get(slug) ?? 0) + 1);
47
+ }
48
+ const duplicateTitles = [...slugCounts.entries()].filter(([, count]) => count > 1).map(([slug]) => slug);
49
+ if (duplicateTitles.length > 0) {
50
+ throw new Error(`Duplicate memory titles are not allowed: ${duplicateTitles.join(', ')}`);
51
+ }
52
+ const plannedWrites = extractedMemories.map((memory) => ({
53
+ memory,
54
+ filePath: join(primaryMemoryDir, `${slugify(memory.title)}.md`),
55
+ content: renderMemoryFile(memory)
56
+ }));
57
+ return {
58
+ apply: options.apply ?? false,
59
+ projectRoot,
60
+ primaryMemoryDir,
61
+ backupPolicy: 'project-memory-primary-artifact-backup',
62
+ extractedMemories,
63
+ plannedWrites
64
+ };
65
+ }
66
+ export function executeProjectMemoryExtract(options) {
67
+ const plan = createProjectMemoryExtractPlan(options);
68
+ const writtenFiles = [];
69
+ if (plan.apply) {
70
+ mkdirSync(plan.primaryMemoryDir, { recursive: true });
71
+ const safeMemoryDir = assertSafeProjectMemoryDir(plan.projectRoot);
72
+ // Idempotency: skip writes for memories whose slug already lives in
73
+ // .peaks/memory/. Re-running `peaks memory extract --apply` on the
74
+ // same handoff is a normal peaks-code / peaks-txt retry pattern (the
75
+ // skill prompt may invoke extract more than once when a handoff is
76
+ // edited and re-extracted). Without this, writeNewFile's O_EXCL
77
+ // throws EEXIST and aborts the whole batch. Symmetric with
78
+ // extractSessionMemories (line ~614) which does the same skip.
79
+ const existingNames = readStoredMemoryNames(plan.primaryMemoryDir);
80
+ for (const write of plan.plannedWrites) {
81
+ const slug = slugify(write.memory.title);
82
+ if (existingNames.has(slug))
83
+ continue;
84
+ const targetPath = resolveInputPath(write.filePath);
85
+ const stableTargetPath = stablePath(targetPath);
86
+ if (!isInsidePath(stableTargetPath, stableRealPath(safeMemoryDir))) {
87
+ throw new Error('Project memory write target must stay inside the project memory directory');
88
+ }
89
+ writeNewFile(targetPath, write.content);
90
+ writtenFiles.push(targetPath);
91
+ }
92
+ // After writing any markdown, regenerate the index so downstream
93
+ // readers (peaks project memory-index, peaks-txt re-runs, the next
94
+ // session's presence-set bootstrap) see the new memory. Without
95
+ // this, `peaks memory extract --apply` would leave the index stale
96
+ // and `readMemoryIndex` would either return the empty bootstrap or
97
+ // — pre-bootstrap-fix — return null. Symmetric with
98
+ // extractSessionMemories, which already regenerates the index on
99
+ // apply (see line ~626). We regen whenever --apply is set, even
100
+ // if every write was skipped by idempotency, so the index is
101
+ // always rebuilt against the current .peaks/memory/ directory.
102
+ const indexPath = join(plan.primaryMemoryDir, 'index.json');
103
+ generateMemoryIndexFile(plan.projectRoot, plan.primaryMemoryDir, indexPath);
104
+ }
105
+ return { ...plan, writtenFiles };
106
+ }
107
+ export function createProjectMemoryBackupPlan(options) {
108
+ const projectRoot = normalizeRoot(options.projectRoot);
109
+ const artifactWorkspacePath = normalizeRoot(options.artifactWorkspacePath);
110
+ if (isInsidePath(artifactWorkspacePath, projectRoot)) {
111
+ throw new Error('Artifact workspace must be outside the project root');
112
+ }
113
+ const primaryMemoryDir = assertSafeProjectMemoryDir(projectRoot);
114
+ const backupMemoryDir = join(artifactWorkspacePath, '.peaks', 'memory-backups', 'project-memory-primary');
115
+ const plannedCopies = listMarkdownFiles(primaryMemoryDir).map((sourcePath) => {
116
+ assertSafeMemoryFileContent(readFileSync(sourcePath, 'utf8'));
117
+ const relativeMemoryPath = relative(primaryMemoryDir, sourcePath);
118
+ return {
119
+ sourcePath,
120
+ targetPath: join(backupMemoryDir, relativeMemoryPath)
121
+ };
122
+ });
123
+ return {
124
+ apply: options.apply ?? false,
125
+ projectRoot,
126
+ artifactWorkspacePath,
127
+ primaryMemoryDir,
128
+ backupMemoryDir,
129
+ plannedCopies
130
+ };
131
+ }
132
+ export function executeProjectMemoryBackup(options) {
133
+ const plan = createProjectMemoryBackupPlan(options);
134
+ const copiedFiles = [];
135
+ if (plan.apply) {
136
+ const safeMemoryDir = assertSafeProjectMemoryDir(plan.projectRoot);
137
+ mkdirSync(plan.backupMemoryDir, { recursive: true });
138
+ for (const copy of plan.plannedCopies) {
139
+ const sourcePath = realPathOrThrow(copy.sourcePath, 'Project memory source must stay inside the project memory directory');
140
+ if (!isInsidePath(sourcePath, stableRealPath(safeMemoryDir))) {
141
+ throw new Error('Project memory source must stay inside the project memory directory');
142
+ }
143
+ mkdirSync(dirname(copy.targetPath), { recursive: true });
144
+ copyFileSync(sourcePath, copy.targetPath);
145
+ copiedFiles.push(copy.targetPath);
146
+ }
147
+ }
148
+ return { ...plan, copiedFiles };
149
+ }
150
+ export function summarizeProjectMemoryExtractResult(result) {
151
+ return summarizeExtractResult(result);
152
+ }
153
+ export function summarizeProjectMemoryBackupResult(result) {
154
+ return summarizeBackupResult(result);
155
+ }
156
+ export function extractSessionMemories(options) {
157
+ const projectRoot = normalizeRoot(options.projectRoot);
158
+ const apply = options.apply ?? false;
159
+ const primaryMemoryDir = assertSafeProjectMemoryDir(projectRoot);
160
+ const memoryIndexPath = join(primaryMemoryDir, 'index.json');
161
+ // Resolve sessionDir through realpath + inside-project guard so a hostile
162
+ // sessionId (`..`, abs path, symlink chain) cannot walk the scanner outside
163
+ // the project root. A sentinel "SESSION_DIR_NOT_FOUND" distinguishes a
164
+ // benign miss from an escape attempt.
165
+ let sessionDir;
166
+ try {
167
+ sessionDir = assertSafeSessionDir(projectRoot, options.sessionId);
168
+ }
169
+ catch (error) {
170
+ if (error instanceof Error && error.message === 'SESSION_DIR_NOT_FOUND') {
171
+ return {
172
+ apply,
173
+ projectRoot,
174
+ sessionId: options.sessionId,
175
+ primaryMemoryDir,
176
+ memoryIndexPath,
177
+ scannedFiles: 0,
178
+ extractedCount: 0,
179
+ writtenFiles: [],
180
+ updatedIndex: false
181
+ };
182
+ }
183
+ throw error;
184
+ }
185
+ const scannedFiles = listMarkdownFiles(sessionDir, { maxDepth: 6, skipDotfiles: true });
186
+ const allExtracted = [];
187
+ for (const filePath of scannedFiles) {
188
+ try {
189
+ const content = readFileSync(filePath, 'utf8');
190
+ const relativePath = relative(projectRoot, filePath).replaceAll('\\', '/');
191
+ const extracted = extractStableProjectMemories(content, relativePath);
192
+ allExtracted.push(...extracted);
193
+ }
194
+ catch { // TODO(g2): legacy silent catch — grace: 1 minor release (v2.14.0)
195
+ // skip unreadable files
196
+ }
197
+ }
198
+ if (allExtracted.length === 0) {
199
+ return {
200
+ apply,
201
+ projectRoot,
202
+ sessionId: options.sessionId,
203
+ primaryMemoryDir,
204
+ memoryIndexPath,
205
+ scannedFiles: scannedFiles.length,
206
+ extractedCount: 0,
207
+ writtenFiles: [],
208
+ updatedIndex: false
209
+ };
210
+ }
211
+ const slugCounts = new Map();
212
+ for (const memory of allExtracted) {
213
+ const slug = slugify(memory.title);
214
+ slugCounts.set(slug, (slugCounts.get(slug) ?? 0) + 1);
215
+ }
216
+ const duplicateTitles = [...slugCounts.entries()].filter(([, count]) => count > 1).map(([slug]) => slug);
217
+ if (duplicateTitles.length > 0) {
218
+ throw new Error(`Duplicate memory titles are not allowed: ${duplicateTitles.join(', ')}`);
219
+ }
220
+ // Idempotency: pre-read existing memory names so a re-run of the same
221
+ // session does not throw EEXIST. `writtenFiles` reports only the new
222
+ // writes so callers can still tell what the run actually produced.
223
+ const existingNames = apply ? readStoredMemoryNames(primaryMemoryDir) : new Set();
224
+ const writtenFiles = [];
225
+ if (apply) {
226
+ mkdirSync(primaryMemoryDir, { recursive: true });
227
+ for (const memory of allExtracted) {
228
+ const slug = slugify(memory.title);
229
+ if (existingNames.has(slug))
230
+ continue;
231
+ const targetPath = join(primaryMemoryDir, `${slug}.md`);
232
+ const safePath = resolveInputPath(targetPath);
233
+ const stableSafePath = stablePath(safePath);
234
+ if (!isInsidePath(stableSafePath, stableRealPath(primaryMemoryDir))) {
235
+ throw new Error('Project memory write target must stay inside the project memory directory');
236
+ }
237
+ writeNewFile(safePath, renderMemoryFile(memory));
238
+ writtenFiles.push(safePath);
239
+ }
240
+ generateMemoryIndexFile(projectRoot, primaryMemoryDir, memoryIndexPath);
241
+ }
242
+ return {
243
+ apply,
244
+ projectRoot,
245
+ sessionId: options.sessionId,
246
+ primaryMemoryDir,
247
+ memoryIndexPath,
248
+ scannedFiles: scannedFiles.length,
249
+ extractedCount: allExtracted.length,
250
+ writtenFiles,
251
+ updatedIndex: apply && writtenFiles.length > 0
252
+ };
253
+ }
@@ -0,0 +1,6 @@
1
+ import type { MemoryIndex } from '../types.js';
2
+ export declare function readMemoryFileMtime(filePath: string): string;
3
+ export declare function readStoredMemoryNames(memoryDir: string): Set<string>;
4
+ export declare function generateMemoryIndexFile(projectRoot: string, memoryDir: string, indexPath: string): void;
5
+ export declare function readExistingIndex(indexPath: string): MemoryIndex | null;
6
+ export declare function readMemoryIndex(projectRoot: string): MemoryIndex | null;
@@ -0,0 +1,171 @@
1
+ // ---------------------------------------------------------------------------
2
+ // Index generation + hot/warm kind dispatch.
3
+ //
4
+ // The memory index is the always-available summary of every memory in
5
+ // `.peaks/memory/`. This module owns its write path:
6
+ //
7
+ // - `HOT_KINDS` — the kinds whose full body is kept in the index
8
+ // (`feedback`, `decision`, `rule`, `convention`, `module`, `lesson`).
9
+ // Anything not in `HOT_KINDS` lands in `warm` with the same shape.
10
+ // - `readMemoryFileMtime` / `readStoredMemoryNames` — small stat /
11
+ // filename helpers used by the index generator and by the slug-
12
+ // collision idempotency check.
13
+ // - `generateMemoryIndexFile` — rebuild `index.json` from the current
14
+ // directory contents. Called on every `--apply` extraction.
15
+ // - `shouldRegenerateIndex` — mtime-based guard: rebuild only when at
16
+ // least one memory.md has an mtime strictly newer than index.json.
17
+ // - `readExistingIndex` — best-effort read; returns null on any parse
18
+ // failure (caller will treat as "no index").
19
+ // - `readMemoryIndex` — top-level entry point. Decides whether to
20
+ // regenerate, falls back to whatever is on disk, and bootstraps the
21
+ // directory + index on first read of a stock project.
22
+ // ---------------------------------------------------------------------------
23
+ import { closeSync, constants, existsSync, openSync, readFileSync, statSync, writeFileSync } from 'node:fs';
24
+ import { basename, join } from 'node:path';
25
+ import { parseStoredMemoryFile } from '../parsers/frontmatter.js';
26
+ import { summarizeMemoryBody } from '../parsers/markdown-pure.js';
27
+ import { assertSafeProjectMemoryDir, normalizeRoot } from '../store/paths.js';
28
+ import { ensureMemoryBootstrap, listMarkdownFiles, readProjectMemories } from './search.js';
29
+ // Hot kinds: full body kept in index for always-available context
30
+ const HOT_KINDS = new Set(['feedback', 'decision', 'rule', 'convention', 'module', 'lesson']);
31
+ export function readMemoryFileMtime(filePath) {
32
+ try {
33
+ return statSync(filePath).mtime.toISOString().slice(0, 10);
34
+ }
35
+ catch {
36
+ return new Date().toISOString().slice(0, 10);
37
+ }
38
+ }
39
+ export function readStoredMemoryNames(memoryDir) {
40
+ // Two source-of-truth fallbacks for the slug-collision check:
41
+ // 1. Parse frontmatter (the canonical form rendered by
42
+ // renderMemoryFile / written by both extract paths).
43
+ // 2. Fall back to the bare filename stem, so user-dropped files
44
+ // without frontmatter (e.g. hand-written memories, legacy
45
+ // content) still count as a collision and are not overwritten
46
+ // by an idempotent re-extract.
47
+ const names = new Set();
48
+ for (const filePath of listMarkdownFiles(memoryDir)) {
49
+ const stem = basename(filePath, '.md');
50
+ if (stem.length > 0 && stem !== 'index')
51
+ names.add(stem);
52
+ try {
53
+ const parsed = parseStoredMemoryFile(readFileSync(filePath, 'utf8'), filePath);
54
+ if (parsed)
55
+ names.add(parsed.name);
56
+ }
57
+ catch { // TODO(g2): legacy silent catch — grace: 1 minor release (v2.14.0)
58
+ // ignore unreadable files
59
+ }
60
+ }
61
+ return names;
62
+ }
63
+ export function generateMemoryIndexFile(projectRoot, memoryDir, indexPath) {
64
+ const memories = readProjectMemories(projectRoot);
65
+ const hot = {
66
+ feedback: [], decision: [], rule: [], convention: [], module: [], lesson: []
67
+ };
68
+ const warm = {
69
+ project: [], reference: []
70
+ };
71
+ for (const memory of memories.memories) {
72
+ const entry = {
73
+ name: memory.name,
74
+ kind: memory.kind,
75
+ description: memory.body ? summarizeMemoryBody(memory.body) : memory.title,
76
+ sourcePath: memory.filePath,
77
+ sourceArtifact: memory.sourceArtifact,
78
+ updatedAt: readMemoryFileMtime(memory.filePath)
79
+ };
80
+ if (HOT_KINDS.has(memory.kind)) {
81
+ hot[memory.kind].push(entry);
82
+ }
83
+ else {
84
+ warm[memory.kind].push(entry);
85
+ }
86
+ }
87
+ for (const kind of [...Object.keys(hot), ...Object.keys(warm)]) {
88
+ const arr = hot[kind] ?? warm[kind];
89
+ if (arr)
90
+ arr.sort((a, b) => a.name.localeCompare(b.name));
91
+ }
92
+ const index = {
93
+ version: 1,
94
+ updatedAt: new Date().toISOString(),
95
+ hot: hot,
96
+ warm: warm
97
+ };
98
+ const fd = openSync(indexPath, constants.O_WRONLY | constants.O_CREAT | constants.O_TRUNC, 0o644);
99
+ try {
100
+ writeFileSync(fd, JSON.stringify(index, null, 2), 'utf8');
101
+ }
102
+ finally {
103
+ closeSync(fd);
104
+ }
105
+ }
106
+ export function readExistingIndex(indexPath) {
107
+ if (!existsSync(indexPath))
108
+ return null;
109
+ try {
110
+ const raw = readFileSync(indexPath, 'utf8');
111
+ const parsed = JSON.parse(raw);
112
+ if (parsed.version === 1)
113
+ return parsed;
114
+ return null;
115
+ }
116
+ catch { // TODO(g2): legacy silent catch — grace: 1 minor release (v2.14.0)
117
+ return null;
118
+ }
119
+ }
120
+ // Decide whether readMemoryIndex should rebuild the on-disk index.json.
121
+ // The rule is: rebuild iff index.json is missing OR any memory.md has an
122
+ // mtime strictly greater than index.json's mtime. Any statSync failure
123
+ // falls back to "rebuild" — a safe default that matches the prior
124
+ // always-rebuild behaviour and avoids serving a stale index from a
125
+ // partially-corrupt dir.
126
+ function shouldRegenerateIndex(indexPath, memoryFiles) {
127
+ let indexMtimeMs = 0;
128
+ try {
129
+ indexMtimeMs = statSync(indexPath).mtimeMs;
130
+ }
131
+ catch {
132
+ return true; // no index → must regenerate
133
+ }
134
+ for (const memoryPath of memoryFiles) {
135
+ try {
136
+ const memoryMtimeMs = statSync(memoryPath).mtimeMs;
137
+ if (memoryMtimeMs > indexMtimeMs)
138
+ return true;
139
+ }
140
+ catch {
141
+ return true; // unreadable file → safe default is regenerate
142
+ }
143
+ }
144
+ return false;
145
+ }
146
+ export function readMemoryIndex(projectRoot) {
147
+ const normalizedRoot = normalizeRoot(projectRoot);
148
+ const memoryDir = assertSafeProjectMemoryDir(normalizedRoot);
149
+ const indexPath = join(memoryDir, 'index.json');
150
+ // Read-side bootstrap: if the memory dir is missing entirely, build it and
151
+ // return whatever index is on disk (likely null on a fresh project). We
152
+ // deliberately do NOT pre-write an empty index here: the mtime-based
153
+ // regeneration guard below is the sole authority on whether index.json
154
+ // gets materialised, and pre-writing an empty index would race the guard
155
+ // (giving it a current-time mtime that defeats "memory older than index"
156
+ // detection on the first read).
157
+ if (!existsSync(memoryDir)) {
158
+ ensureMemoryBootstrap(normalizedRoot);
159
+ return readExistingIndex(indexPath);
160
+ }
161
+ const files = listMarkdownFiles(memoryDir);
162
+ if (files.length > 0 && shouldRegenerateIndex(indexPath, files)) {
163
+ try {
164
+ generateMemoryIndexFile(normalizedRoot, memoryDir, indexPath);
165
+ }
166
+ catch { // TODO(g2): legacy silent catch — grace: 1 minor release (v2.14.0)
167
+ // fall through to read existing
168
+ }
169
+ }
170
+ return readExistingIndex(indexPath);
171
+ }
@@ -0,0 +1,34 @@
1
+ import type { MemoryIndex, ProjectMemoryKind, ProjectMemoryReadResult, ProjectMemoryShowResult, StoredProjectMemory } from '../types.js';
2
+ export declare function listMarkdownFiles(dirPath: string, options?: {
3
+ maxDepth?: number;
4
+ skipDotfiles?: boolean;
5
+ }): string[];
6
+ export declare function emptyByKind(): Record<ProjectMemoryKind, StoredProjectMemory[]>;
7
+ export declare function emptyIndex(): MemoryIndex;
8
+ export declare function renderEmptyIndex(): string;
9
+ /**
10
+ * Ensure `.peaks/memory/` and its `index.json` exist for a project, with
11
+ * the same full-shape empty index the generator emits when there are zero
12
+ * memories. Idempotent — safe to call on every skill activation.
13
+ *
14
+ * Why this exists: before this helper, `.peaks/memory/` was only created
15
+ * by `extractSessionMemories` when at least one memory markdown was being
16
+ * written, and `index.json` was only emitted by the generator when at
17
+ * least one markdown was on disk. Stock projects therefore had no
18
+ * `.peaks/memory/` directory and no index, even after `peaks project
19
+ * memories` was read. Bootstrap closes that cold-start gap.
20
+ *
21
+ * This function is fail-open for the same reason the rest of the
22
+ * presence layer is fail-open: a failure here must NOT block skill
23
+ * activation. Any error is swallowed and surfaced only via the returned
24
+ * boolean. Callers that need the truth should check the result.
25
+ */
26
+ export declare function ensureMemoryBootstrap(projectRoot: string): boolean;
27
+ export declare function readProjectMemories(projectRoot: string): ProjectMemoryReadResult;
28
+ /**
29
+ * Read a single project memory's full body by name. Returns null when
30
+ * the memory does not exist. The on-disk body is returned verbatim
31
+ * (pretty). The CLI layer applies `formatMdCompact` when `format: 'compact'`
32
+ * is requested. Slice 023 (R3).
33
+ */
34
+ export declare function readProjectMemoryBody(projectRoot: string, name: string): ProjectMemoryShowResult | null;
@@ -0,0 +1,194 @@
1
+ // ---------------------------------------------------------------------------
2
+ // Search / read-side surface for project memories.
3
+ //
4
+ // This module owns the read path: enumerate memory files in
5
+ // `.peaks/memory/`, parse each through the frontmatter parser, bucket by
6
+ // kind, and surface the result. Bootstrap (creating the directory + a
7
+ // full-shape empty index on a stock project) also lives here because the
8
+ // read-side is the first caller that observes the absence.
9
+ //
10
+ // Exported:
11
+ // - `listMarkdownFiles` — bounded DFS of `.md` files, skipping dotfiles
12
+ // and symlinks, returning a sorted, repo-relative path list.
13
+ // - `readProjectMemories` — top-level read. Returns a
14
+ // `ProjectMemoryReadResult` with memories, total, and `byKind`.
15
+ // - `readProjectMemoryBody` — single-memory lookup by name; returns
16
+ // null when the memory does not exist.
17
+ // - `ensureMemoryBootstrap` — fail-open helper that materialises
18
+ // `.peaks/memory/` + `index.json` if they are missing. Used by
19
+ // presence / skill-bootstrap callers and from inside `readMemoryIndex`
20
+ // when the directory is empty.
21
+ // ---------------------------------------------------------------------------
22
+ import { existsSync, mkdirSync, readFileSync, readdirSync, statSync, writeFileSync } from 'node:fs';
23
+ import { basename, join } from 'node:path';
24
+ import { parseStoredMemoryFile } from '../parsers/frontmatter.js';
25
+ import { assertSafeProjectMemoryDir, normalizeRoot } from '../store/paths.js';
26
+ export function listMarkdownFiles(dirPath, options = {}) {
27
+ if (!existsSync(dirPath))
28
+ return [];
29
+ const { maxDepth = Infinity, skipDotfiles = true } = options;
30
+ const files = [];
31
+ const stack = [{ path: dirPath, depth: 0 }];
32
+ while (stack.length > 0) {
33
+ const frame = stack.pop();
34
+ if (frame.depth > maxDepth)
35
+ continue;
36
+ for (const entry of readdirSync(frame.path, { withFileTypes: true }).sort((left, right) => left.name.localeCompare(right.name))) {
37
+ if (skipDotfiles && entry.name.startsWith('.'))
38
+ continue;
39
+ const entryPath = join(frame.path, entry.name);
40
+ if (entry.isSymbolicLink()) {
41
+ continue;
42
+ }
43
+ if (entry.isDirectory()) {
44
+ stack.push({ path: entryPath, depth: frame.depth + 1 });
45
+ continue;
46
+ }
47
+ if (entry.isFile() && entry.name.endsWith('.md')) {
48
+ files.push(entryPath);
49
+ }
50
+ }
51
+ }
52
+ return files.sort((left, right) => left.localeCompare(right));
53
+ }
54
+ export function emptyByKind() {
55
+ return {
56
+ project: [],
57
+ rule: [],
58
+ decision: [],
59
+ reference: [],
60
+ feedback: [],
61
+ convention: [],
62
+ module: [],
63
+ lesson: []
64
+ };
65
+ }
66
+ export function emptyIndex() {
67
+ // Cast through unknown: we *intend* the two halves to together cover the
68
+ // union `ProjectMemoryKind`, but TS does not know that. The `MemoryIndex`
69
+ // type's `hot` / `warm` fields together cover the union; we split the
70
+ // construction so the JSON output mirrors the hot/warm layout the reader
71
+ // expects.
72
+ return {
73
+ version: 1,
74
+ updatedAt: new Date().toISOString(),
75
+ hot: {
76
+ feedback: [],
77
+ decision: [],
78
+ rule: [],
79
+ convention: [],
80
+ module: [],
81
+ lesson: []
82
+ },
83
+ warm: {
84
+ project: [],
85
+ reference: []
86
+ }
87
+ };
88
+ }
89
+ export function renderEmptyIndex() {
90
+ return JSON.stringify(emptyIndex(), null, 2) + '\n';
91
+ }
92
+ /**
93
+ * Ensure `.peaks/memory/` and its `index.json` exist for a project, with
94
+ * the same full-shape empty index the generator emits when there are zero
95
+ * memories. Idempotent — safe to call on every skill activation.
96
+ *
97
+ * Why this exists: before this helper, `.peaks/memory/` was only created
98
+ * by `extractSessionMemories` when at least one memory markdown was being
99
+ * written, and `index.json` was only emitted by the generator when at
100
+ * least one markdown was on disk. Stock projects therefore had no
101
+ * `.peaks/memory/` directory and no index, even after `peaks project
102
+ * memories` was read. Bootstrap closes that cold-start gap.
103
+ *
104
+ * This function is fail-open for the same reason the rest of the
105
+ * presence layer is fail-open: a failure here must NOT block skill
106
+ * activation. Any error is swallowed and surfaced only via the returned
107
+ * boolean. Callers that need the truth should check the result.
108
+ */
109
+ export function ensureMemoryBootstrap(projectRoot) {
110
+ try {
111
+ const normalizedRoot = normalizeRoot(projectRoot);
112
+ const memoryDir = assertSafeProjectMemoryDir(normalizedRoot);
113
+ const indexPath = join(memoryDir, 'index.json');
114
+ mkdirSync(memoryDir, { recursive: true });
115
+ if (!existsSync(indexPath)) {
116
+ writeFileSync(indexPath, renderEmptyIndex(), { mode: 0o644 });
117
+ }
118
+ return true;
119
+ }
120
+ catch {
121
+ return false;
122
+ }
123
+ }
124
+ export function readProjectMemories(projectRoot) {
125
+ const normalizedRoot = normalizeRoot(projectRoot);
126
+ const memoryDir = assertSafeProjectMemoryDir(normalizedRoot);
127
+ // Read-side bootstrap: on a stock project the directory does not exist
128
+ // yet. Reading must not return an error, but we also want the directory
129
+ // to materialise (along with a full-shape empty index) so subsequent
130
+ // `peaks project memories` invocations, `readMemoryIndex`, and any
131
+ // extraction call find a stable target. The helper is fail-open.
132
+ if (!existsSync(memoryDir)) {
133
+ ensureMemoryBootstrap(normalizedRoot);
134
+ }
135
+ const memories = [];
136
+ for (const filePath of listMarkdownFiles(memoryDir)) {
137
+ const parsed = parseStoredMemoryFile(readFileSync(filePath, 'utf8'), filePath);
138
+ if (parsed)
139
+ memories.push(parsed);
140
+ }
141
+ memories.sort((left, right) => left.name.localeCompare(right.name));
142
+ const byKind = emptyByKind();
143
+ for (const memory of memories) {
144
+ byKind[memory.kind].push(memory);
145
+ }
146
+ return {
147
+ projectRoot: normalizedRoot,
148
+ memoryDir,
149
+ total: memories.length,
150
+ byKind,
151
+ memories
152
+ };
153
+ }
154
+ /**
155
+ * Read a single project memory's full body by name. Returns null when
156
+ * the memory does not exist. The on-disk body is returned verbatim
157
+ * (pretty). The CLI layer applies `formatMdCompact` when `format: 'compact'`
158
+ * is requested. Slice 023 (R3).
159
+ */
160
+ export function readProjectMemoryBody(projectRoot, name) {
161
+ const normalizedRoot = normalizeRoot(projectRoot);
162
+ const memoryDir = assertSafeProjectMemoryDir(normalizedRoot);
163
+ if (!existsSync(memoryDir)) {
164
+ ensureMemoryBootstrap(normalizedRoot);
165
+ }
166
+ for (const filePath of listMarkdownFiles(memoryDir)) {
167
+ if (basename(filePath, '.md') !== name)
168
+ continue;
169
+ const parsed = parseStoredMemoryFile(readFileSync(filePath, 'utf8'), filePath);
170
+ if (parsed === null)
171
+ continue;
172
+ const updatedAt = readMemoryFileMtime(filePath);
173
+ return {
174
+ projectRoot: normalizedRoot,
175
+ memoryDir,
176
+ name: parsed.name,
177
+ body: parsed.body,
178
+ filePath,
179
+ updatedAt,
180
+ kind: parsed.kind,
181
+ title: parsed.title,
182
+ pretty: true
183
+ };
184
+ }
185
+ return null;
186
+ }
187
+ function readMemoryFileMtime(filePath) {
188
+ try {
189
+ return statSync(filePath).mtime.toISOString().slice(0, 10);
190
+ }
191
+ catch {
192
+ return new Date().toISOString().slice(0, 10);
193
+ }
194
+ }
@@ -0,0 +1,9 @@
1
+ export type { BackupPlanOptions, ExtractedProjectMemory, ExtractPlanOptions, ExtractSessionMemoriesOptions, ExtractSessionMemoriesResult, MemoryIndex, MemoryIndexEntry, ProjectMemoryBackupPlan, ProjectMemoryBackupResult, ProjectMemoryBackupSummary, ProjectMemoryCopy, ProjectMemoryExtractPlan, ProjectMemoryExtractResult, ProjectMemoryExtractSummary, ProjectMemoryKind, ProjectMemoryReadResult, ProjectMemoryShowResult, ProjectMemoryWrite, StoredProjectMemory } from './types.js';
2
+ export { VALID_PROJECT_MEMORY_KINDS } from './parsers/frontmatter.js';
3
+ export { summarizeBackupResult, summarizeExtractResult, summarizeMemoryBody, extractStableProjectMemories, END_MARKER, START_MARKER } from './parsers/markdown-pure.js';
4
+ export { parseBlock, parseStoredMemoryFile, renderMemoryFile, slugify } from './parsers/frontmatter.js';
5
+ export { assertInsideProject, assertSafeProjectMemoryDir, assertSafeSessionDir, normalizeRealRoot, normalizeRoot, realPathOrThrow, resolveProjectPath, safeRealpath } from './store/paths.js';
6
+ export { assertSafeMemory, assertSafeMemoryFileContent, hasSensitiveMemoryContent, writeNewFile } from './store/atomic-write.js';
7
+ export { ensureMemoryBootstrap, emptyByKind, emptyIndex, listMarkdownFiles, readProjectMemories, readProjectMemoryBody } from './index/search.js';
8
+ export { generateMemoryIndexFile, readExistingIndex, readMemoryFileMtime, readMemoryIndex, readStoredMemoryNames } from './index/ranking.js';
9
+ export { createProjectMemoryBackupPlan, createProjectMemoryExtractPlan, executeProjectMemoryBackup, executeProjectMemoryExtract, extractSessionMemories, summarizeProjectMemoryBackupResult, summarizeProjectMemoryExtractResult } from './index/kind-dispatch.js';