@ranger1/dx 0.1.70 → 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.
@@ -43,20 +43,18 @@ 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>`
49
51
 
50
52
  处理规则:
51
53
 
52
- - 若返回 `{"error":"..."}`:按“错误分级与重试”处理。
53
54
  - 若返回 `{"ok":true}`:进入下一阶段。
54
- - 若返回 `{"ok":false,"fixFile":"..."}`:
55
- - 必须调用 `fixer` 处理该 `fixFile`。
56
- - 然后重跑 precheck。
57
- - 最多修复 2 次;若仍不通过,终止并返回 `PRECHECK_NOT_CLEAN_AFTER_FIX`。
55
+ - 若返回 `{"error":"..."}`:立即终止流程,不重试;直接透传 precheck 的简短失败原因(可附带 `fixFile`)。
58
56
 
59
- 说明:预检失败修复也必须记录到 decision-log(可使用 `file: __precheck__`)。
57
+ 说明:阶段 0 是强 gate,不允许修复后重跑,也不进入“错误分级与重试”。
60
58
 
61
59
 
62
60
  ## Step 1: 生成上下文(串行)
@@ -73,11 +71,10 @@ description: pr 审查
73
71
  ## 阶段 2~N:最多 3 轮循环
74
72
  ### Step 2: reviewers 并行(唯一允许并行阶段)
75
73
 
76
- 并行调用同一个 `reviewer` 角色的多个实例(提示词驱动实体),至少包含以下 3 个提示词:
74
+ 并行调用同一个 `reviewer` 角色的多个实例(提示词驱动实体),提示词来源为项目根目录:
77
75
 
78
- - `${CODEX_HOME:-$HOME/.codex}/skills/pr-review-loop/references/agents/security-reviewer.md`
79
- - `${CODEX_HOME:-$HOME/.codex}/skills/pr-review-loop/references/agents/logic-reviewer.md`
80
- - `${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 前缀。
81
78
 
82
79
  每个 reviewer 实例输入至少包含:
83
80
 
@@ -85,20 +82,18 @@ description: pr 审查
85
82
  - `round: <ROUND>`
86
83
  - `runId: <RUN_ID>` 来自 Step 1 的输出,必须透传,禁止自行生成)
87
84
  - `contextFile: ./.cache/<file>.md`
88
- - `reviewerPromptFile: <上述 md 之一>`
89
- - `reviewerPromptContent: <reviewerPromptFile 的全文>`
85
+ - `reviewerPromptFile: ./reviewer/<name>-reviewer.md`
90
86
  - `decisionLogFile: ./.cache/decision-log-pr<PR_NUMBER>.md`(若存在)
91
87
 
92
88
  执行要求:
93
89
 
94
90
  - reviewer 必须先读取 `reviewerPromptFile`,并严格按其中规则执行。
95
- - 若调用框架不自动注入文件内容,orchestrator 必须显式把 `reviewerPromptContent` 一并传给 reviewer。
96
91
  - 当通用 reviewer 约束与 `reviewerPromptFile` 冲突时,以 `reviewerPromptFile` 为准。
97
- - `security-reviewer` 专注安全与权限边界;`logic-reviewer` 专注逻辑正确性与边界条件;`style-reviewer` 专注可维护性、可读性与工程规范;`gh-thread-reviewer` 专注外部评论采集与归一化。
92
+ - 每个 reviewer 产物命名必须使用其 `ROLE_CODE`:`./.cache/review-<ROLE_CODE>-pr<PR_NUMBER>-r<ROUND>-<RUN_ID>.md`。
98
93
 
99
94
  每个 reviewer 实例输出:
100
95
 
101
- - `reviewFile: ./.cache/<file>.md`
96
+ - `reviewFile: ./.cache/review-<ROLE_CODE>-pr<PR_NUMBER>-r<ROUND>-<RUN_ID>.md`
102
97
 
103
98
  ### Step 3: 聚合(模式 A)
104
99
 
