@qwen-code/qwen-code 0.19.5 → 0.19.6-nightly.20260704.5dc2e1501
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/dataviz/SKILL.md +50 -0
- package/bundled/dataviz/references/anti-patterns.md +12 -0
- package/bundled/dataviz/references/choosing-a-form.md +16 -0
- package/bundled/dataviz/references/palette.md +57 -0
- package/bundled/dataviz/scripts/validate_palette.js +328 -0
- package/bundled/loop/SKILL.md +1 -1
- package/bundled/qc-helper/docs/configuration/settings.md +9 -8
- package/bundled/qc-helper/docs/features/headless.md +2 -2
- package/bundled/qc-helper/docs/features/scheduled-tasks.md +4 -2
- package/bundled/qc-helper/docs/reference/keyboard-shortcuts.md +1 -1
- package/bundled/review/DESIGN.md +23 -0
- package/bundled/review/SKILL.md +65 -8
- package/chunks/{MaxSizedBox-5JV77KRA.js → MaxSizedBox-44K34KSF.js} +14 -14
- package/chunks/{StandaloneSessionPicker-MGUGB6PH.js → StandaloneSessionPicker-6WZYYTZE.js} +25 -25
- package/chunks/{acpAgent-4F36XM3X.js → acpAgent-2CMYPFHV.js} +346 -131
- package/chunks/{agent-IWBUZI6A.js → agent-UOEAYBCX.js} +11 -11
- package/chunks/{agent-headless-JUTICAYO.js → agent-headless-7SCVZZGJ.js} +11 -11
- package/chunks/{anthropicContentGenerator-WL3LJOUB.js → anthropicContentGenerator-H5ZOEENQ.js} +2 -2
- package/chunks/{artifact-tool-W76WC2JX.js → artifact-tool-SLYPWG3C.js} +15 -2
- package/chunks/{askUserQuestion-J3P6TH3V.js → askUserQuestion-OKPTECON.js} +1 -1
- package/chunks/{bridge-DHZHQ4UV.js → bridge-IGX2XPWV.js} +17 -16
- package/chunks/{channel-worker-supervisor-EVPAYNZ5.js → channel-worker-supervisor-JUYQ5Z4R.js} +5 -5
- package/chunks/{chunk-EROWZQN7.js → chunk-2HK52TS2.js} +6 -6
- package/chunks/chunk-3RW4AZJV.js +5063 -0
- package/chunks/chunk-3VJ7MT3N.js +111 -0
- package/chunks/{chunk-JJ6B3ZD3.js → chunk-3ZSJDRNO.js} +2 -2
- package/chunks/{chunk-SJVPSHXU.js → chunk-4OIKNWUQ.js} +4 -4
- package/chunks/{chunk-PPFWEV7G.js → chunk-4RQIB5UZ.js} +62 -62
- package/chunks/{chunk-MDBNFHIO.js → chunk-4YMVQKCZ.js} +3 -3
- package/chunks/{chunk-2YH27UNF.js → chunk-4YXBDLX7.js} +1 -1
- package/chunks/{chunk-6QVQZAW6.js → chunk-537ZUZEH.js} +1 -1
- package/chunks/{chunk-L7OJ3ZO3.js → chunk-5ES5YPED.js} +1 -1
- package/chunks/{chunk-UJT42DB6.js → chunk-5QC7Y5TJ.js} +5 -5
- package/chunks/{chunk-BC4R5C5R.js → chunk-5WYLPENX.js} +32 -6
- package/chunks/{chunk-7DMQRPC7.js → chunk-6BEOH4KK.js} +1 -1
- package/chunks/{chunk-CXBG27SF.js → chunk-6IAWPIQ6.js} +3 -2
- package/chunks/{chunk-RM3PGSGL.js → chunk-6SHO7WFF.js} +15 -2
- package/chunks/{chunk-CBJE2PLG.js → chunk-777PHAJF.js} +2 -2
- package/chunks/{chunk-NSSVORTQ.js → chunk-7UU2AGR4.js} +16 -12
- package/chunks/{chunk-RNGAT2Y2.js → chunk-AGLMKJH5.js} +1 -1
- package/chunks/{chunk-J3ERRYYI.js → chunk-AWSTZHHZ.js} +2 -2
- package/chunks/{chunk-6QTCOQX7.js → chunk-B5ZACOMA.js} +1967 -1399
- package/chunks/{chunk-R6RI2HIC.js → chunk-CLQPBI4H.js} +40 -13
- package/chunks/{chunk-SJBIFVD2.js → chunk-DMSNJDWG.js} +5 -1
- package/chunks/{chunk-KKQWC6WS.js → chunk-DNV4FSN5.js} +1 -1
- package/chunks/{chunk-Z7XNVNPM.js → chunk-EMSRFDBD.js} +1 -1
- package/chunks/{chunk-HISPEX42.js → chunk-G645A66S.js} +7 -7
- package/chunks/{chunk-WALEWZ44.js → chunk-H3GBYW5M.js} +1 -1
- package/chunks/{chunk-2Z43HUXT.js → chunk-HLKG6CZN.js} +3 -2
- package/chunks/{chunk-XKZXGIRM.js → chunk-HNGXPBWR.js} +2 -2
- package/chunks/{chunk-QHYITL6P.js → chunk-HXX7S2AE.js} +5 -11
- package/chunks/{chunk-XKSCTXPK.js → chunk-J6ABRKAB.js} +2 -1
- package/chunks/{chunk-DX3TKXNT.js → chunk-JA5KWZTJ.js} +1 -1
- package/chunks/{chunk-4MCC4XHH.js → chunk-KBKWNEPS.js} +38 -37
- package/chunks/{chunk-MNOXKSM2.js → chunk-KEKV2TOO.js} +1 -1
- package/chunks/{chunk-R3UWLLRQ.js → chunk-KP6O77UN.js} +1 -1
- package/chunks/{chunk-YTFBURQD.js → chunk-KYTQOCDE.js} +1 -1
- package/chunks/{chunk-TN6RT6EJ.js → chunk-LJUWNRJH.js} +16 -4
- package/chunks/{chunk-BPFJQGY7.js → chunk-LM3YCCZJ.js} +164 -5
- package/chunks/{chunk-G4M7FPNY.js → chunk-M6IUEDXM.js} +1 -1
- package/chunks/{chunk-MTNTVOJR.js → chunk-MJKMIQMK.js} +5 -2
- package/chunks/{chunk-2CAII5HD.js → chunk-MWGIMAYM.js} +1 -1
- package/chunks/{chunk-NDY7OENU.js → chunk-N3QDCSLP.js} +2 -2
- package/chunks/{chunk-IMAMNLY6.js → chunk-N6AGVKMC.js} +3 -3
- package/chunks/{chunk-WZ724G6K.js → chunk-NGCPNXJC.js} +5 -5
- package/chunks/{chunk-YXK4GPYO.js → chunk-NVFJSIAX.js} +29 -0
- package/chunks/{chunk-6KPZJJ6U.js → chunk-P2OIJOKP.js} +9 -9
- package/chunks/{chunk-RSBQS6M4.js → chunk-P2RRV2UB.js} +1 -1
- package/chunks/{chunk-NNEJEBCF.js → chunk-PGMCFUZS.js} +30 -21
- package/chunks/{chunk-CSPSJU5R.js → chunk-PNGENHT7.js} +16 -16
- package/chunks/{chunk-Y4UQT3PM.js → chunk-QQXG2BL6.js} +1 -1
- package/chunks/{chunk-M5ITDKSM.js → chunk-RUM2UEL3.js} +1 -1
- package/chunks/{chunk-DG573EOO.js → chunk-RZORUN6X.js} +1 -1
- package/chunks/{chunk-LHMZCIKL.js → chunk-SZFYG244.js} +3 -1
- package/chunks/{chunk-CHY5C5T4.js → chunk-TDMIHT6B.js} +171 -79
- package/chunks/{chunk-DRS2HTNT.js → chunk-TE6JTKY5.js} +5 -5
- package/chunks/chunk-U7UXWKGG.js +949 -0
- package/chunks/{chunk-JKGCBO3O.js → chunk-UPYORLKQ.js} +3 -3
- package/chunks/{chunk-UY2TCIZS.js → chunk-V5VTULL5.js} +2 -2
- package/chunks/{chunk-ZISMVA6U.js → chunk-WGCLCXAN.js} +1371 -24
- package/chunks/chunk-WSOGYJMT.js +5630 -0
- package/chunks/{chunk-SBMHB6N5.js → chunk-WWGZJJRG.js} +12 -12
- package/chunks/{chunk-DM4E337C.js → chunk-X3UQVEBR.js} +4 -4
- package/chunks/{chunk-K4I4STSL.js → chunk-XPOO5OMB.js} +2 -2
- package/chunks/{chunk-5B2WNM6V.js → chunk-ZI4MGBB5.js} +1 -1
- package/chunks/{chunk-OQHLUA2Y.js → chunk-ZLJKZ57K.js} +3 -3
- package/chunks/{chunk-YCU7QV7Q.js → chunk-ZZDAIAA6.js} +32 -0
- package/chunks/{computer-use-ON3JQUHW.js → computer-use-TQWGUBPQ.js} +11 -11
- package/chunks/{contextCommand-OGCG7W6N.js → contextCommand-XDK5RNWI.js} +13 -13
- package/chunks/{cron-create-6YTCOX6P.js → cron-create-7JYUDTUY.js} +20 -5
- package/chunks/{cron-delete-E3NIFSUK.js → cron-delete-YPULQQAK.js} +2 -2
- package/chunks/{cron-list-Q64MNQNE.js → cron-list-HJIW5MHP.js} +2 -2
- package/chunks/{daemon-EEB2RYOL.js → daemon-7XYW4BC3.js} +102 -0
- package/chunks/{daemon-status-provider-P72STMLB.js → daemon-status-provider-6UEN56WN.js} +20 -19
- package/chunks/{dist-AP5V4WYU.js → dist-AAO65DPC.js} +2 -2
- package/chunks/{dist-X4ZDE726.js → dist-ABQ7VWRR.js} +3 -3
- package/chunks/{dist-SNXOUPYS.js → dist-AW5ZYMUI.js} +2 -2
- package/chunks/{dist-Z57Q4YF5.js → dist-BV56HW3W.js} +276 -95
- package/chunks/{dist-IZP2VV4C.js → dist-JPSVN367.js} +2 -2
- package/chunks/{earlyInputCapture-DAFHSGVW.js → earlyInputCapture-7MNFMUJE.js} +11 -11
- package/chunks/{edit-3QFNCSZH.js → edit-HOC63PHG.js} +12 -12
- package/chunks/{en-M4EBUBNU.js → en-XR3S5VWY.js} +1 -0
- package/chunks/{enter-worktree-62EQQMLD.js → enter-worktree-THXLMUX2.js} +11 -11
- package/chunks/{enterPlanMode-VUQSE4EG.js → enterPlanMode-TW4WQVEI.js} +11 -11
- package/chunks/{errors-PW75PZXE.js → errors-NTNVSC6G.js} +13 -13
- package/chunks/{exit-worktree-VVNH7OVY.js → exit-worktree-CLL7RGAT.js} +11 -11
- package/chunks/{exitPlanMode-RUYRCYZW.js → exitPlanMode-BTZZ3QEL.js} +11 -11
- package/chunks/{fast-path-TFRJRTTR.js → fast-path-RYXBU6AS.js} +3 -3
- package/chunks/{fast-path-settings-UQLRFDQP.js → fast-path-settings-RCRXH2JG.js} +2 -2
- package/chunks/{gemini-XW7ZDUVR.js → gemini-36FE3OHS.js} +69 -64
- package/chunks/{geminiContentGenerator-MZDVHVZH.js → geminiContentGenerator-JEG2PANG.js} +1 -1
- package/chunks/{glob-WAY2PUWA.js → glob-EYVHOFCY.js} +11 -11
- package/chunks/{grep-W6CBKSYC.js → grep-TZY5TDGH.js} +11 -11
- package/chunks/{initializer-HK2XE6P2.js → initializer-HPF2RBSB.js} +16 -16
- package/chunks/{list-RVLIIKKL.js → list-THUTQ7B5.js} +18 -18
- package/chunks/{loadedSettingsAdapter-C63OUYZC.js → loadedSettingsAdapter-CUMWJNWJ.js} +16 -16
- package/chunks/{loop-wakeup-G2EHBRGR.js → loop-wakeup-34YK7T7O.js} +3 -3
- package/chunks/{ls-IDHUVSAG.js → ls-MPD5OJUX.js} +1 -1
- package/chunks/{lsp-FSRYXGFT.js → lsp-72PWTDW7.js} +1 -1
- package/chunks/{workspace-skills-status-ONEPXJV6.js → mcp-NQD5MT2T.js} +20 -16
- package/chunks/{monitor-FOG36ABM.js → monitor-PB7NVSG2.js} +11 -11
- package/chunks/{nonInteractiveCli-6BYQSJTB.js → nonInteractiveCli-F5FJXYQR.js} +46 -44
- package/chunks/{notebook-edit-GC6NXRCX.js → notebook-edit-LAK6OHS6.js} +12 -12
- package/chunks/{openaiContentGenerator-EXR3ZL3Z.js → openaiContentGenerator-GMMEY5PG.js} +6 -6
- package/chunks/{pidfile-FNZM2DDH.js → pidfile-NQ2YUNKI.js} +11 -11
- package/chunks/{qwenContentGenerator-A7B6J4U7.js → qwenContentGenerator-7XCBMQBM.js} +13 -13
- package/chunks/{read-file-6JL4ULMY.js → read-file-KUROJDUQ.js} +3 -3
- package/chunks/{read-mcp-resource-PIJF24RO.js → read-mcp-resource-OWOBJY72.js} +1 -1
- package/chunks/record-artifact-URK3YUDJ.js +343 -0
- package/chunks/{ripGrep-DIUGLJE5.js → ripGrep-USDWBX4L.js} +11 -11
- package/chunks/{run-qwen-serve-CME3AKM4.js → run-qwen-serve-WKCKS23N.js} +72 -28
- package/chunks/{scheduler-L7F6GDDT.js → scheduler-QR4F5TAH.js} +11 -11
- package/chunks/{send-message-33PYFMCT.js → send-message-L7OLQEKH.js} +2 -2
- package/chunks/{serve-SRCBOJGP.js → serve-2EIPX62G.js} +18 -18
- package/chunks/{server-QSQ45QFR.js → server-UJ7ZF5D7.js} +1184 -490
- package/chunks/{session-5DG6NXHZ.js → session-XB3CFJ6R.js} +48 -46
- package/chunks/{settings-3EEQI4MN.js → settings-DYVJFW5H.js} +15 -15
- package/chunks/{shell-B7FNYF5S.js → shell-IG7KGPLR.js} +11 -11
- package/chunks/{skill-AAOGHD5O.js → skill-RWX646DC.js} +4 -4
- package/chunks/{spawnChannel-3CBN3ZLK.js → spawnChannel-GWIJHDZ5.js} +15 -15
- package/chunks/{src-T5A7P7FS.js → src-IYODJOVK.js} +47 -21
- package/chunks/{startInteractiveUI-2FGEQ6AS.js → startInteractiveUI-PLEZAI44.js} +354 -152
- package/chunks/{syntheticOutput-YOSWIHDJ.js → syntheticOutput-J3MLCQAR.js} +2 -2
- package/chunks/{task-create-NHS2NGB3.js → task-create-ELEBZ7H2.js} +3 -3
- package/chunks/{task-list-5UIB564R.js → task-list-IEUZLF3Y.js} +1 -1
- package/chunks/{task-stop-HGXZ2VZ3.js → task-stop-QEZW3UDY.js} +1 -1
- package/chunks/{task-update-IYYWUILG.js → task-update-DW36J5P5.js} +3 -3
- package/chunks/{team-create-KDF6W6PV.js → team-create-RXRE7FCH.js} +11 -11
- package/chunks/{team-delete-FEKJCU4P.js → team-delete-SVITIMBO.js} +1 -1
- package/chunks/{team-plan-approval-PSFKQX7M.js → team-plan-approval-OJDMQXOK.js} +11 -11
- package/chunks/{theme-manager-5XOA2AO7.js → theme-manager-QBK6PZOQ.js} +11 -11
- package/chunks/{todoWrite-TKMVZ2HT.js → todoWrite-SFFQHZYY.js} +2 -2
- package/chunks/{tool-search-LFRILZXC.js → tool-search-EZQYPVFF.js} +4 -4
- package/chunks/{trustedFolders-7HQY6T6X.js → trustedFolders-GZDMSATB.js} +12 -12
- package/chunks/{validateNonInterActiveAuth-UC27B7BA.js → validateNonInterActiveAuth-AHXCFAV6.js} +43 -41
- package/chunks/version-KQ5CA4C5.js +10 -0
- package/chunks/{web-fetch-J4PIW36Q.js → web-fetch-SXAXJHIO.js} +2 -2
- package/chunks/{workflow-KUTESS6L.js → workflow-KUBRBYWH.js} +20 -13
- package/chunks/{workspace-providers-status-LJT5AQDS.js → workspace-providers-status-LRMZ4KYI.js} +18 -18
- package/chunks/{workspace-service-YOBYVDXH.js → workspace-service-5UYFHP42.js} +23 -23
- package/chunks/workspace-skills-status-TKLU5O2X.js +68 -0
- package/chunks/{write-file-FJYBZUHP.js → write-file-37LNLFQC.js} +12 -12
- package/chunks/yargs-B64EYTCF.js +10 -0
- package/chunks/{zh-SLZNSSZB.js → zh-FSVJTXA4.js} +1 -0
- package/chunks/{zh-TW-P53C2SL5.js → zh-TW-66MG4LWL.js} +1 -0
- package/cli-entry.js +81 -8
- package/cli.js +348 -55
- package/locales/en.js +1 -0
- package/locales/zh-TW.js +1 -0
- package/locales/zh.js +1 -0
- package/node_modules/@qwen-code/audio-capture/package.json +1 -1
- package/node_modules/@qwen-code/audio-capture/prebuilds/darwin-arm64/@qwen-code+audio-capture.node +0 -0
- package/node_modules/@qwen-code/audio-capture/prebuilds/darwin-x64/@qwen-code+audio-capture.node +0 -0
- package/node_modules/@qwen-code/audio-capture/prebuilds/win32-x64/@qwen-code+audio-capture.node +0 -0
- package/package.json +3 -3
- package/web-shell/assets/{arc-D_rAuMDd.js → arc-CUpe0ibu.js} +1 -1
- package/web-shell/assets/{architectureDiagram-3BPJPVTR-DUCzbHVo.js → architectureDiagram-3BPJPVTR-JvyrY_mK.js} +1 -1
- package/web-shell/assets/{blockDiagram-GPEHLZMM-BEEBt1LL.js → blockDiagram-GPEHLZMM-CK3Y_vom.js} +1 -1
- package/web-shell/assets/{c4Diagram-AAUBKEIU-5ZJ_DeFL.js → c4Diagram-AAUBKEIU-DprSnyrf.js} +1 -1
- package/web-shell/assets/channel-BAxQ2-aZ.js +1 -0
- package/web-shell/assets/{chunk-2J33WTMH-Cfw7EiLn.js → chunk-2J33WTMH-DJtRJPmu.js} +1 -1
- package/web-shell/assets/{chunk-4BX2VUAB-FGuZNCZY.js → chunk-4BX2VUAB-ON6Q2-BG.js} +1 -1
- package/web-shell/assets/{chunk-55IACEB6-CaBwYPBF.js → chunk-55IACEB6-c60ou5HZ.js} +1 -1
- package/web-shell/assets/{chunk-727SXJPM-BlR04OFz.js → chunk-727SXJPM-BamtPKxx.js} +1 -1
- package/web-shell/assets/{chunk-AQP2D5EJ-D3_mYJH5.js → chunk-AQP2D5EJ-CsVgpu-T.js} +1 -1
- package/web-shell/assets/{chunk-FMBD7UC4-7D4q4SbB.js → chunk-FMBD7UC4-vZrpjAx4.js} +1 -1
- package/web-shell/assets/{chunk-ND2GUHAM-BjX_Iwmr.js → chunk-ND2GUHAM-qxyNOd5t.js} +1 -1
- package/web-shell/assets/{chunk-QZHKN3VN-C3Hz_ZQh.js → chunk-QZHKN3VN-BvTJSM_S.js} +1 -1
- package/web-shell/assets/classDiagram-4FO5ZUOK-Cvd_xhZI.js +1 -0
- package/web-shell/assets/classDiagram-v2-Q7XG4LA2-Cvd_xhZI.js +1 -0
- package/web-shell/assets/{cose-bilkent-S5V4N54A-Ax4UycaT.js → cose-bilkent-S5V4N54A-1tXB4pju.js} +1 -1
- package/web-shell/assets/{dagre-BM42HDAG-C6hmPtGt.js → dagre-BM42HDAG-DglBzme8.js} +1 -1
- package/web-shell/assets/{diagram-2AECGRRQ-tXZnxjmw.js → diagram-2AECGRRQ-DEJpqsWz.js} +1 -1
- package/web-shell/assets/{diagram-5GNKFQAL-99dwIzQG.js → diagram-5GNKFQAL-CsQ1NrMG.js} +1 -1
- package/web-shell/assets/{diagram-KO2AKTUF-Bqhn0-2s.js → diagram-KO2AKTUF-Z-3codAi.js} +1 -1
- package/web-shell/assets/{diagram-LMA3HP47-DzThVSvo.js → diagram-LMA3HP47-mBuPTA2i.js} +1 -1
- package/web-shell/assets/{diagram-OG6HWLK6-DPE8vjln.js → diagram-OG6HWLK6-tcA3K3s9.js} +1 -1
- package/web-shell/assets/{erDiagram-TEJ5UH35-KzUKgQCV.js → erDiagram-TEJ5UH35-D9bXFRyZ.js} +1 -1
- package/web-shell/assets/{flowDiagram-I6XJVG4X-DBN-DXw5.js → flowDiagram-I6XJVG4X-Ck0Py04s.js} +1 -1
- package/web-shell/assets/{ganttDiagram-6RSMTGT7-DuBsP9u8.js → ganttDiagram-6RSMTGT7-rOevCekE.js} +1 -1
- package/web-shell/assets/{gitGraphDiagram-PVQCEYII-BjWHMyKR.js → gitGraphDiagram-PVQCEYII-CoPQaLj0.js} +1 -1
- package/web-shell/assets/index-Cr7MYW6T.css +5 -0
- package/web-shell/assets/index-DCHPAUp3.js +730 -0
- package/web-shell/assets/{infoDiagram-5YYISTIA-BVux0vP6.js → infoDiagram-5YYISTIA-a77CUKoI.js} +1 -1
- package/web-shell/assets/{ishikawaDiagram-YF4QCWOH-2qzw7f--.js → ishikawaDiagram-YF4QCWOH-DlLgUAO-.js} +1 -1
- package/web-shell/assets/{journeyDiagram-JHISSGLW-Dnl65sxL.js → journeyDiagram-JHISSGLW-BXR5kVAZ.js} +1 -1
- package/web-shell/assets/{kanban-definition-UN3LZRKU-BElSQYtY.js → kanban-definition-UN3LZRKU-h5CoHZg7.js} +1 -1
- package/web-shell/assets/{linear-BjoycSSY.js → linear-BkaREbyD.js} +1 -1
- package/web-shell/assets/{mermaid.core-xe6bvMRz.js → mermaid.core-Bkagz0ng.js} +5 -5
- package/web-shell/assets/{mindmap-definition-RKZ34NQL-D8DQgI4U.js → mindmap-definition-RKZ34NQL-D7EMKR_5.js} +1 -1
- package/web-shell/assets/{pieDiagram-4H26LBE5-Dwh7Gp7c.js → pieDiagram-4H26LBE5-DAmPOjsL.js} +1 -1
- package/web-shell/assets/{quadrantDiagram-W4KKPZXB-BXKNBln2.js → quadrantDiagram-W4KKPZXB-e4WFQkQu.js} +1 -1
- package/web-shell/assets/{requirementDiagram-4Y6WPE33-BzaC3cIA.js → requirementDiagram-4Y6WPE33-v1zo7OiV.js} +1 -1
- package/web-shell/assets/{sankeyDiagram-5OEKKPKP-DP2t7eZk.js → sankeyDiagram-5OEKKPKP-Bstm4aW_.js} +1 -1
- package/web-shell/assets/{sequenceDiagram-3UESZ5HK-XlFiWEYv.js → sequenceDiagram-3UESZ5HK-DzcZy6xN.js} +1 -1
- package/web-shell/assets/{stateDiagram-AJRCARHV-CupgUMJO.js → stateDiagram-AJRCARHV-BEJH6YbH.js} +1 -1
- package/web-shell/assets/stateDiagram-v2-BHNVJYJU-BopifCBI.js +1 -0
- package/web-shell/assets/{timeline-definition-PNZ67QCA-DstuGywa.js → timeline-definition-PNZ67QCA-TI1wH-Pm.js} +1 -1
- package/web-shell/assets/{vennDiagram-CIIHVFJN-CnbNp6zu.js → vennDiagram-CIIHVFJN-YaH8VDMS.js} +1 -1
- package/web-shell/assets/{wardley-L42UT6IY-DnvoHq6R.js → wardley-L42UT6IY-B80co7OP.js} +1 -1
- package/web-shell/assets/{wardleyDiagram-YWT4CUSO-Cz0xHEWB.js → wardleyDiagram-YWT4CUSO-4fHNDEMl.js} +1 -1
- package/web-shell/assets/{xychartDiagram-2RQKCTM6-p36gfo88.js → xychartDiagram-2RQKCTM6-DT3q4Z3J.js} +1 -1
- package/web-shell/index.html +2 -2
- package/bundled/loop/SKILL.test.ts +0 -119
- package/bundled/loop/autonomous-loop.test.ts +0 -59
- package/bundled/loop/loop-task-file.test.ts +0 -1064
- package/bundled/loop/loop-tick-resolver.test.ts +0 -906
- package/chunks/chunk-EJ7BN3EN.js +0 -11396
- package/web-shell/assets/channel-B5ynH0q8.js +0 -1
- package/web-shell/assets/classDiagram-4FO5ZUOK-CK3ibywp.js +0 -1
- package/web-shell/assets/classDiagram-v2-Q7XG4LA2-CK3ibywp.js +0 -1
- package/web-shell/assets/index-9qfvU0_r.css +0 -5
- package/web-shell/assets/index-CWzDaQT5.js +0 -717
- package/web-shell/assets/stateDiagram-v2-BHNVJYJU-By3E4QwN.js +0 -1
- package/chunks/{chunk-UFC57OYT.js → chunk-VRDMOSQS.js} +54 -54
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: dataviz
|
|
3
|
+
description: Design guidance for charts, graphs, dashboards, maps, and data visualizations, including a local palette validator.
|
|
4
|
+
when_to_use: When creating or revising charts, graphs, dashboards, maps, plots, inline SVG, D3, Plotly, Recharts, matplotlib, or any Artifact page that visualizes data.
|
|
5
|
+
allowedTools:
|
|
6
|
+
- read_file
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Dataviz
|
|
10
|
+
|
|
11
|
+
Use this skill before producing a chart, dashboard, map, or data visualization.
|
|
12
|
+
|
|
13
|
+
## Workflow
|
|
14
|
+
|
|
15
|
+
1. Identify the analytic task: comparison, trend, distribution, relationship,
|
|
16
|
+
ranking, part-to-whole, geography, or status monitoring.
|
|
17
|
+
2. Choose the simplest chart form that answers that task. Read
|
|
18
|
+
`references/choosing-a-form.md` when the form is not obvious.
|
|
19
|
+
3. Write the finding into the title, subtitle, axis label, or direct annotation.
|
|
20
|
+
A viewer should know what changed, what is high or low, or what decision the
|
|
21
|
+
chart supports.
|
|
22
|
+
4. Pick colors from `references/palette.md`, or validate any custom palette with
|
|
23
|
+
the script below.
|
|
24
|
+
5. Check `references/anti-patterns.md` before finalizing the design.
|
|
25
|
+
|
|
26
|
+
## Palette Validation
|
|
27
|
+
|
|
28
|
+
Resolve paths relative to the skill base directory shown above this skill body.
|
|
29
|
+
Do not assume `$QWEN_SKILL_ROOT` is set for normal shell commands.
|
|
30
|
+
|
|
31
|
+
Run:
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
node <skill-base-directory>/scripts/validate_palette.js '#1d4ed8,#b45309,#166534' --mode light
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Treat `FAIL` as a required palette change. Treat `WARN` as acceptable only when
|
|
38
|
+
the chart also uses labels, shape, texture, ordering, or another secondary
|
|
39
|
+
encoding.
|
|
40
|
+
|
|
41
|
+
## Mark Rules
|
|
42
|
+
|
|
43
|
+
- Use categorical palettes for unordered groups; use sequential or diverging
|
|
44
|
+
ramps only for ordered values.
|
|
45
|
+
- Prefer direct labels over legends when the chart has a small number of series.
|
|
46
|
+
- Keep gridlines subtle and fewer than the data marks.
|
|
47
|
+
- Avoid dual axes unless both series share a clearly explained transformation.
|
|
48
|
+
- Do not rely on color alone for critical distinctions.
|
|
49
|
+
- Keep dashboards scan-friendly: align cards, use consistent number formats,
|
|
50
|
+
and reserve saturated color for important state changes.
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# Dataviz Anti-Patterns
|
|
2
|
+
|
|
3
|
+
- Do not use rainbow palettes for ordered data.
|
|
4
|
+
- Do not use sequential ramps for unrelated categories.
|
|
5
|
+
- Do not encode critical differences with color only.
|
|
6
|
+
- Do not start a bar chart above zero unless the truncation is explicit and
|
|
7
|
+
justified.
|
|
8
|
+
- Do not use dual axes when the visual comparison implies a relationship that
|
|
9
|
+
is not in the data.
|
|
10
|
+
- Do not hide units, denominators, sample sizes, or time windows.
|
|
11
|
+
- Do not let chart decoration compete with marks, labels, and annotations.
|
|
12
|
+
- Do not use a dashboard card if a compact table is clearer.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# Choosing A Form
|
|
2
|
+
|
|
3
|
+
| Task | Prefer | Avoid |
|
|
4
|
+
| --------------------- | --------------------------------- | --------------------------------------- |
|
|
5
|
+
| Compare categories | sorted bar chart | pie with many slices |
|
|
6
|
+
| Show change over time | line chart | disconnected bars for dense time series |
|
|
7
|
+
| Show ranking | horizontal bar chart | unsorted columns |
|
|
8
|
+
| Show distribution | histogram, box plot, violin plot | averages without spread |
|
|
9
|
+
| Show relationship | scatter plot | dual-axis line chart |
|
|
10
|
+
| Show part-to-whole | stacked bar for few parts | nested donuts |
|
|
11
|
+
| Show geography | choropleth or symbol map | map when location is irrelevant |
|
|
12
|
+
| Monitor status | compact dashboard with thresholds | decorative KPI cards |
|
|
13
|
+
|
|
14
|
+
Prefer the chart that makes the comparison visible without interaction. Add
|
|
15
|
+
interaction only when it reveals detail, filters clutter, or supports a real
|
|
16
|
+
workflow.
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# Palette Reference
|
|
2
|
+
|
|
3
|
+
## Categorical
|
|
4
|
+
|
|
5
|
+
Use these first for independent categories:
|
|
6
|
+
|
|
7
|
+
```text
|
|
8
|
+
#1d4ed8 blue
|
|
9
|
+
#b45309 orange
|
|
10
|
+
#166534 green
|
|
11
|
+
#7c3aed purple
|
|
12
|
+
#0891b2 cyan
|
|
13
|
+
#be123c rose
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
Start with three to five colors. If the chart needs more categories than that,
|
|
17
|
+
prefer direct labels, grouping, faceting, or filtering over adding more hues.
|
|
18
|
+
|
|
19
|
+
## Sequential
|
|
20
|
+
|
|
21
|
+
Use one hue ramp for ordered magnitude:
|
|
22
|
+
|
|
23
|
+
```text
|
|
24
|
+
#eff6ff #bfdbfe #60a5fa #2563eb #1e3a8a
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
The lightest and darkest ramp endpoints are for backgrounds, area fills, and
|
|
28
|
+
labels. When choosing exact line, point, or bar mark colors, validate the marks
|
|
29
|
+
you actually use rather than the full ramp.
|
|
30
|
+
|
|
31
|
+
## Diverging
|
|
32
|
+
|
|
33
|
+
Use a diverging ramp only when there is a meaningful center such as zero,
|
|
34
|
+
target, or baseline:
|
|
35
|
+
|
|
36
|
+
```text
|
|
37
|
+
#b91c1c #fca5a5 #f8fafc #93c5fd #1d4ed8
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
The center and endpoint colors provide range context. For exact chart marks,
|
|
41
|
+
validate the selected mark colors and add direct labels or another encoding when
|
|
42
|
+
the validator reports `WARN`.
|
|
43
|
+
|
|
44
|
+
## Validation
|
|
45
|
+
|
|
46
|
+
Run the validator whenever exact mark colors are chosen:
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
node <skill-base-directory>/scripts/validate_palette.js '#1d4ed8,#b45309,#166534' --mode light
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
The validator's 2.5:1 contrast floor is a practical chart-mark heuristic, not a
|
|
53
|
+
WCAG AA guarantee. Use 3:1 or higher when chart marks must satisfy WCAG 2.1
|
|
54
|
+
non-text contrast without relying on labels or secondary encodings.
|
|
55
|
+
|
|
56
|
+
The validator also enforces OKLCH lightness bands so marks are neither too pale
|
|
57
|
+
nor too dark for the selected surface, even when contrast alone looks adequate.
|
|
@@ -0,0 +1,328 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* @license
|
|
4
|
+
* Copyright 2026 Qwen Team
|
|
5
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { resolve } from 'node:path';
|
|
9
|
+
import process from 'node:process';
|
|
10
|
+
import { fileURLToPath } from 'node:url';
|
|
11
|
+
|
|
12
|
+
const MODE_CONFIG = {
|
|
13
|
+
light: {
|
|
14
|
+
surface: [255, 255, 255],
|
|
15
|
+
minLightness: 0.25,
|
|
16
|
+
maxLightness: 0.88,
|
|
17
|
+
minContrast: 2.5,
|
|
18
|
+
},
|
|
19
|
+
dark: {
|
|
20
|
+
surface: [17, 24, 39],
|
|
21
|
+
minLightness: 0.45,
|
|
22
|
+
maxLightness: 0.92,
|
|
23
|
+
minContrast: 2.5,
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
const CVD_MATRICES = {
|
|
28
|
+
protanopia: [
|
|
29
|
+
[0.56667, 0.43333, 0],
|
|
30
|
+
[0.55833, 0.44167, 0],
|
|
31
|
+
[0, 0, 1],
|
|
32
|
+
],
|
|
33
|
+
deuteranopia: [
|
|
34
|
+
[0.625, 0.375, 0],
|
|
35
|
+
[0.7, 0.3, 0],
|
|
36
|
+
[0, 0.3, 0.7],
|
|
37
|
+
],
|
|
38
|
+
tritanopia: [
|
|
39
|
+
[0.95, 0.05, 0],
|
|
40
|
+
[0, 0.43333, 0.56667],
|
|
41
|
+
[0, 0.475, 0.525],
|
|
42
|
+
],
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
const MAX_PALETTE_COLORS = 50;
|
|
46
|
+
|
|
47
|
+
export function validatePalette(input, options = {}) {
|
|
48
|
+
const mode = options.mode ?? 'light';
|
|
49
|
+
const config = modeConfig(mode);
|
|
50
|
+
const failures = [];
|
|
51
|
+
const warnings = [];
|
|
52
|
+
|
|
53
|
+
if (!config) {
|
|
54
|
+
return {
|
|
55
|
+
status: 'FAIL',
|
|
56
|
+
failures: [`Unsupported mode "${mode}". Use "light" or "dark".`],
|
|
57
|
+
warnings,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
if (input.length === 0) {
|
|
62
|
+
return { status: 'FAIL', failures: ['No colors provided.'], warnings };
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
if (input.length > MAX_PALETTE_COLORS) {
|
|
66
|
+
return {
|
|
67
|
+
status: 'FAIL',
|
|
68
|
+
failures: [
|
|
69
|
+
`Palette has ${input.length} colors; maximum supported is ${MAX_PALETTE_COLORS}.`,
|
|
70
|
+
],
|
|
71
|
+
warnings,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const colors = input.map((value, index) => {
|
|
76
|
+
const rgb = parseHexColor(value);
|
|
77
|
+
if (!rgb) {
|
|
78
|
+
failures.push(
|
|
79
|
+
`Color ${index + 1} has invalid hex color syntax: ${value}`,
|
|
80
|
+
);
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
const oklch = rgbToOklch(rgb);
|
|
84
|
+
return { value: normalizeHex(rgb), rgb, oklch };
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
if (failures.length > 0) {
|
|
88
|
+
return { status: 'FAIL', failures, warnings };
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
for (const color of colors) {
|
|
92
|
+
if (
|
|
93
|
+
color.oklch.l < config.minLightness ||
|
|
94
|
+
color.oklch.l > config.maxLightness
|
|
95
|
+
) {
|
|
96
|
+
failures.push(
|
|
97
|
+
`${color.value} has OKLCH lightness ${format(color.oklch.l)}, outside the ${mode} mark band ${config.minLightness}-${config.maxLightness}.`,
|
|
98
|
+
);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
if (color.oklch.c < 0.04) {
|
|
102
|
+
warnings.push(
|
|
103
|
+
`${color.value} has low OKLCH chroma ${format(color.oklch.c)} and may read as gray.`,
|
|
104
|
+
);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
const contrast = contrastRatio(color.rgb, config.surface);
|
|
108
|
+
if (contrast < config.minContrast) {
|
|
109
|
+
failures.push(
|
|
110
|
+
`${color.value} contrast ${format(contrast)} is below ${config.minContrast}:1 against the ${mode} chart surface.`,
|
|
111
|
+
);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
for (const [kind, matrix] of Object.entries(CVD_MATRICES)) {
|
|
116
|
+
const simulated = colors.map((color) => {
|
|
117
|
+
const rgb = applyMatrix(color.rgb, matrix);
|
|
118
|
+
return { value: color.value, rgb, lab: rgbToLab(rgb) };
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
for (const color of simulated) {
|
|
122
|
+
const contrast = contrastRatio(color.rgb, config.surface);
|
|
123
|
+
if (contrast < config.minContrast) {
|
|
124
|
+
warnings.push(
|
|
125
|
+
`${color.value} contrast ${format(contrast)} is below ${config.minContrast}:1 against the ${mode} chart surface under colorblind ${kind} simulation.`,
|
|
126
|
+
);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
for (let i = 0; i < simulated.length; i++) {
|
|
131
|
+
for (let j = i + 1; j < simulated.length; j++) {
|
|
132
|
+
const distance = labDistance(simulated[i].lab, simulated[j].lab);
|
|
133
|
+
if (distance < 40) {
|
|
134
|
+
warnings.push(
|
|
135
|
+
`${simulated[i].value} and ${simulated[j].value} are close under colorblind ${kind} simulation (DeltaE ${format(distance)}); add secondary encoding such as labels, shape, or texture.`,
|
|
136
|
+
);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
const uniqueFailures = [...new Set(failures)];
|
|
143
|
+
const uniqueWarnings = [...new Set(warnings)];
|
|
144
|
+
return {
|
|
145
|
+
status:
|
|
146
|
+
uniqueFailures.length > 0
|
|
147
|
+
? 'FAIL'
|
|
148
|
+
: uniqueWarnings.length > 0
|
|
149
|
+
? 'WARN'
|
|
150
|
+
: 'PASS',
|
|
151
|
+
failures: uniqueFailures,
|
|
152
|
+
warnings: uniqueWarnings,
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
function parseHexColor(value) {
|
|
157
|
+
if (typeof value !== 'string') return null;
|
|
158
|
+
const hex = value.trim();
|
|
159
|
+
const short = /^#([0-9a-f]{3})$/i.exec(hex);
|
|
160
|
+
if (short) {
|
|
161
|
+
return short[1].split('').map((part) => parseInt(part + part, 16));
|
|
162
|
+
}
|
|
163
|
+
const long = /^#([0-9a-f]{6})$/i.exec(hex);
|
|
164
|
+
if (!long) return null;
|
|
165
|
+
return [0, 2, 4].map((offset) =>
|
|
166
|
+
parseInt(long[1].slice(offset, offset + 2), 16),
|
|
167
|
+
);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
function normalizeHex(rgb) {
|
|
171
|
+
return `#${rgb.map((channel) => channel.toString(16).padStart(2, '0')).join('')}`;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
function applyMatrix(rgb, matrix) {
|
|
175
|
+
const linear = rgb.map(srgbChannelToLinear);
|
|
176
|
+
return matrix
|
|
177
|
+
.map((row) => row[0] * linear[0] + row[1] * linear[1] + row[2] * linear[2])
|
|
178
|
+
.map(linearChannelToSrgb);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
function contrastRatio(left, right) {
|
|
182
|
+
const l1 = relativeLuminance(left);
|
|
183
|
+
const l2 = relativeLuminance(right);
|
|
184
|
+
const lighter = Math.max(l1, l2);
|
|
185
|
+
const darker = Math.min(l1, l2);
|
|
186
|
+
return (lighter + 0.05) / (darker + 0.05);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
function relativeLuminance(rgb) {
|
|
190
|
+
const [r, g, b] = rgb.map(srgbChannelToLinear);
|
|
191
|
+
return 0.2126 * r + 0.7152 * g + 0.0722 * b;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
function rgbToLab(rgb) {
|
|
195
|
+
const [x, y, z] = rgbToXyz(rgb);
|
|
196
|
+
const xn = 0.95047;
|
|
197
|
+
const yn = 1;
|
|
198
|
+
const zn = 1.08883;
|
|
199
|
+
const fx = labPivot(x / xn);
|
|
200
|
+
const fy = labPivot(y / yn);
|
|
201
|
+
const fz = labPivot(z / zn);
|
|
202
|
+
return {
|
|
203
|
+
l: 116 * fy - 16,
|
|
204
|
+
a: 500 * (fx - fy),
|
|
205
|
+
b: 200 * (fy - fz),
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
function rgbToXyz(rgb) {
|
|
210
|
+
const [r, g, b] = rgb.map(srgbChannelToLinear);
|
|
211
|
+
return [
|
|
212
|
+
r * 0.4124564 + g * 0.3575761 + b * 0.1804375,
|
|
213
|
+
r * 0.2126729 + g * 0.7151522 + b * 0.072175,
|
|
214
|
+
r * 0.0193339 + g * 0.119192 + b * 0.9503041,
|
|
215
|
+
];
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
function labPivot(value) {
|
|
219
|
+
return value > 0.008856 ? Math.cbrt(value) : 7.787 * value + 16 / 116;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
function rgbToOklch(rgb) {
|
|
223
|
+
const [r, g, b] = rgb.map(srgbChannelToLinear);
|
|
224
|
+
|
|
225
|
+
const l = Math.cbrt(0.4122214708 * r + 0.5363325363 * g + 0.0514459929 * b);
|
|
226
|
+
const m = Math.cbrt(0.2119034982 * r + 0.6806995451 * g + 0.1073969566 * b);
|
|
227
|
+
const s = Math.cbrt(0.0883024619 * r + 0.2817188376 * g + 0.6299787005 * b);
|
|
228
|
+
|
|
229
|
+
const okL = 0.2104542553 * l + 0.793617785 * m - 0.0040720468 * s;
|
|
230
|
+
const okA = 1.9779984951 * l - 2.428592205 * m + 0.4505937099 * s;
|
|
231
|
+
const okB = 0.0259040371 * l + 0.7827717662 * m - 0.808675766 * s;
|
|
232
|
+
|
|
233
|
+
return {
|
|
234
|
+
l: okL,
|
|
235
|
+
c: Math.sqrt(okA * okA + okB * okB),
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
function srgbChannelToLinear(channel) {
|
|
240
|
+
const value = channel / 255;
|
|
241
|
+
return value <= 0.04045 ? value / 12.92 : ((value + 0.055) / 1.055) ** 2.4;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
function linearChannelToSrgb(channel) {
|
|
245
|
+
const value = Math.max(0, Math.min(1, channel));
|
|
246
|
+
const encoded =
|
|
247
|
+
value <= 0.0031308 ? value * 12.92 : 1.055 * value ** (1 / 2.4) - 0.055;
|
|
248
|
+
return Math.round(encoded * 255);
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
function labDistance(left, right) {
|
|
252
|
+
return Math.sqrt(
|
|
253
|
+
(left.l - right.l) ** 2 + (left.a - right.a) ** 2 + (left.b - right.b) ** 2,
|
|
254
|
+
);
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
function format(value) {
|
|
258
|
+
return Number(value.toFixed(3)).toString();
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
function parseArgs(argv) {
|
|
262
|
+
let mode = 'light';
|
|
263
|
+
let palette;
|
|
264
|
+
for (let i = 0; i < argv.length; i++) {
|
|
265
|
+
if (argv[i] === '--mode') {
|
|
266
|
+
if (!argv[i + 1] || argv[i + 1].startsWith('--')) {
|
|
267
|
+
process.stderr.write(
|
|
268
|
+
'Error: --mode requires a value (light or dark)\n',
|
|
269
|
+
);
|
|
270
|
+
process.exit(2);
|
|
271
|
+
}
|
|
272
|
+
mode = argv[++i];
|
|
273
|
+
} else if (argv[i].startsWith('--mode=')) {
|
|
274
|
+
mode = argv[i].slice('--mode='.length);
|
|
275
|
+
if (!mode) {
|
|
276
|
+
process.stderr.write(
|
|
277
|
+
'Error: --mode requires a value (light or dark)\n',
|
|
278
|
+
);
|
|
279
|
+
process.exit(2);
|
|
280
|
+
}
|
|
281
|
+
} else if (!palette) {
|
|
282
|
+
palette = argv[i];
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
return { palette, mode };
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
function printResult(result) {
|
|
289
|
+
process.stdout.write(`${result.status}\n`);
|
|
290
|
+
for (const failure of result.failures) {
|
|
291
|
+
process.stderr.write(`FAIL: ${failure}\n`);
|
|
292
|
+
}
|
|
293
|
+
for (const warning of result.warnings) {
|
|
294
|
+
process.stdout.write(`WARN: ${warning}\n`);
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
function modeConfig(mode) {
|
|
299
|
+
return Object.hasOwn(MODE_CONFIG, mode) ? MODE_CONFIG[mode] : undefined;
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
if (
|
|
303
|
+
process.argv[1] &&
|
|
304
|
+
fileURLToPath(import.meta.url) === resolve(process.argv[1])
|
|
305
|
+
) {
|
|
306
|
+
const { palette, mode } = parseArgs(process.argv.slice(2));
|
|
307
|
+
if (!palette) {
|
|
308
|
+
process.stderr.write(
|
|
309
|
+
"Usage: node validate_palette.js '#1d4ed8,#b45309,#166534' --mode light\n",
|
|
310
|
+
);
|
|
311
|
+
process.exit(2);
|
|
312
|
+
}
|
|
313
|
+
if (!modeConfig(mode)) {
|
|
314
|
+
process.stderr.write(
|
|
315
|
+
`Error: Unsupported mode "${mode}". Use "light" or "dark".\n`,
|
|
316
|
+
);
|
|
317
|
+
process.exit(2);
|
|
318
|
+
}
|
|
319
|
+
const result = validatePalette(
|
|
320
|
+
palette
|
|
321
|
+
.split(',')
|
|
322
|
+
.map((color) => color.trim())
|
|
323
|
+
.filter(Boolean),
|
|
324
|
+
{ mode },
|
|
325
|
+
);
|
|
326
|
+
printResult(result);
|
|
327
|
+
process.exit(result.status === 'FAIL' ? 1 : 0);
|
|
328
|
+
}
|
package/bundled/loop/SKILL.md
CHANGED
|
@@ -88,7 +88,7 @@ If the interval does not cleanly divide its unit (for example `7m` gives uneven
|
|
|
88
88
|
- `prompt`: the parsed prompt from above, verbatim (slash commands are passed through unchanged)
|
|
89
89
|
- `recurring`: `true`
|
|
90
90
|
- `durable`: `true` if the user's language implies persistence ("keep doing this", "set this up permanently", "every day even after restart"). Otherwise omit (defaults to session-only).
|
|
91
|
-
2. Briefly confirm: what is scheduled, the cron expression, the human-readable cadence,
|
|
91
|
+
2. Briefly confirm: what is scheduled, the cron expression, the human-readable cadence, the auto-expiry (7 days after creation by default — the CronCreate tool description states the configured limit, which may differ or be disabled), and that they can cancel sooner with CronDelete (include the job ID).
|
|
92
92
|
3. Then immediately execute the parsed prompt now. Do not wait for the first cron fire.
|
|
93
93
|
- If it is a slash command, invoke it via the Skill tool.
|
|
94
94
|
- Otherwise, act on it directly.
|
|
@@ -155,11 +155,13 @@ Settings are organized into categories. Most settings should be placed within th
|
|
|
155
155
|
| Setting | Type | Description | Default |
|
|
156
156
|
| -------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------- |
|
|
157
157
|
| `model.name` | string | The Qwen model to use for conversations. | `undefined` |
|
|
158
|
+
| `model.reasoningEffort` | enum | How hard reasoning-capable models think, applied across all providers. Set with the [`/effort`](../features/commands) command (`low`, `medium`, `high`, `xhigh`, `max`). Each provider maps and clamps this to what the active model supports (e.g. Gemini caps at `high`; Anthropic clamps tiers a model lacks). Leave unset to use the model/provider default. | `undefined` |
|
|
158
159
|
| `model.baseUrl` | string | Persisted automatically by the model picker to disambiguate when multiple `modelProviders` entries share the same model id. Not intended to be set by hand — use the `/model` picker or a `modelProviders` entry instead; a stale hand-edited value can silently route requests to a different same-id provider. | `undefined` |
|
|
159
160
|
| `model.sessionTokenLimit` | number | Maximum recorded prompt token count allowed before sending the next message. `-1` means unlimited; `0` is also treated as unlimited (unlike `model.maxToolCalls`, where `0` disallows all calls). When the recorded prompt count exceeds the limit, the next send is dropped (the session is not aborted). | `-1` |
|
|
160
161
|
| `model.maxSessionTurns` | number | Maximum number of user/model/tool turns to keep in a session. -1 means unlimited. | `-1` |
|
|
161
162
|
| `model.maxWallTimeSeconds` | number | Wall-clock budget for headless / unattended runs, in seconds. `-1` means unlimited. Overridable per-invocation via `--max-wall-time`, which requires a positive duration (`90`, `30s`, `5m`, `1h`, `1.5h`); the minimum is 1 second — sub-second values (`500ms`, `0.5`) are rejected as typos. Omit the flag to fall back to this setting. Aborts with exit code 55 when exceeded. | `-1` |
|
|
162
163
|
| `model.maxToolCalls` | number | Cumulative tool-call budget for a run (counts every executed tool, success or failure; `structured_output` under `--json-schema` is exempt). `-1` means unlimited; `0` means "no tool calls allowed". Capped at 1,000,000 to catch typos. Overridable via `--max-tool-calls`. Aborts with exit code 55 when exceeded. | `-1` |
|
|
164
|
+
| `model.maxSubagentDepth` | number | Maximum sub-agent nesting depth (1-based levels: a top-level sub-agent is level 1). `1` keeps sub-agents available but disables nesting — the pre-nesting behavior. Values clamp to the range 1–100; non-finite values fall back to the default. Teammates, forks, and workflow-spawned agents never nest regardless of this setting. Overridable via `--max-subagent-depth`. | `5` |
|
|
163
165
|
| `model.generationConfig` | object | Advanced overrides passed to the underlying content generator. Supports request controls such as `timeout`, `maxRetries`, `enableCacheControl`, `splitToolMedia` (default `true`; splits tool-returned media — including images read by the built-in read_file — into a follow-up user message instead of the spec-violating `role: "tool"` message, so strict OpenAI-compatible servers like doubao / new-api / LM Studio can see it; set `false` to restore the legacy embed-in-tool behavior), `toolResultContentFormat` (default `"parts"`; set `"string"` only for legacy OpenAI-compatible runtimes whose tool templates ignore text content parts), `contextWindowSize` (override model's context window size), `modalities` (override auto-detected input modalities), `customHeaders` (custom HTTP headers for API requests), and `extra_body` (additional body parameters for OpenAI-compatible API requests only), along with fine-tuning knobs under `samplingParams` (for example `temperature`, `top_p`, `max_tokens`). Leave unset to rely on provider defaults. | `undefined` |
|
|
164
166
|
| `model.chatCompression.contextPercentageThreshold` | number | **REMOVED.** Replaced by `context.autoCompactThreshold` (see `#### context` section below). Auto-compaction now uses a three-tier threshold ladder (warn / auto / hard) computed internally from the model's context window via the `computeThresholds()` function. The old setting is silently ignored (no startup warning). See PR #4345 / `docs/design/auto-compaction-threshold-redesign.md` for the redesign rationale. | `N/A` |
|
|
165
167
|
| `model.chatCompression.maxRecentFilesToRetain` | number | Number of most-recently-touched files whose current content is restored (embedded if small, otherwise referenced by path) into history after auto-compaction. `0` restores none. Env override: `QWEN_COMPACT_MAX_RECENT_FILES`. | `5` |
|
|
@@ -496,12 +498,13 @@ LSP server configuration is done through `.lsp.json` files in your project root
|
|
|
496
498
|
>
|
|
497
499
|
> **Experimental features.** These toggles gate in-development capabilities and may change or be removed in future releases.
|
|
498
500
|
|
|
499
|
-
| Setting
|
|
500
|
-
|
|
|
501
|
-
| `experimental.cron`
|
|
502
|
-
| `experimental.
|
|
503
|
-
| `experimental.
|
|
504
|
-
| `experimental.
|
|
501
|
+
| Setting | Type | Description | Default |
|
|
502
|
+
| -------------------------------------- | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------- |
|
|
503
|
+
| `experimental.cron` | boolean | Enable in-session cron/loop tools (`cron_create`, `cron_list`, `cron_delete`) so the model can create recurring prompts. Can be disabled via the `QWEN_CODE_DISABLE_CRON=1` environment variable. Requires restart. | `true` |
|
|
504
|
+
| `experimental.cronRecurringMaxAgeDays` | number | Days a recurring cron/loop job lives before auto-expiring (it fires one final time, then is deleted). Set to `0` to disable expiry so jobs run until deleted — useful for long-running daemon deployments. Can be overridden via the `QWEN_CODE_CRON_MAX_AGE_DAYS` environment variable. Requires restart. | `7` |
|
|
505
|
+
| `experimental.agentTeam` | boolean | Enable agent-team collaboration tools (`team_create`, `task_create`, `task_update`, `send_message`, etc.) for multi-agent coordination. Can also be enabled via `QWEN_CODE_ENABLE_AGENT_TEAM=1`. Requires restart. | `false` |
|
|
506
|
+
| `experimental.artifact` | boolean | Enable the Artifact tool, letting the model publish a self-contained HTML page and open it in the browser. Interactive, non-SDK sessions only. `QWEN_CODE_ENABLE_ARTIFACT=1` enables metadata-only `record_artifact` for non-SDK daemon sessions and also enables the Artifact tool in interactive sessions; `QWEN_CODE_DISABLE_ARTIFACT=1` disables both. Requires restart. | `false` |
|
|
507
|
+
| `experimental.emitToolUseSummaries` | boolean | Generate a short LLM-based label after each tool-call batch completes. See [Tool-Use Summaries](../features/tool-use-summaries). Requires a fast model to be configured (`fastModel`); silently skipped otherwise. Can be overridden per-session with `QWEN_CODE_EMIT_TOOL_USE_SUMMARIES=0` or `=1`. | `true` |
|
|
505
508
|
|
|
506
509
|
#### mcpServers
|
|
507
510
|
|
|
@@ -680,9 +683,7 @@ For sandbox image selection, precedence is:
|
|
|
680
683
|
| `--sandbox` | `-s` | Enables sandbox mode for this session. | | |
|
|
681
684
|
| `--sandbox-image` | | Sets the sandbox image URI. | | |
|
|
682
685
|
| `--debug` | `-d` | Enables debug mode for this session, providing more verbose output. | | |
|
|
683
|
-
| `--all-files` | `-a` | If set, recursively includes all files within the current directory as context for the prompt. | | |
|
|
684
686
|
| `--help` | `-h` | Displays help information about command-line arguments. | | |
|
|
685
|
-
| `--show-memory-usage` | | Displays the current memory usage. | | |
|
|
686
687
|
| `--yolo` | | Enables YOLO mode, which automatically approves all tool calls. | | |
|
|
687
688
|
| `--approval-mode` | | Sets the approval mode for tool calls. | `plan`, `default`, `auto-edit`, `auto`, `yolo` | Supported modes: `plan`: Analyze only—do not modify files or execute commands. `default`: Require approval for file edits or shell commands (default behavior). `auto-edit`: Automatically approve edit tools (`edit`, `write_file`, `notebook_edit`) while prompting for others. `auto`: LLM classifier auto-approves safe actions and blocks risky ones. `yolo`: Automatically approve all tool calls (equivalent to `--yolo`). Cannot be used together with `--yolo`. Use `--approval-mode=yolo` instead of `--yolo` for the new unified approach. Example: `qwen --approval-mode auto-edit`<br>See more about [Approval Mode](../features/approval-mode). |
|
|
688
689
|
| `--allowed-tools` | | A comma-separated list of tool names that will bypass the confirmation dialog. | Tool names | Example: `qwen --allowed-tools "Shell(git status)"` |
|
|
@@ -233,10 +233,10 @@ Key command-line options for headless usage:
|
|
|
233
233
|
| `--append-system-prompt` | Append extra instructions to the main session system prompt for this run | `qwen -p "query" --append-system-prompt "Focus on concrete findings."` |
|
|
234
234
|
| `--debug`, `-d` | Enable debug mode | `qwen -p "query" --debug` |
|
|
235
235
|
| `--safe-mode` | Disable all customizations — context files, hooks, extensions, skills, MCP servers, custom subagents (only built-in subagents load), permission rules, settings-sourced approval mode overrides, memory features, and sandbox settings — to isolate problems; the CLI flags `--yolo` and `--approval-mode` still take effect. See [Troubleshooting](../support/troubleshooting). Also settable via `QWEN_CODE_SAFE_MODE=true`. | `qwen -p "query" --safe-mode` |
|
|
236
|
-
| `--
|
|
236
|
+
| `--model`, `-m` | Model to use for this run | `qwen -p "query" --model qwen3-coder-plus` |
|
|
237
237
|
| `--include-directories` | Include additional directories | `qwen -p "query" --include-directories src,docs` |
|
|
238
238
|
| `--yolo`, `-y` | Auto-approve all actions | `qwen -p "query" --yolo` |
|
|
239
|
-
| `--approval-mode` | Set approval mode
|
|
239
|
+
| `--approval-mode` | Set approval mode (`plan`, `default`, `auto-edit`, `auto`, `yolo`) | `qwen -p "query" --approval-mode auto-edit` |
|
|
240
240
|
| `--continue` | Resume the most recent session for this project | `qwen --continue -p "Pick up where we left off"` |
|
|
241
241
|
| `--resume [sessionId]` | Resume a specific session (or choose interactively) | `qwen --resume 123e... -p "Finish the refactor"` |
|
|
242
242
|
| `--max-session-turns` | Cap the number of user/model/tool turns in the run | `qwen -p "..." --max-session-turns 30` |
|
|
@@ -117,9 +117,11 @@ To avoid every session hitting the API at the same wall-clock moment, the schedu
|
|
|
117
117
|
|
|
118
118
|
The offset is derived from the task ID, so the same task always gets the same offset. If exact timing matters, pick a minute that is not `:00` or `:30`, for example `3 9 * * *` instead of `0 9 * * *`, and the one-shot jitter will not apply.
|
|
119
119
|
|
|
120
|
-
###
|
|
120
|
+
### Recurring-task expiry
|
|
121
121
|
|
|
122
|
-
Recurring tasks automatically expire
|
|
122
|
+
Recurring tasks automatically expire 7 days after creation by default. The task fires one final time, then deletes itself. This bounds how long a forgotten loop can run.
|
|
123
|
+
|
|
124
|
+
To change the limit, set `experimental.cronRecurringMaxAgeDays` in your [settings](../configuration/settings.md), or set the `QWEN_CODE_CRON_MAX_AGE_DAYS` environment variable (the environment variable wins — convenient for cloud or container deployments where editing `settings.json` is impractical). A value of `0` disables expiry entirely, so tasks run until you delete them — useful for long-running daemon deployments that host daily reports, digests, or ongoing monitoring. The configured limit also applies to durable tasks restored from disk after a restart.
|
|
123
125
|
|
|
124
126
|
One-shot tasks do not expire on a timer — they simply delete themselves after firing once.
|
|
125
127
|
|
|
@@ -47,7 +47,7 @@ This document lists the available keyboard shortcuts in Qwen Code.
|
|
|
47
47
|
| `Ctrl+U` | Delete from the cursor to the beginning of the line. |
|
|
48
48
|
| `Ctrl+V` (Windows: `Alt+V`) | Paste clipboard content. If the clipboard contains an image, it will be saved and a reference to it will be inserted in the prompt. |
|
|
49
49
|
| `Ctrl+W` / `Meta+Backspace` / `Ctrl+Backspace` | Delete the word to the left of the cursor. |
|
|
50
|
-
| `Ctrl+X`
|
|
50
|
+
| `Ctrl+X` | Open the current input in an external editor. |
|
|
51
51
|
|
|
52
52
|
## Suggestions
|
|
53
53
|
|