cognitive-core 0.2.0 → 0.2.2

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 (397) hide show
  1. package/.claude/settings.json +111 -2
  2. package/.sessionlog/settings.json +4 -0
  3. package/dist/atlas.d.ts +10 -0
  4. package/dist/atlas.d.ts.map +1 -1
  5. package/dist/atlas.js +65 -0
  6. package/dist/atlas.js.map +1 -1
  7. package/dist/index.d.ts +1 -1
  8. package/dist/index.d.ts.map +1 -1
  9. package/dist/index.js +5 -1
  10. package/dist/index.js.map +1 -1
  11. package/dist/learning/index.d.ts +1 -1
  12. package/dist/learning/index.d.ts.map +1 -1
  13. package/dist/learning/index.js.map +1 -1
  14. package/dist/learning/pipeline.d.ts +4 -31
  15. package/dist/learning/pipeline.d.ts.map +1 -1
  16. package/dist/learning/pipeline.js +12 -64
  17. package/dist/learning/pipeline.js.map +1 -1
  18. package/dist/learning/unified-pipeline.d.ts +30 -0
  19. package/dist/learning/unified-pipeline.d.ts.map +1 -1
  20. package/dist/learning/unified-pipeline.js +207 -0
  21. package/dist/learning/unified-pipeline.js.map +1 -1
  22. package/dist/memory/candidate-retrieval.d.ts.map +1 -1
  23. package/dist/memory/candidate-retrieval.js +3 -1
  24. package/dist/memory/candidate-retrieval.js.map +1 -1
  25. package/dist/memory/curated-loader.d.ts +21 -4
  26. package/dist/memory/curated-loader.d.ts.map +1 -1
  27. package/dist/memory/curated-loader.js +53 -16
  28. package/dist/memory/curated-loader.js.map +1 -1
  29. package/dist/memory/index.d.ts +2 -1
  30. package/dist/memory/index.d.ts.map +1 -1
  31. package/dist/memory/index.js +3 -1
  32. package/dist/memory/index.js.map +1 -1
  33. package/dist/memory/playbook.d.ts +6 -0
  34. package/dist/memory/playbook.d.ts.map +1 -1
  35. package/dist/memory/playbook.js +15 -0
  36. package/dist/memory/playbook.js.map +1 -1
  37. package/dist/memory/source-resolver.d.ts +120 -0
  38. package/dist/memory/source-resolver.d.ts.map +1 -0
  39. package/dist/memory/source-resolver.js +300 -0
  40. package/dist/memory/source-resolver.js.map +1 -0
  41. package/dist/types/config.d.ts +141 -0
  42. package/dist/types/config.d.ts.map +1 -1
  43. package/dist/types/config.js +40 -0
  44. package/dist/types/config.js.map +1 -1
  45. package/dist/types/index.d.ts +1 -1
  46. package/dist/types/index.d.ts.map +1 -1
  47. package/dist/types/index.js +1 -1
  48. package/dist/types/index.js.map +1 -1
  49. package/dist/utils/error-classifier.js +8 -8
  50. package/dist/utils/error-classifier.js.map +1 -1
  51. package/dist/workspace/efficacy-toolkit.d.ts +164 -0
  52. package/dist/workspace/efficacy-toolkit.d.ts.map +1 -0
  53. package/dist/workspace/efficacy-toolkit.js +281 -0
  54. package/dist/workspace/efficacy-toolkit.js.map +1 -0
  55. package/dist/workspace/index.d.ts +2 -1
  56. package/dist/workspace/index.d.ts.map +1 -1
  57. package/dist/workspace/index.js +3 -1
  58. package/dist/workspace/index.js.map +1 -1
  59. package/dist/workspace/templates/index.d.ts +3 -0
  60. package/dist/workspace/templates/index.d.ts.map +1 -1
  61. package/dist/workspace/templates/index.js +6 -0
  62. package/dist/workspace/templates/index.js.map +1 -1
  63. package/dist/workspace/templates/playbook-decay-detection.d.ts +46 -0
  64. package/dist/workspace/templates/playbook-decay-detection.d.ts.map +1 -0
  65. package/dist/workspace/templates/playbook-decay-detection.js +197 -0
  66. package/dist/workspace/templates/playbook-decay-detection.js.map +1 -0
  67. package/dist/workspace/templates/playbook-efficacy-audit.d.ts +46 -0
  68. package/dist/workspace/templates/playbook-efficacy-audit.d.ts.map +1 -0
  69. package/dist/workspace/templates/playbook-efficacy-audit.js +160 -0
  70. package/dist/workspace/templates/playbook-efficacy-audit.js.map +1 -0
  71. package/dist/workspace/templates/playbook-lifecycle-review.d.ts +51 -0
  72. package/dist/workspace/templates/playbook-lifecycle-review.d.ts.map +1 -0
  73. package/dist/workspace/templates/playbook-lifecycle-review.js +187 -0
  74. package/dist/workspace/templates/playbook-lifecycle-review.js.map +1 -0
  75. package/dist/workspace/types.d.ts +12 -54
  76. package/dist/workspace/types.d.ts.map +1 -1
  77. package/dist/workspace/types.js.map +1 -1
  78. package/package.json +8 -2
  79. package/playbooks/compound-engineering/adversarial-review.json +51 -0
  80. package/playbooks/compound-engineering/agent-native-architecture.json +59 -0
  81. package/playbooks/compound-engineering/agent-native-review.json +54 -0
  82. package/playbooks/compound-engineering/api-contract-review.json +52 -0
  83. package/playbooks/compound-engineering/brainstorm-requirements.json +55 -0
  84. package/playbooks/compound-engineering/bug-reproduction.json +62 -0
  85. package/playbooks/compound-engineering/confidence-calibration.json +49 -0
  86. package/playbooks/compound-engineering/correctness-review.json +49 -0
  87. package/playbooks/compound-engineering/data-migration-safety.json +59 -0
  88. package/playbooks/compound-engineering/deployment-verification.json +63 -0
  89. package/playbooks/compound-engineering/error-recovery-patterns.json +53 -0
  90. package/playbooks/compound-engineering/implementation-planning.json +64 -0
  91. package/playbooks/compound-engineering/issue-pattern-analysis.json +53 -0
  92. package/playbooks/compound-engineering/knowledge-compounding.json +63 -0
  93. package/playbooks/compound-engineering/learnings-research.json +54 -0
  94. package/playbooks/compound-engineering/maintainability-review.json +49 -0
  95. package/playbooks/compound-engineering/performance-review.json +54 -0
  96. package/playbooks/compound-engineering/plan-adversarial-review.json +56 -0
  97. package/playbooks/compound-engineering/plan-feasibility-review.json +56 -0
  98. package/playbooks/compound-engineering/project-standards-review.json +52 -0
  99. package/playbooks/compound-engineering/reliability-review.json +53 -0
  100. package/playbooks/compound-engineering/review-orchestration.json +64 -0
  101. package/playbooks/compound-engineering/security-review.json +54 -0
  102. package/playbooks/compound-engineering/systematic-execution.json +64 -0
  103. package/playbooks/compound-engineering/testing-review.json +50 -0
  104. package/src/atlas.ts +96 -0
  105. package/src/index.ts +27 -0
  106. package/src/learning/index.ts +1 -0
  107. package/src/learning/unified-pipeline.ts +271 -1
  108. package/src/memory/candidate-retrieval.ts +2 -1
  109. package/src/memory/curated-loader.ts +69 -16
  110. package/src/memory/index.ts +16 -0
  111. package/src/memory/playbook.ts +19 -0
  112. package/src/memory/source-resolver.ts +422 -0
  113. package/src/types/config.ts +46 -0
  114. package/src/types/index.ts +4 -0
  115. package/src/utils/error-classifier.ts +8 -8
  116. package/src/workspace/efficacy-toolkit.ts +496 -0
  117. package/src/workspace/index.ts +29 -0
  118. package/src/workspace/templates/index.ts +24 -0
  119. package/src/workspace/templates/playbook-decay-detection.ts +272 -0
  120. package/src/workspace/templates/playbook-efficacy-audit.ts +246 -0
  121. package/src/workspace/templates/playbook-lifecycle-review.ts +274 -0
  122. package/src/workspace/types.ts +22 -78
  123. package/tests/fixtures/behavioral-trajectories.ts +210 -0
  124. package/tests/integration/curated-sources-e2e.test.ts +502 -0
  125. package/tests/integration/pipeline-data-correctness.test.ts +794 -0
  126. package/tests/learning/meta-learner.test.ts +418 -0
  127. package/tests/learning/pipeline-memory-updates.test.ts +721 -0
  128. package/tests/learning/unified-pipeline-efficacy.test.ts +232 -0
  129. package/tests/memory/candidate-retrieval.test.ts +167 -0
  130. package/tests/memory/compound-engineering-seed.test.ts +338 -0
  131. package/tests/memory/curated-loader-extended.test.ts +225 -0
  132. package/tests/memory/meta.test.ts +399 -0
  133. package/tests/memory/playbook-quality-validation.test.ts +430 -0
  134. package/tests/memory/source-resolver.test.ts +700 -0
  135. package/tests/search/evaluator.test.ts +257 -0
  136. package/tests/search/verification-runner.test.ts +357 -0
  137. package/tests/utils/error-classifier.test.ts +149 -0
  138. package/tests/utils/trajectory-helpers.test.ts +163 -0
  139. package/tests/workspace/efficacy-toolkit.test.ts +404 -0
  140. package/tests/workspace/templates/playbook-efficacy.test.ts +377 -0
  141. package/.claude/settings.local.json +0 -11
  142. package/dist/learning/llm-extractor.d.ts +0 -88
  143. package/dist/learning/llm-extractor.d.ts.map +0 -1
  144. package/dist/learning/llm-extractor.js +0 -372
  145. package/dist/learning/llm-extractor.js.map +0 -1
  146. package/dist/learning/loop-coordinator.d.ts +0 -61
  147. package/dist/learning/loop-coordinator.d.ts.map +0 -1
  148. package/dist/learning/loop-coordinator.js +0 -96
  149. package/dist/learning/loop-coordinator.js.map +0 -1
  150. package/references/agent-workspace/CLAUDE.md +0 -74
  151. package/references/agent-workspace/README.md +0 -587
  152. package/references/agent-workspace/media/banner.png +0 -0
  153. package/references/agent-workspace/package-lock.json +0 -2061
  154. package/references/agent-workspace/package.json +0 -54
  155. package/references/agent-workspace/src/handle.ts +0 -122
  156. package/references/agent-workspace/src/index.ts +0 -32
  157. package/references/agent-workspace/src/manager.ts +0 -102
  158. package/references/agent-workspace/src/readers/json.ts +0 -71
  159. package/references/agent-workspace/src/readers/markdown.ts +0 -37
  160. package/references/agent-workspace/src/readers/raw.ts +0 -27
  161. package/references/agent-workspace/src/types.ts +0 -68
  162. package/references/agent-workspace/src/validation.ts +0 -93
  163. package/references/agent-workspace/src/writers/json.ts +0 -17
  164. package/references/agent-workspace/src/writers/markdown.ts +0 -27
  165. package/references/agent-workspace/src/writers/raw.ts +0 -22
  166. package/references/agent-workspace/tests/errors.test.ts +0 -652
  167. package/references/agent-workspace/tests/handle.test.ts +0 -144
  168. package/references/agent-workspace/tests/manager.test.ts +0 -124
  169. package/references/agent-workspace/tests/readers.test.ts +0 -205
  170. package/references/agent-workspace/tests/validation.test.ts +0 -196
  171. package/references/agent-workspace/tests/writers.test.ts +0 -108
  172. package/references/agent-workspace/tsconfig.json +0 -20
  173. package/references/agent-workspace/tsup.config.ts +0 -9
  174. package/references/minimem/.claude/settings.json +0 -7
  175. package/references/minimem/.sudocode/issues.jsonl +0 -18
  176. package/references/minimem/.sudocode/specs.jsonl +0 -1
  177. package/references/minimem/CLAUDE.md +0 -310
  178. package/references/minimem/README.md +0 -556
  179. package/references/minimem/claude-plugin/.claude-plugin/plugin.json +0 -10
  180. package/references/minimem/claude-plugin/.mcp.json +0 -7
  181. package/references/minimem/claude-plugin/README.md +0 -158
  182. package/references/minimem/claude-plugin/commands/recall.md +0 -47
  183. package/references/minimem/claude-plugin/commands/remember.md +0 -41
  184. package/references/minimem/claude-plugin/hooks/__tests__/hooks.test.ts +0 -272
  185. package/references/minimem/claude-plugin/hooks/hooks.json +0 -27
  186. package/references/minimem/claude-plugin/hooks/session-end.sh +0 -86
  187. package/references/minimem/claude-plugin/hooks/session-start.sh +0 -85
  188. package/references/minimem/claude-plugin/skills/memory/SKILL.md +0 -108
  189. package/references/minimem/package-lock.json +0 -5373
  190. package/references/minimem/package.json +0 -60
  191. package/references/minimem/scripts/postbuild.js +0 -35
  192. package/references/minimem/src/__tests__/edge-cases.test.ts +0 -371
  193. package/references/minimem/src/__tests__/errors.test.ts +0 -265
  194. package/references/minimem/src/__tests__/helpers.ts +0 -199
  195. package/references/minimem/src/__tests__/internal.test.ts +0 -407
  196. package/references/minimem/src/__tests__/knowledge.test.ts +0 -287
  197. package/references/minimem/src/__tests__/minimem.integration.test.ts +0 -1127
  198. package/references/minimem/src/__tests__/session.test.ts +0 -190
  199. package/references/minimem/src/cli/__tests__/commands.test.ts +0 -759
  200. package/references/minimem/src/cli/commands/__tests__/conflicts.test.ts +0 -141
  201. package/references/minimem/src/cli/commands/append.ts +0 -76
  202. package/references/minimem/src/cli/commands/config.ts +0 -262
  203. package/references/minimem/src/cli/commands/conflicts.ts +0 -413
  204. package/references/minimem/src/cli/commands/daemon.ts +0 -169
  205. package/references/minimem/src/cli/commands/index.ts +0 -12
  206. package/references/minimem/src/cli/commands/init.ts +0 -88
  207. package/references/minimem/src/cli/commands/mcp.ts +0 -177
  208. package/references/minimem/src/cli/commands/push-pull.ts +0 -213
  209. package/references/minimem/src/cli/commands/search.ts +0 -158
  210. package/references/minimem/src/cli/commands/status.ts +0 -84
  211. package/references/minimem/src/cli/commands/sync-init.ts +0 -290
  212. package/references/minimem/src/cli/commands/sync.ts +0 -70
  213. package/references/minimem/src/cli/commands/upsert.ts +0 -197
  214. package/references/minimem/src/cli/config.ts +0 -584
  215. package/references/minimem/src/cli/index.ts +0 -264
  216. package/references/minimem/src/cli/shared.ts +0 -161
  217. package/references/minimem/src/cli/sync/__tests__/central.test.ts +0 -152
  218. package/references/minimem/src/cli/sync/__tests__/conflicts.test.ts +0 -209
  219. package/references/minimem/src/cli/sync/__tests__/daemon.test.ts +0 -118
  220. package/references/minimem/src/cli/sync/__tests__/detection.test.ts +0 -207
  221. package/references/minimem/src/cli/sync/__tests__/integration.test.ts +0 -476
  222. package/references/minimem/src/cli/sync/__tests__/registry.test.ts +0 -363
  223. package/references/minimem/src/cli/sync/__tests__/state.test.ts +0 -255
  224. package/references/minimem/src/cli/sync/__tests__/validation.test.ts +0 -193
  225. package/references/minimem/src/cli/sync/__tests__/watcher.test.ts +0 -178
  226. package/references/minimem/src/cli/sync/central.ts +0 -292
  227. package/references/minimem/src/cli/sync/conflicts.ts +0 -204
  228. package/references/minimem/src/cli/sync/daemon.ts +0 -407
  229. package/references/minimem/src/cli/sync/detection.ts +0 -138
  230. package/references/minimem/src/cli/sync/index.ts +0 -107
  231. package/references/minimem/src/cli/sync/operations.ts +0 -373
  232. package/references/minimem/src/cli/sync/registry.ts +0 -279
  233. package/references/minimem/src/cli/sync/state.ts +0 -355
  234. package/references/minimem/src/cli/sync/validation.ts +0 -206
  235. package/references/minimem/src/cli/sync/watcher.ts +0 -234
  236. package/references/minimem/src/cli/version.ts +0 -34
  237. package/references/minimem/src/core/index.ts +0 -9
  238. package/references/minimem/src/core/indexer.ts +0 -628
  239. package/references/minimem/src/core/searcher.ts +0 -221
  240. package/references/minimem/src/db/schema.ts +0 -183
  241. package/references/minimem/src/db/sqlite-vec.ts +0 -24
  242. package/references/minimem/src/embeddings/__tests__/embeddings.test.ts +0 -431
  243. package/references/minimem/src/embeddings/batch-gemini.ts +0 -392
  244. package/references/minimem/src/embeddings/batch-openai.ts +0 -409
  245. package/references/minimem/src/embeddings/embeddings.ts +0 -434
  246. package/references/minimem/src/index.ts +0 -109
  247. package/references/minimem/src/internal.ts +0 -299
  248. package/references/minimem/src/minimem.ts +0 -1276
  249. package/references/minimem/src/search/__tests__/hybrid.test.ts +0 -247
  250. package/references/minimem/src/search/graph.ts +0 -234
  251. package/references/minimem/src/search/hybrid.ts +0 -151
  252. package/references/minimem/src/search/search.ts +0 -256
  253. package/references/minimem/src/server/__tests__/mcp.test.ts +0 -341
  254. package/references/minimem/src/server/__tests__/tools.test.ts +0 -364
  255. package/references/minimem/src/server/mcp.ts +0 -326
  256. package/references/minimem/src/server/tools.ts +0 -720
  257. package/references/minimem/src/session.ts +0 -460
  258. package/references/minimem/tsconfig.json +0 -19
  259. package/references/minimem/tsup.config.ts +0 -26
  260. package/references/minimem/vitest.config.ts +0 -24
  261. package/references/sessionlog/.husky/pre-commit +0 -1
  262. package/references/sessionlog/.lintstagedrc.json +0 -4
  263. package/references/sessionlog/.prettierignore +0 -4
  264. package/references/sessionlog/.prettierrc.json +0 -11
  265. package/references/sessionlog/LICENSE +0 -21
  266. package/references/sessionlog/README.md +0 -453
  267. package/references/sessionlog/eslint.config.js +0 -58
  268. package/references/sessionlog/package-lock.json +0 -3672
  269. package/references/sessionlog/package.json +0 -65
  270. package/references/sessionlog/src/__tests__/agent-hooks.test.ts +0 -570
  271. package/references/sessionlog/src/__tests__/agent-registry.test.ts +0 -127
  272. package/references/sessionlog/src/__tests__/claude-code-hooks.test.ts +0 -225
  273. package/references/sessionlog/src/__tests__/claude-generator.test.ts +0 -46
  274. package/references/sessionlog/src/__tests__/commit-msg.test.ts +0 -86
  275. package/references/sessionlog/src/__tests__/cursor-agent.test.ts +0 -224
  276. package/references/sessionlog/src/__tests__/e2e-live.test.ts +0 -890
  277. package/references/sessionlog/src/__tests__/event-log.test.ts +0 -183
  278. package/references/sessionlog/src/__tests__/flush-sentinel.test.ts +0 -105
  279. package/references/sessionlog/src/__tests__/gemini-agent.test.ts +0 -375
  280. package/references/sessionlog/src/__tests__/git-hooks.test.ts +0 -78
  281. package/references/sessionlog/src/__tests__/hook-managers.test.ts +0 -121
  282. package/references/sessionlog/src/__tests__/lifecycle-tasks.test.ts +0 -759
  283. package/references/sessionlog/src/__tests__/opencode-agent.test.ts +0 -338
  284. package/references/sessionlog/src/__tests__/redaction.test.ts +0 -136
  285. package/references/sessionlog/src/__tests__/session-repo.test.ts +0 -353
  286. package/references/sessionlog/src/__tests__/session-store.test.ts +0 -166
  287. package/references/sessionlog/src/__tests__/setup-ccweb.test.ts +0 -466
  288. package/references/sessionlog/src/__tests__/skill-live.test.ts +0 -461
  289. package/references/sessionlog/src/__tests__/summarize.test.ts +0 -348
  290. package/references/sessionlog/src/__tests__/task-plan-e2e.test.ts +0 -610
  291. package/references/sessionlog/src/__tests__/task-plan-live.test.ts +0 -632
  292. package/references/sessionlog/src/__tests__/transcript-timestamp.test.ts +0 -121
  293. package/references/sessionlog/src/__tests__/types.test.ts +0 -166
  294. package/references/sessionlog/src/__tests__/utils.test.ts +0 -333
  295. package/references/sessionlog/src/__tests__/validation.test.ts +0 -103
  296. package/references/sessionlog/src/__tests__/worktree.test.ts +0 -57
  297. package/references/sessionlog/src/agent/agents/claude-code.ts +0 -1089
  298. package/references/sessionlog/src/agent/agents/cursor.ts +0 -361
  299. package/references/sessionlog/src/agent/agents/gemini-cli.ts +0 -632
  300. package/references/sessionlog/src/agent/agents/opencode.ts +0 -540
  301. package/references/sessionlog/src/agent/registry.ts +0 -143
  302. package/references/sessionlog/src/agent/session-types.ts +0 -113
  303. package/references/sessionlog/src/agent/types.ts +0 -220
  304. package/references/sessionlog/src/cli.ts +0 -597
  305. package/references/sessionlog/src/commands/clean.ts +0 -133
  306. package/references/sessionlog/src/commands/disable.ts +0 -84
  307. package/references/sessionlog/src/commands/doctor.ts +0 -145
  308. package/references/sessionlog/src/commands/enable.ts +0 -202
  309. package/references/sessionlog/src/commands/explain.ts +0 -261
  310. package/references/sessionlog/src/commands/reset.ts +0 -105
  311. package/references/sessionlog/src/commands/resume.ts +0 -180
  312. package/references/sessionlog/src/commands/rewind.ts +0 -195
  313. package/references/sessionlog/src/commands/setup-ccweb.ts +0 -275
  314. package/references/sessionlog/src/commands/status.ts +0 -172
  315. package/references/sessionlog/src/config.ts +0 -165
  316. package/references/sessionlog/src/events/event-log.ts +0 -126
  317. package/references/sessionlog/src/git-operations.ts +0 -558
  318. package/references/sessionlog/src/hooks/git-hooks.ts +0 -165
  319. package/references/sessionlog/src/hooks/lifecycle.ts +0 -391
  320. package/references/sessionlog/src/index.ts +0 -650
  321. package/references/sessionlog/src/security/redaction.ts +0 -283
  322. package/references/sessionlog/src/session/state-machine.ts +0 -452
  323. package/references/sessionlog/src/store/checkpoint-store.ts +0 -509
  324. package/references/sessionlog/src/store/native-store.ts +0 -173
  325. package/references/sessionlog/src/store/provider-types.ts +0 -99
  326. package/references/sessionlog/src/store/session-store.ts +0 -266
  327. package/references/sessionlog/src/strategy/attribution.ts +0 -296
  328. package/references/sessionlog/src/strategy/common.ts +0 -207
  329. package/references/sessionlog/src/strategy/content-overlap.ts +0 -228
  330. package/references/sessionlog/src/strategy/manual-commit.ts +0 -988
  331. package/references/sessionlog/src/strategy/types.ts +0 -279
  332. package/references/sessionlog/src/summarize/claude-generator.ts +0 -115
  333. package/references/sessionlog/src/summarize/summarize.ts +0 -432
  334. package/references/sessionlog/src/types.ts +0 -508
  335. package/references/sessionlog/src/utils/chunk-files.ts +0 -49
  336. package/references/sessionlog/src/utils/commit-message.ts +0 -65
  337. package/references/sessionlog/src/utils/detect-agent.ts +0 -36
  338. package/references/sessionlog/src/utils/hook-managers.ts +0 -125
  339. package/references/sessionlog/src/utils/ide-tags.ts +0 -32
  340. package/references/sessionlog/src/utils/paths.ts +0 -79
  341. package/references/sessionlog/src/utils/preview-rewind.ts +0 -80
  342. package/references/sessionlog/src/utils/rewind-conflict.ts +0 -121
  343. package/references/sessionlog/src/utils/shadow-branch.ts +0 -109
  344. package/references/sessionlog/src/utils/string-utils.ts +0 -46
  345. package/references/sessionlog/src/utils/todo-extract.ts +0 -188
  346. package/references/sessionlog/src/utils/trailers.ts +0 -187
  347. package/references/sessionlog/src/utils/transcript-parse.ts +0 -177
  348. package/references/sessionlog/src/utils/transcript-timestamp.ts +0 -59
  349. package/references/sessionlog/src/utils/tree-ops.ts +0 -219
  350. package/references/sessionlog/src/utils/tty.ts +0 -72
  351. package/references/sessionlog/src/utils/validation.ts +0 -65
  352. package/references/sessionlog/src/utils/worktree.ts +0 -58
  353. package/references/sessionlog/src/wire-types.ts +0 -59
  354. package/references/sessionlog/templates/setup-env.sh +0 -153
  355. package/references/sessionlog/tsconfig.json +0 -18
  356. package/references/sessionlog/vitest.config.ts +0 -12
  357. package/references/skill-tree/.claude/settings.json +0 -6
  358. package/references/skill-tree/.sudocode/issues.jsonl +0 -19
  359. package/references/skill-tree/.sudocode/specs.jsonl +0 -3
  360. package/references/skill-tree/CLAUDE.md +0 -126
  361. package/references/skill-tree/README.md +0 -372
  362. package/references/skill-tree/docs/GAPS_v1.md +0 -221
  363. package/references/skill-tree/docs/INTEGRATION_PLAN.md +0 -467
  364. package/references/skill-tree/docs/TODOS.md +0 -91
  365. package/references/skill-tree/docs/anthropic_skill_guide.md +0 -1364
  366. package/references/skill-tree/docs/design/federated-skill-trees.md +0 -524
  367. package/references/skill-tree/docs/design/multi-agent-sync.md +0 -759
  368. package/references/skill-tree/docs/scraper/BRAINSTORM.md +0 -583
  369. package/references/skill-tree/docs/scraper/POC_PLAN.md +0 -420
  370. package/references/skill-tree/docs/scraper/README.md +0 -170
  371. package/references/skill-tree/examples/basic-usage.ts +0 -164
  372. package/references/skill-tree/package-lock.json +0 -1852
  373. package/references/skill-tree/package.json +0 -66
  374. package/references/skill-tree/scraper/README.md +0 -123
  375. package/references/skill-tree/scraper/docs/DESIGN.md +0 -683
  376. package/references/skill-tree/scraper/docs/PLAN.md +0 -336
  377. package/references/skill-tree/scraper/drizzle.config.ts +0 -10
  378. package/references/skill-tree/scraper/package-lock.json +0 -6329
  379. package/references/skill-tree/scraper/package.json +0 -68
  380. package/references/skill-tree/scraper/test/fixtures/invalid-skill/missing-description.md +0 -7
  381. package/references/skill-tree/scraper/test/fixtures/invalid-skill/missing-name.md +0 -7
  382. package/references/skill-tree/scraper/test/fixtures/minimal-skill/SKILL.md +0 -27
  383. package/references/skill-tree/scraper/test/fixtures/skill-json/SKILL.json +0 -21
  384. package/references/skill-tree/scraper/test/fixtures/skill-with-meta/SKILL.md +0 -54
  385. package/references/skill-tree/scraper/test/fixtures/skill-with-meta/_meta.json +0 -24
  386. package/references/skill-tree/scraper/test/fixtures/valid-skill/SKILL.md +0 -93
  387. package/references/skill-tree/scraper/test/fixtures/valid-skill/_meta.json +0 -22
  388. package/references/skill-tree/scraper/tsup.config.ts +0 -14
  389. package/references/skill-tree/scraper/vitest.config.ts +0 -17
  390. package/references/skill-tree/scripts/convert-to-vitest.ts +0 -166
  391. package/references/skill-tree/skills/skill-writer/SKILL.md +0 -339
  392. package/references/skill-tree/skills/skill-writer/references/examples.md +0 -326
  393. package/references/skill-tree/skills/skill-writer/references/patterns.md +0 -210
  394. package/references/skill-tree/skills/skill-writer/references/quality-checklist.md +0 -123
  395. package/references/skill-tree/test/run-all.ts +0 -106
  396. package/references/skill-tree/test/utils.ts +0 -128
  397. package/references/skill-tree/vitest.config.ts +0 -16
