codepage-bridge-mcp 0.1.0

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 (97) hide show
  1. package/.claude-plugin/marketplace.json +19 -0
  2. package/.claude-plugin/plugin.json +15 -0
  3. package/.mcp.json +11 -0
  4. package/LICENSE +21 -0
  5. package/README.md +990 -0
  6. package/README_CN.md +781 -0
  7. package/dist/src/core.d.ts +56 -0
  8. package/dist/src/core.js +166 -0
  9. package/dist/src/core.js.map +1 -0
  10. package/dist/src/diff.d.ts +8 -0
  11. package/dist/src/diff.js +11 -0
  12. package/dist/src/diff.js.map +1 -0
  13. package/dist/src/encoding/codec.d.ts +5 -0
  14. package/dist/src/encoding/codec.js +75 -0
  15. package/dist/src/encoding/codec.js.map +1 -0
  16. package/dist/src/encoding/index.d.ts +3 -0
  17. package/dist/src/encoding/index.js +4 -0
  18. package/dist/src/encoding/index.js.map +1 -0
  19. package/dist/src/encoding/rules.d.ts +4 -0
  20. package/dist/src/encoding/rules.js +70 -0
  21. package/dist/src/encoding/rules.js.map +1 -0
  22. package/dist/src/encoding/types.d.ts +22 -0
  23. package/dist/src/encoding/types.js +2 -0
  24. package/dist/src/encoding/types.js.map +1 -0
  25. package/dist/src/filesystem/atomic.d.ts +6 -0
  26. package/dist/src/filesystem/atomic.js +91 -0
  27. package/dist/src/filesystem/atomic.js.map +1 -0
  28. package/dist/src/filesystem/cache.d.ts +21 -0
  29. package/dist/src/filesystem/cache.js +40 -0
  30. package/dist/src/filesystem/cache.js.map +1 -0
  31. package/dist/src/filesystem/index.d.ts +4 -0
  32. package/dist/src/filesystem/index.js +5 -0
  33. package/dist/src/filesystem/index.js.map +1 -0
  34. package/dist/src/filesystem/mutex.d.ts +5 -0
  35. package/dist/src/filesystem/mutex.js +23 -0
  36. package/dist/src/filesystem/mutex.js.map +1 -0
  37. package/dist/src/filesystem/path.d.ts +9 -0
  38. package/dist/src/filesystem/path.js +53 -0
  39. package/dist/src/filesystem/path.js.map +1 -0
  40. package/dist/src/media/errors.d.ts +14 -0
  41. package/dist/src/media/errors.js +29 -0
  42. package/dist/src/media/errors.js.map +1 -0
  43. package/dist/src/media/image.d.ts +11 -0
  44. package/dist/src/media/image.js +81 -0
  45. package/dist/src/media/image.js.map +1 -0
  46. package/dist/src/media/index.d.ts +5 -0
  47. package/dist/src/media/index.js +6 -0
  48. package/dist/src/media/index.js.map +1 -0
  49. package/dist/src/media/notebook.d.ts +47 -0
  50. package/dist/src/media/notebook.js +122 -0
  51. package/dist/src/media/notebook.js.map +1 -0
  52. package/dist/src/media/pdf.d.ts +25 -0
  53. package/dist/src/media/pdf.js +104 -0
  54. package/dist/src/media/pdf.js.map +1 -0
  55. package/dist/src/media/types.d.ts +14 -0
  56. package/dist/src/media/types.js +2 -0
  57. package/dist/src/media/types.js.map +1 -0
  58. package/dist/src/prompts.d.ts +8 -0
  59. package/dist/src/prompts.js +46 -0
  60. package/dist/src/prompts.js.map +1 -0
  61. package/dist/src/schemas.d.ts +138 -0
  62. package/dist/src/schemas.js +81 -0
  63. package/dist/src/schemas.js.map +1 -0
  64. package/dist/src/server.d.ts +159 -0
  65. package/dist/src/server.js +98 -0
  66. package/dist/src/server.js.map +1 -0
  67. package/dist/src/toolTypes.d.ts +31 -0
  68. package/dist/src/toolTypes.js +2 -0
  69. package/dist/src/toolTypes.js.map +1 -0
  70. package/dist/src/tools/edit.d.ts +3 -0
  71. package/dist/src/tools/edit.js +168 -0
  72. package/dist/src/tools/edit.js.map +1 -0
  73. package/dist/src/tools/grep.d.ts +21 -0
  74. package/dist/src/tools/grep.js +192 -0
  75. package/dist/src/tools/grep.js.map +1 -0
  76. package/dist/src/tools/read.d.ts +3 -0
  77. package/dist/src/tools/read.js +137 -0
  78. package/dist/src/tools/read.js.map +1 -0
  79. package/dist/src/tools/write.d.ts +3 -0
  80. package/dist/src/tools/write.js +80 -0
  81. package/dist/src/tools/write.js.map +1 -0
  82. package/dist/src/validation.d.ts +6 -0
  83. package/dist/src/validation.js +42 -0
  84. package/dist/src/validation.js.map +1 -0
  85. package/examples/claude-config/settings.fragment.json +17 -0
  86. package/examples/minimal-project/.encoding-rules +10 -0
  87. package/examples/minimal-project/.mcp.json +11 -0
  88. package/examples/minimal-project/CLAUDE.md +15 -0
  89. package/install/download-release-unix.sh +72 -0
  90. package/install/download-release-windows.ps1 +61 -0
  91. package/install/install-from-release-unix.sh +18 -0
  92. package/install/install-from-release-windows.ps1 +19 -0
  93. package/install/install-from-source-unix.sh +44 -0
  94. package/install/install-from-source-windows.ps1 +45 -0
  95. package/install/install-this-release-unix.sh +37 -0
  96. package/install/install-this-release-windows.ps1 +36 -0
  97. package/package.json +64 -0
