@ranger1/dx 0.1.76 → 0.1.78

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.
Files changed (36) hide show
  1. package/README.md +92 -31
  2. package/bin/dx.js +3 -3
  3. package/lib/cli/commands/deploy.js +2 -1
  4. package/lib/cli/commands/stack.js +198 -237
  5. package/lib/cli/commands/start.js +0 -6
  6. package/lib/cli/dx-cli.js +10 -1
  7. package/lib/cli/help.js +8 -7
  8. package/lib/{opencode-initial.js → codex-initial.js} +3 -82
  9. package/lib/vercel-deploy.js +14 -27
  10. package/package.json +1 -2
  11. package/@opencode/agents/__pycache__/gh_review_harvest.cpython-314.pyc +0 -0
  12. package/@opencode/agents/__pycache__/pr_context.cpython-314.pyc +0 -0
  13. package/@opencode/agents/__pycache__/pr_precheck.cpython-314.pyc +0 -0
  14. package/@opencode/agents/__pycache__/pr_review_aggregate.cpython-314.pyc +0 -0
  15. package/@opencode/agents/__pycache__/test_pr_review_aggregate.cpython-314-pytest-9.0.2.pyc +0 -0
  16. package/@opencode/agents/__pycache__/test_pr_review_aggregate.cpython-314.pyc +0 -0
  17. package/@opencode/agents/claude-reviewer.md +0 -82
  18. package/@opencode/agents/codex-reviewer.md +0 -83
  19. package/@opencode/agents/gemini-reviewer.md +0 -82
  20. package/@opencode/agents/gh-thread-reviewer.md +0 -122
  21. package/@opencode/agents/gh_review_harvest.py +0 -292
  22. package/@opencode/agents/pr-context.md +0 -82
  23. package/@opencode/agents/pr-fix.md +0 -243
  24. package/@opencode/agents/pr-precheck.md +0 -89
  25. package/@opencode/agents/pr-review-aggregate.md +0 -151
  26. package/@opencode/agents/pr_context.py +0 -351
  27. package/@opencode/agents/pr_precheck.py +0 -505
  28. package/@opencode/agents/pr_review_aggregate.py +0 -868
  29. package/@opencode/agents/test_pr_review_aggregate.py +0 -701
  30. package/@opencode/commands/doctor.md +0 -271
  31. package/@opencode/commands/git-commit-and-pr.md +0 -282
  32. package/@opencode/commands/git-release.md +0 -642
  33. package/@opencode/commands/oh_attach.json +0 -92
  34. package/@opencode/commands/opencode_attach.json +0 -29
  35. package/@opencode/commands/opencode_attach.py +0 -142
  36. package/@opencode/commands/pr-review-loop.md +0 -211
package/README.md CHANGED
@@ -130,60 +130,50 @@ target(端)不写死,由 `env-policy.jsonc.targets` 定义;`commands.jso
130
130
 
131
131
  ## PR Review Loop(自动评审-修复闭环)
132
132
 
133
- dx 内置一套 PR 评审自动化工作流:并行评审 聚合结论 生成修复清单 自动修复 再评审,最多循环 3 轮,用于让 PR 更快收敛。
133
+ 仓库内提供了基于 Codex Skill 的 PR 评审自动化工作流:并行评审 -> 聚合结论 -> 生成修复清单 -> 自动修复 -> 再评审,最多循环 3 轮,用于让 PR 更快收敛。
134
134
 
135
135
  ### 什么时候用
136
136
 
137
137
  - PR 变更较大、想要更系统地覆盖安全/性能/可维护性问题
138
- - 希望在 CI 通过的前提下,把评审建议落成可执行的修复清单(fixFile)
139
- - 希望避免同一个问题在不同轮次被反复提出(通过 Decision Log 机制)
138
+ - 希望在 CI 通过前提下,把评审建议落成可执行修复清单(fixFile)
139
+ - 希望避免同一个问题在不同轮次被反复提出(Decision Log
140
140
 
141
141
  ### 如何运行
142
142
 
143
- 在创建 PR 后执行:
143
+ Codex 会话中触发该技能:
144
144
 
145
- ```
146
- /pr-review-loop --pr <PR_NUMBER>
145
+ ```text
146
+ 使用 $pr-review-loop PR #<PR_NUMBER> 执行审核闭环
147
147
  ```
148
148
 
149
- 更多命令说明见:`@opencode/commands/pr-review-loop.md`。
149
+ 技能入口与说明见:
150
150
 
151
- 提示:在创建 PR 的流程中也会给出快捷入口,见:`@opencode/commands/git-commit-and-pr.md`。
151
+ - `codex/skills/pr-review-loop/SKILL.md`
152
+ - `codex/skills/pr-review-loop/references/agents/*.md`
152
153
 
153
154
  ### 工作流概览
154
155
 
