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.
Files changed (178) hide show
  1. package/README.md +77 -32
  2. package/dist/{cli-agent-BBHx1lLJ.mjs → cli-agent-DkwGxuy2.mjs} +43 -12
  3. package/dist/{cli-gh-B8HybRWZ.mjs → cli-gh-D0NfKpOp.mjs} +4 -4
  4. package/dist/cli.mjs +165 -35
  5. package/dist/client/assets/{angular-html-Bn7xcK-X.js → angular-html-Dl53kkiy.js} +1 -1
  6. package/dist/client/assets/{angular-ts-qK80FnOc.js → angular-ts-wNJFFkey.js} +1 -1
  7. package/dist/client/assets/{apl-BhBHq9NH.js → apl-BxtQST-h.js} +1 -1
  8. package/dist/client/assets/{arc-BbRWqKdi.js → arc-CBmZuzPB.js} +1 -1
  9. package/dist/client/assets/{architectureDiagram-3BPJPVTR-DkAZjTe2.js → architectureDiagram-3BPJPVTR-CEci_K9f.js} +1 -1
  10. package/dist/client/assets/{astro--A8NjYkS.js → astro-BpADD5rh.js} +1 -1
  11. package/dist/client/assets/{blade-DUJ_WZzW.js → blade-B4I5SQmP.js} +1 -1
  12. package/dist/client/assets/{blockDiagram-GPEHLZMM-BJnX6alY.js → blockDiagram-GPEHLZMM-DcKhDtnE.js} +1 -1
  13. package/dist/client/assets/{c-Ddzn0JTQ.js → c-C3VtOgg8.js} +1 -1
  14. package/dist/client/assets/{c4Diagram-AAUBKEIU-B_JFq-Tk.js → c4Diagram-AAUBKEIU-CaHozoxF.js} +1 -1
  15. package/dist/client/assets/channel-Ct4-oSQN.js +1 -0
  16. package/dist/client/assets/{chunk-2J33WTMH-CCnCUy9H.js → chunk-2J33WTMH-tvuzKhdK.js} +1 -1
  17. package/dist/client/assets/{chunk-3OPIFGDE-CJvhnVzd.js → chunk-3OPIFGDE-D_nBoD9w.js} +1 -1
  18. package/dist/client/assets/{chunk-4BX2VUAB-7gGFn4DW.js → chunk-4BX2VUAB-yHPdy1G8.js} +1 -1
  19. package/dist/client/assets/{chunk-55IACEB6-CRirC3B0.js → chunk-55IACEB6-yXpL8wjV.js} +1 -1
  20. package/dist/client/assets/{chunk-5ZQYHXKU-DSagYOhc.js → chunk-5ZQYHXKU-DZ5cvCDV.js} +1 -1
  21. package/dist/client/assets/{chunk-727SXJPM-2fqFvPdL.js → chunk-727SXJPM-CJjgOWmY.js} +1 -1
  22. package/dist/client/assets/{chunk-AQP2D5EJ-8l-kDb0Q.js → chunk-AQP2D5EJ-CQYQKXSE.js} +1 -1
  23. package/dist/client/assets/{chunk-BSJP7CBP-BjTEoy7R.js → chunk-BSJP7CBP-CP_f908b.js} +1 -1
  24. package/dist/client/assets/{chunk-CSCIHK7Q-CeHxe0Uf.js → chunk-CSCIHK7Q-tcgA8jR0.js} +1 -1
  25. package/dist/client/assets/{chunk-FMBD7UC4-X-OwPNTB.js → chunk-FMBD7UC4-DlpmhBYg.js} +1 -1
  26. package/dist/client/assets/{chunk-KSCS5N6A-rYccR2Ju.js → chunk-KSCS5N6A-BkfieXpV.js} +1 -1
  27. package/dist/client/assets/{chunk-L5ZTLDWV-8JMoad-S.js → chunk-L5ZTLDWV-BjVXSZnt.js} +1 -1
  28. package/dist/client/assets/{chunk-LZXEDZCA-DOvCLema.js → chunk-LZXEDZCA-CaAWmy4Q.js} +2 -2
  29. package/dist/client/assets/{chunk-ND2GUHAM-CQQJmqC8.js → chunk-ND2GUHAM-kWh41zUn.js} +1 -1
  30. package/dist/client/assets/{chunk-NZK2D7GU-DPwHQE2m.js → chunk-NZK2D7GU-CDrIi44_.js} +1 -1
  31. package/dist/client/assets/{chunk-O5CBEL6O-Bvzv6QAN.js → chunk-O5CBEL6O-CbNGK3Te.js} +1 -1
  32. package/dist/client/assets/chunk-QZHKN3VN-BXhKFVX7.js +1 -0
  33. package/dist/client/assets/chunk-WU5MYG2G-_EwuC51_.js +1 -0
  34. package/dist/client/assets/{chunk-XPW4576I-DY1teoyy.js → chunk-XPW4576I-Cca0fTtG.js} +1 -1
  35. package/dist/client/assets/classDiagram-4FO5ZUOK-C8bdx9R4.js +1 -0
  36. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-B26wrQuH.js +1 -0
  37. package/dist/client/assets/{cobol-EaVCzYAO.js → cobol-j-6eG2UQ.js} +1 -1
  38. package/dist/client/assets/{coffee-CbmPxJhz.js → coffee-CZLH0dtt.js} +1 -1
  39. package/dist/client/assets/{cose-bilkent-S5V4N54A-zMLfkB6c.js → cose-bilkent-S5V4N54A-DlxESVex.js} +1 -1
  40. package/dist/client/assets/{cpp-1v8ov4EG.js → cpp-j6Bp24RI.js} +1 -1
  41. package/dist/client/assets/{crystal-B88NqWAb.js → crystal-DW7wcFUs.js} +1 -1
  42. package/dist/client/assets/{css-QFeW3BCZ.js → css-C43BDU2i.js} +1 -1
  43. package/dist/client/assets/{dagre-BM42HDAG-DxGKZBBq.js → dagre-BM42HDAG-BaemEJFh.js} +1 -1
  44. package/dist/client/assets/{diagram-2AECGRRQ-CiUL7Dov.js → diagram-2AECGRRQ-BaM-bkJ3.js} +1 -1
  45. package/dist/client/assets/{diagram-5GNKFQAL-DCs97wXn.js → diagram-5GNKFQAL-BOH04DJO.js} +1 -1
  46. package/dist/client/assets/{diagram-KO2AKTUF-BsSJWXqr.js → diagram-KO2AKTUF-BP5MyqDZ.js} +1 -1
  47. package/dist/client/assets/{diagram-LMA3HP47-LDuP4WAy.js → diagram-LMA3HP47-Dt4gKMYF.js} +1 -1
  48. package/dist/client/assets/{diagram-OG6HWLK6-CKjIVoHx.js → diagram-OG6HWLK6-DoT1VshN.js} +1 -1
  49. package/dist/client/assets/{dist-BvtPW002.js → dist-DEAxvC4F.js} +1 -1
  50. package/dist/client/assets/{edge-5UREsVXQ.js → edge-D9ySFlnD.js} +1 -1
  51. package/dist/client/assets/{elixir-B_Yali6w.js → elixir-CoJz_LQ5.js} +1 -1
  52. package/dist/client/assets/{elm-STYz8ayI.js → elm-CvedWh_e.js} +1 -1
  53. package/dist/client/assets/{erDiagram-TEJ5UH35-D7iBLlYp.js → erDiagram-TEJ5UH35-CMP78FsQ.js} +1 -1
  54. package/dist/client/assets/{erb-CHRx3Beu.js → erb-lD_yYZsm.js} +1 -1
  55. package/dist/client/assets/{flowDiagram-I6XJVG4X-Dr2J9T5z.js → flowDiagram-I6XJVG4X-Dp0s5BFj.js} +1 -1
  56. package/dist/client/assets/{ganttDiagram-6RSMTGT7-Bb1v2M1H.js → ganttDiagram-6RSMTGT7-GmSG31U-.js} +1 -1
  57. package/dist/client/assets/{git-rebase-CFmRpmLK.js → git-rebase-DwZABzof.js} +1 -1
  58. package/dist/client/assets/{gitGraphDiagram-PVQCEYII-DP9xmnTA.js → gitGraphDiagram-PVQCEYII-C1SXShag.js} +1 -1
  59. package/dist/client/assets/{glimmer-js-CdrEdtzi.js → glimmer-js-CWcs3w1Z.js} +1 -1
  60. package/dist/client/assets/{glimmer-ts-CzrwZqCl.js → glimmer-ts-CrzGN4lJ.js} +1 -1
  61. package/dist/client/assets/{glsl-Cb4XetAc.js → glsl-DRCtwX7h.js} +1 -1
  62. package/dist/client/assets/{graphql-mqi9K2_l.js → graphql-rpmrismS.js} +1 -1
  63. package/dist/client/assets/{hack-DaFJ7htO.js → hack-Ba02RnuQ.js} +1 -1
  64. package/dist/client/assets/{haml-Bw7q4nKg.js → haml-BHBACStm.js} +1 -1
  65. package/dist/client/assets/{handlebars-mj81MoXX.js → handlebars-BtlQ1SCa.js} +1 -1
  66. package/dist/client/assets/{html-LHrj0-2t.js → html-BkVU3Dge.js} +1 -1
  67. package/dist/client/assets/{html-derivative-L3_OYrFu.js → html-derivative-DoK92vwi.js} +1 -1
  68. package/dist/client/assets/{http-DE0OFe2c.js → http-CJAwKSPH.js} +1 -1
  69. package/dist/client/assets/{hurl-CNbk7fqf.js → hurl-kaX5jwuN.js} +1 -1
  70. package/dist/client/assets/{index-DHt5Hu--.js → index-BHeNiC07.js} +261 -199
  71. package/dist/client/assets/index-D8hOoJCg.css +1 -0
  72. package/dist/client/assets/{infoDiagram-5YYISTIA-wxqSmRV0.js → infoDiagram-5YYISTIA-B0i3BlNR.js} +1 -1
  73. package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-CJa0qhXu.js → ishikawaDiagram-YF4QCWOH-BN8sEei4.js} +1 -1
  74. package/dist/client/assets/{java-DAwMoXxA.js → java-BvrigIoq.js} +1 -1
  75. package/dist/client/assets/{javascript-_a2prAz7.js → javascript-DZkPTYAi.js} +1 -1
  76. package/dist/client/assets/{jinja-JKFA3bu8.js → jinja-Ceg7ui1S.js} +1 -1
  77. package/dist/client/assets/{jison-UbTjhW7k.js → jison-iE1GaOyN.js} +1 -1
  78. package/dist/client/assets/{journeyDiagram-JHISSGLW-Bh5L3OBN.js → journeyDiagram-JHISSGLW-CE6O3NhU.js} +1 -1
  79. package/dist/client/assets/{json-D74F0BDU.js → json-C0j8rEcg.js} +1 -1
  80. package/dist/client/assets/{jsx-BsH2-gDN.js → jsx-B7eXljgz.js} +1 -1
  81. package/dist/client/assets/{julia-DyIO_Gy0.js → julia-DMDw0aMP.js} +1 -1
  82. package/dist/client/assets/{just-VQTFAZJr.js → just-BryMKRJ_.js} +1 -1
  83. package/dist/client/assets/{kanban-definition-UN3LZRKU-BB2voi9I.js → kanban-definition-UN3LZRKU-j-aU6Yzp.js} +1 -1
  84. package/dist/client/assets/{latex-D0ONGfIo.js → latex-BNC9-sjr.js} +1 -1
  85. package/dist/client/assets/{line-BkbHeSM4.js → line-CyEqpEDp.js} +1 -1
  86. package/dist/client/assets/{linear-BYUYqOy1.js → linear-CXeaA9km.js} +1 -1
  87. package/dist/client/assets/{liquid-BnYpmfMl.js → liquid-D-fQw-oJ.js} +1 -1
  88. package/dist/client/assets/{lua-WlA-m2lC.js → lua-CD2aJ_rS.js} +1 -1
  89. package/dist/client/assets/{marko-Bd44681W.js → marko-BQ37hu6z.js} +1 -1
  90. package/dist/client/assets/{mdc-DhosSoGv.js → mdc-B5NUi3zZ.js} +1 -1
  91. package/dist/client/assets/{mermaid-parser.core-Dq0EOOjQ.js → mermaid-parser.core-BxHF_XbX.js} +1 -1
  92. package/dist/client/assets/{mermaid.core-qcl7ght-.js → mermaid.core-BUtaf4P1.js} +3 -3
  93. package/dist/client/assets/{mindmap-definition-RKZ34NQL-DrZ9di3F.js → mindmap-definition-RKZ34NQL-D13tPu2o.js} +1 -1
  94. package/dist/client/assets/{nginx-sYwNRk-F.js → nginx-1W1E03Rg.js} +1 -1
  95. package/dist/client/assets/{nim-DrXU2tn9.js → nim-C5A88bFP.js} +1 -1
  96. package/dist/client/assets/{perl-TEELuyd-.js → perl-BYoP0wNt.js} +1 -1
  97. package/dist/client/assets/{php-Dy_Y1r8j.js → php-CFxna09e.js} +1 -1
  98. package/dist/client/assets/{pieDiagram-4H26LBE5-Aev8QdJC.js → pieDiagram-4H26LBE5-CHL7Ml5w.js} +1 -1
  99. package/dist/client/assets/{pug-vancrY0a.js → pug-BR4JgWAk.js} +1 -1
  100. package/dist/client/assets/{qml-BA5z-zbf.js → qml-D1U1EFEe.js} +1 -1
  101. package/dist/client/assets/{quadrantDiagram-W4KKPZXB-DhEDvxx7.js → quadrantDiagram-W4KKPZXB-BnYtv-HY.js} +1 -1
  102. package/dist/client/assets/{r-BR0O4N-s.js → r-ChE6X060.js} +1 -1
  103. package/dist/client/assets/{razor-DXiNCb-5.js → razor-B5iVfQMe.js} +1 -1
  104. package/dist/client/assets/{regexp-BhjJa9MI.js → regexp-Dz2drUIf.js} +1 -1
  105. package/dist/client/assets/{requirementDiagram-4Y6WPE33-DPS5siTy.js → requirementDiagram-4Y6WPE33-D8QEGLKB.js} +1 -1
  106. package/dist/client/assets/{review-export-DABY3y7y.js → review-export-CvFFbCAB.js} +1 -1
  107. package/dist/client/assets/{rst-Bi3zId1d.js → rst-DZM3RGRs.js} +1 -1
  108. package/dist/client/assets/{ruby-BURiJKuD.js → ruby-DkXnm-J8.js} +1 -1
  109. package/dist/client/assets/{sankeyDiagram-5OEKKPKP-CjZF2AQd.js → sankeyDiagram-5OEKKPKP-wVaks6lB.js} +1 -1
  110. package/dist/client/assets/{sas-BO_W1LuL.js → sas-DMbpc71c.js} +1 -1
  111. package/dist/client/assets/{scss-BPUTinXb.js → scss-IwVMMp22.js} +1 -1
  112. package/dist/client/assets/{sequenceDiagram-3UESZ5HK-0rsTmBLB.js → sequenceDiagram-3UESZ5HK-Cg31TB-R.js} +1 -1
  113. package/dist/client/assets/{shellscript-B4rfo4qg.js → shellscript-CIStAKx3.js} +1 -1
  114. package/dist/client/assets/{shellsession-DLX-O8m7.js → shellsession-uLtzHhlo.js} +1 -1
  115. package/dist/client/assets/{soy-BEUiwSVD.js → soy-BkxBYigm.js} +1 -1
  116. package/dist/client/assets/{sql-CwSA8v_H.js → sql-Ba9y9EvJ.js} +1 -1
  117. package/dist/client/assets/{src-Cn22-GjE.js → src-9MKexpFu.js} +1 -1
  118. package/dist/client/assets/{stata-XfdBiAnW.js → stata-CrPCbiIZ.js} +1 -1
  119. package/dist/client/assets/{stateDiagram-AJRCARHV-BVvCsgjA.js → stateDiagram-AJRCARHV-BbvNjVF6.js} +1 -1
  120. package/dist/client/assets/stateDiagram-v2-BHNVJYJU-B5BbZkU5.js +1 -0
  121. package/dist/client/assets/{surrealql-COaehKkS.js → surrealql-Dvip5u_o.js} +1 -1
  122. package/dist/client/assets/{svelte-B0kTIq0J.js → svelte-xBLD60Zd.js} +1 -1
  123. package/dist/client/assets/{templ-DGxWfDf-.js → templ-CWv68xbP.js} +1 -1
  124. package/dist/client/assets/{tex-C9X3gjZ2.js → tex-CHqz-fYs.js} +1 -1
  125. package/dist/client/assets/{timeline-definition-PNZ67QCA-B535P7_e.js → timeline-definition-PNZ67QCA-CWKkJ3QZ.js} +1 -1
  126. package/dist/client/assets/{ts-tags-By9ETsTC.js → ts-tags-DS82EDuE.js} +1 -1
  127. package/dist/client/assets/{tsx-CvVX506n.js → tsx-B2GBjp2F.js} +1 -1
  128. package/dist/client/assets/{twig-CjLWv7eu.js → twig-CC8x9pG0.js} +1 -1
  129. package/dist/client/assets/{typescript-BEq3u3Bc.js → typescript-g7i13lnC.js} +1 -1
  130. package/dist/client/assets/{vennDiagram-CIIHVFJN-CTV9H1N2.js → vennDiagram-CIIHVFJN-OLItKWeg.js} +1 -1
  131. package/dist/client/assets/{vue-html-92z_Aqn0.js → vue-html-D9GQtYub.js} +1 -1
  132. package/dist/client/assets/{vue-DYazforU.js → vue-rFbe7luB.js} +1 -1
  133. package/dist/client/assets/{vue-vine-VY7raYSI.js → vue-vine-mrNtQtY5.js} +1 -1
  134. package/dist/client/assets/{wardleyDiagram-YWT4CUSO-BzJaykc6.js → wardleyDiagram-YWT4CUSO-Dy1yfeb4.js} +1 -1
  135. package/dist/client/assets/{xml-hd7OQ798.js → xml-CHfMjyAM.js} +1 -1
  136. package/dist/client/assets/{xsl-MkuT76g1.js → xsl-BFkNSogJ.js} +1 -1
  137. package/dist/client/assets/{xychartDiagram-2RQKCTM6-D36D8smx.js → xychartDiagram-2RQKCTM6-DfSnfjVL.js} +1 -1
  138. package/dist/client/assets/{yaml-D6zRzOR2.js → yaml-BfSgHc04.js} +1 -1
  139. package/dist/client/index.html +2 -2
  140. package/dist/{completions-Csvfqctx.mjs → completions-BO2DUM-8.mjs} +23 -1
  141. package/dist/{doctor-B3Nrydc0.mjs → doctor-D0Y3kOY7.mjs} +5 -4
  142. package/dist/{find-tui-binary-CRpbYXLC.mjs → find-tui-binary-B71xiwWu.mjs} +33 -15
  143. package/dist/github-CErBub2y.mjs +2 -0
  144. package/dist/{github-Cf5blBty.mjs → github-DBsZ0h_l.mjs} +47 -5
  145. package/dist/github-attachments-plDeB0iE.mjs +351 -0
  146. package/dist/handoff-LAFtmnHf.mjs +11 -0
  147. package/dist/{mcp-DwnYjFS0.mjs → mcp-DtVrMR2S.mjs} +41 -22
  148. package/dist/native/tui-darwin-arm64/diffing-tui +0 -0
  149. package/dist/native/tui-darwin-x64/diffing-tui +0 -0
  150. package/dist/native/tui-linux-arm64-gnu/diffing-tui +0 -0
  151. package/dist/native/tui-linux-arm64-musl/diffing-tui +0 -0
  152. package/dist/native/tui-linux-x64-gnu/diffing-tui +0 -0
  153. package/dist/native/tui-linux-x64-musl/diffing-tui +0 -0
  154. package/dist/native/tui-win32-x64-msvc/diffing-tui.exe +0 -0
  155. package/dist/{review-export-DjxKBeIZ.mjs → review-export-B63eRAVa.mjs} +1 -1
  156. package/dist/{settings-bwe7yQ8U.mjs → search-BMPY_ZW8.mjs} +117 -97
  157. package/dist/search-BO9Im7eu.mjs +2 -0
  158. package/dist/{server-CZeMCHEa.mjs → server-j0PnTVX1.mjs} +174 -75
  159. package/dist/server-lock-CY0_1mcS.mjs +275 -0
  160. package/dist/session-conflict-C6V9ZKo7.mjs +96 -0
  161. package/dist/session-manager-CYNchhVA.mjs +159 -0
  162. package/dist/settings-yK0GYpbn.mjs +60 -0
  163. package/dist/tui-search-bridge-Bfb2ktdA.mjs +133 -0
  164. package/package.json +6 -4
  165. package/dist/client/assets/channel-BcJKoISM.js +0 -1
  166. package/dist/client/assets/chunk-QZHKN3VN-90aaHYyK.js +0 -1
  167. package/dist/client/assets/chunk-WU5MYG2G-CfaWSqjJ.js +0 -1
  168. package/dist/client/assets/classDiagram-4FO5ZUOK-CsDELGUF.js +0 -1
  169. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-R5SygY4h.js +0 -1
  170. package/dist/client/assets/index-B42c0TyV.css +0 -1
  171. package/dist/client/assets/stateDiagram-v2-BHNVJYJU-Bo6SeNmU.js +0 -1
  172. package/dist/github-DWgPIcKC.mjs +0 -2
  173. package/dist/server-lock-uqSdDYeR.mjs +0 -153
  174. /package/dist/{apply-suggestion-BAuyCYk6.mjs → apply-suggestion-CHYnw68I.mjs} +0 -0
  175. /package/dist/{comment-format-B5AcGcR-.mjs → comment-format-B85NHZnG.mjs} +0 -0
  176. /package/dist/{diff-fingerprint-CWa-soYD.mjs → diff-fingerprint-BgR0tu1o.mjs} +0 -0
  177. /package/dist/{plan-format-BQyx--mp.mjs → plan-format-BwJh5JSE.mjs} +0 -0
  178. /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