package/README_CN.md ADDED
@@ -0,0 +1,781 @@
1
+ # Codepage Bridge MCP(中文说明)
2
+
3
+ [English README](README.md)
4
+
5
+ Codepage Bridge 是一套面向 Claude Code 和其他 MCP 客户端的**编码透明文件工具**。
6
+
7
+ 它提供以下四个 MCP 工具:
8
+
9
+ - `Read`
10
+ - `Grep`
11
+ - `Edit`
12
+ - `Write`
13
+
14
+ 这些工具会根据最近的 `.encoding-rules`,把项目文件从磁盘上的传统编码(如 GBK、Big5、Shift-JIS 等)解码成 Unicode 提供给模型;写回时再严格编码回原规则指定的编码。
15
+
16
+ 也就是说:
17
+
18
+ - LLM 看到的是正常 Unicode 文本;
19
+ - 磁盘上的文件仍保持项目原本的编码体系;
20
+ - 如果新文本无法表示为目标编码,会直接报错,而不是偷偷写成 `?`。
21
+
22
+ ---
23
+
24
+ ## 安装方式概览
25
+
26
+ 你现在有三种安装方式:
27
+
28
+ ### 方案 A:Marketplace 安装(即将提供)
29
+
30
+ 这将来会成为普通用户最简单的安装方式。
31
+
32
+ 目标体验:
33
+
34
+ - market 一键安装;
35
+ - 自动注册 MCP;
36
+ - 不需要本地 `git clone`;
37
+ - 不需要本地 `npm install`;
38
+ - 安装后只需极少量手动配置。
39
+
40
+ 目前还没上 market,所以现在请使用 **GitHub Release 安装**。
41
+
42
+ ### 方案 B:GitHub Release 安装(当前最推荐)
43
+
44
+ 这是当前最适合普通用户的安装方式。
45
+
46
+ 你有两种使用路径:
47
+
48
+ 1. **你已经下载并解压好了 Release 包**;
49
+ 2. **你想让脚本帮你下载 Release 包**。
50
+
51
+ 这两种方式都**不需要**:
52
+
53
+ - 本地 `git clone`
54
+ - 本地 `npm install`
55
+ - 本地 `npm run build`
56
+
57
+ 但仍然要求本机已有:
58
+
59
+ - `claude`
60
+ - `node`
61
+
62
+ ### 方案 C:源码安装(仅面向开发者)
63
+
64
+ 只有在以下场景才建议使用:
65
+
66
+ - 你要开发 Codepage Bridge 本身;
67
+ - 你要调试安装问题;
68
+ - 你要修改或审查源码实现。
69
+
70
+ 如果你只是普通使用者,不建议把源码安装作为首选入口。
71
+
72
+ ---
73
+
74
+ ## 通过 GitHub Release 安装(当前最推荐)
75
+
76
+ 这是普通用户当前最合适的安装方式。
77
+
78
+ ### 路径 1:你已经下载并解压好了 Release 包
79
+
80
+ 如果你当前就处于一个已解压好的 Release 包目录中,推荐直接使用本地包安装脚本。
81
+
82
+ #### Windows
83
+
84
+ ```powershell
85
+ powershell -ExecutionPolicy Bypass -File .\install\install-this-release-windows.ps1
86
+ ```
87
+
88
+ #### macOS / Linux
89
+
90
+ ```bash
91
+ bash ./install/install-this-release-unix.sh
92
+ ```
93
+
94
+ 它会:
95
+
96
+ - 检查当前目录是否真的包含 `dist/src/server.js`;
97
+ - 直接使用当前解压包注册 Claude Code MCP;
98
+ - **不会再次下载**。
99
+
100
+ ### 路径 2:你还没下载 Release 包
101
+
102
+ 如果你希望脚本自动去 GitHub Release 下载,再注册 MCP,使用下载脚本。
103
+
104
+ #### Windows
105
+
106
+ ```powershell
107
+ powershell -ExecutionPolicy Bypass -File .\install\download-release-windows.ps1
108
+ ```
109
+
110
+ #### macOS / Linux
111
+
112
+ ```bash
113
+ bash ./install/download-release-unix.sh
114
+ ```
115
+
116
+ 它会:
117
+
118
+ - 请求 GitHub Release API;
119
+ - 下载当前平台对应的发布包;
120
+ - 解压到用户目录;
121
+ - 自动注册 Claude Code MCP。
122
+
123
+ ### 安装指定版本
124
+
125
+ #### Windows
126
+
127
+ ```powershell
128
+ powershell -ExecutionPolicy Bypass -File .\install\download-release-windows.ps1 -Version v0.1.0
129
+ ```
130
+
131
+ #### macOS / Linux
132
+
133
+ ```bash
134
+ bash ./install/download-release-unix.sh v0.1.0
135
+ ```
136
+
137
+ ### 兼容脚本
138
+
139
+ 仓库中保留了兼容入口:
140
+
141
+ - `install-from-release-windows.ps1`
142
+ - `install-from-release-unix.sh`
143
+
144
+ 它们的行为是:
145
+
146
+ - 如果当前目录已经是解压包,就直接本地安装;
147
+ - 如果当前目录不是解压包,就回退到下载模式。
148
+
149
+ 因此更清晰的推荐是直接使用:
150
+
151
+ - `install-this-release-*`
152
+ - `download-release-*`
153
+
154
+ 而不是继续依赖兼容入口。
155
+
156
+ ---
157
+
158
+ ## 源码安装(仅面向开发者)
159
+
160
+ 只有在以下场景才建议使用:
161
+
162
+ - 你要开发 Codepage Bridge 本身;
163
+ - 你要调试安装问题;
164
+ - 你要修改或审查源码实现。
165
+
166
+ ### 1. 克隆仓库
167
+
168
+ ```bash
169
+ git clone git@github.com:skyispainted/codepage-bridge-mcp.git
170
+ cd codepage-bridge-mcp
171
+ ```
172
+
173
+ ### 2. 安装依赖
174
+
175
+ ```bash
176
+ npm install
177
+ ```
178
+
179
+ ### 3. 构建
180
+
181
+ ```bash
182
+ npm run build
183
+ ```
184
+
185
+ 入口文件:
186
+
187
+ ```text
188
+ dist/src/server.js
189
+ ```
190
+
191
+ ### 4. 确认构建产物存在
192
+
193
+ #### Windows
194
+
195
+ ```powershell
196
+ Test-Path .\dist\src\server.js
197
+ ```
198
+
199
+ #### macOS / Linux
200
+
201
+ ```bash
202
+ test -f ./dist/src/server.js && echo ok
203
+ ```
204
+
205
+ ### 5. 或使用源码安装脚本
206
+
207
+ #### Windows
208
+
209
+ ```powershell
210
+ powershell -ExecutionPolicy Bypass -File .\install\install-from-source-windows.ps1
211
+ ```
212
+
213
+ #### macOS / Linux
214
+
215
+ ```bash
216
+ bash ./install/install-from-source-unix.sh
217
+ ```
218
+
219
+ ---
220
+
221
+ ## 适用场景
222
+
223
+ 如果你的项目还在使用这些编码:
224
+
225
+ - GBK / GB2312 / GB18030
226
+ - Big5
227
+ - Shift-JIS
228
+ - EUC-KR
229
+ - Windows-1251 / Windows-1252
230
+ - UTF-16
231
+
232
+ 那么 Claude Code 的内置 `Read` / `Grep` / `Edit` / `Write` 很容易出现:
233
+
234
+ - 中文注释乱码;
235
+ - 搜索不到真实内容;
236
+ - 编辑后把文件误写成 UTF-8;
237
+ - 旧代码页文件被破坏。
238
+
239
+ Codepage Bridge 就是为了解决这个问题。
240
+
241
+ ---
242
+
243
+ ## 核心特性
244
+
245
+ - 按 `.encoding-rules` 透明解码/写回。
246
+ - 支持 `Read`、`Grep`、`Edit`、`Write`。
247
+ - 最近的 `.encoding-rules` 决定项目根与生效规则。
248
+ - 最后一条匹配规则生效。
249
+ - `!pattern` 表示取消之前匹配并回到严格 UTF-8。
250
+ - `*.cpp` 这类无目录分隔符规则会匹配任意层级目录。
251
+ - `Edit` 支持大文件局部编辑:只要模型读过目标行,就可以修改,不必整文件读取。
252
+ - 写入前会重新读取并做 hash 校验,防止 stale write。
253
+ - 保留 BOM 与主导换行风格。
254
+ - 原子写入、路径锁、符号链接边界保护。
255
+ - 支持图片、PDF、Notebook 的读取。
256
+
257
+ ---
258
+
259
+ ## 前置要求
260
+
261
+ 需要本机已经安装:
262
+
263
+ - Node.js 20+
264
+ - npm(仅源码安装需要)
265
+ - Claude Code
266
+
267
+ 可选:
268
+
269
+ - `pdfinfo`
270
+ - `pdftoppm`
271
+
272
+ 用于 PDF 页面渲染。
273
+
274
+ ### Windows 检查
275
+
276
+ ```powershell
277
+ node --version
278
+ npm --version
279
+ claude --version
280
+ ```
281
+
282
+ ### macOS / Linux 检查
283
+
284
+ ```bash
285
+ node --version
286
+ npm --version
287
+ claude --version
288
+ ```
289
+
290
+ ---
291
+
292
+ ## 配置 Claude Code MCP
293
+
294
+ 你可以按两种范围安装:
295
+
296
+ - **用户级**:所有项目通用;
297
+ - **项目级**:跟随某一个仓库。
298
+
299
+ ### 方案 A:用户级安装
300
+
301
+ #### Windows
302
+
303
+ ```powershell
304
+ claude mcp add --scope user codepage-bridge -- node C:\absolute\path\to\codepage-bridge-mcp\dist\src\server.js
305
+ ```
306
+
307
+ #### macOS / Linux
308
+
309
+ ```bash
310
+ claude mcp add --scope user codepage-bridge -- node /absolute/path/to/codepage-bridge-mcp/dist/src/server.js
311
+ ```
312
+
313
+ 验证:
314
+
315
+ ```bash
316
+ claude mcp get codepage-bridge
317
+ claude mcp list
318
+ ```
319
+
320
+ ### 方案 B:项目级安装
321
+
322
+ 在项目根目录创建 `.mcp.json`:
323
+
324
+ ```json
325
+ {
326
+ "mcpServers": {
327
+ "codepage-bridge": {
328
+ "type": "stdio",
329
+ "command": "node",
330
+ "args": [
331
+ "/absolute/path/to/codepage-bridge-mcp/dist/src/server.js"
332
+ ]
333
+ }
334
+ }
335
+ }
336
+ ```
337
+
338
+ 项目级模板见:
339
+
340
+ - `examples/minimal-project/.mcp.json`
341
+
342
+ ---
343
+
344
+ ## 最重要:必须禁用 Claude Code 内置文件工具
345
+
346
+ 仅安装 MCP 还不够。
347
+
348
+ 如果不禁用 Claude Code 内置工具,模型仍然可能继续调用:
349
+
350
+ - `Read`
351
+ - `Grep`
352
+ - `Edit`
353
+ - `Write`
354
+ - `NotebookEdit`
355
+
356
+ 这些工具不会遵循 `.encoding-rules`。
357
+
358
+ ### 修改 `~/.claude/settings.json`
359
+
360
+ 把以下内容合并到现有文件中:
361
+
362
+ ```json
363
+ {
364
+ "permissions": {
365
+ "allow": [
366
+ "mcp__codepage-bridge__Read",
367
+ "mcp__codepage-bridge__Grep",
368
+ "mcp__codepage-bridge__Edit",
369
+ "mcp__codepage-bridge__Write"
370
+ ],
371
+ "deny": [
372
+ "Read",
373
+ "Grep",
374
+ "Edit",
375
+ "Write",
376
+ "NotebookEdit"
377
+ ]
378
+ }
379
+ }
380
+ ```
381
+
382
+ 不要整份覆盖已有 `settings.json`,除非文件本来就是空的。
383
+
384
+ 模板见:
385
+
386
+ - `examples/claude-config/settings.fragment.json`
387
+
388
+ ---
389
+
390
+ ## 还要加一个 `CLAUDE.md`
391
+
392
+ 即使内置工具被 deny,模型仍可能尝试用 shell / PowerShell / Python 绕过编码桥。
393
+
394
+ 建议在项目 `CLAUDE.md` 或全局 `~/.claude/CLAUDE.md` 里加入策略。
395
+
396
+ 模板见:
397
+
398
+ - `examples/minimal-project/CLAUDE.md`
399
+
400
+ 为什么要同时配:
401
+
402
+ - `settings.json`:从工具层禁用内置工具;
403
+ - `CLAUDE.md`:防止模型使用脚本绕过。
404
+
405
+ ---
406
+
407
+ ## `.encoding-rules` 怎么写
408
+
409
+ 每个要使用 Codepage Bridge 的项目根目录,都必须有 `.encoding-rules`。
410
+
411
+ 示例:
412
+
413
+ ```text
414
+ # Last matching rule wins
415
+ *.c gbk
416
+ *.cpp gbk
417
+ *.h gbk
418
+ legacy/**/*.txt windows-1251
419
+ assets/**/*.csv shift_jis
420
+ **/*.json utf8
421
+
422
+ # Cancel earlier matches and return to strict UTF-8
423
+ !SourceCode/generated/**
424
+ ```
425
+
426
+ 语法:
427
+
428
+ ```text
429
+ <glob-pattern> <encoding>
430
+ ```
431
+
432
+ 规则说明:
433
+
434
+ - 空行忽略;
435
+ - `#` 开头为注释;
436
+ - 支持 `*`、`**`、`?`;
437
+ - 无 `/` 的模式(如 `*.cpp`)会匹配任意层级 basename;
438
+ - 含 `/` 的模式相对于 `.encoding-rules` 所在目录;
439
+ - 最后一条匹配规则生效;
440
+ - `!pattern` 取消先前匹配,回到严格 UTF-8;
441
+ - 未命中规则的文件使用严格 UTF-8;
442
+ - 最近的 `.encoding-rules` 同时决定项目根边界。
443
+
444
+ 模板见:
445
+
446
+ - `examples/minimal-project/.encoding-rules`
447
+
448
+ ---
449
+
450
+ ## 最小模板目录
451
+
452
+ 仓库已自带最小配置模板:
453
+
454
+ - `examples/minimal-project/.encoding-rules`
455
+ - `examples/minimal-project/.mcp.json`
456
+ - `examples/minimal-project/CLAUDE.md`
457
+ - `examples/claude-config/settings.fragment.json`
458
+
459
+ ---
460
+
461
+ ## 如何验证是否真的生效
462
+
463
+ ### 1. 检查 MCP 连接状态
464
+
465
+ ```bash
466
+ claude mcp get codepage-bridge
467
+ ```
468
+
469
+ ### 2. 启动一个新 Claude Code 会话
470
+
471
+ ### 3. 让 Claude 读取或搜索一个 legacy 编码文件
472
+
473
+ ### 4. 确认调用的是:
474
+
475
+ - `mcp__codepage-bridge__Read`
476
+ - `mcp__codepage-bridge__Grep`
477
+ - `mcp__codepage-bridge__Edit`
478
+ - `mcp__codepage-bridge__Write`
479
+
480
+ 而不是内置:
481
+
482
+ - `Read`
483
+ - `Grep`
484
+ - `Edit`
485
+ - `Write`
486
+
487
+ ---
488
+
489
+ ## 四个工具怎么工作
490
+
491
+ ### `Read`
492
+
493
+ - 按 `.encoding-rules` 解码成 Unicode;
494
+ - 返回带行号文本;
495
+ - 超过 256 KiB 的文本文件要求使用 `offset` 和 `limit`;
496
+ - 同一文件多次分段 Read 会合并覆盖范围;
497
+ - 文件变化后覆盖状态会失效;
498
+ - 支持图片、PDF 页面和 Notebook 读取;
499
+ - Notebook 不支持文本行级 `offset/limit`。
500
+
501
+ ### `Grep`
502
+
503
+ - 支持 `content` / `files_with_matches` / `count`;
504
+ - 支持 `glob`;
505
+ - 支持常见 `type` 过滤;
506
+ - 支持 `-i` / `-n` / `-o`;
507
+ - 支持 `-A` / `-B` / `-C` / `context`;
508
+ - 支持 `multiline`;
509
+ - 支持 `head_limit` / `offset`。
510
+
511
+ ### `Edit`
512
+
513
+ - 不要求整文件都读完;
514
+ - 只要目标行已读,就允许编辑;
515
+ - `replace_all` 时所有匹配都必须已读;
516
+ - 未读目标会明确报缺失行号;
517
+ - 保留原编码、BOM 和主导换行;
518
+ - 无法表示的字符会拒绝写入。
519
+
520
+ ### `Write`
521
+
522
+ - 新文件按 `.encoding-rules` 选择编码;
523
+ - 已存在文件仍要求完整 Read;
524
+ - 保留已有编码和 BOM;
525
+ - 整体重写按调用方换行内容写回。
526
+
527
+ ---
528
+
529
+ ## NPM_TOKEN 自动发布说明
530
+
531
+ GitHub Release workflow 现在会在打包 release 资产之前,先自动发布 npm 包。
532
+
533
+ 仓库维护者必须在 GitHub Secrets 中配置:
534
+
535
+ - NPM_TOKEN`r
536
+
537
+ 重要:如果某个 npm token 曾经被贴到聊天、终端截图、日志或其他公开位置,请立即在 npm 后台撤销并重新生成新的发布 token,再写入 GitHub Secrets。
538
+
539
+ ## 维护者发布流程
540
+
541
+ 发布新版本:
542
+
543
+ ```bash
544
+ git tag v0.1.0
545
+ git push origin v0.1.0
546
+ ```
547
+
548
+ GitHub Release workflow 会自动:`r`n`r`n- 使用 `NPM_TOKEN` 自动发布 npm 包;
549
+
550
+ - 执行类型检查;
551
+ - 执行完整测试;
552
+ - 构建项目;
553
+ - 裁剪开发依赖;
554
+ - 打包多平台产物;
555
+ - 生成 SHA256 校验文件;
556
+ - 上传到 GitHub Releases。
557
+
558
+ ---
559
+
560
+ ## npm 发布准备状态
561
+
562
+ 仓库现在已经具备 npm 发布条件。
563
+
564
+ ### 发布包内容
565
+
566
+ 最终 npm 包只包含:
567
+
568
+ - `dist/src/`
569
+ - `.claude-plugin/`
570
+ - `.mcp.json`
571
+ - `install/`
572
+ - `examples/`
573
+ - `README.md`
574
+ - `README_CN.md`
575
+ - `LICENSE`
576
+
577
+ 不会发布:
578
+
579
+ - `src/`
580
+ - `test/`
581
+ - `node_modules/`
582
+ - 项目私有 `.claude/`
583
+ - 本地构建缓存
584
+
585
+ ### 发布前检查
586
+
587
+ `prepublishOnly` 已配置为自动执行:
588
+
589
+ ```bash
590
+ npm run check
591
+ npm test
592
+ npm run build
593
+ ```
594
+
595
+ ### 打包预检查
596
+
597
+ 正式发布前先执行:
598
+
599
+ ```bash
600
+ npm pack --dry-run
601
+ ```
602
+
603
+ 用于确认最终发布包内容。
604
+
605
+ ### 发布步骤
606
+
607
+ 1. 登录 npm:
608
+
609
+ ```bash
610
+ npm login
611
+ ```
612
+
613
+ 2. 发布包:
614
+
615
+ ```bash
616
+ npm publish
617
+ ```
618
+
619
+ 3. 验证:
620
+
621
+ ```bash
622
+ npx -y codepage-bridge-mcp
623
+ ```
624
+
625
+ 只要这一步成功,market / 插件安装链路就真正闭环了,因为插件根 `.mcp.json` 已经指向:
626
+
627
+ ```json
628
+ {
629
+ "mcpServers": {
630
+ "codepage-bridge": {
631
+ "command": "npx",
632
+ "args": ["-y", "codepage-bridge-mcp"]
633
+ }
634
+ }
635
+ }
636
+ ```
637
+ ## 最终的 Marketplace 发布与安装方案
638
+
639
+ Codepage Bridge 现在已经同时具备:
640
+
641
+ - **插件结构就绪**
642
+ - **npm 发布就绪**
643
+
644
+ ### 已经完成的部分
645
+
646
+ - 插件清单已就绪:
647
+ - `.claude-plugin/plugin.json`
648
+ - `.claude-plugin/marketplace.json`
649
+ - 插件根 MCP 声明已就绪:
650
+ - `.mcp.json`
651
+ - 插件命令已就绪:
652
+ - `/setup`
653
+ - `/setup-project`
654
+ - `/doctor`
655
+ - `package.json` 已具备 npm 发布所需元数据
656
+ - `npm pack --dry-run` 已验证通过
657
+ - `claude plugin validate . --strict` 已通过
658
+
659
+ ### 在真正支持 market 安装之前,还差什么
660
+
661
+ 1. 登录 npm
662
+ 2. 发布 `codepage-bridge-mcp`
663
+ 3. 把本仓库加入 Claude Code marketplace 源
664
+ 4. 从 market 安装插件
665
+
666
+ ### 实际发布清单
667
+
668
+ 本地执行:
669
+
670
+ ```bash
671
+ npm login
672
+ npm whoami
673
+ npm pack --dry-run
674
+ npm publish
675
+ ```
676
+
677
+ 发布后验证:
678
+
679
+ ```bash
680
+ npx -y codepage-bridge-mcp
681
+ ```
682
+
683
+ 只要这一步成功,就说明插件里的 `.mcp.json` 启动方式已经可用于 marketplace 安装。
684
+
685
+ ### npm 发布后,market 安装的目标流程
686
+
687
+ 1. 在 Claude Code 中添加或更新 marketplace 源
688
+ 2. 从 marketplace 安装插件
689
+ 3. 执行 `/setup`
690
+ 4. 合并 `examples/claude-config/settings.fragment.json`
691
+ 5. 添加项目 `.encoding-rules`
692
+ 6. 添加 `CLAUDE.md` 策略
693
+
694
+ ### 重要限制
695
+
696
+ market 安装可以安装插件并声明 MCP,但想安全使用仍然依赖项目配置:
697
+
698
+ - deny 内置 `Read` / `Grep` / `Edit` / `Write` / `NotebookEdit`
699
+ - 所有文件内容操作必须走 Codepage Bridge
700
+ - legacy 编码项目必须提供 `.encoding-rules`
701
+ ## 常见问题排查
702
+
703
+ ### `No .encoding-rules found`
704
+
705
+ 原因:
706
+
707
+ - 项目根没有 `.encoding-rules`;
708
+ - 访问文件不在项目树内。
709
+
710
+ ### `Invalid byte sequence for utf-8`
711
+
712
+ 原因:
713
+
714
+ - 文件实际不是 UTF-8;
715
+ - 规则没有匹配到目标文件。
716
+
717
+ ### `Text contains characters not representable in ...`
718
+
719
+ 原因:
720
+
721
+ - 新文本无法表示成目标编码。
722
+
723
+ ### `The target text has not been read`
724
+
725
+ 原因:
726
+
727
+ - 模型试图编辑它没真正看到的目标行。
728
+
729
+ ### `Pending approval`
730
+
731
+ 原因:
732
+
733
+ - 项目 `.mcp.json` 还没被批准。
734
+
735
+ ### `Failed to connect`
736
+
737
+ 检查:
738
+
739
+ - `node --version`
740
+ - `claude --version`
741
+ - `dist/src/server.js` 是否存在
742
+ - `claude mcp get codepage-bridge`
743
+
744
+ ### Claude 仍然使用内置工具
745
+
746
+ 原因:
747
+
748
+ - 没有 deny 内置工具;
749
+ - 没有加 `CLAUDE.md`;
750
+ - 会话未重开。
751
+
752
+ ---
753
+
754
+ ## 安全注意事项
755
+
756
+ 1. `.encoding-rules` 要提交到项目中。
757
+ 2. 在大规模编辑前,先用 `Read` 或 `Grep` 验证规则是否匹配正确。
758
+ 3. 优先用 basename 规则描述整类源码,例如 `*.cpp gbk`。
759
+ 4. 不要静默转换编码。
760
+ 5. 不要用 shell 或脚本绕过桥接层。
761
+ 6. 该 MCP 对项目根内文件有读写能力,只应在可信项目中启用。
762
+ 7. 编码安全不等于语义正确,仍需审查 diff。
763
+ 8. PDF 支持依赖 Poppler,可选安装。
764
+ 9. 不提供 `NotebookEdit`。
765
+ 10. Windows UNC / device path 会在 I/O 前直接拒绝。
766
+
767
+ ---
768
+
769
+ ## 开发
770
+
771
+ ```bash
772
+ npm install
773
+ npm run check
774
+ npm test
775
+ npm run build
776
+ npm start
777
+ ```
778
+
779
+ ## 许可证
780
+
781
+ MIT,见 [LICENSE](LICENSE)。