diffing 0.10.5 → 0.12.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 +76 -41
- package/dist/{cli-agent-BJiATn11.mjs → cli-agent-CWsOHN-j.mjs} +198 -57
- package/dist/{cli-gh-_bkDCxhh.mjs → cli-gh-DI69gJGo.mjs} +27 -17
- package/dist/cli.mjs +189 -229
- package/dist/client/assets/{angular-html-CBcwKYDC.js → angular-html-PLPuQo0k.js} +1 -1
- package/dist/client/assets/{angular-ts-DRBYUaJA.js → angular-ts-CE02Ij4b.js} +1 -1
- package/dist/client/assets/{apl-BM0X8jeL.js → apl-CsuUKZoi.js} +1 -1
- package/dist/client/assets/{arc-DTkmmKl3.js → arc-CgL5kFe-.js} +1 -1
- package/dist/client/assets/{architectureDiagram-3BPJPVTR-Cw75ay7q.js → architectureDiagram-3BPJPVTR-DxZQWGnx.js} +1 -1
- package/dist/client/assets/{astro-DKTNkoRZ.js → astro-DkFc7sbz.js} +1 -1
- package/dist/client/assets/{blade-DaM7a9Zp.js → blade-BkY07kcC.js} +1 -1
- package/dist/client/assets/{blockDiagram-GPEHLZMM-DAzINMr_.js → blockDiagram-GPEHLZMM-D5a2KZV2.js} +1 -1
- package/dist/client/assets/{c-B3C0Or4o.js → c-T1BrPfJ6.js} +1 -1
- package/dist/client/assets/{c4Diagram-AAUBKEIU-C7SsS28g.js → c4Diagram-AAUBKEIU-mpMH4kFC.js} +1 -1
- package/dist/client/assets/channel-D3niKhl0.js +1 -0
- package/dist/client/assets/{chunk-2J33WTMH-DHOUGWx8.js → chunk-2J33WTMH-vMtgRLFH.js} +1 -1
- package/dist/client/assets/{chunk-3OPIFGDE-D8d2scLX.js → chunk-3OPIFGDE-Dx-FqyO2.js} +1 -1
- package/dist/client/assets/{chunk-4BX2VUAB-BSC-E5yg.js → chunk-4BX2VUAB-CUrPd8Kv.js} +1 -1
- package/dist/client/assets/{chunk-55IACEB6-27pC5pKn.js → chunk-55IACEB6-DHg3Nr8A.js} +1 -1
- package/dist/client/assets/{chunk-5ZQYHXKU-BM60x82y.js → chunk-5ZQYHXKU-CpDPvbGs.js} +1 -1
- package/dist/client/assets/{chunk-727SXJPM-CHCF96vE.js → chunk-727SXJPM-3VOGMxwk.js} +1 -1
- package/dist/client/assets/{chunk-AQP2D5EJ-BoVsvmTa.js → chunk-AQP2D5EJ-4dbfbIS6.js} +1 -1
- package/dist/client/assets/{chunk-BSJP7CBP-Iip4uSio.js → chunk-BSJP7CBP-Dfyn0Uwp.js} +1 -1
- package/dist/client/assets/{chunk-CSCIHK7Q-DuIWPyay.js → chunk-CSCIHK7Q-VTpSKo0F.js} +1 -1
- package/dist/client/assets/{chunk-FMBD7UC4-Du6rtd2k.js → chunk-FMBD7UC4-kXD1MyOL.js} +1 -1
- package/dist/client/assets/{chunk-KSCS5N6A-BBq105vI.js → chunk-KSCS5N6A-BrVoWOAb.js} +1 -1
- package/dist/client/assets/{chunk-L5ZTLDWV-0DmB5Qp8.js → chunk-L5ZTLDWV-wZEQDPsa.js} +1 -1
- package/dist/client/assets/{chunk-LZXEDZCA-CoRsjUfr.js → chunk-LZXEDZCA-D3i0B0eg.js} +2 -2
- package/dist/client/assets/{chunk-ND2GUHAM-tX8cKEls.js → chunk-ND2GUHAM-hDVHT0bN.js} +1 -1
- package/dist/client/assets/{chunk-NZK2D7GU-BoJGgPic.js → chunk-NZK2D7GU-jQUfhp9h.js} +1 -1
- package/dist/client/assets/{chunk-O5CBEL6O-mlwCWs97.js → chunk-O5CBEL6O-CX_vPWhk.js} +1 -1
- package/dist/client/assets/chunk-QZHKN3VN-CZLFuGpt.js +1 -0
- package/dist/client/assets/chunk-WU5MYG2G-BhcpjkaB.js +1 -0
- package/dist/client/assets/{chunk-XPW4576I-B5efww8M.js → chunk-XPW4576I-Co_-vDB4.js} +1 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-DK5KJNIt.js +1 -0
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-y5K9t6Se.js +1 -0
- package/dist/client/assets/{cobol-De9QR_Td.js → cobol-8-qBLs-a.js} +1 -1
- package/dist/client/assets/{coffee-Ct_GvuHP.js → coffee-Bjz5lkyW.js} +1 -1
- package/dist/client/assets/{cose-bilkent-S5V4N54A-ATaJZGF7.js → cose-bilkent-S5V4N54A-BljJ0FSA.js} +1 -1
- package/dist/client/assets/{cpp-Dw52w9cj.js → cpp-5BVQCBXT.js} +1 -1
- package/dist/client/assets/{crystal-Dx8ADdsd.js → crystal-CCkY93GS.js} +1 -1
- package/dist/client/assets/{css-CZ13XvDU.js → css-BTM7Tp2a.js} +1 -1
- package/dist/client/assets/{dagre-BM42HDAG-aDltuYut.js → dagre-BM42HDAG-BSynd_2D.js} +1 -1
- package/dist/client/assets/{diagram-2AECGRRQ-DGWnHVMJ.js → diagram-2AECGRRQ-K3E2CVdy.js} +1 -1
- package/dist/client/assets/{diagram-5GNKFQAL-Dd7eZBKe.js → diagram-5GNKFQAL-BQHIrfKc.js} +1 -1
- package/dist/client/assets/{diagram-KO2AKTUF-DWThXREf.js → diagram-KO2AKTUF-Bqs8sNN4.js} +1 -1
- package/dist/client/assets/{diagram-LMA3HP47-CXR4Bjtc.js → diagram-LMA3HP47-C9K4bpQe.js} +1 -1
- package/dist/client/assets/{diagram-OG6HWLK6-D4Cbf0nW.js → diagram-OG6HWLK6-DK6wIXY2.js} +1 -1
- package/dist/client/assets/{dist-CUDhrHNw.js → dist-1nkZYMRy.js} +1 -1
- package/dist/client/assets/{edge-CQCjdJKj.js → edge-DqN2FJce.js} +1 -1
- package/dist/client/assets/{elixir-bkjwPazA.js → elixir-BiAgRUFF.js} +1 -1
- package/dist/client/assets/{elm-CCweX5Cq.js → elm-N1IbY8sz.js} +1 -1
- package/dist/client/assets/{erDiagram-TEJ5UH35-BmAyt7SU.js → erDiagram-TEJ5UH35-jsHCiP02.js} +1 -1
- package/dist/client/assets/{erb-D-Z-KBLp.js → erb-B-yYlWAZ.js} +1 -1
- package/dist/client/assets/{flowDiagram-I6XJVG4X-C6nIFUVc.js → flowDiagram-I6XJVG4X-DOB1dAWG.js} +1 -1
- package/dist/client/assets/{ganttDiagram-6RSMTGT7-DMlxThBf.js → ganttDiagram-6RSMTGT7-BYIewcY5.js} +1 -1
- package/dist/client/assets/{git-rebase-BdoFdenB.js → git-rebase-CVkPxOAF.js} +1 -1
- package/dist/client/assets/{gitGraphDiagram-PVQCEYII-JaIFkAIT.js → gitGraphDiagram-PVQCEYII-VNQzbpv2.js} +1 -1
- package/dist/client/assets/{glimmer-js-CZQrBJKq.js → glimmer-js-BmG1xm72.js} +1 -1
- package/dist/client/assets/{glimmer-ts-CBYW46D4.js → glimmer-ts-CvTgwZsg.js} +1 -1
- package/dist/client/assets/{glsl-wxixKkY_.js → glsl-DwjNNCbW.js} +1 -1
- package/dist/client/assets/{graphql-CqZ0Lo5a.js → graphql-BvgkyF8E.js} +1 -1
- package/dist/client/assets/{hack-rqWymQRV.js → hack-DH3188x2.js} +1 -1
- package/dist/client/assets/{haml-DFw_IoGM.js → haml-B0GTfMhX.js} +1 -1
- package/dist/client/assets/{handlebars-3VmTVMYt.js → handlebars-he7hLDd9.js} +1 -1
- package/dist/client/assets/{html-C0Li76jB.js → html-DIYgdTBq.js} +1 -1
- package/dist/client/assets/{html-derivative-CO-RQW8y.js → html-derivative-2s6MXlci.js} +1 -1
- package/dist/client/assets/{http-sPrZOeBY.js → http-COS23XJP.js} +1 -1
- package/dist/client/assets/{hurl-DUoPe4Lc.js → hurl-BlZPjeJt.js} +1 -1
- package/dist/client/assets/index-BrEVVQOB.js +4021 -0
- package/dist/client/assets/index-BsuX6HVI.css +1 -0
- package/dist/client/assets/{infoDiagram-5YYISTIA-B6AZ5SCV.js → infoDiagram-5YYISTIA-DQRqk24I.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-CytMrpo8.js → ishikawaDiagram-YF4QCWOH-DU1rqrLx.js} +1 -1
- package/dist/client/assets/{java-Cj0G6QRg.js → java-BAa5w-Qd.js} +1 -1
- package/dist/client/assets/{javascript-d5SUuyWD.js → javascript-C9e02ssI.js} +1 -1
- package/dist/client/assets/{jinja-BTw9k0vO.js → jinja-Bx37xXwq.js} +1 -1
- package/dist/client/assets/{jison-9xSVvR1q.js → jison-m_DEf8Jo.js} +1 -1
- package/dist/client/assets/{journeyDiagram-JHISSGLW-Bd4jZUYI.js → journeyDiagram-JHISSGLW-CoHlfevf.js} +1 -1
- package/dist/client/assets/{json-DjAt53ka.js → json-DtN5AWRW.js} +1 -1
- package/dist/client/assets/{jsx-BX5KmQ7d.js → jsx-BlPpu8bR.js} +1 -1
- package/dist/client/assets/{julia-CLLx1dHC.js → julia-BAOmCbHl.js} +1 -1
- package/dist/client/assets/{just-C0v80bKe.js → just-C_bvVjwE.js} +1 -1
- package/dist/client/assets/{kanban-definition-UN3LZRKU-Ds4pXHJa.js → kanban-definition-UN3LZRKU-BiqYI7_m.js} +1 -1
- package/dist/client/assets/{latex-DY-oQfwO.js → latex-81pMfNMt.js} +1 -1
- package/dist/client/assets/{line-BbSLfOl6.js → line-DCovs9My.js} +1 -1
- package/dist/client/assets/{linear-BMIZJAAR.js → linear-cJF5XHE7.js} +1 -1
- package/dist/client/assets/{liquid-DDHDgbZx.js → liquid-sKRTk6dT.js} +1 -1
- package/dist/client/assets/{lua-CXymerKS.js → lua-C1uZL4IF.js} +1 -1
- package/dist/client/assets/{marko-DoPFsptl.js → marko-BKEzP1CL.js} +1 -1
- package/dist/client/assets/{mdc-BxSmTphd.js → mdc-CLkfm94H.js} +1 -1
- package/dist/client/assets/{mermaid-parser.core-CcYSvN4q.js → mermaid-parser.core-CTsTbvb2.js} +1 -1
- package/dist/client/assets/{mermaid.core-COTNtqgQ.js → mermaid.core-D86HJEwL.js} +3 -3
- package/dist/client/assets/{mindmap-definition-RKZ34NQL-BTxraRzn.js → mindmap-definition-RKZ34NQL-CL3heUmL.js} +1 -1
- package/dist/client/assets/{nginx-Bma0jNOT.js → nginx-eDGm66pc.js} +1 -1
- package/dist/client/assets/{nim-DMBpjygU.js → nim-CoWZPv8-.js} +1 -1
- package/dist/client/assets/{perl-CrnrV-AJ.js → perl-MoMqtMVr.js} +1 -1
- package/dist/client/assets/{php-CDYxzX6t.js → php-DXXVMAtN.js} +1 -1
- package/dist/client/assets/{pieDiagram-4H26LBE5-DglRmzer.js → pieDiagram-4H26LBE5-CWV3TMu4.js} +1 -1
- package/dist/client/assets/{pug-DNewy3GU.js → pug-CPWaB94J.js} +1 -1
- package/dist/client/assets/{qml-COjcnZ-W.js → qml-lhvpx8vk.js} +1 -1
- package/dist/client/assets/{quadrantDiagram-W4KKPZXB-BjSmyES7.js → quadrantDiagram-W4KKPZXB-QV25BYos.js} +1 -1
- package/dist/client/assets/{r-CrCaMxLS.js → r-DYbUnmmK.js} +1 -1
- package/dist/client/assets/{razor-jeuOZIar.js → razor-DcyOLv96.js} +1 -1
- package/dist/client/assets/{regexp-DSHVUX08.js → regexp-BdY10jm0.js} +1 -1
- package/dist/client/assets/{requirementDiagram-4Y6WPE33-B4f430jS.js → requirementDiagram-4Y6WPE33-BPMsmU6J.js} +1 -1
- package/dist/client/assets/{review-export-Cen1WEcX.js → review-export-CMwjJURs.js} +1 -1
- package/dist/client/assets/{rst-CIDgytzc.js → rst-6ShFOzgH.js} +1 -1
- package/dist/client/assets/{ruby-DtuseoNq.js → ruby-B04DeVbi.js} +1 -1
- package/dist/client/assets/{sankeyDiagram-5OEKKPKP-TQPPlxc6.js → sankeyDiagram-5OEKKPKP-DQJeroPp.js} +1 -1
- package/dist/client/assets/{sas-C72Theia.js → sas-Dj26ftNa.js} +1 -1
- package/dist/client/assets/{scss-ClECtwRk.js → scss-BOHpBkgl.js} +1 -1
- package/dist/client/assets/{sequenceDiagram-3UESZ5HK-D1tx07Wg.js → sequenceDiagram-3UESZ5HK-DdV0Y6Sz.js} +1 -1
- package/dist/client/assets/{shellscript-BCwBsi2k.js → shellscript-CpHwjRcU.js} +1 -1
- package/dist/client/assets/{shellsession-BrOddEl5.js → shellsession-BJAvf4GN.js} +1 -1
- package/dist/client/assets/{soy-Dcs0GWFW.js → soy-B67bZJnL.js} +1 -1
- package/dist/client/assets/{sql-BAjA7Gv7.js → sql-8MzOqSsK.js} +1 -1
- package/dist/client/assets/{src-CYYhkqTK.js → src-AaoRSmFl.js} +1 -1
- package/dist/client/assets/{stata-19ngQtzR.js → stata-aCME945h.js} +1 -1
- package/dist/client/assets/{stateDiagram-AJRCARHV-BZRCEzb5.js → stateDiagram-AJRCARHV-CMD_Xj2M.js} +1 -1
- package/dist/client/assets/stateDiagram-v2-BHNVJYJU-vLl7D4ue.js +1 -0
- package/dist/client/assets/{surrealql-Ce2TBRjE.js → surrealql-B_V_HxAi.js} +1 -1
- package/dist/client/assets/{svelte-DQ_1eGZz.js → svelte-BcQvTlqz.js} +1 -1
- package/dist/client/assets/{templ-Cw2DDxWF.js → templ-DZCQ2blz.js} +1 -1
- package/dist/client/assets/{tex-myDSO2eP.js → tex-BfeQ5Wuu.js} +1 -1
- package/dist/client/assets/{timeline-definition-PNZ67QCA-CP0OZhBT.js → timeline-definition-PNZ67QCA-CyIS7Zoe.js} +1 -1
- package/dist/client/assets/{ts-tags-rh39ZwVs.js → ts-tags-DVWE0E87.js} +1 -1
- package/dist/client/assets/{tsx-B0-26jrU.js → tsx-DdJ7Sfqf.js} +1 -1
- package/dist/client/assets/{twig-CgasHzPb.js → twig-_gVgaha5.js} +1 -1
- package/dist/client/assets/{typescript-Dq3T0c-m.js → typescript-Bj0_LzZV.js} +1 -1
- package/dist/client/assets/{vennDiagram-CIIHVFJN-DHaKHj0j.js → vennDiagram-CIIHVFJN-C-J2kWyk.js} +1 -1
- package/dist/client/assets/{vue-CzFVh92-.js → vue-Dnt_GBRb.js} +1 -1
- package/dist/client/assets/{vue-html-Bv2uFkTH.js → vue-html-ClVA5__5.js} +1 -1
- package/dist/client/assets/{vue-vine-DzieBk9Y.js → vue-vine-BCcz4SVP.js} +1 -1
- package/dist/client/assets/{wardleyDiagram-YWT4CUSO-Dky7jxlZ.js → wardleyDiagram-YWT4CUSO-Dzt4EPh8.js} +1 -1
- package/dist/client/assets/{xml-wcdHRHN8.js → xml-BYeUHEti.js} +1 -1
- package/dist/client/assets/{xsl-CXrwsLG9.js → xsl-Vsx0SZEV.js} +1 -1
- package/dist/client/assets/{xychartDiagram-2RQKCTM6-BQ2hG60h.js → xychartDiagram-2RQKCTM6-BAWZKvwP.js} +1 -1
- package/dist/client/assets/{yaml-lO6lK6Xe.js → yaml-C6L1khMK.js} +1 -1
- package/dist/client/index.html +2 -2
- package/dist/{completions-3UF8uzhx.mjs → completions-DvyV49HY.mjs} +22 -1
- package/dist/{doctor-BGYZNIYP.mjs → doctor-Bz9VHuBI.mjs} +7 -6
- package/dist/find-tui-binary-DVQADOSF.mjs +101 -0
- package/dist/{git-Czo96ymM.mjs → git-BGj31GX-.mjs} +71 -7
- package/dist/git-CfDSkUcE.mjs +2 -0
- package/dist/{github-DKT0lJXv.mjs → github-DXiEeHzk.mjs} +1 -1
- package/dist/{github-CEjtGd41.mjs → github-DpzqNrUh.mjs} +3 -3
- package/dist/{github-attachments-Cf17YWp4.mjs → github-attachments-DgOf7BhP.mjs} +2 -2
- package/dist/{mcp-Dq7J5QOP.mjs → mcp-zDVzU1vl.mjs} +42 -33
- package/dist/native/tui-darwin-arm64/diffing-tui +0 -0
- package/dist/native/tui-darwin-x64/diffing-tui +0 -0
- package/dist/native/tui-linux-arm64-gnu/diffing-tui +0 -0
- package/dist/native/tui-linux-arm64-musl/diffing-tui +0 -0
- package/dist/native/tui-linux-x64-gnu/diffing-tui +0 -0
- package/dist/native/tui-linux-x64-musl/diffing-tui +0 -0
- package/dist/native/tui-win32-x64-msvc/diffing-tui.exe +0 -0
- package/dist/{review-export-BBDWvftT.mjs → review-export-B63eRAVa.mjs} +1 -1
- package/dist/{settings-bwe7yQ8U.mjs → search-3R2E5xxr.mjs} +133 -98
- package/dist/search-CQ4nsjBX.mjs +2 -0
- package/dist/{server-C9i4V36o.mjs → server-Dw3lkQ5q.mjs} +296 -110
- package/dist/server-lock-BNI8FKV1.mjs +427 -0
- package/dist/session-conflict-Bqt1M4Mp.mjs +96 -0
- package/dist/session-manager-BKSZQqDJ.mjs +159 -0
- package/dist/session-url-sr7lXXVc.mjs +100 -0
- package/dist/tui-search-bridge-BGgLCwMF.mjs +133 -0
- package/dist/{update-check-DUuHmPeZ.mjs → update-check-BUfh4Y6c.mjs} +16 -15
- package/package.json +9 -4
- package/dist/client/assets/channel-lsVHTuYR.js +0 -1
- package/dist/client/assets/chunk-QZHKN3VN-AHUiTM0z.js +0 -1
- package/dist/client/assets/chunk-WU5MYG2G-D41j4yxb.js +0 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-D1Eo3kly.js +0 -1
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-bAMsbsfB.js +0 -1
- package/dist/client/assets/index-B42c0TyV.css +0 -1
- package/dist/client/assets/index-BN_-di_r.js +0 -3959
- package/dist/client/assets/stateDiagram-v2-BHNVJYJU-Da-mGMA2.js +0 -1
- package/dist/find-tui-binary-CRpbYXLC.mjs +0 -52
- package/dist/git-DaP_1rVy.mjs +0 -2
- package/dist/server-lock-Dd_ss_Il.mjs +0 -153
- /package/dist/{apply-suggestion-DNNsC5gx.mjs → apply-suggestion-CHYnw68I.mjs} +0 -0
- /package/dist/{comment-format-B5AcGcR-.mjs → comment-format-B85NHZnG.mjs} +0 -0
- /package/dist/{diff-fingerprint-C8YO3TTE.mjs → diff-fingerprint-BgR0tu1o.mjs} +0 -0
- /package/dist/{handoff-DPoIyeWn.mjs → handoff-LAFtmnHf.mjs} +0 -0
- /package/dist/{plan-format-BQyx--mp.mjs → plan-format-BwJh5JSE.mjs} +0 -0
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { t as
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
1
|
+
import { f as getProjectStorageDir } from "./git-BGj31GX-.mjs";
|
|
2
|
+
import { a as loadSettings, i as reviewSessionUrl, o as saveSettings, t as appendSessionToken } from "./session-url-sr7lXXVc.mjs";
|
|
3
|
+
import { t as formatComments } from "./comment-format-B85NHZnG.mjs";
|
|
4
|
+
import { n as formatPlanReview } from "./plan-format-BwJh5JSE.mjs";
|
|
5
|
+
import { h as SESSION_TOKEN_HEADER, u as resolveActiveServerLock } from "./server-lock-BNI8FKV1.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";
|
|
6
7
|
import { join } from "node:path";
|
|
7
8
|
import { parseArgs } from "node:util";
|
|
8
9
|
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
@@ -24,26 +25,51 @@ const EXIT_NO_SERVER = 3;
|
|
|
24
25
|
const EXIT_NOT_FOUND = 4;
|
|
25
26
|
const EXIT_USAGE = 5;
|
|
26
27
|
let activeCapability;
|
|
28
|
+
let activeAuthToken;
|
|
27
29
|
/** Resolve the running server's base URL from the lockfile, or exit cleanly. */
|
|
28
30
|
function baseUrl() {
|
|
29
|
-
const lock =
|
|
30
|
-
if (!lock
|
|
31
|
+
const lock = resolveActiveServerLock();
|
|
32
|
+
if (!lock) {
|
|
31
33
|
console.error("No diffing server running for this repo. Start one with `diffing`.");
|
|
32
34
|
process.exit(EXIT_NO_SERVER);
|
|
33
35
|
}
|
|
34
36
|
const host = lock.host === "0.0.0.0" || lock.host === "::" ? "127.0.0.1" : lock.host;
|
|
35
37
|
activeCapability = lock.mode === "tui" ? lock.capability : void 0;
|
|
38
|
+
activeAuthToken = lock.authToken;
|
|
36
39
|
return `http://${host}:${lock.port}`;
|
|
37
40
|
}
|
|
38
|
-
/** Attach
|
|
41
|
+
/** Attach session credentials while preserving ordinary web calls. */
|
|
39
42
|
function apiFetch(input, init = {}) {
|
|
40
43
|
const headers = new Headers(init.headers);
|
|
41
44
|
if (activeCapability) headers.set("X-Diffing-Capability", activeCapability);
|
|
45
|
+
if (activeAuthToken) headers.set(SESSION_TOKEN_HEADER, activeAuthToken);
|
|
42
46
|
return fetch(input, {
|
|
43
47
|
...init,
|
|
44
48
|
headers
|
|
45
49
|
});
|
|
46
50
|
}
|
|
51
|
+
function connectionErrorMessage(err) {
|
|
52
|
+
if (err instanceof Error) return err.message;
|
|
53
|
+
return String(err);
|
|
54
|
+
}
|
|
55
|
+
/** apiFetch wrapper that logs connection failures and returns null instead of throwing. */
|
|
56
|
+
async function tryApiFetch(input, init) {
|
|
57
|
+
try {
|
|
58
|
+
return await apiFetch(input, init);
|
|
59
|
+
} catch (err) {
|
|
60
|
+
console.error(`Failed to reach diffing server: ${connectionErrorMessage(err)}`);
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
function parseTimeoutSeconds(raw, flag = "--timeout") {
|
|
65
|
+
if (raw === void 0) return 570;
|
|
66
|
+
const t = Number(raw);
|
|
67
|
+
if (!Number.isFinite(t) || t <= 0) {
|
|
68
|
+
console.error(`${flag} must be a positive number of seconds.`);
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
return t;
|
|
72
|
+
}
|
|
47
73
|
async function readStdin() {
|
|
48
74
|
const chunks = [];
|
|
49
75
|
for await (const chunk of process.stdin) chunks.push(chunk);
|
|
@@ -67,7 +93,9 @@ async function awaitReview(args) {
|
|
|
67
93
|
},
|
|
68
94
|
allowPositionals: false
|
|
69
95
|
});
|
|
70
|
-
const
|
|
96
|
+
const timeoutSeconds = parseTimeoutSeconds(values.timeout);
|
|
97
|
+
if (timeoutSeconds === null) return EXIT_USAGE;
|
|
98
|
+
const totalBudgetMs = timeoutSeconds * 1e3;
|
|
71
99
|
const base = baseUrl();
|
|
72
100
|
let agentId = typeof values["agent-id"] === "string" ? values["agent-id"] : void 0;
|
|
73
101
|
try {
|
|
@@ -83,9 +111,8 @@ async function awaitReview(args) {
|
|
|
83
111
|
if (reg.ok) agentId = (await reg.json()).agentId ?? agentId;
|
|
84
112
|
} catch {}
|
|
85
113
|
let sinceRound = 0;
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
} catch {}
|
|
114
|
+
const statusRes = await tryApiFetch(`${base}/api/review/status`);
|
|
115
|
+
if (statusRes?.ok) sinceRound = (await statusRes.json()).round ?? 0;
|
|
89
116
|
const unregister = async () => {
|
|
90
117
|
if (!agentId) return;
|
|
91
118
|
try {
|
|
@@ -99,10 +126,15 @@ async function awaitReview(args) {
|
|
|
99
126
|
res = await apiFetch(`${base}/api/review/await?timeoutMs=25000&sinceRound=${sinceRound}`, { signal: AbortSignal.timeout(3e4) });
|
|
100
127
|
} catch (err) {
|
|
101
128
|
if (err?.name === "TimeoutError") continue;
|
|
102
|
-
console.error(`Failed to reach diffing server: ${err
|
|
129
|
+
console.error(`Failed to reach diffing server: ${connectionErrorMessage(err)}`);
|
|
103
130
|
await unregister();
|
|
104
131
|
return EXIT_NO_SERVER;
|
|
105
132
|
}
|
|
133
|
+
if (!res.ok) {
|
|
134
|
+
console.error(`Failed to await review: HTTP ${res.status}`);
|
|
135
|
+
await unregister();
|
|
136
|
+
return 1;
|
|
137
|
+
}
|
|
106
138
|
const result = await res.json();
|
|
107
139
|
if (result.status === "released") {
|
|
108
140
|
process.stdout.write(result.payload.commentXml + "\n");
|
|
@@ -138,12 +170,18 @@ async function reply(args) {
|
|
|
138
170
|
return EXIT_USAGE;
|
|
139
171
|
}
|
|
140
172
|
let body = values.body;
|
|
141
|
-
if (body ===
|
|
173
|
+
if (body === void 0) {
|
|
174
|
+
if (process.stdin.isTTY) {
|
|
175
|
+
console.error("Usage: diffing reply <commentId> --body <text> [--model <name>]");
|
|
176
|
+
return EXIT_USAGE;
|
|
177
|
+
}
|
|
178
|
+
body = (await readStdin()).trim();
|
|
179
|
+
} else if (body === "-") body = (await readStdin()).trim();
|
|
142
180
|
if (!body) {
|
|
143
181
|
console.error("A reply body is required (--body <text> or pipe via stdin).");
|
|
144
182
|
return EXIT_USAGE;
|
|
145
183
|
}
|
|
146
|
-
const res = await
|
|
184
|
+
const res = await tryApiFetch(`${baseUrl()}/api/comments/${commentId}/replies`, {
|
|
147
185
|
method: "POST",
|
|
148
186
|
headers: { "Content-Type": "application/json" },
|
|
149
187
|
body: JSON.stringify({
|
|
@@ -152,6 +190,7 @@ async function reply(args) {
|
|
|
152
190
|
model: values.model
|
|
153
191
|
})
|
|
154
192
|
});
|
|
193
|
+
if (!res) return EXIT_NO_SERVER;
|
|
155
194
|
if (res.status === 404) {
|
|
156
195
|
console.error(`Comment ${commentId} not found.`);
|
|
157
196
|
return EXIT_NOT_FOUND;
|
|
@@ -174,11 +213,12 @@ async function resolve$1(args) {
|
|
|
174
213
|
console.error("Usage: diffing resolve <commentId>");
|
|
175
214
|
return EXIT_USAGE;
|
|
176
215
|
}
|
|
177
|
-
const res = await
|
|
216
|
+
const res = await tryApiFetch(`${baseUrl()}/api/comments/${commentId}`, {
|
|
178
217
|
method: "PUT",
|
|
179
218
|
headers: { "Content-Type": "application/json" },
|
|
180
219
|
body: JSON.stringify({ status: "resolved" })
|
|
181
220
|
});
|
|
221
|
+
if (!res) return EXIT_NO_SERVER;
|
|
182
222
|
if (res.status === 404) {
|
|
183
223
|
console.error(`Comment ${commentId} not found.`);
|
|
184
224
|
return EXIT_NOT_FOUND;
|
|
@@ -201,11 +241,12 @@ async function unresolve(args) {
|
|
|
201
241
|
console.error("Usage: diffing unresolve <commentId>");
|
|
202
242
|
return EXIT_USAGE;
|
|
203
243
|
}
|
|
204
|
-
const res = await
|
|
244
|
+
const res = await tryApiFetch(`${baseUrl()}/api/comments/${commentId}`, {
|
|
205
245
|
method: "PUT",
|
|
206
246
|
headers: { "Content-Type": "application/json" },
|
|
207
247
|
body: JSON.stringify({ status: "open" })
|
|
208
248
|
});
|
|
249
|
+
if (!res) return EXIT_NO_SERVER;
|
|
209
250
|
if (res.status === 404) {
|
|
210
251
|
console.error(`Comment ${commentId} not found.`);
|
|
211
252
|
return EXIT_NOT_FOUND;
|
|
@@ -232,16 +273,23 @@ async function commentEdit(args) {
|
|
|
232
273
|
return EXIT_USAGE;
|
|
233
274
|
}
|
|
234
275
|
let body = values.body;
|
|
235
|
-
if (body ===
|
|
276
|
+
if (body === void 0) {
|
|
277
|
+
if (process.stdin.isTTY) {
|
|
278
|
+
console.error("Usage: diffing comment edit <commentId> --body <text>");
|
|
279
|
+
return EXIT_USAGE;
|
|
280
|
+
}
|
|
281
|
+
body = (await readStdin()).trim();
|
|
282
|
+
} else if (body === "-") body = (await readStdin()).trim();
|
|
236
283
|
if (!body) {
|
|
237
284
|
console.error("A body is required (--body <text> or stdin).");
|
|
238
285
|
return EXIT_USAGE;
|
|
239
286
|
}
|
|
240
|
-
const res = await
|
|
287
|
+
const res = await tryApiFetch(`${baseUrl()}/api/comments/${commentId}`, {
|
|
241
288
|
method: "PUT",
|
|
242
289
|
headers: { "Content-Type": "application/json" },
|
|
243
290
|
body: JSON.stringify({ body })
|
|
244
291
|
});
|
|
292
|
+
if (!res) return EXIT_NO_SERVER;
|
|
245
293
|
if (res.status === 404) {
|
|
246
294
|
console.error(`Comment ${commentId} not found.`);
|
|
247
295
|
return EXIT_NOT_FOUND;
|
|
@@ -264,7 +312,8 @@ async function commentDelete(args) {
|
|
|
264
312
|
console.error("Usage: diffing comment delete <commentId>");
|
|
265
313
|
return EXIT_USAGE;
|
|
266
314
|
}
|
|
267
|
-
const res = await
|
|
315
|
+
const res = await tryApiFetch(`${baseUrl()}/api/comments/${commentId}`, { method: "DELETE" });
|
|
316
|
+
if (!res) return EXIT_NO_SERVER;
|
|
268
317
|
if (res.status === 404) {
|
|
269
318
|
console.error(`Comment ${commentId} not found.`);
|
|
270
319
|
return EXIT_NOT_FOUND;
|
|
@@ -288,7 +337,13 @@ async function commentCmd(args) {
|
|
|
288
337
|
}
|
|
289
338
|
}
|
|
290
339
|
async function url() {
|
|
291
|
-
|
|
340
|
+
const lock = resolveActiveServerLock();
|
|
341
|
+
if (!lock) {
|
|
342
|
+
console.error("No diffing server running for this repo. Start one with `diffing`.");
|
|
343
|
+
process.exit(EXIT_NO_SERVER);
|
|
344
|
+
}
|
|
345
|
+
const printed = reviewSessionUrl(lock) ?? baseUrl();
|
|
346
|
+
process.stdout.write(`${printed}\n`);
|
|
292
347
|
return EXIT_OK;
|
|
293
348
|
}
|
|
294
349
|
async function comments(args) {
|
|
@@ -301,16 +356,50 @@ async function comments(args) {
|
|
|
301
356
|
},
|
|
302
357
|
allowPositionals: false
|
|
303
358
|
});
|
|
304
|
-
const
|
|
359
|
+
const res = await tryApiFetch(`${baseUrl()}/api/comments`);
|
|
360
|
+
if (!res) return EXIT_NO_SERVER;
|
|
361
|
+
if (!res.ok) {
|
|
362
|
+
console.error(`Failed to fetch comments: HTTP ${res.status}`);
|
|
363
|
+
return 1;
|
|
364
|
+
}
|
|
365
|
+
const all = await res.json();
|
|
305
366
|
const selected = values.open ? all.filter((c) => c.status === "open") : all;
|
|
306
367
|
const format = values.format?.toLowerCase();
|
|
368
|
+
if (format && format !== "xml" && format !== "json" && format !== "md" && format !== "markdown") {
|
|
369
|
+
console.error("Unknown --format. Use xml, json, md, or markdown.");
|
|
370
|
+
return EXIT_USAGE;
|
|
371
|
+
}
|
|
307
372
|
if (values.json || format === "json") process.stdout.write(JSON.stringify(selected, null, 2) + "\n");
|
|
308
373
|
else if (format === "markdown" || format === "md") {
|
|
309
|
-
const { formatCommentsMarkdown } = await import("./review-export-
|
|
374
|
+
const { formatCommentsMarkdown } = await import("./review-export-B63eRAVa.mjs");
|
|
310
375
|
process.stdout.write(formatCommentsMarkdown(selected) + "\n");
|
|
311
376
|
} else process.stdout.write(formatComments(selected) + "\n");
|
|
312
377
|
return EXIT_OK;
|
|
313
378
|
}
|
|
379
|
+
function mode(args) {
|
|
380
|
+
if (args.length === 0) {
|
|
381
|
+
process.stdout.write(loadSettings().defaultMode + "\n");
|
|
382
|
+
return EXIT_OK;
|
|
383
|
+
}
|
|
384
|
+
if (args.length === 1 && (args[0] === "--help" || args[0] === "-h")) {
|
|
385
|
+
process.stdout.write("Usage: diffing mode <web|tui>\n");
|
|
386
|
+
return EXIT_OK;
|
|
387
|
+
}
|
|
388
|
+
const requested = args[0];
|
|
389
|
+
if (args.length !== 1 || requested !== "web" && requested !== "tui") {
|
|
390
|
+
console.error("Usage: diffing mode <web|tui>");
|
|
391
|
+
return EXIT_USAGE;
|
|
392
|
+
}
|
|
393
|
+
try {
|
|
394
|
+
saveSettings({ defaultMode: requested });
|
|
395
|
+
} catch (error) {
|
|
396
|
+
const detail = error instanceof Error ? error.message : String(error);
|
|
397
|
+
console.error(`Failed to save default mode: ${detail}`);
|
|
398
|
+
return 1;
|
|
399
|
+
}
|
|
400
|
+
process.stdout.write(`Default mode set to ${requested}.\n`);
|
|
401
|
+
return EXIT_OK;
|
|
402
|
+
}
|
|
314
403
|
/** Derive a human title from a plan's first heading or non-empty line. */
|
|
315
404
|
function deriveTitle(body) {
|
|
316
405
|
for (const raw of body.split("\n")) {
|
|
@@ -324,9 +413,10 @@ function deriveTitle(body) {
|
|
|
324
413
|
/** Long-poll the plan-review handoff until a decision arrives or time runs out. */
|
|
325
414
|
async function pollPlanDecision(base, totalBudgetMs, seedSince) {
|
|
326
415
|
let sinceRound = seedSince ?? 0;
|
|
327
|
-
if (seedSince === void 0)
|
|
328
|
-
|
|
329
|
-
|
|
416
|
+
if (seedSince === void 0) {
|
|
417
|
+
const statusRes = await tryApiFetch(`${base}/api/plan-review/status`);
|
|
418
|
+
if (statusRes?.ok) sinceRound = (await statusRes.json()).round ?? 0;
|
|
419
|
+
}
|
|
330
420
|
const deadline = Date.now() + totalBudgetMs;
|
|
331
421
|
while (Date.now() < deadline) {
|
|
332
422
|
let res;
|
|
@@ -334,9 +424,13 @@ async function pollPlanDecision(base, totalBudgetMs, seedSince) {
|
|
|
334
424
|
res = await apiFetch(`${base}/api/plan-review/await?timeoutMs=25000&sinceRound=${sinceRound}`, { signal: AbortSignal.timeout(3e4) });
|
|
335
425
|
} catch (err) {
|
|
336
426
|
if (err?.name === "TimeoutError") continue;
|
|
337
|
-
console.error(`Failed to reach diffing server: ${err
|
|
427
|
+
console.error(`Failed to reach diffing server: ${connectionErrorMessage(err)}`);
|
|
338
428
|
return EXIT_NO_SERVER;
|
|
339
429
|
}
|
|
430
|
+
if (!res.ok) {
|
|
431
|
+
console.error(`Failed to await plan review: HTTP ${res.status}`);
|
|
432
|
+
return 1;
|
|
433
|
+
}
|
|
340
434
|
const result = await res.json();
|
|
341
435
|
if (result.status === "released") {
|
|
342
436
|
process.stdout.write(result.payload.reviewXml + "\n");
|
|
@@ -403,10 +497,11 @@ async function planSubmit(args) {
|
|
|
403
497
|
source = file;
|
|
404
498
|
}
|
|
405
499
|
let sinceRound = 0;
|
|
406
|
-
if (values.wait)
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
500
|
+
if (values.wait) {
|
|
501
|
+
const statusRes = await tryApiFetch(`${base}/api/plan-review/status`);
|
|
502
|
+
if (statusRes?.ok) sinceRound = (await statusRes.json()).round ?? 0;
|
|
503
|
+
}
|
|
504
|
+
const submitRes = await tryApiFetch(`${base}/api/plans`, {
|
|
410
505
|
method: "POST",
|
|
411
506
|
headers: { "Content-Type": "application/json" },
|
|
412
507
|
body: JSON.stringify({
|
|
@@ -417,12 +512,13 @@ async function planSubmit(args) {
|
|
|
417
512
|
model: values.model
|
|
418
513
|
})
|
|
419
514
|
});
|
|
420
|
-
if (!
|
|
421
|
-
|
|
515
|
+
if (!submitRes) return EXIT_NO_SERVER;
|
|
516
|
+
if (!submitRes.ok) {
|
|
517
|
+
console.error(`Failed to submit plan: HTTP ${submitRes.status}`);
|
|
422
518
|
return 1;
|
|
423
519
|
}
|
|
424
|
-
const plan = await
|
|
425
|
-
console.error(`Submitted plan ${plan.id} (v${plan.version}) — review at ${base}/plan/${plan.id}`);
|
|
520
|
+
const plan = await submitRes.json();
|
|
521
|
+
console.error(`Submitted plan ${plan.id} (v${plan.version}) — review at ${appendSessionToken(`${base}/plan/${plan.id}`, activeAuthToken)}`);
|
|
426
522
|
if (plan.sourcePath) console.error(`Source path: ${plan.sourcePath}`);
|
|
427
523
|
if (!values.wait) console.error(CLI_PLAN_SUBMIT_PARK_HINT);
|
|
428
524
|
if (values.saveSource) try {
|
|
@@ -438,7 +534,9 @@ async function planSubmit(args) {
|
|
|
438
534
|
process.stdout.write(plan.id + "\n");
|
|
439
535
|
return EXIT_OK;
|
|
440
536
|
}
|
|
441
|
-
|
|
537
|
+
const timeoutSeconds = parseTimeoutSeconds(values.timeout);
|
|
538
|
+
if (timeoutSeconds === null) return EXIT_USAGE;
|
|
539
|
+
return pollPlanDecision(base, timeoutSeconds * 1e3, sinceRound);
|
|
442
540
|
}
|
|
443
541
|
async function planAwait(args) {
|
|
444
542
|
const { values } = parseArgs({
|
|
@@ -449,8 +547,9 @@ async function planAwait(args) {
|
|
|
449
547
|
} },
|
|
450
548
|
allowPositionals: false
|
|
451
549
|
});
|
|
452
|
-
const
|
|
453
|
-
|
|
550
|
+
const timeoutSeconds = parseTimeoutSeconds(values.timeout);
|
|
551
|
+
if (timeoutSeconds === null) return EXIT_USAGE;
|
|
552
|
+
return pollPlanDecision(baseUrl(), timeoutSeconds * 1e3);
|
|
454
553
|
}
|
|
455
554
|
async function planList(args) {
|
|
456
555
|
const { values } = parseArgs({
|
|
@@ -458,7 +557,13 @@ async function planList(args) {
|
|
|
458
557
|
options: { json: { type: "boolean" } },
|
|
459
558
|
allowPositionals: false
|
|
460
559
|
});
|
|
461
|
-
const
|
|
560
|
+
const res = await tryApiFetch(`${baseUrl()}/api/plans`);
|
|
561
|
+
if (!res) return EXIT_NO_SERVER;
|
|
562
|
+
if (!res.ok) {
|
|
563
|
+
console.error(`Failed to list plans: HTTP ${res.status}`);
|
|
564
|
+
return 1;
|
|
565
|
+
}
|
|
566
|
+
const all = await res.json();
|
|
462
567
|
if (values.json) {
|
|
463
568
|
process.stdout.write(JSON.stringify(all, null, 2) + "\n");
|
|
464
569
|
return EXIT_OK;
|
|
@@ -485,18 +590,29 @@ async function planShow(args) {
|
|
|
485
590
|
const base = baseUrl();
|
|
486
591
|
let planId = positionals[0];
|
|
487
592
|
if (!planId) {
|
|
488
|
-
const
|
|
593
|
+
const listRes = await tryApiFetch(`${base}/api/plans`);
|
|
594
|
+
if (!listRes) return EXIT_NO_SERVER;
|
|
595
|
+
if (!listRes.ok) {
|
|
596
|
+
console.error(`Failed to list plans: HTTP ${listRes.status}`);
|
|
597
|
+
return 1;
|
|
598
|
+
}
|
|
599
|
+
const all = await listRes.json();
|
|
489
600
|
if (all.length === 0) {
|
|
490
601
|
console.error("No plans submitted yet.");
|
|
491
602
|
return EXIT_NOT_FOUND;
|
|
492
603
|
}
|
|
493
604
|
planId = all[all.length - 1].id;
|
|
494
605
|
}
|
|
495
|
-
const res = await
|
|
606
|
+
const res = await tryApiFetch(`${base}/api/plans/${planId}`);
|
|
607
|
+
if (!res) return EXIT_NO_SERVER;
|
|
496
608
|
if (res.status === 404) {
|
|
497
609
|
console.error(`Plan ${planId} not found.`);
|
|
498
610
|
return EXIT_NOT_FOUND;
|
|
499
611
|
}
|
|
612
|
+
if (!res.ok) {
|
|
613
|
+
console.error(`Failed to load plan: HTTP ${res.status}`);
|
|
614
|
+
return 1;
|
|
615
|
+
}
|
|
500
616
|
const plan = await res.json();
|
|
501
617
|
const requestedVersion = values.version !== void 0 ? Number(values.version) : void 0;
|
|
502
618
|
if (requestedVersion !== void 0 && (!Number.isFinite(requestedVersion) || requestedVersion < 1)) {
|
|
@@ -525,11 +641,16 @@ async function planVersions(args) {
|
|
|
525
641
|
console.error("Usage: diffing plan versions <id> [--json]");
|
|
526
642
|
return EXIT_USAGE;
|
|
527
643
|
}
|
|
528
|
-
const planRes = await
|
|
644
|
+
const planRes = await tryApiFetch(`${base}/api/plans/${planId}`);
|
|
645
|
+
if (!planRes) return EXIT_NO_SERVER;
|
|
529
646
|
if (planRes.status === 404) {
|
|
530
647
|
console.error(`Plan ${planId} not found.`);
|
|
531
648
|
return EXIT_NOT_FOUND;
|
|
532
649
|
}
|
|
650
|
+
if (!planRes.ok) {
|
|
651
|
+
console.error(`Failed to load plan: HTTP ${planRes.status}`);
|
|
652
|
+
return 1;
|
|
653
|
+
}
|
|
533
654
|
const plan = await planRes.json();
|
|
534
655
|
const versions = plan.versions ?? [];
|
|
535
656
|
if (values.json) {
|
|
@@ -549,7 +670,9 @@ async function planVersions(args) {
|
|
|
549
670
|
}
|
|
550
671
|
/** Locate which plan owns a given comment id (comment ids are globally unique). */
|
|
551
672
|
async function findCommentPlan(base, commentId) {
|
|
552
|
-
|
|
673
|
+
const res = await tryApiFetch(`${base}/api/plans`);
|
|
674
|
+
if (!res?.ok) return null;
|
|
675
|
+
return (await res.json()).find((p) => (p.comments ?? []).some((c) => c.id === commentId)) ?? null;
|
|
553
676
|
}
|
|
554
677
|
async function planReply(args) {
|
|
555
678
|
const { values, positionals } = parseArgs({
|
|
@@ -572,7 +695,13 @@ async function planReply(args) {
|
|
|
572
695
|
return EXIT_USAGE;
|
|
573
696
|
}
|
|
574
697
|
let body = values.body;
|
|
575
|
-
if (body ===
|
|
698
|
+
if (body === void 0) {
|
|
699
|
+
if (process.stdin.isTTY) {
|
|
700
|
+
console.error("Usage: diffing plan reply <commentId> --body <text> [--model <name>]");
|
|
701
|
+
return EXIT_USAGE;
|
|
702
|
+
}
|
|
703
|
+
body = (await readStdin()).trim();
|
|
704
|
+
} else if (body === "-") body = (await readStdin()).trim();
|
|
576
705
|
if (!body) {
|
|
577
706
|
console.error("A reply body is required (--body <text> or pipe via stdin).");
|
|
578
707
|
return EXIT_USAGE;
|
|
@@ -583,7 +712,7 @@ async function planReply(args) {
|
|
|
583
712
|
console.error(`Plan comment ${commentId} not found.`);
|
|
584
713
|
return EXIT_NOT_FOUND;
|
|
585
714
|
}
|
|
586
|
-
const res = await
|
|
715
|
+
const res = await tryApiFetch(`${base}/api/plans/${plan.id}/comments/${commentId}/replies`, {
|
|
587
716
|
method: "POST",
|
|
588
717
|
headers: { "Content-Type": "application/json" },
|
|
589
718
|
body: JSON.stringify({
|
|
@@ -592,6 +721,7 @@ async function planReply(args) {
|
|
|
592
721
|
model: values.model
|
|
593
722
|
})
|
|
594
723
|
});
|
|
724
|
+
if (!res) return EXIT_NO_SERVER;
|
|
595
725
|
if (!res.ok) {
|
|
596
726
|
console.error(`Failed to reply: HTTP ${res.status}`);
|
|
597
727
|
return 1;
|
|
@@ -616,11 +746,12 @@ async function planResolve(args) {
|
|
|
616
746
|
console.error(`Plan comment ${commentId} not found.`);
|
|
617
747
|
return EXIT_NOT_FOUND;
|
|
618
748
|
}
|
|
619
|
-
const res = await
|
|
749
|
+
const res = await tryApiFetch(`${base}/api/plans/${plan.id}/comments/${commentId}`, {
|
|
620
750
|
method: "PUT",
|
|
621
751
|
headers: { "Content-Type": "application/json" },
|
|
622
752
|
body: JSON.stringify({ status: "resolved" })
|
|
623
753
|
});
|
|
754
|
+
if (!res) return EXIT_NO_SERVER;
|
|
624
755
|
if (!res.ok) {
|
|
625
756
|
console.error(`Failed to resolve: HTTP ${res.status}`);
|
|
626
757
|
return 1;
|
|
@@ -645,7 +776,7 @@ async function plan(args) {
|
|
|
645
776
|
}
|
|
646
777
|
}
|
|
647
778
|
async function doctor() {
|
|
648
|
-
const { runDoctor, formatDoctorReport } = await import("./doctor-
|
|
779
|
+
const { runDoctor, formatDoctorReport } = await import("./doctor-Bz9VHuBI.mjs");
|
|
649
780
|
const report = await runDoctor({
|
|
650
781
|
cwd: process.cwd(),
|
|
651
782
|
cliImportMetaUrl: import.meta.url
|
|
@@ -654,16 +785,20 @@ async function doctor() {
|
|
|
654
785
|
return report.ok ? EXIT_OK : 1;
|
|
655
786
|
}
|
|
656
787
|
async function completion(args) {
|
|
657
|
-
|
|
658
|
-
if (!shell || args.includes("--help") || args.includes("-h")) {
|
|
788
|
+
if (args.includes("--help") || args.includes("-h")) {
|
|
659
789
|
console.error("Usage: diffing completion <bash|zsh|fish>");
|
|
660
790
|
console.error(" # Install examples:");
|
|
661
791
|
console.error(" # diffing completion bash >> ~/.bashrc");
|
|
662
792
|
console.error(" # diffing completion zsh > ~/.zfunc/_diffing");
|
|
663
793
|
console.error(" # diffing completion fish > ~/.config/fish/completions/diffing.fish");
|
|
794
|
+
return EXIT_OK;
|
|
795
|
+
}
|
|
796
|
+
const shell = args[0];
|
|
797
|
+
if (!shell) {
|
|
798
|
+
console.error("Usage: diffing completion <bash|zsh|fish>");
|
|
664
799
|
return EXIT_USAGE;
|
|
665
800
|
}
|
|
666
|
-
const { completionFor } = await import("./completions-
|
|
801
|
+
const { completionFor } = await import("./completions-DvyV49HY.mjs");
|
|
667
802
|
const script = completionFor(shell);
|
|
668
803
|
if (!script) {
|
|
669
804
|
console.error(`Unknown shell: ${shell}. Use bash, zsh, or fish.`);
|
|
@@ -763,11 +898,12 @@ Add --pretty for indented JSON. Compact JSON is the token-efficient default.`);
|
|
|
763
898
|
return EXIT_USAGE;
|
|
764
899
|
}
|
|
765
900
|
const base = baseUrl();
|
|
901
|
+
const queryString = params.toString();
|
|
766
902
|
let response;
|
|
767
903
|
try {
|
|
768
|
-
response = await apiFetch(`${base}${endpoint}${
|
|
904
|
+
response = await apiFetch(`${base}${endpoint}${queryString ? `?${queryString}` : ""}`);
|
|
769
905
|
} catch (error) {
|
|
770
|
-
console.error(`Failed to reach diffing server: ${error
|
|
906
|
+
console.error(`Failed to reach diffing server: ${connectionErrorMessage(error)}`);
|
|
771
907
|
return EXIT_NO_SERVER;
|
|
772
908
|
}
|
|
773
909
|
const body = await response.json().catch(() => ({ error: response.statusText }));
|
|
@@ -779,7 +915,7 @@ Add --pretty for indented JSON. Compact JSON is the token-efficient default.`);
|
|
|
779
915
|
return EXIT_OK;
|
|
780
916
|
}
|
|
781
917
|
async function progress(args) {
|
|
782
|
-
const { values } = parseArgs({
|
|
918
|
+
const { values, positionals } = parseArgs({
|
|
783
919
|
args,
|
|
784
920
|
options: {
|
|
785
921
|
message: {
|
|
@@ -793,12 +929,12 @@ async function progress(args) {
|
|
|
793
929
|
},
|
|
794
930
|
allowPositionals: true
|
|
795
931
|
});
|
|
796
|
-
const message = values.message ||
|
|
932
|
+
const message = values.message || positionals[0] || "";
|
|
797
933
|
if (!message) {
|
|
798
934
|
console.error("Usage: diffing progress --message \"Working on comment…\" [--model M] [--pct N]");
|
|
799
935
|
return EXIT_USAGE;
|
|
800
936
|
}
|
|
801
|
-
const res = await
|
|
937
|
+
const res = await tryApiFetch(`${baseUrl()}/api/agent/progress`, {
|
|
802
938
|
method: "POST",
|
|
803
939
|
headers: { "Content-Type": "application/json" },
|
|
804
940
|
body: JSON.stringify({
|
|
@@ -809,6 +945,7 @@ async function progress(args) {
|
|
|
809
945
|
pct: values.pct != null ? Number(values.pct) : void 0
|
|
810
946
|
})
|
|
811
947
|
});
|
|
948
|
+
if (!res) return EXIT_NO_SERVER;
|
|
812
949
|
if (!res.ok) {
|
|
813
950
|
const err = await res.json().catch(() => ({}));
|
|
814
951
|
console.error(err.error ?? res.statusText);
|
|
@@ -827,15 +964,19 @@ async function runSubcommand(name, args) {
|
|
|
827
964
|
case "url": return url();
|
|
828
965
|
case "plan": return plan(args);
|
|
829
966
|
case "update":
|
|
830
|
-
const { runUpdateCommand } = await import("./update-check-
|
|
967
|
+
const { runUpdateCommand } = await import("./update-check-BUfh4Y6c.mjs");
|
|
831
968
|
return runUpdateCommand();
|
|
832
969
|
case "gh":
|
|
833
|
-
const { runGhSubcommand } = await import("./cli-gh-
|
|
970
|
+
const { runGhSubcommand } = await import("./cli-gh-DI69gJGo.mjs");
|
|
834
971
|
return runGhSubcommand(args);
|
|
835
972
|
case "doctor": return doctor();
|
|
836
973
|
case "completion": return completion(args);
|
|
837
974
|
case "progress": return progress(args);
|
|
838
975
|
case "inspect": return inspect(args);
|
|
976
|
+
case "mode": return mode(args);
|
|
977
|
+
case "sessions":
|
|
978
|
+
const { runSessionsCommand } = await import("./session-manager-BKSZQqDJ.mjs");
|
|
979
|
+
return runSessionsCommand(args);
|
|
839
980
|
default:
|
|
840
981
|
console.error(`Unknown subcommand: ${name}`);
|
|
841
982
|
return EXIT_USAGE;
|