@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,325 @@
1
+ import path from "node:path";
2
+ import fs from "node:fs";
3
+ import { minimatch } from "minimatch";
4
+ import { lintFile } from "../lint.js";
5
+ import { buildWorkspaceGraph } from "../graph.js";
6
+ import { FrontmatterValidator } from "../frontmatter-validation.js";
7
+ import { tocSynchronizationIssue } from "./toc.js";
8
+ import { checkUrlOccurrences } from "./check-urls.js";
9
+ import { outputPath, runtime } from "../runtime.js";
10
+ import { requireDirectory } from "../input.js";
11
+ import { terminate } from "../command-result.js";
12
+ import { formatDiagnostics } from "../automation.js";
13
+ import { changedMarkdownFiles } from "../input-selection.js";
14
+ import { extractCodeBlocks } from "../markdown-ast.js";
15
+ import { createSourceReader, synchronizeSnippets } from "../snippets.js";
16
+ import { jsonPayload } from "../result.js";
17
+ import { packageName, packageVersion } from "../version.js";
18
+ import { applyBaseline, buildBaseline, readBaseline, writeBaseline, } from "../audit-baseline.js";
19
+ async function concurrent(items, limit, fn) {
20
+ const results = new Array(items.length);
21
+ let next = 0;
22
+ const worker = async () => {
23
+ while (next < items.length) {
24
+ const index = next++;
25
+ results[index] = await fn(items[index]);
26
+ }
27
+ };
28
+ await Promise.all(Array.from({ length: Math.min(Math.max(1, limit), items.length) }, worker));
29
+ return results;
30
+ }
31
+ function graphFindings(graph) {
32
+ return [
33
+ ...graph.broken.map((edge) => ({
34
+ file: edge.source,
35
+ line: edge.line,
36
+ checker: "graph/broken",
37
+ message: `Markdown target not found: ${edge.target}`,
38
+ })),
39
+ ...graph.unreachable.map((file) => ({
40
+ file,
41
+ line: 1,
42
+ checker: "graph/unreachable",
43
+ message: "Document is unreachable from configured entry points",
44
+ })),
45
+ ];
46
+ }
47
+ /**
48
+ * Snippet drift, reported but never repaired.
49
+ *
50
+ * The checker names are prefixed `snippets/` so the audit category derived
51
+ * from the checker matches the `enabled` entry. Messages carry the target as
52
+ * the author wrote it and no line number, because `--baseline` keys on
53
+ * checker, workspace-relative path, and message.
54
+ */
55
+ function snippetFindings(files) {
56
+ const root = runtime().config.root;
57
+ const read = createSourceReader(root);
58
+ const issues = [];
59
+ for (const file of files) {
60
+ const document = runtime().workspace.document(file);
61
+ const results = synchronizeSnippets(document.content, extractCodeBlocks(document.tree), {
62
+ file,
63
+ root,
64
+ read,
65
+ });
66
+ for (const result of results) {
67
+ if (result.status === "current")
68
+ continue;
69
+ if (result.status === "stale") {
70
+ issues.push({
71
+ file,
72
+ line: result.line,
73
+ checker: "snippets/drift",
74
+ message: `Snippet is out of date with ${result.target}`,
75
+ });
76
+ continue;
77
+ }
78
+ const kind = result.reason.startsWith("source-")
79
+ ? "source"
80
+ : result.reason.startsWith("region-")
81
+ ? "region"
82
+ : "meta";
83
+ issues.push({
84
+ file,
85
+ line: result.line,
86
+ checker: `snippets/${kind}`,
87
+ message: result.message,
88
+ });
89
+ }
90
+ }
91
+ return issues;
92
+ }
93
+ export async function auditAction(directory, opts) {
94
+ const dir = requireDirectory(directory, opts);
95
+ let files = runtime().workspace.markdownFiles(dir, {
96
+ include: opts.include,
97
+ exclude: opts.exclude,
98
+ });
99
+ if (opts.changedSince) {
100
+ const changed = new Set(changedMarkdownFiles(opts.changedSince));
101
+ files = files.filter((file) => changed.has(file));
102
+ }
103
+ const enabled = [];
104
+ const skipped = [];
105
+ let findings = [];
106
+ const lintNames = [
107
+ ["markdownlint", opts.style],
108
+ ["mermaid", opts.mermaid],
109
+ ["katex", opts.katex],
110
+ ["references", opts.references],
111
+ ];
112
+ for (const [name, active] of lintNames)
113
+ (active ? enabled : skipped).push(name);
114
+ const lintResults = await concurrent(files, parseInt(opts.concurrency, 10) || 1, (file) => lintFile(file, {
115
+ style: opts.style,
116
+ mermaid: opts.mermaid,
117
+ katex: opts.katex,
118
+ references: opts.references,
119
+ }));
120
+ findings.push(...lintResults.flat());
121
+ let graph;
122
+ if (opts.graph) {
123
+ enabled.push("graph");
124
+ const entries = opts.entry.map((entry) => path.resolve(entry));
125
+ for (const entry of entries) {
126
+ if (!fs.existsSync(entry) || !fs.statSync(entry).isFile()) {
127
+ throw new Error(`Entry point not found: ${entry}`);
128
+ }
129
+ }
130
+ graph = buildWorkspaceGraph(runtime().workspace, files, entries);
131
+ const graphIssues = graphFindings(graph);
132
+ const duplicate = new Set(graph.broken.map((edge) => `${edge.source}\0${edge.line}\0${edge.target}`));
133
+ findings = findings.filter((issue) => {
134
+ const target = issue.message.replace(/^Link target not found: /, "");
135
+ return !(issue.checker === "ref/link" && duplicate.has(`${issue.file}\0${issue.line}\0${target}`));
136
+ });
137
+ findings.push(...graphIssues);
138
+ }
139
+ else
140
+ skipped.push("graph");
141
+ const hasFrontmatter = Boolean(runtime().config.frontmatter.schema) ||
142
+ Object.values(runtime().config.frontmatter.rules).some((value) => Array.isArray(value) ? value.length : Object.keys(value).length);
143
+ if (opts.frontmatter && hasFrontmatter) {
144
+ enabled.push("frontmatter");
145
+ findings.push(...new FrontmatterValidator(runtime().config.frontmatter.rules, runtime().config.frontmatter.schema).validateMany(files.map((file) => runtime().workspace.document(file))));
146
+ }
147
+ else
148
+ skipped.push("frontmatter");
149
+ if (opts.toc && runtime().config.toc.files.length) {
150
+ enabled.push("toc");
151
+ for (const file of files) {
152
+ const relative = path.relative(runtime().config.root, file).split(path.sep).join("/");
153
+ if (!runtime().config.toc.files.some((pattern) => minimatch(relative, pattern, { dot: true, nonegate: true })))
154
+ continue;
155
+ const result = tocSynchronizationIssue(file, opts);
156
+ if (result.malformed)
157
+ throw new Error(`${file}: ${result.malformed}`);
158
+ if (!result.current)
159
+ findings.push({ file, line: 1, checker: "toc", message: result.issue });
160
+ }
161
+ }
162
+ else
163
+ skipped.push("toc");
164
+ if (opts.snippets) {
165
+ enabled.push("snippets");
166
+ findings.push(...snippetFindings(files));
167
+ }
168
+ else
169
+ skipped.push("snippets");
170
+ if (opts.external) {
171
+ enabled.push("external");
172
+ const occurrences = files.flatMap((file) => runtime()
173
+ .workspace.document(file)
174
+ .references.filter((ref) => ref.isExternal &&
175
+ /^https?:/i.test(ref.target) &&
176
+ !runtime().config.urls.ignore.some((pattern) => minimatch(ref.target, pattern, { nonegate: true })) &&
177
+ !runtime().config.urls.ignoreDomains.some((domain) => {
178
+ try {
179
+ const host = new URL(ref.target).hostname.toLowerCase();
180
+ const normalized = domain.toLowerCase().replace(/^\*\./, "");
181
+ return host === normalized || host.endsWith(`.${normalized}`);
182
+ }
183
+ catch {
184
+ return false;
185
+ }
186
+ }))
187
+ .map((ref) => ({ file, line: ref.line, url: ref.target })));
188
+ const results = await checkUrlOccurrences(occurrences, {
189
+ timeout: parseInt(opts.timeout, 10) || 5000,
190
+ concurrency: parseInt(opts.concurrency, 10) || 5,
191
+ retries: parseInt(opts.retry, 10) || 0,
192
+ allowedStatuses: runtime().config.urls.allowedStatuses,
193
+ headFallbackStatuses: runtime().config.urls.headFallbackStatuses,
194
+ cache: runtime().config.urls.cache,
195
+ cacheTtl: runtime().config.urls.cacheTtl,
196
+ });
197
+ findings.push(...results
198
+ .filter((result) => !result.ok)
199
+ .map((result) => ({
200
+ file: result.file,
201
+ line: result.line,
202
+ checker: "external",
203
+ message: `${result.url}: ${result.status ?? result.error ?? "request failed"}`,
204
+ })));
205
+ }
206
+ else
207
+ skipped.push("external");
208
+ findings.sort((a, b) => a.checker.localeCompare(b.checker) || a.file.localeCompare(b.file) || a.line - b.line);
209
+ const root = runtime().config.root;
210
+ if (opts.writeBaseline) {
211
+ // Recording is a separate act from checking: writing the file a run is
212
+ // simultaneously being judged against has no meaning.
213
+ if (opts.baseline)
214
+ throw new Error("--baseline and --write-baseline cannot be combined");
215
+ writeBaseline(opts.writeBaseline, buildBaseline(findings, root, { name: packageName, version: packageVersion }));
216
+ process.stdout.write(`Wrote ${findings.length} baseline entr${findings.length === 1 ? "y" : "ies"} to ${opts.writeBaseline}\n`);
217
+ return;
218
+ }
219
+ let baseline;
220
+ if (opts.baseline) {
221
+ const applied = applyBaseline(findings, readBaseline(opts.baseline), root);
222
+ if (applied.foreign) {
223
+ findings.push({
224
+ file: path.resolve(opts.baseline),
225
+ line: 1,
226
+ checker: "baseline",
227
+ message: "Not a cairn-md-audit-baseline document; no findings were suppressed",
228
+ });
229
+ findings.sort((a, b) => a.checker.localeCompare(b.checker) || a.file.localeCompare(b.file) || a.line - b.line);
230
+ }
231
+ else {
232
+ findings = applied.kept;
233
+ }
234
+ baseline = {
235
+ path: outputPath(path.resolve(opts.baseline), opts),
236
+ suppressed: applied.suppressed,
237
+ stale: applied.stale,
238
+ };
239
+ }
240
+ const shown = findings.map((issue) => ({ ...issue, file: outputPath(issue.file, opts) }));
241
+ const byCheck = Object.fromEntries(enabled.map((check) => [check, 0]));
242
+ const byFile = {};
243
+ for (const issue of shown) {
244
+ const rawCategory = issue.checker.split("/")[0];
245
+ const category = rawCategory === "ref" ? "references" : rawCategory;
246
+ byCheck[category] = (byCheck[category] ?? 0) + 1;
247
+ byFile[issue.file] = (byFile[issue.file] ?? 0) + 1;
248
+ }
249
+ const result = {
250
+ directory: outputPath(dir, opts),
251
+ enabled,
252
+ skipped,
253
+ totals: {
254
+ files: files.length,
255
+ findings: shown.length,
256
+ filesWithFindings: Object.keys(byFile).length,
257
+ byCheck,
258
+ byFile,
259
+ },
260
+ findings: shown,
261
+ ...(baseline ? { baseline } : {}),
262
+ ...(graph
263
+ ? {
264
+ graph: {
265
+ nodes: graph.nodes.length,
266
+ edges: graph.edges.length,
267
+ broken: graph.broken.length,
268
+ unreachable: graph.unreachable.length,
269
+ deadEnds: graph.nodes.filter((node) => node.deadEnd).length,
270
+ components: graph.components.length,
271
+ cycles: graph.cycles.length,
272
+ reachabilityEvaluated: graph.reachabilityEvaluated,
273
+ },
274
+ }
275
+ : {}),
276
+ };
277
+ // One value decides the payload counts, the stream, and the exit code.
278
+ // Reading `findings` for the stream while the payload counted `shown` was a
279
+ // latent split that baseline suppression would have turned into a real bug.
280
+ const actionable = shown.length;
281
+ // Suppression and staleness are described, never judged: a stale entry means
282
+ // something was fixed, which must not fail a build.
283
+ const baselineLines = baseline
284
+ ? [
285
+ `Baseline: ${baseline.suppressed} suppressed, ${baseline.stale.length} stale (${baseline.path})`,
286
+ ]
287
+ : [];
288
+ let payload;
289
+ if (opts.format === "json")
290
+ payload = jsonPayload("md audit", result, opts, {
291
+ exitCode: actionable ? 2 : 0,
292
+ summary: {
293
+ findings: actionable,
294
+ files: result.totals.files,
295
+ ...(baseline ? { suppressed: baseline.suppressed } : {}),
296
+ },
297
+ }).trimEnd();
298
+ else if (opts.format === "jsonl" || opts.format === "sarif")
299
+ payload = formatDiagnostics(shown, opts.format, {
300
+ files: files.length,
301
+ findings: actionable,
302
+ enabled,
303
+ skipped,
304
+ ...(baseline ? { suppressed: baseline.suppressed } : {}),
305
+ });
306
+ else if (opts.summary)
307
+ payload = [
308
+ `Audit: ${result.totals.files} file(s), ${result.totals.findings} finding(s)`,
309
+ ...baselineLines,
310
+ ...Object.entries(byCheck).map(([check, count]) => ` ${check}: ${count}`),
311
+ ...Object.entries(byFile).map(([file, count]) => ` ${file}: ${count}`),
312
+ ].join("\n");
313
+ else
314
+ payload = (actionable
315
+ ? [
316
+ `${actionable} audit finding(s) in ${result.directory}:`,
317
+ ...shown.map((issue) => ` ${issue.file}:${issue.line} [${issue.checker}] ${issue.message}`),
318
+ ...baselineLines,
319
+ ]
320
+ : [`Audit passed for ${files.length} file(s) in ${result.directory}`, ...baselineLines]).join("\n");
321
+ (actionable ? process.stderr : process.stdout).write(payload + "\n");
322
+ if (actionable)
323
+ terminate(2);
324
+ }
325
+ //# sourceMappingURL=audit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/commands/audit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ import { type SnippetReason } from "../snippets.js";
2
+ export type CheckSnippetsMode = "check" | "dry-run" | "write";
3
+ interface CheckSnippetsOptions {
4
+ envelope?: boolean;
5
+ format: string;
6
+ paths?: string;
7
+ check?: boolean;
8
+ write?: boolean;
9
+ dryRun?: boolean;
10
+ includeOk: boolean;
11
+ include: string[];
12
+ exclude: string[];
13
+ }
14
+ export interface SnippetFindingJson {
15
+ file: string;
16
+ /** 1-based line of the opening fence. */
17
+ line: number;
18
+ endLine: number;
19
+ status: "current" | "stale" | "unresolved" | "malformed";
20
+ /** The attribute value as written. Absent when it could not be parsed. */
21
+ target?: string;
22
+ /** Absolute or relative per --paths. Absent until the path resolves. */
23
+ source?: string;
24
+ /** Present on everything except a clean match. */
25
+ reason?: SnippetReason;
26
+ message?: string;
27
+ /** --dry-run only: the two bodies, container indentation removed. */
28
+ documented?: string;
29
+ expected?: string;
30
+ /** Stale blocks outside --check: false when the fence cannot be rewritten. */
31
+ writable?: boolean;
32
+ /** --write only: whether this block's bytes changed. */
33
+ applied?: boolean;
34
+ }
35
+ export interface CheckSnippetsPayload {
36
+ mode: CheckSnippetsMode;
37
+ filesScanned: number;
38
+ /** Fences carrying a snippet link. An unlinked fence is never counted. */
39
+ linked: number;
40
+ current: number;
41
+ drift: number;
42
+ unresolved: number;
43
+ malformed: number;
44
+ /** Stale blocks the fence cannot accept. Always 0 under --check. */
45
+ unwritable: number;
46
+ /** Files whose bytes changed. Always 0 outside --write. */
47
+ applied: number;
48
+ /** `current` entries appear only under --include-ok. */
49
+ findings: SnippetFindingJson[];
50
+ conflicts: Array<{
51
+ kind: string;
52
+ file: string;
53
+ message: string;
54
+ rules: string[];
55
+ }>;
56
+ }
57
+ export declare function checkSnippetsAction(inputs: string[], opts: CheckSnippetsOptions): Promise<void>;
58
+ export {};
@@ -0,0 +1,247 @@
1
+ import { applyPlan, buildPlan, containmentRoot, snapshot, } from "../edit-plan.js";
2
+ import { extractCodeBlocks, parseMarkdown } from "../markdown-ast.js";
3
+ import { createSourceReader, snippetEdits, synchronizeSnippets, } from "../snippets.js";
4
+ import { fingerprint } from "../workspace-index.js";
5
+ import { resolveMarkdownInputs } from "../input-selection.js";
6
+ import { outputPath, runtime } from "../runtime.js";
7
+ import { terminate } from "../command-result.js";
8
+ import { jsonPayload } from "../result.js";
9
+ function resolveFormat(opts) {
10
+ const fmt = opts.format;
11
+ if (fmt === "llm" || fmt === "human" || fmt === "json")
12
+ return fmt;
13
+ return "llm";
14
+ }
15
+ /**
16
+ * Which of check, dry-run, and write was asked for.
17
+ *
18
+ * A plain guard is enough, as in `md fix`: those three keys are deliberately
19
+ * absent from `COMMAND_OPTIONS["check-snippets"]`, so a checked-in config can
20
+ * never turn this checker into a writer and there is no config-versus-CLI
21
+ * ambiguity to disentangle. That rule matters more here than anywhere else,
22
+ * because `--write` copies the contents of arbitrary source files into tracked
23
+ * documents.
24
+ */
25
+ function resolveMode(opts) {
26
+ const requested = [
27
+ ["check", opts.check],
28
+ ["write", opts.write],
29
+ ["dry-run", opts.dryRun],
30
+ ]
31
+ .filter(([, enabled]) => enabled)
32
+ .map(([name]) => name);
33
+ if (requested.length > 1) {
34
+ throw new Error("--check, --write, and --dry-run cannot be used together");
35
+ }
36
+ return requested[0] ?? "check";
37
+ }
38
+ function truncate(value, limit = 120) {
39
+ const flat = value.replace(/\n/g, "\\n");
40
+ return flat.length > limit ? `${flat.slice(0, limit)}…` : flat;
41
+ }
42
+ function toFinding(file, result, mode, applied, opts) {
43
+ const base = {
44
+ file: outputPath(file, opts),
45
+ line: result.line,
46
+ endLine: result.endLine,
47
+ };
48
+ if (result.status === "malformed") {
49
+ return { ...base, status: "malformed", reason: result.reason, message: result.message };
50
+ }
51
+ if (result.status === "unresolved") {
52
+ return {
53
+ ...base,
54
+ status: "unresolved",
55
+ target: result.target,
56
+ ...(result.source ? { source: outputPath(result.source, opts) } : {}),
57
+ reason: result.reason,
58
+ message: result.message,
59
+ };
60
+ }
61
+ if (result.status === "current") {
62
+ return {
63
+ ...base,
64
+ status: "current",
65
+ target: result.target,
66
+ source: outputPath(result.source, opts),
67
+ };
68
+ }
69
+ return {
70
+ ...base,
71
+ status: "stale",
72
+ target: result.target,
73
+ source: outputPath(result.source, opts),
74
+ ...(result.unwritable && mode !== "check"
75
+ ? { reason: result.unwritable.reason, message: result.unwritable.message }
76
+ : {}),
77
+ ...(mode === "dry-run" ? { documented: result.documented, expected: result.expected } : {}),
78
+ ...(mode === "check" ? {} : { writable: Boolean(result.write) }),
79
+ ...(applied ? { applied: applied.has(file) && Boolean(result.write) } : {}),
80
+ };
81
+ }
82
+ function renderText(payload, human) {
83
+ const bold = (value) => (human ? `\x1b[1m${value}\x1b[0m` : value);
84
+ const red = (value) => (human ? `\x1b[31m${value}\x1b[0m` : value);
85
+ const green = (value) => (human ? `\x1b[32m${value}\x1b[0m` : value);
86
+ const cyan = (value) => (human ? `\x1b[36m${value}\x1b[0m` : value);
87
+ const lines = [];
88
+ const headline = payload.mode === "write"
89
+ ? payload.applied
90
+ ? `Refreshed ${payload.applied} file(s) of ${payload.linked} linked snippet(s).`
91
+ : `Nothing to refresh in ${payload.linked} linked snippet(s).`
92
+ : payload.drift + payload.unresolved + payload.malformed
93
+ ? bold(`${payload.drift} stale, ${payload.unresolved} unresolved, ${payload.malformed} malformed ` +
94
+ `of ${payload.linked} linked snippet(s) in ${payload.filesScanned} file(s)`)
95
+ : `${payload.linked} linked snippet(s) up to date in ${payload.filesScanned} file(s)`;
96
+ for (const finding of payload.findings) {
97
+ const where = cyan(`${finding.file}:L${finding.line}`);
98
+ if (finding.status === "current") {
99
+ lines.push(` ${where} ok ${finding.target}`);
100
+ continue;
101
+ }
102
+ if (finding.status === "stale") {
103
+ const suffix = finding.writable === false ? ` (not rewritten: ${finding.reason})` : "";
104
+ lines.push(` ${where} stale ${finding.target}${suffix}`);
105
+ if (payload.mode === "dry-run") {
106
+ lines.push(` ${red(`- ${truncate(finding.documented ?? "")}`)}`);
107
+ lines.push(` ${green(`+ ${truncate(finding.expected ?? "")}`)}`);
108
+ }
109
+ continue;
110
+ }
111
+ lines.push(` ${where} ${finding.status} ${finding.reason} ${finding.message}`);
112
+ }
113
+ lines.push(headline);
114
+ if (payload.mode === "dry-run" && payload.drift) {
115
+ lines.push("(dry run — no files modified)");
116
+ }
117
+ if (payload.mode === "check" && payload.drift) {
118
+ lines.push("Run with --dry-run to see the full plan, or --write to refresh.");
119
+ }
120
+ if (payload.conflicts.length) {
121
+ lines.push("", bold("Conflicts (nothing will be written):"));
122
+ for (const conflict of payload.conflicts) {
123
+ lines.push(` ${conflict.file} ${conflict.kind} ${conflict.message}`);
124
+ }
125
+ }
126
+ return lines.join("\n");
127
+ }
128
+ export async function checkSnippetsAction(inputs, opts) {
129
+ const format = resolveFormat(opts);
130
+ const mode = resolveMode(opts);
131
+ // --write has no path to write stdin back to, and a snippet link is only
132
+ // meaningful relative to a document that has a location on disk.
133
+ if (inputs.includes("-"))
134
+ throw new Error("md check-snippets does not accept stdin");
135
+ const files = resolveMarkdownInputs(inputs, { include: opts.include, exclude: opts.exclude });
136
+ // Two roots, deliberately. Source reads are bounded by the workspace, because
137
+ // a document under docs/ legitimately points at ../src; writes are bounded by
138
+ // the md fix containment root, which for `md check-snippets docs` is docs/
139
+ // itself and would reject every real source.
140
+ const readRoot = runtime().config.root;
141
+ const writeRoot = containmentRoot(files, runtime().config);
142
+ const read = createSourceReader(readRoot);
143
+ const snapshots = new Map();
144
+ const perFile = [];
145
+ const edits = [];
146
+ for (const file of files) {
147
+ const taken = snapshot(file);
148
+ snapshots.set(file, taken);
149
+ const document = runtime().workspace.document(file);
150
+ // Offsets address the snapshot's bytes; the cached tree is only safe to
151
+ // reuse when it was parsed from exactly those bytes.
152
+ const blocks = document.content === taken.content
153
+ ? extractCodeBlocks(document.tree)
154
+ : extractCodeBlocks(parseMarkdown(taken.content));
155
+ const results = synchronizeSnippets(taken.content, blocks, { file, root: readRoot, read });
156
+ if (!results.length)
157
+ continue;
158
+ perFile.push({ file, results });
159
+ edits.push(...snippetEdits(file, taken.content, results));
160
+ }
161
+ const plan = mode === "write"
162
+ ? buildPlan(writeRoot, edits, snapshots)
163
+ : { root: writeRoot, files: [], conflicts: [] };
164
+ let applied;
165
+ if (mode === "write" && !plan.conflicts.length) {
166
+ // applyPlan re-fingerprints its edit targets but knows nothing about the
167
+ // sources the replacements were read from, so a source edited mid-run
168
+ // would otherwise land already stale.
169
+ for (const { results } of perFile) {
170
+ for (const result of results) {
171
+ if (result.status !== "stale" || !result.write)
172
+ continue;
173
+ const current = fingerprint(result.source);
174
+ if (current.size !== result.sourceFingerprint.size ||
175
+ current.mtimeMs !== result.sourceFingerprint.mtimeMs) {
176
+ throw new Error(`Aborted: ${result.source} changed after the plan was built`);
177
+ }
178
+ }
179
+ }
180
+ const result = applyPlan(plan, { invalidate: (file) => runtime().workspace.invalidate(file) });
181
+ applied = new Set(result.files.filter((entry) => entry.changed).map((entry) => entry.file));
182
+ }
183
+ const findings = [];
184
+ let linked = 0;
185
+ let current = 0;
186
+ let drift = 0;
187
+ let unresolved = 0;
188
+ let malformed = 0;
189
+ let unwritable = 0;
190
+ for (const entry of perFile) {
191
+ for (const result of entry.results) {
192
+ linked++;
193
+ if (result.status === "current")
194
+ current++;
195
+ else if (result.status === "unresolved")
196
+ unresolved++;
197
+ else if (result.status === "malformed")
198
+ malformed++;
199
+ else {
200
+ drift++;
201
+ if (!result.write && mode !== "check")
202
+ unwritable++;
203
+ }
204
+ if (result.status === "current" && !opts.includeOk)
205
+ continue;
206
+ findings.push(toFinding(entry.file, result, mode, applied, opts));
207
+ }
208
+ }
209
+ const payload = {
210
+ mode,
211
+ filesScanned: files.length,
212
+ linked,
213
+ current,
214
+ drift,
215
+ unresolved,
216
+ malformed,
217
+ unwritable,
218
+ applied: applied?.size ?? 0,
219
+ findings,
220
+ conflicts: plan.conflicts.map((conflict) => ({
221
+ ...conflict,
222
+ file: outputPath(conflict.file, opts),
223
+ })),
224
+ };
225
+ // Unlike `md fix`, a finding with no available fix fails every mode. This
226
+ // command's job is checking, so a snippet naming a deleted file or a deleted
227
+ // region is the most severe drift it can report — exiting 0 would let CI pass
228
+ // over provably wrong documentation. Drift itself only fails the modes that
229
+ // are not about to correct it.
230
+ const actionable = payload.conflicts.length > 0 ||
231
+ payload.malformed + payload.unresolved + payload.unwritable > 0 ||
232
+ (mode !== "write" && payload.drift > 0);
233
+ const rendered = format === "json"
234
+ ? jsonPayload("md check-snippets", payload, opts, {
235
+ exitCode: actionable ? 2 : 0,
236
+ summary: {
237
+ linked: payload.linked,
238
+ drift: payload.drift,
239
+ unresolved: payload.unresolved + payload.malformed,
240
+ },
241
+ }).trimEnd()
242
+ : renderText(payload, format === "human");
243
+ (actionable ? process.stderr : process.stdout).write(rendered + "\n");
244
+ if (actionable)
245
+ terminate(2);
246
+ }
247
+ //# sourceMappingURL=check-snippets.js.map