@bradygaster/squad-cli 0.9.6-insider.3 → 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 (122) 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 +92 -6
  7. package/dist/cli/commands/doctor.js.map +1 -1
  8. package/dist/cli/commands/install-hooks.d.ts.map +1 -1
  9. package/dist/cli/commands/install-hooks.js +50 -5
  10. package/dist/cli/commands/install-hooks.js.map +1 -1
  11. package/dist/cli/commands/loop.d.ts.map +1 -1
  12. package/dist/cli/commands/loop.js +7 -5
  13. package/dist/cli/commands/loop.js.map +1 -1
  14. package/dist/cli/commands/migrate-backend.d.ts +36 -5
  15. package/dist/cli/commands/migrate-backend.d.ts.map +1 -1
  16. package/dist/cli/commands/migrate-backend.js +250 -40
  17. package/dist/cli/commands/migrate-backend.js.map +1 -1
  18. package/dist/cli/commands/notes.d.ts +27 -0
  19. package/dist/cli/commands/notes.d.ts.map +1 -0
  20. package/dist/cli/commands/notes.js +222 -0
  21. package/dist/cli/commands/notes.js.map +1 -0
  22. package/dist/cli/commands/plugin.js +3 -3
  23. package/dist/cli/commands/plugin.js.map +1 -1
  24. package/dist/cli/commands/skill.d.ts +31 -0
  25. package/dist/cli/commands/skill.d.ts.map +1 -0
  26. package/dist/cli/commands/skill.js +497 -0
  27. package/dist/cli/commands/skill.js.map +1 -0
  28. package/dist/cli/commands/start.d.ts.map +1 -1
  29. package/dist/cli/commands/start.js +9 -1
  30. package/dist/cli/commands/start.js.map +1 -1
  31. package/dist/cli/commands/watch/agent-spawn.d.ts +62 -0
  32. package/dist/cli/commands/watch/agent-spawn.d.ts.map +1 -0
  33. package/dist/cli/commands/watch/agent-spawn.js +127 -0
  34. package/dist/cli/commands/watch/agent-spawn.js.map +1 -0
  35. package/dist/cli/commands/watch/capabilities/decision-hygiene.d.ts.map +1 -1
  36. package/dist/cli/commands/watch/capabilities/decision-hygiene.js +2 -1
  37. package/dist/cli/commands/watch/capabilities/decision-hygiene.js.map +1 -1
  38. package/dist/cli/commands/watch/capabilities/execute.d.ts.map +1 -1
  39. package/dist/cli/commands/watch/capabilities/execute.js +2 -1
  40. package/dist/cli/commands/watch/capabilities/execute.js.map +1 -1
  41. package/dist/cli/commands/watch/capabilities/index.d.ts.map +1 -1
  42. package/dist/cli/commands/watch/capabilities/index.js +2 -0
  43. package/dist/cli/commands/watch/capabilities/index.js.map +1 -1
  44. package/dist/cli/commands/watch/capabilities/monitor-email.d.ts.map +1 -1
  45. package/dist/cli/commands/watch/capabilities/monitor-email.js +2 -1
  46. package/dist/cli/commands/watch/capabilities/monitor-email.js.map +1 -1
  47. package/dist/cli/commands/watch/capabilities/monitor-teams.d.ts.map +1 -1
  48. package/dist/cli/commands/watch/capabilities/monitor-teams.js +2 -1
  49. package/dist/cli/commands/watch/capabilities/monitor-teams.js.map +1 -1
  50. package/dist/cli/commands/watch/capabilities/notes-promote.d.ts +11 -0
  51. package/dist/cli/commands/watch/capabilities/notes-promote.d.ts.map +1 -0
  52. package/dist/cli/commands/watch/capabilities/notes-promote.js +124 -0
  53. package/dist/cli/commands/watch/capabilities/notes-promote.js.map +1 -0
  54. package/dist/cli/commands/watch/capabilities/retro.d.ts.map +1 -1
  55. package/dist/cli/commands/watch/capabilities/retro.js +2 -1
  56. package/dist/cli/commands/watch/capabilities/retro.js.map +1 -1
  57. package/dist/cli/commands/watch/capabilities/wave-dispatch.d.ts.map +1 -1
  58. package/dist/cli/commands/watch/capabilities/wave-dispatch.js +2 -1
  59. package/dist/cli/commands/watch/capabilities/wave-dispatch.js.map +1 -1
  60. package/dist/cli/commands/watch/index.d.ts.map +1 -1
  61. package/dist/cli/commands/watch/index.js +7 -6
  62. package/dist/cli/commands/watch/index.js.map +1 -1
  63. package/dist/cli/core/command-help.d.ts +44 -0
  64. package/dist/cli/core/command-help.d.ts.map +1 -0
  65. package/dist/cli/core/command-help.js +401 -0
  66. package/dist/cli/core/command-help.js.map +1 -0
  67. package/dist/cli/core/copilot-invocation.d.ts +57 -0
  68. package/dist/cli/core/copilot-invocation.d.ts.map +1 -0
  69. package/dist/cli/core/copilot-invocation.js +84 -0
  70. package/dist/cli/core/copilot-invocation.js.map +1 -0
  71. package/dist/cli/core/effective-squad-dir.d.ts +33 -0
  72. package/dist/cli/core/effective-squad-dir.d.ts.map +1 -0
  73. package/dist/cli/core/effective-squad-dir.js +37 -0
  74. package/dist/cli/core/effective-squad-dir.js.map +1 -0
  75. package/dist/cli/core/init.d.ts.map +1 -1
  76. package/dist/cli/core/init.js +61 -0
  77. package/dist/cli/core/init.js.map +1 -1
  78. package/dist/cli/core/mcp-root.d.ts +60 -0
  79. package/dist/cli/core/mcp-root.d.ts.map +1 -0
  80. package/dist/cli/core/mcp-root.js +124 -0
  81. package/dist/cli/core/mcp-root.js.map +1 -0
  82. package/dist/cli/core/mcp-spec.d.ts +48 -0
  83. package/dist/cli/core/mcp-spec.d.ts.map +1 -0
  84. package/dist/cli/core/mcp-spec.js +61 -0
  85. package/dist/cli/core/mcp-spec.js.map +1 -0
  86. package/dist/cli/core/npm-registry.d.ts +25 -0
  87. package/dist/cli/core/npm-registry.d.ts.map +1 -0
  88. package/dist/cli/core/npm-registry.js +65 -0
  89. package/dist/cli/core/npm-registry.js.map +1 -0
  90. package/dist/cli/core/templates.d.ts.map +1 -1
  91. package/dist/cli/core/templates.js +23 -18
  92. package/dist/cli/core/templates.js.map +1 -1
  93. package/dist/cli/core/upgrade.d.ts +4 -0
  94. package/dist/cli/core/upgrade.d.ts.map +1 -1
  95. package/dist/cli/core/upgrade.js +67 -15
  96. package/dist/cli/core/upgrade.js.map +1 -1
  97. package/dist/cli/shell/coordinator.d.ts.map +1 -1
  98. package/dist/cli/shell/coordinator.js +9 -3
  99. package/dist/cli/shell/coordinator.js.map +1 -1
  100. package/dist/cli/shell/index.d.ts.map +1 -1
  101. package/dist/cli/shell/index.js +12 -6
  102. package/dist/cli/shell/index.js.map +1 -1
  103. package/dist/cli/shell/lifecycle.d.ts.map +1 -1
  104. package/dist/cli/shell/lifecycle.js +12 -7
  105. package/dist/cli/shell/lifecycle.js.map +1 -1
  106. package/dist/cli/shell/session-store.d.ts +4 -4
  107. package/dist/cli/shell/session-store.d.ts.map +1 -1
  108. package/dist/cli/shell/session-store.js +11 -11
  109. package/dist/cli/shell/session-store.js.map +1 -1
  110. package/dist/cli-entry.js +116 -46
  111. package/dist/cli-entry.js.map +1 -1
  112. package/package.json +2 -2
  113. package/scripts/patch-esm-imports.mjs +3 -1
  114. package/templates/after-agent-reference.md +2 -2
  115. package/templates/scribe-charter.md +1 -1
  116. package/templates/skills/fact-checking/SKILL.md +61 -0
  117. package/templates/spawn-reference.md +1 -2
  118. package/templates/squad.agent.md.template +16 -6
  119. package/templates/workflow-wiring-appendix-a-code-reviewer.md +131 -0
  120. package/templates/workflow-wiring-appendix-b-documenter.md +140 -0
  121. package/templates/workflow-wiring-guide.md +276 -0
  122. package/templates/workflows/squad-heartbeat.yml +167 -167
