@cairn-tool/cairn 2.0.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 (526) hide show
  1. package/.markdownlintrc +7 -0
  2. package/LICENSE +21 -0
  3. package/README.md +1431 -0
  4. package/dist/agent/audit/baseline.d.ts +69 -0
  5. package/dist/agent/audit/baseline.js +128 -0
  6. package/dist/agent/audit/baseline.js.map +1 -0
  7. package/dist/agent/audit/index.d.ts +126 -0
  8. package/dist/agent/audit/index.js +625 -0
  9. package/dist/agent/audit/index.js.map +1 -0
  10. package/dist/agent/import/detect.d.ts +49 -0
  11. package/dist/agent/import/detect.js +159 -0
  12. package/dist/agent/import/detect.js.map +1 -0
  13. package/dist/agent/import/normalize.d.ts +72 -0
  14. package/dist/agent/import/normalize.js +475 -0
  15. package/dist/agent/import/normalize.js.map +1 -0
  16. package/dist/agent/install/index.d.ts +211 -0
  17. package/dist/agent/install/index.js +907 -0
  18. package/dist/agent/install/index.js.map +1 -0
  19. package/dist/agent/manifest.d.ts +75 -0
  20. package/dist/agent/manifest.js +210 -0
  21. package/dist/agent/manifest.js.map +1 -0
  22. package/dist/agent/marketplace/index.d.ts +69 -0
  23. package/dist/agent/marketplace/index.js +212 -0
  24. package/dist/agent/marketplace/index.js.map +1 -0
  25. package/dist/agent/marketplace/spec.d.ts +48 -0
  26. package/dist/agent/marketplace/spec.js +237 -0
  27. package/dist/agent/marketplace/spec.js.map +1 -0
  28. package/dist/agent/output.d.ts +36 -0
  29. package/dist/agent/output.js +56 -0
  30. package/dist/agent/output.js.map +1 -0
  31. package/dist/agent/overlays.d.ts +38 -0
  32. package/dist/agent/overlays.js +223 -0
  33. package/dist/agent/overlays.js.map +1 -0
  34. package/dist/agent/package/index.d.ts +105 -0
  35. package/dist/agent/package/index.js +339 -0
  36. package/dist/agent/package/index.js.map +1 -0
  37. package/dist/agent/package/tar.d.ts +36 -0
  38. package/dist/agent/package/tar.js +137 -0
  39. package/dist/agent/package/tar.js.map +1 -0
  40. package/dist/agent/parser.d.ts +13 -0
  41. package/dist/agent/parser.js +559 -0
  42. package/dist/agent/parser.js.map +1 -0
  43. package/dist/agent/render.d.ts +16 -0
  44. package/dist/agent/render.js +721 -0
  45. package/dist/agent/render.js.map +1 -0
  46. package/dist/agent/sarif.d.ts +18 -0
  47. package/dist/agent/sarif.js +56 -0
  48. package/dist/agent/sarif.js.map +1 -0
  49. package/dist/agent/scaffold.d.ts +86 -0
  50. package/dist/agent/scaffold.js +250 -0
  51. package/dist/agent/scaffold.js.map +1 -0
  52. package/dist/agent/targets/antigravity.d.ts +17 -0
  53. package/dist/agent/targets/antigravity.js +218 -0
  54. package/dist/agent/targets/antigravity.js.map +1 -0
  55. package/dist/agent/targets/claude-code.d.ts +2 -0
  56. package/dist/agent/targets/claude-code.js +220 -0
  57. package/dist/agent/targets/claude-code.js.map +1 -0
  58. package/dist/agent/targets/codex.d.ts +2 -0
  59. package/dist/agent/targets/codex.js +212 -0
  60. package/dist/agent/targets/codex.js.map +1 -0
  61. package/dist/agent/targets/cursor.d.ts +2 -0
  62. package/dist/agent/targets/cursor.js +210 -0
  63. package/dist/agent/targets/cursor.js.map +1 -0
  64. package/dist/agent/targets/index.d.ts +31 -0
  65. package/dist/agent/targets/index.js +64 -0
  66. package/dist/agent/targets/index.js.map +1 -0
  67. package/dist/agent/targets/opencode.d.ts +15 -0
  68. package/dist/agent/targets/opencode.js +215 -0
  69. package/dist/agent/targets/opencode.js.map +1 -0
  70. package/dist/agent/targets/schema.d.ts +315 -0
  71. package/dist/agent/targets/schema.js +179 -0
  72. package/dist/agent/targets/schema.js.map +1 -0
  73. package/dist/agent/test/assert.d.ts +46 -0
  74. package/dist/agent/test/assert.js +288 -0
  75. package/dist/agent/test/assert.js.map +1 -0
  76. package/dist/agent/test/index.d.ts +73 -0
  77. package/dist/agent/test/index.js +181 -0
  78. package/dist/agent/test/index.js.map +1 -0
  79. package/dist/agent/test/schema.d.ts +81 -0
  80. package/dist/agent/test/schema.js +235 -0
  81. package/dist/agent/test/schema.js.map +1 -0
  82. package/dist/agent/types.d.ts +204 -0
  83. package/dist/agent/types.js +11 -0
  84. package/dist/agent/types.js.map +1 -0
  85. package/dist/agent/upgrade.d.ts +29 -0
  86. package/dist/agent/upgrade.js +72 -0
  87. package/dist/agent/upgrade.js.map +1 -0
  88. package/dist/agent/writer.d.ts +30 -0
  89. package/dist/agent/writer.js +73 -0
  90. package/dist/agent/writer.js.map +1 -0
  91. package/dist/archive/db.d.ts +20 -0
  92. package/dist/archive/db.js +98 -0
  93. package/dist/archive/db.js.map +1 -0
  94. package/dist/archive/progress.d.ts +62 -0
  95. package/dist/archive/progress.js +151 -0
  96. package/dist/archive/progress.js.map +1 -0
  97. package/dist/archive/query.d.ts +86 -0
  98. package/dist/archive/query.js +241 -0
  99. package/dist/archive/query.js.map +1 -0
  100. package/dist/archive/run.d.ts +91 -0
  101. package/dist/archive/run.js +331 -0
  102. package/dist/archive/run.js.map +1 -0
  103. package/dist/archive/segments.d.ts +89 -0
  104. package/dist/archive/segments.js +144 -0
  105. package/dist/archive/segments.js.map +1 -0
  106. package/dist/archive/sets.d.ts +58 -0
  107. package/dist/archive/sets.js +344 -0
  108. package/dist/archive/sets.js.map +1 -0
  109. package/dist/archive/tar-read.d.ts +35 -0
  110. package/dist/archive/tar-read.js +90 -0
  111. package/dist/archive/tar-read.js.map +1 -0
  112. package/dist/audit-baseline.d.ts +66 -0
  113. package/dist/audit-baseline.js +124 -0
  114. package/dist/audit-baseline.js.map +1 -0
  115. package/dist/automation.d.ts +16 -0
  116. package/dist/automation.js +38 -0
  117. package/dist/automation.js.map +1 -0
  118. package/dist/backlinks.d.ts +15 -0
  119. package/dist/backlinks.js +30 -0
  120. package/dist/backlinks.js.map +1 -0
  121. package/dist/checkers/katex.d.ts +3 -0
  122. package/dist/checkers/katex.js +71 -0
  123. package/dist/checkers/katex.js.map +1 -0
  124. package/dist/checkers/markdown-lint.d.ts +28 -0
  125. package/dist/checkers/markdown-lint.js +53 -0
  126. package/dist/checkers/markdown-lint.js.map +1 -0
  127. package/dist/checkers/mermaid.d.ts +6 -0
  128. package/dist/checkers/mermaid.js +53 -0
  129. package/dist/checkers/mermaid.js.map +1 -0
  130. package/dist/checkers/references.d.ts +3 -0
  131. package/dist/checkers/references.js +55 -0
  132. package/dist/checkers/references.js.map +1 -0
  133. package/dist/cli.d.ts +2 -0
  134. package/dist/cli.js +1117 -0
  135. package/dist/cli.js.map +1 -0
  136. package/dist/command-result.d.ts +6 -0
  137. package/dist/command-result.js +13 -0
  138. package/dist/command-result.js.map +1 -0
  139. package/dist/commands/agent-audit.d.ts +21 -0
  140. package/dist/commands/agent-audit.js +119 -0
  141. package/dist/commands/agent-audit.js.map +1 -0
  142. package/dist/commands/agent-doctor.d.ts +25 -0
  143. package/dist/commands/agent-doctor.js +217 -0
  144. package/dist/commands/agent-doctor.js.map +1 -0
  145. package/dist/commands/agent-import.d.ts +21 -0
  146. package/dist/commands/agent-import.js +212 -0
  147. package/dist/commands/agent-import.js.map +1 -0
  148. package/dist/commands/agent-install.d.ts +18 -0
  149. package/dist/commands/agent-install.js +59 -0
  150. package/dist/commands/agent-install.js.map +1 -0
  151. package/dist/commands/agent-installed.d.ts +6 -0
  152. package/dist/commands/agent-installed.js +17 -0
  153. package/dist/commands/agent-installed.js.map +1 -0
  154. package/dist/commands/agent-marketplace.d.ts +11 -0
  155. package/dist/commands/agent-marketplace.js +178 -0
  156. package/dist/commands/agent-marketplace.js.map +1 -0
  157. package/dist/commands/agent-package.d.ts +16 -0
  158. package/dist/commands/agent-package.js +159 -0
  159. package/dist/commands/agent-package.js.map +1 -0
  160. package/dist/commands/agent-scaffold.d.ts +17 -0
  161. package/dist/commands/agent-scaffold.js +181 -0
  162. package/dist/commands/agent-scaffold.js.map +1 -0
  163. package/dist/commands/agent-specs.d.ts +7 -0
  164. package/dist/commands/agent-specs.js +20 -0
  165. package/dist/commands/agent-specs.js.map +1 -0
  166. package/dist/commands/agent-test.d.ts +21 -0
  167. package/dist/commands/agent-test.js +50 -0
  168. package/dist/commands/agent-test.js.map +1 -0
  169. package/dist/commands/agent-uninstall.d.ts +6 -0
  170. package/dist/commands/agent-uninstall.js +45 -0
  171. package/dist/commands/agent-uninstall.js.map +1 -0
  172. package/dist/commands/agent-upgrade.d.ts +5 -0
  173. package/dist/commands/agent-upgrade.js +105 -0
  174. package/dist/commands/agent-upgrade.js.map +1 -0
  175. package/dist/commands/agent.d.ts +27 -0
  176. package/dist/commands/agent.js +549 -0
  177. package/dist/commands/agent.js.map +1 -0
  178. package/dist/commands/archive.d.ts +47 -0
  179. package/dist/commands/archive.js +311 -0
  180. package/dist/commands/archive.js.map +1 -0
  181. package/dist/commands/audit.d.ts +25 -0
  182. package/dist/commands/audit.js +325 -0
  183. package/dist/commands/audit.js.map +1 -0
  184. package/dist/commands/check-snippets.d.ts +58 -0
  185. package/dist/commands/check-snippets.js +247 -0
  186. package/dist/commands/check-snippets.js.map +1 -0
  187. package/dist/commands/check-urls.d.ts +52 -0
  188. package/dist/commands/check-urls.js +205 -0
  189. package/dist/commands/check-urls.js.map +1 -0
  190. package/dist/commands/code-blocks.d.ts +8 -0
  191. package/dist/commands/code-blocks.js +66 -0
  192. package/dist/commands/code-blocks.js.map +1 -0
  193. package/dist/commands/completion.d.ts +15 -0
  194. package/dist/commands/completion.js +20 -0
  195. package/dist/commands/completion.js.map +1 -0
  196. package/dist/commands/context.d.ts +16 -0
  197. package/dist/commands/context.js +131 -0
  198. package/dist/commands/context.js.map +1 -0
  199. package/dist/commands/describe.d.ts +12 -0
  200. package/dist/commands/describe.js +62 -0
  201. package/dist/commands/describe.js.map +1 -0
  202. package/dist/commands/diff.d.ts +11 -0
  203. package/dist/commands/diff.js +185 -0
  204. package/dist/commands/diff.js.map +1 -0
  205. package/dist/commands/fix.d.ts +59 -0
  206. package/dist/commands/fix.js +173 -0
  207. package/dist/commands/fix.js.map +1 -0
  208. package/dist/commands/frontmatter.d.ts +7 -0
  209. package/dist/commands/frontmatter.js +84 -0
  210. package/dist/commands/frontmatter.js.map +1 -0
  211. package/dist/commands/graph.d.ts +12 -0
  212. package/dist/commands/graph.js +122 -0
  213. package/dist/commands/graph.js.map +1 -0
  214. package/dist/commands/headers.d.ts +7 -0
  215. package/dist/commands/headers.js +48 -0
  216. package/dist/commands/headers.js.map +1 -0
  217. package/dist/commands/index.d.ts +8 -0
  218. package/dist/commands/index.js +32 -0
  219. package/dist/commands/index.js.map +1 -0
  220. package/dist/commands/links.d.ts +9 -0
  221. package/dist/commands/links.js +123 -0
  222. package/dist/commands/links.js.map +1 -0
  223. package/dist/commands/lint-dir.d.ts +15 -0
  224. package/dist/commands/lint-dir.js +156 -0
  225. package/dist/commands/lint-dir.js.map +1 -0
  226. package/dist/commands/lint.d.ts +14 -0
  227. package/dist/commands/lint.js +45 -0
  228. package/dist/commands/lint.js.map +1 -0
  229. package/dist/commands/orphans.d.ts +10 -0
  230. package/dist/commands/orphans.js +74 -0
  231. package/dist/commands/orphans.js.map +1 -0
  232. package/dist/commands/outline.d.ts +7 -0
  233. package/dist/commands/outline.js +54 -0
  234. package/dist/commands/outline.js.map +1 -0
  235. package/dist/commands/query.d.ts +18 -0
  236. package/dist/commands/query.js +341 -0
  237. package/dist/commands/query.js.map +1 -0
  238. package/dist/commands/refs-to.d.ts +8 -0
  239. package/dist/commands/refs-to.js +65 -0
  240. package/dist/commands/refs-to.js.map +1 -0
  241. package/dist/commands/refs.d.ts +10 -0
  242. package/dist/commands/refs.js +103 -0
  243. package/dist/commands/refs.js.map +1 -0
  244. package/dist/commands/rename-file.d.ts +16 -0
  245. package/dist/commands/rename-file.js +215 -0
  246. package/dist/commands/rename-file.js.map +1 -0
  247. package/dist/commands/rename-heading.d.ts +10 -0
  248. package/dist/commands/rename-heading.js +182 -0
  249. package/dist/commands/rename-heading.js.map +1 -0
  250. package/dist/commands/schema.d.ts +10 -0
  251. package/dist/commands/schema.js +34 -0
  252. package/dist/commands/schema.js.map +1 -0
  253. package/dist/commands/scripts.d.ts +59 -0
  254. package/dist/commands/scripts.js +222 -0
  255. package/dist/commands/scripts.js.map +1 -0
  256. package/dist/commands/section.d.ts +9 -0
  257. package/dist/commands/section.js +49 -0
  258. package/dist/commands/section.js.map +1 -0
  259. package/dist/commands/serve.d.ts +6 -0
  260. package/dist/commands/serve.js +48 -0
  261. package/dist/commands/serve.js.map +1 -0
  262. package/dist/commands/stats.d.ts +6 -0
  263. package/dist/commands/stats.js +109 -0
  264. package/dist/commands/stats.js.map +1 -0
  265. package/dist/commands/structure.d.ts +6 -0
  266. package/dist/commands/structure.js +130 -0
  267. package/dist/commands/structure.js.map +1 -0
  268. package/dist/commands/tables.d.ts +8 -0
  269. package/dist/commands/tables.js +77 -0
  270. package/dist/commands/tables.js.map +1 -0
  271. package/dist/commands/tasks.d.ts +8 -0
  272. package/dist/commands/tasks.js +59 -0
  273. package/dist/commands/tasks.js.map +1 -0
  274. package/dist/commands/toc.d.ts +18 -0
  275. package/dist/commands/toc.js +105 -0
  276. package/dist/commands/toc.js.map +1 -0
  277. package/dist/commands/update-check.d.ts +36 -0
  278. package/dist/commands/update-check.js +119 -0
  279. package/dist/commands/update-check.js.map +1 -0
  280. package/dist/commands/usage.d.ts +56 -0
  281. package/dist/commands/usage.js +883 -0
  282. package/dist/commands/usage.js.map +1 -0
  283. package/dist/commands/validate-frontmatter.d.ts +13 -0
  284. package/dist/commands/validate-frontmatter.js +34 -0
  285. package/dist/commands/validate-frontmatter.js.map +1 -0
  286. package/dist/completion/model.d.ts +49 -0
  287. package/dist/completion/model.js +194 -0
  288. package/dist/completion/model.js.map +1 -0
  289. package/dist/completion/shells.d.ts +2 -0
  290. package/dist/completion/shells.js +280 -0
  291. package/dist/completion/shells.js.map +1 -0
  292. package/dist/config-schema.d.ts +15 -0
  293. package/dist/config-schema.js +44 -0
  294. package/dist/config-schema.js.map +1 -0
  295. package/dist/config.d.ts +102 -0
  296. package/dist/config.js +614 -0
  297. package/dist/config.js.map +1 -0
  298. package/dist/context.d.ts +106 -0
  299. package/dist/context.js +202 -0
  300. package/dist/context.js.map +1 -0
  301. package/dist/contract/describe.d.ts +84 -0
  302. package/dist/contract/describe.js +104 -0
  303. package/dist/contract/describe.js.map +1 -0
  304. package/dist/contract/registry.d.ts +2 -0
  305. package/dist/contract/registry.js +622 -0
  306. package/dist/contract/registry.js.map +1 -0
  307. package/dist/contract/schemas/agent.d.ts +2 -0
  308. package/dist/contract/schemas/agent.js +572 -0
  309. package/dist/contract/schemas/agent.js.map +1 -0
  310. package/dist/contract/schemas/archive.d.ts +3 -0
  311. package/dist/contract/schemas/archive.js +227 -0
  312. package/dist/contract/schemas/archive.js.map +1 -0
  313. package/dist/contract/schemas/index.d.ts +11 -0
  314. package/dist/contract/schemas/index.js +49 -0
  315. package/dist/contract/schemas/index.js.map +1 -0
  316. package/dist/contract/schemas/markdown.d.ts +15 -0
  317. package/dist/contract/schemas/markdown.js +1035 -0
  318. package/dist/contract/schemas/markdown.js.map +1 -0
  319. package/dist/contract/schemas/meta.d.ts +5 -0
  320. package/dist/contract/schemas/meta.js +233 -0
  321. package/dist/contract/schemas/meta.js.map +1 -0
  322. package/dist/contract/schemas/scripts.d.ts +4 -0
  323. package/dist/contract/schemas/scripts.js +183 -0
  324. package/dist/contract/schemas/scripts.js.map +1 -0
  325. package/dist/contract/schemas/shared.d.ts +11 -0
  326. package/dist/contract/schemas/shared.js +26 -0
  327. package/dist/contract/schemas/shared.js.map +1 -0
  328. package/dist/contract/schemas/usage.d.ts +6 -0
  329. package/dist/contract/schemas/usage.js +489 -0
  330. package/dist/contract/schemas/usage.js.map +1 -0
  331. package/dist/contract/types.d.ts +63 -0
  332. package/dist/contract/types.js +2 -0
  333. package/dist/contract/types.js.map +1 -0
  334. package/dist/contract/version.d.ts +20 -0
  335. package/dist/contract/version.js +21 -0
  336. package/dist/contract/version.js.map +1 -0
  337. package/dist/diff.d.ts +156 -0
  338. package/dist/diff.js +500 -0
  339. package/dist/diff.js.map +1 -0
  340. package/dist/edit-plan.d.ts +133 -0
  341. package/dist/edit-plan.js +245 -0
  342. package/dist/edit-plan.js.map +1 -0
  343. package/dist/fix/markdownlint-fixer.d.ts +34 -0
  344. package/dist/fix/markdownlint-fixer.js +125 -0
  345. package/dist/fix/markdownlint-fixer.js.map +1 -0
  346. package/dist/fix/registry.d.ts +48 -0
  347. package/dist/fix/registry.js +28 -0
  348. package/dist/fix/registry.js.map +1 -0
  349. package/dist/fix/relative-links-fixer.d.ts +21 -0
  350. package/dist/fix/relative-links-fixer.js +96 -0
  351. package/dist/fix/relative-links-fixer.js.map +1 -0
  352. package/dist/fix/snippets-fixer.d.ts +2 -0
  353. package/dist/fix/snippets-fixer.js +64 -0
  354. package/dist/fix/snippets-fixer.js.map +1 -0
  355. package/dist/fix/toc-fixer.d.ts +2 -0
  356. package/dist/fix/toc-fixer.js +94 -0
  357. package/dist/fix/toc-fixer.js.map +1 -0
  358. package/dist/formats.d.ts +22 -0
  359. package/dist/formats.js +34 -0
  360. package/dist/formats.js.map +1 -0
  361. package/dist/formatters.d.ts +11 -0
  362. package/dist/formatters.js +48 -0
  363. package/dist/formatters.js.map +1 -0
  364. package/dist/frontmatter-validation.d.ts +11 -0
  365. package/dist/frontmatter-validation.js +188 -0
  366. package/dist/frontmatter-validation.js.map +1 -0
  367. package/dist/git.d.ts +40 -0
  368. package/dist/git.js +124 -0
  369. package/dist/git.js.map +1 -0
  370. package/dist/graph.d.ts +50 -0
  371. package/dist/graph.js +200 -0
  372. package/dist/graph.js.map +1 -0
  373. package/dist/input-selection.d.ts +9 -0
  374. package/dist/input-selection.js +122 -0
  375. package/dist/input-selection.js.map +1 -0
  376. package/dist/input.d.ts +2 -0
  377. package/dist/input.js +32 -0
  378. package/dist/input.js.map +1 -0
  379. package/dist/link-target.d.ts +39 -0
  380. package/dist/link-target.js +68 -0
  381. package/dist/link-target.js.map +1 -0
  382. package/dist/lint.d.ts +13 -0
  383. package/dist/lint.js +27 -0
  384. package/dist/lint.js.map +1 -0
  385. package/dist/markdown-ast.d.ts +73 -0
  386. package/dist/markdown-ast.js +187 -0
  387. package/dist/markdown-ast.js.map +1 -0
  388. package/dist/object-path.d.ts +14 -0
  389. package/dist/object-path.js +14 -0
  390. package/dist/object-path.js.map +1 -0
  391. package/dist/option-utils.d.ts +13 -0
  392. package/dist/option-utils.js +25 -0
  393. package/dist/option-utils.js.map +1 -0
  394. package/dist/outline.d.ts +16 -0
  395. package/dist/outline.js +32 -0
  396. package/dist/outline.js.map +1 -0
  397. package/dist/query/entities.d.ts +60 -0
  398. package/dist/query/entities.js +219 -0
  399. package/dist/query/entities.js.map +1 -0
  400. package/dist/query/execute.d.ts +22 -0
  401. package/dist/query/execute.js +0 -0
  402. package/dist/query/execute.js.map +1 -0
  403. package/dist/query/plan.d.ts +76 -0
  404. package/dist/query/plan.js +183 -0
  405. package/dist/query/plan.js.map +1 -0
  406. package/dist/query/render.d.ts +3 -0
  407. package/dist/query/render.js +39 -0
  408. package/dist/query/render.js.map +1 -0
  409. package/dist/refs.d.ts +19 -0
  410. package/dist/refs.js +10 -0
  411. package/dist/refs.js.map +1 -0
  412. package/dist/result.d.ts +49 -0
  413. package/dist/result.js +47 -0
  414. package/dist/result.js.map +1 -0
  415. package/dist/runtime.d.ts +35 -0
  416. package/dist/runtime.js +77 -0
  417. package/dist/runtime.js.map +1 -0
  418. package/dist/sarif.d.ts +36 -0
  419. package/dist/sarif.js +30 -0
  420. package/dist/sarif.js.map +1 -0
  421. package/dist/scripts/execute.d.ts +65 -0
  422. package/dist/scripts/execute.js +235 -0
  423. package/dist/scripts/execute.js.map +1 -0
  424. package/dist/scripts/registry.d.ts +55 -0
  425. package/dist/scripts/registry.js +103 -0
  426. package/dist/scripts/registry.js.map +1 -0
  427. package/dist/scripts/resolve.d.ts +90 -0
  428. package/dist/scripts/resolve.js +288 -0
  429. package/dist/scripts/resolve.js.map +1 -0
  430. package/dist/sections.d.ts +53 -0
  431. package/dist/sections.js +100 -0
  432. package/dist/sections.js.map +1 -0
  433. package/dist/serve/errors.d.ts +25 -0
  434. package/dist/serve/errors.js +45 -0
  435. package/dist/serve/errors.js.map +1 -0
  436. package/dist/serve/paths.d.ts +32 -0
  437. package/dist/serve/paths.js +71 -0
  438. package/dist/serve/paths.js.map +1 -0
  439. package/dist/serve/server.d.ts +31 -0
  440. package/dist/serve/server.js +123 -0
  441. package/dist/serve/server.js.map +1 -0
  442. package/dist/serve/tools.d.ts +19 -0
  443. package/dist/serve/tools.js +597 -0
  444. package/dist/serve/tools.js.map +1 -0
  445. package/dist/snippets.d.ts +184 -0
  446. package/dist/snippets.js +454 -0
  447. package/dist/snippets.js.map +1 -0
  448. package/dist/sqlite-store.d.ts +62 -0
  449. package/dist/sqlite-store.js +104 -0
  450. package/dist/sqlite-store.js.map +1 -0
  451. package/dist/sqlite.d.ts +59 -0
  452. package/dist/sqlite.js +51 -0
  453. package/dist/sqlite.js.map +1 -0
  454. package/dist/toc.d.ts +58 -0
  455. package/dist/toc.js +83 -0
  456. package/dist/toc.js.map +1 -0
  457. package/dist/types.d.ts +7 -0
  458. package/dist/types.js +2 -0
  459. package/dist/types.js.map +1 -0
  460. package/dist/update-notifier.d.ts +95 -0
  461. package/dist/update-notifier.js +301 -0
  462. package/dist/update-notifier.js.map +1 -0
  463. package/dist/url-cache.d.ts +14 -0
  464. package/dist/url-cache.js +70 -0
  465. package/dist/url-cache.js.map +1 -0
  466. package/dist/usage/aggregate.d.ts +107 -0
  467. package/dist/usage/aggregate.js +435 -0
  468. package/dist/usage/aggregate.js.map +1 -0
  469. package/dist/usage/db/index.d.ts +49 -0
  470. package/dist/usage/db/index.js +118 -0
  471. package/dist/usage/db/index.js.map +1 -0
  472. package/dist/usage/db/migrations.d.ts +29 -0
  473. package/dist/usage/db/migrations.js +38 -0
  474. package/dist/usage/db/migrations.js.map +1 -0
  475. package/dist/usage/db/open.d.ts +33 -0
  476. package/dist/usage/db/open.js +37 -0
  477. package/dist/usage/db/open.js.map +1 -0
  478. package/dist/usage/db/schema.d.ts +18 -0
  479. package/dist/usage/db/schema.js +147 -0
  480. package/dist/usage/db/schema.js.map +1 -0
  481. package/dist/usage/db/store.d.ts +74 -0
  482. package/dist/usage/db/store.js +280 -0
  483. package/dist/usage/db/store.js.map +1 -0
  484. package/dist/usage/events.d.ts +202 -0
  485. package/dist/usage/events.js +243 -0
  486. package/dist/usage/events.js.map +1 -0
  487. package/dist/usage/filter.d.ts +43 -0
  488. package/dist/usage/filter.js +97 -0
  489. package/dist/usage/filter.js.map +1 -0
  490. package/dist/usage/providers/antigravity.d.ts +2 -0
  491. package/dist/usage/providers/antigravity.js +431 -0
  492. package/dist/usage/providers/antigravity.js.map +1 -0
  493. package/dist/usage/providers/claude-code.d.ts +2 -0
  494. package/dist/usage/providers/claude-code.js +400 -0
  495. package/dist/usage/providers/claude-code.js.map +1 -0
  496. package/dist/usage/providers/codex.d.ts +2 -0
  497. package/dist/usage/providers/codex.js +387 -0
  498. package/dist/usage/providers/codex.js.map +1 -0
  499. package/dist/usage/providers/gemini-cli.d.ts +2 -0
  500. package/dist/usage/providers/gemini-cli.js +466 -0
  501. package/dist/usage/providers/gemini-cli.js.map +1 -0
  502. package/dist/usage/providers/index.d.ts +23 -0
  503. package/dist/usage/providers/index.js +46 -0
  504. package/dist/usage/providers/index.js.map +1 -0
  505. package/dist/usage/providers/opencode.d.ts +2 -0
  506. package/dist/usage/providers/opencode.js +422 -0
  507. package/dist/usage/providers/opencode.js.map +1 -0
  508. package/dist/usage/providers/protobuf.d.ts +35 -0
  509. package/dist/usage/providers/protobuf.js +125 -0
  510. package/dist/usage/providers/protobuf.js.map +1 -0
  511. package/dist/usage/providers/types.d.ts +74 -0
  512. package/dist/usage/providers/types.js +2 -0
  513. package/dist/usage/providers/types.js.map +1 -0
  514. package/dist/usage/scan.d.ts +54 -0
  515. package/dist/usage/scan.js +216 -0
  516. package/dist/usage/scan.js.map +1 -0
  517. package/dist/version.d.ts +2 -0
  518. package/dist/version.js +8 -0
  519. package/dist/version.js.map +1 -0
  520. package/dist/workspace-index.d.ts +39 -0
  521. package/dist/workspace-index.js +265 -0
  522. package/dist/workspace-index.js.map +1 -0
  523. package/dist/workspace.d.ts +89 -0
  524. package/dist/workspace.js +219 -0
  525. package/dist/workspace.js.map +1 -0
  526. package/package.json +92 -0
