Skip to content

feat(core): support Qoder plugin extensions - #8661

Merged
wenshao merged 8 commits into
mainfrom
codex/feat-qoder-extension-install
Aug 8, 2026
Merged

feat(core): support Qoder plugin extensions#8661
wenshao merged 8 commits into
mainfrom
codex/feat-qoder-extension-install

Conversation

@callmeYe

@callmeYe callmeYe commented Aug 7, 2026

Copy link
Copy Markdown
Collaborator

What this PR does

This PR adds native installation compatibility for Qoder plugins across local directories, archives, Git repositories, archive URLs, and scoped npm packages. The compatibility layer converts public plugin metadata, standard commands, agents, skills, and MCP servers into a Qwen extension while preserving ordinary resources.

A root system-prompt.md is automatically loaded as extension context. It is merged and deduplicated with explicitly configured context, and it loads alongside the default QWEN.md when present. Disabling the extension continues to exclude all of its context through the existing extension enablement gate.

The conversion rejects manifests, context paths, resources, and symlinks that escape the plugin root, removes Git metadata from installed content, and records the checked-out revision needed for Git update checks. The Qoder origin is also represented consistently in Core, daemon SDK, and ACP status payloads.

Why it's needed

Qoder plugins use a public manifest and resource layout that is close to the existing compatible plugin formats but is not currently recognized by the Qwen extension installer. Supporting that layout lets users install the same plugin through the existing extension workflows without repackaging it or manually creating a Qwen manifest.

Reviewer Test Plan

How to verify

  1. Create a synthetic plugin named sample-qoder-plugin with public metadata, standard resource directories, a root MCP configuration, QWEN.md, and system-prompt.md; install it from a directory and confirm the generated extension exposes the metadata, resources, MCP server, and both context files.
  2. Package the same synthetic plugin inside one top-level archive directory and confirm archive validation flattens and installs it successfully.
  3. Exercise Git, archive URL, and scoped npm installation paths with the synthetic plugin and confirm each records Qoder as its origin.
  4. Change the synthetic source version and confirm update detection, then uninstall it and confirm the installed extension is removed.
  5. Replace the manifest, a context file, or a resource with an escaping symlink and confirm conversion rejects or skips the unsafe input without copying outside content.

Evidence (Before & After)

N/A — this is an installer compatibility, type, and documentation change with no UI layout change.

Tested on

OS Status
🍏 macOS
🪟 Windows N/A
🐧 Linux N/A

Environment (optional)

Node.js 22, no sandbox. Focused converter, installer, archive, update, and shared compatibility unit tests passed; the focused CLI installation integration test, lint, type checking, build, and bundle also passed.

Risk & Scope

  • Main risk or tradeoff: Third-party manifests can contain malformed values or unsafe paths; conversion validates the manifest boundary and reuses the existing confined resource-copying behavior.
  • Not validated / out of scope: Live third-party Git hosts and npm registries were not contacted end to end; those source download paths are covered with synthetic installer tests, while local directory and archive behavior are covered through the bundled CLI.
  • Breaking changes / migration notes: None. Existing Qwen, Gemini, and Claude extension behavior remains unchanged.

Linked Issues

N/A

中文说明

本 PR 做了什么

本 PR 为 Qoder 插件补充原生安装兼容,覆盖本地目录、归档、Git 仓库、归档 URL 和 scoped npm 包。兼容层会把公开插件元数据、标准 commands、agents、skills 和 MCP servers 转换为 Qwen Extension,同时保留普通资源。

根目录的 system-prompt.md 会自动作为 Extension context 加载。它会与显式配置的 context 合并并去重;存在默认 QWEN.md 时,两者会同时加载。禁用 Extension 后,仍通过现有 Extension 启用开关排除该 Extension 的全部 context。

转换会拒绝逃逸插件根目录的 manifest、context 路径、资源和 symlink,从安装内容中移除 Git 元数据,并记录 Git 更新检查所需的检出版本。Core、Daemon SDK 和 ACP 状态数据也统一支持 Qoder 来源。

为什么需要

Qoder 插件使用公开的 manifest 和资源布局,与现有兼容插件格式接近,但目前无法被 Qwen Extension 安装器识别。支持该布局后,用户可以直接复用现有 Extension 安装流程,无需重新打包或手工创建 Qwen manifest。

Reviewer 测试计划

如何验证

  1. 创建名为 sample-qoder-plugin 的合成插件,包含公开元数据、标准资源目录、根 MCP 配置、QWEN.mdsystem-prompt.md;从目录安装后,确认生成的 Extension 暴露对应元数据、资源、MCP server 和两个 context 文件。
  2. 将同一合成插件放入单一顶层归档目录,确认归档校验能够展平并成功安装。
  3. 使用该合成插件覆盖 Git、归档 URL 和 scoped npm 安装路径,确认各路径都记录 Qoder 来源。
  4. 修改合成源版本并确认更新检测,再卸载并确认已安装 Extension 被移除。
  5. 将 manifest、context 文件或资源替换为逃逸 symlink,确认转换会拒绝或跳过不安全输入,并且不会复制外部内容。

证据(Before & After)

N/A —— 这是安装兼容、类型和文档变更,不涉及 UI 布局变化。

测试平台

OS 状态
🍏 macOS
🪟 Windows N/A
🐧 Linux N/A

环境(可选)

Node.js 22,无 sandbox。聚焦的转换器、安装器、归档、更新和共享兼容单测均通过;聚焦 CLI 安装集成测试、lint、类型检查、build 和 bundle 也均通过。

风险与范围

  • 主要风险或权衡:第三方 manifest 可能包含格式错误的值或不安全路径;转换会校验 manifest 边界,并复用现有的受限资源复制行为。
  • 未验证或不在范围内:未端到端访问真实第三方 Git host 和 npm registry;这些来源下载路径通过合成安装器测试覆盖,本地目录和归档行为则通过打包后的 CLI 覆盖。
  • 破坏性变更或迁移说明:无。现有 Qwen、Gemini 和 Claude Extension 行为保持不变。

关联 Issue

N/A

@qwen-code-ci-bot

qwen-code-ci-bot commented Aug 7, 2026

Copy link
Copy Markdown
Collaborator

Qwen Triage finishedview run. See the stage comments in this thread for the result.

Qwen Triage 已完成 —— 查看运行。结果见本线程中的各阶段评论。

@callmeYe

callmeYe commented Aug 7, 2026

Copy link
Copy Markdown
Collaborator Author

E2E Test Report

  • Environment: macOS, Node.js 22, no sandbox.
  • Fixture: fully synthetic sample-qoder-plugin generated in the test temporary directory.
  • Verified: local installation through the bundled CLI, extension discovery in the installed list, automatic system-prompt.md context conversion, synthetic skill discovery, and uninstall cleanup.
  • Result: passed.

@qwen-code-ci-bot

qwen-code-ci-bot commented Aug 7, 2026

Copy link
Copy Markdown
Collaborator

Re-run on the post-review head — gate re-checked, still passing.

Template looks good ✓

Problem: unchanged from the first pass — this is a feature, not a bug fix, so there is no reproduction to ask for. There is still no linked user request, which I would normally flag, but plugin-format compatibility is an established, documented capability of this repo (Gemini extensions and Claude plugins install through the same converter pipeline, and the user docs advertise that compatibility), so "Qoder plugins are not recognized by the installer" is a concrete gap in an existing capability rather than a speculative addition.

Direction: aligned. The CHANGELOG has no Qoder mention yet, but it carries multiple entries maintaining the Claude/Gemini plugin compatibility surface, so extending that surface to a third format follows where the product already invests.

