diffing 0.11.0 → 0.13.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 (184) hide show
  1. package/README.md +56 -801
  2. package/dist/{cli-agent-DkwGxuy2.mjs → cli-agent-Cx2k0Ki7.mjs} +236 -59
  3. package/dist/{cli-gh-D0NfKpOp.mjs → cli-gh-BQuQpV-s.mjs} +24 -14
  4. package/dist/cli.mjs +69 -26
  5. package/dist/client/assets/{angular-html-Dl53kkiy.js → angular-html-gcUdctE_.js} +1 -1
  6. package/dist/client/assets/{angular-ts-wNJFFkey.js → angular-ts-BkjLgJJH.js} +1 -1
  7. package/dist/client/assets/{apl-BxtQST-h.js → apl-BtuEza96.js} +1 -1
  8. package/dist/client/assets/{arc-CBmZuzPB.js → arc-yk_3cjs2.js} +1 -1
  9. package/dist/client/assets/{architectureDiagram-3BPJPVTR-CEci_K9f.js → architectureDiagram-3BPJPVTR-DDVXPdzY.js} +1 -1
  10. package/dist/client/assets/{astro-BpADD5rh.js → astro-DfUNgEjV.js} +1 -1
  11. package/dist/client/assets/{blade-B4I5SQmP.js → blade-uv3PNTww.js} +1 -1
  12. package/dist/client/assets/{blockDiagram-GPEHLZMM-DcKhDtnE.js → blockDiagram-GPEHLZMM-DlMLqbfD.js} +1 -1
  13. package/dist/client/assets/{c-C3VtOgg8.js → c-DcsMh0kd.js} +1 -1
  14. package/dist/client/assets/{c4Diagram-AAUBKEIU-CaHozoxF.js → c4Diagram-AAUBKEIU-C4ZZJAMJ.js} +1 -1
  15. package/dist/client/assets/channel-CPOnEOhs.js +1 -0
  16. package/dist/client/assets/{chunk-2J33WTMH-tvuzKhdK.js → chunk-2J33WTMH-CwkSvLT8.js} +1 -1
  17. package/dist/client/assets/{chunk-3OPIFGDE-D_nBoD9w.js → chunk-3OPIFGDE-s6UH12Df.js} +1 -1
  18. package/dist/client/assets/{chunk-4BX2VUAB-yHPdy1G8.js → chunk-4BX2VUAB-wGjYymx_.js} +1 -1
  19. package/dist/client/assets/{chunk-55IACEB6-yXpL8wjV.js → chunk-55IACEB6-DObbP11Q.js} +1 -1
  20. package/dist/client/assets/{chunk-5ZQYHXKU-DZ5cvCDV.js → chunk-5ZQYHXKU-DwbkzQEJ.js} +1 -1
  21. package/dist/client/assets/{chunk-727SXJPM-CJjgOWmY.js → chunk-727SXJPM-DzoJfly4.js} +1 -1
  22. package/dist/client/assets/{chunk-AQP2D5EJ-CQYQKXSE.js → chunk-AQP2D5EJ-f1kNxYS3.js} +1 -1
  23. package/dist/client/assets/{chunk-BSJP7CBP-CP_f908b.js → chunk-BSJP7CBP-CTBkVJEp.js} +1 -1
  24. package/dist/client/assets/{chunk-CSCIHK7Q-tcgA8jR0.js → chunk-CSCIHK7Q-C6dvEyPX.js} +1 -1
  25. package/dist/client/assets/{chunk-FMBD7UC4-DlpmhBYg.js → chunk-FMBD7UC4-C166WZ7L.js} +1 -1
  26. package/dist/client/assets/{chunk-KSCS5N6A-BkfieXpV.js → chunk-KSCS5N6A-CaVyQHxA.js} +1 -1
  27. package/dist/client/assets/{chunk-L5ZTLDWV-BjVXSZnt.js → chunk-L5ZTLDWV-CdW7usF5.js} +1 -1
  28. package/dist/client/assets/{chunk-LZXEDZCA-CaAWmy4Q.js → chunk-LZXEDZCA-imRCFVGq.js} +2 -2
  29. package/dist/client/assets/{chunk-ND2GUHAM-kWh41zUn.js → chunk-ND2GUHAM-BJCVPOgO.js} +1 -1
  30. package/dist/client/assets/{chunk-NZK2D7GU-CDrIi44_.js → chunk-NZK2D7GU-DodLkks9.js} +1 -1
  31. package/dist/client/assets/{chunk-O5CBEL6O-CbNGK3Te.js → chunk-O5CBEL6O-DYxYE_dt.js} +1 -1
  32. package/dist/client/assets/chunk-QZHKN3VN-7sNTyEOs.js +1 -0
  33. package/dist/client/assets/chunk-WU5MYG2G-DluN2oZF.js +1 -0
  34. package/dist/client/assets/{chunk-XPW4576I-Cca0fTtG.js → chunk-XPW4576I-DkPXlA-y.js} +1 -1
  35. package/dist/client/assets/classDiagram-4FO5ZUOK-CHofrzZI.js +1 -0
  36. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-B8fKe5FS.js +1 -0
  37. package/dist/client/assets/{cobol-j-6eG2UQ.js → cobol-B5tSUxVN.js} +1 -1
  38. package/dist/client/assets/{coffee-CZLH0dtt.js → coffee-B2Q8w4Zu.js} +1 -1
  39. package/dist/client/assets/{cose-bilkent-S5V4N54A-DlxESVex.js → cose-bilkent-S5V4N54A-Bg2tspSU.js} +1 -1
  40. package/dist/client/assets/{cpp-j6Bp24RI.js → cpp-CfzAEc1z.js} +1 -1
  41. package/dist/client/assets/{crystal-DW7wcFUs.js → crystal-BDxAjW7-.js} +1 -1
  42. package/dist/client/assets/{css-C43BDU2i.js → css-nC3_RAjk.js} +1 -1
  43. package/dist/client/assets/{dagre-BM42HDAG-BaemEJFh.js → dagre-BM42HDAG-BZiNHe27.js} +1 -1
  44. package/dist/client/assets/{diagram-2AECGRRQ-BaM-bkJ3.js → diagram-2AECGRRQ-D3Vd2itQ.js} +1 -1
  45. package/dist/client/assets/{diagram-5GNKFQAL-BOH04DJO.js → diagram-5GNKFQAL-D44Rm6ep.js} +1 -1
  46. package/dist/client/assets/{diagram-KO2AKTUF-BP5MyqDZ.js → diagram-KO2AKTUF-DwoQejb5.js} +1 -1
  47. package/dist/client/assets/{diagram-LMA3HP47-Dt4gKMYF.js → diagram-LMA3HP47-C1eaDL4X.js} +1 -1
  48. package/dist/client/assets/{diagram-OG6HWLK6-DoT1VshN.js → diagram-OG6HWLK6-BtBJHHnj.js} +1 -1
  49. package/dist/client/assets/{dist-DEAxvC4F.js → dist-DUBmiUQf.js} +1 -1
  50. package/dist/client/assets/{edge-D9ySFlnD.js → edge-WCfPDabs.js} +1 -1
  51. package/dist/client/assets/{elixir-CoJz_LQ5.js → elixir-CazmTZo9.js} +1 -1
  52. package/dist/client/assets/{elm-CvedWh_e.js → elm-CTqaOirp.js} +1 -1
  53. package/dist/client/assets/{erDiagram-TEJ5UH35-CMP78FsQ.js → erDiagram-TEJ5UH35-CqjpbNDt.js} +1 -1
  54. package/dist/client/assets/{erb-lD_yYZsm.js → erb-CK9x36t2.js} +1 -1
  55. package/dist/client/assets/{flowDiagram-I6XJVG4X-Dp0s5BFj.js → flowDiagram-I6XJVG4X-CSHJZmlA.js} +1 -1
  56. package/dist/client/assets/{ganttDiagram-6RSMTGT7-GmSG31U-.js → ganttDiagram-6RSMTGT7-D6KxkDpI.js} +1 -1
  57. package/dist/client/assets/{git-rebase-DwZABzof.js → git-rebase-Bn8xQDxV.js} +1 -1
  58. package/dist/client/assets/{gitGraphDiagram-PVQCEYII-C1SXShag.js → gitGraphDiagram-PVQCEYII-ZGSlrHF5.js} +1 -1
  59. package/dist/client/assets/{glimmer-js-CWcs3w1Z.js → glimmer-js-h7wFfOLo.js} +1 -1
  60. package/dist/client/assets/{glimmer-ts-CrzGN4lJ.js → glimmer-ts-vlZuiamP.js} +1 -1
  61. package/dist/client/assets/{glsl-DRCtwX7h.js → glsl-CNutENPV.js} +1 -1
  62. package/dist/client/assets/{graphql-rpmrismS.js → graphql-BfddKr9j.js} +1 -1
  63. package/dist/client/assets/{hack-Ba02RnuQ.js → hack-BkYH75Gx.js} +1 -1
  64. package/dist/client/assets/{haml-BHBACStm.js → haml-CM-xW5RI.js} +1 -1
  65. package/dist/client/assets/{handlebars-BtlQ1SCa.js → handlebars-CklcCbzf.js} +1 -1
  66. package/dist/client/assets/{html-BkVU3Dge.js → html-bltTcC3c.js} +1 -1
  67. package/dist/client/assets/{html-derivative-DoK92vwi.js → html-derivative-C4R1a7Nf.js} +1 -1
  68. package/dist/client/assets/{http-CJAwKSPH.js → http-B6uXoDkp.js} +1 -1
  69. package/dist/client/assets/{hurl-kaX5jwuN.js → hurl-gquKVFPU.js} +1 -1
  70. package/dist/client/assets/{index-D8hOoJCg.css → index-BsuX6HVI.css} +1 -1
  71. package/dist/client/assets/{index-BHeNiC07.js → index-yhKiqbkK.js} +154 -154
  72. package/dist/client/assets/{infoDiagram-5YYISTIA-B0i3BlNR.js → infoDiagram-5YYISTIA-DCQv5BKv.js} +1 -1
  73. package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-BN8sEei4.js → ishikawaDiagram-YF4QCWOH-BqXC35qz.js} +1 -1
  74. package/dist/client/assets/{java-BvrigIoq.js → java-DZLUJ7qo.js} +1 -1
  75. package/dist/client/assets/{javascript-DZkPTYAi.js → javascript-CayXc7uP.js} +1 -1
  76. package/dist/client/assets/{jinja-Ceg7ui1S.js → jinja-CQQUTC0y.js} +1 -1
  77. package/dist/client/assets/{jison-iE1GaOyN.js → jison-CvzuCn2x.js} +1 -1
  78. package/dist/client/assets/{journeyDiagram-JHISSGLW-CE6O3NhU.js → journeyDiagram-JHISSGLW-bRlSO5Sv.js} +1 -1
  79. package/dist/client/assets/{json-C0j8rEcg.js → json-BsMA0GaP.js} +1 -1
  80. package/dist/client/assets/{jsx-B7eXljgz.js → jsx-Dbxr4aPH.js} +1 -1
  81. package/dist/client/assets/{julia-DMDw0aMP.js → julia-CZ38GzHV.js} +1 -1
  82. package/dist/client/assets/{just-BryMKRJ_.js → just-BQwFLV1D.js} +1 -1
  83. package/dist/client/assets/{kanban-definition-UN3LZRKU-j-aU6Yzp.js → kanban-definition-UN3LZRKU-BVjoqA0y.js} +1 -1
  84. package/dist/client/assets/{latex-BNC9-sjr.js → latex-BGyrMdgQ.js} +1 -1
  85. package/dist/client/assets/{line-CyEqpEDp.js → line-DacHFvZH.js} +1 -1
  86. package/dist/client/assets/{linear-CXeaA9km.js → linear-BPGHNTSb.js} +1 -1
  87. package/dist/client/assets/{liquid-D-fQw-oJ.js → liquid-CiA2vjOH.js} +1 -1
  88. package/dist/client/assets/{lua-CD2aJ_rS.js → lua-D9k3fxwM.js} +1 -1
  89. package/dist/client/assets/{marko-BQ37hu6z.js → marko-CwBH4-2T.js} +1 -1
  90. package/dist/client/assets/{mdc-B5NUi3zZ.js → mdc-D4WuuVvw.js} +1 -1
  91. package/dist/client/assets/{mermaid-parser.core-BxHF_XbX.js → mermaid-parser.core-DuXqm2Gp.js} +1 -1
  92. package/dist/client/assets/{mermaid.core-BUtaf4P1.js → mermaid.core-DRh_KVT1.js} +3 -3
  93. package/dist/client/assets/{mindmap-definition-RKZ34NQL-D13tPu2o.js → mindmap-definition-RKZ34NQL-C5wytjbD.js} +1 -1
  94. package/dist/client/assets/{nginx-1W1E03Rg.js → nginx-DHMa03ia.js} +1 -1
  95. package/dist/client/assets/{nim-C5A88bFP.js → nim-8gK3mQXD.js} +1 -1
  96. package/dist/client/assets/{perl-BYoP0wNt.js → perl-DqXBmOB_.js} +1 -1
  97. package/dist/client/assets/{php-CFxna09e.js → php-CruAnpl2.js} +1 -1
  98. package/dist/client/assets/{pieDiagram-4H26LBE5-CHL7Ml5w.js → pieDiagram-4H26LBE5-Cv2Csp1M.js} +1 -1
  99. package/dist/client/assets/{pug-BR4JgWAk.js → pug-C7a5y4Mi.js} +1 -1
  100. package/dist/client/assets/{qml-D1U1EFEe.js → qml-mgWY__NW.js} +1 -1
  101. package/dist/client/assets/{quadrantDiagram-W4KKPZXB-BnYtv-HY.js → quadrantDiagram-W4KKPZXB-DHQIHzFU.js} +1 -1
  102. package/dist/client/assets/{r-ChE6X060.js → r-Do5QoKdS.js} +1 -1
  103. package/dist/client/assets/{razor-B5iVfQMe.js → razor-BqdDbm9d.js} +1 -1
  104. package/dist/client/assets/{regexp-Dz2drUIf.js → regexp-CNMlPqVr.js} +1 -1
  105. package/dist/client/assets/{requirementDiagram-4Y6WPE33-D8QEGLKB.js → requirementDiagram-4Y6WPE33-rUeJykKo.js} +1 -1
  106. package/dist/client/assets/{review-export-CvFFbCAB.js → review-export-BgwyN8Ky.js} +1 -1
  107. package/dist/client/assets/{rst-DZM3RGRs.js → rst-PYCtADQ2.js} +1 -1
  108. package/dist/client/assets/{ruby-DkXnm-J8.js → ruby-B8JdoeHE.js} +1 -1
  109. package/dist/client/assets/{sankeyDiagram-5OEKKPKP-wVaks6lB.js → sankeyDiagram-5OEKKPKP-Bsga6dQU.js} +1 -1
  110. package/dist/client/assets/{sas-DMbpc71c.js → sas-kIev4j3d.js} +1 -1
  111. package/dist/client/assets/{scss-IwVMMp22.js → scss-cf-rl7q3.js} +1 -1
  112. package/dist/client/assets/{sequenceDiagram-3UESZ5HK-Cg31TB-R.js → sequenceDiagram-3UESZ5HK-BVcwcOB2.js} +1 -1
  113. package/dist/client/assets/{shellscript-CIStAKx3.js → shellscript-BHMFbkaV.js} +1 -1
  114. package/dist/client/assets/{shellsession-uLtzHhlo.js → shellsession-y_3kBnoK.js} +1 -1
  115. package/dist/client/assets/{soy-BkxBYigm.js → soy-Coc7dfRW.js} +1 -1
  116. package/dist/client/assets/{sql-Ba9y9EvJ.js → sql-CsZYO19m.js} +1 -1
  117. package/dist/client/assets/{src-9MKexpFu.js → src-ujohT29p.js} +1 -1
  118. package/dist/client/assets/{stata-CrPCbiIZ.js → stata-BFa4m_Eh.js} +1 -1
  119. package/dist/client/assets/{stateDiagram-AJRCARHV-BbvNjVF6.js → stateDiagram-AJRCARHV-DBElJIPe.js} +1 -1
  120. package/dist/client/assets/stateDiagram-v2-BHNVJYJU-BocZ498b.js +1 -0
  121. package/dist/client/assets/{surrealql-Dvip5u_o.js → surrealql-DlwfRFnC.js} +1 -1
  122. package/dist/client/assets/{svelte-xBLD60Zd.js → svelte-RrLklQOZ.js} +1 -1
  123. package/dist/client/assets/{templ-CWv68xbP.js → templ-BDbBg7z2.js} +1 -1
  124. package/dist/client/assets/{tex-CHqz-fYs.js → tex-BeAp-Hqv.js} +1 -1
  125. package/dist/client/assets/{timeline-definition-PNZ67QCA-CWKkJ3QZ.js → timeline-definition-PNZ67QCA-Det2OiYV.js} +1 -1
  126. package/dist/client/assets/{ts-tags-DS82EDuE.js → ts-tags-Dz-1CFmn.js} +1 -1
  127. package/dist/client/assets/{tsx-B2GBjp2F.js → tsx-Dfi08w8H.js} +1 -1
  128. package/dist/client/assets/{twig-CC8x9pG0.js → twig-BfzYY6Hd.js} +1 -1
  129. package/dist/client/assets/{typescript-g7i13lnC.js → typescript-6FNAPG3Z.js} +1 -1
  130. package/dist/client/assets/{vennDiagram-CIIHVFJN-OLItKWeg.js → vennDiagram-CIIHVFJN-DhH4H0vl.js} +1 -1
  131. package/dist/client/assets/{vue-rFbe7luB.js → vue-DTPedjqE.js} +1 -1
  132. package/dist/client/assets/{vue-html-D9GQtYub.js → vue-html-B4sC29Oj.js} +1 -1
  133. package/dist/client/assets/{vue-vine-mrNtQtY5.js → vue-vine-BWzpqJ4r.js} +1 -1
  134. package/dist/client/assets/{wardleyDiagram-YWT4CUSO-Dy1yfeb4.js → wardleyDiagram-YWT4CUSO-BC8K10yP.js} +1 -1
  135. package/dist/client/assets/{xml-CHfMjyAM.js → xml-BK8ACjht.js} +1 -1
  136. package/dist/client/assets/{xsl-BFkNSogJ.js → xsl-rjlrbfou.js} +1 -1
  137. package/dist/client/assets/{xychartDiagram-2RQKCTM6-DfSnfjVL.js → xychartDiagram-2RQKCTM6-DwcVZiB5.js} +1 -1
  138. package/dist/client/assets/{yaml-BfSgHc04.js → yaml-DM6lgMhS.js} +1 -1
  139. package/dist/client/index.html +2 -2
  140. package/dist/completions-5rtfoxB9.mjs +2 -0
  141. package/dist/{completions-BO2DUM-8.mjs → completions-7YSX1neu.mjs} +7 -1
  142. package/dist/{doctor-D0Y3kOY7.mjs → doctor-BMfx7_GY.mjs} +16 -14
  143. package/dist/doctor-BRr5IWHe.mjs +2 -0
  144. package/dist/{find-tui-binary-B71xiwWu.mjs → find-tui-binary-DGspwyvd.mjs} +56 -25
  145. package/dist/{git-Czo96ymM.mjs → git-BGj31GX-.mjs} +71 -7
  146. package/dist/git-CfDSkUcE.mjs +2 -0
  147. package/dist/{github-CErBub2y.mjs → github-BLrnsozP.mjs} +1 -1
  148. package/dist/{github-DBsZ0h_l.mjs → github-DbAFoB92.mjs} +3 -3
  149. package/dist/{github-attachments-plDeB0iE.mjs → github-attachments-fNCKYL-Z.mjs} +2 -2
  150. package/dist/{mcp-DtVrMR2S.mjs → mcp-Bi551clR.mjs} +33 -30
  151. package/dist/native/tui-darwin-arm64/diffing-tui +0 -0
  152. package/dist/native/tui-darwin-x64/diffing-tui +0 -0
  153. package/dist/native/tui-linux-arm64-gnu/diffing-tui +0 -0
  154. package/dist/native/tui-linux-arm64-musl/diffing-tui +0 -0
  155. package/dist/native/tui-linux-x64-gnu/diffing-tui +0 -0
  156. package/dist/native/tui-linux-x64-musl/diffing-tui +0 -0
  157. package/dist/native/tui-win32-x64-msvc/diffing-tui.exe +0 -0
  158. package/dist/{search-BMPY_ZW8.mjs → search-3R2E5xxr.mjs} +16 -1
  159. package/dist/{search-BO9Im7eu.mjs → search-CQ4nsjBX.mjs} +1 -1
  160. package/dist/{server-j0PnTVX1.mjs → server-B9NVZu7l.mjs} +174 -46
  161. package/dist/{server-lock-CY0_1mcS.mjs → server-lock-BNI8FKV1.mjs} +175 -23
  162. package/dist/{session-conflict-C6V9ZKo7.mjs → session-conflict-CB0IErdn.mjs} +8 -7
  163. package/dist/{session-manager-CYNchhVA.mjs → session-manager-656aJXFE.mjs} +2 -2
  164. package/dist/session-url-B8TrGGeE.mjs +33 -0
  165. package/dist/{settings-yK0GYpbn.mjs → settings-DkPDB_hS.mjs} +32 -4
  166. package/dist/setup-BiwX7vdd.mjs +446 -0
  167. package/dist/setup-first-run-DyT0PlOZ.mjs +2 -0
  168. package/dist/setup-first-run-i1o7DBki.mjs +74 -0
  169. package/dist/terminal-BroplOnw.mjs +116 -0
  170. package/dist/{tui-search-bridge-Bfb2ktdA.mjs → tui-search-bridge-fFKqX4Fi.mjs} +3 -3
  171. package/dist/{update-check-Copcz9eb.mjs → update-check-ISaw61qS.mjs} +16 -15
  172. package/package.json +11 -3
  173. package/scripts/postinstall.mjs +52 -0
  174. package/dist/client/assets/channel-Ct4-oSQN.js +0 -1
  175. package/dist/client/assets/chunk-QZHKN3VN-BXhKFVX7.js +0 -1
  176. package/dist/client/assets/chunk-WU5MYG2G-_EwuC51_.js +0 -1
  177. package/dist/client/assets/classDiagram-4FO5ZUOK-C8bdx9R4.js +0 -1
  178. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-B26wrQuH.js +0 -1
  179. package/dist/client/assets/stateDiagram-v2-BHNVJYJU-B5BbZkU5.js +0 -1
  180. package/dist/git-DaP_1rVy.mjs +0 -2
  181. /package/dist/{apply-suggestion-CHYnw68I.mjs → apply-suggestion-BsR_8FXW.mjs} +0 -0
  182. /package/dist/{diff-fingerprint-BgR0tu1o.mjs → diff-fingerprint-BL5jNHnP.mjs} +0 -0
  183. /package/dist/{handoff-LAFtmnHf.mjs → handoff-DcShCxWJ.mjs} +0 -0
  184. /package/dist/{review-export-B63eRAVa.mjs → review-export-GW4KNsGN.mjs} +0 -0
