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.
@@ -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
- 小修 直接定位 → 改 → check → push
17
- 轻功能 范围复述 → 直接做 → 主路径验证 → push
18
- 标准功能 轻量确认 → TaskTDR
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
- - **开发的急速感**:先用 `draftgo map`、本地 index、现有资源和最小必要规则快速建立上下文;小修和轻功能不要被表格化流程拖慢。
31
- - **逻辑与实现的完整**:默认真实数据、真实入口、真实反馈、真实验证;页面、导航、DB、脚本、权限和后台维护按用户路径闭环推断。
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 都无法支撑该功能,不要继续开发伪功能;向用户说明具体阻塞点、可选替代方案,并在 `.draftgo/lessons/` 记录“无法闭环原因 / 已验证限制 / 后续建议”。
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
- 进入陌生项目、标准功能、多页面任务或用户描述较模糊时,先运行 `draftgo map` 快速获得资源地图;小修且目标文件明确时可以跳过。`draftgo map --output json` 可用于机器读取,不替代具体文件阅读。
64
+ 进入陌生项目、资源关系不清、多页面任务或用户描述较模糊时,先运行 `draftgo map` 快速获得资源地图;目标文件明确的小修和局部改动可以跳过。`draftgo map --output json` 可用于机器读取,不替代具体文件阅读。
65
65
 
66
66
  默认策略:
67
67
 
68
68
  - 用户说“修改 / 调整 / 优化某个已存在页面” → 默认按单资源改动处理;范围清晰则小修,影响主流程则轻功能或标准功能。
69
- - 用户说“做 / 新建 / 增加一个页面” → 默认按**完整页面功能**处理:页面可访问、交互有效、状态完整、必要数据真实读写、入口已绑定。只有用户明确说“静态页 / 纯页面 / 静态稿 / demo / mock / 假数据 / 伪功能 / 先做效果”时,才允许按静态页面处理。
69
+ - 用户说“做 / 新建 / 增加一个页面” → 默认按**完整页面功能**处理:页面可访问、交互有效、状态完整、必要数据真实读写、入口已绑定,并优先考虑真实落地闭环、高可用。只有用户明确说“静态页 / 纯页面 / 静态稿 / demo / mock / 假数据 / 伪功能 / 先做效果”时,才允许按静态页面处理。
70
70
  - 用户说“做一个功能 / 模块 / 系统能力” → 默认按功能闭环处理,不能自动降级为单个展示页或前端假数据。
71
71
  - 用户说“管理 / 维护 / 发布 / 审核 / 上下架” → 默认需要后台管理能力和真实数据闭环。
72
72
  - 用户说“官网 / 官方 / 平台 / 系统” → 不要做孤立页面;至少考虑导航入口、访问路径和完整用户路径。
73
73
 
74
- 只有当不确定点会明显改变页面数量、数据结构、后台能力、权限或风险时,才向用户确认。确认最多 1-3 个问题,并给出推荐默认值;其余细节由 AI 自主推断,并按任务等级记录到范围复述、Task 或 TDR 中。
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. check:运行能覆盖该改动的最小检查(lint / 语法 / 浏览器 / 回读)
111
- 4. push:用 draftgo_push.py 推送对应资源
112
- 5. 录:写 changelog
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 + changelog:推送相关资源并记录
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. 计划门:创建 Task 文档,写任务清单;多任务 / 多资源冲突时补充 depends/resource_lock/wave
154
- 4. 执行门:按 TDR 循环逐任务执行
155
- 5. 闭环门:证据 + changelog + Task 标记 + push 输出
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. 执行门:TDR;涉及 roles/users/custom_scripts 等按 push skill 要求二次确认
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 **自主产出**设计 + 任务清单,落到 `.draftgo/Task/` 文件夹。小修和轻功能不创建 Task 文档。
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. 浏览器打开 /admin/users 实测(验四态)
381
- 4. push 脚本:`python {{SKILL_SCRIPTS}}/draftgo_push.py pages <page_id>`
382
- 5. 写更新日志
383
- - 验证证据:浏览器截图说明 + push 输出 + console 无报错
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
- ## 门 3:执行门(DraftGo 特化的 TDR 循环)
445
+ ## 执行节奏(轻量闭环)
446
446
 
