@erclx/aitk 0.86.0 → 0.86.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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "aitk",
3
3
  "description": "Automated governance, versioning, and discovery tools for Claude Code.",
4
- "version": "0.86.0",
4
+ "version": "0.86.1",
5
5
  "author": {
6
6
  "name": "Eric Le",
7
7
  "url": "https://github.com/erclx"
@@ -17,7 +17,7 @@ Without this skill, a pull request is reviewed only by the session that wrote it
17
17
  - Scope a later pass to the commits added since the prior one, once that commit is confirmed to still reach the head
18
18
  - Apply the integration, contract, and consumer lenses a self-review structurally cannot
19
19
  - Post the closing pass even with nothing to report, since a review left unanswered reads as one nobody closed
20
- - Key the body file on both the pull request number and the head commit, so no two passes overwrite each other
20
+ - Key the body file on the pull request number and the head commit, and on the response it answers once the head repeats, so no two passes overwrite each other
21
21
  - Scan the comment for banned characters and internal phase labels before posting, since a finding phrased against a phase label reaches a reader with no task board
22
22
 
23
23
  ## Must not
@@ -32,6 +32,7 @@ Without this skill, a pull request is reviewed only by the session that wrote it
32
32
 
33
33
  - No open pull request for the target branch: stop and route to the local review skill
34
34
  - The fetch of the pull request head fails: stop rather than falling through to a full pass
35
+ - The head repeats with no response since the prior pass: stop rather than posting a body restating one the folder holds
35
36
 
36
37
  ## Out of scope
37
38
 
@@ -95,6 +95,20 @@ Write the comment to `.claude/.tmp/pr-review/body-<number>-<short-sha>.md`. The
95
95
 
96
96
  Derive both segments from Step 1. Never pick a suffix by hand, and never reuse a name the folder already holds.
97
97
 
98
+ When `<prior-oid>` from Step 2 equals `headRefOid`, the head repeats and the folder already holds `body-<number>-<short-sha>.md`. Add a third segment taking the id of the `## Review response` comment this pass answers, giving `body-<number>-<short-sha>-r<comment-id>.md`. That satisfies both prohibitions above rather than carving an exception into either.
99
+
100
+ ```bash
101
+ gh pr view <number> --json reviews,comments --jq '([.reviews[] | select(.body // "" | split("\n")[0] | rtrimstr("\r") | . == "## Review" or . == "## Review closed")] | last | .submittedAt) as $prior | [.comments[] | select(.body // "" | split("\n")[0] | rtrimstr("\r") | . == "## Review response") | select(.createdAt > $prior)] | last | .url // empty | split("-") | last'
102
+ ```
103
+
104
+ Scope the responses to those newer than the prior pass, never to every response the thread carries. A pass answering the newest response and a pass answering an older one derive the same third segment, so an unscoped read hands a re-run after a close-out the name its own prior pass already wrote. That is the collision this case exists to prevent, reached without a rebase or an error.
105
+
106
+ Read the number off `.url`. The `id` field carries a GraphQL node id, which the thread never displays. Keep the `// empty` guard, since `split` aborts jq on the null an empty selection returns, and an aborted command reaches the session as an error rather than as the empty result the stop below reads.
107
+
108
+ An empty result means no response arrived since the prior pass, so this pass would restate a body the folder already holds. Stop: `❌ No response since the prior pass on <short-sha>. Nothing new to review.`
109
+
110
+ The response is also the whole read on a repeated head. Step 2 resolves an empty range, because a commit is its own ancestor and `<prior-oid>..<headRefOid>` spans nothing, so the delta cannot answer whether a prior finding landed. Read that comment for what the worker changed or accepted, and treat an accepted finding as closed rather than restating it.
111
+
98
112
  The comment is a rendered-for-human GitHub surface, so follow `.claude/standards/prose.md` for voice, or `${CLAUDE_SKILL_DIR}/../../standards/prose.md` when the project does not have it: cut editorializing, and keep every sentence load-bearing. Match this shape on a first pass:
99
113
 
100
114
  ```markdown
@@ -41,7 +41,7 @@ One feature travels this path end to end.
41
41
  3. The human opens a worker worktree with `claude-worktree` and runs `claude-autoship` against the plan. The worker builds, self-checks, opens a PR, and stops at the PR boundary.
42
42
  4. Orchestrator reviews the PR with `claude-pr-review` and posts findings to it.
43
43
  5. Worker addresses the findings with `claude-address-review`, rebases onto `origin/main` when a sibling landed first and left the branch unable to merge, then pushes a follow-up.
44
- 6. Orchestrator closes the review out with `claude-pr-review` again. The second pass reads only the commits the follow-up added, and posts under `## Review closed` when it finds nothing open or under `## Review` when it does, so a reader learns the state from the heading. Repeat from step 5 until the review closes.
44
+ 6. Orchestrator closes the review out with `claude-pr-review` again. The second pass reads only the commits the follow-up added, or the worker's response alone when the follow-up added none, and posts under `## Review closed` when it finds nothing open or under `## Review` when it does, so a reader learns the state from the heading. Repeat from step 5 until the review closes.
45
45
  7. The human reads the result and merges. The orchestrator tells any trailing worker whose branch shares a seam with the merged one to run `claude-address-review`, which rebases whether or not the review left anything open.
46
46
 
47
47
  There is no loop construct here. Each worker is a single build that halts at the
@@ -68,6 +68,13 @@ the PR. `claude-address-review` reads them back, fixes each, replies or resolves
68
68
  the threads, and pushes a follow-up. `claude-pr-review` then runs again, reading
69
69
  only what the follow-up added.
70
70
 
71
+ A finding answered without a commit leaves the head where the first pass read it,
72
+ which a gitignored record and a finding accepted as recorded both produce. The
73
+ close-out is still owed there, since the newest heading is what tells an operator
74
+ whether the branch is blocked, so the pass reads the worker's response rather than
75
+ a delta and names its body from that response instead of from a tree that did not
76
+ change.
77
+
71
78
  A branch that stopped merging while the review was open is the worker's problem
72
79
  to close. `claude-address-review` rebases onto `origin/main` between the fixes
73
80
  and the push, so one force-push carries both and the reviewer reads one delta.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@erclx/aitk",
3
3
  "type": "module",
4
- "version": "0.86.0",
4
+ "version": "0.86.1",
5
5
  "description": "Infrastructure and quality tooling for developer workflows",
6
6
  "license": "MIT",
7
7
  "bin": {