draftgo-cli 2.0.9 → 3.0.1
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 +6 -0
- package/package.json +1 -1
- package/resources/skill/SKILL.md +74 -1378
- 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 +32 -1
- 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/frontend.md +129 -596
- package/resources/skill/scripts/draftgo_delete.py +151 -0
- package/resources/skill/scripts/draftgo_push.py +80 -6
- 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/delete.js +86 -0
- package/src/commands/help.js +7 -0
- package/src/commands/new.js +183 -0
- package/src/commands/sync.js +4 -1
- package/src/index.js +6 -0
|
@@ -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
|
+
```
|