@ranger1/dx 0.1.91 → 0.1.92

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 (52) hide show
  1. package/README.md +2 -2
  2. package/lib/cli/help.js +1 -1
  3. package/lib/codex-initial.js +19 -215
  4. package/package.json +2 -2
  5. package/skills/backend-layering-audit-fixer/SKILL.md +180 -0
  6. package/{codex/skills → skills}/doctor/SKILL.md +2 -9
  7. package/{codex/skills → skills}/doctor/scripts/doctor.sh +2 -253
  8. package/skills/git-pr-ship/SKILL.md +481 -0
  9. package/skills/naming-audit-fixer/SKILL.md +149 -0
  10. package/skills/naming-audit-fixer/references/fix-guide.md +93 -0
  11. package/skills/naming-audit-fixer/scripts/audit_naming.py +534 -0
  12. package/codex/agents/fixer.toml +0 -37
  13. package/codex/agents/orchestrator.toml +0 -11
  14. package/codex/agents/reviewer.toml +0 -52
  15. package/codex/agents/spark.toml +0 -18
  16. package/codex/skills/pr-review-loop/SKILL.md +0 -209
  17. package/codex/skills/pr-review-loop/agents/openai.yaml +0 -4
  18. package/codex/skills/pr-review-loop/references/agents/pr-context.md +0 -73
  19. package/codex/skills/pr-review-loop/references/agents/pr-precheck.md +0 -161
  20. package/codex/skills/pr-review-loop/references/agents/pr-review-aggregate.md +0 -188
  21. package/codex/skills/pr-review-loop/references/skill-layout.md +0 -25
  22. package/codex/skills/pr-review-loop/scripts/gh_review_harvest.py +0 -292
  23. package/codex/skills/pr-review-loop/scripts/pr_context.py +0 -351
  24. package/codex/skills/pr-review-loop/scripts/pr_review_aggregate.py +0 -951
  25. package/codex/skills/pr-review-loop/scripts/test_pr_review_aggregate.py +0 -876
  26. package/codex/skills/pr-review-loop/scripts/test_validate_reviewer_prompts.py +0 -92
  27. package/codex/skills/pr-review-loop/scripts/validate_reviewer_prompts.py +0 -87
  28. /package/{codex/skills → skills}/doctor/agents/openai.yaml +0 -0
  29. /package/{codex/skills → skills}/e2e-audit-fixer/SKILL.md +0 -0
  30. /package/{codex/skills → skills}/e2e-audit-fixer/agents/openai.yaml +0 -0
  31. /package/{codex/skills → skills}/e2e-audit-fixer/scripts/e2e_e2e_audit.py +0 -0
  32. /package/{codex/skills → skills}/env-accessor-audit-fixer/SKILL.md +0 -0
  33. /package/{codex/skills → skills}/env-accessor-audit-fixer/agents/openai.yaml +0 -0
  34. /package/{codex/skills → skills}/env-accessor-audit-fixer/references/bootstrap-env-foundation.md +0 -0
  35. /package/{codex/skills → skills}/env-accessor-audit-fixer/scripts/env_accessor_audit.py +0 -0
  36. /package/{codex/skills → skills}/error-handling-audit-fixer/SKILL.md +0 -0
  37. /package/{codex/skills → skills}/error-handling-audit-fixer/agents/openai.yaml +0 -0
  38. /package/{codex/skills → skills}/error-handling-audit-fixer/references/error-handling-standard.md +0 -0
  39. /package/{codex/skills → skills}/error-handling-audit-fixer/references/foundation-bootstrap.md +0 -0
  40. /package/{codex/skills → skills}/error-handling-audit-fixer/scripts/error_handling_audit.py +0 -0
  41. /package/{codex/skills → skills}/gh-dependabot-cleanup/SKILL.md +0 -0
  42. /package/{codex/skills → skills}/gh-dependabot-cleanup/agents/openai.yaml +0 -0
  43. /package/{codex/skills → skills}/git-commit-and-pr/SKILL.md +0 -0
  44. /package/{codex/skills → skills}/git-commit-and-pr/agents/openai.yaml +0 -0
  45. /package/{codex/skills → skills}/git-release/SKILL.md +0 -0
  46. /package/{codex/skills → skills}/git-release/agents/openai.yaml +0 -0
  47. /package/{codex/skills → skills}/online-debug-guard/SKILL.md +0 -0
  48. /package/{codex/skills → skills}/online-debug-guard/agents/openai.yaml +0 -0
  49. /package/{codex/skills → skills}/pagination-dto-audit-fixer/SKILL.md +0 -0
  50. /package/{codex/skills → skills}/pagination-dto-audit-fixer/agents/openai.yaml +0 -0
  51. /package/{codex/skills → skills}/pagination-dto-audit-fixer/references/pagination-standard.md +0 -0
  52. /package/{codex/skills → skills}/pagination-dto-audit-fixer/scripts/pagination_dto_audit.py +0 -0