447
- DraftGo 主要场景是**改 HTML 页面、改导航、调 App API、写 custom_script、注册外部 API**。TDD 在这里大部分用不上,换成 **TDR 循环**:
447
+ DraftGo 主要场景是**改 HTML 页面、改导航、调 App API、写 custom_script、注册外部 API**。执行时保持小步、可理解、有证据:
448
448
 
449
449
  ```
450
- Tiny 最小改动,一次只动一件事
451
- Demo 立即可演示(浏览器实测 / curl 验证 / 脚本执行)
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. **子代理执行**:每个子代理独立完成 TDR 的 Tiny + Demo,产出修改文件 + changelog 条目 + 验证报告
460
+ 2. **子代理执行**:每个子代理独立完成小步实现和证据确认,产出修改文件 + 验证报告;需要接手记录时再产出 changelog 条目
461
461
  3. **收集**:主代理收集所有子代理产出,写入文件系统
462
- 4. **批量推送**:`python {{SKILL_SCRIPTS}}/draftgo_push.py --batch <type1> <id1>,<id2> <type2> <id3>`
462
+ 4. **批量推送**:需要云端生效时运行 `python {{SKILL_SCRIPTS}}/draftgo_push.py --batch <type1> <id1>,<id2> <type2> <id3>`
463
463
  5. **Wave 2**:依赖已完成的任务可以开始,重复上述流程
464
- 6. **闭环**:主代理统一更新 Task 文档 + 闭环门
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
- 陌生项目 / 标准功能 / 多页面任务:先跑 `draftgo map`
474
+ 资源关系不清 / 陌生项目 / 多页面任务:先跑 `draftgo map`
475
475
  • 涉及页面闭环:读取 pages/index.json、navigations/index.json 和相关 HTML
476
476
  2. 改 —— 做最小必要改动,不顺手改无关代码
477
- 3. —— 立即看效果:
478
- 页面类:在浏览器里实测路径 / 四态 / 边界场景
479
- • API 类:用 App.callApi / Python urllib / push 脚本真实跑一次
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. 录 —— 写更新日志到 .draftgo/changelog.md
483
+ 4. 录 —— 影响可见功能、跨资源、已 push 或需接手时写更新日志到 .draftgo/changelog.md
484
484
  格式:- [HH:MM] [操作类型] 描述(不超过 30 字)
485
- 5. 推 —— 按资源类型调对应 push 脚本(pages / nav / db_meta / aihub / external_apis / system_config / docs / doc_categories / custom_scripts / roles / users)
486
- 6. 标 —— 标准功能 / 高风险任务在 Task 文档里把这个任务勾掉,记录证据摘要;小修和轻功能无需 Task 标记
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. **取证**:先看浏览器 console,再看 `.draftgo/changelog.md`,再看 push 输出。**先取证再判断**,禁止靠猜。
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. **修复**:修根因,不修表面。改完跑一次完整 TDR 循环。
551
+ 4. **修复**:修根因,不修表面。改完用与改动匹配的轻量证据确认。
552
552
  5. **3 次修不好停手**:去 `.draftgo/lessons/` 写经验记录(基座 bug 或基座局限),与用户讨论是不是架构问题。
553
553
 
554
554
  ---
555
555
 
556
- ## 门 4:闭环门(无证据不许说完)
556
+ ## 闭环门(无证据不许说完)
557
557
 
558
558
  ### 完成铁律
559
559
 
@@ -565,19 +565,19 @@ Record 迭代记录 + 任务标记 + 同步
565
565
 
566
566
  按任务等级选择验证强度:
567
567
 
568
- - 小修:验证改动点命中、无明显报错、对应资源 push 成功。
569
- - 轻功能:验证真实入口可达、主路径交互有效、关键状态不空白、`draftgo check` 无错误、对应资源 push 成功。
570
- - 标准功能:验证入口、主流程、关键四态、数据读写 / 回读、关联页面跳转、`draftgo check` 和 push 输出。
568
+ - 小修:验证改动点命中、无明显报错;需要云端生效时再确认对应资源已推送成功。
569
+ - 轻功能:验证入口引用存在、主路径交互有效、关键状态不空白;需要时补 `draftgo check` push 输出。
570
+ - 标准功能:验证入口、主流程、关键四态、数据读写 / 回读、关联页面跳转;按影响选择 `draftgo check`、changelog 和 push 输出。
571
571
  - 高风险:在标准功能基础上增加人工确认、回读验证、影响范围说明和回滚 / 兜底方案。
572
572
 
573
573
  | 资源类型 | 完成证据 |
574
574
  |---------|---------|
575
- | 页面 HTML | 按等级验证:小修看改动点;轻功能看入口 + 主路径 + 关键状态;标准功能 / 高风险再完整覆盖四态、console 和 push 输出 |
576
- | 新增页面 / 多页面功能 | ① 页面资源创建或更新成功 ② route 与 page_id 对应 ③ 导航栏 / 首页 / 后台菜单 / 相关页面按钮至少一个入口已绑定 ④ 从入口点击到目标页可通所有关联页面互相跳转可通 ⑥ push 输出 PASS |
577
- | 导航栏 | ① 浏览器看到新链接 ② 链接含正确 `data-page-route` ③ 点击跳转通 push 输出 PASS |
578
- | 外部 API 注册 | ① `POST /api/external-apis/{id}/test` 返回 2xx ② push 输出 PASS ③ 页面里 `App.callApi` 能调通 |
579
- | custom_script | ① `POST /api/scripts/{id}/execute` 真跑一次 ② 返回值符合预期 ③ push 输出 PASS |
580
- | db_meta / aihub / 系统配置 | ① GET 回读字段对得上 ② push 输出 PASS |
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
- 如果新页面只能靠手动输入 route 访问,且用户正常路径里看不到入口,视为未完成。若任务明确要求“只创建未公开页面”,必须在完成声明中说明该页面暂不绑定导航的原因。
592
+ 如果新页面没有任何导航栏、首页模块、后台菜单或相关页面按钮引用,视为未完成。若任务明确要求“只创建未公开页面”,必须在完成声明中说明该页面暂不绑定导航的原因。
593
593
 
594
594
  ### CLI 闭环体检
595
595
 
596
- 涉及页面、导航、DB、脚本或 AIHub 的轻功能 / 标准功能 / 高风险任务,push 前运行:
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` 只做本地启发式检查;浏览器点击、console、API 回读、push 输出仍然是最终证据。
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
- - 命令 / 操作名(哪个 push / 哪个 API / 哪个浏览器路径)
615
+ - 命令 / 操作名(哪个文件回读 / 哪个 check / 哪个 push / 哪个 API)
616
616
  - 真实输出摘要(HTTP code、关键日志行、计数)
