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,267 @@
1
+ import { ExitCode } from './exit-codes.js';
2
+ /**
3
+ * Base for every error contexture raises deliberately (as opposed to a bug,
4
+ * which throws something else and is mapped to ExitCode.Internal). Each
5
+ * carries the finding that explains, in the fail-loud contract's terms,
6
+ * exactly what could not be determined — never a guessed fallback.
7
+ */
8
+ export class ContextureError extends Error {
9
+ exitCode;
10
+ finding;
11
+ constructor(exitCode, finding) {
12
+ super(finding.message);
13
+ this.name = new.target.name;
14
+ this.exitCode = exitCode;
15
+ this.finding = finding;
16
+ }
17
+ }
18
+ export class NoStoreRootError extends ContextureError {
19
+ constructor(checked) {
20
+ super(ExitCode.Usage, {
21
+ code: 'root.not_found',
22
+ severity: 'error',
23
+ message: 'No store root found: checked --root, CONTEXTURE_ROOT, and walking up ' +
24
+ `from "${checked.cwd}" looking for contexture.yaml.`,
25
+ details: { checkedFlag: checked.flag, checkedEnv: checked.env, cwd: checked.cwd },
26
+ });
27
+ }
28
+ }
29
+ export class NotAGitRepositoryError extends ContextureError {
30
+ constructor(root) {
31
+ super(ExitCode.Usage, {
32
+ code: 'root.not_a_git_repository',
33
+ severity: 'error',
34
+ message: `"${root}" is not inside a git repository.`,
35
+ subject: root,
36
+ });
37
+ }
38
+ }
39
+ export class SchemaVersionNewerError extends ContextureError {
40
+ constructor(storeVersion, supportedVersion) {
41
+ super(ExitCode.Usage, {
42
+ code: 'config.schema_version.newer',
43
+ severity: 'error',
44
+ message: `This store's schema_version (${storeVersion}) is newer than the ` +
45
+ `version this contexture release supports (${supportedVersion}).`,
46
+ details: { storeVersion, supportedVersion },
47
+ });
48
+ }
49
+ }
50
+ export class SchemaVersionMissingError extends ContextureError {
51
+ constructor(configPath) {
52
+ super(ExitCode.Usage, {
53
+ code: 'config.schema_version.missing',
54
+ severity: 'error',
55
+ message: `"${configPath}" has no schema_version field — this store predates ` +
56
+ 'the schema-version requirement and must be migrated with an explicit tool.',
57
+ subject: configPath,
58
+ });
59
+ }
60
+ }
61
+ export class InvalidConfigError extends ContextureError {
62
+ constructor(configPath, issues) {
63
+ super(ExitCode.Usage, {
64
+ code: 'config.invalid',
65
+ severity: 'error',
66
+ message: `"${configPath}" failed validation: ${issues.map((i) => `${i.path}: ${i.message}`).join('; ')}`,
67
+ subject: configPath,
68
+ details: { issues },
69
+ });
70
+ }
71
+ }
72
+ export class InvalidNoteFrontmatterError extends ContextureError {
73
+ constructor(notePath, detail) {
74
+ super(ExitCode.Usage, {
75
+ code: 'note.invalid_frontmatter',
76
+ severity: 'error',
77
+ message: `"${notePath}" has a frontmatter block that is not valid: ${detail}.`,
78
+ subject: notePath,
79
+ });
80
+ }
81
+ }
82
+ export class SessionNotFoundError extends ContextureError {
83
+ constructor(branch) {
84
+ super(ExitCode.Usage, {
85
+ code: 'session.not_found',
86
+ severity: 'error',
87
+ message: `No session found for branch "${branch}".`,
88
+ subject: branch,
89
+ });
90
+ }
91
+ }
92
+ export class SessionValidationFailedError extends ContextureError {
93
+ constructor(findings) {
94
+ super(ExitCode.CheckFailed, {
95
+ code: 'session.validation_failed',
96
+ severity: 'error',
97
+ message: `Session validation failed: ${findings.map((f) => f.message).join('; ')}`,
98
+ details: { findings },
99
+ });
100
+ }
101
+ }
102
+ export class NoRemoteConfiguredError extends ContextureError {
103
+ constructor() {
104
+ super(ExitCode.Usage, {
105
+ code: 'session.no_remote',
106
+ severity: 'error',
107
+ message: 'No "origin" remote is configured; add one before submitting a session.',
108
+ });
109
+ }
110
+ }
111
+ export class CatalogSectionNotFoundError extends ContextureError {
112
+ constructor(sectionId) {
113
+ super(ExitCode.Usage, {
114
+ code: 'catalog.section_not_found',
115
+ severity: 'error',
116
+ message: `No catalog section named "${sectionId}".`,
117
+ subject: sectionId,
118
+ });
119
+ }
120
+ }
121
+ export class GraphIdentityCollisionError extends ContextureError {
122
+ constructor(ids) {
123
+ super(ExitCode.CheckFailed, {
124
+ code: 'graph.identity_collision',
125
+ severity: 'error',
126
+ message: `Two or more notes resolve to the same graph node identity: ${ids.join(', ')}. No graph artifact was written.`,
127
+ details: { ids },
128
+ });
129
+ }
130
+ }
131
+ export class NoteNotFoundError extends ContextureError {
132
+ constructor(notePath) {
133
+ super(ExitCode.Usage, {
134
+ code: 'note.not_found',
135
+ severity: 'error',
136
+ message: `"${notePath}" does not exist in this store.`,
137
+ subject: notePath,
138
+ });
139
+ }
140
+ }
141
+ export class AlreadyIngestedError extends ContextureError {
142
+ constructor(notePath) {
143
+ super(ExitCode.Usage, {
144
+ code: 'ingest.already_ingested',
145
+ severity: 'error',
146
+ message: `"${notePath}" already carries source-identity fields; ingest never re-stamps an already-ingested file.`,
147
+ subject: notePath,
148
+ });
149
+ }
150
+ }
151
+ export class NoteNotTrackedError extends ContextureError {
152
+ constructor(notePath) {
153
+ super(ExitCode.Usage, {
154
+ code: 'archive.not_tracked',
155
+ severity: 'error',
156
+ message: `Cannot archive "${notePath}": it is not yet tracked by git. Commit it first, then archive.`,
157
+ subject: notePath,
158
+ });
159
+ }
160
+ }
161
+ export class ArchiveDestinationExistsError extends ContextureError {
162
+ constructor(destinationPath) {
163
+ super(ExitCode.Usage, {
164
+ code: 'archive.destination_exists',
165
+ severity: 'error',
166
+ message: `Cannot archive: "${destinationPath}" already exists.`,
167
+ subject: destinationPath,
168
+ });
169
+ }
170
+ }
171
+ export class AdapterNotFoundError extends ContextureError {
172
+ constructor(kind, id) {
173
+ super(ExitCode.Usage, {
174
+ code: 'adapter.not_found',
175
+ severity: 'error',
176
+ message: `Configured adapter "${id}" (kind: ${kind}) is not a known adapter.`,
177
+ subject: id,
178
+ details: { kind },
179
+ });
180
+ }
181
+ }
182
+ export class AdapterVersionMismatchError extends ContextureError {
183
+ constructor(kind, id, declaredVersion, supportedVersion) {
184
+ super(ExitCode.Usage, {
185
+ code: 'adapter.version_mismatch',
186
+ severity: 'error',
187
+ message: `Adapter "${id}" (kind: ${kind}) declares interface version ${declaredVersion}, but this contexture release supports version ${supportedVersion}.`,
188
+ subject: id,
189
+ details: { kind, declaredVersion, supportedVersion },
190
+ });
191
+ }
192
+ }
193
+ export class GraphNotBuiltError extends ContextureError {
194
+ constructor() {
195
+ super(ExitCode.Usage, {
196
+ code: 'graph.not_built',
197
+ severity: 'error',
198
+ message: 'No graph artifact exists yet. Run "ctxr graph build" first.',
199
+ });
200
+ }
201
+ }
202
+ export class GraphNodeNotFoundError extends ContextureError {
203
+ constructor(nodeId) {
204
+ super(ExitCode.Usage, {
205
+ code: 'graph.node_not_found',
206
+ severity: 'error',
207
+ message: `"${nodeId}" is not a node in the graph.`,
208
+ subject: nodeId,
209
+ });
210
+ }
211
+ }
212
+ export class MarkerMismatchError extends ContextureError {
213
+ constructor(filePath, detail) {
214
+ super(ExitCode.Usage, {
215
+ code: 'fenced_region.marker_mismatch',
216
+ severity: 'error',
217
+ message: `"${filePath}" has a mismatched marker pair: ${detail}. No bytes were written.`,
218
+ subject: filePath,
219
+ });
220
+ }
221
+ }
222
+ export class GitIdentityMissingError extends ContextureError {
223
+ constructor() {
224
+ super(ExitCode.Usage, {
225
+ code: 'git.identity_missing',
226
+ severity: 'error',
227
+ message: 'git has no configured author identity. Run:\n' +
228
+ ' git config user.email "you@example.com"\n' +
229
+ ' git config user.name "Your Name"\n' +
230
+ 'then re-run init.',
231
+ });
232
+ }
233
+ }
234
+ export class TaxonomySelectionConflictError extends ContextureError {
235
+ constructor() {
236
+ super(ExitCode.Usage, {
237
+ code: 'taxonomy.selection_conflict',
238
+ severity: 'error',
239
+ message: '--profile and --taxonomy were both given; pass exactly one.',
240
+ });
241
+ }
242
+ }
243
+ export class InvalidTaxonomyFileError extends ContextureError {
244
+ constructor(filePath, issues) {
245
+ super(ExitCode.Usage, {
246
+ code: 'taxonomy.invalid_file',
247
+ severity: 'error',
248
+ message: `"${filePath}" is not a valid taxonomy definition: ${issues
249
+ .map((i) => `${i.path}: ${i.message}`)
250
+ .join('; ')}`,
251
+ subject: filePath,
252
+ details: { issues },
253
+ });
254
+ }
255
+ }
256
+ export class UnknownTaxonomyProfileError extends ContextureError {
257
+ constructor(given, knownIds) {
258
+ super(ExitCode.Usage, {
259
+ code: 'taxonomy.unknown_profile',
260
+ severity: 'error',
261
+ message: `Unknown taxonomy profile "${given}". Known profiles: ${knownIds.join(', ')}.`,
262
+ subject: given,
263
+ details: { knownIds },
264
+ });
265
+ }
266
+ }
267
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * The exit-code taxonomy every contexture command shares (cli-contract spec).
3
+ *
4
+ * `0` and `1` follow a deliberate split from plain "success vs failure":
5
+ * Node itself exits a process with `1` on an uncaught exception, so `1` is
6
+ * reserved for exactly that class of failure (a bug, a crash) and nothing
7
+ * else. That keeps `1` from ever being confused with "the command ran
8
+ * correctly and found a real problem" — which is `CheckFailed`, not `Internal`.
9
+ *
10
+ * `4` and `5` are reserved now, unused until Phase 5's disclosure-policy
11
+ * tri-state (ALLOW/DENY/ASK) needs codes distinct from `CheckFailed` — ALLOW
12
+ * must be `Ok` (0), so DENY/ASK can't reuse `CheckFailed` (3).
13
+ *
14
+ * This table is allocated once, here, and is never extended by guessing a
15
+ * number under pressure in a later phase.
16
+ */
17
+ export declare const ExitCode: {
18
+ /** The command ran and found nothing wrong. */
19
+ readonly Ok: 0;
20
+ /** An unexpected internal error (a bug) — never a real, expected finding. */
21
+ readonly Internal: 1;
22
+ /** Bad arguments, no store root, not a git repo, invalid/mismatched schema version. */
23
+ readonly Usage: 2;
24
+ /** The command ran correctly and determined a real problem exists. */
25
+ readonly CheckFailed: 3;
26
+ /** Reserved for Phase 5's disclosure-policy tri-state: DENY. */
27
+ readonly DisclosureDeny: 4;
28
+ /** Reserved for Phase 5's disclosure-policy tri-state: ASK. */
29
+ readonly DisclosureAsk: 5;
30
+ };
31
+ export type ExitCode = (typeof ExitCode)[keyof typeof ExitCode];
32
+ //# sourceMappingURL=exit-codes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exit-codes.d.ts","sourceRoot":"","sources":["../../src/core/exit-codes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,QAAQ;IACnB,+CAA+C;aAC/C,EAAE,EAAE,CAAC;IACL,6EAA6E;aAC7E,QAAQ,EAAE,CAAC;IACX,uFAAuF;aACvF,KAAK,EAAE,CAAC;IACR,sEAAsE;aACtE,WAAW,EAAE,CAAC;IACd,gEAAgE;aAChE,cAAc,EAAE,CAAC;IACjB,+DAA+D;aAC/D,aAAa,EAAE,CAAC;CACR,CAAC;AAEX,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,QAAQ,CAAC,CAAC,MAAM,OAAO,QAAQ,CAAC,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * The exit-code taxonomy every contexture command shares (cli-contract spec).
3
+ *
4
+ * `0` and `1` follow a deliberate split from plain "success vs failure":
5
+ * Node itself exits a process with `1` on an uncaught exception, so `1` is
6
+ * reserved for exactly that class of failure (a bug, a crash) and nothing
7
+ * else. That keeps `1` from ever being confused with "the command ran
8
+ * correctly and found a real problem" — which is `CheckFailed`, not `Internal`.
9
+ *
10
+ * `4` and `5` are reserved now, unused until Phase 5's disclosure-policy
11
+ * tri-state (ALLOW/DENY/ASK) needs codes distinct from `CheckFailed` — ALLOW
12
+ * must be `Ok` (0), so DENY/ASK can't reuse `CheckFailed` (3).
13
+ *
14
+ * This table is allocated once, here, and is never extended by guessing a
15
+ * number under pressure in a later phase.
16
+ */
17
+ export const ExitCode = {
18
+ /** The command ran and found nothing wrong. */
19
+ Ok: 0,
20
+ /** An unexpected internal error (a bug) — never a real, expected finding. */
21
+ Internal: 1,
22
+ /** Bad arguments, no store root, not a git repo, invalid/mismatched schema version. */
23
+ Usage: 2,
24
+ /** The command ran correctly and determined a real problem exists. */
25
+ CheckFailed: 3,
26
+ /** Reserved for Phase 5's disclosure-policy tri-state: DENY. */
27
+ DisclosureDeny: 4,
28
+ /** Reserved for Phase 5's disclosure-policy tri-state: ASK. */
29
+ DisclosureAsk: 5,
30
+ };
31
+ //# sourceMappingURL=exit-codes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exit-codes.js","sourceRoot":"","sources":["../../src/core/exit-codes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,+CAA+C;IAC/C,EAAE,EAAE,CAAC;IACL,6EAA6E;IAC7E,QAAQ,EAAE,CAAC;IACX,uFAAuF;IACvF,KAAK,EAAE,CAAC;IACR,sEAAsE;IACtE,WAAW,EAAE,CAAC;IACd,gEAAgE;IAChE,cAAc,EAAE,CAAC;IACjB,+DAA+D;IAC/D,aAAa,EAAE,CAAC;CACR,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Writes `contents` to `filePath` atomically: write to a temp file in the
3
+ * SAME directory (so rename() is same-filesystem and therefore atomic on
4
+ * POSIX), fsync it, then rename over the target. A process killed mid-write
5
+ * leaves either the old complete file or nothing on disk — never a
6
+ * truncated target. Used for every authored file contexture writes,
7
+ * starting with `contexture.yaml` and `.gitignore` in `init`.
8
+ */
9
+ export declare function writeFileAtomic(filePath: string, contents: string): Promise<void>;
10
+ //# sourceMappingURL=atomic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"atomic.d.ts","sourceRoot":"","sources":["../../../src/core/fs/atomic.ts"],"names":[],"mappings":"AAIA;;;;;;;GAOG;AACH,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBvF"}
@@ -0,0 +1,31 @@
1
+ import { randomBytes } from 'node:crypto';
2
+ import { open, rename, unlink } from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ /**
5
+ * Writes `contents` to `filePath` atomically: write to a temp file in the
6
+ * SAME directory (so rename() is same-filesystem and therefore atomic on
7
+ * POSIX), fsync it, then rename over the target. A process killed mid-write
8
+ * leaves either the old complete file or nothing on disk — never a
9
+ * truncated target. Used for every authored file contexture writes,
10
+ * starting with `contexture.yaml` and `.gitignore` in `init`.
11
+ */
12
+ export async function writeFileAtomic(filePath, contents) {
13
+ const dir = path.dirname(filePath);
14
+ const tempPath = path.join(dir, `.${path.basename(filePath)}.${randomBytes(6).toString('hex')}.tmp`);
15
+ const handle = await open(tempPath, 'w');
16
+ try {
17
+ await handle.writeFile(contents, 'utf8');
18
+ await handle.sync();
19
+ }
20
+ finally {
21
+ await handle.close();
22
+ }
23
+ try {
24
+ await rename(tempPath, filePath);
25
+ }
26
+ catch (err) {
27
+ await unlink(tempPath).catch(() => undefined);
28
+ throw err;
29
+ }
30
+ }
31
+ //# sourceMappingURL=atomic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"atomic.js","sourceRoot":"","sources":["../../../src/core/fs/atomic.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,QAAgB,EAAE,QAAgB;IACtE,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACrG,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IACzC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACzC,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;IACtB,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;IACD,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACnC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC9C,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC"}
@@ -0,0 +1,47 @@
1
+ import type { Fence } from '../markers.js';
2
+ /**
3
+ * The marker-fence primitive (context-store spec), pulled forward from
4
+ * Phase 1.3 into its final home: `.gitignore`'s derived-path block is the
5
+ * first consumer, and every later generated-region writer (catalog, rollup,
6
+ * adapters) uses the same mechanism. The primitive only does exact-line
7
+ * matching — it knows nothing about comment syntax, which is why `Fence` is
8
+ * a parameter rather than hardcoded `#` markers.
9
+ */
10
+ export interface UpsertFencedRegionResult {
11
+ text: string;
12
+ changed: boolean;
13
+ }
14
+ /**
15
+ * Idempotently inserts or replaces the body strictly between `fence.start`
16
+ * and `fence.end` in `text`, preserving everything outside byte-for-byte.
17
+ *
18
+ * - No markers found → appends the block (a blank line first, if the
19
+ * existing text is non-empty and doesn't already end in one).
20
+ * - Exactly one start and one end, start before end → replaces the body
21
+ * between them.
22
+ * - Anything else (unpaired, duplicated, out of order) → throws before
23
+ * returning, so a caller writing atomically writes zero bytes.
24
+ *
25
+ * Returns `changed: false` (with byte-identical text) when nothing actually
26
+ * changes, so a caller can skip reopening the file entirely — no rewrite, no
27
+ * mtime churn.
28
+ */
29
+ export declare function upsertFencedRegion(text: string, fence: Fence, body: readonly string[]): UpsertFencedRegionResult;
30
+ /**
31
+ * Reads `filePath` (a missing file is treated as empty text), upserts the
32
+ * fenced region, and writes atomically — but only if the content actually
33
+ * changed, so a no-op re-run never touches the file's mtime. This is what
34
+ * makes re-init convergent: identical inputs produce zero writes.
35
+ */
36
+ export declare function upsertFencedRegionInFile(filePath: string, fence: Fence, body: readonly string[]): Promise<{
37
+ changed: boolean;
38
+ }>;
39
+ /**
40
+ * Pure validation, comment-syntax-agnostic (matches the `contexture:<region>`
41
+ * token regardless of whether it's wrapped in `#`, `<!-- -->`, or anything
42
+ * else) — used by the pre-commit `fence_integrity` check to reject a staged
43
+ * file with an unpaired or duplicated marker, without needing to know or
44
+ * reconstruct the region's intended body content.
45
+ */
46
+ export declare function validateFenceIntegrity(text: string): string[];
47
+ //# sourceMappingURL=fenced-region.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fenced-region.d.ts","sourceRoot":"","sources":["../../../src/core/fs/fenced-region.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAI3C;;;;;;;GAOG;AACH,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;CAClB;AAID;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,SAAS,MAAM,EAAE,GACtB,wBAAwB,CA6B1B;AAeD;;;;;GAKG;AACH,wBAAsB,wBAAwB,CAC5C,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,SAAS,MAAM,EAAE,GACtB,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CAsB/B;AAKD;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CA0B7D"}
@@ -0,0 +1,122 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import { MarkerMismatchError } from '../errors.js';
3
+ import { writeFileAtomic } from './atomic.js';
4
+ class FenceMismatch extends Error {
5
+ }
6
+ /**
7
+ * Idempotently inserts or replaces the body strictly between `fence.start`
8
+ * and `fence.end` in `text`, preserving everything outside byte-for-byte.
9
+ *
10
+ * - No markers found → appends the block (a blank line first, if the
11
+ * existing text is non-empty and doesn't already end in one).
12
+ * - Exactly one start and one end, start before end → replaces the body
13
+ * between them.
14
+ * - Anything else (unpaired, duplicated, out of order) → throws before
15
+ * returning, so a caller writing atomically writes zero bytes.
16
+ *
17
+ * Returns `changed: false` (with byte-identical text) when nothing actually
18
+ * changes, so a caller can skip reopening the file entirely — no rewrite, no
19
+ * mtime churn.
20
+ */
21
+ export function upsertFencedRegion(text, fence, body) {
22
+ const trailingNewline = text.endsWith('\n');
23
+ const lines = text.length === 0 ? [] : text.split('\n');
24
+ if (trailingNewline)
25
+ lines.pop(); // split on a trailing \n leaves a spurious trailing ''
26
+ const startIndices = indicesOf(lines, fence.start);
27
+ const endIndices = indicesOf(lines, fence.end);
28
+ if (startIndices.length === 0 && endIndices.length === 0) {
29
+ const out = [...lines];
30
+ if (out.length > 0 && out[out.length - 1] !== '')
31
+ out.push('');
32
+ out.push(fence.start, ...body, fence.end);
33
+ return finish(out, text);
34
+ }
35
+ if (startIndices.length === 1 &&
36
+ endIndices.length === 1 &&
37
+ startIndices[0] < endIndices[0]) {
38
+ const startIdx = startIndices[0];
39
+ const endIdx = endIndices[0];
40
+ const out = [...lines.slice(0, startIdx + 1), ...body, ...lines.slice(endIdx)];
41
+ return finish(out, text);
42
+ }
43
+ throw new FenceMismatch(`found ${startIndices.length} start marker(s) and ${endIndices.length} end marker(s)`);
44
+ }
45
+ function indicesOf(lines, needle) {
46
+ const result = [];
47
+ for (let i = 0; i < lines.length; i += 1) {
48
+ if (lines[i] === needle)
49
+ result.push(i);
50
+ }
51
+ return result;
52
+ }
53
+ function finish(lines, original) {
54
+ const text = lines.length === 0 ? '' : `${lines.join('\n')}\n`;
55
+ return { text, changed: text !== original };
56
+ }
57
+ /**
58
+ * Reads `filePath` (a missing file is treated as empty text), upserts the
59
+ * fenced region, and writes atomically — but only if the content actually
60
+ * changed, so a no-op re-run never touches the file's mtime. This is what
61
+ * makes re-init convergent: identical inputs produce zero writes.
62
+ */
63
+ export async function upsertFencedRegionInFile(filePath, fence, body) {
64
+ let existing = '';
65
+ try {
66
+ existing = await readFile(filePath, 'utf8');
67
+ }
68
+ catch (err) {
69
+ if (err.code !== 'ENOENT')
70
+ throw err;
71
+ }
72
+ let result;
73
+ try {
74
+ result = upsertFencedRegion(existing, fence, body);
75
+ }
76
+ catch (err) {
77
+ if (err instanceof FenceMismatch) {
78
+ throw new MarkerMismatchError(filePath, err.message);
79
+ }
80
+ throw err;
81
+ }
82
+ if (result.changed) {
83
+ await writeFileAtomic(filePath, result.text);
84
+ }
85
+ return { changed: result.changed };
86
+ }
87
+ const GENERIC_START_RE = />>>\s*contexture:(\S+)/;
88
+ const GENERIC_END_RE = /<<<\s*contexture:(\S+)/;
89
+ /**
90
+ * Pure validation, comment-syntax-agnostic (matches the `contexture:<region>`
91
+ * token regardless of whether it's wrapped in `#`, `<!-- -->`, or anything
92
+ * else) — used by the pre-commit `fence_integrity` check to reject a staged
93
+ * file with an unpaired or duplicated marker, without needing to know or
94
+ * reconstruct the region's intended body content.
95
+ */
96
+ export function validateFenceIntegrity(text) {
97
+ const counts = new Map();
98
+ for (const line of text.split('\n')) {
99
+ const startMatch = GENERIC_START_RE.exec(line);
100
+ if (startMatch) {
101
+ const region = startMatch[1];
102
+ const entry = counts.get(region) ?? { start: 0, end: 0 };
103
+ entry.start += 1;
104
+ counts.set(region, entry);
105
+ }
106
+ const endMatch = GENERIC_END_RE.exec(line);
107
+ if (endMatch) {
108
+ const region = endMatch[1];
109
+ const entry = counts.get(region) ?? { start: 0, end: 0 };
110
+ entry.end += 1;
111
+ counts.set(region, entry);
112
+ }
113
+ }
114
+ const problems = [];
115
+ for (const [region, { start, end }] of counts) {
116
+ if (start !== 1 || end !== 1) {
117
+ problems.push(`region "${region}": found ${start} start marker(s) and ${end} end marker(s)`);
118
+ }
119
+ }
120
+ return problems;
121
+ }
122
+ //# sourceMappingURL=fenced-region.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fenced-region.js","sourceRoot":"","sources":["../../../src/core/fs/fenced-region.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * The ONLY module in this codebase that spawns `git`. Every git operation —
3
+ * in Phase 0's `init`, and in every later phase's session/worktree/hook code
4
+ * — goes through this interface, always as an argv array, never a shell
5
+ * string (a store path or branch name containing a space or `;` must never
6
+ * reach a shell).
7
+ *
8
+ * Deliberately not a library (simple-git, isomorphic-git): a library either
9
+ * wraps errors in its own types we'd have to unwrap to produce our findings,
10
+ * or (isomorphic-git) can't do `git worktree` — which Phase 2's session model
11
+ * is built on — or `--follow` rename detection, which Phase 7's archive
12
+ * verifies. Raw `git` via execFile is the boring choice that survives both.
13
+ */
14
+ export interface GitResult {
15
+ stdout: string;
16
+ stderr: string;
17
+ exitCode: number;
18
+ }
19
+ export interface GitRunOptions {
20
+ cwd: string;
21
+ /** When true, a non-zero exit resolves with the result instead of throwing. */
22
+ allowFailure?: boolean;
23
+ }
24
+ export interface GitRunner {
25
+ run(args: readonly string[], opts: GitRunOptions): Promise<GitResult>;
26
+ }
27
+ export declare function createExecFileGitRunner(): GitRunner;
28
+ //# sourceMappingURL=exec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exec.d.ts","sourceRoot":"","sources":["../../../src/core/git/exec.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,+EAA+E;IAC/E,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,SAAS;IACxB,GAAG,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;CACvE;AAED,wBAAgB,uBAAuB,IAAI,SAAS,CAenD"}
@@ -0,0 +1,21 @@
1
+ import { execFile } from 'node:child_process';
2
+ import { promisify } from 'node:util';
3
+ const execFileAsync = promisify(execFile);
4
+ export function createExecFileGitRunner() {
5
+ return {
6
+ async run(args, opts) {
7
+ try {
8
+ const { stdout, stderr } = await execFileAsync('git', [...args], { cwd: opts.cwd });
9
+ return { stdout, stderr, exitCode: 0 };
10
+ }
11
+ catch (err) {
12
+ const e = err;
13
+ if (opts.allowFailure) {
14
+ return { stdout: e.stdout ?? '', stderr: e.stderr ?? '', exitCode: e.code ?? 1 };
15
+ }
16
+ throw err;
17
+ }
18
+ },
19
+ };
20
+ }
21
+ //# sourceMappingURL=exec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exec.js","sourceRoot":"","sources":["../../../src/core/git/exec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AA+B1C,MAAM,UAAU,uBAAuB;IACrC,OAAO;QACL,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI;YAClB,IAAI,CAAC;gBACH,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;gBACpF,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;YACzC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,CAAC,GAAG,GAA0D,CAAC;gBACrE,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;oBACtB,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC;gBACnF,CAAC;gBACD,MAAM,GAAG,CAAC;YACZ,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}