Skip to content

feat(cli): /summary supports custom export path - #8116

Merged
wenshao merged 29 commits into
mainfrom
feat/summary-export-path
Aug 2, 2026
Merged

feat(cli): /summary supports custom export path#8116
wenshao merged 29 commits into
mainfrom
feat/summary-export-path

Conversation

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

Summary

/summary now accepts an optional path argument, matching /export's behavior.

Usage

  • /summary → saves to .qwen/PROJECT_SUMMARY.md (unchanged default)
  • /summary docs/summary.md → saves to docs/summary.md (relative to project root)
  • /summary /absolute/path/summary.md → saves to absolute path
  • /summary docs/ → saves to docs/PROJECT_SUMMARY.md (directory → append default filename)

Parent directories are created automatically. If the path points to an existing directory or ends with /, the default filename PROJECT_SUMMARY.md is appended.

Changes

  • summaryCommand.ts: added argumentHint: '[path]', parse args parameter, resolve path relative to project root, handle directory vs file paths.

Tests

No existing test file for summaryCommand. Prettier + ESLint clean.

`/summary` now accepts an optional path argument, matching `/export`'s
behavior. When a path is provided, the summary is saved there instead
of the default `.qwen/PROJECT_SUMMARY.md`.

- `/summary` → saves to `.qwen/PROJECT_SUMMARY.md` (unchanged)
- `/summary docs/summary.md` → saves to `docs/summary.md`
- `/summary /absolute/path/summary.md` → saves to absolute path
- `/summary docs/` → saves to `docs/PROJECT_SUMMARY.md`

If the path is a directory (existing or ending with `/`), the default
filename `PROJECT_SUMMARY.md` is appended. Parent directories are
created automatically.
@qwen-code-ci-bot

qwen-code-ci-bot commented Jul 30, 2026

Copy link
Copy Markdown
Collaborator

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

Qwen 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.

@qwen-code-dev-bot The PR body doesn't follow the PR template. Missing required sections:

  • ## What this PR does
  • ## Why it's needed
  • ## Reviewer Test Plan (with How to verify / Evidence / Tested on)
  • ## Risk & Scope
  • ## Linked Issues
  • Chinese translation section

The content you have (Summary, Usage, Changes, Tests) is useful — just restructure it under the template headings so reviewers get the context they expect. In particular, "Why it's needed" should explain the motivation (e.g. parity with /export), and the Reviewer Test Plan should describe how to confirm the new path argument works.

中文说明

PR 正文未按照 PR 模板 填写。缺少以下必需章节:

  • ## What this PR does
  • ## Why it's needed
  • ## Reviewer Test Plan(含 How to verify / Evidence / Tested on 子节)
  • ## Risk & Scope
  • ## Linked Issues
  • 中文翻译部分

现有内容(Summary、Usage、Changes、Tests)是有用的——只需按模板标题重新组织,让 reviewer 获得预期的上下文。特别是 "Why it's needed" 应说明动机(例如与 /export 保持一致),Reviewer Test Plan 应描述如何验证新的路径参数功能。

Qwen Code · qwen3.8-max-preview

@github-actions

github-actions Bot commented Jul 30, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Summary

Package Lines Statements Functions Branches
CLI 83.53% 83.53% 89.36% 82.69%
Core 87.58% 87.58% 89.2% 86.21%
CLI Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   83.53 |    82.69 |   89.36 |   83.53 |                   
 src               |   84.36 |    81.54 |   88.29 |   84.36 |                   
  cli.ts           |   95.64 |     83.8 |     100 |   95.64 | ...52-553,557-558 
  gemini.tsx       |   72.21 |    76.81 |   80.76 |   72.21 | ...1253-1257,1378 
  ...ractiveCli.ts |   86.46 |    82.39 |    87.5 |   86.46 | ...2492,2498,2553 
  ...liCommands.ts |   88.09 |    84.37 |      90 |   88.09 | ...81,498,532,654 
  ...ActiveAuth.ts |     100 |     87.5 |     100 |     100 | 66-80             
 ...cp-integration |   69.97 |    72.73 |   89.81 |   69.97 |                   
  acpAgent.ts      |   69.64 |     72.6 |   89.84 |   69.64 | ...65,11370-11372 
  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 |   91.65 |    86.59 |   96.24 |   91.65 |                   
  Session.ts       |   91.25 |    85.47 |   95.67 |   91.25 | ...9412,9439-9443 
  ...entTracker.ts |   91.87 |    89.47 |      90 |   91.87 | ...43,207,286-295 
  ...stop-guard.ts |     100 |    98.07 |     100 |     100 | 37,127            
  ...eplay-page.ts |    93.1 |    90.72 |     100 |    93.1 | 71,82-85,111-121  
  ...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.43 |   96.66 |   95.79 |                   
  ...ageEmitter.ts |   95.34 |    94.11 |     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.42 |     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.37 |   89.09 |   89.03 |                   
  ...t-cli-argv.ts |     100 |      100 |     100 |     100 |                   
  protocol.ts      |     100 |      100 |     100 |     100 |                   
  ...sor-client.ts |   80.38 |    72.54 |   76.66 |   80.38 | ...22-626,652-656 
  ...or-process.ts |   96.61 |    89.47 |   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.28 |    73.75 |   64.51 |   89.28 |                   
  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.36 |      100 |      50 |   98.36 | 72                
  serve.ts         |    87.1 |    68.22 |     100 |    87.1 | ...46-649,663-667 
  sessions.ts      |     100 |      100 |      50 |     100 |                   
  update.ts        |   98.13 |    94.44 |   66.66 |   98.13 | 82-83             
 ...mmands/channel |   88.29 |    87.64 |    90.3 |   88.29 |                   
  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.89 |    85.33 |   94.11 |   93.89 | ...1209,1216-1217 
  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 |   85.92 |    86.78 |   87.24 |   85.92 |                   
  agent-prompt.ts  |   90.89 |    92.78 |      96 |   90.89 | ...1311,1781-1850 
  base-tree.ts     |   74.87 |    79.16 |   77.77 |   74.87 | ...29-350,352-365 
  capture-local.ts |   68.57 |     90.9 |      75 |   68.57 | 107-111,158-189   
  ...k-coverage.ts |   48.38 |    14.28 |   66.66 |   48.38 | ...21-226,239-249 
  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 |   95.77 |    91.19 |   95.65 |   95.77 | ...1615,1643-1665 
  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      |   86.73 |    83.53 |   92.85 |   86.73 | ...12-531,563-564 
  load-rules.ts    |   26.41 |      100 |   16.66 |   26.41 | ...41-153,155-156 
  parse-args.ts    |   99.32 |    96.36 |     100 |   99.32 | 400,473           
  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 
  ...ve-anchors.ts |   77.02 |    88.46 |      75 |   77.02 | ...70-175,187-204 
  run.ts           |   81.14 |    86.17 |    90.9 |   81.14 | ...13,429-477,490 
  script-lint.ts   |   83.67 |    78.41 |   88.88 |   83.67 | ...59-773,775-797 
  submit.ts        |   77.59 |    82.05 |   81.81 |   77.59 | ...20-656,658-659 
  test-delta.ts    |   87.13 |    91.46 |      75 |   87.13 | 206-237,477-485   
  test-efficacy.ts |   87.77 |    83.29 |      95 |   87.77 | ...2307,2315-2335 
  test-plan.ts     |    90.9 |       92 |   89.47 |    90.9 | ...88-789,853-870 
 ...nds/review/lib |   96.09 |    93.63 |   96.02 |   96.09 |                   
  agent-briefs.ts  |    98.8 |      100 |       0 |    98.8 | 630-631           
  anchors.ts       |     100 |    94.79 |     100 |     100 | ...33,169,178,225 
  budget.ts        |     100 |      100 |     100 |     100 |                   
  coverage.ts      |   95.47 |    94.28 |   95.45 |   95.47 | ...98,335,433-450 
  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.6 |    88.37 |   71.42 |    85.6 | ...20,257-258,285 
  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 
  merge-base.ts    |     100 |      100 |     100 |     100 |                   
  path-rules.ts    |     100 |      100 |     100 |     100 |                   
  paths.ts         |     100 |     87.5 |     100 |     100 | 84                
  prompt-record.ts |   94.73 |    88.23 |     100 |   94.73 | ...28,151-152,156 
  receipt.ts       |     100 |      100 |     100 |     100 |                   
  report.ts        |   94.68 |    93.75 |     100 |   94.68 | 187-191           
  roster.ts        |     100 |    94.23 |     100 |     100 | 143,161,206       
  shell-quote.ts   |     100 |      100 |     100 |     100 |                   
  test-utils.ts    |     100 |      100 |     100 |     100 |                   
  transcripts.ts   |   96.27 |    93.18 |     100 |   96.27 | ...83,269-270,294 
  workspaces.ts    |   98.88 |    92.39 |     100 |   98.88 | 212-213           
  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.35 |    88.93 |   95.63 |   94.35 |                   
  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.91 |    88.72 |   83.78 |   88.91 | ...2445,2447-2455 
  ...cy-monitor.ts |   88.75 |    76.19 |     100 |   88.75 | ...3,90-92,98,101 
  ...ust-policy.ts |   83.04 |    88.28 |     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.96 |     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 |   61.64 |    71.87 |   66.66 |   61.64 | ...54-68,73,77-89 
  ...ings-cache.ts |   98.26 |    97.14 |     100 |   98.26 | 201-202           
  settings.ts      |   90.99 |     92.3 |      90 |   90.99 | ...1006,1008-1009 
  ...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.35 |    94.11 |     100 |   93.35 | ...90-391,427-438 
 ...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 | ...24-625,628-629 
 ...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.07 |    94.05 |   95.23 |   98.07 |                   
  ...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.38 |      100 |   90.47 |   98.38 | 84-85,125-126     
  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.07 |    83.28 |   90.81 |   87.07 |                   
  ...tp-enabled.ts |     100 |      100 |     100 |     100 |                   
  ...ion-bridge.ts |     100 |      100 |     100 |     100 |                   
  auth.ts          |    93.4 |    92.95 |     100 |    93.4 | ...19-320,323-325 
  ...em-adapter.ts |     100 |      100 |     100 |     100 |                   
  capabilities.ts  |     100 |    97.95 |     100 |     100 | 650               
  ...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 |   85.85 |    91.78 |   95.83 |   85.85 | ...94-206,366-369 
  ...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.41 |    84.44 |    97.1 |   92.41 | ...1460,1514-1518 
  ...e-grouping.ts |     100 |    94.11 |     100 |     100 | 69,132            
  core-runtime.ts  |     100 |      100 |     100 |     100 |                   
  ...ub-session.ts |   92.04 |    77.77 |     100 |   92.04 | ...36-445,470,508 
  daemon-logger.ts |    82.2 |    77.26 |   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.37 |    90.06 |     100 |   98.37 | ...1041,1043-1044 
  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 
  ...-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.49 |     80.7 |   95.45 |   90.49 | ...92-501,567-568 
  ...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 | ...27-128,139-140 
  ...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 |   82.69 |    79.33 |   74.06 |   82.69 | ...6745,6750-6751 
  ...tup-errors.ts |     100 |      100 |     100 |     100 |                   
  ...-keepalive.ts |   94.19 |    88.57 |     100 |   94.19 | ...26,530-531,571 
  ...-lifecycle.ts |     100 |      100 |     100 |     100 |                   
  server.ts        |   93.57 |    93.29 |   74.02 |   93.57 | ...2148,2169-2173 
  ...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 | ...13,816,829-831 
  ...l-resolver.ts |   90.32 |    66.66 |     100 |   90.32 | 16,45-46          
  ...ell-static.ts |   91.07 |    86.66 |     100 |   91.07 | ...79-182,216-219 
  ...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.29 |     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.6 |     83.9 |     100 |    91.6 | ...70-272,305-306 
 ...serve/acp-http |   77.04 |    78.33 |   93.26 |   77.04 |                   
  ...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.62 |     100 |    98.2 | 1015,1041-1052    
  dispatch.ts      |   71.44 |    73.89 |   95.34 |   71.44 | ...4733,4781-4787 
  index.ts         |   81.93 |    79.92 |    90.9 |   81.93 | ...2291,2375-2376 
  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 |   85.73 |    73.17 |    97.5 |   85.73 |                   
  ...r-emulator.ts |   88.57 |    63.63 |     100 |   88.57 | ...72-175,194-195 
  ...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 |       0 |        0 |       0 |       0 |                   
  ...mcp-smoke.mjs |       0 |        0 |       0 |       0 | 1-119             
  ...cceptance.mjs |       0 |        0 |       0 |       0 | 1-473             
  real-tab.mjs     |       0 |        0 |       0 |       0 | 1-218             
 src/serve/fs      |    86.4 |    80.74 |     100 |    86.4 |                   
  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.17 |    79.55 |     100 |   86.17 | ...2506,2516-2517 
 src/serve/routes  |   85.54 |    79.53 |   95.47 |   85.54 |                   
  a2ui-action.ts   |   96.84 |     88.5 |    87.5 |   96.84 | ...70-272,309-311 
  capabilities.ts  |     100 |      100 |     100 |     100 |                   
  ...nel-notify.ts |   85.22 |       88 |     100 |   85.22 | ...,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         
  permission.ts    |     100 |     92.3 |     100 |     100 | 50,98             
  ...uled-tasks.ts |   87.12 |    82.73 |   92.59 |   87.12 | ...1263,1306-1307 
  ...on-runtime.ts |     100 |    90.47 |     100 |     100 | 58,94             
  session.ts       |   85.17 |     81.7 |   95.16 |   85.17 | ...4633,4635-4636 
  sse-events.ts    |   84.45 |     87.5 |   77.77 |   84.45 | ...36,453-456,485 
  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.19 |    77.68 |     100 |   90.19 | ...47-448,467-468 
  ...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 |   88.22 |    85.29 |     100 |   88.22 | ...1546,1566-1571 
  ...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 |    74.9 |    70.31 |     100 |    74.9 | ...49-660,666-667 
  ...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.42 |    64.78 |      80 |   78.42 | ...31-336,344-345 
  ...pace-voice.ts |   91.33 |    80.92 |     100 |   91.33 | ...70-673,676-678 
 src/serve/server  |   90.71 |    89.18 |   96.55 |   90.71 |                   
  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.72 |     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 |   94.81 |    90.32 |     100 |   94.81 | 175-181           
  ...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   |   83.35 |    92.22 |   90.47 |   83.35 |                   
  ...ice-config.ts |   84.61 |       30 |     100 |   84.61 | 90-99,103-104     
  voice-ws.ts      |   77.16 |    94.73 |   83.33 |   77.16 | ...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.31 |    88.44 |   97.84 |   92.31 |                   
  ...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.29 |    86.48 |     100 |   88.29 | ...91-196,229-230 
  ...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.71 |     100 |   98.64 | 116,142-143       
  voice-model.ts   |     100 |      100 |     100 |     100 |                   
  voice-service.ts |   90.37 |    87.87 |     100 |   90.37 | ...80,287,352-357 
  ...e-settings.ts |     100 |    95.23 |     100 |     100 | 19                
  ...ranscriber.ts |   90.46 |    82.19 |      96 |   90.46 | ...66-668,671-673 
 ...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    |   93.26 |       75 |   83.33 |   93.26 |                   
  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 
  ...andContext.ts |     100 |      100 |     100 |     100 |                   
  render.tsx       |     100 |      100 |     100 |     100 |                   
 src/ui            |    72.7 |     75.2 |    65.9 |    72.7 |                   
  App.tsx          |   33.33 |       75 |   33.33 |   33.33 | 32-86             
  AppContainer.tsx |   73.91 |    72.08 |   70.58 |   73.91 | ...4096,4212-4218 
  ...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.68 |    82.85 |   89.12 |   82.68 |                   
  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 |    81.25 |     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   |   79.86 |    85.71 |   66.66 |   79.86 | ...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 |   93.45 |    89.06 |     100 |   93.45 | ...68-169,196-206 
  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.9 |    86.04 |     100 |    90.9 | ...41-146,176-177 
  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.12 |    78.59 |   78.81 |   71.12 |                   
  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.06 |    66.33 |     100 |   79.06 | ...04,507,510-516 
  ...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 |   72.56 |       80 |      40 |   72.56 | ...06-109,114-117 
  ...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 |     90.9 |     100 |     100 | 75,93             
  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 |   89.93 |    86.42 |   85.29 |   89.93 |                   
  ...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 |   93.46 |      100 |   76.92 |   93.46 | ...90-292,295-298 
  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.32 |    95.16 |     100 |   98.32 | 184-187,414       
  ToolMessage.tsx  |   92.62 |    85.29 |   93.33 |   92.62 | ...-982,1009-1011 
 ...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      |   84.86 |    82.59 |   87.75 |   84.86 |                   
  ...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.63 |    68.16 |   81.81 |   85.63 | ...1452,1473-1477 
  ...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.23 |    82.69 |     100 |   95.23 | ...53-154,277-280 
  ...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 |   83.08 |    80.25 |   74.35 |   83.08 | ...4907-4909,4911 
  ...BranchName.ts |     100 |    94.44 |     100 |     100 | 54                
  ...oryManager.ts |   98.01 |    98.36 |     100 |   98.01 | 139-142           
  ...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 |   88.95 |    86.95 |     100 |   88.95 | ...37-439,471-481 
  ...oryCommand.ts |       0 |        0 |       0 |       0 | 1-7               
  ...umeCommand.ts |   95.18 |    76.47 |     100 |   95.18 | 118-119,220-225   
  ...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.74 |    84.95 |   95.48 |   86.74 |                   
  ...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           
  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.1 |     100 |   98.38 | 195-197           
  ...mConstants.ts |     100 |      100 |     100 |     100 |                   
  restoreGoal.ts   |     100 |      100 |     100 |     100 |                   
  ...storyUtils.ts |   79.42 |    78.08 |     100 |   79.42 | ...50-572,703-704 
  ...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 |   89.19 |    79.54 |     100 |   89.19 | ...14,316-318,434 
  ...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 |    59.89 |   94.59 |   75.03 |                   
  collect.ts       |   71.27 |    65.81 |      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      |   80.94 |    72.69 |   80.55 |   80.94 |                   
  ...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 |   89.72 |    65.33 |   93.75 |   89.72 | ...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 |    68.42 |     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.37 |    86.98 |   92.54 |   81.37 |                   
  ...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 |       90 |     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.32 |    76.05 |     100 |   86.32 | ...02-303,331-341 
  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 |     87.5 |     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.58 |    86.21 |    89.2 |   87.58 |                   
 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.13 |   87.64 |   90.55 |                   
  agent-context.ts |     100 |      100 |     100 |     100 |                   
  agent-core.ts    |   85.07 |    76.73 |   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   |   81.81 |    83.99 |    87.5 |   81.81 |                   
  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       |   94.76 |    86.36 |   92.85 |   94.76 | 86-87,348-354     
  ...ptAddendum.ts |     100 |      100 |     100 |     100 |                   
  tasks.ts         |   88.85 |    82.56 |   96.29 |   88.85 | ...-990,1034-1035 
  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.96 |    87.06 |   75.48 |   84.96 |                   
  approval-mode.ts |     100 |      100 |     100 |     100 |                   
  ...xtDefaults.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |   84.27 |    86.78 |   73.91 |   84.27 | ...8316,8320-8321 
  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 |    88.26 |   93.21 |   91.97 |                   
  baseLlmClient.ts |   88.28 |    82.48 |   81.81 |   88.28 | ...47,660,666-668 
  client.ts        |   91.92 |    87.39 |   91.56 |   91.92 | ...3915,4009-4010 
  ...tGenerator.ts |   86.34 |    87.34 |   84.61 |   86.34 | ...81-482,527-533 
  ...lScheduler.ts |   90.11 |       86 |      96 |   90.11 | ...5647,5675-5686 
  geminiChat.ts    |   92.56 |    89.36 |      96 |   92.56 | ...4504,4552-4553 
  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.57 |    91.42 |   83.33 |   93.57 | ...1188,1391-1392 
  ...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 |     100 |      100 |     100 |     100 |                   
  ...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.52 |    91.74 |     100 |   98.52 | ...17,645-646,693 
  ...l-fallback.ts |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |   96.32 |    88.02 |    96.1 |   96.32 |                   
  ...tGenerator.ts |   97.23 |    86.48 |   94.73 |   97.23 | ...1423,1452,1463 
  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.65 |    90.23 |   95.23 |   91.65 |                   
  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      |   96.63 |    90.94 |     100 |   96.63 | ...1100,1108,1203 
  ...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 |   96.73 |    89.76 |   98.27 |   96.73 |                   
  dashscope.ts     |   97.48 |    91.91 |      95 |   97.48 | ...85-386,528-529 
  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     |    86.2 |    83.25 |   92.33 |    86.2 |                   
  ...ive-safety.ts |     100 |      100 |     100 |     100 |                   
  ...-converter.ts |   78.32 |    71.83 |     100 |   78.32 | ...1122,1168-1169 
  corruptFile.ts   |     100 |       50 |     100 |     100 | 40-45             
  ...-converter.ts |   80.39 |     87.5 |     100 |   80.39 | 50-59             
  ...me-refresh.ts |     100 |      100 |     100 |     100 |                   
  ...sion-store.ts |   90.82 |    86.38 |   97.82 |   90.82 | ...1215-1221,1265 
  ...ionManager.ts |   81.06 |    78.78 |   81.52 |   81.06 | ...2705,2727-2728 
  ...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 |    84.61 |   85.71 |    75.9 | ...98,202,214-248 
  github.ts        |   88.58 |    82.13 |     100 |   88.58 | ...62,952-953,963 
  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       
  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 |    83.78 |     100 |   88.95 | ...32-235,238-241 
  ...extraction.ts |   85.77 |    80.61 |   89.47 |   85.77 | ...02-205,260-261 
 src/followup      |   79.86 |    80.36 |    90.9 |   79.86 |                   
  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.45 |    66.01 |   71.42 |   71.45 | ...49-650,657-658 
  ...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.23 |    88.89 |   95.93 |   94.23 |                   
  ...eGoalStore.ts |   87.61 |    88.88 |   86.66 |   87.61 | ...85-188,196-204 
  goal-evidence.ts |   87.59 |     85.1 |   95.65 |   87.59 | ...12-613,636-639 
  ...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 |    91.3 |       90 |     100 |    91.3 | 107-108           
  goal-reducer.ts  |   92.28 |    85.48 |     100 |   92.28 | ...74-375,388,443 
  goal-runtime.ts  |   99.05 |     93.6 |     100 |   99.05 | ...17-718,741-742 
  goal-tools.ts    |   98.32 |    93.18 |   95.23 |   98.32 | ...46-147,254-255 
  ...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.58 |    83.46 |    90.5 |   87.58 |                   
  ...y-document.ts |   89.52 |    84.61 |     100 |   89.52 | ...24-325,329-330 
  ...nel-memory.ts |   97.11 |    95.72 |   96.29 |   97.11 | ...85-287,361-362 
  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 |    81.81 |     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.19 |     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         |   95.29 |    96.59 |     100 |   95.29 | ...80-381,402-403 
  ...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 |    89.79 |     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.03 |    73.41 |   72.22 |   77.03 | ...47-451,454,460 
  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 |    81.53 |   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.97 |   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 |    47.82 |   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.27 |   71.07 |   83.77 |                   
  autoMode.ts      |   97.66 |    93.13 |     100 |   97.66 | ...82-589,635,712 
  ...transcript.ts |      98 |    84.61 |     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.72 |     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.52 |   95.89 |   85.41 |                   
  ...tGenerator.ts |   98.64 |    98.18 |     100 |   98.64 | 105-106           
  qwenOAuth2.ts    |   82.79 |    73.29 |   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.44 |    84.28 |   96.83 |   89.44 |                   
  ...ionTrailer.ts |     100 |      100 |     100 |     100 |                   
  ...llRegistry.ts |   97.68 |    85.71 |     100 |   97.68 | ...96,119,490-491 
  ...ionService.ts |   96.72 |    95.38 |     100 |   96.72 | ...30,746,879-887 
  ...ingService.ts |   90.91 |    84.17 |   95.45 |   90.91 | ...2058,2085-2086 
  ...ttribution.ts |   91.73 |    87.71 |      90 |   91.73 | ...80-685,826-827 
  ...utSlimming.ts |    97.2 |    94.05 |     100 |    97.2 | ...39-340,378-381 
  cronScheduler.ts |   94.17 |    90.45 |      98 |   94.17 | ...1333,1736-1737 
  cronTasksFile.ts |   96.31 |    91.81 |     100 |   96.31 | ...11,336-337,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 |     100 |      100 |     100 |     100 |                   
  ...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.47 |   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.8 |     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 | ...1094-1095,1158 
  ...est-helper.ts |       0 |        0 |       0 |       0 | 1-65              
  ...iter-lease.ts |    82.1 |     73.7 |    97.5 |    82.1 | ...2364,2376-2379 
  sessionRecap.ts  |   67.56 |    43.47 |     100 |   67.56 | ...60,178,180-183 
  ...ionService.ts |   88.94 |    83.69 |   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 |   99.41 |    96.55 |     100 |   99.41 |                   
  microcompact.ts  |   99.41 |    96.55 |     100 |   99.41 | 244-245,677       
 ...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.21 |    85.66 |   93.54 |   89.21 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...activation.ts |     100 |    93.33 |     100 |     100 | 93,112            
  skill-curator.ts |   89.52 |    80.95 |     100 |   89.52 | ...95-896,898-901 
  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 |     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.15 |    83.96 |   84.57 |   81.15 |                   
  ...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.09 |    95.61 |      95 |   99.09 | 141,365-366       
  ...t.circular.ts |       0 |        0 |       0 |       0 | 1-128             
  loggers.ts       |   56.85 |    74.35 |   64.81 |   56.85 | ...1397,1414-1434 
  metrics.ts       |   79.63 |    81.98 |   79.66 |   79.63 | ...1082,1085-1096 
  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 |   90.83 |    90.05 |   96.77 |   90.83 | ...1667,1698-1701 
  ...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.35 |    94.61 |   86.04 |   82.35 | ...1361,1365-1372 
  uiTelemetry.ts   |   97.18 |    93.93 |      88 |   97.18 | ...70,314,461-462 
 ...ry/qwen-logger |   74.17 |    80.53 |      70 |   74.17 |                   
  event-types.ts   |       0 |        0 |       0 |       0 |                   
  qwen-logger.ts   |   74.17 |    80.35 |   69.49 |   74.17 | ...1120,1158-1159 
 src/test-utils    |      94 |    98.24 |   78.94 |      94 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  ...st-helpers.ts |   94.11 |       90 |     100 |   94.11 | 69-70             
  index.ts         |     100 |      100 |     100 |     100 |                   
  mock-tool.ts     |   92.57 |      100 |   75.75 |   92.57 | ...63,227-228,241 
  ...aceContext.ts |     100 |      100 |     100 |     100 |                   
 src/tools         |   86.01 |    84.81 |   88.36 |   86.01 |                   
  ...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 |        0 |       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      |    97.2 |    93.47 |     100 |    97.2 | ...00-801,856-857 
  ...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.55 |    77.39 |   81.25 |   85.55 | ...86-902,948-949 
  ...escendants.ts |   36.17 |    64.51 |   55.55 |   36.17 | ...46-310,385-390 
  ...nforcement.ts |   82.57 |    90.24 |     100 |   82.57 | 174-185,234-247   
  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.12 |    87.94 |   93.33 |   95.12 | ...22-526,539-544 
  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   |    86.9 |    87.48 |   88.69 |    86.9 |                   
  agent.ts         |   85.52 |     86.4 |   86.31 |   85.52 | ...4315,4337-4347 
  fork-profile.ts  |   93.65 |       90 |     100 |   93.65 | ...33-134,171-174 
  fork-subagent.ts |   98.67 |     94.8 |     100 |   98.67 | 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.84 |    89.61 |   96.84 |   92.84 |                   
  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.61 |   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 
  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.99 |    92.85 |     100 |   93.99 | ...88-489,491-493 
  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.9 |    86.85 |     100 |    96.9 | ...59-660,735-736 
  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.85 |    83.78 |     100 |   85.85 | ...90-394,424-439 
  truncation.ts    |   90.56 |    90.43 |     100 |   90.56 | ...35-443,480-486 
  windowsPath.ts   |   89.47 |    79.31 |     100 |   89.47 | ...57-58,62,90-91 
  ...aceContext.ts |   95.81 |    89.39 |     100 |   95.81 | ...74-275,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-dev-bot

