@erclx/aitk 3.32.0 → 3.33.0

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": "3.32.0",
4
+ "version": "3.33.0",
5
5
  "author": {
6
6
  "name": "Eric Le",
7
7
  "url": "https://github.com/erclx"
@@ -44,6 +44,10 @@ Resolve `<plan>` in this order, stopping at the first match:
44
44
  1. **Caller-supplied.** The invocation carried an argument. Accept it as a plan path or a bare slug, in the same position `claude-worktree` tier 0 accepts its name. A bare slug resolves to `.claude/plans/feature-<slug>.md`, and a path is taken as given, relative to the main worktree root. If it does not resolve to a file, stop: `❌ No plan at <path>. Path was supplied, not derived, so check it and re-run.`
45
45
  2. **Derived.** `.claude/plans/feature-<slug>.md`, from the `<slug>` the Guards derived. If it does not exist, stop: `❌ No approved plan at .claude/plans/feature-<slug>.md. Run /claude-feature first.`
46
46
 
47
+ Test the shape of whatever `<plan>` resolved to before reading it as one. A file resolving under either tier can still be the wrong document, a task file most often, so the test runs after both rather than guarding the supplied tier alone.
48
+
49
+ Check for a `**Files to touch:**` or `## Files to touch` marker per `${CLAUDE_SKILL_DIR}/../../standards/plan.md`, the one section every plan carries structurally and a task never does, where `## Outcomes` and `## Findings` are the task's own. If neither form is present, stop: `❌ <path> carries no plan sections. A plan lives at .claude/plans/feature-<slug>.md; a task lives at .claude/tasks/. Point autoship at the plan and re-run.`
50
+
47
51
  Read `<plan>` at the main worktree root. This file is the scope for this run.
48
52
 
49
53
  Its sections and its answer contract are fixed by `${CLAUDE_SKILL_DIR}/../../standards/plan.md`. A blank `- Answer:` accepts the `- Suggested:` line above it, so an unanswered question is a decision this run executes rather than a reason to stop.
@@ -155,15 +159,16 @@ Omit the second line if there were no minor findings, and the third if nothing r
155
159
 
156
160
  Every stop point leaves recoverable state. The user resumes manually from the appropriate step.
157
161
 
158
- | Stop point | Recovery |
159
- | ---------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- |
160
- | No plan (derived) | Run `/claude-feature` to create one |
161
- | No plan (caller-supplied) | Check the path or slug passed to autoship, then re-run |
162
- | No diff baseline | Fetch origin so a merge base resolves against `main`, then re-run autoship |
163
- | Empty changed-file list | Re-run once the plan produces tracked output. Ship gitignored output outside the chain, never by tracking it. |
164
- | Branch collision on worktree entry | `claude-worktree` Step 5 found `<slug>` already as a local branch. Resolve manually (rename or delete the stale branch), then re-run autoship. |
165
- | Verify fails | Read logs, fix manually, run `/git-ship` |
166
- | UI checklist | Verify visually, run `/git-ship` |
167
- | Inherited review findings | Fix findings, run `/git-ship` |
168
- | Self-introduced finding survived | Read the receipt for what the one repair pass left open, fix it, run `/git-ship` |
169
- | git-ship fails | Inspect hook or remote error, run again |
162
+ | Stop point | Recovery |
163
+ | ----------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- |
164
+ | No plan (derived) | Run `/claude-feature` to create one |
165
+ | No plan (caller-supplied) | Check the path or slug passed to autoship, then re-run |
166
+ | Resolved file carries no plan shape | Point autoship at a real plan under `.claude/plans/feature-<slug>.md`, not a task file, then re-run |
167
+ | No diff baseline | Fetch origin so a merge base resolves against `main`, then re-run autoship |
168
+ | Empty changed-file list | Re-run once the plan produces tracked output. Ship gitignored output outside the chain, never by tracking it. |
169
+ | Branch collision on worktree entry | `claude-worktree` Step 5 found `<slug>` already as a local branch. Resolve manually (rename or delete the stale branch), then re-run autoship. |
170
+ | Verify fails | Read logs, fix manually, run `/git-ship` |
171
+ | UI checklist | Verify visually, run `/git-ship` |
172
+ | Inherited review findings | Fix findings, run `/git-ship` |
173
+ | Self-introduced finding survived | Read the receipt for what the one repair pass left open, fix it, run `/git-ship` |
174
+ | git-ship fails | Inspect hook or remote error, run again |
@@ -11,6 +11,12 @@ Any session writes one. Do not assert a role on invocation, and do not add a rol
11
11
 
12
12
  Run every step rather than judging in advance that one has nothing to act on. The capture skill and the drift verb each answer for themselves, refusal included, and a refusal recorded is a result where a prediction of one is not. A project carrying none of the scaffolding either step reads is the case this fires on, and it is the case where skipping looks most defensible.
13
13
 
14
+ ## What fires this
15
+
16
+ Being asked is one route. The other is a `PreCompact` hook registered against the `manual` matcher, which a project may install and which blocks the first `/compact` of a session with a message naming this skill. The block fires once, so the next `/compact` proceeds whether or not a map was written, and an automatic compaction is never blocked. A project that registered no such hook reaches this skill by being asked alone.
17
+
18
+ Decline where the session holds no reasoning a reader could not get faster from git. Say so in one line and write nothing. The standard already names a `## State` filled from the tree as non-conforming, and the file that carries three such sections is worse than an absent one, because a reader who finds a map trusts it. Declining is a result the caller can act on, where a padded map is a result that misleads.
19
+
14
20
  ## Guards
15
21
 
16
22
  - If `git rev-parse --git-dir` does not resolve, stop: `❌ Not a git repository. A session map takes its filename from the branch.`
@@ -54,4 +60,11 @@ The file sits at the main worktree root, which the file-editing tools refuse fro
54
60
  <what the drift verb named, or the boundary it refused at>
55
61
  ```
56
62
 
63
+ A decline reports itself rather than falling silent, so a caller can tell it from a run that failed:
64
+
65
+ ```plaintext
66
+ ✅ No session map. <what the session holds that git does not, and why it is nothing>
67
+ <what the drift verb named, or the boundary it refused at>
68
+ ```
69
+
57
70
  Emit the path from the project root. The `## Output` section of the project's instruction file sets the form it takes.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@erclx/aitk",
3
3
  "type": "module",
4
- "version": "3.32.0",
4
+ "version": "3.33.0",
5
5
  "description": "Infrastructure and quality tooling for developer workflows",
6
6
  "license": "MIT",
7
7
  "bin": {