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.
- package/LICENSE +21 -0
- package/README.md +94 -0
- package/dist/cli/args.d.ts +20 -0
- package/dist/cli/args.js +89 -0
- package/dist/cli/args.js.map +1 -0
- package/dist/cli/commands.d.ts +12 -0
- package/dist/cli/commands.js +40 -0
- package/dist/cli/commands.js.map +1 -0
- package/dist/cli/main.d.ts +2 -0
- package/dist/cli/main.js +102 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/git/blame.d.ts +8 -0
- package/dist/git/blame.js +36 -0
- package/dist/git/blame.js.map +1 -0
- package/dist/git/diff.d.ts +13 -0
- package/dist/git/diff.js +332 -0
- package/dist/git/diff.js.map +1 -0
- package/dist/git/exec.d.ts +10 -0
- package/dist/git/exec.js +53 -0
- package/dist/git/exec.js.map +1 -0
- package/dist/git/log.d.ts +8 -0
- package/dist/git/log.js +26 -0
- package/dist/git/log.js.map +1 -0
- package/dist/git/repo.d.ts +7 -0
- package/dist/git/repo.js +45 -0
- package/dist/git/repo.js.map +1 -0
- package/dist/git/show.d.ts +2 -0
- package/dist/git/show.js +18 -0
- package/dist/git/show.js.map +1 -0
- package/dist/package-root.d.ts +2 -0
- package/dist/package-root.js +25 -0
- package/dist/package-root.js.map +1 -0
- package/dist/review/coverage.d.ts +20 -0
- package/dist/review/coverage.js +56 -0
- package/dist/review/coverage.js.map +1 -0
- package/dist/review/effort.d.ts +1 -0
- package/dist/review/effort.js +17 -0
- package/dist/review/effort.js.map +1 -0
- package/dist/review/generate.d.ts +20 -0
- package/dist/review/generate.js +290 -0
- package/dist/review/generate.js.map +1 -0
- package/dist/schema/blame-runs.d.ts +14 -0
- package/dist/schema/blame-runs.js +18 -0
- package/dist/schema/blame-runs.js.map +1 -0
- package/dist/schema/hunk-meta.d.ts +26 -0
- package/dist/schema/hunk-meta.js +107 -0
- package/dist/schema/hunk-meta.js.map +1 -0
- package/dist/schema/hunk-patch.d.ts +2 -0
- package/dist/schema/hunk-patch.js +49 -0
- package/dist/schema/hunk-patch.js.map +1 -0
- package/dist/schema/identity.d.ts +3 -0
- package/dist/schema/identity.js +7 -0
- package/dist/schema/identity.js.map +1 -0
- package/dist/schema/parse.d.ts +13 -0
- package/dist/schema/parse.js +258 -0
- package/dist/schema/parse.js.map +1 -0
- package/dist/schema/skill-paths.d.ts +7 -0
- package/dist/schema/skill-paths.js +11 -0
- package/dist/schema/skill-paths.js.map +1 -0
- package/dist/schema/types.d.ts +73 -0
- package/dist/schema/types.js +4 -0
- package/dist/schema/types.js.map +1 -0
- package/dist/server/http.d.ts +12 -0
- package/dist/server/http.js +270 -0
- package/dist/server/http.js.map +1 -0
- package/dist/ui/assets/abap-BdImnpbu.js +1 -0
- package/dist/ui/assets/actionscript-3-B3316cI-.js +1 -0
- package/dist/ui/assets/ada-bCR0ucgS.js +1 -0
- package/dist/ui/assets/ahk-CsyLZFj1.js +1 -0
- package/dist/ui/assets/ahk2-8Zs4aa1G.js +1 -0
- package/dist/ui/assets/andromeeda-C4gqWexZ.js +1 -0
- package/dist/ui/assets/angular-html-DA-rfuFy.js +1 -0
- package/dist/ui/assets/angular-ts-BrjP3tb8.js +1 -0
- package/dist/ui/assets/apache-Pmp26Uib.js +1 -0
- package/dist/ui/assets/apex-DhZFqWV2.js +1 -0
- package/dist/ui/assets/apl-CORt7UWP.js +1 -0
- package/dist/ui/assets/applescript-Co6uUVPk.js +1 -0
- package/dist/ui/assets/ara-BRHolxvo.js +1 -0
- package/dist/ui/assets/asciidoc-CSVQ5wI8.js +1 -0
- package/dist/ui/assets/asm-D_Q5rh1f.js +1 -0
- package/dist/ui/assets/astro-HNnZUWAn.js +1 -0
- package/dist/ui/assets/aurora-x-D-2ljcwZ.js +1 -0
- package/dist/ui/assets/awk-DMzUqQB5.js +1 -0
- package/dist/ui/assets/ayu-dark-DYE7WIF3.js +1 -0
- package/dist/ui/assets/ayu-light-BA47KaF1.js +1 -0
- package/dist/ui/assets/ayu-mirage-32ctXXKs.js +1 -0
- package/dist/ui/assets/ballerina-BFfxhgS-.js +1 -0
- package/dist/ui/assets/bat-CickPsom.js +1 -0
- package/dist/ui/assets/beancount-k_qm7-4y.js +1 -0
- package/dist/ui/assets/berry-uYugtg8r.js +1 -0
- package/dist/ui/assets/bibtex-CHM0blh-.js +1 -0
- package/dist/ui/assets/bicep-Bmn6On1c.js +1 -0
- package/dist/ui/assets/bird2-Bx8U0n9b.js +1 -0
- package/dist/ui/assets/blade-2xfisSek.js +1 -0
- package/dist/ui/assets/bsl-DlhNcFeZ.js +1 -0
- package/dist/ui/assets/c-BIGW1oBm.js +1 -0
- package/dist/ui/assets/c3-Dp5svz6Z.js +1 -0
- package/dist/ui/assets/cadence-Bv_4Rxtq.js +1 -0
- package/dist/ui/assets/cairo-KRGpt6FW.js +1 -0
- package/dist/ui/assets/catppuccin-frappe-CZL1YF0i.js +1 -0
- package/dist/ui/assets/catppuccin-latte-DH-8KZSZ.js +1 -0
- package/dist/ui/assets/catppuccin-macchiato-B7yYVSCf.js +1 -0
- package/dist/ui/assets/catppuccin-mocha-Ct7hS0mc.js +1 -0
- package/dist/ui/assets/chapel-DTp_pixX.js +1 -0
- package/dist/ui/assets/clarity-Dn5IMItf.js +1 -0
- package/dist/ui/assets/clojure-P80f7IUj.js +1 -0
- package/dist/ui/assets/cmake-D1j8_8rp.js +1 -0
- package/dist/ui/assets/cobol-nBiQ_Alo.js +1 -0
- package/dist/ui/assets/codeowners-Bp6g37R7.js +1 -0
- package/dist/ui/assets/codeql-DsOJ9woJ.js +1 -0
- package/dist/ui/assets/coffee-Ch7k5sss.js +1 -0
- package/dist/ui/assets/common-lisp-Cg-RD9OK.js +1 -0
- package/dist/ui/assets/coq-C7JzOVbR.js +1 -0
- package/dist/ui/assets/cpp-BMRokrvK.js +1 -0
- package/dist/ui/assets/crystal-DGywbUpC.js +1 -0
- package/dist/ui/assets/csharp-DSvCPggb.js +1 -0
- package/dist/ui/assets/css-CLj8gQPS.js +1 -0
- package/dist/ui/assets/csv-fuZLfV_i.js +1 -0
- package/dist/ui/assets/cue-D82EKSYY.js +1 -0
- package/dist/ui/assets/cypher-COkxafJQ.js +1 -0
- package/dist/ui/assets/d-85-TOEBH.js +1 -0
- package/dist/ui/assets/dark-plus-C3mMm8J8.js +1 -0
- package/dist/ui/assets/dart-bE4Kk8sk.js +1 -0
- package/dist/ui/assets/dax-CEL-wOlO.js +1 -0
- package/dist/ui/assets/desktop-BmXAJ9_W.js +1 -0
- package/dist/ui/assets/diff-D97Zzqfu.js +1 -0
- package/dist/ui/assets/docker-BcOcwvcX.js +1 -0
- package/dist/ui/assets/dotenv-Da5cRb03.js +1 -0
- package/dist/ui/assets/dracula-BzJJZx-M.js +1 -0
- package/dist/ui/assets/dracula-soft-BXkSAIEj.js +1 -0
- package/dist/ui/assets/dream-maker-BtqSS_iP.js +1 -0
- package/dist/ui/assets/edge-FbVlp4U3.js +1 -0
- package/dist/ui/assets/elixir-CkH2-t6x.js +1 -0
- package/dist/ui/assets/elm-DbKCFpqz.js +1 -0
- package/dist/ui/assets/emacs-lisp-C_m_b--Z.js +1 -0
- package/dist/ui/assets/erb-DXfck5VN.js +1 -0
- package/dist/ui/assets/erlang-DsQrWhSR.js +1 -0
- package/dist/ui/assets/everforest-dark-BgDCqdQA.js +1 -0
- package/dist/ui/assets/everforest-light-C8M2exoo.js +1 -0
- package/dist/ui/assets/fennel-BYunw83y.js +1 -0
- package/dist/ui/assets/fish-BvzEVeQv.js +1 -0
- package/dist/ui/assets/fluent-C4IJs8-o.js +1 -0
- package/dist/ui/assets/fortran-fixed-form-CkoXwp7k.js +1 -0
- package/dist/ui/assets/fortran-free-form-BxgE0vQu.js +1 -0
- package/dist/ui/assets/fsharp-CXgrBDvD.js +1 -0
- package/dist/ui/assets/gdresource-TyuKm33G.js +1 -0
- package/dist/ui/assets/gdscript-DqcFQ5yU.js +1 -0
- package/dist/ui/assets/gdshader-DkwncUOv.js +1 -0
- package/dist/ui/assets/genie-D0YGMca9.js +1 -0
- package/dist/ui/assets/gherkin-DyxjwDmM.js +1 -0
- package/dist/ui/assets/git-commit-F4YmCXRG.js +1 -0
- package/dist/ui/assets/git-rebase-r7XF79zn.js +1 -0
- package/dist/ui/assets/github-dark-DHJKELXO.js +1 -0
- package/dist/ui/assets/github-dark-default-Cuk6v7N8.js +1 -0
- package/dist/ui/assets/github-dark-dimmed-DH5Ifo-i.js +1 -0
- package/dist/ui/assets/github-dark-high-contrast-E3gJ1_iC.js +1 -0
- package/dist/ui/assets/github-light-DAi9KRSo.js +1 -0
- package/dist/ui/assets/github-light-default-D7oLnXFd.js +1 -0
- package/dist/ui/assets/github-light-high-contrast-BfjtVDDH.js +1 -0
- package/dist/ui/assets/gleam-BspZqrRM.js +1 -0
- package/dist/ui/assets/glimmer-js-ByusRIyA.js +1 -0
- package/dist/ui/assets/glimmer-ts-BfAWNZQY.js +1 -0
- package/dist/ui/assets/glsl-DplSGwfg.js +1 -0
- package/dist/ui/assets/gn-n2N0HUVH.js +1 -0
- package/dist/ui/assets/gnuplot-DdkO51Og.js +1 -0
- package/dist/ui/assets/go-C27-OAKa.js +1 -0
- package/dist/ui/assets/graphql-ChdNCCLP.js +1 -0
- package/dist/ui/assets/groovy-gcz8RCvz.js +1 -0
- package/dist/ui/assets/gruvbox-dark-hard-CFHQjOhq.js +1 -0
- package/dist/ui/assets/gruvbox-dark-medium-GsRaNv29.js +1 -0
- package/dist/ui/assets/gruvbox-dark-soft-CVdnzihN.js +1 -0
- package/dist/ui/assets/gruvbox-light-hard-CH1njM8p.js +1 -0
- package/dist/ui/assets/gruvbox-light-medium-DRw_LuNl.js +1 -0
- package/dist/ui/assets/gruvbox-light-soft-hJgmCMqR.js +1 -0
- package/dist/ui/assets/hack-BWmVpMyf.js +1 -0
- package/dist/ui/assets/haml-D5jkg6IW.js +1 -0
- package/dist/ui/assets/handlebars-BpdQsYii.js +1 -0
- package/dist/ui/assets/haskell-Df6bDoY_.js +1 -0
- package/dist/ui/assets/haxe-CfZj7gIn.js +1 -0
- package/dist/ui/assets/hcl-BWvSN4gD.js +1 -0
- package/dist/ui/assets/hjson-D5-asLiD.js +1 -0
- package/dist/ui/assets/hlsl-D3lLCCz7.js +1 -0
- package/dist/ui/assets/horizon-BUw7H-hv.js +1 -0
- package/dist/ui/assets/horizon-bright-CUuTKBJd.js +1 -0
- package/dist/ui/assets/houston-DnULxvSX.js +1 -0
- package/dist/ui/assets/html-derivative-DlHx6ybY.js +1 -0
- package/dist/ui/assets/html-pp8916En.js +1 -0
- package/dist/ui/assets/http-jrhK8wxY.js +1 -0
- package/dist/ui/assets/hurl-irOxFIW8.js +1 -0
- package/dist/ui/assets/hxml-2-FPmUDs.js +1 -0
- package/dist/ui/assets/hy-DFXneXwc.js +1 -0
- package/dist/ui/assets/ibm-plex-mono-cyrillic-400-normal-BSMlKf0J.woff2 +0 -0
- package/dist/ui/assets/ibm-plex-mono-cyrillic-400-normal-CEL4l2ZJ.woff +0 -0
- package/dist/ui/assets/ibm-plex-mono-cyrillic-500-normal-Ael50iVv.woff +0 -0
- package/dist/ui/assets/ibm-plex-mono-cyrillic-500-normal-Bq9vWWag.woff2 +0 -0
- package/dist/ui/assets/ibm-plex-mono-cyrillic-ext-400-normal-DMdlQ8Kv.woff +0 -0
- package/dist/ui/assets/ibm-plex-mono-cyrillic-ext-400-normal-xuaO2J-f.woff2 +0 -0
- package/dist/ui/assets/ibm-plex-mono-cyrillic-ext-500-normal-BIfNGwUT.woff +0 -0
- package/dist/ui/assets/ibm-plex-mono-cyrillic-ext-500-normal-BqneJy0T.woff2 +0 -0
- package/dist/ui/assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff +0 -0
- package/dist/ui/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2 +0 -0
- package/dist/ui/assets/ibm-plex-mono-latin-500-normal-CB9ihrfo.woff +0 -0
- package/dist/ui/assets/ibm-plex-mono-latin-500-normal-DSY6xOcd.woff2 +0 -0
- package/dist/ui/assets/ibm-plex-mono-latin-ext-400-normal-BmRBH3aV.woff2 +0 -0
- package/dist/ui/assets/ibm-plex-mono-latin-ext-400-normal-D3D2R8hC.woff +0 -0
- package/dist/ui/assets/ibm-plex-mono-latin-ext-500-normal-CAhNIIs5.woff2 +0 -0
- package/dist/ui/assets/ibm-plex-mono-latin-ext-500-normal-CZ70TYgx.woff +0 -0
- package/dist/ui/assets/ibm-plex-mono-vietnamese-400-normal-BulugwFq.woff2 +0 -0
- package/dist/ui/assets/ibm-plex-mono-vietnamese-400-normal-DDuiU_S-.woff +0 -0
- package/dist/ui/assets/ibm-plex-mono-vietnamese-500-normal-C8zxqsMH.woff +0 -0
- package/dist/ui/assets/ibm-plex-mono-vietnamese-500-normal-DZ4AoWbu.woff2 +0 -0
- package/dist/ui/assets/ibm-plex-sans-cyrillic-400-normal-BTotfTJu.woff +0 -0
- package/dist/ui/assets/ibm-plex-sans-cyrillic-400-normal-DZqxrq2p.woff2 +0 -0
- package/dist/ui/assets/ibm-plex-sans-cyrillic-500-normal-ByOcLdNv.woff +0 -0
- package/dist/ui/assets/ibm-plex-sans-cyrillic-500-normal-CocWQlwt.woff2 +0 -0
- package/dist/ui/assets/ibm-plex-sans-cyrillic-600-normal-71GNu3SW.woff2 +0 -0
- package/dist/ui/assets/ibm-plex-sans-cyrillic-600-normal-BGq0mW3O.woff +0 -0
- package/dist/ui/assets/ibm-plex-sans-cyrillic-ext-400-normal-Dsrv2Tcn.woff +0 -0
- package/dist/ui/assets/ibm-plex-sans-cyrillic-ext-400-normal-g30qAdWV.woff2 +0 -0
- package/dist/ui/assets/ibm-plex-sans-cyrillic-ext-500-normal-Cs5J6C77.woff2 +0 -0
- package/dist/ui/assets/ibm-plex-sans-cyrillic-ext-500-normal-DB5PtV2g.woff +0 -0
- package/dist/ui/assets/ibm-plex-sans-cyrillic-ext-600-normal-Bz0x94Yp.woff +0 -0
- package/dist/ui/assets/ibm-plex-sans-cyrillic-ext-600-normal-DUMzJB7m.woff2 +0 -0
- package/dist/ui/assets/ibm-plex-sans-greek-400-normal-D9ESIMu3.woff +0 -0
- package/dist/ui/assets/ibm-plex-sans-greek-400-normal-_efipK4i.woff2 +0 -0
- package/dist/ui/assets/ibm-plex-sans-greek-500-normal-CuWXN6rf.woff +0 -0
- package/dist/ui/assets/ibm-plex-sans-greek-500-normal-JMMifIXV.woff2 +0 -0
- package/dist/ui/assets/ibm-plex-sans-greek-600-normal-D-CqTdkO.woff +0 -0
- package/dist/ui/assets/ibm-plex-sans-greek-600-normal-DzTrcv_p.woff2 +0 -0
- package/dist/ui/assets/ibm-plex-sans-latin-400-normal-CDDApCn2.woff2 +0 -0
- package/dist/ui/assets/ibm-plex-sans-latin-400-normal-CYLoc0-x.woff +0 -0
- package/dist/ui/assets/ibm-plex-sans-latin-500-normal-6ng42L7E.woff2 +0 -0
- package/dist/ui/assets/ibm-plex-sans-latin-500-normal-BgVn5rGT.woff +0 -0
- package/dist/ui/assets/ibm-plex-sans-latin-600-normal-Cu4Hd6ag.woff +0 -0
- package/dist/ui/assets/ibm-plex-sans-latin-600-normal-CuJfVYMP.woff2 +0 -0
- package/dist/ui/assets/ibm-plex-sans-latin-ext-400-normal-C5H60-Va.woff2 +0 -0
- package/dist/ui/assets/ibm-plex-sans-latin-ext-400-normal-RBey6euL.woff +0 -0
- package/dist/ui/assets/ibm-plex-sans-latin-ext-500-normal-D0aIdm-b.woff +0 -0
- package/dist/ui/assets/ibm-plex-sans-latin-ext-500-normal-DakdToA3.woff2 +0 -0
- package/dist/ui/assets/ibm-plex-sans-latin-ext-600-normal-DIrixKbi.woff +0 -0
- package/dist/ui/assets/ibm-plex-sans-latin-ext-600-normal-DOrvGEcy.woff2 +0 -0
- package/dist/ui/assets/ibm-plex-sans-vietnamese-400-normal-DG4YqDda.woff2 +0 -0
- package/dist/ui/assets/ibm-plex-sans-vietnamese-400-normal-fK1oJ5dG.woff +0 -0
- package/dist/ui/assets/ibm-plex-sans-vietnamese-500-normal-BEb3_waV.woff +0 -0
- package/dist/ui/assets/ibm-plex-sans-vietnamese-500-normal-e4dixQRQ.woff2 +0 -0
- package/dist/ui/assets/ibm-plex-sans-vietnamese-600-normal-DgdngZtN.woff +0 -0
- package/dist/ui/assets/ibm-plex-sans-vietnamese-600-normal-DpPYBSTl.woff2 +0 -0
- package/dist/ui/assets/imba-DGztddWO.js +1 -0
- package/dist/ui/assets/index-BCZwzr3E.js +1585 -0
- package/dist/ui/assets/index-DsGDgUsX.css +1 -0
- package/dist/ui/assets/ini-BEwlwnbL.js +1 -0
- package/dist/ui/assets/java-CylS5w8V.js +1 -0
- package/dist/ui/assets/javascript-wDzz0qaB.js +1 -0
- package/dist/ui/assets/jinja-f2NsQr07.js +1 -0
- package/dist/ui/assets/jison-wvAkD_A8.js +1 -0
- package/dist/ui/assets/json-Cp-IABpG.js +1 -0
- package/dist/ui/assets/json5-C9tS-k6U.js +1 -0
- package/dist/ui/assets/jsonc-Des-eS-w.js +1 -0
- package/dist/ui/assets/jsonl-DcaNXYhu.js +1 -0
- package/dist/ui/assets/jsonnet-DFQXde-d.js +1 -0
- package/dist/ui/assets/jssm-C2t-YnRu.js +1 -0
- package/dist/ui/assets/jsx-g9-lgVsj.js +1 -0
- package/dist/ui/assets/julia-5Bft2YPA.js +1 -0
- package/dist/ui/assets/just-Cwhn7H3k.js +1 -0
- package/dist/ui/assets/kanagawa-dragon-BuwD2xS4.js +1 -0
- package/dist/ui/assets/kanagawa-lotus-C3DzagqV.js +1 -0
- package/dist/ui/assets/kanagawa-wave-DFGoQZhC.js +1 -0
- package/dist/ui/assets/kdl-DV7GczEv.js +1 -0
- package/dist/ui/assets/kotlin-BdnUsdx6.js +1 -0
- package/dist/ui/assets/kusto-wEQ09or8.js +1 -0
- package/dist/ui/assets/laserwave-DUszq2jm.js +1 -0
- package/dist/ui/assets/latex-D5pSuvFb.js +1 -0
- package/dist/ui/assets/lean-BZvkOJ9d.js +1 -0
- package/dist/ui/assets/less-B1dDrJ26.js +1 -0
- package/dist/ui/assets/light-plus-B7mTdjB0.js +1 -0
- package/dist/ui/assets/liquid-C0sCDyMI.js +1 -0
- package/dist/ui/assets/llvm-BZoOZj88.js +1 -0
- package/dist/ui/assets/log-2UxHyX5q.js +1 -0
- package/dist/ui/assets/logo-BtOb2qkB.js +1 -0
- package/dist/ui/assets/lua-BaeVxFsk.js +1 -0
- package/dist/ui/assets/luau-BnpPk5vE.js +1 -0
- package/dist/ui/assets/make-CHLpvVh8.js +1 -0
- package/dist/ui/assets/markdown-Cvjx9yec.js +1 -0
- package/dist/ui/assets/marko-DjSrsDqO.js +1 -0
- package/dist/ui/assets/material-theme-D5KoaKCx.js +1 -0
- package/dist/ui/assets/material-theme-darker-BfHTSMKl.js +1 -0
- package/dist/ui/assets/material-theme-lighter-B0m2ddpp.js +1 -0
- package/dist/ui/assets/material-theme-ocean-CyktbL80.js +1 -0
- package/dist/ui/assets/material-theme-palenight-Csfq5Kiy.js +1 -0
- package/dist/ui/assets/matlab-D7o27uSR.js +1 -0
- package/dist/ui/assets/mdc-D1_yUvq7.js +1 -0
- package/dist/ui/assets/mdx-Cmh6b_Ma.js +1 -0
- package/dist/ui/assets/mermaid-CQcHuHx7.js +1 -0
- package/dist/ui/assets/min-dark-CafNBF8u.js +1 -0
- package/dist/ui/assets/min-light-CTRr51gU.js +1 -0
- package/dist/ui/assets/mipsasm-CKIfxQSi.js +1 -0
- package/dist/ui/assets/mojo-DJz3ZmWd.js +1 -0
- package/dist/ui/assets/monokai-BRVnQi9A.js +1 -0
- package/dist/ui/assets/moonbit-CHtswR0a.js +1 -0
- package/dist/ui/assets/move-el3G9tDJ.js +1 -0
- package/dist/ui/assets/narrat-DRg8JJMk.js +1 -0
- package/dist/ui/assets/nextflow-C-mBbutL.js +1 -0
- package/dist/ui/assets/nextflow-groovy-vE_lwT2v.js +1 -0
- package/dist/ui/assets/nginx-BpAMiNFr.js +1 -0
- package/dist/ui/assets/night-owl-C39BiMTA.js +1 -0
- package/dist/ui/assets/night-owl-light-CMTm3GFP.js +1 -0
- package/dist/ui/assets/nim-BIad80T-.js +1 -0
- package/dist/ui/assets/nix-CwoSXNpI.js +1 -0
- package/dist/ui/assets/nord-Ddv68eIx.js +1 -0
- package/dist/ui/assets/nsis-BlV79W_Q.js +1 -0
- package/dist/ui/assets/nushell-D3jzshHO.js +1 -0
- package/dist/ui/assets/objective-c-DXmwc3jG.js +1 -0
- package/dist/ui/assets/objective-cpp-CLxacb5B.js +1 -0
- package/dist/ui/assets/ocaml-C0hk2d4L.js +1 -0
- package/dist/ui/assets/odin-BBf5iR-q.js +1 -0
- package/dist/ui/assets/one-dark-pro-DVMEJ2y_.js +1 -0
- package/dist/ui/assets/one-light-C3Wv6jpd.js +1 -0
- package/dist/ui/assets/openscad-C4EeE6gA.js +1 -0
- package/dist/ui/assets/org-DM6o9KBp.js +1 -0
- package/dist/ui/assets/pascal-D93ZcfNL.js +1 -0
- package/dist/ui/assets/perl-B9cMNwum.js +1 -0
- package/dist/ui/assets/php-Csjmro_R.js +1 -0
- package/dist/ui/assets/pierre-dark-CyvmCCZW.js +1 -0
- package/dist/ui/assets/pierre-dark-protanopia-deuteranopia-Rgc0TwpF.js +1 -0
- package/dist/ui/assets/pierre-dark-soft-BHGpRqa4.js +1 -0
- package/dist/ui/assets/pierre-dark-tritanopia-Beq2gCRQ.js +1 -0
- package/dist/ui/assets/pierre-dark-vibrant-BWBVywrn.js +1 -0
- package/dist/ui/assets/pierre-light-480U9XYS.js +1 -0
- package/dist/ui/assets/pierre-light-protanopia-deuteranopia-CaVOBURG.js +1 -0
- package/dist/ui/assets/pierre-light-soft-CVdyfjmI.js +1 -0
- package/dist/ui/assets/pierre-light-tritanopia-B4_gpKOM.js +1 -0
- package/dist/ui/assets/pierre-light-vibrant-DdTDNdfJ.js +1 -0
- package/dist/ui/assets/pkl-u5AG7uiY.js +1 -0
- package/dist/ui/assets/plastic-3e1v2bzS.js +1 -0
- package/dist/ui/assets/plsql-ChMvpjG-.js +1 -0
- package/dist/ui/assets/po-BTJTHyun.js +1 -0
- package/dist/ui/assets/poimandres-CS3Unz2-.js +1 -0
- package/dist/ui/assets/polar-C0HS_06l.js +1 -0
- package/dist/ui/assets/postcss-CXtECtnM.js +1 -0
- package/dist/ui/assets/powerquery-CEu0bR-o.js +1 -0
- package/dist/ui/assets/powershell-BmBUJMz7.js +1 -0
- package/dist/ui/assets/prisma-Vru482bI.js +1 -0
- package/dist/ui/assets/prolog-CbFg5uaA.js +1 -0
- package/dist/ui/assets/proto-C7zT0LnQ.js +1 -0
- package/dist/ui/assets/pug-DKIMFp6K.js +1 -0
- package/dist/ui/assets/puppet-BMWR74SV.js +1 -0
- package/dist/ui/assets/purescript-CklMAg4u.js +1 -0
- package/dist/ui/assets/python-B6aJPvgy.js +1 -0
- package/dist/ui/assets/qml-3beO22l8.js +1 -0
- package/dist/ui/assets/qmldir-C8lEn-DE.js +1 -0
- package/dist/ui/assets/qss-IeuSbFQv.js +1 -0
- package/dist/ui/assets/r-Cf5RLm7j.js +1 -0
- package/dist/ui/assets/racket-BqYA7rlc.js +1 -0
- package/dist/ui/assets/raku-DXvB9xmW.js +1 -0
- package/dist/ui/assets/razor-BjBPvh-w.js +1 -0
- package/dist/ui/assets/rbs-CpoqiR4B.js +1 -0
- package/dist/ui/assets/red-hvxz__6c.js +1 -0
- package/dist/ui/assets/reg-C-SQnVFl.js +1 -0
- package/dist/ui/assets/regexp-CDVJQ6XC.js +1 -0
- package/dist/ui/assets/rel-C3B-1QV4.js +1 -0
- package/dist/ui/assets/riscv-BM1_JUlF.js +1 -0
- package/dist/ui/assets/ron-D8l8udqQ.js +1 -0
- package/dist/ui/assets/rose-pine-5qJOZa0Y.js +1 -0
- package/dist/ui/assets/rose-pine-dawn-zx0QlTCp.js +1 -0
- package/dist/ui/assets/rose-pine-moon-C9pEdX9L.js +1 -0
- package/dist/ui/assets/rosmsg-BJDFO7_C.js +1 -0
- package/dist/ui/assets/rst-bs7f0vWN.js +1 -0
- package/dist/ui/assets/ruby-C0TQ7zu5.js +1 -0
- package/dist/ui/assets/rust-B1yitclQ.js +1 -0
- package/dist/ui/assets/sas-DEy46yEz.js +1 -0
- package/dist/ui/assets/sass-Cj5Yp3dK.js +1 -0
- package/dist/ui/assets/scala-CqE71os6.js +1 -0
- package/dist/ui/assets/scheme-C98Dy4si.js +1 -0
- package/dist/ui/assets/scss-D5BDwBP9.js +1 -0
- package/dist/ui/assets/sdbl-DVxCFoDh.js +1 -0
- package/dist/ui/assets/shaderlab-Dg9Lc6iA.js +1 -0
- package/dist/ui/assets/shellscript-Yzrsuije.js +1 -0
- package/dist/ui/assets/shellsession-BADoaaVG.js +1 -0
- package/dist/ui/assets/slack-dark-BthQWCQV.js +1 -0
- package/dist/ui/assets/slack-ochin-DqwNpetd.js +1 -0
- package/dist/ui/assets/smalltalk-BOQMe2GC.js +1 -0
- package/dist/ui/assets/smithy-cds9vsN8.js +1 -0
- package/dist/ui/assets/snazzy-light-Bw305WKR.js +1 -0
- package/dist/ui/assets/solarized-dark-CpvCGNkr.js +1 -0
- package/dist/ui/assets/solarized-light-Dlz6yCKv.js +1 -0
- package/dist/ui/assets/solidity-DijEV5ha.js +1 -0
- package/dist/ui/assets/source-serif-4-cyrillic-400-normal-B8Z6Jvzv.woff +0 -0
- package/dist/ui/assets/source-serif-4-cyrillic-400-normal-C44pakCn.woff2 +0 -0
- package/dist/ui/assets/source-serif-4-cyrillic-600-normal-BDP5YDHD.woff2 +0 -0
- package/dist/ui/assets/source-serif-4-cyrillic-600-normal-DFnC3vAY.woff +0 -0
- package/dist/ui/assets/source-serif-4-cyrillic-ext-400-normal-CWV284fw.woff2 +0 -0
- package/dist/ui/assets/source-serif-4-cyrillic-ext-400-normal-DLkyKLvH.woff +0 -0
- package/dist/ui/assets/source-serif-4-cyrillic-ext-600-normal-D_E8FDgP.woff2 +0 -0
- package/dist/ui/assets/source-serif-4-cyrillic-ext-600-normal-DiT2IGQm.woff +0 -0
- package/dist/ui/assets/source-serif-4-greek-400-normal-BccYJ-vZ.woff +0 -0
- package/dist/ui/assets/source-serif-4-greek-400-normal-Cw5-AHNN.woff2 +0 -0
- package/dist/ui/assets/source-serif-4-greek-600-normal-DdRkKr-1.woff2 +0 -0
- package/dist/ui/assets/source-serif-4-greek-600-normal-DhXQw1Kl.woff +0 -0
- package/dist/ui/assets/source-serif-4-latin-400-normal-DJ5YJwmz.woff2 +0 -0
- package/dist/ui/assets/source-serif-4-latin-400-normal-Dn3IlU-Z.woff +0 -0
- package/dist/ui/assets/source-serif-4-latin-600-normal-DMD1h6_f.woff +0 -0
- package/dist/ui/assets/source-serif-4-latin-600-normal-DouSKlru.woff2 +0 -0
- package/dist/ui/assets/source-serif-4-latin-ext-400-normal-CEpydyUl.woff +0 -0
- package/dist/ui/assets/source-serif-4-latin-ext-400-normal-Cp7z-ARB.woff2 +0 -0
- package/dist/ui/assets/source-serif-4-latin-ext-600-normal-0sIUyHMO.woff2 +0 -0
- package/dist/ui/assets/source-serif-4-latin-ext-600-normal-C6NNqpJh.woff +0 -0
- package/dist/ui/assets/source-serif-4-vietnamese-400-normal-BbG3LG1A.woff2 +0 -0
- package/dist/ui/assets/source-serif-4-vietnamese-400-normal-DR1UuFon.woff +0 -0
- package/dist/ui/assets/source-serif-4-vietnamese-600-normal-B0WJbuqT.woff +0 -0
- package/dist/ui/assets/source-serif-4-vietnamese-600-normal-CznyfUKR.woff2 +0 -0
- package/dist/ui/assets/soy-8wufbnw4.js +1 -0
- package/dist/ui/assets/sparql-rVzFXLq3.js +1 -0
- package/dist/ui/assets/splunk-BtCnVYZw.js +1 -0
- package/dist/ui/assets/sql-CRqJ_cUM.js +1 -0
- package/dist/ui/assets/ssh-config-_ykCGR6B.js +1 -0
- package/dist/ui/assets/stata-DI20mbqo.js +1 -0
- package/dist/ui/assets/stylus-BEDo0Tqx.js +1 -0
- package/dist/ui/assets/surrealql-Cjom0U5J.js +1 -0
- package/dist/ui/assets/svelte-Cy7k_4gC.js +1 -0
- package/dist/ui/assets/swift-C2oV4EkX.js +1 -0
- package/dist/ui/assets/synthwave-84-CbfX1IO0.js +1 -0
- package/dist/ui/assets/system-verilog-0hqHdDBg.js +1 -0
- package/dist/ui/assets/systemd-4A_iFExJ.js +1 -0
- package/dist/ui/assets/talonscript-CkByrt1z.js +1 -0
- package/dist/ui/assets/tasl-QIJgUcNo.js +1 -0
- package/dist/ui/assets/tcl-dwOrl1Do.js +1 -0
- package/dist/ui/assets/templ-DhtptRzy.js +1 -0
- package/dist/ui/assets/terraform-BETggiCN.js +1 -0
- package/dist/ui/assets/tex-D96PA37w.js +1 -0
- package/dist/ui/assets/tokyo-night-hegEt444.js +1 -0
- package/dist/ui/assets/toml-vGWfd6FD.js +1 -0
- package/dist/ui/assets/ts-tags-D351s5mN.js +1 -0
- package/dist/ui/assets/tsv-B_m7g4N7.js +1 -0
- package/dist/ui/assets/tsx-COt5Ahok.js +1 -0
- package/dist/ui/assets/turtle-BsS91CYL.js +1 -0
- package/dist/ui/assets/twig-27uCiNez.js +1 -0
- package/dist/ui/assets/typescript-BPQ3VLAy.js +1 -0
- package/dist/ui/assets/typespec-CAFt9gP4.js +1 -0
- package/dist/ui/assets/typst-BUadGCkm.js +1 -0
- package/dist/ui/assets/v-BGw2Nkan.js +1 -0
- package/dist/ui/assets/vala-CsfeWuGM.js +1 -0
- package/dist/ui/assets/vb-Cu-pLBUe.js +1 -0
- package/dist/ui/assets/verilog-nZwndyjY.js +1 -0
- package/dist/ui/assets/vesper-DRje8inN.js +1 -0
- package/dist/ui/assets/vhdl-CeAyd5Ju.js +1 -0
- package/dist/ui/assets/viml-CJc9bBzg.js +1 -0
- package/dist/ui/assets/vitesse-black-Bkuqu6BP.js +1 -0
- package/dist/ui/assets/vitesse-dark-D0r3Knsf.js +1 -0
- package/dist/ui/assets/vitesse-light-CVO1_9PV.js +1 -0
- package/dist/ui/assets/vue-BqiEGhQt.js +1 -0
- package/dist/ui/assets/vue-html-AaS7Mt5G.js +1 -0
- package/dist/ui/assets/vue-vine-BoDAl6tE.js +1 -0
- package/dist/ui/assets/vyper-CDx5xZoG.js +1 -0
- package/dist/ui/assets/wasm-CG6Dc4jp.js +1 -0
- package/dist/ui/assets/wasm-MzD3tlZU.js +1 -0
- package/dist/ui/assets/wenyan-BV7otONQ.js +1 -0
- package/dist/ui/assets/wgsl-Dx-B1_4e.js +1 -0
- package/dist/ui/assets/wikitext-BhOHFoWU.js +1 -0
- package/dist/ui/assets/wit-5i3qLPDT.js +1 -0
- package/dist/ui/assets/wolfram-lXgVvXCa.js +1 -0
- package/dist/ui/assets/worker-DsKBD11i.js +156 -0
- package/dist/ui/assets/xml-sdJ4AIDG.js +1 -0
- package/dist/ui/assets/xsl-CtQFsRM5.js +1 -0
- package/dist/ui/assets/yaml-Buea-lGh.js +1 -0
- package/dist/ui/assets/zenscript-DVFEvuxE.js +1 -0
- package/dist/ui/assets/zig-VOosw3JB.js +1 -0
- package/dist/ui/index.html +13 -0
- package/package.json +74 -0
- package/skills/comprehende/SKILL.md +68 -0
- package/skills/comprehende/references/example.md +55 -0
- package/skills/comprehende/references/review.schema.json +92 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coverage.js","sourceRoot":"","sources":["../../src/review/coverage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function reviewEffort(fileCount: number, hunkCount: number): 1 | 2 | 3 | 4 | 5;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export function reviewEffort(fileCount, hunkCount) {
|
|
2
|
+
const score = fileCount + hunkCount / 3;
|
|
3
|
+
if (score <= 3) {
|
|
4
|
+
return 1;
|
|
5
|
+
}
|
|
6
|
+
if (score <= 8) {
|
|
7
|
+
return 2;
|
|
8
|
+
}
|
|
9
|
+
if (score <= 20) {
|
|
10
|
+
return 3;
|
|
11
|
+
}
|
|
12
|
+
if (score <= 40) {
|
|
13
|
+
return 4;
|
|
14
|
+
}
|
|
15
|
+
return 5;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=effort.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"effort.js","sourceRoot":"","sources":["../../src/review/effort.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,YAAY,CAAC,SAAiB,EAAE,SAAiB;IAC/D,MAAM,KAAK,GAAG,SAAS,GAAG,SAAS,GAAG,CAAC,CAAC;IACxC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QACf,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QACf,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,KAAK,IAAI,EAAE,EAAE,CAAC;QAChB,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,KAAK,IAAI,EAAE,EAAE,CAAC;QAChB,OAAO,CAAC,CAAC;IACX,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { type CommitInfo } from "../git/log.ts";
|
|
2
|
+
import type { HunkIndex, HunkRef, ReviewDocument, ReviewGroup } from "../schema/types.ts";
|
|
3
|
+
export type Kind = "contracts" | "feature" | "tests" | "docs" | "chores";
|
|
4
|
+
export type Cluster = {
|
|
5
|
+
id: string;
|
|
6
|
+
kind: Kind;
|
|
7
|
+
title: string;
|
|
8
|
+
hunks: HunkRef[];
|
|
9
|
+
};
|
|
10
|
+
export declare function generateReviewDocument(cwd: string, index: HunkIndex): Promise<ReviewDocument>;
|
|
11
|
+
export declare function clusterHunks(hunks: HunkRef[]): Cluster[];
|
|
12
|
+
export type GroupBrief = {
|
|
13
|
+
summary: string;
|
|
14
|
+
lookFor: string[];
|
|
15
|
+
};
|
|
16
|
+
export declare function briefGroup(cluster: Cluster, paths: string[], commits: CommitInfo[]): GroupBrief;
|
|
17
|
+
export declare function assignDependsOn(drafts: {
|
|
18
|
+
group: ReviewGroup;
|
|
19
|
+
kind: Kind;
|
|
20
|
+
}[]): void;
|
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
import { toHunkRef } from "../git/diff.js";
|
|
2
|
+
import { commitsTouching, listCommits } from "../git/log.js";
|
|
3
|
+
import { hunkKey } from "../schema/identity.js";
|
|
4
|
+
const CHORE_FILES = new Set([
|
|
5
|
+
"package.json",
|
|
6
|
+
"package-lock.json",
|
|
7
|
+
"pnpm-lock.yaml",
|
|
8
|
+
"yarn.lock",
|
|
9
|
+
"Cargo.lock",
|
|
10
|
+
"go.sum",
|
|
11
|
+
"composer.lock",
|
|
12
|
+
".gitignore",
|
|
13
|
+
".gitattributes",
|
|
14
|
+
".editorconfig",
|
|
15
|
+
".nvmrc",
|
|
16
|
+
"LICENSE",
|
|
17
|
+
"LICENSE.md",
|
|
18
|
+
]);
|
|
19
|
+
export async function generateReviewDocument(cwd, index) {
|
|
20
|
+
const clusters = clusterHunks(index.hunks);
|
|
21
|
+
const drafts = [];
|
|
22
|
+
let order = 0;
|
|
23
|
+
for (const cluster of clusters) {
|
|
24
|
+
const paths = unique(cluster.hunks.flatMap((hunk) => (hunk.oldPath !== undefined ? [hunk.oldPath, hunk.path] : [hunk.path])));
|
|
25
|
+
const commits = await commitsTouching(cwd, index.source.baseRef, index.source.headRef, paths);
|
|
26
|
+
const brief = briefGroup(cluster, paths, commits);
|
|
27
|
+
const group = {
|
|
28
|
+
id: cluster.id,
|
|
29
|
+
title: cluster.title,
|
|
30
|
+
summary: brief.summary,
|
|
31
|
+
suggestedOrder: order,
|
|
32
|
+
hunkRefs: cluster.hunks.map(toHunkRef),
|
|
33
|
+
};
|
|
34
|
+
if (brief.lookFor.length > 0) {
|
|
35
|
+
group.lookFor = brief.lookFor;
|
|
36
|
+
}
|
|
37
|
+
drafts.push({ group, kind: cluster.kind });
|
|
38
|
+
order += 1;
|
|
39
|
+
}
|
|
40
|
+
assignDependsOn(drafts);
|
|
41
|
+
const allCommits = await listCommits(cwd, index.source.baseRef, index.source.headRef);
|
|
42
|
+
const tickets = ticketsFromCommits(allCommits);
|
|
43
|
+
const walkthrough = walkthroughFrom(allCommits);
|
|
44
|
+
const document = {
|
|
45
|
+
version: 1,
|
|
46
|
+
source: index.source,
|
|
47
|
+
groups: drafts.map((draft) => draft.group),
|
|
48
|
+
};
|
|
49
|
+
if (walkthrough !== undefined) {
|
|
50
|
+
document.walkthrough = walkthrough;
|
|
51
|
+
}
|
|
52
|
+
if (tickets.length > 0) {
|
|
53
|
+
document.tickets = tickets;
|
|
54
|
+
}
|
|
55
|
+
return document;
|
|
56
|
+
}
|
|
57
|
+
export function clusterHunks(hunks) {
|
|
58
|
+
const buckets = new Map();
|
|
59
|
+
const take = (id, kind, title) => {
|
|
60
|
+
const existing = buckets.get(id);
|
|
61
|
+
if (existing !== undefined) {
|
|
62
|
+
return existing;
|
|
63
|
+
}
|
|
64
|
+
const cluster = { id, kind, title, hunks: [] };
|
|
65
|
+
buckets.set(id, cluster);
|
|
66
|
+
return cluster;
|
|
67
|
+
};
|
|
68
|
+
for (const hunk of hunks) {
|
|
69
|
+
const kind = classify(hunk.path);
|
|
70
|
+
if (kind === "chores") {
|
|
71
|
+
take("chores", "chores", "Chores and lockfiles").hunks.push(hunk);
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
if (kind === "docs") {
|
|
75
|
+
take("docs", "docs", "Documentation").hunks.push(hunk);
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
if (kind === "contracts") {
|
|
79
|
+
take("contracts", "contracts", "Contracts and types").hunks.push(hunk);
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
if (kind === "tests") {
|
|
83
|
+
const partner = partnerKey(hunk.path);
|
|
84
|
+
const feature = buckets.get(`feature:${partner}`);
|
|
85
|
+
if (feature !== undefined) {
|
|
86
|
+
feature.hunks.push(hunk);
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
take(`tests:${partner}`, "tests", testTitle(hunk.path)).hunks.push(hunk);
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
const key = featureKey(hunk.path);
|
|
93
|
+
take(`feature:${key}`, "feature", featureTitle(key)).hunks.push(hunk);
|
|
94
|
+
}
|
|
95
|
+
for (const hunk of hunks) {
|
|
96
|
+
if (classify(hunk.path) !== "tests") {
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
const partner = partnerKey(hunk.path);
|
|
100
|
+
const tests = buckets.get(`tests:${partner}`);
|
|
101
|
+
const feature = buckets.get(`feature:${partner}`);
|
|
102
|
+
if (tests !== undefined && feature !== undefined) {
|
|
103
|
+
feature.hunks.push(...tests.hunks);
|
|
104
|
+
buckets.delete(`tests:${partner}`);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
const clusters = [...buckets.values()];
|
|
108
|
+
const order = new Map(hunks.map((hunk, index) => [hunkKey(hunk), index]));
|
|
109
|
+
for (const cluster of clusters) {
|
|
110
|
+
cluster.hunks.sort((a, b) => (order.get(hunkKey(a)) ?? 0) - (order.get(hunkKey(b)) ?? 0));
|
|
111
|
+
if (cluster.kind === "feature" && cluster.hunks.some((hunk) => classify(hunk.path) === "tests")) {
|
|
112
|
+
cluster.title = `${cluster.title} and tests`;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
const kindOrder = ["contracts", "feature", "tests", "docs", "chores"];
|
|
116
|
+
clusters.sort((a, b) => {
|
|
117
|
+
const kindDiff = kindOrder.indexOf(a.kind) - kindOrder.indexOf(b.kind);
|
|
118
|
+
if (kindDiff !== 0) {
|
|
119
|
+
return kindDiff;
|
|
120
|
+
}
|
|
121
|
+
return a.title.localeCompare(b.title);
|
|
122
|
+
});
|
|
123
|
+
return clusters;
|
|
124
|
+
}
|
|
125
|
+
function classify(path) {
|
|
126
|
+
const base = basename(path);
|
|
127
|
+
if (CHORE_FILES.has(base) || /^\.(prettier|eslint|npmrc|yarnrc)/.test(base)) {
|
|
128
|
+
return "chores";
|
|
129
|
+
}
|
|
130
|
+
if (/\.(md|rst|adoc)$/i.test(base) || /(^|\/)docs\//.test(path) || /(^|\/)changelog/i.test(base)) {
|
|
131
|
+
return "docs";
|
|
132
|
+
}
|
|
133
|
+
if (/\.d\.ts$/.test(base) ||
|
|
134
|
+
/\.schema\.json$/.test(base) ||
|
|
135
|
+
/(^|\/)(schema|types|contracts|typings)\//.test(path) ||
|
|
136
|
+
/(^|\/)types\.[cm]?[jt]sx?$/.test(path)) {
|
|
137
|
+
return "contracts";
|
|
138
|
+
}
|
|
139
|
+
if (/\.(test|spec)\.[cm]?[jt]sx?$/.test(base) || /(^|\/)(__tests__|tests?)\//.test(path)) {
|
|
140
|
+
return "tests";
|
|
141
|
+
}
|
|
142
|
+
return "feature";
|
|
143
|
+
}
|
|
144
|
+
function featureKey(path) {
|
|
145
|
+
const parts = path.split("/").filter((part) => part !== "." && part !== "");
|
|
146
|
+
const stripped = parts.filter((part) => !["src", "lib", "pkg", "packages", "app"].includes(part));
|
|
147
|
+
if (stripped.length >= 2) {
|
|
148
|
+
return stripped[0] ?? stem(path);
|
|
149
|
+
}
|
|
150
|
+
return stem(path);
|
|
151
|
+
}
|
|
152
|
+
function partnerKey(path) {
|
|
153
|
+
return featureKey(path.replace(/\.(test|spec)\./, "."));
|
|
154
|
+
}
|
|
155
|
+
function featureTitle(key) {
|
|
156
|
+
const named = {
|
|
157
|
+
cli: "CLI",
|
|
158
|
+
ui: "UI",
|
|
159
|
+
git: "Git",
|
|
160
|
+
schema: "Schema",
|
|
161
|
+
server: "Server",
|
|
162
|
+
review: "Review grouping",
|
|
163
|
+
api: "API",
|
|
164
|
+
core: "Core",
|
|
165
|
+
};
|
|
166
|
+
return named[key.toLowerCase()] ?? titleCase(key.replace(/[-_.]/g, " "));
|
|
167
|
+
}
|
|
168
|
+
function testTitle(path) {
|
|
169
|
+
const key = featureKey(path);
|
|
170
|
+
if (key === "test" || key === "tests") {
|
|
171
|
+
return "Tests";
|
|
172
|
+
}
|
|
173
|
+
return `Tests for ${featureTitle(key)}`;
|
|
174
|
+
}
|
|
175
|
+
export function briefGroup(cluster, paths, commits) {
|
|
176
|
+
const subjects = unique(commits.map((commit) => commit.subject.trim()).filter((subject) => subject.length > 0));
|
|
177
|
+
const summary = subjects[0] ?? fallbackSummary(cluster);
|
|
178
|
+
const lookFor = [];
|
|
179
|
+
for (const extra of subjects.slice(1, 5)) {
|
|
180
|
+
lookFor.push(extra);
|
|
181
|
+
}
|
|
182
|
+
for (const hunk of cluster.hunks) {
|
|
183
|
+
if (hunk.oldPath !== undefined) {
|
|
184
|
+
lookFor.push(`Rename ${hunk.oldPath} → ${hunk.path}`);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
const added = unique(cluster.hunks.filter((hunk) => hunk.oldStart === 0 && hunk.oldLines === 0 && hunk.oldPath === undefined).map((hunk) => hunk.path));
|
|
188
|
+
for (const path of added.slice(0, 4)) {
|
|
189
|
+
lookFor.push(`New file ${path}`);
|
|
190
|
+
}
|
|
191
|
+
const deleted = unique(cluster.hunks.filter((hunk) => hunk.newStart === 0 && hunk.newLines === 0).map((hunk) => hunk.path));
|
|
192
|
+
for (const path of deleted.slice(0, 3)) {
|
|
193
|
+
lookFor.push(`Deleted ${path}`);
|
|
194
|
+
}
|
|
195
|
+
const hasTests = paths.some((path) => classify(path) === "tests");
|
|
196
|
+
const hasImpl = paths.some((path) => classify(path) === "feature" || classify(path) === "contracts");
|
|
197
|
+
if (hasTests && hasImpl) {
|
|
198
|
+
lookFor.push("Paired tests are in this layer — check they pin the new behavior.");
|
|
199
|
+
}
|
|
200
|
+
else if (cluster.kind === "tests") {
|
|
201
|
+
lookFor.push("Read after the implementation layer.");
|
|
202
|
+
}
|
|
203
|
+
else if (cluster.kind === "contracts") {
|
|
204
|
+
lookFor.push("Foundation: later layers depend on these shapes.");
|
|
205
|
+
}
|
|
206
|
+
else if (cluster.kind === "chores") {
|
|
207
|
+
lookFor.push("Confirm the manifest matches the code layers, then move on.");
|
|
208
|
+
}
|
|
209
|
+
else if (cluster.kind === "docs") {
|
|
210
|
+
lookFor.push("Confirm the prose matches what the code layers actually do.");
|
|
211
|
+
}
|
|
212
|
+
return { summary, lookFor: unique(lookFor).slice(0, 8) };
|
|
213
|
+
}
|
|
214
|
+
export function assignDependsOn(drafts) {
|
|
215
|
+
const ids = (kind) => drafts.filter((draft) => draft.kind === kind).map((draft) => draft.group.id);
|
|
216
|
+
const contracts = ids("contracts");
|
|
217
|
+
const features = ids("feature");
|
|
218
|
+
const implementation = [...contracts, ...features];
|
|
219
|
+
for (const draft of drafts) {
|
|
220
|
+
let deps = [];
|
|
221
|
+
if (draft.kind === "feature") {
|
|
222
|
+
deps = contracts;
|
|
223
|
+
}
|
|
224
|
+
else if (draft.kind === "tests") {
|
|
225
|
+
deps = implementation;
|
|
226
|
+
}
|
|
227
|
+
else if (draft.kind === "docs" || draft.kind === "chores") {
|
|
228
|
+
deps = implementation;
|
|
229
|
+
}
|
|
230
|
+
deps = deps.filter((id) => id !== draft.group.id);
|
|
231
|
+
if (deps.length > 0) {
|
|
232
|
+
draft.group.dependsOn = deps;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
function fallbackSummary(cluster) {
|
|
237
|
+
switch (cluster.kind) {
|
|
238
|
+
case "contracts":
|
|
239
|
+
return "Types and contracts that later layers consume.";
|
|
240
|
+
case "tests":
|
|
241
|
+
return "Tests for the behavior in earlier layers.";
|
|
242
|
+
case "docs":
|
|
243
|
+
return "Documentation for this change.";
|
|
244
|
+
case "chores":
|
|
245
|
+
return "Manifest and lockfile updates.";
|
|
246
|
+
default:
|
|
247
|
+
return `${cluster.title} implementation.`;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
function walkthroughFrom(commits) {
|
|
251
|
+
const subjects = unique(commits.map((commit) => commit.subject.trim()).filter((subject) => subject.length > 0)).slice(0, 2);
|
|
252
|
+
if (subjects.length === 0) {
|
|
253
|
+
return undefined;
|
|
254
|
+
}
|
|
255
|
+
return subjects.join(" · ");
|
|
256
|
+
}
|
|
257
|
+
function ticketsFromCommits(commits) {
|
|
258
|
+
const seen = new Set();
|
|
259
|
+
const tickets = [];
|
|
260
|
+
const pattern = /#(\d+)/g;
|
|
261
|
+
for (const commit of commits) {
|
|
262
|
+
for (const match of commit.subject.matchAll(pattern)) {
|
|
263
|
+
const id = match[1];
|
|
264
|
+
if (id === undefined || seen.has(id)) {
|
|
265
|
+
continue;
|
|
266
|
+
}
|
|
267
|
+
seen.add(id);
|
|
268
|
+
tickets.push({ id: `#${id}` });
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
return tickets;
|
|
272
|
+
}
|
|
273
|
+
function basename(path) {
|
|
274
|
+
const parts = path.split("/");
|
|
275
|
+
return parts[parts.length - 1] ?? path;
|
|
276
|
+
}
|
|
277
|
+
function stem(path) {
|
|
278
|
+
return basename(path).replace(/\.(test|spec)\./, ".").replace(/\.[^.]+$/, "");
|
|
279
|
+
}
|
|
280
|
+
function titleCase(value) {
|
|
281
|
+
return value
|
|
282
|
+
.split(/\s+/)
|
|
283
|
+
.filter(Boolean)
|
|
284
|
+
.map((word) => word.slice(0, 1).toUpperCase() + word.slice(1))
|
|
285
|
+
.join(" ");
|
|
286
|
+
}
|
|
287
|
+
function unique(values) {
|
|
288
|
+
return [...new Set(values)];
|
|
289
|
+
}
|
|
290
|
+
//# sourceMappingURL=generate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/review/generate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export type BlameRunLine = {
|
|
2
|
+
sha: string;
|
|
3
|
+
author: string;
|
|
4
|
+
timestamp: number;
|
|
5
|
+
line: number;
|
|
6
|
+
};
|
|
7
|
+
export type BlameRun = {
|
|
8
|
+
lineNumber: number;
|
|
9
|
+
sha: string;
|
|
10
|
+
author: string;
|
|
11
|
+
timestamp: number;
|
|
12
|
+
lines: number;
|
|
13
|
+
};
|
|
14
|
+
export declare function groupBlameRuns(lines: BlameRunLine[]): BlameRun[];
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export function groupBlameRuns(lines) {
|
|
2
|
+
const runs = [];
|
|
3
|
+
for (const line of lines) {
|
|
4
|
+
const last = runs[runs.length - 1];
|
|
5
|
+
if (last !== undefined && last.sha === line.sha && last.author === line.author) {
|
|
6
|
+
last.lines += 1;
|
|
7
|
+
continue;
|
|
8
|
+
}
|
|
9
|
+
runs.push({
|
|
10
|
+
lineNumber: line.line,
|
|
11
|
+
sha: line.sha,
|
|
12
|
+
author: line.author,
|
|
13
|
+
timestamp: line.timestamp,
|
|
14
|
+
lines: 1,
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
return runs;
|
|
18
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blame-runs.js","sourceRoot":"","sources":["../../src/schema/blame-runs.ts"],"names":[],"mappings":"AAeA,MAAM,UAAU,cAAc,CAAC,KAAqB;IAClD,MAAM,IAAI,GAAe,EAAE,CAAC;IAC5B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACnC,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,GAAG,KAAK,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;YAC/E,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;YAChB,SAAS;QACX,CAAC;QACD,IAAI,CAAC,IAAI,CAAC;YACR,UAAU,EAAE,IAAI,CAAC,IAAI;YACrB,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,KAAK,EAAE,CAAC;SACT,CAAC,CAAC;IACL,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export declare function hunkRangeLabel(header: string): string;
|
|
2
|
+
export declare function hunkContext(header: string): string | undefined;
|
|
3
|
+
export declare function addedSymbols(addedLines: string[]): string[];
|
|
4
|
+
export type HunkLineKind = "ctx" | "add" | "del";
|
|
5
|
+
export type HunkLine = {
|
|
6
|
+
kind: HunkLineKind;
|
|
7
|
+
oldNumber: number | null;
|
|
8
|
+
newNumber: number | null;
|
|
9
|
+
text: string;
|
|
10
|
+
};
|
|
11
|
+
export type SplitSide = {
|
|
12
|
+
kind: HunkLineKind;
|
|
13
|
+
number: number | null;
|
|
14
|
+
text: string;
|
|
15
|
+
};
|
|
16
|
+
export type SplitRow = {
|
|
17
|
+
left: SplitSide | null;
|
|
18
|
+
right: SplitSide | null;
|
|
19
|
+
};
|
|
20
|
+
export declare function lineDelta(lines: {
|
|
21
|
+
kind: HunkLineKind;
|
|
22
|
+
}[]): {
|
|
23
|
+
added: number;
|
|
24
|
+
removed: number;
|
|
25
|
+
};
|
|
26
|
+
export declare function splitDiffRows(lines: HunkLine[]): SplitRow[];
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
export function hunkRangeLabel(header) {
|
|
2
|
+
const match = /^(@@ -\d+(?:,\d+)? \+\d+(?:,\d+)? @@)/.exec(header);
|
|
3
|
+
return match?.[1] ?? header;
|
|
4
|
+
}
|
|
5
|
+
export function hunkContext(header) {
|
|
6
|
+
const match = /^@@ -\d+(?:,\d+)? \+\d+(?:,\d+)? @@\s*(.*)$/.exec(header);
|
|
7
|
+
const ctx = match?.[1]?.trim();
|
|
8
|
+
if (ctx === undefined || ctx === "") {
|
|
9
|
+
return undefined;
|
|
10
|
+
}
|
|
11
|
+
return looksLikeCodeAnchor(ctx) ? ctx : undefined;
|
|
12
|
+
}
|
|
13
|
+
function looksLikeCodeAnchor(line) {
|
|
14
|
+
if (line.startsWith("#")) {
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
const hasCodeToken = /[(){};=<>]|=>/.test(line) || /[a-zA-Z_][\w]*\(/.test(line);
|
|
18
|
+
const hasKeyword = /\b(function|class|const|let|var|type|interface|enum|export|import|def|fn|async|return|struct|impl|pub)\b/.test(line);
|
|
19
|
+
if (/^[A-Z]/.test(line) && line.includes(": ") && !hasCodeToken && !hasKeyword) {
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
if (/[.!?]$/.test(line) && !hasCodeToken) {
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
return hasCodeToken || hasKeyword || /^[A-Za-z_][\w.]*$/.test(line);
|
|
26
|
+
}
|
|
27
|
+
export function addedSymbols(addedLines) {
|
|
28
|
+
const names = [];
|
|
29
|
+
const pattern = /^(?:export\s+)?(?:async\s+)?(?:function|class|type|interface|enum)\s+([A-Za-z_][\w]*)/;
|
|
30
|
+
for (const line of addedLines) {
|
|
31
|
+
const match = pattern.exec(line.trim());
|
|
32
|
+
const name = match?.[1];
|
|
33
|
+
if (name !== undefined && !names.includes(name)) {
|
|
34
|
+
names.push(name);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return names;
|
|
38
|
+
}
|
|
39
|
+
export function lineDelta(lines) {
|
|
40
|
+
let added = 0;
|
|
41
|
+
let removed = 0;
|
|
42
|
+
for (const line of lines) {
|
|
43
|
+
if (line.kind === "add") {
|
|
44
|
+
added += 1;
|
|
45
|
+
}
|
|
46
|
+
else if (line.kind === "del") {
|
|
47
|
+
removed += 1;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return { added, removed };
|
|
51
|
+
}
|
|
52
|
+
export function splitDiffRows(lines) {
|
|
53
|
+
const rows = [];
|
|
54
|
+
let index = 0;
|
|
55
|
+
while (index < lines.length) {
|
|
56
|
+
const line = lines[index];
|
|
57
|
+
if (line === undefined) {
|
|
58
|
+
break;
|
|
59
|
+
}
|
|
60
|
+
if (line.kind === "ctx") {
|
|
61
|
+
rows.push({
|
|
62
|
+
left: { kind: "ctx", number: line.oldNumber, text: line.text },
|
|
63
|
+
right: { kind: "ctx", number: line.newNumber, text: line.text },
|
|
64
|
+
});
|
|
65
|
+
index += 1;
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
if (line.kind === "del") {
|
|
69
|
+
const removed = [];
|
|
70
|
+
while (index < lines.length && lines[index]?.kind === "del") {
|
|
71
|
+
const next = lines[index];
|
|
72
|
+
if (next !== undefined) {
|
|
73
|
+
removed.push(next);
|
|
74
|
+
}
|
|
75
|
+
index += 1;
|
|
76
|
+
}
|
|
77
|
+
const added = [];
|
|
78
|
+
while (index < lines.length && lines[index]?.kind === "add") {
|
|
79
|
+
const next = lines[index];
|
|
80
|
+
if (next !== undefined) {
|
|
81
|
+
added.push(next);
|
|
82
|
+
}
|
|
83
|
+
index += 1;
|
|
84
|
+
}
|
|
85
|
+
const count = Math.max(removed.length, added.length);
|
|
86
|
+
for (let offset = 0; offset < count; offset += 1) {
|
|
87
|
+
const leftLine = removed[offset];
|
|
88
|
+
const rightLine = added[offset];
|
|
89
|
+
rows.push({
|
|
90
|
+
left: leftLine === undefined
|
|
91
|
+
? null
|
|
92
|
+
: { kind: leftLine.kind, number: leftLine.oldNumber, text: leftLine.text },
|
|
93
|
+
right: rightLine === undefined
|
|
94
|
+
? null
|
|
95
|
+
: { kind: rightLine.kind, number: rightLine.newNumber, text: rightLine.text },
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
rows.push({
|
|
101
|
+
left: null,
|
|
102
|
+
right: { kind: "add", number: line.newNumber, text: line.text },
|
|
103
|
+
});
|
|
104
|
+
index += 1;
|
|
105
|
+
}
|
|
106
|
+
return rows;
|
|
107
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hunk-meta.js","sourceRoot":"","sources":["../../src/schema/hunk-meta.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
export function hunksToUnifiedPatch(hunks) {
|
|
2
|
+
const groups = [];
|
|
3
|
+
for (const hunk of hunks) {
|
|
4
|
+
const existing = groups.find((group) => group.path === hunk.path);
|
|
5
|
+
if (existing === undefined) {
|
|
6
|
+
groups.push({ path: hunk.path, oldPath: hunk.oldPath, hunks: [hunk] });
|
|
7
|
+
}
|
|
8
|
+
else {
|
|
9
|
+
existing.hunks.push(hunk);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
return groups.map(filePatch).join("");
|
|
13
|
+
}
|
|
14
|
+
function filePatch(group) {
|
|
15
|
+
const oldPath = group.oldPath ?? group.path;
|
|
16
|
+
const added = group.hunks.every((hunk) => hunk.oldStart === 0 && hunk.oldLines === 0);
|
|
17
|
+
const deleted = group.hunks.every((hunk) => hunk.newStart === 0 && hunk.newLines === 0);
|
|
18
|
+
const lines = [`diff --git a/${oldPath} b/${group.path}`];
|
|
19
|
+
if (added) {
|
|
20
|
+
lines.push("new file mode 100644");
|
|
21
|
+
lines.push("--- /dev/null");
|
|
22
|
+
lines.push(`+++ b/${group.path}`);
|
|
23
|
+
}
|
|
24
|
+
else if (deleted) {
|
|
25
|
+
lines.push("deleted file mode 100644");
|
|
26
|
+
lines.push(`--- a/${oldPath}`);
|
|
27
|
+
lines.push("+++ /dev/null");
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
if (group.oldPath !== undefined) {
|
|
31
|
+
lines.push(`rename from ${oldPath}`);
|
|
32
|
+
lines.push(`rename to ${group.path}`);
|
|
33
|
+
}
|
|
34
|
+
lines.push(`--- a/${oldPath}`);
|
|
35
|
+
lines.push(`+++ b/${group.path}`);
|
|
36
|
+
}
|
|
37
|
+
for (const hunk of group.hunks) {
|
|
38
|
+
lines.push(hunk.header.startsWith("@@") ? hunk.header : hunkRangeFallback(hunk));
|
|
39
|
+
for (const line of hunk.lines) {
|
|
40
|
+
const prefix = line.kind === "add" ? "+" : line.kind === "del" ? "-" : " ";
|
|
41
|
+
lines.push(`${prefix}${line.text}`);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return `${lines.join("\n")}\n`;
|
|
45
|
+
}
|
|
46
|
+
function hunkRangeFallback(hunk) {
|
|
47
|
+
return `@@ -${hunk.oldStart},${hunk.oldLines} +${hunk.newStart},${hunk.newLines} @@`;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=hunk-patch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hunk-patch.js","sourceRoot":"","sources":["../../src/schema/hunk-patch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity.js","sourceRoot":"","sources":["../../src/schema/identity.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,OAAO,CAAC,GAAgE;IACtF,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC;IAClC,OAAO,GAAG,OAAO,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,QAAQ,KAAK,GAAG,CAAC,QAAQ,EAAE,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,CAAU,EAAE,CAAU;IAC7C,OAAO,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type HunkRef, type ReviewDocument } from "./types.ts";
|
|
2
|
+
export type ParseFailure = {
|
|
3
|
+
ok: false;
|
|
4
|
+
errors: string[];
|
|
5
|
+
};
|
|
6
|
+
export type ParseSuccess = {
|
|
7
|
+
ok: true;
|
|
8
|
+
document: ReviewDocument;
|
|
9
|
+
};
|
|
10
|
+
export type ParseResult = ParseSuccess | ParseFailure;
|
|
11
|
+
export declare function parseReviewDocument(input: unknown): ParseResult;
|
|
12
|
+
export declare function parseReviewJson(text: string): ParseResult;
|
|
13
|
+
export declare function parseHunkRef(value: unknown, label: string, errors: string[]): HunkRef | undefined;
|