diffing 0.2.1 → 0.4.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 +169 -3
- package/dist/{cli-agent-BNwY5lZE.mjs → cli-agent-B4hU6Xay.mjs} +58 -5
- package/dist/{cli-agent-CbzXDSSF.mjs → cli-agent-B_PHd635.mjs} +58 -5
- package/dist/{cli-agent-ZAkixf4c.mjs → cli-agent-KxNAFIPf.mjs} +6 -2
- package/dist/cli-gh-CDGSpndZ.mjs +147 -0
- package/dist/cli-gh-abs-IJrz.mjs +147 -0
- package/dist/cli.mjs +1214 -56
- package/dist/client/assets/{angular-html-DsssUIMZ.js → angular-html-BVFBJbbm.js} +1 -1
- package/dist/client/assets/{angular-ts-dTg-sJ77.js → angular-ts-CbJB4bNJ.js} +1 -1
- package/dist/client/assets/{apl-C1yUKbqz.js → apl-MzqTwOQT.js} +1 -1
- package/dist/client/assets/arc-DkYz3FVO.js +1 -0
- package/dist/client/assets/architecture-7EHR7CIX-BM5HxebS.js +1 -0
- package/dist/client/assets/architectureDiagram-3BPJPVTR-CU3k1-_g.js +36 -0
- package/dist/client/assets/array-CkF66D10.js +1 -0
- package/dist/client/assets/{astro-BI07ha2y.js → astro-DDblGxmh.js} +1 -1
- package/dist/client/assets/{blade-DkzUGffS.js → blade-DlgT3iuV.js} +1 -1
- package/dist/client/assets/blockDiagram-GPEHLZMM-1lwkHRY_.js +132 -0
- package/dist/client/assets/{bsl-Dx5tFn3i.js → bsl-BrHd4RA2.js} +1 -1
- package/dist/client/assets/{c-KkuqqOvW.js → c-BL61MF4M.js} +1 -1
- package/dist/client/assets/c4Diagram-AAUBKEIU-BPBjnNM8.js +10 -0
- package/dist/client/assets/{cairo-wCCQTdA9.js → cairo-BDZ6TRZS.js} +1 -1
- package/dist/client/assets/channel-BX6tZjG6.js +1 -0
- package/dist/client/assets/chunk-2J33WTMH-C_SASPYW.js +1 -0
- package/dist/client/assets/chunk-3OPIFGDE-CTcbOBts.js +62 -0
- package/dist/client/assets/chunk-4BX2VUAB-BipHnfY4.js +1 -0
- package/dist/client/assets/chunk-4EGX6M5U-C70lfA2p.js +1 -0
- package/dist/client/assets/chunk-55IACEB6-BzJYLlnc.js +1 -0
- package/dist/client/assets/chunk-5DO6E6H7-PprNUwlI.js +1 -0
- package/dist/client/assets/chunk-5ZQYHXKU-CorupEGf.js +2 -0
- package/dist/client/assets/chunk-727SXJPM-Cqjzb4FZ.js +206 -0
- package/dist/client/assets/chunk-AQP2D5EJ-DcaAmtSe.js +231 -0
- package/dist/client/assets/chunk-BR22UD5L-D8XCYMy9.js +1 -0
- package/dist/client/assets/chunk-BSJP7CBP-CiBjSxwv.js +1 -0
- package/dist/client/assets/chunk-CSCIHK7Q-BTbf6qN3.js +124 -0
- package/dist/client/assets/chunk-FHYWG6QK-CcHPrHH1.js +1 -0
- package/dist/client/assets/chunk-FMBD7UC4-BA8_ZS2e.js +15 -0
- package/dist/client/assets/chunk-KSCS5N6A-ChcT2GOp.js +10 -0
- package/dist/client/assets/chunk-L5ZTLDWV-BjzpE0xm.js +1 -0
- package/dist/client/assets/chunk-LZXEDZCA-Bu0azrf_.js +2 -0
- package/dist/client/assets/chunk-MPE355IW-Bf9yHfDS.js +1 -0
- package/dist/client/assets/chunk-MZUSXYTE-CnUIUKI4.js +1 -0
- package/dist/client/assets/chunk-N66VUXT2-ahAf9GvV.js +1 -0
- package/dist/client/assets/chunk-ND2GUHAM-Co55RNsd.js +1 -0
- package/dist/client/assets/chunk-NNHCCRGN-DHF3V75i.js +159 -0
- package/dist/client/assets/chunk-NZK2D7GU-CtPYeO8_.js +1 -0
- package/dist/client/assets/chunk-O5CBEL6O-CzRKb_Hn.js +70 -0
- package/dist/client/assets/chunk-PUPMXCY4-D0KKIhut.js +1 -0
- package/dist/client/assets/chunk-QZHKN3VN-BCSN705V.js +1 -0
- package/dist/client/assets/chunk-UIBZB4QT-TYsZ_c8u.js +1 -0
- package/dist/client/assets/chunk-WCWK7LTN-Dj8SfnMU.js +1 -0
- package/dist/client/assets/chunk-WU5MYG2G-xPWDnrji.js +1 -0
- package/dist/client/assets/chunk-XPW4576I-CYH9wUok.js +32 -0
- package/dist/client/assets/classDiagram-4FO5ZUOK-7xfBUC5E.js +1 -0
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-CFM5yYso.js +1 -0
- package/dist/client/assets/{cobol-DRh7-jLi.js → cobol-D37UDAkO.js} +1 -1
- package/dist/client/assets/{coffee-wR_ZAh9a.js → coffee-NCjhDwWZ.js} +1 -1
- package/dist/client/assets/cose-bilkent-S5V4N54A-B8RnQ-yF.js +1 -0
- package/dist/client/assets/{cpp-OD_qyywn.js → cpp-CQUNgUz4.js} +1 -1
- package/dist/client/assets/{crystal-E4ahAddE.js → crystal-DGHLJtZ_.js} +1 -1
- package/dist/client/assets/{css-2NgE_uxz.js → css-xCgEbp_3.js} +1 -1
- package/dist/client/assets/cytoscape.esm-B7MQoI9k.js +321 -0
- package/dist/client/assets/dagre-BM42HDAG-CvmQMXPT.js +4 -0
- package/dist/client/assets/dagre-DAhKikc0.js +1 -0
- package/dist/client/assets/defaultLocale-B_TxGd0k.js +1 -0
- package/dist/client/assets/diagram-2AECGRRQ-wIyWTlXo.js +43 -0
- package/dist/client/assets/diagram-5GNKFQAL-BLMMWtHj.js +10 -0
- package/dist/client/assets/diagram-KO2AKTUF-Duz_hHky.js +3 -0
- package/dist/client/assets/diagram-LMA3HP47-CftQIrJ1.js +24 -0
- package/dist/client/assets/diagram-OG6HWLK6-7odjt2qL.js +24 -0
- package/dist/client/assets/dist-PmPhNea3.js +1 -0
- package/dist/client/assets/{edge-8mbscxxD.js → edge-C6_UFojU.js} +1 -1
- package/dist/client/assets/{elixir-CJv1b3Q6.js → elixir-B12MoaTY.js} +1 -1
- package/dist/client/assets/{elm-DUPzqZ9H.js → elm-C80KxC_R.js} +1 -1
- package/dist/client/assets/erDiagram-TEJ5UH35-DOeyf617.js +85 -0
- package/dist/client/assets/{erb-ssvEF26z.js → erb-DqelkF7l.js} +1 -1
- package/dist/client/assets/{erlang-CtK0kQ6z.js → erlang-cuhwpmsu.js} +1 -1
- package/dist/client/assets/eventmodeling-FCH6USID-hlXE2E34.js +1 -0
- package/dist/client/assets/flowDiagram-I6XJVG4X-BJX7W8r0.js +162 -0
- package/dist/client/assets/{fortran-fixed-form-DBM4e0_k.js → fortran-fixed-form-DWr0EnJn.js} +1 -1
- package/dist/client/assets/{fsharp-CmzzGQLe.js → fsharp-CQ5iYSPA.js} +1 -1
- package/dist/client/assets/ganttDiagram-6RSMTGT7-CFWnCca0.js +292 -0
- package/dist/client/assets/{gdresource-B_wbPqHd.js → gdresource-CN-lsNu5.js} +1 -1
- package/dist/client/assets/{git-commit-1z4D6NzL.js → git-commit-6e79eN7Q.js} +1 -1
- package/dist/client/assets/{git-rebase-DiWIK1Oa.js → git-rebase-7L4r_tbx.js} +1 -1
- package/dist/client/assets/gitGraph-WXDBUCRP-D_3ZhTam.js +1 -0
- package/dist/client/assets/gitGraphDiagram-PVQCEYII-oNErRHPR.js +106 -0
- package/dist/client/assets/{glimmer-js-DrHg6AuA.js → glimmer-js-8OQAbTGs.js} +1 -1
- package/dist/client/assets/{glimmer-ts-wQSGOa8A.js → glimmer-ts-3IyQiCHC.js} +1 -1
- package/dist/client/assets/{glsl-OY27QGY0.js → glsl-Bi_bzGJK.js} +1 -1
- package/dist/client/assets/graphlib-DBdw4opr.js +1 -0
- package/dist/client/assets/{graphql-CSWSqe6f.js → graphql-YcGxsBfT.js} +1 -1
- package/dist/client/assets/{hack-Bi1v624Q.js → hack-C9IpUqi6.js} +1 -1
- package/dist/client/assets/{haml-CX94zV9m.js → haml-YWDwVGeX.js} +1 -1
- package/dist/client/assets/{handlebars-C1j6wnjG.js → handlebars-zyG7ocdI.js} +1 -1
- package/dist/client/assets/{html-BcAjMlB7.js → html-CHYhpzfH.js} +1 -1
- package/dist/client/assets/{html-derivative-DcEpOzdx.js → html-derivative-BhgSILdB.js} +1 -1
- package/dist/client/assets/{http-BBxxSc6S.js → http-BPv6bUpq.js} +1 -1
- package/dist/client/assets/{hurl-CpKRNTz4.js → hurl-CpohSten.js} +1 -1
- package/dist/client/assets/{hxml-DC4KwKt2.js → hxml-nwJci6H5.js} +1 -1
- package/dist/client/assets/index-BIrpcT6-.js +3922 -0
- package/dist/client/assets/index-CMyunQt6.css +1 -0
- package/dist/client/assets/info-J43DQDTF-CAllC7mK.js +1 -0
- package/dist/client/assets/infoDiagram-5YYISTIA-D1xM4RZP.js +2 -0
- package/dist/client/assets/init-Ce66tIvf.js +1 -0
- package/dist/client/assets/ishikawaDiagram-YF4QCWOH-7DsxXa1L.js +70 -0
- package/dist/client/assets/{java-CFUlLvAA.js → java-Bt4sAY2m.js} +1 -1
- package/dist/client/assets/{javascript-C-HnT3sE.js → javascript-DZjI42QZ.js} +1 -1
- package/dist/client/assets/{jinja-CPU8RwNP.js → jinja-D2zTW07t.js} +1 -1
- package/dist/client/assets/{jison-CW0TBQOs.js → jison-Dz-ndIM5.js} +1 -1
- package/dist/client/assets/journeyDiagram-JHISSGLW-C_A1TmoL.js +139 -0
- package/dist/client/assets/{json-qUjlNuEJ.js → json-Ykn4LhOH.js} +1 -1
- package/dist/client/assets/{jsx-KWeo60kf.js → jsx-Ce8SKNSt.js} +1 -1
- package/dist/client/assets/{julia-CnJB8y2e.js → julia-DlfibiGU.js} +1 -1
- package/dist/client/assets/{just-Do22d9PP.js → just-CT2PIeY2.js} +1 -1
- package/dist/client/assets/kanban-definition-UN3LZRKU-ccKLE8Df.js +89 -0
- package/dist/client/assets/katex-eRFNlMh0.js +257 -0
- package/dist/client/assets/{latex-CCPgzvKn.js → latex-Dkfo8_p4.js} +1 -1
- package/dist/client/assets/line-BbqJI7bZ.js +1 -0
- package/dist/client/assets/linear-B7c0dSOq.js +1 -0
- package/dist/client/assets/{liquid-B9btdZoI.js → liquid-dWmg5egV.js} +1 -1
- package/dist/client/assets/{lua-IFRifurW.js → lua-6hNhLpj8.js} +1 -1
- package/dist/client/assets/{marko-CCaVBFq1.js → marko-DTVuQVoJ.js} +1 -1
- package/dist/client/assets/{mdc-BtbnOLUc.js → mdc-LbJVW6cj.js} +1 -1
- package/dist/client/assets/mermaid-parser.core-f-eKVdX9.js +4 -0
- package/dist/client/assets/mermaid.core-ClMOD6O3.js +9 -0
- package/dist/client/assets/mindmap-definition-RKZ34NQL-vaLTR09L.js +96 -0
- package/dist/client/assets/{nextflow-CApkvBGW.js → nextflow-DSfydIxt.js} +1 -1
- package/dist/client/assets/{nginx-BkbFZHVt.js → nginx-BvMTgdwH.js} +1 -1
- package/dist/client/assets/{nim-2uCd5j65.js → nim-BdGYhiTu.js} +1 -1
- package/dist/client/assets/ordinal-5ziJS8mo.js +1 -0
- package/dist/client/assets/packet-YPE3B663-Dy58IAiO.js +1 -0
- package/dist/client/assets/path-g3G46IZB.js +1 -0
- package/dist/client/assets/{perl-C4ixqSNT.js → perl-DamEOAxn.js} +1 -1
- package/dist/client/assets/{php-DJ8WOtcI.js → php-DtubpAAy.js} +1 -1
- package/dist/client/assets/pie-LRSECV5Y-FXFFfdz2.js +1 -0
- package/dist/client/assets/pieDiagram-4H26LBE5-yuTkGKaM.js +30 -0
- package/dist/client/assets/{pug-BOaafhT5.js → pug-CMYtl1BN.js} +1 -1
- package/dist/client/assets/{qml-CURE-1y4.js → qml-D76DCV4U.js} +1 -1
- package/dist/client/assets/quadrantDiagram-W4KKPZXB-Db00tlGp.js +7 -0
- package/dist/client/assets/{r-CPWmgzo3.js → r-gMTLVmYP.js} +1 -1
- package/dist/client/assets/radar-GUYGQ44K-BKTzSQ68.js +1 -0
- package/dist/client/assets/{razor-DH83VP_d.js → razor-1oOg77PO.js} +1 -1
- package/dist/client/assets/{regexp-BXVWi-t_.js → regexp-BJzbycG8.js} +1 -1
- package/dist/client/assets/requirementDiagram-4Y6WPE33-CwCGFaVe.js +84 -0
- package/dist/client/assets/rough.esm-BBrzuQ0N.js +1 -0
- package/dist/client/assets/{rst-Bbxxs6E2.js → rst-Be7RtxcU.js} +1 -1
- package/dist/client/assets/{ruby-C-TuWES4.js → ruby-oyNd3WUZ.js} +1 -1
- package/dist/client/assets/sankeyDiagram-5OEKKPKP-D78nH-eA.js +40 -0
- package/dist/client/assets/{sas-njzNYNOq.js → sas-Bx8dCxcK.js} +1 -1
- package/dist/client/assets/{scss-D2i6rHB8.js → scss-DzZEPh1d.js} +1 -1
- package/dist/client/assets/sequenceDiagram-3UESZ5HK-CEy9mjHg.js +162 -0
- package/dist/client/assets/{shaderlab-DXAhMdPo.js → shaderlab-CbbQwRPF.js} +1 -1
- package/dist/client/assets/{shellscript-D6Bxi40C.js → shellscript-t9s0AoBc.js} +1 -1
- package/dist/client/assets/{shellsession-Defxq-I6.js → shellsession-NczJO6Io.js} +1 -1
- package/dist/client/assets/{soy-D0GKXrtT.js → soy-Dl6InSac.js} +1 -1
- package/dist/client/assets/{sparql-BdcL8cbr.js → sparql-DEoxFJ5d.js} +1 -1
- package/dist/client/assets/{sql-BRW_ADkU.js → sql-DXkZEc28.js} +1 -1
- package/dist/client/assets/src-DCIMHd9M.js +1 -0
- package/dist/client/assets/{stata-w7w59F48.js → stata-DmpUDP7M.js} +1 -1
- package/dist/client/assets/stateDiagram-AJRCARHV-Cz0qtN4R.js +1 -0
- package/dist/client/assets/stateDiagram-v2-BHNVJYJU-Dye5cILT.js +1 -0
- package/dist/client/assets/{surrealql-O-lLuqz7.js → surrealql-BAZp4tA6.js} +1 -1
- package/dist/client/assets/{svelte-DN3DR5-t.js → svelte-DXBMAgu7.js} +1 -1
- package/dist/client/assets/{templ-CJ2JFoia.js → templ-CF-yfRM7.js} +1 -1
- package/dist/client/assets/{tex-CpWrf5g9.js → tex-D5tGX-j9.js} +1 -1
- package/dist/client/assets/timeline-definition-PNZ67QCA-B6_u5aFI.js +120 -0
- package/dist/client/assets/treeView-BLDUP644-DtjHwb6x.js +1 -0
- package/dist/client/assets/treemap-LRROVOQU-GqTXzMFU.js +1 -0
- package/dist/client/assets/{ts-tags-CZ6Af6Pe.js → ts-tags-DWMVxoO1.js} +1 -1
- package/dist/client/assets/{tsx-gIUSpRih.js → tsx-C6QVlWvX.js} +1 -1
- package/dist/client/assets/{twig-DwZINhmw.js → twig-DKFN0Lvm.js} +1 -1
- package/dist/client/assets/{typescript-Dj2aMECR.js → typescript-DVfrnfSW.js} +1 -1
- package/dist/client/assets/vennDiagram-CIIHVFJN-C_-TQFos.js +34 -0
- package/dist/client/assets/{vue-B5K0aWrP.js → vue-BCLQ-g1T.js} +1 -1
- package/dist/client/assets/{vue-html-DKGgrypd.js → vue-html-Ddr0JbE-.js} +1 -1
- package/dist/client/assets/{vue-vine-B5iDYTCh.js → vue-vine-CX36RUs5.js} +1 -1
- package/dist/client/assets/wardley-L42UT6IY-pROVAAhW.js +1 -0
- package/dist/client/assets/wardleyDiagram-YWT4CUSO-BJQg7Pb-.js +78 -0
- package/dist/client/assets/{xml-CbTzxfc-.js → xml-FnMA1W8C.js} +1 -1
- package/dist/client/assets/{xsl-Dj-Be6nx.js → xsl-CLduN3zs.js} +1 -1
- package/dist/client/assets/xychartDiagram-2RQKCTM6-1Ux8tle4.js +7 -0
- package/dist/client/assets/{yaml-rTK8uEjh.js → yaml-B6hNfHm7.js} +1 -1
- package/dist/client/index.html +2 -2
- package/dist/{mcp-CE77qfjx.mjs → mcp-BWeWR4yd.mjs} +2 -1
- package/dist/{mcp-CFeE13n-.mjs → mcp-DNZQvKKF.mjs} +45 -1
- package/dist/{mcp-SGCrfYGo.mjs → mcp-DO4zfNZX.mjs} +45 -1
- package/dist/plan-format-DVnF8xrq.mjs +126 -0
- package/dist/plan-format-f62JWFI-.mjs +117 -0
- package/dist/plan-format-mSDtsPcC.mjs +132 -0
- package/dist/{server-lock-B4crz9-_.mjs → server-lock-D73NKKbn.mjs} +267 -133
- package/dist/{server-lock-DpCrvL-Z.mjs → server-lock-Dj9fG9md.mjs} +246 -122
- package/package.json +26 -14
- package/dist/cli-agent-BLPX3oOP.mjs +0 -443
- package/dist/cli-agent-Cfuy9fLC.mjs +0 -179
- package/dist/cli-agent-CtNivjQW.mjs +0 -179
- package/dist/cli-agent-DZBvZoXZ.mjs +0 -179
- package/dist/cli-agent-DsqbS3n7.mjs +0 -443
- package/dist/cli-agent-Vbs-ePHv.mjs +0 -443
- package/dist/cli-agent-WzJPMH52.mjs +0 -174
- package/dist/cli-agent-uYUoCA4X.mjs +0 -179
- package/dist/client/assets/index-Bwv7BWUp.js +0 -3959
- package/dist/client/assets/index-CoZyJYkw.css +0 -1
- package/dist/mcp-BQmH_By-.mjs +0 -119
- package/dist/mcp-CLgzC8_a.mjs +0 -119
- package/dist/mcp-D9E2HQZ9.mjs +0 -119
- package/dist/mcp-DKlThflu.mjs +0 -253
- package/dist/mcp-LVbLV17O.mjs +0 -119
- package/dist/mcp-nMwTAut3.mjs +0 -119
- package/dist/server-lock-BbiF7u3F.mjs +0 -493
- package/dist/server-lock-Bx9ixiF6.mjs +0 -575
- package/dist/server-lock-CAdqFSfl.mjs +0 -691
- package/dist/server-lock-DIkImokU.mjs +0 -487
- package/dist/server-lock-DbxpfF3j.mjs +0 -575
- package/dist/update-check-DJuFE9w6.mjs +0 -128
- package/dist/update-check-DSC02MWQ.mjs +0 -129
- package/dist/client/assets/{abap-CkQ0tsz-.js → abap-cWYhO34H.js} +0 -0
- package/dist/client/assets/{actionscript-3-DHm0ZfF4.js → actionscript-3-B80ndJsD.js} +0 -0
- package/dist/client/assets/{ada-DK_ua92Z.js → ada-C0C0SoYB.js} +0 -0
- package/dist/client/assets/{andromeeda-D2ccw8v4.js → andromeeda-Ch2kWS7s.js} +0 -0
- package/dist/client/assets/{apache-DXtpFu7o.js → apache-DBwBm4bB.js} +0 -0
- package/dist/client/assets/{apex-DlnRRWpl.js → apex-FcV7UxQi.js} +0 -0
- package/dist/client/assets/{applescript-CShk62ad.js → applescript-hQs8VNpS.js} +0 -0
- package/dist/client/assets/{ara-CWN-FDkm.js → ara-BOadBOZg.js} +0 -0
- package/dist/client/assets/{asciidoc-Bg-PM9Vn.js → asciidoc-BsfqiBck.js} +0 -0
- package/dist/client/assets/{asm-DKOhR24S.js → asm-C2vUqzqz.js} +0 -0
- package/dist/client/assets/{aurora-x-DpaEirL8.js → aurora-x-BHLqzt7j.js} +0 -0
- package/dist/client/assets/{awk-3ibKHffv.js → awk-D4e-eeZT.js} +0 -0
- package/dist/client/assets/{ayu-dark-ursiSH5k.js → ayu-dark-DCotN_ZT.js} +0 -0
- package/dist/client/assets/{ayu-light-DMjlrKmx.js → ayu-light-CKB6o_im.js} +0 -0
- package/dist/client/assets/{ayu-mirage-DZEMb75h.js → ayu-mirage-B38lW-C5.js} +0 -0
- package/dist/client/assets/{ballerina-xx7VNGxs.js → ballerina-BzvFqbha.js} +0 -0
- package/dist/client/assets/{bat-DGYsZ5wR.js → bat-CFyw2ERn.js} +0 -0
- package/dist/client/assets/{beancount-D_ATR1UV.js → beancount-a6Gsu5WX.js} +0 -0
- package/dist/client/assets/{berry-BqYMORfH.js → berry-C2jyz4Ah.js} +0 -0
- package/dist/client/assets/{bibtex-CQTBDajW.js → bibtex-Dyet-B83.js} +0 -0
- package/dist/client/assets/{bicep-CfNtxPrK.js → bicep-CghvUIvy.js} +0 -0
- package/dist/client/assets/{bird2-C0dUPe3I.js → bird2-nHigvs-R.js} +0 -0
- package/dist/client/assets/{c3-BUwZ5e3k.js → c3-9ZrcmAmr.js} +0 -0
- package/dist/client/assets/{cadence-C3OKDYrr.js → cadence-BPDgYNWy.js} +0 -0
- package/dist/client/assets/{catppuccin-frappe-CMnRXVZP.js → catppuccin-frappe-BY_2ofjk.js} +0 -0
- package/dist/client/assets/{catppuccin-latte-CqhXSjCC.js → catppuccin-latte-D6GXPBmA.js} +0 -0
- package/dist/client/assets/{catppuccin-macchiato-B6kneE0C.js → catppuccin-macchiato-BuW8_cyo.js} +0 -0
- package/dist/client/assets/{catppuccin-mocha-CP8YZpvj.js → catppuccin-mocha-znex9DPe.js} +0 -0
- package/dist/client/assets/{clarity-Crxe8gSr.js → clarity-Cmao5KSK.js} +0 -0
- package/dist/client/assets/{clojure-BuzOUPMr.js → clojure-D2dPuTkk.js} +0 -0
- package/dist/client/assets/{cmake-CCpZLdLI.js → cmake-DaqQuj4A.js} +0 -0
- package/dist/client/assets/{codeowners-Bo1VYpHz.js → codeowners-B748jmvc.js} +0 -0
- package/dist/client/assets/{codeql-Db01hzHE.js → codeql-CXb_8gHR.js} +0 -0
- package/dist/client/assets/{common-lisp-CMlJIc6Y.js → common-lisp-UZn9nc_5.js} +0 -0
- package/dist/client/assets/{coq-BlzBYp3f.js → coq-DtO6yBIf.js} +0 -0
- package/dist/client/assets/{csharp-kfNshAa7.js → csharp-C3YlYcLV.js} +0 -0
- package/dist/client/assets/{csv-Dr8ri5Nd.js → csv-BBwiVr0X.js} +0 -0
- package/dist/client/assets/{cue-jXfhyOwY.js → cue-ScBFXY5f.js} +0 -0
- package/dist/client/assets/{cypher-CayLeiaR.js → cypher-CGStaC1X.js} +0 -0
- package/dist/client/assets/{d-BMZQ0mAy.js → d-CuTCIvnX.js} +0 -0
- package/dist/client/assets/{dark-plus-B__q47Nr.js → dark-plus-BvePH-r3.js} +0 -0
- package/dist/client/assets/{dart-gMOEMyuz.js → dart-CqEodbm2.js} +0 -0
- package/dist/client/assets/{dax-C3t5LadU.js → dax-UdE5S0Dh.js} +0 -0
- package/dist/client/assets/{desktop-DmhXLwLR.js → desktop-DfmsfHJA.js} +0 -0
- package/dist/client/assets/{diff-togOXQX6.js → diff-CW0RWGd9.js} +0 -0
- package/dist/client/assets/{docker--6N01olR.js → docker-B1qtW4ha.js} +0 -0
- package/dist/client/assets/{dotenv-Bq930Yx8.js → dotenv-BUzOh1k8.js} +0 -0
- package/dist/client/assets/{dracula-CBkSghcw.js → dracula-kJQjC_Gy.js} +0 -0
- package/dist/client/assets/{dracula-soft-CCSYeoxL.js → dracula-soft-B3XhEjCl.js} +0 -0
- package/dist/client/assets/{dream-maker-BiMf3DHl.js → dream-maker-CBvk18nW.js} +0 -0
- package/dist/client/assets/{emacs-lisp-Dhht7he2.js → emacs-lisp-DvSgLhDc.js} +0 -0
- package/dist/client/assets/{everforest-dark-NqSz4oHS.js → everforest-dark-u0zLn75q.js} +0 -0
- package/dist/client/assets/{everforest-light-a3Yzs_lT.js → everforest-light-D3syIoAR.js} +0 -0
- package/dist/client/assets/{fennel-BExc9TZf.js → fennel-C-1kWlGf.js} +0 -0
- package/dist/client/assets/{fish-C2p-AJmZ.js → fish-CCpdtwqS.js} +0 -0
- package/dist/client/assets/{fluent-CeYzs8Qy.js → fluent-BLg032oD.js} +0 -0
- package/dist/client/assets/{fortran-free-form-BIQEK2Jw.js → fortran-free-form-Br4jRtSc.js} +0 -0
- package/dist/client/assets/{gdscript-B5JQPh_-.js → gdscript-hSAZM1eh.js} +0 -0
- package/dist/client/assets/{gdshader-vVjJ_Qr8.js → gdshader-D4XNAEs9.js} +0 -0
- package/dist/client/assets/{genie-DGl5rqC8.js → genie-DmN-ICAN.js} +0 -0
- package/dist/client/assets/{gherkin-CY_VLUnD.js → gherkin-cuHHmRcX.js} +0 -0
- package/dist/client/assets/{github-dark-ClO4AStc.js → github-dark-CEBLh0--.js} +0 -0
- package/dist/client/assets/{github-dark-default-CM0dPco8.js → github-dark-default-Dq0Z4Xai.js} +0 -0
- package/dist/client/assets/{github-dark-dimmed-Cb6xxpXY.js → github-dark-dimmed-D90YmS4w.js} +0 -0
- package/dist/client/assets/{github-dark-high-contrast-BpYtx2-M.js → github-dark-high-contrast-B6BWv1iC.js} +0 -0
- package/dist/client/assets/{github-light-default-BmnCWL6x.js → github-light-default-DsPWmj4v.js} +0 -0
- package/dist/client/assets/{github-light-high-contrast-rpagNF5O.js → github-light-high-contrast-C7aLb3kp.js} +0 -0
- package/dist/client/assets/{github-light-CeOVFgf_.js → github-light-lXSVSq5T.js} +0 -0
- package/dist/client/assets/{gleam-BarIG9kQ.js → gleam-D8VhqPDN.js} +0 -0
- package/dist/client/assets/{gn-DhYsTPYc.js → gn-BjGRlX27.js} +0 -0
- package/dist/client/assets/{gnuplot-CucLlTBc.js → gnuplot-BZCXuE4q.js} +0 -0
- package/dist/client/assets/{go-toi-uWvg.js → go-BJpWXZEs.js} +0 -0
- package/dist/client/assets/{groovy-Ds4dis_k.js → groovy-D9w3Dn-z.js} +0 -0
- package/dist/client/assets/{gruvbox-dark-hard-aPiW8pQh.js → gruvbox-dark-hard-_deksD0U.js} +0 -0
- package/dist/client/assets/{gruvbox-dark-medium-2HJCvzsS.js → gruvbox-dark-medium-CT31284j.js} +0 -0
- package/dist/client/assets/{gruvbox-dark-soft-Da97ODX9.js → gruvbox-dark-soft-BZuEUCbj.js} +0 -0
- package/dist/client/assets/{gruvbox-light-hard-BXlEipFe.js → gruvbox-light-hard-dxv4n_ZS.js} +0 -0
- package/dist/client/assets/{gruvbox-light-medium-Cun-GjGk.js → gruvbox-light-medium-BsW_fVfR.js} +0 -0
- package/dist/client/assets/{gruvbox-light-soft-Bd3qiiSw.js → gruvbox-light-soft-BiGy99gD.js} +0 -0
- package/dist/client/assets/{haskell-B_jvz5Po.js → haskell-DqDdKEgk.js} +0 -0
- package/dist/client/assets/{haxe-BRbuo5UO.js → haxe-DMg0jS3a.js} +0 -0
- package/dist/client/assets/{hcl-BzNUCtsK.js → hcl-SZIZUK_X.js} +0 -0
- package/dist/client/assets/{hjson-BxVo3sS2.js → hjson-DF1VspiE.js} +0 -0
- package/dist/client/assets/{hlsl-C8Wes1nf.js → hlsl-DPe9L0Dt.js} +0 -0
- package/dist/client/assets/{horizon-D54PjLAY.js → horizon-Ngud75Kn.js} +0 -0
- package/dist/client/assets/{horizon-bright-D9RccdIr.js → horizon-bright-Cnljd0XD.js} +0 -0
- package/dist/client/assets/{houston-CMu1N_4K.js → houston-BenZxlMr.js} +0 -0
- package/dist/client/assets/{hy-dMrJKKU_.js → hy-B0f-B1mH.js} +0 -0
- package/dist/client/assets/{imba-DG_oO8tg.js → imba-Bq3j1cW5.js} +0 -0
- package/dist/client/assets/{ini-geHw79Aj.js → ini-BayloP2U.js} +0 -0
- package/dist/client/assets/{json5-CDUsNqz6.js → json5-CRSfdIrY.js} +0 -0
- package/dist/client/assets/{jsonc-D48xcwyD.js → jsonc-y4g9DQPx.js} +0 -0
- package/dist/client/assets/{jsonl-cpIYDXEe.js → jsonl-D2paVn9r.js} +0 -0
- package/dist/client/assets/{jsonnet-Da1lhszN.js → jsonnet-CLH27mtz.js} +0 -0
- package/dist/client/assets/{jssm-B8BLrEGL.js → jssm-CPPYaqX-.js} +0 -0
- package/dist/client/assets/{kanagawa-dragon-2Sk8Rx83.js → kanagawa-dragon-Bt5mhLu1.js} +0 -0
- package/dist/client/assets/{kanagawa-lotus-CQVSWfJp.js → kanagawa-lotus-FGA3pRJk.js} +0 -0
- package/dist/client/assets/{kanagawa-wave-BKWNioLX.js → kanagawa-wave-DnLVZPAD.js} +0 -0
- package/dist/client/assets/{kdl-B-2tSRmp.js → kdl-D1BQjjnw.js} +0 -0
- package/dist/client/assets/{kotlin-DepsEzh3.js → kotlin-ndCaDnf0.js} +0 -0
- package/dist/client/assets/{kusto-BcCtXIb8.js → kusto-D-4nbkD3.js} +0 -0
- package/dist/client/assets/{laserwave-BUqkO46F.js → laserwave-D2qAZkaG.js} +0 -0
- package/dist/client/assets/{lean-CNO9ffpX.js → lean-YmtAsB0p.js} +0 -0
- package/dist/client/assets/{less-Dj0T9pWC.js → less-DyHub3ow.js} +0 -0
- package/dist/client/assets/{light-plus-C9Hnuc1T.js → light-plus-CP13QUvm.js} +0 -0
- package/dist/client/assets/{llvm-DbV9b66l.js → llvm-DCcqrY0D.js} +0 -0
- package/dist/client/assets/{log-BMblmPyH.js → log-DWAAMNbe.js} +0 -0
- package/dist/client/assets/{logo-B78qMxws.js → logo-ClQMGkNL.js} +0 -0
- package/dist/client/assets/{luau-BUd8xsdE.js → luau-CmcXFvLt.js} +0 -0
- package/dist/client/assets/{make-Ev-6cJrd.js → make-DcfJyUzm.js} +0 -0
- package/dist/client/assets/{markdown-CS4LI6sN.js → markdown-DXxotAxn.js} +0 -0
- package/dist/client/assets/{material-theme-5rA1zn0D.js → material-theme-JFoPTBSr.js} +0 -0
- package/dist/client/assets/{material-theme-darker-DGOEiL65.js → material-theme-darker-BHaqZ19v.js} +0 -0
- package/dist/client/assets/{material-theme-lighter-CULfFRX0.js → material-theme-lighter-CGnnS2bs.js} +0 -0
- package/dist/client/assets/{material-theme-ocean-LQZ9CleP.js → material-theme-ocean-Drhewjqf.js} +0 -0
- package/dist/client/assets/{material-theme-palenight-Di_f5oks.js → material-theme-palenight-DbUypmpb.js} +0 -0
- package/dist/client/assets/{matlab-C0qEtAx9.js → matlab-BlfbTznR.js} +0 -0
- package/dist/client/assets/{mdx-CzvnbLXb.js → mdx-H8fyPQd8.js} +0 -0
- package/dist/client/assets/{mermaid-BPquZaKt.js → mermaid-CWAV2dmV.js} +0 -0
- package/dist/client/assets/{min-dark-rkuIbtJV.js → min-dark-BEelvXUB.js} +0 -0
- package/dist/client/assets/{min-light-Dj_HOGsr.js → min-light-CTPBOACR.js} +0 -0
- package/dist/client/assets/{mipsasm-k5DQoS6j.js → mipsasm-BWYFAm2s.js} +0 -0
- package/dist/client/assets/{mojo-sTTDuNnR.js → mojo-DZcPJEIN.js} +0 -0
- package/dist/client/assets/{monokai-D5p-u2ij.js → monokai-DQlZXbkg.js} +0 -0
- package/dist/client/assets/{moonbit-j5ChFtBC.js → moonbit-6eslNlJL.js} +0 -0
- package/dist/client/assets/{move-Dj0Gmn6R.js → move-DxFc9-QU.js} +0 -0
- package/dist/client/assets/{narrat-DJgMz2oW.js → narrat-gv38dJOT.js} +0 -0
- package/dist/client/assets/{nextflow-groovy-eDLuZ_oi.js → nextflow-groovy-DV4H3hok.js} +0 -0
- package/dist/client/assets/{night-owl-CEdtPl3A.js → night-owl-BLcrYhaC.js} +0 -0
- package/dist/client/assets/{night-owl-light-GdSldewm.js → night-owl-light-BG-tBJOz.js} +0 -0
- package/dist/client/assets/{nix-CxIPS3pb.js → nix-NlOz3HGM.js} +0 -0
- package/dist/client/assets/{nord-3WFAz5H9.js → nord-Dm2F5_QB.js} +0 -0
- package/dist/client/assets/{nushell-GDfBmoBU.js → nushell-D86Z8aFF.js} +0 -0
- package/dist/client/assets/{objective-c-MFQ_MGUa.js → objective-c-iuJvUjCv.js} +0 -0
- package/dist/client/assets/{objective-cpp-Y83LcBE7.js → objective-cpp-C62JvfMT.js} +0 -0
- package/dist/client/assets/{ocaml-FxYfaJxu.js → ocaml-Rbryo9lg.js} +0 -0
- package/dist/client/assets/{odin-CprihY3z.js → odin-CfaOVNP_.js} +0 -0
- package/dist/client/assets/{one-dark-pro-BB6mpmmA.js → one-dark-pro-DC9SHdX0.js} +0 -0
- package/dist/client/assets/{one-light-BYLoxNtg.js → one-light-Doo39p0H.js} +0 -0
- package/dist/client/assets/{openscad-Bc1FbpOi.js → openscad-DCRhgheK.js} +0 -0
- package/dist/client/assets/{pascal-Bb4d8cUL.js → pascal-CTesTHtV.js} +0 -0
- package/dist/client/assets/{pierre-dark-cF19s-RM.js → pierre-dark-Gtc9M_gS.js} +0 -0
- package/dist/client/assets/{pierre-light-BdpX8OpD.js → pierre-light-EDxMHmhf.js} +0 -0
- package/dist/client/assets/{pkl-tM25Sq0w.js → pkl-BjUMjQkt.js} +0 -0
- package/dist/client/assets/{plastic-D3k2Xp_5.js → plastic-B3CcSpon.js} +0 -0
- package/dist/client/assets/{plsql-CLEfFhSj.js → plsql-BgKEZSSo.js} +0 -0
- package/dist/client/assets/{po-CaAzdrrh.js → po-C5s_CVt8.js} +0 -0
- package/dist/client/assets/{poimandres-bPTvT4Da.js → poimandres-BsK70ma5.js} +0 -0
- package/dist/client/assets/{polar-TG7aTGdK.js → polar-y4hX8qM0.js} +0 -0
- package/dist/client/assets/{postcss-8kqfa9f0.js → postcss-BHCm7Qae.js} +0 -0
- package/dist/client/assets/{powerquery-CtSu1Nfd.js → powerquery-C2vMt8aZ.js} +0 -0
- package/dist/client/assets/{powershell-87lLBHMy.js → powershell-DEcjmg1c.js} +0 -0
- package/dist/client/assets/{prisma-Dnf694DZ.js → prisma-Ba-Tcxy5.js} +0 -0
- package/dist/client/assets/{prolog-C0XbHTWa.js → prolog-B4o261Jv.js} +0 -0
- package/dist/client/assets/{proto-BZP-HLIb.js → proto-o3IZKiMR.js} +0 -0
- package/dist/client/assets/{puppet-CJYWgYC5.js → puppet-BC0dqZ31.js} +0 -0
- package/dist/client/assets/{purescript-B95Q6BAd.js → purescript-CLDw1y5G.js} +0 -0
- package/dist/client/assets/{python-CqTCsi7P.js → python-D1NFioGW.js} +0 -0
- package/dist/client/assets/{qmldir-DlIL4hls.js → qmldir-B7i9e9Vn.js} +0 -0
- package/dist/client/assets/{qss-BW72E0q_.js → qss-DIe6oKX8.js} +0 -0
- package/dist/client/assets/{racket-CCAimEsC.js → racket-CAOC_yyk.js} +0 -0
- package/dist/client/assets/{raku-mSuqElkM.js → raku-Ccua3vW6.js} +0 -0
- package/dist/client/assets/{red-C-DA4yBI.js → red-DtDH206x.js} +0 -0
- package/dist/client/assets/{reg-CGwMBJ2c.js → reg-CAYZT9kE.js} +0 -0
- package/dist/client/assets/{rel-JwrbYgX4.js → rel-cvB6F5nO.js} +0 -0
- package/dist/client/assets/{riscv-CoYyE75b.js → riscv-SYGtE4EN.js} +0 -0
- package/dist/client/assets/{ron-C5wrhnmJ.js → ron-CRt869SB.js} +0 -0
- package/dist/client/assets/{rose-pine-DlrMPYYd.js → rose-pine-CjBfSJ5b.js} +0 -0
- package/dist/client/assets/{rose-pine-dawn-DBHFtZD2.js → rose-pine-dawn-C0xwy7iJ.js} +0 -0
- package/dist/client/assets/{rose-pine-moon-BBfrpe5q.js → rose-pine-moon-BSNy9Ty0.js} +0 -0
- package/dist/client/assets/{rosmsg-DlimTR9t.js → rosmsg-BwrfJ66Z.js} +0 -0
- package/dist/client/assets/{rust-Cxnkxx3h.js → rust-DCKTTPxN.js} +0 -0
- package/dist/client/assets/{sass-DEyqUIpU.js → sass-CorcwySt.js} +0 -0
- package/dist/client/assets/{scala-i3RN3yAN.js → scala-DlI-OmYj.js} +0 -0
- package/dist/client/assets/{scheme-BcKdjYkO.js → scheme-CcNEGkZH.js} +0 -0
- package/dist/client/assets/{sdbl-Be_XWc3n.js → sdbl-AL_m-RO_.js} +0 -0
- package/dist/client/assets/{slack-dark-3PDtm74m.js → slack-dark-rMhrfPm6.js} +0 -0
- package/dist/client/assets/{slack-ochin-CwiuFRJD.js → slack-ochin-9w8X74hU.js} +0 -0
- package/dist/client/assets/{smalltalk-BdBlL6ks.js → smalltalk-Y2ogrfbk.js} +0 -0
- package/dist/client/assets/{snazzy-light-Dyqc8Is2.js → snazzy-light-DHr9ygpP.js} +0 -0
- package/dist/client/assets/{solarized-dark-DZiTscIX.js → solarized-dark-UPcKev9Q.js} +0 -0
- package/dist/client/assets/{solarized-light-DBcfxrfG.js → solarized-light-DUsjROvl.js} +0 -0
- package/dist/client/assets/{solidity-DH-yUSWc.js → solidity-Bfbm9QZQ.js} +0 -0
- package/dist/client/assets/{splunk-CIjc4kxs.js → splunk-6DJA2XFa.js} +0 -0
- package/dist/client/assets/{ssh-config-BKVd4drG.js → ssh-config-CbQtdF-u.js} +0 -0
- package/dist/client/assets/{stylus-tqAsmugv.js → stylus-B_iq45Sj.js} +0 -0
- package/dist/client/assets/{swift-CdDBQ3_Z.js → swift-C7KIgN-p.js} +0 -0
- package/dist/client/assets/{synthwave-84-CbbRs73K.js → synthwave-84-lf_Wt0K_.js} +0 -0
- package/dist/client/assets/{system-verilog-CBqEY-9v.js → system-verilog-C3G9wERd.js} +0 -0
- package/dist/client/assets/{systemd-khRP5zwK.js → systemd-CwxGrojj.js} +0 -0
- package/dist/client/assets/{talonscript-D_lneH-6.js → talonscript-DqnSo1EO.js} +0 -0
- package/dist/client/assets/{tasl-CLymawGe.js → tasl-T8ethp86.js} +0 -0
- package/dist/client/assets/{tcl-BRY1S87U.js → tcl-Ccl366o0.js} +0 -0
- package/dist/client/assets/{terraform-BqohMo2f.js → terraform-BBf6ZI_0.js} +0 -0
- package/dist/client/assets/{tokyo-night-BWUONxad.js → tokyo-night-BF5ata25.js} +0 -0
- package/dist/client/assets/{toml-C4c85Lwg.js → toml-C5Z_BR4r.js} +0 -0
- package/dist/client/assets/{tsv-DsZq9HBQ.js → tsv-rX8sUJs7.js} +0 -0
- package/dist/client/assets/{turtle-Dpr8zLlw.js → turtle-BM-MG8WY.js} +0 -0
- package/dist/client/assets/{typespec-DcqgATB-.js → typespec-C5gKydvR.js} +0 -0
- package/dist/client/assets/{typst-CeVxmuPg.js → typst--_5VchrY.js} +0 -0
- package/dist/client/assets/{v-C2Qsh2-1.js → v-C6PwpmTC.js} +0 -0
- package/dist/client/assets/{vala-CvZ3yL7c.js → vala-4pTaceSj.js} +0 -0
- package/dist/client/assets/{vb-B_p4qDw4.js → vb-DhoR5A6S.js} +0 -0
- package/dist/client/assets/{verilog-D8MGjxD7.js → verilog-B9f_1lPn.js} +0 -0
- package/dist/client/assets/{vesper-DossXiE1.js → vesper-CmBi_iCT.js} +0 -0
- package/dist/client/assets/{vhdl-MLyYh_Gz.js → vhdl-Cy4RAmOe.js} +0 -0
- package/dist/client/assets/{viml-BuYIArcz.js → viml-CFQW-CcD.js} +0 -0
- package/dist/client/assets/{vitesse-black-C3kc1227.js → vitesse-black-CE8RoBJP.js} +0 -0
- package/dist/client/assets/{vitesse-dark-kWOu5V36.js → vitesse-dark-BpF142p_.js} +0 -0
- package/dist/client/assets/{vitesse-light-DMtiL8bK.js → vitesse-light-CMwxPBrg.js} +0 -0
- package/dist/client/assets/{vyper-CNqG09-_.js → vyper-BW5zj9bE.js} +0 -0
- package/dist/client/assets/{wasm-BsQDV7Y0.js → wasm-BigxSLnm.js} +0 -0
- package/dist/client/assets/{wasm-DFVlQlgd.js → wasm-CSccDuAq.js} +0 -0
- package/dist/client/assets/{wenyan-BmOQge13.js → wenyan-BZzM1SQT.js} +0 -0
- package/dist/client/assets/{wgsl-CgWrmvIg.js → wgsl-xBPHbLlq.js} +0 -0
- package/dist/client/assets/{wikitext-DkwckXCk.js → wikitext-BXJWUNJK.js} +0 -0
- package/dist/client/assets/{wit-CtyVFGe7.js → wit-2GnUs67P.js} +0 -0
- package/dist/client/assets/{wolfram-CXE4FrKz.js → wolfram-DIFDmw-g.js} +0 -0
- package/dist/client/assets/{zenscript-DH15wJt0.js → zenscript-DQaUUjbx.js} +0 -0
- package/dist/client/assets/{zig-CqXN9brD.js → zig-BDepRvBi.js} +0 -0
- package/dist/{update-check-KL-2sGxE.mjs → update-check-DAPFCqpF.mjs} +1 -1
package/README.md
CHANGED
|
@@ -22,6 +22,16 @@ diffing
|
|
|
22
22
|
```
|
|
23
23
|
This instantly spins up a local server, establishes an active repository watcher, and opens your default browser to an interactive code review dashboard.
|
|
24
24
|
|
|
25
|
+
Prefer the terminal? Add `--tui` for a native-Rust terminal UI — same review flow, no browser:
|
|
26
|
+
```bash
|
|
27
|
+
diffing --tui
|
|
28
|
+
```
|
|
29
|
+
> [!WARNING]
|
|
30
|
+
> The TUI is **experimental** in v0.3.0. The interface, keymap, and
|
|
31
|
+
> `server.json` (`mode: "tui"`) on-disk format may change in a minor
|
|
32
|
+
> release. The web UI is the supported path for production workflows.
|
|
33
|
+
> See [Native Terminal UI (TUI)](#native-terminal-ui-tui) for the full feature set, keymap, and stability notes.
|
|
34
|
+
|
|
25
35
|
### 3. Update
|
|
26
36
|
Check if a new version is available on npm and upgrade instantly via the CLI:
|
|
27
37
|
```bash
|
|
@@ -40,7 +50,7 @@ A local Hono-powered review server delivers a full-featured GitHub-like code rev
|
|
|
40
50
|
- **Status Dashboard (Comment Tracker)** — Bottom panel tracking open, replied, and resolved comments with filter tabs and click-to-navigate references to the relevant file and line.
|
|
41
51
|
- **Git Diff Stats** — Toolbar displays repo name, branch, file count, and additions/deletions (`+X/-Y`) computed from the patch.
|
|
42
52
|
- **Server-Side State & Drafts Persistence** — No browser storage is used. All settings, UI panels sizing, session states, and comment drafts are securely stored and persisted server-side in the project's global `.diffing` directory (and global settings inside `~/.config/diffing/settings.json`).
|
|
43
|
-
- **Dynamic Font Customization** —
|
|
53
|
+
- **Dynamic Font Customization** — Pick any [Google Fonts](https://fonts.google.com/) family or locally-installed system font for both UI typography and monospace code rendering, configurable via the settings font picker. Google-hosted families are fetched automatically as web fonts and render everywhere; local fonts are applied by name (see the [note on custom fonts](#a-note-on-custom-fonts)).
|
|
44
54
|
- **Resizable Panels** — Drag-to-resize sidebar (240px–640px) and comment tracker panel (100px–600px). Panel states are instantly saved server-side for absolute consistency across browser sessions.
|
|
45
55
|
- **Skeleton Loading Screen** — Full shimmer placeholder UI for toolbar, sidebar, search, tree nodes, and file diffs during initial load.
|
|
46
56
|
- **Image Diff Previews** — Visual side-by-side comparison for added, changed, and deleted image files (PNG, JPEG, GIF, WebP, SVG, BMP, ICO, AVIF).
|
|
@@ -111,6 +121,7 @@ Full keyboard-driven navigation with vim-like motions and a modal status bar:
|
|
|
111
121
|
| `n` | Toggle line numbers |
|
|
112
122
|
| `i` | Cycle diff indicators |
|
|
113
123
|
| `I` | Cycle inline diff type |
|
|
124
|
+
| `Cmd+Shift+P` | Toggle preview mode in comments |
|
|
114
125
|
|
|
115
126
|
### File Navigation & UI
|
|
116
127
|
| Key | Action |
|
|
@@ -131,6 +142,52 @@ A vim-style status bar at the bottom displays the current mode (NORMAL/INSERT),
|
|
|
131
142
|
<img width="1840" height="1196" alt="image" src="https://github.com/user-attachments/assets/d230d020-4fb2-475a-a8a0-0ae11bb271ff" />
|
|
132
143
|
|
|
133
144
|
|
|
145
|
+
---
|
|
146
|
+
|
|
147
|
+
## Native Terminal UI (TUI) — *Experimental*
|
|
148
|
+
|
|
149
|
+
> [!WARNING]
|
|
150
|
+
> The TUI is **experimental** in v0.3.0. The interface, keymap, and on-disk
|
|
151
|
+
> format of `server.json` (`mode: "tui"`) may change in a minor release
|
|
152
|
+
> before stabilisation. The web UI is the supported path for production
|
|
153
|
+
> workflows; please open an issue before depending on the TUI for CI / agent
|
|
154
|
+
> automation. The web review flow, plan review, and PR review are unaffected.
|
|
155
|
+
|
|
156
|
+
`diffing --tui` opens an **opt-in native-Rust terminal interface** that mirrors the web review dashboard — no browser, no Electron, no port. It's a leaf renderer in a new `crates/diffing-tui/` binary: the Node CLI is still the single source of truth for arg parsing, lockfile discovery, and agent handoff, and the TUI reads the same `~/.diffing/<repo>/*` state on disk and writes a `server.json` with `mode: "tui"`.
|
|
157
|
+
|
|
158
|
+
The default `diffing` behaviour is **byte-identical** with and without `--tui` — the TUI is strictly opt-in. If the env cannot support a TUI (piped stdin, CI, no raw mode) or the binary is missing, you get a one-line stderr note and the normal `git diff` output. The web mode is also unaffected by the TUI build; the same `diffing` install serves either.
|
|
159
|
+
|
|
160
|
+
```bash
|
|
161
|
+
diffing --tui # Open the current working tree in the TUI
|
|
162
|
+
diffing --tui --staged # Review staged changes in the TUI
|
|
163
|
+
diffing --tui HEAD~3 # Review working tree vs. 3 commits ago
|
|
164
|
+
diffing --tui main..feature # Compare two branches in the TUI
|
|
165
|
+
diffing --tui -- -- src/ # Limit a TUI review to a directory
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
**Stack** — Rust 1.78+ workspace (`crates/diffing-core/` shared lib + `crates/diffing-tui/` binary), `ratatui` + `crossterm` for rendering, `syntect` for syntax highlighting, `notify-debouncer-full` for live updates.
|
|
169
|
+
|
|
170
|
+
**Features**
|
|
171
|
+
|
|
172
|
+
- **Unified diff render** with a virtualised file card, syntect highlighter, and the same 8 Shiki-compatible colour themes as the web UI.
|
|
173
|
+
- **Vim-style file tree & keymap** — `j/k/gg/G/J/K/Tab/w/t/m/?/` motions, plus `c` (new comment), `e/r/x` (edit / reply / resolve), `]`/`[` (next / previous thread), `?` (help).
|
|
174
|
+
- **Full comment CRUD** — mirrors `src/lib/comments.ts` byte-for-byte; the comment tracker at the bottom lists open / replied / resolved threads with click-to-jump navigation.
|
|
175
|
+
- **Multi-line `tui-textarea` form** with markdown rendering in the preview pane.
|
|
176
|
+
- **Live updates** via `notify` watcher on `comments.json` and the repo working tree — write a comment in another window and it appears immediately.
|
|
177
|
+
- **Send review & agent handoff** — verdict radios + general-comment popover with a live XML preview. Submits via the same `format_comments` envelope as the web UI, copies to clipboard (`pbcopy` / `wl-copy` / `xclip` / `xsel` / `clip.exe`), and persists `pending-review.xml`. The agent-status indicator in the status bar mirrors the web UI's "Send to agent" connection dot.
|
|
178
|
+
- **Cross-platform** — macOS, Linux, and Windows are all first-class. The TUI liveness probe uses `kill(pid, 0)` on Unix and `tasklist /NH /FO CSV` on Windows. Clipboard works on Wayland (`wl-copy`), X11 (`xclip` / `xsel`), macOS (`pbcopy`), and Windows (`clip.exe` / PowerShell `Set-Clipboard`).
|
|
179
|
+
|
|
180
|
+
**Caveat** — the TUI's "Send to agent" writes the review to disk + clipboard but does not actively unblock a long-polling `diffing await-review`; that requires a Node-side change in a follow-up. The web UI's send button remains the supported native handoff path. The `pending-review.xml` is still produced and the review session is still round-incremented — only the long-poll wake-up is missing.
|
|
181
|
+
|
|
182
|
+
**Building the binary locally**
|
|
183
|
+
|
|
184
|
+
```bash
|
|
185
|
+
pnpm build:tui # debug build → target/debug/diffing-tui
|
|
186
|
+
pnpm build:tui --release # release build → target/release/diffing-tui
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
The CLI auto-discovers the binary in the following search order: sibling of `dist/cli.mjs`, `bin/`, `target/release/`, `target/debug/`, then `$PATH`. A `cargo build` (debug) workflow is supported out of the box; you don't need `--release` just to use the TUI.
|
|
190
|
+
|
|
134
191
|
---
|
|
135
192
|
|
|
136
193
|
## Console Startup Animations & Quotes
|
|
@@ -212,7 +269,8 @@ diffing url # Retrieve the active server base URL
|
|
|
212
269
|
diffing plan submit <file> [--title T] [--model M] [--id <id>] [--wait] # Submit/resubmit a plan; prints its id
|
|
213
270
|
diffing plan await [--timeout N] # Block until the human approves/rejects/requests-changes; outputs the verdict XML
|
|
214
271
|
diffing plan list [--json] # List submitted plans with their verdicts
|
|
215
|
-
diffing plan show [<id>] [--json]
|
|
272
|
+
diffing plan show [<id>] [--json] [--version N] # Show one plan as <plan-review> XML (latest if omitted; use --version to read a historical body)
|
|
273
|
+
diffing plan versions <id> [--json] # List every submitted version of a plan, oldest-first (current marked with `*`)
|
|
216
274
|
diffing plan reply <commentId> --body "..." # Reply to an inline plan comment
|
|
217
275
|
diffing plan resolve <commentId> # Mark a plan comment resolved
|
|
218
276
|
```
|
|
@@ -230,7 +288,7 @@ If your agent supports MCP (such as Cursor, Claude Desktop, or Gemini), configur
|
|
|
230
288
|
}
|
|
231
289
|
}
|
|
232
290
|
```
|
|
233
|
-
Exposes tools directly to your agent for both review flows — diff review: `await_review`, `list_comments`, `reply_to_comment`, `resolve_comment`; and plan review: `submit_plan`, `await_plan_review`, `list_plans`, `get_plan`, `reply_to_plan_comment`, `resolve_plan_comment`.
|
|
291
|
+
Exposes tools directly to your agent for both review flows — diff review: `await_review`, `list_comments`, `reply_to_comment`, `resolve_comment`; and plan review: `submit_plan`, `await_plan_review`, `list_plans`, `get_plan`, `get_plan_versions`, `get_plan_version`, `reply_to_plan_comment`, `resolve_plan_comment`.
|
|
234
292
|
|
|
235
293
|
### C. Agent Skills
|
|
236
294
|
You can install diffing skills directly into your AI coding assistant:
|
|
@@ -280,6 +338,13 @@ releases" handoff, applied *before* any code is written.
|
|
|
280
338
|
- **Three-way verdict** — Approve / Request changes / Reject, GitHub-style, with
|
|
281
339
|
an optional overall comment. Resubmitting a revised plan (same id) bumps the
|
|
282
340
|
version and re-opens it for review.
|
|
341
|
+
- **Browse plan versions** — every submitted body is kept on disk, oldest-first.
|
|
342
|
+
A version dropdown next to the `v{n}` chip switches the viewer to any past
|
|
343
|
+
version; comments are filtered to those anchored to the version you're
|
|
344
|
+
reading; a "viewing v{N} of v{M}" banner makes the historical context obvious.
|
|
345
|
+
Available from the CLI (`diffing plan versions <id>`, `diffing plan show <id> --version N`),
|
|
346
|
+
MCP (`get_plan_versions`, `get_plan_version`), and the HTTP API
|
|
347
|
+
(`GET /api/plans/:id/versions`, `GET /api/plans/:id/versions/:n`).
|
|
283
348
|
- **Live "Plans" badge** — the diff toolbar shows a badge counting plans awaiting
|
|
284
349
|
your review, with a green dot when an agent is connected and waiting.
|
|
285
350
|
- **Same channels everywhere** — drive it from the CLI (`diffing plan …`), the
|
|
@@ -315,7 +380,79 @@ self-documenting `<plan-review>` envelope:
|
|
|
315
380
|
|
|
316
381
|
<img width="1667" height="1087" alt="image" src="https://github.com/user-attachments/assets/00e884b5-4c90-4a9a-9e24-9ae57d80f3f2" />
|
|
317
382
|
|
|
383
|
+
---
|
|
384
|
+
|
|
385
|
+
## Reviewing a GitHub PR
|
|
386
|
+
|
|
387
|
+
`diffing` can open a GitHub PR in the same diff UI you use for the working
|
|
388
|
+
tree, and push your review back to GitHub when you're done. The "Send to
|
|
389
|
+
agent" handoff is **structurally absent** in PR mode — there's no way to
|
|
390
|
+
accidentally route a PR review to a coding agent.
|
|
391
|
+
|
|
392
|
+
```text
|
|
393
|
+
# All of these open PR #1234 in the current repo:
|
|
394
|
+
diffing "gh pr 1234"
|
|
395
|
+
diffing --gh-pr 1234
|
|
396
|
+
|
|
397
|
+
# Full URL form:
|
|
398
|
+
diffing "gh pr https://github.com/ahmedragab20/diffing/pull/1234"
|
|
399
|
+
diffing --gh-pr https://github.com/ahmedragab20/diffing/pull/1234
|
|
400
|
+
|
|
401
|
+
# owner/repo#N shorthand (skips the cwd-repo check):
|
|
402
|
+
diffing "gh pr ahmedragab20/diffing#1234"
|
|
403
|
+
```
|
|
404
|
+
|
|
405
|
+
The PR diff loads in the existing `<DiffViewer>` / `<FileTree>` machinery.
|
|
406
|
+
Existing review comments on the PR are fetched and shown as a read-only
|
|
407
|
+
summary strip below each file so you can see what was already said before
|
|
408
|
+
adding your own. Comments you write are kept visually distinct.
|
|
409
|
+
|
|
410
|
+
When you click **Submit to GitHub**, `diffing` builds a `POST
|
|
411
|
+
/repos/{owner}/{repo}/pulls/{pull_number}/reviews` payload and POSTs it
|
|
412
|
+
to GitHub. Multi-line comments are expanded to N single-line comments
|
|
413
|
+
with a `[part N/M]` prefix. Existing comments are **never re-POSTed** —
|
|
414
|
+
only the new ones you wrote in this session.
|
|
415
|
+
|
|
416
|
+
### Headless subcommands
|
|
417
|
+
|
|
418
|
+
For CI / agent use, the same flow is exposed as a `gh` subcommand with no
|
|
419
|
+
UI:
|
|
420
|
+
|
|
421
|
+
```text
|
|
422
|
+
# Submit the current in-progress review to GitHub.
|
|
423
|
+
diffing gh pr-review 1234 --decision request-changes --body "Please address the range"
|
|
424
|
+
|
|
425
|
+
# Dump PR metadata (title, owner, head SHA, existing comments) as JSON.
|
|
426
|
+
diffing gh pr-fetch 1234
|
|
427
|
+
|
|
428
|
+
# List the PR-mode comments in this diffing session (mirrors `diffing comments`).
|
|
429
|
+
diffing gh pr-list-comments
|
|
430
|
+
|
|
431
|
+
# Show the active PR session (ref, owner/repo#n, comment count, submitted status).
|
|
432
|
+
diffing gh status
|
|
433
|
+
```
|
|
434
|
+
|
|
435
|
+
### Authentication
|
|
436
|
+
|
|
437
|
+
The submit path uses the same precedence as the rest of the GitHub
|
|
438
|
+
ecosystem:
|
|
439
|
+
|
|
440
|
+
1. **`gh` CLI** — preferred; uses your existing `gh auth login` session.
|
|
441
|
+
2. **Token env var** — `$GH_TOKEN`, then `$GITHUB_TOKEN`, then
|
|
442
|
+
`$GITHUB_API_TOKEN` (any of the three).
|
|
443
|
+
3. If neither is available, the submit fails with a clear one-line
|
|
444
|
+
message telling you to run `gh auth login` or set `$GITHUB_TOKEN`.
|
|
445
|
+
|
|
446
|
+
The `gh` binary is **only** used for the submit and refresh steps; the
|
|
447
|
+
diff itself is rendered locally, so PR review works offline once the
|
|
448
|
+
session is open.
|
|
449
|
+
|
|
450
|
+
### Storage
|
|
318
451
|
|
|
452
|
+
PR-mode state lives in `pr-session.json` (in the per-repo
|
|
453
|
+
`~/.diffing/<repo>-<hash>/` directory) — a separate file from
|
|
454
|
+
`comments.json` and `plans.json`, so a local review and a PR review can
|
|
455
|
+
coexist without colliding.
|
|
319
456
|
|
|
320
457
|
---
|
|
321
458
|
|
|
@@ -354,6 +491,12 @@ Fine-grained control over how diffs are rendered:
|
|
|
354
491
|
|
|
355
492
|
All settings persist to `~/.config/diffing/settings.json` and the UI updates are wrapped in `useTransition` for non-blocking responsiveness.
|
|
356
493
|
|
|
494
|
+
#### A note on custom fonts
|
|
495
|
+
|
|
496
|
+
Google-hosted families (e.g. `Fira Code`, `Source Code Pro`, `IBM Plex Mono`, `Roboto Mono`) are fetched automatically as web fonts and render in any browser. A **locally-installed** font — a Nerd Font, or a commercial font like `Dank Mono` — is applied by name and renders only if it is installed on your machine **and** your browser allows pages to use local fonts.
|
|
497
|
+
|
|
498
|
+
Privacy-hardened browsers block this: **Brave**, with Shields / "Block fingerprinting" enabled (the default), refuses to render uncommon local fonts as an anti-fingerprinting measure, so the selection silently falls back to the default monospace even though it is installed. To use a local-only font there, either pick a Google-hosted equivalent, or open **Shields** for the diffing site, set fingerprinting to *Allow all*, and reload.
|
|
499
|
+
|
|
357
500
|
---
|
|
358
501
|
|
|
359
502
|
## Merge Conflict Resolution
|
|
@@ -410,6 +553,23 @@ To integrate flawlessly with your existing developer shell workflows, build pipe
|
|
|
410
553
|
> [!TIP]
|
|
411
554
|
> For a full list of all git option categories (algorithms, whitespace ignoring, context lines, word-level diffs, moved/copied detection, and path filtering) supported by `diffing`, see the [CLI Reference Manual](docs/cli.md).
|
|
412
555
|
|
|
556
|
+
### `diffing show` — Review a Commit's Changes (Drop-in for `git show`)
|
|
557
|
+
|
|
558
|
+
`diffing <sha>` runs `git diff <sha>`, which means "diff between `<sha>` and the working tree" — not the changes that commit introduced. If the working tree matches `<sha>`, the patch is empty and the file list renders blank.
|
|
559
|
+
|
|
560
|
+
To review the changes **of** a commit, use the new `show` subcommand. It mirrors `git show` and surfaces each commit's metadata (subject, author, date, message body) above the diff in the web UI:
|
|
561
|
+
|
|
562
|
+
```bash
|
|
563
|
+
diffing show HEAD # Review the tip commit's metadata + diff
|
|
564
|
+
diffing show HEAD~3..HEAD # Review the last 3 commits as a series
|
|
565
|
+
diffing show v1.0 # The commit a tag points to
|
|
566
|
+
diffing show abc123 def456 # Two specific commits, oldest-first
|
|
567
|
+
diffing show HEAD -- src/ # Limit a commit review to a directory
|
|
568
|
+
diffing show HEAD~2..HEAD --terminal # Stream `git show` to your terminal
|
|
569
|
+
```
|
|
570
|
+
|
|
571
|
+
`show` accepts every form `git show` understands (single commit, range, tag, branch tip, multiple SHAs) and is strictly opt-in — `diffing <sha>` keeps its current `git diff <sha>` semantics so existing muscle memory and scripts are unaffected.
|
|
572
|
+
|
|
413
573
|
---
|
|
414
574
|
|
|
415
575
|
## Integration & Configuration
|
|
@@ -502,6 +662,12 @@ For advanced features, internal API endpoints, sequence specifications, and conf
|
|
|
502
662
|
|
|
503
663
|
---
|
|
504
664
|
|
|
665
|
+
## Landing Page
|
|
666
|
+
|
|
667
|
+
<img width="1287" height="6579" alt="screencapture-localhost-3000-2026-05-31-20_57_04" src="https://github.com/user-attachments/assets/a163b00e-a85a-428f-b8d5-2a33ff9fa1eb" />
|
|
668
|
+
|
|
669
|
+
---
|
|
670
|
+
|
|
505
671
|
👉🏻 The project was intially forked from **wong2/diffx**
|
|
506
672
|
|
|
507
673
|
## License
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { a as formatComments, n as readServerLock, t as isLockAlive } from "./server-lock-D73NKKbn.mjs";
|
|
2
|
+
import { n as formatPlanReview } from "./plan-format-mSDtsPcC.mjs";
|
|
2
3
|
import { parseArgs } from "node:util";
|
|
3
4
|
import { readFile } from "node:fs/promises";
|
|
4
5
|
//#region src/cli-agent.ts
|
|
@@ -307,7 +308,10 @@ async function planList(args) {
|
|
|
307
308
|
async function planShow(args) {
|
|
308
309
|
const { values, positionals } = parseArgs({
|
|
309
310
|
args,
|
|
310
|
-
options: {
|
|
311
|
+
options: {
|
|
312
|
+
json: { type: "boolean" },
|
|
313
|
+
version: { type: "string" }
|
|
314
|
+
},
|
|
311
315
|
allowPositionals: true
|
|
312
316
|
});
|
|
313
317
|
const base = baseUrl();
|
|
@@ -326,8 +330,53 @@ async function planShow(args) {
|
|
|
326
330
|
return EXIT_NOT_FOUND;
|
|
327
331
|
}
|
|
328
332
|
const plan = await res.json();
|
|
333
|
+
const requestedVersion = values.version !== void 0 ? Number(values.version) : void 0;
|
|
334
|
+
if (requestedVersion !== void 0 && (!Number.isFinite(requestedVersion) || requestedVersion < 1)) {
|
|
335
|
+
console.error(`--version must be a positive integer.`);
|
|
336
|
+
return EXIT_USAGE;
|
|
337
|
+
}
|
|
338
|
+
if (requestedVersion !== void 0 && requestedVersion !== plan.version) {
|
|
339
|
+
if (!(plan.versions ?? []).find((v) => v.version === requestedVersion)) {
|
|
340
|
+
console.error(`Version ${requestedVersion} not found for plan ${planId} (current: v${plan.version}).`);
|
|
341
|
+
return EXIT_NOT_FOUND;
|
|
342
|
+
}
|
|
343
|
+
}
|
|
329
344
|
if (values.json) process.stdout.write(JSON.stringify(plan, null, 2) + "\n");
|
|
330
|
-
else process.stdout.write(formatPlanReview(plan) + "\n");
|
|
345
|
+
else process.stdout.write(formatPlanReview(plan, { viewingVersion: requestedVersion }) + "\n");
|
|
346
|
+
return EXIT_OK;
|
|
347
|
+
}
|
|
348
|
+
async function planVersions(args) {
|
|
349
|
+
const { values, positionals } = parseArgs({
|
|
350
|
+
args,
|
|
351
|
+
options: { json: { type: "boolean" } },
|
|
352
|
+
allowPositionals: true
|
|
353
|
+
});
|
|
354
|
+
const base = baseUrl();
|
|
355
|
+
let planId = positionals[0];
|
|
356
|
+
if (!planId) {
|
|
357
|
+
console.error("Usage: diffing plan versions <id> [--json]");
|
|
358
|
+
return EXIT_USAGE;
|
|
359
|
+
}
|
|
360
|
+
const planRes = await fetch(`${base}/api/plans/${planId}`);
|
|
361
|
+
if (planRes.status === 404) {
|
|
362
|
+
console.error(`Plan ${planId} not found.`);
|
|
363
|
+
return EXIT_NOT_FOUND;
|
|
364
|
+
}
|
|
365
|
+
const plan = await planRes.json();
|
|
366
|
+
const versions = plan.versions ?? [];
|
|
367
|
+
if (values.json) {
|
|
368
|
+
process.stdout.write(JSON.stringify(versions, null, 2) + "\n");
|
|
369
|
+
return EXIT_OK;
|
|
370
|
+
}
|
|
371
|
+
if (versions.length === 0) {
|
|
372
|
+
console.error("This plan has no recorded versions.");
|
|
373
|
+
return EXIT_OK;
|
|
374
|
+
}
|
|
375
|
+
for (const v of versions) {
|
|
376
|
+
const marker = v.version === plan.version ? "*" : " ";
|
|
377
|
+
const date = new Date(v.createdAt).toISOString().slice(0, 16).replace("T", " ");
|
|
378
|
+
process.stdout.write(`${marker} v${v.version}\t${date}\t${v.title}\n`);
|
|
379
|
+
}
|
|
331
380
|
return EXIT_OK;
|
|
332
381
|
}
|
|
333
382
|
/** Locate which plan owns a given comment id (comment ids are globally unique). */
|
|
@@ -419,10 +468,11 @@ async function plan(args) {
|
|
|
419
468
|
case "await": return planAwait(rest);
|
|
420
469
|
case "list": return planList(rest);
|
|
421
470
|
case "show": return planShow(rest);
|
|
471
|
+
case "versions": return planVersions(rest);
|
|
422
472
|
case "reply": return planReply(rest);
|
|
423
473
|
case "resolve": return planResolve(rest);
|
|
424
474
|
default:
|
|
425
|
-
console.error("Usage: diffing plan <submit|await|list|show|reply|resolve> [...]");
|
|
475
|
+
console.error("Usage: diffing plan <submit|await|list|show|versions|reply|resolve> [...]");
|
|
426
476
|
return EXIT_USAGE;
|
|
427
477
|
}
|
|
428
478
|
}
|
|
@@ -435,8 +485,11 @@ async function runSubcommand(name, args) {
|
|
|
435
485
|
case "url": return url();
|
|
436
486
|
case "plan": return plan(args);
|
|
437
487
|
case "update":
|
|
438
|
-
const { runUpdateCommand } = await import("./update-check-
|
|
488
|
+
const { runUpdateCommand } = await import("./update-check-DAPFCqpF.mjs");
|
|
439
489
|
return runUpdateCommand();
|
|
490
|
+
case "gh":
|
|
491
|
+
const { runGhSubcommand } = await import("./cli-gh-abs-IJrz.mjs");
|
|
492
|
+
return runGhSubcommand(args);
|
|
440
493
|
default:
|
|
441
494
|
console.error(`Unknown subcommand: ${name}`);
|
|
442
495
|
return EXIT_USAGE;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { a as formatComments, n as readServerLock, t as isLockAlive } from "./server-lock-Dj9fG9md.mjs";
|
|
2
|
+
import { n as formatPlanReview } from "./plan-format-DVnF8xrq.mjs";
|
|
2
3
|
import { parseArgs } from "node:util";
|
|
3
4
|
import { readFile } from "node:fs/promises";
|
|
4
5
|
//#region src/cli-agent.ts
|
|
@@ -307,7 +308,10 @@ async function planList(args) {
|
|
|
307
308
|
async function planShow(args) {
|
|
308
309
|
const { values, positionals } = parseArgs({
|
|
309
310
|
args,
|
|
310
|
-
options: {
|
|
311
|
+
options: {
|
|
312
|
+
json: { type: "boolean" },
|
|
313
|
+
version: { type: "string" }
|
|
314
|
+
},
|
|
311
315
|
allowPositionals: true
|
|
312
316
|
});
|
|
313
317
|
const base = baseUrl();
|
|
@@ -326,8 +330,53 @@ async function planShow(args) {
|
|
|
326
330
|
return EXIT_NOT_FOUND;
|
|
327
331
|
}
|
|
328
332
|
const plan = await res.json();
|
|
333
|
+
const requestedVersion = values.version !== void 0 ? Number(values.version) : void 0;
|
|
334
|
+
if (requestedVersion !== void 0 && (!Number.isFinite(requestedVersion) || requestedVersion < 1)) {
|
|
335
|
+
console.error(`--version must be a positive integer.`);
|
|
336
|
+
return EXIT_USAGE;
|
|
337
|
+
}
|
|
338
|
+
if (requestedVersion !== void 0 && requestedVersion !== plan.version) {
|
|
339
|
+
if (!(plan.versions ?? []).find((v) => v.version === requestedVersion)) {
|
|
340
|
+
console.error(`Version ${requestedVersion} not found for plan ${planId} (current: v${plan.version}).`);
|
|
341
|
+
return EXIT_NOT_FOUND;
|
|
342
|
+
}
|
|
343
|
+
}
|
|
329
344
|
if (values.json) process.stdout.write(JSON.stringify(plan, null, 2) + "\n");
|
|
330
|
-
else process.stdout.write(formatPlanReview(plan) + "\n");
|
|
345
|
+
else process.stdout.write(formatPlanReview(plan, { viewingVersion: requestedVersion }) + "\n");
|
|
346
|
+
return EXIT_OK;
|
|
347
|
+
}
|
|
348
|
+
async function planVersions(args) {
|
|
349
|
+
const { values, positionals } = parseArgs({
|
|
350
|
+
args,
|
|
351
|
+
options: { json: { type: "boolean" } },
|
|
352
|
+
allowPositionals: true
|
|
353
|
+
});
|
|
354
|
+
const base = baseUrl();
|
|
355
|
+
let planId = positionals[0];
|
|
356
|
+
if (!planId) {
|
|
357
|
+
console.error("Usage: diffing plan versions <id> [--json]");
|
|
358
|
+
return EXIT_USAGE;
|
|
359
|
+
}
|
|
360
|
+
const planRes = await fetch(`${base}/api/plans/${planId}`);
|
|
361
|
+
if (planRes.status === 404) {
|
|
362
|
+
console.error(`Plan ${planId} not found.`);
|
|
363
|
+
return EXIT_NOT_FOUND;
|
|
364
|
+
}
|
|
365
|
+
const plan = await planRes.json();
|
|
366
|
+
const versions = plan.versions ?? [];
|
|
367
|
+
if (values.json) {
|
|
368
|
+
process.stdout.write(JSON.stringify(versions, null, 2) + "\n");
|
|
369
|
+
return EXIT_OK;
|
|
370
|
+
}
|
|
371
|
+
if (versions.length === 0) {
|
|
372
|
+
console.error("This plan has no recorded versions.");
|
|
373
|
+
return EXIT_OK;
|
|
374
|
+
}
|
|
375
|
+
for (const v of versions) {
|
|
376
|
+
const marker = v.version === plan.version ? "*" : " ";
|
|
377
|
+
const date = new Date(v.createdAt).toISOString().slice(0, 16).replace("T", " ");
|
|
378
|
+
process.stdout.write(`${marker} v${v.version}\t${date}\t${v.title}\n`);
|
|
379
|
+
}
|
|
331
380
|
return EXIT_OK;
|
|
332
381
|
}
|
|
333
382
|
/** Locate which plan owns a given comment id (comment ids are globally unique). */
|
|
@@ -419,10 +468,11 @@ async function plan(args) {
|
|
|
419
468
|
case "await": return planAwait(rest);
|
|
420
469
|
case "list": return planList(rest);
|
|
421
470
|
case "show": return planShow(rest);
|
|
471
|
+
case "versions": return planVersions(rest);
|
|
422
472
|
case "reply": return planReply(rest);
|
|
423
473
|
case "resolve": return planResolve(rest);
|
|
424
474
|
default:
|
|
425
|
-
console.error("Usage: diffing plan <submit|await|list|show|reply|resolve> [...]");
|
|
475
|
+
console.error("Usage: diffing plan <submit|await|list|show|versions|reply|resolve> [...]");
|
|
426
476
|
return EXIT_USAGE;
|
|
427
477
|
}
|
|
428
478
|
}
|
|
@@ -435,8 +485,11 @@ async function runSubcommand(name, args) {
|
|
|
435
485
|
case "url": return url();
|
|
436
486
|
case "plan": return plan(args);
|
|
437
487
|
case "update":
|
|
438
|
-
const { runUpdateCommand } = await import("./update-check-
|
|
488
|
+
const { runUpdateCommand } = await import("./update-check-DAPFCqpF.mjs");
|
|
439
489
|
return runUpdateCommand();
|
|
490
|
+
case "gh":
|
|
491
|
+
const { runGhSubcommand } = await import("./cli-gh-CDGSpndZ.mjs");
|
|
492
|
+
return runGhSubcommand(args);
|
|
440
493
|
default:
|
|
441
494
|
console.error(`Unknown subcommand: ${name}`);
|
|
442
495
|
return EXIT_USAGE;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { a as formatComments, n as readServerLock, t as isLockAlive } from "./server-lock-Dj9fG9md.mjs";
|
|
2
|
+
import { n as formatPlanReview } from "./plan-format-f62JWFI-.mjs";
|
|
2
3
|
import { parseArgs } from "node:util";
|
|
3
4
|
import { readFile } from "node:fs/promises";
|
|
4
5
|
//#region src/cli-agent.ts
|
|
@@ -435,8 +436,11 @@ async function runSubcommand(name, args) {
|
|
|
435
436
|
case "url": return url();
|
|
436
437
|
case "plan": return plan(args);
|
|
437
438
|
case "update":
|
|
438
|
-
const { runUpdateCommand } = await import("./update-check-
|
|
439
|
+
const { runUpdateCommand } = await import("./update-check-DAPFCqpF.mjs");
|
|
439
440
|
return runUpdateCommand();
|
|
441
|
+
case "gh":
|
|
442
|
+
const { runGhSubcommand } = await import("./cli-gh-CDGSpndZ.mjs");
|
|
443
|
+
return runGhSubcommand(args);
|
|
440
444
|
default:
|
|
441
445
|
console.error(`Unknown subcommand: ${name}`);
|
|
442
446
|
return EXIT_USAGE;
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { a as formatComments, n as readServerLock, t as isLockAlive } from "./server-lock-Dj9fG9md.mjs";
|
|
2
|
+
import { parseArgs } from "node:util";
|
|
3
|
+
//#region src/cli-gh.ts
|
|
4
|
+
/**
|
|
5
|
+
* `diffing gh …` — the headless / port-agnostic surface for the PR review
|
|
6
|
+
* mode. Mirrors the shape of the local review CLI: each subcommand resolves
|
|
7
|
+
* the running server from the per-repo lockfile and talks to it via
|
|
8
|
+
* localhost HTTP. No port ever leaves the lockfile.
|
|
9
|
+
*
|
|
10
|
+
* diffing gh pr-fetch <ref> → GET /api/gh/pr/init then dump
|
|
11
|
+
* diffing gh pr-review → POST /api/gh/submit (current session)
|
|
12
|
+
* diffing gh pr-list-comments → GET /api/gh/pr-session/comments (XML)
|
|
13
|
+
* diffing gh status → GET /api/gh/session (one-line summary)
|
|
14
|
+
*/
|
|
15
|
+
const EXIT_OK = 0;
|
|
16
|
+
const EXIT_NO_SERVER = 3;
|
|
17
|
+
const EXIT_NOT_FOUND = 4;
|
|
18
|
+
const EXIT_USAGE = 5;
|
|
19
|
+
function baseUrl() {
|
|
20
|
+
const lock = readServerLock();
|
|
21
|
+
if (!lock || !isLockAlive(lock)) {
|
|
22
|
+
console.error("No diffing server running for this repo. Start one with `diffing \"gh pr <ref>\"`.");
|
|
23
|
+
process.exit(EXIT_NO_SERVER);
|
|
24
|
+
}
|
|
25
|
+
return `http://${lock.host === "0.0.0.0" || lock.host === "::" ? "127.0.0.1" : lock.host}:${lock.port}`;
|
|
26
|
+
}
|
|
27
|
+
async function ghStatus() {
|
|
28
|
+
const base = baseUrl();
|
|
29
|
+
const res = await fetch(`${base}/api/gh/session`);
|
|
30
|
+
if (res.status === 404) {
|
|
31
|
+
console.error("No active PR session. Start one with `diffing \"gh pr <ref>\"`.");
|
|
32
|
+
return EXIT_NOT_FOUND;
|
|
33
|
+
}
|
|
34
|
+
const s = await res.json();
|
|
35
|
+
const submittedLine = s.submittedAt ? `submitted at ${new Date(s.submittedAt).toISOString()} → ${s.submittedReviewUrl ?? "(no url)"}` : "not submitted yet";
|
|
36
|
+
console.log(`${s.owner}/${s.repo}#${s.pullNumber} ${s.title}`);
|
|
37
|
+
console.log(` url: ${s.url}`);
|
|
38
|
+
console.log(` author: ${s.author?.login ?? "(unknown)"}`);
|
|
39
|
+
console.log(` +${s.additions} -${s.deletions} (${s.changedFiles} files)`);
|
|
40
|
+
console.log(` head: ${s.headSha.slice(0, 7)}`);
|
|
41
|
+
console.log(` base: ${s.baseSha.slice(0, 7)}`);
|
|
42
|
+
console.log(` existing: ${s.existingComments?.length ?? 0} review comments (read-only context)`);
|
|
43
|
+
console.log(` new: ${s.comments?.length ?? 0} comments in this session`);
|
|
44
|
+
console.log(` status: ${submittedLine}`);
|
|
45
|
+
return EXIT_OK;
|
|
46
|
+
}
|
|
47
|
+
async function ghPrFetch(args) {
|
|
48
|
+
const { values, positionals } = parseArgs({
|
|
49
|
+
args,
|
|
50
|
+
options: { json: { type: "boolean" } },
|
|
51
|
+
allowPositionals: true
|
|
52
|
+
});
|
|
53
|
+
const ref = positionals[0];
|
|
54
|
+
if (!ref) {
|
|
55
|
+
console.error("Usage: diffing gh pr-fetch <ref> [--json]");
|
|
56
|
+
return EXIT_USAGE;
|
|
57
|
+
}
|
|
58
|
+
const base = baseUrl();
|
|
59
|
+
const res = await fetch(`${base}/api/gh/pr/init`, {
|
|
60
|
+
method: "POST",
|
|
61
|
+
headers: { "Content-Type": "application/json" },
|
|
62
|
+
body: JSON.stringify({ ref })
|
|
63
|
+
});
|
|
64
|
+
if (!res.ok) {
|
|
65
|
+
const err = await res.json().catch(() => ({}));
|
|
66
|
+
console.error(`Failed to fetch PR: ${err.error ?? res.statusText}`);
|
|
67
|
+
return 1;
|
|
68
|
+
}
|
|
69
|
+
const result = await res.json();
|
|
70
|
+
if (values.json) process.stdout.write(JSON.stringify(result, null, 2) + "\n");
|
|
71
|
+
else console.log(`${result.owner}/${result.repo}#${result.pullNumber} ${result.url}`);
|
|
72
|
+
return EXIT_OK;
|
|
73
|
+
}
|
|
74
|
+
async function ghPrListComments() {
|
|
75
|
+
const base = baseUrl();
|
|
76
|
+
const res = await fetch(`${base}/api/gh/pr-session/comments`);
|
|
77
|
+
if (res.status === 404) {
|
|
78
|
+
console.error("No active PR session.");
|
|
79
|
+
return EXIT_NOT_FOUND;
|
|
80
|
+
}
|
|
81
|
+
const comments = await res.json();
|
|
82
|
+
process.stdout.write(formatComments(comments) + "\n");
|
|
83
|
+
return EXIT_OK;
|
|
84
|
+
}
|
|
85
|
+
async function ghPrReview(args) {
|
|
86
|
+
const { values } = parseArgs({
|
|
87
|
+
args,
|
|
88
|
+
options: {
|
|
89
|
+
decision: {
|
|
90
|
+
type: "string",
|
|
91
|
+
short: "d"
|
|
92
|
+
},
|
|
93
|
+
body: {
|
|
94
|
+
type: "string",
|
|
95
|
+
short: "b"
|
|
96
|
+
},
|
|
97
|
+
"dry-run": { type: "boolean" },
|
|
98
|
+
json: { type: "boolean" }
|
|
99
|
+
},
|
|
100
|
+
allowPositionals: false
|
|
101
|
+
});
|
|
102
|
+
const decision = values.decision;
|
|
103
|
+
if (decision !== "approve" && decision !== "comment" && decision !== "request-changes") {
|
|
104
|
+
console.error("Usage: diffing gh pr-review --decision <approve|comment|request-changes> [--body <text>] [--dry-run]");
|
|
105
|
+
return EXIT_USAGE;
|
|
106
|
+
}
|
|
107
|
+
const base = baseUrl();
|
|
108
|
+
const payload = {
|
|
109
|
+
decision,
|
|
110
|
+
body: values.body ?? "",
|
|
111
|
+
dryRun: values["dry-run"] === true
|
|
112
|
+
};
|
|
113
|
+
const res = await fetch(`${base}/api/gh/submit`, {
|
|
114
|
+
method: "POST",
|
|
115
|
+
headers: { "Content-Type": "application/json" },
|
|
116
|
+
body: JSON.stringify(payload)
|
|
117
|
+
});
|
|
118
|
+
if (!res.ok) {
|
|
119
|
+
const err = await res.json().catch(() => ({}));
|
|
120
|
+
console.error(`Failed to submit review: ${err.error ?? res.statusText}`);
|
|
121
|
+
return 1;
|
|
122
|
+
}
|
|
123
|
+
const result = await res.json();
|
|
124
|
+
if (values.json) process.stdout.write(JSON.stringify(result, null, 2) + "\n");
|
|
125
|
+
else if (result.ok) if (result.dryRun) console.log("Dry run OK — payload would have been accepted by GitHub.");
|
|
126
|
+
else console.log(`Review submitted via ${result.authSource}: ${result.reviewUrl ?? `#${result.reviewId}`}`);
|
|
127
|
+
else {
|
|
128
|
+
console.error(`Submit failed (auth=${result.authSource}): ${result.error ?? "unknown error"}`);
|
|
129
|
+
return 1;
|
|
130
|
+
}
|
|
131
|
+
return EXIT_OK;
|
|
132
|
+
}
|
|
133
|
+
async function runGhSubcommand(args) {
|
|
134
|
+
const action = args[0];
|
|
135
|
+
const rest = args.slice(1);
|
|
136
|
+
switch (action) {
|
|
137
|
+
case "status": return ghStatus();
|
|
138
|
+
case "pr-fetch": return ghPrFetch(rest);
|
|
139
|
+
case "pr-review": return ghPrReview(rest);
|
|
140
|
+
case "pr-list-comments": return ghPrListComments();
|
|
141
|
+
default:
|
|
142
|
+
console.error("Usage: diffing gh <status|pr-fetch|pr-review|pr-list-comments> [...]");
|
|
143
|
+
return EXIT_USAGE;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
//#endregion
|
|
147
|
+
export { runGhSubcommand };
|