@bradygaster/squad-cli 0.8.24 → 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 +140 -43
  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
@@ -0,0 +1,170 @@
1
+ import { readdir, readFile } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ import { fatal } from '../core/errors.js';
4
+ const TOKEN_USAGE_RE = /\|\s*\*\*Token usage\*\*\s*\|\s*([\d,]+)\s+in\s*\/\s*([\d,]+)\s+out\s*[—-]\s*\$([\d.,]+)\s*\|/i;
5
+ const AGENT_RE = /\|\s*\*\*Agent routed\*\*\s*\|\s*(.+?)\s*\|/i;
6
+ const SAFE_TIMESTAMP_RE = /^\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}Z/;
7
+ function parseArgs(args) {
8
+ const showAll = args.includes('--all');
9
+ const agentIdx = args.indexOf('--agent');
10
+ const agentFilter = agentIdx !== -1 ? args[agentIdx + 1]?.trim() : undefined;
11
+ if (agentIdx !== -1 && !agentFilter) {
12
+ fatal('Usage: squad cost [--all] [--agent <name>]');
13
+ }
14
+ return { showAll, agentFilter };
15
+ }
16
+ function extractTimestamp(fileName) {
17
+ return fileName.match(SAFE_TIMESTAMP_RE)?.[0] ?? null;
18
+ }
19
+ function extractAgent(agentCell) {
20
+ return agentCell.replace(/\s*\([^)]*\)\s*$/, '').trim();
21
+ }
22
+ function parseNumber(raw) {
23
+ return Number(raw.replace(/,/g, ''));
24
+ }
25
+ function parseCostEntry(content, timestamp) {
26
+ const tokenMatch = content.match(TOKEN_USAGE_RE);
27
+ const agentMatch = content.match(AGENT_RE);
28
+ if (!tokenMatch || !agentMatch) {
29
+ return null;
30
+ }
31
+ const agent = extractAgent(agentMatch[1] ?? '');
32
+ const inputTokens = parseNumber(tokenMatch[1] ?? '0');
33
+ const outputTokens = parseNumber(tokenMatch[2] ?? '0');
34
+ const estimatedCost = Number((tokenMatch[3] ?? '0').replace(/,/g, ''));
35
+ if (!agent || Number.isNaN(inputTokens) || Number.isNaN(outputTokens) || Number.isNaN(estimatedCost)) {
36
+ return null;
37
+ }
38
+ return {
39
+ agent,
40
+ inputTokens,
41
+ outputTokens,
42
+ estimatedCost,
43
+ timestamp,
44
+ };
45
+ }
46
+ function sortNewestFirst(entries) {
47
+ return [...entries].sort((a, b) => b.localeCompare(a));
48
+ }
49
+ function formatInteger(value) {
50
+ return new Intl.NumberFormat('en-US', { maximumFractionDigits: 0 }).format(value);
51
+ }
52
+ function formatCost(value) {
53
+ return `$${value.toFixed(4)}`;
54
+ }
55
+ function printNoData() {
56
+ console.log('💰 No token usage data found in orchestration logs.');
57
+ console.log(' Token tracking is recorded when agents report usage in their responses.');
58
+ }
59
+ function printSummary(entries, agentFilter) {
60
+ const totalsByAgent = new Map();
61
+ for (const entry of entries) {
62
+ const current = totalsByAgent.get(entry.agent) ?? {
63
+ agent: entry.agent,
64
+ inputTokens: 0,
65
+ outputTokens: 0,
66
+ estimatedCost: 0,
67
+ spawns: 0,
68
+ };
69
+ current.inputTokens += entry.inputTokens;
70
+ current.outputTokens += entry.outputTokens;
71
+ current.estimatedCost += entry.estimatedCost;
72
+ current.spawns += 1;
73
+ totalsByAgent.set(entry.agent, current);
74
+ }
75
+ const rows = [...totalsByAgent.values()].sort((a, b) => b.estimatedCost - a.estimatedCost || a.agent.localeCompare(b.agent));
76
+ const total = rows.reduce((acc, row) => {
77
+ acc.inputTokens += row.inputTokens;
78
+ acc.outputTokens += row.outputTokens;
79
+ acc.estimatedCost += row.estimatedCost;
80
+ acc.spawns += row.spawns;
81
+ return acc;
82
+ }, { inputTokens: 0, outputTokens: 0, estimatedCost: 0, spawns: 0 });
83
+ const agentWidth = Math.max('Agent'.length, 'Total'.length, ...rows.map(row => row.agent.length)) + 2;
84
+ const inputWidth = Math.max('Input Tokens'.length, ...rows.map(row => formatInteger(row.inputTokens).length), formatInteger(total.inputTokens).length) + 2;
85
+ const outputWidth = Math.max('Output Tokens'.length, ...rows.map(row => formatInteger(row.outputTokens).length), formatInteger(total.outputTokens).length) + 2;
86
+ const costWidth = Math.max('Est. Cost'.length, ...rows.map(row => formatCost(row.estimatedCost).length), formatCost(total.estimatedCost).length) + 2;
87
+ const divider = ` ${'─'.repeat(agentWidth)}${' '.repeat(2)}${'─'.repeat(inputWidth)}${' '.repeat(2)}${'─'.repeat(outputWidth)}${' '.repeat(2)}${'─'.repeat(costWidth)}`;
88
+ const formatRow = (label, inputTokens, outputTokens, estimatedCost) => ` ${label.padEnd(agentWidth)}${formatInteger(inputTokens).padStart(inputWidth)} ${formatInteger(outputTokens).padStart(outputWidth)} ${formatCost(estimatedCost).padStart(costWidth)}`;
89
+ console.log('💰 Squad Cost Summary');
90
+ console.log('━━━━━━━━━━━━━━━━━━━━');
91
+ console.log();
92
+ console.log(` ${'Agent'.padEnd(agentWidth)}${'Input Tokens'.padStart(inputWidth)} ${'Output Tokens'.padStart(outputWidth)} ${'Est. Cost'.padStart(costWidth)}`);
93
+ console.log(divider);
94
+ for (const row of rows) {
95
+ console.log(formatRow(row.agent, row.inputTokens, row.outputTokens, row.estimatedCost));
96
+ }
97
+ console.log(divider);
98
+ console.log(formatRow('Total', total.inputTokens, total.outputTokens, total.estimatedCost));
99
+ console.log();
100
+ const filterLabel = agentFilter ? ` for ${agentFilter}` : '';
101
+ console.log(` 📊 ${rows.length} agent${rows.length === 1 ? '' : 's'} across ${total.spawns} spawn${total.spawns === 1 ? '' : 's'}${filterLabel}`);
102
+ }
103
+ async function listMarkdownFiles(dir) {
104
+ const entries = await readdir(dir, { withFileTypes: true });
105
+ return entries
106
+ .filter(entry => entry.isFile() && entry.name.endsWith('.md'))
107
+ .map(entry => entry.name);
108
+ }
109
+ async function getCurrentSessionCutoff(teamRoot) {
110
+ const sessionLogDir = join(teamRoot, '.squad', 'log');
111
+ try {
112
+ const logFiles = sortNewestFirst(await listMarkdownFiles(sessionLogDir));
113
+ for (const file of logFiles) {
114
+ const timestamp = extractTimestamp(file);
115
+ if (timestamp) {
116
+ return timestamp;
117
+ }
118
+ }
119
+ return null;
120
+ }
121
+ catch {
122
+ return null;
123
+ }
124
+ }
125
+ export async function runCost(args, teamRoot) {
126
+ const { showAll, agentFilter } = parseArgs(args);
127
+ const orchestrationDir = join(teamRoot, '.squad', 'orchestration-log');
128
+ let files;
129
+ try {
130
+ files = sortNewestFirst(await listMarkdownFiles(orchestrationDir));
131
+ }
132
+ catch {
133
+ printNoData();
134
+ return;
135
+ }
136
+ if (files.length === 0) {
137
+ printNoData();
138
+ return;
139
+ }
140
+ const cutoffTimestamp = showAll ? null : await getCurrentSessionCutoff(teamRoot);
141
+ const filteredFiles = files.filter(file => {
142
+ const timestamp = extractTimestamp(file);
143
+ if (!timestamp) {
144
+ return false;
145
+ }
146
+ return cutoffTimestamp ? timestamp > cutoffTimestamp : true;
147
+ });
148
+ const entries = [];
149
+ for (const file of filteredFiles) {
150
+ const timestamp = extractTimestamp(file);
151
+ if (!timestamp) {
152
+ continue;
153
+ }
154
+ const content = await readFile(join(orchestrationDir, file), 'utf8');
155
+ const parsed = parseCostEntry(content, timestamp);
156
+ if (!parsed) {
157
+ continue;
158
+ }
159
+ if (agentFilter && parsed.agent.toLowerCase() !== agentFilter.toLowerCase()) {
160
+ continue;
161
+ }
162
+ entries.push(parsed);
163
+ }
164
+ if (entries.length === 0) {
165
+ printNoData();
166
+ return;
167
+ }
168
+ printSummary(entries, agentFilter);
169
+ }
170
+ //# sourceMappingURL=cost.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cost.js","sourceRoot":"","sources":["../../../src/cli/commands/cost.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAuB1C,MAAM,cAAc,GAClB,gGAAgG,CAAC;AACnG,MAAM,QAAQ,GAAG,8CAA8C,CAAC;AAChE,MAAM,iBAAiB,GAAG,uCAAuC,CAAC;AAElE,SAAS,SAAS,CAAC,IAAc;IAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACzC,MAAM,WAAW,GAAG,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAE7E,IAAI,QAAQ,KAAK,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QACpC,KAAK,CAAC,4CAA4C,CAAC,CAAC;IACtD,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;AAClC,CAAC;AAED,SAAS,gBAAgB,CAAC,QAAgB;IACxC,OAAO,QAAQ,CAAC,KAAK,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;AACxD,CAAC;AAED,SAAS,YAAY,CAAC,SAAiB;IACrC,OAAO,SAAS,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AAC1D,CAAC;AAED,SAAS,WAAW,CAAC,GAAW;IAC9B,OAAO,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;AACvC,CAAC;AAED,SAAS,cAAc,CAAC,OAAe,EAAE,SAAiB;IACxD,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IACjD,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAE3C,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,KAAK,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAChD,MAAM,WAAW,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;IACtD,MAAM,YAAY,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;IACvD,MAAM,aAAa,GAAG,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;IAEvE,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC;QACrG,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO;QACL,KAAK;QACL,WAAW;QACX,YAAY;QACZ,aAAa;QACb,SAAS;KACV,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,OAA0B;IACjD,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;AACzD,CAAC;AAED,SAAS,aAAa,CAAC,KAAa;IAClC,OAAO,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,EAAE,qBAAqB,EAAE,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACpF,CAAC;AAED,SAAS,UAAU,CAAC,KAAa;IAC/B,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;AAChC,CAAC;AAED,SAAS,WAAW;IAClB,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;IACnE,OAAO,CAAC,GAAG,CAAC,4EAA4E,CAAC,CAAC;AAC5F,CAAC;AAED,SAAS,YAAY,CAAC,OAAoB,EAAE,WAAoB;IAC9D,MAAM,aAAa,GAAG,IAAI,GAAG,EAAuB,CAAC;IAErD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI;YAChD,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,WAAW,EAAE,CAAC;YACd,YAAY,EAAE,CAAC;YACf,aAAa,EAAE,CAAC;YAChB,MAAM,EAAE,CAAC;SACV,CAAC;QAEF,OAAO,CAAC,WAAW,IAAI,KAAK,CAAC,WAAW,CAAC;QACzC,OAAO,CAAC,YAAY,IAAI,KAAK,CAAC,YAAY,CAAC;QAC3C,OAAO,CAAC,aAAa,IAAI,KAAK,CAAC,aAAa,CAAC;QAC7C,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC;QACpB,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC1C,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,GAAG,CAAC,CAAC,aAAa,IAAI,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IAC7H,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CACvB,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QACX,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,WAAW,CAAC;QACnC,GAAG,CAAC,YAAY,IAAI,GAAG,CAAC,YAAY,CAAC;QACrC,GAAG,CAAC,aAAa,IAAI,GAAG,CAAC,aAAa,CAAC;QACvC,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC;QACzB,OAAO,GAAG,CAAC;IACb,CAAC,EACD,EAAE,WAAW,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CACjE,CAAC;IAEF,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CACzB,OAAO,CAAC,MAAM,EACd,OAAO,CAAC,MAAM,EACd,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CACrC,GAAG,CAAC,CAAC;IACN,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,EAAE,aAAa,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC3J,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,EAAE,aAAa,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC/J,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,EAAE,UAAU,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAErJ,MAAM,OAAO,GAAG,KAAK,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;IACzK,MAAM,SAAS,GAAG,CAAC,KAAa,EAAE,WAAmB,EAAE,YAAoB,EAAE,aAAqB,EAAU,EAAE,CAC5G,KAAK,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,aAAa,CAAC,YAAY,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,KAAK,UAAU,CAAC,aAAa,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;IAE5L,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;IACrC,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;IACpC,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CACT,KAAK,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,cAAc,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,eAAe,CAAC,QAAQ,CAAC,WAAW,CAAC,KAAK,WAAW,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CACtJ,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACrB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,YAAY,EAAE,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC;IAC1F,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACrB,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC;IAC5F,OAAO,CAAC,GAAG,EAAE,CAAC;IAEd,MAAM,WAAW,GAAG,WAAW,CAAC,CAAC,CAAC,QAAQ,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7D,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,CAAC,MAAM,SAAS,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,WAAW,KAAK,CAAC,MAAM,SAAS,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,WAAW,EAAE,CAAC,CAAC;AACrJ,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,GAAW;IAC1C,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,OAAO,OAAO;SACX,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;SAC7D,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAC9B,CAAC;AAED,KAAK,UAAU,uBAAuB,CAAC,QAAgB;IACrD,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;IAEtD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,eAAe,CAAC,MAAM,iBAAiB,CAAC,aAAa,CAAC,CAAC,CAAC;QACzE,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;YAC5B,MAAM,SAAS,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;YACzC,IAAI,SAAS,EAAE,CAAC;gBACd,OAAO,SAAS,CAAC;YACnB,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAc,EAAE,QAAgB;IAC5D,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IACjD,MAAM,gBAAgB,GAAG,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,mBAAmB,CAAC,CAAC;IAEvE,IAAI,KAAe,CAAC;IACpB,IAAI,CAAC;QACH,KAAK,GAAG,eAAe,CAAC,MAAM,iBAAiB,CAAC,gBAAgB,CAAC,CAAC,CAAC;IACrE,CAAC;IAAC,MAAM,CAAC;QACP,WAAW,EAAE,CAAC;QACd,OAAO;IACT,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,WAAW,EAAE,CAAC;QACd,OAAO;IACT,CAAC;IAED,MAAM,eAAe,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,uBAAuB,CAAC,QAAQ,CAAC,CAAC;IACjF,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;QACxC,MAAM,SAAS,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,eAAe,CAAC,CAAC,CAAC,SAAS,GAAG,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,MAAM,OAAO,GAAgB,EAAE,CAAC;IAChC,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;QACjC,MAAM,SAAS,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,SAAS;QACX,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;QACrE,MAAM,MAAM,GAAG,cAAc,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAClD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,SAAS;QACX,CAAC;QAED,IAAI,WAAW,IAAI,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,WAAW,CAAC,WAAW,EAAE,EAAE,CAAC;YAC5E,SAAS;QACX,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACvB,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,WAAW,EAAE,CAAC;QACd,OAAO;IACT,CAAC;IAED,YAAY,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;AACrC,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * squad discover / squad delegate — CLI commands for cross-squad orchestration.
3
+ *
4
+ * Commands:
5
+ * squad discover — list known squads and capabilities
6
+ * squad delegate <squad-name> <description> — create work in another squad
7
+ *
8
+ * @module cli/commands/cross-squad
9
+ */
10
+ export declare function discoverCommand(): Promise<void>;
11
+ export declare function delegateCommand(args: string[]): Promise<void>;
12
+ //# sourceMappingURL=cross-squad.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cross-squad.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/cross-squad.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAiBH,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAOrD;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA6CnE"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * squad discover / squad delegate — CLI commands for cross-squad orchestration.
3
+ *
4
+ * Commands:
5
+ * squad discover — list known squads and capabilities
6
+ * squad delegate <squad-name> <description> — create work in another squad
7
+ *
8
+ * @module cli/commands/cross-squad
9
+ */
10
+ import { execFile } from 'node:child_process';
11
+ import { promisify } from 'node:util';
12
+ import { success, info, BOLD, RESET, DIM } from '../core/output.js';
13
+ import { fatal } from '../core/errors.js';
14
+ import { detectSquadDir } from '../core/detect-squad-dir.js';
15
+ import { discoverSquads, formatDiscoveryTable, findSquadByName, buildDelegationArgs, } from '@bradygaster/squad-sdk';
16
+ const execFileAsync = promisify(execFile);
17
+ export async function discoverCommand() {
18
+ const squadDirInfo = detectSquadDir(process.cwd());
19
+ const squadDir = squadDirInfo.path;
20
+ const squads = discoverSquads(squadDir);
21
+ const output = formatDiscoveryTable(squads);
22
+ info(output);
23
+ }
24
+ export async function delegateCommand(args) {
25
+ const squadName = args[0];
26
+ const description = args.slice(1).join(' ');
27
+ if (!squadName || !description) {
28
+ fatal('Usage: squad delegate <squad-name> "<description>"');
29
+ }
30
+ const squadDirInfo = detectSquadDir(process.cwd());
31
+ const squadDir = squadDirInfo.path;
32
+ const squads = discoverSquads(squadDir);
33
+ const target = findSquadByName(squads, squadName);
34
+ if (!target) {
35
+ const names = squads.map(s => s.manifest.name).join(', ');
36
+ fatal(`Squad "${squadName}" not found.` +
37
+ (names ? ` Known squads: ${names}` : ' No squads discovered — run "squad discover" to check.'));
38
+ }
39
+ if (!target.manifest.accepts.includes('issues')) {
40
+ fatal(`Squad "${squadName}" does not accept issues. Accepts: ${target.manifest.accepts.join(', ')}`);
41
+ }
42
+ const labels = target.manifest.contact.labels || [];
43
+ const ghArgs = buildDelegationArgs({
44
+ targetRepo: target.manifest.contact.repo,
45
+ title: description,
46
+ body: buildDelegationBody(description, target),
47
+ labels,
48
+ });
49
+ info(`\n${BOLD}Delegating to ${squadName}${RESET}`);
50
+ info(` Repo: ${target.manifest.contact.repo}`);
51
+ info(` Title: [cross-squad] ${description}\n`);
52
+ try {
53
+ const { stdout } = await execFileAsync('gh', ghArgs);
54
+ const issueUrl = stdout.trim();
55
+ success(`Created cross-squad issue: ${issueUrl}`);
56
+ }
57
+ catch (err) {
58
+ fatal(`Failed to create issue: ${err.message}`);
59
+ }
60
+ }
61
+ function buildDelegationBody(description, target) {
62
+ return [
63
+ '## Cross-Squad Work Request',
64
+ '',
65
+ `**From:** this repository`,
66
+ `**To:** ${target.manifest.name} (${target.manifest.contact.repo})`,
67
+ '',
68
+ '### Description',
69
+ '',
70
+ description,
71
+ '',
72
+ '### Acceptance Criteria',
73
+ '',
74
+ '- [ ] Work completed and verified',
75
+ '- [ ] Originating squad notified of completion',
76
+ '',
77
+ `${DIM}Created by squad cross-squad orchestration${RESET}`,
78
+ ].join('\n');
79
+ }
80
+ //# sourceMappingURL=cross-squad.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cross-squad.js","sourceRoot":"","sources":["../../../src/cli/commands/cross-squad.ts"],"names":[],"mappings":"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"}
@@ -17,6 +17,11 @@ export interface DoctorCheck {
17
17
  }
