diffing 0.2.0 → 0.3.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 +185 -4
- package/dist/{cli-agent-Vbs-ePHv.mjs → cli-agent-KxNAFIPf.mjs} +8 -1
- package/dist/cli-gh-CDGSpndZ.mjs +147 -0
- package/dist/cli.mjs +1594 -68
- package/dist/client/assets/{angular-html-fdYbuxHF.js → angular-html-DbbrJavS.js} +1 -1
- package/dist/client/assets/{angular-ts-D3iFqR-R.js → angular-ts-tCrxb1ht.js} +1 -1
- package/dist/client/assets/{apl-MnBV-iQN.js → apl-DawII0w7.js} +1 -1
- package/dist/client/assets/arc-DIRV7ZXr.js +1 -0
- package/dist/client/assets/architecture-7EHR7CIX-BM5HxebS.js +1 -0
- package/dist/client/assets/architectureDiagram-3BPJPVTR-3IoH78OV.js +36 -0
- package/dist/client/assets/array-CkF66D10.js +1 -0
- package/dist/client/assets/{astro-BrpK01E7.js → astro-DIyGTFXc.js} +1 -1
- package/dist/client/assets/{blade-CGmyBuwD.js → blade-CuF4Z1mP.js} +1 -1
- package/dist/client/assets/blockDiagram-GPEHLZMM-CFxPndC0.js +132 -0
- package/dist/client/assets/{bsl-Dx5tFn3i.js → bsl-BrHd4RA2.js} +1 -1
- package/dist/client/assets/{c-xQnwtG9Y.js → c-DUrjo9T5.js} +1 -1
- package/dist/client/assets/c4Diagram-AAUBKEIU-CGMBnkiv.js +10 -0
- package/dist/client/assets/{cairo-wCCQTdA9.js → cairo-BDZ6TRZS.js} +1 -1
- package/dist/client/assets/channel-D5AdjEWX.js +1 -0
- package/dist/client/assets/chunk-2J33WTMH-CJMBLaXy.js +1 -0
- package/dist/client/assets/chunk-3OPIFGDE-C9HQWVLl.js +62 -0
- package/dist/client/assets/chunk-4BX2VUAB-Qqg72GQd.js +1 -0
- package/dist/client/assets/chunk-4EGX6M5U-C70lfA2p.js +1 -0
- package/dist/client/assets/chunk-55IACEB6-DZF8brTR.js +1 -0
- package/dist/client/assets/chunk-5DO6E6H7-PprNUwlI.js +1 -0
- package/dist/client/assets/chunk-5ZQYHXKU-BflVFV5z.js +2 -0
- package/dist/client/assets/chunk-727SXJPM-COn6BRLY.js +206 -0
- package/dist/client/assets/chunk-AQP2D5EJ-CNOjODUR.js +231 -0
- package/dist/client/assets/chunk-BR22UD5L-D8XCYMy9.js +1 -0
- package/dist/client/assets/chunk-BSJP7CBP-PQX4ASCI.js +1 -0
- package/dist/client/assets/chunk-CSCIHK7Q-BfmUvL-L.js +124 -0
- package/dist/client/assets/chunk-FHYWG6QK-CcHPrHH1.js +1 -0
- package/dist/client/assets/chunk-FMBD7UC4-DorfwLnQ.js +15 -0
- package/dist/client/assets/chunk-KSCS5N6A-CXY93mId.js +10 -0
- package/dist/client/assets/chunk-L5ZTLDWV-BjMrSVmH.js +1 -0
- package/dist/client/assets/chunk-LZXEDZCA-q8jj6Nyb.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-BRRQbYHl.js +1 -0
- package/dist/client/assets/chunk-NNHCCRGN-DHF3V75i.js +159 -0
- package/dist/client/assets/chunk-NZK2D7GU-Czt1qHrO.js +1 -0
- package/dist/client/assets/chunk-O5CBEL6O-DEopURak.js +70 -0
- package/dist/client/assets/chunk-PUPMXCY4-D0KKIhut.js +1 -0
- package/dist/client/assets/chunk-QZHKN3VN-BE917fn9.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-DdoWnPla.js +1 -0
- package/dist/client/assets/chunk-XPW4576I-DocCoKUT.js +32 -0
- package/dist/client/assets/classDiagram-4FO5ZUOK-CxjhKO7s.js +1 -0
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-CSScAAQ4.js +1 -0
- package/dist/client/assets/{cobol-ypVzOIQu.js → cobol-BylylR2x.js} +1 -1
- package/dist/client/assets/{coffee-CrtE1uj2.js → coffee-DCKfk8xx.js} +1 -1
- package/dist/client/assets/cose-bilkent-S5V4N54A-Cm0BD5CS.js +1 -0
- package/dist/client/assets/{cpp-DLd4XEKA.js → cpp-CfKCIrGK.js} +1 -1
- package/dist/client/assets/{crystal-CJYvpLt_.js → crystal-v-9RIu3l.js} +1 -1
- package/dist/client/assets/{css-DrX2B9os.js → css-XjlXeGmZ.js} +1 -1
- package/dist/client/assets/cytoscape.esm-B7MQoI9k.js +321 -0
- package/dist/client/assets/dagre-BM42HDAG-kqgFUaF1.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-B3hBvGUc.js +43 -0
- package/dist/client/assets/diagram-5GNKFQAL-r8zU8C-Y.js +10 -0
- package/dist/client/assets/diagram-KO2AKTUF-CDWD5zkZ.js +3 -0
- package/dist/client/assets/diagram-LMA3HP47-CRRfS6RD.js +24 -0
- package/dist/client/assets/diagram-OG6HWLK6-ChBS6E-K.js +24 -0
- package/dist/client/assets/dist-DUTeKbN7.js +1 -0
- package/dist/client/assets/{edge-BsQYk9OW.js → edge-Cwh953i8.js} +1 -1
- package/dist/client/assets/{elixir-DU_VfGYR.js → elixir-C4MgLzTj.js} +1 -1
- package/dist/client/assets/{elm-W4eOLEDv.js → elm-CFBu8r7i.js} +1 -1
- package/dist/client/assets/erDiagram-TEJ5UH35-_03Fb9RH.js +85 -0
- package/dist/client/assets/{erb-D9FdIJ2e.js → erb-CrCna7R1.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-D9pSaH_8.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-DKBfXY9D.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-BtPCXjbS.js → git-rebase-CExLk2dD.js} +1 -1
- package/dist/client/assets/gitGraph-WXDBUCRP-D_3ZhTam.js +1 -0
- package/dist/client/assets/gitGraphDiagram-PVQCEYII-BPQ2kpJA.js +106 -0
- package/dist/client/assets/{glimmer-js-BVfUGMUb.js → glimmer-js-wjBSKaMu.js} +1 -1
- package/dist/client/assets/{glimmer-ts-BZEaHDZL.js → glimmer-ts-CyjMXDgZ.js} +1 -1
- package/dist/client/assets/{glsl-CSiNDuwt.js → glsl-CWOoN8or.js} +1 -1
- package/dist/client/assets/graphlib-DBdw4opr.js +1 -0
- package/dist/client/assets/{graphql-Crf08Rhb.js → graphql-DI5CB58U.js} +1 -1
- package/dist/client/assets/{hack-DUiQuO20.js → hack-Ct_Cm7Pr.js} +1 -1
- package/dist/client/assets/{haml-BtvVTDRG.js → haml-DzAjli8d.js} +1 -1
- package/dist/client/assets/{handlebars-Bu_cdZA_.js → handlebars-BfJB0RYx.js} +1 -1
- package/dist/client/assets/{html-C4cun3zD.js → html-CK8auhK8.js} +1 -1
- package/dist/client/assets/{html-derivative-CQnD80KV.js → html-derivative-B7VntYnF.js} +1 -1
- package/dist/client/assets/{http-DuOJF9Kg.js → http-_Zy71Sv3.js} +1 -1
- package/dist/client/assets/{hurl-DgrdYsYh.js → hurl-VbL4I95z.js} +1 -1
- package/dist/client/assets/{hxml-DC4KwKt2.js → hxml-nwJci6H5.js} +1 -1
- package/dist/client/assets/index-C3p7VKOX.css +1 -0
- package/dist/client/assets/index-Dv9jPmOc.js +3921 -0
- package/dist/client/assets/info-J43DQDTF-CAllC7mK.js +1 -0
- package/dist/client/assets/infoDiagram-5YYISTIA-B5RN-4Ke.js +2 -0
- package/dist/client/assets/init-Ce66tIvf.js +1 -0
- package/dist/client/assets/ishikawaDiagram-YF4QCWOH-DpbSX3Zy.js +70 -0
- package/dist/client/assets/{java-D-vtFiv8.js → java-0CC2DnK9.js} +1 -1
- package/dist/client/assets/{javascript-CFYFXvdN.js → javascript-DKSTP7rz.js} +1 -1
- package/dist/client/assets/{jinja-fZvIg2_s.js → jinja-DoGBHNJ6.js} +1 -1
- package/dist/client/assets/{jison-DEzxLq5g.js → jison-Bnl3lPA2.js} +1 -1
- package/dist/client/assets/journeyDiagram-JHISSGLW-B_X4_qPO.js +139 -0
- package/dist/client/assets/{json-QM4VBqMC.js → json-BQ3Ddj6g.js} +1 -1
- package/dist/client/assets/{jsx-DLzUM_cC.js → jsx-C_aFDuFZ.js} +1 -1
- package/dist/client/assets/{julia-Dwt1SIpn.js → julia-nIjp5yMR.js} +1 -1
- package/dist/client/assets/{just-Dwp-hLcL.js → just-zc4yJ46n.js} +1 -1
- package/dist/client/assets/kanban-definition-UN3LZRKU-BSs4C5DW.js +89 -0
- package/dist/client/assets/katex-eRFNlMh0.js +257 -0
- package/dist/client/assets/{latex-CMF1JViz.js → latex-BszBC80j.js} +1 -1
- package/dist/client/assets/line-C9HWVwPi.js +1 -0
- package/dist/client/assets/linear-DatJfpKY.js +1 -0
- package/dist/client/assets/{liquid-czkpOZWY.js → liquid-DglQpTge.js} +1 -1
- package/dist/client/assets/{lua-DE5PD0Vh.js → lua-BcbliFeR.js} +1 -1
- package/dist/client/assets/{marko-DHeEvZiW.js → marko-BPm4M8j-.js} +1 -1
- package/dist/client/assets/{mdc-B941liUQ.js → mdc-BNUj07UF.js} +1 -1
- package/dist/client/assets/mermaid-parser.core-BVEKlqQr.js +4 -0
- package/dist/client/assets/mermaid.core-DVis21V_.js +9 -0
- package/dist/client/assets/mindmap-definition-RKZ34NQL-Cuo7KewF.js +96 -0
- package/dist/client/assets/{nextflow-CApkvBGW.js → nextflow-DSfydIxt.js} +1 -1
- package/dist/client/assets/{nginx-Pb9t8c-r.js → nginx-CSSJwkd6.js} +1 -1
- package/dist/client/assets/{nim-MMUvW_R1.js → nim-nQAskwTR.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-DXwXRmuC.js → perl-CtH8xYH6.js} +1 -1
- package/dist/client/assets/{php-D42kv59r.js → php-Dcc3T2PH.js} +1 -1
- package/dist/client/assets/pie-LRSECV5Y-FXFFfdz2.js +1 -0
- package/dist/client/assets/pieDiagram-4H26LBE5-BfpvCRmo.js +30 -0
- package/dist/client/assets/{pug-v0iesski.js → pug-BCLaymlV.js} +1 -1
- package/dist/client/assets/{qml-spxQQ-ei.js → qml-BpKydcOi.js} +1 -1
- package/dist/client/assets/quadrantDiagram-W4KKPZXB-CJY6un0-.js +7 -0
- package/dist/client/assets/{r-CobWTBG9.js → r-BzCB9dpd.js} +1 -1
- package/dist/client/assets/radar-GUYGQ44K-BKTzSQ68.js +1 -0
- package/dist/client/assets/{razor-B-_Ww3MB.js → razor-BWmujqiQ.js} +1 -1
- package/dist/client/assets/{regexp-BJMVs8R0.js → regexp-urCI3YiZ.js} +1 -1
- package/dist/client/assets/requirementDiagram-4Y6WPE33-DIHWguS0.js +84 -0
- package/dist/client/assets/rough.esm-BBrzuQ0N.js +1 -0
- package/dist/client/assets/{rst-BHcaWsY0.js → rst-YTDC9H6u.js} +1 -1
- package/dist/client/assets/{ruby-BCMT6kog.js → ruby-v1IXQAFZ.js} +1 -1
- package/dist/client/assets/sankeyDiagram-5OEKKPKP-DJRPEO_F.js +40 -0
- package/dist/client/assets/{sas-DHfZnd3R.js → sas-KDUG3BSk.js} +1 -1
- package/dist/client/assets/{scss-DjDsJvDO.js → scss-pLIGFpjD.js} +1 -1
- package/dist/client/assets/sequenceDiagram-3UESZ5HK-DX0jVCOU.js +162 -0
- package/dist/client/assets/{shaderlab-DXAhMdPo.js → shaderlab-CbbQwRPF.js} +1 -1
- package/dist/client/assets/{shellscript-B6qaIiU-.js → shellscript-B5ZTyEsK.js} +1 -1
- package/dist/client/assets/{shellsession-ByCeir2b.js → shellsession-DVK3bw4p.js} +1 -1
- package/dist/client/assets/{soy-C6WpnMSF.js → soy-BXgyj2-T.js} +1 -1
- package/dist/client/assets/{sparql-BdcL8cbr.js → sparql-DEoxFJ5d.js} +1 -1
- package/dist/client/assets/{sql-BIvSNLV_.js → sql-G2vZCmw6.js} +1 -1
- package/dist/client/assets/src-D9zkqEEX.js +1 -0
- package/dist/client/assets/{stata-PG9iZ--I.js → stata-C4mEnygx.js} +1 -1
- package/dist/client/assets/stateDiagram-AJRCARHV-AMtMxKgQ.js +1 -0
- package/dist/client/assets/stateDiagram-v2-BHNVJYJU-C89CM-_4.js +1 -0
- package/dist/client/assets/{surrealql-CmvCzG09.js → surrealql-Bf8gsTcP.js} +1 -1
- package/dist/client/assets/{svelte-ChumG88s.js → svelte-C1oIyl9t.js} +1 -1
- package/dist/client/assets/{templ-CmzuRY_a.js → templ-PJcWUuTF.js} +1 -1
- package/dist/client/assets/{tex-DL8t-_eJ.js → tex-B7Fnujsi.js} +1 -1
- package/dist/client/assets/timeline-definition-PNZ67QCA-BZJSqcAg.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-BFfE0Egm.js → ts-tags-CAAsFnUt.js} +1 -1
- package/dist/client/assets/{tsx-C1bFyHcE.js → tsx-DAKyTsWW.js} +1 -1
- package/dist/client/assets/{twig-DkIluZEQ.js → twig-Bd4dieZF.js} +1 -1
- package/dist/client/assets/{typescript-Gc86Bc3j.js → typescript-8myByDGd.js} +1 -1
- package/dist/client/assets/vennDiagram-CIIHVFJN-CMjBZNs2.js +34 -0
- package/dist/client/assets/{vue-C88JmL53.js → vue-fBA2B-QU.js} +1 -1
- package/dist/client/assets/{vue-html-Cry4aksC.js → vue-html-DEZECpsR.js} +1 -1
- package/dist/client/assets/{vue-vine-zlDkA3Ui.js → vue-vine-B_gG939R.js} +1 -1
- package/dist/client/assets/wardley-L42UT6IY-pROVAAhW.js +1 -0
- package/dist/client/assets/wardleyDiagram-YWT4CUSO-qeHmPLyL.js +78 -0
- package/dist/client/assets/{xml-NvwpIFDy.js → xml-DbXNss3s.js} +1 -1
- package/dist/client/assets/{xsl-CDjXvY9w.js → xsl-B7_dgqqc.js} +1 -1
- package/dist/client/assets/xychartDiagram-2RQKCTM6-NN2Et7YL.js +7 -0
- package/dist/client/assets/{yaml-Bh-LPjcH.js → yaml-DSyIApdJ.js} +1 -1
- package/dist/client/index.html +2 -5
- package/dist/{mcp-DKlThflu.mjs → mcp-BWeWR4yd.mjs} +3 -1
- package/dist/plan-format-f62JWFI-.mjs +117 -0
- package/dist/{server-lock-CAdqFSfl.mjs → server-lock-Dj9fG9md.mjs} +279 -132
- package/dist/update-check-DAPFCqpF.mjs +129 -0
- package/package.json +15 -5
- 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-WzJPMH52.mjs +0 -174
- package/dist/cli-agent-uYUoCA4X.mjs +0 -179
- package/dist/client/assets/index-CZZd7iTh.js +0 -3887
- package/dist/client/assets/index-CkC-EvWo.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-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-DIkImokU.mjs +0 -487
- package/dist/server-lock-DbxpfF3j.mjs +0 -575
- /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/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
A local-first code review tool and double-sided bridge designed for the modern AI coding agent workflow. Review AI-generated changes in a high-fidelity, GitHub-like web UI, leave inline comments, and hand them back to your coding agent to fix in real time — and review the agent's **plan** the same way *before* it writes any code, approving, rejecting, or requesting changes on specific lines and sections.
|
|
4
4
|
|
|
5
|
-
<img width="
|
|
5
|
+
<img width="1667" height="1087" alt="image" src="https://github.com/user-attachments/assets/52dcd2af-fc85-44ba-a679-4609e667c6f4" />
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
---
|
|
@@ -22,6 +22,22 @@ 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
|
+
|
|
35
|
+
### 3. Update
|
|
36
|
+
Check if a new version is available on npm and upgrade instantly via the CLI:
|
|
37
|
+
```bash
|
|
38
|
+
diffing update
|
|
39
|
+
```
|
|
40
|
+
|
|
25
41
|
---
|
|
26
42
|
|
|
27
43
|
## Web UI Review Dashboard
|
|
@@ -33,7 +49,9 @@ A local Hono-powered review server delivers a full-featured GitHub-like code rev
|
|
|
33
49
|
- **Interactive File Tree** — Hierarchical file navigation sidebar with collapsible folders, viewed/unviewed tracking, and change-type indicators (added, modified, deleted).
|
|
34
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.
|
|
35
51
|
- **Git Diff Stats** — Toolbar displays repo name, branch, file count, and additions/deletions (`+X/-Y`) computed from the patch.
|
|
36
|
-
- **
|
|
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`).
|
|
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)).
|
|
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.
|
|
37
55
|
- **Skeleton Loading Screen** — Full shimmer placeholder UI for toolbar, sidebar, search, tree nodes, and file diffs during initial load.
|
|
38
56
|
- **Image Diff Previews** — Visual side-by-side comparison for added, changed, and deleted image files (PNG, JPEG, GIF, WebP, SVG, BMP, ICO, AVIF).
|
|
39
57
|
|
|
@@ -61,7 +79,8 @@ A local Hono-powered review server delivers a full-featured GitHub-like code rev
|
|
|
61
79
|
- **Instant Switching** — CSS transitions suppressed during theme changes for a snappy, lag-free experience.
|
|
62
80
|
- **Persistent Setting** — Theme choice saved to `~/.config/diffing/settings.json` and restored on next launch.
|
|
63
81
|
|
|
64
|
-
<img width="
|
|
82
|
+
<img width="1667" height="1087" alt="image" src="https://github.com/user-attachments/assets/6e4a4552-fef2-4002-8b8f-b544c95c4c26" />
|
|
83
|
+
|
|
65
84
|
|
|
66
85
|
|
|
67
86
|
---
|
|
@@ -122,6 +141,61 @@ A vim-style status bar at the bottom displays the current mode (NORMAL/INSERT),
|
|
|
122
141
|
<img width="1840" height="1196" alt="image" src="https://github.com/user-attachments/assets/d230d020-4fb2-475a-a8a0-0ae11bb271ff" />
|
|
123
142
|
|
|
124
143
|
|
|
144
|
+
---
|
|
145
|
+
|
|
146
|
+
## Native Terminal UI (TUI) — *Experimental*
|
|
147
|
+
|
|
148
|
+
> [!WARNING]
|
|
149
|
+
> The TUI is **experimental** in v0.3.0. The interface, keymap, and on-disk
|
|
150
|
+
> format of `server.json` (`mode: "tui"`) may change in a minor release
|
|
151
|
+
> before stabilisation. The web UI is the supported path for production
|
|
152
|
+
> workflows; please open an issue before depending on the TUI for CI / agent
|
|
153
|
+
> automation. The web review flow, plan review, and PR review are unaffected.
|
|
154
|
+
|
|
155
|
+
`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"`.
|
|
156
|
+
|
|
157
|
+
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.
|
|
158
|
+
|
|
159
|
+
```bash
|
|
160
|
+
diffing --tui # Open the current working tree in the TUI
|
|
161
|
+
diffing --tui --staged # Review staged changes in the TUI
|
|
162
|
+
diffing --tui HEAD~3 # Review working tree vs. 3 commits ago
|
|
163
|
+
diffing --tui main..feature # Compare two branches in the TUI
|
|
164
|
+
diffing --tui -- -- src/ # Limit a TUI review to a directory
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
**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.
|
|
168
|
+
|
|
169
|
+
**Features**
|
|
170
|
+
|
|
171
|
+
- **Unified diff render** with a virtualised file card, syntect highlighter, and the same 8 Shiki-compatible colour themes as the web UI.
|
|
172
|
+
- **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).
|
|
173
|
+
- **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.
|
|
174
|
+
- **Multi-line `tui-textarea` form** with markdown rendering in the preview pane.
|
|
175
|
+
- **Live updates** via `notify` watcher on `comments.json` and the repo working tree — write a comment in another window and it appears immediately.
|
|
176
|
+
- **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.
|
|
177
|
+
- **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`).
|
|
178
|
+
|
|
179
|
+
**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.
|
|
180
|
+
|
|
181
|
+
**Building the binary locally**
|
|
182
|
+
|
|
183
|
+
```bash
|
|
184
|
+
pnpm build:tui # debug build → target/debug/diffing-tui
|
|
185
|
+
pnpm build:tui --release # release build → target/release/diffing-tui
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
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.
|
|
189
|
+
|
|
190
|
+
---
|
|
191
|
+
|
|
192
|
+
## Console Startup Animations & Quotes
|
|
193
|
+
|
|
194
|
+
Every time you launch `diffing` in the terminal, it serves a highly polished, interactive greeting before the browser opens:
|
|
195
|
+
- **256-Color Monochromatic Palettes** — Beautifully rendered box outlines across 6 monochromatic themes (Cyan, Green, Magenta, Yellow, Blue, Orange) with custom faint, base, glow, and text hues.
|
|
196
|
+
- **Dynamic Startup Animations** — Instantly runs one of 6 terminal-based micro-animations (Typewriter, Wave Reveal, Slide-In, Pulse Border, Glitch Noise, Matrix Rain) underneath the local server URL.
|
|
197
|
+
- **Motivational Developer Quotes** — Settles to display one of 30 curated, funny, philosophical, or motivational developer quotes to kick off your review session.
|
|
198
|
+
|
|
125
199
|
---
|
|
126
200
|
|
|
127
201
|
## Performance & Speed
|
|
@@ -295,6 +369,82 @@ self-documenting `<plan-review>` envelope:
|
|
|
295
369
|
</plan-review>
|
|
296
370
|
```
|
|
297
371
|
|
|
372
|
+
<img width="1667" height="1087" alt="image" src="https://github.com/user-attachments/assets/00e884b5-4c90-4a9a-9e24-9ae57d80f3f2" />
|
|
373
|
+
|
|
374
|
+
---
|
|
375
|
+
|
|
376
|
+
## Reviewing a GitHub PR
|
|
377
|
+
|
|
378
|
+
`diffing` can open a GitHub PR in the same diff UI you use for the working
|
|
379
|
+
tree, and push your review back to GitHub when you're done. The "Send to
|
|
380
|
+
agent" handoff is **structurally absent** in PR mode — there's no way to
|
|
381
|
+
accidentally route a PR review to a coding agent.
|
|
382
|
+
|
|
383
|
+
```text
|
|
384
|
+
# All of these open PR #1234 in the current repo:
|
|
385
|
+
diffing "gh pr 1234"
|
|
386
|
+
diffing --gh-pr 1234
|
|
387
|
+
|
|
388
|
+
# Full URL form:
|
|
389
|
+
diffing "gh pr https://github.com/ahmedragab20/diffing/pull/1234"
|
|
390
|
+
diffing --gh-pr https://github.com/ahmedragab20/diffing/pull/1234
|
|
391
|
+
|
|
392
|
+
# owner/repo#N shorthand (skips the cwd-repo check):
|
|
393
|
+
diffing "gh pr ahmedragab20/diffing#1234"
|
|
394
|
+
```
|
|
395
|
+
|
|
396
|
+
The PR diff loads in the existing `<DiffViewer>` / `<FileTree>` machinery.
|
|
397
|
+
Existing review comments on the PR are fetched and shown as a read-only
|
|
398
|
+
summary strip below each file so you can see what was already said before
|
|
399
|
+
adding your own. Comments you write are kept visually distinct.
|
|
400
|
+
|
|
401
|
+
When you click **Submit to GitHub**, `diffing` builds a `POST
|
|
402
|
+
/repos/{owner}/{repo}/pulls/{pull_number}/reviews` payload and POSTs it
|
|
403
|
+
to GitHub. Multi-line comments are expanded to N single-line comments
|
|
404
|
+
with a `[part N/M]` prefix. Existing comments are **never re-POSTed** —
|
|
405
|
+
only the new ones you wrote in this session.
|
|
406
|
+
|
|
407
|
+
### Headless subcommands
|
|
408
|
+
|
|
409
|
+
For CI / agent use, the same flow is exposed as a `gh` subcommand with no
|
|
410
|
+
UI:
|
|
411
|
+
|
|
412
|
+
```text
|
|
413
|
+
# Submit the current in-progress review to GitHub.
|
|
414
|
+
diffing gh pr-review 1234 --decision request-changes --body "Please address the range"
|
|
415
|
+
|
|
416
|
+
# Dump PR metadata (title, owner, head SHA, existing comments) as JSON.
|
|
417
|
+
diffing gh pr-fetch 1234
|
|
418
|
+
|
|
419
|
+
# List the PR-mode comments in this diffing session (mirrors `diffing comments`).
|
|
420
|
+
diffing gh pr-list-comments
|
|
421
|
+
|
|
422
|
+
# Show the active PR session (ref, owner/repo#n, comment count, submitted status).
|
|
423
|
+
diffing gh status
|
|
424
|
+
```
|
|
425
|
+
|
|
426
|
+
### Authentication
|
|
427
|
+
|
|
428
|
+
The submit path uses the same precedence as the rest of the GitHub
|
|
429
|
+
ecosystem:
|
|
430
|
+
|
|
431
|
+
1. **`gh` CLI** — preferred; uses your existing `gh auth login` session.
|
|
432
|
+
2. **Token env var** — `$GH_TOKEN`, then `$GITHUB_TOKEN`, then
|
|
433
|
+
`$GITHUB_API_TOKEN` (any of the three).
|
|
434
|
+
3. If neither is available, the submit fails with a clear one-line
|
|
435
|
+
message telling you to run `gh auth login` or set `$GITHUB_TOKEN`.
|
|
436
|
+
|
|
437
|
+
The `gh` binary is **only** used for the submit and refresh steps; the
|
|
438
|
+
diff itself is rendered locally, so PR review works offline once the
|
|
439
|
+
session is open.
|
|
440
|
+
|
|
441
|
+
### Storage
|
|
442
|
+
|
|
443
|
+
PR-mode state lives in `pr-session.json` (in the per-repo
|
|
444
|
+
`~/.diffing/<repo>-<hash>/` directory) — a separate file from
|
|
445
|
+
`comments.json` and `plans.json`, so a local review and a PR review can
|
|
446
|
+
coexist without colliding.
|
|
447
|
+
|
|
298
448
|
---
|
|
299
449
|
|
|
300
450
|
## Inline Comment System
|
|
@@ -304,7 +454,7 @@ Rich, real-time comment threads directly on diff lines:
|
|
|
304
454
|
- **Inline Threads** — Hover and click the `+` button on any addition or deletion line to start a thread. Supports markdown (GFM + line breaks) with syntax-highlighted fenced code blocks.
|
|
305
455
|
- **Multi-Line Comments** — Select a line range to comment on an entire block of code.
|
|
306
456
|
- **File-Level Comments** — Add general comments scoped to the entire file without targeting a specific line.
|
|
307
|
-
- **Comment Drafts** —
|
|
457
|
+
- **Comment Drafts** — Draft system (`diffing-draft-*` keys) with 7-day TTL, stored in the global `.diffing` folder so drafts survive page refreshes without any browser storage footprint.
|
|
308
458
|
- **Agent Attribution** — Replies carry `role` (`user`/`agent`) and the agent's `model` name for clear attribution.
|
|
309
459
|
- **Suggestion Application** — Parse `` ```suggestion `` code blocks from comment bodies and apply them to the file in one click via `POST /api/comments/:id/apply-suggestion`.
|
|
310
460
|
- **Full CRUD API** — REST endpoints for creating, reading, updating, and deleting comments and replies.
|
|
@@ -324,12 +474,20 @@ Fine-grained control over how diffs are rendered:
|
|
|
324
474
|
| **Hunk Separators** | `simple`, `metadata`, `line-info`, `line-info-basic` | Style of the separator bar between diff hunks |
|
|
325
475
|
| **Line Hover Highlight** | `both`, `line`, `number`, `disabled` | Which element highlights on hover |
|
|
326
476
|
| **Font Size** | 11px – 16px | Configure globally |
|
|
477
|
+
| **UI Font** | Any system or Google font (default Geist Mono) | Customize typography for the Web UI layout |
|
|
478
|
+
| **Mono Font** | Any system or Google font (default JetBrains Mono) | Customize typography for code/diff block displays |
|
|
327
479
|
| **Tab Size** | 2 / 4 / 8 | Default tab width (overridden per-file by EditorConfig) |
|
|
328
480
|
| **Expandable Context** | `expandContextByDefault`, `collapsedContextThreshold` (default 10 lines), `expansionLineCount` (default 20) | Control how collapsed context regions behave |
|
|
329
481
|
| **Haptic & Sound Feedback** | on / off | Tactile feedback via `web-haptics` and synthesized audio cues (click, toggle, navigate, open, close, resolve, send, error) |
|
|
330
482
|
|
|
331
483
|
All settings persist to `~/.config/diffing/settings.json` and the UI updates are wrapped in `useTransition` for non-blocking responsiveness.
|
|
332
484
|
|
|
485
|
+
#### A note on custom fonts
|
|
486
|
+
|
|
487
|
+
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.
|
|
488
|
+
|
|
489
|
+
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.
|
|
490
|
+
|
|
333
491
|
---
|
|
334
492
|
|
|
335
493
|
## Merge Conflict Resolution
|
|
@@ -386,6 +544,23 @@ To integrate flawlessly with your existing developer shell workflows, build pipe
|
|
|
386
544
|
> [!TIP]
|
|
387
545
|
> 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).
|
|
388
546
|
|
|
547
|
+
### `diffing show` — Review a Commit's Changes (Drop-in for `git show`)
|
|
548
|
+
|
|
549
|
+
`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.
|
|
550
|
+
|
|
551
|
+
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:
|
|
552
|
+
|
|
553
|
+
```bash
|
|
554
|
+
diffing show HEAD # Review the tip commit's metadata + diff
|
|
555
|
+
diffing show HEAD~3..HEAD # Review the last 3 commits as a series
|
|
556
|
+
diffing show v1.0 # The commit a tag points to
|
|
557
|
+
diffing show abc123 def456 # Two specific commits, oldest-first
|
|
558
|
+
diffing show HEAD -- src/ # Limit a commit review to a directory
|
|
559
|
+
diffing show HEAD~2..HEAD --terminal # Stream `git show` to your terminal
|
|
560
|
+
```
|
|
561
|
+
|
|
562
|
+
`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.
|
|
563
|
+
|
|
389
564
|
---
|
|
390
565
|
|
|
391
566
|
## Integration & Configuration
|
|
@@ -478,6 +653,12 @@ For advanced features, internal API endpoints, sequence specifications, and conf
|
|
|
478
653
|
|
|
479
654
|
---
|
|
480
655
|
|
|
656
|
+
## Landing Page
|
|
657
|
+
|
|
658
|
+
<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" />
|
|
659
|
+
|
|
660
|
+
---
|
|
661
|
+
|
|
481
662
|
👉🏻 The project was intially forked from **wong2/diffx**
|
|
482
663
|
|
|
483
664
|
## License
|
|
@@ -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
|
|
@@ -434,6 +435,12 @@ async function runSubcommand(name, args) {
|
|
|
434
435
|
case "comments": return comments(args);
|
|
435
436
|
case "url": return url();
|
|
436
437
|
case "plan": return plan(args);
|
|
438
|
+
case "update":
|
|
439
|
+
const { runUpdateCommand } = await import("./update-check-DAPFCqpF.mjs");
|
|
440
|
+
return runUpdateCommand();
|
|
441
|
+
case "gh":
|
|
442
|
+
const { runGhSubcommand } = await import("./cli-gh-CDGSpndZ.mjs");
|
|
443
|
+
return runGhSubcommand(args);
|
|
437
444
|
default:
|
|
438
445
|
console.error(`Unknown subcommand: ${name}`);
|
|
439
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 };
|