@ppdocs/mcp 3.2.35 → 3.2.37
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 +53 -27
- package/dist/cli.js +4 -48
- package/dist/storage/httpClient.d.ts +2 -27
- package/dist/storage/httpClient.js +3 -132
- package/dist/storage/types.d.ts +0 -28
- package/dist/storage/types.js +1 -1
- package/dist/tools/flowchart.d.ts +1 -5
- package/dist/tools/flowchart.js +647 -454
- package/dist/tools/index.d.ts +3 -3
- package/dist/tools/index.js +10 -13
- package/dist/tools/kg_status.d.ts +1 -1
- package/dist/tools/kg_status.js +6 -20
- package/dist/tools/projects.d.ts +2 -3
- package/dist/tools/projects.js +2 -3
- package/dist/tools/rules.d.ts +2 -3
- package/dist/tools/rules.js +2 -3
- package/dist/tools/shared.d.ts +0 -12
- package/dist/tools/shared.js +0 -59
- package/package.json +1 -1
- package/templates/AGENT.md +63 -38
- package/templates/commands/init.md +3 -3
- package/templates/commands/pp/diagnose.md +3 -3
- package/templates/commands/pp/init.md +9 -18
- package/templates/commands/pp/sync.md +10 -12
- package/templates/cursorrules.md +63 -64
- package/templates/hooks/SystemPrompt.md +14 -14
- package/templates/kiro-rules/ppdocs.md +63 -142
- package/dist/agent.d.ts +0 -6
- package/dist/agent.js +0 -130
- package/dist/tools/docs.d.ts +0 -8
- package/dist/tools/docs.js +0 -285
- package/dist/tools/helpers.d.ts +0 -37
- package/dist/tools/helpers.js +0 -94
- package/dist/vector/index.d.ts +0 -56
- package/dist/vector/index.js +0 -228
- package/dist/vector/manager.d.ts +0 -48
- package/dist/vector/manager.js +0 -250
- package/dist/web/server.d.ts +0 -43
- package/dist/web/server.js +0 -808
- package/dist/web/ui.d.ts +0 -5
- package/dist/web/ui.js +0 -642
package/templates/cursorrules.md
CHANGED
|
@@ -1,64 +1,63 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
## 0.
|
|
4
|
-
|
|
5
|
-
```
|
|
6
|
-
kg_init()
|
|
7
|
-
kg_status()
|
|
8
|
-
kg_task(action:"get")
|
|
9
|
-
kg_discuss(action:"list")
|
|
10
|
-
```
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
1.
|
|
26
|
-
2.
|
|
27
|
-
3.
|
|
28
|
-
4.
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
### Step
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
|
47
|
-
|
|
48
|
-
|
|
|
49
|
-
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
-
|
|
63
|
-
-
|
|
64
|
-
- **代码输出**:极简、模块化,只输出变更部分或高度相关的上下文,清理所有残留测试代码。
|
|
1
|
+
????????????**????**????????**????**????????????????????????
|
|
2
|
+
|
|
3
|
+
## 0. ????
|
|
4
|
+
|
|
5
|
+
```text
|
|
6
|
+
kg_init() -> ????
|
|
7
|
+
kg_status() -> ???????
|
|
8
|
+
kg_task(action:"get") -> ?? active ??
|
|
9
|
+
kg_discuss(action:"list") -> ???????
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
## 1. ????????
|
|
13
|
+
|
|
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")`
|
|
16
|
+
- ??: `kg_task(action:"create|get|update|archive|delete")`
|
|
17
|
+
- ??: `kg_files(action:"list|read|upload|download|public_*")`
|
|
18
|
+
- ??/??: `kg_discuss(...)`, `kg_meeting(...)`
|
|
19
|
+
- ????: `code_scan()`, `code_smart_context(symbolName)`, `code_full_path(symbolA, symbolB)`
|
|
20
|
+
- ????: ?????????????????????????????? fallback????????????
|
|
21
|
+
|
|
22
|
+
## 2. ?????
|
|
23
|
+
|
|
24
|
+
### Step 1: ????
|
|
25
|
+
1. ?? `kg_flowchart(get)` ????????? `kg_rules(get)` ?????
|
|
26
|
+
2. ???????? `kg_flowchart(get_node, expand:2, includeDoc:true, includeFiles:true)`?
|
|
27
|
+
3. ????? `subFlowchart`???????????????
|
|
28
|
+
4. ??????????? `code_scan()`??? `code_smart_context` / `code_full_path`?
|
|
29
|
+
5. ??????????????????????????
|
|
30
|
+
|
|
31
|
+
### Step 2: ????
|
|
32
|
+
1. ?????: `kg_task(create, title, goals, bindTo)`?
|
|
33
|
+
2. ??? ASCII ????????????????
|
|
34
|
+
3. ?????????????
|
|
35
|
+
|
|
36
|
+
### Step 3: ????
|
|
37
|
+
1. ????????????????
|
|
38
|
+
2. ?????????????? `kg_task(update, log_type:"progress")` ???????
|
|
39
|
+
3. ?????? `issue`??????? `solution`????????
|
|
40
|
+
|
|
41
|
+
### Step 4: ????
|
|
42
|
+
| ?? | ???? |
|
|
43
|
+
|:---|:---|
|
|
44
|
+
| ?????? | `kg_flowchart(bind, nodeId, files:[...])` |
|
|
45
|
+
| ???? | `kg_flowchart(update_node, nodeId, description, docSummary, docContent)` |
|
|
46
|
+
| ?????? | `kg_flowchart(batch_add)` + `bind` + `update_node(docSummary, docContent)` |
|
|
47
|
+
| ?????? | `kg_flowchart(create_chart)`???????????? |
|
|
48
|
+
| ??/???? | ?? `kg_files(upload/read/list/download)` ??????? `kg_flowchart(bind, files:[...])` |
|
|
49
|
+
| ???? | ?? `kg_flowchart(update_node, docSummary, docContent)` ??? `docEntries` |
|
|
50
|
+
|
|
51
|
+
## 3. ????
|
|
52
|
+
|
|
53
|
+
- ?????????? -> ??????????
|
|
54
|
+
- ???????/???? -> ??????????????????
|
|
55
|
+
- ??????????????????JSON?????? fallback ???
|
|
56
|
+
- ???? -> ??????????
|
|
57
|
+
|
|
58
|
+
## 4. ????
|
|
59
|
+
|
|
60
|
+
- ??????? ASCII ????
|
|
61
|
+
- ???????? Markdown ???
|
|
62
|
+
- ?????????????????????
|
|
63
|
+
- ?????? / ????????????
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
| 原则 | 要求 |
|
|
8
8
|
|:---|:---|
|
|
9
9
|
| **知识图谱中心** | 方案制定前检索图谱+代码双重验证;任务结束提示沉淀至图谱 |
|
|
10
|
-
| **任务驱动开发** | 复杂任务必须 `
|
|
10
|
+
| **任务驱动开发** | 复杂任务必须 `kg_task(action:"create")`;过程记录 `kg_task(action:"update")`;完成 `kg_task(action:"archive")` |
|
|
11
11
|
| **规则引用** | 编码前读 `codeStyle`;测试前读 `testRules`;审查前读 `reviewRules` |
|
|
12
12
|
| **绝对真实性** | 禁用 faker/模拟数据,必须真实环境验证 |
|
|
13
13
|
| **沟通可视化** | 禁纯文字/Mermaid代码;强制 ASCII流程图 + Markdown表格 |
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
|
|
18
18
|
## 任务生命周期
|
|
19
19
|
```
|
|
20
|
-
|
|
20
|
+
kg_task(action:"create") → kg_task(action:"update", log_type:"progress|issue|solution|reference") → kg_task(action:"archive")
|
|
21
21
|
```
|
|
22
22
|
| 日志类型 | 用途 | 示例 |
|
|
23
23
|
|:---|:---|:---|
|
|
@@ -32,24 +32,24 @@ task_create → task_add_log(progress/issue/solution/reference) → task_complet
|
|
|
32
32
|
|
|
33
33
|
### Step 1: 分析与澄清
|
|
34
34
|
1. 接收需求,识别意图
|
|
35
|
-
2. `
|
|
36
|
-
3. `
|
|
35
|
+
2. `kg_flowchart(action:"search", query:"关键词")` 检索现有节点/历史坑点
|
|
36
|
+
3. `kg_rules(action:"get")` 获取项目规则
|
|
37
37
|
4. 有歧义则列选项供用户选择
|
|
38
38
|
|
|
39
39
|
**输出**: 需求确认清单 (表格)
|
|
40
40
|
|
|
41
41
|
### Step 2: 逻辑设计
|
|
42
42
|
1. 结合图谱+代码设计方案
|
|
43
|
-
2. `
|
|
43
|
+
2. `kg_rules(action:"get", ruleType:"codeStyle")` 确认编码规范
|
|
44
44
|
3. 检查现有复用函数,拒绝重复建设
|
|
45
|
-
4. 大型任务: `
|
|
45
|
+
4. 大型任务: `kg_task(action:"create")`
|
|
46
46
|
|
|
47
47
|
**输出**: ASCII流程图 + 对比表 + 子任务列表
|
|
48
48
|
**里程碑**: 等待用户确认 (不写代码)
|
|
49
49
|
|
|
50
50
|
### Step 3: 模块化编码
|
|
51
51
|
**前置**: 用户确认方案
|
|
52
|
-
1. `
|
|
52
|
+
1. `kg_task(action:"update", log_type:"progress", content:"开始编码")`
|
|
53
53
|
2. 优先编写/更新工具函数,再业务组装
|
|
54
54
|
3. 遵循 codeStyle 规则
|
|
55
55
|
4. 清理现场,无残留代码
|
|
@@ -57,19 +57,19 @@ task_create → task_add_log(progress/issue/solution/reference) → task_complet
|
|
|
57
57
|
**输出**: 结构清晰的代码
|
|
58
58
|
|
|
59
59
|
### Step 4: 真实验证
|
|
60
|
-
1. `
|
|
60
|
+
1. `kg_rules(action:"get", ruleType:"testRules")` 获取测试规则
|
|
61
61
|
2. 在 `tests/` 对应目录创建测试
|
|
62
62
|
3. 真实环境运行,验证输出
|
|
63
|
-
4. 失败时: `
|
|
63
|
+
4. 失败时: `kg_task(action:"update", log_type:"issue", content:"xxx失败")` → 回溯Step2
|
|
64
64
|
|
|
65
65
|
**严禁**: "测试环境所以失败"借口
|
|
66
66
|
|
|
67
67
|
### Step 5: 审查与沉淀
|
|
68
|
-
1. `
|
|
68
|
+
1. `kg_rules(action:"get", ruleType:"reviewRules")` 获取审查规则
|
|
69
69
|
2. 审查目录结构/代码简洁度
|
|
70
|
-
3. 发现BUG → `
|
|
71
|
-
4. 新逻辑 → `
|
|
72
|
-
5. `
|
|
70
|
+
3. 发现BUG → `kg_flowchart(action:"update_node")` 回写节点说明与文档
|
|
71
|
+
4. 新逻辑 → `kg_flowchart(action:"batch_add")` 新增节点,或 `kg_flowchart(action:"update_node")` 追加文档/版本
|
|
72
|
+
5. `kg_task(action:"archive", summary, difficulties, solutions)`
|
|
73
73
|
|
|
74
74
|
**输出**: 交付确认 + 图谱更新清单
|
|
75
75
|
|
|
@@ -78,7 +78,7 @@ task_create → task_add_log(progress/issue/solution/reference) → task_complet
|
|
|
78
78
|
## 异常处理
|
|
79
79
|
| 场景 | 反应 |
|
|
80
80
|
|:---|:---|
|
|
81
|
-
| Step4 测试失败 | 停止 → 分析日志 →
|
|
81
|
+
| Step4 测试失败 | 停止 → 分析日志 → `kg_task(action:"update", log_type:"issue")` → 回溯Step2 → 修正 → 重测 |
|
|
82
82
|
| 发现历史BUG | 读取节点 bugfixes 参考历史方案 |
|
|
83
83
|
| 重复造轮子 | 终止 → 指出现有实现 → 要求复用 |
|
|
84
84
|
|
|
@@ -1,142 +1,63 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
##
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
###
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
### Phase D: 按流程执行 + 审查
|
|
66
|
-
```
|
|
67
|
-
按 Phase B 确认的逻辑流程,逐节点实现:
|
|
68
|
-
使用 Step 3 的逐步执行循环 (执行→验证→记录→回写)
|
|
69
|
-
|
|
70
|
-
全部完成后:
|
|
71
|
-
对照逻辑流程图进行审查,确保实现与设计一致
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
---
|
|
75
|
-
|
|
76
|
-
## 标准执行流程
|
|
77
|
-
|
|
78
|
-
### Step 1: 知识锚定 (理解需求时)
|
|
79
|
-
```
|
|
80
|
-
kg_flowchart(action:"get") → 主图全貌
|
|
81
|
-
kg_flowchart(action:"get_node", nodeId:目标, expand:2,
|
|
82
|
-
includeDoc:true, includeFiles:true) → 节点详情+上下游
|
|
83
|
-
kg_tree() → 文档全景
|
|
84
|
-
kg_rules(action:"get") → 编码/审查规则
|
|
85
|
-
```
|
|
86
|
-
输出: 涉及模块 + 关键文档 + 现有逻辑 + 待确认点
|
|
87
|
-
|
|
88
|
-
### Step 2: 创建任务 (开工前)
|
|
89
|
-
```
|
|
90
|
-
kg_task(action:"create", title:"...", goals:[...], bindTo:节点ID)
|
|
91
|
-
```
|
|
92
|
-
|
|
93
|
-
### Step 3: 逐步执行 (核心循环)
|
|
94
|
-
```
|
|
95
|
-
每个步骤严格执行:
|
|
96
|
-
3.1 执行 → 编码/修改
|
|
97
|
-
3.2 验证 → 编译/推演/测试
|
|
98
|
-
3.3 记录 → kg_task(action:"update", taskId, content:"做了什么+验证结果")
|
|
99
|
-
3.4 回写 → kg_flowchart(bind/update_node) + kg_doc(update)
|
|
100
|
-
```
|
|
101
|
-
|
|
102
|
-
### Step 4: 归档
|
|
103
|
-
```
|
|
104
|
-
kg_task(action:"archive", summary, difficulties, solutions)
|
|
105
|
-
```
|
|
106
|
-
|
|
107
|
-
---
|
|
108
|
-
|
|
109
|
-
## 任务日志类型
|
|
110
|
-
|
|
111
|
-
| 类型 | 用途 | 何时记录 |
|
|
112
|
-
|:---|:---|:---|
|
|
113
|
-
| `progress` | 阶段进度 | 每完成一个步骤 |
|
|
114
|
-
| `issue` | 遇到问题 | 发现问题时**立即** |
|
|
115
|
-
| `solution` | 解决方案 | 找到方案时**立即** |
|
|
116
|
-
| `reference` | 参考资料 | 发现有用资料时 |
|
|
117
|
-
|
|
118
|
-
---
|
|
119
|
-
|
|
120
|
-
## 流程图回写规则
|
|
121
|
-
|
|
122
|
-
| 场景 | 操作 |
|
|
123
|
-
|:---|:---|
|
|
124
|
-
| 修改已有文件 | `kg_flowchart(action:"bind", nodeId, files:[...])` |
|
|
125
|
-
| 功能逻辑变更 | `kg_flowchart(action:"update_node", nodeId, description, docContent)` |
|
|
126
|
-
| 创建新文件/模块 | `kg_flowchart(action:"batch_add")` + `bind` + `kg_doc(create)` |
|
|
127
|
-
| 删除文件 | `kg_flowchart(action:"unbind")` + 标记废弃 |
|
|
128
|
-
|
|
129
|
-
---
|
|
130
|
-
|
|
131
|
-
## 异常处理
|
|
132
|
-
|
|
133
|
-
| 场景 | 处理 |
|
|
134
|
-
|:---|:---|
|
|
135
|
-
| 图谱找不到节点 | 询问用户,不猜测 |
|
|
136
|
-
| 测试失败 | `kg_task(update, log_type:"issue")` → 分析 → 修复 |
|
|
137
|
-
| 重复造轮子 | 终止 → 指出现有实现 → 复用 |
|
|
138
|
-
|
|
139
|
-
## 沟通规范
|
|
140
|
-
- 逻辑流程: ASCII 流程图
|
|
141
|
-
- 对比分析: Markdown 表格
|
|
142
|
-
- 代码: 极简模块化,清理残留
|
|
1
|
+
????????????**????**????????**????**????????????????????????
|
|
2
|
+
|
|
3
|
+
## 0. ????
|
|
4
|
+
|
|
5
|
+
```text
|
|
6
|
+
kg_init() -> ????
|
|
7
|
+
kg_status() -> ???????
|
|
8
|
+
kg_task(action:"get") -> ?? active ??
|
|
9
|
+
kg_discuss(action:"list") -> ???????
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
## 1. ????????
|
|
13
|
+
|
|
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")`
|
|
16
|
+
- ??: `kg_task(action:"create|get|update|archive|delete")`
|
|
17
|
+
- ??: `kg_files(action:"list|read|upload|download|public_*")`
|
|
18
|
+
- ??/??: `kg_discuss(...)`, `kg_meeting(...)`
|
|
19
|
+
- ????: `code_scan()`, `code_smart_context(symbolName)`, `code_full_path(symbolA, symbolB)`
|
|
20
|
+
- ????: ?????????????????????????????? fallback????????????
|
|
21
|
+
|
|
22
|
+
## 2. ?????
|
|
23
|
+
|
|
24
|
+
### Step 1: ????
|
|
25
|
+
1. ?? `kg_flowchart(get)` ????????? `kg_rules(get)` ?????
|
|
26
|
+
2. ???????? `kg_flowchart(get_node, expand:2, includeDoc:true, includeFiles:true)`?
|
|
27
|
+
3. ????? `subFlowchart`???????????????
|
|
28
|
+
4. ??????????? `code_scan()`??? `code_smart_context` / `code_full_path`?
|
|
29
|
+
5. ??????????????????????????
|
|
30
|
+
|
|
31
|
+
### Step 2: ????
|
|
32
|
+
1. ?????: `kg_task(create, title, goals, bindTo)`?
|
|
33
|
+
2. ??? ASCII ????????????????
|
|
34
|
+
3. ?????????????
|
|
35
|
+
|
|
36
|
+
### Step 3: ????
|
|
37
|
+
1. ????????????????
|
|
38
|
+
2. ?????????????? `kg_task(update, log_type:"progress")` ???????
|
|
39
|
+
3. ?????? `issue`??????? `solution`????????
|
|
40
|
+
|
|
41
|
+
### Step 4: ????
|
|
42
|
+
| ?? | ???? |
|
|
43
|
+
|:---|:---|
|
|
44
|
+
| ?????? | `kg_flowchart(bind, nodeId, files:[...])` |
|
|
45
|
+
| ???? | `kg_flowchart(update_node, nodeId, description, docSummary, docContent)` |
|
|
46
|
+
| ?????? | `kg_flowchart(batch_add)` + `bind` + `update_node(docSummary, docContent)` |
|
|
47
|
+
| ?????? | `kg_flowchart(create_chart)`???????????? |
|
|
48
|
+
| ??/???? | ?? `kg_files(upload/read/list/download)` ??????? `kg_flowchart(bind, files:[...])` |
|
|
49
|
+
| ???? | ?? `kg_flowchart(update_node, docSummary, docContent)` ??? `docEntries` |
|
|
50
|
+
|
|
51
|
+
## 3. ????
|
|
52
|
+
|
|
53
|
+
- ?????????? -> ??????????
|
|
54
|
+
- ???????/???? -> ??????????????????
|
|
55
|
+
- ??????????????????JSON?????? fallback ???
|
|
56
|
+
- ???? -> ??????????
|
|
57
|
+
|
|
58
|
+
## 4. ????
|
|
59
|
+
|
|
60
|
+
- ??????? ASCII ????
|
|
61
|
+
- ???????? Markdown ???
|
|
62
|
+
- ?????????????????????
|
|
63
|
+
- ?????? / ????????????
|
package/dist/agent.d.ts
DELETED
package/dist/agent.js
DELETED
|
@@ -1,130 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/**
|
|
3
|
-
* PPDocs Agent V2 — 多项目管理入口
|
|
4
|
-
* 功能: Web Config UI + 多 SyncBeacon + 持久后台运行
|
|
5
|
-
*/
|
|
6
|
-
import { startWebServer, loadAgentConfig, setAgentState, setProjectStatus } from './web/server.js';
|
|
7
|
-
import { initClient } from './storage/httpClient.js';
|
|
8
|
-
import { SyncBeacon } from './sync/beacon.js';
|
|
9
|
-
const DEFAULT_WEB_PORT = 20010;
|
|
10
|
-
// 多项目 SyncBeacon 管理
|
|
11
|
-
const beacons = new Map();
|
|
12
|
-
async function main() {
|
|
13
|
-
console.log('📡 PPDocs Agent V2 starting...\n');
|
|
14
|
-
// 解析端口参数
|
|
15
|
-
let webPort = DEFAULT_WEB_PORT;
|
|
16
|
-
const args = process.argv.slice(2);
|
|
17
|
-
for (let i = 0; i < args.length; i++) {
|
|
18
|
-
if (args[i] === '--port' && args[i + 1]) {
|
|
19
|
-
webPort = parseInt(args[i + 1], 10) || DEFAULT_WEB_PORT;
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
// 加载配置
|
|
23
|
-
const config = loadAgentConfig();
|
|
24
|
-
if (config) {
|
|
25
|
-
webPort = config.webPort || webPort;
|
|
26
|
-
console.log(`📋 主机: ${config.host}:${config.port}`);
|
|
27
|
-
console.log(`📂 已绑定 ${config.projects.length} 个项目`);
|
|
28
|
-
// 测试主机连接
|
|
29
|
-
try {
|
|
30
|
-
const resp = await fetch(`http://${config.host}:${config.port}/health`);
|
|
31
|
-
setAgentState({ hostConnected: resp.ok });
|
|
32
|
-
if (resp.ok)
|
|
33
|
-
console.log('✅ 主机连接正常');
|
|
34
|
-
}
|
|
35
|
-
catch {
|
|
36
|
-
setAgentState({ hostConnected: false });
|
|
37
|
-
console.log('⚠️ 主机不可达,将在后台重试');
|
|
38
|
-
}
|
|
39
|
-
// 为每个项目启动同步
|
|
40
|
-
for (const proj of config.projects) {
|
|
41
|
-
await startProjectSync(config, proj);
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
else {
|
|
45
|
-
console.log('⚙️ 首次运行,请在浏览器中完成配置');
|
|
46
|
-
}
|
|
47
|
-
// 注册回调
|
|
48
|
-
setAgentState({
|
|
49
|
-
onBind: async (project) => {
|
|
50
|
-
const cfg = loadAgentConfig();
|
|
51
|
-
if (cfg)
|
|
52
|
-
await startProjectSync(cfg, project);
|
|
53
|
-
},
|
|
54
|
-
onUnbind: (remoteId) => {
|
|
55
|
-
stopProjectSync(remoteId);
|
|
56
|
-
},
|
|
57
|
-
});
|
|
58
|
-
// 启动 Web Server
|
|
59
|
-
startWebServer(webPort);
|
|
60
|
-
// 首次运行自动打开浏览器
|
|
61
|
-
if (!config) {
|
|
62
|
-
const url = `http://localhost:${webPort}`;
|
|
63
|
-
try {
|
|
64
|
-
const { exec } = await import('child_process');
|
|
65
|
-
const cmd = process.platform === 'win32' ? `start ${url}`
|
|
66
|
-
: process.platform === 'darwin' ? `open ${url}` : `xdg-open ${url}`;
|
|
67
|
-
exec(cmd);
|
|
68
|
-
}
|
|
69
|
-
catch { /* ignore */ }
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
async function startProjectSync(config, proj) {
|
|
73
|
-
const { host, port } = config;
|
|
74
|
-
const { remote, localDir, sync } = proj;
|
|
75
|
-
// 初始化该项目的 HTTP 连接 (验证)
|
|
76
|
-
const apiUrl = `http://${host}:${port}/api/${remote.id}/${remote.password}`;
|
|
77
|
-
try {
|
|
78
|
-
const resp = await fetch(`${apiUrl}/docs`);
|
|
79
|
-
if (resp.ok) {
|
|
80
|
-
const data = await resp.json();
|
|
81
|
-
const docCount = data.data?.length || 0;
|
|
82
|
-
setProjectStatus(remote.id, { connected: true, syncStatus: '已连接', docCount });
|
|
83
|
-
console.log(` ✅ ${remote.name}: 已连接 (${docCount} 文档)`);
|
|
84
|
-
}
|
|
85
|
-
else {
|
|
86
|
-
setProjectStatus(remote.id, { connected: false, syncStatus: '连接失败' });
|
|
87
|
-
console.log(` ❌ ${remote.name}: 连接失败`);
|
|
88
|
-
return;
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
catch (e) {
|
|
92
|
-
setProjectStatus(remote.id, { connected: false, syncStatus: `错误: ${e}` });
|
|
93
|
-
return;
|
|
94
|
-
}
|
|
95
|
-
// 启动 SyncBeacon
|
|
96
|
-
if (localDir && sync?.enabled) {
|
|
97
|
-
stopProjectSync(remote.id); // 先停旧的
|
|
98
|
-
// 需要临时给 httpClient 设置对应项目的 API URL
|
|
99
|
-
initClient(apiUrl);
|
|
100
|
-
const beacon = new SyncBeacon(localDir, remote.id, (sync.intervalSec || 15) * 1000);
|
|
101
|
-
beacon.start();
|
|
102
|
-
beacons.set(remote.id, beacon);
|
|
103
|
-
setProjectStatus(remote.id, { syncStatus: '同步中', lastSync: new Date() });
|
|
104
|
-
console.log(` 📂 ${remote.name}: 文件同步已启动`);
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
function stopProjectSync(remoteId) {
|
|
108
|
-
const beacon = beacons.get(remoteId);
|
|
109
|
-
if (beacon) {
|
|
110
|
-
beacon.stop();
|
|
111
|
-
beacons.delete(remoteId);
|
|
112
|
-
console.log(` 🛑 停止同步: ${remoteId}`);
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
// 优雅退出
|
|
116
|
-
process.on('SIGINT', () => {
|
|
117
|
-
console.log('\n🛑 Agent 正在关闭...');
|
|
118
|
-
for (const [, beacon] of beacons)
|
|
119
|
-
beacon.stop();
|
|
120
|
-
process.exit(0);
|
|
121
|
-
});
|
|
122
|
-
process.on('SIGTERM', () => {
|
|
123
|
-
for (const [, beacon] of beacons)
|
|
124
|
-
beacon.stop();
|
|
125
|
-
process.exit(0);
|
|
126
|
-
});
|
|
127
|
-
main().catch(e => {
|
|
128
|
-
console.error('❌ Agent 启动失败:', e);
|
|
129
|
-
process.exit(1);
|
|
130
|
-
});
|
package/dist/tools/docs.d.ts
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 📄 kg_doc (5合1) + 🏗️ kg_tree (2合1)
|
|
3
|
-
* 合并: kg_create_node, kg_delete_node, kg_update_node, kg_read_node, kg_copy_node
|
|
4
|
-
* kg_get_tree, kg_get_docs_by_status
|
|
5
|
-
*/
|
|
6
|
-
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
7
|
-
import { type McpContext } from './shared.js';
|
|
8
|
-
export declare function registerDocTools(server: McpServer, ctx: McpContext): void;
|