@qwen-code/qwen-code 0.19.11 → 0.19.12-preview.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundled/batch/SKILL.md +6 -0
- package/bundled/qc-helper/docs/configuration/model-providers.md +11 -0
- package/bundled/qc-helper/docs/configuration/settings.md +11 -10
- package/bundled/qc-helper/docs/features/channels/overview.md +66 -11
- package/bundled/qc-helper/docs/features/sub-agents.md +8 -8
- package/bundled/qc-helper/docs/features/worktree.md +2 -2
- package/bundled/qc-helper/docs/qwen-serve-deploy-local.md +42 -7
- package/bundled/qc-helper/docs/qwen-serve.md +102 -40
- package/bundled/qc-helper/docs/reference/keyboard-shortcuts.md +1 -1
- package/bundled/review/SKILL.md +60 -49
- package/bundled/simplify/SKILL.md +1 -1
- package/chunks/{MaxSizedBox-L6TGYDM3.js → MaxSizedBox-3KIWAU6Z.js} +31 -32
- package/chunks/{StandaloneSessionPicker-AKEQHU5P.js → StandaloneSessionPicker-TF626NO7.js} +45 -46
- package/chunks/acp-startup-profiler-N3RHHXJ3.js +25 -0
- package/chunks/{acpAgent-PTNBGJDN.js → acpAgent-JDVJXVBO.js} +1863 -507
- package/chunks/{agent-AJOMOZPJ.js → agent-BONWC4VY.js} +26 -27
- package/chunks/{agent-headless-CYKOMAXS.js → agent-headless-H7HKMGLZ.js} +26 -27
- package/chunks/{anthropicContentGenerator-HBRXJSP4.js → anthropicContentGenerator-ZZRGFEES.js} +35 -12
- package/chunks/{artifact-tool-MIZLXBLF.js → artifact-tool-PHO5XEGZ.js} +5 -5
- package/chunks/{askUserQuestion-XMJVPNWM.js → askUserQuestion-CEPBT47X.js} +2 -47
- package/chunks/{bridge-QKISWPCI.js → bridge-ATN2TLWJ.js} +31 -32
- package/chunks/{ca-CODEN7TD.js → ca-2SL2BXTK.js} +3 -2
- package/chunks/{channel-worker-group-SOUWTFHC.js → channel-worker-group-S3H5QHTI.js} +4 -4
- package/chunks/{channel-worker-manager-LOVSV3WW.js → channel-worker-manager-ZJ4HTMO2.js} +4 -4
- package/chunks/{channel-worker-supervisor-XW6MHJBQ.js → channel-worker-supervisor-JA6VZ5V5.js} +3 -3
- package/chunks/{chunk-ZIXOTAPZ.js → chunk-2DZ7E27L.js} +92 -3
- package/chunks/{chunk-L5U3ELZX.js → chunk-335ECZTA.js} +1 -1
- package/chunks/{chunk-2FO5GFKZ.js → chunk-3DJY4IFO.js} +1 -1
- package/chunks/{chunk-4AGTGMCQ.js → chunk-3PE7OY2G.js} +12 -12
- package/chunks/{chunk-QOTQH4CB.js → chunk-4AGBO6RB.js} +27 -10
- package/chunks/{chunk-Y66VOBRP.js → chunk-4CA4WUMS.js} +2 -2
- package/chunks/{chunk-LQIDP6K5.js → chunk-4CHDYDG3.js} +1 -1
- package/chunks/{chunk-574PTLMU.js → chunk-4OVECYBM.js} +407 -92
- package/chunks/{chunk-TV6K2FB4.js → chunk-4RPARQ5D.js} +2 -2
- package/chunks/{chunk-TL4R5TRK.js → chunk-4W55BHOC.js} +2 -2
- package/chunks/{chunk-RCEEXIOO.js → chunk-4XCVGEEX.js} +3 -3
- package/chunks/{chunk-3DWIFU7L.js → chunk-53UMEONK.js} +1 -1
- package/chunks/{chunk-AU3MFJPL.js → chunk-54KPEDM2.js} +8 -8
- package/chunks/{chunk-T76DGHGG.js → chunk-66F4IJ4L.js} +5 -5
- package/chunks/{chunk-YLSSEUAM.js → chunk-675SVDMD.js} +354 -278
- package/chunks/{chunk-NVTQZXR7.js → chunk-6QGZVKOO.js} +91 -52
- package/chunks/{chunk-NJOFRXTM.js → chunk-6TDA4EVC.js} +4200 -3450
- package/chunks/{chunk-BYH2JRK3.js → chunk-6WZZHJSZ.js} +5 -5
- package/chunks/{chunk-7X7TEQNX.js → chunk-76BFY7AF.js} +13 -0
- package/chunks/chunk-7KS72E2N.js +883 -0
- package/chunks/{chunk-CF5VJRGC.js → chunk-7LMAKIWE.js} +1 -1
- package/chunks/{chunk-WMNXXRGL.js → chunk-7O7WZH7N.js} +31 -31
- package/chunks/{chunk-7ZYHLN67.js → chunk-7OZGMFHC.js} +26 -75
- package/chunks/{chunk-6WPJRYLZ.js → chunk-7SX6WZNO.js} +3 -3
- package/chunks/{chunk-JGUT3LWZ.js → chunk-ANRANWVE.js} +4 -1
- package/chunks/{chunk-JD44PNGJ.js → chunk-AWOU24F6.js} +10 -5
- package/chunks/{chunk-6WGZDD67.js → chunk-BEFQGC6H.js} +2 -2
- package/chunks/{chunk-KXYJPRT5.js → chunk-BEZPRKD3.js} +28 -6
- package/chunks/{chunk-FYQ22K62.js → chunk-CHVH4DVN.js} +6 -5
- package/chunks/{chunk-LS56TX3M.js → chunk-CMHJEUVB.js} +1 -1
- package/chunks/{chunk-FXKOAEXP.js → chunk-CXWUXRD5.js} +14 -14
- package/chunks/{chunk-CAHY5ABC.js → chunk-DULSE2SH.js} +1 -1
- package/chunks/{chunk-SQ5BK3GO.js → chunk-DYUPBU7H.js} +1 -1
- package/chunks/{chunk-FNX3LGAK.js → chunk-E655RDRL.js} +1 -1
- package/chunks/{chunk-N5VIZTND.js → chunk-EWPLL4OT.js} +1 -1
- package/chunks/{chunk-FSA7ERJ2.js → chunk-F2RR4HO2.js} +1 -1
- package/chunks/{chunk-S63Z5V42.js → chunk-F2YCCUXI.js} +4 -4
- package/chunks/{chunk-3AYLDB6B.js → chunk-FEZXQXW2.js} +1 -1
- package/chunks/{chunk-OWT2CAEQ.js → chunk-GEHSF7MS.js} +105 -12
- package/chunks/{chunk-LXLTBIDP.js → chunk-HCCR43AY.js} +1 -1
- package/chunks/{chunk-7NMU22Q3.js → chunk-HQ7MDVBO.js} +18 -7
- package/chunks/{chunk-KSZKSE23.js → chunk-HVWPSGDY.js} +1 -1
- package/chunks/{chunk-YFVO2HOR.js → chunk-HZXU6YZW.js} +5 -5
- package/chunks/{chunk-HASK4LMI.js → chunk-IKLWU6YS.js} +13 -6
- package/chunks/{chunk-GNBBAQ6J.js → chunk-ILQ42UG6.js} +111 -40
- package/chunks/{chunk-THXDQSTA.js → chunk-IQRQVPGN.js} +49 -154
- package/chunks/{chunk-SPJQO2CE.js → chunk-J2MKYJKZ.js} +2 -2
- package/chunks/{chunk-SUARMD4Q.js → chunk-J6NT5YTN.js} +28 -2
- package/chunks/{chunk-TYLOFD2U.js → chunk-JCJPZMJV.js} +1 -1
- package/chunks/{chunk-BYB3GF2T.js → chunk-JCYMQU5F.js} +133 -6
- package/chunks/{chunk-6EDDYPI3.js → chunk-JUNVFQVY.js} +4 -4
- package/chunks/{chunk-CH2XVB47.js → chunk-K7P34F2J.js} +3 -3
- package/chunks/{chunk-5VWYKIMW.js → chunk-KANTXY7B.js} +2 -2
- package/chunks/{chunk-K7VD4XLT.js → chunk-LHEQDKAR.js} +1 -1
- package/chunks/{chunk-A2HWMJVO.js → chunk-LKR7QQ63.js} +3 -3
- package/chunks/{chunk-4HUDDSO5.js → chunk-LLIGYAQU.js} +4 -4
- package/chunks/{chunk-5Z452MMD.js → chunk-LODZMRXC.js} +154 -83
- package/chunks/{chunk-FBU7WRZI.js → chunk-LPHGXXZX.js} +6 -1
- package/chunks/{chunk-CPFIQVZJ.js → chunk-LYFDJTXE.js} +1 -1
- package/chunks/{chunk-TIOE2OPE.js → chunk-MCYZTKBV.js} +2 -2
- package/chunks/{chunk-ZQIYGQCG.js → chunk-MHEZV3OY.js} +506 -143
- package/chunks/{chunk-JWICTOXS.js → chunk-NGTQA57Y.js} +2 -2
- package/chunks/{chunk-5CNYZ7TN.js → chunk-NJQPQ4IO.js} +7 -7
- package/chunks/chunk-NSZJQACR.js +45 -0
- package/chunks/{chunk-DOPUYNXO.js → chunk-NUHSLBJZ.js} +7 -7
- package/chunks/{chunk-CITWNIXJ.js → chunk-NVUGS23Y.js} +5 -5
- package/chunks/{chunk-2Z5UX4KI.js → chunk-OSSDHJDU.js} +1 -1
- package/chunks/{chunk-YUZI3WAC.js → chunk-OWAK7LMW.js} +7 -0
- package/chunks/{chunk-Y3KFTWVX.js → chunk-OZWJAFFE.js} +6 -6
- package/chunks/{chunk-YGYSMY2R.js → chunk-PSISZNIT.js} +1629 -1142
- package/chunks/{chunk-4ROQY23C.js → chunk-PTXVHS2O.js} +7 -7
- package/chunks/{chunk-OKAIGAYW.js → chunk-QGONRHUS.js} +3 -3
- package/chunks/{chunk-PZL23GTM.js → chunk-QR6U5QPP.js} +8 -0
- package/chunks/chunk-QSG4ZFG4.js +257 -0
- package/chunks/{chunk-BXBDC476.js → chunk-R32BTEZY.js} +5 -5
- package/chunks/{chunk-AVEOWVOM.js → chunk-R3VWUU2E.js} +1 -1
- package/chunks/{chunk-RP5R7MB6.js → chunk-R4RIMOJL.js} +12 -12
- package/chunks/{chunk-ARKANCNX.js → chunk-SGPFJMRP.js} +1 -1
- package/chunks/{chunk-3M75MSVA.js → chunk-SMASS3CY.js} +1 -1
- package/chunks/{chunk-4IJMTYCB.js → chunk-SNONG66P.js} +818 -29
- package/chunks/chunk-TDKQP3M6.js +201 -0
- package/chunks/{chunk-VFX7EZIR.js → chunk-TFV3XVAZ.js} +8 -1
- package/chunks/{chunk-4LD5APFL.js → chunk-TYQMGACW.js} +1 -0
- package/chunks/{chunk-7NFB7LBQ.js → chunk-UE5TZ55T.js} +8 -0
- package/chunks/{chunk-F333XEAU.js → chunk-UOA2IHRI.js} +4 -3
- package/chunks/{chunk-VRR65QYW.js → chunk-V4PCIS25.js} +5 -1
- package/chunks/{chunk-WIEO4CWB.js → chunk-VAJS2E2D.js} +1 -1
- package/chunks/{chunk-GLNHPRZT.js → chunk-W4DFAUAO.js} +1 -1
- package/chunks/{chunk-STZQCNN3.js → chunk-W7H223ZZ.js} +1 -1
- package/chunks/{chunk-6Y6ORE2G.js → chunk-WACI4VES.js} +288 -20
- package/chunks/{chunk-WTNZ6DXB.js → chunk-WEPXQKGP.js} +1 -1
- package/chunks/{chunk-4BJVSIS3.js → chunk-WHQNBBWW.js} +2 -2
- package/chunks/{chunk-QDJ2R4CM.js → chunk-WTHRMVKB.js} +3 -3
- package/chunks/{chunk-L4Y55KIS.js → chunk-X6YQWCIJ.js} +1 -1
- package/chunks/{chunk-Q6TUALBE.js → chunk-XAAEDML2.js} +1 -1
- package/chunks/{chunk-BUAXJVNP.js → chunk-XACBIZJB.js} +3 -3
- package/chunks/{chunk-2OG646IN.js → chunk-XFJU7SVP.js} +4 -4
- package/chunks/{chunk-KKRTYONM.js → chunk-XSPFQQRE.js} +3 -3
- package/chunks/{chunk-V2DXTLUE.js → chunk-Y5UDBQYF.js} +3 -3
- package/chunks/{chunk-MQOVXZAF.js → chunk-YN2I5I42.js} +529 -61
- package/chunks/{chunk-FMNYGWOD.js → chunk-Z4ZCVYJ5.js} +14 -8
- package/chunks/{chunk-SY7NEYX4.js → chunk-ZFHHBRRA.js} +2 -2
- package/chunks/{chunk-QYG4BY6Q.js → chunk-ZPVGEMVC.js} +1 -1
- package/chunks/{computer-use-VZZMJEQ7.js → computer-use-UY4A72X7.js} +26 -27
- package/chunks/{config-utils-IQQT3GCI.js → config-utils-KWTRFP7D.js} +3 -3
- package/chunks/{contextCommand-PORKIZSY.js → contextCommand-3DZ2SVH6.js} +30 -31
- package/chunks/{create-sub-session-EAB2U5XW.js → create-sub-session-DIJOV6HV.js} +2 -2
- package/chunks/{create-sub-session-XVFKHAFW.js → create-sub-session-OT7WXLDO.js} +27 -28
- package/chunks/{cron-create-GMVKSXZT.js → cron-create-X462ERYA.js} +4 -4
- package/chunks/{cron-delete-VDZKUAVK.js → cron-delete-SL5UJUM3.js} +4 -4
- package/chunks/{cron-list-UG7C7RAR.js → cron-list-3MD6SVXI.js} +4 -4
- package/chunks/{daemon-IHR6WSPB.js → daemon-ZW6LHOXT.js} +91 -14
- package/chunks/{daemon-status-provider-ABLBA3UJ.js → daemon-status-provider-GTZOYSBO.js} +35 -36
- package/chunks/{de-NOXPCSYN.js → de-I7ZIYXZC.js} +3 -2
- package/chunks/{dist-PX2ERZ6I.js → dist-HCUUS6IH.js} +2 -2
- package/chunks/{dist-VYWUKURL.js → dist-O2IP3G5D.js} +1 -1
- package/chunks/{dist-GXJVCOS7.js → dist-RZBJT5O2.js} +2 -1
- package/chunks/{dist-V2YVLYOW.js → dist-Y54RURGT.js} +3 -1
- package/chunks/{dist-DOPL5LSQ.js → dist-YTPTCUAD.js} +1 -1
- package/chunks/{dist-4WCQEZIN.js → dist-ZJHKKWUD.js} +1 -1
- package/chunks/{earlyInputCapture-DJCU5SPU.js → earlyInputCapture-GGWVGBZ7.js} +27 -28
- package/chunks/{edit-O4VV5AO6.js → edit-JN467GIR.js} +27 -28
- package/chunks/{en-JFVULHTB.js → en-XE34GKAA.js} +7 -3
- package/chunks/{enter-worktree-XQYDDI2I.js → enter-worktree-MMO4VBQE.js} +26 -27
- package/chunks/{enterPlanMode-CESVMQBV.js → enterPlanMode-BRZOG4DB.js} +27 -30
- package/chunks/{environment-5KXOLZNR.js → environment-LOCDCWMZ.js} +29 -30
- package/chunks/{errors-EBUTCBAQ.js → errors-XXSL5HGG.js} +29 -30
- package/chunks/{exit-worktree-MWGNSPNX.js → exit-worktree-UD7PI5H5.js} +26 -27
- package/chunks/exitPlanMode-EIUETQI6.js +389 -0
- package/chunks/{fast-path-6V73F2T2.js → fast-path-ULGAEUVK.js} +2 -2
- package/chunks/{fr-HVFNU42H.js → fr-X7KDVZIY.js} +3 -2
- package/chunks/{gemini-TEFJZCIZ.js → gemini-KW3APZ4P.js} +133 -80
- package/chunks/{geminiContentGenerator-M56BEXWI.js → geminiContentGenerator-4BQ5QHPR.js} +5 -5
- package/chunks/{glob-DMYFEEAZ.js → glob-FPKAMR6B.js} +32 -28
- package/chunks/{grep-GYE47MD4.js → grep-MOGRCYB4.js} +32 -28
- package/chunks/{handleAutoUpdate-OLUY4L7L.js → handleAutoUpdate-QUMRZZOS.js} +33 -34
- package/chunks/{i18n-462JC7IY.js → i18n-F3W6YUYP.js} +28 -29
- package/chunks/{initializer-Y7WD4D2I.js → initializer-KLU2KAIZ.js} +33 -34
- package/chunks/{installationInfo-I2Z3BKCE.js → installationInfo-P3ZP2SIZ.js} +27 -28
- package/chunks/{ja-PY5AF544.js → ja-2ICT3KXF.js} +3 -2
- package/chunks/{keychain-token-storage-AU22CQI6.js → keychain-token-storage-K23CFKGN.js} +2 -2
- package/chunks/{list-XQ5MSAXP.js → list-4X6D5JD2.js} +35 -36
- package/chunks/{loadedSettingsAdapter-TQOWYE7C.js → loadedSettingsAdapter-446B6WKA.js} +32 -33
- package/chunks/{loop-wakeup-QXWZSCYM.js → loop-wakeup-6H7OENTB.js} +5 -5
- package/chunks/{ls-2OUTG3IZ.js → ls-APTSOOS5.js} +4 -4
- package/chunks/{lsp-4VMNXZW6.js → lsp-HPACPJAN.js} +2 -2
- package/chunks/{mcp-22LLEEVM.js → mcp-JYVOJZOD.js} +32 -33
- package/chunks/{monitor-VKG324X3.js → monitor-KY7YH7TL.js} +26 -27
- package/chunks/nonInteractiveCli-EK35TLVJ.js +129 -0
- package/chunks/{notebook-edit-FJJRBQ3S.js → notebook-edit-IHGW42QK.js} +27 -28
- package/chunks/{openaiContentGenerator-4T2OGTR5.js → openaiContentGenerator-FURUCKQJ.js} +13 -14
- package/chunks/{pidfile-XL3MDCBM.js → pidfile-WKUVXDMR.js} +27 -28
- package/chunks/{processUtils-7UCFN34D.js → processUtils-LHSRN76X.js} +2 -2
- package/chunks/{pt-A3PRQXMU.js → pt-JJ4XPIBP.js} +3 -2
- package/chunks/{qwenContentGenerator-PQUXJDIZ.js → qwenContentGenerator-NRLM7R36.js} +30 -31
- package/chunks/{qwenOAuth2-LEYOU7RU.js → qwenOAuth2-5FNX3AWH.js} +22 -5
- package/chunks/{read-file-3EYQML7E.js → read-file-VLEAEXFP.js} +9 -10
- package/chunks/{read-mcp-resource-JUFHCKSC.js → read-mcp-resource-C6NT52T6.js} +2 -2
- package/chunks/{record-artifact-DWSMBXYY.js → record-artifact-ENCU7QCL.js} +2 -2
- package/chunks/{ripGrep-S6WPGQNA.js → ripGrep-MT23EIDD.js} +26 -27
- package/chunks/{ru-IBCWUTOC.js → ru-STR4KTW7.js} +3 -2
- package/chunks/{run-qwen-serve-NSKBT3HU.js → run-qwen-serve-5HWOQFLI.js} +63 -47
- package/chunks/{runtime-LG5ZZ3VH.js → runtime-6IVKJSLW.js} +38 -37
- package/chunks/{scheduler-PLX3VVTB.js → scheduler-63GJG75U.js} +26 -27
- package/chunks/{send-message-JZ752NWD.js → send-message-5GZ4FX2V.js} +3 -3
- package/chunks/{serve-S2ZLRZZR.js → serve-3LL7RRDP.js} +32 -33
- package/chunks/{server-5ECMV4TM.js → server-AA24QLPA.js} +1672 -615
- package/chunks/{session-ILSONWG4.js → session-LRVCFQQQ.js} +102 -75
- package/chunks/{settings-BOE7WWSA.js → settings-ZX3OKUT4.js} +36 -37
- package/chunks/{shell-VW664JIZ.js → shell-KR3IMYH6.js} +26 -27
- package/chunks/{skill-COHV6625.js → skill-QLM2LSF7.js} +11 -12
- package/chunks/{spawnChannel-5UUR5XOZ.js → spawnChannel-6WFOK3SA.js} +28 -29
- package/chunks/{src-XPKFZ3RN.js → src-ADLNIPHD.js} +101 -72
- package/chunks/{standalone-update-IOOJ2NZQ.js → standalone-update-C54OTJWJ.js} +29 -30
- package/chunks/{startInteractiveUI-3NGJGXXS.js → startInteractiveUI-KFAOS6HC.js} +2342 -1796
- package/chunks/{stdioHelpers-UMY72QRP.js → stdioHelpers-HGIYTWAY.js} +3 -1
- package/chunks/{syntheticOutput-LELY6HAI.js → syntheticOutput-ULOVVLY4.js} +3 -3
- package/chunks/{task-create-QY3BIMNM.js → task-create-DUE2PMNI.js} +7 -7
- package/chunks/{task-list-D2U47WBJ.js → task-list-WVPNX7BZ.js} +5 -5
- package/chunks/{task-stop-N6E5IYLH.js → task-stop-CPEQWOT6.js} +2 -2
- package/chunks/{task-update-HJCQILLB.js → task-update-HY2LNFFB.js} +7 -7
- package/chunks/{team-create-UPLVZQFX.js → team-create-Q5B5M7UD.js} +26 -27
- package/chunks/{team-delete-RCWYDRF4.js → team-delete-JJV6IUOA.js} +5 -5
- package/chunks/{team-plan-approval-F5F432RO.js → team-plan-approval-J55PXNY2.js} +26 -27
- package/chunks/{theme-manager-JJE4BJ67.js → theme-manager-QWTDRPHV.js} +27 -28
- package/chunks/todoWrite-JHHIDOIV.js +358 -0
- package/chunks/{tool-search-LRXI4JLZ.js → tool-search-LSSKWZKH.js} +10 -11
- package/chunks/{total-session-admission-I4DHN6UP.js → total-session-admission-S6ATY5HY.js} +32 -33
- package/chunks/{trustedFolders-SEH7LNX2.js → trustedFolders-CY4TUPDJ.js} +28 -29
- package/chunks/turndown.cjs-FZHGMUTY.js +17670 -0
- package/chunks/{update-relaunch-T6ZKBUA6.js → update-relaunch-IOKOUV3K.js} +6 -6
- package/chunks/{updateCheck-FWLXZPRO.js → updateCheck-YNRFE4V7.js} +30 -31
- package/chunks/{validateNonInterActiveAuth-X6K2VWYT.js → validateNonInterActiveAuth-OXTECS4B.js} +68 -68
- package/chunks/{version-LIFSOGSE.js → version-2CZQQDL5.js} +1 -1
- package/chunks/web-fetch-7QTEGJI5.js +938 -0
- package/chunks/{workflow-NX2DFWGD.js → workflow-G3CZU256.js} +29 -30
- package/chunks/{workspace-providers-status-VYD6M2NE.js → workspace-providers-status-UHQOIPAZ.js} +35 -36
- package/chunks/{workspace-registration-store-2Y6PWOEL.js → workspace-registration-store-5WPCMX4F.js} +1 -1
- package/chunks/{workspace-registry-PKBDBWCA.js → workspace-registry-LAQCRQTH.js} +32 -33
- package/chunks/{workspace-service-HHORUHTS.js → workspace-service-6ZEUJY2Z.js} +38 -39
- package/chunks/{workspace-skills-status-O5Q26LIY.js → workspace-skills-status-YG6OITSM.js} +33 -34
- package/chunks/{write-file-NVAEZ3J2.js → write-file-E7T3PU3B.js} +60 -28
- package/chunks/{zh-PAUNIMHQ.js → zh-6ANG2HTL.js} +7 -3
- package/chunks/{zh-TW-GNEUIUFF.js → zh-TW-4RR3YHNN.js} +7 -3
- package/cli-entry.js +37 -2
- package/cli.js +17 -11
- package/locales/ca.js +3 -2
- package/locales/de.js +3 -2
- package/locales/en.js +10 -5
- package/locales/fr.js +3 -2
- package/locales/ja.js +3 -2
- package/locales/pt.js +3 -2
- package/locales/ru.js +3 -2
- package/locales/zh-TW.js +9 -3
- package/locales/zh.js +9 -3
- package/package.json +3 -3
- package/web-shell/assets/{arc-H74fE8UR.js → arc-_dVIKMdB.js} +1 -1
- package/web-shell/assets/{architectureDiagram-3BPJPVTR-DN3kEq-I.js → architectureDiagram-3BPJPVTR-MuN3nKpL.js} +1 -1
- package/web-shell/assets/{blockDiagram-GPEHLZMM-BrqbsFUF.js → blockDiagram-GPEHLZMM-BtmvJjzx.js} +1 -1
- package/web-shell/assets/{c4Diagram-AAUBKEIU-ClFhU1P-.js → c4Diagram-AAUBKEIU-Dvi58_BU.js} +1 -1
- package/web-shell/assets/channel-Bi5TehaT.js +1 -0
- package/web-shell/assets/{chunk-2J33WTMH-jCIcG0_M.js → chunk-2J33WTMH-YqxOVhS1.js} +1 -1
- package/web-shell/assets/{chunk-4BX2VUAB-DSkGe62-.js → chunk-4BX2VUAB-DoBgbC9z.js} +1 -1
- package/web-shell/assets/{chunk-55IACEB6-BxBHOGTd.js → chunk-55IACEB6-3NEQrBAr.js} +1 -1
- package/web-shell/assets/{chunk-727SXJPM-v_DS7dH7.js → chunk-727SXJPM-DrCZQxp0.js} +1 -1
- package/web-shell/assets/{chunk-AQP2D5EJ-1RzEKRPq.js → chunk-AQP2D5EJ-m_g3zjgv.js} +1 -1
- package/web-shell/assets/{chunk-FMBD7UC4-DyrSbLOX.js → chunk-FMBD7UC4-D1_crABJ.js} +1 -1
- package/web-shell/assets/{chunk-ND2GUHAM-BCmdsZiy.js → chunk-ND2GUHAM-BdhgVtBx.js} +1 -1
- package/web-shell/assets/{chunk-QZHKN3VN-CphHGW2D.js → chunk-QZHKN3VN-BlmThhm-.js} +1 -1
- package/web-shell/assets/classDiagram-4FO5ZUOK-BKhhRdd1.js +1 -0
- package/web-shell/assets/classDiagram-v2-Q7XG4LA2-BKhhRdd1.js +1 -0
- package/web-shell/assets/{cose-bilkent-S5V4N54A-D5kRC7Fi.js → cose-bilkent-S5V4N54A-Cbjm_00Z.js} +1 -1
- package/web-shell/assets/{dagre-BM42HDAG-DIiyJJ0U.js → dagre-BM42HDAG-C39QNVgC.js} +1 -1
- package/web-shell/assets/{diagram-2AECGRRQ-BOcuB8xU.js → diagram-2AECGRRQ-DNXSAixC.js} +1 -1
- package/web-shell/assets/{diagram-5GNKFQAL-CMgiZ4d3.js → diagram-5GNKFQAL-BCbGUPEA.js} +1 -1
- package/web-shell/assets/{diagram-KO2AKTUF-Ctx8pfN0.js → diagram-KO2AKTUF-1eujKSDC.js} +1 -1
- package/web-shell/assets/{diagram-LMA3HP47-BT5REAWC.js → diagram-LMA3HP47-DUMKXgql.js} +1 -1
- package/web-shell/assets/{diagram-OG6HWLK6-CJkUqXcp.js → diagram-OG6HWLK6-BFktU3_u.js} +1 -1
- package/web-shell/assets/{erDiagram-TEJ5UH35-DyvNNX6v.js → erDiagram-TEJ5UH35-BvJC7DLk.js} +1 -1
- package/web-shell/assets/{flowDiagram-I6XJVG4X-VBf8_My8.js → flowDiagram-I6XJVG4X-Cgu3PlOt.js} +1 -1
- package/web-shell/assets/{ganttDiagram-6RSMTGT7-CviJnR7B.js → ganttDiagram-6RSMTGT7-DLNXN5Xh.js} +1 -1
- package/web-shell/assets/{gitGraphDiagram-PVQCEYII-BY66_Oze.js → gitGraphDiagram-PVQCEYII-BQFRDv6R.js} +1 -1
- package/web-shell/assets/index-C_ouplMQ.js +1187 -0
- package/web-shell/assets/{index-DhYuvi3j.js → index-CdC3pjP3.js} +1 -1
- package/web-shell/assets/index-XGDFJE-X.css +5 -0
- package/web-shell/assets/{infoDiagram-5YYISTIA-D2jaewWZ.js → infoDiagram-5YYISTIA-DT2mOSvp.js} +1 -1
- package/web-shell/assets/{ishikawaDiagram-YF4QCWOH-BpnNTyi5.js → ishikawaDiagram-YF4QCWOH-9fy_K4bd.js} +1 -1
- package/web-shell/assets/{journeyDiagram-JHISSGLW-CA55GNZF.js → journeyDiagram-JHISSGLW-CoGSEuhE.js} +1 -1
- package/web-shell/assets/{kanban-definition-UN3LZRKU-DyiSl_Ts.js → kanban-definition-UN3LZRKU-BP9hHYIj.js} +1 -1
- package/web-shell/assets/{linear-B-sN3dkV.js → linear-uIroDsmp.js} +1 -1
- package/web-shell/assets/{mermaid.core-xf9SXDdb.js → mermaid.core-BUwoStsA.js} +5 -5
- package/web-shell/assets/{mindmap-definition-RKZ34NQL-DXhr2kRk.js → mindmap-definition-RKZ34NQL-DZB-FWim.js} +1 -1
- package/web-shell/assets/{pieDiagram-4H26LBE5-DUXpbfGQ.js → pieDiagram-4H26LBE5-YPptloKl.js} +1 -1
- package/web-shell/assets/{quadrantDiagram-W4KKPZXB-NeDQYeWw.js → quadrantDiagram-W4KKPZXB-dgk3DSzm.js} +1 -1
- package/web-shell/assets/{requirementDiagram-4Y6WPE33-BSbFRL1A.js → requirementDiagram-4Y6WPE33-BH2En2i9.js} +1 -1
- package/web-shell/assets/{sankeyDiagram-5OEKKPKP-gg27cAaN.js → sankeyDiagram-5OEKKPKP-BB98feeI.js} +1 -1
- package/web-shell/assets/{sequenceDiagram-3UESZ5HK-Bi_1TSs4.js → sequenceDiagram-3UESZ5HK-CunAIGh8.js} +1 -1
- package/web-shell/assets/{stateDiagram-AJRCARHV-CboCCRaf.js → stateDiagram-AJRCARHV-DTJs_-I2.js} +1 -1
- package/web-shell/assets/stateDiagram-v2-BHNVJYJU-DrfFMYta.js +1 -0
- package/web-shell/assets/{timeline-definition-PNZ67QCA-DrGpF_jn.js → timeline-definition-PNZ67QCA-Cd4AN7O0.js} +1 -1
- package/web-shell/assets/{vennDiagram-CIIHVFJN-DCaJU67x.js → vennDiagram-CIIHVFJN-xIG-rUU9.js} +1 -1
- package/web-shell/assets/{wardley-L42UT6IY-p0QcW1aP.js → wardley-L42UT6IY-D1UyjIcG.js} +1 -1
- package/web-shell/assets/{wardleyDiagram-YWT4CUSO-DiEVxj1W.js → wardleyDiagram-YWT4CUSO-BVM0Mb99.js} +1 -1
- package/web-shell/assets/{xychartDiagram-2RQKCTM6-iQB8nSlA.js → xychartDiagram-2RQKCTM6-BX31JDSz.js} +1 -1
- package/web-shell/index.html +2 -2
- package/chunks/chunk-2HRYPZT5.js +0 -25
- package/chunks/chunk-QAW7PIHT.js +0 -168
- package/chunks/chunk-RTV5TUYB.js +0 -143
- package/chunks/chunk-ZPAHLFZU.js +0 -172
- package/chunks/exitPlanMode-HYQL4XMB.js +0 -909
- package/chunks/nonInteractiveCli-UMYUT643.js +0 -129
- package/chunks/todoWrite-FKCGATPJ.js +0 -531
- package/chunks/web-fetch-CFCWTCAP.js +0 -5673
- package/web-shell/assets/channel-NFC5ADAa.js +0 -1
- package/web-shell/assets/classDiagram-4FO5ZUOK-DHgwjz3X.js +0 -1
- package/web-shell/assets/classDiagram-v2-Q7XG4LA2-DHgwjz3X.js +0 -1
- package/web-shell/assets/index-8xIBbHV3.js +0 -1143
- package/web-shell/assets/index-DLyhlZZO.css +0 -5
- package/web-shell/assets/stateDiagram-v2-BHNVJYJU-CXRqms6P.js +0 -1
package/bundled/review/SKILL.md
CHANGED
|
@@ -38,14 +38,16 @@ Your goal here is to understand the scope of changes so you can dispatch agents
|
|
|
38
38
|
|
|
39
39
|
If the args file is genuinely absent (an older CLI, or a write that failed), fall back to `write_file`-ing the raw argument string **verbatim and unmodified** — copying **the user's argument**, not an example from these instructions — and say in your output that you did, so a wrong target is at least attributable. For a no-argument `/review`, no file is written and none is needed; run the parser with an empty stdin.
|
|
40
40
|
|
|
41
|
+
**Every command below is written `"${QWEN_CODE_CLI:-qwen}" review …`, and that is not decoration — copy it as written.** `QWEN_CODE_CLI` is the entry of the CLI **running this skill**, exported to your shell for you; a bare `qwen` is whatever the machine's `PATH` happens to resolve to, which is a different program the moment a global install is older than the build you are in. Measured: a `npm run dev:daemon` session issued `qwen review agent-prompt --role 0`, `PATH` found a v0.19.10 whose `agent-prompt` predates `--role` entirely, and the review died on `Missing required argument: chunk` — the skill and the CLI it was talking to were different versions. The `:-qwen` fallback keeps older hosts that do not export it working. It is POSIX parameter expansion, which makes the POSIX-shell requirement this skill already had (Step 0 pipes through `tee`) total: on Windows, run the review from git-bash — cmd.exe passes `${…:-…}` through literally and PowerShell errors on it.
|
|
42
|
+
|
|
41
43
|
Then run:
|
|
42
44
|
|
|
43
45
|
```bash
|
|
44
46
|
# The CLI wrote this file; you did not, and must not.
|
|
45
|
-
qwen review parse-args --stdin < <the path in the <skill-args-file> note> \
|
|
47
|
+
"${QWEN_CODE_CLI:-qwen}" review parse-args --stdin < <the path in the <skill-args-file> note> \
|
|
46
48
|
| tee .qwen/tmp/qwen-review-parse-args.json
|
|
47
49
|
# No arguments at all (`/review` bare) — no args file exists:
|
|
48
|
-
# : | qwen review parse-args --stdin | tee .qwen/tmp/qwen-review-parse-args.json
|
|
50
|
+
# : | "${QWEN_CODE_CLI:-qwen}" review parse-args --stdin | tee .qwen/tmp/qwen-review-parse-args.json
|
|
49
51
|
```
|
|
50
52
|
|
|
51
53
|
(Step 9 removes these files with the other temp files.)
|
|
@@ -75,7 +77,7 @@ The parser already classified the target, so there is nothing to disambiguate by
|
|
|
75
77
|
|
|
76
78
|
For a `pr-url` whose `host` is not `github.com` (GitHub Enterprise), **pass `--host <host>` to every review subcommand that talks to GitHub — `fetch-pr`, `pr-context`, and `presubmit`** — which routes all of their `gh` calls via GH_HOST in code; a forgotten host cannot silently retarget them at github.com. The `gh` commands you run directly are still yours to route: prefix Agent 0's `gh pr view`/`gh issue view`, Step 6's residual body fetch, and the Step 7 submission with `GH_HOST=<host> ` (e.g. `GH_HOST=github.example.com gh api ...`). `gh` defaults to `github.com`, so a dropped host makes a call read from and post to the wrong site's `owner/repo`.
|
|
77
79
|
|
|
78
|
-
3. If **no remote matches**, use **lightweight mode**: run `gh pr diff <url>` to get the diff directly. Skip Step 2 (no local rules) and Step 8 (no local reports or cache). In Step 9, skip worktree removal (none was created) but still clean up temp files (`.qwen/tmp/qwen-review-{target}-*`). Also run `qwen review pr-context <number> <owner>/<repo> --out .qwen/tmp/qwen-review-pr-<number>-context.md` — it is pure GitHub API and works cross-repo. Agent 0 and Step 6's open-Critical re-check depend on it: a `Refs #123`-style target issue is only discoverable from the PR body, and open Critical threads only from the context file, so skipping it lets a wrong-root fix sail through blocker-free. If `pr-context` fails here (auth, network), warn and continue with the diff alone — but skip Agent 0 (it has nothing to work from) and treat every open-Critical re-check verdict as "cannot tell", which forbids an Approve. Carry this forward as the **context-unavailable** state: Step 7's invariant caps **every** `C=0` outcome of such a run at `COMMENT` with a diff-only body (both the would-be APPROVE and the Suggestion-only "no blockers" sentence), so a run that could not see the PR's existing discussion can post findings but never certify the absence of blockers. In Step 7, use the owner/repo from the URL. Inform the user: "Cross-repo review: running in lightweight mode (no build/test)."
|
|
80
|
+
3. If **no remote matches**, use **lightweight mode**: run `gh pr diff <url>` to get the diff directly. Skip Step 2 (no local rules) and Step 8 (no local reports or cache). In Step 9, skip worktree removal (none was created) but still clean up temp files (`.qwen/tmp/qwen-review-{target}-*`). Also run `"${QWEN_CODE_CLI:-qwen}" review pr-context <number> <owner>/<repo> --out .qwen/tmp/qwen-review-pr-<number>-context.md` — it is pure GitHub API and works cross-repo. Agent 0 and Step 6's open-Critical re-check depend on it: a `Refs #123`-style target issue is only discoverable from the PR body, and open Critical threads only from the context file, so skipping it lets a wrong-root fix sail through blocker-free. If `pr-context` fails here (auth, network), warn and continue with the diff alone — but skip Agent 0 (it has nothing to work from) and treat every open-Critical re-check verdict as "cannot tell", which forbids an Approve. Carry this forward as the **context-unavailable** state: Step 7's invariant caps **every** `C=0` outcome of such a run at `COMMENT` with a diff-only body (both the would-be APPROVE and the Suggestion-only "no blockers" sentence), so a run that could not see the PR's existing discussion can post findings but never certify the absence of blockers. In Step 7, use the owner/repo from the URL. Inform the user: "Cross-repo review: running in lightweight mode (no build/test)."
|
|
79
81
|
|
|
80
82
|
Based on the parsed `target.type`:
|
|
81
83
|
|
|
@@ -88,7 +90,7 @@ Based on the parsed `target.type`:
|
|
|
88
90
|
- **Run `qwen review fetch-pr`** to set up the working state in one pass — it cleans any stale worktree, fetches the PR HEAD into `qwen-review/pr-<n>`, queries `gh pr view` for metadata, and creates an ephemeral worktree at `.qwen/tmp/review-pr-<n>`:
|
|
89
91
|
|
|
90
92
|
```bash
|
|
91
|
-
qwen review fetch-pr <pr_number> <owner>/<repo> \
|
|
93
|
+
"${QWEN_CODE_CLI:-qwen}" review fetch-pr <pr_number> <owner>/<repo> \
|
|
92
94
|
--remote <remote> \
|
|
93
95
|
--out .qwen/tmp/qwen-review-pr-<pr_number>-fetch.json
|
|
94
96
|
```
|
|
@@ -109,14 +111,14 @@ Based on the parsed `target.type`:
|
|
|
109
111
|
|
|
110
112
|
- **Incremental review check** (high effort only — a low/medium quick pass neither consults nor updates the cache): if `.qwen/review-cache/pr-<n>.json` exists, read `lastCommitSha` and `lastModelId`. Compare to `fetchedSha` from the fetch report and the current model ID (`{{model}}`):
|
|
111
113
|
- If SHAs differ → continue with the worktree just created. Compute the incremental diff (`git diff <lastCommitSha>..HEAD` inside the worktree) and use as the review scope; if the cached commit was rebased away, fall back to the full diff and log a warning.
|
|
112
|
-
- If SHAs match **and** model matches **and** `--comment` was NOT specified → inform the user "No new changes since last review", run `qwen review cleanup pr-<n>` to remove the worktree just created, and stop.
|
|
114
|
+
- If SHAs match **and** model matches **and** `--comment` was NOT specified → inform the user "No new changes since last review", run `"${QWEN_CODE_CLI:-qwen}" review cleanup pr-<n>` to remove the worktree just created, and stop.
|
|
113
115
|
- If SHAs match **and** model matches **but** `--comment` WAS specified → run the full review anyway. Inform the user: "No new code changes. Running review to post inline comments."
|
|
114
116
|
- If SHAs match **but** model differs → continue. Inform: "Previous review used {cached_model}. Running full review with {{model}} for a second opinion."
|
|
115
117
|
|
|
116
118
|
- **Fetch PR context** (metadata + already-discussed issues) in one pass:
|
|
117
119
|
|
|
118
120
|
```bash
|
|
119
|
-
qwen review pr-context <pr_number> <owner>/<repo> \
|
|
121
|
+
"${QWEN_CODE_CLI:-qwen}" review pr-context <pr_number> <owner>/<repo> \
|
|
120
122
|
--out .qwen/tmp/qwen-review-pr-<pr_number>-context.md
|
|
121
123
|
```
|
|
122
124
|
|
|
@@ -140,7 +142,7 @@ Based on the parsed `target.type`:
|
|
|
140
142
|
- **Do not install dependencies here.** The install belongs to Agent 7, and `qwen review build-test` runs it — nothing before Agent 7 needs `node_modules`: the diff-reading agents read the diff and grep the worktree's _sources_. Run from here it is a **blocking prefix** to the whole fan-out — measured at ~161 seconds on a cold worktree of this repo, because `npm ci` triggers this project's `prepare` hook, which builds and bundles every workspace; run from inside `build-test` (which sets `QWEN_SKIP_PREPARE=1`) the install skips that wasted full build and overlaps the other agents, still reading. At low/medium effort nothing builds or tests at all, so there is no install on any path.
|
|
141
143
|
|
|
142
144
|
- **`file`** (e.g., `src/foo.ts`):
|
|
143
|
-
- Run `qwen review capture-local --file <file> --target <filename> --out .qwen/tmp/qwen-review-<filename>-plan.json` to get its changes (`--out` is required — see the capture block below for the full form). An **untracked** target file is captured whole (every line reads as added), which is the right frame for a file that does not exist upstream yet. The path is taken relative to **your** working directory and must be inside the repo.
|
|
145
|
+
- Run `"${QWEN_CODE_CLI:-qwen}" review capture-local --file <file> --target <filename> --out .qwen/tmp/qwen-review-<filename>-plan.json` to get its changes (`--out` is required — see the capture block below for the full form). An **untracked** target file is captured whole (every line reads as added), which is the right frame for a file that does not exist upstream yet. The path is taken relative to **your** working directory and must be inside the repo.
|
|
144
146
|
- If the plan is empty (the file is tracked and unmodified), read the file and review its current state — see the no-diff branch below
|
|
145
147
|
|
|
146
148
|
### Diff capture and the review topology
|
|
@@ -167,9 +169,9 @@ A chunk is read with `read_file(file_path=diffPathAbsolute, offset=startLine - 1
|
|
|
167
169
|
For **local-diff and file-path reviews**, capture and plan in one command:
|
|
168
170
|
|
|
169
171
|
```bash
|
|
170
|
-
qwen review capture-local --out .qwen/tmp/qwen-review-local-plan.json
|
|
172
|
+
"${QWEN_CODE_CLI:-qwen}" review capture-local --out .qwen/tmp/qwen-review-local-plan.json
|
|
171
173
|
# for a file-path review:
|
|
172
|
-
qwen review capture-local --file <file> --target <filename> \
|
|
174
|
+
"${QWEN_CODE_CLI:-qwen}" review capture-local --file <file> --target <filename> \
|
|
173
175
|
--out .qwen/tmp/qwen-review-<filename>-plan.json
|
|
174
176
|
```
|
|
175
177
|
|
|
@@ -190,10 +192,13 @@ For **cross-repo lightweight reviews**, do the same with the diff GitHub hands y
|
|
|
190
192
|
```bash
|
|
191
193
|
mkdir -p .qwen/tmp
|
|
192
194
|
gh pr diff <pr_number> --repo <owner>/<repo> > .qwen/tmp/qwen-review-pr-<n>-diff.txt
|
|
193
|
-
qwen review plan-diff .qwen/tmp/qwen-review-pr-<n>-diff.txt \
|
|
195
|
+
"${QWEN_CODE_CLI:-qwen}" review plan-diff .qwen/tmp/qwen-review-pr-<n>-diff.txt \
|
|
196
|
+
--pr <pr_number> --repo <owner>/<repo> \
|
|
194
197
|
--out .qwen/tmp/qwen-review-pr-<n>-plan.json
|
|
195
198
|
```
|
|
196
199
|
|
|
200
|
+
**Pass `--pr`/`--repo` only when the `pr-context` fetch above succeeded** — they put the PR identity into the plan, which makes the roster REQUIRE Agent 0 (`check-coverage` will name it if it never runs, exactly as in worktree mode). If `pr-context` failed, omit them: the run is in the context-unavailable state, Agent 0 has nothing to work from, and a roster demanding an agent nobody can brief would wedge the review.
|
|
201
|
+
|
|
197
202
|
`plan-diff` and `capture-local` emit the same `diffPathAbsolute`, `chunks[]`, `files[]` and topology counts as `fetch-pr`, so Steps 3A, 3B and 7 work identically on all four review paths. Neither can decide `heavy` — that needs a tree to read the post-change file from — so no invariant agents run on a bare diff.
|
|
198
203
|
|
|
199
204
|
If `diffPath` is `null` (merge-base could not be resolved), fall back to giving agents the `git diff` command and **tell the user coverage will be partial on a large diff**.
|
|
@@ -216,7 +221,7 @@ Skip this step at **low** effort — the low pass checks hunk-visible correctnes
|
|
|
216
221
|
Run `qwen review load-rules` to read project-specific rules. **For PR reviews, read from the base branch** (the PR branch is untrusted — a malicious PR could otherwise inject bypass rules):
|
|
217
222
|
|
|
218
223
|
```bash
|
|
219
|
-
qwen review load-rules <resolved_base_ref> \
|
|
224
|
+
"${QWEN_CODE_CLI:-qwen}" review load-rules <resolved_base_ref> \
|
|
220
225
|
--out .qwen/tmp/qwen-review-<target>-rules.md
|
|
221
226
|
```
|
|
222
227
|
|
|
@@ -245,14 +250,17 @@ Use **Step 3A** or **Step 3B** as the topology gate in Step 1 decided. The dimen
|
|
|
245
250
|
|
|
246
251
|
Launch **12 agents** for same-repo **PR** reviews (Agent 1 has three procedural variants 1a/1b/1c and Agent 6 has three persona variants 6a/6b/6c — each variant counts as a separate parallel agent), plus up to 2 optional diff-specialized finders (Agent 8) when the diff's domain calls for them. For cross-repo lightweight **PR** mode launch **10 agents** — skip Agent 7 (Build & Test) and Agent 1c (Cross-file tracer), since there is no local codebase to build, test, or grep. (Agent 8 finders need only the diff, so the up-to-2 option applies in every mode — lightweight and local included.) Lightweight mode also degrades Agents 1a and 1b, whose briefs assume a source tree: tell them they have the diff ONLY — 1a reviews hunks without enclosing-function reads, and 1b, when it cannot find a deleted invariant re-established because the evidence would live outside the diff, reports the candidate at `Confidence: low` and says the re-establishment could not be checked, instead of asserting it is missing. Step 4's verifiers operate under the same limit, so lightweight-mode findings that depend on unseen source must stay low-confidence (terminal-only) rather than becoming public blockers. **Agent 0 (Issue Fidelity) runs only when the review target is a PR** — a local-diff or file-path review has no PR and no linked issue, so skip Agent 0 and launch **11 agents** (Agents 1a–7). Each agent should focus exclusively on its dimension. (Agent counts are maxima: on a diff with no removed or replaced lines, Agent 1b has nothing to audit and is skipped — one fewer agent.)
|
|
247
252
|
|
|
248
|
-
**Do not write these prompts
|
|
253
|
+
**Do not write these prompts, and do not ask for them one at a time. One call builds all of them:**
|
|
249
254
|
|
|
250
255
|
```bash
|
|
251
|
-
qwen review agent-prompt --plan <the plan report from Step 1> --
|
|
252
|
-
[--rules <the rules file from Step 2, if the project has any>]
|
|
256
|
+
"${QWEN_CODE_CLI:-qwen}" review agent-prompt --plan <the plan report from Step 1> --roster \
|
|
257
|
+
[--rules <the rules file from Step 2, if the project has any>] \
|
|
258
|
+
> .qwen/tmp/qwen-review-{target}-roster.txt
|
|
253
259
|
```
|
|
254
260
|
|
|
255
|
-
|
|
261
|
+
**Redirected to a file, then `read_file` it, paging until `isTruncated` is false** — the same rule as every other large output in this skill: shell output truncates at 30 000 characters, and a large plan's roster exceeds that, which would silently swallow the middle blocks. The output is self-checking: blocks are numbered `agent k of N` and the file ends with an `end of roster` line — if any `k` is missing or the end line is absent, rebuild just those blocks with `--chunk <id>` / `--role <r>` (every prompt is also recorded on disk regardless).
|
|
262
|
+
|
|
263
|
+
It prints one labelled block per required agent — which roles this review owes is read out of the plan, so the paragraph above is the _why_ and the roster is the _list_ — and **each block goes to its agent verbatim**, all launched in one response. To rebuild a single agent's prompt (a relaunch after Step 3D): `--role <role>` in place of `--roster`; the roles are `0`, `1a`, `1b`, `1c`, `2`, `3`, `4`, `5`, `6a`, `6b`, `6c`, `7`.
|
|
256
264
|
|
|
257
265
|
**What it prints is short — a few hundred characters — and it is short on purpose.** It names the agent's role, points at the **brief file** the command just wrote, and lists the `read_file` calls for the diff. The brief itself — the dimension, the finding format, the severity definitions, the project rules — is on disk, and the agent reads it, exactly as it reads the diff. That is not an optimisation. Asked to paste a 4 652-character prompt to each of twelve agents, a real run delivered **2 893** characters of one: it kept the head, added a preamble of its own, and cut nineteen hundred characters out of the middle. Then it read the coverage check's refusal, concluded that "the agents clearly did their job", skipped `compose-review`, and filed an **Approve it had written itself**. What you are asked to carry is now small enough that you will carry it. Copy it; do not retype it. (Agent 8, when you launch one, is the exception — its brief is the one you write, so give it `--whole-diff` and append your domain brief.)
|
|
258
266
|
|
|
@@ -264,16 +272,15 @@ Why: **the roles this command does not build are the roles that go missing.** Me
|
|
|
264
272
|
|
|
265
273
|
Eleven agents all reading the same diff (every 3A agent except Build & Test walks the whole chunk plan) multiplies redundant reading of the early hunks; it does not add coverage. Once there is enough production code to divide, fan out along **territory** as well: one agent per chunk, with the review dimensions folded into that agent's brief, plus a small set of whole-diff agents for the concerns that only exist at diff scale.
|
|
266
274
|
|
|
267
|
-
**Chunk agents — one per entry in `chunks[]`.** Each is a `general-purpose` subagent. **Do not write
|
|
275
|
+
**Chunk agents — one per entry in `chunks[]`.** Each is a `general-purpose` subagent. **Do not write their prompts, and do not ask for them one at a time — one call builds the whole 3B fan-out, chunk agents, whole-diff agents and invariant agents alike:**
|
|
268
276
|
|
|
269
277
|
```bash
|
|
270
|
-
qwen review agent-prompt \
|
|
271
|
-
--
|
|
272
|
-
|
|
273
|
-
[--rules <the rules file from Step 2, if the project has any>]
|
|
278
|
+
"${QWEN_CODE_CLI:-qwen}" review agent-prompt --plan <the plan report from Step 1> --roster \
|
|
279
|
+
[--rules <the rules file from Step 2, if the project has any>] \
|
|
280
|
+
> .qwen/tmp/qwen-review-{target}-roster.txt
|
|
274
281
|
```
|
|
275
282
|
|
|
276
|
-
|
|
283
|
+
Redirect and `read_file` it paged, exactly as in Step 3A — a 3B roster is the large case, and shell output truncates at 30 000 characters. Check every `agent k of N` block is present (the file ends with an `end of roster` line); rebuild any missing one with `--chunk <id>` / `--role <r>`. One labelled block per agent; each goes to its agent **verbatim**. (To rebuild a single chunk agent's prompt for a relaunch: `--chunk <id>` in place of `--roster`.) **Pass `--rules` whenever Step 2 found any** — this command builds the whole prompt, so there is no later step in which you would staple them on, and a review that silently enforces no project rule is one of the things this skill exists to prevent.
|
|
277
284
|
|
|
278
285
|
**What it prints is short — a few hundred characters.** It names the chunk, points at the **brief file** the command just wrote, and gives the one `read_file` that defines the territory. The brief — the territory's files, the paging rule, the uncoverable rule, what to review, the finding format, the severity definitions, the project rules and the receipt — is on disk, and the agent reads it, exactly as it reads the diff. A chunk agent's brief runs to about five kilobytes with the project rules in it, and a Step 3B review of a real pull request has **seventeen** of them: eighty-seven kilobytes, in one response, pasted without an edit. That is not a thing that happens. At a twelfth of that load, a real run cut nineteen hundred characters out of a single prompt and then talked its way past the check that caught it.
|
|
279
286
|
|
|
@@ -295,14 +302,7 @@ Everything below still governs what the agent is asked to do; the command builds
|
|
|
295
302
|
|
|
296
303
|
**Whole-diff agents — launched alongside the chunk agents, in the same response.**
|
|
297
304
|
|
|
298
|
-
**Their
|
|
299
|
-
|
|
300
|
-
```bash
|
|
301
|
-
qwen review agent-prompt --plan <the plan report from Step 1> --role <role> \
|
|
302
|
-
[--rules <the rules file from Step 2, if the project has any>]
|
|
303
|
-
```
|
|
304
|
-
|
|
305
|
-
Roles here: `0` (PR reviews), `1b` (when the diff removes anything), `1c`, `test-matrix`, `7` (same-repo). For a **heavy** file, three more, one per checklist slice: `--role invariant-a|invariant-b|invariant-c --file <path>`. Pass each **verbatim**. `check-coverage` derives the same list from the plan and will name any role that did not run.
|
|
305
|
+
**Their blocks are already in the `--roster` output above — you have them.** Roles there: `0` (PR reviews), `1b` (when the diff removes anything), `1c`, `test-matrix`, `7` (same-repo), and for a **heavy** file three more, one per checklist slice (their blocks are labelled `Invariant agent A|B|C: … — <path>`). Pass each **verbatim**. To rebuild one for a relaunch: `--role <role>` (an invariant agent adds `--file <path>`). `check-coverage` derives the same list from the plan and will name any role that did not run.
|
|
306
306
|
|
|
307
307
|
Why: **the chunk agents got the diff and these did not.** Measured against the harness's record of one real 3B run, all three whole-diff agents — cross-file tracer, test-coverage matrix, build & test — were launched with a prompt that named **no diff file at all**. The test-coverage matrix was told, in prose, to "Read the diff chunks and the test files", and given no path to read them from. It went and read the post-change source instead, and on a diff with deletions that shows an agent precisely nothing: the removed line is not in that file, and nothing marks where it was. These are the agents that own the classes a chunk agent is structurally blind to — the cross-file trace, the cross-chunk removed-behaviour pairing, the test matrix. The review's only coverage of all three was done by agents that never opened the diff, and the coverage check could not see it, because it only ever asked that question of agents whose prompt said `chunk N of M`.
|
|
308
308
|
|
|
@@ -320,10 +320,10 @@ The sections below say what each agent is _for_. They are no longer what it is _
|
|
|
320
320
|
|
|
321
321
|
When a file is largely rewritten, reviewing it as a diff is the wrong frame. The bugs are not inside any one hunk; they are **between** the new lines, which can sit two thousand lines apart — a timer armed near the top of the file and a teardown path near the bottom. No chunk agent, and no reader of a diff with three lines of context, can see that pair.
|
|
322
322
|
|
|
323
|
-
Three agents per `heavy` file, one checklist slice each:
|
|
323
|
+
Three agents per `heavy` file, one checklist slice each — their blocks are in the `--roster` output; to rebuild one for a relaunch:
|
|
324
324
|
|
|
325
325
|
```bash
|
|
326
|
-
qwen review agent-prompt --plan <the plan report from Step 1> \
|
|
326
|
+
"${QWEN_CODE_CLI:-qwen}" review agent-prompt --plan <the plan report from Step 1> \
|
|
327
327
|
--role invariant-a --file <path> [--rules <the rules file from Step 2>]
|
|
328
328
|
# ...and --role invariant-b, --role invariant-c, for the same file
|
|
329
329
|
```
|
|
@@ -339,7 +339,7 @@ Three ranges exist in the report and they are not interchangeable, which is why
|
|
|
339
339
|
**Do not check the coverage. It is checked for you, from what the agents actually did.** You do not copy their returns anywhere — the harness already recorded them, along with every tool call each agent made and the prompt each was launched with. Run:
|
|
340
340
|
|
|
341
341
|
```bash
|
|
342
|
-
qwen review check-coverage \
|
|
342
|
+
"${QWEN_CODE_CLI:-qwen}" review check-coverage \
|
|
343
343
|
--plan <the plan report from Step 1> \
|
|
344
344
|
--out .qwen/tmp/qwen-review-{target}-coverage.json
|
|
345
345
|
```
|
|
@@ -380,11 +380,11 @@ A check you perform silently is a check you skip, and this one has been skipped:
|
|
|
380
380
|
|
|
381
381
|
## Agent dimensions (used by 3A and 3B; reused inline by 3C)
|
|
382
382
|
|
|
383
|
-
**Every agent MUST
|
|
383
|
+
**Every agent MUST return inline: set `subagent_type: "general-purpose"` and `run_in_background: false` on every `agent` call.** Do NOT fork them — never set `subagent_type: "fork"`. A fork runs fire-and-forget and its findings never come back to you, so the review would stall in Step 4 with nothing to aggregate. You need every agent's findings returned to you inline.
|
|
384
384
|
|
|
385
385
|
**For same-repo PR reviews (worktree mode), every `agent` call MUST also set `working_dir: "<worktreePath>"`** — the `worktreePath` from the Step 1 fetch report (a repo-relative path like `.qwen/tmp/review-pr-<n>`; pass it through as-is). This sets each agent's working directory to the PR worktree, so its `git diff`, `grep_search`, file reads, and Agent 7's build/test **resolve against the PR's code, not the user's main checkout**. It is a deterministic, harness-level cwd pin — it does NOT depend on the agent remembering to `cd`, and it is what makes reviewing multiple PRs concurrently safe. (It pins the working directory; it is not a hard filesystem sandbox — an absolute path could still reach elsewhere — but normal review operations stay inside the worktree.) This rule applies to **every** agent the review workflow launches — not just the Step 3 dimension agents, but also the Step 4 verification agent and the Step 5 reverse-audit agents (both restated below). Do NOT set `working_dir` for **local-diff, file-path, or cross-repo lightweight** reviews — those have no worktree, so the agents run in the main project directory.
|
|
386
386
|
|
|
387
|
-
**You no longer compose these prompts. `qwen review agent-prompt` does** — one call
|
|
387
|
+
**You no longer compose these prompts. `qwen review agent-prompt` does** — one `--roster` call builds every one of them, and each block it prints goes to its agent unedited. It already contains everything the list below used to ask you to remember: `diffPathAbsolute` and the exact `read_file` ranges for that role (its own `offset`/`limit` for a chunk agent; every chunk for a whole-diff or 3A agent; the post-change file plus `addedRanges[]` and its own `diffRange` for an invariant agent), the agent's focus areas, the severity definitions verbatim, the finding format, and the project rules. **Never give an agent a `git diff` command** — see "Diff capture and the review topology" in Step 1 for why. In worktree-mode PR reviews the agent's `working_dir` is the PR worktree, so `grep_search` and source-file reads resolve against the PR's code automatically — the agent must NOT `cd` into the worktree or prefix absolute paths for those.
|
|
388
388
|
|
|
389
389
|
The one thing you still add per agent is **a one-sentence summary of what the change is about**, ahead of the block. Add it before, never inside: the delivered prompt must _contain_ what the command printed, and Step 3D checks that it does.
|
|
390
390
|
|
|
@@ -426,7 +426,7 @@ Two things the command's briefs carry that no orchestrator should be relaying by
|
|
|
426
426
|
|
|
427
427
|
The fixed dimensions are domain-blind. When a diff concentrates in a domain with a recognizable failure grammar — a reconnect/backoff state machine, a module loader, a cron scheduler, a wire-protocol codec, a cache layer, a data migration — write 1–2 additional finder briefs specialized to that domain and launch them alongside the standard set, labeled `Agent 8a/8b: <domain> angle`.
|
|
428
428
|
|
|
429
|
-
**This is the one brief you write**, so it is the one place `--role` does not help: build the diff-reading block with `qwen review agent-prompt --plan <plan> --whole-diff` and append your domain brief to it. A specialized brief names the domain's specific invariants to walk, the way the invariant checklist does for a rewritten file. Examples: for a module loader — resolution order, ESM/CJS interop, circular-import timing, cache invalidation; for reconnect logic — state flags reset on every exit path, backoff growth and cap, timer cancellation on teardown, buffered-data loss when a retry is abandoned.
|
|
429
|
+
**This is the one brief you write**, so it is the one place `--role` does not help: build the diff-reading block with `"${QWEN_CODE_CLI:-qwen}" review agent-prompt --plan <plan> --whole-diff` and append your domain brief to it. A specialized brief names the domain's specific invariants to walk, the way the invariant checklist does for a rewritten file. Examples: for a module loader — resolution order, ESM/CJS interop, circular-import timing, cache invalidation; for reconnect logic — state flags reset on every exit path, backoff growth and cap, timer cancellation on teardown, buffered-data loss when a retry is abandoned.
|
|
430
430
|
|
|
431
431
|
Rules: at most 2; launch none when no domain stands out (the common case — most diffs get zero). They are not in the roster, so nothing will ask for them. Their findings are `Source: [review]`, use the standard finding format including the failure scenario, and go through Step 4 verification like any other finding.
|
|
432
432
|
|
|
@@ -445,7 +445,7 @@ At low and medium effort there are no subagents: you are the finder, in this con
|
|
|
445
445
|
**Medium — the finder angles run in sequence, by you.** Do NOT spawn subagents — inline sequencing is what makes this level cheap. The angles, in order: Agent 1a (line-by-line, with the language-pitfall and wrapper-routing checks — in lightweight mode, diff-only: there is no tree for enclosing-function reads), Agent 1b (removed behavior — in lightweight mode it degrades exactly as in Step 3A: with no tree to grep, a missing re-establishment is a candidate at `Confidence: low`, not an assertion), Agent 1c (cross-file trace — same-repo only, skip in lightweight mode), Agent 3 (code quality including altitude), Agent 4 (performance), and a conventions pass over the Step 2 rules (quote the exact rule and the exact line, or report nothing). **Get the dimension briefs; do not work from the table.** The table in the agent-dimensions section says what each angle is _for_; the brief says how to walk it — the language-pitfall checklist, the producer-direction grep, the altitude test, the Exclusion Criteria. Build the ones you need and read them:
|
|
446
446
|
|
|
447
447
|
```bash
|
|
448
|
-
qwen review agent-prompt --plan <the plan report from Step 1> --role 1a \
|
|
448
|
+
"${QWEN_CODE_CLI:-qwen}" review agent-prompt --plan <the plan report from Step 1> --role 1a \
|
|
449
449
|
[--rules <the rules file from Step 2, if the project has any>]
|
|
450
450
|
# ...same for 1b, 1c, 3, 4. Each writes its brief to disk and prints where.
|
|
451
451
|
```
|
|
@@ -479,12 +479,12 @@ A single verifier for every finding was cheaper, but on a large review it become
|
|
|
479
479
|
Write this shard's findings to a file — each with its file, line, issue and failure scenario (the scenario is the claim under test); for any **Agent 0 (Issue Fidelity)** finding, include the **issue evidence it quoted** (issue body + comments), because a root-cause claim rests on linked-issue evidence the codebase does not contain and the verifier must check against it. Then:
|
|
480
480
|
|
|
481
481
|
```bash
|
|
482
|
-
qwen review agent-prompt --plan <the plan report from Step 1> --role verify \
|
|
482
|
+
"${QWEN_CODE_CLI:-qwen}" review agent-prompt --plan <the plan report from Step 1> --role verify \
|
|
483
483
|
--findings <the file of this shard's findings> \
|
|
484
484
|
[--rules <the rules file from Step 2, if the project has any>]
|
|
485
485
|
```
|
|
486
486
|
|
|
487
|
-
**Paste what it prints verbatim — the whole block, findings and all. Do not prepend, append, reword, or add a shard number.**
|
|
487
|
+
**`--findings` is required for this role — the command refuses without it**, because a bare block is a block you would assemble by hand, and hand-assembly is the one step this skill measured drifting. **Paste what it prints verbatim — the whole block, findings and all. Do not prepend, append, reword, or add a shard number.** Dogfooded twice: the step that used to have you prepend the list by hand is where the prompt got paraphrased — a summary inserted, the "nothing replaces the brief" line truncated — and Step 6's check caught it and capped the verdict. The command records the exact block it prints — findings included, keyed per findings digest — so a launch that drops or rewrites the findings matches no record. In worktree mode the verifier's `working_dir` is the PR worktree (same rule as Step 3), so its reads and re-checks resolve against the PR's code.
|
|
488
488
|
|
|
489
489
|
The brief holds the method the orchestrator used to spell out here and that a paraphrase kept dropping: trace the failure scenario through the real code rather than voting on the finding's prose; engage the diff's own documented intent before calling a documented change a regression (the rule a run skipped when it auto-posted a false "leaks tokens" Critical); and the one-way, quote-the-contradiction bar on **rejecting a Critical**. Read the brief to know what a verdict means; do not re-derive it here.
|
|
490
490
|
|
|
@@ -528,17 +528,20 @@ Write **the cumulative list of every confirmed finding so far** (Steps 3-4 plus
|
|
|
528
528
|
|
|
529
529
|
```bash
|
|
530
530
|
# Step 3A (small diff): one auditor per round, the whole diff.
|
|
531
|
-
qwen review agent-prompt --plan <the plan report from Step 1> --role reverse-audit \
|
|
531
|
+
"${QWEN_CODE_CLI:-qwen}" review agent-prompt --plan <the plan report from Step 1> --role reverse-audit \
|
|
532
532
|
--findings <the cumulative findings file> \
|
|
533
533
|
[--rules <the rules file from Step 2>]
|
|
534
534
|
|
|
535
|
-
# Step 3B (large diff): one auditor PER CHUNK per round
|
|
536
|
-
qwen review agent-prompt --plan <the plan report from Step 1> --role reverse-audit --
|
|
535
|
+
# Step 3B (large diff): one auditor PER CHUNK per round — ONE call builds them all.
|
|
536
|
+
"${QWEN_CODE_CLI:-qwen}" review agent-prompt --plan <the plan report from Step 1> --role reverse-audit --all-chunks \
|
|
537
537
|
--findings <the cumulative findings file> \
|
|
538
|
-
[--rules <the rules file from Step 2>]
|
|
538
|
+
[--rules <the rules file from Step 2>] \
|
|
539
|
+
> .qwen/tmp/qwen-review-{target}-ra-round<k>.txt
|
|
539
540
|
```
|
|
540
541
|
|
|
541
|
-
|
|
542
|
+
Redirect and `read_file` it paged, exactly as with `--roster`: one labelled block per chunk, numbered `auditor k of N`, closed by an `end of round` line — launch one agent per block, verbatim. **Never sample the builder's output** (`| head`, `| tail`, a truncated read): the text IS the deliverable, and a real run that sampled each build with `| head -5` never possessed the prompts, hand-reconstructed all ten launches, and had every one flagged rewritten — a full repair round spent recovering from a shortcut that saved nothing. To rebuild a single auditor after a gap: `--chunk <id>` in place of `--all-chunks`.
|
|
543
|
+
|
|
544
|
+
**`--findings` is required for this role — the command refuses without it** (an early round with nothing confirmed yet passes an empty file; the command tells the auditor so). **Paste what it prints verbatim — the whole block. Do not prepend, append, reword, or add a round number** (track the round in your own notes, not in the prompt). A real run skipped `--findings`, hand-wrote the auditor's launch keeping only the brief pointer, and Step 6's check capped the verdict — the auditors had run and read their brief, but not one of them got the prompt the CLI built. The command records the exact block it prints — findings included, keyed per round's findings digest — so a launch that drops the confirmed list matches no record. It also gives each auditor its diff reads — the whole plan in 3A, one chunk's range in 3B (a Step 3B auditor handed the whole 5 800-line diff is the most context-starved agent in the pipeline, on exactly the PRs where the reverse audit matters most). In worktree mode its `working_dir` is the PR worktree.
|
|
542
545
|
|
|
543
546
|
The brief holds what the auditor is for: hunt only the **gaps** no prior agent caught, report only Critical or Suggestion, apply the Exclusion Criteria, and end with a substantive receipt (`No issues found — <what it re-examined>`) — a bare "No issues found." fails the substantive-return check below and triggers the one relaunch.
|
|
544
547
|
|
|
@@ -623,7 +626,7 @@ Two failure modes this closes, both observed in this repo's own dogfood: reporti
|
|
|
623
626
|
**You do not decide the verdict, and you do not write it. Ask for it:**
|
|
624
627
|
|
|
625
628
|
```bash
|
|
626
|
-
qwen review compose-review --input .qwen/tmp/qwen-review-{target}-compose.json \
|
|
629
|
+
"${QWEN_CODE_CLI:-qwen}" review compose-review --input .qwen/tmp/qwen-review-{target}-compose.json \
|
|
627
630
|
--out .qwen/tmp/qwen-review-{target}-composed.json
|
|
628
631
|
```
|
|
629
632
|
|
|
@@ -640,6 +643,10 @@ The rules it applies — so you can read the line it gives you, not so you can a
|
|
|
640
643
|
|
|
641
644
|
**Why this is a command and not a paragraph.** It was a paragraph, and the paragraph was skipped. Dogfooded, a run read the coverage check's refusal, concluded that "the agents clearly did their job", never called `compose-review` at all, and printed **`Review complete — Approve`** — a verdict it had composed itself, from prose, on a review whose gate had just refused. There is now one place a verdict exists. Skipping the command does not get you a different one; it gets you none.
|
|
642
645
|
|
|
646
|
+
**And you may not overrule the line it gives you.** The failure came back in a subtler shape, on a later dogfood: the run _did_ call `compose-review`, _did_ read `Verdict: Comment — an Approve was NOT available: a dimension nobody reviewed`, and then wrote — in its next thought — _"the compose-review flagged reverse audit as unreviewed (transcript visibility issue — the reverse audit did run substantively)"_, and reported **Approve** to the user and into the saved report. It was wrong: the auditors had run, but the orchestrator had hand-written their launch prompts, so they never got the prompt the CLI built — which is precisely what the gap said, and precisely the run's own doing. **A cap you can explain is still a cap.** If you believe a gap is wrong, the answer is to make the step verifiable — relaunch it with the prompt `agent-prompt` printed, verbatim — and run `compose-review` again. It is never to keep the verdict you preferred and narrate the gap away. The verdict you print, and the verdict in the report you save, are the one this command computed; when they differ from it, the review is lying to the person who trusted it.
|
|
647
|
+
|
|
648
|
+
**The `FIX:` lines on stderr are that repair, spelled out.** For every repairable gap it capped on, `compose-review` prints one `FIX:` line naming the command — with this run's plan path already substituted. The parts that vary per agent stay as selectors: take `<id>`, `<r>` and `<path>` from the labels in the same report (never paste a literal `<...>` into a shell — it parses as a redirection), and add the `--rules` file whenever Step 2 loaded one. Execute them — **one repair round, then `compose-review` again**. If the same gap survives the round, stop: the cap stands, post with it, and disclose the gap. Do not loop repairs hoping for a different verdict, and do not skip the round and post a capped verdict the FIX lines could have lifted — both are the same failure, choosing the verdict over the evidence, in opposite directions.
|
|
649
|
+
|
|
643
650
|
Append a follow-up tip after the verdict (high effort only — a quick pass emits no verdict and uses Step 3C's tip instead; its "post comments" follow-up is declined per Step 3C). Choose based on remaining state:
|
|
644
651
|
|
|
645
652
|
- **Local review with unfixed findings**: "Tip: type `fix these issues` to apply fixes interactively."
|
|
@@ -656,7 +663,7 @@ If the user responds with "post comments" (or similar intent like "yes post them
|
|
|
656
663
|
**You do not post. `qwen review submit` posts, and it refuses when the run is not authorised.** Do NOT call `gh api repos/.../pulls/<n>/reviews` yourself — not to submit the review, not to "test" an anchor, not at all. That command is the one write in this skill, and it now lives behind a check:
|
|
657
664
|
|
|
658
665
|
```bash
|
|
659
|
-
qwen review submit \
|
|
666
|
+
"${QWEN_CODE_CLI:-qwen}" review submit \
|
|
660
667
|
--pr <pr_number> --repo <owner>/<repo> \
|
|
661
668
|
--review .qwen/tmp/qwen-review-{target}-review.json \
|
|
662
669
|
[--user-authorized] [--host <host>]
|
|
@@ -687,7 +694,7 @@ Also skip this step (independently of the gate above) if the review target is no
|
|
|
687
694
|
# "anchor": " if (amt < 0) return;\n charge(amt);", "line": 42}]
|
|
688
695
|
# `line` is OPTIONAL — omit it when the finder gave no number; it only breaks ties.
|
|
689
696
|
|
|
690
|
-
qwen review resolve-anchors \
|
|
697
|
+
"${QWEN_CODE_CLI:-qwen}" review resolve-anchors \
|
|
691
698
|
--diff <diffPathAbsolute> \
|
|
692
699
|
--input .qwen/tmp/qwen-review-{target}-anchors.json \
|
|
693
700
|
--out .qwen/tmp/qwen-review-{target}-anchors-resolved.json
|
|
@@ -719,7 +726,7 @@ echo '[{"path":"src/foo.ts","line":42}, ...]' > .qwen/tmp/qwen-review-{target}-f
|
|
|
719
726
|
Then run:
|
|
720
727
|
|
|
721
728
|
```bash
|
|
722
|
-
qwen review presubmit \
|
|
729
|
+
"${QWEN_CODE_CLI:-qwen}" review presubmit \
|
|
723
730
|
{pr_number} {commit_sha} {owner}/{repo} \
|
|
724
731
|
.qwen/tmp/qwen-review-{target}-presubmit.json \
|
|
725
732
|
[--new-findings .qwen/tmp/qwen-review-{target}-findings.json]
|
|
@@ -838,7 +845,7 @@ The verdict is a computed fact and this is the second place it must not be re-de
|
|
|
838
845
|
Then submit it — through `submit`, which checks the authorisation and the payload before anything reaches GitHub:
|
|
839
846
|
|
|
840
847
|
```bash
|
|
841
|
-
qwen review submit \
|
|
848
|
+
"${QWEN_CODE_CLI:-qwen}" review submit \
|
|
842
849
|
--pr {pr_number} --repo {owner}/{repo} \
|
|
843
850
|
--review .qwen/tmp/qwen-review-{target}-review.json \
|
|
844
851
|
[--host <host>] # required for GitHub Enterprise; omit on github.com
|
|
@@ -875,6 +882,10 @@ Report content should include:
|
|
|
875
882
|
- All findings with verification status
|
|
876
883
|
- Verdict (high effort only — a quick pass claims none)
|
|
877
884
|
|
|
885
|
+
**The report's verdict is not yours to type.** `compose-review` printed the exact `Verdict:` line in Step 6 and persisted the same line as `verdictLine` inside `.qwen/tmp/qwen-review-{target}-composed.json` — copy either, verbatim. Do not reconstruct it from `event` + `cappedBy`: a presubmit downgrade also depends on fields that pair does not carry, and a rebuilt line can differ from the computed one. (And not `$(jq …)`: a `jq` binary is not guaranteed on the host, and a substitution that fails leaves the archived verdict blank or literal — worse than absent, because it looks written.)
|
|
886
|
+
|
|
887
|
+
A run that had read `Verdict: Comment — an Approve was NOT available` wrote `**Verdict:** Approve` into its saved report minutes later. The terminal is prose and the archive is forever; this line is the one place the archive can be made to tell the truth for free. If the composed event is not the one you expected, fix the run — not the report.
|
|
888
|
+
|
|
878
889
|
### Incremental review cache
|
|
879
890
|
|
|
880
891
|
If reviewing a PR **at high effort**, update the review cache for incremental review support. Low/medium quick passes must NOT write it — a cache hit would make a later high-effort review of the same SHA report "No new changes since last review", silently converting a quick pass into a full-review verdict.
|
|
@@ -901,7 +912,7 @@ If reviewing a PR **at high effort**, update the review cache for incremental re
|
|
|
901
912
|
Run the bundled cleanup subcommand:
|
|
902
913
|
|
|
903
914
|
```bash
|
|
904
|
-
qwen review cleanup <target>
|
|
915
|
+
"${QWEN_CODE_CLI:-qwen}" review cleanup <target>
|
|
905
916
|
```
|
|
906
917
|
|
|
907
918
|
`<target>` is the same suffix used throughout (`pr-<n>`, `local`, or filename). The command removes the worktree at `.qwen/tmp/review-pr-<n>` (PR targets only), deletes the local branch ref `qwen-review/pr-<n>`, and clears any `.qwen/tmp/qwen-review-<target>-*` side files (review JSON, PR context, presubmit / findings reports). It is idempotent — missing files are silent OK. Also remove `.qwen/tmp/qwen-review-parse-args.json` and the session args directory `.qwen/tmp/s-<session>/` (the path from the `<skill-args>` note) — both are written before the target suffix is known, so the pattern above misses them. (Leave the args file in place if you had to fall back to writing it yourself and the run failed: it is the only record of what the review was actually asked to do.)
|
|
@@ -39,7 +39,7 @@ Use `git diff HEAD` whenever staged changes exist. Otherwise use `git diff`.
|
|
|
39
39
|
|
|
40
40
|
## Step 2: Launch three review passes in parallel
|
|
41
41
|
|
|
42
|
-
Use the `agent` tool and launch all review passes in a single response so they run concurrently. **Set `subagent_type: "general-purpose"` on every call — each pass must
|
|
42
|
+
Use the `agent` tool and launch all review passes in a single response so they run concurrently. **Set `subagent_type: "general-purpose"` and `run_in_background: false` on every call — each pass must return its findings inline. Do NOT fork them: never set `subagent_type: "fork"`. A fork runs fire-and-forget and never returns its findings, so there would be nothing to aggregate in Step 3.** Each pass must receive the same review scope and diff command. These passes are read-only: each one inspects and reports findings only and must not modify files — all edits happen later in Step 4.
|
|
43
43
|
|
|
44
44
|
Keep each review prompt short and focused. Do not paste the full diff into the prompt. Tell each pass to read the diff itself and inspect only files relevant to its findings.
|
|
45
45
|
|
|
@@ -4,59 +4,58 @@ import {
|
|
|
4
4
|
MINIMUM_MAX_HEIGHT,
|
|
5
5
|
MaxSizedBox,
|
|
6
6
|
setMaxSizedBoxDebugging
|
|
7
|
-
} from "./chunk-
|
|
8
|
-
import "./chunk-
|
|
7
|
+
} from "./chunk-NUHSLBJZ.js";
|
|
8
|
+
import "./chunk-GEHSF7MS.js";
|
|
9
|
+
import "./chunk-XAAEDML2.js";
|
|
9
10
|
import "./chunk-NHDKSOEY.js";
|
|
10
|
-
import "./chunk-
|
|
11
|
-
import "./chunk-Q6TUALBE.js";
|
|
12
|
-
import "./chunk-SUARMD4Q.js";
|
|
11
|
+
import "./chunk-J6NT5YTN.js";
|
|
13
12
|
import "./chunk-QHTIBUWB.js";
|
|
13
|
+
import "./chunk-HTHUX2T5.js";
|
|
14
14
|
import "./chunk-RKUWKYED.js";
|
|
15
|
-
import "./chunk-
|
|
15
|
+
import "./chunk-6TDA4EVC.js";
|
|
16
|
+
import "./chunk-5M6IDOMF.js";
|
|
16
17
|
import "./chunk-T4TZQJ7W.js";
|
|
17
18
|
import "./chunk-H6XPXXMH.js";
|
|
18
|
-
import "./chunk-
|
|
19
|
-
import "./chunk-
|
|
20
|
-
import "./chunk-
|
|
21
|
-
import "./chunk-
|
|
22
|
-
import "./chunk-TV6K2FB4.js";
|
|
19
|
+
import "./chunk-LKR7QQ63.js";
|
|
20
|
+
import "./chunk-4XCVGEEX.js";
|
|
21
|
+
import "./chunk-XSPFQQRE.js";
|
|
22
|
+
import "./chunk-4RPARQ5D.js";
|
|
23
23
|
import "./chunk-E2UVIFI2.js";
|
|
24
24
|
import "./chunk-XU457J4V.js";
|
|
25
25
|
import "./chunk-VDDGDZMA.js";
|
|
26
|
-
import "./chunk-
|
|
26
|
+
import "./chunk-J2MKYJKZ.js";
|
|
27
27
|
import "./chunk-SZRN75WQ.js";
|
|
28
28
|
import "./chunk-HTO4JFDZ.js";
|
|
29
29
|
import "./chunk-CPBF7KYF.js";
|
|
30
|
-
import "./chunk-
|
|
30
|
+
import "./chunk-UOA2IHRI.js";
|
|
31
31
|
import "./chunk-6AM5D4ME.js";
|
|
32
|
-
import "./chunk-
|
|
33
|
-
import "./chunk-
|
|
34
|
-
import "./chunk-
|
|
35
|
-
import "./chunk-
|
|
36
|
-
import "./chunk-
|
|
32
|
+
import "./chunk-OSSDHJDU.js";
|
|
33
|
+
import "./chunk-SGPFJMRP.js";
|
|
34
|
+
import "./chunk-335ECZTA.js";
|
|
35
|
+
import "./chunk-JCJPZMJV.js";
|
|
36
|
+
import "./chunk-QGONRHUS.js";
|
|
37
|
+
import "./chunk-7KS72E2N.js";
|
|
38
|
+
import "./chunk-JESCGQM3.js";
|
|
39
|
+
import "./chunk-YN2I5I42.js";
|
|
37
40
|
import "./chunk-4WKAA4KS.js";
|
|
38
41
|
import "./chunk-CR3C7WXL.js";
|
|
39
|
-
import "./chunk-RTV5TUYB.js";
|
|
40
42
|
import "./chunk-VGC4I5JJ.js";
|
|
41
|
-
import "./chunk-
|
|
42
|
-
import "./chunk-
|
|
43
|
-
import "./chunk-
|
|
44
|
-
import "./chunk-
|
|
45
|
-
import "./chunk-
|
|
46
|
-
import "./chunk-ZPAHLFZU.js";
|
|
47
|
-
import "./chunk-JESCGQM3.js";
|
|
48
|
-
import "./chunk-WIEO4CWB.js";
|
|
43
|
+
import "./chunk-LPHGXXZX.js";
|
|
44
|
+
import "./chunk-4CA4WUMS.js";
|
|
45
|
+
import "./chunk-VAJS2E2D.js";
|
|
46
|
+
import "./chunk-WEPXQKGP.js";
|
|
47
|
+
import "./chunk-ANRANWVE.js";
|
|
49
48
|
import "./chunk-XVNQMZ2I.js";
|
|
50
49
|
import "./chunk-FEOZBUMT.js";
|
|
51
|
-
import "./chunk-
|
|
50
|
+
import "./chunk-DJ2GSRLV.js";
|
|
51
|
+
import "./chunk-4CHDYDG3.js";
|
|
52
|
+
import "./chunk-V4PCIS25.js";
|
|
52
53
|
import "./chunk-A4UCTEB5.js";
|
|
53
54
|
import "./chunk-XWRJCPHC.js";
|
|
54
|
-
import "./chunk-
|
|
55
|
+
import "./chunk-TYQMGACW.js";
|
|
55
56
|
import "./chunk-TYAMGABM.js";
|
|
56
57
|
import "./chunk-FCMNKVXT.js";
|
|
57
|
-
import "./chunk-
|
|
58
|
-
import "./chunk-LQIDP6K5.js";
|
|
59
|
-
import "./chunk-7NFB7LBQ.js";
|
|
58
|
+
import "./chunk-UE5TZ55T.js";
|
|
60
59
|
import "./chunk-75DOP5OR.js";
|
|
61
60
|
import "./chunk-DMTGGOSA.js";
|
|
62
61
|
import "./chunk-YQ3U5MUC.js";
|
|
@@ -3,98 +3,97 @@
|
|
|
3
3
|
import {
|
|
4
4
|
ConfigContext,
|
|
5
5
|
SessionPicker
|
|
6
|
-
} from "./chunk-
|
|
7
|
-
import "./chunk-
|
|
6
|
+
} from "./chunk-LODZMRXC.js";
|
|
7
|
+
import "./chunk-JCYMQU5F.js";
|
|
8
8
|
import {
|
|
9
9
|
SettingsContext
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-CHVH4DVN.js";
|
|
11
11
|
import {
|
|
12
12
|
KeypressProvider
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-6QGZVKOO.js";
|
|
14
14
|
import "./chunk-4WGODMVR.js";
|
|
15
15
|
import "./chunk-KW7NOTN6.js";
|
|
16
|
-
import "./chunk-
|
|
16
|
+
import "./chunk-NUHSLBJZ.js";
|
|
17
17
|
import {
|
|
18
18
|
Box_default,
|
|
19
19
|
render_default,
|
|
20
20
|
require_jsx_runtime,
|
|
21
21
|
use_app_default
|
|
22
|
-
} from "./chunk-
|
|
22
|
+
} from "./chunk-GEHSF7MS.js";
|
|
23
|
+
import "./chunk-XAAEDML2.js";
|
|
23
24
|
import "./chunk-NHDKSOEY.js";
|
|
24
|
-
import "./chunk-
|
|
25
|
-
import "./chunk-
|
|
25
|
+
import "./chunk-CMHJEUVB.js";
|
|
26
|
+
import "./chunk-7LMAKIWE.js";
|
|
27
|
+
import "./chunk-J6NT5YTN.js";
|
|
28
|
+
import "./chunk-QHTIBUWB.js";
|
|
29
|
+
import "./chunk-76BFY7AF.js";
|
|
26
30
|
import {
|
|
27
31
|
require_react
|
|
28
32
|
} from "./chunk-HTHUX2T5.js";
|
|
29
|
-
import "./chunk-Q6TUALBE.js";
|
|
30
|
-
import "./chunk-CF5VJRGC.js";
|
|
31
|
-
import "./chunk-SUARMD4Q.js";
|
|
32
|
-
import "./chunk-QHTIBUWB.js";
|
|
33
33
|
import "./chunk-E5Z2AVNV.js";
|
|
34
34
|
import "./chunk-57OAHC2Y.js";
|
|
35
|
-
import "./chunk-
|
|
36
|
-
import "./chunk-
|
|
35
|
+
import "./chunk-DYUPBU7H.js";
|
|
36
|
+
import "./chunk-ILQ42UG6.js";
|
|
37
37
|
import "./chunk-RKUWKYED.js";
|
|
38
|
-
import "./chunk-4AGTGMCQ.js";
|
|
39
|
-
import "./chunk-JWICTOXS.js";
|
|
40
38
|
import "./chunk-GOXKNSDZ.js";
|
|
41
39
|
import "./chunk-IDS7MSUP.js";
|
|
40
|
+
import "./chunk-3PE7OY2G.js";
|
|
41
|
+
import "./chunk-NGTQA57Y.js";
|
|
42
42
|
import "./chunk-QRUIS3DN.js";
|
|
43
|
-
import "./chunk-
|
|
43
|
+
import "./chunk-XFJU7SVP.js";
|
|
44
44
|
import "./chunk-ALGGS7UH.js";
|
|
45
45
|
import "./chunk-MR3PXB6E.js";
|
|
46
46
|
import {
|
|
47
47
|
writeStdoutLine
|
|
48
|
-
} from "./chunk-
|
|
48
|
+
} from "./chunk-OWAK7LMW.js";
|
|
49
49
|
import {
|
|
50
50
|
SessionService,
|
|
51
51
|
getGitBranch
|
|
52
|
-
} from "./chunk-
|
|
52
|
+
} from "./chunk-6TDA4EVC.js";
|
|
53
|
+
import "./chunk-5M6IDOMF.js";
|
|
53
54
|
import "./chunk-T4TZQJ7W.js";
|
|
54
55
|
import "./chunk-H6XPXXMH.js";
|
|
55
|
-
import "./chunk-
|
|
56
|
-
import "./chunk-
|
|
57
|
-
import "./chunk-
|
|
58
|
-
import "./chunk-
|
|
59
|
-
import "./chunk-TV6K2FB4.js";
|
|
56
|
+
import "./chunk-LKR7QQ63.js";
|
|
57
|
+
import "./chunk-4XCVGEEX.js";
|
|
58
|
+
import "./chunk-XSPFQQRE.js";
|
|
59
|
+
import "./chunk-4RPARQ5D.js";
|
|
60
60
|
import "./chunk-E2UVIFI2.js";
|
|
61
61
|
import "./chunk-XU457J4V.js";
|
|
62
62
|
import "./chunk-VDDGDZMA.js";
|
|
63
|
-
import "./chunk-
|
|
63
|
+
import "./chunk-J2MKYJKZ.js";
|
|
64
64
|
import "./chunk-SZRN75WQ.js";
|
|
65
65
|
import "./chunk-HTO4JFDZ.js";
|
|
66
66
|
import "./chunk-CPBF7KYF.js";
|
|
67
|
-
import "./chunk-
|
|
67
|
+
import "./chunk-UOA2IHRI.js";
|
|
68
68
|
import "./chunk-6AM5D4ME.js";
|
|
69
|
-
import "./chunk-
|
|
70
|
-
import "./chunk-
|
|
71
|
-
import "./chunk-
|
|
72
|
-
import "./chunk-
|
|
73
|
-
import "./chunk-
|
|
69
|
+
import "./chunk-OSSDHJDU.js";
|
|
70
|
+
import "./chunk-SGPFJMRP.js";
|
|
71
|
+
import "./chunk-335ECZTA.js";
|
|
72
|
+
import "./chunk-JCJPZMJV.js";
|
|
73
|
+
import "./chunk-QGONRHUS.js";
|
|
74
|
+
import "./chunk-7KS72E2N.js";
|
|
75
|
+
import "./chunk-JESCGQM3.js";
|
|
76
|
+
import "./chunk-YN2I5I42.js";
|
|
74
77
|
import "./chunk-4WKAA4KS.js";
|
|
75
78
|
import "./chunk-CR3C7WXL.js";
|
|
76
|
-
import "./chunk-RTV5TUYB.js";
|
|
77
79
|
import "./chunk-VGC4I5JJ.js";
|
|
78
|
-
import "./chunk-
|
|
79
|
-
import "./chunk-
|
|
80
|
-
import "./chunk-
|
|
81
|
-
import "./chunk-
|
|
82
|
-
import "./chunk-
|
|
83
|
-
import "./chunk-ZPAHLFZU.js";
|
|
84
|
-
import "./chunk-JESCGQM3.js";
|
|
85
|
-
import "./chunk-WIEO4CWB.js";
|
|
80
|
+
import "./chunk-LPHGXXZX.js";
|
|
81
|
+
import "./chunk-4CA4WUMS.js";
|
|
82
|
+
import "./chunk-VAJS2E2D.js";
|
|
83
|
+
import "./chunk-WEPXQKGP.js";
|
|
84
|
+
import "./chunk-ANRANWVE.js";
|
|
86
85
|
import "./chunk-XVNQMZ2I.js";
|
|
87
86
|
import "./chunk-FEOZBUMT.js";
|
|
88
|
-
import "./chunk-
|
|
87
|
+
import "./chunk-DJ2GSRLV.js";
|
|
88
|
+
import "./chunk-4CHDYDG3.js";
|
|
89
|
+
import "./chunk-V4PCIS25.js";
|
|
89
90
|
import "./chunk-A4UCTEB5.js";
|
|
90
91
|
import "./chunk-XWRJCPHC.js";
|
|
91
|
-
import "./chunk-
|
|
92
|
+
import "./chunk-TYQMGACW.js";
|
|
92
93
|
import "./chunk-TYAMGABM.js";
|
|
93
94
|
import "./chunk-FCMNKVXT.js";
|
|
94
|
-
import "./chunk-
|
|
95
|
-
import "./chunk-
|
|
96
|
-
import "./chunk-7NFB7LBQ.js";
|
|
97
|
-
import "./chunk-CAHY5ABC.js";
|
|
95
|
+
import "./chunk-UE5TZ55T.js";
|
|
96
|
+
import "./chunk-DULSE2SH.js";
|
|
98
97
|
import "./chunk-75DOP5OR.js";
|
|
99
98
|
import "./chunk-DMTGGOSA.js";
|
|
100
99
|
import "./chunk-YQ3U5MUC.js";
|