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.
- package/README.md +56 -801
- package/dist/{cli-agent-DkwGxuy2.mjs → cli-agent-Cx2k0Ki7.mjs} +236 -59
- package/dist/{cli-gh-D0NfKpOp.mjs → cli-gh-BQuQpV-s.mjs} +24 -14
- package/dist/cli.mjs +69 -26
- package/dist/client/assets/{angular-html-Dl53kkiy.js → angular-html-gcUdctE_.js} +1 -1
- package/dist/client/assets/{angular-ts-wNJFFkey.js → angular-ts-BkjLgJJH.js} +1 -1
- package/dist/client/assets/{apl-BxtQST-h.js → apl-BtuEza96.js} +1 -1
- package/dist/client/assets/{arc-CBmZuzPB.js → arc-yk_3cjs2.js} +1 -1
- package/dist/client/assets/{architectureDiagram-3BPJPVTR-CEci_K9f.js → architectureDiagram-3BPJPVTR-DDVXPdzY.js} +1 -1
- package/dist/client/assets/{astro-BpADD5rh.js → astro-DfUNgEjV.js} +1 -1
- package/dist/client/assets/{blade-B4I5SQmP.js → blade-uv3PNTww.js} +1 -1
- package/dist/client/assets/{blockDiagram-GPEHLZMM-DcKhDtnE.js → blockDiagram-GPEHLZMM-DlMLqbfD.js} +1 -1
- package/dist/client/assets/{c-C3VtOgg8.js → c-DcsMh0kd.js} +1 -1
- package/dist/client/assets/{c4Diagram-AAUBKEIU-CaHozoxF.js → c4Diagram-AAUBKEIU-C4ZZJAMJ.js} +1 -1
- package/dist/client/assets/channel-CPOnEOhs.js +1 -0
- package/dist/client/assets/{chunk-2J33WTMH-tvuzKhdK.js → chunk-2J33WTMH-CwkSvLT8.js} +1 -1
- package/dist/client/assets/{chunk-3OPIFGDE-D_nBoD9w.js → chunk-3OPIFGDE-s6UH12Df.js} +1 -1
- package/dist/client/assets/{chunk-4BX2VUAB-yHPdy1G8.js → chunk-4BX2VUAB-wGjYymx_.js} +1 -1
- package/dist/client/assets/{chunk-55IACEB6-yXpL8wjV.js → chunk-55IACEB6-DObbP11Q.js} +1 -1
- package/dist/client/assets/{chunk-5ZQYHXKU-DZ5cvCDV.js → chunk-5ZQYHXKU-DwbkzQEJ.js} +1 -1
- package/dist/client/assets/{chunk-727SXJPM-CJjgOWmY.js → chunk-727SXJPM-DzoJfly4.js} +1 -1
- package/dist/client/assets/{chunk-AQP2D5EJ-CQYQKXSE.js → chunk-AQP2D5EJ-f1kNxYS3.js} +1 -1
- package/dist/client/assets/{chunk-BSJP7CBP-CP_f908b.js → chunk-BSJP7CBP-CTBkVJEp.js} +1 -1
- package/dist/client/assets/{chunk-CSCIHK7Q-tcgA8jR0.js → chunk-CSCIHK7Q-C6dvEyPX.js} +1 -1
- package/dist/client/assets/{chunk-FMBD7UC4-DlpmhBYg.js → chunk-FMBD7UC4-C166WZ7L.js} +1 -1
- package/dist/client/assets/{chunk-KSCS5N6A-BkfieXpV.js → chunk-KSCS5N6A-CaVyQHxA.js} +1 -1
- package/dist/client/assets/{chunk-L5ZTLDWV-BjVXSZnt.js → chunk-L5ZTLDWV-CdW7usF5.js} +1 -1
- package/dist/client/assets/{chunk-LZXEDZCA-CaAWmy4Q.js → chunk-LZXEDZCA-imRCFVGq.js} +2 -2
- package/dist/client/assets/{chunk-ND2GUHAM-kWh41zUn.js → chunk-ND2GUHAM-BJCVPOgO.js} +1 -1
- package/dist/client/assets/{chunk-NZK2D7GU-CDrIi44_.js → chunk-NZK2D7GU-DodLkks9.js} +1 -1
- package/dist/client/assets/{chunk-O5CBEL6O-CbNGK3Te.js → chunk-O5CBEL6O-DYxYE_dt.js} +1 -1
- package/dist/client/assets/chunk-QZHKN3VN-7sNTyEOs.js +1 -0
- package/dist/client/assets/chunk-WU5MYG2G-DluN2oZF.js +1 -0
- package/dist/client/assets/{chunk-XPW4576I-Cca0fTtG.js → chunk-XPW4576I-DkPXlA-y.js} +1 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-CHofrzZI.js +1 -0
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-B8fKe5FS.js +1 -0
- package/dist/client/assets/{cobol-j-6eG2UQ.js → cobol-B5tSUxVN.js} +1 -1
- package/dist/client/assets/{coffee-CZLH0dtt.js → coffee-B2Q8w4Zu.js} +1 -1
- package/dist/client/assets/{cose-bilkent-S5V4N54A-DlxESVex.js → cose-bilkent-S5V4N54A-Bg2tspSU.js} +1 -1
- package/dist/client/assets/{cpp-j6Bp24RI.js → cpp-CfzAEc1z.js} +1 -1
- package/dist/client/assets/{crystal-DW7wcFUs.js → crystal-BDxAjW7-.js} +1 -1
- package/dist/client/assets/{css-C43BDU2i.js → css-nC3_RAjk.js} +1 -1
- package/dist/client/assets/{dagre-BM42HDAG-BaemEJFh.js → dagre-BM42HDAG-BZiNHe27.js} +1 -1
- package/dist/client/assets/{diagram-2AECGRRQ-BaM-bkJ3.js → diagram-2AECGRRQ-D3Vd2itQ.js} +1 -1
- package/dist/client/assets/{diagram-5GNKFQAL-BOH04DJO.js → diagram-5GNKFQAL-D44Rm6ep.js} +1 -1
- package/dist/client/assets/{diagram-KO2AKTUF-BP5MyqDZ.js → diagram-KO2AKTUF-DwoQejb5.js} +1 -1
- package/dist/client/assets/{diagram-LMA3HP47-Dt4gKMYF.js → diagram-LMA3HP47-C1eaDL4X.js} +1 -1
- package/dist/client/assets/{diagram-OG6HWLK6-DoT1VshN.js → diagram-OG6HWLK6-BtBJHHnj.js} +1 -1
- package/dist/client/assets/{dist-DEAxvC4F.js → dist-DUBmiUQf.js} +1 -1
- package/dist/client/assets/{edge-D9ySFlnD.js → edge-WCfPDabs.js} +1 -1
- package/dist/client/assets/{elixir-CoJz_LQ5.js → elixir-CazmTZo9.js} +1 -1
- package/dist/client/assets/{elm-CvedWh_e.js → elm-CTqaOirp.js} +1 -1
- package/dist/client/assets/{erDiagram-TEJ5UH35-CMP78FsQ.js → erDiagram-TEJ5UH35-CqjpbNDt.js} +1 -1
- package/dist/client/assets/{erb-lD_yYZsm.js → erb-CK9x36t2.js} +1 -1
- package/dist/client/assets/{flowDiagram-I6XJVG4X-Dp0s5BFj.js → flowDiagram-I6XJVG4X-CSHJZmlA.js} +1 -1
- package/dist/client/assets/{ganttDiagram-6RSMTGT7-GmSG31U-.js → ganttDiagram-6RSMTGT7-D6KxkDpI.js} +1 -1
- package/dist/client/assets/{git-rebase-DwZABzof.js → git-rebase-Bn8xQDxV.js} +1 -1
- package/dist/client/assets/{gitGraphDiagram-PVQCEYII-C1SXShag.js → gitGraphDiagram-PVQCEYII-ZGSlrHF5.js} +1 -1
- package/dist/client/assets/{glimmer-js-CWcs3w1Z.js → glimmer-js-h7wFfOLo.js} +1 -1
- package/dist/client/assets/{glimmer-ts-CrzGN4lJ.js → glimmer-ts-vlZuiamP.js} +1 -1
- package/dist/client/assets/{glsl-DRCtwX7h.js → glsl-CNutENPV.js} +1 -1
- package/dist/client/assets/{graphql-rpmrismS.js → graphql-BfddKr9j.js} +1 -1
- package/dist/client/assets/{hack-Ba02RnuQ.js → hack-BkYH75Gx.js} +1 -1
- package/dist/client/assets/{haml-BHBACStm.js → haml-CM-xW5RI.js} +1 -1
- package/dist/client/assets/{handlebars-BtlQ1SCa.js → handlebars-CklcCbzf.js} +1 -1
- package/dist/client/assets/{html-BkVU3Dge.js → html-bltTcC3c.js} +1 -1
- package/dist/client/assets/{html-derivative-DoK92vwi.js → html-derivative-C4R1a7Nf.js} +1 -1
- package/dist/client/assets/{http-CJAwKSPH.js → http-B6uXoDkp.js} +1 -1
- package/dist/client/assets/{hurl-kaX5jwuN.js → hurl-gquKVFPU.js} +1 -1
- package/dist/client/assets/{index-D8hOoJCg.css → index-BsuX6HVI.css} +1 -1
- package/dist/client/assets/{index-BHeNiC07.js → index-yhKiqbkK.js} +154 -154
- package/dist/client/assets/{infoDiagram-5YYISTIA-B0i3BlNR.js → infoDiagram-5YYISTIA-DCQv5BKv.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-BN8sEei4.js → ishikawaDiagram-YF4QCWOH-BqXC35qz.js} +1 -1
- package/dist/client/assets/{java-BvrigIoq.js → java-DZLUJ7qo.js} +1 -1
- package/dist/client/assets/{javascript-DZkPTYAi.js → javascript-CayXc7uP.js} +1 -1
- package/dist/client/assets/{jinja-Ceg7ui1S.js → jinja-CQQUTC0y.js} +1 -1
- package/dist/client/assets/{jison-iE1GaOyN.js → jison-CvzuCn2x.js} +1 -1
- package/dist/client/assets/{journeyDiagram-JHISSGLW-CE6O3NhU.js → journeyDiagram-JHISSGLW-bRlSO5Sv.js} +1 -1
- package/dist/client/assets/{json-C0j8rEcg.js → json-BsMA0GaP.js} +1 -1
- package/dist/client/assets/{jsx-B7eXljgz.js → jsx-Dbxr4aPH.js} +1 -1
- package/dist/client/assets/{julia-DMDw0aMP.js → julia-CZ38GzHV.js} +1 -1
- package/dist/client/assets/{just-BryMKRJ_.js → just-BQwFLV1D.js} +1 -1
- package/dist/client/assets/{kanban-definition-UN3LZRKU-j-aU6Yzp.js → kanban-definition-UN3LZRKU-BVjoqA0y.js} +1 -1
- package/dist/client/assets/{latex-BNC9-sjr.js → latex-BGyrMdgQ.js} +1 -1
- package/dist/client/assets/{line-CyEqpEDp.js → line-DacHFvZH.js} +1 -1
- package/dist/client/assets/{linear-CXeaA9km.js → linear-BPGHNTSb.js} +1 -1
- package/dist/client/assets/{liquid-D-fQw-oJ.js → liquid-CiA2vjOH.js} +1 -1
- package/dist/client/assets/{lua-CD2aJ_rS.js → lua-D9k3fxwM.js} +1 -1
- package/dist/client/assets/{marko-BQ37hu6z.js → marko-CwBH4-2T.js} +1 -1
- package/dist/client/assets/{mdc-B5NUi3zZ.js → mdc-D4WuuVvw.js} +1 -1
- package/dist/client/assets/{mermaid-parser.core-BxHF_XbX.js → mermaid-parser.core-DuXqm2Gp.js} +1 -1
- package/dist/client/assets/{mermaid.core-BUtaf4P1.js → mermaid.core-DRh_KVT1.js} +3 -3
- package/dist/client/assets/{mindmap-definition-RKZ34NQL-D13tPu2o.js → mindmap-definition-RKZ34NQL-C5wytjbD.js} +1 -1
- package/dist/client/assets/{nginx-1W1E03Rg.js → nginx-DHMa03ia.js} +1 -1
- package/dist/client/assets/{nim-C5A88bFP.js → nim-8gK3mQXD.js} +1 -1
- package/dist/client/assets/{perl-BYoP0wNt.js → perl-DqXBmOB_.js} +1 -1
- package/dist/client/assets/{php-CFxna09e.js → php-CruAnpl2.js} +1 -1
- package/dist/client/assets/{pieDiagram-4H26LBE5-CHL7Ml5w.js → pieDiagram-4H26LBE5-Cv2Csp1M.js} +1 -1
- package/dist/client/assets/{pug-BR4JgWAk.js → pug-C7a5y4Mi.js} +1 -1
- package/dist/client/assets/{qml-D1U1EFEe.js → qml-mgWY__NW.js} +1 -1
- package/dist/client/assets/{quadrantDiagram-W4KKPZXB-BnYtv-HY.js → quadrantDiagram-W4KKPZXB-DHQIHzFU.js} +1 -1
- package/dist/client/assets/{r-ChE6X060.js → r-Do5QoKdS.js} +1 -1
- package/dist/client/assets/{razor-B5iVfQMe.js → razor-BqdDbm9d.js} +1 -1
- package/dist/client/assets/{regexp-Dz2drUIf.js → regexp-CNMlPqVr.js} +1 -1
- package/dist/client/assets/{requirementDiagram-4Y6WPE33-D8QEGLKB.js → requirementDiagram-4Y6WPE33-rUeJykKo.js} +1 -1
- package/dist/client/assets/{review-export-CvFFbCAB.js → review-export-BgwyN8Ky.js} +1 -1
- package/dist/client/assets/{rst-DZM3RGRs.js → rst-PYCtADQ2.js} +1 -1
- package/dist/client/assets/{ruby-DkXnm-J8.js → ruby-B8JdoeHE.js} +1 -1
- package/dist/client/assets/{sankeyDiagram-5OEKKPKP-wVaks6lB.js → sankeyDiagram-5OEKKPKP-Bsga6dQU.js} +1 -1
- package/dist/client/assets/{sas-DMbpc71c.js → sas-kIev4j3d.js} +1 -1
- package/dist/client/assets/{scss-IwVMMp22.js → scss-cf-rl7q3.js} +1 -1
- package/dist/client/assets/{sequenceDiagram-3UESZ5HK-Cg31TB-R.js → sequenceDiagram-3UESZ5HK-BVcwcOB2.js} +1 -1
- package/dist/client/assets/{shellscript-CIStAKx3.js → shellscript-BHMFbkaV.js} +1 -1
- package/dist/client/assets/{shellsession-uLtzHhlo.js → shellsession-y_3kBnoK.js} +1 -1
- package/dist/client/assets/{soy-BkxBYigm.js → soy-Coc7dfRW.js} +1 -1
- package/dist/client/assets/{sql-Ba9y9EvJ.js → sql-CsZYO19m.js} +1 -1
- package/dist/client/assets/{src-9MKexpFu.js → src-ujohT29p.js} +1 -1
- package/dist/client/assets/{stata-CrPCbiIZ.js → stata-BFa4m_Eh.js} +1 -1
- package/dist/client/assets/{stateDiagram-AJRCARHV-BbvNjVF6.js → stateDiagram-AJRCARHV-DBElJIPe.js} +1 -1
- package/dist/client/assets/stateDiagram-v2-BHNVJYJU-BocZ498b.js +1 -0
- package/dist/client/assets/{surrealql-Dvip5u_o.js → surrealql-DlwfRFnC.js} +1 -1
- package/dist/client/assets/{svelte-xBLD60Zd.js → svelte-RrLklQOZ.js} +1 -1
- package/dist/client/assets/{templ-CWv68xbP.js → templ-BDbBg7z2.js} +1 -1
- package/dist/client/assets/{tex-CHqz-fYs.js → tex-BeAp-Hqv.js} +1 -1
- package/dist/client/assets/{timeline-definition-PNZ67QCA-CWKkJ3QZ.js → timeline-definition-PNZ67QCA-Det2OiYV.js} +1 -1
- package/dist/client/assets/{ts-tags-DS82EDuE.js → ts-tags-Dz-1CFmn.js} +1 -1
- package/dist/client/assets/{tsx-B2GBjp2F.js → tsx-Dfi08w8H.js} +1 -1
- package/dist/client/assets/{twig-CC8x9pG0.js → twig-BfzYY6Hd.js} +1 -1
- package/dist/client/assets/{typescript-g7i13lnC.js → typescript-6FNAPG3Z.js} +1 -1
- package/dist/client/assets/{vennDiagram-CIIHVFJN-OLItKWeg.js → vennDiagram-CIIHVFJN-DhH4H0vl.js} +1 -1
- package/dist/client/assets/{vue-rFbe7luB.js → vue-DTPedjqE.js} +1 -1
- package/dist/client/assets/{vue-html-D9GQtYub.js → vue-html-B4sC29Oj.js} +1 -1
- package/dist/client/assets/{vue-vine-mrNtQtY5.js → vue-vine-BWzpqJ4r.js} +1 -1
- package/dist/client/assets/{wardleyDiagram-YWT4CUSO-Dy1yfeb4.js → wardleyDiagram-YWT4CUSO-BC8K10yP.js} +1 -1
- package/dist/client/assets/{xml-CHfMjyAM.js → xml-BK8ACjht.js} +1 -1
- package/dist/client/assets/{xsl-BFkNSogJ.js → xsl-rjlrbfou.js} +1 -1
- package/dist/client/assets/{xychartDiagram-2RQKCTM6-DfSnfjVL.js → xychartDiagram-2RQKCTM6-DwcVZiB5.js} +1 -1
- package/dist/client/assets/{yaml-BfSgHc04.js → yaml-DM6lgMhS.js} +1 -1
- package/dist/client/index.html +2 -2
- package/dist/completions-5rtfoxB9.mjs +2 -0
- package/dist/{completions-BO2DUM-8.mjs → completions-7YSX1neu.mjs} +7 -1
- package/dist/{doctor-D0Y3kOY7.mjs → doctor-BMfx7_GY.mjs} +16 -14
- package/dist/doctor-BRr5IWHe.mjs +2 -0
- package/dist/{find-tui-binary-B71xiwWu.mjs → find-tui-binary-DGspwyvd.mjs} +56 -25
- package/dist/{git-Czo96ymM.mjs → git-BGj31GX-.mjs} +71 -7
- package/dist/git-CfDSkUcE.mjs +2 -0
- package/dist/{github-CErBub2y.mjs → github-BLrnsozP.mjs} +1 -1
- package/dist/{github-DBsZ0h_l.mjs → github-DbAFoB92.mjs} +3 -3
- package/dist/{github-attachments-plDeB0iE.mjs → github-attachments-fNCKYL-Z.mjs} +2 -2
- package/dist/{mcp-DtVrMR2S.mjs → mcp-Bi551clR.mjs} +33 -30
- 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/{search-BMPY_ZW8.mjs → search-3R2E5xxr.mjs} +16 -1
- package/dist/{search-BO9Im7eu.mjs → search-CQ4nsjBX.mjs} +1 -1
- package/dist/{server-j0PnTVX1.mjs → server-B9NVZu7l.mjs} +174 -46
- package/dist/{server-lock-CY0_1mcS.mjs → server-lock-BNI8FKV1.mjs} +175 -23
- package/dist/{session-conflict-C6V9ZKo7.mjs → session-conflict-CB0IErdn.mjs} +8 -7
- package/dist/{session-manager-CYNchhVA.mjs → session-manager-656aJXFE.mjs} +2 -2
- package/dist/session-url-B8TrGGeE.mjs +33 -0
- package/dist/{settings-yK0GYpbn.mjs → settings-DkPDB_hS.mjs} +32 -4
- package/dist/setup-BiwX7vdd.mjs +446 -0
- package/dist/setup-first-run-DyT0PlOZ.mjs +2 -0
- package/dist/setup-first-run-i1o7DBki.mjs +74 -0
- package/dist/terminal-BroplOnw.mjs +116 -0
- package/dist/{tui-search-bridge-Bfb2ktdA.mjs → tui-search-bridge-fFKqX4Fi.mjs} +3 -3
- package/dist/{update-check-Copcz9eb.mjs → update-check-ISaw61qS.mjs} +16 -15
- package/package.json +11 -3
- package/scripts/postinstall.mjs +52 -0
- package/dist/client/assets/channel-Ct4-oSQN.js +0 -1
- package/dist/client/assets/chunk-QZHKN3VN-BXhKFVX7.js +0 -1
- package/dist/client/assets/chunk-WU5MYG2G-_EwuC51_.js +0 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-C8bdx9R4.js +0 -1
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-B26wrQuH.js +0 -1
- package/dist/client/assets/stateDiagram-v2-BHNVJYJU-B5BbZkU5.js +0 -1
- package/dist/git-DaP_1rVy.mjs +0 -2
- /package/dist/{apply-suggestion-CHYnw68I.mjs → apply-suggestion-BsR_8FXW.mjs} +0 -0
- /package/dist/{diff-fingerprint-BgR0tu1o.mjs → diff-fingerprint-BL5jNHnP.mjs} +0 -0
- /package/dist/{handoff-LAFtmnHf.mjs → handoff-DcShCxWJ.mjs} +0 -0
- /package/dist/{review-export-B63eRAVa.mjs → review-export-GW4KNsGN.mjs} +0 -0
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { n as
|
|
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-
|
|
6
|
-
import {
|
|
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
|
|
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
|
|
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
|
-
|
|
88
|
-
|
|
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
|
|
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 ===
|
|
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
|
|
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
|
|
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
|
|
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 ===
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
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-
|
|
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)
|
|
353
|
-
|
|
354
|
-
|
|
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
|
|
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
|
-
|
|
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)
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
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 (!
|
|
446
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
478
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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 ===
|
|
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
|
|
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
|
|
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-
|
|
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
|
-
|
|
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-
|
|
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}${
|
|
968
|
+
response = await apiFetch(`${base}${endpoint}${queryString ? `?${queryString}` : ""}`);
|
|
794
969
|
} catch (error) {
|
|
795
|
-
console.error(`Failed to reach diffing server: ${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 ||
|
|
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
|
|
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-
|
|
1031
|
+
const { runUpdateCommand } = await import("./update-check-ISaw61qS.mjs");
|
|
856
1032
|
return runUpdateCommand();
|
|
857
1033
|
case "gh":
|
|
858
|
-
const { runGhSubcommand } = await import("./cli-gh-
|
|
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-
|
|
1043
|
+
const { runSessionsCommand } = await import("./session-manager-656aJXFE.mjs");
|
|
867
1044
|
return runSessionsCommand(args);
|
|
868
1045
|
default:
|
|
869
1046
|
console.error(`Unknown subcommand: ${name}`);
|