Size: core paths touched (packages/core/src/extension/**, packages/core/src/config/config.ts, plus additive union members in acp-bridge and sdk-typescript). 471 production lines vs 1243 test lines vs 37 docs lines — the fix rounds since the first pass added mostly tests; production stays below the 500-line maintainer-awareness threshold for a feat PR.

Approach: the scope still feels right, and the seven fix commits since the first pass went into exactly the places a careful review would have pointed at: the update-check lifecycle (recorded commits, nested marketplace provenance, annotated tags), context-file merging and dedupe, MCP validation, and error-message sanitization. The increments map one-to-one onto review feedback — no drive-by growth.

Risk: no elevated risk signals — none of the changed files match the revert-correlated paths from this repo's history.

Moving on to code review. 🔍

中文说明

在评审修复后的 head 上重跑——重新检查准入门槛,仍然通过。

模板完整 ✓

问题: 与首轮一致——这是功能新增而非 bug 修复,没有需要复现的问题。PR 依旧没有关联的用户请求,这一点通常会提出来,但插件格式兼容已经是本仓库既有且已文档化的能力(Gemini 扩展和 Claude 插件走同一条转换器管线安装,用户文档也明确宣传了这一兼容性),所以"Qoder 插件无法被安装器识别"是现有能力上的一个具体缺口,而不是投机性的新增。

方向: 对齐。CHANGELOG 暂时没有 Qoder 相关条目,但有多条维护 Claude/Gemini 插件兼容面的记录,把该兼容面扩展到第三种格式符合产品已有的投入方向。

规模: 触及核心路径(packages/core/src/extension/**packages/core/src/config/config.ts,以及 acp-bridgesdk-typescript 中的增量 union 成员)。生产代码 471 行、测试 1243 行、文档 37 行——首轮之后的修复轮次基本都在加测试;生产代码仍低于 feat 类 PR 的 500 行维护者关注阈值。

方案: 范围仍然合理,首轮之后的 7 个修复提交恰好都落在认真评审会指出的位置:更新检查链路(记录 commit、嵌套 marketplace 溯源、annotated tag)、context 文件合并与去重、MCP 校验和报错信息净化。每一处增量都与评审反馈一一对应——没有顺手膨胀。

风险: 无升级风险信号——变更文件均未命中仓库历史中与 revert 相关的高风险路径。

进入代码审查 🔍

Qwen Code · qwen3.8-max

Reviewed at 9854b9d81e14676fef8e699686c5fc319f141c7b · re-run with @qwen-code /triage

@qwen-code-ci-bot

qwen-code-ci-bot commented Aug 7, 2026

Copy link
Copy Markdown
Collaborator

Code review (re-run on the post-review head)

Independent baseline first: given "make Qoder plugins installable through the existing extension pipeline", I would have written a third converter modeled on the Claude/Gemini ones, reused the existing confined copy logic, added the manifest to the shared detection list so archive validation comes for free, extended the three origin unions, and recorded the checked-out commit so update checks survive .git stripping. That is still what this PR does — and the seven fix commits since my first pass landed exactly where a careful review would have pointed, so this re-run verified them finding by finding against the current head.

The ten findings from the maintainer's manual review round are all resolved:

  1. Update checks no longer convert the user's own source directory. Local update-check conversion now runs only on the extracted-archive temp dir or for Qoder origins, and the Qoder path goes through buildQwenExtensionFromPlugin, which copies into a fresh temp dir and never writes into the source (I verified the copy direction in the base code; the new test asserts the source dir is untouched afterwards). A local marketplace checkout is left alone entirely. The whole block sits in try/catch with finally cleanup, so a malformed source degrades to NOT_UPDATABLE instead of breaking the update sweep.
  2. Configured context files now augment instead of replace. QWEN.md is prepended whenever any other context survives, and configured files / system-prompt.md / QWEN.md are deduplicated — matching what the docs added in this same PR promise.
  3. ./-prefixed entries are normalized before the dedupe (confined resolution + path.relative), so "./system-prompt.md" no longer injects the system prompt twice. The merge test feeds ['custom.md', 42, 'custom.md', './system-prompt.md'] and gets exactly ['QWEN.md', 'custom.md', 'system-prompt.md'].
  4. A malformed root .mcp.json now fails the install with Invalid Qoder MCP configuration… instead of installing silently with zero servers.
  5. Path-valued mcpServers is unwrapped correctly — the Qoder converter resolves the file itself (accepting the { mcpServers: … } wrapper, and a bare map for explicitly configured paths) before buildQwenExtensionFromPlugin runs, so the Claude path's wrapper-less parsing is no longer reachable from Qoder.
  6. Variable replacement now runs for Qoder (usesPluginVariables covers both origins); the install test asserts ${CLAUDE_PLUGIN_ROOT} is rewritten to the installed path.
  7. Resolved deliberately, opposite to the suggestion: an explicit marketplace selection (pluginName) now wins over root-Qoder-manifest detection, with a comment explaining why — silently substituting the root manifest would install different content than the one the user selected. Tested in both directions. The trade-off: install owner/qoder-repo:name against a repo without a marketplace errors instead of falling back, which reads as the safer failure.
  8. resolvePluginRelativeFile is exported and reused — the duplicated confinement checks are gone and the per-rejection warnings are back.
  9. Update checks key on the recorded commit, not the origin. Claude git installs now record and keep their commit too; legacy installs without one stay NOT_UPDATABLE, same as before this PR.
  10. Partly, and that's fine — QWEN.md is still baked into the generated manifest when present, but only alongside other context; the loader default covers the empty case. Behavior matches the docs.

The genuinely new machinery since the first pass is the externalContent provenance field, and it closes a real hole: a marketplace plugin whose source points at a nested github/url/git-subdir repo used to record the marketplace clone's commit as if it described the installed content. Now the converter reports whether content came from outside the marketplace repo; when it did, the commit is dropped and the install is NOT_UPDATABLE rather than update-checking the wrong repo. Legacy Claude marketplace installs without the field take the same conservative answer, while confirmed in-repo content (including github-release installs) keeps working update checks. Annotated tags are compared by their peeled commit (ref plus ref^{}), and every converter error message runs through stripAnsiAndControl (verified present in base), so a hostile manifest cannot inject terminal escapes through a parse error.

Things re-verified against the base code rather than taken on faith: the renamed dispatcher's three call sites are all updated; the origin union's three mirrors (core config, acp-bridge, sdk-typescript) are all updated; appending the Qoder manifest keeps SUPPORTED_EXTENSION_MANIFESTS indices [0]/[3] stable and automatically extends archive validation; buildQwenExtensionFromPlugin copies source → temp (never into the source) and strips .git; ExtensionConfig already types displayName and contextFileName: string | string[].

Not blocking, worth knowing: the Claude path's own string-mcpServers parsing still assigns the whole file without unwrapping the wrapper (pre-existing on main; this PR routes Qoder around it). And the converter's fidelity to the real Qoder layout still rests on synthetic fixtures — a mismatch fails closed as a conversion error.

How the install/update lifecycle works now

sequenceDiagram
    participant P1 as User
    participant P2 as ExtensionManager
    participant P3 as cloneFromGit
    participant P4 as Converter
    participant P5 as Update check
    P1->>P2: install from git or marketplace source
    P2->>P3: clone into temp dir
    P3-->>P2: checked-out commit
    P2->>P4: convert (confined copy, strips git metadata)
    P4-->>P2: converted extension, origin, provenance
    P2->>P2: keep commit only when it describes the content
    P1->>P5: extensions update, later
    P5->>P5: compare recorded commit with ls-remote (peeled for tags)
Loading
Files changed (15 of 15)
File What changed
docs/design/qoder-plugin-compatibility.md Design doc for the compatibility layer
docs/users/extension/introduction.md User docs: Qoder joins the compatible ecosystems, with install examples
integration-tests/cli/extensions-install.test.ts CLI integration test: install, list, and uninstall a synthetic Qoder plugin through the bundled CLI
packages/acp-bridge/src/status.ts Qoder added to the ACP serve origin union
packages/core/src/config/config.ts Qoder in the core origin union; gitCommit and externalContent install-metadata fields
packages/core/src/extension/claude-converter.test.ts cloneFromGit mocks updated for the commit return
packages/core/src/extension/claude-converter.ts buildQwenExtensionFromPlugin and resolvePluginRelativeFile exported; resolvePluginSource reports external content
packages/core/src/extension/extension-converter.ts Dispatcher renamed and extended: Qoder detection, explicit-selection precedence, provenance passthrough
packages/core/src/extension/extensionManager.test.ts Install-path tests for all source types, provenance retention and drop, consent payload
packages/core/src/extension/extensionManager.ts Records the cloned commit, drops it for external content, extends variable replacement to Qoder
packages/core/src/extension/github.test.ts Update-check tests: recorded commits, peeled tags, provenance gates, local conversion safety, wrapped archives
packages/core/src/extension/github.ts cloneFromGit returns the commit; token helper extracted; commit-based update checks with provenance gates
packages/core/src/extension/qoder-converter.test.ts Converter tests including symlink, manifest, MCP, and context escape rejection
packages/core/src/extension/qoder-converter.ts New converter: manifest validation, MCP normalization, context resolution, confined build reuse
packages/sdk-typescript/src/daemon/types.ts Qoder added to the daemon SDK origin union

Testing evidence

Unattended CI run — nothing was built or executed locally; the evidence below is the PR's own CI read through the API at the reviewed commit. Everything that ran is green: the full Qwen Code CI run (ubuntu unit suite, desktop shell on both OSes, web-shell smoke, coverage), Qwen Live Host CI, and SDK Java (all matrix legs) completed successfully. Three legs show skipped by design, not because of this PR: the macOS/Windows unit legs, and Integration Tests (CLI, No Sandbox) — that job is gated to the merge_group event in ci.yml, so it runs when the PR enters the merge queue and never on PR pushes. That is also why earlier review rounds kept seeing it as skipped; the PR's own CLI integration test for the Qoder install path is in the diff and will run there.

CI results for 9854b9d (auto-updated by the triage finalize job if checks change):

Check Conclusion
Classify PR ✅ success
Desktop Shell (ubuntu-22.04) ✅ success
Desktop Shell (windows-2022) ✅ success
Live Host (macos-latest) ✅ success
Post Coverage Comment (ubuntu-latest, 22.x) ✅ success
Real daemon E2E / Java 11 ✅ success
Remind on force-push ✅ success
Test (ubuntu-latest, Node 22.x) ✅ success
label ✅ success
macos-latest / Java 21 ✅ success
ubuntu-latest / Java 11 ✅ success
ubuntu-latest / Java 17 ✅ success
ubuntu-latest / Java 21 ✅ success
web-shell E2E Smoke (ubuntu-latest, Node 22.x) ✅ success
windows-latest / Java 21 ✅ success

One row per check name (latest run); skipped checks omitted; failures sort first. / 每个检查名一行(取最新一次运行),省略 skipped,失败项排在最前。

Sandboxed verification would settle the one claim static review cannot, and it is already in flight: the /triage invocation that triggered this re-run also started the isolated verify job (watch live progress) — every Qoder fixture in this PR is synthetic and built to the same spec the converter implements, and an A/B run against the base build is what proves the base rejects .qoder-plugin/plugin.json and this diff is what removes that rejection. Its report posts here when the run completes.

Not verified: the converter's fidelity to the real Qoder plugin layout (docs unreachable from this environment; a mismatch fails closed as a conversion error) and live third-party Git/npm hosts (covered with synthetic installer tests, per the author's own scope note).

中文说明

代码审查(评审修复后的 head 重跑):先独立推演方案——要让 Qoder 插件走现有扩展管线安装,自然做法是仿照 Claude/Gemini 写第三个转换器、复用现有受限复制逻辑、把 manifest 加进共享检测列表让归档校验自动生效、扩展三处 origin 联合类型、并记录检出 commit 以便在剥离 .git 后更新检查仍可用。PR 依旧是这样做的——而首轮之后的 7 个修复提交恰好都落在认真评审会指出的位置,因此本次重跑逐条对照当前 head 核实。

维护者人工评审轮次的 10 个发现全部解决:1)更新检查不再就地转换用户自己的源目录——本地更新时的转换只作用于归档解压的临时目录或 Qoder 来源,且 Qoder 走 buildQwenExtensionFromPlugin(拷贝到全新临时目录、从不写入源目录,拷贝方向已对照基线代码核实;新测试断言源目录事后未被改动),本地 marketplace checkout 完全不被触碰;整段位于 try/catch 中并有 finally 清理,坏源降级为 NOT_UPDATABLE 而不会打断整个更新检查。2)显式配置的 context 文件现在是叠加而非替换——只要有任何其他 context 存活,QWEN.md 就会被前置,且配置项/system-prompt.md/QWEN.md 三者去重,与本 PR 新增文档的承诺一致。3)./ 前缀条目在去重前归一化(受限解析 + path.relative),system-prompt.md 不再被注入两次;合并测试输入 ['custom.md', 42, 'custom.md', './system-prompt.md'],得到恰好 ['QWEN.md', 'custom.md', 'system-prompt.md']。4)损坏的根 .mcp.json 现在直接以 Invalid Qoder MCP configuration… 使安装失败,而不是静默装出零个 server。5)路径形式的 mcpServers 被正确展开——Qoder 转换器在 buildQwenExtensionFromPlugin 运行前自行解析该文件(接受 { mcpServers: … } wrapper,显式配置路径也接受裸 map),Claude 路径的无 wrapper 解析对 Qoder 不再可达。6)变量替换现在对 Qoder 生效(usesPluginVariables 覆盖两种来源);安装测试断言 ${CLAUDE_PLUGIN_ROOT} 被改写为安装路径。7)有意反向解决:显式 marketplace 选择(pluginName)现在优先于根 Qoder manifest 检测,并附注释说明原因——静默替换根 manifest 会安装与用户所选不同的内容;两个方向都有测试。代价是:对没有 marketplace 的仓库执行 install owner/qoder-repo:name 会报错而不是回退,这是更安全的失败方式。8)resolvePluginRelativeFile 已导出并复用——重复的边界检查被移除,逐条拒绝警告恢复。9)更新检查以记录的 commit 为准而非 origin——Claude git 安装现在同样记录并保留 commit;无记录的旧安装维持 NOT_UPDATABLE,与本 PR 之前一致。10)部分采纳,且可以接受——QWEN.md 存在时仍写入生成的 manifest,但仅在其他 context 同时存在时;空场景由加载器默认值覆盖。行为与文档一致。

首轮之后真正的新机制是 externalContent 溯源字段,它堵住了一个真实的洞:marketplace 插件的 source 指向嵌套的 github/url/git-subdir 仓库时,过去会把 marketplace 克隆的 commit 当作已安装内容的版本记录。现在转换器报告内容是否来自 marketplace 仓库之外;若是,丢弃 commit 并置为 NOT_UPDATABLE,避免对错误的仓库做更新检查。无该字段的旧 Claude marketplace 安装保守地得到同样结论;确认在仓库内的内容(含 github-release 安装)保留可用的更新检查。Annotated tag 按剥离后的 commit 比较(ref 与 ref^{});所有转换器报错都经过 stripAnsiAndControl(已核实基线中存在),恶意 manifest 无法借解析错误注入终端转义序列。

已对照基线代码逐一核实而非轻信:重命名分发器的三个调用点全部更新;origin 联合类型的三处镜像(core config、acp-bridge、sdk-typescript)全部更新;追加 Qoder manifest 后 SUPPORTED_EXTENSION_MANIFESTS 索引 [0]/[3] 稳定且归档校验自动扩展;buildQwenExtensionFromPlugin 是"源 → 临时目录"的拷贝(从不写入源)且剥离 .git;ExtensionConfig 已有 displayName 与 contextFileName: string | string[] 类型。

非阻塞但值得了解:Claude 路径自身的字符串 mcpServers 解析仍未展开 wrapper(main 上的既有问题;本 PR 让 Qoder 绕开了它)。转换器与真实 Qoder 布局的契合度仍只由合成 fixture 验证——不匹配时以转换错误 fail-closed。

测试证据:无人值守 CI 运行,未本地构建或执行任何 PR 代码;以上为通过 API 读取的该 commit 的 PR 自身 CI。所有实际运行的检查均为绿色:Qwen Code CI 全程(ubuntu 单测、双平台 desktop shell、web-shell smoke、覆盖率)、Qwen Live Host CI、SDK Java(全部矩阵腿)均成功完成。三条腿显示 skipped 属设计使然而非本 PR 所致:macOS/Windows 单测腿与 Integration Tests (CLI, No Sandbox)——后者在 ci.yml 中仅由 merge_group 事件触发,即 PR 进入合并队列时运行,PR push 时永不运行。这也是此前评审轮次反复看到它被跳过的原因;PR 自带的 Qoder 安装 CLI 集成测试已在 diff 中,会在那里运行。

沙箱验证可以补上静态审查无法证明的承重声明,且已在进行:触发本次重跑的 /triage 调用同时启动了隔离的 verify 任务(见上方链接)——本 PR 的全部 Qoder fixture 都是按转换器实现的同一规格合成的,只有对基线构建的 A/B 运行才能证明基线确实拒绝 .qoder-plugin/plugin.json、且正是本 diff 移除了该拒绝。运行结束后报告会发布在这里。

未验证:真实 Qoder 插件布局的保真度(本环境无法访问其文档;不匹配时以转换错误 fail-closed);真实第三方 Git/npm 源(按作者自己的范围说明,由合成安装器测试覆盖)。

Qwen Code · qwen3.8-max

Reviewed at 9854b9d81e14676fef8e699686c5fc319f141c7b · re-run with @qwen-code /triage

@github-actions

github-actions Bot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Summary

Package Lines Statements Functions Branches
CLI 83.54% 83.54% 89.62% 82.66%
Core 87.73% 87.73% 89.29% 86.25%
CLI Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   83.54 |    82.66 |   89.62 |   83.54 |                   
 src               |   84.77 |    80.78 |   88.39 |   84.77 |                   
  cli.ts           |   95.68 |    84.11 |     100 |   95.68 | ...60-561,565-566 
  gemini.tsx       |   72.66 |    76.99 |   80.76 |   72.66 | ...1280-1284,1405 
  ...ractiveCli.ts |   86.49 |    80.46 |   87.93 |   86.49 | ...2926,2932,2994 
  ...liCommands.ts |   89.11 |    85.15 |      90 |   89.11 | ...90,507,541,663 
  ...ActiveAuth.ts |     100 |     87.5 |     100 |     100 | 66-80             
 ...cp-integration |   70.24 |     72.9 |   89.96 |   70.24 |                   
  acpAgent.ts      |   69.93 |    72.78 |      90 |   69.93 | ...77,11882-11884 
  authMethods.ts   |      92 |       60 |     100 |      92 | 33-34             
  errorCodes.ts    |       0 |        0 |       0 |       0 | 1-22              
  ...ion-skills.ts |     100 |    88.23 |     100 |     100 | 17,32             
  generation.ts    |    97.1 |    81.25 |     100 |    97.1 | 109,112           
  ...DirContext.ts |     100 |      100 |     100 |     100 |                   
 ...ration/service |   97.04 |    95.71 |   93.33 |   97.04 |                   
  filesystem.ts    |   97.04 |    95.71 |   93.33 |   97.04 | ...21-122,238-239 
 ...ration/session |   90.88 |    86.21 |   96.29 |   90.88 |                   
  Session.ts       |   89.94 |     84.6 |   95.41 |   89.94 | ...81,10308-10312 
  ...entTracker.ts |    96.8 |    89.36 |      90 |    96.8 | 137-143,221       
  ...projection.ts |   98.57 |    93.29 |     100 |   98.57 | ...76,333,344,356 
  ...stop-guard.ts |     100 |    98.07 |     100 |     100 | 37,127            
  ...eplay-page.ts |   93.22 |    90.81 |     100 |   93.22 | 72,83-86,112-122  
  ...y-replayer.ts |   98.53 |    95.52 |     100 |   98.53 | 238-240           
  index.ts         |       0 |        0 |       0 |       0 | 1-40              
  ...ssionUtils.ts |   89.76 |    87.32 |     100 |   89.76 | ...54-270,326-328 
  tasksSnapshot.ts |    94.3 |     87.5 |     100 |    94.3 | 65-71             
  ...on-tracker.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...ssion/emitters |   95.79 |    93.52 |   96.66 |   95.79 |                   
  ...ageEmitter.ts |   95.34 |    94.28 |     100 |   95.34 | 52-59             
  PlanEmitter.ts   |     100 |       90 |     100 |     100 | 66                
  base-emitter.ts  |   78.26 |       75 |     100 |   78.26 | 23-24,26-28       
  index.ts         |       0 |        0 |       0 |       0 | 1-10              
  ...ll-emitter.ts |   99.18 |    96.47 |     100 |   99.18 | 355-356           
 ...ession/rewrite |    91.8 |    89.13 |   94.44 |    91.8 |                   
  LlmRewriter.ts   |    82.4 |     86.2 |     100 |    82.4 | ...,88-89,166-170 
  ...Middleware.ts |   96.96 |    88.09 |     100 |   96.96 | 144,152-154       
  TurnBuffer.ts    |     100 |      100 |     100 |     100 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 src/agent-view    |   89.03 |    81.28 |   89.09 |   89.03 |                   
  ...t-cli-argv.ts |     100 |      100 |     100 |     100 |                   
  protocol.ts      |     100 |      100 |     100 |     100 |                   
  ...sor-client.ts |   80.38 |    72.27 |   76.66 |   80.38 | ...22-626,652-656 
  ...or-process.ts |   96.61 |    88.88 |   84.61 |   96.61 | 129-130,150-151   
  ...sor-runner.ts |    84.9 |     75.6 |      85 |    84.9 | ...44,468,471-481 
  ...sor-server.ts |   85.71 |    83.06 |   95.45 |   85.71 | ...67-468,471-488 
  ...isor-store.ts |   97.73 |    81.16 |     100 |   97.73 | ...92,594,607,643 
  ...nal-bridge.ts |   93.98 |     91.3 |   83.33 |   93.98 | 228-238           
 src/commands      |   89.46 |    72.18 |   64.51 |   89.46 |                   
  auth.ts          |     100 |    83.33 |     100 |     100 | 11,14             
  channel.ts       |   55.55 |      100 |       0 |   55.55 | 18-22,30-40       
  extensions.tsx   |   96.77 |      100 |      50 |   96.77 | 39                
  hooks.tsx        |   66.66 |      100 |       0 |   66.66 | 20-24             
  mcp.ts           |   95.45 |      100 |      50 |   95.45 | 31                
  review.ts        |   98.63 |      100 |      50 |   98.63 | 84                
  serve.ts         |   87.35 |    66.66 |     100 |   87.35 | ...97,709,725-729 
  sessions.ts      |     100 |      100 |      50 |     100 |                   
  update.ts        |   98.13 |    94.44 |   66.66 |   98.13 | 82-83             
 ...mmands/channel |    88.3 |    87.64 |    90.3 |    88.3 |                   
  channel-cwd.ts   |     100 |      100 |     100 |     100 |                   
  ...l-registry.ts |      80 |    84.61 |      80 |      80 | 37-40,49-52,63-66 
  ...entry-path.ts |      75 |       50 |     100 |      75 | 8-9               
  config-utils.ts  |   95.87 |    96.35 |     100 |   95.87 | ...08-213,271-274 
  configure.ts     |    14.7 |      100 |       0 |    14.7 | 18-21,23-84       
  daemon-worker.ts |    93.9 |    85.39 |   94.11 |    93.9 | ...1211,1218-1219 
  loop-runtime.ts  |   91.66 |      100 |      50 |   91.66 | 15,22             
  ...classifier.ts |   98.49 |    96.51 |     100 |   98.49 | 115-116,161       
  ...tact-store.ts |   93.51 |    87.65 |     100 |   93.51 | ...71,288-289,337 
  pairing.ts       |   72.85 |      100 |      50 |   72.85 | 22-28,57-68       
  pidfile.ts       |   95.55 |       90 |     100 |   95.55 | ...50-251,315-316 
  proxy.ts         |     100 |      100 |     100 |     100 |                   
  reload.ts        |    77.5 |    86.95 |      75 |    77.5 | 72-84,93-97       
  runtime.ts       |   82.43 |    86.44 |     100 |   82.43 | ...87-191,251-253 
  set.ts           |   75.72 |    85.71 |      50 |   75.72 | 65-83,111-116     
  start.ts         |    85.8 |    82.17 |      88 |    85.8 | ...85,591-594,606 
  ...ure-format.ts |   93.65 |    82.45 |     100 |   93.65 | ...42,48-49,74-75 
  status.ts        |   78.57 |    59.25 |   66.66 |   78.57 | ...36-137,150-161 
  stop.ts          |   57.83 |    82.35 |      50 |   57.83 | ...3,74-76,85-111 
 ...nds/extensions |   88.82 |    87.64 |   87.09 |   88.82 |                   
  consent.ts       |   72.53 |       90 |   42.85 |   72.53 | ...86-142,157-163 
  disable.ts       |     100 |       90 |     100 |     100 | 30                
  enable.ts        |     100 |    91.66 |     100 |     100 | 38                
  install.ts       |   82.95 |    81.57 |      75 |   82.95 | ...96-199,202-211 
  link.ts          |     100 |      100 |     100 |     100 |                   
  list.ts          |     100 |     87.5 |     100 |     100 | 18                
  new.ts           |     100 |      100 |     100 |     100 |                   
  settings.ts      |   99.15 |      100 |   83.33 |   99.15 | 151               
  sources.ts       |   93.42 |    87.09 |   92.85 |   93.42 | ...4-66,96-98,167 
  uninstall.ts     |   74.57 |       40 |   66.66 |   74.57 | 45-47,60-67,70-73 
  update.ts        |   96.71 |    97.05 |     100 |   96.71 | 114-118           
  utils.ts         |      75 |    53.84 |     100 |      75 | ...27-131,133-137 
 ...les/mcp-server |       0 |        0 |       0 |       0 |                   
  example.ts       |       0 |        0 |       0 |       0 | 1-60              
 ...amples/starter |       0 |        0 |       0 |       0 |                   
  example.ts       |       0 |        0 |       0 |       0 | 1-64              
 src/commands/mcp  |   90.17 |    84.39 |   83.33 |   90.17 |                   
  add.ts           |    99.3 |    96.07 |     100 |    99.3 | 154-155           
  approve.ts       |   76.19 |     87.5 |   66.66 |   76.19 | ...,89-99,114-124 
  list.ts          |   92.59 |    83.87 |      80 |   92.59 | ...62-164,180-181 
  reconnect.ts     |   78.85 |    66.66 |   85.71 |   78.85 | 42-55,169-191     
  remove.ts        |     100 |       80 |     100 |     100 | 21-25             
 ...ommands/review |   87.22 |     87.9 |   88.41 |   87.22 |                   
  agent-prompt.ts  |   92.82 |    92.19 |   96.96 |   92.82 | ...2122,2236-2316 
  base-tree.ts     |   76.16 |    80.76 |   77.77 |   76.16 | ...50-371,373-386 
  capture-local.ts |   68.57 |     90.9 |      75 |   68.57 | 107-111,158-189   
  ...k-coverage.ts |   46.92 |    13.33 |   66.66 |   46.92 | ...35-240,253-263 
  cleanup.ts       |   89.12 |    82.22 |   83.33 |   89.12 | ...99-504,506-507 
  ...ent-status.ts |   93.03 |    83.87 |   83.33 |   93.03 | 291,531-551       
  ...ose-review.ts |   96.25 |    92.09 |      96 |   96.25 | ...1853,1881-1903 
  cost-ledger.ts   |   94.67 |    95.86 |   78.57 |   94.67 | ...04-505,545-555 
  drive.ts         |   76.07 |    85.71 |   81.81 |   76.07 | ...90-492,497-499 
  extract-step.ts  |   91.36 |    90.62 |   88.88 |   91.36 | ...90-707,714-729 
  fetch-pr.ts      |    76.7 |    68.75 |   63.63 |    76.7 | ...95,417,450-455 
  findings.ts      |   89.35 |    89.13 |   95.45 |   89.35 | ...15-918,927-928 
  load-rules.ts    |   26.41 |      100 |   16.66 |   26.41 | ...41-153,155-156 
  mock-provider.ts |   95.44 |    90.25 |   89.47 |   95.44 | 145,690-709       
  parse-args.ts    |   99.66 |    96.55 |     100 |   99.66 | 404               
  plan-diff.ts     |   64.04 |      100 |   66.66 |   64.04 | 127-163           
  pr-context.ts    |   81.77 |    80.86 |   92.85 |   81.77 | ...1043,1072-1074 
  presubmit.ts     |   83.75 |    92.72 |   88.88 |   83.75 | ...77-578,655-685 
  ...ish-assets.ts |   77.24 |    82.75 |   71.42 |   77.24 | ...89-535,537-548 
  repo-context.ts  |   94.92 |    90.82 |     100 |   94.92 | ...67-368,376-377 
  ...ve-anchors.ts |   77.77 |    88.88 |      75 |   77.77 | ...77-182,194-211 
  run.ts           |   82.16 |    87.12 |   91.66 |   82.16 | ...52,468-516,529 
  save-artifact.ts |    89.9 |    81.81 |   94.11 |    89.9 | ...08-311,404-407 
  script-lint.ts   |   81.14 |    79.23 |   88.88 |   81.14 | ...59-773,775-797 
  submit.ts        |   83.88 |    83.11 |    90.9 |   83.88 | ...66-470,570-606 
  test-delta.ts    |   87.13 |    91.46 |      75 |   87.13 | 206-237,477-485   
  test-efficacy.ts |   88.04 |    84.12 |   95.45 |   88.04 | ...2602,2610-2630 
  test-plan.ts     |   91.44 |    91.39 |   89.47 |   91.44 | ...38-839,903-920 
 ...w/__fixtures__ |     100 |      100 |     100 |     100 |                   
  ...r-default.mjs |     100 |      100 |     100 |     100 |                   
  ...der-empty.mjs |     100 |      100 |     100 |     100 |                   
  ...der-named.mjs |     100 |      100 |     100 |     100 |                   
 ...nds/review/lib |   97.08 |     94.8 |   97.58 |   97.08 |                   
  agent-briefs.ts  |   98.95 |      100 |      50 |   98.95 | 695-696           
  anchors.ts       |     100 |    94.79 |     100 |     100 | ...33,169,178,225 
  assets.ts        |     100 |      100 |     100 |     100 |                   
  authorization.ts |    92.4 |    92.59 |     100 |    92.4 | 127-133           
  budget.ts        |     100 |      100 |     100 |     100 |                   
  coverage.ts      |   95.94 |    95.43 |   95.65 |   95.94 | ...14,351,460-477 
  deadline.ts      |   97.68 |    91.22 |     100 |   97.68 | 140-141,190,352   
  diff-flags.ts    |     100 |        0 |     100 |     100 | 63                
  diff-plan.ts     |   98.73 |    93.01 |     100 |   98.73 | ...41,264,290-291 
  effort.ts        |     100 |      100 |     100 |     100 |                   
  gh.ts            |   85.92 |    91.11 |   73.33 |   85.92 | ...32,269-270,297 
  git.ts           |   97.64 |    95.65 |     100 |   97.64 | 180-181           
  heavy.ts         |     100 |      100 |     100 |     100 |                   
  inline-counts.ts |     100 |      100 |     100 |     100 |                   
  ledger.ts        |     100 |      100 |     100 |     100 |                   
  local-diff.ts    |    84.4 |    88.46 |     100 |    84.4 | ...63-473,475-483 
  ...ry-context.ts |   96.17 |    94.93 |     100 |   96.17 | ...87-488,493-496 
  merge-base.ts    |     100 |      100 |     100 |     100 |                   
  path-rules.ts    |     100 |      100 |     100 |     100 |                   
  paths.ts         |     100 |     87.5 |     100 |     100 | 92                
  prompt-record.ts |   97.88 |    93.87 |     100 |   97.88 | 260-261,267       
  receipt.ts       |     100 |      100 |     100 |     100 |                   
  report.ts        |   94.68 |    93.75 |     100 |   94.68 | 189-193           
  ...ry-context.ts |     100 |    98.66 |     100 |     100 | 184               
  retirement.ts    |     100 |    89.77 |     100 |     100 | ...16-317,328,430 
  review-footer.ts |     100 |      100 |     100 |     100 |                   
  roster.ts        |     100 |    95.71 |     100 |     100 | 145,163,208       
  shell-quote.ts   |     100 |      100 |     100 |     100 |                   
  stale-bundle.ts  |   98.11 |    94.04 |     100 |   98.11 | 416,457,497-498   
  test-utils.ts    |     100 |      100 |     100 |     100 |                   
  transcripts.ts   |   96.59 |    94.56 |     100 |   96.59 | ...08,297-298,323 
  ...pace-scope.ts |     100 |    96.96 |     100 |     100 | 172               
  workspaces.ts    |     100 |     95.9 |     100 |     100 | ...27,452,499,512 
  worktree.ts      |     100 |      100 |     100 |     100 |                   
 ...mands/sessions |   91.56 |    86.95 |   83.33 |   91.56 |                   
  common.ts        |     100 |      100 |     100 |     100 |                   
  list.ts          |   90.96 |    86.66 |   81.81 |   90.96 | 208-219,221-222   
 src/config        |   94.66 |    89.35 |   96.02 |   94.66 |                   
  auth.ts          |   89.35 |    83.56 |     100 |   89.35 | ...97-298,314-315 
  ...eMcpImport.ts |   87.91 |    81.52 |     100 |   87.91 | ...63-371,453-454 
  compile-cache.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |   88.93 |    88.61 |   83.78 |   88.93 | ...2456,2458-2466 
  ...cy-monitor.ts |   88.75 |    76.19 |     100 |   88.75 | ...3,90-92,98,101 
  ...ust-policy.ts |   83.04 |    88.49 |     100 |   83.04 | ...39,253,352-353 
  ...heme-names.ts |     100 |      100 |     100 |     100 |                   
  environment.ts   |   94.33 |    89.61 |   94.73 |   94.33 | ...35-639,655-656 
  ...le-watcher.ts |   90.86 |    83.65 |   95.83 |   90.86 | ...23-325,370,418 
  ...resh-state.ts |   90.57 |    97.29 |   93.75 |   90.57 | 137-142,146-152   
  ...ime-reload.ts |     100 |    69.69 |     100 |     100 | ...12-113,122-123 
  hot-reload.ts    |     100 |    89.13 |     100 |     100 | 47,172-178,238    
  keyBindings.ts   |   97.43 |       50 |     100 |   97.43 | 236-239           
  ...ngsAdapter.ts |     100 |    94.11 |     100 |     100 | 64                
  ...ig-watcher.ts |   95.17 |    83.05 |     100 |   95.17 | ...78,200,292-293 
  ...er-secrets.ts |   98.97 |    96.87 |     100 |   98.97 | 85                
  mcpApprovals.ts  |   96.55 |    95.55 |     100 |   96.55 | 223-224,229-231   
  mcpJson.ts       |     100 |      100 |     100 |     100 |                   
  mcpServers.ts    |   92.85 |     87.5 |     100 |   92.85 | 46-47             
  ...idersScope.ts |      95 |    94.73 |     100 |      95 | 11-12             
  ...abledTools.ts |     100 |      100 |     100 |     100 |                   
  ...comparison.ts |     100 |      100 |     100 |     100 |                   
  ...n-settings.ts |   99.15 |    93.75 |     100 |   99.15 | 63                
  sandboxConfig.ts |   93.33 |    93.33 |     100 |   93.33 | ...42-147,216-217 
  ...ings-cache.ts |   98.26 |    97.14 |     100 |   98.26 | 201-202           
  settings.ts      |   91.27 |    92.64 |      90 |   91.27 | ...1030,1032-1033 
  ...ingsSchema.ts |     100 |      100 |     100 |     100 |                   
  ...ngsWatcher.ts |   95.54 |    88.34 |     100 |   95.54 | ...28,277-278,293 
  ...d-env-keys.ts |     100 |      100 |     100 |     100 |                   
  ...l-settings.ts |     100 |      100 |     100 |     100 |                   
  ...paths-lite.ts |   89.47 |       88 |     100 |   89.47 | 43-44,53-54,56-57 
  ...tedFolders.ts |   93.42 |    94.21 |     100 |   93.42 | ...96-397,433-444 
 ...nfig/migration |   95.23 |    77.77 |   83.33 |   95.23 |                   
  index.ts         |   95.65 |     87.5 |     100 |   95.65 | 117-118           
  scheduler.ts     |   96.55 |    77.77 |     100 |   96.55 | 19-20             
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...ation/versions |   94.91 |      100 |     100 |   94.91 |                   
  ...-v2-shared.ts |     100 |      100 |     100 |     100 |                   
  v1-to-v2.ts      |   81.75 |      100 |     100 |   81.75 | ...28-229,231-247 
  v2-to-v3.ts      |     100 |      100 |     100 |     100 |                   
  v3-to-v4.ts      |     100 |      100 |     100 |     100 |                   
  v5-to-v4.ts      |      96 |      100 |     100 |      96 | 94-95,99          
 src/core          |     100 |      100 |     100 |     100 |                   
  auth.ts          |     100 |      100 |     100 |     100 |                   
  initializer.ts   |     100 |      100 |     100 |     100 |                   
  theme.ts         |     100 |      100 |     100 |     100 |                   
 src/dualOutput    |    71.8 |    70.31 |   66.66 |    71.8 |                   
  ...tputBridge.ts |   71.95 |    70.96 |   68.42 |   71.95 | ...08-409,417-420 
  ...utContext.tsx |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-8               
 src/export        |       0 |        0 |       0 |       0 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-7               
 src/generated     |     100 |      100 |     100 |     100 |                   
  git-commit.ts    |     100 |      100 |     100 |     100 |                   
 src/hooks         |     100 |      100 |     100 |     100 |                   
  ...elete-hook.ts |     100 |      100 |     100 |     100 |                   
 src/i18n          |   85.98 |    81.92 |   89.65 |   85.98 |                   
  index.ts         |   73.45 |    77.77 |      90 |   73.45 | ...70-271,294-299 
  languages.ts     |   93.07 |     92.3 |   85.71 |   93.07 | ...35,164-169,184 
  ...nslateKeys.ts |     100 |      100 |     100 |     100 |                   
  ...lationDict.ts |   93.33 |    66.66 |     100 |   93.33 | 15                
 src/i18n/locales  |     100 |      100 |     100 |     100 |                   
  ca.js            |     100 |      100 |     100 |     100 |                   
  de.js            |     100 |      100 |     100 |     100 |                   
  en.js            |     100 |      100 |     100 |     100 |                   
  fr.js            |     100 |      100 |     100 |     100 |                   
  ja.js            |     100 |      100 |     100 |     100 |                   
  pt.js            |     100 |      100 |     100 |     100 |                   
  ru.js            |     100 |      100 |     100 |     100 |                   
  zh-TW.js         |     100 |      100 |     100 |     100 |                   
  zh.js            |     100 |      100 |     100 |     100 |                   
 ...nonInteractive |      80 |    76.31 |   81.35 |      80 |                   
  session.ts       |   84.08 |    75.27 |   93.61 |   84.08 | ...1007,1016-1026 
  types.ts         |    42.5 |      100 |   33.33 |    42.5 | ...31-632,635-636 
 ...active/control |   75.63 |    89.09 |      80 |   75.63 |                   
  ...rolContext.ts |    6.45 |        0 |       0 |    6.45 | 56-95             
  ...Dispatcher.ts |   91.79 |    92.45 |   88.88 |   91.79 | ...49-367,387,390 
  ...rolService.ts |    6.89 |        0 |       0 |    6.89 | 46-188            
 ...ol/controllers |   42.27 |    64.66 |   48.64 |   42.27 |                   
  ...Controller.ts |   39.49 |      100 |      80 |   39.49 | 88-92,127-210     
  ...Controller.ts |       0 |        0 |       0 |       0 | 1-56              
  ...Controller.ts |   53.96 |    65.71 |   58.33 |   53.96 | ...37-642,644-649 
  ...Controller.ts |   14.06 |      100 |       0 |   14.06 | ...82-117,130-133 
  ...Controller.ts |   37.92 |    60.71 |   46.66 |   37.92 | ...41-653,662-691 
 .../control/types |       0 |        0 |       0 |       0 |                   
  serviceAPIs.ts   |       0 |        0 |       0 |       0 | 1                 
 ...Interactive/io |    98.1 |    94.13 |   95.23 |    98.1 |                   
  ...putAdapter.ts |   97.98 |     93.2 |   98.07 |   97.98 | ...1415,1431-1432 
  ...putAdapter.ts |      96 |    91.66 |   85.71 |      96 | 51-52             
  ...nputReader.ts |     100 |    94.73 |     100 |     100 | 67                
  ...putAdapter.ts |   98.49 |      100 |   90.47 |   98.49 | 85-86,126-127     
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/patches       |       0 |        0 |       0 |       0 |                   
  is-in-ci.ts      |       0 |        0 |       0 |       0 | 1-17              
 src/remoteInput   |   87.31 |    75.32 |   88.23 |   87.31 |                   
  ...utContext.tsx |     100 |      100 |     100 |     100 |                   
  ...putWatcher.ts |   88.01 |       76 |   93.33 |   88.01 | ...49-350,361-364 
  index.ts         |       0 |        0 |       0 |       0 | 1-8               
 src/runtime       |   99.61 |    95.04 |     100 |   99.61 |                   
  ...livery-ipc.ts |     100 |     90.9 |     100 |     100 | 94,106,134        
  ...l-delivery.ts |     100 |      100 |     100 |     100 |                   
  cpu-percent.ts   |     100 |      100 |     100 |     100 |                   
  ...erver-name.ts |     100 |      100 |     100 |     100 |                   
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  ...-summaries.ts |   86.66 |       50 |     100 |   86.66 | 11,19             
  ...ber-errors.ts |     100 |    95.32 |     100 |     100 | 53,93-94,172,192  
  ...ls-mapping.ts |     100 |      100 |     100 |     100 |                   
 src/serve         |   87.22 |    83.34 |   90.41 |   87.22 |                   
  ...tp-enabled.ts |     100 |      100 |     100 |     100 |                   
  ...ion-bridge.ts |     100 |      100 |     100 |     100 |                   
  auth.ts          |   93.43 |    92.95 |     100 |   93.43 | ...20-321,324-326 
  ...em-adapter.ts |     100 |      100 |     100 |     100 |                   
  capabilities.ts  |     100 |    98.07 |     100 |     100 | 670               
  ...cp-command.ts |     100 |      100 |     100 |     100 |                   
  ...horization.ts |   92.79 |    93.33 |    87.5 |   92.79 | 75-80,135-136     
  ...op-mcp-ipc.ts |   81.06 |    73.68 |   94.11 |   81.06 | ...37-242,267,289 
  ...nt-service.ts |   93.89 |    86.61 |     100 |   93.89 | ...66-468,475,477 
  ...-selection.ts |     100 |      100 |     100 |     100 |                   
  ...ings-store.ts |    86.2 |     92.4 |   95.83 |    86.2 | ...94-206,372-375 
  ...ebhook-ipc.ts |    98.5 |    86.66 |     100 |    98.5 | 47                
  ...iagnostics.ts |     100 |      100 |     100 |     100 |                   
  ...worker-env.ts |     100 |      100 |     100 |     100 |                   
  ...rker-group.ts |   87.27 |     85.2 |     100 |   87.27 | ...10,816-820,838 
  ...er-manager.ts |   89.39 |    83.88 |   93.33 |   89.39 | ...98,711,722-724 
  ...tartup-ipc.ts |   97.72 |    96.66 |     100 |   97.72 | 88-89             
  ...supervisor.ts |   92.42 |    84.44 |    97.1 |   92.42 | ...1462,1516-1520 
  ...e-grouping.ts |     100 |    94.28 |     100 |     100 | 71,137            
  core-runtime.ts  |     100 |      100 |     100 |     100 |                   
  ...ub-session.ts |    90.1 |    77.83 |   94.73 |    90.1 | ...1014,1021-1026 
  daemon-logger.ts |    82.2 |    77.42 |   91.76 |    82.2 | ...1720,1747-1753 
  ...trics-ring.ts |     100 |      100 |     100 |     100 |                   
  ...s-provider.ts |   68.04 |    52.77 |     100 |   68.04 | ...44-249,282-290 
  daemon-status.ts |   98.47 |    90.59 |     100 |   98.47 | ...1197,1199-1200 
  debug-mode.ts    |     100 |      100 |     100 |     100 |                   
  demo.ts          |     100 |      100 |     100 |     100 |                   
  env-snapshot.ts  |   93.37 |    85.18 |     100 |   93.37 | 114-117,195-202   
  ...-scheduler.ts |   87.34 |    83.87 |     100 |   87.34 | 33-36,48-50,79-81 
  ...d-provider.ts |   92.06 |    86.95 |     100 |   92.06 | ...72,287-293,316 
  ...-path-argv.ts |     100 |      100 |     100 |     100 |                   
  ...h-settings.ts |   94.41 |    88.75 |     100 |   94.41 | ...24,702,718,728 
  fast-path.ts     |   90.61 |    81.25 |   95.45 |   90.61 | ...02-511,577-578 
  ...ration-sse.ts |   42.55 |    33.33 |     100 |   42.55 | 23-24,30,33-56    
  health-query.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-143             
  ...e-observer.ts |   89.89 |    83.24 |      96 |   89.89 | ...11-512,541-543 
  ...back-binds.ts |     100 |    88.88 |     100 |     100 | 32                
  ...-workspace.ts |    90.9 |    85.71 |     100 |    90.9 | ...30-131,142-143 
  ...iders-edit.ts |     100 |    82.14 |     100 |     100 | 58-60,65,81       
  ...ory-picker.ts |     100 |    86.95 |     100 |     100 | 36,66,92          
  ...sion-audit.ts |     100 |      100 |   93.33 |     100 |                   
  rate-limit.ts    |   92.77 |    88.42 |     100 |   92.77 | ...93-295,307-309 
  ...qwen-serve.ts |   83.55 |    79.62 |   75.17 |   83.55 | ...7192,7198-7199 
  ...tup-errors.ts |     100 |      100 |     100 |     100 |                   
  ...-keepalive.ts |   94.19 |     87.5 |     100 |   94.19 | ...26,530-531,571 
  ...-lifecycle.ts |     100 |      100 |     100 |     100 |                   
  server.ts        |   90.56 |    90.92 |   71.69 |   90.56 | ...2659,2673-2677 
  ...on-helpers.ts |     100 |      100 |     100 |     100 |                   
  ...t-event-id.ts |     100 |    95.23 |     100 |     100 | 12                
  ...-admission.ts |   98.71 |    89.65 |     100 |   98.71 | 68                
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...ion-limits.ts |     100 |      100 |     100 |     100 |                   
  ...t-sessions.ts |    93.3 |    76.83 |     100 |    93.3 | ...20,823,836-838 
  ...l-resolver.ts |   90.32 |    66.66 |     100 |   90.32 | 16,45-46          
  ...ell-static.ts |   92.18 |    88.37 |     100 |   92.18 | ...21-224,267-270 
  ...ace-agents.ts |   66.13 |    70.57 |   92.68 |   66.13 | ...2246,2256-2266 
  ...generation.ts |    95.4 |    82.35 |   66.66 |    95.4 | 55-56,78,92       
  ...-git-state.ts |     100 |    91.93 |    90.9 |     100 | 161,172,202,265   
  ...ace-inputs.ts |     100 |      100 |     100 |     100 |                   
  ...ace-memory.ts |      83 |    74.54 |     100 |      83 | ...30-537,597-604 
  ...ers-status.ts |   98.58 |       79 |     100 |   98.58 | 106,134,174,177   
  ...tion-store.ts |   89.67 |    88.27 |   92.59 |   89.67 | ...91-400,411-414 
  ...e-registry.ts |   93.89 |     87.5 |     100 |   93.89 | ...18-519,525-526 
  ...e-remember.ts |   98.23 |    92.51 |     100 |   98.23 | ...36,340-345,386 
  ...te-runtime.ts |   83.98 |    90.19 |     100 |   83.98 | ...48-156,216-237 
  ...me-storage.ts |     100 |      100 |     100 |     100 |                   
  ...management.ts |   72.63 |    72.72 |      96 |   72.63 | ...88-889,896-900 
  ...lls-status.ts |     100 |    95.45 |     100 |     100 | 152               
  ...reconciler.ts |   91.63 |    84.09 |     100 |   91.63 | ...71-273,306-307 
 ...serve/acp-http |   77.23 |    78.75 |   93.33 |   77.23 |                   
  ...r-registry.ts |   96.92 |    94.87 |     100 |   96.92 | 184-187           
  client-mcp-ws.ts |   54.85 |    58.62 |   72.72 |   54.85 | ...99-300,304-305 
  ...n-registry.ts |    98.2 |    88.55 |     100 |    98.2 | 1015,1041-1052    
  dispatch.ts      |   71.95 |    75.11 |   95.55 |   71.95 | ...4897,4945-4951 
  index.ts         |   81.97 |     79.8 |    90.9 |   81.97 | ...2296,2380-2381 
  json-rpc.ts      |     100 |    96.96 |     100 |     100 | 92                
  safe-ws-send.ts  |   52.94 |    71.42 |     100 |   52.94 | 33-42,47-55       
  sse-stream.ts    |   93.96 |    88.57 |   84.61 |   93.96 | ...57-159,161-163 
  ...ort-stream.ts |       0 |        0 |       0 |       0 | 1                 
  ws-stream.ts     |   91.86 |       80 |     100 |   91.86 | 45,50,96,100-103  
 src/serve/auth    |   86.86 |     79.7 |   93.87 |   86.86 |                   
  device-flow.ts   |   96.35 |    80.57 |   97.61 |   96.35 | ...1358,1453,1519 
  ...w-provider.ts |   44.24 |    74.07 |   71.42 |   44.24 | ...23-284,297,301 
 ...rve/cdp-tunnel |   87.73 |    76.21 |    97.5 |   87.73 |                   
  ...r-emulator.ts |   93.27 |    77.77 |     100 |   93.27 | ...53-256,282-283 
  ...verse-link.ts |      88 |    76.19 |     100 |      88 | ...28-329,420-423 
  ...l-registry.ts |     100 |      100 |     100 |     100 |                   
  cdp-ws.ts        |   76.28 |    61.29 |    87.5 |   76.28 | ...13-217,223-228 
 ...nel/acceptance |    6.12 |    57.89 |   46.15 |    6.12 |                   
  ...helpers.d.mts |       0 |        0 |       0 |       0 | 1                 
  ...e-helpers.mjs |   97.64 |    70.96 |     100 |   97.64 | 22-23             
  ...mcp-smoke.mjs |       0 |        0 |       0 |       0 | 1-124             
  ...cceptance.mjs |       0 |        0 |       0 |       0 | 1-473             
  ...re-server.mjs |       0 |        0 |       0 |       0 | 1-59              
  ...ols-smoke.mjs |       0 |        0 |       0 |       0 | 1-268             
  real-tab.mjs     |       0 |        0 |       0 |       0 | 1-218             
  ...al-chrome.mjs |       0 |        0 |       0 |       0 | 1-223             
 src/serve/fs      |   86.39 |    80.74 |     100 |   86.39 |                   
  audit.ts         |     100 |    96.15 |     100 |     100 | 204               
  errors.ts        |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...x-registry.ts |     100 |      100 |     100 |     100 |                   
  paths.ts         |   77.64 |     73.8 |     100 |   77.64 | ...65,594-598,611 
  policy.ts        |   90.42 |    89.18 |     100 |   90.42 | 161-169           
  text-cursor.ts   |   88.23 |       90 |     100 |   88.23 | 74-77,92-95       
  ...ile-system.ts |   86.16 |    79.55 |     100 |   86.16 | ...2510,2520-2521 
 src/serve/live    |   77.28 |    69.21 |   89.91 |   77.28 |                   
  ...en-context.ts |   95.74 |    81.25 |     100 |   95.74 | ...0,66-67,99-100 
  ...-workspace.ts |   88.63 |    82.53 |     100 |   88.63 | ...40-241,253-254 
  discovery.ts     |   85.77 |    76.92 |      90 |   85.77 | ...49-250,255-256 
  ...structions.ts |     100 |      100 |     100 |     100 |                   
  ...oordinator.ts |   82.67 |    76.75 |   97.01 |   82.67 | ...1319,1351-1353 
  ...-installer.ts |   45.17 |    81.96 |   68.18 |   45.17 | ...80-381,395-407 
  ...oordinator.ts |   76.17 |     64.4 |   85.36 |   76.17 | ...1858,1949-1950 
  ...controller.ts |   67.82 |    79.31 |   72.72 |   67.82 | ...66-278,287-295 
  ...ak-to-user.ts |   96.66 |      100 |   83.33 |   96.66 | 37-38             
  ...sk-service.ts |   86.22 |    59.64 |   93.33 |   86.22 | ...1152,1175-1182 
  ...task-tools.ts |      99 |      100 |   85.71 |      99 | 205-206           
  ...redentials.ts |   96.26 |    93.47 |     100 |   96.26 | 91-94             
  ...me-session.ts |   65.63 |    57.24 |   88.88 |   65.63 | ...2270,2275-2282 
  ...up-context.ts |   94.83 |    77.58 |     100 |   94.83 | ...18,327-330,350 
  ...ion-source.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/serve/routes  |   85.29 |     79.6 |   95.45 |   85.29 |                   
  a2ui-action.ts   |   96.84 |     88.5 |    87.5 |   96.84 | ...70-272,309-311 
  capabilities.ts  |     100 |      100 |     100 |     100 |                   
  ...nel-notify.ts |   86.45 |       88 |     100 |   86.45 | ...,83-87,103-104 
  ...l-webhooks.ts |   93.56 |    84.09 |     100 |   93.56 | ...42,292,332,334 
  daemon-status.ts |   85.45 |    83.33 |     100 |   85.45 | 98-105            
  goals.ts         |   98.92 |     90.9 |     100 |   98.92 | 146               
  health-demo.ts   |   94.73 |     86.2 |     100 |   94.73 | 62-66,154         
  live-setup.ts    |   33.33 |     37.5 |      50 |   33.33 | ...18-123,130-135 
  live.ts          |    82.4 |    71.42 |     100 |    82.4 | ...-94,96-101,121 
  permission.ts    |     100 |     92.3 |     100 |     100 | 50,98             
  ...uled-tasks.ts |   87.29 |    82.94 |   92.59 |   87.29 | ...1275,1318-1319 
  ...on-runtime.ts |     100 |    90.47 |     100 |     100 | 58,94             
  session.ts       |   85.42 |    81.84 |   95.31 |   85.42 | ...4768,4770-4771 
  sse-events.ts    |   86.82 |    85.71 |   94.11 |   86.82 | ...16-927,930,937 
  usage-stats.ts   |     100 |    95.45 |     100 |     100 | 118               
  ...space-auth.ts |   85.55 |    75.64 |     100 |   85.55 | ...21-326,331,345 
  ...el-control.ts |   86.26 |    78.94 |     100 |   86.26 | ...17-318,339-347 
  ...management.ts |   90.38 |     78.4 |     100 |   90.38 | ...55-456,475-476 
  ...d-contacts.ts |     100 |      100 |     100 |     100 |                   
  ...controller.ts |   83.09 |       79 |      90 |   83.09 | ...1032,1038,1041 
  ...extensions.ts |   87.23 |    72.76 |   94.11 |   87.23 | ...1826,1871-1872 
  ...-file-read.ts |      91 |    80.91 |     100 |      91 | ...20-621,624-625 
  ...file-write.ts |   84.44 |    64.51 |     100 |   84.44 | ...73-275,355-357 
  ...t-branches.ts |   75.43 |    66.66 |     100 |   75.43 | ...13-618,627-634 
  ...e-git-diff.ts |   97.32 |    90.56 |     100 |   97.32 | 161-162,189-191   
  ...ce-git-log.ts |     100 |    93.18 |     100 |     100 | 52,77,188         
  workspace-git.ts |   77.08 |    89.65 |     100 |   77.08 | 97-118            
  ...github-prs.ts |   88.26 |    63.46 |     100 |   88.26 | ...38-239,264-265 
  ...-lifecycle.ts |   95.23 |    75.75 |     100 |   95.23 | ...50-151,186-187 
  ...management.ts |   87.41 |    84.13 |     100 |   87.41 | ...1660,1680-1685 
  ...cp-control.ts |    73.2 |    67.54 |   85.71 |    73.2 | ...27-633,644-645 
  ...ace-models.ts |   95.53 |    89.74 |     100 |   95.53 | ...52-157,296-297 
  ...ermissions.ts |    77.9 |    72.41 |     100 |    77.9 | ...69-277,298-316 
  ...e-settings.ts |   75.04 |    72.99 |     100 |   75.04 | ...79-690,696-697 
  ...tup-github.ts |   77.97 |    70.58 |   84.21 |   77.97 | ...46-352,397-398 
  ...ace-skills.ts |   69.87 |    78.12 |     100 |   69.87 | ...59-284,290-324 
  ...ace-status.ts |   82.94 |     74.5 |     100 |   82.94 | ...84-486,490-491 
  ...pace-tools.ts |   75.94 |    69.69 |   66.66 |   75.94 | ...59-164,193-194 
  ...pace-trust.ts |   78.92 |    66.21 |      80 |   78.92 | ...38-343,351-352 
  ...pace-voice.ts |   91.33 |    80.92 |     100 |   91.33 | ...70-673,676-678 
 src/serve/server  |   90.72 |    89.11 |   96.55 |   90.72 |                   
  access-log.ts    |   98.68 |     97.1 |     100 |   98.68 | 115,186           
  ...er-helpers.ts |   63.82 |    77.96 |   81.81 |   63.82 | ...16,330,332-347 
  ...w-registry.ts |    98.8 |    81.81 |     100 |    98.8 | 107               
  ...r-handlers.ts |   97.29 |       75 |     100 |   97.29 | 17                
  ...r-response.ts |   85.66 |    76.83 |     100 |   85.66 | ...02,719,782-791 
  fs-factory.ts    |     100 |    92.59 |     100 |     100 | 34,42,103,159     
  ...branch-ops.ts |     100 |      100 |     100 |     100 |                   
  ...t-deadline.ts |     100 |      100 |     100 |     100 |                   
  ...iter-setup.ts |      65 |    73.33 |   33.33 |      65 | 30-35,38-43,47-48 
  ...st-helpers.ts |   95.11 |    95.19 |     100 |   95.11 | ...65-167,422-427 
  self-origin.ts   |   76.19 |       80 |     100 |   76.19 | 45-54             
  ...e-features.ts |      95 |     87.5 |     100 |      95 | 182-188           
  ...on-archive.ts |   89.55 |    87.78 |   97.14 |   89.55 | ...32-836,888-889 
  ...ion-export.ts |     100 |    94.44 |     100 |     100 | 64                
  session-list.ts  |   93.55 |    91.01 |     100 |   93.55 | ...79,681-687,827 
  telemetry.ts     |   99.02 |    97.44 |     100 |   99.02 | ...25,639,781-783 
 src/serve/voice   |    92.7 |    91.48 |   97.67 |    92.7 |                   
  ...ice-config.ts |   84.81 |       30 |     100 |   84.81 | 91-100,104-105    
  voice-ws.ts      |   91.58 |    93.44 |      96 |   91.58 | ...68,483,521-523 
  ...oordinator.ts |     100 |    98.21 |     100 |     100 | 176               
 ...kspace-service |   89.11 |    86.15 |   90.69 |   89.11 |                   
  index.ts         |   88.66 |    85.77 |   89.47 |   88.66 | ...1286-1290,1293 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/services      |   92.48 |    89.33 |      98 |   92.48 |                   
  ...mandLoader.ts |     100 |    88.88 |     100 |     100 | 105-118           
  ...killLoader.ts |   97.19 |    85.29 |     100 |   97.19 | 142,153-154       
  ...andService.ts |   98.73 |      100 |     100 |   98.73 | 107               
  ...mandLoader.ts |   86.83 |    83.87 |     100 |   86.83 | ...30-335,340-345 
  ...omptLoader.ts |   79.55 |    88.29 |   83.33 |   79.55 | ...48,178,245-246 
  ...mandLoader.ts |   97.77 |    92.15 |     100 |   97.77 | 176,183-184       
  ...nd-factory.ts |   91.42 |    91.66 |     100 |   91.42 | 128,137-144       
  ...ation-tool.ts |     100 |    95.45 |     100 |     100 | 125               
  ...ndMetadata.ts |   98.23 |    96.72 |     100 |   98.23 | 83,87             
  commandUtils.ts  |      96 |     90.9 |     100 |      96 | 48                
  ...and-parser.ts |   90.69 |    85.71 |     100 |   90.69 | 63-66             
  ...ionService.ts |     100 |      100 |     100 |     100 |                   
  prompt-stash.ts  |   96.66 |    92.85 |     100 |   96.66 | 34-35             
  ...tree-lease.ts |   88.23 |    86.48 |     100 |   88.23 | ...94-199,232-233 
  ...low-loader.ts |     100 |    96.15 |     100 |     100 | 88                
  setup-github.ts  |    90.8 |    80.95 |     100 |    90.8 | ...49-450,457-458 
  ...-args-file.ts |   93.93 |    91.66 |    87.5 |   93.93 | 208-210,224-230   
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...e-keyterms.ts |   98.64 |    95.89 |     100 |   98.64 | 116,142-143       
  voice-model.ts   |     100 |      100 |     100 |     100 |                   
  voice-service.ts |    90.4 |    87.87 |     100 |    90.4 | ...81,288,353-358 
  ...e-settings.ts |     100 |    95.23 |     100 |     100 | 19                
  ...ranscriber.ts |   91.77 |    87.11 |   97.22 |   91.77 | ...99-901,904-906 
 ...rvices/insight |     100 |      100 |     100 |     100 |                   
  dates.ts         |     100 |      100 |     100 |     100 |                   
 ...ght/generators |   88.91 |    86.29 |   96.15 |   88.91 |                   
  DataProcessor.ts |   88.28 |    86.24 |   94.73 |   88.28 | ...1352,1356-1363 
  ...tGenerator.ts |   98.24 |    85.71 |     100 |   98.24 | 47                
  ...teRenderer.ts |     100 |      100 |     100 |     100 |                   
 .../insight/types |       0 |       50 |      50 |       0 |                   
  ...sightTypes.ts |       0 |        0 |       0 |       0 |                   
  ...sightTypes.ts |       0 |        0 |       0 |       0 | 1                 
 ...mpt-processors |   97.27 |    94.04 |     100 |   97.27 |                   
  ...tProcessor.ts |     100 |      100 |     100 |     100 |                   
  ...eProcessor.ts |   94.52 |    84.21 |     100 |   94.52 | 46-47,93-94       
  ...tionParser.ts |     100 |      100 |     100 |     100 |                   
  ...lProcessor.ts |   97.41 |    95.65 |     100 |   97.41 | 95-98             
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/services/tips |   97.27 |    84.61 |     100 |   97.27 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  tipHistory.ts    |   92.59 |       70 |     100 |   92.59 | ...24,146,153,162 
  tipRegistry.ts   |     100 |      100 |     100 |     100 |                   
  tipScheduler.ts  |     100 |    91.66 |     100 |     100 | 55                
 src/startup       |   88.99 |    83.47 |    90.9 |   88.99 |                   
  ...p-prefetch.ts |   98.09 |    94.23 |    87.5 |   98.09 | 50,209,225-226    
  ...reeStartup.ts |   80.53 |     74.6 |     100 |   80.53 | ...94,403,409-412 
 src/test-utils    |   94.09 |    79.16 |   77.77 |   94.09 |                   
  ci-env.ts        |      88 |     62.5 |     100 |      88 | 22-23,28          
  ...omMatchers.ts |   69.69 |       50 |      50 |   69.69 | 32-35,37-39,45-47 
  ...mised-lock.ts |     100 |      100 |   66.66 |     100 |                   
  ...andContext.ts |     100 |      100 |     100 |     100 |                   
  render.tsx       |     100 |      100 |     100 |     100 |                   
 src/ui            |   72.78 |    75.23 |   65.16 |   72.78 |                   
  App.tsx          |   33.33 |       75 |   33.33 |   33.33 | 32-86             
  AppContainer.tsx |   74.01 |    72.14 |   68.57 |   74.01 | ...4112,4228-4234 
  ...tionNudge.tsx |    9.58 |      100 |       0 |    9.58 | 24-94             
  ...ackDialog.tsx |    30.3 |      100 |       0 |    30.3 | 26-76             
  ...tionNudge.tsx |    7.69 |      100 |       0 |    7.69 | 25-103            
  colors.ts        |      60 |      100 |   35.29 |      60 | ...52,54-55,60-61 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  keyMatchers.ts   |   95.91 |    97.14 |     100 |   95.91 | 25-26             
  ...tic-colors.ts |     100 |      100 |     100 |     100 |                   
  ...ractiveUI.tsx |   68.12 |    64.86 |   33.33 |   68.12 | ...98,321,341-346 
  ...inePresets.ts |   96.27 |    83.87 |     100 |   96.27 | ...97,402,410-412 
  textConstants.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/ui/auth       |   58.53 |    66.18 |   51.06 |   58.53 |                   
  AuthDialog.tsx   |   59.01 |     42.1 |   16.66 |   59.01 | ...25,332-354,358 
  ...nProgress.tsx |       0 |        0 |       0 |       0 | 1-64              
  ...etupSteps.tsx |   60.21 |    70.73 |   57.69 |   60.21 | ...90,794,803,806 
  useAuth.ts       |    94.6 |    73.52 |     100 |    94.6 | ...21-222,241-247 
  ...rSetupFlow.ts |   43.18 |    33.33 |      50 |   43.18 | ...78-399,416-459 
 src/ui/commands   |   82.55 |    82.88 |   89.15 |   82.55 |                   
  aboutCommand.ts  |     100 |      100 |     100 |     100 |                   
  agentsCommand.ts |   83.78 |      100 |      60 |   83.78 | 30-32,42-44       
  ...odeCommand.ts |    93.1 |    95.23 |     100 |    93.1 | 77-82             
  arenaCommand.ts  |   63.89 |    65.71 |   65.21 |   63.89 | ...01-606,691-699 
  authCommand.ts   |     100 |      100 |     100 |     100 |                   
  branchCommand.ts |     100 |      100 |     100 |     100 |                   
  btwCommand.ts    |   94.32 |    77.41 |     100 |   94.32 | 35-36,114-119     
  bugCommand.ts    |     100 |    77.77 |     100 |     100 | 27,61             
  cdCommand.ts     |    92.3 |    82.75 |     100 |    92.3 | ...,94-99,178,187 
  clearCommand.ts  |    80.9 |    70.83 |     100 |    80.9 | ...24-125,133-142 
  ...essCommand.ts |   68.06 |    54.05 |      75 |   68.06 | ...96-197,211-214 
  ...astCommand.ts |   84.17 |       75 |     100 |   84.17 | ...,91-97,125-130 
  ...ig-command.ts |   93.12 |    88.42 |     100 |   93.12 | ...07-315,321-323 
  ...extCommand.ts |   68.28 |    70.14 |   84.61 |   68.28 | ...66-599,610-611 
  copyCommand.ts   |    98.7 |    96.29 |     100 |    98.7 | 66-67,172,272,323 
  ...or-command.ts |   85.95 |    80.55 |   88.88 |   85.95 | ...68-274,298-309 
  deleteCommand.ts |     100 |      100 |     100 |     100 |                   
  diffCommand.ts   |     100 |    87.87 |     100 |     100 | ...63,231-232,245 
  ...ryCommand.tsx |   81.64 |    87.67 |    90.9 |   81.64 | ...73-278,325-332 
  docsCommand.ts   |     100 |     90.9 |     100 |     100 | 25                
  doctorCommand.ts |   65.37 |    81.88 |   94.11 |   65.37 | ...85-535,538-672 
  dreamCommand.ts  |   85.45 |    88.88 |     100 |   85.45 | 58-65             
  editorCommand.ts |     100 |      100 |     100 |     100 |                   
  ...rt-command.ts |   82.97 |    78.57 |     100 |   82.97 | 47-52,67-70,91-96 
  exportCommand.ts |   98.25 |    91.02 |     100 |   98.25 | ...81,198-199,364 
  ...onsCommand.ts |   52.31 |    56.25 |   69.23 |   52.31 | ...09,277-329,390 
  forgetCommand.ts |     100 |       90 |     100 |     100 | 59                
  forkCommand.ts   |     100 |    94.11 |     100 |     100 | 96,147            
  goalCommand.ts   |   72.81 |    86.84 |   66.66 |   72.81 | ...63-168,277-280 
  helpCommand.ts   |     100 |      100 |     100 |     100 |                   
  ...oryCommand.ts |     100 |      100 |     100 |     100 |                   
  hooksCommand.ts  |   81.13 |    65.71 |   85.71 |   81.13 | ...,86-93,131-132 
  ideCommand.ts    |   60.75 |    64.28 |   41.17 |   60.75 | ...05-306,310-324 
  ...figCommand.ts |   52.83 |    81.25 |      70 |   52.83 | ...74-319,321-330 
  initCommand.ts   |   91.86 |       80 |     100 |   91.86 | 48,83-88          
  ...ghtCommand.ts |   77.87 |    71.42 |     100 |   77.87 | ...44-245,250-272 
  ...ageCommand.ts |   94.44 |    90.14 |     100 |   94.44 | ...13-214,241-251 
  learn-command.ts |     100 |      100 |     100 |     100 |                   
  lspCommand.ts    |     100 |    86.95 |     100 |     100 | 31,101-102        
  mcpCommand.ts    |     100 |      100 |     100 |     100 |                   
  memoryCommand.ts |     100 |      100 |     100 |     100 |                   
  modelCommand.ts  |   84.78 |    82.47 |     100 |   84.78 | ...1071,1105-1110 
  ...onsCommand.ts |     100 |      100 |     100 |     100 |                   
  planCommand.ts   |   78.82 |    76.92 |     100 |   78.82 | 30-35,51-56,68-73 
  quitCommand.ts   |     100 |      100 |     100 |     100 |                   
  recapCommand.ts  |   21.81 |      100 |      50 |   21.81 | 24-73             
  ...ns-command.ts |   98.83 |    81.81 |     100 |   98.83 | 100               
  ...berCommand.ts |     100 |     87.5 |     100 |     100 | 46                
  renameCommand.ts |   89.06 |    88.37 |     100 |   89.06 | ...72-176,202-209 
  ...oreCommand.ts |   90.96 |    86.04 |     100 |   90.96 | ...41-146,177-178 
  resumeCommand.ts |     100 |      100 |     100 |     100 |                   
  rewindCommand.ts |   81.25 |      100 |      50 |   81.25 | 20-22             
  ...ngsCommand.ts |     100 |      100 |     100 |     100 |                   
  ...hubCommand.ts |   89.47 |       75 |      80 |   89.47 | 54-59             
  skillsCommand.ts |   78.82 |    81.81 |     100 |   78.82 | 37-52,78,97       
  statsCommand.ts  |   90.65 |    76.73 |     100 |   90.65 | ...30-733,825-832 
  ...ineCommand.ts |     100 |      100 |     100 |     100 |                   
  ...aryCommand.ts |   73.04 |     82.3 |      90 |   73.04 | ...20-547,561-565 
  tasksCommand.ts  |   77.22 |    72.13 |     100 |   77.22 | ...46-150,172-177 
  ...tupCommand.ts |     100 |      100 |     100 |     100 |                   
  themeCommand.ts  |     100 |      100 |     100 |     100 |                   
  toolsCommand.ts  |     100 |      100 |     100 |     100 |                   
  trustCommand.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...te-command.ts |     100 |    94.11 |     100 |     100 | 74,148            
  vimCommand.ts    |   54.54 |      100 |      50 |   54.54 | 19-29             
  voice-command.ts |   93.57 |       88 |     100 |   93.57 | 35,97-102         
  ...owsCommand.ts |   91.86 |    78.87 |   66.66 |   91.86 | ...60-161,170-175 
 src/ui/components |   71.39 |    78.73 |   79.85 |   71.39 |                   
  AboutBox.tsx     |     100 |      100 |     100 |     100 |                   
  AnsiOutput.tsx   |   65.57 |      100 |      50 |   65.57 | 69-90             
  ApiKeyInput.tsx  |       0 |        0 |       0 |       0 | 1-97              
  AppHeader.tsx    |    88.7 |       75 |     100 |    88.7 | 36,38-43,45       
  ...odeDialog.tsx |   87.24 |    72.22 |   33.33 |   87.24 | ...85,233-238,245 
  AsciiArt.ts      |     100 |      100 |     100 |     100 |                   
  ...Indicator.tsx |   95.65 |    66.66 |     100 |   95.65 | 27,52             
  ...TextInput.tsx |   88.65 |    90.41 |     100 |   88.65 | ...84-286,300-302 
  Composer.tsx     |   94.49 |    66.66 |     100 |   94.49 | ...-72,84,139,153 
  ...entPrompt.tsx |     100 |      100 |     100 |     100 |                   
  ...ryDisplay.tsx |   75.89 |    62.06 |     100 |   75.89 | ...,88,93-108,113 
  ...geDisplay.tsx |   68.42 |    57.14 |     100 |   68.42 | 16-17,31-32,42-50 
  CronPill.tsx     |     100 |    93.75 |     100 |     100 | 19                
  ...ification.tsx |      84 |       60 |     100 |      84 | 23-24,40-42       
  ...gProfiler.tsx |       0 |        0 |       0 |       0 | 1-36              
  ...ogManager.tsx |       0 |        0 |       0 |       0 | 1-598             
  DiffDialog.tsx   |    53.5 |     37.5 |   69.23 |    53.5 | ...32-737,747-760 
  ...ngsDialog.tsx |       0 |        0 |       0 |       0 | 1-195             
  EffortDialog.tsx |   97.36 |      100 |     100 |   97.36 | 55-56             
  ExitWarning.tsx  |     100 |      100 |     100 |     100 |                   
  ...hProgress.tsx |    87.8 |    33.33 |     100 |    87.8 | 28-31,56          
  ...ustDialog.tsx |     100 |      100 |     100 |     100 |                   
  Footer.tsx       |   74.09 |     61.4 |      50 |   74.09 | ...55-260,278-282 
  ...ngSpinner.tsx |   68.42 |    85.71 |      50 |   68.42 | 35-52,73,80-81    
  GoalPill.tsx     |   93.51 |    81.81 |     100 |   93.51 | 37-38,106-109,123 
  Header.tsx       |   98.65 |    94.73 |     100 |   98.65 | 173,175           
  Help.tsx         |   98.33 |       90 |     100 |   98.33 | ...25,382,448-449 
  ...emDisplay.tsx |   79.28 |    66.33 |     100 |   79.28 | ...08,511,514-520 
  ...ngeDialog.tsx |     100 |      100 |     100 |     100 |                   
  InputPrompt.tsx  |    83.1 |    81.95 |      80 |    83.1 | ...2199,2225,2299 
  ...Shortcuts.tsx |     100 |       88 |     100 |     100 | 98,119            
  ...Indicator.tsx |   98.18 |    97.82 |     100 |   98.18 | 161-162           
  ...firmation.tsx |   91.42 |      100 |      50 |   91.42 | 26-31             
  MainContent.tsx  |    95.9 |    92.53 |      50 |    95.9 | ...99,445-449,452 
  MemoryDialog.tsx |   86.59 |    80.15 |     100 |   86.59 | ...34-435,485,553 
  ...geDisplay.tsx |       0 |        0 |       0 |       0 | 1-41              
  ModelDialog.tsx  |   81.95 |    71.27 |     100 |   81.95 | ...1045,1050-1066 
  ...tsDisplay.tsx |     100 |    97.22 |     100 |     100 | 270               
  ...fications.tsx |       0 |        0 |       0 |       0 | 1-56              
  ...onsDialog.tsx |       0 |        0 |       0 |       0 | 1-1004            
  ...ryDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...icePrompt.tsx |   92.64 |    85.71 |     100 |   92.64 | 102-106,134-139   
  PrepareLabel.tsx |   91.66 |    77.27 |     100 |   91.66 | 73-75,77-79,110   
  ...atePrompt.tsx |       0 |        0 |       0 |       0 | 1-134             
  ...geDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...ngDisplay.tsx |       0 |        0 |       0 |       0 | 1-39              
  ...hProgress.tsx |   85.25 |    88.46 |     100 |   85.25 | 121-147           
  ...dSelector.tsx |   92.79 |    82.65 |     100 |   92.79 | ...19-323,354-370 
  ...ionPicker.tsx |   83.66 |    72.13 |     100 |   83.66 | ...96,402,444-466 
  ...onPreview.tsx |   93.58 |    83.78 |     100 |   93.58 | ...,70-71,195-197 
  ...ryDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...putPrompt.tsx |   92.06 |    86.36 |   83.33 |   92.06 | ...,70-72,120-123 
  ...tedDialog.tsx |     100 |      100 |     100 |     100 |                   
  ...ngsDialog.tsx |   71.49 |    73.89 |   69.23 |   71.49 | ...1244,1250-1251 
  ...ionDialog.tsx |    92.3 |    96.15 |   33.33 |    92.3 | 60-63,68-75,164   
  ...putPrompt.tsx |    15.9 |      100 |       0 |    15.9 | 20-63             
  ...Indicator.tsx |   57.14 |      100 |       0 |   57.14 | 12-15             
  ...MoreLines.tsx |       0 |        0 |       0 |       0 | 1-40              
  ...iewDialog.tsx |   97.77 |    87.67 |     100 |   97.77 | ...97,305-307,324 
  ...tsDisplay.tsx |   95.86 |       75 |     100 |   95.86 | 67-71             
  ...ionPicker.tsx |       0 |        0 |       0 |       0 | 1-172             
  ...tivityTab.tsx |    3.94 |      100 |       0 |    3.94 | 27-275            
  StatsDialog.tsx  |    8.64 |      100 |       0 |    8.64 | ...76-111,130-322 
  StatsDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...ciencyTab.tsx |    78.9 |    56.52 |     100 |    78.9 | ...26,213,262-288 
  ...atmapView.tsx |    8.98 |      100 |       0 |    8.98 | 20-107            
  ...essionTab.tsx |      80 |    66.66 |     100 |      80 | ...70-277,283-300 
  ...ineDialog.tsx |    93.5 |    85.18 |     100 |    93.5 | ...05,267,287-289 
  ...yTodoList.tsx |   96.36 |    88.23 |     100 |   96.36 | 138-141           
  ...nsDisplay.tsx |   92.97 |    83.87 |     100 |   92.97 | ...45,248,275-277 
  ...inalImage.tsx |     100 |    93.93 |     100 |     100 | 75,129            
  ThemeDialog.tsx  |   89.95 |    46.15 |      75 |   89.95 | ...71-173,243-245 
  Tips.tsx         |   93.54 |       75 |     100 |   93.54 | 39-40             
  TodoDisplay.tsx  |     100 |      100 |     100 |     100 |                   
  ...tsDisplay.tsx |     100 |     87.5 |     100 |     100 | 31-32             
  TrustDialog.tsx  |     100 |    83.33 |     100 |     100 | 72-87             
  ...ification.tsx |   36.36 |      100 |       0 |   36.36 | 15-22             
  ...Indicator.tsx |    92.5 |     87.5 |     100 |    92.5 | 50-53             
  ...ackDialog.tsx |       0 |        0 |       0 |       0 | 1-134             
  ...xitDialog.tsx |   80.36 |    43.47 |      60 |   80.36 | ...24-238,248-251 
  ...odeVisuals.ts |   97.22 |    85.71 |     100 |   97.22 | 25                
  ...s-helpers.tsx |   66.25 |    81.25 |      50 |   66.25 | 25-32,46-53,62-72 
 ...nts/agent-view |   55.05 |    69.09 |      50 |   55.05 |                   
  ...atContent.tsx |    9.09 |      100 |       0 |    9.09 | 54-275,281-283    
  ...tChatView.tsx |   21.05 |      100 |       0 |   21.05 | 21-39             
  ...tComposer.tsx |   69.48 |    33.33 |   66.66 |   69.48 | ...51,269,277-279 
  AgentFooter.tsx  |   15.38 |      100 |       0 |   15.38 | 28-65             
  AgentHeader.tsx  |   15.38 |      100 |       0 |   15.38 | 27-64             
  AgentTabBar.tsx  |    87.9 |    63.88 |     100 |    87.9 | ...88,110-118,136 
  ...oryAdapter.ts |     100 |    91.83 |     100 |     100 | 103,109-110,138   
  index.ts         |       0 |        0 |       0 |       0 | 1-12              
 ...mponents/arena |    42.3 |    68.69 |   73.68 |    42.3 |                   
  ArenaCards.tsx   |   73.06 |    71.79 |   85.71 |   73.06 | ...83-185,321-326 
  ...ectDialog.tsx |   83.48 |    69.86 |   88.88 |   83.48 | ...88-392,409-410 
  ...artDialog.tsx |       0 |        0 |       0 |       0 | 1-166             
  ...tusDialog.tsx |       0 |        0 |       0 |       0 | 1-288             
  ...topDialog.tsx |       0 |        0 |       0 |       0 | 1-213             
 ...ackground-view |   82.95 |    81.71 |   92.72 |   82.95 |                   
  ...sksDialog.tsx |   78.73 |    77.65 |   84.61 |   78.73 | ...1809,1833-1839 
  ...TasksPill.tsx |   67.74 |    86.66 |     100 |   67.74 | ...04-124,132-140 
  ...gentPanel.tsx |   97.08 |    86.31 |     100 |   97.08 | 132,442-446,520   
  agent-forest.ts  |    99.2 |    93.93 |     100 |    99.2 | 258               
  ...Visibility.ts |     100 |      100 |     100 |     100 |                   
  ...e-overlay.tsx |    88.2 |    76.47 |     100 |    88.2 | ...36-138,140-142 
 ...nts/extensions |   84.32 |    76.78 |   83.33 |   84.32 |                   
  ...gerDialog.tsx |   82.15 |    76.08 |     100 |   82.15 | ...91-198,258,260 
  TabBar.tsx       |   97.29 |    88.88 |     100 |   97.29 | 33                
  index.ts         |       0 |        0 |       0 |       0 | 1-12              
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...tensions/steps |   46.26 |       85 |   58.82 |   46.26 |                   
  ...ctionStep.tsx |   95.12 |    92.85 |   85.71 |   95.12 | 84-86,89          
  ...etailStep.tsx |       0 |        0 |       0 |       0 | 1-145             
  ...nListStep.tsx |   75.26 |    88.37 |   66.66 |   75.26 | ...53,174,203-209 
  ...electStep.tsx |       0 |        0 |       0 |       0 | 1-83              
  ...nfirmStep.tsx |   16.32 |      100 |       0 |   16.32 | 28-74             
  index.ts         |       0 |        0 |       0 |       0 | 1-11              
 ...xtensions/tabs |   71.92 |    68.21 |   70.83 |   71.92 |                   
  DiscoverTab.tsx  |   68.22 |    67.66 |   55.55 |   68.22 | ...93,656-660,664 
  InstalledTab.tsx |   75.49 |    67.44 |   83.33 |   75.49 | ...77,782-783,820 
  SourcesTab.tsx   |   71.67 |    70.47 |   77.77 |   71.67 | ...28,547,621-633 
 ...tensions/views |   50.97 |    52.38 |   20.83 |   50.97 |                   
  ...tionsView.tsx |   73.75 |    56.36 |   66.66 |   73.75 | ...30,353,369-374 
  ...tionsView.tsx |   43.45 |    44.82 |    6.66 |   43.45 | ...98-405,408-420 
  ...etailView.tsx |    9.56 |      100 |       0 |    9.56 | 40-67,70-158      
 ...mponents/hooks |   87.11 |    81.37 |   91.89 |   87.11 |                   
  ...rListBody.tsx |   95.29 |    85.18 |     100 |   95.29 | 95-98             
  ...etailStep.tsx |   75.32 |    71.42 |      60 |   75.32 | ...56-169,173-186 
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...rListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...entHeader.tsx |     100 |    85.71 |     100 |     100 | 47                
  ...rListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...abledStep.tsx |     100 |      100 |     100 |     100 |                   
  ...sListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...entDialog.tsx |   72.29 |    70.49 |     100 |   72.29 | ...51,563-568,572 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-13              
  ...erGrouping.ts |     100 |      100 |     100 |     100 |                   
  sourceLabels.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...components/mcp |   40.04 |    61.53 |   70.58 |   40.04 |                   
  ...ealthPill.tsx |   68.42 |    85.71 |     100 |   68.42 | 40-46             
  ...entDialog.tsx |   32.09 |    26.19 |      40 |   32.09 | ...12,914,927-933 
  ...valDialog.tsx |   15.06 |      100 |       0 |   15.06 | 40-109            
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-35              
  types.ts         |     100 |      100 |     100 |     100 |                   
  utils.ts         |      97 |       95 |     100 |      97 | 24,113-114        
 ...ents/mcp/steps |   53.94 |    73.51 |   57.14 |   53.94 |                   
  ...icateStep.tsx |    5.65 |      100 |       0 |    5.65 | 40-66,69-308      
  ...electStep.tsx |   10.95 |      100 |       0 |   10.95 | 16-88             
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...eListStep.tsx |   99.09 |    97.36 |     100 |   99.09 | 71                
  ...etailStep.tsx |   62.83 |       60 |   33.33 |   62.83 | ...87-296,307-332 
  ...rListStep.tsx |   88.53 |    81.25 |     100 |   88.53 | ...64,170,175-180 
  ...etailStep.tsx |    10.3 |      100 |       0 |    10.3 | ...1,67-79,82-140 
  ToolListStep.tsx |   69.29 |       50 |     100 |   69.29 | ...23,126,135-144 
 ...nents/messages |   90.11 |    86.69 |   85.43 |   90.11 |                   
  ...ionDialog.tsx |   89.23 |     84.9 |   81.81 |   89.23 | ...75,593,611-613 
  BtwMessage.tsx   |     100 |      100 |     100 |     100 |                   
  ...upDisplay.tsx |     100 |    94.73 |     100 |     100 | ...43,289,402,432 
  ...onMessage.tsx |   92.06 |    82.35 |     100 |   92.06 | 58-60,62,64       
  ...nMessages.tsx |   94.11 |    95.91 |   76.92 |   94.11 | ...47-349,352-355 
  DiffRenderer.tsx |   93.17 |    86.02 |     100 |   93.17 | ...07,235-236,302 
  ...tsDisplay.tsx |   97.08 |    77.77 |     100 |   97.08 | 95,97,106         
  ...usMessage.tsx |   81.73 |     65.9 |      75 |   81.73 | ...10-214,222,245 
  ...tsDisplay.tsx |   95.52 |    88.31 |     100 |   95.52 | ...40,142,175-180 
  ...ssMessage.tsx |    12.5 |      100 |       0 |    12.5 | 18-59             
  ...edMessage.tsx |   21.05 |      100 |       0 |   21.05 | 23-39             
  ...sMessages.tsx |   59.04 |       50 |    37.5 |   59.04 | ...21-126,147-159 
  ...ryMessage.tsx |   13.63 |      100 |       0 |   13.63 | 23-64             
  ...onMessage.tsx |   91.38 |    81.02 |     100 |   91.38 | ...33-635,642-644 
  ...upMessage.tsx |   98.38 |    95.38 |     100 |   98.38 | 188-191,422       
  ToolMessage.tsx  |   92.87 |    86.17 |   93.33 |   92.87 | ...1009,1036-1038 
 ...ponents/shared |   85.79 |    81.94 |   94.11 |   85.79 |                   
  ...ctionList.tsx |     100 |      100 |      75 |     100 |                   
  ...tonSelect.tsx |     100 |      100 |     100 |     100 |                   
  EnumSelector.tsx |     100 |    96.42 |     100 |     100 | 58                
  ...rBoundary.tsx |     100 |      100 |     100 |     100 |                   
  MaxSizedBox.tsx  |   84.71 |    86.86 |      90 |   84.71 | ...67-568,685-686 
  MultiSelect.tsx  |   93.58 |       75 |     100 |   93.58 | ...43,199-201,211 
  ...tonSelect.tsx |     100 |      100 |     100 |     100 |                   
  ...ontroller.tsx |     100 |    83.33 |     100 |     100 | 73,93-95          
  ...eSelector.tsx |     100 |       60 |     100 |     100 | 40-45             
  ...lableList.tsx |   81.48 |    84.84 |     100 |   81.48 | 46-66,73-76       
  StaticRender.tsx |   72.72 |      100 |     100 |   72.72 | 31-33             
  TextInput.tsx    |    80.8 |    67.24 |      80 |    80.8 | ...36-240,252-258 
  ...ontroller.tsx |     100 |    81.81 |     100 |     100 | 59-62             
  ...apsedTime.tsx |     100 |      100 |     100 |     100 |                   
  ...Indicator.tsx |     100 |      100 |     100 |     100 |                   
  ...lizedList.tsx |   88.51 |    83.75 |   81.81 |   88.51 | ...51-779,792,887 
  text-buffer.ts   |   85.98 |    81.81 |   97.91 |   85.98 | ...2664,2762-2763 
  ...er-actions.ts |   73.93 |    67.22 |     100 |   73.93 | ...32-733,934-936 
 ...ponents/skills |       0 |        0 |       0 |       0 |                   
  ...gerDialog.tsx |       0 |        0 |       0 |       0 | 1-681             
 ...ents/subagents |       0 |        0 |       0 |       0 |                   
  constants.ts     |       0 |        0 |       0 |       0 | 1-71              
  index.ts         |       0 |        0 |       0 |       0 | 1-11              
  reducers.tsx     |       0 |        0 |       0 |       0 | 1-190             
  types.ts         |       0 |        0 |       0 |       0 | 1-125             
  utils.ts         |       0 |        0 |       0 |       0 | 1-102             
 ...bagents/create |       0 |        0 |       0 |       0 |                   
  ...ionWizard.tsx |       0 |        0 |       0 |       0 | 1-299             
  ...rSelector.tsx |       0 |        0 |       0 |       0 | 1-85              
  ...onSummary.tsx |       0 |        0 |       0 |       0 | 1-331             
  ...tionInput.tsx |       0 |        0 |       0 |       0 | 1-177             
  ...dSelector.tsx |       0 |        0 |       0 |       0 | 1-63              
  ...nSelector.tsx |       0 |        0 |       0 |       0 | 1-58              
  ...EntryStep.tsx |       0 |        0 |       0 |       0 | 1-78              
  ToolSelector.tsx |       0 |        0 |       0 |       0 | 1-253             
 ...bagents/manage |   14.14 |    53.19 |    37.5 |   14.14 |                   
  ...ctionStep.tsx |       0 |        0 |       0 |       0 | 1-103             
  ...eleteStep.tsx |       0 |        0 |       0 |       0 | 1-62              
  ...tEditStep.tsx |       0 |        0 |       0 |       0 | 1-124             
  ...ctionStep.tsx |   35.61 |    59.52 |     100 |   35.61 | ...21-433,438-440 
  ...iewerStep.tsx |       0 |        0 |       0 |       0 | 1-73              
  ...gerDialog.tsx |       0 |        0 |       0 |       0 | 1-341             
 ...mponents/views |   69.81 |    72.64 |   61.11 |   69.81 |                   
  ContextUsage.tsx |   70.88 |    63.88 |      80 |   70.88 | ...20-426,463-557 
  DoctorReport.tsx |     9.8 |      100 |       0 |     9.8 | 25-54,57-131      
  ...sionsList.tsx |   88.05 |       75 |     100 |   88.05 | 70-77             
  McpStatus.tsx    |   92.01 |     73.8 |     100 |   92.01 | ...36,175-177,262 
  SkillsList.tsx   |   20.51 |      100 |       0 |   20.51 | 17-20,27-57       
  ToolsList.tsx    |     100 |      100 |     100 |     100 |                   
 src/ui/contexts   |   83.96 |    81.62 |    86.3 |   83.96 |                   
  ...ewContext.tsx |   64.83 |    88.88 |      50 |   64.83 | ...16-219,225-235 
  AppContext.tsx   |      80 |       50 |     100 |      80 | 19-20             
  ...ewContext.tsx |   92.45 |    62.79 |      50 |   92.45 | ...69-270,272-276 
  ...igContext.tsx |   81.81 |       50 |     100 |   81.81 | 15-16             
  ...ssContext.tsx |   85.65 |    84.85 |     100 |   85.65 | ...1612-1614,1620 
  ...owContext.tsx |   91.07 |    81.81 |     100 |   91.07 | 47-48,60-62       
  ...deContext.tsx |     100 |      100 |      50 |     100 |                   
  ...onContext.tsx |   80.77 |       80 |    92.3 |   80.77 | ...31-434,443-446 
  ...gsContext.tsx |     100 |      100 |     100 |     100 |                   
  ...usContext.tsx |     100 |      100 |     100 |     100 |                   
  ...ngContext.tsx |   71.42 |       50 |     100 |   71.42 | 17-20             
  ...utContext.tsx |   85.71 |      100 |   66.66 |   85.71 | 13-14             
  ...edContext.tsx |     100 |      100 |      50 |     100 |                   
  ...nsContext.tsx |   88.88 |       50 |     100 |   88.88 | 156-157           
  ...teContext.tsx |   86.66 |       50 |     100 |   86.66 | 235-236           
  ...deContext.tsx |      80 |     87.5 |      75 |      80 | ...11-112,118-120 
  ...rtContext.tsx |     100 |      100 |     100 |     100 |                   
 src/ui/daemon     |   88.35 |    73.51 |   95.45 |   88.35 |                   
  ...ui-adapter.ts |   88.35 |    73.51 |   95.45 |   88.35 | ...74,792-793,879 
 src/ui/editors    |       0 |        0 |       0 |       0 |                   
  ...ngsManager.ts |       0 |        0 |       0 |       0 | 1-67              
 src/ui/hooks      |   85.57 |    82.91 |   88.04 |   85.57 |                   
  ...dProcessor.ts |   85.53 |    85.13 |     100 |   85.53 | ...-970,1017-1018 
  ...ention-ref.ts |   97.72 |       84 |     100 |   97.72 | 65                
  keyToAnsi.ts     |    3.92 |      100 |       0 |    3.92 | 19-77             
  ...esourceRef.ts |     100 |      100 |     100 |     100 |                   
  ...completion.ts |     100 |    95.45 |     100 |     100 | 95                
  ...ention-ref.ts |     100 |      100 |     100 |     100 |                   
  ...dProcessor.ts |   94.62 |    73.58 |     100 |   94.62 | ...86-287,292-293 
  ...dProcessor.ts |   85.65 |    68.16 |   81.81 |   85.65 | ...1455,1476-1480 
  ...rt-command.ts |     100 |      100 |     100 |     100 |                   
  ...sced-flush.ts |     100 |      100 |     100 |     100 |                   
  ...ng-enabled.ts |     100 |      100 |     100 |     100 |                   
  ...oice-input.ts |   92.36 |    81.95 |   66.66 |   92.36 | ...00,502-503,658 
  ...ke-repaint.ts |     100 |      100 |     100 |     100 |                   
  ...amingState.ts |   12.22 |      100 |       0 |   12.22 | 54-157            
  ...agerDialog.ts |   88.23 |      100 |     100 |   88.23 | 20,24             
  ...dScrollbar.ts |     100 |      100 |     100 |     100 |                   
  ...ationFrame.ts |      52 |    63.63 |     100 |      52 | ...59,67-70,76-87 
  ...odeCommand.ts |   58.82 |      100 |     100 |   58.82 | 28,33-48          
  ...enaCommand.ts |      85 |      100 |     100 |      85 | 23-24,29          
  ...aInProcess.ts |   27.92 |       80 |      25 |   27.92 | ...69-170,173-175 
  ...Completion.ts |   86.44 |    88.48 |     100 |   86.44 | ...14-515,525-541 
  ...ifications.ts |   87.82 |    96.77 |     100 |   87.82 | 138-152           
  ...tIndicator.ts |   88.28 |    81.57 |     100 |   88.28 | ...66,175,179-187 
  ...waySummary.ts |   96.26 |       75 |     100 |   96.26 | 126-128,170       
  ...ndTaskView.ts |   94.81 |    76.59 |     100 |   94.81 | 162-166,255,261   
  ...chedScroll.ts |     100 |      100 |     100 |     100 |                   
  ...ketedPaste.ts |    23.8 |      100 |       0 |    23.8 | 19-37             
  ...nchCommand.ts |   95.45 |    83.01 |     100 |   95.45 | ...60-161,285-288 
  ...ompletion.tsx |   97.09 |    87.09 |     100 |   97.09 | ...23-324,334-335 
  ...dMigration.ts |    92.1 |    88.88 |     100 |    92.1 | 42-44             
  useCompletion.ts |   96.29 |    90.56 |     100 |   96.29 | ...17-218,222-223 
  ...nitMessage.ts |     100 |      100 |     100 |     100 |                   
  ...extualTips.ts |   78.26 |       50 |     100 |   78.26 | ...2,75-79,96-104 
  ...eteCommand.ts |   89.52 |    90.69 |     100 |   89.52 | ...98-106,114-115 
  ...ialogClose.ts |   36.11 |       10 |     100 |   36.11 | ...89-195,202-207 
  useDiffData.ts   |       0 |        0 |       0 |       0 | 1-87              
  ...oublePress.ts |   53.12 |       75 |     100 |   53.12 | 33-35,41-54       
  ...orSettings.ts |     100 |      100 |     100 |     100 |                   
  ...Completion.ts |   99.12 |    97.67 |     100 |   99.12 | 182-183           
  ...ionUpdates.ts |   93.72 |    92.98 |     100 |   93.72 | ...87-291,314-320 
  ...agerDialog.ts |   88.88 |      100 |     100 |   88.88 | 21,25             
  ...backDialog.ts |    63.9 |    76.47 |   66.66 |    63.9 | ...66-168,190-191 
  useFocus.ts      |     100 |      100 |     100 |     100 |                   
  ...olderTrust.ts |     100 |    93.33 |     100 |     100 | 62                
  ...ggestions.tsx |   96.47 |    78.94 |     100 |   96.47 | 121,155-156       
  ...miniStream.ts |   85.97 |    81.12 |   76.92 |   85.97 | ...5165-5167,5169 
  ...BranchName.ts |     100 |    94.44 |     100 |     100 | 54                
  ...oryManager.ts |   98.38 |    98.85 |     100 |   98.38 | 141-144           
  ...ooksDialog.ts |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...stListener.ts |     100 |      100 |     100 |     100 |                   
  ...nAuthError.ts |   76.19 |       50 |     100 |   76.19 | 39-40,43-45       
  ...putHistory.ts |   92.59 |    85.71 |     100 |   92.59 | 63-64,72,94-96    
  ...storyStore.ts |     100 |    94.11 |     100 |     100 | 69                
  useKeypress.ts   |     100 |      100 |     100 |     100 |                   
  ...rdProtocol.ts |   36.36 |      100 |       0 |   36.36 | 24-31             
  ...unchEditor.ts |   22.58 |      100 |      50 |   22.58 | 11-32,44-85       
  ...gIndicator.ts |     100 |    96.66 |     100 |     100 | 109               
  useLogger.ts     |      16 |      100 |       0 |      16 | 15-45             
  useMCPHealth.ts  |   63.15 |       80 |      50 |   63.15 | 42-52,64-67       
  ...cpApproval.ts |   93.12 |    86.11 |     100 |   93.12 | ...24-127,139-140 
  useMcpDialog.ts  |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...moryDialog.ts |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...oryMonitor.ts |   83.14 |    78.57 |     100 |   83.14 | 54-63,74-79       
  ...ssageQueue.ts |     100 |     97.4 |     100 |     100 | 175,262           
  ...delCommand.ts |     100 |       96 |     100 |     100 | 61                
  ...ouseEvents.ts |   94.89 |       95 |   83.33 |   94.89 | 78-82             
  ...raseCycler.ts |   84.74 |    76.47 |     100 |   84.74 | ...49,52-53,69-71 
  ...rredEditor.ts |   58.33 |    22.22 |     100 |   58.33 | 23-27,29-33       
  ...derUpdates.ts |    87.4 |    78.78 |     100 |    87.4 | ...71,321-333,381 
  useQwenAuth.ts   |     100 |      100 |     100 |     100 |                   
  ...lScheduler.ts |   89.48 |    88.88 |     100 |   89.48 | ...54-456,489-499 
  ...oryCommand.ts |       0 |        0 |       0 |       0 | 1-7               
  ...umeCommand.ts |   95.26 |    77.14 |     100 |   95.26 | 120-121,223-228   
  ...ompletion.tsx |   90.67 |    83.33 |     100 |   90.67 | ...02,105,138-141 
  ...ectionList.ts |   97.12 |    96.26 |     100 |   97.12 | ...92-193,247-250 
  ...sionPicker.ts |   92.87 |    90.35 |     100 |   92.87 | ...99-501,503-505 
  ...earchInput.ts |     100 |    97.29 |     100 |     100 | 82                
  ...ngsCommand.ts |   18.75 |      100 |       0 |   18.75 | 10-25             
  ...ellHistory.ts |   93.28 |    80.95 |     100 |   93.28 | ...96,153-154,164 
  ...oryCommand.ts |   85.48 |    58.33 |     100 |   85.48 | 22-28,40,71       
  ...agerDialog.ts |   88.23 |      100 |     100 |   88.23 | 20,24             
  ...Completion.ts |   82.85 |    85.13 |   94.73 |   82.85 | ...78-680,688-724 
  ...tateAndRef.ts |     100 |      100 |     100 |     100 |                   
  ...tatsDialog.ts |     100 |      100 |     100 |     100 |                   
  useStatusLine.ts |   97.13 |    93.33 |     100 |   97.13 | ...78-382,478-485 
  ...eateDialog.ts |   88.23 |      100 |     100 |   88.23 | 14,18             
  ...mInProcess.ts |   27.35 |       80 |      25 |   27.35 | ...82-183,186-188 
  ...tification.ts |     100 |     87.5 |     100 |     100 | 50                
  ...alProgress.ts |   67.34 |    58.82 |   66.66 |   67.34 | 52-53,61-68,79-85 
  ...rminalSize.ts |     100 |      100 |     100 |     100 |                   
  ...emeCommand.ts |   67.01 |    29.41 |     100 |   67.01 | ...10-111,115-116 
  useTimer.ts      |   97.59 |    94.73 |     100 |   97.59 | 17-18             
  ...lMigration.ts |       0 |        0 |       0 |       0 |                   
  ...rustModify.ts |     100 |    90.47 |     100 |     100 | 112,134           
  useTurnDiffs.ts  |   95.12 |    78.57 |     100 |   95.12 | 133-134,156-157   
  ...elcomeBack.ts |   87.36 |     90.9 |     100 |   87.36 | ...,94-96,114-115 
  ...reeSession.ts |   93.75 |       70 |     100 |   93.75 | 47-48,72          
  vim.ts           |      74 |    67.56 |   69.23 |      74 | ...1854-1861,1869 
 src/ui/layouts    |    91.2 |    89.47 |     100 |    91.2 |                   
  ...AppLayout.tsx |    90.9 |     87.5 |     100 |    90.9 | 60-62,110-115,151 
  ...AppLayout.tsx |   91.66 |    92.85 |     100 |   91.66 | 75-80             
 src/ui/models     |   80.72 |       80 |   71.42 |   80.72 |                   
  ...ableModels.ts |   80.72 |       80 |   71.42 |   80.72 | ...,61-71,125-127 
 ...noninteractive |     100 |      100 |    6.66 |     100 |                   
  ...eractiveUi.ts |     100 |      100 |    6.66 |     100 |                   
 src/ui/selection  |   86.47 |    79.88 |   96.66 |   86.47 |                   
  screen-buffer.ts |   94.73 |    64.28 |     100 |   94.73 | 51-52             
  ...ion-coords.ts |     100 |      100 |     100 |     100 |                   
  ...ction-span.ts |   92.72 |       90 |     100 |   92.72 | 37-38,67-68       
  ...tion-state.ts |   85.71 |      100 |   88.88 |   85.71 | 51-58             
  ...ction-text.ts |   92.85 |    92.45 |     100 |   92.85 | 30-34,114-115     
  ...selection.tsx |   80.31 |    59.64 |     100 |   80.31 | ...13-314,330-331 
 src/ui/state      |      95 |    81.81 |     100 |      95 |                   
  extensions.ts    |      95 |    81.81 |     100 |      95 | 69-70,89          
 src/ui/themes     |    98.5 |    73.17 |     100 |    98.5 |                   
  ansi-light.ts    |     100 |      100 |     100 |     100 |                   
  ansi.ts          |     100 |      100 |     100 |     100 |                   
  atom-one-dark.ts |     100 |      100 |     100 |     100 |                   
  ayu-light.ts     |     100 |      100 |     100 |     100 |                   
  ayu.ts           |     100 |      100 |     100 |     100 |                   
  color-utils.ts   |   99.23 |    97.05 |     100 |   99.23 | 277-278           
  default-light.ts |     100 |      100 |     100 |     100 |                   
  default.ts       |     100 |      100 |     100 |     100 |                   
  ...inal-theme.ts |   88.59 |    85.96 |     100 |   88.59 | ...57-261,266-270 
  dracula.ts       |     100 |      100 |     100 |     100 |                   
  github-dark.ts   |     100 |      100 |     100 |     100 |                   
  github-light.ts  |     100 |      100 |     100 |     100 |                   
  googlecode.ts    |     100 |      100 |     100 |     100 |                   
  no-color.ts      |     100 |      100 |     100 |     100 |                   
  qwen-dark.ts     |     100 |      100 |     100 |     100 |                   
  qwen-light.ts    |     100 |      100 |     100 |     100 |                   
  ...tic-tokens.ts |     100 |      100 |     100 |     100 |                   
  ...-of-purple.ts |     100 |      100 |     100 |     100 |                   
  theme-manager.ts |   88.68 |    84.52 |     100 |   88.68 | ...83-392,397-398 
  theme.ts         |     100 |    38.02 |     100 |     100 | ...34-449,457-461 
  xcode.ts         |     100 |      100 |     100 |     100 |                   
 src/ui/utils      |   86.94 |    85.13 |   95.61 |   86.94 |                   
  ...Colorizer.tsx |   80.31 |    85.41 |     100 |   80.31 | ...00-201,313-339 
  ...nRenderer.tsx |   79.84 |     75.6 |     100 |   79.84 | ...66,270,328-329 
  ...wnDisplay.tsx |   92.87 |    93.46 |     100 |   92.87 | ...,955,1002-1020 
  ...idDiagram.tsx |   87.79 |    95.34 |     100 |   87.79 | 156-179           
  ...eRenderer.tsx |   92.38 |    81.91 |   95.23 |   92.38 | ...43-746,799-804 
  ...odeDisplay.ts |   94.28 |    85.71 |     100 |   94.28 | 23,40             
  asciiCharts.ts   |    96.7 |     87.5 |     100 |    96.7 | 170-177,278       
  ...dWorkUtils.ts |     100 |      100 |     100 |     100 |                   
  ...boardUtils.ts |   52.52 |    73.25 |   91.66 |   52.52 | ...23,626-635,638 
  commandUtils.ts  |   96.17 |    88.88 |     100 |   96.17 | ...77,179-180,323 
  computeStats.ts  |     100 |      100 |     100 |     100 |                   
  customBanner.ts  |   90.68 |    91.22 |     100 |   90.68 | ...13,324-327,334 
  displayUtils.ts  |   73.84 |    73.91 |     100 |   73.84 | ...34,36-40,42-46 
  formatters.ts    |   94.87 |    98.18 |     100 |   94.87 | 116-119           
  goal-runtime.ts  |   91.17 |    94.73 |     100 |   91.17 | 31-33             
  gradientUtils.ts |     100 |      100 |     100 |     100 |                   
  highlight.ts     |     100 |      100 |     100 |     100 |                   
  ...gap-notice.ts |     100 |      100 |     100 |     100 |                   
  ...oryMapping.ts |     100 |       95 |     100 |     100 | 44,103            
  historyUtils.ts  |   96.03 |     97.1 |     100 |   96.03 | 103-106           
  ...mage-parts.ts |   97.75 |    94.87 |     100 |   97.75 | 82-83             
  inline-math.ts   |   98.48 |    95.23 |     100 |   98.48 | 129-130           
  input-mouse.ts   |     100 |    85.71 |     100 |     100 | 48,93             
  isNarrowWidth.ts |     100 |      100 |     100 |     100 |                   
  ...olDetector.ts |   68.81 |       75 |   66.66 |   68.81 | ...27-132,160-161 
  latexRenderer.ts |   94.95 |     73.8 |     100 |   94.95 | ...76-178,184-187 
  layoutUtils.ts   |     100 |      100 |     100 |     100 |                   
  list-mouse.ts    |     100 |      100 |     100 |     100 |                   
  ...ightLoader.ts |     100 |       95 |     100 |     100 | 81                
  ...nUtilities.ts |   98.72 |    94.36 |     100 |   98.72 | 145-146           
  ...t-position.ts |     100 |     87.5 |     100 |     100 | 85                
  ...geRenderer.ts |   86.51 |    70.16 |   95.12 |   86.51 | ...1286,1326-1332 
  ...alRenderer.ts |   86.69 |     71.9 |     100 |   86.69 | ...1476,1513-1519 
  ...lsBySource.ts |     100 |    95.23 |     100 |     100 | 84                
  mouse.ts         |   92.85 |    74.19 |     100 |   92.85 | ...38,145,149-152 
  osc8.ts          |   90.43 |    78.33 |     100 |   90.43 | ...59,244,248-249 
  ...red-height.ts |   98.38 |    97.14 |     100 |   98.38 | 195-197           
  ...mConstants.ts |     100 |      100 |     100 |     100 |                   
  restoreGoal.ts   |     100 |      100 |     100 |     100 |                   
  ...storyUtils.ts |   80.19 |    77.92 |     100 |   80.19 | ...83-605,736-737 
  ...ickerUtils.ts |     100 |      100 |     100 |     100 |                   
  ...evel-label.ts |   77.77 |    66.66 |     100 |   77.77 | 18,22-24          
  ...are-cursor.ts |   89.47 |    85.71 |     100 |   89.47 | 39-44             
  ...ataService.ts |   93.17 |     79.1 |     100 |   93.17 | ...14,227,254-256 
  suggestions.ts   |     100 |      100 |     100 |     100 |                   
  ...izedOutput.ts |   94.94 |      100 |   88.88 |   94.94 | 112-117           
  ...nal-buffer.ts |     100 |      100 |     100 |     100 |                   
  ...e-renderer.ts |   90.61 |    83.44 |     100 |   90.61 | ...80,482-484,607 
  ...wOptimizer.ts |     100 |    96.77 |     100 |     100 | 69                
  terminalSetup.ts |    4.37 |      100 |       0 |    4.37 | 44-393            
  textUtils.ts     |   97.94 |    95.45 |   94.11 |   97.94 | ...82-283,443-444 
  ...background.ts |     100 |      100 |     100 |     100 |                   
  todoSnapshot.ts  |   90.42 |    92.85 |     100 |   90.42 | ...06-207,240-241 
  ...isplay-map.ts |     100 |      100 |     100 |     100 |                   
  updateCheck.ts   |     100 |    92.75 |     100 |     100 | 227-239,331       
  ...ow-keyword.ts |     100 |      100 |     100 |     100 |                   
 ...i/utils/export |   75.03 |     60.3 |   94.59 |   75.03 |                   
  collect.ts       |   71.27 |    66.38 |      96 |   71.27 | ...90-633,655-656 
  index.ts         |     100 |      100 |     100 |     100 |                   
  normalize.ts     |   80.42 |    50.68 |     100 |   80.42 | ...59-364,376-378 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
  utils.ts         |     100 |      100 |     100 |     100 |                   
 ...ort/formatters |   52.92 |    47.22 |   71.42 |   52.92 |                   
  html.ts          |   84.61 |       50 |     100 |   84.61 | ...53,57-58,62-63 
  json.ts          |     100 |      100 |     100 |     100 |                   
  jsonl.ts         |   82.45 |     37.5 |     100 |   82.45 | ...48,50-51,65-66 
  markdown.ts      |   36.32 |    47.05 |      50 |   36.32 | ...16-219,233-295 
 src/ui/voice      |   81.27 |    79.92 |   81.94 |   81.27 |                   
  ...d-recorder.ts |     6.2 |      100 |       0 |     6.2 | ...33-159,162-163 
  ...o-recorder.ts |   84.61 |    93.33 |   57.14 |   84.61 | ...16-117,131-136 
  ...me-session.ts |   91.09 |     92.1 |     100 |   91.09 | ...99,305,316-319 
  sox-recorder.ts  |    92.7 |    71.87 |     100 |    92.7 | ...34-135,153-154 
  ...ailability.ts |     100 |      100 |     100 |     100 |                   
  ...e-keyterms.ts |     100 |      100 |     100 |     100 |                   
  voice-model.ts   |     100 |      100 |     100 |     100 |                   
  ...e-recorder.ts |   88.29 |    67.74 |   81.81 |   88.29 | ...,98-99,112,115 
  voice-refine.ts  |     100 |    93.33 |     100 |     100 | 92                
  ...ream-retry.ts |   86.79 |       70 |     100 |   86.79 | 16-18,48-49,59-60 
  ...am-session.ts |   88.02 |    66.66 |   84.61 |   88.02 | ...26,343-345,363 
  ...ranscriber.ts |     100 |      100 |     100 |     100 |                   
 src/utils         |    81.4 |       87 |   92.57 |    81.4 |                   
  ...p-profiler.ts |   98.39 |    90.56 |     100 |   98.39 | 141,185,235       
  acpModelUtils.ts |   97.36 |    95.19 |     100 |   97.36 | ...09-210,214-215 
  apiPreconnect.ts |   96.74 |    94.59 |     100 |   96.74 | 167-170           
  ...ol-call-id.ts |   84.61 |       60 |     100 |   84.61 | 26-27,37-38       
  ...ng-failure.ts |     100 |       95 |     100 |     100 | 72                
  checks.ts        |   33.33 |      100 |       0 |   33.33 | 23-28             
  ...-api-error.ts |     100 |    96.42 |     100 |     100 | 14                
  cleanup.ts       |   84.05 |    94.11 |      80 |   84.05 | 80,111-121        
  commands.ts      |   97.45 |    96.66 |     100 |   97.45 | 153-155           
  ...Calculator.ts |     100 |      100 |     100 |     100 |                   
  cpuProfiler.ts   |   70.73 |    73.23 |   88.88 |   70.73 | ...27,430-431,438 
  deepMerge.ts     |     100 |    89.65 |     100 |     100 | 41-43,49          
  ...re-runtime.ts |     100 |      100 |     100 |     100 |                   
  ...ScopeUtils.ts |   97.56 |    88.88 |     100 |   97.56 | 67                
  doctorChecks.ts  |   70.31 |    74.57 |     100 |   70.31 | ...95-301,325-341 
  ...putCapture.ts |   90.65 |    86.31 |     100 |   90.65 | ...73,371,373-374 
  ...arResolver.ts |   97.14 |    96.55 |     100 |   97.14 | 125-126           
  errors.ts        |   97.56 |    94.64 |     100 |   97.56 | 69-70,304-305     
  events.ts        |     100 |      100 |     100 |     100 |                   
  ...on-mention.ts |   88.48 |     82.6 |     100 |   88.48 | ...56-160,164-168 
  gitUtils.ts      |   92.85 |    86.66 |     100 |   92.85 | ...13-116,164-167 
  ...AutoUpdate.ts |    93.1 |       94 |      90 |    93.1 | 103,108,179-190   
  ...tyWarnings.ts |     100 |      100 |     100 |     100 |                   
  ...lationInfo.ts |   97.68 |    94.28 |     100 |   97.68 | ...64,381-382,427 
  jsonc-editor.ts  |   93.18 |    92.72 |     100 |   93.18 | ...80-381,384-385 
  languageUtils.ts |   98.88 |    97.05 |     100 |   98.88 | 184-185           
  load-undici.ts   |     100 |      100 |     100 |     100 |                   
  ...npm-update.ts |   86.64 |    77.02 |     100 |   86.64 | ...03-304,335-345 
  math.ts          |       0 |        0 |       0 |       0 | 1-15              
  ...er-mention.ts |     100 |    66.66 |     100 |     100 | 14,30,44-46       
  ...iagnostics.ts |   94.57 |    83.01 |   88.88 |   94.57 | ...05,311,315-317 
  ...serMessage.ts |     100 |      100 |     100 |     100 |                   
  ...onfigUtils.ts |   94.25 |    91.17 |     100 |   94.25 | ...30,436,439-443 
  ...iveHelpers.ts |   95.13 |    91.79 |     100 |   95.13 | ...53-454,552,565 
  osc.ts           |   97.18 |      100 |    87.5 |   97.18 | 182-183           
  package.ts       |   88.88 |    85.71 |     100 |   88.88 | 31-32             
  ...uggestions.ts |   84.29 |    70.83 |     100 |   84.29 | 70-76,92-103      
  processUtils.ts  |    92.3 |       80 |     100 |    92.3 | 45-46             
  readStdin.ts     |   93.67 |    94.11 |   85.71 |   93.67 | 79-83             
  relaunch.ts      |   95.87 |    89.28 |     100 |   95.87 | 103-105,131       
  resolvePath.ts   |     100 |      100 |     100 |     100 |                   
  runBudget.ts     |   99.35 |    96.77 |     100 |   99.35 | 119               
  sandbox-path.ts  |     100 |      100 |     100 |     100 |                   
  sandbox.ts       |   45.67 |    56.93 |   76.92 |   45.67 | ...1034,1046-1069 
  ...xImageName.ts |     100 |    77.77 |     100 |     100 | 10,18             
  sandboxMounts.ts |     100 |      100 |     100 |     100 |                   
  sessionPaths.ts  |   90.84 |    90.56 |     100 |   90.84 | ...81-182,185-186 
  settingsUtils.ts |   82.35 |    89.57 |      90 |   82.35 | ...25-743,750-758 
  spawnWrapper.ts  |     100 |      100 |     100 |     100 |                   
  ...ate-verify.ts |     100 |      100 |     100 |     100 |                   
  ...one-update.ts |   39.81 |    77.44 |   62.16 |   39.81 | ...1193,1196-1215 
  ...upProfiler.ts |   98.47 |    94.66 |     100 |   98.47 | 132-133,308       
  ...upWarnings.ts |     100 |      100 |     100 |     100 |                   
  stdioHelpers.ts  |     100 |       90 |     100 |     100 | 23                
  systemInfo.ts    |   95.12 |    90.27 |     100 |   95.12 | ...54-255,260-264 
  ...InfoFields.ts |    87.5 |    65.85 |     100 |    87.5 | ...24-125,146-147 
  ...alSequence.ts |     100 |    97.61 |     100 |     100 | 60                
  ...iffPreview.ts |   76.47 |       25 |     100 |   76.47 | 13,17,23-24       
  ...on-handler.ts |    73.8 |       75 |     100 |    73.8 | 17-18,25-26,67-73 
  ...e-relaunch.ts |   89.61 |    86.66 |      50 |   89.61 | 56-61,83-84       
  ...entEmitter.ts |     100 |      100 |     100 |     100 |                   
  ...ansionHook.ts |     100 |      100 |     100 |     100 |                   
  ...upWarnings.ts |   87.75 |       75 |     100 |   87.75 | 47-48,53-54,57-58 
  version.ts       |     100 |    66.66 |     100 |     100 | 11                
  ...ingHandler.ts |     100 |      100 |     100 |     100 |                   
  windowTitle.ts   |   95.45 |    93.33 |     100 |   95.45 | 54-55             
  ...WithBackup.ts |   65.04 |    77.77 |     100 |   65.04 | 97,112,133-172    
 ...s/housekeeping |   91.63 |    91.02 |      95 |   91.63 |                   
  cleanup.ts       |   95.77 |    95.83 |     100 |   95.77 | 70-72             
  ...eractionAt.ts |     100 |      100 |     100 |     100 |                   
  scheduler.ts     |   91.91 |    90.47 |    87.5 |   91.91 | 58-62,73,131-135  
  throttledOnce.ts |   86.66 |     86.2 |     100 |   86.66 | ...99,105,137-138 
-------------------|---------|----------|---------|---------|-------------------
Core Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   87.73 |    86.25 |   89.29 |   87.73 |                   
 src               |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/__mocks__/fs  |       0 |        0 |       0 |       0 |                   
  promises.ts      |       0 |        0 |       0 |       0 | 1-48              
 src/agents        |   90.46 |    84.13 |   95.65 |   90.46 |                   
  ...transcript.ts |   87.63 |    83.52 |     100 |   87.63 | ...80,588,594-598 
  ...ent-resume.ts |   85.59 |    77.55 |   83.33 |   85.59 | ...1793-1797,1800 
  ...ound-tasks.ts |   96.15 |    90.13 |   98.76 |   96.15 | ...1732,1752-1755 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...ent-result.ts |    96.8 |    92.68 |     100 |    96.8 | 106,129-131       
  ...n-registry.ts |    93.3 |    86.11 |     100 |    93.3 | ...85-991,996-998 
  ...w-snapshot.ts |   91.86 |    75.75 |     100 |   91.86 | ...54,178,185-187 
 src/agents/arena  |   76.32 |    67.71 |   78.94 |   76.32 |                   
  ...gentClient.ts |   79.47 |    88.88 |   81.81 |   79.47 | ...68-183,189-204 
  ArenaManager.ts  |   75.11 |    64.51 |   78.57 |   75.11 | ...1887,1893-1894 
  arena-events.ts  |   64.44 |      100 |      50 |   64.44 | ...71-175,178-183 
  diff-summary.ts  |    87.5 |    72.34 |     100 |    87.5 | ...32-133,137-138 
  index.ts         |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...gents/backends |   78.09 |    85.23 |   76.28 |   78.09 |                   
  ITermBackend.ts  |   97.97 |    93.93 |     100 |   97.97 | ...78-180,255,307 
  ...essBackend.ts |    90.9 |    85.36 |   93.33 |    90.9 | ...70,672,674-675 
  TmuxBackend.ts   |    90.7 |    76.55 |   97.36 |    90.7 | ...87,697,743-747 
  detect.ts        |   31.25 |      100 |       0 |   31.25 | 34-88             
  index.ts         |     100 |      100 |     100 |     100 |                   
  iterm-it2.ts     |     100 |     92.1 |     100 |     100 | 37-38,106         
  tmux-commands.ts |    6.64 |      100 |    3.03 |    6.64 | ...93-363,386-503 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...agents/runtime |   90.55 |    86.14 |   87.64 |   90.55 |                   
  agent-context.ts |     100 |      100 |     100 |     100 |                   
  agent-core.ts    |   85.07 |     76.8 |   77.77 |   85.07 | ...2291,2337-2339 
  agent-events.ts  |     100 |      100 |     100 |     100 |                   
  ...t-headless.ts |   93.49 |    89.41 |   83.33 |   93.49 | ...96-497,500-501 
  ...nteractive.ts |   81.01 |    82.35 |   76.66 |   81.01 | ...33,535-538,541 
  ...statistics.ts |   98.29 |    82.55 |     100 |   98.29 | 141,165,206,239   
  agent-types.ts   |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...ool-policy.ts |   98.34 |      100 |    92.3 |   98.34 | 81-82             
  ...low-budget.ts |     100 |      100 |     100 |     100 |                   
  ...ow-journal.ts |   91.76 |    75.86 |     100 |   91.76 | ...38-139,179-181 
  ...chestrator.ts |   91.86 |    88.71 |   82.35 |   91.86 | ...1782,1831-1834 
  ...ow-prompts.ts |     100 |      100 |     100 |     100 |                   
  ...low-runner.ts |    94.3 |    87.17 |   91.66 |    94.3 | ...74,222,242-245 
  ...ow-sandbox.ts |   96.87 |    94.64 |     100 |   96.87 | ...24-325,330-331 
  ...flow-saved.ts |   96.51 |    94.36 |     100 |   96.51 | 134-135,234-237   
  ...flow-stall.ts |    97.9 |    83.33 |     100 |    97.9 | 138-139,236       
 src/agents/tasks  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/agents/team   |   82.04 |    84.17 |   88.97 |   82.04 |                   
  TeamManager.ts   |   72.02 |    79.41 |   79.24 |   72.02 | ...1632,1655-1656 
  identity.ts      |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...sionBridge.ts |     100 |      100 |     100 |     100 |                   
  mailbox.ts       |   96.02 |    87.23 |     100 |   96.02 | 352-358           
  ...ptAddendum.ts |     100 |      100 |     100 |     100 |                   
  tasks.ts         |   89.24 |    82.82 |     100 |   89.24 | ...-994,1038-1039 
  team-events.ts   |   60.52 |      100 |      50 |   60.52 | ...40-144,151-155 
  teamHelpers.ts   |   92.02 |    94.91 |   95.23 |   92.02 | ...31-332,368-378 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...eam/test-utils |   94.39 |    94.26 |   98.21 |   94.39 |                   
  ...on-harness.ts |   96.49 |    84.21 |     100 |   96.49 | 128-129,141-142   
  fake-agent.ts    |   98.49 |    95.08 |     100 |   98.49 | 201-203           
  fake-backend.ts  |   86.46 |    97.61 |   95.83 |   86.46 | 124-146           
 src/config        |   84.97 |    87.13 |   75.37 |   84.97 |                   
  approval-mode.ts |     100 |      100 |     100 |     100 |                   
  ...xtDefaults.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |   84.29 |    86.85 |   73.79 |   84.29 | ...8348,8352-8353 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  models.ts        |     100 |      100 |     100 |     100 |                   
  storage.ts       |   94.39 |    91.57 |   88.23 |   94.39 | ...45-446,449-450 
 ...nfirmation-bus |   98.27 |    97.14 |     100 |   98.27 |                   
  message-bus.ts   |   98.14 |    97.05 |     100 |   98.14 | 42-43             
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/core          |   91.97 |    87.99 |   93.24 |   91.97 |                   
  baseLlmClient.ts |   88.37 |    83.68 |   81.81 |   88.37 | ...51,664,670-672 
  client.ts        |   91.91 |    87.15 |   91.56 |   91.91 | ...3922,4016-4017 
  ...tGenerator.ts |   86.34 |    87.34 |   84.61 |   86.34 | ...88-489,534-540 
  ...lScheduler.ts |   90.05 |    84.69 |   96.19 |   90.05 | ...6225,6253-6269 
  geminiChat.ts    |   92.97 |    89.89 |   95.41 |   92.97 | ...4938,4984-4985 
  geminiRequest.ts |     100 |      100 |     100 |     100 |                   
  genai-compat.ts  |     100 |      100 |     100 |     100 |                   
  ...MediaLimit.ts |     100 |       96 |     100 |     100 | 96                
  ...htProtocol.ts |    9.09 |      100 |       0 |    9.09 | ...9,62-66,69-110 
  ...ream-error.ts |     100 |      100 |     100 |     100 |                   
  logger.ts        |   87.41 |    87.02 |     100 |   87.41 | ...64-568,614-628 
  ...lay-buffer.ts |     100 |      100 |     100 |     100 |                   
  ...dispatcher.ts |     100 |      100 |     100 |     100 |                   
  ...tyDefaults.ts |     100 |      100 |     100 |     100 |                   
  ...olExecutor.ts |   93.54 |    83.33 |      50 |   93.54 | 49-50             
  ...on-helpers.ts |   93.49 |    78.57 |     100 |   93.49 | ...10-211,228-229 
  ...issionFlow.ts |   98.97 |    96.96 |     100 |   98.97 | 107               
  ...try-policy.ts |     100 |      100 |     100 |     100 |                   
  ...ell-policy.ts |   95.19 |    89.47 |     100 |   95.19 | ...44-245,290-291 
  prompts.ts       |   93.64 |    91.42 |   83.33 |   93.64 | ...1208,1411-1412 
  ...ing-effort.ts |     100 |      100 |     100 |     100 |                   
  ...n-recovery.ts |   95.13 |       80 |     100 |   95.13 | ...06-107,142-144 
  ...t-profiler.ts |    97.9 |    81.15 |   88.23 |    97.9 | 117,124-125,130   
  ...port-retry.ts |     100 |      100 |     100 |     100 |                   
  tokenLimits.ts   |     100 |     92.1 |     100 |     100 | 87,122-139        
  ...reparation.ts |     100 |      100 |     100 |     100 |                   
  ...tion-guard.ts |   90.38 |    94.73 |     100 |   90.38 | 68-72             
  ...allIdUtils.ts |   98.41 |    93.47 |     100 |   98.41 | 36,45             
  ...okTriggers.ts |   99.45 |    92.43 |     100 |   99.45 | 182,193           
  ...terruption.ts |     100 |     92.3 |     100 |     100 | 86,104            
  turn.ts          |   98.67 |    93.07 |     100 |   98.67 | ...77,705-706,753 
  ...l-fallback.ts |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |   96.33 |    88.12 |   96.15 |   96.33 |                   
  ...tGenerator.ts |   97.24 |    86.72 |   94.87 |   97.24 | ...1429,1458,1469 
  converter.ts     |   96.19 |    89.25 |     100 |   96.19 | ...1329,1550-1552 
  index.ts         |       0 |        0 |       0 |       0 | 1-21              
  usage.ts         |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |   88.78 |    72.36 |   89.47 |   88.78 |                   
  ...tGenerator.ts |   87.18 |    71.83 |   88.88 |   87.18 | ...58-364,382-383 
  index.ts         |     100 |       80 |     100 |     100 | 50                
 ...ntentGenerator |    95.6 |    88.74 |    92.3 |    95.6 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...tGenerator.ts |   95.52 |    87.88 |   91.89 |   95.52 | ...1195-1196,1224 
  ...tDetection.ts |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |    91.5 |    90.27 |   95.45 |    91.5 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  converter.ts     |   91.15 |    89.32 |   96.87 |   91.15 | ...1914,2083-2098 
  errorHandler.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |   60.31 |       75 |      50 |   60.31 | ...71,74-78,90-94 
  ...tGenerator.ts |    66.4 |    70.58 |   88.88 |    66.4 | ...51-157,168-169 
  pipeline.ts      |   95.38 |    91.03 |     100 |   95.38 | ...1280,1288,1387 
  ...ix-caching.ts |     100 |      100 |     100 |     100 |                   
  ...ureContext.ts |     100 |      100 |     100 |     100 |                   
  ...ingOptions.ts |       0 |        0 |       0 |       0 | 1                 
  ...CallParser.ts |   92.24 |     92.4 |     100 |   92.24 | ...28-529,549-552 
  ...kingParser.ts |     100 |    96.87 |     100 |     100 | 42                
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...rator/provider |   97.19 |    90.47 |   98.36 |   97.19 |                   
  dashscope.ts     |   98.36 |    93.03 |   95.65 |   98.36 | ...93-494,636-637 
  deepseek.ts      |   94.91 |    89.36 |     100 |   94.91 | ...31-132,145-146 
  default.ts       |   99.16 |    96.96 |     100 |   99.16 | 198               
  index.ts         |     100 |      100 |     100 |     100 |                   
  mimo.ts          |   94.11 |    66.66 |     100 |   94.11 | 29,52-53          
  minimax.ts       |     100 |      100 |     100 |     100 |                   
  mistral.ts       |   96.07 |    73.33 |     100 |   96.07 | 32-33             
  modelscope.ts    |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 |                   
  utils.ts         |     100 |      100 |     100 |     100 |                   
  zai.ts           |   92.13 |    82.14 |     100 |   92.13 | ...,39-40,135-137 
 src/extension     |   87.25 |    83.89 |   92.52 |   87.25 |                   
  ...ive-safety.ts |     100 |      100 |     100 |     100 |                   
  ...-converter.ts |   80.55 |    73.66 |     100 |   80.55 | ...1133,1179-1180 
  corruptFile.ts   |     100 |       50 |     100 |     100 | 40-45             
  ...-converter.ts |     100 |      100 |     100 |     100 |                   
  ...me-refresh.ts |     100 |      100 |     100 |     100 |                   
  ...sion-store.ts |   90.85 |    86.14 |   97.87 |   90.85 | ...1218-1224,1268 
  ...ionManager.ts |   82.14 |    79.77 |   81.52 |   82.14 | ...2717,2739-2740 
  ...references.ts |     100 |     90.9 |     100 |     100 | ...05,129,197,200 
  ...onSettings.ts |    92.3 |     94.4 |     100 |    92.3 | ...98-501,570-571 
  ...-converter.ts |    75.9 |    85.36 |   85.71 |    75.9 | ...98,202,214-248 
  github.ts        |    90.4 |     82.5 |     100 |    90.4 | ...97,987-988,998 
  http-client.ts   |   84.61 |       80 |     100 |   84.61 | 20-21             
  i18n.ts          |   78.26 |       96 |      50 |   78.26 | 104-110,116-123   
  index.ts         |     100 |      100 |     100 |     100 |                   
  marketplace.ts   |   88.39 |    83.11 |     100 |   88.39 | ...08,494,507-508 
  ...ork-policy.ts |   89.72 |       90 |     100 |   89.72 | ...36,148-154,156 
  npm.ts           |   89.02 |    81.81 |     100 |   89.02 | ...86-688,695-700 
  override.ts      |   94.11 |    93.33 |     100 |   94.11 | 63-64,81-82       
  ...-converter.ts |   94.89 |    90.41 |     100 |   94.89 | ...50-151,222-224 
  redaction.ts     |     100 |      100 |     100 |     100 |                   
  settings.ts      |   66.26 |      100 |      50 |   66.26 | 81-107,141-146    
  ...ceRegistry.ts |   94.01 |    83.14 |     100 |   94.01 | ...38-344,365-366 
  storage.ts       |     100 |      100 |     100 |     100 |                   
  ...ableSchema.ts |     100 |      100 |     100 |     100 |                   
  variables.ts     |   88.95 |    84.21 |     100 |   88.95 | ...32-235,238-241 
  ...extraction.ts |   85.77 |       81 |   89.47 |   85.77 | ...02-205,260-261 
 src/followup      |   79.92 |    80.07 |    90.9 |   79.92 |                   
  followupState.ts |   98.44 |    95.74 |     100 |   98.44 | 236-237           
  index.ts         |     100 |      100 |     100 |     100 |                   
  overlayFs.ts     |   96.29 |    88.88 |     100 |   96.29 | 78,108,122        
  speculation.ts   |   71.64 |    65.38 |   71.42 |   71.64 | ...52-653,660-661 
  ...onToolGate.ts |     100 |    96.55 |     100 |     100 | 97                
  ...nGenerator.ts |   72.03 |    81.15 |   83.33 |   72.03 | ...68-219,331-333 
 src/generated     |       0 |        0 |       0 |       0 |                   
  git-commit.ts    |       0 |        0 |       0 |       0 | 1-10              
 src/goals         |   94.16 |    88.85 |    95.9 |   94.16 |                   
  ...eGoalStore.ts |   87.61 |    88.88 |   86.66 |   87.61 | ...85-188,196-204 
  goal-evidence.ts |   87.61 |    85.02 |   95.65 |   87.61 | ...13-614,637-640 
  ...projection.ts |   89.41 |    72.22 |   66.66 |   89.41 | ...28,131,135-137 
  ...ersistence.ts |   87.73 |    84.84 |      80 |   87.73 | ...-94,97,101-106 
  goal-protocol.ts |      92 |       90 |     100 |      92 | 109-110           
  goal-reducer.ts  |   92.43 |    85.93 |     100 |   92.43 | ...80-381,394,449 
  goal-runtime.ts  |   99.02 |    93.49 |     100 |   99.02 | ...86-687,710-711 
  goal-tools.ts    |   98.22 |    93.02 |      95 |   98.22 | ...46-147,248-249 
  ...rn-context.ts |     100 |      100 |     100 |     100 |                   
  goal-verifier.ts |   92.46 |    92.85 |     100 |   92.46 | ...69-172,185-187 
  goal-wire.ts     |       0 |        0 |       0 |       0 | 1-27              
  goalHook.ts      |   96.91 |    92.42 |     100 |   96.91 | 115-120,221-222   
  goalJudge.ts     |   95.84 |    87.09 |     100 |   95.84 | ...55-356,448-449 
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/hooks         |   88.11 |    86.37 |   88.62 |   88.11 |                   
  ...okRegistry.ts |   86.48 |    77.08 |     100 |   86.48 | ...41-344,362-369 
  ...bortSignal.ts |     100 |      100 |     100 |     100 |                   
  context-usage.ts |     100 |      100 |     100 |     100 |                   
  ...terpolator.ts |   96.66 |    93.33 |     100 |   96.66 | 66-67             
  ...HookRunner.ts |   96.68 |    87.23 |     100 |   96.68 | 110-112,231-233   
  ...Aggregator.ts |   96.57 |    91.48 |     100 |   96.57 | ...20-321,402,404 
  ...entHandler.ts |   95.57 |    84.76 |   94.73 |   95.57 | ...1040-1041,1051 
  hookPlanner.ts   |   87.55 |    85.54 |   86.66 |   87.55 | ...22-226,233-244 
  hookRegistry.ts  |   92.53 |    85.43 |     100 |   92.53 | ...39,458,462,466 
  hookRunner.ts    |   62.65 |    72.34 |   66.66 |   62.65 | ...70-771,780-781 
  hookSystem.ts    |   87.64 |     98.5 |   70.83 |   87.64 | ...58-759,765-766 
  ...HookRunner.ts |   79.06 |    66.66 |      80 |   79.06 | ...33-434,452-456 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...edCallback.ts |     100 |      100 |     100 |     100 |                   
  ...HookRunner.ts |   94.19 |    84.37 |   81.81 |   94.19 | ...76-384,458-459 
  ...SkillHooks.ts |   78.75 |       75 |   66.66 |   78.75 | 62-66,137-152     
  ...oksManager.ts |   94.87 |    88.88 |     100 |   94.87 | ...84,325,327-329 
  ssrfGuard.ts     |   86.45 |    89.13 |     100 |   86.45 | ...85,289-295,301 
  stopHookCap.ts   |     100 |      100 |     100 |     100 |                   
  trustedHooks.ts  |      90 |    52.63 |     100 |      90 | ...53,66-67,97-98 
  types.ts         |   94.25 |    96.09 |   88.88 |   94.25 | ...46-547,632-636 
  urlValidator.ts  |     100 |      100 |     100 |     100 |                   
  ...it-context.ts |     100 |      100 |     100 |     100 |                   
 src/ide           |   76.98 |    85.03 |   79.03 |   76.98 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  detect-ide.ts    |     100 |      100 |     100 |     100 |                   
  ide-client.ts    |   69.16 |    84.65 |   68.29 |   69.16 | ...1068,1097-1105 
  ide-installer.ts |   89.06 |    79.31 |     100 |   89.06 | ...36,143-147,160 
  ideContext.ts    |     100 |      100 |     100 |     100 |                   
  process-utils.ts |   84.84 |    71.79 |     100 |   84.84 | ...37,151,193-194 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/lsp           |   58.96 |    70.57 |   66.14 |   58.96 |                   
  ...nfigLoader.ts |   80.55 |       72 |   95.45 |   80.55 | ...02-504,508-514 
  ...ionFactory.ts |   42.81 |    73.07 |      50 |   42.81 | ...76-427,433-450 
  ...Normalizer.ts |   23.09 |    13.72 |   30.43 |   23.09 | ...04-905,909-924 
  ...verManager.ts |   75.73 |     80.1 |   79.66 |   75.73 | ...1346,1352-1382 
  ...eLspClient.ts |   32.78 |       80 |   16.66 |   32.78 | ...89-293,299-300 
  ...LspService.ts |      60 |    73.36 |   78.26 |      60 | ...1575,1635-1645 
  configHash.ts    |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/mcp           |    82.3 |    77.81 |   78.33 |    82.3 |                   
  configHash.ts    |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...h-provider.ts |   86.95 |      100 |   33.33 |   86.95 | ...,93,97,101-102 
  ...h-provider.ts |   79.31 |    58.06 |     100 |   79.31 | ...26-933,940-942 
  ...en-storage.ts |   98.78 |    97.95 |     100 |   98.78 | 106-107           
  oauth-utils.ts   |   73.61 |    85.48 |    92.3 |   73.61 | ...46-366,392-421 
  ...n-provider.ts |   89.83 |       96 |   45.45 |   89.83 | ...43,147,151-152 
 .../token-storage |   82.12 |    88.19 |   89.28 |   82.12 |                   
  ...en-storage.ts |     100 |      100 |     100 |     100 |                   
  ...en-storage.ts |   87.08 |    87.03 |   95.23 |   87.08 | ...00-201,214-215 
  ...en-storage.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...en-storage.ts |   68.14 |    82.35 |   64.28 |   68.14 | ...81-295,298-314 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/memory        |   87.71 |    83.52 |   90.47 |   87.71 |                   
  ...y-document.ts |   89.52 |    84.61 |     100 |   89.52 | ...24-325,329-330 
  ...nel-memory.ts |   97.36 |    96.63 |   96.42 |   97.36 | ...91-293,367-368 
  const.ts         |   94.28 |     92.3 |     100 |   94.28 | 66-67             
  dream.ts         |    64.6 |    72.22 |      50 |    64.6 | ...04-109,124-165 
  ...entPlanner.ts |     100 |    83.33 |     100 |     100 | 136,146           
  entries.ts       |   75.59 |    84.84 |   83.33 |   75.59 | ...56-157,172-180 
  extract.ts       |   91.48 |    75.75 |     100 |   91.48 | ...99,118-121,189 
  ...entPlanner.ts |   91.59 |    76.74 |     100 |   91.59 | ...05,114-117,293 
  ...ionPlanner.ts |       0 |        0 |       0 |       0 | 1                 
  forget.ts        |   81.83 |       75 |   83.33 |   81.83 | ...51,474,478-507 
  indexer.ts       |   94.14 |       84 |     100 |   94.14 | ...32-233,334,337 
  ...kill-agent.ts |   97.94 |    89.36 |     100 |   97.94 | 82-83,179-180     
  manager.ts       |    78.4 |    82.29 |   77.77 |    78.4 | ...1482,1495-1497 
  ...ent-config.ts |   86.95 |    82.52 |   86.36 |   86.95 | ...68,388,395-401 
  memoryAge.ts     |   90.47 |       80 |     100 |   90.47 | 50-51             
  paths.ts         |     100 |      100 |     100 |     100 |                   
  ...ing-skills.ts |     100 |       72 |     100 |     100 | 31-35,73-78,97    
  prompt.ts        |   97.26 |    87.03 |     100 |   97.26 | ...10-218,222,225 
  recall.ts        |   82.06 |       75 |    90.9 |   82.06 | ...59-364,395-406 
  refresh.ts       |   89.85 |    82.92 |     100 |   89.85 | ...54-155,162-163 
  ...ceSelector.ts |    93.1 |    81.81 |     100 |    93.1 | ...25,127-128,136 
  remember.ts      |   98.89 |    90.19 |     100 |   98.89 | 50,70             
  scan.ts          |   93.12 |    77.41 |     100 |   93.12 | ...08-109,154,157 
  scopes.ts        |     100 |      100 |     100 |     100 |                   
  ...et-scanner.ts |     100 |      100 |     100 |     100 |                   
  ...entPlanner.ts |   77.24 |    74.07 |   72.22 |   77.24 | ...52-456,459,465 
  status.ts        |   10.52 |      100 |       0 |   10.52 | 41-98             
  store.ts         |   92.92 |     82.6 |     100 |   92.92 | ...16-117,147-148 
  ...git-status.ts |     100 |     87.5 |     100 |     100 | 30                
  ...cret-guard.ts |     100 |      100 |     100 |     100 |                   
  ...emory-sync.ts |   94.24 |    82.85 |     100 |   94.24 | ...34-236,246-247 
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...ontextFile.ts |   81.21 |     79.1 |   81.81 |   81.21 | ...63-277,291-296 
 src/mocks         |       0 |        0 |       0 |       0 |                   
  msw.ts           |       0 |        0 |       0 |       0 | 1-9               
 src/models        |   92.55 |    88.62 |   91.13 |   92.55 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...tor-config.ts |   97.77 |    91.83 |     100 |   97.77 | 155,161,171       
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...nfigErrors.ts |   74.22 |       44 |   84.61 |   74.22 | ...,67-74,106-117 
  ...igResolver.ts |   98.71 |    93.33 |     100 |   98.71 | 166,328,334       
  modelRegistry.ts |     100 |    98.11 |     100 |     100 | 177,261           
  modelsConfig.ts  |   89.36 |    86.93 |   88.09 |   89.36 | ...1404,1433-1434 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/output        |     100 |      100 |     100 |     100 |                   
  ...-formatter.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/permissions   |   83.77 |    91.26 |   71.07 |   83.77 |                   
  autoMode.ts      |   97.66 |    93.13 |     100 |   97.66 | ...82-589,635,712 
  ...transcript.ts |      98 |       84 |     100 |      98 | 200-201           
  classifier.ts    |      94 |    94.54 |     100 |      94 | 158-165,389-393   
  ...erousRules.ts |     100 |    89.36 |     100 |     100 | 110,133,147,175   
  ...alTracking.ts |     100 |      100 |     100 |     100 |                   
  ...e-commands.ts |   86.77 |     73.8 |     100 |   86.77 | 131-141,210-214   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...on-manager.ts |   86.54 |    89.63 |      80 |   86.54 | ...1096,1202-1206 
  rule-parser.ts   |   94.49 |     92.7 |     100 |   94.49 | ...1447,1481-1483 
  ...-semantics.ts |   70.44 |    91.07 |   46.66 |   70.44 | ...2237,2311-2314 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...sifier-prompts |   99.04 |    95.23 |     100 |   99.04 |                   
  system-prompt.ts |   99.04 |    95.23 |     100 |   99.04 | 220               
 src/prompts       |   83.63 |      100 |    87.5 |   83.63 |                   
  mcp-prompts.ts   |   18.18 |      100 |       0 |   18.18 | 11-19             
  ...t-registry.ts |     100 |      100 |     100 |     100 |                   
 src/providers     |   83.71 |     78.5 |   81.25 |   83.71 |                   
  all-providers.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  install.ts       |   93.11 |     84.5 |     100 |   93.11 | ...56-257,330-331 
  ...der-config.ts |   75.85 |    73.84 |   78.26 |   75.85 | ...73-474,502-503 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...viders/presets |   97.82 |    91.66 |   63.63 |   97.82 |                   
  ...oding-plan.ts |   87.34 |      100 |       0 |   87.34 | 82-84,87-89,91-94 
  ...a-standard.ts |     100 |      100 |     100 |     100 |                   
  ...token-plan.ts |     100 |      100 |     100 |     100 |                   
  ...m-provider.ts |   97.05 |    81.25 |      75 |   97.05 | 118-119           
  deepseek.ts      |     100 |      100 |     100 |     100 |                   
  grok.ts          |     100 |      100 |     100 |     100 |                   
  idealab.ts       |     100 |      100 |     100 |     100 |                   
  minimax.ts       |     100 |      100 |     100 |     100 |                   
  modelscope.ts    |     100 |      100 |     100 |     100 |                   
  openrouter.ts    |     100 |      100 |     100 |     100 |                   
  requesty.ts      |     100 |      100 |     100 |     100 |                   
  zai.ts           |     100 |      100 |     100 |     100 |                   
 src/qwen          |   85.41 |    78.76 |   95.89 |   85.41 |                   
  ...tGenerator.ts |   98.64 |    98.18 |     100 |   98.64 | 105-106           
  qwenOAuth2.ts    |   82.79 |    73.75 |   90.62 |   82.79 | ...1205-1221,1251 
  ...kenManager.ts |   85.36 |    76.61 |     100 |   85.36 | ...52-757,778-783 
 src/resources     |     100 |      100 |     100 |     100 |                   
  ...e-registry.ts |     100 |      100 |     100 |     100 |                   
 src/services      |   89.64 |    84.47 |   96.87 |   89.64 |                   
  ...ionTrailer.ts |     100 |      100 |     100 |     100 |                   
  ...llRegistry.ts |   97.68 |    85.71 |     100 |   97.68 | ...96,119,490-491 
  ...ionService.ts |   97.45 |    95.45 |     100 |   97.45 | ...,905,1048-1056 
  ...ingService.ts |   91.41 |    85.15 |   95.65 |   91.41 | ...2117,2144-2145 
  ...ttribution.ts |   91.73 |    87.71 |      90 |   91.73 | ...80-685,826-827 
  ...utSlimming.ts |    97.2 |    93.93 |     100 |    97.2 | ...39-340,378-381 
  cronScheduler.ts |   94.17 |    90.45 |      98 |   94.17 | ...1333,1736-1737 
  cronTasksFile.ts |   95.49 |    90.82 |     100 |   95.49 | ...37,346-347,483 
  cronTasksLock.ts |   94.44 |    89.47 |     100 |   94.44 | ...02-103,132-133 
  ...eryService.ts |   96.22 |    93.54 |      90 |   96.22 | 121,155-156,161   
  ...oryService.ts |   88.17 |    79.02 |    92.3 |   88.17 | ...1303,1344-1347 
  fileReadCache.ts |    97.5 |    96.07 |     100 |    97.5 | 349-350,363-364   
  ...temService.ts |    92.8 |    84.68 |   94.11 |    92.8 | ...41,467-474,519 
  ...ratedFiles.ts |      96 |    88.23 |     100 |      96 | 119-120,146-147   
  gitInit.ts       |     100 |      100 |     100 |     100 |                   
  ...reeService.ts |    73.7 |    68.49 |   95.83 |    73.7 | ...2196,2225-2226 
  ...on-service.ts |   87.38 |       72 |     100 |   87.38 | ...01-305,343-344 
  ...references.ts |   98.39 |    88.76 |     100 |   98.39 | 154-155,215-216   
  ...ionService.ts |   98.22 |    97.34 |     100 |   98.22 | ...75-676,723-724 
  ...ticsDumper.ts |   98.37 |    95.23 |     100 |   98.37 | 185-186           
  ...ureMonitor.ts |   95.82 |    90.52 |   97.05 |   95.82 | ...60,861,875-877 
  ...orRegistry.ts |    97.3 |    91.22 |     100 |    97.3 | ...53-454,611-612 
  ...ttachments.ts |   97.74 |    90.85 |     100 |   97.74 | 298-308,646       
  ...ersistence.ts |   90.95 |    78.75 |     100 |   90.95 | ...78,963-964,992 
  ...on-service.ts |   94.49 |    92.26 |   97.14 |   94.49 | ...98-600,656-664 
  ...ce-service.ts |   98.38 |    93.75 |   88.88 |   98.38 | 63-64             
  ...ipt-reader.ts |   93.69 |    89.22 |   96.07 |   93.69 | ...1111-1112,1175 
  ...est-helper.ts |       0 |        0 |       0 |       0 | 1-65              
  ...iter-lease.ts |   83.14 |    74.47 |   97.61 |   83.14 | ...2433,2445-2448 
  sessionRecap.ts  |   67.56 |    43.47 |     100 |   67.56 | ...60,178,180-183 
  ...ionService.ts |   88.94 |    83.92 |   97.14 |   88.94 | ...2450,2520-2540 
  sessionTitle.ts  |   94.19 |    73.21 |     100 |   94.19 | ...43-246,277-278 
  ...ionService.ts |   84.35 |    78.37 |   97.14 |   84.35 | ...2472,2478-2483 
  ...pInhibitor.ts |   97.42 |    92.77 |     100 |   97.42 | ...30,169,369-370 
  ...Estimation.ts |     100 |    88.23 |     100 |     100 | 118-119           
  ...ageService.ts |   97.76 |    91.59 |   93.75 |   97.76 | ...61-262,366,567 
  ...UseSummary.ts |   94.63 |    88.46 |     100 |   94.63 | ...62-164,214-215 
  ...rd-service.ts |     100 |    88.37 |     100 |     100 | ...29,145-146,241 
  ...oryService.ts |   90.72 |    84.07 |     100 |   90.72 | ...06-509,561-562 
  ...reeCleanup.ts |   14.42 |      100 |   33.33 |   14.42 | 58-186            
  ...ionService.ts |   87.98 |    86.84 |     100 |   87.98 | ...38-439,455-456 
 ...icrocompaction |    98.9 |    95.06 |     100 |    98.9 |                   
  microcompact.ts  |    98.9 |    95.06 |     100 |    98.9 | ...40,749,758-759 
 ...s/visionBridge |   98.81 |    92.12 |     100 |   98.81 |                   
  ...capability.ts |     100 |      100 |     100 |     100 |                   
  ...part-utils.ts |     100 |      100 |     100 |     100 |                   
  ...ion-bridge.ts |   98.72 |    82.35 |     100 |   98.72 | 65,71             
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  ...ge-service.ts |   98.61 |     94.7 |     100 |   98.61 | ...06,666,679-680 
 src/skills        |   89.29 |    85.89 |   93.61 |   89.29 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...activation.ts |     100 |    93.33 |     100 |     100 | 93,112            
  skill-curator.ts |   89.71 |    81.54 |     100 |   89.71 | ...01-902,904-907 
  skill-load.ts    |   94.84 |     87.5 |     100 |   94.84 | ...03,223,235-237 
  skill-manager.ts |   84.82 |    85.29 |   83.33 |   84.82 | ...1243,1250-1254 
  skill-paths.ts   |   90.42 |     87.5 |     100 |   90.42 | ...19-120,125-126 
  symlinkScope.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |   97.91 |    98.03 |     100 |   97.91 | 277-278           
 ...ataviz/scripts |   80.06 |    95.23 |   88.23 |   80.06 |                   
  ...te_palette.js |   80.06 |    95.23 |   88.23 |   80.06 | 261-296,306-328   
 ...s/bundled/loop |   97.48 |    95.77 |     100 |   97.48 |                   
  ...omous-loop.ts |     100 |      100 |     100 |     100 |                   
  ...-task-file.ts |   94.85 |     92.4 |     100 |   94.85 | ...56,367,375-376 
  ...k-resolver.ts |     100 |      100 |     100 |     100 |                   
 src/subagents     |   87.72 |    89.01 |   96.55 |   87.72 |                   
  ...ter-schema.ts |     100 |    98.07 |     100 |     100 | 99                
  ...tin-agents.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...nt-manager.ts |   84.48 |    85.91 |   94.87 |   84.48 | ...1582,1659-1660 
  types.ts         |     100 |      100 |     100 |     100 |                   
  validation.ts    |   92.46 |    95.18 |     100 |   92.46 | 47-52,63-68,71-76 
 src/telemetry     |   81.39 |    83.47 |   84.66 |   81.39 |                   
  ...ty-tracker.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...on-metrics.ts |   99.07 |    80.95 |     100 |   99.07 | 183,197           
  ...on-tracing.ts |   76.31 |    74.62 |   73.68 |   76.31 | ...80,387-389,405 
  ...attributes.ts |   95.15 |    87.27 |     100 |   95.15 | ...97-198,216-217 
  ...ag-metrics.ts |     100 |    77.77 |     100 |     100 | 21,40             
  ...t-loop-lag.ts |   96.85 |    85.71 |     100 |   96.85 | 170-173           
  ...-exporters.ts |   65.78 |    83.33 |   55.55 |   65.78 | ...04-105,108-109 
  ...ai-content.ts |    74.5 |    66.41 |   91.66 |    74.5 | ...1480,1493-1502 
  ...i-provider.ts |     100 |       99 |     100 |     100 | 99                
  ...ai-request.ts |   87.52 |    92.79 |   83.78 |   87.52 | ...55-561,564-570 
  gen-ai-usage.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...t.circular.ts |       0 |        0 |       0 |       0 | 1-111             
  ...-processor.ts |    99.1 |    95.72 |      95 |    99.1 | 145,369-370       
  ...t.circular.ts |       0 |        0 |       0 |       0 | 1-128             
  loggers.ts       |   57.84 |    74.16 |   65.45 |   57.84 | ...1438,1455-1475 
  metrics.ts       |   80.04 |    82.75 |   80.32 |   80.04 | ...1105,1108-1119 
  otlp-urls.ts     |     100 |      100 |     100 |     100 |                   
  ...attributes.ts |     100 |      100 |     100 |     100 |                   
  ...ime-config.ts |       0 |        0 |       0 |       0 | 1                 
  sanitize.ts      |      80 |    83.33 |     100 |      80 | 35-36,41-42       
  ...rters-grpc.ts |     100 |      100 |     100 |     100 |                   
  ...rters-http.ts |     100 |      100 |     100 |     100 |                   
  sdk-impl.ts      |   91.06 |    87.15 |   68.75 |   91.06 | ...32,478-479,495 
  sdk.ts           |   79.22 |    89.18 |   63.63 |   79.22 | ...57-161,199-221 
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  ...on-tracing.ts |    91.1 |    88.68 |   96.77 |    91.1 | ...1737,1768-1771 
  ...etry-utils.ts |     100 |      100 |     100 |     100 |                   
  ...l-decision.ts |     100 |      100 |     100 |     100 |                   
  trace-context.ts |     100 |      100 |     100 |     100 |                   
  ...e-id-utils.ts |     100 |      100 |     100 |     100 |                   
  tracer.ts        |   98.56 |    88.63 |     100 |   98.56 | 52,101            
  types.ts         |   82.51 |    87.58 |   86.04 |   82.51 | ...1374,1378-1385 
  uiTelemetry.ts   |   97.18 |    93.93 |      88 |   97.18 | ...70,314,461-462 
 ...ry/qwen-logger |   74.23 |     80.7 |      70 |   74.23 |                   
  event-types.ts   |       0 |        0 |       0 |       0 |                   
  qwen-logger.ts   |   74.23 |    80.53 |   69.49 |   74.23 | ...1122,1160-1161 
 src/test-utils    |   96.02 |    98.41 |   82.92 |   96.02 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  ...st-helpers.ts |   94.11 |       90 |     100 |   94.11 | 69-70             
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...mised-lock.ts |     100 |      100 |     100 |     100 |                   
  mock-tool.ts     |   94.85 |      100 |   78.78 |   94.85 | ...53,227-228,241 
  ...aceContext.ts |     100 |      100 |     100 |     100 |                   
 src/tools         |   86.11 |    84.91 |   88.42 |   86.11 |                   
  ...erQuestion.ts |   89.71 |    80.76 |   91.66 |   89.71 | ...66-367,374-375 
  ...-registrar.ts |    77.7 |    66.66 |   66.66 |    77.7 | ...72-277,292-294 
  ...ub-session.ts |   89.67 |     91.3 |   81.81 |   89.67 | ...03-304,315-322 
  cron-create.ts   |   90.64 |    92.85 |   72.72 |   90.64 | ...,73-74,223-231 
  cron-delete.ts   |   97.56 |      100 |   83.33 |   97.56 | 31-32             
  cron-list.ts     |   98.23 |    95.34 |    87.5 |   98.23 | 57-58             
  diffOptions.ts   |     100 |      100 |     100 |     100 |                   
  display-image.ts |   87.42 |    84.84 |   88.88 |   87.42 | ...29-134,194-195 
  edit.ts          |    82.7 |    86.77 |   81.25 |    82.7 | ...43-744,863-913 
  ...r-worktree.ts |   83.14 |    67.56 |    87.5 |   83.14 | ...84-187,278-279 
  enterPlanMode.ts |      85 |     82.6 |    87.5 |      85 | ...28-133,161-175 
  exit-worktree.ts |   83.29 |    83.65 |   94.44 |   83.29 | ...14-515,537-538 
  exitPlanMode.ts  |      95 |    85.29 |     100 |      95 | ...21-325,344,378 
  ...permission.ts |     100 |      100 |     100 |     100 |                   
  glob.ts          |   96.33 |     88.5 |     100 |   96.33 | ...24-225,373,376 
  grep.ts          |   90.73 |    86.61 |   85.71 |   90.73 | ...76-677,727-728 
  ...adTracking.ts |     100 |      100 |     100 |     100 |                   
  image-gen.ts     |   91.66 |    77.41 |    90.9 |   91.66 | ...13-214,221-222 
  list-agents.ts   |   94.02 |    82.35 |   83.33 |   94.02 | 31-32,47-48       
  loop-wakeup.ts   |   99.27 |    92.85 |     100 |   99.27 | 45                
  ls.ts            |   96.74 |    90.27 |     100 |   96.74 | 176-181,212,216   
  lsp.ts           |   72.71 |     59.5 |   90.32 |   72.71 | ...1212,1214-1215 
  ...nt-manager.ts |   81.49 |     80.1 |   85.71 |   81.49 | ...3217,3219-3220 
  mcp-client.ts    |   79.87 |    85.58 |   89.47 |   79.87 | ...2259,2263-2266 
  ...ry-timeout.ts |     100 |      100 |     100 |     100 |                   
  mcp-errors.ts    |     100 |      100 |     100 |     100 |                   
  ...pool-entry.ts |   77.56 |    84.11 |   77.14 |   77.56 | ...1291,1299-1300 
  ...ool-events.ts |       8 |      100 |       0 |       8 | 132-158           
  mcp-pool-key.ts  |   97.46 |    93.93 |     100 |   97.46 | 175-176           
  ...ce-content.ts |   96.55 |    91.17 |     100 |   96.55 | 80-82             
  mcp-retry.ts     |   97.67 |    95.65 |     100 |   97.67 | 131-132           
  mcp-status.ts    |     100 |      100 |     100 |     100 |                   
  mcp-tool.ts      |   98.34 |    93.65 |     100 |   98.34 | ...-982,1037-1038 
  ...sport-pool.ts |   83.49 |    80.15 |   84.61 |   83.49 | ...1409,1416-1420 
  ...ace-budget.ts |   87.27 |     82.6 |     100 |   87.27 | ...00-305,340-345 
  memory-config.ts |     100 |      100 |     100 |     100 |                   
  ...iable-tool.ts |     100 |    84.61 |     100 |     100 | 101,108           
  monitor.ts       |   91.74 |    84.28 |   88.46 |   91.74 | ...93,606,804-809 
  notebook-edit.ts |   85.69 |    77.08 |   81.25 |   85.69 | ...95-911,957-958 
  ...escendants.ts |   36.17 |    64.51 |   55.55 |   36.17 | ...46-310,385-390 
  ...nforcement.ts |   83.21 |    90.69 |     100 |   83.21 | 147-158,207-220   
  read-file.ts     |   95.49 |    88.52 |   86.66 |   95.49 | ...49,464,536-537 
  ...p-resource.ts |   96.85 |      100 |   91.66 |   96.85 | 92-96             
  ...d-artifact.ts |   91.18 |    86.71 |    87.5 |   91.18 | ...26-427,441-453 
  ripGrep.ts       |    94.6 |    87.26 |   95.23 |    94.6 | ...33-734,740-741 
  ...-transport.ts |   71.42 |    55.55 |   71.42 |   71.42 | ...36-137,143-144 
  send-message.ts  |   81.13 |    89.74 |    62.5 |   81.13 | ...80-286,363-371 
  ...n-mcp-view.ts |   93.57 |     92.3 |      90 |   93.57 | 122-130           
  shell.ts         |   78.67 |    84.04 |   91.91 |   78.67 | ...5019,5082-5083 
  skill-utils.ts   |     100 |      100 |     100 |     100 |                   
  skill.ts         |   91.39 |    92.55 |      90 |   91.39 | ...84,488,534-556 
  ...eticOutput.ts |   95.12 |      100 |      80 |   95.12 | 87-88             
  task-create.ts   |    94.4 |    93.33 |   81.81 |    94.4 | 45-49,63-64,95    
  task-list.ts     |   73.38 |    77.77 |   83.33 |   73.38 | ...02,105,109-116 
  task-stop.ts     |   93.14 |    96.15 |   85.71 |   93.14 | 39-40,54-64       
  task-update.ts   |   82.89 |    83.92 |    92.3 |   82.89 | ...14-422,454-465 
  team-create.ts   |   97.22 |    85.71 |   83.33 |   97.22 | 48-49,129-130     
  team-delete.ts   |   86.74 |    83.33 |   83.33 |   86.74 | 37-38,42-48,72-73 
  ...n-approval.ts |   92.14 |    96.77 |   77.77 |   92.14 | 38-39,42-43,93-99 
  todoWrite.ts     |   95.13 |    87.85 |   93.33 |   95.13 | ...23-527,540-545 
  tool-error.ts    |     100 |      100 |     100 |     100 |                   
  tool-names.ts    |     100 |      100 |     100 |     100 |                   
  tool-registry.ts |   78.57 |    79.59 |    82.6 |   78.57 | ...89-990,998-999 
  tool-search.ts   |   96.19 |    89.72 |   93.33 |   96.19 | ...09,259-264,426 
  tools.ts         |   93.11 |    92.53 |   91.66 |   93.11 | ...69-570,586-592 
  ...reapproved.ts |   99.27 |    94.11 |     100 |   99.27 | 170               
  web-fetch.ts     |   96.05 |    90.54 |   96.77 |   96.05 | ...85-786,800-801 
  web-search.ts    |   90.53 |    83.57 |      80 |   90.53 | ...1007,1065-1068 
  write-file.ts    |    86.7 |    84.92 |   88.88 |    86.7 | ...24-827,864-899 
  zoom-image.ts    |   95.76 |    93.75 |      90 |   95.76 | 54-59,203-204     
 src/tools/agent   |   87.22 |    87.68 |   88.69 |   87.22 |                   
  agent.ts         |   85.84 |    86.59 |   86.31 |   85.84 | ...4315,4337-4347 
  fork-profile.ts  |   93.65 |       90 |     100 |   93.65 | ...33-134,171-174 
  fork-subagent.ts |   98.73 |       95 |     100 |   98.73 | 101-102,173       
 ...tools/artifact |   95.78 |    92.51 |   88.63 |   95.78 |                   
  artifact-tool.ts |   91.46 |    88.46 |   71.42 |   91.46 | ...13-314,322-325 
  ...-publisher.ts |     100 |    85.71 |     100 |     100 | 32                
  ...-publisher.ts |   96.74 |    97.72 |    87.5 |   96.74 | 29-30,156-157     
  html.ts          |     100 |    96.77 |     100 |     100 | 122               
  ...-publisher.ts |     100 |       80 |     100 |     100 | 30                
  oss-publisher.ts |    98.1 |    91.48 |     100 |    98.1 | 43-45             
  publisher.ts     |     100 |      100 |     100 |     100 |                   
 ...s/computer-use |   90.21 |    82.17 |   78.08 |   90.21 |                   
  bootstrap.ts     |   59.42 |    80.95 |   41.66 |   59.42 | ...35-339,341-345 
  client.ts        |   80.11 |       90 |   77.77 |   80.11 | ...97,242-243,274 
  constants.ts     |     100 |    94.73 |     100 |     100 | 129,256           
  downloader.ts    |   65.29 |    52.77 |   58.33 |   65.29 | ...99-300,316-355 
  index.ts         |     100 |      100 |     100 |     100 |                   
  install-state.ts |   94.44 |    72.72 |     100 |   94.44 | 44-45             
  ...n-detector.ts |     100 |     87.5 |     100 |     100 | 50                
  schemas.ts       |     100 |      100 |     100 |     100 |                   
  tool.ts          |    96.3 |    85.71 |     100 |    96.3 | 75-76,184,252-258 
 ...tools/workflow |   86.24 |    84.81 |      75 |   86.24 |                   
  workflow.ts      |   86.24 |    84.81 |      75 |   86.24 | ...61,506,508-509 
 src/utils         |   92.85 |    89.63 |   96.86 |   92.85 |                   
  LruCache.ts      |     100 |      100 |     100 |     100 |                   
  ...Controller.ts |     100 |      100 |     100 |     100 |                   
  ...ssageQueue.ts |     100 |      100 |     100 |     100 |                   
  ...cFileWrite.ts |   94.94 |    92.47 |     100 |   94.94 | ...43-544,651-655 
  bareMode.ts      |   81.81 |      100 |      50 |   81.81 | 18-19             
  ...ry-content.ts |   98.45 |    95.45 |     100 |   98.45 | 132-133,159-160   
  browser.ts       |   86.84 |    78.94 |     100 |   86.84 | 34,36-37,65-66    
  btwUtils.ts      |   13.95 |      100 |       0 |   13.95 | 17-31,34-55       
  bundlePaths.ts   |     100 |      100 |     100 |     100 |                   
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  ...ncyLimiter.ts |   94.64 |    95.23 |     100 |   94.64 | 64-66             
  ...igResolver.ts |     100 |      100 |     100 |     100 |                   
  ...engthError.ts |   91.06 |    89.47 |     100 |   91.06 | ...46-147,154-155 
  ...n-branches.ts |   95.81 |    93.95 |      95 |   95.81 | ...91-492,504-517 
  ...tion-chain.ts |     100 |      100 |     100 |     100 |                   
  cronDisplay.ts   |     100 |    97.61 |     100 |     100 | 46                
  cronParser.ts    |   95.34 |    93.33 |     100 |   95.34 | 41-42,47-48,70-71 
  debugLogger.ts   |   96.66 |    96.66 |   88.88 |   96.66 | 192-196           
  editHelper.ts    |   93.63 |     83.9 |     100 |   93.63 | ...27-428,462-463 
  editor.ts        |   97.65 |    95.45 |     100 |   97.65 | ...35-336,338-339 
  encoding.ts      |     100 |      100 |     100 |     100 |                   
  env.ts           |     100 |      100 |     100 |     100 |                   
  ...arResolver.ts |   94.28 |    88.88 |     100 |   94.28 | 28-29,125-126     
  ...entContext.ts |   96.63 |    90.13 |   96.66 |   96.63 | ...42,444-445,512 
  errorParsing.ts  |     100 |      100 |     100 |     100 |                   
  ...rReporting.ts |   95.65 |    93.33 |     100 |   95.65 | 37-38             
  errors.ts        |   82.62 |    94.32 |    61.9 |   82.62 | ...62-378,382-388 
  fetch.ts         |   90.68 |    82.51 |     100 |   90.68 | ...72,483-484,503 
  file-identity.ts |     100 |      100 |     100 |     100 |                   
  fileUtils.ts     |   94.87 |    92.95 |   96.15 |   94.87 | ...1907,1915-1916 
  forkedAgent.ts   |   92.45 |    82.35 |   93.75 |   92.45 | ...34,642,647-654 
  formatters.ts    |     100 |      100 |     100 |     100 |                   
  ...eUtilities.ts |    92.4 |    86.95 |     100 |    92.4 | ...52-158,168-169 
  ...rStructure.ts |   94.39 |    94.28 |     100 |   94.39 | ...29-132,343-348 
  getPty.ts        |   31.57 |       50 |     100 |   31.57 | 26-38             
  git-branches.ts  |    91.6 |    84.21 |    92.3 |    91.6 | ...90,405-410,570 
  gitDiff.ts       |   95.19 |    81.36 |     100 |   95.19 | ...1073,1419-1420 
  gitDirect.ts     |   98.84 |    94.28 |     100 |   98.84 | 234,318           
  ...noreParser.ts |   94.48 |    93.22 |     100 |   94.48 | ...23-124,158-159 
  gitUtils.ts      |   78.02 |    81.25 |   85.71 |   78.02 | ...22-123,147-198 
  github-prs.ts    |   95.74 |    82.27 |     100 |   95.74 | 216,314-322       
  iconvHelper.ts   |     100 |      100 |     100 |     100 |                   
  ...rePatterns.ts |     100 |      100 |     100 |     100 |                   
  image-view.ts    |   95.12 |    93.33 |     100 |   95.12 | ...68-172,240-244 
  ...ionManager.ts |     100 |     90.9 |     100 |     100 | 27                
  ...lPromptIds.ts |     100 |      100 |     100 |     100 |                   
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  jsonl-utils.ts   |   95.27 |     93.1 |     100 |   95.27 | ...16-317,359-362 
  ...-detection.ts |     100 |      100 |     100 |     100 |                   
  ...iconv-lite.ts |     100 |      100 |     100 |     100 |                   
  ...simple-git.ts |   96.77 |    91.66 |     100 |   96.77 | 38                
  ...m-headless.ts |      96 |    88.88 |     100 |      96 | 34                
  ...iagnostics.ts |    96.4 |     94.2 |     100 |    96.4 | ...66,293-294,376 
  ...yDiscovery.ts |    92.4 |    89.13 |     100 |    92.4 | ...28,331,522-525 
  ...tProcessor.ts |   94.01 |       90 |     100 |   94.01 | ...47-353,445-446 
  ...Inspectors.ts |     100 |      100 |     100 |     100 |                   
  modelId.ts       |   98.96 |    98.21 |     100 |   98.96 | 153               
  ...kerChecker.ts |    90.9 |    91.66 |     100 |    90.9 | 73-79             
  notebook.ts      |   94.57 |    89.91 |   95.83 |   94.57 | ...21,333,385-387 
  openaiLogger.ts  |   91.66 |    89.74 |     100 |   91.66 | ...26-228,251-256 
  osc8.ts          |   54.26 |    64.86 |   83.33 |   54.26 | ...72-195,197-257 
  partUtils.ts     |     100 |    98.64 |     100 |     100 | 211               
  pathReader.ts    |     100 |      100 |     100 |     100 |                   
  paths.ts         |   93.61 |    92.42 |     100 |   93.61 | ...62-563,565-567 
  pdf.ts           |   92.17 |    85.81 |     100 |   92.17 | ...64-565,606-611 
  projectPath.ts   |     100 |      100 |     100 |     100 |                   
  projectRoot.ts   |   71.73 |    78.57 |     100 |   71.73 | 54-66             
  ...ectSummary.ts |   89.62 |    72.41 |     100 |   89.62 | ...40-145,196-199 
  ...tIdContext.ts |     100 |      100 |     100 |     100 |                   
  proxyUtils.ts    |     100 |      100 |     100 |     100 |                   
  ...rDetection.ts |   71.15 |       86 |     100 |   71.15 | ...-90,96-101,147 
  ...noreParser.ts |   92.63 |    91.66 |     100 |   92.63 | ...77-178,197-198 
  rateLimit.ts     |   93.75 |    89.62 |     100 |   93.75 | ...13,218-219,262 
  ...text-range.ts |   96.98 |    87.15 |     100 |   96.98 | ...87-688,763-764 
  readManyFiles.ts |   95.75 |    80.86 |     100 |   95.75 | ...05,558,568-572 
  retry.ts         |   96.09 |    92.52 |     100 |   96.09 | ...67,558-559,577 
  retryContext.ts  |     100 |      100 |     100 |     100 |                   
  ...sification.ts |   97.63 |    97.02 |     100 |   97.63 | ...17,251-252,278 
  retryPolicy.ts   |   97.72 |    90.56 |     100 |   97.72 | 130-131           
  ripgrepUtils.ts  |   90.04 |    93.43 |   95.45 |   90.04 | ...55-565,598-599 
  ...sDiscovery.ts |   97.46 |    93.05 |     100 |   97.46 | ...04,182-183,202 
  ...iagnostics.ts |   83.08 |     67.5 |   92.59 |   83.08 | ...23,543-544,550 
  ...tchOptions.ts |   84.87 |    86.61 |   96.29 |   84.87 | ...71,696,725-734 
  ...odelPrefix.ts |     100 |      100 |     100 |     100 |                   
  runtimeStatus.ts |    97.5 |    89.74 |     100 |    97.5 | 162-163           
  safe-mode.ts     |     100 |      100 |     100 |     100 |                   
  safeJsonParse.ts |     100 |      100 |     100 |     100 |                   
  ...nStringify.ts |     100 |      100 |     100 |     100 |                   
  ...-child-env.ts |     100 |      100 |     100 |     100 |                   
  ...aConverter.ts |   98.03 |    97.75 |     100 |   98.03 | 100,102-103       
  ...aValidator.ts |   92.09 |    83.65 |   90.47 |   92.09 | ...60,882-883,896 
  ...r-launcher.ts |   96.35 |    93.97 |   85.71 |   96.35 | ...35-336,347-348 
  sedEditParser.ts |   91.78 |    92.18 |     100 |   91.78 | ...66-569,645-646 
  ...nIdContext.ts |     100 |      100 |     100 |     100 |                   
  ...orageUtils.ts |   95.98 |    83.96 |     100 |   95.98 | ...70,386,466,485 
  ...-pager-env.ts |     100 |      100 |     100 |     100 |                   
  ...fety-rules.ts |     100 |     89.7 |     100 |     100 | ...01,304,309-311 
  shell-utils.ts   |   86.07 |    88.34 |     100 |   86.07 | ...2269,2276-2280 
  ...lAstParser.ts |   98.16 |    91.91 |     100 |   98.16 | ...1244-1246,1256 
  ...ContextEnv.ts |     100 |       92 |     100 |     100 | 50-52             
  ...nlyChecker.ts |   96.33 |    96.57 |     100 |   96.33 | ...83-284,292-293 
  sideQuery.ts     |   86.82 |    86.66 |     100 |   86.82 | ...79-185,187-193 
  ...pEventSink.ts |     100 |       80 |     100 |     100 | 61                
  ...tGenerator.ts |     100 |      100 |     100 |     100 |                   
  ...ameContext.ts |     100 |      100 |     100 |     100 |                   
  symlink.ts       |   77.77 |       50 |     100 |   77.77 | 44,54-59          
  ...e-encoding.ts |   85.96 |    76.47 |     100 |   85.96 | 58-61,64-65,78-79 
  ...emEncoding.ts |   96.36 |    91.17 |     100 |   96.36 | 59-60,124-125     
  terminalSafe.ts  |     100 |      100 |     100 |     100 |                   
  ...Serializer.ts |   98.72 |       90 |     100 |   98.72 | 42-43,134,201-203 
  testUtils.ts     |   53.33 |      100 |   33.33 |   53.33 | ...53,59-64,70-72 
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  textUtils.ts     |      65 |      100 |      75 |      65 | 56-75             
  thoughtUtils.ts  |     100 |    95.65 |     100 |     100 | 99                
  ...-converter.ts |   95.23 |    85.71 |     100 |   95.23 | 36-37             
  ...name-utils.ts |     100 |      100 |     100 |     100 |                   
  ...-finalizer.ts |   97.66 |     90.9 |     100 |   97.66 | 165-166,168-172   
  tool-utils.ts    |    95.2 |    93.61 |     100 |    95.2 | ...58-159,162-163 
  ...ultCleanup.ts |   54.62 |       64 |      75 |   54.62 | ...03-105,108-134 
  ...Compaction.ts |   96.13 |    96.42 |     100 |   96.13 | ...34-339,341-346 
  ...pt-records.ts |   85.89 |    83.78 |     100 |   85.89 | ...91-395,425-440 
  truncation.ts    |   90.56 |    90.26 |     100 |   90.56 | ...35-443,480-486 
  windowsPath.ts   |   89.47 |    79.31 |     100 |   89.47 | ...57-58,62,90-91 
  ...aceContext.ts |   96.74 |    91.04 |     100 |   96.74 | ...69,196,299-301 
  xml.ts           |    97.8 |    87.69 |     100 |    97.8 | 98-99             
  yaml-parser.ts   |   83.87 |    77.27 |     100 |   83.87 | ...31-234,239-240 
 ...ils/filesearch |   83.94 |    80.72 |   94.73 |   83.94 |                   
  crawlCache.ts    |     100 |      100 |     100 |     100 |                   
  crawler.ts       |    82.9 |    76.81 |   95.08 |    82.9 | ...1563,1597-1598 
  fileSearch.ts    |   93.78 |    87.67 |     100 |   93.78 | ...71-272,274-275 
  fzfWorker.ts     |       0 |        0 |       0 |       0 | 1-109             
  ...rkerHandle.ts |   84.05 |    75.43 |   89.47 |   84.05 | ...30-334,340-341 
  ignore.ts        |     100 |    97.36 |     100 |     100 | 187               
  result-cache.ts  |     100 |    93.75 |     100 |     100 | 49                
 ...uest-tokenizer |   69.76 |    75.47 |   85.29 |   69.76 |                   
  ...eTokenizer.ts |   65.72 |    74.02 |    92.3 |   65.72 | ...65-466,479-533 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...tTokenizer.ts |   68.39 |    69.49 |    90.9 |   68.39 | ...24-325,327-328 
  ...ageFormats.ts |   76.92 |      100 |   33.33 |   76.92 | 46-49,56-57       
  textTokenizer.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 | 1                 
-------------------|---------|----------|---------|---------|-------------------

For detailed HTML reports, please see the 'coverage-reports-22.x-ubuntu-latest' artifact from the main CI run.

@qwen-code-ci-bot

qwen-code-ci-bot commented Aug 7, 2026

Copy link
Copy Markdown
Collaborator

Confidence: 4/5 — the fix rounds turned this into exactly what a careful review asks for: every one of the ten maintainer findings is resolved with a test that pins it, the new provenance machinery closes a real update-check hole, and CI is settled green on the reviewed commit. The remaining unknowns are external to the diff.

Stepping back: the approach still matches my independent proposal, and I found no simpler path it missed. Every increment since the first pass maps one-to-one onto review feedback — no drive-by growth, nothing to carve out. The one judgment call worth surfacing honestly is finding 7's resolution: explicit marketplace selection now wins over root-Qoder-manifest detection, the opposite of what the review suggested — and I think it is the better trade-off, because silently installing different content than the user selected would be worse than a clear error. The test-to-production ratio is now ~2.6:1.

My reservations, named plainly: the converter's contract with the real Qoder plugin format is still validated only against synthetic fixtures built from the same understanding as the implementation (a mismatch fails closed as a conversion error, and plugin-format compatibility is an established, documented investment of this repo), and the CLI integration leg runs only in the merge queue by design. The sandboxed verify run triggered alongside this re-run is still in flight and will post its A/B evidence separately; if it surfaces anything, this assessment should be revisited.

One housekeeping note for the maintainer: the standing change-request reviews on this PR are the automated review flow flagging that Integration Tests (CLI, No Sandbox) was skipped in CI — that job is gated to merge_group in ci.yml and never runs on PR pushes, so it gets its run when this PR enters the merge queue, not before.

CI is settled green on the reviewed commit and no pull-request workflow runs are pending, so approval attaches to that commit directly rather than being deferred.

中文说明

置信度:4/5 —— 修复轮次把这个 PR 打磨成了认真评审所要求的样子:维护者的 10 个发现全部解决且每条都有测试锁定,新的溯源机制堵住了更新检查上的真实漏洞,该 commit 的 CI 已全部落定为绿。剩余的不确定性都在 diff 之外。

整体来看:方案仍与我独立推演的一致,也没有找到它遗漏的更简路径。首轮之后的每一处增量都与评审反馈一一对应——没有顺手膨胀,也没有可裁剪的部分。值得坦率指出的唯一判断分歧是第 7 条的解决方式:显式 marketplace 选择现在优先于根 Qoder manifest 检测,与评审建议的方向相反——但我认为这是更好的取舍,因为静默安装与用户所选不同的内容,比给出一个明确的错误更糟。测试与生产代码比现在约为 2.6:1。

明确说明我的保留意见:转换器与真实 Qoder 插件格式的契合仍只通过与实现同源的合成 fixture 验证(不匹配时以转换错误 fail-closed,且插件格式兼容是本仓库既有且已文档化的投入方向);CLI 集成腿按设计只在合并队列运行。随本次重跑启动的沙箱 verify 运行仍在进行,其 A/B 证据会单独发布;若发现问题,本结论应重新评估。

给维护者的一个说明:PR 上挂着的 request-changes 评审来自自动评审流程对 "Integration Tests (CLI, No Sandbox) 在 CI 中被跳过" 的标记——该任务在 ci.yml 中仅由 merge_group 触发,PR push 时永不运行,所以它会在本 PR 进入合并队列时运行,而不是在那之前。

该 commit 的 CI 已全部落定为绿,且没有仍在进行的 pull_request 工作流运行,因此批准直接绑定该 commit,而非延迟等待。

Qwen Code · qwen3.8-max

Reviewed at 9854b9d81e14676fef8e699686c5fc319f141c7b · re-run with @qwen-code /triage

@qwen-code-ci-bot qwen-code-ci-bot left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, looks ready to ship — CI landed green after the review. ✅

@wenshao

wenshao commented Aug 7, 2026

Copy link
Copy Markdown
Collaborator

Code review

Nice addition — the Qoder manifest/converter shape mirrors the Claude path closely, and reusing buildQwenExtensionFromPlugin instead of forking it is the right call. Ten findings below, most-severe first; each was independently verified against refs/pull/8661/head.


1. checkForExtensionUpdate now converts the user's own source directory (packages/core/src/extension/github.ts:333)

Conversion was hoisted out of the isSupportedArchivePath(...) guard, so for type: 'local' installs it now runs on installMetadata.source — the user's real checkout — instead of only on an extracted-archive temp dir.

qwen extensions install ./my-marketplace:some-plugin gives {type:'local', pluginName:'some-plugin'} (marketplace.ts:433-440). The new call at 332-338 routes into the else if (pluginName) branch (extension-converter.ts:56) → convertClaudePluginPackage (claude-converter.ts:490-502), which does pluginDir = path.join(extensionDir, 'plugin<sha256>') + mkdir + resolvePluginSource, i.e. downloadFromGitHubRelease / cloneFromGit into the user's checkout. Every automatic update check (checkForAllExtensionUpdates, TUI startup path) therefore writes a git clone into ./my-marketplace/plugin<sha256>/ and issues GitHub API calls. The finally at 353-359 only removes tempDir and the converted tmpdir, so the clone is left behind — and the next check's clone into a now non-empty directory fails, leaving the extension permanently NOT_UPDATABLE.

Suggest keeping the conversion inside the archive guard, or at minimum converting a copy rather than installMetadata.source in place.

2. Configured contextFileName drops the auto-detected QWEN.md (packages/core/src/extension/qoder-converter.ts:122)

resolveContextFiles puts the QWEN.md detection on the else arm of the hasConfiguredFiles ternary (108-125), so a manifest with "contextFileName": "docs/usage.md" emits contextFileName: ['docs/usage.md', 'system-prompt.md'] and the plugin's QWEN.md is silently dropped.

This contradicts the docs added in this same PR (docs/users/extension/introduction.md): "If the plugin also contains QWEN.md or declares other context files, all context files are retained and deduplicated." Configured files should augment, not replace.

3. ./-prefixed entries defeat the system-prompt.md dedupe (packages/core/src/extension/qoder-converter.ts:130)

Lines 111-119 filter but never normalize, so "contextFileName": ["./system-prompt.md"] survives verbatim; contextFiles.includes('system-prompt.md') at 130 is then false and 132 appends it again. Result: ['./system-prompt.md', 'system-prompt.md'] — the same file, so the plugin's whole system prompt is injected into the model context twice. Normalize with path.normalize / relative-to-extensionDir before the includes check.

4. Malformed root .mcp.json is rejected silently (packages/core/src/extension/qoder-converter.ts:75)

Both the JSON.parse catch (71-76) and the shape checks (77-87) log only through createDebugLogger('QODER_CONVERTER') and return undefined. A plugin whose .mcp.json has a trailing comma installs with a success message and zero MCP servers; /mcp lists nothing and the user has no way to tell "rejected" from "absent". A user-visible warning (as the Claude path does elsewhere) would be enough.

5. Path-valued mcpServers is parsed without unwrapping .mcpServers (packages/core/src/extension/claude-converter.ts:608)

Pre-existing, but this PR exports buildQwenExtensionFromPlugin and makes the line reachable from convertQoderPlugin. With "mcpServers": ".mcp.json" in the manifest, loadRootMcpServers is skipped (qoder-converter.ts:147, the value is a truthy string) and line 608 assigns the entire parsed file, producing mcpServers: { mcpServers: { sample: {...} } }. That registers one bogus server literally named mcpServers (no command/url/httpUrl, fails at session load) and drops the real one. Note this PR's own loadRootMcpServers (qoder-converter.ts:80) reads parsed.mcpServers correctly — the two paths disagree.

6. Converted Qoder plugins skip markdown variable replacement (packages/core/src/extension/extensionManager.ts:1960)

performVariableReplacement is still gated on originSource === 'Claude', but Qoder plugins use the identical plugin layout (commands/, skills/, agents/, hooks/) and go through the same builder. So their command markdown keeps literal ${CLAUDE_PLUGIN_ROOT}/... paths, keeps ```!git status``` blocks that are never migrated to !{git status}, and keeps ~/.claude/... paths. A byte-identical plugin works as a Claude plugin and misbehaves as a Qoder one. The gate should include 'Qoder'.

7. pluginName branch shadows the new Qoder branch (packages/core/src/extension/extension-converter.ts:70)

parseSourceAndPluginName (marketplace.ts:417, 96) splits any :name suffix into installMetadata.pluginName regardless of format, so qwen extensions install QwenLM/some-qoder-repo:my-plugin hits else if (pluginName) at line 54 before the .qoder-plugin/plugin.json test at line 70, and fails with Marketplace configuration not found at <tmp>/.claude-plugin/marketplace.json. The Gemini branch (line 50) is deliberately ordered above the pluginName branch — the Qoder branch should be too.

8. Confinement check re-implements resolvePluginRelativeFile (packages/core/src/extension/qoder-converter.ts:111) — cleanup

Lines 112-118 are the same three checks as resolvePluginRelativeFile (claude-converter.ts:557-586) — path.isAbsolute, isPathWithin, realPathWithin — minus its per-rejection warnings. So contextFileName: "../../secrets.md" or a symlinked context file is dropped with no breadcrumb, where the Claude path logs why. This PR already exports buildQwenExtensionFromPlugin from that module; exporting and calling resolvePluginRelativeFile too would remove the copy and restore the warnings.

9. Update check gates on originSource === 'Qoder' rather than "a commit was recorded" (packages/core/src/extension/github.ts:438) — cleanup

buildQwenExtensionFromPlugin deletes .git for both Claude-standalone and Qoder conversions (claude-converter.ts:627-630), and .claude-plugin/plugin.json is checked before .qoder-plugin/plugin.json (extension-converter.ts:65 vs 69). A repo shipping both manifests is tagged 'Claude', extensionManager.ts:1826-1828 deletes the SHA that was just recorded, and github.ts:424 returns NOT_UPDATABLE forever — even though the code added here would work for it verbatim. localHash = installMetadata.gitCommit ?? await localGit.revparse(['HEAD']), with no origin check, drops the Qoder branch, the delete, and the Claude carve-out at once.

10. resolveContextFiles duplicates the loader's own defaults (packages/core/src/extension/qoder-converter.ts:97) — cleanup

getContextFileNames (extensionManager.ts:375-382) already falls back to ['QWEN.md'], and line 1387 already filters by fs.existsSync. Baking the literal "QWEN.md" into every generated qwen-extension.json means that if the default context filename ever changes, previously installed Qoder extensions keep pointing at the old name while everything else picks up the new one. The genuinely converter-specific behavior is the symlink-escape rejection and appending system-prompt.md; the rest can be left to the loader by leaving contextFileName undefined.


Reviewed at high effort: 4 finder angles over the 15 changed files, then an independent verifier per finding location — 20 candidates verified, 4 refuted, 10 reported.

@qwen-code-ci-bot qwen-code-ci-bot left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 via Qwen Code /review (v0.21.7)

Comment thread packages/core/src/extension/github.ts
Comment thread packages/core/src/extension/qoder-converter.ts Outdated
Comment thread packages/core/src/extension/qoder-converter.ts Outdated
Comment thread packages/core/src/extension/qoder-converter.ts Outdated
Comment thread packages/core/src/extension/qoder-converter.ts Outdated
Comment thread packages/core/src/extension/qoder-converter.test.ts
Comment thread packages/core/src/extension/qoder-converter.test.ts
Comment thread packages/core/src/extension/qoder-converter.ts Outdated
Comment thread packages/core/src/extension/qoder-converter.test.ts
Comment thread packages/core/src/extension/qoder-converter.ts
@callmeYe

callmeYe commented Aug 7, 2026

Copy link
Copy Markdown
Collaborator Author

fix(core): address Qoder extension review feedback

Addressed the review findings:

  • Local update checks no longer convert or modify marketplace source directories.
  • Qoder detection now precedes marketplace plugin selection.
  • Context paths are normalized and deduplicated; QWEN.md stays active alongside configured context and system-prompt.md. QWEN.md is explicit only when another context must be explicit because the loader fallback applies only when contextFileName is absent.
  • Root and path-valued MCP configurations are unwrapped and validated, and malformed configurations fail visibly.
  • Qoder installs use the existing plugin-variable migration path.
  • Converted Git installs retain and use their recorded commit regardless of compatible origin.
  • Shared path-confinement logic is reused.

Validation: focused unit tests, focused CLI integration, build, typecheck, and lint.

@callmeYe

callmeYe commented Aug 7, 2026

Copy link
Copy Markdown
Collaborator Author

fix(core): handle annotated tags and unsafe parse errors

Follow-up fixes for the two current Critical review findings:

  • Git update checks for explicit refs query and prefer peeled commit hashes, preventing annotated tags from appearing perpetually stale.
  • Qoder manifest and MCP parse errors strip terminal control sequences before propagation.

Validation: focused unit tests, Core build, typecheck, lint, diff check, and confidentiality scan.

@callmeYe

callmeYe commented Aug 7, 2026

Copy link
Copy Markdown
Collaborator Author

fix(core): harden Qoder conversion edge cases

Addressed the remaining verified conversion suggestions:

  • Context entries must be regular files and are revalidated against the converted tree after selective resource collection.
  • Inline and file-based MCP server entries share strict object validation.
  • A failed generated-manifest rewrite removes its temporary converted directory.
  • Git update tests no longer depend on the ambient GitHub token.
  • The CLI integration test performs defensive uninstall cleanup before and after execution.
  • Synthetic regression cases now cover inline MCP precedence, malformed metadata, escaping symlinks, non-string context entries, and default context safety.

Validation: focused unit tests, focused CLI integration, Core build, typecheck, lint, diff check, and confidentiality scan.

@qwen-code-ci-bot qwen-code-ci-bot left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 via Qwen Code /review (v0.21.7)

Comment thread packages/core/src/extension/qoder-converter.ts
Comment thread packages/core/src/extension/qoder-converter.ts
Comment thread packages/core/src/extension/github.ts
Comment thread packages/core/src/extension/github.test.ts Outdated
Comment thread packages/core/src/extension/github.ts
Comment thread packages/core/src/extension/qoder-converter.ts
Comment thread packages/core/src/extension/github.test.ts
Comment thread packages/core/src/extension/qoder-converter.test.ts
Comment thread packages/core/src/extension/qoder-converter.ts
Comment thread packages/core/src/extension/extensionManager.ts
@wenshao

wenshao commented Aug 7, 2026

Copy link
Copy Markdown
Collaborator

@qwen-code /takeover

@qwen-code-dev-bot qwen-code-dev-bot added the autofix/takeover Summon the autofix loop to manage this PR (remove to release; needs triage+) label Aug 7, 2026
@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

🤝 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/takeover label (or comment @qwen-code /takeover stop) to release.

中文说明

🤝 已接管:autofix 循环现在管理此 PR —— 将持续处理新的评审反馈与 base 冲突,直到移除标签或达到轮次上限。移除 autofix/takeover 标签(或评论 @qwen-code /takeover stop)即可释放。

@qwen-code-dev-bot

qwen-code-dev-bot commented Aug 7, 2026

Copy link
Copy Markdown
Collaborator

AutoFix round 3 finishedview run. See this round's report below.

中文说明

AutoFix 第 3 轮已完成 —— 查看运行。本轮报告见下方。

@callmeYe

callmeYe commented Aug 7, 2026

Copy link
Copy Markdown
Collaborator Author

fix(core): sanitize Qoder conversion inputs

Addressed the two Critical findings on the latest head:

  • Sanitized manifest-controlled MCP paths across structural validation errors.
  • Normalized nullable optional metadata before generating the extension config.

Validation: Qoder converter unit tests, full build, typecheck, lint, focused CLI integration, diff check, independent reproduction, and confidentiality scan passed. The full CLI integration suite was also attempted; unrelated authenticated model tests failed because the local test environment had no valid credentials. Remaining Suggestions are deferred to follow-up work under the repository's review-round scope rule.

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

🤖 Reviewed the latest feedback — no changes needed. Why, point by point: · 已审阅最新反馈——无需改动。逐点说明原因如下:

Autofix round summary (PR #8661) — no code changes

This round triaged all feedback newer than the last evaluation. The two Critical findings from the latest automated review are already fixed on the current head, every remaining Suggestion already has a recorded disposition (fixed in earlier commits or deferred under the repository's review-round scope rule), and the one outstanding review objection — the skipped integration suite — is cleared below with a local run of the exact suite the merge-queue CI job executes. No commits were made this round.

Clearing the CHANGES_REQUESTED objection: integration suite

Both CHANGES_REQUESTED reviews state: "Not reviewed: build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite did not run locally."

  • The integration_cli job in .github/workflows/ci.yml is gated on if: github.event_name == 'merge_group', so it is skipped by design on every PR and runs only in the merge queue; on a PR it can never report anything but SKIPPED.
  • This round ran the exact suite locally against head 99faf6acac after npm run build && npm run bundle:
    • npm run test:integration:cli:sandbox:none38 files / 202 tests: 183 passed, 18 skipped, 1 failed. The skips are vitest's conditional benchmark/load-test skips, as configured.
    • The Qoder install E2E covering this PR (cli/extensions-install.test.ts) passed both in the full suite run and in a dedicated rerun: 2/2, including installs a local Qoder plugin.
  • The single failure is cli/qwen-config-dir.test.ts > 1d: CLI functions normally when QWEN_HOME is not set, which fails during CLI startup with EACCES: permission denied, mkdir '/home/github-runner/.qwen'. Evidence that this is an environment artifact, not a PR defect:
    1. The failing path (initializeLlmOutputLanguagewriteOutputLanguageFile in packages/cli/src/utils/languageUtils.ts, invoked from packages/cli/src/gemini.tsx) is untouched by this PR and exists identically on origin/main and at the merge base; neither the failing code nor the test file appears in the PR diff.
    2. This autofix sandbox runs as a user without write access to $HOME (/home/github-runner is root-owned, mode 755), so any CLI startup that creates ~/.qwen/output-language.md fails there regardless of branch. Merge-queue runners execute with a writable HOME.
    3. A/B proof on the same tree and bundle: rerunning cli/qwen-config-dir.test.ts with only HOME pointed at a writable directory passes 7/7, including test 1d.

Dispositions of the remaining feedback

  • Round-2 Criticals — MCP-path terminal-escape injection in structural validation errors, and null displayName/description crashing config load: fixed on head 99faf6acac (sanitized mcpPath once before all structural throws; nullable metadata normalized at the Qoder input boundary). Re-verified present in the tree this round; the threads already carry the fix replies.
  • Deferred round-2 Suggestions (local Qoder update-check copy cost, Claude no-recorded-commit branch test, token-injection update-check test, requireWrapper behavior tests, missing configured-MCP-file diagnostic, tmp-dir cleanup assertion, mcpServers value-shape guard test, empty/directory-valued MCP path handling, ${CLAUDE_PLUGIN_ROOT} replacement gate): already deferred to follow-up PRs under the repository's review-round scope rule, each with a recorded reply on its own thread. Per that rule this round adds no further non-Critical expansion, so those threads remain open with their recorded reasons.
  • Round-1 findings and @wenshao's code review: addressed by the earlier commits on this branch (ddd2cdc0dd, a193b2208a, a032fdb98b); the round-2 automated review no longer detects any of them. The carried-forward integration-coverage item (R1-10) is covered by the full-suite run above rather than only the previous focused-file run.

Verification

Commands actually run this round against head 99faf6acac:

  • npm run build — passed
  • npm run bundle — passed
  • npm run typecheck — passed
  • npm run lint — passed
  • cd packages/core && npx vitest run src/extension/ (touched package) — 22 files / 617 tests passed
  • npm run test:integration:cli:sandbox:none after build+bundle (the exact merge-queue job script) — 38 files / 202 tests: 183 passed, 18 skipped, 1 environment-caused failure (analysis above)
  • Focused rerun cli/qwen-config-dir.test.ts with a writable HOME — 7/7 passed (proves the single failure is environmental)
  • Focused rerun cli/extensions-install.test.ts — 2/2 passed, including the local Qoder plugin install
中文说明

Autofix 轮次总结(PR #8661)—— 无代码变更

本轮对上次评估之后的所有反馈进行了分类处理。最新一轮自动审查的两个 Critical 发现已在当前 head 上修复;其余所有 Suggestion 均已有记录在案的处理结论(要么已在更早的提交中修复,要么已按仓库的审查轮次范围规则延期);唯一未决的审查异议——集成测试套件未运行——已通过在本地运行与合并队列 CI job 完全相同的套件予以澄清。本轮未产生任何提交。

澄清 CHANGES_REQUESTED 异议:集成测试套件

两个 CHANGES_REQUESTED 审查均写明:"Not reviewed: build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite did not run locally。"

  • .github/workflows/ci.yml 中的 integration_cli job 以 if: github.event_name == 'merge_group' 为门槛,因此在每个 PR 上按设计被跳过、只在合并队列中运行;在 PR 上它永远只能是 SKIPPED。
  • 本轮在 npm run build && npm run bundle 之后,对 head 99faf6acac 在本地运行了完全相同的套件:
    • npm run test:integration:cli:sandbox:none38 个文件 / 202 个用例:183 通过、18 跳过、1 失败。跳过项为 vitest 按配置对 benchmark/load 测试的条件性跳过。
    • 覆盖本 PR 的 Qoder 安装 E2E(cli/extensions-install.test.ts)在完整套件运行与单独重跑中均通过:2/2,包含 installs a local Qoder plugin
  • 唯一的失败是 cli/qwen-config-dir.test.ts > 1d: CLI functions normally when QWEN_HOME is not set,在 CLI 启动阶段报 EACCES: permission denied, mkdir '/home/github-runner/.qwen'。以下证据证明这是环境问题,而非本 PR 引入的缺陷:
    1. 失败路径(packages/cli/src/utils/languageUtils.ts 中的 initializeLlmOutputLanguagewriteOutputLanguageFile,由 packages/cli/src/gemini.tsx 调用)未被本 PR 改动,且在 origin/main 与合并基点上完全一致;失败代码与该测试文件均不在 PR diff 中。
    2. 本 autofix 沙箱所用的用户对 $HOME 没有写权限(/home/github-runner 属主为 root、权限 755),因此任何需要创建 ~/.qwen/output-language.md 的 CLI 启动在该环境下都会失败,与分支无关。合并队列 runner 的 HOME 是可写的。
    3. 在同一代码树、同一 bundle 上的 A/B 证明:仅把 HOME 指向一个可写目录后重跑 cli/qwen-config-dir.test.ts,该文件 7/7 全部通过,包括用例 1d。

其余反馈的处理结论

  • Round-2 的两个 Critical——结构性校验错误中的 MCP 路径终端转义注入,以及 null displayName/description 导致配置加载崩溃:已在 head 99faf6acac 修复(在所有结构性 throw 之前一次性净化 mcpPath;在 Qoder 输入边界对可空元数据做规范化)。本轮已重新确认修复存在于代码树中;相应线程已有修复回复。
  • 已延期的 round-2 Suggestion(本地 Qoder 更新检查的整树复制开销、Claude 无记录 commit 分支的测试、token 注入更新检查测试、requireWrapper 行为测试、缺失的已配置 MCP 文件诊断、临时目录清理断言、mcpServers 值形状守卫测试、空串/目录值 MCP 路径处理、${CLAUDE_PLUGIN_ROOT} 替换门槛):均已按仓库审查轮次范围规则延期到后续 PR,且各自线程上已有记录在案的回复。按该规则本轮不再做任何非 Critical 的扩展,这些线程保持打开并保留其记录的理由。
  • Round-1 的发现与 @wenshao 的代码审查:已由本分支更早的提交处理(ddd2cdc0dda193b2208aa032fdb98b);round-2 自动审查已不再检出其中任何一项。承接的集成覆盖问题(R1-10)本轮以完整套件运行覆盖,而不仅是此前那次针对单个文件的运行。

验证

本轮在 head 99faf6acac 上实际执行的命令:

  • npm run build —— 通过
  • npm run bundle —— 通过
  • npm run typecheck —— 通过
  • npm run lint —— 通过
  • cd packages/core && npx vitest run src/extension/(受影响包)—— 22 个文件 / 617 个用例全部通过
  • build+bundle 之后运行 npm run test:integration:cli:sandbox:none(与合并队列 job 完全相同的脚本)—— 38 个文件 / 202 个用例:183 通过、18 跳过、1 个环境导致的失败(分析见上)
  • 以可写 HOME 单独重跑 cli/qwen-config-dir.test.ts —— 7/7 通过(证明唯一失败为环境问题)
  • 单独重跑 cli/extensions-install.test.ts —— 2/2 通过,包含本地 Qoder 插件安装

Base-conflict check · 基分支冲突检查: no conflict with main. · 与 main 无冲突。


🧠 Handled by Qwen Code · model/模型 qwen3.8-max

@qwen-code-ci-bot qwen-code-ci-bot left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 via Qwen Code /review (v0.21.7)

Comment thread packages/core/src/extension/github.ts
Comment thread packages/core/src/extension/github.test.ts
Comment thread packages/core/src/extension/qoder-converter.ts Outdated
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

🤖 Addressed the latest review feedback (round 1/100). What changed, and what I pushed back on: · 已处理最新评审反馈(第 1/100 轮)。改动内容与我反驳保留之处如下:

Round 3 review feedback addressed

All three inline suggestions are resolved in commit 171c99163e.

Findings and dispositions

1. Nested-external marketplace installs record the wrong commit — RESOLVED

[Suggestion] packages/core/src/extension/github.ts:441 (rc:3736834728): for marketplace installs whose plugin content comes from a nested external source, the recorded gitCommit belonged to the outer marketplace-repo clone, so update checks compared the marketplace repo's remote HEAD against a commit that does not describe the installed content (missed updates for the nested repo, or repeated byte-identical reinstalls).

Verified against the code: the outer clone's hash is recorded before conversion, and all four external paths in resolvePluginSource (string URL, github, url, git-subdir) discarded the hash of their own clone — and the release-archive download path has no commit at all.

Fix — implemented the suggested NOT_UPDATABLE option rather than threading nested commits/URLs into persisted metadata (impossible for nested release-archive sources, and a larger persisted-shape change):

  • resolvePluginSource now reports whether the plugin content was fetched from a source external to the marketplace repository (relative-path sources inside the marketplace repo still report internal).
  • convertClaudePluginPackage and convertCompatibleExtension surface that flag.
  • The installer drops the recorded clone commit when the content came from an external source, so the existing converted-install branch returns NOT_UPDATABLE for this population — the pre-PR behavior. Marketplace installs whose plugin lives inside the marketplace repo keep commit-based update checks.

Tests: new install tests assert the commit is retained for an internal marketplace plugin and dropped for a github-sourced nested plugin; the no-recorded-commit NOT_UPDATABLE update-check test now covers the Claude arm as well as Qoder.

2. Qoder local-update test does not pin source-directory immutability — RESOLVED

[Suggestion] packages/core/src/extension/github.test.ts:824 (rc:3736834736): applied the suggested assertion — the test now also asserts expect(await fs.readdir(tempDir)).toEqual(['.qoder-plugin']), so a future regression converting the Qoder source directory in place fails this test instead of shipping silently behind an unchanged UPDATE_AVAILABLE result.

3. "mcpServers": null hard-fails the Qoder install — RESOLVED

[Suggestion] packages/core/src/extension/qoder-converter.ts:150 (rc:3736834756): resolveMcpServers now treats a JSON null value as absent, taking the same root .mcp.json fallback as a missing field — consistent with every sibling optional field and with the Claude converter's falsy skip. The now-unreachable null arm was removed from the shape guard. Tests cover null with a valid root .mcp.json (servers loaded from the file) and null without one (no servers, no error).

Conflicts

None (--conflict false; no merge performed).

Verification

  • npm run build — passed
  • npm run typecheck — passed
  • npm run lint — passed
  • npx prettier --check on the 7 changed files — passed
  • cd packages/core && npx vitest run src/extension/qoder-converter.test.ts src/extension/github.test.ts src/extension/claude-converter.test.ts src/extension/extensionManager.test.ts — 4 files, 288 tests passed
  • npm run bundle, then cd integration-tests && QWEN_SANDBOX=false npx vitest run cli/extensions-install.test.ts — 2 tests passed (run locally because the suite was skipped in CI this round)
  • Settings sources unchanged, so npm run generate:settings-schema was not required.
中文说明

第 3 轮评审反馈处理结果

三条行内建议已全部在提交 171c99163e 中解决。

发现与处理

1. 嵌套外部源的 marketplace 安装记录了错误的提交 — 已解决

[Suggestion] packages/core/src/extension/github.ts:441(rc:3736834728):对于插件内容来自嵌套外部源的 marketplace 安装,记录的 gitCommit 属于外层 marketplace 仓库的克隆,导致更新检查比较的是 marketplace 仓库的远端 HEAD 与一个并不能描述已安装内容的提交(嵌套仓库的更新被漏报,或反复重装字节级相同的内容)。

已对照代码核实:外层克隆的哈希在转换之前记录,而 resolvePluginSource 中全部四条外部路径(字符串 URL、githuburlgit-subdir)都丢弃了各自克隆的哈希——release 归档下载路径则根本没有提交可言。

修复方式——实现了建议中的 NOT_UPDATABLE 方案,而不是把嵌套克隆的提交/URL 透传进持久化元数据(嵌套 release 归档源没有提交可记录,且会引入更大的持久化结构改动):

  • resolvePluginSource 现在会上报插件内容是否来自 marketplace 仓库之外的源(marketplace 仓库内的相对路径源仍上报为内部)。
  • convertClaudePluginPackageconvertCompatibleExtension 将该标志逐层透出。
  • 当内容来自外部源时,安装流程丢弃已记录的克隆提交,使既有的"已转换安装"分支对这类安装返回 NOT_UPDATABLE——即本 PR 之前的行为。插件位于 marketplace 仓库内部的 marketplace 安装仍保留基于提交的更新检查。

测试:新增安装测试断言内部 marketplace 插件保留提交、github 嵌套源插件丢弃提交;无记录提交时返回 NOT_UPDATABLE 的更新检查测试从仅覆盖 Qoder 扩展为同时覆盖 Claude

2. Qoder 本地更新测试未钉住源目录不可变性 — 已解决

[Suggestion] packages/core/src/extension/github.test.ts:824(rc:3736834736):已按建议加上断言——该测试现在同时断言 expect(await fs.readdir(tempDir)).toEqual(['.qoder-plugin']),这样未来若有重构再次对 Qoder 源目录做原地转换,本测试会失败,而不是在 UPDATE_AVAILABLE 结果不变的掩护下静默溜走。

3. "mcpServers": null 导致 Qoder 安装硬性失败 — 已解决

[Suggestion] packages/core/src/extension/qoder-converter.ts:150(rc:3736834756):resolveMcpServers 现在把 JSON null 值当作缺省处理,走与字段缺失相同的根 .mcp.json 回退——与同一 manifest 的其他可选字段以及 Claude 转换器跳过 falsy 值的行为保持一致。形状守卫中因此不可达的 null 分支已删除。测试覆盖两种情形:null 且存在合法根 .mcp.json(从文件加载服务器),以及 null 且无该文件(无服务器、不报错)。

冲突

无(--conflict false,未执行合并)。

验证

  • npm run build — 通过
  • npm run typecheck — 通过
  • npm run lint — 通过
  • 对 7 个改动文件执行 npx prettier --check — 通过
  • cd packages/core && npx vitest run src/extension/qoder-converter.test.ts src/extension/github.test.ts src/extension/claude-converter.test.ts src/extension/extensionManager.test.ts — 4 个文件、288 个测试全部通过
  • npm run bundle 后执行 cd integration-tests && QWEN_SANDBOX=false npx vitest run cli/extensions-install.test.ts — 2 个测试通过(因本轮 CI 跳过了该套件,故在本地补跑)
  • 未改动 settings 源,因此无需执行 npm run generate:settings-schema

Base-conflict check · 基分支冲突检查: no conflict with main. · 与 main 无冲突。

Re-review when you have a moment. After round 100 this bot stops and leaves the PR for a human. · 有空请复审;第 100 轮后本 bot 停止并将 PR 交给人工。


🧠 Handled by Qwen Code · model/模型 qwen3.8-max

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

🤖 Reviewed the latest feedback — no changes needed. Why, point by point: · 已审阅最新反馈——无需改动。逐点说明原因如下:

🤖 Reviewed the latest feedback — no changes needed. Why, point by point: · 已审阅最新反馈——无需改动。逐点说明原因如下:

Autofix round summary (PR #8661) — no code changes

This round's feedback contains exactly three new items: replies from @callmeYe on the three round-3 **[Suggestion]** threads, each one confirming the finding but deferring the remaining deeper scope to a follow-up PR under the repository's review-round scope rule. There are no failed checks, no CHANGES_REQUESTED reviews, and no issue-level comments. No commits were made this round.

Key context: all three replies were posted ~27 seconds after commit 171c99163e (which already fixed all three findings) and are anchored to the pre-fix head 99faf6aca — they crossed with that push. Nothing in them names a defect in the landed fixes or asks for anything to be reverted.

Findings and dispositions

1. rc:3737011114 — nested external marketplace sources: update-metadata limitation — NO ACTION (deferred by reviewer)

Reply on the github.ts:441 thread (rc:3736834728): "Verified as a real update-metadata limitation for nested external marketplace sources, but deferred to a follow-up PR under the repository's review-round scope rule. This round makes no further non-Critical lifecycle changes."

The in-PR mitigation already landed in 171c99163e and was re-verified present at head: resolvePluginSource reports externalContent, convertCompatibleExtension surfaces it, and the installer drops the outer clone's gitCommit for externally-fetched content so those installs return NOT_UPDATABLE instead of comparing the wrong repo. What remains — threading the nested source's own commit/URL into persisted metadata so such installs become truly updatable — is exactly the larger follow-up work the reply defers, and it was already declined in-PR in round 3 (impossible for nested release-archive sources; larger persisted-shape change). No action this round.

2. rc:3737011695 — Qoder local-update test hardening — NO ACTION (deferred by reviewer)

Reply on the github.test.ts:828 thread (rc:3736834736): "Valid regression-test hardening, but deferred to a follow-up PR … The current implementation already avoids source mutation; this round adds no further non-Critical test expansion."

The requested assertion already landed in 171c99163e and was re-verified present at head (github.test.ts:826: expect(await fs.readdir(tempDir)).toEqual(['.qoder-plugin'])). Any further test expansion is deferred by the reply itself, which also confirms the implementation already avoids source mutation. No action this round.

3. rc:3737012104 — optional-null consistency in the Qoder converter — NO ACTION (deferred by reviewer)

Reply on the qoder-converter.ts thread (rc:3736834756): "Verified as an optional-null consistency edge case, but deferred to a follow-up PR under the repository's review-round scope rule. This round makes no further non-Critical conversion changes."

The concrete defect (a JSON "mcpServers": null hard-failing Qoder installs) was fixed in 171c99163e and re-verified present at head: resolveMcpServers now treats null as absent, taking the same root .mcp.json fallback as a missing field (qoder-converter.ts:148). Any broader null-consistency sweep is the deferred follow-up scope. No action this round.

Why no changes

  • Every reply explicitly records that this round makes no further non-Critical changes; acting on them by adding code would contradict the feedback itself.
  • All three underlying findings are already fixed and verified on the current head 171c99163e; reverting landed, tested fixes is not requested and would re-introduce real defects (e.g. the null mcpServers hard-fail).
  • Checks are green (the Integration Tests (CLI, No Sandbox) job is merge_group-gated and SKIPPED by design on PRs; the previous round ran that exact suite locally against this code path). The three deferred threads stay open so their recorded dispositions remain visible.

Verification

No code changed this round, so no verification commands were executed. Head 171c99163e is byte-identical to the commit the previous round verified and recorded: npm run build, npm run typecheck, npm run lint, npx prettier --check (changed files), focused Vitest in packages/core (4 files / 288 tests passed), and the focused CLI integration suite after npm run bundle (2 tests passed). This round only re-confirmed by code inspection that the three fixes are present at head.

中文说明

Autofix 轮次小结(PR #8661)—— 无代码改动

本轮反馈仅包含三条新内容:@callmeYe 在第 3 轮三条 **[Suggestion]** 主题串下的回复,每条都确认了对应发现,但依据仓库的评审轮次范围规则,将剩余的更深层工作推迟到后续 PR。没有失败的检查,没有 CHANGES_REQUESTED 评审,也没有 PR 级评论。本轮未产生任何提交。

关键背景:这三条回复都发布于提交 171c99163e(该提交已修复全部三条发现)落地后约 27 秒,且锚定在修复前的 head 99faf6aca 上——它们与那次推送擦肩而过。回复中没有任何内容指出已落地修复存在缺陷,也没有要求回退任何改动。

发现与处理

1. rc:3737011114 —— 嵌套外部 marketplace 源的更新元数据局限 —— 不处理(评审方已推迟)

github.ts:441 主题串(rc:3736834728)下的回复:"Verified as a real update-metadata limitation for nested external marketplace sources, but deferred to a follow-up PR under the repository's review-round scope rule. This round makes no further non-Critical lifecycle changes."(确认这是嵌套外部 marketplace 源的真实更新元数据局限,但依据仓库评审轮次范围规则推迟到后续 PR。本轮不再做非 Critical 的生命周期改动。)

PR 内的缓解措施已在 171c99163e 中落地,并已重新核实存在于当前 head:resolvePluginSource 上报 externalContentconvertCompatibleExtension 将其透出,安装流程对来自外部源的插件内容丢弃外层克隆的 gitCommit,使这类安装返回 NOT_UPDATABLE,而不是拿错误的仓库做比较。剩余工作——把嵌套源自身的提交/URL 写入持久化元数据、让这类安装真正可更新——正是回复所推迟的后续工作,且第 3 轮已说明不在本 PR 内做(嵌套 release 归档源没有提交可记录,且持久化结构改动更大)。本轮不处理。

2. rc:3737011695 —— Qoder 本地更新测试加固 —— 不处理(评审方已推迟)

github.test.ts:828 主题串(rc:3736834736)下的回复:"Valid regression-test hardening, but deferred to a follow-up PR … The current implementation already avoids source mutation; this round adds no further non-Critical test expansion."(有效的回归测试加固,但推迟到后续 PR……当前实现已避免改动源目录;本轮不再扩充非 Critical 测试。)

所要求的断言已在 171c99163e 中落地,并已重新核实存在于当前 head(github.test.ts:826expect(await fs.readdir(tempDir)).toEqual(['.qoder-plugin']))。进一步的测试扩充由回复本身推迟,且回复也确认当前实现已避免改动源目录。本轮不处理。

3. rc:3737012104 —— Qoder 转换器中的 optional-null 一致性 —— 不处理(评审方已推迟)

qoder-converter.ts 主题串(rc:3736834756)下的回复:"Verified as an optional-null consistency edge case, but deferred to a follow-up PR under the repository's review-round scope rule. This round makes no further non-Critical conversion changes."(确认是可选字段 null 一致性的边界情形,但依据仓库评审轮次范围规则推迟到后续 PR。本轮不再做非 Critical 的转换改动。)

具体缺陷(JSON 中 "mcpServers": null 导致 Qoder 安装硬性失败)已在 171c99163e 中修复,并已重新核实存在于当前 head:resolveMcpServers 现在把 null 当作缺省处理,与字段缺失相同,走根 .mcp.json 回退(qoder-converter.ts:148)。更广泛的 null 一致性梳理属于被推迟的后续工作。本轮不处理。

为什么不做改动

  • 三条回复都明确记录本轮不再做非 Critical 改动;此时再加代码反而违背反馈本身。
  • 三条底层发现已在当前 head 171c99163e 修复并验证;回退已落地、已测试的修复既无人要求,也会重新引入真实缺陷(例如 mcpServersnull 时的硬性失败)。
  • 检查全绿(Integration Tests (CLI, No Sandbox) 任务受 merge_group 门控,在 PR 上按设计就是 SKIPPED;上一轮已在本地针对本代码路径跑过同一套件)。三条被推迟的主题串保持打开状态,以便其处理记录持续可见。

验证

本轮未改动任何代码,因此未执行任何验证命令。当前 head 171c99163e 与上一轮已验证并记录的提交逐字节一致:npm run buildnpm run typechecknpm run lintnpx prettier --check(改动文件)、packages/core 定向 Vitest(4 个文件 / 288 个测试通过),以及 npm run bundle 后的定向 CLI 集成套件(2 个测试通过)。本轮仅通过代码检查重新确认三处修复仍存在于当前 head。

Base-conflict check · 基分支冲突检查: no conflict with main. · 与 main 无冲突。


🧠 Handled by Qwen Code · model/模型 qwen3.8-max

@qwen-code-ci-bot qwen-code-ci-bot left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 via Qwen Code /review (v0.21.7)

Comment on lines +59 to +71
} else if (fs.existsSync(path.join(extensionDir, QODER_PLUGIN_MANIFEST))) {
newExtensionDir = (await convertQoderPlugin(extensionDir)).convertedDir;
originSource = 'Qoder';
} else if (pluginName) {
newExtensionDir = (
await convertClaudePluginPackage(
extensionDir,
pluginName,
networkPolicy,
signal,
)
).convertedDir;
const converted = await convertClaudePluginPackage(
extensionDir,
pluginName,
networkPolicy,
signal,
);
newExtensionDir = converted.convertedDir;
originSource = 'Claude';
externalContent = converted.externalContent;

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Critical] R4-1: The Qoder manifest check runs before the pluginName branch, so a repo carrying both .claude-plugin/marketplace.json and a root .qoder-plugin/plugin.json always converts the repo root as one Qoder plugin — an explicit marketplace selection is silently ignored and different content is installed. — Failure scenario: probe-verified at this commit against a dual-manifest fixture: convertCompatibleExtension(root, 'requested-plugin') returned originSource: 'Qoder' and installed the root Qoder plugin; the requested plugin name was never consulted. Reachable via explicit owner/repo:name, interactive plugin choice on bare owner/repo, and local ./dir:name. Consent shows the substituted identity, but non-interactive consent defaults to yes, and the interactive flow asks "Select a plugin to install from marketplace" and then discards the answer. The stated rationale ("Qoder detection now precedes marketplace plugin selection") and its test fixture cover only the Qoder-only repo state (no marketplace.json), not dual-manifest installs. Suggested fix: honor an explicit selection first — reorder the two branches (safe for the local-update-check path, which passes pluginName as undefined), or guard the Qoder branch with !pluginName.

Suggested change
} else if (fs.existsSync(path.join(extensionDir, QODER_PLUGIN_MANIFEST))) {
newExtensionDir = (await convertQoderPlugin(extensionDir)).convertedDir;
originSource = 'Qoder';
} else if (pluginName) {
newExtensionDir = (
await convertClaudePluginPackage(
extensionDir,
pluginName,
networkPolicy,
signal,
)
).convertedDir;
const converted = await convertClaudePluginPackage(
extensionDir,
pluginName,
networkPolicy,
signal,
);
newExtensionDir = converted.convertedDir;
originSource = 'Claude';
externalContent = converted.externalContent;
} else if (pluginName) {
const converted = await convertClaudePluginPackage(
extensionDir,
pluginName,
networkPolicy,
signal,
);
newExtensionDir = converted.convertedDir;
originSource = 'Claude';
externalContent = converted.externalContent;
} else if (fs.existsSync(path.join(extensionDir, QODER_PLUGIN_MANIFEST))) {
newExtensionDir = (await convertQoderPlugin(extensionDir)).convertedDir;
originSource = 'Qoder';
中文说明

R4-1:Qoder manifest 检查位于 pluginName 分支之前,因此同时包含 .claude-plugin/marketplace.json 和根目录 .qoder-plugin/plugin.json 的仓库永远会把仓库根目录整体转换成一个 Qoder 插件——显式的 marketplace 选择会被静默忽略,最终安装的是不同的内容。

失败场景:已在本提交上用双 manifest 夹具探针验证:convertCompatibleExtension(root, 'requested-plugin') 返回 originSource: 'Qoder' 并安装了根目录 Qoder 插件;被请求的插件名从未被查询。可通过显式 owner/repo:name、裸 owner/repo 的交互式插件选择、本地 ./dir:name 三种方式触发。consent 界面会显示被替换后的身份,但非交互 consent 默认同意,且交互流程询问 "Select a plugin to install from marketplace" 之后却丢弃了用户的答案。已陈述的理由("Qoder detection now precedes marketplace plugin selection")及其配套测试夹具只覆盖纯 Qoder 仓库状态(无 marketplace.json),未覆盖双 manifest 安装状态。

建议修复:优先尊重显式选择——交换两个分支的顺序(对以 pluginName 为 undefined 调用本函数的本地更新检查路径安全),或用 !pluginName 保护 Qoder 分支。

— qwen3.8-max via Qwen Code /review (v0.21.7)

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

🤖 Addressed the latest review feedback (round 2/100). What changed, and what I pushed back on: · 已处理最新评审反馈(第 2/100 轮)。改动内容与我反驳保留之处如下:

Autofix round summary (PR #8661)

Two feedback items were triaged this round; both are addressed. No base-conflict merge was needed (--conflict false).

1. [Critical] R4-1 — Qoder manifest check runs before the pluginName branch (inline finding rc:3737796685)

Decision: fixed. Verified against the code at the reviewed commit: in convertCompatibleExtension, the .qoder-plugin/plugin.json existence check preceded the pluginName branch, so a repo carrying both .claude-plugin/marketplace.json and a root Qoder manifest always converted the repo root as one Qoder plugin; an explicit marketplace selection (owner/repo:name, interactive plugin choice, ./dir:name) was silently discarded. Traced all three callers (extensionManager.ts install path, and the local / archive-url update-check paths in github.ts): they all pass installMetadata.pluginName, which is set only for explicit or interactively chosen marketplace selections, so prioritizing it cannot change behavior for Qoder-only installs or Qoder update checks (where it is undefined).

Changes (minimal, matching the suggested fix):

  • packages/core/src/extension/extension-converter.ts: reordered the two branches so an explicit pluginName selection is honored before Qoder root-manifest detection, with a short comment recording the precedence invariant. Gemini/native detection order is untouched.
  • packages/core/src/extension/qoder-converter.test.ts: the existing "defaults the version and reports Qoder as the origin" test passed 'ignored-plugin-name' and asserted the old (buggy) precedence; it now calls convertCompatibleExtension(root) without a plugin name, which is the actual shape of a Qoder install.
  • Added regression test "honors an explicit marketplace selection over a root Qoder manifest": a dual-manifest fixture asserting that with an explicit selection the installed content is the marketplace plugin (originSource: 'Claude', name/version from the selected plugin) and that without a selection the Qoder plugin is still preferred. Proven load-bearing: temporarily restoring the pre-fix branch order makes this test fail (originSource becomes Qoder); with the fix it passes.

Edge case note: pluginName set on a repo without marketplace.json now errors with "Marketplace configuration not found" — identical to the pre-PR (main) behavior for that input, so no regression.

2. [CHANGES_REQUESTED review] "Not reviewed: build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite did not run locally"

Decision: addressed by running the suite. This PR adds an integration test (installs a local Qoder plugin in integration-tests/cli/extensions-install.test.ts) that had never been executed. Built the bundle and ran that file locally with sandbox disabled: both tests pass against the bundled CLI (see Verification below).

Verification

Commands actually run this round, in order:

  • npx vitest run src/extension/qoder-converter.test.ts src/extension/claude-converter.test.ts (packages/core) — passed, 77 tests
  • npx vitest run src/extension/extensionManager.test.ts src/extension/github.test.ts (packages/core) — passed, 212 tests
  • Combined re-run of the four touched test files (packages/core) — passed, 289 tests
  • Load-bearing check: new regression test run against the pre-fix branch order restored from git show HEAD:...extension-converter.ts — failed as expected (1 failed); restored the fix and it passes
  • npx prettier --check on both changed files — one formatting fix applied via npx prettier --write, then clean
  • npm run build — passed
  • npm run typecheck — passed
  • npm run lint — passed
  • npm run bundle — passed (dist/cli.js rebuilt)
  • cd integration-tests && npx cross-env QWEN_SANDBOX=false npx vitest run cli/extensions-install.test.ts — passed, 2/2 tests (installs a local extension, verifies a command, and updates it; installs a local Qoder plugin)
  • Post-commit: git status clean; npx vitest run src/extension/qoder-converter.test.ts on the committed tree — passed, 25 tests

No settings source was changed, so npm run generate:settings-schema was not required.

Committed as 809914a03afix(core): honor explicit marketplace selection over Qoder manifest (2 files changed, 61 insertions, 7 deletions).

中文说明

Autofix 本轮总结(PR #8661

本轮分诊了两个反馈项,均已处理。无需合并 base 冲突(--conflict false)。

1. [Critical] R4-1 — Qoder manifest 检查位于 pluginName 分支之前(行内发现 rc:3737796685

决定:已修复。 已在被审查提交上核实:convertCompatibleExtension.qoder-plugin/plugin.json 的存在性检查位于 pluginName 分支之前,因此同时包含 .claude-plugin/marketplace.json 和根目录 Qoder manifest 的仓库永远会把仓库根目录整体转换成一个 Qoder 插件;显式的 marketplace 选择(owner/repo:name、交互式插件选择、./dir:name)会被静默丢弃。已追踪全部三个调用方(extensionManager.ts 安装路径,以及 github.ts 中本地 / archive-url 更新检查路径):它们都传入 installMetadata.pluginName,而该字段仅在显式或交互式选择了 marketplace 插件时才会被设置,因此优先处理它不会改变纯 Qoder 安装或 Qoder 更新检查的行为(这些场景下该字段为 undefined)。

改动(最小化,与建议修复一致):

  • packages/core/src/extension/extension-converter.ts:交换两个分支的顺序,使显式的 pluginName 选择在 Qoder 根 manifest 检测之前被尊重,并用一条简短注释记录该优先级不变量。Gemini/原生检测顺序未改动。
  • packages/core/src/extension/qoder-converter.test.ts:原有测试 "defaults the version and reports Qoder as the origin" 传入 'ignored-plugin-name' 并断言了旧的(有缺陷的)优先级;现在改为不带插件名调用 convertCompatibleExtension(root),这才是 Qoder 安装的真实调用形态。
  • 新增回归测试 "honors an explicit marketplace selection over a root Qoder manifest":双 manifest 夹具,断言显式选择时安装的是 marketplace 插件(originSource: 'Claude',name/version 来自被选中的插件),且无选择时仍优先 Qoder 插件。已证明其有效性:临时恢复修复前的分支顺序会使该测试失败(originSource 变为 Qoder);应用修复后通过。

边界情况说明:对没有 marketplace.json 的仓库传入 pluginName 现在会报 "Marketplace configuration not found" —— 与该输入在 PR 之前(main 上)的行为完全一致,因此无回归。

2. [CHANGES_REQUESTED 评审] "Not reviewed: build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite did not run locally"

决定:通过实际运行该套件来处理。 本 PR 新增了一个从未被执行过的集成测试(integration-tests/cli/extensions-install.test.ts 中的 installs a local Qoder plugin)。已构建 bundle 并在本地禁用沙箱运行该文件:两个测试均在打包后的 CLI 上通过(见下方验证部分)。

验证

本轮实际执行的命令(按顺序):

  • npx vitest run src/extension/qoder-converter.test.ts src/extension/claude-converter.test.ts(packages/core)— 通过,77 个测试
  • npx vitest run src/extension/extensionManager.test.ts src/extension/github.test.ts(packages/core)— 通过,212 个测试
  • 四个受影响测试文件的合并重跑(packages/core)— 通过,289 个测试
  • 有效性验证:将新回归测试运行于从 git show HEAD:...extension-converter.ts 恢复的修复前分支顺序上 — 按预期失败(1 个失败);恢复修复后通过
  • 对两个改动文件执行 npx prettier --check — 通过 npx prettier --write 修复了一处格式问题,随后检查通过
  • npm run build — 通过
  • npm run typecheck — 通过
  • npm run lint — 通过
  • npm run bundle — 通过(dist/cli.js 已重新构建)
  • cd integration-tests && npx cross-env QWEN_SANDBOX=false npx vitest run cli/extensions-install.test.ts — 通过,2/2 个测试(installs a local extension, verifies a command, and updates itinstalls a local Qoder plugin
  • 提交后:git status 干净;在提交后的代码树上运行 npx vitest run src/extension/qoder-converter.test.ts — 通过,25 个测试

未改动任何 settings 源,因此无需运行 npm run generate:settings-schema

已提交为 809914a03afix(core): honor explicit marketplace selection over Qoder manifest(2 个文件变更,61 行新增,7 行删除)。

Base-conflict check · 基分支冲突检查: no conflict with main. · 与 main 无冲突。

Re-review when you have a moment. After round 100 this bot stops and leaves the PR for a human. · 有空请复审;第 100 轮后本 bot 停止并将 PR 交给人工。


🧠 Handled by Qwen Code · model/模型 qwen3.8-max

@callmeYe

callmeYe commented Aug 8, 2026

Copy link
Copy Markdown
Collaborator Author

Follow-up to the automatic round-three changes: external marketplace content is now recorded independently from the outer install source. Git and GitHub Release update checks conservatively return not updatable for nested external content, while repository-contained plugins continue using the outer revision or tag. Legacy Claude marketplace metadata without provenance preserves prior behavior.

Verified with synthetic fixtures: 294 focused unit tests, the packaged CLI integration test, build, typecheck, lint, and diff checks.

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

🤖 Reviewed the latest feedback — no changes needed. Why, point by point: · 已审阅最新反馈——无需改动。逐点说明原因如下:

🤖 Reviewed the latest feedback — no changes needed. Why, point by point:

The only feedback newer than the last evaluation (2026-08-07T18:03:28Z) is the previous autofix round's own summary comment. There are no new reviews, no inline comments, no failed checks, and no still-red checks to address.

  1. Issue-level comment (@callmeYe, 2026-08-08T01:54:15Z) — this is the round summary the autofix workflow itself posted after the previous round. It describes work already present in this branch's HEAD: commit 809914a03a (honor explicit marketplace selection over Qoder manifest) and commit 9854b9d81e (preserve nested plugin update provenance). It is informational, contains no request or finding, and needs no reply.
  2. [Critical] R4-1 (the last automated-reviewer inline finding, posted at the evaluation cutoff) — already fixed by the previous round, and re-verified against the current code this round: in convertCompatibleExtension, the explicit pluginName branch now runs before root Qoder-manifest detection, so a dual-manifest repository honors the requested plugin instead of silently substituting the root Qoder plugin. No further action.
  3. CI status — all 18 reported checks are SUCCESS or legitimately SKIPPED; no failed or persisting checks were reported.

The branch remains at 9854b9d81e with a clean tree. No commits were made this round.

中文说明

🤖 已审阅最新反馈——无需更改。逐点说明如下:

上次评估(2026-08-07T18:03:28Z)之后唯一的反馈是上一轮 autofix 流程自己发布的总结评论。没有新的评审、没有内联评论、没有失败的检查,也没有持续红色的检查需要处理。

  1. Issue 级评论(@callmeYe,2026-08-08T01:54:15Z)——这是 autofix 工作流在上一轮结束后自己发布的轮次总结。它描述的工作已经存在于本分支的 HEAD 中:提交 809914a03a(显式 marketplace 选择优先于 Qoder manifest)和提交 9854b9d81e(保留嵌套插件的更新来源信息)。该评论为信息性内容,不包含任何请求或发现,无需回复。
  2. [Critical] R4-1(自动评审器最后一条内联发现,发布于评估截止时刻)——已由上一轮修复,本轮并对照当前代码再次验证:在 convertCompatibleExtension 中,显式的 pluginName 分支现在先于根目录 Qoder manifest 检测执行,因此同时包含两种 manifest 的仓库会安装用户请求的插件,而不是被静默替换为根目录的 Qoder 插件。无需进一步处理。
  3. CI 状态——报告中的 18 项检查全部为 SUCCESS 或合理的 SKIPPED;没有失败或持续存在的检查问题。

分支保持在 9854b9d81e,工作区干净。本轮未产生任何提交。

Base-conflict check · 基分支冲突检查: no conflict with main. · 与 main 无冲突。


🧠 Handled by Qwen Code · model/模型 qwen3.8-max

@wenshao

wenshao commented Aug 8, 2026

Copy link
Copy Markdown
Collaborator

@qwen-code /triage

@qwen-code-ci-bot

qwen-code-ci-bot commented Aug 8, 2026

Copy link
Copy Markdown
Collaborator

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: 375 passed · 0 failed · 375 total

中文 — 判定:✅ 通过 · 可合入(agent 判定)

沙箱验证在隔离、无凭证的容器中执行了该 PR 的代码(与 base 构建 A/B 对照、无 mock harness 断言、定向门禁)。仅作为评审证据,不构成评审、批准或 CI 检查

脚本断言:375 通过 · 0 失败 · 375 总计

Verification report

PR #8661 verification — feat(core): support Qoder plugin extensions

Verdict: merge-ready — 375/375 scripted assertions passed (0 unexpected failures), verified head 9854b9d81e14676fef8e699686c5fc319f141c7b against base c617405a20b80e489a5954488d8206f8f303f3f0 (HEAD^1). One advisory, non-blocking finding (pre-existing class, see Findings).

中文摘要
  • 结论:merge-ready。375/375 条脚本化断言全部通过,0 个意外失败。
  • A/B 结论:在 base(c617405a20)上,Qoder 插件的目录/归档/Git 安装全部被拒绝("missing a supported extension manifest" 等);在 head(9854b9d81e)上全部成功,且生成的扩展包含元数据、.mcp.json MCP 服务器、system-prompt.md+QWEN.md 上下文合并去重、资源目录,.git 被剥离,originSource=Qoder 被记录并跨实例持久化(见 01-ab-install-head-vs-base.png)。
  • 安全性:21/21 攻击探针按预期被拒/被跳过——逃逸的 manifest 符号链接、绝对/../ 上下文路径、逃逸的上下文/MCP/资源引用、逃逸的批量拷贝符号链接、含控制字符的解析错误、路径穿越名称等(02-security-probes.png)。
  • Git 溯源:13/13——gitCommit 记录真实检出提交,真实本地 remote 上的更新检测在安装后为 UP_TO_DATE、remote 前进后为 UPDATE_AVAILABLE;annotated tag 以 peeled 提交哈希比较(03-git-provenance-updates.png)。
  • 测试非空:3 个单点突变(删除 system-prompt 自动合并、删除 manifest 符号链接守卫、删除 Qoder 检测分支)分别使 3/1/7 个测试按预期断言变红(04-vacuity-matrix.png)。
  • 唯一发现(非阻塞、预先存在)validateName 的报错会把未净化的插件名原样回显到 CLI stderr,恶意名称中的 ANSI/控制字符会进入用户终端(05-validate-name-echoes-control-chars.png)。该问题在 native 路径上同样存在(预先存在),PR 只为其新增的解析错误做了净化。已给出并实测一行修复。
  • 未覆盖:npm/archive-URL 的真实网络路径(单测覆盖)、Qoder hooks 变量替换(无测试固定)、daemon/ACP/Web Shell 对 Qoder origin 的消费(仅类型加宽+typecheck)、逐 commit 归因(depth-2 不可达)。

Scope

  • Central claim: a Qoder plugin (.qoder-plugin/plugin.json) installs natively through the existing extension workflows (dir, archive, git) and becomes a working Qwen extension with preserved metadata, resources, MCP servers, and merged context — with Qoder recorded as origin.
  • Secondary A: conversion confines untrusted content (escaping manifests, context/MCP/resource references, symlinks; hostile manifest bytes never reach error output unsanitized).
  • Secondary B: converted Git installs record the checked-out commit and keep update checks working after .git removal, including annotated-tag refs; externalContent disables commit comparison.

Central claim — A/B proof

Environment: head = CI-built packages/core dist; base = scratch worktree at HEAD^1 rebuilt with npm run build -w packages/core (root node_modules symlinked in; lockfile untouched by the PR, so the dependency tree is identical — control purity asserted in-harness via realpath of the loaded entry point). Harness: ab-install.mjs drives the compiled ExtensionManager.installExtension over the real filesystem, per-cell isolated stores. Witness: evidence/01-ab-install-head-vs-base.png.

cell oracle head base (expected)
0 native-control (both arms) install succeeds PASS PASS
A dir install install + manifest/context/MCP/resources/.git/origin/persistence/uninstall 15 PASS rejected: "Configuration file not found … qwen-extension.json"
B wrapped zip (one top-level dir) flatten + install PASS rejected: "missing a supported extension manifest"
C flat zip (manifest at root) install PASS rejected: same
D ctx-variant dedup [QWEN.md, docs/ctx.md, system-prompt.md], system-prompt once 3 PASS rejected
totals 21/21 5/5 as predicted

Context merge semantics verified: configured files keep order, system-prompt.md appended, QWEN.md prepended, duplicates removed (cell D).

Secondary A — security probes (21/21, 02-security-probes.png)

All probes drove installExtension on hostile fixtures with an out-of-root secret marker; assertions check rejection, silent skip, and marker absence in the installed tree. Highlights: escaping manifest symlink and symlinked .qoder-plugin dir rejected (realPathWithin); absolute/..//symlinked context entries skipped while safe siblings kept; escaping mcpServers string path ignored; escaping bulk-copy symlink skipped with no symlink surviving into the installed extension; broken symlink tolerated; ANSI-laden invalid JSON rejected with a control-char-free message; non-object manifest / missing name / non-object MCP server rejected; name: "../../evil-ext" rejected with nothing written outside the extensions dir.

Edge probes (4/4): dual-manifest repo (.qoder-plugin + .claude-plugin) installs as Qoder (documented precedence, not pinned by a test — observation only); null-byte/slash/newline names rejected.

Secondary B — git provenance (13/13 head + 1 base, 03-git-provenance-updates.png)

Real git processes, local bare repos as remotes (no network). G1: git install records gitCommit == checkout commit, originSource=Qoder, externalContent=false, no .git installed; update check UP_TO_DATE immediately, UPDATE_AVAILABLE after pushing a commit. G2: annotated tag install records the commit hash (not the tag-object hash); unchanged tag → UP_TO_DATE (peeled comparison — the pre-PR code would have compared the tag-object hash against a commit hash); moved tag → UPDATE_AVAILABLE. G3: externalContent=true → NOT_UPDATABLE; legacy Claude-marketplace metadata (undefined externalContent, pluginName set) → NOT_UPDATABLE. Base arm: git install of a Qoder plugin rejected.

Vacuity matrix (04-vacuity-matrix.png)

mutation suite result
none (control) qoder + manager 144/144 green
M1 delete addContextFile('system-prompt.md') qoder-converter.test.ts 3 red at intended context assertions
M2 delete manifest-symlink guard qoder-converter.test.ts 1 red ("rejects invalid manifests and escaping manifest symlinks")
M3 delete Qoder detection branch qoder + manager 7 red (all Qoder install paths: local, archive-url, npm, Git)

No survivor among the introduced guards I mutated; the one surviving test under M1 ("merges explicit context … without duplicates") survives because its fixture lists system-prompt.md explicitly — the auto-add is pinned by the three tests M1 killed.

Targeted gates

  • Unit: qoder-converter (25) + claude-converter (52) + github (98) + extensionManager (119) + gemini-converter (11) = 305/305 on head (logs/gate-core-extension.log).
  • E2E: bundled CLI extensions-install.test.ts 2/2, including the new "installs a local Qoder plugin" (logs/e2e-cli-install.log).
  • Typecheck: core, acp-bridge, sdk-typescript clean (3 scripted checks).

Reviewer Test Plan walkthrough

  1. Dir install with metadata/resources/MCP/both context files — verified (cell A + E2E). 2. Wrapped-archive flatten — verified (cell B). 3. Git origin verified live (G1); archive-url/npm origins via the manager unit tests (mocked downloads; M3 proves they execute) — live network not exercised (no network in this container). 4. Update detection + uninstall — verified live (G1, cell A). 5. Escaping symlinks/manifest/context/resource — verified (S1/S2/S5/S7, M2).

Findings

F1 (advisory, non-blocking, pre-existing class): validateName echoes the raw untrusted name into error output

extensionManager.ts:2785 interpolates the manifest name verbatim into Invalid extension name: "${name}"…. The PR sanitizes its own new error paths with stripAnsiAndControl (proven by S9) but this shared door is untouched: a Qoder plugin named bad\u001b[31mRED\u0007BELL reaches the CLI user's terminal with raw ESC/BEL bytes on stderr (evidence/05-validate-name-echoes-control-chars.png, logs/ansi-qoder.err). The same echo reproduces on the pre-existing native qwen-extension.json path, so this is not a regression the PR introduced — the PR adds a new reachable surface for an existing class. Install is still safely rejected (schema + store direct-child guards hold), so severity is display-level terminal injection.

Measured minimal fix (advisory)

Wrap the echoed name: `Invalid extension name: "${stripAnsiAndControl(name)}". …` (import already exists in the package). Measured in a scratch tree: all three hostile names produce control-char-free errors (clean-error=true), benign installs byte-identical (edge probes 4/4), and the qoder+manager suites stay 144/144. Not applied to the PR — pre-existing code, author's call.

Not covered

  • Live npm-registry / archive-URL / GitHub-hosted installs (no network); those source types are covered at the manager level by the PR's unit tests and share the verified conversion seam.
  • Qoder hooks variable substitution (usesPluginVariables now includes Qoder): no test pins it; the shared performVariableReplacement is tested for Claude. Untested axis, noted.
  • Daemon/ACP/SDK/Web-Shell consumption of the widened origin union: type-only widening; acp-bridge + sdk typecheck clean; no behavioral route test run.
  • Per-commit attribution: depth-2 checkout exposes only the merge commit; the snapshot lists 8 commits, git rev-list HEAD^1..HEAD^2 returns 1 (shallow boundary) — aggregate diff verified instead.
  • Snapshot baseRefOid (7edc16ba…) drifted from the merge-ref parent; A/B used HEAD^1 per the merge-ref contract.
  • Windows/macOS path behavior (container is Linux).

Methodology

Container = CI's node:22-bookworm image, tree = refs/pull/8661/merge at depth 2. Harnesses (ab-install.mjs, security-probes.mjs, git-provenance.mjs, edge-probes.mjs, vacuity-matrix.sh) are mock-free: they import the compiled dist of the arm under test (realpath-pinned), drive the real ExtensionManager/checkForExtensionUpdate over real filesystems and real git processes with local bare remotes, and encode every expectation as a scripted PASS/FAIL. Raw logs in logs/; captures in evidence/ via scripts/verify-capture.mjs. Base control rebuilt only packages/core (the PR's changed workspace; zero internal @qwen-code deps, lockfile untouched).

Evidence images

01-ab-install-head-vs-base

02-security-probes

03-git-provenance-updates

04-vacuity-matrix

05-validate-name-echoes-control-chars

Harness scripts and raw logs are in the workflow run artifacts (7-day retention).

Qwen Code · sandboxed verification

@qwen-code-ci-bot qwen-code-ci-bot left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, looks ready to ship. ✅

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

🤖 Reviewed the latest feedback — no changes needed. Why, point by point: · 已审阅最新反馈——无需改动。逐点说明原因如下:

No action required this round

The review feedback collected for this round contains no actionable items:

  • Reviews: none
  • Inline comments: none
  • Failed checks: none
  • Still-red checks: none

The only issue-level comment is an automated status notice from @qwen-code-ci-bot reporting that sandboxed verification is running. It is informational only and does not request any change.

No code changes were made, and no commit was created. The PR head remains at 9854b9d81e.

中文说明

本轮无需处理

本轮收集的评审反馈中没有任何需要处理的项目:

  • 评审(Reviews):
  • 行内评论(Inline comments):
  • 失败的检查(Failed checks):
  • 持续失败的检查(Still-red checks):

唯一一条 Issue 级别的评论来自 @qwen-code-ci-bot,内容是沙箱验证正在运行的自动化状态通知。它仅为信息性说明,并未请求任何更改。

本轮未做任何代码修改,也没有创建提交。PR 的 head 仍停留在 9854b9d81e

Base-conflict check · 基分支冲突检查: no conflict with main. · 与 main 无冲突。


🧠 Handled by Qwen Code · model/模型 qwen3.8-max

@wenshao
wenshao added this pull request to the merge queue Aug 8, 2026
Merged via the queue into main with commit 33b1243 Aug 8, 2026
45 checks passed
qwen-code-dev-bot added a commit to niheaven/qwen-code that referenced this pull request Aug 8, 2026
Resolve the conflict between main's Qoder support (QwenLM#8661), which renamed
convertGeminiOrClaudeExtension to convertCompatibleExtension and added
externalContent tracking, and this PR's Claude-first manifest detection
with Gemini fallback. The merged dispatch keeps the PR's detection flow,
inserts the Qoder branch between the Claude and Gemini fallbacks, and
propagates externalContent on every path. A deprecated alias keeps the
pre-rename export for this branch's converter tests.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Released in v0.21.9.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

autofix/takeover Summon the autofix loop to manage this PR (remove to release; needs triage+)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants