comprehende 0.6.0 → 0.7.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 (692) hide show
  1. package/README.md +2 -2
  2. package/dist/api/agent-md.js +8 -19
  3. package/dist/api/live.js +21 -11
  4. package/dist/api/paths.js +34 -36
  5. package/dist/api/shiki-langs.js +138 -0
  6. package/dist/api/snapshot.js +2 -0
  7. package/dist/api/types.js +5 -1
  8. package/dist/cli/args.js +14 -6
  9. package/dist/cli/commands.js +4 -27
  10. package/dist/cli/main.js +7 -4
  11. package/dist/git/exec.js +9 -6
  12. package/dist/git/repo.js +14 -7
  13. package/dist/git/show.js +2 -8
  14. package/dist/package-root.js +20 -3
  15. package/dist/review/coverage.js +11 -11
  16. package/dist/review/load.js +20 -0
  17. package/dist/review/pins.js +6 -3
  18. package/dist/schema/hunk-meta.js +0 -78
  19. package/dist/schema/identity.js +3 -2
  20. package/dist/schema/image.js +2 -7
  21. package/dist/schema/lockfile.js +2 -1
  22. package/dist/schema/parse.js +28 -429
  23. package/dist/schema/review.js +228 -0
  24. package/dist/schema/skill-sync.js +4 -9
  25. package/dist/schema/source.js +10 -8
  26. package/dist/schema/types.js +14 -1
  27. package/dist/server/http.js +37 -39
  28. package/dist/ui/assets/andromeeda-vGVdxbeo.js +1 -0
  29. package/dist/ui/assets/aurora-x-CDeNXAV0.js +1 -0
  30. package/dist/ui/assets/ayu-dark-DluEY0Gj.js +1 -0
  31. package/dist/ui/assets/ayu-light-C3h-C4tm.js +1 -0
  32. package/dist/ui/assets/ayu-mirage-Bqwy1Gya.js +1 -0
  33. package/dist/ui/assets/catppuccin-frappe-C9Q5zVZY.js +1 -0
  34. package/dist/ui/assets/catppuccin-latte-CtsyrtPq.js +1 -0
  35. package/dist/ui/assets/catppuccin-macchiato-R8nAf1vR.js +1 -0
  36. package/dist/ui/assets/catppuccin-mocha-DjuaAJKi.js +1 -0
  37. package/dist/ui/assets/dark-plus-Cs2F2srj.js +1 -0
  38. package/dist/ui/assets/dracula-BHWKrbxM.js +1 -0
  39. package/dist/ui/assets/dracula-soft-5eyTD99u.js +1 -0
  40. package/dist/ui/assets/everforest-dark-sB-x3p7T.js +1 -0
  41. package/dist/ui/assets/everforest-light-Df2xbC6M.js +1 -0
  42. package/dist/ui/assets/github-dark-C-LZuMrd.js +1 -0
  43. package/dist/ui/assets/github-dark-default-DXG-b-1a.js +1 -0
  44. package/dist/ui/assets/github-dark-dimmed-Bx1FflLF.js +1 -0
  45. package/dist/ui/assets/github-dark-high-contrast-B_tTalzw.js +1 -0
  46. package/dist/ui/assets/github-light-EUqPIrTm.js +1 -0
  47. package/dist/ui/assets/github-light-default-BXViO-2h.js +1 -0
  48. package/dist/ui/assets/github-light-high-contrast-B68TUdTA.js +1 -0
  49. package/dist/ui/assets/gruvbox-dark-hard-C820rvS2.js +1 -0
  50. package/dist/ui/assets/gruvbox-dark-medium-BPjhmG05.js +1 -0
  51. package/dist/ui/assets/gruvbox-dark-soft-MrdJrrXF.js +1 -0
  52. package/dist/ui/assets/gruvbox-light-hard-BC_s9l72.js +1 -0
  53. package/dist/ui/assets/gruvbox-light-medium-BAWPOn9u.js +1 -0
  54. package/dist/ui/assets/gruvbox-light-soft-BSMLrYjP.js +1 -0
  55. package/dist/ui/assets/horizon-CE9ld1lL.js +1 -0
  56. package/dist/ui/assets/horizon-bright-DSNQnXHK.js +1 -0
  57. package/dist/ui/assets/houston-CsvMBhTu.js +1 -0
  58. package/dist/ui/assets/index-B7sLE_by.js +1744 -0
  59. package/dist/ui/assets/index-C3TmVu8x.css +1 -0
  60. package/dist/ui/assets/kanagawa-dragon-Bozd7klA.js +1 -0
  61. package/dist/ui/assets/kanagawa-lotus-BmuOG9ZW.js +1 -0
  62. package/dist/ui/assets/kanagawa-wave-BML5mF2J.js +1 -0
  63. package/dist/ui/assets/laserwave-C_8bwKvT.js +1 -0
  64. package/dist/ui/assets/light-plus-DVQuIRkW.js +1 -0
  65. package/dist/ui/assets/material-theme-Bm3Qr25_.js +1 -0
  66. package/dist/ui/assets/material-theme-darker-2IIEA8gg.js +1 -0
  67. package/dist/ui/assets/material-theme-lighter-uhdI0v04.js +1 -0
  68. package/dist/ui/assets/material-theme-ocean-CHQ94UKr.js +1 -0
  69. package/dist/ui/assets/material-theme-palenight-B5W6OYN7.js +1 -0
  70. package/dist/ui/assets/min-dark-BSWPekZh.js +1 -0
  71. package/dist/ui/assets/min-light-DDpmG2fV.js +1 -0
  72. package/dist/ui/assets/monokai-B_bV9PQ9.js +1 -0
  73. package/dist/ui/assets/night-owl-DhmEMT88.js +1 -0
  74. package/dist/ui/assets/night-owl-light-eJ-hLW7d.js +1 -0
  75. package/dist/ui/assets/nord-Cb4Vim4T.js +1 -0
  76. package/dist/ui/assets/one-dark-pro-CLwyXe_n.js +1 -0
  77. package/dist/ui/assets/one-light-D7Lr4KcI.js +1 -0
  78. package/dist/ui/assets/pierre-dark-CpLgRqie.js +1 -0
  79. package/dist/ui/assets/pierre-dark-protanopia-deuteranopia-B35FxJx-.js +1 -0
  80. package/dist/ui/assets/pierre-dark-soft-kZQmAZld.js +1 -0
  81. package/dist/ui/assets/pierre-dark-tritanopia-CpjhbsIL.js +1 -0
  82. package/dist/ui/assets/pierre-dark-vibrant-CpQYzh95.js +1 -0
  83. package/dist/ui/assets/pierre-light-CoaEpmwp.js +1 -0
  84. package/dist/ui/assets/pierre-light-protanopia-deuteranopia-0fSaH845.js +1 -0
  85. package/dist/ui/assets/pierre-light-soft-lWLdNTOI.js +1 -0
  86. package/dist/ui/assets/pierre-light-tritanopia-CEbqgOJL.js +1 -0
  87. package/dist/ui/assets/pierre-light-vibrant-D80Fkn33.js +1 -0
  88. package/dist/ui/assets/plastic-DQwYfKfQ.js +1 -0
  89. package/dist/ui/assets/poimandres-DRFjx7u4.js +1 -0
  90. package/dist/ui/assets/red-DX1BQOs8.js +1 -0
  91. package/dist/ui/assets/rose-pine-aMsaMD1D.js +1 -0
  92. package/dist/ui/assets/rose-pine-dawn-8PwUyIlP.js +1 -0
  93. package/dist/ui/assets/rose-pine-moon-DO-qXg-I.js +1 -0
  94. package/dist/ui/assets/shiki-lang-abap-CCh0PiHj.js +1 -0
  95. package/dist/ui/assets/shiki-lang-actionscript-3-CDO_W9Hu.js +1 -0
  96. package/dist/ui/assets/shiki-lang-ada-D0v8MB-a.js +1 -0
  97. package/dist/ui/assets/shiki-lang-ahk-DGQ1h58c.js +1 -0
  98. package/dist/ui/assets/shiki-lang-ahk2-DZVNTXIX.js +1 -0
  99. package/dist/ui/assets/shiki-lang-angular-expression-CWExdM8x.js +1 -0
  100. package/dist/ui/assets/shiki-lang-angular-html-CxeRyf73.js +1 -0
  101. package/dist/ui/assets/shiki-lang-angular-inline-style-DlHvU-5D.js +1 -0
  102. package/dist/ui/assets/shiki-lang-angular-inline-template-ZFfps1P0.js +1 -0
  103. package/dist/ui/assets/shiki-lang-angular-let-declaration-BvqQakFa.js +1 -0
  104. package/dist/ui/assets/shiki-lang-angular-template-blocks-DlxKd-FQ.js +1 -0
  105. package/dist/ui/assets/shiki-lang-angular-template-oRYn081P.js +1 -0
  106. package/dist/ui/assets/shiki-lang-angular-ts-CfsDaJsV.js +1 -0
  107. package/dist/ui/assets/shiki-lang-apache-DAGm6YRx.js +1 -0
  108. package/dist/ui/assets/shiki-lang-apex-BntCzcMz.js +1 -0
  109. package/dist/ui/assets/shiki-lang-apl-DXxMY1U9.js +1 -0
  110. package/dist/ui/assets/shiki-lang-applescript-CuQP6ZZz.js +1 -0
  111. package/dist/ui/assets/shiki-lang-ara-BuQtgMwr.js +1 -0
  112. package/dist/ui/assets/shiki-lang-asciidoc-CoUO43hK.js +1 -0
  113. package/dist/ui/assets/shiki-lang-asm-Nrnud8z_.js +1 -0
  114. package/dist/ui/assets/shiki-lang-astro-Cepap9Dk.js +1 -0
  115. package/dist/ui/assets/shiki-lang-awk-GUYPwV2Y.js +1 -0
  116. package/dist/ui/assets/shiki-lang-ballerina-BL4RI1ko.js +1 -0
  117. package/dist/ui/assets/shiki-lang-bat-DaideUf2.js +1 -0
  118. package/dist/ui/assets/shiki-lang-beancount-CK-GFgjb.js +1 -0
  119. package/dist/ui/assets/shiki-lang-berry-CaoJlEUd.js +1 -0
  120. package/dist/ui/assets/shiki-lang-bibtex-CfgnHv7j.js +1 -0
  121. package/dist/ui/assets/shiki-lang-bicep-ClIJAykG.js +1 -0
  122. package/dist/ui/assets/shiki-lang-bird2-B5MZrXeo.js +1 -0
  123. package/dist/ui/assets/shiki-lang-blade-4XbkxIss.js +1 -0
  124. package/dist/ui/assets/shiki-lang-bsl-CcGvbV5A.js +1 -0
  125. package/dist/ui/assets/shiki-lang-c-POGgq8OX.js +1 -0
  126. package/dist/ui/assets/shiki-lang-c3-Bk0Vc2Tn.js +1 -0
  127. package/dist/ui/assets/shiki-lang-cadence-C45UQpy5.js +1 -0
  128. package/dist/ui/assets/shiki-lang-cairo-Bekf3Fcc.js +1 -0
  129. package/dist/ui/assets/shiki-lang-chapel-Ce27PSf2.js +1 -0
  130. package/dist/ui/assets/shiki-lang-clarity-DzhUGUb5.js +1 -0
  131. package/dist/ui/assets/shiki-lang-clojure-BGHEPgLH.js +1 -0
  132. package/dist/ui/assets/shiki-lang-cmake-cj3BvjrT.js +1 -0
  133. package/dist/ui/assets/shiki-lang-cobol-6silywQZ.js +1 -0
  134. package/dist/ui/assets/shiki-lang-codeowners-CjsAJB7V.js +1 -0
  135. package/dist/ui/assets/shiki-lang-codeql-COxApCWA.js +1 -0
  136. package/dist/ui/assets/shiki-lang-coffee-DJFZ3vXp.js +1 -0
  137. package/dist/ui/assets/shiki-lang-common-lisp-6R4RkOm6.js +1 -0
  138. package/dist/ui/assets/shiki-lang-coq-0p5OGVcA.js +1 -0
  139. package/dist/ui/assets/shiki-lang-cpp-BL0zwoTz.js +1 -0
  140. package/dist/ui/assets/shiki-lang-cpp-macro-BhQTFR1w.js +1 -0
  141. package/dist/ui/assets/shiki-lang-crystal-BhrX2mUY.js +1 -0
  142. package/dist/ui/assets/shiki-lang-csharp-BJ0dqAQQ.js +1 -0
  143. package/dist/ui/assets/shiki-lang-css-CgONgvzo.js +1 -0
  144. package/dist/ui/assets/shiki-lang-csv-MORT_y9S.js +1 -0
  145. package/dist/ui/assets/shiki-lang-cue-CFbNGLLB.js +1 -0
  146. package/dist/ui/assets/shiki-lang-cypher-DH-T6IiV.js +1 -0
  147. package/dist/ui/assets/shiki-lang-d-C3P1qfpW.js +1 -0
  148. package/dist/ui/assets/shiki-lang-dart-C1Hg8CB4.js +1 -0
  149. package/dist/ui/assets/shiki-lang-dax-YJWgtppW.js +1 -0
  150. package/dist/ui/assets/shiki-lang-desktop-VlON4cDl.js +1 -0
  151. package/dist/ui/assets/shiki-lang-diff-Bj1DVcNN.js +1 -0
  152. package/dist/ui/assets/shiki-lang-docker-ByWlYF6b.js +1 -0
  153. package/dist/ui/assets/shiki-lang-dotenv-DJpkm7RO.js +1 -0
  154. package/dist/ui/assets/shiki-lang-dream-maker-Z_U8NFug.js +1 -0
  155. package/dist/ui/assets/shiki-lang-edge-CbPibdPM.js +1 -0
  156. package/dist/ui/assets/shiki-lang-elixir-FOIoAYAu.js +1 -0
  157. package/dist/ui/assets/shiki-lang-elm-CqNCzRK1.js +1 -0
  158. package/dist/ui/assets/shiki-lang-emacs-lisp-BocUWC8p.js +1 -0
  159. package/dist/ui/assets/shiki-lang-erb-DK5ZF4vz.js +1 -0
  160. package/dist/ui/assets/shiki-lang-erlang-rYxHmi04.js +1 -0
  161. package/dist/ui/assets/shiki-lang-es-tag-css-DnlLlrRA.js +1 -0
  162. package/dist/ui/assets/shiki-lang-es-tag-glsl-8APUALJ6.js +1 -0
  163. package/dist/ui/assets/shiki-lang-es-tag-html-C4XIcryF.js +1 -0
  164. package/dist/ui/assets/shiki-lang-es-tag-sql-BtI5o8rX.js +1 -0
  165. package/dist/ui/assets/shiki-lang-es-tag-xml-DRxqpnDk.js +1 -0
  166. package/dist/ui/assets/shiki-lang-fennel-CP9FPjwQ.js +1 -0
  167. package/dist/ui/assets/shiki-lang-fish-CqrI1-0S.js +1 -0
  168. package/dist/ui/assets/shiki-lang-fluent-C23gPbyD.js +1 -0
  169. package/dist/ui/assets/shiki-lang-fortran-fixed-form-Dv3GdqPY.js +1 -0
  170. package/dist/ui/assets/shiki-lang-fortran-free-form-BtHYkLVR.js +1 -0
  171. package/dist/ui/assets/shiki-lang-fsharp-D0NR9O4N.js +1 -0
  172. package/dist/ui/assets/shiki-lang-gdresource-Bg2P2NMh.js +1 -0
  173. package/dist/ui/assets/shiki-lang-gdscript-BDP11UZz.js +1 -0
  174. package/dist/ui/assets/shiki-lang-gdshader-8V1ME3af.js +1 -0
  175. package/dist/ui/assets/shiki-lang-genie-xgkduPxo.js +1 -0
  176. package/dist/ui/assets/shiki-lang-gherkin--UFIrFpB.js +1 -0
  177. package/dist/ui/assets/shiki-lang-git-commit-gTixV4s9.js +1 -0
  178. package/dist/ui/assets/shiki-lang-git-rebase-C_DDfC5h.js +1 -0
  179. package/dist/ui/assets/shiki-lang-gleam-BCmzVrYm.js +1 -0
  180. package/dist/ui/assets/shiki-lang-glimmer-js-0Wdoej83.js +1 -0
  181. package/dist/ui/assets/shiki-lang-glimmer-ts-Bul8Ca32.js +1 -0
  182. package/dist/ui/assets/shiki-lang-glsl-fJH1k42K.js +1 -0
  183. package/dist/ui/assets/shiki-lang-gn-ClvndNYF.js +1 -0
  184. package/dist/ui/assets/shiki-lang-gnuplot-B4aa2-v6.js +1 -0
  185. package/dist/ui/assets/shiki-lang-go-WKfzAuWo.js +1 -0
  186. package/dist/ui/assets/shiki-lang-graphql-Bl41bkR3.js +1 -0
  187. package/dist/ui/assets/shiki-lang-groovy-DPTIjDbN.js +1 -0
  188. package/dist/ui/assets/shiki-lang-hack-BwL2Ag2H.js +1 -0
  189. package/dist/ui/assets/shiki-lang-haml-CEYRfOiF.js +1 -0
  190. package/dist/ui/assets/shiki-lang-handlebars-By72h-0H.js +1 -0
  191. package/dist/ui/assets/shiki-lang-haskell-Ba8bHyyZ.js +1 -0
  192. package/dist/ui/assets/shiki-lang-haxe-D9mPDiPb.js +1 -0
  193. package/dist/ui/assets/shiki-lang-hcl-DTpCFc46.js +1 -0
  194. package/dist/ui/assets/shiki-lang-hjson-h-0INsVU.js +1 -0
  195. package/dist/ui/assets/shiki-lang-hlsl-CKI6OfeK.js +1 -0
  196. package/dist/ui/assets/shiki-lang-html-DFf92Hms.js +1 -0
  197. package/dist/ui/assets/shiki-lang-html-derivative-y0kQp5cN.js +1 -0
  198. package/dist/ui/assets/shiki-lang-http-Cap4KCjR.js +1 -0
  199. package/dist/ui/assets/shiki-lang-hurl-fC0934ju.js +1 -0
  200. package/dist/ui/assets/shiki-lang-hxml-BTpXjiag.js +1 -0
  201. package/dist/ui/assets/shiki-lang-hy-RIXtmhH7.js +1 -0
  202. package/dist/ui/assets/shiki-lang-imba-DvVFFMy1.js +1 -0
  203. package/dist/ui/assets/shiki-lang-ini-D-vLyVj8.js +1 -0
  204. package/dist/ui/assets/shiki-lang-java-BeTjxnHl.js +1 -0
  205. package/dist/ui/assets/shiki-lang-javascript-CF6Vsgp3.js +1 -0
  206. package/dist/ui/assets/shiki-lang-jinja-Cz3-RWz8.js +1 -0
  207. package/dist/ui/assets/shiki-lang-jinja-html-CVnbJ0oM.js +1 -0
  208. package/dist/ui/assets/shiki-lang-jison-DxtixVzs.js +1 -0
  209. package/dist/ui/assets/shiki-lang-json-QS2TvV-a.js +1 -0
  210. package/dist/ui/assets/shiki-lang-json5-BsThk---.js +1 -0
  211. package/dist/ui/assets/shiki-lang-jsonc-BBxdRkqS.js +1 -0
  212. package/dist/ui/assets/shiki-lang-jsonl-DHixT2Ch.js +1 -0
  213. package/dist/ui/assets/shiki-lang-jsonnet-DMmrvZE9.js +1 -0
  214. package/dist/ui/assets/shiki-lang-jssm-D-BacgrV.js +1 -0
  215. package/dist/ui/assets/shiki-lang-jsx-DGUCmvqX.js +1 -0
  216. package/dist/ui/assets/shiki-lang-julia-WtC1loLD.js +1 -0
  217. package/dist/ui/assets/shiki-lang-just-EJs2Bpr8.js +1 -0
  218. package/dist/ui/assets/shiki-lang-kdl-XgCoC7ro.js +1 -0
  219. package/dist/ui/assets/shiki-lang-kotlin-Ceu1DClC.js +1 -0
  220. package/dist/ui/assets/shiki-lang-kusto-IydfCbjB.js +1 -0
  221. package/dist/ui/assets/shiki-lang-latex-CERrvjmL.js +1 -0
  222. package/dist/ui/assets/shiki-lang-lean-Bb1MSB5_.js +1 -0
  223. package/dist/ui/assets/shiki-lang-less-C57uWnIP.js +1 -0
  224. package/dist/ui/assets/shiki-lang-liquid-D2YDAKEE.js +1 -0
  225. package/dist/ui/assets/shiki-lang-llvm-CsPaR48C.js +1 -0
  226. package/dist/ui/assets/shiki-lang-log-4Q7z9P2_.js +1 -0
  227. package/dist/ui/assets/shiki-lang-logo-B-rjKTna.js +1 -0
  228. package/dist/ui/assets/shiki-lang-lua-CjwakkuI.js +1 -0
  229. package/dist/ui/assets/shiki-lang-luau-95molwVq.js +1 -0
  230. package/dist/ui/assets/shiki-lang-make-BuLqiXA5.js +1 -0
  231. package/dist/ui/assets/shiki-lang-markdown-Dlt9cTjJ.js +1 -0
  232. package/dist/ui/assets/shiki-lang-markdown-nix-DOLw_s_D.js +1 -0
  233. package/dist/ui/assets/shiki-lang-markdown-vue-DDYW27gg.js +1 -0
  234. package/dist/ui/assets/shiki-lang-marko-AgxF-6vJ.js +1 -0
  235. package/dist/ui/assets/shiki-lang-matlab-CLkaVy-y.js +1 -0
  236. package/dist/ui/assets/shiki-lang-mdc-B-JDJ8TU.js +1 -0
  237. package/dist/ui/assets/shiki-lang-mdx-DdDHzKCT.js +1 -0
  238. package/dist/ui/assets/shiki-lang-mermaid-Cjcnm69Q.js +1 -0
  239. package/dist/ui/assets/shiki-lang-mipsasm-B_6mjd6u.js +1 -0
  240. package/dist/ui/assets/shiki-lang-mojo-D0L5A59C.js +1 -0
  241. package/dist/ui/assets/shiki-lang-moonbit-Eqtgjxo4.js +1 -0
  242. package/dist/ui/assets/shiki-lang-move-DbQlRQBG.js +1 -0
  243. package/dist/ui/assets/shiki-lang-narrat-DiDbLBuo.js +1 -0
  244. package/dist/ui/assets/shiki-lang-nextflow-CpRbRx9E.js +1 -0
  245. package/dist/ui/assets/shiki-lang-nextflow-groovy-Dtoz-QfU.js +1 -0
  246. package/dist/ui/assets/shiki-lang-nginx-BhB_jNUf.js +1 -0
  247. package/dist/ui/assets/shiki-lang-nim-ZHlDXpnX.js +1 -0
  248. package/dist/ui/assets/shiki-lang-nix-BIW1fYd1.js +1 -0
  249. package/dist/ui/assets/shiki-lang-nsis-CVnxZHip.js +1 -0
  250. package/dist/ui/assets/shiki-lang-nushell-BMeIXYse.js +1 -0
  251. package/dist/ui/assets/shiki-lang-objective-c-Cc2on8Vi.js +1 -0
  252. package/dist/ui/assets/shiki-lang-objective-cpp-vFHMpEHE.js +1 -0
  253. package/dist/ui/assets/shiki-lang-ocaml-D3g-9olK.js +1 -0
  254. package/dist/ui/assets/shiki-lang-odin-BM_1nNT7.js +1 -0
  255. package/dist/ui/assets/shiki-lang-openscad-BtEafwls.js +1 -0
  256. package/dist/ui/assets/shiki-lang-org-Bo_61LoZ.js +1 -0
  257. package/dist/ui/assets/shiki-lang-pascal-CtzWzlCE.js +1 -0
  258. package/dist/ui/assets/shiki-lang-perl-PJeVLxjR.js +1 -0
  259. package/dist/ui/assets/shiki-lang-php-CGIwcKYx.js +1 -0
  260. package/dist/ui/assets/shiki-lang-pkl-BwBGf-Je.js +1 -0
  261. package/dist/ui/assets/shiki-lang-plsql-DfWyOq8S.js +1 -0
  262. package/dist/ui/assets/shiki-lang-po-CGG3cf6x.js +1 -0
  263. package/dist/ui/assets/shiki-lang-polar-Ixg1DSjp.js +1 -0
  264. package/dist/ui/assets/shiki-lang-postcss-Bz1BtlXf.js +1 -0
  265. package/dist/ui/assets/shiki-lang-powerquery-ifUmxibQ.js +1 -0
  266. package/dist/ui/assets/shiki-lang-powershell-DBPOjskM.js +1 -0
  267. package/dist/ui/assets/shiki-lang-prisma-Blu4wKH1.js +1 -0
  268. package/dist/ui/assets/shiki-lang-prolog-xjF--GQU.js +1 -0
  269. package/dist/ui/assets/shiki-lang-proto-DSra8eBV.js +1 -0
  270. package/dist/ui/assets/shiki-lang-pug-DSuGdEWk.js +1 -0
  271. package/dist/ui/assets/shiki-lang-puppet-Cq0Seunk.js +1 -0
  272. package/dist/ui/assets/shiki-lang-purescript-ByxegL2r.js +1 -0
  273. package/dist/ui/assets/shiki-lang-python-oauygUGH.js +1 -0
  274. package/dist/ui/assets/shiki-lang-qml-CfCPNi46.js +1 -0
  275. package/dist/ui/assets/shiki-lang-qmldir-B3ajh-8-.js +1 -0
  276. package/dist/ui/assets/shiki-lang-qss-JwufFeTi.js +1 -0
  277. package/dist/ui/assets/shiki-lang-r-DMwcwdHm.js +1 -0
  278. package/dist/ui/assets/shiki-lang-racket-CGdA7NhF.js +1 -0
  279. package/dist/ui/assets/shiki-lang-raku-ClL-wuQO.js +1 -0
  280. package/dist/ui/assets/shiki-lang-razor-Bc882n0u.js +1 -0
  281. package/dist/ui/assets/shiki-lang-rbs-FCklQ7tS.js +1 -0
  282. package/dist/ui/assets/shiki-lang-reg-DaN26ZvO.js +1 -0
  283. package/dist/ui/assets/shiki-lang-regexp-DqcDyem1.js +1 -0
  284. package/dist/ui/assets/shiki-lang-rel-BpLoSKv9.js +1 -0
  285. package/dist/ui/assets/shiki-lang-riscv-B2iV_L1B.js +1 -0
  286. package/dist/ui/assets/shiki-lang-ron-DdvUXXs5.js +1 -0
  287. package/dist/ui/assets/shiki-lang-rosmsg-BxtFx0Y7.js +1 -0
  288. package/dist/ui/assets/shiki-lang-rst-B3dfhudY.js +1 -0
  289. package/dist/ui/assets/shiki-lang-ruby-DHCzTBzU.js +1 -0
  290. package/dist/ui/assets/shiki-lang-rust-C4poL8VP.js +1 -0
  291. package/dist/ui/assets/shiki-lang-sas-C8wUw1Vp.js +1 -0
  292. package/dist/ui/assets/shiki-lang-sass-Dji7kc40.js +1 -0
  293. package/dist/ui/assets/shiki-lang-scala-JNssQMYD.js +1 -0
  294. package/dist/ui/assets/shiki-lang-scheme-CW7V2UtM.js +1 -0
  295. package/dist/ui/assets/shiki-lang-scss-DBg0YeZ4.js +1 -0
  296. package/dist/ui/assets/shiki-lang-sdbl-BYeb1lAp.js +1 -0
  297. package/dist/ui/assets/shiki-lang-shaderlab-GktSJyKV.js +1 -0
  298. package/dist/ui/assets/shiki-lang-shellscript-Bv7mPD64.js +1 -0
  299. package/dist/ui/assets/shiki-lang-shellsession-Bkg9Digr.js +1 -0
  300. package/dist/ui/assets/shiki-lang-smalltalk-CqpXp2gZ.js +1 -0
  301. package/dist/ui/assets/shiki-lang-smithy-GwK488Vp.js +1 -0
  302. package/dist/ui/assets/shiki-lang-solidity-5PE2Pulk.js +1 -0
  303. package/dist/ui/assets/shiki-lang-soy-D61f_9WS.js +1 -0
  304. package/dist/ui/assets/shiki-lang-sparql-BVBXfaxX.js +1 -0
  305. package/dist/ui/assets/shiki-lang-splunk-DZldBRB0.js +1 -0
  306. package/dist/ui/assets/shiki-lang-sql-CR9sphd-.js +1 -0
  307. package/dist/ui/assets/shiki-lang-ssh-config-C_eLd3hX.js +1 -0
  308. package/dist/ui/assets/shiki-lang-stata-cxiQzY5Z.js +1 -0
  309. package/dist/ui/assets/shiki-lang-stylus-yBLwS3B_.js +1 -0
  310. package/dist/ui/assets/shiki-lang-surrealql-CQ1B4fvD.js +1 -0
  311. package/dist/ui/assets/shiki-lang-svelte-BrZ-k7yi.js +1 -0
  312. package/dist/ui/assets/shiki-lang-swift-DOjOtIxe.js +1 -0
  313. package/dist/ui/assets/shiki-lang-system-verilog-DmyUa94s.js +1 -0
  314. package/dist/ui/assets/shiki-lang-systemd-DYSBXyN5.js +1 -0
  315. package/dist/ui/assets/shiki-lang-talonscript-BUBbooxD.js +1 -0
  316. package/dist/ui/assets/shiki-lang-tasl-DAKi3lWp.js +1 -0
  317. package/dist/ui/assets/shiki-lang-tcl-DNeJRgOl.js +1 -0
  318. package/dist/ui/assets/shiki-lang-templ-DKYV6Pof.js +1 -0
  319. package/dist/ui/assets/shiki-lang-terraform-DfYuA89d.js +1 -0
  320. package/dist/ui/assets/shiki-lang-tex-Cb33DrEL.js +1 -0
  321. package/dist/ui/assets/shiki-lang-toml-BaaR59A6.js +1 -0
  322. package/dist/ui/assets/shiki-lang-ts-tags-Dz_laeDQ.js +1 -0
  323. package/dist/ui/assets/shiki-lang-tsv--fpF5auZ.js +1 -0
  324. package/dist/ui/assets/shiki-lang-tsx-p97p3SK9.js +1 -0
  325. package/dist/ui/assets/shiki-lang-turtle-1lh9Wfao.js +1 -0
  326. package/dist/ui/assets/shiki-lang-twig-DR1FyLif.js +1 -0
  327. package/dist/ui/assets/shiki-lang-typescript-DHNOgsP8.js +1 -0
  328. package/dist/ui/assets/shiki-lang-typespec-C91uBnE3.js +1 -0
  329. package/dist/ui/assets/shiki-lang-typst-CI5xfKyi.js +1 -0
  330. package/dist/ui/assets/shiki-lang-v-DMQILRRf.js +1 -0
  331. package/dist/ui/assets/shiki-lang-vala-C4ar8eoZ.js +1 -0
  332. package/dist/ui/assets/shiki-lang-vb-AAhTcthz.js +1 -0
  333. package/dist/ui/assets/shiki-lang-verilog-DK5Iephb.js +1 -0
  334. package/dist/ui/assets/shiki-lang-vhdl-CMQVRPDa.js +1 -0
  335. package/dist/ui/assets/shiki-lang-viml-C1l6E4A3.js +1 -0
  336. package/dist/ui/assets/shiki-lang-vue-DNmpMN2C.js +1 -0
  337. package/dist/ui/assets/shiki-lang-vue-directives-2-MeLAcz.js +1 -0
  338. package/dist/ui/assets/shiki-lang-vue-html-BRIUbDAp.js +1 -0
  339. package/dist/ui/assets/shiki-lang-vue-interpolations-D6IW37Bp.js +1 -0
  340. package/dist/ui/assets/shiki-lang-vue-sfc-style-variable-injection-D1TdO2sq.js +1 -0
  341. package/dist/ui/assets/shiki-lang-vue-vine-r6cwuWZy.js +1 -0
  342. package/dist/ui/assets/shiki-lang-vyper-D0cV2GLW.js +1 -0
  343. package/dist/ui/assets/shiki-lang-wasm-BVFSgxvN.js +1 -0
  344. package/dist/ui/assets/shiki-lang-wenyan-JEKl_-0C.js +1 -0
  345. package/dist/ui/assets/shiki-lang-wgsl-CVTTOPpW.js +1 -0
  346. package/dist/ui/assets/shiki-lang-wikitext-BT1u0lSn.js +1 -0
  347. package/dist/ui/assets/shiki-lang-wit-CXr4d-s1.js +1 -0
  348. package/dist/ui/assets/shiki-lang-wolfram-CbuUgwLG.js +1 -0
  349. package/dist/ui/assets/shiki-lang-xml-CzqLjWlK.js +1 -0
  350. package/dist/ui/assets/shiki-lang-xsl-hYwVdgCv.js +1 -0
  351. package/dist/ui/assets/shiki-lang-yaml-Byr1PsnH.js +1 -0
  352. package/dist/ui/assets/shiki-lang-zenscript-ZElI1LVr.js +1 -0
  353. package/dist/ui/assets/shiki-lang-zig-xkISalQB.js +1 -0
  354. package/dist/ui/assets/slack-dark-DnToyrRv.js +1 -0
  355. package/dist/ui/assets/slack-ochin-B2OO5cIa.js +1 -0
  356. package/dist/ui/assets/snazzy-light-4G7pJPwS.js +1 -0
  357. package/dist/ui/assets/solarized-dark-UdsmMDCL.js +1 -0
  358. package/dist/ui/assets/solarized-light-C1IUL_tW.js +1 -0
  359. package/dist/ui/assets/synthwave-84-nFMaYfgc.js +1 -0
  360. package/dist/ui/assets/tokyo-night-oM2G3aXe.js +1 -0
  361. package/dist/ui/assets/vesper-DdrHHSXu.js +1 -0
  362. package/dist/ui/assets/vitesse-black-fwtXNY1n.js +1 -0
  363. package/dist/ui/assets/vitesse-dark-BZCL-v6S.js +1 -0
  364. package/dist/ui/assets/vitesse-light-VbXTXTou.js +1 -0
  365. package/dist/ui/assets/{wasm-CG6Dc4jp.js → wasm-BnjxR4X6.js} +1 -1
  366. package/dist/ui/assets/wasm-S0UXjx1m.js +1 -0
  367. package/dist/ui/assets/worker-DrorqVhi.js +162 -0
  368. package/dist/ui/index.html +3 -2
  369. package/dist/ui/shiki-langs.json +1 -0
  370. package/package.json +14 -10
  371. package/skills/comprehende/SKILL.md +16 -6
  372. package/skills/comprehende/references/review.schema.json +50 -49
  373. package/dist/ui/assets/abap-BdImnpbu.js +0 -1
  374. package/dist/ui/assets/actionscript-3-B3316cI-.js +0 -1
  375. package/dist/ui/assets/ada-bCR0ucgS.js +0 -1
  376. package/dist/ui/assets/ahk-CsyLZFj1.js +0 -1
  377. package/dist/ui/assets/ahk2-8Zs4aa1G.js +0 -1
  378. package/dist/ui/assets/andromeeda-C4gqWexZ.js +0 -1
  379. package/dist/ui/assets/angular-html-DA-rfuFy.js +0 -1
  380. package/dist/ui/assets/angular-ts-BrjP3tb8.js +0 -1
  381. package/dist/ui/assets/apache-Pmp26Uib.js +0 -1
  382. package/dist/ui/assets/apex-DhZFqWV2.js +0 -1
  383. package/dist/ui/assets/apl-CORt7UWP.js +0 -1
  384. package/dist/ui/assets/applescript-Co6uUVPk.js +0 -1
  385. package/dist/ui/assets/ara-BRHolxvo.js +0 -1
  386. package/dist/ui/assets/asciidoc-CSVQ5wI8.js +0 -1
  387. package/dist/ui/assets/asm-D_Q5rh1f.js +0 -1
  388. package/dist/ui/assets/astro-HNnZUWAn.js +0 -1
  389. package/dist/ui/assets/aurora-x-D-2ljcwZ.js +0 -1
  390. package/dist/ui/assets/awk-DMzUqQB5.js +0 -1
  391. package/dist/ui/assets/ayu-dark-DYE7WIF3.js +0 -1
  392. package/dist/ui/assets/ayu-light-BA47KaF1.js +0 -1
  393. package/dist/ui/assets/ayu-mirage-32ctXXKs.js +0 -1
  394. package/dist/ui/assets/ballerina-BFfxhgS-.js +0 -1
  395. package/dist/ui/assets/bat-CickPsom.js +0 -1
  396. package/dist/ui/assets/beancount-k_qm7-4y.js +0 -1
  397. package/dist/ui/assets/berry-uYugtg8r.js +0 -1
  398. package/dist/ui/assets/bibtex-CHM0blh-.js +0 -1
  399. package/dist/ui/assets/bicep-Bmn6On1c.js +0 -1
  400. package/dist/ui/assets/bird2-Bx8U0n9b.js +0 -1
  401. package/dist/ui/assets/blade-2xfisSek.js +0 -1
  402. package/dist/ui/assets/bsl-DlhNcFeZ.js +0 -1
  403. package/dist/ui/assets/c-BIGW1oBm.js +0 -1
  404. package/dist/ui/assets/c3-Dp5svz6Z.js +0 -1
  405. package/dist/ui/assets/cadence-Bv_4Rxtq.js +0 -1
  406. package/dist/ui/assets/cairo-KRGpt6FW.js +0 -1
  407. package/dist/ui/assets/catppuccin-frappe-CZL1YF0i.js +0 -1
  408. package/dist/ui/assets/catppuccin-latte-DH-8KZSZ.js +0 -1
  409. package/dist/ui/assets/catppuccin-macchiato-B7yYVSCf.js +0 -1
  410. package/dist/ui/assets/catppuccin-mocha-Ct7hS0mc.js +0 -1
  411. package/dist/ui/assets/chapel-DTp_pixX.js +0 -1
  412. package/dist/ui/assets/clarity-Dn5IMItf.js +0 -1
  413. package/dist/ui/assets/clojure-P80f7IUj.js +0 -1
  414. package/dist/ui/assets/cmake-D1j8_8rp.js +0 -1
  415. package/dist/ui/assets/cobol-nBiQ_Alo.js +0 -1
  416. package/dist/ui/assets/codeowners-Bp6g37R7.js +0 -1
  417. package/dist/ui/assets/codeql-DsOJ9woJ.js +0 -1
  418. package/dist/ui/assets/coffee-Ch7k5sss.js +0 -1
  419. package/dist/ui/assets/common-lisp-Cg-RD9OK.js +0 -1
  420. package/dist/ui/assets/coq-C7JzOVbR.js +0 -1
  421. package/dist/ui/assets/cpp-BMRokrvK.js +0 -1
  422. package/dist/ui/assets/crystal-DGywbUpC.js +0 -1
  423. package/dist/ui/assets/csharp-DSvCPggb.js +0 -1
  424. package/dist/ui/assets/css-CLj8gQPS.js +0 -1
  425. package/dist/ui/assets/csv-fuZLfV_i.js +0 -1
  426. package/dist/ui/assets/cue-D82EKSYY.js +0 -1
  427. package/dist/ui/assets/cypher-COkxafJQ.js +0 -1
  428. package/dist/ui/assets/d-85-TOEBH.js +0 -1
  429. package/dist/ui/assets/dark-plus-C3mMm8J8.js +0 -1
  430. package/dist/ui/assets/dart-bE4Kk8sk.js +0 -1
  431. package/dist/ui/assets/dax-CEL-wOlO.js +0 -1
  432. package/dist/ui/assets/desktop-BmXAJ9_W.js +0 -1
  433. package/dist/ui/assets/diff-D97Zzqfu.js +0 -1
  434. package/dist/ui/assets/docker-BcOcwvcX.js +0 -1
  435. package/dist/ui/assets/dotenv-Da5cRb03.js +0 -1
  436. package/dist/ui/assets/dracula-BzJJZx-M.js +0 -1
  437. package/dist/ui/assets/dracula-soft-BXkSAIEj.js +0 -1
  438. package/dist/ui/assets/dream-maker-BtqSS_iP.js +0 -1
  439. package/dist/ui/assets/edge-FbVlp4U3.js +0 -1
  440. package/dist/ui/assets/elixir-CkH2-t6x.js +0 -1
  441. package/dist/ui/assets/elm-DbKCFpqz.js +0 -1
  442. package/dist/ui/assets/emacs-lisp-C_m_b--Z.js +0 -1
  443. package/dist/ui/assets/erb-DXfck5VN.js +0 -1
  444. package/dist/ui/assets/erlang-DsQrWhSR.js +0 -1
  445. package/dist/ui/assets/everforest-dark-BgDCqdQA.js +0 -1
  446. package/dist/ui/assets/everforest-light-C8M2exoo.js +0 -1
  447. package/dist/ui/assets/fennel-BYunw83y.js +0 -1
  448. package/dist/ui/assets/fish-BvzEVeQv.js +0 -1
  449. package/dist/ui/assets/fluent-C4IJs8-o.js +0 -1
  450. package/dist/ui/assets/fortran-fixed-form-CkoXwp7k.js +0 -1
  451. package/dist/ui/assets/fortran-free-form-BxgE0vQu.js +0 -1
  452. package/dist/ui/assets/fsharp-CXgrBDvD.js +0 -1
  453. package/dist/ui/assets/gdresource-TyuKm33G.js +0 -1
  454. package/dist/ui/assets/gdscript-DqcFQ5yU.js +0 -1
  455. package/dist/ui/assets/gdshader-DkwncUOv.js +0 -1
  456. package/dist/ui/assets/genie-D0YGMca9.js +0 -1
  457. package/dist/ui/assets/gherkin-DyxjwDmM.js +0 -1
  458. package/dist/ui/assets/git-commit-F4YmCXRG.js +0 -1
  459. package/dist/ui/assets/git-rebase-r7XF79zn.js +0 -1
  460. package/dist/ui/assets/github-dark-DHJKELXO.js +0 -1
  461. package/dist/ui/assets/github-dark-default-Cuk6v7N8.js +0 -1
  462. package/dist/ui/assets/github-dark-dimmed-DH5Ifo-i.js +0 -1
  463. package/dist/ui/assets/github-dark-high-contrast-E3gJ1_iC.js +0 -1
  464. package/dist/ui/assets/github-light-DAi9KRSo.js +0 -1
  465. package/dist/ui/assets/github-light-default-D7oLnXFd.js +0 -1
  466. package/dist/ui/assets/github-light-high-contrast-BfjtVDDH.js +0 -1
  467. package/dist/ui/assets/gleam-BspZqrRM.js +0 -1
  468. package/dist/ui/assets/glimmer-js-ByusRIyA.js +0 -1
  469. package/dist/ui/assets/glimmer-ts-BfAWNZQY.js +0 -1
  470. package/dist/ui/assets/glsl-DplSGwfg.js +0 -1
  471. package/dist/ui/assets/gn-n2N0HUVH.js +0 -1
  472. package/dist/ui/assets/gnuplot-DdkO51Og.js +0 -1
  473. package/dist/ui/assets/go-C27-OAKa.js +0 -1
  474. package/dist/ui/assets/graphql-ChdNCCLP.js +0 -1
  475. package/dist/ui/assets/groovy-gcz8RCvz.js +0 -1
  476. package/dist/ui/assets/gruvbox-dark-hard-CFHQjOhq.js +0 -1
  477. package/dist/ui/assets/gruvbox-dark-medium-GsRaNv29.js +0 -1
  478. package/dist/ui/assets/gruvbox-dark-soft-CVdnzihN.js +0 -1
  479. package/dist/ui/assets/gruvbox-light-hard-CH1njM8p.js +0 -1
  480. package/dist/ui/assets/gruvbox-light-medium-DRw_LuNl.js +0 -1
  481. package/dist/ui/assets/gruvbox-light-soft-hJgmCMqR.js +0 -1
  482. package/dist/ui/assets/hack-BWmVpMyf.js +0 -1
  483. package/dist/ui/assets/haml-D5jkg6IW.js +0 -1
  484. package/dist/ui/assets/handlebars-BpdQsYii.js +0 -1
  485. package/dist/ui/assets/haskell-Df6bDoY_.js +0 -1
  486. package/dist/ui/assets/haxe-CfZj7gIn.js +0 -1
  487. package/dist/ui/assets/hcl-BWvSN4gD.js +0 -1
  488. package/dist/ui/assets/hjson-D5-asLiD.js +0 -1
  489. package/dist/ui/assets/hlsl-D3lLCCz7.js +0 -1
  490. package/dist/ui/assets/horizon-BUw7H-hv.js +0 -1
  491. package/dist/ui/assets/horizon-bright-CUuTKBJd.js +0 -1
  492. package/dist/ui/assets/houston-DnULxvSX.js +0 -1
  493. package/dist/ui/assets/html-derivative-DlHx6ybY.js +0 -1
  494. package/dist/ui/assets/html-pp8916En.js +0 -1
  495. package/dist/ui/assets/http-jrhK8wxY.js +0 -1
  496. package/dist/ui/assets/hurl-irOxFIW8.js +0 -1
  497. package/dist/ui/assets/hxml-2-FPmUDs.js +0 -1
  498. package/dist/ui/assets/hy-DFXneXwc.js +0 -1
  499. package/dist/ui/assets/imba-DGztddWO.js +0 -1
  500. package/dist/ui/assets/index-C1EoRByu.css +0 -1
  501. package/dist/ui/assets/index-su33x8uU.js +0 -1713
  502. package/dist/ui/assets/ini-BEwlwnbL.js +0 -1
  503. package/dist/ui/assets/java-CylS5w8V.js +0 -1
  504. package/dist/ui/assets/javascript-wDzz0qaB.js +0 -1
  505. package/dist/ui/assets/jinja-f2NsQr07.js +0 -1
  506. package/dist/ui/assets/jison-wvAkD_A8.js +0 -1
  507. package/dist/ui/assets/json-Cp-IABpG.js +0 -1
  508. package/dist/ui/assets/json5-C9tS-k6U.js +0 -1
  509. package/dist/ui/assets/jsonc-Des-eS-w.js +0 -1
  510. package/dist/ui/assets/jsonl-DcaNXYhu.js +0 -1
  511. package/dist/ui/assets/jsonnet-DFQXde-d.js +0 -1
  512. package/dist/ui/assets/jssm-C2t-YnRu.js +0 -1
  513. package/dist/ui/assets/jsx-g9-lgVsj.js +0 -1
  514. package/dist/ui/assets/julia-5Bft2YPA.js +0 -1
  515. package/dist/ui/assets/just-Cwhn7H3k.js +0 -1
  516. package/dist/ui/assets/kanagawa-dragon-BuwD2xS4.js +0 -1
  517. package/dist/ui/assets/kanagawa-lotus-C3DzagqV.js +0 -1
  518. package/dist/ui/assets/kanagawa-wave-DFGoQZhC.js +0 -1
  519. package/dist/ui/assets/kdl-DV7GczEv.js +0 -1
  520. package/dist/ui/assets/kotlin-BdnUsdx6.js +0 -1
  521. package/dist/ui/assets/kusto-wEQ09or8.js +0 -1
  522. package/dist/ui/assets/laserwave-DUszq2jm.js +0 -1
  523. package/dist/ui/assets/latex-D5pSuvFb.js +0 -1
  524. package/dist/ui/assets/lean-BZvkOJ9d.js +0 -1
  525. package/dist/ui/assets/less-B1dDrJ26.js +0 -1
  526. package/dist/ui/assets/light-plus-B7mTdjB0.js +0 -1
  527. package/dist/ui/assets/liquid-C0sCDyMI.js +0 -1
  528. package/dist/ui/assets/llvm-BZoOZj88.js +0 -1
  529. package/dist/ui/assets/log-2UxHyX5q.js +0 -1
  530. package/dist/ui/assets/logo-BtOb2qkB.js +0 -1
  531. package/dist/ui/assets/lua-BaeVxFsk.js +0 -1
  532. package/dist/ui/assets/luau-BnpPk5vE.js +0 -1
  533. package/dist/ui/assets/make-CHLpvVh8.js +0 -1
  534. package/dist/ui/assets/markdown-Cvjx9yec.js +0 -1
  535. package/dist/ui/assets/marko-DjSrsDqO.js +0 -1
  536. package/dist/ui/assets/material-theme-D5KoaKCx.js +0 -1
  537. package/dist/ui/assets/material-theme-darker-BfHTSMKl.js +0 -1
  538. package/dist/ui/assets/material-theme-lighter-B0m2ddpp.js +0 -1
  539. package/dist/ui/assets/material-theme-ocean-CyktbL80.js +0 -1
  540. package/dist/ui/assets/material-theme-palenight-Csfq5Kiy.js +0 -1
  541. package/dist/ui/assets/matlab-D7o27uSR.js +0 -1
  542. package/dist/ui/assets/mdc-D1_yUvq7.js +0 -1
  543. package/dist/ui/assets/mdx-Cmh6b_Ma.js +0 -1
  544. package/dist/ui/assets/mermaid-CQcHuHx7.js +0 -1
  545. package/dist/ui/assets/min-dark-CafNBF8u.js +0 -1
  546. package/dist/ui/assets/min-light-CTRr51gU.js +0 -1
  547. package/dist/ui/assets/mipsasm-CKIfxQSi.js +0 -1
  548. package/dist/ui/assets/mojo-DJz3ZmWd.js +0 -1
  549. package/dist/ui/assets/monokai-BRVnQi9A.js +0 -1
  550. package/dist/ui/assets/moonbit-CHtswR0a.js +0 -1
  551. package/dist/ui/assets/move-el3G9tDJ.js +0 -1
  552. package/dist/ui/assets/narrat-DRg8JJMk.js +0 -1
  553. package/dist/ui/assets/nextflow-C-mBbutL.js +0 -1
  554. package/dist/ui/assets/nextflow-groovy-vE_lwT2v.js +0 -1
  555. package/dist/ui/assets/nginx-BpAMiNFr.js +0 -1
  556. package/dist/ui/assets/night-owl-C39BiMTA.js +0 -1
  557. package/dist/ui/assets/night-owl-light-CMTm3GFP.js +0 -1
  558. package/dist/ui/assets/nim-BIad80T-.js +0 -1
  559. package/dist/ui/assets/nix-CwoSXNpI.js +0 -1
  560. package/dist/ui/assets/nord-Ddv68eIx.js +0 -1
  561. package/dist/ui/assets/nsis-BlV79W_Q.js +0 -1
  562. package/dist/ui/assets/nushell-D3jzshHO.js +0 -1
  563. package/dist/ui/assets/objective-c-DXmwc3jG.js +0 -1
  564. package/dist/ui/assets/objective-cpp-CLxacb5B.js +0 -1
  565. package/dist/ui/assets/ocaml-C0hk2d4L.js +0 -1
  566. package/dist/ui/assets/odin-BBf5iR-q.js +0 -1
  567. package/dist/ui/assets/one-dark-pro-DVMEJ2y_.js +0 -1
  568. package/dist/ui/assets/one-light-C3Wv6jpd.js +0 -1
  569. package/dist/ui/assets/openscad-C4EeE6gA.js +0 -1
  570. package/dist/ui/assets/org-DM6o9KBp.js +0 -1
  571. package/dist/ui/assets/pascal-D93ZcfNL.js +0 -1
  572. package/dist/ui/assets/perl-B9cMNwum.js +0 -1
  573. package/dist/ui/assets/php-Csjmro_R.js +0 -1
  574. package/dist/ui/assets/pierre-dark-CyvmCCZW.js +0 -1
  575. package/dist/ui/assets/pierre-dark-protanopia-deuteranopia-Rgc0TwpF.js +0 -1
  576. package/dist/ui/assets/pierre-dark-soft-BHGpRqa4.js +0 -1
  577. package/dist/ui/assets/pierre-dark-tritanopia-Beq2gCRQ.js +0 -1
  578. package/dist/ui/assets/pierre-dark-vibrant-BWBVywrn.js +0 -1
  579. package/dist/ui/assets/pierre-light-480U9XYS.js +0 -1
  580. package/dist/ui/assets/pierre-light-protanopia-deuteranopia-CaVOBURG.js +0 -1
  581. package/dist/ui/assets/pierre-light-soft-CVdyfjmI.js +0 -1
  582. package/dist/ui/assets/pierre-light-tritanopia-B4_gpKOM.js +0 -1
  583. package/dist/ui/assets/pierre-light-vibrant-DdTDNdfJ.js +0 -1
  584. package/dist/ui/assets/pkl-u5AG7uiY.js +0 -1
  585. package/dist/ui/assets/plastic-3e1v2bzS.js +0 -1
  586. package/dist/ui/assets/plsql-ChMvpjG-.js +0 -1
  587. package/dist/ui/assets/po-BTJTHyun.js +0 -1
  588. package/dist/ui/assets/poimandres-CS3Unz2-.js +0 -1
  589. package/dist/ui/assets/polar-C0HS_06l.js +0 -1
  590. package/dist/ui/assets/postcss-CXtECtnM.js +0 -1
  591. package/dist/ui/assets/powerquery-CEu0bR-o.js +0 -1
  592. package/dist/ui/assets/powershell-BmBUJMz7.js +0 -1
  593. package/dist/ui/assets/prisma-Vru482bI.js +0 -1
  594. package/dist/ui/assets/prolog-CbFg5uaA.js +0 -1
  595. package/dist/ui/assets/proto-C7zT0LnQ.js +0 -1
  596. package/dist/ui/assets/pug-DKIMFp6K.js +0 -1
  597. package/dist/ui/assets/puppet-BMWR74SV.js +0 -1
  598. package/dist/ui/assets/purescript-CklMAg4u.js +0 -1
  599. package/dist/ui/assets/python-B6aJPvgy.js +0 -1
  600. package/dist/ui/assets/qml-3beO22l8.js +0 -1
  601. package/dist/ui/assets/qmldir-C8lEn-DE.js +0 -1
  602. package/dist/ui/assets/qss-IeuSbFQv.js +0 -1
  603. package/dist/ui/assets/r-Cf5RLm7j.js +0 -1
  604. package/dist/ui/assets/racket-BqYA7rlc.js +0 -1
  605. package/dist/ui/assets/raku-DXvB9xmW.js +0 -1
  606. package/dist/ui/assets/razor-BjBPvh-w.js +0 -1
  607. package/dist/ui/assets/rbs-CpoqiR4B.js +0 -1
  608. package/dist/ui/assets/red-hvxz__6c.js +0 -1
  609. package/dist/ui/assets/reg-C-SQnVFl.js +0 -1
  610. package/dist/ui/assets/regexp-CDVJQ6XC.js +0 -1
  611. package/dist/ui/assets/rel-C3B-1QV4.js +0 -1
  612. package/dist/ui/assets/riscv-BM1_JUlF.js +0 -1
  613. package/dist/ui/assets/ron-D8l8udqQ.js +0 -1
  614. package/dist/ui/assets/rose-pine-5qJOZa0Y.js +0 -1
  615. package/dist/ui/assets/rose-pine-dawn-zx0QlTCp.js +0 -1
  616. package/dist/ui/assets/rose-pine-moon-C9pEdX9L.js +0 -1
  617. package/dist/ui/assets/rosmsg-BJDFO7_C.js +0 -1
  618. package/dist/ui/assets/rst-bs7f0vWN.js +0 -1
  619. package/dist/ui/assets/ruby-C0TQ7zu5.js +0 -1
  620. package/dist/ui/assets/rust-B1yitclQ.js +0 -1
  621. package/dist/ui/assets/sas-DEy46yEz.js +0 -1
  622. package/dist/ui/assets/sass-Cj5Yp3dK.js +0 -1
  623. package/dist/ui/assets/scala-CqE71os6.js +0 -1
  624. package/dist/ui/assets/scheme-C98Dy4si.js +0 -1
  625. package/dist/ui/assets/scss-D5BDwBP9.js +0 -1
  626. package/dist/ui/assets/sdbl-DVxCFoDh.js +0 -1
  627. package/dist/ui/assets/shaderlab-Dg9Lc6iA.js +0 -1
  628. package/dist/ui/assets/shellscript-Yzrsuije.js +0 -1
  629. package/dist/ui/assets/shellsession-BADoaaVG.js +0 -1
  630. package/dist/ui/assets/slack-dark-BthQWCQV.js +0 -1
  631. package/dist/ui/assets/slack-ochin-DqwNpetd.js +0 -1
  632. package/dist/ui/assets/smalltalk-BOQMe2GC.js +0 -1
  633. package/dist/ui/assets/smithy-cds9vsN8.js +0 -1
  634. package/dist/ui/assets/snazzy-light-Bw305WKR.js +0 -1
  635. package/dist/ui/assets/solarized-dark-CpvCGNkr.js +0 -1
  636. package/dist/ui/assets/solarized-light-Dlz6yCKv.js +0 -1
  637. package/dist/ui/assets/solidity-DijEV5ha.js +0 -1
  638. package/dist/ui/assets/soy-8wufbnw4.js +0 -1
  639. package/dist/ui/assets/sparql-rVzFXLq3.js +0 -1
  640. package/dist/ui/assets/splunk-BtCnVYZw.js +0 -1
  641. package/dist/ui/assets/sql-CRqJ_cUM.js +0 -1
  642. package/dist/ui/assets/ssh-config-_ykCGR6B.js +0 -1
  643. package/dist/ui/assets/stata-DI20mbqo.js +0 -1
  644. package/dist/ui/assets/stylus-BEDo0Tqx.js +0 -1
  645. package/dist/ui/assets/surrealql-Cjom0U5J.js +0 -1
  646. package/dist/ui/assets/svelte-Cy7k_4gC.js +0 -1
  647. package/dist/ui/assets/swift-C2oV4EkX.js +0 -1
  648. package/dist/ui/assets/synthwave-84-CbfX1IO0.js +0 -1
  649. package/dist/ui/assets/system-verilog-0hqHdDBg.js +0 -1
  650. package/dist/ui/assets/systemd-4A_iFExJ.js +0 -1
  651. package/dist/ui/assets/talonscript-CkByrt1z.js +0 -1
  652. package/dist/ui/assets/tasl-QIJgUcNo.js +0 -1
  653. package/dist/ui/assets/tcl-dwOrl1Do.js +0 -1
  654. package/dist/ui/assets/templ-DhtptRzy.js +0 -1
  655. package/dist/ui/assets/terraform-BETggiCN.js +0 -1
  656. package/dist/ui/assets/tex-D96PA37w.js +0 -1
  657. package/dist/ui/assets/tokyo-night-hegEt444.js +0 -1
  658. package/dist/ui/assets/toml-vGWfd6FD.js +0 -1
  659. package/dist/ui/assets/ts-tags-D351s5mN.js +0 -1
  660. package/dist/ui/assets/tsv-B_m7g4N7.js +0 -1
  661. package/dist/ui/assets/tsx-COt5Ahok.js +0 -1
  662. package/dist/ui/assets/turtle-BsS91CYL.js +0 -1
  663. package/dist/ui/assets/twig-27uCiNez.js +0 -1
  664. package/dist/ui/assets/typescript-BPQ3VLAy.js +0 -1
  665. package/dist/ui/assets/typespec-CAFt9gP4.js +0 -1
  666. package/dist/ui/assets/typst-BUadGCkm.js +0 -1
  667. package/dist/ui/assets/v-BGw2Nkan.js +0 -1
  668. package/dist/ui/assets/vala-CsfeWuGM.js +0 -1
  669. package/dist/ui/assets/vb-Cu-pLBUe.js +0 -1
  670. package/dist/ui/assets/verilog-nZwndyjY.js +0 -1
  671. package/dist/ui/assets/vesper-DRje8inN.js +0 -1
  672. package/dist/ui/assets/vhdl-CeAyd5Ju.js +0 -1
  673. package/dist/ui/assets/viml-CJc9bBzg.js +0 -1
  674. package/dist/ui/assets/vitesse-black-Bkuqu6BP.js +0 -1
  675. package/dist/ui/assets/vitesse-dark-D0r3Knsf.js +0 -1
  676. package/dist/ui/assets/vitesse-light-CVO1_9PV.js +0 -1
  677. package/dist/ui/assets/vue-BqiEGhQt.js +0 -1
  678. package/dist/ui/assets/vue-html-AaS7Mt5G.js +0 -1
  679. package/dist/ui/assets/vue-vine-BoDAl6tE.js +0 -1
  680. package/dist/ui/assets/vyper-CDx5xZoG.js +0 -1
  681. package/dist/ui/assets/wasm-MzD3tlZU.js +0 -1
  682. package/dist/ui/assets/wenyan-BV7otONQ.js +0 -1
  683. package/dist/ui/assets/wgsl-Dx-B1_4e.js +0 -1
  684. package/dist/ui/assets/wikitext-BhOHFoWU.js +0 -1
  685. package/dist/ui/assets/wit-5i3qLPDT.js +0 -1
  686. package/dist/ui/assets/wolfram-lXgVvXCa.js +0 -1
  687. package/dist/ui/assets/worker-DsKBD11i.js +0 -156
  688. package/dist/ui/assets/xml-sdJ4AIDG.js +0 -1
  689. package/dist/ui/assets/xsl-CtQFsRM5.js +0 -1
  690. package/dist/ui/assets/yaml-Buea-lGh.js +0 -1
  691. package/dist/ui/assets/zenscript-DVFEvuxE.js +0 -1
  692. package/dist/ui/assets/zig-VOosw3JB.js +0 -1
