@erclx/aitk 3.10.0 → 3.11.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/claude/.claude-plugin/plugin.json +1 -1
- package/claude/skills/claude-address-review/SKILL.md +10 -0
- package/claude/skills/claude-markdown-propose/REQUIREMENT.md +48 -0
- package/claude/skills/claude-markdown-propose/SKILL.md +118 -0
- package/claude/skills/claude-markdown-propose/references/format.md +107 -0
- package/claude/skills/claude-orchestrate/references/orchestrator-poll.md +4 -1
- package/claude/skills/claude-orchestrate/scripts/poll.sh +59 -13
- package/claude/skills/claude-pr-review/SKILL.md +4 -2
- package/claude/skills/claude-teach/SKILL.md +1 -1
- package/claude/skills/claude-worktree/SKILL.md +1 -1
- package/claude/skills/create-snippet/SKILL.md +1 -1
- package/claude/skills/git-branch/SKILL.md +1 -1
- package/claude/skills/git-commit/SKILL.md +1 -1
- package/claude/skills/git-issue/SKILL.md +2 -2
- package/claude/skills/git-pr/SKILL.md +5 -5
- package/claude/skills/git-split/SKILL.md +2 -2
- package/claude/skills/git-stage/SKILL.md +1 -1
- package/docs/agents/audits.md +2 -2
- package/docs/agents/records.md +1 -1
- package/docs/agents/teach.md +1 -1
- package/docs/ai-workflow.md +7 -6
- package/package.json +1 -1
- package/scripts/core/check-skill-paths.sh +1 -2
- package/scripts/core/verify.sh +0 -5
- package/src/audits/catalog.ts +20 -0
- package/src/claude/skills-audit.ts +7 -0
- package/src/commands/claude.ts +20 -6
- package/src/commands/comments.ts +6 -0
- package/src/commands/context.ts +32 -7
- package/src/commands/gov.ts +2 -2
- package/src/commands/markdown.ts +18 -2
- package/src/context/audit.ts +16 -0
- package/src/gov/test-order.ts +31 -7
- package/src/markdown/files.ts +10 -0
- package/src/records/backup.ts +1 -0
- package/src/records/validate.ts +1 -3
- package/{claude/skills/git-split/references → standards}/branch.md +0 -1
- package/{claude/skills/git-commit/references → standards}/commit.md +0 -1
- package/{claude/skills/claude-teach/references → standards}/glossary.md +0 -1
- package/standards/index.md +6 -0
- package/standards/{bundled/issue.md → issue.md} +0 -1
- package/standards/{bundled/pr.md → pr.md} +0 -1
- package/standards/{bundled/snippets.md → snippets.md} +0 -1
- package/claude/skills/claude-worktree/references/branch.md +0 -60
- package/claude/skills/create-snippet/references/snippets.md +0 -78
- package/claude/skills/git-branch/references/branch.md +0 -60
- package/claude/skills/git-issue/references/issue.md +0 -95
- package/claude/skills/git-pr/references/branch.md +0 -60
- package/claude/skills/git-pr/references/pr.md +0 -139
- package/claude/skills/git-split/references/pr.md +0 -139
- package/claude/skills/git-stage/references/commit.md +0 -73
- package/scripts/core/regen-skill-references.sh +0 -27
- package/standards/bundled/branch.md +0 -60
- package/standards/bundled/commit.md +0 -73
- package/standards/bundled/glossary.md +0 -76
|
@@ -194,3 +194,13 @@ Rebased PR #<number> onto origin/main. <N> files resolved by hand, <N> rebuilt b
|
|
|
194
194
|
```
|
|
195
195
|
|
|
196
196
|
Do not merge. Hand back to the orchestrator for re-review.
|
|
197
|
+
|
|
198
|
+
## Post-review findings
|
|
199
|
+
|
|
200
|
+
Not everything worth reaching the reviewing session surfaces inside the numbered flow above. A worker that settled a risk, filed a follow-up, or found something else worth reporting after Step 7 already closed the review posts it directly rather than waiting on a review pass that has nothing left to trigger it. Write the body the way Step 6 writes a reply: load `write-human` for voice, follow `${CLAUDE_SKILL_DIR}/../../standards/markdown.md` for the banned words, and run the `${CLAUDE_SKILL_DIR}/../../standards/publish.md` scan before posting.
|
|
201
|
+
|
|
202
|
+
Open with `## Post-review findings` rather than `## Review response`, since nothing on the thread is being answered. `claude-pr-review` states the full heading set this belongs to and routes it the same as a response: `claude-orchestrate`'s poll picks it up and sends the reviewing session back for a pass. Close the body with `🤖 Addressed by Claude Code` on its own line, matching the reply's footer.
|
|
203
|
+
|
|
204
|
+
```bash
|
|
205
|
+
gh pr comment <number> --body-file .claude/.tmp/address-review/reply-<number>.md
|
|
206
|
+
```
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: claude-markdown-propose
|
|
3
|
+
description: Why a markdown rewrite is proposed per file and answered before anything applies, rather than edited live or argued in chat
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Claude markdown propose requirement
|
|
7
|
+
|
|
8
|
+
## Gap
|
|
9
|
+
|
|
10
|
+
Rewriting a passage in a governing document today means editing it live or arguing in chat, and three surfaces sit near this moment without covering it. `claude-standards-audit` maps changed markdown to the standards claiming it and reports violations, ending on its own description: `Do NOT fix violations. Reporting only.` `aitk markdown audit` measures bans and structural checkpoints from package data.
|
|
11
|
+
|
|
12
|
+
`claude-review` reports findings on a diff someone already wrote. None of the three drafts a replacement, carries an answer slot, or waits.
|
|
13
|
+
|
|
14
|
+
A review delivered in chat gets applied from memory across files nobody reopened, and nothing records which changes the operator approved. A change nobody agreed to either lands unreviewed, because the session acting on a chat review cannot tell an approved line from an inferred one, or never gets written down at all, because a finding with no draft behind it hands the rewrite back to whoever reads it next.
|
|
15
|
+
|
|
16
|
+
A second failure compounds the first. A claim copied across several files is corrected in the one a session happened to open, and the copies elsewhere now read as freshly reviewed while still disagreeing, since nothing reconciles a restatement against the source it was drawn from.
|
|
17
|
+
|
|
18
|
+
## Must
|
|
19
|
+
|
|
20
|
+
- Take the concern and the surface as inputs and run one procedure against them, so a second concern reuses this skill rather than forking it
|
|
21
|
+
- Grep the named surface for the concern before proposing, so a defect's site count is measured rather than assumed
|
|
22
|
+
- Draft the replacement text, not only the finding
|
|
23
|
+
- Carry three labelled variants on a change whose replacement was invented, and one on a change that corrects text to a recorded fact
|
|
24
|
+
- Write one proposal file per source file under `.claude/proposals/<slug>/` and stop, leaving `You:` empty on every change
|
|
25
|
+
- Apply only a change carrying an answer, one file at a time, and re-grep its anchor before applying it
|
|
26
|
+
- Name a folder that does not collide with `.claude/audits/`, which holds generated data rather than decision state
|
|
27
|
+
- Report what each file leaves alone, so a proposal cannot be read as finding everything wanting
|
|
28
|
+
|
|
29
|
+
## Must not
|
|
30
|
+
|
|
31
|
+
- Edit a source file during the Propose phase
|
|
32
|
+
- Apply an unanswered change, or a subset of a file's answered changes while leaving the rest for later
|
|
33
|
+
- Fill a `You:` slot, or infer a disposition from an empty one
|
|
34
|
+
- Name a specific concern in this skill's own procedure. A concern belongs in the invocation, and hardcoding one narrows the skill to the day it was written.
|
|
35
|
+
- Assume the skill earns its place because the gap is real. Whether anything invokes it beyond the operator typing its name has no answer at creation time, and is a review criterion to read against a later usage census rather than a gate this file can pass on its own.
|
|
36
|
+
|
|
37
|
+
## Guards
|
|
38
|
+
|
|
39
|
+
- No concern named and none derivable: stop rather than inferring one
|
|
40
|
+
- No surface named and none derivable: stop rather than screening the whole tree
|
|
41
|
+
- The concern resolves to one file: stop and say a single-file change needs no proposal folder
|
|
42
|
+
|
|
43
|
+
## Out of scope
|
|
44
|
+
|
|
45
|
+
- Reporting a violation with no drafted replacement, which `claude-standards-audit` and `aitk markdown audit` already own
|
|
46
|
+
- Reviewing a diff someone already wrote, which `claude-review` owns
|
|
47
|
+
- Filing a raw brain dump as findings, which `claude-intake` owns
|
|
48
|
+
- Reviewing `.claude/memory/` and proposing promote-or-retire actions per entry, which `claude-memory-review` owns on a different subject with a different answer contract
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: claude-markdown-propose
|
|
3
|
+
description: Reviews a named markdown surface against a named concern, drafts a per-file proposal under `.claude/proposals/<slug>/` carrying a diff and a reason for each change, and stops without editing a source file. Takes the concern and the surface as inputs, such as a claim stated stronger than the record, a fact gone stale, two files disagreeing, or a passage duplicated without derivation. A later invocation applies what the operator answered. Use when asked to "propose a change to CLAUDE.md", "draft a rewrite of this standard", "propose fixes to this doc", "draft alternatives for this passage", or "apply the answered proposals". Do NOT use to report without drafting a replacement (`claude-standards-audit` or `aitk markdown audit`), to review a diff already made (`claude-review`), or to file a raw brain dump as findings (`claude-intake`).
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Claude markdown propose
|
|
7
|
+
|
|
8
|
+
Reviews what a markdown surface says against a named concern and proposes what it should say instead. Writes proposals and stops. The operator answers per change, and a later invocation applies the answered set.
|
|
9
|
+
|
|
10
|
+
The value is the gate. A rewrite delivered in chat gets applied from memory across files nobody reopened, and nothing records what was approved.
|
|
11
|
+
|
|
12
|
+
## Guards
|
|
13
|
+
|
|
14
|
+
- No concern named and none derivable from the conversation. Stop: `❌ No concern to screen for. Name what looks wrong, or the surface to review.`
|
|
15
|
+
- No surface named and none derivable. Stop: `❌ No surface to review. Name the files, or the folder, to screen.`
|
|
16
|
+
- The concern resolves to one file only. Stop and say so: a single-file change needs no proposal folder.
|
|
17
|
+
- A named file cannot be read. Stop and name it. Do not screen what resolved and report a partial result.
|
|
18
|
+
|
|
19
|
+
## Phase detection
|
|
20
|
+
|
|
21
|
+
Two phases share this body, picked by whether a proposal folder already exists for the request's slug.
|
|
22
|
+
|
|
23
|
+
Derive `<slug>` from the concern and the surface, kebab-case, naming the subject rather than the activity. List `.claude/proposals/` at the main worktree root and match the topic against the folders already there before deriving a fresh one, the same way `claude-intake` matches its own folder. Never match against `.claude/` itself.
|
|
24
|
+
|
|
25
|
+
- No matching folder, or the operator names a concern and a surface: **Propose**.
|
|
26
|
+
- A matching folder exists and the operator says apply, ship, or commit the answers: **Apply**.
|
|
27
|
+
|
|
28
|
+
All `.claude/proposals/` reads and writes resolve at the main worktree root, not the current worktree. See Worktrees in `CLAUDE.md`.
|
|
29
|
+
|
|
30
|
+
## Write scope
|
|
31
|
+
|
|
32
|
+
Write only inside `.claude/proposals/<slug>/`. A source file, a standard, a rule, and a plan all live outside that folder, so this one rule forbids every one of them during the Propose phase. The Apply phase is the one exception, and only for a change carrying a `You:` answer.
|
|
33
|
+
|
|
34
|
+
## Concerns
|
|
35
|
+
|
|
36
|
+
The concern is an input, not a flow toggle. The passes below are one procedure and the concern decides what pass 1 looks for.
|
|
37
|
+
|
|
38
|
+
| Concern | What it looks like |
|
|
39
|
+
| ------------- | -------------------------------------------------------------------- |
|
|
40
|
+
| Inflation | a claim stated stronger than the record supports |
|
|
41
|
+
| Staleness | a fact correct when written and wrong now, usually a date or a count |
|
|
42
|
+
| Contradiction | two files, or two sections, asserting incompatible things |
|
|
43
|
+
| Duplication | one passage copied across files with no derivation, drifting apart |
|
|
44
|
+
|
|
45
|
+
The operator may name a concern outside this table. Run the same procedure against it.
|
|
46
|
+
|
|
47
|
+
## Propose phase
|
|
48
|
+
|
|
49
|
+
Read `${CLAUDE_SKILL_DIR}/references/format.md` before writing anything. Do not work the proposal format from memory.
|
|
50
|
+
|
|
51
|
+
### 1. Find the sites
|
|
52
|
+
|
|
53
|
+
Grep the named surface for the concern and its near-variants. A defect rarely repeats verbatim, so search the habit rather than the string.
|
|
54
|
+
|
|
55
|
+
Count hits per file before reading them. A file with one hit and a file with eight are different problems.
|
|
56
|
+
|
|
57
|
+
### 2. Find what it should say
|
|
58
|
+
|
|
59
|
+
Read whatever the operator names as the authoritative source for the concern. Absent one, grep the rest of the tree for a passage already stating the corrected form, since a correct version often already exists somewhere the defect has not reached.
|
|
60
|
+
|
|
61
|
+
Report a file that contradicts itself. A file holding both the defect and its corrected form is the strongest finding available, because the replacement is already drafted somewhere in the tree and needs no invention.
|
|
62
|
+
|
|
63
|
+
### 3. Judge per line, not per match
|
|
64
|
+
|
|
65
|
+
A matched string means different things in different registers. A word describing a mechanism is a fact about how something works. The same word describing reach is a claim about who relies on it. Sweeping both because they share a string is what makes the next pass harder to trust.
|
|
66
|
+
|
|
67
|
+
### 4. Write the proposals
|
|
68
|
+
|
|
69
|
+
One file per source file under `.claude/proposals/<slug>/`, per `${CLAUDE_SKILL_DIR}/references/format.md`.
|
|
70
|
+
|
|
71
|
+
Draft the replacement text. A proposal reporting a problem without a replacement hands the work back rather than doing it.
|
|
72
|
+
|
|
73
|
+
Carry an `Open:` on any change whose replacement was written rather than corrected, and give it three variants per the format reference. Correcting an overstatement to the recorded fact has one answer. Inventing a paragraph has no right answer, and one draft asks the operator to veto instead of to choose, which costs a round every time the intent lands wrong.
|
|
74
|
+
|
|
75
|
+
Separate the two kinds before drafting. A change that deletes a claim the record does not support is cheap and rarely argued. A change that writes new prose is where the effort belongs.
|
|
76
|
+
|
|
77
|
+
Close each file with what it leaves alone, and say why those lines survived.
|
|
78
|
+
|
|
79
|
+
### 5. Report
|
|
80
|
+
|
|
81
|
+
Name the count, the files, and the single highest-value change. Point at the folder and stop.
|
|
82
|
+
|
|
83
|
+
Do not edit a source file. Do not fill a `You:` slot.
|
|
84
|
+
|
|
85
|
+
Propose in dependency order and state it in `00-overview.md` when the surface spans more than two files. A file other files quote is settled first, otherwise the same wording gets decided twice.
|
|
86
|
+
|
|
87
|
+
## Apply phase
|
|
88
|
+
|
|
89
|
+
Read `${CLAUDE_SKILL_DIR}/references/format.md` before applying anything, if this session has not already read it this pass.
|
|
90
|
+
|
|
91
|
+
Follow the Applying section there: one file at a time in settle order, every answered change in that file and nothing unanswered, re-grepping each anchor before applying it, sweeping the other named surfaces for the same claim before committing, and moving an applied change into `applied.md`.
|
|
92
|
+
|
|
93
|
+
Report the counts once the pass stops: files committed, changes applied, changes still carrying an empty `You:`. Leave the folder in place. Neither phase deletes it.
|
|
94
|
+
|
|
95
|
+
## Output
|
|
96
|
+
|
|
97
|
+
Chat output is the report. This skill persists only the proposal folder itself.
|
|
98
|
+
|
|
99
|
+
```plaintext
|
|
100
|
+
📂 Opened .claude/proposals/<slug>/
|
|
101
|
+
|
|
102
|
+
**Screened:** <N> files, <N> changes proposed, <N> carrying three variants
|
|
103
|
+
|
|
104
|
+
**Highest value:** <the single strongest change, one line>
|
|
105
|
+
|
|
106
|
+
Next: answer the `You:` slots in the files under .claude/proposals/<slug>/,
|
|
107
|
+
then re-invoke this skill to apply what you answered.
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
Use `📂 Resumed` in place of `📂 Opened` on a resume pass. The Apply phase reports instead:
|
|
111
|
+
|
|
112
|
+
```plaintext
|
|
113
|
+
✅ Applied .claude/proposals/<slug>/
|
|
114
|
+
|
|
115
|
+
**Committed:** <N> files, <N> changes
|
|
116
|
+
|
|
117
|
+
**Still open:** <N> changes with an empty `You:`
|
|
118
|
+
```
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
# Proposal format reference
|
|
2
|
+
|
|
3
|
+
Governs the proposal `claude-markdown-propose` writes before it edits anything. The concern being screened is an input and does not change the format.
|
|
4
|
+
|
|
5
|
+
## Folder
|
|
6
|
+
|
|
7
|
+
- One folder per screening pass at `.claude/proposals/<slug>/`, where the slug names the subject rather than the activity
|
|
8
|
+
- One proposal file per source file, named `<nn>-<source filename, its own extension dropped>.md`, so a source already named `CLAUDE.md` becomes `01-CLAUDE.md` rather than `01-CLAUDE.md.md`
|
|
9
|
+
- `00-overview.md` when the pass spans more than two source files, holding the cross-file pattern, the change counts, and the settle order
|
|
10
|
+
- `applied.md` once the first change lands, holding every applied change with its reason and the answer it carried
|
|
11
|
+
|
|
12
|
+
The name carries both structures the folder has. The basename pairs a proposal to its source so a reader opens the two side by side, and the number is the settle order, which is a dependency rather than a preference: a file other files quote is settled first. Do not group proposals by theme.
|
|
13
|
+
|
|
14
|
+
A proposal opened after the initial pass takes the next free number, and the folder is never renumbered. Its number records when the site was found rather than where it belongs in the dependency order. Renumbering to restore the order would rewrite the names of files already carrying answers, which costs more than the ordering is worth once applying has started.
|
|
15
|
+
|
|
16
|
+
Settle a late proposal ahead of any unapplied proposal quoting the surface it covers, whatever the two numbers say. A proposal already applied is past the question, since the file it governs is committed.
|
|
17
|
+
|
|
18
|
+
## Change format
|
|
19
|
+
|
|
20
|
+
Each proposal file opens with `# Proposal: <source path>`, one line naming the concern, the settle order, and the full surface the pass screened, then one `###` heading per change, ending with a `## Left alone` section. A change never sits at `##`, which the closing section reserves, and a variant never sits at `###`, which the change heading reserves. Skipping from `#` straight to `###` is deliberate: the file has exactly one layer of change between its title and its variants.
|
|
21
|
+
|
|
22
|
+
Naming the surface on every file, not only the first, is what lets Applying's cross-surface grep run cold. The Propose and Apply invocations are typically separate sessions days apart, so the surface the operator named has to survive on the file rather than in a conversation neither session shares.
|
|
23
|
+
|
|
24
|
+
A change carries an `###` heading, a fenced `diff` block holding the current text against the proposed, the reason beneath it, and its own answer slot.
|
|
25
|
+
|
|
26
|
+
- Heading: `### N. The sentence or section it sits in`
|
|
27
|
+
- Body: a `diff` fence, `-` for current and `+` for proposed
|
|
28
|
+
- `- **Why:** the reason, naming what the change fixes`
|
|
29
|
+
- `- **Open:** only where the replacement was drafted rather than corrected`
|
|
30
|
+
- `- **Recommended:** only where a pick is proposed ahead of the answer, directly above the slot`
|
|
31
|
+
- `- **You:**` last on every change, shipped empty
|
|
32
|
+
|
|
33
|
+
### Variants
|
|
34
|
+
|
|
35
|
+
A corrected change carries one replacement. A drafted one carries three, because the intent behind invented prose is not recoverable from the source text and a single draft turns the answer slot into a veto.
|
|
36
|
+
|
|
37
|
+
- Ship three variants on any change carrying `Open:`, labelled `#### A`, `#### B`, `#### C`
|
|
38
|
+
- Make them differ in approach rather than in wording. Three phrasings of one bet are one variant.
|
|
39
|
+
- State the bet each one makes in a line above its block, so the choice is between strategies and not between paragraphs
|
|
40
|
+
- Ship one replacement everywhere else. A word swapped for the recorded fact has no second option worth reading.
|
|
41
|
+
|
|
42
|
+
Three is the cap as well as the count. A fourth splits attention without widening the space.
|
|
43
|
+
|
|
44
|
+
### Placement
|
|
45
|
+
|
|
46
|
+
- Title a change by the section or sentence it sits in, never by its position in the file
|
|
47
|
+
- Quote text from another file in a `markdown` block rather than citing a line number, which goes stale on the first applied change
|
|
48
|
+
- Split a `Why:` into labelled halves when one change fixes two things (`**Why, the date:**`)
|
|
49
|
+
- Carry an `Open:` on any change whose replacement text was written rather than corrected, so a blanket answer cannot swallow it
|
|
50
|
+
|
|
51
|
+
Close each file with what it leaves alone. A pass reporting only what it would change reads as one that found everything wanting.
|
|
52
|
+
|
|
53
|
+
## The answer contract
|
|
54
|
+
|
|
55
|
+
`You:` belongs to the operator and ships empty on every change. Empty means unread and never agreement, matching the intake contract in `${CLAUDE_SKILL_DIR}/../../standards/intake.md` rather than the plan file's, which reads a blank slot as accepting the suggestion above it. State the inversion at the top of `00-overview.md` when the folder spans more than one file, since a contract read from the wrong surface gets applied to the wrong document.
|
|
56
|
+
|
|
57
|
+
- One `You:` per change, last in its bullet list, so an answer lands where the change is read
|
|
58
|
+
- Never fill a `You:` slot and never infer a disposition from an empty one
|
|
59
|
+
- The slot takes free text, not only `ok`. A rejection, a caveat, or a rewrite of the proposed line are all valid answers and a later pass reads them correctly.
|
|
60
|
+
- A pick made on the operator's behalf goes on a `- **Recommended:**` line directly above the slot, never inside it, and states which variant it takes and why. The slot below it still ships empty, so a count of unread changes still reads the change as unread.
|
|
61
|
+
|
|
62
|
+
An answer rejecting the draft reopens the change rather than closing it. Move that answer to a `- **Answered:**` line above the variants it produced, and ship a fresh empty `- **You:**` beneath them. The change reads as unread again, which is what it is.
|
|
63
|
+
|
|
64
|
+
Per-change slots do not license a partial sweep. Answering a change records one decision, and the applying rule below is what holds the set together.
|
|
65
|
+
|
|
66
|
+
The overview file carries no slot, since it proposes no changes.
|
|
67
|
+
|
|
68
|
+
## Applying
|
|
69
|
+
|
|
70
|
+
- Apply one file at a time, in the folder's settle order
|
|
71
|
+
- Apply every change in that file that carries an answer, and nothing that does not
|
|
72
|
+
- Re-grep each change's anchor against its source before applying it, and again after a rebase
|
|
73
|
+
- Grep the other named surfaces for the same claim before committing the file
|
|
74
|
+
- Write every hit that grep returns onto the proposal owning the file it sits in, as a change with its own answer slot, and open a proposal for a surface the pass has none for
|
|
75
|
+
- Commit the file once its own answered changes are applied. A hit in a sibling never holds it.
|
|
76
|
+
- Move an applied change into `applied.md` beside the proposals, carrying its reason and its answer
|
|
77
|
+
|
|
78
|
+
A partial pass is worse than none, and a file is the unit that can be finished. Settling one claim across every file at once touches all of them and closes none, so each file ends the pass looking reviewed while other changes in it sit answered and unapplied. The surface grep is what covers the cross-file half a per-file pass would otherwise miss.
|
|
79
|
+
|
|
80
|
+
Recording a hit rather than acting on it is what keeps the grep from rebuilding the whole-set gate. A sibling holding the same claim is a change nobody has answered yet, and holding this file until it is answered makes every file wait on the slowest one, which is the shape the per-file unit replaced.
|
|
81
|
+
|
|
82
|
+
A proposal outlives its own diff. The source moves under it, so an approved change stops matching while the defect it names survives in fresh wording. The anchor re-grep is the only thing that catches that.
|
|
83
|
+
|
|
84
|
+
## After
|
|
85
|
+
|
|
86
|
+
- Strip the `diff` blocks
|
|
87
|
+
- Keep the files, their headings, their reasons, and the answers
|
|
88
|
+
|
|
89
|
+
What remains is the record of what changed and why, which is the half no commit message holds. The folder stays where it is, beside every earlier pass, so a later one reads what an earlier one settled instead of asking it again.
|
|
90
|
+
|
|
91
|
+
The folder is gitignored and unbacked. It carries decision state rather than generated data, which is why `src/records/backup.ts` names it in `BACKED_FOLDERS`, but nothing else about its contents is enforced.
|
|
92
|
+
|
|
93
|
+
## Retrieval
|
|
94
|
+
|
|
95
|
+
Count the unread changes per file:
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
grep -c '^- \*\*You:\*\*$' .claude/proposals/<slug>/*.md
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
Report every answer given, against the change it sits under:
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
awk '/^### /{h=FILENAME": "$0} /^- \*\*You:\*\*./{print h; print " "$0}' .claude/proposals/<slug>/*.md
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
Both walk `###` headings, which is the mechanical reason an answer typed anywhere else is lost.
|
|
@@ -36,6 +36,7 @@ Poll GitHub for pull request movement by running <POLL_SCRIPT>, then act on what
|
|
|
36
36
|
- SEEN: report it and stop. A pass already covers that head, whether it arrived out of band or before the poll first saw the pull request, so no review follows.
|
|
37
37
|
- STALLED: read the last pass and report what it carried. The pass has sat open for hours with nothing following it, so a worker mid-task is already ruled out and the dispatch either never went out or the session holding it is gone. Confirm and re-send it under the dispatch rule below, whatever grades the pass carried. Do not re-run a review to correct the heading, since a pass on an unchanged head with no response behind it stops by design.
|
|
38
38
|
- CONFLICT: report it and stop. The branch owner rebases, not this session.
|
|
39
|
+
- UNMATCHED: report it and stop. A comment posted under a heading outside the known set reaches nobody automatically, so a person decides whether to answer it by hand or the set needs a sixth heading.
|
|
39
40
|
- GONE: report it, then sweep the board by invoking the aitk:claude-orchestrate skill and following its queue-refill sweep.
|
|
40
41
|
- A line starting `poll:`: report it verbatim and treat that pull request as unread this run. It is a failed query, not a state.
|
|
41
42
|
- Nothing changed: say exactly "No movement." and nothing else.
|
|
@@ -51,7 +52,9 @@ The script exits non-zero and classifies nothing when the open pull request list
|
|
|
51
52
|
|
|
52
53
|
The baseline lives at `.claude/.tmp/pr-poll/baseline.txt` under the main worktree root and is per-machine. A first run against a board already in flight reports each open pull request once before it settles.
|
|
53
54
|
|
|
54
|
-
The
|
|
55
|
+
The five review headings the script matches are written by `claude-pr-review` and `claude-address-review`, and the whole set is stated once in the first. A project that posts its reviews under different headings edits the jq filters in the script to match, or every pull request reads as never reviewed.
|
|
56
|
+
|
|
57
|
+
`UNMATCHED` is what a heading outside the five reaches, carried the same way `RESPONSE` is: a rising count against the baseline is what is new to this script, and the message names the heading so a person can tell whether to answer it by hand or add it to the set. It fires on a tracked pull request only, since a first sighting reports `SEEN` or `OPENED` and takes whatever count already sits on the thread as its starting baseline rather than flagging history the poll never watched.
|
|
55
58
|
|
|
56
59
|
`RESPONSE` is qualified by recency as well as by count, so it means a reply the last pass has not already answered rather than one this script has not seen before. A worker answers a finding and the reviewing session posts its close-out seconds later, which is the ordinary handback rather than a race, so a count on its own reported the answered thread on the next run and the re-review it routed to stopped at its own guard. The state now fires when the newest reply is stamped later than the last pass, and on a pull request carrying no pass at all, which is a worker talking to nobody and worth the turn. A reply landing inside the same second as the pass is dropped, matching the comparison `claude-pr-review` makes on the same two fields.
|
|
57
60
|
|
|
@@ -32,16 +32,19 @@ if [ -z "$BASE_REF" ]; then
|
|
|
32
32
|
fi
|
|
33
33
|
BASE_BRANCH="${BASE_REF#origin/}"
|
|
34
34
|
|
|
35
|
-
# These
|
|
36
|
-
# writes `## Review` and `## Review closed`, and
|
|
37
|
-
#
|
|
35
|
+
# These five strings are owned elsewhere and pinned here. `claude-pr-review`
|
|
36
|
+
# writes `## Review` and `## Review closed`, and states the full five-heading
|
|
37
|
+
# set once, beside the threshold it already states once. `claude-address-review`
|
|
38
|
+
# writes `## Review response`, `## Rebase`, and `## Post-review findings`, the
|
|
39
|
+
# last for a finding a worker produces after a close-out rather than in answer
|
|
40
|
+
# to one already on the thread. All three surfaces ship separately, so a
|
|
38
41
|
# heading added in either skill breaks a test here that no check reaches across.
|
|
39
42
|
#
|
|
40
|
-
# Both families match on the first line alone so the
|
|
41
|
-
#
|
|
42
|
-
#
|
|
43
|
-
#
|
|
44
|
-
#
|
|
43
|
+
# Both families match on the first line alone so the tests stay symmetric. The
|
|
44
|
+
# reply family carries `## Rebase` and `## Post-review findings` beside
|
|
45
|
+
# `## Review response` because neither answers a comment already on the thread,
|
|
46
|
+
# which is why both were kept outside the `## Review` family rather than folded
|
|
47
|
+
# into it.
|
|
45
48
|
JQ_LAST_REVIEWED_HEAD='
|
|
46
49
|
[ .reviews[]
|
|
47
50
|
| select((.body // "") | split("\n")[0] | rtrimstr("\r")
|
|
@@ -55,13 +58,37 @@ JQ_LAST_REVIEWED_HEAD='
|
|
|
55
58
|
JQ_REPLY_STATE='
|
|
56
59
|
[ .comments[]
|
|
57
60
|
| select((.body // "") | split("\n")[0] | rtrimstr("\r")
|
|
58
|
-
| . == "## Review response" or . == "## Rebase"
|
|
61
|
+
| . == "## Review response" or . == "## Rebase"
|
|
62
|
+
or . == "## Post-review findings")
|
|
59
63
|
] as $replies
|
|
60
64
|
| ($replies | length | tostring)
|
|
61
65
|
+ " "
|
|
62
66
|
+ ([ $replies[] | .createdAt // empty | fromdateiso8601 | floor ]
|
|
63
67
|
| max // 0 | tostring)
|
|
64
68
|
'
|
|
69
|
+
# A comment matching neither family above is the gap this filter exists to
|
|
70
|
+
# surface rather than absorb: a worker inventing a sixth heading used to reach
|
|
71
|
+
# this script as silence, indistinguishable from no comment at all. The count
|
|
72
|
+
# is read the same way the reply count is, a rising value against the baseline
|
|
73
|
+
# being new to this script, and the newest heading's text rides along for the
|
|
74
|
+
# report. It carries its spaces intact rather than encoded, since it is the
|
|
75
|
+
# last field on both sides of the pipe: `${unmatched_state#* }` below strips
|
|
76
|
+
# only the first space, and `read -r` further down hands its last named
|
|
77
|
+
# variable the rest of the line whole. Neither reads a heading's own spaces
|
|
78
|
+
# as a field separator, so a heading round-trips verbatim into the report a
|
|
79
|
+
# person reads when deciding whether to answer it by hand.
|
|
80
|
+
JQ_UNMATCHED_STATE='
|
|
81
|
+
[ .comments[]
|
|
82
|
+
| (.body // "") | split("\n")[0] | rtrimstr("\r")
|
|
83
|
+
| select(startswith("## "))
|
|
84
|
+
| select(. != "## Review" and . != "## Review closed"
|
|
85
|
+
and . != "## Review response" and . != "## Rebase"
|
|
86
|
+
and . != "## Post-review findings")
|
|
87
|
+
] as $unclassified
|
|
88
|
+
| ($unclassified | length | tostring)
|
|
89
|
+
+ " "
|
|
90
|
+
+ (($unclassified | last) // "none")
|
|
91
|
+
'
|
|
65
92
|
|
|
66
93
|
# `claude-pr-review` states the threshold and posts `## Review` exactly when a
|
|
67
94
|
# pass carries a finding, so the heading of the last review is what says whether
|
|
@@ -176,6 +203,11 @@ snapshot() {
|
|
|
176
203
|
# Three space-separated fields, so the line below carries them as its own
|
|
177
204
|
# sixth, seventh, and eighth rather than needing a split.
|
|
178
205
|
review_state=$(jq -r "$JQ_LAST_REVIEW_STATE" <<<"$payload")
|
|
206
|
+
# Split the same way as the reply state, carried as the line's tenth and
|
|
207
|
+
# eleventh fields.
|
|
208
|
+
unmatched_state=$(jq -r "$JQ_UNMATCHED_STATE" <<<"$payload")
|
|
209
|
+
unmatched_count=${unmatched_state%% *}
|
|
210
|
+
unmatched_heading=${unmatched_state#* }
|
|
179
211
|
|
|
180
212
|
# `gh pr view --json mergeable` reports UNKNOWN until GitHub finishes
|
|
181
213
|
# computing it, which is exactly when a poll asks. merge-tree answers
|
|
@@ -194,7 +226,7 @@ snapshot() {
|
|
|
194
226
|
merges=conflict
|
|
195
227
|
fi
|
|
196
228
|
|
|
197
|
-
echo "$n $head ${prior:-none} $resp $merges $review_state $reply_at"
|
|
229
|
+
echo "$n $head ${prior:-none} $resp $merges $review_state $reply_at $unmatched_count $unmatched_heading"
|
|
198
230
|
done
|
|
199
231
|
}
|
|
200
232
|
|
|
@@ -211,7 +243,7 @@ CHANGED=0
|
|
|
211
243
|
# would fire on every later run and the board would never read "No movement."
|
|
212
244
|
FINAL=""
|
|
213
245
|
|
|
214
|
-
while read -r n head prior resp merges heading age pass_at reply_at; do
|
|
246
|
+
while read -r n head prior resp merges heading age pass_at reply_at unmatched_count unmatched_heading; do
|
|
215
247
|
[ -z "$n" ] && continue
|
|
216
248
|
state=$heading
|
|
217
249
|
old=$(grep "^$n " "$STATE" || true)
|
|
@@ -229,7 +261,7 @@ while read -r n head prior resp merges heading age pass_at reply_at; do
|
|
|
229
261
|
echo "OPENED #$n at ${head:0:7}, $merges against $BASE_BRANCH"
|
|
230
262
|
fi
|
|
231
263
|
CHANGED=1
|
|
232
|
-
FINAL+="$n $head $prior $resp $merges $state $
|
|
264
|
+
FINAL+="$n $head $prior $resp $merges $state $unmatched_count"$'\n'
|
|
233
265
|
continue
|
|
234
266
|
fi
|
|
235
267
|
old_head=$(echo "$old" | cut -d' ' -f2)
|
|
@@ -240,6 +272,7 @@ while read -r n head prior resp merges heading age pass_at reply_at; do
|
|
|
240
272
|
# age decides the rest, so the first run after an upgrade needs no history and
|
|
241
273
|
# classifies a thread already past the threshold rather than waiting a run.
|
|
242
274
|
old_heading=$(echo "$old" | cut -d' ' -f6)
|
|
275
|
+
old_unmatched=$(echo "$old" | cut -d' ' -f7)
|
|
243
276
|
|
|
244
277
|
# A conflict arrives from the base moving, not from the branch, so it is
|
|
245
278
|
# reported on the transition rather than only when the head changes.
|
|
@@ -248,6 +281,19 @@ while read -r n head prior resp merges heading age pass_at reply_at; do
|
|
|
248
281
|
CHANGED=1
|
|
249
282
|
fi
|
|
250
283
|
|
|
284
|
+
# A rising count is what is new to this script, the same test RESPONSE
|
|
285
|
+
# below runs against the reply family. It fires on a tracked pull request
|
|
286
|
+
# only: a first sighting reports SEEN or OPENED and takes whatever count
|
|
287
|
+
# already sits on the thread as its starting baseline rather than flagging
|
|
288
|
+
# history retroactively. A carried line supplies neither, since
|
|
289
|
+
# carry_forward re-echoes the shorter baseline shape rather than a full
|
|
290
|
+
# snapshot line, so both sides default to zero the way old_unmatched
|
|
291
|
+
# already does.
|
|
292
|
+
if [ "${unmatched_count:-0}" -gt "${old_unmatched:-0}" ]; then
|
|
293
|
+
echo "UNMATCHED #$n posted under '$unmatched_heading'"
|
|
294
|
+
CHANGED=1
|
|
295
|
+
fi
|
|
296
|
+
|
|
251
297
|
if [ "$head" != "$old_head" ]; then
|
|
252
298
|
if [ "$prior" = "none" ]; then
|
|
253
299
|
echo "MOVED #$n -> ${head:0:7}, never reviewed"
|
|
@@ -312,7 +358,7 @@ while read -r n head prior resp merges heading age pass_at reply_at; do
|
|
|
312
358
|
# re-enters next run and STALLED oscillates instead of reporting once.
|
|
313
359
|
state=reported
|
|
314
360
|
fi
|
|
315
|
-
FINAL+="$n $head $prior $resp $merges $state"$'\n'
|
|
361
|
+
FINAL+="$n $head $prior $resp $merges $state $unmatched_count"$'\n'
|
|
316
362
|
done <<<"$NEW"
|
|
317
363
|
|
|
318
364
|
while read -r n _rest; do
|
|
@@ -85,7 +85,7 @@ Review the diff and files for the same axes as `claude-review` (bugs, edge cases
|
|
|
85
85
|
|
|
86
86
|
Then read the description's `## Testing` section, which is the one part of a pull request body this session is positioned to falsify. The branch author cannot see what a sibling branch drove the same day, and the arm list is what settles the claim rather than the diff.
|
|
87
87
|
|
|
88
|
-
Test every unchecked box against the testing discipline in `${CLAUDE_SKILL_DIR}/../../standards/
|
|
88
|
+
Test every unchecked box against the testing discipline in `${CLAUDE_SKILL_DIR}/../../standards/pr.md`, which reserves an unchecked box for a capability the agent lacks. Raise the box when it names no human at all, when the human it names is a live agent session, or when it names a person for a step the repository ships a harness for, `scripts/sandbox/run.sh` and `scripts/eval/run.sh` being the two. Cost alone is not an answer, since authorizing a spend is the operator's and performing the run is not. A refusal the author actually met is an answer, and it names which one.
|
|
89
89
|
|
|
90
90
|
Ask rather than grade. Whether a human is genuinely required is a reading the branch author may hold a reason this session cannot see, so the question carries no severity and enters no count. What it does carry is the heading and the dispatch, on the rule Step 4 states, because a question the author never receives corrects nothing and the author is the only party who can answer it. Answering it closes it, and the answer may be that the requirement holds.
|
|
91
91
|
|
|
@@ -170,7 +170,9 @@ A minor the dispatched worker declines is what needs a surface that survives the
|
|
|
170
170
|
|
|
171
171
|
Read the state off the most recent review comment rather than off the presence of a closed one. A close-out does not close the pull request, so a commit pushed after it gets its own pass, and that pass reopens the review under `## Review` when it raises a finding of any grade.
|
|
172
172
|
|
|
173
|
-
Both of this skill's headings anchor as a section distinct from human threads.
|
|
173
|
+
Both of this skill's headings anchor as a section distinct from human threads, and neither invents beyond what the whole set already states. That set is five headings across two families, stated here once so `claude-orchestrate`'s poll and every reply-posting skill cite it rather than carry a copy. The review family, `## Review` and `## Review closed`, belongs to this skill alone, and the reply family, `## Review response`, `## Rebase`, and `## Post-review findings`, belongs to `claude-address-review`.
|
|
174
|
+
|
|
175
|
+
The first reply heading answers a finding this skill posted, the second reports a stale branch resolved without one, and the third carries a finding a worker produces after a close-out rather than in answer to one already on the thread, since a finding produced late is still a finding. A comment posted under a heading outside these five reaches the poll as unclassified rather than as silence, so an invented sixth heading is a gap the next run reports instead of one it repeats. Do not append the PR number, which GitHub already renders above the comment.
|
|
174
176
|
|
|
175
177
|
Name the scope in every summary line after the first pass, since a reader cannot otherwise tell a narrow read from a full one. When the fallback in Step 2 fired, replace the commit count with `Re-reviewed the full change, the prior pass's commit is no longer on the branch`.
|
|
176
178
|
|
|
@@ -9,7 +9,7 @@ argument-hint: <subject to learn, or the topic of a workspace to resume or promo
|
|
|
9
9
|
|
|
10
10
|
Run a learning workspace on one subject across sessions. The workspace holds what the learner has been through, so a session weeks later resumes from the folder rather than from the conversation.
|
|
11
11
|
|
|
12
|
-
The shape of the workspace is fixed by `${CLAUDE_SKILL_DIR}/../../standards/teach.md`. Read it before writing anything into the folder. The glossary answers to `${CLAUDE_SKILL_DIR}/
|
|
12
|
+
The shape of the workspace is fixed by `${CLAUDE_SKILL_DIR}/../../standards/teach.md`. Read it before writing anything into the folder. The glossary answers to `${CLAUDE_SKILL_DIR}/../../standards/glossary.md`, whose shape governs a glossary wherever it lands, since a promoted glossary keeps its shape at whatever path it reaches and no project folder covers all of them. The pedagogy sits in `${CLAUDE_SKILL_DIR}/references/pedagogy.md`, the lesson craft in `${CLAUDE_SKILL_DIR}/references/lesson-craft.md`, and the promotion routing in `${CLAUDE_SKILL_DIR}/references/promotion.md`.
|
|
13
13
|
|
|
14
14
|
## Guards
|
|
15
15
|
|
|
@@ -43,7 +43,7 @@ Try each source in order. Stop at the first match.
|
|
|
43
43
|
|
|
44
44
|
Validate the result: letters, digits, dots, underscores, dashes only, max 64 chars (`/` separators are also allowed). If the derived name violates the rule, sanitize by replacing invalid chars with `-` and truncating. Show the sanitized name in the preview before invoking.
|
|
45
45
|
|
|
46
|
-
Resolve `<type>` here as well, since Step 3 previews it and Step 5 renames onto it. A name from a plan takes the type that plan's own work carries, read off its `## Summary` and `**Files to touch:**` lines. Every other case takes `feat`, which covers a name from a branch, a name from the user, and a plan whose lines settle nothing. Draw the value from the type vocabulary in `${CLAUDE_SKILL_DIR}/
|
|
46
|
+
Resolve `<type>` here as well, since Step 3 previews it and Step 5 renames onto it. A name from a plan takes the type that plan's own work carries, read off its `## Summary` and `**Files to touch:**` lines. Every other case takes `feat`, which covers a name from a branch, a name from the user, and a plan whose lines settle nothing. Draw the value from the type vocabulary in `${CLAUDE_SKILL_DIR}/../../standards/branch.md`.
|
|
47
47
|
|
|
48
48
|
A wrong type is cheap. `git-branch` renames to conventional format later in the same chain and runs ahead of `git-pr`, so a `feat/` written over a fix is corrected before any pull request opens.
|
|
49
49
|
|
|
@@ -9,7 +9,7 @@ Creates one snippet file. Read these files in parallel:
|
|
|
9
9
|
|
|
10
10
|
- `${CLAUDE_SKILL_DIR}/../../standards/markdown.md`: banned words, punctuation, and formatting for all generated text
|
|
11
11
|
- The `write-human` skill: voice, rhythm, and sentence construction for all generated text
|
|
12
|
-
- `${CLAUDE_SKILL_DIR}/
|
|
12
|
+
- `${CLAUDE_SKILL_DIR}/../../standards/snippets.md`: authoring conventions, invocation channels, use patterns
|
|
13
13
|
|
|
14
14
|
## Guards
|
|
15
15
|
|
|
@@ -7,7 +7,7 @@ description: Generates and validates conventional branch names. Use for any bran
|
|
|
7
7
|
|
|
8
8
|
Before generating a branch name, read:
|
|
9
9
|
|
|
10
|
-
- `${CLAUDE_SKILL_DIR}/
|
|
10
|
+
- `${CLAUDE_SKILL_DIR}/../../standards/branch.md`: format, types, length limit, and constraints
|
|
11
11
|
|
|
12
12
|
Follow it exactly.
|
|
13
13
|
|
|
@@ -7,7 +7,7 @@ description: Generates one conventional commit message from the staged changes a
|
|
|
7
7
|
|
|
8
8
|
Before generating a commit message, read:
|
|
9
9
|
|
|
10
|
-
- `${CLAUDE_SKILL_DIR}/
|
|
10
|
+
- `${CLAUDE_SKILL_DIR}/../../standards/commit.md`: format, types, scopes, and constraints
|
|
11
11
|
- `${CLAUDE_SKILL_DIR}/../../standards/versioning.md`: phase label vs semver discipline
|
|
12
12
|
|
|
13
13
|
Follow them exactly.
|
|
@@ -11,7 +11,7 @@ Format an issue from session context following the issue standard, then file it
|
|
|
11
11
|
|
|
12
12
|
Read these in parallel:
|
|
13
13
|
|
|
14
|
-
- `${CLAUDE_SKILL_DIR}/
|
|
14
|
+
- `${CLAUDE_SKILL_DIR}/../../standards/issue.md`: issue title, labels, body sections, and banned phrases
|
|
15
15
|
- `${CLAUDE_SKILL_DIR}/../../standards/markdown.md`: banned words, punctuation, and formatting for all generated text
|
|
16
16
|
- The `write-human` skill: voice, rhythm, and sentence construction for all generated text
|
|
17
17
|
|
|
@@ -39,7 +39,7 @@ After outputting the preview, execute the final command immediately. Claude Code
|
|
|
39
39
|
|
|
40
40
|
### Pre-publish scan
|
|
41
41
|
|
|
42
|
-
Before running the final command, run the scan in `${CLAUDE_SKILL_DIR}/../../standards/publish.md` against the title and body. The title and body go straight to the remote with nothing checking them on the way, so this scan is the only gate. It covers the phase-label check as well as the characters, since both go to a reader who has no task board. It applies on top of the banned phrases in `${CLAUDE_SKILL_DIR}/
|
|
42
|
+
Before running the final command, run the scan in `${CLAUDE_SKILL_DIR}/../../standards/publish.md` against the title and body. The title and body go straight to the remote with nothing checking them on the way, so this scan is the only gate. It covers the phase-label check as well as the characters, since both go to a reader who has no task board. It applies on top of the banned phrases in `${CLAUDE_SKILL_DIR}/../../standards/issue.md`.
|
|
43
43
|
|
|
44
44
|
### Final command
|
|
45
45
|
|
|
@@ -9,8 +9,8 @@ description: Generates pull request titles and descriptions from git diffs. Use
|
|
|
9
9
|
|
|
10
10
|
Read these files in parallel:
|
|
11
11
|
|
|
12
|
-
- `${CLAUDE_SKILL_DIR}/
|
|
13
|
-
- `${CLAUDE_SKILL_DIR}/
|
|
12
|
+
- `${CLAUDE_SKILL_DIR}/../../standards/branch.md`: branch format, valid types, and constraints
|
|
13
|
+
- `${CLAUDE_SKILL_DIR}/../../standards/pr.md`: structure, rules, and banned phrases
|
|
14
14
|
- `${CLAUDE_SKILL_DIR}/references/labels.md`: label map format, matching, and the missing-label warning. Skip when the project has no `.claude/aitk/pr-labels.toml`.
|
|
15
15
|
- `${CLAUDE_SKILL_DIR}/../../standards/markdown.md`: banned words, punctuation, and formatting for all generated text
|
|
16
16
|
- The `write-human` skill: voice, rhythm, and sentence construction for all generated text
|
|
@@ -47,7 +47,7 @@ Either case leaves both reads empty, which the no-commits guard below catches. S
|
|
|
47
47
|
|
|
48
48
|
## Guards
|
|
49
49
|
|
|
50
|
-
- If branch name does not match `<type>/<description>` format (valid types are defined in `${CLAUDE_SKILL_DIR}/
|
|
50
|
+
- If branch name does not match `<type>/<description>` format (valid types are defined in `${CLAUDE_SKILL_DIR}/../../standards/branch.md`), stop and output:
|
|
51
51
|
`❌ Branch name does not follow conventions. Run /git-branch to rename first.`
|
|
52
52
|
- If no commits ahead of main, stop and output:
|
|
53
53
|
`❌ No commits ahead of main. Nothing to PR.`
|
|
@@ -64,13 +64,13 @@ After outputting the preview, execute the final command immediately. Claude Code
|
|
|
64
64
|
|
|
65
65
|
### Testing checkboxes
|
|
66
66
|
|
|
67
|
-
Follow Testing discipline in `${CLAUDE_SKILL_DIR}/
|
|
67
|
+
Follow Testing discipline in `${CLAUDE_SKILL_DIR}/../../standards/pr.md`. Run each check before writing its line, then tick the box and state the result the run reported. Never pre-check based on intent or past sessions.
|
|
68
68
|
|
|
69
69
|
Leave a box unchecked only for the human-only cases the reference defines, and name which human and why on the same line. A request for the reviewer is not a test result, so it belongs under `## For the reviewer` rather than in the Testing list.
|
|
70
70
|
|
|
71
71
|
### Pre-publish scan
|
|
72
72
|
|
|
73
|
-
Before running the final command, run the scan in `${CLAUDE_SKILL_DIR}/../../standards/publish.md` against the PR title and body. The title and body go straight to the remote with nothing checking them on the way, so this scan is the only gate. It covers the phase-label check as well as the characters, since both go to a reader who has no task board. It applies on top of the banned phrases in `${CLAUDE_SKILL_DIR}/
|
|
73
|
+
Before running the final command, run the scan in `${CLAUDE_SKILL_DIR}/../../standards/publish.md` against the PR title and body. The title and body go straight to the remote with nothing checking them on the way, so this scan is the only gate. It covers the phase-label check as well as the characters, since both go to a reader who has no task board. It applies on top of the banned phrases in `${CLAUDE_SKILL_DIR}/../../standards/pr.md`.
|
|
74
74
|
|
|
75
75
|
### Resolving the pull request
|
|
76
76
|
|
|
@@ -7,8 +7,8 @@ description: Splits a mixed-commit branch into focused branches off main using c
|
|
|
7
7
|
|
|
8
8
|
Before proposing a split, read in parallel:
|
|
9
9
|
|
|
10
|
-
- `${CLAUDE_SKILL_DIR}/
|
|
11
|
-
- `${CLAUDE_SKILL_DIR}/
|
|
10
|
+
- `${CLAUDE_SKILL_DIR}/../../standards/branch.md`: format, types, length limit, and constraints
|
|
11
|
+
- `${CLAUDE_SKILL_DIR}/../../standards/pr.md`: PR title format, body sections, and content rules
|
|
12
12
|
|
|
13
13
|
Follow both exactly.
|
|
14
14
|
|
|
@@ -7,7 +7,7 @@ description: Groups staged files by concern and generates one conventional commi
|
|
|
7
7
|
|
|
8
8
|
Read these files in parallel:
|
|
9
9
|
|
|
10
|
-
- `${CLAUDE_SKILL_DIR}/
|
|
10
|
+
- `${CLAUDE_SKILL_DIR}/../../standards/commit.md`: format, types, scopes, and constraints
|
|
11
11
|
- `${CLAUDE_SKILL_DIR}/../../standards/markdown.md`: banned words, punctuation, and formatting for all generated text
|
|
12
12
|
- The `write-human` skill: voice, rhythm, and sentence construction for all generated text
|
|
13
13
|
|