- This instantly spins up a local server, establishes an active repository watcher, and opens your default browser to an interactive code review dashboard.
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? After building or separately installing the native binary
33
- as described below, add `--tui` for the same review flow without a browser:
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. The v0.10.0 npm package does
43
- > **not** bundle a platform-specific `diffing-tui` executable; `--tui`
44
- > requires a source build or a separately installed binary on `PATH`. See
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
- > **Distribution status in v0.10.0:** the npm package contains the Node CLI and
185
- > web UI, but not a platform-specific `diffing-tui` executable. Build the
186
- > binary from a source checkout or install it separately on `PATH`. diffing
187
- > does not compile Rust during npm installation. If no compatible binary is
188
- > found, `diffing --tui` prints a fallback notice and runs the normal terminal
189
- > diff instead.
190
-
191
- `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. A random-port loopback API is published through `server.json` with `mode: "tui"` and a per-session capability, so local agents can inspect a large diff without receiving the whole patch.
192
-
193
- Its diff-first **Gridline** design system uses a one-row command header, border-light file navigation, a dedicated review gutter, high-contrast semantic tokens, and keyboard-visible focus rails. Empty review drawers collapse automatically. Wide terminals can show files, diff, and review together; medium layouts place an active review below the diff; compact layouts show one focused workspace at a time. Press `,` for persisted Settings, including **Single file** versus virtualized **Continuous files**, split/unified layout, wrap, tab size, line numbers, review drawer, optional language intelligence, and theme.
194
-
195
- 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.
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
- - **Viewport-only rendering** — only visible rows are sought, decoded, theme-aware syntax-highlighted, and converted to terminal cells. Highlighting is available in both unified and split layouts, with token contrast corrected against semantic addition/deletion backgrounds. Single/continuous file display, horizontal scrolling, wrapping, binary markers, untracked files, and live working-tree refresh are supported.
211
- - **Optional local language intelligence** — Auto mode lazily discovers an existing `rust-analyzer`, `typescript-language-server`, `pyright-langserver`, `gopls`, or `clangd` on `PATH`; diffing never downloads a server or sends source off-machine. Diagnostics use lettered `E/W/I/H` gutter marks and appear in the status line, `gh` opens hover, `gd` follows definitions that are visible in the current diff, and `Alt-h/l` moves the symbol column. Turn the feature off from Settings.
212
- - **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`, `w`, `m`, `t`, `,`, and `?`. `Esc` cancels a mode; `q` or `Ctrl-C` quits. Single/continuous file display and language intelligence are changed from Settings.
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
- - **Multi-line `tui-textarea` form** with markdown rendering in the preview pane.
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 47–152 ms, serves viewport reads at 30 µs p95, and peaks at about 54 MiB RSS on the development machine. Run it with `DIFFING_BENCH_LINES=1000000 cargo bench -p diffing-core --bench diff_index`; results vary by machine and filesystem cache.
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`, `bin/`, `target/release/`, `target/debug/`, then `$PATH`. A
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 are reserved for future packaged-binary distribution; they
243
- are not populated by the v0.10.0 npm package. A CLI run from this source
244
- checkout discovers the binary under `target/`; to use the globally installed
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 lockfile (`server.json`) in `~/.diffing/<repo-hash>/` enables all subcommands and MCP tools to discover the server's port with zero configuration. Stale or crashed server locks are automatically detected and treated as dead via `process.kill(pid, 0)`.
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
- - **Web Mode (Default for interactive TTY)**: When executed in an interactive terminal session, it boots the local Hono review server, registers the repository lockfile, and opens your default browser.
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 formatComments } from "./comment-format-B5AcGcR-.mjs";
3
- import { n as formatPlanReview } from "./plan-format-BQyx--mp.mjs";
4
- import { i as readServerLock, r as isLockAlive } from "./server-lock-uqSdDYeR.mjs";
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 = readServerLock();
29
- if (!lock || !isLockAlive(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("No review sent within the timeout. Run `diffing await-review` again to keep waiting.");
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-DjxKBeIZ.mjs");
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("No plan decision within the timeout. Run `diffing plan await` again to keep waiting.");
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-B3Nrydc0.mjs");
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-Csvfqctx.mjs");
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-fe0tR8tx.mjs");
855
+ const { runUpdateCommand } = await import("./update-check-Copcz9eb.mjs");
829
856
  return runUpdateCommand();
830
857
  case "gh":
831
- const { runGhSubcommand } = await import("./cli-gh-B8HybRWZ.mjs");
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-B5AcGcR-.mjs";
2
- import { i as readServerLock, r as isLockAlive } from "./server-lock-uqSdDYeR.mjs";
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 = readServerLock();
25
- if (!lock || !isLockAlive(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
  }