draftgo-cli 4.0.24 → 4.0.26
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 +23 -37
- package/package.json +3 -5
- package/resources/skill/SKILL.md +9 -5
- package/resources/skill/manifest.json +2 -5
- package/resources/skill/references/ai.md +41 -0
- package/resources/skill/references/app-api.md +2 -50
- package/resources/skill/references/architecture.md +1 -1
- package/resources/skill/references/chat-sdk.md +29 -37
- package/resources/skill/references/checkout.md +4 -4
- package/resources/skill/references/data.md +0 -46
- package/resources/skill/references/delivery.md +3 -3
- package/resources/skill/references/diagnostics.md +10 -11
- package/resources/skill/references/frontend.md +23 -20
- package/resources/skill/references/mcp.md +4 -14
- package/resources/skill/references/methods.md +15 -68
- package/resources/skill/references/modules.md +23 -44
- package/resources/skill/references/runtime.md +3 -20
- package/resources/skill/story/SKILL.md +2 -2
- package/src/apiContractCache.js +14 -6
- package/src/cli.js +0 -7
- package/src/commandRegistry.js +0 -6
- package/src/commands/api.js +87 -17
- package/src/commands/apiKey.js +2 -6
- package/src/commands/autoPush.js +15 -51
- package/src/commands/capabilities.js +22 -15
- package/src/commands/check.js +19 -53
- package/src/commands/checkout.js +1 -4
- package/src/commands/clean.js +1 -1
- package/src/commands/commit.js +1 -4
- package/src/commands/components.js +12 -8
- package/src/commands/conflict.js +4 -6
- package/src/commands/conflicts.js +1 -2
- package/src/commands/connect.js +0 -8
- package/src/commands/delete.js +15 -11
- package/src/commands/deploy.js +64 -26
- package/src/commands/diff.js +1 -4
- package/src/commands/group.js +2 -3
- package/src/commands/help.js +22 -43
- package/src/commands/init.js +13 -6
- package/src/commands/local.js +4 -1
- package/src/commands/map.js +138 -23
- package/src/commands/reconcile.js +1 -15
- package/src/commands/role.js +1 -2
- package/src/commands/status.js +12 -40
- package/src/commands/update.js +18 -24
- package/src/commands/verify.js +8 -7
- package/src/commands/worklog.js +11 -5
- package/src/contractCompatibility.js +10 -2
- package/src/localRuntime/compose.js +41 -27
- package/src/localRuntime/detect.js +6 -6
- package/src/localRuntime/index.js +47 -47
- package/src/localRuntime/services.js +2 -39
- package/src/mcp/client.js +99 -134
- package/src/mcp/parallel.js +25 -2
- package/src/mcp/protocol.js +38 -9
- package/src/mcp/tools.js +10 -19
- package/src/projectConfig.js +1 -4
- package/src/{workspaceHealth.js → projectHealth.js} +5 -5
- package/src/projectMap.js +1 -1
- package/src/runtimeFiles.js +2 -1
- package/src/worklog.js +3 -2
- package/src/worktree/backend.js +127 -15
- package/src/worktree/index.js +64 -22
- package/src/worktree/locks.js +52 -0
- package/src/worktree/manifest.js +18 -4
- package/src/worktree/status.js +4 -2
- package/resources/custom-service-sdk/ai.go +0 -520
- package/resources/custom-service-sdk/ai_test.go +0 -156
- package/resources/custom-service-sdk/auth_test.go +0 -56
- package/resources/custom-service-sdk/billing.go +0 -596
- package/resources/custom-service-sdk/billing_test.go +0 -150
- package/resources/custom-service-sdk/go.mod +0 -3
- package/resources/custom-service-sdk/manifest.json +0 -77
- package/resources/custom-service-sdk/platform.go +0 -352
- package/resources/custom-service-sdk/platform_logger_test.go +0 -24
- package/resources/custom-service-sdk/registration_test.go +0 -39
- package/resources/custom-service-sdk/resources.go +0 -247
- package/resources/custom-service-sdk/resources_billing_test.go +0 -115
- package/resources/custom-service-sdk/resources_files_test.go +0 -57
- package/resources/custom-service-sdk/resources_scope_test.go +0 -92
- package/resources/custom-service-sdk/sdk.go +0 -209
- package/resources/skill/references/aihub.md +0 -116
- package/resources/skill/references/custom-services.md +0 -201
- package/src/commands/customService.js +0 -95
- package/src/commands/dataRange.js +0 -33
- package/src/commands/grant.js +0 -29
- package/src/commands/space.js +0 -41
- package/src/customServices.js +0 -484
package/README.md
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
# DraftGo CLI 4
|
|
2
2
|
|
|
3
|
-
面向 AI 编码工具的 DraftGo
|
|
3
|
+
面向 AI 编码工具的 DraftGo CLI。它负责 Skill 安装、项目连接、System MCP 发现、长正文 checkout/commit、组件开发、统一本地验收和 worklog 记录。
|
|
4
4
|
|
|
5
5
|
## 核心规则
|
|
6
6
|
|
|
7
7
|
- 根 Skill 自动加载;Agent 只读取当前任务需要的 Reference。
|
|
8
|
-
- pages、navigations
|
|
8
|
+
- pages、navigations 和 docs/articles 的完整正文使用 `checkout`、worktree、`diff`、`commit`;结构化资源使用 MCP/API。
|
|
9
9
|
- MCP schema 是服务端实时契约。已知 operation 优先使用项目私有缓存;首次使用或 `registry_revision` 变化时 describe。schema 不写入 Skill 或聊天上下文。
|
|
10
10
|
- 不同资源、operation 和 owner 的工作全部并发;同一资源的依赖步骤保持串行。
|
|
11
11
|
- 每个任务开始记录到 `.draftgo/worklog.md`,验证和交付成功后再标记完成。
|
|
12
12
|
- 已知页面使用 `draftgo map --type pages --route <path>` 或 `--title <title>` 精确定位;只需范围和状态时使用 `--summary`,浏览列表时使用 `--limit`(默认 20)/`--cursor`,不默认全量 map。
|
|
13
13
|
- `--output json` 的 stdout 只包含 UTF-8 JSON;诊断和进度写入 stderr。大变更先用 `draftgo diff --stat` 或 `--summary`。
|
|
14
14
|
|
|
15
|
-
跨板块任务先看[极简方法指南](resources/skill/references/methods.md):它按
|
|
15
|
+
跨板块任务先看[极简方法指南](resources/skill/references/methods.md):它按 AI 能力、知识库/记忆、页面/内容、动态数据、MCP、运行诊断和交付验收给出“适用场景 + 最短正确命令链 + 失败定位 + 完成条件”。动态 operation 不写死;未知契约统一用 `draftgo api search`、`draftgo api describe`、`draftgo api call` 实时发现。
|
|
16
16
|
|
|
17
17
|
## 验收策略
|
|
18
18
|
|
|
@@ -48,7 +48,7 @@ draftgo mcp setup
|
|
|
48
48
|
draftgo mcp test
|
|
49
49
|
```
|
|
50
50
|
|
|
51
|
-
`connect` 会验证当前用户的 DraftGo API Key、MCP initialize、tools/list
|
|
51
|
+
`connect` 会验证当前用户的 DraftGo API Key、MCP initialize、tools/list、Registry search/describe,并通过 `api_call` 读取脱敏的当前 API Key 状态,然后才把连接写入项目私有的 `.draftgo/config.json`。该探测固定为无参数、低风险、非破坏的 GET,不创建或修改业务数据。宿主 MCP 配置只包含 `draftgo mcp serve`,不会保存 API Key。API Key 只代表真实用户,CLI 不附加契约之外的授权字段。
|
|
52
52
|
|
|
53
53
|
本地底座:
|
|
54
54
|
|
|
@@ -73,14 +73,16 @@ draftgo list-targets
|
|
|
73
73
|
draftgo connect [target...]
|
|
74
74
|
```
|
|
75
75
|
|
|
76
|
-
`draftgo status` 会通过只读 MCP
|
|
76
|
+
`draftgo status` 会通过只读 MCP 诊断显示服务连接健康状态、服务版本和 Registry revision;`--output json` 适合读取 `connection.health` 与 `connection.registry_revision`。
|
|
77
|
+
|
|
78
|
+
`draftgo update` 和 `draftgo update all` 只刷新项目中已经安装的 DraftGo Skill,不会因为检测到 `.cursor`、`AGENTS.md` 等工具痕迹而新增配置。显式指定 target 时(例如 `draftgo update cursor`),如果该 Skill 尚未安装,会按你的明确请求直接安装并更新它;首次接入也可以使用 `draftgo init <target>`。
|
|
77
79
|
|
|
78
80
|
### 发现与正文
|
|
79
81
|
|
|
80
82
|
```text
|
|
81
|
-
draftgo map [--type pages|nav|docs
|
|
82
|
-
draftgo checkout <pages|nav|docs
|
|
83
|
-
draftgo check [
|
|
83
|
+
draftgo map [--type pages|nav|docs] [--route <path>] [--title <title>] [--summary] [--limit <1-100>] [--cursor <opaque>] [--output json]
|
|
84
|
+
draftgo checkout <pages|nav|docs> <id...> [--force]
|
|
85
|
+
draftgo check [--remote]
|
|
84
86
|
draftgo verify [<type> <id...>] [visual flags]
|
|
85
87
|
draftgo diff <type> <id> [--stat|--summary] [--output json]
|
|
86
88
|
draftgo commit <type> <id...>
|
|
@@ -118,26 +120,14 @@ draftgo components export <library> --file <archive.zip>
|
|
|
118
120
|
|
|
119
121
|
`search` 和 `show` 始终读取当前 DraftGo 实例的组件目录,AI 不得按名称猜写 props/slots。Page 以真实根标签和 `data-dg-use="library/component"` 保存活引用,发布新 revision 后刷新自动升级。高度个性化时先 checkout Page,再用 `expand` 固化当前 props、slots、组件/库 CSS、公共资产和 mount 初始化;展开实例变成普通 HTML/CSS/JavaScript,不再随组件升级,仍需经过 `diff -> verify -> commit`。
|
|
120
122
|
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
最短开发闭环:
|
|
124
|
-
|
|
125
|
-
```bash
|
|
126
|
-
# 先用 MCP 定位或创建服务并取得 ID
|
|
127
|
-
draftgo checkout custom-services <id...>
|
|
128
|
-
draftgo diff custom-services <id> --stat
|
|
129
|
-
draftgo commit custom-services <id...>
|
|
130
|
-
draftgo test custom-services <id> --source draft --handler route:POST:/path --input request.json
|
|
131
|
-
```
|
|
123
|
+
最终版服务端内置 `DraftGo` 组件库(slug 为 `draftgo`),当前包含 47 个组件,目录以实例实时返回为准。常用组件包括 `button`、`input`、`select`、`multi-select`、`switch`、`dialog`、`drawer`、`data-filter-bar`、`data-table`、`data-list`、`pagination`、`date-picker`、`number-input`、`file-upload`、`tabs`、`menu`、`popover`、`tooltip`、`empty-state`、`chat` 等。官方页面中的可见选择器必须使用 `draftgo/select` 或 `draftgo/multi-select`,不要写原生 `<select>`。
|
|
132
124
|
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
`commit custom-services` 会自动完成提交、验证和发布,并输出明确的 published 提示;`validate`、`test`、`publish` 仍可作为单独的兼容入口。`test` 只运行 cloud draft,不调用线上版本;发布后如需再试运行,先修改并提交形成新草稿。默认拒绝外部副作用;外部调用用 `--side-effect-policy mock` 模拟,只有明确需要真实副作用时才组合 `--side-effect-policy live --test-write`。数据库等写操作也必须显式加 `--test-write`。
|
|
136
|
-
|
|
137
|
-
`--source` 支持 `draft`(默认)、`auto`、`published`。Selector 支持 `route:METHOD:/path`、`event:name`、`scheduled:name` 或 handler 名;`--input`、`--headers`、`--user` 都读取 UTF-8 JSON object。普通 SDK 调用继承已验证的 `platform` 或 `space` 上下文;自定义服务可对单次操作显式使用 `ctx.Admin.*`,该次调用按系统内置 `*:*:all` 全权限执行、进入审计且不会泄漏到后续调用。余额扣款、权益、支付和订阅使用 `ctx.Billing` / `ctx.Admin.Billing`,精确签名查看 checkout 后只读的 `.draftgo-sdk/billing.go`。完整字段与规则见[自定义服务方法指南](resources/skill/references/custom-services.md)。
|
|
125
|
+
Page Runtime 的共享资源由最终版 `draftgo` 本地提供:`/assets/adapters/draftgo-components.js`、`/assets/adapters/draftgo-theme.css`、`/assets/tailwindcss.js`、`/assets/icons/`、`/assets/fontawesome/`、`/assets/vendor/{dompurify,marked,highlightjs}/`、`/assets/vendor/gsap/{gsap.min.js,Draggable.min.js}`。`draftgo/chat` 的完整实现直接存放在组件 `Definition.JS`,与其他组件走同一发布和按需解析流程,不存在独立 Chat SDK 静态文件。模型供应商品牌图标位于 `/assets/providers/`,通过 `DraftGoProviderIcons.get(kind)` 查找,未知供应商回退通用图标;不要引用 CDN。历史第三方组件资源不属于最终版契约。
|
|
138
126
|
|
|
139
127
|
### MCP/API
|
|
140
128
|
|
|
129
|
+
`api search` 和 `capabilities list/search` 默认 20 条,支持 `--module`、`--method`、`--limit`、`--cursor`。保留 `next_cursor`,需要更多时继续读取;只有显式 `capabilities audit` 才遍历全部能力。describe 保留完整契约,分页不裁剪接口能力。
|
|
130
|
+
|
|
141
131
|
```text
|
|
142
132
|
draftgo mcp setup [target...]
|
|
143
133
|
draftgo mcp status [target...]
|
|
@@ -148,31 +138,26 @@ draftgo api search <query>
|
|
|
148
138
|
draftgo api describe <operation_id>
|
|
149
139
|
draftgo api call <operation_id> --input <json-file>
|
|
150
140
|
draftgo delete <operation_id> [id] [--params JSON]
|
|
151
|
-
draftgo capabilities list [--module <name>] [--type <
|
|
141
|
+
draftgo capabilities list [--module <name>] [--type <module>] [--method <method>]
|
|
152
142
|
draftgo capabilities search <query> [--risk <level>] [--permission <permission>]
|
|
153
143
|
draftgo capabilities show <operation_id>
|
|
154
144
|
draftgo capabilities audit --output json
|
|
155
145
|
```
|
|
156
146
|
|
|
157
|
-
`
|
|
147
|
+
`capabilities --type` 是 `--module` 的简写,用于 Registry module 筛选;它不表示 organization、space、scope 或 `resource_type`。
|
|
148
|
+
|
|
149
|
+
`api call` 对已缓存 operation 直接调用并携带 `registry_revision`。服务端返回 `CONTRACT_CHANGED` 时重新 describe;只读或 operation 契约未变化时最多重试一次,危险 operation 自身契约变化时阻断调用并提示升级 CLI 后重新确认。调用输入必须是 UTF-8 JSON object;输出包含 HTTP status、服务端 code 和 request ID。System MCP 是动态 API 的唯一契约来源,CLI 不固化业务 URL 或请求结构。
|
|
158
150
|
|
|
159
|
-
|
|
151
|
+
RBAC 与 API Key 快捷命令:
|
|
160
152
|
|
|
161
153
|
```bash
|
|
162
154
|
draftgo role list
|
|
163
|
-
draftgo space list
|
|
164
|
-
draftgo space members list --input request.json
|
|
165
155
|
draftgo group members add --input request.json
|
|
166
|
-
draftgo grant create --input request.json
|
|
167
156
|
draftgo api-key status
|
|
168
157
|
draftgo api-key rotate
|
|
169
|
-
draftgo data-range list
|
|
170
158
|
```
|
|
171
159
|
|
|
172
|
-
`role`
|
|
173
|
-
只在该范围内应用 `none`、`owner` 或 `all` 记录策略。交互式 CLI、MCP 和普通 HTTP API 均使用当前用户的
|
|
174
|
-
API Key,并始终按该用户的 AccessGrant 授权;API Key 不能创建或伪造服务身份。CI、定时任务和共享服务等
|
|
175
|
-
无人值守自动化由运行时使用 system 身份;定时和事件处理器没有调用者,必须在代码中显式使用 `ctx.Admin.*`,不创建服务主体 AccessGrant,也不复用个人 API Key。
|
|
160
|
+
`role` 管理 Role 权限模板,`group` 管理用户组及其角色。交互式 CLI、MCP 和普通 HTTP API 均使用当前用户的 API Key,并按同一基础 RBAC 与业务守卫授权;API Key 不能创建或伪造服务身份。未知能力始终通过 `api search/describe/call` 使用实时 Registry,不依赖固化权限表。
|
|
176
161
|
|
|
177
162
|
### 交付与记录
|
|
178
163
|
|
|
@@ -182,6 +167,7 @@ draftgo auto-push [<type> <id...>]
|
|
|
182
167
|
draftgo work start <item>
|
|
183
168
|
draftgo work add <item>
|
|
184
169
|
draftgo work start-item <number|date#number>
|
|
170
|
+
draftgo work wait <number|date#number> [--note <reason>]
|
|
185
171
|
draftgo work complete <number|date#number> [--note <evidence>]
|
|
186
172
|
draftgo work show|list
|
|
187
173
|
draftgo clean [--dry-run|--yes]
|
|
@@ -204,7 +190,7 @@ draftgo clean [--dry-run|--yes]
|
|
|
204
190
|
// draftgo verify、commit 已通过
|
|
205
191
|
```
|
|
206
192
|
|
|
207
|
-
|
|
193
|
+
`●` 表示进行中,`?` 表示待确认,`√` 表示已完成。旧空标记仍可读取,对外显示待确认;不自动重写历史。`work add` 新增待确认事项,`work wait` 暂停事项,`work start-item` 恢复。任务相关的验证、冲突或交付失败不能标记完成。
|
|
208
194
|
|
|
209
195
|
## 运行时目录
|
|
210
196
|
|
|
@@ -223,7 +209,7 @@ draftgo clean [--dry-run|--yes]
|
|
|
223
209
|
|
|
224
210
|
## Skill 与 Reference
|
|
225
211
|
|
|
226
|
-
Skill 只放稳定的领域知识、项目边界和操作规则;动态 operation schema 由 MCP 提供并缓存在项目运行时。Reference
|
|
212
|
+
Skill 只放稳定的领域知识、项目边界和操作规则;动态 operation schema 由 MCP 提供并缓存在项目运行时。Reference 不拆成更小文件,保留按任务路由、前端运行时、安全、checkout 和 MCP 契约所需的完整上下文,避免过度拆分损失效果。
|
|
227
213
|
|
|
228
214
|
支持的 Skill target 包括 Claude Code、Cursor、Windsurf、Antigravity、Kiro、GitHub Copilot、Codex CLI、Gemini CLI 和 Pi。Pi 的项目级 Skill 安装到 `.agents/skills/draftgo/`,可被 Pi 按 Agent Skills 标准自动发现。
|
|
229
215
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "draftgo-cli",
|
|
3
|
-
"version": "4.0.
|
|
3
|
+
"version": "4.0.26",
|
|
4
4
|
"description": "Install and manage the DraftGo skill across AI coding agents (Claude Code, Codex, Cursor, Windsurf, Antigravity, Copilot, Gemini, Kiro, Pi).",
|
|
5
5
|
"bin": {
|
|
6
6
|
"draftgo": "bin/draftgo.js"
|
|
@@ -45,16 +45,14 @@
|
|
|
45
45
|
"scripts": {
|
|
46
46
|
"lint": "node scripts/check-syntax.js",
|
|
47
47
|
"validate:skill": "node scripts/validate-skill.js",
|
|
48
|
-
"sync:custom-service-sdk": "node scripts/sync-custom-service-sdk.js",
|
|
49
48
|
"build:release": "node scripts/build-release.js",
|
|
50
49
|
"verify:package": "node scripts/verify-package.js",
|
|
51
|
-
"test": "npm run lint && npm run validate:skill && npm run verify:package && npm run test:unit && npm run test:components && npm run test:capabilities && npm run test:
|
|
50
|
+
"test": "npm run lint && npm run validate:skill && npm run verify:package && npm run test:unit && npm run test:components && npm run test:capabilities && npm run test:worklog && npm run test:mcp && npm run test:worktree && npm run test:integration && npm run test:local && npm run test:e2e",
|
|
52
51
|
"test:unit": "node tests/unit.js",
|
|
53
52
|
"test:components": "node --test tests/components.test.js",
|
|
54
53
|
"test:capabilities": "node --test tests/capabilities.test.js",
|
|
55
|
-
"test:workflow": "node tests/workflow.test.js",
|
|
56
54
|
"test:worklog": "node tests/worklog.test.js",
|
|
57
|
-
"test:mcp": "node tests/mcp.test.js",
|
|
55
|
+
"test:mcp": "node --test tests/mcp.test.js",
|
|
58
56
|
"test:worktree": "node tests/worktree.test.js",
|
|
59
57
|
"test:integration": "node tests/integration.test.js",
|
|
60
58
|
"test:local": "node tests/local-runtime.js",
|
package/resources/skill/SKILL.md
CHANGED
|
@@ -9,7 +9,7 @@ description: Use this skill to inspect, develop, debug, or deliver a DraftGo app
|
|
|
9
9
|
|
|
10
10
|
- 任务开始即运行 `draftgo work start "<事项>"`;记录 CLI 返回的工作项引用。独立事项用 `draftgo work add`,仅在验证和交付成功后运行 `draftgo work complete <ref> --note "<证据>"`。
|
|
11
11
|
- 根 Skill 会在触发时自动加载;先读取下表中最少必要的 Reference,再用 MCP 查询当前项目。不要预先读取所有 Reference,也不要把动态 operation schema 写入 Skill 或聊天上下文。
|
|
12
|
-
- pages、navigations
|
|
12
|
+
- pages、navigations 与 docs/articles 的完整正文只能通过 `draftgo checkout`、worktree、`draftgo diff`、`draftgo verify` 和 `draftgo commit` 处理;MCP 只用于定位、元数据和结构化资源。不要把完整正文或响应快照写入聊天上下文或手工归档。
|
|
13
13
|
- 已知页面 route 或标题时,用 `draftgo map --type pages --route <path>` 或 `--title <title>` 精确定位;两个筛选条件取交集。只需范围或状态时加 `--summary`;需要浏览时使用 `--limit`(默认 20)和后续 `--cursor`,绝不默认全量枚举。
|
|
14
14
|
- `--output json` 的 stdout 是单一 UTF-8 JSON;诊断和进度走 stderr。不要依赖终端截断来控制上下文。
|
|
15
15
|
- 正常交付只运行 `draftgo verify`。默认跳过 UI;只有用户明确要求视觉验收时才使用截图,要求交互或 DOM 验证时才使用 `--ui always`。
|
|
@@ -18,13 +18,17 @@ description: Use this skill to inspect, develop, debug, or deliver a DraftGo app
|
|
|
18
18
|
|
|
19
19
|
## 任务路由
|
|
20
20
|
|
|
21
|
+
需求理解和编排由宿主 Agent 完成,CLI 不提供 build/run/deliver Agent。简单修改直接处理;跨页面与数据任务先确定字段、关系和接口,再实现页面,只读取涉及资源。需要用户决定时执行 `draftgo work wait <ref> --note "<原因>"`,继续时用 `work start-item`。
|
|
22
|
+
|
|
23
|
+
能力搜索默认 20 条,保留 `next_cursor`,结果不足时继续 `--cursor`;`api search` 支持 `--module`、`--method`。摘要仅用于定位,精确 operation 的完整 schema 和完整正文按需读取。不把全量 audit 作为每次任务的起点。
|
|
24
|
+
|
|
21
25
|
| 任务 | 先读 |
|
|
22
26
|
|---|---|
|
|
23
27
|
| 页面、导航、交互或 UI | `references/frontend.md`;涉及 iframe、路由、认证或全局层加读 `runtime.md` / `app-api.md` |
|
|
24
28
|
| pages/nav/docs 正文、版本或冲突 | `references/checkout.md` |
|
|
25
29
|
| 动态 DB、筛选或关系 | `references/data.md`;复杂关系再读 `db-relations.md` |
|
|
26
|
-
|
|
|
27
|
-
|
|
|
30
|
+
| 模型、提示词、插件、知识库、记忆、智能体或 AI 页面调用 | `references/ai.md`;页面调用再读 `chat-sdk.md` |
|
|
31
|
+
| 角色、用户组、API Key 或其他结构化管理能力 | `references/mcp.md`;业务细节以实时 operation 为准 |
|
|
28
32
|
| MCP 配置、API 契约或故障 | `references/mcp.md`;连接或调用失败时运行 `draftgo mcp test` |
|
|
29
33
|
| 运行失败、日志或请求链路 | `references/diagnostics.md` |
|
|
30
34
|
| 验证、发布或交付验收 | `references/delivery.md` |
|
|
@@ -47,9 +51,9 @@ description: Use this skill to inspect, develop, debug, or deliver a DraftGo app
|
|
|
47
51
|
- 同一文件或 DraftGo 资源全程只能由一个 Agent 修改;不同资源、operation 和 owner 不冲突的单元可以并发,不设置客户端并发上限;同一资源的依赖步骤保持串行。主 Agent 负责 owner 分配、汇总、验证、交付和 worklog 状态。
|
|
48
52
|
- 用户 API Key 只保存在 `.draftgo/config.json`,不得进入宿主配置、命令参数、Skill、日志、manifest 或错误消息。宿主 MCP 配置只运行 `draftgo mcp serve`。
|
|
49
53
|
- 页面优先使用可信本地资源;禁止境外 CDN。净化不可信 HTML,关键状态不能只靠颜色或动效表达。页面通过 `window.parent.App` 使用认证、权限、反馈和主题;详细规则见前端与运行时 Reference。
|
|
50
|
-
-
|
|
54
|
+
- API Key 始终代表真实用户;CLI 不创建服务身份,不注入额外授权上下文,也不把 session token 用于 System MCP。未知权限和业务守卫以实时 describe 与服务端响应为准。
|
|
51
55
|
- `.draftgo/tmp/` 可清理;先运行 `draftgo clean --dry-run`,再在需要时使用 `--yes`。用户可查验的证据放入已注册的 `.draftgo/artifacts/`。
|
|
52
56
|
|
|
53
57
|
## 完成条件
|
|
54
58
|
|
|
55
|
-
每个目标均有与其类型相符的证据:正文有 checkout、验证、commit 返回的版本/哈希及必要远端回读;结构化资源有 describe
|
|
59
|
+
每个目标均有与其类型相符的证据:正文有 checkout、验证、commit 返回的版本/哈希及必要远端回读;结构化资源有 describe、写入结果和回读。任何验证失败、409/412 或交付失败都不得标记为完成;任何 verify、写入、回读或要求的视觉验收失败时,工作项保持 active。
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"schema_version": "1.0",
|
|
3
3
|
"id": "draftgo",
|
|
4
4
|
"name": "DraftGo 开发助手",
|
|
5
|
-
"version": "4.0.
|
|
5
|
+
"version": "4.0.26",
|
|
6
6
|
"entry": "SKILL.md",
|
|
7
7
|
"description": "以 Skill/reference 任务路由、MCP 实时发现、长正文 checkout/commit、统一验证和完成日志为边界的 DraftGo 工作流。",
|
|
8
8
|
"license": "MIT",
|
|
@@ -10,9 +10,8 @@
|
|
|
10
10
|
"draftgo-development",
|
|
11
11
|
"reference-routing",
|
|
12
12
|
"worklog-tracking",
|
|
13
|
-
"custom-service-ai-sdk",
|
|
14
13
|
"minimal-method-guides",
|
|
15
|
-
"
|
|
14
|
+
"ai-knowledge-memory",
|
|
16
15
|
"mcp-bridge",
|
|
17
16
|
"content-checkout-commit",
|
|
18
17
|
"runtime-diagnostics",
|
|
@@ -22,8 +21,6 @@
|
|
|
22
21
|
"skill-installation"
|
|
23
22
|
],
|
|
24
23
|
"permissions": [
|
|
25
|
-
"workspace:read",
|
|
26
|
-
"workspace:write",
|
|
27
24
|
"process:run",
|
|
28
25
|
"network:explicit"
|
|
29
26
|
],
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
---
|
|
2
|
+
read_when: 管理模型、提示词、插件、知识库、记忆或智能体时 · 调试 AI 调用与运行记录时
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# DraftGo AI 能力
|
|
6
|
+
|
|
7
|
+
## 模块边界
|
|
8
|
+
|
|
9
|
+
最终版 AI 板块由模型、提示词、插件、知识库、长期记忆和智能体组成。它们都是结构化远端资源,使用实时 Registry Operation 管理,不 checkout、不生成本地镜像,也不通过动态 DB 重建。
|
|
10
|
+
|
|
11
|
+
- 模型负责 Provider、逻辑模型、路由和统一调用网关。
|
|
12
|
+
- 提示词负责版本化内容和发布状态。
|
|
13
|
+
- 插件负责 Skill 与外部 MCP 扩展。
|
|
14
|
+
- 知识库负责资料导入、切分、索引、检索和重建。
|
|
15
|
+
- 长期记忆负责智能体运行过程中提炼和召回的记忆。
|
|
16
|
+
- 智能体组合模型、提示词、插件、知识库与记忆。
|
|
17
|
+
|
|
18
|
+
模块之间通过明确 ID 和服务端规则组合。不要在客户端复制模型路由、插件执行、知识检索、记忆写入或智能体编排逻辑。
|
|
19
|
+
|
|
20
|
+
## 最短流程
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
draftgo api search "<model|prompt|plugin|knowledge|memory|agent>"
|
|
24
|
+
draftgo api describe <operation_id>
|
|
25
|
+
draftgo api call <operation_id> --input request.json --output json
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
已有精确 `operation_id` 时跳过 search。首次使用或 Registry revision 变化时 describe;输入只包含 `input_schema` 声明的 `path`、`query` 和 `body`。写入后使用对应 get/list Operation 回读目标 ID;任务涉及运行行为时,再调用运行 Operation 并按 run ID 或 request ID 查询日志。
|
|
29
|
+
|
|
30
|
+
## 开发规则
|
|
31
|
+
|
|
32
|
+
- Provider 密钥、上游 Authorization、API Key 和原始敏感响应不得进入 Skill、请求示例、日志或项目文件。
|
|
33
|
+
- 权限、风险、幂等性、能力名和状态枚举全部以实时 describe 为准,不使用历史权限前缀或字段表。
|
|
34
|
+
- 模型是否支持 Chat、Responses、Embedding、Rerank、TTS、ASR、图片或视频,必须由当前模型声明、Provider readiness 和有效路由共同证明。
|
|
35
|
+
- 知识库和长期记忆用途不同,不能互相替代;索引完成不等于检索质量达标。
|
|
36
|
+
- 智能体调用失败时分层检查模型路由、提示词版本、插件可用性、知识检索、记忆配置和运行日志,不在客户端自动重放非幂等调用。
|
|
37
|
+
- DraftGo Page 的 AI 对话使用组件目录中的 `draftgo/chat`;完整 Chat 实现由组件 `Definition.JS` 随同一 revision 发布并按需解析,不存在第二套静态 SDK。其他模型能力(包括图片、Embedding、Rerank、TTS、ASR 和 Video)通过服务端 AI Registry 调用。浏览器端不得持有 Provider 密钥,也不要复制一套客户端 Provider SDK。
|
|
38
|
+
|
|
39
|
+
## 完成条件
|
|
40
|
+
|
|
41
|
+
结构化配置任务必须有 describe、写入结果和回读证据。调用任务还必须证明运行成功,并能通过 run ID 或 request ID 关联日志;知识任务需要最小检索验证;任何输出均不得泄露凭据。
|
|
@@ -67,57 +67,12 @@ const { patientId, visitId } = routeContext.query;
|
|
|
67
67
|
|---|---|---|
|
|
68
68
|
| `App.currentUser` | object \| null | 当前用户,未登录为 null |
|
|
69
69
|
| `App.isAdmin` | boolean | 是否管理员 |
|
|
70
|
-
| `App.permissions` | string[] |
|
|
70
|
+
| `App.permissions` | string[] | 当前用户有效权限的展示投影;仅用于页面显隐,不替代服务端授权 |
|
|
71
71
|
| `App.isAuthenticated` | boolean | 是否已认证 |
|
|
72
72
|
| `App.hasToken` | boolean | 是否有 token(含未验证) |
|
|
73
73
|
| `App.config` | object | 系统配置 KV |
|
|
74
74
|
| `App.theme` | `'light'` \| `'dark'` | 当前显示模式 |
|
|
75
75
|
| `App.colorScheme` | string | 当前配色方案 |
|
|
76
|
-
| `App.scopeContext` | object | null | 当前候选范围;`scope_type` 为 `platform` / `space` |
|
|
77
|
-
| `App.availableSpaces` | object[] | 当前用户可选择的工作区与递归空间 |
|
|
78
|
-
|
|
79
|
-
### 空间上下文
|
|
80
|
-
|
|
81
|
-
空间业务请求使用运行时当前上下文。页面先显示加载状态,再等待有效空间;返回 `null` 时呈现紧凑的工作空间状态和重试入口,本轮不发送业务请求。
|
|
82
|
-
|
|
83
|
-
```javascript
|
|
84
|
-
function currentSpace() {
|
|
85
|
-
const scope = App.getScopeContext?.() || App.scopeContext;
|
|
86
|
-
return scope?.scope_type === 'space' && scope.space_id ? scope : null;
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
async function waitForSpace(timeout = 4000) {
|
|
90
|
-
if (currentSpace()) return currentSpace();
|
|
91
|
-
return new Promise(resolve => {
|
|
92
|
-
const host = window.parent;
|
|
93
|
-
const done = value => {
|
|
94
|
-
clearTimeout(timer);
|
|
95
|
-
host?.removeEventListener('dg:scope-changed', check);
|
|
96
|
-
host?.removeEventListener('dg:scope-spaces-changed', check);
|
|
97
|
-
resolve(value);
|
|
98
|
-
};
|
|
99
|
-
const check = () => { if (currentSpace()) done(currentSpace()); };
|
|
100
|
-
const timer = setTimeout(() => done(null), timeout);
|
|
101
|
-
host?.addEventListener('dg:scope-changed', check);
|
|
102
|
-
host?.addEventListener('dg:scope-spaces-changed', check);
|
|
103
|
-
check();
|
|
104
|
-
});
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
const scope = await waitForSpace();
|
|
108
|
-
if (!scope) {
|
|
109
|
-
renderWorkspaceState();
|
|
110
|
-
return;
|
|
111
|
-
}
|
|
112
|
-
await App.get('business-items', { page: 1 });
|
|
113
|
-
```
|
|
114
|
-
|
|
115
|
-
平台管理接口按接口契约显式传入平台范围:
|
|
116
|
-
|
|
117
|
-
```javascript
|
|
118
|
-
const platformHeaders = { 'X-DraftGo-Scope-Type': 'platform' };
|
|
119
|
-
await App.get('roles', {}, platformHeaders);
|
|
120
|
-
```
|
|
121
76
|
|
|
122
77
|
## 主题
|
|
123
78
|
|
|
@@ -135,11 +90,8 @@ await App.logout(); // 服务端登出、清理状态并跳转
|
|
|
135
90
|
App.setAuthTokens({ access_token, refresh_token }); // 登录后写入 token
|
|
136
91
|
App.reloadGlobalLayer(); // 重载全局层
|
|
137
92
|
App.openGlobalWidget(name); // 触发全局挂件打开
|
|
138
|
-
App.getScopeContext(); // 读取当前作用域
|
|
139
|
-
App.setScopeContext({ scope_type: 'space', space_id: '120' });
|
|
140
|
-
App.clearScopeContext(); // 清除手工选择,恢复服务端默认
|
|
141
93
|
App.t(key, fallback?, values?); // 页面级国际化文本,values 保留 ICU 占位符
|
|
142
94
|
App.formatDateTime(value, options?); // 按 system_timezone 格式化 API 返回的 UTC 时间
|
|
143
95
|
```
|
|
144
96
|
|
|
145
|
-
Token、刷新、路由上下文和认证事件见 `references/runtime.md`。AI
|
|
97
|
+
Token、刷新、路由上下文和认证事件见 `references/runtime.md`。AI 对话组件契约见 `references/chat-sdk.md`,其他 AI 能力见 `references/ai.md`。Chat 与其他 DraftGo 组件使用同一组件库交付,不存在独立 SDK 静态文件。
|
|
@@ -40,7 +40,7 @@ DraftGo **不是传统 SPA**,是「数据库驱动的页面资产运行时」
|
|
|
40
40
|
|---|---|
|
|
41
41
|
| 后端 | Go 1.26 · 标准库 `net/http` · `database/sql`(go-sql-driver/mysql)· MySQL · Redis |
|
|
42
42
|
| 壳层前端 | React · Vite |
|
|
43
|
-
| 数据库页面 | HTML 文档运行时 · Tailwind CSS 4 ·
|
|
43
|
+
| 数据库页面 | HTML 文档运行时 · Tailwind CSS 4 · DraftGo 内置组件库 · Font Awesome · GSAP · 内置 SVG 与 Provider 图标 |
|
|
44
44
|
| CLI | Node.js(draftgo-cli) |
|
|
45
45
|
|
|
46
46
|
数据库页面以完整 HTML 文档运行,直接加载平台提供的本地资源;壳层源码按 React + Vite 工程构建。开发时按目标所属层使用上表对应技术栈。
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
---
|
|
2
|
-
read_when:
|
|
2
|
+
read_when: DraftGo Page 需要 AI 对话组件时 · 开发或扩展 draftgo/chat 时
|
|
3
3
|
---
|
|
4
4
|
|
|
5
|
-
# DraftGo Chat
|
|
5
|
+
# DraftGo Chat 组件
|
|
6
6
|
|
|
7
|
-
DraftGo
|
|
7
|
+
DraftGo Page 统一使用组件目录中的 `draftgo/chat`。完整实现保存在组件 `Definition.JS`,负责原生 `<dg-chat>`、消息状态机、流解析、停止、重试和历史逻辑,并与 HTML、CSS、Props 和事件使用同一草稿与发布版本。Page 不复制实现,也不手写流式请求。
|
|
8
8
|
|
|
9
9
|
## 目录
|
|
10
10
|
|
|
@@ -16,40 +16,32 @@ DraftGo 页面使用完整版 `/assets/draftgo-chat.js` 原生 Web Component。S
|
|
|
16
16
|
- [扩展](#扩展)
|
|
17
17
|
- [鉴权与安全](#鉴权与安全)
|
|
18
18
|
|
|
19
|
-
## 最小接入
|
|
19
|
+
## DraftGo Page 最小接入
|
|
20
20
|
|
|
21
|
-
|
|
21
|
+
先从当前实例读取组件契约,不按本文猜测 Props:
|
|
22
22
|
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
<dg-chat protocol="draftgo-agent" agent-id="AGENT_ID"></dg-chat>
|
|
23
|
+
```text
|
|
24
|
+
draftgo components show draftgo/chat --output json
|
|
26
25
|
```
|
|
27
26
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
需要 JavaScript 配置时:
|
|
27
|
+
在 Page 中保存组件活引用;运行时仅在实际引用时返回完整组件,同页相同 revision 与 hash 只编译一次:
|
|
31
28
|
|
|
32
29
|
```html
|
|
33
|
-
<
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
stream: true,
|
|
42
|
-
features: {
|
|
43
|
-
attachments: true,
|
|
44
|
-
reasoning: true,
|
|
45
|
-
history: true,
|
|
46
|
-
artifacts: true
|
|
47
|
-
}
|
|
48
|
-
});
|
|
49
|
-
</script>
|
|
30
|
+
<dg-chat
|
|
31
|
+
data-dg-use="draftgo/chat"
|
|
32
|
+
data-dg-instance="page-assistant"
|
|
33
|
+
data-dg-prop-agent-id="AGENT_ID"
|
|
34
|
+
data-dg-prop-view="conversation"
|
|
35
|
+
data-dg-prop-surface="inline"
|
|
36
|
+
data-dg-prop-enable-attachments="true">
|
|
37
|
+
</dg-chat>
|
|
50
38
|
```
|
|
51
39
|
|
|
52
|
-
|
|
40
|
+
`draftgo-agent` 默认请求 `/api/agents/{id}/chat`,并复用同源 DraftGo App 的 Bearer token 与刷新机制。
|
|
41
|
+
|
|
42
|
+
`draftgo/chat` 公开 Agent、视图、surface、主题、语言、附件、历史、流式开关、打开状态和超时等稳定 Props,并透传已声明的 `dg-chat:*` 事件。函数、DOM Node、自定义 transport、renderer 和 plugin 不进入 `data-dg-prop-*`。
|
|
43
|
+
|
|
44
|
+
DraftGo 不维护独立 Chat SDK 静态文件或外部应用直连交付路径。无 UI 的文本、图片或其他模型能力调用统一使用服务端 AI Registry operation;这样可保持 Provider 密钥、路由和用量控制在服务端。
|
|
53
45
|
|
|
54
46
|
## 协议
|
|
55
47
|
|
|
@@ -71,11 +63,11 @@ DraftGo 页面使用完整版 `/assets/draftgo-chat.js` 原生 Web Component。S
|
|
|
71
63
|
|
|
72
64
|
这些 `/api/ai-proxy/*` 是接入方实现的占位路由,不是 DraftGo 自动提供的默认代理。不要将供应商密钥或长期 token 写入页面。
|
|
73
65
|
|
|
74
|
-
内置 transport 支持 SSE、NDJSON 和普通 JSON,并把上游响应归一化为 `text.delta`、`reasoning.delta`、`tool.start`、`tool.delta`、`tool.finish`、`step.finish`、`artifact.complete`、`source`、`usage`、`message.finish`、`error`
|
|
66
|
+
内置 transport 支持 SSE、NDJSON 和普通 JSON,并把上游响应归一化为 `text.delta`、`reasoning.delta`、`tool.start`、`tool.delta`、`tool.finish`、`step.finish`、`artifact.complete`、`source`、`usage`、`message.finish`、`error` 等事件。DraftGo Page 只使用实时 `draftgo/chat` 组件契约,不要猜测字段或把函数、DOM、renderer、plugin、transport 写入 Props。
|
|
75
67
|
|
|
76
|
-
##
|
|
68
|
+
## 组件配置与布局
|
|
77
69
|
|
|
78
|
-
|
|
70
|
+
以下直接属性与 JSON 配置用于组件库高级扩展;普通 DraftGo Page 以实时 `draftgo/chat` Props 为准。
|
|
79
71
|
|
|
80
72
|
```html
|
|
81
73
|
<dg-chat
|
|
@@ -97,7 +89,7 @@ DraftGo 页面使用完整版 `/assets/draftgo-chat.js` 原生 Web Component。S
|
|
|
97
89
|
| 配置 | 可选值 |
|
|
98
90
|
|---|---|
|
|
99
91
|
| `surface` | `inline`、`floating`、`drawer`、`fullscreen` |
|
|
100
|
-
| `view` | `conversation`、`threads`、`compact`、`
|
|
92
|
+
| `view` | `conversation`、`threads`、`compact`、`canvas` |
|
|
101
93
|
| `position` | `left`、`right` |
|
|
102
94
|
| `theme` | `light`、`dark`;省略时跟随系统 |
|
|
103
95
|
|
|
@@ -109,7 +101,7 @@ DraftGo 页面使用完整版 `/assets/draftgo-chat.js` 原生 Web Component。S
|
|
|
109
101
|
"protocol": "draftgo-agent",
|
|
110
102
|
"agentId": "AGENT_ID",
|
|
111
103
|
"surface": "inline",
|
|
112
|
-
"view": "
|
|
104
|
+
"view": "canvas",
|
|
113
105
|
"storageKey": "dg-chat:PAGE_KEY:INSTANCE_KEY",
|
|
114
106
|
"features": {
|
|
115
107
|
"reasoning": true,
|
|
@@ -148,7 +140,7 @@ chat.close();
|
|
|
148
140
|
chat.toggle();
|
|
149
141
|
```
|
|
150
142
|
|
|
151
|
-
|
|
143
|
+
组件内部运行时保留 `DraftGoChat.create()`、`registerTransport()`、`registerRenderer()`、`registerComponent()`、`definePreset()`、`use()` 等扩展接口,但它们不是独立静态 SDK 契约。
|
|
152
144
|
|
|
153
145
|
常用事件:`dg-chat:ready`、`dg-chat:before-send`、`dg-chat:message`、`dg-chat:run-start`、`dg-chat:stream-event`、`dg-chat:run-finish`、`dg-chat:run-abort`、`dg-chat:error`、`dg-chat:message-action`、`dg-chat:session-change`、`dg-chat:model-change`、`dg-chat:open`、`dg-chat:close`。
|
|
154
146
|
|
|
@@ -204,10 +196,10 @@ chat.configure({ protocol: 'page-protocol' });
|
|
|
204
196
|
- 后端始终负责 Agent 调用权限、模型白名单、附件能力和大小限制,前端开关不能越权。
|
|
205
197
|
- Agent 协议响应不应包含 Agent 内部模型名。模型选择器只能读取 Agent 明确授权的 `/selectable-models` 目录。
|
|
206
198
|
|
|
207
|
-
|
|
199
|
+
交付前确认:DraftGo Page 使用 `draftgo/chat` 且不手工加载第二套脚本;同页多实例隔离 `storageKey`;外部协议走服务端代理;页面离开时停止在途请求。
|
|
208
200
|
|
|
209
201
|
## 移动端契约
|
|
210
202
|
|
|
211
|
-
- `inline`、`floating`、`drawer`、`fullscreen` 四种 surface 均由 SDK 自适应窄屏;`threads`、`
|
|
203
|
+
- `inline`、`floating`、`drawer`、`fullscreen` 四种 surface 均由 SDK 自适应窄屏;`threads`、`canvas` 和 Artifact 会按容器宽度自动收敛为单栏,不要复制 Shadow DOM 内部布局规则。
|
|
212
204
|
- SDK 使用 `VisualViewport` 和 `safe-area-inset-*` 跟随软键盘、浏览器工具栏与横竖屏变化。触摸设备打开面板时不会主动弹出软键盘。
|
|
213
205
|
- 触摸端按钮和行操作具有移动端点击尺寸,输入字号防止 iOS 自动缩放;所有内部滚动区隐藏滚动条,但仍保留触摸、滚轮和键盘滚动能力。
|
|
@@ -16,9 +16,9 @@ draftgo commit pages 42
|
|
|
16
16
|
|
|
17
17
|
导航和文档分别替换为 `nav`、`docs`。route/title 为精确匹配,两个条件取交集;只需确认范围或 checkout 状态时使用 `map --summary`,必须浏览时使用 `--limit <1-100>`(默认 20),并仅在单一 `--type` 下用 `--cursor <opaque>` 翻页。新资源先用 `draftgo api search "create page"` 或对应内容类型定位创建 operation,describe/call 取得 ID 后再 checkout;不要用 checkout 创建资源。`verify` 通过不等于已交付,commit 返回新版本与哈希才算正文写入成功。发生 409/412 时保留冲突材料并停止提交。
|
|
18
18
|
|
|
19
|
-
## Workflow 2.0
|
|
19
|
+
## Workflow 2.0 coverage
|
|
20
20
|
|
|
21
|
-
The checkout set includes `pages`, `navigations`, `docs/articles
|
|
21
|
+
The checkout set includes `pages`, `navigations`, and `docs/articles`. DB Meta and all other structured resources remain live MCP/API resources and are never checked out.
|
|
22
22
|
|
|
23
23
|
`draftgo refresh <type> <id...>` is a safe checkout shortcut. It updates only a clean local worktree; local changes stop it. A successful commit keeps current local files and one base only. Cloud version storage is the sole history source.
|
|
24
24
|
|
|
@@ -34,7 +34,7 @@ The checkout set includes `pages`, `navigations`, `docs/articles`, and `custom_s
|
|
|
34
34
|
| `nav` / `navigation` / `navigations` | `navigations` | `.draftgo/worktree/navigations/` | `nav_` |
|
|
35
35
|
| `doc` / `docs` / `article(s)` / `docs/articles` | `docs` | `.draftgo/worktree/docs/` | `article_` |
|
|
36
36
|
|
|
37
|
-
db_meta、
|
|
37
|
+
db_meta、AI 配置、system_config、roles、users、doc_categories 和普通配置使用 MCP 实时 API,不 checkout。
|
|
38
38
|
|
|
39
39
|
Checkout 只为已存在且已确认 ID 的资源建立本地正文与 base,不创建页面、导航或文档。新增资源先按 MCP 实时 API 契约创建并取得 ID;需要编辑完整正文时再 checkout。只需元数据或正文片段即可完成判断时,不必 checkout。
|
|
40
40
|
|
|
@@ -44,7 +44,7 @@ Checkout 只为已存在且已确认 ID 的资源建立本地正文与 base,
|
|
|
44
44
|
draftgo checkout <pages|nav|docs> <id...>
|
|
45
45
|
draftgo commit <pages|nav|docs> <id...>
|
|
46
46
|
draftgo reconcile <pages|nav|docs> <id...>
|
|
47
|
-
draftgo diff <pages|nav|docs
|
|
47
|
+
draftgo diff <pages|nav|docs> <id> [--stat|--summary]
|
|
48
48
|
draftgo conflicts
|
|
49
49
|
draftgo conflict show <pages|nav|docs> <id>
|
|
50
50
|
draftgo conflict resolve <pages|nav|docs> <id>
|
|
@@ -61,43 +61,6 @@ draftgo api search "dynamic db record"
|
|
|
61
61
|
|
|
62
62
|
---
|
|
63
63
|
|
|
64
|
-
## 自定义服务内的 ctx.DB.Query
|
|
65
|
-
|
|
66
|
-
Go 自定义服务使用 `ctx.DB.Query(type, sdk.QueryOptions{...})` 操作动态 DB,返回 `sdk.QueryResult`:
|
|
67
|
-
|
|
68
|
-
```go
|
|
69
|
-
result, err := ctx.DB.Query("order", sdk.QueryOptions{
|
|
70
|
-
Filters: map[string]any{"status": "paid"},
|
|
71
|
-
Page: 1, PageSize: 20, OrderBy: "id", Order: "desc",
|
|
72
|
-
})
|
|
73
|
-
items := result.Items
|
|
74
|
-
```
|
|
75
|
-
|
|
76
|
-
| 参数 | 说明 |
|
|
77
|
-
|---|---|
|
|
78
|
-
| `filters` | 字典形式结构化过滤;默认 `{field: value}` 是 `eq` 精确匹配 |
|
|
79
|
-
| `Page` / `PageSize` | 分页参数;零值交由平台使用默认列表行为 |
|
|
80
|
-
| `order_by` / `order` | 按 searchable 字段排序,`order` 为 `asc` / `desc` |
|
|
81
|
-
|
|
82
|
-
⚠️ 返回结构为 `sdk.QueryResult{Items, Total, Page, PageSize}`。需要完整数据时必须按 `Total` 分页读取,不能用超大 `PageSize` 假装全量。
|
|
83
|
-
|
|
84
|
-
普通用户调用时只读 `status=1` 数据;系统身份/管理员脚本可读全部状态数据,但仍受 db_meta permission 约束。不要把“拿不到禁用数据”和分页截断混在一起排查。
|
|
85
|
-
|
|
86
|
-
`filters` 操作符示例:
|
|
87
|
-
|
|
88
|
-
```go
|
|
89
|
-
ctx.DB.Query("order", sdk.QueryOptions{Filters: map[string]any{
|
|
90
|
-
"status": "paid",
|
|
91
|
-
"customer_name": map[string]any{"op": "like", "value": "张"},
|
|
92
|
-
"amount": map[string]any{"op": "gte", "value": 100},
|
|
93
|
-
"id": map[string]any{"op": "in", "value": []int{1, 2, 3}},
|
|
94
|
-
}})
|
|
95
|
-
```
|
|
96
|
-
|
|
97
|
-
字段必须在 db_meta schema 中标记 `searchable`,系统字段 `id/userid/created_at/updated_at` 可直接检索和排序。`status` 若作为业务字段检索,仍需在 schema 中显式声明。
|
|
98
|
-
|
|
99
|
-
---
|
|
100
|
-
|
|
101
64
|
## 关联关系(ref)
|
|
102
65
|
|
|
103
66
|
关系只在需要时读取 `references/db-relations.md`。核心不变量:`many-to-one` 与 `many-to-many` 在真实持有引用 ID 的字段上配置 `ref` 和 `onDelete`;`one-to-many` 是用于 `populate` 的虚拟反向关系。级联继承当前用户权限并在同一事务中执行,不要在前端用多次 DELETE 模拟。
|
|
@@ -115,14 +78,6 @@ const res = await App.get(`db/order`, {
|
|
|
115
78
|
});
|
|
116
79
|
const { items, total } = res.data;
|
|
117
80
|
|
|
118
|
-
// 非后台管理页面读取业务列表时,如果当前用户含 admin 角色,带 scope=mine
|
|
119
|
-
// 这只影响 GET /api/db/{type} 列表,让管理员业务视角只看自己的 owner 数据
|
|
120
|
-
const ownOrders = await App.get(`db/order`, {
|
|
121
|
-
page: 1,
|
|
122
|
-
page_size: 20,
|
|
123
|
-
scope: 'mine',
|
|
124
|
-
});
|
|
125
|
-
|
|
126
81
|
// 系统字段检索和排序(无需在 schema 中定义)
|
|
127
82
|
const res = await App.get(`db/order`, {
|
|
128
83
|
filters: ['created_at:gte:2024-01-01', 'userid:eq:123'],
|
|
@@ -161,7 +116,6 @@ await App.patch(`db/order/batch`, [
|
|
|
161
116
|
- 多个 filters 为 AND
|
|
162
117
|
- 字段未标 searchable 或操作符不匹配 → 后端返回 400
|
|
163
118
|
- **系统字段**(`id` / `userid` / `created_at` / `updated_at`)无需在 schema 中声明,可直接使用
|
|
164
|
-
- `scope=mine` 只对拥有 admin 角色的用户在 `GET /api/db/{type}` 列表请求中生效;非后台管理页面若当前用户是管理员,读取动态 DB 业务列表时应带该参数;后台管理页不要带,详情和写操作也不要带
|
|
165
119
|
|
|
166
120
|
---
|
|
167
121
|
|