claude-dev-env 8.96.5 → 8.96.7
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/pr-lifecycle/SKILL.md +2 -2
- package/.agents/skills/sync-dev-env/SKILL.md +5 -1
- package/hooks/blocking/test_final_reply_gate.py +17 -0
- package/hooks/blocking/test_reply_length_gate.py +2 -2
- package/hooks/hooks_constants/reply_length_gate_constants.py +2 -1
- package/package.json +1 -1
|
@@ -123,7 +123,7 @@ An image a PR needs as visual evidence is not an exception to that row. Upload i
|
|
|
123
123
|
3. Fix systematically, marking each todo complete.
|
|
124
124
|
4. Reply to each comment inline.
|
|
125
125
|
|
|
126
|
-
Repair only the reported findings.
|
|
126
|
+
Repair only the reported findings. A finding that comes back on a second head escalates. Fix the source the reviewer reads, or change the gate that files the finding. Post no second reply with the same text, because a repeat finding shows the first reply changed nothing the reviewer sees.
|
|
127
127
|
|
|
128
128
|
Every `gh` post in this workflow uses `--body-file` per [gh-cli-conventions.md](#gh-cli-conventions) and keeps volatile scratch paths out per [durable-post-artifacts.md](#github-post-input-rules). Stage session edits per [re-stage-before-commit.md](#re-stage-session-edits-before-commit) before each commit.
|
|
129
129
|
|
|
@@ -458,7 +458,7 @@ slurped array and take the last element. For one page, cap the request with a
|
|
|
458
458
|
|
|
459
459
|
Stage the files you edited this session right before you commit them. A plain `git commit` records only the staged snapshot; a tracked file this session changed but left unstaged stays behind in the working tree.
|
|
460
460
|
|
|
461
|
-
No hook denies a commit that would drop tracked session edits. Run `git status` before you commit, then stage what you changed with `git add <paths>` or commit with `git commit -a`. Before you say nothing is left to commit, run `git status` in every worktree the session wrote to, as `git worktree list` lists them.
|
|
461
|
+
No hook denies a commit that would drop tracked session edits. Run `git status` before you commit, then stage what you changed with `git add <paths>` or commit with `git commit -a`. Before you say nothing is left to commit, run `git status` in every worktree the session wrote to, as `git worktree list` lists them. On PowerShell, write the commit message to a scratch file and run `git commit -F <file>`. A here-string piped into `git commit -F -` makes git read the message lines as pathspecs, and the commit fails.
|
|
462
462
|
|
|
463
463
|
Staging covers tracked files you edited. Do not commit untracked files unless the user explicitly instructs it. An untracked file in the working tree is outside the change until they say otherwise.
|
|
464
464
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: sync-dev-env
|
|
3
|
-
description: Install or update claude-dev-env in a running session, link the skills of every enabled plugin so a running session loads them, and schedule a daily re-sync at 6:00 AM local by default. Use when the user asks to sync claude-dev-env into a session, to load the skills of a plugin without a restart, to set up the daily sync, to check which session prompt a session uses, or to turn the claude-dev-env session prompt off for one session.
|
|
3
|
+
description: Install or update claude-dev-env in a running session, link the skills of every enabled plugin so a running session loads them, and schedule a daily re-sync at 6:00 AM local by default. Use when the user asks to sync claude-dev-env into a session, to load the skills of a plugin without a restart, when a /skill fails to resolve, to set up the daily sync, to check which session prompt a session uses, or to turn the claude-dev-env session prompt off for one session.
|
|
4
4
|
argument-hint: "[HH:MM] [IANA time zone]"
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -8,6 +8,10 @@ argument-hint: "[HH:MM] [IANA time zone]"
|
|
|
8
8
|
|
|
9
9
|
An always-on session starts once, so a SessionStart hook runs once and never again. Claude Code reads plugins only at session start, and a running session has no plugin reload. The skills directory is read live, so one symlink per skill makes each skill of a plugin load at once.
|
|
10
10
|
|
|
11
|
+
## A /skill fails to resolve
|
|
12
|
+
|
|
13
|
+
Run `/reload-skills` first. It reloads the skills directory in the running session, so the session keeps its context. When the skill still fails to resolve, run the linker in step 2.
|
|
14
|
+
|
|
11
15
|
## 1. Install or update the package
|
|
12
16
|
|
|
13
17
|
Run `npx --yes claude-dev-env@latest --update --target ~/.claude`.
|
|
@@ -87,6 +87,23 @@ def test_should_allow_a_run_a_tool_result_shows(
|
|
|
87
87
|
assert run_gate(monkeypatch, capsys, MEASURED_REPLY, transcript_path) == (0, "")
|
|
88
88
|
|
|
89
89
|
|
|
90
|
+
def test_should_steer_a_skipped_check_to_an_open_line(
|
|
91
|
+
monkeypatch: pytest.MonkeyPatch, capsys: pytest.CaptureFixture[str]
|
|
92
|
+
) -> None:
|
|
93
|
+
skipped_check_reply = "I have not checked the pivot, reach, or screen 26 captures yet."
|
|
94
|
+
_, stdout_text = run_gate(monkeypatch, capsys, skipped_check_reply)
|
|
95
|
+
block_reason = json.loads(stdout_text)["reason"]
|
|
96
|
+
assert "`Open: <check> - <next step>`" in block_reason
|
|
97
|
+
assert "leave the claim out" not in block_reason
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
def test_should_allow_an_open_line_for_a_skipped_check(
|
|
101
|
+
monkeypatch: pytest.MonkeyPatch, capsys: pytest.CaptureFixture[str]
|
|
102
|
+
) -> None:
|
|
103
|
+
open_line = "Open: pivot, reach, and screen 26 checks - the next check-in measures them."
|
|
104
|
+
assert run_gate(monkeypatch, capsys, open_line) == (0, "")
|
|
105
|
+
|
|
106
|
+
|
|
90
107
|
def test_should_allow_a_closing_reply_with_no_message(
|
|
91
108
|
monkeypatch: pytest.MonkeyPatch, capsys: pytest.CaptureFixture[str]
|
|
92
109
|
) -> None:
|
|
@@ -1000,8 +1000,8 @@ def test_should_collect_each_question_card_prose_field() -> None:
|
|
|
1000
1000
|
def test_should_quote_the_hedged_sentence() -> None:
|
|
1001
1001
|
assert reply_length_gate.unvalidated_claim_violation("Done. It should take a few minutes.") == (
|
|
1002
1002
|
'No tool validated this: "It should take a few minutes.". Run the check yourself or through'
|
|
1003
|
-
" a subagent, then state what the run, log line, output, or file and line shows
|
|
1004
|
-
"
|
|
1003
|
+
" a subagent, then state what the run, log line, output, or file and line shows. When you"
|
|
1004
|
+
" cannot run it this turn, report it as `Open: <check> - <next step>`."
|
|
1005
1005
|
)
|
|
1006
1006
|
|
|
1007
1007
|
|
|
@@ -147,7 +147,8 @@ DURATION_CLAIM_PATTERN = re.compile(
|
|
|
147
147
|
)
|
|
148
148
|
UNVALIDATED_CLAIM_MESSAGE = (
|
|
149
149
|
'No tool validated this: "{claim}". Run the check yourself or through a subagent,'
|
|
150
|
-
" then state what the run, log line, output, or file and line shows
|
|
150
|
+
" then state what the run, log line, output, or file and line shows. When you cannot run it"
|
|
151
|
+
" this turn, report it as `Open: <check> - <next step>`."
|
|
151
152
|
)
|
|
152
153
|
CITED_NUMBER_PATTERN = re.compile(
|
|
153
154
|
r"/actions/runs/(\d+)|/pull/(\d+)|\b(?:run|job|check)\s+#?(\d{5,})\b", re.IGNORECASE
|