draftgo-cli 3.0.1 → 3.0.29
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 +67 -17
- package/package.json +13 -8
- package/resources/skill/SKILL.md +118 -22
- package/resources/skill/core/architecture.md +4 -24
- package/resources/skill/core/modules.md +14 -4
- package/resources/skill/init/SKILL.md +3 -4
- package/resources/skill/practices/anti-patterns.md +14 -4
- package/resources/skill/practices/best-practices.md +25 -6
- package/resources/skill/practices/dev-declaration.md +23 -3
- package/resources/skill/pull/SKILL.md +9 -1
- package/resources/skill/push/SKILL.md +103 -68
- package/resources/skill/quickref/api-endpoints.md +63 -41
- package/resources/skill/quickref/api.json +5084 -4975
- package/resources/skill/quickref/app-api.md +4 -14
- package/resources/skill/rules/dev-workflow.md +154 -57
- package/resources/skill/rules/frontend.md +569 -21
- package/resources/skill/rules/parallel.md +10 -10
- package/resources/skill/scripts/__pycache__/draftgo_pull.cpython-312.pyc +0 -0
- package/resources/skill/scripts/__pycache__/draftgo_push.cpython-312.pyc +0 -0
- package/resources/skill/scripts/draftgo_delete.py +0 -2
- package/resources/skill/scripts/draftgo_init.py +15 -3
- package/resources/skill/scripts/draftgo_pull.py +154 -87
- package/resources/skill/scripts/draftgo_push.py +363 -174
- package/resources/skill/specs/custom-services.md +199 -0
- package/resources/skill/specs/data.md +195 -5
- package/resources/skill/specs/db-relations.md +227 -0
- package/resources/skill/specs/runtime.md +30 -0
- package/resources/skill/specs/security.md +3 -3
- package/resources/skill/specs/ui-protocol.md +79 -48
- package/resources/skill/story/SKILL.md +2 -7
- package/src/cli.js +9 -0
- package/src/commands/api.js +59 -0
- package/src/commands/autoPush.js +41 -0
- package/src/commands/check.js +27 -17
- package/src/commands/delete.js +6 -4
- package/src/commands/deploy.js +31 -0
- package/src/commands/doctor.js +1 -1
- package/src/commands/help.js +27 -9
- package/src/commands/init.js +17 -2
- package/src/commands/map.js +18 -7
- package/src/commands/new.js +20 -17
- package/src/commands/sync.js +10 -3
- package/src/commands/update.js +15 -56
- package/src/commands/upgrade.js +52 -0
- package/src/commands/verifyUi.js +199 -0
- package/src/index.js +12 -1
- package/src/localdev/compose.js +8 -1
- package/src/platforms.js +3 -3
- package/src/projectConfig.js +11 -1
- package/src/projectMap.js +274 -39
- package/src/skill.js +113 -29
- package/src/updateCheck.js +37 -5
- package/resources/skill/quickref/dg-components.md +0 -198
package/src/updateCheck.js
CHANGED
|
@@ -1,15 +1,43 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
// Fetch the latest draftgo-cli version from the npm registry.
|
|
4
|
-
//
|
|
5
|
-
// callers can gracefully fall back.
|
|
4
|
+
// Results are cached for 24 hours so doctor/update stay fast and deterministic.
|
|
6
5
|
|
|
7
6
|
const https = require('https');
|
|
7
|
+
const fs = require('fs');
|
|
8
|
+
const os = require('os');
|
|
9
|
+
const path = require('path');
|
|
8
10
|
const { getPackageVersion } = require('./skill');
|
|
9
11
|
|
|
10
12
|
const REGISTRY_URL = 'https://registry.npmjs.org/draftgo-cli/latest';
|
|
13
|
+
const CACHE_TTL_MS = 24 * 60 * 60 * 1000;
|
|
14
|
+
const CACHE_FILE = path.join(os.homedir(), '.draftgo-cli', 'update-check.json');
|
|
11
15
|
|
|
12
|
-
function
|
|
16
|
+
function readCache() {
|
|
17
|
+
try {
|
|
18
|
+
const cached = JSON.parse(fs.readFileSync(CACHE_FILE, 'utf8'));
|
|
19
|
+
if (!cached.version || !cached.checkedAt) return null;
|
|
20
|
+
if (Date.now() - Number(cached.checkedAt) > CACHE_TTL_MS) return null;
|
|
21
|
+
return String(cached.version);
|
|
22
|
+
} catch {
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function writeCache(version) {
|
|
28
|
+
try {
|
|
29
|
+
fs.mkdirSync(path.dirname(CACHE_FILE), { recursive: true });
|
|
30
|
+
fs.writeFileSync(CACHE_FILE, JSON.stringify({ version, checkedAt: Date.now() }) + '\n', 'utf8');
|
|
31
|
+
} catch {
|
|
32
|
+
// Cache failures must never block CLI work.
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function fetchLatestVersion(timeoutMs = 3000, opts = {}) {
|
|
37
|
+
if (!opts.force) {
|
|
38
|
+
const cached = readCache();
|
|
39
|
+
if (cached) return Promise.resolve(cached);
|
|
40
|
+
}
|
|
13
41
|
return new Promise((resolve) => {
|
|
14
42
|
let req;
|
|
15
43
|
try {
|
|
@@ -22,7 +50,11 @@ function fetchLatestVersion(timeoutMs = 3000) {
|
|
|
22
50
|
res.setEncoding('utf8');
|
|
23
51
|
res.on('data', (c) => { body += c; });
|
|
24
52
|
res.on('end', () => {
|
|
25
|
-
|
|
53
|
+
try {
|
|
54
|
+
const version = JSON.parse(body).version || null;
|
|
55
|
+
if (version) writeCache(version);
|
|
56
|
+
resolve(version);
|
|
57
|
+
}
|
|
26
58
|
catch { resolve(null); }
|
|
27
59
|
});
|
|
28
60
|
}
|
|
@@ -55,4 +87,4 @@ async function getFreshness() {
|
|
|
55
87
|
return { current, latest, outdated: cmpSemver(latest, current) > 0 };
|
|
56
88
|
}
|
|
57
89
|
|
|
58
|
-
module.exports = { fetchLatestVersion, cmpSemver, getFreshness };
|
|
90
|
+
module.exports = { fetchLatestVersion, cmpSemver, getFreshness, readCache, CACHE_TTL_MS };
|
|
@@ -1,198 +0,0 @@
|
|
|
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
|
-
```
|