squads 0.1.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 (85) hide show
  1. package/dist/commands/add.d.ts +3 -0
  2. package/dist/commands/add.d.ts.map +1 -0
  3. package/dist/commands/add.js +98 -0
  4. package/dist/commands/add.js.map +1 -0
  5. package/dist/commands/check.d.ts +3 -0
  6. package/dist/commands/check.d.ts.map +1 -0
  7. package/dist/commands/check.js +127 -0
  8. package/dist/commands/check.js.map +1 -0
  9. package/dist/commands/find.d.ts +3 -0
  10. package/dist/commands/find.d.ts.map +1 -0
  11. package/dist/commands/find.js +84 -0
  12. package/dist/commands/find.js.map +1 -0
  13. package/dist/commands/init.d.ts +3 -0
  14. package/dist/commands/init.d.ts.map +1 -0
  15. package/dist/commands/init.js +281 -0
  16. package/dist/commands/init.js.map +1 -0
  17. package/dist/commands/list.d.ts +3 -0
  18. package/dist/commands/list.d.ts.map +1 -0
  19. package/dist/commands/list.js +49 -0
  20. package/dist/commands/list.js.map +1 -0
  21. package/dist/commands/login.d.ts +3 -0
  22. package/dist/commands/login.d.ts.map +1 -0
  23. package/dist/commands/login.js +129 -0
  24. package/dist/commands/login.js.map +1 -0
  25. package/dist/commands/publish.d.ts +3 -0
  26. package/dist/commands/publish.d.ts.map +1 -0
  27. package/dist/commands/publish.js +118 -0
  28. package/dist/commands/publish.js.map +1 -0
  29. package/dist/commands/remove.d.ts +3 -0
  30. package/dist/commands/remove.d.ts.map +1 -0
  31. package/dist/commands/remove.js +67 -0
  32. package/dist/commands/remove.js.map +1 -0
  33. package/dist/commands/update.d.ts +3 -0
  34. package/dist/commands/update.d.ts.map +1 -0
  35. package/dist/commands/update.js +58 -0
  36. package/dist/commands/update.js.map +1 -0
  37. package/dist/commands/validate.d.ts +3 -0
  38. package/dist/commands/validate.d.ts.map +1 -0
  39. package/dist/commands/validate.js +116 -0
  40. package/dist/commands/validate.js.map +1 -0
  41. package/dist/index.d.ts +3 -0
  42. package/dist/index.d.ts.map +1 -0
  43. package/dist/index.js +48 -0
  44. package/dist/index.js.map +1 -0
  45. package/dist/lib/agents.d.ts +26 -0
  46. package/dist/lib/agents.d.ts.map +1 -0
  47. package/dist/lib/agents.js +87 -0
  48. package/dist/lib/agents.js.map +1 -0
  49. package/dist/lib/config.d.ts +9 -0
  50. package/dist/lib/config.d.ts.map +1 -0
  51. package/dist/lib/config.js +44 -0
  52. package/dist/lib/config.js.map +1 -0
  53. package/dist/lib/installer.d.ts +29 -0
  54. package/dist/lib/installer.d.ts.map +1 -0
  55. package/dist/lib/installer.js +124 -0
  56. package/dist/lib/installer.js.map +1 -0
  57. package/dist/lib/lock-file.d.ts +11 -0
  58. package/dist/lib/lock-file.d.ts.map +1 -0
  59. package/dist/lib/lock-file.js +72 -0
  60. package/dist/lib/lock-file.js.map +1 -0
  61. package/dist/lib/sources/github.d.ts +26 -0
  62. package/dist/lib/sources/github.d.ts.map +1 -0
  63. package/dist/lib/sources/github.js +182 -0
  64. package/dist/lib/sources/github.js.map +1 -0
  65. package/dist/lib/sources/local.d.ts +15 -0
  66. package/dist/lib/sources/local.d.ts.map +1 -0
  67. package/dist/lib/sources/local.js +52 -0
  68. package/dist/lib/sources/local.js.map +1 -0
  69. package/dist/lib/sources/registry.d.ts +21 -0
  70. package/dist/lib/sources/registry.d.ts.map +1 -0
  71. package/dist/lib/sources/registry.js +63 -0
  72. package/dist/lib/sources/registry.js.map +1 -0
  73. package/dist/lib/telemetry.d.ts +6 -0
  74. package/dist/lib/telemetry.d.ts.map +1 -0
  75. package/dist/lib/telemetry.js +68 -0
  76. package/dist/lib/telemetry.js.map +1 -0
  77. package/dist/lib/validator.d.ts +29 -0
  78. package/dist/lib/validator.d.ts.map +1 -0
  79. package/dist/lib/validator.js +107 -0
  80. package/dist/lib/validator.js.map +1 -0
  81. package/dist/types.d.ts +86 -0
  82. package/dist/types.d.ts.map +1 -0
  83. package/dist/types.js +2 -0
  84. package/dist/types.js.map +1 -0
  85. package/package.json +47 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,wBAAgB,iBAAiB,IAAI,OAAO,CA8D3C"}
