diffing 0.10.4 → 0.11.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 +77 -32
- package/dist/{cli-agent-BBHx1lLJ.mjs → cli-agent-DkwGxuy2.mjs} +43 -12
- package/dist/{cli-gh-B8HybRWZ.mjs → cli-gh-D0NfKpOp.mjs} +4 -4
- package/dist/cli.mjs +165 -35
- package/dist/client/assets/{angular-html-Bn7xcK-X.js → angular-html-Dl53kkiy.js} +1 -1
- package/dist/client/assets/{angular-ts-qK80FnOc.js → angular-ts-wNJFFkey.js} +1 -1
- package/dist/client/assets/{apl-BhBHq9NH.js → apl-BxtQST-h.js} +1 -1
- package/dist/client/assets/{arc-BbRWqKdi.js → arc-CBmZuzPB.js} +1 -1
- package/dist/client/assets/{architectureDiagram-3BPJPVTR-DkAZjTe2.js → architectureDiagram-3BPJPVTR-CEci_K9f.js} +1 -1
- package/dist/client/assets/{astro--A8NjYkS.js → astro-BpADD5rh.js} +1 -1
- package/dist/client/assets/{blade-DUJ_WZzW.js → blade-B4I5SQmP.js} +1 -1
- package/dist/client/assets/{blockDiagram-GPEHLZMM-BJnX6alY.js → blockDiagram-GPEHLZMM-DcKhDtnE.js} +1 -1
- package/dist/client/assets/{c-Ddzn0JTQ.js → c-C3VtOgg8.js} +1 -1
- package/dist/client/assets/{c4Diagram-AAUBKEIU-B_JFq-Tk.js → c4Diagram-AAUBKEIU-CaHozoxF.js} +1 -1
- package/dist/client/assets/channel-Ct4-oSQN.js +1 -0
- package/dist/client/assets/{chunk-2J33WTMH-CCnCUy9H.js → chunk-2J33WTMH-tvuzKhdK.js} +1 -1
- package/dist/client/assets/{chunk-3OPIFGDE-CJvhnVzd.js → chunk-3OPIFGDE-D_nBoD9w.js} +1 -1
- package/dist/client/assets/{chunk-4BX2VUAB-7gGFn4DW.js → chunk-4BX2VUAB-yHPdy1G8.js} +1 -1
- package/dist/client/assets/{chunk-55IACEB6-CRirC3B0.js → chunk-55IACEB6-yXpL8wjV.js} +1 -1
- package/dist/client/assets/{chunk-5ZQYHXKU-DSagYOhc.js → chunk-5ZQYHXKU-DZ5cvCDV.js} +1 -1
- package/dist/client/assets/{chunk-727SXJPM-2fqFvPdL.js → chunk-727SXJPM-CJjgOWmY.js} +1 -1
- package/dist/client/assets/{chunk-AQP2D5EJ-8l-kDb0Q.js → chunk-AQP2D5EJ-CQYQKXSE.js} +1 -1
- package/dist/client/assets/{chunk-BSJP7CBP-BjTEoy7R.js → chunk-BSJP7CBP-CP_f908b.js} +1 -1
- package/dist/client/assets/{chunk-CSCIHK7Q-CeHxe0Uf.js → chunk-CSCIHK7Q-tcgA8jR0.js} +1 -1
- package/dist/client/assets/{chunk-FMBD7UC4-X-OwPNTB.js → chunk-FMBD7UC4-DlpmhBYg.js} +1 -1
- package/dist/client/assets/{chunk-KSCS5N6A-rYccR2Ju.js → chunk-KSCS5N6A-BkfieXpV.js} +1 -1
- package/dist/client/assets/{chunk-L5ZTLDWV-8JMoad-S.js → chunk-L5ZTLDWV-BjVXSZnt.js} +1 -1
- package/dist/client/assets/{chunk-LZXEDZCA-DOvCLema.js → chunk-LZXEDZCA-CaAWmy4Q.js} +2 -2
- package/dist/client/assets/{chunk-ND2GUHAM-CQQJmqC8.js → chunk-ND2GUHAM-kWh41zUn.js} +1 -1
- package/dist/client/assets/{chunk-NZK2D7GU-DPwHQE2m.js → chunk-NZK2D7GU-CDrIi44_.js} +1 -1
- package/dist/client/assets/{chunk-O5CBEL6O-Bvzv6QAN.js → chunk-O5CBEL6O-CbNGK3Te.js} +1 -1
- package/dist/client/assets/chunk-QZHKN3VN-BXhKFVX7.js +1 -0
- package/dist/client/assets/chunk-WU5MYG2G-_EwuC51_.js +1 -0
- package/dist/client/assets/{chunk-XPW4576I-DY1teoyy.js → chunk-XPW4576I-Cca0fTtG.js} +1 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-C8bdx9R4.js +1 -0
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-B26wrQuH.js +1 -0
- package/dist/client/assets/{cobol-EaVCzYAO.js → cobol-j-6eG2UQ.js} +1 -1
- package/dist/client/assets/{coffee-CbmPxJhz.js → coffee-CZLH0dtt.js} +1 -1
- package/dist/client/assets/{cose-bilkent-S5V4N54A-zMLfkB6c.js → cose-bilkent-S5V4N54A-DlxESVex.js} +1 -1
- package/dist/client/assets/{cpp-1v8ov4EG.js → cpp-j6Bp24RI.js} +1 -1
- package/dist/client/assets/{crystal-B88NqWAb.js → crystal-DW7wcFUs.js} +1 -1
- package/dist/client/assets/{css-QFeW3BCZ.js → css-C43BDU2i.js} +1 -1
- package/dist/client/assets/{dagre-BM42HDAG-DxGKZBBq.js → dagre-BM42HDAG-BaemEJFh.js} +1 -1
- package/dist/client/assets/{diagram-2AECGRRQ-CiUL7Dov.js → diagram-2AECGRRQ-BaM-bkJ3.js} +1 -1
- package/dist/client/assets/{diagram-5GNKFQAL-DCs97wXn.js → diagram-5GNKFQAL-BOH04DJO.js} +1 -1
- package/dist/client/assets/{diagram-KO2AKTUF-BsSJWXqr.js → diagram-KO2AKTUF-BP5MyqDZ.js} +1 -1
- package/dist/client/assets/{diagram-LMA3HP47-LDuP4WAy.js → diagram-LMA3HP47-Dt4gKMYF.js} +1 -1
- package/dist/client/assets/{diagram-OG6HWLK6-CKjIVoHx.js → diagram-OG6HWLK6-DoT1VshN.js} +1 -1
- package/dist/client/assets/{dist-BvtPW002.js → dist-DEAxvC4F.js} +1 -1
- package/dist/client/assets/{edge-5UREsVXQ.js → edge-D9ySFlnD.js} +1 -1
- package/dist/client/assets/{elixir-B_Yali6w.js → elixir-CoJz_LQ5.js} +1 -1
- package/dist/client/assets/{elm-STYz8ayI.js → elm-CvedWh_e.js} +1 -1
- package/dist/client/assets/{erDiagram-TEJ5UH35-D7iBLlYp.js → erDiagram-TEJ5UH35-CMP78FsQ.js} +1 -1
- package/dist/client/assets/{erb-CHRx3Beu.js → erb-lD_yYZsm.js} +1 -1
- package/dist/client/assets/{flowDiagram-I6XJVG4X-Dr2J9T5z.js → flowDiagram-I6XJVG4X-Dp0s5BFj.js} +1 -1
- package/dist/client/assets/{ganttDiagram-6RSMTGT7-Bb1v2M1H.js → ganttDiagram-6RSMTGT7-GmSG31U-.js} +1 -1
- package/dist/client/assets/{git-rebase-CFmRpmLK.js → git-rebase-DwZABzof.js} +1 -1
- package/dist/client/assets/{gitGraphDiagram-PVQCEYII-DP9xmnTA.js → gitGraphDiagram-PVQCEYII-C1SXShag.js} +1 -1
- package/dist/client/assets/{glimmer-js-CdrEdtzi.js → glimmer-js-CWcs3w1Z.js} +1 -1
- package/dist/client/assets/{glimmer-ts-CzrwZqCl.js → glimmer-ts-CrzGN4lJ.js} +1 -1
- package/dist/client/assets/{glsl-Cb4XetAc.js → glsl-DRCtwX7h.js} +1 -1
- package/dist/client/assets/{graphql-mqi9K2_l.js → graphql-rpmrismS.js} +1 -1
- package/dist/client/assets/{hack-DaFJ7htO.js → hack-Ba02RnuQ.js} +1 -1
- package/dist/client/assets/{haml-Bw7q4nKg.js → haml-BHBACStm.js} +1 -1
- package/dist/client/assets/{handlebars-mj81MoXX.js → handlebars-BtlQ1SCa.js} +1 -1
- package/dist/client/assets/{html-LHrj0-2t.js → html-BkVU3Dge.js} +1 -1
- package/dist/client/assets/{html-derivative-L3_OYrFu.js → html-derivative-DoK92vwi.js} +1 -1
- package/dist/client/assets/{http-DE0OFe2c.js → http-CJAwKSPH.js} +1 -1
- package/dist/client/assets/{hurl-CNbk7fqf.js → hurl-kaX5jwuN.js} +1 -1
- package/dist/client/assets/{index-DHt5Hu--.js → index-BHeNiC07.js} +261 -199
- package/dist/client/assets/index-D8hOoJCg.css +1 -0
- package/dist/client/assets/{infoDiagram-5YYISTIA-wxqSmRV0.js → infoDiagram-5YYISTIA-B0i3BlNR.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-CJa0qhXu.js → ishikawaDiagram-YF4QCWOH-BN8sEei4.js} +1 -1
- package/dist/client/assets/{java-DAwMoXxA.js → java-BvrigIoq.js} +1 -1
- package/dist/client/assets/{javascript-_a2prAz7.js → javascript-DZkPTYAi.js} +1 -1
- package/dist/client/assets/{jinja-JKFA3bu8.js → jinja-Ceg7ui1S.js} +1 -1
- package/dist/client/assets/{jison-UbTjhW7k.js → jison-iE1GaOyN.js} +1 -1
- package/dist/client/assets/{journeyDiagram-JHISSGLW-Bh5L3OBN.js → journeyDiagram-JHISSGLW-CE6O3NhU.js} +1 -1
- package/dist/client/assets/{json-D74F0BDU.js → json-C0j8rEcg.js} +1 -1
- package/dist/client/assets/{jsx-BsH2-gDN.js → jsx-B7eXljgz.js} +1 -1
- package/dist/client/assets/{julia-DyIO_Gy0.js → julia-DMDw0aMP.js} +1 -1
- package/dist/client/assets/{just-VQTFAZJr.js → just-BryMKRJ_.js} +1 -1
- package/dist/client/assets/{kanban-definition-UN3LZRKU-BB2voi9I.js → kanban-definition-UN3LZRKU-j-aU6Yzp.js} +1 -1
- package/dist/client/assets/{latex-D0ONGfIo.js → latex-BNC9-sjr.js} +1 -1
- package/dist/client/assets/{line-BkbHeSM4.js → line-CyEqpEDp.js} +1 -1
- package/dist/client/assets/{linear-BYUYqOy1.js → linear-CXeaA9km.js} +1 -1
- package/dist/client/assets/{liquid-BnYpmfMl.js → liquid-D-fQw-oJ.js} +1 -1
- package/dist/client/assets/{lua-WlA-m2lC.js → lua-CD2aJ_rS.js} +1 -1
- package/dist/client/assets/{marko-Bd44681W.js → marko-BQ37hu6z.js} +1 -1
- package/dist/client/assets/{mdc-DhosSoGv.js → mdc-B5NUi3zZ.js} +1 -1
- package/dist/client/assets/{mermaid-parser.core-Dq0EOOjQ.js → mermaid-parser.core-BxHF_XbX.js} +1 -1
- package/dist/client/assets/{mermaid.core-qcl7ght-.js → mermaid.core-BUtaf4P1.js} +3 -3
- package/dist/client/assets/{mindmap-definition-RKZ34NQL-DrZ9di3F.js → mindmap-definition-RKZ34NQL-D13tPu2o.js} +1 -1
- package/dist/client/assets/{nginx-sYwNRk-F.js → nginx-1W1E03Rg.js} +1 -1
- package/dist/client/assets/{nim-DrXU2tn9.js → nim-C5A88bFP.js} +1 -1
- package/dist/client/assets/{perl-TEELuyd-.js → perl-BYoP0wNt.js} +1 -1
- package/dist/client/assets/{php-Dy_Y1r8j.js → php-CFxna09e.js} +1 -1
- package/dist/client/assets/{pieDiagram-4H26LBE5-Aev8QdJC.js → pieDiagram-4H26LBE5-CHL7Ml5w.js} +1 -1
- package/dist/client/assets/{pug-vancrY0a.js → pug-BR4JgWAk.js} +1 -1
- package/dist/client/assets/{qml-BA5z-zbf.js → qml-D1U1EFEe.js} +1 -1
- package/dist/client/assets/{quadrantDiagram-W4KKPZXB-DhEDvxx7.js → quadrantDiagram-W4KKPZXB-BnYtv-HY.js} +1 -1
- package/dist/client/assets/{r-BR0O4N-s.js → r-ChE6X060.js} +1 -1
- package/dist/client/assets/{razor-DXiNCb-5.js → razor-B5iVfQMe.js} +1 -1
- package/dist/client/assets/{regexp-BhjJa9MI.js → regexp-Dz2drUIf.js} +1 -1
- package/dist/client/assets/{requirementDiagram-4Y6WPE33-DPS5siTy.js → requirementDiagram-4Y6WPE33-D8QEGLKB.js} +1 -1
- package/dist/client/assets/{review-export-DABY3y7y.js → review-export-CvFFbCAB.js} +1 -1
- package/dist/client/assets/{rst-Bi3zId1d.js → rst-DZM3RGRs.js} +1 -1
- package/dist/client/assets/{ruby-BURiJKuD.js → ruby-DkXnm-J8.js} +1 -1
- package/dist/client/assets/{sankeyDiagram-5OEKKPKP-CjZF2AQd.js → sankeyDiagram-5OEKKPKP-wVaks6lB.js} +1 -1
- package/dist/client/assets/{sas-BO_W1LuL.js → sas-DMbpc71c.js} +1 -1
- package/dist/client/assets/{scss-BPUTinXb.js → scss-IwVMMp22.js} +1 -1
- package/dist/client/assets/{sequenceDiagram-3UESZ5HK-0rsTmBLB.js → sequenceDiagram-3UESZ5HK-Cg31TB-R.js} +1 -1
- package/dist/client/assets/{shellscript-B4rfo4qg.js → shellscript-CIStAKx3.js} +1 -1
- package/dist/client/assets/{shellsession-DLX-O8m7.js → shellsession-uLtzHhlo.js} +1 -1
- package/dist/client/assets/{soy-BEUiwSVD.js → soy-BkxBYigm.js} +1 -1
- package/dist/client/assets/{sql-CwSA8v_H.js → sql-Ba9y9EvJ.js} +1 -1
- package/dist/client/assets/{src-Cn22-GjE.js → src-9MKexpFu.js} +1 -1
- package/dist/client/assets/{stata-XfdBiAnW.js → stata-CrPCbiIZ.js} +1 -1
- package/dist/client/assets/{stateDiagram-AJRCARHV-BVvCsgjA.js → stateDiagram-AJRCARHV-BbvNjVF6.js} +1 -1
- package/dist/client/assets/stateDiagram-v2-BHNVJYJU-B5BbZkU5.js +1 -0
- package/dist/client/assets/{surrealql-COaehKkS.js → surrealql-Dvip5u_o.js} +1 -1
- package/dist/client/assets/{svelte-B0kTIq0J.js → svelte-xBLD60Zd.js} +1 -1
- package/dist/client/assets/{templ-DGxWfDf-.js → templ-CWv68xbP.js} +1 -1
- package/dist/client/assets/{tex-C9X3gjZ2.js → tex-CHqz-fYs.js} +1 -1
- package/dist/client/assets/{timeline-definition-PNZ67QCA-B535P7_e.js → timeline-definition-PNZ67QCA-CWKkJ3QZ.js} +1 -1
- package/dist/client/assets/{ts-tags-By9ETsTC.js → ts-tags-DS82EDuE.js} +1 -1
- package/dist/client/assets/{tsx-CvVX506n.js → tsx-B2GBjp2F.js} +1 -1
- package/dist/client/assets/{twig-CjLWv7eu.js → twig-CC8x9pG0.js} +1 -1
- package/dist/client/assets/{typescript-BEq3u3Bc.js → typescript-g7i13lnC.js} +1 -1
- package/dist/client/assets/{vennDiagram-CIIHVFJN-CTV9H1N2.js → vennDiagram-CIIHVFJN-OLItKWeg.js} +1 -1
- package/dist/client/assets/{vue-html-92z_Aqn0.js → vue-html-D9GQtYub.js} +1 -1
- package/dist/client/assets/{vue-DYazforU.js → vue-rFbe7luB.js} +1 -1
- package/dist/client/assets/{vue-vine-VY7raYSI.js → vue-vine-mrNtQtY5.js} +1 -1
- package/dist/client/assets/{wardleyDiagram-YWT4CUSO-BzJaykc6.js → wardleyDiagram-YWT4CUSO-Dy1yfeb4.js} +1 -1
- package/dist/client/assets/{xml-hd7OQ798.js → xml-CHfMjyAM.js} +1 -1
- package/dist/client/assets/{xsl-MkuT76g1.js → xsl-BFkNSogJ.js} +1 -1
- package/dist/client/assets/{xychartDiagram-2RQKCTM6-D36D8smx.js → xychartDiagram-2RQKCTM6-DfSnfjVL.js} +1 -1
- package/dist/client/assets/{yaml-D6zRzOR2.js → yaml-BfSgHc04.js} +1 -1
- package/dist/client/index.html +2 -2
- package/dist/{completions-Csvfqctx.mjs → completions-BO2DUM-8.mjs} +23 -1
- package/dist/{doctor-B3Nrydc0.mjs → doctor-D0Y3kOY7.mjs} +5 -4
- package/dist/{find-tui-binary-CRpbYXLC.mjs → find-tui-binary-B71xiwWu.mjs} +33 -15
- package/dist/github-CErBub2y.mjs +2 -0
- package/dist/{github-Cf5blBty.mjs → github-DBsZ0h_l.mjs} +47 -5
- package/dist/github-attachments-plDeB0iE.mjs +351 -0
- package/dist/handoff-LAFtmnHf.mjs +11 -0
- package/dist/{mcp-DwnYjFS0.mjs → mcp-DtVrMR2S.mjs} +41 -22
- package/dist/native/tui-darwin-arm64/diffing-tui +0 -0
- package/dist/native/tui-darwin-x64/diffing-tui +0 -0
- package/dist/native/tui-linux-arm64-gnu/diffing-tui +0 -0
- package/dist/native/tui-linux-arm64-musl/diffing-tui +0 -0
- package/dist/native/tui-linux-x64-gnu/diffing-tui +0 -0
- package/dist/native/tui-linux-x64-musl/diffing-tui +0 -0
- package/dist/native/tui-win32-x64-msvc/diffing-tui.exe +0 -0
- package/dist/{review-export-DjxKBeIZ.mjs → review-export-B63eRAVa.mjs} +1 -1
- package/dist/{settings-bwe7yQ8U.mjs → search-BMPY_ZW8.mjs} +117 -97
- package/dist/search-BO9Im7eu.mjs +2 -0
- package/dist/{server-CZeMCHEa.mjs → server-j0PnTVX1.mjs} +174 -75
- package/dist/server-lock-CY0_1mcS.mjs +275 -0
- package/dist/session-conflict-C6V9ZKo7.mjs +96 -0
- package/dist/session-manager-CYNchhVA.mjs +159 -0
- package/dist/settings-yK0GYpbn.mjs +60 -0
- package/dist/tui-search-bridge-Bfb2ktdA.mjs +133 -0
- package/package.json +6 -4
- package/dist/client/assets/channel-BcJKoISM.js +0 -1
- package/dist/client/assets/chunk-QZHKN3VN-90aaHYyK.js +0 -1
- package/dist/client/assets/chunk-WU5MYG2G-CfaWSqjJ.js +0 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-CsDELGUF.js +0 -1
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-R5SygY4h.js +0 -1
- package/dist/client/assets/index-B42c0TyV.css +0 -1
- package/dist/client/assets/stateDiagram-v2-BHNVJYJU-Bo6SeNmU.js +0 -1
- package/dist/github-DWgPIcKC.mjs +0 -2
- package/dist/server-lock-uqSdDYeR.mjs +0 -153
- /package/dist/{apply-suggestion-BAuyCYk6.mjs → apply-suggestion-CHYnw68I.mjs} +0 -0
- /package/dist/{comment-format-B5AcGcR-.mjs → comment-format-B85NHZnG.mjs} +0 -0
- /package/dist/{diff-fingerprint-CWa-soYD.mjs → diff-fingerprint-BgR0tu1o.mjs} +0 -0
- /package/dist/{plan-format-BQyx--mp.mjs → plan-format-BwJh5JSE.mjs} +0 -0
- /package/dist/{update-check-fe0tR8tx.mjs → update-check-Copcz9eb.mjs} +0 -0
package/README.md
CHANGED
|
@@ -27,21 +27,24 @@ Launch it within any active git repository:
|
|
|
27
27
|
```bash
|
|
28
28
|
diffing
|
|
29
29
|
```
|
|
30
|
-
|
|
30
|
+
With the initial web preference, this spins up a local server, establishes an active repository watcher, and opens your default browser to an interactive code review dashboard. Use `diffing mode tui` to make the native review TUI the interactive default instead.
|
|
31
31
|
|
|
32
|
-
Prefer the terminal?
|
|
33
|
-
|
|
32
|
+
Prefer the terminal? The global npm install includes the native binary for the
|
|
33
|
+
current platform. Use `view` for a focused read-only diff browser, or `--tui`
|
|
34
|
+
for the full review flow without a browser:
|
|
34
35
|
|
|
35
36
|
```bash
|
|
37
|
+
diffing view
|
|
36
38
|
diffing --tui
|
|
39
|
+
diffing mode tui # Make the full TUI the interactive default
|
|
37
40
|
```
|
|
38
41
|
|
|
39
42
|
> [!WARNING]
|
|
40
43
|
> The TUI is **experimental**. The interface, keymap, and `server.json`
|
|
41
44
|
> (`mode: "tui"`) on-disk format may change in a minor release. The web UI is
|
|
42
|
-
> the supported path for production workflows.
|
|
43
|
-
>
|
|
44
|
-
>
|
|
45
|
+
> the supported path for production workflows. Native executables are
|
|
46
|
+
> installed through optional platform packages, with source builds and
|
|
47
|
+
> separately installed `$PATH` binaries available as fallbacks. See
|
|
45
48
|
> [Native Terminal UI (TUI)](#native-terminal-ui-tui) for the full feature set,
|
|
46
49
|
> keymap, and stability notes.
|
|
47
50
|
|
|
@@ -181,20 +184,53 @@ A vim-style status bar at the bottom displays the current mode (NORMAL/INSERT),
|
|
|
181
184
|
> The web review flow, plan review, and PR review are unaffected.
|
|
182
185
|
|
|
183
186
|
> [!IMPORTANT]
|
|
184
|
-
>
|
|
185
|
-
>
|
|
186
|
-
>
|
|
187
|
-
>
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
187
|
+
> Native binaries are published as optional, platform-specific npm packages
|
|
188
|
+
> for macOS, Windows, and glibc/musl Linux. The main package never compiles Rust
|
|
189
|
+
> during installation and never installs a binary for the wrong platform. A
|
|
190
|
+
> source build and `$PATH` remain supported fallbacks.
|
|
191
|
+
|
|
192
|
+
`diffing --tui` opens an **opt-in native-Rust terminal interface** that mirrors the local code-review workflow — no browser or Electron. The renderer and headless tools share one sparse diff index. Review sessions publish a capability-scoped loopback API through the per-repository session registry; web and TUI reviews can run concurrently, while `server.json` points agent commands at the selected active session. Read-only viewers do not register a review session.
|
|
193
|
+
|
|
194
|
+
For everyday diff browsing, `diffing view` opens the same renderer as a
|
|
195
|
+
smaller read-only experience: continuous virtualized changes, a compact file
|
|
196
|
+
rail, change map, syntax highlighting, mouse/vim navigation, split/unified
|
|
197
|
+
layout, wrapping, and themes. In both viewer and review modes, `/` opens the
|
|
198
|
+
web UI's fff-powered `All`, `Files`, `Text`, and `Symbols` search with the same
|
|
199
|
+
result totals, frecency, and
|
|
200
|
+
syntax-highlighted preview; `f` opens directly in file search. The viewer
|
|
201
|
+
hides comments, viewed state, and agent handoff. Search starts diff-local and
|
|
202
|
+
`Ctrl-G` opts into the whole repository. Viewer and review sessions share the
|
|
203
|
+
persisted language-intelligence preference (Auto by default).
|
|
204
|
+
|
|
205
|
+
Its diff-first **Gridline** design system derives a tonal canvas, quiet
|
|
206
|
+
surfaces, diff fills, selection, gutters, and syntax roles from every web
|
|
207
|
+
theme. A compact header always identifies the repository and whether the TUI
|
|
208
|
+
is showing working-tree, staged, revision-range, or commit changes. The focused
|
|
209
|
+
viewer removes review actions and the duplicate file banner; the review
|
|
210
|
+
surface keeps a restrained command row for handoff.
|
|
211
|
+
Changed paths render as a compact hierarchical tree, semantic backgrounds
|
|
212
|
+
span the full row, and the bottom command strip gives keys more weight than
|
|
213
|
+
their descriptions. Empty review drawers collapse automatically. Wide
|
|
214
|
+
terminals can show files, diff, and review together; medium layouts place an
|
|
215
|
+
active review below the diff; compact layouts show one focused workspace at a
|
|
216
|
+
time. Press `,` for persisted Settings, including **Single file** versus
|
|
217
|
+
virtualized **Continuous files**, split/unified layout, wrap, tab size, line
|
|
218
|
+
numbers, mouse input, file-sidebar visibility and width, review drawer,
|
|
219
|
+
optional language intelligence, and theme. Press `b` to toggle the sidebar
|
|
220
|
+
without opening Settings. Disabling mouse input releases terminal mouse
|
|
221
|
+
capture and removes hover, click, drag, and wheel handling until it is
|
|
222
|
+
re-enabled from the keyboard.
|
|
223
|
+
|
|
224
|
+
The [Gridline TUI design-system contract](docs/tui-design-system.md) documents
|
|
225
|
+
the semantic tokens, density metrics, focus rules, component recipes, theme
|
|
226
|
+
invariants, and contributor checklist used by the native renderer.
|
|
227
|
+
|
|
228
|
+
The TUI is opt-in through `--tui` or the persistent `diffing mode tui` preference. If the environment 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 same `diffing` install serves either web or TUI mode.
|
|
196
229
|
|
|
197
230
|
```bash
|
|
231
|
+
diffing view # Focused read-only working-tree diff
|
|
232
|
+
diffing view --staged # Focused staged diff
|
|
233
|
+
diffing view main..feature # Focused branch comparison
|
|
198
234
|
diffing --tui # Open the current working tree in the TUI
|
|
199
235
|
diffing --tui --staged # Review staged changes in the TUI
|
|
200
236
|
diffing --tui HEAD~3 # Review working tree vs. 3 commits ago
|
|
@@ -202,22 +238,26 @@ diffing --tui main..feature # Compare two branches in the TUI
|
|
|
202
238
|
diffing --tui -- -- src/ # Limit a TUI review to a directory
|
|
203
239
|
```
|
|
204
240
|
|
|
205
|
-
**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.
|
|
241
|
+
**Stack** — Rust 1.78+ workspace (`crates/diffing-core/` shared lib + `crates/diffing-tui/` binary), `ratatui` + `crossterm` for rendering, `syntect` with the `two-face` grammar catalog for syntax highlighting, and `notify-debouncer-full` for live updates.
|
|
206
242
|
|
|
207
243
|
**Features**
|
|
208
244
|
|
|
209
245
|
- **Disk-backed streaming index** — Git output is parsed as bytes into sparse file/hunk/checkpoint metadata. The first partial generation is usable during ingestion; neither the TUI nor an agent needs to retain the full patch in memory.
|
|
210
|
-
- **
|
|
211
|
-
- **
|
|
212
|
-
- **
|
|
246
|
+
- **Retained, viewport-only rendering** — visible rows are sought into a bounded overscan window, decoded with per-line byte caps, theme-aware syntax-highlighted, and retained as terminal cells. Cursor, hover, and selection are cheap overlays; nearby scrolls reuse the same surface. Split mode pairs deletion/addition runs and highlights changed tokens within the pair. Terminal colors automatically degrade from truecolor to ANSI-256 or monochrome. Per-file tab widths follow nested `.editorconfig` files.
|
|
247
|
+
- **Focused navigation** — `Enter`/`+` progressively expand Git context and `-` collapses it; live refresh restores the selected source line and its viewport position; the file rail shows compact `+N -N` stats. In viewer mode, `e` safely suspends the alternate screen, opens the focused line in `$VISUAL`/`$EDITOR`, then restores the TUI.
|
|
248
|
+
- **Terminal-native image diffs** — `i` opens exact Git before/after blobs with side-by-side, individual, and pixel-difference modes plus fit, zoom, and pan. PNG, GIF, BMP, and ICO decode in-process; JPEG, WebP, AVIF, and SVG use a bounded ImageMagick/ffmpeg fallback when installed. Truecolor half-block rendering degrades to ANSI-256 and monochrome without requiring Kitty, iTerm, or Sixel support.
|
|
249
|
+
- **Optional local language intelligence** — viewer and review modes share the persisted setting. Auto mode lazily discovers an existing `rust-analyzer`, `typescript-language-server`, `pyright-langserver`, `gopls`, or `clangd`; diffing never downloads a server or sends source off-machine.
|
|
250
|
+
- **Vim-style file tree & keymap** — numeric counts plus `j/k`, `gg/G`, `Ctrl-d/u`, `J/K`, `]h/[h`, `]c/[c`, `zz`, `h/l`, `gh`, `gd`, `/`, `n/N`, `f`, `a`, `:`, `Tab`, `v`, `b`, `w`, `m`, `i`, `t`, `,`, and `?`. `Esc` cancels a mode; `q` or `Ctrl-C` quits. Sidebar visibility and width, single/continuous file display, mouse input, and language intelligence are changed from Settings.
|
|
213
251
|
- **Review-complete comments** — line, same-side range, and file-level threads share the web JSON schema, including severity. The drawer filters open/replied/resolved and blocking/question/nit/praise threads; the diff gutter distinguishes their states without relying on color alone.
|
|
214
|
-
- **
|
|
252
|
+
- **Complete text-entry and thread UX** — bracketed paste, cursor-aware single-line fields, multi-line `tui-textarea` comment/reply forms, explicit Save/Reply/Cancel controls, and a scrollable full-thread overlay with jump/edit/reply/resolve actions.
|
|
215
253
|
- **Live updates** via `notify` watcher on `comments.json` and the repo working tree — write a comment in another window and it appears immediately.
|
|
216
254
|
- **Send review & agent handoff** — compact verdict + general-comment popover with an unviewed-files guard. `Ctrl-S` persists the review, copies its XML payload to the clipboard when available, and immediately wakes every `diffing await-review` waiter. Waiting-agent state appears only while a waiter is active.
|
|
217
255
|
- **Headless, token-bounded inspection** — `diffing inspect summary|files|hunks|slice|search` and the equivalent MCP tools page the same index with strict row/byte limits, generation checks, and compact JSON. Every request is loopback-only and requires the session capability.
|
|
218
256
|
- **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`).
|
|
219
257
|
|
|
220
|
-
The synthetic one-million-line benchmark (50.8 MiB patch) currently reaches a usable partial snapshot in under 1 ms, completes indexing in
|
|
258
|
+
The synthetic one-million-line index benchmark (50.8 MiB patch) currently reaches a usable partial snapshot in under 1 ms, completes indexing in about 50 ms, and serves viewport reads at 32 µs p95 on the development machine. Run it with `DIFFING_BENCH_LINES=1000000 cargo bench -p diffing-core --bench diff_index`.
|
|
259
|
+
|
|
260
|
+
The production-renderer contract paints a 240×80 terminal over one million diff lines. On the same machine, warm redraw, cursor movement, and adjacent scrolling are about 0.10–0.11 ms p95; random jumps are about 2.4 ms p95. Repeated redraw, cursor, annotation, split, and wrap paths allocate zero bytes, while a cold wrapped 2 MiB source line remains bounded at about 2 ms and 1.3 MiB of allocation. Run it with `DIFFING_RENDER_BENCH_LINES=1000000 cargo bench -p diffing-tui --bench render_diff`; results vary by machine and filesystem cache.
|
|
221
261
|
|
|
222
262
|
Headless examples:
|
|
223
263
|
|
|
@@ -236,14 +276,13 @@ pnpm build:tui # release build → target/release/diffing-tui
|
|
|
236
276
|
```
|
|
237
277
|
|
|
238
278
|
The CLI auto-discovers the binary in the following search order: sibling of
|
|
239
|
-
`dist/cli.mjs`, `
|
|
279
|
+
`dist/cli.mjs`, `target/release/`, `target/debug/`, the matching optional
|
|
280
|
+
native npm package, `bin/`, then `$PATH`. A
|
|
240
281
|
`cargo build -p diffing-tui` debug workflow is supported out of the box; you
|
|
241
282
|
do not need a release build just to use the TUI locally. The sibling and
|
|
242
|
-
`bin/` locations
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
npm CLI from arbitrary repositories, copy or symlink the resulting executable
|
|
246
|
-
into a directory on `PATH`.
|
|
283
|
+
`bin/` locations remain useful for manual installations. A CLI run from this source
|
|
284
|
+
checkout discovers the binary under `target/`; `npm install -g diffing`
|
|
285
|
+
automatically installs and resolves the matching native package for global use.
|
|
247
286
|
|
|
248
287
|
---
|
|
249
288
|
|
|
@@ -326,6 +365,9 @@ diffing comment edit <id> --body "..."
|
|
|
326
365
|
diffing comment delete <id>
|
|
327
366
|
diffing progress --message "…" [--pct 40] [--model M] # Live progress toast
|
|
328
367
|
diffing url # Active server base URL
|
|
368
|
+
diffing sessions # List every live web/TUI/PR session
|
|
369
|
+
diffing sessions use <id> # Retarget agent commands
|
|
370
|
+
diffing sessions stop <id>|active|all
|
|
329
371
|
|
|
330
372
|
# Plan review (before any code is written)
|
|
331
373
|
diffing plan submit <file> [--title T] [--model M] [--id <id>] [--wait] [--save-source]
|
|
@@ -416,7 +458,7 @@ waiting agent. Agent waiting state shows as a green dot on the button.
|
|
|
416
458
|
**Copy comments** serializes the thread set to the agent XML spec.
|
|
417
459
|
|
|
418
460
|
### Port-Agnostic Discovery
|
|
419
|
-
A per-repo
|
|
461
|
+
A per-repo registry in `~/.diffing/<repo-hash>/sessions/` tracks every live review. `server.json` points subcommands and MCP tools at the active session with zero port configuration; stale records are pruned and another live session is elected automatically.
|
|
420
462
|
|
|
421
463
|
### Monotonic Round Sequencing
|
|
422
464
|
A `ReviewSession` class with a monotonic `round` counter and race-guard logic ensures that if a "Send to agent" lands between polling intervals, the cached payload is delivered immediately. Multiple agents can block on the same review session simultaneously—all are released together on send.
|
|
@@ -675,9 +717,11 @@ diffing -- --cached -- src/ # Staged changes specifically in the src/ direc
|
|
|
675
717
|
|
|
676
718
|
### Intelligent Output Modes (TTY Auto-Detection)
|
|
677
719
|
To integrate flawlessly with your existing developer shell workflows, build pipelines, and command scripts, `diffing` automatically resolves the optimal output mode based on how stdout is directed:
|
|
678
|
-
- **
|
|
720
|
+
- **Preferred interactive mode (Web by default)**: In an interactive terminal, `diffing` starts the saved `web` or `tui` mode. Use `diffing mode <web|tui>` to inspect or change the user-level preference.
|
|
679
721
|
- **Terminal Mode (Default for pipes, redirects, or non-TTY)**: When output is piped (e.g. `diffing | grep "const"`) or redirected to a file, it falls back to behave **exactly like `git diff`**, streaming clean, standard unified diff patch text directly to standard output and exiting.
|
|
680
722
|
|
|
723
|
+
Explicit `--web`, `--tui`, `--view`, and `--terminal` flags override the saved preference. The preference does not change the web default for GitHub PR reviews.
|
|
724
|
+
|
|
681
725
|
> [!TIP]
|
|
682
726
|
> Any standard output control or format-related flags (such as `--raw`, `--numstat`, `--stat`, `--exit-code`, `--quiet`, or `-o`) will automatically force Terminal Mode fallback.
|
|
683
727
|
|
|
@@ -706,6 +750,7 @@ diffing show HEAD~2..HEAD --terminal # Stream `git show` to your terminal
|
|
|
706
750
|
## Integration & Configuration
|
|
707
751
|
|
|
708
752
|
- **Persistent User Settings** — Settings saved to `~/.config/diffing/settings.json`, loaded on startup, synced to server via `PUT /api/settings`.
|
|
753
|
+
- **Default Review Mode** — `diffing mode web` or `diffing mode tui` changes the interactive default without affecting pipes or explicit mode flags.
|
|
709
754
|
- **Custom Host/Port** — `--host 0.0.0.0` exposes the review dashboard to the local network; `--port <port>` overrides random port selection.
|
|
710
755
|
- **`--no-open` Flag** — Prevents auto-browser opening on server start.
|
|
711
756
|
- **Git Config Alias** — Register `diffing` as `git review` via `~/.gitconfig`.
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { d as getProjectStorageDir } from "./git-Czo96ymM.mjs";
|
|
2
|
-
import { t as
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
2
|
+
import { n as saveSettings, t as loadSettings } from "./settings-yK0GYpbn.mjs";
|
|
3
|
+
import { t as formatComments } from "./comment-format-B85NHZnG.mjs";
|
|
4
|
+
import { n as formatPlanReview } from "./plan-format-BwJh5JSE.mjs";
|
|
5
|
+
import { u as resolveActiveServerLock } from "./server-lock-CY0_1mcS.mjs";
|
|
6
|
+
import { a as CLI_AWAIT_REVIEW_TIMEOUT_HINT, i as CLI_AWAIT_PLAN_TIMEOUT_HINT, o as CLI_PLAN_SUBMIT_PARK_HINT } from "./handoff-LAFtmnHf.mjs";
|
|
5
7
|
import { join } from "node:path";
|
|
6
8
|
import { parseArgs } from "node:util";
|
|
7
9
|
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
@@ -25,8 +27,8 @@ const EXIT_USAGE = 5;
|
|
|
25
27
|
let activeCapability;
|
|
26
28
|
/** Resolve the running server's base URL from the lockfile, or exit cleanly. */
|
|
27
29
|
function baseUrl() {
|
|
28
|
-
const lock =
|
|
29
|
-
if (!lock
|
|
30
|
+
const lock = resolveActiveServerLock();
|
|
31
|
+
if (!lock) {
|
|
30
32
|
console.error("No diffing server running for this repo. Start one with `diffing`.");
|
|
31
33
|
process.exit(EXIT_NO_SERVER);
|
|
32
34
|
}
|
|
@@ -112,7 +114,7 @@ async function awaitReview(args) {
|
|
|
112
114
|
sinceRound = result.round ?? sinceRound;
|
|
113
115
|
}
|
|
114
116
|
console.error("DIFFING_AWAIT_TIMEOUT");
|
|
115
|
-
console.error(
|
|
117
|
+
console.error(CLI_AWAIT_REVIEW_TIMEOUT_HINT);
|
|
116
118
|
await unregister();
|
|
117
119
|
return EXIT_AWAIT_TIMEOUT;
|
|
118
120
|
}
|
|
@@ -305,11 +307,35 @@ async function comments(args) {
|
|
|
305
307
|
const format = values.format?.toLowerCase();
|
|
306
308
|
if (values.json || format === "json") process.stdout.write(JSON.stringify(selected, null, 2) + "\n");
|
|
307
309
|
else if (format === "markdown" || format === "md") {
|
|
308
|
-
const { formatCommentsMarkdown } = await import("./review-export-
|
|
310
|
+
const { formatCommentsMarkdown } = await import("./review-export-B63eRAVa.mjs");
|
|
309
311
|
process.stdout.write(formatCommentsMarkdown(selected) + "\n");
|
|
310
312
|
} else process.stdout.write(formatComments(selected) + "\n");
|
|
311
313
|
return EXIT_OK;
|
|
312
314
|
}
|
|
315
|
+
function mode(args) {
|
|
316
|
+
if (args.length === 0) {
|
|
317
|
+
process.stdout.write(loadSettings().defaultMode + "\n");
|
|
318
|
+
return EXIT_OK;
|
|
319
|
+
}
|
|
320
|
+
if (args.length === 1 && (args[0] === "--help" || args[0] === "-h")) {
|
|
321
|
+
process.stdout.write("Usage: diffing mode <web|tui>\n");
|
|
322
|
+
return EXIT_OK;
|
|
323
|
+
}
|
|
324
|
+
const requested = args[0];
|
|
325
|
+
if (args.length !== 1 || requested !== "web" && requested !== "tui") {
|
|
326
|
+
console.error("Usage: diffing mode <web|tui>");
|
|
327
|
+
return EXIT_USAGE;
|
|
328
|
+
}
|
|
329
|
+
try {
|
|
330
|
+
saveSettings({ defaultMode: requested });
|
|
331
|
+
} catch (error) {
|
|
332
|
+
const detail = error instanceof Error ? error.message : String(error);
|
|
333
|
+
console.error(`Failed to save default mode: ${detail}`);
|
|
334
|
+
return 1;
|
|
335
|
+
}
|
|
336
|
+
process.stdout.write(`Default mode set to ${requested}.\n`);
|
|
337
|
+
return EXIT_OK;
|
|
338
|
+
}
|
|
313
339
|
/** Derive a human title from a plan's first heading or non-empty line. */
|
|
314
340
|
function deriveTitle(body) {
|
|
315
341
|
for (const raw of body.split("\n")) {
|
|
@@ -346,7 +372,7 @@ async function pollPlanDecision(base, totalBudgetMs, seedSince) {
|
|
|
346
372
|
sinceRound = result.round ?? sinceRound;
|
|
347
373
|
}
|
|
348
374
|
console.error("DIFFING_PLAN_AWAIT_TIMEOUT");
|
|
349
|
-
console.error(
|
|
375
|
+
console.error(CLI_AWAIT_PLAN_TIMEOUT_HINT);
|
|
350
376
|
return EXIT_AWAIT_TIMEOUT;
|
|
351
377
|
}
|
|
352
378
|
async function planSubmit(args) {
|
|
@@ -423,6 +449,7 @@ async function planSubmit(args) {
|
|
|
423
449
|
const plan = await res.json();
|
|
424
450
|
console.error(`Submitted plan ${plan.id} (v${plan.version}) — review at ${base}/plan/${plan.id}`);
|
|
425
451
|
if (plan.sourcePath) console.error(`Source path: ${plan.sourcePath}`);
|
|
452
|
+
if (!values.wait) console.error(CLI_PLAN_SUBMIT_PARK_HINT);
|
|
426
453
|
if (values.saveSource) try {
|
|
427
454
|
const sourcesDir = join(getProjectStorageDir(), "plan-sources");
|
|
428
455
|
await mkdir(sourcesDir, { recursive: true });
|
|
@@ -643,7 +670,7 @@ async function plan(args) {
|
|
|
643
670
|
}
|
|
644
671
|
}
|
|
645
672
|
async function doctor() {
|
|
646
|
-
const { runDoctor, formatDoctorReport } = await import("./doctor-
|
|
673
|
+
const { runDoctor, formatDoctorReport } = await import("./doctor-D0Y3kOY7.mjs");
|
|
647
674
|
const report = await runDoctor({
|
|
648
675
|
cwd: process.cwd(),
|
|
649
676
|
cliImportMetaUrl: import.meta.url
|
|
@@ -661,7 +688,7 @@ async function completion(args) {
|
|
|
661
688
|
console.error(" # diffing completion fish > ~/.config/fish/completions/diffing.fish");
|
|
662
689
|
return EXIT_USAGE;
|
|
663
690
|
}
|
|
664
|
-
const { completionFor } = await import("./completions-
|
|
691
|
+
const { completionFor } = await import("./completions-BO2DUM-8.mjs");
|
|
665
692
|
const script = completionFor(shell);
|
|
666
693
|
if (!script) {
|
|
667
694
|
console.error(`Unknown shell: ${shell}. Use bash, zsh, or fish.`);
|
|
@@ -825,15 +852,19 @@ async function runSubcommand(name, args) {
|
|
|
825
852
|
case "url": return url();
|
|
826
853
|
case "plan": return plan(args);
|
|
827
854
|
case "update":
|
|
828
|
-
const { runUpdateCommand } = await import("./update-check-
|
|
855
|
+
const { runUpdateCommand } = await import("./update-check-Copcz9eb.mjs");
|
|
829
856
|
return runUpdateCommand();
|
|
830
857
|
case "gh":
|
|
831
|
-
const { runGhSubcommand } = await import("./cli-gh-
|
|
858
|
+
const { runGhSubcommand } = await import("./cli-gh-D0NfKpOp.mjs");
|
|
832
859
|
return runGhSubcommand(args);
|
|
833
860
|
case "doctor": return doctor();
|
|
834
861
|
case "completion": return completion(args);
|
|
835
862
|
case "progress": return progress(args);
|
|
836
863
|
case "inspect": return inspect(args);
|
|
864
|
+
case "mode": return mode(args);
|
|
865
|
+
case "sessions":
|
|
866
|
+
const { runSessionsCommand } = await import("./session-manager-CYNchhVA.mjs");
|
|
867
|
+
return runSessionsCommand(args);
|
|
837
868
|
default:
|
|
838
869
|
console.error(`Unknown subcommand: ${name}`);
|
|
839
870
|
return EXIT_USAGE;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { t as formatComments } from "./comment-format-
|
|
2
|
-
import {
|
|
1
|
+
import { t as formatComments } from "./comment-format-B85NHZnG.mjs";
|
|
2
|
+
import { u as resolveActiveServerLock } from "./server-lock-CY0_1mcS.mjs";
|
|
3
3
|
import { parseArgs } from "node:util";
|
|
4
4
|
//#region src/cli-gh.ts
|
|
5
5
|
/**
|
|
@@ -21,8 +21,8 @@ const EXIT_NO_SERVER = 3;
|
|
|
21
21
|
const EXIT_NOT_FOUND = 4;
|
|
22
22
|
const EXIT_USAGE = 5;
|
|
23
23
|
function baseUrl() {
|
|
24
|
-
const lock =
|
|
25
|
-
if (!lock
|
|
24
|
+
const lock = resolveActiveServerLock();
|
|
25
|
+
if (!lock) {
|
|
26
26
|
console.error("No diffing server running for this repo. Start one with `diffing \"gh pr <ref>\"`.");
|
|
27
27
|
process.exit(EXIT_NO_SERVER);
|
|
28
28
|
}
|