@@ -1,121 +0,0 @@
1
- /**
2
- * Tests for Transcript Timestamp Extraction
3
- */
4
-
5
- import { describe, it, expect, beforeEach, afterEach } from 'vitest';
6
- import * as fs from 'node:fs';
7
- import * as path from 'node:path';
8
- import * as os from 'node:os';
9
- import {
10
- parseTimestampFromJSONL,
11
- getLastTimestampFromBytes,
12
- getLastTimestampFromFile,
13
- } from '../utils/transcript-timestamp.js';
14
-
15
- describe('Transcript Timestamp Extraction', () => {
16
- describe('parseTimestampFromJSONL', () => {
17
- it('should parse valid ISO timestamp', () => {
18
- const line = JSON.stringify({ timestamp: '2025-01-15T10:30:00Z', type: 'user' });
19
- const result = parseTimestampFromJSONL(line);
20
- expect(result).not.toBeNull();
21
- expect(result!.toISOString()).toBe('2025-01-15T10:30:00.000Z');
22
- });
23
-
24
- it('should parse timestamp with offset', () => {
25
- const line = JSON.stringify({ timestamp: '2025-06-15T10:30:00+05:00' });
26
- const result = parseTimestampFromJSONL(line);
27
- expect(result).not.toBeNull();
28
- });
29
-
30
- it('should return null for empty string', () => {
31
- expect(parseTimestampFromJSONL('')).toBeNull();
32
- });
33
-
34
- it('should return null for invalid JSON', () => {
35
- expect(parseTimestampFromJSONL('not json')).toBeNull();
36
- });
37
-
38
- it('should return null for missing timestamp field', () => {
39
- const line = JSON.stringify({ type: 'user', message: 'hello' });
40
- expect(parseTimestampFromJSONL(line)).toBeNull();
41
- });
42
-
43
- it('should return null for invalid timestamp', () => {
44
- const line = JSON.stringify({ timestamp: 'not-a-date' });
45
- expect(parseTimestampFromJSONL(line)).toBeNull();
46
- });
47
- });
48
-
49
- describe('getLastTimestampFromBytes', () => {
50
- it('should get timestamp from last line', () => {
51
- const content = [
52
- JSON.stringify({ timestamp: '2025-01-15T10:00:00Z', type: 'user' }),
53
- JSON.stringify({ timestamp: '2025-01-15T10:05:00Z', type: 'assistant' }),
54
- JSON.stringify({ timestamp: '2025-01-15T10:10:00Z', type: 'user' }),
55
- ].join('\n');
56
-
57
- const result = getLastTimestampFromBytes(content);
58
- expect(result).not.toBeNull();
59
- expect(result!.toISOString()).toBe('2025-01-15T10:10:00.000Z');
60
- });
61
-
62
- it('should skip trailing empty lines', () => {
63
- const content = JSON.stringify({ timestamp: '2025-01-15T10:00:00Z' }) + '\n\n\n';
64
- const result = getLastTimestampFromBytes(content);
65
- expect(result).not.toBeNull();
66
- expect(result!.toISOString()).toBe('2025-01-15T10:00:00.000Z');
67
- });
68
-
69
- it('should return null for empty content', () => {
70
- expect(getLastTimestampFromBytes('')).toBeNull();
71
- expect(getLastTimestampFromBytes(Buffer.alloc(0))).toBeNull();
72
- });
73
-
74
- it('should handle Buffer input', () => {
75
- const buf = Buffer.from(JSON.stringify({ timestamp: '2025-01-15T10:00:00Z' }) + '\n');
76
- const result = getLastTimestampFromBytes(buf);
77
- expect(result).not.toBeNull();
78
- });
79
-
80
- it('should return null if no lines have timestamps', () => {
81
- const content = [
82
- JSON.stringify({ type: 'user' }),
83
- JSON.stringify({ type: 'assistant' }),
84
- ].join('\n');
85
- expect(getLastTimestampFromBytes(content)).toBeNull();
86
- });
87
- });
88
-
89
- describe('getLastTimestampFromFile', () => {
90
- let tmpDir: string;
91
-
92
- beforeEach(() => {
93
- tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'timestamp-test-'));
94
- });
95
-
96
- afterEach(() => {
97
- fs.rmSync(tmpDir, { recursive: true, force: true });
98
- });
99
-
100
- it('should read timestamp from file', async () => {
101
- const filePath = path.join(tmpDir, 'transcript.jsonl');
102
- fs.writeFileSync(filePath, JSON.stringify({ timestamp: '2025-01-15T10:00:00Z' }) + '\n');
103
-
104
- const result = await getLastTimestampFromFile(filePath);
105
- expect(result).not.toBeNull();
106
- expect(result!.toISOString()).toBe('2025-01-15T10:00:00.000Z');
107
- });
108
-
109
- it('should return null for missing file', async () => {
110
- const result = await getLastTimestampFromFile('/nonexistent/file.jsonl');
111
- expect(result).toBeNull();
112
- });
113
-
114
- it('should return null for file without timestamps', async () => {
115
- const filePath = path.join(tmpDir, 'no-timestamps.jsonl');
116
- fs.writeFileSync(filePath, JSON.stringify({ type: 'user' }) + '\n');
117
- const result = await getLastTimestampFromFile(filePath);
118
- expect(result).toBeNull();
119
- });
120
- });
121
- });
@@ -1,166 +0,0 @@
1
- /**
2
- * Tests for Sessionlog Core Types
3
- */
4
-
5
- import { describe, it, expect } from 'vitest';
6
- import {
7
- validateCheckpointID,
8
- checkpointIDPath,
9
- emptyTokenUsage,
10
- addTokenUsage,
11
- EventType,
12
- CHECKPOINT_ID_LENGTH,
13
- CHECKPOINT_ID_PATTERN,
14
- AGENT_NAMES,
15
- AGENT_TYPES,
16
- DEFAULT_AGENT_NAME,
17
- } from '../types.js';
18
-
19
- describe('Sessionlog Types', () => {
20
- describe('Agent Constants', () => {
21
- it('should have expected agent names', () => {
22
- expect(AGENT_NAMES.CLAUDE_CODE).toBe('claude-code');
23
- expect(AGENT_NAMES.CURSOR).toBe('cursor');
24
- expect(AGENT_NAMES.GEMINI).toBe('gemini');
25
- expect(AGENT_NAMES.OPENCODE).toBe('opencode');
26
- });
27
-
28
- it('should have expected agent types', () => {
29
- expect(AGENT_TYPES.CLAUDE_CODE).toBe('Claude Code');
30
- expect(AGENT_TYPES.CURSOR).toBe('Cursor IDE');
31
- expect(AGENT_TYPES.GEMINI).toBe('Gemini CLI');
32
- });
33
-
34
- it('should have Claude Code as default agent', () => {
35
- expect(DEFAULT_AGENT_NAME).toBe('claude-code');
36
- });
37
- });
38
-
39
- describe('EventType', () => {
40
- it('should have task and plan mode event types', () => {
41
- expect(EventType.TaskCreate).toBe(8);
42
- expect(EventType.TaskUpdate).toBe(9);
43
- expect(EventType.PlanModeEnter).toBe(10);
44
- expect(EventType.PlanModeExit).toBe(11);
45
- });
46
-
47
- it('should not conflict with existing event types', () => {
48
- const values = [
49
- EventType.SessionStart,
50
- EventType.TurnStart,
51
- EventType.TurnEnd,
52
- EventType.Compaction,
53
- EventType.SessionEnd,
54
- EventType.SubagentStart,
55
- EventType.SubagentEnd,
56
- EventType.TaskCreate,
57
- EventType.TaskUpdate,
58
- EventType.PlanModeEnter,
59
- EventType.PlanModeExit,
60
- ];
61
- const unique = new Set(values);
62
- expect(unique.size).toBe(values.length);
63
- });
64
- });
65
-
66
- describe('Checkpoint ID', () => {
67
- it('should validate correct checkpoint IDs', () => {
68
- expect(validateCheckpointID('a3b2c4d5e6f7')).toBe(true);
69
- expect(validateCheckpointID('000000000000')).toBe(true);
70
- expect(validateCheckpointID('abcdef123456')).toBe(true);
71
- });
72
-
73
- it('should reject invalid checkpoint IDs', () => {
74
- expect(validateCheckpointID('')).toBe(false);
75
- expect(validateCheckpointID('short')).toBe(false);
76
- expect(validateCheckpointID('a3b2c4d5e6f7g')).toBe(false); // too long
77
- expect(validateCheckpointID('ABCDEF123456')).toBe(false); // uppercase
78
- expect(validateCheckpointID('xxxxxxxxxxxx')).toBe(false); // non-hex
79
- });
80
-
81
- it('should shard checkpoint ID into path', () => {
82
- expect(checkpointIDPath('a3b2c4d5e6f7')).toBe('a3/b2c4d5e6f7');
83
- expect(checkpointIDPath('00abcdef1234')).toBe('00/abcdef1234');
84
- });
85
-
86
- it('should have correct ID length constant', () => {
87
- expect(CHECKPOINT_ID_LENGTH).toBe(12);
88
- });
89
-
90
- it('should have correct ID pattern', () => {
91
- expect(CHECKPOINT_ID_PATTERN.test('a3b2c4d5e6f7')).toBe(true);
92
- expect(CHECKPOINT_ID_PATTERN.test('invalid')).toBe(false);
93
- });
94
- });
95
-
96
- describe('Token Usage', () => {
97
- it('should create empty token usage', () => {
98
- const usage = emptyTokenUsage();
99
- expect(usage.inputTokens).toBe(0);
100
- expect(usage.outputTokens).toBe(0);
101
- expect(usage.cacheCreationTokens).toBe(0);
102
- expect(usage.cacheReadTokens).toBe(0);
103
- expect(usage.apiCallCount).toBe(0);
104
- expect(usage.subagentTokens).toBeUndefined();
105
- });
106
-
107
- it('should add token usage', () => {
108
- const a = {
109
- inputTokens: 100,
110
- outputTokens: 50,
111
- cacheCreationTokens: 10,
112
- cacheReadTokens: 5,
113
- apiCallCount: 2,
114
- };
115
- const b = {
116
- inputTokens: 200,
117
- outputTokens: 100,
118
- cacheCreationTokens: 20,
119
- cacheReadTokens: 10,
120
- apiCallCount: 3,
121
- };
122
-
123
- const result = addTokenUsage(a, b);
124
- expect(result.inputTokens).toBe(300);
125
- expect(result.outputTokens).toBe(150);
126
- expect(result.cacheCreationTokens).toBe(30);
127
- expect(result.cacheReadTokens).toBe(15);
128
- expect(result.apiCallCount).toBe(5);
129
- });
130
-
131
- it('should handle subagent tokens in addition', () => {
132
- const a = {
133
- inputTokens: 100,
134
- outputTokens: 50,
135
- cacheCreationTokens: 0,
136
- cacheReadTokens: 0,
137
- apiCallCount: 1,
138
- subagentTokens: {
139
- inputTokens: 50,
140
- outputTokens: 25,
141
- cacheCreationTokens: 0,
142
- cacheReadTokens: 0,
143
- apiCallCount: 1,
144
- },
145
- };
146
- const b = {
147
- inputTokens: 100,
148
- outputTokens: 50,
149
- cacheCreationTokens: 0,
150
- cacheReadTokens: 0,
151
- apiCallCount: 1,
152
- };
153
-
154
- const result = addTokenUsage(a, b);
155
- expect(result.subagentTokens).toBeDefined();
156
- expect(result.subagentTokens!.inputTokens).toBe(50);
157
- });
158
-
159
- it('should return undefined subagent when neither has it', () => {
160
- const a = emptyTokenUsage();
161
- const b = emptyTokenUsage();
162
- const result = addTokenUsage(a, b);
163
- expect(result.subagentTokens).toBeUndefined();
164
- });
165
- });
166
- });
@@ -1,333 +0,0 @@
1
- /**
2
- * Tests for Utility Modules
3
- */
4
-
5
- import { describe, it, expect } from 'vitest';
6
- import {
7
- truncateRunes,
8
- collapseWhitespace,
9
- capitalizeFirst,
10
- countLines,
11
- } from '../utils/string-utils.js';
12
- import {
13
- parseFromBytes,
14
- parseFromBytesAtLine,
15
- sliceFromLine,
16
- extractUserContent,
17
- } from '../utils/transcript-parse.js';
18
- import { stripIDEContextTags } from '../utils/ide-tags.js';
19
- import { normalizeStoredPath } from '../utils/paths.js';
20
- import {
21
- parseCheckpoint,
22
- parseAllSessions,
23
- parseStrategy,
24
- formatStrategy,
25
- formatCheckpoint,
26
- formatShadowCommit,
27
- } from '../utils/trailers.js';
28
-
29
- describe('String Utils', () => {
30
- describe('truncateRunes', () => {
31
- it('should not truncate short strings', () => {
32
- expect(truncateRunes('hello', 10)).toBe('hello');
33
- });
34
-
35
- it('should truncate long strings with suffix', () => {
36
- expect(truncateRunes('hello world', 5)).toBe('hello...');
37
- });
38
-
39
- it('should use custom suffix', () => {
40
- expect(truncateRunes('hello world', 5, '…')).toBe('hello…');
41
- });
42
-
43
- it('should handle empty string', () => {
44
- expect(truncateRunes('', 5)).toBe('');
45
- });
46
-
47
- it('should handle multi-byte characters correctly', () => {
48
- const emoji = '😀😁😂🤣😃';
49
- expect(truncateRunes(emoji, 3)).toBe('😀😁😂...');
50
- });
51
- });
52
-
53
- describe('collapseWhitespace', () => {
54
- it('should collapse multiple spaces', () => {
55
- expect(collapseWhitespace('hello world')).toBe('hello world');
56
- });
57
-
58
- it('should collapse newlines', () => {
59
- expect(collapseWhitespace('hello\n\nworld')).toBe('hello world');
60
- });
61
-
62
- it('should trim', () => {
63
- expect(collapseWhitespace(' hello ')).toBe('hello');
64
- });
65
- });
66
-
67
- describe('capitalizeFirst', () => {
68
- it('should capitalize first letter', () => {
69
- expect(capitalizeFirst('hello')).toBe('Hello');
70
- });
71
-
72
- it('should handle empty string', () => {
73
- expect(capitalizeFirst('')).toBe('');
74
- });
75
- });
76
-
77
- describe('countLines', () => {
78
- it('should count 0 for empty', () => {
79
- expect(countLines('')).toBe(0);
80
- });
81
-
82
- it('should count 1 for no newline', () => {
83
- expect(countLines('hello')).toBe(1);
84
- });
85
-
86
- it('should count correctly with newlines', () => {
87
- expect(countLines('a\nb\nc\n')).toBe(3);
88
- });
89
-
90
- it('should count extra line without trailing newline', () => {
91
- expect(countLines('a\nb\nc')).toBe(3);
92
- });
93
- });
94
- });
95
-
96
- describe('Transcript Parse', () => {
97
- describe('parseFromBytes', () => {
98
- it('should parse JSONL content', () => {
99
- const jsonl = [
100
- JSON.stringify({ type: 'user', message: { content: 'Hello' } }),
101
- JSON.stringify({ type: 'assistant', message: { content: 'Hi' } }),
102
- ].join('\n');
103
-
104
- const lines = parseFromBytes(jsonl);
105
- expect(lines).toHaveLength(2);
106
- expect(lines[0].type).toBe('user');
107
- expect(lines[1].type).toBe('assistant');
108
- });
109
-
110
- it('should skip malformed JSON lines', () => {
111
- const input = '{"type":"user"}\nnot json\n{"type":"assistant"}\n';
112
- const lines = parseFromBytes(input);
113
- expect(lines).toHaveLength(2);
114
- });
115
-
116
- it('should handle buffer input', () => {
117
- const buf = Buffer.from('{"type":"user"}\n');
118
- const lines = parseFromBytes(buf);
119
- expect(lines).toHaveLength(1);
120
- });
121
-
122
- it('should normalize role to type (Cursor format)', () => {
123
- const input = JSON.stringify({ role: 'user', message: {} });
124
- const lines = parseFromBytes(input);
125
- expect(lines[0].type).toBe('user');
126
- });
127
- });
128
-
129
- describe('parseFromBytesAtLine', () => {
130
- it('should parse from a specific line', () => {
131
- const jsonl = [
132
- JSON.stringify({ type: 'user', message: { content: 'First' } }),
133
- JSON.stringify({ type: 'assistant', message: { content: 'Second' } }),
134
- JSON.stringify({ type: 'user', message: { content: 'Third' } }),
135
- ].join('\n');
136
-
137
- const lines = parseFromBytesAtLine(jsonl, 2);
138
- expect(lines).toHaveLength(1);
139
- expect(lines[0].type).toBe('user');
140
- });
141
- });
142
-
143
- describe('sliceFromLine', () => {
144
- it('should return full buffer for startLine 0', () => {
145
- const buf = Buffer.from('line0\nline1\nline2\n');
146
- const sliced = sliceFromLine(buf, 0);
147
- expect(sliced.toString()).toBe('line0\nline1\nline2\n');
148
- });
149
-
150
- it('should slice from line 1', () => {
151
- const buf = Buffer.from('line0\nline1\nline2\n');
152
- const sliced = sliceFromLine(buf, 1);
153
- expect(sliced.toString()).toBe('line1\nline2\n');
154
- });
155
-
156
- it('should slice from line 2', () => {
157
- const buf = Buffer.from('line0\nline1\nline2\n');
158
- const sliced = sliceFromLine(buf, 2);
159
- expect(sliced.toString()).toBe('line2\n');
160
- });
161
-
162
- it('should return empty for out-of-range', () => {
163
- const buf = Buffer.from('line0\nline1\n');
164
- const sliced = sliceFromLine(buf, 10);
165
- expect(sliced.length).toBe(0);
166
- });
167
-
168
- it('should handle empty buffer', () => {
169
- const sliced = sliceFromLine(Buffer.alloc(0), 0);
170
- expect(sliced.length).toBe(0);
171
- });
172
- });
173
-
174
- describe('extractUserContent', () => {
175
- it('should extract string content', () => {
176
- expect(extractUserContent({ content: 'Hello world' })).toBe('Hello world');
177
- });
178
-
179
- it('should extract array content', () => {
180
- const msg = {
181
- content: [
182
- { type: 'text', text: 'Part 1' },
183
- { type: 'image', data: 'base64' },
184
- { type: 'text', text: 'Part 2' },
185
- ],
186
- };
187
- expect(extractUserContent(msg)).toBe('Part 1\n\nPart 2');
188
- });
189
-
190
- it('should return empty for null', () => {
191
- expect(extractUserContent(null)).toBe('');
192
- });
193
-
194
- it('should strip IDE context tags', () => {
195
- const msg = { content: '<ide_opened_file>foo.ts</ide_opened_file>Hello' };
196
- const result = extractUserContent(msg);
197
- expect(result).not.toContain('ide_opened_file');
198
- expect(result).toContain('Hello');
199
- });
200
- });
201
- });
202
-
203
- describe('IDE Tags', () => {
204
- describe('stripIDEContextTags', () => {
205
- it('should strip ide_opened_file tags', () => {
206
- expect(stripIDEContextTags('<ide_opened_file>foo.ts</ide_opened_file>Code here')).toBe(
207
- 'Code here',
208
- );
209
- });
210
-
211
- it('should strip ide_selection tags', () => {
212
- expect(stripIDEContextTags('Text <ide_selection>selected</ide_selection> more')).toBe(
213
- 'Text more',
214
- );
215
- });
216
-
217
- it('should strip system-reminder tags', () => {
218
- expect(stripIDEContextTags('<system-reminder>stuff</system-reminder>Content')).toBe(
219
- 'Content',
220
- );
221
- });
222
-
223
- it('should strip user_query tags but keep content', () => {
224
- expect(stripIDEContextTags('<user_query>Hello world</user_query>')).toBe('Hello world');
225
- });
226
-
227
- it('should handle text without tags', () => {
228
- expect(stripIDEContextTags('Just normal text')).toBe('Just normal text');
229
- });
230
- });
231
- });
232
-
233
- describe('Trailers', () => {
234
- describe('parseCheckpoint', () => {
235
- it('should parse checkpoint from trailer', () => {
236
- const message = 'Some commit\n\nSessionlog-Checkpoint: abc123def456';
237
- const [cpID, found] = parseCheckpoint(message);
238
- expect(found).toBe(true);
239
- expect(cpID).toBe('abc123def456');
240
- });
241
-
242
- it('should return null for no checkpoint', () => {
243
- const [cpID, found] = parseCheckpoint('Simple commit message');
244
- expect(found).toBe(false);
245
- expect(cpID).toBeNull();
246
- });
247
- });
248
-
249
- describe('parseAllSessions', () => {
250
- it('should parse session IDs from trailers', () => {
251
- const message = 'Commit\n\nSessionlog-Session: session-1\nSessionlog-Session: session-2';
252
- const sessions = parseAllSessions(message);
253
- expect(sessions).toContain('session-1');
254
- expect(sessions).toContain('session-2');
255
- });
256
-
257
- it('should return empty for no sessions', () => {
258
- const sessions = parseAllSessions('Simple message');
259
- expect(sessions).toHaveLength(0);
260
- });
261
- });
262
-
263
- describe('parseStrategy', () => {
264
- it('should parse strategy from trailer', () => {
265
- const message = 'Commit\n\nSessionlog-Strategy: manual';
266
- const [strategy, found] = parseStrategy(message);
267
- expect(found).toBe(true);
268
- expect(strategy).toBe('manual');
269
- });
270
-
271
- it('should return empty for no strategy', () => {
272
- const [strategy, found] = parseStrategy('Simple message');
273
- expect(found).toBe(false);
274
- expect(strategy).toBe('');
275
- });
276
- });
277
-
278
- describe('format functions', () => {
279
- it('should format strategy trailer', () => {
280
- const result = formatStrategy('Fix bug', 'manual');
281
- expect(result).toContain('Fix bug');
282
- expect(result).toContain('Sessionlog-Strategy: manual');
283
- });
284
-
285
- it('should format checkpoint trailer', () => {
286
- const result = formatCheckpoint('Add feature', 'abc123def456' as any);
287
- expect(result).toContain('Add feature');
288
- expect(result).toContain('Sessionlog-Checkpoint: abc123def456');
289
- });
290
-
291
- it('should format shadow commit with session', () => {
292
- const result = formatShadowCommit('Update code', 'meta/dir', 'session-1');
293
- expect(result).toContain('Update code');
294
- expect(result).toContain('Sessionlog-Metadata: meta/dir');
295
- expect(result).toContain('Sessionlog-Session: session-1');
296
- expect(result).toContain('Sessionlog-Strategy: manual-commit');
297
- });
298
- });
299
- });
300
-
301
- describe('normalizeStoredPath', () => {
302
- const cwd = '/Users/alex/project';
303
-
304
- it('should make paths under CWD relative', () => {
305
- expect(normalizeStoredPath('/Users/alex/project/src/app.ts', cwd)).toBe('src/app.ts');
306
- });
307
-
308
- it('should keep paths outside CWD absolute', () => {
309
- expect(normalizeStoredPath('/Users/alex/.claude/plans/plan.md', cwd)).toBe(
310
- '/Users/alex/.claude/plans/plan.md',
311
- );
312
- });
313
-
314
- it('should return already-relative paths unchanged', () => {
315
- expect(normalizeStoredPath('src/app.ts', cwd)).toBe('src/app.ts');
316
- });
317
-
318
- it('should handle CWD root path', () => {
319
- expect(normalizeStoredPath('/Users/alex/project', cwd)).toBe('');
320
- });
321
-
322
- it('should handle paths with shared prefix but outside CWD', () => {
323
- expect(normalizeStoredPath('/Users/alex/project-other/file.ts', cwd)).toBe(
324
- '/Users/alex/project-other/file.ts',
325
- );
326
- });
327
-
328
- it('should handle deeply nested paths under CWD', () => {
329
- expect(normalizeStoredPath('/Users/alex/project/src/hooks/lifecycle.ts', cwd)).toBe(
330
- 'src/hooks/lifecycle.ts',
331
- );
332
- });
333
- });