ctxr-cli 0.1.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 (390) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +25 -0
  3. package/dist/adapter.d.ts +18 -0
  4. package/dist/adapter.d.ts.map +1 -0
  5. package/dist/adapter.js +4 -0
  6. package/dist/adapter.js.map +1 -0
  7. package/dist/adapters/builtin/index.d.ts +10 -0
  8. package/dist/adapters/builtin/index.d.ts.map +1 -0
  9. package/dist/adapters/builtin/index.js +11 -0
  10. package/dist/adapters/builtin/index.js.map +1 -0
  11. package/dist/adapters/forge/github.d.ts +9 -0
  12. package/dist/adapters/forge/github.d.ts.map +1 -0
  13. package/dist/adapters/forge/github.js +36 -0
  14. package/dist/adapters/forge/github.js.map +1 -0
  15. package/dist/adapters/forge/types.d.ts +23 -0
  16. package/dist/adapters/forge/types.d.ts.map +1 -0
  17. package/dist/adapters/forge/types.js +2 -0
  18. package/dist/adapters/forge/types.js.map +1 -0
  19. package/dist/adapters/harness/claude-code.d.ts +9 -0
  20. package/dist/adapters/harness/claude-code.d.ts.map +1 -0
  21. package/dist/adapters/harness/claude-code.js +42 -0
  22. package/dist/adapters/harness/claude-code.js.map +1 -0
  23. package/dist/adapters/identity/claude-code.d.ts +11 -0
  24. package/dist/adapters/identity/claude-code.d.ts.map +1 -0
  25. package/dist/adapters/identity/claude-code.js +18 -0
  26. package/dist/adapters/identity/claude-code.js.map +1 -0
  27. package/dist/adapters/registry.d.ts +16 -0
  28. package/dist/adapters/registry.d.ts.map +1 -0
  29. package/dist/adapters/registry.js +29 -0
  30. package/dist/adapters/registry.js.map +1 -0
  31. package/dist/adapters/types.d.ts +65 -0
  32. package/dist/adapters/types.d.ts.map +1 -0
  33. package/dist/adapters/types.js +12 -0
  34. package/dist/adapters/types.js.map +1 -0
  35. package/dist/bin.d.ts +3 -0
  36. package/dist/bin.d.ts.map +1 -0
  37. package/dist/bin.js +6 -0
  38. package/dist/bin.js.map +1 -0
  39. package/dist/commands/adapters-generate.d.ts +23 -0
  40. package/dist/commands/adapters-generate.d.ts.map +1 -0
  41. package/dist/commands/adapters-generate.js +59 -0
  42. package/dist/commands/adapters-generate.js.map +1 -0
  43. package/dist/commands/archive.d.ts +28 -0
  44. package/dist/commands/archive.d.ts.map +1 -0
  45. package/dist/commands/archive.js +66 -0
  46. package/dist/commands/archive.js.map +1 -0
  47. package/dist/commands/catalog-build.d.ts +7 -0
  48. package/dist/commands/catalog-build.d.ts.map +1 -0
  49. package/dist/commands/catalog-build.js +15 -0
  50. package/dist/commands/catalog-build.js.map +1 -0
  51. package/dist/commands/catalog-check.d.ts +22 -0
  52. package/dist/commands/catalog-check.d.ts.map +1 -0
  53. package/dist/commands/catalog-check.js +49 -0
  54. package/dist/commands/catalog-check.js.map +1 -0
  55. package/dist/commands/catalog-show.d.ts +13 -0
  56. package/dist/commands/catalog-show.d.ts.map +1 -0
  57. package/dist/commands/catalog-show.js +19 -0
  58. package/dist/commands/catalog-show.js.map +1 -0
  59. package/dist/commands/check.d.ts +22 -0
  60. package/dist/commands/check.d.ts.map +1 -0
  61. package/dist/commands/check.js +43 -0
  62. package/dist/commands/check.js.map +1 -0
  63. package/dist/commands/doctor.d.ts +27 -0
  64. package/dist/commands/doctor.d.ts.map +1 -0
  65. package/dist/commands/doctor.js +53 -0
  66. package/dist/commands/doctor.js.map +1 -0
  67. package/dist/commands/graph-build.d.ts +24 -0
  68. package/dist/commands/graph-build.d.ts.map +1 -0
  69. package/dist/commands/graph-build.js +36 -0
  70. package/dist/commands/graph-build.js.map +1 -0
  71. package/dist/commands/graph-query.d.ts +41 -0
  72. package/dist/commands/graph-query.d.ts.map +1 -0
  73. package/dist/commands/graph-query.js +63 -0
  74. package/dist/commands/graph-query.js.map +1 -0
  75. package/dist/commands/ingest.d.ts +28 -0
  76. package/dist/commands/ingest.d.ts.map +1 -0
  77. package/dist/commands/ingest.js +60 -0
  78. package/dist/commands/ingest.js.map +1 -0
  79. package/dist/commands/init.d.ts +28 -0
  80. package/dist/commands/init.d.ts.map +1 -0
  81. package/dist/commands/init.js +203 -0
  82. package/dist/commands/init.js.map +1 -0
  83. package/dist/commands/lint.d.ts +30 -0
  84. package/dist/commands/lint.d.ts.map +1 -0
  85. package/dist/commands/lint.js +48 -0
  86. package/dist/commands/lint.js.map +1 -0
  87. package/dist/commands/migrate.d.ts +30 -0
  88. package/dist/commands/migrate.d.ts.map +1 -0
  89. package/dist/commands/migrate.js +56 -0
  90. package/dist/commands/migrate.js.map +1 -0
  91. package/dist/commands/note-resolve.d.ts +14 -0
  92. package/dist/commands/note-resolve.d.ts.map +1 -0
  93. package/dist/commands/note-resolve.js +24 -0
  94. package/dist/commands/note-resolve.js.map +1 -0
  95. package/dist/commands/rollup-gather.d.ts +21 -0
  96. package/dist/commands/rollup-gather.d.ts.map +1 -0
  97. package/dist/commands/rollup-gather.js +40 -0
  98. package/dist/commands/rollup-gather.js.map +1 -0
  99. package/dist/commands/rollup-write.d.ts +25 -0
  100. package/dist/commands/rollup-write.d.ts.map +1 -0
  101. package/dist/commands/rollup-write.js +43 -0
  102. package/dist/commands/rollup-write.js.map +1 -0
  103. package/dist/commands/session-abandon.d.ts +13 -0
  104. package/dist/commands/session-abandon.d.ts.map +1 -0
  105. package/dist/commands/session-abandon.js +22 -0
  106. package/dist/commands/session-abandon.js.map +1 -0
  107. package/dist/commands/session-list.d.ts +14 -0
  108. package/dist/commands/session-list.d.ts.map +1 -0
  109. package/dist/commands/session-list.js +19 -0
  110. package/dist/commands/session-list.js.map +1 -0
  111. package/dist/commands/session-reap.d.ts +22 -0
  112. package/dist/commands/session-reap.d.ts.map +1 -0
  113. package/dist/commands/session-reap.js +47 -0
  114. package/dist/commands/session-reap.js.map +1 -0
  115. package/dist/commands/session-start.d.ts +18 -0
  116. package/dist/commands/session-start.d.ts.map +1 -0
  117. package/dist/commands/session-start.js +36 -0
  118. package/dist/commands/session-start.js.map +1 -0
  119. package/dist/commands/session-submit.d.ts +27 -0
  120. package/dist/commands/session-submit.d.ts.map +1 -0
  121. package/dist/commands/session-submit.js +68 -0
  122. package/dist/commands/session-submit.js.map +1 -0
  123. package/dist/commands/source-check.d.ts +21 -0
  124. package/dist/commands/source-check.d.ts.map +1 -0
  125. package/dist/commands/source-check.js +54 -0
  126. package/dist/commands/source-check.js.map +1 -0
  127. package/dist/commands/source-hash.d.ts +14 -0
  128. package/dist/commands/source-hash.d.ts.map +1 -0
  129. package/dist/commands/source-hash.js +34 -0
  130. package/dist/commands/source-hash.js.map +1 -0
  131. package/dist/commands/update.d.ts +17 -0
  132. package/dist/commands/update.d.ts.map +1 -0
  133. package/dist/commands/update.js +25 -0
  134. package/dist/commands/update.js.map +1 -0
  135. package/dist/commands/verify.d.ts +23 -0
  136. package/dist/commands/verify.d.ts.map +1 -0
  137. package/dist/commands/verify.js +126 -0
  138. package/dist/commands/verify.js.map +1 -0
  139. package/dist/config/defaults.d.ts +69 -0
  140. package/dist/config/defaults.d.ts.map +1 -0
  141. package/dist/config/defaults.js +71 -0
  142. package/dist/config/defaults.js.map +1 -0
  143. package/dist/config/load.d.ts +11 -0
  144. package/dist/config/load.d.ts.map +1 -0
  145. package/dist/config/load.js +49 -0
  146. package/dist/config/load.js.map +1 -0
  147. package/dist/config/render.d.ts +9 -0
  148. package/dist/config/render.d.ts.map +1 -0
  149. package/dist/config/render.js +15 -0
  150. package/dist/config/render.js.map +1 -0
  151. package/dist/config/schema.d.ts +124 -0
  152. package/dist/config/schema.d.ts.map +1 -0
  153. package/dist/config/schema.js +142 -0
  154. package/dist/config/schema.js.map +1 -0
  155. package/dist/core/agents-doc.d.ts +80 -0
  156. package/dist/core/agents-doc.d.ts.map +1 -0
  157. package/dist/core/agents-doc.js +207 -0
  158. package/dist/core/agents-doc.js.map +1 -0
  159. package/dist/core/catalog/build.d.ts +49 -0
  160. package/dist/core/catalog/build.d.ts.map +1 -0
  161. package/dist/core/catalog/build.js +113 -0
  162. package/dist/core/catalog/build.js.map +1 -0
  163. package/dist/core/catalog/model.d.ts +33 -0
  164. package/dist/core/catalog/model.d.ts.map +1 -0
  165. package/dist/core/catalog/model.js +58 -0
  166. package/dist/core/catalog/model.js.map +1 -0
  167. package/dist/core/checks/catalog-checks.d.ts +4 -0
  168. package/dist/core/checks/catalog-checks.d.ts.map +1 -0
  169. package/dist/core/checks/catalog-checks.js +65 -0
  170. package/dist/core/checks/catalog-checks.js.map +1 -0
  171. package/dist/core/checks/identity-checks.d.ts +11 -0
  172. package/dist/core/checks/identity-checks.d.ts.map +1 -0
  173. package/dist/core/checks/identity-checks.js +39 -0
  174. package/dist/core/checks/identity-checks.js.map +1 -0
  175. package/dist/core/checks/integrity-checks.d.ts +23 -0
  176. package/dist/core/checks/integrity-checks.d.ts.map +1 -0
  177. package/dist/core/checks/integrity-checks.js +132 -0
  178. package/dist/core/checks/integrity-checks.js.map +1 -0
  179. package/dist/core/checks/manifest.d.ts +7 -0
  180. package/dist/core/checks/manifest.d.ts.map +1 -0
  181. package/dist/core/checks/manifest.js +20 -0
  182. package/dist/core/checks/manifest.js.map +1 -0
  183. package/dist/core/checks/organize-checks.d.ts +18 -0
  184. package/dist/core/checks/organize-checks.d.ts.map +1 -0
  185. package/dist/core/checks/organize-checks.js +97 -0
  186. package/dist/core/checks/organize-checks.js.map +1 -0
  187. package/dist/core/checks/registry.d.ts +24 -0
  188. package/dist/core/checks/registry.d.ts.map +1 -0
  189. package/dist/core/checks/registry.js +33 -0
  190. package/dist/core/checks/registry.js.map +1 -0
  191. package/dist/core/checks/types.d.ts +72 -0
  192. package/dist/core/checks/types.d.ts.map +1 -0
  193. package/dist/core/checks/types.js +4 -0
  194. package/dist/core/checks/types.js.map +1 -0
  195. package/dist/core/checks/write-lifecycle-checks.d.ts +24 -0
  196. package/dist/core/checks/write-lifecycle-checks.d.ts.map +1 -0
  197. package/dist/core/checks/write-lifecycle-checks.js +205 -0
  198. package/dist/core/checks/write-lifecycle-checks.js.map +1 -0
  199. package/dist/core/command.d.ts +23 -0
  200. package/dist/core/command.d.ts.map +1 -0
  201. package/dist/core/command.js +2 -0
  202. package/dist/core/command.js.map +1 -0
  203. package/dist/core/content/canonicalize.d.ts +14 -0
  204. package/dist/core/content/canonicalize.d.ts.map +1 -0
  205. package/dist/core/content/canonicalize.js +34 -0
  206. package/dist/core/content/canonicalize.js.map +1 -0
  207. package/dist/core/conventions.d.ts +21 -0
  208. package/dist/core/conventions.d.ts.map +1 -0
  209. package/dist/core/conventions.js +73 -0
  210. package/dist/core/conventions.js.map +1 -0
  211. package/dist/core/disclosure/model.d.ts +18 -0
  212. package/dist/core/disclosure/model.d.ts.map +1 -0
  213. package/dist/core/disclosure/model.js +45 -0
  214. package/dist/core/disclosure/model.js.map +1 -0
  215. package/dist/core/env.d.ts +40 -0
  216. package/dist/core/env.d.ts.map +1 -0
  217. package/dist/core/env.js +24 -0
  218. package/dist/core/env.js.map +1 -0
  219. package/dist/core/envelope.d.ts +46 -0
  220. package/dist/core/envelope.d.ts.map +1 -0
  221. package/dist/core/envelope.js +21 -0
  222. package/dist/core/envelope.js.map +1 -0
  223. package/dist/core/errors.d.ts +96 -0
  224. package/dist/core/errors.d.ts.map +1 -0
  225. package/dist/core/errors.js +267 -0
  226. package/dist/core/errors.js.map +1 -0
  227. package/dist/core/exit-codes.d.ts +32 -0
  228. package/dist/core/exit-codes.d.ts.map +1 -0
  229. package/dist/core/exit-codes.js +31 -0
  230. package/dist/core/exit-codes.js.map +1 -0
  231. package/dist/core/fs/atomic.d.ts +10 -0
  232. package/dist/core/fs/atomic.d.ts.map +1 -0
  233. package/dist/core/fs/atomic.js +31 -0
  234. package/dist/core/fs/atomic.js.map +1 -0
  235. package/dist/core/fs/fenced-region.d.ts +47 -0
  236. package/dist/core/fs/fenced-region.d.ts.map +1 -0
  237. package/dist/core/fs/fenced-region.js +122 -0
  238. package/dist/core/fs/fenced-region.js.map +1 -0
  239. package/dist/core/git/exec.d.ts +28 -0
  240. package/dist/core/git/exec.d.ts.map +1 -0
  241. package/dist/core/git/exec.js +21 -0
  242. package/dist/core/git/exec.js.map +1 -0
  243. package/dist/core/git/repo.d.ts +63 -0
  244. package/dist/core/git/repo.d.ts.map +1 -0
  245. package/dist/core/git/repo.js +91 -0
  246. package/dist/core/git/repo.js.map +1 -0
  247. package/dist/core/git/staged.d.ts +10 -0
  248. package/dist/core/git/staged.d.ts.map +1 -0
  249. package/dist/core/git/staged.js +49 -0
  250. package/dist/core/git/staged.js.map +1 -0
  251. package/dist/core/git/worktree.d.ts +29 -0
  252. package/dist/core/git/worktree.d.ts.map +1 -0
  253. package/dist/core/git/worktree.js +61 -0
  254. package/dist/core/git/worktree.js.map +1 -0
  255. package/dist/core/graph/model.d.ts +43 -0
  256. package/dist/core/graph/model.d.ts.map +1 -0
  257. package/dist/core/graph/model.js +60 -0
  258. package/dist/core/graph/model.js.map +1 -0
  259. package/dist/core/graph/persist.d.ts +7 -0
  260. package/dist/core/graph/persist.d.ts.map +1 -0
  261. package/dist/core/graph/persist.js +23 -0
  262. package/dist/core/graph/persist.js.map +1 -0
  263. package/dist/core/graph/query.d.ts +16 -0
  264. package/dist/core/graph/query.d.ts.map +1 -0
  265. package/dist/core/graph/query.js +91 -0
  266. package/dist/core/graph/query.js.map +1 -0
  267. package/dist/core/graph/visibility-filter.d.ts +13 -0
  268. package/dist/core/graph/visibility-filter.d.ts.map +1 -0
  269. package/dist/core/graph/visibility-filter.js +26 -0
  270. package/dist/core/graph/visibility-filter.js.map +1 -0
  271. package/dist/core/hooks.d.ts +34 -0
  272. package/dist/core/hooks.d.ts.map +1 -0
  273. package/dist/core/hooks.js +89 -0
  274. package/dist/core/hooks.js.map +1 -0
  275. package/dist/core/identity.d.ts +14 -0
  276. package/dist/core/identity.d.ts.map +1 -0
  277. package/dist/core/identity.js +36 -0
  278. package/dist/core/identity.js.map +1 -0
  279. package/dist/core/ingest/identity.d.ts +15 -0
  280. package/dist/core/ingest/identity.d.ts.map +1 -0
  281. package/dist/core/ingest/identity.js +17 -0
  282. package/dist/core/ingest/identity.js.map +1 -0
  283. package/dist/core/ingest/model.d.ts +17 -0
  284. package/dist/core/ingest/model.d.ts.map +1 -0
  285. package/dist/core/ingest/model.js +24 -0
  286. package/dist/core/ingest/model.js.map +1 -0
  287. package/dist/core/json-config-merge.d.ts +13 -0
  288. package/dist/core/json-config-merge.d.ts.map +1 -0
  289. package/dist/core/json-config-merge.js +43 -0
  290. package/dist/core/json-config-merge.js.map +1 -0
  291. package/dist/core/markers.d.ts +17 -0
  292. package/dist/core/markers.d.ts.map +1 -0
  293. package/dist/core/markers.js +16 -0
  294. package/dist/core/markers.js.map +1 -0
  295. package/dist/core/migrations/registry.d.ts +6 -0
  296. package/dist/core/migrations/registry.d.ts.map +1 -0
  297. package/dist/core/migrations/registry.js +8 -0
  298. package/dist/core/migrations/registry.js.map +1 -0
  299. package/dist/core/migrations/rename-visibility-field.d.ts +3 -0
  300. package/dist/core/migrations/rename-visibility-field.d.ts.map +1 -0
  301. package/dist/core/migrations/rename-visibility-field.js +62 -0
  302. package/dist/core/migrations/rename-visibility-field.js.map +1 -0
  303. package/dist/core/migrations/types.d.ts +27 -0
  304. package/dist/core/migrations/types.d.ts.map +1 -0
  305. package/dist/core/migrations/types.js +2 -0
  306. package/dist/core/migrations/types.js.map +1 -0
  307. package/dist/core/notes/checks.d.ts +20 -0
  308. package/dist/core/notes/checks.d.ts.map +1 -0
  309. package/dist/core/notes/checks.js +58 -0
  310. package/dist/core/notes/checks.js.map +1 -0
  311. package/dist/core/notes/list.d.ts +26 -0
  312. package/dist/core/notes/list.d.ts.map +1 -0
  313. package/dist/core/notes/list.js +84 -0
  314. package/dist/core/notes/list.js.map +1 -0
  315. package/dist/core/notes/parse.d.ts +12 -0
  316. package/dist/core/notes/parse.d.ts.map +1 -0
  317. package/dist/core/notes/parse.js +36 -0
  318. package/dist/core/notes/parse.js.map +1 -0
  319. package/dist/core/notes/render.d.ts +7 -0
  320. package/dist/core/notes/render.d.ts.map +1 -0
  321. package/dist/core/notes/render.js +13 -0
  322. package/dist/core/notes/render.js.map +1 -0
  323. package/dist/core/notes/visibility.d.ts +26 -0
  324. package/dist/core/notes/visibility.d.ts.map +1 -0
  325. package/dist/core/notes/visibility.js +41 -0
  326. package/dist/core/notes/visibility.js.map +1 -0
  327. package/dist/core/procedures.d.ts +44 -0
  328. package/dist/core/procedures.d.ts.map +1 -0
  329. package/dist/core/procedures.js +154 -0
  330. package/dist/core/procedures.js.map +1 -0
  331. package/dist/core/queue.d.ts +16 -0
  332. package/dist/core/queue.d.ts.map +1 -0
  333. package/dist/core/queue.js +75 -0
  334. package/dist/core/queue.js.map +1 -0
  335. package/dist/core/reconcile.d.ts +18 -0
  336. package/dist/core/reconcile.d.ts.map +1 -0
  337. package/dist/core/reconcile.js +49 -0
  338. package/dist/core/reconcile.js.map +1 -0
  339. package/dist/core/records.d.ts +16 -0
  340. package/dist/core/records.d.ts.map +1 -0
  341. package/dist/core/records.js +36 -0
  342. package/dist/core/records.js.map +1 -0
  343. package/dist/core/reporter.d.ts +20 -0
  344. package/dist/core/reporter.d.ts.map +1 -0
  345. package/dist/core/reporter.js +25 -0
  346. package/dist/core/reporter.js.map +1 -0
  347. package/dist/core/root.d.ts +24 -0
  348. package/dist/core/root.d.ts.map +1 -0
  349. package/dist/core/root.js +51 -0
  350. package/dist/core/root.js.map +1 -0
  351. package/dist/core/security/secrets.d.ts +17 -0
  352. package/dist/core/security/secrets.d.ts.map +1 -0
  353. package/dist/core/security/secrets.js +21 -0
  354. package/dist/core/security/secrets.js.map +1 -0
  355. package/dist/core/session.d.ts +15 -0
  356. package/dist/core/session.d.ts.map +1 -0
  357. package/dist/core/session.js +27 -0
  358. package/dist/core/session.js.map +1 -0
  359. package/dist/core/store.d.ts +15 -0
  360. package/dist/core/store.d.ts.map +1 -0
  361. package/dist/core/store.js +19 -0
  362. package/dist/core/store.js.map +1 -0
  363. package/dist/index.d.ts +13 -0
  364. package/dist/index.d.ts.map +1 -0
  365. package/dist/index.js +7 -0
  366. package/dist/index.js.map +1 -0
  367. package/dist/prompt/inquirer-prompter.d.ts +14 -0
  368. package/dist/prompt/inquirer-prompter.d.ts.map +1 -0
  369. package/dist/prompt/inquirer-prompter.js +27 -0
  370. package/dist/prompt/inquirer-prompter.js.map +1 -0
  371. package/dist/prompt/prompter.d.ts +24 -0
  372. package/dist/prompt/prompter.d.ts.map +1 -0
  373. package/dist/prompt/prompter.js +2 -0
  374. package/dist/prompt/prompter.js.map +1 -0
  375. package/dist/run.d.ts +16 -0
  376. package/dist/run.d.ts.map +1 -0
  377. package/dist/run.js +464 -0
  378. package/dist/run.js.map +1 -0
  379. package/dist/taxonomy/profiles.d.ts +31 -0
  380. package/dist/taxonomy/profiles.d.ts.map +1 -0
  381. package/dist/taxonomy/profiles.js +45 -0
  382. package/dist/taxonomy/profiles.js.map +1 -0
  383. package/dist/version.d.ts +3 -0
  384. package/dist/version.d.ts.map +1 -0
  385. package/dist/version.js +3 -0
  386. package/dist/version.js.map +1 -0
  387. package/package.json +56 -0
  388. package/templates/.gitkeep +0 -0
  389. package/templates/hooks/pre-commit.sh +21 -0
  390. package/templates/hooks/pre-push.sh +24 -0
