@specpow/framework 0.2.0

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 (362) hide show
  1. package/CHANGELOG.md +307 -0
  2. package/LICENSE +21 -0
  3. package/README.md +557 -0
  4. package/agents/controller/sdd-controller.md +55 -0
  5. package/agents/execution/java-codegen-agent.md +39 -0
  6. package/agents/execution/ui-codegen-agent.md +32 -0
  7. package/agents/ops/deploy-agent.md +181 -0
  8. package/agents/planning/db-designer-agent.md +30 -0
  9. package/agents/planning/prd-agent.md +31 -0
  10. package/agents/quality/review-agent.md +36 -0
  11. package/agents/quality/test-agent.md +33 -0
  12. package/bin/specpow.js +10 -0
  13. package/dist/cli/index.d.ts +7 -0
  14. package/dist/cli/index.d.ts.map +1 -0
  15. package/dist/cli/index.js +444 -0
  16. package/dist/cli/index.js.map +1 -0
  17. package/dist/commands/apply.d.ts +14 -0
  18. package/dist/commands/apply.d.ts.map +1 -0
  19. package/dist/commands/apply.js +195 -0
  20. package/dist/commands/apply.js.map +1 -0
  21. package/dist/commands/archive.d.ts +30 -0
  22. package/dist/commands/archive.d.ts.map +1 -0
  23. package/dist/commands/archive.js +141 -0
  24. package/dist/commands/archive.js.map +1 -0
  25. package/dist/commands/channel.d.ts +61 -0
  26. package/dist/commands/channel.d.ts.map +1 -0
  27. package/dist/commands/channel.js +613 -0
  28. package/dist/commands/channel.js.map +1 -0
  29. package/dist/commands/config.d.ts +40 -0
  30. package/dist/commands/config.d.ts.map +1 -0
  31. package/dist/commands/config.js +130 -0
  32. package/dist/commands/config.js.map +1 -0
  33. package/dist/commands/debug.d.ts +45 -0
  34. package/dist/commands/debug.d.ts.map +1 -0
  35. package/dist/commands/debug.js +167 -0
  36. package/dist/commands/debug.js.map +1 -0
  37. package/dist/commands/doctor.d.ts +20 -0
  38. package/dist/commands/doctor.d.ts.map +1 -0
  39. package/dist/commands/doctor.js +121 -0
  40. package/dist/commands/doctor.js.map +1 -0
  41. package/dist/commands/execute.d.ts +25 -0
  42. package/dist/commands/execute.d.ts.map +1 -0
  43. package/dist/commands/execute.js +120 -0
  44. package/dist/commands/execute.js.map +1 -0
  45. package/dist/commands/explore.d.ts +71 -0
  46. package/dist/commands/explore.d.ts.map +1 -0
  47. package/dist/commands/explore.js +481 -0
  48. package/dist/commands/explore.js.map +1 -0
  49. package/dist/commands/init.d.ts +20 -0
  50. package/dist/commands/init.d.ts.map +1 -0
  51. package/dist/commands/init.js +146 -0
  52. package/dist/commands/init.js.map +1 -0
  53. package/dist/commands/memory.d.ts +32 -0
  54. package/dist/commands/memory.d.ts.map +1 -0
  55. package/dist/commands/memory.js +455 -0
  56. package/dist/commands/memory.js.map +1 -0
  57. package/dist/commands/propose.d.ts +13 -0
  58. package/dist/commands/propose.d.ts.map +1 -0
  59. package/dist/commands/propose.js +193 -0
  60. package/dist/commands/propose.js.map +1 -0
  61. package/dist/commands/review.d.ts +50 -0
  62. package/dist/commands/review.d.ts.map +1 -0
  63. package/dist/commands/review.js +198 -0
  64. package/dist/commands/review.js.map +1 -0
  65. package/dist/commands/schema.d.ts +22 -0
  66. package/dist/commands/schema.d.ts.map +1 -0
  67. package/dist/commands/schema.js +79 -0
  68. package/dist/commands/schema.js.map +1 -0
  69. package/dist/commands/status.d.ts +11 -0
  70. package/dist/commands/status.d.ts.map +1 -0
  71. package/dist/commands/status.js +130 -0
  72. package/dist/commands/status.js.map +1 -0
  73. package/dist/commands/store.d.ts +31 -0
  74. package/dist/commands/store.d.ts.map +1 -0
  75. package/dist/commands/store.js +109 -0
  76. package/dist/commands/store.js.map +1 -0
  77. package/dist/commands/update.d.ts +42 -0
  78. package/dist/commands/update.d.ts.map +1 -0
  79. package/dist/commands/update.js +239 -0
  80. package/dist/commands/update.js.map +1 -0
  81. package/dist/commands/verify.d.ts +39 -0
  82. package/dist/commands/verify.d.ts.map +1 -0
  83. package/dist/commands/verify.js +386 -0
  84. package/dist/commands/verify.js.map +1 -0
  85. package/dist/commands/workflow/index.d.ts +12 -0
  86. package/dist/commands/workflow/index.d.ts.map +1 -0
  87. package/dist/commands/workflow/index.js +435 -0
  88. package/dist/commands/workflow/index.js.map +1 -0
  89. package/dist/core/agent-contract.d.ts +133 -0
  90. package/dist/core/agent-contract.d.ts.map +1 -0
  91. package/dist/core/agent-contract.js +71 -0
  92. package/dist/core/agent-contract.js.map +1 -0
  93. package/dist/core/archive/delta-merger.d.ts +101 -0
  94. package/dist/core/archive/delta-merger.d.ts.map +1 -0
  95. package/dist/core/archive/delta-merger.js +398 -0
  96. package/dist/core/archive/delta-merger.js.map +1 -0
  97. package/dist/core/archive/delta-parser.d.ts +48 -0
  98. package/dist/core/archive/delta-parser.d.ts.map +1 -0
  99. package/dist/core/archive/delta-parser.js +193 -0
  100. package/dist/core/archive/delta-parser.js.map +1 -0
  101. package/dist/core/archive/engine.d.ts +136 -0
  102. package/dist/core/archive/engine.d.ts.map +1 -0
  103. package/dist/core/archive/engine.js +506 -0
  104. package/dist/core/archive/engine.js.map +1 -0
  105. package/dist/core/archive/index.d.ts +11 -0
  106. package/dist/core/archive/index.d.ts.map +1 -0
  107. package/dist/core/archive/index.js +9 -0
  108. package/dist/core/archive/index.js.map +1 -0
  109. package/dist/core/artifact-graph/graph.d.ts +48 -0
  110. package/dist/core/artifact-graph/graph.d.ts.map +1 -0
  111. package/dist/core/artifact-graph/graph.js +170 -0
  112. package/dist/core/artifact-graph/graph.js.map +1 -0
  113. package/dist/core/artifact-graph/index.d.ts +13 -0
  114. package/dist/core/artifact-graph/index.d.ts.map +1 -0
  115. package/dist/core/artifact-graph/index.js +12 -0
  116. package/dist/core/artifact-graph/index.js.map +1 -0
  117. package/dist/core/artifact-graph/instruction-loader.d.ts +60 -0
  118. package/dist/core/artifact-graph/instruction-loader.d.ts.map +1 -0
  119. package/dist/core/artifact-graph/instruction-loader.js +166 -0
  120. package/dist/core/artifact-graph/instruction-loader.js.map +1 -0
  121. package/dist/core/artifact-graph/outputs.d.ts +17 -0
  122. package/dist/core/artifact-graph/outputs.d.ts.map +1 -0
  123. package/dist/core/artifact-graph/outputs.js +27 -0
  124. package/dist/core/artifact-graph/outputs.js.map +1 -0
  125. package/dist/core/artifact-graph/resolver.d.ts +34 -0
  126. package/dist/core/artifact-graph/resolver.d.ts.map +1 -0
  127. package/dist/core/artifact-graph/resolver.js +99 -0
  128. package/dist/core/artifact-graph/resolver.js.map +1 -0
  129. package/dist/core/artifact-graph/state.d.ts +54 -0
  130. package/dist/core/artifact-graph/state.d.ts.map +1 -0
  131. package/dist/core/artifact-graph/state.js +149 -0
  132. package/dist/core/artifact-graph/state.js.map +1 -0
  133. package/dist/core/artifact-graph/types.d.ts +151 -0
  134. package/dist/core/artifact-graph/types.d.ts.map +1 -0
  135. package/dist/core/artifact-graph/types.js +44 -0
  136. package/dist/core/artifact-graph/types.js.map +1 -0
  137. package/dist/core/channel/channel-event-log.d.ts +81 -0
  138. package/dist/core/channel/channel-event-log.d.ts.map +1 -0
  139. package/dist/core/channel/channel-event-log.js +177 -0
  140. package/dist/core/channel/channel-event-log.js.map +1 -0
  141. package/dist/core/channel/channel-inbox.d.ts +70 -0
  142. package/dist/core/channel/channel-inbox.d.ts.map +1 -0
  143. package/dist/core/channel/channel-inbox.js +122 -0
  144. package/dist/core/channel/channel-inbox.js.map +1 -0
  145. package/dist/core/channel/channel-runtime.d.ts +81 -0
  146. package/dist/core/channel/channel-runtime.d.ts.map +1 -0
  147. package/dist/core/channel/channel-runtime.js +291 -0
  148. package/dist/core/channel/channel-runtime.js.map +1 -0
  149. package/dist/core/channel/channel-supervisor.d.ts +72 -0
  150. package/dist/core/channel/channel-supervisor.d.ts.map +1 -0
  151. package/dist/core/channel/channel-supervisor.js +189 -0
  152. package/dist/core/channel/channel-supervisor.js.map +1 -0
  153. package/dist/core/channel/channel-types.d.ts +169 -0
  154. package/dist/core/channel/channel-types.d.ts.map +1 -0
  155. package/dist/core/channel/channel-types.js +26 -0
  156. package/dist/core/channel/channel-types.js.map +1 -0
  157. package/dist/core/channel/index.d.ts +21 -0
  158. package/dist/core/channel/index.d.ts.map +1 -0
  159. package/dist/core/channel/index.js +23 -0
  160. package/dist/core/channel/index.js.map +1 -0
  161. package/dist/core/command-generation/index.d.ts +225 -0
  162. package/dist/core/command-generation/index.d.ts.map +1 -0
  163. package/dist/core/command-generation/index.js +462 -0
  164. package/dist/core/command-generation/index.js.map +1 -0
  165. package/dist/core/config/config-schema.d.ts +745 -0
  166. package/dist/core/config/config-schema.d.ts.map +1 -0
  167. package/dist/core/config/config-schema.js +108 -0
  168. package/dist/core/config/config-schema.js.map +1 -0
  169. package/dist/core/config/global-config.d.ts +73 -0
  170. package/dist/core/config/global-config.d.ts.map +1 -0
  171. package/dist/core/config/global-config.js +225 -0
  172. package/dist/core/config/global-config.js.map +1 -0
  173. package/dist/core/config/index.d.ts +8 -0
  174. package/dist/core/config/index.d.ts.map +1 -0
  175. package/dist/core/config/index.js +8 -0
  176. package/dist/core/config/index.js.map +1 -0
  177. package/dist/core/hooks/hook-registry.d.ts +55 -0
  178. package/dist/core/hooks/hook-registry.d.ts.map +1 -0
  179. package/dist/core/hooks/hook-registry.js +172 -0
  180. package/dist/core/hooks/hook-registry.js.map +1 -0
  181. package/dist/core/hooks/hook-types.d.ts +87 -0
  182. package/dist/core/hooks/hook-types.d.ts.map +1 -0
  183. package/dist/core/hooks/hook-types.js +11 -0
  184. package/dist/core/hooks/hook-types.js.map +1 -0
  185. package/dist/core/hooks/index.d.ts +28 -0
  186. package/dist/core/hooks/index.d.ts.map +1 -0
  187. package/dist/core/hooks/index.js +28 -0
  188. package/dist/core/hooks/index.js.map +1 -0
  189. package/dist/core/hooks/post-tool-call-hook.d.ts +21 -0
  190. package/dist/core/hooks/post-tool-call-hook.d.ts.map +1 -0
  191. package/dist/core/hooks/post-tool-call-hook.js +191 -0
  192. package/dist/core/hooks/post-tool-call-hook.js.map +1 -0
  193. package/dist/core/hooks/pre-tool-call-hook.d.ts +31 -0
  194. package/dist/core/hooks/pre-tool-call-hook.d.ts.map +1 -0
  195. package/dist/core/hooks/pre-tool-call-hook.js +122 -0
  196. package/dist/core/hooks/pre-tool-call-hook.js.map +1 -0
  197. package/dist/core/hooks/session-start-hook.d.ts +25 -0
  198. package/dist/core/hooks/session-start-hook.d.ts.map +1 -0
  199. package/dist/core/hooks/session-start-hook.js +226 -0
  200. package/dist/core/hooks/session-start-hook.js.map +1 -0
  201. package/dist/core/hooks/workflow-state-hook.d.ts +18 -0
  202. package/dist/core/hooks/workflow-state-hook.d.ts.map +1 -0
  203. package/dist/core/hooks/workflow-state-hook.js +181 -0
  204. package/dist/core/hooks/workflow-state-hook.js.map +1 -0
  205. package/dist/core/init/engine.d.ts +69 -0
  206. package/dist/core/init/engine.d.ts.map +1 -0
  207. package/dist/core/init/engine.js +211 -0
  208. package/dist/core/init/engine.js.map +1 -0
  209. package/dist/core/init/template-hash.d.ts +86 -0
  210. package/dist/core/init/template-hash.d.ts.map +1 -0
  211. package/dist/core/init/template-hash.js +228 -0
  212. package/dist/core/init/template-hash.js.map +1 -0
  213. package/dist/core/memory/adapters/json-adapter.d.ts +50 -0
  214. package/dist/core/memory/adapters/json-adapter.d.ts.map +1 -0
  215. package/dist/core/memory/adapters/json-adapter.js +273 -0
  216. package/dist/core/memory/adapters/json-adapter.js.map +1 -0
  217. package/dist/core/memory/adapters/sqlite-adapter.d.ts +26 -0
  218. package/dist/core/memory/adapters/sqlite-adapter.d.ts.map +1 -0
  219. package/dist/core/memory/adapters/sqlite-adapter.js +230 -0
  220. package/dist/core/memory/adapters/sqlite-adapter.js.map +1 -0
  221. package/dist/core/memory/index.d.ts +38 -0
  222. package/dist/core/memory/index.d.ts.map +1 -0
  223. package/dist/core/memory/index.js +40 -0
  224. package/dist/core/memory/index.js.map +1 -0
  225. package/dist/core/memory/memory-indexer.d.ts +39 -0
  226. package/dist/core/memory/memory-indexer.d.ts.map +1 -0
  227. package/dist/core/memory/memory-indexer.js +213 -0
  228. package/dist/core/memory/memory-indexer.js.map +1 -0
  229. package/dist/core/memory/memory-manager.d.ts +59 -0
  230. package/dist/core/memory/memory-manager.d.ts.map +1 -0
  231. package/dist/core/memory/memory-manager.js +194 -0
  232. package/dist/core/memory/memory-manager.js.map +1 -0
  233. package/dist/core/memory/memory-store.d.ts +31 -0
  234. package/dist/core/memory/memory-store.d.ts.map +1 -0
  235. package/dist/core/memory/memory-store.js +148 -0
  236. package/dist/core/memory/memory-store.js.map +1 -0
  237. package/dist/core/memory/memory-types.d.ts +154 -0
  238. package/dist/core/memory/memory-types.d.ts.map +1 -0
  239. package/dist/core/memory/memory-types.js +13 -0
  240. package/dist/core/memory/memory-types.js.map +1 -0
  241. package/dist/core/migration/index.d.ts +80 -0
  242. package/dist/core/migration/index.d.ts.map +1 -0
  243. package/dist/core/migration/index.js +361 -0
  244. package/dist/core/migration/index.js.map +1 -0
  245. package/dist/core/parsers/index.d.ts +95 -0
  246. package/dist/core/parsers/index.d.ts.map +1 -0
  247. package/dist/core/parsers/index.js +367 -0
  248. package/dist/core/parsers/index.js.map +1 -0
  249. package/dist/core/sdd-engine/ai-caller.d.ts +118 -0
  250. package/dist/core/sdd-engine/ai-caller.d.ts.map +1 -0
  251. package/dist/core/sdd-engine/ai-caller.js +624 -0
  252. package/dist/core/sdd-engine/ai-caller.js.map +1 -0
  253. package/dist/core/sdd-engine/controller.d.ts +107 -0
  254. package/dist/core/sdd-engine/controller.d.ts.map +1 -0
  255. package/dist/core/sdd-engine/controller.js +357 -0
  256. package/dist/core/sdd-engine/controller.js.map +1 -0
  257. package/dist/core/sdd-engine/dispatcher.d.ts +69 -0
  258. package/dist/core/sdd-engine/dispatcher.d.ts.map +1 -0
  259. package/dist/core/sdd-engine/dispatcher.js +146 -0
  260. package/dist/core/sdd-engine/dispatcher.js.map +1 -0
  261. package/dist/core/sdd-engine/git-ops.d.ts +73 -0
  262. package/dist/core/sdd-engine/git-ops.d.ts.map +1 -0
  263. package/dist/core/sdd-engine/git-ops.js +326 -0
  264. package/dist/core/sdd-engine/git-ops.js.map +1 -0
  265. package/dist/core/sdd-engine/index.d.ts +17 -0
  266. package/dist/core/sdd-engine/index.d.ts.map +1 -0
  267. package/dist/core/sdd-engine/index.js +15 -0
  268. package/dist/core/sdd-engine/index.js.map +1 -0
  269. package/dist/core/sdd-engine/ledger.d.ts +92 -0
  270. package/dist/core/sdd-engine/ledger.d.ts.map +1 -0
  271. package/dist/core/sdd-engine/ledger.js +273 -0
  272. package/dist/core/sdd-engine/ledger.js.map +1 -0
  273. package/dist/core/sdd-engine/model-selector.d.ts +49 -0
  274. package/dist/core/sdd-engine/model-selector.d.ts.map +1 -0
  275. package/dist/core/sdd-engine/model-selector.js +76 -0
  276. package/dist/core/sdd-engine/model-selector.js.map +1 -0
  277. package/dist/core/sdd-engine/parallel-dispatcher.d.ts +99 -0
  278. package/dist/core/sdd-engine/parallel-dispatcher.d.ts.map +1 -0
  279. package/dist/core/sdd-engine/parallel-dispatcher.js +350 -0
  280. package/dist/core/sdd-engine/parallel-dispatcher.js.map +1 -0
  281. package/dist/core/sdd-engine/review-loop.d.ts +61 -0
  282. package/dist/core/sdd-engine/review-loop.d.ts.map +1 -0
  283. package/dist/core/sdd-engine/review-loop.js +139 -0
  284. package/dist/core/sdd-engine/review-loop.js.map +1 -0
  285. package/dist/core/sdd-engine/types.d.ts +104 -0
  286. package/dist/core/sdd-engine/types.d.ts.map +1 -0
  287. package/dist/core/sdd-engine/types.js +7 -0
  288. package/dist/core/sdd-engine/types.js.map +1 -0
  289. package/dist/core/store/index.d.ts +78 -0
  290. package/dist/core/store/index.d.ts.map +1 -0
  291. package/dist/core/store/index.js +182 -0
  292. package/dist/core/store/index.js.map +1 -0
  293. package/dist/core/templates/index.d.ts +58 -0
  294. package/dist/core/templates/index.d.ts.map +1 -0
  295. package/dist/core/templates/index.js +158 -0
  296. package/dist/core/templates/index.js.map +1 -0
  297. package/dist/core/validation/index.d.ts +34 -0
  298. package/dist/core/validation/index.d.ts.map +1 -0
  299. package/dist/core/validation/index.js +153 -0
  300. package/dist/core/validation/index.js.map +1 -0
  301. package/dist/core/workflow-state.d.ts +96 -0
  302. package/dist/core/workflow-state.d.ts.map +1 -0
  303. package/dist/core/workflow-state.js +284 -0
  304. package/dist/core/workflow-state.js.map +1 -0
  305. package/dist/index.d.ts +18 -0
  306. package/dist/index.d.ts.map +1 -0
  307. package/dist/index.js +21 -0
  308. package/dist/index.js.map +1 -0
  309. package/dist/utils/index.d.ts +48 -0
  310. package/dist/utils/index.d.ts.map +1 -0
  311. package/dist/utils/index.js +119 -0
  312. package/dist/utils/index.js.map +1 -0
  313. package/hooks/hooks.json +30 -0
  314. package/hooks/run-hook.cmd +19 -0
  315. package/hooks/session-start +62 -0
  316. package/hooks/workflow-state +150 -0
  317. package/package.json +122 -0
  318. package/schemas/bug-fix/schema.yaml +64 -0
  319. package/schemas/bug-fix/templates/analysis.md +43 -0
  320. package/schemas/bug-fix/templates/fix-plan.md +19 -0
  321. package/schemas/bug-fix/templates/proposal.md +30 -0
  322. package/schemas/crud-module/schema.yaml +65 -0
  323. package/schemas/crud-module/templates/design.md +36 -0
  324. package/schemas/crud-module/templates/proposal.md +30 -0
  325. package/schemas/crud-module/templates/spec.md +33 -0
  326. package/schemas/crud-module/templates/tasks.md +57 -0
  327. package/schemas/spec-driven/schema.yaml +87 -0
  328. package/schemas/spec-driven/templates/design.md +54 -0
  329. package/schemas/spec-driven/templates/proposal.md +31 -0
  330. package/schemas/spec-driven/templates/spec.md +44 -0
  331. package/schemas/spec-driven/templates/tasks.md +98 -0
  332. package/skills/business-code-review/SKILL.md +78 -0
  333. package/skills/business-db-design/SKILL.md +74 -0
  334. package/skills/business-deploy-check/SKILL.md +72 -0
  335. package/skills/business-doc-sync/SKILL.md +72 -0
  336. package/skills/business-java-codegen/SKILL.md +97 -0
  337. package/skills/business-menu-register/SKILL.md +63 -0
  338. package/skills/business-prd-writer/SKILL.md +80 -0
  339. package/skills/business-test-gen/SKILL.md +82 -0
  340. package/skills/business-ui-codegen/SKILL.md +104 -0
  341. package/skills/execution-finish-branch/SKILL.md +58 -0
  342. package/skills/execution-git-worktrees/SKILL.md +48 -0
  343. package/skills/execution-parallel-agents/SKILL.md +51 -0
  344. package/skills/execution-receiving-review/SKILL.md +47 -0
  345. package/skills/execution-requesting-review/SKILL.md +51 -0
  346. package/skills/execution-subagent-driven-dev/SKILL.md +148 -0
  347. package/skills/execution-systematic-debugging/SKILL.md +95 -0
  348. package/skills/execution-tdd/SKILL.md +74 -0
  349. package/skills/execution-verification-before-completion/SKILL.md +75 -0
  350. package/skills/meta-create-skill/SKILL.md +374 -0
  351. package/skills/meta-using-skills/SKILL.md +97 -0
  352. package/skills/meta-writing-skills/SKILL.md +66 -0
  353. package/skills/planning-apply-change/SKILL.md +199 -0
  354. package/skills/planning-archive-change/SKILL.md +43 -0
  355. package/skills/planning-explore/SKILL.md +108 -0
  356. package/skills/planning-onboard/SKILL.md +60 -0
  357. package/skills/planning-propose/SKILL.md +145 -0
  358. package/skills/planning-update-change/SKILL.md +45 -0
  359. package/skills/planning-verify-change/SKILL.md +58 -0
  360. package/skills/planning-write-design/SKILL.md +59 -0
  361. package/skills/planning-write-plans/SKILL.md +55 -0
  362. package/skills/planning-write-specs/SKILL.md +73 -0
