@ranger1/dx 0.1.71 → 0.1.72
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/codex/skills/pr-review-loop/SKILL.md +9 -10
- package/codex/skills/pr-review-loop/references/agents/pr-precheck.md +16 -10
- package/codex/skills/pr-review-loop/references/agents/pr-review-aggregate.md +5 -5
- package/package.json +1 -1
- package/codex/skills/pr-review-loop/references/agents/logic-reviewer.md +0 -22
- package/codex/skills/pr-review-loop/references/agents/security-reviewer.md +0 -21
- package/codex/skills/pr-review-loop/references/agents/style-reviewer.md +0 -22
|
@@ -43,6 +43,8 @@ description: pr 审查
|
|
|
43
43
|
|
|
44
44
|
## 阶段 0:预检 gate(必须先通过)
|
|
45
45
|
|
|
46
|
+
reviewer 配置检测由 `pr-precheck` 执行,并且必须在其他预检动作之前完成。
|
|
47
|
+
|
|
46
48
|
调用 `spark`,输入:
|
|
47
49
|
--prompt: `${CODEX_HOME:-$HOME/.codex}/skills/pr-review-loop/references/agents/pr-precheck.md`
|
|
48
50
|
--others: `PR #<PR_NUMBER> - round <1>`
|
|
@@ -69,11 +71,10 @@ description: pr 审查
|
|
|
69
71
|
## 阶段 2~N:最多 3 轮循环
|
|
70
72
|
### Step 2: reviewers 并行(唯一允许并行阶段)
|
|
71
73
|
|
|
72
|
-
并行调用同一个 `reviewer`
|
|
74
|
+
并行调用同一个 `reviewer` 角色的多个实例(提示词驱动实体),提示词来源为项目根目录:
|
|
73
75
|
|
|
74
|
-
-
|
|
75
|
-
-
|
|
76
|
-
- `${CODEX_HOME:-$HOME/.codex}/skills/pr-review-loop/references/agents/style-reviewer.md`
|
|
76
|
+
- 使用阶段 0(precheck)已确认可用的 `./reviewer/*-reviewer.md` 列表,发现几个文件就并行启动几个 reviewer 实例(1..N)。
|
|
77
|
+
- 每个文件中的 `ROLE_CODE = <CODE>` 用于统一命名产物和 findings 前缀。
|
|
77
78
|
|
|
78
79
|
每个 reviewer 实例输入至少包含:
|
|
79
80
|
|
|
@@ -81,20 +82,18 @@ description: pr 审查
|
|
|
81
82
|
- `round: <ROUND>`
|
|
82
83
|
- `runId: <RUN_ID>` 来自 Step 1 的输出,必须透传,禁止自行生成)
|
|
83
84
|
- `contextFile: ./.cache/<file>.md`
|
|
84
|
-
- `reviewerPromptFile:
|
|
85
|
-
- `reviewerPromptContent: <reviewerPromptFile 的全文>`
|
|
85
|
+
- `reviewerPromptFile: ./reviewer/<name>-reviewer.md`
|
|
86
86
|
- `decisionLogFile: ./.cache/decision-log-pr<PR_NUMBER>.md`(若存在)
|
|
87
87
|
|
|
88
88
|
执行要求:
|
|
89
89
|
|
|
90
90
|
- reviewer 必须先读取 `reviewerPromptFile`,并严格按其中规则执行。
|
|
91
|
-
- 若调用框架不自动注入文件内容,orchestrator 必须显式把 `reviewerPromptContent` 一并传给 reviewer。
|
|
92
91
|
- 当通用 reviewer 约束与 `reviewerPromptFile` 冲突时,以 `reviewerPromptFile` 为准。
|
|
93
|
-
-
|
|
92
|
+
- 每个 reviewer 产物命名必须使用其 `ROLE_CODE`:`./.cache/review-<ROLE_CODE>-pr<PR_NUMBER>-r<ROUND>-<RUN_ID>.md`。
|
|
94
93
|
|
|
95
94
|
每个 reviewer 实例输出:
|
|
96
95
|
|
|
97
|
-
- `reviewFile: ./.cache
|
|
96
|
+
- `reviewFile: ./.cache/review-<ROLE_CODE>-pr<PR_NUMBER>-r<ROUND>-<RUN_ID>.md`
|
|
98
97
|
|
|
99
98
|
### Step 3: 聚合(模式 A)
|
|
100
99
|
|
|
@@ -102,7 +101,7 @@ description: pr 审查
|
|
|
102
101
|
--prompt: `${CODEX_HOME:-$HOME/.codex}/skills/pr-review-loop/references/agents/pr-review-aggregate.md`
|
|
103
102
|
--others: `contextFile + 1..n reviewFile + runId (+ decisionLogFile) + 模式 A`。
|
|
104
103
|
|
|
105
|
-
- 输出 `{"stop":true}
|
|
104
|
+
- 输出 `{"stop":true}`:进入 Step 7 本轮结束退出循环。
|
|
106
105
|
- 输出 `{"stop":false,"fixFile":"..."}`:进入 Step 4。
|
|
107
106
|
- 输出 `{"error":"GH_PR_COMMENT_FAILED"}`:按可重试错误处理,优先重试本步骤(脚本幂等,重复调用安全)。
|
|
108
107
|
- 其他 `{"error":"..."}`:按“错误分级与重试”处理。
|
|
@@ -16,18 +16,24 @@
|
|
|
16
16
|
|
|
17
17
|
## 预检流程(按顺序执行)
|
|
18
18
|
|
|
19
|
-
1.
|
|
19
|
+
1. reviewer 配置校验(强制,先于其他所有检测)
|
|
20
|
+
- 项目根目录必须存在 `./reviewer/` 目录。
|
|
21
|
+
- `./reviewer/` 下必须至少有一个 `*-reviewer.md` 文件。
|
|
22
|
+
- 每个 `*-reviewer.md` 文件都必须包含 `ROLE_CODE = <CODE>`(例如 `ROLE_CODE = STY`)。
|
|
23
|
+
- 若上述任一条件不满足,立即终止并返回:`{"error":"REVIEWER_CONFIG_INVALID","detail":"..."}`。
|
|
24
|
+
|
|
25
|
+
2. 参数校验
|
|
20
26
|
- `PR_NUMBER` 必须是正整数;`round` 必须是 `>=1` 的整数。
|
|
21
27
|
- 参数非法时返回:`{"error":"INVALID_ARGS"}`(可附带 `prNumber`、`round`)。
|
|
22
28
|
|
|
23
|
-
|
|
29
|
+
3. 工作区干净校验(强制)
|
|
24
30
|
- 先校验是否在 git 仓库:`git rev-parse --is-inside-work-tree`。
|
|
25
31
|
- 非 git 仓库时返回:`{"error":"NOT_A_GIT_REPO"}`。
|
|
26
32
|
- 执行:`git status --porcelain`。
|
|
27
33
|
- 若存在未提交变更(包含 staged/unstaged/untracked),直接返回:
|
|
28
34
|
- `{"error":"UNCOMMITTED_CHANGES_PRESENT","detail":"请先处理当前仓库全部未提交代码后再执行 precheck"}`。
|
|
29
35
|
|
|
30
|
-
|
|
36
|
+
4. 切换到 PR 分支并与远程同步(优先自愈)
|
|
31
37
|
- 先从输入文本解析出实际 PR 编号(例如从 `PR #2884` 解析得到 `2884`),记为 `prNumber`。
|
|
32
38
|
- 所有命令中的 `<PR_NUMBER>` 都表示占位符,必须替换为真实数字后再执行,禁止原样执行字面量 `gh pr checkout <PR_NUMBER>`。
|
|
33
39
|
- 首选执行:使用gh 命令获取 PR 相关信息并切换到对应分支
|
|
@@ -46,16 +52,16 @@
|
|
|
46
52
|
- checkout 失败:`{"error":"PR_CHECKOUT_FAILED"}`。
|
|
47
53
|
- 与远程同步失败:`{"error":"PR_SYNC_FAILED"}`。
|
|
48
54
|
|
|
49
|
-
|
|
55
|
+
5. 清理缓存目录(强制)
|
|
50
56
|
- 清理 `./.cache/` 下所有历史文件(保留目录本身),推荐:
|
|
51
57
|
- `mkdir -p ./.cache && find ./.cache -mindepth 1 -delete`
|
|
52
58
|
- 清理失败返回:`{"error":"CACHE_CLEAN_FAILED"}`。
|
|
53
59
|
|
|
54
|
-
|
|
60
|
+
6. 读取 PR 元信息(含 SSH 降级)
|
|
55
61
|
- 首选执行:
|
|
56
62
|
- `gh pr view <PR_NUMBER> --json headRefName,baseRefName,mergeable,headRefOid`
|
|
57
63
|
- 若 `gh` 可用,必须提取:`headRefName`、`baseRefName`、`mergeable`、`headRefOid`。
|
|
58
|
-
- 若 `gh` 因认证失败不可用,但第
|
|
64
|
+
- 若 `gh` 因认证失败不可用,但第 4 步已完成 SSH 自愈,则使用 git 回填字段:
|
|
59
65
|
- `headRefName`:`git rev-parse --abbrev-ref HEAD`
|
|
60
66
|
- `headRefOid`:`git rev-parse HEAD`
|
|
61
67
|
- `baseRefName`:`git symbolic-ref --short refs/remotes/origin/HEAD | sed 's#^origin/##'`
|
|
@@ -63,12 +69,12 @@
|
|
|
63
69
|
- 若 `headRefOid` 缺失:返回 `{"error":"PR_HEAD_OID_NOT_FOUND"}`。
|
|
64
70
|
- 若主路径与降级路径都无法获取有效元信息:返回 `{"error":"PR_NOT_FOUND_OR_NO_ACCESS"}`。
|
|
65
71
|
|
|
66
|
-
|
|
72
|
+
7. 生成 runId(强制)
|
|
67
73
|
- `headShort = headRefOid[:7]`
|
|
68
74
|
- `runId = <PR_NUMBER>-<round>-<headShort>`
|
|
69
75
|
- 后续输出中的 `runId/headOid/headShort` 必须与此一致,禁止重算为其他值。
|
|
70
76
|
|
|
71
|
-
|
|
77
|
+
8. 校验 base 信息并抓取远程基线
|
|
72
78
|
- 若 `baseRefName` 为空,尝试:
|
|
73
79
|
- `gh repo view --json defaultBranchRef --jq .defaultBranchRef.name`
|
|
74
80
|
- 若仍为空,且已走 SSH 降级路径,尝试:
|
|
@@ -76,14 +82,14 @@
|
|
|
76
82
|
- 仍为空返回:`{"error":"PR_BASE_REF_NOT_FOUND"}`。
|
|
77
83
|
- 执行:`git fetch origin <baseRefName>`;失败返回:`{"error":"PR_BASE_REF_FETCH_FAILED"}`。
|
|
78
84
|
|
|
79
|
-
|
|
85
|
+
9. 合并冲突 gate
|
|
80
86
|
- 若 `mergeable == "CONFLICTING"`,直接返回:`{"error":"PR_MERGE_CONFLICTS_UNRESOLVED"}`。
|
|
81
87
|
- 若 `mergeable == "UNKNOWN"`(SSH 降级路径),必须通过试合并判定:
|
|
82
88
|
- `git merge --no-ff --no-commit origin/<baseRefName>`
|
|
83
89
|
- 若出现冲突:`git merge --abort` 后返回 `{"error":"PR_MERGE_CONFLICTS_UNRESOLVED"}`。
|
|
84
90
|
- 若无冲突:`git merge --abort`,继续下一步。
|
|
85
91
|
|
|
86
|
-
|
|
92
|
+
10. 质量 gate(预检核心)
|
|
87
93
|
- 创建日志文件(都放 `./.cache/`):
|
|
88
94
|
- `precheck-<runId>-build.log`
|
|
89
95
|
- `precheck-<runId>-meta.json`
|
|
@@ -38,9 +38,9 @@ round: 1
|
|
|
38
38
|
runId: 123-1-a1b2c3d
|
|
39
39
|
contextFile: ./.cache/pr-context-pr123-r1-123-1-a1b2c3d.md
|
|
40
40
|
reviewFile: ./.cache/review-SEC-pr123-r1-123-1-a1b2c3d.md
|
|
41
|
-
reviewFile: ./.cache/review-
|
|
42
|
-
reviewFile: ./.cache/review-
|
|
43
|
-
reviewFile: ./.cache/review-
|
|
41
|
+
reviewFile: ./.cache/review-PERF-pr123-r1-123-1-a1b2c3d.md
|
|
42
|
+
reviewFile: ./.cache/review-MAINT-pr123-r1-123-1-a1b2c3d.md
|
|
43
|
+
reviewFile: ./.cache/review-BIZ-pr123-r1-123-1-a1b2c3d.md
|
|
44
44
|
```
|
|
45
45
|
|
|
46
46
|
## 执行方式(强制)
|
|
@@ -59,7 +59,7 @@ runId: 123-1-a1b2c3d
|
|
|
59
59
|
注意:这行 JSON **不是你的最终输出**,它只用于生成 `--duplicate-groups-b64` 传给脚本。
|
|
60
60
|
|
|
61
61
|
```json
|
|
62
|
-
{"duplicateGroups":[["
|
|
62
|
+
{"duplicateGroups":[["PERF-001","BIZ-003"],["MAINT-002","BIZ-005","SEC-004"]]}
|
|
63
63
|
```
|
|
64
64
|
|
|
65
65
|
## 智能匹配(仅在模式 A + decision-log 存在时)
|
|
@@ -87,7 +87,7 @@ runId: 123-1-a1b2c3d
|
|
|
87
87
|
5. 生成**一行 JSON**(不要代码块、不要解释文字、不要换行),结构如下:
|
|
88
88
|
|
|
89
89
|
```json
|
|
90
|
-
{"escalationGroups":[["SEC-001"],["
|
|
90
|
+
{"escalationGroups":[["SEC-001"],["MAINT-002","BIZ-005"]]}
|
|
91
91
|
```
|
|
92
92
|
|
|
93
93
|
其中每个组表示「可以作为已 rejected 问题的升级质疑」的 finding ID 集合。若无可升级问题,输出空数组:
|
package/package.json
CHANGED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
# PR Reviewer (Logic)
|
|
2
|
-
|
|
3
|
-
## 角色码(强制)
|
|
4
|
-
|
|
5
|
-
- `ROLE_CODE = LOG`
|
|
6
|
-
- `reviewFile`: `./.cache/review-LOG-pr<PR_NUMBER>-r<ROUND>-<RUN_ID>.md`
|
|
7
|
-
- findings id 前缀:`LOG-`
|
|
8
|
-
|
|
9
|
-
## 专责范围(强制)
|
|
10
|
-
|
|
11
|
-
- 仅关注逻辑正确性:业务分支正确性、边界条件、空值/异常路径、状态机转换、并发一致性、事务边界、幂等性、回滚与补偿
|
|
12
|
-
- 非逻辑类建议(纯命名/排版/文风)默认不提
|
|
13
|
-
|
|
14
|
-
## 逻辑审核词(执行清单)
|
|
15
|
-
|
|
16
|
-
1. 状态迁移:状态机是否存在非法跳转、漏转移、重复转移。
|
|
17
|
-
2. 分支完备性:主流程、异常流程、空值分支、极端边界是否闭合。
|
|
18
|
-
3. 一致性与幂等:重复请求、重试、并发写入是否导致脏数据或重复副作用。
|
|
19
|
-
4. 事务与补偿:事务边界是否正确,失败后是否可回滚或补偿。
|
|
20
|
-
5. 时序与竞态:异步回调/事件驱动下是否存在先后顺序依赖漏洞。
|
|
21
|
-
6. 数据约束:校验、默认值、转换规则是否与业务语义一致。
|
|
22
|
-
7. 高风险优先级:会造成业务错误结论、资金/库存/配额错误的,优先判为 P0/P1。
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
# PR Reviewer (Security)
|
|
2
|
-
|
|
3
|
-
## 角色码(强制)
|
|
4
|
-
|
|
5
|
-
- `ROLE_CODE = SEC`
|
|
6
|
-
- `reviewFile`: `./.cache/review-SEC-pr<PR_NUMBER>-r<ROUND>-<RUN_ID>.md`
|
|
7
|
-
- findings id 前缀:`SEC-`
|
|
8
|
-
|
|
9
|
-
## 专责范围(强制)
|
|
10
|
-
- 仅关注安全问题:认证鉴权、权限绕过、敏感数据泄漏、注入风险、SSRF、XSS、越权访问、密钥管理、加密与签名正确性
|
|
11
|
-
- 非安全类建议(纯风格、一般重构、非安全性能建议)默认不提
|
|
12
|
-
|
|
13
|
-
## 安全审核词(执行清单)
|
|
14
|
-
|
|
15
|
-
1. 认证与会话:令牌签发/校验、会话失效、重放防护、登出后状态一致性。
|
|
16
|
-
2. 鉴权与越权:资源级权限检查是否缺失,是否可通过参数篡改访问他人数据。
|
|
17
|
-
3. 输入到执行链路:SQL/命令/模板/表达式注入风险,动态拼接是否可控。
|
|
18
|
-
4. 输出与前端交互:XSS、开放重定向、敏感错误信息回显。
|
|
19
|
-
5. 外部访问:SSRF、回调 URL 白名单、内网地址探测、协议滥用。
|
|
20
|
-
6. 密钥与配置:密钥硬编码、日志泄漏、弱加密、签名与验签不一致。
|
|
21
|
-
7. 高危优先级:可直接导致数据泄漏、权限提升、远程执行的,优先判为 P0/P1。
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
# PR Reviewer (Style)
|
|
2
|
-
|
|
3
|
-
## 角色码(强制)
|
|
4
|
-
|
|
5
|
-
- `ROLE_CODE = STY`
|
|
6
|
-
- `reviewFile`: `./.cache/review-STY-pr<PR_NUMBER>-r<ROUND>-<RUN_ID>.md`
|
|
7
|
-
- findings id 前缀:`STY-`
|
|
8
|
-
|
|
9
|
-
## 专责范围(强制)
|
|
10
|
-
|
|
11
|
-
- 仅关注代码规范与可维护性:重复代码、过度复杂度、命名可读性、模块边界、注释与文档一致性、可测试性、易演进性
|
|
12
|
-
- 对纯格式化噪音保持忽略;优先提出会降低长期维护成本的问题
|
|
13
|
-
|
|
14
|
-
## 风格与可维护性审核词(执行清单)
|
|
15
|
-
|
|
16
|
-
1. 复杂度:长函数、深层嵌套、隐式耦合、难以推理的控制流。
|
|
17
|
-
2. 重复与抽象:重复逻辑是否应提取,抽象层级是否过度或不足。
|
|
18
|
-
3. 命名与边界:命名是否准确表达语义,模块职责是否清晰、边界是否泄漏。
|
|
19
|
-
4. 可测试性:代码是否难以隔离测试,是否引入不必要的全局状态或隐藏依赖。
|
|
20
|
-
5. 变更韧性:未来扩展时是否需要大面积联动修改,是否存在脆弱接口。
|
|
21
|
-
6. 文档与注释:注释是否过期、误导,公共接口是否缺少必要约定说明。
|
|
22
|
-
7. 优先级判断:优先提出会显著降低长期维护成本、减少后续缺陷密度的问题。
|