cc-viewer 1.6.97 → 1.6.98

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 (85) hide show
  1. package/cli.js +6 -1
  2. package/concepts/ar/GlobalSettings.md +232 -0
  3. package/concepts/da/GlobalSettings.md +232 -0
  4. package/concepts/de/GlobalSettings.md +232 -0
  5. package/concepts/en/GlobalSettings.md +232 -0
  6. package/concepts/es/GlobalSettings.md +232 -0
  7. package/concepts/fr/GlobalSettings.md +232 -0
  8. package/concepts/it/GlobalSettings.md +232 -0
  9. package/concepts/ja/GlobalSettings.md +232 -0
  10. package/concepts/ko/GlobalSettings.md +232 -0
  11. package/concepts/no/GlobalSettings.md +232 -0
  12. package/concepts/pl/GlobalSettings.md +232 -0
  13. package/concepts/pt-BR/GlobalSettings.md +232 -0
  14. package/concepts/ru/GlobalSettings.md +232 -0
  15. package/concepts/th/GlobalSettings.md +232 -0
  16. package/concepts/tr/GlobalSettings.md +232 -0
  17. package/concepts/uk/GlobalSettings.md +232 -0
  18. package/concepts/zh/GlobalSettings.md +232 -0
  19. package/concepts/zh-TW/GlobalSettings.md +232 -0
  20. package/dist/assets/App-D9tbz6gh.js +39 -0
  21. package/dist/assets/{AppHeader-CmLos5-f.css → AppHeader-CoP_9OY5.css} +1 -1
  22. package/dist/assets/{AppHeader.module-CTBJwgrr.js → AppHeader.module-NjKaHOFk.js} +93 -93
  23. package/dist/assets/{Mobile-AicWwDuy.js → Mobile-Kzk2YO-c.js} +1 -1
  24. package/dist/assets/{_basePickBy-BWXOF6Ri.js → _basePickBy-DloMkc-G.js} +1 -1
  25. package/dist/assets/{_baseUniq-CtBh9QNw.js → _baseUniq-DS0g4orB.js} +1 -1
  26. package/dist/assets/{arc-BZEM3DMb.js → arc-DjVGcsRC.js} +1 -1
  27. package/dist/assets/{architectureDiagram-2XIMDMQ5-BcsqHztP.js → architectureDiagram-2XIMDMQ5-C78NysdK.js} +1 -1
  28. package/dist/assets/{blockDiagram-WCTKOSBZ-xKCLQIlA.js → blockDiagram-WCTKOSBZ-D1eulsBg.js} +1 -1
  29. package/dist/assets/{c4Diagram-IC4MRINW-BMTzjp_O.js → c4Diagram-IC4MRINW-D_vDMNpu.js} +1 -1
  30. package/dist/assets/channel-DMPi3tRx.js +1 -0
  31. package/dist/assets/{chunk-4BX2VUAB-cu74dN32.js → chunk-4BX2VUAB-DvydnNaE.js} +1 -1
  32. package/dist/assets/{chunk-55IACEB6-Cn5pJZI7.js → chunk-55IACEB6-CAEBnB2g.js} +1 -1
  33. package/dist/assets/{chunk-FMBD7UC4-ClJXAago.js → chunk-FMBD7UC4-Ic2AFusw.js} +1 -1
  34. package/dist/assets/{chunk-JSJVCQXG-CvsqFIVj.js → chunk-JSJVCQXG-B6Pf0kWF.js} +1 -1
  35. package/dist/assets/{chunk-KX2RTZJC-By2tUg3C.js → chunk-KX2RTZJC-aqNHjszh.js} +1 -1
  36. package/dist/assets/{chunk-NQ4KR5QH-ryihu0iB.js → chunk-NQ4KR5QH-BRcgqkZb.js} +1 -1
  37. package/dist/assets/{chunk-QZHKN3VN-CkLeF_JG.js → chunk-QZHKN3VN-Dg6rNEne.js} +1 -1
  38. package/dist/assets/{chunk-WL4C6EOR-DGZ_HPlH.js → chunk-WL4C6EOR-BQztZi27.js} +1 -1
  39. package/dist/assets/classDiagram-VBA2DB6C-B6fMcVCH.js +1 -0
  40. package/dist/assets/classDiagram-v2-RAHNMMFH-B6fMcVCH.js +1 -0
  41. package/dist/assets/clone-NPdkGfRa.js +1 -0
  42. package/dist/assets/{cose-bilkent-S5V4N54A-Bug5hL7O.js → cose-bilkent-S5V4N54A-CpNbxUgF.js} +1 -1
  43. package/dist/assets/{dagre-KLK3FWXG-Bp95f3av.js → dagre-KLK3FWXG-DMV6CAiu.js} +1 -1
  44. package/dist/assets/{diagram-E7M64L7V-BnJcznPG.js → diagram-E7M64L7V-CzQpTBkT.js} +1 -1
  45. package/dist/assets/{diagram-IFDJBPK2-DTa6uDlT.js → diagram-IFDJBPK2-n98W4lW5.js} +1 -1
  46. package/dist/assets/{diagram-P4PSJMXO-BNjVizvt.js → diagram-P4PSJMXO-Da-Dxb0d.js} +1 -1
  47. package/dist/assets/{erDiagram-INFDFZHY-DeYo5Exx.js → erDiagram-INFDFZHY-DV6WDsOa.js} +1 -1
  48. package/dist/assets/{flowDiagram-PKNHOUZH-D8Rh5RJD.js → flowDiagram-PKNHOUZH-uPCoTO1u.js} +1 -1
  49. package/dist/assets/{ganttDiagram-A5KZAMGK-DZ0z2OiO.js → ganttDiagram-A5KZAMGK-C18veywB.js} +1 -1
  50. package/dist/assets/{gitGraphDiagram-K3NZZRJ6-DsoU0UJ3.js → gitGraphDiagram-K3NZZRJ6-CRgTEgJX.js} +1 -1
  51. package/dist/assets/{graph-FtHGSVXM.js → graph-E73hSxND.js} +1 -1
  52. package/dist/assets/{index-yvprqgUP.js → index-C7N4gnFf.js} +2 -2
  53. package/dist/assets/{infoDiagram-LFFYTUFH-BWptl6Gm.js → infoDiagram-LFFYTUFH-X_hBGUL2.js} +1 -1
  54. package/dist/assets/{ishikawaDiagram-PHBUUO56-DTN7vdFN.js → ishikawaDiagram-PHBUUO56-CUIYqfv2.js} +1 -1
  55. package/dist/assets/{journeyDiagram-4ABVD52K-C6rSfKFW.js → journeyDiagram-4ABVD52K-Ja_oFdN5.js} +1 -1
  56. package/dist/assets/{kanban-definition-K7BYSVSG-7zlzYuQI.js → kanban-definition-K7BYSVSG-CoxZi981.js} +1 -1
  57. package/dist/assets/{layout-DetVF_Xi.js → layout-CxyNCowe.js} +1 -1
  58. package/dist/assets/{linear-D7AP5ZM2.js → linear-BvMEMoa5.js} +1 -1
  59. package/dist/assets/{mermaid.core-BF7AL9QP.js → mermaid.core-yxi-tJV1.js} +4 -4
  60. package/dist/assets/{mindmap-definition-YRQLILUH-BAEZ_Kww.js → mindmap-definition-YRQLILUH-D0an_YiX.js} +1 -1
  61. package/dist/assets/{pieDiagram-SKSYHLDU-CTRIrNJJ.js → pieDiagram-SKSYHLDU-2_qKTz49.js} +1 -1
  62. package/dist/assets/{quadrantDiagram-337W2JSQ-DcUVHBRU.js → quadrantDiagram-337W2JSQ-DEdMIEZ6.js} +1 -1
  63. package/dist/assets/{requirementDiagram-Z7DCOOCP-nMrfF214.js → requirementDiagram-Z7DCOOCP-D34qZwqS.js} +1 -1
  64. package/dist/assets/{sankeyDiagram-WA2Y5GQK-BKM2oKi0.js → sankeyDiagram-WA2Y5GQK-CuWEPTrY.js} +1 -1
  65. package/dist/assets/{sequenceDiagram-2WXFIKYE-DcJnjEps.js → sequenceDiagram-2WXFIKYE-C_j_NZww.js} +1 -1
  66. package/dist/assets/{stateDiagram-RAJIS63D--wjhber7.js → stateDiagram-RAJIS63D-BQMmW3qX.js} +1 -1
  67. package/dist/assets/stateDiagram-v2-FVOUBMTO-C_b_318T.js +1 -0
  68. package/dist/assets/{timeline-definition-YZTLITO2-BzEHHLxX.js → timeline-definition-YZTLITO2-CQlUZTgI.js} +1 -1
  69. package/dist/assets/{treemap-KZPCXAKY-BKg_1Uvh.js → treemap-KZPCXAKY-Df9Nkrlt.js} +1 -1
  70. package/dist/assets/{vennDiagram-LZ73GAT5-BKfBvDlz.js → vennDiagram-LZ73GAT5-CaXvJV8t.js} +1 -1
  71. package/dist/assets/{xychartDiagram-JWTSCODW-2O6N9OtR.js → xychartDiagram-JWTSCODW-BWwflUcf.js} +1 -1
  72. package/dist/index.html +1 -1
  73. package/findcc.js +17 -1
  74. package/lib/perm-bridge.js +7 -6
  75. package/lib/plugin-loader.js +13 -12
  76. package/lib/sdk-manager.js +2 -2
  77. package/package.json +1 -1
  78. package/server.js +25 -14
  79. package/workspace-registry.js +11 -10
  80. package/dist/assets/App-BlTt-0pD.js +0 -39
  81. package/dist/assets/channel-UwYsH-gK.js +0 -1
  82. package/dist/assets/classDiagram-VBA2DB6C-BJV4gG6V.js +0 -1
  83. package/dist/assets/classDiagram-v2-RAHNMMFH-BJV4gG6V.js +0 -1
  84. package/dist/assets/clone-CjbFDS02.js +0 -1
  85. package/dist/assets/stateDiagram-v2-FVOUBMTO-BjJCClaV.js +0 -1