@@ -1,9 +1,10 @@
1
- import { d as getProjectStorageDir } from "./git-Czo96ymM.mjs";
2
- import { n as saveSettings, t as loadSettings } from "./settings-yK0GYpbn.mjs";
1
+ import { f as getProjectStorageDir } from "./git-BGj31GX-.mjs";
2
+ import { i as loadSettings, n as formatModeLabel, s as saveSettings } from "./settings-DkPDB_hS.mjs";
3
3
  import { t as formatComments } from "./comment-format-B85NHZnG.mjs";
4
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
+ import { h as SESSION_TOKEN_HEADER, u as resolveActiveServerLock } from "./server-lock-BNI8FKV1.mjs";
6
+ import { i as reviewSessionUrl, t as appendSessionToken } from "./session-url-B8TrGGeE.mjs";
7
+ import { a as CLI_AWAIT_REVIEW_TIMEOUT_HINT, i as CLI_AWAIT_PLAN_TIMEOUT_HINT, o as CLI_PLAN_SUBMIT_PARK_HINT } from "./handoff-DcShCxWJ.mjs";
7
8
  import { join } from "node:path";
8
9
  import { parseArgs } from "node:util";
9
10
  import { mkdir, readFile, writeFile } from "node:fs/promises";
@@ -25,6 +26,7 @@ const EXIT_NO_SERVER = 3;
25
26
  const EXIT_NOT_FOUND = 4;
