@bradygaster/squad-cli 0.8.25 → 0.9.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 (172) hide show
  1. package/README.md +284 -32
  2. package/dist/cli/commands/aspire.d.ts.map +1 -1
  3. package/dist/cli/commands/aspire.js +3 -0
  4. package/dist/cli/commands/aspire.js.map +1 -1
  5. package/dist/cli/commands/build.js +3 -3
  6. package/dist/cli/commands/build.js.map +1 -1
  7. package/dist/cli/commands/cast.d.ts +13 -0
  8. package/dist/cli/commands/cast.d.ts.map +1 -0
  9. package/dist/cli/commands/cast.js +77 -0
  10. package/dist/cli/commands/cast.js.map +1 -0
  11. package/dist/cli/commands/cost.d.ts +2 -0
  12. package/dist/cli/commands/cost.d.ts.map +1 -0
  13. package/dist/cli/commands/cost.js +170 -0
  14. package/dist/cli/commands/cost.js.map +1 -0
  15. package/dist/cli/commands/cross-squad.d.ts +12 -0
  16. package/dist/cli/commands/cross-squad.d.ts.map +1 -0
  17. package/dist/cli/commands/cross-squad.js +80 -0
  18. package/dist/cli/commands/cross-squad.js.map +1 -0
  19. package/dist/cli/commands/doctor.d.ts +5 -0
  20. package/dist/cli/commands/doctor.d.ts.map +1 -1
  21. package/dist/cli/commands/doctor.js +156 -0
  22. package/dist/cli/commands/doctor.js.map +1 -1
  23. package/dist/cli/commands/economy.d.ts +10 -0
  24. package/dist/cli/commands/economy.d.ts.map +1 -0
  25. package/dist/cli/commands/economy.js +64 -0
  26. package/dist/cli/commands/economy.js.map +1 -0
  27. package/dist/cli/commands/export.d.ts.map +1 -1
  28. package/dist/cli/commands/export.js +11 -4
  29. package/dist/cli/commands/export.js.map +1 -1
  30. package/dist/cli/commands/import.js +2 -2
  31. package/dist/cli/commands/import.js.map +1 -1
  32. package/dist/cli/commands/personal.d.ts +16 -0
  33. package/dist/cli/commands/personal.d.ts.map +1 -0
  34. package/dist/cli/commands/personal.js +213 -0
  35. package/dist/cli/commands/personal.js.map +1 -0
  36. package/dist/cli/commands/roles.d.ts +2 -0
  37. package/dist/cli/commands/roles.d.ts.map +1 -0
  38. package/dist/cli/commands/roles.js +54 -0
  39. package/dist/cli/commands/roles.js.map +1 -0
  40. package/dist/cli/commands/schedule.d.ts +14 -0
  41. package/dist/cli/commands/schedule.d.ts.map +1 -0
  42. package/dist/cli/commands/schedule.js +208 -0
  43. package/dist/cli/commands/schedule.js.map +1 -0
  44. package/dist/cli/commands/watch.d.ts.map +1 -1
  45. package/dist/cli/commands/watch.js +17 -5
  46. package/dist/cli/commands/watch.js.map +1 -1
  47. package/dist/cli/core/cast.d.ts +9 -0
  48. package/dist/cli/core/cast.d.ts.map +1 -1
  49. package/dist/cli/core/cast.js +170 -60
  50. package/dist/cli/core/cast.js.map +1 -1
  51. package/dist/cli/core/detect-squad-dir.d.ts +10 -0
  52. package/dist/cli/core/detect-squad-dir.d.ts.map +1 -1
  53. package/dist/cli/core/detect-squad-dir.js +47 -0
  54. package/dist/cli/core/detect-squad-dir.js.map +1 -1
  55. package/dist/cli/core/init.d.ts +8 -0
  56. package/dist/cli/core/init.d.ts.map +1 -1
  57. package/dist/cli/core/init.js +115 -2
  58. package/dist/cli/core/init.js.map +1 -1
  59. package/dist/cli/core/migrations.d.ts.map +1 -1
  60. package/dist/cli/core/migrations.js +21 -0
  61. package/dist/cli/core/migrations.js.map +1 -1
  62. package/dist/cli/core/templates.d.ts.map +1 -1
  63. package/dist/cli/core/templates.js +8 -1
  64. package/dist/cli/core/templates.js.map +1 -1
  65. package/dist/cli/core/upgrade.d.ts +14 -0
  66. package/dist/cli/core/upgrade.d.ts.map +1 -1
  67. package/dist/cli/core/upgrade.js +182 -48
  68. package/dist/cli/core/upgrade.js.map +1 -1
  69. package/dist/cli/core/version.js +2 -2
  70. package/dist/cli/core/version.js.map +1 -1
  71. package/dist/cli/index.d.ts +2 -0
  72. package/dist/cli/index.d.ts.map +1 -1
  73. package/dist/cli/index.js +2 -0
  74. package/dist/cli/index.js.map +1 -1
  75. package/dist/cli/self-update.d.ts +21 -0
  76. package/dist/cli/self-update.d.ts.map +1 -0
  77. package/dist/cli/self-update.js +113 -0
  78. package/dist/cli/self-update.js.map +1 -0
  79. package/dist/cli/shell/autocomplete.d.ts.map +1 -1
  80. package/dist/cli/shell/autocomplete.js +5 -0
  81. package/dist/cli/shell/autocomplete.js.map +1 -1
  82. package/dist/cli/shell/commands.d.ts.map +1 -1
  83. package/dist/cli/shell/commands.js +55 -24
  84. package/dist/cli/shell/commands.js.map +1 -1
  85. package/dist/cli/shell/components/AgentPanel.d.ts.map +1 -1
  86. package/dist/cli/shell/components/AgentPanel.js +21 -6
  87. package/dist/cli/shell/components/AgentPanel.js.map +1 -1
  88. package/dist/cli/shell/components/App.d.ts.map +1 -1
  89. package/dist/cli/shell/components/App.js +33 -15
  90. package/dist/cli/shell/components/App.js.map +1 -1
  91. package/dist/cli/shell/components/InputPrompt.js +1 -1
  92. package/dist/cli/shell/components/InputPrompt.js.map +1 -1
  93. package/dist/cli/shell/components/MessageStream.d.ts +2 -0
  94. package/dist/cli/shell/components/MessageStream.d.ts.map +1 -1
  95. package/dist/cli/shell/components/MessageStream.js +20 -20
  96. package/dist/cli/shell/components/MessageStream.js.map +1 -1
  97. package/dist/cli/shell/components/ThinkingIndicator.d.ts +4 -0
  98. package/dist/cli/shell/components/ThinkingIndicator.d.ts.map +1 -1
  99. package/dist/cli/shell/components/ThinkingIndicator.js +23 -4
  100. package/dist/cli/shell/components/ThinkingIndicator.js.map +1 -1
  101. package/dist/cli/shell/coordinator.d.ts +7 -0
  102. package/dist/cli/shell/coordinator.d.ts.map +1 -1
  103. package/dist/cli/shell/coordinator.js +206 -88
  104. package/dist/cli/shell/coordinator.js.map +1 -1
  105. package/dist/cli/shell/error-messages.d.ts +14 -0
  106. package/dist/cli/shell/error-messages.d.ts.map +1 -1
  107. package/dist/cli/shell/error-messages.js +65 -1
  108. package/dist/cli/shell/error-messages.js.map +1 -1
  109. package/dist/cli/shell/index.d.ts +1 -1
  110. package/dist/cli/shell/index.d.ts.map +1 -1
  111. package/dist/cli/shell/index.js +83 -12
  112. package/dist/cli/shell/index.js.map +1 -1
  113. package/dist/cli/shell/router.d.ts.map +1 -1
  114. package/dist/cli/shell/router.js +21 -2
  115. package/dist/cli/shell/router.js.map +1 -1
  116. package/dist/cli/shell/stream-bridge.d.ts +2 -0
  117. package/dist/cli/shell/stream-bridge.d.ts.map +1 -1
  118. package/dist/cli/shell/stream-bridge.js +11 -2
  119. package/dist/cli/shell/stream-bridge.js.map +1 -1
  120. package/dist/cli/shell/terminal.d.ts +5 -5
  121. package/dist/cli/shell/terminal.d.ts.map +1 -1
  122. package/dist/cli/shell/terminal.js +35 -26
  123. package/dist/cli/shell/terminal.js.map +1 -1
  124. package/dist/cli-entry.js +124 -42
  125. package/dist/cli-entry.js.map +1 -1
  126. package/package.json +20 -4
  127. package/scripts/patch-esm-imports.mjs +84 -55
  128. package/scripts/patch-ink-rendering.mjs +115 -0
  129. package/templates/casting/Futurama.json +10 -0
  130. package/templates/casting-policy.json +4 -2
  131. package/templates/casting-reference.md +104 -0
  132. package/templates/cooperative-rate-limiting.md +229 -0
  133. package/templates/issue-lifecycle.md +412 -0
  134. package/templates/keda-scaler.md +164 -0
  135. package/templates/machine-capabilities.md +75 -0
  136. package/templates/orchestration-log.md +1 -1
  137. package/templates/ralph-circuit-breaker.md +313 -0
  138. package/templates/routing.md +5 -20
  139. package/templates/scribe-charter.md +1 -1
  140. package/templates/skills/agent-collaboration/SKILL.md +42 -0
  141. package/templates/skills/agent-conduct/SKILL.md +24 -0
  142. package/templates/skills/architectural-proposals/SKILL.md +151 -0
  143. package/templates/skills/ci-validation-gates/SKILL.md +84 -0
  144. package/templates/skills/cli-wiring/SKILL.md +47 -0
  145. package/templates/skills/client-compatibility/SKILL.md +89 -0
  146. package/templates/skills/cross-squad/SKILL.md +114 -0
  147. package/templates/skills/distributed-mesh/SKILL.md +287 -0
  148. package/templates/skills/distributed-mesh/mesh.json.example +30 -0
  149. package/templates/skills/distributed-mesh/sync-mesh.ps1 +111 -0
  150. package/templates/skills/distributed-mesh/sync-mesh.sh +104 -0
  151. package/templates/skills/docs-standards/SKILL.md +71 -0
  152. package/templates/skills/economy-mode/SKILL.md +114 -0
  153. package/templates/skills/external-comms/SKILL.md +329 -0
  154. package/templates/skills/gh-auth-isolation/SKILL.md +183 -0
  155. package/templates/skills/git-workflow/SKILL.md +204 -0
  156. package/templates/skills/github-multi-account/SKILL.md +95 -0
  157. package/templates/skills/history-hygiene/SKILL.md +36 -0
  158. package/templates/skills/humanizer/SKILL.md +105 -0
  159. package/templates/skills/init-mode/SKILL.md +102 -0
  160. package/templates/skills/model-selection/SKILL.md +117 -0
  161. package/templates/skills/nap/SKILL.md +24 -0
  162. package/templates/skills/personal-squad/SKILL.md +57 -0
  163. package/templates/skills/release-process/SKILL.md +423 -0
  164. package/templates/skills/reskill/SKILL.md +92 -0
  165. package/templates/skills/reviewer-protocol/SKILL.md +79 -0
  166. package/templates/skills/secret-handling/SKILL.md +200 -0
  167. package/templates/skills/session-recovery/SKILL.md +155 -0
  168. package/templates/skills/test-discipline/SKILL.md +37 -0
  169. package/templates/skills/windows-compatibility/SKILL.md +74 -0
  170. package/templates/squad.agent.md +1287 -1146
  171. package/templates/workflows/squad-docs.yml +8 -4
  172. package/templates/workflows/squad-heartbeat.yml +3 -4
