@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,188 @@
1
+ import fs from "node:fs";
2
+ import { parse as parseYaml } from "yaml";
3
+ import { Ajv2020 } from "ajv/dist/2020.js";
4
+ import addFormatsImport from "ajv-formats";
5
+ function nested(data, propertyPath) {
6
+ let value = data;
7
+ for (const part of propertyPath.split(".")) {
8
+ if (value === null || typeof value !== "object" || Array.isArray(value))
9
+ return undefined;
10
+ value = value[part];
11
+ }
12
+ return value;
13
+ }
14
+ function actualType(value) {
15
+ if (value === null)
16
+ return "null";
17
+ if (Array.isArray(value))
18
+ return "array";
19
+ if (typeof value === "number" && Number.isInteger(value))
20
+ return "integer";
21
+ return typeof value;
22
+ }
23
+ export class FrontmatterValidator {
24
+ rules;
25
+ schema;
26
+ formatValidators = new Map();
27
+ constructor(rules, schemaPath) {
28
+ this.rules = rules;
29
+ const ajv = new Ajv2020({ allErrors: true, strict: false });
30
+ const addFormats = addFormatsImport;
31
+ addFormats(ajv);
32
+ if (schemaPath) {
33
+ if (!fs.existsSync(schemaPath) || !fs.statSync(schemaPath).isFile())
34
+ throw new Error(`Schema file not found: ${schemaPath}`);
35
+ let schema;
36
+ try {
37
+ schema = parseYaml(fs.readFileSync(schemaPath, "utf-8"));
38
+ }
39
+ catch (error) {
40
+ throw new Error(`Malformed schema file ${schemaPath}: ${error.message}`, {
41
+ cause: error,
42
+ });
43
+ }
44
+ try {
45
+ this.schema = ajv.compile(schema);
46
+ }
47
+ catch (error) {
48
+ throw new Error(`Invalid schema ${schemaPath}: ${error.message}`, {
49
+ cause: error,
50
+ });
51
+ }
52
+ }
53
+ for (const format of new Set(Object.values(rules.formats))) {
54
+ try {
55
+ this.formatValidators.set(format, ajv.compile({ type: "string", format }));
56
+ }
57
+ catch {
58
+ throw new Error(`Unsupported frontmatter format: ${format}`);
59
+ }
60
+ }
61
+ }
62
+ validate(document) {
63
+ const result = document.frontmatter;
64
+ if (result.status === "malformed")
65
+ return [
66
+ { file: document.path, line: 1, checker: "frontmatter/yaml", message: result.message },
67
+ ];
68
+ if (result.status === "non-mapping")
69
+ return [
70
+ {
71
+ file: document.path,
72
+ line: 1,
73
+ checker: "frontmatter/type",
74
+ message: "Frontmatter must be a mapping",
75
+ },
76
+ ];
77
+ const data = result.status === "valid" ? result.data : {};
78
+ const issues = [];
79
+ if (this.schema && !this.schema(data)) {
80
+ for (const error of this.schema.errors ?? []) {
81
+ const location = error.instancePath || "/";
82
+ issues.push({
83
+ file: document.path,
84
+ line: 1,
85
+ checker: "frontmatter/schema",
86
+ message: `${location} ${error.message ?? "is invalid"}`,
87
+ });
88
+ }
89
+ }
90
+ for (const property of this.rules.required)
91
+ if (nested(data, property) === undefined)
92
+ issues.push({
93
+ file: document.path,
94
+ line: 1,
95
+ checker: "frontmatter/required",
96
+ message: `Required property missing: ${property}`,
97
+ });
98
+ for (const property of this.rules.prohibited)
99
+ if (nested(data, property) !== undefined)
100
+ issues.push({
101
+ file: document.path,
102
+ line: 1,
103
+ checker: "frontmatter/prohibited",
104
+ message: `Prohibited property present: ${property}`,
105
+ });
106
+ for (const [property, expected] of Object.entries(this.rules.types)) {
107
+ const value = nested(data, property);
108
+ if (value === undefined)
109
+ continue;
110
+ const matches = expected === "number"
111
+ ? typeof value === "number"
112
+ : expected === "object"
113
+ ? value !== null && typeof value === "object" && !Array.isArray(value)
114
+ : actualType(value) === expected;
115
+ if (!matches)
116
+ issues.push({
117
+ file: document.path,
118
+ line: 1,
119
+ checker: "frontmatter/type",
120
+ message: `${property} must be ${expected}`,
121
+ });
122
+ }
123
+ for (const [property, allowed] of Object.entries(this.rules.allowedValues)) {
124
+ const value = nested(data, property);
125
+ if (value !== undefined &&
126
+ !allowed.some((item) => JSON.stringify(item) === JSON.stringify(value)))
127
+ issues.push({
128
+ file: document.path,
129
+ line: 1,
130
+ checker: "frontmatter/allowed-values",
131
+ message: `${property} has a value that is not allowed`,
132
+ });
133
+ }
134
+ for (const [property, pattern] of Object.entries(this.rules.patterns)) {
135
+ const value = nested(data, property);
136
+ if (value !== undefined && (typeof value !== "string" || !new RegExp(pattern).test(value)))
137
+ issues.push({
138
+ file: document.path,
139
+ line: 1,
140
+ checker: "frontmatter/pattern",
141
+ message: `${property} does not match ${pattern}`,
142
+ });
143
+ }
144
+ for (const [property, format] of Object.entries(this.rules.formats)) {
145
+ const value = nested(data, property);
146
+ const validate = this.formatValidators.get(format);
147
+ if (value !== undefined && !validate(value))
148
+ issues.push({
149
+ file: document.path,
150
+ line: 1,
151
+ checker: "frontmatter/format",
152
+ message: `${property} must match format ${format}`,
153
+ });
154
+ }
155
+ return issues;
156
+ }
157
+ validateMany(documents) {
158
+ const issues = documents.flatMap((document) => this.validate(document));
159
+ for (const property of this.rules.unique) {
160
+ const groups = new Map();
161
+ for (const document of documents) {
162
+ if (document.frontmatter.status !== "valid")
163
+ continue;
164
+ const value = nested(document.frontmatter.data, property);
165
+ if (value === undefined || value === null || typeof value === "object")
166
+ continue;
167
+ const key = `${typeof value}:${String(value)}`;
168
+ const group = groups.get(key) ?? [];
169
+ group.push(document);
170
+ groups.set(key, group);
171
+ }
172
+ for (const group of groups.values()) {
173
+ if (group.length < 2)
174
+ continue;
175
+ for (const document of group) {
176
+ issues.push({
177
+ file: document.path,
178
+ line: 1,
179
+ checker: "frontmatter/unique",
180
+ message: `${property} duplicates a value elsewhere in the selected workspace`,
181
+ });
182
+ }
183
+ }
184
+ }
185
+ return issues;
186
+ }
187
+ }
188
+ //# sourceMappingURL=frontmatter-validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frontmatter-validation.js","sourceRoot":"","sources":["../src/frontmatter-validation.ts"],"names":[],"mappings":"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"}
package/dist/git.d.ts ADDED
@@ -0,0 +1,40 @@
1
+ export interface GitRepository {
2
+ /** Repository toplevel, as git reports it — already symlink-resolved. */
3
+ root: string;
4
+ /** The workspace root the caller asked about, which may be a symlink to it. */
5
+ workspaceRoot: string;
6
+ }
7
+ export type RevisionStatus = "A" | "M" | "D" | "R" | "C";
8
+ export interface RevisionChange {
9
+ status: RevisionStatus;
10
+ /** Repository-relative path at the revision. Absent for an addition. */
11
+ oldPath?: string;
12
+ /** Repository-relative path in the worktree. Absent for a deletion. */
13
+ newPath?: string;
14
+ /** Similarity index git reported for a rename or copy, 0-100. */
15
+ similarity?: number;
16
+ }
17
+ export declare function repositoryFor(root: string): GitRepository;
18
+ /** Resolves a revision to a commit sha, so a report can name what it compared. */
19
+ export declare function resolveCommit(repository: GitRepository, revision: string): string;
20
+ /**
21
+ * Repository-relative POSIX path for an absolute worktree path.
22
+ *
23
+ * `rev-parse --show-toplevel` reports the real path while the workspace root may
24
+ * be a symlink to it — `/tmp` is one on macOS — so both sides are resolved
25
+ * before the relative path is taken. A file that no longer exists in the
26
+ * worktree is resolved through its parent directory instead.
27
+ */
28
+ export declare function repositoryRelative(repository: GitRepository, absolutePath: string): string;
29
+ /** Absolute worktree path for a repository-relative path. */
30
+ export declare function worktreePath(repository: GitRepository, repoRelativePath: string): string;
31
+ /**
32
+ * Reads one path at a revision.
33
+ *
34
+ * Returns undefined only when git says the path is not in that revision — the
35
+ * "added since" case. Every other failure rethrows, because treating a typo'd
36
+ * revision as "the whole tree is new" is the worst thing this function could do.
37
+ */
38
+ export declare function readAtRevision(repository: GitRepository, revision: string, repoRelativePath: string): string | undefined;
39
+ /** Markdown paths that differ between `revision` and the worktree. */
40
+ export declare function changesSince(repository: GitRepository, revision: string): RevisionChange[];
package/dist/git.js ADDED
@@ -0,0 +1,124 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { execFileSync } from "node:child_process";
4
+ /** `md diff` accepts both spellings; `--changed-since` accepts `.mdown` instead. */
5
+ const MARKDOWN = /\.(md|markdown)$/i;
6
+ function git(repository, args, revision) {
7
+ try {
8
+ return execFileSync("git", ["-C", repository, ...args], {
9
+ encoding: "utf-8",
10
+ stdio: ["ignore", "pipe", "pipe"],
11
+ });
12
+ }
13
+ catch (error) {
14
+ throw failure(error, revision);
15
+ }
16
+ }
17
+ function failure(error, revision) {
18
+ const detail = error.stderr;
19
+ const message = detail ? String(detail).trim().split("\n")[0] : error.message;
20
+ return new Error(`Unable to read revision ${revision}: ${message}`, { cause: error });
21
+ }
22
+ export function repositoryFor(root) {
23
+ const workspaceRoot = fs.realpathSync(path.resolve(root));
24
+ try {
25
+ const toplevel = execFileSync("git", ["-C", root, "rev-parse", "--show-toplevel"], {
26
+ encoding: "utf-8",
27
+ stdio: ["ignore", "pipe", "pipe"],
28
+ }).trim();
29
+ return { root: fs.realpathSync(toplevel), workspaceRoot };
30
+ }
31
+ catch (error) {
32
+ const detail = error.stderr;
33
+ const message = detail ? String(detail).trim().split("\n")[0] : error.message;
34
+ throw new Error(`Not inside a Git repository: ${message}`, { cause: error });
35
+ }
36
+ }
37
+ /** Resolves a revision to a commit sha, so a report can name what it compared. */
38
+ export function resolveCommit(repository, revision) {
39
+ return git(repository.root, ["rev-parse", "--verify", `${revision}^{commit}`], revision).trim();
40
+ }
41
+ /**
42
+ * Repository-relative POSIX path for an absolute worktree path.
43
+ *
44
+ * `rev-parse --show-toplevel` reports the real path while the workspace root may
45
+ * be a symlink to it — `/tmp` is one on macOS — so both sides are resolved
46
+ * before the relative path is taken. A file that no longer exists in the
47
+ * worktree is resolved through its parent directory instead.
48
+ */
49
+ export function repositoryRelative(repository, absolutePath) {
50
+ const resolved = path.resolve(absolutePath);
51
+ let real;
52
+ try {
53
+ real = fs.realpathSync(resolved);
54
+ }
55
+ catch {
56
+ real = path.join(fs.realpathSync(path.dirname(resolved)), path.basename(resolved));
57
+ }
58
+ return path.relative(repository.root, real).split(path.sep).join("/");
59
+ }
60
+ /** Absolute worktree path for a repository-relative path. */
61
+ export function worktreePath(repository, repoRelativePath) {
62
+ return path.resolve(repository.root, repoRelativePath);
63
+ }
64
+ /**
65
+ * Reads one path at a revision.
66
+ *
67
+ * Returns undefined only when git says the path is not in that revision — the
68
+ * "added since" case. Every other failure rethrows, because treating a typo'd
69
+ * revision as "the whole tree is new" is the worst thing this function could do.
70
+ */
71
+ export function readAtRevision(repository, revision, repoRelativePath) {
72
+ try {
73
+ const buffer = execFileSync("git", ["-C", repository.root, "show", `${revision}:${repoRelativePath}`], { stdio: ["ignore", "pipe", "pipe"], maxBuffer: 64 * 1024 * 1024 });
74
+ return buffer.toString("utf-8");
75
+ }
76
+ catch (error) {
77
+ const stderr = String(error.stderr ?? "");
78
+ if (/does not exist in|exists on disk, but not in|path .* does not exist/i.test(stderr)) {
79
+ return undefined;
80
+ }
81
+ throw failure(error, revision);
82
+ }
83
+ }
84
+ /** Markdown paths that differ between `revision` and the worktree. */
85
+ export function changesSince(repository, revision) {
86
+ const diff = git(repository.root, ["diff", "--name-status", "--find-renames", "--find-copies", revision, "--"], revision);
87
+ const untracked = git(repository.root, ["ls-files", "--others", "--exclude-standard"], revision);
88
+ const changes = [];
89
+ for (const line of diff.split(/\r?\n/)) {
90
+ if (!line)
91
+ continue;
92
+ const parts = line.split("\t");
93
+ const code = parts[0][0];
94
+ const similarity = Number(parts[0].slice(1));
95
+ if (code === "R" || code === "C") {
96
+ changes.push({
97
+ status: code,
98
+ oldPath: parts[1],
99
+ newPath: parts[2],
100
+ ...(Number.isInteger(similarity) ? { similarity } : {}),
101
+ });
102
+ }
103
+ else if (code === "D") {
104
+ changes.push({ status: "D", oldPath: parts[1] });
105
+ }
106
+ else if (code === "A") {
107
+ changes.push({ status: "A", newPath: parts[1] });
108
+ }
109
+ else if (code === "M") {
110
+ changes.push({ status: "M", oldPath: parts[1], newPath: parts[1] });
111
+ }
112
+ }
113
+ for (const name of untracked.split(/\r?\n/).filter(Boolean)) {
114
+ changes.push({ status: "A", newPath: name });
115
+ }
116
+ return changes
117
+ .filter((change) => MARKDOWN.test(change.newPath ?? change.oldPath ?? ""))
118
+ .sort((a, b) => {
119
+ const left = a.newPath ?? a.oldPath ?? "";
120
+ const right = b.newPath ?? b.oldPath ?? "";
121
+ return left < right ? -1 : left > right ? 1 : 0;
122
+ });
123
+ }
124
+ //# sourceMappingURL=git.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../src/git.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAqBlD,oFAAoF;AACpF,MAAM,QAAQ,GAAG,mBAAmB,CAAC;AAErC,SAAS,GAAG,CAAC,UAAkB,EAAE,IAAc,EAAE,QAAgB;IAC/D,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,EAAE;YACtD,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;SAClC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACjC,CAAC;AACH,CAAC;AAED,SAAS,OAAO,CAAC,KAAc,EAAE,QAAgB;IAC/C,MAAM,MAAM,GAAI,KAAsC,CAAC,MAAM,CAAC;IAC9D,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,KAAe,CAAC,OAAO,CAAC;IACzF,OAAO,IAAI,KAAK,CAAC,2BAA2B,QAAQ,KAAK,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;AACxF,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,MAAM,aAAa,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1D,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,iBAAiB,CAAC,EAAE;YACjF,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;SAClC,CAAC,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,aAAa,EAAE,CAAC;IAC5D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,MAAM,GAAI,KAAsC,CAAC,MAAM,CAAC;QAC9D,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,KAAe,CAAC,OAAO,CAAC;QACzF,MAAM,IAAI,KAAK,CAAC,gCAAgC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/E,CAAC;AACH,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,aAAa,CAAC,UAAyB,EAAE,QAAgB;IACvE,OAAO,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,UAAU,EAAE,GAAG,QAAQ,WAAW,CAAC,EAAE,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;AAClG,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAAC,UAAyB,EAAE,YAAoB;IAChF,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAC5C,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACH,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;IACrF,CAAC;IACD,OAAO,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACxE,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,YAAY,CAAC,UAAyB,EAAE,gBAAwB;IAC9E,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;AACzD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAC5B,UAAyB,EACzB,QAAgB,EAChB,gBAAwB;IAExB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,YAAY,CACzB,KAAK,EACL,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,QAAQ,IAAI,gBAAgB,EAAE,CAAC,EAClE,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,CACnE,CAAC;QACF,OAAO,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,MAAM,GAAG,MAAM,CAAE,KAAsC,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;QAC5E,IAAI,sEAAsE,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YACxF,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACjC,CAAC;AACH,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,YAAY,CAAC,UAAyB,EAAE,QAAgB;IACtE,MAAM,IAAI,GAAG,GAAG,CACd,UAAU,CAAC,IAAI,EACf,CAAC,MAAM,EAAE,eAAe,EAAE,gBAAgB,EAAE,eAAe,EAAE,QAAQ,EAAE,IAAI,CAAC,EAC5E,QAAQ,CACT,CAAC;IACF,MAAM,SAAS,GAAG,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,oBAAoB,CAAC,EAAE,QAAQ,CAAC,CAAC;IAEjG,MAAM,OAAO,GAAqB,EAAE,CAAC;IACrC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QACvC,IAAI,CAAC,IAAI;YAAE,SAAS;QACpB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC/B,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAmB,CAAC;QAC3C,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7C,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACjC,OAAO,CAAC,IAAI,CAAC;gBACX,MAAM,EAAE,IAAI;gBACZ,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;gBACjB,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;gBACjB,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACxD,CAAC,CAAC;QACL,CAAC;aAAM,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACxB,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACnD,CAAC;aAAM,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACxB,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACnD,CAAC;aAAM,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACxB,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5D,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,OAAO,OAAO;SACX,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;SACzE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACb,MAAM,IAAI,GAAG,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC;QAC1C,MAAM,KAAK,GAAG,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC;QAC3C,OAAO,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,50 @@
1
+ import type { Workspace } from "./workspace.js";
2
+ export interface GraphEdge {
3
+ source: string;
4
+ target: string;
5
+ lines: number[];
6
+ occurrences: number;
7
+ }
8
+ export interface BrokenGraphEdge {
9
+ source: string;
10
+ target: string;
11
+ resolved: string;
12
+ line: number;
13
+ }
14
+ export interface GraphNode {
15
+ file: string;
16
+ inbound: number;
17
+ outbound: number;
18
+ deadEnd: boolean;
19
+ reachable?: boolean;
20
+ }
21
+ export interface WorkspaceGraph {
22
+ nodes: GraphNode[];
23
+ edges: GraphEdge[];
24
+ broken: BrokenGraphEdge[];
25
+ components: string[][];
26
+ cycles: string[][];
27
+ entries: string[];
28
+ reachabilityEvaluated: boolean;
29
+ unreachable: string[];
30
+ }
31
+ /**
32
+ * Narrows a built graph to the documents within `depth` undirected hops of any
33
+ * focus file.
34
+ *
35
+ * Undirected on purpose: "what touches this document" is the question a
36
+ * neighborhood report answers, and a directed walk would hide every backlink.
37
+ *
38
+ * This projects an already-built graph rather than narrowing the file list
39
+ * first. Building from a narrowed list would turn every link to an
40
+ * in-workspace but out-of-radius document into a fabricated `broken` target,
41
+ * and would recompute `components` and `cycles` over a truncated graph —
42
+ * reporting a document as cycle-free when it is not.
43
+ *
44
+ * `inbound`, `outbound`, and `deadEnd` therefore keep their full-graph values:
45
+ * they describe the document, not the picture it is being drawn into. A
46
+ * component or cycle is kept **whole** when any member is in focus, because a
47
+ * truncated cycle group would read as a self-link that does not exist.
48
+ */
49
+ export declare function focusGraph(graph: WorkspaceGraph, focus: string[], depth: number): WorkspaceGraph;
50
+ export declare function buildWorkspaceGraph(workspace: Workspace, files: string[], entries?: string[]): WorkspaceGraph;
package/dist/graph.js ADDED
@@ -0,0 +1,200 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { splitLocalTarget, resolveLocalPath } from "./link-target.js";
4
+ function documentTarget(target) {
5
+ const extension = path.extname(target).toLowerCase();
6
+ return extension === ".md" || extension === ".markdown";
7
+ }
8
+ function components(files, edges) {
9
+ const adjacent = new Map(files.map((file) => [file, new Set()]));
10
+ for (const edge of edges) {
11
+ adjacent.get(edge.source)?.add(edge.target);
12
+ adjacent.get(edge.target)?.add(edge.source);
13
+ }
14
+ const seen = new Set();
15
+ const result = [];
16
+ for (const file of files) {
17
+ if (seen.has(file))
18
+ continue;
19
+ const group = [];
20
+ const pending = [file];
21
+ seen.add(file);
22
+ while (pending.length) {
23
+ const current = pending.pop();
24
+ group.push(current);
25
+ for (const next of adjacent.get(current) ?? [])
26
+ if (!seen.has(next)) {
27
+ seen.add(next);
28
+ pending.push(next);
29
+ }
30
+ }
31
+ result.push(group.sort());
32
+ }
33
+ return result;
34
+ }
35
+ function stronglyConnected(files, edges) {
36
+ const adjacent = new Map(files.map((file) => [file, []]));
37
+ for (const edge of edges)
38
+ adjacent.get(edge.source)?.push(edge.target);
39
+ let index = 0;
40
+ const indices = new Map();
41
+ const low = new Map();
42
+ const stack = [];
43
+ const onStack = new Set();
44
+ const result = [];
45
+ const visit = (file) => {
46
+ indices.set(file, index);
47
+ low.set(file, index++);
48
+ stack.push(file);
49
+ onStack.add(file);
50
+ for (const target of adjacent.get(file) ?? []) {
51
+ if (!indices.has(target)) {
52
+ visit(target);
53
+ low.set(file, Math.min(low.get(file), low.get(target)));
54
+ }
55
+ else if (onStack.has(target))
56
+ low.set(file, Math.min(low.get(file), indices.get(target)));
57
+ }
58
+ if (low.get(file) === indices.get(file)) {
59
+ const group = [];
60
+ let current;
61
+ do {
62
+ current = stack.pop();
63
+ onStack.delete(current);
64
+ group.push(current);
65
+ } while (current !== file);
66
+ const self = group.length === 1 && (adjacent.get(file) ?? []).includes(file);
67
+ if (group.length > 1 || self)
68
+ result.push(group.sort());
69
+ }
70
+ };
71
+ for (const file of files)
72
+ if (!indices.has(file))
73
+ visit(file);
74
+ return result.sort((a, b) => a[0].localeCompare(b[0]));
75
+ }
76
+ /**
77
+ * Narrows a built graph to the documents within `depth` undirected hops of any
78
+ * focus file.
79
+ *
80
+ * Undirected on purpose: "what touches this document" is the question a
81
+ * neighborhood report answers, and a directed walk would hide every backlink.
82
+ *
83
+ * This projects an already-built graph rather than narrowing the file list
84
+ * first. Building from a narrowed list would turn every link to an
85
+ * in-workspace but out-of-radius document into a fabricated `broken` target,
86
+ * and would recompute `components` and `cycles` over a truncated graph —
87
+ * reporting a document as cycle-free when it is not.
88
+ *
89
+ * `inbound`, `outbound`, and `deadEnd` therefore keep their full-graph values:
90
+ * they describe the document, not the picture it is being drawn into. A
91
+ * component or cycle is kept **whole** when any member is in focus, because a
92
+ * truncated cycle group would read as a self-link that does not exist.
93
+ */
94
+ export function focusGraph(graph, focus, depth) {
95
+ const adjacent = new Map(graph.nodes.map((node) => [node.file, new Set()]));
96
+ for (const edge of graph.edges) {
97
+ adjacent.get(edge.source)?.add(edge.target);
98
+ adjacent.get(edge.target)?.add(edge.source);
99
+ }
100
+ const kept = new Set();
101
+ let frontier = [];
102
+ for (const file of focus)
103
+ if (adjacent.has(file) && !kept.has(file)) {
104
+ kept.add(file);
105
+ frontier.push(file);
106
+ }
107
+ for (let hop = 0; hop < depth; hop++) {
108
+ const next = [];
109
+ for (const file of frontier)
110
+ for (const neighbour of adjacent.get(file) ?? [])
111
+ if (!kept.has(neighbour)) {
112
+ kept.add(neighbour);
113
+ next.push(neighbour);
114
+ }
115
+ if (!next.length)
116
+ break;
117
+ frontier = next;
118
+ }
119
+ const inFocus = (file) => kept.has(file);
120
+ return {
121
+ nodes: graph.nodes.filter((node) => inFocus(node.file)),
122
+ edges: graph.edges.filter((edge) => inFocus(edge.source) && inFocus(edge.target)),
123
+ broken: graph.broken.filter((edge) => inFocus(edge.source)),
124
+ components: graph.components.filter((group) => group.some(inFocus)),
125
+ cycles: graph.cycles.filter((group) => group.some(inFocus)),
126
+ entries: graph.entries.filter(inFocus),
127
+ reachabilityEvaluated: graph.reachabilityEvaluated,
128
+ unreachable: graph.unreachable.filter(inFocus),
129
+ };
130
+ }
131
+ export function buildWorkspaceGraph(workspace, files, entries = []) {
132
+ const sorted = [...new Set(files.map((file) => path.resolve(file)))].sort();
133
+ const selected = new Set(sorted);
134
+ const edgeMap = new Map();
135
+ const broken = [];
136
+ for (const source of sorted) {
137
+ for (const ref of workspace.document(source).references) {
138
+ if (ref.isExternal || ref.isAnchorOnly || ref.isImage)
139
+ continue;
140
+ const targetPath = splitLocalTarget(ref.target).path;
141
+ if (!targetPath || !documentTarget(targetPath))
142
+ continue;
143
+ const target = resolveLocalPath(source, targetPath, workspace.root);
144
+ if (selected.has(target)) {
145
+ const key = `${source}\0${target}`;
146
+ const edge = edgeMap.get(key);
147
+ if (edge) {
148
+ edge.lines.push(ref.line);
149
+ edge.occurrences++;
150
+ }
151
+ else
152
+ edgeMap.set(key, { source, target, lines: [ref.line], occurrences: 1 });
153
+ }
154
+ else if (!fs.existsSync(target)) {
155
+ broken.push({ source, target: targetPath, resolved: target, line: ref.line });
156
+ }
157
+ }
158
+ }
159
+ const edges = [...edgeMap.values()].sort((a, b) => a.source.localeCompare(b.source) || a.target.localeCompare(b.target));
160
+ const applicableEntries = [
161
+ ...new Set(entries.map((entry) => path.resolve(entry)).filter((entry) => selected.has(entry))),
162
+ ].sort();
163
+ const reachable = new Set();
164
+ if (applicableEntries.length) {
165
+ const adjacent = new Map(sorted.map((file) => [file, []]));
166
+ for (const edge of edges)
167
+ adjacent.get(edge.source)?.push(edge.target);
168
+ const pending = [...applicableEntries];
169
+ for (const entry of pending)
170
+ reachable.add(entry);
171
+ while (pending.length)
172
+ for (const target of adjacent.get(pending.shift()) ?? [])
173
+ if (!reachable.has(target)) {
174
+ reachable.add(target);
175
+ pending.push(target);
176
+ }
177
+ }
178
+ const nodes = sorted.map((file) => ({
179
+ file,
180
+ inbound: edges
181
+ .filter((edge) => edge.target === file)
182
+ .reduce((sum, edge) => sum + edge.occurrences, 0),
183
+ outbound: edges
184
+ .filter((edge) => edge.source === file)
185
+ .reduce((sum, edge) => sum + edge.occurrences, 0),
186
+ deadEnd: !edges.some((edge) => edge.source === file),
187
+ ...(applicableEntries.length ? { reachable: reachable.has(file) } : {}),
188
+ }));
189
+ return {
190
+ nodes,
191
+ edges,
192
+ broken: broken.sort((a, b) => a.source.localeCompare(b.source) || a.line - b.line),
193
+ components: components(sorted, edges),
194
+ cycles: stronglyConnected(sorted, edges),
195
+ entries: applicableEntries,
196
+ reachabilityEvaluated: applicableEntries.length > 0,
197
+ unreachable: applicableEntries.length ? sorted.filter((file) => !reachable.has(file)) : [],
198
+ };
199
+ }
200
+ //# sourceMappingURL=graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.js","sourceRoot":"","sources":["../src/graph.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export interface SelectionOptions {
2
+ include?: string[];
3
+ exclude?: string[];
4
+ changedSince?: string;
5
+ stdinName?: string;
6
+ requireStdinName?: boolean;
7
+ }
8
+ export declare function changedMarkdownFiles(revision: string, root?: string): string[];
9
+ export declare function resolveMarkdownInputs(inputs: readonly string[], options?: SelectionOptions): string[];