@@ -1,12 +1,18 @@
1
1
  /**
2
- * Backend migration — upgrades state backend from local to orphan or two-layer.
2
+ * Backend migration — upgrades state backend across allowed transitions.
3
3
  *
4
- * Currently supports:
4
+ * Supported migrations:
5
5
  * - local → orphan
6
6
  * - local → two-layer
7
+ * - worktree → orphan
8
+ * - worktree → two-layer
9
+ * - orphan ↔ two-layer (both write to the squad-state orphan branch via different layers)
7
10
  *
8
- * Migration from orphan/two-layer back to local is not supported (would require
9
- * materializing all state from the orphan branch back to the working tree).
11
+ * In addition to flipping the `stateBackend` key in `.squad/config.json`, this
12
+ * function MIGRATES pre-existing working-tree state (`decisions.md`,
13
+ * `agents/<name>/history.md`) onto the squad-state orphan branch when moving
14
+ * from a working-tree backend to an orphan-storage backend, so post-upgrade
15
+ * agents can read pre-upgrade content (UPGRADE-NO-MIGRATION fix).
10
16
  */
11
17
  import { execFileSync } from 'node:child_process';
12
18
  import path from 'node:path';
@@ -15,43 +21,22 @@ import { installGitHooks } from './install-hooks.js';
15
21
  const GREEN = '\x1b[32m';
