@ppdocs/mcp 3.0.5 → 3.0.7

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.
@@ -518,7 +518,7 @@ export function registerTools(server, projectId, _user) {
518
518
  }
519
519
  });
520
520
  // 列出项目文件
521
- server.tool('project_list_files', '列出项目源码目录下的文件。需要先上传文件或项目已关联源码目录', {
521
+ server.tool('project_list_files', '列出项目源码目录下的文件。需要先上传文件或项目已关联源码目录。支持跨项目只读访问(用targetProject参考其他项目的文件结构)', {
522
522
  dir: z.string().optional().describe('子目录路径(如"src/components"),不填则列出根目录'),
523
523
  targetProject: z.string().optional().describe('目标项目ID或名称(不填=当前项目,跨项目只读)')
524
524
  }, async (args) => {
@@ -543,7 +543,7 @@ export function registerTools(server, projectId, _user) {
543
543
  }
544
544
  });
545
545
  // 读取项目文件
546
- server.tool('project_read_file', '读取项目源码文件内容(文本,限制1MB)。需要先上传文件或项目已关联源码目录', {
546
+ server.tool('project_read_file', '读取项目源码文件内容(文本,限制1MB)。支持跨项目只读访问(用targetProject参考其他项目的代码实现)', {
547
547
  path: z.string().describe('文件路径(如"src/main.ts")'),
548
548
  targetProject: z.string().optional().describe('目标项目ID或名称(不填=当前项目,跨项目只读)')
549
549
  }, async (args) => {
@@ -559,7 +559,7 @@ export function registerTools(server, projectId, _user) {
559
559
  }
560
560
  });
561
561
  // 下载项目目录 (zip → 自动解压)
562
- server.tool('project_download_dir', '下载项目源码目录(自动打包zip并解压到本地临时目录)。需要先上传文件或项目已关联源码目录', {
562
+ server.tool('project_download_dir', '下载项目源码目录(自动打包zip并解压到本地临时目录)。支持跨项目下载(用targetProject拉取其他项目的模块代码到本地复用)', {
563
563
  dir: z.string().describe('目录路径(如"src")'),
564
564
  targetProject: z.string().optional().describe('目标项目ID或名称(不填=当前项目,跨项目只读)')
565
565
  }, async (args) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ppdocs/mcp",
3
- "version": "3.0.5",
3
+ "version": "3.0.7",
4
4
  "description": "ppdocs MCP Server - Knowledge Graph for Claude",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -11,6 +11,7 @@ from __future__ import print_function, unicode_literals
11
11
  import io
12
12
  import json
13
13
  import os
14
+ import re
14
15
  import sys
15
16
 
16
17
  # HTTP 库兼容
@@ -38,6 +39,21 @@ BYPASS = [
38
39
  "ok", "yes", "hi", "hello", "你好",
39
40
  ]
40
41
 
42
+ # 英文绕过词用单词边界匹配,避免 "hooks" 中的 "ok" 误触发
43
+ _EN_BYPASS = [w for w in BYPASS if w.isascii()]
44
+ _CN_BYPASS = [w for w in BYPASS if not w.isascii()]
45
+ _EN_BYPASS_RE = re.compile(r'\b(' + '|'.join(re.escape(w) for w in _EN_BYPASS) + r')\b', re.IGNORECASE) if _EN_BYPASS else None
46
+
47
+
48
+ def is_bypass(text):
49
+ """检查短输入是否为绕过词 (英文用单词边界,中文用子串)"""
50
+ for w in _CN_BYPASS:
51
+ if w in text:
52
+ return True
53
+ if _EN_BYPASS_RE and _EN_BYPASS_RE.search(text):
54
+ return True
55
+ return False
56
+
41
57
 
42
58
  # ╔══════════════════════════════════════════════════════════════╗
43
59
  # ║ API 请求 ║
@@ -168,10 +184,8 @@ def main():
168
184
  user_input_lower = user_input.lower()
169
185
 
170
186
  # 短输入包含绕过词 → 跳过
171
- if len(user_input) <= 15:
172
- for word in BYPASS:
173
- if word.lower() in user_input_lower:
174
- return
187
+ if len(user_input) <= 15 and is_bypass(user_input_lower):
188
+ return
175
189
 
176
190
  # 读取配置
177
191
  config = load_ppdocs_config()