@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,124 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ /** The discriminator every document this module writes carries. */
4
+ export const BASELINE_FORMAT = "cairn-md-audit-baseline";
5
+ /** The pre-rename discriminator, still accepted on committed baselines. */
6
+ export const LEGACY_BASELINE_FORMAT = "claude-cli-md-audit-baseline";
7
+ /** True for a document either spelling of this tool wrote. */
8
+ export function isBaselineFormat(value) {
9
+ return value === BASELINE_FORMAT || value === LEGACY_BASELINE_FORMAT;
10
+ }
11
+ /** The structure version of the baseline document, not the package version. */
12
+ export const BASELINE_VERSION = "1";
13
+ /**
14
+ * The finding identity a baseline is keyed on.
15
+ *
16
+ * Deliberately excludes the line number. A finding does not become a different
17
+ * finding because unrelated prose was inserted above it, and a line-sensitive
18
+ * key would turn every reflow into a wall of regressions and force a baseline
19
+ * refresh on commits that fixed nothing.
20
+ *
21
+ * The cost is that two identical findings in one file collapse to one entry;
22
+ * `count` carries the multiplicity so the second one is still reported.
23
+ */
24
+ function key(checker, file, message) {
25
+ return `${checker}\0${file}\0${message}`;
26
+ }
27
+ /** Byte comparison, so ordering never depends on the runner's ICU build. */
28
+ function byBytes(a, b) {
29
+ return a < b ? -1 : a > b ? 1 : 0;
30
+ }
31
+ /**
32
+ * Workspace-relative, `/`-separated.
33
+ *
34
+ * A baseline holding absolute paths would match nothing after a checkout into
35
+ * a different directory, which is the normal case in CI.
36
+ */
37
+ export function baselinePath(file, root) {
38
+ return path.relative(root, file).split(path.sep).join("/");
39
+ }
40
+ /**
41
+ * Reads a baseline document.
42
+ *
43
+ * A missing or unparseable file throws, matching how `agent audit --baseline`
44
+ * treats a path that is not there. A *foreign* document is reported as a
45
+ * finding by `applyBaseline` instead, because guessing at another tool's schema
46
+ * would produce suppression nobody can trust.
47
+ */
48
+ export function readBaseline(file) {
49
+ if (!fs.existsSync(file))
50
+ throw new Error(`--baseline file does not exist: ${file}`);
51
+ let parsed;
52
+ try {
53
+ parsed = JSON.parse(fs.readFileSync(file, "utf8"));
54
+ }
55
+ catch (cause) {
56
+ throw new Error(`--baseline is not valid JSON: ${file}`, { cause });
57
+ }
58
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed))
59
+ throw new Error(`--baseline is not a baseline document: ${file}`);
60
+ return parsed;
61
+ }
62
+ /** Builds the document `--write-baseline` records. */
63
+ export function buildBaseline(findings, root, generator) {
64
+ const counts = new Map();
65
+ for (const issue of findings) {
66
+ const file = baselinePath(issue.file, root);
67
+ const id = key(issue.checker, file, issue.message);
68
+ const entry = counts.get(id);
69
+ if (entry)
70
+ entry.count++;
71
+ else
72
+ counts.set(id, { checker: issue.checker, file, message: issue.message, count: 1 });
73
+ }
74
+ return {
75
+ baselineFormat: BASELINE_FORMAT,
76
+ version: BASELINE_VERSION,
77
+ generator,
78
+ entries: [...counts.values()].sort((a, b) => byBytes(a.checker, b.checker) || byBytes(a.file, b.file) || byBytes(a.message, b.message)),
79
+ };
80
+ }
81
+ /**
82
+ * Partitions findings into those the baseline already recorded and those it did
83
+ * not.
84
+ *
85
+ * Findings are consumed in the order given, so with a baseline `count` of one
86
+ * and two matching findings the first is suppressed and the second reported.
87
+ */
88
+ export function applyBaseline(findings, document, root) {
89
+ if (!isBaselineFormat(document.baselineFormat))
90
+ return { kept: [...findings], suppressed: 0, matched: 0, stale: [], foreign: true };
91
+ const remaining = new Map();
92
+ const entries = new Map();
93
+ for (const entry of document.entries ?? []) {
94
+ const id = key(entry.checker, entry.file, entry.message);
95
+ remaining.set(id, (remaining.get(id) ?? 0) + Math.max(0, entry.count));
96
+ entries.set(id, entry);
97
+ }
98
+ const kept = [];
99
+ let suppressed = 0;
100
+ for (const issue of findings) {
101
+ const id = key(issue.checker, baselinePath(issue.file, root), issue.message);
102
+ const left = remaining.get(id) ?? 0;
103
+ if (left > 0) {
104
+ remaining.set(id, left - 1);
105
+ suppressed++;
106
+ }
107
+ else
108
+ kept.push(issue);
109
+ }
110
+ const stale = [...remaining]
111
+ .filter(([, left]) => left > 0)
112
+ .map(([id, left]) => ({ ...entries.get(id), count: left }))
113
+ .sort((a, b) => byBytes(a.checker, b.checker) || byBytes(a.file, b.file) || byBytes(a.message, b.message));
114
+ return { kept, suppressed, matched: suppressed, stale, foreign: false };
115
+ }
116
+ /** Writes a baseline document, replacing any existing one. */
117
+ export function writeBaseline(file, document) {
118
+ const target = path.resolve(file);
119
+ fs.mkdirSync(path.dirname(target), { recursive: true });
120
+ const temporary = `${target}.${process.pid}.tmp`;
121
+ fs.writeFileSync(temporary, JSON.stringify(document, null, 2) + "\n");
122
+ fs.renameSync(temporary, target);
123
+ }
124
+ //# sourceMappingURL=audit-baseline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit-baseline.js","sourceRoot":"","sources":["../src/audit-baseline.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { Issue, OutputFormat } from "./types.js";
2
+ export interface DiagnosticSummary {
3
+ files: number;
4
+ findings: number;
5
+ [key: string]: unknown;
6
+ }
7
+ export declare function formatJsonl(issues: readonly Issue[], summary: DiagnosticSummary): string;
8
+ /**
9
+ * SARIF for `md` diagnostics.
10
+ *
11
+ * `level` is `"error"` for every finding. That is the current published
12
+ * contract for these commands, not an oversight — `Issue` carries no severity,
13
+ * so changing it would be a breaking change for consumers gating on it.
14
+ */
15
+ export declare function formatSarif(issues: readonly Issue[]): string;
16
+ export declare function formatDiagnostics(issues: readonly Issue[], format: OutputFormat, summary: DiagnosticSummary): string | undefined;
@@ -0,0 +1,38 @@
1
+ import { sarifDocument } from "./sarif.js";
2
+ export function formatJsonl(issues, summary) {
3
+ return [
4
+ ...issues.map((issue) => JSON.stringify({ type: "finding", ...issue })),
5
+ JSON.stringify({ type: "summary", ...summary }),
6
+ ].join("\n");
7
+ }
8
+ /**
9
+ * SARIF for `md` diagnostics.
10
+ *
11
+ * `level` is `"error"` for every finding. That is the current published
12
+ * contract for these commands, not an oversight — `Issue` carries no severity,
13
+ * so changing it would be a breaking change for consumers gating on it.
14
+ */
15
+ export function formatSarif(issues) {
16
+ const ids = [...new Set(issues.map((issue) => issue.checker))].sort();
17
+ return sarifDocument(ids.map((id) => ({ id, name: id })), issues.map((issue) => ({
18
+ ruleId: issue.checker,
19
+ level: "error",
20
+ message: { text: issue.message },
21
+ locations: [
22
+ {
23
+ physicalLocation: {
24
+ artifactLocation: { uri: issue.file },
25
+ region: { startLine: Math.max(1, issue.line) },
26
+ },
27
+ },
28
+ ],
29
+ })));
30
+ }
31
+ export function formatDiagnostics(issues, format, summary) {
32
+ if (format === "jsonl")
33
+ return formatJsonl(issues, summary);
34
+ if (format === "sarif")
35
+ return formatSarif(issues);
36
+ return undefined;
37
+ }
38
+ //# sourceMappingURL=automation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"automation.js","sourceRoot":"","sources":["../src/automation.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAQ3C,MAAM,UAAU,WAAW,CAAC,MAAwB,EAAE,OAA0B;IAC9E,OAAO;QACL,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;QACvE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,OAAO,EAAE,CAAC;KAChD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,WAAW,CAAC,MAAwB;IAClD,MAAM,GAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACtE,OAAO,aAAa,CAClB,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,EACnC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACrB,MAAM,EAAE,KAAK,CAAC,OAAO;QACrB,KAAK,EAAE,OAAgB;QACvB,OAAO,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE;QAChC,SAAS,EAAE;YACT;gBACE,gBAAgB,EAAE;oBAChB,gBAAgB,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,IAAI,EAAE;oBACrC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE;iBAC/C;aACF;SACF;KACF,CAAC,CAAC,CACJ,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,MAAwB,EACxB,MAAoB,EACpB,OAA0B;IAE1B,IAAI,MAAM,KAAK,OAAO;QAAE,OAAO,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5D,IAAI,MAAM,KAAK,OAAO;QAAE,OAAO,WAAW,CAAC,MAAM,CAAC,CAAC;IACnD,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -0,0 +1,15 @@
1
+ export interface IncomingReference {
2
+ sourceFile: string;
3
+ line: number;
4
+ linkText: string;
5
+ rawTarget: string;
6
+ /** The reference's `#fragment`, decoded, when it carried one. */
7
+ fragment?: string;
8
+ }
9
+ /**
10
+ * Every local reference in `files` that resolves to `targetPath`.
11
+ *
12
+ * Paths are absolute on both sides; callers map them for display. External and
13
+ * anchor-only references are skipped, matching the workspace graph.
14
+ */
15
+ export declare function documentsReferencing(files: readonly string[], targetPath: string): IncomingReference[];
@@ -0,0 +1,30 @@
1
+ import { resolveLocalPath, splitLocalTarget } from "./link-target.js";
2
+ import { runtime } from "./runtime.js";
3
+ /**
4
+ * Every local reference in `files` that resolves to `targetPath`.
5
+ *
6
+ * Paths are absolute on both sides; callers map them for display. External and
7
+ * anchor-only references are skipped, matching the workspace graph.
8
+ */
9
+ export function documentsReferencing(files, targetPath) {
10
+ const root = runtime().config.root;
11
+ const found = [];
12
+ for (const file of files) {
13
+ for (const reference of runtime().workspace.document(file).references) {
14
+ if (reference.isExternal || reference.isAnchorOnly)
15
+ continue;
16
+ const parsed = splitLocalTarget(reference.target);
17
+ if (resolveLocalPath(file, parsed.path, root) !== targetPath)
18
+ continue;
19
+ found.push({
20
+ sourceFile: file,
21
+ line: reference.line,
22
+ linkText: reference.linkText,
23
+ rawTarget: reference.target,
24
+ ...(parsed.fragment === undefined ? {} : { fragment: parsed.fragment }),
25
+ });
26
+ }
27
+ }
28
+ return found;
29
+ }
30
+ //# sourceMappingURL=backlinks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backlinks.js","sourceRoot":"","sources":["../src/backlinks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAWvC;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAClC,KAAwB,EACxB,UAAkB;IAElB,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC;IACnC,MAAM,KAAK,GAAwB,EAAE,CAAC;IACtC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,KAAK,MAAM,SAAS,IAAI,OAAO,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC;YACtE,IAAI,SAAS,CAAC,UAAU,IAAI,SAAS,CAAC,YAAY;gBAAE,SAAS;YAC7D,MAAM,MAAM,GAAG,gBAAgB,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YAClD,IAAI,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,UAAU;gBAAE,SAAS;YACvE,KAAK,CAAC,IAAI,CAAC;gBACT,UAAU,EAAE,IAAI;gBAChB,IAAI,EAAE,SAAS,CAAC,IAAI;gBACpB,QAAQ,EAAE,SAAS,CAAC,QAAQ;gBAC5B,SAAS,EAAE,SAAS,CAAC,MAAM;gBAC3B,GAAG,CAAC,MAAM,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC;aACxE,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Issue } from "../types.js";
2
+ import { type Root } from "../markdown-ast.js";
3
+ export declare function checkKatex(filePath: string, content: string, issues: Issue[], tree?: Root): void;
@@ -0,0 +1,71 @@
1
+ import katex from "katex";
2
+ import { parseMarkdown, extractCodeBlocks, isLineInCodeBlock } from "../markdown-ast.js";
3
+ function validateKatexExpression(filePath, lineNum, expr, displayMode, issues) {
4
+ if (!expr.trim())
5
+ return;
6
+ try {
7
+ katex.renderToString(expr, {
8
+ throwOnError: true,
9
+ strict: "error",
10
+ displayMode,
11
+ });
12
+ }
13
+ catch (err) {
14
+ issues.push({
15
+ file: filePath,
16
+ line: lineNum,
17
+ checker: "katex",
18
+ message: `Invalid ${displayMode ? "display" : "inline"} math: ${err.message}`,
19
+ });
20
+ }
21
+ }
22
+ export function checkKatex(filePath, content, issues, tree) {
23
+ const parsedTree = tree ?? parseMarkdown(content);
24
+ const codeBlocks = extractCodeBlocks(parsedTree);
25
+ const lines = content.split("\n");
26
+ let inDisplayMath = false;
27
+ let displayMathStart = 0;
28
+ let displayMathBuffer = "";
29
+ for (let i = 0; i < lines.length; i++) {
30
+ const line = lines[i];
31
+ const lineNum = i + 1;
32
+ if (isLineInCodeBlock(lineNum, codeBlocks))
33
+ continue;
34
+ // Handle display math blocks ($$...$$)
35
+ if (inDisplayMath) {
36
+ if (line.includes("$$")) {
37
+ displayMathBuffer += "\n" + line.substring(0, line.indexOf("$$"));
38
+ validateKatexExpression(filePath, displayMathStart, displayMathBuffer.trim(), true, issues);
39
+ inDisplayMath = false;
40
+ displayMathBuffer = "";
41
+ }
42
+ else {
43
+ displayMathBuffer += "\n" + line;
44
+ }
45
+ continue;
46
+ }
47
+ // Check for display math start
48
+ const displayStart = line.indexOf("$$");
49
+ if (displayStart !== -1) {
50
+ const afterStart = line.substring(displayStart + 2);
51
+ const displayEnd = afterStart.indexOf("$$");
52
+ if (displayEnd !== -1) {
53
+ const expr = afterStart.substring(0, displayEnd);
54
+ validateKatexExpression(filePath, lineNum, expr, true, issues);
55
+ }
56
+ else {
57
+ inDisplayMath = true;
58
+ displayMathStart = lineNum;
59
+ displayMathBuffer = afterStart;
60
+ }
61
+ continue;
62
+ }
63
+ // Check for inline math ($...$) — avoid matching escaped \$ and $$
64
+ const inlineRe = /(?<![\\$])\$(?!\$)(.+?)(?<![\\$])\$/g;
65
+ let inlineMatch;
66
+ while ((inlineMatch = inlineRe.exec(line)) !== null) {
67
+ validateKatexExpression(filePath, lineNum, inlineMatch[1], false, issues);
68
+ }
69
+ }
70
+ }
71
+ //# sourceMappingURL=katex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"katex.js","sourceRoot":"","sources":["../../src/checkers/katex.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import type { Issue } from "../types.js";
2
+ /** A markdownlint autofix, as the library describes it. */
3
+ export interface MarkdownlintFixInfo {
4
+ /** Defaults to the finding's own line. */
5
+ lineNumber?: number;
6
+ /** 1-based column on the terminator-stripped line. */
7
+ editColumn?: number;
8
+ /** Characters to remove; -1 means the whole line, including its terminator. */
9
+ deleteCount?: number;
10
+ insertText?: string;
11
+ }
12
+ export interface MarkdownlintError {
13
+ lineNumber: number;
14
+ ruleNames: string[];
15
+ ruleDescription: string;
16
+ errorDetail?: string;
17
+ /** Present only for rules that know how to repair themselves. */
18
+ fixInfo?: MarkdownlintFixInfo | null;
19
+ }
20
+ export declare function loadMarkdownlintConfig(userConfigPath?: string): Promise<Record<string, unknown>>;
21
+ /**
22
+ * Lints in-memory content, returning markdownlint's own findings.
23
+ *
24
+ * Exposed separately from `checkMarkdownLint` so `md fix` can read `fixInfo`,
25
+ * which the `Issue` shape has nowhere to carry.
26
+ */
27
+ export declare function lintContent(filePath: string, content: string, config: Record<string, unknown>): Promise<MarkdownlintError[]>;
28
+ export declare function checkMarkdownLint(filePath: string, content: string, issues: Issue[], userConfigPath?: string): Promise<void>;
@@ -0,0 +1,53 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ import { lint } from "markdownlint/async";
5
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
6
+ const configPath = path.join(__dirname, "..", "..", ".markdownlintrc");
7
+ export async function loadMarkdownlintConfig(userConfigPath) {
8
+ let config = {};
9
+ if (fs.existsSync(configPath)) {
10
+ config = JSON.parse(fs.readFileSync(configPath, "utf-8"));
11
+ }
12
+ if (userConfigPath) {
13
+ if (!fs.existsSync(userConfigPath)) {
14
+ throw new Error(`Markdownlint configuration not found: ${userConfigPath}`);
15
+ }
16
+ const extension = path.extname(userConfigPath).toLowerCase();
17
+ const raw = fs.readFileSync(userConfigPath, "utf-8");
18
+ const userConfig = extension === ".json"
19
+ ? JSON.parse(raw)
20
+ : (await import("yaml")).parse(raw);
21
+ config = { ...config, ...userConfig };
22
+ }
23
+ return config;
24
+ }
25
+ /**
26
+ * Lints in-memory content, returning markdownlint's own findings.
27
+ *
28
+ * Exposed separately from `checkMarkdownLint` so `md fix` can read `fixInfo`,
29
+ * which the `Issue` shape has nowhere to carry.
30
+ */
31
+ export async function lintContent(filePath, content, config) {
32
+ const results = await new Promise((resolve, reject) => {
33
+ lint({ strings: { [filePath]: content }, config }, (err, result) => {
34
+ if (err)
35
+ reject(err);
36
+ else
37
+ resolve(result);
38
+ });
39
+ });
40
+ return results[filePath] || [];
41
+ }
42
+ export async function checkMarkdownLint(filePath, content, issues, userConfigPath) {
43
+ const config = await loadMarkdownlintConfig(userConfigPath);
44
+ for (const r of await lintContent(filePath, content, config)) {
45
+ issues.push({
46
+ file: filePath,
47
+ line: r.lineNumber,
48
+ checker: `markdownlint/${r.ruleNames[0]}`,
49
+ message: `${r.ruleDescription}${r.errorDetail ? ": " + r.errorDetail : ""}`,
50
+ });
51
+ }
52
+ }
53
+ //# sourceMappingURL=markdown-lint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown-lint.js","sourceRoot":"","sources":["../../src/checkers/markdown-lint.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAG1C,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/D,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,iBAAiB,CAAC,CAAC;AAsBvE,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,cAAuB;IAEvB,IAAI,MAAM,GAA4B,EAAE,CAAC;IACzC,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9B,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;IAC5D,CAAC;IACD,IAAI,cAAc,EAAE,CAAC;QACnB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,yCAAyC,cAAc,EAAE,CAAC,CAAC;QAC7E,CAAC;QACD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,WAAW,EAAE,CAAC;QAC7D,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;QACrD,MAAM,UAAU,GACd,SAAS,KAAK,OAAO;YACnB,CAAC,CAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAA6B;YAC9C,CAAC,CAAE,CAAC,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAA6B,CAAC;QACrE,MAAM,GAAG,EAAE,GAAG,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;IACxC,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,QAAgB,EAChB,OAAe,EACf,MAA+B;IAE/B,MAAM,OAAO,GAAG,MAAM,IAAI,OAAO,CAAsC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACzF,IAAI,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,GAAiB,EAAE,MAAe,EAAE,EAAE;YACxF,IAAI,GAAG;gBAAE,MAAM,CAAC,GAAG,CAAC,CAAC;;gBAChB,OAAO,CAAC,MAA6C,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IACH,OAAO,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;AACjC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,QAAgB,EAChB,OAAe,EACf,MAAe,EACf,cAAuB;IAEvB,MAAM,MAAM,GAAG,MAAM,sBAAsB,CAAC,cAAc,CAAC,CAAC;IAC5D,KAAK,MAAM,CAAC,IAAI,MAAM,WAAW,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC;QAC7D,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,CAAC,CAAC,UAAU;YAClB,OAAO,EAAE,gBAAgB,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE;YACzC,OAAO,EAAE,GAAG,CAAC,CAAC,eAAe,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE;SAC5E,CAAC,CAAC;IACL,CAAC;AACH,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { Issue } from "../types.js";
2
+ import { type Root } from "../markdown-ast.js";
3
+ type Mermaid = (typeof import("mermaid"))["default"];
4
+ export declare function loadMermaid(): Promise<Mermaid>;
5
+ export declare function checkMermaid(filePath: string, content: string, issues: Issue[], tree?: Root, loader?: () => Promise<Mermaid>): Promise<void>;
6
+ export {};
@@ -0,0 +1,53 @@
1
+ import { parseMarkdown, extractCodeBlocks } from "../markdown-ast.js";
2
+ let mermaidPromise;
3
+ let parseQueue = Promise.resolve();
4
+ export function loadMermaid() {
5
+ mermaidPromise ??= (async () => {
6
+ const { JSDOM } = await import("jsdom");
7
+ const dom = new JSDOM("<!DOCTYPE html><html><body></body></html>");
8
+ globalThis.window = dom.window;
9
+ globalThis.document = dom.window.document;
10
+ Object.defineProperty(globalThis, "navigator", {
11
+ value: dom.window.navigator,
12
+ writable: true,
13
+ configurable: true,
14
+ });
15
+ globalThis.DOMParser = dom.window.DOMParser;
16
+ globalThis.XMLSerializer = dom.window.XMLSerializer;
17
+ const mermaid = (await import("mermaid")).default;
18
+ mermaid.initialize({ startOnLoad: false });
19
+ return mermaid;
20
+ })();
21
+ return mermaidPromise;
22
+ }
23
+ async function serializedParse(mermaid, value) {
24
+ const work = parseQueue.then(async () => {
25
+ await mermaid.parse(value);
26
+ });
27
+ parseQueue = work.catch(() => undefined);
28
+ return work;
29
+ }
30
+ export async function checkMermaid(filePath, content, issues, tree, loader = loadMermaid) {
31
+ const parsedTree = tree ?? parseMarkdown(content);
32
+ const mermaidBlocks = extractCodeBlocks(parsedTree).filter((b) => b.lang === "mermaid");
33
+ if (mermaidBlocks.length === 0)
34
+ return;
35
+ const mermaid = await loader();
36
+ for (const block of mermaidBlocks) {
37
+ // Line of actual content (skip the opening fence)
38
+ const blockStartLine = block.line + 1;
39
+ try {
40
+ await serializedParse(mermaid, block.value);
41
+ }
42
+ catch (err) {
43
+ const msg = err.message || String(err);
44
+ issues.push({
45
+ file: filePath,
46
+ line: blockStartLine,
47
+ checker: "mermaid",
48
+ message: `Mermaid syntax error: ${msg.split("\n")[0]}`,
49
+ });
50
+ }
51
+ }
52
+ }
53
+ //# sourceMappingURL=mermaid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mermaid.js","sourceRoot":"","sources":["../../src/checkers/mermaid.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAa,MAAM,oBAAoB,CAAC;AAGjF,IAAI,cAA4C,CAAC;AACjD,IAAI,UAAU,GAAkB,OAAO,CAAC,OAAO,EAAE,CAAC;AAElD,MAAM,UAAU,WAAW;IACzB,cAAc,KAAK,CAAC,KAAK,IAAI,EAAE;QAC7B,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;QACxC,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;QACnE,UAAU,CAAC,MAAM,GAAG,GAAG,CAAC,MAA+C,CAAC;QACxE,UAAU,CAAC,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC;QAC1C,MAAM,CAAC,cAAc,CAAC,UAAU,EAAE,WAAW,EAAE;YAC7C,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS;YAC3B,QAAQ,EAAE,IAAI;YACd,YAAY,EAAE,IAAI;SACnB,CAAC,CAAC;QACH,UAAU,CAAC,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,SAAwC,CAAC;QAC3E,UAAU,CAAC,aAAa,GAAG,GAAG,CAAC,MAAM,CAAC,aAAgD,CAAC;QACvF,MAAM,OAAO,GAAG,CAAC,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC;QAClD,OAAO,CAAC,UAAU,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;QAC3C,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC,EAAE,CAAC;IACL,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,OAAgB,EAAE,KAAa;IAC5D,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;QACtC,MAAM,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IACH,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IACzC,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,QAAgB,EAChB,OAAe,EACf,MAAe,EACf,IAAW,EACX,SAAiC,WAAW;IAE5C,MAAM,UAAU,GAAG,IAAI,IAAI,aAAa,CAAC,OAAO,CAAC,CAAC;IAClD,MAAM,aAAa,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;IACxF,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IACvC,MAAM,OAAO,GAAG,MAAM,MAAM,EAAE,CAAC;IAE/B,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE,CAAC;QAClC,kDAAkD;QAClD,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC;QAEtC,IAAI,CAAC;YACH,MAAM,eAAe,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;QAC9C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAI,GAAa,CAAC,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC;YAClD,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,cAAc;gBACpB,OAAO,EAAE,SAAS;gBAClB,OAAO,EAAE,yBAAyB,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE;aACvD,CAAC,CAAC;QACL,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Issue } from "../types.js";
2
+ import { type Root } from "../markdown-ast.js";
3
+ export declare function checkReferences(filePath: string, content: string, issues: Issue[], tree?: Root): void;
@@ -0,0 +1,55 @@
1
+ import fs from "node:fs";
2
+ import { extractReferences } from "../refs.js";
3
+ import { parseMarkdown, extractHeadings } from "../markdown-ast.js";
4
+ import { splitLocalTarget, resolveLocalPath } from "../link-target.js";
5
+ import { runtime } from "../runtime.js";
6
+ function checkAnchor(sourceFile, targetContent, lineNum, anchor, issues) {
7
+ const tree = typeof targetContent === "string" ? parseMarkdown(targetContent) : targetContent;
8
+ const headingSlugs = new Set(extractHeadings(tree).map((h) => h.slug));
9
+ if (!headingSlugs.has(anchor)) {
10
+ issues.push({
11
+ file: sourceFile,
12
+ line: lineNum,
13
+ checker: "ref/anchor",
14
+ message: `Heading anchor not found: #${anchor}`,
15
+ });
16
+ }
17
+ }
18
+ export function checkReferences(filePath, content, issues, tree) {
19
+ const parsedTree = tree ?? parseMarkdown(content);
20
+ const refs = extractReferences(parsedTree);
21
+ for (const ref of refs) {
22
+ if (ref.isExternal)
23
+ continue;
24
+ if (ref.isAnchorOnly) {
25
+ const target = splitLocalTarget(ref.target);
26
+ checkAnchor(filePath, parsedTree, ref.line, target.fragment ?? "", issues);
27
+ continue;
28
+ }
29
+ const target = splitLocalTarget(ref.target);
30
+ const targetFile = target.path;
31
+ const anchor = target.fragment;
32
+ if (targetFile) {
33
+ const resolvedPath = resolveLocalPath(filePath, targetFile, runtime().config.root);
34
+ if (!fs.existsSync(resolvedPath)) {
35
+ issues.push({
36
+ file: filePath,
37
+ line: ref.line,
38
+ checker: ref.isImage ? "ref/image" : "ref/link",
39
+ message: `${ref.isImage ? "Image" : "Link"} target not found: ${targetFile}`,
40
+ });
41
+ continue;
42
+ }
43
+ if (anchor) {
44
+ try {
45
+ const targetDocument = runtime().workspace.document(resolvedPath);
46
+ checkAnchor(filePath, targetDocument.tree, ref.line, anchor, issues);
47
+ }
48
+ catch {
49
+ continue;
50
+ }
51
+ }
52
+ }
53
+ }
54
+ }
55
+ //# sourceMappingURL=references.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"references.js","sourceRoot":"","sources":["../../src/checkers/references.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};