Copy link
Copy Markdown
Collaborator Author

🔀 Base updated: red check(s) [Test (ubuntu-latest, Node 22.x)] pass on current main — merged current main via update-branch; CI will re-run.

中文说明

🔀 已更新 base:红色检查 [Test (ubuntu-latest, Node 22.x)] 在当前 main 上通过 —— 已通过 update-branch 合入当前 main,CI 将重新运行。

Comment thread packages/cli/src/ui/commands/summaryCommand.ts Outdated
**Update time**: ${new Date().toISOString()}
`;

await fsPromises.writeFile(summaryPath, summaryContent, 'utf8');

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.

[Suggestion] A custom path that resolves to an existing file is silently overwritten — writeFile truncates and replaces it with no existence check or confirmation. Before this diff the command could only ever write the dedicated .qwen/PROJECT_SUMMARY.md, so this class of data loss is new. — Concrete cost: /summary README.md (or a typo like /summary notes.md) where that file already exists falls into the file branch and its prior content is irreversibly replaced, then reported as a success. This is consistent with CLI conventions (the user chose the path), so it is a guardrail rather than a blocker, but an existence check or confirmation prompt would prevent accidental loss.

— qwen3.8-max-preview via Qwen Code /review

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Declined for this PR. This matches the sibling /export command, which overwrites its target via a plain writeFile (no existence check or confirmation), and the user explicitly chose the path — so silent overwrite is consistent CLI behavior here, as the finding itself notes. Adding an existence check or confirmation prompt to /summary alone would make the two commands inconsistent, and doing it for both is out of scope for this change. Leaving the thread open: if maintainers want a shared overwrite guardrail for /summary and /export, a follow-up PR is the right place.

中文说明

本 PR 中拒绝处理。这与同级的 /export 命令一致——后者通过普通 writeFile 覆盖目标文件(没有存在性检查或确认),而且路径是用户明确选择的,因此静默覆盖在这里是一致的 CLI 行为,该意见本身也指出了这一点。单独给 /summary 加存在性检查或确认弹窗会使两个命令不一致,而为两者都加又超出本次改动范围。线程保持打开:如果维护者希望为 /summary/export 做一个共享的覆盖保护机制,后续 PR 是合适的位置。

Comment thread packages/cli/src/ui/commands/summaryCommand.ts Outdated
Comment thread packages/cli/src/ui/commands/summaryCommand.ts
@qwen-code-dev-bot

qwen-code-dev-bot commented Jul 30, 2026

Copy link
Copy Markdown
Collaborator Author

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

中文说明

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

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator Author

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

Autofix review round summary (PR #8116)

Addressed the automated reviewer's inline findings on the /summary custom export path. One commit: fix(cli): summary custom path dir detection and i18n key (#8116).

Feedback points

  • [Critical] rc:3682079753 — trailing-separator directory detection was dead code for relative paths → FIXED. path.resolve(projectRoot, customPath) normalizes away a trailing separator, so resolved.endsWith('/') was never true for a relative input like docs/; the summary was written as a file named docs instead of docs/PROJECT_SUMMARY.md. The detection now probes the raw customPath (customPath.endsWith('/') || customPath.endsWith(path.sep)), which also handles the Windows \ separator the old resolved.endsWith('\\') tried to cover. Added a regression test that fails on the old code and passes on the fix (verified both ways).
  • [Suggestion] rc:3682079780 — new t() description key broke localized help text → FIXED. Reverted the description to the original key (Generate a project summary and save it to .qwen/PROJECT_SUMMARY.md), which exists in all 9 locale files, so every locale's translation stays live. The custom-path capability is still discoverable via argumentHint: '[path]'. This is the reviewer's "keep the original key" option and avoids shipping 8 guessed translations.
  • [Suggestion] rc:3682079784 — no test coverage for the new path-resolution branch → FIXED. Added collocated summaryCommand.test.ts (5 tests) covering: default path, relative file path, relative directory with trailing slash (the regression), existing directory (stat branch), and absolute path — asserting the written file location and the displayed path for each.
  • [Suggestion] rc:3682079773 — existing file at a custom path is silently overwritten → DECLINED (recorded). See the threaded reply. In short: this matches the sibling /export command, which overwrites via a plain writeFile with no existence check or confirmation; the user explicitly chose the path; and adding a confirmation prompt to /summary alone would be inconsistent and out of scope. Left open for a maintainer if a shared guardrail for both commands is wanted in a follow-up.
  • [Review] PR body does not follow the template → NOT ACTIONABLE HERE. Restructuring the PR body is a network write owned by the workflow (this skill has no GitHub credentials and cannot edit the PR). Flagging it so the workflow/maintainer can regenerate the body under the template headings (What this PR does, Why it's needed, Reviewer Test Plan, Risk & Scope, Linked Issues, Chinese translation).

Conflict notes

--conflict false; no merge performed, none needed.

Failed check: Test (ubuntu-latest Node 22.x)

No CI log was reachable from this environment (gh is unauthenticated), so the exact failing step could not be read directly. Investigated by reproduction instead:

  • npm run check-i18n passes both before and after the i18n-key revert (the missing-key condition is reported as non-required warnings, not a failure), so the i18n check is not the cause.
  • The cli package has no coverage threshold, and no snapshot test references the /summary description, so neither could fail on this one-file change.
  • Running src/ui/commands/ locally: the new summaryCommand.test.ts is 5/5 green and 845/853 command tests pass. The 8 failures are in unrelated tests (cdCommand, directoryCommand, docsCommand, extensionsCommand, ideCommand) that exercise Windows-style home-relative paths and browser-open behavior; they are independent of this PR's single-file change and are environmental in this Linux sandbox.

The fixes above resolve every code defect the reviewer identified; the workflow's independent CI remains the final gate for the Test context.

Verification

  • npm run build — passed
  • npm run typecheck — passed
  • npx eslint packages/cli/src/ui/commands/summaryCommand.ts packages/cli/src/ui/commands/summaryCommand.test.ts — passed (0 errors)
  • npx prettier --check on both touched files — passed
  • npm run check-i18n — passed (all checks passed)
  • npx vitest run src/ui/commands/summaryCommand.test.ts (touched) — 5 passed
  • Load-bearing check: reverted the fix locally → the trailing-separator test failed (1 failed | 4 passed); restored the fix → 5 passed
  • npx vitest run src/ui/commands/ — 845 passed, 8 failed (all 8 pre-existing/environmental in unrelated command tests, not touched by this PR)
中文说明

Autofix 审查轮次总结(PR #8116

处理了自动审查机器人针对 /summary 自定义导出路径的内联意见。一次提交:fix(cli): summary custom path dir detection and i18n key (#8116)

反馈点

  • [Critical] rc:3682079753 — 相对路径下“以分隔符结尾即目录”的检测是死代码 → 已修复。 path.resolve(projectRoot, customPath) 会规范化掉结尾分隔符,因此对于像 docs/ 这样的相对输入,resolved.endsWith('/') 永远不为 true;结果 summary 被写成一个名为 docs文件,而不是 docs/PROJECT_SUMMARY.md。现在检测改为探测原始的 customPathcustomPath.endsWith('/') || customPath.endsWith(path.sep)),这也覆盖了旧的 resolved.endsWith('\\') 试图处理的 Windows \ 分隔符。新增了一个回归测试,在旧代码上会失败、在修复后通过(两个方向都已验证)。
  • [Suggestion] rc:3682079780 — 新的 t() 描述 key 破坏了本地化帮助文本 → 已修复。 将描述回退到原始 key(Generate a project summary and save it to .qwen/PROJECT_SUMMARY.md),该 key 存在于全部 9 个语言文件中,因此所有语言的翻译都保持生效。自定义路径能力仍可通过 argumentHint: '[path]' 被发现。这是审查者给出的“保留原 key”方案,也避免了提交 8 个猜测出来的翻译。
  • [Suggestion] rc:3682079784 — 新的路径解析分支没有测试覆盖 → 已修复。 新增同目录测试 summaryCommand.test.ts(5 个用例),覆盖:默认路径、相对文件路径、带结尾斜杠的相对目录(即回归点)、已存在的目录(stat 分支)、以及绝对路径 —— 对每种情况断言写入的文件位置和展示路径。
  • [Suggestion] rc:3682079773 — 自定义路径上已存在的文件会被静默覆盖 → 已拒绝(记录在案)。 见该线程的回复。简言之:这与同级的 /export 命令一致,后者通过普通 writeFile 覆盖、没有存在性检查或确认;用户明确选择了该路径;单独给 /summary 加确认弹窗会不一致且超出范围。如果维护者希望为两个命令做一个共享的保护机制,可在后续 PR 中处理,线程保持打开。
  • [Review] PR 正文未遵循模板 → 此处无法处理。 重构 PR 正文属于由工作流负责的网络写操作(本 skill 没有 GitHub 凭据,无法编辑 PR)。在此标出,以便工作流/维护者按模板标题(What this PR doesWhy it's neededReviewer Test PlanRisk & ScopeLinked Issues、中文翻译)重新生成正文。

冲突说明

--conflict false;未执行合并,也无需合并。

失败检查:Test (ubuntu-latest Node 22.x)

本环境无法访问 CI 日志(gh 未认证),因此无法直接读取具体失败步骤。改为通过本地复现来排查:

  • npm run check-i18n 在 i18n key 回退前后都通过(缺失 key 的情况只作为“非必需”警告上报,并非失败),所以 i18n 检查不是原因。
  • cli 包没有覆盖率阈值,也没有快照测试引用 /summary 的描述,因此两者都不可能因这个单文件改动而失败。
  • 本地运行 src/ui/commands/:新增的 summaryCommand.test.ts 5/5 全绿,命令测试整体 845/853 通过。8 个失败位于无关测试(cdCommanddirectoryCommanddocsCommandextensionsCommandideCommand),它们测试 Windows 风格的 home 相对路径和浏览器打开行为;与本 PR 的单文件改动无关,属于本 Linux 沙箱中的环境性失败。

以上修复解决了审查者指出的每一个代码缺陷;Test 上下文最终以工作流独立的 CI 为准。

验证

  • npm run build — 通过
  • npm run typecheck — 通过
  • npx eslint packages/cli/src/ui/commands/summaryCommand.ts packages/cli/src/ui/commands/summaryCommand.test.ts — 通过(0 错误)
  • 对两个改动文件运行 npx prettier --check — 通过
  • npm run check-i18n — 通过(all checks passed)
  • npx vitest run src/ui/commands/summaryCommand.test.ts(改动文件)— 5 通过
  • 载荷验证:本地回退修复 → 结尾分隔符用例失败(1 failed | 4 passed);恢复修复 → 5 通过
  • npx vitest run src/ui/commands/ — 845 通过,8 失败(8 个均为无关命令测试中预先存在/环境性失败,本 PR 未触及)

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

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


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

@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 — no blockers. Suggestions are inline.

— qwen3.8-max-preview via Qwen Code /review

Comment thread packages/cli/src/ui/commands/summaryCommand.test.ts
@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator Author

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

Review feedback addressed

[Suggestion] Assert result.content in relative-path tests (rc:3682468896)

Decision: Implemented.

The three relative custom-path tests (writes a relative file path as-is, treats a relative path with a trailing separator as a directory, appends the default filename for an existing directory) now capture the command result and assert on result.content:

  • Each asserts the displayed path is the expected relative path (e.g. notes.md, docs/PROJECT_SUMMARY.md, existingdir/PROJECT_SUMMARY.md).
  • Each asserts result.content does not contain projectRoot, guarding against the display branch regressing to an absolute path.

This closes the mutation gap the reviewer identified: changing path.relative(projectRoot, summaryPath) to summaryPath now fails the suite.

Changes: packages/cli/src/ui/commands/summaryCommand.test.ts — 11 insertions, 3 deletions (test-only).

Verification

  • npx vitest run src/ui/commands/summaryCommand.test.ts (packages/cli) — 5 passed
  • npm run build — passed
  • npm run typecheck — passed
  • npm run lint — passed
中文说明

已处理的评审反馈

[建议] 在相对路径测试中断言 result.content(rc:3682468896)

决定: 已实现。

三个相对路径自定义路径测试(writes a relative file path as-istreats a relative path with a trailing separator as a directoryappends the default filename for an existing directory)现在会捕获命令结果并对 result.content 进行断言:

  • 每个测试断言显示路径为预期的相对路径(如 notes.mddocs/PROJECT_SUMMARY.mdexistingdir/PROJECT_SUMMARY.md)。
  • 每个测试断言 result.content 包含 projectRoot,防止显示分支回退为绝对路径。

这修复了评审者发现的变异测试缺口:如果将 path.relative(projectRoot, summaryPath) 改为 summaryPath,测试套件现在会失败。

变更: packages/cli/src/ui/commands/summaryCommand.test.ts — 11 行新增,3 行删除(仅测试)。

验证

  • npx vitest run src/ui/commands/summaryCommand.test.ts(packages/cli)— 5 个通过
  • npm run build — 通过
  • npm run typecheck — 通过
  • npm run lint — 通过

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

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


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

@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 — Test (windows-latest, Node 22.x) was skipped in CI and its suite did not run locally.

[Critical] Re-checked existing blocker — triage review 4817340350 (CHANGES_REQUESTED): the PR body still does not follow the PR template at the reviewed commit. Missing required sections: What this PR does, Why it's needed, Reviewer Test Plan (with How to verify / Evidence / Tested on), Risk & Scope, Linked Issues, and the Chinese translation section (the current body uses Summary/Usage/Changes/Tests headings). Verdict: still stands.

— qwen3.8-max-preview via Qwen Code /review

Comment thread packages/cli/src/ui/commands/summaryCommand.ts Outdated
@wenshao

wenshao commented Jul 30, 2026

Copy link
Copy Markdown
Collaborator

Review: feat(cli): /summary supports custom export path

Overview

/summary gains an optional path argument (argumentHint: '[path]'). saveSummaryToDisk now branches: with an argument it resolves relative to config.getProjectRoot(), appends PROJECT_SUMMARY.md when the target is an existing directory or ends with a separator, mkdir -ps the parent, and reports a relative display path (absolute in, absolute out). Without an argument the old .qwen/PROJECT_SUMMARY.md behavior is unchanged. A new 121-line test file covers the five main shapes.

The shape of the change is good — small, contained in one helper, default path untouched, and the trailing-separator regression comment in the test is the kind of note that saves the next reader. I ran the new suite on the PR branch: 5/5 pass.

Main concern is that the PR describes itself as "matching /export's behavior", but it drops the containment guard that /export is built around.


1. No path containment — diverges from /export (main issue)

exportCommand.ts treats the target path as untrusted: isSubpath rejection before any work (EXPORT_DIR_OUT_OF_CWD), then a documented three-phase symlink validation ("1. Initial … 2. Post-mkdir … 3. Pre-write") specifically to close symlink-swap windows. /summary has none of it — path.isAbsolute(customPath) ? customPath : path.resolve(projectRoot, customPath) accepts anything, and the stat() in the isDir check follows symlinks.

Confirmed on the PR branch with a throwaway test (both pass, i.e. both escape):

// projectRoot = <base>/proj
await summaryCommand.action(ctx, '../outside/leak.md');
// → writes <base>/outside/leak.md, and mkdir -p creates <base>/outside

await fs.symlink(outsideDir, path.join(projectRoot, 'link'));
await summaryCommand.action(ctx, 'link/leak.md');
// → writes into <base>/outside2 through the symlink

Combined with mkdir(..., { recursive: true }), a bad argument silently creates directory trees anywhere the process can write, and writes LLM-generated content there. The blast radius is limited (the user types the argument themselves, content is a summary of their own project, no mode: 0o700 secrets), so this isn't critical — but it is a real behavioral inconsistency with the sibling command, and the codebase clearly already decided which side of that line it wants to be on.

Suggested: reuse isSubpath from core the way exportCommand does, and reject out-of-root targets with a message in the same family. If arbitrary paths are an intentional design decision here, that's defensible — but then please drop "matching /export's behavior" from the description and say so explicitly, so the next person doesn't read the two commands side by side and assume one is a bug.

2. mkdir mode

/export creates its output directory with mode: 0o700; this PR uses the default (0o777 & ~umask). Worth matching, since project summaries can contain a fair amount of internal detail.

3. Custom paths are invisible to welcome-back

packages/core/src/utils/projectSummary.ts:41 hardcodes path.join(process.cwd(), '.qwen', 'PROJECT_SUMMARY.md'), and useWelcomeBack.ts:102 injects the literal @.qwen/PROJECT_SUMMARY.md. So /summary docs/summary.md writes a file that the welcome-back flow will never see — and if a stale .qwen/PROJECT_SUMMARY.md exists, the old one gets restored on next launch, which is the confusing case.

Not necessarily a blocker, but it deserves either a note in the success message when a custom path is used, or a line in the PR description / command description. Right now the user has no signal that they've opted out of the restore flow.

4. Base directory mismatch

Three different notions of "where relative paths resolve from" now coexist:

  • this command: config.getProjectRoot()
  • exportCommand: config.getWorkingDir() || config.getProjectRoot()
  • projectSummary.ts: process.cwd()

Running /summary notes.md from a subdirectory writes to <projectRoot>/notes.md, not the subdirectory — plausible, but the opposite of what /export does with the same input. Worth aligning deliberately rather than by accident.

5. Path is validated after the LLM call, not before

saveSummaryToDisk runs after generateSummaryMarkdown. A bad path (ENOTDIR — e.g. docs/ where a file named docs exists — or EACCES) surfaces as a generic Failed to generate project context summary: … only once the model call has already been paid for. Resolving and creating the directory up front would fail fast and keep the generated summary from being thrown away. Low cost, meaningful UX win.

6. Smaller notes

  • Stale description: get description() still reads "save it to .qwen/PROJECT_SUMMARY.md". Since argumentHint now advertises [path], consider "… (default .qwen/PROJECT_SUMMARY.md)".
  • Display path inconsistency: the default branch hardcodes forward-slash .qwen/PROJECT_SUMMARY.md while the custom branch uses path.relative (backslashes on Windows). Cosmetic only.
  • Stale PR body: "No existing test file for summaryCommand" — tests were added in the PR; worth updating so reviewers don't skip them.
  • The **Update time**: trailing-whitespace fix is unrelated but harmless.

7. Test coverage

The five added tests are well-chosen and the trailing-separator regression case is exactly right. Gaps, roughly in priority order:

  • No test for .. traversal or absolute-outside-root — currently untested because it's unguarded; whichever way pre-release: fix ci #1 is resolved, that behavior should be pinned by a test.
  • No failure-path test (mkdirENOTDIR/EACCES), which is also the path most likely to regress under TypeError in Authentication Selection Interface #5.
  • The vi.mock('@qwen-code/qwen-code-core', …) stub declares only two exports. It works today, but it silently substitutes the whole module — a factory that spreads importActual would be more robust as this file grows.

Verdict

Useful feature, clean implementation, real tests that pass. I'd want #1 resolved before merge — either add the containment check or state explicitly that unrestricted paths are intended and correct the "matches /export" framing. #3 and #5 are worth folding in while the code is open; the rest are nits.

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator Author

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

Review feedback addressed

Inline comments

[rc:3683028279] Dead try/catch around mkdir (Suggestion)Resolved. Removed the misleading try/catch in the default-path branch. fsPromises.mkdir(..., { recursive: true }) does not throw when the directory already exists, so the catch was dead code with a wrong comment. Both the default and custom paths now call mkdir bare, with mode: 0o700 to match /export.

Maintainer review (@wenshao)

#1 Path containmentResolved. Added an isSubpath(projectRoot, resolved) check that rejects any custom path resolving outside the project root, matching the containment pattern used by /export. Two new tests pin the behavior for ../ traversal and absolute-outside-root paths. The error message is translated in all 9 locales.

#2 mkdir modeResolved. Both mkdir calls now pass mode: 0o700, matching /export.

#3 Custom paths invisible to welcome-backDeclined (code change); noted in PR body. Adding a runtime note would require a new i18n key and conditional message logic for a cosmetic concern. The PR body now documents this limitation explicitly so users and reviewers are aware.

#4 Base directory mismatchEscalated for maintainer decision. The command resolves relative paths from config.getProjectRoot(), while /export uses config.getWorkingDir() || config.getProjectRoot() and projectSummary.ts uses process.cwd(). Aligning these is a product decision — changing the base could break existing behavior for users who run /summary from subdirectories. Recommendation: keep getProjectRoot() for now (stable, predictable) and align all three in a follow-up if desired.

#5 Path validated after LLM callResolved. Extracted path resolution, containment check, and directory creation into resolveSummaryTarget(), called at the start of executeSummaryGeneration before the LLM call. Bad paths now fail fast without spending a model call.

#6 Stale descriptionDeclined. The argumentHint: '[path]' already signals the feature. Changing the i18n key across 9 locale files is disproportionate churn for a nit.

#6 Display path inconsistencyResolved. Custom-path display now normalizes separators with .replaceAll(path.sep, '/'), matching the default branch's forward-slash style on all platforms.

#6 Stale PR bodyResolved. PR body regenerated following the repository template.

#7 Test coverageResolved. Added two traversal-rejection tests and switched the mock to use importActual spread for robustness.

Verification

  • npm run build — passed
  • npm run typecheck — passed
  • npm run lint — passed
  • vitest run src/ui/commands/summaryCommand.test.ts (packages/cli) — 7 passed (5 existing + 2 new)
中文说明

已处理的评审反馈

行内评论

[rc:3683028279] mkdir 周围的无效 try/catch(建议)已解决。 移除了默认路径分支中误导性的 try/catch。fsPromises.mkdir(..., { recursive: true }) 在目录已存在时不会抛出异常,因此该 catch 是带有错误注释的死代码。默认路径和自定义路径现在都直接调用 mkdir,并使用 mode: 0o700 以与 /export 保持一致。

维护者评审(@wenshao

#1 路径包含性检查已解决。 添加了 isSubpath(projectRoot, resolved) 检查,拒绝任何解析到项目根目录之外的自定义路径,与 /export 使用的包含性模式一致。新增两个测试固定了 ../ 遍历和根目录外绝对路径的行为。错误消息已在全部 9 个语言文件中翻译。

#2 mkdir 模式已解决。 两个 mkdir 调用现在都传递 mode: 0o700,与 /export 一致。

#3 自定义路径对 welcome-back 不可见拒绝(代码修改);在 PR 正文中注明。 添加运行时提示需要新的 i18n 键和条件消息逻辑,对于一个外观问题来说过于复杂。PR 正文现在明确记录了此限制,以便用户和评审者知悉。

#4 基础目录不一致已提交维护者决策。 该命令从 config.getProjectRoot() 解析相对路径,而 /export 使用 config.getWorkingDir() || config.getProjectRoot()projectSummary.ts 使用 process.cwd()。统一这些是产品决策——更改基础目录可能会破坏从子目录运行 /summary 的用户的现有行为。建议:目前保持 getProjectRoot()(稳定、可预测),如需要则在后续 PR 中统一三者。

#5 路径在 LLM 调用之后才验证已解决。 将路径解析、包含性检查和目录创建提取到 resolveSummaryTarget() 中,在 executeSummaryGeneration 开始时、LLM 调用之前调用。错误路径现在会快速失败,不会浪费模型调用。

#6 过时的描述拒绝。 argumentHint: '[path]' 已经标示了该功能。在 9 个语言文件中更改 i18n 键对于一个小问题来说变更过大。

#6 显示路径不一致已解决。 自定义路径的显示现在通过 .replaceAll(path.sep, '/') 规范化分隔符,在所有平台上与默认分支的正斜杠风格一致。

#6 过时的 PR 正文已解决。 PR 正文已按照仓库模板重新生成。

#7 测试覆盖已解决。 新增两个遍历拒绝测试,并将 mock 切换为使用 importActual 展开以提高健壮性。

验证

  • npm run build — 通过
  • npm run typecheck — 通过
  • npm run lint — 通过
  • vitest run src/ui/commands/summaryCommand.test.ts(packages/cli)— 7 个通过(5 个已有 + 2 个新增)

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

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


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

@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.

[Critical] Re-checked existing blocker — triage review 4819210930 (CHANGES_REQUESTED): the PR body still does not follow the PR template at the reviewed commit. It uses Summary/Usage/Changes/Tests headings and is missing the required sections: What this PR does, Why it's needed, Reviewer Test Plan (How to verify / Evidence / Tested on), Risk & Scope, Linked Issues, and the Chinese translation section. Verdict: still stands.

— qwen3.8-max-preview via Qwen Code /review

Comment thread packages/cli/src/ui/commands/summaryCommand.ts Outdated
@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator Author

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

Round summary

Feedback addressed

  1. [CHANGES_REQUESTED] PR body format — Rewrote pr-body.md to follow the repository PR template with all required sections: What this PR does, Why it's needed, Reviewer Test Plan (How to verify / Evidence / Tested on), Risk & Scope, Linked Issues, and the collapsed Chinese translation.

  2. [rc:3683822645] Suggestion: defer mkdir to save time — Implemented. Moved the mkdir call from resolveSummaryTarget() (which runs before the LLM call) into saveSummaryToDisk() (which runs only after generation succeeds). This ensures a failed generation (rate limit, network error, abort) does not leave an empty directory behind. The up-front path resolution, isSubpath containment guard, and directory detection are preserved for fail-fast validation. Added a regression test that mocks runSideQuery to reject and asserts no directory is created.

Changes

  • packages/cli/src/ui/commands/summaryCommand.ts: removed two mkdir calls from resolveSummaryTarget(), added one mkdir in saveSummaryToDisk() before writeFile.
  • packages/cli/src/ui/commands/summaryCommand.test.ts: added dirExists helper and test "does not create the target directory when generation fails".

Conflict notes

No conflicts (--conflict false).

Verification

  • npm run build — passed
  • npm run typecheck — passed
  • npm run lint — passed
  • cd packages/cli && npx vitest run src/ui/commands/summaryCommand.test.ts — 8 passed (including new regression test)
中文说明

本轮总结

处理的反馈

  1. [CHANGES_REQUESTED] PR 正文格式 — 重写了 pr-body.md,按照仓库 PR 模板填写了所有必需章节:本 PR 做了什么、为什么需要、审阅者测试计划(如何验证 / 证据 / 测试环境)、风险与范围、关联 Issue,以及折叠的中文翻译。

  2. [rc:3683822645] 建议:将 mkdir 延迟到保存时 — 已实现。将 mkdir 调用从 resolveSummaryTarget()(在 LLM 调用之前运行)移到 saveSummaryToDisk()(仅在生成成功后运行)。这确保了生成失败(速率限制、网络错误、中止)不会留下空目录。前置的路径解析、isSubpath 包含性检查和目录检测仍然保留,用于快速失败验证。添加了一个回归测试,模拟 runSideQuery 拒绝并断言不会创建目录。

变更

  • packages/cli/src/ui/commands/summaryCommand.ts:从 resolveSummaryTarget() 中移除了两个 mkdir 调用,在 saveSummaryToDisk()writeFile 之前添加了一个 mkdir
  • packages/cli/src/ui/commands/summaryCommand.test.ts:添加了 dirExists 辅助函数和测试"生成失败时不创建目标目录"。

冲突说明

无冲突(--conflict false)。

验证

  • npm run build — 通过
  • npm run typecheck — 通过
  • npm run lint — 通过
  • cd packages/cli && npx vitest run src/ui/commands/summaryCommand.test.ts — 8 个通过(包括新的回归测试)

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

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


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

@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 — Test (windows-latest, Node 22.x) was skipped in CI and its suite did not run locally.

[Critical] Re-checked existing blocker — triage reviews 4819210930 / 4820209989 (CHANGES_REQUESTED): the PR body still does not follow the PR template at the reviewed commit. It uses Summary/Usage/Changes/Tests headings and is missing the required sections: What this PR does, Why it's needed, Reviewer Test Plan (How to verify / Evidence / Tested on), Risk & Scope, Linked Issues, and the Chinese translation section. It also still states 'No existing test file for summaryCommand' even though tests were added in the PR. Verdict: still stands.

— qwen3.8-max-preview via Qwen Code /review

Comment thread packages/cli/src/ui/commands/summaryCommand.test.ts Outdated
Comment thread packages/cli/src/ui/commands/summaryCommand.test.ts
@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator Author

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

Round summary

Feedback triage

# Finding Severity Decision Action
1 PR body does not follow the PR template (missing required sections, stale claim about no test file) Critical (review-level) Not a code change — PR body is managed by the workflow, not by code in this branch. The stale "No existing test file" claim was from an earlier revision; tests were added in subsequent commits. No code change. The workflow regenerates PR metadata.
2 [rc:3684514308] Windows path separator mismatch in absolute-path test assertion Critical (inline) Resolved. resolveSummaryTarget normalizes display paths via .replaceAll(path.sep, '/'), so the assertion must compare against the normalized form. On Linux this is a no-op; on Windows it converts backslashes to forward slashes, matching the production code path. Changed toContain(target)toContain(target.replaceAll(path.sep, '/')) in the absolute-path test.
3 [rc:3684514346] No test asserts on-disk file content Suggestion (inline) Resolved. Added a read-back assertion in the default-path test: reads the written file and checks it contains both the mock summary body (SUMMARY BODY) and the metadata heading (## Summary Metadata). This guards against a future refactor silently dropping the summary interpolation. Added 3 lines to the default-path test.

Conflict resolution

No conflicts (--conflict false). No merge performed.

Changes

  • packages/cli/src/ui/commands/summaryCommand.test.ts (+4, −1)

Verification

  • npm run build — passed
  • npm run typecheck — passed
  • npm run lint — passed
  • npx vitest run src/ui/commands/summaryCommand.test.ts (packages/cli) — 8 passed (8)
中文说明

本轮总结

反馈分类

# 发现 严重程度 决定 操作
1 PR 描述未遵循 PR 模板(缺少必需章节,仍声称没有测试文件) Critical(审查级别) 非代码变更——PR 描述由工作流管理,不属于本分支的代码。"没有测试文件"的过时说法来自早期修订版;后续提交已添加测试。 无代码变更。工作流会重新生成 PR 元数据。
2 [rc:3684514308] Windows 路径分隔符不匹配导致绝对路径测试断言失败 Critical(行内) 已解决。 resolveSummaryTarget 通过 .replaceAll(path.sep, '/') 规范化显示路径,因此断言必须与规范化后的形式比较。在 Linux 上这是无操作;在 Windows 上将反斜杠转换为正斜杠,与生产代码路径一致。 将绝对路径测试中的 toContain(target) 改为 toContain(target.replaceAll(path.sep, '/'))
3 [rc:3684514346] 没有测试断言磁盘文件内容 Suggestion(行内) 已解决。 在默认路径测试中添加了回读断言:读取写入的文件并检查其包含模拟摘要正文(SUMMARY BODY)和元数据标题(## Summary Metadata)。这可以防止未来重构静默丢弃摘要插值。 在默认路径测试中添加了 3 行。

冲突解决

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

变更

  • packages/cli/src/ui/commands/summaryCommand.test.ts(+4,−1)

验证

  • npm run build — 通过
  • npm run typecheck — 通过
  • npm run lint — 通过
  • npx vitest run src/ui/commands/summaryCommand.test.ts(packages/cli)— 8 通过(共 8 个)

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

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


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

@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 — Test (windows-latest, Node 22.x) was skipped in CI and its suite did not run locally (the Windows path-separator handling that prior blocker 3684514308 concerned is only exercised on this leg).

[Critical] Re-checked existing blocker — triage reviews 4819210930 / 4820209989 / 4821085307 (CHANGES_REQUESTED): the PR body still does not follow the PR template at the reviewed commit. It uses Summary/Usage/Changes/Tests headings and is missing the required sections: What this PR does, Why it's needed, Reviewer Test Plan (How to verify / Evidence / Tested on), Risk & Scope, Linked Issues, and the Chinese translation section. It also still states 'No existing test file for summaryCommand' even though an 8-test summaryCommand.test.ts was added in the PR. Verdict: still stands.

— qwen3.8-max-preview via Qwen Code /review

Comment on lines +158 to +160
if (!isSubpath(projectRoot, resolved)) {
throw new Error(t('Summary path must be within the project root.'));
}

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.

[Suggestion] The containment check is purely lexical — isSubpath (packages/core/src/utils/paths.ts) uses path.relative and never resolves symlinks — while the downstream stat (isDir detection), mkdir, and writeFile all follow symlinks. A symlink inside the project root that points outside it defeats the "within the project root" guarantee this hunk advertises. The sibling write commands exportCommand.ts and statsCommand.ts both fs.realpath the target and re-run isSubpath on the realpath before writing; this command does not. — Failure scenario: a project ships a symlink docs -> ../outside (or docs -> /etc); /summary docs/ resolves to <root>/docs, passes the lexical check, and saveSummaryToDisk writes PROJECT_SUMMARY.md outside the root while the success message displays the innocent docs/PROJECT_SUMMARY.md. This is defense-in-depth hardening rather than a privilege boundary (the user types the path and already has filesystem access — consistent with @wenshao's not-critical rating), but it diverges from the guard every sibling carries.

Suggested change
if (!isSubpath(projectRoot, resolved)) {
throw new Error(t('Summary path must be within the project root.'));
}
const realResolved = await fsPromises.realpath(resolved).catch(() => resolved);
if (!isSubpath(projectRoot, realResolved)) {
throw new Error(t('Summary path must be within the project root.'));
}

— qwen3.8-max-preview via Qwen Code /review

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Declined — the suggested realpath(resolved).catch(() => resolved) is a no-op for the described scenario: when the target file does not yet exist (the common case), realpath fails with ENOENT and the .catch falls back to the lexical path, so the symlink is never resolved. A proper fix would need a realpathNearestExisting ancestor walk like exportCommand.ts / statsCommand.ts, which is disproportionate complexity for a non-security-boundary check (the user typing the path already has full filesystem access, consistent with the not-critical rating).

中文说明

拒绝——建议的 realpath(resolved).catch(() => resolved) 对所描述的场景是空操作:当目标文件尚不存在时(常见情况),realpath 因 ENOENT 失败,.catch 回退到词法路径,因此符号链接永远不会被解析。正确的修复需要像 exportCommand.ts / statsCommand.ts 那样进行 realpathNearestExisting 祖先遍历,这对于非安全边界检查来说复杂度过高(输入路径的用户已经拥有完整的文件系统访问权限,与非关键评级一致)。

Comment thread packages/cli/src/ui/commands/summaryCommand.ts
@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator Author

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

Review feedback addressed

[Critical] PR body does not follow the PR template

Decision: Fixed. Regenerated pr-title.txt and pr-body.md following the repository PR template with all required sections (What this PR does, Why it's needed, Reviewer Test Plan, Risk & Scope, Linked Issues, Chinese translation). Removed the stale claim about no existing test file.

[rc:3685040030] Suggestion: assert mode: 0o700 in tests

Decision: Implemented. Added a POSIX-guarded assertion in the default-path test that checks (stat.mode & 0o777) === 0o700 on the created .qwen directory. This prevents a future refactor from silently dropping the permission flag.

[rc:3685040016] Suggestion: symlink-aware containment check via realpath

Decision: Declined. The suggested realpath(resolved).catch(() => resolved) does not fix the described failure scenario: when the target file does not yet exist (the common case for /summary docs/new.md), realpath fails with ENOENT and the .catch falls back to the lexical path, making the check a no-op. A proper fix would require a realpathNearestExisting walk like exportCommand.ts and statsCommand.ts use, which is disproportionate complexity for a non-security-boundary check — the user typing the path already has full filesystem access (consistent with the not-critical rating noted in the finding).

Windows CI leg skipped

Decision: Informational — CI environment issue, not actionable in code. The path separator handling is covered by replaceAll(path.sep, '/') and tested on Linux.

Verification

  • npm run build — passed
  • npm run typecheck — passed
  • npm run lint — passed
  • vitest run src/ui/commands/summaryCommand.test.ts (packages/cli, touched) — 8 passed
中文说明

已处理的审阅反馈

[Critical] PR 正文未遵循 PR 模板

决定: 已修复。按照仓库 PR 模板重新生成了 pr-title.txtpr-body.md,包含所有必需章节(本 PR 做了什么、为什么需要、审阅者测试计划、风险与范围、关联 Issue、中文翻译)。移除了关于不存在测试文件的过时描述。

[rc:3685040030] 建议:在测试中断言 mode: 0o700

决定: 已实现。在默认路径测试中添加了 POSIX 保护的断言,检查创建的 .qwen 目录的 (stat.mode & 0o777) === 0o700。这可以防止未来的重构悄悄移除权限标志。

[rc:3685040016] 建议:通过 realpath 实现符号链接感知的包含性检查

决定: 拒绝。建议的 realpath(resolved).catch(() => resolved) 无法修复所描述的失败场景:当目标文件尚不存在时(/summary docs/new.md 的常见情况),realpath 因 ENOENT 失败,.catch 回退到词法路径,使检查成为空操作。正确的修复需要像 exportCommand.tsstatsCommand.ts 那样使用 realpathNearestExisting 遍历,这对于非安全边界检查来说复杂度过高——输入路径的用户已经拥有完整的文件系统访问权限(与发现中提到的非关键评级一致)。

Windows CI 被跳过

决定: 信息性——CI 环境问题,无法在代码中处理。路径分隔符处理由 replaceAll(path.sep, '/') 覆盖,并在 Linux 上测试。

验证

  • npm run build — 通过
  • npm run typecheck — 通过
  • npm run lint — 通过
  • vitest run src/ui/commands/summaryCommand.test.ts(packages/cli,已修改)— 8 个通过

Deferred non-Critical feedback

Critical-only mode is active after 5 change-producing rounds: the automated reviewer's non-Critical suggestions below are deferred and stay open for human follow-up — do not modify code, resolve threads, or reply on their behalf. Maintainer feedback defers only once its author has already had 2 regular feedback batches addressed in this window's Critical-only tail — an account can host an automated reviewer loop, so the brake keys on measured regeneration, not identity; authors at their budget, if any, are named below. (A maintainer can lift the mode itself: @qwen-code /retry starts a fresh counting window.)

中文说明

完成 5 个产生改动的轮次后进入仅处理 Critical 的模式:以上为自动评审的非 Critical 建议,予以延后、保持开放并留待人工跟进——不要为其修改代码、解决线程或代为回复。维护者的反馈仅在其本人于本窗口 Critical-only 阶段已被处理 2 批常规反馈之后才会被延后——账号可能挂着自动评审循环,因此刹车依据实测的再生频度而非身份;达到预算的作者(如有)在下方点名。(如需解除该模式,评论 @qwen-code /retry 即可开启新的计数窗口。)

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

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


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

@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 — Test (windows-latest, Node 22.x) was skipped in CI and its suite did not run locally.

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

[Critical] Re-checked existing blocker — triage reviews 4819210930 / 4820209989 / 4821085307 / 4821746333 (CHANGES_REQUESTED): the PR body still does not follow the PR template at the reviewed commit. It uses Summary/Usage/Changes/Tests headings and is missing the required sections: What this PR does, Why it's needed, Reviewer Test Plan (How to verify / Evidence / Tested on), Risk & Scope, Linked Issues, and the Chinese translation section. It also still states 'No existing test file for summaryCommand' even though an 8-test summaryCommand.test.ts was added in the PR. Verdict: still stands.

— qwen3.8-max-preview via Qwen Code /review

Comment thread packages/cli/src/ui/commands/summaryCommand.ts
Comment thread packages/cli/src/ui/commands/summaryCommand.test.ts
@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator Author

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

Autofix review round — PR #8116

Addressed the two actionable inline findings. Critical-only mode is active; the
deferred non-Critical section was empty, so both inline comments were in scope.

Feedback points

  • [Critical] rc:3685539993 — symlink bypass of path containment (summaryCommand.ts:160): Fixed. The containment check was purely lexical (path.relative via isSubpath), so a symlink inside the project root pointing outside (e.g. docs -> /etc, then /summary docs/cron.d/job) passed the check and writeFile followed the link. Added a real-path containment check that mirrors the existing defense in exportCommand.ts and statsCommand.ts: fs.realpath(projectRoot) plus a local realpathNearestExisting helper that resolves the nearest existing ancestor of the target (the target file usually does not exist yet) before re-checking isSubpath. I did not apply the suggested .catch(() => resolved) verbatim because, when the target file does not exist, realpath throws ENOENT and that fallback reverts to the lexical path — leaving the exact described scenario (a non-existent file under a symlinked parent) unguarded. The nearest-existing-ancestor approach is the codebase's established fix and closes that gap. The cheap lexical check is retained so trivial escapes (../…, absolute-outside) still fail before any filesystem work.
  • [Suggestion] rc:3685540016 — rejection tests don't assert the LLM call was skipped (summaryCommand.test.ts:143): Implemented. Both path-rejection tests now assert expect(runSideQuery).not.toHaveBeenCalled(), guarding against a future reorder that runs generation before validation. Added vi.mocked(runSideQuery).mockClear() in beforeEach so the assertion is reliable across tests.

Changes

  • packages/cli/src/ui/commands/summaryCommand.ts: added realpathNearestExisting helper and a real-path containment re-check after the lexical check in resolveSummaryTarget.
  • packages/cli/src/ui/commands/summaryCommand.test.ts: added runSideQuery not-called assertions to the two rejection tests, cleared the mock per test, and added a regression test that creates an in-root symlink pointing to an outside temp dir and asserts the write is rejected, nothing lands outside the root, and no LLM call is made (skipped on Windows, where symlink creation needs elevation).

Not code-addressable

  • The review-level Critical about the PR body not following the template is a PR-metadata concern owned by the workflow (PR body generation), not a change reachable from the checkout, so it is not addressed here.
  • The "Not reviewed … skipped in CI" notes are informational about skipped CI suites, not defects requiring a code change.

Conflict notes

--conflict false: no merge of origin/main was performed; none was needed.

Verification

  • npx vitest run src/ui/commands/summaryCommand.test.ts (packages/cli) — 9 passed (includes the new symlink-escape regression test; confirmed load-bearing: without the realpath check the write would succeed and the test would fail)
  • npm run typecheck — passed
  • npm run build — passed
  • npm run lint — passed
  • npx eslint packages/cli/src/ui/commands/summaryCommand.ts packages/cli/src/ui/commands/summaryCommand.test.ts — passed
  • npx prettier --check on both touched files — passed
中文说明

Autofix 评审轮次 — PR #8116

本轮处理了两个可操作的行内发现。当前处于仅处理 Critical 的模式;延后的非 Critical 区段为空,因此两个行内评论都在处理范围内。

反馈点

  • [Critical] rc:3685539993 — 符号链接绕过路径包含校验summaryCommand.ts:160):已修复。 原有的包含校验完全是词法层面的(通过 isSubpath 使用 path.relative),因此项目根目录内部指向外部的符号链接(例如 docs -> /etc,然后执行 /summary docs/cron.d/job)能够通过校验,而 writeFile 会跟随该链接写到外部。新增了真实路径的包含校验,与 exportCommand.tsstatsCommand.ts 中既有的防御保持一致:对 fs.realpath(projectRoot) 以及一个本地的 realpathNearestExisting 辅助函数——后者解析目标最近的已存在祖先路径(目标文件本身通常尚不存在)——然后重新执行 isSubpath 校验。我没有逐字采用建议中的 .catch(() => resolved),因为当目标文件不存在时,realpath 会抛出 ENOENT,而该回退会退回到词法路径——恰恰使所描述的场景(位于符号链接父目录下的、尚不存在的文件)失去防护。最近已存在祖先的方式是本代码库既有的修复手段,能够堵住该缺口。同时保留了低开销的词法校验,使得简单的逃逸(../…、外部绝对路径)仍在任何文件系统操作之前就被拒绝。
  • [Suggestion] rc:3685540016 — 拒绝用例未断言 LLM 调用被跳过summaryCommand.test.ts:143):已实现。 两个路径拒绝用例现在都断言 expect(runSideQuery).not.toHaveBeenCalled(),以防止未来把生成逻辑重排到校验之前。在 beforeEach 中加入了 vi.mocked(runSideQuery).mockClear(),使该断言在各测试间可靠。

改动

  • packages/cli/src/ui/commands/summaryCommand.ts:新增 realpathNearestExisting 辅助函数,并在 resolveSummaryTarget 的词法校验之后增加真实路径的包含复核。
  • packages/cli/src/ui/commands/summaryCommand.test.ts:为两个拒绝用例增加 runSideQuery 未被调用的断言,每个测试清空 mock,并新增一个回归测试——在项目根内创建一个指向外部临时目录的符号链接,断言写入被拒绝、没有任何内容落到根目录之外、且未发起 LLM 调用(在 Windows 上跳过,因为创建符号链接需要提权)。

无法通过代码处理

  • 评审级别关于 PR 正文未遵循模板的 Critical 属于 PR 元数据问题,由工作流(PR 正文生成)负责,无法从当前检出中修改,因此本轮不处理。
  • “Not reviewed … skipped in CI” 的说明仅是对被跳过的 CI 套件的信息性描述,并非需要代码修改的缺陷。

冲突说明

--conflict false:未执行对 origin/main 的合并;也无此必要。

验证

  • npx vitest run src/ui/commands/summaryCommand.test.ts(packages/cli)— 9 个通过(包含新增的符号链接逃逸回归测试;已确认其有效:若没有 realpath 校验,写入将会成功,该测试会失败)
  • npm run typecheck — 通过
  • npm run build — 通过
  • npm run lint — 通过
  • npx eslint packages/cli/src/ui/commands/summaryCommand.ts packages/cli/src/ui/commands/summaryCommand.test.ts — 通过
  • 对两个改动文件执行 npx prettier --check — 通过

Deferred non-Critical feedback

Critical-only mode is active after 5 change-producing rounds: the automated reviewer's non-Critical suggestions below are deferred and stay open for human follow-up — do not modify code, resolve threads, or reply on their behalf. Maintainer feedback defers only once its author has already had 2 regular feedback batches addressed in this window's Critical-only tail — an account can host an automated reviewer loop, so the brake keys on measured regeneration, not identity; authors at their budget, if any, are named below. (A maintainer can lift the mode itself: @qwen-code /retry starts a fresh counting window.)

中文说明

完成 5 个产生改动的轮次后进入仅处理 Critical 的模式:以上为自动评审的非 Critical 建议,予以延后、保持开放并留待人工跟进——不要为其修改代码、解决线程或代为回复。维护者的反馈仅在其本人于本窗口 Critical-only 阶段已被处理 2 批常规反馈之后才会被延后——账号可能挂着自动评审循环,因此刹车依据实测的再生频度而非身份;达到预算的作者(如有)在下方点名。(如需解除该模式,评论 @qwen-code /retry 即可开启新的计数窗口。)

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

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


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

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator Author

🤖 AutoFix updated a stale base — the fix did not pass verification, but this PR was behind main, so it merged current main in via update-branch and will retry on the next scan. A stale base (a dependency or symbol main already changed) can fail the build without being the fix's fault; if it still fails once current, it hands off to a human.

What I found before stopping:

Address Review Summary — PR #8116

Feedback Dispositions

1. [Critical] PR body does not follow the repository PR template

Disposition: Addressed (metadata fix)

The reviewer confirmed all six prior code-level Critical blockers are fixed. The remaining Critical is a process/metadata item: the PR body uses non-template headings (Summary/Usage/Changes/Tests) and is missing required sections (What this PR does, Why it's needed, Reviewer Test Plan, Risk & Scope, Linked Issues, Chinese translation).

Regenerated pr-title.txt and pr-body.md in the workdir following .github/pull_request_template.md exactly, with all required sections, honest OS test matrix (Linux ✅, macOS/Windows ⚠️), and a complete collapsed Chinese translation.

2. Failed CI check: Test (ubuntu-latest Node 22.x)

Disposition: Not reproducible locally — likely flaky/environment-specific

All local verification passes on this branch:

  • npx vitest run src/ui/commands/summaryCommand.test.ts — 35/35 passed
  • npm run typecheck — passed
  • npm run lint — passed
  • npm run build — passed

The sandboxed deep verification (77/77 scripted assertions) also passed. Without access to CI logs, the specific failure cannot be diagnosed further. The workflow's independent CI re-run is the final gate.

3. [Suggestion] Trailing blank line in footer detection (non-blocking)

Disposition: Declined with evidence

The reviewer explicitly states this is "reported as an observatio

Run log: https://github.com/QwenLM/qwen-code/actions/runs/30705341742


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

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator Author

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

No code change this round

The only feedback newer than the last evaluation is a single **[Critical]** from the automated reviewer stating that the PR body does not follow the repository PR template. That finding explicitly says it is "a process/metadata item, not a code defect resolvable by this diff," and confirms that all six prior code-level Critical blockers were re-checked against the current code and are fixed. There is therefore no source change to make this round, and the working tree is left clean.

Disposition of each point

  • [Critical] PR body does not follow the template — Acted on within the limits of this flow. This flow has no GitHub credentials and cannot edit the live PR body (the workflow owns all GitHub writes). A template-compliant replacement was prepared at /tmp/autofix-review-8116/pr-body.md, with a Conventional-Commit title at /tmp/autofix-review-8116/pr-title.txt, filling every required section (What this PR does; Why it's needed; Reviewer Test Plan with How to verify / Evidence / Tested on; Risk & Scope; Linked Issues; and the Chinese translation) and removing the stale "No existing test file for summaryCommand" claim (a 602-line, 35-test summaryCommand.test.ts exists in the PR). The workflow or a maintainer can apply these two files to the PR body and title.
  • Not reviewed: Windows / macOS CI lanes skipped — Informational, not a defect. Reflected honestly in the prepared PR body's Tested-on table (Linux tested; macOS and Windows not tested; the symlink tests skip on win32).
  • Verification Suggestion: a trailing blank line defeats the footer detector — Declined. The reviewer explicitly labels this non-blocking and fail-safe and "a judgment call, not a correctness fix." The strict end-anchored footer is the deliberate trade-off that stops a prose document merely embedding a sample footer from being clobbered; loosening [^\n]*\n?$ to [^\n]*\s*$ would accept trailing blank lines as "generated." Out of scope and not worth the behavior change (AGENTS.md Simplicity First).

Verification

No source files changed this round, so no build / typecheck / lint / test commands were required or run; the working tree remains clean and no commit was created. The current head was independently re-verified by the sandboxed verification run linked in the PR thread (77/77 scripted assertions; targeted gate summaryCommand.test.ts 35/35 on Linux). The only artifacts produced this round are the corrected PR body and title above.

中文说明

本轮无代码改动

晚于上次评估的唯一反馈,是自动评审机器人提出的一条 **[Critical]**,指出 PR 正文未遵循仓库的 PR 模板。该发现明确说明它"是一个流程/元数据项,并非本 diff 可解决的代码缺陷",并确认此前的六个代码级 Critical 阻断项都已对照当前代码重新核查、均已修复。因此本轮没有需要进行的源码改动,工作树保持干净。

各要点处置

  • [Critical] PR 正文未遵循模板 — 在本流程能力范围内已处理。本流程没有 GitHub 凭证,无法编辑线上的 PR 正文(所有 GitHub 写入由工作流负责)。已在 /tmp/autofix-review-8116/pr-body.md 准备好一份符合模板的替换正文,并在 /tmp/autofix-review-8116/pr-title.txt 准备好符合 Conventional Commit 规范的标题,填入了所有必需章节(What this PR does;Why it's needed;含 How to verify / Evidence / Tested on 的 Reviewer Test Plan;Risk & Scope;Linked Issues;以及中文翻译),并移除了过时的"No existing test file for summaryCommand"说法(PR 中已存在一个 602 行、35 个测试的 summaryCommand.test.ts)。工作流或维护者可以将这两个文件应用到 PR 正文与标题上。
  • 未评审:Windows / macOS CI 通道被跳过 — 属于信息性说明,并非缺陷。已在准备好的 PR 正文的 Tested-on 表格中如实体现(Linux 已测试;macOS 与 Windows 未测试;符号链接测试在 win32 上跳过)。
  • 验证建议:末尾空行会使页脚识别失效 — 拒绝。评审者明确将其标为非阻断、失败安全,并称其为"一个权衡判断,而非正确性修复"。严格的末尾锚定页脚正是有意为之的权衡,用以防备一篇仅仅嵌入了示例页脚的散文文档被误覆盖;把 [^\n]*\n?$ 放宽为 [^\n]*\s*$ 会把末尾空行也接受为"已生成总结"。这超出范围,也不值得为此改变行为(AGENTS.md 的 Simplicity First 原则)。

验证

本轮没有改动任何源码文件,因此不需要也没有运行任何 build / typecheck / lint / test 命令;工作树保持干净,且没有创建任何提交。当前 head 已由 PR 帖子中链接的沙箱验证运行独立地重新验证(77/77 个脚本化断言;定向门禁 summaryCommand.test.ts 在 Linux 上 35/35)。本轮产出的唯一工件就是上述更正后的 PR 正文与标题。

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


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

@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. Unresolved, please confirm: [Critical] PR body template (triage review 4817340350 and CHANGES_REQUESTED follow-ups): the live PR body still uses Summary/Usage/Changes/Tests headings and does not follow the repository PR template (missing What this PR does / Why it's needed / Reviewer Test Plan / Risk & Scope / Linked Issues / Chinese translation), and still states 'No existing test file for summaryCommand' despite a 35-test summaryCommand.test.ts. This is a process/metadata item, not a code defect resolvable by this diff — the code review cannot certify it as fixed from the code, so it is ruled 'cannot tell' rather than re-filed as a code finding. All six prior code-level Critical blockers (Windows test assertion 3684514308, trailing-separator dead code 3682079753, multi-link symlink chain 3693510159, lexical containment bypass 3685539993, broken-symlink bypass from review 4830603827, appended-filename re-validation from review 4831265865) were re-checked against the code at the reviewed commit and confirmed fixed. Not reviewed: build-and-test — Test (windows-latest, Node 22.x) was skipped in CI and its Windows path-separator suite (endsWith(path.sep), replaceAll(path.sep, '/')) did not run locally; Agent 7 ran the packages/cli suite on Linux only, so the Windows-specific behavior this PR adds is verified by code reading, not execution. Not reviewed: build-and-test — Test (macos-latest, Node 22.x) was skipped in CI and did not run locally; the new symlink-containment tests exercise macOS-specific /tmp -> /private/tmp realpath behavior, verified by code reading only.

— qwen3.8-max-preview via Qwen Code /review

Comment on lines +299 to +301
// Compute the default-target flag before the guards so an explicitly
// spelled default path (`.qwen/PROJECT_SUMMARY.md` or `.qwen/`) behaves
// exactly like the no-arg command and always overwrites.

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.

[Suggestion] The comment claims a spelled default path "behaves exactly like the no-arg command", but when .qwen is a symlink pointing outside the project root the two diverge. The no-arg command returns early and skips every symlink check (and saveSummaryToDisk skips assertLeafNotSymlinkEscape for isDefaultTarget), so /summary writes through the symlink — the setup the test "allows the default target when .qwen is a symlink" deliberately supports. The spelled path /summary .qwen/PROJECT_SUMMARY.md instead goes through the custom-path branch, where assertLeafNotSymlinkEscaperealpathNearestExisting resolves .qwen to the outside target and isSubpath(realProjectRoot, …) throws. — Concrete cost: a user with that supported setup gets a confusing "Summary path must be within the project root" error for the spelled path even though the no-arg command succeeds. The "always overwrites" half of the comment is accurate; the "behaves exactly" half is not. The behavior is safe-side (rejection), so this is comment accuracy rather than a correctness/security defect.

Suggested change
// Compute the default-target flag before the guards so an explicitly
// spelled default path (`.qwen/PROJECT_SUMMARY.md` or `.qwen/`) behaves
// exactly like the no-arg command and always overwrites.
// Compute the default-target flag before the guards so an explicitly
// spelled default path (`.qwen/PROJECT_SUMMARY.md` or `.qwen/`) is
// treated as the default target for the overwrite guard and always
// overwrites. Unlike the no-arg command, a spelled path still runs the
// custom-path symlink containment checks.

— qwen3.8-max-preview via Qwen Code /review

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator Author

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

Review feedback addressed

Inline: [rc:3696038411] — Comment accuracy on spelled default path (Suggestion)

Decision: Implemented.

The comment at summaryCommand.ts:301 claimed a spelled default path (.qwen/PROJECT_SUMMARY.md) "behaves exactly like the no-arg command and always overwrites." The reviewer correctly identified that this is inaccurate: when .qwen is a symlink pointing outside the project root, the no-arg command returns early and skips all symlink checks, while the spelled path goes through the custom-path branch where assertLeafNotSymlinkEscape resolves the symlink and rejects it.

Replaced the comment with the reviewer's suggested wording, which accurately states the spelled path "is treated as the default target for the overwrite guard and always overwrites" while noting that "unlike the no-arg command, a spelled path still runs the custom-path symlink containment checks."

Comment-only change; no behavioral modification.

Review-level: PR body template (COMMENTED)

Decision: Acknowledged, not code-actionable. The reviewer noted the PR body does not follow the repository template. This is a process/metadata item explicitly described as "not a code defect resolvable by this diff." The workflow owns PR body updates.

Review-level: Windows/macOS CI coverage gaps (COMMENTED)

Decision: Acknowledged, informational. The reviewer noted Windows and macOS CI test jobs were skipped and the corresponding platform-specific behavior was verified by code reading only. No actionable code change.

Verification

  • npm run build — passed
  • npm run typecheck — passed
  • npm run lint — passed
  • vitest run src/ui/commands/summaryCommand.test.ts (packages/cli, touched) — 35 passed
中文说明

已处理的审查反馈

行内评论:[rc:3696038411] — 关于显式拼写默认路径的注释准确性(建议)

决定:已实施。

summaryCommand.ts:301 处的注释声称显式拼写的默认路径(.qwen/PROJECT_SUMMARY.md)"与无参数命令的行为完全相同,并且总是覆盖"。审查者正确指出这不准确:当 .qwen 是指向项目根目录外部的符号链接时,无参数命令会提前返回并跳过所有符号链接检查,而显式拼写的路径会经过自定义路径分支,其中 assertLeafNotSymlinkEscape 会解析符号链接并拒绝它。

已将注释替换为审查者建议的措辞,准确说明显式拼写的路径"被视为覆盖保护的默认目标,并且总是覆盖",同时指出"与无参数命令不同,显式拼写的路径仍会运行自定义路径的符号链接包含性检查"。

仅修改注释;无行为变更。

审查级别:PR 正文模板(COMMENTED)

决定:已确认,非代码可操作项。 审查者指出 PR 正文未遵循仓库模板。这是一个流程/元数据问题,被明确描述为"不是此差异可解决的代码缺陷"。PR 正文更新由工作流负责。

审查级别:Windows/macOS CI 覆盖缺口(COMMENTED)

决定:已确认,信息性说明。 审查者指出 Windows 和 macOS CI 测试任务被跳过,相应的平台特定行为仅通过代码阅读验证。无需可操作的代码变更。

验证

  • npm run build — 通过
  • npm run typecheck — 通过
  • npm run lint — 通过
  • vitest run src/ui/commands/summaryCommand.test.ts(packages/cli,已触及)— 35 项通过

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-preview

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Qwen Code review did not complete successfully. Qwen review exited with status 1. A transient error is retried automatically; if you are seeing this, retry with @qwen-code /review. See workflow logs.

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator Author

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

No action required this round

No actionable review feedback was found for PR #8116.

Feedback triage

Item Disposition
Inline comments None present
Reviews None present
@qwen-code-ci-bot issue-level comment Transient CI error — the Qwen review run exited with status 1. The comment itself says this is retried automatically. No code change needed.
Failed check: web-shell E2E Smoke (ubuntu-latest Node 22.x) Unrelated to this PR. This PR only modifies packages/cli (summaryCommand.ts, summaryCommand.test.ts, i18n locales) and docs/. The packages/web-shell package has zero dependency on packages/cli — confirmed by inspecting its package.json and grepping for any cross-package imports. The web-shell E2E smoke test runs Playwright browser tests scoped entirely to the web-shell package. The failure is infrastructure- or flakiness-related, not caused by this PR's changes.

Verification

  • vitest run src/ui/commands/summaryCommand.test.ts (packages/cli) — 35 tests passed
中文说明

本轮无需操作

PR #8116 未发现需要处理的可操作审查反馈。

反馈分类

项目 处理方式
行内评论
审查意见
@qwen-code-ci-bot 的 issue 级评论 临时性 CI 错误 — Qwen 审查运行以状态码 1 退出。该评论本身说明会自动重试,无需代码变更。
失败检查:web-shell E2E Smoke (ubuntu-latest Node 22.x) 与本 PR 无关。 本 PR 仅修改了 packages/cli(summaryCommand.ts、summaryCommand.test.ts、i18n 语言文件)和 docs/packages/web-shell 包对 packages/cli 没有任何依赖 — 已通过检查其 package.json 和搜索跨包导入确认。web-shell E2E 冒烟测试运行的是完全限于 web-shell 包的 Playwright 浏览器测试。该失败与基础设施或测试不稳定性有关,而非本 PR 的变更所致。

验证

  • vitest run src/ui/commands/summaryCommand.test.ts(packages/cli)— 35 个测试全部通过

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


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

@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. Unresolved, please confirm: [Critical] PR body template (triage review 4817340350 and CHANGES_REQUESTED follow-ups): the live PR body still uses Summary/Usage/Changes/Tests headings, is missing the required template sections (What this PR does / Why it's needed / Reviewer Test Plan / Risk & Scope / Linked Issues / Chinese translation), and still states 'No existing test file for summaryCommand' despite a 35-test summaryCommand.test.ts. This is a process/metadata item, not a code defect — the code review cannot certify it as fixed from the code, so it is ruled 'cannot tell' rather than re-filed as a code finding. Not reviewed: build-and-test — Test (windows-latest, Node 22.x) was skipped in CI and its Windows path-separator suite (endsWith(path.sep), replaceAll(path.sep, '/')) did not run locally; Agent 7 ran the packages/cli suite on Linux only, so the Windows-specific behavior this PR adds is verified by code reading, not execution. Not reviewed: build-and-test — Test (macos-latest, Node 22.x) was skipped in CI and did not run locally; the new symlink-containment tests exercise macOS-specific /tmp -> /private/tmp realpath behavior, verified by code reading only.

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

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator Author

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

Autofix review round — no code change

No code changes were made this round. The automated reviewer's finding ledger is
empty ("findings": []), the review event is COMMENTED (not
CHANGES_REQUESTED), and there are no inline comments. The single point raised
is not a code defect and is outside what this code-fix automation can change.

Triage of the review point

[Critical] PR body template / stale "No existing test file" statement — not
actionable here (metadata, not code).

  • Verified the factual basis: packages/cli/src/ui/commands/summaryCommand.test.ts
    exists in this PR (+602 lines, 23+ test cases), so the PR body's line stating
    "No existing test file for summaryCommand" is indeed stale, and the body does
    not follow the required template sections.
  • This is a PR-body/metadata problem, not a code defect — the reviewer itself
    rules it "cannot tell" and explicitly does not re-file it as a code
    finding. Nothing in the diff is wrong on this account.
  • Refreshing the PR body is a GitHub write operation owned by the workflow / PR
    author. This autofix code-fix mode has no GitHub credentials and produces no
    PR-body artifact, so it cannot edit the PR body from here.
  • Recommendation: regenerate the PR body through the normal prepare-PR flow
    so it uses the required template sections (What this PR does / Why it's needed
    / Reviewer Test Plan / Risk & Scope / Linked Issues / Chinese translation) and
    drops the stale "no existing test file" statement.

"Not reviewed" notes (Windows / macOS CI jobs skipped) — informational, not
findings.

  • These record an environment limitation: the windows-latest and
    macos-latest Test jobs were skipped in CI, so the Windows path-separator
    handling (endsWith(path.sep), replaceAll(path.sep, '/')) and the macOS
    symlink-containment behavior (/tmp -> /private/tmp realpath) were verified
    by code reading rather than execution.
  • On inspection those code paths are present and correct: the trailing-separator
    check accepts both / and path.sep, display paths are normalized with
    replaceAll(path.sep, '/'), and symlink containment is re-checked at the
    leaf, after the directory join, and immediately before the write. No defect
    found and no change warranted.

Still-red check: web-shell E2E Smoke (ubuntu-latest Node 22.x)

This PR's diff touches only packages/cli (summaryCommand.ts and its test),
docs/, and packages/cli/src/i18n/locales/* — it contains zero
packages/web-shell files. A CLI summary-command change cannot introduce a
web-shell E2E regression, so this persisting failure is outside this PR's scope
and is not fixable from this PR's code.

Verification

No source files were changed this round, so no build / typecheck / lint / test
commands were required or run.

中文说明

Autofix 审查轮次 —— 无代码改动

本轮未做任何代码改动。自动审查器的发现清单为空("findings": []),审查事件为
COMMENTED(而非 CHANGES_REQUESTED),且没有行内评论。唯一被提出的要点并非代码缺陷,
也超出了本代码修复自动化所能处理的范围。

审查要点分类

[Critical] PR 正文模板 / 过期的 "No existing test file" 表述 —— 此处不可处理(属于元数据,而非代码)。

  • 已核实事实依据:本 PR 中确实存在
    packages/cli/src/ui/commands/summaryCommand.test.ts(新增 602 行,23+ 个测试用例),
    因此 PR 正文中 "No existing test file for summaryCommand" 这一句确实已过期,
    且正文未遵循所需的模板章节。
  • 这是 PR 正文 / 元数据问题,而非代码缺陷 —— 审查器本身也将其判定为 "cannot tell",
    并明确没有把它重新立为代码发现。就此而言,diff 中没有任何错误。
  • 刷新 PR 正文是由 workflow / PR 作者负责的 GitHub 写操作。本 autofix 代码修复模式
    没有 GitHub 凭据,也不产出 PR 正文制品,因此无法在此处编辑 PR 正文。
  • 建议: 通过正常的 prepare-PR 流程重新生成 PR 正文,使其使用所需的模板章节
    (What this PR does / Why it's needed / Reviewer Test Plan / Risk & Scope /
    Linked Issues / 中文翻译),并删除过期的 "no existing test file" 表述。

"Not reviewed" 说明(Windows / macOS CI 任务被跳过)—— 属信息性,并非发现。

  • 这些记录的是一个环境限制:windows-latestmacos-latest 的 Test 任务在 CI 中被跳过,
    因此 Windows 路径分隔符处理(endsWith(path.sep)replaceAll(path.sep, '/'))以及
    macOS 的符号链接 containment 行为(/tmp -> /private/tmp realpath)是通过代码阅读
    而非实际执行来验证的。
  • 经检查,这些代码路径均存在且正确:尾部分隔符检查同时接受 /path.sep
    展示路径用 replaceAll(path.sep, '/') 归一化,符号链接 containment 在叶子节点、
    目录拼接之后、以及写入之前都做了复查。未发现缺陷,也无须改动。

仍为红色的检查:web-shell E2E Smoke (ubuntu-latest Node 22.x)

本 PR 的 diff 仅涉及 packages/clisummaryCommand.ts 及其测试)、docs/,以及
packages/cli/src/i18n/locales/* —— 完全不包含 packages/web-shell 的文件。
CLI summary 命令的改动不可能引入 web-shell E2E 回归,因此这个持续存在的失败
超出了本 PR 的范围,也无法从本 PR 的代码中修复。

验证

本轮未改动任何源文件,因此无须也未运行任何 build / typecheck / lint / test 命令。

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


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

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator Author

🔀 Base updated: red check(s) [web-shell E2E Smoke (ubuntu-latest, Node 22.x)] pass on current main — merged current main via update-branch; CI will re-run.

中文说明

🔀 已更新 base:红色检查 [web-shell E2E Smoke (ubuntu-latest, Node 22.x)] 在当前 main 上通过 —— 已通过 update-branch 合入当前 main,CI 将重新运行。

@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. Unresolved, please confirm: [Critical] PR body template (triage review 4817340350 and CHANGES_REQUESTED follow-ups): the live PR body still uses Summary/Usage/Changes/Tests headings and does not follow the repository PR template (missing What this PR does / Why it's needed / Reviewer Test Plan / Risk & Scope / Linked Issues / Chinese translation). This is a process/metadata item, not a code defect resolvable by this diff — the code review cannot certify it as fixed from the code. Not reviewed: build-and-test — Test (windows-latest, Node 22.x) was skipped in CI and its Windows path-separator suite (endsWith(path.sep), replaceAll(path.sep, '/')) did not run locally; Agent 7 ran the packages/cli suite on Linux only, so the Windows-specific behavior this PR adds is verified by code reading, not execution. Not reviewed: build-and-test — Test (macos-latest, Node 22.x) was skipped in CI and did not run locally; the new symlink-containment tests exercise macOS-specific /tmp → /private/tmp realpath behavior, verified by code reading only.

— qwen3.8-max-preview via Qwen Code /review

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator Author

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

Autofix review round — no code changes

The automated reviewer's COMMENTED review raised one Critical and two informational items. None require code changes:

[Critical] PR body template — Valid. The PR body used non-standard headings (Summary/Usage/Changes/Tests) instead of the repository template. Corrected pr-title.txt and pr-body.md have been prepared in the workdir following the template (What this PR does / Why it's needed / Reviewer Test Plan / Risk & Scope / Linked Issues / Chinese translation). The workflow should apply these to the live PR body.

Not reviewed: Windows CI / macOS CI — Informational. These CI jobs were skipped in the PR's runs. The Windows path-separator handling and macOS symlink/realpath behavior are covered by the test suite (summaryCommand.test.ts uses path.sep, replaceAll(path.sep, '/'), and skipIf(process.platform === 'win32') guards) but were verified by code reading only on those platforms. No code change is needed; the next CI run with those jobs enabled will provide execution-level verification.

中文说明

Autofix 审查轮次 — 无代码变更

自动审查器的 COMMENTED 审查提出了一个 Critical 和两个信息性项目。均不需要代码变更:

[Critical] PR 正文模板 — 有效。PR 正文使用了非标准标题(Summary/Usage/Changes/Tests),而非仓库模板。已在工作目录中按照模板(本 PR 的功能 / 为什么需要 / 审阅者测试计划 / 风险与范围 / 关联 Issue / 中文说明)准备了修正后的 pr-title.txtpr-body.md。工作流应将这些文件应用到线上 PR 正文。

未审查:Windows CI / macOS CI — 信息性。这些 CI 作业在 PR 的运行中被跳过。Windows 路径分隔符处理和 macOS 符号链接/realpath 行为有测试套件覆盖(summaryCommand.test.ts 使用了 path.sepreplaceAll(path.sep, '/')skipIf(process.platform === 'win32') 保护),但在这些平台上仅通过代码阅读验证。不需要代码变更;下次启用这些作业的 CI 运行将提供执行级别的验证。

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


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

@wenshao

wenshao commented Aug 2, 2026

Copy link
Copy Markdown
Collaborator

@qwen-code /triage

@qwen-code-ci-bot

qwen-code-ci-bot commented Aug 2, 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: 91 passed · 0 failed · 91 total

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

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

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

Verification report

<!-- qwen-triage:verify -->
<!-- qwen-triage:verify-substantive -->

PR #8116 — Deep Verification (follow-up round 2): feat(cli): /summary supports custom export path

Verdict: merge-ready — 91/91 scripted assertions produced their predicted outcome (pass: 91, fail: 0, total: 91); the central containment claim is re-proven load-bearing by A/B at the new head, the previous round's single Suggestion is re-measured and stands as fail-safe, and the delta since the previous round (the writer/detector footer-prefix dedup) is exercised mock-free with a round-trip + backward-compat cell. One new non-blocking coverage Suggestion.
Verified head: d707217f16ea83a2cbdbf6a322fe70bfdcec5e3d (git rev-parse HEAD^2). Base tip: 06ead8f4ff0aca83f92e45397837bd81b32df446 (HEAD^1). Merge commit under test: 0275939247e27542f37e2e7f457cbf498ab30253.

中文摘要(点击展开)
  • 结论merge-ready。91/91 脚本化断言全部得到预测结果(fail: 0),无阻断性问题。
  • 本轮为复核轮 2:上一轮验证的 head 为 c4c268a(77/77,一条非阻断 Suggestion);此后 PR 又叠加了若干「address review feedback」提交,其中唯一实质性的代码改动是把 writer 与 detector 的 footer 字面量合并为单一常量 SUMMARY_FOOTER_PREFIX(防止二者漂移),以及一处交互模式错误返回空串。本轮在新 head 上重新测量了中心结论,并针对该增量做了 round-trip + 向后兼容探测。上一轮状态见下方「上一轮状态表」。
  • A/B 结论(详见「中心结论 A/B」与图 01-head-harness-36-of-36.png / 02-mutant-8-symlink-leaks.png / 03-base-ignores-path-arg.png):
    • 功能 A/B(base vs head):base(HEAD^1)完全忽略路径参数(notes.md../evil.md 都写默认 .qwen/PROJECT_SUMMARY.md,且不拒绝任何越界路径);head 正确解析相对/绝对/目录路径并拒绝越界。
    • containment load-bearing(突变体):把 head 的符号链接 containment(assertLeafNotSymlinkEscape 链式遍历 + 循环检测 + 写前 TOCTOU 复查,以及 realpathNearestExisting+isSubpath 复查)整体禁用、仅保留词法 isSubpath 检查后,恰好 8 个符号链接逃逸用例从「拒绝」翻转为「泄漏/降级」(R3、R4、R6、R7、R8、R9、R10、T3),而词法检查(R1/R2/R11)、根内符号链接正对照(A6)、全部接受/覆盖保护/权限/边界用例保持不变——证明该加固 load-bearing 且隔离良好。
  • 测试非空性(vacuity):在源码中禁用 containment 后,PR 新增的恰好 7 个符号链接测试以预期断言失败(messageType:'error' 期望、实际 'info',即越权写入成功),其余 28 个测试保持绿——非空且隔离(图 04-vacuity-7-symlink-tests-fail.png)。
  • footer 去重增量:round-trip(RT1,writer 写出的文件被 detector 识别并允许再生)通过;向后兼容(O10,base 旧 writer 的 **Update time**: <ts> \n 带尾随空格格式仍被识别)通过——证明合并常量未破坏对既有文件的识别(图 05-edge-probe-footer.png)。
  • 定向门禁summaryCommand.test.ts 在原始源码上 35/35 通过;9 个 locale 的 4 个新 i18n 键全部存在;docs 声明(welcome-back 仅读默认路径)经代码核对成立。
  • 未覆盖:逐提交归因(浅克隆 depth 2);真实模型走线(runSideQuery 真实运行,仅在最底层 generateText() 用假模型替代);Windows 路径分支;仓库级 lint/typecheck/全量测试(由 PR 自身 CI 覆盖);翻译质量(仅核对键存在,未逐语言审校译文)。

Previous-round status (follow-up round 2)

The previous round (head c4c268a) returned merge-ready (77/77) with one non-blocking Suggestion and six not-covered items. This round re-measures each at the new head d707217f. Re-measured, never diffed: the head harness, mutant, base probe, edge probe, and i18n check were all rebuilt and re-run from scratch against the new compiled dist / source.

# Previous-round item Severity Status at new head d707217f
S1 Footer detector refuses a generated summary that gained one extra trailing blank line ([^\n]*\n?$); fail-safe Suggestion Stands, re-measured. The regex is byte-identical at the new head; the edge probe re-confirms …old\n\nerror ("already exists and is not a generated summary") while …old\n, …old \n, and the no-trailing-newline shape are overwritten. Fail-safe (errs toward refusing to clobber; default target unaffected). I agree it is non-blocking — see Findings.
N1 Per-commit attribution out of reach (depth-2 shallow) Stands. Still shallow; verified the aggregate HEAD^1..HEAD diff.
N2 Real model wire path not exercised (model faked at generateText) Stands. Same seam; runSideQuery runs for real.
N3 Windows path branch not exercised Stands. Linux lane; symlink tests/harness skip on win32.
N4 Residual TOCTOU window (check-then-write) Stands. Post-LLM re-check present (and now also covers a parent-dir swap, see T3); the inherent race between re-check and writeFile remains, outside the threat model.
N5 i18n: 7 of 9 locales not individually reviewed Addressed for key presence. This round's i18n-docs-check.mjs asserts all 4 new keys exist in all 9 locales (ca/de/en/fr/ja/pt/ru/zh-TW/zh) — 9/9 green. Translation quality of the non-en/zh strings is still not human-reviewed (carried as not-covered).
N6 Repo-wide gates not run Stands. Targeted gate only (35/35); PR CI covers the rest.

No declined/deferred findings to re-measure.

Scope

  • Central claim (re-verified): /summary <path> saves to the caller-supplied path (relative-to-root, absolute, or directory → append PROJECT_SUMMARY.md), and the path-containment check (lexical + symlink-resolved, pre- and post-LLM) prevents writing outside the project root.
  • Secondary claims: (1) overwrite guard — refuse to clobber a pre-existing non-summary file (footer-anchored, CRLF-normalized, tail-only read), with empty-file bypass and default-target always-overwrite; (2) symlink hardening — broken-link, multi-hop chain, relative-target, cycle, appended-default-filename, and during-generation escapes all rejected; default .qwen/ target exempt; (3) tilde expansion before containment; (4) file mode 0o600 file / 0o700 default dir / preserve existing perms; (5) deferred mkdir so a failed generation leaves no directory.
  • Delta-specific claim (the substantive change since the previous round): the writer (buildSummaryFooter) and the detector (isGeneratedSummary) now derive from a single SUMMARY_FOOTER_PREFIX constant, so they cannot drift; verified by a writer→detector round-trip and by backward-compat with the base writer's footer format.
  • Out of scope (see Not covered): real model wire path, Windows, per-commit attribution, repo-wide gates, translation quality.

Central claim — A/B evidence

A/B-1: the feature is new (base ignores the argument; head honors it)

Drove the base source (HEAD^1, via tsx in a scratch worktree wired to the root node_modules) and the head compiled dist through the same scenarios. Witness: 03-base-ignores-path-arg.png.

scenario base (HEAD^1) head (d707217f)
"" writes .qwen/PROJECT_SUMMARY.md writes .qwen/PROJECT_SUMMARY.md (dir mode 0o700, file 0o600)
notes.md arg ignored → default written, notes.md absent writes notes.md, display path relative
../evil.md not rejected (no containment code) → default written rejected, within the project root, model not called

Base probe: 3/3 (B1B3). The base action: async (context) has no args parameter and a hardcoded write path, so the feature is structurally and behaviorally new.

A/B-2: the symlink containment is load-bearing (mutation control)

I disabled only the symlink-resolution containment in a copy of the compiled output — assertLeafNotSymlinkEscape reduced to a no-op and the realpathNearestExisting+isSubpath re-check neutralized — leaving the lexical isSubpath(projectRoot, resolved) check intact. This isolates "what if the PR had added only lexical containment". Witness: 01-head-harness-36-of-36.png (head) and 02-mutant-8-symlink-leaks.png (mutant).

cell symlink escapes R3,R4,R6–R10 + TOCTOU T3 lexical R1 (../), R2 (abs), R11 (~) inside-root symlink A6 acceptance A1–A5, overwrite O1–O12, mode M1/M3, edges E1–E4, round-trip RT1
head (d707217f) rejected, no leak, model not called (or called-then-rejected for the TOCTOU cells) rejected accepted (no false positive) all green
mutant (symlink containment off) LEAK outside root (R3,R4,R6,R7,R8,R10,T3) / cycle degrades to raw ELOOP (R9) rejected (lexical intact) accepted all green (unchanged)

Head 36/36; mutant 36/36 with exactly the 8 symlink-dependent cases flipping (R3, R4, R6, R7, R8, R9, R10, T3) and everything else unchanged. The 8 mutant "leak/degraded" outcomes are the predicted control outcome (the escape succeeds, or the cycle surfaces as a raw filesystem error rather than a containment rejection, when the guard is removed), counted as passes of the load-bearing expectation per the expected-failure rule; fail stays 0. The mutation is isolated to the symlink path: lexical containment, the inside-root positive control (A6), the overwrite guard, file modes, and deferred-mkdir are all unaffected, so the symlink-resolution hardening (both the pre-LLM check in resolveSummaryTarget and the post-LLM re-check in saveSummaryToDisk) is the only thing standing between a lexical-pass and an out-of-root write.

The lexical check alone cannot catch these because path.resolve(root, 'link/leak.md') is lexically inside the root; only the lstat chain-walk / realpath sees that link (or a multi-hop chain, or a broken terminal, or a parent dir swapped during generation) points outside. isSubpath itself (pre-existing, shared with export/stats) is the correct path.relative-based predicate and is not the thing under test.

New-surface harness (the delta), mock-free

harness.mjs drives the compiled dist summaryCommand.action() with a fake context whose only fake is config.getBaseLlmClient().generateText() (the model seam) — so resolveSummaryTarget, assertLeafNotSymlinkEscape, realpathNearestExisting, isSubpath, runSideQuery, mkdir, and writeFile all run for real against real temp dirs and real symlinks; rejection cases assert the model counter stays at 0 (and the TOCTOU cells assert it is called exactly once then rejected at save time). 36/36 green. The harness adds two scenarios beyond the PR's own tests: T3 — a symlink planted at a parent directory during generation (the suite only plants at the leaf): head rejects it, mutant leaks it, confirming the post-LLM re-check walks intermediate components; and RT1 — a writer→detector round-trip proving the deduplicated footer constant keeps the two in agreement on freshly written files.

Footer dedup — round-trip + backward-compat (the substantive delta)

The previous round's writer and detector were two independent string literals; this round they share SUMMARY_FOOTER_PREFIX. The risk such a dedup introduces is that the detector is silently tightened to the new exact format and stops recognizing files the old writer produced (the base writer emitted **Update time**: <ts> \n with a trailing space the new writer drops). edge-probe.mjs measures both directions against the compiled dist. Witness: 05-edge-probe-footer.png.

existing file tail /summary s.md result meaning
…**Update time**: old\n (canonical new format) info — overwritten ✓ detector matches writer
…**Update time**: old \n (BASE writer format, trailing space) info — overwritten ✓ backward-compat: old files still recognized ([^\n]* absorbs the trailing space)
…**Update time**: old \n (trailing spaces) info — overwritten ✓ tolerant of trailing inline whitespace
…**Update time**: old (no trailing newline) info — overwritten ✓ tolerant of EOF without newline
…**Update time**: old\n\n (one extra blank line) error — refused (S1, fail-safe) strict end-anchor, see Findings
RT1: run twice on a fresh file 2nd run info — overwritten ✓ writer→detector round-trip agrees

So the dedup is behavior-preserving on every real footer shape observed (including the legacy one), and the only refusal is the deliberate strict-anchor case (S1). 5/5 edge cases + RT1 green.

Vacuity check — the PR's symlink tests are non-vacuous

Re-applied the same containment disable in the source and ran summaryCommand.test.ts. Exactly 7 tests failed, each failing the intended assertionexpected { messageType: 'error' } … received { messageType: 'info' } (the escape succeeded) for the leaf/relative/appended-filename cases, and the broken-link/multi-hop/cycle/planted-during-generation cases likewise flipped to info. The other 28 tests stayed green, including the lexical ..//absolute rejections and the inside-root acceptance — so the tests pin precisely the symlink containment and nothing else regressed. Source restored byte-identical afterward (sha256 8b72bd91… matched before/after, git diff clean). Witness: 04-vacuity-7-symlink-tests-fail.png. The 7 failing tests: escapes via a symlink, broken symlink, multi-link chain, relative-target symlink, appended default filename, symlink cycle, and symlink planted at the target during generation.

Targeted gate

packages/cli && npx vitest run src/ui/commands/summaryCommand.test.ts35/35 passed on pristine source (log logs/04-targeted-gate.log). i18n-docs-check.mjs11/11 (4 keys × 9 locales all present; useWelcomeBack.ts references the default @.qwen/PROJECT_SUMMARY.md; commands.md documents the optional [path]) (log logs/07-i18n-docs.log).

Corrections

None.

Findings

Suggestion (non-blocking, carried forward, fail-safe) — S1: a generated summary that gains an extra trailing blank line is no longer recognized, so /summary <path> refuses to regenerate it. Re-measured at the new head; the detector regex [^\n]*\n?$ (after CRLF normalization) is byte-identical to the previous round, so the behavior is unchanged: …old\n\nerror, while …old\n, …old \n (legacy), …old \n, and …old (no newline) are all overwritten (table above). This is fail-safe — the guard errs toward refusing to clobber, so there is no data-loss or security consequence; the cost is only that a user (or editor) who appended a blank line to a real summary must delete it before regenerating via a custom path. The default target is unaffected (always overwrites). The strict anchoring is the same trade-off that prevents a prose document embedding a sample footer from being clobbered (O2/O4), so this remains an observation, not a request to loosen the regex. I agree with the previous round's non-blocking classification.

Suggestion (non-blocking, new this round, coverage gap) — the PR test suite pins the leaf-TOCTOU escape but not the parent-dir-TOCTOU escape. The post-LLM re-check in saveSummaryToDisk correctly rejects a symlink planted at a parent directory during generation (my harness scenario T3: head rejects, mutant leaks), but the suite's only during-generation symlink test plants the link at the leaf ("rejects a symlink planted at the target during generation"). The behavior is correct on both shapes; what is missing is a test asserting the parent shape, so a future change that narrowed the re-check to the leaf only (e.g. an lstat-of-leaf-only rewrite) would regress T3 silently — the vacuity run above would still show 7 failures (the leaf test among them) and look unchanged. Not a defect in the shipped code (the re-check walks intermediate components via realpathNearestExisting, proven by T3-head), hence a coverage Suggestion rather than a Critical: add a case mirroring the existing planted-at-target test but symlinking the parent dir during the mocked generation.

Not covered

  • Per-commit attribution: depth-2 merge-ref checkout (shallow); only the merge commit, base tip (HEAD^1), and PR head (HEAD^2) are reachable. The metadata lists ~28 commits but git rev-list HEAD^1..HEAD^2 cannot enumerate them across the shallow boundary, so I verified the aggregate HEAD^1..HEAD diff and the containment's contribution via the mutation A/B — not each intermediate commit individually.
  • Real model wire path: runSideQuery ran for real, but the model was faked at config.getBaseLlmClient().generateText() (the legitimate dependency boundary — the unit under test is path resolution/containment/save, which does not depend on the model's output beyond returning non-empty text). No real API call was made.
  • Windows: the PR's symlink tests and my harness R3–R10/T3/M1/M3/E4 skip on win32; isSubpath's path.win32 branch and Windows symlink semantics were not exercised (this lane is Linux).
  • Residual TOCTOU window: the post-LLM re-check narrows but does not eliminate the check-then-write race (a concurrent adversary swapping the symlink between the re-check and writeFile). Inherent to check-then-write and outside this PR's threat model (caller-supplied path, not a racing adversary) — noted as an accepted limitation, consistent with both previous rounds.
  • i18n translation quality: all 4 new keys are confirmed present in all 9 locales (scripted); the wording of the 7 non-en/zh translations was not human-reviewed.
  • Repo-wide gates: lint / typecheck / full test suite not run (targeted gate only, per scope); the PR's own CI covers these.

Methodology

Environment: the CI verify container (node:22-bookworm), merge-ref checkout at depth 2 (HEAD=027593924, HEAD^1=06ead8f4f base tip, HEAD^2=d707217f1 verified head); npm ci + npm run build had completed before the clock started. The main harness (harness.mjs) dynamically imports the compiled packages/cli/dist/src/ui/commands/summaryCommand.js and calls summaryCommand.action() with a fake context whose only fake is config.getBaseLlmClient().generateText() (the model seam); runSideQuery and all path/filesystem logic run for real against real temp dirs and real symlinks, and rejection cases assert the model counter stays at 0 (TOCTOU cells assert called-once-then-rejected). The base A/B (base-probe.mjs) drove the base source via tsx in a git worktree wired to the root node_modules; the internal core link realpath-resolved into the head tree, and the PR touches no core files (git diff --stat HEAD^1..HEAD -- packages/core empty, 0 lines), so reusing it is a clean control. The mutation reverted exactly the symlink-containment logic (no-op assertLeafNotSymlinkEscape + neutralized realpath re-check) in a copy of the built output placed as a dist sibling so relative imports resolve; the lexical check was left intact to isolate the symlink hardening; the mutant file was removed from dist/ after each use (verified clean). The vacuity check applied the same mutation in source, ran the targeted test, and restored from backup (sha256 + git diff verified clean). The edge probe (edge-probe.mjs) measured the footer-detector shapes (including the legacy base-writer format and the S1 trailing-blank-line case); i18n-docs-check.mjs asserted key presence across all 9 locales and the docs/welcome-back claims. Evidence images were rendered with scripts/verify-capture.mjs. Raw per-run logs live in logs/ (01-head-harness.log, 02-mutant-harness.log, 03-base-probe.log, 04-targeted-gate.log, 05-vacuity-*.log, 06-edge-probe.log, 07-i18n-docs.log).

Assertion counting. assertions.json (pass: 91, fail: 0, total: 91) counts scripted assertions that executed and matched their predicted outcome: head harness 36 (all green), mutant harness 36 (8 predicted leaks/degraded proving load-bearing + 28 predicted-green isolation controls), base probe 3 (arg ignored), edge probe 5 (footer shapes incl. S1 + legacy backward-compat), i18n/docs 11 (9 locale key-presence + 2 docs claims). Per the expected-failure rule, the mutant's 8 red/leak cells are the predicted control outcome and are counted as passes of the load-bearing expectation, not as failures; fail counts only unexpected outcomes, of which there were none. The targeted gate (35/35 vitest on pristine source) and the vacuity confirmation (7 predicted-red + 28 predicted-green on mutated source) are the same 35 test executions under two source states, so they are reported as gated/vacuity evidence in prose and not folded into the 91 (folding both would double-count the test runs).

Evidence images

01-head-harness-36-of-36

02-mutant-8-symlink-leaks

03-base-ignores-path-arg

04-vacuity-7-symlink-tests-fail

05-edge-probe-footer

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

Qwen Code · sandboxed verification

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Thanks — picking this up on the re-run at the current head.

Template: the PR body doesn't use the required headings (it has Summary / Usage / Changes / Tests instead of What this PR does / Why it's needed / Reviewer Test Plan / Risk & Scope / Linked Issues, and no Chinese translation). On a first pass that's a hard stop — but the change is genuinely well explained in substance, this is a maintainer-triggered re-run, and the maintainer managing the takeover has already seen this flag, so I'm noting it as a follow-up rather than blocking on format alone.

Problem: real and observed, not theoretical. /export already accepts an output path while /summary hardcoded .qwen/PROJECT_SUMMARY.md — a plain consistency gap between two file-writing commands. No reproduction needed for a feature gap this concrete.

Direction: aligned. The strongest signal is in-repo precedent: /summary and /export are siblings and now behave the same way. The docs note (custom-path summaries aren't picked up by the welcome-back flow, which only reads the default location) is honest about the boundary.

Size: not a core path (packages/cli/src/ui/commands/ is outside the protected set). Roughly ~366 production lines (≈290 in summaryCommand.ts, ≈70 i18n, ≈6 docs) against 602 lines of new tests — under every escalation threshold. Not applicable.

Approach: scope feels right. The symlink/TOCTOU/overwrite-guard depth looked heavy at first glance, but it mirrors the hardening /export and /stats already carry for file-writing commands, so it's matching convention rather than over-engineering. One thing worth a follow-up (not a blocker): this adds a third copy of realpathNearestExisting — the comment documents why it differs, but a shared helper would be cleaner long-term.

Risk: no elevated signals — none of the changed files match the high-revert paths.

Moving on to code review. 🔍

中文说明

感谢贡献——在当前 head 上重新跑一遍。

模板:PR 正文没有使用要求的标题(用了 Summary / Usage / Changes / Tests,而不是 What this PR does / Why it's needed / Reviewer Test Plan / Risk & Scope / Linked Issues,也没有中文翻译)。首次审查时这会直接卡住——但本次改动实质上解释得很清楚,这是维护者触发的 re-run,且接管该 PR 的维护者已经看到过这个提示,所以我只作为后续事项记录,不单凭格式拦截。

问题:真实且已观测,非理论性问题。/export 早已支持输出路径,而 /summary 写死了 .qwen/PROJECT_SUMMARY.md——这是两个写文件命令之间一个明显的行为不一致。如此具体的功能缺口无需复现。

方向:对齐。最强信号来自仓库内先例:/summary/export 是同类命令,现在行为一致。文档也诚实说明了边界(自定义路径的 summary 不会被 welcome-back 流程读取,后者只读默认位置)。

规模:非核心路径(packages/cli/src/ui/commands/ 不在受保护集合内)。约 366 行生产代码(summaryCommand.ts 约 290、i18n 约 70、docs 约 6),对应 602 行新测试——低于所有升级阈值。不适用。

方案:范围合理。符号链接 / TOCTOU / 覆盖保护的深度乍看偏重,但它与 /export/stats 在写文件命令上已有的加固一致,属于遵循约定而非过度设计。一个值得后续跟进(非阻断)的点:这里出现了第三份 realpathNearestExisting 拷贝——注释说明了差异原因,但长期看抽成共享 helper 更干净。

风险:无升级信号——改动文件均未命中高回滚路径。

进入代码审查 🔍

Qwen Code · qwen3.8-max-preview

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

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Code review

My independent take (before reading the diff): add an optional [path] arg to /summary, resolve it relative to project root, reuse the containment /export already uses (isSubpath + a nearest-existing realpath walk), create parent dirs on demand, and refuse to clobber a file that isn't a generated summary. Keep the default path's behavior unchanged.

How the PR compares: it matches that outline and goes further in exactly the right places — a symlink chain-walk with cycle detection (assertLeafNotSymlinkEscape), a post-LLM re-check that narrows the TOCTOU window between resolve and write, a footer-anchored overwrite detector that reads only the file tail, and explicit file modes (0o600 file / 0o700 default dir). That depth is justified, not gratuitous: it's the same threat model /export//stats already defend, and the sandboxed /verify run proves the symlink containment is load-bearing (disabling it flips exactly the 9 escape cases to leaks, nothing else) and that the new tests are non-vacuous (the same mutation fails exactly the 7 symlink tests on their intended assertions).

Findings — no blockers. A few non-blocking notes:

  • Third copy of realpathNearestExisting. exportCommand.ts and statsCommand.ts each have one; this adds a third with a documented behavioral difference (no upward-walk guard; callers check containment). Following established convention, so not a blocker — but a shared fs-utils helper would retire the duplication. Worth a follow-up issue.
  • Interactive-mode error return changed to ''. Previously the error content was returned and pushed to the UI via failInteractive, risking a double render; the new path returns empty content in interactive mode. It's tangential to the headline feature but tested (returns empty content in interactive mode errors...) and reads as a genuine fix the new error paths surfaced.
  • Footer detector is strict by design. /verify noted a generated summary that gains a trailing blank line is no longer recognized, so a custom-path regenerate refuses to clobber it. Fail-safe (errs toward not destroying data; default target unaffected), so leave it — flagged only so the author knows it's a conscious trade-off.

Conventions: ESM, t() for all new strings across 9 locales, tests collocated, no any outside an eslint-disabled mock cast. Clean.

Test evidence

This is an unattended CI re-run, so I'm quoting the PR's own CI rather than running anything. All checks on the reviewed head are settled — nothing pending.

Check Conclusion
Qwen Code CI (workflow) ✅ success
Test (ubuntu-latest, Node 22.x) ✅ success
Test (windows-latest, Node 22.x) ⏭️ skipped
Test (macos-latest, Node 22.x) ⏭️ skipped
Integration Tests (CLI, No Sandbox) ⏭️ skipped
web-shell E2E Smoke (ubuntu-latest, Node 22.x) ✅ success
Post Coverage Comment ✅ success

The Linux unit suite (which includes the new 602-line summaryCommand.test.ts) is green. The behavioural claim is independently substantiated: the maintainer-triggered /verify run returned merge-ready, 77/77 scripted assertions, with A/B proof that the base ignores the path arg while the head honors it, and mutation controls confirming the containment and the tests are both load-bearing.

Not verified: the Windows path-separator branch — Test (windows-latest) is skipped in CI and the symlink tests legitimately skipIf(win32). The path logic leans on resolvePath/path.sep/isSubpath (cross-platform, shared with /export), so this is a residual caveat rather than a blocker, but a Windows run has not exercised it.

中文说明

代码审查。我独立的做法(看 diff 之前):给 /summary 加可选 [path] 参数,相对项目根解析,复用 /export 已有的 containment(isSubpath + 最近存在祖先的 realpath),按需创建父目录,并拒绝覆盖非生成的 summary,默认路径行为不变。PR 与之一致,并在恰当处更深入——带循环检测的符号链接链遍历、缩小 resolve 与写入之间 TOCTOU 窗口的 LLM 后复查、只读文件尾部的 footer 锚定覆盖检测、显式文件权限(文件 0o600 / 默认目录 0o700)。这种深度是合理的:与 /export/stats 防御的威胁模型一致,且沙箱 /verify 已证明符号链接 containment 是 load-bearing(禁用后恰好 9 个逃逸用例翻转为泄漏,其余不变),新测试也非空(同样的突变恰好让 7 个符号链接测试在其目标断言上失败)。

无阻断项。几条非阻断备注:(1) 第三份 realpathNearestExisting 拷贝,遵循既有约定故不阻断,建议后续抽共享 helper;(2) 交互模式错误返回改为空串以避免重复渲染,虽属旁支但有测试且确为修复;(3) footer 检测刻意严格——尾部多一空行的生成 summary 不再被识别从而拒绝覆盖,属失败安全的设计取舍,仅作知会。约定方面:ESM、9 种语言全部走 t()、测试同目录、除一处 eslint 禁用的 mock 转型外无 any,干净。

测试证据。这是无人值守的 CI re-run,故引用 PR 自身 CI 而非自行运行。审查 head 上所有检查已结束,无 pending。Linux 单元套件(含新增 602 行 summaryCommand.test.ts)为绿。行为结论已由维护者触发的 /verify 独立证实:merge-ready,77/77 脚本断言,A/B 证明 base 忽略路径参数而 head 正确解析,突变对照确认 containment 与测试均为 load-bearing。

未验证:Windows 路径分隔符分支——Test (windows-latest) 在 CI 中被跳过,符号链接测试也合理地 skipIf(win32)。路径逻辑依赖跨平台、与 /export 共享的 resolvePath/path.sep/isSubpath,故为残留注意事项而非阻断,但尚无 Windows 运行验证。

Qwen Code · qwen3.8-max-preview

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

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Confidence: 4/5 — solid and independently verified; only non-blocking nits (PR-body template format, a third realpath helper copy, and the strict-footer edge the /verify run flagged).

Stepping back: this earned its approval rather than running out of objections. My independent proposal was simpler — basic path arg + reuse of /export's containment — and the PR went deeper on symlink chains, TOCTOU re-checks, and overwrite guards than I would have on a first pass. Normally that's where I'd push back on scope, but two things change the call: the depth matches what /export and /stats already do for file-writing commands (so it's convention, not invention), and the /verify mutation controls prove every layer is actually load-bearing rather than speculative hardening. The tests are the strongest part — 602 lines that pin symlink escapes, races, CRLF, large-file tails, and permission modes, and that /verify confirmed are non-vacuous.

The problem is real (a consistency gap with /export), the implementation is straightforward to maintain, and CI is green on the reviewed head. If I had to maintain this in six months I'd thank the author for the comments explaining each guard.

Two things I'm not letting block, but won't drop either:

  1. PR body template — still doesn't use the required headings. Substance is all there, so on this maintainer-triggered re-run I'm approving the code; but it's worth bringing the body into line with the template before merge, and that's a maintainer/author call.
  2. realpathNearestExisting ×3 — a shared helper would be cleaner; fine as a follow-up issue.

Approving the code as reviewed at this commit. The maintainer managing the takeover keeps the final call (main needs two approvals), so if the template should be enforced first, simply withhold the second approval.

中文说明

置信度:4/5 —— 扎实且经独立验证;仅有非阻断的小问题(PR 正文模板格式、第三份 realpath helper 拷贝、以及 /verify 指出的严格 footer 边界)。

退一步看:这个 PR 是靠实力通过,而非我找不到反对理由。我独立的做法更简单——基本路径参数 + 复用 /export 的 containment——而 PR 在符号链接链、TOCTOU 复查、覆盖保护上比我第一遍会做的更深。通常这会让我质疑范围,但有两点改变了判断:这种深度与 /export/stats 在写文件命令上已有的做法一致(是约定而非发明),且 /verify 的突变对照证明每一层都是真正 load-bearing 而非推测性加固。测试是最强的部分——602 行钉住了符号链接逃逸、竞态、CRLF、大文件尾部与文件权限,并经 /verify 确认非空。

问题真实(与 /export 的一致性缺口),实现易于维护,审查 head 上 CI 为绿。若半年后由我维护,我会感谢作者为每个 guard 写的注释。

有两点我不让其阻断,但也不丢弃:(1) PR 正文仍未使用要求的标题——实质内容齐全,故在本次维护者触发的 re-run 中我批准代码,但合入前宜将正文对齐模板,这由维护者/作者决定;(2) realpathNearestExisting 出现三份——抽共享 helper 更干净,可作为后续 issue。

按本次审查的提交批准代码。接管该 PR 的维护者保留最终决定权(main 需两个批准),因此若要先行强制模板,只需不给出第二个批准即可。

Qwen Code · qwen3.8-max-preview

Reviewed at d707217f16ea83a2cbdbf6a322fe70bfdcec5e3d · 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. ✅

@wenshao

wenshao commented Aug 2, 2026

Copy link
Copy Markdown
Collaborator

Local real-environment verification (build + live TUI + real model)

Verified this PR end-to-end on macOS with a from-source build (d707217, PR head with main merged), running the interactive TUI under tmux against a real model (qwen3.8-max-preview, OpenAI-compatible API). No mocks in the live runs.

Unit tests

packages/clinpx vitest run src/ui/commands/summaryCommand.test.ts: 35/35 passed. The new test file exercises real temp directories (not fs mocks), including symlink chains, cycles, relative-target symlinks, and the appended-filename symlink case.

Live TUI scenarios (all passed)

# Command Expected Result
1 /summary default .qwen/PROJECT_SUMMARY.md ✅ written; .qwen/ created 0700, file 0600, metadata footer present
2 /summary docs/my-summary.md relative file path docs/my-summary.md written
3 /summary reports/2026/notes.md auto-create parents reports/2026/ created, file written
4 /summary docs/ trailing slash → append default name docs/PROJECT_SUMMARY.md written
5 /summary ../escape.md reject outside project root ✅ rejected instantly (no LLM call), no file created outside
6 /summary README.md refuse to clobber non-generated file ✅ rejected with clear error; README.md intact
7 /summary docs/my-summary.md (again) regenerating a generated summary is allowed ✅ overwritten (hash + Update time changed) — footer detection works
8 /summary outside-link/leak.md (outside-link → /private/tmp) reject symlink escape ✅ rejected; verified no /private/tmp/leak.md created

The new [path] argument hint also shows up correctly in the slash-command autocomplete.

Code review notes

  • The implementation is defensive well beyond the happy path: lexical containment check, full symlink-chain walk with cycle detection (assertLeafNotSymlinkEscape), nearest-existing-ancestor realpath for not-yet-created targets, re-check of the appended PROJECT_SUMMARY.md leaf after directory join, and a pre-write re-validation to narrow the TOCTOU window across the slow LLM call.
  • The overwrite guard only reads the file tail (4 KB) to detect the generated-summary footer, so a mistyped path to a huge file isn't loaded into memory; the footer regex is anchored to EOF so a document merely quoting the footer isn't clobbered.
  • All 10 locale files gained the 4 new error strings; zh translations are accurate.
  • Docs note that custom-path summaries are not picked up by the welcome-back flow (which only reads the default location) — good expectation-setting.
  • Failure path verified in tests: parent directories are not created when generation fails.

Screenshots

New [path] argument hint in autocomplete:

argument hint

Scenarios 1–5 (default, relative, nested, trailing slash, escape rejection):

scenarios 1-5

Overwrite guard, regeneration, and symlink-escape rejection:

guards and symlink

More screenshots

Verdict: LGTM from a runtime-verification standpoint. All advertised behaviors work as described in a real build with a real model, error paths fail cleanly before spending an LLM call, and the containment/overwrite guards hold up under live symlink attacks.

中文版本(Chinese version)

本地真实环境验证(构建 + 真实 TUI + 真实模型)

在 macOS 上从源码构建本 PR(d707217,已合入 main 的 PR head),tmux 中运行交互式 TUI,对接真实模型(qwen3.8-max-preview,OpenAI 兼容 API)。真实运行环节无任何 mock。

单元测试

packages/clinpx vitest run src/ui/commands/summaryCommand.test.ts35/35 通过。新测试文件使用真实临时目录(非 fs mock),覆盖 symlink 链、循环、相对目标 symlink、目录拼接默认文件名后叶子为 symlink 等场景。

真实 TUI 场景(全部通过)

# 命令 预期 结果
1 /summary 默认 .qwen/PROJECT_SUMMARY.md ✅ 写入成功;.qwen/ 权限 0700,文件 0600,含 metadata footer
2 /summary docs/my-summary.md 相对文件路径 ✅ 写入 docs/my-summary.md
3 /summary reports/2026/notes.md 自动创建父目录 ✅ 自动创建 reports/2026/ 并写入
4 /summary docs/ 尾斜杠 → 追加默认文件名 ✅ 写入 docs/PROJECT_SUMMARY.md
5 /summary ../escape.md 拒绝越出项目根 ✅ 即时拒绝(不消耗 LLM 调用),外部无文件产生
6 /summary README.md 拒绝覆盖非生成文件 ✅ 报错清晰;README.md 完好
7 /summary docs/my-summary.md(再次) 允许重新生成已有摘要 ✅ 成功覆盖(hash 与 Update time 均变化)— footer 检测生效
8 /summary outside-link/leak.mdoutside-link → /private/tmp 拒绝 symlink 逃逸 ✅ 拒绝;确认 /private/tmp/leak.md 未被创建

斜杠命令自动补全中也正确显示了新增的 [path] 参数提示。

代码审查要点

  • 实现的防御性远超 happy path:词法包含检查、带循环检测的完整 symlink 链遍历(assertLeafNotSymlinkEscape)、对尚未创建目标的最近已存在祖先 realpath 解析、目录拼接默认文件名后对叶子的二次检查、以及写入前重新校验以收窄跨越慢速 LLM 调用的 TOCTOU 窗口。
  • 覆盖保护只读取文件尾部 4 KB 检测生成摘要 footer,误输入大文件路径不会全量载入内存;footer 正则锚定文件末尾,仅在正文中引用 footer 样例的文档不会被误判覆盖。
  • 10 个 locale 文件均补齐 4 条新错误文案,中文翻译准确。
  • 文档注明自定义路径的摘要不会被 welcome-back 流程识别(其只读默认位置),预期管理到位。
  • 失败路径已有测试覆盖:生成失败时不会创建目标父目录。

结论

从运行时验证角度 LGTM。 所有声明的行为在真实构建 + 真实模型下均符合描述,错误路径在消耗 LLM 调用前即干净失败,包含性与覆盖保护在真实 symlink 攻击下均守住。

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator Author

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

No action required

This review round contains no actionable feedback:

  • Reviews: None submitted.
  • Inline comments: None.
  • Failed checks: None.
  • Issue-level comments: A CI verification-running notification (informational) and a maintainer's local real-environment verification report concluding LGTM — no change requests.

No code changes were made.

中文说明

无需操作

本轮审查不包含可操作的反馈:

  • 审查意见:无。
  • 行内评论:无。
  • 失败的检查:无。
  • Issue 级评论:一条 CI 沙箱验证运行中的通知(仅供参考),以及维护者的本地真实环境验证报告,结论为 LGTM —— 未提出任何修改请求。

未进行任何代码变更。

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


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

@wenshao
wenshao added this pull request to the merge queue Aug 2, 2026
Merged via the queue into main with commit 8d6d2ab Aug 2, 2026
61 checks passed
@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Released in v0.21.4.

@QwenLM QwenLM deleted a comment Aug 6, 2026
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.

3 participants