@qwen-code/qwen-code 0.22.0 → 0.22.2-nightly.20260828.7357136dd1
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/computer-use/SKILL.md +229 -0
- package/bundled/computer-use/agents/openai.yaml +4 -0
- package/bundled/coordinate/SKILL.md +5 -5
- package/bundled/goal-draft/SKILL.md +109 -0
- package/bundled/qc-helper/docs/configuration/auth.md +7 -7
- package/bundled/qc-helper/docs/configuration/model-providers.md +70 -9
- package/bundled/qc-helper/docs/configuration/settings.md +48 -48
- package/bundled/qc-helper/docs/extension/introduction.md +3 -1
- package/bundled/qc-helper/docs/features/_meta.ts +1 -0
- package/bundled/qc-helper/docs/features/channels/_meta.ts +1 -0
- package/bundled/qc-helper/docs/features/channels/dingtalk.md +12 -0
- package/bundled/qc-helper/docs/features/channels/dws.md +120 -0
- package/bundled/qc-helper/docs/features/channels/overview.md +37 -6
- package/bundled/qc-helper/docs/features/code-review.md +27 -23
- package/bundled/qc-helper/docs/features/commands.md +4 -3
- package/bundled/qc-helper/docs/features/computer-use.md +57 -51
- package/bundled/qc-helper/docs/features/goals.md +58 -0
- package/bundled/qc-helper/docs/features/headless.md +13 -11
- package/bundled/qc-helper/docs/features/mcp.md +35 -12
- package/bundled/qc-helper/docs/features/status-line.md +3 -3
- package/bundled/qc-helper/docs/features/sub-agents.md +1 -1
- package/bundled/qc-helper/docs/features/worktree.md +1 -1
- package/bundled/qc-helper/docs/overview.md +1 -1
- package/bundled/qc-helper/docs/quickstart.md +1 -1
- package/bundled/qc-helper/docs/qwen-serve.md +29 -6
- package/bundled/review/SKILL.md +185 -435
- package/bundled/review/references/aone.md +18 -0
- package/bundled/review/references/persistence.md +109 -0
- package/bundled/review/references/posting.md +272 -0
- package/chunks/MaxSizedBox-LMWXCLDV.js +110 -0
- package/chunks/{StandaloneSessionPicker-KTHPCSR6.js → StandaloneSessionPicker-W3F7U3JL.js} +87 -88
- package/chunks/{acp-startup-profiler-T4GEAPLX.js → acp-startup-profiler-GNYAL6LI.js} +2 -2
- package/chunks/{acpAgent-CRY3JZ5O.js → acpAgent-EYZ6EEHD.js} +3223 -2145
- package/chunks/agent-RBLGBY65.js +95 -0
- package/chunks/agent-headless-L5T4Y4OZ.js +85 -0
- package/chunks/{anthropicContentGenerator-Y2OX6LS4.js → anthropicContentGenerator-GMHML35Q.js} +128 -59
- package/chunks/{artifact-tool-SBXMTVCB.js → artifact-tool-XSMPHZBT.js} +11 -3
- package/chunks/{askUserQuestion-KEQJRFD6.js → askUserQuestion-4SWJY65V.js} +2 -2
- package/chunks/bridge-5LR2F2ND.js +119 -0
- package/chunks/{ca-D3F4S6NG.js → ca-7HPYOYSZ.js} +3 -0
- package/chunks/{channel-management-service-IRTT7RNE.js → channel-management-service-KHR3N6CH.js} +6 -6
- package/chunks/channel-settings-store-4FOAZW72.js +120 -0
- package/chunks/{channel-worker-group-BJNMR2MP.js → channel-worker-group-6NA6BBZV.js} +9 -7
- package/chunks/{channel-worker-manager-EMA7CQDJ.js → channel-worker-manager-NEZ2J6RK.js} +11 -8
- package/chunks/{channel-worker-supervisor-F6I6WSWW.js → channel-worker-supervisor-FKU7DIHJ.js} +12 -6
- package/chunks/{chunk-HDKCKCYO.js → chunk-23RFD54N.js} +1 -1
- package/chunks/{read-package-up-UXSW3YPB.js → chunk-2EAZ43JQ.js} +1 -0
- package/chunks/{chunk-KM73TBQ4.js → chunk-2LD5U7Q3.js} +31 -0
- package/chunks/{chunk-GIWB5QLV.js → chunk-2SXSLSQE.js} +4 -4
- package/chunks/chunk-2TNL5KPM.js +49 -0
- package/chunks/chunk-335CJSNF.js +2320 -0
- package/chunks/chunk-36LGBEM6.js +130 -0
- package/chunks/{chunk-O5BDEWBC.js → chunk-3JXM2CVW.js} +3 -3
- package/chunks/{chunk-2E3V7G6Y.js → chunk-3K6TUZHS.js} +55 -50
- package/chunks/{chunk-WWUSHZ7M.js → chunk-3OOXT6CR.js} +5 -5
- package/chunks/{chunk-2UZJWSVD.js → chunk-3WK3QDNV.js} +2 -2
- package/chunks/{chunk-4J7OPYNS.js → chunk-3XOKEVII.js} +6 -6
- package/chunks/chunk-3Y34Q3JV.js +1584 -0
- package/chunks/{chunk-YMVFIYHV.js → chunk-42IDLQWS.js} +26 -20
- package/chunks/{chunk-7HFULI45.js → chunk-454XFGH4.js} +3 -3
- package/chunks/chunk-4CMJKUND.js +95 -0
- package/chunks/{chunk-XLDFW44M.js → chunk-4K7KNVWH.js} +3 -3
- package/chunks/{chunk-YDJRMQU4.js → chunk-4QHPPXK2.js} +16 -8
- package/chunks/{chunk-7KOFLDEP.js → chunk-5JTIYALA.js} +1 -1
- package/chunks/{chunk-CXJHQVEK.js → chunk-5PA6UEYA.js} +4 -0
- package/chunks/{chunk-7NBVNAJJ.js → chunk-62GQFYID.js} +3 -3
- package/chunks/{chunk-JGUBDRBC.js → chunk-6DIGWMGT.js} +3 -3
- package/chunks/{chunk-X7V3N6YH.js → chunk-6JCGO55P.js} +885 -3380
- package/chunks/{chunk-HIK2OF33.js → chunk-6PJOTWAN.js} +1 -1
- package/chunks/{chunk-VUMLT7E5.js → chunk-6W2IK5KC.js} +956 -17
- package/chunks/{chunk-S4C4JJKE.js → chunk-6ZZBRRKQ.js} +5 -5
- package/chunks/{chunk-W4CRPSC5.js → chunk-7EQQR46F.js} +1 -1
- package/chunks/{chunk-PHJJ3RVO.js → chunk-7GWQW5ID.js} +7 -15
- package/chunks/chunk-7J6OTNGO.js +424 -0
- package/chunks/{chunk-URN2JIAQ.js → chunk-7TUBJBBJ.js} +5 -1
- package/chunks/{chunk-A5F63FEW.js → chunk-7VD6IPQM.js} +1 -1
- package/chunks/{chunk-36OF5PRW.js → chunk-ABS25QER.js} +7 -3
- package/chunks/{chunk-UU4WC7DK.js → chunk-AJGR6E6Z.js} +117 -30
- package/chunks/{chunk-MQP3MHWN.js → chunk-AU3MMVJF.js} +43 -20
- package/chunks/{chunk-ZS5BHEPD.js → chunk-AXC26UCQ.js} +1 -1
- package/chunks/{chunk-PDL6LKB5.js → chunk-AY3BNYEQ.js} +1 -1
- package/chunks/{chunk-O5Z7EB6Y.js → chunk-AYHQZBJ4.js} +170 -207
- package/chunks/{chunk-WRT324N6.js → chunk-B466ZSHZ.js} +3 -3
- package/chunks/{chunk-5XHAOUWD.js → chunk-B5OUL5EL.js} +3 -3
- package/chunks/{chunk-GAHYKJPV.js → chunk-B5PHIJGI.js} +186 -60
- package/chunks/{chunk-IBJ5S45N.js → chunk-B7CDU2SL.js} +2 -2
- package/chunks/{chunk-UZPYR3EV.js → chunk-BFPESSTR.js} +1 -1
- package/chunks/{chunk-43T5WDQ7.js → chunk-BFSFJR3D.js} +1 -1
- package/chunks/{chunk-IWOWEENB.js → chunk-BKWNKLZB.js} +404 -44
- package/chunks/{chunk-3CLIDIVQ.js → chunk-BOWFGCEU.js} +3 -3
- package/chunks/{chunk-BB5IMQCV.js → chunk-BPAKYXQ3.js} +2 -2
- package/chunks/{chunk-ZRYQMWEP.js → chunk-BWORX6FA.js} +2 -2
- package/chunks/{chunk-AP3B7LKD.js → chunk-BXDAPVQU.js} +2 -2
- package/chunks/{chunk-NUGZAFR2.js → chunk-C2X7KY45.js} +147 -6
- package/chunks/{chunk-MZKWFWVG.js → chunk-C3KURPP7.js} +6 -6
- package/chunks/{chunk-WZDM44SB.js → chunk-CAJTKR6W.js} +7 -7
- package/chunks/{chunk-DB2OKNTU.js → chunk-CFJY4DGX.js} +2 -2
- package/chunks/{chunk-QKBYFU2Q.js → chunk-CFKIH3D3.js} +21 -1
- package/chunks/{chunk-I432KXWD.js → chunk-CMHFCLBU.js} +1 -1
- package/chunks/{create-sub-session-XBCVGNFU.js → chunk-CQH5KTKC.js} +4 -6
- package/chunks/{chunk-5HJUPACR.js → chunk-CRKKHXTI.js} +185 -174
- package/chunks/{chunk-L4HVF7LM.js → chunk-CYAUBK46.js} +3 -3
- package/chunks/{chunk-AZF6SME3.js → chunk-D5LUXLUH.js} +3 -3
- package/chunks/{chunk-RPJQ3O4M.js → chunk-DFDWJE6Z.js} +60 -53
- package/chunks/{chunk-KSPRQSB4.js → chunk-DIMEPKCW.js} +52 -12
- package/chunks/chunk-DJBQCO2E.js +842 -0
- package/chunks/{chunk-OVH5Y7KS.js → chunk-DP4MWIM3.js} +19 -3
- package/chunks/{chunk-LI4YHTQK.js → chunk-DYXFD5RO.js} +182 -3
- package/chunks/{chunk-NW35NVFN.js → chunk-E3XVSVKK.js} +26 -4
- package/chunks/{chunk-VSNPOSDN.js → chunk-EB6QRGHM.js} +108 -13
- package/chunks/{chunk-FVBVJEBG.js → chunk-EKNBU2X7.js} +10 -8
- package/chunks/{chunk-DJEHYM4H.js → chunk-EKSCLBBF.js} +3 -3
- package/chunks/{chunk-624NHDGB.js → chunk-ERFDKH32.js} +11 -0
- package/chunks/chunk-EW5VVLJT.js +3525 -0
- package/chunks/{chunk-T6XLJRQY.js → chunk-EWIQ3NAE.js} +38774 -6955
- package/chunks/{chunk-4XPSVIED.js → chunk-FALBWZF4.js} +6 -6
- package/chunks/chunk-FBX2SDQ4.js +48 -0
- package/chunks/{chunk-VMJL7RH6.js → chunk-FEHMA4RO.js} +539 -651
- package/chunks/{chunk-PXOJLJ5W.js → chunk-FMFBLTLY.js} +606 -223
- package/chunks/{chunk-ZLCT4C5A.js → chunk-FTF2YIZ5.js} +1 -1
- package/chunks/{chunk-IOSEW6KP.js → chunk-G6FECKTJ.js} +9 -6
- package/chunks/{chunk-RDG44S5I.js → chunk-GGNE3JAW.js} +2 -2
- package/chunks/chunk-GYTKQYDB.js +23 -0
- package/chunks/{chunk-B6UBOIFE.js → chunk-H33EQVMG.js} +14 -11
- package/chunks/chunk-H72BQNM3.js +645 -0
- package/chunks/{chunk-YZBDKFRQ.js → chunk-HGIMWQVT.js} +995 -892
- package/chunks/chunk-HOCJDUFY.js +20 -0
- package/chunks/{chunk-6UQSU7CQ.js → chunk-HPXV655A.js} +60 -107
- package/chunks/{chunk-45NQKMYB.js → chunk-HVC3PNVC.js} +1 -1
- package/chunks/{chunk-QJHPWLZC.js → chunk-HYDJDQGJ.js} +1 -1
- package/chunks/{chunk-7DMTAQJ6.js → chunk-IB7FQJRY.js} +163 -57
- package/chunks/{chunk-AW27A43Y.js → chunk-ICURCKIU.js} +1428 -120
- package/chunks/{chunk-4F5WV4RF.js → chunk-ISKH4QX3.js} +288 -15
- package/chunks/{chunk-SE55HQGF.js → chunk-J6S24ZJE.js} +92 -70
- package/chunks/{chunk-7DYNJFES.js → chunk-JB4JIVTJ.js} +6 -1
- package/chunks/{chunk-OARZJFZX.js → chunk-JN4IWWMN.js} +4 -4
- package/chunks/{chunk-6PCOVQO2.js → chunk-JUUBLSZU.js} +8 -8
- package/chunks/{chunk-FEMQ6Y7W.js → chunk-JWALNCLT.js} +47 -126
- package/chunks/{chunk-TBVSALA3.js → chunk-K5KXUXWC.js} +3 -3
- package/chunks/{chunk-XYQHT3AW.js → chunk-KTJFDCX4.js} +2 -2
- package/chunks/{chunk-6FRJEE2S.js → chunk-LEFCFTEX.js} +6 -6
- package/chunks/{chunk-BUGYW6FB.js → chunk-LEGTMYAE.js} +1 -1
- package/chunks/{chunk-MPHLIJYL.js → chunk-LLZA2IK3.js} +20 -8
- package/chunks/{chunk-BEGIBJAZ.js → chunk-LNETQKBE.js} +4 -4
- package/chunks/{chunk-KVGR4MCF.js → chunk-LUEHOUHM.js} +3 -3
- package/chunks/{chunk-2A4C2MEG.js → chunk-LVPZO674.js} +35 -12
- package/chunks/{chunk-25NESM4G.js → chunk-M4ORUPYI.js} +29 -5
- package/chunks/{chunk-VFACN2CE.js → chunk-M6FOJXW3.js} +1 -1
- package/chunks/{chunk-FYZMB6DB.js → chunk-MAYHGRP4.js} +12 -12
- package/chunks/{chunk-K3LPAED5.js → chunk-MQM5PJML.js} +24 -4
- package/chunks/{chunk-ZRFUT5VV.js → chunk-MTJN7FOT.js} +7 -7
- package/chunks/{chunk-BGXZBI5B.js → chunk-N4X7G4J2.js} +2 -1
- package/chunks/{chunk-2TRNCJK4.js → chunk-NIFYWDYN.js} +1 -1
- package/chunks/{chunk-SQS55KR4.js → chunk-NU7RKEZR.js} +2 -2
- package/chunks/{chunk-U2UYQMM6.js → chunk-NXMBRVMQ.js} +3 -3
- package/chunks/chunk-OI4NY7RA.js +346 -0
- package/chunks/{chunk-LURJYO2T.js → chunk-OZ6KS6KW.js} +4 -0
- package/chunks/{chunk-K52PZNU4.js → chunk-PDQGMSZK.js} +2 -2
- package/chunks/{chunk-PZRUV52H.js → chunk-PPKZ7JOE.js} +20 -2
- package/chunks/{chunk-SAH4BD2J.js → chunk-PQEISIKS.js} +67 -0
- package/chunks/{chunk-AO4M6NMD.js → chunk-PWIGAMA4.js} +146 -27
- package/chunks/{chunk-S3G6YFQC.js → chunk-QFCDF5PL.js} +1 -1
- package/chunks/chunk-QHMLYMMS.js +32 -0
- package/chunks/{chunk-5XUTPXQU.js → chunk-QPTRRPZU.js} +47 -13
- package/chunks/{chunk-UUQFJILB.js → chunk-RFI4YGMR.js} +34 -267
- package/chunks/{chunk-A6NRNRKE.js → chunk-RFIDDFAL.js} +1 -1
- package/chunks/chunk-RKFGE7JH.js +93 -0
- package/chunks/chunk-RNVFRIOO.js +275 -0
- package/chunks/{chunk-WU5E4HMO.js → chunk-RU7BK6B3.js} +1 -1
- package/chunks/{chunk-J5ZDDUKM.js → chunk-RVXDXY6I.js} +4 -4
- package/chunks/{chunk-OE52YHCZ.js → chunk-RWZB422L.js} +11 -11
- package/chunks/chunk-RXFQM6FQ.js +42 -0
- package/chunks/{chunk-MHG6NDS6.js → chunk-RYNZQGXN.js} +19 -2
- package/chunks/{chunk-4CWDWDL6.js → chunk-SJ5ERAW3.js} +1 -1
- package/chunks/{chunk-Q54XG7IX.js → chunk-SMPR7SPO.js} +1 -1
- package/chunks/{chunk-UIRLQ3N7.js → chunk-SRZZY4IY.js} +3 -3
- package/chunks/{chunk-ND7NOI4P.js → chunk-STUJ7IMZ.js} +0 -92
- package/chunks/{chunk-VYC7XFYV.js → chunk-SUX7HDNA.js} +5 -5
- package/chunks/{chunk-ZZUVC6RI.js → chunk-SVNO44PF.js} +3 -3
- package/chunks/{chunk-FDD2IUEL.js → chunk-SZLBBZH4.js} +370 -35
- package/chunks/{chunk-GHY5OIYP.js → chunk-T2NKRHZZ.js} +13 -13
- package/chunks/chunk-T4EFG2P5.js +113 -0
- package/chunks/{chunk-BMCSKS37.js → chunk-TLHUNMO7.js} +6 -6
- package/chunks/{chunk-JOLJTKIG.js → chunk-TPI7O7HR.js} +1 -1
- package/chunks/{chunk-6QSA4JHL.js → chunk-TQHGJYR3.js} +4492 -1121
- package/chunks/{chunk-ISJMN3ML.js → chunk-TTX2JUE6.js} +1 -1
- package/chunks/{chunk-EFB657PR.js → chunk-TW3E6YNO.js} +3 -3
- package/chunks/{chunk-LD5VIJ7S.js → chunk-TWSKM647.js} +1 -1
- package/chunks/chunk-U54AYGEC.js +337 -0
- package/chunks/{chunk-A5F2YNO6.js → chunk-UHQFIS7N.js} +260 -10
- package/chunks/{chunk-6NFAEG54.js → chunk-UTLCH2FK.js} +24 -13
- package/chunks/{chunk-7JBHIQS2.js → chunk-UY3PBNY3.js} +19 -37
- package/chunks/{chunk-DWCKACFL.js → chunk-V2NDP3I4.js} +2 -2
- package/chunks/{chunk-2GXYDNXP.js → chunk-V2QDDC5J.js} +19 -9
- package/chunks/{chunk-VLRBJ24J.js → chunk-V5J4J5TP.js} +2 -2
- package/chunks/{chunk-X2UOOG5V.js → chunk-VQUGEVGR.js} +1 -1
- package/chunks/{chunk-RDQ7QB4Y.js → chunk-VTHREBQM.js} +2 -2
- package/chunks/{chunk-YLFLHKDL.js → chunk-W3N5XAZ6.js} +1 -1
- package/chunks/{chunk-62JOGZL5.js → chunk-W6DUQ5GA.js} +11497 -10502
- package/chunks/{chunk-P47E4SJC.js → chunk-WALC5VJH.js} +4 -4
- package/chunks/{chunk-3ZFJUBTP.js → chunk-WAOIHTJS.js} +1 -1
- package/chunks/{chunk-KIVGVFMM.js → chunk-WBHKK3CU.js} +16 -4
- package/chunks/{chunk-XZJKSETB.js → chunk-WXEA74YB.js} +3 -3
- package/chunks/{chunk-VEND4KA4.js → chunk-X3ZRTCJD.js} +1 -1
- package/chunks/{chunk-YRLW2MSX.js → chunk-XBVNNDPK.js} +11 -4
- package/chunks/{chunk-XL5K4SVK.js → chunk-XF63PKEN.js} +1 -1
- package/chunks/{chunk-LDGWX737.js → chunk-XLLQJRAH.js} +323 -510
- package/chunks/{chunk-2Z6LSQMF.js → chunk-XQFT3QUF.js} +1 -1
- package/chunks/{chunk-P3QQPMQA.js → chunk-XZA32HII.js} +4 -4
- package/chunks/{chunk-C72BXMJ5.js → chunk-Y3QL45LS.js} +1 -1
- package/chunks/{chunk-QS4ENGVF.js → chunk-Y4TPOUEV.js} +17 -8
- package/chunks/{chunk-AVCCKIZ6.js → chunk-YRZX2PHA.js} +1 -1
- package/chunks/{chunk-Z3JMO2CH.js → chunk-YTDVNSUQ.js} +1 -1
- package/chunks/{chunk-WS7PAXXR.js → chunk-YWQ237GX.js} +15 -199
- package/chunks/chunk-ZELCTN6Y.js +29 -0
- package/chunks/{chunk-TQOF5KBL.js → chunk-ZEZKIS2K.js} +0 -31
- package/chunks/{chunk-IIWGSX4L.js → chunk-ZTP35P4B.js} +1 -1
- package/chunks/{chunk-K623ENWT.js → chunk-ZU4UDIWX.js} +23 -1
- package/chunks/chunk-ZYNTSXWK.js +32 -0
- package/chunks/config-utils-JVGAP34H.js +113 -0
- package/chunks/contextCommand-XDB7OSO7.js +106 -0
- package/chunks/{core-runtime-CES6JSVV.js → core-runtime-XHYA2RH7.js} +66 -63
- package/chunks/create-sub-session-23ITIELI.js +17 -0
- package/chunks/{create-sub-session-UJTPMVOG.js → create-sub-session-MHYCFNCM.js} +168 -87
- package/chunks/{cron-create-IKA56DAF.js → cron-create-KJ4IY6PP.js} +57 -10
- package/chunks/{cron-delete-K5Q62EGH.js → cron-delete-MBLQCAYY.js} +4 -4
- package/chunks/{cron-list-QBFGAMP7.js → cron-list-DWH2PQ47.js} +4 -4
- package/chunks/{daemon-RZZUPGOJ.js → daemon-K5XS42ID.js} +567 -27
- package/chunks/{daemon-git-worktree-guard-3QY2BQYB.js → daemon-git-worktree-guard-V3P5XLHB.js} +339 -95
- package/chunks/daemon-status-provider-KKU7ZTLM.js +117 -0
- package/chunks/daemon-trust-policy-TZGK34DW.js +112 -0
- package/chunks/{daemon-trust-policy-monitor-TK4K7M63.js → daemon-trust-policy-monitor-F23DD2M4.js} +69 -69
- package/chunks/{de-RYUHH2C6.js → de-X6HLSIFE.js} +1 -0
- package/chunks/deferred-core-runtime-LKLGBCGZ.js +114 -0
- package/chunks/{display-image-OEJMJV3S.js → display-image-BE7I6ZB6.js} +5 -5
- package/chunks/{dist-5EV2G6MC.js → dist-4WXLCBDR.js} +1 -1
- package/chunks/{dist-ES6HNUW2.js → dist-5VXFRTWU.js} +525 -64
- package/chunks/{dist-ESS34DHC.js → dist-6BPYWHVD.js} +89 -65
- package/chunks/{dist-2OG3PGKO.js → dist-GFN5DCBX.js} +76 -67
- package/chunks/{dist-K7IQB53U.js → dist-HZNT6GQS.js} +1 -1
- package/chunks/{dist-J6P3C52Z.js → dist-LVZCXVPF.js} +99 -26
- package/chunks/{dist-LZO24N3E.js → dist-N6W6E753.js} +71 -64
- package/chunks/dist-QDLFKWOL.js +2512 -0
- package/chunks/{dist-VVQBOKDH.js → dist-SWQMYP2Q.js} +18 -16
- package/chunks/earlyInputCapture-NERYFYTR.js +107 -0
- package/chunks/{edit-A2633SLR.js → edit-ACCATIXB.js} +49 -51
- package/chunks/{en-3RHLPITS.js → en-YLXBXM4Z.js} +5 -1
- package/chunks/{enter-worktree-OIAHE2TB.js → enter-worktree-35QCAAFP.js} +7 -8
- package/chunks/{enterPlanMode-SUGIKLR7.js → enterPlanMode-NEN6EPVM.js} +48 -50
- package/chunks/environment-CKWHBC5T.js +129 -0
- package/chunks/errors-XTZPNQ77.js +113 -0
- package/chunks/{exit-worktree-3UT3SSWT.js → exit-worktree-XQD6D543.js} +7 -8
- package/chunks/exitPlanMode-CY344X5J.js +83 -0
- package/chunks/{fast-path-3AVP3G35.js → fast-path-YSOX4PAM.js} +31 -10
- package/chunks/{fast-path-settings-WHX3J3ZI.js → fast-path-settings-XMFBYFUH.js} +2 -2
- package/chunks/{fr-4PL5GHG4.js → fr-FTZWF462.js} +1 -0
- package/chunks/{gemini-7PVQWHTH.js → gemini-VQY2YCPH.js} +137 -129
- package/chunks/{geminiContentGenerator-B2FOJJDJ.js → geminiContentGenerator-PAPXNIGU.js} +16 -13
- package/chunks/{glob-7YGXE6OV.js → glob-GVCUSBBF.js} +48 -50
- package/chunks/{goal-tools-TLJCE7YZ.js → goal-tools-5STK6OXW.js} +77 -31
- package/chunks/{grep-6DV6LTON.js → grep-5GPICQBU.js} +6 -6
- package/chunks/handleAutoUpdate-ZJPJN42W.js +109 -0
- package/chunks/i18n-BZYKOST7.js +124 -0
- package/chunks/{image-gen-7CSCJ73T.js → image-gen-J6FDGUZP.js} +8 -12
- package/chunks/initializer-GO2C5HE3.js +113 -0
- package/chunks/installationInfo-WM2GXQZ6.js +107 -0
- package/chunks/{ja-HZ7X7PQO.js → ja-2GL5FKYJ.js} +1 -0
- package/chunks/{keychain-token-storage-MTFTAESK.js → keychain-token-storage-37XPR34V.js} +2 -2
- package/chunks/list-ERDJB7PQ.js +116 -0
- package/chunks/{list-agents-43XUEXJV.js → list-agents-DI3YFTDT.js} +2 -2
- package/chunks/loadedSettingsAdapter-7JOCVOKV.js +110 -0
- package/chunks/{loggingContentGenerator-RNE66CKK.js → loggingContentGenerator-3ONLU3BS.js} +327 -39
- package/chunks/{loop-wakeup-E54KDUXC.js → loop-wakeup-XJFONSQ7.js} +5 -5
- package/chunks/{ls-CGL2UC3H.js → ls-3VAT2J7A.js} +4 -4
- package/chunks/{lsp-5IKUO5DX.js → lsp-5W7IRUBH.js} +2 -2
- package/chunks/{managed-npm-update-Y3SC3GLJ.js → managed-npm-update-TLRCC2GE.js} +62 -62
- package/chunks/mcp-2LH3QXR2.js +110 -0
- package/chunks/{monitor-PXYSGSUN.js → monitor-P7LDAL4W.js} +48 -50
- package/chunks/nonInteractiveCli-E5T7PZ27.js +184 -0
- package/chunks/{notebook-edit-ISIBJVBR.js → notebook-edit-F7KSG4WQ.js} +49 -51
- package/chunks/open-with-auth-4UI3KHUR.js +55 -0
- package/chunks/{openaiContentGenerator-6TBOPEGT.js → openaiContentGenerator-2EXCZUGN.js} +29 -32
- package/chunks/pidfile-P25DWA5Q.js +111 -0
- package/chunks/process-registry-OAEG6WGC.js +662 -0
- package/chunks/{processUtils-YK2TDTTU.js → processUtils-PVDKBL35.js} +2 -2
- package/chunks/prompt-terminal-ledger-AJ7T7OIV.js +105 -0
- package/chunks/{pt-QT5N2Q6Q.js → pt-XN2YWJVM.js} +1 -0
- package/chunks/{qwenContentGenerator-CLDMA2Y4.js → qwenContentGenerator-TBBRLWIT.js} +54 -62
- package/chunks/{qwenOAuth2-DLDR6UC5.js → qwenOAuth2-OF5WRBQT.js} +7 -11
- package/chunks/read-file-6IIY4RLJ.js +32 -0
- package/chunks/{read-mcp-resource-XYES2B42.js → read-mcp-resource-XD257PGJ.js} +2 -2
- package/chunks/read-package-up-6T6ICKR7.js +13 -0
- package/chunks/{record-artifact-W3IBTGL7.js → record-artifact-VW23GS4F.js} +4 -5
- package/chunks/report-findings-XA3FJG3N.js +33 -0
- package/chunks/request-shutdown-BCLA3JV2.js +133 -0
- package/chunks/resumeHistoryUtils-44IETXDY.js +118 -0
- package/chunks/ripGrep-E7ESZ7SS.js +39 -0
- package/chunks/{ru-STMG5BPD.js → ru-OLTMFJEW.js} +1 -0
- package/chunks/{run-qwen-serve-XJHOW2NY.js → run-qwen-serve-DXBCYW7V.js} +924 -356
- package/chunks/runtime-RUSPD35D.js +148 -0
- package/chunks/scheduled-tasks-DVRJZO6I.js +127 -0
- package/chunks/scheduler-TDRB2NSY.js +122 -0
- package/chunks/{sdk-exporters-http-RSIOP3G2.js → sdk-exporters-http-TTU2CHBU.js} +5 -5
- package/chunks/{sdk-impl-CB3KARSK.js → sdk-impl-UUMVYMAL.js} +12 -6
- package/chunks/{send-message-J4VT46OI.js → send-message-AJ4OCUBV.js} +24 -29
- package/chunks/serve-KITOM7OR.js +118 -0
- package/chunks/{server-74ONDK62.js → server-THCOMUC2.js} +5814 -4549
- package/chunks/{session-BO6VBWJP.js → session-XKR5MPXE.js} +152 -142
- package/chunks/session-pr-refresh-KRBH7KDA.js +278 -0
- package/chunks/{settings-35QZNFDG.js → settings-YXZ4XBKK.js} +72 -72
- package/chunks/shell-5FJ2DZ3W.js +93 -0
- package/chunks/{skill-DKEMQSNJ.js → skill-VMMJZ6CJ.js} +161 -33
- package/chunks/skill-settings-7SG4YA2W.js +118 -0
- package/chunks/spawnChannel-BPMIXRBI.js +112 -0
- package/chunks/standalone-update-QN5HFRIC.js +118 -0
- package/chunks/{startInteractiveUI-J2QSGWPU.js → startInteractiveUI-5A7RQFRP.js} +3139 -2438
- package/chunks/{syntheticOutput-JAXMIMZP.js → syntheticOutput-ML43GEFN.js} +3 -3
- package/chunks/{task-create-I2H322E4.js → task-create-QN4LYRSE.js} +11 -11
- package/chunks/{task-list-3OLIWFTQ.js → task-list-JPLGK45U.js} +5 -5
- package/chunks/{task-stop-JAUY6MSY.js → task-stop-CXEH5L2D.js} +2 -2
- package/chunks/{task-update-B3XO4CPI.js → task-update-IWEOJFV2.js} +11 -11
- package/chunks/{team-create-W534PMGX.js → team-create-HVGVUL2L.js} +49 -51
- package/chunks/{team-delete-Q7GE7RRI.js → team-delete-RZVVSGCY.js} +5 -5
- package/chunks/{team-plan-approval-WNV6P6NG.js → team-plan-approval-S5A5FQWU.js} +48 -50
- package/chunks/terminal-image-renderer-SIVPPXDI.js +114 -0
- package/chunks/theme-manager-TA33UZZX.js +102 -0
- package/chunks/{todoWrite-FJJTY2TI.js → todoWrite-WDJNQEMW.js} +43 -25
- package/chunks/{tool-search-Y4KL3LRE.js → tool-search-NX7IPDKP.js} +19 -20
- package/chunks/total-session-admission-PWXZBOVX.js +114 -0
- package/chunks/trustedFolders-V6Y4CU3F.js +122 -0
- package/chunks/{update-relaunch-OHVFN6KF.js → update-relaunch-CGSX3R37.js} +6 -6
- package/chunks/updateCheck-T5O2WGIB.js +118 -0
- package/chunks/useAutoAcceptIndicator-ULBJJWPY.js +120 -0
- package/chunks/{validateNonInterActiveAuth-WJXH426F.js → validateNonInterActiveAuth-E5S2JSRC.js} +114 -108
- package/chunks/{version-QMDRADXM.js → version-LS5JPU36.js} +2 -2
- package/chunks/{web-fetch-ROS6P4LP.js → web-fetch-RLMFZTS3.js} +25 -244
- package/chunks/{web-search-JS3E76O6.js → web-search-LMCIC4N5.js} +11 -13
- package/chunks/{web-shell-static-3NUTRHAH.js → web-shell-static-A6QMUNNV.js} +11 -4
- package/chunks/webapi-Z5OM224P.js +4118 -0
- package/chunks/{workflow-2FCMBTBZ.js → workflow-JBXU3IGA.js} +713 -138
- package/chunks/workspace-providers-status-525ORQBH.js +114 -0
- package/chunks/{workspace-registration-store-SU4EJKSD.js → workspace-registration-store-7Y44R4LV.js} +1 -1
- package/chunks/workspace-registry-HS4RWUSQ.js +123 -0
- package/chunks/workspace-service-7PXDM6EB.js +129 -0
- package/chunks/workspace-skills-status-FMJGC2XI.js +113 -0
- package/chunks/{workspace-trust-reconciler-4Y4F7XIX.js → workspace-trust-reconciler-3YTWSQBY.js} +78 -77
- package/chunks/write-file-BVQRYQQO.js +88 -0
- package/chunks/{zh-TW-NX43Z2S2.js → zh-TW-RPTMRTHG.js} +5 -1
- package/chunks/{zh-3JQ75KFU.js → zh-UNY63FR3.js} +5 -1
- package/chunks/{zoom-image-DNBKCGGF.js → zoom-image-FGCELNS4.js} +14 -15
- package/cli.js +13 -13
- package/locales/ca.js +3 -0
- package/locales/de.js +1 -0
- package/locales/en.js +5 -0
- package/locales/fr.js +1 -0
- package/locales/ja.js +1 -0
- package/locales/pt.js +1 -0
- package/locales/ru.js +1 -0
- package/locales/zh-TW.js +5 -0
- package/locales/zh.js +5 -0
- package/package.json +3 -3
- package/web-shell/assets/{abnfDiagram-VCTEODGH-DWHXEVlf.js → abnfDiagram-VCTEODGH-2XZDeWYO.js} +1 -1
- package/web-shell/assets/{arc-CXKjm86V.js → arc-B6UgMh90.js} +1 -1
- package/web-shell/assets/{architectureDiagram-5GKGNRK7-B_ynI0cX.js → architectureDiagram-5GKGNRK7-DZgNFeN1.js} +1 -1
- package/web-shell/assets/{blockDiagram-NRAW4CY4-DMebd9X0.js → blockDiagram-NRAW4CY4-DQ2wvBFN.js} +1 -1
- package/web-shell/assets/{c4Diagram-UCG6FXSJ-BZ5BlxS-.js → c4Diagram-UCG6FXSJ-DMmQMrc4.js} +1 -1
- package/web-shell/assets/channel-D_TyfiTx.js +1 -0
- package/web-shell/assets/{chunk-2Q5K7J3B-CluJKopE.js → chunk-2Q5K7J3B-C8Zh2e9y.js} +1 -1
- package/web-shell/assets/{chunk-5VM5RSS4-hzDAPFOo.js → chunk-5VM5RSS4-C3LTenP8.js} +1 -1
- package/web-shell/assets/{chunk-F27PBJKO-6vHioKJe.js → chunk-F27PBJKO-CxABOc8n.js} +1 -1
- package/web-shell/assets/{chunk-G27WJ6UU-B_5hKTGo.js → chunk-G27WJ6UU-CD_JxHDC.js} +1 -1
- package/web-shell/assets/{chunk-JWPE2WC7-CO9VoFCH.js → chunk-JWPE2WC7-BdmZPmce.js} +1 -1
- package/web-shell/assets/{chunk-LCL6LL3I-7L5JpxYu.js → chunk-LCL6LL3I-80bcHmfK.js} +1 -1
- package/web-shell/assets/{chunk-POPQ4Y6H-DHLJMAqj.js → chunk-POPQ4Y6H-CNpLZyQF.js} +1 -1
- package/web-shell/assets/{chunk-SVP7TREG-Dt-4Cqdl.js → chunk-SVP7TREG-CXlKgMv3.js} +1 -1
- package/web-shell/assets/{chunk-XXDRQBXY-QlSQ3ssG.js → chunk-XXDRQBXY-CivyYyvL.js} +1 -1
- package/web-shell/assets/classDiagram-DTDB5LWJ-Bw_H3xMd.js +1 -0
- package/web-shell/assets/classDiagram-v2-JRS7N3AN-Bw_H3xMd.js +1 -0
- package/web-shell/assets/{cose-bilkent-JH36ORCC-DMw3EOxl.js → cose-bilkent-JH36ORCC-COAjRH3w.js} +1 -1
- package/web-shell/assets/{cynefin-OW5HDTMX-s6vEA7RQ.js → cynefin-OW5HDTMX-DqU1JHO6.js} +1 -1
- package/web-shell/assets/{cynefinDiagram-5FMLGOSQ-AOKsvYLt.js → cynefinDiagram-5FMLGOSQ-BCLI1Bvj.js} +1 -1
- package/web-shell/assets/{dagre-3AP2YEHR-9QAZn3m7.js → dagre-3AP2YEHR-DmAz8nqF.js} +1 -1
- package/web-shell/assets/{diagram-S7CK7UJ4-CWpnu4FN.js → diagram-S7CK7UJ4-Ck-5QLT5.js} +1 -1
- package/web-shell/assets/{diagram-UQ7AKVKN-9l0jXD8q.js → diagram-UQ7AKVKN-C0ljX0mW.js} +1 -1
- package/web-shell/assets/{diagram-VSXAHHWV-BMUHroj4.js → diagram-VSXAHHWV-DPgvT24v.js} +1 -1
- package/web-shell/assets/{diagram-VX7I27RA-Co9x27vm.js → diagram-VX7I27RA-D7hWr1LR.js} +1 -1
- package/web-shell/assets/{diagram-Z3DM3KII-BKnTeOER.js → diagram-Z3DM3KII-D59tlOta.js} +1 -1
- package/web-shell/assets/{ebnfDiagram-PWID7BFC-QBZD9CKG.js → ebnfDiagram-PWID7BFC-CY2DDx00.js} +1 -1
- package/web-shell/assets/{erDiagram-SSCWMZ5O-dKWAEGun.js → erDiagram-SSCWMZ5O-AR4h8Q8k.js} +1 -1
- package/web-shell/assets/{flowDiagram-A5DVABFB-CR_UgVqj.js → flowDiagram-A5DVABFB-DbF0HqBz.js} +1 -1
- package/web-shell/assets/{ganttDiagram-EL5Y4UJY-DQUnjWO6.js → ganttDiagram-EL5Y4UJY-J52mrIhc.js} +1 -1
- package/web-shell/assets/{gitGraphDiagram-WWUBYQGX-C4j59wPL.js → gitGraphDiagram-WWUBYQGX-CcgMY5EV.js} +1 -1
- package/web-shell/assets/index-BjUg3vPr.css +5 -0
- package/web-shell/assets/index-CFwYYVFU.js +1873 -0
- package/web-shell/assets/{index-tYXRIPz4.js → index-MQs7l15A.js} +1 -1
- package/web-shell/assets/{infoDiagram-RXCK75RN-mzqbt50w.js → infoDiagram-RXCK75RN-Buu3ibp2.js} +1 -1
- package/web-shell/assets/{ishikawaDiagram-5VMMS53U-ChLOqhGl.js → ishikawaDiagram-5VMMS53U-CoKQxnF3.js} +1 -1
- package/web-shell/assets/{journeyDiagram-EYS64GPL-SifZE-R8.js → journeyDiagram-EYS64GPL-CxK35mTC.js} +1 -1
- package/web-shell/assets/{kanban-definition-3QL26DDD-Sft2qlbc.js → kanban-definition-3QL26DDD-tk2CHTQ1.js} +1 -1
- package/web-shell/assets/{layout-O2uHVkPd.js → layout-DEpMwb4u.js} +1 -1
- package/web-shell/assets/{linear-BVqYgjSc.js → linear-DSQsLh53.js} +1 -1
- package/web-shell/assets/{mermaid.core-CZ9MQaJ6.js → mermaid.core-DIZuPBQT.js} +6 -6
- package/web-shell/assets/{mindmap-definition-FBJOCRG2-BNQYjBqM.js → mindmap-definition-FBJOCRG2-CCAvk8r_.js} +1 -1
- package/web-shell/assets/{pegDiagram-XKGWAZYB-rh1J8uv6.js → pegDiagram-XKGWAZYB-CpJ28jxz.js} +1 -1
- package/web-shell/assets/{pieDiagram-E7YTZNPT-BQHR5mn9.js → pieDiagram-E7YTZNPT-ziJR2R32.js} +1 -1
- package/web-shell/assets/{quadrantDiagram-AXDQQJYC-CLCbP7mK.js → quadrantDiagram-AXDQQJYC-B60zE3Mh.js} +1 -1
- package/web-shell/assets/{railroadDiagram-O6MQD6OU-CDQhrkbm.js → railroadDiagram-O6MQD6OU-M3GqQ_g1.js} +1 -1
- package/web-shell/assets/{requirementDiagram-EFPCY7ZU-BdP9uswg.js → requirementDiagram-EFPCY7ZU-ntCtYqTk.js} +1 -1
- package/web-shell/assets/{sankeyDiagram-P5KCCOFB-CFZDFBXF.js → sankeyDiagram-P5KCCOFB-AYLoItcZ.js} +1 -1
- package/web-shell/assets/{sequenceDiagram-WJ2MYXX4-BW9WOJXI.js → sequenceDiagram-WJ2MYXX4-DEWk4Mlj.js} +1 -1
- package/web-shell/assets/{sizeCapture-X5ZJPWSS-CPMia32z.js → sizeCapture-X5ZJPWSS-OOWvzPay.js} +1 -1
- package/web-shell/assets/{stateDiagram-HBIQ2CUA-BANp9p7F.js → stateDiagram-HBIQ2CUA-BcMmvxem.js} +1 -1
- package/web-shell/assets/stateDiagram-v2-4QOOHH4V-DRLLqPWO.js +1 -0
- package/web-shell/assets/{swimlanes-XN3QIQJK-JroXksK-.js → swimlanes-XN3QIQJK-DuZTWWvh.js} +1 -1
- package/web-shell/assets/swimlanesDiagram-VK2B7HYN-DOfLQQYt.js +8 -0
- package/web-shell/assets/{timeline-definition-24CTP7MA-DfuVIfYY.js → timeline-definition-24CTP7MA-CjqtZXEd.js} +1 -1
- package/web-shell/assets/{vennDiagram-4TSXK5OY-BZXoSjRB.js → vennDiagram-4TSXK5OY-knVCVkQ4.js} +1 -1
- package/web-shell/assets/{wardleyDiagram-VM6X3IG4-BdiY8avC.js → wardleyDiagram-VM6X3IG4-yoWhw0a2.js} +1 -1
- package/web-shell/assets/{xychartDiagram-S5SC5T6Z-DcXh_U4H.js → xychartDiagram-S5SC5T6Z-ue14E_gL.js} +1 -1
- package/web-shell/index.html +20 -5
- package/chunks/MaxSizedBox-3OZJCC3J.js +0 -110
- package/chunks/agent-BFE3DQM3.js +0 -93
- package/chunks/agent-headless-LLVKZZ4P.js +0 -87
- package/chunks/bridge-EBYO4SYM.js +0 -118
- package/chunks/channel-settings-store-5VP2Y2YM.js +0 -115
- package/chunks/chunk-2J3OJGTL.js +0 -98
- package/chunks/chunk-7IV52LTO.js +0 -202
- package/chunks/chunk-AXMWHKXA.js +0 -42
- package/chunks/chunk-F6WFNA7U.js +0 -22
- package/chunks/chunk-IO257NUD.js +0 -623
- package/chunks/chunk-JS73NNWF.js +0 -30
- package/chunks/chunk-SJ4HB27T.js +0 -945
- package/chunks/chunk-VGHZT6JR.js +0 -51
- package/chunks/chunk-YHC2EYYG.js +0 -125
- package/chunks/computer-use-EGPWFEX6.js +0 -2142
- package/chunks/config-utils-WZ43VOBS.js +0 -25
- package/chunks/contextCommand-5DSEQI6S.js +0 -106
- package/chunks/daemon-status-provider-EYMLPYJU.js +0 -116
- package/chunks/daemon-trust-policy-CQYKZ7VO.js +0 -112
- package/chunks/deferred-core-runtime-WFEPUXZR.js +0 -114
- package/chunks/earlyInputCapture-PN4PP7V5.js +0 -107
- package/chunks/environment-WUPHLPKZ.js +0 -127
- package/chunks/errors-WPMPVIAT.js +0 -113
- package/chunks/exitPlanMode-MLFHYZNB.js +0 -85
- package/chunks/handleAutoUpdate-F5OTWUT5.js +0 -109
- package/chunks/i18n-C562S6KN.js +0 -124
- package/chunks/initializer-7YPGOFP4.js +0 -113
- package/chunks/installationInfo-ARU5Q2H7.js +0 -107
- package/chunks/list-KTSK275C.js +0 -116
- package/chunks/loadedSettingsAdapter-F3T2EQ5J.js +0 -110
- package/chunks/mcp-6ONTVPAY.js +0 -110
- package/chunks/nonInteractiveCli-KZDWFAN6.js +0 -178
- package/chunks/pidfile-IO7ALSZF.js +0 -111
- package/chunks/process-registry-PMJOA5CO.js +0 -172
- package/chunks/prompt-terminal-ledger-TCE7PMCE.js +0 -105
- package/chunks/read-file-2HOD2ATO.js +0 -33
- package/chunks/resumeHistoryUtils-DDSBAQJS.js +0 -118
- package/chunks/ripGrep-E7P6K4QR.js +0 -40
- package/chunks/runtime-J4SPTJRQ.js +0 -148
- package/chunks/scheduler-VRAEZZ4E.js +0 -122
- package/chunks/serve-KEAWV4TI.js +0 -118
- package/chunks/shell-H6K63WG3.js +0 -95
- package/chunks/skill-settings-TCKLXIXM.js +0 -118
- package/chunks/spawnChannel-2K6NKWM5.js +0 -111
- package/chunks/standalone-update-LSCGOEFP.js +0 -118
- package/chunks/terminal-image-renderer-UHX3UD66.js +0 -114
- package/chunks/theme-manager-6B47ZPIF.js +0 -102
- package/chunks/total-session-admission-NSCFWGJH.js +0 -113
- package/chunks/trustedFolders-7XMJWGQ3.js +0 -122
- package/chunks/updateCheck-EOVLHD4T.js +0 -118
- package/chunks/useAutoAcceptIndicator-ZNMIGBTN.js +0 -120
- package/chunks/workspace-providers-status-GPGU5YMT.js +0 -113
- package/chunks/workspace-registry-BQISXT6Y.js +0 -122
- package/chunks/workspace-service-LLY6HCUC.js +0 -129
- package/chunks/workspace-skills-status-L5N2Y3ZP.js +0 -113
- package/chunks/write-file-EJHU2Z3E.js +0 -90
- package/web-shell/assets/channel-Zg3WHgq_.js +0 -1
- package/web-shell/assets/classDiagram-DTDB5LWJ-C16l9jQz.js +0 -1
- package/web-shell/assets/classDiagram-v2-JRS7N3AN-C16l9jQz.js +0 -1
- package/web-shell/assets/index-BN_m_uHJ.css +0 -5
- package/web-shell/assets/index-DrlJu79f.js +0 -1792
- package/web-shell/assets/stateDiagram-v2-4QOOHH4V-NZYAoQLU.js +0 -1
- package/web-shell/assets/swimlanesDiagram-VK2B7HYN-3YdVX3vj.js +0 -8
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Channels let you interact with a Qwen Code agent from messaging platforms like Telegram, WeChat, QQ, DingTalk, WeCom, or Feishu, instead of the terminal. You send messages from your phone or desktop chat app, and the agent responds just like it would in the CLI.
|
|
4
4
|
|
|
5
|
-
Code-hosting platforms (starting with [GitHub](./github))
|
|
5
|
+
Code-hosting platforms (starting with [GitHub](./github)) and authenticated workspace accounts (starting with [DingTalk Workspace](./dws)) are also supported through channels.
|
|
6
6
|
|
|
7
7
|
## How It Works
|
|
8
8
|
|
|
@@ -17,7 +17,7 @@ All channels share one agent process with isolated sessions per user. Each chann
|
|
|
17
17
|
|
|
18
18
|
## Quick Start
|
|
19
19
|
|
|
20
|
-
1. Set up a bot
|
|
20
|
+
1. Set up a bot or authenticated workspace account (see channel-specific guides: [Telegram](./telegram), [WeChat](./weixin), [QQ Bot](./qqbot), [DingTalk](./dingtalk), [DingTalk Workspace](./dws), [WeCom](./wecom), [Feishu](./feishu), [GitHub](./github))
|
|
21
21
|
2. Add the channel configuration to `~/.qwen/settings.json`
|
|
22
22
|
3. Run `qwen channel start` to start all channels, or `qwen channel start <name>` for a single channel
|
|
23
23
|
|
|
@@ -52,7 +52,7 @@ Channels are configured under the `channels` key in `settings.json`. Each channe
|
|
|
52
52
|
|
|
53
53
|
| Option | Required | Description |
|
|
54
54
|
| ------------------------ | ---------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
55
|
-
| `type` | Yes | Channel type: `telegram`, `weixin`, `qq`, `dingtalk`, `wecom`, `feishu`, `github`, or a custom type from an extension (see [Plugins](./plugins))
|
|
55
|
+
| `type` | Yes | Channel type: `telegram`, `weixin`, `qq`, `dingtalk`, `dws`, `wecom`, `feishu`, `github`, `gitlab`, or a custom type from an extension (see [Plugins](./plugins)) |
|
|
56
56
|
| `token` | Telegram | Bot token. Supports `$ENV_VAR` syntax to read from environment variables. Not needed for WeChat, DingTalk, WeCom, or Feishu |
|
|
57
57
|
| `clientId` | DingTalk, Feishu | DingTalk AppKey or Feishu App ID. Supports `$ENV_VAR` syntax |
|
|
58
58
|
| `clientSecret` | DingTalk, Feishu | DingTalk AppSecret or Feishu App Secret. Supports `$ENV_VAR` syntax |
|
|
@@ -62,6 +62,7 @@ Channels are configured under the `channels` key in `settings.json`. Each channe
|
|
|
62
62
|
| `senderPolicy` | No | Who can talk to the bot: `allowlist` (default), `open`, or `pairing` |
|
|
63
63
|
| `allowedUsers` | No | List of user IDs allowed to use the bot (used by `allowlist` and `pairing` policies) |
|
|
64
64
|
| `sessionScope` | No | How sessions are scoped: `user` (default), `chat_thread`, or `single`. Legacy `thread` remains compatible when already configured but is not offered for new Web Shell configurations |
|
|
65
|
+
| `multiSession` | No | Retain up to eight owner-scoped named tasks in one chat. Requires daemon-managed mode, `sessionScope: "user"`, no webhooks or group-history backfill, and no enabled Channel loops |
|
|
65
66
|
| `cwd` | No | Working directory for the agent. Defaults to the current directory |
|
|
66
67
|
| `approvalMode` | No | Tool approval mode for channel sessions. Unattended webhook tasks require `yolo`; the setting applies to every session on the channel |
|
|
67
68
|
| `instructions` | No | Custom instructions prepended to the first message of each session |
|
|
@@ -88,9 +89,32 @@ Controls who can interact with the bot:
|
|
|
88
89
|
Controls how conversation sessions are managed:
|
|
89
90
|
|
|
90
91
|
- **`user`** (default) — One session per user. All messages from the same user share a conversation.
|
|
91
|
-
- **`
|
|
92
|
+
- **`chat_thread`** — One session per chat thread/topic, shared by participants in that thread.
|
|
93
|
+
- **`thread`** — Legacy thread/topic routing retained for existing configurations.
|
|
92
94
|
- **`single`** — One shared session for all users. Everyone shares the same conversation.
|
|
93
95
|
|
|
96
|
+
### Named Tasks
|
|
97
|
+
|
|
98
|
+
Daemon-managed Channels can retain several named conversations for the same user in one chat:
|
|
99
|
+
|
|
100
|
+
```json
|
|
101
|
+
{
|
|
102
|
+
"channels": {
|
|
103
|
+
"my-channel": {
|
|
104
|
+
"type": "telegram",
|
|
105
|
+
"sessionScope": "user",
|
|
106
|
+
"multiSession": true
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
The catalog is private to the exact channel, chat, and sender. Task names use 1–32 ASCII letters, numbers, underscores, or hyphens, and are unique case-insensitively. Up to eight tasks may be open; closing a task detaches it without deleting its transcript, so selecting it later reopens the exact conversation. Session IDs are never accepted by or shown in chat commands.
|
|
113
|
+
|
|
114
|
+
Part 2 uses one selected task at a time and a shared working directory. Creating a task or switching away from the selected task is rejected while that task is still running or waiting for permission, and a busy task cannot be closed. Concurrent running-task switching, named cancellation, and task labels are planned for Part 3; per-task worktrees are planned for Part 4. Channel memory remains scoped to the chat rather than to a named task.
|
|
115
|
+
|
|
116
|
+
This mode is unavailable in standalone `qwen channel start`, with webhooks, with non-zero channel or group `groupHistoryLimit`, or with Channel loops. If an enabled loop already exists for that channel, the daemon worker refuses to start until the loop is disabled.
|
|
117
|
+
|
|
94
118
|
### Channel Memory
|
|
95
119
|
|
|
96
120
|
Channel memory stores durable context for one chat or thread. Entries have stable
|
|
@@ -463,14 +487,21 @@ Channels support slash commands. These are handled locally (no agent round-trip)
|
|
|
463
487
|
- `/help` — List available commands
|
|
464
488
|
- `/clear` — Clear your session and start fresh (aliases: `/reset`, `/new`)
|
|
465
489
|
- `/status` — Show session info and access policy
|
|
490
|
+
- `/sessions [all]` — List open named tasks, or include closed tasks; available only with `multiSession: true`
|
|
491
|
+
- `/session current` — Show the selected named task
|
|
492
|
+
- `/session new <name>` — Create and select a shared-workspace task
|
|
493
|
+
- `/session new <name> --worktree` — Recognized but deferred to Part 4
|
|
494
|
+
- `/session use <name>` — Select an open task or reopen a closed task
|
|
495
|
+
- `/session cancel [<name>]` — Recognized but deferred to Part 3. Wait for the selected task to finish before switching; Telegram users can use `/cancel` for the selected task
|
|
496
|
+
- `/session close <name>` — Close a task without deleting its transcript
|
|
466
497
|
- `/loop add "<cron>" <prompt>` — Create a persistent scheduled channel loop
|
|
467
498
|
- `/loop list` — List loops for the current chat
|
|
468
499
|
- `/loop inspect <id>` — Show loop status and run details
|
|
469
500
|
- `/loop cancel <id>` — Disable a loop
|
|
470
501
|
|
|
471
|
-
All other slash commands (e.g., `/compress`, `/summary`) are forwarded to the agent.
|
|
502
|
+
All other slash commands (e.g., `/compress`, `/summary`) are forwarded to the agent. Named-task commands are registered only when the mode is enabled, so `/sessions` remains agent-visible for existing configurations.
|
|
472
503
|
|
|
473
|
-
|
|
504
|
+
Named-task commands work on all channel types (Telegram, WeChat, QQ, DingTalk, WeCom, Feishu, GitHub). `/cancel` is currently registered only by Telegram, and loop creation requires proactive delivery support for the current adapter and target.
|
|
474
505
|
|
|
475
506
|
## Running
|
|
476
507
|
|
|
@@ -39,9 +39,9 @@ If there are no uncommitted changes, `/review` will let you know and stop — no
|
|
|
39
39
|
| -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------- | ----------------------------------- | ---------------- |
|
|
40
40
|
| `low` | 3-6 directed inline angles over the diff (scaled by diff size) plus a gap sweep — no subagents, no build/test, no project rules | 10 (unverified) | None | Never |
|
|
41
41
|
| `medium` | The high pipeline minus its most expensive passes: the parallel finder fan-out over a reduced dimension set, plus build/test and a single verification pass | Uncapped (verified) | Approve capped at Comment | Never |
|
|
42
|
-
| `high` | Full pipeline:
|
|
42
|
+
| `high` | Full pipeline: up to 16 parallel agents → sharded verification → iterative reverse audit | Uncapped (verified) | Approve / Request changes / Comment | With `--comment` |
|
|
43
43
|
|
|
44
|
-
|
|
44
|
+
`/review` resolves effort in this order: an explicit `--effort`, the last level explicitly typed for this project, the operator `review.effort` setting, then the built-in target default (**high** for PR reviews, **medium** for local and file reviews). When a remembered level applies, `/review` announces it before work begins; type a new `--effort` to replace it. An effective `--comment` forces high (posted comments must survive verification) — on a non-PR target `--comment` is ignored with a warning and does **not** change the effort. Medium keeps the security and test-coverage agents and build/test, and drops the adversarial personas, the language-pitfall and wrapper/proxy specialists (Agents 1d/1e), the diff-specialist finders and the reverse audit — so a subtle Critical only the second look would surface can slip; use `--effort high` for security-sensitive or pre-release reviews. Only `low` is unverified. Worktree isolation applies to same-repo PR reviews; cross-repo PRs run in lightweight mode (diff-only, no worktree or build/test). The low pass is labeled unverified, emits no verdict, and never writes the incremental review cache, so a later `--effort high` run is never skipped as "already reviewed"; medium is verified but its Approve is capped at Comment, because nothing looked twice for what the first pass missed. The diff-obtaining mechanics are identical at every level — PR reviews always use the isolated worktree and the same base resolution, so the review is never against the wrong base. One scope difference remains: the incremental cache is high-only, so a high re-review may cover just the new commits (`lastCommitSha..HEAD`) while low/medium always review the full PR diff.
|
|
45
45
|
|
|
46
46
|
## How It Works
|
|
47
47
|
|
|
@@ -52,12 +52,14 @@ Step 1: Determine scope + effort level (local diff / PR worktree / file)
|
|
|
52
52
|
Capture the diff to a file + partition it into chunks
|
|
53
53
|
Step 2: Load project review rules (medium/high)
|
|
54
54
|
Step 3C: low effort: 3-6 inline angles + gap sweep [0 subagent calls]
|
|
55
|
-
Step 3A: high, <=500 src AND <=3200 total:
|
|
55
|
+
Step 3A: high, <=500 src AND <=3200 total: up to 16 agents [16+ LLM calls]
|
|
56
56
|
|-- Agent 0: Issue Fidelity & Root-Cause Ownership
|
|
57
57
|
|-- Agent 1a: Correctness — line-by-line scan
|
|
58
|
-
| (incl. language-pitfall + wrapper-routing checks)
|
|
59
58
|
|-- Agent 1b: Correctness — removed-behavior audit
|
|
60
59
|
|-- Agent 1c: Correctness — cross-file tracer
|
|
60
|
+
|-- Agent 1d: Correctness — language-pitfall scan
|
|
61
|
+
|-- Agent 1e: Correctness — wrapper/proxy routing
|
|
62
|
+
| (only when the diff signals a wrapping type)
|
|
61
63
|
|-- Agent 2: Security
|
|
62
64
|
|-- Agent 3a: Reuse & duplication
|
|
63
65
|
|-- Agent 3b: Altitude & abstraction fit
|
|
@@ -102,9 +104,11 @@ Steps 3A/3B/4/5 are the high-effort pipeline; at `--effort low|medium` a single
|
|
|
102
104
|
| Agent | Focus |
|
|
103
105
|
| --------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
104
106
|
| Agent 0: Issue Fidelity | Linked issue evidence, root-cause ownership, and whether the PR solves the reported problem |
|
|
105
|
-
| Agent 1a: Line-by-line scan | Walks every hunk plus its enclosing function: wrong conditions, off-by-one, missing `await`,
|
|
107
|
+
| Agent 1a: Line-by-line scan | Walks every hunk plus its enclosing function: wrong conditions, off-by-one, missing `await`, edge cases, race conditions |
|
|
106
108
|
| Agent 1b: Removed-behavior audit | Walks every deleted/replaced line: names the invariant it enforced and hunts for where the new code re-establishes it — including removed **exports**, whose replacement often lives in another file and quietly changed a default. In 3B it runs whole-diff (chunk agents keep the local half) |
|
|
107
109
|
| Agent 1c: Cross-file tracer | Walks every changed symbol's callers (consumer direction) and every added field's read sites (producer direction), plus same-PR callee changes |
|
|
110
|
+
| Agent 1d: Language-pitfall scan | Carries the classic-footgun checklist for the diff's language (`==` coercion, falsy-value traps, loop-variable capture, mutable defaults, nil-map writes, SQL concatenation, DST arithmetic) and pattern-matches every hunk against it |
|
|
111
|
+
| Agent 1e: Wrapper/proxy routing | For every type the diff adds or modifies that wraps another (cache, proxy, decorator, adapter): every method routes through the wrapped instance, and the wrapper forwards every method callers use. Rostered only when the diff signals a wrapping type |
|
|
108
112
|
| Agent 2: Security | Injection, XSS, SSRF, auth bypass, sensitive data exposure |
|
|
109
113
|
| Agent 3a: Reuse & duplication | Does the codebase already have this? Greps for the behavior, names the existing helper to call instead, and flags dead code the diff leaves behind |
|
|
110
114
|
| Agent 3b: Altitude & abstraction | Is the fix at the right depth — or a bandaid on shared infrastructure, a downstream compensation for an upstream bug, or an abstraction serving one call site? |
|
|
@@ -115,19 +119,19 @@ Steps 3A/3B/4/5 are the high-effort pipeline; at `--effort low|medium` a single
|
|
|
115
119
|
| Agent 7: Build & Test | Runs build and test commands, reports failures |
|
|
116
120
|
| Agent 8: Diff-specialized finders | 0-2 extra finders written per-review when the diff concentrates in a domain with known failure modes (reconnect logic, module loaders, schedulers, codecs) |
|
|
117
121
|
|
|
118
|
-
The three Correctness agents are **procedural**: each is defined by how it walks the diff (line-by-line / deleted lines / cross-file edges), not by a bug taxonomy — so their coverage is complementary instead of overlapping. The same reasoning splits **code quality into three** (3a/3b/3c): one agent holding a six-item checklist finishes one item — measured on a heavily-rewritten file, one agent holding an eight-item checklist found 1 of 5 defects and the same model split three ways found all 5 — so the quality checklist is cut where the questions genuinely differ. All agents run in parallel (Agent 1 launches 3 procedural variants, Agent 3 launches 3 checklist slices, and Agent 6 launches 3 persona variants concurrently, totaling
|
|
122
|
+
The three Correctness agents are **procedural**: each is defined by how it walks the diff (line-by-line / deleted lines / cross-file edges), not by a bug taxonomy — so their coverage is complementary instead of overlapping. Two further dedicated angles (1d/1e) split the language-pitfall checklist and wrapper/proxy routing out of the line-by-line walk: a checklist pattern-match and a structural routing expectation are different attention modes, and folded into the walk they were diluted by its rhythm. The same reasoning splits **code quality into three** (3a/3b/3c): one agent holding a six-item checklist finishes one item — measured on a heavily-rewritten file, one agent holding an eight-item checklist found 1 of 5 defects and the same model split three ways found all 5 — so the quality checklist is cut where the questions genuinely differ. All agents run in parallel (Agent 1 launches 3 procedural variants and 2 dedicated angles, Agent 3 launches 3 checklist slices, and Agent 6 launches 3 persona variants concurrently, totaling up to 16 parallel tasks for same-repo PR reviews — Agent 1e runs only when the diff signals a wrapping type — plus 0-2 Agent 8 finders when the diff's domain calls for them, so 15-18 in practice; Agent 0 is skipped for local-diff and file-path reviews, which run 14-17; cross-repo lightweight mode also skips Agents 1c and 7, running 13-16).
|
|
119
123
|
|
|
120
124
|
Every finding must state a **failure scenario** — the concrete input, state, or timing that triggers it and the wrong outcome that results (for quality findings, the concrete cost instead). A finding that cannot name its scenario is dropped at the source, and verification re-traces the claimed scenario through the real code rather than judging the finding's prose.
|
|
121
125
|
|
|
122
|
-
Once a PR carries more than 500 lines of **source** change — or more than 3 200 diff lines in total, past which the
|
|
126
|
+
Once a PR carries more than 500 lines of **source** change — or more than 3 200 diff lines in total, past which the fifteen whole-diff readers are each too diluted to read carefully (an attention bound, not a promise of fewer calls — heavy files and specialized finders can make 3B cost more) — this dimension fan-out is replaced by a **territory × dimension** fan-out: the diff is split into ~400-line chunks — boundaries fall on hunk boundaries, and a hunk too large to fit is split only at a top-level declaration, never inside a function — and each chunk gets its own agent that applies every review dimension to that chunk alone.
|
|
123
127
|
|
|
124
|
-
The gate deliberately counts source lines rather than diff lines. Test code, prose and lockfiles dominate diff size — across this repo's last 40 merged PRs the median diff is 41% tests — so a gate on raw size would carve a 173-line production change into territories just because it shipped 489 lines of new tests, leaving that production code with one reviewer instead of
|
|
128
|
+
The gate deliberately counts source lines rather than diff lines. Test code, prose and lockfiles dominate diff size — across this repo's last 40 merged PRs the median diff is 41% tests — so a gate on raw size would carve a 173-line production change into territories just because it shipped 489 lines of new tests, leaving that production code with one reviewer instead of fourteen lenses (the diff-reading dimension agents — sixteen minus Issue Fidelity and Build & Test). Chunking still covers every line either way, tests included; what the gate decides is how many reviewers there are and what each is asked to do. Fourteen diff-reading lenses all walking one large diff read the same early hunks fourteen times over; one agent per chunk means every line of the diff has exactly one accountable reviewer. Each chunk agent returns a `Covered:` receipt, and a chunk with no receipt is re-reviewed before the run proceeds — so "no blockers" can never be reported over code that nobody read.
|
|
125
129
|
|
|
126
130
|
A **source** file that is largely rewritten (an existing file of 300+ lines that is now 40%+ new, or has 800+ changed lines) also gets **three whole-file invariant agents**. Test and generated files never qualify — the checklist asks about fields, timers, and error taxonomies, which a rewritten test file does not have. Its bugs are usually not inside any one hunk but _between_ the new lines — a timer armed near the top of the file and a teardown path two thousand lines below. Each agent reads the whole post-change file and walks two or three items of a fixed checklist: mutable fields cleared on every exit path, timers cancelled on every close (and cancellation not discarding captured data), map inserts matched by deletes, retry counters incremented at every entry, status return values actually checked, error codes exhaustively classified permanent vs transient, config fields honoured on every path, and early returns that skip a required side effect.
|
|
127
131
|
|
|
128
132
|
The checklist is split three ways on purpose. Handing one agent all eight checks over a 2 400-line file gets one of them done properly; three agents with two or three checks each get all of them done. Chunk agents do not substitute for this — on PR #6457 they held every one of these defects inside their assigned territory and reported none. What they lacked was not the lines but the question.
|
|
129
133
|
|
|
130
|
-
Findings are verified in **sharded batches** (at most 8 findings per verification agent, all launched together). A verifier may reject a Critical only by quoting the code that contradicts it (or when the diff's own comments document the flagged behavior as deliberate); anything less certain is downgraded to low confidence rather than deleted — a silently rejected Critical is invisible to every later stage, while a downgraded one still reaches a human. After verification, **iterative reverse audit** hunts for gaps, fanned out one auditor per chunk per round, each with the cumulative finding list. The loop stops after **two consecutive dry rounds** (or at the plan's round cap — reported as such rather than as convergence). That cap follows the diff's topology: **10** on a small diff, where a round is a single auditor; **5** on a chunked one, where it is one auditor per chunk; and **3** on a huge diff (≥ 3000 effective lines) _when the run has a deadline_, because five ~90-minute rounds do not fit a six-hour CI ceiling and a review killed mid-flight posts nothing — with no deadline a huge diff keeps the chunked cap of 5. An operator can lower whichever cap applies for every review with the `review.reverseAuditRounds` setting; it can never raise one. One dry round is not evidence of convergence, and reverse-audit findings are verified like any other.
|
|
134
|
+
Findings are verified in **sharded batches** (at most 8 findings per verification agent, all launched together). A verifier may reject a Critical only by quoting the code that contradicts it (or when the diff's own comments document the flagged behavior as deliberate); anything less certain is downgraded to low confidence rather than deleted — a silently rejected Critical is invisible to every later stage, while a downgraded one still reaches a human. The bar applies to the shape of every rejection: it must be constructible from the code — quote the line the finding misreads, prove the claimed state impossible from a type, constant, or invariant, cite the in-diff guard that covers the trigger, or match a pure-style change with no observable effect — or otherwise match an exclusion criterion — and "too speculative" is never one of them. A finding whose failure scenario names a state the code does not exclude is plausible by default: a concurrency race, nil/undefined on a rare-but-reachable path, a falsy zero or empty collection treated as missing, an off-by-one on an unexcluded boundary, a retry storm or partial failure, a regex or allowlist that lost an anchor. A rejection that constructs none of the four grounds downgrades instead of dropping. After verification, **iterative reverse audit** hunts for gaps, fanned out one auditor per chunk per round, each with the cumulative finding list. The loop stops after **two consecutive dry rounds** (or at the plan's round cap — reported as such rather than as convergence). That cap follows the diff's topology: **10** on a small diff, where a round is a single auditor; **5** on a chunked one, where it is one auditor per chunk; and **3** on a huge diff (≥ 3000 effective lines) _when the run has a deadline_, because five ~90-minute rounds do not fit a six-hour CI ceiling and a review killed mid-flight posts nothing — with no deadline a huge diff keeps the chunked cap of 5. An operator can lower whichever cap applies for every review with the `review.reverseAuditRounds` setting; it can never raise one. One dry round is not evidence of convergence, and reverse-audit findings are verified like any other.
|
|
131
135
|
|
|
132
136
|
## Severity Levels
|
|
133
137
|
|
|
@@ -163,14 +167,14 @@ You can review PRs from other repositories by passing the full URL:
|
|
|
163
167
|
|
|
164
168
|
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.
|
|
165
169
|
|
|
166
|
-
| Capability
|
|
167
|
-
|
|
|
168
|
-
| LLM review (Agents 0, 1a, 1b, 2-6 + verify + iterative reverse audit) | ✅ | ✅ |
|
|
169
|
-
| Agent 1c: Cross-file tracer
|
|
170
|
-
| Agent 7: Build & test
|
|
171
|
-
| Agent 8: Diff-specialized finders (0-2, when the domain calls for it)
|
|
172
|
-
| PR inline comments
|
|
173
|
-
| Incremental review cache
|
|
170
|
+
| Capability | Same-repo | Cross-repo |
|
|
171
|
+
| ----------------------------------------------------------------------------- | --------- | ------------------------------ |
|
|
172
|
+
| LLM review (Agents 0, 1a, 1b, 1d, 1e, 2-6 + verify + iterative reverse audit) | ✅ | ✅ |
|
|
173
|
+
| Agent 1c: Cross-file tracer | ✅ | ❌ (no local codebase to grep) |
|
|
174
|
+
| Agent 7: Build & test | ✅ | ❌ (no local codebase) |
|
|
175
|
+
| Agent 8: Diff-specialized finders (0-2, when the domain calls for it) | ✅ | ✅ (needs only the diff) |
|
|
176
|
+
| PR inline comments | ✅ | ✅ (if you have write access) |
|
|
177
|
+
| Incremental review cache | ✅ | ❌ |
|
|
174
178
|
|
|
175
179
|
## PR Inline Comments
|
|
176
180
|
|
|
@@ -236,7 +240,7 @@ A long review that dies part-way — a dropped connection, a timeout, a killed t
|
|
|
236
240
|
|
|
237
241
|
It applies to **PR targets only** (a local review's diff comes from a live working tree, which has no stable interrupted state to continue), and it is safe to pass whenever you are unsure: the review rules on the on-disk state itself — the worktree still at the fetched commit and clean, the captured diff unchanged byte for byte, the PR head unmoved, the resume limit unspent — and silently starts fresh whenever anything no longer matches, telling you which check refused. A continuation reuses the earlier attempt's certified agent results, so the report says how many were recovered; it is disclosed, never a coverage gap.
|
|
238
242
|
|
|
239
|
-
Two things to know.
|
|
243
|
+
Two things to know. With only the built-in target default, a continuation keeps the interrupted run's recorded **effort**. An explicit `--effort`, a project-remembered level, the operator `review.effort` setting, or an effective `--comment` supplies a required level; if it differs from the interrupted run, resume is refused and a fresh run starts at that level, because different effort is different work. And if the PR head moved while the review was down, the resume refuses (`head-moved`) and the fresh run reviews the new commits — which is what you want, and it counts as this review's one restart.
|
|
240
244
|
|
|
241
245
|
## Findings as Data
|
|
242
246
|
|
|
@@ -361,7 +365,7 @@ If you switch models (via `/model`) and re-review the same PR, `/review` detects
|
|
|
361
365
|
# → "Previous review used qwen3-coder. Running full review with gpt-4o for a second opinion."
|
|
362
366
|
```
|
|
363
367
|
|
|
364
|
-
The model match also gates incremental scoping, not just the skip: "clean up to the cached commit" is the previous model's verdict, so when new commits have landed since the cached review, a model mismatch never scopes to `lastCommitSha..HEAD` — the range is the full diff, noting "Previous round was reviewed by qwen3-coder. Running full review with gpt-4o." — unless an anchor certified by the model now running is recovered from the last posted review (below), which scopes the range instead. The previous round's findings still carry over to be re-ruled; only the anchor does not. The same gate binds the anchor recovered from the last posted review's machine-ledger marker when the cache is absent or its anchor is unusable (CI, another clone): it scopes the incremental range only if the model now running certified it — a marker certified by a different model, or carrying no model (a review posted with `review.attribution` off, or one from before the field), falls back to the full diff.
|
|
368
|
+
The model match also gates incremental scoping, not just the skip: "clean up to the cached commit" is the previous model's verdict, so when new commits have landed since the cached review, a model mismatch never scopes to `lastCommitSha..HEAD` — the range is the full diff, noting "Previous round was reviewed by qwen3-coder. Running full review with gpt-4o." — unless an anchor certified by the model now running is recovered from the last posted review (below), which scopes the range instead. The previous round's findings still carry over to be re-ruled; only the anchor does not. The same gate binds the anchor recovered from the last posted review's machine-ledger marker when the cache is absent or its anchor is unusable (CI, another clone): it scopes the incremental range only if the model now running certified it — a marker certified by a different model, or carrying no model (a review posted with `review.attribution` off, or one from before the field), falls back to the full diff. A round that did not close cleanly posts its marker without an anchor (it cannot certify a range), but that loss is not sticky when the round's work list survived whole: recovery grafts the anchor forward from the most recent earlier marker your own account posted with one, so a single non-clean round no longer forces every later round to re-read the full diff — the next round scopes `anchor..HEAD`, which re-covers the range the non-clean round could not certify. A size-capped round's graft is refused (dropped findings would fall outside the grafted scope and retire silently), so later rounds keep re-reading the full diff until a complete marker lands.
|
|
365
369
|
|
|
366
370
|
Cache is stored in `.qwen/review-cache/` and tracks both the commit SHA and model ID. Make sure this directory is in your `.gitignore` (a broader rule like `.qwen/*` also works). On GitHub, if the cached commit was rebased or force-pushed away, it falls back to a full review; Aone rules the cached anchor differently — see its paragraph below. Only high-effort reviews consult or write the cache — a `--effort low|medium` quick pass never counts as "already reviewed".
|
|
367
371
|
|
|
@@ -382,7 +386,7 @@ The deterministic halves of the pipeline — argument parsing (`qwen review pars
|
|
|
382
386
|
|
|
383
387
|
**GitHub Enterprise:** reviewing a PR URL on a non-`github.com` host routes every GitHub call at that host — the review subcommands (`match-remote`, `meta`, `fetch-pr`, `pr-context`, `comment-status`, `issue-context`, `fetch-diff`, `comment-body`, `plan-diff`, `test-plan`, `presubmit`, `compose-review`, `submit`, `publish-assets`) accept `--host` and set it in code, so a forgotten host cannot silently retarget the review at `github.com`.
|
|
384
388
|
|
|
385
|
-
**Aone Code:** for a clone whose origin is on `gitlab.alibaba-inc.com`, run `/review` from inside that clone — the platform is detected from the remote and the subcommands work, backed by the `a1` CLI (at least 0.1.90 — an older install is refused at authentication time with an upgrade message) — the target number is the global MR id. `fetch-pr` fetches `refs/merge-requests/<id>/head` and builds the worktree + diff, so the agent review of the worktree is unchanged, and `test-plan` works too — it reads the MR description through the same reader.
|
|
389
|
+
**Aone Code:** for a clone whose origin is on `gitlab.alibaba-inc.com`, run `/review` from inside that clone — the platform is detected from the remote and the subcommands work, backed by the `a1` CLI (at least 0.1.90 — an older install is refused at authentication time with an upgrade message) — the target number is the global MR id. `fetch-pr` fetches `refs/merge-requests/<id>/head` and builds the worktree + diff, so the agent review of the worktree is unchanged, and `test-plan` works too — it reads the MR description through the same reader. `pr-context` is backed too: it reads the MR's metadata, discussion threads, and previously posted qwen summaries (the machine ledger recovers from them), so an Aone run sees the MR's existing discussion exactly as a GitHub run sees a PR's. `comment-status` and `presubmit` are a1-backed too (presubmit fully: self-PR detection, head drift, merge-gate CI, and existing-comment dedup), so repeat `--comment` rounds dedup against the MR's existing comments instead of re-posting them (a thread the platform marks outdated — its line no longer maps after an amend — stays re-postable), and self-PR detection works too. The `publish-assets` write is skipped. `--comment` **posts** the review through the `a1` CLI: one comment per inline finding, then the summary comment. Aone has no native request-changes state — on that verdict the summary comment carries a blocking header, and any inline Criticals that were actually posted block the merge through the discussion gate while their discussions stay unresolved (when no inline Critical posted, the header is advisory and nothing mechanically blocks the merge). The posted comments carry no AI-comment flag — `a1` cannot set one — so a repo's dedicated `ai_comment` merge gate does not track them. The native `a1 repo mr approve` fires for an Approve verdict when the run read the MR's context (the same gate as GitHub; a context-unavailable run stays capped at Comment). Incremental re-review follows the AGit-Flow update model: an update AMENDS the single CR commit in place, orphaning the head the previous round reviewed — so the cached anchor is ruled WITHOUT ancestry (the anchor-behind-head test would fail for every update), and the re-review scopes the PR's own diff to the files the update touched instead of falling back to a full review; an update that also rebased onto newer master keeps that scope only while the rebase's drift stays within the CR's files — drift touching any other file falls back to the full review, and no drift byte enters the published scope either way. See `docs/design/2026-08-15-review-aone-provider.md`.
|
|
386
390
|
|
|
387
391
|
Every run ends with one machine-readable line (`Review complete: <target> — <disposition>`), so scripts and CI wrappers can detect completion and outcome with a single `^Review complete: ` match.
|
|
388
392
|
|
|
@@ -406,7 +410,7 @@ The exit code is the contract a gate should read:
|
|
|
406
410
|
|
|
407
411
|
`3` (not `2`) lets a gate distinguish "the review is blocking" from "the tool broke" — yargs already uses `1` for usage errors — without parsing any output. `--timeout-minutes` (default 120, floored at 1) terminates a hung review and exits `1`, and cancelling the command (Ctrl+C / SIGTERM) terminates the review's process group rather than orphaning it.
|
|
408
412
|
|
|
409
|
-
`--resume` continues an interrupted review of the same PR instead of starting over — when a long local run dies part-way (a dropped connection, a timeout, a killed terminal), the retry would otherwise re-fetch, re-chunk and re-launch agents whose work is already on disk. It is safe to pass unconditionally on a retry: `fetch-pr` rules on the on-disk state itself (worktree still at the fetched SHA and clean, diff bytes unchanged, PR head unmoved, resume cap unspent) and silently falls back to a fresh review whenever anything no longer matches, so the flag never fails a run that could start over.
|
|
413
|
+
`--resume` continues an interrupted review of the same PR instead of starting over — when a long local run dies part-way (a dropped connection, a timeout, a killed terminal), the retry would otherwise re-fetch, re-chunk and re-launch agents whose work is already on disk. It is safe to pass unconditionally on a retry: `fetch-pr` rules on the on-disk state itself (worktree still at the fetched SHA and clean, diff bytes unchanged, PR head unmoved, resume cap unspent) and silently falls back to a fresh review whenever anything no longer matches, so the flag never fails a run that could start over. When the current invocation has only the built-in target default, a continuation stays pinned to the interrupted run's recorded effort. An explicit `--effort`, a project-remembered level, the operator `review.effort` setting, or an effective `--comment` supplies a required level; a mismatch refuses the resume and runs fresh at that level. PR targets only (a local review's diff is captured from a live working tree, which has no stable interrupted state to continue). Resume is a **local convenience**: the repository's own CI review workflow does **not** resume — each retry re-runs fresh, because a CI attempt runs no-sandbox and its worktree is deleted on exit, leaving no interrupted state to continue.
|
|
410
414
|
|
|
411
415
|
A time-budgeted run can also export a **soft** deadline so the review stops its open-ended reverse-audit loop while there is still time to verify, compose and post: `QWEN_REVIEW_DEADLINE_EPOCH` is the Unix-seconds moment the run will be killed, and `QWEN_REVIEW_DEADLINE_RESERVE_SECONDS` (default 3600; `0` keeps only the round estimate) is the tail that must remain for the last round's verification, `compose-review` and submission. When the remaining budget no longer fits another round plus that tail, the round builder refuses to build it, and the composed verdict discloses the truncated audit (an otherwise-Approve verdict is capped at Comment). A missing or malformed deadline leaves the review ungated — the outer timeout still bounds the run.
|
|
412
416
|
|
|
@@ -446,10 +450,10 @@ The high-effort pipeline bounds each stage (shard size, audit rounds), but total
|
|
|
446
450
|
|
|
447
451
|
| Stage | LLM calls | Notes |
|
|
448
452
|
| -------------------------------- | ------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
449
|
-
| Review agents (Step 3) |
|
|
453
|
+
| Review agents (Step 3) | 16 (+0-2) | Run in parallel; Agent 1e only when the diff signals a wrapping type (15 without it); cross-repo skips Agents 1c and 7 (14), local/file skips Agent 0 (15) |
|
|
450
454
|
| Sharded verification (Step 4) | ceil(F/8) | F = findings; at most 8 per verification agent, launched together |
|
|
451
455
|
| Iterative reverse audit (Step 5) | 2-10 (3A); rounds × chunks (3B) | Two consecutive dry rounds to stop; the cap follows the topology — 10 on a small diff, 5 on a chunked one, 3 on a huge one when the run has a deadline. 3B fans out one auditor per chunk per round |
|
|
452
|
-
| **Total** | **~
|
|
456
|
+
| **Total** | **~19-30 (~17-29)** | 3A same-repo: ~19-30 (typical ~19-21); cross-repo or local/file: ~17-29; one fewer when Agent 1e is not rostered; 3B scales with chunks (see DESIGN.md) |
|
|
453
457
|
|
|
454
458
|
Most PRs converge to the lower end of the range; the caps prevent runaway cost on pathological cases. At `--effort low` the review runs entirely inline — **0 subagent calls** — walking the diff once per angle instead of once in total.
|
|
455
459
|
|
|
@@ -101,7 +101,7 @@ Commands for managing AI tools and models.
|
|
|
101
101
|
| `/model --voice` | Set the model used for voice transcription | `/model --voice <model-id>` |
|
|
102
102
|
| `/model --vision` | Set the vision-bridge model used to transcribe images for a text-only main model | `/model --vision <model-id>` |
|
|
103
103
|
| `/model --compaction` | Set the model used for chat compression | `/model --compaction <model-id>`, `/model --compaction clear` |
|
|
104
|
-
| `/model --image` | Set an image-
|
|
104
|
+
| `/model --image` | Set an image-generation-capable model for the built-in image generation tool | `/model --image <model-id>` |
|
|
105
105
|
| `/effort` | Set reasoning effort for thinking-capable models | `/effort` (opens picker), `/effort high` (low/medium/high/xhigh/max; mapped & clamped per provider) |
|
|
106
106
|
| `/extensions` | Manage extensions | `/extensions list`, `/extensions manage` |
|
|
107
107
|
| → `list` | List installed extensions | `/extensions list` |
|
|
@@ -117,7 +117,7 @@ Commands for managing AI tools and models.
|
|
|
117
117
|
| `/permissions` | Manage permission rules | `/permissions` |
|
|
118
118
|
| `/agents` | Manage subagents | `/agents manage`, `/agents create` |
|
|
119
119
|
| `/arena` | Manage Arena sessions | `/arena start`, `/arena stop`, `/arena status`, `/arena select` (alias `choose`) |
|
|
120
|
-
| `/goal` | Set a goal — keep working until condition met
|
|
120
|
+
| `/goal` | Set a goal — keep working until condition met (see [Goals](./goals.md)) | `/goal <condition>`, `/goal clear` |
|
|
121
121
|
| `/tasks` | List background tasks | `/tasks` |
|
|
122
122
|
| `/workflows` | Inspect workflow runs; cooperatively pause/resume a background run | `/workflows`, `/workflows <runId>`, `/workflows p <runId>` |
|
|
123
123
|
| `/lsp` | Show LSP server status | `/lsp` |
|
|
@@ -133,7 +133,7 @@ Commands for managing AI tools and models.
|
|
|
133
133
|
|
|
134
134
|
> [!note]
|
|
135
135
|
>
|
|
136
|
-
> `/workflows`, `/lsp`, and `/trust` are registered only when their feature is enabled — via the `QWEN_CODE_ENABLE_WORKFLOWS=1` env var, the `--experimental-lsp` CLI flag, and the `security.folderTrust.enabled` setting respectively. When disabled
|
|
136
|
+
> `/workflows`, `/lsp`, and `/trust` are registered only when their feature is enabled — via the user/system-scoped `tools.workflowsEnabled` setting or `QWEN_CODE_ENABLE_WORKFLOWS=1` env var, the `--experimental-lsp` CLI flag, and the `security.folderTrust.enabled` setting respectively. Workspace values for `tools.workflowsEnabled` are ignored. When disabled these commands won't appear and will report an unknown command. Similarly, `/dream` and `/forget` are registered only when managed auto-memory is available; without it they won't appear.
|
|
137
137
|
|
|
138
138
|
### 1.5 Built-in Skills
|
|
139
139
|
|
|
@@ -144,6 +144,7 @@ These commands invoke bundled skills that provide specialized workflows.
|
|
|
144
144
|
| `/review` | Multi-agent code review (12 parallel agents at high effort) | `/review`, `/review 123`, `/review 123 --comment`, `/review --effort low` |
|
|
145
145
|
| `/coordinate` | Coordinate read-only workers and one optional worktree writer | `/coordinate investigate and fix the authentication regression` |
|
|
146
146
|
| `/loop` | Run a prompt on a recurring schedule | `/loop 5m check the build` |
|
|
147
|
+
| `/goal-draft` | Turn a fuzzy intention into a verifiable `/goal` objective | `/goal-draft make the auth tests pass` |
|
|
147
148
|
| `/simplify` | Review recent changes and apply safe cleanup edits directly | `/simplify`, `/simplify focus on duplication` |
|
|
148
149
|
| `/qc-helper` | Answer questions about Qwen Code usage and configuration | `/qc-helper how do I configure MCP?` |
|
|
149
150
|
|
|
@@ -1,77 +1,83 @@
|
|
|
1
1
|
# Computer Use
|
|
2
2
|
|
|
3
|
-
Qwen Code
|
|
3
|
+
Qwen Code includes a `computer-use` skill that teaches the model how to
|
|
4
|
+
operate desktop applications through two separately installed packages:
|
|
5
|
+
|
|
6
|
+
```text
|
|
7
|
+
bundled computer-use skill
|
|
8
|
+
-> @qwen-code/node-repl-mcp
|
|
9
|
+
-> @qwen-code/cua-sdk/computer-use
|
|
10
|
+
-> native cua-driver accessibility backend
|
|
11
|
+
```
|
|
4
12
|
|
|
5
|
-
|
|
13
|
+
Qwen Code does not bundle the MCP server, SDK, or native driver. The skill
|
|
14
|
+
installs the external packages automatically when they are missing.
|
|
6
15
|
|
|
7
16
|
> [!warning]
|
|
8
17
|
>
|
|
9
|
-
> Computer Use
|
|
18
|
+
> Computer Use can read application UI and control mouse and keyboard input.
|
|
19
|
+
> Use it only in trusted environments and review MCP approvals carefully.
|
|
10
20
|
|
|
11
|
-
##
|
|
21
|
+
## Automatic setup
|
|
12
22
|
|
|
13
|
-
|
|
23
|
+
Node.js 22 or later and npm are required.
|
|
14
24
|
|
|
15
|
-
|
|
25
|
+
When first used, the skill runs these commands itself:
|
|
16
26
|
|
|
17
|
-
```
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
"computerUse": {
|
|
21
|
-
"enabled": false,
|
|
22
|
-
},
|
|
23
|
-
},
|
|
24
|
-
}
|
|
27
|
+
```bash
|
|
28
|
+
qwen mcp add --scope user node-repl npx -y @qwen-code/node-repl-mcp@0.1.0
|
|
29
|
+
npm install --no-save --package-lock=false @qwen-code/cua-sdk@0.20.0
|
|
25
30
|
```
|
|
26
31
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
## First run and the native driver
|
|
30
|
-
|
|
31
|
-
The first time the agent invokes a Computer Use tool, Qwen Code downloads a pinned, signed `cua-driver` binary (~20 MB) into `~/.qwen/computer-use/` and spawns it as a local process. Prebuilt binaries are published for macOS (Apple Silicon and Intel), Linux (x86_64), and Windows (x86_64).
|
|
32
|
-
|
|
33
|
-
### macOS permissions
|
|
34
|
-
|
|
35
|
-
On macOS, desktop automation requires two system permissions:
|
|
32
|
+
Restart Qwen Code after the MCP server is first added. The skill then resumes
|
|
33
|
+
the desktop task through `node_repl`.
|
|
36
34
|
|
|
37
|
-
|
|
38
|
-
|
|
35
|
+
The SDK installation leaves `package.json` and the lockfile unchanged, but it
|
|
36
|
+
does write to the workspace's `node_modules`. Its postinstall downloads and
|
|
37
|
+
verifies the native payload for the current platform.
|
|
39
38
|
|
|
40
|
-
|
|
39
|
+
Removing the MCP configuration or workspace SDK installation disables the
|
|
40
|
+
execution path; there is no legacy fallback.
|
|
41
41
|
|
|
42
|
-
##
|
|
42
|
+
## Use
|
|
43
43
|
|
|
44
|
-
|
|
44
|
+
Ask Qwen Code to use `$computer-use` for the desktop task. After bootstrap, it
|
|
45
|
+
follows the standard Computer Use workflow:
|
|
45
46
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
| Browser pages | `page` (execute JavaScript, read text, query the DOM, click elements) |
|
|
53
|
-
| Screenshots | `get_window_state` (captures a PNG), `page` |
|
|
54
|
-
| Recording | `start_recording`, `stop_recording`, `replay_trajectory` (record/replay a session) |
|
|
55
|
-
| Sessions | `start_session`, `end_session`, agent-cursor overlay controls |
|
|
47
|
+
1. discovers the exact application and window;
|
|
48
|
+
2. observes full accessibility state;
|
|
49
|
+
3. acts through current semantic element tokens when possible;
|
|
50
|
+
4. fetches fresh state after every mutation;
|
|
51
|
+
5. verifies the requested result; and
|
|
52
|
+
6. closes the SDK client and resets the REPL.
|
|
56
53
|
|
|
57
|
-
|
|
54
|
+
The driver is the only component that computes observation diffs. Model code
|
|
55
|
+
uses the typed SDK methods and does not dispatch arbitrary driver tool names.
|
|
58
56
|
|
|
59
|
-
|
|
57
|
+
## Permissions
|
|
60
58
|
|
|
61
|
-
|
|
59
|
+
The Node REPL is an MCP server that executes model-authored JavaScript with
|
|
60
|
+
ordinary Node.js authority. Its calls follow Qwen Code's normal
|
|
61
|
+
[MCP approval flow](./approval-mode.md). The SDK also enforces native
|
|
62
|
+
authorization.
|
|
62
63
|
|
|
63
|
-
|
|
64
|
+
On macOS, accessibility observation and input require Accessibility permission.
|
|
65
|
+
Screenshots additionally require Screen Recording permission. macOS may
|
|
66
|
+
attribute the grant to the terminal or IDE that launched Qwen Code. Windows and
|
|
67
|
+
Linux use their platform accessibility and input facilities.
|
|
64
68
|
|
|
65
|
-
|
|
66
|
-
| ------------------------------------- | ------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
67
|
-
| `tools.computerUse.enabled` | boolean | `true` | Register the `computer_use__*` tools. When `false`, the driver is never downloaded or spawned. |
|
|
68
|
-
| `tools.computerUse.maxImageDimension` | number | `-1` | Longest-edge pixel cap for screenshots. `-1` keeps the driver's default (1568); `0` disables resizing (full resolution); a positive value caps the longest edge. Lower caps cut vision-token cost. Env override: `QWEN_COMPUTER_USE_MAX_IMAGE_DIMENSION`. |
|
|
69
|
-
| `tools.computerUse.idleTimeoutMs` | number | `300000` | Milliseconds to keep the driver process alive after the last `computer_use__*` call (default 5 minutes). `0` keeps it running until Qwen Code exits. |
|
|
69
|
+
## Troubleshooting
|
|
70
70
|
|
|
71
|
-
|
|
71
|
+
- If `node_repl` is still unavailable after automatic setup, restart Qwen Code
|
|
72
|
+
and verify the server with `qwen mcp list`.
|
|
73
|
+
- If the SDK import still fails after automatic setup, confirm Qwen Code is
|
|
74
|
+
running from the workspace where the package was installed.
|
|
75
|
+
- After a timeout, cancellation, reset, or kernel crash, bootstrap the SDK
|
|
76
|
+
client again and request fresh state.
|
|
72
77
|
|
|
73
78
|
## See also
|
|
74
79
|
|
|
75
|
-
- [
|
|
76
|
-
- [
|
|
77
|
-
- [
|
|
80
|
+
- [Skills](./skills.md)
|
|
81
|
+
- [MCP servers](./mcp.md)
|
|
82
|
+
- [Approval Mode](./approval-mode.md)
|
|
83
|
+
- [Sandboxing](./sandbox.md)
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# Goals
|
|
2
|
+
|
|
3
|
+
A Goal keeps Qwen Code working across turns until a stated condition is met. Set one with `/goal <objective>`; after each turn an independent verifier checks the transcript, and the session keeps going until the objective is verified complete, verified blocked, paused, or cleared.
|
|
4
|
+
|
|
5
|
+
## Commands
|
|
6
|
+
|
|
7
|
+
| Command | Behavior |
|
|
8
|
+
| ------------------------ | ------------------------------------------------------------- |
|
|
9
|
+
| `/goal` | Show the current Goal and its status. |
|
|
10
|
+
| `/goal <objective>` | Create a Goal, or replace the active one. |
|
|
11
|
+
| `/goal set <objective>` | Same as above, explicit form. |
|
|
12
|
+
| `/goal edit <objective>` | Revise the active Goal's wording without starting over. |
|
|
13
|
+
| `/goal pause` / `resume` | Stop or continue the loop without losing the Goal. |
|
|
14
|
+
| `/goal clear` | Remove the Goal. |
|
|
15
|
+
| `/goal-draft <intent>` | Have the objective written for you before you set it (below). |
|
|
16
|
+
|
|
17
|
+
Creating, editing, or resuming a Goal requires a trusted workspace (`/trust`). Headless usage is covered in [Headless Mode](./headless.md#run-a-persistent-goal).
|
|
18
|
+
|
|
19
|
+
## How a Goal is judged
|
|
20
|
+
|
|
21
|
+
The verifier never runs commands or reads files on its own. It only sees what is already in the transcript:
|
|
22
|
+
|
|
23
|
+
- Visible assistant output and tool results count as evidence. The objective text, your prompts, and the model's hidden reasoning do not.
|
|
24
|
+
- Printed text proves only that text was printed. A claim that tests pass, a file changed, or a remote is updated needs the corresponding tool result in the transcript.
|
|
25
|
+
- A claim that you confirmed, chose, or approved something needs a real message from you; the verifier rejects proposals that assume it.
|
|
26
|
+
- When evidence is missing the verdict is "not yet", not "done". A condition nobody can evidence keeps the loop running until a limit stops it.
|
|
27
|
+
|
|
28
|
+
So the objective has to make the agent produce evidence: run the named check and show the decisive output.
|
|
29
|
+
|
|
30
|
+
## Writing a good objective
|
|
31
|
+
|
|
32
|
+
Put these into the objective, in this order:
|
|
33
|
+
|
|
34
|
+
| Part | What to write |
|
|
35
|
+
| ------------ | ------------------------------------------------------------------------------------------------------------------------------------- |
|
|
36
|
+
| `Outcome:` | One sentence: what is true when this is done. |
|
|
37
|
+
| `Done when:` | Numbered, binary checks. At least one names a command and its expected exit code or output line, and asks for that line to be pasted. |
|
|
38
|
+
| `Must not:` | Files not to touch, tests or thresholds not to weaken, irreversible actions (push, delete, publish) not to take. |
|
|
39
|
+
| `Budget:` | When to give up: "stop as blocked after 20 turns" or a time limit. |
|
|
40
|
+
| `On block:` | What to report when stuck, and which decision a human must make. |
|
|
41
|
+
| `Context:` | Only facts the agent cannot find in the workspace: branch, environment, earlier decisions. |
|
|
42
|
+
|
|
43
|
+
Keep it to one objective and roughly under 1,200 characters. `/goal set` and `/goal edit` collapse newlines to spaces, so number the items rather than relying on line breaks.
|
|
44
|
+
|
|
45
|
+
| Weak | Why it fails | Stronger |
|
|
46
|
+
| -------------------------- | ----------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
47
|
+
| make checkout faster | No threshold, no check. | `Outcome: checkout p95 is below 250 ms. Done when: 1) npm run bench:checkout exits 0 and prints p95 < 250 (paste the line); 2) npm test exits 0. Must not: change the benchmark or skip tests. Budget: stop as blocked after 20 turns.` |
|
|
48
|
+
| clean up the auth module | "Clean" has no evidence. | Ask what would be observable: zero lint warnings in `src/auth`, a coverage threshold, a file count. |
|
|
49
|
+
| ship the release | Irreversible, and needs a human decision. | Narrow to a checkable pre-release state (tag exists, `npm run release:dry-run` exits 0) and put "do not publish" in `Must not`. |
|
|
50
|
+
| after I confirm the design | The verifier cannot see a confirmation that never happened. | Move it to `On block:` as the decision a human must make. |
|
|
51
|
+
|
|
52
|
+
## Let `/goal-draft` write it
|
|
53
|
+
|
|
54
|
+
`/goal-draft <what you want done>` is a bundled skill that does the above for you. It checks whether the request is a Goal at all, reads the workspace for the real test and lint commands instead of guessing, asks at most one round of multiple-choice questions when the answer changes the check or the scope, drafts the objective in the format above, runs the self-check, and prints a `/goal set …` line you can run as-is. It never starts the work itself and never sets the Goal on your behalf.
|
|
55
|
+
|
|
56
|
+
Pass an existing objective to tighten it: `/goal-draft all tests pass and the lint is clean`.
|
|
57
|
+
|
|
58
|
+
The skill is instructed to be read-only, and only its non-mutating tools are auto-approved (`get_goal`, `read_file`, `glob`, `grep_search`). `ask_user_question` is deliberately not auto-approved, so its question dialog is shown before the skill drafts from your answers. Like other bundled skills, a project or personal skill named `goal-draft` overrides it, and `skills.disabled` can turn it off. See [Skills](./skills.md) for how bundled skills are discovered.
|