@@ -0,0 +1,184 @@
1
+ import { type MdCodeBlock } from "./markdown-ast.js";
2
+ import { type FileFingerprint } from "./workspace-index.js";
3
+ import type { PlannedEdit } from "./edit-plan.js";
4
+ /**
5
+ * The fence info-string attribute linking a block to a source region.
6
+ *
7
+ * Read from mdast `Code.meta` and never by scanning the document text. That is
8
+ * what makes a fenced example *documenting* this syntax harmless: remark parses
9
+ * an inner fence as characters inside the outer block's value rather than as a
10
+ * code node, so a documentation sample is unreachable by construction. A raw
11
+ * scan would reintroduce exactly the hazard `synchronizeToc` has to guard
12
+ * against, with no guard available on this side.
13
+ */
14
+ export declare const SNIPPET_ATTRIBUTE = "cairn:snippet";
15
+ /** The pre-rename attribute, still read so existing fences keep resolving. */
16
+ export declare const LEGACY_SNIPPET_ATTRIBUTE = "claude-cli:snippet";
17
+ /**
18
+ * A region delimiter in a source file of unknown language.
19
+ *
20
+ * Deliberately unanchored: the comment leader (`//`, `#`, `--`, `/*`, `<!--`)
21
+ * is not knowable, and whatever trails the name on the line is ignored. A
22
+ * regex rather than a substring test so that the name is captured and so that
23
+ * `cairn:snippet:startup` cannot match `…:start`.
24
+ *
25
+ * Region markers live in source files, which this command only ever reads, so
26
+ * accepting both spellings costs nothing and there is never anything to migrate.
27
+ */
28
+ export declare const REGION_MARKER: RegExp;
29
+ /** Sources above this are refused unread; a snippet is never this large. */
30
+ export declare const MAX_SOURCE_BYTES: number;
31
+ /** No fragment means the whole file. */
32
+ export type SnippetSelector = {
33
+ kind: "file";
34
+ } | {
35
+ kind: "region";
36
+ name: string;
37
+ };
38
+ /** Why a link could not be turned into an expected body, or written back. */
39
+ export type SnippetReason = "no-language" | "duplicate-attribute" | "empty-target" | "malformed-region-name" | "source-outside-root" | "source-not-found" | "source-not-a-file" | "source-too-large" | "source-binary" | "source-unreadable" | "region-missing" | "region-ambiguous" | "region-unterminated" | "region-inverted" | "not-a-fence" | "unterminated-fence" | "container-prefix" | "fence-collision";
40
+ export interface SnippetFailure {
41
+ reason: SnippetReason;
42
+ message: string;
43
+ }
44
+ /** Renders a selector the way it was written on the fence. */
45
+ export declare function describeSelector(targetPath: string, selector: SnippetSelector): string;
46
+ export type SnippetLinkParse = {
47
+ status: "unlinked";
48
+ } | ({
49
+ status: "malformed";
50
+ } & SnippetFailure) | {
51
+ status: "linked";
52
+ targetPath: string;
53
+ selector: SnippetSelector;
54
+ };
55
+ /**
56
+ * Reads a snippet link off one fence.
57
+ *
58
+ * Two substring tests for the overwhelming majority of blocks, which carry no
59
+ * link at all.
60
+ */
61
+ export declare function parseSnippetLink(block: Pick<MdCodeBlock, "lang" | "meta">): SnippetLinkParse;
62
+ /**
63
+ * Strips the longest common literal leading-whitespace prefix.
64
+ *
65
+ * A literal prefix rather than a column count: a region mixing a tab-indented
66
+ * and a space-indented line then yields an empty prefix instead of having one
67
+ * of them mangled. Blank lines become empty, never whitespace.
68
+ */
69
+ export declare function dedent(lines: readonly string[]): string[];
70
+ /**
71
+ * The comparison form, shared by the comparator and the writer.
72
+ *
73
+ * Exactly three differences are ignored, because exactly these three are
74
+ * applied by ambient tooling without an author's intent: line endings
75
+ * (`core.autocrlf`), trailing horizontal whitespace (trim-on-save), and
76
+ * trailing blank lines (final-newline rules). Everything else — reindentation,
77
+ * a renamed identifier — is genuine drift. Because `--write` emits this form,
78
+ * writing and then checking is clean by construction.
79
+ */
80
+ export declare function normalizeSnippet(value: string): string;
81
+ export type RegionExtraction = {
82
+ status: "found";
83
+ text: string;
84
+ } | ({
85
+ status: "failed";
86
+ } & SnippetFailure);
87
+ /**
88
+ * Pulls a selector's text out of a source file.
89
+ *
90
+ * When the source is itself Markdown, marker matches inside fenced code are
91
+ * skipped — the same guard `synchronizeToc` applies, for the same reason: a
92
+ * document explaining this syntax would otherwise appear to declare a region.
93
+ */
94
+ export declare function extractRegion(source: string, selector: SnippetSelector, markdownSource?: boolean): RegionExtraction;
95
+ export type SourceRead = {
96
+ status: "read";
97
+ content: string;
98
+ fingerprint: FileFingerprint;
99
+ } | ({
100
+ status: "failed";
101
+ } & SnippetFailure);
102
+ /**
103
+ * Reads a snippet source, refusing anything a document must not absorb.
104
+ *
105
+ * `md check-snippets --write` copies this content into a tracked file, so an
106
+ * unbounded read is a content-exfiltration primitive rather than a nuisance:
107
+ * a pull request naming an absolute path plus a CI refresh would commit the
108
+ * result. Neither `resolveLocalPath` nor the reference checker performs any
109
+ * containment check, because there the only leak is a boolean.
110
+ *
111
+ * Messages name no path: the caller knows the target as the author wrote it,
112
+ * and `md audit --baseline` keys on the message, so an absolute path would
113
+ * make a baseline valid on exactly one machine.
114
+ */
115
+ export declare function readSnippetSource(resolved: string, root: string): SourceRead;
116
+ /**
117
+ * A reader memoized for one run.
118
+ *
119
+ * Deliberately not `Workspace.document`: that parses as Markdown and writes
120
+ * the result into the persistent workspace index, which has no business
121
+ * holding records for source files.
122
+ */
123
+ export declare function createSourceReader(root: string): (resolved: string) => SourceRead;
124
+ /** The bytes strictly between the two fence lines, and what belongs there. */
125
+ export interface SnippetWrite {
126
+ start: number;
127
+ /** Exclusive: the first byte of the closing fence line. */
128
+ end: number;
129
+ interior: string;
130
+ }
131
+ interface SnippetLocation {
132
+ /** 1-based line of the opening fence. */
133
+ line: number;
134
+ /** 1-based line of the closing fence. */
135
+ endLine: number;
136
+ }
137
+ interface ResolvedSnippet extends SnippetLocation {
138
+ /** The attribute value as written, e.g. `src/toc.ts#render`. */
139
+ target: string;
140
+ /** Absolute path of the source file. */
141
+ source: string;
142
+ selector: SnippetSelector;
143
+ }
144
+ export type SnippetSynchronization = ({
145
+ status: "malformed";
146
+ } & SnippetLocation & SnippetFailure) | ({
147
+ status: "unresolved";
148
+ } & SnippetLocation & SnippetFailure & {
149
+ target: string;
150
+ source?: string;
151
+ selector: SnippetSelector;
152
+ }) | ({
153
+ status: "current";
154
+ } & ResolvedSnippet & {
155
+ sourceFingerprint: FileFingerprint;
156
+ }) | ({
157
+ status: "stale";
158
+ } & ResolvedSnippet & {
159
+ sourceFingerprint: FileFingerprint;
160
+ /** The body as documented today, container indentation removed. */
161
+ documented: string;
162
+ /** The body the source says it should be. */
163
+ expected: string;
164
+ /** Absent when the block cannot be rewritten in place. */
165
+ write?: SnippetWrite;
166
+ /** Why `write` is absent. */
167
+ unwritable?: SnippetFailure;
168
+ });
169
+ export interface SnippetContext {
170
+ /** Absolute path of the document the blocks came from. */
171
+ file: string;
172
+ /** Source paths resolve against this, and reads may not leave it. */
173
+ root: string;
174
+ read: (resolved: string) => SourceRead;
175
+ }
176
+ /**
177
+ * Resolves every linked block in one document, in document order.
178
+ *
179
+ * Unlinked blocks are absent from the result rather than reported as current.
180
+ */
181
+ export declare function synchronizeSnippets(content: string, blocks: readonly MdCodeBlock[], context: SnippetContext): SnippetSynchronization[];
182
+ /** Turns stale results into transactional edits, shared by the command and the fixer. */
183
+ export declare function snippetEdits(file: string, content: string, results: readonly SnippetSynchronization[]): PlannedEdit[];
184
+ export {};
@@ -0,0 +1,454 @@
1
+ import fs from "node:fs";
2
+ import { extractCodeBlocks, isLineInCodeBlock, parseMarkdown, } from "./markdown-ast.js";
3
+ import { resolveLocalPath } from "./link-target.js";
4
+ import { inside } from "./workspace.js";
5
+ import { fingerprint } from "./workspace-index.js";
6
+ /**
7
+ * The fence info-string attribute linking a block to a source region.
8
+ *
9
+ * Read from mdast `Code.meta` and never by scanning the document text. That is
10
+ * what makes a fenced example *documenting* this syntax harmless: remark parses
11
+ * an inner fence as characters inside the outer block's value rather than as a
12
+ * code node, so a documentation sample is unreachable by construction. A raw
13
+ * scan would reintroduce exactly the hazard `synchronizeToc` has to guard
14
+ * against, with no guard available on this side.
15
+ */
16
+ export const SNIPPET_ATTRIBUTE = "cairn:snippet";
17
+ /** The pre-rename attribute, still read so existing fences keep resolving. */
18
+ export const LEGACY_SNIPPET_ATTRIBUTE = "claude-cli:snippet";
19
+ /** Alternation over both spellings, for the two patterns below. */
20
+ const ATTRIBUTE_ALTERNATION = "(?:cairn|claude-cli):snippet";
21
+ /**
22
+ * A region delimiter in a source file of unknown language.
23
+ *
24
+ * Deliberately unanchored: the comment leader (`//`, `#`, `--`, `/*`, `<!--`)
25
+ * is not knowable, and whatever trails the name on the line is ignored. A
26
+ * regex rather than a substring test so that the name is captured and so that
27
+ * `cairn:snippet:startup` cannot match `…:start`.
28
+ *
29
+ * Region markers live in source files, which this command only ever reads, so
30
+ * accepting both spellings costs nothing and there is never anything to migrate.
31
+ */
32
+ export const REGION_MARKER = new RegExp(`${ATTRIBUTE_ALTERNATION}:(start|end)[ \\t]+([A-Za-z0-9][A-Za-z0-9._-]*)`);
33
+ /** Sources above this are refused unread; a snippet is never this large. */
34
+ export const MAX_SOURCE_BYTES = 2 * 1024 * 1024;
35
+ // Alternating over both spellings also makes the duplicate check right for free:
36
+ // a fence carrying one of each counts two matches, which is what it is.
37
+ const ATTRIBUTE_PATTERN = new RegExp(`(?:^|\\s)${ATTRIBUTE_ALTERNATION}=("[^"]*"|'[^']*'|\\S+)`, "g");
38
+ const REGION_NAME = /^[A-Za-z0-9][A-Za-z0-9._-]*$/;
39
+ const BLANK_LINE = /^[ \t]*$/;
40
+ const MARKDOWN_SOURCE = /\.(?:md|markdown|mdown)$/i;
41
+ function fail(reason, message) {
42
+ return { reason, message };
43
+ }
44
+ /** Renders a selector the way it was written on the fence. */
45
+ export function describeSelector(targetPath, selector) {
46
+ return selector.kind === "file" ? targetPath : `${targetPath}#${selector.name}`;
47
+ }
48
+ /**
49
+ * Reads a snippet link off one fence.
50
+ *
51
+ * Two substring tests for the overwhelming majority of blocks, which carry no
52
+ * link at all.
53
+ */
54
+ export function parseSnippetLink(block) {
55
+ // Both spellings gate the fast path, or a legacy fence would report `unlinked`
56
+ // without the regex below ever seeing it.
57
+ const carries = (text, at) => [SNIPPET_ATTRIBUTE, LEGACY_SNIPPET_ATTRIBUTE].some((attribute) => at === "start" ? text.startsWith(`${attribute}=`) : text.includes(`${attribute}=`));
58
+ if (!block.meta || !carries(block.meta, "anywhere")) {
59
+ // A fence with no language puts the whole info string into `lang`, so the
60
+ // attribute lands there and would otherwise be silently inert forever.
61
+ if (block.lang && carries(block.lang, "start")) {
62
+ return {
63
+ status: "malformed",
64
+ ...fail("no-language", `A snippet link needs a language before the attribute; write \`\`\`text ${SNIPPET_ATTRIBUTE}=…`),
65
+ };
66
+ }
67
+ return { status: "unlinked" };
68
+ }
69
+ ATTRIBUTE_PATTERN.lastIndex = 0;
70
+ const matches = [...block.meta.matchAll(ATTRIBUTE_PATTERN)];
71
+ if (!matches.length)
72
+ return { status: "unlinked" };
73
+ if (matches.length > 1) {
74
+ return {
75
+ status: "malformed",
76
+ ...fail("duplicate-attribute", `A fence may carry only one ${SNIPPET_ATTRIBUTE}= attribute`),
77
+ };
78
+ }
79
+ const raw = matches[0][1];
80
+ const value = (raw.startsWith('"') && raw.endsWith('"')) || (raw.startsWith("'") && raw.endsWith("'"))
81
+ ? raw.slice(1, -1)
82
+ : raw;
83
+ // The first `#`, not the last: a region name may not contain one, but a path
84
+ // theoretically may, and splitting late would silently mangle it.
85
+ const hash = value.indexOf("#");
86
+ const targetPath = hash === -1 ? value : value.slice(0, hash);
87
+ const fragment = hash === -1 ? "" : value.slice(hash + 1);
88
+ if (!targetPath) {
89
+ return { status: "malformed", ...fail("empty-target", `${SNIPPET_ATTRIBUTE}= needs a path`) };
90
+ }
91
+ if (hash !== -1 && !REGION_NAME.test(fragment)) {
92
+ return {
93
+ status: "malformed",
94
+ ...fail("malformed-region-name", `Not a valid region name: ${fragment || "(empty)"}`),
95
+ };
96
+ }
97
+ return {
98
+ status: "linked",
99
+ targetPath,
100
+ selector: fragment ? { kind: "region", name: fragment } : { kind: "file" },
101
+ };
102
+ }
103
+ // ---------------------------------------------------------------------------
104
+ // Region extraction
105
+ // ---------------------------------------------------------------------------
106
+ /**
107
+ * Strips the longest common literal leading-whitespace prefix.
108
+ *
109
+ * A literal prefix rather than a column count: a region mixing a tab-indented
110
+ * and a space-indented line then yields an empty prefix instead of having one
111
+ * of them mangled. Blank lines become empty, never whitespace.
112
+ */
113
+ export function dedent(lines) {
114
+ const indents = lines
115
+ .filter((line) => !BLANK_LINE.test(line))
116
+ .map((line) => /^[ \t]*/.exec(line)[0]);
117
+ if (!indents.length)
118
+ return lines.map(() => "");
119
+ let prefix = indents[0];
120
+ for (const indent of indents) {
121
+ let index = 0;
122
+ while (index < prefix.length && index < indent.length && prefix[index] === indent[index]) {
123
+ index++;
124
+ }
125
+ prefix = prefix.slice(0, index);
126
+ if (!prefix)
127
+ break;
128
+ }
129
+ return lines.map((line) => (BLANK_LINE.test(line) ? "" : line.slice(prefix.length)));
130
+ }
131
+ /**
132
+ * The comparison form, shared by the comparator and the writer.
133
+ *
134
+ * Exactly three differences are ignored, because exactly these three are
135
+ * applied by ambient tooling without an author's intent: line endings
136
+ * (`core.autocrlf`), trailing horizontal whitespace (trim-on-save), and
137
+ * trailing blank lines (final-newline rules). Everything else — reindentation,
138
+ * a renamed identifier — is genuine drift. Because `--write` emits this form,
139
+ * writing and then checking is clean by construction.
140
+ */
141
+ export function normalizeSnippet(value) {
142
+ return value
143
+ .replace(/\r\n?/g, "\n")
144
+ .replace(/[ \t]+$/gm, "")
145
+ .replace(/\n+$/, "");
146
+ }
147
+ /**
148
+ * Pulls a selector's text out of a source file.
149
+ *
150
+ * When the source is itself Markdown, marker matches inside fenced code are
151
+ * skipped — the same guard `synchronizeToc` applies, for the same reason: a
152
+ * document explaining this syntax would otherwise appear to declare a region.
153
+ */
154
+ export function extractRegion(source, selector, markdownSource = false) {
155
+ const normalized = source.replace(/\r\n?/g, "\n");
156
+ const lines = normalized ? normalized.replace(/\n$/, "").split("\n") : [];
157
+ const fenced = markdownSource ? extractCodeBlocks(parseMarkdown(source)) : [];
158
+ const markers = [];
159
+ lines.forEach((line, index) => {
160
+ const match = REGION_MARKER.exec(line);
161
+ if (!match)
162
+ return;
163
+ if (markdownSource && isLineInCodeBlock(index + 1, fenced))
164
+ return;
165
+ markers.push({ index, kind: match[1], name: match[2] });
166
+ });
167
+ let from = 0;
168
+ let to = lines.length;
169
+ if (selector.kind === "region") {
170
+ const starts = markers.filter((m) => m.kind === "start" && m.name === selector.name);
171
+ const ends = markers.filter((m) => m.kind === "end" && m.name === selector.name);
172
+ if (!starts.length && !ends.length) {
173
+ return { status: "failed", ...fail("region-missing", `No region named ${selector.name}`) };
174
+ }
175
+ if (starts.length > 1 || ends.length > 1) {
176
+ return {
177
+ status: "failed",
178
+ ...fail("region-ambiguous", `Region ${selector.name} is declared more than once`),
179
+ };
180
+ }
181
+ if (!starts.length) {
182
+ return {
183
+ status: "failed",
184
+ ...fail("region-missing", `Region ${selector.name} has an end marker but no start marker`),
185
+ };
186
+ }
187
+ if (!ends.length) {
188
+ return {
189
+ status: "failed",
190
+ ...fail("region-unterminated", `Region ${selector.name} has no end marker`),
191
+ };
192
+ }
193
+ if (ends[0].index < starts[0].index) {
194
+ return {
195
+ status: "failed",
196
+ ...fail("region-inverted", `Region ${selector.name} ends before it starts`),
197
+ };
198
+ }
199
+ from = starts[0].index + 1;
200
+ to = ends[0].index;
201
+ }
202
+ // Marker lines are dropped before the dedent, so a nested region's own
203
+ // indentation cannot skew the common prefix — and its scaffolding never
204
+ // reaches the documentation.
205
+ const dropped = new Set(markers.map((marker) => marker.index));
206
+ const body = lines.slice(from, to).filter((_, offset) => !dropped.has(from + offset));
207
+ while (body.length && BLANK_LINE.test(body[0]))
208
+ body.shift();
209
+ while (body.length && BLANK_LINE.test(body[body.length - 1]))
210
+ body.pop();
211
+ return { status: "found", text: dedent(body).join("\n") };
212
+ }
213
+ /**
214
+ * Reads a snippet source, refusing anything a document must not absorb.
215
+ *
216
+ * `md check-snippets --write` copies this content into a tracked file, so an
217
+ * unbounded read is a content-exfiltration primitive rather than a nuisance:
218
+ * a pull request naming an absolute path plus a CI refresh would commit the
219
+ * result. Neither `resolveLocalPath` nor the reference checker performs any
220
+ * containment check, because there the only leak is a boolean.
221
+ *
222
+ * Messages name no path: the caller knows the target as the author wrote it,
223
+ * and `md audit --baseline` keys on the message, so an absolute path would
224
+ * make a baseline valid on exactly one machine.
225
+ */
226
+ export function readSnippetSource(resolved, root) {
227
+ let real;
228
+ try {
229
+ real = fs.realpathSync(resolved);
230
+ }
231
+ catch {
232
+ return { status: "failed", ...fail("source-not-found", "Source file not found") };
233
+ }
234
+ // Resolved on both sides, so a symlinked directory cannot be the way out.
235
+ let realRoot = root;
236
+ try {
237
+ realRoot = fs.realpathSync(root);
238
+ }
239
+ catch {
240
+ // An unresolvable root can only make the check stricter.
241
+ }
242
+ if (!inside(realRoot, real)) {
243
+ return {
244
+ status: "failed",
245
+ ...fail("source-outside-root", "Source file is outside the workspace root"),
246
+ };
247
+ }
248
+ let stat;
249
+ try {
250
+ stat = fs.lstatSync(real);
251
+ }
252
+ catch {
253
+ return {
254
+ status: "failed",
255
+ ...fail("source-unreadable", "Source file is unreadable"),
256
+ };
257
+ }
258
+ // A FIFO or a character device would block the read forever, leaving a CI
259
+ // job wedged with no output at all.
260
+ if (!stat.isFile()) {
261
+ return {
262
+ status: "failed",
263
+ ...fail("source-not-a-file", "Source path is not a regular file"),
264
+ };
265
+ }
266
+ if (stat.size > MAX_SOURCE_BYTES) {
267
+ return {
268
+ status: "failed",
269
+ ...fail("source-too-large", `Source file is larger than ${MAX_SOURCE_BYTES} bytes`),
270
+ };
271
+ }
272
+ let buffer;
273
+ try {
274
+ buffer = fs.readFileSync(real);
275
+ }
276
+ catch {
277
+ return {
278
+ status: "failed",
279
+ ...fail("source-unreadable", "Source file is unreadable"),
280
+ };
281
+ }
282
+ // A lossy utf-8 decode would otherwise write U+FFFD into the document.
283
+ if (buffer.subarray(0, 8192).includes(0)) {
284
+ return { status: "failed", ...fail("source-binary", "Source file is not text") };
285
+ }
286
+ // A byte-order mark would become a permanent, invisible difference.
287
+ const content = buffer.toString("utf-8").replace(/^\uFEFF/, "");
288
+ return { status: "read", content, fingerprint: fingerprint(real) };
289
+ }
290
+ /**
291
+ * A reader memoized for one run.
292
+ *
293
+ * Deliberately not `Workspace.document`: that parses as Markdown and writes
294
+ * the result into the persistent workspace index, which has no business
295
+ * holding records for source files.
296
+ */
297
+ export function createSourceReader(root) {
298
+ const cache = new Map();
299
+ return (resolved) => {
300
+ const cached = cache.get(resolved);
301
+ if (cached)
302
+ return cached;
303
+ const read = readSnippetSource(resolved, root);
304
+ cache.set(resolved, read);
305
+ return read;
306
+ };
307
+ }
308
+ /**
309
+ * Where a refreshed body would go, and whether it can go there at all.
310
+ *
311
+ * The range is the interior only, so the fence line is never rewritten and its
312
+ * info string — including attributes owned by some other toolchain — survives
313
+ * byte for byte at no cost.
314
+ */
315
+ function planWrite(content, block, body) {
316
+ const raw = content.slice(block.start, block.end);
317
+ const fence = /^(`{3,}|~{3,})/.exec(raw);
318
+ // An indented code block is a `code` node too, and has no fence to write into.
319
+ if (!fence)
320
+ return fail("not-a-fence", "Only fenced code blocks can be refreshed");
321
+ const fenceChar = fence[1][0];
322
+ const fenceLength = fence[1].length;
323
+ const lineStart = content.lastIndexOf("\n", block.start - 1) + 1;
324
+ const indent = content.slice(lineStart, block.start);
325
+ // Whitespace admits a fence indented inside a list item and refuses one in a
326
+ // blockquote: mdast reports a dedented value, but the raw lines carry the
327
+ // `> ` prefix, so writing without it would break the fence out of its quote.
328
+ if (!BLANK_LINE.test(indent)) {
329
+ return fail("container-prefix", "Fence is nested in a container this command cannot rewrite");
330
+ }
331
+ const openNewline = content.indexOf("\n", block.start);
332
+ if (openNewline === -1 || openNewline >= block.end) {
333
+ return fail("unterminated-fence", "Fence has no body");
334
+ }
335
+ const start = openNewline + 1;
336
+ const end = content.lastIndexOf("\n", block.end - 1) + 1;
337
+ const closing = content.slice(end, block.end);
338
+ // A fence closed by end-of-file has no closing line; inserting one would
339
+ // change the document's structure rather than refresh a snippet.
340
+ // Neither fence character is a regular-expression metacharacter.
341
+ const closingPattern = new RegExp(`^[ \\t]*${fenceChar}{${fenceLength},}[ \\t]*$`);
342
+ if (end < start || !closingPattern.test(closing)) {
343
+ return fail("unterminated-fence", "Fence is not closed by a matching fence line");
344
+ }
345
+ if (indent && !closing.startsWith(indent)) {
346
+ return fail("container-prefix", "Opening and closing fences are indented differently");
347
+ }
348
+ for (const line of content.slice(start, end).split("\n").slice(0, -1)) {
349
+ if (!BLANK_LINE.test(line) && indent && !line.startsWith(indent)) {
350
+ return fail("container-prefix", "Fence body is not uniformly indented");
351
+ }
352
+ }
353
+ const lines = body === "" ? [] : body.split("\n");
354
+ if (lines.some((line) => closingPattern.test(line))) {
355
+ return fail("fence-collision", `Source contains a line that would close the ${fenceLength}-character fence`);
356
+ }
357
+ const eol = content.includes("\r\n") ? "\r\n" : "\n";
358
+ const interior = lines.map((line) => (line ? indent + line : "")).join(eol) + (lines.length ? eol : "");
359
+ return { start, end, interior };
360
+ }
361
+ /**
362
+ * Resolves every linked block in one document, in document order.
363
+ *
364
+ * Unlinked blocks are absent from the result rather than reported as current.
365
+ */
366
+ export function synchronizeSnippets(content, blocks, context) {
367
+ const results = [];
368
+ for (const block of blocks) {
369
+ const parsed = parseSnippetLink(block);
370
+ if (parsed.status === "unlinked")
371
+ continue;
372
+ const at = { line: block.line, endLine: block.endLine };
373
+ if (parsed.status === "malformed") {
374
+ results.push({ status: "malformed", ...at, reason: parsed.reason, message: parsed.message });
375
+ continue;
376
+ }
377
+ const { targetPath, selector } = parsed;
378
+ const target = describeSelector(targetPath, selector);
379
+ const resolved = resolveLocalPath(context.file, targetPath, context.root);
380
+ const read = context.read(resolved);
381
+ if (read.status === "failed") {
382
+ results.push({
383
+ status: "unresolved",
384
+ ...at,
385
+ target,
386
+ selector,
387
+ reason: read.reason,
388
+ message: `${read.message}: ${targetPath}`,
389
+ });
390
+ continue;
391
+ }
392
+ const region = extractRegion(read.content, selector, MARKDOWN_SOURCE.test(resolved));
393
+ if (region.status === "failed") {
394
+ results.push({
395
+ status: "unresolved",
396
+ ...at,
397
+ target,
398
+ source: resolved,
399
+ selector,
400
+ reason: region.reason,
401
+ message: `${region.message} in ${targetPath}`,
402
+ });
403
+ continue;
404
+ }
405
+ const expected = normalizeSnippet(region.text);
406
+ const documented = normalizeSnippet(block.value);
407
+ const common = {
408
+ ...at,
409
+ target,
410
+ source: resolved,
411
+ selector,
412
+ sourceFingerprint: read.fingerprint,
413
+ };
414
+ if (documented === expected) {
415
+ results.push({ status: "current", ...common });
416
+ continue;
417
+ }
418
+ const write = planWrite(content, block, expected);
419
+ results.push({
420
+ status: "stale",
421
+ ...common,
422
+ documented,
423
+ expected,
424
+ ...("interior" in write ? { write } : { unwritable: write }),
425
+ });
426
+ }
427
+ return results;
428
+ }
429
+ /** Turns stale results into transactional edits, shared by the command and the fixer. */
430
+ export function snippetEdits(file, content, results) {
431
+ const edits = [];
432
+ for (const result of results) {
433
+ if (result.status !== "stale" || !result.write)
434
+ continue;
435
+ const { start, end, interior } = result.write;
436
+ edits.push({
437
+ file,
438
+ start,
439
+ end,
440
+ value: interior,
441
+ // Kept free of line numbers so `md audit --baseline`, which keys on
442
+ // checker, file, and message, does not go stale on an unrelated edit.
443
+ expected: content.slice(start, end),
444
+ replacement: interior,
445
+ diagnostic: {
446
+ rule: "snippets",
447
+ line: result.line,
448
+ message: `Snippet is out of date with ${result.target}`,
449
+ },
450
+ });
451
+ }
452
+ return edits;
453
+ }
454
+ //# sourceMappingURL=snippets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snippets.js","sourceRoot":"","sources":["../src/snippets.ts"],"names":[],"mappings":"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"}