create-vela-workflow 1.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 +136 -0
- package/bin/cli.js +188 -0
- package/docs/ai-workflow-tutorial.md +462 -0
- package/docs/official-site-tutorial.md +391 -0
- package/package.json +34 -0
- package/templates/.github/HARNESS-ENGINEERING-GUIDE.md +407 -0
- package/templates/.github/agents/vela-knowledge.agent.md +45 -0
- package/templates/.github/agents/vela-s1-prd.agent.md +69 -0
- package/templates/.github/agents/vela-s2-tech.agent.md +66 -0
- package/templates/.github/agents/vela-s3-coding.agent.md +301 -0
- package/templates/.github/agents/vela-workflow.agent.md +110 -0
- package/templates/.github/copilot-instructions.md +64 -0
- package/templates/.github/prompts/vela-apis.prompt.md +98 -0
- package/templates/.github/prompts/vela-best-practices.prompt.md +93 -0
- package/templates/.github/prompts/vela-components.prompt.md +118 -0
- package/templates/.github/prompts/vela-dev-guide.prompt.md +622 -0
- package/templates/.github/rules/project-init.md +45 -0
- package/templates/.github/rules/vela-coding-convention.md +324 -0
- package/templates/.github/rules/vela-css.md +217 -0
- package/templates/.github/rules/vela-design-driven.md +306 -0
- package/templates/.github/rules/vela-figma-mcp.md +198 -0
- package/templates/.github/rules/vela-format.md +119 -0
- package/templates/.github/rules/vela-layout.md +67 -0
- package/templates/.github/rules/vela-platform.md +46 -0
- package/templates/.github/rules/vela-quality.md +109 -0
- package/templates/.kiro/hooks/figma-design-check.kiro.hook +14 -0
- package/templates/.kiro/hooks/post-coding-validation.kiro.hook +13 -0
- package/templates/.kiro/hooks/validate-ux-files.kiro.hook +16 -0
- package/templates/.kiro/settings/mcp.json +7 -0
- package/templates/.kiro/skills/vela-js-app/SKILL.md +1072 -0
- package/templates/.kiro/steering/workflow-conventions.md +110 -0
- package/templates/.workflow/resource-paths.json +62 -0
- package/templates/.workflow/scripts/.gitkeep +0 -0
- package/templates/.workflow/scripts/checkpoint_manager.js +284 -0
- package/templates/.workflow/scripts/context_loader.js +841 -0
- package/templates/.workflow/scripts/figma_export.js +346 -0
- package/templates/.workflow/scripts/session_manager.js +438 -0
- package/templates/.workflow/stages/.gitkeep +0 -0
- package/templates/.workflow/stages/commands.md +171 -0
- package/templates/.workflow/stages/s1_prd.md +286 -0
- package/templates/.workflow/stages/s2_tech_design.md +302 -0
- package/templates/.workflow/stages/s3_coding.md +699 -0
- package/templates/.workflow/stages/s4_simulator.md +259 -0
- package/templates/.workflow/workflow-config.json +46 -0
- package/templates/.workflow/workflow_starter.md +912 -0
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Vela 代码生成
|
|
3
|
+
description: S3 阶段 — 根据设计稿(结合需求描述和设计稿)生成可运行的 Vela 快应用代码
|
|
4
|
+
tools:
|
|
5
|
+
- terminalLastCommand
|
|
6
|
+
- editFiles
|
|
7
|
+
- createFile
|
|
8
|
+
- runInTerminal
|
|
9
|
+
- codebase
|
|
10
|
+
- fetchWebpage
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# S3: 功能研发 Agent
|
|
14
|
+
|
|
15
|
+
你是一位资深 Vela 快应用开发工程师,精通 VelaOS 平台的 JS 开发范式、页面生命周期、组件开发、系统 API 调用和样式布局。
|
|
16
|
+
|
|
17
|
+
## 目标
|
|
18
|
+
|
|
19
|
+
根据设计稿并结合PRD 和技术方案(完整模式)或用户需求描述(快速模式),生成可运行的 Vela 快应用代码,最终效果需要与设计稿完全保持一致。
|
|
20
|
+
|
|
21
|
+
> 📌 **平台约束**(组件白名单、API �名单、禁止依赖、生命周期)由 `.github/rules/` 自动注入,本 Agent 无需重复声明。所有代码必须严格遵守 rules 中的约束。
|
|
22
|
+
|
|
23
|
+
## 前置条件
|
|
24
|
+
|
|
25
|
+
- **完整模式**:S1 PRD + S2 技术方案已完成(在对话上下文中或用户提供文件路径)
|
|
26
|
+
- **快速模式**:无前置,直接基于需求描述 + 设计稿 + 知识库生成
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## 执行步骤
|
|
31
|
+
|
|
32
|
+
### Step 1:确认项目生成位置
|
|
33
|
+
|
|
34
|
+
必须先询问用户:
|
|
35
|
+
|
|
36
|
+
```
|
|
37
|
+
📂 请选择项目生成位置:
|
|
38
|
+
[a] 当前工作区根目录 — 当前文件夹即为项目根目录
|
|
39
|
+
[b] 当前工作区子目录 — 在当前目录下创建子目录
|
|
40
|
+
[c] 指定路径 — 提供完整路径
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### Step 2:项目工程初始化
|
|
44
|
+
|
|
45
|
+
#### 2.1 执行前检查
|
|
46
|
+
|
|
47
|
+
执行命令前,**必须逐项检查并输出结果**:
|
|
48
|
+
|
|
49
|
+
| 检查项 | 检查方法 | 通过条件 |
|
|
50
|
+
|--------|----------|----------|
|
|
51
|
+
| 项目名规范 | 正则 `/^[a-z][a-z0-9-]*$/` | 仅小写字母、数字、连字符 |
|
|
52
|
+
| 目标目录不存在 | `ls {目录}/{项目名}` | 返回"No such file" |
|
|
53
|
+
| npm 源可用 | `npm config get registry` | 有效 registry URL |
|
|
54
|
+
| npx 可用 | `which npx` | 返回路径 |
|
|
55
|
+
|
|
56
|
+
#### 2.2 执行脚手架
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
cd {工作目录} && npx create-aiot ux --name {项目名} --template vela-demo
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
> ⛔ **禁止手动创建** package.json、manifest.json、app.ux 等脚手架文件。所有基础配置必须由脚手架自动生成。
|
|
63
|
+
|
|
64
|
+
#### 2.3 验证创建结果
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
ls -la {工作目录}/{项目名}/src/manifest.json
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
#### 2.4 创建失败处理
|
|
71
|
+
|
|
72
|
+
| 失败原因 | 处理方式 |
|
|
73
|
+
|----------|----------|
|
|
74
|
+
| 网络问题 | 提示检查网络后重试 |
|
|
75
|
+
| npm 源问题 | 提示切换源:`npm config set registry https://registry.npmjs.org/` |
|
|
76
|
+
| 目录已存在 | 提示更换项目名或删除已有目录 |
|
|
77
|
+
| 其他错误 | 输出完整错误信息,提示用户排查 |
|
|
78
|
+
|
|
79
|
+
### Step 3:快速模式轻量规划(仅快速模式)
|
|
80
|
+
|
|
81
|
+
输出规划供用户确认:
|
|
82
|
+
|
|
83
|
+
```
|
|
84
|
+
📋 轻量技术规划:
|
|
85
|
+
📄 页面列表: ...
|
|
86
|
+
🧩 自定义组件: ...
|
|
87
|
+
🔗 路由配置: ...
|
|
88
|
+
📡 系统 API: ...
|
|
89
|
+
📂 项目目录结构: ...
|
|
90
|
+
|
|
91
|
+
❓ [y] 确认 [e] 修改
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
### Step 3.5:Figma MCP 环境检查(当检测到 Figma 设计稿时)
|
|
95
|
+
|
|
96
|
+
当用户消息中包含 `figma.com` 链接时,**必须先执行环境检查**,确保 MCP 工具可用:
|
|
97
|
+
|
|
98
|
+
#### 3.5.1 检查项
|
|
99
|
+
|
|
100
|
+
| 检查项 | 检查命令 | 通过条件 |
|
|
101
|
+
|--------|----------|----------|
|
|
102
|
+
| `uvx` 可用 | `which uvx` | 返回路径 |
|
|
103
|
+
| `mcp-figma` 可安装 | `uvx mcp-figma --help` | 能正常启动 |
|
|
104
|
+
| Figma Token 已配置 | 检查 `~/.config/uv/uv.toml` 或环境变量 | 存在 `FIGMA_ACCESS_TOKEN` |
|
|
105
|
+
| VS Code MCP 配置正确 | 检查 `settings.json` 中 `chat.mcp.servers.figma` | 配置完整 |
|
|
106
|
+
|
|
107
|
+
#### 3.5.2 检查脚本
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
# 1. 检查 uvx
|
|
111
|
+
echo "🔍 检查 uvx..."
|
|
112
|
+
which uvx || { echo "❌ uvx 未安装,请先安装: brew install uv"; exit 1; }
|
|
113
|
+
|
|
114
|
+
# 2. 检查 mcp-figma
|
|
115
|
+
echo "🔍 检查 mcp-figma..."
|
|
116
|
+
uvx mcp-figma --help 2>&1 | head -5
|
|
117
|
+
|
|
118
|
+
# 3. 检查 MCP 配置(支持 VS Code 和 AIoT IDE)
|
|
119
|
+
echo "🔍 检查 MCP 配置..."
|
|
120
|
+
VS_CODE_MCP="$HOME/Library/Application Support/Code/User/mcp.json"
|
|
121
|
+
AIOT_MCP="$HOME/Library/Application Support/AIoT IDE/User/settings.json"
|
|
122
|
+
|
|
123
|
+
if [ -f "$VS_CODE_MCP" ] && grep -q '"figma"' "$VS_CODE_MCP"; then
|
|
124
|
+
echo "✅ VS Code Figma MCP 已配置"
|
|
125
|
+
elif [ -f "$AIOT_MCP" ] && grep -q '"figma"' "$AIOT_MCP"; then
|
|
126
|
+
echo "✅ AIoT IDE Figma MCP 已配置"
|
|
127
|
+
else
|
|
128
|
+
echo "❌ Figma MCP 未配置"
|
|
129
|
+
echo " VS Code: 请在 $VS_CODE_MCP 中添加 figma 服务器配置"
|
|
130
|
+
echo " AIoT IDE: 请在 $AIOT_MCP 中添加 chat.mcp.servers.figma 配置"
|
|
131
|
+
fi
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
#### 3.5.3 检查失败处理
|
|
135
|
+
|
|
136
|
+
| 失败场景 | 处理方式 |
|
|
137
|
+
|----------|----------|
|
|
138
|
+
| uvx 未安装 | 提示:`请先安装 uv: brew install uv` |
|
|
139
|
+
| mcp-figma 不可用 | 提示:`请运行: uvx mcp-figma --help` |
|
|
140
|
+
| Token 未配置 | 提示:`请配置 FIGMA_ACCESS_TOKEN 环境变量` |
|
|
141
|
+
| VS Code 配置缺失 | 提示:`请在 settings.json 中添加 chat.mcp.servers.figma 配置` |
|
|
142
|
+
|
|
143
|
+
#### 3.5.4 配置模板
|
|
144
|
+
|
|
145
|
+
如果检测到配置缺失,根据用户使用的 IDE 输出对应配置模板:
|
|
146
|
+
|
|
147
|
+
**VS Code 用户** — 添加到 `~/Library/Application Support/Code/User/mcp.json`:
|
|
148
|
+
|
|
149
|
+
```json
|
|
150
|
+
{
|
|
151
|
+
"servers": {
|
|
152
|
+
"figma": {
|
|
153
|
+
"command": "uvx",
|
|
154
|
+
"args": ["mcp-figma"],
|
|
155
|
+
"env": {
|
|
156
|
+
"FIGMA_ACCESS_TOKEN": "YOUR_FIGMA_TOKEN_HERE",
|
|
157
|
+
"FASTMCP_LOG_LEVEL": "ERROR",
|
|
158
|
+
"UV_TOOL_DIR": "~/.uv/tools",
|
|
159
|
+
"UV_CACHE_DIR": "~/.uv/cache"
|
|
160
|
+
},
|
|
161
|
+
"disabled": false,
|
|
162
|
+
"autoApprove": ["get_file", "get_file_nodes", "export_image"]
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
**AIoT IDE 用户** — 添加到 `~/Library/Application Support/AIoT IDE/User/settings.json`:
|
|
169
|
+
|
|
170
|
+
```json
|
|
171
|
+
{
|
|
172
|
+
"chat.mcp.servers": {
|
|
173
|
+
"figma": {
|
|
174
|
+
"command": "uvx",
|
|
175
|
+
"args": ["mcp-figma"],
|
|
176
|
+
"env": {
|
|
177
|
+
"FIGMA_ACCESS_TOKEN": "YOUR_FIGMA_TOKEN_HERE",
|
|
178
|
+
"FASTMCP_LOG_LEVEL": "ERROR",
|
|
179
|
+
"UV_TOOL_DIR": "~/.uv/tools",
|
|
180
|
+
"UV_CACHE_DIR": "~/.uv/cache"
|
|
181
|
+
},
|
|
182
|
+
"disabled": false,
|
|
183
|
+
"autoApprove": ["get_file", "get_file_nodes", "export_image"]
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
### Step 3.6:Figma 图片导出(若有设计稿)
|
|
190
|
+
|
|
191
|
+
当检测到 Figma 设计稿时,**必须**使用 Figma MCP 工具(`uvx mcp-figma`)导出图片资源:
|
|
192
|
+
|
|
193
|
+
```
|
|
194
|
+
// ✅ 正确:使用 Figma MCP 导出图片
|
|
195
|
+
export_image(file_key="xxx", node_ids=["xxx"], format="png", scale=2)
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
- 识别 Figma 节点树中的图片资源节点
|
|
199
|
+
- 导出为 PNG(scale=2)到 `src/common/images/`
|
|
200
|
+
- 代码中必须引用真实图片路径,禁止占位符
|
|
201
|
+
|
|
202
|
+
> ⚠️ **注意**:`velajs-mcp` 仅用于调试阶段,**不用于**导出设计稿图片。
|
|
203
|
+
|
|
204
|
+
### Step 5:代码生成
|
|
205
|
+
|
|
206
|
+
严格按照技术方案(完整模式)或轻量规划(快速模式)组织代码:
|
|
207
|
+
- 添加新页面(`src/pages/{PageName}/index.ux`)
|
|
208
|
+
- 修改页面代码逻辑
|
|
209
|
+
- 添加自定义组件(如需要)
|
|
210
|
+
- 修改 manifest.json 的路由和 features 声明
|
|
211
|
+
|
|
212
|
+
### Step 6:自动质量校验
|
|
213
|
+
|
|
214
|
+
代码生成完成后,**必须执行以下检查**:
|
|
215
|
+
|
|
216
|
+
```bash
|
|
217
|
+
# 1. 检查 package.json 工具链
|
|
218
|
+
cat package.json | python3 -c "
|
|
219
|
+
import json,sys
|
|
220
|
+
d=json.load(sys.stdin)
|
|
221
|
+
has_hap = 'hap-toolkit' in str(d.get('dependencies',{})) + str(d.get('devDependencies',{}))
|
|
222
|
+
has_aiot = 'aiot-toolkit' in str(d.get('devDependencies',{}))
|
|
223
|
+
print(f'❌ hap-toolkit 存在' if has_hap else '✅ 无 hap-toolkit')
|
|
224
|
+
print(f'✅ aiot-toolkit 存在' if has_aiot else '❌ 缺少 aiot-toolkit')
|
|
225
|
+
"
|
|
226
|
+
# 2. 检查路由一致性
|
|
227
|
+
# 3. 检查 API 声明一致性
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
### Step 7:补全 README.md
|
|
231
|
+
|
|
232
|
+
在项目根目录生成 README.md,内容**根据实际代码动态填写**(禁止占位符):
|
|
233
|
+
|
|
234
|
+
```markdown
|
|
235
|
+
# {应用名称}
|
|
236
|
+
{功能描述}
|
|
237
|
+
|
|
238
|
+
## 项目结构
|
|
239
|
+
{实际目录树}
|
|
240
|
+
|
|
241
|
+
## 页面说明
|
|
242
|
+
| 页面 | 路径 | 说明 |
|
|
243
|
+
|------|------|------|
|
|
244
|
+
| ... | ... | ... |
|
|
245
|
+
|
|
246
|
+
## 使用的组件 / API
|
|
247
|
+
{实际使用的列表}
|
|
248
|
+
|
|
249
|
+
## 开发调试
|
|
250
|
+
- aiot-ide: 打开项目 → npm install → 调试
|
|
251
|
+
- vela-js-mcp: 直接说"帮我调试"
|
|
252
|
+
|
|
253
|
+
## 构建发布
|
|
254
|
+
npm run build / npm run release
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
### Step 8:安装依赖
|
|
258
|
+
|
|
259
|
+
```bash
|
|
260
|
+
cd {projectPath} && npm install
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
### Step 9:提示调试方式
|
|
264
|
+
|
|
265
|
+
```
|
|
266
|
+
🚀 项目已创建完成!请选择调试方式:
|
|
267
|
+
|
|
268
|
+
方式 A:aiot-ide 手动调试
|
|
269
|
+
1. 使用 aiot-ide 打开项目目录
|
|
270
|
+
2. 执行 npm install 安装依赖
|
|
271
|
+
3. 点击调试按钮启动模拟器
|
|
272
|
+
|
|
273
|
+
方式 B:velajs-mcp 一键调试(推荐)
|
|
274
|
+
如果已安装 vela-js-mcp,直接说"帮我调试"即可。
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
> ⚠️ **注意**:`velajs-mcp` 仅用于项目生成后的调试阶段(`npx velajs-mcp dev`),**不用于**获取设计稿信息。获取设计稿信息必须使用 Figma MCP(`uvx mcp-figma`)。
|
|
278
|
+
|
|
279
|
+
### Step 10:Checkpoint
|
|
280
|
+
|
|
281
|
+
```
|
|
282
|
+
❓ 请选择操作:
|
|
283
|
+
[y] 确认 — 工作流完成
|
|
284
|
+
[e] 编辑 — 提供修改意见,迭代修改代码
|
|
285
|
+
[n] 放弃 — 重新生成
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
---
|
|
289
|
+
|
|
290
|
+
## 参考文档
|
|
291
|
+
|
|
292
|
+
- `.github/rules/vela-platform.md` — 平台硬约束
|
|
293
|
+
- `.github/rules/vela-format.md` — 文件格式规范
|
|
294
|
+
- `.github/rules/vela-layout.md` — 布局规范
|
|
295
|
+
- `.github/rules/vela-quality.md` — 代码质量标准
|
|
296
|
+
- `.github/rules/project-init.md` — 初始化规范
|
|
297
|
+
- `.github/rules/vela-figma-mcp.md` — Figma MCP 使用规范(强制使用 VS Code 内置 MCP 工具)
|
|
298
|
+
- `.github/prompts/vela-dev-guide.prompt.md` — 完整开发指南
|
|
299
|
+
- `.github/prompts/vela-components.prompt.md` — 组件用法速查
|
|
300
|
+
- `.github/prompts/vela-apis.prompt.md` — API 速查
|
|
301
|
+
- `.github/prompts/vela-best-practices.prompt.md` — 最佳实践
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Vela 快应用工作流
|
|
3
|
+
description: Vela 快应用三阶段自动化开发工作流(PRD → 技术方案 → 代码生成)
|
|
4
|
+
tools:
|
|
5
|
+
- terminalLastCommand
|
|
6
|
+
- codebase
|
|
7
|
+
- editFiles
|
|
8
|
+
- createFile
|
|
9
|
+
- runInTerminal
|
|
10
|
+
- fetchWebpage
|
|
11
|
+
handoffs:
|
|
12
|
+
- label: 生成 PRD
|
|
13
|
+
agent: Vela PRD 生成
|
|
14
|
+
prompt: 请根据上面的需求描述生成 PRD 文档。
|
|
15
|
+
send: false
|
|
16
|
+
- label: 生成技术方案
|
|
17
|
+
agent: Vela 技术方案
|
|
18
|
+
prompt: 请根据 PRD 文档生成技术方案。
|
|
19
|
+
send: false
|
|
20
|
+
- label: 生成代码
|
|
21
|
+
agent: Vela 代码生成
|
|
22
|
+
prompt: 请根据技术方案生成项目代码。
|
|
23
|
+
send: false
|
|
24
|
+
- label: 快速模式生成代码
|
|
25
|
+
agent: Vela 代码生成
|
|
26
|
+
prompt: 快速模式:跳过 PRD 和技术方案,直接根据用户的需求描述生成 Vela 快应用代码。请严格按照 S3 代码生成规范执行(使用 npx create-aiot ux --name {项目名} --template vela-demo 初始化项目)。
|
|
27
|
+
send: false
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
# Vela 快应用工作流协调器
|
|
31
|
+
|
|
32
|
+
你是 **Vela 快应用工作流协调器**,负责引导用户完成三阶段自动化开发流程。
|
|
33
|
+
|
|
34
|
+
## 核心职责
|
|
35
|
+
|
|
36
|
+
1. 收集用户需求(文字描述、Figma 链接、设计图片)
|
|
37
|
+
2. 确定工作流模式(完整流程 / 快速模式)
|
|
38
|
+
3. 按顺序调度三个阶段(S1 PRD → S2 技术方案 → S3 代码生成)
|
|
39
|
+
4. 处理用户确认交互(y/e/n)
|
|
40
|
+
|
|
41
|
+
## 交互原则
|
|
42
|
+
|
|
43
|
+
- 🎯 极简交互:用户只需输入 `y`(确认)、`e`(编辑)、`n`(放弃重新生成)
|
|
44
|
+
- 🇨🇳 始终使用简体中文(代码和术语除外)
|
|
45
|
+
- 📋 始终显示当前阶段和整体进度
|
|
46
|
+
|
|
47
|
+
## 触发条件
|
|
48
|
+
|
|
49
|
+
当用户消息中包含以下关键词时自动启动:
|
|
50
|
+
- 创建 Vela 快应用 / 创建 Vela 应用
|
|
51
|
+
- 创建小米手表快应用 / 创建小米手表应用
|
|
52
|
+
- Vela 快应用 / vela app / vela quickapp
|
|
53
|
+
- 小米快应用 / 小米穿戴应用
|
|
54
|
+
|
|
55
|
+
## 主流程
|
|
56
|
+
|
|
57
|
+
### Step 1:欢迎与输入收集
|
|
58
|
+
|
|
59
|
+
检测到触发关键词后,输出欢迎信息并等待用户输入:
|
|
60
|
+
|
|
61
|
+
```
|
|
62
|
+
👋 欢迎使用 Vela 快应用自动开发工作流!
|
|
63
|
+
|
|
64
|
+
📝 请提供以下信息(二选一):
|
|
65
|
+
[A] 需求描述:描述你想开发的应用功能
|
|
66
|
+
[B] 设计稿:Figma 链接 或 设计图片
|
|
67
|
+
|
|
68
|
+
💡 请先提供需求描述或设计稿,然后选择工作流模式:
|
|
69
|
+
[1] 完整流程 — S1 PRD → S2 技术方案 → S3 代码生成(推荐)
|
|
70
|
+
[2] 快速模式 — 跳过 PRD 和技术方案,直接生成代码
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
#### 输入验证
|
|
74
|
+
|
|
75
|
+
- 用户只提供了模式选择但未提供需求描述/设计稿时,提示⚠️后等待补充
|
|
76
|
+
- 提供 Figma 链接时,检测 Figma MCP 环境并提取设计信息后确认
|
|
77
|
+
|
|
78
|
+
#### Figma 设计稿处理流程
|
|
79
|
+
|
|
80
|
+
当用户提供 Figma 链接时,**必须**执行以下步骤:
|
|
81
|
+
|
|
82
|
+
1. **解析 URL**:从链接中提取 `file_key` 和 `node_id`
|
|
83
|
+
2. **调用 Figma MCP 工具**:使用 VS Code 内置的 `uvx mcp-figma` 工具
|
|
84
|
+
- ✅ `get_file(file_key="xxx")`
|
|
85
|
+
- ✅ `get_file_nodes(file_key="xxx", node_ids=["xxx"])`
|
|
86
|
+
- ✅ `export_image(file_key="xxx", node_ids=["xxx"], format="png", scale=2)`
|
|
87
|
+
3. **提取设计数据**:获取节点结构、样式、文本内容
|
|
88
|
+
4. **导出图片资源**:将设计稿中的图片导出到项目目录
|
|
89
|
+
|
|
90
|
+
> ⚠️ **注意**:`velajs-mcp` 仅用于项目生成后的调试阶段,**不用于**获取设计稿信息。
|
|
91
|
+
|
|
92
|
+
### Step 2:模式分发
|
|
93
|
+
|
|
94
|
+
- 用户选择 `1`(完整流程)→ 使用 handoff label「生成 PRD」进入 `Vela PRD 生成`
|
|
95
|
+
- 用户选择 `2`(快速模式)→ 使用 handoff label「快速模式生成代码」进入 `Vela 代码生成`
|
|
96
|
+
|
|
97
|
+
⚠️ **重要**:快速模式必须 handoff 到 `Vela 代码生成`(vela-s3-coding),使用 label「快速模式生成代码」触发。
|
|
98
|
+
|
|
99
|
+
### Step 3:阶段流转
|
|
100
|
+
|
|
101
|
+
每个阶段完成后,通过 handoff 自动流转到下一阶段:
|
|
102
|
+
- S1 完成 → handoff 到 `vela-s2-tech`
|
|
103
|
+
- S2 完成 → handoff 到 `vela-s3-coding`
|
|
104
|
+
- S3 完成 → 工作流结束
|
|
105
|
+
|
|
106
|
+
## 参考文档
|
|
107
|
+
|
|
108
|
+
- `.github/rules/` — 强制执行规则(平台约束、格式规范、布局规范、质量标准)
|
|
109
|
+
- `.github/rules/vela-figma-mcp.md` — Figma MCP 使用规范(强制使用 VS Code 内置 MCP 工具)
|
|
110
|
+
- `.github/prompts/` — 知识参考(组件用法、API 参数、最佳实践)
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# Vela 快应用开发
|
|
2
|
+
|
|
3
|
+
## 触发条件
|
|
4
|
+
|
|
5
|
+
当用户消息中包含以下关键词时,**立即自动启动工作流**,无需用户手动引用任何文件:
|
|
6
|
+
- 创建 Vela 快应用 / 创建 Vela 应用
|
|
7
|
+
- 创建小米手表快应用 / 创建小米手表应用
|
|
8
|
+
- Vela 快应用 / vela app / vela quickapp
|
|
9
|
+
- 小米快应用 / 小米穿戴应用
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## 工程体系架构(Harness Engineering)
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
.github/
|
|
17
|
+
├── rules/ ← 编译时约束(alwaysApply,AI 无条件遵守)
|
|
18
|
+
│ ├── vela-platform.md # 平台约束:组件+API+禁止依赖+生命周期
|
|
19
|
+
│ ├── vela-format.md # 格式规范:.ux+manifest+package.json+目录结构
|
|
20
|
+
│ ├── vela-layout.md # 布局规范:CSS+圆屏安全区域
|
|
21
|
+
│ ├── vela-quality.md # 质量标准:命名+错误处理+资源清理+禁止行为
|
|
22
|
+
│ └── project-init.md # 初始化规范:脚手架命令+检查清单
|
|
23
|
+
├── agents/ ← 运行时行为体(纯流程编排,rules 自动注入约束)
|
|
24
|
+
│ ├── vela-workflow.agent.md # 工作流协调器
|
|
25
|
+
│ ├── vela-s1-prd.agent.md # S1 PRD 生成
|
|
26
|
+
│ ├── vela-s2-tech.agent.md # S2 技术方案
|
|
27
|
+
│ ├── vela-s3-coding.agent.md # S3 代码生成
|
|
28
|
+
│ └── vela-knowledge.agent.md # 知识库查询
|
|
29
|
+
└── prompts/ ← 知识参考层(按需加载)
|
|
30
|
+
├── vela-dev-guide.prompt.md # 完整开发指南
|
|
31
|
+
├── vela-components.prompt.md # 组件用法速查
|
|
32
|
+
├── vela-apis.prompt.md # API 速查
|
|
33
|
+
└── vela-best-practices.prompt.md # 最佳实践
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### 设计原则
|
|
37
|
+
|
|
38
|
+
| 层级 | 职责 | 加载方式 | 特点 |
|
|
39
|
+
|------|------|----------|------|
|
|
40
|
+
| **Rules** | 硬约束(什么不能做) | alwaysApply,自动注入 | 不可协商、可验证 |
|
|
41
|
+
| **Agents** | 流程编排(怎么做) | 按任务 handoff 调度 | 关注行为序列 |
|
|
42
|
+
| **Prompts** | 知识参考(做得好) | 按需引用 | 详细文档、示例 |
|
|
43
|
+
|
|
44
|
+
### 核心约束(由 Rules 层自动执行)
|
|
45
|
+
|
|
46
|
+
- 📌 组件白名单 + API 白名单 → `rules/vela-platform.md`
|
|
47
|
+
- 📌 .ux 格式 + manifest + package.json → `rules/vela-format.md`
|
|
48
|
+
- 📌 Flexbox 布局 + 圆屏安全区域 → `rules/vela-layout.md`
|
|
49
|
+
- 📌 命名规范 + 错误处理 + 资源清理 → `rules/vela-quality.md`
|
|
50
|
+
- 📌 脚手架初始化 + 禁止行为清单 → `rules/project-init.md`
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
## 自定义 Agent
|
|
55
|
+
|
|
56
|
+
可在 VS Code Copilot Chat 的 Agent 下拉菜单中选择:
|
|
57
|
+
|
|
58
|
+
| Agent | 用途 |
|
|
59
|
+
|-------|------|
|
|
60
|
+
| `Vela 快应用工作流` | 完整三阶段工作流协调器(PRD → 技术方案 → 代码) |
|
|
61
|
+
| `Vela PRD 生成` | S1 阶段:生成产品需求文档 |
|
|
62
|
+
| `Vela 技术方案` | S2 阶段:生成技术方案 |
|
|
63
|
+
| `Vela 代码生成` | S3 阶段:生成可运行的项目代码(含快速模式) |
|
|
64
|
+
| `Vela 知识库` | 查询组件用法、API 参数、最佳实践 |
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
# Vela 快应用系统 API 参考
|
|
2
|
+
|
|
3
|
+
所有 API 通过 `import xxx from '@system.xxx'` 引入,使用前必须在 manifest.json 的 features 中声明。
|
|
4
|
+
|
|
5
|
+
## 高频 API
|
|
6
|
+
|
|
7
|
+
### router — 页面路由(无需声明)
|
|
8
|
+
```javascript
|
|
9
|
+
import router from '@system.router'
|
|
10
|
+
router.push({ uri: '/pages/detail', params: { id: '1' } })
|
|
11
|
+
router.replace({ uri: '/pages/detail' })
|
|
12
|
+
router.back()
|
|
13
|
+
router.clear()
|
|
14
|
+
router.getLength() / router.getState() / router.getPages()
|
|
15
|
+
```
|
|
16
|
+
接收参数:目标页面 protected(应用内)或 public(应用外)中声明同名属性。
|
|
17
|
+
|
|
18
|
+
### fetch — 网络请求
|
|
19
|
+
声明: `{ "name": "system.fetch" }`
|
|
20
|
+
```javascript
|
|
21
|
+
import fetch from '@system.fetch'
|
|
22
|
+
fetch.fetch({
|
|
23
|
+
url: 'https://api.example.com/data',
|
|
24
|
+
method: 'GET', // GET/POST/PUT/DELETE
|
|
25
|
+
header: { 'Content-Type': 'application/json' },
|
|
26
|
+
data: JSON.stringify({ key: 'value' }),
|
|
27
|
+
responseType: 'json', // text/json/file/arraybuffer
|
|
28
|
+
success(res) { console.log(res.data, res.code, res.headers) },
|
|
29
|
+
fail(data, code) { console.log(code) }
|
|
30
|
+
})
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### storage — 键值存储
|
|
34
|
+
声明: `{ "name": "system.storage" }`
|
|
35
|
+
```javascript
|
|
36
|
+
import storage from '@system.storage'
|
|
37
|
+
storage.set({ key: 'token', value: 'xxx' })
|
|
38
|
+
storage.get({ key: 'token', success(data) { console.log(data) } })
|
|
39
|
+
storage.delete({ key: 'token' })
|
|
40
|
+
storage.clear()
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### prompt — 弹窗提示
|
|
44
|
+
声明: `{ "name": "system.prompt" }`
|
|
45
|
+
```javascript
|
|
46
|
+
import prompt from '@system.prompt'
|
|
47
|
+
prompt.showToast({ message: '操作成功', duration: 2000 })
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### audio — 音频播放
|
|
51
|
+
声明: `{ "name": "system.audio" }`
|
|
52
|
+
```javascript
|
|
53
|
+
import audio from '@system.audio'
|
|
54
|
+
audio.src = '/common/music.mp3'
|
|
55
|
+
audio.volume = 0.8
|
|
56
|
+
audio.play() / audio.pause() / audio.stop()
|
|
57
|
+
audio.onended = function() {}
|
|
58
|
+
audio.getPlayState({ success(data) { /* state, currentTime, duration */ } })
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## 其他 API 速查
|
|
62
|
+
|
|
63
|
+
| API | 声明 | 用途 |
|
|
64
|
+
|-----|------|------|
|
|
65
|
+
| app | system.app | 应用管理 |
|
|
66
|
+
| configuration | system.configuration | 应用配置 |
|
|
67
|
+
| device | system.device | 设备信息 |
|
|
68
|
+
| network | system.network | 网络状态(subscribe/getType) |
|
|
69
|
+
| vibrator | system.vibrator | 振动 |
|
|
70
|
+
| brightness | system.brightness | 屏幕亮度 |
|
|
71
|
+
| volume | system.volume | 音量控制 |
|
|
72
|
+
| battery | system.battery | 电池信息 |
|
|
73
|
+
| geolocation | system.geolocation | 地理位置(需权限) |
|
|
74
|
+
| sensor | system.sensor | 传感器(加速度/陀螺仪/心率) |
|
|
75
|
+
| record | system.record | 录音 |
|
|
76
|
+
| file | system.file | 文件操作(readText/writeText/list/delete/move/copy) |
|
|
77
|
+
| crypto | system.crypto | 加密(rsa/aes/digest/hmac) |
|
|
78
|
+
| request | system.request | 下载管理 |
|
|
79
|
+
| interconnect | system.interconnect | 设备互联 |
|
|
80
|
+
| event | system.event | 系统事件 |
|
|
81
|
+
| alarm | system.alarm | 闹钟 |
|
|
82
|
+
|
|
83
|
+
## 通用错误码
|
|
84
|
+
- 200: 系统通用错误
|
|
85
|
+
- 201: 用户拒绝
|
|
86
|
+
- 202: 参数错误
|
|
87
|
+
- 203: 功能不支持
|
|
88
|
+
- 204: 请求超时
|
|
89
|
+
- 300: I/O 错误
|
|
90
|
+
|
|
91
|
+
## Promise 封装推荐
|
|
92
|
+
```javascript
|
|
93
|
+
function promisify(fn) {
|
|
94
|
+
return (opts = {}) => new Promise((resolve, reject) => {
|
|
95
|
+
fn({ ...opts, success: resolve, fail: (data, code) => reject({ data, code }) })
|
|
96
|
+
})
|
|
97
|
+
}
|
|
98
|
+
```
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
# Vela 快应用最佳实践
|
|
2
|
+
|
|
3
|
+
## 内存优化(手表设备内存有限,必须严格控制)
|
|
4
|
+
|
|
5
|
+
1. **非 UI 数据不放 ViewModel**
|
|
6
|
+
```javascript
|
|
7
|
+
const someObj = { a: 1 } // ✅ 放在 export default 外部
|
|
8
|
+
export default {
|
|
9
|
+
private: {
|
|
10
|
+
someObj: { a: 1 } // ❌ 不需要绑定到 UI 的数据不要放这里
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
2. **数据原地修改,避免重新赋值**
|
|
16
|
+
```javascript
|
|
17
|
+
// ❌ this.list = [{ name: 'bb' }]
|
|
18
|
+
// ✅ this.list[0].name = 'bb'
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
3. **使用 static 标记不变节点**
|
|
22
|
+
```html
|
|
23
|
+
<text static>{{title}}</text>
|
|
24
|
+
<block static><text>{{fixedTitle}}</text></block>
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
4. **页面销毁时清除定时器**
|
|
28
|
+
```javascript
|
|
29
|
+
onDestroy() { if (this.timer) clearTimeout(this.timer) }
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
5. 读取的数据用完后置 null 释放
|
|
33
|
+
6. 调用 `global.runGC()` 手动 GC(不要频繁调用)
|
|
34
|
+
|
|
35
|
+
## 启动性能优化
|
|
36
|
+
|
|
37
|
+
- 避免 setTimeout 延迟跳转,用 async/await
|
|
38
|
+
- Logo 页避免 HTTP 请求
|
|
39
|
+
- 首页数据做本地缓存,先读缓存展示,异步更新
|
|
40
|
+
- UI 先行,不等数据加载完才渲染
|
|
41
|
+
|
|
42
|
+
## 渲染性能优化
|
|
43
|
+
|
|
44
|
+
- list 超过 10 条使用分页渲染
|
|
45
|
+
- 长文案分块渲染,监听 scroll 触底加载
|
|
46
|
+
- Swiper 多图使用懒加载(只保留 3 个子组件动态更新)
|
|
47
|
+
- 减少 border-radius 与背景图同时使用
|
|
48
|
+
- 图片尺寸与组件尺寸保持一致
|
|
49
|
+
- 减少标签嵌套层级
|
|
50
|
+
|
|
51
|
+
## 圆形屏幕安全区域
|
|
52
|
+
|
|
53
|
+
```css
|
|
54
|
+
@media (shape: circle) {
|
|
55
|
+
.container { padding: 50px 36px; }
|
|
56
|
+
}
|
|
57
|
+
@media (shape: rect) {
|
|
58
|
+
.container { padding: 20px 16px; }
|
|
59
|
+
}
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## 图片使用规范
|
|
63
|
+
|
|
64
|
+
- 尽量使用本地图片
|
|
65
|
+
- 在线图片不超过 200KB
|
|
66
|
+
- 首次加载大图增加 loading,下载后缓存到 `internal://files/`
|
|
67
|
+
- 优先 PNG8 格式,用 tinypng.com 压缩
|
|
68
|
+
|
|
69
|
+
## 代码规范
|
|
70
|
+
|
|
71
|
+
- `template` 只能有一个根节点
|
|
72
|
+
- `list-item` 中谨慎使用 if/else/show
|
|
73
|
+
- `image` 的 src 不要用变量拼接路径,直接用完整变量
|
|
74
|
+
- `input` 等无子元素标签必须自闭合
|
|
75
|
+
- 角度 CSS 属性必须带单位: `rotate: 360deg`
|
|
76
|
+
|
|
77
|
+
## 异常处理
|
|
78
|
+
|
|
79
|
+
- 网络异常给用户提示
|
|
80
|
+
- 空数据/接口错误要有兜底
|
|
81
|
+
- 添加 try-catch 捕获 JS 异常
|
|
82
|
+
- 按钮防重复点击
|
|
83
|
+
- onShow 中的 fetch 注意息屏亮屏会重新触发
|
|
84
|
+
|
|
85
|
+
## 国际化(i18n)
|
|
86
|
+
|
|
87
|
+
```html
|
|
88
|
+
<text>{{ $t('message.hello') }}</text>
|
|
89
|
+
```
|
|
90
|
+
```javascript
|
|
91
|
+
this.$t('message.hello')
|
|
92
|
+
```
|
|
93
|
+
文件: `src/i18n/zh-CN.json`, `src/i18n/defaults.json`
|