@ranger1/dx 0.1.21 → 0.1.22
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:
|
|
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.
|
|
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
|
-
|
|
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 截断均可)
|
|
@@ -20,17 +20,19 @@ agent: sisyphus
|
|
|
20
20
|
- `pr-review-aggregate`
|
|
21
21
|
- `pr-fix`
|
|
22
22
|
|
|
23
|
-
##
|
|
23
|
+
## 循环(最多 2 轮)
|
|
24
24
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
- prompt 必须包含:`PR #{{PR_NUMBER}}`
|
|
28
|
-
- 若返回 `{"error":"..."}`:立即终止
|
|
29
|
-
- 若返回 `{"ok":false,"fixFile":"..."}`:调用一次 `pr-fix` 修复,然后再调用一次 `pr-precheck`,必须拿到 `{"ok":true}` 才进入循环
|
|
25
|
+
每轮按顺序执行:
|
|
30
26
|
|
|
31
|
-
|
|
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
37
|
1. Task: `pr-context`
|
|
36
38
|
|
|
@@ -72,4 +74,4 @@ agent: sisyphus
|
|
|
72
74
|
|
|
73
75
|
6. 下一轮
|
|
74
76
|
|
|
75
|
-
- 回到
|
|
77
|
+
- 回到 0(先跑 precheck gate,再进入下一轮 reviewers)
|