@pencil-agent/nano-pencil 2.0.1 → 2.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (186) hide show
  1. package/README.md +267 -267
  2. package/dist/build-meta.json +3 -3
  3. package/dist/core/export-html/AGENT.md +11 -11
  4. package/dist/core/export-html/template.css +971 -971
  5. package/dist/core/export-html/template.html +54 -54
  6. package/dist/core/model/custom-providers.js +1 -1
  7. package/dist/core/model-registry.js +5 -5
  8. package/dist/extensions/builtin/AGENT.md +115 -115
  9. package/dist/extensions/builtin/browser/AGENT.md +17 -17
  10. package/dist/extensions/builtin/browser/agent-workspace/agent_helpers.py +12 -12
  11. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/amazon/product-search.md +198 -198
  12. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/archive-org/scraping.md +341 -341
  13. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/arxiv/scraping.md +311 -311
  14. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/arxiv-bulk/scraping.md +333 -333
  15. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/atlas/overview.md +70 -70
  16. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/booking-com/scraping.md +578 -578
  17. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/capterra/scraping.md +440 -440
  18. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/centilebrain/generate-estimates.md +110 -110
  19. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/coingecko/scraping.md +325 -325
  20. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/coinmarketcap/scraping.md +463 -463
  21. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/coursera/scraping.md +360 -360
  22. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/craigslist/scraping.md +390 -390
  23. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/crossref/scraping.md +568 -568
  24. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/dev-to/scraping.md +323 -323
  25. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/duckduckgo/scraping.md +349 -349
  26. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/ebay/scraping.md +435 -435
  27. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/etsy/scraping.md +506 -506
  28. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/eventbrite/scraping.md +363 -363
  29. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/expedia/automation.md +168 -168
  30. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/facebook/groups.md +236 -236
  31. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/facebook/pages.md +295 -295
  32. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/framer/editor.md +108 -108
  33. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/fred/scraping.md +493 -493
  34. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/g2/scraping.md +580 -580
  35. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/genius/scraping.md +511 -511
  36. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/github/repo-actions.md +65 -65
  37. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/github/scraping.md +184 -184
  38. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/glassdoor/scraping.md +543 -543
  39. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/gmail/compose.md +122 -122
  40. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/goodreads/scraping.md +461 -461
  41. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/gutenberg/scraping.md +383 -383
  42. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/hackernews/scraping.md +243 -243
  43. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/howlongtobeat/scraping.md +473 -473
  44. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/imdb/scraping.md +271 -271
  45. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/itch-io/scraping.md +436 -436
  46. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/job-boards/indeed-glassdoor.md +1021 -1021
  47. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/letterboxd/scraping.md +349 -349
  48. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/linkedin/invitation-manager.md +109 -109
  49. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/loom/folder-enumeration.md +170 -170
  50. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/macrotrends/scraping.md +537 -537
  51. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/medium/article-hydration.md +120 -120
  52. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/medium/scraping.md +414 -414
  53. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/metacritic/scraping.md +477 -477
  54. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/musicbrainz/scraping.md +478 -478
  55. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/nasa/scraping.md +339 -339
  56. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/news-aggregation/multi-source.md +205 -205
  57. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/open-library/scraping.md +472 -472
  58. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/openalex/scraping.md +470 -470
  59. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/openstreetmap/scraping.md +490 -490
  60. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/package-registries/npm-pypi.md +478 -478
  61. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/polymarket/scraping.md +234 -234
  62. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/producthunt/scraping.md +307 -307
  63. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/pubmed/scraping.md +421 -421
  64. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/quora/scraping.md +364 -364
  65. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/rawg/scraping.md +352 -352
  66. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/reddit/scraping.md +124 -124
  67. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/rest-countries/scraping.md +233 -233
  68. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/sec-edgar/scraping.md +361 -361
  69. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/shopify-admin/README.md +36 -36
  70. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/shopify-admin/embedded-apps.md +72 -72
  71. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/shopify-admin/knowledge-base.md +109 -109
  72. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/shopify-admin/polaris-inputs.md +137 -137
  73. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/soundcloud/scraping.md +362 -362
  74. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/spotify/scraping.md +339 -339
  75. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/stackoverflow/scraping.md +435 -435
  76. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/steam/scraping.md +575 -575
  77. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/substack/scraping.md +338 -338
  78. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/thetechgeeks/pricing.md +52 -52
  79. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/tiktok/upload.md +107 -107
  80. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/tradingview/scraping.md +309 -309
  81. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/trello/boards-and-lists.md +88 -88
  82. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/trustpilot/scraping.md +375 -375
  83. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/walmart/scraping.md +444 -444
  84. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/wayback-machine/scraping.md +306 -306
  85. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/weather/scraping.md +398 -398
  86. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/wellfound/scraping.md +596 -596
  87. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/world-bank/scraping.md +356 -356
  88. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/xiaohongshu/scraping.md +84 -84
  89. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/youtube/scraping.md +418 -418
  90. package/dist/extensions/builtin/browser/agent-workspace/domain-skills/zillow/scraping.md +433 -433
  91. package/dist/extensions/builtin/browser/browser.md +73 -73
  92. package/dist/extensions/builtin/browser/install.md +142 -142
  93. package/dist/extensions/builtin/browser/interaction-skills/connection.md +48 -48
  94. package/dist/extensions/builtin/browser/interaction-skills/cookies.md +3 -3
  95. package/dist/extensions/builtin/browser/interaction-skills/cross-origin-iframes.md +3 -3
  96. package/dist/extensions/builtin/browser/interaction-skills/dialogs.md +64 -64
  97. package/dist/extensions/builtin/browser/interaction-skills/downloads.md +3 -3
  98. package/dist/extensions/builtin/browser/interaction-skills/drag-and-drop.md +3 -3
  99. package/dist/extensions/builtin/browser/interaction-skills/dropdowns.md +3 -3
  100. package/dist/extensions/builtin/browser/interaction-skills/iframes.md +3 -3
  101. package/dist/extensions/builtin/browser/interaction-skills/network-requests.md +3 -3
  102. package/dist/extensions/builtin/browser/interaction-skills/print-as-pdf.md +3 -3
  103. package/dist/extensions/builtin/browser/interaction-skills/profile-sync.md +90 -90
  104. package/dist/extensions/builtin/browser/interaction-skills/screenshots.md +17 -17
  105. package/dist/extensions/builtin/browser/interaction-skills/scrolling.md +3 -3
  106. package/dist/extensions/builtin/browser/interaction-skills/shadow-dom.md +3 -3
  107. package/dist/extensions/builtin/browser/interaction-skills/tabs.md +69 -69
  108. package/dist/extensions/builtin/browser/interaction-skills/uploads.md +1 -1
  109. package/dist/extensions/builtin/browser/interaction-skills/viewport.md +3 -3
  110. package/dist/extensions/builtin/browser/src/browser_harness/AGENT.md +15 -15
  111. package/dist/extensions/builtin/browser/src/browser_harness/__init__.py +8 -8
  112. package/dist/extensions/builtin/browser/src/browser_harness/_ipc.py +90 -90
  113. package/dist/extensions/builtin/browser/src/browser_harness/admin.py +722 -722
  114. package/dist/extensions/builtin/browser/src/browser_harness/daemon.py +328 -328
  115. package/dist/extensions/builtin/browser/src/browser_harness/helpers.py +396 -396
  116. package/dist/extensions/builtin/browser/src/browser_harness/run.py +103 -103
  117. package/dist/extensions/builtin/discipline/skills/brainstorming/SKILL.md +33 -33
  118. package/dist/extensions/builtin/discipline/skills/executing-plans/SKILL.md +25 -25
  119. package/dist/extensions/builtin/discipline/skills/finishing-development-branch/SKILL.md +25 -25
  120. package/dist/extensions/builtin/discipline/skills/receiving-code-review/SKILL.md +22 -22
  121. package/dist/extensions/builtin/discipline/skills/requesting-code-review/SKILL.md +31 -31
  122. package/dist/extensions/builtin/discipline/skills/systematic-debugging/SKILL.md +28 -28
  123. package/dist/extensions/builtin/discipline/skills/test-driven-development/SKILL.md +32 -32
  124. package/dist/extensions/builtin/discipline/skills/using-git-worktrees/SKILL.md +25 -25
  125. package/dist/extensions/builtin/discipline/skills/verification-before-completion/SKILL.md +27 -27
  126. package/dist/extensions/builtin/discipline/skills/writing-plans/SKILL.md +26 -26
  127. package/dist/extensions/builtin/goal/README.md +67 -67
  128. package/dist/extensions/builtin/grub/README.md +112 -112
  129. package/dist/extensions/builtin/link-world/agent-workspace/README.md +16 -16
  130. package/dist/extensions/builtin/link-world/internet-search/internet-search.md +65 -65
  131. package/dist/extensions/builtin/link-world/link-world-agent.md +82 -82
  132. package/dist/extensions/builtin/link-world/linkworld.md +313 -313
  133. package/dist/extensions/builtin/link-world/network-routing/network-routing.md +67 -67
  134. package/dist/extensions/builtin/loop/README.md +92 -92
  135. package/dist/extensions/builtin/mcp/figma-design.md +68 -68
  136. package/dist/extensions/builtin/mcp/mcp-management.md +85 -85
  137. package/dist/extensions/builtin/recap/AGENT.md +15 -15
  138. package/dist/extensions/builtin/sal/README.md +72 -72
  139. package/dist/extensions/builtin/security-audit/README.md +289 -289
  140. package/dist/extensions/builtin/team/AGENT.md +112 -112
  141. package/dist/extensions/builtin/team/TESTING.md +299 -299
  142. package/dist/extensions/builtin/token-save/README.md +56 -56
  143. package/dist/extensions/optional/AGENT.md +10 -10
  144. package/dist/modes/interactive/controllers/input-submit-controller.js +2 -2
  145. package/dist/modes/interactive/controllers/stream-render-controller.js +2 -2
  146. package/dist/modes/interactive/interactive-mode.js +19 -19
  147. package/dist/modes/interactive/theme/dark.json +85 -85
  148. package/dist/modes/interactive/theme/light.json +84 -84
  149. package/dist/modes/interactive/theme/theme-schema.json +335 -335
  150. package/dist/modes/interactive/theme/warm.json +81 -81
  151. package/dist/node_modules/@pencil-agent/ai/dist/cli.js +0 -0
  152. package/dist/node_modules/@pencil-agent/ai/dist/models.generated.js +1 -1
  153. package/docs/ACP/345/215/217/350/256/256/351/233/206/346/210/220/345/274/200/345/217/221/346/226/207/346/241/243.md +851 -0
  154. package/docs/SDK-TESTING.md +364 -0
  155. package/docs/codex-goal-command-impl.md +1055 -1055
  156. package/docs/codex-goal-vs-grub.md +500 -500
  157. package/docs/custom-provider.md +27 -27
  158. package/docs/extensions.md +27 -27
  159. package/docs/keybindings.md +27 -27
  160. package/docs/loop /351/207/215/346/236/204/345/256/214/346/210/220/346/200/273/347/273/223.md" +250 -250
  161. package/docs/loop /351/207/215/346/236/204/345/256/214/346/210/220/346/212/245/345/221/212.md" +122 -122
  162. package/docs/loop /351/207/215/346/236/204/346/226/271/346/241/210.md" +1222 -1222
  163. package/docs/loop /351/207/215/346/236/204/346/226/271/346/241/210/345/256/236/347/216/260/346/212/245/345/221/212.md" +158 -158
  164. package/docs/loop /351/207/215/346/236/204/346/226/271/346/241/210/345/257/271/346/257/224/345/210/206/346/236/220.md" +128 -128
  165. package/docs/loop /351/207/215/346/236/204/350/256/241/345/210/222.md" +320 -320
  166. package/docs/loop-usage-examples.md +214 -214
  167. package/docs/mem-core/346/212/200/346/234/257/346/226/207/346/241/243.md +593 -0
  168. package/docs/models.md +27 -27
  169. package/docs/packages.md +27 -27
  170. package/docs/pi-design-philosophy.md +457 -457
  171. package/docs/planmode.md +1987 -1987
  172. package/docs/prompt-templates.md +27 -27
  173. package/docs/providers.md +27 -27
  174. package/docs/sdk.md +27 -27
  175. package/docs/skills.md +27 -27
  176. package/docs/startup-performance-optimization.md +301 -0
  177. package/docs/themes.md +27 -27
  178. package/docs/tui.md +27 -27
  179. package/docs//350/256/244/347/237/245/345/234/260/345/233/276.md +47 -0
  180. package/package.json +190 -190
  181. package/docs/cc-agent-design.md +0 -1297
  182. package/docs/cc-tui-design.md +0 -1333
  183. package/docs/nanoPencil-/345/255/246/344/271/240/350/256/241/345/210/222.md +0 -170
  184. package/docs/scan-report.md +0 -3820
  185. package/docs//345/257/271/346/240/207Claude-Code.md +0 -1775
  186. package/docs//351/230/277/351/207/214/345/267/264/345/267/264/350/264/242/346/212/245/345/210/206/346/236/220/344/271/246.md +0 -261
