@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,122 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { execFileSync } from "node:child_process";
4
+ import { minimatch } from "minimatch";
5
+ import { runtime } from "./runtime.js";
6
+ function hasMagic(value) {
7
+ return /[*?[\]{}]/.test(value);
8
+ }
9
+ function inside(root, candidate) {
10
+ const relative = path.relative(root, candidate);
11
+ return relative === "" || (relative !== ".." && !relative.startsWith(`..${path.sep}`));
12
+ }
13
+ export function changedMarkdownFiles(revision, root = runtime().config.root) {
14
+ try {
15
+ const absoluteRoot = path.resolve(root);
16
+ const realRoot = fs.realpathSync(absoluteRoot);
17
+ const repository = execFileSync("git", ["-C", root, "rev-parse", "--show-toplevel"], {
18
+ encoding: "utf-8",
19
+ stdio: ["ignore", "pipe", "pipe"],
20
+ }).trim();
21
+ const changed = execFileSync("git", [
22
+ "-C",
23
+ repository,
24
+ "diff",
25
+ "--name-status",
26
+ "--find-renames",
27
+ "--find-copies",
28
+ revision,
29
+ "--",
30
+ ], { encoding: "utf-8", stdio: ["ignore", "pipe", "pipe"] });
31
+ const untracked = execFileSync("git", ["-C", repository, "ls-files", "--others", "--exclude-standard"], { encoding: "utf-8", stdio: ["ignore", "pipe", "pipe"] });
32
+ const names = [];
33
+ for (const line of changed.split(/\r?\n/)) {
34
+ if (!line)
35
+ continue;
36
+ const parts = line.split("\t");
37
+ if (parts[0].startsWith("D"))
38
+ continue;
39
+ names.push(parts[0].startsWith("R") || parts[0].startsWith("C") ? parts[2] : parts[1]);
40
+ }
41
+ names.push(...untracked.split(/\r?\n/).filter(Boolean));
42
+ return [...new Set(names)]
43
+ .filter((name) => /\.md(?:own)?$/i.test(name))
44
+ .map((name) => path.resolve(repository, name))
45
+ .filter((file) => inside(realRoot, file) && fs.existsSync(file) && fs.statSync(file).isFile())
46
+ .map((file) => path.resolve(absoluteRoot, path.relative(realRoot, file)))
47
+ .sort();
48
+ }
49
+ catch (error) {
50
+ const detail = error.stderr;
51
+ const message = detail ? String(detail).trim().split("\n")[0] : error.message;
52
+ throw new Error(`Unable to select files changed since ${revision}: ${message}`, {
53
+ cause: error,
54
+ });
55
+ }
56
+ }
57
+ export function resolveMarkdownInputs(inputs, options = {}) {
58
+ const workspace = runtime().workspace;
59
+ const root = workspace.root;
60
+ const include = options.include ?? runtime().config.files.include;
61
+ const exclude = options.exclude ?? runtime().config.files.exclude;
62
+ const all = () => workspace.markdownFiles(root, { include, exclude });
63
+ const files = new Set();
64
+ for (const input of inputs) {
65
+ if (input === "-") {
66
+ if (inputs.length !== 1)
67
+ throw new Error("stdin cannot be combined with file inputs");
68
+ if (options.requireStdinName && !options.stdinName) {
69
+ throw new Error("--stdin-name <path> is required when stdin needs file-relative resolution");
70
+ }
71
+ const name = path.resolve(options.stdinName ?? path.join(root, "stdin.md"));
72
+ if (!inside(root, name))
73
+ throw new Error(`stdin name is outside workspace root: ${name}`);
74
+ workspace.registerDocument(name, fs.readFileSync(0, "utf-8"));
75
+ files.add(name);
76
+ continue;
77
+ }
78
+ const resolved = path.resolve(input);
79
+ if (runtime().config.configPath && !inside(root, resolved)) {
80
+ throw new Error(`Input is outside configured workspace root: ${resolved}`);
81
+ }
82
+ if (fs.existsSync(resolved)) {
83
+ const stat = fs.statSync(resolved);
84
+ if (stat.isDirectory()) {
85
+ for (const file of workspace.markdownFiles(resolved, { include, exclude }))
86
+ files.add(file);
87
+ }
88
+ else if (stat.isFile())
89
+ files.add(resolved);
90
+ else
91
+ throw new Error(`Path is not a file or directory: ${resolved}`);
92
+ continue;
93
+ }
94
+ if (hasMagic(input)) {
95
+ const normalized = path.isAbsolute(input)
96
+ ? path.relative(root, input).split(path.sep).join("/")
97
+ : path.relative(root, path.resolve(input)).split(path.sep).join("/");
98
+ for (const file of all()) {
99
+ const relative = path.relative(root, file).split(path.sep).join("/");
100
+ if (minimatch(relative, normalized, { dot: true, nonegate: true }))
101
+ files.add(file);
102
+ }
103
+ continue;
104
+ }
105
+ throw new Error(`Path not found: ${resolved}`);
106
+ }
107
+ let selected = [...files].sort();
108
+ const matchesSelection = (file) => {
109
+ if (!runtime().config.configPath && !inside(root, file))
110
+ return true;
111
+ const relative = path.relative(root, file).split(path.sep).join("/");
112
+ const matches = (pattern) => minimatch(relative, pattern, { dot: true, nonegate: true });
113
+ return include.some(matches) && !exclude.some(matches);
114
+ };
115
+ selected = selected.filter(matchesSelection);
116
+ if (options.changedSince) {
117
+ const changed = new Set(changedMarkdownFiles(options.changedSince, root));
118
+ selected = (inputs.length ? selected : all()).filter((file) => changed.has(file));
119
+ }
120
+ return selected;
121
+ }
122
+ //# sourceMappingURL=input-selection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input-selection.js","sourceRoot":"","sources":["../src/input-selection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function requireFile(value: string, options: object): string;
2
+ export declare function requireDirectory(value: string, options: object): string;
package/dist/input.js ADDED
@@ -0,0 +1,32 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { terminate } from "./command-result.js";
4
+ import { outputPath, runtime } from "./runtime.js";
5
+ export function requireFile(value, options) {
6
+ if (value === "-") {
7
+ const opts = options;
8
+ if (opts.write) {
9
+ process.stderr.write("Error: stdin cannot be used with a command that writes files\n");
10
+ terminate(1);
11
+ }
12
+ const filePath = path.resolve(opts.stdinName ?? path.join(runtime().config.root, "stdin.md"));
13
+ const content = fs.readFileSync(0, "utf-8");
14
+ runtime().workspace.registerDocument(filePath, content);
15
+ return filePath;
16
+ }
17
+ const filePath = path.resolve(value);
18
+ if (!fs.existsSync(filePath) || !fs.statSync(filePath).isFile()) {
19
+ process.stderr.write(`Error: File not found: ${outputPath(filePath, options)}\n`);
20
+ terminate(1);
21
+ }
22
+ return filePath;
23
+ }
24
+ export function requireDirectory(value, options) {
25
+ const directory = path.resolve(value);
26
+ if (!fs.existsSync(directory) || !fs.statSync(directory).isDirectory()) {
27
+ process.stderr.write(`Error: Directory not found: ${outputPath(directory, options)}\n`);
28
+ terminate(1);
29
+ }
30
+ return directory;
31
+ }
32
+ //# sourceMappingURL=input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input.js","sourceRoot":"","sources":["../src/input.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEnD,MAAM,UAAU,WAAW,CAAC,KAAa,EAAE,OAAe;IACxD,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;QAClB,MAAM,IAAI,GAAG,OAAkD,CAAC;QAChE,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gEAAgE,CAAC,CAAC;YACvF,SAAS,CAAC,CAAC,CAAC,CAAC;QACf,CAAC;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC;QAC9F,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QAC5C,OAAO,EAAE,CAAC,SAAS,CAAC,gBAAgB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACxD,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACrC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;QAChE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,0BAA0B,UAAU,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QAClF,SAAS,CAAC,CAAC,CAAC,CAAC;IACf,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAa,EAAE,OAAe;IAC7D,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACtC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;QACvE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,+BAA+B,UAAU,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QACxF,SAAS,CAAC,CAAC,CAAC,CAAC;IACf,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -0,0 +1,39 @@
1
+ export interface LocalTarget {
2
+ rawPath: string;
3
+ path: string;
4
+ query: string;
5
+ rawFragment?: string;
6
+ fragment?: string;
7
+ }
8
+ export declare function splitLocalTarget(target: string): LocalTarget;
9
+ export declare function resolveLocalPath(sourceFile: string, targetPath: string, workspaceRoot: string): string;
10
+ /** Percent-encodes a path, including the `#` that `encodeURI` leaves literal. */
11
+ export declare function encodePath(value: string, encoded: boolean): string;
12
+ /**
13
+ * How a link target was spelled, so a rewrite can preserve it.
14
+ *
15
+ * Whether a target is written `./x.md` or `x.md`, and whether it is
16
+ * percent-encoded, are authoring choices rather than correctness properties.
17
+ * Normalizing them would rewrite every link in a repository on first run.
18
+ */
19
+ export interface TargetStyle {
20
+ /** The path contained `%`, so a rewrite re-encodes. */
21
+ encoded: boolean;
22
+ /** The raw destination text contained `\`, so `(` and `)` are re-escaped. */
23
+ escapedParens: boolean;
24
+ /** The path began with `/` and is therefore workspace-root-relative. */
25
+ rootRelative: boolean;
26
+ /** The path began with `./`. */
27
+ dotSlash: boolean;
28
+ }
29
+ export declare function targetStyle(rawTarget: string, rawDestinationText?: string): TargetStyle;
30
+ /** Rebuilds `<path><query>[#fragment]` in the original target's style. */
31
+ export declare function composeTarget(nextPath: string, split: LocalTarget, style: TargetStyle): string;
32
+ /**
33
+ * Re-escapes parentheses when the original destination was written escaped.
34
+ *
35
+ * Applied after any comparison against the original target, since the escaping
36
+ * is a property of the surrounding link syntax rather than of the target itself.
37
+ */
38
+ export declare function escapeTargetParens(value: string, style: TargetStyle): string;
39
+ export declare function replaceFragment(target: string, newFragment: string): string;
@@ -0,0 +1,68 @@
1
+ import path from "node:path";
2
+ function decode(value) {
3
+ try {
4
+ return decodeURIComponent(value);
5
+ }
6
+ catch {
7
+ return value;
8
+ }
9
+ }
10
+ export function splitLocalTarget(target) {
11
+ const hash = target.indexOf("#");
12
+ const beforeFragment = hash === -1 ? target : target.slice(0, hash);
13
+ const rawFragment = hash === -1 ? undefined : target.slice(hash + 1);
14
+ const question = beforeFragment.indexOf("?");
15
+ const rawPath = question === -1 ? beforeFragment : beforeFragment.slice(0, question);
16
+ const query = question === -1 ? "" : beforeFragment.slice(question);
17
+ return {
18
+ rawPath,
19
+ path: decode(rawPath),
20
+ query,
21
+ ...(rawFragment === undefined ? {} : { rawFragment, fragment: decode(rawFragment) }),
22
+ };
23
+ }
24
+ export function resolveLocalPath(sourceFile, targetPath, workspaceRoot) {
25
+ if (targetPath.startsWith("/"))
26
+ return path.resolve(workspaceRoot, `.${targetPath}`);
27
+ return path.resolve(path.dirname(sourceFile), targetPath);
28
+ }
29
+ /** Percent-encodes a path, including the `#` that `encodeURI` leaves literal. */
30
+ export function encodePath(value, encoded) {
31
+ return encoded ? encodeURI(value).replace(/#/g, "%23") : value;
32
+ }
33
+ export function targetStyle(rawTarget, rawDestinationText = rawTarget) {
34
+ const { rawPath } = splitLocalTarget(rawTarget);
35
+ return {
36
+ encoded: rawPath.includes("%"),
37
+ escapedParens: rawDestinationText.includes("\\"),
38
+ rootRelative: rawPath.startsWith("/"),
39
+ dotSlash: rawPath.startsWith("./"),
40
+ };
41
+ }
42
+ /** Rebuilds `<path><query>[#fragment]` in the original target's style. */
43
+ export function composeTarget(nextPath, split, style) {
44
+ let value = nextPath;
45
+ if (!style.rootRelative && style.dotSlash && !value.startsWith("."))
46
+ value = `./${value}`;
47
+ value = encodePath(value, style.encoded);
48
+ const suffix = split.query + (split.rawFragment === undefined ? "" : `#${split.rawFragment}`);
49
+ return value + suffix;
50
+ }
51
+ /**
52
+ * Re-escapes parentheses when the original destination was written escaped.
53
+ *
54
+ * Applied after any comparison against the original target, since the escaping
55
+ * is a property of the surrounding link syntax rather than of the target itself.
56
+ */
57
+ export function escapeTargetParens(value, style) {
58
+ return style.escapedParens ? value.replace(/[()]/g, (character) => `\\${character}`) : value;
59
+ }
60
+ export function replaceFragment(target, newFragment) {
61
+ const hash = target.indexOf("#");
62
+ if (hash === -1)
63
+ return target;
64
+ const old = target.slice(hash + 1);
65
+ const replacement = old.includes("%") ? encodeURIComponent(newFragment) : newFragment;
66
+ return `${target.slice(0, hash + 1)}${replacement}`;
67
+ }
68
+ //# sourceMappingURL=link-target.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"link-target.js","sourceRoot":"","sources":["../src/link-target.ts"],"names":[],"mappings":"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"}
package/dist/lint.d.ts ADDED
@@ -0,0 +1,13 @@
1
+ import type { Issue } from "./types.js";
2
+ import type { MarkdownDocument } from "./workspace.js";
3
+ export interface LintFileOptions {
4
+ style?: boolean;
5
+ mermaid?: boolean;
6
+ katex?: boolean;
7
+ references?: boolean;
8
+ }
9
+ export declare function lintFile(filePath: string, options?: LintFileOptions, document?: MarkdownDocument): Promise<Issue[]>;
10
+ export declare function findMarkdownFiles(dir: string, selection?: {
11
+ include?: string[];
12
+ exclude?: string[];
13
+ }): string[];
package/dist/lint.js ADDED
@@ -0,0 +1,27 @@
1
+ import { checkMarkdownLint } from "./checkers/markdown-lint.js";
2
+ import { checkMermaid } from "./checkers/mermaid.js";
3
+ import { checkKatex } from "./checkers/katex.js";
4
+ import { checkReferences } from "./checkers/references.js";
5
+ import { runtime } from "./runtime.js";
6
+ export async function lintFile(filePath, options = {}, document) {
7
+ const active = runtime();
8
+ const doc = document ?? active.workspace.document(filePath);
9
+ const { content, tree } = doc;
10
+ const issues = [];
11
+ if (options.style) {
12
+ await checkMarkdownLint(filePath, content, issues, active.config.markdownlint.config);
13
+ }
14
+ if (options.mermaid ?? active.config.checks.mermaid) {
15
+ await checkMermaid(filePath, content, issues, tree);
16
+ }
17
+ if (options.katex ?? active.config.checks.katex)
18
+ checkKatex(filePath, content, issues, tree);
19
+ if (options.references ?? active.config.checks.references) {
20
+ checkReferences(filePath, content, issues, tree);
21
+ }
22
+ return issues;
23
+ }
24
+ export function findMarkdownFiles(dir, selection) {
25
+ return runtime().workspace.markdownFiles(dir, selection);
26
+ }
27
+ //# sourceMappingURL=lint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lint.js","sourceRoot":"","sources":["../src/lint.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAUvC,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,QAAgB,EAChB,UAA2B,EAAE,EAC7B,QAA2B;IAE3B,MAAM,MAAM,GAAG,OAAO,EAAE,CAAC;IACzB,MAAM,GAAG,GAAG,QAAQ,IAAI,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC5D,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC;IAC9B,MAAM,MAAM,GAAY,EAAE,CAAC;IAC3B,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,MAAM,iBAAiB,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IACxF,CAAC;IACD,IAAI,OAAO,CAAC,OAAO,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpD,MAAM,YAAY,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;IACtD,CAAC;IACD,IAAI,OAAO,CAAC,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK;QAAE,UAAU,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;IAC7F,IAAI,OAAO,CAAC,UAAU,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;QAC1D,eAAe,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;IACnD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,GAAW,EACX,SAAsD;IAEtD,OAAO,OAAO,EAAE,CAAC,SAAS,CAAC,aAAa,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;AAC3D,CAAC"}
@@ -0,0 +1,73 @@
1
+ import type { Root } from "mdast";
2
+ import type { Node } from "unist";
3
+ export type { Root } from "mdast";
4
+ export interface MdLink {
5
+ line: number;
6
+ linkText: string;
7
+ target: string;
8
+ isImage: boolean;
9
+ isExternal: boolean;
10
+ isAnchorOnly: boolean;
11
+ referenceType: "inline" | "full" | "collapsed" | "shortcut";
12
+ definitionIdentifier?: string;
13
+ destinationLine: number;
14
+ destinationStart?: number;
15
+ destinationEnd?: number;
16
+ }
17
+ export interface MdHeading {
18
+ line: number;
19
+ depth: number;
20
+ text: string;
21
+ slug: string;
22
+ }
23
+ export interface MdCodeBlock {
24
+ line: number;
25
+ endLine: number;
26
+ lang: string | null;
27
+ /**
28
+ * The fence info string after the language, or null.
29
+ *
30
+ * Internal only: no command projects this into a payload. Emitting it
31
+ * unconditionally would change `md code-blocks --format json`, the MCP
32
+ * `list_code_blocks` tool, and `md query code-blocks` for every consumer,
33
+ * for a field that is null on almost every fence.
34
+ */
35
+ meta: string | null;
36
+ value: string;
37
+ /** UTF-16 code-unit offset of the opening fence, or of the first indented line. */
38
+ start: number;
39
+ /** Exclusive. Offsets rather than lines, so a caller can express a scoped edit. */
40
+ end: number;
41
+ }
42
+ export declare function parseMarkdown(content: string): Root;
43
+ /**
44
+ * @deprecated Retained so an existing import keeps resolving. {@link parseMarkdown}
45
+ * has handled frontmatter since the phantom-heading fix; this is now an alias.
46
+ */
47
+ export declare function parseMarkdownWithFrontmatter(content: string): Root;
48
+ export declare function slugify(text: string): string;
49
+ export declare function extractText(node: Node): string;
50
+ export declare function extractLinks(tree: Root, source?: string): MdLink[];
51
+ export declare function extractHeadings(tree: Root): MdHeading[];
52
+ export declare function extractCodeBlocks(tree: Root): MdCodeBlock[];
53
+ /** Takes only what it reads, so a caller can pass any block-shaped record. */
54
+ export declare function isLineInCodeBlock(line: number, codeBlocks: readonly {
55
+ line: number;
56
+ endLine: number;
57
+ }[]): boolean;
58
+ export interface MdTask {
59
+ line: number;
60
+ checked: boolean;
61
+ text: string;
62
+ }
63
+ export declare function extractTasks(tree: Root): MdTask[];
64
+ export interface MdTable {
65
+ line: number;
66
+ endLine: number;
67
+ columns: number;
68
+ rows: number;
69
+ align: (string | null)[];
70
+ headers: string[];
71
+ data: string[][];
72
+ }
73
+ export declare function extractTables(tree: Root): MdTable[];
@@ -0,0 +1,187 @@
1
+ import { unified } from "unified";
2
+ import remarkParse from "remark-parse";
3
+ import remarkGfm from "remark-gfm";
4
+ import remarkFrontmatter from "remark-frontmatter";
5
+ import { visit } from "unist-util-visit";
6
+ import GithubSlugger from "github-slugger";
7
+ /**
8
+ * One parser, and it is frontmatter-aware.
9
+ *
10
+ * Without `remark-frontmatter`, a leading `---\nkey: value\n---` is not a
11
+ * frontmatter block at all: the closing `---` reads as a setext underline, so
12
+ * the YAML body becomes an `<h2>` whose text is the raw keys. Every consumer of
13
+ * this module then inherited that phantom heading — `md headers`, `md outline`,
14
+ * `md stats`, and `md structure` reported it, and `md toc` emitted a link label
15
+ * containing a literal newline, which is not valid Markdown.
16
+ *
17
+ * The plugin only treats `---` at the very start of a document as frontmatter,
18
+ * so a mid-document thematic break or a real setext heading is unaffected, and
19
+ * the `yaml` node holds the block's position so every later node keeps its
20
+ * original line numbers.
21
+ */
22
+ const parser = unified().use(remarkParse).use(remarkGfm).use(remarkFrontmatter, ["yaml"]);
23
+ export function parseMarkdown(content) {
24
+ return parser.parse(content);
25
+ }
26
+ /**
27
+ * @deprecated Retained so an existing import keeps resolving. {@link parseMarkdown}
28
+ * has handled frontmatter since the phantom-heading fix; this is now an alias.
29
+ */
30
+ export function parseMarkdownWithFrontmatter(content) {
31
+ return parser.parse(content);
32
+ }
33
+ export function slugify(text) {
34
+ return new GithubSlugger().slug(text);
35
+ }
36
+ export function extractText(node) {
37
+ const parts = [];
38
+ visit(node, (child) => {
39
+ // Inline code is a literal: its content lives in `value`, not in text children.
40
+ // Include it so rendered labels and GitHub heading slugs retain backtick spans.
41
+ if (child.type === "text" || child.type === "inlineCode") {
42
+ parts.push(child.value);
43
+ }
44
+ });
45
+ return parts.join("");
46
+ }
47
+ function isExternalTarget(target) {
48
+ if (/^[a-z]:[\\/]/i.test(target))
49
+ return false;
50
+ return /^(?:[a-z][a-z\d+.-]*:|\/\/)/i.test(target);
51
+ }
52
+ function destinationSpan(node, target, source, kind) {
53
+ const start = node.position?.start.offset;
54
+ const end = node.position?.end.offset;
55
+ const line = node.position?.start.line ?? 0;
56
+ if (source === undefined || start === undefined || end === undefined)
57
+ return { line };
58
+ const raw = source.slice(start, end);
59
+ const searchFrom = kind === "definition" ? raw.indexOf(":") + 1 : raw.lastIndexOf("]") + 1;
60
+ let relative = raw.indexOf(target, Math.max(0, searchFrom));
61
+ if (relative === -1) {
62
+ const escaped = target.replace(/[()]/g, (char) => `\\${char}`);
63
+ relative = raw.indexOf(escaped, Math.max(0, searchFrom));
64
+ if (relative !== -1) {
65
+ return { start: start + relative, end: start + relative + escaped.length, line };
66
+ }
67
+ return { line };
68
+ }
69
+ return { start: start + relative, end: start + relative + target.length, line };
70
+ }
71
+ function makeLink(line, linkText, target, isImage, referenceType, destination, definitionIdentifier) {
72
+ return {
73
+ line,
74
+ linkText,
75
+ target,
76
+ isImage,
77
+ isExternal: isExternalTarget(target),
78
+ isAnchorOnly: target.startsWith("#"),
79
+ referenceType,
80
+ definitionIdentifier,
81
+ destinationLine: destination.line,
82
+ destinationStart: destination.start,
83
+ destinationEnd: destination.end,
84
+ };
85
+ }
86
+ export function extractLinks(tree, source) {
87
+ const links = [];
88
+ const definitions = new Map();
89
+ visit(tree, "definition", (node) => {
90
+ if (!definitions.has(node.identifier))
91
+ definitions.set(node.identifier, node);
92
+ });
93
+ visit(tree, "link", (node) => {
94
+ const line = node.position?.start.line ?? 0;
95
+ const linkText = extractText(node);
96
+ const target = node.url;
97
+ links.push(makeLink(line, linkText, target, false, "inline", destinationSpan(node, target, source, "inline")));
98
+ });
99
+ visit(tree, "image", (node) => {
100
+ const line = node.position?.start.line ?? 0;
101
+ const linkText = node.alt ?? "";
102
+ const target = node.url;
103
+ links.push(makeLink(line, linkText, target, true, "inline", destinationSpan(node, target, source, "inline")));
104
+ });
105
+ const addReference = (node, isImage) => {
106
+ const definition = definitions.get(node.identifier);
107
+ if (!definition)
108
+ return;
109
+ const line = node.position?.start.line ?? 0;
110
+ const linkText = isImage ? (node.alt ?? "") : extractText(node);
111
+ links.push(makeLink(line, linkText, definition.url, isImage, node.referenceType, destinationSpan(definition, definition.url, source, "definition"), node.identifier));
112
+ };
113
+ visit(tree, "linkReference", (node) => {
114
+ addReference(node, false);
115
+ });
116
+ visit(tree, "imageReference", (node) => {
117
+ addReference(node, true);
118
+ });
119
+ // Sort by line number to maintain document order
120
+ links.sort((a, b) => a.line - b.line);
121
+ return links;
122
+ }
123
+ export function extractHeadings(tree) {
124
+ const headings = [];
125
+ const slugger = new GithubSlugger();
126
+ visit(tree, "heading", (node) => {
127
+ const line = node.position?.start.line ?? 0;
128
+ const text = extractText(node);
129
+ headings.push({ line, depth: node.depth, text, slug: slugger.slug(text) });
130
+ });
131
+ return headings;
132
+ }
133
+ export function extractCodeBlocks(tree) {
134
+ const blocks = [];
135
+ visit(tree, "code", (node) => {
136
+ const line = node.position?.start.line ?? 0;
137
+ const endLine = node.position?.end.line ?? 0;
138
+ blocks.push({
139
+ line,
140
+ endLine,
141
+ lang: node.lang ?? null,
142
+ meta: node.meta ?? null,
143
+ value: node.value,
144
+ start: node.position?.start.offset ?? 0,
145
+ end: node.position?.end.offset ?? 0,
146
+ });
147
+ });
148
+ return blocks;
149
+ }
150
+ /** Takes only what it reads, so a caller can pass any block-shaped record. */
151
+ export function isLineInCodeBlock(line, codeBlocks) {
152
+ return codeBlocks.some((b) => line >= b.line && line <= b.endLine);
153
+ }
154
+ export function extractTasks(tree) {
155
+ const tasks = [];
156
+ visit(tree, "listItem", (node) => {
157
+ if (node.checked === null || node.checked === undefined)
158
+ return;
159
+ const line = node.position?.start.line ?? 0;
160
+ const text = extractText(node);
161
+ tasks.push({ line, checked: node.checked, text });
162
+ });
163
+ return tasks;
164
+ }
165
+ export function extractTables(tree) {
166
+ const tables = [];
167
+ visit(tree, "table", (node) => {
168
+ const line = node.position?.start.line ?? 0;
169
+ const endLine = node.position?.end.line ?? 0;
170
+ const align = node.align ?? [];
171
+ const headerRow = node.children[0];
172
+ const headers = headerRow?.children.map((cell) => extractText(cell)) ?? [];
173
+ const dataRows = node.children.slice(1);
174
+ const data = dataRows.map((row) => row.children.map((cell) => extractText(cell)));
175
+ tables.push({
176
+ line,
177
+ endLine,
178
+ columns: headers.length,
179
+ rows: dataRows.length,
180
+ align,
181
+ headers,
182
+ data,
183
+ });
184
+ });
185
+ return tables;
186
+ }
187
+ //# sourceMappingURL=markdown-ast.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown-ast.js","sourceRoot":"","sources":["../src/markdown-ast.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export interface NestedValueOptions {
2
+ /**
3
+ * Whether a path segment may index into an array.
4
+ *
5
+ * The two call sites this replaces disagree, and both shapes are published:
6
+ * `md frontmatter --key items.0` has always resolved, while
7
+ * `md query duplicates --field frontmatter:items.0` has always returned
8
+ * nothing. Preserved as a flag rather than unified — changing either is a
9
+ * behavior change on a shipped command.
10
+ */
11
+ arrays?: boolean;
12
+ }
13
+ /** Resolves a dotted path against parsed frontmatter. */
14
+ export declare function nestedValue(value: unknown, keyPath: string, options?: NestedValueOptions): unknown;
@@ -0,0 +1,14 @@
1
+ /** Resolves a dotted path against parsed frontmatter. */
2
+ export function nestedValue(value, keyPath, options = {}) {
3
+ const arrays = options.arrays ?? true;
4
+ let current = value;
5
+ for (const part of keyPath.split(".")) {
6
+ if (current === null || current === undefined || typeof current !== "object")
7
+ return undefined;
8
+ if (!arrays && Array.isArray(current))
9
+ return undefined;
10
+ current = current[part];
11
+ }
12
+ return current;
13
+ }
14
+ //# sourceMappingURL=object-path.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"object-path.js","sourceRoot":"","sources":["../src/object-path.ts"],"names":[],"mappings":"AAaA,yDAAyD;AACzD,MAAM,UAAU,WAAW,CACzB,KAAc,EACd,OAAe,EACf,UAA8B,EAAE;IAEhC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC;IACtC,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QACtC,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,OAAO,KAAK,QAAQ;YAAE,OAAO,SAAS,CAAC;QAC/F,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;YAAE,OAAO,SAAS,CAAC;QACxD,OAAO,GAAI,OAAmC,CAAC,IAAI,CAAC,CAAC;IACvD,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}