@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.
Files changed (2) hide show
  1. package/MIGRATION.md +136 -0
  2. 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.0",
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",