@@ -1,1333 +0,0 @@
1
- # Claude Code TUI 人机交互设计拆解
2
-
3
- > 源码版本:@anthropic-ai/claude-code@2.1.92
4
- > 目标:让 nanoPencil 复刻 CC 的优秀 TUI 交互设计
5
-
6
- ---
7
-
8
- ## 一、一句话概括
9
-
10
- CC 的 TUI 是一个 **Ink/React 驱动的终端应用**:极简的单行输入区 + 丰富的消息流渲染 + 内联权限审批 + 实时状态栏,核心理念是"**让用户永远知道发生了什么,永远不需要离开终端**"。
11
-
12
- ---
13
-
14
- ## 二、TUI 架构总览
15
-
16
- ### 2.1 CC 的技术栈
17
-
18
- | 层级 | 技术 | 说明 |
19
- |------|------|------|
20
- | 渲染引擎 | Ink (React for CLI) | Yoga flexbox 布局,虚拟 DOM diff |
21
- | 状态管理 | 自定义 store(类似 Zustand) | `createStore` + `useSyncExternalStore` |
22
- | 键输入 | 自定义状态机 `G64()` | 不依赖 readline,直接处理 stdin 字节 |
23
- | 着色 | chalk | 终端颜色输出 |
24
- | 组件 | Box/Text/Spacer/Ansi/Link/Button | Ink 原语 + 主题感知包装器 |
25
-
26
- ### 2.2 nanoPencil 的技术栈
27
-
28
- | 层级 | 技术 | 说明 |
29
- |------|------|------|
30
- | 渲染引擎 | 自研 Component 树 | `render(width): string[]` + 差量渲染 |
31
- | 状态管理 | Controller 注入(依赖倒置) | 各 Controller 通过 port 接口通信 |
32
- | 键输入 | StdinBuffer + Kitty 协议 | 支持传统 VT + Kitty 键盘协议 |
33
- | 着色 | chalk + cli-highlight | 语法高亮 lazy-loaded |
34
- | 组件 | Container/Component/Overlay | 轻量级,无 React 依赖 |
35
-
36
- ### 2.3 组件树对比
37
-
38
- **CC 组件树**:
39
- ```
40
- <AppStateProvider>
41
- <VoiceProvider>
42
- <KeyBindingsProvider>
43
- <PM6 (Transcript/MessageList)>
44
- <UserMessage />
45
- <AssistantMessage />
46
- <ToolUseMessage /> // 每个工具 5 个渲染方法
47
- <ThinkingMessage />
48
- <BashOutputMessage />
49
- </PM6>
50
- <InputBox /> // TextInput + @ 引用
51
- <Footer /> // 状态栏
52
- <PermissionDialog /> // 内联审批
53
- <Spinner /> // CK 组件
54
- <NotificationToast /> // 优先级队列
55
- </KeyBindingsProvider>
56
- </VoiceProvider>
57
- </AppStateProvider>
58
- ```
59
-
60
- **nanoPencil 组件树**:
61
- ```
62
- TUI (root)
63
- +-- headerContainer (logo, keybinding hints)
64
- +-- notificationQueue (优先级通知,浮动在顶部)
65
- +-- chatContainer (CachedContainer,渲染缓存 + 视口裁剪)
66
- | +-- UserMessage / AssistantMessage / ToolExecution / ...
67
- +-- pendingMessagesContainer
68
- +-- statusContainer
69
- +-- widgetContainerAbove (extension widgets)
70
- +-- editorContainer
71
- | +-- attachmentsBar (image paste)
72
- | +-- EditorBuddyLayout
73
- | +-- CustomEditor (input box,slash 命令高亮)
74
- | +-- buddySlot (pet sprite)
75
- +-- widgetContainerBelow
76
- +-- FooterComponent (status bar)
77
- ```
78
-
79
- **关键差异**:CC 的权限审批是内联在消息流中的,nanoPencil 没有。
80
-
81
- ---
82
-
83
- ## 三、输入系统
84
-
85
- ### 3.1 自定义键解析器(G64 函数)
86
-
87
- CC 没有使用 readline 或第三方输入库,而是实现了一个**自定义的字节级键解析器**。
88
-
89
- ```typescript
90
- // CC 源码中的键解析状态机
91
- function G64(keyParseState, inputByte): [parsedKeys[], newState] {
92
- // 两种模式:
93
- // - NORMAL: 普通输入模式
94
- // - IN_PASTE: 括号粘贴模式(ESC[200~ 开始,ESC[201~ 结束)
95
-
96
- // 使用 vT6 tokenizer 处理原始 stdin 字节
97
- // 支持 x10 鼠标事件
98
- }
99
- ```
100
-
101
- **超时机制**:
102
- - 普通转义序列:50ms 超时(`NORMAL_TIMEOUT`)
103
- - 粘贴模式:500ms 超时(`PASTE_TIMEOUT`)
104
- - `incompleteEscapeTimer` 处理歧义转义序列
105
-
106
- ### 3.2 修饰键检测(P64 函数)
107
-
108
- ```typescript
109
- function P64(paramByte): { shift, meta, ctrl, super } {
110
- return {
111
- shift: !!(paramByte & 1), // Bit 0
112
- meta: !!(paramByte & 2), // Bit 1
113
- ctrl: !!(paramByte & 4), // Bit 2
114
- super: !!(paramByte & 8), // Bit 3
115
- };
116
- }
117
- ```
118
-
119
- ### 3.3 括号粘贴模式
120
-
121
- CC 完整支持 bracketed paste,避免粘贴内容被当作命令执行:
122
-
123
- ```
124
- 粘贴开始:ESC[200~ ($64 常量)
125
- 粘贴结束:ESC[201~ (w64 常量)
126
- ```
127
-
128
- 在 `IN_PASTE` 模式下,所有输入累积到 `pasteBuffer`,直到结束序列到达。
129
-
130
- ### 3.4 鼠标事件(D64 函数)
131
-
132
- CC 支持两种鼠标协议:
133
- - **SGR 模式**:`ESC[<...M`(按下)/ `ESC[<...m`(释放)
134
- - **X10 模式**:`ESC[M...`
135
-
136
- 事件结构:`{ kind: "mouse", button, action: "press"|"release", col, row }`
137
-
138
- 双击/三击检测:通过 `lastClickTime`、`lastClickCol`、`lastClickRow`、`clickCount` 追踪。
139
-
140
- ### 3.5 输入框组件
141
-
142
- CC 的输入框特点:
143
- - **单行默认**:`>` 提示符 + TextInput 组件
144
- - **多行输入**:Shift+Enter(Apple Terminal/tmux)或 `\` + Enter(其他终端)
145
- - **@ 文件引用**:输入文本中的 `@path` 被解析为文件引用
146
- - **光标偏移追踪**:`onChangeCursorOffset` / `onSubmit` / `onChange`
147
- - **vim 模式切换**:INSERT / NORMAL 两种子模式
148
-
149
- ### 3.6 nanoPencil 对标点
150
-
151
- | 特性 | CC | nanoPencil | 差距 |
152
- |------|-----|-----------|------|
153
- | 键解析 | 自定义状态机(VT 序列) | StdinBuffer + Kitty 协议 | nanoPencil 更先进 |
154
- | 修饰键 | 位掩码检测 | Key.ctrl/shift/alt 组合 | 等价 |
155
- | 粘贴模式 | 完整支持 | 完整支持 | 等价 |
156
- | 鼠标事件 | SGR + X10 | Kitty 协议 | nanoPencil 更先进 |
157
- | @ 文件引用 | ✅ | ❌ | **nanoPencil 缺失** |
158
- | 多行输入 | Shift+Enter / `\`+Enter | 支持 | 等价 |
159
- | 输入框高亮 | slash 命令高亮(suggestion 色) | slash 命令高亮(accent 色) | 等价 |
160
-
161
- ---
162
-
163
- ## 四、键盘快捷键体系
164
-
165
- ### 4.1 两层架构
166
-
167
- CC 的键处理分为两层:
168
-
169
- **第一层:低层字节解析**(`G64` 函数)
170
- - 处理原始 stdin 字节
171
- - 解析转义序列、修饰键、鼠标事件
172
- - 处理括号粘贴
173
- - 输出结构化 key 事件
174
-
175
- **第二层:React 层 action 绑定**(`J1` 函数)
176
- ```
177
- J1(actionId, handler, { context, isActive })
178
- ```
179
- - 绑定 action ID 到处理函数
180
- - 支持上下文感知(不同 UI 状态下不同快捷键)
181
- - 通过 `KeyBindingsProvider` 注入 React 组件树
182
-
183
- ### 4.2 KeyBindingsProvider
184
-
185
- ```typescript
186
- // CC 的键绑定上下文
187
- <KeyBindingsProvider> // ph8
188
- {children}
189
- </KeyBindingsProvider>
190
- ```
191
-
192
- 键绑定从 `~/.claude/keybindings.json` 加载,支持用户自定义。
193
-
194
- ### 4.3 上下文感知(18 个 context)
195
-
196
- CC 定义了 18 个输入上下文,不同 UI 状态下激活不同的快捷键:
197
-
198
- | Context | 用途 |
199
- |---------|------|
200
- | `app` | 全局应用级 |
201
- | `history` | 历史浏览 |
202
- | `chat` | 聊天输入 |
203
- | `autocomplete` | 自动补全 |
204
- | `confirm` | 确认对话框 |
205
- | `tabs` | Tab 切换 |
206
- | `transcript` | 消息流浏览 |
207
- | `historySearch` | 历史搜索 |
208
- | `task` | 任务管理 |
209
- | `theme` | 主题选择 |
210
- | `help` | 帮助页面 |
211
- | `attachments` | 附件管理 |
212
- | `footer` | 底部状态栏 |
213
- | `messageSelector` | 消息选择器 |
214
- | `diff` | Diff 查看 |
215
- | `modelPicker` | 模型选择 |
216
- | `select` | 通用选择器 |
217
- | `permission` | 权限审批 |
218
-
219
- ### 4.4 不可重绑定键
220
-
221
- CC 将某些键标记为不可重绑定:
222
- - `Ot6` — 错误键(会导致错误的绑定)
223
- - `jU1` — 终端保留键
224
- - `HU1` — macOS 保留键
225
-
226
- ### 4.5 核心快捷键清单
227
-
228
- | 快捷键 | Action | Context | 说明 |
229
- |--------|--------|---------|------|
230
- | `Escape` | cancel | confirm/chat | 取消/退出(双击安全机制) |
231
- | `Ctrl+C` | clear/interrupt | app | 复制文本 / 中断操作 |
232
- | `Ctrl+D` | exit | app | 退出 |
233
- | `Tab` | nextSuggestion | autocomplete | 下一个补全建议 |
234
- | `Shift+Tab` | previousSuggestion | autocomplete | 上一个补全建议 |
235
- | `Enter` | submit | chat | 提交输入 |
236
- | `Shift+Enter` | newline | chat | 换行 |
237
- | `Up/Down` | navigate | history/select | 历史/菜单导航 |
238
- | `Ctrl+R` | refresh | app | 刷新 |
239
- | `q` | quit | select | 快速退出选择器 |
240
-
241
- ### 4.6 nanoPencil 对标点
242
-
243
- | 特性 | CC | nanoPencil | 差距 |
244
- |------|-----|-----------|------|
245
- | 两层架构 | ✅ | ✅(StdinBuffer + AppAction) | 等价 |
246
- | 可配置 keybindings | ✅ ~/.claude/keybindings.json | ✅ ~/.pencils/keybindings.json | 等价 |
247
- | 上下文感知 | 18 个 context | Controller 级别隔离 | CC 更细粒度 |
248
- | 不可重绑定键 | ✅ 三类保护 | ❌ | **nanoPencil 缺失** |
249
- | 快捷键数量 | 20+ | 20+ | 等价 |
250
-
251
- ---
252
-
253
- ## 五、Slash 命令系统
254
-
255
- ### 5.1 注册机制
256
-
257
- ```typescript
258
- // CC 的命令注册函数 Ow()
259
- Ow({
260
- name: "model",
261
- description: "Set AI model for Claude Code",
262
- aliases: [],
263
- allowedTools: [...],
264
- argumentHint: "[model-name]",
265
- whenToUse: "...",
266
- userInvocable: true,
267
- disableModelInvocation: false,
268
- isEnabled: () => true,
269
- isHidden: false,
270
- getPromptForCommand: (args) => "...",
271
- files: [],
272
- load: async () => import("./model"),
273
- context: "local-jsx",
274
- agent: undefined,
275
- });
276
- ```
277
-
278
- ### 5.2 三种命令类型
279
-
280
- | 类型 | 行为 | 示例 |
281
- |------|------|------|
282
- | `prompt` | 注入系统提示给 LLM | `/simplify`, `/debug`, `/review` |
283
- | `local` | 执行本地函数 | `/voice`, `/stickers` |
284
- | `local-jsx` | 渲染 JSX 交互组件 | `/model`, `/effort`, `/export`, `/stats` |
285
-
286
- **关键洞察**:`local-jsx` 类型允许命令渲染交互式 UI 组件(选择器、对话框等),这是 CC 的独特设计。
287
-
288
- ### 5.3 懒加载机制
289
-
290
- CC 的命令通过 `load` 函数懒加载:
291
- ```typescript
292
- load: async () => import("./model-command")
293
- ```
294
- 只有在用户首次调用时才加载命令代码,减少启动时间。
295
-
296
- ### 5.4 Tab 补全
297
-
298
- 输入 `/` 后自动触发补全:
299
- - Tab 键循环匹配的命令
300
- - `suggestions` / `selectedSuggestion` 状态管理
301
- - 命令支持 `argumentHint` 显示参数提示
302
-
303
- ### 5.5 完整命令清单
304
-
305
- | 命令 | 类型 | 说明 |
306
- |------|------|------|
307
- | `/help` | prompt | 显示帮助 |
308
- | `/clear` | local | 清空对话 |
309
- | `/compact` | prompt | 压缩/摘要对话 |
310
- | `/config` | local-jsx | 打开配置面板 |
311
- | `/cost` | local | 显示费用 |
312
- | `/doctor` | local | 系统健康检查 |
313
- | `/init` | prompt | 初始化 CLAUDE.md |
314
- | `/login` | local | 登录 |
315
- | `/logout` | local | 登出 |
316
- | `/memory` | prompt | 管理记忆文件 |
317
- | `/model` | local-jsx | 切换模型 |
318
- | `/permissions` | local | 管理权限 |
319
- | `/review` | prompt | 代码审查 |
320
- | `/status` | local | 显示状态 |
321
- | `/terminal-setup` | local | 终端集成设置 |
322
- | `/vim` | local | 切换 vim 模式 |
323
- | `/theme` | local-jsx | 切换主题 |
324
- | `/bug` | local | 提交 bug 报告 |
325
- | `/quit` `/exit` | local-jsx | 退出 |
326
- | `/mcp` | local | MCP 服务器管理 |
327
- | `/agents` | local | 列出 agent |
328
- | `/skills` | local | 管理 skills |
329
- | `/update-config` | prompt | 更新配置 |
330
- | `/loop` | prompt | 定时循环执行 |
331
- | `/batch` | prompt | 并行 worktree 批量变更 |
332
- | `/simplify` | prompt | 代码质量审查 |
333
- | `/stats` | local-jsx | 使用统计 |
334
- | `/export` | local-jsx | 导出对话 |
335
- | `/effort` | local-jsx | 设置推理努力程度 |
336
- | `/stuck` | prompt | 诊断卡住的会话 |
337
- | `/brief` | local-jsx | 切换简洁模式 |
338
- | `/voice` | local | 语音模式 |
339
- | `/schedule` | prompt | 定时远程 agent |
340
- | `/advisor` | local-jsx | 配置 advisor 模型 |
341
-
342
- ### 5.6 命令别名
343
-
344
- - `/quit` = `/exit`
345
- - `remote-control` = `rc`
346
- - `plugin` = `plugins`
347
- - `update` = `upgrade`
348
-
349
- ### 5.7 nanoPencil 对标点
350
-
351
- | 特性 | CC | nanoPencil | 差距 |
352
- |------|-----|-----------|------|
353
- | 命令数量 | 30+ | 30+ | 等价 |
354
- | 命令类型 | 3 种(prompt/local/local-jsx) | 2 种(prompt/local) | **缺 local-jsx** |
355
- | 懒加载 | ✅ | ❌ | **nanoPencil 缺失** |
356
- | Tab 补全 | ✅ | ✅(含参数级补全) | nanoPencil 更好 |
357
- | 命令别名 | ✅ | ✅ | 等价 |
358
- | argumentHint | ✅ | ✅ | 等价 |
359
-
360
- ---
361
-
362
- ## 六、权限审批 UI(重点)
363
-
364
- 这是 CC 与 nanoPencil **最大的设计差异**。nanoPencil 的工具执行无需用户确认,CC 有完整的交互式审批系统。
365
-
366
- ### 6.1 权限模型:三态
367
-
368
- 每个工具调用返回一个权限结果:
369
-
370
- ```typescript
371
- interface PermissionResult {
372
- behavior: "allow" | "ask" | "deny";
373
- message: string; // 解释为什么需要审批
374
- decisionReason: { type: "mode" | "rule" | "other" | "safetyCheck" };
375
- updatedInput?: object; // "allow" 时可修改输入
376
- blockedPath?: string; // 路径违规时
377
- suggestions?: Array<Suggestion>; // UI 建议操作
378
- }
379
- ```
380
-
381
- - **allow** — 直接执行,不提示用户
382
- - **ask** — 显示审批对话框,等待用户决定
383
- - **deny** — 直接阻止,不执行
384
-
385
- ### 6.2 权限模式
386
-
387
- | 模式 | 行为 |
388
- |------|------|
389
- | `default` | 每个工具都需要确认 |
390
- | `acceptEdits` | 编辑操作自动允许,破坏性操作需确认 |
391
- | `auto` | ML 分类器自动审批 |
392
- | `plan` | 只读 + plan 模式 |
393
- | `bypassPermissions` | 跳过所有权限检查(危险) |
394
- | `dontAsk` | 拒绝所有需要审批的操作 |
395
-
396
- ### 6.3 权限规则来源优先级
397
-
398
- CC 从 8 个来源检查权限规则,按优先级排序:
399
-
400
- 1. `policySettings` — 组织策略(只读)
401
- 2. `flagSettings` — 功能标志(只读)
402
- 3. `command` — CLI 参数(只读)
403
- 4. `projectSettings` — `.claude/settings.json`
404
- 5. `userSettings` — `~/.claude/settings.json`
405
- 6. `localSettings` — `.claude/settings.local.json`
406
- 7. `cliArg` — 运行时 CLI 参数
407
- 8. `session` — 当前会话
408
-
409
- ### 6.4 审批对话框
410
-
411
- CC 的权限审批是**内联在消息流中的**(非 modal 弹窗):
412
-
413
- ```
414
- ╭─ Tool: Edit ─────────────────────────────────────╮
415
- │ File: src/auth/login.ts │
416
- │ │
417
- │ [Diff preview of the changes] │
418
- │ │
419
- │ ┌─────────┐ ┌──────────────┐ ┌────────────────┐ │
420
- │ │ Allow │ │ Allow Always │ │ Deny │ │
421
- │ └─────────┘ └──────────────┘ └────────────────┘ │
422
- │ │
423
- │ Suggestions: │
424
- │ • Add src/ to session allowed directories │
425
- │ • Switch to acceptEdits mode │
426
- ╰───────────────────────────────────────────────────╯
427
- ```
428
-
429
- 组件:
430
- - `N1` — 对话框容器
431
- - `z1` — 选项选择器(Allow/Deny/Always-Allow)
432
- - `h1` — 输入提示栏(显示可用快捷键)
433
- - `n8` — 按键和弦显示(如 "ctrl+k")
434
- - `QQ` — 焦点选项指示器
435
-
436
- ### 6.5 建议操作(Suggestions)
437
-
438
- 审批对话框可以显示**上下文相关的建议**:
439
-
440
- | 建议类型 | 说明 |
441
- |---------|------|
442
- | `addDirectories` | 将目录添加到会话允许列表 |
443
- | `setMode` | 切换权限模式(如切换到 acceptEdits) |
444
- | `addRules` | 持久化权限规则到设置文件 |
445
-
446
- ### 6.6 只读命令自动审批
447
-
448
- CC 的 `QL8()` 函数检查 bash 命令是否只读:
449
-
450
- ```typescript
451
- // 自动审批的安全命令
452
- const SAFE_READONLY_COMMANDS = [
453
- "cat", "head", "tail", "ls", "find", "grep", "rg",
454
- "wc", "diff", "file", "which", "echo", "pwd",
455
- // ...
456
- ];
457
-
458
- // 需要审批的危险命令
459
- const DANGEROUS_COMMANDS = [
460
- "rm", "rmdir", "sed", "mv", "cp", "chmod", "chown",
461
- // ...
462
- ];
463
- ```
464
-
465
- 只读命令自动通过,危险命令需要用户确认。路径验证确保命令只能访问允许的目录。
466
-
467
- ### 6.7 Diff 预览
468
-
469
- 审批文件编辑操作时,CC 会展示 **unified diff 预览**:
470
-
471
- ```
472
- --- a/src/auth/login.ts
473
- +++ b/src/auth/login.ts
474
- @@ -15,7 +15,9 @@
475
- async function login(email: string, password: string) {
476
- - const user = await db.findUser(email);
477
- + const user = await db.findUserByEmail(email);
478
- + if (!user) throw new AuthError("User not found");
479
- +
480
- const valid = await bcrypt.compare(password, user.hash);
481
- ```
482
-
483
- Diff 引擎支持:
484
- - 字符级 diff
485
- - 词级 diff(`aM4`,使用 Intl segmenter)
486
- - 行级 diff(`sM4`)
487
- - 语法高亮(可通过 `syntaxHighlightingDisabled` 关闭)
488
-
489
- ### 6.8 Auto Mode 分类器
490
-
491
- CC 的 `auto` 模式使用 ML 分类器自动审批工具调用:
492
-
493
- ```typescript
494
- // TS8 函数:运行 auto mode 分类器
495
- const result = await TS8(
496
- [...agentMessages, reviewPrompt],
497
- tools, toolPermissionContext, abortSignal
498
- );
499
- // 返回:{ shouldBlock, reason, model, usage }
500
- ```
501
-
502
- - 分类器使用小模型审查工具调用
503
- - 追踪 `totalDenials` 和 `consecutiveDenials`
504
- - 分类器不可用时降级为手动审批
505
- - 转录过长时也降级
506
-
507
- ### 6.9 nanoPencil 对标点
508
-
509
- | 特性 | CC | nanoPencil | 差距 |
510
- |------|-----|-----------|------|
511
- | 权限三态 | allow/ask/deny | allow/deny | **缺 ask(交互式)** |
512
- | 权限模式 | 6 种 | 无模式概念 | **缺失** |
513
- | 审批对话框 | ✅ 内联 | ❌ | **缺失** |
514
- | Diff 预览 | ✅ 审批前 | ✅ 工具渲染中 | 等价但时机不同 |
515
- | 建议操作 | ✅ | ❌ | **缺失** |
516
- | 只读自动审批 | ✅ | ❌ | **缺失** |
517
- | Auto mode 分类器 | ✅ | ❌ | **缺失** |
518
- | 权限规则优先级 | 8 级 | ❌ | **缺失** |
519
-
520
- **复刻建议**:这是 nanoPencil 最大的 TUI 差距。建议分阶段实现:
521
- 1. P0:基础审批对话框(allow/deny + 快捷键)
522
- 2. P1:只读自动审批 + 权限模式(default/acceptEdits/auto)
523
- 3. P2:建议操作 + 权限规则持久化 + auto mode 分类器
524
-
525
- ---
526
-
527
- ## 七、消息渲染管线
528
-
529
- ### 7.1 Transcript 组件(PM6)
530
-
531
- CC 的消息列表组件接收以下 props:
532
-
533
- ```typescript
534
- PM6({
535
- messages, // 消息数组
536
- tools, // 工具定义
537
- commands, // 命令定义
538
- verbose, // 详细模式
539
- toolJSX, // 工具 JSX 缓存
540
- toolUseConfirmQueue, // 审批队列
541
- inProgressToolUseIDs, // 执行中的工具 ID
542
- isMessageSelectorVisible, // 消息选择器可见性
543
- conversationId, // 会话 ID
544
- screen, // 屏幕信息
545
- streamingToolUses, // 流式工具使用
546
- showAllInTranscript, // 显示全部历史
547
- isLoading, // 加载状态
548
- renderRange, // 渲染范围(虚拟滚动)
549
- disableRenderCap, // 禁用渲染上限
550
- })
551
- ```
552
-
553
- ### 7.2 消息类型渲染器
554
-
555
- CC 为每种消息类型提供专用渲染器:
556
-
557
- | 渲染器 | 函数名 | 用途 |
558
- |--------|--------|------|
559
- | 用户消息 | `Z9K` | 渲染用户输入 |
560
- | 助手消息 | `I9K` | 渲染 LLM 输出 |
561
- | 思考消息 | `Su8` | 渲染 thinking/reasoning |
562
- | Bash 输出 | `PH6` / `g9K` | 渲染命令执行结果 |
563
- | 记忆输入 | `n9K` | 渲染记忆加载 |
564
- | Plan 内容 | `Fu8` | 渲染计划内容 |
565
-
566
- ### 7.3 工具执行渲染(5 个方法)
567
-
568
- 每个工具定义必须实现 5 个渲染方法:
569
-
570
- ```typescript
571
- interface ToolRenderers {
572
- renderToolUseMessage(input): JSX; // 正在执行时显示
573
- renderToolUseProgressMessage(input): JSX; // 执行进度
574
- renderToolResultMessage(result): JSX; // 执行结果
575
- renderToolUseRejectedMessage(): JSX; // 被拒绝时显示
576
- renderToolUseErrorMessage(error): JSX; // 出错时显示
577
- }
578
- ```
579
-
580
- ### 7.4 Markdown 渲染
581
-
582
- CC 使用**终端原生 markdown 渲染器**(非 web markdown 库):
583
- - 代码块语法高亮
584
- - 表格渲染
585
- - 链接(可点击终端链接)
586
- - 标题、列表、引用
587
-
588
- ### 7.5 长输出处理(虚拟滚动)
589
-
590
- CC 通过 `renderRange` 实现虚拟滚动:
591
-
592
- ```typescript
593
- // 只渲染可见范围内的消息
594
- const visibleMessages = messages.slice(
595
- renderRange.start,
596
- renderRange.end
597
- );
598
- ```
599
-
600
- - `disableRenderCap` 可禁用渲染上限(用于导出)
601
- - `showAllInTranscript` 显示完整对话历史
602
-
603
- ### 7.6 nanoPencil 对标点
604
-
605
- | 特性 | CC | nanoPencil | 差距 |
606
- |------|-----|-----------|------|
607
- | 消息类型渲染器 | 6 种 | 类似 | 等价 |
608
- | 工具渲染方法 | 5 个/工具 | per-tool 渲染 | 等价 |
609
- | Markdown | 终端原生 | marked + cli-highlight | 等价 |
610
- | 虚拟滚动 | ✅ renderRange | ✅ CachedContainer(渲染缓存 + 视口裁剪) | 等价 |
611
- | 导出功能 | /export | /export | 等价 |
612
-
613
- ---
614
-
615
- ## 八、Spinner 与进度指示
616
-
617
- ### 8.1 Spinner 组件(CK)
618
-
619
- CC 的 spinner 是一个动画组件,在 LLM 思考/工具执行时显示:
620
-
621
- ```typescript
622
- // 使用方式
623
- createElement(CK, null) // 显示 spinner
624
- // 后跟文本如 "Installing it2..."
625
- ```
626
-
627
- ### 8.2 可配置的 Spinner Tips 和 Verbs
628
-
629
- CC 允许用户自定义 spinner 的显示内容:
630
-
631
- ```typescript
632
- // 设置项
633
- spinnerTipsEnabled: true, // 是否显示 tips
634
- spinnerVerbs: {
635
- mode: "append" | "replace", // 追加或替换默认 verbs
636
- verbs: ["Thinking...", "Analyzing...", "Working..."]
637
- },
638
- spinnerTipsOverride: {
639
- excludeDefault: true, // 排除默认 tips
640
- tips: ["Custom tip 1", "Custom tip 2"]
641
- }
642
- ```
643
-
644
- ### 8.3 Agent/子 Agent 进度
645
-
646
- CC 在子 agent 执行时显示进度:
647
-
648
- ```typescript
649
- // Fm8 函数:渲染 skill/agent 进度
650
- // 最多显示最近 3 个 tool use(coz = 3)
651
- // 无进度时显示 "Initializing..."(loz = "Initializing...")
652
- // verbose 模式下显示全部进度
653
- ```
654
-
655
- ### 8.4 Task activeForm
656
-
657
- CC 的 Task 系统支持 `activeForm` 字段:
658
-
659
- ```typescript
660
- TaskCreate({
661
- subject: "Run tests",
662
- activeForm: "Running tests", // spinner 中显示的文本
663
- });
664
- ```
665
-
666
- 当任务 `in_progress` 时,spinner 显示 `activeForm` 文本(或回退到 `subject`)。
667
-
668
- ### 8.5 nanoPencil 对标点
669
-
670
- | 特性 | CC | nanoPencil | 差距 |
671
- |------|-----|-----------|------|
672
- | Spinner 动画 | CK 组件 | PencilLoader(钻石旋转) | 等价 |
673
- | Stall 检测 | ❌ | ✅ 3 秒超时变色 | **nanoPencil 更好** |
674
- | Tips/Verbs 可配置 | ✅ | ✅(10 条内置 tips,6 秒轮换) | 等价 |
675
- | Agent 进度 | ✅ 最近 3 个 tool use | 类似 | 等价 |
676
- | activeForm | ✅ | ✅(Task 系统) | 等价 |
677
-
678
- ---
679
-
680
- ## 九、状态栏 / Footer
681
-
682
- ### 9.1 状态栏内容
683
-
684
- CC 的 footer 显示:
685
-
686
- | 信息 | 说明 |
687
- |------|------|
688
- | API key 状态 | 是否已认证 |
689
- | Debug 模式 | 是否启用调试 |
690
- | Vim 模式 | INSERT/NORMAL(vim 模式时) |
691
- | 权限模式 | default/auto/acceptEdits 等 |
692
- | 自动更新状态 | 是否有可用更新 |
693
- | Verbose 模式 | 是否详细输出 |
694
- | 建议 | 上下文相关的操作建议 |
695
-
696
- ### 9.2 上下文窗口使用率
697
-
698
- CC 在状态 JSON 中输出详细的上下文信息:
699
-
700
- ```typescript
701
- {
702
- context_window: {
703
- total_tokens: 200000,
704
- remaining: 150000,
705
- used_percentage: 25,
706
- remaining_percentage: 75,
707
- input_tokens: 100000,
708
- output_tokens: 50000,
709
- cache_creation_input_tokens: 0,
710
- cache_read_input_tokens: 0,
711
- }
712
- }
713
- ```
714
-
715
- ### 9.3 Rate Limit 显示
716
-
717
- CC 显示 Claude.ai 订阅的 rate limit 信息:
718
-
719
- ```typescript
720
- {
721
- rate_limits: {
722
- "5h": {
723
- used_percentage: 45,
724
- resets_at: "2026-06-11T15:00:00Z"
725
- },
726
- "7d": {
727
- used_percentage: 12,
728
- resets_at: "2026-06-18T00:00:00Z"
729
- }
730
- }
731
- }
732
- ```
733
-
734
- ### 9.4 自定义 Statusline
735
-
736
- CC 支持用户自定义状态栏:
737
-
738
- ```bash
739
- # ~/.claude/statusline-command.sh
740
- #!/bin/bash
741
- echo "$(pwd) | $(git branch --show-current) | $(date +%H:%M)"
742
- ```
743
-
744
- 通过 `/statusline` 命令设置,输出被注入到状态栏。
745
-
746
- ### 9.5 nanoPencil 对标点
747
-
748
- | 特性 | CC | nanoPencil | 差距 |
749
- |------|-----|-----------|------|
750
- | 基础信息 | model/token/cost | model/token/cost/context | 等价 |
751
- | 上下文使用率 | JSON 输出 | 进度条 `[████░░░░]` | **nanoPencil 更好** |
752
- | Rate limit | ✅ 5h + 7d | ❌ | **nanoPencil 缺失** |
753
- | 自定义 statusline | ✅ shell 脚本 | ❌ | **nanoPencil 缺失** |
754
- | Git 分支 | ❌ | ✅ | **nanoPencil 更好** |
755
- | 会话名 | ❌ | ✅ | **nanoPencil 更好** |
756
-
757
- ---
758
-
759
- ## 十、通知系统
760
-
761
- ### 10.1 优先级队列
762
-
763
- CC 的通知系统使用优先级队列:
764
-
765
- ```typescript
766
- // PK hook
767
- useNotifications()
768
- // 优先级:immediate > high > medium > low
769
- ```
770
-
771
- ### 10.2 自动消失
772
-
773
- ```typescript
774
- const nK7 = 8000; // 默认 8 秒后自动消失
775
- ```
776
-
777
- ### 10.3 折叠与失效
778
-
779
- - **折叠**:相同 key 的通知合并
780
- - **失效**:新通知替换旧通知(相同 key)
781
-
782
- ### 10.4 通知渠道
783
-
784
- ```typescript
785
- type NotificationChannel =
786
- | "auto" // 自动选择
787
- | "iterm2" // iTerm2 通知
788
- | "iterm2_with_bell" // iTerm2 + 终端铃声
789
- | "terminal_bell" // 终端铃声
790
- | "kitty" // Kitty 通知
791
- | "ghostty" // Ghostty 通知
792
- | "notifications_disabled"; // 禁用
793
- ```
794
-
795
- ### 10.5 桌面通知集成
796
-
797
- CC 集成了多种终端的通知协议:
798
- - **iTerm2**:OSC 9/1337 + Python API
799
- - **Kitty**:OSC 99
800
- - **Ghostty**:版本 >= 1.2.0
801
-
802
- ### 10.6 nanoPencil 对标点
803
-
804
- | 特性 | CC | nanoPencil | 差距 |
805
- |------|-----|-----------|------|
806
- | 通知队列 | ✅ 4 级优先级 | ✅ NotificationQueue(4 级优先级 + key 去重) | 等价 |
807
- | 自动消失 | ✅ 8 秒 | ✅ 5 秒(status/warning),通知队列 3-12 秒按优先级 | 等价 |
808
- | 折叠/失效 | ✅ | ✅ key 去重 + 连续 status 替换 | 等价 |
809
- | 通知渠道 | 7 种 | ❌ | **nanoPencil 缺失** |
810
- | 桌面通知 | ✅ | ❌ | **nanoPencil 缺失** |
811
-
812
- ---
813
-
814
- ## 十一、Diff 引擎与展示
815
-
816
- ### 11.1 Zo 类层次
817
-
818
- CC 实现了一个完整的 diff 引擎:
819
-
820
- ```
821
- Zo(基类:字符级 diff,Myers 算法)
822
- ├── aM4(词级 diff,Intl segmenter 支持)
823
- ├── sM4(行级 diff)
824
- ├── qX4(行级 diff,含空白/换行处理)
825
- └── _X4(数组 diff)
826
- ```
827
-
828
- ### 11.2 Unified Diff 生成(oV6 函数)
829
-
830
- ```typescript
831
- function oV6(oldText, newText, options): Patch {
832
- return {
833
- oldFileName: "...",
834
- newFileName: "...",
835
- oldHeader: "...",
836
- newHeader: "...",
837
- hunks: [{
838
- oldStart: 15,
839
- oldLines: 7,
840
- newStart: 15,
841
- newLines: 9,
842
- lines: [
843
- " unchanged line",
844
- "- removed line",
845
- "+ added line",
846
- ]
847
- }]
848
- };
849
- }
850
- ```
851
-
852
- ### 11.3 语法高亮
853
-
854
- Diff 输出的语法高亮通过 `syntaxHighlightingDisabled` 设置控制:
855
- - 增加行:绿色
856
- - 删除行:红色
857
- - 上下文行:默认色
858
-
859
- ### 11.4 nanoPencil 对标点
860
-
861
- | 特性 | CC | nanoPencil | 差距 |
862
- |------|-----|-----------|------|
863
- | 字符级 diff | ✅ | ❌ | **nanoPencil 缺失** |
864
- | 词级 diff | ✅ Intl segmenter | ✅ Diff.diffWords(逆视频高亮) | 等价 |
865
- | 行级 diff | ✅ | ✅ renderDiff | 等价 |
866
- | 数组 diff | ✅ | ❌ | **nanoPencil 缺失** |
867
- | Unified 格式 | ✅ git apply 兼容 | ✅ | 等价 |
868
- | 语法高亮 | ✅ | ✅ | 等价 |
869
-
870
- ---
871
-
872
- ## 十二、Vim 模式
873
-
874
- ### 12.1 editorMode 设置
875
-
876
- ```typescript
877
- // 检测 vim 模式
878
- function Ot() { return w8().editorMode === "vim"; }
879
-
880
- // 设置值
881
- type EditorMode = "normal" | "vim" | "emacs";
882
- ```
883
-
884
- ### 12.2 INSERT / NORMAL 子模式
885
-
886
- Vim 模式有两个子模式:
887
- - **INSERT**:正常文本输入
888
- - **NORMAL**:vim 风格导航键
889
-
890
- 状态在会话信息中报告:`{ vim: { mode: "INSERT" | "NORMAL" } }`
891
-
892
- ### 12.3 状态栏模式指示器
893
-
894
- Footer 显示当前 vim 模式:
895
- ```typescript
896
- vimMode: Ot() ? currentMode : undefined
897
- ```
898
-
899
- ### 12.4 Vim 特有的 UI 行为
900
-
901
- - INSERT 模式下隐藏取消按钮
902
- - INSERT 模式下显示粘贴指示器
903
- - 使用专用输入组件 `Iw7`(vim)vs `IK`(normal)
904
-
905
- ### 12.5 nanoPencil 对标点
906
-
907
- | 特性 | CC | nanoPencil | 差距 |
908
- |------|-----|-----------|------|
909
- | Vim 模式 | ✅ | ❌ | **nanoPencil 缺失** |
910
- | 模式指示器 | ✅ footer | N/A | 缺失 |
911
- | 切换命令 | /vim | N/A | 缺失 |
912
-
913
- ---
914
-
915
- ## 十三、主题与样式系统
916
-
917
- ### 13.1 语义化颜色 Token
918
-
919
- CC 定义了语义化颜色 token:
920
-
921
- ```typescript
922
- const SEMANTIC_COLORS = [
923
- "success", "error", "warning", "permission",
924
- "inactive", "suggestion", "chromeYellow"
925
- ];
926
- ```
927
-
928
- ### 13.2 三种主题
929
-
930
- - **dark** — 暗色主题(默认)
931
- - **light** — 亮色主题
932
- - **ansi** — 纯 ANSI 色(兼容性最好)
933
-
934
- ### 13.3 主题感知组件
935
-
936
- CC 的 Text 和 Box 组件是主题感知的:
937
-
938
- ```typescript
939
- // 主题感知 Text
940
- HN_ / T // 根据当前主题选择颜色
941
-
942
- // 主题感知 Box
943
- jN_ / u // 主题派生的边框/背景色
944
- ```
945
-
946
- ### 13.4 nanoPencil 对标点
947
-
948
- | 特性 | CC | nanoPencil | 差距 |
949
- |------|-----|-----------|------|
950
- | 语义颜色 | 7 个 | 58 个(ThemeColor) | **nanoPencil 更丰富** |
951
- | 主题数量 | 3 种 | 3 种(warm/dark/light) | 等价 |
952
- | 主题变量 | ❌ | ✅ 变量引用 | **nanoPencil 更好** |
953
- | 256 色回退 | ❌ | ✅ | **nanoPencil 更好** |
954
- | 主题验证 | ❌ | ✅ TypeBox schema | **nanoPencil 更好** |
955
-
956
- **结论**:nanoPencil 的主题系统比 CC 更完善,这是优势。
957
-
958
- ---
959
-
960
- ## 十四、终端集成
961
-
962
- ### 14.1 颜色支持检测
963
-
964
- CC 的颜色检测层级:
965
-
966
- ```
967
- FORCE_COLOR 环境变量 (0-3)
968
-
969
- color=16m/full/truecolor → Level 3 (1600 万色)
970
-
971
- color=256 → Level 2 (256 色)
972
-
973
- CI 环境 → Level 1
974
-
975
- TERM_PROGRAM 检测(iTerm2 v3+ → L3, Apple Terminal → L2)
976
-
977
- TERM 模式匹配 → Level 1
978
-
979
- COLORTERM 存在 → Level 1
980
- ```
981
-
982
- 输出格式:`{ level: number, hasBasic: boolean, has256: boolean, has16m: boolean }`
983
-
984
- ### 14.2 图片协议
985
-
986
- CC 支持的终端图片协议:
987
-
988
- | 终端 | 协议 |
989
- |------|------|
990
- | iTerm2 | OSC 9/1337 内联图片 |
991
- | Kitty | Kitty graphics protocol |
992
- | WezTerm | 兼容 Kitty |
993
- | Ghostty | 兼容 Kitty(v1.2.0+) |
994
- | tmux | 透传 |
995
- | Windows Terminal | 兼容 |
996
- | VS Code | 兼容 |
997
-
998
- ### 14.3 剪贴板
999
-
1000
- **OSC52 协议**:
1001
- ```typescript
1002
- // 通用剪贴板写入
1003
- sP(CLIPBOARD, "c", base64data)
1004
- ```
1005
-
1006
- **平台特定命令**:
1007
- - macOS: `pbcopy` / `pbpaste`
1008
- - Linux X11: `xclip -selection clipboard`
1009
- - Linux Wayland: `wl-copy` / `wl-paste`
1010
- - Windows: `clip`
1011
-
1012
- **Tmux 穿透**:
1013
- ```typescript
1014
- // tmux 中包装 OSC52
1015
- `ESC Ptmux; ${escapeSequence} ESC \`
1016
- ```
1017
-
1018
- **图片剪贴板**:
1019
- - macOS: `osascript -e 'the clipboard as <<class PNGf>>'`
1020
- - Linux: `xclip -selection clipboard -t image/png -o`
1021
-
1022
- ### 14.4 终端模式设置
1023
-
1024
- CC 在 raw mode 启用时设置:
1025
-
1026
- ```typescript
1027
- // 启用
1028
- CSI ? 25 h // 显示光标
1029
- CSI ? 1049 h // 备用屏幕
1030
- CSI ? 1006 h // SGR 鼠标追踪
1031
- CSI ? 2004 h // 括号粘贴
1032
-
1033
- // 禁用(恢复)
1034
- CSI ? 25 l
1035
- CSI ? 1049 l
1036
- CSI ? 1006 l
1037
- CSI ? 2004 l
1038
- ```
1039
-
1040
- ### 14.5 超链接支持
1041
-
1042
- CC 检测终端是否支持可点击超链接:
1043
- - 检查 `no-hyperlink`、`hyperlink=false` 标志
1044
- - 检查终端特定支持(iTerm2 v3+, kitty 等)
1045
- - Windows、CI 环境下禁用
1046
-
1047
- ### 14.6 nanoPencil 对标点
1048
-
1049
- | 特性 | CC | nanoPencil | 差距 |
1050
- |------|-----|-----------|------|
1051
- | 颜色检测 | 多层级 | truecolor/256color | 等价 |
1052
- | 图片协议 | 5+ 终端 | Kitty + iTerm2 | 等价 |
1053
- | OSC52 剪贴板 | ✅ | ❌ | **nanoPencil 缺失** |
1054
- | 平台剪贴板 | ✅ | ✅ | 等价 |
1055
- | Tmux 穿透 | ✅ | ❌ | **nanoPencil 缺失** |
1056
- | 鼠标追踪 | ✅ SGR | ✅ Kitty | 等价 |
1057
- | 超链接 | ✅ | ❌ | **nanoPencil 缺失** |
1058
-
1059
- ---
1060
-
1061
- ## 十五、错误展示
1062
-
1063
- ### 15.1 工具错误
1064
-
1065
- 工具执行错误**内联在消息流中**渲染:
1066
-
1067
- ```typescript
1068
- // FYK 函数渲染工具错误
1069
- FYK(toolUseError)
1070
- // 使用 D2 组件显示 renderToolUseErrorMessage() 输出
1071
- ```
1072
-
1073
- ### 15.2 配置错误对话框
1074
-
1075
- ```typescript
1076
- showInvalidConfigDialog({ error })
1077
- // 渲染 N1 对话框:
1078
- // - 标题:"Configuration Error"
1079
- // - 颜色:"error"
1080
- // - 文件路径(粗体)
1081
- // - 错误描述
1082
- // - 两个选项:"Exit and fix manually" / "Reset with default configuration"
1083
- ```
1084
-
1085
- ### 15.3 Rate Limit 错误
1086
-
1087
- 通过 `rate_limits` 字段在状态输出中显示:
1088
- - 5 小时窗口使用率
1089
- - 7 天窗口使用率
1090
- - 重置时间
1091
-
1092
- ### 15.4 网络错误处理
1093
-
1094
- - `handleOAuth401Error` — OAuth 认证过期
1095
- - 连接重试逻辑
1096
- - 降级到手动模式
1097
-
1098
- ### 15.5 nanoPencil 对标点
1099
-
1100
- | 特性 | CC | nanoPencil | 差距 |
1101
- |------|-----|-----------|------|
1102
- | 工具错误 | ✅ 内联 | ✅ 内联 | 等价 |
1103
- | 配置错误对话框 | ✅ | ❌ | **nanoPencil 缺失** |
1104
- | Rate limit 显示 | ✅ | ❌ | **nanoPencil 缺失** |
1105
- | 网络错误 | ✅ 重试 + 降级 | 类似 | 等价 |
1106
-
1107
- ---
1108
-
1109
- ## 十六、会话管理 UI
1110
-
1111
- ### 16.1 /clear 行为
1112
-
1113
- CC 的 `/clear` 命令:
1114
- - 清空对话历史
1115
- - 重置消息列表
1116
- - **不清除会话持久化**(对话可恢复)
1117
- - 视觉上:消息从显示中移除,输入框返回初始状态
1118
-
1119
- ### 16.2 自动压缩
1120
-
1121
- CC 支持自动对话压缩:
1122
-
1123
- ```typescript
1124
- autoCompactEnabled: true, // 默认启用
1125
- autoCompactWindow: "...", // 压缩窗口
1126
- ```
1127
-
1128
- 压缩产生结构化摘要:
1129
- 1. Task Overview
1130
- 2. Current State
1131
- 3. Important Discoveries
1132
- 4. Next Steps
1133
-
1134
- ### 16.3 消息分组
1135
-
1136
- 消息按以下维度分组:
1137
- - Agent/Team 上下文(每个 agent 颜色编码)
1138
- - 工具调用和结果
1139
- - 系统消息 vs 用户/助手消息
1140
-
1141
- ### 16.4 导出功能
1142
-
1143
- CC 的 `/export` 命令使用 `zl8()` 函数将消息渲染为纯文本,支持:
1144
- - 文件导出
1145
- - 剪贴板导出
1146
-
1147
- ### 16.5 nanoPencil 对标点
1148
-
1149
- | 特性 | CC | nanoPencil | 差距 |
1150
- |------|-----|-----------|------|
1151
- | /clear | ✅ | ✅ | 等价 |
1152
- | 自动压缩 | ✅ | ✅ /compact | 等价 |
1153
- | 消息分组 | ✅ 颜色编码 | 类似 | 等价 |
1154
- | 导出 | ✅ /export | ✅ /export | 等价 |
1155
- | 会话树 | ❌ | ✅ /tree /fork | **nanoPencil 更好** |
1156
-
1157
- ---
1158
-
1159
- ## 十七、自动后台化 UI
1160
-
1161
- ### 17.1 同步→异步转换的 UI 反馈
1162
-
1163
- 当子 agent 超过 2 分钟自动转为后台时:
1164
-
1165
- ```
1166
- [Agent] Research API patterns... (running in background)
1167
- Output: .claude/tasks/abc123.output
1168
- ```
1169
-
1170
- ### 17.2 Agent 进度面板
1171
-
1172
- CC 的 agent 进度显示:
1173
- - 最近 3 个 tool use(非 verbose 模式)
1174
- - "Initializing..."(无进度时)
1175
- - verbose 模式下显示全部
1176
-
1177
- ### 17.3 后台任务完成通知
1178
-
1179
- 后台任务完成时通过通知系统提醒:
1180
- ```typescript
1181
- Tt1(taskId, {
1182
- title: "Agent completed",
1183
- status: "completed",
1184
- summary: "Found 3 API patterns"
1185
- });
1186
- ```
1187
-
1188
- ### 17.4 nanoPencil 对标点
1189
-
1190
- | 特性 | CC | nanoPencil | 差距 |
1191
- |------|-----|-----------|------|
1192
- | 自动后台化 | ✅ 2 分钟 | ❌ | **nanoPencil 缺失** |
1193
- | 后台进度 | ✅ 文件输出 | ✅ .md 文件 | 等价 |
1194
- | 完成通知 | ✅ | ✅ | 等价 |
1195
- | 进度面板 | ✅ | 类似 | 等价 |
1196
-
1197
- ---
1198
-
1199
- ## 十八、复刻优先级清单
1200
-
1201
- ### P0(必须复刻)
1202
-
1203
- | 特性 | 理由 | 预估工作量 |
1204
- |------|------|-----------|
1205
- | **权限审批对话框** | 安全基础,CC 核心交互 | 大 |
1206
- | **只读命令自动审批** | 减少审批摩擦 | 中 |
1207
- | **权限模式(default/acceptEdits)** | 审批的前提 | 中 |
1208
-
1209
- ### P1(应该复刻)
1210
-
1211
- | 特性 | 理由 | 预估工作量 | 状态 |
1212
- |------|------|-----------|------|
1213
- | **Spinner tips/verbs 可配置** | 低成本高回报 | 小 | ✅ 已完成 |
1214
- | **通知优先级队列** | 改善信息层次 | 中 | ✅ 已完成 |
1215
- | **Rate limit 显示** | 用户需要知道用量 | 小 | ❌ 未做 |
1216
- | **自定义 statusline** | 高级用户需求 | 小 | ❌ 未做 |
1217
- | **虚拟滚动** | 长对话性能 | 大 | ✅ 已完成 |
1218
- | **配置错误对话框** | 改善错误体验 | 小 | ❌ 未做 |
1219
-
1220
- ### P2(可以复刻)
1221
-
1222
- | 特性 | 理由 | 预估工作量 |
1223
- |------|------|-----------|
1224
- | **Vim 模式** | 特定用户群需求 | 大 |
1225
- | **Auto mode 分类器** | 需要 ML 模型 | 大 |
1226
- | **词级 diff** | 改善 diff 可读性 | 中 |
1227
- | **OSC52 剪贴板** | 远程终端需求 | 小 |
1228
- | **超链接支持** | 改善可点击性 | 小 |
1229
- | **桌面通知** | 后台任务提醒 | 中 |
1230
-
1231
- ---
1232
-
1233
- ## 十九、差异对比总结表
1234
-
1235
- | 维度 | CC | nanoPencil | 谁更好 |
1236
- |------|-----|-----------|--------|
1237
- | **TUI 框架** | Ink/React + Yoga | 自研 Component 树 | 各有优劣 |
1238
- | **输入处理** | 自定义 VT 解析器 | StdinBuffer + Kitty 协议 | nanoPencil |
1239
- | **快捷键体系** | 18 个上下文 | Controller 级隔离 | CC 更细粒度 |
1240
- | **Slash 命令** | 30+ / 3 种类型 | 30+ / 2 种类型 | CC(有 local-jsx) |
1241
- | **权限审批** | ✅ 完整 UI | ❌ 无 | **CC 大幅领先** |
1242
- | **消息渲染** | 6 种渲染器 | 类似 | 等价 |
1243
- | **Markdown** | 终端原生 | marked + highlight | 等价 |
1244
- | **Spinner** | 可配置 tips/verbs | Stall 检测 + tips 轮换 | 各有优劣 |
1245
- | **状态栏** | model/token/cost | model/token/cost/context/branch | nanoPencil |
1246
- | **通知** | 4 级优先级 + 多渠道 | 4 级优先级队列 + 自动消失 | 等价(缺多渠道) |
1247
- | **Diff 引擎** | 4 级(字符/词/行/数组) | 行级 + 词级 | CC |
1248
- | **Vim 模式** | ✅ | ❌ | CC |
1249
- | **主题系统** | 7 色 token / 3 主题 | 58 色 token / 3 主题 | **nanoPencil** |
1250
- | **终端集成** | OSC52 + 多终端 | Kitty + iTerm2 | CC |
1251
- | **会话管理** | /clear /compact | /clear /compact /tree /fork | nanoPencil |
1252
- | **虚拟滚动** | ✅ renderRange | ✅ CachedContainer | 等价 |
1253
-
1254
- ---
1255
-
1256
- ## 二十、关键源码位置
1257
-
1258
- | 组件 | CC 源码位置(cli.js 函数名) |
1259
- |------|-------------------------------|
1260
- | 键解析器 | `G64()` — 字节级状态机 |
1261
- | 修饰键检测 | `P64()` — 位掩码解析 |
1262
- | 鼠标事件 | `D64()` — SGR/X10 解析 |
1263
- | 键码映射 | `W64()` — code → name |
1264
- | React 键绑定 | `J1()` — action 注册 |
1265
- | 键绑定上下文 | `ph8` — KeyBindingsProvider |
1266
- | 默认键绑定 | `ky6()` — 默认定义数组 |
1267
- | 动作列表 | `MU1()` — 可用 actions |
1268
- | 不可重绑定键 | `Ot6()`, `jU1()`, `HU1()` |
1269
- | 权限检查入口 | `OP()` — 主权限检查 |
1270
- | 权限评估 | `yJY()` — 完整评估 |
1271
- | 工具权限 | `m0K()` — 轻量检查 |
1272
- | 只读检测 | `QL8()` — bash 命令安全检查 |
1273
- | Auto 分类器 | `TS8()` — ML 模型调用 |
1274
- | Spinner | `CK` — 动画组件 |
1275
- | Agent 进度 | `Fm8()` — 进度渲染 |
1276
- | Transcript | `PM6()` — 消息列表 |
1277
- | 用户消息渲染 | `Z9K()` |
1278
- | 助手消息渲染 | `I9K()` |
1279
- | 思考渲染 | `Su8()` |
1280
- | Bash 渲染 | `PH6()`, `g9K()` |
1281
- | 工具错误渲染 | `FYK()` |
1282
- | 配置错误对话框 | `showInvalidConfigDialog()` |
1283
- | Diff 基类 | `Zo` — Myers 算法 |
1284
- | 词级 diff | `aM4` — Intl segmenter |
1285
- | 行级 diff | `sM4` |
1286
- | Unified diff | `oV6()` — patch 生成 |
1287
- | 通知系统 | `PK` — useNotifications hook |
1288
- | 状态输出 | lines ~1170-1198 |
1289
- | 命令注册 | `Ow()` |
1290
- | 命令列表 | `dUK()`, `cUK()` |
1291
- | 颜色检测 | supports-color 模块 |
1292
- | 剪贴板 | `mk_()` — 平台命令 |
1293
- | OSC52 | `sP()` — 终端转义 |
1294
- | Tmux 穿透 | `Ik_()` |
1295
- | 终端模式 | raw mode enable/disable |
1296
- | Footer | `beK()` |
1297
- | 导出 | `zl8()` |
1298
-
1299
- ---
1300
-
1301
- ## 二十一、剩余差距总览(2026-06 更新)
1302
-
1303
- 经过近期改进(spinner tips、状态自动消失、通知优先级队列、虚拟滚动、slash 命令高亮、word-level diff),nanoPencil 与 CC 的 TUI 差距已大幅缩小。
1304
-
1305
- ### 仍缺失(按优先级)
1306
-
1307
- | 优先级 | 特性 | 说明 | 工作量 |
1308
- |--------|------|------|--------|
1309
- | **P0** | 权限审批对话框 | CC 核心交互,nanoPencil 完全没有 | 大 |
1310
- | **P0** | 只读命令自动审批 | cat/ls/grep 等自动通过 | 中 |
1311
- | **P0** | 权限模式 | default/acceptEdits/auto | 中 |
1312
- | P1 | Rate limit 显示 | footer 加 5h/7d 用量 | 小 |
1313
- | P1 | 自定义 statusline | shell 脚本注入 | 小 |
1314
- | P1 | 配置错误对话框 | 配置损坏时交互式修复 | 小 |
1315
- | P2 | Vim 模式 | INSERT/NORMAL 子模式 | 大 |
1316
- | P2 | OSC52 剪贴板 | 远程终端支持 | 小 |
1317
- | P2 | 桌面通知 | iTerm2/Kitty OSC 集成 | 中 |
1318
- | P2 | @ 文件引用 | 输入框中 @path 引用文件 | 中 |
1319
-
1320
- ### 已追平或领先
1321
-
1322
- | 特性 | 状态 | 说明 |
1323
- |------|------|------|
1324
- | 输入系统 | **nanoPencil 领先** | Kitty 协议 > CC 的 VT 解析 |
1325
- | 主题系统 | **nanoPencil 领先** | 58 色 token > CC 的 7 色 |
1326
- | 状态栏 | **nanoPencil 领先** | git 分支 + session 名 + 进度条 |
1327
- | 会话管理 | **nanoPencil 领先** | /tree /fork > CC |
1328
- | Spinner | 已追平 | stall 检测 + tips 轮换 |
1329
- | 通知系统 | 已追平 | 4 级优先级 + 自动消失 + key 去重 |
1330
- | 虚拟滚动 | 已追平 | CachedContainer 渲染缓存 + 视口裁剪 |
1331
- | Slash 命令高亮 | 已追平 | 输入框内 /command 高亮 |
1332
- | Diff 引擎 | 已追平 | 行级 + 词级 diff |
1333
- | Slash 命令 Tab 补全 | **nanoPencil 领先** | 含参数级补全 |