package/README.md CHANGED
@@ -42,13 +42,13 @@ This tool is for preventing this cognitive surrender while trying to maintain mo
42
42
 
43
43
  `comprehende serve` and `comprehende export` share one UI and one git payload. Serve resolves refs to commit SHAs when it starts, then computes those payloads from the objects on each request. Export writes the same JSON (and image bytes) next to the UI so any static file server can host the review.
44
44
 
45
- `pnpm dev` and `pnpm exec` run with this package as cwd, so they only make sense when _this_ repo is the one under review. To review a different project from a checkout, `cd` into it and run `npx comprehende@0.6.0` (or `node /path/to/comprehende/dist/cli/main.js` after `pnpm build`).
45
+ `pnpm dev` and `pnpm exec` run with this package as cwd, so they only make sense when _this_ repo is the one under review. To review a different project from a checkout, `cd` into it and run `npx comprehende@0.7.0` (or `node /path/to/comprehende/dist/cli/main.js` after `pnpm build`).
46
46
 
47
47
  ## Release
48
48
 
49
49
  Edit the skill in `skills-next/comprehende/`. `npx skills add` reads `skills/comprehende/` only.
50
50
 
51
- Bump `version` in `package.json` when the CLI or UI changes, then run `pnpm sync:skill` so the next skill pin matches. Pre-commit and `pnpm test` fail if the staged package version and next skill pin differ. Do not bump for skill-only edits.
51
+ Bump `version` in `package.json` when the CLI or UI changes, then run `pnpm sync:skill` so the next skill pin matches. Pre-commit and `pnpm test` fail if the staged package version and next skill pin differ. Do not bump for skill-only edits. Use the number the user names. If they name none, use the next semver: patch for fixes, minor for new use, major for breaking.
52
52
 
