draftgo-cli 3.0.1 → 3.0.33
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/LICENSE +21 -0
- package/README.md +73 -124
- package/package.json +21 -8
- package/resources/skill/SKILL.md +62 -89
- package/resources/skill/init/SKILL.md +18 -67
- package/resources/skill/manifest.json +27 -0
- package/resources/skill/pull/SKILL.md +18 -44
- package/resources/skill/push/SKILL.md +30 -247
- package/resources/skill/references/aihub.md +86 -0
- package/resources/skill/references/api-endpoints.md +178 -0
- package/resources/skill/references/api.json +20248 -0
- package/resources/skill/{quickref → references}/app-api.md +44 -14
- package/resources/skill/{core → references}/architecture.md +6 -26
- package/resources/skill/references/chat-sdk.md +201 -0
- package/resources/skill/references/custom-services.md +308 -0
- package/resources/skill/references/data.md +298 -0
- package/resources/skill/references/db-relations.md +227 -0
- package/resources/skill/references/frontend.md +788 -0
- package/resources/skill/references/modules.md +66 -0
- package/resources/skill/references/parallel.md +48 -0
- package/resources/skill/{specs → references}/runtime.md +31 -1
- package/resources/skill/{specs → references}/security.md +3 -3
- package/resources/skill/references/ui-protocol.md +99 -0
- package/resources/skill/scripts/draftgo_delete.py +0 -2
- package/resources/skill/scripts/draftgo_init.py +15 -3
- package/resources/skill/scripts/draftgo_pull.py +154 -87
- package/resources/skill/scripts/draftgo_push.py +440 -183
- package/resources/skill/story/SKILL.md +13 -23
- package/src/cli.js +22 -7
- package/src/commandRegistry.js +34 -0
- package/src/commands/api.js +204 -0
- package/src/commands/autoPush.js +41 -0
- package/src/commands/check.js +27 -17
- package/src/commands/delete.js +6 -4
- package/src/commands/deploy.js +31 -0
- package/src/commands/help.js +41 -28
- package/src/commands/init.js +34 -20
- package/src/commands/local.js +9 -3
- package/src/commands/map.js +18 -7
- package/src/commands/sync.js +11 -4
- package/src/commands/update.js +39 -52
- package/src/commands/verifyUi.js +199 -0
- package/src/index.js +13 -46
- package/src/localdev/compose.js +48 -197
- package/src/localdev/index.js +116 -216
- package/src/localdev/mysqlClient.js +12 -9
- package/src/localdev/services.js +163 -0
- package/src/platforms.js +3 -3
- package/src/projectConfig.js +12 -2
- package/src/projectMap.js +240 -68
- package/src/skill.js +113 -29
- package/src/updateCheck.js +37 -15
- package/resources/skill/core/modules.md +0 -54
- package/resources/skill/practices/anti-patterns.md +0 -70
- package/resources/skill/practices/best-practices.md +0 -41
- package/resources/skill/practices/dev-declaration.md +0 -94
- package/resources/skill/quickref/api-endpoints.md +0 -130
- package/resources/skill/quickref/api.json +0 -17675
- package/resources/skill/quickref/dg-components.md +0 -198
- package/resources/skill/rules/dev-workflow.md +0 -652
- package/resources/skill/rules/frontend.md +0 -210
- package/resources/skill/rules/parallel.md +0 -263
- package/resources/skill/specs/data.md +0 -108
- package/resources/skill/specs/ui-protocol.md +0 -68
- package/src/commands/doctor.js +0 -54
- package/src/commands/new.js +0 -183
- package/src/commands/projectScript.js +0 -37
- /package/resources/skill/{rules → references}/debugging-syntax.md +0 -0
|
@@ -1,77 +1,28 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: draftgo-init
|
|
3
|
-
description:
|
|
4
|
-
version: 1.0.0
|
|
5
|
-
allowed-tools: Bash(python:*), Bash(find:*), Read
|
|
3
|
+
description: Install or refresh the DraftGo skill in a project, inspect supported AI-tool targets, and bind the project to an existing or local DraftGo base.
|
|
6
4
|
---
|
|
7
5
|
|
|
8
|
-
# DraftGo
|
|
6
|
+
# DraftGo 初始化
|
|
9
7
|
|
|
10
|
-
|
|
8
|
+
使用公开 CLI 完成安装和连接,不直接调用 `scripts/` 下的内部脚本。
|
|
11
9
|
|
|
12
|
-
|
|
10
|
+
## 执行
|
|
13
11
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
12
|
+
1. 运行 `draftgo status` 查看已安装目标和 Skill 版本。
|
|
13
|
+
2. 需要查看支持的 AI 工具时,运行 `draftgo list-targets`。
|
|
14
|
+
3. 尚未安装时运行 `draftgo init [target...]`;不指定 target 时由 CLI 自动识别。
|
|
15
|
+
4. 已安装但需要刷新时运行 `draftgo update [target...]`,该命令同时完全更新全局 CLI 与已安装 Skill。
|
|
16
|
+
5. 项目缺少 `.draftgo/config.json` 时选择基座:
|
|
17
|
+
- 已有 DraftGo 服务器:运行 `draftgo connect`。
|
|
18
|
+
- 需要本地 Docker 基座:运行 `draftgo local setup`。
|
|
19
|
+
6. 连接完成后运行 `draftgo map`,确认页面、导航、数据、自定义服务和系统资源已进入本地上下文。
|
|
17
20
|
|
|
18
|
-
|
|
19
|
-
- **不存在**:向用户询问:
|
|
20
|
-
1. DraftGo 服务器地址(如 `https://your-server.com`)
|
|
21
|
-
2. 系统访问令牌(SAT,管理后台 → 系统设置 → API Token)
|
|
21
|
+
`draftgo init` 负责安装 Skill;`draftgo connect` 负责写入服务器连接并拉取初始上下文。不要混用两者的职责。
|
|
22
22
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
## 第二步:执行初始化脚本
|
|
26
|
-
|
|
27
|
-
脚本位于 `{{SKILL_SCRIPTS}}/draftgo_init.py`,直接运行(**不要读取脚本内容**):
|
|
28
|
-
|
|
29
|
-
```
|
|
30
|
-
# 默认:项目根由脚本自动推导(向上查找含 .draftgo/ 的目录)
|
|
31
|
-
!DRAFTGO_TOKEN="<token>" python {{SKILL_SCRIPTS}}/draftgo_init.py --server "<server>"
|
|
32
|
-
|
|
33
|
-
# 用户明确指定了项目路径时,作为位置参数传入
|
|
34
|
-
!DRAFTGO_TOKEN="<token>" python {{SKILL_SCRIPTS}}/draftgo_init.py --server "<server>" "<project_path>"
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
脚本会自动完成所有工作并输出摘要,**不要读取任何中间 JSON 文件**。
|
|
38
|
-
|
|
39
|
-
---
|
|
40
|
-
|
|
41
|
-
## 第三步:确认结果
|
|
42
|
-
|
|
43
|
-
脚本执行完毕后,确认 `.draftgo/config.json` 生成成功:
|
|
44
|
-
|
|
45
|
-
```
|
|
46
|
-
!test -f .draftgo/config.json && echo "OK" || echo "FAIL"
|
|
47
|
-
```
|
|
48
|
-
|
|
49
|
-
---
|
|
50
|
-
|
|
51
|
-
## 初始化目录
|
|
52
|
-
|
|
53
|
-
脚本执行完毕后,确保以下目录存在(不存在则创建):
|
|
54
|
-
|
|
55
|
-
```
|
|
56
|
-
!mkdir -p .draftgo/lessons .draftgo/Task
|
|
57
|
-
```
|
|
58
|
-
|
|
59
|
-
- `.draftgo/changelog.md`:更新日志(单文件,按日期分节)
|
|
60
|
-
- `.draftgo/lessons/`:开发经验与问题记录(按 `YYYY-MM-DD-主题.md` 命名)
|
|
61
|
-
- `.draftgo/Task/`:每个开发任务一个 Markdown 文件,含需求纪要 / 设计 / 任务清单 / 进度标记
|
|
62
|
-
|
|
63
|
-
> **注意:`.draftgo/story.yaml` 不在 init 流程中创建。** Story 文件由 AI 在首次开发对话时通过 Story 门禁流程自动构建(见 `{{SKILL_DIR}}/story/SKILL.md`),确保它是基于与开发者对话理解后生成的,而不是空模板。
|
|
64
|
-
|
|
65
|
-
## 完成提示
|
|
66
|
-
|
|
67
|
-
将脚本的输出摘要(页面数、导航数、文档数、自定义脚本数、外部 API 数、服务器地址)告知用户,并提示:
|
|
68
|
-
- 下一步:描述要开发的功能,或运行 `/draftgo push` 推送修改
|
|
69
|
-
- 如需刷新数据:运行 `/draftgo pull`(按类型增量拉取)或 `/draftgo pull --all`(全量刷新)
|
|
70
|
-
- 已拉取的资源分布:
|
|
71
|
-
- `.draftgo/pages/`、`.draftgo/navigations/`:页面与导航 HTML
|
|
72
|
-
- `.draftgo/docs/articles/`:文档中心文章正文(Markdown),分类索引在 `.draftgo/doc_categories/index.json`
|
|
73
|
-
- `.draftgo/custom_scripts/`:自定义脚本代码(按 language 落到 `.py`/`.js` 等),meta 在同目录 `index.json`
|
|
74
|
-
- `.draftgo/external_apis/index.json`:外部 API 注册(`auth_config` 已脱敏)
|
|
75
|
-
- 修改这些资源后通过 `/draftgo push <类型>` 推回云端,类型见根 SKILL.md。
|
|
23
|
+
## 后续动作
|
|
76
24
|
|
|
77
|
-
|
|
25
|
+
- 刷新云端资源:`draftgo pull [type] [id...]`
|
|
26
|
+
- 管理本地基座:`draftgo local start|stop|logs|status`
|
|
27
|
+
- 移除指定目标:`draftgo uninstall <target>`
|
|
28
|
+
- 完整移除所有目标:仅在用户明确要求时运行 `draftgo uninstall all`;`--purge` 还会删除项目的 `.draftgo/` 数据。
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema_version": "1.0",
|
|
3
|
+
"id": "draftgo",
|
|
4
|
+
"name": "DraftGo 开发助手",
|
|
5
|
+
"version": "3.0.33",
|
|
6
|
+
"entry": "SKILL.md",
|
|
7
|
+
"description": "DraftGo 应用的开发、资源同步、验证与交付工作流。",
|
|
8
|
+
"license": "MIT",
|
|
9
|
+
"capabilities": [
|
|
10
|
+
"draftgo-development",
|
|
11
|
+
"custom-service-ai-sdk",
|
|
12
|
+
"resource-sync",
|
|
13
|
+
"project-validation",
|
|
14
|
+
"skill-installation"
|
|
15
|
+
],
|
|
16
|
+
"permissions": [
|
|
17
|
+
"workspace:read",
|
|
18
|
+
"workspace:write",
|
|
19
|
+
"process:run",
|
|
20
|
+
"network:explicit"
|
|
21
|
+
],
|
|
22
|
+
"resources": {
|
|
23
|
+
"references": ["references"],
|
|
24
|
+
"scripts": "scripts",
|
|
25
|
+
"subskills": ["init", "pull", "push", "story"]
|
|
26
|
+
}
|
|
27
|
+
}
|
|
@@ -1,59 +1,33 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: draftgo-pull
|
|
3
|
-
description:
|
|
4
|
-
version: 1.0.0
|
|
5
|
-
allowed-tools: Bash(python:*), Read, Glob
|
|
3
|
+
description: Pull all or selected DraftGo resources from the connected server into local .draftgo indexes and referenced files before inspection or modification.
|
|
6
4
|
---
|
|
7
5
|
|
|
8
|
-
# DraftGo
|
|
6
|
+
# DraftGo 拉取
|
|
9
7
|
|
|
10
|
-
|
|
11
|
-
> 唯一正确方式:运行下方 Python 脚本。
|
|
8
|
+
使用 `draftgo pull`;内部 Python 脚本由 CLI 定位和执行。
|
|
12
9
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
## 拉取全部("拉取全部" / "pull all")
|
|
16
|
-
|
|
17
|
-
```
|
|
18
|
-
!python {{SKILL_SCRIPTS}}/draftgo_pull.py --all
|
|
19
|
-
```
|
|
20
|
-
|
|
21
|
-
## 按类型拉取
|
|
10
|
+
## 命令
|
|
22
11
|
|
|
12
|
+
```bash
|
|
13
|
+
draftgo pull
|
|
14
|
+
draftgo pull <type> [id...]
|
|
23
15
|
```
|
|
24
|
-
!python {{SKILL_SCRIPTS}}/draftgo_pull.py pages [page_id ...]
|
|
25
|
-
!python {{SKILL_SCRIPTS}}/draftgo_pull.py nav [nav_id ...]
|
|
26
|
-
!python {{SKILL_SCRIPTS}}/draftgo_pull.py db_meta [db_meta_id ...]
|
|
27
|
-
!python {{SKILL_SCRIPTS}}/draftgo_pull.py aihub [aihub_id ...]
|
|
28
|
-
!python {{SKILL_SCRIPTS}}/draftgo_pull.py external_apis [api_id ...]
|
|
29
|
-
!python {{SKILL_SCRIPTS}}/draftgo_pull.py system_config [config_key ...]
|
|
30
|
-
!python {{SKILL_SCRIPTS}}/draftgo_pull.py docs [article_id ...]
|
|
31
|
-
!python {{SKILL_SCRIPTS}}/draftgo_pull.py doc_categories [category_id ...]
|
|
32
|
-
!python {{SKILL_SCRIPTS}}/draftgo_pull.py custom_scripts [script_id ...]
|
|
33
|
-
!python {{SKILL_SCRIPTS}}/draftgo_pull.py roles [role_id ...]
|
|
34
|
-
!python {{SKILL_SCRIPTS}}/draftgo_pull.py users [user_id ...]
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
脚本会自动读取 `.draftgo/config.json` 获取 server 和 token。
|
|
38
16
|
|
|
39
|
-
|
|
17
|
+
不带参数时拉取全部资源。支持的类型:
|
|
40
18
|
|
|
41
|
-
|
|
42
|
-
- 多人协作时需要同步其他人的修改
|
|
43
|
-
- 本地文件损坏或过期,需要刷新
|
|
19
|
+
`pages`、`nav`、`db_meta`、`aihub`、`system_config`、`docs`、`doc_categories`、`custom_scripts`、`roles`、`users`。
|
|
44
20
|
|
|
45
|
-
##
|
|
21
|
+
## 执行
|
|
46
22
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
23
|
+
1. 在本地资源缺失、过期、损坏,或用户明确要求同步云端版本时运行 pull。
|
|
24
|
+
2. 只拉取当前工作需要的类型或 id;需要建立完整项目上下文时运行无参数的 `draftgo pull`。
|
|
25
|
+
3. 拉取后重新读取对应 `index.json` 以及其中 `html_file`、`content_file`、`code_file` 指向的文件。
|
|
26
|
+
4. 修改自定义服务前,确认 `code_file`、`go_mod`、`go_sum` 已同步,并读取 `../references/custom-services.md`。
|
|
27
|
+
5. 运行 `draftgo map` 确认跨资源入口或依赖已更新。
|
|
51
28
|
|
|
52
29
|
## 失败处理
|
|
53
30
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
```
|
|
58
|
-
⚠️ Token 无效,请重新运行 /draftgo init 更新 token。
|
|
59
|
-
```
|
|
31
|
+
- 缺少 `.draftgo/config.json`:运行 `draftgo connect`。
|
|
32
|
+
- HTTP 401:连接令牌无效,重新运行 `draftgo connect`。
|
|
33
|
+
- 返回空列表但预期存在资源:检查令牌是否具备对应读取权限,不把空结果直接当成资源不存在。
|
|
@@ -1,265 +1,48 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: draftgo-push
|
|
3
|
-
description:
|
|
4
|
-
version: 1.5.0
|
|
5
|
-
allowed-tools: Bash(python:*), Read, Glob
|
|
3
|
+
description: Create or update DraftGo resources from local .draftgo indexes and referenced files, choose direct push, checked delivery, or configured automatic delivery, and verify the resulting server state.
|
|
6
4
|
---
|
|
7
5
|
|
|
8
|
-
# DraftGo
|
|
6
|
+
# DraftGo 推送与交付
|
|
9
7
|
|
|
10
|
-
|
|
11
|
-
> 唯一正确方式:运行下方 Python 脚本。脚本覆盖 init 拉取的全部类型(pages / nav / db_meta / aihub / external_apis / system_config / roles / users / docs / doc_categories / custom_scripts),已处理字段结构、token 读取、错误处理。
|
|
8
|
+
使用 `draftgo push`、`draftgo deploy` 或 `draftgo auto-push`;内部 Python 脚本由 CLI 定位和执行。
|
|
12
9
|
|
|
13
|
-
|
|
10
|
+
## 选择动作
|
|
14
11
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
> push 脚本同时承担「更新」与「创建」。判定依据是 index.json 条目里**有没有 `id` 字段**:
|
|
18
|
-
> - **有 id** → `PUT /api/{type}/{id}` 更新(PUT 404 时自动转为创建)
|
|
19
|
-
> - **无 id** → `POST /api/{type}` 创建,成功后**自动回写新 id 到 index.json**,并把对应 .html/.md/代码文件**重命名为 pull 约定的 `{prefix}_{id}_{slug}.{ext}`**
|
|
20
|
-
|
|
21
|
-
支持创建的类型:**pages / nav / db_meta / aihub / external_apis / docs / doc_categories / custom_scripts**。
|
|
22
|
-
|
|
23
|
-
### 新建页面的标准流程
|
|
24
|
-
|
|
25
|
-
1. 在 `.draftgo/pages/` 写好页面 HTML 文件(文件名随意,建议 `page_new_<slug>.html`)
|
|
26
|
-
2. 在 `.draftgo/pages/index.json` **追加一条不带 `id` 的记录**:
|
|
27
|
-
```json
|
|
28
|
-
{
|
|
29
|
-
"title": "关于我们",
|
|
30
|
-
"route": "/about",
|
|
31
|
-
"menu": null,
|
|
32
|
-
"tag": null,
|
|
33
|
-
"status": "active",
|
|
34
|
-
"permission": { "default": "public" },
|
|
35
|
-
"html_file": ".draftgo/pages/page_new_about.html"
|
|
36
|
-
}
|
|
37
|
-
```
|
|
38
|
-
> `route` 不能与云端已有页面重复,否则后端返回 400。保留路由 `/setup` 不可占用。
|
|
39
|
-
3. 运行 push(不带具体 id,会扫描整个 index):
|
|
40
|
-
```
|
|
41
|
-
!python {{SKILL_SCRIPTS}}/draftgo_push.py pages
|
|
42
|
-
```
|
|
43
|
-
4. 脚本输出 `OK [关于我们] 已创建 page_id=42(已回写 index)`,此时 index.json 已填入 `id`,html 文件已重命名为 `page_42_about.html`。后续再改这个页面就是普通的按 id 更新。
|
|
44
|
-
|
|
45
|
-
### 各类型新建的最小必填字段
|
|
46
|
-
|
|
47
|
-
| 类型 | index 条目必填(除 html_file/content_file/code_file 外) | 说明 |
|
|
48
|
-
|---|---|---|
|
|
49
|
-
| pages | `title`, `route` | route 不可重复 |
|
|
50
|
-
| nav | `name`, `code` | 创建必填 code,更新时不发 |
|
|
51
|
-
| db_meta | `type`, `label`, `schema` | 无 id 时按 type 创建 |
|
|
52
|
-
| aihub | `type`, `name`, `data` | 支持 model/prompt/agent/mcp/skill 等 AI 资产 |
|
|
53
|
-
| external_apis | `code`, `name`, `base_url` | code 不可包含 `/` 或空格;创建时不发送 status |
|
|
54
|
-
| docs | `title` | 其余字段有默认值 |
|
|
55
|
-
| doc_categories | `name` | slug 可选;不填由后端生成/处理 |
|
|
56
|
-
| custom_scripts | `name`, `slug`, `mode`, `triggers` | mode=route/event/scheduled;创建后默认覆盖代码,启停仍走 enable/disable |
|
|
57
|
-
|
|
58
|
-
> **创建后必须以脚本回写的 index 为准**,不要手动猜 id。回写后建议 `git diff` 或重新读 index 确认 `id` 已落地。
|
|
59
|
-
|
|
60
|
-
## 推送页面("推送页面" / "push pages")
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
```
|
|
64
|
-
!python {{SKILL_SCRIPTS}}/draftgo_push.py pages
|
|
65
|
-
!python {{SKILL_SCRIPTS}}/draftgo_push.py pages <page_id>
|
|
66
|
-
```
|
|
67
|
-
|
|
68
|
-
## 推送数据库元数据("推送数据库" / "push db_meta")
|
|
69
|
-
|
|
70
|
-
```
|
|
71
|
-
!python {{SKILL_SCRIPTS}}/draftgo_push.py db_meta
|
|
72
|
-
!python {{SKILL_SCRIPTS}}/draftgo_push.py db_meta <db_meta_id>
|
|
73
|
-
```
|
|
74
|
-
|
|
75
|
-
## 推送导航栏("推送导航" / "push nav")
|
|
76
|
-
|
|
77
|
-
```
|
|
78
|
-
!python {{SKILL_SCRIPTS}}/draftgo_push.py nav
|
|
79
|
-
!python {{SKILL_SCRIPTS}}/draftgo_push.py nav <nav_id>
|
|
80
|
-
```
|
|
81
|
-
|
|
82
|
-
脚本会自动读取 `.draftgo/config.json`。
|
|
83
|
-
|
|
84
|
-
## 推送 AI 资产("推送AI资产" / "push aihub")
|
|
85
|
-
|
|
86
|
-
```
|
|
87
|
-
!python {{SKILL_SCRIPTS}}/draftgo_push.py aihub
|
|
88
|
-
!python {{SKILL_SCRIPTS}}/draftgo_push.py aihub <aihub_id>
|
|
89
|
-
```
|
|
90
|
-
|
|
91
|
-
读取 `.draftgo/aihub/index.json`,按 `AIHubUpdate` schema 推送;无 `id` 或 PUT 404 时会 `POST /api/aihub` 创建,成功后回写新 `id`。
|
|
92
|
-
|
|
93
|
-
## 推送外部 API("推送外部API" / "push external_apis")
|
|
94
|
-
|
|
95
|
-
```
|
|
96
|
-
!python {{SKILL_SCRIPTS}}/draftgo_push.py external_apis
|
|
97
|
-
!python {{SKILL_SCRIPTS}}/draftgo_push.py external_apis <api_id>
|
|
98
|
-
```
|
|
99
|
-
|
|
100
|
-
读取 `.draftgo/external_apis/index.json`(已包含 init 时合并的 detail 字段),按 `ExternalAPIUpdate` schema 推送;无 `id` 或 PUT 404 时会 `POST /api/external-apis` 创建,成功后回写新 `id`。创建最少需要 `code`、`name`、`base_url`。
|
|
101
|
-
|
|
102
|
-
## 推送系统配置("推送系统配置" / "push system_config")
|
|
103
|
-
|
|
104
|
-
```
|
|
105
|
-
!python {{SKILL_SCRIPTS}}/draftgo_push.py system_config
|
|
106
|
-
!python {{SKILL_SCRIPTS}}/draftgo_push.py system_config <config_key>
|
|
107
|
-
```
|
|
108
|
-
|
|
109
|
-
读取 `.draftgo/system_config/index.json`,按 `config_key` 调用 `PUT /api/system/{config_key}`。脚本优先使用 `parsed_value`。
|
|
110
|
-
|
|
111
|
-
## 推送角色("推送角色" / "push roles")⚠️ 需二次确认
|
|
112
|
-
|
|
113
|
-
roles 涉及权限安全,**强制要求人工确认**:
|
|
114
|
-
|
|
115
|
-
1. 读取 `.draftgo/roles/index.json`
|
|
116
|
-
2. **向用户展示即将推送的变更内容**
|
|
117
|
-
3. **等待用户明确确认**
|
|
118
|
-
4. 确认后运行:
|
|
119
|
-
```
|
|
120
|
-
!python {{SKILL_SCRIPTS}}/draftgo_push.py roles
|
|
121
|
-
!python {{SKILL_SCRIPTS}}/draftgo_push.py roles <role_id>
|
|
122
|
-
```
|
|
123
|
-
5. 用户拒绝则不推送
|
|
124
|
-
|
|
125
|
-
## 推送用户("推送用户" / "push users")⚠️ 需二次确认
|
|
126
|
-
|
|
127
|
-
users 涉及账号安全,**强制要求人工确认**:
|
|
128
|
-
|
|
129
|
-
1. 读取 `.draftgo/users/index.json`
|
|
130
|
-
2. **向用户展示即将推送的变更内容**
|
|
131
|
-
3. **等待用户明确确认**
|
|
132
|
-
4. 确认后运行:
|
|
133
|
-
```
|
|
134
|
-
!python {{SKILL_SCRIPTS}}/draftgo_push.py users
|
|
135
|
-
!python {{SKILL_SCRIPTS}}/draftgo_push.py users <user_id>
|
|
136
|
-
```
|
|
137
|
-
5. 脚本不会下发 password / role_ids;如需修改请走专用接口
|
|
138
|
-
|
|
139
|
-
## 推送文档("推送文档" / "push docs")
|
|
140
|
-
|
|
141
|
-
```
|
|
142
|
-
!python {{SKILL_SCRIPTS}}/draftgo_push.py docs
|
|
143
|
-
!python {{SKILL_SCRIPTS}}/draftgo_push.py docs <article_id>
|
|
144
|
-
```
|
|
145
|
-
|
|
146
|
-
读取 `.draftgo/docs/articles/index.json`;正文从 meta 中的 `content_file`(同目录 `.md` 文件)回填,按 `ArticleUpdate` schema 推送。修改文档时**直接改 `.md` 文件**即可,索引项保持稳定。
|
|
147
|
-
|
|
148
|
-
## 推送文档分类("推送文档分类" / "push doc_categories")
|
|
149
|
-
|
|
150
|
-
```
|
|
151
|
-
!python {{SKILL_SCRIPTS}}/draftgo_push.py doc_categories
|
|
152
|
-
!python {{SKILL_SCRIPTS}}/draftgo_push.py doc_categories <category_id>
|
|
153
|
-
```
|
|
154
|
-
|
|
155
|
-
读取 `.draftgo/doc_categories/index.json`,按 `CategoryUpdate` schema 推送;无 `id` 或 PUT 404 时会 `POST /api/docs/categories` 创建,成功后回写新 `id`。
|
|
156
|
-
|
|
157
|
-
## 推送自定义脚本("推送自定义脚本" / "push custom_scripts")⚠️ 需二次确认
|
|
158
|
-
|
|
159
|
-
脚本代码会以**生效语义**直接覆盖云端运行的脚本,**强制要求人工确认**:
|
|
160
|
-
|
|
161
|
-
1. 读取 `.draftgo/custom_scripts/index.json`,并读取每条 meta 中 `code_file` 指向的代码文件
|
|
162
|
-
2. **向用户展示即将更新的脚本与摘要差异**
|
|
163
|
-
3. **等待用户明确确认**
|
|
164
|
-
4. 确认后运行:
|
|
165
|
-
```
|
|
166
|
-
!python {{SKILL_SCRIPTS}}/draftgo_push.py custom_scripts
|
|
167
|
-
!python {{SKILL_SCRIPTS}}/draftgo_push.py custom_scripts <script_id>
|
|
168
|
-
```
|
|
169
|
-
5. 脚本不会修改 `mode`/`slug`/`status`(避免误启停);如需切换启停请走 `POST /api/scripts/{id}/enable|disable`
|
|
170
|
-
|
|
171
|
-
### ⚠️ code_file 一致性(强制)
|
|
172
|
-
|
|
173
|
-
> **推送脚本只读 `index.json` 中 `code_file` 字段指向的文件。如果你修改了代码但文件名与 `code_file` 不一致,推送的是旧代码。**
|
|
174
|
-
|
|
175
|
-
修改自定义脚本前**必须**:
|
|
176
|
-
1. 先读 `.draftgo/custom_scripts/index.json`,确认目标脚本的 `code_file` 值
|
|
177
|
-
2. **直接修改 `code_file` 指向的那个文件**,不要新建同名/重命名文件
|
|
178
|
-
3. 如果确实需要重命名代码文件,**必须同步更新 `index.json` 中的 `code_file` 字段**
|
|
179
|
-
|
|
180
|
-
违反后果:推送静默成功但上传的是旧代码,云端脚本不更新,排查极其隐蔽。
|
|
181
|
-
|
|
182
|
-
## 冲突检测(多窗口协作保护)
|
|
183
|
-
|
|
184
|
-
> push 前会自动检测云端是否已被他人修改,防止静默覆盖。
|
|
185
|
-
|
|
186
|
-
**工作原理**:pull 时 `index.json` 会记录每条资源的 `updated_at`。push 时先 GET 云端当前 `updated_at`,与本地基线比对:
|
|
187
|
-
|
|
188
|
-
- **一致** → 正常推送
|
|
189
|
-
- **不一致** → 跳过该条,打印警告,继续推下一条
|
|
190
|
-
- **`--force`** → 跳过检测,直接覆盖
|
|
191
|
-
|
|
192
|
-
**典型场景**:
|
|
193
|
-
|
|
194
|
-
| 场景 | 行为 |
|
|
12
|
+
| 意图 | 命令 |
|
|
195
13
|
|---|---|
|
|
196
|
-
|
|
|
197
|
-
|
|
|
198
|
-
|
|
|
199
|
-
|
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
```bash
|
|
203
|
-
draftgo push pages # 带冲突检测
|
|
204
|
-
draftgo push pages --force # 跳过检测,强制覆盖
|
|
205
|
-
```
|
|
206
|
-
|
|
207
|
-
**脚本直接调用**:
|
|
208
|
-
```
|
|
209
|
-
!python {{SKILL_SCRIPTS}}/draftgo_push.py pages
|
|
210
|
-
!python {{SKILL_SCRIPTS}}/draftgo_push.py pages --force
|
|
211
|
-
```
|
|
212
|
-
|
|
213
|
-
## 推送方式
|
|
214
|
-
|
|
215
|
-
**所有类型必须用 Python 脚本推送,禁止用 curl。**
|
|
216
|
-
|
|
217
|
-
curl 在 Windows/Git Bash 环境下传输大 HTML / JSON 时会报 `Argument list too long`(exit 126)。
|
|
218
|
-
统一使用 `draftgo_push.py` 或临时 Python 脚本(`urllib.request`)进行推送。
|
|
14
|
+
| 同步已确认的本地资源 | `draftgo push <type> [id...]` |
|
|
15
|
+
| 先检查但不修改云端 | `draftgo deploy [type] [id...] --delivery local` |
|
|
16
|
+
| 检查并预演请求 | `draftgo deploy [type] [id...] --delivery preview` |
|
|
17
|
+
| 检查并正式推送 | `draftgo deploy [type] [id...] --delivery deploy` |
|
|
18
|
+
| 按项目配置自动推送 | `draftgo auto-push [type] [id...]` |
|
|
19
|
+
| 一次推送多个资源集合 | `draftgo auto-push --batch pages 1,2 nav 4 custom_scripts 7` |
|
|
219
20
|
|
|
220
|
-
|
|
21
|
+
`push` 不自动运行 `check`。`deploy` 始终先运行 `check`。`auto-push` 先检查,并且仅在 `.draftgo/config.json` 的 `auto_push` 为 `true` 时推送。
|
|
221
22
|
|
|
222
|
-
|
|
23
|
+
## 创建与更新
|
|
223
24
|
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
"tag": null,
|
|
230
|
-
"menu": "...",
|
|
231
|
-
"status": "active",
|
|
232
|
-
"permission": { "default": "login", "roles": [...] },
|
|
233
|
-
"value": { "html": "完整HTML字符串" }
|
|
234
|
-
}
|
|
235
|
-
```
|
|
236
|
-
缺少任何字段会返回 422。`value` 是 `{"html": "..."}` 的 dict,不是字符串。
|
|
25
|
+
- 更新资源:修改 index 条目及其引用文件,再运行 `draftgo push <type> [id...]`。
|
|
26
|
+
- 创建资源:在对应 index 中加入不带 `id` 的完整条目并创建引用文件,再运行 `draftgo push <type>`。
|
|
27
|
+
- 创建成功后重新读取 index。CLI 会回写服务端 `id`,并可能把引用文件重命名为服务端约定名称。
|
|
28
|
+
- 修改已有页面、导航、文档或服务时,直接编辑 index 中 `html_file`、`content_file`、`code_file` 指向的文件;重命名文件时同步修改该字段。
|
|
29
|
+
- 不带 id 的创建支持 `pages`、`nav`、`db_meta`、`aihub`、`docs`、`doc_categories`、`custom_scripts`。系统配置按 `config_key` 更新或创建;角色与用户只更新已有记录。
|
|
237
30
|
|
|
238
|
-
|
|
31
|
+
可推送类型:
|
|
239
32
|
|
|
240
|
-
|
|
33
|
+
`pages`、`nav`、`db_meta`、`aihub`、`system_config`、`docs`、`doc_categories`、`custom_scripts`、`roles`、`users`。
|
|
241
34
|
|
|
242
|
-
|
|
35
|
+
## 资源契约
|
|
243
36
|
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
**用户推送**:`PUT /api/users/{id}`,payload 子集:`username`, `email`, `phone_number`, `nickname`, `avatar`, `status`, `notes`(不含 password / role_ids)。
|
|
251
|
-
|
|
252
|
-
**文档推送**:`PUT /api/docs/articles/{id}`,payload 子集:`title`, `slug`, `category_id`, `summary`, `content`(从 `.md` 文件读取), `cover`, `tags`, `status`, `is_top`, `sort_order`, `seo_title`, `seo_description`, `permission`。
|
|
253
|
-
|
|
254
|
-
**文档分类推送**:`PUT /api/docs/categories/{id}`,payload:`name`, `slug`, `description`, `icon`, `parent_id`, `sort_order`, `status`。
|
|
255
|
-
|
|
256
|
-
**自定义脚本推送**:`PUT /api/scripts/{id}`,payload 子集:`name`, `description`, `code`(从语言对应的代码文件读取), `triggers`, `config`, `permission`。注意 schema 不接受 `mode`/`status`,启停请走 `POST /api/scripts/{id}/enable|disable`。
|
|
37
|
+
- 页面、导航或新资源:推送前运行 `draftgo check`。
|
|
38
|
+
- 自定义服务:修改前读取 `../references/custom-services.md`;推送后请求目标 `/api/x/<slug><route-path>`,不能只以推送成功作为完成证据。
|
|
39
|
+
- 包含 `draftgo.Admin.*` 的服务:真实调用后回读执行详情,确认管理员 SDK 调用已进入审计。
|
|
40
|
+
- 动态 DB:按 `../references/data.md` 和当前 `db_meta` schema 验证真实读写。
|
|
41
|
+
- 系统配置、角色和用户:推送后回读关键字段,确认没有覆盖未登记的关系或敏感值。
|
|
257
42
|
|
|
258
43
|
## 失败处理
|
|
259
44
|
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
⚠️ Token 无效,请重新运行 /draftgo init 更新 token。
|
|
265
|
-
```
|
|
45
|
+
- 缺少 `.draftgo/config.json`:运行 `draftgo connect`。
|
|
46
|
+
- HTTP 401:重新运行 `draftgo connect` 更新令牌。
|
|
47
|
+
- 指定 id 未登记:重新读取对应 index 或先运行 `draftgo pull <type> [id...]`,不要猜测 id。
|
|
48
|
+
- 推送返回非零状态:停止交付并处理错误,不把部分成功视为完整完成。
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
---
|
|
2
|
+
read_when: 创建或调优 AI Agent 时 · 编辑 .draftgo/aihub/ 时 · 需要工具/子智能体/记忆/多轮/结构化输出/多模态时
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# AIHub / Agent 资源
|
|
6
|
+
|
|
7
|
+
AIHub 资源既是「模型供应商」定义,也是「Agent」定义。本地登记在 `.draftgo/aihub/index.json`
|
|
8
|
+
(`pull_simple`:只有 index,**没有独立内容文件**——整个 Agent 就是一条 JSON 行)。
|
|
9
|
+
`push` 只发送这些字段:`type, name, data, priority, version, tags, describe, permission, status`。
|
|
10
|
+
**Agent 的全部行为都在 `data`(尤其 `data.spec`)里**——本页就是 `data.spec` 的字段地图。
|
|
11
|
+
|
|
12
|
+
## 条目骨架
|
|
13
|
+
|
|
14
|
+
```jsonc
|
|
15
|
+
{
|
|
16
|
+
"type": "agent", // AIHub 条目类型(模型条目为供应商类型)
|
|
17
|
+
"name": "产品顾问",
|
|
18
|
+
"describe": "面向用户的产品答疑助手",
|
|
19
|
+
"status": "active",
|
|
20
|
+
"data": {
|
|
21
|
+
"mode": "chat", // chat | image_generation
|
|
22
|
+
"spec": { /* 见下表 */ }
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
页面对话 UI 使用 `<dg-chat protocol="draftgo-agent" agent-id="AGENT_ID">` 或 `DraftGoChat.create()`;
|
|
28
|
+
旧代码/无 UI 文本调用可用 `DraftGoAI.chat(...)`,图片模式使用 `DraftGoAI.images(...)`。调用前都必须加载
|
|
29
|
+
`/assets/draftgo-chat.js`,完整用法见 `references/chat-sdk.md`。后端为 `POST /api/agents/{id}/chat|images`。
|
|
30
|
+
可调用 Agent 列表 `GET /api/agents`,见 `references/api-endpoints.md`。
|
|
31
|
+
|
|
32
|
+
## `data.spec` 字段地图
|
|
33
|
+
|
|
34
|
+
留空即维持默认/旧行为;除标注外都是可选。运行时统一在 `parseOrchestrationConfig` + 就地读取时带默认值与 clamp。
|
|
35
|
+
|
|
36
|
+
| 字段 | 类型 / 取值 | 说明 |
|
|
37
|
+
|---|---|---|
|
|
38
|
+
| `mode` | `chat` / `image_generation` | 决定走 `/chat` 还是 `/images`;调错接口会被后端拒绝 |
|
|
39
|
+
| `model` | string | 主模型(逻辑模型名,映射到供应商路由) |
|
|
40
|
+
| `fallback_models` | string[] | 主模型失败后按序回退(跨模型 failover) |
|
|
41
|
+
| `model_selection.user_selectable` | bool | 是否允许调用方在请求里覆盖 `model`(配合 `selectable-models`) |
|
|
42
|
+
| `ttft_timeout` | number(秒,1–600,空=不启用) | 首字超时 failover:首个 SSE data 事件超时即跨模型+跨供应商切换,推理模型不误杀 |
|
|
43
|
+
| `sync_request_timeout` | number(秒,1–600,默认 100) | 非流式请求上限 |
|
|
44
|
+
| `stream_ttl` | number(秒,1–3600,默认 600) | 流式请求上限 |
|
|
45
|
+
| `reasoning_effort` | `minimal`/`low`/`medium`/`high` | 纯透传,仅 OpenAI 系模型生效 |
|
|
46
|
+
| `system_prompt_template` | string | 系统提示模板 |
|
|
47
|
+
| `context.max_history` | number(默认 20) | 工作窗口:保留最近 N 条;关闭持续对话时即滑动窗口硬上限 |
|
|
48
|
+
| `output_format.mode` | `text` / `json` | JSON 时按 `output_format.json.{schema,schema_name,strategy}` 约束/校验/降级 |
|
|
49
|
+
| `capabilities.vision.{enabled,input,max_mb}` | 见值 | 图片/视觉输入(`image_url` part),`input`⊂{base64,url},默认 5MB |
|
|
50
|
+
| `capabilities.files.{enabled,allowed_ext,max_mb}` | 见值 | 文件附件抽取成文本注入;白名单 `.txt .md .docx .pdf .xlsx .json .csv`(pptx 不支持),默认 8MB |
|
|
51
|
+
| `tools.max_iterations` | 1–50(默认 10) | ReAct 工具循环步数上限 |
|
|
52
|
+
| `tools.sources[].{type,id}` | `mcp` / `custom_script` | 绑定 MCP 与「自定义服务作为工具」 |
|
|
53
|
+
| `knowledge_base_ids` | int[] | 绑定知识库,生成检索工具 |
|
|
54
|
+
| `skills` | 见运行时 | 绑定 Skill |
|
|
55
|
+
| `sub_agent_ids` | int[] | 子智能体:为每个 id 生成 `agent_{id}` 委派工具(用法同 `knowledge_base_ids`) |
|
|
56
|
+
| `call_permissions` | 角色配置 | 谁能调用此 Agent(`GET /api/agents` 据此过滤) |
|
|
57
|
+
|
|
58
|
+
### `orchestration.*`(编排开关)
|
|
59
|
+
|
|
60
|
+
| 字段 | 默认 | 说明 |
|
|
61
|
+
|---|---|---|
|
|
62
|
+
| `tool_concurrency` | 8(1–32) | 单步内并发执行工具数 |
|
|
63
|
+
| `on_max_steps` | `error` | 达步数上限:`error` 报错 / `stop` 返回最后一条 |
|
|
64
|
+
| `tool_disclosure.{mode,threshold_tools}` | `off` | 工具渐进披露:`off`/`auto`/`always`,首轮只给目录+`load_tools` |
|
|
65
|
+
| `planning.{enabled,prompt}` | false | 规划层:执行前先让模型列步骤,提示折叠进 system |
|
|
66
|
+
| `memory.{enabled,scope}` | false / `user_agent` | 长期记忆:对话后自动提炼、下轮召回注入;作用域 `agent`/`user`/`user_agent` |
|
|
67
|
+
| `compaction.{enabled,keep_recent,trigger_messages,trigger_tokens,preset}` | 关闭 | **持续对话/上下文闭环**:见下 |
|
|
68
|
+
| `checkpoint_input_mode` / `checkpoint_max_messages` / `checkpoint_ttl_seconds` | 全量 / 100 / 86400 | 会话历史持久化(配合请求 `session_id`) |
|
|
69
|
+
| `delegation.{max_depth,max_total_calls}` | 2 / 8 | 子智能体委派的深度与调用预算护栏 |
|
|
70
|
+
|
|
71
|
+
### 持续对话(上下文闭环)
|
|
72
|
+
|
|
73
|
+
- `compaction.enabled=true` = 闭环:填满工作窗口后把溢出旧消息**摘要成一条滚动 summary** 续接,
|
|
74
|
+
而非直接丢弃。此时后端**跳过 `context.max_history` 硬砍**,让完整 checkpoint 历史进入压缩器蒸馏。
|
|
75
|
+
- 触发为双通道任一命中:`trigger_messages`(条数)或 `trigger_tokens`(估算 token,256–2000000)。
|
|
76
|
+
- `keep_recent`:保留最近 N 条不压缩。`preset`(`aggressive`/`balanced`/`conservative`)是管理台档位回显,
|
|
77
|
+
后端只认 `keep_recent`/`trigger_messages`/`trigger_tokens` 三个底层字段。
|
|
78
|
+
- 配合请求体 `session_id` 才会加载/续写会话历史;`<dg-chat>` 为每个 UI thread 自动维护该值,兼容门面可通过 `DraftGoAI.chat(..., {sessionId})` 显式传入。不传即无状态单轮。
|
|
79
|
+
- 关闭时逐字回退为 `max_history` 滑动窗口(旧行为,零影响)。
|
|
80
|
+
|
|
81
|
+
## 观测
|
|
82
|
+
|
|
83
|
+
每次调用都开一条 AI run,管理台 `/admin/ai-runs` 展示状态、tokens、延迟、`ttft_ms` 与 span 链路。
|
|
84
|
+
接口:`GET /api/aihub/runs`、`GET /api/aihub/runs/{trace_id}`、`DELETE /api/aihub/runs`。
|
|
85
|
+
|
|
86
|
+
> 权威细节以 DraftGo 后端 `docs/backend/modules/agent-runtime.md` 为准;本页是基座开发者视角的字段速查。
|