squad-kit 1.2.2 → 1.3.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.
Files changed (25) hide show
  1. package/README.md +6 -4
  2. package/SECURITY.md +10 -1
  3. package/dist/cli.js +1102 -46394
  4. package/dist/console-ui/assets/index-BhhlRfJM.js +669 -0
  5. package/dist/console-ui/assets/index-DqDPMvqu.css +1 -0
  6. package/dist/console-ui/index.html +2 -2
  7. package/package.json +1 -2
  8. package/CHANGELOG.md +0 -1204
  9. package/dist/console-ui/assets/index-CzFTrbcF.js +0 -637
  10. package/dist/console-ui/assets/index-kEkCko25.css +0 -1
  11. package/dist/console-ui/assets/jetbrains-mono-cyrillic-400-normal-BEIGL1Tu.woff2 +0 -0
  12. package/dist/console-ui/assets/jetbrains-mono-cyrillic-500-normal-DmUKJPL_.woff2 +0 -0
  13. package/dist/console-ui/assets/jetbrains-mono-cyrillic-600-normal-EVf6-Yzo.woff2 +0 -0
  14. package/dist/console-ui/assets/jetbrains-mono-cyrillic-ext-400-normal-C_uLvvQ5.woff2 +0 -0
  15. package/dist/console-ui/assets/jetbrains-mono-cyrillic-ext-500-normal-C9ShMxGR.woff2 +0 -0
  16. package/dist/console-ui/assets/jetbrains-mono-cyrillic-ext-600-normal-Dj6eZy5f.woff2 +0 -0
  17. package/dist/console-ui/assets/jetbrains-mono-greek-400-normal-C190GLew.woff2 +0 -0
  18. package/dist/console-ui/assets/jetbrains-mono-greek-500-normal-JpySY46c.woff2 +0 -0
  19. package/dist/console-ui/assets/jetbrains-mono-greek-600-normal-H7WoG9Et.woff2 +0 -0
  20. package/dist/console-ui/assets/jetbrains-mono-latin-ext-400-normal-Bc8Ftmh3.woff2 +0 -0
  21. package/dist/console-ui/assets/jetbrains-mono-latin-ext-500-normal-Cut-4mMH.woff2 +0 -0
  22. package/dist/console-ui/assets/jetbrains-mono-latin-ext-600-normal-BfB_LPfz.woff2 +0 -0
  23. package/dist/console-ui/assets/jetbrains-mono-vietnamese-400-normal-ByoDsISC.woff2 +0 -0
  24. package/dist/console-ui/assets/jetbrains-mono-vietnamese-500-normal-BvH7FW2L.woff2 +0 -0
  25. package/dist/console-ui/assets/jetbrains-mono-vietnamese-600-normal-Dtizs43-.woff2 +0 -0
