@ppdocs/mcp 3.2.35 → 3.2.36
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/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 +406 -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/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/cursorrules.md +63 -64
- 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/dist/tools/index.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* MCP 工具注册入口
|
|
3
|
-
*
|
|
3
|
+
* 12 个工具, 6 个子模块
|
|
4
4
|
*
|
|
5
5
|
* 🔗 初始化: kg_init (1个)
|
|
6
|
-
* 📊 导航: kg_status
|
|
7
|
-
* 📚 知识:
|
|
6
|
+
* 📊 导航: kg_status (1个)
|
|
7
|
+
* 📚 知识: kg_projects, kg_rules (2个)
|
|
8
8
|
* 📝 工作流: kg_task(任务记录), kg_files, kg_discuss(讨论区) (3个)
|
|
9
9
|
* 🔀 关系核心: kg_flowchart(逻辑流程图 — 关系型知识锚点) (1个)
|
|
10
10
|
* 🔬 代码分析: code_scan, code_smart_context, code_full_path (3个)
|
package/dist/tools/index.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* MCP 工具注册入口
|
|
3
|
-
*
|
|
3
|
+
* 12 个工具, 6 个子模块
|
|
4
4
|
*
|
|
5
5
|
* 🔗 初始化: kg_init (1个)
|
|
6
|
-
* 📊 导航: kg_status
|
|
7
|
-
* 📚 知识:
|
|
6
|
+
* 📊 导航: kg_status (1个)
|
|
7
|
+
* 📚 知识: kg_projects, kg_rules (2个)
|
|
8
8
|
* 📝 工作流: kg_task(任务记录), kg_files, kg_discuss(讨论区) (3个)
|
|
9
9
|
* 🔀 关系核心: kg_flowchart(逻辑流程图 — 关系型知识锚点) (1个)
|
|
10
10
|
* 🔬 代码分析: code_scan, code_smart_context, code_full_path (3个)
|
|
@@ -13,7 +13,6 @@
|
|
|
13
13
|
import { createContext } from './shared.js';
|
|
14
14
|
import { registerInitTool } from './init.js';
|
|
15
15
|
import { registerStatusTool } from './kg_status.js';
|
|
16
|
-
import { registerDocTools } from './docs.js';
|
|
17
16
|
import { registerProjectTools } from './projects.js';
|
|
18
17
|
import { registerRuleTools } from './rules.js';
|
|
19
18
|
import { registerTaskTools } from './tasks.js';
|
|
@@ -23,24 +22,22 @@ import { registerAnalyzerTools } from './analyzer.js';
|
|
|
23
22
|
import { registerMeetingTools } from './meeting.js';
|
|
24
23
|
import { registerFlowchartTools } from './flowchart.js';
|
|
25
24
|
export function registerTools(server, projectId, user, onProjectChange) {
|
|
26
|
-
// 创建共享可变上下文 — 所有工具捕获此对象引用
|
|
27
25
|
const ctx = createContext(projectId, user);
|
|
28
|
-
// 🔗 初始化
|
|
26
|
+
// 🔗 初始化
|
|
29
27
|
registerInitTool(server, ctx, onProjectChange || (() => { }));
|
|
30
|
-
// 📊 导航
|
|
28
|
+
// 📊 导航
|
|
31
29
|
registerStatusTool(server, ctx);
|
|
32
|
-
// 📚 知识
|
|
33
|
-
registerDocTools(server, ctx);
|
|
30
|
+
// 📚 知识
|
|
34
31
|
registerProjectTools(server, ctx);
|
|
35
32
|
registerRuleTools(server, ctx);
|
|
36
|
-
// 📝 工作流
|
|
33
|
+
// 📝 工作流
|
|
37
34
|
registerTaskTools(server, ctx);
|
|
38
35
|
registerFileTools(server);
|
|
39
36
|
registerDiscussionTools(server, ctx);
|
|
40
|
-
// 🔬 代码分析
|
|
37
|
+
// 🔬 代码分析
|
|
41
38
|
registerAnalyzerTools(server, ctx);
|
|
42
|
-
// 🏛️ 多AI协作
|
|
39
|
+
// 🏛️ 多AI协作
|
|
43
40
|
registerMeetingTools(server, ctx);
|
|
44
|
-
// 🔀 流程图
|
|
41
|
+
// 🔀 流程图
|
|
45
42
|
registerFlowchartTools(server, ctx);
|
|
46
43
|
}
|
package/dist/tools/kg_status.js
CHANGED
|
@@ -1,36 +1,22 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* 📊 kg_status — 项目速览仪表盘
|
|
2
|
+
* 📊 kg_status — 项目速览仪表盘
|
|
3
3
|
*/
|
|
4
4
|
import { getClient } from '../storage/httpClient.js';
|
|
5
5
|
import { wrap, safeTool } from './shared.js';
|
|
6
6
|
export function registerStatusTool(server, ctx) {
|
|
7
7
|
const client = () => getClient();
|
|
8
|
-
server.tool('kg_status', '📊 项目速览仪表盘 — 一键了解项目健康。返回:
|
|
9
|
-
const [
|
|
10
|
-
client().
|
|
8
|
+
server.tool('kg_status', '📊 项目速览仪表盘 — 一键了解项目健康。返回: 流程图节点数、活跃任务数、最近变更。每次对话开始建议首先调用', {}, async () => safeTool(async () => {
|
|
9
|
+
const [charts, activeTasks] = await Promise.all([
|
|
10
|
+
client().listFlowcharts(),
|
|
11
11
|
client().listTasks('active'),
|
|
12
12
|
]);
|
|
13
|
-
const
|
|
14
|
-
const docCount = docs.filter(d => !d.isDir).length;
|
|
15
|
-
const statusMap = new Map();
|
|
16
|
-
for (const d of docs) {
|
|
17
|
-
if (d.isDir)
|
|
18
|
-
continue;
|
|
19
|
-
const s = d.status || '已完成';
|
|
20
|
-
statusMap.set(s, (statusMap.get(s) || 0) + 1);
|
|
21
|
-
}
|
|
13
|
+
const nodeCount = charts.reduce((sum, c) => sum + (c.nodeCount || 0), 0);
|
|
22
14
|
const lines = [
|
|
23
15
|
`📊 项目速览 [${ctx.projectId}]`,
|
|
24
16
|
``,
|
|
25
|
-
|
|
17
|
+
`🔀 流程图: ${charts.length} 张 | 📦 节点: ${nodeCount} 个`,
|
|
26
18
|
`📝 活跃任务: ${activeTasks.length} 个`,
|
|
27
19
|
];
|
|
28
|
-
if (statusMap.size > 0) {
|
|
29
|
-
const statusLine = Array.from(statusMap.entries())
|
|
30
|
-
.map(([s, c]) => `${s}(${c})`)
|
|
31
|
-
.join(' | ');
|
|
32
|
-
lines.push(`📋 状态分布: ${statusLine}`);
|
|
33
|
-
}
|
|
34
20
|
if (activeTasks.length > 0) {
|
|
35
21
|
lines.push(``, `🔧 进行中的任务:`);
|
|
36
22
|
for (const t of activeTasks.slice(0, 5)) {
|
package/dist/tools/projects.d.ts
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* 📋 kg_projects
|
|
3
|
-
*
|
|
4
|
-
* 删除: kg_create_project (桌面端操作)
|
|
2
|
+
* 📋 kg_projects
|
|
3
|
+
* 列出所有可访问的项目(返回名称和ID)
|
|
5
4
|
*/
|
|
6
5
|
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
7
6
|
import { type McpContext } from './shared.js';
|
package/dist/tools/projects.js
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* 📋 kg_projects
|
|
3
|
-
*
|
|
4
|
-
* 删除: kg_create_project (桌面端操作)
|
|
2
|
+
* 📋 kg_projects
|
|
3
|
+
* 列出所有可访问的项目(返回名称和ID)
|
|
5
4
|
*/
|
|
6
5
|
import { getClient } from '../storage/httpClient.js';
|
|
7
6
|
import { wrap, safeTool } from './shared.js';
|
package/dist/tools/shared.d.ts
CHANGED
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
* MCP 工具共享模块
|
|
3
3
|
* 合并原 helpers.ts + 新增 safeTool / withCross 模式
|
|
4
4
|
*/
|
|
5
|
-
import type { DocData } from '../storage/types.js';
|
|
6
5
|
/** 运行时可变上下文 — 所有工具通过引用获取最新值 */
|
|
7
6
|
export interface McpContext {
|
|
8
7
|
projectId: string;
|
|
@@ -18,15 +17,4 @@ export declare function wrap(text: string): {
|
|
|
18
17
|
};
|
|
19
18
|
export declare function safeTool(fn: () => Promise<ReturnType<typeof wrap>>): Promise<ReturnType<typeof wrap>>;
|
|
20
19
|
export declare function crossPrefix(target: string): string;
|
|
21
|
-
export declare function formatDocMarkdown(doc: DocData, path: string): string[];
|
|
22
|
-
interface TreeNode {
|
|
23
|
-
path: string;
|
|
24
|
-
name: string;
|
|
25
|
-
summary?: string;
|
|
26
|
-
isDir: boolean;
|
|
27
|
-
children?: TreeNode[];
|
|
28
|
-
}
|
|
29
|
-
export declare function formatTreeText(tree: TreeNode[]): string;
|
|
30
|
-
export declare function countTreeDocs(tree: TreeNode[]): number;
|
|
31
20
|
export declare function formatFileSize(bytes: number): string;
|
|
32
|
-
export {};
|
package/dist/tools/shared.js
CHANGED
|
@@ -23,65 +23,6 @@ export async function safeTool(fn) {
|
|
|
23
23
|
export function crossPrefix(target) {
|
|
24
24
|
return `[跨项目: ${target}]\n\n`;
|
|
25
25
|
}
|
|
26
|
-
// ==================== 文档格式化 ====================
|
|
27
|
-
export function formatDocMarkdown(doc, path) {
|
|
28
|
-
const lines = [];
|
|
29
|
-
const name = path.split('/').pop() || path;
|
|
30
|
-
lines.push(`## ${name}\n`);
|
|
31
|
-
if (doc.summary)
|
|
32
|
-
lines.push(`> ${doc.summary}\n`);
|
|
33
|
-
if (doc.content) {
|
|
34
|
-
lines.push('**内容**');
|
|
35
|
-
lines.push(doc.content);
|
|
36
|
-
lines.push('');
|
|
37
|
-
}
|
|
38
|
-
if (doc.versions && doc.versions.length > 0) {
|
|
39
|
-
lines.push('**更新历史**');
|
|
40
|
-
lines.push('| 版本 | 日期 | 变更 |');
|
|
41
|
-
lines.push('|:---|:---|:---|');
|
|
42
|
-
doc.versions.forEach((v) => lines.push(`| ${v.version} | ${v.date} | ${v.changes} |`));
|
|
43
|
-
lines.push('');
|
|
44
|
-
}
|
|
45
|
-
if (doc.bugfixes && doc.bugfixes.length > 0) {
|
|
46
|
-
lines.push('**修复历史**');
|
|
47
|
-
lines.push('| 日期 | 问题 | 方案 |');
|
|
48
|
-
lines.push('|:---|:---|:---|');
|
|
49
|
-
doc.bugfixes.forEach((b) => lines.push(`| ${b.date} | ${b.issue} | ${b.solution} |`));
|
|
50
|
-
lines.push('');
|
|
51
|
-
}
|
|
52
|
-
return lines;
|
|
53
|
-
}
|
|
54
|
-
export function formatTreeText(tree) {
|
|
55
|
-
function format(nodes, prefix = '') {
|
|
56
|
-
const lines = [];
|
|
57
|
-
nodes.forEach((node, index) => {
|
|
58
|
-
const isLast = index === nodes.length - 1;
|
|
59
|
-
const connector = isLast ? '└── ' : '├── ';
|
|
60
|
-
const childPrefix = isLast ? ' ' : '│ ';
|
|
61
|
-
const icon = node.isDir ? '📁' : '📄';
|
|
62
|
-
const summary = node.summary ? ` # ${node.summary}` : '';
|
|
63
|
-
lines.push(`${prefix}${connector}${icon} ${node.name}${summary}`);
|
|
64
|
-
if (node.children && node.children.length > 0) {
|
|
65
|
-
lines.push(...format(node.children, prefix + childPrefix));
|
|
66
|
-
}
|
|
67
|
-
});
|
|
68
|
-
return lines;
|
|
69
|
-
}
|
|
70
|
-
return format(tree).join('\n');
|
|
71
|
-
}
|
|
72
|
-
export function countTreeDocs(tree) {
|
|
73
|
-
let count = 0;
|
|
74
|
-
function traverse(nodes) {
|
|
75
|
-
for (const node of nodes) {
|
|
76
|
-
if (!node.isDir)
|
|
77
|
-
count++;
|
|
78
|
-
if (node.children)
|
|
79
|
-
traverse(node.children);
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
traverse(tree);
|
|
83
|
-
return count;
|
|
84
|
-
}
|
|
85
26
|
// ==================== 文件大小格式化 ====================
|
|
86
27
|
export function formatFileSize(bytes) {
|
|
87
28
|
if (bytes < 1024)
|
package/package.json
CHANGED
package/templates/AGENT.md
CHANGED
|
@@ -1,38 +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
|
-
|
|
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/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
|
+
- ?????? / ????????????
|