53
53
  When that next skill should ship with `npx skills add`, run `pnpm release:skill`. That copies `skills-next/comprehende/` onto `skills/comprehende/`. Run it in the same change that publishes a new CLI. Then `npx skills add` installs instructions that match the package they pin.
54
54
 
@@ -1,17 +1,14 @@
1
+ import { formatHunkRef } from "../schema/identity.js";
2
+ import { padIndex, sizeLabel } from "../schema/types.js";
3
+ import { agentMdGroupHref } from "./paths.js";
1
4
  export const AGENT_MD_MEDIA_TYPE = "text/markdown; charset=utf-8";
2
- export function formatHunkRef(ref) {
3
- const rename = ref.oldPath !== undefined ? `${ref.oldPath} -> ` : "";
4
- return `${rename}${ref.path} @@ -${ref.oldStart},${ref.oldLines} +${ref.newStart},${ref.newLines} @@`;
5
- }
5
+ export { formatHunkRef };
6
6
  export function isImageSlot(ref) {
7
7
  return ref.oldStart === 0 && ref.oldLines === 0 && ref.newStart === 0 && ref.newLines === 0;
8
8
  }
9
9
  export function agentClipboardPrompt(url) {
10
10
  return `Answer the following questions by using ${url}`;
11
11
  }
