squad-kit 0.12.0 → 0.12.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +60 -0
- package/dist/cli.js +49 -8
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,66 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.12.2] — 2026-08-25
|
|
11
|
+
|
|
12
|
+
### Bug fixes
|
|
13
|
+
|
|
14
|
+
- **The planner never read any project files, then hung.** On the Agent SDK runtime a run reported
|
|
15
|
+
`reads 0/N`, the scout exhausted its turns without reaching `respond_with_scout_result`, the draft
|
|
16
|
+
produced a plan with no repo context, and the session then stalled indefinitely — the plan file was
|
|
17
|
+
written but the CLI and the console both kept spinning. Reported as
|
|
18
|
+
[#8](https://github.com/AzmSquad/Squad-Kit/issues/8). Two causes, both fixed:
|
|
19
|
+
|
|
20
|
+
1. **Every tool call is gated on a permission decision**, and the runtime supplied no handler. The
|
|
21
|
+
model emitted `tool_use` for `read_file` / `grep` / `list_dir` and nothing ever executed them.
|
|
22
|
+
The runtime now grants its own `mcp__squad-kit-*` tools and denies everything else, so a tool
|
|
23
|
+
the planner did not register can never run during planning.
|
|
24
|
+
2. **A claude.ai login carries the account's connectors into the session** as extra MCP servers
|
|
25
|
+
(Google Drive and friends), crowding the tool namespace the planner depends on — measured at 12
|
|
26
|
+
tools where the planner registers a handful. Planning now runs with `strictMcpConfig`, so it
|
|
27
|
+
sees only the tools squad-kit registers.
|
|
28
|
+
|
|
29
|
+
Verified on a real subscription run: `reads 0/25` and an indefinite hang before, `scout ✓` with
|
|
30
|
+
`reads 8/8` and a clean exit after.
|
|
31
|
+
|
|
32
|
+
**Scope.** Cause 2 needs a Claude subscription login and so only affects 0.12.x. Cause 1 is
|
|
33
|
+
auth-independent and dates to the Agent SDK runtime landing in **0.10.0**, so API-key users on
|
|
34
|
+
`planner.runtime.anthropic: agent-sdk` (the default for Anthropic) were most likely getting
|
|
35
|
+
context-free plans too. That inference follows from the mechanism; it has not been reproduced
|
|
36
|
+
against an API-key run.
|
|
37
|
+
|
|
38
|
+
### Internal
|
|
39
|
+
|
|
40
|
+
- Pinned `packageManager` to `pnpm@9.15.9` and removed the duplicate pin from the CI workflow.
|
|
41
|
+
Corepack had been resolving pnpm 11 locally, which re-added a `packageManager` field on every
|
|
42
|
+
invocation, generated a stray `pnpm-workspace.yaml`, and failed `pnpm install` on unapproved
|
|
43
|
+
esbuild build scripts — breaking `pnpm build`, `pnpm test`, and `npm publish` (whose
|
|
44
|
+
`prepublishOnly` runs all three). The lockfile has always been `lockfileVersion 9.0`.
|
|
45
|
+
|
|
46
|
+
## [0.12.1] — 2026-08-24
|
|
47
|
+
|
|
48
|
+
### Bug fixes
|
|
49
|
+
|
|
50
|
+
- `squad auth login` ended a **successful** browser login with
|
|
51
|
+
`could not verify the login (unknown)` and a warning that the credential "may
|
|
52
|
+
be invalid or expired". The token was fine. `accountInfo()` resolves from the
|
|
53
|
+
Agent SDK's `initialize` response, and for `CLAUDE_CODE_OAUTH_TOKEN` auth that
|
|
54
|
+
response carries `{tokenSource, apiProvider}` and **never** an account — for a
|
|
55
|
+
valid token exactly as much as for a bogus one. 0.12.0 treated a missing
|
|
56
|
+
account as a failed credential, which flagged every healthy login through the
|
|
57
|
+
primary documented flow.
|
|
58
|
+
|
|
59
|
+
The probe now separates three outcomes instead of two: an account came back
|
|
60
|
+
(verified, shown); a credential *source* came back without an account
|
|
61
|
+
(reported as resolved, with the honest caveat that token validity can only be
|
|
62
|
+
confirmed by an actual planning run); or nothing came back at all (still
|
|
63
|
+
treated as unverified). `squad auth login`'s summary and `squad doctor`'s
|
|
64
|
+
planner credential row both reflect which applies, and neither claims a
|
|
65
|
+
verification the SDK cannot perform.
|
|
66
|
+
|
|
67
|
+
Workspaces that authenticate through the OS credential store are unaffected —
|
|
68
|
+
those do report an account and are still verified as before.
|
|
69
|
+
|
|
10
70
|
## [0.12.0] — 2026-08-24
|
|
11
71
|
|
|
12
72
|
### What's new
|
package/dist/cli.js
CHANGED
|
@@ -1456,9 +1456,13 @@ function readAccount(raw) {
|
|
|
1456
1456
|
if (typeof o.organization === "string") account.organization = o.organization;
|
|
1457
1457
|
if (typeof o.subscriptionType === "string") account.subscriptionType = o.subscriptionType;
|
|
1458
1458
|
const apiKeySource = typeof o.apiKeySource === "string" ? o.apiKeySource : void 0;
|
|
1459
|
+
const tokenSource = typeof o.tokenSource === "string" ? o.tokenSource : void 0;
|
|
1460
|
+
const apiProvider = typeof o.apiProvider === "string" ? o.apiProvider : void 0;
|
|
1459
1461
|
return {
|
|
1460
1462
|
account: Object.keys(account).length > 0 ? account : void 0,
|
|
1461
|
-
apiKeySource
|
|
1463
|
+
apiKeySource,
|
|
1464
|
+
tokenSource,
|
|
1465
|
+
apiProvider
|
|
1462
1466
|
};
|
|
1463
1467
|
}
|
|
1464
1468
|
var EXPIRED_HINT = /expire|refresh|revoked|no longer valid/i;
|
|
@@ -1535,15 +1539,23 @@ async function probeClaudeAuth(auth2, opts = {}) {
|
|
|
1535
1539
|
detail: `The Claude auth check did not answer within ${timeoutMs}ms.`
|
|
1536
1540
|
};
|
|
1537
1541
|
}
|
|
1538
|
-
const { account, apiKeySource } = readAccount(info2);
|
|
1539
|
-
|
|
1542
|
+
const { account, apiKeySource, tokenSource, apiProvider } = readAccount(info2);
|
|
1543
|
+
const base = { ...apiKeySource ? { apiKeySource } : {}, ...account ? { account } : {} };
|
|
1544
|
+
if (auth2.mode !== "subscription") return { ok: true, ...base };
|
|
1545
|
+
if (account) return { ok: true, ...base };
|
|
1546
|
+
if (tokenSource || apiProvider) {
|
|
1540
1547
|
return {
|
|
1541
|
-
ok:
|
|
1542
|
-
|
|
1543
|
-
|
|
1548
|
+
ok: true,
|
|
1549
|
+
...base,
|
|
1550
|
+
...tokenSource ? { credentialSource: tokenSource } : {},
|
|
1551
|
+
unverifiable: `The Agent SDK resolved ${tokenSource ?? "a credential"}, but token auth reports no account, so its validity can only be confirmed by an actual planning run.`
|
|
1544
1552
|
};
|
|
1545
1553
|
}
|
|
1546
|
-
return {
|
|
1554
|
+
return {
|
|
1555
|
+
ok: false,
|
|
1556
|
+
kind: "unknown",
|
|
1557
|
+
detail: "The Claude login reported neither an account nor a credential source, so it could not be verified. Run `squad auth login` to sign in again."
|
|
1558
|
+
};
|
|
1547
1559
|
} catch (err2) {
|
|
1548
1560
|
return mapProbeFailure(err2, auth2);
|
|
1549
1561
|
} finally {
|
|
@@ -1894,6 +1906,12 @@ async function verifyAndSummarise(planner) {
|
|
|
1894
1906
|
warning(probe.detail);
|
|
1895
1907
|
return;
|
|
1896
1908
|
}
|
|
1909
|
+
if (probe.unverifiable) {
|
|
1910
|
+
spin.succeed("login stored");
|
|
1911
|
+
if (probe.credentialSource) kv("credential", probe.credentialSource, 15);
|
|
1912
|
+
info(probe.unverifiable);
|
|
1913
|
+
return;
|
|
1914
|
+
}
|
|
1897
1915
|
spin.succeed("login verified");
|
|
1898
1916
|
const account = [probe.account?.email, probe.account?.organization, probe.account?.subscriptionType].filter(Boolean).join(" \xB7 ");
|
|
1899
1917
|
if (account) kv("account", account, 15);
|
|
@@ -7196,6 +7214,13 @@ async function readSdkAccountInfo(q) {
|
|
|
7196
7214
|
if (timer) clearTimeout(timer);
|
|
7197
7215
|
}
|
|
7198
7216
|
}
|
|
7217
|
+
var SQUAD_MCP_TOOL_PREFIX = "mcp__squad-kit-";
|
|
7218
|
+
function allowOnlySquadKitTools() {
|
|
7219
|
+
return async (toolName, input5) => toolName.startsWith(SQUAD_MCP_TOOL_PREFIX) ? { behavior: "allow", updatedInput: input5 } : {
|
|
7220
|
+
behavior: "deny",
|
|
7221
|
+
message: `The squad-kit planner may only call its own tools; refusing ${toolName}.`
|
|
7222
|
+
};
|
|
7223
|
+
}
|
|
7199
7224
|
var AgentSdkRuntime = class {
|
|
7200
7225
|
constructor(modelId, auth2) {
|
|
7201
7226
|
this.modelId = modelId;
|
|
@@ -7295,6 +7320,11 @@ var AgentSdkRuntime = class {
|
|
|
7295
7320
|
includePartialMessages: true,
|
|
7296
7321
|
persistSession: false,
|
|
7297
7322
|
settingSources: [],
|
|
7323
|
+
// A claude.ai login carries the user's connectors (Drive, etc.) into the session: they show up
|
|
7324
|
+
// as extra MCP servers and crowd the tool namespace the planner depends on. Planning must see
|
|
7325
|
+
// only the tools squad-kit registers.
|
|
7326
|
+
strictMcpConfig: true,
|
|
7327
|
+
canUseTool: allowOnlySquadKitTools(),
|
|
7298
7328
|
abortController: ac,
|
|
7299
7329
|
env: buildSdkEnv(this.auth),
|
|
7300
7330
|
thinking,
|
|
@@ -7424,6 +7454,11 @@ var AgentSdkRuntime = class {
|
|
|
7424
7454
|
includePartialMessages: true,
|
|
7425
7455
|
persistSession: false,
|
|
7426
7456
|
settingSources: [],
|
|
7457
|
+
// A claude.ai login carries the user's connectors (Drive, etc.) into the session: they show up
|
|
7458
|
+
// as extra MCP servers and crowd the tool namespace the planner depends on. Planning must see
|
|
7459
|
+
// only the tools squad-kit registers.
|
|
7460
|
+
strictMcpConfig: true,
|
|
7461
|
+
canUseTool: allowOnlySquadKitTools(),
|
|
7427
7462
|
env: buildSdkEnv(this.auth),
|
|
7428
7463
|
thinking,
|
|
7429
7464
|
effort
|
|
@@ -9064,7 +9099,13 @@ function describeProbeAccount(probe) {
|
|
|
9064
9099
|
const bits = [];
|
|
9065
9100
|
const email = probe.account?.email;
|
|
9066
9101
|
const plan = probe.account?.subscriptionType;
|
|
9067
|
-
|
|
9102
|
+
if (email) {
|
|
9103
|
+
bits.push(`signed in as ${email}${plan ? ` (${plan})` : ""}`);
|
|
9104
|
+
} else if (probe.unverifiable) {
|
|
9105
|
+
bits.push(`credential resolved (${probe.credentialSource ?? "token auth"}) \xB7 not verifiable without a run`);
|
|
9106
|
+
} else {
|
|
9107
|
+
bits.push("Claude login verified");
|
|
9108
|
+
}
|
|
9068
9109
|
if (probe.account?.organization) bits.push(probe.account.organization);
|
|
9069
9110
|
if (probe.apiKeySource) bits.push(`apiKeySource=${probe.apiKeySource}`);
|
|
9070
9111
|
return bits.join(" \xB7 ");
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "squad-kit",
|
|
3
|
-
"version": "0.12.
|
|
3
|
+
"version": "0.12.2",
|
|
4
4
|
"author": "Momen Yasser <momenysr@gmail.com>",
|
|
5
5
|
"description": "Plan once, execute cheap. A token-efficient, 3-step SDD workflow CLI (stories → plans → implementation).",
|
|
6
6
|
"keywords": [
|
|
@@ -87,5 +87,5 @@
|
|
|
87
87
|
"bugs": {
|
|
88
88
|
"url": "https://github.com/AzmSquad/squad-kit/issues"
|
|
89
89
|
},
|
|
90
|
-
"packageManager": "pnpm@
|
|
90
|
+
"packageManager": "pnpm@9.15.9"
|
|
91
91
|
}
|