package/CHANGELOG.md DELETED
@@ -1,1204 +0,0 @@
1
- # Changelog
2
-
3
- All notable changes to this project are documented here.
4
-
5
- The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
- and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
-
8
- ## [Unreleased]
9
-
10
- ## [1.2.2] — 2026-11-05
11
-
12
- A patch about the guard. It closes what a review of 1.2.1 found open, moves commit hooks to a throwaway git folder, and says
13
- plainly what the guard is and is not. Nothing changes in how you work with the squad.
14
-
15
- ### What the guard promises
16
-
17
- - **1.2.1 and earlier promised too much.** The guard stops accidents and most bad behaviour, but it is not a wall against
18
- code built on purpose to break out. `SECURITY.md` now says what it stops and what it does not. Use squad-kit on projects and
19
- tickets you trust, read what the Builder changes, and use squad-kit's sign-ins, not keys exported in a shell.
20
- - **It closes more.** A command can no longer move its copy or the folders above git's own. It can no longer write in
21
- all of `~/.cache` or `~/Library/Caches`, where your own tools run programs from. On a Mac it can no longer signal other
22
- programs, or swap the guard's rules for a later command. A `.env` in your own checkout stays hidden, and so do sockets
23
- under `~/.ssh` and `~/.gnupg` and the keys into a runtime's virtual machine. On Linux the guard ran for real for the first
24
- time: a `.env` is hidden 3 folders down, and a socket behind `/var/run` no longer stops every command.
25
- - **A project's own browsers still work.** Playwright gets a folder with the copy, with the browsers this computer has already
26
- linked in, so `playwright install` no longer waits on a read-only folder. Puppeteer and Electron download to the copy's
27
- cache. On a Mac, Puppeteer's Chrome needs `args: ['--no-sandbox']`, as it did before: its own sandbox cannot start inside
28
- the guard. Cypress gets a card until an engineer allows its folder.
29
-
30
- ### The guard and Docker
31
-
32
- - **The project's own commands can no longer reach Docker.** In 1.2.0 and 1.2.1, a command in the guard could connect to
33
- Docker's socket, start a container with a hidden folder mounted in it, and read what the guard hides. Now the sockets of
34
- Docker Desktop, colima, lima, Rancher Desktop, OrbStack, Finch and Podman are refused, and on a Mac so is Docker's own
35
- port on this computer. On Linux that port stays open.
36
- - **A project whose tests talk to Docker directly now gets a refusal** until a person allows it. The card says Docker is
37
- not open to the project's own commands, in a check, a setup or an app's start, and an engineer can allow its socket's
38
- folder in Settings.
39
-
40
- ### The project's commit hooks
41
-
42
- - **They run on a throwaway git folder.** squad-kit makes it outside the project for each run, and on Mac and Linux the real
43
- git folder is now read only to them, all of it. Only the files in the copy and the commit's words come back, and
44
- squad-kit stages the files itself and makes the real commit from those. So **what a hook staged counts for nothing**: a
45
- file it force-adds stays out if git ignores it, a file it takes out of the commit goes back in, and a report file it
46
- leaves goes in.
47
- - **The limits 1.2.1 listed are gone.** A hook sees your branch by its real name, not a stand-in's. lint-staged's backup
48
- stays out of your `git stash list`, even when a Stop cuts it off. A hook can no longer change a file in git's store of
49
- objects.
50
- - **A Stop, a hook that runs out of time and a crash** put the files back as they were staged and remove new ones. What was
51
- on disk then is kept in `refs/squad/on-disk/<ticket>`, so no work is lost half-way through a formatter.
52
- - **A hook's folder has only the repo's filters of its settings.** A hook that needs a remote, or fetches, gets the usual card
53
- with **Save without this check**.
54
- - **What a hook leaves in its group ends when the commit does**, or at the next start after a crash.
55
- - **A hook's "no" on a merge being finished holds.** Try again runs the hook again, instead of passing it by.
56
-
57
- ## [1.2.1] — 2026-11-05
58
-
59
- A patch about not losing work and never reaching a dead end. It also moves the project's commit hooks into the guard.
60
- Nothing changes in how you work with the squad.
61
-
62
- ### What you type stays
63
-
64
- - **Text you type survives** a reload, a closed tab or a dialog closed by mistake: answers, comments, new tickets, bugs
65
- and the BRD box are kept for each project, ticket and field, and cleared once sent.
66
- - **Skip** asks first. Dialogs with files in them ask before closing. Enter works in an **Other** answer.
67
-
68
- ### When something goes wrong
69
-
70
- - **The app going down shows at once.** Within 5 seconds a banner sits over every page, nothing pulses as if it were
71
- still working, and the banner goes by itself when the app is back. An update that does not come back gets it after 2
72
- minutes.
73
- - **One error no longer takes the app down.** Each squad turn is guarded, and an error in the screens shows a page with
74
- a way back. A full disk or a moved folder holds that project with one banner, and it carries on by itself.
75
- - **A network blip waits and tries again**, 4 times over about 15 minutes, and never lowers the model level. A merge cut
76
- off by a blip is tried again too.
77
- - **A moved folder is found.** The story copies' links are repaired when the squad starts, at **Looks right** and when a
78
- step opens a copy. Home follows a folder moved while the app runs.
79
- - **A refused release has a way out.** A teammate's push is merged and sent, never forced. A real clash gets the clash
80
- card, and a protected main gets plain words and an engineer's steps.
81
- - **It reached it another way**: a new button on the Releases page, for a release merged by hand. It needs a reason and
82
- looks on the remote first. If the release is not there, it warns and asks a second time. Terminal:
83
- `squad release --mark-sent --reason "…" [--anyway]`. `squad release` also takes the version with or without the `v`.
84
- - **Take it**: a new button on a ticket whose owner cannot work on it. Terminal: `squad take-back <ticket> --reason "…"`.
85
- - **A ticket is never overwritten** by another with the same id, and new ids skip the ones already pushed.
86
- - **The home folder is refused** by `squad init`, setup and the first commit, and a leftover `~/.squad` is ignored.
87
- - **The link lasts across tabs.** With no key in the link, the page says to run `squad`.
88
- - **Stop and closing the board** end a running hook, and closing takes seconds. `squad | tee` stops cleanly, and a run
89
- whose output goes to files keeps running when its terminal closes.
90
- - **An agent's tool calls** no longer fail with a dropped connection after 5 quiet seconds.
91
-
92
- ### The project's commit hooks
93
-
94
- - **They run once, when a change is saved, in the guard, on a stand-in branch.** A hook cannot move a real branch, plant
95
- a hook or change a git setting. The real commit is made after, outside the guard, with your signature if your git
96
- signs. A crash or a failed signature no longer moves a branch or leaves an unsigned commit.
97
- - **Every refusal gets a card**: **Let the Builder fix it**, **Fix it yourself**, **Try the save again**, or **Save
98
- without this check**. Saving without it needs a reason, which stays on the ticket, the pull request and the release
99
- notes. Builds by itself never skips a hook.
100
- - **Refused code cannot slip through.** Work saved past a refusal is checked whole at **Looks right**, and the branch
101
- goes back as it was if the hook still says no.
102
- - **The Builder cannot change the check to pass it.** Hook files, their settings and their `package.json` keys go back,
103
- with one plain line. What a hook calls, like lint rules and tests, stays the Builder's, and the Reviewer reads it.
104
- - **husky 9 now runs in a story's copy.** Before, its hooks silently never ran there.
105
- - **squad-kit runs no other hook**: no `pre-push`, `post-merge` or `post-checkout`, since the project's own checks have
106
- run by then. Your own terminal still runs them. Git LFS files still upload when squad-kit pushes.
107
- - **A hook folder with a common name** (`hooks`) no longer costs you work in `src/hooks`. `npx` works in a hook with no
108
- packages installed.
109
-
110
- ### Security
111
-
112
- - **`.git` and git's own folder are read only** for the project's commands and for agents.
113
- - **squad-kit's own git starts nothing a repo names by itself**: no file monitor, no diff program, and nothing from a
114
- nested repo, which also stays out of commits.
115
- - **The app answers only at its own address.** Host and Origin are checked on every route, a key in the link works for
116
- reads only, and HTML and SVG from a project download instead of opening at the board's address.
117
-
118
- ### Known limits
119
-
120
- - **A hook built to do harm could change a file in git's store of objects.** A project with no commit hooks is not
121
- affected. The next patch closes this by running hooks in a throwaway git folder. See [SECURITY.md](SECURITY.md).
122
- - A hook that reads the branch name sees the stand-in, `squad/saving/<branch>/now`. A strict one says no, and you get
123
- the card.
124
- - Setup in your own checkout no longer installs husky's hooks. On a fresh clone they stay off until you install them.
125
- - Stop in the middle of lint-staged leaves its backup in `git stash list`. Your work is safe.
126
-
127
- ## [1.2.0] — 2026-11-05
128
-
129
- squad-kit 1.2 is about trust: squad-kit shows that it understands your project, says what the work really cost, and
130
- makes the squad's work harder to fake. It also takes a whole requirements document and builds it, story by story.
131
- Windows is less protected and not fully tested yet (see What's safer).
132
-
133
- ### What's new
134
-
135
- #### From a BRD to a built product
136
-
137
- - **A new Requirements page** (after Overview). **Add a BRD**: a PDF, Word or Markdown file, or pasted text, with
138
- mockups if you have them. The Analyst reads it live and asks only about what is **missing in the BRD** or where
139
- **two parts clash**. Then it writes epics, features and stories, each with its checks (Given, When, Then), size,
140
- needs and its place in the document.
141
- - **Review it as a tree or a map.** Rename, rewrite, move, add or remove any part, or ask the Analyst to redo one.
142
- An estimate from this project's own tickets: "20 stories, about $140 and 6 hours, 2 at a time". Nothing is built
143
- or sent before **Approve breakdown**.
144
- - **Send to Azure DevOps**: epics, features and stories with parent and dependency links, into the backlog. **Send
145
- changes** updates only what changed. squad-kit never deletes there, and a cut-off send makes no doubles.
146
- - **Build continuously**: each story becomes a ticket on the new **Builds by itself** track, in the order its needs
147
- allow, within the parallel limit and the budgets. No questions, the plan is approved by itself, small choices are
148
- listed under **Decided for you** (press **Change** on any), and it merges by itself once the checks, the review
149
- and the screenshots pass. It stops only for a gap, a clash or a failed check, and then only that story and the
150
- ones that need it wait. Releases stay your button.
151
- - Terminal: `squad requirements add|show|answer|edit|move|approve|send|build|start|…`, `squad decided`. See
152
- [From a BRD to a built product](docs/requirements.md).
153
-
154
- #### Proof you can read
155
-
156
- - **squad-kit takes the screenshots itself, with its own browser.** The Tester says which pages, steps and sizes.
157
- squad-kit opens the story's own copy of the app, does the steps and takes the pictures.
158
- - **One or more pictures for each "done when"**: one per part or case, up to 6.
159
- - **Each "done when" gets a verdict**, from the Tester and squad-kit's own check of all its pictures together:
160
- **Met**, **Not working yet** (a picture shows it does not work), **Not shown yet** (the pictures do not show it
161
- clearly) or **Not on a screen** (it cannot be shown at all, like an email or what happens after a restart). Not
162
- working yet goes back to the Builder once, then it is a plain stop. Not shown yet goes back to the Tester up to 2
163
- more times, keeps the good pictures and never reaches the Builder. Not on a screen keeps its reason and does not
164
- stop the story, unless every "done when" ends that way.
165
- - **Also changed, not in the plan**: what the change touches beyond its plan, in the Reviewer's words. It never
166
- blocks. You see it at your check, on a stop, on the ticket and in the release notes.
167
-
168
- #### Your turn
169
-
170
- - **Where to look**: each page the proof names, with the "done when" it shows.
171
- - **Try it yourself**: runs the story's own copy of the app, with the change in it and nothing merged, so you can
172
- click through it before **Looks right**. It stops by itself when the story moves on. Terminal: `squad try <ticket>`.
173
- - **Ask a question** on every story, in every state: working, in the queue, waiting for another story, stopped, at
174
- review, taken over or released. Whoever knows the story best answers: the Analyst before the build, the Builder
175
- during and after it, the Tester once there are screenshots. It answers questions only, and the story stays exactly
176
- where it is. Terminal: `squad chat <ticket> --ask`.
177
-
178
- #### First run and Overview
179
-
180
- - **Add project says what it found** (code with or without git, an empty folder, several repos, an older
181
- squad-kit) and what happens next, before you confirm.
182
- - **A setup page with live steps**: project memory, the AI tool, the Architect reading the code, how to test and run
183
- it, trying the tests, opening the app once with a screenshot, and your overview. Each step has its time; a failure
184
- has a way out and never stops the setup. **Notify me when it is ready**. Quality is asked once here.
185
- - **The Overview page**, first in the sidebar: what the project is, who uses it, what it can do today, how its parts
186
- fit together, things worth knowing, the rules found, the proof, and three ideas for a first ticket. It stays up to
187
- date after every merged ticket.
188
- - **The rules the Architect found are proposals until you approve them** with **Looks right, start working**. They
189
- used to be saved as approved without being shown. **Something is wrong** opens a talk with the Architect.
190
- - **An empty project asks "What do you want to build?"**, in your own words, in English or Arabic. The Architect
191
- writes down what you want with first stories for it, and picks the technology itself when your first story is
192
- planned. Terminal: `squad overview --build "what you want"`.
193
- - **squad-kit finds the commands of a project that started empty.** After the first build it reads how to test and
194
- run the project from its files, and saves that. Nobody is asked.
195
- - Terminal: `squad setup`, `squad overview`, `squad demo --first-run`.
196
-
197
- #### Conversation and Cost
198
-
199
- - **Conversation opens on "What happened"**: one card per step with its time, a one-line summary and what it handed
200
- in, drawn as the real thing. **Full log** keeps the detail, in plain words, with **Open it in Claude Code**.
201
- - **Cost follows how you pay.** On a subscription: "Included in your Claude plan. No extra charge.", the size of the
202
- work and where it went, with the API-price figure shown as a value, not a bill. With an API key: real dollars, a
203
- budget per ticket and per month, a warning at 80% and a pause at 100%.
204
- - **Averages per Quality setting** (cost and squad time per accepted ticket) on the Squad and AI page.
205
- - Terminal: `squad cost`, `squad config set payment`, `squad config set budget`.
206
-
207
- #### Tickets that depend on each other
208
-
209
- - **The Analyst and the Architect see the other open tickets** and the files they change.
210
- - **A design can depend on another ticket.** The ticket then waits before building: **Build on its branch**, **Build
211
- anyway**, or **Wait** (it starts by itself when the other one merges). Terminal: `squad depends`, `squad build`.
212
- - **Bring in latest main** is a button on a ticket being built (`squad bring-in`).
213
-
214
- #### Releases
215
-
216
- - **Take a ticket out of the next release** before you release it (`squad release --without`).
217
- - **Released tickets' branches are cleaned up** on this computer, and on the remote when you ask (`squad branches`).
218
- A branch with unmerged work is never deleted.
219
- - **A release cut off by a restart finishes or rolls back** cleanly on the next start.
220
-
221
- #### Also
222
-
223
- - **The ticket can go full width** (the button next to Close; remembered in this browser). **Hand over** and
224
- **Propose a change** moved to the ⋯ menu, and Propose a change is also on the ticket's bottom bar, so the header is
225
- one row at any width.
226
- - **The Waiting for you banner is one slim, calm row**, and stays readable beside a docked chat.
227
- - **The update banner shows what is new in every release since your version**, and **Check for updates** reads the
228
- notes again.
229
- - **Free the port and try again** on a stuck Tester step, for programs squad-kit itself started.
230
-
231
- ### What's safer
232
-
233
- - **Agents get fixed tools, "the window"**: `take_screenshots`, `look_at_page`, `start_app`, `stop_app`, `app_status`,
234
- `run_checks` and `i_am_stuck`. An agent fills in the fields, squad-kit checks them, does the job itself and hands
235
- back the result. There is no free command: only this story's app on this computer, only the project's saved
236
- commands, only what squad-kit started. A request outside that is refused and written in the activity, and three
237
- refusals in one step stop the agent.
238
- - **`i_am_stuck`**: when something technical is in an agent's way, squad-kit tries its own fixes (its browser, a free
239
- port, starting the app again) and writes one plain line. It is never a question to you.
240
- - **Technical questions never reach you.** squad-kit reads each question an agent asks, with its choices and
241
- everything shown with it, and does not trust the agent's label. A question about ports, commands, files or settings
242
- goes back to the agent to decide. An agent that keeps asking stops in plain words. When another program holds a
243
- port and going around it did not work, you get one plain card with no port in it: **Stop it** (with a confirm) or
244
- **Skip the browser tests**.
245
- - **Some asks are refused and logged.** Asking you to change squad-kit's settings or protected files, to hand over a
246
- password or a key, or to change git history never reaches you. One plain line goes in the activity. A reply in a
247
- chat that asks for any of these is left out too.
248
- - **A second guard for the project's own commands.** The tests, lint, build, setup, the app's start and the release
249
- pipeline run in squad-kit's own guard on Mac and Linux. They work normally, browser tests too, and can reach the
250
- network, but they can't read your keys, sign-ins, browser profiles, squad-kit's own folder or the `.env` files in
251
- your project folder. If a project truly needs a file outside its copy, one plain sentence says so, and an engineer
252
- can allow it in Settings or with `squad config set allow-read <path>` and `squad config set allow-write <path>`.
253
- `squad doctor` shows whether the guard runs here.
254
- - **Windows is less protected and not fully tested yet.** There, the agents' own commands and the project's own
255
- commands have no guard, so they can reach other files on the computer. Use it on projects you trust. Settings and
256
- the Squad and AI page say "Windows: less protected".
257
- - **"Not checked" instead of a green pass** when a project has no tests. You are asked once per project, with the
258
- Architect's suggested test command. A project without tests also checks that the app starts.
259
- - **Weakened tests stop the ticket**: deleted tests, fewer tests, a changed test setup, or new skip/only markers, in
260
- the common languages. **Continue anyway** needs a reason that stays on the record.
261
- - **Proof is verified**: each screenshot must be a real image taken in this step, and "after" must differ from
262
- "before", unless the "done when" says the screen stays as it was.
263
- - **The Reviewer sees the whole change and the check results** in every round, not only the fix. In its review it can
264
- also look at a page of the app itself (`look_at_page`).
265
- - **A change to the test command is tried first.** squad-kit runs the new command and the current one in the ticket's
266
- copy, and keeps the new one only when it passes and runs at least as many tests. You choose only when it cannot
267
- tell. Terminal: `squad test-command <ticket> --use | --keep`.
268
- - **The Builder's and Tester's commands run in Claude Code's sandbox** where the computer allows it: they write only
269
- in the ticket's copy, its proof folder and a private package cache, can't read your keys, sign-ins or `.env`
270
- files, and reach only package registries and the websites you allow (Settings, `squad config set hosts`). A
271
- blocked command says what and why. `squad doctor` shows whether the sandbox runs here.
272
- - **Turn and spend caps per step** from the Quality setting. Reaching one keeps the work and offers **Give it more**
273
- or **Stop**.
274
- - **Every command squad-kit suggests you copy quotes your text safely**, on the board and in the terminal.
275
- - **zod 4, the AI SDK 5 and diff 8** for the 0.x planner commands. This closes the last high alert. The planner's
276
- file-read tool on the Claude Agent SDK path now works with ranged reads.
277
-
278
- ### What's fixed
279
-
280
- - **Plain stop messages.** A stop says what happened in squad-kit's own plain words, with **Try again**. A tool's raw
281
- error never reaches you: the exact words are in the ticket's Developer tab and the app log.
282
- - **A failed check runs once more** before anyone is sent to fix it, so a flaky test costs no Builder run. If it passes
283
- then, the activity and the Developer tab say "failed once, passed when run again". Not after a Stop, a command
284
- squad-kit had to end, or a file the guard blocked.
285
- - **The Builder is told about old failures**: the checks that already failed on the first run, before any story
286
- touched the code. It fixes what its story broke and leaves other screens alone. The checks must still pass.
287
- - **A clash no longer stops a story too soon on Builds by itself.** While main keeps moving, squad-kit brings it in
288
- again by itself, up to 3 times, with the checks, the review and the proof each time. If main has not moved, or after
289
- the third time, you get the clash card. Other tracks show the card at the first clash, as before.
290
- - **Apps move to a free port by themselves** when another program holds the usual one: Your apps, the story's own copy
291
- and Try it yourself. In Your apps this works when the start command or the app's code takes a port setting; if not,
292
- one plain sentence says what is in the way. `--next-port` on `squad app start` and `squad app restart` is still
293
- accepted, and now does nothing.
294
- - **squad-kit installs its own screenshot browser.** No `npx playwright`, and nothing to install by hand. The first
295
- time, one line says "Setting up squad-kit's screenshot browser. This happens only once."
296
- - **The step timer counts only running time.** It stands still while a ticket waits for you, for another story or for
297
- a free place, so "Taking longer than usual" no longer shows on a step that was only waiting.
298
- - **A restart is not a failure.** Restarting the board, Stop or the computer sleeping no longer counts as a failed
299
- try or raises the model's effort. The Builder carries on with the same step in the same conversation, instead of
300
- starting the work again, and the step's clock keeps its time ("resumed after a restart").
301
- - **Nothing is left behind.** When a step ends, on Stop, and when the board restarts or quits, squad-kit stops every
302
- program it started for the ticket, including test servers that left their process group. It finds them by where
303
- they run: inside squad-kit's own copy of the code, never your folders or Your apps.
304
- - **squad-kit clears its own leftovers before the checks** and says so in one activity line. If an agent asks about a
305
- busy port that squad-kit caused, squad-kit answers it and you never see the question.
306
- - **Desktop notices: Turn on always answers.** It says when the browser is asking, explains how to allow notices
307
- when the browser stays silent (for example in Arc), and sends one test notice.
308
- - **A ticket a teammate deleted** shows "Deleted by <owner>" with **Remove from my board**.
309
- - **A chat message sent during Claude's usage limit waits** and is answered when the squad carries on.
310
- - **On a phone**, the banners fold into one slim row while a ticket is open, and the website's docs pages fit.
311
-
312
- ## [1.1.1] — 2026-11-03
313
-
314
- A security update. Nothing changes in how squad-kit works.
315
-
316
- ### Security
317
-
318
- - **Packages with known security problems are updated.** The app's web server (hono 4.13, @hono/node-server 2), the
319
- parts of the MCP SDK's server it pulls in (proxy-addr, body-parser, qs, ip-address), @modelcontextprotocol/sdk
320
- 1.32, fast-uri and js-yaml; in the app's screens, seroval and js-yaml; and the test tools (vitest 4, vite 6).
321
- - **The website's build tools** move to Astro 7.
322
- - **Still open:** zod 3, used only by the 0.x planner commands (`squad new-plan` with an API key). Its fix needs
323
- zod 4, which those commands' AI library does not read yet. It is planned.
324
-
325
- ## [1.1.0] — 2026-11-03
326
-
327
- squad-kit 1.1 is about never wondering what the squad is doing, and always having a way out.
328
-
329
- ### Always know what is happening
330
-
331
- - **Every card says what is happening** in plain words: "Builder · step 3 of 6 · editing the booking page", how
332
- long it has run, and how long that step usually takes on this project. squad-kit learns the usual times from the
333
- project's own history. A ticket over the limit says "Next in line: starts when a slot is free".
334
- - **The Now tab** says in one sentence what happens now and what comes next. The stage tracker shows how long each
335
- stage took. Terminal: `squad status <ticket>`, and `squad show` prints the same.
336
- - **Ask about a ticket**: "is there a problem?", "when will it be ready?", "what is it doing?". Status questions are
337
- answered at once from the live record, in English or Arabic, at no AI cost. A question that would change the work
338
- offers Propose a change or a note, and says when the note will be read. Terminal: `squad ask <ticket> "..."`.
339
-
340
- ### Waiting for you, loud
341
-
342
- - **A banner on every page** when something needs you, with the button to press on each item.
343
- - **The browser tab shows the count**: "(2) roomflow".
344
- - **Desktop notices**, asked for once: one notice per new question, approval, proof or stop. No sound. Settings ›
345
- Desktop notices turns them on or off.
346
-
347
- ### Time limits you can see
348
-
349
- - **"Taking longer than usual"** past twice a step's usual time, with what it is doing, its last progress and when
350
- squad-kit stops it: **Give it 10 more minutes**, **Stop and try again**, **Stop**. Terminal:
351
- `squad wait <ticket> --more 10m`, `squad stop <ticket> --again`.
352
- - **"Looks stuck"** says what squad-kit checked, and keeps **End the stuck command**.
353
-
354
- ### Your apps
355
-
356
- - **Start, Open, Restart and Stop** your app from the sidebar. squad-kit runs it from its own copy of `main` (never
357
- your folder), brings the copy up to date first, copies your `.env` files into it, and says Running only when the
358
- address answers. **Show output**
359
- has the last lines.
360
- - **Run the new version** after Looks right.
361
- - **A busy port** gets a plain message, and the fix when there is one. No start command: **Ask the Architect to find
362
- it**, or **Type it**.
363
- - Terminal: `squad app start|stop|restart|status|set|find`.
364
-
365
- ### Delete and Archive
366
-
367
- - **Delete** a ticket that is not merged: squad-kit stops the squad on it, then removes its copy of the code, its
368
- branch, its files, its unmerged decisions, its chats and screenshots. The tracker item and the cost stay. A delete
369
- cut off half-way finishes with **Delete again**.
370
- - **Archive** a merged or released ticket to take it off the board; **Show archived** and **Unarchive** bring it
371
- back.
372
- - Terminal: `squad delete <ticket>`, `squad archive <ticket> [--undo]`, `squad board --archived`.
373
-
374
- ### When something goes wrong
375
-
376
- - **Every stop says what happened, what is safe, and the ways out** as buttons. The exact error is in the
377
- Developer tab and the app log.
378
- - **Claude's usage limit pauses the squad** for every project, shows when it resets, and carries on by itself from
379
- the same step, without counting a failed try. **Try now** carries on at once (`squad try-now`).
380
- - **Report a problem** saves one `.zip` to send for help: the ticket, its conversations, the last day of the app
381
- log and the versions. Never sign-ins, tokens or `.env` files. Terminal: `squad report [ticket]`.
382
- - **An app log** in `~/.squad-kit/logs/`, one file a day, kept 14 days. Terminal: `squad logs --tail`.
383
-
384
- ### Also
385
-
386
- - **On a phone**, the sidebar folds away behind a menu button, and the ticket drawer takes the whole screen.
387
- - **`squad inbox`** names a newer decision that changes a plan correctly (it said "Looks stuck").
388
- - **Copied terminal commands quote pasted text safely.** A note or answer with `$(…)`, backticks or a trailing `\`
389
- could run or break when the command beside its button was pasted into a terminal.
390
- - **Tracker text is decoded once.** A written `&amp;lt;` in a Jira or Azure DevOps item no longer turns into `<`.
391
- - **Security**: GitHub code scanning, secret scanning with push protection and Dependabot are on, the release
392
- workflow's Actions are pinned to exact versions, npm publishing runs only from release tags, and `SECURITY.md`
393
- describes 1.0. The issues code scanning found are fixed.
394
-
395
- ## [1.0.1] — 2026-11-03
396
-
397
- squad-kit 1.0.1 makes the squad steadier and easier to follow, from what we saw in the first trials. To get it
398
- from 1.0.0, run `squad upgrade` once. From now on the app updates itself with one button.
399
-
400
- ### Easier to follow
401
-
402
- - **"From an idea or message" works and shows its progress.** The dialog no longer disappears behind a blurred
403
- board. The Analyst works in the background with three steps and a clock, and you can press Cancel. You can
404
- close the window: the draft waits for you under New ticket.
405
- - **Errors stay on screen** until you close them.
406
- - **The Conversation tab reads in plain words.** "Handed in its answer" replaces the raw answer, and a command
407
- the step may not run shows in grey as skipped, not in red as a failure.
408
- - **A ticket waiting for a free place says so**: "Waiting for a free place", with the limit, instead of
409
- looking as if it runs.
410
- - **"Resumed after sleep"** shows when the computer slept in the middle of a step.
411
-
412
- ### The Update button
413
-
414
- - **The app looks for a new version** on start and once a day. When one is out, Home and every project show
415
- it with what is new. **Update now** waits until no agent is in the middle of a step, installs, and restarts
416
- the app on the same link. Every ticket carries on where it was.
417
- - **Settings › About squad-kit** shows your version, when it last checked, and a switch for the daily check.
418
- Terminal: `squad upgrade`.
419
-
420
- ### Quality
421
-
422
- - **A new Quality setting** on the Squad and AI page: **Best** (the default), **Balanced** or **Thrifty**.
423
- On Best, the strongest model builds and reviews at high effort. On Claude Code that is Opus. Terminal:
424
- `squad config set quality best`.
425
- - **A new "extra high" effort.** On Best, a Builder run that fails moves the next one up to extra high.
426
- - **The Reviewer is never weaker than the Builder** on Best and Balanced.
427
- - **Reading the project after a merge is cheaper.** The project map is only read again when files are added,
428
- moved or removed, and that read runs on a lighter model.
429
-
430
- ### No silent hangs
431
-
432
- - **Stop works at every moment**, also between two runs, and it ends the agent with everything it started. A
433
- step that runs out of time ends the same way.
434
- - **Git that talks to a remote has a time limit**, and never waits for a password prompt nobody sees.
435
- - **Starting an agent has a time limit.** If it cannot start, the step says why instead of waiting.
436
- - **The Builder no longer waits for the "before" screenshots.** They are taken beside it, with their own time
437
- limit.
438
- - **A test, lint or build command with no output for 5 minutes is stopped**, and the ticket says which one.
439
-
440
- ### Agents stay in their lane
441
-
442
- - **Every agent runs with the permissions of its step.** The Tester can run the app but cannot change the code;
443
- what it changes anyway, squad-kit puts back.
444
- - **No agent can change the instruction files** the next session would follow, such as `CLAUDE.md`, or
445
- squad-kit's own `.squad/` folder. Agents read copies of the project's rules, never your own folder.
446
- - **No agent can rewrite git history.** squad-kit checks after each Builder and Tester step.
447
- - **Every answer is checked.** An incomplete answer is asked for once more, then the step says so plainly.
448
- - **Text from outside**, such as a tracker item or a pasted message, reaches the agents as data, never as
449
- orders.
450
- - **Test, setup and release commands no longer get the AI and tracker keys.**
451
-
452
- ### No lost work
453
-
454
- - **A release and a "Looks right" at the same moment** no longer get in each other's way.
455
- - **Stop keeps the step the ticket was at.**
456
- - **"Bring in the latest main"** uses the remote's main, not an old local copy.
457
- - **Only a real clash counts as a clash.** Other git errors say what went wrong. `squad doctor` checks the git
458
- version.
459
- - **Tracker updates are kept until they are sent**, and retried when the tracker is down.
460
- - **A release whose push failed** says "not pushed yet", with **Push again** on the Releases page. Terminal:
461
- `squad release <version> --push-again`.
462
- - **Withdraw change** takes back an approved change the squad has not built yet, and puts the spec back to how
463
- it was. Terminal: `squad propose <ID> --withdraw`.
464
-
465
- ### Fixes
466
-
467
- - **The Architect writes the stack**, with each part's role, from the code it reads. `stack.md` was empty.
468
- - **The Reviewer is told the checks already ran**, so it does not run them again.
469
-
470
- ## [1.0.0] — 2026-11-02
471
-
472
- squad-kit 1.0 is an agent harness for the whole software cycle. You write a ticket in plain words. A squad of
473
- AI agents (Analyst, Architect, Builder, Tester and Reviewer) takes it from that ask to a release, and you stay
474
- in control through buttons and approvals. It needs Node.js 22 or newer, git, and an AI tool installed and
475
- signed in: Claude Code today. Moving an existing project: [Moving to 1.0](docs/migrating-to-1.0.md).
476
-
477
- ### The one app
478
-
479
- - **Plain `squad` opens one app for all your projects**, from any folder, in your browser at `127.0.0.1:4571`.
480
- It runs on your computer only, behind a private link.
481
- - **Home** lists your projects and one **Waiting for you** list across all of them.
482
- - **Add project** opens a folder browser inside the page. It says what kind of folder you picked, and can make
483
- a new one.
484
- - **`squad console`** in a folder adds that project to the app and opens its board, starting the app if needed.
485
- - Every project has its own board, at its own address. Every button has a terminal command, and commands take
486
- `--project <name>` from any folder. New: `squad projects`, and `squad inbox` across every project.
487
- - `squad --restart` and **Restart the board** start a fresh app on the same link. Running work picks up where it
488
- stopped.
489
-
490
- ### Projects and files
491
-
492
- - **Any folder can be a project**: an empty folder (a new repo), code with git (kept as it is), code without git
493
- (a new repo with your files in its first commit, without `node_modules`, `dist` or `.env`), or a folder with
494
- several code repos.
495
- - **The project keeps its own memory in `.squad/`**, as Markdown people can read and edit: `config.yaml`, and
496
- `tickets/<ID>/` with `ticket.md`, `spec.md`, `questions.md`, `design.md`, `notes.md`, `proof.md` and attached
497
- files, plus `decisions/`, `releases/`, `rules/` and `knowledge/`.
498
- - **This computer keeps its own part in `~/.squad-kit/projects/<id>/`**: live progress, agent chats,
499
- screenshots, voice notes, sign-ins and cost. Nothing secret, personal or big goes into the project folder.
500
- - **Git stays quiet.** `.squad/` goes in git's local ignore list, never in `.gitignore`. For a project whose
501
- `.squad/` sits in its one repo, squad-kit commits each ticket's documents on the ticket's branch, and the
502
- release commit carries the rest. `git log .squad/tickets/<ID>` shows each big moment of a ticket.
503
-
504
- ### Tickets and the squad
505
-
506
- - **Write a ticket on the board** in plain words, with criteria, business rules, edge cases and files. Or paste
507
- an idea or a chat message and the Analyst fills in the ticket for you to check. Bugs have their own form.
508
- - **Pull a ticket from your tracker.** Azure DevOps today: the backlog by sprint, comments, states, bugs, pull
509
- requests on Azure Repos, and items closed with the version on release. Tickets keep the tracker's name, like
510
- `AB-46`; a project without a tracker names its own (`LR-1`).
511
- - **The squad's loop**: questions, spec, design, build, checks, review, proof, release. You answer, approve the
512
- spec, approve the design (a developer can do this part), check the proof and release.
513
- - **Full and Express tracks.** Express is for small fixes: no questions and the plan approved on its own; the
514
- build, checks, review and your **Looks right** still run.
515
- - **squad-kit is the boss.** It runs the tests, lint and build itself, starts a fresh Reviewer, and does the git
516
- and tracker work. Agents never merge, push or grade their own work. The Builder works in its own copy of the
517
- code; your folder is never touched while it works.
518
- - **Decisions are saved and linked**, named by the ticket that made them (`AB-46.1`), or `STACK.1` for what the
519
- Architect found in the existing code. The Architecture page shows how they build on each other.
520
- - **Every stop has a way out**: try again, fix it yourself, continue anyway (only you can, with a reason that
521
- stays on the record), or go back to the plan. Nothing hangs silently.
522
- - **Model levels per role and step**: strongest, balanced or fast, with an effort. squad-kit sets the defaults;
523
- the team and each person can change them on the Squad and AI page.
524
- - **One limit of tickets at once** (2 by default, up to 5), shared by all projects, because they share your AI
525
- account.
526
- - AI tools plug in as modules. Claude Code runs every role today; Codex is found but cannot run yet.
527
-
528
- ### Chat
529
-
530
- - **Talk to any agent** on a ticket, with screenshots, files and voice notes.
531
- - **Asking never stops the work.** While the squad works, the chat runs beside it and changes nothing.
532
- - **A change goes through the spec.** **Propose a change**: the Analyst writes the old and new wording and says
533
- if it is small or big, and you approve. A small change reaches the Builder at the end of its current step. A
534
- big one pauses it, the Architect updates the design for your approval, and the Builder redoes only what
535
- changed. One change at a time per ticket. Terminal: `squad propose`.
536
- - **Released work is for questions only.** A change to it becomes a new linked ticket or a bug report.
537
- - A new chat window is coming in this release: a side panel with tabs, a full-screen page, a phone layout, and
538
- Arabic and English shown the right way.
539
-
540
- ### Teams
541
-
542
- - **An owner on each ticket**, kept in `ticket.md`, so two squads never build the same ticket.
543
- - **Hand over** (button and `squad hand-over`) pushes the ticket's branch with its code and documents, and names
544
- the new owner. Their squad carries on from the branch, with a fresh session from the spec, design and code.
545
- - **A fresh clone shows the same board**: every ticket with its spec, answers, design, stage and owner, and
546
- every decision. Live progress, chats and screenshots stay on the computer that made them.
547
- - Hand over and clones work for a project whose `.squad/` sits in its one repo.
548
-
549
- ### Cost
550
-
551
- - **What each ticket and each role used**: runs, tokens, and the cost at the AI company's API prices, per role
552
- and step. On the ticket's Cost tab, the Squad and AI page, the board's footer and in `squad show`.
553
- - Your own AI subscription pays for it. The numbers show where the cost goes, so the team can tune the levels.
554
-
555
- ### Moving from 0.x
556
-
557
- - **Open a 0.x project** with `squad console` or Add project. Its `stories/`, `plans/` and tracker settings in
558
- `config.yaml` stay as they are; `config.yaml` gains a `board:` section.
559
- - **Sign-ins move** from `.squad/secrets.yaml` to `~/.squad-kit/projects/<id>/secrets.yaml`. The 0.x commands
560
- find them there.
561
- - **A board from an early 1.0 build** (`.squad/board/`) moves to the new layout on its own, once, with a backup
562
- in `~/.squad-kit/backups/` and a field-by-field check. Tickets and decisions keep their names. It waits until
563
- no board runs.
564
- - The 0.x commands (`new-story`, `new-plan`, `auth`, `config`, `doctor` and others) still ship. The 0.x console
565
- pages are replaced by the 1.0 app.
566
-
567
- ## [0.12.4] — 2026-08-26
568
-
569
- ### Bug fixes
570
-
571
- - **"Open" on a freshly generated plan 404'd in the console.** After a run finished, the *Plan
572
- saved* callout's **Open** link — and the **Open plan** button on the run report — resolved to
573
- `/plans/<feature>/.squad%2Fplans%2F<feature>%2F<file>.md`, and the page rendered
574
- `404 Not Found: {"error":"not_found"}`. Reported as
575
- [#9](https://github.com/AzmSquad/Squad-Kit/issues/9).
576
-
577
- Run records and the `done` event carry `planFile` as a path relative to the workspace root
578
- (`.squad/plans/<feature>/<file>.md`) — that is the form shown to the user, and what both
579
- `squad new-plan` and the console runs API have always written. The `/plans/$feature/$planFile`
580
- route and `GET /api/plans/:feature/:planFile` want the **file name** only, because the API
581
- resolves it under `.squad/plans/<feature>/`. Both link sites now normalise the value.
582
-
583
- Normalising in the UI rather than at the writers also repairs every run record already on disk,
584
- which all store the long form — so the run report's link works for historical runs too, not just
585
- new ones.
586
-
587
- The existing test asserted the correct href but fed the component a bare file name the server
588
- never sends, so it passed while the real link was broken. The fixture now matches the actual
589
- payload, and reverting the fix makes it fail.
590
-
591
- ## [0.12.3] — 2026-08-25
592
-
593
- ### Bug fixes
594
-
595
- - **The console's Doctor page was unreachable.** `/doctor` was defined as a route but never added to
596
- the router's child list, so the sidebar link, the breadcrumb, and the Cmd+K entry all resolved to a
597
- bare "Not Found". Introduced in 0.11.0 (`46519fd`, the runs-pages work) and shipped in every
598
- release since. The CLI's `squad doctor` was unaffected throughout, which is why it went unnoticed.
599
-
600
- The route is registered again, and `console-ui/src/router.test.ts` now asserts that **every**
601
- sidebar destination resolves to a registered route. Neither the type checker nor the existing
602
- tests could catch this: a defined-but-unregistered route is valid unused code, and a link to a
603
- non-existent path is just a string.
604
-
605
- ## [0.12.2] — 2026-08-25
606
-
607
- ### Bug fixes
608
-
609
- - **The planner never read any project files, then hung.** On the Agent SDK runtime a run reported
610
- `reads 0/N`, the scout exhausted its turns without reaching `respond_with_scout_result`, the draft
611
- produced a plan with no repo context, and the session then stalled indefinitely — the plan file was
612
- written but the CLI and the console both kept spinning. Reported as
613
- [#8](https://github.com/AzmSquad/Squad-Kit/issues/8). Two causes, both fixed:
614
-
615
- 1. **Every tool call is gated on a permission decision**, and the runtime supplied no handler. The
616
- model emitted `tool_use` for `read_file` / `grep` / `list_dir` and nothing ever executed them.
617
- The runtime now grants its own `mcp__squad-kit-*` tools and denies everything else, so a tool
618
- the planner did not register can never run during planning.
619
- 2. **A claude.ai login carries the account's connectors into the session** as extra MCP servers
620
- (Google Drive and friends), crowding the tool namespace the planner depends on — measured at 12
621
- tools where the planner registers a handful. Planning now runs with `strictMcpConfig`, so it
622
- sees only the tools squad-kit registers.
623
-
624
- Verified on a real subscription run: `reads 0/25` and an indefinite hang before, `scout ✓` with
625
- `reads 8/8` and a clean exit after.
626
-
627
- **Scope.** Cause 2 needs a Claude subscription login and so only affects 0.12.x. Cause 1 is
628
- auth-independent and dates to the Agent SDK runtime landing in **0.10.0**, so API-key users on
629
- `planner.runtime.anthropic: agent-sdk` (the default for Anthropic) were most likely getting
630
- context-free plans too. That inference follows from the mechanism; it has not been reproduced
631
- against an API-key run.
632
-
633
- ### Internal
634
-
635
- - Pinned `packageManager` to `pnpm@9.15.9` and removed the duplicate pin from the CI workflow.
636
- Corepack had been resolving pnpm 11 locally, which re-added a `packageManager` field on every
637
- invocation, generated a stray `pnpm-workspace.yaml`, and failed `pnpm install` on unapproved
638
- esbuild build scripts — breaking `pnpm build`, `pnpm test`, and `npm publish` (whose
639
- `prepublishOnly` runs all three). The lockfile has always been `lockfileVersion 9.0`.
640
-
641
- ## [0.12.1] — 2026-08-24
642
-
643
- ### Bug fixes
644
-
645
- - `squad auth login` ended a **successful** browser login with
646
- `could not verify the login (unknown)` and a warning that the credential "may
647
- be invalid or expired". The token was fine. `accountInfo()` resolves from the
648
- Agent SDK's `initialize` response, and for `CLAUDE_CODE_OAUTH_TOKEN` auth that
649
- response carries `{tokenSource, apiProvider}` and **never** an account — for a
650
- valid token exactly as much as for a bogus one. 0.12.0 treated a missing
651
- account as a failed credential, which flagged every healthy login through the
652
- primary documented flow.
653
-
654
- The probe now separates three outcomes instead of two: an account came back
655
- (verified, shown); a credential *source* came back without an account
656
- (reported as resolved, with the honest caveat that token validity can only be
657
- confirmed by an actual planning run); or nothing came back at all (still
658
- treated as unverified). `squad auth login`'s summary and `squad doctor`'s
659
- planner credential row both reflect which applies, and neither claims a
660
- verification the SDK cannot perform.
661
-
662
- Workspaces that authenticate through the OS credential store are unaffected —
663
- those do report an account and are still verified as before.
664
-
665
- ## [0.12.0] — 2026-08-24
666
-
667
- ### What's new
668
-
669
- - **Plan on your Claude subscription.** The Anthropic planner can authenticate
670
- with the Claude login you already have (Pro, Max, or Team/Enterprise) instead
671
- of an API key. `squad new-plan --api` and the console Generate page both run
672
- on it. No per-token API bill. OpenAI and Google are unchanged and remain
673
- API-key only.
674
- - **`squad auth login | status | logout`.** `login` runs the Anthropic browser
675
- authorization flow and stores the resulting token in `.squad/secrets.yaml`;
676
- `--token <value>` consumes a `claude setup-token` value on a headless machine,
677
- and `--print-only` runs the flow, prints the token, and stores nothing.
678
- `status` reports the resolved mode, the credential behind it, and the
679
- signed-in account (`--json` for a stable scripting shape, `--offline` to skip
680
- the live check). `logout` removes only the token squad-kit stored.
681
- - **`planner.auth.anthropic`** in `.squad/config.yaml` — `subscription`,
682
- `api-key`, or `auto`. The merged default is **`auto`**: prefer a detected
683
- Claude login, fall back to a resolvable API key, otherwise fail naming both
684
- recovery paths. `squad init` offers the subscription as the first and default
685
- choice for new workspaces and writes it explicitly.
686
- - **`planner.anthropicOauthToken`** is a new secrets-only key. `.squad/config.yaml`
687
- rejects it by name at load time.
688
- - **Subscription runs withhold the API key.** In subscription mode
689
- `ANTHROPIC_API_KEY` and `ANTHROPIC_AUTH_TOKEN` are removed (case-insensitively)
690
- from the planner subprocess environment. Both outrank the login credential
691
- inside Claude Code, so an inherited one would silently bill API credits. The
692
- parent shell is untouched.
693
- - **No new runtime dependency.** `squad auth login` shells out to the `claude`
694
- binary that `@anthropic-ai/claude-agent-sdk` already ships through
695
- `optionalDependencies`. A separate Claude Code install is never required.
696
- - **Auth-aware `squad doctor`.** New `planner auth mode` (resolved mode, why,
697
- and the credential — naming any API key it is ignoring) and
698
- `planner auth vs. runtime` (subscription auth requires the Agent SDK runtime)
699
- checks. `planner model resolves at provider` and `planner tier vs. model` now
700
- **skip** on subscription auth: there is no API key to list models with and no
701
- API rate tier to warn about.
702
- - **Console auth surface.** An Authentication control on Config (with a
703
- hard-conflict callout that disables Save), a Claude Account card on Secrets
704
- with a live "Check again" probe and a masked stored token, an auth badge and
705
- branched billing copy on Generate, a dedicated recovery callout for
706
- `auth_unavailable` failures, and an Auth column on the runs index. The console
707
- guides the login and never performs it — it cannot complete an OAuth callback
708
- on your behalf.
709
- - **Run records carry `authMode`**, and the planner stream gained one additive
710
- `auth_info` event. Older clients ignore unknown event kinds.
711
- - **Cost copy branches on auth mode.** `printPlannerApiCostNotice()` and the
712
- limit explanations no longer describe per-token billing on a subscription run.
713
-
714
- ### Bug fixes
715
-
716
- - Planner model-list probe (`src/core/probes.ts`): a network-level `fetch`
717
- rejection (offline, DNS failure, proxy refusal) or a non-JSON response body
718
- threw out of `fetchProviderModelIds` instead of returning a failure result, so
719
- `squad doctor`'s `planner model resolves at provider` check surfaced an
720
- unexpected error rather than a clean diagnosis. Both are now caught and
721
- reported as `status: 0` with the message, and long error bodies are truncated.
722
- Shipped to GitHub after v0.11.0 (`d2d67a1`) and missed the 0.11.0 changelog.
723
-
724
- ### Upgrade notes
725
-
726
- Zero-config. A `config.yaml` with no `planner.auth` block merges to `auto` and
727
- keeps loading; every existing `planner.*` key, including `maxOutputTokens`, is
728
- unaffected. An untouched 0.11.0 API-key workspace resolves to `api-key` and
729
- behaves identically — **provided the machine has no Claude login**.
730
-
731
- Under `auto`, a detected Claude login **outranks** a stored API key. So on a
732
- machine that has both, an upgraded workspace switches to subscription billing.
733
- Nothing errors, and the change is announced rather than silent: `squad doctor`'s
734
- `planner auth mode` row reads `subscription (auto — Claude login detected) → …
735
- · ignoring the API key from .squad/secrets.yaml`. Set
736
- `planner.auth.anthropic: api-key` to pin the previous behaviour.
737
-
738
- `squad doctor --fix` deliberately does **not** pin an implicit `auto` to
739
- `api-key`. `auto` exists so that a Claude login takes over once one appears;
740
- pinning would silently prevent that forever.
741
-
742
- ### Notes / limitations
743
-
744
- - **Usage draws on your Claude plan's limits.** Per Anthropic's
745
- [Use the Claude Agent SDK with your Claude plan](https://support.claude.com/en/articles/15036540-use-the-claude-agent-sdk-with-your-claude-plan),
746
- Agent SDK, `claude -p`, and third-party usage consumes the subscription's
747
- usage limits, and the separately announced monthly SDK credit is not currently
748
- available. The claim this release makes is **"no per-token API bill"** — not
749
- free, and not unlimited. Opus planning against a **Pro** plan consumes a usage
750
- window noticeably faster than against **Max**. Hitting the ceiling means
751
- waiting for the reset window or switching to an API key.
752
- - **Enterprise managed-settings `apiKeyHelper` still wins.** squad-kit runs the
753
- Agent SDK with `settingSources: []`, so user, project, and local settings are
754
- not read and an ordinary user-level `apiKeyHelper` cannot hijack a
755
- subscription run. **Policy settings are always merged regardless**, so a
756
- managed-settings `apiKeyHelper` deployed by MDM is still honoured and still
757
- outranks the login credential — on a managed device, `auth: subscription` may
758
- resolve through the organization's helper. This was established by reading the
759
- credential resolver in the bundled `claude` binary, **not** on a live managed
760
- device. `squad auth status` reports the `apiKeySource` the SDK actually
761
- resolved.
762
- - **`auth: subscription` requires the Agent SDK runtime.** `@ai-sdk/anthropic`
763
- authenticates with `x-api-key`, and an OAuth credential is not an API key.
764
- `auth: subscription` with `planner.runtime.anthropic: vercel`, or with a
765
- non-Anthropic provider, is a hard failure before any network call — never a
766
- silent downgrade to API billing.
767
- - **Account details are never persisted.** Email, organization, and plan are
768
- fetched live for display in `squad auth status`, `squad doctor`, and the
769
- console. `.squad/runs/` records the resolved **mode** and `apiKeySource` only —
770
- no token, key, email, or organization. Asserted by a test.
771
- - **A successful SDK handshake does not prove the credential works.**
772
- `accountInfo()` resolves from the subprocess's `initialize` response, which
773
- succeeds whether or not the credential is valid. Subscription auth that
774
- reports no account **and** no `apiKeySource` is therefore treated as
775
- unverified rather than signed in.
776
- - `docs/auth.md` is not shipped inside the npm tarball. It is served at
777
- <https://squad-kit.com/docs/auth> and lives in the repo under `docs/`.
778
-
779
- ## [0.11.0] — 2026-05-04
780
-
781
- ### What's new
782
-
783
- - API `new-plan` can append planner events to `.squad/runs/<id>.events.jsonl`
784
- (thinking text redacted on disk; retention rotates old files).
785
- - Agent SDK runs emit richer events (tool lifecycle, thinking deltas, caps,
786
- runtime metadata) for the CLI and console.
787
- - API-mode `new-plan` prints stage pipeline, budget meters, and thinking
788
- activity; the plan summary cites the events file path.
789
- - `squad console` HTTP API lists persisted runs and serves stored event streams.
790
- - Console UI adds a runs index, run report page, and a reworked Generate view
791
- with live panels and navigation.
792
-
793
- ### Bug fixes
794
-
795
- - `squad doctor` skips live external probes when `CI` is set and surfaces
796
- planner probe errors cleanly.
797
- - Vitest timeouts increased for slow config loads and console API tests.
798
-
799
- ## [0.10.0] — 2026-05-04
800
-
801
- ### What's new
802
-
803
- - Anthropic planning defaults to the Claude Agent SDK so Opus 4.7 can use
804
- adaptive thinking and effort; OpenAI and Google stay on the Vercel AI SDK.
805
- - Planner YAML and CLI cover runtime choice, thinking mode, effort, and
806
- per-phase effort (`--anthropic-runtime`, `--effort`, `--scout-effort`,
807
- `--no-thinking`).
808
- - The planner summary shows which runtime ran; run JSON may record runtime and
809
- a provider-options snapshot for dashboards and tooling.
810
- - `squad doctor` checks runtime wiring, model vs runtime fit, and the Agent SDK
811
- binary.
812
- - Published CLI no longer bundles `cli.js.map`; set `SQUAD_TSUP_SOURCEMAP=1`
813
- when running `tsup` locally if you need a source map.
814
- - On the Agent SDK path, cache token counts are not surfaced in telemetry
815
- (caching still applies); live usage stays aggregate-only until the run ends;
816
- cancel may not stop the upstream HTTP request immediately.
817
-
818
- ## [0.9.1] — 2026-05-04
819
-
820
- ### Bug fixes
821
-
822
- - Anthropic scout and draft attach extended thinking so Opus 4.7+ avoids
823
- failed calls when the SDK would send incompatible temperature overrides.
824
-
825
- ## [0.9.0] — 2026-05-04
826
-
827
- ### What's new
828
-
829
- - Scout precedes the draft planner in API `new-plan` for a cheaper first pass.
830
- - Validation verifies citations offline and suggests typo fixes for paths.
831
- - New planner tools: `grep`, `list_dir`, and `read_file` with offset/limit.
832
- - Scout sees a bullet list of `.squad/plans/` markdown (caps at ~30 files).
833
- - Anthropic/OpenAI/Google run through Vercel AI SDK (`ai`, `@ai-sdk/*`).
834
- - Tool outputs keep `toolName`/`isError` metadata across turns where supported.
835
- - Scout snippets use separate user-role cache blocks for stabler prompts.
836
- - Generate-plan template adds edge-case, failure-mode, and test-plan sections.
837
- - Disable scout or validation via flags or YAML (`planner.stages.*`).
838
-
839
- ### Bug fixes
840
-
841
- - Jira Tracker broke on blank search (HTTP 400); bounded JQL restores results.
842
- - Atlassian JSON errors surface in tracker messages again (snippet capped).
843
-
844
- ### Breaking changes
845
-
846
- - Dropped `planner.budget.maxCostUsd` and `cost_cap` limits (never enforced).
847
- - Remove lingering keys from `config.yaml` if they are still declared.
848
-
849
- ## [0.8.0] — 2026-05-03
850
-
851
- ### What's new
852
-
853
- - Generate page shows provider rate limits: countdown, auto-retry banner,
854
- and rerun when the planner aborts over the wait cap.
855
- - Planner emits richer `rate_limit` stream events (`retrying` vs `aborted`,
856
- cap seconds, provider, short error snippet). CLI `new-plan` only shows the
857
- “waiting to retry” spinner for the retrying phase.
858
- - Run SSE ends a rate-limit abort with `done` (partial) only — no extra
859
- `error` line repeating the same message.
860
-
861
- ### Bug fixes
862
-
863
- - Jira issue search called deprecated `/rest/api/3/search` (Atlassian returns
864
- HTTP 410). Search now uses `/rest/api/3/search/jql` with clearer 410 errors
865
- if an old client hits removed endpoints.
866
-
867
- ## [0.7.2] — 2026-04-28
868
-
869
- ### Bug fixes
870
-
871
- - The console sidebar and dashboard still reported `v0.6.0` after 0.7.1
872
- because `/api/meta` and `/api/dashboard` had the version hardcoded.
873
- Both now read from `package.json` (matching the CLI and `/healthz`
874
- fix in 0.7.1).
875
- - `squad config set tracker --type github` was a no-op stub: it set
876
- `tracker.type = github` without prompting for owner/repo or PAT and
877
- skipped the connectivity probe. It now matches the Jira and Azure
878
- flows — interactive credential prompt, secrets written to
879
- `.squad/secrets.yaml`, post-config GitHub probe, and an updated
880
- next-steps hint with `--id <github-issue-number>`.
881
-
882
- ## [0.7.1] — 2026-04-28
883
-
884
- ### Bug fixes
885
-
886
- - `squad --version` printed `0.6.0` on 0.7.0 — the version string was
887
- hardcoded in the CLI and the console `/healthz` endpoint. Both now
888
- read from `package.json` and stay in sync with the installed package.
889
-
890
- ## [0.7.0] — 2026-04-28
891
-
892
- ### What's new
893
-
894
- - GitHub Issues works as the issue tracker: set owner/repo in config, PAT (or
895
- `GITHUB_TOKEN` / `GITHUB_HOST`) in secrets, search and import like Jira or
896
- Azure. Console Secrets page has GitHub host and token fields plus a
897
- connectivity test; `squad doctor` probes the GitHub REST API.
898
-
899
- ### Breaking changes
900
-
901
- - Linear is no longer a tracker type. Use GitHub Issues, Jira, or Azure, or
902
- set tracker to `none`. Update `.squad/config.yaml` if you had `linear`.
903
-
904
- ## [0.6.1] — 2026-04-26
905
-
906
- ### Bug fixes
907
-
908
- - Azure DevOps console tracker search was failing on first load and on text
909
- search with HTTP 400. WIQL queries now require the team project (`@project`)
910
- in the WHERE clause; HTTP 400 responses include a clearer hint about
911
- org/project or WIQL scoping.
912
-
913
- ## [0.6.0] — 2026-04-29
914
-
915
- ### Why this release
916
-
917
- squad-kit 0.5.0 shipped the console end-to-end. Real users found the visual layer hostile for an admin/console surface — too marketing-y, glow orbs everywhere, dialog positioning glitches under our overflow rules — so 0.6.0 is a redesign-only release. Zero CLI behaviour changes, zero API contract changes. The console adopts a Vercel/Geist-inspired palette: flat near-black surfaces, white text, accent green reserved for status (live planner dot, focus rings, active sidebar, success badges). Every dialog is now portal-rendered and centred reliably. The signature Vercel/Linear move — Cmd+K command palette — is in.
918
-
919
- ### Added
920
-
921
- - console-ui: Cmd+K command palette (powered by `cmdk`) — searches stories, plans, and actions; Linear-style chord shortcuts (`g s` for Stories, `g p` for Plans, `n s` for new story, `?` for the cheatsheet, etc.).
922
- - console-ui: portal-rendered Dialog primitive with focus trap, body scroll lock, ESC + backdrop close, focus restore. Replaces the native `<dialog>` element (and fixes its positioning bugs).
923
- - console-ui: Toast system (`useToast()`) with bottom-right stack, tone-coloured icons, auto-dismiss, manual dismiss, optional inline action.
924
- - console-ui: Confirm provider (`useConfirm()`) — promise-based ergonomics for destructive actions.
925
- - console-ui: Callout component for inline alerts (default / info / success / warning / danger). Replaces every ad-hoc tone block sprinkled through pages.
926
- - console-ui: Density toggle (Comfortable / Compact) in the topbar; persists to `localStorage`, applies via `[data-density]` on `<html>`.
927
- - console-ui: Breadcrumbs in the topbar, derived from the route match tree.
928
- - console-ui: New primitives — `Page`, `Spinner`, `IconButton`, `Tooltip`, `Kbd`, `Field`. All density-aware.
929
- - console-ui: Internal design playground at `/__design` for primitive sanity checks.
930
- - console-ui: `lucide-react` for icons; sidebar letter-icons (`D / S / P …`) replaced with proper Lucide icons.
931
-
932
- ### Changed
933
-
934
- - console-ui: complete design-token rewrite — Geist-inspired graphite scale (12 steps from `--gray-1` to `--gray-12`), accent green reserved for status only. The marketing-site palette stays on the marketing site; the console diverges. CSS variable names that pages already used (`--color-bg`, `--color-surface`, `--color-text`, `--color-accent`, etc.) keep working — their values changed.
935
- - console-ui: layout shell rewritten — sidebar is sectioned (Workspace / Run / Settings) with Lucide icons, project switcher moved into the sidebar header, topbar shows breadcrumbs + density toggle + Cmd+K hint. The decorative `grid-bg` and `glow-orb` divs were removed from the working surface.
936
- - console-ui: every page rewritten through the new `<Page>` wrapper. Inline tone classes (`bg-emerald-…`, `bg-red-…`, etc.) replaced with `<Badge>`, `<Callout>`, and `<Toast>`. Destructive actions go through `useConfirm()`.
937
- - console-ui: charts read CSS variables instead of hard-coded hex codes; near-monochrome palette with green only for the most-recent / success series.
938
- - console-ui: shimmer Skeleton replaces the static `animate-pulse` block.
939
- - console-ui: Markdown viewer adopts a near-monochrome prism theme matching the new tokens.
940
-
941
- ### Fixed
942
-
943
- - console-ui: dialog positioning bugs caused by the native `<dialog>` element interacting with our layout's overflow rules. Now portal-rendered and reliably centred.
944
-
945
- ### Migration
946
-
947
- No breaking changes for CLI users. The `.squad/` file formats, command flags, planner output, tracker integration, and config schema are byte-identical to 0.5.0. If you've installed `squad-kit@0.5.0` globally and run `squad console`, simply `npm i -g squad-kit@0.6.0` and your next `squad console` opens the new look. No `.squad/config.yaml` changes.
948
-
949
- ### Internal
950
-
951
- - console-ui: `cmdk`, `lucide-react` added to `console-ui/package.json` (consumed at build-time only; the CLI runtime dependency tree is unchanged).
952
- - console-ui: extensive primitive coverage with vitest — tests grew by ~25 cases across `Button`, `Badge`, `Spinner`, `Field`, `Page`, `Dialog`, `Toast`, `Callout`, `Confirm`, `Breadcrumbs`, `useDensity`, `CommandPalette`, `useGlobalShortcuts`.
953
-
954
- ## [0.5.0] — 2026-04-25
955
-
956
- ### Why this release
957
-
958
- squad-kit 0.4.0 made the planner reliable and the partial-plan recovery flow first-class. 0.5.0 makes the whole product **shareable**: a local-first, dark-modern web console that exposes every CLI capability with a UI a teammate can use without learning the commands.
959
-
960
- The console isn't a hosted dashboard. It binds to `127.0.0.1`, gates every API request behind a per-session token, and reads/writes the same `.squad/` files the CLI already uses. Open it with `squad console`, share a screenshot of a streaming planning run on Slack, close the tab, keep working in the terminal.
961
-
962
- ### Added
963
-
964
- - `squad console` — open `http://127.0.0.1:4571` (configurable) for a dashboard, stories CRUD, plans browser with diff, live planner streaming via SSE, visual editors for `config.yaml` and `secrets.yaml`, tracker issue search and import, graphical `squad doctor`. Token-gated and loopback-only.
965
- - Persistent run history in `.squad/runs/<runId>.json` (last 20 retained). Dashboard reads from it for cache-hit ratio, token spend sparkline, and run-duration bars.
966
- - `~/.squad/recent-projects.json` — per-user list of project roots you've opened the console against; surfaces in the topbar dropdown.
967
- - Internal: `PlannerEventBus` + `runPlanner({ events, runId, abort })` lets multiple consumers share one run; CLI rendering becomes a bus subscriber.
968
- - Internal: `core/story-mutations.ts` (`createStoryRecord`, `deleteStoryRecord`, `createStoryRecordFromIssue`) is now the single implementation behind the CLI new-story / rm-story commands and the console.
969
- - Internal: `commands/doctor-engine.ts` extracts `gatherContext` and `runAllChecks` so the doctor logic is reusable from the API.
970
- - Internal: `TrackerClient.searchIssues` for Jira (REST `/search`) and Azure (WIQL).
971
- - Build: `pnpm size:guard` — fails CI if the published tarball exceeds 2.5 MB unpacked. Wired into `prepublishOnly`.
972
-
973
- ### Changed
974
-
975
- - `pnpm build` now runs the SPA build (`pnpm -C console-ui build`) before the CLI build (`tsup`) and verifies `dist/console-ui/index.html` was emitted.
976
- - The npm tarball gains a `dist/console-ui/` tree (~700–900 KB gzipped).
977
-
978
- ### Migration
979
-
980
- No breaking changes. CLI commands behave byte-identically. The `.squad/runs/` directory and `~/.squad/recent-projects.json` are added on first console run; `.squad/runs/` is gitignored automatically (managed block).
981
-
982
- ## [0.4.0] — 2026-04-24
983
-
984
- ### Added
985
-
986
- - `planner.maxOutputTokens` in merged config (default **16384** tokens per model round).
987
- - Interactive `squad new-plan --api` prompt when a planner limit is hit: continue (extends read/context/time/round/output budgets for that run) or stop, with a short billing note up front.
988
- - Incomplete API plans save as `*.partial.md` plus YAML `squad-kit-plan-status: partial`; the CLI exits with code **2** when planning did not finish cleanly (no stack trace for that path).
989
-
990
- ### Changed
991
-
992
- - New plan files are named from the **story folder id** (`NN-story-<id-slug>.md`) instead of slugging the title hint, so paths stay short; `00-overview.md` still carries the human title.
993
- - Intake scaffolding fills more fields from fetched tracker issues (Azure / Jira) when `squad new-story` pulls work item data.
994
- - Agent `squad-plan` templates remind editors not to overwrite the first-line `<!-- squad-kit: … -->` plan metadata comment.
995
-
996
- ### Fixed
997
-
998
- - `squad list` reads `generated by` metadata from the first matching `<!-- squad-kit: … -->` line in the first lines of a plan file, not only line 1.
999
- - `findPlanFor` prefers a non-`.partial.md` plan when both exist for the same story id.
1000
-
1001
- ### Site
1002
-
1003
- - Added `robots.txt` and small head metadata tweaks on the Astro site.
1004
-
1005
- ## [0.3.0] — 2026-04-24
1006
-
1007
- ### Why this release
1008
-
1009
- squad-kit 0.2.2 stabilised rate-limit handling with retries and a softer `squad doctor` warning.
1010
- That made failures loud but didn't reduce the underlying token spend: every planning turn
1011
- re-sent the cumulative transcript, so costs scaled roughly quadratically with the number of
1012
- tool calls. On Anthropic Tier 1 with Opus, that made non-trivial plans structurally infeasible.
1013
-
1014
- 0.3.0 adds **prompt caching end-to-end** across Anthropic, OpenAI, and Google. Expected savings
1015
- on a typical 10-turn run: ~70% fewer billed input tokens, and — critically on Anthropic —
1016
- cached reads don't count the same against your per-minute quota. Tier 1 Opus users should find
1017
- moderate plans work where they previously hit 429 from turn 7 onward.
1018
-
1019
- ### Added
1020
-
1021
- - Anthropic explicit prompt caching via `cache_control: { type: 'ephemeral' }` on the system
1022
- prompt and the most recent tool-result block each turn (cache TTL rolls forward).
1023
- - OpenAI and Google implicit prefix caching (no config required; activated by the stable-prefix
1024
- refactor below).
1025
- - `planner.cache.enabled` config knob (default `true`). Configure via `squad config set planner`.
1026
- - Run-summary line: `cache hit 68% (22.4k read / 32.9k total)` every `squad new-plan --api` run.
1027
- - `squad doctor` now checks `planner cache effectiveness`, reading `.squad/.last-run.json`.
1028
- - `.squad/.last-run.json` persistence of planner run stats (git-ignored, per-user).
1029
- - `Usage.cacheCreationTokens` and `Usage.cacheReadTokens` on every provider response.
1030
- - Deterministic request-body builders (`buildAnthropicBody`, `buildOpenAIBody`, `buildGoogleBody`)
1031
- exposed for testing; dev-mode warning when a turn mutates the cacheable prefix.
1032
- - Copy-paste mode (`squad new-plan --copy`) now writes the composed prompt to
1033
- `.squad/.last-copy-prompt.md` and prints a compact summary (mode · story · file · size · est
1034
- tokens · clipboard status) instead of dumping the full 5–10 KB prompt into the terminal.
1035
- - Clipboard fallbacks for Linux (`xsel` in addition to `xclip`) and Termux
1036
- (`termux-clipboard-set`). Headless Linux / SSH sessions now surface an actionable reason in
1037
- the summary ("no display server detected — install xclip or xsel, or use the saved file")
1038
- instead of silently skipping.
1039
- - `squad config set planner` and `squad config set tracker` print a "▸ Next:" block so users
1040
- know what to run next (`squad doctor` → `squad new-story` → `squad new-plan`).
1041
- - `squad tracker link` and `squad migrate` also print "▸ Next:" guidance.
1042
- - Managed `.gitignore` block now covers `.squad/.last-run.json` and `.squad/.last-copy-prompt.md`.
1043
-
1044
- ### Changed
1045
-
1046
- - System prompt no longer embeds timestamps, random IDs, or absolute host paths (these
1047
- cache-busted the prefix on every turn).
1048
- - `squad doctor` Anthropic Tier 1 Opus warning softened from "you will hit ITPM" to "tight but
1049
- viable with caching on."
1050
- - `squad config set planner` no longer prompts for `planner.modelOverride`. The interactive
1051
- flow is shorter and less intimidating; power users can still set the override directly in
1052
- `.squad/config.yaml` (documented in `docs/customization.md`).
1053
- - `copyToClipboard()` now returns a structured `{ ok, tool?, reason? }` result instead of a
1054
- bare boolean, so callers can explain failures to the user.
1055
-
1056
- ### Known limitations
1057
-
1058
- - Google `cachedContents` explicit API not implemented (implicit caching is sufficient for
1059
- single-run CLI use).
1060
- - No cross-run persistence of cache stats yet — doctor only reads the most recent run.
1061
- - No automatic context compression when transcripts exceed ~50 KB. Caching helps but doesn't
1062
- solve the long-horizon case. 0.4.0 candidate.
1063
- - Anthropic 1-hour cache TTL (`ttl: "1h"`) not used — default 5-minute TTL covers single-run.
1064
-
1065
- ### Migration
1066
-
1067
- See `docs/migrating-from-0.1.md` §9 "Upgrading from 0.2.x to 0.3.0" for the full path. Short
1068
- version: `squad upgrade` and you're done. Caching is on by default; no config edits required.
1069
-
1070
- ## [0.2.2] - 2026-04-22
1071
-
1072
- ### Fixed
1073
-
1074
- - **Rate-limit retry no longer burns a doomed request.** 0.2.1 capped the auto-retry wait at 30 s. When a provider asked for longer than that (common on Anthropic Tier 1, which regularly asks for 60–180 s), squad-kit would retry *inside the same throttle window* and fail a second time. 0.2.2:
1075
- - Raises the retry cap from 30 s to **90 s**, which comfortably covers the provider-suggested wait for most Tier 1 / free-tier 429s.
1076
- - **Skips the retry entirely** when `Retry-After` is longer than the 90 s cap, and surfaces a dedicated message explaining the decision (`squad-kit did not auto-retry: the provider's 132s wait is longer than our 90s cap, so retrying would just burn another request inside the same throttle window.`) instead of wasting a request and showing the "already retried" variant.
1077
-
1078
- ### Added
1079
-
1080
- - **`squad doctor` now reports planner tier vs. model awareness** (check id `planner-tier`). When `planner.provider === 'anthropic'` and the resolved plan model id contains `opus`, the check emits a **warn** with a fix hint suggesting `squad config set planner` to pick Sonnet or Haiku, which live in separate per-model rate-limit buckets on Anthropic Tier 1 (10 k input tokens / minute). For non-Anthropic providers and non-Opus models, the check is `skip` or `ok` — no noise for users who aren't affected.
1081
- - `rateLimitMessage` gained a `retrySkippedReason` + `maxRetrySec` field, so the error text can distinguish "we retried and got throttled again" (firm over-quota) from "we did not retry because your wait is longer than our cap" (retry would be pointless). Both cases still surface the same four recovery options.
1082
-
1083
- ## [0.2.1] - 2026-04-22
1084
-
1085
- ### Fixed
1086
-
1087
- - **`squad new-plan --api` now handles provider rate limits (HTTP 429) properly.** Previously a 429 surfaced the generic `Run \`squad doctor\` to verify models and credentials.` hint, which is misleading — the credentials are fine, the org is just over its per-minute quota. `runPlanner` now:
1088
- - Detects 429s across Anthropic, OpenAI, and Google (new `errorKind: 'rate_limit'` on `ProviderResponse`).
1089
- - Parses `Retry-After` (seconds or HTTP-date) and Google's body-level `retryDelay` field.
1090
- - Retries **once** automatically, waiting the provider-requested time capped at 30 seconds. A new `onRateLimit(waitSec)` callback lets the UI show a "retrying in Ns" notice.
1091
- - When the retry also fails, throws a dedicated error that names the provider, summarises the wait time, and lists four concrete recovery paths: wait and retry, switch planner model (`squad config set planner`), tighten `planner.budget`, or upgrade tier (with a deep-link to each provider's limits page).
1092
- - The generic (non-429) provider-error hint now reads `Run \`squad doctor\` to diagnose, or retry — most 5xx errors are transient.`, which is accurate for the actual 5xx / network cases it covers.
1093
-
1094
- ### Added
1095
-
1096
- - `detectRateLimit()` and `rateLimitMessage()` in `src/planner/provider-errors.ts`. Both cover all three supported providers and are unit-tested with real-shaped 429 fixtures.
1097
-
1098
- ## [0.2.0] - 2026-04-22
1099
-
1100
- ### tracker-intake-fetch
1101
-
1102
- **Added**
1103
-
1104
- - `squad new-story --id <ID>` auto-fetches title, description, labels, and attachments (≤ 10 MB each) from the configured tracker. Supported: Jira Cloud, Azure DevOps Services.
1105
- - `.squad/secrets.yaml` as a second credential source (after environment variables) for planner keys and tracker tokens. Created with mode `0600` on POSIX; auto-added to `.gitignore`.
1106
- - `squad init` now prompts for tracker credentials when a supported tracker is chosen, and offers to save the planner key inline as an alternative to exporting an env var.
1107
- - `squad status` shows tracker type, workspace, and credential source (`env` / `secrets.yaml` / `missing`).
1108
- - `squad new-story` flags: `--no-fetch`, `--no-attachments`, `--attachment-mb <n>`.
1109
- - `squad new-story --no-tracker` — skip tracker id and fetch for a single story in a workspace that normally requires tracker ids. Interactive mode now offers "skip tracker for this story" alongside "enter id" when required.
1110
-
1111
- **Changed**
1112
-
1113
- - `squad new-story` accepts the feature slug as an optional positional; prompts when it is omitted in a TTY (including a picker for existing feature folders). Passing `-y` / `--yes` keeps fail-fast behaviour when the slug is missing. `CI=1` forces non-interactive mode even in a TTY.
1114
- - `squad tracker link` accepts both the story path and the tracker id as optional positionals; prompts with a story picker and id input when omitted. `-y` / `--yes` and `CI=1` force non-interactive fail-fast.
1115
- - CLI-wide: commands treat missing required input as promptable in a TTY; `-y` / `--yes` and `CI=1` opt out.
1116
- - Credential resolution order documented: env var → `.squad/secrets.yaml` → prompt → fail. Applies to both planner and tracker credentials.
1117
-
1118
- **Security**
1119
-
1120
- - `.squad/config.yaml` continues to reject secret-shaped keys (`apiKey`, `token`, …). Secrets live in `.squad/secrets.yaml` only.
1121
- - Auto-managed `.gitignore` block covers `.squad/secrets.yaml`, `.squad/stories/**/attachments/`, and `.squad/.trash/`.
1122
-
1123
- ### Added
1124
-
1125
- - `squad config` command group with `show`, `set planner`, `set tracker`, `unset planner`, `unset tracker`, and `remove-credential <section>` subcommands. Every field in `.squad/config.yaml` and `.squad/secrets.yaml` can now be edited interactively without opening a text editor.
1126
- - `squad init` on an existing workspace now offers **Reconfigure planner / Reconfigure tracker / Overwrite / Cancel** instead of silently bailing. `--force` keeps the old overwrite behaviour for scripts.
1127
-
1128
- - `squad upgrade` self-update command. Detects the package manager used to install squad-kit, fetches the latest version from npm, and runs the appropriate global-install command after confirmation. Refuses dev installs and major version bumps (print-manual-guide instead).
1129
- - `squad migrate` command applies one-shot 0.1.x → 0.2.0 structural migrations (delete legacy prompts, gitignore, secrets perms, planner budget defaults, config normalisation). Idempotent; destructive by design; gated behind a confirmation prompt unless `--yes` is passed.
1130
- - `squad doctor` command: a full health check covering planner config, tracker credentials, model list probes (no completion calls), `.gitignore` managed block, `secrets.yaml` permissions, legacy `.squad/prompts/`, and `.squad/` layout. `--fix` applies non-destructive repairs only; destructive fixes belong in `squad migrate`.
1131
- - `planner.modelOverride` (per-provider) lets you pin a different plan-phase model id without editing squad-kit source.
1132
- - `pnpm verify:models` (`scripts/verify-models.ts`) probes provider model list APIs before publish so pinned ids cannot drift unnoticed.
1133
- - Clear, actionable error when the planner model returns 404 (upgrade, config override, or `squad doctor`).
1134
- - `squad status` marks the planner row with `(override)` when `modelOverride` is active for the current provider.
1135
- - Direct planner API (optional): Anthropic, OpenAI, Google. Squad calls the planner for you and writes the plan file.
1136
- - Demand-driven context: planner reads files on request via a bounded budget (file count, bytes, wall-clock).
1137
- - Interactive picker in `squad new-plan` over un-planned intakes.
1138
- - Already-planned guard with `--yes` override.
1139
- - `--api`, `--copy`, `--feature`, `--all` flags on `new-plan`.
1140
- - `squad init` asks about planner setup; `--planner <provider>` for non-interactive.
1141
- - `squad status` shows planner provider, model, and env-var presence.
1142
- - `squad list` shows which plans were generated by the API vs copy-paste.
1143
- - Visual identity: mint-green brand, custom spinner frames, banner, summary boxes, consistent prefixes across all commands.
1144
- - `squad rm` command group: `rm story`, `rm plan`, `rm feature`, each with `--dry-run`, `--trash`, `-y`, and interactive pickers. Deleting a story cascades to the matching plan file and overview row. `.squad/.trash/<timestamp>/` is now git-ignored automatically.
1145
-
1146
- ### Changed
1147
-
1148
- - Every user-facing error now ends with a recommended next command (for example, `Run \`squad doctor\` to diagnose`). Failures no longer dead-end users at an error string.
1149
- - `ensureGitignore` now includes `.squad/.trash/` in the managed block. Existing users will see the line appended on the next `squad doctor --fix` or any command that calls `ensureGitignore`.
1150
- - Anthropic plan model pinned to the versioned Claude API id `claude-opus-4-7` (replacing the prior alias default) and execute remains dated `claude-haiku-4-5-20251001`, per Anthropic’s model overview — run `pnpm verify:models` after changes.
1151
- - `new-plan <intake>` is now optional; omit to pick interactively.
1152
- - `--no-copy` renamed to `--no-clipboard` (old flag removed). `--copy` now forces copy-paste mode.
1153
- - Prompts (`generate-plan.md`, `intake.md`, `story-skeleton.md`) now ship entirely within the squad-kit package. Fresh installs no longer create a `.squad/prompts/` directory. Stale `.squad/prompts/` from 0.1.x installs is ignored at runtime and cleaned up by `squad migrate`.
1154
-
1155
- ### Breaking changes for 0.1.x users
1156
-
1157
- - 0.1.x users who upgrade should run `squad migrate` once per repo. A `.squad/prompts/` folder left from 0.1.x is deleted outright (prompts are now bundled in the squad-kit package).
1158
- - If you customised `.squad/prompts/*.md`, those customisations are no longer used. The canonical prompts are in the installed squad-kit package. To customise, fork squad-kit and patch `templates/prompts/`. (This is intentional: behaviour was inconsistent before — some commands ignored the user copy — and silent version drift was breaking workflows.)
1159
-
1160
- ### Security
1161
-
1162
- - Config loader rejects any YAML entry whose key looks like `apiKey`, `token`, `secret`, or `credential`.
1163
-
1164
- ### Known limitations
1165
-
1166
- - OpenAI and Google planner model ids in squad-kit remain provider “latest”-style names for 0.2.0; dated snapshots for those providers are planned for 0.2.1 once verified.
1167
-
1168
- ### Non-goals (still deferred)
1169
-
1170
- - OpenAI-compatible generic endpoint (OpenRouter, Ollama, local). Targeted for 0.3.
1171
- - `squad implement` command. Targeted for 0.3.
1172
- - MCP server, telemetry.
1173
-
1174
- ## [0.1.0] - 2026-04-21
1175
-
1176
- First public release.
1177
-
1178
- ### Added
1179
-
1180
- - `squad init` — scaffolds `.squad/` with `config.yaml`, prompt templates, and agent slash commands.
1181
- - `squad new-story <feature-slug>` — creates `.squad/stories/<feature>/<id>/intake.md` with `attachments/`.
1182
- - `squad new-plan <intake-path>` — composes the plan-generation meta-prompt inline with the intake, prints to stdout, and copies to clipboard.
1183
- - `squad status` — reports story / plan counts and next global `NN`.
1184
- - `squad list [--feature <slug>]` — table of stories and their plan state.
1185
- - `squad tracker link <story> <id>` — upserts a tracker id on an existing intake.
1186
- - Agent slash-command templates for **Claude Code**, **Cursor**, **GitHub Copilot**, and **Gemini CLI**.
1187
- - Tracker id validators for **GitHub**, **Linear**, **Jira**, and **Azure DevOps** (no API calls; format validation only).
1188
- - Plan-generation meta-prompt (`generate-plan.md`), intake template (`intake.md`), and plan skeleton reference (`story-skeleton.md`).
1189
- - Documentation: `docs/philosophy.md`, `docs/getting-started.md`, `docs/customization.md`, `docs/vs-spec-kit.md`.
1190
-
1191
- [Unreleased]: https://github.com/AzmSquad/squad-kit/compare/v1.2.1...HEAD
1192
- [1.2.1]: https://github.com/AzmSquad/squad-kit/releases/tag/v1.2.1
1193
- [1.2.0]: https://github.com/AzmSquad/squad-kit/releases/tag/v1.2.0
1194
- [1.1.1]: https://github.com/AzmSquad/squad-kit/releases/tag/v1.1.1
1195
- [1.1.0]: https://github.com/AzmSquad/squad-kit/releases/tag/v1.1.0
1196
- [1.0.1]: https://github.com/AzmSquad/squad-kit/releases/tag/v1.0.1
1197
- [1.0.0]: https://github.com/AzmSquad/squad-kit/releases/tag/v1.0.0
1198
- [0.6.0]: https://github.com/AzmSquad/squad-kit/releases/tag/v0.6.0
1199
- [0.5.0]: https://github.com/AzmSquad/squad-kit/releases/tag/v0.5.0
1200
- [0.3.0]: https://github.com/AzmSquad/Squad-Kit/releases/tag/v0.3.0
1201
- [0.2.2]: https://github.com/AzmSquad/squad-kit/compare/v0.2.1...v0.2.2
1202
- [0.2.1]: https://github.com/AzmSquad/squad-kit/compare/v0.2.0...v0.2.1
1203
- [0.2.0]: https://github.com/AzmSquad/squad-kit/compare/v0.1.0...v0.2.0
1204
- [0.1.0]: https://github.com/AzmSquad/squad-kit/releases/tag/v0.1.0