@ranger1/dx 0.1.21 → 0.1.23

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.
@@ -5,7 +5,7 @@ model: openai/gpt-5.2-codex
5
5
  temperature: 0.1
6
6
  tools:
7
7
  write: true
8
- edit: false
8
+ edit: true
9
9
  bash: true
10
10
  ---
11
11
 
@@ -29,16 +29,67 @@ tools:
29
29
  - 如果当前分支不是 headRefName:执行 `gh pr checkout <PR_NUMBER>`
30
30
  - 切换失败输出 `{"error":"PR_CHECKOUT_FAILED"}`
31
31
 
32
- 3. 预检:lint + build
32
+ 3. 检查 PR 合并冲突(如有则解决 + 提交 + 推送)
33
+
34
+ - 读取 PR 的 `baseRefName` 与 `mergeable`
35
+ - base 分支名必须兼容 `main`/`master`:
36
+ - 优先使用 PR 返回的 `baseRefName`
37
+ - 若 `baseRefName` 为空:用 `gh repo view --json defaultBranchRef -q .defaultBranchRef.name` 获取仓库默认分支
38
+ - 若仍取不到:输出 `{"error":"PR_BASE_REF_NOT_FOUND"}`
39
+ - 拉取 base 分支(后续 merge/affected build 都依赖):
40
+ - `git fetch origin <baseRefName>`(若失败则按 `main/master` fallback 重试)
41
+ - 仍失败:输出 `{"error":"PR_BASE_REF_FETCH_FAILED"}`
42
+ - 若 `mergeable=CONFLICTING`(存在合并冲突):
43
+ - 尝试把 base 合入当前 PR 分支(不 rebase、不 force push):
44
+ - `git merge --no-ff --no-commit origin/<baseRefName>`
45
+ - 若 merge 产生冲突文件(`git diff --name-only --diff-filter=U` 非空):
46
+ - 先按文件类型做“低风险确定性策略”,再对剩余文件做“基于内容的智能合并”
47
+ - 低风险确定性策略(示例,按仓库实际补充):
48
+ - lockfiles(如 `pnpm-lock.yaml`/`package-lock.json`/`yarn.lock`):优先 `--theirs`(以 base 为准,减少依赖漂移)
49
+ - 其余生成物/构建产物:能识别则同上(优先 base),识别不了不要瞎选
50
+ - 对剩余冲突文件:
51
+ - 读取包含冲突标记(`<<<<<<<`/`=======`/`>>>>>>>`)的文件内容
52
+ - 基于代码语义进行合并:
53
+ - 保证语法正确(JS/TS/JSON/YAML 等)
54
+ - 变更尽量小
55
+ - 若两边都合理:优先保留 PR 的业务逻辑,同时把 base 的必要改动(接口/字段/类型)合进去
56
+ - 写回文件,确保冲突标记完全消除
57
+ - 合并完成后必须验证:
58
+ - `git diff --name-only --diff-filter=U` 为空
59
+ - 不再存在冲突标记(允许用 `git grep -n '<<<<<<< ' -- <files>` 复核)
60
+ - 若仍有未解决冲突:
61
+ - `git merge --abort`
62
+ - 输出 `{"error":"PR_MERGE_CONFLICTS_UNRESOLVED"}`
63
+ - 全部解决后:
64
+ - `git add -A` 后 `git commit`(建议 message:`chore(pr #<PR_NUMBER>): resolve merge conflicts`)
65
+ - `git push`(如无 upstream:`git push -u origin HEAD`)
66
+ - 任一步失败则输出 `{"error":"PR_CONFLICT_AUTO_RESOLVE_FAILED"}`
67
+ - 推送失败输出 `{"error":"PR_CONFLICT_PUSH_FAILED"}`
68
+
69
+ 4. 预检:lint + build
33
70
 
34
71
  - 运行 `dx lint`
35
- - 运行 `dx build affected --dev`
72
+ - 运行 `dx build affected --dev -- --base=origin/<baseRefName> --head=HEAD`
36
73
 