26
27
  const EXIT_USAGE = 5;
27
28
  let activeCapability;
29
+ let activeAuthToken;
28
30
  /** Resolve the running server's base URL from the lockfile, or exit cleanly. */
29
31
  function baseUrl() {
30
32
  const lock = resolveActiveServerLock();
@@ -34,17 +36,41 @@ function baseUrl() {
34
36
  }
35
37
  const host = lock.host === "0.0.0.0" || lock.host === "::" ? "127.0.0.1" : lock.host;
36
38
  activeCapability = lock.mode === "tui" ? lock.capability : void 0;
39
+ activeAuthToken = lock.authToken;
37
40
  return `http://${host}:${lock.port}`;
38
41
  }
39
- /** Attach the per-session TUI capability while preserving ordinary web calls. */
42
+ /** Attach session credentials while preserving ordinary web calls. */
40
43
  function apiFetch(input, init = {}) {
41
44
  const headers = new Headers(init.headers);
42
45
  if (activeCapability) headers.set("X-Diffing-Capability", activeCapability);
46
+ if (activeAuthToken) headers.set(SESSION_TOKEN_HEADER, activeAuthToken);
43
47
  return fetch(input, {
44
48
  ...init,
45
49
  headers
46
50
  });
47
51
  }
52
+ function connectionErrorMessage(err) {
53
+ if (err instanceof Error) return err.message;
54
+ return String(err);
55
+ }
56
+ /** apiFetch wrapper that logs connection failures and returns null instead of throwing. */
57
+ async function tryApiFetch(input, init) {
58
+ try {
59
+ return await apiFetch(input, init);
60
+ } catch (err) {
61
+ console.error(`Failed to reach diffing server: ${connectionErrorMessage(err)}`);
62
+ return null;
63
+ }
64
+ }
65
+ function parseTimeoutSeconds(raw, flag = "--timeout") {
66
+ if (raw === void 0) return 570;
67
+ const t = Number(raw);
68
+ if (!Number.isFinite(t) || t <= 0) {
69
+ console.error(`${flag} must be a positive number of seconds.`);
70
+ return null;
71
+ }
72
+ return t;
73
+ }
48
74
  async function readStdin() {
49
75
  const chunks = [];
50
76
  for await (const chunk of process.stdin) chunks.push(chunk);
@@ -68,7 +94,9 @@ async function awaitReview(args) {
68
94
  },
69
95
  allowPositionals: false
70
96
  });