@@ -0,0 +1,13 @@
1
+ import type { Store } from '../store.js';
2
+ import type { GraphBuildResult } from './model.js';
3
+ /**
4
+ * context-visibility spec: "excluded... before that operation ranks,
5
+ * traverses, or otherwise processes results" — filtering the persisted
6
+ * graph down to only visible nodes BEFORE calling neighbors/shortestPath/
7
+ * hubs/orphans means an excluded note contributes no edges to any of them,
8
+ * not merely a post-hoc omission from the final list. A node with no
9
+ * corresponding current note (a stale graph entry) is excluded rather than
10
+ * included — visibility can't be resolved for it, so it fails closed.
11
+ */
12
+ export declare function filterGraphByAudience(store: Store, graph: GraphBuildResult, audience: string): Promise<GraphBuildResult>;
13
+ //# sourceMappingURL=visibility-filter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"visibility-filter.d.ts","sourceRoot":"","sources":["../../../src/core/graph/visibility-filter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAGnD;;;;;;;;GAQG;AACH,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,gBAAgB,EACvB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,gBAAgB,CAAC,CAa3B"}
@@ -0,0 +1,26 @@
1
+ import { listNotes } from '../notes/list.js';
2
+ import { canSee, resolveVisibility } from '../notes/visibility.js';
3
+ import { subgraph } from './query.js';
4
+ /**
5
+ * context-visibility spec: "excluded... before that operation ranks,
6
+ * traverses, or otherwise processes results" — filtering the persisted
7
+ * graph down to only visible nodes BEFORE calling neighbors/shortestPath/
8
+ * hubs/orphans means an excluded note contributes no edges to any of them,
9
+ * not merely a post-hoc omission from the final list. A node with no
10
+ * corresponding current note (a stale graph entry) is excluded rather than
11
+ * included — visibility can't be resolved for it, so it fails closed.
12
+ */
13
+ export async function filterGraphByAudience(store, graph, audience) {
14
+ const notes = await listNotes(store.root, store.config);
15
+ const byPath = new Map(notes.map((note) => [note.path, note]));
16
+ const visibleIds = graph.nodes
17
+ .filter((node) => {
18
+ const note = byPath.get(node.path);
19
+ if (!note)
20
+ return false;
21
+ return canSee(store.config, audience, resolveVisibility(store.config, note).value);
22
+ })
23
+ .map((node) => node.id);
24
+ return subgraph(graph, visibleIds);
25
+ }
26
+ //# sourceMappingURL=visibility-filter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"visibility-filter.js","sourceRoot":"","sources":["../../../src/core/graph/visibility-filter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAGnE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,KAAY,EACZ,KAAuB,EACvB,QAAgB;IAEhB,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACxD,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IAE/D,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK;SAC3B,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;QACf,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,CAAC,IAAI;YAAE,OAAO,KAAK,CAAC;QACxB,OAAO,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE,iBAAiB,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC;IACrF,CAAC,CAAC;SACD,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAE1B,OAAO,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;AACrC,CAAC"}
@@ -0,0 +1,34 @@
1
+ import type { GitRunner } from './git/exec.js';
2
+ /**
3
+ * Absolute path to THIS installation's built CLI entrypoint, baked into the
4
+ * generated hooks so they invoke the exact contexture that installed them —
5
+ * sidestepping the global/local/npx distribution question entirely. If this
6
+ * install is later replaced, `doctor`'s self-heal (below) regenerates the
7
+ * hook with the new path.
8
+ */
9
+ export declare function resolveOwnBinPath(): string;
10
+ export interface HookSpec {
11
+ fileName: 'pre-commit' | 'pre-push';
12
+ templateFileName: 'pre-commit.sh' | 'pre-push.sh';
13
+ }
14
+ export interface HookInstallResult {
15
+ /** Relative paths (from the store root) of hooks that were written or rewritten. */
16
+ changed: string[];
17
+ hooksDir: string;
18
+ }
19
+ /**
20
+ * Idempotent: a hook whose rendered content already matches what's on disk
21
+ * is left untouched (no rewrite, no mtime churn), matching every other
22
+ * generated-region writer in the system.
23
+ */
24
+ export declare function installHooks(root: string, defaultBranch: string): Promise<HookInstallResult>;
25
+ export declare function configureHooksPath(git: GitRunner, cwd: string): Promise<void>;
26
+ export declare function getConfiguredHooksPath(git: GitRunner, cwd: string): Promise<string | undefined>;
27
+ /**
28
+ * doctor's hook-health check: are both hooks present with up-to-date
29
+ * content? (Whether core.hooksPath actually points at them is a separate,
30
+ * git-config-dependent question — see getConfiguredHooksPath.) Detection
31
+ * only; the check definition (checks/hooks.ts) decides whether to self-heal.
32
+ */
33
+ export declare function detectStaleHooks(root: string, defaultBranch: string): Promise<string[]>;
34
+ //# sourceMappingURL=hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/core/hooks.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE/C;;;;;;GAMG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAQD,MAAM,WAAW,QAAQ;IACvB,QAAQ,EAAE,YAAY,GAAG,UAAU,CAAC;IACpC,gBAAgB,EAAE,eAAe,GAAG,aAAa,CAAC;CACnD;AAcD,MAAM,WAAW,iBAAiB;IAChC,oFAAoF;IACpF,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAsBlG;AAED,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEnF;AAED,wBAAsB,sBAAsB,CAAC,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAKrG;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAc7F"}
@@ -0,0 +1,89 @@
1
+ import { chmod, mkdir, readFile } from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
4
+ import { writeFileAtomic } from './fs/atomic.js';
5
+ /**
6
+ * Absolute path to THIS installation's built CLI entrypoint, baked into the
7
+ * generated hooks so they invoke the exact contexture that installed them —
8
+ * sidestepping the global/local/npx distribution question entirely. If this
9
+ * install is later replaced, `doctor`'s self-heal (below) regenerates the
10
+ * hook with the new path.
11
+ */
12
+ export function resolveOwnBinPath() {
13
+ return fileURLToPath(new URL('../bin.js', import.meta.url));
14
+ }
15
+ function templatesDir() {
16
+ return fileURLToPath(new URL('../../templates/hooks', import.meta.url));
17
+ }
18
+ const HOOKS_DIR_NAME = '.githooks';
19
+ const HOOK_SPECS = [
20
+ { fileName: 'pre-commit', templateFileName: 'pre-commit.sh' },
21
+ { fileName: 'pre-push', templateFileName: 'pre-push.sh' },
22
+ ];
23
+ async function renderHook(spec, defaultBranch) {
24
+ const templateText = await readFile(path.join(templatesDir(), spec.templateFileName), 'utf8');
25
+ return templateText
26
+ .replaceAll('__CONTEXTURE_BIN__', resolveOwnBinPath())
27
+ .replaceAll('__DEFAULT_BRANCH__', defaultBranch);
28
+ }
29
+ /**
30
+ * Idempotent: a hook whose rendered content already matches what's on disk
31
+ * is left untouched (no rewrite, no mtime churn), matching every other
32
+ * generated-region writer in the system.
33
+ */
34
+ export async function installHooks(root, defaultBranch) {
35
+ const hooksDir = path.join(root, HOOKS_DIR_NAME);
36
+ await mkdir(hooksDir, { recursive: true });
37
+ const changed = [];
38
+ for (const spec of HOOK_SPECS) {
39
+ const rendered = await renderHook(spec, defaultBranch);
40
+ const targetPath = path.join(hooksDir, spec.fileName);
41
+ let existing;
42
+ try {
43
+ existing = await readFile(targetPath, 'utf8');
44
+ }
45
+ catch {
46
+ existing = undefined;
47
+ }
48
+ if (existing !== rendered) {
49
+ await writeFileAtomic(targetPath, rendered);
50
+ await chmod(targetPath, 0o755);
51
+ changed.push(`${HOOKS_DIR_NAME}/${spec.fileName}`);
52
+ }
53
+ }
54
+ return { changed, hooksDir };
55
+ }
56
+ export async function configureHooksPath(git, cwd) {
57
+ await git.run(['config', 'core.hooksPath', HOOKS_DIR_NAME], { cwd });
58
+ }
59
+ export async function getConfiguredHooksPath(git, cwd) {
60
+ const result = await git.run(['config', 'core.hooksPath'], { cwd, allowFailure: true });
61
+ if (result.exitCode !== 0)
62
+ return undefined;
63
+ const value = result.stdout.trim();
64
+ return value.length > 0 ? value : undefined;
65
+ }
66
+ /**
67
+ * doctor's hook-health check: are both hooks present with up-to-date
68
+ * content? (Whether core.hooksPath actually points at them is a separate,
69
+ * git-config-dependent question — see getConfiguredHooksPath.) Detection
70
+ * only; the check definition (checks/hooks.ts) decides whether to self-heal.
71
+ */
72
+ export async function detectStaleHooks(root, defaultBranch) {
73
+ const stale = [];
74
+ for (const spec of HOOK_SPECS) {
75
+ const rendered = await renderHook(spec, defaultBranch);
76
+ const targetPath = path.join(root, HOOKS_DIR_NAME, spec.fileName);
77
+ let existing;
78
+ try {
79
+ existing = await readFile(targetPath, 'utf8');
80
+ }
81
+ catch {
82
+ existing = undefined;
83
+ }
84
+ if (existing !== rendered)
85
+ stale.push(`${HOOKS_DIR_NAME}/${spec.fileName}`);
86
+ }
87
+ return stale;
88
+ }
89
+ //# sourceMappingURL=hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/core/hooks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { StoreConfig } from '../config/schema.js';
2
+ /**
3
+ * agent-identity spec: three canonical, harness-neutral files — posture,
4
+ * durable world facts, durable user facts — kept distinct from retrievable
5
+ * knowledge (excluded from every retrieval leg via config.identity.path
6
+ * being a member of config.retrieval.exclude_paths). A harness's own
7
+ * identity-injection adapter decides how these reach a running agent; core
8
+ * never reads their content itself.
9
+ */
10
+ export declare const IDENTITY_FILES: readonly ['posture.md', 'world-facts.md', 'user-facts.md'];
11
+ export declare function identityFilePaths(config: StoreConfig): string[];
12
+ /** Creates any of the three canonical identity files that don't exist yet — never overwrites an existing one. */
13
+ export declare function ensureIdentityFiles(root: string, config: StoreConfig): Promise<string[]>;
14
+ //# sourceMappingURL=identity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../../src/core/identity.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAGvD;;;;;;;GAOG;AACH,eAAO,MAAM,cAAc,YAAI,YAAY,EAAE,gBAAgB,EAAE,eAAe,CAAU,CAAC;AAQzF,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,EAAE,CAE/D;AAED,iHAAiH;AACjH,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAY9F"}
@@ -0,0 +1,36 @@
1
+ import { existsSync } from 'node:fs';
2
+ import { mkdir } from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ import { writeFileAtomic } from './fs/atomic.js';
5
+ /**
6
+ * agent-identity spec: three canonical, harness-neutral files — posture,
7
+ * durable world facts, durable user facts — kept distinct from retrievable
8
+ * knowledge (excluded from every retrieval leg via config.identity.path
9
+ * being a member of config.retrieval.exclude_paths). A harness's own
10
+ * identity-injection adapter decides how these reach a running agent; core
11
+ * never reads their content itself.
12
+ */
13
+ export const IDENTITY_FILES = ['posture.md', 'world-facts.md', 'user-facts.md'];
14
+ const TEMPLATES = {
15
+ 'posture.md': '# Agent posture\n\nHow an agent should approach work in this store: tone, defaults, things to always or never do.\n',
16
+ 'world-facts.md': '# Durable world facts\n\nFacts about the world (not the user) worth carrying into every session.\n',
17
+ 'user-facts.md': '# Durable user facts\n\nFacts about the user worth carrying into every session.\n',
18
+ };
19
+ export function identityFilePaths(config) {
20
+ return IDENTITY_FILES.map((name) => path.join(config.identity.path, name).split(path.sep).join('/'));
21
+ }
22
+ /** Creates any of the three canonical identity files that don't exist yet — never overwrites an existing one. */
23
+ export async function ensureIdentityFiles(root, config) {
24
+ const created = [];
25
+ for (const name of IDENTITY_FILES) {
26
+ const relativePath = path.join(config.identity.path, name).split(path.sep).join('/');
27
+ const absolutePath = path.join(root, relativePath);
28
+ if (!existsSync(absolutePath)) {
29
+ await mkdir(path.dirname(absolutePath), { recursive: true });
30
+ await writeFileAtomic(absolutePath, TEMPLATES[name]);
31
+ created.push(relativePath);
32
+ }
33
+ }
34
+ return created;
35
+ }
36
+ //# sourceMappingURL=identity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity.js","sourceRoot":"","sources":["../../src/core/identity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEjD;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,YAAY,EAAE,gBAAgB,EAAE,eAAe,CAAU,CAAC;AAEzF,MAAM,SAAS,GAAoD;IACjE,YAAY,EAAE,qHAAqH;IACnI,gBAAgB,EAAE,oGAAoG;IACtH,eAAe,EAAE,mFAAmF;CACrG,CAAC;AAEF,MAAM,UAAU,iBAAiB,CAAC,MAAmB;IACnD,OAAO,cAAc,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AACvG,CAAC;AAED,iHAAiH;AACjH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,IAAY,EAAE,MAAmB;IACzE,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE,CAAC;QAClC,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACrF,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QACnD,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YAC9B,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC7D,MAAM,eAAe,CAAC,YAAY,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;YACrD,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { Note } from '../notes/list.js';
2
+ /**
3
+ * context-ingest spec: "source type, source id, source hash, ingested
4
+ * date" — assigned once, at ingest, never before. Like disclosure's
5
+ * `audience` field, nothing asks these keys to be configurable, so they
6
+ * live here as the one set of literals every ingest-related module reads
7
+ * from, rather than each spelling out its own string.
8
+ */
9
+ export declare const SOURCE_TYPE_FIELD = "source_type";
10
+ export declare const SOURCE_ID_FIELD = "source_id";
11
+ export declare const SOURCE_HASH_FIELD = "source_hash";
12
+ export declare const INGESTED_FIELD = "ingested";
13
+ /** Whether a note already carries any source-identity field — a re-ingest guard, and capture's own invariant. */
14
+ export declare function hasSourceIdentity(note: Pick<Note, 'frontmatter'>): boolean;
15
+ //# sourceMappingURL=identity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../../../src/core/ingest/identity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAE7C;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB,gBAAgB,CAAC;AAC/C,eAAO,MAAM,eAAe,cAAc,CAAC;AAC3C,eAAO,MAAM,iBAAiB,gBAAgB,CAAC;AAC/C,eAAO,MAAM,cAAc,aAAa,CAAC;AAIzC,iHAAiH;AACjH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC,GAAG,OAAO,CAE1E"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * context-ingest spec: "source type, source id, source hash, ingested
3
+ * date" — assigned once, at ingest, never before. Like disclosure's
4
+ * `audience` field, nothing asks these keys to be configurable, so they
5
+ * live here as the one set of literals every ingest-related module reads
6
+ * from, rather than each spelling out its own string.
7
+ */
8
+ export const SOURCE_TYPE_FIELD = 'source_type';
9
+ export const SOURCE_ID_FIELD = 'source_id';
10
+ export const SOURCE_HASH_FIELD = 'source_hash';
11
+ export const INGESTED_FIELD = 'ingested';
12
+ const IDENTITY_FIELDS = [SOURCE_TYPE_FIELD, SOURCE_ID_FIELD, SOURCE_HASH_FIELD, INGESTED_FIELD];
13
+ /** Whether a note already carries any source-identity field — a re-ingest guard, and capture's own invariant. */
14
+ export function hasSourceIdentity(note) {
15
+ return IDENTITY_FIELDS.some((field) => note.frontmatter?.[field] !== undefined);
16
+ }
17
+ //# sourceMappingURL=identity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity.js","sourceRoot":"","sources":["../../../src/core/ingest/identity.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,aAAa,CAAC;AAC/C,MAAM,CAAC,MAAM,eAAe,GAAG,WAAW,CAAC;AAC3C,MAAM,CAAC,MAAM,iBAAiB,GAAG,aAAa,CAAC;AAC/C,MAAM,CAAC,MAAM,cAAc,GAAG,UAAU,CAAC;AAEzC,MAAM,eAAe,GAAG,CAAC,iBAAiB,EAAE,eAAe,EAAE,iBAAiB,EAAE,cAAc,CAAU,CAAC;AAEzG,iHAAiH;AACjH,MAAM,UAAU,iBAAiB,CAAC,IAA+B;IAC/D,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,KAAK,SAAS,CAAC,CAAC;AAClF,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { Note } from '../notes/list.js';
2
+ export type SourceCheckVerdict = 'new' | 'already_ingested' | 'alternate_source_match' | 'multiple_matches';
3
+ export interface SourceCheckResult {
4
+ verdict: SourceCheckVerdict;
5
+ /** The stage that produced the verdict, when a match stage was reached at all. */
6
+ stage?: 'source_id' | 'content_hash';
7
+ /** Paths of every matching note, in the stage that decided the verdict. */
8
+ matches: string[];
9
+ hash: string;
10
+ }
11
+ /**
12
+ * context-ingest spec: two-stage content-addressed dedupe, evaluated in
13
+ * order, stopping (and reporting `multiple_matches` rather than guessing)
14
+ * the moment either stage finds more than one match.
15
+ */
16
+ export declare function evaluateSourceCheck(notes: readonly Note[], candidateHash: string, sourceId: string): SourceCheckResult;
17
+ //# sourceMappingURL=model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../../src/core/ingest/model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAG7C,MAAM,MAAM,kBAAkB,GAAG,KAAK,GAAG,kBAAkB,GAAG,wBAAwB,GAAG,kBAAkB,CAAC;AAE5G,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,kBAAkB,CAAC;IAC5B,kFAAkF;IAClF,KAAK,CAAC,EAAE,WAAW,GAAG,cAAc,CAAC;IACrC,2EAA2E;IAC3E,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,EAAE,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,iBAAiB,CAkBtH"}
@@ -0,0 +1,24 @@
1
+ import { SOURCE_HASH_FIELD, SOURCE_ID_FIELD } from './identity.js';
2
+ /**
3
+ * context-ingest spec: two-stage content-addressed dedupe, evaluated in
4
+ * order, stopping (and reporting `multiple_matches` rather than guessing)
5
+ * the moment either stage finds more than one match.
6
+ */
7
+ export function evaluateSourceCheck(notes, candidateHash, sourceId) {
8
+ const idMatches = notes.filter((n) => n.frontmatter?.[SOURCE_ID_FIELD] === sourceId).map((n) => n.path);
9
+ if (idMatches.length > 1) {
10
+ return { verdict: 'multiple_matches', stage: 'source_id', matches: idMatches, hash: candidateHash };
11
+ }
12
+ if (idMatches.length === 1) {
13
+ return { verdict: 'already_ingested', stage: 'source_id', matches: idMatches, hash: candidateHash };
14
+ }
15
+ const hashMatches = notes.filter((n) => n.frontmatter?.[SOURCE_HASH_FIELD] === candidateHash).map((n) => n.path);
16
+ if (hashMatches.length > 1) {
17
+ return { verdict: 'multiple_matches', stage: 'content_hash', matches: hashMatches, hash: candidateHash };
18
+ }
19
+ if (hashMatches.length === 1) {
20
+ return { verdict: 'alternate_source_match', stage: 'content_hash', matches: hashMatches, hash: candidateHash };
21
+ }
22
+ return { verdict: 'new', matches: [], hash: candidateHash };
23
+ }
24
+ //# sourceMappingURL=model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.js","sourceRoot":"","sources":["../../../src/core/ingest/model.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAanE;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAsB,EAAE,aAAqB,EAAE,QAAgB;IACjG,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,eAAe,CAAC,KAAK,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACxG,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,OAAO,EAAE,OAAO,EAAE,kBAAkB,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;IACtG,CAAC;IACD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,OAAO,EAAE,kBAAkB,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;IACtG,CAAC;IAED,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,iBAAiB,CAAC,KAAK,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACjH,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,OAAO,EAAE,kBAAkB,EAAE,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;IAC3G,CAAC;IACD,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,EAAE,OAAO,EAAE,wBAAwB,EAAE,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;IACjH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;AAC9D,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * A structured-JSON counterpart to the marker-fenced text writer (context-
3
+ * store spec's generated-region convention): JSON has no comment syntax to
4
+ * carry a fence marker in, so a harness permission config (task 8.4) is
5
+ * merged by array union instead — contexture's own rules are appended only
6
+ * if not already present, so a hand-added rule survives untouched and a
7
+ * second run with the same rule set is a true no-op (byte-identical file,
8
+ * no write at all).
9
+ */
10
+ export declare function mergeJsonArrayLists(filePath: string, patch: Readonly<Record<string, Readonly<Record<string, readonly string[]>>>>): Promise<{
11
+ changed: boolean;
12
+ }>;
13
+ //# sourceMappingURL=json-config-merge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-config-merge.d.ts","sourceRoot":"","sources":["../../src/core/json-config-merge.ts"],"names":[],"mappings":"AAKA;;;;;;;;GAQG;AACH,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,GAC3E,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CA8B/B"}
@@ -0,0 +1,43 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import { mkdir } from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ import { writeFileAtomic } from './fs/atomic.js';
5
+ /**
6
+ * A structured-JSON counterpart to the marker-fenced text writer (context-
7
+ * store spec's generated-region convention): JSON has no comment syntax to
8
+ * carry a fence marker in, so a harness permission config (task 8.4) is
9
+ * merged by array union instead — contexture's own rules are appended only
10
+ * if not already present, so a hand-added rule survives untouched and a
11
+ * second run with the same rule set is a true no-op (byte-identical file,
12
+ * no write at all).
13
+ */
14
+ export async function mergeJsonArrayLists(filePath, patch) {
15
+ let existing = {};
16
+ try {
17
+ existing = JSON.parse(await readFile(filePath, 'utf8'));
18
+ }
19
+ catch (err) {
20
+ if (err.code !== 'ENOENT')
21
+ throw err;
22
+ }
23
+ const before = JSON.stringify(existing);
24
+ const merged = { ...existing };
25
+ for (const [topKey, sections] of Object.entries(patch)) {
26
+ const existingTop = merged[topKey] ?? {};
27
+ const mergedTop = { ...existingTop };
28
+ for (const [listKey, newValues] of Object.entries(sections)) {
29
+ const existingList = Array.isArray(existingTop[listKey]) ? existingTop[listKey] : [];
30
+ const additions = newValues.filter((v) => !existingList.includes(v));
31
+ mergedTop[listKey] = [...existingList, ...additions];
32
+ }
33
+ merged[topKey] = mergedTop;
34
+ }
35
+ const after = JSON.stringify(merged);
36
+ if (after === before) {
37
+ return { changed: false };
38
+ }
39
+ await mkdir(path.dirname(filePath), { recursive: true });
40
+ await writeFileAtomic(filePath, `${JSON.stringify(merged, null, 2)}\n`);
41
+ return { changed: true };
42
+ }
43
+ //# sourceMappingURL=json-config-merge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-config-merge.js","sourceRoot":"","sources":["../../src/core/json-config-merge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEjD;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,QAAgB,EAChB,KAA4E;IAE5E,IAAI,QAAQ,GAA4B,EAAE,CAAC;IAC3C,IAAI,CAAC;QACH,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAA4B,CAAC;IACrF,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ;YAAE,MAAM,GAAG,CAAC;IAClE,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IACxC,MAAM,MAAM,GAA4B,EAAE,GAAG,QAAQ,EAAE,CAAC;IAExD,KAAK,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACvD,MAAM,WAAW,GAAI,MAAM,CAAC,MAAM,CAAyC,IAAI,EAAE,CAAC;QAClF,MAAM,SAAS,GAA4B,EAAE,GAAG,WAAW,EAAE,CAAC;QAC9D,KAAK,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5D,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAE,WAAW,CAAC,OAAO,CAAc,CAAC,CAAC,CAAC,EAAE,CAAC;YACnG,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;YACrE,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,YAAY,EAAE,GAAG,SAAS,CAAC,CAAC;QACvD,CAAC;QACD,MAAM,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC;IAC7B,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACrC,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;QACrB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC5B,CAAC;IAED,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzD,MAAM,eAAe,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;IACxE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC3B,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Marker strings for contexture's generated-region convention (context-store
3
+ * spec: "Marker-fenced generated regions"). Once shipped, marker text is a
4
+ * FOREVER compatibility surface — changing it orphans every existing store's
5
+ * fenced blocks — so it lives in exactly this one file, parameterized by
6
+ * region name, and is never inlined at a call site.
7
+ */
8
+ export interface Fence {
9
+ start: string;
10
+ end: string;
11
+ }
12
+ /** `#`-comment-style fence, used by `.gitignore` in Phase 0. */
13
+ export declare function commentFence(regionName: string): Fence;
14
+ export declare const DERIVED_GITIGNORE_FENCE: Fence;
15
+ /** HTML-comment-style fence, used by markdown files (catalog sections, notes) so the markers render sensibly. */
16
+ export declare function htmlCommentFence(regionName: string): Fence;
17
+ //# sourceMappingURL=markers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markers.d.ts","sourceRoot":"","sources":["../../src/core/markers.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,WAAW,KAAK;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AAED,gEAAgE;AAChE,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,KAAK,CAKtD;AAED,eAAO,MAAM,uBAAuB,EAAE,KAA+B,CAAC;AAEtE,iHAAiH;AACjH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,KAAK,CAK1D"}
@@ -0,0 +1,16 @@
1
+ /** `#`-comment-style fence, used by `.gitignore` in Phase 0. */
2
+ export function commentFence(regionName) {
3
+ return {
4
+ start: `# >>> contexture:${regionName} (managed — do not edit) >>>`,
5
+ end: `# <<< contexture:${regionName} <<<`,
6
+ };
7
+ }
8
+ export const DERIVED_GITIGNORE_FENCE = commentFence('derived');
9
+ /** HTML-comment-style fence, used by markdown files (catalog sections, notes) so the markers render sensibly. */
10
+ export function htmlCommentFence(regionName) {
11
+ return {
12
+ start: `<!-- >>> contexture:${regionName} (managed — do not edit) >>> -->`,
13
+ end: `<!-- <<< contexture:${regionName} <<< -->`,
14
+ };
15
+ }
16
+ //# sourceMappingURL=markers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markers.js","sourceRoot":"","sources":["../../src/core/markers.ts"],"names":[],"mappings":"AAYA,gEAAgE;AAChE,MAAM,UAAU,YAAY,CAAC,UAAkB;IAC7C,OAAO;QACL,KAAK,EAAE,oBAAoB,UAAU,8BAA8B;QACnE,GAAG,EAAE,oBAAoB,UAAU,MAAM;KAC1C,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,uBAAuB,GAAU,YAAY,CAAC,SAAS,CAAC,CAAC;AAEtE,iHAAiH;AACjH,MAAM,UAAU,gBAAgB,CAAC,UAAkB;IACjD,OAAO;QACL,KAAK,EAAE,uBAAuB,UAAU,kCAAkC;QAC1E,GAAG,EAAE,uBAAuB,UAAU,UAAU;KACjD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { Migration } from './types.js';
2
+ /** Every migration contexture ships, in ascending fromVersion order. Later phases append here, nothing else. */
3
+ export declare const MIGRATIONS: readonly Migration[];
4
+ /** Every migration a store currently at `fromVersion` still needs to reach the CLI's supported version, in order. */
5
+ export declare function pendingMigrations(fromVersion: number): Migration[];
6
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/core/migrations/registry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,gHAAgH;AAChH,eAAO,MAAM,UAAU,EAAE,SAAS,SAAS,EAAqC,CAAC;AAEjF,qHAAqH;AACrH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,EAAE,CAElE"}
@@ -0,0 +1,8 @@
1
+ import { renameVisibilityFieldMigration } from './rename-visibility-field.js';
2
+ /** Every migration contexture ships, in ascending fromVersion order. Later phases append here, nothing else. */
3
+ export const MIGRATIONS = [renameVisibilityFieldMigration];
4
+ /** Every migration a store currently at `fromVersion` still needs to reach the CLI's supported version, in order. */
5
+ export function pendingMigrations(fromVersion) {
6
+ return MIGRATIONS.filter((m) => m.fromVersion >= fromVersion).slice().sort((a, b) => a.fromVersion - b.fromVersion);
7
+ }
8
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/core/migrations/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,8BAA8B,EAAE,MAAM,8BAA8B,CAAC;AAG9E,gHAAgH;AAChH,MAAM,CAAC,MAAM,UAAU,GAAyB,CAAC,8BAA8B,CAAC,CAAC;AAEjF,qHAAqH;AACrH,MAAM,UAAU,iBAAiB,CAAC,WAAmB;IACnD,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,IAAI,WAAW,CAAC,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC;AACtH,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Migration } from './types.js';
2
+ export declare const renameVisibilityFieldMigration: Migration;
3
+ //# sourceMappingURL=rename-visibility-field.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rename-visibility-field.d.ts","sourceRoot":"","sources":["../../../src/core/migrations/rename-visibility-field.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,SAAS,EAAkB,MAAM,YAAY,CAAC;AAsB5D,eAAO,MAAM,8BAA8B,EAAE,SAuC5C,CAAC"}
@@ -0,0 +1,62 @@
1
+ import path from 'node:path';
2
+ import { DEFAULT_VISIBILITY_FIELD_KEY, SCHEMA_V1_VISIBILITY_FIELD_KEY } from '../../config/defaults.js';
3
+ import { readConfig } from '../../config/load.js';
4
+ import { renderStoreConfig } from '../../config/render.js';
5
+ import { writeFileAtomic } from '../fs/atomic.js';
6
+ import { listNotes } from '../notes/list.js';
7
+ import { parseNote } from '../notes/parse.js';
8
+ import { renderNoteText } from '../notes/render.js';
9
+ const OLD_KEY = SCHEMA_V1_VISIBILITY_FIELD_KEY;
10
+ const NEW_KEY = DEFAULT_VISIBILITY_FIELD_KEY;
11
+ /**
12
+ * store-lifecycle spec (task 9.2): the concrete migration proving the
13
+ * naming-inoculation design holds. The key to search for is the FIXED
14
+ * historical literal (OLD_KEY), never `store.config.fields.visibility` —
15
+ * that field is exactly what apply()'s own last step changes, so deriving
16
+ * "what to look for" from it would make a resumed run, on a store whose
17
+ * config was already bumped but whose notes weren't all done yet,
18
+ * incorrectly treat the (already-correct) new key as something to rename
19
+ * away from. A per-note check is "done" precisely when OLD_KEY is gone
20
+ * from its frontmatter — true whether it was never present or already
21
+ * renamed, which is what makes a re-run naturally skip completed work.
22
+ */
23
+ async function pendingNoteRenames(store) {
24
+ const notes = await listNotes(store.root, store.config);
25
+ return notes.filter((note) => note.frontmatter?.[OLD_KEY] !== undefined).map((note) => note.path);
26
+ }
27
+ export const renameVisibilityFieldMigration = {
28
+ id: '0002-rename-visibility-field-to-lens',
29
+ fromVersion: 1,
30
+ toVersion: 2,
31
+ description: `Rename the visibility frontmatter field from "${OLD_KEY}" to "${NEW_KEY}", on every note and in contexture.yaml.`,
32
+ async plan(store) {
33
+ const deltas = (await pendingNoteRenames(store)).map((notePath) => ({
34
+ path: notePath,
35
+ description: `rename frontmatter field "${OLD_KEY}" to "${NEW_KEY}"`,
36
+ }));
37
+ if (store.config.fields.visibility !== NEW_KEY || store.config.schema_version < 2) {
38
+ deltas.push({ path: 'contexture.yaml', description: `set fields.visibility to "${NEW_KEY}" and schema_version to 2` });
39
+ }
40
+ return deltas;
41
+ },
42
+ async apply(store) {
43
+ const applied = [];
44
+ for (const notePath of await pendingNoteRenames(store)) {
45
+ const absolutePath = path.join(store.root, notePath);
46
+ const note = await parseNote(absolutePath, notePath);
47
+ const { [OLD_KEY]: value, ...rest } = note.frontmatter ?? {};
48
+ const frontmatter = { ...rest, [NEW_KEY]: value };
49
+ await writeFileAtomic(absolutePath, renderNoteText(frontmatter, note.body));
50
+ applied.push({ path: notePath, description: `renamed frontmatter field "${OLD_KEY}" to "${NEW_KEY}"` });
51
+ }
52
+ const configPath = path.join(store.root, 'contexture.yaml');
53
+ const currentConfig = await readConfig(store.root);
54
+ if (currentConfig.fields.visibility !== NEW_KEY || currentConfig.schema_version < 2) {
55
+ const nextConfig = { ...currentConfig, fields: { ...currentConfig.fields, visibility: NEW_KEY }, schema_version: 2 };
56
+ await writeFileAtomic(configPath, renderStoreConfig(nextConfig));
57
+ applied.push({ path: 'contexture.yaml', description: `set fields.visibility to "${NEW_KEY}" and schema_version to 2` });
58
+ }
59
+ return applied;
60
+ },
61
+ };
62
+ //# sourceMappingURL=rename-visibility-field.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rename-visibility-field.js","sourceRoot":"","sources":["../../../src/core/migrations/rename-visibility-field.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { Store } from '../store.js';
2
+ /** One concrete, reportable change a migration made (or would make). */
3
+ export interface MigrationDelta {
4
+ /** The file touched, relative to the store root — 'contexture.yaml' for the config itself. */
5
+ path: string;
6
+ description: string;
7
+ }
8
+ /**
9
+ * store-lifecycle spec: "named, dry-runnable, resumable." A migration's
10
+ * `plan()` and `apply()` both re-derive what still needs doing from the
11
+ * store's CURRENT on-disk state, never from separately-tracked progress —
12
+ * so re-running `apply()` after an interruption naturally skips whatever
13
+ * was already done (it no longer matches the "needs migrating" condition)
14
+ * and finishes the rest, with no separate progress file to go stale or
15
+ * corrupt.
16
+ */
17
+ export interface Migration {
18
+ id: string;
19
+ fromVersion: number;
20
+ toVersion: number;
21
+ description: string;
22
+ /** Computes exactly what apply() would change, without writing anything. */
23
+ plan(store: Store): Promise<MigrationDelta[]>;
24
+ /** Applies only what plan() would still report as pending; returns what it actually changed. */
25
+ apply(store: Store): Promise<MigrationDelta[]>;
26
+ }
27
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/migrations/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEzC,wEAAwE;AACxE,MAAM,WAAW,cAAc;IAC7B,8FAA8F;IAC9F,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,4EAA4E;IAC5E,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IAC9C,gGAAgG;IAChG,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;CAChD"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/core/migrations/types.ts"],"names":[],"mappings":""}