comprehende 0.1.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 (471) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +94 -0
  3. package/dist/cli/args.d.ts +20 -0
  4. package/dist/cli/args.js +89 -0
  5. package/dist/cli/args.js.map +1 -0
  6. package/dist/cli/commands.d.ts +12 -0
  7. package/dist/cli/commands.js +40 -0
  8. package/dist/cli/commands.js.map +1 -0
  9. package/dist/cli/main.d.ts +2 -0
  10. package/dist/cli/main.js +102 -0
  11. package/dist/cli/main.js.map +1 -0
  12. package/dist/git/blame.d.ts +8 -0
  13. package/dist/git/blame.js +36 -0
  14. package/dist/git/blame.js.map +1 -0
  15. package/dist/git/diff.d.ts +13 -0
  16. package/dist/git/diff.js +332 -0
  17. package/dist/git/diff.js.map +1 -0
  18. package/dist/git/exec.d.ts +10 -0
  19. package/dist/git/exec.js +53 -0
  20. package/dist/git/exec.js.map +1 -0
  21. package/dist/git/log.d.ts +8 -0
  22. package/dist/git/log.js +26 -0
  23. package/dist/git/log.js.map +1 -0
  24. package/dist/git/repo.d.ts +7 -0
  25. package/dist/git/repo.js +45 -0
  26. package/dist/git/repo.js.map +1 -0
  27. package/dist/git/show.d.ts +2 -0
  28. package/dist/git/show.js +18 -0
  29. package/dist/git/show.js.map +1 -0
  30. package/dist/package-root.d.ts +2 -0
  31. package/dist/package-root.js +25 -0
  32. package/dist/package-root.js.map +1 -0
  33. package/dist/review/coverage.d.ts +20 -0
  34. package/dist/review/coverage.js +56 -0
  35. package/dist/review/coverage.js.map +1 -0
  36. package/dist/review/effort.d.ts +1 -0
  37. package/dist/review/effort.js +17 -0
  38. package/dist/review/effort.js.map +1 -0
  39. package/dist/review/generate.d.ts +20 -0
  40. package/dist/review/generate.js +290 -0
  41. package/dist/review/generate.js.map +1 -0
  42. package/dist/schema/blame-runs.d.ts +14 -0
  43. package/dist/schema/blame-runs.js +18 -0
  44. package/dist/schema/blame-runs.js.map +1 -0
  45. package/dist/schema/hunk-meta.d.ts +26 -0
  46. package/dist/schema/hunk-meta.js +107 -0
  47. package/dist/schema/hunk-meta.js.map +1 -0
  48. package/dist/schema/hunk-patch.d.ts +2 -0
  49. package/dist/schema/hunk-patch.js +49 -0
  50. package/dist/schema/hunk-patch.js.map +1 -0
  51. package/dist/schema/identity.d.ts +3 -0
  52. package/dist/schema/identity.js +7 -0
  53. package/dist/schema/identity.js.map +1 -0
  54. package/dist/schema/parse.d.ts +13 -0
  55. package/dist/schema/parse.js +258 -0
  56. package/dist/schema/parse.js.map +1 -0
  57. package/dist/schema/skill-paths.d.ts +7 -0
  58. package/dist/schema/skill-paths.js +11 -0
  59. package/dist/schema/skill-paths.js.map +1 -0
  60. package/dist/schema/types.d.ts +73 -0
  61. package/dist/schema/types.js +4 -0
  62. package/dist/schema/types.js.map +1 -0
  63. package/dist/server/http.d.ts +12 -0
  64. package/dist/server/http.js +270 -0
  65. package/dist/server/http.js.map +1 -0
  66. package/dist/ui/assets/abap-BdImnpbu.js +1 -0
  67. package/dist/ui/assets/actionscript-3-B3316cI-.js +1 -0
  68. package/dist/ui/assets/ada-bCR0ucgS.js +1 -0
  69. package/dist/ui/assets/ahk-CsyLZFj1.js +1 -0
  70. package/dist/ui/assets/ahk2-8Zs4aa1G.js +1 -0
  71. package/dist/ui/assets/andromeeda-C4gqWexZ.js +1 -0
  72. package/dist/ui/assets/angular-html-DA-rfuFy.js +1 -0
  73. package/dist/ui/assets/angular-ts-BrjP3tb8.js +1 -0
  74. package/dist/ui/assets/apache-Pmp26Uib.js +1 -0
  75. package/dist/ui/assets/apex-DhZFqWV2.js +1 -0
  76. package/dist/ui/assets/apl-CORt7UWP.js +1 -0
  77. package/dist/ui/assets/applescript-Co6uUVPk.js +1 -0
  78. package/dist/ui/assets/ara-BRHolxvo.js +1 -0
  79. package/dist/ui/assets/asciidoc-CSVQ5wI8.js +1 -0
  80. package/dist/ui/assets/asm-D_Q5rh1f.js +1 -0
  81. package/dist/ui/assets/astro-HNnZUWAn.js +1 -0
  82. package/dist/ui/assets/aurora-x-D-2ljcwZ.js +1 -0
  83. package/dist/ui/assets/awk-DMzUqQB5.js +1 -0
  84. package/dist/ui/assets/ayu-dark-DYE7WIF3.js +1 -0
  85. package/dist/ui/assets/ayu-light-BA47KaF1.js +1 -0
  86. package/dist/ui/assets/ayu-mirage-32ctXXKs.js +1 -0
  87. package/dist/ui/assets/ballerina-BFfxhgS-.js +1 -0
  88. package/dist/ui/assets/bat-CickPsom.js +1 -0
  89. package/dist/ui/assets/beancount-k_qm7-4y.js +1 -0
  90. package/dist/ui/assets/berry-uYugtg8r.js +1 -0
  91. package/dist/ui/assets/bibtex-CHM0blh-.js +1 -0
  92. package/dist/ui/assets/bicep-Bmn6On1c.js +1 -0
  93. package/dist/ui/assets/bird2-Bx8U0n9b.js +1 -0
  94. package/dist/ui/assets/blade-2xfisSek.js +1 -0
  95. package/dist/ui/assets/bsl-DlhNcFeZ.js +1 -0
  96. package/dist/ui/assets/c-BIGW1oBm.js +1 -0
  97. package/dist/ui/assets/c3-Dp5svz6Z.js +1 -0
  98. package/dist/ui/assets/cadence-Bv_4Rxtq.js +1 -0
  99. package/dist/ui/assets/cairo-KRGpt6FW.js +1 -0
  100. package/dist/ui/assets/catppuccin-frappe-CZL1YF0i.js +1 -0
  101. package/dist/ui/assets/catppuccin-latte-DH-8KZSZ.js +1 -0
  102. package/dist/ui/assets/catppuccin-macchiato-B7yYVSCf.js +1 -0
  103. package/dist/ui/assets/catppuccin-mocha-Ct7hS0mc.js +1 -0
  104. package/dist/ui/assets/chapel-DTp_pixX.js +1 -0
  105. package/dist/ui/assets/clarity-Dn5IMItf.js +1 -0
  106. package/dist/ui/assets/clojure-P80f7IUj.js +1 -0
  107. package/dist/ui/assets/cmake-D1j8_8rp.js +1 -0
  108. package/dist/ui/assets/cobol-nBiQ_Alo.js +1 -0
  109. package/dist/ui/assets/codeowners-Bp6g37R7.js +1 -0
  110. package/dist/ui/assets/codeql-DsOJ9woJ.js +1 -0
  111. package/dist/ui/assets/coffee-Ch7k5sss.js +1 -0
  112. package/dist/ui/assets/common-lisp-Cg-RD9OK.js +1 -0
  113. package/dist/ui/assets/coq-C7JzOVbR.js +1 -0
  114. package/dist/ui/assets/cpp-BMRokrvK.js +1 -0
  115. package/dist/ui/assets/crystal-DGywbUpC.js +1 -0
  116. package/dist/ui/assets/csharp-DSvCPggb.js +1 -0
  117. package/dist/ui/assets/css-CLj8gQPS.js +1 -0
  118. package/dist/ui/assets/csv-fuZLfV_i.js +1 -0
  119. package/dist/ui/assets/cue-D82EKSYY.js +1 -0
  120. package/dist/ui/assets/cypher-COkxafJQ.js +1 -0
  121. package/dist/ui/assets/d-85-TOEBH.js +1 -0
  122. package/dist/ui/assets/dark-plus-C3mMm8J8.js +1 -0
  123. package/dist/ui/assets/dart-bE4Kk8sk.js +1 -0
  124. package/dist/ui/assets/dax-CEL-wOlO.js +1 -0
  125. package/dist/ui/assets/desktop-BmXAJ9_W.js +1 -0
  126. package/dist/ui/assets/diff-D97Zzqfu.js +1 -0
  127. package/dist/ui/assets/docker-BcOcwvcX.js +1 -0
  128. package/dist/ui/assets/dotenv-Da5cRb03.js +1 -0
  129. package/dist/ui/assets/dracula-BzJJZx-M.js +1 -0
  130. package/dist/ui/assets/dracula-soft-BXkSAIEj.js +1 -0
  131. package/dist/ui/assets/dream-maker-BtqSS_iP.js +1 -0
  132. package/dist/ui/assets/edge-FbVlp4U3.js +1 -0
  133. package/dist/ui/assets/elixir-CkH2-t6x.js +1 -0
  134. package/dist/ui/assets/elm-DbKCFpqz.js +1 -0
  135. package/dist/ui/assets/emacs-lisp-C_m_b--Z.js +1 -0
  136. package/dist/ui/assets/erb-DXfck5VN.js +1 -0
  137. package/dist/ui/assets/erlang-DsQrWhSR.js +1 -0
  138. package/dist/ui/assets/everforest-dark-BgDCqdQA.js +1 -0
  139. package/dist/ui/assets/everforest-light-C8M2exoo.js +1 -0
  140. package/dist/ui/assets/fennel-BYunw83y.js +1 -0
  141. package/dist/ui/assets/fish-BvzEVeQv.js +1 -0
  142. package/dist/ui/assets/fluent-C4IJs8-o.js +1 -0
  143. package/dist/ui/assets/fortran-fixed-form-CkoXwp7k.js +1 -0
  144. package/dist/ui/assets/fortran-free-form-BxgE0vQu.js +1 -0
  145. package/dist/ui/assets/fsharp-CXgrBDvD.js +1 -0
  146. package/dist/ui/assets/gdresource-TyuKm33G.js +1 -0
  147. package/dist/ui/assets/gdscript-DqcFQ5yU.js +1 -0
  148. package/dist/ui/assets/gdshader-DkwncUOv.js +1 -0
  149. package/dist/ui/assets/genie-D0YGMca9.js +1 -0
  150. package/dist/ui/assets/gherkin-DyxjwDmM.js +1 -0
  151. package/dist/ui/assets/git-commit-F4YmCXRG.js +1 -0
  152. package/dist/ui/assets/git-rebase-r7XF79zn.js +1 -0
  153. package/dist/ui/assets/github-dark-DHJKELXO.js +1 -0
  154. package/dist/ui/assets/github-dark-default-Cuk6v7N8.js +1 -0
  155. package/dist/ui/assets/github-dark-dimmed-DH5Ifo-i.js +1 -0
  156. package/dist/ui/assets/github-dark-high-contrast-E3gJ1_iC.js +1 -0
  157. package/dist/ui/assets/github-light-DAi9KRSo.js +1 -0
  158. package/dist/ui/assets/github-light-default-D7oLnXFd.js +1 -0
  159. package/dist/ui/assets/github-light-high-contrast-BfjtVDDH.js +1 -0
  160. package/dist/ui/assets/gleam-BspZqrRM.js +1 -0
  161. package/dist/ui/assets/glimmer-js-ByusRIyA.js +1 -0
  162. package/dist/ui/assets/glimmer-ts-BfAWNZQY.js +1 -0
  163. package/dist/ui/assets/glsl-DplSGwfg.js +1 -0
  164. package/dist/ui/assets/gn-n2N0HUVH.js +1 -0
  165. package/dist/ui/assets/gnuplot-DdkO51Og.js +1 -0
  166. package/dist/ui/assets/go-C27-OAKa.js +1 -0
  167. package/dist/ui/assets/graphql-ChdNCCLP.js +1 -0
  168. package/dist/ui/assets/groovy-gcz8RCvz.js +1 -0
  169. package/dist/ui/assets/gruvbox-dark-hard-CFHQjOhq.js +1 -0
  170. package/dist/ui/assets/gruvbox-dark-medium-GsRaNv29.js +1 -0
  171. package/dist/ui/assets/gruvbox-dark-soft-CVdnzihN.js +1 -0
  172. package/dist/ui/assets/gruvbox-light-hard-CH1njM8p.js +1 -0
  173. package/dist/ui/assets/gruvbox-light-medium-DRw_LuNl.js +1 -0
  174. package/dist/ui/assets/gruvbox-light-soft-hJgmCMqR.js +1 -0
  175. package/dist/ui/assets/hack-BWmVpMyf.js +1 -0
  176. package/dist/ui/assets/haml-D5jkg6IW.js +1 -0
  177. package/dist/ui/assets/handlebars-BpdQsYii.js +1 -0
  178. package/dist/ui/assets/haskell-Df6bDoY_.js +1 -0
  179. package/dist/ui/assets/haxe-CfZj7gIn.js +1 -0
  180. package/dist/ui/assets/hcl-BWvSN4gD.js +1 -0
  181. package/dist/ui/assets/hjson-D5-asLiD.js +1 -0
  182. package/dist/ui/assets/hlsl-D3lLCCz7.js +1 -0
  183. package/dist/ui/assets/horizon-BUw7H-hv.js +1 -0
  184. package/dist/ui/assets/horizon-bright-CUuTKBJd.js +1 -0
  185. package/dist/ui/assets/houston-DnULxvSX.js +1 -0
  186. package/dist/ui/assets/html-derivative-DlHx6ybY.js +1 -0
  187. package/dist/ui/assets/html-pp8916En.js +1 -0
  188. package/dist/ui/assets/http-jrhK8wxY.js +1 -0
  189. package/dist/ui/assets/hurl-irOxFIW8.js +1 -0
  190. package/dist/ui/assets/hxml-2-FPmUDs.js +1 -0
  191. package/dist/ui/assets/hy-DFXneXwc.js +1 -0
  192. package/dist/ui/assets/ibm-plex-mono-cyrillic-400-normal-BSMlKf0J.woff2 +0 -0
  193. package/dist/ui/assets/ibm-plex-mono-cyrillic-400-normal-CEL4l2ZJ.woff +0 -0
  194. package/dist/ui/assets/ibm-plex-mono-cyrillic-500-normal-Ael50iVv.woff +0 -0
  195. package/dist/ui/assets/ibm-plex-mono-cyrillic-500-normal-Bq9vWWag.woff2 +0 -0
  196. package/dist/ui/assets/ibm-plex-mono-cyrillic-ext-400-normal-DMdlQ8Kv.woff +0 -0
  197. package/dist/ui/assets/ibm-plex-mono-cyrillic-ext-400-normal-xuaO2J-f.woff2 +0 -0
  198. package/dist/ui/assets/ibm-plex-mono-cyrillic-ext-500-normal-BIfNGwUT.woff +0 -0
  199. package/dist/ui/assets/ibm-plex-mono-cyrillic-ext-500-normal-BqneJy0T.woff2 +0 -0
  200. package/dist/ui/assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff +0 -0
  201. package/dist/ui/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2 +0 -0
  202. package/dist/ui/assets/ibm-plex-mono-latin-500-normal-CB9ihrfo.woff +0 -0
  203. package/dist/ui/assets/ibm-plex-mono-latin-500-normal-DSY6xOcd.woff2 +0 -0
  204. package/dist/ui/assets/ibm-plex-mono-latin-ext-400-normal-BmRBH3aV.woff2 +0 -0
  205. package/dist/ui/assets/ibm-plex-mono-latin-ext-400-normal-D3D2R8hC.woff +0 -0
  206. package/dist/ui/assets/ibm-plex-mono-latin-ext-500-normal-CAhNIIs5.woff2 +0 -0
  207. package/dist/ui/assets/ibm-plex-mono-latin-ext-500-normal-CZ70TYgx.woff +0 -0
  208. package/dist/ui/assets/ibm-plex-mono-vietnamese-400-normal-BulugwFq.woff2 +0 -0
  209. package/dist/ui/assets/ibm-plex-mono-vietnamese-400-normal-DDuiU_S-.woff +0 -0
  210. package/dist/ui/assets/ibm-plex-mono-vietnamese-500-normal-C8zxqsMH.woff +0 -0
  211. package/dist/ui/assets/ibm-plex-mono-vietnamese-500-normal-DZ4AoWbu.woff2 +0 -0
  212. package/dist/ui/assets/ibm-plex-sans-cyrillic-400-normal-BTotfTJu.woff +0 -0
  213. package/dist/ui/assets/ibm-plex-sans-cyrillic-400-normal-DZqxrq2p.woff2 +0 -0
  214. package/dist/ui/assets/ibm-plex-sans-cyrillic-500-normal-ByOcLdNv.woff +0 -0
  215. package/dist/ui/assets/ibm-plex-sans-cyrillic-500-normal-CocWQlwt.woff2 +0 -0
  216. package/dist/ui/assets/ibm-plex-sans-cyrillic-600-normal-71GNu3SW.woff2 +0 -0
  217. package/dist/ui/assets/ibm-plex-sans-cyrillic-600-normal-BGq0mW3O.woff +0 -0
  218. package/dist/ui/assets/ibm-plex-sans-cyrillic-ext-400-normal-Dsrv2Tcn.woff +0 -0
  219. package/dist/ui/assets/ibm-plex-sans-cyrillic-ext-400-normal-g30qAdWV.woff2 +0 -0
  220. package/dist/ui/assets/ibm-plex-sans-cyrillic-ext-500-normal-Cs5J6C77.woff2 +0 -0
  221. package/dist/ui/assets/ibm-plex-sans-cyrillic-ext-500-normal-DB5PtV2g.woff +0 -0
  222. package/dist/ui/assets/ibm-plex-sans-cyrillic-ext-600-normal-Bz0x94Yp.woff +0 -0
  223. package/dist/ui/assets/ibm-plex-sans-cyrillic-ext-600-normal-DUMzJB7m.woff2 +0 -0
  224. package/dist/ui/assets/ibm-plex-sans-greek-400-normal-D9ESIMu3.woff +0 -0
  225. package/dist/ui/assets/ibm-plex-sans-greek-400-normal-_efipK4i.woff2 +0 -0
  226. package/dist/ui/assets/ibm-plex-sans-greek-500-normal-CuWXN6rf.woff +0 -0
  227. package/dist/ui/assets/ibm-plex-sans-greek-500-normal-JMMifIXV.woff2 +0 -0
  228. package/dist/ui/assets/ibm-plex-sans-greek-600-normal-D-CqTdkO.woff +0 -0
  229. package/dist/ui/assets/ibm-plex-sans-greek-600-normal-DzTrcv_p.woff2 +0 -0
  230. package/dist/ui/assets/ibm-plex-sans-latin-400-normal-CDDApCn2.woff2 +0 -0
  231. package/dist/ui/assets/ibm-plex-sans-latin-400-normal-CYLoc0-x.woff +0 -0
  232. package/dist/ui/assets/ibm-plex-sans-latin-500-normal-6ng42L7E.woff2 +0 -0
  233. package/dist/ui/assets/ibm-plex-sans-latin-500-normal-BgVn5rGT.woff +0 -0
  234. package/dist/ui/assets/ibm-plex-sans-latin-600-normal-Cu4Hd6ag.woff +0 -0
  235. package/dist/ui/assets/ibm-plex-sans-latin-600-normal-CuJfVYMP.woff2 +0 -0
  236. package/dist/ui/assets/ibm-plex-sans-latin-ext-400-normal-C5H60-Va.woff2 +0 -0
  237. package/dist/ui/assets/ibm-plex-sans-latin-ext-400-normal-RBey6euL.woff +0 -0
  238. package/dist/ui/assets/ibm-plex-sans-latin-ext-500-normal-D0aIdm-b.woff +0 -0
  239. package/dist/ui/assets/ibm-plex-sans-latin-ext-500-normal-DakdToA3.woff2 +0 -0
  240. package/dist/ui/assets/ibm-plex-sans-latin-ext-600-normal-DIrixKbi.woff +0 -0
  241. package/dist/ui/assets/ibm-plex-sans-latin-ext-600-normal-DOrvGEcy.woff2 +0 -0
  242. package/dist/ui/assets/ibm-plex-sans-vietnamese-400-normal-DG4YqDda.woff2 +0 -0
  243. package/dist/ui/assets/ibm-plex-sans-vietnamese-400-normal-fK1oJ5dG.woff +0 -0
  244. package/dist/ui/assets/ibm-plex-sans-vietnamese-500-normal-BEb3_waV.woff +0 -0
  245. package/dist/ui/assets/ibm-plex-sans-vietnamese-500-normal-e4dixQRQ.woff2 +0 -0
  246. package/dist/ui/assets/ibm-plex-sans-vietnamese-600-normal-DgdngZtN.woff +0 -0
  247. package/dist/ui/assets/ibm-plex-sans-vietnamese-600-normal-DpPYBSTl.woff2 +0 -0
  248. package/dist/ui/assets/imba-DGztddWO.js +1 -0
  249. package/dist/ui/assets/index-BCZwzr3E.js +1585 -0
  250. package/dist/ui/assets/index-DsGDgUsX.css +1 -0
  251. package/dist/ui/assets/ini-BEwlwnbL.js +1 -0
  252. package/dist/ui/assets/java-CylS5w8V.js +1 -0
  253. package/dist/ui/assets/javascript-wDzz0qaB.js +1 -0
  254. package/dist/ui/assets/jinja-f2NsQr07.js +1 -0
  255. package/dist/ui/assets/jison-wvAkD_A8.js +1 -0
  256. package/dist/ui/assets/json-Cp-IABpG.js +1 -0
  257. package/dist/ui/assets/json5-C9tS-k6U.js +1 -0
  258. package/dist/ui/assets/jsonc-Des-eS-w.js +1 -0
  259. package/dist/ui/assets/jsonl-DcaNXYhu.js +1 -0
  260. package/dist/ui/assets/jsonnet-DFQXde-d.js +1 -0
  261. package/dist/ui/assets/jssm-C2t-YnRu.js +1 -0
  262. package/dist/ui/assets/jsx-g9-lgVsj.js +1 -0
  263. package/dist/ui/assets/julia-5Bft2YPA.js +1 -0
  264. package/dist/ui/assets/just-Cwhn7H3k.js +1 -0
  265. package/dist/ui/assets/kanagawa-dragon-BuwD2xS4.js +1 -0
  266. package/dist/ui/assets/kanagawa-lotus-C3DzagqV.js +1 -0
  267. package/dist/ui/assets/kanagawa-wave-DFGoQZhC.js +1 -0
  268. package/dist/ui/assets/kdl-DV7GczEv.js +1 -0
  269. package/dist/ui/assets/kotlin-BdnUsdx6.js +1 -0
  270. package/dist/ui/assets/kusto-wEQ09or8.js +1 -0
  271. package/dist/ui/assets/laserwave-DUszq2jm.js +1 -0
  272. package/dist/ui/assets/latex-D5pSuvFb.js +1 -0
  273. package/dist/ui/assets/lean-BZvkOJ9d.js +1 -0
  274. package/dist/ui/assets/less-B1dDrJ26.js +1 -0
  275. package/dist/ui/assets/light-plus-B7mTdjB0.js +1 -0
  276. package/dist/ui/assets/liquid-C0sCDyMI.js +1 -0
  277. package/dist/ui/assets/llvm-BZoOZj88.js +1 -0
  278. package/dist/ui/assets/log-2UxHyX5q.js +1 -0
  279. package/dist/ui/assets/logo-BtOb2qkB.js +1 -0
  280. package/dist/ui/assets/lua-BaeVxFsk.js +1 -0
  281. package/dist/ui/assets/luau-BnpPk5vE.js +1 -0
  282. package/dist/ui/assets/make-CHLpvVh8.js +1 -0
  283. package/dist/ui/assets/markdown-Cvjx9yec.js +1 -0
  284. package/dist/ui/assets/marko-DjSrsDqO.js +1 -0
  285. package/dist/ui/assets/material-theme-D5KoaKCx.js +1 -0
  286. package/dist/ui/assets/material-theme-darker-BfHTSMKl.js +1 -0
  287. package/dist/ui/assets/material-theme-lighter-B0m2ddpp.js +1 -0
  288. package/dist/ui/assets/material-theme-ocean-CyktbL80.js +1 -0
  289. package/dist/ui/assets/material-theme-palenight-Csfq5Kiy.js +1 -0
  290. package/dist/ui/assets/matlab-D7o27uSR.js +1 -0
  291. package/dist/ui/assets/mdc-D1_yUvq7.js +1 -0
  292. package/dist/ui/assets/mdx-Cmh6b_Ma.js +1 -0
  293. package/dist/ui/assets/mermaid-CQcHuHx7.js +1 -0
  294. package/dist/ui/assets/min-dark-CafNBF8u.js +1 -0
  295. package/dist/ui/assets/min-light-CTRr51gU.js +1 -0
  296. package/dist/ui/assets/mipsasm-CKIfxQSi.js +1 -0
  297. package/dist/ui/assets/mojo-DJz3ZmWd.js +1 -0
  298. package/dist/ui/assets/monokai-BRVnQi9A.js +1 -0
  299. package/dist/ui/assets/moonbit-CHtswR0a.js +1 -0
  300. package/dist/ui/assets/move-el3G9tDJ.js +1 -0
  301. package/dist/ui/assets/narrat-DRg8JJMk.js +1 -0
  302. package/dist/ui/assets/nextflow-C-mBbutL.js +1 -0
  303. package/dist/ui/assets/nextflow-groovy-vE_lwT2v.js +1 -0
  304. package/dist/ui/assets/nginx-BpAMiNFr.js +1 -0
  305. package/dist/ui/assets/night-owl-C39BiMTA.js +1 -0
  306. package/dist/ui/assets/night-owl-light-CMTm3GFP.js +1 -0
  307. package/dist/ui/assets/nim-BIad80T-.js +1 -0
  308. package/dist/ui/assets/nix-CwoSXNpI.js +1 -0
  309. package/dist/ui/assets/nord-Ddv68eIx.js +1 -0
  310. package/dist/ui/assets/nsis-BlV79W_Q.js +1 -0
  311. package/dist/ui/assets/nushell-D3jzshHO.js +1 -0
  312. package/dist/ui/assets/objective-c-DXmwc3jG.js +1 -0
  313. package/dist/ui/assets/objective-cpp-CLxacb5B.js +1 -0
  314. package/dist/ui/assets/ocaml-C0hk2d4L.js +1 -0
  315. package/dist/ui/assets/odin-BBf5iR-q.js +1 -0
  316. package/dist/ui/assets/one-dark-pro-DVMEJ2y_.js +1 -0
  317. package/dist/ui/assets/one-light-C3Wv6jpd.js +1 -0
  318. package/dist/ui/assets/openscad-C4EeE6gA.js +1 -0
  319. package/dist/ui/assets/org-DM6o9KBp.js +1 -0
  320. package/dist/ui/assets/pascal-D93ZcfNL.js +1 -0
  321. package/dist/ui/assets/perl-B9cMNwum.js +1 -0
  322. package/dist/ui/assets/php-Csjmro_R.js +1 -0
  323. package/dist/ui/assets/pierre-dark-CyvmCCZW.js +1 -0
  324. package/dist/ui/assets/pierre-dark-protanopia-deuteranopia-Rgc0TwpF.js +1 -0
  325. package/dist/ui/assets/pierre-dark-soft-BHGpRqa4.js +1 -0
  326. package/dist/ui/assets/pierre-dark-tritanopia-Beq2gCRQ.js +1 -0
  327. package/dist/ui/assets/pierre-dark-vibrant-BWBVywrn.js +1 -0
  328. package/dist/ui/assets/pierre-light-480U9XYS.js +1 -0
  329. package/dist/ui/assets/pierre-light-protanopia-deuteranopia-CaVOBURG.js +1 -0
  330. package/dist/ui/assets/pierre-light-soft-CVdyfjmI.js +1 -0
  331. package/dist/ui/assets/pierre-light-tritanopia-B4_gpKOM.js +1 -0
  332. package/dist/ui/assets/pierre-light-vibrant-DdTDNdfJ.js +1 -0
  333. package/dist/ui/assets/pkl-u5AG7uiY.js +1 -0
  334. package/dist/ui/assets/plastic-3e1v2bzS.js +1 -0
  335. package/dist/ui/assets/plsql-ChMvpjG-.js +1 -0
  336. package/dist/ui/assets/po-BTJTHyun.js +1 -0
  337. package/dist/ui/assets/poimandres-CS3Unz2-.js +1 -0
  338. package/dist/ui/assets/polar-C0HS_06l.js +1 -0
  339. package/dist/ui/assets/postcss-CXtECtnM.js +1 -0
  340. package/dist/ui/assets/powerquery-CEu0bR-o.js +1 -0
  341. package/dist/ui/assets/powershell-BmBUJMz7.js +1 -0
  342. package/dist/ui/assets/prisma-Vru482bI.js +1 -0
  343. package/dist/ui/assets/prolog-CbFg5uaA.js +1 -0
  344. package/dist/ui/assets/proto-C7zT0LnQ.js +1 -0
  345. package/dist/ui/assets/pug-DKIMFp6K.js +1 -0
  346. package/dist/ui/assets/puppet-BMWR74SV.js +1 -0
  347. package/dist/ui/assets/purescript-CklMAg4u.js +1 -0
  348. package/dist/ui/assets/python-B6aJPvgy.js +1 -0
  349. package/dist/ui/assets/qml-3beO22l8.js +1 -0
  350. package/dist/ui/assets/qmldir-C8lEn-DE.js +1 -0
  351. package/dist/ui/assets/qss-IeuSbFQv.js +1 -0
  352. package/dist/ui/assets/r-Cf5RLm7j.js +1 -0
  353. package/dist/ui/assets/racket-BqYA7rlc.js +1 -0
  354. package/dist/ui/assets/raku-DXvB9xmW.js +1 -0
  355. package/dist/ui/assets/razor-BjBPvh-w.js +1 -0
  356. package/dist/ui/assets/rbs-CpoqiR4B.js +1 -0
  357. package/dist/ui/assets/red-hvxz__6c.js +1 -0
  358. package/dist/ui/assets/reg-C-SQnVFl.js +1 -0
  359. package/dist/ui/assets/regexp-CDVJQ6XC.js +1 -0
  360. package/dist/ui/assets/rel-C3B-1QV4.js +1 -0
  361. package/dist/ui/assets/riscv-BM1_JUlF.js +1 -0
  362. package/dist/ui/assets/ron-D8l8udqQ.js +1 -0
  363. package/dist/ui/assets/rose-pine-5qJOZa0Y.js +1 -0
  364. package/dist/ui/assets/rose-pine-dawn-zx0QlTCp.js +1 -0
  365. package/dist/ui/assets/rose-pine-moon-C9pEdX9L.js +1 -0
  366. package/dist/ui/assets/rosmsg-BJDFO7_C.js +1 -0
  367. package/dist/ui/assets/rst-bs7f0vWN.js +1 -0
  368. package/dist/ui/assets/ruby-C0TQ7zu5.js +1 -0
  369. package/dist/ui/assets/rust-B1yitclQ.js +1 -0
  370. package/dist/ui/assets/sas-DEy46yEz.js +1 -0
  371. package/dist/ui/assets/sass-Cj5Yp3dK.js +1 -0
  372. package/dist/ui/assets/scala-CqE71os6.js +1 -0
  373. package/dist/ui/assets/scheme-C98Dy4si.js +1 -0
  374. package/dist/ui/assets/scss-D5BDwBP9.js +1 -0
  375. package/dist/ui/assets/sdbl-DVxCFoDh.js +1 -0
  376. package/dist/ui/assets/shaderlab-Dg9Lc6iA.js +1 -0
  377. package/dist/ui/assets/shellscript-Yzrsuije.js +1 -0
  378. package/dist/ui/assets/shellsession-BADoaaVG.js +1 -0
  379. package/dist/ui/assets/slack-dark-BthQWCQV.js +1 -0
  380. package/dist/ui/assets/slack-ochin-DqwNpetd.js +1 -0
  381. package/dist/ui/assets/smalltalk-BOQMe2GC.js +1 -0
  382. package/dist/ui/assets/smithy-cds9vsN8.js +1 -0
  383. package/dist/ui/assets/snazzy-light-Bw305WKR.js +1 -0
  384. package/dist/ui/assets/solarized-dark-CpvCGNkr.js +1 -0
  385. package/dist/ui/assets/solarized-light-Dlz6yCKv.js +1 -0
  386. package/dist/ui/assets/solidity-DijEV5ha.js +1 -0
  387. package/dist/ui/assets/source-serif-4-cyrillic-400-normal-B8Z6Jvzv.woff +0 -0
  388. package/dist/ui/assets/source-serif-4-cyrillic-400-normal-C44pakCn.woff2 +0 -0
  389. package/dist/ui/assets/source-serif-4-cyrillic-600-normal-BDP5YDHD.woff2 +0 -0
  390. package/dist/ui/assets/source-serif-4-cyrillic-600-normal-DFnC3vAY.woff +0 -0
  391. package/dist/ui/assets/source-serif-4-cyrillic-ext-400-normal-CWV284fw.woff2 +0 -0
  392. package/dist/ui/assets/source-serif-4-cyrillic-ext-400-normal-DLkyKLvH.woff +0 -0
  393. package/dist/ui/assets/source-serif-4-cyrillic-ext-600-normal-D_E8FDgP.woff2 +0 -0
  394. package/dist/ui/assets/source-serif-4-cyrillic-ext-600-normal-DiT2IGQm.woff +0 -0
  395. package/dist/ui/assets/source-serif-4-greek-400-normal-BccYJ-vZ.woff +0 -0
  396. package/dist/ui/assets/source-serif-4-greek-400-normal-Cw5-AHNN.woff2 +0 -0
  397. package/dist/ui/assets/source-serif-4-greek-600-normal-DdRkKr-1.woff2 +0 -0
  398. package/dist/ui/assets/source-serif-4-greek-600-normal-DhXQw1Kl.woff +0 -0
  399. package/dist/ui/assets/source-serif-4-latin-400-normal-DJ5YJwmz.woff2 +0 -0
  400. package/dist/ui/assets/source-serif-4-latin-400-normal-Dn3IlU-Z.woff +0 -0
  401. package/dist/ui/assets/source-serif-4-latin-600-normal-DMD1h6_f.woff +0 -0
  402. package/dist/ui/assets/source-serif-4-latin-600-normal-DouSKlru.woff2 +0 -0
  403. package/dist/ui/assets/source-serif-4-latin-ext-400-normal-CEpydyUl.woff +0 -0
  404. package/dist/ui/assets/source-serif-4-latin-ext-400-normal-Cp7z-ARB.woff2 +0 -0
  405. package/dist/ui/assets/source-serif-4-latin-ext-600-normal-0sIUyHMO.woff2 +0 -0
  406. package/dist/ui/assets/source-serif-4-latin-ext-600-normal-C6NNqpJh.woff +0 -0
  407. package/dist/ui/assets/source-serif-4-vietnamese-400-normal-BbG3LG1A.woff2 +0 -0
  408. package/dist/ui/assets/source-serif-4-vietnamese-400-normal-DR1UuFon.woff +0 -0
  409. package/dist/ui/assets/source-serif-4-vietnamese-600-normal-B0WJbuqT.woff +0 -0
  410. package/dist/ui/assets/source-serif-4-vietnamese-600-normal-CznyfUKR.woff2 +0 -0
  411. package/dist/ui/assets/soy-8wufbnw4.js +1 -0
  412. package/dist/ui/assets/sparql-rVzFXLq3.js +1 -0
  413. package/dist/ui/assets/splunk-BtCnVYZw.js +1 -0
  414. package/dist/ui/assets/sql-CRqJ_cUM.js +1 -0
  415. package/dist/ui/assets/ssh-config-_ykCGR6B.js +1 -0
  416. package/dist/ui/assets/stata-DI20mbqo.js +1 -0
  417. package/dist/ui/assets/stylus-BEDo0Tqx.js +1 -0
  418. package/dist/ui/assets/surrealql-Cjom0U5J.js +1 -0
  419. package/dist/ui/assets/svelte-Cy7k_4gC.js +1 -0
  420. package/dist/ui/assets/swift-C2oV4EkX.js +1 -0
  421. package/dist/ui/assets/synthwave-84-CbfX1IO0.js +1 -0
  422. package/dist/ui/assets/system-verilog-0hqHdDBg.js +1 -0
  423. package/dist/ui/assets/systemd-4A_iFExJ.js +1 -0
  424. package/dist/ui/assets/talonscript-CkByrt1z.js +1 -0
  425. package/dist/ui/assets/tasl-QIJgUcNo.js +1 -0
  426. package/dist/ui/assets/tcl-dwOrl1Do.js +1 -0
  427. package/dist/ui/assets/templ-DhtptRzy.js +1 -0
  428. package/dist/ui/assets/terraform-BETggiCN.js +1 -0
  429. package/dist/ui/assets/tex-D96PA37w.js +1 -0
  430. package/dist/ui/assets/tokyo-night-hegEt444.js +1 -0
  431. package/dist/ui/assets/toml-vGWfd6FD.js +1 -0
  432. package/dist/ui/assets/ts-tags-D351s5mN.js +1 -0
  433. package/dist/ui/assets/tsv-B_m7g4N7.js +1 -0
  434. package/dist/ui/assets/tsx-COt5Ahok.js +1 -0
  435. package/dist/ui/assets/turtle-BsS91CYL.js +1 -0
  436. package/dist/ui/assets/twig-27uCiNez.js +1 -0
  437. package/dist/ui/assets/typescript-BPQ3VLAy.js +1 -0
  438. package/dist/ui/assets/typespec-CAFt9gP4.js +1 -0
  439. package/dist/ui/assets/typst-BUadGCkm.js +1 -0
  440. package/dist/ui/assets/v-BGw2Nkan.js +1 -0
  441. package/dist/ui/assets/vala-CsfeWuGM.js +1 -0
  442. package/dist/ui/assets/vb-Cu-pLBUe.js +1 -0
  443. package/dist/ui/assets/verilog-nZwndyjY.js +1 -0
  444. package/dist/ui/assets/vesper-DRje8inN.js +1 -0
  445. package/dist/ui/assets/vhdl-CeAyd5Ju.js +1 -0
  446. package/dist/ui/assets/viml-CJc9bBzg.js +1 -0
  447. package/dist/ui/assets/vitesse-black-Bkuqu6BP.js +1 -0
  448. package/dist/ui/assets/vitesse-dark-D0r3Knsf.js +1 -0
  449. package/dist/ui/assets/vitesse-light-CVO1_9PV.js +1 -0
  450. package/dist/ui/assets/vue-BqiEGhQt.js +1 -0
  451. package/dist/ui/assets/vue-html-AaS7Mt5G.js +1 -0
  452. package/dist/ui/assets/vue-vine-BoDAl6tE.js +1 -0
  453. package/dist/ui/assets/vyper-CDx5xZoG.js +1 -0
  454. package/dist/ui/assets/wasm-CG6Dc4jp.js +1 -0
  455. package/dist/ui/assets/wasm-MzD3tlZU.js +1 -0
  456. package/dist/ui/assets/wenyan-BV7otONQ.js +1 -0
  457. package/dist/ui/assets/wgsl-Dx-B1_4e.js +1 -0
  458. package/dist/ui/assets/wikitext-BhOHFoWU.js +1 -0
  459. package/dist/ui/assets/wit-5i3qLPDT.js +1 -0
  460. package/dist/ui/assets/wolfram-lXgVvXCa.js +1 -0
  461. package/dist/ui/assets/worker-DsKBD11i.js +156 -0
  462. package/dist/ui/assets/xml-sdJ4AIDG.js +1 -0
  463. package/dist/ui/assets/xsl-CtQFsRM5.js +1 -0
  464. package/dist/ui/assets/yaml-Buea-lGh.js +1 -0
  465. package/dist/ui/assets/zenscript-DVFEvuxE.js +1 -0
  466. package/dist/ui/assets/zig-VOosw3JB.js +1 -0
  467. package/dist/ui/index.html +13 -0
  468. package/package.json +74 -0
  469. package/skills/comprehende/SKILL.md +68 -0
  470. package/skills/comprehende/references/example.md +55 -0
  471. package/skills/comprehende/references/review.schema.json +92 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Máté Molnár
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,94 @@
1
+ # Comprehende
2
+
3
+ Local review assistant for git diffs. Groups changes by review concern and shows them in a fixed UI. Diffs always come from git in the repo you run the CLI in — never from the model, never stored in the review document. The review UI paints `git diff` output with [`@pierre/diffs`](https://diffs.com), the same renderer [T3 Code](https://github.com/pingdotgg/t3code) uses. Full file and blame views use Pierre’s file renderer from `git show` / `git blame`.
4
+
5
+ Product intent: [AGENTS.md](./AGENTS.md). Implementation plan: [PLAN.md](./PLAN.md).
6
+
7
+ ## Install
8
+
9
+ Node.js 24+. Run the CLI **inside** the repository you want to review. There is no `--repo` flag.
10
+
11
+ ```sh
12
+ npx comprehende@0.1.0 index --base origin/main
13
+ npx comprehende@0.1.0 validate --data review.json
14
+ npx comprehende@0.1.0 serve --data review.json --open
15
+ ```
16
+
17
+ Pin the version. After a release, that version is on npm.
18
+
19
+ ## Review a clone
20
+
21
+ ```sh
22
+ git clone <url>
23
+ cd <repo>
24
+
25
+ npx comprehende@0.1.0 index --base origin/main
26
+ # write review.json from those hunk refs (the skill does this)
27
+
28
+ npx comprehende@0.1.0 validate --data review.json
29
+ npx comprehende@0.1.0 serve --data review.json --open
30
+ ```
31
+
32
+ Three-dot range (`base...head`) is the merge-request / branch diff. `--base` defaults to `origin/HEAD` (or `main`/`master`). `--head` defaults to `HEAD`. `serve` binds `127.0.0.1` only and re-reads git on every request.
33
+
34
+ ## Install the skill
35
+
36
+ From this checkout:
37
+
38
+ ```sh
39
+ npx skills add ./ --skill comprehende
40
+ ```
41
+
42
+ Once the package is on npm:
43
+
44
+ ```sh
45
+ npx skills add matemolnar8/comprehende
46
+ ```
47
+
48
+ The skill is the agent workflow: `index` → read the git diffs → write `review.json` (refs + summaries only) → `validate` → `serve`. Edit `src/schema/review.schema.json` and run `pnpm sync:skill` so the copy in the skill folder stays identical.
49
+
50
+ ## Commands
51
+
52
+ ```
53
+ comprehende index [--base <ref>] [--head <ref>]
54
+ comprehende validate --data <review.json>
55
+ comprehende serve --data <review.json> [--port] [--open]
56
+ ```
57
+
58
+ Defaults: `--head HEAD`, `--base` is `origin/HEAD` (or `main`/`master`).
59
+
60
+ ## Develop
61
+
62
+ [pnpm](https://pnpm.io/).
63
+
64
+ ```sh
65
+ pnpm install
66
+ pnpm test
67
+ pnpm typecheck
68
+ pnpm build
69
+ pnpm pack:smoke
70
+ pnpm sync:skill
71
+ pnpm dev -- --help
72
+ ```
73
+
74
+ `pnpm build` emits `dist/cli` and `dist/ui`. `prepack` runs that build, so `pnpm pack` / `pnpm publish` always ship the UI.
75
+
76
+ `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.1.0` (or `node /path/to/comprehende/dist/cli/main.js` after `pnpm build`).
77
+
78
+ ## Release
79
+
80
+ Bump `version` in `package.json` when the CLI or UI changes. Do not bump it for skill-only edits.
81
+
82
+ Push to `main`. CI packs and tests the tarball on every change. If the version is not on npm yet, CI publishes it. Skill-only commits keep the same version, so they do not publish.
83
+
84
+ The first publish is manual (`pnpm publish --access public`) so you can claim the name. After that, add a GitHub Actions trusted publisher on npmjs.com for workflow `ci.yml`.
85
+
86
+ ## Fixture
87
+
88
+ ```sh
89
+ pnpm fixture
90
+ cd fixtures/repo
91
+ node ../../dist/cli/main.js serve --data ../example/review.json
92
+ ```
93
+
94
+ `pnpm fixture` writes a tiny git repo to `fixtures/repo` (gitignored) and a refs-only `fixtures/example/review.json`. Serve with cwd set to `fixtures/repo`.
@@ -0,0 +1,20 @@
1
+ export type CommandName = "index" | "validate" | "serve";
2
+ export type CliRequest = {
3
+ kind: "help";
4
+ } | {
5
+ kind: "version";
6
+ } | {
7
+ kind: "error";
8
+ message: string;
9
+ } | {
10
+ kind: "command";
11
+ command: CommandName;
12
+ cwd: string;
13
+ base?: string;
14
+ head?: string;
15
+ data?: string;
16
+ port: number;
17
+ open: boolean;
18
+ };
19
+ export declare const USAGE = "Usage: comprehende <command> [options]\n\nRun inside the git repository under review. Cwd is the repo.\n\nCommands:\n index [--base <ref>] [--head <ref>]\n List hunk refs from live git (no patch text)\n\n validate --data <review.json>\n Check schema, ref resolution, and hunk coverage\n\n serve --data <review.json> [--port <n>] [--open]\n Serve the local UI on 127.0.0.1 (re-reads git on each request)\n\nOptions:\n --base <ref> Base ref (default: origin/HEAD or main/master)\n --head <ref> Head ref (default: HEAD)\n --data <path> Review document path\n --port <n> Listen port (default: 4567, 0 for ephemeral)\n --open Open the UI in a browser\n -h, --help Show this help\n -v, --version Show version\n\nDiffs always come from git in cwd. The review document is interpretation only.\n";
20
+ export declare function parseArgv(argv: string[], cwd?: string): CliRequest;
@@ -0,0 +1,89 @@
1
+ const COMMANDS = new Set(["index", "validate", "serve"]);
2
+ export const USAGE = `Usage: comprehende <command> [options]
3
+
4
+ Run inside the git repository under review. Cwd is the repo.
5
+
6
+ Commands:
7
+ index [--base <ref>] [--head <ref>]
8
+ List hunk refs from live git (no patch text)
9
+
10
+ validate --data <review.json>
11
+ Check schema, ref resolution, and hunk coverage
12
+
13
+ serve --data <review.json> [--port <n>] [--open]
14
+ Serve the local UI on 127.0.0.1 (re-reads git on each request)
15
+
16
+ Options:
17
+ --base <ref> Base ref (default: origin/HEAD or main/master)
18
+ --head <ref> Head ref (default: HEAD)
19
+ --data <path> Review document path
20
+ --port <n> Listen port (default: 4567, 0 for ephemeral)
21
+ --open Open the UI in a browser
22
+ -h, --help Show this help
23
+ -v, --version Show version
24
+
25
+ Diffs always come from git in cwd. The review document is interpretation only.
26
+ `;
27
+ export function parseArgv(argv, cwd = process.cwd()) {
28
+ const args = argv[0] === "--" ? argv.slice(1) : [...argv];
29
+ if (args.length === 0 || args.includes("-h") || args.includes("--help")) {
30
+ return { kind: "help" };
31
+ }
32
+ if (args.includes("-v") || args.includes("--version")) {
33
+ return { kind: "version" };
34
+ }
35
+ const command = args[0];
36
+ if (command === undefined) {
37
+ return { kind: "help" };
38
+ }
39
+ if (!isCommand(command)) {
40
+ return { kind: "error", message: `Unknown command: ${command}\n\n${USAGE}` };
41
+ }
42
+ const rest = args.slice(1);
43
+ try {
44
+ const port = Number(flag(rest, "--port") ?? "4567");
45
+ if (!Number.isInteger(port) || port < 0) {
46
+ throw new Error("--port must be a non-negative integer");
47
+ }
48
+ return {
49
+ kind: "command",
50
+ command,
51
+ cwd,
52
+ base: flag(rest, "--base"),
53
+ head: flag(rest, "--head"),
54
+ data: flag(rest, "--data"),
55
+ port,
56
+ open: rest.includes("--open"),
57
+ };
58
+ }
59
+ catch (error) {
60
+ return { kind: "error", message: error instanceof Error ? error.message : String(error) };
61
+ }
62
+ }
63
+ function isCommand(value) {
64
+ return COMMANDS.has(value);
65
+ }
66
+ function flag(args, name) {
67
+ const prefix = `${name}=`;
68
+ for (let i = 0; i < args.length; i += 1) {
69
+ const arg = args[i];
70
+ if (arg === undefined) {
71
+ continue;
72
+ }
73
+ if (arg === name) {
74
+ const value = args[i + 1];
75
+ if (value === undefined || value.startsWith("-")) {
76
+ throw new Error(`${name} requires a value`);
77
+ }
78
+ return value;
79
+ }
80
+ if (arg.startsWith(prefix)) {
81
+ const value = arg.slice(prefix.length);
82
+ if (value === "") {
83
+ throw new Error(`${name} requires a value`);
84
+ }
85
+ return value;
86
+ }
87
+ }
88
+ return undefined;
89
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"args.js","sourceRoot":"","sources":["../../src/cli/args.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { HunkIndex, ReviewDocument } from "../schema/types.ts";
2
+ export declare function resolveRange(cwd: string, base: string | undefined, head: string | undefined): Promise<{
3
+ baseRef: string;
4
+ headRef: string;
5
+ }>;
6
+ export declare function cmdIndex(cwd: string, base: string | undefined, head: string | undefined): Promise<HunkIndex>;
7
+ export declare function loadDocument(dataPath: string): Promise<ReviewDocument>;
8
+ export declare function resolveDataPath(data: string | undefined, cwd: string): string;
9
+ export declare function cmdValidate(cwd: string, dataPath: string): Promise<{
10
+ document: ReviewDocument;
11
+ warnings: string[];
12
+ }>;
@@ -0,0 +1,40 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { isAbsolute, resolve } from "node:path";
3
+ import { readHunkIndex, resolveSource } from "../git/diff.js";
4
+ import { defaultBaseRef } from "../git/repo.js";
5
+ import { coverReview, coverageErrors } from "../review/coverage.js";
6
+ import { parseReviewJson } from "../schema/parse.js";
7
+ export async function resolveRange(cwd, base, head) {
8
+ const baseRef = base ?? (await defaultBaseRef(cwd));
9
+ const headRef = head ?? "HEAD";
10
+ await resolveSource(cwd, baseRef, headRef);
11
+ return { baseRef, headRef };
12
+ }
13
+ export async function cmdIndex(cwd, base, head) {
14
+ const range = await resolveRange(cwd, base, head);
15
+ return readHunkIndex(cwd, range.baseRef, range.headRef);
16
+ }
17
+ export async function loadDocument(dataPath) {
18
+ const text = await readFile(dataPath, "utf8");
19
+ const parsed = parseReviewJson(text);
20
+ if (!parsed.ok) {
21
+ throw new Error(`invalid review document:\n${parsed.errors.map((error) => ` - ${error}`).join("\n")}`);
22
+ }
23
+ return parsed.document;
24
+ }
25
+ export function resolveDataPath(data, cwd) {
26
+ if (data === undefined) {
27
+ throw new Error("missing --data <review.json>");
28
+ }
29
+ return isAbsolute(data) ? data : resolve(cwd, data);
30
+ }
31
+ export async function cmdValidate(cwd, dataPath) {
32
+ const document = await loadDocument(dataPath);
33
+ await resolveSource(cwd, document.source.baseRef, document.source.headRef);
34
+ const { coverage } = await coverReview(cwd, document);
35
+ const errors = coverageErrors(coverage);
36
+ if (errors.length > 0) {
37
+ throw new Error(errors.join("\n\n"));
38
+ }
39
+ return { document, warnings: [] };
40
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/cli/commands.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAGrD,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,GAAW,EACX,IAAwB,EACxB,IAAwB;IAExB,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,MAAM,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC;IACpD,MAAM,OAAO,GAAG,IAAI,IAAI,MAAM,CAAC;IAC/B,MAAM,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC3C,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AAC9B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,GAAW,EAAE,IAAwB,EAAE,IAAwB;IAC5F,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAClD,OAAO,aAAa,CAAC,GAAG,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,QAAgB;IACjD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,6BAA6B,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1G,CAAC;IACD,OAAO,MAAM,CAAC,QAAQ,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAwB,EAAE,GAAW;IACnE,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAClD,CAAC;IACD,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,GAAW,EAAE,QAAgB;IAC7D,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,QAAQ,CAAC,CAAC;IAC9C,MAAM,aAAa,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC3E,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,WAAW,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACtD,MAAM,MAAM,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IACxC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IACvC,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;AACpC,CAAC"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export declare function run(argv: string[]): Promise<number>;
@@ -0,0 +1,102 @@
1
+ #!/usr/bin/env node
2
+ import { spawn } from "node:child_process";
3
+ import { realpathSync } from "node:fs";
4
+ import { resolve } from "node:path";
5
+ import { fileURLToPath } from "node:url";
6
+ import { parseArgv, USAGE } from "./args.js";
7
+ import { cmdIndex, cmdValidate, loadDocument, resolveDataPath } from "./commands.js";
8
+ import { resolveSource } from "../git/diff.js";
9
+ import { coverReview, coverageErrors } from "../review/coverage.js";
10
+ import { assertWorkTree } from "../git/repo.js";
11
+ import { readPackageVersion } from "../package-root.js";
12
+ import { startServer } from "../server/http.js";
13
+ export async function run(argv) {
14
+ const request = parseArgv(argv);
15
+ if (request.kind === "help") {
16
+ console.log(USAGE);
17
+ return 0;
18
+ }
19
+ if (request.kind === "version") {
20
+ console.log(readPackageVersion());
21
+ return 0;
22
+ }
23
+ if (request.kind === "error") {
24
+ console.error(request.message);
25
+ return 1;
26
+ }
27
+ try {
28
+ await assertWorkTree(request.cwd);
29
+ switch (request.command) {
30
+ case "index": {
31
+ const index = await cmdIndex(request.cwd, request.base, request.head);
32
+ console.log(JSON.stringify(index, null, 2));
33
+ return 0;
34
+ }
35
+ case "validate": {
36
+ const dataPath = resolveDataPath(request.data, request.cwd);
37
+ const { document } = await cmdValidate(request.cwd, dataPath);
38
+ const hunks = document.groups.reduce((sum, group) => sum + group.hunkRefs.length, 0);
39
+ console.log(`ok ${document.groups.length} groups ${hunks} hunk refs ${dataPath}`);
40
+ return 0;
41
+ }
42
+ case "serve": {
43
+ const dataPath = resolveDataPath(request.data, request.cwd);
44
+ const document = await loadDocument(dataPath);
45
+ await resolveSource(request.cwd, document.source.baseRef, document.source.headRef);
46
+ const { coverage } = await coverReview(request.cwd, document);
47
+ const problems = coverageErrors(coverage);
48
+ if (problems.length > 0) {
49
+ console.error(`coverage issues (serve continues; git wins, unassigned/stale are visible):\n${problems.join("\n\n")}`);
50
+ }
51
+ const running = await startServer({ cwd: request.cwd, dataPath, port: request.port });
52
+ console.log(running.url);
53
+ console.error(`serving ${dataPath} cwd=${request.cwd} localhost only`);
54
+ if (request.open) {
55
+ openUrl(running.url);
56
+ }
57
+ await waitForClose(running.server);
58
+ return 0;
59
+ }
60
+ }
61
+ }
62
+ catch (error) {
63
+ console.error(error instanceof Error ? error.message : String(error));
64
+ return 1;
65
+ }
66
+ }
67
+ function waitForClose(server) {
68
+ return new Promise((resolve) => {
69
+ const shutdown = () => {
70
+ server.close(() => resolve());
71
+ };
72
+ process.on("SIGINT", shutdown);
73
+ process.on("SIGTERM", shutdown);
74
+ server.on("close", () => resolve());
75
+ });
76
+ }
77
+ function openUrl(url) {
78
+ const command = process.platform === "darwin" ? "open" : process.platform === "win32" ? "cmd" : "xdg-open";
79
+ const args = process.platform === "win32" ? ["/c", "start", "", url] : [url];
80
+ spawn(command, args, { stdio: "ignore", detached: true }).unref();
81
+ }
82
+ const thisFile = fileURLToPath(import.meta.url);
83
+ if (isCliEntry(thisFile, process.argv[1])) {
84
+ process.exitCode = await run(process.argv.slice(2));
85
+ }
86
+ export function isCliEntry(modulePath, argv1) {
87
+ if (argv1 === undefined) {
88
+ return false;
89
+ }
90
+ try {
91
+ if (realpathSync(modulePath) === realpathSync(argv1)) {
92
+ return true;
93
+ }
94
+ }
95
+ catch {
96
+ // argv[1] may not exist as a real path (tsx, some shims)
97
+ }
98
+ const entry = resolve(argv1).replaceAll("\\", "/");
99
+ return (/(?:^|\/)src\/cli\/main\.ts$/.test(entry) ||
100
+ /(?:^|\/)dist\/cli\/main\.js$/.test(entry) ||
101
+ /(?:^|\/)comprehende$/.test(entry));
102
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export type BlameLine = {
2
+ sha: string;
3
+ author: string;
4
+ timestamp: number;
5
+ line: number;
6
+ text: string;
7
+ };
8
+ export declare function blameFile(cwd: string, ref: string, path: string): Promise<BlameLine[]>;
@@ -0,0 +1,36 @@
1
+ import { assertSafePath, assertSafeRef } from "./repo.js";
2
+ import { git } from "./exec.js";
3
+ export async function blameFile(cwd, ref, path) {
4
+ assertSafeRef(ref);
5
+ assertSafePath(path);
6
+ const stdout = await git(cwd, ["blame", "--line-porcelain", ref, "--", path]);
7
+ return parseBlamePorcelain(stdout);
8
+ }
9
+ function parseBlamePorcelain(text) {
10
+ const lines = [];
11
+ const raw = text.split("\n");
12
+ let sha = "";
13
+ let author = "";
14
+ let timestamp = 0;
15
+ let lineNo = 0;
16
+ for (const line of raw) {
17
+ const header = /^([0-9a-f]{40}) (\d+) (\d+)(?: (\d+))?$/.exec(line);
18
+ if (header && header[1] !== undefined && header[3] !== undefined) {
19
+ sha = header[1];
20
+ lineNo = Number(header[3]);
21
+ continue;
22
+ }
23
+ if (line.startsWith("author ")) {
24
+ author = line.slice("author ".length);
25
+ continue;
26
+ }
27
+ if (line.startsWith("author-time ")) {
28
+ timestamp = Number(line.slice("author-time ".length));
29
+ continue;
30
+ }
31
+ if (line.startsWith("\t")) {
32
+ lines.push({ sha, author, timestamp, line: lineNo, text: line.slice(1) });
33
+ }
34
+ }
35
+ return lines;
36
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blame.js","sourceRoot":"","sources":["../../src/git/blame.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1D,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAUhC,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,GAAW,EAAE,GAAW,EAAE,IAAY;IACpE,aAAa,CAAC,GAAG,CAAC,CAAC;IACnB,cAAc,CAAC,IAAI,CAAC,CAAC;IACrB,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,kBAAkB,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;IAC9E,OAAO,mBAAmB,CAAC,MAAM,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAY;IACvC,MAAM,KAAK,GAAgB,EAAE,CAAC;IAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC7B,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,MAAM,IAAI,IAAI,GAAG,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,yCAAyC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpE,IAAI,MAAM,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,SAAS,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;YACjE,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YAChB,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3B,SAAS;QACX,CAAC;QACD,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC/B,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YACtC,SAAS;QACX,CAAC;QACD,IAAI,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;YACpC,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC;YACtD,SAAS;QACX,CAAC;QACD,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1B,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { DiffFile, HunkIndex, HunkRef, LiveHunk, ReviewSource } from "../schema/types.ts";
2
+ export declare function resolveSource(cwd: string, baseRef: string, headRef: string): Promise<{
3
+ source: ReviewSource;
4
+ baseSha: string;
5
+ headSha: string;
6
+ }>;
7
+ export declare function readDiff(cwd: string, baseRef: string, headRef: string): Promise<DiffFile[]>;
8
+ export declare function readHunkIndex(cwd: string, baseRef: string, headRef: string): Promise<HunkIndex>;
9
+ export declare function toHunkRef(hunk: HunkRef): HunkRef;
10
+ export declare function parseUnifiedDiff(text: string): DiffFile[];
11
+ export declare function filePatchFromGit(file: DiffFile, hunks: LiveHunk[]): string;
12
+ export declare function flattenHunks(files: DiffFile[]): LiveHunk[];
13
+ export declare function fileLanguage(path: string): string;