16
22
  const YELLOW = '\x1b[33m';
17
23
  const BOLD = '\x1b[1m';
24
+ const DIM = '\x1b[2m';
18
25
  const RESET = '\x1b[0m';
19
- const VALID_TARGETS = ['orphan', 'two-layer'];
20
- /**
21
- * Migrate the state backend for an existing squad project.
22
- * Only local orphan/two-layer is supported.
23
- */
24
- export async function migrateStateBackend(dest, target) {
25
- if (!VALID_TARGETS.includes(target)) {
26
- console.log(`${YELLOW}⚠ Invalid backend target '${target}'. Supported: ${VALID_TARGETS.join(', ')}${RESET}`);
27
- return;
28
- }
29
- const configPath = path.join(dest, '.squad', 'config.json');
30
- let config = {};
31
- try {
32
- if (fs.existsSync(configPath)) {
33
- config = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
34
- }
35
- }
36
- catch { /* start fresh */ }
37
- const current = config['stateBackend'] || 'local';
38
- // Validate migration direction
39
- if (current === target) {
40
- console.log(`${YELLOW}⚠ Backend is already '${target}'. Nothing to do.${RESET}`);
41
- return;
42
- }
43
- if (current !== 'local' && current !== null) {
44
- console.log(`${YELLOW}⚠ Migration from '${current}' to '${target}' is not supported.${RESET}`);
45
- console.log(` Only local → orphan or local → two-layer is supported at this time.`);
46
- return;
47
- }
48
- console.log(`\n${BOLD}Migrating state backend: ${current} → ${target}${RESET}\n`);
49
- // Step 1: Create orphan branch if needed
26
+ const VALID_TARGETS = ['local', 'worktree', 'orphan', 'two-layer'];
27
+ const ORPHAN_BACKENDS = new Set(['orphan', 'two-layer']);
28
+ const WORKTREE_BACKENDS = new Set(['local', 'worktree']);
29
+ /** Paths inside .squad/ that should be carried over to the orphan branch on migration. */
30
+ const MIGRATABLE_PATHS = [
31
+ 'decisions.md',
32
+ ];
33
+ /** Best-effort: ensure the squad-state orphan branch exists. Returns true on success. */
34
+ export function ensureOrphanBranch(dest) {
50
35
  try {
51
36
  execFileSync('git', ['rev-parse', '--verify', 'refs/heads/squad-state'], {
52
37
  cwd: dest, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'],
53
38
  });
54
- console.log(` ${GREEN}✓${RESET} squad-state branch already exists`);
39
+ return true;
55
40
  }
56
41
  catch {
57
42
  try {
@@ -69,19 +54,244 @@ export async function migrateStateBackend(dest, target) {
69
54
  execFileSync('git', ['update-ref', 'refs/heads/squad-state', commitHash], {
70
55
  cwd: dest, stdio: ['pipe', 'pipe', 'pipe'],
71
56
  });
72
- console.log(` ${GREEN}✓${RESET} squad-state orphan branch created`);
57
+ return true;
73
58
  }
74
59
  catch (err) {
75
60
  console.log(`${YELLOW}⚠ Could not create squad-state branch: ${err instanceof Error ? err.message : err}${RESET}`);
61
+ return false;
62
+ }
63
+ }
64
+ }
65
+ /**
66
+ * Collect existing working-tree state files that should be migrated to the orphan branch.
67
+ * Returns array of {path, content} pairs (paths are relative to .squad/).
68
+ */
69
+ function collectWorktreeState(dest) {
70
+ const squadDir = path.join(dest, '.squad');
71
+ const collected = [];
72
+ for (const p of MIGRATABLE_PATHS) {
73
+ const full = path.join(squadDir, p);
74
+ if (fs.existsSync(full) && fs.statSync(full).isFile()) {
75
+ collected.push({ relPath: p, content: fs.readFileSync(full, 'utf-8') });
76
+ }
77
+ }
78
+ // agents/<name>/history.md
79
+ const agentsDir = path.join(squadDir, 'agents');
80
+ if (fs.existsSync(agentsDir) && fs.statSync(agentsDir).isDirectory()) {
81
+ for (const agentName of fs.readdirSync(agentsDir)) {
82
+ const histPath = path.join(agentsDir, agentName, 'history.md');
83
+ if (fs.existsSync(histPath) && fs.statSync(histPath).isFile()) {
84
+ collected.push({
85
+ relPath: path.posix.join('agents', agentName, 'history.md'),
86
+ content: fs.readFileSync(histPath, 'utf-8'),
87
+ });
88
+ }
89
+ }
90
+ }
91
+ return collected;
92
+ }
93
+ /**
94
+ * Write a set of files onto the squad-state orphan branch via git plumbing.
95
+ * Preserves any files already on the branch (merges trees by path).
96
+ * Returns the number of files written, or -1 on failure.
97
+ */
98
+ function writeFilesToOrphanBranch(dest, files) {
99
+ if (files.length === 0)
100
+ return 0;
101
+ try {
102
+ // Load the current squad-state tree into the index using a temporary index file
103
+ const gitDir = execFileSync('git', ['rev-parse', '--git-dir'], {
104
+ cwd: dest, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'],
105
+ }).trim();
106
+ const indexFile = path.resolve(dest, gitDir, 'squad-migrate-index');
107
+ if (fs.existsSync(indexFile))
108
+ fs.unlinkSync(indexFile);
109
+ const env = { ...process.env, GIT_INDEX_FILE: indexFile };
110
+ // Seed index with existing squad-state tree
111
+ execFileSync('git', ['read-tree', 'refs/heads/squad-state'], {
112
+ cwd: dest, env, stdio: ['pipe', 'pipe', 'pipe'],
113
+ });
114
+ // Add each migrated file
115
+ for (const f of files) {
116
+ const blobHash = execFileSync('git', ['hash-object', '-w', '--stdin'], {
117
+ cwd: dest, env, encoding: 'utf-8', input: f.content, stdio: ['pipe', 'pipe', 'pipe'],
118
+ }).trim();
119
+ execFileSync('git', ['update-index', '--add', '--cacheinfo', `100644,${blobHash},${f.relPath}`], {
120
+ cwd: dest, env, stdio: ['pipe', 'pipe', 'pipe'],
121
+ });
122
+ }
123
+ const treeHash = execFileSync('git', ['write-tree'], {
124
+ cwd: dest, env, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'],
125
+ }).trim();
126
+ const parentSha = execFileSync('git', ['rev-parse', 'refs/heads/squad-state'], {
127
+ cwd: dest, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'],
128
+ }).trim();
129
+ const commitHash = execFileSync('git', ['commit-tree', treeHash, '-p', parentSha, '-m', `migrate: import working-tree state on backend upgrade (${files.length} file(s))`], { cwd: dest, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();
130
+ execFileSync('git', ['update-ref', 'refs/heads/squad-state', commitHash, parentSha], {
131
+ cwd: dest, stdio: ['pipe', 'pipe', 'pipe'],
132
+ });
133
+ // Cleanup the temporary index
134
+ if (fs.existsSync(indexFile))
135
+ fs.unlinkSync(indexFile);
136
+ return files.length;
137
+ }
138
+ catch (err) {
139
+ console.log(`${YELLOW}⚠ Could not migrate state onto squad-state branch: ${err instanceof Error ? err.message : err}${RESET}`);
140
+ return -1;
141
+ }
142
+ }
143
+ /**
144
+ * Migrate the state backend for an existing squad project.
145
+ *
146
+ * Fixes:
147
+ * - UPGRADE-FLAG-IGNORED: writes the new `stateBackend` value into config.json
148
+ * via JSON-aware merge (never textual append → avoids Bug E duplicates).
149
+ * - UPGRADE-NO-MIGRATION: when moving from a working-tree backend to an
150
+ * orphan-storage backend, carries existing decisions.md and agent histories
151
+ * onto the squad-state orphan branch so post-upgrade agents see prior state.
152
+ * - WI-1: re-installs the full hook set (including new pre-commit/post-commit).
153
+ */
154
+ export async function migrateStateBackend(dest, target) {
155
+ if (!VALID_TARGETS.includes(target)) {
156
+ console.log(`${YELLOW}⚠ Invalid backend target '${target}'. Supported: ${VALID_TARGETS.join(', ')}${RESET}`);
157
+ return;
158
+ }
159
+ const configPath = path.join(dest, '.squad', 'config.json');
160
+ let config = {};
161
+ try {
162
+ if (fs.existsSync(configPath)) {
163
+ config = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
164
+ }
165
+ }
166
+ catch { /* start fresh */ }
167
+ const current = config['stateBackend'] || 'local';
168
+ if (current === target) {
169
+ console.log(`${YELLOW}⚠ Backend is already '${target}'. Ensuring hooks + config are consistent.${RESET}`);
170
+ if (ORPHAN_BACKENDS.has(target)) {
171
+ ensureOrphanBranch(dest);
172
+ installGitHooks(dest, { force: false });
173
+ }
174
+ return;
175
+ }
176
+ console.log(`\n${BOLD}Migrating state backend: ${current} → ${target}${RESET}\n`);
177
+ // Step 1: Ensure orphan branch exists when the target needs it
178
+ if (ORPHAN_BACKENDS.has(target)) {
179
+ if (!ensureOrphanBranch(dest))
76
180
  return;
181
+ console.log(` ${GREEN}✓${RESET} squad-state branch ready`);
182
+ }
183
+ // Step 2 (UPGRADE-NO-MIGRATION): move working-tree state onto the orphan branch
184
+ // when transitioning from a worktree backend to an orphan-storage backend.
185
+ if (WORKTREE_BACKENDS.has(current) && ORPHAN_BACKENDS.has(target)) {
186
+ const files = collectWorktreeState(dest);
187
+ if (files.length > 0) {
188
+ const wrote = writeFilesToOrphanBranch(dest, files);
189
+ if (wrote > 0) {
190
+ console.log(` ${GREEN}✓${RESET} migrated ${wrote} state file(s) onto squad-state branch:`);
191
+ for (const f of files) {
192
+ console.log(` ${DIM}.squad/${f.relPath}${RESET}`);
193
+ }
194
+ // F1 fix (Round 5, P1.1): the working-tree copies are now stale — the
195
+ // orphan branch is the source of truth for an orphan/two-layer backend.
196
+ // Remove them so `git status` is clean and post-upgrade agents can't
197
+ // accidentally read stale content. Mirrors liftInitMutableStateOntoOrphan
198
+ // behavior. Only files we just successfully migrated are removed; we
199
+ // never touch config.json, charter.md, team.md, casting/, templates/, etc.
200
+ const squadDir = path.join(dest, '.squad');
201
+ const removed = [];
202
+ const removeFailed = [];
203
+ for (const f of files) {
204
+ const full = path.join(squadDir, f.relPath);
205
+ try {
206
+ if (fs.existsSync(full))
207
+ fs.unlinkSync(full);
208
+ removed.push(f.relPath);
209
+ }
210
+ catch {
211
+ removeFailed.push(f.relPath);
212
+ }
213
+ }
214
+ // Clean up now-empty agent directories (e.g. .squad/agents/data/) so
215
+ // they don't leak as zero-content folders post-upgrade.
216
+ const agentsDir = path.join(squadDir, 'agents');
217
+ if (fs.existsSync(agentsDir) && fs.statSync(agentsDir).isDirectory()) {
218
+ for (const agentName of fs.readdirSync(agentsDir)) {
219
+ const agentDir = path.join(agentsDir, agentName);
220
+ try {
221
+ if (fs.statSync(agentDir).isDirectory() &&
222
+ fs.readdirSync(agentDir).length === 0) {
223
+ fs.rmdirSync(agentDir);
224
+ }
225
+ }
226
+ catch { /* best-effort */ }
227
+ }
228
+ }
229
+ if (removed.length > 0) {
230
+ console.log(` ${GREEN}✓${RESET} removed ${removed.length} stale working-tree file(s) (now sourced from squad-state):`);
231
+ for (const r of removed) {
232
+ console.log(` ${DIM}.squad/${r}${RESET}`);
233
+ }
234
+ }
235
+ if (removeFailed.length > 0) {
236
+ console.log(` ${YELLOW}⚠${RESET} could not remove: ${removeFailed.join(', ')} (will appear in git status)`);
237
+ }
238
+ }
239
+ else if (wrote === 0) {
240
+ console.log(` ${DIM}no working-tree state files to migrate${RESET}`);
241
+ }
242
+ // If wrote === -1 we already printed a warning; continue so config still updates.
243
+ }
244
+ else {
245
+ console.log(` ${DIM}no migratable state in working tree${RESET}`);
77
246
  }
78
247
  }
79
- // Step 2: Update config
248
+ // Step 3 (UPGRADE-FLAG-IGNORED + Bug E): JSON-merge the new value.
249
+ // Reading + re-stringifying guarantees one canonical `stateBackend` key.
80
250
  config['stateBackend'] = target;
251
+ fs.mkdirSync(path.dirname(configPath), { recursive: true });
81
252
  fs.writeFileSync(configPath, JSON.stringify(config, null, 2) + '\n');
82
253
  console.log(` ${GREEN}✓${RESET} config.json updated: stateBackend = ${target}`);
83
- // Step 3: Install git hooks
84
- installGitHooks(dest, { force: true });
254
+ // Step 4 (WI-1): re-install hooks (force so new pre-commit/post-commit land)
255
+ if (ORPHAN_BACKENDS.has(target)) {
256
+ installGitHooks(dest, { force: true });
257
+ }
85
258
  console.log(`\n${GREEN}${BOLD}✓ Migration complete.${RESET} Backend is now '${target}'.\n`);
86
259
  }
260
+ /**
261
+ * INSIDER3-INIT-LEAK fix: when `squad init --state-backend orphan|two-layer`
262
+ * runs, the SDK still hand-writes mutable state files (decisions.md and each
263
+ * agent's history.md) into the working tree because it has no knowledge of the
264
+ * future backend choice. This helper, invoked by the CLI immediately after the
265
+ * orphan branch is created, lifts those mutable files onto the squad-state
266
+ * orphan branch and removes them from the working tree so post-init agents
267
+ * read state exclusively through the runtime bridge.
268
+ *
269
+ * Source-of-truth hierarchy preserved: static files (team.md, charters,
270
+ * ceremonies.md, casting/*, templates/*) are NEVER touched — only mutable
271
+ * state (decisions.md, agents/<n>/history.md) migrates.
272
+ *
273
+ * Returns the relative paths of files that were migrated + removed.
274
+ */
275
+ export function liftInitMutableStateOntoOrphan(dest) {
276
+ const files = collectWorktreeState(dest);
277
+ if (files.length === 0)
278
+ return [];
279
+ const wrote = writeFilesToOrphanBranch(dest, files);
280
+ if (wrote <= 0)
281
+ return [];
282
+ const removed = [];
283
+ const squadDir = path.join(dest, '.squad');
284
+ for (const f of files) {
285
+ const full = path.join(squadDir, f.relPath);
286
+ try {
287
+ if (fs.existsSync(full))
288
+ fs.unlinkSync(full);
289
+ removed.push(f.relPath);
290
+ }
291
+ catch {
292
+ // Leave file behind rather than aborting; the runtime bridge already has authoritative copy.
293
+ }
294
+ }
295
+ return removed;
296
+ }
87
297
  //# sourceMappingURL=migrate-backend.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"migrate-backend.js","sourceRoot":"","sources":["../../../src/cli/commands/migrate-backend.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"migrate-backend.js","sourceRoot":"","sources":["../../../src/cli/commands/migrate-backend.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * squad notes — manage squad git-notes state (Round 5, P0.3 A3).
3
+ *
4
+ * Subcommand:
5
+ * promote [--ref <ref>] [--all] [--dry-run]
6
+ *
7
+ * Production caller for {@link TwoLayerBackend.promoteNotes}. Walks notes on
8
+ * each `refs/notes/squad/*` ref, moves notes flagged `promote_to_permanent`
9
+ * into the orphan layer under `promoted/<ref>/<sha>.json`, copies notes
10
+ * flagged `archive_on_close` under `archive/<ref>/<sha>.json`, and leaves
11
+ * un-flagged notes in place.
12
+ *
13
+ * Round 4 audit found `promoteNotes` had zero production callers — the SDK
14
+ * API was wired but never invoked. This command, plus the Ralph heartbeat
15
+ * `notes-promote` capability, are those production callers.
16
+ *
17
+ * @module cli/commands/notes
18
+ */
19
+ /**
20
+ * Run `squad notes promote`. Returns process exit code.
21
+ */
22
+ export declare function runNotesPromote(cwd: string, args: string[]): Promise<number>;
23
+ /**
24
+ * Top-level `squad notes` dispatcher.
25
+ */
26
+ export declare function runNotes(cwd: string, args: string[]): Promise<void>;
27
+ //# sourceMappingURL=notes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notes.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/notes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AA+HH;;GAEG;AACH,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAgFlF;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAezE"}
@@ -0,0 +1,222 @@
1
+ /**
2
+ * squad notes — manage squad git-notes state (Round 5, P0.3 A3).
3
+ *
4
+ * Subcommand:
5
+ * promote [--ref <ref>] [--all] [--dry-run]
6
+ *
7
+ * Production caller for {@link TwoLayerBackend.promoteNotes}. Walks notes on
8
+ * each `refs/notes/squad/*` ref, moves notes flagged `promote_to_permanent`
9
+ * into the orphan layer under `promoted/<ref>/<sha>.json`, copies notes
10
+ * flagged `archive_on_close` under `archive/<ref>/<sha>.json`, and leaves
11
+ * un-flagged notes in place.
12
+ *
13
+ * Round 4 audit found `promoteNotes` had zero production callers — the SDK
14
+ * API was wired but never invoked. This command, plus the Ralph heartbeat
15
+ * `notes-promote` capability, are those production callers.
16
+ *
17
+ * @module cli/commands/notes
18
+ */
19
+ import { execFileSync } from 'node:child_process';
20
+ import * as path from 'node:path';
21
+ import { resolveStateBackend, TwoLayerBackend } from '@bradygaster/squad-sdk';
22
+ import { resolveSquadPaths } from '@bradygaster/squad-sdk/resolution';
23
+ import { BOLD, RESET, DIM, GREEN, YELLOW, RED } from '../core/output.js';
24
+ import { fatal } from '../core/errors.js';
25
+ function parsePromoteArgs(args) {
26
+ const out = { all: false, dryRun: false };
27
+ for (let i = 0; i < args.length; i++) {
28
+ const a = args[i];
29
+ if (a === '--ref') {
30
+ out.ref = args[++i];
31
+ }
32
+ else if (a === '--all') {
33
+ out.all = true;
34
+ }
35
+ else if (a === '--dry-run') {
36
+ out.dryRun = true;
37
+ }
38
+ else if (a === '--help' || a === '-h') {
39
+ printPromoteHelp();
40
+ process.exit(0);
41
+ }
42
+ }
43
+ return out;
44
+ }
45
+ function printPromoteHelp() {
46
+ console.log(`\n${BOLD}squad notes promote${RESET} — promote/archive flagged git-notes to permanent storage\n`);
47
+ console.log(`Usage: squad notes promote [options]\n`);
48
+ console.log(`Options:`);
49
+ console.log(` --ref <ref> Restrict to a single notes ref (e.g. squad/picard)`);
50
+ console.log(` --all Promote across all refs/notes/squad/* (default)`);
51
+ console.log(` --dry-run Report what would be promoted without writing`);
52
+ console.log(` --help, -h Show this help\n`);
53
+ console.log(`Requires stateBackend: 'two-layer' in .squad/config.json.`);
54
+ console.log(`Idempotent — promoted notes are removed from source, archived notes stay in place.\n`);
55
+ }
56
+ /**
57
+ * Enumerate squad notes refs (`refs/notes/squad/*`) present in the repo.
58
+ * Returns short names (e.g. `squad/picard`, not `refs/notes/squad/picard`).
59
+ */
60
+ function listSquadNotesRefs(repoRoot) {
61
+ try {
62
+ const out = execFileSync('git', ['for-each-ref', '--format=%(refname)', 'refs/notes/squad/'], { cwd: repoRoot, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] });
63
+ return out
64
+ .split('\n')
65
+ .map((l) => l.trim())
66
+ .filter(Boolean)
67
+ .map((full) => full.replace(/^refs\/notes\//, ''))
68
+ .filter((r) => /^squad\/[A-Za-z0-9_\-./]+$/.test(r));
69
+ }
70
+ catch {
71
+ return [];
72
+ }
73
+ }
74
+ /**
75
+ * Best-effort dry-run preview: list notes on a ref with their flag classification.
76
+ * Reuses the same parsing logic as TwoLayerBackend.promoteNotes but without writing.
77
+ */
78
+ function dryRunRef(repoRoot, ref) {
79
+ const result = { promoted: [], archived: [], skipped: 0 };
80
+ let listing;
81
+ try {
82
+ listing = execFileSync('git', ['notes', `--ref=${ref}`, 'list'], { cwd: repoRoot, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] });
83
+ }
84
+ catch {
85
+ return result;
86
+ }
87
+ let reachable;
88
+ try {
89
+ const raw = execFileSync('git', ['rev-list', 'HEAD'], {
90
+ cwd: repoRoot, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'],
91
+ });
92
+ reachable = new Set(raw.split('\n').map((s) => s.trim()).filter(Boolean));
93
+ }
94
+ catch {
95
+ return result;
96
+ }
97
+ for (const line of listing.split('\n')) {
98
+ const parts = line.trim().split(/\s+/);
99
+ if (parts.length < 2)
100
+ continue;
101
+ const commitSha = parts[1];
102
+ if (!/^[a-f0-9]{40}$|^[a-f0-9]{64}$/.test(commitSha))
103
+ continue;
104
+ if (!reachable.has(commitSha))
105
+ continue;
106
+ let raw;
107
+ try {
108
+ raw = execFileSync('git', ['notes', `--ref=${ref}`, 'show', commitSha], { cwd: repoRoot, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] });
109
+ }
110
+ catch {
111
+ continue;
112
+ }
113
+ let payload;
114
+ try {
115
+ payload = JSON.parse(raw);
116
+ }
117
+ catch {
118
+ result.skipped++;
119
+ continue;
120
+ }
121
+ const flags = payload;
122
+ const refSeg = ref.split('/').filter(Boolean).join('/');
123
+ if (flags?.promote_to_permanent === true) {
124
+ result.promoted.push(`promoted/${refSeg}/${commitSha}.json`);
125
+ }
126
+ if (flags?.archive_on_close === true) {
127
+ result.archived.push(`archive/${refSeg}/${commitSha}.json`);
128
+ }
129
+ if (flags?.promote_to_permanent !== true && flags?.archive_on_close !== true) {
130
+ result.skipped++;
131
+ }
132
+ }
133
+ return result;
134
+ }
135
+ /**
136
+ * Run `squad notes promote`. Returns process exit code.
137
+ */
138
+ export async function runNotesPromote(cwd, args) {
139
+ const opts = parsePromoteArgs(args);
140
+ const paths = resolveSquadPaths(cwd);
141
+ if (!paths) {
142
+ fatal('No squad found. Run "squad init" first.');
143
+ }
144
+ const squadDir = paths.projectDir;
145
+ const repoRoot = path.resolve(squadDir, '..');
146
+ const backend = resolveStateBackend(squadDir, repoRoot);
147
+ if (!(backend instanceof TwoLayerBackend)) {
148
+ console.log(`${YELLOW}⚠ stateBackend is '${backend.name}', not 'two-layer'. Nothing to promote.${RESET}`);
149
+ console.log(`${DIM} Run 'squad upgrade --state-backend two-layer' to enable note promotion.${RESET}`);
150
+ return 0;
151
+ }
152
+ // Decide which refs to process.
153
+ let refs;
154
+ if (opts.ref) {
155
+ refs = [opts.ref];
156
+ }
157
+ else {
158
+ refs = listSquadNotesRefs(repoRoot);
159
+ if (refs.length === 0) {
160
+ console.log(`${DIM}No squad notes refs found (refs/notes/squad/*). Nothing to do.${RESET}`);
161
+ return 0;
162
+ }
163
+ }
164
+ const header = opts.dryRun ? `notes promote ${DIM}(dry-run)${RESET}` : 'notes promote';
165
+ console.log(`\n${BOLD}${header}${RESET}\n`);
166
+ const rows = [];
167
+ let anyError = false;
168
+ for (const ref of refs) {
169
+ try {
170
+ const res = opts.dryRun ? dryRunRef(repoRoot, ref) : backend.promoteNotes(ref);
171
+ rows.push({ ref, promoted: res.promoted.length, archived: res.archived.length, skipped: res.skipped });
172
+ }
173
+ catch (err) {
174
+ anyError = true;
175
+ const msg = err instanceof Error ? err.message : String(err);
176
+ rows.push({ ref, promoted: 0, archived: 0, skipped: 0, error: msg });
177
+ }
178
+ }
179
+ const nameW = Math.max(...rows.map((r) => r.ref.length), 'Ref'.length, 5);
180
+ console.log(` ${'Ref'.padEnd(nameW)} ${'Promoted'.padStart(8)} ${'Archived'.padStart(8)} ${'Skipped'.padStart(7)}`);
181
+ console.log(` ${'─'.repeat(nameW)} ${'─'.repeat(8)} ${'─'.repeat(8)} ${'─'.repeat(7)}`);
182
+ let totalP = 0, totalA = 0, totalS = 0;
183
+ for (const r of rows) {
184
+ if (r.error) {
185
+ console.log(` ${r.ref.padEnd(nameW)} ${RED}error${RESET}: ${r.error}`);
186
+ continue;
187
+ }
188
+ totalP += r.promoted;
189
+ totalA += r.archived;
190
+ totalS += r.skipped;
191
+ console.log(` ${r.ref.padEnd(nameW)} ${String(r.promoted).padStart(8)} ${String(r.archived).padStart(8)} ${String(r.skipped).padStart(7)}`);
192
+ }
193
+ console.log(` ${'─'.repeat(nameW)} ${'─'.repeat(8)} ${'─'.repeat(8)} ${'─'.repeat(7)}`);
194
+ console.log(` ${'TOTAL'.padEnd(nameW)} ${String(totalP).padStart(8)} ${String(totalA).padStart(8)} ${String(totalS).padStart(7)}\n`);
195
+ if (anyError) {
196
+ console.log(`${RED}✗${RESET} Completed with errors (see above).`);
197
+ return 1;
198
+ }
199
+ console.log(`${GREEN}✓${RESET} ${opts.dryRun ? 'Dry-run complete' : 'Promotion complete'}.\n`);
200
+ return 0;
201
+ }
202
+ /**
203
+ * Top-level `squad notes` dispatcher.
204
+ */
205
+ export async function runNotes(cwd, args) {
206
+ const sub = args[0];
207
+ if (!sub || sub === '--help' || sub === '-h' || sub === 'help') {
208
+ console.log(`\n${BOLD}squad notes${RESET} — manage squad git-notes state\n`);
209
+ console.log(`Subcommands:`);
210
+ console.log(` promote Promote/archive flagged notes to permanent orphan storage`);
211
+ console.log(`\nRun 'squad notes <subcommand> --help' for details.\n`);
212
+ return;
213
+ }
214
+ if (sub === 'promote') {
215
+ const code = await runNotesPromote(cwd, args.slice(1));
216
+ if (code !== 0)
217
+ process.exit(code);
218
+ return;
219
+ }
220
+ fatal(`Unknown 'squad notes' subcommand: ${sub}`);
221
+ }
222
+ //# sourceMappingURL=notes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notes.js","sourceRoot":"","sources":["../../../src/cli/commands/notes.ts"],"names":[],"mappings":"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"}
@@ -9,7 +9,7 @@ import { promisify } from 'node:util';
9
9
  import { TIMEOUTS, FSStorageProvider, PLUGIN_MANIFEST_FILENAMES, appendAuditEvent, createPluginInstallPlan, describePluginFile, executeLifecycleHook, isLifecycleEventName, parsePluginManifestContent, readPluginStates, removeInstalledPlugin, setPluginEnabled, sha256, switchActivePlugin, upsertInstalledPlugin, validatePluginManifest, writePluginStates, } from '@bradygaster/squad-sdk';
10
10
  import { success, warn, info, DIM, BOLD, RESET } from '../core/output.js';
11
11
  import { fatal } from '../core/errors.js';
12
- import { detectSquadDir } from '../core/detect-squad-dir.js';
12
+ import { effectiveSquadDir } from '../core/effective-squad-dir.js';
13
13
  import { ghAvailable, ghAuthenticated } from '../core/gh-cli.js';
14
14
  const execFileAsync = promisify(execFile);
15
15
  // --- Main command handler ---
@@ -19,9 +19,9 @@ export async function runPlugin(dest, args) {
19
19
  if (!subCmd) {
20
20
  fatal(pluginUsage());
21
21
  }
22
- const squadDirInfo = detectSquadDir(dest);
22
+ const { local: squadDirInfo, stateDir } = effectiveSquadDir(dest);
23
23
  const storage = new FSStorageProvider();
24
- const pluginsDir = join(squadDirInfo.path, 'plugins');
24
+ const pluginsDir = join(stateDir, 'plugins');
25
25
  const marketplacesFile = join(pluginsDir, 'marketplaces.json');
26
26
  async function readMarketplaces() {
27
27
  if (!storage.existsSync(marketplacesFile)) {