@@ -1,52 +0,0 @@
1
- model = "gpt-5.3-codex"
2
- model_reasoning_effort = "medium"
3
- approval_policy = "never"
4
- sandbox_mode = "workspace-write"
5
-
6
- [sandbox_workspace_write]
7
- network_access = true
8
-
9
- developer_instructions = '''
10
- 你是 reviewer 代理。
11
-
12
- 输入必须包含:PR 编号、round、runId、contextFile、reviewerPromptFile(可选 decisionLogFile)。
13
-
14
- 强制规则:
15
- 1. 默认已位于 PR head 对应分支:优先直接读取工作区代码;必要时可用只读 git/gh 命令补充上下文。
16
- 2. 只基于当前代码与 contextFile 评审,禁止凭空猜测不存在的实现。
17
- 3. 忽略:纯格式化噪音、lint 已覆盖的格式问题、单测数量不足本身。
18
- 4. 必须先读取 `reviewerPromptFile` 并严格执行其中定义的“角色码 / 专责范围 / 专属审核词”。
19
- - `reviewerPromptFile` 必须来自当前项目根目录的 `./reviewer/*-reviewer.md`(允许传 repo 相对路径或其对应绝对路径)。
20
- - 若 `reviewerPromptFile` 不存在、不可读、越过项目根目录,或不匹配 `./reviewer/*-reviewer.md`,返回 `{"error":"INVALID_REVIEWER_PROMPT_FILE"}`。
21
- - 若本文件规则与 `reviewerPromptFile` 有冲突,以 `reviewerPromptFile` 为准。
22
- - reviewer 只负责当前 `reviewerPromptFile` 指定的审查视角,禁止越权扩展到其他视角。
23
- 5. runId 仅允许透传(格式 `<PR>-<ROUND>-<HEAD_SHORT>`),禁止自行重算或改写。
24
- 6. 决策日志约束(当提供 decisionLogFile 时强制生效):
25
- - Fixed 不再重复提出。
26
- - Rejected 除非优先级升级 >=2,否则不再提出。
27
- - 匹配时必须 file 一致,不做跨文件/重命名追踪。
28
- - 不质疑已修复问题的实现方式(除非发现修复引入新 bug)。
29
- 7. 缓存约定:统一使用 `./.cache/`,交接路径必须是 repo 相对路径(`./.cache/<file>`),禁止 basename-only。
30
- 8. 输出文件命名:`./.cache/review-<ROLE_CODE>-pr<PR_NUMBER>-r<ROUND>-<RUN_ID>.md`。
31
- - `<ROLE_CODE>` 由 `reviewerPromptFile` 提供(例如 SEC / LOG / STY)。
32
- - findings 的 `id` 前缀必须是 `<ROLE_CODE>-`。
33
- 9. reviewFile 内容必须是以下结构(字段名不可改):
34
- - `# Review (<ROLE_CODE>)`
35
- - `PR: <PR_NUMBER>`
36
- - `Round: <ROUND>`
37
- - `RunId: <RUN_ID>`
38
- - `## Findings`
39
- - 若无问题,`## Findings` 段内容必须仅为 `None`
40
- - 若有问题,每条 finding 必须使用固定 key-value 块,字段为:
41
- `id / priority / category / file / line / title / description / suggestion`
42
- - 禁止输出 `## Summary`、表格、额外总结 prose、代码块或嵌套列表。
43
- 10. 输出前必须自检:
44
- - `PR / Round / RunId` 与输入完全一致。
45
- - 每个 finding 字段齐全且非空。
46
- - `priority` 只能是 `P0 / P1 / P2 / P3`。
47
- - `line` 必须是单个数字;未知时写 `null`。
48
- - `id` 前缀与 `<ROLE_CODE>-` 一致。
49
- 11. 若本文件与 `reviewerPromptFile` 的输出格式要求冲突,以 `reviewerPromptFile` 为准;但不得放宽本文件的最小结构化要求。
50
- 12. 最终响应只输出一行:`reviewFile: ./.cache/<file>.md`。
51
-
52
- '''
@@ -1,18 +0,0 @@
1
- model = "gpt-5.3-codex"
2
- model_reasoning_effort = "medium"
3
- approval_policy = "never"
4
- sandbox_mode = "danger-full-access"
5
-
6
- developer_instructions = '''
7
- 你是一个通用agent 根据输入的提示词,完整遵循他的要求执行任务
8
-
9
-
10
- 输入必须包含:
11
- --prompt 提示词字符串,要求严格按照提示词执行
12
- --others 其他参数根据提示词要求
13
-
14
- 强制规则:
15
- 如果传入的prompt是一个文件路径,必须读取文件内容作为提示词,否则直接使用传入的字符串作为提示词。
16
- prompt是一个文件路径并不存在时,必须返回结构化错误:{"error":"PROMPT_FILE_NOT_FOUND","detail":"<file_path>"}
17
-
18
- '''
@@ -1,209 +0,0 @@
1
- ---
2
- name: pr-review-loop
3
- description: pr 审查
4
- ---
5
-
6
- ## 输入
7
-
8
- - `PR_NUMBER`
9
- - `round`(默认 1,由编排器控制)
10
- # PR 审核闭环(技能主编排)
11
-
12
- 本文件是该技能的**唯一编排真值源**。不要再依赖独立的编排 md 文件。
13
-
14
- ## 适用场景
15
-
16
- - 用户要求对某个 GitHub PR 执行“审核 -> 修复 -> 再审核”的循环。
17
- - 需要严格执行 `runId` 透传、`./.cache` 交接、Decision Log 持久化。
18
- - 需要确保修复动作由专职 `fixer` 角色执行,而不是编排器直接改代码。
19
-
20
- ## 目录约定
21
-
22
- - 子代理说明:`${CODEX_HOME:-$HOME/.codex}/skills/pr-review-loop/references/agents/*.md`
23
- - 确定性脚本:`${CODEX_HOME:-$HOME/.codex}/skills/pr-review-loop/scripts/*.py`
24
- - 缓存目录:`./.cache/`
25
-
26
-
27
- ## 输入
28
-
29
- - `PR_NUMBER`
30
- - `round`(默认 1,由编排器控制)
31
-
32
- ## runId(强制)
33
-
34
- - 格式:`<PR>-<ROUND>-<HEAD_SHORT>`
35
- - 生成者:`pr_context.py`(或 precheck 输出中的同格式值)
36
- - 后续所有阶段仅允许透传,禁止重算或篡改。
37
-
38
- ## 角色分工(强制)
39
-
40
- - `reviewer`:并行执行审查,产出 reviewFile。
41
- - `fixer`:执行修复、提交推送、维护 decision-log、产出 fixReportFile。
42
- - `spark`:通用agent 根据提示词执行通用任务。
43
-
44
- ## 阶段 0:预检 gate(必须先通过)
45
-
46
- reviewer 配置检测由 `pr-precheck` 执行,并且必须在其他预检动作之前完成。
47
-
48
- 调用 `spark`,输入:
49
- --prompt: `${CODEX_HOME:-$HOME/.codex}/skills/pr-review-loop/references/agents/pr-precheck.md`
50
- --others: `PR #<PR_NUMBER> - round <1>`
51
-
52
- 处理规则:
53
-
54
- - 若返回 `{"ok":true}`:进入下一阶段。
55
- - 若返回 `{"error":"..."}`:立即终止流程,不重试;直接透传 precheck 的简短失败原因(可附带 `fixFile`)。
56
-
57
- 说明:阶段 0 是强 gate,不允许修复后重跑,也不进入“错误分级与重试”。
58
-
59
-
60
- ## Step 1: 生成上下文(串行)
61
-
62
- 调用 `spark`,输入:
63
- --prompt: `${CODEX_HOME:-$HOME/.codex}/skills/pr-review-loop/references/agents/pr-context.md`
64
- --others: `PR #<PR_NUMBER> - round <1>`
65
-
66
- - 等待 spark 返回,输出必须包含 `contextFile`、`runId`、`headOid`。
67
- - 检查 `./.cache/decision-log-pr<PR_NUMBER>.md` 是否存在,存在则后续传给 reviewer 以供决策过滤。
68
- - 若失败:按“错误分级与重试”处理。
69
-
70
-
71
- ## 阶段 2~N:最多 3 轮循环
72
- ### Step 2: reviewers 并行(唯一允许并行阶段)
73
-
74
- 并行调用同一个 `reviewer` 角色的多个实例(提示词驱动实体),提示词来源为项目根目录:
75
-
76
- - 使用阶段 0(precheck)已确认可用的 `./reviewer/*-reviewer.md` 列表,发现几个文件就并行启动几个 reviewer 实例(1..N)。
77
- - 每个文件中的 `ROLE_CODE = <CODE>` 用于统一命名产物和 findings 前缀。
78
-
79
- 每个 reviewer 实例输入至少包含:
80
-
81
- - `PR #<PR_NUMBER>`
82
- - `round: <ROUND>`
83
- - `runId: <RUN_ID>` 来自 Step 1 的输出,必须透传,禁止自行生成)
84
- - `contextFile: ./.cache/<file>.md`
85
- - `reviewerPromptFile: ./reviewer/<name>-reviewer.md`
86
- - `decisionLogFile: ./.cache/decision-log-pr<PR_NUMBER>.md`(若存在)
87
-
88
- 执行要求:
89
-
90
- - reviewer 必须先读取 `reviewerPromptFile`,并严格按其中规则执行。
91
- - 当通用 reviewer 约束与 `reviewerPromptFile` 冲突时,以 `reviewerPromptFile` 为准。
92
- - 每个 reviewer 产物命名必须使用其 `ROLE_CODE`:`./.cache/review-<ROLE_CODE>-pr<PR_NUMBER>-r<ROUND>-<RUN_ID>.md`。
93
-
94
- 每个 reviewer 实例输出:
95
-
96
- - `reviewFile: ./.cache/review-<ROLE_CODE>-pr<PR_NUMBER>-r<ROUND>-<RUN_ID>.md`
97
-
98
- ### Step 3: 聚合(模式 A)
99
-
100
- 调用 `spark`,输入:
101
- --prompt: `${CODEX_HOME:-$HOME/.codex}/skills/pr-review-loop/references/agents/pr-review-aggregate.md`
102
- --others: `contextFile + 1..n reviewFile + runId (+ decisionLogFile) + 模式 A`。
103
-
104
- 执行约束:
105
-
106
- - `spark` 必须先读取 `contextFile` 与全部 `reviewFile`,由模型完成最终语义裁决。
107
- - `spark` 必须自行判定:
108
- - 是否 `stop`
109
- - 哪些 finding 进入 `mustFixFindings`
110
- - 哪些 finding 进入 `optionalFindings`
111
- - `spark` 必须把上述裁决编码为结构化聚合结果,再交给脚本发布评论与生成 `fixFile`。
112
- - 脚本在此步**不得**再根据 reviewer 原文自行推断“有没有问题”或 `stop`。
113
-
114
- - 输出 `{"stop":true}`:进入 Step 7 本轮结束退出循环。
115
- - 输出 `{"stop":false,"fixFile":"..."}`:进入 Step 4。
116
- - 输出 `{"error":"GH_PR_COMMENT_FAILED"}`:按可重试错误处理,优先重试本步骤(脚本幂等,重复调用安全)。
117
- - 其他 `{"error":"..."}`:按“错误分级与重试”处理。
118
-
119
- ### Step 4: 修复(必须委托 fixer)
120
-
121
- **此步禁止 orchestrator 直接修复代码。**
122
-
123
- 必须调用 `fixer`,输入:
124
-
125
- - `PR #<PR_NUMBER>`
126
- - `round: <ROUND>`
127
- - `runId: <RUN_ID>`
128
- - `fixFile: ./.cache/<file>.md`
129
-
130
- 期望输出:
131
-
132
- - `fixReportFile: ./.cache/<file>.md`
133
-
134
- ### Step 5: 发布修复报告(模式 B)
135
-
136
- 调用 `spark`,输入:
137
- --prompt: `${CODEX_HOME:-$HOME/.codex}/skills/pr-review-loop/references/agents/pr-review-aggregate.md`
138
- --others: `fixReportFile + runId + round` + 模式 B`。
139
-
140
-
141
- - 期望输出:`{"ok":true}`
142
- - 若返回 `{"error":"GH_PR_COMMENT_FAILED"}`:按可重试错误处理后再判定终止。
143
-
144
- ### Step 6: 下一轮
145
-
146
- - 轮次 round +1,回到 Step 2。
147
- - 总轮次上限 3。
148
-
149
- ## Step 7 收尾(强制)
150
-
151
- - 若某轮 Step 3 返回 `stop=true`:发布 final-report = `RESOLVED`。
152
- - 若达到 3 轮仍未 stop:发布 final-report = `MAX_ROUNDS_REACHED`。
153
-
154
- final-report 由 `aggregator` 调用脚本发布,且幂等。
155
-
156
- ## 失败防护建议
157
-
158
- - 如果日志显示“编排器直接改代码而非调用 fixer”,视为流程违约。
159
- - 直接回滚该轮并重新执行,确保 Step 4 通过 `fixer` 完成。
160
-
161
-
162
- ## 编排硬规则(强制)
163
-
164
- 1. 除 reviewer 阶段外,其余步骤必须串行且 await 返回。
165
- 2. 每轮最多发布一次 Review Summary / Fix Report(由脚本幂等保证)。
166
- 3. `orchestrator` **禁止直接修改业务代码**。
167
- 4. 当 aggregate 返回 `stop=false` 时,`orchestrator` **必须调用 `fixer` 角色**处理 `fixFile`。
168
- 5. 如果无法调用 `fixer`,必须终止并返回 `{"error":"FIXER_NOT_INVOKED"}`(或等价错误),禁止降级为 orchestrator 自修。
169
-
170
- ## 错误分级与重试(强制)
171
-
172
- 默认策略不是“见 error 立刻终止”,而是先分级:
173
-
174
- 1. 可重试错误:先重试再决定终止。
175
- 2. 不可恢复错误:立即终止。
176
-
177
- 例外:阶段 0(预检 gate)不适用本节重试策略;除 `ok:true` 外,其余返回(含任意 `error`)都必须立即终止。
178
-
179
- ### 可重试错误(建议最多 2 次重试,合计最多 3 次尝试)
180
-
181
- - `GH_PR_COMMENT_FAILED`
182
- - `HARVEST_FAILED`
183
- - `AGGREGATE_SCRIPT_FAILED`
184
- - `PR_CONTEXT_SCRIPT_FAILED`
185
- - `GIT_PUSH_FAILED_NETWORK`
186
- - 其他明显网络抖动/平台瞬时错误(例如 gh API 超时)
187
-
188
- 重试要求:
189
-
190
- - 使用**同一组输入**重试同一步骤(保持 `runId` 不变)。
191
- - 使用退避:第 1 次重试前等待 2 秒,第 2 次重试前等待 5 秒。
192
- - 可先做轻量自愈检查:`gh auth status`、`git remote get-url origin`、必要时重跑本步骤脚本。
193
- - 若是 `fixer` 推送失败,错误码统一为 `GIT_PUSH_FAILED_NETWORK`,由编排器按可重试错误处理。
194
- - 若重试后成功,继续流程,不得误判为终止。
195
- - 若重试仍失败,才终止当前轮。
196
-
197
- ### 不可恢复错误(立即终止)
198
-
199
- - 参数/协议错误:`INVALID_ARGS`、`MISSING_*`
200
- - 环境错误:`NOT_A_GIT_REPO`、`GH_CLI_NOT_FOUND`
201
- - 权限/资源错误:`PR_NOT_FOUND_OR_NO_ACCESS`
202
- - 流程违约错误:`FIXER_NOT_INVOKED`
203
-
204
-
205
- 执行原则:
206
- - 优先调用 `${CODEX_HOME:-$HOME/.codex}/skills/pr-review-loop/scripts/*.py` 作为确定性真值源。
207
- - 但“是否有问题 / 是否 stop / finding 分级”属于模型语义裁决,不得再由脚本根据 reviewer 原文二次猜测。
208
- - reviewer 或 aggregate 产物若缺少关键字段,必须失败并显式报错;禁止静默降级为“无问题”。
209
- - 对外输出只保留关键状态、产物路径与下一步动作。
@@ -1,4 +0,0 @@
1
- interface:
2
- display_name: "PR 审核闭环"
3
- short_description: "在当前仓库执行 precheck-context-review-fix 多轮闭环"
4
- default_prompt: "使用 $pr-review-loop 在当前仓库对指定 PR 执行最多三轮审核修复循环,并严格遵守 runId 与 decision-log 约束。"
@@ -1,73 +0,0 @@
1
- # PR Context Builder
2
-
3
- 为 PR Review Loop 构建上下文文件(Markdown)。确定性工作由脚本完成。
4
-
5
- ## 输入要求(强制)
6
-
7
- 调用者必须在 prompt 中明确提供:
8
-
9
- - PR 编号(如:`PR #123` 或 `prNumber: 123`)
10
- - round(如:`round: 1`;无则默认 1)
11
-
12
- ## 唯一标识 runId(强制)
13
-
14
- - 脚本必须生成全局唯一标识 `runId`:`<PR>-<ROUND>-<HEAD_SHORT>`
15
- - 其中:
16
- - `<PR>`:PR 编号
17
- - `<ROUND>`:当前轮次
18
- - `<HEAD_SHORT>`:`headOid` 的前 7 位(git rev-parse --short HEAD)
19
- - `runId` 必须包含在返回的 JSON 中,供后续步骤使用。
20
-
21
-
22
- ## 输出(强制)
23
-
24
- 脚本会写入项目内 `./.cache/`,stdout 只输出单一 JSON(可 `JSON.parse()`)。
25
-
26
- ## Cache 约定(强制)
27
-
28
- - 缓存目录固定为 `./.cache/`;交接一律传 `./.cache/<file>`(repo 相对路径),禁止 basename-only(如 `foo.md`)。
29
- - 文件命名:`./.cache/pr-context-pr<PR>-r<ROUND>-<RUN_ID>.md`
30
- - `RUN_ID` 格式必须为 `<PR>-<ROUND>-<HEAD_SHORT>`
31
-
32
- ## 调用脚本(强制)
33
-
34
- 脚本位置:`${CODEX_HOME:-$HOME/.codex}/skills/pr-review-loop/scripts/pr_context.py`
35
-
36
- ```bash
37
- python3 "${CODEX_HOME:-$HOME/.codex}/skills/pr-review-loop/scripts/pr_context.py" --pr <PR_NUMBER> --round <ROUND>
38
- ```
39
-
40
- ## 脚本输出处理(强制)
41
-
42
- - 脚本 stdout 只会输出**单一一行 JSON**(可 `JSON.parse()`)。
43
- - **成功时**:你的最终输出必须是**脚本 stdout 的那一行 JSON 原样内容**。
44
- - 禁止:解释/分析/补充文字
45
- - 禁止:代码块(```)
46
- - 禁止:前后空行
47
- - **失败/异常时**:
48
- - 若脚本 stdout 已输出合法 JSON(包含 `error` 或其他字段)→ 仍然**原样返回该 JSON**。
49
- - 若脚本未输出合法 JSON / 退出异常 → 仅输出一行 JSON:`{"error":"PR_CONTEXT_AGENT_FAILED"}`(必要时可加 `detail` 字段)。
50
-
51
- ## GitHub 认证校验(重要)
52
-
53
- 脚本会在调用 `gh repo view/gh pr view` 之前校验 GitHub CLI 已认证。
54
-
55
- - 为了避免 `gh auth status` 在“其他 host(例如 enterprise)认证异常”时误判,脚本会优先从 `git remote origin` 推断 host,并使用:
56
- - `gh auth status --hostname <host>`
57
- - 推断失败时默认使用 `github.com`。
58
-
59
- 可能出现的错误:
60
-
61
- - `{"error":"GH_CLI_NOT_FOUND"}`:找不到 `gh` 命令(PATH 内未安装/不可执行)
62
- - 处理:安装 GitHub CLI:https://cli.github.com/
63
- - `{"error":"GH_NOT_AUTHENTICATED"}`:当前 repo 的 host 未认证
64
- - 处理:`gh auth login --hostname <host>`
65
-
66
- 本地排查命令(在同一个 shell 环境运行):
67
-
68
- ```bash
69
- git remote get-url origin
70
- gh auth status
71
- gh auth status --hostname github.com
72
- env | grep '^GH_'
73
- ```
@@ -1,161 +0,0 @@
1
- # PR Precheck
2
-
3
- ## Cache 约定(强制)
4
-
5
- - 缓存目录固定为 `./.cache/`;交接一律传 `./.cache/<file>`(repo 相对路径),禁止 basename-only(如 `foo.md`)。
6
-
7
- ## 输入(prompt 必须包含)
8
-
9
- - `PR #<number>`
10
- - `round: <number>`(默认 1)
11
-
12
- ## 执行方式(强制)
13
-
14
- - 由当前 agent 按本文件流程逐步执行预检。
15
- - 预检期间允许执行 shell 命令,但最终 stdout 仍必须遵守“单行 JSON 输出契约”。
16
-
17
- ## 预检流程(按顺序执行)
18
-
19
- 1. reviewer 配置校验(强制,先于其他所有检测)
20
- - 项目根目录必须存在 `./reviewer/` 目录。
21
- - `./reviewer/` 下必须至少有一个 `*-reviewer.md` 文件。
22
- - 每个 `*-reviewer.md` 文件都必须包含 `ROLE_CODE = <CODE>`(例如 `ROLE_CODE = STY`)。
23
- - 必须执行:
24
- - `python3 "${CODEX_HOME:-$HOME/.codex}/skills/pr-review-loop/scripts/validate_reviewer_prompts.py" ./reviewer/*-reviewer.md`
25
- - 若脚本返回非零或输出 `ok != true`,视为 reviewer 输出契约不合法。
26
- - 若上述任一条件不满足,立即终止并返回:`{"error":"REVIEWER_CONFIG_INVALID","detail":"..."}`。
27
-
28
- 2. 参数校验
29
- - `PR_NUMBER` 必须是正整数;`round` 必须是 `>=1` 的整数。
30
- - 参数非法时返回:`{"error":"INVALID_ARGS"}`(可附带 `prNumber`、`round`)。
31
-
32
- 3. 工作区干净校验(强制)
33
- - 先校验是否在 git 仓库:`git rev-parse --is-inside-work-tree`。
34
- - 非 git 仓库时返回:`{"error":"NOT_A_GIT_REPO"}`。
35
- - 执行:`git status --porcelain`。
36
- - 若存在未提交变更(包含 staged/unstaged/untracked),直接返回:
37
- - `{"error":"UNCOMMITTED_CHANGES_PRESENT","detail":"请先处理当前仓库全部未提交代码后再执行 precheck"}`。
38
-
39
- 4. 切换到 PR 分支并与远程同步(优先自愈)
40
- - 先从输入文本解析出实际 PR 编号(例如从 `PR #2884` 解析得到 `2884`),记为 `prNumber`。
41
- - 所有命令中的 `<PR_NUMBER>` 都表示占位符,必须替换为真实数字后再执行,禁止原样执行字面量 `gh pr checkout <PR_NUMBER>`。
42
- - 首选执行:使用gh 命令获取 PR 相关信息并切换到对应分支
43
- - 然后执行同步:`git pull --ff-only`(或等价的 fetch + fast-forward)。
44
- - 若可自动修复(例如当前分支不对、需要补齐 tracking),应先自愈再继续,不要立刻失败。
45
- - 当 `gh` 返回认证失败(典型:`GH_NOT_AUTHENTICATED`,token 失效)时,必须进入 SSH 自愈分支,而不是要求用户重新授权:
46
- - 禁止提示用户执行 `gh auth login`;默认假设用户已配置好仓库可用的 SSH 密钥。
47
- - 校验 `origin` 是否为 SSH remote(`git@github.com:*` 或 `ssh://git@github.com/*`)。
48
- - 校验当前仓库 SSH 连通性:`ssh -T git@github.com`(返回 1 但含 “successfully authenticated” 也算通过)。
49
- - 直接用 git 拉取 PR 头引用并切换:`git fetch origin pull/<prNumber>/head:pr-<prNumber>-head && git checkout pr-<prNumber>-head`
50
- - 再执行:`git pull --ff-only origin pr-<prNumber>-head`。
51
- - 仅当上述主路径 + SSH 自愈都失败时返回错误:
52
- - `gh` 不存在且 SSH 自愈也失败:`{"error":"GH_CLI_NOT_FOUND"}`。
53
- - `gh` 未认证且 SSH 自愈失败:`{"error":"GH_NOT_AUTHENTICATED","host":"github.com","detail":"token 失效且 SSH 自愈失败"}`。
54
- - PR 不存在或无权限:`{"error":"PR_NOT_FOUND_OR_NO_ACCESS"}`。
55
- - checkout 失败:`{"error":"PR_CHECKOUT_FAILED"}`。
56
- - 与远程同步失败:`{"error":"PR_SYNC_FAILED"}`。
57
-
58
- 5. 清理缓存目录(强制)
59
- - 清理 `./.cache/` 下所有历史文件(保留目录本身),推荐:
60
- - `mkdir -p ./.cache && find ./.cache -mindepth 1 -delete`
61
- - 清理失败返回:`{"error":"CACHE_CLEAN_FAILED"}`。
62
-
63
- 6. 读取 PR 元信息(含 SSH 降级)
64
- - 首选执行:
65
- - `gh pr view <PR_NUMBER> --json headRefName,baseRefName,mergeable,headRefOid`
66
- - 若 `gh` 可用,必须提取:`headRefName`、`baseRefName`、`mergeable`、`headRefOid`。
67
- - 若 `gh` 因认证失败不可用,但第 4 步已完成 SSH 自愈,则使用 git 回填字段:
68
- - `headRefName`:`git rev-parse --abbrev-ref HEAD`
69
- - `headRefOid`:`git rev-parse HEAD`
70
- - `baseRefName`:`git symbolic-ref --short refs/remotes/origin/HEAD | sed 's#^origin/##'`
71
- - `mergeable`:置为 `UNKNOWN`,后续通过“冲突 gate”的试合并结果判定。
72
- - 若 `headRefOid` 缺失:返回 `{"error":"PR_HEAD_OID_NOT_FOUND"}`。
73
- - 若主路径与降级路径都无法获取有效元信息:返回 `{"error":"PR_NOT_FOUND_OR_NO_ACCESS"}`。
74
-
75
- 7. 生成 runId(强制)
76
- - `headShort = headRefOid[:7]`
77
- - `runId = <PR_NUMBER>-<round>-<headShort>`
78
- - 后续输出中的 `runId/headOid/headShort` 必须与此一致,禁止重算为其他值。
79
-
80
- 8. 校验 base 信息并抓取远程基线
81
- - 若 `baseRefName` 为空,尝试:
82
- - `gh repo view --json defaultBranchRef --jq .defaultBranchRef.name`
83
- - 若仍为空,且已走 SSH 降级路径,尝试:
84
- - `git symbolic-ref --short refs/remotes/origin/HEAD | sed 's#^origin/##'`
85
- - 仍为空返回:`{"error":"PR_BASE_REF_NOT_FOUND"}`。
86
- - 执行:`git fetch origin <baseRefName>`;失败返回:`{"error":"PR_BASE_REF_FETCH_FAILED"}`。
87
-
88
- 9. 合并冲突 gate
89
- - 若 `mergeable == "CONFLICTING"`,直接返回:`{"error":"PR_MERGE_CONFLICTS_UNRESOLVED"}`。
90
- - 若 `mergeable == "UNKNOWN"`(SSH 降级路径),必须通过试合并判定:
91
- - `git merge --no-ff --no-commit origin/<baseRefName>`
92
- - 若出现冲突:`git merge --abort` 后返回 `{"error":"PR_MERGE_CONFLICTS_UNRESOLVED"}`。
93
- - 若无冲突:`git merge --abort`,继续下一步。
94
-
95
- 10. 质量 gate(预检核心)
96
- - 创建日志文件(都放 `./.cache/`):
97
- - `precheck-<runId>-build.log`
98
- - `precheck-<runId>-meta.json`
99
- - 执行:
100
- - `dx build all`
101
- - 若成功:返回 `{"ok":true,...}`(附带上下文字段,见“成功返回字段”)。
102
- - 若失败:
103
- - 生成 `./.cache/precheck-fix-<runId>.md`,收敛 lint/build 失败信息(含日志路径与可定位 file/line)。
104
- - 返回 `{"ok":false,"fixFile":"./.cache/precheck-fix-<runId>.md",...}`。
105
-
106
- ## fixFile 内容规范(强制)
107
-
108
- - 文件格式建议:
109
- - 一级标题:`## IssuesToFix`
110
- - 每个问题至少包含:`id`、`priority`、`category`、`file`、`line`、`title`、`description`、`suggestion`
111
- - 问题分级建议:
112
- - `dx build all` 失败至少 `P0`
113
- - `dx lint` 失败至少 `P1`
114
-
115
- ## 成功返回字段(建议完整透出)
116
-
117
- - `ok: true`
118
- - `prNumber`
119
- - `round`
120
- - `runId`
121
- - `headOid`
122
- - `headShort`
123
- - `headRefName`
124
- - `baseRefName`
125
- - `mergeable`
126
-
127
- ## 单行 JSON 输出契约(强制)
128
-
129
- - 允许在执行过程中输出简短进度反馈,建议格式:
130
- - `progress: <阶段名> - <当前动作>`
131
- - 进度反馈建议在关键长耗时步骤前后输出(如 checkout/sync、cache clean、lint/build)。
132
- - **最终结果必须放在最后一行**,且该行必须是合法 JSON(可 `JSON.parse()`)。
133
- - 除 `progress:` 行与最后一行 JSON 外,禁止输出其他解释/分析文字。
134
- - 禁止输出 Markdown 代码块(```)。
135
- - 禁止前后空行。
136
- - 若流程发生未捕获异常,且无法产出合法业务 JSON:
137
- - 仅输出:`{"error":"PR_PRECHECK_AGENT_FAILED"}`(必要时可加 `detail`)。
138
-
139
- ## 仅当出现 merge 冲突时怎么处理
140
-
141
- 当返回 `{"error":"PR_MERGE_CONFLICTS_UNRESOLVED"}` 时:
142
-
143
- ```bash
144
- # 1) 获取 base 分支名
145
- gh pr view <PR_NUMBER> --json baseRefName --jq .baseRefName
146
-
147
- # 2) 拉取 base 并合并到当前 PR 分支(不 rebase、不 force push)
148
- git fetch origin <baseRefName>
149
- git merge --no-ff --no-commit origin/<baseRefName>
150
-
151
- # 3) 解决冲突后确认无未解决文件
152
- git diff --name-only --diff-filter=U
153
- git grep -n '<<<<<<< ' -- .
154
-
155
- # 4) 提交并推送
156
- git add -A
157
- git commit -m "chore(pr #<PR_NUMBER>): resolve merge conflicts"
158
- git push
159
-
160
- # 5) 重新执行本 precheck 流程(从“预检流程”第 1 步开始重跑)
161
- ```