@erclx/aitk 3.41.0 → 3.42.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.
- package/claude/.claude-plugin/plugin.json +1 -1
- package/claude/skills/claude-autoship/SKILL.md +39 -18
- package/claude/skills/migration-standards-drop/REQUIREMENT.md +55 -0
- package/claude/skills/migration-standards-drop/SKILL.md +113 -0
- package/docs/ai-workflow.md +9 -8
- package/package.json +1 -1
- package/src/claude/cases/setup.ts +5 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: claude-autoship
|
|
3
|
-
description: Chains implement → verify → review → ship after a feature plan is approved. Reads the plan the caller names, or the plan for the current branch when none is named, runs the full pipeline in one session, and stops on any failure or non-minor review finding. Use when asked to "autoship", "ship this feature end to end", or "run the chain". Do NOT auto-trigger. Requires an approved plan file.
|
|
3
|
+
description: Chains implement → verify → review → ship after a feature plan is approved. Reads the plan the caller names, the plan a named task points at, or the plan for the current branch when none is named, runs the full pipeline in one session, and stops on any failure or non-minor review finding. Use when asked to "autoship", "ship this feature end to end", or "run the chain". Do NOT auto-trigger. Requires an approved plan file.
|
|
4
4
|
disable-model-invocation: true
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -45,12 +45,29 @@ If the two commands differ, the session is already in a linked worktree. Continu
|
|
|
45
45
|
|
|
46
46
|
Resolve `<plan>` in this order, stopping at the first match:
|
|
47
47
|
|
|
48
|
-
1. **Caller-supplied.** The invocation carried
|
|
49
|
-
2. **
|
|
48
|
+
1. **Caller-supplied task.** The invocation carried a path under `.claude/tasks/`. If it does not resolve to a file, stop: `❌ No task at <path>. Path was supplied, not derived, so check it and re-run.` Read that task's first `Plan:` line and take what it names as `<plan>`, per `${CLAUDE_SKILL_DIR}/../../standards/tasks.md`.
|
|
49
|
+
2. **Caller-supplied plan.** The invocation carried something else. 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 from 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.`
|
|
50
|
+
3. **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.`
|
|
50
51
|
|
|
51
|
-
|
|
52
|
+
Only a path reaches tier 1, and a bare slug is read as a plan's throughout. The two would collide on any similar name, and a caller who means the task holds its path already, having read it off the board. One plan per task is what makes the tier 1 read unambiguous, so it takes the first `Plan:` line and never scans for a second.
|
|
52
53
|
|
|
53
|
-
|
|
54
|
+
Read the target out of the link's parentheses, and take the rest of the line when the line carries no link, since an older task writes the target as a plain path with nothing around it. Resolve a relative target against the directory holding the task file rather than against `.claude/tasks/`, and take a project-root target from the root. The archived task is what makes that base matter, since the standard points its line at `../../plans/archive/feature-<slug>.md` once the task sits a folder deeper, and reading that from `.claude/tasks/` lands on a repository-root `plans/archive/` that never exists.
|
|
55
|
+
|
|
56
|
+
### When a tier fails
|
|
57
|
+
|
|
58
|
+
Tier 1 stops on three failures, and each names a different repair:
|
|
59
|
+
|
|
60
|
+
- No `Plan:` line at all. Stop: `❌ <path> carries no Plan: line, so nothing there names a plan to run. Write the plan and point the task at it, or pass the plan path directly.` A row still awaiting a plan is the ordinary case, so the message names the missing pointer rather than the missing plan sections a reader would then go hunting for.
|
|
61
|
+
- The pointer resolves into a plans archive. Stop: `❌ <path> points at an archived plan, which describes work that already shipped. Reopen the task against a live plan, or pass that plan directly.` Test the resolved path rather than the task's outcomes or its `Pull request:` line, since a stale board gets its ticks wrong and the standard fixes where a shipped pointer lands.
|
|
62
|
+
- The pointer resolves to no file. Stop: `❌ <path> points at <target>, which does not exist. The citation is stale, so repoint the task or pass the plan path directly.`
|
|
63
|
+
|
|
64
|
+
An archive is `.claude/plans/archive/` and also the two older spellings `${CLAUDE_SKILL_DIR}/../../standards/tasks.md` leaves in place for a project that archived plans before the folder nested, written from a task as `../plans-archive/` and `../.tmp/plans-archive/`. Test all three, since a shipped pointer in a project nobody migrated lands on the older two. Run the archive test ahead of the existence test, so a pointer into an archive that no longer holds the file still refuses as shipped work rather than as a stale citation.
|
|
65
|
+
|
|
66
|
+
Each tier fails for a different reason and says so. A supplied path resolving to nothing is a typo, a derived path resolving to nothing is a plan nobody wrote, and a task pointer resolving to nothing is a stale citation the board should have caught.
|
|
67
|
+
|
|
68
|
+
Test the shape of whatever `<plan>` resolved to before reading it as one. A file resolving under any tier can still be the wrong document, and tier 1 resolves through a pointer rather than from the caller, so the test runs after all three rather than guarding a supplied path alone.
|
|
69
|
+
|
|
70
|
+
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, and a task reaches one through its Plan: line only from .claude/tasks/. Point autoship at either and re-run.`
|
|
54
71
|
|
|
55
72
|
Read `<plan>` at the main worktree root. This file is the scope for this run.
|
|
56
73
|
|
|
@@ -163,16 +180,20 @@ Omit the second line if there were no minor findings, and the third if nothing r
|
|
|
163
180
|
|
|
164
181
|
Every stop point leaves recoverable state. The user resumes manually from the appropriate step.
|
|
165
182
|
|
|
166
|
-
| Stop point
|
|
167
|
-
|
|
|
168
|
-
| No plan (derived)
|
|
169
|
-
| No plan (caller-supplied)
|
|
170
|
-
|
|
|
171
|
-
|
|
|
172
|
-
|
|
|
173
|
-
|
|
|
174
|
-
|
|
|
175
|
-
|
|
|
176
|
-
|
|
|
177
|
-
|
|
|
178
|
-
|
|
|
183
|
+
| Stop point | Recovery |
|
|
184
|
+
| ------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
185
|
+
| No plan (derived) | Run `/claude-feature` to create one |
|
|
186
|
+
| No plan (caller-supplied) | Check the path or slug passed to autoship, then re-run |
|
|
187
|
+
| No task (caller-supplied) | Check the task path passed to autoship, then re-run |
|
|
188
|
+
| Task carries no `Plan:` line | Write the plan, point the task's `Plan:` line at it, then re-run |
|
|
189
|
+
| Task points at an archived plan | The work already shipped. Reopen the task against a live plan, or pass that plan's path directly. |
|
|
190
|
+
| Task's `Plan:` pointer resolves to nothing | Repoint the task's `Plan:` line at the plan that exists, then re-run |
|
|
191
|
+
| Resolved file carries no plan shape | Point autoship at a plan under `.claude/plans/feature-<slug>.md` or at a task under `.claude/tasks/`, then re-run |
|
|
192
|
+
| No diff baseline | Fetch origin so a merge base resolves against `main`, then re-run autoship |
|
|
193
|
+
| Empty changed-file list | Re-run once the plan produces tracked output. Ship gitignored output outside the chain, never by tracking it. |
|
|
194
|
+
| 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. |
|
|
195
|
+
| Verify fails | Read logs, fix manually, run `/git-ship` |
|
|
196
|
+
| UI checklist | Verify visually, run `/git-ship` |
|
|
197
|
+
| Inherited review findings | Fix findings, run `/git-ship` |
|
|
198
|
+
| Self-introduced finding survived | Read the receipt for what the one repair pass left open, fix it, run `/git-ship` |
|
|
199
|
+
| git-ship fails | Inspect hook or remote error, run again |
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: migration-standards-drop
|
|
3
|
+
description: Why the standards-tree drop ships as an ordered proposal, what the two pre-delete reads catch, and why one citation form serves every surface inside a target
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Migration standards drop requirement
|
|
7
|
+
|
|
8
|
+
## Gap
|
|
9
|
+
|
|
10
|
+
Without this skill, nothing names the tree. The sync engine registers governance alone and the unmigrated scan carries an empty root-layout set, both by decision rather than by omission, so a target holding 21 installed standards files reports clean and the drop runs off whoever remembers to look. The census that found the population walked one folder on one machine and moved the count from four to seven.
|
|
11
|
+
|
|
12
|
+
The order is the second failure and it has two halves. A session that deletes before syncing lands the installed rules citing a path it removed, and one that sweeps before syncing repoints citations the sync then rewrites.
|
|
13
|
+
|
|
14
|
+
The delete otherwise runs blind in two directions. Two of the five targets measured on 2026-08-28 carried a runtime reader, one a hook hand-parsing a standard for its banned-word set, and a hook whose input is gone audits nothing while reporting a clean run. In the other direction, nothing separates a file the project wrote from a toolkit copy by name, and the corpus had moved on from all 20 files at one target, so a content diff sorts every file as changed and a session reading that diff either keeps everything or loses the one file no corpus carries.
|
|
15
|
+
|
|
16
|
+
The repoint form is the fourth. A session applying the citation rule it knows from a shipped skill writes `${CLAUDE_SKILL_DIR}/../../standards/<name>.md`, which from a project-local skill at `.claude/skills/<name>/` resolves back into the tree the same pass deleted, and reports the sweep finished.
|
|
17
|
+
|
|
18
|
+
The last is the name map. `prose` split into `markdown.md` plus the `write-human` skill and resolves as no standard, so a mechanical one-to-one repoint produces a citation to nothing and every check on it passes.
|
|
19
|
+
|
|
20
|
+
## Must
|
|
21
|
+
|
|
22
|
+
- Detect from a read of `.claude/standards/` itself, since no report names the tree and a session waiting for one waits forever
|
|
23
|
+
- Report the state a binary behind the published version puts the sync in, before naming a sync a stale binary would run
|
|
24
|
+
- Split the tree against `aitk standards list --json` three ways, separating an unchanged toolkit copy from a drifted one and from a name that resolves to no standard
|
|
25
|
+
- Name every runtime reader ahead of any delete, splitting a reader from a citation by whether the file is markdown, and say when the search could not run
|
|
26
|
+
- Give every citation inside a target one target form, `aitk standards <name>`, and say why the plugin-root form fails there
|
|
27
|
+
- Order the proposal sync, drop, sweep, and state that the sweep re-reads after the sync rather than before it
|
|
28
|
+
- Report an unmatched name as the user's to place, naming the `prose` split as the recorded instance
|
|
29
|
+
- Report the measured empty case as a pass, since the guard is what proves the read ran
|
|
30
|
+
|
|
31
|
+
## Must not
|
|
32
|
+
|
|
33
|
+
- Run the sync, delete or move a file under the tree, or rewrite a citation
|
|
34
|
+
- Sort a drifted file as project-authored or as toolkit-owned on a content diff alone
|
|
35
|
+
- Propose the plugin-root citation form for a surface inside a target
|
|
36
|
+
- Relocate the install stamp. One visit per target is cheaper than two and a skill is not a visit, so the stamp rides with whatever else reaches the target.
|
|
37
|
+
- Stay in the catalog on the author typing its name alone. Nothing can answer that before the skill has run, so read the census back once it has and retire it if the answer is nobody.
|
|
38
|
+
|
|
39
|
+
## Guards
|
|
40
|
+
|
|
41
|
+
- A directory with no `.claude/` stops, since nothing there installed a tree
|
|
42
|
+
- A `.claude/standards/` holding no markdown is the pass rather than a refusal
|
|
43
|
+
- No `aitk` on `PATH` stops, since every citation this move writes names a verb the target has to run
|
|
44
|
+
|
|
45
|
+
## Out of scope
|
|
46
|
+
|
|
47
|
+
- Classifying `CLAUDE.md` sections into the three-tier model: `migration-claude-md`
|
|
48
|
+
- Relocating `docs/` files by audience: `migration-context`
|
|
49
|
+
- Splitting a retired `.claude/` file into the folder that replaced it, which pairs one file against one folder rather than dropping a corpus: `migration-superseded`
|
|
50
|
+
- Reconciling a seed file against its source section by section: `claude-seed-sync`
|
|
51
|
+
- Applying the drop and the sweep, which the user does after reviewing
|
|
52
|
+
|
|
53
|
+
## Why it ships while its consumer row is parked
|
|
54
|
+
|
|
55
|
+
The one task performing this move is parked on the operator declining outside-repository work, so the skill arrives with three known consumers and no live instance. It ships anyway, because the parked row is about who is authorized to visit a target rather than about the move being wrong, and the skill is what makes the move repeatable by whoever is authorized. The evidence behind it comes from the census rather than from a run, which is the weaker of the two and is recorded here as such.
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: migration-standards-drop
|
|
3
|
+
description: Proposes the ordered drop of an installed `.claude/standards/` tree and the repoint of every citation at `aitk standards <name>`, separating a toolkit copy from a file the project wrote and naming any runtime reader before a delete is proposed. Use when asked to "drop the standards tree", "repoint the standards citations", "my project still has .claude/standards/", or when a toolkit update leaves an installed standards copy no command refreshes. Do NOT delete the tree, run the sync, or rewrite a citation. Proposal only.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Migration standards drop
|
|
7
|
+
|
|
8
|
+
## Guards
|
|
9
|
+
|
|
10
|
+
- If `.claude/` does not exist at `pwd`, stop: `❌ No .claude/ directory. Nothing here installed a standards tree.`
|
|
11
|
+
- If `.claude/standards/` holds no markdown, that is the pass: `✅ No installed standards tree. Nothing to drop.`
|
|
12
|
+
- If `aitk` is not on `PATH`, stop: `❌ aitk is not on PATH. Every citation this move writes names a verb the target has to run.`
|
|
13
|
+
|
|
14
|
+
Detection is the directory read above and nothing else. No report names this tree, since the sync engine registers governance alone and the unmigrated scan covers a root layout an older toolkit wrote rather than a copy under `.claude/`. A session waiting for a command to raise the tree waits forever.
|
|
15
|
+
|
|
16
|
+
## Step 1: read the version the sync would run from
|
|
17
|
+
|
|
18
|
+
Run `aitk sync --check . --json` and read its `skew` object. The sync in Step 5 installs the rules the running binary carries, so a binary predating the citation change installs rules naming the path this move removes, and the sweep then has more to fix than it started with.
|
|
19
|
+
|
|
20
|
+
- `state` is `behind`: stop. `❌ The aitk on PATH is <installed> against <latest> published. A gov sync from it installs rules citing the standards path. Update, then re-run.`
|
|
21
|
+
- `state` is `unknown`: report the reason and continue. A version that could not be read is unread rather than stale.
|
|
22
|
+
- `state` is `current`: continue.
|
|
23
|
+
|
|
24
|
+
## Step 2: split the tree three ways
|
|
25
|
+
|
|
26
|
+
Run `aitk standards list --json`. Each entry carries `name` and `content`, so the comparison needs no second read. Match every `.claude/standards/<stem>.md` against `name`:
|
|
27
|
+
|
|
28
|
+
- **Matched, content identical.** A toolkit copy the corpus still carries unchanged. The drop loses nothing.
|
|
29
|
+
- **Matched, content differs.** A toolkit copy that has drifted, and the diff cannot say which side moved. Report it as a read the user owes rather than sorting it either way. All 20 files measured at one target on 2026-08-28 read as changed, because the corpus had moved on since the install, and none of them was project-authored.
|
|
30
|
+
- **Unmatched.** No standard resolves under that name. Either the project wrote the file or the toolkit retired the name, and the catalog cannot separate the two.
|
|
31
|
+
|
|
32
|
+
Report a project-authored file as one this move keeps. Its destination is `standards/<name>.md` at the project root, which `aitk standards <name>` resolves ahead of the package corpus, so the citation form Step 4 gives every other file serves it too.
|
|
33
|
+
|
|
34
|
+
`prose` is the recorded retirement. It split into `markdown.md` plus the `write-human` skill and resolves as no standard at all, so a citation repointed one-to-one from it names nothing. Report an unmatched name as the user's to place and name that split as the instance.
|
|
35
|
+
|
|
36
|
+
## Step 3: name every runtime reader before naming a delete
|
|
37
|
+
|
|
38
|
+
Run both from the project root, in parallel:
|
|
39
|
+
|
|
40
|
+
- `git grep -ln 'claude/standards' -- '*.md'`: the citations Step 4 repoints
|
|
41
|
+
- `git grep -ln 'claude/standards' -- . ':!*.md'`: the readers
|
|
42
|
+
|
|
43
|
+
The extension is the split. Markdown cites the tree and a session reads the citation. A hook, a script, or a config opens a file under it at run time, and dropping the tree under one leaves a check whose input is gone reporting success. Two of the five targets in the 2026-08-28 census carried a reader, one of them a hook hand-parsing a standard for a banned-word set.
|
|
44
|
+
|
|
45
|
+
Report each reader with what replaces it. A reader parsing a standard for a list the CLI now ships reads that list through the verb instead, which is `aitk markdown audit <file> --json` for the banned-word case.
|
|
46
|
+
|
|
47
|
+
When `pwd` is not a git work tree, say the reader search did not run rather than reporting no reader.
|
|
48
|
+
|
|
49
|
+
## Step 4: give every citation one target
|
|
50
|
+
|
|
51
|
+
Every citation repoints to `aitk standards <name>`, whatever surface it sits on. One form rather than a choice per surface, which is the part a session gets wrong:
|
|
52
|
+
|
|
53
|
+
- A rule under `.claude/rules/` is markdown a glob match loads, so `${CLAUDE_SKILL_DIR}` expands to nothing there
|
|
54
|
+
- A project-local skill under `.claude/skills/<name>/` expands that variable to its own folder, so `${CLAUDE_SKILL_DIR}/../../standards/` resolves back into the tree being dropped
|
|
55
|
+
- `CLAUDE.md` and a context entry expand no variable at all
|
|
56
|
+
|
|
57
|
+
The plugin-root form belongs to a skill the toolkit ships beside its own corpus. Proposing it inside a target writes a path that resolves to the deleted tree.
|
|
58
|
+
|
|
59
|
+
A citation naming a name Step 2 left unmatched carries no target. Report it under what the user supplies.
|
|
60
|
+
|
|
61
|
+
## Step 5: output the ordered proposal
|
|
62
|
+
|
|
63
|
+
The order is fixed and the reverse is the failure. Deleting before the sync lands the installed rules citing a path that is gone, and sweeping before the sync repoints citations the sync then rewrites. The sweep re-reads after the sync for that reason, since the sync fixes the rules it installed and leaves a project's own rules and prose alone.
|
|
64
|
+
|
|
65
|
+
Take the drop command from whether the tree is tracked, read with `git ls-files .claude/standards`. A tracked tree goes out through `git rm -r` so the index moves with the files, and an untracked one through `rm -rf`. A tree holding both needs both commands, since `git rm -r` takes the tracked files, exits zero, and leaves every untracked one where it was.
|
|
66
|
+
|
|
67
|
+
Print the blocks below, omitting any that is empty.
|
|
68
|
+
|
|
69
|
+
````markdown
|
|
70
|
+
## Drop
|
|
71
|
+
|
|
72
|
+
`.claude/standards/` holds <n> files: <n> unchanged toolkit copies, <n> drifted, <n> matching no standard.
|
|
73
|
+
|
|
74
|
+
## Read before dropping
|
|
75
|
+
|
|
76
|
+
- `.claude/standards/<name>.md` drifted from the corpus copy. Confirm the project did not edit it.
|
|
77
|
+
|
|
78
|
+
## Keep
|
|
79
|
+
|
|
80
|
+
- `.claude/standards/<name>.md` matches no standard. Move it to `standards/<name>.md` at the project root, which `aitk standards <name>` resolves first.
|
|
81
|
+
|
|
82
|
+
## Runtime readers
|
|
83
|
+
|
|
84
|
+
- `.claude/hooks/<file>.sh` parses a standard at run time. Route it through `aitk markdown audit <file> --json` before the drop, or it reports a clean run having read nothing.
|
|
85
|
+
|
|
86
|
+
## Citations to repoint
|
|
87
|
+
|
|
88
|
+
- `CLAUDE.md:42` → `aitk standards markdown`
|
|
89
|
+
- `.claude/rules/core/<n>-<slug>.md:8` → `aitk standards skill`
|
|
90
|
+
|
|
91
|
+
## You supply
|
|
92
|
+
|
|
93
|
+
- The destination for the `prose` citations. It split into `markdown.md` plus the `write-human` skill, so no single name replaces it.
|
|
94
|
+
|
|
95
|
+
## Run in this order
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
aitk gov sync
|
|
99
|
+
git rm -r .claude/standards
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
Then re-read the citations and repoint what the sync left.
|
|
103
|
+
|
|
104
|
+
## Confirm
|
|
105
|
+
|
|
106
|
+
Run `aitk standards <name>` from inside this project for every name the repointed citations carry, and confirm each resolves.
|
|
107
|
+
|
|
108
|
+
## Reminder
|
|
109
|
+
|
|
110
|
+
Nothing above was written or run. The tree holds files a delete cannot recover, so the drop and the sweep are yours to apply.
|
|
111
|
+
````
|
|
112
|
+
|
|
113
|
+
Run nothing and write nothing: not the sync, not a delete or a move under `.claude/standards/`, not a citation rewrite. The install stamp is out of scope too, and travels with whatever else reaches this target. The user applies the move after reviewing it.
|
package/docs/ai-workflow.md
CHANGED
|
@@ -259,14 +259,15 @@ This section is the corpus the coverage claim is measured against: every name `a
|
|
|
259
259
|
|
|
260
260
|
### Keep the project current with the toolkit
|
|
261
261
|
|
|
262
|
-
| Skill
|
|
263
|
-
|
|
|
264
|
-
| `aitk:claude-seed-sync`
|
|
265
|
-
| `aitk:migration-claude-md`
|
|
266
|
-
| `aitk:migration-context`
|
|
267
|
-
| `aitk:migration-superseded`
|
|
268
|
-
| `aitk:
|
|
269
|
-
| `aitk:toolkit-
|
|
262
|
+
| Skill | When to use |
|
|
263
|
+
| ------------------------------- | ---------------------------------------------------------------------------------- |
|
|
264
|
+
| `aitk:claude-seed-sync` | After a toolkit update, to reconcile installed seeds without losing customizations |
|
|
265
|
+
| `aitk:migration-claude-md` | When `CLAUDE.md` grew past what always-load context should carry |
|
|
266
|
+
| `aitk:migration-context` | When `docs/` holds agent-flavored files belonging in `.claude/context/` |
|
|
267
|
+
| `aitk:migration-superseded` | When a drift report names a `.claude/` file a folder has replaced |
|
|
268
|
+
| `aitk:migration-standards-drop` | When the project still holds an installed `.claude/standards/` tree |
|
|
269
|
+
| `aitk:toolkit-feedback` | When something in the toolkit is broken, missing, or off |
|
|
270
|
+
| `aitk:toolkit-triage` | In the toolkit repo, to work through the open feedback issues |
|
|
270
271
|
|
|
271
272
|
### Generate an artifact on demand
|
|
272
273
|
|
package/package.json
CHANGED
|
@@ -45,6 +45,11 @@ export const SETUP_CASES: readonly SkillCase[] = [
|
|
|
45
45
|
'This file was replaced by a folder, help me split its content into it.',
|
|
46
46
|
expect: 'migration-superseded',
|
|
47
47
|
},
|
|
48
|
+
{
|
|
49
|
+
prompt:
|
|
50
|
+
'This project still carries a copy of the standards folder, get rid of it and point everything at the CLI.',
|
|
51
|
+
expect: 'migration-standards-drop',
|
|
52
|
+
},
|
|
48
53
|
{
|
|
49
54
|
prompt:
|
|
50
55
|
"Before I run this sync, tell me exactly what it's going to overwrite.",
|