@ppdocs/mcp 3.2.37 → 3.3.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.
@@ -1,11 +1,11 @@
1
1
  /**
2
2
  * MCP 工具注册入口
3
- * 12 个工具, 6 个子模块
3
+ * 13 个工具, 7 个子模块
4
4
  *
5
5
  * 🔗 初始化: kg_init (1个)
6
6
  * 📊 导航: kg_status (1个)
7
- * 📚 知识: kg_projects, kg_rules (2个)
8
- * 📝 工作流: kg_task(任务记录), kg_files, kg_discuss(讨论区) (3个)
7
+ * 📚 知识: kg_projects, kg_workflow (2个)
8
+ * 📝 工作流: kg_task(任务记录), kg_files, kg_discuss(讨论区), kg_ref (4个)
9
9
  * 🔀 关系核心: kg_flowchart(逻辑流程图 — 关系型知识锚点) (1个)
10
10
  * 🔬 代码分析: code_scan, code_smart_context, code_full_path (3个)
11
11
  * 🏛️ 协作: kg_meeting (1个)
@@ -14,10 +14,11 @@ import { createContext } from './shared.js';
14
14
  import { registerInitTool } from './init.js';
15
15
  import { registerStatusTool } from './kg_status.js';
16
16
  import { registerProjectTools } from './projects.js';
17
- import { registerRuleTools } from './rules.js';
17
+ import { registerWorkflowTools } from './workflow.js';
18
18
  import { registerTaskTools } from './tasks.js';
19
19
  import { registerFileTools } from './files.js';
20
20
  import { registerDiscussionTools } from './discussion.js';
21
+ import { registerReferenceTools } from './refs.js';
21
22
  import { registerAnalyzerTools } from './analyzer.js';
22
23
  import { registerMeetingTools } from './meeting.js';
23
24
  import { registerFlowchartTools } from './flowchart.js';
@@ -29,11 +30,12 @@ export function registerTools(server, projectId, user, onProjectChange) {
29
30
  registerStatusTool(server, ctx);
30
31
  // 📚 知识
31
32
  registerProjectTools(server, ctx);
32
- registerRuleTools(server, ctx);
33
+ registerWorkflowTools(server, ctx);
33
34
  // 📝 工作流
34
35
  registerTaskTools(server, ctx);
35
36
  registerFileTools(server);
36
37
  registerDiscussionTools(server, ctx);
38
+ registerReferenceTools(server);
37
39
  // 🔬 代码分析
38
40
  registerAnalyzerTools(server, ctx);
39
41
  // 🏛️ 多AI协作
@@ -0,0 +1,2 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerReferenceTools(server: McpServer): void;
@@ -0,0 +1,123 @@
1
+ import { z } from 'zod';
2
+ import { getClient } from '../storage/httpClient.js';
3
+ import { decodeObjectStrings } from '../utils.js';
4
+ import { safeTool, wrap } from './shared.js';
5
+ const linkSchema = z.object({
6
+ url: z.string(),
7
+ label: z.string(),
8
+ });
9
+ const fileSchema = z.object({
10
+ name: z.string(),
11
+ path: z.string(),
12
+ });
13
+ const adoptedNodeSchema = z.object({
14
+ chartId: z.string(),
15
+ nodeId: z.string(),
16
+ nodeLabel: z.string(),
17
+ });
18
+ export function registerReferenceTools(server) {
19
+ const client = () => getClient();
20
+ server.tool('kg_ref', '📎 外部参考 — 管理项目引用的第三方资料、链接、脚本和样例文件。\n' +
21
+ '涉及参考资料时主动调用:list 查看已有 → get 读详情 → read_file 读附件内容 → save 新增。\n' +
22
+ 'actions: list|get|save|delete|read_file', {
23
+ action: z.enum(['list', 'get', 'save', 'delete', 'read_file']).describe('操作类型'),
24
+ id: z.string().optional().describe('参考 ID'),
25
+ title: z.string().optional().describe('参考标题 (save)'),
26
+ summary: z.string().optional().describe('Markdown 总结 (save)'),
27
+ links: z.array(linkSchema).optional().describe('参考链接 (save)'),
28
+ files: z.array(fileSchema).optional().describe('参考文件 (save)'),
29
+ scripts: z.array(fileSchema).optional().describe('解析脚本 (save)'),
30
+ adoptedBy: z.array(adoptedNodeSchema).optional().describe('已采用该参考的节点 (save)'),
31
+ path: z.string().optional().describe('参考文件路径 (read_file)'),
32
+ }, async (args) => safeTool(async () => {
33
+ const decoded = decodeObjectStrings(args);
34
+ switch (decoded.action) {
35
+ case 'list': {
36
+ const refs = await client().listReferences();
37
+ if (refs.length === 0)
38
+ return wrap('当前没有外部参考');
39
+ const lines = [
40
+ `📎 外部参考 (${refs.length})`,
41
+ '',
42
+ '| ID | 标题 | 链接 | 文件 | 已采用 |',
43
+ '|:---|:---|---:|---:|---:|',
44
+ ];
45
+ for (const ref of refs) {
46
+ lines.push(`| ${ref.id} | ${ref.title} | ${ref.links.length} | ${ref.files.length} | ${ref.adoptedBy.length} |`);
47
+ }
48
+ return wrap(lines.join('\n'));
49
+ }
50
+ case 'get': {
51
+ if (!decoded.id)
52
+ return wrap('❌ get 需要 id');
53
+ const ref = await client().getReference(decoded.id);
54
+ if (!ref)
55
+ return wrap(`未找到外部参考: ${decoded.id}`);
56
+ const lines = [
57
+ `# ${ref.title}`,
58
+ '',
59
+ `- ID: ${ref.id}`,
60
+ `- Links: ${ref.links.length}`,
61
+ `- Files: ${ref.files.length}`,
62
+ `- Scripts: ${ref.scripts.length}`,
63
+ `- AdoptedBy: ${ref.adoptedBy.length}`,
64
+ '',
65
+ ref.summary || '(无摘要)',
66
+ ];
67
+ if (ref.links.length > 0) {
68
+ lines.push('', '## Links');
69
+ for (const link of ref.links) {
70
+ lines.push(`- ${link.label}: ${link.url}`);
71
+ }
72
+ }
73
+ if (ref.files.length > 0) {
74
+ lines.push('', '## Files');
75
+ for (const file of ref.files) {
76
+ lines.push(`- ${file.name}: ${file.path}`);
77
+ }
78
+ }
79
+ if (ref.scripts.length > 0) {
80
+ lines.push('', '## Scripts');
81
+ for (const script of ref.scripts) {
82
+ lines.push(`- ${script.name}: ${script.path}`);
83
+ }
84
+ }
85
+ return wrap(lines.join('\n'));
86
+ }
87
+ case 'save': {
88
+ if (!decoded.id)
89
+ return wrap('❌ save 需要 id');
90
+ if (!decoded.title)
91
+ return wrap('❌ save 需要 title');
92
+ const existing = await client().getReference(decoded.id);
93
+ const now = new Date().toISOString();
94
+ await client().saveReference({
95
+ id: decoded.id,
96
+ title: decoded.title,
97
+ summary: decoded.summary || existing?.summary || '',
98
+ links: decoded.links || existing?.links || [],
99
+ files: decoded.files || existing?.files || [],
100
+ scripts: decoded.scripts || existing?.scripts || [],
101
+ adoptedBy: decoded.adoptedBy || existing?.adoptedBy || [],
102
+ createdAt: existing?.createdAt || now,
103
+ updatedAt: now,
104
+ });
105
+ return wrap(`✅ 外部参考已保存 (${decoded.id})`);
106
+ }
107
+ case 'delete': {
108
+ if (!decoded.id)
109
+ return wrap('❌ delete 需要 id');
110
+ const ok = await client().deleteReference(decoded.id);
111
+ return wrap(ok ? `✅ 外部参考已删除 (${decoded.id})` : `ℹ️ 未找到外部参考 (${decoded.id})`);
112
+ }
113
+ case 'read_file': {
114
+ if (!decoded.path)
115
+ return wrap('❌ read_file 需要 path');
116
+ const content = await client().readReferenceFile(decoded.path);
117
+ return wrap(content);
118
+ }
119
+ default:
120
+ return wrap(`❌ 未知 action: ${decoded.action}`);
121
+ }
122
+ }));
123
+ }
@@ -184,14 +184,14 @@ export function registerTaskTools(server, ctx) {
184
184
  return wrap('归档失败(任务不存在或已归档)');
185
185
  return wrap(`✅ 任务已归档: ${task.title}`);
186
186
  }
187
- default:
188
- return wrap(`❌ 未知 action: ${decoded.action}`);
189
187
  case 'delete': {
190
188
  if (!decoded.taskId)
191
189
  return wrap('❌ delete 需要 taskId');
192
190
  const ok = await client().deleteTask(decoded.taskId);
193
191
  return wrap(ok ? `✅ 任务已删除 (ID: ${decoded.taskId})` : '❌ 删除失败(任务不存在)');
194
192
  }
193
+ default:
194
+ return wrap(`❌ 未知 action: ${decoded.action}`);
195
195
  }
196
196
  }));
197
197
  }
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import { type McpContext } from './shared.js';
3
+ export declare function registerWorkflowTools(server: McpServer, _ctx: McpContext): void;
@@ -0,0 +1,80 @@
1
+ import { z } from 'zod';
2
+ import { getClient } from '../storage/httpClient.js';
3
+ import { decodeObjectStrings } from '../utils.js';
4
+ import { safeTool, wrap } from './shared.js';
5
+ export function registerWorkflowTools(server, _ctx) {
6
+ const client = () => getClient();
7
+ server.tool('kg_workflow', '📘 文档工作流 — AI 的标准操作手册。每个工作流是一份 Markdown 文档,定义了特定场景下 AI 应该遵循的步骤和规范。\n' +
8
+ '调用方式:空参数=列出所有工作流;传 id=获取工作流正文;save/delete 需显式 action。\n' +
9
+ '典型用法:拿到任务后先 kg_workflow() 看有无相关工作流,有则 kg_workflow(id:"xxx") 读取并遵循执行。', {
10
+ action: z.enum(['list', 'get', 'save', 'delete']).optional().describe('省略时自动推断:无参数=list,有id=get'),
11
+ id: z.string().optional().describe('工作流 ID'),
12
+ scope: z.enum(['all', 'global', 'project']).optional().describe('范围:all(默认)|global|project'),
13
+ title: z.string().optional().describe('标题 (save 必填)'),
14
+ content: z.string().optional().describe('Markdown 正文 (save 必填)'),
15
+ }, async (args) => safeTool(async () => {
16
+ const decoded = decodeObjectStrings(args);
17
+ const action = decoded.action ?? (decoded.id ? 'get' : 'list');
18
+ if (!decoded.action && (decoded.title !== undefined || decoded.content !== undefined)) {
19
+ return wrap('❌ save/delete 需要显式传 action');
20
+ }
21
+ switch (action) {
22
+ case 'list': {
23
+ const workflows = await client().listWorkflows(decoded.scope ?? 'all');
24
+ if (workflows.length === 0)
25
+ return wrap('当前没有可用文档工作流');
26
+ const lines = [
27
+ `📘 文档工作流列表 (${workflows.length})`,
28
+ '',
29
+ '| ID | 范围 | 标题 |',
30
+ '|:---|:---|:---|',
31
+ ];
32
+ for (const w of workflows) {
33
+ lines.push(`| ${w.id} | ${w.scope} | ${w.title} |`);
34
+ }
35
+ return wrap(lines.join('\n'));
36
+ }
37
+ case 'get': {
38
+ if (!decoded.id)
39
+ return wrap('❌ get 需要 id');
40
+ const doc = await client().getWorkflow(decoded.id, decoded.scope ?? 'all');
41
+ if (!doc)
42
+ return wrap(`未找到工作流: ${decoded.id}`);
43
+ return wrap([
44
+ `# ${doc.title}`,
45
+ `> ID: ${doc.id} | 范围: ${doc.scope}`,
46
+ '',
47
+ doc.content,
48
+ ].join('\n'));
49
+ }
50
+ case 'save': {
51
+ if (!decoded.id)
52
+ return wrap('❌ save 需要 id');
53
+ if (!decoded.title)
54
+ return wrap('❌ save 需要 title');
55
+ if (!decoded.content)
56
+ return wrap('❌ save 需要 content');
57
+ const doc = await client().saveWorkflow(decoded.id, {
58
+ scope: decoded.scope === 'global' ? 'global' : 'project',
59
+ title: decoded.title,
60
+ description: '',
61
+ system: '',
62
+ keywords: [],
63
+ minHits: 0,
64
+ always: false,
65
+ content: decoded.content,
66
+ });
67
+ return wrap(`✅ 已保存: ${doc.scope}/${doc.id} — ${doc.title}`);
68
+ }
69
+ case 'delete': {
70
+ if (!decoded.id)
71
+ return wrap('❌ delete 需要 id');
72
+ const scope = decoded.scope === 'global' ? 'global' : 'project';
73
+ const ok = await client().deleteWorkflow(decoded.id, scope);
74
+ return wrap(ok ? `✅ 已删除 ${scope}/${decoded.id}` : `未找到 ${scope}/${decoded.id}`);
75
+ }
76
+ default:
77
+ return wrap(`❌ 未知 action: ${String(decoded.action)}`);
78
+ }
79
+ }));
80
+ }
package/dist/utils.d.ts CHANGED
@@ -1,12 +1,6 @@
1
1
  /**
2
2
  * MCP Server 工具函数
3
3
  */
