@ppdocs/mcp 2.3.0 → 2.5.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.
package/README.md ADDED
@@ -0,0 +1,201 @@
1
+ # @ppdocs/mcp
2
+
3
+ > Knowledge Graph MCP Server for Claude - 让 Claude 拥有项目知识图谱记忆
4
+
5
+ [![npm version](https://badge.fury.io/js/%40ppdocs%2Fmcp.svg)](https://www.npmjs.com/package/@ppdocs/mcp)
6
+
7
+ ## 概述
8
+
9
+ ppdocs MCP 是一个 [Model Context Protocol](https://modelcontextprotocol.io/) 服务器,让 Claude 能够在对话中构建和查询项目知识图谱。
10
+
11
+ ```
12
+ ┌─────────────┐ MCP ┌─────────────┐ HTTP ┌─────────────┐
13
+ │ Claude AI │ ──────────── │ @ppdocs/mcp │ ────────── │ ppdocs 桌面 │
14
+ └─────────────┘ └─────────────┘ └──────┬──────┘
15
+
16
+ ┌──────▼──────┐
17
+ │ 知识图谱 │
18
+ │ 文件存储 │
19
+ └─────────────┘
20
+ ```
21
+
22
+ ### 核心功能
23
+
24
+ | 功能 | 描述 |
25
+ |------|------|
26
+ | 📊 **知识图谱** | 创建、更新、删除、搜索节点 |
27
+ | 🔗 **依赖追踪** | 自动计算节点间的依赖关系 |
28
+ | 📝 **任务管理** | 记录开发任务、进度日志、经验总结 |
29
+ | 🔍 **智能搜索** | 多关键词搜索,按相关度排序 |
30
+ | 🛤️ **路径分析** | 查找两节点间的依赖路径 |
31
+
32
+ ---
33
+
34
+ ## 快速开始
35
+
36
+ ### 1. 安装
37
+
38
+ ```bash
39
+ npm install -g @ppdocs/mcp
40
+ ```
41
+
42
+ ### 2. 初始化项目
43
+
44
+ ```bash
45
+ npx @ppdocs/mcp init -p <项目ID> -k <密钥>
46
+ ```
47
+
48
+ 这会自动:
49
+ - 创建 `.ppdocs` 配置文件
50
+ - 创建 `.mcp.json` MCP 配置
51
+ - 安装工作流模板到 `.claude/`
52
+
53
+ ### 3. 配置 Claude Desktop
54
+
55
+ 在 Claude Desktop 配置文件中添加:
56
+
57
+ **macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`
58
+ **Windows**: `%APPDATA%\Claude\claude_desktop_config.json`
59
+
60
+ ```json
61
+ {
62
+ "mcpServers": {
63
+ "ppdocs": {
64
+ "command": "npx",
65
+ "args": ["-y", "@ppdocs/mcp"],
66
+ "env": {
67
+ "PPDOCS_API_URL": "http://localhost:20001/api/项目ID/密码"
68
+ }
69
+ }
70
+ }
71
+ }
72
+ ```
73
+
74
+ ### 4. 获取 API URL
75
+
76
+ 1. 打开 ppdocs 桌面应用
77
+ 2. 选择一个项目 → 点击设置图标
78
+ 3. 复制 **MCP 连接地址**
79
+
80
+ ---
81
+
82
+ ## CLI 命令
83
+
84
+ ```bash
85
+ # 初始化 (Claude Code 模式)
86
+ npx @ppdocs/mcp init -p <projectId> -k <key>
87
+
88
+ # 初始化 (Codex 模式 - 生成 AGENTS.md)
89
+ npx @ppdocs/mcp init -p <projectId> -k <key> --codex
90
+
91
+ # 选项
92
+ -p, --project 项目 ID (必填)
93
+ -k, --key API 密钥 (必填)
94
+ -u, --user 用户名 (可选,自动生成)
95
+ --port API 端口 (默认: 20001)
96
+ --api API 主机 (默认: localhost)
97
+ --codex Codex 模式
98
+ ```
99
+
100
+ ---
101
+
102
+ ## 工具列表
103
+
104
+ ### 知识图谱工具
105
+
106
+ | 工具 | 说明 |
107
+ |------|------|
108
+ | `kg_create_node` | 创建知识节点 |
109
+ | `kg_update_node` | 更新节点内容 |
110
+ | `kg_delete_node` | 删除节点 |
111
+ | `kg_lock_node` | 锁定节点 (AI 只能锁定,解锁需前端手动) |
112
+ | `kg_list_nodes` | 列出所有节点 |
113
+ | `kg_search` | 关键词搜索 |
114
+ | `kg_find_path` | 查找依赖路径 |
115
+ | `kg_find_orphans` | 查找孤立节点 |
116
+ | `kg_get_relations` | 获取节点关系 |
117
+
118
+ ### 任务管理工具
119
+
120
+ | 工具 | 说明 |
121
+ |------|------|
122
+ | `task_create` | 创建开发任务 |
123
+ | `task_list` | 列出任务 |
124
+ | `task_get` | 获取任务详情 |
125
+ | `task_add_log` | 添加进度日志 |
126
+ | `task_complete` | 完成任务并归档 |
127
+
128
+ ---
129
+
130
+ ## 节点类型
131
+
132
+ | 类型 | 说明 | 适用场景 |
133
+ |------|------|----------|
134
+ | `logic` | 逻辑/函数 | 算法、处理流程、API 接口 |
135
+ | `data` | 数据结构 | 数据库表、配置、状态定义 |
136
+ | `intro` | 概念介绍 | 架构说明、设计决策、术语解释 |
137
+
138
+ ## 节点状态
139
+
140
+ | 状态 | 说明 |
141
+ |------|------|
142
+ | `incomplete` | 未完成 (默认) |
143
+ | `complete` | 已完成 |
144
+ | `fixing` | 修复中 |
145
+ | `refactoring` | 重构中 |
146
+ | `deprecated` | 已废弃 |
147
+
148
+ ---
149
+
150
+ ## 环境变量
151
+
152
+ | 变量 | 说明 | 示例 |
153
+ |------|------|------|
154
+ | `PPDOCS_API_URL` | API 完整地址 | `http://localhost:20001/api/myproject/abc123` |
155
+ | `PPDOCS_PROJECT` | 项目 ID | `myproject` |
156
+ | `PPDOCS_KEY` | 访问密钥 | `abc123` |
157
+ | `PPDOCS_USER` | 用户名 | `developer` |
158
+
159
+ ---
160
+
161
+ ## 常见问题
162
+
163
+ **Q: 连接失败怎么办?**
164
+
165
+ 1. 确保 ppdocs 桌面应用正在运行
166
+ 2. 检查端口是否正确 (默认 20001)
167
+ 3. 验证 API URL 格式
168
+
169
+ **Q: 节点无法删除?**
170
+
171
+ - 节点被锁定 → 在 ppdocs 桌面应用中手动解锁
172
+ - 是根节点 → 根节点不可删除
173
+
174
+ ---
175
+
176
+ ## 更新日志
177
+
178
+ ### v2.5.0
179
+ - ✨ 新增 CLI init 命令,自动安装工作流模板
180
+ - ✨ 支持 Codex 模式 (--codex)
181
+ - 📦 构建时自动复制模板
182
+
183
+ ### v2.4.0
184
+ - 🛡️ `kg_lock_node` 只能锁定,解锁需前端手动操作
185
+ - ⚡ 后端自动记录操作日志
186
+
187
+ ### v2.3.0
188
+ - 新增任务管理功能
189
+ - 添加文件锁防止并发写入
190
+
191
+ ---
192
+
193
+ ## 许可证
194
+
195
+ MIT License
196
+
197
+ ## 相关链接
198
+
199
+ - [ppdocs 桌面应用](https://github.com/ppdocs/ppdocs)
200
+ - [MCP 协议文档](https://modelcontextprotocol.io/)
201
+ - [问题反馈](https://github.com/ppdocs/ppdocs/issues)
package/dist/cli.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
2
  * ppdocs MCP CLI
3
- * 命令: init - 初始化项目配置
3
+ * 命令: init - 初始化项目配置 + 安装工作流模板
4
4
  */
5
5
  export declare function runCli(args: string[]): boolean;
package/dist/cli.js CHANGED
@@ -1,16 +1,19 @@
1
1
  /**
2
2
  * ppdocs MCP CLI
3
- * 命令: init - 初始化项目配置
3
+ * 命令: init - 初始化项目配置 + 安装工作流模板
4
4
  */
5
5
  import * as fs from 'fs';
6
6
  import * as path from 'path';
7
+ import { fileURLToPath } from 'url';
8
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
9
+ const TEMPLATES_DIR = path.join(__dirname, '..', 'templates');
7
10
  /** 生成随机用户名 (8位字母数字) */
8
11
  function generateUser() {
9
12
  const chars = 'abcdefghjkmnpqrstuvwxyz23456789';
10
13
  return Array.from({ length: 8 }, () => chars[Math.floor(Math.random() * chars.length)]).join('');
11
14
  }
12
15
  function parseArgs(args) {
13
- const opts = { port: 20001, api: 'localhost' };
16
+ const opts = { port: 20001, api: 'localhost', codex: false };
14
17
  for (let i = 0; i < args.length; i++) {
15
18
  const arg = args[i];
16
19
  if (arg === '-p' || arg === '--project') {
@@ -28,10 +31,12 @@ function parseArgs(args) {
28
31
  else if (arg === '--api') {
29
32
  opts.api = args[++i];
30
33
  }
34
+ else if (arg === '--codex') {
35
+ opts.codex = true;
36
+ }
31
37
  }
32
38
  if (!opts.project || !opts.key)
33
39
  return null;
34
- // 如果没设置 user,自动生成
35
40
  if (!opts.user)
36
41
  opts.user = generateUser();
37
42
  return opts;
@@ -41,7 +46,7 @@ function showHelp() {
41
46
  ppdocs MCP CLI
42
47
 
43
48
  Commands:
44
- init Initialize ppdocs config in current directory
49
+ init Initialize ppdocs config + install workflow templates
45
50
 
46
51
  Usage:
47
52
  npx @ppdocs/mcp init -p <projectId> -k <key> [options]
@@ -49,13 +54,14 @@ Usage:
49
54
  Options:
50
55
  -p, --project Project ID (required)
51
56
  -k, --key API key (required)
52
- -u, --user User name for logs (optional, auto-generated if not set)
57
+ -u, --user User name for logs (optional, auto-generated)
53
58
  --port API port (default: 20001)
54
59
  --api API host (default: localhost)
60
+ --codex Codex mode: generate AGENTS.md instead of .claude/
55
61
 
56
62
  Example:
57
63
  npx @ppdocs/mcp init -p myproject -k abc123xyz
58
- npx @ppdocs/mcp init -p myproject -k abc123xyz -u alice
64
+ npx @ppdocs/mcp init -p myproject -k abc123xyz --codex
59
65
  `);
60
66
  }
61
67
  export function runCli(args) {
@@ -108,6 +114,13 @@ function initProject(opts) {
108
114
  };
109
115
  fs.writeFileSync(mcpPath, JSON.stringify(mcpConfig, null, 2));
110
116
  console.log(`✅ Created ${mcpPath}`);
117
+ // Install workflow templates
118
+ if (opts.codex) {
119
+ installCodexTemplates(cwd);
120
+ }
121
+ else {
122
+ installClaudeTemplates(cwd);
123
+ }
111
124
  console.log(`
112
125
  🎉 Done! ppdocs MCP configured for project: ${opts.project}
113
126
  User: ${opts.user}
@@ -115,3 +128,69 @@ function initProject(opts) {
115
128
  Restart Claude Code to use ppdocs knowledge graph.
116
129
  `);
117
130
  }
131
+ /** 递归复制目录 */
132
+ function copyDirRecursive(src, dest) {
133
+ if (!fs.existsSync(src))
134
+ return;
135
+ fs.mkdirSync(dest, { recursive: true });
136
+ for (const entry of fs.readdirSync(src, { withFileTypes: true })) {
137
+ const srcPath = path.join(src, entry.name);
138
+ const destPath = path.join(dest, entry.name);
139
+ if (entry.isDirectory()) {
140
+ copyDirRecursive(srcPath, destPath);
141
+ }
142
+ else {
143
+ fs.copyFileSync(srcPath, destPath);
144
+ }
145
+ }
146
+ }
147
+ /** 安装 Claude Code 模板 */
148
+ function installClaudeTemplates(cwd) {
149
+ const claudeDir = path.join(cwd, '.claude');
150
+ // 1. 复制 commands/pp/
151
+ const srcCommands = path.join(TEMPLATES_DIR, 'commands', 'pp');
152
+ const destCommands = path.join(claudeDir, 'commands', 'pp');
153
+ if (fs.existsSync(srcCommands)) {
154
+ copyDirRecursive(srcCommands, destCommands);
155
+ console.log(`✅ Installed .claude/commands/pp/`);
156
+ }
157
+ // 2. 复制 hooks/
158
+ const srcHooks = path.join(TEMPLATES_DIR, 'hooks');
159
+ const destHooks = path.join(claudeDir, 'hooks');
160
+ if (fs.existsSync(srcHooks)) {
161
+ copyDirRecursive(srcHooks, destHooks);
162
+ console.log(`✅ Installed .claude/hooks/`);
163
+ }
164
+ // 3. 合并 settings.local.json hooks 配置
165
+ const settingsHooksPath = path.join(TEMPLATES_DIR, 'settings-hooks.json');
166
+ const settingsLocalPath = path.join(claudeDir, 'settings.local.json');
167
+ if (fs.existsSync(settingsHooksPath)) {
168
+ let existingSettings = {};
169
+ if (fs.existsSync(settingsLocalPath)) {
170
+ try {
171
+ existingSettings = JSON.parse(fs.readFileSync(settingsLocalPath, 'utf-8'));
172
+ }
173
+ catch { /* ignore */ }
174
+ }
175
+ const hooksConfig = JSON.parse(fs.readFileSync(settingsHooksPath, 'utf-8'));
176
+ const mergedSettings = {
177
+ ...existingSettings,
178
+ hooks: hooksConfig.hooks
179
+ };
180
+ fs.mkdirSync(claudeDir, { recursive: true });
181
+ fs.writeFileSync(settingsLocalPath, JSON.stringify(mergedSettings, null, 2));
182
+ console.log(`✅ Configured .claude/settings.local.json hooks`);
183
+ }
184
+ }
185
+ /** 安装 Codex 模板 (生成 AGENTS.md) */
186
+ function installCodexTemplates(cwd) {
187
+ const srcPrompt = path.join(TEMPLATES_DIR, 'hooks', 'SystemPrompt.md');
188
+ const destAgents = path.join(cwd, 'AGENTS.md');
189
+ if (fs.existsSync(srcPrompt)) {
190
+ fs.copyFileSync(srcPrompt, destAgents);
191
+ console.log(`✅ Created AGENTS.md (Codex mode)`);
192
+ }
193
+ else {
194
+ console.log(`⚠️ SystemPrompt.md template not found`);
195
+ }
196
+ }
@@ -83,10 +83,3 @@ export declare function createTask(_projectId: string, task: {
83
83
  }, creator: string): Promise<Task>;
84
84
  export declare function addTaskLog(_projectId: string, taskId: string, logType: TaskLogType, content: string): Promise<Task | null>;
85
85
  export declare function completeTask(_projectId: string, taskId: string, experience: TaskExperience): Promise<Task | null>;
86
- export interface LogEntry {
87
- user: string;
88
- action: string;
89
- target: string;
90
- node_id?: string;
91
- }
92
- export declare function appendLog(_projectId: string, entry: LogEntry): Promise<void>;
@@ -14,22 +14,36 @@ export class PpdocsApiClient {
14
14
  // ============ HTTP 请求工具 ============
15
15
  async request(path, options = {}) {
16
16
  const url = `${this.baseUrl}${path}`;
17
- const response = await fetch(url, {
18
- ...options,
19
- headers: {
20
- 'Content-Type': 'application/json',
21
- ...options.headers
17
+ const controller = new AbortController();
18
+ const timeout = setTimeout(() => controller.abort(), 10000); // 10秒超时
19
+ try {
20
+ const response = await fetch(url, {
21
+ ...options,
22
+ signal: controller.signal,
23
+ headers: {
24
+ 'Content-Type': 'application/json',
25
+ ...options.headers
26
+ }
27
+ });
28
+ if (!response.ok) {
29
+ const error = await response.json().catch(() => ({ error: response.statusText }));
30
+ throw new Error(error.error || `HTTP ${response.status}`);
22
31
  }
23
- });
24
- if (!response.ok) {
25
- const error = await response.json().catch(() => ({ error: response.statusText }));
26
- throw new Error(error.error || `HTTP ${response.status}`);
32
+ const json = await response.json();
33
+ if (!json.success) {
34
+ throw new Error(json.error || 'Unknown error');
35
+ }
36
+ return json.data;
37
+ }
38
+ catch (err) {
39
+ if (err instanceof Error && err.name === 'AbortError') {
40
+ throw new Error('Request timeout (10s)');
41
+ }
42
+ throw err;
27
43
  }
28
- const json = await response.json();
29
- if (!json.success) {
30
- throw new Error(json.error || 'Unknown error');
44
+ finally {
45
+ clearTimeout(timeout);
31
46
  }
32
- return json.data;
33
47
  }
34
48
  // ============ 节点操作 ============
35
49
  async listNodes() {
@@ -272,15 +286,3 @@ export async function addTaskLog(_projectId, taskId, logType, content) {
272
286
  export async function completeTask(_projectId, taskId, experience) {
273
287
  return getClient().completeTask(taskId, experience);
274
288
  }
275
- export async function appendLog(_projectId, entry) {
276
- try {
277
- await getClient()['request']('/logs', {
278
- method: 'POST',
279
- body: JSON.stringify(entry)
280
- });
281
- console.error(`[LOG] ${entry.action}: ${entry.target}`);
282
- }
283
- catch (err) {
284
- console.error(`[LOG ERROR] Failed to append log:`, err);
285
- }
286
- }
@@ -6,7 +6,7 @@ export interface Edge {
6
6
  auto?: boolean;
7
7
  }
8
8
  export type NodeType = 'logic' | 'data' | 'intro';
9
- export type NodeStatus = 'incomplete' | 'complete' | 'fixing' | 'refactoring' | 'deprecated' | 'locked';
9
+ export type NodeStatus = 'incomplete' | 'complete' | 'fixing' | 'refactoring' | 'deprecated';
10
10
  export interface DataRef {
11
11
  type: string;
12
12
  description: string;
@@ -1,2 +1,2 @@
1
1
  import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
- export declare function registerTools(server: McpServer, projectId: string, user: string): void;
2
+ export declare function registerTools(server: McpServer, projectId: string, _user: string): void;
@@ -1,10 +1,6 @@
1
1
  import { z } from 'zod';
2
2
  import * as storage from '../storage/httpClient.js';
3
- export function registerTools(server, projectId, user) {
4
- // 日志辅助函数
5
- const log = (action, target, nodeId) => {
6
- storage.appendLog(projectId, { user, action, target, node_id: nodeId });
7
- };
3
+ export function registerTools(server, projectId, _user) {
8
4
  // 1. 创建节点
9
5
  server.tool('kg_create_node', '创建知识节点。type: logic=逻辑/函数, data=数据结构, intro=概念介绍', {
10
6
  title: z.string().describe('节点标题'),
@@ -29,15 +25,11 @@ export function registerTools(server, projectId, user) {
29
25
  categories: args.tags || [],
30
26
  dependencies: args.dependencies || []
31
27
  });
32
- log('create_node', args.title, node.id);
33
28
  return { content: [{ type: 'text', text: JSON.stringify(node, null, 2) }] };
34
29
  });
35
30
  // 2. 删除节点
36
31
  server.tool('kg_delete_node', '删除节点(锁定节点和根节点不可删除)', { nodeId: z.string().describe('节点ID') }, async (args) => {
37
- const node = await storage.getNode(projectId, args.nodeId);
38
32
  const success = await storage.deleteNode(projectId, args.nodeId);
39
- if (success)
40
- log('delete_node', node?.title || args.nodeId, args.nodeId);
41
33
  return { content: [{ type: 'text', text: success ? '删除成功' : '删除失败(节点不存在/已锁定/是根节点)' }] };
42
34
  });
43
35
  // 3. 更新节点
@@ -57,18 +49,13 @@ export function registerTools(server, projectId, user) {
57
49
  // API 参数 tags 转换为内部字段 categories
58
50
  const updates = tags !== undefined ? { ...rest, categories: tags } : rest;
59
51
  const node = await storage.updateNode(projectId, nodeId, updates);
60
- if (node)
61
- log('update_node', node.title, nodeId);
62
52
  return { content: [{ type: 'text', text: node ? JSON.stringify(node, null, 2) : '更新失败(节点不存在或已锁定)' }] };
63
53
  });
64
- // 4. 锁定/解锁节点
65
- server.tool('kg_lock_node', '锁定/解锁节点(锁定后只能读取)', {
66
- nodeId: z.string().describe('节点ID'),
67
- locked: z.boolean().describe('true=锁定, false=解锁')
54
+ // 4. 锁定节点 (只能锁定,解锁需用户在前端手动操作)
55
+ server.tool('kg_lock_node', '锁定节点(锁定后只能读取,解锁需用户在前端手动操作)', {
56
+ nodeId: z.string().describe('节点ID')
68
57
  }, async (args) => {
69
- const node = await storage.lockNode(projectId, args.nodeId, args.locked);
70
- if (node)
71
- log(args.locked ? 'lock_node' : 'unlock_node', node.title, args.nodeId);
58
+ const node = await storage.lockNode(projectId, args.nodeId, true); // 强制锁定
72
59
  return { content: [{ type: 'text', text: node ? JSON.stringify(node, null, 2) : '操作失败' }] };
73
60
  });
74
61
  // 5. 搜索节点
@@ -142,8 +129,7 @@ export function registerTools(server, projectId, user) {
142
129
  description: args.description,
143
130
  goals: args.goals || [],
144
131
  related_nodes: args.related_nodes
145
- }, user);
146
- log('create_task', args.title, task.id);
132
+ }, _user);
147
133
  return { content: [{ type: 'text', text: JSON.stringify(task, null, 2) }] };
148
134
  });
149
135
  // 11. 列出任务
@@ -181,7 +167,6 @@ export function registerTools(server, projectId, user) {
181
167
  if (!task) {
182
168
  return { content: [{ type: 'text', text: '添加失败(任务不存在或已归档)' }] };
183
169
  }
184
- log('add_task_log', `${args.log_type}: ${args.content.slice(0, 50)}...`, args.taskId);
185
170
  return { content: [{ type: 'text', text: `日志已添加,任务共有 ${task.logs.length} 条日志` }] };
186
171
  });
187
172
  // 14. 完成任务
@@ -204,7 +189,6 @@ export function registerTools(server, projectId, user) {
204
189
  if (!task) {
205
190
  return { content: [{ type: 'text', text: '完成失败(任务不存在或已归档)' }] };
206
191
  }
207
- log('complete_task', task.title, args.taskId);
208
192
  return { content: [{ type: 'text', text: `任务已完成归档: ${task.title}` }] };
209
193
  });
210
194
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ppdocs/mcp",
3
- "version": "2.3.0",
3
+ "version": "2.5.0",
4
4
  "description": "ppdocs MCP Server - Knowledge Graph for Claude",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -8,6 +8,7 @@
8
8
  "ppdocs-mcp": "dist/index.js"
9
9
  },
10
10
  "scripts": {
11
+ "prebuild": "node scripts/copy-templates.js",
11
12
  "build": "tsc",
12
13
  "start": "node dist/index.js"
13
14
  },
@@ -0,0 +1,106 @@
1
+ ---
2
+ description: 初始化知识图谱:100%扫描代码库,为每个模块创建完整的图表化知识节点
3
+ ---
4
+
5
+ # /init 项目初始化
6
+
7
+ 执行 `task_create("项目初始化: [项目名]")` → 递归扫描全部代码文件 → 逐文件审查创建节点 → 每处理5个文件调用 `task_add_log(progress)` 同步进度 → 全部完成后 `task_complete` 输出统计报告
8
+
9
+ ## 扫描规则
10
+
11
+ **100%覆盖**: 递归遍历项目所有目录,不遗漏任何代码文件
12
+
13
+ **忽略目录**: node_modules, dist, build, .git, .next, .nuxt, target, __pycache__
14
+
15
+ **忽略文件**: .env*, *.lock, *.log, *.min.js, *.map, 图片(png/jpg/svg/ico), 字体(ttf/woff)
16
+
17
+ **扫描顺序**: ①入口(main/index/App/lib.rs) → ②配置(package.json/tsconfig/Cargo.toml) → ③核心目录按字母序
18
+
19
+ ## 节点字段规范
20
+
21
+ 每个节点必须填写以下字段,不可遗漏:
22
+
23
+ | 字段 | 必填 | 说明 |
24
+ |:---|:---|:---|
25
+ | title | ✅ | 格式 `[模块]:[文件名] 中文描述`,如 `Auth:login 用户登录处理` |
26
+ | type | ✅ | `logic`(函数/组件/流程) `data`(类型/接口/结构) `intro`(架构/概念/说明) |
27
+ | status | ✅ | 初始化统一设为 `incomplete`,待用户确认后改 `complete` |
28
+ | signature | ✅ | 用于依赖匹配的唯一标识:函数名/类名/组件名/模块路径 |
29
+ | categories | ✅ | 从17种分类中选择: ui/function/class/library/reusable/snippet/data/logic/api/config/util/service/model/constant/type/hook/middleware |
30
+ | description | ✅ | **必须包含Mermaid流程图+表格**,禁止纯文字,详见下方模板 |
31
+ | dataInput | 函数必填 | `{type: "类型定义", description: "参数说明"}` |
32
+ | dataOutput | 函数必填 | `{type: "返回类型", description: "返回值说明"}` |
33
+ | dependencies | ✅ | 依赖的其他模块 `[{name: "目标signature", description: "依赖原因"}]`,无依赖填空数组 |
34
+ | relatedFiles | ✅ | 关联的源文件路径数组,如 `["src/services/auth.ts"]` |
35
+
36
+ ## description 模板
37
+
38
+ ### logic节点 (函数/组件/Hook)
39
+ ```markdown
40
+ ```mermaid
41
+ flowchart LR
42
+ A[入口/触发] --> B{条件判断}
43
+ B -->|成功| C[核心处理]
44
+ B -->|失败| D[错误处理]
45
+ C --> E[返回结果]
46
+ ```
47
+
48
+ | 接口 | 类型 | 说明 |
49
+ |:---|:---|:---|
50
+ | Input | `ParamType` | 参数描述 |
51
+ | Output | `ReturnType` | 返回值描述 |
52
+
53
+ **核心逻辑**: 一句话描述函数职责
54
+ ```
55
+
56
+ ### data节点 (类型/接口/枚举)
57
+ ```markdown
58
+ ```mermaid
59
+ classDiagram
60
+ class TypeName {
61
+ +fieldType field1
62
+ +fieldType field2
63
+ }
64
+ ```
65
+
66
+ | 字段 | 类型 | 必填 | 说明 |
67
+ |:---|:---|:---|:---|
68
+ | field1 | string | ✅ | 字段用途 |
69
+ | field2 | number | ❌ | 字段用途 |
70
+ ```
71
+
72
+ ### intro节点 (架构/模块说明)
73
+ ```markdown
74
+ ```mermaid
75
+ flowchart TB
76
+ subgraph 模块名[模块职责]
77
+ A --> B --> C
78
+ end
79
+ ```
80
+
81
+ **职责**: 模块核心功能描述
82
+ **关键依赖**: 列出核心依赖模块
83
+ ```
84
+
85
+ ## 进度同步
86
+
87
+ 每处理5个文件或完成1个目录后,调用 `task_add_log("progress", "已处理: [文件列表], 创建节点: N个")`
88
+
89
+ ## 完成输出
90
+
91
+ `task_complete` 时输出完整统计:
92
+
93
+ ```markdown
94
+ | 统计项 | 数量 |
95
+ |:---|:---|
96
+ | 扫描文件 | N |
97
+ | 创建节点 | N |
98
+ | 依赖关系 | N |
99
+
100
+ | 目录 | 文件数 | 节点数 | 覆盖率 |
101
+ |:---|:---|:---|:---|
102
+ | src/components | 12 | 12 | 100% |
103
+ | src/services | 8 | 8 | 100% |
104
+
105
+ **待人工补充**: [列出复杂度高需要人工完善description的节点]
106
+ ```
@@ -0,0 +1,106 @@
1
+ ---
2
+ description: 初始化知识图谱:100%扫描代码库,为每个模块创建完整的图表化知识节点
3
+ ---
4
+
5
+ # /init 项目初始化
6
+
7
+ 执行 `task_create("项目初始化: [项目名]")` → 递归扫描全部代码文件 → 逐文件审查创建节点 → 每处理5个文件调用 `task_add_log(progress)` 同步进度 → 全部完成后 `task_complete` 输出统计报告
8
+
9
+ ## 扫描规则
10
+
11
+ **100%覆盖**: 递归遍历项目所有目录,不遗漏任何代码文件
12
+
13
+ **忽略目录**: node_modules, dist, build, .git, .next, .nuxt, target, __pycache__
14
+
15
+ **忽略文件**: .env*, *.lock, *.log, *.min.js, *.map, 图片(png/jpg/svg/ico), 字体(ttf/woff)
16
+
17
+ **扫描顺序**: ①入口(main/index/App/lib.rs) → ②配置(package.json/tsconfig/Cargo.toml) → ③核心目录按字母序
18
+
19
+ ## 节点字段规范
20
+
21
+ 每个节点必须填写以下字段,不可遗漏:
22
+
23
+ | 字段 | 必填 | 说明 |
24
+ |:---|:---|:---|
25
+ | title | ✅ | 格式 `[模块]:[文件名] 中文描述`,如 `Auth:login 用户登录处理` |
26
+ | type | ✅ | `logic`(函数/组件/流程) `data`(类型/接口/结构) `intro`(架构/概念/说明) |
27
+ | status | ✅ | 初始化统一设为 `incomplete`,待用户确认后改 `complete` |
28
+ | signature | ✅ | 用于依赖匹配的唯一标识:函数名/类名/组件名/模块路径 |
29
+ | categories | ✅ | 从17种分类中选择: ui/function/class/library/reusable/snippet/data/logic/api/config/util/service/model/constant/type/hook/middleware |
30
+ | description | ✅ | **必须包含Mermaid流程图+表格**,禁止纯文字,详见下方模板 |
31
+ | dataInput | 函数必填 | `{type: "类型定义", description: "参数说明"}` |
32
+ | dataOutput | 函数必填 | `{type: "返回类型", description: "返回值说明"}` |
33
+ | dependencies | ✅ | 依赖的其他模块 `[{name: "目标signature", description: "依赖原因"}]`,无依赖填空数组 |
34
+ | relatedFiles | ✅ | 关联的源文件路径数组,如 `["src/services/auth.ts"]` |
35
+
36
+ ## description 模板
37
+
38
+ ### logic节点 (函数/组件/Hook)
39
+ ```markdown
40
+ ```mermaid
41
+ flowchart LR
42
+ A[入口/触发] --> B{条件判断}
43
+ B -->|成功| C[核心处理]
44
+ B -->|失败| D[错误处理]
45
+ C --> E[返回结果]
46
+ ```
47
+
48
+ | 接口 | 类型 | 说明 |
49
+ |:---|:---|:---|
50
+ | Input | `ParamType` | 参数描述 |
51
+ | Output | `ReturnType` | 返回值描述 |
52
+
53
+ **核心逻辑**: 一句话描述函数职责
54
+ ```
55
+
56
+ ### data节点 (类型/接口/枚举)
57
+ ```markdown
58
+ ```mermaid
59
+ classDiagram
60
+ class TypeName {
61
+ +fieldType field1
62
+ +fieldType field2
63
+ }
64
+ ```
65
+
66
+ | 字段 | 类型 | 必填 | 说明 |
67
+ |:---|:---|:---|:---|
68
+ | field1 | string | ✅ | 字段用途 |
69
+ | field2 | number | ❌ | 字段用途 |
70
+ ```
71
+
72
+ ### intro节点 (架构/模块说明)
73
+ ```markdown
74
+ ```mermaid
75
+ flowchart TB
76
+ subgraph 模块名[模块职责]
77
+ A --> B --> C
78
+ end
79
+ ```
80
+
81
+ **职责**: 模块核心功能描述
82
+ **关键依赖**: 列出核心依赖模块
83
+ ```
84
+
85
+ ## 进度同步
86
+
87
+ 每处理5个文件或完成1个目录后,调用 `task_add_log("progress", "已处理: [文件列表], 创建节点: N个")`
88
+
89
+ ## 完成输出
90
+
91
+ `task_complete` 时输出完整统计:
92
+
93
+ ```markdown
94
+ | 统计项 | 数量 |
95
+ |:---|:---|
96
+ | 扫描文件 | N |
97
+ | 创建节点 | N |
98
+ | 依赖关系 | N |
99
+
100
+ | 目录 | 文件数 | 节点数 | 覆盖率 |
101
+ |:---|:---|:---|:---|
102
+ | src/components | 12 | 12 | 100% |
103
+ | src/services | 8 | 8 | 100% |
104
+
105
+ **待人工补充**: [列出复杂度高需要人工完善description的节点]
106
+ ```
@@ -0,0 +1,60 @@
1
+ ---
2
+ description: 全维度智能代码审查:架构、逻辑、规范与冗余治理
3
+ argument-hint: "[all|recent]"
4
+ ---
5
+
6
+ # Role
7
+ 你是一位拥有10年以上经验的资深软件架构师和代码审查专家。你的目标是确保代码库保持“整洁架构(Clean Architecture)”标准,具备高可维护性、高性能和安全性。
8
+
9
+ # Input Context
10
+ 根据参数 `$ARGUMENTS` 确定审查范围:
11
+ - **recent**: 仅审查最近修改的文件(基于 git diff 上下文或文件最后修改时间)。
12
+ - **all** (默认): 递归审查整个项目的所有代码文件。
13
+
14
+ # Workflow
15
+ 请严格按照以下维度对代码进行深度扫描,并输出审查报告:
16
+
17
+ ## 1. 🧹 冗余与废弃物清理 (Redundancy Cleanup)
18
+ - **重复代码 (DRY原则)**: 识别雷同的代码块,特别是跨文件复制粘贴的逻辑。
19
+ - **僵尸代码**: 标记未使用的变量、函数、类导入(Imports)以及无法到达的代码分支(Dead Code)。
20
+ - **注释清理**: 移除被注释掉的旧代码块,移除无意义的冗余注释。
21
+
22
+ ## 2. 🔄 版本一致性与冲突 (Version Control)
23
+ - **混合代码检测**: 严查新旧API混用情况,确保同一功能仅使用最新版本的实现方式。
24
+ - **冲突标记**: 扫描是否存在未解决的 Git 合并冲突标记(如 `<<<<<<< HEAD`)。
25
+ - **废弃特性**: 识别并建议替换已标记为 Deprecated 的方法或库。
26
+
27
+ ## 3. 🧩 模块化与复用 (Modularity & Reusability)
28
+ - **组件封装**: 检查UI代码,凡是出现相似结构超过2次的地方,必须建议封装为独立组件。
29
+ - **工具函数提取**: 将通用的逻辑处理(如日期格式化、数据校验)建议提取到 `/utils` 或 `/hooks` 目录。
30
+ - **单一职责 (SRP)**: 确保每个函数/类只做一件事,避免“上帝类(God Class)”。
31
+
32
+ ## 4. 🧠 逻辑与健壮性 (Logic & Robustness)
33
+ - **流程分析**: 模拟代码执行路径,检查逻辑闭环。
34
+ - **边界情况**: 重点审查空指针(Null/Undefined)、数组越界、除以零等异常情况。
35
+ - **错误处理**: 检查是否缺少必要的 `try-catch` 块或错误回退(Fallback)机制。
36
+
37
+ ## 5. 📦 依赖与环境 (Dependencies)
38
+ - **依赖瘦身**: 识别 `package.json` 或 `requirements.txt` 中声明但未使用的库。
39
+ - **版本健康**: (如果可能) 提示过旧的依赖版本,建议升级到稳定版。
40
+
41
+ ## 6. 🎨 代码风格与文件结构 (Style & Structure)
42
+ - **可读性**: 变量/函数命名应具备语义化(Self-documenting),避免使用 `a`, `b`, `temp` 等模糊命名。
43
+ - **文件拆分**: 对于超过 300 行的代码文件,强制建议按功能拆分到子目录中。
44
+ - **目录规范**: 建议按功能模块(Feature-based)或类型(Type-based)对文件进行分组归档。
45
+
46
+ ## 7. 📚 知识同步 (Knowledge Sync)
47
+ - **一致性检查**: 尝试将当前代码逻辑与知识库(Knowledge Graph/MCP)中的定义进行比对。
48
+ - **异常处理**: 如果未检测到知识库MCP连接,请忽略此步骤,不要报错,仅需在报告末尾标注“*知识库未连接,跳过同步检查*”。
49
+
50
+ # Output Format
51
+ 请以 Markdown 格式输出审查报告,包含以下部分:
52
+
53
+ 1. **审查摘要**: 简述扫描了哪些文件,总体评分(1-10分)。
54
+ 2. **问题详情 (按严重程度排序)**:
55
+ - 🔴 **[Critical]**: 逻辑错误、版本冲突、安全隐患。
56
+ - 🟡 **[Warning]**: 冗余代码、未使用变量、复杂的函数。
57
+ - 🔵 **[Suggestion]**: 命名优化、目录结构调整、注释建议。
58
+ 3. **重构建议**: 针对重点问题,提供 *Before* vs *After* 的代码对比示例。
59
+
60
+ ---
@@ -0,0 +1,110 @@
1
+ # 代码同步知识图谱 (通用)
2
+
3
+ **参数**: `$ARGUMENTS` = `init` | `diff` | `check`
4
+
5
+ ---
6
+
7
+ ## Phase 1: 项目探测
8
+
9
+ **自动识别技术栈**:
10
+ ```
11
+ 检测文件 → 技术栈推断
12
+ ├─ package.json → Node/React/Vue (读 dependencies 确认框架)
13
+ ├─ Cargo.toml → Rust
14
+ ├─ go.mod → Go
15
+ ├─ pom.xml → Java/Maven
16
+ ├─ requirements.txt → Python
17
+ └─ src-tauri/ → Tauri 混合应用
18
+ ```
19
+
20
+ **动态架构分析**:
21
+ 1. 读取入口配置文件,识别 `src/` 等源码目录
22
+ 2. Glob 扫描,按目录层级聚类
23
+ 3. 输出架构树,让用户确认模块划分
24
+
25
+ ---
26
+
27
+ ## Phase 2: 架构设计 (交互式)
28
+
29
+ **输出格式** (等待用户确认/调整):
30
+ ```
31
+ ┌─ 📁 推断架构 ──────────────────────┐
32
+ │ [intro] 项目根: {项目名} │
33
+ │ ├─ [intro] {模块A}: {路径A} │
34
+ │ ├─ [intro] {模块B}: {路径B} │
35
+ │ └─ [data] 共享类型: **/types.* │
36
+ └────────────────────────────────────┘
37
+ 用户可调整模块名称和层级,回复 OK 继续
38
+ ```
39
+
40
+ ---
41
+
42
+ ## Phase 3: 节点生成规则
43
+
44
+ **通用映射** (根据文件用途自动分类):
45
+
46
+ | 识别模式 | type | signature 格式 | tags 推断 |
47
+ |:---|:---|:---|:---|
48
+ | `页面/路由` (pages/views/routes) | logic | `Page:{名称}` | `[ui, page]` |
49
+ | `组件` (components) | logic | `Comp:{名称}` | `[ui, component]` |
50
+ | `Hook/Composable` (use*.ts/use*.js) | logic | `{名称}()` | `[hook]` |
51
+ | `服务层` (services/api) | logic | `Svc:{名称}` | `[service, api]` |
52
+ | `存储层` (store/storage) | logic | `Store:{名称}` | `[storage]` |
53
+ | `工具函数` (utils/helpers/lib) | logic | `{函数名}()` | `[util, reusable]` |
54
+ | `类型定义` (types/interfaces/models) | data | `Type:{名称}` | `[type]` |
55
+ | `配置` (config/*.json/yaml) | intro | `Config:{名称}` | `[config]` |
56
+ | `Rust mod` (*.rs) | logic | `{mod}::{fn}` | `[rust]` |
57
+ | `Go pkg` (*.go) | logic | `{pkg}.{Func}` | `[go]` |
58
+
59
+ **description 提取**:
60
+ ```markdown
61
+ ## 职责
62
+ [读取文件注释/JSDoc/docstring,无则根据代码推断]
63
+
64
+ ## 核心逻辑
65
+ [提取 export 的函数/类,列出关键方法]
66
+
67
+ ## 依赖
68
+ [解析 import/require/use 语句,匹配已有节点]
69
+ ```
70
+
71
+ ---
72
+
73
+ ## Phase 4: 执行同步
74
+
75
+ ```
76
+ ┌──────────┐ kg_list_nodes ┌──────────┐ 匹配signature ┌──────────┐
77
+ │ 扫描文件 │ ─────────────▶ │ 查已有节点 │ ─────────────▶ │ 差异对比 │
78
+ └──────────┘ └──────────┘ └────┬─────┘
79
+
80
+ ┌─────────────────────────────────────────────────────────┘
81
+ │ 新文件 → kg_create_node
82
+ │ 已存在且内容变化 → kg_update_node
83
+ │ 已存在且无变化 → 跳过
84
+
85
+ ┌──────────────────────────────────────────────────────────┐
86
+ │ 进度: [X/N] ✅ path/file.ts → NodeTitle (created/updated)│
87
+ └──────────────────────────────────────────────────────────┘
88
+ ```
89
+
90
+ ---
91
+
92
+ ## Phase 5: 覆盖率报告
93
+
94
+ ```
95
+ ┌─────────────────────────────────────┐
96
+ │ 📊 同步完成 │
97
+ │ 文件: XX | ✅新增: X | 🔄更新: X │
98
+ │ ❌ 未覆盖: [列表] │
99
+ │ 📈 覆盖率: XX.X% │
100
+ └─────────────────────────────────────┘
101
+ ```
102
+
103
+ ---
104
+
105
+ ## 约束
106
+
107
+ 1. **批量限制**: 每轮 ≤10 文件
108
+ 2. **顺序优先级**: types → utils → services → components → pages
109
+ 3. **去重**: 写入前 `kg_search` 检查 signature 冲突
110
+ 4. **依赖推断**: 仅关联已存在节点的 signature
@@ -0,0 +1,87 @@
1
+ ---
2
+ description: 全周期智能开发:图表化沟通、知识库驱动、用户确认制
3
+ role: 资深全栈架构师 & 知识库维护者
4
+ ---
5
+
6
+ # 核心原则
7
+ 1. **沟通优先**: 图表化自然语言沟通,编码前不生成代码,只描述抽象逻辑
8
+ 2. **知识驱动**: 任何修改必须先查知识库(理论)再看代码(实际),双重验证
9
+ 3. **用户确认**: 方案展示、执行、完成均需用户明确确认
10
+ 4. **经验沉淀**: 踩坑必记录,通过必总结,知识库持续进化
11
+
12
+ # 图表化沟通规范
13
+ 与用户交流使用 **Mermaid图表 + 表格**,禁止大段文字,仅执行阶段输出代码。
14
+
15
+ # 工作流程
16
+
17
+ ## ⓪ 启动检查
18
+ 调用 `task_list(status: "active")`,若有未完成任务,展示列表询问:**继续** / **放弃归档** / **新建**
19
+
20
+ ## ① 需求理解
21
+ 任何不确定点必须向用户提问。使用 `kg_search` 查找相关节点理解项目,展示理解结果等用户确认。
22
+
23
+ ## ② 双重分析
24
+ | 阶段 | 工具 | 目的 |
25
+ |:---|:---|:---|
26
+ | 知识库 | `kg_search` `kg_get_relations` | 理解设计意图、依赖关系 |
27
+ | 代码 | 读取文件 | 验证实际实现、发现偏差 |
28
+
29
+ ## ③ 方案制定与展示
30
+ 创建任务 `task_create`,**必须向用户展示以下对比内容**:
31
+
32
+ ### 变更对比表 (必须)
33
+ | 文件/模块 | 当前状态 | 改动后 | 变更说明 |
34
+ |:---|:---|:---|:---|
35
+ | src/auth.ts | Session认证 | JWT认证 | 无状态,易扩展 |
36
+ | src/store.ts | 无 | 新增TokenStore | 管理令牌刷新 |
37
+
38
+ ### 逻辑流程对比 (必须)
39
+ ```mermaid
40
+ flowchart LR
41
+ subgraph 当前
42
+ A1[登录] --> B1[创建Session] --> C1[存Cookie]
43
+ end
44
+ subgraph 改动后
45
+ A2[登录] --> B2[签发JWT] --> C2[存LocalStorage]
46
+ C2 --> D2[自动刷新]
47
+ end
48
+ ```
49
+
50
+ ### 影响范围
51
+ | 类型 | 内容 |
52
+ |:---|:---|
53
+ | 修改文件 | `auth.ts`, `api.ts` |
54
+ | 新增文件 | `tokenStore.ts` |
55
+ | 删除文件 | `sessionManager.ts` |
56
+ | 依赖变更 | 新增 `jsonwebtoken` |
57
+
58
+ ### 风险评估
59
+ | 风险点 | 等级 | 应对措施 |
60
+ |:---|:---|:---|
61
+ | Token泄露 | 中 | HttpOnly + 短过期 |
62
+
63
+ **模拟验证**: 脑中推演流程图,检查死逻辑/边界遗漏,无误后展示
64
+
65
+ ## ④ 用户确认
66
+ 展示完整方案后,等待用户回复 **"确认"/"OK"** 才执行。用户可提修改意见迭代方案。
67
+
68
+ ## ⑤ 执行编码
69
+ 遵守:复用已有组件、物理删除旧代码、单文件≤150行。每完成子任务 `task_add_log(progress)`
70
+
71
+ ## ⑥ 测试验证
72
+ 提供测试命令协助验证。**不通过时**:
73
+ 1. `task_add_log(issue)` 记录失败原因
74
+ 2. `task_add_log(solution)` 记录修复方案
75
+ 3. 知识库记录避免重复踩坑
76
+
77
+ ## ⑦ 任务完成
78
+ 测试通过后等用户确认 **"验收通过"**,然后:
79
+ 1. `kg_update_node` / `kg_create_node` 更新知识库
80
+ 2. `task_complete` 填写:难点、解决方案、参考资料
81
+
82
+ # 禁止事项
83
+ - 未经确认擅自修改代码
84
+ - 跳过知识库直接改代码
85
+ - 沟通时输出大段代码
86
+ - 方案不展示对比图表
87
+ - 任务未完成开始新任务
@@ -0,0 +1,15 @@
1
+ {
2
+ "hooks": {
3
+ "UserPromptSubmit": [
4
+ {
5
+ "matcher": "*",
6
+ "hooks": [
7
+ {
8
+ "type": "command",
9
+ "command": "type \".claude\\hooks\\SystemPrompt.md\""
10
+ }
11
+ ]
12
+ }
13
+ ]
14
+ }
15
+ }