feat(skills): add disabled skill levels - #8057
Conversation
|
@qwen-code /takeover |
|
Thanks for the PR! Template looks good ✓ Problem: real and well-defined. The linked issue #8054 was triaged and accepted (P2, Direction: aligned. Claude Code already ships a Size: core paths touched ( Approach: the scope feels right, and it grew in the right direction since the first pass — the daemon's workspace-skills-status path now honors the setting too (with the same safe-mode / untrusted-workspace guard as the CLI), so a headless host gets consistent behavior across the CLI child session and the daemon skill listing. No unrelated changes, no drive-by refactors. Risk: no elevated risk signals — none of the changed files match the high-revert-correlation paths. Moving on to code review. 🔍 中文说明感谢贡献! 模板完整 ✓ 问题:真实且定义清晰。关联 issue #8054 已被分类并接受(P2、 方向:对齐。Claude Code 已发布 规模:触及核心路径( 方案:范围合理,且自首轮以来朝正确方向扩展——daemon 的 workspace-skills-status 路径现在也尊重该设置(与 CLI 相同的 safe-mode / 不可信工作区守卫),使 headless 宿主在 CLI 子会话与 daemon skill 列表间获得一致行为。无无关改动,无顺手重构。 风险:无升级风险信号——变更文件均未匹配高回滚关联路径。 进入代码审查 🔍 — Qwen Code · qwen3.8-max-preview Reviewed at |
Code ReviewClean, minimal, and it follows the existing patterns exactly. My independent proposal before reading the diff — store disabled levels as a frozen The core is a five-line guard in The wiring mirrors the neighboring conventions: The growth since the first review is the right kind: the daemon's No critical blockers. No convention violations. Testing
All green on the reviewed commit The behavioural claim — 中文说明代码审查干净、精简,且完全遵循现有模式。我在阅读 diff 前的独立提案——将禁用的 level 存储为 核心是 接线方式与相邻约定一致: 自首轮评审以来的扩展属于正确的方向:daemon 的 无关键阻塞项。无约定违规。 测试审查提交 行为性声明—— — Qwen Code · qwen3.8-max-preview Reviewed at |
|
Confidence: 5/5 — clean across every stage; CI green on the reviewed commit; would merge without hesitation. This is what a well-scoped feature PR looks like, and it improved at each round. The problem was validated through #8054 (P2, My independent proposal matched the author's exactly, including the safe-mode / untrusted-workspace guard and the optional-chaining tolerance for partial config shims. The behavioural claim is now pinned at the integration level — a real-wiring daemon test, green Approving now, pinned to 中文说明置信度:5/5 —— 每个阶段都干净;审查提交上 CI 绿灯;毫不犹豫地合入。 这是一个范围良好的功能 PR 的典范,并且每一轮都在改进。问题已通过 #8054 验证(P2、 我的独立提案与作者完全一致,包括 safe-mode / 不可信工作区守卫,以及对部分 config shim 的可选链容忍。行为性声明现已在集成层面固定——真实接线的 daemon 测试、绿色的 现在批准,固定于 — Qwen Code · qwen3.8-max-preview Reviewed at |
doudouOUC
left a comment
There was a problem hiding this comment.
中文说明
— qwen3.7-max via Qwen Code /review
|
🤝 Takeover engaged: the autofix loop now manages this PR — it will address new review feedback and resolve base conflicts until the label is removed or the round cap is reached. Remove the 中文说明🤝 已接管:autofix 循环现在管理此 PR —— 将持续处理新的评审反馈与 base 冲突,直到移除标签或达到轮次上限。移除 |
|
🔀 Base updated: red check(s) [Test (ubuntu-latest, Node 22.x), review-pr] pass on current main — merged current main via update-branch; CI will re-run. 中文说明🔀 已更新 base:红色检查 [Test (ubuntu-latest, Node 22.x), review-pr] 在当前 main 上通过 —— 已通过 update-branch 合入当前 main,CI 将重新运行。 |
qwen-code-ci-bot
left a comment
There was a problem hiding this comment.
Reviewed. Suggestions are inline. Not reviewed: build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite did not run locally.
中文说明
已审查。 建议见行内评论。 未审查:build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite did not run locally。
— qwen3.8-max-preview via Qwen Code /review
qwen-code-ci-bot
left a comment
There was a problem hiding this comment.
Reviewed. Suggestions are inline.
中文说明
已审查。 建议见行内评论。
— qwen3.8-max-preview via Qwen Code /review
|
🤖 Reviewed the latest feedback — no changes needed. Why, point by point: · 已审阅最新反馈——无需改动。逐点说明原因如下: Review round — no code changesTwo automated suggestions were triaged; both are declined with reasons below. The CI failure is pre-existing on rc:3676454844 — warn on invalid
|
doudouOUC
left a comment
There was a problem hiding this comment.
中文说明
— qwen3.7-max via Qwen Code /review
|
🤖 Reviewed the latest feedback — no changes needed. Why, point by point: · 已审阅最新反馈——无需改动。逐点说明原因如下: Review Round Summary — No Action TakenFeedback: The automated reviewer downgraded from Approve to Comment because the CI check "Test (ubuntu-latest, Node 22.x)" is failing. Diagnosis: The CI failure is pre-existing on
All 8 failures are in sandbox image resolution and user-level skill directory tests — areas this PR does not touch. This PR's tests all pass:
No code changes were made this round. The CI failure should resolve once the pre-existing test failures on Verification
中文说明审查轮次总结 — 未采取行动反馈: 自动审查器因 CI 检查 "Test (ubuntu-latest, Node 22.x)" 失败,将评审从"批准"降级为"评论"。 诊断: CI 失败是
所有 8 个失败都在沙箱镜像解析和用户级技能目录测试中——这些是本 PR 未涉及的领域。 本 PR 新增的测试全部通过:
本轮未做任何代码更改。 CI 失败应在 验证
Base-conflict check · 基分支冲突检查: no conflict with main. · 与 main 无冲突。 🧠 Handled by Qwen Code · model/模型 |
|
🔀 Base updated: red check(s) [Test (ubuntu-latest, Node 22.x)] pass on current main — merged current main via update-branch; CI will re-run. 中文说明🔀 已更新 base:红色检查 [Test (ubuntu-latest, Node 22.x)] 在当前 main 上通过 —— 已通过 update-branch 合入当前 main,CI 将重新运行。 |
qwen-code-ci-bot
left a comment
There was a problem hiding this comment.
Reviewed. Not reviewed: build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite did not run locally.
— qwen3.8-max-preview via Qwen Code /review
doudouOUC
left a comment
There was a problem hiding this comment.
中文说明
— qwen3.7-max via Qwen Code /review
|
🤖 Reviewed the latest feedback — no changes needed. Why, point by point: · 已审阅最新反馈——无需改动。逐点说明原因如下: No code changes this roundThe new feedback contains no inline comments and no requested code change — only two informational review notes and a failed-check signal ( Triage of the feedback
Investigation of the
|
|
🔀 Base updated: red check(s) [Test (ubuntu-latest, Node 22.x)] pass on current main — merged current main via update-branch; CI will re-run. 中文说明🔀 已更新 base:红色检查 [Test (ubuntu-latest, Node 22.x)] 在当前 main 上通过 —— 已通过 update-branch 合入当前 main,CI 将重新运行。 |
|
🤖 Reviewed the latest feedback — no changes needed. Why, point by point: · 已审阅最新反馈——无需改动。逐点说明原因如下: Autofix review round — no action takenThe only feedback this round is an informational No code changes are warranted. 中文说明Autofix 审查轮次 — 未采取任何操作本轮唯一的反馈是自动审查机器人的一条信息性 无需进行代码更改。 Base-conflict check · 基分支冲突检查: no conflict with main. · 与 main 无冲突。 🧠 Handled by Qwen Code · model/模型 |
qwen-code-ci-bot
left a comment
There was a problem hiding this comment.
Reviewed. Not reviewed: build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite did not run locally.
中文说明
已审查。 未审查:build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite did not run locally。
— qwen3.8-max-preview via Qwen Code /review
|
🤖 Reviewed the latest feedback — no changes needed. Why, point by point: · 已审阅最新反馈——无需改动。逐点说明原因如下: Autofix review round — no action takenThe only feedback newer than the last evaluation is a single
This is a disclosure of the reviewer's own coverage scope, not a finding. It No code change is warranted:
No commits were made this round. 中文说明Autofix 审查轮次 — 未采取任何行动距上次评估之后唯一的反馈,是自动审查机器人发出的一条
这是审查者对自身审查覆盖范围的说明,并非一项审查发现。它没有指出任何缺陷, 无需进行代码改动:
本轮未产生任何提交。 Base-conflict check · 基分支冲突检查: no conflict with main. · 与 main 无冲突。 🧠 Handled by Qwen Code · model/模型 |
qwen-code-ci-bot
left a comment
There was a problem hiding this comment.
Reviewed. Suggestions are inline. Not reviewed: build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite did not run locally.
— qwen3.8-max-preview via Qwen Code /review
|
🤖 Addressed the latest review feedback (round 5/100). What changed, and what I pushed back on: · 已处理最新评审反馈(第 5/100 轮)。改动内容与我反驳保留之处如下: Review feedback addressed[rc:3688030999] Suggestion: add regression test for
|
qwen-code-ci-bot
left a comment
There was a problem hiding this comment.
Reviewed. Not reviewed: build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite did not run locally.
中文说明
已审查。 未审查:build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite did not run locally。
— qwen3.8-max-preview via Qwen Code /review
|
🤖 Reviewed the latest feedback — no changes needed. Why, point by point: · 已审阅最新反馈——无需改动。逐点说明原因如下: Autofix review round — no action neededNo actionable feedback was found in this round:
The only feedback present is in the Deferred non-Critical feedback section (automated reviewer suggestions deferred under Critical-only mode after 5 change-producing rounds). Per the review policy, these items are an audit record — no code changes, thread resolutions, or comment replies are made on their behalf. They remain open for human follow-up. 中文说明Autofix 评审轮次 — 无需操作本轮未发现需要处理的反馈:
唯一存在的反馈位于延后的非 Critical 反馈部分(在 5 个产生改动的轮次后,自动评审的建议按仅处理 Critical 模式被延后)。根据评审策略,这些条目属于审计记录——不会代其修改代码、解决线程或回复评论。它们保持开放,留待人工跟进。 Deferred non-Critical feedbackCritical-only mode is active after 5 change-producing rounds: the automated reviewer's non-Critical suggestions below are deferred and stay open for human follow-up — do not modify code, resolve threads, or reply on their behalf. Maintainer feedback defers only once its author has already had 2 regular feedback batches addressed in this window's Critical-only tail — an account can host an automated reviewer loop, so the brake keys on measured regeneration, not identity; authors at their budget, if any, are named below. (A maintainer can lift the mode itself: 中文说明完成 5 个产生改动的轮次后进入仅处理 Critical 的模式:以上为自动评审的非 Critical 建议,予以延后、保持开放并留待人工跟进——不要为其修改代码、解决线程或代为回复。维护者的反馈仅在其本人于本窗口 Critical-only 阶段已被处理 2 批常规反馈之后才会被延后——账号可能挂着自动评审循环,因此刹车依据实测的再生频度而非身份;达到预算的作者(如有)在下方点名。(如需解除该模式,评论 Base-conflict check · 基分支冲突检查: no conflict with main. · 与 main 无冲突。 🧠 Handled by Qwen Code · model/模型 |
|
@qwen-code /verify |
|
Sandboxed verification: ✅ passed — merge-ready (agent verdict) - workflow run Ran the PR in an isolated, token-free container: A/B against the base build, mock-free harness assertions, targeted gates. Advisory evidence for human reviewers — not a review, an approval, or a CI check. Scripted assertions: 30 passed · 0 failed · 30 total 中文 — 判定:✅ 通过 · 可合入(agent 判定)沙箱验证在隔离、无凭证的容器中执行了该 PR 的代码(与 base 构建 A/B 对照、无 mock harness 断言、定向门禁)。仅作为评审证据,不构成评审、批准或 CI 检查。 脚本断言:30 通过 · 0 失败 · 30 总计 Verification report (report.md)Evidence imagesHarness scripts and raw logs are in the workflow run artifacts (7-day retention). — Qwen Code · sandboxed verification |
|
🤖 Reviewed the latest feedback — no changes needed. Why, point by point: · 已审阅最新反馈——无需改动。逐点说明原因如下: No actionable feedback this round.
The PR is in Critical-only mode after 5 change-producing rounds. The single deferred item (automated reviewer non-Critical suggestion) is an audit record and stays open for human follow-up — no code changes, thread resolutions, or replies are warranted. 中文说明本轮没有可操作的反馈。
该 PR 在经历 5 个产生改动的轮次后已进入仅处理 Critical 的模式。唯一的延后条目(自动评审的非 Critical 建议)属于审计记录,保持开放并留待人工跟进——无需修改代码、解决线程或进行回复。 Deferred non-Critical feedbackCritical-only mode is active after 5 change-producing rounds: the automated reviewer's non-Critical suggestions below are deferred and stay open for human follow-up — do not modify code, resolve threads, or reply on their behalf. Maintainer feedback defers only once its author has already had 2 regular feedback batches addressed in this window's Critical-only tail — an account can host an automated reviewer loop, so the brake keys on measured regeneration, not identity; authors at their budget, if any, are named below. (A maintainer can lift the mode itself: 中文说明完成 5 个产生改动的轮次后进入仅处理 Critical 的模式:以上为自动评审的非 Critical 建议,予以延后、保持开放并留待人工跟进——不要为其修改代码、解决线程或代为回复。维护者的反馈仅在其本人于本窗口 Critical-only 阶段已被处理 2 批常规反馈之后才会被延后——账号可能挂着自动评审循环,因此刹车依据实测的再生频度而非身份;达到预算的作者(如有)在下方点名。(如需解除该模式,评论 Base-conflict check · 基分支冲突检查: no conflict with main. · 与 main 无冲突。 🧠 Handled by Qwen Code · model/模型 |
|
Addressed the S1 test-completeness suggestion in The partial- Validation:
The latest |
qwen-code-ci-bot
left a comment
There was a problem hiding this comment.
Reviewed. Not reviewed: build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite did not run locally.
— qwen3.8-max-preview via Qwen Code /review
Local verification report (round 2) — real CLI build + E2ERe-verification of head Verdict: merge-ready. The blocker is fixed, and I confirmed the fix is load-bearing by mutating it back out. The feature itself behaves exactly as specified across every level, scope, and mode I could drive. One non-blocking observation is recorded at the end. Built from source on Linux: full 1. The round-1 blocker is fixed — and pinnedThe regression I reported was: Driving a real
D1 is the regression check — non-zero, correct. D2 shows the daemon now honors the setting (the round-2 shim wiring). D3 shows it matches the CLI child in safe mode (the round-3 guard). To confirm none of that is accidental, I mutated each fix back out of the built bundle, one line at a time, re-auditing the deployed chunk before and after every arm:
All three fixes are load-bearing. M2 in particular reproduces the original failure mode byte for byte, so the 2. The feature works, across every level and scopeSurface measured is the model-facing Every claim in the PR body holds:
S3 also confirms the new doc note: 3. The user-facing surfaces
And the slash-command surface, which is the thing an embedder actually wants gone: 4. "Before accessing the filesystem" — verified at the syscall levelThe PR body claims discovery skips disabled levels before touching disk. The PR's unit test asserts this against a mocked
Not a filtered listing — the directory is never opened. 5. Suites and merge state
On the collection failure @zhangxy-zju hit on latest 6. Non-blocking observation — untrusted workspacesNot a merge blocker; recording it so it is not lost. The daemon shim drops
The root cause is the pre-existing Two smaller notes, both correct-as-designed:
LGTM. Feature verified end to end on the real CLI, the real daemon, and the real TUI; the round-1 blocker is fixed and mutation-pinned. 中文版本地验证报告(第 2 轮)—— 真实 CLI 构建 + E2E针对 5 轮 autofix 之后的 head 结论:可以合入。 阻断问题已修复,我通过把修复逐行改回去(mutation)确认了这些修复确实起作用。功能本身在我能驱动的所有层级、作用域和模式下都完全符合规格说明。文末记录一条非阻断性的观察。 在 Linux 上从源码构建:完整 1. 第 1 轮的阻断问题已修复,并已被钉死我当时报告的回归是: 在当前 head 上驱动真实的
D1 就是回归检查——非零、正确。D2 说明 daemon 现在会遵守该配置(第 2 轮的 shim 接线)。D3 说明它在 safe mode 下与 CLI 子进程一致(第 3 轮的守卫)。 为确认这些都不是巧合,我把每处修复逐行从构建产物里改回去,每一组实验前后都重新审计部署的 chunk:
三处修复都是有效负载。尤其 M2 精确复现了原始故障形态,所以那个 2. 功能在所有层级和作用域上都正确测量面是从 mock OpenAI 兼容服务端在网络层抓到的、面向模型的 PR 描述中的每一项主张都成立:
S3 同时印证了新增的文档说明: 3. 用户可见的两个界面真实 TUI 的 以及斜杠命令界面,这正是宿主方真正希望屏蔽掉的东西: 4. "在访问文件系统之前" —— 在系统调用层面得到验证PR 描述声称发现流程会在接触磁盘之前跳过被禁用的层级。PR 自带的单测是基于 mock 的
不是"列出来再过滤",而是那个目录根本没有被打开。 5. 测试套件与合入状态
关于 @zhangxy-zju 在最新 6. 非阻断性观察 —— 未受信任的 workspace不构成合入阻断,记录下来以免遗失。 daemon 的 shim 在
根因是 shim 中既有的 另有两条较小的说明,都属于"设计如此":
LGTM。 功能在真实 CLI、真实 daemon 和真实 TUI 上端到端验证通过;第 1 轮的阻断问题已修复,并已用 mutation 钉死。 |
|
🤖 Reviewed the latest feedback — no changes needed. Why, point by point: · 已审阅最新反馈——无需改动。逐点说明原因如下: No action required this roundThe feedback since the last evaluation contains no actionable items:
No code changes were made. 中文说明本轮无需操作自上次评估以来的反馈中不包含任何需要处理的事项:
未做任何代码变更。 Deferred non-Critical feedbackCritical-only mode is active after 5 change-producing rounds: the automated reviewer's non-Critical suggestions below are deferred and stay open for human follow-up — do not modify code, resolve threads, or reply on their behalf. Maintainer feedback defers only once its author has already had 2 regular feedback batches addressed in this window's Critical-only tail — an account can host an automated reviewer loop, so the brake keys on measured regeneration, not identity; authors at their budget, if any, are named below. (A maintainer can lift the mode itself: 中文说明完成 5 个产生改动的轮次后进入仅处理 Critical 的模式:以上为自动评审的非 Critical 建议,予以延后、保持开放并留待人工跟进——不要为其修改代码、解决线程或代为回复。维护者的反馈仅在其本人于本窗口 Critical-only 阶段已被处理 2 批常规反馈之后才会被延后——账号可能挂着自动评审循环,因此刹车依据实测的再生频度而非身份;达到预算的作者(如有)在下方点名。(如需解除该模式,评论 Base-conflict check · 基分支冲突检查: no conflict with main. · 与 main 无冲突。 🧠 Handled by Qwen Code · model/模型 |
|
@qwen-code /triage |
|
Sandboxed verification: ✅ passed — merge-ready (agent verdict) - workflow run Ran the PR in an isolated, token-free container: A/B against the base build, mock-free harness assertions, targeted gates. Advisory evidence for human reviewers — not a review, an approval, or a CI check. Scripted assertions: 36 passed · 0 failed · 36 total 中文 — 判定:✅ 通过 · 可合入(agent 判定)沙箱验证在隔离、无凭证的容器中执行了该 PR 的代码(与 base 构建 A/B 对照、无 mock harness 断言、定向门禁)。仅作为评审证据,不构成评审、批准或 CI 检查。 脚本断言:36 通过 · 0 失败 · 36 总计 Verification report (report.md)Evidence imagesHarness scripts and raw logs are in the workflow run artifacts (7-day retention). — Qwen Code · sandboxed verification |
qwen-code-ci-bot
left a comment
There was a problem hiding this comment.
LGTM, looks ready to ship. ✅
|
Released in v0.21.3. |











What this PR does
Adds
skills.disabledLevels, a union-merged setting that acceptsproject,user,extension, andbundled. Skill discovery now skips disabled levels before accessing the filesystem, so users can set["bundled"]to hide all bundled skills while retaining host-provided skills. The change also updates the generated settings schema, documentation, and focused tests.Why it's needed
Hosts that provide their own skills currently cannot disable every bundled skill with one setting. This adds the level-based control preferred in #8054 while preserving the existing default behavior.
Reviewer Test Plan
How to verify
"skills": { "disabledLevels": ["bundled"] }to.qwen/settings.jsonand restart Qwen Code.simplifyare absent.disabledLevels, restart, and confirm bundled skills return.npm run buildnpm run typecheckcd packages/core && npx vitest run src/skills/skill-manager.test.tscd packages/cli && npx vitest run src/config/config.test.ts --environment nodecd packages/cli && npx vitest run src/config/settingsSchema.test.ts --environment nodeEvidence (Before & After)
Before: the released CLI listed 37 skills, including bundled
reviewandsimplify.After: the branch CLI with
disabledLevels: ["bundled"]listed 30 skills;simplifyreturned no matches, while the project-providedfeat-devskill remained available.Tested on
Environment (optional)
Local source build and CLI execution on macOS.
Risk & Scope
Linked Issues
Closes #8054
中文说明
本 PR 做了什么
新增
skills.disabledLevels配置,以 union 方式合并各配置作用域,并接受project、user、extension和bundled。Skill 发现流程现在会在访问文件系统前跳过被禁用的层级,因此用户可以设置["bundled"]隐藏所有内置 skill,同时保留宿主提供的 skill。本次变更也更新了生成的设置 schema、文档和针对性测试。为什么需要
提供自有 skill 的宿主目前无法通过单个配置禁用全部内置 skill。本变更按照 #8054 中倾向的层级控制方案实现,同时保持现有默认行为不变。
Reviewer 测试计划
如何验证
.qwen/settings.json中加入"skills": { "disabledLevels": ["bundled"] },然后重启 Qwen Code。simplify等内置 skill 不再出现。disabledLevels,重启后确认内置 skill 恢复。npm run buildnpm run typecheckcd packages/core && npx vitest run src/skills/skill-manager.test.tscd packages/cli && npx vitest run src/config/config.test.ts --environment nodecd packages/cli && npx vitest run src/config/settingsSchema.test.ts --environment node证据(前后对比)
变更前:已发布 CLI 列出 37 个 skill,其中包含内置的
review和simplify。变更后:分支 CLI 配置
disabledLevels: ["bundled"]后列出 30 个 skill;搜索simplify无匹配,同时项目提供的feat-devskill 仍然可用。测试平台
环境(可选)
在 macOS 上完成本地源码构建和 CLI 执行。
风险与范围
关联 Issue
Closes #8054