@@ -0,0 +1,49 @@
1
+ import { Command } from "commander";
2
+ import chalk from "chalk";
3
+ import { readLockFile } from "../lib/lock-file.js";
4
+ export function createListCommand() {
5
+ const cmd = new Command("list")
6
+ .alias("ls")
7
+ .description("List installed squads")
8
+ .option("-g, --global", "List globally installed squads")
9
+ .action(async (options) => {
10
+ const projectDir = options.global
11
+ ? (await import("../lib/config.js")).getGlobalSquadsDir()
12
+ : process.cwd();
13
+ const lockFile = await readLockFile(projectDir);
14
+ const entries = Object.entries(lockFile.squads);
15
+ if (entries.length === 0) {
16
+ console.log(chalk.dim("No squads installed."));
17
+ console.log();
18
+ console.log(chalk.dim("Install one with: squads add <source>"));
19
+ console.log(chalk.dim("Search for squads: squads find <query>"));
20
+ return;
21
+ }
22
+ console.log(chalk.bold(`\n Installed squads${options.global ? " (global)" : ""}:\n`));
23
+ const nameWidth = 24;
24
+ const versionWidth = 12;
25
+ const sourceWidth = 36;
26
+ console.log(chalk.bold(" " +
27
+ "Squad".padEnd(nameWidth) +
28
+ "Version".padEnd(versionWidth) +
29
+ "Source".padEnd(sourceWidth) +
30
+ "Agents"));
31
+ console.log(chalk.dim(" " + "-".repeat(nameWidth + versionWidth + sourceWidth + 8)));
32
+ for (const [name, entry] of entries) {
33
+ const squad = chalk.cyan(name.padEnd(nameWidth));
34
+ const version = chalk.green(entry.version.padEnd(versionWidth));
35
+ const source = chalk.dim(truncateSource(entry.source, sourceWidth - 2).padEnd(sourceWidth));
36
+ const agents = chalk.dim(String(entry.agents.length));
37
+ console.log(` ${squad}${version}${source}${agents}`);
38
+ }
39
+ console.log();
40
+ console.log(chalk.dim(` Total: ${entries.length} squad(s)`));
41
+ });
42
+ return cmd;
43
+ }
44
+ function truncateSource(source, max) {
45
+ if (source.length <= max)
46
+ return source;
47
+ return source.slice(0, max - 1) + "\u2026";
48
+ }
49
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare function createLoginCommand(): Command;
3
+ //# sourceMappingURL=login.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAmHpC,wBAAgB,kBAAkB,IAAI,OAAO,CA+D5C"}
@@ -0,0 +1,129 @@
1
+ import { Command } from "commander";
2
+ import chalk from "chalk";
3
+ import ora from "ora";
4
+ import { updateConfig, getRegistryUrl } from "../lib/config.js";
5
+ const GITHUB_CLIENT_ID = "squads-sh-cli";
6
+ /**
7
+ * Start the GitHub device flow by requesting a device code.
8
+ */
9
+ async function requestDeviceCode() {
10
+ const res = await fetch("https://github.com/login/device/code", {
11
+ method: "POST",
12
+ headers: {
13
+ "Content-Type": "application/json",
14
+ Accept: "application/json",
15
+ },
16
+ body: JSON.stringify({
17
+ client_id: GITHUB_CLIENT_ID,
18
+ scope: "read:user user:email",
19
+ }),
20
+ });
21
+ if (!res.ok) {
22
+ throw new Error(`GitHub device code request failed: ${res.status} ${res.statusText}`);
23
+ }
24
+ return (await res.json());
25
+ }
26
+ /**
27
+ * Poll GitHub for the access token.
28
+ */
29
+ async function pollForToken(deviceCode, interval, expiresIn) {
30
+ const startTime = Date.now();
31
+ const timeoutMs = expiresIn * 1000;
32
+ let pollInterval = interval * 1000;
33
+ while (Date.now() - startTime < timeoutMs) {
34
+ await new Promise((resolve) => setTimeout(resolve, pollInterval));
35
+ const res = await fetch("https://github.com/login/oauth/access_token", {
36
+ method: "POST",
37
+ headers: {
38
+ "Content-Type": "application/json",
39
+ Accept: "application/json",
40
+ },
41
+ body: JSON.stringify({
42
+ client_id: GITHUB_CLIENT_ID,
43
+ device_code: deviceCode,
44
+ grant_type: "urn:ietf:params:oauth:grant-type:device_code",
45
+ }),
46
+ });
47
+ const data = (await res.json());
48
+ if (data.access_token) {
49
+ return data.access_token;
50
+ }
51
+ switch (data.error) {
52
+ case "authorization_pending":
53
+ // Keep polling
54
+ break;
55
+ case "slow_down":
56
+ // Increase interval
57
+ pollInterval = (data.interval || interval + 5) * 1000;
58
+ break;
59
+ case "expired_token":
60
+ throw new Error("Device code expired. Please try again.");
61
+ case "access_denied":
62
+ throw new Error("Authorization denied by user.");
63
+ default:
64
+ throw new Error(`GitHub auth error: ${data.error_description || data.error || "unknown"}`);
65
+ }
66
+ }
67
+ throw new Error("Authentication timed out. Please try again.");
68
+ }
69
+ /**
70
+ * Exchange GitHub token for a squads.sh session token.
71
+ */
72
+ async function exchangeToken(githubToken) {
73
+ const registryUrl = await getRegistryUrl();
74
+ const res = await fetch(`${registryUrl}/api/auth/device`, {
75
+ method: "POST",
76
+ headers: {
77
+ "Content-Type": "application/json",
78
+ },
79
+ body: JSON.stringify({
80
+ github_token: githubToken,
81
+ }),
82
+ });
83
+ if (!res.ok) {
84
+ const body = await res.text();
85
+ throw new Error(`Token exchange failed (${res.status}): ${body}`);
86
+ }
87
+ const data = (await res.json());
88
+ return data.token;
89
+ }
90
+ export function createLoginCommand() {
91
+ const cmd = new Command("login")
92
+ .description("Authenticate via GitHub device flow")
93
+ .action(async () => {
94
+ console.log(chalk.bold("\n Authenticating with squads.sh via GitHub...\n"));
95
+ // Step 1: Request device code
96
+ let deviceCode;
97
+ try {
98
+ deviceCode = await requestDeviceCode();
99
+ }
100
+ catch (err) {
101
+ console.log(chalk.red(` ${err.message}`));
102
+ process.exit(1);
103
+ }
104
+ // Step 2: Display instructions
105
+ console.log(` ${chalk.bold("1.")} Open this URL in your browser:\n`);
106
+ console.log(` ${chalk.cyan.underline(deviceCode.verification_uri)}\n`);
107
+ console.log(` ${chalk.bold("2.")} Enter this code:\n`);
108
+ console.log(` ${chalk.bold.yellow(deviceCode.user_code)}\n`);
109
+ // Step 3: Poll for token
110
+ const spinner = ora("Waiting for authorization...").start();
111
+ try {
112
+ const githubToken = await pollForToken(deviceCode.device_code, deviceCode.interval, deviceCode.expires_in);
113
+ spinner.text = "Exchanging token with squads.sh...";
114
+ const sessionToken = await exchangeToken(githubToken);
115
+ // Step 4: Save token
116
+ await updateConfig({ authToken: sessionToken });
117
+ spinner.succeed(chalk.green("Authenticated successfully!"));
118
+ console.log();
119
+ console.log(chalk.dim(" Token saved to ~/.squads/config.json"));
120
+ console.log(chalk.dim(" You can now publish squads with: squads publish"));
121
+ }
122
+ catch (err) {
123
+ spinner.fail(chalk.red(err.message));
124
+ process.exit(1);
125
+ }
126
+ });
127
+ return cmd;
128
+ }
129
+ //# sourceMappingURL=login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare function createPublishCommand(): Command;
3
+ //# sourceMappingURL=publish.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publish.d.ts","sourceRoot":"","sources":["../../src/commands/publish.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,wBAAgB,oBAAoB,IAAI,OAAO,CAgJ9C"}
@@ -0,0 +1,118 @@
1
+ import { Command } from "commander";
2
+ import chalk from "chalk";
3
+ import ora from "ora";
4
+ import prompts from "prompts";
5
+ import { resolve } from "node:path";
6
+ import { validateSquadDirectory, validateSquadDeep } from "../lib/validator.js";
7
+ import { getAuthToken, getRegistryUrl } from "../lib/config.js";
8
+ export function createPublishCommand() {
9
+ const cmd = new Command("publish")
10
+ .description("Publish a squad to the squads.sh marketplace")
11
+ .argument("[path]", "Path to squad directory", ".")
12
+ .option("--dry-run", "Validate without publishing")
13
+ .option("--strict", "Fail if deep validation status is not SAFE")
14
+ .action(async (pathArg, options) => {
15
+ const squadPath = resolve(pathArg);
16
+ // Step 1: Validate squad
17
+ const spinner = ora("Validating squad...").start();
18
+ const validation = await validateSquadDirectory(squadPath);
19
+ if (!validation.valid) {
20
+ spinner.fail(chalk.red("Squad validation failed:"));
21
+ for (const err of validation.errors) {
22
+ console.log(chalk.red(` - ${err}`));
23
+ }
24
+ process.exit(1);
25
+ }
26
+ if (validation.warnings.length > 0) {
27
+ for (const warn of validation.warnings) {
28
+ console.log(chalk.yellow(` Warning: ${warn}`));
29
+ }
30
+ }
31
+ spinner.succeed(`Validated ${chalk.cyan(validation.manifest.name)} v${validation.manifest.version}`);
32
+ // Deep validation
33
+ const deepSpinner = ora("Running deep validation...").start();
34
+ const deepReport = await validateSquadDeep(squadPath);
35
+ deepSpinner.succeed(`Deep validation: score ${deepReport.score}/100 status ${deepReport.status} errors ${deepReport.summary.totalErrors} warnings ${deepReport.summary.totalWarnings}`);
36
+ if (options.strict && deepReport.status !== "SAFE") {
37
+ console.log();
38
+ console.log(chalk.red(` Strict mode: squad status is ${deepReport.status}, expected SAFE.`));
39
+ if (deepReport.summary.totalErrors > 0) {
40
+ for (const f of deepReport.findings.filter((f) => f.severity === "error")) {
41
+ const prefix = f.file ? `[${f.file}] ` : "";
42
+ console.log(chalk.red(` - ${prefix}${f.message}`));
43
+ }
44
+ }
45
+ if (deepReport.summary.totalWarnings > 0) {
46
+ for (const f of deepReport.findings.filter((f) => f.severity === "warning")) {
47
+ const prefix = f.file ? `[${f.file}] ` : "";
48
+ console.log(chalk.yellow(` - ${prefix}${f.message}`));
49
+ }
50
+ }
51
+ process.exit(1);
52
+ }
53
+ if (options.dryRun) {
54
+ console.log();
55
+ console.log(chalk.green(" Dry run passed. Squad is valid for publishing."));
56
+ return;
57
+ }
58
+ // Step 2: Check authentication
59
+ const token = await getAuthToken();
60
+ if (!token) {
61
+ console.log();
62
+ console.log(chalk.red(" Authentication required. Run: squads login"));
63
+ process.exit(1);
64
+ }
65
+ // Step 3: Confirm
66
+ const manifest = validation.manifest;
67
+ console.log();
68
+ console.log(chalk.bold(" Publishing:"));
69
+ console.log(` Name: ${chalk.cyan(manifest.name)}`);
70
+ console.log(` Version: ${chalk.green(manifest.version)}`);
71
+ console.log(` Description: ${chalk.dim(manifest.description)}`);
72
+ console.log();
73
+ const { confirmed } = await prompts({
74
+ type: "confirm",
75
+ name: "confirmed",
76
+ message: "Publish this squad to squads.sh?",
77
+ initial: true,
78
+ });
79
+ if (!confirmed) {
80
+ console.log(chalk.dim("Publishing cancelled."));
81
+ return;
82
+ }
83
+ // Step 4: Publish
84
+ const publishSpinner = ora("Publishing to squads.sh...").start();
85
+ try {
86
+ const registryUrl = await getRegistryUrl();
87
+ const res = await fetch(`${registryUrl}/api/squads`, {
88
+ method: "POST",
89
+ headers: {
90
+ "Content-Type": "application/json",
91
+ Authorization: `Bearer ${token}`,
92
+ },
93
+ body: JSON.stringify({
94
+ name: manifest.name,
95
+ version: manifest.version,
96
+ description: manifest.description,
97
+ aios: manifest.aios,
98
+ components: manifest.components,
99
+ }),
100
+ });
101
+ if (!res.ok) {
102
+ const body = await res.text();
103
+ throw new Error(`Publish failed (${res.status}): ${body}`);
104
+ }
105
+ const data = (await res.json());
106
+ publishSpinner.succeed(chalk.green(`Published ${chalk.bold(manifest.name)} v${manifest.version}!`));
107
+ console.log();
108
+ console.log(` ${chalk.dim("Marketplace:")} ${chalk.cyan(`https://squads.sh/squads/${data.slug || manifest.name}`)}`);
109
+ console.log(` ${chalk.dim("Install:")} ${chalk.cyan(`npx squads add ${manifest.name}`)}`);
110
+ }
111
+ catch (err) {
112
+ publishSpinner.fail(chalk.red(err.message));
113
+ process.exit(1);
114
+ }
115
+ });
116
+ return cmd;
117
+ }
118
+ //# sourceMappingURL=publish.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publish.js","sourceRoot":"","sources":["../../src/commands/publish.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare function createRemoveCommand(): Command;
3
+ //# sourceMappingURL=remove.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remove.d.ts","sourceRoot":"","sources":["../../src/commands/remove.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUpC,wBAAgB,mBAAmB,IAAI,OAAO,CAyE7C"}
@@ -0,0 +1,67 @@
1
+ import { Command } from "commander";
2
+ import chalk from "chalk";
3
+ import ora from "ora";
4
+ import prompts from "prompts";
5
+ import { rm } from "node:fs/promises";
6
+ import { join } from "node:path";
7
+ import { readLockFile, removeLockEntry } from "../lib/lock-file.js";
8
+ import { removeAgentFiles, readSlashPrefix } from "../lib/agents.js";
9
+ import { trackRemove } from "../lib/telemetry.js";
10
+ export function createRemoveCommand() {
11
+ const cmd = new Command("remove")
12
+ .alias("rm")
13
+ .description("Remove an installed squad")
14
+ .argument("<squad>", "Name of the squad to remove")
15
+ .option("-y, --yes", "Skip confirmation prompt")
16
+ .action(async (squadName, options) => {
17
+ const projectDir = process.cwd();
18
+ const lockFile = await readLockFile(projectDir);
19
+ const entry = lockFile.squads[squadName];
20
+ if (!entry) {
21
+ console.log(chalk.red(`Squad "${squadName}" is not installed.`));
22
+ console.log(chalk.dim("Run: squads list to see installed squads"));
23
+ process.exit(1);
24
+ }
25
+ // Confirmation
26
+ if (!options.yes) {
27
+ const { confirmed } = await prompts({
28
+ type: "confirm",
29
+ name: "confirmed",
30
+ message: `Remove squad ${chalk.cyan(squadName)} v${entry.version}? This will delete all squad files and agent mappings.`,
31
+ initial: false,
32
+ });
33
+ if (!confirmed) {
34
+ console.log(chalk.dim("Removal cancelled."));
35
+ return;
36
+ }
37
+ }
38
+ const spinner = ora(`Removing ${chalk.cyan(squadName)}...`).start();
39
+ try {
40
+ // Read prefix before removing files
41
+ const squadDir = join(projectDir, "squads", squadName);
42
+ const prefix = await readSlashPrefix(squadDir);
43
+ // Remove squad directory
44
+ await rm(squadDir, { recursive: true, force: true });
45
+ // Remove agent IDE files
46
+ await removeAgentFiles(projectDir, squadName, prefix);
47
+ // Update lock file
48
+ await removeLockEntry(projectDir, squadName);
49
+ // Fire telemetry (non-blocking)
50
+ trackRemove(squadName, entry.source);
51
+ spinner.succeed(chalk.green(`Removed ${chalk.bold(squadName)} v${entry.version}`));
52
+ console.log();
53
+ console.log(chalk.dim(" Removed files:"));
54
+ console.log(chalk.dim(` - squads/${squadName}/`));
55
+ console.log(chalk.dim(` - .claude/squads/${squadName}/`));
56
+ if (prefix) {
57
+ console.log(chalk.dim(` - .claude/commands/${prefix}/agents/`));
58
+ }
59
+ }
60
+ catch (err) {
61
+ spinner.fail(chalk.red(err.message));
62
+ process.exit(1);
63
+ }
64
+ });
65
+ return cmd;
66
+ }
67
+ //# sourceMappingURL=remove.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remove.js","sourceRoot":"","sources":["../../src/commands/remove.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare function createUpdateCommand(): Command;
3
+ //# sourceMappingURL=update.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,wBAAgB,mBAAmB,IAAI,OAAO,CA6E7C"}
@@ -0,0 +1,58 @@
1
+ import { Command } from "commander";
2
+ import chalk from "chalk";
3
+ import ora from "ora";
4
+ import { readLockFile } from "../lib/lock-file.js";
5
+ import { reinstallSquad } from "../lib/installer.js";
6
+ export function createUpdateCommand() {
7
+ const cmd = new Command("update")
8
+ .description("Update installed squads")
9
+ .argument("[squad]", "Specific squad to update (all if omitted)")
10
+ .option("-y, --yes", "Skip confirmation prompt")
11
+ .action(async (squadName, options) => {
12
+ const projectDir = process.cwd();
13
+ const lockFile = await readLockFile(projectDir);
14
+ const entries = Object.entries(lockFile.squads);
15
+ if (entries.length === 0) {
16
+ console.log(chalk.dim("No squads installed."));
17
+ return;
18
+ }
19
+ // Determine which squads to update
20
+ let toUpdate;
21
+ if (squadName) {
22
+ const entry = lockFile.squads[squadName];
23
+ if (!entry) {
24
+ console.log(chalk.red(`Squad "${squadName}" is not installed.`));
25
+ console.log(chalk.dim("Run: squads list to see installed squads"));
26
+ process.exit(1);
27
+ }
28
+ toUpdate = [[squadName, entry]];
29
+ }
30
+ else {
31
+ toUpdate = entries;
32
+ }
33
+ console.log(chalk.bold(`\n Updating ${toUpdate.length} squad(s)...\n`));
34
+ let succeeded = 0;
35
+ let failed = 0;
36
+ for (const [name, entry] of toUpdate) {
37
+ const spinner = ora(`Updating ${chalk.cyan(name)}...`).start();
38
+ try {
39
+ const result = await reinstallSquad(projectDir, name, entry.source);
40
+ spinner.succeed(`${chalk.cyan(name)} updated to v${result.version} (${result.agents.length} agents)`);
41
+ succeeded++;
42
+ }
43
+ catch (err) {
44
+ spinner.fail(`${chalk.cyan(name)}: ${chalk.red(err.message)}`);
45
+ failed++;
46
+ }
47
+ }
48
+ console.log();
49
+ if (succeeded > 0) {
50
+ console.log(chalk.green(` ${succeeded} squad(s) updated successfully.`));
51
+ }
52
+ if (failed > 0) {
53
+ console.log(chalk.red(` ${failed} squad(s) failed to update.`));
54
+ }
55
+ });
56
+ return cmd;
57
+ }
58
+ //# sourceMappingURL=update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,MAAM,UAAU,mBAAmB;IACjC,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;SAC9B,WAAW,CAAC,yBAAyB,CAAC;SACtC,QAAQ,CAAC,SAAS,EAAE,2CAA2C,CAAC;SAChE,MAAM,CAAC,WAAW,EAAE,0BAA0B,CAAC;SAC/C,MAAM,CAAC,KAAK,EAAE,SAA6B,EAAE,OAA0B,EAAE,EAAE;QAC1E,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QACjC,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,UAAU,CAAC,CAAC;QAChD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAEhD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC,CAAC;YAC/C,OAAO;QACT,CAAC;QAED,mCAAmC;QACnC,IAAI,QAAoD,CAAC;QAEzD,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACzC,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CAAC,UAAU,SAAS,qBAAqB,CAAC,CACpD,CAAC;gBACF,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CAAC,0CAA0C,CAAC,CACtD,CAAC;gBACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,QAAQ,GAAG,CAAC,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;QAClC,CAAC;aAAM,CAAC;YACN,QAAQ,GAAG,OAAO,CAAC;QACrB,CAAC;QAED,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CAAC,gBAAgB,QAAQ,CAAC,MAAM,gBAAgB,CAAC,CAC5D,CAAC;QAEF,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,IAAI,MAAM,GAAG,CAAC,CAAC;QAEf,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,QAAQ,EAAE,CAAC;YACrC,MAAM,OAAO,GAAG,GAAG,CAAC,YAAY,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC;YAE/D,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,cAAc,CACjC,UAAU,EACV,IAAI,EACJ,KAAK,CAAC,MAAM,CACb,CAAC;gBAEF,OAAO,CAAC,OAAO,CACb,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,MAAM,CAAC,OAAO,KAAK,MAAM,CAAC,MAAM,CAAC,MAAM,UAAU,CACrF,CAAC;gBACF,SAAS,EAAE,CAAC;YACd,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,IAAI,CACV,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,GAAG,CAAE,GAAa,CAAC,OAAO,CAAC,EAAE,CAC5D,CAAC;gBACF,MAAM,EAAE,CAAC;YACX,CAAC;QACH,CAAC;QAED,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;YAClB,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,KAAK,CAAC,KAAK,SAAS,iCAAiC,CAAC,CAC7D,CAAC;QACJ,CAAC;QACD,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CAAC,KAAK,MAAM,6BAA6B,CAAC,CACpD,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare function createValidateCommand(): Command;
3
+ //# sourceMappingURL=validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA2GpC,wBAAgB,qBAAqB,IAAI,OAAO,CAkC/C"}
@@ -0,0 +1,116 @@
1
+ import { Command } from "commander";
2
+ import chalk from "chalk";
3
+ import ora from "ora";
4
+ import { resolve } from "node:path";
5
+ import { validateSquadDeep } from "../lib/validator.js";
6
+ /**
7
+ * Map a validation status to a chalk-colored string.
8
+ */
9
+ function colorStatus(status) {
10
+ switch (status) {
11
+ case "SAFE":
12
+ return chalk.green(status);
13
+ case "WARNING":
14
+ return chalk.yellow(status);
15
+ case "CRITICAL":
16
+ return chalk.red(status);
17
+ default:
18
+ return status;
19
+ }
20
+ }
21
+ /**
22
+ * Colorize a numeric score: green >= 80, yellow >= 50, red otherwise.
23
+ */
24
+ function colorScore(score) {
25
+ if (score >= 80)
26
+ return chalk.green(String(score));
27
+ if (score >= 50)
28
+ return chalk.yellow(String(score));
29
+ return chalk.red(String(score));
30
+ }
31
+ /**
32
+ * Render the validation report as a rich colored table.
33
+ */
34
+ function renderReport(report) {
35
+ console.log();
36
+ console.log(chalk.bold(" Squad Validation Report"));
37
+ console.log();
38
+ // Overall score + status
39
+ console.log(` Score: ${colorScore(report.score)}/100 Status: ${colorStatus(report.status)}`);
40
+ console.log(` Files: ${report.summary.fileCount} Errors: ${chalk.red(String(report.summary.totalErrors))} Warnings: ${chalk.yellow(String(report.summary.totalWarnings))}`);
41
+ console.log();
42
+ // Category table header
43
+ const nameWidth = 18;
44
+ const scoreWidth = 7;
45
+ const errWidth = 8;
46
+ const warnWidth = 10;
47
+ const header = " " +
48
+ "Category".padEnd(nameWidth) +
49
+ "Score".padStart(scoreWidth) +
50
+ "Errors".padStart(errWidth) +
51
+ "Warnings".padStart(warnWidth);
52
+ console.log(chalk.dim(header));
53
+ console.log(chalk.dim(" " + "-".repeat(nameWidth + scoreWidth + errWidth + warnWidth)));
54
+ // One row per category
55
+ for (const cat of report.categories) {
56
+ const nameCol = cat.label.padEnd(nameWidth);
57
+ const scoreCol = String(cat.score).padStart(scoreWidth);
58
+ const errCol = String(cat.errorCount).padStart(errWidth);
59
+ const warnCol = String(cat.warningCount).padStart(warnWidth);
60
+ const errColored = cat.errorCount > 0 ? chalk.red(errCol) : chalk.dim(errCol);
61
+ const warnColored = cat.warningCount > 0 ? chalk.yellow(warnCol) : chalk.dim(warnCol);
62
+ console.log(" " + nameCol + colorScore(cat.score).padStart(scoreWidth + (colorScore(cat.score).length - String(cat.score).length)) + errColored + warnColored);
63
+ }
64
+ console.log();
65
+ // Show individual findings if there are errors or warnings
66
+ const errorFindings = report.findings.filter((f) => f.severity === "error");
67
+ const warningFindings = report.findings.filter((f) => f.severity === "warning");
68
+ if (errorFindings.length > 0) {
69
+ console.log(chalk.red.bold(" Errors:"));
70
+ for (const f of errorFindings) {
71
+ const prefix = f.file ? chalk.dim(`[${f.file}] `) : "";
72
+ console.log(` ${chalk.red("x")} ${prefix}${f.message}`);
73
+ }
74
+ console.log();
75
+ }
76
+ if (warningFindings.length > 0) {
77
+ console.log(chalk.yellow.bold(" Warnings:"));
78
+ for (const f of warningFindings) {
79
+ const prefix = f.file ? chalk.dim(`[${f.file}] `) : "";
80
+ console.log(` ${chalk.yellow("!")} ${prefix}${f.message}`);
81
+ }
82
+ console.log();
83
+ }
84
+ }
85
+ export function createValidateCommand() {
86
+ const cmd = new Command("validate")
87
+ .description("Validate an AIOS squad directory with deep analysis")
88
+ .argument("[path]", "Path to squad directory", ".")
89
+ .option("--json", "Output raw JSON report")
90
+ .action(async (pathArg, options) => {
91
+ const squadPath = resolve(pathArg);
92
+ const spinner = ora("Running deep validation...").start();
93
+ let report;
94
+ try {
95
+ report = await validateSquadDeep(squadPath);
96
+ }
97
+ catch (err) {
98
+ spinner.fail(chalk.red(`Validation failed: ${err.message}`));
99
+ process.exit(1);
100
+ }
101
+ spinner.succeed("Validation complete");
102
+ // JSON output mode
103
+ if (options.json) {
104
+ console.log(JSON.stringify(report, null, 2));
105
+ }
106
+ else {
107
+ renderReport(report);
108
+ }
109
+ // Exit code 1 if there are errors
110
+ if (report.summary.totalErrors > 0) {
111
+ process.exit(1);
112
+ }
113
+ });
114
+ return cmd;
115
+ }
116
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"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"}