@@ -2,14 +2,37 @@
2
2
  * Init command implementation — uses SDK
3
3
  * Scaffolds a new Squad project with templates, workflows, and directory structure
4
4
  */
5
+ import fs from 'node:fs';
5
6
  import path from 'node:path';
6
- import { detectSquadDir } from './detect-squad-dir.js';
7
+ import { execFileSync } from 'node:child_process';
8
+ import { detectSquadDir, resolveWorktreeMainCheckout } from './detect-squad-dir.js';
7
9
  import { success, BOLD, RESET, YELLOW, GREEN, DIM } from './output.js';
8
10
  import { fatal } from './errors.js';
9
11
  import { detectProjectType } from './project-type.js';
10
- import { getPackageVersion } from './version.js';
12
+ import { getPackageVersion, stampVersion } from './version.js';
11
13
  import { initSquad as sdkInitSquad, cleanupOrphanInitPrompt } from '@bradygaster/squad-sdk';
12
14
  const CYAN = '\x1b[36m';
15
+ /**
16
+ * Detect if the target directory is inside a parent git repo.
17
+ * Returns the normalized git root path if a parent repo is detected,
18
+ * or null if dest IS the git root or no git repo exists.
19
+ */
20
+ export function detectParentGitRepo(dest) {
21
+ try {
22
+ const gitRoot = execFileSync('git', ['rev-parse', '--show-toplevel'], {
23
+ cwd: dest, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'],
24
+ }).trim().replace(/\//g, path.sep);
25
+ const normalDest = path.resolve(dest);
26
+ const normalGitRoot = path.resolve(gitRoot);
27
+ if (normalDest.toLowerCase() !== normalGitRoot.toLowerCase()) {
28
+ return normalGitRoot;
29
+ }
30
+ }
31
+ catch {
32
+ // No git available or not in a git repo
33
+ }
34
+ return null;
35
+ }
13
36
  /** True when animations should be suppressed (NO_COLOR, dumb term, non-TTY). */
14
37
  export function isInitNoColor() {
15
38
  return ((process.env['NO_COLOR'] != null && process.env['NO_COLOR'] !== '') ||
@@ -67,8 +90,81 @@ export async function runInit(dest, options = {}) {
67
90
  console.log();
68
91
  // Detect project type
69
92
  const projectType = detectProjectType(dest);
93
+ // ── Parent git repo detection ─────────────────────────────────────
94
+ // Copilot resolves .github/agents/ relative to the git root.
95
+ // If CWD is inside a parent git repo, the agent file will be
96
+ // invisible to copilot because the git root points elsewhere.
97
+ try {
98
+ const gitRoot = execFileSync('git', ['rev-parse', '--show-toplevel'], {
99
+ cwd: dest, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'],
100
+ }).trim().replace(/\//g, path.sep);
101
+ const normalDest = path.resolve(dest);
102
+ const normalGitRoot = path.resolve(gitRoot);
103
+ if (normalDest.toLowerCase() !== normalGitRoot.toLowerCase()) {
104
+ console.log();
105
+ console.log(`${YELLOW}${BOLD}⚠ Parent git repo detected${RESET}`);
106
+ console.log(`${YELLOW} Git root: ${normalGitRoot}${RESET}`);
107
+ console.log(`${YELLOW} You're in: ${normalDest}${RESET}`);
108
+ console.log();
109
+ console.log(`${DIM}Copilot resolves .github/agents/ from the git root, not from here.${RESET}`);
110
+ console.log(`${DIM}The Squad agent won't be visible to copilot in this folder.${RESET}`);
111
+ console.log();
112
+ // Auto-fix: run git init to create a repo boundary here
113
+ console.log(`${CYAN}${BOLD}→${RESET} Running ${CYAN}git init${RESET} to create a repo boundary...`);
114
+ execFileSync('git', ['init'], { cwd: dest, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] });
115
+ console.log(`${GREEN}${BOLD}✓${RESET} Initialized git repo at ${normalDest}`);
116
+ console.log();
117
+ }
118
+ }
119
+ catch {
120
+ // No git available or not in a git repo — that's fine, continue normally.
121
+ // Copilot will fall back to CWD for .github/agents/ discovery.
122
+ }
70
123
  // Detect squad directory
71
124
  const squadInfo = detectSquadDir(dest);
125
+ // ── Worktree guard ────────────────────────────────────────────────
126
+ // Prevent silently scaffolding a duplicate .squad/ when running init
127
+ // from a git worktree that already has .squad/ in the main checkout.
128
+ const mainCheckout = resolveWorktreeMainCheckout(dest);
129
+ if (mainCheckout) {
130
+ const mainSquadDir = path.join(mainCheckout, '.squad');
131
+ if (fs.existsSync(mainSquadDir)) {
132
+ console.log();
133
+ console.log(`${YELLOW}${BOLD}⚠ Git worktree detected${RESET}`);
134
+ console.log(`${YELLOW} Main checkout: ${mainCheckout}${RESET}`);
135
+ console.log(`${YELLOW} .squad/ already exists there.${RESET}`);
136
+ console.log();
137
+ console.log(` ${BOLD}[s]${RESET} Use shared .squad/ from main checkout ${DIM}(recommended)${RESET}`);
138
+ console.log(` ${BOLD}[l]${RESET} Create a worktree-local .squad/ in this branch`);
139
+ console.log();
140
+ let useShared = true;
141
+ if (process.stdin.isTTY) {
142
+ const { createInterface } = await import('node:readline/promises');
143
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
144
+ try {
145
+ const answer = (await rl.question(` Strategy [s/l, default: s]: `)).trim().toLowerCase();
146
+ useShared = answer !== 'l' && answer !== 'local';
147
+ }
148
+ finally {
149
+ rl.close();
150
+ }
151
+ }
152
+ else {
153
+ console.log(` ${DIM}Non-interactive mode — defaulting to shared strategy.${RESET}`);
154
+ }
155
+ if (useShared) {
156
+ console.log();
157
+ console.log(`${GREEN}${BOLD}✓${RESET} Using shared .squad/ from ${mainCheckout}`);
158
+ console.log(`${DIM} No changes made. Run squad commands from the main checkout.${RESET}`);
159
+ console.log();
160
+ return;
161
+ }
162
+ // Local strategy: fall through to scaffold .squad/ in this worktree
163
+ console.log();
164
+ console.log(`${GREEN}${BOLD}→${RESET} Creating worktree-local .squad/ in ${dest}`);
165
+ console.log();
166
+ }
167
+ }
72
168
  // Show deprecation warning if using .ai-team/
73
169
  if (squadInfo.isLegacy) {
74
170
  showDeprecationWarning();
@@ -82,6 +178,11 @@ export async function runInit(dest, options = {}) {
82
178
  name: 'scribe',
83
179
  role: 'scribe',
84
180
  displayName: 'Scribe',
181
+ },
182
+ {
183
+ name: 'ralph',
184
+ role: 'ralph',
185
+ displayName: 'Ralph',
85
186
  }
86
187
  ],
87
188
  configFormat: options.sdk ? 'sdk' : 'markdown',
@@ -93,6 +194,7 @@ export async function runInit(dest, options = {}) {
93
194
  version,
94
195
  prompt: options.prompt,
95
196
  extractionDisabled: options.extractionDisabled,
197
+ roles: options.roles,
96
198
  };
97
199
  // Handle SIGINT to cleanup orphan .init-prompt
98
200
  const squadDir = squadInfo.path;
@@ -112,6 +214,17 @@ export async function runInit(dest, options = {}) {
112
214
  return; // Unreachable but makes TS happy
113
215
  }
114
216
  process.off('SIGINT', sigintHandler);
217
+ // Ensure version is fully stamped in squad.agent.md
218
+ const agentPath = path.join(dest, '.github', 'agents', 'squad.agent.md');
219
+ if (fs.existsSync(agentPath)) {
220
+ stampVersion(agentPath, version);
221
+ }
222
+ // Persist --roles flag for the REPL to pick up during casting
223
+ if (options.roles) {
224
+ const rolesMarker = path.join(squadDir, '.init-roles');
225
+ fs.writeFileSync(rolesMarker, '1', 'utf-8');
226
+ success(`base roles enabled — team will use built-in role catalog`);
227
+ }
115
228
  // Report .init-prompt storage
116
229
  if (options.prompt) {
117
230
  success(`.init-prompt stored — team will be cast when you start squad`);
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/core/init.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/core/init.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"migrations.d.ts","sourceRoot":"","sources":["../../../src/cli/core/migrations.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA+DH;;;GAGG;AACH,wBAAsB,aAAa,CACjC,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,EAAE,CAAC,CAiBnB"}
1
+ {"version":3,"file":"migrations.d.ts","sourceRoot":"","sources":["../../../src/cli/core/migrations.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA8FH;;;GAGG;AACH,wBAAsB,aAAa,CACjC,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,EAAE,CAAC,CAiBnB"}
@@ -38,6 +38,27 @@ const migrations = [
38
38
  }
39
39
  }
40
40
  }
41
+ },
42
+ {
43
+ version: '0.9.0',
44
+ description: 'Copy legacy .squad skills into .copilot/skills',
45
+ run(squadDir) {
46
+ const projectRoot = path.dirname(squadDir);
47
+ const legacySkillsDir = path.join(squadDir, 'skills');
48
+ if (!fs.existsSync(legacySkillsDir)) {
49
+ return;
50
+ }
51
+ const skillNames = fs.readdirSync(legacySkillsDir).filter(entry => fs.existsSync(path.join(legacySkillsDir, entry, 'SKILL.md')));
52
+ if (skillNames.length === 0) {
53
+ return;
54
+ }
55
+ const copilotSkillsDir = path.join(projectRoot, '.copilot', 'skills');
56
+ fs.mkdirSync(copilotSkillsDir, { recursive: true });
57
+ for (const skillName of skillNames) {
58
+ fs.cpSync(path.join(legacySkillsDir, skillName), path.join(copilotSkillsDir, skillName), { recursive: true, force: false, errorOnExist: false });
59
+ }
60
+ success(`Migrated skills to .copilot/skills: ${skillNames.join(', ')}`);
61
+ }
41
62
  }
42
63
  ];
43
64
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"migrations.js","sourceRoot":"","sources":["../../../src/cli/core/migrations.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"migrations.js","sourceRoot":"","sources":["../../../src/cli/core/migrations.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../../src/cli/core/templates.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,+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,EAoN3C,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;AAMH,+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,EA4N3C,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAWxC"}
@@ -144,10 +144,17 @@ export const TEMPLATE_MANIFEST = [
144
144
  overwriteOnUpgrade: false,
145
145
  description: 'Agent accumulated wisdom',
146
146
  },
147
+ // Issue lifecycle (squad-owned)
148
+ {
149
+ source: 'issue-lifecycle.md',
150
+ destination: 'issue-lifecycle.md',
151
+ overwriteOnUpgrade: true,
152
+ description: 'Issue lifecycle process template',
153
+ },
147
154
  // Skills subdirectory (squad-owned)
148
155
  {
149
156
  source: 'skills/squad-conventions/SKILL.md',
150
- destination: 'skills/squad-conventions/SKILL.md',
157
+ destination: '../.copilot/skills/squad-conventions/SKILL.md',
151
158
  overwriteOnUpgrade: true,
152
159
  description: 'Squad conventions skill definition',
153
160
  },
@@ -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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"}
@@ -6,6 +6,7 @@
6
6
  export interface UpgradeOptions {
7
7
  migrateDirectory?: boolean;
8
8
  self?: boolean;
9
+ force?: boolean;
9
10
  }
10
11
  export interface UpdateInfo {
11
12
  fromVersion: string;
@@ -13,6 +14,19 @@ export interface UpdateInfo {
13
14
  filesUpdated: string[];
14
15
  migrationsRun: string[];
15
16
  }
17
+ /**
18
+ * Ensure .gitattributes has required merge=union rules (idempotent)
19
+ */
20
+ export declare function ensureGitattributes(dest: string): string[];
21
+ /**
22
+ * Ensure .gitignore has required entries (idempotent).
23
+ * Skips entries already covered by a parent path (e.g. `.squad/` covers `.squad/log/`).
24
+ */
25
+ export declare function ensureGitignore(dest: string): string[];
26
+ /**
27
+ * Create missing infrastructure directories
28
+ */
29
+ export declare function ensureDirectories(dest: string): string[];
16
30
  /**
17
31
  * Run the upgrade command
18
32
  */
@@ -1 +1 @@
1
- {"version":3,"file":"upgrade.d.ts","sourceRoot":"","sources":["../../../src/cli/core/upgrade.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAgBH,MAAM,WAAW,cAAc;IAC7B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;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;AAiRD;;GAEG;AACH,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,UAAU,CAAC,CAqJhG"}
1
+ {"version":3,"file":"upgrade.d.ts","sourceRoot":"","sources":["../../../src/cli/core/upgrade.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAYH,MAAM,WAAW,cAAc;IAC7B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;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;AAuPD;;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;AAyED;;GAEG;AACH,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,UAAU,CAAC,CA+JhG"}
@@ -5,35 +5,12 @@
5
5
  */
6
6
  import fs from 'node:fs';
7
7
  import path from 'node:path';
8
- import { fileURLToPath } from 'node:url';
9
- import { dirname } from 'node:path';
10
8
  import { success, warn, info, dim } from './output.js';
11
9
  import { fatal } from './errors.js';
12
10
  import { detectSquadDir } from './detect-squad-dir.js';
13
11
  import { TEMPLATE_MANIFEST, getTemplatesDir } from './templates.js';
14
12
  import { runMigrations } from './migrations.js';
15
- const currentFile = fileURLToPath(import.meta.url);
16
- const currentDir = dirname(currentFile);
17
- /**
18
- * Read version from squad.agent.md HTML comment
19
- */
20
- function readInstalledVersion(agentPath) {
21
- try {
22
- if (!fs.existsSync(agentPath))
23
- return '0.0.0';
24
- const content = fs.readFileSync(agentPath, 'utf8');
25
- // Try HTML comment first (new format)
26
- const commentMatch = content.match(/<!-- version: ([0-9.]+(?:-[a-z]+(?:\.\d+)?)?) -->/);
27
- if (commentMatch)
28
- return commentMatch[1];
29
- // Fallback to frontmatter (old format)
30
- const frontmatterMatch = content.match(/^version:\s*"([^"]+)"/m);
31
- return frontmatterMatch ? frontmatterMatch[1] : '0.0.0';
32
- }
33
- catch {
34
- return '0.0.0';
35
- }
36
- }
13
+ import { getPackageVersion, stampVersion, readInstalledVersion } from './version.js';
37
14
  /**
38
15
  * Compare semver strings: -1 (a<b), 0 (a==b), 1 (a>b)
39
16
  */
@@ -58,19 +35,6 @@ function compareSemver(a, b) {
58
35
  return a < b ? -1 : a > b ? 1 : 0;
59
36
  return 0;
60
37
  }
61
- /**
62
- * Stamp version into squad.agent.md after copying
63
- */
64
- function stampVersion(filePath, version) {
65
- let content = fs.readFileSync(filePath, 'utf8');
66
- // Replace version in HTML comment
67
- content = content.replace(/<!-- version: [^>]+ -->/m, `<!-- version: ${version} -->`);
68
- // Replace version in Identity section's Version line
69
- content = content.replace(/- \*\*Version:\*\* [0-9.]+(?:-[a-z]+(?:\.\d+)?)?/m, `- **Version:** ${version}`);
70
- // Replace {version} placeholder
71
- content = content.replace(/`Squad v\{version\}`/g, `\`Squad v${version}\``);
72
- fs.writeFileSync(filePath, content);
73
- }
74
38
  /**
75
39
  * Detect project type by checking marker files
76
40
  */
@@ -262,25 +226,186 @@ function writeWorkflowFile(file, srcPath, destPath, projectType) {
262
226
  }
263
227
  fs.copyFileSync(srcPath, destPath);
264
228
  }
229
+ /* ── Infrastructure ensure functions ────────────────────────────── */
230
+ const GITATTRIBUTES_RULES = [
231
+ '.squad/decisions.md merge=union',
232
+ '.squad/agents/*/history.md merge=union',
233
+ '.squad/log/** merge=union',
234
+ '.squad/orchestration-log/** merge=union',
235
+ ];
236
+ const GITIGNORE_ENTRIES = [
237
+ '.squad/orchestration-log/',
238
+ '.squad/log/',
239
+ '.squad/decisions/inbox/',
240
+ '.squad/sessions/',
241
+ '.squad-workstream',
242
+ ];
243
+ const ENSURE_DIRECTORIES = [
244
+ '.squad/identity',
245
+ '.squad/orchestration-log',
246
+ '.squad/log',
247
+ '.squad/sessions',
248
+ '.squad/decisions/inbox',
249
+ '.copilot/skills',
250
+ ];
251
+ /**
252
+ * Ensure .gitattributes has required merge=union rules (idempotent)
253
+ */
254
+ export function ensureGitattributes(dest) {
255
+ const filePath = path.join(dest, '.gitattributes');
256
+ let content = '';
257
+ if (fs.existsSync(filePath)) {
258
+ content = fs.readFileSync(filePath, 'utf8');
259
+ }
260
+ const added = [];
261
+ for (const rule of GITATTRIBUTES_RULES) {
262
+ if (!content.includes(rule)) {
263
+ added.push(rule);
264
+ }
265
+ }
266
+ if (added.length > 0) {
267
+ const suffix = content.length > 0 && !content.endsWith('\n') ? '\n' : '';
268
+ try {
269
+ fs.writeFileSync(filePath, content + suffix + added.join('\n') + '\n');
270
+ }
271
+ catch (err) {
272
+ if (err instanceof Error && 'code' in err && ['EPERM', 'EACCES'].includes(err.code ?? '')) {
273
+ warn('Could not update .gitattributes (read-only). Add merge=union entries manually.');
274
+ return [];
275
+ }
276
+ throw err;
277
+ }
278
+ }
279
+ return added;
280
+ }
281
+ /**
282
+ * Check whether an existing gitignore line already covers a candidate entry
283
+ * via parent-directory matching (e.g. `.squad/` covers `.squad/log/`).
284
+ */
285
+ function isAlreadyCoveredByParent(entry, lines) {
286
+ for (const line of lines) {
287
+ const trimmed = line.trim();
288
+ if (!trimmed || trimmed.startsWith('#') || trimmed.startsWith('!'))
289
+ continue;
290
+ const parent = trimmed.endsWith('/') ? trimmed : trimmed + '/';
291
+ if (entry.startsWith(parent) && entry !== trimmed) {
292
+ return true;
293
+ }
294
+ }
295
+ return false;
296
+ }
265
297
  /**
266
- * Get CLI version from package.json
298
+ * Ensure .gitignore has required entries (idempotent).
299
+ * Skips entries already covered by a parent path (e.g. `.squad/` covers `.squad/log/`).
267
300
  */
268
- function getCLIVersion() {
301
+ export function ensureGitignore(dest) {
302
+ const filePath = path.join(dest, '.gitignore');
303
+ let content = '';
304
+ if (fs.existsSync(filePath)) {
305
+ content = fs.readFileSync(filePath, 'utf8');
306
+ }
307
+ const existingLines = content.split('\n');
308
+ const added = [];
309
+ for (const entry of GITIGNORE_ENTRIES) {
310
+ if (content.includes(entry))
311
+ continue;
312
+ if (isAlreadyCoveredByParent(entry, existingLines))
313
+ continue;
314
+ added.push(entry);
315
+ }
316
+ if (added.length > 0) {
317
+ const suffix = content.length > 0 && !content.endsWith('\n') ? '\n' : '';
318
+ fs.writeFileSync(filePath, content + suffix + added.join('\n') + '\n');
319
+ }
320
+ return added;
321
+ }
322
+ /**
323
+ * Create missing infrastructure directories
324
+ */
325
+ export function ensureDirectories(dest) {
326
+ const created = [];
327
+ for (const dir of ENSURE_DIRECTORIES) {
328
+ const fullPath = path.join(dest, dir);
329
+ if (!fs.existsSync(fullPath)) {
330
+ fs.mkdirSync(fullPath, { recursive: true });
331
+ created.push(dir);
332
+ }
333
+ }
334
+ return created;
335
+ }
336
+ /**
337
+ * Copy all skills from package templates to .copilot/skills/ (force: false)
338
+ */
339
+ function syncAllSkills(dest, templatesDir) {
340
+ const skillsSrc = path.join(templatesDir, 'skills');
341
+ const skillsDest = path.join(dest, '.copilot', 'skills');
342
+ if (!fs.existsSync(skillsSrc))
343
+ return 0;
344
+ fs.mkdirSync(skillsDest, { recursive: true });
345
+ fs.cpSync(skillsSrc, skillsDest, { recursive: true, force: false });
346
+ // Count skill directories synced
269
347
  try {
270
- // From src/cli/core/upgrade.ts, go up to package root
271
- const pkgPath = path.join(currentDir, '..', '..', '..', 'package.json');
272
- const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'));
273
- return pkg.version || '0.0.0';
348
+ return fs.readdirSync(skillsSrc).filter(e => fs.statSync(path.join(skillsSrc, e)).isDirectory()).length;
274
349
  }
275
350
  catch {
276
- return '0.0.0';
351
+ return 0;
277
352
  }
278
353
  }
354
+ /**
355
+ * Copy full templates/ directory to .squad/templates/ for user access
356
+ */
357
+ function refreshSquadTemplatesDir(dest, templatesDir) {
358
+ const squadTemplatesDest = path.join(dest, '.squad', 'templates');
359
+ fs.mkdirSync(squadTemplatesDest, { recursive: true });
360
+ // Copy everything except workflows and skills (those have dedicated handling)
361
+ const entries = fs.readdirSync(templatesDir);
362
+ for (const entry of entries) {
363
+ if (entry === 'workflows' || entry === 'skills')
364
+ continue;
365
+ const srcPath = path.join(templatesDir, entry);
366
+ const destPath = path.join(squadTemplatesDest, entry);
367
+ const stat = fs.statSync(srcPath);
368
+ if (stat.isDirectory()) {
369
+ fs.cpSync(srcPath, destPath, { recursive: true, force: true });
370
+ }
371
+ else {
372
+ fs.copyFileSync(srcPath, destPath);
373
+ }
374
+ }
375
+ }
376
+ /**
377
+ * Run all ensure* checks and skill/template sync — shared by both code paths
378
+ */
379
+ function runEnsureChecks(dest, templatesDir, filesUpdated) {
380
+ const attrAdded = ensureGitattributes(dest);
381
+ if (attrAdded.length > 0) {
382
+ success(`ensured .gitattributes (${attrAdded.length} rules added)`);
383
+ filesUpdated.push('.gitattributes');
384
+ }
385
+ const ignoreAdded = ensureGitignore(dest);
386
+ if (ignoreAdded.length > 0) {
387
+ success(`ensured .gitignore (${ignoreAdded.length} entries added)`);
388
+ filesUpdated.push('.gitignore');
389
+ }
390
+ const dirsCreated = ensureDirectories(dest);
391
+ if (dirsCreated.length > 0) {
392
+ success(`created ${dirsCreated.length} missing directories`);
393
+ filesUpdated.push(...dirsCreated);
394
+ }
395
+ const skillCount = syncAllSkills(dest, templatesDir);
396
+ if (skillCount > 0) {
397
+ success(`synced ${skillCount} skills to .copilot/skills/`);
398
+ filesUpdated.push(`skills (${skillCount})`);
399
+ }
400
+ refreshSquadTemplatesDir(dest, templatesDir);
401
+ success('refreshed .squad/templates/');
402
+ filesUpdated.push('.squad/templates/');
403
+ }
279
404
  /**
280
405
  * Run the upgrade command
281
406
  */
282
407
  export async function runUpgrade(dest, options = {}) {
283
- const cliVersion = getCLIVersion();
408
+ const cliVersion = getPackageVersion();
284
409
  const filesUpdated = [];
285
410
  // Detect squad directory
286
411
  const squadDirInfo = detectSquadDir(dest);
@@ -294,9 +419,9 @@ export async function runUpgrade(dest, options = {}) {
294
419
  fatal('No squad found — run init first.');
295
420
  }
296
421
  const agentDest = path.join(dest, '.github', 'agents', 'squad.agent.md');
297
- const oldVersion = readInstalledVersion(agentDest);
422
+ const oldVersion = readInstalledVersion(agentDest) ?? '0.0.0';
298
423
  // Check if already current
299
- const isAlreadyCurrent = oldVersion && oldVersion !== '0.0.0' && compareSemver(oldVersion, cliVersion) === 0;
424
+ const isAlreadyCurrent = !options.force && oldVersion && oldVersion !== '0.0.0' && compareSemver(oldVersion, cliVersion) === 0;
300
425
  const projectType = detectProjectType(dest);
301
426
  if (isAlreadyCurrent) {
302
427
  info(`Already up to date (v${cliVersion})`);
@@ -324,6 +449,8 @@ export async function runUpgrade(dest, options = {}) {
324
449
  success('upgraded squad.agent.md');
325
450
  filesUpdated.push('squad.agent.md');
326
451
  }
452
+ // Run infrastructure ensure checks even when already current
453
+ runEnsureChecks(dest, templatesDir, filesUpdated);
327
454
  return {
328
455
  fromVersion: oldVersion,
329
456
  toVersion: cliVersion,
@@ -386,9 +513,16 @@ export async function runUpgrade(dest, options = {}) {
386
513
  filesUpdated.push('copilot-instructions.md');
387
514
  }
388
515
  }
516
+ // Run infrastructure ensure checks
517
+ runEnsureChecks(dest, templatesDir, filesUpdated);
389
518
  console.log();
390
519
  info(`Upgrade complete: v${fromLabel} → v${cliVersion}`);
391
- dim('Never touches user state: team.md, decisions/, agents/*/history.md');
520
+ if (migrationsApplied.some(m => m.toLowerCase().includes('scrub email'))) {
521
+ dim('Privacy scrub applied to .squad/ files (email addresses removed)');
522
+ }
523
+ else {
524
+ dim('Preserves user state: team.md, decisions/, agents/*/history.md');
525
+ }
392
526
  console.log();
393
527
  return {
394
528
  fromVersion: fromLabel,