package/cli.js CHANGED
@@ -292,7 +292,8 @@ function ensureHooks() {
292
292
  const permBridgePath = resolve(__dirname, 'lib', 'perm-bridge.js');
293
293
  const permCmd = `node "${permBridgePath}"`;
294
294
  const permMatcher = '';
295
- // Clean up legacy entries: old narrow matchers, null matchers (invalid JSON)
295
+ // Clean up legacy entries: old narrow matchers, null matchers (invalid JSON),
296
+ // and conflicting Bash-specific hooks (git guard now merged into perm-bridge.js)
296
297
  for (let i = settings.hooks.PreToolUse.length - 1; i >= 0; i--) {
297
298
  const h = settings.hooks.PreToolUse[i];
298
299
  const cmd = h.hooks?.[0]?.command || '';
@@ -302,6 +303,10 @@ function ensureHooks() {
302
303
  } else if ((h.matcher === null || h.matcher === undefined) && cmd.includes('perm-bridge.js')) {
303
304
  settings.hooks.PreToolUse.splice(i, 1);
304
305
  changed = true;
306
+ } else if (h.matcher === 'Bash' && cmd.includes('grep') && /git|npm/.test(cmd)) {
307
+ // Remove legacy standalone Bash git/npm guard — now handled inside perm-bridge.js
308
+ settings.hooks.PreToolUse.splice(i, 1);
309
+ changed = true;
305
310
  }
306
311
  }
307
312
  const permExisting = settings.hooks.PreToolUse.find(h => h.matcher === permMatcher);
@@ -0,0 +1,232 @@
1
+ # CC-Viewer 全局配置参考
2
+
3
+ ## 一、全局设置面板(UI)
4
+
5
+ 通过左上角菜单 → "全局设置" 打开。
6
+
7
+ | 配置项 | 类型 | 默认值 | 说明 |
8
+ |--------|------|--------|------|
9
+ | 过滤无关请求 | 开关 | 开 | 隐藏心跳、count_tokens、子代理等非主代理请求 |
10
+ | 默认展开 Body Diff JSON | 开关 | 关 | 请求详情面板中的 Body Diff 区域默认展开 |
11
+ | 日志目录设置 | 文本输入 | `~/.claude/cc-viewer` | 项目日志的读写根目录,支持 `~/` 展开。修改后回车或失焦保存,立即生效 |
12
+
13
+ ## 二、显示设置面板(UI)
14
+
15
+ 通过左上角菜单 → "显示设置" 打开。
16
+
17
+ | 配置项 | 类型 | 默认值 | 说明 |
18
+ |--------|------|--------|------|
19
+ | 折叠工具结果 | 开关 | 开 | 聊天视图中折叠工具调用结果块 |
20
+ | 展开思考过程 | 开关 | 开 | 默认展开 Claude 的思考/推理过程块 |
21
+ | 完整展示所有内容 | 开关 | 关 | 显示完整的工具调用内容,不截断 |
22
+ | 自动恢复会话 | 开关 + 选项 | 关 | 遇到会话恢复提示时自动选择:`继续` 或 `新建` |
23
+
24
+ ## 三、偏好设置文件
25
+
26
+ 所有 UI 设置持久化到 `<日志目录>/preferences.json`,通过 `/api/preferences` 接口读写。
27
+
28
+ ```json
29
+ {
30
+ "lang": "zh",
31
+ "filterIrrelevant": true,
32
+ "expandDiff": false,
33
+ "collapseToolResults": true,
34
+ "expandThinking": true,
35
+ "showFullToolContent": false,
36
+ "logDir": "~/.claude/cc-viewer",
37
+ "resumeAutoChoice": null,
38
+ "disabledPlugins": [],
39
+ "presetShortcuts": []
40
+ }
41
+ ```
42
+
43
+ | 字段 | 类型 | 说明 |
44
+ |------|------|------|
45
+ | `lang` | string | 界面语言(zh/en/zh-TW/ko/ja/de/es/fr/it/da/pl/ru/ar/no/pt-BR/th/tr/uk) |
46
+ | `filterIrrelevant` | boolean | 过滤无关请求 |
47
+ | `expandDiff` | boolean | 默认展开 Body Diff JSON |
48
+ | `collapseToolResults` | boolean | 折叠工具结果 |
49
+ | `expandThinking` | boolean | 展开思考过程 |
50
+ | `showFullToolContent` | boolean | 完整展示内容 |
51
+ | `logDir` | string | 日志目录路径 |
52
+ | `resumeAutoChoice` | null / "continue" / "new" | 自动恢复会话选择 |
53
+ | `disabledPlugins` | string[] | 已禁用的插件文件名列表 |
54
+ | `presetShortcuts` | array | Agent Team 快捷指令预设 |
55
+
56
+ ## 四、环境变量
57
+
58
+ ### CC-Viewer 专有
59
+
60
+ | 变量名 | 默认值 | 说明 |
61
+ |--------|--------|------|
62
+ | `CCV_LOG_DIR` | `~/.claude/cc-viewer` | 日志存储根目录。特殊值:`tmp`/`temp` 使用系统临时目录 |
63
+ | `CCV_CLI_MODE` | 未设置 | `=1` 启用 CLI 模式(PTY 终端) |
64
+ | `CCV_SDK_MODE` | 未设置 | `=1` 启用 Agent SDK 模式(无终端) |
65
+ | `CCV_WORKSPACE_MODE` | 未设置 | `=1` 启用工作空间选择模式 |
66
+ | `CCV_PROJECT_DIR` | `process.cwd()` | 项目工作目录,用于文件操作和 Git 命令 |
67
+ | `CCV_PROXY_PORT` | 未设置 | 本地 MITM 代理端口 |
68
+ | `CCV_BYPASS_PERMISSIONS` | 未设置 | `=1` 跳过工具权限审批(配合 `--dangerously-skip-permissions`) |
69
+ | `CCV_DISABLE_DELTA` | 未设置 | `=1` 禁用增量日志存储,每次写入完整消息 |
70
+ | `CCV_DEBUG` | 未设置 | `=1` 启用 HTTP 代理调试日志 |
71
+ | `CCV_DEBUG_PLUGINS` | 未设置 | `=1` 启用插件加载调试日志 |
72
+
73
+ ### 内部 IPC
74
+
75
+ | 变量名 | 说明 |
76
+ |--------|------|
77
+ | `CCVIEWER_PORT` | 服务端口,供 ask-bridge/perm-bridge 通信 |
78
+ | `CCV_EDITOR_PORT` | 服务端口,供 ccv-editor 文件编辑桥接 |
79
+
80
+ ### 外部变量(读取)
81
+
82
+ | 变量名 | 说明 |
83
+ |--------|------|
84
+ | `ANTHROPIC_BASE_URL` | 自定义 Anthropic API 地址 |
85
+ | `SHELL` | 用户 Shell(PTY 启动和 Shell 配置检测) |
86
+ | `http_proxy` / `HTTPS_PROXY` 等 | HTTP 代理配置(通过 undici EnvHttpProxyAgent) |
87
+
88
+ ## 五、CLI 命令参数
89
+
90
+ ```
91
+ ccv [选项] [claude 参数...]
92
+ ```
93
+
94
+ ### CC-Viewer 专有选项
95
+
96
+ | 参数 | 说明 |
97
+ |------|------|
98
+ | `-logger` | 安装/修复 Claude Code hooks |
99
+ | `--uninstall` / `-uninstall` | 卸载所有 CC-Viewer 集成 |
100
+ | `--help` / `-h` / `help` | 显示帮助信息 |
101
+ | `--version` / `-v` | 显示版本号 |
102
+ | `-SDK` / `--sdk` | 使用 Agent SDK 模式 |
103
+ | `--d` | `--dangerously-skip-permissions` 简写 |
104
+ | `--ad` | `--allow-dangerously-skip-permissions` 简写 |
105
+ | `run` | 通过代理运行命令(`ccv run -- claude ...`) |
106
+
107
+ ### Claude 透传参数(常用)
108
+
109
+ | 参数 | 说明 |
110
+ |------|------|
111
+ | `-c` / `--continue` | 继续上一次会话 |
112
+ | `-r` / `--resume` | 恢复指定会话 |
113
+ | `-p` / `--print` | 非交互式输出 |
114
+ | `--model` | 指定模型 |
115
+ | `--permission-mode` | 权限模式 |
116
+ | `--system-prompt` | 自定义系统提示词 |
117
+ | `--max-budget-usd` | 最大预算 |
118
+
119
+ ## 六、Hook 配置
120
+
121
+ CC-Viewer 自动注册到 `~/.claude/settings.json` 的 `hooks.PreToolUse` 中:
122
+
123
+ ### 1. AskUserQuestion 桥接
124
+ - **匹配器**: `"AskUserQuestion"`
125
+ - **命令**: `node <安装目录>/lib/ask-bridge.js`
126
+ - **作用**: 将 Claude 的问题转发到 Web UI,等待用户回答
127
+
128
+ ### 2. 权限审批桥接
129
+ - **匹配器**: `""` (空 = 匹配所有工具)
130
+ - **命令**: `node <安装目录>/lib/perm-bridge.js`
131
+ - **作用**: 仅 `Bash`/`Edit`/`Write`/`NotebookEdit` 需要 Web UI 审批,其余自动放行
132
+
133
+ ## 七、Shell 集成
134
+
135
+ CC-Viewer 在 `~/.zshrc`(或 `.bashrc`)中注入 `claude()` 函数:
136
+
137
+ ```bash
138
+ # >>> CC-Viewer Auto-Inject >>>
139
+ claude() { ... }
140
+ # <<< CC-Viewer Auto-Inject <<<
141
+ ```
142
+
143
+ 所有 `claude` 命令自动通过 CC-Viewer 代理,实现日志捕获和 Web UI 功能。
144
+
145
+ 卸载:`ccv --uninstall` 或手动删除标记之间的内容。
146
+
147
+ ## 八、代理配置(Proxy Profile)
148
+
149
+ 存储在 `<日志目录>/profile.json`,通过 UI 的"代理切换"面板管理。
150
+
151
+ ```json
152
+ {
153
+ "active": "max",
154
+ "profiles": [
155
+ { "id": "max", "name": "Default" },
156
+ { "id": "my-proxy", "name": "自定义", "baseURL": "https://...", "apiKey": "sk-..." }
157
+ ]
158
+ }
159
+ ```
160
+
161
+ | 字段 | 说明 |
162
+ |------|------|
163
+ | `active` | 当前激活的配置 ID(`"max"` = 直连,无代理) |
164
+ | `id` | 唯一标识 |
165
+ | `name` | 显示名称 |
166
+ | `baseURL` | 代理 API 地址(替换请求 origin) |
167
+ | `apiKey` | 代理 API 密钥(替换认证头) |
168
+ | `models` | 可用模型列表 |
169
+ | `activeModel` | 当前选中的模型 |
170
+
171
+ ## 九、插件系统
172
+
173
+ 插件目录:`<日志目录>/plugins/`
174
+
175
+ ### 支持的 Hook 类型
176
+
177
+ | Hook | 类型 | 说明 |
178
+ |------|------|------|
179
+ | `httpsOptions` | 瀑布 | 提供 HTTPS 证书(返回 `{ cert, key }` 或 `{ pfx }`) |
180
+ | `localUrl` | 瀑布 | 修改本地访问 URL |
181
+ | `serverStarted` | 并行 | 服务器启动通知 |
182
+ | `serverStopping` | 并行 | 服务器停止通知 |
183
+ | `onNewEntry` | 并行 | 新日志条目写入通知 |
184
+
185
+ 插件启用/禁用通过 `preferences.json` 的 `disabledPlugins` 数组管理。
186
+
187
+ ## 十、目录结构
188
+
189
+ ```
190
+ ~/.claude/cc-viewer/ # 日志根目录
191
+ ├── preferences.json # 用户偏好设置
192
+ ├── workspaces.json # 工作空间注册表
193
+ ├── profile.json # 代理配置
194
+ ├── plugins/ # 插件目录
195
+ │ └── my-plugin.js
196
+ ├── <项目名>/ # 每个项目的日志目录
197
+ │ ├── <项目名>_20260404_123456.jsonl # JSONL 日志文件
198
+ │ ├── <项目名>.json # 统计数据(后台生成)
199
+ │ └── images/ # 上传图片的持久副本
200
+ └── ...
201
+
202
+ /tmp/cc-viewer-uploads/ # 临时上传文件目录
203
+ ```
204
+
205
+ ## 十一、服务器配置
206
+
207
+ | 配置 | 值 | 说明 |
208
+ |------|-----|------|
209
+ | 端口范围 | 7008-7099 | 自动扫描可用端口 |
210
+ | 绑定地址 | 0.0.0.0 | 所有网络接口 |
211
+ | 访问令牌 | 随机 16 字节 hex | 局域网访问需要 `?token=xxx`,本机免认证 |
212
+ | HTTPS | 仅通过插件 | 需要插件提供 `httpsOptions` hook |
213
+ | CORS | `*` | 允许所有来源 |
214
+ | 上传限制 | 50MB | 单文件最大上传大小 |
215
+
216
+ ## 十二、URL 参数
217
+
218
+ | 参数 | 说明 |
219
+ |------|------|
220
+ | `?token=xxx` | 局域网访问认证令牌 |
221
+ | `?logfile=path` | 打开指定历史日志文件(只读模式) |
222
+
223
+ ## 十三、localStorage 配置
224
+
225
+ | 键 | 说明 |
226
+ |-----|------|
227
+ | `ccv_cacheExpireAt` | 缓存倒计时到期时间 |
228
+ | `ccv_cacheType` | 缓存类型标签 |
229
+ | `ccv_sseSlim` | 启用 SSE 增量裁剪(桌面端性能优化) |
230
+ | `ccv_calibrationModel` | KV-Cache 上下文窗口校准模型 |
231
+ | `ccv_fileExplorerOpen` | 文件浏览器面板开关 |
232
+ | `cc-viewer-terminal-width` | 终端面板宽度(像素) |
@@ -0,0 +1,232 @@
1
+ # CC-Viewer 全局配置参考
2
+
3
+ ## 一、全局设置面板(UI)
4
+
5
+ 通过左上角菜单 → "全局设置" 打开。
6
+
7
+ | 配置项 | 类型 | 默认值 | 说明 |
8
+ |--------|------|--------|------|
9
+ | 过滤无关请求 | 开关 | 开 | 隐藏心跳、count_tokens、子代理等非主代理请求 |
10
+ | 默认展开 Body Diff JSON | 开关 | 关 | 请求详情面板中的 Body Diff 区域默认展开 |
11
+ | 日志目录设置 | 文本输入 | `~/.claude/cc-viewer` | 项目日志的读写根目录,支持 `~/` 展开。修改后回车或失焦保存,立即生效 |
12
+
13
+ ## 二、显示设置面板(UI)
14
+
15
+ 通过左上角菜单 → "显示设置" 打开。
16
+
17
+ | 配置项 | 类型 | 默认值 | 说明 |
18
+ |--------|------|--------|------|
19
+ | 折叠工具结果 | 开关 | 开 | 聊天视图中折叠工具调用结果块 |
20
+ | 展开思考过程 | 开关 | 开 | 默认展开 Claude 的思考/推理过程块 |
21
+ | 完整展示所有内容 | 开关 | 关 | 显示完整的工具调用内容,不截断 |
22
+ | 自动恢复会话 | 开关 + 选项 | 关 | 遇到会话恢复提示时自动选择:`继续` 或 `新建` |
23
+
24
+ ## 三、偏好设置文件
25
+
26
+ 所有 UI 设置持久化到 `<日志目录>/preferences.json`,通过 `/api/preferences` 接口读写。
27
+
28
+ ```json
29
+ {
30
+ "lang": "zh",
31
+ "filterIrrelevant": true,
32
+ "expandDiff": false,
33
+ "collapseToolResults": true,
34
+ "expandThinking": true,
35
+ "showFullToolContent": false,
36
+ "logDir": "~/.claude/cc-viewer",
37
+ "resumeAutoChoice": null,
38
+ "disabledPlugins": [],
39
+ "presetShortcuts": []
40
+ }
41
+ ```
42
+
43
+ | 字段 | 类型 | 说明 |
44
+ |------|------|------|
45
+ | `lang` | string | 界面语言(zh/en/zh-TW/ko/ja/de/es/fr/it/da/pl/ru/ar/no/pt-BR/th/tr/uk) |
46
+ | `filterIrrelevant` | boolean | 过滤无关请求 |
47
+ | `expandDiff` | boolean | 默认展开 Body Diff JSON |
48
+ | `collapseToolResults` | boolean | 折叠工具结果 |
49
+ | `expandThinking` | boolean | 展开思考过程 |
50
+ | `showFullToolContent` | boolean | 完整展示内容 |
51
+ | `logDir` | string | 日志目录路径 |
52
+ | `resumeAutoChoice` | null / "continue" / "new" | 自动恢复会话选择 |
53
+ | `disabledPlugins` | string[] | 已禁用的插件文件名列表 |
54
+ | `presetShortcuts` | array | Agent Team 快捷指令预设 |
55
+
56
+ ## 四、环境变量
57
+
58
+ ### CC-Viewer 专有
59
+
60
+ | 变量名 | 默认值 | 说明 |
61
+ |--------|--------|------|
62
+ | `CCV_LOG_DIR` | `~/.claude/cc-viewer` | 日志存储根目录。特殊值:`tmp`/`temp` 使用系统临时目录 |
63
+ | `CCV_CLI_MODE` | 未设置 | `=1` 启用 CLI 模式(PTY 终端) |
64
+ | `CCV_SDK_MODE` | 未设置 | `=1` 启用 Agent SDK 模式(无终端) |
65
+ | `CCV_WORKSPACE_MODE` | 未设置 | `=1` 启用工作空间选择模式 |
66
+ | `CCV_PROJECT_DIR` | `process.cwd()` | 项目工作目录,用于文件操作和 Git 命令 |
67
+ | `CCV_PROXY_PORT` | 未设置 | 本地 MITM 代理端口 |
68
+ | `CCV_BYPASS_PERMISSIONS` | 未设置 | `=1` 跳过工具权限审批(配合 `--dangerously-skip-permissions`) |
69
+ | `CCV_DISABLE_DELTA` | 未设置 | `=1` 禁用增量日志存储,每次写入完整消息 |
70
+ | `CCV_DEBUG` | 未设置 | `=1` 启用 HTTP 代理调试日志 |
71
+ | `CCV_DEBUG_PLUGINS` | 未设置 | `=1` 启用插件加载调试日志 |
72
+
73
+ ### 内部 IPC
74
+
75
+ | 变量名 | 说明 |
76
+ |--------|------|
77
+ | `CCVIEWER_PORT` | 服务端口,供 ask-bridge/perm-bridge 通信 |
78
+ | `CCV_EDITOR_PORT` | 服务端口,供 ccv-editor 文件编辑桥接 |
79
+
80
+ ### 外部变量(读取)
81
+
82
+ | 变量名 | 说明 |
83
+ |--------|------|
84
+ | `ANTHROPIC_BASE_URL` | 自定义 Anthropic API 地址 |
85
+ | `SHELL` | 用户 Shell(PTY 启动和 Shell 配置检测) |
86
+ | `http_proxy` / `HTTPS_PROXY` 等 | HTTP 代理配置(通过 undici EnvHttpProxyAgent) |
87
+
88
+ ## 五、CLI 命令参数
89
+
90
+ ```
91
+ ccv [选项] [claude 参数...]
92
+ ```
93
+
94
+ ### CC-Viewer 专有选项
95
+
96
+ | 参数 | 说明 |
97
+ |------|------|
98
+ | `-logger` | 安装/修复 Claude Code hooks |
99
+ | `--uninstall` / `-uninstall` | 卸载所有 CC-Viewer 集成 |
100
+ | `--help` / `-h` / `help` | 显示帮助信息 |
101
+ | `--version` / `-v` | 显示版本号 |
102
+ | `-SDK` / `--sdk` | 使用 Agent SDK 模式 |
103
+ | `--d` | `--dangerously-skip-permissions` 简写 |
104
+ | `--ad` | `--allow-dangerously-skip-permissions` 简写 |
105
+ | `run` | 通过代理运行命令(`ccv run -- claude ...`) |
106
+
107
+ ### Claude 透传参数(常用)
108
+
109
+ | 参数 | 说明 |
110
+ |------|------|
111
+ | `-c` / `--continue` | 继续上一次会话 |
112
+ | `-r` / `--resume` | 恢复指定会话 |
113
+ | `-p` / `--print` | 非交互式输出 |
114
+ | `--model` | 指定模型 |
115
+ | `--permission-mode` | 权限模式 |
116
+ | `--system-prompt` | 自定义系统提示词 |
117
+ | `--max-budget-usd` | 最大预算 |
118
+
119
+ ## 六、Hook 配置
120
+
121
+ CC-Viewer 自动注册到 `~/.claude/settings.json` 的 `hooks.PreToolUse` 中:
122
+
123
+ ### 1. AskUserQuestion 桥接
124
+ - **匹配器**: `"AskUserQuestion"`
125
+ - **命令**: `node <安装目录>/lib/ask-bridge.js`
126
+ - **作用**: 将 Claude 的问题转发到 Web UI,等待用户回答
127
+
128
+ ### 2. 权限审批桥接
129
+ - **匹配器**: `""` (空 = 匹配所有工具)
130
+ - **命令**: `node <安装目录>/lib/perm-bridge.js`
131
+ - **作用**: 仅 `Bash`/`Edit`/`Write`/`NotebookEdit` 需要 Web UI 审批,其余自动放行
132
+
133
+ ## 七、Shell 集成
134
+
135
+ CC-Viewer 在 `~/.zshrc`(或 `.bashrc`)中注入 `claude()` 函数:
136
+
137
+ ```bash
138
+ # >>> CC-Viewer Auto-Inject >>>
139
+ claude() { ... }
140
+ # <<< CC-Viewer Auto-Inject <<<
141
+ ```
142
+
143
+ 所有 `claude` 命令自动通过 CC-Viewer 代理,实现日志捕获和 Web UI 功能。
144
+
145
+ 卸载:`ccv --uninstall` 或手动删除标记之间的内容。
146
+
147
+ ## 八、代理配置(Proxy Profile)
148
+
149
+ 存储在 `<日志目录>/profile.json`,通过 UI 的"代理切换"面板管理。
150
+
151
+ ```json
152
+ {
153
+ "active": "max",
154
+ "profiles": [
155
+ { "id": "max", "name": "Default" },
156
+ { "id": "my-proxy", "name": "自定义", "baseURL": "https://...", "apiKey": "sk-..." }
157
+ ]
158
+ }
159
+ ```
160
+
161
+ | 字段 | 说明 |
162
+ |------|------|
163
+ | `active` | 当前激活的配置 ID(`"max"` = 直连,无代理) |
164
+ | `id` | 唯一标识 |
165
+ | `name` | 显示名称 |
166
+ | `baseURL` | 代理 API 地址(替换请求 origin) |
167
+ | `apiKey` | 代理 API 密钥(替换认证头) |
168
+ | `models` | 可用模型列表 |
169
+ | `activeModel` | 当前选中的模型 |
170
+
171
+ ## 九、插件系统
172
+
173
+ 插件目录:`<日志目录>/plugins/`
174
+
175
+ ### 支持的 Hook 类型
176
+
177
+ | Hook | 类型 | 说明 |
178
+ |------|------|------|
179
+ | `httpsOptions` | 瀑布 | 提供 HTTPS 证书(返回 `{ cert, key }` 或 `{ pfx }`) |
180
+ | `localUrl` | 瀑布 | 修改本地访问 URL |
181
+ | `serverStarted` | 并行 | 服务器启动通知 |
182
+ | `serverStopping` | 并行 | 服务器停止通知 |
183
+ | `onNewEntry` | 并行 | 新日志条目写入通知 |
184
+
185
+ 插件启用/禁用通过 `preferences.json` 的 `disabledPlugins` 数组管理。
186
+
187
+ ## 十、目录结构
188
+
189
+ ```
190
+ ~/.claude/cc-viewer/ # 日志根目录
191
+ ├── preferences.json # 用户偏好设置
192
+ ├── workspaces.json # 工作空间注册表
193
+ ├── profile.json # 代理配置
194
+ ├── plugins/ # 插件目录
195
+ │ └── my-plugin.js
196
+ ├── <项目名>/ # 每个项目的日志目录
197
+ │ ├── <项目名>_20260404_123456.jsonl # JSONL 日志文件
198
+ │ ├── <项目名>.json # 统计数据(后台生成)
199
+ │ └── images/ # 上传图片的持久副本
200
+ └── ...
201
+
202
+ /tmp/cc-viewer-uploads/ # 临时上传文件目录
203
+ ```
204
+
205
+ ## 十一、服务器配置
206
+
207
+ | 配置 | 值 | 说明 |
208
+ |------|-----|------|
209
+ | 端口范围 | 7008-7099 | 自动扫描可用端口 |
210
+ | 绑定地址 | 0.0.0.0 | 所有网络接口 |
211
+ | 访问令牌 | 随机 16 字节 hex | 局域网访问需要 `?token=xxx`,本机免认证 |
212
+ | HTTPS | 仅通过插件 | 需要插件提供 `httpsOptions` hook |
213
+ | CORS | `*` | 允许所有来源 |
214
+ | 上传限制 | 50MB | 单文件最大上传大小 |
215
+
216
+ ## 十二、URL 参数
217
+
218
+ | 参数 | 说明 |
219
+ |------|------|
220
+ | `?token=xxx` | 局域网访问认证令牌 |
221
+ | `?logfile=path` | 打开指定历史日志文件(只读模式) |
222
+
223
+ ## 十三、localStorage 配置
224
+
225
+ | 键 | 说明 |
226
+ |-----|------|
227
+ | `ccv_cacheExpireAt` | 缓存倒计时到期时间 |
228
+ | `ccv_cacheType` | 缓存类型标签 |
229
+ | `ccv_sseSlim` | 启用 SSE 增量裁剪(桌面端性能优化) |
230
+ | `ccv_calibrationModel` | KV-Cache 上下文窗口校准模型 |
231
+ | `ccv_fileExplorerOpen` | 文件浏览器面板开关 |
232
+ | `cc-viewer-terminal-width` | 终端面板宽度(像素) |