draftgo-cli 2.0.5 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +70 -15
- package/package.json +1 -1
- package/resources/skill/SKILL.md +74 -1333
- package/resources/skill/core/architecture.md +91 -0
- package/resources/skill/core/modules.md +54 -0
- package/resources/skill/practices/anti-patterns.md +70 -0
- package/resources/skill/practices/best-practices.md +41 -0
- package/resources/skill/practices/dev-declaration.md +94 -0
- package/resources/skill/push/SKILL.md +39 -5
- package/resources/skill/quickref/api-endpoints.md +130 -0
- package/resources/skill/quickref/api.json +17675 -0
- package/resources/skill/quickref/app-api.md +110 -0
- package/resources/skill/quickref/dg-components.md +198 -0
- package/resources/skill/rules/dev-workflow.md +70 -70
- package/resources/skill/rules/frontend.md +129 -594
- package/resources/skill/scripts/draftgo_delete.py +151 -0
- package/resources/skill/scripts/draftgo_pull.py +1 -1
- package/resources/skill/scripts/draftgo_push.py +165 -22
- package/resources/skill/specs/data.md +108 -0
- package/resources/skill/specs/runtime.md +98 -0
- package/resources/skill/specs/security.md +74 -0
- package/resources/skill/specs/ui-protocol.md +68 -0
- package/src/commands/check.js +1 -1
- package/src/commands/delete.js +86 -0
- package/src/commands/help.js +7 -0
- package/src/commands/map.js +37 -1
- package/src/commands/new.js +183 -0
- package/src/commands/sync.js +4 -1
- package/src/index.js +6 -0
- package/src/localdev/compose.js +19 -0
- package/src/projectMap.js +142 -2
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
---
|
|
2
|
+
read_when: 页面开发时需要查 App API · 忘记某个方法签名时
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# App 对象速查表
|
|
6
|
+
|
|
7
|
+
```javascript
|
|
8
|
+
const App = window.parent?.App;
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## 请求
|
|
12
|
+
|
|
13
|
+
| 方法 | 签名 | 说明 |
|
|
14
|
+
|---|---|---|
|
|
15
|
+
| `App.get` | `(path, params?)` | GET,params 为 query 参数 |
|
|
16
|
+
| `App.post` | `(path, body?)` | POST |
|
|
17
|
+
| `App.put` | `(path, body?)` | PUT |
|
|
18
|
+
| `App.patch` | `(path, body?)` | PATCH |
|
|
19
|
+
| `App.delete` | `(path)` | DELETE |
|
|
20
|
+
| `App.uploadFile` | `(file, onProgress?)` | 文件上传,返回标准信封 |
|
|
21
|
+
|
|
22
|
+
**响应格式**:`{ code: 200, data: <载荷>, message: "success" }`
|
|
23
|
+
**消费范式**:
|
|
24
|
+
```javascript
|
|
25
|
+
const res = await App.get('pages', { page: 1, page_size: 20 });
|
|
26
|
+
if (res.code !== 200) { App.showError(res.message); return; }
|
|
27
|
+
const items = res.data.items; // 分页列表
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## 反馈
|
|
31
|
+
|
|
32
|
+
| 方法 | 签名 | 说明 |
|
|
33
|
+
|---|---|---|
|
|
34
|
+
| `App.showSuccess` | `(msg)` | 成功 Toast 3s |
|
|
35
|
+
| `App.showError` | `(msg)` | 错误 Toast 4s |
|
|
36
|
+
| `App.showWarning` | `(msg)` | 警告 Toast 3s |
|
|
37
|
+
| `App.showInfo` | `(msg)` | 信息 Toast 3s |
|
|
38
|
+
| `App.toast` | `(msg, type?)` | 通用 Toast,type: success/error/warning/info |
|
|
39
|
+
| `App.confirm` | `(msg, title?)` | 确认弹窗,返回 `Promise<boolean>` |
|
|
40
|
+
| `App.showModal` | `(msg, title?)` | 信息模态框(替代 alert) |
|
|
41
|
+
| `App.showLoading` | `()` | 全局 loading 蒙层 |
|
|
42
|
+
| `App.hideLoading` | `()` | 关闭 loading |
|
|
43
|
+
|
|
44
|
+
## 路由
|
|
45
|
+
|
|
46
|
+
| 方法 | 说明 |
|
|
47
|
+
|---|---|
|
|
48
|
+
| `App.navigate(route)` | 路由跳转(pushState) |
|
|
49
|
+
| `App.getCurrentRoute()` | 当前路径字符串 |
|
|
50
|
+
| `App.getCurrentRouteContext()` | 完整路由上下文,含 `query` |
|
|
51
|
+
|
|
52
|
+
**读取 URL 参数**(必须用此方式,不能用 `window.location.search`):
|
|
53
|
+
```javascript
|
|
54
|
+
const routeContext =
|
|
55
|
+
window.__DG_ROUTE_CONTEXT__
|
|
56
|
+
|| window.__DG_GET_ROUTE_CONTEXT__?.()
|
|
57
|
+
|| window.parent?.App?.getCurrentRouteContext?.()
|
|
58
|
+
|| { query: {} };
|
|
59
|
+
const { patientId, visitId } = routeContext.query;
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## 状态
|
|
63
|
+
|
|
64
|
+
| 属性 | 类型 | 说明 |
|
|
65
|
+
|---|---|---|
|
|
66
|
+
| `App.currentUser` | object \| null | 当前用户,未登录为 null |
|
|
67
|
+
| `App.isAdmin` | boolean | 是否管理员 |
|
|
68
|
+
| `App.isAuthenticated` | boolean | 是否已认证 |
|
|
69
|
+
| `App.hasToken` | boolean | 是否有 token(含未验证) |
|
|
70
|
+
| `App.config` | object | 系统配置 KV |
|
|
71
|
+
| `App.theme` | `'light'` \| `'dark'` | 当前显示模式 |
|
|
72
|
+
| `App.colorScheme` | string | 当前配色方案 |
|
|
73
|
+
|
|
74
|
+
## 主题
|
|
75
|
+
|
|
76
|
+
```javascript
|
|
77
|
+
App.applyTheme('dark'); // 切换显示模式
|
|
78
|
+
App.setColorScheme('deep-blue-white'); // 切换预设配色
|
|
79
|
+
App.setColorScheme('custom', customVarsObject); // 自定义配色
|
|
80
|
+
App.getColorScheme(); // 获取方案详情
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## 外部 API
|
|
84
|
+
|
|
85
|
+
```javascript
|
|
86
|
+
App.listApis(); // 列出可调用 API(含 code/name/schema)
|
|
87
|
+
App.callApi('weather-now', {
|
|
88
|
+
path_params: { city: 'beijing' },
|
|
89
|
+
query_params: { unit: 'metric' },
|
|
90
|
+
// body: {...} // POST/PUT/PATCH 才生效
|
|
91
|
+
});
|
|
92
|
+
// 返回:{ status_code, headers, body, duration_ms, error }
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
## 其他
|
|
96
|
+
|
|
97
|
+
```javascript
|
|
98
|
+
App.logout(); // 登出并跳转登录页
|
|
99
|
+
App.setAuthTokens({ access_token, refresh_token }); // 登录后写入 token
|
|
100
|
+
App.reloadGlobalLayer(); // 重载全局层
|
|
101
|
+
App.openGlobalWidget(name); // 触发全局挂件打开
|
|
102
|
+
App.t(key, fallback?); // 国际化文本
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
## Token 存储
|
|
106
|
+
|
|
107
|
+
| key | 说明 |
|
|
108
|
+
|---|---|
|
|
109
|
+
| `localStorage.dg_access_token` | 访问 token |
|
|
110
|
+
| `localStorage.dg_refresh_token` | 刷新 token |
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
---
|
|
2
|
+
read_when: 页面开发时需要使用 dg-* 组件时 · 确认某组件属性/用法时
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# dg-* 组件速查卡
|
|
6
|
+
|
|
7
|
+
> `dg-*` = shadcn/ui 的 DraftGo HTML 协议表达。完整映射说明见 `{{SKILL_DIR}}/specs/ui-protocol.md`
|
|
8
|
+
|
|
9
|
+
## 基础组件
|
|
10
|
+
|
|
11
|
+
### dg-button
|
|
12
|
+
```html
|
|
13
|
+
<dg-button variant="default|destructive|outline|secondary|ghost|link"
|
|
14
|
+
size="default|sm|lg|icon"
|
|
15
|
+
disabled>
|
|
16
|
+
按钮文字
|
|
17
|
+
</dg-button>
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
### dg-card
|
|
21
|
+
```html
|
|
22
|
+
<dg-card>
|
|
23
|
+
<dg-card-header>
|
|
24
|
+
<dg-card-title>标题</dg-card-title>
|
|
25
|
+
<dg-card-description>描述</dg-card-description>
|
|
26
|
+
</dg-card-header>
|
|
27
|
+
<dg-card-content>内容</dg-card-content>
|
|
28
|
+
<dg-card-footer>底部</dg-card-footer>
|
|
29
|
+
</dg-card>
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### dg-badge
|
|
33
|
+
```html
|
|
34
|
+
<dg-badge variant="default|secondary|destructive|outline">标签</dg-badge>
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
### dg-skeleton
|
|
38
|
+
```html
|
|
39
|
+
<dg-skeleton style="width:200px;height:20px;"></dg-skeleton>
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## 表单组件
|
|
45
|
+
|
|
46
|
+
### dg-form
|
|
47
|
+
```html
|
|
48
|
+
<dg-form>
|
|
49
|
+
<dg-form-item label="字段名" required>
|
|
50
|
+
<dg-input name="field" placeholder="请输入" />
|
|
51
|
+
<dg-form-message></dg-form-message>
|
|
52
|
+
</dg-form-item>
|
|
53
|
+
<dg-button type="submit">提交</dg-button>
|
|
54
|
+
</dg-form>
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### dg-input / dg-textarea / dg-select
|
|
58
|
+
```html
|
|
59
|
+
<dg-input type="text|password|email|number" placeholder="" value="" disabled />
|
|
60
|
+
<dg-textarea placeholder="" rows="4" />
|
|
61
|
+
<dg-select value="" placeholder="请选择">
|
|
62
|
+
<dg-select-item value="a">选项 A</dg-select-item>
|
|
63
|
+
<dg-select-item value="b">选项 B</dg-select-item>
|
|
64
|
+
</dg-select>
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### dg-checkbox / dg-switch / dg-radio-group
|
|
68
|
+
```html
|
|
69
|
+
<dg-checkbox checked>同意条款</dg-checkbox>
|
|
70
|
+
<dg-switch checked />
|
|
71
|
+
<dg-radio-group value="a">
|
|
72
|
+
<dg-radio-item value="a">选项 A</dg-radio-item>
|
|
73
|
+
<dg-radio-item value="b">选项 B</dg-radio-item>
|
|
74
|
+
</dg-radio-group>
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
## 数据展示
|
|
80
|
+
|
|
81
|
+
### dg-table
|
|
82
|
+
```html
|
|
83
|
+
<dg-table source="db/order" data-dg-props='{"columns":[{"key":"name","title":"名称"},{"key":"status","title":"状态"}]}'></dg-table>
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### dg-tabs
|
|
87
|
+
```html
|
|
88
|
+
<dg-tabs default-value="tab1">
|
|
89
|
+
<dg-tabs-list>
|
|
90
|
+
<dg-tabs-trigger value="tab1">标签一</dg-tabs-trigger>
|
|
91
|
+
<dg-tabs-trigger value="tab2">标签二</dg-tabs-trigger>
|
|
92
|
+
</dg-tabs-list>
|
|
93
|
+
<dg-tabs-content value="tab1">内容一</dg-tabs-content>
|
|
94
|
+
<dg-tabs-content value="tab2">内容二</dg-tabs-content>
|
|
95
|
+
</dg-tabs>
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
## 覆盖层组件(trigger/content 协议)
|
|
101
|
+
|
|
102
|
+
### dg-dialog
|
|
103
|
+
```html
|
|
104
|
+
<dg-dialog>
|
|
105
|
+
<dg-dialog-trigger>
|
|
106
|
+
<dg-button>打开弹窗</dg-button>
|
|
107
|
+
</dg-dialog-trigger>
|
|
108
|
+
<dg-dialog-content>
|
|
109
|
+
<dg-dialog-header>
|
|
110
|
+
<dg-dialog-title>标题</dg-dialog-title>
|
|
111
|
+
</dg-dialog-header>
|
|
112
|
+
<p>内容</p>
|
|
113
|
+
<dg-dialog-footer>
|
|
114
|
+
<dg-button variant="outline" data-close-dialog>取消</dg-button>
|
|
115
|
+
<dg-button>确认</dg-button>
|
|
116
|
+
</dg-dialog-footer>
|
|
117
|
+
</dg-dialog-content>
|
|
118
|
+
</dg-dialog>
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### dg-sheet
|
|
122
|
+
```html
|
|
123
|
+
<dg-sheet side="right|left|top|bottom">
|
|
124
|
+
<dg-sheet-trigger><dg-button>打开</dg-button></dg-sheet-trigger>
|
|
125
|
+
<dg-sheet-content>
|
|
126
|
+
<dg-sheet-header><dg-sheet-title>标题</dg-sheet-title></dg-sheet-header>
|
|
127
|
+
<p>内容</p>
|
|
128
|
+
</dg-sheet-content>
|
|
129
|
+
</dg-sheet>
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### dg-dropdown-menu
|
|
133
|
+
```html
|
|
134
|
+
<dg-dropdown-menu>
|
|
135
|
+
<dg-dropdown-menu-trigger><dg-button variant="ghost">操作</dg-button></dg-dropdown-menu-trigger>
|
|
136
|
+
<dg-dropdown-menu-content>
|
|
137
|
+
<dg-dropdown-menu-item>编辑</dg-dropdown-menu-item>
|
|
138
|
+
<dg-dropdown-menu-separator />
|
|
139
|
+
<dg-dropdown-menu-item variant="destructive">删除</dg-dropdown-menu-item>
|
|
140
|
+
</dg-dropdown-menu-content>
|
|
141
|
+
</dg-dropdown-menu>
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
### dg-tooltip
|
|
145
|
+
```html
|
|
146
|
+
<dg-tooltip content="提示文字">
|
|
147
|
+
<dg-button variant="ghost" size="icon">?</dg-button>
|
|
148
|
+
</dg-tooltip>
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
### dg-popover
|
|
152
|
+
```html
|
|
153
|
+
<dg-popover>
|
|
154
|
+
<dg-popover-trigger><dg-button>打开</dg-button></dg-popover-trigger>
|
|
155
|
+
<dg-popover-content>内容</dg-popover-content>
|
|
156
|
+
</dg-popover>
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
---
|
|
160
|
+
|
|
161
|
+
## 布局组件
|
|
162
|
+
|
|
163
|
+
### dg-separator
|
|
164
|
+
```html
|
|
165
|
+
<dg-separator orientation="horizontal|vertical" />
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
### dg-scroll-area
|
|
169
|
+
```html
|
|
170
|
+
<dg-scroll-area style="height:400px;">
|
|
171
|
+
长内容...
|
|
172
|
+
</dg-scroll-area>
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
### dg-avatar
|
|
176
|
+
```html
|
|
177
|
+
<dg-avatar>
|
|
178
|
+
<dg-avatar-image src="/path/to/img.jpg" alt="用户名" />
|
|
179
|
+
<dg-avatar-fallback>UN</dg-avatar-fallback>
|
|
180
|
+
</dg-avatar>
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
---
|
|
184
|
+
|
|
185
|
+
## 状态 / 反馈
|
|
186
|
+
|
|
187
|
+
### dg-alert
|
|
188
|
+
```html
|
|
189
|
+
<dg-alert variant="default|destructive">
|
|
190
|
+
<dg-alert-title>标题</dg-alert-title>
|
|
191
|
+
<dg-alert-description>描述</dg-alert-description>
|
|
192
|
+
</dg-alert>
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
### dg-progress
|
|
196
|
+
```html
|
|
197
|
+
<dg-progress value="60" max="100" />
|
|
198
|
+
```
|
|
@@ -13,9 +13,9 @@ version: 1.0.0
|
|
|
13
13
|
## 总则:四档开发流程
|
|
14
14
|
|
|
15
15
|
```
|
|
16
|
-
小修 直接定位 → 改 →
|
|
17
|
-
轻功能 范围复述 → 直接做 →
|
|
18
|
-
标准功能 轻量确认 →
|
|
16
|
+
小修 直接定位 → 改 → 轻量证据
|
|
17
|
+
轻功能 范围复述 → 直接做 → 凭证据闭环
|
|
18
|
+
标准功能 轻量确认 → 内部短计划 → 执行闭环
|
|
19
19
|
高风险 完整 Story / 计划 / 验证 / 人工确认
|
|
20
20
|
```
|
|
21
21
|
|
|
@@ -27,26 +27,26 @@ version: 1.0.0
|
|
|
27
27
|
|
|
28
28
|
DraftGo-CLI 的目标不是只把页面写出来,而是让 AI 基于基座快速交付高质量项目:
|
|
29
29
|
|
|
30
|
-
-
|
|
31
|
-
-
|
|
30
|
+
- **开发的急速感**:优先用本地 index、目标文件、现有资源和最小必要规则快速建立上下文;资源关系不清时再用 `draftgo map`。小修和轻功能不要被表格化流程拖慢。
|
|
31
|
+
- **逻辑与实现的完整**:优先考虑真实落地闭环、高可用;默认真实数据、真实入口、真实反馈和必要证据。页面、导航、DB、脚本、权限和后台维护按用户路径闭环推断。
|
|
32
32
|
- **迭代性强**:文件命名、route、数据 schema、组件结构、changelog、Task/lessons 记录要让下一次 AI 或开发者能继续接手。
|
|
33
33
|
- **前端 UI 交给 shadcn 能力**:平台壳层默认 React + shadcn/ui + Tailwind;数据库 HTML 页面中的 `dg-*` 必须理解为 shadcn 的 DraftGo HTML 协议表达。若本地 Agent 环境存在 shadcn / 前端 UI 相关 Skills,前端界面开发时优先调用;DraftGo-CLI 提供运行时、资源、数据、路由、入口绑定和验证方法。
|
|
34
34
|
|
|
35
|
-
|
|
35
|
+
判断一版交付是否合格:用户路径、数据和操作能真实落地,后续继续改不用重猜结构。
|
|
36
36
|
|
|
37
37
|
---
|
|
38
38
|
|
|
39
|
-
##
|
|
39
|
+
## 真实落地默认原则(强制)
|
|
40
40
|
|
|
41
|
-
除非用户明确要求“静态 / 纯页面 / demo / mock / 假数据 / 伪功能 /
|
|
41
|
+
除非用户明确要求“静态 / 纯页面 / demo / mock / 假数据 / 伪功能 / 先看效果”,任何开发任务都优先考虑真实落地闭环、高可用。
|
|
42
42
|
|
|
43
43
|
- 不要把功能降级成只有前端展示的假页面;按钮、表单、搜索、筛选、分页、提交、保存、删除、发布、管理等交互默认要有真实效果。
|
|
44
44
|
- 不要用写死数组、静态卡片、空点击事件、只弹 toast 的按钮伪装业务能力;演示数据只能用于加载态、空态或用户明确要求的原型/demo。
|
|
45
|
-
- 如果需求涉及可维护内容或业务记录,优先判断是否可用 DraftGo 动态 DB、已有 db_meta、custom_scripts、外部 API 或 AIHub
|
|
45
|
+
- 如果需求涉及可维护内容或业务记录,优先判断是否可用 DraftGo 动态 DB、已有 db_meta、custom_scripts、外部 API 或 AIHub 资产完成真实数据闭环,并考虑后续维护、迭代和稳定性。
|
|
46
46
|
- **数据存储选型:业务数据优先用动态 DB 通用库。**
|
|
47
|
-
- 若平台能力、权限、外部依赖或通用动态 DB
|
|
47
|
+
- 若平台能力、权限、外部依赖或通用动态 DB 都无法支撑该功能,不要继续开发伪功能;向用户说明具体阻塞点和可选替代方案,确有复用价值时在 `.draftgo/lessons/` 记录“无法闭环原因 / 已验证限制 / 后续建议”。
|
|
48
48
|
|
|
49
|
-
|
|
49
|
+
一句话判断:用户没有明确要假,就优先考虑真实落地闭环、高可用;做不了真实闭环,就停下来说明,不写假的。
|
|
50
50
|
|
|
51
51
|
---
|
|
52
52
|
|
|
@@ -61,17 +61,17 @@ DraftGo-CLI 的目标不是只把页面写出来,而是让 AI 基于基座快
|
|
|
61
61
|
3. 看使用角色:访客、普通用户、管理员、运营、审核员、客服、内部人员等决定是否需要前台 / 后台 / 权限。
|
|
62
62
|
4. 看现有项目结构:已有导航、页面命名、db_meta、custom_scripts、角色体系和 Story 都是默认推断依据。
|
|
63
63
|
|
|
64
|
-
|
|
64
|
+
进入陌生项目、资源关系不清、多页面任务或用户描述较模糊时,先运行 `draftgo map` 快速获得资源地图;目标文件明确的小修和局部改动可以跳过。`draftgo map --output json` 可用于机器读取,不替代具体文件阅读。
|
|
65
65
|
|
|
66
66
|
默认策略:
|
|
67
67
|
|
|
68
68
|
- 用户说“修改 / 调整 / 优化某个已存在页面” → 默认按单资源改动处理;范围清晰则小修,影响主流程则轻功能或标准功能。
|
|
69
|
-
- 用户说“做 / 新建 / 增加一个页面” →
|
|
69
|
+
- 用户说“做 / 新建 / 增加一个页面” → 默认按**完整页面功能**处理:页面可访问、交互有效、状态完整、必要数据真实读写、入口已绑定,并优先考虑真实落地闭环、高可用。只有用户明确说“静态页 / 纯页面 / 静态稿 / demo / mock / 假数据 / 伪功能 / 先做效果”时,才允许按静态页面处理。
|
|
70
70
|
- 用户说“做一个功能 / 模块 / 系统能力” → 默认按功能闭环处理,不能自动降级为单个展示页或前端假数据。
|
|
71
71
|
- 用户说“管理 / 维护 / 发布 / 审核 / 上下架” → 默认需要后台管理能力和真实数据闭环。
|
|
72
72
|
- 用户说“官网 / 官方 / 平台 / 系统” → 不要做孤立页面;至少考虑导航入口、访问路径和完整用户路径。
|
|
73
73
|
|
|
74
|
-
只有当不确定点会明显改变页面数量、数据结构、后台能力、权限或风险时,才向用户确认。确认最多 1-3 个问题,并给出推荐默认值;其余细节由 AI
|
|
74
|
+
只有当不确定点会明显改变页面数量、数据结构、后台能力、权限或风险时,才向用户确认。确认最多 1-3 个问题,并给出推荐默认值;其余细节由 AI 自主推断,并按任务等级记录到范围复述、内部短计划或 Task 中。
|
|
75
75
|
|
|
76
76
|
### 用户路径链路(功能任务默认视角)
|
|
77
77
|
|
|
@@ -107,9 +107,9 @@ DraftGo-CLI 的目标不是只把页面写出来,而是让 AI 基于基座快
|
|
|
107
107
|
```
|
|
108
108
|
1. 定位:读目标 index / 文件,确认 resource id 与文件路径
|
|
109
109
|
2. 改:只做最小必要改动
|
|
110
|
-
3.
|
|
111
|
-
4. push
|
|
112
|
-
5.
|
|
110
|
+
3. 证据:用与改动匹配的轻量方式确认命中(文件回读 / 语法检查 / diff / 必要的本地检查)
|
|
111
|
+
4. 同步:需要云端生效或用户要求时再 push
|
|
112
|
+
5. 记录:影响可见功能、已 push 或有接手价值时写 changelog
|
|
113
113
|
```
|
|
114
114
|
|
|
115
115
|
小修不需要 Story 门、需求门、Task 文档,也不需要并行分发。若执行中发现影响面扩大,立即升级为「轻功能」或「标准功能」。
|
|
@@ -131,7 +131,7 @@ DraftGo-CLI 的目标不是只把页面写出来,而是让 AI 基于基座快
|
|
|
131
131
|
1. 范围复述:一句话说明要做什么、入口在哪里、如何验证
|
|
132
132
|
2. 直接做:读目标资源,按最小闭环实现
|
|
133
133
|
3. 主路径验证:入口可达、核心交互有效、关键状态不空白
|
|
134
|
-
4. push
|
|
134
|
+
4. 证据闭环:按影响选择 check / push / changelog
|
|
135
135
|
```
|
|
136
136
|
|
|
137
137
|
轻功能不强制创建 Task 文档,不强制 depends/resource_lock/wave,也不启用并行。若执行中发现需要多个页面协作、后台管理、复杂权限或资源冲突,升级为「标准功能」。
|
|
@@ -150,9 +150,9 @@ DraftGo-CLI 的目标不是只把页面写出来,而是让 AI 基于基座快
|
|
|
150
150
|
```
|
|
151
151
|
1. 若 .draftgo/story.yaml 存在,静默加载;不存在时不阻塞开发,完成后提醒补 Story
|
|
152
152
|
2. 轻量确认:意图翻译 + 必要追问 + 范围复述
|
|
153
|
-
3.
|
|
154
|
-
4.
|
|
155
|
-
5. 闭环门:证据 + changelog
|
|
153
|
+
3. 内部短计划:列清资源、入口、数据、关键交互和证据形式;跨资源、多页面协作、并行或高风险时再创建 Task
|
|
154
|
+
4. 执行门:按短计划逐项实现
|
|
155
|
+
5. 闭环门:证据 + 按影响选择 changelog / check / push;有 Task 时同步标记
|
|
156
156
|
```
|
|
157
157
|
|
|
158
158
|
标准功能任务最低规划要求:写清楚用户路径链路、页面入口/导航绑定、前台与后台是否需要同一份数据、哪些交互必须真实有效。不要把“页面看起来存在”当成“功能完成”。
|
|
@@ -173,7 +173,7 @@ DraftGo-CLI 的目标不是只把页面写出来,而是让 AI 基于基座快
|
|
|
173
173
|
1. Story 门:无 .draftgo/story.yaml 必须先构建;有则静默加载并做冲突检测
|
|
174
174
|
2. 完整确认:挖透关键风险、边界和验收,复述确认后才动手
|
|
175
175
|
3. 计划门:Task 文档 + 风险点 + 回滚/验证方案 + 人工确认点
|
|
176
|
-
4.
|
|
176
|
+
4. 执行门:轻量闭环执行;涉及 roles/users/custom_scripts 等按 push skill 要求二次确认
|
|
177
177
|
5. 闭环门:真实验证证据 + push 输出 + 回读结果 + 影响范围说明
|
|
178
178
|
```
|
|
179
179
|
|
|
@@ -298,9 +298,9 @@ C. <更完整方案>
|
|
|
298
298
|
|
|
299
299
|
---
|
|
300
300
|
|
|
301
|
-
##
|
|
301
|
+
## 计划门(按需 Task / 高风险,一次性产出,不打扰用户)
|
|
302
302
|
|
|
303
|
-
轻量确认过了之后,AI
|
|
303
|
+
轻量确认过了之后,AI 先做**内部短计划**并直接执行;只有跨资源、多页面协作、并行开发、需要长期接手或高风险任务,才把设计 + 任务清单落到 `.draftgo/Task/` 文件夹。小修、轻功能和普通标准功能不创建 Task 文档。
|
|
304
304
|
|
|
305
305
|
### Task 文件位置
|
|
306
306
|
|
|
@@ -377,10 +377,10 @@ related_changelog: YYYY-MM-DD
|
|
|
377
377
|
- 步骤:
|
|
378
378
|
1. 读取当前文件,定位 X
|
|
379
379
|
2. 在 Y 位置插入 Z
|
|
380
|
-
3.
|
|
381
|
-
4.
|
|
382
|
-
5.
|
|
383
|
-
-
|
|
380
|
+
3. 验证:文件回读 / draftgo check / 与改动匹配的轻量证据
|
|
381
|
+
4. 需要云端生效时调 push 脚本:`python {{SKILL_SCRIPTS}}/draftgo_push.py pages <page_id>`
|
|
382
|
+
5. 需要接手记录时写更新日志
|
|
383
|
+
- 验证证据:文件回读 / check / push 输出(如已推送)
|
|
384
384
|
|
|
385
385
|
- [ ] T2. ... ⬜
|
|
386
386
|
|
|
@@ -442,14 +442,14 @@ related_changelog: YYYY-MM-DD
|
|
|
442
442
|
|
|
443
443
|
---
|
|
444
444
|
|
|
445
|
-
##
|
|
445
|
+
## 执行节奏(轻量闭环)
|
|
446
446
|
|
|
447
|
-
DraftGo 主要场景是**改 HTML 页面、改导航、调 App API、写 custom_script、注册外部 API
|
|
447
|
+
DraftGo 主要场景是**改 HTML 页面、改导航、调 App API、写 custom_script、注册外部 API**。执行时保持小步、可理解、有证据:
|
|
448
448
|
|
|
449
449
|
```
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
Record
|
|
450
|
+
Small 小步实现,一次只动清楚的一件事
|
|
451
|
+
Evidence 用文件回读 / check / 与改动匹配的轻量证据确认
|
|
452
|
+
Record 按影响选择 changelog / Task 标记 / push
|
|
453
453
|
```
|
|
454
454
|
|
|
455
455
|
### 并行分发(Wave 模式)
|
|
@@ -457,33 +457,33 @@ Record 迭代记录 + 任务标记 + 同步
|
|
|
457
457
|
当任务数 ≥ 3、存在多个 Wave 1 任务(`depends: []` 且 resource_lock 不冲突)、任务边界清晰,且并行收益大于协调成本时,主代理可启用并行:
|
|
458
458
|
|
|
459
459
|
1. **分发**:为每个 Wave 1 任务生成子代理,携带上下文包(task 定义 + 当前文件 + 禁区摘要)
|
|
460
|
-
2.
|
|
460
|
+
2. **子代理执行**:每个子代理独立完成小步实现和证据确认,产出修改文件 + 验证报告;需要接手记录时再产出 changelog 条目
|
|
461
461
|
3. **收集**:主代理收集所有子代理产出,写入文件系统
|
|
462
|
-
4.
|
|
462
|
+
4. **批量推送**:需要云端生效时运行 `python {{SKILL_SCRIPTS}}/draftgo_push.py --batch <type1> <id1>,<id2> <type2> <id3>`
|
|
463
463
|
5. **Wave 2**:依赖已完成的任务可以开始,重复上述流程
|
|
464
|
-
6.
|
|
464
|
+
6. **闭环**:主代理统一汇总证据;有 Task 文档时再更新标记
|
|
465
465
|
|
|
466
466
|
**退化条件**:平台不支持子代理 / 任务数不足 / 边界不清 / 协调成本更高 / 用户明确说"串行" → 静默退化为逐任务串行。
|
|
467
467
|
|
|
468
468
|
详细协议见 `{{SKILL_DIR}}/rules/parallel.md`。
|
|
469
469
|
|
|
470
|
-
###
|
|
470
|
+
### 每个任务的轻量执行
|
|
471
471
|
|
|
472
472
|
```
|
|
473
473
|
1. 读 —— 读当前文件状态,理解现状(不读不改)
|
|
474
|
-
•
|
|
474
|
+
• 资源关系不清 / 陌生项目 / 多页面任务:先跑 `draftgo map`
|
|
475
475
|
• 涉及页面闭环:读取 pages/index.json、navigations/index.json 和相关 HTML
|
|
476
476
|
2. 改 —— 做最小必要改动,不顺手改无关代码
|
|
477
|
-
3.
|
|
478
|
-
•
|
|
479
|
-
• API 类:用 App.callApi / Python urllib /
|
|
477
|
+
3. 证 —— 用与改动匹配的轻量证据确认:
|
|
478
|
+
• 页面类:文件回读、入口引用、状态结构、关键交互代码路径
|
|
479
|
+
• API 类:用 App.callApi / Python urllib / 管理端测试端点真实跑一次
|
|
480
480
|
(Windows 环境下 curl 对中文/特殊字符编码易出错,建议优先用 Python urllib/requests)
|
|
481
481
|
• custom_script:用 POST /api/scripts/{id}/execute 跑一遍
|
|
482
482
|
• db_meta / aihub / 外部 API:注册或更新后用 GET 回读字段
|
|
483
|
-
4. 录 ——
|
|
483
|
+
4. 录 —— 影响可见功能、跨资源、已 push 或需接手时写更新日志到 .draftgo/changelog.md
|
|
484
484
|
格式:- [HH:MM] [操作类型] 描述(不超过 30 字)
|
|
485
|
-
5. 推 ——
|
|
486
|
-
6. 标 ——
|
|
485
|
+
5. 推 —— 需要云端生效时按资源类型调对应 push 脚本(pages / nav / db_meta / aihub / external_apis / system_config / docs / doc_categories / custom_scripts / roles / users)
|
|
486
|
+
6. 标 —— 有 Task 文档时把对应任务勾掉并记录证据摘要;没有 Task 文档则不补建
|
|
487
487
|
```
|
|
488
488
|
|
|
489
489
|
### 分段实现原则
|
|
@@ -491,7 +491,7 @@ Record 迭代记录 + 任务标记 + 同步
|
|
|
491
491
|
复杂或高风险代码应分段实现并验证;不要一次性写入难以检查的大块代码。
|
|
492
492
|
|
|
493
493
|
1. 按功能模块或逻辑段落拆分,优先保持每段可理解、可验证
|
|
494
|
-
2. 大段 HTML/CSS/JS
|
|
494
|
+
2. 大段 HTML/CSS/JS 写入后及时做语法、结构或静态检查
|
|
495
495
|
3. 批次间保持上下文连贯(闭合标签、函数结尾等不可跨批断开)
|
|
496
496
|
|
|
497
497
|
**原则**:分段是为了降低错误率,不是为了机械限制行数;清晰、完整、可验证优先。
|
|
@@ -545,15 +545,15 @@ Record 迭代记录 + 任务标记 + 同步
|
|
|
545
545
|
取证 → 模式 → 假设 → 修复
|
|
546
546
|
```
|
|
547
547
|
|
|
548
|
-
1.
|
|
548
|
+
1. **取证**:先看文件回读、`.draftgo/changelog.md`、`draftgo check`、API 回读或 push 输出中最贴近问题的证据。**先取证再判断**,禁止靠猜。
|
|
549
549
|
2. **模式**:对照 [debugging-syntax.md](./debugging-syntax.md) 10 大致命缺陷清单。九成"页面静默失效"都在里面。
|
|
550
550
|
3. **假设**:一次只验证一个假设。在关键路径加 `console.log('=== A 点 ===')` 二分定位。
|
|
551
|
-
4.
|
|
551
|
+
4. **修复**:修根因,不修表面。改完用与改动匹配的轻量证据确认。
|
|
552
552
|
5. **3 次修不好停手**:去 `.draftgo/lessons/` 写经验记录(基座 bug 或基座局限),与用户讨论是不是架构问题。
|
|
553
553
|
|
|
554
554
|
---
|
|
555
555
|
|
|
556
|
-
##
|
|
556
|
+
## 闭环门(无证据不许说完)
|
|
557
557
|
|
|
558
558
|
### 完成铁律
|
|
559
559
|
|
|
@@ -565,19 +565,19 @@ Record 迭代记录 + 任务标记 + 同步
|
|
|
565
565
|
|
|
566
566
|
按任务等级选择验证强度:
|
|
567
567
|
|
|
568
|
-
-
|
|
569
|
-
-
|
|
570
|
-
- 标准功能:验证入口、主流程、关键四态、数据读写 /
|
|
568
|
+
- 小修:验证改动点命中、无明显报错;需要云端生效时再确认对应资源已推送成功。
|
|
569
|
+
- 轻功能:验证入口引用存在、主路径交互有效、关键状态不空白;需要时补 `draftgo check` 或 push 输出。
|
|
570
|
+
- 标准功能:验证入口、主流程、关键四态、数据读写 / 回读、关联页面跳转;按影响选择 `draftgo check`、changelog 和 push 输出。
|
|
571
571
|
- 高风险:在标准功能基础上增加人工确认、回读验证、影响范围说明和回滚 / 兜底方案。
|
|
572
572
|
|
|
573
573
|
| 资源类型 | 完成证据 |
|
|
574
574
|
|---------|---------|
|
|
575
|
-
| 页面 HTML |
|
|
576
|
-
| 新增页面 / 多页面功能 | ① 页面资源创建或更新成功 ② route 与 page_id 对应 ③ 导航栏 / 首页 / 后台菜单 / 相关页面按钮至少一个入口已绑定 ④
|
|
577
|
-
| 导航栏 | ①
|
|
578
|
-
| 外部 API 注册 | ① `POST /api/external-apis/{id}/test` 返回 2xx ② push 输出
|
|
579
|
-
| custom_script | ① `POST /api/scripts/{id}/execute` 真跑一次 ② 返回值符合预期 ③ push 输出
|
|
580
|
-
| db_meta / aihub / 系统配置 | ① GET 回读字段对得上 ② push 输出
|
|
575
|
+
| 页面 HTML | 按等级验证:小修看改动点;轻功能看入口引用 + 主路径 + 关键状态;标准功能 / 高风险覆盖四态和必要的同步证据 |
|
|
576
|
+
| 新增页面 / 多页面功能 | ① 页面资源创建或更新成功 ② route 与 page_id 对应 ③ 导航栏 / 首页 / 后台菜单 / 相关页面按钮至少一个入口已绑定 ④ 文件回读或 `draftgo check` 可确认入口引用 ⑤ 关联页面互跳关系清楚 ⑥ 若已推送则有 push 输出 |
|
|
577
|
+
| 导航栏 | ① 文件回读确认新链接存在 ② 链接含正确 `data-page-route` ③ 若已推送则有 push 输出 |
|
|
578
|
+
| 外部 API 注册 | ① `POST /api/external-apis/{id}/test` 返回 2xx ② 若已推送则有 push 输出 ③ 页面里 `App.callApi` 能调通 |
|
|
579
|
+
| custom_script | ① `POST /api/scripts/{id}/execute` 真跑一次 ② 返回值符合预期 ③ 若已推送则有 push 输出 |
|
|
580
|
+
| db_meta / aihub / 系统配置 | ① GET 回读字段对得上 ② 若已推送则有 push 输出 |
|
|
581
581
|
| roles / users | ① 用户二次确认 ② push 输出 PASS ③ 影响范围告知用户 |
|
|
582
582
|
| 文档 / 文档分类 | ① push 输出 PASS ② GET 回读字段对得上 |
|
|
583
583
|
|
|
@@ -589,35 +589,35 @@ Record 迭代记录 + 任务标记 + 同步
|
|
|
589
589
|
入口出现 → 点击进入 → 页面加载 → 操作有效 → 反馈明确 → 数据可回读 → 后台可维护(如需要)→ 前台展示更新
|
|
590
590
|
```
|
|
591
591
|
|
|
592
|
-
|
|
592
|
+
如果新页面没有任何导航栏、首页模块、后台菜单或相关页面按钮引用,视为未完成。若任务明确要求“只创建未公开页面”,必须在完成声明中说明该页面暂不绑定导航的原因。
|
|
593
593
|
|
|
594
594
|
### CLI 闭环体检
|
|
595
595
|
|
|
596
|
-
涉及页面、导航、DB、脚本或 AIHub
|
|
596
|
+
涉及页面、导航、DB、脚本或 AIHub 的任务,可按影响运行:
|
|
597
597
|
|
|
598
598
|
```bash
|
|
599
599
|
draftgo check
|
|
600
600
|
```
|
|
601
601
|
|
|
602
|
-
- 有
|
|
602
|
+
- 有 `错误`:与本次改动相关时先修复,不得声明完成。
|
|
603
603
|
- 有 `提醒`:结合任务判断。若是未绑定入口、疑似 mock 数据、缺少真实调用,优先补齐;若是用户明确要求隐藏页 / demo,需在 changelog、Task 或完成说明中写明原因。
|
|
604
604
|
- 需要把提醒也作为失败处理时运行 `draftgo check --strict`。
|
|
605
605
|
|
|
606
|
-
`draftgo check`
|
|
606
|
+
`draftgo check` 只做本地启发式检查;结合文件回读、静态检查、API 回读和必要的 push 输出形成证据。
|
|
607
607
|
|
|
608
608
|
### 禁用措辞
|
|
609
609
|
|
|
610
610
|
- "应该 / 可能 / 看起来 / 大概 / Perfect / Done / 搞定 / 好了 / OK 了"
|
|
611
611
|
- 任何隐含成功但没附证据的句子
|
|
612
612
|
|
|
613
|
-
###
|
|
613
|
+
### 完成声明附证据
|
|
614
614
|
|
|
615
|
-
- 命令 /
|
|
615
|
+
- 命令 / 操作名(哪个文件回读 / 哪个 check / 哪个 push / 哪个 API)
|
|
616
616
|
- 真实输出摘要(HTTP code、关键日志行、计数)
|
|
617
|
-
-
|
|
617
|
+
- 有 Task 文档时说明更新到哪些 ✅;无 Task 文档时不需要补说明
|
|
618
618
|
|
|
619
619
|
**示例(正确)**:
|
|
620
|
-
> T2
|
|
620
|
+
> T2 完成。文件回读确认导出按钮绑定 `handleExport()`;`POST /api/scripts/7/execute` 返回 200,CSV 生成 89 行;已推送时 `python draftgo_push.py pages 123` 返回 `OK pages/123`。Task 文档 T2 已 ✅。
|
|
621
621
|
|
|
622
622
|
**示例(错误)**:
|
|
623
623
|
> 导出按钮做好了,应该没问题,push 也跑了,你试试看。
|
|
@@ -626,7 +626,7 @@ draftgo check
|
|
|
626
626
|
|
|
627
627
|
1. 把 Task 文档 frontmatter 的 `status` 改为 `done`
|
|
628
628
|
2. 填写"完成回顾"段(实际改动、偏离计划处、后续 TODO)
|
|
629
|
-
3.
|
|
629
|
+
3. 需要接手记录时在 changelog.md 写一条总结:`- [HH:MM] [完成] <主题>,详见 Task/<file>.md`
|
|
630
630
|
4. 文件原地归档,不要移动
|
|
631
631
|
|
|
632
632
|
---
|
|
@@ -637,16 +637,16 @@ draftgo check
|
|
|
637
637
|
|---------|---------------|
|
|
638
638
|
| 根 [SKILL.md](../SKILL.md) "开发分级" | 本规范提供小修 / 轻功能 / 标准功能 / 高风险分级与执行依据 |
|
|
639
639
|
| 根 [SKILL.md](../SKILL.md) "命令路由" | 增加触发:开发任务前先进本规范做任务分级 |
|
|
640
|
-
| 根 [SKILL.md](../SKILL.md) "开发禁区" / "App API" / "数据库 Schema" / "API 速查" |
|
|
640
|
+
| 根 [SKILL.md](../SKILL.md) "开发禁区" / "App API" / "数据库 Schema" / "API 速查" | 继续生效,执行证据依赖它们 |
|
|
641
641
|
| [frontend.md](./frontend.md) | 继续生效,提供 DraftGo 前端运行时、资源、数据、路由、入口绑定和验证方法 |
|
|
642
642
|
| [debugging-syntax.md](./debugging-syntax.md) | 继续生效,本规范第 3 章"调试方法论"在其之上加方法论 |
|
|
643
|
-
| 迭代记录规范(根 SKILL "迭代记录规范"段) |
|
|
643
|
+
| 迭代记录规范(根 SKILL "迭代记录规范"段) | 按影响选择复用 |
|
|
644
644
|
| 错误日志规范(根 SKILL "错误日志规范"段) | 取证阶段复用 |
|
|
645
645
|
| 经验记录规范(根 SKILL "经验记录规范(lessons)"段) | 第 3 章"3 次修不好停手"写入 `.draftgo/lessons/`,含基座 bug 与基座局限场景 |
|
|
646
|
-
| 同步规范(根 SKILL "
|
|
646
|
+
| 同步规范(根 SKILL "推送规范"段) | 需要云端生效时复用 |
|
|
647
647
|
|
|
648
648
|
---
|
|
649
649
|
|
|
650
650
|
## 一句话总结
|
|
651
651
|
|
|
652
|
-
>
|
|
652
|
+
> **先分级:小修直接定位改完给轻量证据;轻功能范围复述后直接做;标准功能轻量确认后用内部短计划执行;高风险走完整 Story / 计划 / 验证 / 人工确认。前端 UI 交给本地 Skills,DraftGo 质量靠真实链路和轻量证据。追问必带推测意图,新增页面必须绑定真实入口。**
|