@skitterbyte/skitterspec 16.3.0 → 16.3.2
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/MIGRATION.md +136 -0
- package/package.json +1 -1
package/MIGRATION.md
CHANGED
|
@@ -1,5 +1,68 @@
|
|
|
1
1
|
# Migration guide
|
|
2
2
|
|
|
3
|
+
## `@skitterbyte/skitterspec-linear` v9 → v10 (`push` validates your issue states)
|
|
4
|
+
|
|
5
|
+
**`spec-sync push` now refuses to run until the configured `states` names have
|
|
6
|
+
been checked against your Linear workspace.** The check itself is not new — it
|
|
7
|
+
already existed on `spec-sync status --workspace-states` — but it was advisory,
|
|
8
|
+
and skipping it sent a state name Linear **silently ignores**: the description
|
|
9
|
+
lands, the issue never moves, and nothing errors. The base
|
|
10
|
+
`@skitterbyte/skitterspec` is unaffected.
|
|
11
|
+
|
|
12
|
+
### Breaking change
|
|
13
|
+
|
|
14
|
+
| | v9 | v10 |
|
|
15
|
+
|---|-----|-----|
|
|
16
|
+
| `spec-sync push <spec>` | runs | **exits 1** unless `--workspace-states <file>` or `--skip-state-check` is passed |
|
|
17
|
+
| A configured state absent from the workspace | pushed, silently no-op | **exits 1**, naming the workspace's real states |
|
|
18
|
+
|
|
19
|
+
`/spec-push` handles this for you — it fetches the workspace's issue
|
|
20
|
+
workflow-state names over MCP and passes them on. **Nothing changes if you drive
|
|
21
|
+
sync through the skill.** Only a direct CLI caller needs updating.
|
|
22
|
+
|
|
23
|
+
### What to do
|
|
24
|
+
|
|
25
|
+
1. **Using `/spec-push`?** Nothing. Run `update` and carry on.
|
|
26
|
+
2. **Calling `spec-sync push` from CI or a script?** Supply the workspace's issue
|
|
27
|
+
workflow-state names as a JSON array and pass the file:
|
|
28
|
+
|
|
29
|
+
```sh
|
|
30
|
+
# names come from your Linear workspace, e.g. via the MCP server or the API
|
|
31
|
+
echo '["Backlog","Todo","In Progress","Done","Canceled"]' > states.json
|
|
32
|
+
skitterspec spec-sync push my-spec --workspace-states states.json --json
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Or opt out deliberately with `--skip-state-check`. Don't reach for it to get
|
|
36
|
+
past a *failing* check — that check is the only thing standing between you and
|
|
37
|
+
a push that moves nothing.
|
|
38
|
+
3. **If the check refuses,** it tells you what your workspace actually has and,
|
|
39
|
+
where the lifecycle bucket makes it unambiguous, which name to use:
|
|
40
|
+
|
|
41
|
+
```
|
|
42
|
+
spec-sync push: refusing — configured state name(s) not in the workspace
|
|
43
|
+
|
|
44
|
+
states.complete: "Done" is not an issue state in this workspace
|
|
45
|
+
use "Completed" instead
|
|
46
|
+
|
|
47
|
+
available: Backlog, Todo, In Progress, Completed, Canceled
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
Fix `specs/.core/linear.config.json` → `states`. `/spec-push` will offer to
|
|
51
|
+
apply the fix for you.
|
|
52
|
+
|
|
53
|
+
### Also in v10 (not breaking)
|
|
54
|
+
|
|
55
|
+
- **A pre-9.0 mirror is detected before it can be orphaned.** A spec still
|
|
56
|
+
carrying `linear_project_id` / `linear_milestone_id` reads as unlinked to v9+,
|
|
57
|
+
so `push` would emit an all-creates plan and abandon the live mirror. The plan
|
|
58
|
+
now carries a `legacy` field naming how many objects that would strand, and
|
|
59
|
+
`/spec-push` stops. **If you skipped the v8 → v9 migration below, read it now** —
|
|
60
|
+
this is the guard that catches you, not a substitute for it.
|
|
61
|
+
- **`update` says what it skipped** — each `customized (kept)` file now reports
|
|
62
|
+
`+added −removed`, with `--diff` to see the upstream changes you declined.
|
|
63
|
+
- **This guide now ships inside the package** (it wasn't in the published tarball
|
|
64
|
+
before v10 — `files` listed only `bin`/`src`/`assets`).
|
|
65
|
+
|
|
3
66
|
## `@skitterbyte/skitterspec-linear` v8 → v9 (a spec is an Issue, phases are sub-issues)
|
|
4
67
|
|
|
5
68
|
**v9 remaps the Linear mirror.** A spec is now a Linear **issue** (not a Project),
|
|
@@ -48,6 +111,79 @@ phase**. The base `@skitterbyte/skitterspec` is unaffected (still v15).
|
|
|
48
111
|
5. **Task-level issues** created under v8 are no longer managed by the sync —
|
|
49
112
|
close or repurpose them in Linear by hand.
|
|
50
113
|
|
|
114
|
+
## `@skitterbyte/skitterspec-linear` v7 → v8 (sync goes one-way; `/spec-pull` removed)
|
|
115
|
+
|
|
116
|
+
**v8 made sync one-way.** The repo became the sole source of truth and Linear a
|
|
117
|
+
**generated mirror**: content is pushed up, never read back or merged. The
|
|
118
|
+
three-way merge engine and everything that fed it were retired.
|
|
119
|
+
|
|
120
|
+
### Breaking changes
|
|
121
|
+
|
|
122
|
+
| Area | v7 | v8 |
|
|
123
|
+
|------|-----|-----|
|
|
124
|
+
| Skills | `/spec-status`, `/spec-push`, **`/spec-pull`** | `/spec-status`, `/spec-push` |
|
|
125
|
+
| `spec-sync` subcommands | `normalize`, `push`, `status`, **`pull`** | `normalize`, `push`, `status`, **`record`** |
|
|
126
|
+
| Sidecar | a three-way merge base | the **last-pushed snapshot** (`record` writes it) |
|
|
127
|
+
| `sync.fieldOwnership` | `pull` / `both` values were load-bearing | still parsed; nothing is pulled |
|
|
128
|
+
|
|
129
|
+
### What to do
|
|
130
|
+
|
|
131
|
+
1. **Drop `/spec-pull` from any workflow that calls it.** There is no
|
|
132
|
+
replacement: editing the mirror in Linear is no longer an input. A person
|
|
133
|
+
editing the issue will see it overwritten by the next push.
|
|
134
|
+
2. **Replace `spec-sync pull` in scripts with `spec-sync record`** — it writes the
|
|
135
|
+
snapshot from the current repo files after a push is applied.
|
|
136
|
+
3. **Delete stale merge-base sidecars** under `sync.baseDir`; the first push after
|
|
137
|
+
upgrading writes the new snapshot format.
|
|
138
|
+
|
|
139
|
+
## `@skitterbyte/skitterspec-linear` v1 → v7 (no breaking changes)
|
|
140
|
+
|
|
141
|
+
Every major in this range was a **routine version bump**, not a breaking
|
|
142
|
+
contract. The skills (`/spec-status`, `/spec-push`, `/spec-pull`) and the
|
|
143
|
+
`spec-sync` subcommands (`normalize`, `push`, `pull`, `status`) were identical at
|
|
144
|
+
v1 and at v7. Upgrading anywhere inside this range needs **no action** beyond
|
|
145
|
+
re-running `update`.
|
|
146
|
+
|
|
147
|
+
One thing did change quietly, at **v4**: `sync.fieldOwnership` lost its
|
|
148
|
+
`milestones`, `phaseBodies`, `acceptanceCriteria` and `taskBreakdown` entries when
|
|
149
|
+
that detail moved inside `description`. A config still listing them does not
|
|
150
|
+
error — unknown keys merge in and *join the compared set* — so remove them if
|
|
151
|
+
you have them, or they will be compared against fields that no longer exist.
|
|
152
|
+
|
|
153
|
+
## `@skitterbyte/skitterspec` v3 → v16 (no breaking changes)
|
|
154
|
+
|
|
155
|
+
**Nothing in this range requires action.** Thirteen majors sounds like thirteen
|
|
156
|
+
migrations; it was one habit. Every release in this period was cut as a major
|
|
157
|
+
bump regardless of size (see `RELEASING.md`), and the base package's contract
|
|
158
|
+
never broke: **no skill was ever removed and no CLI flag was ever removed** — the
|
|
159
|
+
surface only grew. The spec folder layout
|
|
160
|
+
(`.core`/`backlog`/`in-progress`/`complete`/`cancelled`) is unchanged throughout.
|
|
161
|
+
|
|
162
|
+
The `feat(sync)!` commits that appear in this window changed
|
|
163
|
+
`@skitterbyte/skitterspec-linear`, which ships separately; the base was bumped
|
|
164
|
+
alongside it in lockstep. If you are on the **superset**, read the provider
|
|
165
|
+
entries above — those are the ones with work in them.
|
|
166
|
+
|
|
167
|
+
What each major actually added, so you can see what you gain by upgrading:
|
|
168
|
+
|
|
169
|
+
| Major | What landed |
|
|
170
|
+
|-------|-------------|
|
|
171
|
+
| v4 | `setup` commands bootstrap a fresh worktree's dependencies |
|
|
172
|
+
| v5, v6 | version bumps only |
|
|
173
|
+
| v7 | release docs refreshed; stale scripts dropped |
|
|
174
|
+
| v8 | version bump only |
|
|
175
|
+
| v9 | released alongside the provider's Linear body round-trip |
|
|
176
|
+
| v10, v11 | version bumps only |
|
|
177
|
+
| v12 | install manifest + `update --resync` / `--reset`; **`/spec-live`** overlay |
|
|
178
|
+
| v13 | **`/spec-hotfix`**, **`/spec-to-main`**, `spec-env prune` for orphaned test DBs |
|
|
179
|
+
| v14 | **Impact map** in the spec templates; live-aware `/spec-go`; the docs site |
|
|
180
|
+
| v15 | released alongside the provider's one-way sync switch |
|
|
181
|
+
| v16 | spec `Name:` handle; `/spec-complete` · `/spec-cancel` commit their own edits |
|
|
182
|
+
|
|
183
|
+
**Spec files written under an older version still read.** The template grew
|
|
184
|
+
(the Impact map at v14, the `Name:` header at v16) but the lifecycle skills treat
|
|
185
|
+
both as optional — `/spec-review` adds them if you want them.
|
|
186
|
+
|
|
51
187
|
## `@skitterbyte/skitterspec` v2 → v3 (slimmer surface + local traffic diversion)
|
|
52
188
|
|
|
53
189
|
**v3 shrinks the everyday command surface to five verbs — `spec → go → connect →
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@skitterbyte/skitterspec",
|
|
3
|
-
"version": "16.3.
|
|
3
|
+
"version": "16.3.2",
|
|
4
4
|
"description": "Spec-driven development for Claude Code — a tracker-free filesystem workflow: lifecycle skills and per-spec isolation. For Linear sync, install @skitterbyte/skitterspec-linear instead.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"claude",
|