155
- - 预检(`pr-precheck`):先做编译/预检 gate,不通过则进入修复再预检(最多 2 次)
156
- - 获取上下文(`pr-context`):生成本轮上下文缓存 `contextFile`
157
- - 并行评审(4 reviewer):`codex-reviewer` / `claude-reviewer` / `gemini-reviewer` / `gh-thread-reviewer`
158
- - 聚合(`pr-review-aggregate`):合并各 reviewer 结果、去重、输出 `fixFile`,并发布本轮 Review Summary
159
- - 修复(`pr-fix`):按 `fixFile` 逐条修复(每条 findingId 单独 commit + push),输出 `fixReportFile`
160
- - 发布修复报告(`pr-review-aggregate` 模式 B):发布 Fix Report
161
-
162
- 备注:每轮发布到 PR 的评论都会带 `<!-- pr-review-loop-marker -->`,用于幂等与避免反复采集机器人评论。
156
+ - 预检(`pr-precheck`):先做编译/基础 gate,不通过则终止流程
157
+ - 获取上下文(`pr-context`):生成本轮上下文缓存 `contextFile` 与 `runId`
158
+ - 并行评审(reviewers):按 `./reviewer/*-reviewer.md` 并行审查并产出 reviewFile
159
+ - 聚合(`pr-review-aggregate` 模式 A):合并评审结果、去重、发布 Review Summary、生成 `fixFile`
160
+ - 修复(`fixer`):按 `fixFile` 执行修复并产出 `fixReportFile`
161
+ - 发布修复报告(`pr-review-aggregate` 模式 B
163
162
 
164
- ### 缓存文件(项目内 ./\.cache/)
163
+ ### 缓存文件(项目内 `./.cache/`)
165
164
 
166
- 该流程的中间产物都写入项目内 `./.cache/`,并在 agent/命令之间传递 repo 相对路径:
165
+ 该流程中间产物写入 `./.cache/`,并在各阶段传递相对路径:
167
166
 
168
167
  - `./.cache/pr-context-pr<PR>-r<ROUND>-<RUN_ID>.md`(contextFile)
169
- - `./.cache/review-<REVIEWER>-pr<PR>-r<ROUND>-<RUN_ID>.md`(reviewFile)
168
+ - `./.cache/review-<ROLE_CODE>-pr<PR>-r<ROUND>-<RUN_ID>.md`(reviewFile)
170
169
  - `./.cache/fix-pr<PR>-r<ROUND>-<RUN_ID>.md`(fixFile)
171
170
  - `./.cache/fix-report-pr<PR>-r<ROUND>-<RUN_ID>.md`(fixReportFile)
172
171
 
173
- ### Decision Log(跨轮次决策日志,用于收敛)
174
-
175
- 为了解决“第一轮拒绝的问题在后续轮次反复出现”的问题,PR Review Loop 使用 Decision Log 持久化每轮的决策:
172
+ ### Decision Log(跨轮次决策日志)
176
173
 
177
174
  - 文件:`./.cache/decision-log-pr<PR_NUMBER>.md`
178
- - 生成者:`pr-fix` 在修复完成后创建/追加(append-only,禁止覆盖历史)
179
- - 内容:记录每轮的 Fixed/Rejected,以及 `essence`(问题本质的一句话描述,用于后续智能匹配)
180
-
181
- 在后续轮次:
182
-
183
- - reviewers 若收到 `decisionLogFile`,必须读取并遵守:已修复不再提、已拒绝不再提(除非严重性升级)
184
- - aggregate 在模式 A 中基于 LLM 对比 `essence` 做“问题本质相同”的判断,并生成 `escalation_groups` 入参给脚本
185
-
186
- 升级质疑规则:只有当新 finding 的优先级比历史 rejected 高 ≥2 级(例如 P3→P1、P2→P0)时,才允许重新打开。
175
+ - 作用:记录每轮 Fixed/Rejected 结论,后续轮次用于过滤重复问题
176
+ - 规则:默认 append-only,保留历史决策用于收敛
187
177
 
188
178
  ## 命令
189
179
 
@@ -192,6 +182,7 @@ dx 的命令由 `dx/config/commands.json` 驱动,并且内置了一些 interna
192
182
  - `internal: sdk-build`:SDK 生成/构建
193
183
  - `internal: backend-package`:后端打包
194
184
  - `internal: start-dev`:开发环境一键启动
185
+ - `internal: pm2-stack`:PM2 交互式服务栈(支持端口清理/缓存清理配置)
195
186
 
196
187
  常用示例:
197
188
 
@@ -208,6 +199,76 @@ dx lint
208
199
  dx test e2e backend
209
200
  ```
210
201
 
202
+ ### `dx start stack` 配置详解(PM2 交互式服务栈)
203
+
204
+ 从 `0.1.78` 起,`dx start stack` 推荐完全由 `dx/config/commands.json` 配置驱动,不再依赖硬编码服务列表。
205
+
206
+ 最小可用配置:
207
+
208
+ ```json
209
+ {
210
+ "start": {
211
+ "stack": {
212
+ "internal": "pm2-stack",
213
+ "interactive": true,
214
+ "description": "PM2 交互式服务栈",
215
+ "stack": {
216
+ "ecosystemConfig": "ecosystem.config.cjs",
217
+ "services": ["backend", "front", "admin"],
218
+ "preflight": {
219
+ "killPorts": [3000, 3001, 3500],
220
+ "pm2Reset": true
221
+ }
222
+ }
223
+ }
224
+ }
225
+ }
226
+ ```
227
+
228
+ 完整字段说明:
229
+
230
+ - `start.stack.internal`
231
+ - 固定为 `pm2-stack`,表示启用内置 PM2 交互式 runner。
232
+ - `start.stack.interactive`
233
+ - 建议设为 `true`,用于标记这是交互式命令(便于团队识别)。
234
+ - `start.stack.stack.ecosystemConfig`
235
+ - PM2 配置文件路径;支持相对路径(相对项目根目录)或绝对路径。
236
+ - 默认值:`ecosystem.config.cjs`。
237
+ - `start.stack.stack.pm2Bin`
238
+ - PM2 命令前缀,默认 `pnpm pm2`。如果团队使用全局 pm2,可改为 `pm2`。
239
+ - `start.stack.stack.services`
240
+ - 交互命令(`r/l/s`)可操作的服务名单。
241
+ - 示例:`["backend", "front", "admin"]`。
242
+ - `start.stack.stack.preflight.killPorts`
243
+ - 启动前自动清理占用端口列表。
244
+ - 这就是“某些端口被占用时自动处理”的核心配置。
245
+ - `start.stack.stack.preflight.forcePortCleanup`
246
+ - 是否强制清理端口占用,默认 `true`。
247
+ - `start.stack.stack.preflight.pm2Reset`
248
+ - 启动前是否执行 PM2 状态重置(`delete all` / `kill` / 状态文件清理),默认 `true`。
249
+ - `start.stack.stack.preflight.cleanPaths`
250
+ - 启动前需要删除的缓存路径列表(相对项目根目录)。
251
+ - 适合清理 `.next`、`dist`、`.vite` 等缓存,避免脏状态。
252
+ - `start.stack.stack.preflight.cleanTsBuildInfo`
253
+ - 是否清理 `*.tsbuildinfo`,默认 `true`。
254
+ - `start.stack.stack.preflight.cleanTsBuildInfoDirs`
255
+ - 扫描 `*.tsbuildinfo` 的目录列表。
256
+
257
+ 交互命令保持不变:
258
+
259
+ - `r <service>` 重启服务
260
+ - `l <service>` 查看日志
261
+ - `s <service>` 停止服务
262
+ - `list` 查看状态
263
+ - `monit` 打开 PM2 监控
264
+ - `q` 停止所有服务并退出
265
+
266
+ 推荐实践:
267
+
268
+ - 将 `services` 与 `ecosystem.config.cjs` 里的 app 名保持一致,避免交互命令找不到服务。
269
+ - `killPorts` 只配置开发态常驻端口,避免误杀不相关进程。
270
+ - 如果项目不是 `apps/front` / `apps/admin-front` 结构,请按实际目录改 `cleanPaths` 与 `cleanTsBuildInfoDirs`。
271
+
211
272
  ## deploy 行为说明
212
273
 
213
274
  从 `0.1.9` 起,`dx deploy <target>` 不再在 dx 内部硬编码执行任何 `nx build`/`sdk build` 等前置步骤。
package/bin/dx.js CHANGED
@@ -117,13 +117,13 @@ async function main() {
117
117
 
118
118
  if (isInitialInvocation(rawArgs)) {
119
119
  const packageRoot = resolve(dirname(fileURLToPath(import.meta.url)), '..')
120
- const [{ logger }, { runOpenCodeInitial }] = await Promise.all([
120
+ const [{ logger }, { runCodexInitial }] = await Promise.all([
121
121
  import('../lib/logger.js'),
122
- import('../lib/opencode-initial.js'),
122
+ import('../lib/codex-initial.js'),
123
123
  ])
124
124
 
125
125
  try {
126
- await runOpenCodeInitial({ packageRoot })
126
+ await runCodexInitial({ packageRoot })
127
127
  return
128
128
  } catch (error) {
129
129
  logger.error('initial 执行失败')
@@ -8,6 +8,7 @@ export function mergeLayeredDeployEnv(layeredEnv, manager, runtimeEnv = process.
8
8
  'VERCEL_ORG_ID',
9
9
  'VERCEL_PROJECT_ID_FRONT',
10
10
  'VERCEL_PROJECT_ID_ADMIN',
11
+ 'VERCEL_PROJECT_ID_MERCHANT',
11
12
  'VERCEL_PROJECT_ID_TELEGRAM_BOT',
12
13
  ])
13
14
 
@@ -57,7 +58,7 @@ export function parseTelegramWebhookFlags(argv = []) {
57
58
  export async function handleDeploy(cli, args) {
58
59
  const target = args[0]
59
60
  if (!target) {
60
- logger.error('请指定部署目标: front, admin, all')
61
+ logger.error('请指定部署目标: front, admin, merchant, telegram-bot, all')
61
62
  logger.info(`用法: ${cli.invocation} deploy <target> [环境标志]`)
62
63
  logger.info(`示例: ${cli.invocation} deploy front --staging`)
63
64
  process.exitCode = 1