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 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
- if (auth2.mode === "subscription" && !account && !apiKeySource) {
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: false,
1542
- kind: "unknown",
1543
- detail: "The Claude login did not report an account, so it could not be verified. The credential may be invalid or expired \u2014 run `squad auth login` to sign in again."
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 { ok: true, ...apiKeySource ? { apiKeySource } : {}, ...account ? { account } : {} };
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
- bits.push(email ? `signed in as ${email}${plan ? ` (${plan})` : ""}` : "Claude login verified");
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.0",
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@11.1.2+sha512.415a1cc25974731e75455c1468371be74c5aa5fb7621b50d4056d222451609f11412f23fd602e6169f1e060466641f798597e1be961a10688836a67b16569499"
90
+ "packageManager": "pnpm@9.15.9"
91
91
  }