71
- const totalBudgetMs = (values.timeout ? Number(values.timeout) : 570) * 1e3;
97
+ const timeoutSeconds = parseTimeoutSeconds(values.timeout);
98
+ if (timeoutSeconds === null) return EXIT_USAGE;
99
+ const totalBudgetMs = timeoutSeconds * 1e3;
72
100
  const base = baseUrl();
73
101
  let agentId = typeof values["agent-id"] === "string" ? values["agent-id"] : void 0;
74
102
  try {
@@ -84,9 +112,8 @@ async function awaitReview(args) {
84
112
  if (reg.ok) agentId = (await reg.json()).agentId ?? agentId;
85
113
  } catch {}
86
114
  let sinceRound = 0;
87
- try {
88
- sinceRound = (await apiFetch(`${base}/api/review/status`).then((r) => r.json())).round ?? 0;
89
- } catch {}
115
+ const statusRes = await tryApiFetch(`${base}/api/review/status`);
116
+ if (statusRes?.ok) sinceRound = (await statusRes.json()).round ?? 0;
90
117
  const unregister = async () => {
91
118
  if (!agentId) return;
92
119
  try {
@@ -100,10 +127,15 @@ async function awaitReview(args) {
100
127
  res = await apiFetch(`${base}/api/review/await?timeoutMs=25000&sinceRound=${sinceRound}`, { signal: AbortSignal.timeout(3e4) });
101
128
  } catch (err) {
102
129
  if (err?.name === "TimeoutError") continue;
103
- console.error(`Failed to reach diffing server: ${err?.message ?? err}`);
130
+ console.error(`Failed to reach diffing server: ${connectionErrorMessage(err)}`);
104
131
  await unregister();
105
132
  return EXIT_NO_SERVER;
106
133
  }
134
+ if (!res.ok) {
135
+ console.error(`Failed to await review: HTTP ${res.status}`);
136
+ await unregister();
137
+ return 1;
138
+ }
107
139
  const result = await res.json();
108
140
  if (result.status === "released") {
109
141
  process.stdout.write(result.payload.commentXml + "\n");
@@ -139,12 +171,18 @@ async function reply(args) {
139
171
  return EXIT_USAGE;
140
172
  }
141
173
  let body = values.body;
142
- if (body === "-" || body === void 0) body = (await readStdin()).trim();
174
+ if (body === void 0) {
175
+ if (process.stdin.isTTY) {
176
+ console.error("Usage: diffing reply <commentId> --body <text> [--model <name>]");
177
+ return EXIT_USAGE;
178
+ }
179
+ body = (await readStdin()).trim();
180
+ } else if (body === "-") body = (await readStdin()).trim();
143
181
  if (!body) {
144
182
  console.error("A reply body is required (--body <text> or pipe via stdin).");
145
183
  return EXIT_USAGE;
146
184
  }
147
- const res = await apiFetch(`${baseUrl()}/api/comments/${commentId}/replies`, {
185
+ const res = await tryApiFetch(`${baseUrl()}/api/comments/${commentId}/replies`, {
148
186
  method: "POST",
149
187
  headers: { "Content-Type": "application/json" },
150
188
  body: JSON.stringify({
@@ -153,6 +191,7 @@ async function reply(args) {
153
191
  model: values.model
154
192
  })
155
193
  });
194
+ if (!res) return EXIT_NO_SERVER;
156
195
  if (res.status === 404) {
157
196
  console.error(`Comment ${commentId} not found.`);
158
197
  return EXIT_NOT_FOUND;
@@ -175,11 +214,12 @@ async function resolve$1(args) {
175
214
  console.error("Usage: diffing resolve <commentId>");
176
215
  return EXIT_USAGE;
177
216
  }
178
- const res = await apiFetch(`${baseUrl()}/api/comments/${commentId}`, {
217
+ const res = await tryApiFetch(`${baseUrl()}/api/comments/${commentId}`, {
179
218
  method: "PUT",
180
219
  headers: { "Content-Type": "application/json" },
181
220
  body: JSON.stringify({ status: "resolved" })
182
221
  });
222
+ if (!res) return EXIT_NO_SERVER;
183
223
  if (res.status === 404) {
184
224
  console.error(`Comment ${commentId} not found.`);
185
225
  return EXIT_NOT_FOUND;
@@ -202,11 +242,12 @@ async function unresolve(args) {
202
242
  console.error("Usage: diffing unresolve <commentId>");
203
243
  return EXIT_USAGE;
204
244
  }
205
- const res = await apiFetch(`${baseUrl()}/api/comments/${commentId}`, {
245
+ const res = await tryApiFetch(`${baseUrl()}/api/comments/${commentId}`, {
206
246
  method: "PUT",
207
247
  headers: { "Content-Type": "application/json" },
208
248
  body: JSON.stringify({ status: "open" })
209
249
  });
250
+ if (!res) return EXIT_NO_SERVER;
210
251
  if (res.status === 404) {
211
252
  console.error(`Comment ${commentId} not found.`);
212
253
  return EXIT_NOT_FOUND;
@@ -233,16 +274,23 @@ async function commentEdit(args) {
233
274
  return EXIT_USAGE;
234
275
  }
235
276
  let body = values.body;
236
- if (body === "-" || body === void 0) body = (await readStdin()).trim();
277
+ if (body === void 0) {
278
+ if (process.stdin.isTTY) {
279
+ console.error("Usage: diffing comment edit <commentId> --body <text>");
280
+ return EXIT_USAGE;
281
+ }
282
+ body = (await readStdin()).trim();
283
+ } else if (body === "-") body = (await readStdin()).trim();
237
284
  if (!body) {
238
285
  console.error("A body is required (--body <text> or stdin).");
239
286
  return EXIT_USAGE;
240
287
  }
241
- const res = await apiFetch(`${baseUrl()}/api/comments/${commentId}`, {
288
+ const res = await tryApiFetch(`${baseUrl()}/api/comments/${commentId}`, {
242
289
  method: "PUT",
243
290
  headers: { "Content-Type": "application/json" },
244
291
  body: JSON.stringify({ body })
245
292
  });
293
+ if (!res) return EXIT_NO_SERVER;
246
294
  if (res.status === 404) {
247
295
  console.error(`Comment ${commentId} not found.`);
248
296
  return EXIT_NOT_FOUND;
@@ -265,7 +313,8 @@ async function commentDelete(args) {
265
313
  console.error("Usage: diffing comment delete <commentId>");
266
314
  return EXIT_USAGE;
267
315
  }
268
- const res = await apiFetch(`${baseUrl()}/api/comments/${commentId}`, { method: "DELETE" });
316
+ const res = await tryApiFetch(`${baseUrl()}/api/comments/${commentId}`, { method: "DELETE" });
317
+ if (!res) return EXIT_NO_SERVER;
269
318
  if (res.status === 404) {
270
319
  console.error(`Comment ${commentId} not found.`);
271
320
  return EXIT_NOT_FOUND;
@@ -289,7 +338,13 @@ async function commentCmd(args) {
289
338
  }
290
339
  }
291
340
  async function url() {
292
- process.stdout.write(baseUrl() + "\n");
341
+ const lock = resolveActiveServerLock();
342
+ if (!lock) {
343
+ console.error("No diffing server running for this repo. Start one with `diffing`.");
344
+ process.exit(EXIT_NO_SERVER);
345
+ }
346
+ const printed = reviewSessionUrl(lock) ?? baseUrl();
347
+ process.stdout.write(`${printed}\n`);
293
348
  return EXIT_OK;
294
349
  }
295
350
  async function comments(args) {
@@ -302,12 +357,22 @@ async function comments(args) {
302
357
  },
303
358
  allowPositionals: false
304
359
  });
305
- const all = await apiFetch(`${baseUrl()}/api/comments`).then((r) => r.json());
360
+ const res = await tryApiFetch(`${baseUrl()}/api/comments`);
361
+ if (!res) return EXIT_NO_SERVER;
362
+ if (!res.ok) {
363
+ console.error(`Failed to fetch comments: HTTP ${res.status}`);
364
+ return 1;
365
+ }
366
+ const all = await res.json();
306
367
  const selected = values.open ? all.filter((c) => c.status === "open") : all;
307
368
  const format = values.format?.toLowerCase();
369
+ if (format && format !== "xml" && format !== "json" && format !== "md" && format !== "markdown") {
370
+ console.error("Unknown --format. Use xml, json, md, or markdown.");
371
+ return EXIT_USAGE;
372
+ }
308
373
  if (values.json || format === "json") process.stdout.write(JSON.stringify(selected, null, 2) + "\n");
309
374
  else if (format === "markdown" || format === "md") {
310
- const { formatCommentsMarkdown } = await import("./review-export-B63eRAVa.mjs");
375
+ const { formatCommentsMarkdown } = await import("./review-export-GW4KNsGN.mjs");
311
376
  process.stdout.write(formatCommentsMarkdown(selected) + "\n");
312
377
  } else process.stdout.write(formatComments(selected) + "\n");
313
378
  return EXIT_OK;
@@ -333,7 +398,7 @@ function mode(args) {
333
398
  console.error(`Failed to save default mode: ${detail}`);
334
399
  return 1;
335
400
  }
336
- process.stdout.write(`Default mode set to ${requested}.\n`);
401
+ process.stdout.write(`Default mode set to ${formatModeLabel(requested)}.\n`);
337
402
  return EXIT_OK;
338
403
  }
339
404
  /** Derive a human title from a plan's first heading or non-empty line. */
@@ -349,9 +414,10 @@ function deriveTitle(body) {
349
414
  /** Long-poll the plan-review handoff until a decision arrives or time runs out. */
350
415
  async function pollPlanDecision(base, totalBudgetMs, seedSince) {
351
416
  let sinceRound = seedSince ?? 0;
352
- if (seedSince === void 0) try {
353
- sinceRound = (await apiFetch(`${base}/api/plan-review/status`).then((r) => r.json())).round ?? 0;
354
- } catch {}
417
+ if (seedSince === void 0) {
418
+ const statusRes = await tryApiFetch(`${base}/api/plan-review/status`);
419
+ if (statusRes?.ok) sinceRound = (await statusRes.json()).round ?? 0;
420
+ }
355
421
  const deadline = Date.now() + totalBudgetMs;
356
422
  while (Date.now() < deadline) {
357
423
  let res;
@@ -359,9 +425,13 @@ async function pollPlanDecision(base, totalBudgetMs, seedSince) {
359
425
  res = await apiFetch(`${base}/api/plan-review/await?timeoutMs=25000&sinceRound=${sinceRound}`, { signal: AbortSignal.timeout(3e4) });
360
426
  } catch (err) {
361
427
  if (err?.name === "TimeoutError") continue;
362
- console.error(`Failed to reach diffing server: ${err?.message ?? err}`);
428
+ console.error(`Failed to reach diffing server: ${connectionErrorMessage(err)}`);
363
429
  return EXIT_NO_SERVER;
364
430
  }
431
+ if (!res.ok) {
432
+ console.error(`Failed to await plan review: HTTP ${res.status}`);
433
+ return 1;
434
+ }
365
435
  const result = await res.json();
366
436
  if (result.status === "released") {
367
437
  process.stdout.write(result.payload.reviewXml + "\n");
@@ -397,10 +467,11 @@ async function planSubmit(args) {
397
467
  type: "string",
398
468
  short: "t"
399
469
  },
400
- saveSource: {
470
+ "save-source": {
401
471
  type: "boolean",
402
472
  short: "S"
403
- }
473
+ },
474
+ saveSource: { type: "boolean" }
404
475
  },
405
476
  allowPositionals: true
406
477
  });
@@ -428,10 +499,11 @@ async function planSubmit(args) {
428
499
  source = file;
429
500
  }
430
501
  let sinceRound = 0;
431
- if (values.wait) try {
432
- sinceRound = (await apiFetch(`${base}/api/plan-review/status`).then((r) => r.json())).round ?? 0;
433
- } catch {}
434
- const res = await apiFetch(`${base}/api/plans`, {
502
+ if (values.wait) {
503
+ const statusRes = await tryApiFetch(`${base}/api/plan-review/status`);
504
+ if (statusRes?.ok) sinceRound = (await statusRes.json()).round ?? 0;
505
+ }
506
+ const submitRes = await tryApiFetch(`${base}/api/plans`, {
435
507
  method: "POST",
436
508
  headers: { "Content-Type": "application/json" },
437
509
  body: JSON.stringify({
@@ -442,15 +514,16 @@ async function planSubmit(args) {
442
514
  model: values.model
443
515
  })
444
516
  });
445
- if (!res.ok) {
446
- console.error(`Failed to submit plan: HTTP ${res.status}`);
517
+ if (!submitRes) return EXIT_NO_SERVER;
518
+ if (!submitRes.ok) {
519
+ console.error(`Failed to submit plan: HTTP ${submitRes.status}`);
447
520
  return 1;
448
521
  }
449
- const plan = await res.json();
450
- console.error(`Submitted plan ${plan.id} (v${plan.version}) — review at ${base}/plan/${plan.id}`);
522
+ const plan = await submitRes.json();
523
+ console.error(`Submitted plan ${plan.id} (v${plan.version}) — review at ${appendSessionToken(`${base}/plan/${plan.id}`, activeAuthToken)}`);
451
524
  if (plan.sourcePath) console.error(`Source path: ${plan.sourcePath}`);
452
525
  if (!values.wait) console.error(CLI_PLAN_SUBMIT_PARK_HINT);
453
- if (values.saveSource) try {
526
+ if (Boolean(values["save-source"] || values.saveSource)) try {
454
527
  const sourcesDir = join(getProjectStorageDir(), "plan-sources");
455
528
  await mkdir(sourcesDir, { recursive: true });
456
529
  const sourcePath = join(sourcesDir, `${plan.id}.md`);
@@ -463,7 +536,9 @@ async function planSubmit(args) {
463
536
  process.stdout.write(plan.id + "\n");
464
537
  return EXIT_OK;
465
538
  }
466
- return pollPlanDecision(base, (values.timeout ? Number(values.timeout) : 570) * 1e3, sinceRound);
539
+ const timeoutSeconds = parseTimeoutSeconds(values.timeout);
540
+ if (timeoutSeconds === null) return EXIT_USAGE;
541
+ return pollPlanDecision(base, timeoutSeconds * 1e3, sinceRound);
467
542
  }
468
543
  async function planAwait(args) {
469
544
  const { values } = parseArgs({
@@ -474,8 +549,9 @@ async function planAwait(args) {
474
549
  } },
475
550
  allowPositionals: false
476
551
  });
477
- const totalBudgetMs = (values.timeout ? Number(values.timeout) : 570) * 1e3;
478
- return pollPlanDecision(baseUrl(), totalBudgetMs);
552
+ const timeoutSeconds = parseTimeoutSeconds(values.timeout);
553
+ if (timeoutSeconds === null) return EXIT_USAGE;
554
+ return pollPlanDecision(baseUrl(), timeoutSeconds * 1e3);
479
555
  }
480
556
  async function planList(args) {
481
557
  const { values } = parseArgs({
@@ -483,7 +559,13 @@ async function planList(args) {
483
559
  options: { json: { type: "boolean" } },
484
560
  allowPositionals: false
485
561
  });
486
- const all = await apiFetch(`${baseUrl()}/api/plans`).then((r) => r.json());
562
+ const res = await tryApiFetch(`${baseUrl()}/api/plans`);
563
+ if (!res) return EXIT_NO_SERVER;
564
+ if (!res.ok) {
565
+ console.error(`Failed to list plans: HTTP ${res.status}`);
566
+ return 1;
567
+ }
568
+ const all = await res.json();
487
569
  if (values.json) {
488
570
  process.stdout.write(JSON.stringify(all, null, 2) + "\n");
489
571
  return EXIT_OK;
@@ -510,18 +592,29 @@ async function planShow(args) {
510
592
  const base = baseUrl();
511
593
  let planId = positionals[0];
512
594
  if (!planId) {
513
- const all = await apiFetch(`${base}/api/plans`).then((r) => r.json());
595
+ const listRes = await tryApiFetch(`${base}/api/plans`);
596
+ if (!listRes) return EXIT_NO_SERVER;
597
+ if (!listRes.ok) {
598
+ console.error(`Failed to list plans: HTTP ${listRes.status}`);
599
+ return 1;
600
+ }
601
+ const all = await listRes.json();
514
602
  if (all.length === 0) {
515
603
  console.error("No plans submitted yet.");
516
604
  return EXIT_NOT_FOUND;
517
605
  }
518
606
  planId = all[all.length - 1].id;
519
607
  }
520
- const res = await apiFetch(`${base}/api/plans/${planId}`);
608
+ const res = await tryApiFetch(`${base}/api/plans/${planId}`);
609
+ if (!res) return EXIT_NO_SERVER;
521
610
  if (res.status === 404) {
522
611
  console.error(`Plan ${planId} not found.`);
523
612
  return EXIT_NOT_FOUND;
524
613
  }
614
+ if (!res.ok) {
615
+ console.error(`Failed to load plan: HTTP ${res.status}`);
616
+ return 1;
617
+ }
525
618
  const plan = await res.json();
526
619
  const requestedVersion = values.version !== void 0 ? Number(values.version) : void 0;
527
620
  if (requestedVersion !== void 0 && (!Number.isFinite(requestedVersion) || requestedVersion < 1)) {
@@ -550,11 +643,16 @@ async function planVersions(args) {
550
643
  console.error("Usage: diffing plan versions <id> [--json]");
551
644
  return EXIT_USAGE;
552
645
  }
553
- const planRes = await apiFetch(`${base}/api/plans/${planId}`);
646
+ const planRes = await tryApiFetch(`${base}/api/plans/${planId}`);
647
+ if (!planRes) return EXIT_NO_SERVER;
554
648
  if (planRes.status === 404) {
555
649
  console.error(`Plan ${planId} not found.`);
556
650
  return EXIT_NOT_FOUND;
557
651
  }
652
+ if (!planRes.ok) {
653
+ console.error(`Failed to load plan: HTTP ${planRes.status}`);
654
+ return 1;
655
+ }
558
656
  const plan = await planRes.json();
559
657
  const versions = plan.versions ?? [];
560
658
  if (values.json) {
@@ -574,7 +672,9 @@ async function planVersions(args) {
574
672
  }
575
673
  /** Locate which plan owns a given comment id (comment ids are globally unique). */
576
674
  async function findCommentPlan(base, commentId) {
577
- return (await apiFetch(`${base}/api/plans`).then((r) => r.json())).find((p) => (p.comments ?? []).some((c) => c.id === commentId)) ?? null;
675
+ const res = await tryApiFetch(`${base}/api/plans`);
676
+ if (!res?.ok) return null;
677
+ return (await res.json()).find((p) => (p.comments ?? []).some((c) => c.id === commentId)) ?? null;
578
678
  }
579
679
  async function planReply(args) {
580
680
  const { values, positionals } = parseArgs({
@@ -597,7 +697,13 @@ async function planReply(args) {
597
697
  return EXIT_USAGE;
598
698
  }
599
699
  let body = values.body;
600
- if (body === "-" || body === void 0) body = (await readStdin()).trim();
700
+ if (body === void 0) {
701
+ if (process.stdin.isTTY) {
702
+ console.error("Usage: diffing plan reply <commentId> --body <text> [--model <name>]");
703
+ return EXIT_USAGE;
704
+ }
705
+ body = (await readStdin()).trim();
706
+ } else if (body === "-") body = (await readStdin()).trim();
601
707
  if (!body) {
602
708
  console.error("A reply body is required (--body <text> or pipe via stdin).");
603
709
  return EXIT_USAGE;
@@ -608,7 +714,7 @@ async function planReply(args) {
608
714
  console.error(`Plan comment ${commentId} not found.`);
609
715
  return EXIT_NOT_FOUND;
610
716
  }
611
- const res = await apiFetch(`${base}/api/plans/${plan.id}/comments/${commentId}/replies`, {
717
+ const res = await tryApiFetch(`${base}/api/plans/${plan.id}/comments/${commentId}/replies`, {
612
718
  method: "POST",
613
719
  headers: { "Content-Type": "application/json" },
614
720
  body: JSON.stringify({
@@ -617,6 +723,7 @@ async function planReply(args) {
617
723
  model: values.model
618
724
  })
619
725
  });
726
+ if (!res) return EXIT_NO_SERVER;
620
727
  if (!res.ok) {
621
728
  console.error(`Failed to reply: HTTP ${res.status}`);
622
729
  return 1;
@@ -641,11 +748,12 @@ async function planResolve(args) {
641
748
  console.error(`Plan comment ${commentId} not found.`);
642
749
  return EXIT_NOT_FOUND;
643
750
  }
644
- const res = await apiFetch(`${base}/api/plans/${plan.id}/comments/${commentId}`, {
751
+ const res = await tryApiFetch(`${base}/api/plans/${plan.id}/comments/${commentId}`, {
645
752
  method: "PUT",
646
753
  headers: { "Content-Type": "application/json" },
647
754
  body: JSON.stringify({ status: "resolved" })
648
755
  });
756
+ if (!res) return EXIT_NO_SERVER;
649
757
  if (!res.ok) {
650
758
  console.error(`Failed to resolve: HTTP ${res.status}`);
651
759
  return 1;
@@ -669,8 +777,70 @@ async function plan(args) {
669
777
  return EXIT_USAGE;
670
778
  }
671
779
  }
780
+ async function setup(args) {
781
+ if (args.includes("--help") || args.includes("-h")) {
782
+ console.log(`Usage: diffing setup [skills|mcp] [options]
783
+
784
+ Interactive first-time setup: doctor, default mode, completions, agent skills, MCP.
785
+
786
+ Options:
787
+ -y, --yes Non-interactive defaults (install skills; print MCP JSON)
788
+ --check Preflight checks only
789
+ --reset Clear setupCompletedAt marker
790
+ --write-mcp Merge diffing into global IDE MCP configs
791
+ --write-project-mcp Write .cursor/mcp.json in the current directory
792
+ --write-completions Print shell completion scripts
793
+ -h, --help Show this help
794
+
795
+ Aliases: diffing init, diffing onboard
796
+
797
+ See docs/getting-started.md for the full walkthrough.`);
798
+ return EXIT_OK;
799
+ }
800
+ let yes = false;
801
+ let check = false;
802
+ let reset = false;
803
+ let writeMcp = false;
804
+ let writeProjectMcp = false;
805
+ let writeCompletions = false;
806
+ const positionals = [];
807
+ for (let i = 0; i < args.length; i += 1) {
808
+ const arg = args[i];
809
+ if (arg === "-y" || arg === "--yes") yes = true;
810
+ else if (arg === "--check") check = true;
811
+ else if (arg === "--reset") reset = true;
812
+ else if (arg === "--write-mcp") writeMcp = true;
813
+ else if (arg === "--write-project-mcp") writeProjectMcp = true;
814
+ else if (arg === "--write-completions") writeCompletions = true;
815
+ else if (arg.startsWith("-")) {
816
+ console.error(`diffing setup: unknown option ${arg}`);
817
+ return EXIT_USAGE;
818
+ } else positionals.push(arg);
819
+ }
820
+ const action = positionals[0];
821
+ if (positionals.length > 1) {
822
+ console.error("Usage: diffing setup [skills|mcp] [options]");
823
+ return EXIT_USAGE;
824
+ }
825
+ if (action && action !== "skills" && action !== "mcp") {
826
+ console.error(`Unknown setup action: ${action}`);
827
+ return EXIT_USAGE;
828
+ }
829
+ const { runSetup } = await import("./setup-BiwX7vdd.mjs");
830
+ return runSetup({
831
+ yes,
832
+ check,
833
+ reset,
834
+ writeMcp,
835
+ writeProjectMcp,
836
+ writeCompletions,
837
+ skillsOnly: action === "skills",
838
+ mcpOnly: action === "mcp",
839
+ cliImportMetaUrl: import.meta.url
840
+ });
841
+ }
672
842
  async function doctor() {
673
- const { runDoctor, formatDoctorReport } = await import("./doctor-D0Y3kOY7.mjs");
843
+ const { runDoctor, formatDoctorReport } = await import("./doctor-BRr5IWHe.mjs");
674
844
  const report = await runDoctor({
675
845
  cwd: process.cwd(),
676
846
  cliImportMetaUrl: import.meta.url
@@ -679,16 +849,20 @@ async function doctor() {
679
849
  return report.ok ? EXIT_OK : 1;
680
850
  }
681
851
  async function completion(args) {
682
- const shell = args[0];
683
- if (!shell || args.includes("--help") || args.includes("-h")) {
852
+ if (args.includes("--help") || args.includes("-h")) {
684
853
  console.error("Usage: diffing completion <bash|zsh|fish>");
685
854
  console.error(" # Install examples:");
686
855
  console.error(" # diffing completion bash >> ~/.bashrc");
687
856
  console.error(" # diffing completion zsh > ~/.zfunc/_diffing");
688
857
  console.error(" # diffing completion fish > ~/.config/fish/completions/diffing.fish");
858
+ return EXIT_OK;
859
+ }
860
+ const shell = args[0];
861
+ if (!shell) {
862
+ console.error("Usage: diffing completion <bash|zsh|fish>");
689
863
  return EXIT_USAGE;
690
864
  }
691
- const { completionFor } = await import("./completions-BO2DUM-8.mjs");
865
+ const { completionFor } = await import("./completions-5rtfoxB9.mjs");
692
866
  const script = completionFor(shell);
693
867
  if (!script) {
694
868
  console.error(`Unknown shell: ${shell}. Use bash, zsh, or fish.`);
@@ -788,11 +962,12 @@ Add --pretty for indented JSON. Compact JSON is the token-efficient default.`);
788
962
  return EXIT_USAGE;
789
963
  }
790
964
  const base = baseUrl();
965
+ const queryString = params.toString();
791
966
  let response;
792
967
  try {
793
- response = await apiFetch(`${base}${endpoint}${params.size ? `?${params}` : ""}`);
968
+ response = await apiFetch(`${base}${endpoint}${queryString ? `?${queryString}` : ""}`);
794
969
  } catch (error) {
795
- console.error(`Failed to reach diffing server: ${error?.message ?? error}`);
970
+ console.error(`Failed to reach diffing server: ${connectionErrorMessage(error)}`);
796
971
  return EXIT_NO_SERVER;
797
972
  }
798
973
  const body = await response.json().catch(() => ({ error: response.statusText }));
@@ -804,7 +979,7 @@ Add --pretty for indented JSON. Compact JSON is the token-efficient default.`);
804
979
  return EXIT_OK;
805
980
  }
806
981
  async function progress(args) {
807
- const { values } = parseArgs({
982
+ const { values, positionals } = parseArgs({
808
983
  args,
809
984
  options: {
810
985
  message: {
@@ -818,12 +993,12 @@ async function progress(args) {
818
993
  },
819
994
  allowPositionals: true
820
995
  });
821
- const message = values.message || (args.find((a) => !a.startsWith("-")) ?? "");
996
+ const message = values.message || positionals[0] || "";
822
997
  if (!message) {
823
998
  console.error("Usage: diffing progress --message \"Working on comment…\" [--model M] [--pct N]");
824
999
  return EXIT_USAGE;
825
1000
  }
826
- const res = await apiFetch(`${baseUrl()}/api/agent/progress`, {
1001
+ const res = await tryApiFetch(`${baseUrl()}/api/agent/progress`, {
827
1002
  method: "POST",
828
1003
  headers: { "Content-Type": "application/json" },
829
1004
  body: JSON.stringify({
@@ -834,6 +1009,7 @@ async function progress(args) {
834
1009
  pct: values.pct != null ? Number(values.pct) : void 0
835
1010
  })
836
1011
  });
1012
+ if (!res) return EXIT_NO_SERVER;
837
1013
  if (!res.ok) {
838
1014
  const err = await res.json().catch(() => ({}));
839
1015
  console.error(err.error ?? res.statusText);
@@ -852,18 +1028,19 @@ async function runSubcommand(name, args) {
852
1028
  case "url": return url();
853
1029
  case "plan": return plan(args);
854
1030
  case "update":
855
- const { runUpdateCommand } = await import("./update-check-Copcz9eb.mjs");
1031
+ const { runUpdateCommand } = await import("./update-check-ISaw61qS.mjs");
856
1032
  return runUpdateCommand();
857
1033
  case "gh":
858
- const { runGhSubcommand } = await import("./cli-gh-D0NfKpOp.mjs");
1034
+ const { runGhSubcommand } = await import("./cli-gh-BQuQpV-s.mjs");
859
1035
  return runGhSubcommand(args);
860
1036
  case "doctor": return doctor();
1037
+ case "setup": return setup(args);
861
1038
  case "completion": return completion(args);
862
1039
  case "progress": return progress(args);
863
1040
  case "inspect": return inspect(args);
864
1041
  case "mode": return mode(args);
865
1042
  case "sessions":
866
- const { runSessionsCommand } = await import("./session-manager-CYNchhVA.mjs");
1043
+ const { runSessionsCommand } = await import("./session-manager-656aJXFE.mjs");
867
1044
  return runSessionsCommand(args);
868
1045
  default:
869
1046
  console.error(`Unknown subcommand: ${name}`);