@@ -106,7 +101,7 @@ description: pr 审查
106
101
  --prompt: `${CODEX_HOME:-$HOME/.codex}/skills/pr-review-loop/references/agents/pr-review-aggregate.md`
107
102
  --others: `contextFile + 1..n reviewFile + runId (+ decisionLogFile) + 模式 A`。
108
103
 
109
- - 输出 `{"stop":true}`:本轮结束并退出循环。
104
+ - 输出 `{"stop":true}`:进入 Step 7 本轮结束退出循环。
110
105
  - 输出 `{"stop":false,"fixFile":"..."}`:进入 Step 4。
111
106
  - 输出 `{"error":"GH_PR_COMMENT_FAILED"}`:按可重试错误处理,优先重试本步骤(脚本幂等,重复调用安全)。
112
107
  - 其他 `{"error":"..."}`:按“错误分级与重试”处理。
@@ -169,13 +164,14 @@ final-report 由 `aggregator` 调用脚本发布,且幂等。
169
164
  1. 可重试错误:先重试再决定终止。
170
165
  2. 不可恢复错误:立即终止。
171
166
 
167
+ 例外:阶段 0(预检 gate)不适用本节重试策略;除 `ok:true` 外,其余返回(含任意 `error`)都必须立即终止。
168
+
172
169
  ### 可重试错误(建议最多 2 次重试,合计最多 3 次尝试)
173
170
 
174
171
  - `GH_PR_COMMENT_FAILED`
175
172
  - `HARVEST_FAILED`
176
173
  - `AGGREGATE_SCRIPT_FAILED`
177
174
  - `PR_CONTEXT_SCRIPT_FAILED`
178
- - `PR_PRECHECK_AGENT_FAILED`
179
175
  - `GIT_PUSH_FAILED_NETWORK`
180
176
  - 其他明显网络抖动/平台瞬时错误(例如 gh API 超时)
181
177
 
@@ -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
- 2. 工作区干净校验(强制)
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
- 3. 切换到 PR 分支并与远程同步(优先自愈)
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
- 4. 清理缓存目录(强制)
55
+ 5. 清理缓存目录(强制)
50
56
  - 清理 `./.cache/` 下所有历史文件(保留目录本身),推荐:
51
57
  - `mkdir -p ./.cache && find ./.cache -mindepth 1 -delete`
52
58
  - 清理失败返回:`{"error":"CACHE_CLEAN_FAILED"}`。
53
59
 
54
- 5. 读取 PR 元信息(含 SSH 降级)
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` 因认证失败不可用,但第 3 步已完成 SSH 自愈,则使用 git 回填字段:
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
- 6. 生成 runId(强制)
72
+ 7. 生成 runId(强制)
67
73
  - `headShort = headRefOid[:7]`
68
74
  - `runId = <PR_NUMBER>-<round>-<headShort>`
69
75
  - 后续输出中的 `runId/headOid/headShort` 必须与此一致,禁止重算为其他值。
70
76
 
71
- 7. 校验 base 信息并抓取远程基线
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
- 8. 合并冲突 gate
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
- 9. 质量 gate(预检核心)
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-LOG-pr123-r1-123-1-a1b2c3d.md
42
- reviewFile: ./.cache/review-STY-pr123-r1-123-1-a1b2c3d.md
43
- reviewFile: ./.cache/review-GHR-pr123-r1-123-1-a1b2c3d.md
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":[["SEC-001","LOG-003"],["STY-002","LOG-005","SEC-004"]]}
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"],["STY-002","LOG-005"]]}
90
+ {"escalationGroups":[["SEC-001"],["MAINT-002","BIZ-005"]]}
91
91
  ```
92
92
 
93
93
  其中每个组表示「可以作为已 rejected 问题的升级质疑」的 finding ID 集合。若无可升级问题,输出空数组:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ranger1/dx",
3
- "version": "0.1.70",
3
+ "version": "0.1.72",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -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. 优先级判断:优先提出会显著降低长期维护成本、减少后续缺陷密度的问题。