@@ -0,0 +1,50 @@
1
+ /**
2
+ * 增强型 JSON 记忆存储适配器
3
+ *
4
+ * 作为 FileMemoryStore 的增强版,支持多文件分片
5
+ * 适用于大规模记忆数据场景
6
+ *
7
+ * 存储结构:
8
+ * .specpow/memory/
9
+ * ├── index.json # 主索引(元数据)
10
+ * ├── shards/ # 分片目录
11
+ * │ ├── shard-001.json # 分片文件
12
+ * │ ├── shard-002.json
13
+ * │ └── ...
14
+ * ├── sessions/ # 会话日志
15
+ * └── archives/ # 归档记忆
16
+ */
17
+ import type { MemoryIndex, MemoryStore, SessionLog } from '../memory-types.js';
18
+ export interface ShardedJsonStoreOptions {
19
+ /** 每个分片的最大条目数,默认 1000 */
20
+ maxEntriesPerShard?: number;
21
+ /** 项目根目录 */
22
+ projectRoot: string;
23
+ }
24
+ export declare class ShardedJsonStore implements MemoryStore {
25
+ private memoryDir;
26
+ private shardsDir;
27
+ private sessionsDir;
28
+ private archivesDir;
29
+ private indexPath;
30
+ private maxEntriesPerShard;
31
+ constructor(options: ShardedJsonStoreOptions);
32
+ private ensureDirs;
33
+ load(): Promise<MemoryIndex>;
34
+ save(index: MemoryIndex): Promise<void>;
35
+ private extractShardIndex;
36
+ clear(): Promise<void>;
37
+ saveSessionLog(sessionId: string, log: SessionLog): void;
38
+ loadSessionLog(sessionId: string): SessionLog | null;
39
+ listSessionIds(): string[];
40
+ /**
41
+ * 获取分片统计信息
42
+ */
43
+ getShardStats(): {
44
+ totalShards: number;
45
+ totalEntries: number;
46
+ shardSizes: number[];
47
+ };
48
+ private getShardFiles;
49
+ }
50
+ //# sourceMappingURL=json-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-adapter.d.ts","sourceRoot":"","sources":["../../../../src/core/memory/adapters/json-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAIH,OAAO,KAAK,EACV,WAAW,EACX,WAAW,EACX,UAAU,EAEX,MAAM,oBAAoB,CAAC;AAE5B,MAAM,WAAW,uBAAuB;IACtC,yBAAyB;IACzB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,YAAY;IACZ,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,gBAAiB,YAAW,WAAW;IAClD,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,kBAAkB,CAAS;gBAEvB,OAAO,EAAE,uBAAuB;IAU5C,OAAO,CAAC,UAAU;IAQZ,IAAI,IAAI,OAAO,CAAC,WAAW,CAAC;IA8D5B,IAAI,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAwG7C,OAAO,CAAC,iBAAiB;IAKnB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAyB5B,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,GAAG,IAAI;IAKxD,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAapD,cAAc,IAAI,MAAM,EAAE;IAU1B;;OAEG;IACH,aAAa,IAAI;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,EAAE,CAAA;KAAE;IAoBpF,OAAO,CAAC,aAAa;CAUtB"}
@@ -0,0 +1,273 @@
1
+ /**
2
+ * 增强型 JSON 记忆存储适配器
3
+ *
4
+ * 作为 FileMemoryStore 的增强版,支持多文件分片
5
+ * 适用于大规模记忆数据场景
6
+ *
7
+ * 存储结构:
8
+ * .specpow/memory/
9
+ * ├── index.json # 主索引(元数据)
10
+ * ├── shards/ # 分片目录
11
+ * │ ├── shard-001.json # 分片文件
12
+ * │ ├── shard-002.json
13
+ * │ └── ...
14
+ * ├── sessions/ # 会话日志
15
+ * └── archives/ # 归档记忆
16
+ */
17
+ import { existsSync, mkdirSync, readFileSync, writeFileSync, readdirSync, statSync, unlinkSync } from 'fs';
18
+ import { join } from 'path';
19
+ export class ShardedJsonStore {
20
+ memoryDir;
21
+ shardsDir;
22
+ sessionsDir;
23
+ archivesDir;
24
+ indexPath;
25
+ maxEntriesPerShard;
26
+ constructor(options) {
27
+ this.memoryDir = join(options.projectRoot, '.specpow', 'memory');
28
+ this.shardsDir = join(this.memoryDir, 'shards');
29
+ this.sessionsDir = join(this.memoryDir, 'sessions');
30
+ this.archivesDir = join(this.memoryDir, 'archives');
31
+ this.indexPath = join(this.memoryDir, 'index.json');
32
+ this.maxEntriesPerShard = options.maxEntriesPerShard ?? 1000;
33
+ this.ensureDirs();
34
+ }
35
+ ensureDirs() {
36
+ for (const dir of [this.memoryDir, this.shardsDir, this.sessionsDir, this.archivesDir]) {
37
+ if (!existsSync(dir)) {
38
+ mkdirSync(dir, { recursive: true });
39
+ }
40
+ }
41
+ }
42
+ async load() {
43
+ const index = {
44
+ entries: new Map(),
45
+ keywords: new Map(),
46
+ phases: new Map(),
47
+ sessions: new Map(),
48
+ timeline: [],
49
+ };
50
+ // 从所有分片加载数据
51
+ const shardFiles = this.getShardFiles();
52
+ for (const shardFile of shardFiles) {
53
+ try {
54
+ const data = JSON.parse(readFileSync(shardFile, 'utf-8'));
55
+ if (data.entries) {
56
+ for (const [id, entry] of data.entries) {
57
+ index.entries.set(id, entry);
58
+ index.timeline.push(entry);
59
+ }
60
+ }
61
+ if (data.keywords) {
62
+ for (const [k, v] of data.keywords) {
63
+ if (!index.keywords.has(k)) {
64
+ index.keywords.set(k, new Set());
65
+ }
66
+ for (const id of v) {
67
+ index.keywords.get(k).add(id);
68
+ }
69
+ }
70
+ }
71
+ if (data.phases) {
72
+ for (const [k, v] of data.phases) {
73
+ const phase = k;
74
+ if (!index.phases.has(phase)) {
75
+ index.phases.set(phase, new Set());
76
+ }
77
+ for (const id of v) {
78
+ index.phases.get(phase).add(id);
79
+ }
80
+ }
81
+ }
82
+ if (data.sessions) {
83
+ for (const [k, v] of data.sessions) {
84
+ if (!index.sessions.has(k)) {
85
+ index.sessions.set(k, new Set());
86
+ }
87
+ for (const id of v) {
88
+ index.sessions.get(k).add(id);
89
+ }
90
+ }
91
+ }
92
+ }
93
+ catch (err) {
94
+ console.warn(`Failed to load shard ${shardFile}:`, err);
95
+ }
96
+ }
97
+ // 按时间排序 timeline
98
+ index.timeline.sort((a, b) => a.timestamp - b.timestamp);
99
+ return index;
100
+ }
101
+ async save(index) {
102
+ // 将数据分片存储
103
+ const entries = Array.from(index.entries.values());
104
+ const totalShards = Math.ceil(entries.length / this.maxEntriesPerShard) || 1;
105
+ // 获取现有分片用于增量比较
106
+ const existingShards = this.getShardFiles();
107
+ const existingShardData = new Map();
108
+ // 读取现有分片内容用于比较
109
+ for (const shardFile of existingShards) {
110
+ try {
111
+ const content = readFileSync(shardFile, 'utf-8');
112
+ const shardIndex = this.extractShardIndex(shardFile);
113
+ existingShardData.set(String(shardIndex), content);
114
+ }
115
+ catch {
116
+ // 忽略读取失败的分片
117
+ }
118
+ }
119
+ // 写入新分片(增量更新)
120
+ const writtenShards = new Set();
121
+ for (let i = 0; i < totalShards; i++) {
122
+ const start = i * this.maxEntriesPerShard;
123
+ const end = Math.min(start + this.maxEntriesPerShard, entries.length);
124
+ const shardEntries = entries.slice(start, end);
125
+ // 构建该分片的索引
126
+ const shardEntryIds = new Set(shardEntries.map(e => e.id));
127
+ const shardKeywords = [];
128
+ const shardPhases = [];
129
+ const shardSessions = [];
130
+ // 收集该分片相关的索引数据
131
+ for (const [keyword, ids] of index.keywords.entries()) {
132
+ const filtered = Array.from(ids).filter(id => shardEntryIds.has(id));
133
+ if (filtered.length > 0) {
134
+ shardKeywords.push([keyword, filtered]);
135
+ }
136
+ }
137
+ for (const [phase, ids] of index.phases.entries()) {
138
+ const filtered = Array.from(ids).filter(id => shardEntryIds.has(id));
139
+ if (filtered.length > 0) {
140
+ shardPhases.push([phase, filtered]);
141
+ }
142
+ }
143
+ for (const [sessionId, ids] of index.sessions.entries()) {
144
+ const filtered = Array.from(ids).filter(id => shardEntryIds.has(id));
145
+ if (filtered.length > 0) {
146
+ shardSessions.push([sessionId, filtered]);
147
+ }
148
+ }
149
+ const shardData = {
150
+ version: 1,
151
+ shardIndex: i,
152
+ entries: shardEntries.map(e => [e.id, e]),
153
+ keywords: shardKeywords,
154
+ phases: shardPhases,
155
+ sessions: shardSessions,
156
+ };
157
+ const newContent = JSON.stringify(shardData, null, 2);
158
+ const shardPath = join(this.shardsDir, `shard-${String(i + 1).padStart(3, '0')}.json`);
159
+ const shardKey = String(i);
160
+ // 仅当内容变化时才写入(增量更新)
161
+ const existingContent = existingShardData.get(shardKey);
162
+ if (existingContent !== newContent) {
163
+ // 原子写入:先写临时文件,再重命名
164
+ const tempPath = shardPath + '.tmp';
165
+ writeFileSync(tempPath, newContent, 'utf-8');
166
+ // 重命名是原子操作
167
+ const { renameSync } = await import('fs');
168
+ renameSync(tempPath, shardPath);
169
+ }
170
+ writtenShards.add(shardKey);
171
+ }
172
+ // 删除多余的分片(数据减少的情况)
173
+ for (const shardFile of existingShards) {
174
+ const index = this.extractShardIndex(shardFile);
175
+ if (!writtenShards.has(String(index))) {
176
+ unlinkSync(shardFile);
177
+ }
178
+ }
179
+ // 保存主索引元数据(原子写入)
180
+ const indexMeta = {
181
+ version: 1,
182
+ totalEntries: index.entries.size,
183
+ totalShards,
184
+ maxEntriesPerShard: this.maxEntriesPerShard,
185
+ lastUpdated: Date.now(),
186
+ };
187
+ const tempIndexPath = this.indexPath + '.tmp';
188
+ writeFileSync(tempIndexPath, JSON.stringify(indexMeta, null, 2), 'utf-8');
189
+ const { renameSync } = await import('fs');
190
+ renameSync(tempIndexPath, this.indexPath);
191
+ }
192
+ extractShardIndex(shardPath) {
193
+ const match = shardPath.match(/shard-(\d+)\.json$/);
194
+ return match ? parseInt(match[1], 10) - 1 : -1;
195
+ }
196
+ async clear() {
197
+ // 删除所有分片
198
+ const shardFiles = this.getShardFiles();
199
+ for (const shardFile of shardFiles) {
200
+ unlinkSync(shardFile);
201
+ }
202
+ // 清空会话日志
203
+ if (existsSync(this.sessionsDir)) {
204
+ const files = readdirSync(this.sessionsDir);
205
+ for (const file of files) {
206
+ const filePath = join(this.sessionsDir, file);
207
+ const stat = statSync(filePath);
208
+ if (stat.isFile()) {
209
+ unlinkSync(filePath);
210
+ }
211
+ }
212
+ }
213
+ // 删除索引文件
214
+ if (existsSync(this.indexPath)) {
215
+ unlinkSync(this.indexPath);
216
+ }
217
+ }
218
+ saveSessionLog(sessionId, log) {
219
+ const logPath = join(this.sessionsDir, `${sessionId}.json`);
220
+ writeFileSync(logPath, JSON.stringify(log, null, 2), 'utf-8');
221
+ }
222
+ loadSessionLog(sessionId) {
223
+ const logPath = join(this.sessionsDir, `${sessionId}.json`);
224
+ if (!existsSync(logPath)) {
225
+ return null;
226
+ }
227
+ try {
228
+ return JSON.parse(readFileSync(logPath, 'utf-8'));
229
+ }
230
+ catch {
231
+ return null;
232
+ }
233
+ }
234
+ listSessionIds() {
235
+ if (!existsSync(this.sessionsDir)) {
236
+ return [];
237
+ }
238
+ return readdirSync(this.sessionsDir)
239
+ .filter(f => f.endsWith('.json'))
240
+ .map(f => f.replace('.json', ''));
241
+ }
242
+ /**
243
+ * 获取分片统计信息
244
+ */
245
+ getShardStats() {
246
+ const shardFiles = this.getShardFiles();
247
+ const shardSizes = [];
248
+ for (const shardFile of shardFiles) {
249
+ try {
250
+ const data = JSON.parse(readFileSync(shardFile, 'utf-8'));
251
+ shardSizes.push(data.entries?.length || 0);
252
+ }
253
+ catch {
254
+ shardSizes.push(0);
255
+ }
256
+ }
257
+ return {
258
+ totalShards: shardFiles.length,
259
+ totalEntries: shardSizes.reduce((a, b) => a + b, 0),
260
+ shardSizes,
261
+ };
262
+ }
263
+ getShardFiles() {
264
+ if (!existsSync(this.shardsDir)) {
265
+ return [];
266
+ }
267
+ return readdirSync(this.shardsDir)
268
+ .filter(f => f.startsWith('shard-') && f.endsWith('.json'))
269
+ .map(f => join(this.shardsDir, f))
270
+ .sort();
271
+ }
272
+ }
273
+ //# sourceMappingURL=json-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-adapter.js","sourceRoot":"","sources":["../../../../src/core/memory/adapters/json-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * SQLite 记忆存储适配器
3
+ *
4
+ * 使用 better-sqlite3 实现 MemoryStore 接口
5
+ * 提供高性能的本地数据库存储
6
+ */
7
+ import type { MemoryIndex, MemoryStore, SessionLog } from '../memory-types.js';
8
+ export declare class SqliteMemoryStore implements MemoryStore {
9
+ private db;
10
+ private dbPath;
11
+ constructor(projectRoot: string, dbName?: string);
12
+ private stmts;
13
+ private prepareStatements;
14
+ private initSchema;
15
+ load(): Promise<MemoryIndex>;
16
+ save(index: MemoryIndex): Promise<void>;
17
+ clear(): Promise<void>;
18
+ saveSessionLog(sessionId: string, log: SessionLog): void;
19
+ loadSessionLog(sessionId: string): SessionLog | null;
20
+ listSessionIds(): string[];
21
+ /**
22
+ * 关闭数据库连接
23
+ */
24
+ close(): void;
25
+ }
26
+ //# sourceMappingURL=sqlite-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite-adapter.d.ts","sourceRoot":"","sources":["../../../../src/core/memory/adapters/sqlite-adapter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EACV,WAAW,EACX,WAAW,EAEX,UAAU,EAEX,MAAM,oBAAoB,CAAC;AAE5B,qBAAa,iBAAkB,YAAW,WAAW;IACnD,OAAO,CAAC,EAAE,CAAoB;IAC9B,OAAO,CAAC,MAAM,CAAS;gBAEX,WAAW,EAAE,MAAM,EAAE,MAAM,SAAc;IAiBrD,OAAO,CAAC,KAAK,CAYX;IAEF,OAAO,CAAC,iBAAiB;IAsCzB,OAAO,CAAC,UAAU;IA+DZ,IAAI,IAAI,OAAO,CAAC,WAAW,CAAC;IA4D5B,IAAI,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IA2CvC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ5B,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,GAAG,IAAI;IAIxD,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAQpD,cAAc,IAAI,MAAM,EAAE;IAK1B;;OAEG;IACH,KAAK,IAAI,IAAI;CAGd"}
@@ -0,0 +1,230 @@
1
+ /**
2
+ * SQLite 记忆存储适配器
3
+ *
4
+ * 使用 better-sqlite3 实现 MemoryStore 接口
5
+ * 提供高性能的本地数据库存储
6
+ */
7
+ import Database from 'better-sqlite3';
8
+ import { existsSync, mkdirSync } from 'fs';
9
+ import { join } from 'path';
10
+ export class SqliteMemoryStore {
11
+ db;
12
+ dbPath;
13
+ constructor(projectRoot, dbName = 'memory.db') {
14
+ const memoryDir = join(projectRoot, '.specpow', 'memory');
15
+ if (!existsSync(memoryDir)) {
16
+ mkdirSync(memoryDir, { recursive: true });
17
+ }
18
+ this.dbPath = join(memoryDir, dbName);
19
+ this.db = new Database(this.dbPath);
20
+ // 启用 WAL 模式提升并发读写性能
21
+ this.db.pragma('journal_mode = WAL');
22
+ this.db.pragma('synchronous = NORMAL');
23
+ this.initSchema();
24
+ this.prepareStatements();
25
+ }
26
+ // 预编译语句缓存
27
+ stmts = {
28
+ insertEntry: null,
29
+ insertKeyword: null,
30
+ insertPhase: null,
31
+ insertSession: null,
32
+ loadEntries: null,
33
+ loadKeywords: null,
34
+ loadPhases: null,
35
+ loadSessions: null,
36
+ loadSessionLog: null,
37
+ saveSessionLog: null,
38
+ listSessionIds: null,
39
+ };
40
+ prepareStatements() {
41
+ this.stmts.insertEntry = this.db.prepare(`
42
+ INSERT OR REPLACE INTO memory_entries (id, timestamp, session_id, phase, content, keywords, relevance, metadata)
43
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)
44
+ `);
45
+ this.stmts.insertKeyword = this.db.prepare(`
46
+ INSERT OR IGNORE INTO keyword_index (keyword, entry_id) VALUES (?, ?)
47
+ `);
48
+ this.stmts.insertPhase = this.db.prepare(`
49
+ INSERT OR IGNORE INTO phase_index (phase, entry_id) VALUES (?, ?)
50
+ `);
51
+ this.stmts.insertSession = this.db.prepare(`
52
+ INSERT OR IGNORE INTO session_index (session_id, entry_id) VALUES (?, ?)
53
+ `);
54
+ this.stmts.loadEntries = this.db.prepare('SELECT * FROM memory_entries ORDER BY timestamp');
55
+ this.stmts.loadKeywords = this.db.prepare('SELECT keyword, entry_id FROM keyword_index');
56
+ this.stmts.loadPhases = this.db.prepare('SELECT phase, entry_id FROM phase_index');
57
+ this.stmts.loadSessions = this.db.prepare('SELECT session_id, entry_id FROM session_index');
58
+ this.stmts.loadSessionLog = this.db.prepare('SELECT log_data FROM session_logs WHERE session_id = ?');
59
+ this.stmts.saveSessionLog = this.db.prepare(`
60
+ INSERT OR REPLACE INTO session_logs (session_id, log_data, created_at)
61
+ VALUES (?, ?, ?)
62
+ `);
63
+ this.stmts.listSessionIds = this.db.prepare('SELECT session_id FROM session_logs');
64
+ }
65
+ initSchema() {
66
+ // 创建记忆条目表
67
+ this.db.exec(`
68
+ CREATE TABLE IF NOT EXISTS memory_entries (
69
+ id TEXT PRIMARY KEY,
70
+ timestamp INTEGER NOT NULL,
71
+ session_id TEXT NOT NULL,
72
+ phase TEXT NOT NULL,
73
+ content TEXT NOT NULL,
74
+ keywords TEXT NOT NULL,
75
+ relevance REAL NOT NULL,
76
+ metadata TEXT NOT NULL
77
+ )
78
+ `);
79
+ // 创建关键词索引表
80
+ this.db.exec(`
81
+ CREATE TABLE IF NOT EXISTS keyword_index (
82
+ keyword TEXT NOT NULL,
83
+ entry_id TEXT NOT NULL,
84
+ PRIMARY KEY (keyword, entry_id),
85
+ FOREIGN KEY (entry_id) REFERENCES memory_entries(id) ON DELETE CASCADE
86
+ )
87
+ `);
88
+ // 创建阶段索引表
89
+ this.db.exec(`
90
+ CREATE TABLE IF NOT EXISTS phase_index (
91
+ phase TEXT NOT NULL,
92
+ entry_id TEXT NOT NULL,
93
+ PRIMARY KEY (phase, entry_id),
94
+ FOREIGN KEY (entry_id) REFERENCES memory_entries(id) ON DELETE CASCADE
95
+ )
96
+ `);
97
+ // 创建会话索引表
98
+ this.db.exec(`
99
+ CREATE TABLE IF NOT EXISTS session_index (
100
+ session_id TEXT NOT NULL,
101
+ entry_id TEXT NOT NULL,
102
+ PRIMARY KEY (session_id, entry_id),
103
+ FOREIGN KEY (entry_id) REFERENCES memory_entries(id) ON DELETE CASCADE
104
+ )
105
+ `);
106
+ // 创建会话日志表
107
+ this.db.exec(`
108
+ CREATE TABLE IF NOT EXISTS session_logs (
109
+ session_id TEXT PRIMARY KEY,
110
+ log_data TEXT NOT NULL,
111
+ created_at INTEGER NOT NULL
112
+ )
113
+ `);
114
+ // 创建索引以加速查询
115
+ this.db.exec(`
116
+ CREATE INDEX IF NOT EXISTS idx_entries_timestamp ON memory_entries(timestamp);
117
+ CREATE INDEX IF NOT EXISTS idx_entries_session ON memory_entries(session_id);
118
+ CREATE INDEX IF NOT EXISTS idx_entries_phase ON memory_entries(phase);
119
+ CREATE INDEX IF NOT EXISTS idx_keyword_keyword ON keyword_index(keyword);
120
+ `);
121
+ }
122
+ async load() {
123
+ const index = {
124
+ entries: new Map(),
125
+ keywords: new Map(),
126
+ phases: new Map(),
127
+ sessions: new Map(),
128
+ timeline: [],
129
+ };
130
+ // 使用预编译缓存的语句加载数据
131
+ const entries = this.stmts.loadEntries.all();
132
+ for (const row of entries) {
133
+ const entry = {
134
+ id: row.id,
135
+ timestamp: row.timestamp,
136
+ sessionId: row.session_id,
137
+ phase: row.phase,
138
+ content: row.content,
139
+ keywords: JSON.parse(row.keywords),
140
+ relevance: row.relevance,
141
+ metadata: JSON.parse(row.metadata),
142
+ };
143
+ index.entries.set(entry.id, entry);
144
+ index.timeline.push(entry);
145
+ }
146
+ // 加载关键词索引
147
+ const keywords = this.stmts.loadKeywords.all();
148
+ for (const row of keywords) {
149
+ if (!index.keywords.has(row.keyword)) {
150
+ index.keywords.set(row.keyword, new Set());
151
+ }
152
+ index.keywords.get(row.keyword).add(row.entry_id);
153
+ }
154
+ // 加载阶段索引
155
+ const phases = this.stmts.loadPhases.all();
156
+ for (const row of phases) {
157
+ const phase = row.phase;
158
+ if (!index.phases.has(phase)) {
159
+ index.phases.set(phase, new Set());
160
+ }
161
+ index.phases.get(phase).add(row.entry_id);
162
+ }
163
+ // 加载会话索引
164
+ const sessions = this.stmts.loadSessions.all();
165
+ for (const row of sessions) {
166
+ if (!index.sessions.has(row.session_id)) {
167
+ index.sessions.set(row.session_id, new Set());
168
+ }
169
+ index.sessions.get(row.session_id).add(row.entry_id);
170
+ }
171
+ // 显式排序 timeline(SQL ORDER BY 已排序,此为安全冗余)
172
+ index.timeline.sort((a, b) => a.timestamp - b.timestamp);
173
+ return index;
174
+ }
175
+ async save(index) {
176
+ // 使用事务确保原子性
177
+ const transaction = this.db.transaction(() => {
178
+ // 清空现有数据
179
+ this.db.exec('DELETE FROM memory_entries');
180
+ this.db.exec('DELETE FROM keyword_index');
181
+ this.db.exec('DELETE FROM phase_index');
182
+ this.db.exec('DELETE FROM session_index');
183
+ // 使用预编译缓存的语句
184
+ const insertEntry = this.stmts.insertEntry;
185
+ const insertKeyword = this.stmts.insertKeyword;
186
+ const insertPhase = this.stmts.insertPhase;
187
+ const insertSession = this.stmts.insertSession;
188
+ for (const entry of index.entries.values()) {
189
+ insertEntry.run(entry.id, entry.timestamp, entry.sessionId, entry.phase, entry.content, JSON.stringify(entry.keywords), entry.relevance, JSON.stringify(entry.metadata));
190
+ // 插入关键词索引
191
+ for (const keyword of entry.keywords) {
192
+ insertKeyword.run(keyword, entry.id);
193
+ }
194
+ // 插入阶段索引
195
+ insertPhase.run(entry.phase, entry.id);
196
+ // 插入会话索引
197
+ insertSession.run(entry.sessionId, entry.id);
198
+ }
199
+ });
200
+ transaction();
201
+ }
202
+ async clear() {
203
+ this.db.exec('DELETE FROM memory_entries');
204
+ this.db.exec('DELETE FROM keyword_index');
205
+ this.db.exec('DELETE FROM phase_index');
206
+ this.db.exec('DELETE FROM session_index');
207
+ this.db.exec('DELETE FROM session_logs');
208
+ }
209
+ saveSessionLog(sessionId, log) {
210
+ this.stmts.saveSessionLog.run(sessionId, JSON.stringify(log), Date.now());
211
+ }
212
+ loadSessionLog(sessionId) {
213
+ const row = this.stmts.loadSessionLog.get(sessionId);
214
+ if (!row) {
215
+ return null;
216
+ }
217
+ return JSON.parse(row.log_data);
218
+ }
219
+ listSessionIds() {
220
+ const rows = this.stmts.listSessionIds.all();
221
+ return rows.map(r => r.session_id);
222
+ }
223
+ /**
224
+ * 关闭数据库连接
225
+ */
226
+ close() {
227
+ this.db.close();
228
+ }
229
+ }
230
+ //# sourceMappingURL=sqlite-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite-adapter.js","sourceRoot":"","sources":["../../../../src/core/memory/adapters/sqlite-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * 跨会话记忆系统入口
3
+ *
4
+ * P2-12: 借鉴 Trellis 的 mem 子系统
5
+ *
6
+ * 提供能力:
7
+ * - 索引 AI 会话日志
8
+ * - 关键词搜索
9
+ * - 阶段切片
10
+ * - 相关性评分
11
+ *
12
+ * @example
13
+ * ```typescript
14
+ * import { createMemoryManager } from 'specpow/core/memory';
15
+ *
16
+ * const memory = createMemoryManager(projectRoot);
17
+ *
18
+ * // 索引会话
19
+ * await memory.indexSession(sessionLog);
20
+ *
21
+ * // 搜索记忆
22
+ * const results = await memory.search({
23
+ * keywords: ['authentication', 'login'],
24
+ * phases: ['apply'],
25
+ * limit: 10
26
+ * });
27
+ *
28
+ * // 获取最近记忆
29
+ * const recent = await memory.getRecent(20);
30
+ * ```
31
+ */
32
+ export type { MemoryEntry, MemoryMetadata, MemoryIndex, MemoryStore, MemoryManager, MemoryStats, MemorySearchQuery, MemorySearchResult, SessionLog, SessionMessage, ToolCall, WorkflowStage, } from './memory-types.js';
33
+ export { FileMemoryStore } from './memory-store.js';
34
+ export { MemoryManagerImpl, createMemoryManager } from './memory-manager.js';
35
+ export { SqliteMemoryStore } from './adapters/sqlite-adapter.js';
36
+ export { ShardedJsonStore, type ShardedJsonStoreOptions } from './adapters/json-adapter.js';
37
+ export { extractKeywords, detectPhase, calculateRelevance, indexSessionLog, addToIndex, } from './memory-indexer.js';
38
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/memory/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAGH,YAAY,EACV,WAAW,EACX,cAAc,EACd,WAAW,EACX,WAAW,EACX,aAAa,EACb,WAAW,EACX,iBAAiB,EACjB,kBAAkB,EAClB,UAAU,EACV,cAAc,EACd,QAAQ,EACR,aAAa,GACd,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAG7E,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,KAAK,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AAG5F,OAAO,EACL,eAAe,EACf,WAAW,EACX,kBAAkB,EAClB,eAAe,EACf,UAAU,GACX,MAAM,qBAAqB,CAAC"}