squads-cli 0.6.2 → 0.7.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.
- package/README.md +196 -1152
- package/dist/auth-YW3UPFSB.js +23 -0
- package/dist/autonomy-BWTVDEAT.js +102 -0
- package/dist/autonomy-BWTVDEAT.js.map +1 -0
- package/dist/chunk-3KCWNZWW.js +401 -0
- package/dist/chunk-3KCWNZWW.js.map +1 -0
- package/dist/chunk-67RO2HKR.js +174 -0
- package/dist/chunk-67RO2HKR.js.map +1 -0
- package/dist/chunk-7JVD7RD4.js +275 -0
- package/dist/chunk-7JVD7RD4.js.map +1 -0
- package/dist/chunk-BODLDQY7.js +452 -0
- package/dist/chunk-BODLDQY7.js.map +1 -0
- package/dist/chunk-FFFCFZ6A.js +121 -0
- package/dist/chunk-FFFCFZ6A.js.map +1 -0
- package/dist/chunk-FIWT2NMM.js +165 -0
- package/dist/chunk-FIWT2NMM.js.map +1 -0
- package/dist/chunk-L6GQCHDF.js +222 -0
- package/dist/chunk-L6GQCHDF.js.map +1 -0
- package/dist/{chunk-O7UV3FWI.js → chunk-LDM62TIX.js} +2 -2
- package/dist/chunk-LDM62TIX.js.map +1 -0
- package/dist/chunk-LOA3KWYJ.js +294 -0
- package/dist/chunk-LOA3KWYJ.js.map +1 -0
- package/dist/chunk-NA45DFXY.js +616 -0
- package/dist/chunk-NA45DFXY.js.map +1 -0
- package/dist/{chunk-4CMAEQQY.js → chunk-NQN6JPI7.js} +4 -3
- package/dist/chunk-NQN6JPI7.js.map +1 -0
- package/dist/chunk-OQJHPULO.js +103 -0
- package/dist/chunk-OQJHPULO.js.map +1 -0
- package/dist/chunk-QHNUMM4V.js +87 -0
- package/dist/chunk-QHNUMM4V.js.map +1 -0
- package/dist/chunk-RM6BWILN.js +74 -0
- package/dist/chunk-RM6BWILN.js.map +1 -0
- package/dist/chunk-WBR5J7EX.js +90 -0
- package/dist/chunk-WBR5J7EX.js.map +1 -0
- package/dist/chunk-Z2UKDBNL.js +162 -0
- package/dist/chunk-Z2UKDBNL.js.map +1 -0
- package/dist/cli.js +2136 -12600
- package/dist/cli.js.map +1 -1
- package/dist/context-M2A2DOFV.js +291 -0
- package/dist/context-M2A2DOFV.js.map +1 -0
- package/dist/context-feed-JMNW4GAM.js +391 -0
- package/dist/context-feed-JMNW4GAM.js.map +1 -0
- package/dist/cost-N37I4UTA.js +274 -0
- package/dist/cost-N37I4UTA.js.map +1 -0
- package/dist/create-554W5HNU.js +286 -0
- package/dist/create-554W5HNU.js.map +1 -0
- package/dist/daemon-XWPQPPPN.js +546 -0
- package/dist/daemon-XWPQPPPN.js.map +1 -0
- package/dist/dashboard-L7YKVQEB.js +945 -0
- package/dist/dashboard-L7YKVQEB.js.map +1 -0
- package/dist/dashboard-MFNRLCEE.js +794 -0
- package/dist/dashboard-MFNRLCEE.js.map +1 -0
- package/dist/doctor-RG75M5RO.js +346 -0
- package/dist/doctor-RG75M5RO.js.map +1 -0
- package/dist/env-config-KCLDBKYX.js +21 -0
- package/dist/exec-JQKBF7BL.js +197 -0
- package/dist/exec-JQKBF7BL.js.map +1 -0
- package/dist/feedback-KA2UYBZG.js +229 -0
- package/dist/feedback-KA2UYBZG.js.map +1 -0
- package/dist/github-UQTM5KMS.js +23 -0
- package/dist/goal-EOPC5ZCD.js +168 -0
- package/dist/goal-EOPC5ZCD.js.map +1 -0
- package/dist/health-3FZDOSR5.js +209 -0
- package/dist/health-3FZDOSR5.js.map +1 -0
- package/dist/history-TFVXJEDH.js +229 -0
- package/dist/history-TFVXJEDH.js.map +1 -0
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/init-UOWTNMIE.js +747 -0
- package/dist/init-UOWTNMIE.js.map +1 -0
- package/dist/kpi-2SQ2WCVT.js +413 -0
- package/dist/kpi-2SQ2WCVT.js.map +1 -0
- package/dist/learn-6ERTERAO.js +269 -0
- package/dist/learn-6ERTERAO.js.map +1 -0
- package/dist/list-KSOMUBMB.js +92 -0
- package/dist/list-KSOMUBMB.js.map +1 -0
- package/dist/login-ST6PAXYE.js +155 -0
- package/dist/login-ST6PAXYE.js.map +1 -0
- package/dist/memory-3CSNKXIL.js +562 -0
- package/dist/memory-3CSNKXIL.js.map +1 -0
- package/dist/progress-FKG4V2VH.js +202 -0
- package/dist/progress-FKG4V2VH.js.map +1 -0
- package/dist/providers-66PDCORB.js +65 -0
- package/dist/providers-66PDCORB.js.map +1 -0
- package/dist/results-2MJFLWEO.js +224 -0
- package/dist/results-2MJFLWEO.js.map +1 -0
- package/dist/run-72OQLH5A.js +2685 -0
- package/dist/run-72OQLH5A.js.map +1 -0
- package/dist/session-6H67XPAQ.js +64 -0
- package/dist/session-6H67XPAQ.js.map +1 -0
- package/dist/{chunk-NHGLXN2F.js → sessions-GVQIMN4W.js} +23 -459
- package/dist/sessions-GVQIMN4W.js.map +1 -0
- package/dist/{squad-parser-4BI3G4RS.js → squad-parser-CM3HOIWM.js} +2 -2
- package/dist/squad-parser-CM3HOIWM.js.map +1 -0
- package/dist/stats-ONZI557Q.js +335 -0
- package/dist/stats-ONZI557Q.js.map +1 -0
- package/dist/status-FYH42FTB.js +346 -0
- package/dist/status-FYH42FTB.js.map +1 -0
- package/dist/sync-HJZJNXHW.js +800 -0
- package/dist/sync-HJZJNXHW.js.map +1 -0
- package/dist/update-B4WMUOPO.js +83 -0
- package/dist/update-B4WMUOPO.js.map +1 -0
- package/dist/{update-ALJKFFM7.js → update-L7FGHN6W.js} +2 -2
- package/dist/update-L7FGHN6W.js.map +1 -0
- package/package.json +18 -10
- package/dist/chunk-4CMAEQQY.js.map +0 -1
- package/dist/chunk-NHGLXN2F.js.map +0 -1
- package/dist/chunk-O7UV3FWI.js.map +0 -1
- package/dist/sessions-6PB7ALCE.js +0 -16
- /package/dist/{sessions-6PB7ALCE.js.map → auth-YW3UPFSB.js.map} +0 -0
- /package/dist/{squad-parser-4BI3G4RS.js.map → env-config-KCLDBKYX.js.map} +0 -0
- /package/dist/{update-ALJKFFM7.js.map → github-UQTM5KMS.js.map} +0 -0
|
@@ -0,0 +1,747 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
loadTemplate
|
|
4
|
+
} from "./chunk-FFFCFZ6A.js";
|
|
5
|
+
import {
|
|
6
|
+
checkGitStatus,
|
|
7
|
+
getRepoName
|
|
8
|
+
} from "./chunk-3KCWNZWW.js";
|
|
9
|
+
import {
|
|
10
|
+
Events,
|
|
11
|
+
track
|
|
12
|
+
} from "./chunk-L6GQCHDF.js";
|
|
13
|
+
import {
|
|
14
|
+
RESET,
|
|
15
|
+
colors,
|
|
16
|
+
icons,
|
|
17
|
+
writeLine
|
|
18
|
+
} from "./chunk-N7KDWU4W.js";
|
|
19
|
+
import "./chunk-7OCVIDC7.js";
|
|
20
|
+
|
|
21
|
+
// src/commands/init.ts
|
|
22
|
+
import chalk from "chalk";
|
|
23
|
+
import ora from "ora";
|
|
24
|
+
import fs from "fs/promises";
|
|
25
|
+
import path from "path";
|
|
26
|
+
import { createInterface } from "readline";
|
|
27
|
+
|
|
28
|
+
// src/lib/setup-checks.ts
|
|
29
|
+
import { execSync, spawn } from "child_process";
|
|
30
|
+
var PROVIDERS = {
|
|
31
|
+
claude: {
|
|
32
|
+
id: "claude",
|
|
33
|
+
name: "Claude Code (Anthropic)",
|
|
34
|
+
cliCheck: "claude",
|
|
35
|
+
installCmd: "npm install -g @anthropic-ai/claude-code",
|
|
36
|
+
loginCmd: "claude login",
|
|
37
|
+
requiresSubscription: true,
|
|
38
|
+
requiresApiKey: false
|
|
39
|
+
},
|
|
40
|
+
gemini: {
|
|
41
|
+
id: "gemini",
|
|
42
|
+
name: "Gemini (Google)",
|
|
43
|
+
cliCheck: "gemini",
|
|
44
|
+
envKey: "GEMINI_API_KEY",
|
|
45
|
+
installCmd: "npm install -g @anthropic-ai/claude-code",
|
|
46
|
+
// Placeholder - gemini CLI
|
|
47
|
+
requiresSubscription: false,
|
|
48
|
+
requiresApiKey: true
|
|
49
|
+
},
|
|
50
|
+
openai: {
|
|
51
|
+
id: "openai",
|
|
52
|
+
name: "GPT (OpenAI)",
|
|
53
|
+
envKey: "OPENAI_API_KEY",
|
|
54
|
+
requiresSubscription: false,
|
|
55
|
+
requiresApiKey: true
|
|
56
|
+
},
|
|
57
|
+
ollama: {
|
|
58
|
+
id: "ollama",
|
|
59
|
+
name: "Ollama (Local)",
|
|
60
|
+
cliCheck: "ollama",
|
|
61
|
+
installCmd: "brew install ollama",
|
|
62
|
+
requiresSubscription: false,
|
|
63
|
+
requiresApiKey: false
|
|
64
|
+
},
|
|
65
|
+
cursor: {
|
|
66
|
+
id: "cursor",
|
|
67
|
+
name: "Cursor IDE",
|
|
68
|
+
requiresSubscription: true,
|
|
69
|
+
requiresApiKey: false
|
|
70
|
+
},
|
|
71
|
+
aider: {
|
|
72
|
+
id: "aider",
|
|
73
|
+
name: "Aider",
|
|
74
|
+
cliCheck: "aider",
|
|
75
|
+
installCmd: "pip install aider-chat",
|
|
76
|
+
requiresSubscription: false,
|
|
77
|
+
requiresApiKey: true
|
|
78
|
+
},
|
|
79
|
+
none: {
|
|
80
|
+
id: "none",
|
|
81
|
+
name: "Planning Only (no agent execution)",
|
|
82
|
+
requiresSubscription: false,
|
|
83
|
+
requiresApiKey: false
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
function commandExists(cmd) {
|
|
87
|
+
try {
|
|
88
|
+
execSync(`which ${cmd}`, { stdio: "ignore" });
|
|
89
|
+
return true;
|
|
90
|
+
} catch {
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
function checkGhCli() {
|
|
95
|
+
if (!commandExists("gh")) {
|
|
96
|
+
return {
|
|
97
|
+
name: "GitHub CLI",
|
|
98
|
+
status: "missing",
|
|
99
|
+
message: "Required for GitHub integration",
|
|
100
|
+
hint: "Install: brew install gh",
|
|
101
|
+
fixCommand: "brew install gh"
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
try {
|
|
105
|
+
execSync("gh auth status", { stdio: "ignore" });
|
|
106
|
+
return { name: "GitHub CLI", status: "ok" };
|
|
107
|
+
} catch {
|
|
108
|
+
return {
|
|
109
|
+
name: "GitHub CLI",
|
|
110
|
+
status: "warning",
|
|
111
|
+
message: "Installed but not authenticated",
|
|
112
|
+
hint: "Run: gh auth login",
|
|
113
|
+
fixCommand: "gh auth login"
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
function checkGhPermissions() {
|
|
118
|
+
try {
|
|
119
|
+
const result = execSync("gh auth status 2>&1", { encoding: "utf-8", stdio: ["pipe", "pipe", "pipe"] });
|
|
120
|
+
const hasRepo = result.includes("repo") || result.includes("Token scopes:") && !result.includes("none");
|
|
121
|
+
const hasWorkflow = result.includes("workflow");
|
|
122
|
+
if (!hasRepo) {
|
|
123
|
+
return {
|
|
124
|
+
name: "GitHub Permissions",
|
|
125
|
+
status: "warning",
|
|
126
|
+
message: "Missing repo scope",
|
|
127
|
+
hint: "Run: gh auth refresh -s repo,workflow",
|
|
128
|
+
fixCommand: "gh auth refresh -s repo,workflow"
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
if (!hasWorkflow) {
|
|
132
|
+
return {
|
|
133
|
+
name: "GitHub Permissions",
|
|
134
|
+
status: "warning",
|
|
135
|
+
message: "Missing workflow scope (optional)",
|
|
136
|
+
hint: "For Actions: gh auth refresh -s repo,workflow"
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
return { name: "GitHub Permissions", status: "ok" };
|
|
140
|
+
} catch {
|
|
141
|
+
return {
|
|
142
|
+
name: "GitHub Permissions",
|
|
143
|
+
status: "warning",
|
|
144
|
+
message: "Could not verify permissions",
|
|
145
|
+
hint: "Run: gh auth status"
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
function checkClaudeCli() {
|
|
150
|
+
if (!commandExists("claude")) {
|
|
151
|
+
return {
|
|
152
|
+
name: "Claude CLI",
|
|
153
|
+
status: "missing",
|
|
154
|
+
message: "Required to run agents",
|
|
155
|
+
hint: "Install: npm install -g @anthropic-ai/claude-code",
|
|
156
|
+
fixCommand: "npm install -g @anthropic-ai/claude-code"
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
try {
|
|
160
|
+
execSync("claude --version", { stdio: "ignore" });
|
|
161
|
+
return { name: "Claude CLI", status: "ok" };
|
|
162
|
+
} catch {
|
|
163
|
+
return {
|
|
164
|
+
name: "Claude CLI",
|
|
165
|
+
status: "warning",
|
|
166
|
+
message: "Installed but may need login",
|
|
167
|
+
hint: "Run: claude login",
|
|
168
|
+
fixCommand: "claude login"
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
function checkProviderAuth(providerId) {
|
|
173
|
+
const provider = PROVIDERS[providerId];
|
|
174
|
+
if (!provider) {
|
|
175
|
+
return { name: "Provider", status: "warning", message: `Unknown provider: ${providerId}` };
|
|
176
|
+
}
|
|
177
|
+
if (providerId === "none" || providerId === "cursor") {
|
|
178
|
+
return { name: provider.name, status: "ok" };
|
|
179
|
+
}
|
|
180
|
+
if (provider.cliCheck) {
|
|
181
|
+
if (!commandExists(provider.cliCheck)) {
|
|
182
|
+
return {
|
|
183
|
+
name: provider.name,
|
|
184
|
+
status: "missing",
|
|
185
|
+
message: `CLI not installed`,
|
|
186
|
+
hint: provider.installCmd ? `Install: ${provider.installCmd}` : void 0,
|
|
187
|
+
fixCommand: provider.installCmd
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
if (provider.envKey && provider.requiresApiKey) {
|
|
192
|
+
if (!process.env[provider.envKey]) {
|
|
193
|
+
return {
|
|
194
|
+
name: provider.name,
|
|
195
|
+
status: "warning",
|
|
196
|
+
message: `${provider.envKey} not set`,
|
|
197
|
+
hint: `Set environment variable: export ${provider.envKey}=<your-key>`
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
return { name: provider.name, status: "ok" };
|
|
202
|
+
}
|
|
203
|
+
function runAuthChecks(providerId) {
|
|
204
|
+
const checks = [];
|
|
205
|
+
checks.push(checkProviderAuth(providerId));
|
|
206
|
+
if (providerId === "claude") {
|
|
207
|
+
checks.push(checkClaudeCli());
|
|
208
|
+
}
|
|
209
|
+
if (providerId !== "none") {
|
|
210
|
+
checks.push(checkGhPermissions());
|
|
211
|
+
}
|
|
212
|
+
return checks;
|
|
213
|
+
}
|
|
214
|
+
function displayCheckResults(checks) {
|
|
215
|
+
const errorChecks = [];
|
|
216
|
+
const warningChecks = [];
|
|
217
|
+
for (const check of checks) {
|
|
218
|
+
const icon = getStatusIcon(check.status);
|
|
219
|
+
const statusColor = getStatusColor(check.status);
|
|
220
|
+
if (check.status === "ok") {
|
|
221
|
+
writeLine(` ${icon} ${check.name}`);
|
|
222
|
+
} else {
|
|
223
|
+
const suffix = check.message ? ` ${colors.dim}(${check.message})${RESET}` : "";
|
|
224
|
+
writeLine(` ${icon} ${statusColor}${check.name}${RESET}${suffix}`);
|
|
225
|
+
if (check.hint) {
|
|
226
|
+
writeLine(` ${colors.cyan}\u2192 ${check.hint}${RESET}`);
|
|
227
|
+
}
|
|
228
|
+
if (check.status === "error" || check.status === "missing") {
|
|
229
|
+
errorChecks.push(check);
|
|
230
|
+
} else if (check.status === "warning") {
|
|
231
|
+
warningChecks.push(check);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
return {
|
|
236
|
+
hasErrors: errorChecks.length > 0,
|
|
237
|
+
hasWarnings: warningChecks.length > 0,
|
|
238
|
+
errorChecks,
|
|
239
|
+
warningChecks
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
function getStatusIcon(status) {
|
|
243
|
+
switch (status) {
|
|
244
|
+
case "ok":
|
|
245
|
+
return `${colors.green}${icons.success}${RESET}`;
|
|
246
|
+
case "warning":
|
|
247
|
+
return `${colors.yellow}${icons.warning}${RESET}`;
|
|
248
|
+
case "missing":
|
|
249
|
+
case "error":
|
|
250
|
+
return `${colors.red}${icons.error}${RESET}`;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
function getStatusColor(status) {
|
|
254
|
+
switch (status) {
|
|
255
|
+
case "ok":
|
|
256
|
+
return colors.green;
|
|
257
|
+
case "warning":
|
|
258
|
+
return colors.yellow;
|
|
259
|
+
case "missing":
|
|
260
|
+
case "error":
|
|
261
|
+
return colors.red;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
// src/commands/init.ts
|
|
266
|
+
function getUseCaseConfig(useCase) {
|
|
267
|
+
const configs = {
|
|
268
|
+
engineering: {
|
|
269
|
+
label: "Engineering",
|
|
270
|
+
description: "Ships code",
|
|
271
|
+
squads: [getEngineeringSquad()]
|
|
272
|
+
},
|
|
273
|
+
marketing: {
|
|
274
|
+
label: "Marketing",
|
|
275
|
+
description: "Grows audience",
|
|
276
|
+
squads: [getMarketingSquad()]
|
|
277
|
+
},
|
|
278
|
+
operations: {
|
|
279
|
+
label: "Operations",
|
|
280
|
+
description: "Runs the business",
|
|
281
|
+
squads: [getOperationsSquad()]
|
|
282
|
+
},
|
|
283
|
+
"full-company": {
|
|
284
|
+
label: "Full Company",
|
|
285
|
+
description: "Engineering + Marketing + Operations",
|
|
286
|
+
squads: [getEngineeringSquad(), getMarketingSquad(), getOperationsSquad()]
|
|
287
|
+
},
|
|
288
|
+
custom: {
|
|
289
|
+
label: "Custom",
|
|
290
|
+
description: "Empty scaffold \u2014 you build from scratch",
|
|
291
|
+
squads: []
|
|
292
|
+
}
|
|
293
|
+
};
|
|
294
|
+
return configs[useCase];
|
|
295
|
+
}
|
|
296
|
+
function getEngineeringSquad() {
|
|
297
|
+
return {
|
|
298
|
+
name: "engineering",
|
|
299
|
+
agentCount: 3,
|
|
300
|
+
agentSummary: "issue-solver, code-reviewer, test-writer",
|
|
301
|
+
dirs: [
|
|
302
|
+
".agents/squads/engineering",
|
|
303
|
+
".agents/memory/engineering/issue-solver",
|
|
304
|
+
".agents/memory/engineering/code-reviewer",
|
|
305
|
+
".agents/memory/engineering/test-writer"
|
|
306
|
+
],
|
|
307
|
+
files: [
|
|
308
|
+
[".agents/squads/engineering/SQUAD.md", "squads/engineering/SQUAD.md"],
|
|
309
|
+
[".agents/squads/engineering/issue-solver.md", "squads/engineering/issue-solver.md"],
|
|
310
|
+
[".agents/squads/engineering/code-reviewer.md", "squads/engineering/code-reviewer.md"],
|
|
311
|
+
[".agents/squads/engineering/test-writer.md", "squads/engineering/test-writer.md"]
|
|
312
|
+
],
|
|
313
|
+
memoryFiles: [
|
|
314
|
+
[".agents/memory/engineering/issue-solver/state.md", "memory/engineering/issue-solver/state.md"]
|
|
315
|
+
]
|
|
316
|
+
};
|
|
317
|
+
}
|
|
318
|
+
function getMarketingSquad() {
|
|
319
|
+
return {
|
|
320
|
+
name: "marketing",
|
|
321
|
+
agentCount: 3,
|
|
322
|
+
agentSummary: "content-drafter, social-poster, growth-analyst",
|
|
323
|
+
dirs: [
|
|
324
|
+
".agents/squads/marketing",
|
|
325
|
+
".agents/memory/marketing/content-drafter",
|
|
326
|
+
".agents/memory/marketing/social-poster",
|
|
327
|
+
".agents/memory/marketing/growth-analyst"
|
|
328
|
+
],
|
|
329
|
+
files: [
|
|
330
|
+
[".agents/squads/marketing/SQUAD.md", "squads/marketing/SQUAD.md"],
|
|
331
|
+
[".agents/squads/marketing/content-drafter.md", "squads/marketing/content-drafter.md"],
|
|
332
|
+
[".agents/squads/marketing/social-poster.md", "squads/marketing/social-poster.md"],
|
|
333
|
+
[".agents/squads/marketing/growth-analyst.md", "squads/marketing/growth-analyst.md"]
|
|
334
|
+
],
|
|
335
|
+
memoryFiles: [
|
|
336
|
+
[".agents/memory/marketing/content-drafter/state.md", "memory/marketing/content-drafter/state.md"]
|
|
337
|
+
]
|
|
338
|
+
};
|
|
339
|
+
}
|
|
340
|
+
function getOperationsSquad() {
|
|
341
|
+
return {
|
|
342
|
+
name: "operations",
|
|
343
|
+
agentCount: 3,
|
|
344
|
+
agentSummary: "ops-lead, finance-tracker, goal-tracker",
|
|
345
|
+
dirs: [
|
|
346
|
+
".agents/squads/operations",
|
|
347
|
+
".agents/memory/operations/ops-lead",
|
|
348
|
+
".agents/memory/operations/finance-tracker",
|
|
349
|
+
".agents/memory/operations/goal-tracker"
|
|
350
|
+
],
|
|
351
|
+
files: [
|
|
352
|
+
[".agents/squads/operations/SQUAD.md", "squads/operations/SQUAD.md"],
|
|
353
|
+
[".agents/squads/operations/ops-lead.md", "squads/operations/ops-lead.md"],
|
|
354
|
+
[".agents/squads/operations/finance-tracker.md", "squads/operations/finance-tracker.md"],
|
|
355
|
+
[".agents/squads/operations/goal-tracker.md", "squads/operations/goal-tracker.md"]
|
|
356
|
+
],
|
|
357
|
+
memoryFiles: [
|
|
358
|
+
[".agents/memory/operations/ops-lead/state.md", "memory/operations/ops-lead/state.md"]
|
|
359
|
+
]
|
|
360
|
+
};
|
|
361
|
+
}
|
|
362
|
+
function isInteractive() {
|
|
363
|
+
return process.stdin.isTTY === true && process.stdout.isTTY === true;
|
|
364
|
+
}
|
|
365
|
+
async function prompt(question, defaultValue = "") {
|
|
366
|
+
if (!isInteractive()) return defaultValue;
|
|
367
|
+
const rl = createInterface({
|
|
368
|
+
input: process.stdin,
|
|
369
|
+
output: process.stdout
|
|
370
|
+
});
|
|
371
|
+
return new Promise((resolve) => {
|
|
372
|
+
const suffix = defaultValue ? chalk.dim(` (${defaultValue})`) : "";
|
|
373
|
+
rl.question(` ${question}${suffix} `, (answer) => {
|
|
374
|
+
rl.close();
|
|
375
|
+
resolve(answer.trim() || defaultValue);
|
|
376
|
+
});
|
|
377
|
+
});
|
|
378
|
+
}
|
|
379
|
+
async function promptProvider(forceProvider) {
|
|
380
|
+
if (forceProvider && forceProvider in PROVIDERS) {
|
|
381
|
+
return forceProvider;
|
|
382
|
+
}
|
|
383
|
+
if (!isInteractive()) return "claude";
|
|
384
|
+
writeLine();
|
|
385
|
+
writeLine(chalk.bold(" Select your AI assistant:"));
|
|
386
|
+
writeLine();
|
|
387
|
+
writeLine(` ${chalk.cyan("1)")} Claude Code ${chalk.dim("(recommended)")}`);
|
|
388
|
+
writeLine(` ${chalk.cyan("2)")} Gemini`);
|
|
389
|
+
writeLine(` ${chalk.cyan("3)")} OpenAI GPT`);
|
|
390
|
+
writeLine(` ${chalk.cyan("4)")} Ollama ${chalk.dim("(local)")}`);
|
|
391
|
+
writeLine(` ${chalk.cyan("5)")} Other/None`);
|
|
392
|
+
writeLine();
|
|
393
|
+
const rl = createInterface({
|
|
394
|
+
input: process.stdin,
|
|
395
|
+
output: process.stdout
|
|
396
|
+
});
|
|
397
|
+
return new Promise((resolve) => {
|
|
398
|
+
rl.question(` ${chalk.dim("Enter choice [1-5]:")} `, (answer) => {
|
|
399
|
+
rl.close();
|
|
400
|
+
const choice = answer.trim() || "1";
|
|
401
|
+
switch (choice) {
|
|
402
|
+
case "1":
|
|
403
|
+
resolve("claude");
|
|
404
|
+
break;
|
|
405
|
+
case "2":
|
|
406
|
+
resolve("gemini");
|
|
407
|
+
break;
|
|
408
|
+
case "3":
|
|
409
|
+
resolve("openai");
|
|
410
|
+
break;
|
|
411
|
+
case "4":
|
|
412
|
+
resolve("ollama");
|
|
413
|
+
break;
|
|
414
|
+
case "5":
|
|
415
|
+
resolve("none");
|
|
416
|
+
break;
|
|
417
|
+
default:
|
|
418
|
+
resolve("claude");
|
|
419
|
+
break;
|
|
420
|
+
}
|
|
421
|
+
});
|
|
422
|
+
});
|
|
423
|
+
}
|
|
424
|
+
async function promptUseCase() {
|
|
425
|
+
if (!isInteractive()) return "full-company";
|
|
426
|
+
writeLine();
|
|
427
|
+
writeLine(chalk.bold(" What does your AI workforce need to do?"));
|
|
428
|
+
writeLine();
|
|
429
|
+
writeLine(` ${chalk.cyan("1)")} Engineering ${chalk.dim("\u2014 ships code (issue-solver, code-reviewer, test-writer)")}`);
|
|
430
|
+
writeLine(` ${chalk.cyan("2)")} Marketing ${chalk.dim("\u2014 grows audience (content-drafter, social-poster, growth-analyst)")}`);
|
|
431
|
+
writeLine(` ${chalk.cyan("3)")} Operations ${chalk.dim("\u2014 runs the business (ops-lead, finance-tracker, goal-tracker)")}`);
|
|
432
|
+
writeLine(` ${chalk.cyan("4)")} Full Company ${chalk.dim("\u2014 all of the above")} ${chalk.green("(recommended)")}`);
|
|
433
|
+
writeLine(` ${chalk.cyan("5)")} Custom ${chalk.dim("\u2014 empty scaffold, you build from scratch")}`);
|
|
434
|
+
writeLine();
|
|
435
|
+
const rl = createInterface({
|
|
436
|
+
input: process.stdin,
|
|
437
|
+
output: process.stdout
|
|
438
|
+
});
|
|
439
|
+
return new Promise((resolve) => {
|
|
440
|
+
rl.question(` ${chalk.dim("Enter choice [1-5]:")} `, (answer) => {
|
|
441
|
+
rl.close();
|
|
442
|
+
const choice = answer.trim() || "4";
|
|
443
|
+
switch (choice) {
|
|
444
|
+
case "1":
|
|
445
|
+
resolve("engineering");
|
|
446
|
+
break;
|
|
447
|
+
case "2":
|
|
448
|
+
resolve("marketing");
|
|
449
|
+
break;
|
|
450
|
+
case "3":
|
|
451
|
+
resolve("operations");
|
|
452
|
+
break;
|
|
453
|
+
case "4":
|
|
454
|
+
resolve("full-company");
|
|
455
|
+
break;
|
|
456
|
+
case "5":
|
|
457
|
+
resolve("custom");
|
|
458
|
+
break;
|
|
459
|
+
default:
|
|
460
|
+
resolve("full-company");
|
|
461
|
+
break;
|
|
462
|
+
}
|
|
463
|
+
});
|
|
464
|
+
});
|
|
465
|
+
}
|
|
466
|
+
async function fileExists(filePath) {
|
|
467
|
+
try {
|
|
468
|
+
await fs.access(filePath);
|
|
469
|
+
return true;
|
|
470
|
+
} catch {
|
|
471
|
+
return false;
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
function loadSeedTemplate(templatePath, variables = {}) {
|
|
475
|
+
return loadTemplate(`seed/${templatePath}`, variables);
|
|
476
|
+
}
|
|
477
|
+
async function writeIfNew(filePath, content) {
|
|
478
|
+
if (await fileExists(filePath)) return false;
|
|
479
|
+
await fs.mkdir(path.dirname(filePath), { recursive: true });
|
|
480
|
+
await fs.writeFile(filePath, content);
|
|
481
|
+
return true;
|
|
482
|
+
}
|
|
483
|
+
async function writeFile(filePath, content) {
|
|
484
|
+
await fs.mkdir(path.dirname(filePath), { recursive: true });
|
|
485
|
+
await fs.writeFile(filePath, content);
|
|
486
|
+
}
|
|
487
|
+
async function initCommand(options) {
|
|
488
|
+
const cwd = process.cwd();
|
|
489
|
+
writeLine();
|
|
490
|
+
writeLine(chalk.bold(" Plant the seed for your AI workforce"));
|
|
491
|
+
writeLine(chalk.dim(" https://agents-squads.com/docs/getting-started"));
|
|
492
|
+
writeLine();
|
|
493
|
+
const selectedProvider = await promptProvider(options.provider);
|
|
494
|
+
const provider = PROVIDERS[selectedProvider];
|
|
495
|
+
writeLine();
|
|
496
|
+
writeLine(chalk.bold(" Checking prerequisites..."));
|
|
497
|
+
writeLine();
|
|
498
|
+
const checks = [
|
|
499
|
+
...runAuthChecks(selectedProvider),
|
|
500
|
+
checkGhCli()
|
|
501
|
+
];
|
|
502
|
+
const gitStatus = checkGitStatus(cwd);
|
|
503
|
+
if (!gitStatus.isGitRepo) {
|
|
504
|
+
checks.push({
|
|
505
|
+
name: "Git Repository",
|
|
506
|
+
status: "missing",
|
|
507
|
+
message: "Git is the coordination layer",
|
|
508
|
+
hint: "Run: git init",
|
|
509
|
+
fixCommand: "git init"
|
|
510
|
+
});
|
|
511
|
+
} else {
|
|
512
|
+
checks.push({ name: "Git Repository", status: "ok" });
|
|
513
|
+
if (gitStatus.hasRemote) {
|
|
514
|
+
const repoName = getRepoName(gitStatus.remoteUrl);
|
|
515
|
+
checks.push({ name: `Remote: ${repoName || gitStatus.remoteUrl}`, status: "ok" });
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
const { hasErrors } = displayCheckResults(checks);
|
|
519
|
+
if (hasErrors && !options.force) {
|
|
520
|
+
writeLine();
|
|
521
|
+
writeLine(chalk.red(" Fix the errors above before continuing."));
|
|
522
|
+
writeLine(chalk.dim(" Or run with --force to skip checks."));
|
|
523
|
+
writeLine();
|
|
524
|
+
process.exit(1);
|
|
525
|
+
}
|
|
526
|
+
writeLine();
|
|
527
|
+
let businessName;
|
|
528
|
+
let businessDescription;
|
|
529
|
+
let businessFocus;
|
|
530
|
+
let selectedUseCase;
|
|
531
|
+
if (options.yes || options.quick || !isInteractive()) {
|
|
532
|
+
businessName = path.basename(cwd);
|
|
533
|
+
businessDescription = "General business operations";
|
|
534
|
+
businessFocus = "Our market, competitors, and growth opportunities";
|
|
535
|
+
selectedUseCase = "full-company";
|
|
536
|
+
} else {
|
|
537
|
+
const dirName = path.basename(cwd);
|
|
538
|
+
writeLine(chalk.bold(" Tell us about your business:"));
|
|
539
|
+
writeLine();
|
|
540
|
+
businessName = await prompt(
|
|
541
|
+
"Company or project name?",
|
|
542
|
+
dirName
|
|
543
|
+
);
|
|
544
|
+
businessDescription = await prompt(
|
|
545
|
+
"What does it do? (one sentence)",
|
|
546
|
+
""
|
|
547
|
+
);
|
|
548
|
+
writeLine();
|
|
549
|
+
businessFocus = await prompt(
|
|
550
|
+
"What should your first research squad investigate?",
|
|
551
|
+
"Our market, competitors, and growth opportunities"
|
|
552
|
+
);
|
|
553
|
+
selectedUseCase = await promptUseCase();
|
|
554
|
+
}
|
|
555
|
+
const useCaseConfig = getUseCaseConfig(selectedUseCase);
|
|
556
|
+
const coreAgentCount = 12;
|
|
557
|
+
const coreSquadCount = 3;
|
|
558
|
+
const useCaseAgentCount = useCaseConfig.squads.reduce((sum, s) => sum + s.agentCount, 0);
|
|
559
|
+
const totalAgentCount = coreAgentCount + useCaseAgentCount;
|
|
560
|
+
const totalSquadCount = coreSquadCount + useCaseConfig.squads.length;
|
|
561
|
+
writeLine();
|
|
562
|
+
writeLine(` ${chalk.green("\u2713")} Business: ${chalk.cyan(businessName)}${businessDescription ? chalk.dim(` \u2014 ${businessDescription}`) : ""}`);
|
|
563
|
+
writeLine(` ${chalk.green("\u2713")} Provider: ${chalk.cyan(provider?.name || selectedProvider)}`);
|
|
564
|
+
writeLine(` ${chalk.green("\u2713")} Research focus: ${chalk.cyan(businessFocus)}`);
|
|
565
|
+
writeLine(` ${chalk.green("\u2713")} Use case: ${chalk.cyan(useCaseConfig.label)} ${chalk.dim(`\u2014 ${useCaseConfig.description}`)}`);
|
|
566
|
+
writeLine();
|
|
567
|
+
const spinner = ora("Planting the seed...").start();
|
|
568
|
+
try {
|
|
569
|
+
const variables = {
|
|
570
|
+
BUSINESS_NAME: businessName,
|
|
571
|
+
BUSINESS_DESCRIPTION: businessDescription || `${businessName} \u2014 details to be added by the manager agent.`,
|
|
572
|
+
BUSINESS_FOCUS: businessFocus,
|
|
573
|
+
PROVIDER: selectedProvider,
|
|
574
|
+
PROVIDER_NAME: provider?.name || "Unknown"
|
|
575
|
+
};
|
|
576
|
+
const dirs = [
|
|
577
|
+
".agents/squads/company",
|
|
578
|
+
".agents/squads/research",
|
|
579
|
+
".agents/squads/intelligence",
|
|
580
|
+
".agents/memory/company/manager",
|
|
581
|
+
".agents/memory/company/event-dispatcher",
|
|
582
|
+
".agents/memory/company/goal-tracker",
|
|
583
|
+
".agents/memory/company/company-eval",
|
|
584
|
+
".agents/memory/company/company-critic",
|
|
585
|
+
".agents/memory/research/researcher",
|
|
586
|
+
".agents/memory/research/analyst",
|
|
587
|
+
".agents/memory/research/research-eval",
|
|
588
|
+
".agents/memory/research/research-critic",
|
|
589
|
+
".agents/memory/intelligence/intel-lead",
|
|
590
|
+
".agents/memory/intelligence/intel-eval",
|
|
591
|
+
".agents/memory/intelligence/intel-critic",
|
|
592
|
+
".agents/skills/squads-cli",
|
|
593
|
+
".agents/skills/gh",
|
|
594
|
+
".agents/config"
|
|
595
|
+
];
|
|
596
|
+
for (const squad of useCaseConfig.squads) {
|
|
597
|
+
dirs.push(...squad.dirs);
|
|
598
|
+
}
|
|
599
|
+
if (selectedProvider === "claude") {
|
|
600
|
+
dirs.push(".claude");
|
|
601
|
+
}
|
|
602
|
+
for (const dir of dirs) {
|
|
603
|
+
await fs.mkdir(path.join(cwd, dir), { recursive: true });
|
|
604
|
+
}
|
|
605
|
+
spinner.text = "Creating squad definitions...";
|
|
606
|
+
const companyFiles = [
|
|
607
|
+
[".agents/squads/company/SQUAD.md", "squads/company/SQUAD.md"],
|
|
608
|
+
[".agents/squads/company/manager.md", "squads/company/manager.md"],
|
|
609
|
+
[".agents/squads/company/event-dispatcher.md", "squads/company/event-dispatcher.md"],
|
|
610
|
+
[".agents/squads/company/goal-tracker.md", "squads/company/goal-tracker.md"],
|
|
611
|
+
[".agents/squads/company/company-eval.md", "squads/company/company-eval.md"],
|
|
612
|
+
[".agents/squads/company/company-critic.md", "squads/company/company-critic.md"]
|
|
613
|
+
];
|
|
614
|
+
const researchFiles = [
|
|
615
|
+
[".agents/squads/research/SQUAD.md", "squads/research/SQUAD.md"],
|
|
616
|
+
[".agents/squads/research/researcher.md", "squads/research/researcher.md"],
|
|
617
|
+
[".agents/squads/research/analyst.md", "squads/research/analyst.md"],
|
|
618
|
+
[".agents/squads/research/research-eval.md", "squads/research/research-eval.md"],
|
|
619
|
+
[".agents/squads/research/research-critic.md", "squads/research/research-critic.md"]
|
|
620
|
+
];
|
|
621
|
+
const intelligenceFiles = [
|
|
622
|
+
[".agents/squads/intelligence/SQUAD.md", "squads/intelligence/SQUAD.md"],
|
|
623
|
+
[".agents/squads/intelligence/intel-lead.md", "squads/intelligence/intel-lead.md"],
|
|
624
|
+
[".agents/squads/intelligence/intel-eval.md", "squads/intelligence/intel-eval.md"],
|
|
625
|
+
[".agents/squads/intelligence/intel-critic.md", "squads/intelligence/intel-critic.md"]
|
|
626
|
+
];
|
|
627
|
+
const useCaseFiles = [];
|
|
628
|
+
for (const squad of useCaseConfig.squads) {
|
|
629
|
+
useCaseFiles.push(...squad.files);
|
|
630
|
+
}
|
|
631
|
+
for (const [dest, template] of [...companyFiles, ...researchFiles, ...intelligenceFiles, ...useCaseFiles]) {
|
|
632
|
+
const content = loadSeedTemplate(template, variables);
|
|
633
|
+
await writeFile(path.join(cwd, dest), content);
|
|
634
|
+
}
|
|
635
|
+
spinner.text = "Creating memory and config...";
|
|
636
|
+
const coreMemoryFiles = [
|
|
637
|
+
[".agents/memory/company/manager/state.md", "memory/company/manager/state.md"],
|
|
638
|
+
[".agents/memory/research/researcher/state.md", "memory/research/researcher/state.md"],
|
|
639
|
+
[".agents/memory/intelligence/intel-lead/state.md", "memory/intelligence/intel-lead/state.md"]
|
|
640
|
+
];
|
|
641
|
+
const useCaseMemoryFiles = [];
|
|
642
|
+
for (const squad of useCaseConfig.squads) {
|
|
643
|
+
useCaseMemoryFiles.push(...squad.memoryFiles);
|
|
644
|
+
}
|
|
645
|
+
for (const [dest, template] of [...coreMemoryFiles, ...useCaseMemoryFiles]) {
|
|
646
|
+
await writeIfNew(path.join(cwd, dest), loadSeedTemplate(template, variables));
|
|
647
|
+
}
|
|
648
|
+
const skillContent = loadSeedTemplate("skills/squads-cli/SKILL.md", variables);
|
|
649
|
+
await writeFile(path.join(cwd, ".agents/skills/squads-cli/SKILL.md"), skillContent);
|
|
650
|
+
const ghSkillContent = loadSeedTemplate("skills/gh/SKILL.md", variables);
|
|
651
|
+
await writeFile(path.join(cwd, ".agents/skills/gh/SKILL.md"), ghSkillContent);
|
|
652
|
+
const providerConfig = loadSeedTemplate("config/provider.yaml", variables);
|
|
653
|
+
await writeFile(path.join(cwd, ".agents/config/provider.yaml"), providerConfig);
|
|
654
|
+
const businessBrief = loadSeedTemplate("BUSINESS_BRIEF.md.template", variables);
|
|
655
|
+
await writeFile(path.join(cwd, ".agents/BUSINESS_BRIEF.md"), businessBrief);
|
|
656
|
+
spinner.text = "Setting up operating manual...";
|
|
657
|
+
if (selectedProvider === "claude") {
|
|
658
|
+
const claudeMd = loadSeedTemplate("CLAUDE.md.template", variables);
|
|
659
|
+
await writeIfNew(path.join(cwd, "CLAUDE.md"), claudeMd);
|
|
660
|
+
const hooksContent = loadSeedTemplate("hooks/settings.json.template", variables);
|
|
661
|
+
await writeIfNew(path.join(cwd, ".claude/settings.json"), hooksContent);
|
|
662
|
+
}
|
|
663
|
+
spinner.succeed("Seed planted");
|
|
664
|
+
await track(Events.CLI_INIT, {
|
|
665
|
+
success: true,
|
|
666
|
+
hasGit: gitStatus.isGitRepo,
|
|
667
|
+
hasRemote: gitStatus.hasRemote,
|
|
668
|
+
provider: selectedProvider,
|
|
669
|
+
useCase: selectedUseCase,
|
|
670
|
+
agentCount: totalAgentCount,
|
|
671
|
+
squadCount: totalSquadCount,
|
|
672
|
+
hasBusinessName: businessName !== path.basename(cwd),
|
|
673
|
+
hasBusinessDescription: businessDescription.length > 0
|
|
674
|
+
});
|
|
675
|
+
} catch (error) {
|
|
676
|
+
spinner.fail("Failed to plant the seed");
|
|
677
|
+
console.error(chalk.red(` ${error}`));
|
|
678
|
+
process.exit(1);
|
|
679
|
+
}
|
|
680
|
+
writeLine();
|
|
681
|
+
writeLine(chalk.green.bold(` ${businessName}'s AI workforce is ready.`));
|
|
682
|
+
writeLine();
|
|
683
|
+
writeLine(chalk.dim(" Created:"));
|
|
684
|
+
writeLine(chalk.dim(" \u2022 .agents/squads/company/ 5 agents (manager, dispatcher, tracker, eval, critic)"));
|
|
685
|
+
writeLine(chalk.dim(" \u2022 .agents/squads/research/ 4 agents (researcher, analyst, eval, critic)"));
|
|
686
|
+
writeLine(chalk.dim(" \u2022 .agents/squads/intelligence/ 3 agents (intel-lead, eval, critic)"));
|
|
687
|
+
for (const squad of useCaseConfig.squads) {
|
|
688
|
+
const padding = " ".repeat(Math.max(0, 22 - squad.name.length));
|
|
689
|
+
writeLine(chalk.dim(` \u2022 .agents/squads/${squad.name}/${padding}${squad.agentCount} agents (${squad.agentSummary})`));
|
|
690
|
+
}
|
|
691
|
+
writeLine(chalk.dim(" \u2022 .agents/skills/ CLI + GitHub workflow skills"));
|
|
692
|
+
writeLine(chalk.dim(" \u2022 .agents/memory/ Persistent state"));
|
|
693
|
+
writeLine(chalk.dim(" \u2022 .agents/BUSINESS_BRIEF.md"));
|
|
694
|
+
if (selectedProvider === "claude") {
|
|
695
|
+
writeLine(chalk.dim(" \u2022 CLAUDE.md Operating manual"));
|
|
696
|
+
writeLine(chalk.dim(" \u2022 .claude/settings.json Session hooks"));
|
|
697
|
+
}
|
|
698
|
+
writeLine();
|
|
699
|
+
writeLine(chalk.bold(" Getting started:"));
|
|
700
|
+
writeLine();
|
|
701
|
+
writeLine(` ${chalk.cyan("1.")} ${chalk.yellow('git add -A && git commit -m "feat: init AI workforce"')}`);
|
|
702
|
+
writeLine(chalk.dim(" Git is the coordination layer \u2014 commit first"));
|
|
703
|
+
writeLine();
|
|
704
|
+
const firstRunCommand = getFirstRunCommand(selectedUseCase);
|
|
705
|
+
writeLine(` ${chalk.cyan("2.")} ${chalk.yellow(firstRunCommand.command)}`);
|
|
706
|
+
writeLine(chalk.dim(` ${firstRunCommand.description}`));
|
|
707
|
+
writeLine();
|
|
708
|
+
writeLine(` ${chalk.cyan("3.")} ${chalk.yellow(`squads dash`)}`);
|
|
709
|
+
writeLine(chalk.dim(" See all your squads and agents at a glance"));
|
|
710
|
+
writeLine();
|
|
711
|
+
writeLine(chalk.dim(" Docs: https://agents-squads.com/docs/getting-started"));
|
|
712
|
+
writeLine();
|
|
713
|
+
}
|
|
714
|
+
function getFirstRunCommand(useCase) {
|
|
715
|
+
switch (useCase) {
|
|
716
|
+
case "engineering":
|
|
717
|
+
return {
|
|
718
|
+
command: "squads run engineering/issue-solver",
|
|
719
|
+
description: "Your first agent finds and solves GitHub issues"
|
|
720
|
+
};
|
|
721
|
+
case "marketing":
|
|
722
|
+
return {
|
|
723
|
+
command: "squads run marketing/content-drafter",
|
|
724
|
+
description: "Your first agent drafts content for your business"
|
|
725
|
+
};
|
|
726
|
+
case "operations":
|
|
727
|
+
return {
|
|
728
|
+
command: "squads run operations/ops-lead",
|
|
729
|
+
description: "Your first agent starts running daily operations"
|
|
730
|
+
};
|
|
731
|
+
case "full-company":
|
|
732
|
+
return {
|
|
733
|
+
command: "squads run research/researcher",
|
|
734
|
+
description: "Your first agent researches the topic you set"
|
|
735
|
+
};
|
|
736
|
+
case "custom":
|
|
737
|
+
default:
|
|
738
|
+
return {
|
|
739
|
+
command: "squads run research/researcher",
|
|
740
|
+
description: "Your first agent researches the topic you set"
|
|
741
|
+
};
|
|
742
|
+
}
|
|
743
|
+
}
|
|
744
|
+
export {
|
|
745
|
+
initCommand
|
|
746
|
+
};
|
|
747
|
+
//# sourceMappingURL=init-UOWTNMIE.js.map
|