claude-dev-env 8.92.0 → 8.92.1
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/.agents/skills/e-code-review/SKILL.md +1 -1
- package/.agents/skills/efficient-review/SKILL.md +1 -1
- package/.agents/skills/efficient-review/reference/criteria.md +1 -1
- package/.agents/skills/pr-lifecycle/reference/review-loop-before-merge.md +4 -3
- package/hooks/advisory/test_owned_pr_review_loop.py +2 -0
- package/hooks/blocking/test_merge_review_gate.py +6 -0
- package/hooks/features/conduct-gates.md +1 -1
- package/hooks/hooks_constants/merge_review_gate_constants.py +4 -2
- package/hooks/hooks_constants/owned_pr_review_loop_constants.py +3 -1
- package/package.json +1 -1
|
@@ -8,7 +8,7 @@ description: >-
|
|
|
8
8
|
|
|
9
9
|
# e-code-review
|
|
10
10
|
|
|
11
|
-
**Pick a level, load its file, run it.** Each file has the same steps, angles, caps, and fields as the built-in `/code-review` recipe for that level. Only the wording differs, where this repo's prose rules require it.
|
|
11
|
+
**Pick a level, load its file, run it.** Each file has the same steps, angles, caps, and fields as the built-in `/code-review` recipe for that level. Only the wording differs, where this repo's prose rules require it. A question about `/code-review` asks about the built-in recipe, so answer it from the built-in text and use these files only for `/e-code-review`.
|
|
12
12
|
|
|
13
13
|
| Level | File | Shape |
|
|
14
14
|
|---|---|---|
|
|
@@ -21,7 +21,7 @@ When the plan runtime is `other`, the model is deferred. The running agent appli
|
|
|
21
21
|
|
|
22
22
|
## Loop
|
|
23
23
|
|
|
24
|
-
Check each finding against the code. Fix every one that holds. Run the review again until a pass reports none. The steps are in [reference/criteria.md](reference/criteria.md).
|
|
24
|
+
Check each finding against the code. Fix every one that holds. Run the review again until a pass reports none. Before a merge, [the pr-lifecycle review loop](../pr-lifecycle/reference/review-loop-before-merge.md) sets how many full passes run. The steps are in [reference/criteria.md](reference/criteria.md).
|
|
25
25
|
|
|
26
26
|
## Reading guide
|
|
27
27
|
|
|
@@ -18,4 +18,4 @@ An empty list is a valid review. End with a json block. Each finding has `file`,
|
|
|
18
18
|
|
|
19
19
|
## Loop
|
|
20
20
|
|
|
21
|
-
Fix every finding that holds, including a file the diff did not touch. Then run the review again. Stop when a pass reports no finding that holds.
|
|
21
|
+
Fix every finding that holds, including a file the diff did not touch. Then run the review again. Stop when a pass reports no finding that holds. Before a merge, [the pr-lifecycle review loop](../../pr-lifecycle/reference/review-loop-before-merge.md) sets how many full passes run.
|
|
@@ -2,10 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
A pull request the agent made merges only after a code review of its head comes back clean. Loop it:
|
|
4
4
|
|
|
5
|
-
1. Review the head with the command `CLAUDE_MERGE_REVIEW_COMMAND` names. Where it is unset, run `/code-review high --max-findings all` against the base.
|
|
5
|
+
1. Review the head with the command `CLAUDE_MERGE_REVIEW_COMMAND` names. Where it is unset, run `/code-review high --max-findings all` against the base. This is a full pass.
|
|
6
6
|
2. Record the pass: `python3 ~/.claude/scripts/merge_review_receipt.py <owner>/<name> <number> <head sha> <finding count>`.
|
|
7
7
|
3. Fix every valid finding, push, and review the new head. Answer each finding you rule out on the pull request with its file:line evidence.
|
|
8
|
-
4.
|
|
9
|
-
5.
|
|
8
|
+
4. The first three passes are full passes. Each later pass is `/code-review low --fix <number>`. It reads only the pull request's diff against its base and leaves its fixes uncommitted. Name the number: after a push, a bare `/code-review low` diffs the branch against its own upstream and sees nothing. Commit and push those fixes, then run the next pass on the new head. A pass that reported findings records its finding count, even when `--fix` fixed them all.
|
|
9
|
+
5. Repeat until a pass records `CLEAN`. A pass whose every finding is ruled out records `CLEAN` with `--ruled-out <finding count> --rulings <link to the rulings comment on this pull request>`.
|
|
10
|
+
6. Merge pinned to that head: `expectedHeadSha` on the merge tool, or `--match-head-commit` on `gh pr merge`.
|
|
10
11
|
|
|
11
12
|
`hooks/blocking/merge_review_gate.py` denies any other merge. In a merge-queue repository, enqueue with `gh pr merge <number> --repo <owner>/<name> --auto --match-head-commit <head sha>`; auto-merge that names no head is denied. A repository whose own CI and merge queue review and merge its pull requests is listed in `CLAUDE_MERGE_REVIEW_EXEMPT_REPOSITORIES`, comma separated as `owner/name`, and skips the gate.
|
|
@@ -281,6 +281,8 @@ def test_should_name_every_step_and_skill_in_the_context() -> None:
|
|
|
281
281
|
)
|
|
282
282
|
assert "jl-cmd-projects/claude-dev-env#42" in context
|
|
283
283
|
assert "efficient-review" in context
|
|
284
|
+
assert "three full passes" in context
|
|
285
|
+
assert "/code-review low --fix 42" in context
|
|
284
286
|
assert "gh pr ready 42 --repo jl-cmd-projects/claude-dev-env" in context
|
|
285
287
|
assert "poteto-mode/playbooks/babysit.md" in context
|
|
286
288
|
assert "poteto-mode/playbooks/shipping.md" in context
|
|
@@ -178,6 +178,12 @@ def test_should_name_the_configured_review_command(monkeypatch: pytest.MonkeyPat
|
|
|
178
178
|
assert "`/team-review`" in _reason(_merge_tool(CLEAN_HEAD))
|
|
179
179
|
|
|
180
180
|
|
|
181
|
+
def test_should_name_the_low_fix_pass_after_three_full_reviews_in_the_deny_reason() -> None:
|
|
182
|
+
reason = _reason(_merge_tool(CLEAN_HEAD))
|
|
183
|
+
assert "three full passes" in reason
|
|
184
|
+
assert "`/code-review low --fix 12`" in reason
|
|
185
|
+
|
|
186
|
+
|
|
181
187
|
def test_should_allow_auto_merge_pinned_to_the_clean_head() -> None:
|
|
182
188
|
merge_review_receipt.record_review("acme/tools", 12, CLEAN_HEAD, 0)
|
|
183
189
|
command = f"gh pr merge 12 --repo acme/tools --auto --match-head-commit {CLEAN_HEAD}"
|
|
@@ -17,7 +17,7 @@ This family stops a chat reply, edited message, or tool call when its payload br
|
|
|
17
17
|
- `blocking/verify_before_acting.py` blocks a completed mutating call when the agent's reasoning contains an unchecked claim.
|
|
18
18
|
- `blocking/pr_lifecycle_skill_gate.py` denies a commit, push, pull request action, or merge until the `pr-lifecycle` skill appears in the transcript since the last compaction.
|
|
19
19
|
- `blocking/build_eval_before_eval_write_gate.py` denies a write to an eval file until a Skill call named exactly `claude-api` with args `build-eval`, or the `/claude-api build-eval` command, appears in the transcript.
|
|
20
|
-
- `blocking/merge_review_gate.py` denies an agent's merge until a review pass on the merged head reported zero findings, or ruled out every finding and linked the posted rulings. It reads the receipt `scripts/merge_review_receipt.py` writes, requires the merge, auto-merge or merge-queue entry to be pinned to that head, and skips repositories listed in `CLAUDE_MERGE_REVIEW_EXEMPT_REPOSITORIES`. Its deny reason names the review command `CLAUDE_MERGE_REVIEW_COMMAND` sets.
|
|
20
|
+
- `blocking/merge_review_gate.py` denies an agent's merge until a review pass on the merged head reported zero findings, or ruled out every finding and linked the posted rulings. It reads the receipt `scripts/merge_review_receipt.py` writes, requires the merge, auto-merge or merge-queue entry to be pinned to that head, and skips repositories listed in `CLAUDE_MERGE_REVIEW_EXEMPT_REPOSITORIES`. Its deny reason names the review command `CLAUDE_MERGE_REVIEW_COMMAND` sets. The reason tells the agent to run that command for the first three passes and `/code-review low --fix <number>` for each later pass; the gate itself counts no passes.
|
|
21
21
|
- `blocking/merge_over_review_offer_gate.py` denies a decision card or question that offers a merge while it names open review findings, a red check, unaddressed review comments, or an override. It reads the whole card as one text: every question, header, context, reason, and option, whether the option is a string or a label with a consequence or description.
|
|
22
22
|
- `blocking/artifact_dark_mode_gate.py` denies an Artifact page publish when the page, inside the publish wrapper, keeps a light body or shows text under 4.5:1 contrast in dark mode. `blocking/artifact_dark_mode_render.cjs` renders the page in headless Chromium for it.
|
|
23
23
|
|
|
@@ -54,8 +54,10 @@ RECORD_COMMAND = "python3 ~/.claude/scripts/merge_review_receipt.py"
|
|
|
54
54
|
NO_CLEAN_REVIEW_REASON_TEMPLATE = (
|
|
55
55
|
"{slug}#{number} has no clean review on the head you are merging. Run the review "
|
|
56
56
|
"loop: review the pull request head with `{review_command}`, fix and push every "
|
|
57
|
-
"finding, and review again "
|
|
58
|
-
"
|
|
57
|
+
"finding, and review again. After three full passes, each later pass is "
|
|
58
|
+
"`/code-review low --fix {number}`, which names the pull request so the diff "
|
|
59
|
+
"covers its base: commit and push its fixes, then review the new head. "
|
|
60
|
+
"Repeat until a pass reports zero findings or every finding is ruled out with file:line "
|
|
59
61
|
"evidence. Record that pass with `"
|
|
60
62
|
+ RECORD_COMMAND
|
|
61
63
|
+ " {slug} {number} <head sha> <finding count>`, adding `--ruled-out <finding count> "
|
|
@@ -114,7 +114,9 @@ REVIEW_LOOP_CONTEXT_TEMPLATE: str = (
|
|
|
114
114
|
"asked for a draft or stopped at opening it.\n"
|
|
115
115
|
"1. Review loop. Load the efficient-review skill (/efficient-review). Review the\n"
|
|
116
116
|
" branch, check each finding against the code, fix every one that holds, push,\n"
|
|
117
|
-
" and review again.
|
|
117
|
+
" and review again. After three full passes, each later pass is\n"
|
|
118
|
+
" /code-review low --fix {number}; commit and push its fixes, then review the new head.\n"
|
|
119
|
+
" Repeat until a pass reports no findings.\n"
|
|
118
120
|
"2. Mark ready. Once the loop is clean, CI is green, and no review thread is open,\n"
|
|
119
121
|
" mark the PR ready for review (gh pr ready {number} --repo {owner}/{repository},\n"
|
|
120
122
|
" or update_pull_request with draft false).\n"
|