openmatrix 0.2.31 → 0.2.34
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 +154 -154
- package/dist/cli/commands/approve.js +35 -1
- package/dist/cli/commands/auto.js +2 -2
- package/dist/cli/commands/check-gitignore.js +34 -30
- package/dist/cli/commands/check.js +1 -1
- package/dist/cli/commands/complete.js +35 -7
- package/dist/cli/commands/debug.js +2 -1
- package/dist/cli/commands/deploy.js +1 -1
- package/dist/cli/commands/install-skills.js +3 -0
- package/dist/cli/commands/meeting.js +37 -1
- package/dist/cli/commands/report.js +1 -1
- package/dist/cli/commands/resume.js +35 -1
- package/dist/cli/commands/retry.js +130 -56
- package/dist/cli/commands/start.js +1 -1
- package/dist/cli/commands/status.js +32 -29
- package/dist/cli/commands/step.js +4 -1
- package/dist/orchestrator/ai-reviewer.d.ts +5 -0
- package/dist/orchestrator/ai-reviewer.js +9 -2
- package/dist/orchestrator/context-collector.js +17 -5
- package/dist/orchestrator/executor.d.ts +8 -0
- package/dist/orchestrator/executor.js +24 -5
- package/dist/orchestrator/phase-executor.d.ts +4 -0
- package/dist/orchestrator/phase-executor.js +21 -4
- package/dist/storage/file-store.js +8 -0
- package/dist/storage/state-manager.js +52 -19
- package/dist/test/generator.js +113 -113
- package/dist/utils/error-handler.d.ts +18 -0
- package/dist/utils/error-handler.js +32 -0
- package/dist/utils/worktree-sync.js +24 -3
- package/package.json +61 -61
- package/skills/auto.md +410 -413
- package/skills/brainstorm.md +19 -12
- package/skills/debug.md +694 -691
- package/skills/deploy.md +658 -658
- package/skills/feature.md +713 -686
- package/skills/{SKILL.md → openmatrix-overview.md} +52 -53
- package/skills/plan.md +298 -296
- package/skills/report.md +9 -5
- package/skills/resume.md +292 -287
- package/skills/start.md +32 -20
- package/skills/status.md +5 -4
- package/skills/test.md +875 -875
- package/dist/agents/base-agent.d.ts +0 -46
- package/dist/agents/base-agent.js +0 -17
- package/dist/cli/commands/analyze.d.ts +0 -2
- package/dist/cli/commands/analyze.js +0 -50
- package/dist/orchestrator/smart-question-analyzer.d.ts +0 -90
- package/dist/orchestrator/smart-question-analyzer.js +0 -512
package/skills/deploy.md
CHANGED
|
@@ -1,658 +1,658 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: om:deploy
|
|
3
|
-
description: "Triggers on DEPLOYMENT intent: user wants to deploy, publish, set up environments, or create deployment scripts. DO NOT trigger on: development tasks, status checks, or debugging."
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
<INTENT-JUDGMENT>
|
|
7
|
-
## 意图判断指南
|
|
8
|
-
|
|
9
|
-
**AI 应根据用户语义判断意图:**
|
|
10
|
-
|
|
11
|
-
### 触发信号(部署意图)
|
|
12
|
-
|
|
13
|
-
- 用户想部署/发布项目
|
|
14
|
-
- 需要配置 Docker/Kubernetes
|
|
15
|
-
- 环境搭建需求
|
|
16
|
-
- 生成部署脚本
|
|
17
|
-
- 发布到生产环境
|
|
18
|
-
|
|
19
|
-
### 不触发信号
|
|
20
|
-
|
|
21
|
-
| 用户意图 | 应调用 |
|
|
22
|
-
|---------|--------|
|
|
23
|
-
| 实现功能 | /om:start |
|
|
24
|
-
| 修复 bug | /om:debug 或 /om:start |
|
|
25
|
-
| 查看状态 | /om:status |
|
|
26
|
-
|
|
27
|
-
### 示例判断
|
|
28
|
-
|
|
29
|
-
| 用户消息 | 判断 | 结果 |
|
|
30
|
-
|---------|------|------|
|
|
31
|
-
| "部署到服务器" | 部署意图 | 触发 ✓ |
|
|
32
|
-
| "用 Docker 运行" | 环境配置意图 | 触发 ✓ |
|
|
33
|
-
| "发布 npm 包" | 发布意图 | 触发 ✓ |
|
|
34
|
-
| "实现 API 接口" | 开发意图 | /om:start |
|
|
35
|
-
| "为什么部署失败" | 调查意图 | /om:debug |
|
|
36
|
-
</INTENT-JUDGMENT>
|
|
37
|
-
|
|
38
|
-
<NO-OTHER-SKILLS>
|
|
39
|
-
本 skill 与其他任务编排技能功能重叠,请勿同时使用。
|
|
40
|
-
</NO-OTHER-SKILLS>
|
|
41
|
-
|
|
42
|
-
<objective>
|
|
43
|
-
智能部署助手:自动分析项目文件和系统环境 → 推荐当前环境下最可行的部署方案 → 用户确认后执行 → 生成可复用的一键脚本。
|
|
44
|
-
</objective>
|
|
45
|
-
|
|
46
|
-
<process>
|
|
47
|
-
|
|
48
|
-
## Step 1: 读取历史部署配置
|
|
49
|
-
|
|
50
|
-
```bash
|
|
51
|
-
cat .openmatrix/deploy-config.json 2>/dev/null || echo "NO_HISTORY"
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
**如果有历史配置:**
|
|
55
|
-
- 对比上次记录的关键文件和当前实际文件
|
|
56
|
-
- 判断是否有变更
|
|
57
|
-
|
|
58
|
-
```bash
|
|
59
|
-
# 对比关键文件是否存在变化
|
|
60
|
-
ls -la Dockerfile docker-compose.yml Makefile Taskfile.yml 2>/dev/null
|
|
61
|
-
cat package.json 2>/dev/null | grep -E '"(deploy|start|build)"'
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
**变更检测结果:**
|
|
65
|
-
| 状态 | 处理 |
|
|
66
|
-
|------|------|
|
|
67
|
-
| 无历史配置 | 正常流程(分析+询问) |
|
|
68
|
-
| 无变更 | 直接使用上次配置,仅确认一次 |
|
|
69
|
-
| 有变更 | 重新分析并询问 |
|
|
70
|
-
|
|
71
|
-
---
|
|
72
|
-
|
|
73
|
-
## Step 2: 分析项目文件
|
|
74
|
-
|
|
75
|
-
直接读取项目文件,不调用 CLI:
|
|
76
|
-
|
|
77
|
-
```bash
|
|
78
|
-
# 项目配置文件
|
|
79
|
-
ls -la Dockerfile docker-compose.yml docker-compose.yaml Makefile Taskfile.yml Taskfile.yaml 2>/dev/null
|
|
80
|
-
ls -la k8s/ helm/ .github/workflows/ 2>/dev/null
|
|
81
|
-
cat package.json 2>/dev/null
|
|
82
|
-
cat go.mod 2>/dev/null
|
|
83
|
-
cat Cargo.toml 2>/dev/null
|
|
84
|
-
cat requirements.txt pyproject.toml 2>/dev/null
|
|
85
|
-
```
|
|
86
|
-
|
|
87
|
-
提取关键信息:
|
|
88
|
-
- 项目类型(Node.js/Go/Python/Rust/Java 等)
|
|
89
|
-
- 已有部署配置(Dockerfile、docker-compose、Makefile、k8s 等)
|
|
90
|
-
- package.json 中的 scripts(build/start/deploy 等)
|
|
91
|
-
|
|
92
|
-
---
|
|
93
|
-
|
|
94
|
-
## Step 2.1: 检测并优化依赖源
|
|
95
|
-
|
|
96
|
-
检测项目使用的包管理器和镜像源,如果是国外慢源则建议替换为国内镜像:
|
|
97
|
-
|
|
98
|
-
```bash
|
|
99
|
-
# npm/yarn/pnpm 源
|
|
100
|
-
npm config get registry 2>/dev/null
|
|
101
|
-
cat .npmrc 2>/dev/null
|
|
102
|
-
cat .yarnrc 2>/dev/null
|
|
103
|
-
cat .yarnrc.yml 2>/dev/null
|
|
104
|
-
|
|
105
|
-
# pip 源
|
|
106
|
-
cat pip.conf 2>/dev/null
|
|
107
|
-
pip config get global.index-url 2>/dev/null
|
|
108
|
-
|
|
109
|
-
# Docker 镜像源
|
|
110
|
-
cat /etc/docker/daemon.json 2>/dev/null
|
|
111
|
-
cat ~/.docker/daemon.json 2>/dev/null
|
|
112
|
-
|
|
113
|
-
# Go 代理
|
|
114
|
-
go env GOPROXY 2>/dev/null
|
|
115
|
-
|
|
116
|
-
# Rust 源
|
|
117
|
-
cat ~/.cargo/config.toml 2>/dev/null
|
|
118
|
-
|
|
119
|
-
# Gradle/Maven 源
|
|
120
|
-
cat build.gradle 2>/dev/null | grep -i "repositories" -A 5
|
|
121
|
-
cat pom.xml 2>/dev/null | grep -i "mirror" -A 5
|
|
122
|
-
```
|
|
123
|
-
|
|
124
|
-
**AI 分析源速度,如果检测到国外源,建议替换:**
|
|
125
|
-
|
|
126
|
-
| 包管理器 | 国外源 | 国内镜像 |
|
|
127
|
-
|---------|--------|---------|
|
|
128
|
-
| npm/yarn/pnpm | registry.npmjs.org | https://registry.npmmirror.com |
|
|
129
|
-
| pip | pypi.org | https://pypi.tuna.tsinghua.edu.cn/simple |
|
|
130
|
-
| Docker | docker.io | mirror.ccs.tencentyun.com |
|
|
131
|
-
| Go | proxy.golang.org | https://goproxy.cn,direct |
|
|
132
|
-
| Rust/Cargo | crates.io | https://rsproxy.cn/crates.io-index |
|
|
133
|
-
| Gradle/Maven | repo.maven.apache.org | https://maven.aliyun.com/repository/public |
|
|
134
|
-
|
|
135
|
-
**如果检测到慢源,输出建议并询问:**
|
|
136
|
-
|
|
137
|
-
```
|
|
138
|
-
AskUserQuestion:
|
|
139
|
-
header: "镜像源"
|
|
140
|
-
question: "检测到 npm 使用官方源(registry.npmjs.org),国内访问较慢。是否切换到国内镜像?"
|
|
141
|
-
|
|
142
|
-
options:
|
|
143
|
-
- label: "切换到淘宝镜像 (推荐)"
|
|
144
|
-
description: "npmmirror.com,国内速度快,同步延迟 < 10 分钟"
|
|
145
|
-
- label: "保持不变"
|
|
146
|
-
description: "当前源可用,不需要切换"
|
|
147
|
-
- label: "使用其他镜像"
|
|
148
|
-
description: "指定自定义镜像地址"
|
|
149
|
-
```
|
|
150
|
-
|
|
151
|
-
**用户确认后执行切换:**
|
|
152
|
-
```bash
|
|
153
|
-
# npm
|
|
154
|
-
npm config set registry https://registry.npmmirror.com
|
|
155
|
-
|
|
156
|
-
# pip
|
|
157
|
-
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
|
|
158
|
-
|
|
159
|
-
# Go
|
|
160
|
-
go env -w GOPROXY=https://goproxy.cn,direct
|
|
161
|
-
|
|
162
|
-
# Dockerfile 中的 apt 源(如果有)
|
|
163
|
-
# AI 读取 Dockerfile,将 archive.ubuntu.com 替换为 mirrors.aliyun.com
|
|
164
|
-
```
|
|
165
|
-
|
|
166
|
-
---
|
|
167
|
-
|
|
168
|
-
## Step 3: 检测系统环境
|
|
169
|
-
|
|
170
|
-
```bash
|
|
171
|
-
# 检测已安装的工具
|
|
172
|
-
docker --version 2>/dev/null && echo "docker:ok" || echo "docker:missing"
|
|
173
|
-
docker-compose --version 2>/dev/null && echo "docker-compose:ok" || echo "docker-compose:missing"
|
|
174
|
-
kubectl version --client 2>/dev/null && echo "kubectl:ok" || echo "kubectl:missing"
|
|
175
|
-
make --version 2>/dev/null && echo "make:ok" || echo "make:missing"
|
|
176
|
-
task --version 2>/dev/null && echo "task:ok" || echo "task:missing"
|
|
177
|
-
pm2 --version 2>/dev/null && echo "pm2:ok" || echo "pm2:missing"
|
|
178
|
-
node --version 2>/dev/null && echo "node:ok" || echo "node:missing"
|
|
179
|
-
|
|
180
|
-
# 操作系统
|
|
181
|
-
uname -s 2>/dev/null || echo "Windows"
|
|
182
|
-
```
|
|
183
|
-
|
|
184
|
-
---
|
|
185
|
-
|
|
186
|
-
## Step 4: AI 分析并展示环境报告
|
|
187
|
-
|
|
188
|
-
基于收集到的信息,直接输出分析报告(不用 AskUserQuestion):
|
|
189
|
-
|
|
190
|
-
```markdown
|
|
191
|
-
## 🔍 环境分析报告
|
|
192
|
-
|
|
193
|
-
**项目**: [名称] ([类型])
|
|
194
|
-
**操作系统**: [Linux/macOS/Windows]
|
|
195
|
-
|
|
196
|
-
### 已检测到的部署配置
|
|
197
|
-
- ✅ Dockerfile
|
|
198
|
-
- ✅ docker-compose.yml
|
|
199
|
-
- ❌ Makefile(未找到)
|
|
200
|
-
|
|
201
|
-
### 已安装的工具
|
|
202
|
-
- ✅ Docker 24.0.5
|
|
203
|
-
- ✅ make 4.3
|
|
204
|
-
- ❌ task(未安装)
|
|
205
|
-
- ❌ pm2(未安装)
|
|
206
|
-
```
|
|
207
|
-
|
|
208
|
-
---
|
|
209
|
-
|
|
210
|
-
## Step 5: 推荐部署方案(带理由)
|
|
211
|
-
|
|
212
|
-
AI 根据"项目配置 × 已安装工具"交叉分析,用 AskUserQuestion 展示推荐方案:
|
|
213
|
-
|
|
214
|
-
**推荐逻辑(AI 自行判断,不是硬编码):**
|
|
215
|
-
- 有 Dockerfile + docker 已安装 → Docker 是最直接的选择
|
|
216
|
-
- 有 docker-compose + 多服务 → Docker Compose 更合适
|
|
217
|
-
- 有 k8s 配置 + kubectl 已安装 → Kubernetes
|
|
218
|
-
- 有 Makefile + make 已安装 → 直接用 make
|
|
219
|
-
- Node.js + pm2 已安装 → PM2 轻量方案
|
|
220
|
-
- 什么都没有 → AI 根据项目类型推荐创建配置
|
|
221
|
-
|
|
222
|
-
```
|
|
223
|
-
AskUserQuestion:
|
|
224
|
-
header: "部署方案"
|
|
225
|
-
question: "基于你的环境分析,推荐以下方案(已标注推荐原因):"
|
|
226
|
-
|
|
227
|
-
options:
|
|
228
|
-
- label: "Docker (推荐)"
|
|
229
|
-
description: "已有 Dockerfile + Docker 已安装,直接可用,环境隔离好"
|
|
230
|
-
- label: "Docker Compose"
|
|
231
|
-
description: "检测到 docker-compose.yml,适合多服务编排"
|
|
232
|
-
- label: "Make"
|
|
233
|
-
description: "已有 Makefile + make 已安装,运行 make deploy"
|
|
234
|
-
- label: "npm scripts"
|
|
235
|
-
description: "无需额外工具,直接用 package.json 中的 scripts"
|
|
236
|
-
```
|
|
237
|
-
|
|
238
|
-
---
|
|
239
|
-
|
|
240
|
-
## Step 6: 确认部署环境
|
|
241
|
-
|
|
242
|
-
```
|
|
243
|
-
AskUserQuestion:
|
|
244
|
-
header: "目标环境"
|
|
245
|
-
question: "部署到哪个环境?"
|
|
246
|
-
|
|
247
|
-
options:
|
|
248
|
-
- label: "本地开发 (推荐)"
|
|
249
|
-
description: "快速启动,用于开发调试"
|
|
250
|
-
- label: "测试环境"
|
|
251
|
-
description: "模拟生产配置,用于验证"
|
|
252
|
-
- label: "生产环境"
|
|
253
|
-
description: "需要完整配置和安全检查"
|
|
254
|
-
```
|
|
255
|
-
|
|
256
|
-
---
|
|
257
|
-
|
|
258
|
-
## Step 6.1: 生成部署任务清单
|
|
259
|
-
|
|
260
|
-
根据前面的分析和用户选择,将所有部署步骤写入 TodoWrite,逐条执行:
|
|
261
|
-
|
|
262
|
-
**示例(Docker 本地部署 + 源优化 + 脚本生成):**
|
|
263
|
-
|
|
264
|
-
```typescript
|
|
265
|
-
TodoWrite({
|
|
266
|
-
todos: [
|
|
267
|
-
{ content: "切换 npm 源到淘宝镜像", activeForm: "正在切换 npm 镜像源", status: "pending" },
|
|
268
|
-
{ content: "构建 Docker 镜像", activeForm: "正在构建 Docker 镜像", status: "pending" },
|
|
269
|
-
{ content: "启动容器", activeForm: "正在启动容器", status: "pending" },
|
|
270
|
-
{ content: "验证部署:容器状态", activeForm: "正在检查容器状态", status: "pending" },
|
|
271
|
-
{ content: "验证部署:端口监听", activeForm: "正在检查端口", status: "pending" },
|
|
272
|
-
{ content: "验证部署:HTTP 连通", activeForm: "正在验证 HTTP 连通性", status: "pending" },
|
|
273
|
-
{ content: "生成 Taskfile.yml 一键脚本", activeForm: "正在生成一键脚本", status: "pending" },
|
|
274
|
-
{ content: "保存部署配置", activeForm: "正在保存部署配置", status: "pending" }
|
|
275
|
-
]
|
|
276
|
-
})
|
|
277
|
-
```
|
|
278
|
-
|
|
279
|
-
**任务清单根据实际情况动态生成:**
|
|
280
|
-
- 需要切换源 → 加入源切换任务
|
|
281
|
-
- 需要生成 Dockerfile → 加入生成任务
|
|
282
|
-
- 多服务 → 每个服务一条任务
|
|
283
|
-
- 选择生成脚本 → 加入脚本生成任务
|
|
284
|
-
|
|
285
|
-
**执行规则:**
|
|
286
|
-
- 每次只执行一条,完成后立即标记 completed
|
|
287
|
-
- 失败时停止,输出错误信息
|
|
288
|
-
- 用户可以看到整体进度
|
|
289
|
-
|
|
290
|
-
---
|
|
291
|
-
|
|
292
|
-
## Step 7: 执行部署
|
|
293
|
-
|
|
294
|
-
根据用户选择,AI 执行对应命令:
|
|
295
|
-
|
|
296
|
-
**Docker 本地:**
|
|
297
|
-
```bash
|
|
298
|
-
docker build -t <project-name> .
|
|
299
|
-
docker run -d -p <port>:<port> --name <project-name> <project-name>
|
|
300
|
-
```
|
|
301
|
-
|
|
302
|
-
**Docker Compose:**
|
|
303
|
-
```bash
|
|
304
|
-
docker-compose up -d --build
|
|
305
|
-
```
|
|
306
|
-
|
|
307
|
-
**Make:**
|
|
308
|
-
```bash
|
|
309
|
-
make deploy
|
|
310
|
-
```
|
|
311
|
-
|
|
312
|
-
**npm scripts:**
|
|
313
|
-
```bash
|
|
314
|
-
npm run build
|
|
315
|
-
npm run start &
|
|
316
|
-
```
|
|
317
|
-
|
|
318
|
-
---
|
|
319
|
-
|
|
320
|
-
## Step 7.1: 自动验证部署结果
|
|
321
|
-
|
|
322
|
-
执行部署后,AI 自动执行以下验证(按顺序,全部通过才算成功):
|
|
323
|
-
|
|
324
|
-
**1. 检查容器/进程状态:**
|
|
325
|
-
```bash
|
|
326
|
-
# Docker
|
|
327
|
-
docker ps --format "{{.Names}}\t{{.Status}}" | grep <project-name>
|
|
328
|
-
|
|
329
|
-
# Docker Compose
|
|
330
|
-
docker-compose ps
|
|
331
|
-
|
|
332
|
-
# PM2
|
|
333
|
-
pm2 list
|
|
334
|
-
|
|
335
|
-
# 进程检查
|
|
336
|
-
ps aux | grep <project-name>
|
|
337
|
-
```
|
|
338
|
-
|
|
339
|
-
**2. 检查端口是否在监听:**
|
|
340
|
-
```bash
|
|
341
|
-
# Linux/Mac
|
|
342
|
-
lsof -i :<port> 2>/dev/null || netstat -tlnp 2>/dev/null | grep <port>
|
|
343
|
-
|
|
344
|
-
# Windows
|
|
345
|
-
netstat -ano | findstr :<port>
|
|
346
|
-
```
|
|
347
|
-
|
|
348
|
-
**3. HTTP 连通性验证(核心验证):**
|
|
349
|
-
```bash
|
|
350
|
-
# 等待服务启动(最多重试 5 次,每次间隔 2 秒)
|
|
351
|
-
for i in 1 2 3 4 5; do
|
|
352
|
-
STATUS=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:<port>/ 2>/dev/null)
|
|
353
|
-
if [ "$STATUS" -ge 200 ] && [ "$STATUS" -lt 400 ]; then
|
|
354
|
-
echo "HTTP $STATUS OK"
|
|
355
|
-
break
|
|
356
|
-
fi
|
|
357
|
-
sleep 2
|
|
358
|
-
done
|
|
359
|
-
|
|
360
|
-
# 获取响应内容摘要
|
|
361
|
-
curl -s http://localhost:<port>/ 2>/dev/null | head -20
|
|
362
|
-
```
|
|
363
|
-
|
|
364
|
-
**4. 健康检查端点(如果存在):**
|
|
365
|
-
```bash
|
|
366
|
-
curl -s http://localhost:<port>/health 2>/dev/null
|
|
367
|
-
curl -s http://localhost:<port>/api/health 2>/dev/null
|
|
368
|
-
curl -s http://localhost:<port>/healthz 2>/dev/null
|
|
369
|
-
```
|
|
370
|
-
|
|
371
|
-
**5. 浏览器可访问性验证(Web 项目):**
|
|
372
|
-
|
|
373
|
-
如果是 Web 项目,使用 Playwright 工具打开浏览器验证页面是否正常加载:
|
|
374
|
-
```
|
|
375
|
-
browser_navigate: http://localhost:<port>/
|
|
376
|
-
browser_snapshot: 检查页面是否正常渲染
|
|
377
|
-
browser_take_screenshot: 截图保存验证结果
|
|
378
|
-
browser_close
|
|
379
|
-
```
|
|
380
|
-
|
|
381
|
-
如果无法使用浏览器工具,输出可访问的 URL 供用户手动验证:
|
|
382
|
-
```
|
|
383
|
-
🌐 请在浏览器中访问: http://localhost:<port>/
|
|
384
|
-
```
|
|
385
|
-
|
|
386
|
-
**6. 日志检查(任何验证失败时):**
|
|
387
|
-
```bash
|
|
388
|
-
# Docker 日志
|
|
389
|
-
docker logs <project-name> --tail 50
|
|
390
|
-
|
|
391
|
-
# PM2 日志
|
|
392
|
-
pm2 logs <project-name> --lines 50
|
|
393
|
-
```
|
|
394
|
-
|
|
395
|
-
---
|
|
396
|
-
|
|
397
|
-
## Step 7.2: 输出验证报告
|
|
398
|
-
|
|
399
|
-
AI 根据验证结果输出状态报告:
|
|
400
|
-
|
|
401
|
-
**验证成功:**
|
|
402
|
-
```markdown
|
|
403
|
-
## ✅ 部署验证报告
|
|
404
|
-
|
|
405
|
-
**服务状态**: 运行中 (Up 2 minutes)
|
|
406
|
-
**端口**: 3000 已监听
|
|
407
|
-
**HTTP 连通**: http://localhost:3000/ → 200 OK
|
|
408
|
-
**健康检查**: /health → 200 OK
|
|
409
|
-
|
|
410
|
-
### 验证清单
|
|
411
|
-
- ✅ 容器/进程正常运行
|
|
412
|
-
- ✅ 端口 3000 已监听
|
|
413
|
-
- ✅ HTTP 请求返回 200
|
|
414
|
-
- ✅ 页面可正常访问
|
|
415
|
-
|
|
416
|
-
### 访问地址
|
|
417
|
-
🌐 http://localhost:3000/
|
|
418
|
-
|
|
419
|
-
### 快捷命令
|
|
420
|
-
- 查看日志: docker logs -f <project-name>
|
|
421
|
-
- 停止服务: docker stop <project-name>
|
|
422
|
-
- 重启服务: docker restart <project-name>
|
|
423
|
-
```
|
|
424
|
-
|
|
425
|
-
**验证失败:**
|
|
426
|
-
```markdown
|
|
427
|
-
## ❌ 部署验证失败
|
|
428
|
-
|
|
429
|
-
**问题**: 容器启动后立即退出
|
|
430
|
-
**状态**: Exited (1)
|
|
431
|
-
|
|
432
|
-
### 错误日志(最近 20 行)
|
|
433
|
-
<显示 docker logs 输出>
|
|
434
|
-
|
|
435
|
-
### 建议修复
|
|
436
|
-
1. 检查 Dockerfile 配置
|
|
437
|
-
2. 检查启动命令是否正确
|
|
438
|
-
3. 查看完整日志: docker logs <project-name>
|
|
439
|
-
```
|
|
440
|
-
|
|
441
|
-
验证失败时,询问用户是否要查看完整日志或尝试修复。
|
|
442
|
-
|
|
443
|
-
---
|
|
444
|
-
|
|
445
|
-
## Step 8: 询问是否生成一键脚本
|
|
446
|
-
|
|
447
|
-
```
|
|
448
|
-
AskUserQuestion:
|
|
449
|
-
header: "一键脚本"
|
|
450
|
-
question: "部署完成!是否生成一键脚本方便后续开发调试?"
|
|
451
|
-
|
|
452
|
-
options:
|
|
453
|
-
- label: "生成 Taskfile.yml (推荐)"
|
|
454
|
-
description: "task 已安装 / 现代化工具,YAML 格式简洁,跨平台"
|
|
455
|
-
- label: "生成 Makefile"
|
|
456
|
-
description: "make 已安装 / 经典工具,已有 Makefile 时保持一致"
|
|
457
|
-
- label: "添加到 npm scripts"
|
|
458
|
-
description: "Node.js 项目,无需额外工具"
|
|
459
|
-
- label: "不需要"
|
|
460
|
-
description: "已有足够配置"
|
|
461
|
-
```
|
|
462
|
-
|
|
463
|
-
---
|
|
464
|
-
|
|
465
|
-
## Step 9: 生成一键脚本
|
|
466
|
-
|
|
467
|
-
根据用户选择和项目实际情况,用 Write 工具生成脚本。
|
|
468
|
-
|
|
469
|
-
**Taskfile.yml 示例(根据实际项目定制):**
|
|
470
|
-
```yaml
|
|
471
|
-
version: '3'
|
|
472
|
-
|
|
473
|
-
vars:
|
|
474
|
-
APP: '{{.APP | default "app"}}'
|
|
475
|
-
PORT: '{{.PORT | default "3000"}}'
|
|
476
|
-
|
|
477
|
-
tasks:
|
|
478
|
-
setup:
|
|
479
|
-
desc: 安装依赖
|
|
480
|
-
cmds:
|
|
481
|
-
- npm install
|
|
482
|
-
|
|
483
|
-
build:
|
|
484
|
-
desc: 构建项目
|
|
485
|
-
cmds:
|
|
486
|
-
- npm run build
|
|
487
|
-
|
|
488
|
-
test:
|
|
489
|
-
desc: 运行测试
|
|
490
|
-
cmds:
|
|
491
|
-
- npm test
|
|
492
|
-
|
|
493
|
-
dev:
|
|
494
|
-
desc: 本地开发(热重载)
|
|
495
|
-
cmds:
|
|
496
|
-
- npm run dev
|
|
497
|
-
|
|
498
|
-
deploy:local:
|
|
499
|
-
desc: 本地 Docker 部署
|
|
500
|
-
cmds:
|
|
501
|
-
- docker build -t {{.APP}} .
|
|
502
|
-
- docker run -d -p {{.PORT}}:{{.PORT}} --name {{.APP}} {{.APP}}
|
|
503
|
-
- echo "✅ 服务已启动 http://localhost:{{.PORT}}"
|
|
504
|
-
|
|
505
|
-
deploy:prod:
|
|
506
|
-
desc: 生产部署
|
|
507
|
-
cmds:
|
|
508
|
-
- docker build -t {{.APP}}:{{.VERSION}} .
|
|
509
|
-
- docker push {{.REGISTRY}}/{{.APP}}:{{.VERSION}}
|
|
510
|
-
|
|
511
|
-
logs:
|
|
512
|
-
desc: 查看日志
|
|
513
|
-
cmds:
|
|
514
|
-
- docker logs -f {{.APP}}
|
|
515
|
-
|
|
516
|
-
stop:
|
|
517
|
-
desc: 停止服务
|
|
518
|
-
cmds:
|
|
519
|
-
- docker stop {{.APP}} && docker rm {{.APP}}
|
|
520
|
-
```
|
|
521
|
-
|
|
522
|
-
**Makefile 示例(根据实际项目定制):**
|
|
523
|
-
```makefile
|
|
524
|
-
APP ?= app
|
|
525
|
-
PORT ?= 3000
|
|
526
|
-
|
|
527
|
-
.PHONY: setup build test dev deploy-local deploy-prod logs stop
|
|
528
|
-
|
|
529
|
-
setup:
|
|
530
|
-
npm install
|
|
531
|
-
|
|
532
|
-
build:
|
|
533
|
-
npm run build
|
|
534
|
-
|
|
535
|
-
test:
|
|
536
|
-
npm test
|
|
537
|
-
|
|
538
|
-
dev:
|
|
539
|
-
npm run dev
|
|
540
|
-
|
|
541
|
-
deploy-local:
|
|
542
|
-
docker build -t $(APP) .
|
|
543
|
-
docker run -d -p $(PORT):$(PORT) --name $(APP) $(APP)
|
|
544
|
-
@echo "✅ 服务已启动 http://localhost:$(PORT)"
|
|
545
|
-
|
|
546
|
-
deploy-prod:
|
|
547
|
-
docker build -t $(APP):$(VERSION) .
|
|
548
|
-
docker push $(REGISTRY)/$(APP):$(VERSION)
|
|
549
|
-
|
|
550
|
-
logs:
|
|
551
|
-
docker logs -f $(APP)
|
|
552
|
-
|
|
553
|
-
stop:
|
|
554
|
-
docker stop $(APP) && docker rm $(APP)
|
|
555
|
-
```
|
|
556
|
-
|
|
557
|
-
---
|
|
558
|
-
|
|
559
|
-
## Step 10: 保存部署配置
|
|
560
|
-
|
|
561
|
-
将用户选择的部署方式保存到 `.openmatrix/deploy-config.json`:
|
|
562
|
-
|
|
563
|
-
```json
|
|
564
|
-
{
|
|
565
|
-
"deployMethod": "docker",
|
|
566
|
-
"envType": "local",
|
|
567
|
-
"scriptTool": "taskfile",
|
|
568
|
-
"lastDetectedFiles": {
|
|
569
|
-
"Dockerfile": true,
|
|
570
|
-
"docker-compose.yml": false,
|
|
571
|
-
"Makefile": false,
|
|
572
|
-
"package.json": true
|
|
573
|
-
},
|
|
574
|
-
"lastDetectedTools": {
|
|
575
|
-
"docker": "24.0.5",
|
|
576
|
-
"make": "4.3",
|
|
577
|
-
"task": null
|
|
578
|
-
},
|
|
579
|
-
"timestamp": "2026-04-22T15:00:00Z"
|
|
580
|
-
}
|
|
581
|
-
```
|
|
582
|
-
|
|
583
|
-
下次运行时,对比 `lastDetectedFiles` 和当前实际文件状态,判断是否需要重新询问。
|
|
584
|
-
|
|
585
|
-
---
|
|
586
|
-
|
|
587
|
-
## Step 11: 输出总结
|
|
588
|
-
|
|
589
|
-
```markdown
|
|
590
|
-
## ✅ 部署完成
|
|
591
|
-
|
|
592
|
-
**方案**: Docker 本地部署
|
|
593
|
-
**环境**: 本地开发
|
|
594
|
-
**脚本**: 已生成 Taskfile.yml
|
|
595
|
-
|
|
596
|
-
### 常用命令
|
|
597
|
-
- `task dev` — 本地开发
|
|
598
|
-
- `task deploy:local` — Docker 本地部署
|
|
599
|
-
- `task deploy:prod` — 生产部署
|
|
600
|
-
- `task logs` — 查看日志
|
|
601
|
-
- `task stop` — 停止服务
|
|
602
|
-
```
|
|
603
|
-
|
|
604
|
-
</process>
|
|
605
|
-
|
|
606
|
-
<arguments>
|
|
607
|
-
$ARGUMENTS
|
|
608
|
-
</arguments>
|
|
609
|
-
|
|
610
|
-
<examples>
|
|
611
|
-
/om:deploy # 自动分析 → 推荐方案 → 执行 → 生成脚本
|
|
612
|
-
/om:deploy local # 直接指定本地环境
|
|
613
|
-
/om:deploy prod # 直接指定生产环境
|
|
614
|
-
</examples>
|
|
615
|
-
|
|
616
|
-
<notes>
|
|
617
|
-
## 核心原则
|
|
618
|
-
|
|
619
|
-
1. **AI 是分析者**:读取真实文件和系统状态,不靠硬编码规则推断
|
|
620
|
-
2. **AI 是执行者**:用户确认后直接运行命令,不只是给建议
|
|
621
|
-
3. **推荐最可行的**:基于"当前系统已有什么工具",不是"理论上最好的"
|
|
622
|
-
4. **产出可复用脚本**:最终生成 Taskfile/Makefile,方便后续开发调试
|
|
623
|
-
5. **记录上次选择**:保存部署配置,下次未变化时直接复用,减少重复询问
|
|
624
|
-
|
|
625
|
-
## 历史配置复用
|
|
626
|
-
|
|
627
|
-
`.openmatrix/deploy-config.json` 存储上次部署选择:
|
|
628
|
-
- 对比 `lastDetectedFiles` 和当前文件状态
|
|
629
|
-
- 状态一致 → 直接使用上次配置,仅确认一次
|
|
630
|
-
- 状态变化 → 重新分析并询问
|
|
631
|
-
|
|
632
|
-
变更检测:
|
|
633
|
-
- Dockerfile/docker-compose.yml/Makefile 新增或删除
|
|
634
|
-
- package.json scripts 变化
|
|
635
|
-
- 系统工具安装状态变化
|
|
636
|
-
|
|
637
|
-
## 推荐决策依据(AI 自行判断)
|
|
638
|
-
|
|
639
|
-
| 项目配置 | 系统工具 | 推荐方案 |
|
|
640
|
-
|---------|---------|---------|
|
|
641
|
-
| 有 Dockerfile | docker 已安装 | Docker |
|
|
642
|
-
| 有 docker-compose | docker-compose 已安装 | Docker Compose |
|
|
643
|
-
| 有 k8s/ | kubectl 已安装 | Kubernetes |
|
|
644
|
-
| 有 Makefile | make 已安装 | Make |
|
|
645
|
-
| Node.js | pm2 已安装 | PM2 |
|
|
646
|
-
| Node.js | 无特殊工具 | npm scripts |
|
|
647
|
-
| 无任何配置 | docker 已安装 | 生成 Dockerfile |
|
|
648
|
-
| 无任何配置 | 无工具 | npm scripts / shell 脚本 |
|
|
649
|
-
|
|
650
|
-
## 脚本工具选择依据
|
|
651
|
-
|
|
652
|
-
| 条件 | 推荐 |
|
|
653
|
-
|------|------|
|
|
654
|
-
| task 已安装 | Taskfile.yml |
|
|
655
|
-
| make 已安装 / 已有 Makefile | Makefile |
|
|
656
|
-
| Node.js 项目 / 无工具 | npm scripts |
|
|
657
|
-
| Windows + 无工具 | package.json scripts |
|
|
658
|
-
</notes>
|
|
1
|
+
---
|
|
2
|
+
name: om:deploy
|
|
3
|
+
description: "Triggers on DEPLOYMENT intent: user wants to deploy, publish, set up environments, or create deployment scripts. DO NOT trigger on: development tasks, status checks, or debugging."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
<INTENT-JUDGMENT>
|
|
7
|
+
## 意图判断指南
|
|
8
|
+
|
|
9
|
+
**AI 应根据用户语义判断意图:**
|
|
10
|
+
|
|
11
|
+
### 触发信号(部署意图)
|
|
12
|
+
|
|
13
|
+
- 用户想部署/发布项目
|
|
14
|
+
- 需要配置 Docker/Kubernetes
|
|
15
|
+
- 环境搭建需求
|
|
16
|
+
- 生成部署脚本
|
|
17
|
+
- 发布到生产环境
|
|
18
|
+
|
|
19
|
+
### 不触发信号
|
|
20
|
+
|
|
21
|
+
| 用户意图 | 应调用 |
|
|
22
|
+
|---------|--------|
|
|
23
|
+
| 实现功能 | /om:start |
|
|
24
|
+
| 修复 bug | /om:debug 或 /om:start |
|
|
25
|
+
| 查看状态 | /om:status |
|
|
26
|
+
|
|
27
|
+
### 示例判断
|
|
28
|
+
|
|
29
|
+
| 用户消息 | 判断 | 结果 |
|
|
30
|
+
|---------|------|------|
|
|
31
|
+
| "部署到服务器" | 部署意图 | 触发 ✓ |
|
|
32
|
+
| "用 Docker 运行" | 环境配置意图 | 触发 ✓ |
|
|
33
|
+
| "发布 npm 包" | 发布意图 | 触发 ✓ |
|
|
34
|
+
| "实现 API 接口" | 开发意图 | /om:start |
|
|
35
|
+
| "为什么部署失败" | 调查意图 | /om:debug |
|
|
36
|
+
</INTENT-JUDGMENT>
|
|
37
|
+
|
|
38
|
+
<NO-OTHER-SKILLS>
|
|
39
|
+
本 skill 与其他任务编排技能功能重叠,请勿同时使用。
|
|
40
|
+
</NO-OTHER-SKILLS>
|
|
41
|
+
|
|
42
|
+
<objective>
|
|
43
|
+
智能部署助手:自动分析项目文件和系统环境 → 推荐当前环境下最可行的部署方案 → 用户确认后执行 → 生成可复用的一键脚本。
|
|
44
|
+
</objective>
|
|
45
|
+
|
|
46
|
+
<process>
|
|
47
|
+
|
|
48
|
+
## Step 1: 读取历史部署配置
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
cat .openmatrix/deploy-config.json 2>/dev/null || echo "NO_HISTORY"
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
**如果有历史配置:**
|
|
55
|
+
- 对比上次记录的关键文件和当前实际文件
|
|
56
|
+
- 判断是否有变更
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
# 对比关键文件是否存在变化
|
|
60
|
+
ls -la Dockerfile docker-compose.yml Makefile Taskfile.yml 2>/dev/null
|
|
61
|
+
cat package.json 2>/dev/null | grep -E '"(deploy|start|build)"'
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
**变更检测结果:**
|
|
65
|
+
| 状态 | 处理 |
|
|
66
|
+
|------|------|
|
|
67
|
+
| 无历史配置 | 正常流程(分析+询问) |
|
|
68
|
+
| 无变更 | 直接使用上次配置,仅确认一次 |
|
|
69
|
+
| 有变更 | 重新分析并询问 |
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## Step 2: 分析项目文件
|
|
74
|
+
|
|
75
|
+
直接读取项目文件,不调用 CLI:
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
# 项目配置文件
|
|
79
|
+
ls -la Dockerfile docker-compose.yml docker-compose.yaml Makefile Taskfile.yml Taskfile.yaml 2>/dev/null
|
|
80
|
+
ls -la k8s/ helm/ .github/workflows/ 2>/dev/null
|
|
81
|
+
cat package.json 2>/dev/null
|
|
82
|
+
cat go.mod 2>/dev/null
|
|
83
|
+
cat Cargo.toml 2>/dev/null
|
|
84
|
+
cat requirements.txt pyproject.toml 2>/dev/null
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
提取关键信息:
|
|
88
|
+
- 项目类型(Node.js/Go/Python/Rust/Java 等)
|
|
89
|
+
- 已有部署配置(Dockerfile、docker-compose、Makefile、k8s 等)
|
|
90
|
+
- package.json 中的 scripts(build/start/deploy 等)
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## Step 2.1: 检测并优化依赖源
|
|
95
|
+
|
|
96
|
+
检测项目使用的包管理器和镜像源,如果是国外慢源则建议替换为国内镜像:
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
# npm/yarn/pnpm 源
|
|
100
|
+
npm config get registry 2>/dev/null
|
|
101
|
+
cat .npmrc 2>/dev/null
|
|
102
|
+
cat .yarnrc 2>/dev/null
|
|
103
|
+
cat .yarnrc.yml 2>/dev/null
|
|
104
|
+
|
|
105
|
+
# pip 源
|
|
106
|
+
cat pip.conf 2>/dev/null
|
|
107
|
+
pip config get global.index-url 2>/dev/null
|
|
108
|
+
|
|
109
|
+
# Docker 镜像源
|
|
110
|
+
cat /etc/docker/daemon.json 2>/dev/null
|
|
111
|
+
cat ~/.docker/daemon.json 2>/dev/null
|
|
112
|
+
|
|
113
|
+
# Go 代理
|
|
114
|
+
go env GOPROXY 2>/dev/null
|
|
115
|
+
|
|
116
|
+
# Rust 源
|
|
117
|
+
cat ~/.cargo/config.toml 2>/dev/null
|
|
118
|
+
|
|
119
|
+
# Gradle/Maven 源
|
|
120
|
+
cat build.gradle 2>/dev/null | grep -i "repositories" -A 5
|
|
121
|
+
cat pom.xml 2>/dev/null | grep -i "mirror" -A 5
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
**AI 分析源速度,如果检测到国外源,建议替换:**
|
|
125
|
+
|
|
126
|
+
| 包管理器 | 国外源 | 国内镜像 |
|
|
127
|
+
|---------|--------|---------|
|
|
128
|
+
| npm/yarn/pnpm | registry.npmjs.org | https://registry.npmmirror.com |
|
|
129
|
+
| pip | pypi.org | https://pypi.tuna.tsinghua.edu.cn/simple |
|
|
130
|
+
| Docker | docker.io | mirror.ccs.tencentyun.com |
|
|
131
|
+
| Go | proxy.golang.org | https://goproxy.cn,direct |
|
|
132
|
+
| Rust/Cargo | crates.io | https://rsproxy.cn/crates.io-index |
|
|
133
|
+
| Gradle/Maven | repo.maven.apache.org | https://maven.aliyun.com/repository/public |
|
|
134
|
+
|
|
135
|
+
**如果检测到慢源,输出建议并询问:**
|
|
136
|
+
|
|
137
|
+
```
|
|
138
|
+
AskUserQuestion:
|
|
139
|
+
header: "镜像源"
|
|
140
|
+
question: "检测到 npm 使用官方源(registry.npmjs.org),国内访问较慢。是否切换到国内镜像?"
|
|
141
|
+
|
|
142
|
+
options:
|
|
143
|
+
- label: "切换到淘宝镜像 (推荐)"
|
|
144
|
+
description: "npmmirror.com,国内速度快,同步延迟 < 10 分钟"
|
|
145
|
+
- label: "保持不变"
|
|
146
|
+
description: "当前源可用,不需要切换"
|
|
147
|
+
- label: "使用其他镜像"
|
|
148
|
+
description: "指定自定义镜像地址"
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
**用户确认后执行切换:**
|
|
152
|
+
```bash
|
|
153
|
+
# npm
|
|
154
|
+
npm config set registry https://registry.npmmirror.com
|
|
155
|
+
|
|
156
|
+
# pip
|
|
157
|
+
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
|
|
158
|
+
|
|
159
|
+
# Go
|
|
160
|
+
go env -w GOPROXY=https://goproxy.cn,direct
|
|
161
|
+
|
|
162
|
+
# Dockerfile 中的 apt 源(如果有)
|
|
163
|
+
# AI 读取 Dockerfile,将 archive.ubuntu.com 替换为 mirrors.aliyun.com
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
---
|
|
167
|
+
|
|
168
|
+
## Step 3: 检测系统环境
|
|
169
|
+
|
|
170
|
+
```bash
|
|
171
|
+
# 检测已安装的工具
|
|
172
|
+
docker --version 2>/dev/null && echo "docker:ok" || echo "docker:missing"
|
|
173
|
+
docker-compose --version 2>/dev/null && echo "docker-compose:ok" || echo "docker-compose:missing"
|
|
174
|
+
kubectl version --client 2>/dev/null && echo "kubectl:ok" || echo "kubectl:missing"
|
|
175
|
+
make --version 2>/dev/null && echo "make:ok" || echo "make:missing"
|
|
176
|
+
task --version 2>/dev/null && echo "task:ok" || echo "task:missing"
|
|
177
|
+
pm2 --version 2>/dev/null && echo "pm2:ok" || echo "pm2:missing"
|
|
178
|
+
node --version 2>/dev/null && echo "node:ok" || echo "node:missing"
|
|
179
|
+
|
|
180
|
+
# 操作系统
|
|
181
|
+
uname -s 2>/dev/null || echo "Windows"
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
---
|
|
185
|
+
|
|
186
|
+
## Step 4: AI 分析并展示环境报告
|
|
187
|
+
|
|
188
|
+
基于收集到的信息,直接输出分析报告(不用 AskUserQuestion):
|
|
189
|
+
|
|
190
|
+
```markdown
|
|
191
|
+
## 🔍 环境分析报告
|
|
192
|
+
|
|
193
|
+
**项目**: [名称] ([类型])
|
|
194
|
+
**操作系统**: [Linux/macOS/Windows]
|
|
195
|
+
|
|
196
|
+
### 已检测到的部署配置
|
|
197
|
+
- ✅ Dockerfile
|
|
198
|
+
- ✅ docker-compose.yml
|
|
199
|
+
- ❌ Makefile(未找到)
|
|
200
|
+
|
|
201
|
+
### 已安装的工具
|
|
202
|
+
- ✅ Docker 24.0.5
|
|
203
|
+
- ✅ make 4.3
|
|
204
|
+
- ❌ task(未安装)
|
|
205
|
+
- ❌ pm2(未安装)
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
---
|
|
209
|
+
|
|
210
|
+
## Step 5: 推荐部署方案(带理由)
|
|
211
|
+
|
|
212
|
+
AI 根据"项目配置 × 已安装工具"交叉分析,用 AskUserQuestion 展示推荐方案:
|
|
213
|
+
|
|
214
|
+
**推荐逻辑(AI 自行判断,不是硬编码):**
|
|
215
|
+
- 有 Dockerfile + docker 已安装 → Docker 是最直接的选择
|
|
216
|
+
- 有 docker-compose + 多服务 → Docker Compose 更合适
|
|
217
|
+
- 有 k8s 配置 + kubectl 已安装 → Kubernetes
|
|
218
|
+
- 有 Makefile + make 已安装 → 直接用 make
|
|
219
|
+
- Node.js + pm2 已安装 → PM2 轻量方案
|
|
220
|
+
- 什么都没有 → AI 根据项目类型推荐创建配置
|
|
221
|
+
|
|
222
|
+
```
|
|
223
|
+
AskUserQuestion:
|
|
224
|
+
header: "部署方案"
|
|
225
|
+
question: "基于你的环境分析,推荐以下方案(已标注推荐原因):"
|
|
226
|
+
|
|
227
|
+
options:
|
|
228
|
+
- label: "Docker (推荐)"
|
|
229
|
+
description: "已有 Dockerfile + Docker 已安装,直接可用,环境隔离好"
|
|
230
|
+
- label: "Docker Compose"
|
|
231
|
+
description: "检测到 docker-compose.yml,适合多服务编排"
|
|
232
|
+
- label: "Make"
|
|
233
|
+
description: "已有 Makefile + make 已安装,运行 make deploy"
|
|
234
|
+
- label: "npm scripts"
|
|
235
|
+
description: "无需额外工具,直接用 package.json 中的 scripts"
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
---
|
|
239
|
+
|
|
240
|
+
## Step 6: 确认部署环境
|
|
241
|
+
|
|
242
|
+
```
|
|
243
|
+
AskUserQuestion:
|
|
244
|
+
header: "目标环境"
|
|
245
|
+
question: "部署到哪个环境?"
|
|
246
|
+
|
|
247
|
+
options:
|
|
248
|
+
- label: "本地开发 (推荐)"
|
|
249
|
+
description: "快速启动,用于开发调试"
|
|
250
|
+
- label: "测试环境"
|
|
251
|
+
description: "模拟生产配置,用于验证"
|
|
252
|
+
- label: "生产环境"
|
|
253
|
+
description: "需要完整配置和安全检查"
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
---
|
|
257
|
+
|
|
258
|
+
## Step 6.1: 生成部署任务清单
|
|
259
|
+
|
|
260
|
+
根据前面的分析和用户选择,将所有部署步骤写入 TodoWrite,逐条执行:
|
|
261
|
+
|
|
262
|
+
**示例(Docker 本地部署 + 源优化 + 脚本生成):**
|
|
263
|
+
|
|
264
|
+
```typescript
|
|
265
|
+
TodoWrite({
|
|
266
|
+
todos: [
|
|
267
|
+
{ content: "切换 npm 源到淘宝镜像", activeForm: "正在切换 npm 镜像源", status: "pending" },
|
|
268
|
+
{ content: "构建 Docker 镜像", activeForm: "正在构建 Docker 镜像", status: "pending" },
|
|
269
|
+
{ content: "启动容器", activeForm: "正在启动容器", status: "pending" },
|
|
270
|
+
{ content: "验证部署:容器状态", activeForm: "正在检查容器状态", status: "pending" },
|
|
271
|
+
{ content: "验证部署:端口监听", activeForm: "正在检查端口", status: "pending" },
|
|
272
|
+
{ content: "验证部署:HTTP 连通", activeForm: "正在验证 HTTP 连通性", status: "pending" },
|
|
273
|
+
{ content: "生成 Taskfile.yml 一键脚本", activeForm: "正在生成一键脚本", status: "pending" },
|
|
274
|
+
{ content: "保存部署配置", activeForm: "正在保存部署配置", status: "pending" }
|
|
275
|
+
]
|
|
276
|
+
})
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
**任务清单根据实际情况动态生成:**
|
|
280
|
+
- 需要切换源 → 加入源切换任务
|
|
281
|
+
- 需要生成 Dockerfile → 加入生成任务
|
|
282
|
+
- 多服务 → 每个服务一条任务
|
|
283
|
+
- 选择生成脚本 → 加入脚本生成任务
|
|
284
|
+
|
|
285
|
+
**执行规则:**
|
|
286
|
+
- 每次只执行一条,完成后立即标记 completed
|
|
287
|
+
- 失败时停止,输出错误信息
|
|
288
|
+
- 用户可以看到整体进度
|
|
289
|
+
|
|
290
|
+
---
|
|
291
|
+
|
|
292
|
+
## Step 7: 执行部署
|
|
293
|
+
|
|
294
|
+
根据用户选择,AI 执行对应命令:
|
|
295
|
+
|
|
296
|
+
**Docker 本地:**
|
|
297
|
+
```bash
|
|
298
|
+
docker build -t <project-name> .
|
|
299
|
+
docker run -d -p <port>:<port> --name <project-name> <project-name>
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
**Docker Compose:**
|
|
303
|
+
```bash
|
|
304
|
+
docker-compose up -d --build
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
**Make:**
|
|
308
|
+
```bash
|
|
309
|
+
make deploy
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
**npm scripts:**
|
|
313
|
+
```bash
|
|
314
|
+
npm run build
|
|
315
|
+
npm run start &
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
---
|
|
319
|
+
|
|
320
|
+
## Step 7.1: 自动验证部署结果
|
|
321
|
+
|
|
322
|
+
执行部署后,AI 自动执行以下验证(按顺序,全部通过才算成功):
|
|
323
|
+
|
|
324
|
+
**1. 检查容器/进程状态:**
|
|
325
|
+
```bash
|
|
326
|
+
# Docker
|
|
327
|
+
docker ps --format "{{.Names}}\t{{.Status}}" | grep <project-name>
|
|
328
|
+
|
|
329
|
+
# Docker Compose
|
|
330
|
+
docker-compose ps
|
|
331
|
+
|
|
332
|
+
# PM2
|
|
333
|
+
pm2 list
|
|
334
|
+
|
|
335
|
+
# 进程检查
|
|
336
|
+
ps aux | grep <project-name>
|
|
337
|
+
```
|
|
338
|
+
|
|
339
|
+
**2. 检查端口是否在监听:**
|
|
340
|
+
```bash
|
|
341
|
+
# Linux/Mac
|
|
342
|
+
lsof -i :<port> 2>/dev/null || netstat -tlnp 2>/dev/null | grep <port>
|
|
343
|
+
|
|
344
|
+
# Windows
|
|
345
|
+
netstat -ano | findstr :<port>
|
|
346
|
+
```
|
|
347
|
+
|
|
348
|
+
**3. HTTP 连通性验证(核心验证):**
|
|
349
|
+
```bash
|
|
350
|
+
# 等待服务启动(最多重试 5 次,每次间隔 2 秒)
|
|
351
|
+
for i in 1 2 3 4 5; do
|
|
352
|
+
STATUS=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:<port>/ 2>/dev/null)
|
|
353
|
+
if [ "$STATUS" -ge 200 ] && [ "$STATUS" -lt 400 ]; then
|
|
354
|
+
echo "HTTP $STATUS OK"
|
|
355
|
+
break
|
|
356
|
+
fi
|
|
357
|
+
sleep 2
|
|
358
|
+
done
|
|
359
|
+
|
|
360
|
+
# 获取响应内容摘要
|
|
361
|
+
curl -s http://localhost:<port>/ 2>/dev/null | head -20
|
|
362
|
+
```
|
|
363
|
+
|
|
364
|
+
**4. 健康检查端点(如果存在):**
|
|
365
|
+
```bash
|
|
366
|
+
curl -s http://localhost:<port>/health 2>/dev/null
|
|
367
|
+
curl -s http://localhost:<port>/api/health 2>/dev/null
|
|
368
|
+
curl -s http://localhost:<port>/healthz 2>/dev/null
|
|
369
|
+
```
|
|
370
|
+
|
|
371
|
+
**5. 浏览器可访问性验证(Web 项目):**
|
|
372
|
+
|
|
373
|
+
如果是 Web 项目,使用 Playwright 工具打开浏览器验证页面是否正常加载:
|
|
374
|
+
```
|
|
375
|
+
browser_navigate: http://localhost:<port>/
|
|
376
|
+
browser_snapshot: 检查页面是否正常渲染
|
|
377
|
+
browser_take_screenshot: 截图保存验证结果
|
|
378
|
+
browser_close
|
|
379
|
+
```
|
|
380
|
+
|
|
381
|
+
如果无法使用浏览器工具,输出可访问的 URL 供用户手动验证:
|
|
382
|
+
```
|
|
383
|
+
🌐 请在浏览器中访问: http://localhost:<port>/
|
|
384
|
+
```
|
|
385
|
+
|
|
386
|
+
**6. 日志检查(任何验证失败时):**
|
|
387
|
+
```bash
|
|
388
|
+
# Docker 日志
|
|
389
|
+
docker logs <project-name> --tail 50
|
|
390
|
+
|
|
391
|
+
# PM2 日志
|
|
392
|
+
pm2 logs <project-name> --lines 50
|
|
393
|
+
```
|
|
394
|
+
|
|
395
|
+
---
|
|
396
|
+
|
|
397
|
+
## Step 7.2: 输出验证报告
|
|
398
|
+
|
|
399
|
+
AI 根据验证结果输出状态报告:
|
|
400
|
+
|
|
401
|
+
**验证成功:**
|
|
402
|
+
```markdown
|
|
403
|
+
## ✅ 部署验证报告
|
|
404
|
+
|
|
405
|
+
**服务状态**: 运行中 (Up 2 minutes)
|
|
406
|
+
**端口**: 3000 已监听
|
|
407
|
+
**HTTP 连通**: http://localhost:3000/ → 200 OK
|
|
408
|
+
**健康检查**: /health → 200 OK
|
|
409
|
+
|
|
410
|
+
### 验证清单
|
|
411
|
+
- ✅ 容器/进程正常运行
|
|
412
|
+
- ✅ 端口 3000 已监听
|
|
413
|
+
- ✅ HTTP 请求返回 200
|
|
414
|
+
- ✅ 页面可正常访问
|
|
415
|
+
|
|
416
|
+
### 访问地址
|
|
417
|
+
🌐 http://localhost:3000/
|
|
418
|
+
|
|
419
|
+
### 快捷命令
|
|
420
|
+
- 查看日志: docker logs -f <project-name>
|
|
421
|
+
- 停止服务: docker stop <project-name>
|
|
422
|
+
- 重启服务: docker restart <project-name>
|
|
423
|
+
```
|
|
424
|
+
|
|
425
|
+
**验证失败:**
|
|
426
|
+
```markdown
|
|
427
|
+
## ❌ 部署验证失败
|
|
428
|
+
|
|
429
|
+
**问题**: 容器启动后立即退出
|
|
430
|
+
**状态**: Exited (1)
|
|
431
|
+
|
|
432
|
+
### 错误日志(最近 20 行)
|
|
433
|
+
<显示 docker logs 输出>
|
|
434
|
+
|
|
435
|
+
### 建议修复
|
|
436
|
+
1. 检查 Dockerfile 配置
|
|
437
|
+
2. 检查启动命令是否正确
|
|
438
|
+
3. 查看完整日志: docker logs <project-name>
|
|
439
|
+
```
|
|
440
|
+
|
|
441
|
+
验证失败时,询问用户是否要查看完整日志或尝试修复。
|
|
442
|
+
|
|
443
|
+
---
|
|
444
|
+
|
|
445
|
+
## Step 8: 询问是否生成一键脚本
|
|
446
|
+
|
|
447
|
+
```
|
|
448
|
+
AskUserQuestion:
|
|
449
|
+
header: "一键脚本"
|
|
450
|
+
question: "部署完成!是否生成一键脚本方便后续开发调试?"
|
|
451
|
+
|
|
452
|
+
options:
|
|
453
|
+
- label: "生成 Taskfile.yml (推荐)"
|
|
454
|
+
description: "task 已安装 / 现代化工具,YAML 格式简洁,跨平台"
|
|
455
|
+
- label: "生成 Makefile"
|
|
456
|
+
description: "make 已安装 / 经典工具,已有 Makefile 时保持一致"
|
|
457
|
+
- label: "添加到 npm scripts"
|
|
458
|
+
description: "Node.js 项目,无需额外工具"
|
|
459
|
+
- label: "不需要"
|
|
460
|
+
description: "已有足够配置"
|
|
461
|
+
```
|
|
462
|
+
|
|
463
|
+
---
|
|
464
|
+
|
|
465
|
+
## Step 9: 生成一键脚本
|
|
466
|
+
|
|
467
|
+
根据用户选择和项目实际情况,用 Write 工具生成脚本。
|
|
468
|
+
|
|
469
|
+
**Taskfile.yml 示例(根据实际项目定制):**
|
|
470
|
+
```yaml
|
|
471
|
+
version: '3'
|
|
472
|
+
|
|
473
|
+
vars:
|
|
474
|
+
APP: '{{.APP | default "app"}}'
|
|
475
|
+
PORT: '{{.PORT | default "3000"}}'
|
|
476
|
+
|
|
477
|
+
tasks:
|
|
478
|
+
setup:
|
|
479
|
+
desc: 安装依赖
|
|
480
|
+
cmds:
|
|
481
|
+
- npm install
|
|
482
|
+
|
|
483
|
+
build:
|
|
484
|
+
desc: 构建项目
|
|
485
|
+
cmds:
|
|
486
|
+
- npm run build
|
|
487
|
+
|
|
488
|
+
test:
|
|
489
|
+
desc: 运行测试
|
|
490
|
+
cmds:
|
|
491
|
+
- npm test
|
|
492
|
+
|
|
493
|
+
dev:
|
|
494
|
+
desc: 本地开发(热重载)
|
|
495
|
+
cmds:
|
|
496
|
+
- npm run dev
|
|
497
|
+
|
|
498
|
+
deploy:local:
|
|
499
|
+
desc: 本地 Docker 部署
|
|
500
|
+
cmds:
|
|
501
|
+
- docker build -t {{.APP}} .
|
|
502
|
+
- docker run -d -p {{.PORT}}:{{.PORT}} --name {{.APP}} {{.APP}}
|
|
503
|
+
- echo "✅ 服务已启动 http://localhost:{{.PORT}}"
|
|
504
|
+
|
|
505
|
+
deploy:prod:
|
|
506
|
+
desc: 生产部署
|
|
507
|
+
cmds:
|
|
508
|
+
- docker build -t {{.APP}}:{{.VERSION}} .
|
|
509
|
+
- docker push {{.REGISTRY}}/{{.APP}}:{{.VERSION}}
|
|
510
|
+
|
|
511
|
+
logs:
|
|
512
|
+
desc: 查看日志
|
|
513
|
+
cmds:
|
|
514
|
+
- docker logs -f {{.APP}}
|
|
515
|
+
|
|
516
|
+
stop:
|
|
517
|
+
desc: 停止服务
|
|
518
|
+
cmds:
|
|
519
|
+
- docker stop {{.APP}} && docker rm {{.APP}}
|
|
520
|
+
```
|
|
521
|
+
|
|
522
|
+
**Makefile 示例(根据实际项目定制):**
|
|
523
|
+
```makefile
|
|
524
|
+
APP ?= app
|
|
525
|
+
PORT ?= 3000
|
|
526
|
+
|
|
527
|
+
.PHONY: setup build test dev deploy-local deploy-prod logs stop
|
|
528
|
+
|
|
529
|
+
setup:
|
|
530
|
+
npm install
|
|
531
|
+
|
|
532
|
+
build:
|
|
533
|
+
npm run build
|
|
534
|
+
|
|
535
|
+
test:
|
|
536
|
+
npm test
|
|
537
|
+
|
|
538
|
+
dev:
|
|
539
|
+
npm run dev
|
|
540
|
+
|
|
541
|
+
deploy-local:
|
|
542
|
+
docker build -t $(APP) .
|
|
543
|
+
docker run -d -p $(PORT):$(PORT) --name $(APP) $(APP)
|
|
544
|
+
@echo "✅ 服务已启动 http://localhost:$(PORT)"
|
|
545
|
+
|
|
546
|
+
deploy-prod:
|
|
547
|
+
docker build -t $(APP):$(VERSION) .
|
|
548
|
+
docker push $(REGISTRY)/$(APP):$(VERSION)
|
|
549
|
+
|
|
550
|
+
logs:
|
|
551
|
+
docker logs -f $(APP)
|
|
552
|
+
|
|
553
|
+
stop:
|
|
554
|
+
docker stop $(APP) && docker rm $(APP)
|
|
555
|
+
```
|
|
556
|
+
|
|
557
|
+
---
|
|
558
|
+
|
|
559
|
+
## Step 10: 保存部署配置
|
|
560
|
+
|
|
561
|
+
将用户选择的部署方式保存到 `.openmatrix/deploy-config.json`:
|
|
562
|
+
|
|
563
|
+
```json
|
|
564
|
+
{
|
|
565
|
+
"deployMethod": "docker",
|
|
566
|
+
"envType": "local",
|
|
567
|
+
"scriptTool": "taskfile",
|
|
568
|
+
"lastDetectedFiles": {
|
|
569
|
+
"Dockerfile": true,
|
|
570
|
+
"docker-compose.yml": false,
|
|
571
|
+
"Makefile": false,
|
|
572
|
+
"package.json": true
|
|
573
|
+
},
|
|
574
|
+
"lastDetectedTools": {
|
|
575
|
+
"docker": "24.0.5",
|
|
576
|
+
"make": "4.3",
|
|
577
|
+
"task": null
|
|
578
|
+
},
|
|
579
|
+
"timestamp": "2026-04-22T15:00:00Z"
|
|
580
|
+
}
|
|
581
|
+
```
|
|
582
|
+
|
|
583
|
+
下次运行时,对比 `lastDetectedFiles` 和当前实际文件状态,判断是否需要重新询问。
|
|
584
|
+
|
|
585
|
+
---
|
|
586
|
+
|
|
587
|
+
## Step 11: 输出总结
|
|
588
|
+
|
|
589
|
+
```markdown
|
|
590
|
+
## ✅ 部署完成
|
|
591
|
+
|
|
592
|
+
**方案**: Docker 本地部署
|
|
593
|
+
**环境**: 本地开发
|
|
594
|
+
**脚本**: 已生成 Taskfile.yml
|
|
595
|
+
|
|
596
|
+
### 常用命令
|
|
597
|
+
- `task dev` — 本地开发
|
|
598
|
+
- `task deploy:local` — Docker 本地部署
|
|
599
|
+
- `task deploy:prod` — 生产部署
|
|
600
|
+
- `task logs` — 查看日志
|
|
601
|
+
- `task stop` — 停止服务
|
|
602
|
+
```
|
|
603
|
+
|
|
604
|
+
</process>
|
|
605
|
+
|
|
606
|
+
<arguments>
|
|
607
|
+
$ARGUMENTS
|
|
608
|
+
</arguments>
|
|
609
|
+
|
|
610
|
+
<examples>
|
|
611
|
+
/om:deploy # 自动分析 → 推荐方案 → 执行 → 生成脚本
|
|
612
|
+
/om:deploy local # 直接指定本地环境
|
|
613
|
+
/om:deploy prod # 直接指定生产环境
|
|
614
|
+
</examples>
|
|
615
|
+
|
|
616
|
+
<notes>
|
|
617
|
+
## 核心原则
|
|
618
|
+
|
|
619
|
+
1. **AI 是分析者**:读取真实文件和系统状态,不靠硬编码规则推断
|
|
620
|
+
2. **AI 是执行者**:用户确认后直接运行命令,不只是给建议
|
|
621
|
+
3. **推荐最可行的**:基于"当前系统已有什么工具",不是"理论上最好的"
|
|
622
|
+
4. **产出可复用脚本**:最终生成 Taskfile/Makefile,方便后续开发调试
|
|
623
|
+
5. **记录上次选择**:保存部署配置,下次未变化时直接复用,减少重复询问
|
|
624
|
+
|
|
625
|
+
## 历史配置复用
|
|
626
|
+
|
|
627
|
+
`.openmatrix/deploy-config.json` 存储上次部署选择:
|
|
628
|
+
- 对比 `lastDetectedFiles` 和当前文件状态
|
|
629
|
+
- 状态一致 → 直接使用上次配置,仅确认一次
|
|
630
|
+
- 状态变化 → 重新分析并询问
|
|
631
|
+
|
|
632
|
+
变更检测:
|
|
633
|
+
- Dockerfile/docker-compose.yml/Makefile 新增或删除
|
|
634
|
+
- package.json scripts 变化
|
|
635
|
+
- 系统工具安装状态变化
|
|
636
|
+
|
|
637
|
+
## 推荐决策依据(AI 自行判断)
|
|
638
|
+
|
|
639
|
+
| 项目配置 | 系统工具 | 推荐方案 |
|
|
640
|
+
|---------|---------|---------|
|
|
641
|
+
| 有 Dockerfile | docker 已安装 | Docker |
|
|
642
|
+
| 有 docker-compose | docker-compose 已安装 | Docker Compose |
|
|
643
|
+
| 有 k8s/ | kubectl 已安装 | Kubernetes |
|
|
644
|
+
| 有 Makefile | make 已安装 | Make |
|
|
645
|
+
| Node.js | pm2 已安装 | PM2 |
|
|
646
|
+
| Node.js | 无特殊工具 | npm scripts |
|
|
647
|
+
| 无任何配置 | docker 已安装 | 生成 Dockerfile |
|
|
648
|
+
| 无任何配置 | 无工具 | npm scripts / shell 脚本 |
|
|
649
|
+
|
|
650
|
+
## 脚本工具选择依据
|
|
651
|
+
|
|
652
|
+
| 条件 | 推荐 |
|
|
653
|
+
|------|------|
|
|
654
|
+
| task 已安装 | Taskfile.yml |
|
|
655
|
+
| make 已安装 / 已有 Makefile | Makefile |
|
|
656
|
+
| Node.js 项目 / 无工具 | npm scripts |
|
|
657
|
+
| Windows + 无工具 | package.json scripts |
|
|
658
|
+
</notes>
|