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.
- package/README.md +2 -2
- package/dist/api/agent-md.js +8 -19
- package/dist/api/live.js +21 -11
- package/dist/api/paths.js +34 -36
- package/dist/api/shiki-langs.js +138 -0
- package/dist/api/snapshot.js +2 -0
- package/dist/api/types.js +5 -1
- package/dist/cli/args.js +14 -6
- package/dist/cli/commands.js +4 -27
- package/dist/cli/main.js +7 -4
- package/dist/git/exec.js +9 -6
- package/dist/git/repo.js +14 -7
- package/dist/git/show.js +2 -8
- package/dist/package-root.js +20 -3
- package/dist/review/coverage.js +11 -11
- package/dist/review/load.js +20 -0
- package/dist/review/pins.js +6 -3
- package/dist/schema/hunk-meta.js +0 -78
- package/dist/schema/identity.js +3 -2
- package/dist/schema/image.js +2 -7
- package/dist/schema/lockfile.js +2 -1
- package/dist/schema/parse.js +28 -429
- package/dist/schema/review.js +228 -0
- package/dist/schema/skill-sync.js +4 -9
- package/dist/schema/source.js +10 -8
- package/dist/schema/types.js +14 -1
- package/dist/server/http.js +37 -39
- package/dist/ui/assets/andromeeda-vGVdxbeo.js +1 -0
- package/dist/ui/assets/aurora-x-CDeNXAV0.js +1 -0
- package/dist/ui/assets/ayu-dark-DluEY0Gj.js +1 -0
- package/dist/ui/assets/ayu-light-C3h-C4tm.js +1 -0
- package/dist/ui/assets/ayu-mirage-Bqwy1Gya.js +1 -0
- package/dist/ui/assets/catppuccin-frappe-C9Q5zVZY.js +1 -0
- package/dist/ui/assets/catppuccin-latte-CtsyrtPq.js +1 -0
- package/dist/ui/assets/catppuccin-macchiato-R8nAf1vR.js +1 -0
- package/dist/ui/assets/catppuccin-mocha-DjuaAJKi.js +1 -0
- package/dist/ui/assets/dark-plus-Cs2F2srj.js +1 -0
- package/dist/ui/assets/dracula-BHWKrbxM.js +1 -0
- package/dist/ui/assets/dracula-soft-5eyTD99u.js +1 -0
- package/dist/ui/assets/everforest-dark-sB-x3p7T.js +1 -0
- package/dist/ui/assets/everforest-light-Df2xbC6M.js +1 -0
- package/dist/ui/assets/github-dark-C-LZuMrd.js +1 -0
- package/dist/ui/assets/github-dark-default-DXG-b-1a.js +1 -0
- package/dist/ui/assets/github-dark-dimmed-Bx1FflLF.js +1 -0
- package/dist/ui/assets/github-dark-high-contrast-B_tTalzw.js +1 -0
- package/dist/ui/assets/github-light-EUqPIrTm.js +1 -0
- package/dist/ui/assets/github-light-default-BXViO-2h.js +1 -0
- package/dist/ui/assets/github-light-high-contrast-B68TUdTA.js +1 -0
- package/dist/ui/assets/gruvbox-dark-hard-C820rvS2.js +1 -0
- package/dist/ui/assets/gruvbox-dark-medium-BPjhmG05.js +1 -0
- package/dist/ui/assets/gruvbox-dark-soft-MrdJrrXF.js +1 -0
- package/dist/ui/assets/gruvbox-light-hard-BC_s9l72.js +1 -0
- package/dist/ui/assets/gruvbox-light-medium-BAWPOn9u.js +1 -0
- package/dist/ui/assets/gruvbox-light-soft-BSMLrYjP.js +1 -0
- package/dist/ui/assets/horizon-CE9ld1lL.js +1 -0
- package/dist/ui/assets/horizon-bright-DSNQnXHK.js +1 -0
- package/dist/ui/assets/houston-CsvMBhTu.js +1 -0
- package/dist/ui/assets/index-B7sLE_by.js +1744 -0
- package/dist/ui/assets/index-C3TmVu8x.css +1 -0
- package/dist/ui/assets/kanagawa-dragon-Bozd7klA.js +1 -0
- package/dist/ui/assets/kanagawa-lotus-BmuOG9ZW.js +1 -0
- package/dist/ui/assets/kanagawa-wave-BML5mF2J.js +1 -0
- package/dist/ui/assets/laserwave-C_8bwKvT.js +1 -0
- package/dist/ui/assets/light-plus-DVQuIRkW.js +1 -0
- package/dist/ui/assets/material-theme-Bm3Qr25_.js +1 -0
- package/dist/ui/assets/material-theme-darker-2IIEA8gg.js +1 -0
- package/dist/ui/assets/material-theme-lighter-uhdI0v04.js +1 -0
- package/dist/ui/assets/material-theme-ocean-CHQ94UKr.js +1 -0
- package/dist/ui/assets/material-theme-palenight-B5W6OYN7.js +1 -0
- package/dist/ui/assets/min-dark-BSWPekZh.js +1 -0
- package/dist/ui/assets/min-light-DDpmG2fV.js +1 -0
- package/dist/ui/assets/monokai-B_bV9PQ9.js +1 -0
- package/dist/ui/assets/night-owl-DhmEMT88.js +1 -0
- package/dist/ui/assets/night-owl-light-eJ-hLW7d.js +1 -0
- package/dist/ui/assets/nord-Cb4Vim4T.js +1 -0
- package/dist/ui/assets/one-dark-pro-CLwyXe_n.js +1 -0
- package/dist/ui/assets/one-light-D7Lr4KcI.js +1 -0
- package/dist/ui/assets/pierre-dark-CpLgRqie.js +1 -0
- package/dist/ui/assets/pierre-dark-protanopia-deuteranopia-B35FxJx-.js +1 -0
- package/dist/ui/assets/pierre-dark-soft-kZQmAZld.js +1 -0
- package/dist/ui/assets/pierre-dark-tritanopia-CpjhbsIL.js +1 -0
- package/dist/ui/assets/pierre-dark-vibrant-CpQYzh95.js +1 -0
- package/dist/ui/assets/pierre-light-CoaEpmwp.js +1 -0
- package/dist/ui/assets/pierre-light-protanopia-deuteranopia-0fSaH845.js +1 -0
- package/dist/ui/assets/pierre-light-soft-lWLdNTOI.js +1 -0
- package/dist/ui/assets/pierre-light-tritanopia-CEbqgOJL.js +1 -0
- package/dist/ui/assets/pierre-light-vibrant-D80Fkn33.js +1 -0
- package/dist/ui/assets/plastic-DQwYfKfQ.js +1 -0
- package/dist/ui/assets/poimandres-DRFjx7u4.js +1 -0
- package/dist/ui/assets/red-DX1BQOs8.js +1 -0
- package/dist/ui/assets/rose-pine-aMsaMD1D.js +1 -0
- package/dist/ui/assets/rose-pine-dawn-8PwUyIlP.js +1 -0
- package/dist/ui/assets/rose-pine-moon-DO-qXg-I.js +1 -0
- package/dist/ui/assets/shiki-lang-abap-CCh0PiHj.js +1 -0
- package/dist/ui/assets/shiki-lang-actionscript-3-CDO_W9Hu.js +1 -0
- package/dist/ui/assets/shiki-lang-ada-D0v8MB-a.js +1 -0
- package/dist/ui/assets/shiki-lang-ahk-DGQ1h58c.js +1 -0
- package/dist/ui/assets/shiki-lang-ahk2-DZVNTXIX.js +1 -0
- package/dist/ui/assets/shiki-lang-angular-expression-CWExdM8x.js +1 -0
- package/dist/ui/assets/shiki-lang-angular-html-CxeRyf73.js +1 -0
- package/dist/ui/assets/shiki-lang-angular-inline-style-DlHvU-5D.js +1 -0
- package/dist/ui/assets/shiki-lang-angular-inline-template-ZFfps1P0.js +1 -0
- package/dist/ui/assets/shiki-lang-angular-let-declaration-BvqQakFa.js +1 -0
- package/dist/ui/assets/shiki-lang-angular-template-blocks-DlxKd-FQ.js +1 -0
- package/dist/ui/assets/shiki-lang-angular-template-oRYn081P.js +1 -0
- package/dist/ui/assets/shiki-lang-angular-ts-CfsDaJsV.js +1 -0
- package/dist/ui/assets/shiki-lang-apache-DAGm6YRx.js +1 -0
- package/dist/ui/assets/shiki-lang-apex-BntCzcMz.js +1 -0
- package/dist/ui/assets/shiki-lang-apl-DXxMY1U9.js +1 -0
- package/dist/ui/assets/shiki-lang-applescript-CuQP6ZZz.js +1 -0
- package/dist/ui/assets/shiki-lang-ara-BuQtgMwr.js +1 -0
- package/dist/ui/assets/shiki-lang-asciidoc-CoUO43hK.js +1 -0
- package/dist/ui/assets/shiki-lang-asm-Nrnud8z_.js +1 -0
- package/dist/ui/assets/shiki-lang-astro-Cepap9Dk.js +1 -0
- package/dist/ui/assets/shiki-lang-awk-GUYPwV2Y.js +1 -0
- package/dist/ui/assets/shiki-lang-ballerina-BL4RI1ko.js +1 -0
- package/dist/ui/assets/shiki-lang-bat-DaideUf2.js +1 -0
- package/dist/ui/assets/shiki-lang-beancount-CK-GFgjb.js +1 -0
- package/dist/ui/assets/shiki-lang-berry-CaoJlEUd.js +1 -0
- package/dist/ui/assets/shiki-lang-bibtex-CfgnHv7j.js +1 -0
- package/dist/ui/assets/shiki-lang-bicep-ClIJAykG.js +1 -0
- package/dist/ui/assets/shiki-lang-bird2-B5MZrXeo.js +1 -0
- package/dist/ui/assets/shiki-lang-blade-4XbkxIss.js +1 -0
- package/dist/ui/assets/shiki-lang-bsl-CcGvbV5A.js +1 -0
- package/dist/ui/assets/shiki-lang-c-POGgq8OX.js +1 -0
- package/dist/ui/assets/shiki-lang-c3-Bk0Vc2Tn.js +1 -0
- package/dist/ui/assets/shiki-lang-cadence-C45UQpy5.js +1 -0
- package/dist/ui/assets/shiki-lang-cairo-Bekf3Fcc.js +1 -0
- package/dist/ui/assets/shiki-lang-chapel-Ce27PSf2.js +1 -0
- package/dist/ui/assets/shiki-lang-clarity-DzhUGUb5.js +1 -0
- package/dist/ui/assets/shiki-lang-clojure-BGHEPgLH.js +1 -0
- package/dist/ui/assets/shiki-lang-cmake-cj3BvjrT.js +1 -0
- package/dist/ui/assets/shiki-lang-cobol-6silywQZ.js +1 -0
- package/dist/ui/assets/shiki-lang-codeowners-CjsAJB7V.js +1 -0
- package/dist/ui/assets/shiki-lang-codeql-COxApCWA.js +1 -0
- package/dist/ui/assets/shiki-lang-coffee-DJFZ3vXp.js +1 -0
- package/dist/ui/assets/shiki-lang-common-lisp-6R4RkOm6.js +1 -0
- package/dist/ui/assets/shiki-lang-coq-0p5OGVcA.js +1 -0
- package/dist/ui/assets/shiki-lang-cpp-BL0zwoTz.js +1 -0
- package/dist/ui/assets/shiki-lang-cpp-macro-BhQTFR1w.js +1 -0
- package/dist/ui/assets/shiki-lang-crystal-BhrX2mUY.js +1 -0
- package/dist/ui/assets/shiki-lang-csharp-BJ0dqAQQ.js +1 -0
- package/dist/ui/assets/shiki-lang-css-CgONgvzo.js +1 -0
- package/dist/ui/assets/shiki-lang-csv-MORT_y9S.js +1 -0
- package/dist/ui/assets/shiki-lang-cue-CFbNGLLB.js +1 -0
- package/dist/ui/assets/shiki-lang-cypher-DH-T6IiV.js +1 -0
- package/dist/ui/assets/shiki-lang-d-C3P1qfpW.js +1 -0
- package/dist/ui/assets/shiki-lang-dart-C1Hg8CB4.js +1 -0
- package/dist/ui/assets/shiki-lang-dax-YJWgtppW.js +1 -0
- package/dist/ui/assets/shiki-lang-desktop-VlON4cDl.js +1 -0
- package/dist/ui/assets/shiki-lang-diff-Bj1DVcNN.js +1 -0
- package/dist/ui/assets/shiki-lang-docker-ByWlYF6b.js +1 -0
- package/dist/ui/assets/shiki-lang-dotenv-DJpkm7RO.js +1 -0
- package/dist/ui/assets/shiki-lang-dream-maker-Z_U8NFug.js +1 -0
- package/dist/ui/assets/shiki-lang-edge-CbPibdPM.js +1 -0
- package/dist/ui/assets/shiki-lang-elixir-FOIoAYAu.js +1 -0
- package/dist/ui/assets/shiki-lang-elm-CqNCzRK1.js +1 -0
- package/dist/ui/assets/shiki-lang-emacs-lisp-BocUWC8p.js +1 -0
- package/dist/ui/assets/shiki-lang-erb-DK5ZF4vz.js +1 -0
- package/dist/ui/assets/shiki-lang-erlang-rYxHmi04.js +1 -0
- package/dist/ui/assets/shiki-lang-es-tag-css-DnlLlrRA.js +1 -0
- package/dist/ui/assets/shiki-lang-es-tag-glsl-8APUALJ6.js +1 -0
- package/dist/ui/assets/shiki-lang-es-tag-html-C4XIcryF.js +1 -0
- package/dist/ui/assets/shiki-lang-es-tag-sql-BtI5o8rX.js +1 -0
- package/dist/ui/assets/shiki-lang-es-tag-xml-DRxqpnDk.js +1 -0
- package/dist/ui/assets/shiki-lang-fennel-CP9FPjwQ.js +1 -0
- package/dist/ui/assets/shiki-lang-fish-CqrI1-0S.js +1 -0
- package/dist/ui/assets/shiki-lang-fluent-C23gPbyD.js +1 -0
- package/dist/ui/assets/shiki-lang-fortran-fixed-form-Dv3GdqPY.js +1 -0
- package/dist/ui/assets/shiki-lang-fortran-free-form-BtHYkLVR.js +1 -0
- package/dist/ui/assets/shiki-lang-fsharp-D0NR9O4N.js +1 -0
- package/dist/ui/assets/shiki-lang-gdresource-Bg2P2NMh.js +1 -0
- package/dist/ui/assets/shiki-lang-gdscript-BDP11UZz.js +1 -0
- package/dist/ui/assets/shiki-lang-gdshader-8V1ME3af.js +1 -0
- package/dist/ui/assets/shiki-lang-genie-xgkduPxo.js +1 -0
- package/dist/ui/assets/shiki-lang-gherkin--UFIrFpB.js +1 -0
- package/dist/ui/assets/shiki-lang-git-commit-gTixV4s9.js +1 -0
- package/dist/ui/assets/shiki-lang-git-rebase-C_DDfC5h.js +1 -0
- package/dist/ui/assets/shiki-lang-gleam-BCmzVrYm.js +1 -0
- package/dist/ui/assets/shiki-lang-glimmer-js-0Wdoej83.js +1 -0
- package/dist/ui/assets/shiki-lang-glimmer-ts-Bul8Ca32.js +1 -0
- package/dist/ui/assets/shiki-lang-glsl-fJH1k42K.js +1 -0
- package/dist/ui/assets/shiki-lang-gn-ClvndNYF.js +1 -0
- package/dist/ui/assets/shiki-lang-gnuplot-B4aa2-v6.js +1 -0
- package/dist/ui/assets/shiki-lang-go-WKfzAuWo.js +1 -0
- package/dist/ui/assets/shiki-lang-graphql-Bl41bkR3.js +1 -0
- package/dist/ui/assets/shiki-lang-groovy-DPTIjDbN.js +1 -0
- package/dist/ui/assets/shiki-lang-hack-BwL2Ag2H.js +1 -0
- package/dist/ui/assets/shiki-lang-haml-CEYRfOiF.js +1 -0
- package/dist/ui/assets/shiki-lang-handlebars-By72h-0H.js +1 -0
- package/dist/ui/assets/shiki-lang-haskell-Ba8bHyyZ.js +1 -0
- package/dist/ui/assets/shiki-lang-haxe-D9mPDiPb.js +1 -0
- package/dist/ui/assets/shiki-lang-hcl-DTpCFc46.js +1 -0
- package/dist/ui/assets/shiki-lang-hjson-h-0INsVU.js +1 -0
- package/dist/ui/assets/shiki-lang-hlsl-CKI6OfeK.js +1 -0
- package/dist/ui/assets/shiki-lang-html-DFf92Hms.js +1 -0
- package/dist/ui/assets/shiki-lang-html-derivative-y0kQp5cN.js +1 -0
- package/dist/ui/assets/shiki-lang-http-Cap4KCjR.js +1 -0
- package/dist/ui/assets/shiki-lang-hurl-fC0934ju.js +1 -0
- package/dist/ui/assets/shiki-lang-hxml-BTpXjiag.js +1 -0
- package/dist/ui/assets/shiki-lang-hy-RIXtmhH7.js +1 -0
- package/dist/ui/assets/shiki-lang-imba-DvVFFMy1.js +1 -0
- package/dist/ui/assets/shiki-lang-ini-D-vLyVj8.js +1 -0
- package/dist/ui/assets/shiki-lang-java-BeTjxnHl.js +1 -0
- package/dist/ui/assets/shiki-lang-javascript-CF6Vsgp3.js +1 -0
- package/dist/ui/assets/shiki-lang-jinja-Cz3-RWz8.js +1 -0
- package/dist/ui/assets/shiki-lang-jinja-html-CVnbJ0oM.js +1 -0
- package/dist/ui/assets/shiki-lang-jison-DxtixVzs.js +1 -0
- package/dist/ui/assets/shiki-lang-json-QS2TvV-a.js +1 -0
- package/dist/ui/assets/shiki-lang-json5-BsThk---.js +1 -0
- package/dist/ui/assets/shiki-lang-jsonc-BBxdRkqS.js +1 -0
- package/dist/ui/assets/shiki-lang-jsonl-DHixT2Ch.js +1 -0
- package/dist/ui/assets/shiki-lang-jsonnet-DMmrvZE9.js +1 -0
- package/dist/ui/assets/shiki-lang-jssm-D-BacgrV.js +1 -0
- package/dist/ui/assets/shiki-lang-jsx-DGUCmvqX.js +1 -0
- package/dist/ui/assets/shiki-lang-julia-WtC1loLD.js +1 -0
- package/dist/ui/assets/shiki-lang-just-EJs2Bpr8.js +1 -0
- package/dist/ui/assets/shiki-lang-kdl-XgCoC7ro.js +1 -0
- package/dist/ui/assets/shiki-lang-kotlin-Ceu1DClC.js +1 -0
- package/dist/ui/assets/shiki-lang-kusto-IydfCbjB.js +1 -0
- package/dist/ui/assets/shiki-lang-latex-CERrvjmL.js +1 -0
- package/dist/ui/assets/shiki-lang-lean-Bb1MSB5_.js +1 -0
- package/dist/ui/assets/shiki-lang-less-C57uWnIP.js +1 -0
- package/dist/ui/assets/shiki-lang-liquid-D2YDAKEE.js +1 -0
- package/dist/ui/assets/shiki-lang-llvm-CsPaR48C.js +1 -0
- package/dist/ui/assets/shiki-lang-log-4Q7z9P2_.js +1 -0
- package/dist/ui/assets/shiki-lang-logo-B-rjKTna.js +1 -0
- package/dist/ui/assets/shiki-lang-lua-CjwakkuI.js +1 -0
- package/dist/ui/assets/shiki-lang-luau-95molwVq.js +1 -0
- package/dist/ui/assets/shiki-lang-make-BuLqiXA5.js +1 -0
- package/dist/ui/assets/shiki-lang-markdown-Dlt9cTjJ.js +1 -0
- package/dist/ui/assets/shiki-lang-markdown-nix-DOLw_s_D.js +1 -0
- package/dist/ui/assets/shiki-lang-markdown-vue-DDYW27gg.js +1 -0
- package/dist/ui/assets/shiki-lang-marko-AgxF-6vJ.js +1 -0
- package/dist/ui/assets/shiki-lang-matlab-CLkaVy-y.js +1 -0
- package/dist/ui/assets/shiki-lang-mdc-B-JDJ8TU.js +1 -0
- package/dist/ui/assets/shiki-lang-mdx-DdDHzKCT.js +1 -0
- package/dist/ui/assets/shiki-lang-mermaid-Cjcnm69Q.js +1 -0
- package/dist/ui/assets/shiki-lang-mipsasm-B_6mjd6u.js +1 -0
- package/dist/ui/assets/shiki-lang-mojo-D0L5A59C.js +1 -0
- package/dist/ui/assets/shiki-lang-moonbit-Eqtgjxo4.js +1 -0
- package/dist/ui/assets/shiki-lang-move-DbQlRQBG.js +1 -0
- package/dist/ui/assets/shiki-lang-narrat-DiDbLBuo.js +1 -0
- package/dist/ui/assets/shiki-lang-nextflow-CpRbRx9E.js +1 -0
- package/dist/ui/assets/shiki-lang-nextflow-groovy-Dtoz-QfU.js +1 -0
- package/dist/ui/assets/shiki-lang-nginx-BhB_jNUf.js +1 -0
- package/dist/ui/assets/shiki-lang-nim-ZHlDXpnX.js +1 -0
- package/dist/ui/assets/shiki-lang-nix-BIW1fYd1.js +1 -0
- package/dist/ui/assets/shiki-lang-nsis-CVnxZHip.js +1 -0
- package/dist/ui/assets/shiki-lang-nushell-BMeIXYse.js +1 -0
- package/dist/ui/assets/shiki-lang-objective-c-Cc2on8Vi.js +1 -0
- package/dist/ui/assets/shiki-lang-objective-cpp-vFHMpEHE.js +1 -0
- package/dist/ui/assets/shiki-lang-ocaml-D3g-9olK.js +1 -0
- package/dist/ui/assets/shiki-lang-odin-BM_1nNT7.js +1 -0
- package/dist/ui/assets/shiki-lang-openscad-BtEafwls.js +1 -0
- package/dist/ui/assets/shiki-lang-org-Bo_61LoZ.js +1 -0
- package/dist/ui/assets/shiki-lang-pascal-CtzWzlCE.js +1 -0
- package/dist/ui/assets/shiki-lang-perl-PJeVLxjR.js +1 -0
- package/dist/ui/assets/shiki-lang-php-CGIwcKYx.js +1 -0
- package/dist/ui/assets/shiki-lang-pkl-BwBGf-Je.js +1 -0
- package/dist/ui/assets/shiki-lang-plsql-DfWyOq8S.js +1 -0
- package/dist/ui/assets/shiki-lang-po-CGG3cf6x.js +1 -0
- package/dist/ui/assets/shiki-lang-polar-Ixg1DSjp.js +1 -0
- package/dist/ui/assets/shiki-lang-postcss-Bz1BtlXf.js +1 -0
- package/dist/ui/assets/shiki-lang-powerquery-ifUmxibQ.js +1 -0
- package/dist/ui/assets/shiki-lang-powershell-DBPOjskM.js +1 -0
- package/dist/ui/assets/shiki-lang-prisma-Blu4wKH1.js +1 -0
- package/dist/ui/assets/shiki-lang-prolog-xjF--GQU.js +1 -0
- package/dist/ui/assets/shiki-lang-proto-DSra8eBV.js +1 -0
- package/dist/ui/assets/shiki-lang-pug-DSuGdEWk.js +1 -0
- package/dist/ui/assets/shiki-lang-puppet-Cq0Seunk.js +1 -0
- package/dist/ui/assets/shiki-lang-purescript-ByxegL2r.js +1 -0
- package/dist/ui/assets/shiki-lang-python-oauygUGH.js +1 -0
- package/dist/ui/assets/shiki-lang-qml-CfCPNi46.js +1 -0
- package/dist/ui/assets/shiki-lang-qmldir-B3ajh-8-.js +1 -0
- package/dist/ui/assets/shiki-lang-qss-JwufFeTi.js +1 -0
- package/dist/ui/assets/shiki-lang-r-DMwcwdHm.js +1 -0
- package/dist/ui/assets/shiki-lang-racket-CGdA7NhF.js +1 -0
- package/dist/ui/assets/shiki-lang-raku-ClL-wuQO.js +1 -0
- package/dist/ui/assets/shiki-lang-razor-Bc882n0u.js +1 -0
- package/dist/ui/assets/shiki-lang-rbs-FCklQ7tS.js +1 -0
- package/dist/ui/assets/shiki-lang-reg-DaN26ZvO.js +1 -0
- package/dist/ui/assets/shiki-lang-regexp-DqcDyem1.js +1 -0
- package/dist/ui/assets/shiki-lang-rel-BpLoSKv9.js +1 -0
- package/dist/ui/assets/shiki-lang-riscv-B2iV_L1B.js +1 -0
- package/dist/ui/assets/shiki-lang-ron-DdvUXXs5.js +1 -0
- package/dist/ui/assets/shiki-lang-rosmsg-BxtFx0Y7.js +1 -0
- package/dist/ui/assets/shiki-lang-rst-B3dfhudY.js +1 -0
- package/dist/ui/assets/shiki-lang-ruby-DHCzTBzU.js +1 -0
- package/dist/ui/assets/shiki-lang-rust-C4poL8VP.js +1 -0
- package/dist/ui/assets/shiki-lang-sas-C8wUw1Vp.js +1 -0
- package/dist/ui/assets/shiki-lang-sass-Dji7kc40.js +1 -0
- package/dist/ui/assets/shiki-lang-scala-JNssQMYD.js +1 -0
- package/dist/ui/assets/shiki-lang-scheme-CW7V2UtM.js +1 -0
- package/dist/ui/assets/shiki-lang-scss-DBg0YeZ4.js +1 -0
- package/dist/ui/assets/shiki-lang-sdbl-BYeb1lAp.js +1 -0
- package/dist/ui/assets/shiki-lang-shaderlab-GktSJyKV.js +1 -0
- package/dist/ui/assets/shiki-lang-shellscript-Bv7mPD64.js +1 -0
- package/dist/ui/assets/shiki-lang-shellsession-Bkg9Digr.js +1 -0
- package/dist/ui/assets/shiki-lang-smalltalk-CqpXp2gZ.js +1 -0
- package/dist/ui/assets/shiki-lang-smithy-GwK488Vp.js +1 -0
- package/dist/ui/assets/shiki-lang-solidity-5PE2Pulk.js +1 -0
- package/dist/ui/assets/shiki-lang-soy-D61f_9WS.js +1 -0
- package/dist/ui/assets/shiki-lang-sparql-BVBXfaxX.js +1 -0
- package/dist/ui/assets/shiki-lang-splunk-DZldBRB0.js +1 -0
- package/dist/ui/assets/shiki-lang-sql-CR9sphd-.js +1 -0
- package/dist/ui/assets/shiki-lang-ssh-config-C_eLd3hX.js +1 -0
- package/dist/ui/assets/shiki-lang-stata-cxiQzY5Z.js +1 -0
- package/dist/ui/assets/shiki-lang-stylus-yBLwS3B_.js +1 -0
- package/dist/ui/assets/shiki-lang-surrealql-CQ1B4fvD.js +1 -0
- package/dist/ui/assets/shiki-lang-svelte-BrZ-k7yi.js +1 -0
- package/dist/ui/assets/shiki-lang-swift-DOjOtIxe.js +1 -0
- package/dist/ui/assets/shiki-lang-system-verilog-DmyUa94s.js +1 -0
- package/dist/ui/assets/shiki-lang-systemd-DYSBXyN5.js +1 -0
- package/dist/ui/assets/shiki-lang-talonscript-BUBbooxD.js +1 -0
- package/dist/ui/assets/shiki-lang-tasl-DAKi3lWp.js +1 -0
- package/dist/ui/assets/shiki-lang-tcl-DNeJRgOl.js +1 -0
- package/dist/ui/assets/shiki-lang-templ-DKYV6Pof.js +1 -0
- package/dist/ui/assets/shiki-lang-terraform-DfYuA89d.js +1 -0
- package/dist/ui/assets/shiki-lang-tex-Cb33DrEL.js +1 -0
- package/dist/ui/assets/shiki-lang-toml-BaaR59A6.js +1 -0
- package/dist/ui/assets/shiki-lang-ts-tags-Dz_laeDQ.js +1 -0
- package/dist/ui/assets/shiki-lang-tsv--fpF5auZ.js +1 -0
- package/dist/ui/assets/shiki-lang-tsx-p97p3SK9.js +1 -0
- package/dist/ui/assets/shiki-lang-turtle-1lh9Wfao.js +1 -0
- package/dist/ui/assets/shiki-lang-twig-DR1FyLif.js +1 -0
- package/dist/ui/assets/shiki-lang-typescript-DHNOgsP8.js +1 -0
- package/dist/ui/assets/shiki-lang-typespec-C91uBnE3.js +1 -0
- package/dist/ui/assets/shiki-lang-typst-CI5xfKyi.js +1 -0
- package/dist/ui/assets/shiki-lang-v-DMQILRRf.js +1 -0
- package/dist/ui/assets/shiki-lang-vala-C4ar8eoZ.js +1 -0
- package/dist/ui/assets/shiki-lang-vb-AAhTcthz.js +1 -0
- package/dist/ui/assets/shiki-lang-verilog-DK5Iephb.js +1 -0
- package/dist/ui/assets/shiki-lang-vhdl-CMQVRPDa.js +1 -0
- package/dist/ui/assets/shiki-lang-viml-C1l6E4A3.js +1 -0
- package/dist/ui/assets/shiki-lang-vue-DNmpMN2C.js +1 -0
- package/dist/ui/assets/shiki-lang-vue-directives-2-MeLAcz.js +1 -0
- package/dist/ui/assets/shiki-lang-vue-html-BRIUbDAp.js +1 -0
- package/dist/ui/assets/shiki-lang-vue-interpolations-D6IW37Bp.js +1 -0
- package/dist/ui/assets/shiki-lang-vue-sfc-style-variable-injection-D1TdO2sq.js +1 -0
- package/dist/ui/assets/shiki-lang-vue-vine-r6cwuWZy.js +1 -0
- package/dist/ui/assets/shiki-lang-vyper-D0cV2GLW.js +1 -0
- package/dist/ui/assets/shiki-lang-wasm-BVFSgxvN.js +1 -0
- package/dist/ui/assets/shiki-lang-wenyan-JEKl_-0C.js +1 -0
- package/dist/ui/assets/shiki-lang-wgsl-CVTTOPpW.js +1 -0
- package/dist/ui/assets/shiki-lang-wikitext-BT1u0lSn.js +1 -0
- package/dist/ui/assets/shiki-lang-wit-CXr4d-s1.js +1 -0
- package/dist/ui/assets/shiki-lang-wolfram-CbuUgwLG.js +1 -0
- package/dist/ui/assets/shiki-lang-xml-CzqLjWlK.js +1 -0
- package/dist/ui/assets/shiki-lang-xsl-hYwVdgCv.js +1 -0
- package/dist/ui/assets/shiki-lang-yaml-Byr1PsnH.js +1 -0
- package/dist/ui/assets/shiki-lang-zenscript-ZElI1LVr.js +1 -0
- package/dist/ui/assets/shiki-lang-zig-xkISalQB.js +1 -0
- package/dist/ui/assets/slack-dark-DnToyrRv.js +1 -0
- package/dist/ui/assets/slack-ochin-B2OO5cIa.js +1 -0
- package/dist/ui/assets/snazzy-light-4G7pJPwS.js +1 -0
- package/dist/ui/assets/solarized-dark-UdsmMDCL.js +1 -0
- package/dist/ui/assets/solarized-light-C1IUL_tW.js +1 -0
- package/dist/ui/assets/synthwave-84-nFMaYfgc.js +1 -0
- package/dist/ui/assets/tokyo-night-oM2G3aXe.js +1 -0
- package/dist/ui/assets/vesper-DdrHHSXu.js +1 -0
- package/dist/ui/assets/vitesse-black-fwtXNY1n.js +1 -0
- package/dist/ui/assets/vitesse-dark-BZCL-v6S.js +1 -0
- package/dist/ui/assets/vitesse-light-VbXTXTou.js +1 -0
- package/dist/ui/assets/{wasm-CG6Dc4jp.js → wasm-BnjxR4X6.js} +1 -1
- package/dist/ui/assets/wasm-S0UXjx1m.js +1 -0
- package/dist/ui/assets/worker-DrorqVhi.js +162 -0
- package/dist/ui/index.html +3 -2
- package/dist/ui/shiki-langs.json +1 -0
- package/package.json +14 -10
- package/skills/comprehende/SKILL.md +16 -6
- package/skills/comprehende/references/review.schema.json +50 -49
- package/dist/ui/assets/abap-BdImnpbu.js +0 -1
- package/dist/ui/assets/actionscript-3-B3316cI-.js +0 -1
- package/dist/ui/assets/ada-bCR0ucgS.js +0 -1
- package/dist/ui/assets/ahk-CsyLZFj1.js +0 -1
- package/dist/ui/assets/ahk2-8Zs4aa1G.js +0 -1
- package/dist/ui/assets/andromeeda-C4gqWexZ.js +0 -1
- package/dist/ui/assets/angular-html-DA-rfuFy.js +0 -1
- package/dist/ui/assets/angular-ts-BrjP3tb8.js +0 -1
- package/dist/ui/assets/apache-Pmp26Uib.js +0 -1
- package/dist/ui/assets/apex-DhZFqWV2.js +0 -1
- package/dist/ui/assets/apl-CORt7UWP.js +0 -1
- package/dist/ui/assets/applescript-Co6uUVPk.js +0 -1
- package/dist/ui/assets/ara-BRHolxvo.js +0 -1
- package/dist/ui/assets/asciidoc-CSVQ5wI8.js +0 -1
- package/dist/ui/assets/asm-D_Q5rh1f.js +0 -1
- package/dist/ui/assets/astro-HNnZUWAn.js +0 -1
- package/dist/ui/assets/aurora-x-D-2ljcwZ.js +0 -1
- package/dist/ui/assets/awk-DMzUqQB5.js +0 -1
- package/dist/ui/assets/ayu-dark-DYE7WIF3.js +0 -1
- package/dist/ui/assets/ayu-light-BA47KaF1.js +0 -1
- package/dist/ui/assets/ayu-mirage-32ctXXKs.js +0 -1
- package/dist/ui/assets/ballerina-BFfxhgS-.js +0 -1
- package/dist/ui/assets/bat-CickPsom.js +0 -1
- package/dist/ui/assets/beancount-k_qm7-4y.js +0 -1
- package/dist/ui/assets/berry-uYugtg8r.js +0 -1
- package/dist/ui/assets/bibtex-CHM0blh-.js +0 -1
- package/dist/ui/assets/bicep-Bmn6On1c.js +0 -1
- package/dist/ui/assets/bird2-Bx8U0n9b.js +0 -1
- package/dist/ui/assets/blade-2xfisSek.js +0 -1
- package/dist/ui/assets/bsl-DlhNcFeZ.js +0 -1
- package/dist/ui/assets/c-BIGW1oBm.js +0 -1
- package/dist/ui/assets/c3-Dp5svz6Z.js +0 -1
- package/dist/ui/assets/cadence-Bv_4Rxtq.js +0 -1
- package/dist/ui/assets/cairo-KRGpt6FW.js +0 -1
- package/dist/ui/assets/catppuccin-frappe-CZL1YF0i.js +0 -1
- package/dist/ui/assets/catppuccin-latte-DH-8KZSZ.js +0 -1
- package/dist/ui/assets/catppuccin-macchiato-B7yYVSCf.js +0 -1
- package/dist/ui/assets/catppuccin-mocha-Ct7hS0mc.js +0 -1
- package/dist/ui/assets/chapel-DTp_pixX.js +0 -1
- package/dist/ui/assets/clarity-Dn5IMItf.js +0 -1
- package/dist/ui/assets/clojure-P80f7IUj.js +0 -1
- package/dist/ui/assets/cmake-D1j8_8rp.js +0 -1
- package/dist/ui/assets/cobol-nBiQ_Alo.js +0 -1
- package/dist/ui/assets/codeowners-Bp6g37R7.js +0 -1
- package/dist/ui/assets/codeql-DsOJ9woJ.js +0 -1
- package/dist/ui/assets/coffee-Ch7k5sss.js +0 -1
- package/dist/ui/assets/common-lisp-Cg-RD9OK.js +0 -1
- package/dist/ui/assets/coq-C7JzOVbR.js +0 -1
- package/dist/ui/assets/cpp-BMRokrvK.js +0 -1
- package/dist/ui/assets/crystal-DGywbUpC.js +0 -1
- package/dist/ui/assets/csharp-DSvCPggb.js +0 -1
- package/dist/ui/assets/css-CLj8gQPS.js +0 -1
- package/dist/ui/assets/csv-fuZLfV_i.js +0 -1
- package/dist/ui/assets/cue-D82EKSYY.js +0 -1
- package/dist/ui/assets/cypher-COkxafJQ.js +0 -1
- package/dist/ui/assets/d-85-TOEBH.js +0 -1
- package/dist/ui/assets/dark-plus-C3mMm8J8.js +0 -1
- package/dist/ui/assets/dart-bE4Kk8sk.js +0 -1
- package/dist/ui/assets/dax-CEL-wOlO.js +0 -1
- package/dist/ui/assets/desktop-BmXAJ9_W.js +0 -1
- package/dist/ui/assets/diff-D97Zzqfu.js +0 -1
- package/dist/ui/assets/docker-BcOcwvcX.js +0 -1
- package/dist/ui/assets/dotenv-Da5cRb03.js +0 -1
- package/dist/ui/assets/dracula-BzJJZx-M.js +0 -1
- package/dist/ui/assets/dracula-soft-BXkSAIEj.js +0 -1
- package/dist/ui/assets/dream-maker-BtqSS_iP.js +0 -1
- package/dist/ui/assets/edge-FbVlp4U3.js +0 -1
- package/dist/ui/assets/elixir-CkH2-t6x.js +0 -1
- package/dist/ui/assets/elm-DbKCFpqz.js +0 -1
- package/dist/ui/assets/emacs-lisp-C_m_b--Z.js +0 -1
- package/dist/ui/assets/erb-DXfck5VN.js +0 -1
- package/dist/ui/assets/erlang-DsQrWhSR.js +0 -1
- package/dist/ui/assets/everforest-dark-BgDCqdQA.js +0 -1
- package/dist/ui/assets/everforest-light-C8M2exoo.js +0 -1
- package/dist/ui/assets/fennel-BYunw83y.js +0 -1
- package/dist/ui/assets/fish-BvzEVeQv.js +0 -1
- package/dist/ui/assets/fluent-C4IJs8-o.js +0 -1
- package/dist/ui/assets/fortran-fixed-form-CkoXwp7k.js +0 -1
- package/dist/ui/assets/fortran-free-form-BxgE0vQu.js +0 -1
- package/dist/ui/assets/fsharp-CXgrBDvD.js +0 -1
- package/dist/ui/assets/gdresource-TyuKm33G.js +0 -1
- package/dist/ui/assets/gdscript-DqcFQ5yU.js +0 -1
- package/dist/ui/assets/gdshader-DkwncUOv.js +0 -1
- package/dist/ui/assets/genie-D0YGMca9.js +0 -1
- package/dist/ui/assets/gherkin-DyxjwDmM.js +0 -1
- package/dist/ui/assets/git-commit-F4YmCXRG.js +0 -1
- package/dist/ui/assets/git-rebase-r7XF79zn.js +0 -1
- package/dist/ui/assets/github-dark-DHJKELXO.js +0 -1
- package/dist/ui/assets/github-dark-default-Cuk6v7N8.js +0 -1
- package/dist/ui/assets/github-dark-dimmed-DH5Ifo-i.js +0 -1
- package/dist/ui/assets/github-dark-high-contrast-E3gJ1_iC.js +0 -1
- package/dist/ui/assets/github-light-DAi9KRSo.js +0 -1
- package/dist/ui/assets/github-light-default-D7oLnXFd.js +0 -1
- package/dist/ui/assets/github-light-high-contrast-BfjtVDDH.js +0 -1
- package/dist/ui/assets/gleam-BspZqrRM.js +0 -1
- package/dist/ui/assets/glimmer-js-ByusRIyA.js +0 -1
- package/dist/ui/assets/glimmer-ts-BfAWNZQY.js +0 -1
- package/dist/ui/assets/glsl-DplSGwfg.js +0 -1
- package/dist/ui/assets/gn-n2N0HUVH.js +0 -1
- package/dist/ui/assets/gnuplot-DdkO51Og.js +0 -1
- package/dist/ui/assets/go-C27-OAKa.js +0 -1
- package/dist/ui/assets/graphql-ChdNCCLP.js +0 -1
- package/dist/ui/assets/groovy-gcz8RCvz.js +0 -1
- package/dist/ui/assets/gruvbox-dark-hard-CFHQjOhq.js +0 -1
- package/dist/ui/assets/gruvbox-dark-medium-GsRaNv29.js +0 -1
- package/dist/ui/assets/gruvbox-dark-soft-CVdnzihN.js +0 -1
- package/dist/ui/assets/gruvbox-light-hard-CH1njM8p.js +0 -1
- package/dist/ui/assets/gruvbox-light-medium-DRw_LuNl.js +0 -1
- package/dist/ui/assets/gruvbox-light-soft-hJgmCMqR.js +0 -1
- package/dist/ui/assets/hack-BWmVpMyf.js +0 -1
- package/dist/ui/assets/haml-D5jkg6IW.js +0 -1
- package/dist/ui/assets/handlebars-BpdQsYii.js +0 -1
- package/dist/ui/assets/haskell-Df6bDoY_.js +0 -1
- package/dist/ui/assets/haxe-CfZj7gIn.js +0 -1
- package/dist/ui/assets/hcl-BWvSN4gD.js +0 -1
- package/dist/ui/assets/hjson-D5-asLiD.js +0 -1
- package/dist/ui/assets/hlsl-D3lLCCz7.js +0 -1
- package/dist/ui/assets/horizon-BUw7H-hv.js +0 -1
- package/dist/ui/assets/horizon-bright-CUuTKBJd.js +0 -1
- package/dist/ui/assets/houston-DnULxvSX.js +0 -1
- package/dist/ui/assets/html-derivative-DlHx6ybY.js +0 -1
- package/dist/ui/assets/html-pp8916En.js +0 -1
- package/dist/ui/assets/http-jrhK8wxY.js +0 -1
- package/dist/ui/assets/hurl-irOxFIW8.js +0 -1
- package/dist/ui/assets/hxml-2-FPmUDs.js +0 -1
- package/dist/ui/assets/hy-DFXneXwc.js +0 -1
- package/dist/ui/assets/imba-DGztddWO.js +0 -1
- package/dist/ui/assets/index-C1EoRByu.css +0 -1
- package/dist/ui/assets/index-su33x8uU.js +0 -1713
- package/dist/ui/assets/ini-BEwlwnbL.js +0 -1
- package/dist/ui/assets/java-CylS5w8V.js +0 -1
- package/dist/ui/assets/javascript-wDzz0qaB.js +0 -1
- package/dist/ui/assets/jinja-f2NsQr07.js +0 -1
- package/dist/ui/assets/jison-wvAkD_A8.js +0 -1
- package/dist/ui/assets/json-Cp-IABpG.js +0 -1
- package/dist/ui/assets/json5-C9tS-k6U.js +0 -1
- package/dist/ui/assets/jsonc-Des-eS-w.js +0 -1
- package/dist/ui/assets/jsonl-DcaNXYhu.js +0 -1
- package/dist/ui/assets/jsonnet-DFQXde-d.js +0 -1
- package/dist/ui/assets/jssm-C2t-YnRu.js +0 -1
- package/dist/ui/assets/jsx-g9-lgVsj.js +0 -1
- package/dist/ui/assets/julia-5Bft2YPA.js +0 -1
- package/dist/ui/assets/just-Cwhn7H3k.js +0 -1
- package/dist/ui/assets/kanagawa-dragon-BuwD2xS4.js +0 -1
- package/dist/ui/assets/kanagawa-lotus-C3DzagqV.js +0 -1
- package/dist/ui/assets/kanagawa-wave-DFGoQZhC.js +0 -1
- package/dist/ui/assets/kdl-DV7GczEv.js +0 -1
- package/dist/ui/assets/kotlin-BdnUsdx6.js +0 -1
- package/dist/ui/assets/kusto-wEQ09or8.js +0 -1
- package/dist/ui/assets/laserwave-DUszq2jm.js +0 -1
- package/dist/ui/assets/latex-D5pSuvFb.js +0 -1
- package/dist/ui/assets/lean-BZvkOJ9d.js +0 -1
- package/dist/ui/assets/less-B1dDrJ26.js +0 -1
- package/dist/ui/assets/light-plus-B7mTdjB0.js +0 -1
- package/dist/ui/assets/liquid-C0sCDyMI.js +0 -1
- package/dist/ui/assets/llvm-BZoOZj88.js +0 -1
- package/dist/ui/assets/log-2UxHyX5q.js +0 -1
- package/dist/ui/assets/logo-BtOb2qkB.js +0 -1
- package/dist/ui/assets/lua-BaeVxFsk.js +0 -1
- package/dist/ui/assets/luau-BnpPk5vE.js +0 -1
- package/dist/ui/assets/make-CHLpvVh8.js +0 -1
- package/dist/ui/assets/markdown-Cvjx9yec.js +0 -1
- package/dist/ui/assets/marko-DjSrsDqO.js +0 -1
- package/dist/ui/assets/material-theme-D5KoaKCx.js +0 -1
- package/dist/ui/assets/material-theme-darker-BfHTSMKl.js +0 -1
- package/dist/ui/assets/material-theme-lighter-B0m2ddpp.js +0 -1
- package/dist/ui/assets/material-theme-ocean-CyktbL80.js +0 -1
- package/dist/ui/assets/material-theme-palenight-Csfq5Kiy.js +0 -1
- package/dist/ui/assets/matlab-D7o27uSR.js +0 -1
- package/dist/ui/assets/mdc-D1_yUvq7.js +0 -1
- package/dist/ui/assets/mdx-Cmh6b_Ma.js +0 -1
- package/dist/ui/assets/mermaid-CQcHuHx7.js +0 -1
- package/dist/ui/assets/min-dark-CafNBF8u.js +0 -1
- package/dist/ui/assets/min-light-CTRr51gU.js +0 -1
- package/dist/ui/assets/mipsasm-CKIfxQSi.js +0 -1
- package/dist/ui/assets/mojo-DJz3ZmWd.js +0 -1
- package/dist/ui/assets/monokai-BRVnQi9A.js +0 -1
- package/dist/ui/assets/moonbit-CHtswR0a.js +0 -1
- package/dist/ui/assets/move-el3G9tDJ.js +0 -1
- package/dist/ui/assets/narrat-DRg8JJMk.js +0 -1
- package/dist/ui/assets/nextflow-C-mBbutL.js +0 -1
- package/dist/ui/assets/nextflow-groovy-vE_lwT2v.js +0 -1
- package/dist/ui/assets/nginx-BpAMiNFr.js +0 -1
- package/dist/ui/assets/night-owl-C39BiMTA.js +0 -1
- package/dist/ui/assets/night-owl-light-CMTm3GFP.js +0 -1
- package/dist/ui/assets/nim-BIad80T-.js +0 -1
- package/dist/ui/assets/nix-CwoSXNpI.js +0 -1
- package/dist/ui/assets/nord-Ddv68eIx.js +0 -1
- package/dist/ui/assets/nsis-BlV79W_Q.js +0 -1
- package/dist/ui/assets/nushell-D3jzshHO.js +0 -1
- package/dist/ui/assets/objective-c-DXmwc3jG.js +0 -1
- package/dist/ui/assets/objective-cpp-CLxacb5B.js +0 -1
- package/dist/ui/assets/ocaml-C0hk2d4L.js +0 -1
- package/dist/ui/assets/odin-BBf5iR-q.js +0 -1
- package/dist/ui/assets/one-dark-pro-DVMEJ2y_.js +0 -1
- package/dist/ui/assets/one-light-C3Wv6jpd.js +0 -1
- package/dist/ui/assets/openscad-C4EeE6gA.js +0 -1
- package/dist/ui/assets/org-DM6o9KBp.js +0 -1
- package/dist/ui/assets/pascal-D93ZcfNL.js +0 -1
- package/dist/ui/assets/perl-B9cMNwum.js +0 -1
- package/dist/ui/assets/php-Csjmro_R.js +0 -1
- package/dist/ui/assets/pierre-dark-CyvmCCZW.js +0 -1
- package/dist/ui/assets/pierre-dark-protanopia-deuteranopia-Rgc0TwpF.js +0 -1
- package/dist/ui/assets/pierre-dark-soft-BHGpRqa4.js +0 -1
- package/dist/ui/assets/pierre-dark-tritanopia-Beq2gCRQ.js +0 -1
- package/dist/ui/assets/pierre-dark-vibrant-BWBVywrn.js +0 -1
- package/dist/ui/assets/pierre-light-480U9XYS.js +0 -1
- package/dist/ui/assets/pierre-light-protanopia-deuteranopia-CaVOBURG.js +0 -1
- package/dist/ui/assets/pierre-light-soft-CVdyfjmI.js +0 -1
- package/dist/ui/assets/pierre-light-tritanopia-B4_gpKOM.js +0 -1
- package/dist/ui/assets/pierre-light-vibrant-DdTDNdfJ.js +0 -1
- package/dist/ui/assets/pkl-u5AG7uiY.js +0 -1
- package/dist/ui/assets/plastic-3e1v2bzS.js +0 -1
- package/dist/ui/assets/plsql-ChMvpjG-.js +0 -1
- package/dist/ui/assets/po-BTJTHyun.js +0 -1
- package/dist/ui/assets/poimandres-CS3Unz2-.js +0 -1
- package/dist/ui/assets/polar-C0HS_06l.js +0 -1
- package/dist/ui/assets/postcss-CXtECtnM.js +0 -1
- package/dist/ui/assets/powerquery-CEu0bR-o.js +0 -1
- package/dist/ui/assets/powershell-BmBUJMz7.js +0 -1
- package/dist/ui/assets/prisma-Vru482bI.js +0 -1
- package/dist/ui/assets/prolog-CbFg5uaA.js +0 -1
- package/dist/ui/assets/proto-C7zT0LnQ.js +0 -1
- package/dist/ui/assets/pug-DKIMFp6K.js +0 -1
- package/dist/ui/assets/puppet-BMWR74SV.js +0 -1
- package/dist/ui/assets/purescript-CklMAg4u.js +0 -1
- package/dist/ui/assets/python-B6aJPvgy.js +0 -1
- package/dist/ui/assets/qml-3beO22l8.js +0 -1
- package/dist/ui/assets/qmldir-C8lEn-DE.js +0 -1
- package/dist/ui/assets/qss-IeuSbFQv.js +0 -1
- package/dist/ui/assets/r-Cf5RLm7j.js +0 -1
- package/dist/ui/assets/racket-BqYA7rlc.js +0 -1
- package/dist/ui/assets/raku-DXvB9xmW.js +0 -1
- package/dist/ui/assets/razor-BjBPvh-w.js +0 -1
- package/dist/ui/assets/rbs-CpoqiR4B.js +0 -1
- package/dist/ui/assets/red-hvxz__6c.js +0 -1
- package/dist/ui/assets/reg-C-SQnVFl.js +0 -1
- package/dist/ui/assets/regexp-CDVJQ6XC.js +0 -1
- package/dist/ui/assets/rel-C3B-1QV4.js +0 -1
- package/dist/ui/assets/riscv-BM1_JUlF.js +0 -1
- package/dist/ui/assets/ron-D8l8udqQ.js +0 -1
- package/dist/ui/assets/rose-pine-5qJOZa0Y.js +0 -1
- package/dist/ui/assets/rose-pine-dawn-zx0QlTCp.js +0 -1
- package/dist/ui/assets/rose-pine-moon-C9pEdX9L.js +0 -1
- package/dist/ui/assets/rosmsg-BJDFO7_C.js +0 -1
- package/dist/ui/assets/rst-bs7f0vWN.js +0 -1
- package/dist/ui/assets/ruby-C0TQ7zu5.js +0 -1
- package/dist/ui/assets/rust-B1yitclQ.js +0 -1
- package/dist/ui/assets/sas-DEy46yEz.js +0 -1
- package/dist/ui/assets/sass-Cj5Yp3dK.js +0 -1
- package/dist/ui/assets/scala-CqE71os6.js +0 -1
- package/dist/ui/assets/scheme-C98Dy4si.js +0 -1
- package/dist/ui/assets/scss-D5BDwBP9.js +0 -1
- package/dist/ui/assets/sdbl-DVxCFoDh.js +0 -1
- package/dist/ui/assets/shaderlab-Dg9Lc6iA.js +0 -1
- package/dist/ui/assets/shellscript-Yzrsuije.js +0 -1
- package/dist/ui/assets/shellsession-BADoaaVG.js +0 -1
- package/dist/ui/assets/slack-dark-BthQWCQV.js +0 -1
- package/dist/ui/assets/slack-ochin-DqwNpetd.js +0 -1
- package/dist/ui/assets/smalltalk-BOQMe2GC.js +0 -1
- package/dist/ui/assets/smithy-cds9vsN8.js +0 -1
- package/dist/ui/assets/snazzy-light-Bw305WKR.js +0 -1
- package/dist/ui/assets/solarized-dark-CpvCGNkr.js +0 -1
- package/dist/ui/assets/solarized-light-Dlz6yCKv.js +0 -1
- package/dist/ui/assets/solidity-DijEV5ha.js +0 -1
- package/dist/ui/assets/soy-8wufbnw4.js +0 -1
- package/dist/ui/assets/sparql-rVzFXLq3.js +0 -1
- package/dist/ui/assets/splunk-BtCnVYZw.js +0 -1
- package/dist/ui/assets/sql-CRqJ_cUM.js +0 -1
- package/dist/ui/assets/ssh-config-_ykCGR6B.js +0 -1
- package/dist/ui/assets/stata-DI20mbqo.js +0 -1
- package/dist/ui/assets/stylus-BEDo0Tqx.js +0 -1
- package/dist/ui/assets/surrealql-Cjom0U5J.js +0 -1
- package/dist/ui/assets/svelte-Cy7k_4gC.js +0 -1
- package/dist/ui/assets/swift-C2oV4EkX.js +0 -1
- package/dist/ui/assets/synthwave-84-CbfX1IO0.js +0 -1
- package/dist/ui/assets/system-verilog-0hqHdDBg.js +0 -1
- package/dist/ui/assets/systemd-4A_iFExJ.js +0 -1
- package/dist/ui/assets/talonscript-CkByrt1z.js +0 -1
- package/dist/ui/assets/tasl-QIJgUcNo.js +0 -1
- package/dist/ui/assets/tcl-dwOrl1Do.js +0 -1
- package/dist/ui/assets/templ-DhtptRzy.js +0 -1
- package/dist/ui/assets/terraform-BETggiCN.js +0 -1
- package/dist/ui/assets/tex-D96PA37w.js +0 -1
- package/dist/ui/assets/tokyo-night-hegEt444.js +0 -1
- package/dist/ui/assets/toml-vGWfd6FD.js +0 -1
- package/dist/ui/assets/ts-tags-D351s5mN.js +0 -1
- package/dist/ui/assets/tsv-B_m7g4N7.js +0 -1
- package/dist/ui/assets/tsx-COt5Ahok.js +0 -1
- package/dist/ui/assets/turtle-BsS91CYL.js +0 -1
- package/dist/ui/assets/twig-27uCiNez.js +0 -1
- package/dist/ui/assets/typescript-BPQ3VLAy.js +0 -1
- package/dist/ui/assets/typespec-CAFt9gP4.js +0 -1
- package/dist/ui/assets/typst-BUadGCkm.js +0 -1
- package/dist/ui/assets/v-BGw2Nkan.js +0 -1
- package/dist/ui/assets/vala-CsfeWuGM.js +0 -1
- package/dist/ui/assets/vb-Cu-pLBUe.js +0 -1
- package/dist/ui/assets/verilog-nZwndyjY.js +0 -1
- package/dist/ui/assets/vesper-DRje8inN.js +0 -1
- package/dist/ui/assets/vhdl-CeAyd5Ju.js +0 -1
- package/dist/ui/assets/viml-CJc9bBzg.js +0 -1
- package/dist/ui/assets/vitesse-black-Bkuqu6BP.js +0 -1
- package/dist/ui/assets/vitesse-dark-D0r3Knsf.js +0 -1
- package/dist/ui/assets/vitesse-light-CVO1_9PV.js +0 -1
- package/dist/ui/assets/vue-BqiEGhQt.js +0 -1
- package/dist/ui/assets/vue-html-AaS7Mt5G.js +0 -1
- package/dist/ui/assets/vue-vine-BoDAl6tE.js +0 -1
- package/dist/ui/assets/vyper-CDx5xZoG.js +0 -1
- package/dist/ui/assets/wasm-MzD3tlZU.js +0 -1
- package/dist/ui/assets/wenyan-BV7otONQ.js +0 -1
- package/dist/ui/assets/wgsl-Dx-B1_4e.js +0 -1
- package/dist/ui/assets/wikitext-BhOHFoWU.js +0 -1
- package/dist/ui/assets/wit-5i3qLPDT.js +0 -1
- package/dist/ui/assets/wolfram-lXgVvXCa.js +0 -1
- package/dist/ui/assets/worker-DsKBD11i.js +0 -156
- package/dist/ui/assets/xml-sdJ4AIDG.js +0 -1
- package/dist/ui/assets/xsl-CtQFsRM5.js +0 -1
- package/dist/ui/assets/yaml-Buea-lGh.js +0 -1
- package/dist/ui/assets/zenscript-DVFEvuxE.js +0 -1
- 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.
|
|
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
|
|
package/dist/api/agent-md.js
CHANGED
|
@@ -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
|
|
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 =
|
|
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
|
-
` ${
|
|
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
|
-
` ${
|
|
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
|
-
|
|
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 "../
|
|
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
|
-
|
|
16
|
-
|
|
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,
|
|
20
|
-
const document = await loadDocument(
|
|
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 ===
|
|
114
|
+
if (groupId === REVIEW_BUCKETS.unassigned) {
|
|
114
115
|
return serializeGroup(ctx.files, ctx.coverage.unassigned);
|
|
115
116
|
}
|
|
116
|
-
if (groupId ===
|
|
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:
|
|
202
|
-
{ kind: "hunks", group:
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
62
|
+
if (!isSourceSide(side)) {
|
|
69
63
|
return undefined;
|
|
70
64
|
}
|
|
71
65
|
const path = parts.slice(3).join("/");
|
|
72
|
-
if (!
|
|
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 (!
|
|
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
|
|
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 (!
|
|
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
|
|
120
|
+
return `api/agent/${agentMdGroupHref(resource.group)}`;
|
|
127
121
|
}
|
|
128
122
|
function jsonStem(file) {
|
|
129
|
-
|
|
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
|
-
|
|
126
|
+
return stem(file, ".md");
|
|
127
|
+
}
|
|
128
|
+
function stem(file, ext) {
|
|
129
|
+
if (!file.endsWith(ext)) {
|
|
137
130
|
return undefined;
|
|
138
131
|
}
|
|
139
|
-
const
|
|
140
|
-
return
|
|
132
|
+
const bare = file.slice(0, -ext.length);
|
|
133
|
+
return bare === "" ? undefined : bare;
|
|
141
134
|
}
|
|
142
|
-
function
|
|
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
|
+
}
|
package/dist/api/snapshot.js
CHANGED
|
@@ -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
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).
|
|
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:
|
|
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") ??
|
|
57
|
+
const port = Number(flag(rest, "--port") ?? String(DEFAULT_PORT));
|
|
50
58
|
if (!Number.isInteger(port) || port < 0) {
|
|
51
|
-
throw new
|
|
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
|
|
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
|
|
97
|
+
throw new ArgError(`${name} requires a value`);
|
|
90
98
|
}
|
|
91
99
|
return value;
|
|
92
100
|
}
|
package/dist/cli/commands.js
CHANGED
|
@@ -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
|
|
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
|
|
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
|
-
|
|
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,
|
|
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
|
|
45
|
-
const
|
|
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
|
|
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 (
|
|
80
|
-
const record = error;
|
|
80
|
+
if (isRecord(error)) {
|
|
81
81
|
return {
|
|
82
|
-
message: typeof
|
|
83
|
-
stdout: bufferText(
|
|
84
|
-
stderr: bufferText(
|
|
85
|
-
code: typeof
|
|
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
|
}
|