@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
|
@@ -91,6 +91,9 @@ Settings are organized into categories. Most settings should be placed within th
|
|
|
91
91
|
| `general.language` | enum | Language for the user interface. Use `"auto"` to detect from system settings, or a language code (e.g. `"zh-CN"`, `"fr"`). Custom codes can be added by placing JS locale files in `~/.qwen/locales/`. See [i18n](../features/language). Requires restart. | `"auto"` |
|
|
92
92
|
| `general.outputLanguage` | string | Language for model output. Use `"auto"` to detect from system settings, or set a specific language. Requires restart. | `"auto"` |
|
|
93
93
|
| `general.dynamicCommandTranslation` | boolean | Enable AI translation of dynamic slash-command descriptions. When disabled, dynamic commands keep their original descriptions and skip translation model calls. | `false` |
|
|
94
|
+
| `general.terminalBell` | boolean | Play a terminal bell sound when a response completes or needs approval. | `true` |
|
|
95
|
+
| `general.preventSystemSleep` | boolean | Prevent the system from sleeping while Qwen Code is streaming a model response or executing tools. Idle prompt time and permission prompts do not inhibit sleep. Read once at startup, so changes take effect after restart. | `true` |
|
|
96
|
+
| `general.chatRecording` | boolean | Save chat history to disk. Disabling this also prevents `--continue` and `--resume` from working. Requires restart. | `true` |
|
|
94
97
|
|
|
95
98
|
#### output
|
|
96
99
|
|
|
@@ -116,6 +119,7 @@ Settings are organized into categories. Most settings should be placed within th
|
|
|
116
119
|
| `ui.renderMode` | string | Default Markdown display mode. Use `"render"` for rich visual previews or `"raw"` to show source-oriented Markdown by default. Toggle during a session with `Alt/Option+M`; on macOS the terminal must send Option as Meta. See [Markdown Rendering](../features/markdown-rendering). | `"render"` |
|
|
117
120
|
| `ui.showCitations` | boolean | Show citations for generated text in the chat. | `false` |
|
|
118
121
|
| `ui.history.collapseOnResume` | boolean | Whether to collapse history by default when resuming a session. Can be toggled via `/history collapse-on-resume` and `/history expand-on-resume`. | `false` |
|
|
122
|
+
| `ui.history.collapsePreviewCount` | number | Number of most recent user turns to keep visible when `ui.history.collapseOnResume` is enabled. `0` collapses all restored history by default; `-1` shows all restored history. | `0` |
|
|
119
123
|
| `ui.compactMode` | boolean | Hide tool output and thinking for a cleaner view. Toggle with `Ctrl+O` during a session or via the Settings dialog. Tool approval prompts are never hidden, even in compact mode. The setting persists across sessions. | `false` |
|
|
120
124
|
| `ui.shellOutputMaxLines` | number | Max number of shell output lines shown inline. Set to `0` to disable the cap and show full output. Hidden lines are surfaced via the `+N lines` indicator. Errors, `!`-prefix user-initiated commands, confirming tools, and focused embedded shells always show full output. | `5` |
|
|
121
125
|
| `ui.enableWelcomeBack` | boolean | Show welcome back dialog when returning to a project with conversation history. When enabled, Qwen Code will automatically detect if you're returning to a project with a previously generated project summary (`.qwen/PROJECT_SUMMARY.md`) and show a dialog allowing you to continue your previous conversation or start fresh. If you choose **Start new chat session**, that choice is remembered for the current project until the project summary changes. This feature integrates with the `/summary` command and quit confirmation dialog. | `true` |
|
|
@@ -126,6 +130,12 @@ Settings are organized into categories. Most settings should be placed within th
|
|
|
126
130
|
| `ui.enableFollowupSuggestions` | boolean | Enable [followup suggestions](../features/followup-suggestions) that predict what you want to type next after the model responds. Suggestions appear as placeholder text and are accepted with Tab, Enter, or Right Arrow (which fill the input — they do not auto-submit). On by default; set to `false` to opt out. | `true` |
|
|
127
131
|
| `ui.enableCacheSharing` | boolean | Use cache-aware forked queries for suggestion generation. Reduces cost on providers that support prefix caching (experimental). | `true` |
|
|
128
132
|
| `ui.enableSpeculation` | boolean | Speculatively execute accepted suggestions before submission. Results appear instantly when you accept (experimental). | `false` |
|
|
133
|
+
| `ui.showStatusInTitle` | boolean | Show the Qwen Code session name and status in the terminal window title. | `true` |
|
|
134
|
+
| `ui.disableWorkflowKeywordTrigger` | boolean | When `true`, mentioning the word `workflow` in a prompt no longer softly steers the turn toward the Workflow tool (and the Footer `workflow active` indicator is suppressed). Only applies when workflows are enabled. | `false` |
|
|
135
|
+
| `ui.enableUserFeedback` | boolean | Show an optional feedback dialog after conversations to help improve Qwen performance. | `true` |
|
|
136
|
+
| `ui.compactInline` | boolean | Compact tool display within each group instead of merging across groups. Requires `ui.compactMode` to be enabled. Requires restart. | `false` |
|
|
137
|
+
| `ui.useTerminalBuffer` | boolean | Render conversation history in an in-app scrollable viewport instead of the terminal scrollback buffer. Recommended if you see flicker, scroll-storm, or interface freeze on long sessions. Scroll with `Shift+↑/↓` (line), `PgUp`/`PgDn` (page), `Ctrl+Home/End` (top/bottom), or the mouse wheel. Does not use the host terminal scrollback while enabled; hold `Shift` (or `Option` on macOS) while dragging for native text selection. | `false` |
|
|
138
|
+
| `ui.hideBuiltinWorktreeIndicator` | boolean | Hide the built-in `⎇ worktree-<branch> (<slug>)` line in the Footer. The worktree state is still passed to custom statusline scripts via the stdin payload. Keep at the default unless your custom statusline renders the worktree itself. | `false` |
|
|
129
139
|
|
|
130
140
|
#### ide
|
|
131
141
|
|
|
@@ -149,7 +159,7 @@ Settings are organized into categories. Most settings should be placed within th
|
|
|
149
159
|
| `model.maxWallTimeSeconds` | number | Wall-clock budget for headless / unattended runs, in seconds. `-1` means unlimited. Overridable per-invocation via `--max-wall-time`, which requires a positive duration (`90`, `30s`, `5m`, `1h`, `1.5h`); the minimum is 1 second — sub-second values (`500ms`, `0.5`) are rejected as typos. Omit the flag to fall back to this setting. Aborts with exit code 55 when exceeded. | `-1` |
|
|
150
160
|
| `model.maxToolCalls` | number | Cumulative tool-call budget for a run (counts every executed tool, success or failure; `structured_output` under `--json-schema` is exempt). `-1` means unlimited; `0` means "no tool calls allowed". Capped at 1,000,000 to catch typos. Overridable via `--max-tool-calls`. Aborts with exit code 55 when exceeded. | `-1` |
|
|
151
161
|
| `model.generationConfig` | object | Advanced overrides passed to the underlying content generator. Supports request controls such as `timeout`, `maxRetries`, `enableCacheControl`, `splitToolMedia` (default `true`; splits tool-returned media — including images read by the built-in read_file — into a follow-up user message instead of the spec-violating `role: "tool"` message, so strict OpenAI-compatible servers like doubao / new-api / LM Studio can see it; set `false` to restore the legacy embed-in-tool behavior), `toolResultContentFormat` (default `"parts"`; set `"string"` only for legacy OpenAI-compatible runtimes whose tool templates ignore text content parts), `contextWindowSize` (override model's context window size), `modalities` (override auto-detected input modalities), `customHeaders` (custom HTTP headers for API requests), and `extra_body` (additional body parameters for OpenAI-compatible API requests only), along with fine-tuning knobs under `samplingParams` (for example `temperature`, `top_p`, `max_tokens`). Leave unset to rely on provider defaults. | `undefined` |
|
|
152
|
-
| `model.chatCompression.contextPercentageThreshold` | number | **REMOVED.** Auto-compaction now uses a three-tier threshold ladder (warn / auto / hard) computed internally from the model's context window via the `computeThresholds()` function
|
|
162
|
+
| `model.chatCompression.contextPercentageThreshold` | number | **REMOVED.** Replaced by `context.autoCompactThreshold` (see `#### context` section below). Auto-compaction now uses a three-tier threshold ladder (warn / auto / hard) computed internally from the model's context window via the `computeThresholds()` function. The old setting is silently ignored (no startup warning). See PR #4345 / `docs/design/auto-compaction-threshold-redesign.md` for the redesign rationale. | `N/A` |
|
|
153
163
|
| `model.chatCompression.maxRecentFilesToRetain` | number | Number of most-recently-touched files whose current content is restored (embedded if small, otherwise referenced by path) into history after auto-compaction. `0` restores none. Env override: `QWEN_COMPACT_MAX_RECENT_FILES`. | `5` |
|
|
154
164
|
| `model.chatCompression.maxRecentImagesToRetain` | number | Number of most-recent images (tool screenshots / user pastes) restored into history after auto-compaction. `0` restores none. Env override: `QWEN_COMPACT_MAX_RECENT_IMAGES`. | `3` |
|
|
155
165
|
| `model.chatCompression.enableScreenshotTrigger` | boolean | When `true`, auto-compaction also fires once the number of tool-returned images accumulated in history reaches `screenshotTriggerThreshold`, independent of token usage — aimed at computer-use sessions where frequent screenshots dilute model attention. Counts only images returned inside tool results, not user-pasted images. Env override: `QWEN_COMPACT_SCREENSHOT_TRIGGER` (`1`/`true`/`0`/`false`). | `true` |
|
|
@@ -234,20 +244,21 @@ The `extra_body` field allows you to add custom parameters to the request body s
|
|
|
234
244
|
|
|
235
245
|
#### context
|
|
236
246
|
|
|
237
|
-
| Setting | Type | Description
|
|
238
|
-
| ----------------------------------------------------------- | -------------------------- |
|
|
239
|
-
| `context.fileName` | string or array of strings | The name of the context file(s).
|
|
240
|
-
| `context.
|
|
241
|
-
| `context.
|
|
242
|
-
| `context.
|
|
243
|
-
| `context.
|
|
244
|
-
| `context.fileFiltering.
|
|
245
|
-
| `context.fileFiltering.
|
|
246
|
-
| `context.fileFiltering.
|
|
247
|
-
| `context.fileFiltering.
|
|
248
|
-
| `context.
|
|
249
|
-
| `context.clearContextOnIdle.
|
|
250
|
-
| `context.clearContextOnIdle.
|
|
247
|
+
| Setting | Type | Description | Default |
|
|
248
|
+
| ----------------------------------------------------------- | -------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------- |
|
|
249
|
+
| `context.fileName` | string or array of strings | The name of the context file(s). | `undefined` |
|
|
250
|
+
| `context.autoCompactThreshold` | number | Fraction of the context window at which auto-compaction triggers. Must be greater than 0 and at most 1. Default is `0.7` (70%). For large context windows (>110K tokens), the absolute branch of the three-tier threshold system dominates, so values below ~0.7 may have no visible effect. Custom thresholds primarily affect small-window models (≤128K). Replaces the old `model.chatCompression.contextPercentageThreshold`. | `undefined` (uses internal 0.7) |
|
|
251
|
+
| `context.importFormat` | string | The format to use when importing memory. | `undefined` |
|
|
252
|
+
| `context.includeDirectories` | array | Additional directories to include in the workspace context. Specifies an array of additional absolute or relative paths to include in the workspace context. Missing directories will be skipped with a warning by default. Paths can use `~` to refer to the user's home directory. This setting can be combined with the `--include-directories` command-line flag. | `[]` |
|
|
253
|
+
| `context.loadFromIncludeDirectories` | boolean | Controls the behavior of the `/memory refresh` command. If set to `true`, `QWEN.md` files should be loaded from all directories that are added. If set to `false`, `QWEN.md` should only be loaded from the current directory. | `false` |
|
|
254
|
+
| `context.fileFiltering.respectGitIgnore` | boolean | Respect .gitignore files when searching. | `true` |
|
|
255
|
+
| `context.fileFiltering.respectQwenIgnore` | boolean | Respect .qwenignore and configured custom ignore files when searching. | `true` |
|
|
256
|
+
| `context.fileFiltering.customIgnoreFiles` | array | Project-root-relative ignore files to use instead of the default compatibility files (`.agentignore`, `.aiignore`) when `respectQwenIgnore` is enabled. `.qwenignore` is always included. | `[".agentignore", ".aiignore"]` |
|
|
257
|
+
| `context.fileFiltering.enableRecursiveFileSearch` | boolean | Whether to enable searching recursively for filenames under the current tree when completing `@` prefixes in the prompt. | `true` |
|
|
258
|
+
| `context.fileFiltering.enableFuzzySearch` | boolean | When `true`, enables fuzzy search capabilities when searching for files. Set to `false` to improve performance on projects with a large number of files. | `true` |
|
|
259
|
+
| `context.clearContextOnIdle.toolResultsThresholdMinutes` | number | Minutes of inactivity before clearing old tool result content. Use `-1` to disable the idle trigger. | `60` |
|
|
260
|
+
| `context.clearContextOnIdle.toolResultsNumToKeep` | integer | Integer number of most-recent compactable tool results to preserve when clearing. Values below 1 are floored to 1. | `5` |
|
|
261
|
+
| `context.clearContextOnIdle.toolResultsTotalCharsThreshold` | number | Total compactable tool result output characters allowed in history before clearing oldest results. Use `-1` to disable the size trigger. This is a soft threshold: protected recent tool results may keep the total above it. | `500000` |
|
|
251
262
|
|
|
252
263
|
#### Troubleshooting File Search Performance
|
|
253
264
|
|
|
@@ -276,6 +287,7 @@ If you are experiencing performance issues with file searching (e.g., with `@` c
|
|
|
276
287
|
| `tools.truncateToolOutputLines` | number | Maximum lines or entries kept when truncating tool output. Applies to Shell, Grep, Glob, ReadFile and ReadManyFiles tools. | `1000` | Requires restart: Yes |
|
|
277
288
|
| `tools.computerUse.enabled` | boolean | Enable the built-in Computer Use tools (cua-driver native desktop automation). When `true` (default), the `computer_use__*` tools are registered as deferred built-ins; the first invocation downloads the pinned, signed cua-driver binary into `~/.qwen/computer-use/` and walks through macOS Accessibility / Screen Recording permissions. | `true` | Requires restart: Yes |
|
|
278
289
|
| `tools.computerUse.maxImageDimension` | number | Longest-edge pixel cap applied to cua-driver screenshots (via `set_config`'s `max_image_dimension`). `-1` (default) keeps cua-driver's built-in default (1568); `0` disables resizing (full resolution); a positive value caps the longest edge. Lower caps cut vision-token cost at the expense of fine detail. | `-1` | Requires restart: Yes. Env override: `QWEN_COMPUTER_USE_MAX_IMAGE_DIMENSION` (a non-negative integer; takes precedence over this setting) |
|
|
290
|
+
| `tools.toolSearch.enabled` | boolean | Load MCP tools on demand via ToolSearch to reduce prompt size. Disable this for models that rely on prefix-based KV caching (e.g. DeepSeek) to keep the prompt prefix stable and maximize cache hit rates. | `true` | Requires restart: Yes |
|
|
279
291
|
|
|
280
292
|
> [!note]
|
|
281
293
|
>
|
|
@@ -283,12 +295,14 @@ If you are experiencing performance issues with file searching (e.g., with `@` c
|
|
|
283
295
|
|
|
284
296
|
#### memory
|
|
285
297
|
|
|
286
|
-
| Setting | Type | Description
|
|
287
|
-
| -------------------------------- | ------- |
|
|
288
|
-
| `memory.enableManagedAutoMemory` | boolean | Enable background extraction of memories from conversations.
|
|
289
|
-
| `memory.enableManagedAutoDream` | boolean | Enable automatic consolidation (deduplication and cleanup) of collected memories.
|
|
290
|
-
| `memory.enableAutoSkill` | boolean | Enable background review for reusable project skills after tool-heavy sessions.
|
|
291
|
-
| `memory.autoSkillConfirm` | boolean | Ask for confirmation before auto-generated skills are added to the skill library. When off, auto-skills are saved immediately.
|
|
298
|
+
| Setting | Type | Description | Default |
|
|
299
|
+
| -------------------------------- | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------- |
|
|
300
|
+
| `memory.enableManagedAutoMemory` | boolean | Enable background extraction of memories from conversations. | `true` |
|
|
301
|
+
| `memory.enableManagedAutoDream` | boolean | Enable automatic consolidation (deduplication and cleanup) of collected memories. | `true` |
|
|
302
|
+
| `memory.enableAutoSkill` | boolean | Enable background review for reusable project skills after tool-heavy sessions. | `true` |
|
|
303
|
+
| `memory.autoSkillConfirm` | boolean | Ask for confirmation before auto-generated skills are added to the skill library. When off, auto-skills are saved immediately. | `true` |
|
|
304
|
+
| `memory.enableTeamMemory` | boolean | Enable a project memory tier shared with collaborators via the git-tracked `.qwen/team-memory/` directory. Writes to it are secret-scanned and reviewable in the git diff. | `false` |
|
|
305
|
+
| `memory.enableTeamMemorySync` | boolean | When team memory is enabled, automatically commit, fast-forward-pull, and push the `.qwen/team-memory/` directory at session start so collaborators stay in sync. Requires a configured git upstream. | `false` |
|
|
292
306
|
|
|
293
307
|
See [Memory](../features/memory) for details on how auto-memory works and how to use the `/memory`, `/remember`, and `/dream` commands.
|
|
294
308
|
|
|
@@ -422,11 +436,11 @@ execute when typed.
|
|
|
422
436
|
|
|
423
437
|
#### mcp
|
|
424
438
|
|
|
425
|
-
| Setting | Type | Description
|
|
426
|
-
| ------------------- | ---------------- |
|
|
427
|
-
| `mcp.serverCommand` | string | Command to start an MCP server.
|
|
428
|
-
| `mcp.allowed` | array of strings | An allowlist of MCP servers to allow. Allows you to specify a list of MCP server names that should be made available to the model. This can be used to restrict the set of MCP servers to connect to. Note that this will be ignored if `--allowed-mcp-server-names` is set. | `undefined` |
|
|
429
|
-
| `mcp.excluded` | array of strings | A denylist of MCP servers to exclude. A server listed in both `mcp.excluded` and `mcp.allowed` is excluded. Note that this will be ignored if `--allowed-mcp-server-names` is set.
|
|
439
|
+
| Setting | Type | Description | Default |
|
|
440
|
+
| ------------------- | ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------- |
|
|
441
|
+
| `mcp.serverCommand` | string | Command to start an MCP server. | `undefined` |
|
|
442
|
+
| `mcp.allowed` | array of strings | An allowlist of MCP servers to allow. Allows you to specify a list of MCP server names that should be made available to the model. This can be used to restrict the set of MCP servers to connect to. Supports glob patterns (`*` matches any sequence, `?` matches a single character — e.g. `"*puppeteer*"`); entries without glob characters are matched exactly. Note that this will be ignored if `--allowed-mcp-server-names` is set. | `undefined` |
|
|
443
|
+
| `mcp.excluded` | array of strings | A denylist of MCP servers to exclude. A server listed in both `mcp.excluded` and `mcp.allowed` is excluded. Supports glob patterns (`*`, `?`) the same way as `mcp.allowed`. Note that this will be ignored if `--allowed-mcp-server-names` is set. | `undefined` |
|
|
430
444
|
|
|
431
445
|
> [!note]
|
|
432
446
|
>
|
|
@@ -300,6 +300,9 @@ reason inline and decide whether to switch to Ask Permissions Mode for that step
|
|
|
300
300
|
"deny": ["Any network call to intranet.example.com"],
|
|
301
301
|
},
|
|
302
302
|
"environment": ["Open-source monorepo; commits are signed"],
|
|
303
|
+
// Optional: route ALL shell commands (including read-only ones like
|
|
304
|
+
// ls, cat) through the classifier for defense-in-depth.
|
|
305
|
+
// "classifyAllShell": true,
|
|
303
306
|
},
|
|
304
307
|
},
|
|
305
308
|
}
|
|
@@ -43,6 +43,14 @@ The classifier uses your configured fast model
|
|
|
43
43
|
(`/model --fast`). If no fast model is configured, the main session
|
|
44
44
|
model is used instead.
|
|
45
45
|
|
|
46
|
+
> [!tip]
|
|
47
|
+
>
|
|
48
|
+
> Shell commands that the permission system detects as read-only (e.g.
|
|
49
|
+
> `ls`, `cat`, `git log`) are auto-approved before reaching the
|
|
50
|
+
> classifier. Set `permissions.autoMode.classifyAllShell: true` to
|
|
51
|
+
> override this and route all shell commands through the classifier —
|
|
52
|
+
> see [Classify all shell commands](#classify-all-shell-commands) below.
|
|
53
|
+
|
|
46
54
|
## Hard rules still win
|
|
47
55
|
|
|
48
56
|
Auto Mode does **not** replace hard permission rules. Before the classifier
|
|
@@ -145,6 +153,38 @@ To keep the classifier system prompt small:
|
|
|
145
153
|
way other permission settings are: arrays are concatenated and
|
|
146
154
|
de-duplicated.
|
|
147
155
|
|
|
156
|
+
### Classify all shell commands
|
|
157
|
+
|
|
158
|
+
By default, read-only shell commands (`ls`, `cat`, `git status`, …) are
|
|
159
|
+
auto-approved without invoking the classifier — the permission system
|
|
160
|
+
detects them as safe at layer 3 and skips the classifier entirely. Set
|
|
161
|
+
`classifyAllShell` to `true` to force **every** shell command through
|
|
162
|
+
the classifier, including read-only ones:
|
|
163
|
+
|
|
164
|
+
```json
|
|
165
|
+
{
|
|
166
|
+
"permissions": {
|
|
167
|
+
"autoMode": {
|
|
168
|
+
"classifyAllShell": true
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
This is useful for production or high-security environments where you
|
|
175
|
+
want defense-in-depth: even seemingly harmless commands are reviewed by
|
|
176
|
+
the classifier before execution. The trade-off is added latency (~300ms
|
|
177
|
+
per read-only shell call) and reliance on classifier availability — if
|
|
178
|
+
the classifier API is unreachable, read-only shell commands will also be
|
|
179
|
+
blocked (fail-closed).
|
|
180
|
+
|
|
181
|
+
> [!note]
|
|
182
|
+
>
|
|
183
|
+
> `classifyAllShell` only affects shell commands (`run_shell_command` and
|
|
184
|
+
> `monitor`). Built-in read-only tools (`read_file`, `grep_search`,
|
|
185
|
+
> `glob`, `list_directory`, etc.) are unaffected and still use the
|
|
186
|
+
> fast-path allowlist.
|
|
187
|
+
|
|
148
188
|
## Reading the decision
|
|
149
189
|
|
|
150
190
|
When the classifier blocks an action, the tool call fails with one of
|
|
@@ -47,24 +47,25 @@ Channels are configured under the `channels` key in `settings.json`. Each channe
|
|
|
47
47
|
|
|
48
48
|
### Options
|
|
49
49
|
|
|
50
|
-
| Option | Required | Description
|
|
51
|
-
| ------------------------ | -------- |
|
|
52
|
-
| `type` | Yes | Channel type: `telegram`, `weixin`, `qq`, `dingtalk`, `feishu`, or a custom type from an extension (see [Plugins](./plugins))
|
|
53
|
-
| `token` | Telegram | Bot token. Supports `$ENV_VAR` syntax to read from environment variables. Not needed for WeChat or DingTalk
|
|
54
|
-
| `clientId` | DingTalk | DingTalk AppKey. Supports `$ENV_VAR` syntax
|
|
55
|
-
| `clientSecret` | DingTalk | DingTalk AppSecret. Supports `$ENV_VAR` syntax
|
|
56
|
-
| `model` | No | Model to use for this channel (e.g., `qwen3.5-plus`). Overrides the default model. Useful for multimodal models that support image input
|
|
57
|
-
| `senderPolicy` | No | Who can talk to the bot: `allowlist` (default), `open`, or `pairing`
|
|
58
|
-
| `allowedUsers` | No | List of user IDs allowed to use the bot (used by `allowlist` and `pairing` policies)
|
|
59
|
-
| `sessionScope` | No | How sessions are scoped: `user` (default), `thread`, or `single`
|
|
60
|
-
| `cwd` | No | Working directory for the agent. Defaults to the current directory
|
|
61
|
-
| `instructions` | No | Custom instructions prepended to the first message of each session
|
|
62
|
-
| `groupPolicy` | No | Group chat access: `disabled` (default), `allowlist`, or `open`. See [Group Chats](#group-chats)
|
|
63
|
-
| `
|
|
64
|
-
| `
|
|
65
|
-
| `
|
|
66
|
-
| `
|
|
67
|
-
| `
|
|
50
|
+
| Option | Required | Description |
|
|
51
|
+
| ------------------------ | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
52
|
+
| `type` | Yes | Channel type: `telegram`, `weixin`, `qq`, `dingtalk`, `feishu`, or a custom type from an extension (see [Plugins](./plugins)) |
|
|
53
|
+
| `token` | Telegram | Bot token. Supports `$ENV_VAR` syntax to read from environment variables. Not needed for WeChat or DingTalk |
|
|
54
|
+
| `clientId` | DingTalk | DingTalk AppKey. Supports `$ENV_VAR` syntax |
|
|
55
|
+
| `clientSecret` | DingTalk | DingTalk AppSecret. Supports `$ENV_VAR` syntax |
|
|
56
|
+
| `model` | No | Model to use for this channel (e.g., `qwen3.5-plus`). Overrides the default model. Useful for multimodal models that support image input |
|
|
57
|
+
| `senderPolicy` | No | Who can talk to the bot: `allowlist` (default), `open`, or `pairing` |
|
|
58
|
+
| `allowedUsers` | No | List of user IDs allowed to use the bot (used by `allowlist` and `pairing` policies) |
|
|
59
|
+
| `sessionScope` | No | How sessions are scoped: `user` (default), `thread`, or `single` |
|
|
60
|
+
| `cwd` | No | Working directory for the agent. Defaults to the current directory |
|
|
61
|
+
| `instructions` | No | Custom instructions prepended to the first message of each session |
|
|
62
|
+
| `groupPolicy` | No | Group chat access: `disabled` (default), `allowlist`, or `open`. See [Group Chats](#group-chats) |
|
|
63
|
+
| `groupHistoryLimit` | No | Opt-in group history backfill. `0` or omitted disables it. A positive number persists that many authorized, unmentioned group messages for the next bot mention/reply. |
|
|
64
|
+
| `groups` | No | Per-group settings. Keys are group chat IDs or `"*"` for defaults. See [Group Chats](#group-chats) |
|
|
65
|
+
| `dispatchMode` | No | What happens when you send a message while the bot is busy: `steer` (default), `collect`, or `followup`. See [Dispatch Modes](#dispatch-modes) |
|
|
66
|
+
| `blockStreaming` | No | Progressive response delivery: `on` or `off` (default). See [Block Streaming](#block-streaming) |
|
|
67
|
+
| `blockStreamingChunk` | No | Chunk size bounds: `{ "minChars": 400, "maxChars": 1000 }`. See [Block Streaming](#block-streaming) |
|
|
68
|
+
| `blockStreamingCoalesce` | No | Idle flush: `{ "idleMs": 1500 }`. See [Block Streaming](#block-streaming) |
|
|
68
69
|
|
|
69
70
|
### Sender Policy
|
|
70
71
|
|
|
@@ -82,6 +83,18 @@ Controls how conversation sessions are managed:
|
|
|
82
83
|
- **`thread`** — One session per thread/topic. Useful for group chats with threads.
|
|
83
84
|
- **`single`** — One shared session for all users. Everyone shares the same conversation.
|
|
84
85
|
|
|
86
|
+
### Channel Memory
|
|
87
|
+
|
|
88
|
+
Channel memory lets an authorized channel member save stable context for one chat or thread. Qwen Code injects that memory when a fresh channel session starts, including after `/clear`.
|
|
89
|
+
|
|
90
|
+
Commands:
|
|
91
|
+
|
|
92
|
+
- `/remember-channel <text>` saves a memory line for the current chat or thread.
|
|
93
|
+
- `/channel-memory` shows saved memory for the current chat or thread.
|
|
94
|
+
- `/forget-channel confirm` clears saved memory for the current chat or thread.
|
|
95
|
+
|
|
96
|
+
Only users listed in `allowedUsers` can read, write, or clear channel memory. If `allowedUsers` is empty, channel memory commands are disabled for everyone.
|
|
97
|
+
|
|
85
98
|
### Token Security
|
|
86
99
|
|
|
87
100
|
Bot tokens should not be stored directly in `settings.json`. Instead, use environment variable references:
|
|
@@ -158,6 +171,38 @@ Configure per-group with the `groups` setting:
|
|
|
158
171
|
- **Group chat ID** — Override settings for a specific group. Overrides `"*"` defaults.
|
|
159
172
|
- **`requireMention`** (default: `true`) — When `true`, the bot only responds to messages that @mention it or reply to one of its messages. When `false`, the bot responds to all messages (useful for dedicated task groups).
|
|
160
173
|
|
|
174
|
+
### Group History Backfill
|
|
175
|
+
|
|
176
|
+
By default, Qwen ignores unmentioned group messages and does not store them as session turns. To let the next `@mention` include recent group context, set `groupHistoryLimit` to a positive number.
|
|
177
|
+
|
|
178
|
+
```json
|
|
179
|
+
{
|
|
180
|
+
"channels": {
|
|
181
|
+
"my-dingtalk": {
|
|
182
|
+
"type": "dingtalk",
|
|
183
|
+
"clientId": "$DINGTALK_CLIENT_ID",
|
|
184
|
+
"clientSecret": "$DINGTALK_CLIENT_SECRET",
|
|
185
|
+
"groupPolicy": "open",
|
|
186
|
+
"groupHistoryLimit": 50,
|
|
187
|
+
"groups": {
|
|
188
|
+
"*": { "requireMention": true },
|
|
189
|
+
"sensitive-group-id": {
|
|
190
|
+
"requireMention": true,
|
|
191
|
+
"groupHistoryLimit": 0
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
- Omitted or `0` disables backfill.
|
|
200
|
+
- Group-level `groupHistoryLimit` overrides the channel-level value.
|
|
201
|
+
- Only messages from authorized senders are persisted.
|
|
202
|
+
- Messages rejected by `groupPolicy` or group allowlist are not persisted.
|
|
203
|
+
- Pending group history is stored as local JSONL under `~/.qwen/channels/<channel-name>-group-history.jsonl` or `$QWEN_HOME/channels/<channel-name>-group-history.jsonl`.
|
|
204
|
+
- Cached messages are injected as untrusted context on the next real trigger and are not written as standalone session turns.
|
|
205
|
+
|
|
161
206
|
### How group messages are evaluated
|
|
162
207
|
|
|
163
208
|
```
|
|
@@ -312,6 +357,24 @@ qwen channel stop
|
|
|
312
357
|
|
|
313
358
|
The bot runs in the foreground. Press `Ctrl+C` to stop, or use `qwen channel stop` from another terminal.
|
|
314
359
|
|
|
360
|
+
### Experimental Daemon-Managed Mode
|
|
361
|
+
|
|
362
|
+
You can also run configured channels under `qwen serve`:
|
|
363
|
+
|
|
364
|
+
```bash
|
|
365
|
+
# Start one channel under the daemon lifecycle
|
|
366
|
+
qwen serve --channel my-channel
|
|
367
|
+
|
|
368
|
+
# Start all configured channels
|
|
369
|
+
qwen serve --channel all
|
|
370
|
+
```
|
|
371
|
+
|
|
372
|
+
This mode starts one channel worker process owned by `qwen serve`. The worker connects back to the daemon through the SDK and uses the same channel adapters. It is separate from the daemon process, so a channel adapter crash does not crash the daemon.
|
|
373
|
+
|
|
374
|
+
`qwen serve --channel` is not the same service as `qwen channel start`. Standalone `qwen channel start` still uses the ACP-backed channel service and can run channel configs with different `cwd` values. Daemon-managed channels require every selected channel's `cwd` to resolve to the daemon workspace.
|
|
375
|
+
|
|
376
|
+
When channels are serve-managed, `qwen channel status` shows the owner as `qwen serve`, and `qwen channel stop` tells you to stop the daemon instead of signaling the worker directly. If a ready worker exits unexpectedly, the daemon continues running and reports a channel-worker warning in `/daemon/status`.
|
|
377
|
+
|
|
315
378
|
### Multi-Channel Mode
|
|
316
379
|
|
|
317
380
|
When you run `qwen channel start` without a name, all channels defined in `settings.json` start together sharing a single agent process. Each channel maintains its own sessions — a Telegram user and a WeChat user get separate conversations, even though they share the same agent.
|
|
@@ -11,7 +11,7 @@ Channel plugins are loaded at startup from active extensions. When `qwen channel
|
|
|
11
11
|
3. Registers the channel type so it can be referenced in `settings.json`
|
|
12
12
|
4. Creates channel instances using the plugin's factory function
|
|
13
13
|
|
|
14
|
-
Your custom channel gets the full shared pipeline for free: sender gating, group policies, session routing, slash commands, crash recovery, and the
|
|
14
|
+
Your custom channel gets the full shared pipeline for free: sender gating, group policies, session routing, slash commands, crash recovery, and an agent bridge. Standalone `qwen channel start` currently supplies `AcpBridge`; plugin adapter code should depend on the adapter-facing `ChannelAgentBridge` contract. Existing TypeScript plugins with an explicit `AcpBridge` bridge parameter should migrate that annotation to `ChannelAgentBridge`; JavaScript plugins are unaffected at runtime.
|
|
15
15
|
|
|
16
16
|
## Installing a Custom Channel
|
|
17
17
|
|
|
@@ -28,8 +28,7 @@ The `/review` command runs a multi-stage pipeline:
|
|
|
28
28
|
```
|
|
29
29
|
Step 1: Determine scope (local diff / PR worktree / file)
|
|
30
30
|
Step 2: Load project review rules
|
|
31
|
-
Step 3:
|
|
32
|
-
Step 4: 9 parallel review agents [9 LLM calls]
|
|
31
|
+
Step 3: 9 parallel review agents [9 LLM calls]
|
|
33
32
|
|-- Agent 1: Correctness
|
|
34
33
|
|-- Agent 2: Security
|
|
35
34
|
|-- Agent 3: Code Quality
|
|
@@ -37,13 +36,12 @@ Step 4: 9 parallel review agents [9 LLM calls]
|
|
|
37
36
|
|-- Agent 5: Test Coverage
|
|
38
37
|
|-- Agent 6: Undirected Audit (3 personas: 6a/6b/6c)
|
|
39
38
|
'-- Agent 7: Build & Test (runs shell commands)
|
|
40
|
-
Step
|
|
41
|
-
Step
|
|
42
|
-
Step
|
|
43
|
-
Step
|
|
44
|
-
Step
|
|
45
|
-
Step
|
|
46
|
-
Step 11: Clean up (remove worktree + temp files)
|
|
39
|
+
Step 4: Deduplicate --> Batch verify --> Aggregate [1 LLM call]
|
|
40
|
+
Step 5: Iterative reverse audit (1-3 rounds, gap finding) [1-3 LLM calls]
|
|
41
|
+
Step 6: Present findings + verdict
|
|
42
|
+
Step 7: Submit PR review (inline comments, if requested)
|
|
43
|
+
Step 8: Save report + incremental cache
|
|
44
|
+
Step 9: Clean up (remove worktree + temp files)
|
|
47
45
|
```
|
|
48
46
|
|
|
49
47
|
### Review Agents
|
|
@@ -60,29 +58,6 @@ Step 11: Clean up (remove worktree + temp files)
|
|
|
60
58
|
|
|
61
59
|
All agents run in parallel (Agent 6 launches 3 persona variants concurrently, totaling 9 parallel tasks for same-repo reviews). Findings from Agents 1-6 are verified in a **single batch verification pass** (one agent reviews all findings at once, keeping verification cost fixed regardless of finding count). After verification, **iterative reverse audit** runs 1-3 rounds of gap-finding — each round receives the cumulative finding list from prior rounds, so successive rounds focus on whatever's left undiscovered. The loop stops as soon as a round returns "No issues found", or after 3 rounds (hard cap). Reverse audit findings skip verification (the agent already has full context) and are included as high-confidence results.
|
|
62
60
|
|
|
63
|
-
## Deterministic Analysis
|
|
64
|
-
|
|
65
|
-
Before the LLM agents run, `/review` automatically runs your project's existing linters and type checkers:
|
|
66
|
-
|
|
67
|
-
| Language | Tools detected |
|
|
68
|
-
| --------------------- | ---------------------------------------------------------------- |
|
|
69
|
-
| TypeScript/JavaScript | `tsc --noEmit`, `npm run lint`, `eslint` |
|
|
70
|
-
| Python | `ruff`, `mypy`, `flake8` |
|
|
71
|
-
| Rust | `cargo clippy` |
|
|
72
|
-
| Go | `go vet`, `golangci-lint` |
|
|
73
|
-
| Java | `mvn compile`, `checkstyle`, `spotbugs`, `pmd` |
|
|
74
|
-
| C/C++ | `clang-tidy` (if `compile_commands.json` available) |
|
|
75
|
-
| Other | Auto-discovered from CI config (`.github/workflows/*.yml`, etc.) |
|
|
76
|
-
|
|
77
|
-
For projects that don't match standard patterns (e.g., OpenJDK), `/review` reads CI configuration files to discover what lint/check commands the project uses. No user configuration needed.
|
|
78
|
-
|
|
79
|
-
Deterministic findings are tagged with `[linter]` or `[typecheck]` and skip LLM verification — they are ground truth.
|
|
80
|
-
|
|
81
|
-
- **Errors** → Critical severity
|
|
82
|
-
- **Warnings** → Nice to have (terminal only, not posted as PR comments)
|
|
83
|
-
|
|
84
|
-
If a tool is not installed or times out, it is skipped with an informational note.
|
|
85
|
-
|
|
86
61
|
## Severity Levels
|
|
87
62
|
|
|
88
63
|
| Severity | Meaning | Posted as PR comment? |
|
|
@@ -93,26 +68,12 @@ If a tool is not installed or times out, it is skipped with an informational not
|
|
|
93
68
|
|
|
94
69
|
Low-confidence findings appear in a separate "Needs Human Review" section in the terminal and are never posted as PR comments.
|
|
95
70
|
|
|
96
|
-
## Autofix
|
|
97
|
-
|
|
98
|
-
After presenting findings, `/review` offers to auto-apply fixes for Critical and Suggestion findings that have clear solutions:
|
|
99
|
-
|
|
100
|
-
```
|
|
101
|
-
Found 3 issues with auto-fixable suggestions. Apply auto-fixes? (y/n)
|
|
102
|
-
```
|
|
103
|
-
|
|
104
|
-
- Fixes are applied using the `edit` tool (targeted replacements, not full-file rewrites)
|
|
105
|
-
- Per-file linter checks run after fixes to verify they don't introduce new issues
|
|
106
|
-
- For PR reviews, fixes are committed and pushed from the worktree automatically — your working tree stays clean
|
|
107
|
-
- Nice to have and low-confidence findings are never auto-fixed
|
|
108
|
-
- PR review submission always uses the **pre-fix verdict** (e.g., "Request changes") since the remote PR hasn't been updated until the autofix push completes
|
|
109
|
-
|
|
110
71
|
## Worktree Isolation
|
|
111
72
|
|
|
112
73
|
When reviewing a PR, `/review` creates a temporary git worktree (`.qwen/tmp/review-pr-<number>`) instead of switching your current branch. This means:
|
|
113
74
|
|
|
114
75
|
- Your working tree, staged changes, and current branch are **never touched**
|
|
115
|
-
- Dependencies are installed in the worktree (`npm ci`, etc.) so
|
|
76
|
+
- Dependencies are installed in the worktree (`npm ci`, etc.) so build/test work
|
|
116
77
|
- Build and test commands run in isolation without polluting your local build cache
|
|
117
78
|
- If anything goes wrong, your environment is unaffected — just delete the worktree
|
|
118
79
|
- The worktree is automatically cleaned up after the review completes
|
|
@@ -127,15 +88,13 @@ You can review PRs from other repositories by passing the full URL:
|
|
|
127
88
|
/review https://github.com/other-org/other-repo/pull/456
|
|
128
89
|
```
|
|
129
90
|
|
|
130
|
-
This runs in **lightweight mode** — no worktree, no
|
|
91
|
+
This runs in **lightweight mode** — no worktree, no build/test. The review is based on the diff text only (fetched via GitHub API). PR comments can still be posted if you have write access.
|
|
131
92
|
|
|
132
93
|
| Capability | Same-repo | Cross-repo |
|
|
133
94
|
| ---------------------------------------------------------- | --------- | ----------------------------- |
|
|
134
95
|
| LLM review (Agents 1-6 + verify + iterative reverse audit) | ✅ | ✅ |
|
|
135
96
|
| Agent 7: Build & test | ✅ | ❌ (no local codebase) |
|
|
136
|
-
| Deterministic analysis (linter/typecheck) | ✅ | ❌ |
|
|
137
97
|
| Cross-file impact analysis | ✅ | ❌ |
|
|
138
|
-
| Autofix | ✅ | ❌ |
|
|
139
98
|
| PR inline comments | ✅ | ✅ (if you have write access) |
|
|
140
99
|
| Incremental review cache | ✅ | ❌ |
|
|
141
100
|
|
|
@@ -158,7 +117,7 @@ Or, after running `/review 123`, type `post comments` to publish findings withou
|
|
|
158
117
|
|
|
159
118
|
**What stays terminal-only:**
|
|
160
119
|
|
|
161
|
-
- Nice to have findings
|
|
120
|
+
- Nice to have findings
|
|
162
121
|
- Low-confidence findings
|
|
163
122
|
|
|
164
123
|
**Self-authored PRs:** GitHub does not allow you to submit `APPROVE` or `REQUEST_CHANGES` reviews on your own pull request — both fail with HTTP 422. When `/review` detects that the PR author matches the current authenticated user, it automatically downgrades the API event to `COMMENT` regardless of verdict, so the submission still succeeds. The terminal still shows the honest verdict ("Approve" / "Request changes" / "Comment") — only the GitHub-side review event is neutralized. The actual findings still appear as inline comments on specific lines, so substantive feedback is unchanged.
|
|
@@ -178,7 +137,7 @@ After the review, context-aware tips appear as ghost text. Press Tab to accept:
|
|
|
178
137
|
| PR review, zero findings | `post comments` | Approves the PR on GitHub (LGTM) |
|
|
179
138
|
| Local review, all clear | `commit` | Commits your changes |
|
|
180
139
|
|
|
181
|
-
Note: `fix these issues` is only available for local reviews. For PR reviews
|
|
140
|
+
Note: `fix these issues` is only available for local reviews. For PR reviews the worktree is cleaned up after the review, so post-review interactive fixing is not possible — use `--comment` or `post comments` to publish findings instead.
|
|
182
141
|
|
|
183
142
|
## Project Review Rules
|
|
184
143
|
|
|
@@ -241,7 +200,7 @@ For same-repo reviews, results are saved as a Markdown file in your project's `.
|
|
|
241
200
|
.qwen/reviews/2026-04-06-150510-local.md
|
|
242
201
|
```
|
|
243
202
|
|
|
244
|
-
Reports include: timestamp, diff stats,
|
|
203
|
+
Reports include: timestamp, diff stats, build/test results, all findings with verification status, and the verdict.
|
|
245
204
|
|
|
246
205
|
## Cross-file Impact Analysis
|
|
247
206
|
|
|
@@ -260,10 +219,9 @@ The review pipeline uses a bounded number of LLM calls regardless of how many fi
|
|
|
260
219
|
|
|
261
220
|
| Stage | LLM calls | Notes |
|
|
262
221
|
| -------------------------------- | ----------------- | --------------------------------------------------- |
|
|
263
|
-
|
|
|
264
|
-
|
|
|
265
|
-
|
|
|
266
|
-
| Iterative reverse audit (Step 6) | 1-3 | Loops until "No issues found" or 3-round cap |
|
|
222
|
+
| Review agents (Step 3) | 9 (or 8) | Run in parallel; Agent 7 skipped in cross-repo mode |
|
|
223
|
+
| Batch verification (Step 4) | 1 | Single agent verifies all findings at once |
|
|
224
|
+
| Iterative reverse audit (Step 5) | 1-3 | Loops until "No issues found" or 3-round cap |
|
|
267
225
|
| **Total** | **11-13 (10-12)** | Same-repo: 11-13; cross-repo: 10-12 (no Agent 7) |
|
|
268
226
|
|
|
269
227
|
Most PRs converge to the lower end of the range (1 reverse audit round); the cap prevents runaway cost on pathological cases.
|
|
@@ -273,8 +231,7 @@ Most PRs converge to the lower end of the range (1 reverse audit round); the cap
|
|
|
273
231
|
The review intentionally excludes:
|
|
274
232
|
|
|
275
233
|
- Pre-existing issues in unchanged code (focus on the diff only)
|
|
276
|
-
- Style
|
|
277
|
-
- Issues a linter or type checker would catch (handled by deterministic analysis)
|
|
234
|
+
- Style or formatting a formatter would auto-normalize, or naming matching your codebase conventions — but NOT substantive issues a linter or type checker would flag (unused variables, unreachable code, type errors), which are in scope
|
|
278
235
|
- Subjective "consider doing X" suggestions without a real problem
|
|
279
236
|
- Minor refactoring that doesn't fix a bug or risk
|
|
280
237
|
- Missing documentation unless the logic is genuinely confusing
|
|
@@ -285,7 +242,6 @@ The review intentionally excludes:
|
|
|
285
242
|
> **Silence is better than noise.** Every comment should be worth the reader's time.
|
|
286
243
|
|
|
287
244
|
- If unsure whether something is a problem → don't report it
|
|
288
|
-
- Linter/typecheck issues are handled by tools, not LLM guesses
|
|
289
245
|
- Same pattern across N files → aggregated into one finding
|
|
290
246
|
- PR comments are high-confidence only
|
|
291
|
-
-
|
|
247
|
+
- Cosmetic style/formatting matching codebase conventions is excluded
|
|
@@ -127,12 +127,12 @@ Commands for managing AI tools and models.
|
|
|
127
127
|
|
|
128
128
|
These commands invoke bundled skills that provide specialized workflows.
|
|
129
129
|
|
|
130
|
-
| Command | Description
|
|
131
|
-
| ------------ |
|
|
132
|
-
| `/review` | Review code changes with
|
|
133
|
-
| `/loop` | Run a prompt on a recurring schedule
|
|
134
|
-
| `/simplify` | Review recent changes and apply safe cleanup edits directly
|
|
135
|
-
| `/qc-helper` | Answer questions about Qwen Code usage and configuration
|
|
130
|
+
| Command | Description | Usage Examples |
|
|
131
|
+
| ------------ | ----------------------------------------------------------- | ------------------------------------------------- |
|
|
132
|
+
| `/review` | Review code changes with 9 parallel review agents | `/review`, `/review 123`, `/review 123 --comment` |
|
|
133
|
+
| `/loop` | Run a prompt on a recurring schedule | `/loop 5m check the build` |
|
|
134
|
+
| `/simplify` | Review recent changes and apply safe cleanup edits directly | `/simplify`, `/simplify focus on duplication` |
|
|
135
|
+
| `/qc-helper` | Answer questions about Qwen Code usage and configuration | `/qc-helper how do I configure MCP?` |
|
|
136
136
|
|
|
137
137
|
See [Code Review](./code-review.md) for full `/review` documentation.
|
|
138
138
|
|