12
- function groupAgentMdHref(id) {
13
- return `groups/${encodeURIComponent(id)}.md`;
14
- }
15
12
  export function agentMd(review, resource) {
16
13
  if (resource.target === "overview") {
17
14
  return overviewAgentMd(review);
@@ -103,7 +100,7 @@ function coverageBlock(review) {
103
100
  }
104
101
  function reviewConcernsBlock(review) {
105
102
  const sections = review.groups.map((group, i) => {
106
- const href = groupAgentMdHref(group.id);
103
+ const href = agentMdGroupHref(group.id);
107
104
  return joinBlocks([
108
105
  `### ${padIndex(i + 1)} ${group.title} (\`${group.id}\`)`,
109
106
  group.summary,
@@ -159,7 +156,7 @@ function overviewSteps(review) {
159
156
  "",
160
157
  "3. Answer from live git.",
161
158
  " Follow those files. Use the why and the what as interpretation. Live git wins when they disagree.",
162
- ` ${showCodeRule()}`,
159
+ ` ${SHOW_CODE_RULE}`,
163
160
  " Done when the answer quotes the live code.",
164
161
  ].join("\n");
165
162
  }
@@ -179,7 +176,7 @@ function groupSteps(review) {
179
176
  "",
180
177
  "3. Answer from live git.",
181
178
  " Read those hunks. Use the why and the what as interpretation. Live git wins when they disagree.",
182
- ` ${showCodeRule()}`,
179
+ ` ${SHOW_CODE_RULE}`,
183
180
  " Done when the answer quotes the live code.",
184
181
  ].join("\n");
185
182
  }
@@ -191,15 +188,7 @@ function resolveShaSteps(review) {
191
188
  " Done when both objects exist.",
192
189
  ];
193
190
  }
194
- function showCodeRule() {
195
- return "When you show code, quote the live git lines.";
196
- }
197
- function padIndex(index) {
198
- return String(index).padStart(2, "0");
199
- }
200
- function sizeLabel(size) {
201
- return size.replace("-", " ");
202
- }
191
+ const SHOW_CODE_RULE = "When you show code, quote the live git lines.";
203
192
  function joinBlocks(parts) {
204
193
  return parts.filter((part) => part !== null && part !== undefined && part.length > 0).join("\n\n");
205
194
  }
package/dist/api/live.js CHANGED
@@ -1,4 +1,4 @@
1
- import { loadDocument } from "../cli/commands.js";
1
+ import { loadDocument } from "../review/load.js";
2
2
  import { blameFile } from "../git/blame.js";
3
3
  import { readImageBlob } from "../git/blob.js";
4
4
  import { fileLanguage, filePatchFromGit, readPathDiff, toHunkRef } from "../git/diff.js";
@@ -12,12 +12,13 @@ import { isLockfilePath } from "../schema/lockfile.js";
12
12
  import { sourceCitationErrors } from "../schema/source.js";
13
13
  import { AGENT_MD_MEDIA_TYPE, agentMd } from "./agent-md.js";
14
14
  import { ApiError } from "./error.js";
15
- export async function pinReviewSource(cwd, dataPath) {
16
- const document = await loadDocument(dataPath);
15
+ import { REVIEW_BUCKETS } from "./types.js";
16
+ export async function pinReviewSource(cwd, data) {
17
+ const document = typeof data === "string" ? await loadDocument(data) : data;
17
18
  return pinRange(cwd, document.source.baseRef, document.source.headRef);
18
19
  }
19
- export async function openReview(cwd, dataPath, pin) {
20
- const document = await loadDocument(dataPath);
20
+ export async function openReview(cwd, data, pin) {
21
+ const document = typeof data === "string" ? await loadDocument(data) : data;
21
22
  const range = pin ?? (await pinRange(cwd, document.source.baseRef, document.source.headRef));
22
23
  const { files, coverage } = await coverReview(cwd, document, range);
23
24
  const pins = await staleCommentPins(cwd, document, range);
@@ -110,10 +111,10 @@ export function hunksPayload(ctx, groupId) {
110
111
  if (groupId === "") {
111
112
  throw new ApiError(400, "missing group");
112
113
  }
113
- if (groupId === "unassigned") {
114
+ if (groupId === REVIEW_BUCKETS.unassigned) {
114
115
  return serializeGroup(ctx.files, ctx.coverage.unassigned);
115
116
  }
116
- if (groupId === "lockfiles") {
117
+ if (groupId === REVIEW_BUCKETS.lockfiles) {
117
118
  return serializeLockfiles(ctx.files);
118
119
  }
119
120
  const group = ctx.coverage.groups.find((item) => item.group.id === groupId);
@@ -198,8 +199,8 @@ export function listResources(ctx) {
198
199
  const resources = [
199
200
  { kind: "review" },
200
201
  { kind: "agent-md", target: "overview" },
201
- { kind: "hunks", group: "unassigned" },
202
- { kind: "hunks", group: "lockfiles" },
202
+ { kind: "hunks", group: REVIEW_BUCKETS.unassigned },
203
+ { kind: "hunks", group: REVIEW_BUCKETS.lockfiles },
203
204
  ];
204
205
  for (const group of ctx.document.groups) {
205
206
  resources.push({ kind: "hunks", group: group.id });
@@ -260,12 +261,20 @@ async function patchPayload(ctx, path) {
260
261
  if (!isLockfilePath(file.path) || file.binary || file.image) {
261
262
  throw new ApiError(404, "path is not a deferred lockfile");
262
263
  }
263
- const live = await readPathDiff(ctx.cwd, ctx.resolved.baseSha, ctx.resolved.headSha, file.path);
264
+ const live = await readPathDiffSafe(ctx, file.path);
264
265
  if (live === undefined) {
265
266
  throw new ApiError(404, `no live diff for ${path}`);
266
267
  }
267
268
  return serializeGroupFile(live, live.hunks, false);
268
269
  }
270
+ async function readPathDiffSafe(ctx, path) {
271
+ try {
272
+ return await readPathDiff(ctx.cwd, ctx.resolved.baseSha, ctx.resolved.headSha, path);
273
+ }
274
+ catch (error) {
275
+ throw new ApiError(404, error instanceof Error ? error.message : "diff not available");
276
+ }
277
+ }
269
278
  function serializeGroupFile(file, fileHunks, deferLockfile) {
270
279
  const lockfile = isLockfilePath(file.path) && !file.binary && !file.image;
271
280
  const deferred = deferLockfile && lockfile;
@@ -317,9 +326,10 @@ function uniquePaths(hunks) {
317
326
  export function snapshotJson(body) {
318
327
  return `${JSON.stringify(body)}\n`;
319
328
  }
329
+ /** 404 (and transient git failures) mean the live object moved. Skip it in export. 400 is a bad request, not a skip. */
320
330
  export function isUnavailableSnapshot(error) {
321
331
  if (error instanceof ApiError) {
322
- return error.status === 404 || error.status === 400;
332
+ return error.status === 404;
323
333
  }
324
334
  return error instanceof GitError;
325
335
  }
package/dist/api/paths.js CHANGED
@@ -1,23 +1,17 @@
1
+ import { isSourceSide } from "../schema/types.js";
1
2
  export function apiHref(resource) {
2
- switch (resource.kind) {
3
- case "review":
4
- return "api/review.json";
5
- case "agent-md":
6
- return agentMdRel(resource);
7
- case "hunks":
8
- return `api/hunks/${encodeURIComponent(resource.group)}.json`;
9
- case "file":
10
- return `api/files/${resource.side}/${encodeFilePath(resource.path)}.json`;
11
- case "blame":
12
- return `api/blame/${resource.side}/${encodeFilePath(resource.path)}.json`;
13
- case "image":
14
- return `api/images/${resource.side}/${encodeFilePath(resource.path)}`;
15
- case "patch":
16
- return `api/patches/${encodeFilePath(resource.path)}.json`;
17
- }
3
+ return apiRel(resource, true);
18
4
  }
19
5
  /** Decoded relative path under the site root. Static hosts map encoded request URLs onto this. */
20
6
  export function apiFsRel(resource) {
7
+ return apiRel(resource, false);
8
+ }
9
+ /** Relative link from overview.md to a group file. Overview lives in api/agent, groups live in api/agent/groups. */
10
+ export function agentMdGroupHref(group) {
11
+ return `groups/${encodeURIComponent(group)}.md`;
12
+ }
13
+ function apiRel(resource, encodeFiles) {
14
+ const filePath = (path) => (encodeFiles ? encodeFilePath(path) : path);
21
15
  switch (resource.kind) {
22
16
  case "review":
23
17
  return "api/review.json";
@@ -26,13 +20,13 @@ export function apiFsRel(resource) {
26
20
  case "hunks":
27
21
  return `api/hunks/${encodeURIComponent(resource.group)}.json`;
28
22
  case "file":
29
- return `api/files/${resource.side}/${resource.path}.json`;
23
+ return `api/files/${resource.side}/${filePath(resource.path)}.json`;
30
24
  case "blame":
31
- return `api/blame/${resource.side}/${resource.path}.json`;
25
+ return `api/blame/${resource.side}/${filePath(resource.path)}.json`;
32
26
  case "image":
33
- return `api/images/${resource.side}/${resource.path}`;
27
+ return `api/images/${resource.side}/${filePath(resource.path)}`;
34
28
  case "patch":
35
- return `api/patches/${resource.path}.json`;
29
+ return `api/patches/${filePath(resource.path)}.json`;
36
30
  }
37
31
  }
38
32
  export function parseApiPath(pathname) {
@@ -65,11 +59,11 @@ export function parseApiPath(pathname) {
65
59
  }
66
60
  if (parts[1] === "images" && parts.length >= 4 && parts[2] !== undefined) {
67
61
  const side = parts[2];
68
- if (side !== "old" && side !== "new") {
62
+ if (!isSourceSide(side)) {
69
63
  return undefined;
70
64
  }
71
65
  const path = parts.slice(3).join("/");
72
- if (!isRepoPath(path)) {
66
+ if (!isSafePath(path)) {
73
67
  return undefined;
74
68
  }
75
69
  return { kind: "image", path, side };
@@ -83,14 +77,14 @@ export function parseApiPath(pathname) {
83
77
  }
84
78
  rest[rest.length - 1] = stem;
85
79
  const path = rest.join("/");
86
- if (!isRepoPath(path)) {
80
+ if (!isSafePath(path)) {
87
81
  return undefined;
88
82
  }
89
83
  return { kind: "patch", path };
90
84
  }
91
85
  if ((parts[1] === "files" || parts[1] === "blame") && parts.length >= 4 && parts[2] !== undefined) {
92
86
  const side = parts[2];
93
- if (side !== "old" && side !== "new") {
87
+ if (!isSourceSide(side)) {
94
88
  return undefined;
95
89
  }
96
90
  const rest = parts.slice(3);
@@ -101,7 +95,7 @@ export function parseApiPath(pathname) {
101
95
  }
102
96
  rest[rest.length - 1] = stem;
103
97
  const path = rest.join("/");
104
- if (!isRepoPath(path)) {
98
+ if (!isSafePath(path)) {
105
99
  return undefined;
106
100
  }
107
101
  return { kind: parts[1] === "files" ? "file" : "blame", path, side };
@@ -123,22 +117,26 @@ function agentMdRel(resource) {
123
117
  if (resource.target === "overview") {
124
118
  return "api/agent/overview.md";
125
119
  }
126
- return `api/agent/groups/${encodeURIComponent(resource.group)}.md`;
120
+ return `api/agent/${agentMdGroupHref(resource.group)}`;
127
121
  }
128
122
  function jsonStem(file) {
129
- if (!file.endsWith(".json")) {
130
- return undefined;
131
- }
132
- const stem = file.slice(0, -".json".length);
133
- return stem === "" ? undefined : stem;
123
+ return stem(file, ".json");
134
124
  }
135
125
  function mdStem(file) {
136
- if (!file.endsWith(".md")) {
126
+ return stem(file, ".md");
127
+ }
128
+ function stem(file, ext) {
129
+ if (!file.endsWith(ext)) {
137
130
  return undefined;
138
131
  }
139
- const stem = file.slice(0, -".md".length);
140
- return stem === "" ? undefined : stem;
132
+ const bare = file.slice(0, -ext.length);
133
+ return bare === "" ? undefined : bare;
141
134
  }
142
- function isRepoPath(path) {
143
- return path !== "" && !path.startsWith("/") && !path.includes("\0") && !path.split("/").includes("..");
135
+ export function isSafePath(path) {
136
+ return (path.trim() !== "" && !path.startsWith("/") && !path.includes("\0") && !path.split("/").includes(".."));
137
+ }
138
+ export function assertSafePath(path) {
139
+ if (!isSafePath(path)) {
140
+ throw new Error(`invalid path: ${path}`);
141
+ }
144
142
  }
@@ -0,0 +1,138 @@
1
+ import { readFile, rm } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ export const SHIKI_LANGS_FILE = "shiki-langs.json";
4
+ const LANG_MODULE = /[/\\]@shikijs[/\\]langs[/\\]dist[/\\]([^/\\]+)\.m?js(?:\?|$)/;
5
+ const SKIP_LANGS = new Set(["text", "ansi"]);
6
+ export function shikiLangId(id) {
7
+ return id.match(LANG_MODULE)?.[1];
8
+ }
9
+ export function parseShikiLangsManifest(input) {
10
+ if (!isRecord(input) || input.version !== 1) {
11
+ return undefined;
12
+ }
13
+ const chunks = stringList(input.chunks);
14
+ const files = stringListMap(input.files);
15
+ const lookup = stringMap(input.lookup);
16
+ if (chunks === undefined || files === undefined || lookup === undefined) {
17
+ return undefined;
18
+ }
19
+ return { version: 1, chunks, files, lookup };
20
+ }
21
+ export function highlightLangFromPath(path, lookup) {
22
+ const fileName = path.split(/[/\\]/).pop() ?? path;
23
+ if (lookup[fileName] !== undefined) {
24
+ return lookup[fileName];
25
+ }
26
+ const compound = fileName.match(/\.([^/\\]+\.[^/\\]+)$/)?.[1];
27
+ if (compound !== undefined && lookup[compound] !== undefined) {
28
+ return lookup[compound];
29
+ }
30
+ const simple = fileName.match(/\.([^.]+)$/)?.[1] ?? "";
31
+ return lookup[simple];
32
+ }
33
+ export function highlightLangsForPaths(paths, lookup) {
34
+ const langs = new Set();
35
+ for (const path of paths) {
36
+ const lang = highlightLangFromPath(path, lookup);
37
+ if (lang !== undefined && !SKIP_LANGS.has(lang)) {
38
+ langs.add(lang);
39
+ }
40
+ }
41
+ return [...langs];
42
+ }
43
+ export function highlightPathsFromFiles(files) {
44
+ const paths = [];
45
+ for (const file of files) {
46
+ paths.push(file.path);
47
+ if (file.oldPath !== undefined) {
48
+ paths.push(file.oldPath);
49
+ }
50
+ }
51
+ return paths;
52
+ }
53
+ export function chunksToKeep(manifest, langs) {
54
+ const keep = new Set();
55
+ for (const lang of langs) {
56
+ const files = manifest.files[lang];
57
+ if (files === undefined) {
58
+ return undefined;
59
+ }
60
+ for (const file of files) {
61
+ keep.add(file);
62
+ }
63
+ }
64
+ return [...keep];
65
+ }
66
+ export async function pruneUnusedHighlighterChunks(outDir, paths) {
67
+ const manifest = await loadManifest(join(outDir, SHIKI_LANGS_FILE));
68
+ if (manifest === undefined) {
69
+ return [];
70
+ }
71
+ const langs = highlightLangsForPaths(paths, manifest.lookup);
72
+ const keep = chunksToKeep(manifest, langs);
73
+ if (keep === undefined) {
74
+ return [];
75
+ }
76
+ const keepSet = new Set(keep);
77
+ const removed = [];
78
+ for (const file of manifest.chunks) {
79
+ if (keepSet.has(file)) {
80
+ continue;
81
+ }
82
+ await rm(join(outDir, file), { force: true });
83
+ await rm(join(outDir, `${file}.map`), { force: true });
84
+ removed.push(file);
85
+ }
86
+ return removed;
87
+ }
88
+ async function loadManifest(path) {
89
+ let text;
90
+ try {
91
+ text = await readFile(path, "utf8");
92
+ }
93
+ catch {
94
+ return undefined;
95
+ }
96
+ try {
97
+ return parseShikiLangsManifest(JSON.parse(text));
98
+ }
99
+ catch {
100
+ return undefined;
101
+ }
102
+ }
103
+ function isRecord(value) {
104
+ return typeof value === "object" && value !== null && !Array.isArray(value);
105
+ }
106
+ function stringList(value) {
107
+ if (!Array.isArray(value) || value.some((item) => typeof item !== "string")) {
108
+ return undefined;
109
+ }
110
+ return value;
111
+ }
112
+ function stringMap(value) {
113
+ if (!isRecord(value)) {
114
+ return undefined;
115
+ }
116
+ const out = {};
117
+ for (const [key, item] of Object.entries(value)) {
118
+ if (typeof item !== "string") {
119
+ return undefined;
120
+ }
121
+ out[key] = item;
122
+ }
123
+ return out;
124
+ }
125
+ function stringListMap(value) {
126
+ if (!isRecord(value)) {
127
+ return undefined;
128
+ }
129
+ const out = {};
130
+ for (const [key, item] of Object.entries(value)) {
131
+ const list = stringList(item);
132
+ if (list === undefined) {
133
+ return undefined;
134
+ }
135
+ out[key] = list;
136
+ }
137
+ return out;
138
+ }
@@ -4,6 +4,7 @@ import { dirname, join, resolve } from "node:path";
4
4
  import { findPackageRoot } from "../package-root.js";
5
5
  import { isUnavailableSnapshot, listResources, openReview, renderResource, snapshotJson, } from "./live.js";
6
6
  import { apiFsRel } from "./paths.js";
7
+ import { highlightPathsFromFiles, pruneUnusedHighlighterChunks } from "./shiki-langs.js";
7
8
  export async function exportStaticSite(opts) {
8
9
  const outDir = resolve(opts.outDir);
9
10
  const uiRoot = opts.uiRoot ?? join(findPackageRoot(), "dist/ui");
@@ -41,5 +42,6 @@ export async function exportStaticSite(opts) {
41
42
  }
42
43
  apiFiles.push(rel);
43
44
  }
45
+ await pruneUnusedHighlighterChunks(outDir, highlightPathsFromFiles(ctx.files));
44
46
  return { outDir, apiFiles };
45
47
  }
package/dist/api/types.js CHANGED
@@ -1 +1,5 @@
1
- export {};
1
+ /** Hunk group ids outside the review document. The UI fetches them with the same hunks endpoint. */
2
+ export const REVIEW_BUCKETS = {
3
+ unassigned: "unassigned",
4
+ lockfiles: "lockfiles",
5
+ };
package/dist/cli/args.js CHANGED
@@ -1,4 +1,11 @@
1
1
  const COMMANDS = new Set(["index", "validate", "serve", "export"]);
2
+ export const DEFAULT_PORT = 4567;
3
+ export class ArgError extends Error {
4
+ constructor(message) {
5
+ super(message);
6
+ this.name = "ArgError";
7
+ }
8
+ }
2
9
  export const USAGE = `Usage: comprehende <command> [options]
3
10
 
4
11
  Run inside the git repository under review. Cwd is the repo.
@@ -14,14 +21,15 @@ Commands:
14
21
  Serve the local UI on 127.0.0.1 (pins commit SHAs at start)
15
22
 
16
23
  export --data <review.json> --out <dir>
17
- Write a static site (same UI + frozen git payloads). No server after that.
24
+ Write a static site (same UI + frozen git payloads). Highlighters only
25
+ for languages in the review. No server after that.
18
26
 
19
27
  Options:
20
28
  --base <ref> Base ref (default: origin/HEAD or main/master)
21
29
  --head <ref> Head ref (default: HEAD)
22
30
  --data <path> Review document path
23
31
  --out <dir> Output directory for export
24
- --port <n> Listen port (default: 4567, 0 for ephemeral)
32
+ --port <n> Listen port (default: ${DEFAULT_PORT}, 0 for ephemeral)
25
33
  --open Open the UI in a browser
26
34
  -h, --help Show this help
27
35
  -v, --version Show version
@@ -46,9 +54,9 @@ export function parseArgv(argv, cwd = process.cwd()) {
46
54
  }
47
55
  const rest = args.slice(1);
48
56
  try {
49
- const port = Number(flag(rest, "--port") ?? "4567");
57
+ const port = Number(flag(rest, "--port") ?? String(DEFAULT_PORT));
50
58
  if (!Number.isInteger(port) || port < 0) {
51
- throw new Error("--port must be a non-negative integer");
59
+ throw new ArgError("--port must be a non-negative integer");
52
60
  }
53
61
  return {
54
62
  kind: "command",
@@ -79,14 +87,14 @@ function flag(args, name) {
79
87
  if (arg === name) {
80
88
  const value = args[i + 1];
81
89
  if (value === undefined || value.startsWith("-")) {
82
- throw new Error(`${name} requires a value`);
90
+ throw new ArgError(`${name} requires a value`);
83
91
  }
84
92
  return value;
85
93
  }
86
94
  if (arg.startsWith(prefix)) {
87
95
  const value = arg.slice(prefix.length);
88
96
  if (value === "") {
89
- throw new Error(`${name} requires a value`);
97
+ throw new ArgError(`${name} requires a value`);
90
98
  }
91
99
  return value;
92
100
  }
@@ -1,40 +1,17 @@
1
- import { readFile } from "node:fs/promises";
2
- import { isAbsolute, resolve } from "node:path";
3
1
  import { readHunkIndex, resolveSource } from "../git/diff.js";
4
2
  import { defaultBaseRef } from "../git/repo.js";
5
3
  import { coverReview, coverageErrors } from "../review/coverage.js";
4
+ import { loadDocument, resolveCliPath } from "../review/load.js";
6
5
  import { commentPinErrors, staleCommentPins } from "../review/pins.js";
7
- import { parseReviewJson } from "../schema/parse.js";
8
6
  import { sourceCitationErrors } from "../schema/source.js";
9
- export async function resolveRange(cwd, base, head) {
7
+ export async function cmdIndex(cwd, base, head) {
10
8
  const baseRef = base ?? (await defaultBaseRef(cwd));
11
9
  const headRef = head ?? "HEAD";
12
10
  await resolveSource(cwd, baseRef, headRef);
13
- return { baseRef, headRef };
14
- }
15
- export async function cmdIndex(cwd, base, head) {
16
- const range = await resolveRange(cwd, base, head);
17
- return readHunkIndex(cwd, range.baseRef, range.headRef);
18
- }
19
- export async function loadDocument(dataPath) {
20
- const text = await readFile(dataPath, "utf8");
21
- const parsed = parseReviewJson(text);
22
- if (!parsed.ok) {
23
- throw new Error(`invalid review document:\n${parsed.errors.map((error) => ` - ${error}`).join("\n")}`);
24
- }
25
- return parsed.document;
26
- }
27
- export function resolveDataPath(data, cwd) {
28
- if (data === undefined) {
29
- throw new Error("missing --data <review.json>");
30
- }
31
- return isAbsolute(data) ? data : resolve(cwd, data);
11
+ return readHunkIndex(cwd, baseRef, headRef);
32
12
  }
33
13
  export function resolveOutPath(out, cwd) {
34
- if (out === undefined) {
35
- throw new Error("missing --out <dir>");
36
- }
37
- return isAbsolute(out) ? out : resolve(cwd, out);
14
+ return resolveCliPath(out, cwd, "--out <dir>");
38
15
  }
39
16
  export async function cmdValidate(cwd, dataPath) {
40
17
  const document = await loadDocument(dataPath);
package/dist/cli/main.js CHANGED
@@ -4,7 +4,8 @@ import { realpathSync } from "node:fs";
4
4
  import { resolve } from "node:path";
5
5
  import { fileURLToPath } from "node:url";
6
6
  import { parseArgv, USAGE } from "./args.js";
7
- import { cmdIndex, cmdValidate, resolveDataPath, resolveOutPath } from "./commands.js";
7
+ import { cmdIndex, cmdValidate, resolveOutPath } from "./commands.js";
8
+ import { loadDocument, resolveDataPath } from "../review/load.js";
8
9
  import { exportStaticSite } from "../api/snapshot.js";
9
10
  import { openReview, pinReviewSource, reviewProblems } from "../api/live.js";
10
11
  import { assertWorkTree } from "../git/repo.js";
@@ -41,8 +42,9 @@ export async function run(argv) {
41
42
  }
42
43
  case "serve": {
43
44
  const dataPath = resolveDataPath(request.data, request.cwd);
44
- const pin = await pinReviewSource(request.cwd, dataPath);
45
- const ctx = await openReview(request.cwd, dataPath, pin);
45
+ const document = await loadDocument(dataPath);
46
+ const pin = await pinReviewSource(request.cwd, document);
47
+ const ctx = await openReview(request.cwd, document, pin);
46
48
  warnReview(ctx, "serve continues; git wins, unassigned/stale are visible");
47
49
  const running = await startServer({ cwd: request.cwd, dataPath, port: request.port, pin });
48
50
  console.log(running.url);
@@ -56,7 +58,8 @@ export async function run(argv) {
56
58
  case "export": {
57
59
  const dataPath = resolveDataPath(request.data, request.cwd);
58
60
  const outDir = resolveOutPath(request.out, request.cwd);
59
- const ctx = await openReview(request.cwd, dataPath);
61
+ const document = await loadDocument(dataPath);
62
+ const ctx = await openReview(request.cwd, document);
60
63
  warnReview(ctx, "export continues; git wins, unassigned/stale are visible");
61
64
  const result = await exportStaticSite({ cwd: request.cwd, dataPath, outDir, ctx });
62
65
  console.log(result.outDir);
package/dist/git/exec.js CHANGED
@@ -1,6 +1,7 @@
1
1
  import { execFile } from "node:child_process";
2
2
  import { promisify } from "node:util";
3
3
  const execFileAsync = promisify(execFile);
4
+ /** Mirrored in scripts/install-git-hooks.js, which runs as plain node without tsx. Update both. */
4
5
  const GIT_DIR_VARS = new Set([
5
6
  "GIT_DIR",
6
7
  "GIT_WORK_TREE",
@@ -76,13 +77,12 @@ export async function gitOk(cwd, args) {
76
77
  }
77
78
  }
78
79
  function asExecFailure(error) {
79
- if (typeof error === "object" && error !== null) {
80
- const record = error;
80
+ if (isRecord(error)) {
81
81
  return {
82
- message: typeof record.message === "string" ? record.message : "git failed",
83
- stdout: bufferText(record.stdout),
84
- stderr: bufferText(record.stderr),
85
- code: typeof record.code === "number" ? record.code : null,
82
+ message: typeof error.message === "string" ? error.message : "git failed",
83
+ stdout: bufferText(error.stdout),
84
+ stderr: bufferText(error.stderr),
85
+ code: typeof error.code === "number" ? error.code : null,
86
86
  };
87
87
  }
88
88
  return { message: "git failed", stdout: "", stderr: "", code: null };
@@ -96,6 +96,9 @@ function bufferText(value) {
96
96
  }
97
97
  return "";
98
98
  }
99
+ function isRecord(value) {
100
+ return typeof value === "object" && value !== null && !Array.isArray(value);
101
+ }
99
102
  function gitFailure(args, failure) {
100
103
  return new GitError(`git ${args.join(" ")} failed: ${failure.stderr.trim() || failure.message}`, args, failure.stderr, failure.code);
101
104
  }