@bradygaster/squad-cli 0.9.6-insider.2 → 0.10.0

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 (174) hide show
  1. package/dist/cli/commands/copilot-bridge.d.ts.map +1 -1
  2. package/dist/cli/commands/copilot-bridge.js +5 -1
  3. package/dist/cli/commands/copilot-bridge.js.map +1 -1
  4. package/dist/cli/commands/doctor.d.ts +6 -0
  5. package/dist/cli/commands/doctor.d.ts.map +1 -1
  6. package/dist/cli/commands/doctor.js +120 -5
  7. package/dist/cli/commands/doctor.js.map +1 -1
  8. package/dist/cli/commands/export.d.ts +7 -3
  9. package/dist/cli/commands/export.d.ts.map +1 -1
  10. package/dist/cli/commands/export.js +68 -16
  11. package/dist/cli/commands/export.js.map +1 -1
  12. package/dist/cli/commands/import.d.ts +7 -3
  13. package/dist/cli/commands/import.d.ts.map +1 -1
  14. package/dist/cli/commands/import.js +140 -42
  15. package/dist/cli/commands/import.js.map +1 -1
  16. package/dist/cli/commands/install-hooks.d.ts.map +1 -1
  17. package/dist/cli/commands/install-hooks.js +50 -5
  18. package/dist/cli/commands/install-hooks.js.map +1 -1
  19. package/dist/cli/commands/link.d.ts.map +1 -1
  20. package/dist/cli/commands/link.js +7 -1
  21. package/dist/cli/commands/link.js.map +1 -1
  22. package/dist/cli/commands/loop.d.ts.map +1 -1
  23. package/dist/cli/commands/loop.js +7 -5
  24. package/dist/cli/commands/loop.js.map +1 -1
  25. package/dist/cli/commands/memory.d.ts +2 -0
  26. package/dist/cli/commands/memory.d.ts.map +1 -0
  27. package/dist/cli/commands/memory.js +304 -0
  28. package/dist/cli/commands/memory.js.map +1 -0
  29. package/dist/cli/commands/migrate-backend.d.ts +36 -5
  30. package/dist/cli/commands/migrate-backend.d.ts.map +1 -1
  31. package/dist/cli/commands/migrate-backend.js +250 -40
  32. package/dist/cli/commands/migrate-backend.js.map +1 -1
  33. package/dist/cli/commands/notes.d.ts +27 -0
  34. package/dist/cli/commands/notes.d.ts.map +1 -0
  35. package/dist/cli/commands/notes.js +222 -0
  36. package/dist/cli/commands/notes.js.map +1 -0
  37. package/dist/cli/commands/plugin.d.ts.map +1 -1
  38. package/dist/cli/commands/plugin.js +423 -8
  39. package/dist/cli/commands/plugin.js.map +1 -1
  40. package/dist/cli/commands/skill.d.ts +31 -0
  41. package/dist/cli/commands/skill.d.ts.map +1 -0
  42. package/dist/cli/commands/skill.js +497 -0
  43. package/dist/cli/commands/skill.js.map +1 -0
  44. package/dist/cli/commands/start.d.ts.map +1 -1
  45. package/dist/cli/commands/start.js +9 -1
  46. package/dist/cli/commands/start.js.map +1 -1
  47. package/dist/cli/commands/state-mcp.d.ts +25 -0
  48. package/dist/cli/commands/state-mcp.d.ts.map +1 -0
  49. package/dist/cli/commands/state-mcp.js +168 -0
  50. package/dist/cli/commands/state-mcp.js.map +1 -0
  51. package/dist/cli/commands/watch/agent-spawn.d.ts +62 -0
  52. package/dist/cli/commands/watch/agent-spawn.d.ts.map +1 -0
  53. package/dist/cli/commands/watch/agent-spawn.js +127 -0
  54. package/dist/cli/commands/watch/agent-spawn.js.map +1 -0
  55. package/dist/cli/commands/watch/capabilities/board.d.ts.map +1 -1
  56. package/dist/cli/commands/watch/capabilities/board.js +2 -1
  57. package/dist/cli/commands/watch/capabilities/board.js.map +1 -1
  58. package/dist/cli/commands/watch/capabilities/decision-hygiene.d.ts.map +1 -1
  59. package/dist/cli/commands/watch/capabilities/decision-hygiene.js +3 -2
  60. package/dist/cli/commands/watch/capabilities/decision-hygiene.js.map +1 -1
  61. package/dist/cli/commands/watch/capabilities/execute.d.ts.map +1 -1
  62. package/dist/cli/commands/watch/capabilities/execute.js +14 -2
  63. package/dist/cli/commands/watch/capabilities/execute.js.map +1 -1
  64. package/dist/cli/commands/watch/capabilities/index.d.ts.map +1 -1
  65. package/dist/cli/commands/watch/capabilities/index.js +2 -0
  66. package/dist/cli/commands/watch/capabilities/index.js.map +1 -1
  67. package/dist/cli/commands/watch/capabilities/monitor-email.d.ts +1 -1
  68. package/dist/cli/commands/watch/capabilities/monitor-email.d.ts.map +1 -1
  69. package/dist/cli/commands/watch/capabilities/monitor-email.js +21 -4
  70. package/dist/cli/commands/watch/capabilities/monitor-email.js.map +1 -1
  71. package/dist/cli/commands/watch/capabilities/monitor-teams.d.ts +1 -1
  72. package/dist/cli/commands/watch/capabilities/monitor-teams.d.ts.map +1 -1
  73. package/dist/cli/commands/watch/capabilities/monitor-teams.js +21 -5
  74. package/dist/cli/commands/watch/capabilities/monitor-teams.js.map +1 -1
  75. package/dist/cli/commands/watch/capabilities/notes-promote.d.ts +11 -0
  76. package/dist/cli/commands/watch/capabilities/notes-promote.d.ts.map +1 -0
  77. package/dist/cli/commands/watch/capabilities/notes-promote.js +124 -0
  78. package/dist/cli/commands/watch/capabilities/notes-promote.js.map +1 -0
  79. package/dist/cli/commands/watch/capabilities/retro.d.ts.map +1 -1
  80. package/dist/cli/commands/watch/capabilities/retro.js +3 -2
  81. package/dist/cli/commands/watch/capabilities/retro.js.map +1 -1
  82. package/dist/cli/commands/watch/capabilities/wave-dispatch.d.ts.map +1 -1
  83. package/dist/cli/commands/watch/capabilities/wave-dispatch.js +2 -1
  84. package/dist/cli/commands/watch/capabilities/wave-dispatch.js.map +1 -1
  85. package/dist/cli/commands/watch/index.d.ts.map +1 -1
  86. package/dist/cli/commands/watch/index.js +16 -12
  87. package/dist/cli/commands/watch/index.js.map +1 -1
  88. package/dist/cli/core/cast.d.ts.map +1 -1
  89. package/dist/cli/core/cast.js +132 -1
  90. package/dist/cli/core/cast.js.map +1 -1
  91. package/dist/cli/core/command-help.d.ts +44 -0
  92. package/dist/cli/core/command-help.d.ts.map +1 -0
  93. package/dist/cli/core/command-help.js +401 -0
  94. package/dist/cli/core/command-help.js.map +1 -0
  95. package/dist/cli/core/copilot-invocation.d.ts +57 -0
  96. package/dist/cli/core/copilot-invocation.d.ts.map +1 -0
  97. package/dist/cli/core/copilot-invocation.js +84 -0
  98. package/dist/cli/core/copilot-invocation.js.map +1 -0
  99. package/dist/cli/core/effective-squad-dir.d.ts +33 -0
  100. package/dist/cli/core/effective-squad-dir.d.ts.map +1 -0
  101. package/dist/cli/core/effective-squad-dir.js +37 -0
  102. package/dist/cli/core/effective-squad-dir.js.map +1 -0
  103. package/dist/cli/core/init.d.ts +2 -0
  104. package/dist/cli/core/init.d.ts.map +1 -1
  105. package/dist/cli/core/init.js +74 -1
  106. package/dist/cli/core/init.js.map +1 -1
  107. package/dist/cli/core/mcp-root.d.ts +60 -0
  108. package/dist/cli/core/mcp-root.d.ts.map +1 -0
  109. package/dist/cli/core/mcp-root.js +124 -0
  110. package/dist/cli/core/mcp-root.js.map +1 -0
  111. package/dist/cli/core/mcp-spec.d.ts +48 -0
  112. package/dist/cli/core/mcp-spec.d.ts.map +1 -0
  113. package/dist/cli/core/mcp-spec.js +61 -0
  114. package/dist/cli/core/mcp-spec.js.map +1 -0
  115. package/dist/cli/core/npm-registry.d.ts +25 -0
  116. package/dist/cli/core/npm-registry.d.ts.map +1 -0
  117. package/dist/cli/core/npm-registry.js +65 -0
  118. package/dist/cli/core/npm-registry.js.map +1 -0
  119. package/dist/cli/core/templates.d.ts.map +1 -1
  120. package/dist/cli/core/templates.js +52 -16
  121. package/dist/cli/core/templates.js.map +1 -1
  122. package/dist/cli/core/upgrade.d.ts +5 -0
  123. package/dist/cli/core/upgrade.d.ts.map +1 -1
  124. package/dist/cli/core/upgrade.js +231 -12
  125. package/dist/cli/core/upgrade.js.map +1 -1
  126. package/dist/cli/index.d.ts +1 -0
  127. package/dist/cli/index.d.ts.map +1 -1
  128. package/dist/cli/index.js +1 -0
  129. package/dist/cli/index.js.map +1 -1
  130. package/dist/cli/shell/components/App.js +1 -1
  131. package/dist/cli/shell/components/App.js.map +1 -1
  132. package/dist/cli/shell/components/MessageStream.js +2 -2
  133. package/dist/cli/shell/components/MessageStream.js.map +1 -1
  134. package/dist/cli/shell/coordinator.d.ts.map +1 -1
  135. package/dist/cli/shell/coordinator.js +11 -5
  136. package/dist/cli/shell/coordinator.js.map +1 -1
  137. package/dist/cli/shell/index.d.ts.map +1 -1
  138. package/dist/cli/shell/index.js +14 -7
  139. package/dist/cli/shell/index.js.map +1 -1
  140. package/dist/cli/shell/lifecycle.d.ts.map +1 -1
  141. package/dist/cli/shell/lifecycle.js +12 -7
  142. package/dist/cli/shell/lifecycle.js.map +1 -1
  143. package/dist/cli/shell/session-store.d.ts +4 -4
  144. package/dist/cli/shell/session-store.d.ts.map +1 -1
  145. package/dist/cli/shell/session-store.js +11 -11
  146. package/dist/cli/shell/session-store.js.map +1 -1
  147. package/dist/cli-entry.js +162 -50
  148. package/dist/cli-entry.js.map +1 -1
  149. package/package.json +7 -3
  150. package/scripts/patch-esm-imports.mjs +3 -1
  151. package/templates/after-agent-reference.md +64 -0
  152. package/templates/ceremony-reference.md +82 -0
  153. package/templates/client-compatibility-reference.md +46 -0
  154. package/templates/copilot-agent.md +96 -0
  155. package/templates/copilot-instructions.md +14 -0
  156. package/templates/model-selection-reference.md +101 -0
  157. package/templates/prd-intake.md +105 -0
  158. package/templates/rai-charter.md +110 -0
  159. package/templates/rai-policy.md +103 -0
  160. package/templates/ralph-reference.md +141 -0
  161. package/templates/routing.md +1 -0
  162. package/templates/scribe-charter.md +18 -151
  163. package/templates/session-init-reference.md +199 -0
  164. package/templates/skills/e2e-template-testing/SKILL.md +557 -0
  165. package/templates/skills/fact-checking/SKILL.md +61 -0
  166. package/templates/skills/squad-commands/SKILL.md +303 -0
  167. package/templates/skills/squad-version-check/SKILL.md +160 -0
  168. package/templates/spawn-reference.md +131 -0
  169. package/templates/squad.agent.md.template +200 -625
  170. package/templates/workflow-wiring-appendix-a-code-reviewer.md +131 -0
  171. package/templates/workflow-wiring-appendix-b-documenter.md +140 -0
  172. package/templates/workflow-wiring-guide.md +276 -0
  173. package/templates/workflows/squad-heartbeat.yml +167 -167
  174. package/templates/worktree-reference.md +126 -0
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Lightweight helper to check whether a specific package version exists in the
3
+ * public npm registry. Used by `ensureSquadStateMcpPinned` to avoid pinning a
4
+ * `squad_state` MCP launch spec to a version that `npx` cannot resolve
5
+ * (which would cause an ETARGET at session start and leave the bridge unwired).
6
+ *
7
+ * The result is cached per-process to avoid repeated lookups across the
8
+ * multi-pass upgrade flow. Network failures and non-200 responses are
9
+ * conservatively treated as "version not published" so that we fall back to
10
+ * the locally-installed binary rather than pinning a bad spec.
11
+ *
12
+ * See `.squad/files/validation/MCP-LOADER-ROOT-CAUSE.md` (data-15 Option A).
13
+ */
14
+ const cache = new Map();
15
+ /** Reset the cache (test-only helper). */
16
+ export function _resetNpmRegistryCache() {
17
+ cache.clear();
18
+ }
19
+ /**
20
+ * Returns true if `@bradygaster/squad-cli@<version>` is reachable on the npm
21
+ * registry, false on any network failure / 404 / non-publishable response.
22
+ *
23
+ * Uses Node's built-in `https` so we don't pull in extra deps. Total budget
24
+ * is bounded by `timeoutMs` (default 2s) so a slow / offline registry can
25
+ * never block CLI startup.
26
+ */
27
+ export async function isSquadCliVersionPublished(version, timeoutMs = 2000) {
28
+ if (!version || version === '0.0.0')
29
+ return false;
30
+ const cacheKey = version;
31
+ const cached = cache.get(cacheKey);
32
+ if (cached !== undefined)
33
+ return cached;
34
+ const url = `https://registry.npmjs.org/@bradygaster%2Fsquad-cli/${encodeURIComponent(version)}`;
35
+ const ok = await new Promise((resolve) => {
36
+ let settled = false;
37
+ const finish = (v) => {
38
+ if (settled)
39
+ return;
40
+ settled = true;
41
+ resolve(v);
42
+ };
43
+ const timer = setTimeout(() => finish(false), timeoutMs);
44
+ void import('node:https')
45
+ .then(({ request }) => {
46
+ const req = request(url, { method: 'GET' }, (res) => {
47
+ // Drain to free the socket.
48
+ res.resume();
49
+ finish(res.statusCode === 200);
50
+ });
51
+ req.on('error', () => finish(false));
52
+ req.on('timeout', () => {
53
+ req.destroy();
54
+ finish(false);
55
+ });
56
+ req.setTimeout(timeoutMs);
57
+ req.end();
58
+ })
59
+ .catch(() => finish(false))
60
+ .finally(() => clearTimeout(timer));
61
+ });
62
+ cache.set(cacheKey, ok);
63
+ return ok;
64
+ }
65
+ //# sourceMappingURL=npm-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"npm-registry.js","sourceRoot":"","sources":["../../../src/cli/core/npm-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,MAAM,KAAK,GAAG,IAAI,GAAG,EAAmB,CAAC;AAEzC,0CAA0C;AAC1C,MAAM,UAAU,sBAAsB;IACpC,KAAK,CAAC,KAAK,EAAE,CAAC;AAChB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,OAAe,EACf,SAAS,GAAG,IAAI;IAEhB,IAAI,CAAC,OAAO,IAAI,OAAO,KAAK,OAAO;QAAE,OAAO,KAAK,CAAC;IAClD,MAAM,QAAQ,GAAG,OAAO,CAAC;IACzB,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACnC,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC;IAExC,MAAM,GAAG,GAAG,uDAAuD,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC;IACjG,MAAM,EAAE,GAAG,MAAM,IAAI,OAAO,CAAU,CAAC,OAAO,EAAE,EAAE;QAChD,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,MAAM,MAAM,GAAG,CAAC,CAAU,EAAE,EAAE;YAC5B,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,OAAO,CAAC,CAAC,CAAC,CAAC;QACb,CAAC,CAAC;QACF,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC,CAAC;QAEzD,KAAK,MAAM,CAAC,YAAY,CAAC;aACtB,IAAI,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE;YACpB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE;gBAClD,4BAA4B;gBAC5B,GAAG,CAAC,MAAM,EAAE,CAAC;gBACb,MAAM,CAAC,GAAG,CAAC,UAAU,KAAK,GAAG,CAAC,CAAC;YACjC,CAAC,CAAC,CAAC;YACH,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YACrC,GAAG,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;gBACrB,GAAG,CAAC,OAAO,EAAE,CAAC;gBACd,MAAM,CAAC,KAAK,CAAC,CAAC;YAChB,CAAC,CAAC,CAAC;YACH,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;YAC1B,GAAG,CAAC,GAAG,EAAE,CAAC;QACZ,CAAC,CAAC;aACD,KAAK,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;aAC1B,OAAO,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IACxB,OAAO,EAAE,CAAC;AACZ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../../src/cli/core/templates.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,+BAA+B;AAC/B,MAAM,WAAW,YAAY;IAC3B,yCAAyC;IACzC,MAAM,EAAE,MAAM,CAAC;IACf,qDAAqD;IACrD,WAAW,EAAE,MAAM,CAAC;IACpB,yDAAyD;IACzD,kBAAkB,EAAE,OAAO,CAAC;IAC5B,8BAA8B;IAC9B,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB,EAAE,YAAY,EA4Q3C,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAWxC"}
1
+ {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../../src/cli/core/templates.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,+BAA+B;AAC/B,MAAM,WAAW,YAAY;IAC3B,yCAAyC;IACzC,MAAM,EAAE,MAAM,CAAC;IACf,qDAAqD;IACrD,WAAW,EAAE,MAAM,CAAC;IACpB,yDAAyD;IACzD,kBAAkB,EAAE,OAAO,CAAC;IAC5B,8BAA8B;IAC9B,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB,EAAE,YAAY,EAiT3C,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAWxC"}
@@ -22,6 +22,9 @@ export const TEMPLATE_MANIFEST = [
22
22
  description: 'Squad coordinator agent prompt',
23
23
  },
24
24
  // Casting system (squad-owned, overwrite on upgrade)
25
+ // NOTE: These JSON files are read at runtime by the SDK and many agent
26
+ // skills via their flat `.squad/casting-*.json` paths — do NOT route into
27
+ // a subdirectory without coordinated updates across the SDK + skill docs.
25
28
  {
26
29
  source: 'casting-history.json',
27
30
  destination: 'casting-history.json',
@@ -40,88 +43,102 @@ export const TEMPLATE_MANIFEST = [
40
43
  overwriteOnUpgrade: true,
41
44
  description: 'Universe-based character registry',
42
45
  },
43
- // Template files (squad-owned, overwrite on upgrade)
46
+ // Template files (squad-owned, overwrite on upgrade) — routed to
47
+ // .squad/templates/ so upgrade doesn't dump ~20 generic *.md docs
48
+ // into the .squad/ root.
44
49
  {
45
50
  source: 'charter.md',
46
- destination: 'charter.md',
51
+ destination: 'templates/charter.md',
47
52
  overwriteOnUpgrade: true,
48
53
  description: 'Agent charter template',
49
54
  },
50
55
  {
51
56
  source: 'constraint-tracking.md',
52
- destination: 'constraint-tracking.md',
57
+ destination: 'templates/constraint-tracking.md',
53
58
  overwriteOnUpgrade: true,
54
59
  description: 'Constraint tracking template',
55
60
  },
56
61
  {
57
62
  source: 'copilot-instructions.md',
58
- destination: 'copilot-instructions.md',
63
+ destination: 'templates/copilot-instructions.md',
59
64
  overwriteOnUpgrade: true,
60
65
  description: 'Copilot instructions template',
61
66
  },
62
67
  {
63
68
  source: 'history.md',
64
- destination: 'history.md',
69
+ destination: 'templates/history.md',
65
70
  overwriteOnUpgrade: true,
66
71
  description: 'Agent history template',
67
72
  },
68
73
  {
69
74
  source: 'mcp-config.md',
70
- destination: 'mcp-config.md',
75
+ destination: 'templates/mcp-config.md',
71
76
  overwriteOnUpgrade: true,
72
77
  description: 'MCP configuration template',
73
78
  },
74
79
  {
75
80
  source: 'multi-agent-format.md',
76
- destination: 'multi-agent-format.md',
81
+ destination: 'templates/multi-agent-format.md',
77
82
  overwriteOnUpgrade: true,
78
83
  description: 'Multi-agent format specification',
79
84
  },
80
85
  {
81
86
  source: 'orchestration-log.md',
82
- destination: 'orchestration-log.md',
87
+ destination: 'templates/orchestration-log.md',
83
88
  overwriteOnUpgrade: true,
84
89
  description: 'Orchestration log template',
85
90
  },
86
91
  {
87
92
  source: 'plugin-marketplace.md',
88
- destination: 'plugin-marketplace.md',
93
+ destination: 'templates/plugin-marketplace.md',
89
94
  overwriteOnUpgrade: true,
90
95
  description: 'Plugin marketplace template',
91
96
  },
92
97
  {
93
98
  source: 'raw-agent-output.md',
94
- destination: 'raw-agent-output.md',
99
+ destination: 'templates/raw-agent-output.md',
95
100
  overwriteOnUpgrade: true,
96
101
  description: 'Raw agent output template',
97
102
  },
98
103
  {
99
104
  source: 'roster.md',
100
- destination: 'roster.md',
105
+ destination: 'templates/roster.md',
101
106
  overwriteOnUpgrade: true,
102
107
  description: 'Team roster template',
103
108
  },
104
109
  {
105
110
  source: 'run-output.md',
106
- destination: 'run-output.md',
111
+ destination: 'templates/run-output.md',
107
112
  overwriteOnUpgrade: true,
108
113
  description: 'Run output template',
109
114
  },
110
115
  {
111
116
  source: 'scribe-charter.md',
112
- destination: 'scribe-charter.md',
117
+ destination: 'templates/scribe-charter.md',
113
118
  overwriteOnUpgrade: true,
114
119
  description: 'Scribe charter template',
115
120
  },
121
+ {
122
+ source: 'Rai-charter.md',
123
+ destination: 'templates/Rai-charter.md',
124
+ overwriteOnUpgrade: true,
125
+ description: 'Rai RAI reviewer charter template',
126
+ },
127
+ {
128
+ source: 'rai-policy.md',
129
+ destination: 'templates/rai-policy.md',
130
+ overwriteOnUpgrade: true,
131
+ description: 'Default RAI policy template',
132
+ },
116
133
  {
117
134
  source: 'fact-checker-charter.md',
118
- destination: 'fact-checker-charter.md',
135
+ destination: 'templates/fact-checker-charter.md',
119
136
  overwriteOnUpgrade: true,
120
137
  description: 'Fact checker charter template',
121
138
  },
122
139
  {
123
140
  source: 'skill.md',
124
- destination: 'skill.md',
141
+ destination: 'templates/skill.md',
125
142
  overwriteOnUpgrade: true,
126
143
  description: 'Skill definition template',
127
144
  },
@@ -154,7 +171,7 @@ export const TEMPLATE_MANIFEST = [
154
171
  // Issue lifecycle (squad-owned)
155
172
  {
156
173
  source: 'issue-lifecycle.md',
157
- destination: 'issue-lifecycle.md',
174
+ destination: 'templates/issue-lifecycle.md',
158
175
  overwriteOnUpgrade: true,
159
176
  description: 'Issue lifecycle process template',
160
177
  },
@@ -207,6 +224,25 @@ export const TEMPLATE_MANIFEST = [
207
224
  overwriteOnUpgrade: true,
208
225
  description: 'Multi-agent collaboration and handoff patterns',
209
226
  },
227
+ {
228
+ source: 'skills/squad-commands/SKILL.md',
229
+ destination: '../.copilot/skills/squad-commands/SKILL.md',
230
+ overwriteOnUpgrade: true,
231
+ description: 'In-chat command discovery — categorized menu of Squad operations',
232
+ },
233
+ {
234
+ source: 'skills/squad-version-check/SKILL.md',
235
+ destination: '../.copilot/skills/squad-version-check/SKILL.md',
236
+ overwriteOnUpgrade: true,
237
+ description: 'Squad CLI internals — version stamping & upgrade mechanics',
238
+ },
239
+ // Session init reference (squad-owned, coordinator reads at session start)
240
+ {
241
+ source: 'session-init-reference.md',
242
+ destination: 'templates/session-init-reference.md',
243
+ overwriteOnUpgrade: true,
244
+ description: 'Session init reference — coordinator procedures run at session start',
245
+ },
210
246
  // Workflows (squad-owned, overwrite on upgrade)
211
247
  {
212
248
  source: 'workflows/squad-ci.yml',
@@ -1 +1 @@
1
- {"version":3,"file":"templates.js","sourceRoot":"","sources":["../../../src/cli/core/templates.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"templates.js","sourceRoot":"","sources":["../../../src/cli/core/templates.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,8 @@
3
3
  * Zero-dep implementation using Node.js stdlib only
4
4
  * @module cli/core/upgrade
5
5
  */
6
+ import { type SquadStateMcpSpec } from './mcp-spec.js';
7
+ export { resolveSquadStateMcpSpec } from './mcp-spec.js';
6
8
  export interface UpgradeOptions {
7
9
  migrateDirectory?: boolean;
8
10
  self?: boolean;
@@ -35,6 +37,9 @@ export declare function ensureDirectories(dest: string): string[];
35
37
  * available, falling back to inline JSON defaults.
36
38
  */
37
39
  export declare function ensureCastingDefaults(dest: string, templatesDir?: string): string[];
40
+ /** Human-readable single-line description of an McpSpec for success() messages. */
41
+ export declare function describeMcpSpec(spec: SquadStateMcpSpec): string;
42
+ export declare function ensureMemoryGovernanceUpgradeDefaults(dest: string): string[];
38
43
  /**
39
44
  * Run the upgrade command
40
45
  */
@@ -1 +1 @@
1
- {"version":3,"file":"upgrade.d.ts","sourceRoot":"","sources":["../../../src/cli/core/upgrade.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA4BH,MAAM,WAAW,cAAc;IAC7B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,2EAA2E;IAC3E,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAyPD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAyB1D;AAkBD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAkBtD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAUxD;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CA+CnF;AAoGD;;GAEG;AACH,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,UAAU,CAAC,CAoKhG;AAMD,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAiBD;;;;;;GAMG;AACH,wBAAsB,cAAc,CAAC,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CAkCpF"}
1
+ {"version":3,"file":"upgrade.d.ts","sourceRoot":"","sources":["../../../src/cli/core/upgrade.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAYH,OAAO,EAA4B,KAAK,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACjF,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AA0GzD,MAAM,WAAW,cAAc;IAC7B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,2EAA2E;IAC3E,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAyTD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAyB1D;AAkBD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAkBtD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAUxD;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CA+CnF;AA8HD,mFAAmF;AACnF,wBAAgB,eAAe,CAAC,IAAI,EAAE,iBAAiB,GAAG,MAAM,CAI/D;AAED,wBAAgB,qCAAqC,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAsC5E;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,UAAU,CAAC,CAqKhG;AAMD,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAiBD;;;;;;GAMG;AACH,wBAAsB,cAAc,CAAC,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CAkDpF"}
@@ -4,6 +4,7 @@
4
4
  * @module cli/core/upgrade
5
5
  */
6
6
  import path from 'node:path';
7
+ import { execFileSync } from 'node:child_process';
7
8
  import { FSStorageProvider } from '@bradygaster/squad-sdk';
8
9
  import { success, warn, info, dim } from './output.js';
9
10
  import { fatal } from './errors.js';
@@ -11,7 +12,79 @@ import { detectSquadDir } from './detect-squad-dir.js';
11
12
  import { TEMPLATE_MANIFEST, getTemplatesDir } from './templates.js';
12
13
  import { runMigrations } from './migrations.js';
13
14
  import { getPackageVersion, stampVersion, readInstalledVersion } from './version.js';
15
+ import { resolveSquadStateMcpSpec } from './mcp-spec.js';
16
+ export { resolveSquadStateMcpSpec } from './mcp-spec.js';
17
+ import { ensureSquadStateMcpInRoot, tombstoneStaleSquadStateInProjectMcp } from './mcp-root.js';
14
18
  const storage = new FSStorageProvider();
19
+ function buildMcpServerSpecs(isGitHub, cliVersion) {
20
+ // Pin the squad-cli package to the currently-installed CLI version so that
21
+ // `npx -y @bradygaster/squad-cli state-mcp` does NOT silently resolve to the
22
+ // npm `latest` dist-tag (which may predate the `state-mcp` command and thus
23
+ // expose zero tools to Copilot — see MCP-BRIDGE-BROKEN root cause).
24
+ const pkgSpec = cliVersion && cliVersion !== '0.0.0'
25
+ ? `@bradygaster/squad-cli@${cliVersion}`
26
+ : '@bradygaster/squad-cli';
27
+ const servers = [
28
+ {
29
+ name: 'squad_state',
30
+ command: 'npx',
31
+ args: ['-y', pkgSpec, 'state-mcp'],
32
+ },
33
+ ];
34
+ servers.push(isGitHub
35
+ ? {
36
+ name: 'EXAMPLE-github',
37
+ command: 'npx',
38
+ args: ['-y', '@anthropic/github-mcp-server'],
39
+ env: { GITHUB_TOKEN: '${GITHUB_TOKEN}' },
40
+ }
41
+ : {
42
+ name: 'EXAMPLE-azure-devops',
43
+ command: 'npx',
44
+ args: ['-y', '@azure/devops-mcp-server'],
45
+ env: {
46
+ AZURE_DEVOPS_ORG: '${AZURE_DEVOPS_ORG}',
47
+ AZURE_DEVOPS_PAT: '${AZURE_DEVOPS_PAT}',
48
+ },
49
+ });
50
+ return servers;
51
+ }
52
+ function yamlSingleQuoted(value) {
53
+ return `'${value.replace(/'/g, "''")}'`;
54
+ }
55
+ function yamlEnvValue(value) {
56
+ if (/^\$\{[A-Z0-9_]+\}$/.test(value)) {
57
+ return value;
58
+ }
59
+ return `"${value.replace(/\\/g, '\\\\').replace(/"/g, '\\"')}"`;
60
+ }
61
+ function buildMcpFrontmatterBlock(isGitHub, cliVersion) {
62
+ const lines = ['mcp-servers:'];
63
+ for (const server of buildMcpServerSpecs(isGitHub, cliVersion)) {
64
+ lines.push(` ${server.name}:`);
65
+ lines.push(' type: local');
66
+ lines.push(` command: ${server.command}`);
67
+ lines.push(` args: [${server.args.map(yamlSingleQuoted).join(', ')}]`);
68
+ lines.push(' tools: ["*"]');
69
+ if (server.env && Object.keys(server.env).length > 0) {
70
+ lines.push(' env:');
71
+ for (const [key, value] of Object.entries(server.env)) {
72
+ lines.push(` ${key}: ${yamlEnvValue(value)}`);
73
+ }
74
+ }
75
+ }
76
+ return lines.join('\n');
77
+ }
78
+ function injectMcpFrontmatter(content, isGitHub, cliVersion) {
79
+ const closingStart = content.indexOf('\n---', 4);
80
+ if (!content.startsWith('---') || closingStart === -1) {
81
+ return content;
82
+ }
83
+ return content.slice(0, closingStart)
84
+ + '\n'
85
+ + buildMcpFrontmatterBlock(isGitHub, cliVersion)
86
+ + content.slice(closingStart);
87
+ }
15
88
  function copyDirRecursive(src, dest, force = true) {
16
89
  storage.mkdirSync(dest, { recursive: true });
17
90
  for (const entry of storage.listSync(src)) {
@@ -49,6 +122,64 @@ function compareSemver(a, b) {
49
122
  return a < b ? -1 : a > b ? 1 : 0;
50
123
  return 0;
51
124
  }
125
+ function readSquadConfig(squadDir) {
126
+ const configPath = path.join(squadDir, 'config.json');
127
+ if (!storage.existsSync(configPath))
128
+ return {};
129
+ try {
130
+ const raw = storage.readSync(configPath);
131
+ if (!raw)
132
+ return {};
133
+ const parsed = JSON.parse(raw);
134
+ if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {
135
+ return parsed;
136
+ }
137
+ }
138
+ catch {
139
+ // Ignore malformed config for upgrade compatibility.
140
+ }
141
+ return {};
142
+ }
143
+ function readMcpConfigMode(config) {
144
+ return config['mcpConfigMode'] === 'agent-frontmatter' ? 'agent-frontmatter' : 'copilot-file';
145
+ }
146
+ function detectMcpConfigMode(config, agentDest) {
147
+ const configuredMode = readMcpConfigMode(config);
148
+ if (configuredMode === 'agent-frontmatter')
149
+ return configuredMode;
150
+ if (storage.existsSync(agentDest)) {
151
+ const existingAgent = storage.readSync(agentDest) ?? '';
152
+ const frontmatterEnd = existingAgent.indexOf('\n---', 4);
153
+ const frontmatter = frontmatterEnd === -1 ? '' : existingAgent.slice(0, frontmatterEnd);
154
+ if (frontmatter.includes('mcp-servers:')) {
155
+ return 'agent-frontmatter';
156
+ }
157
+ }
158
+ return configuredMode;
159
+ }
160
+ function detectIsGitHubForMcp(dest, config) {
161
+ if (config['platform'] === 'azure-devops')
162
+ return false;
163
+ try {
164
+ const remoteUrl = execFileSync('git', ['remote', 'get-url', 'origin'], { cwd: dest, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();
165
+ const remoteUrlLower = remoteUrl.toLowerCase();
166
+ if (remoteUrlLower.includes('dev.azure.com') || remoteUrlLower.includes('visualstudio.com') || remoteUrlLower.includes('ssh.dev.azure.com')) {
167
+ return false;
168
+ }
169
+ }
170
+ catch {
171
+ // No git remote — assume GitHub, matching init behavior.
172
+ }
173
+ return true;
174
+ }
175
+ function writeAgentTemplate(agentSrc, agentDest, cliVersion, mcpConfigMode, isGitHub) {
176
+ let agentContent = storage.readSync(agentSrc) ?? '';
177
+ if (mcpConfigMode === 'agent-frontmatter') {
178
+ agentContent = injectMcpFrontmatter(agentContent, isGitHub, cliVersion);
179
+ }
180
+ storage.writeSync(agentDest, agentContent);
181
+ stampVersion(agentDest, cliVersion);
182
+ }
52
183
  /**
53
184
  * Detect project type by checking marker files
54
185
  */
@@ -252,6 +383,7 @@ const GITIGNORE_ENTRIES = [
252
383
  '.squad/log/',
253
384
  '.squad/decisions/inbox/',
254
385
  '.squad/sessions/',
386
+ '.squad/.cache/',
255
387
  '.squad-workstream',
256
388
  ];
257
389
  const ENSURE_DIRECTORIES = [
@@ -464,7 +596,7 @@ function refreshSquadTemplatesDir(dest, templatesDir) {
464
596
  /**
465
597
  * Run all ensure* checks and skill/template sync — shared by both code paths
466
598
  */
467
- function runEnsureChecks(dest, templatesDir, filesUpdated) {
599
+ async function runEnsureChecks(dest, templatesDir, filesUpdated) {
468
600
  const attrAdded = ensureGitattributes(dest);
469
601
  if (attrAdded.length > 0) {
470
602
  success(`ensured .gitattributes (${attrAdded.length} rules added)`);
@@ -485,6 +617,11 @@ function runEnsureChecks(dest, templatesDir, filesUpdated) {
485
617
  success(`scaffolded ${castingFiles.length} default casting files`);
486
618
  filesUpdated.push(...castingFiles);
487
619
  }
620
+ const memoryFiles = ensureMemoryGovernanceUpgradeDefaults(dest);
621
+ if (memoryFiles.length > 0) {
622
+ success(`scaffolded memory governance defaults (${memoryFiles.length} files/directories)`);
623
+ filesUpdated.push(...memoryFiles);
624
+ }
488
625
  const skillCount = syncAllSkills(dest, templatesDir);
489
626
  if (skillCount > 0) {
490
627
  success(`synced ${skillCount} skills to .copilot/skills/`);
@@ -493,6 +630,71 @@ function runEnsureChecks(dest, templatesDir, filesUpdated) {
493
630
  refreshSquadTemplatesDir(dest, templatesDir);
494
631
  success('refreshed .squad/templates/');
495
632
  filesUpdated.push('.squad/templates/');
633
+ // iter-8: write squad_state MCP entry to repo-root `.mcp.json`
634
+ // (auto-loaded by Copilot CLI 5.3+ walking up from cwd to git root)
635
+ // and tombstone any stale project-level entry left by older Squad
636
+ // versions in `.copilot/mcp-config.json`. No HOME modifications.
637
+ const pinnedSpec = await resolveSquadStateMcpSpec(getPackageVersion());
638
+ try {
639
+ const rootResult = ensureSquadStateMcpInRoot(dest, getPackageVersion(), pinnedSpec);
640
+ if (rootResult.written) {
641
+ success(`installed squad_state MCP server to .mcp.json (${describeMcpSpec(pinnedSpec)}) — Copilot CLI will auto-load on next invocation`);
642
+ filesUpdated.push('.mcp.json');
643
+ }
644
+ }
645
+ catch (err) {
646
+ warn(`Could not write .mcp.json: ${err instanceof Error ? err.message : err}`);
647
+ }
648
+ const tomb = tombstoneStaleSquadStateInProjectMcp(dest);
649
+ if (tomb.removed) {
650
+ success(`removed stale squad_state from ${tomb.path} (now lives in .mcp.json)`);
651
+ filesUpdated.push('.copilot/mcp-config.json (tombstoned)');
652
+ }
653
+ }
654
+ /** Human-readable single-line description of an McpSpec for success() messages. */
655
+ export function describeMcpSpec(spec) {
656
+ // After iter-7 all specs are `npx -y <pkg@version-or-tag> state-mcp`.
657
+ const pkg = spec.args[1] ?? '<unknown>';
658
+ return spec.source === 'insider' ? `${pkg} (@insider fallback)` : pkg;
659
+ }
660
+ export function ensureMemoryGovernanceUpgradeDefaults(dest) {
661
+ const memoryDir = path.join(dest, '.squad', 'memory');
662
+ const created = [];
663
+ for (const dir of ['local', 'policy-inbox', 'semantic-inbox', 'tombstones']) {
664
+ const fullPath = path.join(memoryDir, dir);
665
+ if (!storage.existsSync(fullPath)) {
666
+ storage.mkdirSync(fullPath, { recursive: true });
667
+ created.push(path.join('.squad', 'memory', dir));
668
+ }
669
+ }
670
+ const defaults = {
671
+ 'config.json': JSON.stringify({
672
+ version: 1,
673
+ defaultProvider: 'local',
674
+ promptOnlyFallback: true,
675
+ externalProviders: {
676
+ hostInjectedCopilotAdapter: {
677
+ enabled: false,
678
+ requireApproval: true,
679
+ },
680
+ },
681
+ policy: {
682
+ rejectForbidden: true,
683
+ rejectTransientDurableWrites: true,
684
+ auditContent: false,
685
+ },
686
+ }, null, 2) + '\n',
687
+ 'index.json': '[]\n',
688
+ 'audit.jsonl': '',
689
+ };
690
+ for (const [file, content] of Object.entries(defaults)) {
691
+ const fullPath = path.join(memoryDir, file);
692
+ if (!storage.existsSync(fullPath)) {
693
+ storage.writeSync(fullPath, content);
694
+ created.push(path.join('.squad', 'memory', file));
695
+ }
696
+ }
697
+ return created;
496
698
  }
497
699
  /**
498
700
  * Run the upgrade command
@@ -513,6 +715,9 @@ export async function runUpgrade(dest, options = {}) {
513
715
  }
514
716
  const agentDest = path.join(dest, '.github', 'agents', 'squad.agent.md');
515
717
  const oldVersion = readInstalledVersion(agentDest) ?? '0.0.0';
718
+ const squadConfig = readSquadConfig(squadDirInfo.path);
719
+ const mcpConfigMode = detectMcpConfigMode(squadConfig, agentDest);
720
+ const isGitHubForMcp = detectIsGitHubForMcp(dest, squadConfig);
516
721
  // Check if already current
517
722
  const isAlreadyCurrent = !options.force && oldVersion && oldVersion !== '0.0.0' && compareSemver(oldVersion, cliVersion) === 0;
518
723
  const projectType = detectProjectType(dest);
@@ -537,8 +742,7 @@ export async function runUpgrade(dest, options = {}) {
537
742
  const agentSrc = path.join(templatesDir, 'squad.agent.md.template');
538
743
  if (storage.existsSync(agentSrc)) {
539
744
  storage.mkdirSync(path.dirname(agentDest), { recursive: true });
540
- storage.copySync(agentSrc, agentDest);
541
- stampVersion(agentDest, cliVersion);
745
+ writeAgentTemplate(agentSrc, agentDest, cliVersion, mcpConfigMode, isGitHubForMcp);
542
746
  success('upgraded squad.agent.md');
543
747
  filesUpdated.push('squad.agent.md');
544
748
  }
@@ -546,7 +750,7 @@ export async function runUpgrade(dest, options = {}) {
546
750
  warn('squad.agent.md.template not found — squad.agent.md was not refreshed. Reinstall or repair the CLI to restore the missing template.');
547
751
  }
548
752
  // Run infrastructure ensure checks even when already current
549
- runEnsureChecks(dest, templatesDir, filesUpdated);
753
+ await runEnsureChecks(dest, templatesDir, filesUpdated);
550
754
  return {
551
755
  fromVersion: oldVersion,
552
756
  toVersion: cliVersion,
@@ -561,8 +765,7 @@ export async function runUpgrade(dest, options = {}) {
561
765
  fatal('squad.agent.md.template not found in templates — installation may be corrupted');
562
766
  }
563
767
  storage.mkdirSync(path.dirname(agentDest), { recursive: true });
564
- storage.copySync(agentSrc, agentDest);
565
- stampVersion(agentDest, cliVersion);
768
+ writeAgentTemplate(agentSrc, agentDest, cliVersion, mcpConfigMode, isGitHubForMcp);
566
769
  const fromLabel = oldVersion === '0.0.0' || !oldVersion ? 'unknown' : oldVersion;
567
770
  success(`upgraded coordinator from ${fromLabel} to ${cliVersion}`);
568
771
  filesUpdated.push('squad.agent.md');
@@ -613,7 +816,7 @@ export async function runUpgrade(dest, options = {}) {
613
816
  }
614
817
  }
615
818
  // Run infrastructure ensure checks
616
- runEnsureChecks(dest, templatesDir, filesUpdated);
819
+ await runEnsureChecks(dest, templatesDir, filesUpdated);
617
820
  console.log();
618
821
  info(`Upgrade complete: v${fromLabel} → v${cliVersion}`);
619
822
  if (migrationsApplied.some(m => m.toLowerCase().includes('scrub email'))) {
@@ -677,15 +880,31 @@ export async function selfUpgradeCli(options = {}) {
677
880
  execSync(cmd, { stdio: 'inherit' });
678
881
  }
679
882
  catch (err) {
680
- const isPermission = err instanceof Error &&
681
- 'code' in err &&
682
- err.code === 'EACCES';
883
+ // UPGRADE-EPERM-FALSE-SUCCESS fix: do NOT swallow self-upgrade failures.
884
+ // Previously this only printed a warning and returned, causing the caller
885
+ // (cli-entry.ts) to then unconditionally print "✅ Upgraded" and exit 0.
886
+ // Now we surface the failure as a thrown error so the caller can exit non-zero
887
+ // and avoid the contradictory success message.
888
+ const errMsg = err instanceof Error ? err.message : String(err);
889
+ const code = err instanceof Error && 'code' in err
890
+ ? (err.code ?? '')
891
+ : '';
892
+ const isPermission = code === 'EACCES' || code === 'EPERM' || /EACCES|EPERM|permission denied/i.test(errMsg);
893
+ const isBusy = code === 'EBUSY' || /EBUSY|in use|cannot access|being used by another process/i.test(errMsg);
894
+ let hint;
683
895
  if (isPermission) {
684
- warn(`Permission denied. Try: sudo ${cmd}`);
896
+ hint = `Permission denied. Try: sudo ${cmd}`;
897
+ }
898
+ else if (isBusy) {
899
+ hint = `A file is in use (likely another squad shell is running). Close other squad CLI processes and retry: ${cmd}`;
685
900
  }
686
901
  else {
687
- warn(`Upgrade failed. Try running manually: ${cmd}`);
902
+ hint = `Upgrade failed. Try running manually: ${cmd}`;
688
903
  }
904
+ warn(hint);
905
+ const failure = new Error(`Self-upgrade failed: ${hint}`);
906
+ failure.code = code || undefined;
907
+ throw failure;
689
908
  }
690
909
  }
691
910
  //# sourceMappingURL=upgrade.js.map