@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,183 @@
1
+ import path from "node:path";
2
+ import { splitLocalTarget } from "../link-target.js";
3
+ import { ENTITY_KINDS, SPECS, fieldNames, } from "./entities.js";
4
+ /** Anything the user got wrong. Always exit 1, never a silently empty result. */
5
+ export class QueryUsageError extends Error {
6
+ }
7
+ const FRONTMATTER = "frontmatter.";
8
+ // Longest first so ">=" is never read as ">" followed by "=".
9
+ const OPERATORS = ["!=", ">=", "<=", "=", "~", ">", "<"];
10
+ const NAMED = /^!?([a-z][a-z0-9-]*):/;
11
+ const NUMERIC = [">", ">=", "<", "<="];
12
+ export function isEntityKind(value) {
13
+ return ENTITY_KINDS.includes(value);
14
+ }
15
+ /**
16
+ * Resolves a field token against an entity.
17
+ *
18
+ * `frontmatter.<key>` is a virtual field on every entity, read from the
19
+ * containing document. That is what lets `md query tasks --group-by
20
+ * frontmatter.owner` work without a join.
21
+ */
22
+ export function resolveField(entity, token) {
23
+ if (token.startsWith(FRONTMATTER)) {
24
+ const keyPath = token.slice(FRONTMATTER.length);
25
+ if (!keyPath)
26
+ throw new QueryUsageError("frontmatter fields need a key: frontmatter.<key>");
27
+ return { token, keyPath };
28
+ }
29
+ const spec = SPECS[entity].fields.find((field) => field.name === token);
30
+ if (!spec) {
31
+ // A per-occurrence field on `documents` is a hidden join; name the entity
32
+ // that actually has it rather than returning nothing.
33
+ const hint = entity === "documents" && ["line", "text", "target", "slug"].includes(token)
34
+ ? ` Per-occurrence fields need an occurrence entity — try: md query links --select file,${token}`
35
+ : "";
36
+ throw new QueryUsageError(`Unknown field for ${entity}: ${token}. Available: ${fieldNames(entity).join(", ")}, frontmatter.<key>.${hint}`);
37
+ }
38
+ return { token, spec };
39
+ }
40
+ function coerce(spec, value, source) {
41
+ if (spec.type === "boolean") {
42
+ if (value === "true")
43
+ return true;
44
+ if (value === "false")
45
+ return false;
46
+ throw new QueryUsageError(`${source}: ${spec.name} is a boolean field; use true or false`);
47
+ }
48
+ if (spec.type === "number") {
49
+ const parsed = Number(value);
50
+ if (!Number.isFinite(parsed)) {
51
+ throw new QueryUsageError(`${source}: ${spec.name} is a numeric field; ${value} is not`);
52
+ }
53
+ return parsed;
54
+ }
55
+ return value;
56
+ }
57
+ function firstOperator(term) {
58
+ let best;
59
+ for (const operator of OPERATORS) {
60
+ const index = term.indexOf(operator);
61
+ if (index <= 0)
62
+ continue;
63
+ if (!best || index < best.index)
64
+ best = { operator, index };
65
+ }
66
+ return best;
67
+ }
68
+ /**
69
+ * Parses one `--where` term.
70
+ *
71
+ * A term is `NAME:ARG` only when the text before the first colon is a valid
72
+ * predicate name *and* that colon precedes any operator. So `links-to:x.md` is
73
+ * a named predicate while `target=https://example.com` is a comparison.
74
+ */
75
+ export function parseWhere(entity, term) {
76
+ if (!term.trim())
77
+ throw new QueryUsageError("--where needs a predicate");
78
+ const named = NAMED.exec(term);
79
+ const operator = firstOperator(term);
80
+ const colon = term.indexOf(":");
81
+ if (named && (!operator || colon < operator.index)) {
82
+ const negated = term.startsWith("!");
83
+ const name = named[1];
84
+ const argument = term.slice(colon + 1);
85
+ if (!argument)
86
+ throw new QueryUsageError(`${term}: ${name} needs an argument`);
87
+ if (name === "has") {
88
+ const field = resolveField(entity, argument);
89
+ return { type: "named", name, argument, negated, ...field, source: term };
90
+ }
91
+ if (name === "links-to") {
92
+ if (!SPECS[entity].functions.includes("links-to")) {
93
+ throw new QueryUsageError(`${term}: links-to is not available on ${entity}; use documents or links`);
94
+ }
95
+ const parsed = splitLocalTarget(argument);
96
+ return {
97
+ type: "named",
98
+ name,
99
+ argument,
100
+ negated,
101
+ resolved: {
102
+ path: path.resolve(parsed.path),
103
+ ...(parsed.fragment === undefined ? {} : { fragment: parsed.fragment }),
104
+ },
105
+ source: term,
106
+ };
107
+ }
108
+ throw new QueryUsageError(`${term}: unknown predicate ${name}. Available: has, links-to`);
109
+ }
110
+ if (!operator) {
111
+ throw new QueryUsageError(`${term}: not a predicate. Use <field><op><value> with one of ${OPERATORS.join(" ")}, or has:<field> / links-to:<path>`);
112
+ }
113
+ const field = resolveField(entity, term.slice(0, operator.index));
114
+ const value = term.slice(operator.index + operator.operator.length);
115
+ // A statically typed field validates its operator and operand now, so a typo
116
+ // fails loudly. A frontmatter field is untyped YAML and can only be coerced
117
+ // at evaluation.
118
+ if (field.spec) {
119
+ if (NUMERIC.includes(operator.operator) && field.spec.type !== "number") {
120
+ throw new QueryUsageError(`${term}: ${operator.operator} is only valid on numeric fields; ${field.spec.name} is a ${field.spec.type}`);
121
+ }
122
+ return {
123
+ type: "comparison",
124
+ field: field.token,
125
+ operator: operator.operator,
126
+ value,
127
+ operand: coerce(field.spec, value, term),
128
+ spec: field.spec,
129
+ source: term,
130
+ };
131
+ }
132
+ return {
133
+ type: "comparison",
134
+ field: field.token,
135
+ operator: operator.operator,
136
+ value,
137
+ keyPath: field.keyPath,
138
+ source: term,
139
+ };
140
+ }
141
+ /** Splits and validates a comma-separated, repeatable field list. */
142
+ export function parseFieldList(entity, values) {
143
+ const seen = [];
144
+ for (const value of values) {
145
+ for (const token of value.split(",")) {
146
+ const trimmed = token.trim();
147
+ if (!trimmed)
148
+ continue;
149
+ resolveField(entity, trimmed);
150
+ if (!seen.includes(trimmed))
151
+ seen.push(trimmed);
152
+ }
153
+ }
154
+ return seen;
155
+ }
156
+ export function buildPlan(input) {
157
+ if (!isEntityKind(input.kind)) {
158
+ // Shortcut kinds keep their historical payload rather than growing a second
159
+ // shape, so name the entity form that answers the same question.
160
+ const replacement = {
161
+ "missing-h1": " Try: md query documents --where '!has:h1'",
162
+ "links-to": " Try: md query links --where links-to:<path>",
163
+ "frontmatter-keys": " Try: md query frontmatter --select key --group-by key",
164
+ };
165
+ throw new QueryUsageError(`${input.kind} does not support composable options. Entities: ${ENTITY_KINDS.join(", ")}.${replacement[input.kind] ?? ""}`);
166
+ }
167
+ const entity = input.kind;
168
+ const predicates = input.where.map((term) => parseWhere(entity, term));
169
+ const select = parseFieldList(entity, input.select);
170
+ const groupBy = input.groupBy?.trim();
171
+ if (groupBy)
172
+ resolveField(entity, groupBy);
173
+ return {
174
+ entity,
175
+ predicates,
176
+ select: select.length
177
+ ? select
178
+ : SPECS[entity].fields.filter((field) => field.default).map((field) => field.name),
179
+ selectExplicit: select.length > 0,
180
+ ...(groupBy ? { groupBy } : {}),
181
+ };
182
+ }
183
+ //# sourceMappingURL=plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.js","sourceRoot":"","sources":["../../src/query/plan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { QueryPlan } from "./plan.js";
2
+ import type { QueryResult } from "./execute.js";
3
+ export declare function renderQueryText(result: QueryResult, plan: QueryPlan, directory: string, human: boolean): string;
@@ -0,0 +1,39 @@
1
+ const MAX_WIDTH = 60;
2
+ function cell(value) {
3
+ if (value === undefined || value === null)
4
+ return "(none)";
5
+ const text = Array.isArray(value) ? value.join(", ") : String(value);
6
+ // Task text and code-block bodies can span lines; a table row must not.
7
+ const flat = text.replace(/[\t\r\n]+/g, " ");
8
+ return flat.length > MAX_WIDTH ? `${flat.slice(0, MAX_WIDTH - 1)}…` : flat;
9
+ }
10
+ function table(fields, rows, indent) {
11
+ const widths = fields.map((field) => Math.max(field.length, ...rows.map((row) => cell(row[field]).length), 0));
12
+ const line = (values) => indent +
13
+ values
14
+ .map((value, index) => value.padEnd(widths[index]))
15
+ .join(" ")
16
+ .trimEnd();
17
+ return [line(fields), ...rows.map((row) => line(fields.map((field) => cell(row[field]))))];
18
+ }
19
+ export function renderQueryText(result, plan, directory, human) {
20
+ const bold = (value) => (human ? `\x1b[1m${value}\x1b[0m` : value);
21
+ const summary = plan.predicates.length
22
+ ? `${result.matched} ${plan.entity} matching: ${plan.predicates.map((p) => p.source).join(", ")}`
23
+ : `${result.matched} ${plan.entity} in ${directory}`;
24
+ const lines = [bold(summary)];
25
+ // An empty result prints the plan that ran, so a predicate that silently
26
+ // matched nothing is still visible.
27
+ if (!result.matched)
28
+ return lines.join("\n");
29
+ if (result.groups) {
30
+ for (const group of result.groups) {
31
+ lines.push("", bold(`${plan.groupBy}=${group.key ?? "(none)"} (${group.count})`));
32
+ lines.push(...table(result.fields, group.rows, " "));
33
+ }
34
+ return lines.join("\n");
35
+ }
36
+ lines.push(...table(result.fields, result.rows, ""));
37
+ return lines.join("\n");
38
+ }
39
+ //# sourceMappingURL=render.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/query/render.ts"],"names":[],"mappings":"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"}
package/dist/refs.d.ts ADDED
@@ -0,0 +1,19 @@
1
+ import { type Root } from "./markdown-ast.js";
2
+ export interface Reference {
3
+ line: number;
4
+ linkText: string;
5
+ target: string;
6
+ isImage: boolean;
7
+ isExternal: boolean;
8
+ isAnchorOnly: boolean;
9
+ referenceType: "inline" | "full" | "collapsed" | "shortcut";
10
+ definitionIdentifier?: string;
11
+ destinationLine: number;
12
+ destinationStart?: number;
13
+ destinationEnd?: number;
14
+ }
15
+ /**
16
+ * Extract all markdown references (links and images) from content,
17
+ * skipping code blocks.
18
+ */
19
+ export declare function extractReferences(input: string | Root): Reference[];
package/dist/refs.js ADDED
@@ -0,0 +1,10 @@
1
+ import { parseMarkdown, extractLinks } from "./markdown-ast.js";
2
+ /**
3
+ * Extract all markdown references (links and images) from content,
4
+ * skipping code blocks.
5
+ */
6
+ export function extractReferences(input) {
7
+ const tree = typeof input === "string" ? parseMarkdown(input) : input;
8
+ return extractLinks(tree, typeof input === "string" ? input : undefined);
9
+ }
10
+ //# sourceMappingURL=refs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refs.js","sourceRoot":"","sources":["../src/refs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,YAAY,EAAa,MAAM,mBAAmB,CAAC;AAgB3E;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAoB;IACpD,MAAM,IAAI,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IACtE,OAAO,YAAY,CAAC,IAAI,EAAE,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;AAC3E,CAAC"}
@@ -0,0 +1,49 @@
1
+ export interface EmitOptions {
2
+ /** Canonical command id, e.g. "md graph". */
3
+ command: string;
4
+ ok: boolean;
5
+ exitCode: 0 | 1 | 2;
6
+ /** When false or absent the payload is written exactly as it always was. */
7
+ envelope?: boolean;
8
+ /** Schema id for the wrapped payload; resolved to its canonical uri. */
9
+ schema?: string | null;
10
+ /** Optional command-specific counters. */
11
+ summary?: Record<string, unknown>;
12
+ }
13
+ export interface ResultEnvelope {
14
+ schemaVersion: string;
15
+ tool: {
16
+ name: string;
17
+ version: string;
18
+ };
19
+ command: string;
20
+ ok: boolean;
21
+ exitCode: 0 | 1 | 2;
22
+ schema: string | null;
23
+ data: unknown;
24
+ summary?: Record<string, unknown>;
25
+ }
26
+ export declare function wrap(payload: unknown, opts: EmitOptions): ResultEnvelope;
27
+ /**
28
+ * Renders a JSON payload, optionally wrapped in the versioned envelope.
29
+ *
30
+ * Without `envelope` the output is byte-identical to a direct
31
+ * `JSON.stringify(payload, null, 2)`, which is what keeps `--envelope` an
32
+ * additive change rather than a breaking one.
33
+ */
34
+ export declare function renderJson(payload: unknown, opts: EmitOptions): string;
35
+ export declare function emitJson(payload: unknown, opts: EmitOptions, stream?: NodeJS.WritableStream): void;
36
+ export interface Outcome {
37
+ ok?: boolean;
38
+ exitCode?: 0 | 1 | 2;
39
+ summary?: Record<string, unknown>;
40
+ }
41
+ /**
42
+ * Renders a command's JSON payload, looking its schema id up in the registry.
43
+ *
44
+ * This is the single place every `--format json` write site goes through, so
45
+ * `--envelope` reaches all of them and the unenveloped bytes stay unchanged.
46
+ */
47
+ export declare function jsonPayload(command: string, payload: unknown, opts: {
48
+ envelope?: boolean;
49
+ }, outcome?: Outcome): string;
package/dist/result.js ADDED
@@ -0,0 +1,47 @@
1
+ import { COMMAND_CONTRACTS } from "./contract/registry.js";
2
+ import { CONTRACT_VERSION } from "./contract/version.js";
3
+ import { schemaUriFor } from "./contract/schemas/index.js";
4
+ import { packageName, packageVersion } from "./version.js";
5
+ export function wrap(payload, opts) {
6
+ return {
7
+ schemaVersion: CONTRACT_VERSION,
8
+ tool: { name: packageName, version: packageVersion },
9
+ command: opts.command,
10
+ ok: opts.ok,
11
+ exitCode: opts.exitCode,
12
+ schema: schemaUriFor(opts.schema),
13
+ data: payload,
14
+ ...(opts.summary ? { summary: opts.summary } : {}),
15
+ };
16
+ }
17
+ /**
18
+ * Renders a JSON payload, optionally wrapped in the versioned envelope.
19
+ *
20
+ * Without `envelope` the output is byte-identical to a direct
21
+ * `JSON.stringify(payload, null, 2)`, which is what keeps `--envelope` an
22
+ * additive change rather than a breaking one.
23
+ */
24
+ export function renderJson(payload, opts) {
25
+ return JSON.stringify(opts.envelope ? wrap(payload, opts) : payload, null, 2) + "\n";
26
+ }
27
+ export function emitJson(payload, opts, stream = process.stdout) {
28
+ stream.write(renderJson(payload, opts));
29
+ }
30
+ /**
31
+ * Renders a command's JSON payload, looking its schema id up in the registry.
32
+ *
33
+ * This is the single place every `--format json` write site goes through, so
34
+ * `--envelope` reaches all of them and the unenveloped bytes stay unchanged.
35
+ */
36
+ export function jsonPayload(command, payload, opts, outcome = {}) {
37
+ const exitCode = outcome.exitCode ?? 0;
38
+ return renderJson(payload, {
39
+ command,
40
+ ok: outcome.ok ?? exitCode === 0,
41
+ exitCode,
42
+ envelope: Boolean(opts.envelope),
43
+ schema: COMMAND_CONTRACTS[command]?.outputSchema,
44
+ summary: outcome.summary,
45
+ });
46
+ }
47
+ //# sourceMappingURL=result.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"result.js","sourceRoot":"","sources":["../src/result.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AA0B3D,MAAM,UAAU,IAAI,CAAC,OAAgB,EAAE,IAAiB;IACtD,OAAO;QACL,aAAa,EAAE,gBAAgB;QAC/B,IAAI,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,cAAc,EAAE;QACpD,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,MAAM,EAAE,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC;QACjC,IAAI,EAAE,OAAO;QACb,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACnD,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,UAAU,CAAC,OAAgB,EAAE,IAAiB;IAC5D,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;AACvF,CAAC;AAED,MAAM,UAAU,QAAQ,CACtB,OAAgB,EAChB,IAAiB,EACjB,SAAgC,OAAO,CAAC,MAAM;IAE9C,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;AAC1C,CAAC;AAQD;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CACzB,OAAe,EACf,OAAgB,EAChB,IAA4B,EAC5B,UAAmB,EAAE;IAErB,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC;IACvC,OAAO,UAAU,CAAC,OAAO,EAAE;QACzB,OAAO;QACP,EAAE,EAAE,OAAO,CAAC,EAAE,IAAI,QAAQ,KAAK,CAAC;QAChC,QAAQ;QACR,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;QAChC,MAAM,EAAE,iBAAiB,CAAC,OAAO,CAAC,EAAE,YAAY;QAChD,OAAO,EAAE,OAAO,CAAC,OAAO;KACzB,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,35 @@
1
+ import type { ResolvedConfig } from "./config.js";
2
+ import { type PathStyle } from "./config.js";
3
+ import { Workspace, type WorkspaceOptions } from "./workspace.js";
4
+ import type { OutputFormat } from "./types.js";
5
+ export interface Runtime {
6
+ config: ResolvedConfig;
7
+ workspace: Workspace;
8
+ }
9
+ /**
10
+ * Installs the process-wide runtime.
11
+ *
12
+ * `options` exists for the long-lived server: library helpers such as
13
+ * `documentsReferencing` and `lintFile` reach for `runtime().workspace`, so a
14
+ * bounded workspace has to be *the* workspace rather than a second instance
15
+ * alongside it, or those helpers would quietly populate the unbounded one.
16
+ */
17
+ export declare function initializeRuntime(config: ResolvedConfig, options?: WorkspaceOptions): Runtime;
18
+ export declare function resetRuntime(): void;
19
+ export declare function runtime(): Runtime;
20
+ export type ResolvedOptions<T extends Record<string, unknown>> = T & {
21
+ format: OutputFormat;
22
+ paths: PathStyle;
23
+ };
24
+ /**
25
+ * Which of `cli`'s keys the user actually typed.
26
+ *
27
+ * Commander hands back defaults and typed values indistinguishably, so this
28
+ * re-reads argv. Config resolution needs it to know what to override, and a
29
+ * command that rejects conflicting options needs it to avoid misfiring on a
30
+ * value that came from `.cairn.yml` rather than the command line.
31
+ */
32
+ export declare function explicitOptionKeys(cli: Record<string, unknown>): Set<string>;
33
+ export declare function commandOptions<T extends Record<string, unknown>>(command: string, builtins: T, cli: Record<string, unknown>): ResolvedOptions<T>;
34
+ export declare function displayPath(filePath: string, style?: PathStyle): string;
35
+ export declare function outputPath(filePath: string, options: object): string;
@@ -0,0 +1,77 @@
1
+ import { loadConfig, resolveCommandOptions } from "./config.js";
2
+ import { Workspace } from "./workspace.js";
3
+ import { ALL_FORMATS, supportsDiagnosticFormats } from "./formats.js";
4
+ let activeRuntime;
5
+ /**
6
+ * Installs the process-wide runtime.
7
+ *
8
+ * `options` exists for the long-lived server: library helpers such as
9
+ * `documentsReferencing` and `lintFile` reach for `runtime().workspace`, so a
10
+ * bounded workspace has to be *the* workspace rather than a second instance
11
+ * alongside it, or those helpers would quietly populate the unbounded one.
12
+ */
13
+ export function initializeRuntime(config, options) {
14
+ activeRuntime = { config, workspace: new Workspace(config, options) };
15
+ return activeRuntime;
16
+ }
17
+ export function resetRuntime() {
18
+ activeRuntime = undefined;
19
+ }
20
+ export function runtime() {
21
+ return activeRuntime ?? initializeRuntime(loadConfig({ disabled: true }));
22
+ }
23
+ const OPTION_ALIASES = {
24
+ format: ["-fh", "-fj"],
25
+ style: ["-s"],
26
+ external: ["-e"],
27
+ anchors: ["-a"],
28
+ images: ["-i"],
29
+ };
30
+ /**
31
+ * Which of `cli`'s keys the user actually typed.
32
+ *
33
+ * Commander hands back defaults and typed values indistinguishably, so this
34
+ * re-reads argv. Config resolution needs it to know what to override, and a
35
+ * command that rejects conflicting options needs it to avoid misfiring on a
36
+ * value that came from `.cairn.yml` rather than the command line.
37
+ */
38
+ export function explicitOptionKeys(cli) {
39
+ const argv = process.argv.slice(2);
40
+ return new Set(Object.keys(cli).filter((key) => {
41
+ const kebab = key.replace(/[A-Z]/g, (char) => `-${char.toLowerCase()}`);
42
+ return argv.some((arg) => arg === `--${kebab}` ||
43
+ arg === `--no-${kebab}` ||
44
+ arg.startsWith(`--${kebab}=`) ||
45
+ (OPTION_ALIASES[key] ?? []).includes(arg));
46
+ }));
47
+ }
48
+ export function commandOptions(command, builtins, cli) {
49
+ const typed = explicitOptionKeys(cli);
50
+ const explicit = Object.fromEntries(Object.entries(cli).filter(([key]) => typed.has(key)));
51
+ const resolved = resolveCommandOptions(runtime().config, command, builtins, explicit);
52
+ if (!ALL_FORMATS.includes(resolved.format)) {
53
+ throw new Error(`Invalid output format: ${String(resolved.format)}`);
54
+ }
55
+ if ((resolved.format === "jsonl" || resolved.format === "sarif") &&
56
+ !supportsDiagnosticFormats(command)) {
57
+ throw new Error(`${resolved.format} output is not supported by md ${command}`);
58
+ }
59
+ if (resolved.paths !== "absolute" && resolved.paths !== "relative") {
60
+ throw new Error(`Invalid path display style: ${String(resolved.paths)}`);
61
+ }
62
+ // The envelope is a JSON wrapper; there is nothing to wrap in the other
63
+ // formats, so accepting it there would silently do nothing.
64
+ if (resolved.envelope && resolved.format !== "json") {
65
+ throw new Error("--envelope requires --format json");
66
+ }
67
+ return resolved;
68
+ }
69
+ export function displayPath(filePath, style) {
70
+ return runtime().workspace.displayPath(filePath, style);
71
+ }
72
+ export function outputPath(filePath, options) {
73
+ const value = options.paths;
74
+ const style = value === "relative" || value === "absolute" ? value : undefined;
75
+ return displayPath(filePath, style);
76
+ }
77
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,qBAAqB,EAAkB,MAAM,aAAa,CAAC;AAChF,OAAO,EAAE,SAAS,EAAyB,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AAQtE,IAAI,aAAkC,CAAC;AAEvC;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAsB,EAAE,OAA0B;IAClF,aAAa,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IACtE,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,aAAa,GAAG,SAAS,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,OAAO;IACrB,OAAO,aAAa,IAAI,iBAAiB,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AAC5E,CAAC;AAOD,MAAM,cAAc,GAA6B;IAC/C,MAAM,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,KAAK,EAAE,CAAC,IAAI,CAAC;IACb,QAAQ,EAAE,CAAC,IAAI,CAAC;IAChB,OAAO,EAAE,CAAC,IAAI,CAAC;IACf,MAAM,EAAE,CAAC,IAAI,CAAC;CACf,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAA4B;IAC7D,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,OAAO,IAAI,GAAG,CACZ,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE;QAC9B,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QACxE,OAAO,IAAI,CAAC,IAAI,CACd,CAAC,GAAG,EAAE,EAAE,CACN,GAAG,KAAK,KAAK,KAAK,EAAE;YACpB,GAAG,KAAK,QAAQ,KAAK,EAAE;YACvB,GAAG,CAAC,UAAU,CAAC,KAAK,KAAK,GAAG,CAAC;YAC7B,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAC5C,CAAC;IACJ,CAAC,CAAC,CACH,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,OAAe,EACf,QAAW,EACX,GAA4B;IAE5B,MAAM,KAAK,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;IACtC,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC3F,MAAM,QAAQ,GAAG,qBAAqB,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACtF,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CAAC,0BAA0B,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACvE,CAAC;IACD,IACE,CAAC,QAAQ,CAAC,MAAM,KAAK,OAAO,IAAI,QAAQ,CAAC,MAAM,KAAK,OAAO,CAAC;QAC5D,CAAC,yBAAyB,CAAC,OAAO,CAAC,EACnC,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,GAAG,QAAQ,CAAC,MAAM,kCAAkC,OAAO,EAAE,CAAC,CAAC;IACjF,CAAC;IACD,IAAI,QAAQ,CAAC,KAAK,KAAK,UAAU,IAAI,QAAQ,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;QACnE,MAAM,IAAI,KAAK,CAAC,+BAA+B,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC3E,CAAC;IACD,wEAAwE;IACxE,4DAA4D;IAC5D,IAAK,QAAmC,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAChF,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACvD,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,QAAgB,EAAE,KAAiB;IAC7D,OAAO,OAAO,EAAE,CAAC,SAAS,CAAC,WAAW,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,QAAgB,EAAE,OAAe;IAC1D,MAAM,KAAK,GAAI,OAA+B,CAAC,KAAK,CAAC;IACrD,MAAM,KAAK,GAAG,KAAK,KAAK,UAAU,IAAI,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IAC/E,OAAO,WAAW,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;AACtC,CAAC"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * The SARIF 2.1.0 envelope, shared by the `md` diagnostic commands and by
3
+ * `agent audit`.
4
+ *
5
+ * `JSON.stringify` follows insertion order, so both the document and each
6
+ * caller's result objects must be built in a fixed order — this is what keeps
7
+ * the `md` output byte-identical now that two producers share the envelope.
8
+ */
9
+ export declare const SARIF_VERSION = "2.1.0";
10
+ export declare const SARIF_SCHEMA = "https://json.schemastore.org/sarif-2.1.0.json";
11
+ export interface SarifRule {
12
+ id: string;
13
+ name: string;
14
+ }
15
+ export type SarifLevel = "error" | "warning" | "note";
16
+ export interface SarifResult {
17
+ ruleId: string;
18
+ level: SarifLevel;
19
+ message: {
20
+ text: string;
21
+ };
22
+ locations: Array<{
23
+ physicalLocation: {
24
+ artifactLocation: {
25
+ uri: string;
26
+ };
27
+ /** Omitted by producers whose findings have no line. */
28
+ region?: {
29
+ startLine: number;
30
+ };
31
+ };
32
+ }>;
33
+ properties?: Record<string, unknown>;
34
+ }
35
+ /** Renders one SARIF run. Returns without a trailing newline. */
36
+ export declare function sarifDocument(rules: readonly SarifRule[], results: readonly SarifResult[]): string;
package/dist/sarif.js ADDED
@@ -0,0 +1,30 @@
1
+ /**
2
+ * The SARIF 2.1.0 envelope, shared by the `md` diagnostic commands and by
3
+ * `agent audit`.
4
+ *
5
+ * `JSON.stringify` follows insertion order, so both the document and each
6
+ * caller's result objects must be built in a fixed order — this is what keeps
7
+ * the `md` output byte-identical now that two producers share the envelope.
8
+ */
9
+ export const SARIF_VERSION = "2.1.0";
10
+ export const SARIF_SCHEMA = "https://json.schemastore.org/sarif-2.1.0.json";
11
+ /** Renders one SARIF run. Returns without a trailing newline. */
12
+ export function sarifDocument(rules, results) {
13
+ return JSON.stringify({
14
+ version: SARIF_VERSION,
15
+ $schema: SARIF_SCHEMA,
16
+ runs: [
17
+ {
18
+ tool: {
19
+ driver: {
20
+ name: "cairn",
21
+ informationUri: "https://github.com/cairn-tool/cairn",
22
+ rules,
23
+ },
24
+ },
25
+ results,
26
+ },
27
+ ],
28
+ }, null, 2);
29
+ }
30
+ //# sourceMappingURL=sarif.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sarif.js","sourceRoot":"","sources":["../src/sarif.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,CAAC,MAAM,aAAa,GAAG,OAAO,CAAC;AACrC,MAAM,CAAC,MAAM,YAAY,GAAG,+CAA+C,CAAC;AAuB5E,iEAAiE;AACjE,MAAM,UAAU,aAAa,CAC3B,KAA2B,EAC3B,OAA+B;IAE/B,OAAO,IAAI,CAAC,SAAS,CACnB;QACE,OAAO,EAAE,aAAa;QACtB,OAAO,EAAE,YAAY;QACrB,IAAI,EAAE;YACJ;gBACE,IAAI,EAAE;oBACJ,MAAM,EAAE;wBACN,IAAI,EAAE,OAAO;wBACb,cAAc,EAAE,qCAAqC;wBACrD,KAAK;qBACN;iBACF;gBACD,OAAO;aACR;SACF;KACF,EACD,IAAI,EACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,65 @@
1
+ import type { ScriptDefinition, ScriptRegistry } from "./registry.js";
2
+ /** Deep enough for real composition, shallow enough to stop a runaway. */
3
+ export declare const MAX_SCRIPT_DEPTH = 8;
4
+ export interface ScriptExecution {
5
+ /** `pass-through` for llm and human, `capture` for json. */
6
+ mode: "pass-through" | "capture";
7
+ definition: ScriptDefinition;
8
+ registry: ScriptRegistry;
9
+ workingDirectory: string;
10
+ invokedFrom: string;
11
+ /** Verbatim tokens after the first `--`. */
12
+ args: readonly string[];
13
+ }
14
+ export interface ScriptOutcome {
15
+ /** The child's status, or null when a signal killed it or it never started. */
16
+ code: number | null;
17
+ signal: NodeJS.Signals | null;
18
+ /** Capture mode only. */
19
+ stdout?: string;
20
+ stderr?: string;
21
+ truncated?: {
22
+ stdout: boolean;
23
+ stderr: boolean;
24
+ };
25
+ durationMs: number;
26
+ /** Set when the child could not be started at all. */
27
+ startupError?: string;
28
+ }
29
+ /**
30
+ * The child's environment.
31
+ *
32
+ * Every variable is exported under both the current and the pre-rename spelling.
33
+ * A script is user code this tool does not get to edit, so one already reading
34
+ * `CLAUDE_CLI_SCRIPT_ROOT` has to keep working; duplicating six variables is the
35
+ * cheap half of that bargain.
36
+ */
37
+ export declare function scriptEnvironment(execution: ScriptExecution): NodeJS.ProcessEnv;
38
+ /**
39
+ * Refuses a script that is already running.
40
+ *
41
+ * This is a footgun guard, not a security control — a script can clear either
42
+ * variable. It exists so a self-referential definition fails immediately instead
43
+ * of forking until something else gives out.
44
+ */
45
+ export declare function checkRecursionDepth(execution: ScriptExecution): void;
46
+ interface SpawnPlan {
47
+ command: string;
48
+ argv: string[];
49
+ }
50
+ /**
51
+ * The program and argv for one script.
52
+ *
53
+ * Exported for the unit tests, which assert the exact argv rather than
54
+ * inspecting behavior through a child process.
55
+ */
56
+ export declare function spawnPlan(execution: ScriptExecution): SpawnPlan;
57
+ export declare function executeScript(execution: ScriptExecution): Promise<ScriptOutcome>;
58
+ /**
59
+ * The status this process exits with when it passes the child's through.
60
+ *
61
+ * A bare `code & 0xff` would map 256 to 0, reporting success for a child that
62
+ * failed, so an out-of-range code that truncates to zero becomes 1 instead.
63
+ */
64
+ export declare function exitStatusFor(outcome: ScriptOutcome): number;
65
+ export {};