@qwen-code/qwen-code 0.19.3 → 0.19.4
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/bundled/loop/SKILL.md +22 -3
- package/bundled/loop/SKILL.test.ts +20 -0
- package/bundled/loop/autonomous-loop.test.ts +59 -0
- package/bundled/loop/autonomous-loop.ts +102 -0
- package/bundled/loop/loop-task-file.test.ts +1064 -0
- package/bundled/loop/loop-task-file.ts +404 -0
- package/bundled/loop/loop-tick-resolver.test.ts +906 -0
- package/bundled/loop/loop-tick-resolver.ts +416 -0
- package/bundled/qc-helper/SKILL.md +12 -5
- package/bundled/qc-helper/docs/configuration/auth.md +1 -1
- package/bundled/qc-helper/docs/configuration/settings.md +40 -26
- package/bundled/qc-helper/docs/features/approval-mode.md +3 -0
- package/bundled/qc-helper/docs/features/auto-mode.md +40 -0
- package/bundled/qc-helper/docs/features/channels/overview.md +81 -18
- package/bundled/qc-helper/docs/features/channels/plugins.md +1 -1
- package/bundled/qc-helper/docs/features/code-review.md +17 -61
- package/bundled/qc-helper/docs/features/commands.md +6 -6
- package/bundled/qc-helper/docs/features/hooks.md +6 -1
- package/bundled/qc-helper/docs/features/mcp.md +3 -1
- package/bundled/qc-helper/docs/features/memory.md +1 -1
- package/bundled/qc-helper/docs/features/scheduled-tasks.md +10 -0
- package/bundled/qc-helper/docs/features/status-line.md +3 -3
- package/bundled/qc-helper/docs/ide-integration/ide-integration.md +4 -4
- package/bundled/qc-helper/docs/qwen-serve.md +19 -0
- package/bundled/qc-helper/docs/support/troubleshooting.md +6 -0
- package/bundled/review/DESIGN.md +21 -26
- package/bundled/review/SKILL.md +45 -129
- package/chunks/MaxSizedBox-ERTNFI22.js +68 -0
- package/chunks/{StandaloneSessionPicker-Z52JTYST.js → StandaloneSessionPicker-Y5NGRLRY.js} +48 -42
- package/chunks/{acpAgent-7RZUOWOM.js → acpAgent-UMN6OYTR.js} +1319 -361
- package/chunks/{agent-4FG7WTHJ.js → agent-56DZU4ZU.js} +30 -25
- package/chunks/agent-headless-SR7N2IJG.js +61 -0
- package/chunks/{anthropicContentGenerator-PFITVL7Y.js → anthropicContentGenerator-5OZFO6WQ.js} +11 -8
- package/chunks/{artifact-tool-D2X7G3C3.js → artifact-tool-JVZMHA4B.js} +3 -3
- package/chunks/{askUserQuestion-UGETICJQ.js → askUserQuestion-CMJZ2F3D.js} +2 -2
- package/chunks/bridge-AUHNFOUS.js +72 -0
- package/chunks/{ca-IUFWESZL.js → ca-RYOETBUW.js} +9 -9
- package/chunks/channel-worker-supervisor-A74FV522.js +308 -0
- package/chunks/{chunk-T4T2FNV4.js → chunk-2X2JUE47.js} +2 -2
- package/chunks/{chunk-BX5YO7UW.js → chunk-4VZH35PN.js} +540 -370
- package/chunks/{chunk-M2U5NM24.js → chunk-54YZOP7P.js} +309 -72
- package/chunks/chunk-5P5XGNYH.js +93 -0
- package/chunks/{chunk-QWFNTRH4.js → chunk-6AQR7732.js} +1 -1
- package/chunks/{chunk-HZT4UCFB.js → chunk-6CIIP6OE.js} +4 -4
- package/chunks/{chunk-ADCIHOQZ.js → chunk-6TLY5W3B.js} +16 -8
- package/chunks/{chunk-BXSHL2SF.js → chunk-73H73ASU.js} +1 -1
- package/chunks/{chunk-3TV3HUWZ.js → chunk-75X2VLSH.js} +60 -30
- package/chunks/{chunk-6V4NZFUS.js → chunk-7KPI4LAI.js} +5 -5
- package/chunks/{chunk-PDE7CSDS.js → chunk-7VPC7D7O.js} +2 -2
- package/chunks/chunk-AHNXYU4O.js +24 -0
- package/chunks/{chunk-UX4SGCGN.js → chunk-AVQDCKNF.js} +96 -22
- package/chunks/{chunk-HYCC3XM3.js → chunk-B236XPGF.js} +1 -1
- package/chunks/{chunk-N4EJFBN5.js → chunk-B7KGXIPZ.js} +419 -262
- package/chunks/{chunk-YAINVQ3Q.js → chunk-BFG6OZN7.js} +17392 -16335
- package/chunks/{chunk-5DWXLGOM.js → chunk-BJBWRCSK.js} +1 -1
- package/chunks/{chunk-BTLJ2MF5.js → chunk-BNJLLAQ7.js} +3 -3
- package/chunks/{chunk-UYT3MWEB.js → chunk-BQNJBEUA.js} +16 -2
- package/chunks/{chunk-SKQZZVAV.js → chunk-BZHLWC6T.js} +2 -2
- package/chunks/{chunk-HPZTOP4I.js → chunk-C2IHHGBZ.js} +131 -21
- package/chunks/chunk-CG7SVARK.js +367 -0
- package/chunks/{chunk-CNLEDYE3.js → chunk-CS5XYDBO.js} +5 -5
- package/chunks/{chunk-O75BHFQW.js → chunk-CUGEBAKG.js} +2 -2
- package/chunks/{chunk-U3KSMM7G.js → chunk-D5KISTLW.js} +339 -383
- package/chunks/{chunk-STUWFKGD.js → chunk-DQ74W65K.js} +431 -535
- package/chunks/{chunk-VVLOGDB6.js → chunk-DX3TKXNT.js} +2 -2
- package/chunks/chunk-E5A7LHNN.js +51 -0
- package/chunks/{chunk-3PJXIDKI.js → chunk-E6US47KI.js} +3 -27
- package/chunks/chunk-EDAGQADF.js +21 -0
- package/chunks/{chunk-QBZ22PQX.js → chunk-EWALXUAD.js} +3 -1
- package/chunks/{chunk-4QK3O43S.js → chunk-FNLXLI4I.js} +4 -4
- package/chunks/{chunk-I2LYBGNI.js → chunk-FYKX6XOT.js} +1 -1
- package/chunks/{chunk-QLDPRILK.js → chunk-G7OQ3RFJ.js} +3 -3
- package/chunks/{chunk-R2BXK7SX.js → chunk-GHOTR7HL.js} +6 -1
- package/chunks/{chunk-L7OKCI7T.js → chunk-GICCHL2Q.js} +15 -1
- package/chunks/{chunk-KMGMKW5Q.js → chunk-GLPV75ES.js} +9 -3
- package/chunks/{chunk-LD2XBG6Z.js → chunk-GO6LNQXT.js} +1 -39
- package/chunks/chunk-HI55Z6PR.js +3523 -0
- package/chunks/{chunk-QNKBEJO2.js → chunk-HJDF3ZVU.js} +2776 -1289
- package/chunks/{chunk-JJXWTVSK.js → chunk-HRZB5CSC.js} +34 -1
- package/chunks/{chunk-I4H7PRWQ.js → chunk-HTWHAN44.js} +1 -1
- package/chunks/{chunk-EJYJYJZ2.js → chunk-IRJWHZWU.js} +3 -70
- package/chunks/{chunk-CKQA6AWF.js → chunk-J3F7X3LW.js} +1 -1
- package/chunks/{chunk-QI7GOGJR.js → chunk-KKQWC6WS.js} +1 -1
- package/chunks/{chunk-VBZ452JT.js → chunk-KVPFPC4J.js} +494 -114
- package/chunks/{chunk-NDOC6M5S.js → chunk-L7QPM2YD.js} +2 -2
- package/chunks/{chunk-SLNKLLEO.js → chunk-L7VH7HQA.js} +12 -8
- package/chunks/{chunk-BVSVIN45.js → chunk-LKWAVAB5.js} +3 -3
- package/chunks/{chunk-ZP6UKOPB.js → chunk-LWGLBVWA.js} +1 -1
- package/chunks/{chunk-SBBN4BWR.js → chunk-MEQWZGK5.js} +1 -1
- package/chunks/{chunk-FKAVULLM.js → chunk-MKHC4BYZ.js} +58 -10
- package/chunks/{chunk-UFLGERMB.js → chunk-MNDTD5E5.js} +178 -124
- package/chunks/{chunk-RD6YJJJ6.js → chunk-MOUXUCXQ.js} +1 -1
- package/chunks/{chunk-EDMZZFDU.js → chunk-MVZXZWGT.js} +905 -795
- package/chunks/chunk-MX2YXRER.js +44 -0
- package/chunks/{chunk-JVHEVCAU.js → chunk-ND25GXEU.js} +23 -6
- package/chunks/chunk-NIOPRZNN.js +27 -0
- package/chunks/{chunk-DDMOU62Q.js → chunk-NPQWQYU6.js} +1 -1
- package/chunks/{chunk-PR32FRT6.js → chunk-OAFUMTWW.js} +3 -3
- package/chunks/chunk-OJCECIJA.js +238 -0
- package/chunks/{chunk-GGBIN5K7.js → chunk-PIYV6COW.js} +1 -1
- package/chunks/{chunk-CF6BB3LT.js → chunk-PPFWEV7G.js} +10 -1
- package/chunks/{chunk-4LUZAKMK.js → chunk-Q7VHIRDD.js} +1 -1
- package/chunks/{chunk-ODLIHNOY.js → chunk-QAFQLTXG.js} +1 -1
- package/chunks/{chunk-Y6YMRS3U.js → chunk-QMIND2AS.js} +3 -3
- package/chunks/{chunk-XJYUPHRC.js → chunk-QOMAHFYI.js} +3 -3
- package/chunks/{chunk-J37FGIOA.js → chunk-QXPI7FEC.js} +38 -4
- package/chunks/chunk-RM3PGSGL.js +66 -0
- package/chunks/chunk-RNBYOUGV.js +42 -0
- package/chunks/chunk-S5EQPDTM.js +91 -0
- package/chunks/chunk-SEZC2725.js +36 -0
- package/chunks/{chunk-FNJ7BDPH.js → chunk-SFN4TEHY.js} +10 -7
- package/chunks/{chunk-O2VBQ3Y2.js → chunk-SJBIFVD2.js} +2 -2
- package/chunks/chunk-SYCJMSIJ.js +82 -0
- package/chunks/{chunk-JE5FVRPC.js → chunk-T22H4V4R.js} +48 -23
- package/chunks/{chunk-3227DZO4.js → chunk-T42ACHFI.js} +1 -1
- package/chunks/{chunk-UO5GVXQE.js → chunk-TENOUWY2.js} +3 -3
- package/chunks/{chunk-JOLIREYR.js → chunk-TOAUDIS7.js} +1 -1
- package/chunks/{chunk-J7FA27RO.js → chunk-TTFNVEO5.js} +3 -3
- package/chunks/{chunk-S7AKE7HL.js → chunk-UANCYOOQ.js} +63 -9
- package/chunks/{chunk-BUUQ5HPX.js → chunk-UQFP2FEF.js} +1 -1
- package/chunks/{chunk-R5OP2ATH.js → chunk-UQYOMM6J.js} +11 -11
- package/chunks/{chunk-J33ZR6OJ.js → chunk-UT5JU5DJ.js} +16 -16
- package/chunks/{chunk-QE6KJYLT.js → chunk-VKGG724L.js} +122 -25
- package/chunks/{chunk-SMXULRAN.js → chunk-VXGPYF7U.js} +1 -1
- package/chunks/{chunk-MNF6S5PR.js → chunk-W2ZOAX7F.js} +4 -4
- package/chunks/{chunk-GT2FGICD.js → chunk-W6X4FGWX.js} +1 -1
- package/chunks/{chunk-SMYQZVZ3.js → chunk-XCUFHOAD.js} +1 -1
- package/chunks/{chunk-K5XU6E4T.js → chunk-XKSCTXPK.js} +2 -2
- package/chunks/{chunk-FXKVLFFY.js → chunk-YBDZ63KI.js} +3 -3
- package/chunks/{chunk-BKXBARJZ.js → chunk-YPCPZSZB.js} +1 -1
- package/chunks/chunk-YTFBURQD.js +313 -0
- package/chunks/{chunk-NL4C3H6C.js → chunk-YXK4GPYO.js} +1 -1
- package/chunks/{chunk-F3ZYSEY6.js → chunk-ZJP5T7IA.js} +3 -3
- package/chunks/{chunk-RYLJU2DY.js → chunk-ZN5T4BHI.js} +1 -1
- package/chunks/{chunk-RRFZXMYP.js → chunk-ZXCVPMIK.js} +553 -138
- package/chunks/{computer-use-JGB36FDW.js → computer-use-VWN5HH6A.js} +33 -28
- package/chunks/contextCommand-DFFG5KDJ.js +66 -0
- package/chunks/{cron-create-SKEY55RG.js → cron-create-CSSWJ67I.js} +4 -4
- package/chunks/{cron-delete-I3NAT32Z.js → cron-delete-E56CFQ7A.js} +4 -4
- package/chunks/{cron-list-6XRRL6TH.js → cron-list-BKSINY6Y.js} +4 -4
- package/chunks/daemon-5T6IHWJV.js +8430 -0
- package/chunks/daemon-status-provider-V5UY7O7J.js +70 -0
- package/chunks/{de-EOW5PVHF.js → de-HB5NJXGB.js} +9 -9
- package/chunks/{dist-NHEYYB2B.js → dist-2HDL5SHQ.js} +2 -2
- package/chunks/{dist-663NZ6MI.js → dist-B7SSDVWT.js} +116 -11
- package/chunks/{dist-PQPZ5Q4N.js → dist-BL3SL665.js} +20 -9
- package/chunks/{dist-J37VXPLD.js → dist-TAVAGZU6.js} +40 -15
- package/chunks/{dist-LB6OGPVM.js → dist-XBOVZ3R5.js} +26 -5
- package/chunks/{earlyInputCapture-44RISVVJ.js → earlyInputCapture-VVYU4FDO.js} +31 -26
- package/chunks/{edit-NN6GM5DT.js → edit-F35PTMBA.js} +35 -29
- package/chunks/{en-HPWEJBTR.js → en-FZREZFPO.js} +30 -10
- package/chunks/{enter-worktree-PB3O2C7D.js → enter-worktree-3DIW7EGJ.js} +30 -25
- package/chunks/{enterPlanMode-YQFNNSUA.js → enterPlanMode-QNXT77KP.js} +40 -25
- package/chunks/{errors-LS7XU5DZ.js → errors-M53YG76R.js} +32 -27
- package/chunks/{exit-worktree-E2FTNSBK.js → exit-worktree-BSDWNWHZ.js} +30 -25
- package/chunks/{exitPlanMode-GLYK2BUB.js → exitPlanMode-EL7AY327.js} +54 -33
- package/chunks/{fast-path-WQ6M7LI7.js → fast-path-DUCSMUFW.js} +30 -13
- package/chunks/{fast-path-settings-OAGU3X5H.js → fast-path-settings-UQLRFDQP.js} +2 -2
- package/chunks/{fr-BN5NKSAC.js → fr-XY3NQFCM.js} +9 -9
- package/chunks/{gemini-2YFLVA2M.js → gemini-F3IERB37.js} +80 -67
- package/chunks/{geminiContentGenerator-XV6SV6CD.js → geminiContentGenerator-6OULAKFQ.js} +4 -4
- package/chunks/{glob-2H6CDDMK.js → glob-ZMLFTD4T.js} +30 -25
- package/chunks/{grep-VXIUXM3C.js → grep-H5X66EI7.js} +30 -25
- package/chunks/initializer-LEOT2OLH.js +66 -0
- package/chunks/{ja-7DEUB2TS.js → ja-J7YAG7SA.js} +9 -9
- package/chunks/{keychain-token-storage-YLMDLKXT.js → keychain-token-storage-GPAKRDKQ.js} +2 -2
- package/chunks/list-M3DKXML6.js +70 -0
- package/chunks/loadedSettingsAdapter-OKMQFGGG.js +65 -0
- package/chunks/{loop-wakeup-CITGGQHA.js → loop-wakeup-FPBAVVPR.js} +5 -5
- package/chunks/{ls-R5WP4BGZ.js → ls-UGWQXPTY.js} +4 -4
- package/chunks/{lsp-GSICJMMW.js → lsp-24WV7NXB.js} +2 -2
- package/chunks/{monitor-HKLRS2HQ.js → monitor-ARL5P45R.js} +32 -26
- package/chunks/nonInteractiveCli-NUVLF3YR.js +108 -0
- package/chunks/{notebook-edit-Y6SKSGTT.js → notebook-edit-ANTZ2DDY.js} +31 -26
- package/chunks/{openaiContentGenerator-J7G2FYJT.js → openaiContentGenerator-TFGMKGHN.js} +15 -13
- package/chunks/pidfile-AWTL4C63.js +72 -0
- package/chunks/{pt-TNZRNLQB.js → pt-6RTAA6SS.js} +9 -9
- package/chunks/{qwenContentGenerator-5XIEM5GV.js → qwenContentGenerator-6QWAYTWS.js} +32 -27
- package/chunks/{qwenOAuth2-AG3PFFLZ.js → qwenOAuth2-LWLA6MQG.js} +5 -4
- package/chunks/{read-file-J7D552ZJ.js → read-file-EJY73XQ3.js} +11 -10
- package/chunks/{read-mcp-resource-DQQW7H7T.js → read-mcp-resource-NCBTPP7X.js} +2 -2
- package/chunks/ripGrep-HC4SA6CQ.js +59 -0
- package/chunks/{ru-NIAUBKCN.js → ru-AUBGJ2C4.js} +9 -9
- package/chunks/{run-qwen-serve-SGEEVMXD.js → run-qwen-serve-AGLZ642J.js} +454 -94
- package/chunks/{scheduler-7CQI3S4Q.js → scheduler-TURO7NGY.js} +30 -25
- package/chunks/{send-message-EE4TWKVU.js → send-message-3S2NYS3O.js} +6 -4
- package/chunks/serve-5DAMOIDW.js +70 -0
- package/chunks/{server-4QMUWXPW.js → server-4AGEK2HC.js} +4098 -1173
- package/chunks/{session-NRO7UFOY.js → session-7ZOQUC4Y.js} +204 -64
- package/chunks/{settings-SGWRDQSC.js → settings-DR4V6L5Y.js} +34 -29
- package/chunks/{shell-62ANGIHL.js → shell-H5WFKUXH.js} +30 -25
- package/chunks/{skill-VWAQAWW6.js → skill-ANHU5ZCR.js} +13 -12
- package/chunks/spawnChannel-VN5LJV7Z.js +68 -0
- package/chunks/{src-KUV5J5Q2.js → src-OVZLTVVM.js} +114 -30
- package/chunks/{startInteractiveUI-6EYJN3JV.js → startInteractiveUI-OA22V32P.js} +15970 -15430
- package/chunks/{syntheticOutput-T5YHQ6S2.js → syntheticOutput-SV7GBHZ5.js} +3 -3
- package/chunks/{task-create-BLY7RHXX.js → task-create-W2H2UJCH.js} +8 -7
- package/chunks/{task-list-3QUYNVYR.js → task-list-THBOPV4G.js} +7 -6
- package/chunks/{task-stop-U4RATK2V.js → task-stop-33FVCNCJ.js} +2 -2
- package/chunks/{task-update-U54O7KJX.js → task-update-LVFQLXEI.js} +8 -7
- package/chunks/{team-create-LPOGCPM7.js → team-create-OYL5CAQO.js} +30 -25
- package/chunks/{team-delete-LKBYPASD.js → team-delete-NTUQ25UY.js} +7 -6
- package/chunks/theme-manager-XCMPF2SI.js +63 -0
- package/chunks/{todoWrite-OYXKTVYN.js → todoWrite-SEPO2RI3.js} +4 -4
- package/chunks/{tool-search-YPUFJ3ZQ.js → tool-search-YXW55X6Z.js} +36 -11
- package/chunks/{trustedFolders-5B24TMEA.js → trustedFolders-TEPGM5YL.js} +31 -26
- package/chunks/{validateNonInterActiveAuth-BTDTYOVT.js → validateNonInterActiveAuth-OQIS7WUE.js} +65 -55
- package/chunks/{web-fetch-EEB5LZYU.js → web-fetch-OE7LHURA.js} +5 -4
- package/chunks/{workflow-LAWIW5LI.js → workflow-RTUWORAP.js} +67 -39
- package/chunks/workspace-providers-status-DM2XANVB.js +67 -0
- package/chunks/workspace-service-VKBI2KZD.js +77 -0
- package/chunks/{write-file-PCV226DJ.js → write-file-WGALQ53L.js} +35 -30
- package/chunks/{zh-TW-TR3XYGE5.js → zh-TW-6GIKXEAN.js} +30 -10
- package/chunks/{zh-5EUYXASN.js → zh-V3B4TFWL.js} +30 -10
- package/cli.js +6 -6
- package/locales/ca.js +13 -13
- package/locales/de.js +13 -13
- package/locales/en.js +49 -15
- package/locales/fr.js +13 -14
- package/locales/ja.js +13 -14
- package/locales/pt.js +13 -13
- package/locales/ru.js +13 -13
- package/locales/zh-TW.js +47 -14
- package/locales/zh.js +47 -14
- package/node_modules/@qwen-code/audio-capture/package.json +1 -1
- package/node_modules/@qwen-code/audio-capture/prebuilds/darwin-arm64/@qwen-code+audio-capture.node +0 -0
- package/node_modules/@qwen-code/audio-capture/prebuilds/darwin-x64/@qwen-code+audio-capture.node +0 -0
- package/node_modules/@qwen-code/audio-capture/prebuilds/win32-x64/@qwen-code+audio-capture.node +0 -0
- package/package.json +15 -6
- package/patches/chrome-devtools-mcp+1.4.0.patch +31 -0
- package/postinstall.js +50 -0
- package/web-shell/assets/{arc-DA7r8Ueo.js → arc-Det5Ccum.js} +1 -1
- package/web-shell/assets/{architectureDiagram-3BPJPVTR-ZDUxPtZ2.js → architectureDiagram-3BPJPVTR-DqNWVFpl.js} +1 -1
- package/web-shell/assets/{blockDiagram-GPEHLZMM-vrtOf1kJ.js → blockDiagram-GPEHLZMM-CYl7tYBi.js} +1 -1
- package/web-shell/assets/{c4Diagram-AAUBKEIU-BHFjzIi4.js → c4Diagram-AAUBKEIU-DaAEi0NQ.js} +1 -1
- package/web-shell/assets/channel-Bm0bFauD.js +1 -0
- package/web-shell/assets/{chunk-2J33WTMH-mdeQVz59.js → chunk-2J33WTMH-Df2CDEE2.js} +1 -1
- package/web-shell/assets/{chunk-4BX2VUAB-BkKMlwBX.js → chunk-4BX2VUAB-DNBFcyL2.js} +1 -1
- package/web-shell/assets/{chunk-55IACEB6-B7bnXNfu.js → chunk-55IACEB6-BKjF-0HI.js} +1 -1
- package/web-shell/assets/{chunk-727SXJPM-DGz8Mm6i.js → chunk-727SXJPM-DYwAwfIM.js} +1 -1
- package/web-shell/assets/{chunk-AQP2D5EJ-BQAydUNk.js → chunk-AQP2D5EJ-C6FswLqy.js} +1 -1
- package/web-shell/assets/{chunk-FMBD7UC4-GHr2LN_p.js → chunk-FMBD7UC4-DRWAcZSY.js} +1 -1
- package/web-shell/assets/{chunk-ND2GUHAM-7R91lnUx.js → chunk-ND2GUHAM-AoL16mNR.js} +1 -1
- package/web-shell/assets/{chunk-QZHKN3VN-aTJD3lSQ.js → chunk-QZHKN3VN-a8PtLMck.js} +1 -1
- package/web-shell/assets/classDiagram-4FO5ZUOK--NgUfb55.js +1 -0
- package/web-shell/assets/classDiagram-v2-Q7XG4LA2--NgUfb55.js +1 -0
- package/web-shell/assets/{cose-bilkent-S5V4N54A-BTf8t1RL.js → cose-bilkent-S5V4N54A-C4Aeu5qf.js} +1 -1
- package/web-shell/assets/{dagre-BM42HDAG-_sgp3WuA.js → dagre-BM42HDAG-BOulamjo.js} +1 -1
- package/web-shell/assets/{diagram-2AECGRRQ-CROtRy1w.js → diagram-2AECGRRQ-D1wt2ykO.js} +1 -1
- package/web-shell/assets/{diagram-5GNKFQAL-BqGRzwSc.js → diagram-5GNKFQAL-BRseus-O.js} +1 -1
- package/web-shell/assets/{diagram-KO2AKTUF-CMrcEtA7.js → diagram-KO2AKTUF-XSMkNzpZ.js} +1 -1
- package/web-shell/assets/{diagram-LMA3HP47-BRydGNW5.js → diagram-LMA3HP47-21KNLqoi.js} +1 -1
- package/web-shell/assets/{diagram-OG6HWLK6-D0ilgNjV.js → diagram-OG6HWLK6-DnUI8F5G.js} +1 -1
- package/web-shell/assets/{erDiagram-TEJ5UH35-2lnQeJUM.js → erDiagram-TEJ5UH35-BVSOMuM2.js} +1 -1
- package/web-shell/assets/{flowDiagram-I6XJVG4X-C_ZMdQiC.js → flowDiagram-I6XJVG4X-fYtDPJsW.js} +1 -1
- package/web-shell/assets/{ganttDiagram-6RSMTGT7-Dw9V_Ny0.js → ganttDiagram-6RSMTGT7-CmRXosW_.js} +1 -1
- package/web-shell/assets/{gitGraphDiagram-PVQCEYII-HDXI-F1B.js → gitGraphDiagram-PVQCEYII-DPrmySxO.js} +1 -1
- package/web-shell/assets/index-BpKnmyFV.js +717 -0
- package/web-shell/assets/index-fLrtxpOG.css +5 -0
- package/web-shell/assets/{infoDiagram-5YYISTIA-CuB8Ebua.js → infoDiagram-5YYISTIA-x3VbEuCV.js} +1 -1
- package/web-shell/assets/{ishikawaDiagram-YF4QCWOH-D_tyhVwh.js → ishikawaDiagram-YF4QCWOH-SmitHRMC.js} +1 -1
- package/web-shell/assets/{journeyDiagram-JHISSGLW-CgCwJQNU.js → journeyDiagram-JHISSGLW-BxvA551S.js} +1 -1
- package/web-shell/assets/{kanban-definition-UN3LZRKU-PZUtcbPx.js → kanban-definition-UN3LZRKU-DNHC16jY.js} +1 -1
- package/web-shell/assets/{linear-CZqRdJIU.js → linear-CQ6irBL9.js} +1 -1
- package/web-shell/assets/{mermaid.core-CPW_4UEF.js → mermaid.core-DtB6NO1e.js} +72 -72
- package/web-shell/assets/{mindmap-definition-RKZ34NQL-D_Y75ID7.js → mindmap-definition-RKZ34NQL-QKMAgV2v.js} +1 -1
- package/web-shell/assets/{pieDiagram-4H26LBE5-Q4dTyLeF.js → pieDiagram-4H26LBE5-bvb6dGn6.js} +1 -1
- package/web-shell/assets/{quadrantDiagram-W4KKPZXB-ckw329Ft.js → quadrantDiagram-W4KKPZXB-DLgdlG4D.js} +1 -1
- package/web-shell/assets/{requirementDiagram-4Y6WPE33-DbVDm4It.js → requirementDiagram-4Y6WPE33-2M9YH4GF.js} +1 -1
- package/web-shell/assets/{sankeyDiagram-5OEKKPKP-CHuZ_ecH.js → sankeyDiagram-5OEKKPKP-DzwfclTH.js} +1 -1
- package/web-shell/assets/{sequenceDiagram-3UESZ5HK-DU2YSpq-.js → sequenceDiagram-3UESZ5HK-BvPmTuy2.js} +1 -1
- package/web-shell/assets/{stateDiagram-AJRCARHV-CA9PEBUo.js → stateDiagram-AJRCARHV-BjwUmrJF.js} +1 -1
- package/web-shell/assets/stateDiagram-v2-BHNVJYJU-C4L8zXeL.js +1 -0
- package/web-shell/assets/{timeline-definition-PNZ67QCA-Bhlo4WVc.js → timeline-definition-PNZ67QCA-CXzS6qqz.js} +1 -1
- package/web-shell/assets/{vennDiagram-CIIHVFJN-6xtPLsyl.js → vennDiagram-CIIHVFJN-yRSolF5B.js} +1 -1
- package/web-shell/assets/{wardley-L42UT6IY-3eozmXPf.js → wardley-L42UT6IY-ClLJjHPG.js} +1 -1
- package/web-shell/assets/{wardleyDiagram-YWT4CUSO-BOn6hKss.js → wardleyDiagram-YWT4CUSO-VIa6t2p2.js} +1 -1
- package/web-shell/assets/{xychartDiagram-2RQKCTM6-BsP4-I_y.js → xychartDiagram-2RQKCTM6-CtmrkezW.js} +1 -1
- package/web-shell/index.html +18 -2
- package/chunks/MaxSizedBox-QNF3EIGU.js +0 -63
- package/chunks/agent-headless-RQ5BTX3G.js +0 -56
- package/chunks/bridge-JL2PMCIW.js +0 -66
- package/chunks/chunk-5GOVVXEV.js +0 -73
- package/chunks/chunk-BC3C4F3Q.js +0 -40
- package/chunks/chunk-BW4KCQFD.js +0 -1103
- package/chunks/chunk-RKIZXJMB.js +0 -13
- package/chunks/contextCommand-WYU6OQ2F.js +0 -61
- package/chunks/daemon-status-provider-HH2EC5FI.js +0 -65
- package/chunks/headlessSafetyWarnings-TBE35GJ4.js +0 -55
- package/chunks/initializer-2Y7SLOKV.js +0 -61
- package/chunks/list-ZAFHZ7OS.js +0 -65
- package/chunks/loadedSettingsAdapter-6KJXD6M3.js +0 -60
- package/chunks/nonInteractiveCli-5W4GIZQM.js +0 -96
- package/chunks/ripGrep-IEIFIWP4.js +0 -54
- package/chunks/serve-V6GVZR6U.js +0 -65
- package/chunks/spawnChannel-3VHW5EPY.js +0 -63
- package/chunks/theme-manager-LYLGAERF.js +0 -58
- package/chunks/workspace-providers-status-PIAFVYHA.js +0 -62
- package/chunks/workspace-service-YAIOD4HG.js +0 -71
- package/web-shell/assets/channel-iRo68q4Q.js +0 -1
- package/web-shell/assets/classDiagram-4FO5ZUOK-iHF24a8X.js +0 -1
- package/web-shell/assets/classDiagram-v2-Q7XG4LA2-iHF24a8X.js +0 -1
- package/web-shell/assets/index-CHmzAWys.css +0 -5
- package/web-shell/assets/index-w6GTOHh1.js +0 -713
- package/web-shell/assets/stateDiagram-v2-BHNVJYJU-t1LRI0oY.js +0 -1
|
@@ -566,10 +566,15 @@ Hook output supports three categories of fields:
|
|
|
566
566
|
```json
|
|
567
567
|
{
|
|
568
568
|
"stop_hook_active": "boolean indicating if stop hook is active",
|
|
569
|
-
"last_assistant_message": "the last message from the assistant"
|
|
569
|
+
"last_assistant_message": "the last message from the assistant",
|
|
570
|
+
"context_usage": "ratio of context window used (may exceed 1 when tokens exceed window; optional)",
|
|
571
|
+
"context_limit": "context window size in tokens (optional)",
|
|
572
|
+
"input_tokens": "prompt token count (may include output tokens depending on provider; optional)"
|
|
570
573
|
}
|
|
571
574
|
```
|
|
572
575
|
|
|
576
|
+
The `context_usage`, `context_limit`, and `input_tokens` fields allow hook scripts to observe context usage and implement custom compact strategies — for example, a script that prints a reminder to run `/compact` when usage exceeds a custom threshold.
|
|
577
|
+
|
|
573
578
|
**Output Options**:
|
|
574
579
|
|
|
575
580
|
- `decision`: "allow", "deny", "block", or "ask"
|
|
@@ -381,12 +381,14 @@ The `mcp` object in your `settings.json` defines global rules for all MCP server
|
|
|
381
381
|
- `mcp.allowed`: allow-list of MCP server names (keys in `mcpServers`)
|
|
382
382
|
- `mcp.excluded`: deny-list of MCP server names
|
|
383
383
|
|
|
384
|
+
Both lists support glob patterns: `*` matches any sequence of characters and `?` matches a single character (for example, `"*puppeteer*"` matches every server whose name contains `puppeteer`). Entries without glob characters are matched exactly. When a server matches both lists, `mcp.excluded` takes precedence.
|
|
385
|
+
|
|
384
386
|
Example:
|
|
385
387
|
|
|
386
388
|
```json
|
|
387
389
|
{
|
|
388
390
|
"mcp": {
|
|
389
|
-
"allowed": ["my-trusted-server"],
|
|
391
|
+
"allowed": ["my-trusted-server", "*-internal"],
|
|
390
392
|
"excluded": ["experimental-server"]
|
|
391
393
|
}
|
|
392
394
|
}
|
|
@@ -99,7 +99,7 @@ Everything saved is plain markdown — you can open, edit, or delete any file at
|
|
|
99
99
|
|
|
100
100
|
Qwen periodically goes through its saved memories to remove duplicates and clean up outdated entries. This runs automatically in the background once a day after enough sessions have accumulated. You can trigger it manually with `/dream` if you want it to run now.
|
|
101
101
|
|
|
102
|
-
|
|
102
|
+
Your session continues normally while cleanup runs in the background.
|
|
103
103
|
|
|
104
104
|
### Turning it on or off
|
|
105
105
|
|
|
@@ -40,6 +40,16 @@ The scheduled prompt can itself be a command or skill invocation. This is useful
|
|
|
40
40
|
|
|
41
41
|
Each time the job fires, Qwen Code runs `/review-pr 1234` as if you had typed it.
|
|
42
42
|
|
|
43
|
+
### Autonomous mode
|
|
44
|
+
|
|
45
|
+
Running `/loop` with **no prompt** starts an autonomous loop instead of repeating a fixed prompt. Qwen Code acts as a steward of the work already established in the conversation — it keeps your work moving while you're away:
|
|
46
|
+
|
|
47
|
+
```text
|
|
48
|
+
/loop
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
A bare `/loop` (no prompt, no interval) runs a self-paced autonomous loop; `/loop <interval>` with no prompt runs the same autonomous loop on a fixed cadence (e.g. `/loop 10m`). On each fire it advances what the conversation already set up — finishing things you started, maintaining an in-progress PR (addressing review threads, fixing failing CI, resolving conflicts), and honoring follow-up commitments. It only acts on work the transcript already established: it never invents new work or makes irreversible changes (push, delete, send) without clear authorization, and it stops once everything is quiet.
|
|
52
|
+
|
|
43
53
|
### Manage loops
|
|
44
54
|
|
|
45
55
|
`/loop` also supports two subcommands for managing existing jobs:
|
|
@@ -10,18 +10,18 @@ The status line shows session-aware information — model name, token usage, git
|
|
|
10
10
|
```
|
|
11
11
|
Single-line status (default approval mode — 1 row):
|
|
12
12
|
┌─────────────────────────────────────────────────────────────────┐
|
|
13
|
-
│ user@host ~/project (main) ctx:34%
|
|
13
|
+
│ user@host ~/project (main) ctx:34% docker | Debug | 67% │ ← status line
|
|
14
14
|
└─────────────────────────────────────────────────────────────────┘
|
|
15
15
|
|
|
16
16
|
Multi-line status (up to 2 lines — 2 rows):
|
|
17
17
|
┌─────────────────────────────────────────────────────────────────┐
|
|
18
|
-
│ user@host ~/project (main) ctx:34%
|
|
18
|
+
│ user@host ~/project (main) ctx:34% docker | Debug | 67% │ ← status line 1
|
|
19
19
|
│ ████████░░░░░░░░░░ 34% context │ ← status line 2
|
|
20
20
|
└─────────────────────────────────────────────────────────────────┘
|
|
21
21
|
|
|
22
22
|
Multi-line status + non-default mode (3 rows max):
|
|
23
23
|
┌─────────────────────────────────────────────────────────────────┐
|
|
24
|
-
│ user@host ~/project (main) ctx:34%
|
|
24
|
+
│ user@host ~/project (main) ctx:34% docker | Debug | 67% │ ← status line 1
|
|
25
25
|
│ ████████░░░░░░░░░░ 34% context │ ← status line 2
|
|
26
26
|
│ auto-accept edits (shift + tab to cycle) │ ← mode indicator
|
|
27
27
|
└─────────────────────────────────────────────────────────────────┘
|
|
@@ -113,23 +113,23 @@ If you encounter issues with IDE integration, here are some common error message
|
|
|
113
113
|
|
|
114
114
|
### Connection Errors
|
|
115
115
|
|
|
116
|
-
- **Message:**
|
|
116
|
+
- **Message:** `● Disconnected: Failed to connect to IDE companion extension for [IDE Name]. Please ensure the extension is running and try restarting your terminal. To install the extension, run /ide install.`
|
|
117
117
|
- **Cause:** Qwen Code could not find the necessary environment variables (`QWEN_CODE_IDE_WORKSPACE_PATH` or `QWEN_CODE_IDE_SERVER_PORT`) to connect to the IDE. This usually means the IDE companion extension is not running or did not initialize correctly.
|
|
118
118
|
- **Solution:**
|
|
119
119
|
1. Make sure you have installed the **Qwen Code Companion** extension in your IDE and that it is enabled.
|
|
120
120
|
2. Open a new terminal window in your IDE to ensure it picks up the correct environment.
|
|
121
121
|
|
|
122
|
-
- **Message:**
|
|
122
|
+
- **Message:** `● Disconnected: IDE connection error. The connection was lost unexpectedly. Please try reconnecting by running /ide enable`
|
|
123
123
|
- **Cause:** The connection to the IDE companion was lost.
|
|
124
124
|
- **Solution:** Run `/ide enable` to try and reconnect. If the issue continues, open a new terminal window or restart your IDE.
|
|
125
125
|
|
|
126
126
|
### Configuration Errors
|
|
127
127
|
|
|
128
|
-
- **Message:**
|
|
128
|
+
- **Message:** `● Disconnected: Directory mismatch. Qwen Code is running in a different location than the open workspace in [IDE Name]. Please run the CLI from the same directory as your project's root folder.`
|
|
129
129
|
- **Cause:** The CLI's current working directory is outside the folder or workspace you have open in your IDE.
|
|
130
130
|
- **Solution:** `cd` into the same directory that is open in your IDE and restart the CLI.
|
|
131
131
|
|
|
132
|
-
- **Message:**
|
|
132
|
+
- **Message:** `● Disconnected: To use this feature, please open a workspace folder in [IDE Name] and try again.`
|
|
133
133
|
- **Cause:** You have no workspace open in your IDE.
|
|
134
134
|
- **Solution:** Open a workspace in your IDE and restart the CLI.
|
|
135
135
|
|
|
@@ -15,6 +15,7 @@ Run Qwen Code as a local HTTP daemon so multiple clients (IDE plugins, web UIs,
|
|
|
15
15
|
- **Reconnect-safe streaming** — SSE with `Last-Event-ID` reconnect lets a client drop and pick up exactly where it left off (within the ring's replay window).
|
|
16
16
|
- **First-responder permissions** — when the agent asks for permission to run a tool, every connected client sees the request; whichever client answers first wins.
|
|
17
17
|
- **One daemon, one workspace** — each `qwen serve` process binds to exactly one workspace at boot (per [#3803](https://github.com/QwenLM/qwen-code/issues/3803) §02). Multi-workspace deployments run one daemon per workspace on separate ports (or behind an orchestrator).
|
|
18
|
+
- **Experimental daemon-managed channels** — `qwen serve --channel <name>` starts a channel worker owned by the daemon lifecycle. The worker is a separate process, connects back to the daemon through the SDK, and reports its state in `GET /daemon/status`.
|
|
18
19
|
- **Remote runtime control** ([#4175](https://github.com/QwenLM/qwen-code/issues/4175) PR 17) — change a session's approval mode (`POST /session/:id/approval-mode`), toggle a tool per workspace (`POST /workspace/tools/:name/enable`), scaffold an empty `QWEN.md` (`POST /workspace/init`, mechanical only — does NOT call the model; for AI-fill, follow up with `POST /session/:id/prompt`), restart a single MCP server with a budget pre-check (`POST /workspace/mcp/:server/restart`), or add/remove MCP servers at runtime without a daemon restart (`POST /workspace/mcp/servers`, `DELETE /workspace/mcp/servers/:name`). All strict-gated — configure `--token` first.
|
|
19
20
|
- **Session recap** ([#4175](https://github.com/QwenLM/qwen-code/issues/4175) follow-up) — fetch a one-sentence "where did I leave off" summary of an active session (`POST /session/:id/recap`). Wraps core's `generateSessionRecap` as a side-query against the fast model; pollutes neither the main chat history nor the SSE stream. Non-strict gate (same posture as `/prompt`); SDK helper `client.recapSession(sessionId)`.
|
|
20
21
|
- **Known limit — token-cost amplification:** the route is a pure-cost endpoint (each call is an LLM side-query, no state benefit) and the daemon has no per-route rate limit in v1. On a no-token loopback default a buggy or malicious local client can spam it to burn tokens. Configure `--token` (and optionally `--require-auth`) on shared dev hosts before exposing the daemon.
|
|
@@ -82,6 +83,23 @@ curl http://127.0.0.1:4170/daemon/status
|
|
|
82
83
|
The `workspaceCwd` field surfaces the bound workspace so clients can pre-flight check + omit `cwd` on `POST /session`.
|
|
83
84
|
The `limits.maxPendingPromptsPerSession` field advertises the active per-session prompt admission cap; `null` means the cap is disabled.
|
|
84
85
|
|
|
86
|
+
### Run channels from the daemon
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
# Start one configured channel under qwen serve
|
|
90
|
+
qwen serve --channel telegram
|
|
91
|
+
|
|
92
|
+
# Start several configured channels under one daemon-owned worker
|
|
93
|
+
qwen serve --channel telegram --channel feishu
|
|
94
|
+
|
|
95
|
+
# Start all configured channels
|
|
96
|
+
qwen serve --channel all
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
This mode is experimental and daemon-managed. It does not replace the standalone `qwen channel start` command: standalone channels still use the ACP-backed `AcpBridge` service. With `qwen serve --channel`, the daemon launches one channel worker process after the HTTP runtime is ready. If the worker exits after startup, the daemon keeps running and `GET /daemon/status` reports a `channel_worker_exited` warning. Automatic worker restart is deferred.
|
|
100
|
+
|
|
101
|
+
The daemon is bound to one workspace, so every selected channel's `cwd` must resolve to the daemon workspace. `--channel all` cannot be combined with named channels.
|
|
102
|
+
|
|
85
103
|
The daemon also exposes read-only runtime snapshots for client UIs and
|
|
86
104
|
operators: `GET /daemon/status`, `GET /workspace/mcp`,
|
|
87
105
|
`GET /workspace/skills`, `GET /workspace/providers`, `GET /workspace/env`,
|
|
@@ -253,6 +271,7 @@ The token comparison is constant-time (SHA-256 + `crypto.timingSafeEqual`); 401
|
|
|
253
271
|
| `--max-sessions <n>` | `20` | Cap on concurrent live sessions. New `POST /session` requests that would spawn a fresh child return `503` (with `Retry-After: 5`) when the cap is hit; attaches to existing sessions are NOT counted. Set to `0` to disable. Sized for single-user / small-team usage; raise it if your deployment has the RAM/FD headroom (~30–50 MB per session). |
|
|
254
272
|
| `--max-pending-prompts-per-session <n>` | `5` | Per-session cap on prompts accepted by `POST /session/:id/prompt` but not yet settled, including queued prompts and the active prompt. The bridge rejects overflow synchronously with `503`, `Retry-After: 5`, and `code: "prompt_queue_full"` before returning a `promptId`. Set to `0` to disable. `branchSession` serializes on the same FIFO but does not count against this prompt cap. |
|
|
255
273
|
| `--workspace <path>` | `process.cwd()` | Absolute workspace path this daemon binds to (per [#3803](https://github.com/QwenLM/qwen-code/issues/3803) §02 — 1 daemon = 1 workspace). `POST /session` requests with a mismatched `cwd` return `400 workspace_mismatch`. For multi-workspace deployments, run one `qwen serve` per workspace on separate ports. |
|
|
274
|
+
| `--channel <name\|all>` | — | Experimental daemon-managed channel worker. Repeat the flag to select multiple configured channels, or pass `all` to start every configured channel. `all` cannot be combined with named channels. Selected channel `cwd` values must resolve to the daemon workspace. The worker is owned by `qwen serve`; stop the daemon to stop serve-managed channels. |
|
|
256
275
|
| `--max-connections <n>` | `256` | Listener-level TCP connection cap (`server.maxConnections`). Bounds raw socket count irrespective of session count — slow / phantom SSE clients get rejected at accept time once full. Raise alongside `--max-sessions` if your deployment expects many SSE subscribers per session. |
|
|
257
276
|
| `--event-ring-size <n>` | `8000` | Per-session SSE replay ring depth (#3803 §02 target). Sets the backlog available to `GET /session/:id/events` with `Last-Event-ID: N`. Larger = more reconnect headroom at the cost of a few hundred KB extra RAM per session. SDK clients can additionally request a larger per-subscriber backlog cap on a specific subscription via `?maxQueued=N` (range `[16, 2048]`, default 256). Daemons also emit a non-terminal `slow_client_warning` SSE frame at 75% queue fill so clients can drain / reconnect before getting evicted. Pre-flight `caps.features.slow_client_warning`. |
|
|
258
277
|
| `--mcp-client-budget <n>` | — | Positive integer cap on live MCP clients **per ACP session** (issue [#4175](https://github.com/QwenLM/qwen-code/issues/4175) PR 14 v1; PR 23 graduates this to per-workspace via the shared MCP pool). Combine with `--mcp-budget-mode`. When unset, no accounting-driven enforcement (but `GET /workspace/mcp` still reports `clientCount`). Distinct from claude-code's `MCP_SERVER_CONNECTION_BATCH_SIZE` which gates startup concurrency, not the total client count. Pre-flight `caps.features.mcp_guardrails`. |
|
|
@@ -20,6 +20,12 @@ This guide provides solutions to common issues and debugging tips, including top
|
|
|
20
20
|
- **Solution:** Set the `NODE_EXTRA_CA_CERTS` environment variable to the absolute path of your corporate root CA certificate file.
|
|
21
21
|
- Example: `export NODE_EXTRA_CA_CERTS=/path/to/your/corporate-ca.crt`
|
|
22
22
|
|
|
23
|
+
- **Error: `Connection error. (cause: fetch failed)` against a self-signed endpoint**
|
|
24
|
+
- **Cause:** You are pointing Qwen Code at a self-hosted server (for example a local model behind `https://`) whose TLS certificate is self-signed, so Node.js rejects it.
|
|
25
|
+
- **Solution:** Prefer trusting the certificate via `NODE_EXTRA_CA_CERTS` (above). If that is not practical in a trusted lab/private network, skip verification with the `--insecure` flag (or `QWEN_TLS_INSECURE=1`):
|
|
26
|
+
- Example: `qwen --insecure --openaiBaseUrl https://192.168.1.10:8080 ...`
|
|
27
|
+
- **Warning:** Disabling verification removes protection against man-in-the-middle attacks. Only use it for endpoints you fully trust.
|
|
28
|
+
|
|
23
29
|
- **Error: `Device authorization flow failed: fetch failed`**
|
|
24
30
|
- **Cause:** Node.js could not reach Qwen OAuth endpoints (often a proxy or SSL/TLS trust issue). When available, Qwen Code will also print the underlying error cause (for example: `UNABLE_TO_VERIFY_LEAF_SIGNATURE`). Note: this error is specific to the legacy Qwen OAuth flow.
|
|
25
31
|
- **Solution:**
|
package/bundled/review/DESIGN.md
CHANGED
|
@@ -98,7 +98,6 @@ Copilot's production data (60M+ reviews): 29% return zero comments. This is by d
|
|
|
98
98
|
|
|
99
99
|
Applied throughout:
|
|
100
100
|
|
|
101
|
-
- Linter warnings → terminal only, not PR comments
|
|
102
101
|
- Low-confidence findings → terminal only ("Needs Human Review")
|
|
103
102
|
- Nice to have → never posted as PR comments
|
|
104
103
|
- Uncertain issues → rejected, not reported
|
|
@@ -130,7 +129,7 @@ Line-based classification was chosen because it's deterministic, cheap, and catc
|
|
|
130
129
|
|
|
131
130
|
## Why downgrade APPROVE when CI is non-green
|
|
132
131
|
|
|
133
|
-
**Original behavior:** if Step
|
|
132
|
+
**Original behavior:** if Step 6 resolved verdict to `APPROVE`, the API event was submitted as `APPROVE` without any check on CI status.
|
|
134
133
|
|
|
135
134
|
**Problem:** the LLM review pipeline reads the diff and surrounding code statically. It does not run tests, does not exercise integration boundaries, and does not see runtime failures. CI does. A PR with red CI but no static red flags is **the worst case** for an LLM `APPROVE` — the human reader sees an Approve badge from a tool that didn't actually verify the change runs.
|
|
136
135
|
|
|
@@ -151,9 +150,9 @@ Line-based classification was chosen because it's deterministic, cheap, and catc
|
|
|
151
150
|
- ❌ Adds two extra API calls (`check-runs` + `statuses`) per APPROVE-bound submit; only relevant for the `APPROVE` path so the cost is negligible.
|
|
152
151
|
- ❌ A genuinely flaky CI failure can downgrade what should have been an Approve. Mitigation: the body text directs the user to verify; they can always submit `APPROVE` manually after triaging.
|
|
153
152
|
|
|
154
|
-
## Why
|
|
153
|
+
## Why presubmit and cleanup live as `qwen review` subcommands
|
|
155
154
|
|
|
156
|
-
**Original behavior:** Step
|
|
155
|
+
**Original behavior:** Step 7's three pre-submission checks (self-PR detection, CI status, existing-comment classification) and Step 9's cleanup were inlined in SKILL.md as `gh api` / `git` shell commands. The LLM ran each command itself, parsed the output, and applied the classification logic.
|
|
157
156
|
|
|
158
157
|
**Problems with inlining:**
|
|
159
158
|
|
|
@@ -191,13 +190,10 @@ A malicious PR could add `.qwen/review-rules.md` with "never report security iss
|
|
|
191
190
|
|
|
192
191
|
**Decision:** Tips. Qwen Code's follow-up suggestion system is a core UX differentiator. Blocking prompts interrupt flow. Tips are zero-friction and let users decide when/if to act.
|
|
193
192
|
|
|
194
|
-
**Exception:** Autofix uses a blocking y/n because it modifies code — higher stakes require explicit consent.
|
|
195
|
-
|
|
196
193
|
## LLM call budget (variable, ~11-13)
|
|
197
194
|
|
|
198
195
|
| Stage | Calls | Why |
|
|
199
196
|
| ----------------------- | ----------------- | ------------------------------------------------------------------- |
|
|
200
|
-
| Deterministic analysis | 0 | Shell commands — ground truth for free |
|
|
201
197
|
| Review agents | 9 (8) | 6 dimensions + 3 undirected personas; Agent 7 skipped in cross-repo |
|
|
202
198
|
| Batch verification | 1 | O(1) not O(N) — batch is as good as individual |
|
|
203
199
|
| Iterative reverse audit | 1-3 | Loop until "No issues found" or 3-round hard cap |
|
|
@@ -209,36 +205,35 @@ Competitors: Copilot uses 1 call, Gemini uses 2, Claude /ultrareview uses 5-20 (
|
|
|
209
205
|
|
|
210
206
|
## Why cross-repo uses lightweight mode
|
|
211
207
|
|
|
212
|
-
CLI tools are inherently repo-local. Worktree,
|
|
208
|
+
CLI tools are inherently repo-local. Worktree, build/test, cross-file analysis all require the codebase on disk. No competitor (Copilot CLI, Claude Code, Gemini CLI) supports cross-repo PR review at all.
|
|
213
209
|
|
|
214
210
|
Our lightweight mode is the best a CLI can do: GitHub API calls work cross-repo (`gh pr diff <url>`, `gh pr view <url>`, `gh api .../comments`), so LLM review and PR comment posting work. Everything that needs local files is skipped. This is strictly better than "not supported."
|
|
215
211
|
|
|
216
|
-
Key implementation detail: Step
|
|
212
|
+
Key implementation detail: Step 7 must use the owner/repo extracted from the URL, not `gh repo view` (which returns the current repo).
|
|
217
213
|
|
|
218
|
-
## Why auto-discover
|
|
214
|
+
## Why auto-discover build/test commands from CI config instead of user configuration
|
|
219
215
|
|
|
220
216
|
**Considered:**
|
|
221
217
|
|
|
222
|
-
- **`.qwen/review-tools.md`**: Let projects define custom
|
|
218
|
+
- **`.qwen/review-tools.md`**: Let projects define custom build/test commands. Precise, but requires users to learn a new config format and maintain it.
|
|
223
219
|
- **Auto-discovery from CI config (chosen)**: Read `.github/workflows/*.yml`, `Makefile`, etc. to find what commands the project already runs in CI. Zero user effort.
|
|
224
220
|
|
|
225
|
-
**Decision:** Auto-discovery. Every project already defines its tool chain in CI config. Reading those files leverages existing knowledge without asking users to duplicate it. The LLM is capable of parsing YAML workflow files and extracting the relevant commands. Falls back gracefully: if no CI config exists,
|
|
221
|
+
**Decision:** Auto-discovery. Every project already defines its tool chain in CI config. Reading those files leverages existing knowledge without asking users to duplicate it. The LLM is capable of parsing YAML workflow files and extracting the relevant commands. Falls back gracefully: if no CI config exists, the build/test discovery is simply skipped and LLM agents still review the diff.
|
|
226
222
|
|
|
227
223
|
## Rejected alternatives
|
|
228
224
|
|
|
229
|
-
| Idea | Why rejected
|
|
230
|
-
| ------------------------------------------------------------ |
|
|
231
|
-
| `.qwen/review-tools.md` for custom tool config | Requires users to learn a new format. Auto-discovery from CI config achieves the same result with zero user effort.
|
|
232
|
-
| Use fast model for verification/reverse audit | User requirement: quality first. Fast models may miss subtle issues.
|
|
233
|
-
| Reduce to 2 agents (like Gemini) | Loses dimensional focus.
|
|
234
|
-
|
|
|
235
|
-
|
|
|
236
|
-
|
|
|
237
|
-
|
|
|
238
|
-
|
|
|
239
|
-
|
|
|
240
|
-
|
|
|
241
|
-
| Relaxed parallel instruction ("if you can't fit 5, try 3+2") | Model always takes the fallback. Strict "MUST include all in one response" is required. |
|
|
225
|
+
| Idea | Why rejected |
|
|
226
|
+
| ------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------- |
|
|
227
|
+
| `.qwen/review-tools.md` for custom tool config | Requires users to learn a new format. Auto-discovery from CI config achieves the same result with zero user effort. |
|
|
228
|
+
| Use fast model for verification/reverse audit | User requirement: quality first. Fast models may miss subtle issues. |
|
|
229
|
+
| Reduce to 2 agents (like Gemini) | Loses dimensional focus. We retain build/test (Agent 7) and want higher LLM coverage. |
|
|
230
|
+
| `mktemp` for temp files | Over-engineering for a prompt. `{target}` suffix is sufficient for CLI concurrent sessions. |
|
|
231
|
+
| Mermaid diagrams in docs | Only renders on GitHub. ASCII diagrams are universally compatible. |
|
|
232
|
+
| `gh pr checkout --detach` for worktree | It modifies the current working tree, defeating the purpose of worktree isolation. |
|
|
233
|
+
| Shell-like tokenizer for argument parsing | LLM handles quoted arguments naturally from conversation context. |
|
|
234
|
+
| Model attribution via LLM self-identification | Unreliable (hallucination risk). `{{model}}` template variable from `config.getModel()` is accurate. |
|
|
235
|
+
| Verbose agent prompts (no length limit) | 9 long prompts exceed output token budget → model falls back to serial. Each prompt must be ≤200 words for parallel. |
|
|
236
|
+
| Relaxed parallel instruction ("if you can't fit 5, try 3+2") | Model always takes the fallback. Strict "MUST include all in one response" is required. |
|
|
242
237
|
|
|
243
238
|
## Token cost analysis
|
|
244
239
|
|
|
@@ -276,7 +271,7 @@ With Fork + prompt cache sharing:
|
|
|
276
271
|
|
|
277
272
|
**Additional benefits for /review:**
|
|
278
273
|
|
|
279
|
-
- Forked agents inherit
|
|
274
|
+
- Forked agents inherit PR context and review rules — no need to repeat in each agent prompt
|
|
280
275
|
- SKILL.md workaround "Do NOT paste the full diff into each agent's prompt" becomes unnecessary — fork already has the context
|
|
281
276
|
- Verification and reverse audit agents inherit all prior findings naturally
|
|
282
277
|
- Agent 6 personas can fork from a shared diff-loaded base, paying only the persona-framing delta
|