37
- 4. 若 lint/build 失败:生成 fixFile(Markdown
74
+ 5. 若 lint/build 失败:生成 fixFile(Markdown)并返回失败
38
75
 
39
76
  - 写入前先 `mkdir -p "$HOME/.opencode/cache"`
40
77
  - fixFile 路径:`~/.opencode/cache/precheck-fix-pr<PR_NUMBER>-<RUN_ID>.md`
41
78
  - fixFile 只包含 `## IssuesToFix`
79
+ - fixFile 格式(Markdown,最小字段集,供 `pr-fix` 解析):
80
+
81
+ ```md
82
+ ## IssuesToFix
83
+
84
+ - id: PRE-001
85
+ priority: P0|P1|P2|P3
86
+ category: lint|build|quality
87
+ file: <path>
88
+ line: <number|null>
89
+ title: <short>
90
+ description: <error message>
91
+ suggestion: <how to fix>
92
+ ```
42
93
  - 每条 issue 的 `id` 必须以 `PRE-` 开头(例如 `PRE-001`)
43
94
  - 尽量从输出中提取 file/line;取不到则 `line: null`
44
95
 
@@ -54,4 +105,5 @@ tools:
54
105
 
55
106
  - 不要输出任何时间字段
56
107
  - 不要在 stdout 输出 lint/build 的长日志(写入 fixFile 的 description 即可)
108
+ - stdout 只能输出最终的单一 JSON 对象(其余命令输出请重定向到文件或丢弃)
57
109
  - 允许使用 bash 生成 runId(例如 8-12 位随机/sha1 截断均可)
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  allowed-tools: [Bash, AskUserQuestion, Edit, Read, Write]
3
3
  description: '环境诊断'
4
- agent: sisyphus
4
+ agent: middle
5
5
  ---
6
6
 
7
7
  ---
@@ -20,30 +20,34 @@ agent: sisyphus
20
20
  - `pr-review-aggregate`
21
21
  - `pr-fix`
22
22
 
23
- ## 循环前
23
+ ## 循环(最多 2 轮)
24
24
 
25
- 0. Task: `pr-precheck`
26
-
27
- - prompt 必须包含:`PR #{{PR_NUMBER}}`
28
- - 若返回 `{"error":"..."}`:立即终止
29
- - 若返回 `{"ok":false,"fixFile":"..."}`:调用一次 `pr-fix` 修复,然后再调用一次 `pr-precheck`,必须拿到 `{"ok":true}` 才进入循环
25
+ 每轮按顺序执行:
30
26
 
31
- ## 循环(最多 3 轮)
27
+ 0. Task: `pr-precheck`(强制 gate:编译/预检必须先通过)
32
28
 
33
- 每轮按顺序执行:
29
+ - prompt 必须包含:`PR #{{PR_NUMBER}}`
30
+ - 若返回 `{"error":"..."}`:立即终止本轮并回传错误(不再调用 reviewers)
31
+ - 若返回 `{"ok":false,"fixFile":"..."}`:
32
+ - 最多修复 2 次(防止无限循环):
33
+ - 第 1 次:Task `pr-fix`(使用该 fixFile)→ 再 Task `pr-precheck`
34
+ - 若仍返回 `{"ok":false,"fixFile":"..."}`:第 2 次 Task `pr-fix` → 再 Task `pr-precheck`
35
+ - 若仍不是 `{"ok":true}`:终止并回传错误(建议:`{"error":"PRECHECK_NOT_CLEAN_AFTER_FIX"}`)
34
36
 
35
- 1. Task: `pr-context`
37
+ 1. Task: `pr-context` **(必须先完成,不可与 Step 2 并行)**
36
38
 
37
39
  - prompt 必须包含:`PR #{{PR_NUMBER}}`、`round: <ROUND>`
38
40
  - 若返回 `{"error":"..."}`:立即终止本轮并回传错误(不再调用 reviewers)
39
41
  - 取出:`contextFile`、`runId`、`headOid`(如有)
42
+ - **CRITICAL**: 必须等待此 Task 成功完成并获取到 `contextFile` 后,才能进入 Step 2
40
43
 
41
- 2. Task(并行): `codex-reviewer` + `claude-reviewer` + `gemini-reviewer`
44
+ 2. Task(并行): `codex-reviewer` + `claude-reviewer` + `gemini-reviewer` **(依赖 Step 1 的 contextFile)**
42
45
 
46
+ - **DEPENDENCY**: 这三个 reviewers 依赖 Step 1 返回的 `contextFile`,因此**必须等 Step 1 完成后才能并行启动**
43
47
  - 每个 reviewer prompt 必须包含:
44
48
  - `PR #{{PR_NUMBER}}`
45
49
  - `round: <ROUND>`
46
- - `contextFile: <path>`
50
+ - `contextFile: <path>`(来自 Step 1 的输出)
47
51
  - reviewer 默认读 `contextFile`;必要时允许用 `git/gh` 只读命令拿 diff
48
52
  - 忽略问题:1.格式化代码引起的噪音 2.已经lint检查以外的格式问题
49
53
  - 特别关注: 逻辑、安全、性能、可维护性
@@ -72,4 +76,4 @@ agent: sisyphus
72
76
 
73
77
  6. 下一轮
74
78
 
75
- - 回到 1
79
+ - 回到 0(先跑 precheck gate,再进入下一轮 reviewers)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ranger1/dx",
3
- "version": "0.1.21",
3
+ "version": "0.1.23",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "repository": {