4
- export type RuleType = string;
5
- export declare const RULE_TYPE_LABELS: Record<string, string>;
6
- /**
7
- * 获取指定类型的规则 (动态: 从 meta 获取标签)
8
- */
9
- export declare function getRules(projectId: string, ruleType?: string): Promise<string>;
10
4
  /**
11
5
  * 解码 Unicode 转义序列
12
6
  * 将 \uXXXX 格式的转义序列转换为实际字符
package/dist/utils.js CHANGED
@@ -1,50 +1,6 @@
1
1
  /**
2
2
  * MCP Server 工具函数
3
3
  */
4
- import { getClient } from './storage/httpClient.js';
5
- // 默认规则类型标签 (fallback)
6
- const DEFAULT_LABELS = {
7
- userStyles: '用户沟通规则',
8
- codeStyle: '编码风格规则',
9
- reviewRules: '代码审查规则',
10
- testRules: '错误分析规则',
11
- unitTests: '代码测试规则',
12
- };
13
- // 兼容导出
14
- export const RULE_TYPE_LABELS = DEFAULT_LABELS;
15
- /**
16
- * 将字符串数组格式化为 Markdown 列表
17
- */
18
- function formatRulesList(rules) {
19
- if (!rules || rules.length === 0)
20
- return '';
21
- return rules.map((s, i) => `${i + 1}. ${s}`).join('\n\n');
22
- }
23
- /**
24
- * 获取指定类型的规则 (动态: 从 meta 获取标签)
25
- */
26
- export async function getRules(projectId, ruleType) {
27
- const client = getClient();
28
- const meta = await client.getRulesMeta();
29
- if (ruleType) {
30
- const rules = await client.getRulesApi(ruleType);
31
- if (!rules || rules.length === 0)
32
- return '';
33
- const label = meta[ruleType]?.label || DEFAULT_LABELS[ruleType] || ruleType;
34
- return `[${label}]\n${formatRulesList(rules)}`;
35
- }
36
- // 返回所有规则 (从 meta 获取所有类型)
37
- const types = Object.keys(meta).length > 0 ? Object.keys(meta) : Object.keys(DEFAULT_LABELS);
38
- const allRules = [];
39
- for (const type of types) {
40
- const rules = await client.getRulesApi(type);
41
- if (rules && rules.length > 0) {
42
- const label = meta[type]?.label || DEFAULT_LABELS[type] || type;
43
- allRules.push(`[${label}]\n${formatRulesList(rules)}`);
44
- }
45
- }
46
- return allRules.join('\n\n---\n\n');
47
- }
48
4
  /**
49
5
  * 解码 Unicode 转义序列
50
6
  * 将 \uXXXX 格式的转义序列转换为实际字符
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ppdocs/mcp",
3
- "version": "3.2.37",
3
+ "version": "3.3.0",
4
4
  "description": "ppdocs MCP Server - Knowledge Graph for Claude",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -33,15 +33,11 @@
33
33
  "dependencies": {
34
34
  "@modelcontextprotocol/sdk": "^1.0.0",
35
35
  "adm-zip": "^0.5.16",
36
- "archiver": "^7.0.1",
37
- "chokidar": "^5.0.0",
38
36
  "express": "^5.1.0",
39
37
  "zod": "^4.1.13"
40
38
  },
41
39
  "devDependencies": {
42
40
  "@types/adm-zip": "^0.5.7",
43
- "@types/archiver": "^7.0.0",
44
- "@types/chokidar": "^1.7.5",
45
41
  "@types/express": "^5.0.0",
46
42
  "@types/node": "^22.0.0",
47
43
  "typescript": "^5.7.0"
@@ -12,9 +12,10 @@ kg_discuss(action:"list") -> ???????
12
12
  ## 1. ????????
13
13
 
14
14
  - ??: `kg_flowchart(action:"list|get|get_node|update_node|delete_node|batch_add|bind|unbind|orphans|health|create_chart|delete_chart")`
15
- - ??: `kg_rules(action:"get|save|get_meta|save_meta")`
15
+ - ??: `kg_workflow()` / `kg_workflow(id:"...")` / `kg_workflow(action:"save|delete")`
16
16
  - ??: `kg_task(action:"create|get|update|archive|delete")`
17
17
  - ??: `kg_files(action:"list|read|upload|download|public_*")`
18
+ - ??: `kg_ref(action:"list|get|save|delete|read_file")`
18
19
  - ??/??: `kg_discuss(...)`, `kg_meeting(...)`
19
20
  - ????: `code_scan()`, `code_smart_context(symbolName)`, `code_full_path(symbolA, symbolB)`
20
21
  - ????: ?????????????????????????????? fallback????????????
@@ -22,7 +23,7 @@ kg_discuss(action:"list") -> ???????
22
23
  ## 2. ?????
23
24
 
24
25
  ### Step 1: ????
25
- 1. ?? `kg_flowchart(get)` ????????? `kg_rules(get)` ?????
26
+ 1. ?? `kg_flowchart(get)` ????????? `kg_workflow()` ?????
26
27
  2. ???????? `kg_flowchart(get_node, expand:2, includeDoc:true, includeFiles:true)`?
27
28
  3. ????? `subFlowchart`???????????????
28
29
  4. ??????????? `code_scan()`??? `code_smart_context` / `code_full_path`?
@@ -6,7 +6,7 @@
6
6
 
7
7
  | 文件 | 用途 | 目标路径 |
8
8
  |-----|------|---------|
9
- | `hooks/hook.py` | 动态规则触发脚本 (关键词匹配 + 批量获取) | `.claude/hooks/hook.py` |
9
+ | `hooks/hook.py` | 动态文档工作流触发脚本 (关键词匹配 + 批量获取) | `.claude/hooks/hook.py` |
10
10
  | `hooks/SystemPrompt.md` | 系统提示词模板 | `.claude/hooks/SystemPrompt.md` |
11
11
  | `commands/pp/` | Claude Code 自定义命令 | `.claude/commands/pp/` |
12
12
  | `AGENT.md` | Codex/通用 Agent 提示词 | `./AGENTS.md` |
@@ -45,7 +45,7 @@ CLI 通过 `detectIDEs()` 扫描项目目录,自动为检测到的 IDE 安装
45
45
  ## Hook 触发机制
46
46
 
47
47
  ```
48
- 用户输入 → hook.py → GET /rules-meta → 关键词匹配 → POST /rules/batch → 输出规则
48
+ 用户输入 → hook.py → GET /workflows → 关键词匹配 → POST /workflows/batch → 输出工作流
49
49
  ```
50
50
 
51
51
  hooks 配置由 CLI 动态生成 (`generateHooksConfig()`),无需静态模板文件。
@@ -21,7 +21,7 @@
21
21
  ```
22
22
  kg_flowchart(action:"list") → 知识图谱列表
23
23
  kg_flowchart(action:"get") → 主图结构 (模块 + 连线)
24
- kg_rules(action:"get", ruleType:"errorAnalysis") → 错误分析规则
24
+ kg_workflow(id:"review-audit") → 诊断工作流
25
25
  ```
26
26
 
27
27
  **1.2 关键词定位模块**
@@ -68,7 +68,7 @@ Step 3: 输出疑点路径
68
68
 
69
69
  ```
70
70
  code_smart_context(嫌疑符号名)
71
- → 代码依赖 + 关联文档 + 匹配规则 + 影响范围摘要
71
+ → 代码依赖 + 关联文档 + 匹配工作流 + 影响范围摘要
72
72
 
73
73
  code_impact(嫌疑符号名)
74
74
  → L1 直接引用 (必须检查)
@@ -164,7 +164,7 @@ L2: 2个间接调用方可能受影响
164
164
  |:---|:---|:---|
165
165
  | 锚定 | `kg_flowchart(list/get)` | 全景鸟瞰 |
166
166
  | 锚定 | `kg_flowchart(get)` | 主图结构 |
167
- | 锚定 | `kg_rules(get)` | 分析规则 |
167
+ | 锚定 | `kg_workflow()` / `kg_workflow(id:"...")` | 分析工作流 |
168
168
  | 下探 | `kg_flowchart(get_node, expand:N)` | 节点详情+上下游 |
169
169
  | 下探 | `kg_flowchart(get, chartId:子图)` | 进入子图 |
170
170
  | 半径 | `code_smart_context(symbol)` | 全关联上下文 |
@@ -4,7 +4,7 @@
4
4
 
5
5
  | 原则 | 要求 |
6
6
  |:---|:---|
7
- | **规则驱动** | 必须先加载 kg_rules, 以项目规则为审查标准 |
7
+ | **工作流驱动** | 必须先加载 kg_workflow, Markdown 工作流为审查标准 |
8
8
  | **4维并行** | 逻辑/清洁/极简/图谱一致性 同时扫描 |
9
9
  | **零容忍** | 任一维度 CRITICAL 即驳回, 不存在"下次再改" |
10
10
  | **健康闭环** | 审查必须包含图谱健康检查, 确保知识库同步 |
@@ -26,11 +26,10 @@
26
26
  ### Phase 0: 加载审查标准
27
27
 
28
28
  ```
29
- kg_rules(action:"get", ruleType:"reviewRules") 审查规则
30
- kg_rules(action:"get", ruleType:"codeStyle") 编码风格
31
- kg_rules(action:"get", ruleType:"errorAnalysis") → 错误分析规则
29
+ kg_workflow(id:"review-audit") 审查/诊断工作流
30
+ kg_workflow(id:"common-general")通用执行工作流
32
31
  ```
33
- 将获取的规则作为本次审查的量化标准。
32
+ 将获取的文档工作流作为本次审查的量化标准。
34
33
 
35
34
  **确定审查范围**:
36
35
  ```
@@ -75,7 +74,7 @@ Bash: git log --oneline -3 → 近期提交
75
74
 
76
75
  #### C. 极简架构
77
76
  ```
78
- 对照 codeStyle 规则逐条检查:
77
+ 对照已加载文档工作流中的编码约束逐条检查:
79
78
  × 函数超50行 → 🟡 拆分建议
80
79
  × 嵌套超3层 → 🟡 扁平化建议
81
80
  × 重复造轮子 (code_query 搜索已有实现) → 🔴
@@ -144,9 +143,9 @@ kg_flowchart(action:"health")
144
143
  **概览**: 评分 85/100 | 🔴 0 | 🟡 2 | 🔵 1
145
144
  **状态**: ✅ 通过 / ❌ 驳回
146
145
 
147
- **应用规则**:
148
- - reviewRules: 已加载 N 条
149
- - codeStyle: 已加载 M 条
146
+ **应用文档工作流**:
147
+ - review-audit: 已加载
148
+ - common-general: 已加载
150
149
 
151
150
  **逻辑验证图** (A维度):
152
151
  [用户输入] → [参数校验] → [业务处理] → [返回结果] ✅ 闭环
@@ -174,7 +173,7 @@ kg_flowchart(action:"health")
174
173
 
175
174
  | 阶段 | 工具 | 用途 |
176
175
  |:---|:---|:---|
177
- | 加载 | `kg_rules(get)` | 审查规则/编码风格 |
176
+ | 加载 | `kg_workflow(id:"...")` | 审查/执行工作流 |
178
177
  | 范围 | `code_context(file)` | 变更文件的依赖 |
179
178
  | A逻辑 | 人工推演 + ASCII图 | 逻辑闭环验证 |
180
179
  | B清洁 | `Grep(pattern)` | 死代码/调试残留扫描 |
@@ -12,9 +12,10 @@ kg_discuss(action:"list") -> ???????
12
12
  ## 1. ????????
13
13
 
14
14
  - ??: `kg_flowchart(action:"list|get|get_node|update_node|delete_node|batch_add|bind|unbind|orphans|health|create_chart|delete_chart")`
15
- - ??: `kg_rules(action:"get|save|get_meta|save_meta")`
15
+ - ??: `kg_workflow()` / `kg_workflow(id:"...")` / `kg_workflow(action:"save|delete")`
16
16
  - ??: `kg_task(action:"create|get|update|archive|delete")`
17
17
  - ??: `kg_files(action:"list|read|upload|download|public_*")`
18
+ - ??: `kg_ref(action:"list|get|save|delete|read_file")`
18
19
  - ??/??: `kg_discuss(...)`, `kg_meeting(...)`
19
20
  - ????: `code_scan()`, `code_smart_context(symbolName)`, `code_full_path(symbolA, symbolB)`
20
21
  - ????: ?????????????????????????????? fallback????????????
@@ -22,7 +23,7 @@ kg_discuss(action:"list") -> ???????
22
23
  ## 2. ?????
23
24
 
24
25
  ### Step 1: ????
25
- 1. ?? `kg_flowchart(get)` ????????? `kg_rules(get)` ?????
26
+ 1. ?? `kg_flowchart(get)` ????????? `kg_workflow()` ?????
26
27
  2. ???????? `kg_flowchart(get_node, expand:2, includeDoc:true, includeFiles:true)`?
27
28
  3. ????? `subFlowchart`???????????????
28
29
  4. ??????????? `code_scan()`??? `code_smart_context` / `code_full_path`?
@@ -8,7 +8,7 @@
8
8
  |:---|:---|
9
9
  | **知识图谱中心** | 方案制定前检索图谱+代码双重验证;任务结束提示沉淀至图谱 |
10
10
  | **任务驱动开发** | 复杂任务必须 `kg_task(action:"create")`;过程记录 `kg_task(action:"update")`;完成 `kg_task(action:"archive")` |
11
- | **规则引用** | 编码前读 `codeStyle`;测试前读 `testRules`;审查前读 `reviewRules` |
11
+ | **工作流引用** | `kg_workflow()` 查看当前可用文档工作流;执行前优先读 `common-general`,审查/诊断前优先读 `review-audit` |
12
12
  | **绝对真实性** | 禁用 faker/模拟数据,必须真实环境验证 |
13
13
  | **沟通可视化** | 禁纯文字/Mermaid代码;强制 ASCII流程图 + Markdown表格 |
14
14
  | **极简模块化** | 拆解为原子函数,清理注释旧代码/Debug日志 |
@@ -33,14 +33,14 @@ kg_task(action:"create") → kg_task(action:"update", log_type:"progress|issue|s
33
33
  ### Step 1: 分析与澄清
34
34
  1. 接收需求,识别意图
35
35
  2. `kg_flowchart(action:"search", query:"关键词")` 检索现有节点/历史坑点
36
- 3. `kg_rules(action:"get")` 获取项目规则
36
+ 3. `kg_workflow()` 获取全局/项目文档工作流,按需 `kg_workflow(id:"common-general")`
37
37
  4. 有歧义则列选项供用户选择
38
38
 
39
39
  **输出**: 需求确认清单 (表格)
40
40
 
41
41
  ### Step 2: 逻辑设计
42
42
  1. 结合图谱+代码设计方案
43
- 2. `kg_rules(action:"get", ruleType:"codeStyle")` 确认编码规范
43
+ 2. `kg_workflow(id:"common-general")` 确认通用执行工作流
44
44
  3. 检查现有复用函数,拒绝重复建设
45
45
  4. 大型任务: `kg_task(action:"create")`
46
46
 
@@ -51,13 +51,13 @@ kg_task(action:"create") → kg_task(action:"update", log_type:"progress|issue|s
51
51
  **前置**: 用户确认方案
52
52
  1. `kg_task(action:"update", log_type:"progress", content:"开始编码")`
53
53
  2. 优先编写/更新工具函数,再业务组装
54
- 3. 遵循 codeStyle 规则
54
+ 3. 遵循已加载文档工作流中的编码约束
55
55
  4. 清理现场,无残留代码
56
56
 
57
57
  **输出**: 结构清晰的代码
58
58
 
59
59
  ### Step 4: 真实验证
60
- 1. `kg_rules(action:"get", ruleType:"testRules")` 获取测试规则
60
+ 1. `kg_workflow(id:"review-audit")` 获取验证/诊断工作流
61
61
  2. 在 `tests/` 对应目录创建测试
62
62
  3. 真实环境运行,验证输出
63
63
  4. 失败时: `kg_task(action:"update", log_type:"issue", content:"xxx失败")` → 回溯Step2
@@ -65,7 +65,7 @@ kg_task(action:"create") → kg_task(action:"update", log_type:"progress|issue|s
65
65
  **严禁**: "测试环境所以失败"借口
66
66
 
67
67
  ### Step 5: 审查与沉淀
68
- 1. `kg_rules(action:"get", ruleType:"reviewRules")` 获取审查规则
68
+ 1. `kg_workflow(id:"review-audit")` 获取审查工作流
69
69
  2. 审查目录结构/代码简洁度
70
70
  3. 发现BUG → `kg_flowchart(action:"update_node")` 回写节点说明与文档
71
71
  4. 新逻辑 → `kg_flowchart(action:"batch_add")` 新增节点,或 `kg_flowchart(action:"update_node")` 追加文档/版本