18
18
  /** Detected squad layout mode. */
19
19
  export type DoctorMode = 'local' | 'remote' | 'hub';
20
+ /**
21
+ * Check that Node.js is ≥22.5.0 for node:sqlite availability.
22
+ * Accepts an optional version string for testing.
23
+ */
24
+ export declare function checkNodeVersion(nodeVersion?: string): DoctorCheck;
20
25
  /**
21
26
  * Run all doctor checks for the given working directory.
22
27
  * Returns an array of check results — never throws for check failures.
@@ -1 +1 @@
1
- {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,2CAA2C;AAC3C,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,kCAAkC;AAClC,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;AAkMpD;;;GAGG;AACH,wBAAsB,SAAS,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CA+BpE;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,UAAU,CAEtD;AAUD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,UAAU,GAAG,IAAI,CAc/E;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAK/D"}
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,2CAA2C;AAC3C,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,kCAAkC;AAClC,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;AAsPpD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,WAAW,CAalE;AAiGD;;;GAGG;AACH,wBAAsB,SAAS,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAwCpE;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,UAAU,CAEtD;AAUD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,UAAU,GAAG,IAAI,CAc/E;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAK/D"}
@@ -174,6 +174,154 @@ function checkDecisionsMd(squadDir) {
174
174
  message: exists ? 'file present' : 'file not found',
175
175
  };
176
176
  }
177
+ /**
178
+ * Report the last detected rate limit, if any, by reading the status file
179
+ * written by the shell when a rate limit error is caught.
180
+ */
181
+ function checkRateLimitStatus(squadDir) {
182
+ const statusPath = path.join(squadDir, 'rate-limit-status.json');
183
+ if (!fileExists(statusPath))
184
+ return undefined;
185
+ const data = tryReadJson(statusPath);
186
+ if (!data) {
187
+ return {
188
+ name: 'rate limit status',
189
+ status: 'warn',
190
+ message: 'rate-limit-status.json exists but could not be parsed',
191
+ };
192
+ }
193
+ const ts = typeof data['timestamp'] === 'string' ? new Date(data['timestamp']) : null;
194
+ const retryAfter = typeof data['retryAfter'] === 'number' ? data['retryAfter'] : null;
195
+ const model = typeof data['model'] === 'string' ? data['model'] : null;
196
+ const age = ts ? Math.floor((Date.now() - ts.getTime()) / 1000) : null;
197
+ const ageStr = age !== null ? ` (${formatAge(age)} ago)` : '';
198
+ const modelStr = model ? ` on model: ${model}` : '';
199
+ const retryStr = retryAfter ? ` — retry after ${retryAfter}s` : '';
200
+ // If last rate limit was more than 4 hours ago, treat as stale info (pass)
201
+ const stale = age !== null && age > 4 * 3600;
202
+ return {
203
+ name: 'rate limit status',
204
+ status: stale ? 'pass' : 'warn',
205
+ message: stale
206
+ ? `Last rate limit${ageStr}${modelStr} — appears resolved. Run \`squad economy on\` to reduce future risk.`
207
+ : `Rate limit detected${ageStr}${modelStr}${retryStr}. Run \`squad economy on\` to switch to cheaper models.`,
208
+ };
209
+ }
210
+ function formatAge(seconds) {
211
+ if (seconds >= 3600) {
212
+ const h = Math.floor(seconds / 3600);
213
+ return `${h}h`;
214
+ }
215
+ if (seconds >= 60) {
216
+ const m = Math.floor(seconds / 60);
217
+ return `${m}m`;
218
+ }
219
+ return `${seconds}s`;
220
+ }
221
+ // ── ESM compatibility checks ────────────────────────────────────────
222
+ // ── environment checks ─────────────────────────────────────────────
223
+ /**
224
+ * Check that Node.js is ≥22.5.0 for node:sqlite availability.
225
+ * Accepts an optional version string for testing.
226
+ */
227
+ export function checkNodeVersion(nodeVersion) {
228
+ const version = nodeVersion ?? process.versions.node;
229
+ const parts = version.split('.').map(Number);
230
+ const major = parts[0] ?? 0;
231
+ const minor = parts[1] ?? 0;
232
+ const ok = major > 22 || (major === 22 && minor >= 5);
233
+ return {
234
+ name: 'Node.js ≥22.5.0 (node:sqlite)',
235
+ status: ok ? 'pass' : 'fail',
236
+ message: ok
237
+ ? `v${version} — node:sqlite available`
238
+ : `v${version} — node:sqlite requires ≥22.5.0. Upgrade at https://nodejs.org/en/download`,
239
+ };
240
+ }
241
+ /**
242
+ * Check that vscode-jsonrpc has the `exports` field needed for Node 22/24+
243
+ * strict ESM subpath resolution. Without it, `import('vscode-jsonrpc/node')`
244
+ * fails with ERR_PACKAGE_PATH_NOT_EXPORTED.
245
+ */
246
+ function checkVscodeJsonrpcExports(cwd) {
247
+ const possiblePaths = [
248
+ path.join(cwd, 'node_modules', 'vscode-jsonrpc', 'package.json'),
249
+ path.join(cwd, 'packages', 'squad-cli', 'node_modules', 'vscode-jsonrpc', 'package.json'),
250
+ ];
251
+ for (const pkgPath of possiblePaths) {
252
+ if (!fileExists(pkgPath))
253
+ continue;
254
+ const pkg = tryReadJson(pkgPath);
255
+ if (!pkg) {
256
+ return {
257
+ name: 'vscode-jsonrpc exports field',
258
+ status: 'fail',
259
+ message: 'package.json found but not valid JSON',
260
+ };
261
+ }
262
+ if (pkg['exports'] && typeof pkg['exports'] === 'object') {
263
+ const exports = pkg['exports'];
264
+ if (exports['./node']) {
265
+ return {
266
+ name: 'vscode-jsonrpc exports field',
267
+ status: 'pass',
268
+ message: 'exports field present with ./node subpath',
269
+ };
270
+ }
271
+ }
272
+ return {
273
+ name: 'vscode-jsonrpc exports field',
274
+ status: 'fail',
275
+ message: 'missing exports field — run postinstall or reinstall (see #449)',
276
+ };
277
+ }
278
+ return {
279
+ name: 'vscode-jsonrpc exports field',
280
+ status: 'warn',
281
+ message: 'vscode-jsonrpc not found in node_modules',
282
+ };
283
+ }
284
+ /**
285
+ * Check that @github/copilot-sdk session.js has the .js extension fix
286
+ * on its vscode-jsonrpc/node import (defense-in-depth behind the exports patch).
287
+ */
288
+ function checkCopilotSdkSessionPatch(cwd) {
289
+ const possiblePaths = [
290
+ path.join(cwd, 'node_modules', '@github', 'copilot-sdk', 'dist', 'session.js'),
291
+ path.join(cwd, 'packages', 'squad-cli', 'node_modules', '@github', 'copilot-sdk', 'dist', 'session.js'),
292
+ ];
293
+ for (const sessionPath of possiblePaths) {
294
+ if (!fileExists(sessionPath))
295
+ continue;
296
+ try {
297
+ const content = fs.readFileSync(sessionPath, 'utf8');
298
+ if (/from\s+["']vscode-jsonrpc\/node["']/.test(content)) {
299
+ return {
300
+ name: 'copilot-sdk session.js ESM patch',
301
+ status: 'fail',
302
+ message: 'session.js has extensionless vscode-jsonrpc/node import — run postinstall (see #449)',
303
+ };
304
+ }
305
+ return {
306
+ name: 'copilot-sdk session.js ESM patch',
307
+ status: 'pass',
308
+ message: 'session.js imports use .js extension',
309
+ };
310
+ }
311
+ catch {
312
+ return {
313
+ name: 'copilot-sdk session.js ESM patch',
314
+ status: 'warn',
315
+ message: 'could not read session.js',
316
+ };
317
+ }
318
+ }
319
+ return {
320
+ name: 'copilot-sdk session.js ESM patch',
321
+ status: 'warn',
322
+ message: '@github/copilot-sdk not found in node_modules',
323
+ };
324
+ }
177
325
  // ── public API ──────────────────────────────────────────────────────
178
326
  /**
179
327
  * Run all doctor checks for the given working directory.
@@ -204,7 +352,15 @@ export async function runDoctor(cwd) {
204
352
  checks.push(checkAgentsDir(squadDir));
205
353
  checks.push(checkCastingRegistry(squadDir));
206
354
  checks.push(checkDecisionsMd(squadDir));
355
+ const rateLimitCheck = checkRateLimitStatus(squadDir);
356
+ if (rateLimitCheck)
357
+ checks.push(rateLimitCheck);
207
358
  }
359
+ // 10. Node.js version (node:sqlite availability)
360
+ checks.push(checkNodeVersion());
361
+ // 11-12. ESM compatibility (Node 22/24+)
362
+ checks.push(checkVscodeJsonrpcExports(resolvedCwd));
363
+ checks.push(checkCopilotSdkSessionPatch(resolvedCwd));
208
364
  return checks;
209
365
  }
210
366
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Economy mode command — toggle cost-conscious model selection.
3
+ *
4
+ * Usage:
5
+ * squad economy on — enable economy mode (persisted to config.json)
6
+ * squad economy off — disable economy mode
7
+ * squad economy — show current status
8
+ */
9
+ export declare function runEconomy(cwd: string, subArgs: string[]): Promise<void>;
10
+ //# sourceMappingURL=economy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"economy.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/economy.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAuBH,wBAAsB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAqC9E"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Economy mode command — toggle cost-conscious model selection.
3
+ *
4
+ * Usage:
5
+ * squad economy on — enable economy mode (persisted to config.json)
6
+ * squad economy off — disable economy mode
7
+ * squad economy — show current status
8
+ */
9
+ import { join } from 'node:path';
10
+ import { existsSync } from 'node:fs';
11
+ import { writeEconomyMode, readEconomyMode } from '@bradygaster/squad-sdk/config';
12
+ import { fatal } from '../core/errors.js';
13
+ import { BOLD, RESET, GREEN, DIM } from '../core/output.js';
14
+ function resolveSquadDir(cwd) {
15
+ // Walk up to find .squad/
16
+ let dir = cwd;
17
+ for (let i = 0; i < 10; i++) {
18
+ const candidate = join(dir, '.squad');
19
+ if (existsSync(candidate)) {
20
+ return candidate;
21
+ }
22
+ const parent = join(dir, '..');
23
+ if (parent === dir)
24
+ break;
25
+ dir = parent;
26
+ }
27
+ return null;
28
+ }
29
+ export async function runEconomy(cwd, subArgs) {
30
+ const squadDir = resolveSquadDir(cwd);
31
+ if (!squadDir) {
32
+ fatal('No squad found. Run "squad init" first.');
33
+ return;
34
+ }
35
+ const sub = subArgs[0]?.toLowerCase();
36
+ if (sub === 'on') {
37
+ writeEconomyMode(squadDir, true);
38
+ console.log(`${GREEN}✓${RESET} Economy mode ${BOLD}enabled${RESET} — cheaper models will be used for auto-selection.`);
39
+ console.log(` Saved to: ${DIM}${join(squadDir, 'config.json')}${RESET}`);
40
+ return;
41
+ }
42
+ if (sub === 'off') {
43
+ writeEconomyMode(squadDir, false);
44
+ console.log(`${GREEN}✓${RESET} Economy mode ${BOLD}disabled${RESET} — returning to standard model selection.`);
45
+ console.log(` Saved to: ${DIM}${join(squadDir, 'config.json')}${RESET}`);
46
+ return;
47
+ }
48
+ // Status display
49
+ const enabled = readEconomyMode(squadDir);
50
+ console.log(`\n${BOLD}Economy Mode${RESET}\n`);
51
+ console.log(` Status: ${enabled ? `${GREEN}enabled${RESET}` : `${DIM}disabled${RESET}`}`);
52
+ console.log(` Config: ${DIM}${join(squadDir, 'config.json')}${RESET}\n`);
53
+ if (enabled) {
54
+ console.log(` When active, auto-selected models are downgraded:`);
55
+ console.log(` ${DIM}claude-opus-4.6 → claude-sonnet-4.5 (architecture/review)${RESET}`);
56
+ console.log(` ${DIM}claude-sonnet-4.6 → gpt-4.1 (code writing)${RESET}`);
57
+ console.log(` ${DIM}claude-haiku-4.5 → gpt-4.1 (docs/mechanical)${RESET}`);
58
+ console.log(` Explicit overrides (config.json, charter) are never changed.\n`);
59
+ }
60
+ else {
61
+ console.log(` Usage: squad economy on | off\n`);
62
+ }
63
+ }
64
+ //# sourceMappingURL=economy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"economy.js","sourceRoot":"","sources":["../../../src/cli/commands/economy.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/export.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAiBH;;GAEG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA4E7E"}
1
+ {"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/export.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAiBH;;GAEG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAmF7E"}
@@ -60,11 +60,18 @@ export async function runExport(dest, outPath) {
60
60
  console.error(`Warning: could not read agents: ${err.message}`);
61
61
  }
62
62
  // Read skills
63
- const skillsDir = path.join(squadInfo.path, 'skills');
63
+ const skillSources = [
64
+ { dir: path.join(dest, '.copilot', 'skills'), layout: 'nested' },
65
+ { dir: path.join(squadInfo.path, 'skills'), layout: 'nested' },
66
+ { dir: path.join(dest, '.ai-team', 'skills'), layout: 'flat' },
67
+ ];
68
+ const skillsSource = skillSources.find(({ dir }) => fs.existsSync(dir));
64
69
  try {
65
- if (fs.existsSync(skillsDir)) {
66
- for (const entry of fs.readdirSync(skillsDir)) {
67
- const skillFile = path.join(skillsDir, entry, 'SKILL.md');
70
+ if (skillsSource) {
71
+ for (const entry of fs.readdirSync(skillsSource.dir)) {
72
+ const skillFile = skillsSource.layout === 'nested'
73
+ ? path.join(skillsSource.dir, entry, 'SKILL.md')
74
+ : path.join(skillsSource.dir, entry);
68
75
  if (fs.existsSync(skillFile)) {
69
76
  manifest.skills.push(fs.readFileSync(skillFile, 'utf8'));
70
77
  }