617
- - 标准功能 / 高风险任务:Task 文档更新到哪些 ✅;小修和轻功能说明无需 Task
617
+ - Task 文档时说明更新到哪些 ✅;无 Task 文档时不需要补说明
618
618
 
619
619
  **示例(正确)**:
620
- > T2 完成。`python draftgo_push.py pages 123` 返回 `OK pages/123`,浏览器 `/admin/users` 加载正常,导出按钮点击触发下载,CSV 文件 89 行(与列表 page_size=100 + 11 条过滤匹配)。Task 文档 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. changelog.md 写一条总结:`- [HH:MM] [完成] <主题>,详见 Task/<file>.md`
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 速查" | 继续生效,执行门第 6 步验证依赖它们 |
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 "迭代记录规范"段) | TDR 循环第 4 步复用 |
643
+ | 迭代记录规范(根 SKILL "迭代记录规范"段) | 按影响选择复用 |
644
644
  | 错误日志规范(根 SKILL "错误日志规范"段) | 取证阶段复用 |
645
645
  | 经验记录规范(根 SKILL "经验记录规范(lessons)"段) | 第 3 章"3 次修不好停手"写入 `.draftgo/lessons/`,含基座 bug 与基座局限场景 |
646
- | 同步规范(根 SKILL "自动同步规范"段) | TDR 循环第 5 步复用 |
646
+ | 同步规范(根 SKILL "推送规范"段) | 需要云端生效时复用 |
647
647
 
648
648
  ---
649
649
 
650
650
  ## 一句话总结
651
651
 
652
- > **先分级:小修直接定位改完验证推送;轻功能范围复述后直接做;标准功能轻量确认后 Task + TDR;高风险走完整 Story / 计划 / 验证 / 人工确认。前端 UI 交给本地 Skills,DraftGo 质量靠真实链路和证据。追问必带推测意图,新增页面必须绑定真实入口。**
652
+ > **先分级:小修直接定位改完给轻量证据;轻功能范围复述后直接做;标准功能轻量确认后用内部短计划执行;高风险走完整 Story / 计划 / 验证 / 人工确认。前端 UI 交给本地 Skills,DraftGo 质量靠真实链路和轻量证据。追问必带推测意图,新增页面必须绑定真实入口。**