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.
- package/dist/commands/add.d.ts +3 -0
- package/dist/commands/add.d.ts.map +1 -0
- package/dist/commands/add.js +98 -0
- package/dist/commands/add.js.map +1 -0
- package/dist/commands/check.d.ts +3 -0
- package/dist/commands/check.d.ts.map +1 -0
- package/dist/commands/check.js +127 -0
- package/dist/commands/check.js.map +1 -0
- package/dist/commands/find.d.ts +3 -0
- package/dist/commands/find.d.ts.map +1 -0
- package/dist/commands/find.js +84 -0
- package/dist/commands/find.js.map +1 -0
- package/dist/commands/init.d.ts +3 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +281 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/list.d.ts +3 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +49 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/login.d.ts +3 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +129 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/publish.d.ts +3 -0
- package/dist/commands/publish.d.ts.map +1 -0
- package/dist/commands/publish.js +118 -0
- package/dist/commands/publish.js.map +1 -0
- package/dist/commands/remove.d.ts +3 -0
- package/dist/commands/remove.d.ts.map +1 -0
- package/dist/commands/remove.js +67 -0
- package/dist/commands/remove.js.map +1 -0
- package/dist/commands/update.d.ts +3 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +58 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/validate.d.ts +3 -0
- package/dist/commands/validate.d.ts.map +1 -0
- package/dist/commands/validate.js +116 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +48 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/agents.d.ts +26 -0
- package/dist/lib/agents.d.ts.map +1 -0
- package/dist/lib/agents.js +87 -0
- package/dist/lib/agents.js.map +1 -0
- package/dist/lib/config.d.ts +9 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +44 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/installer.d.ts +29 -0
- package/dist/lib/installer.d.ts.map +1 -0
- package/dist/lib/installer.js +124 -0
- package/dist/lib/installer.js.map +1 -0
- package/dist/lib/lock-file.d.ts +11 -0
- package/dist/lib/lock-file.d.ts.map +1 -0
- package/dist/lib/lock-file.js +72 -0
- package/dist/lib/lock-file.js.map +1 -0
- package/dist/lib/sources/github.d.ts +26 -0
- package/dist/lib/sources/github.d.ts.map +1 -0
- package/dist/lib/sources/github.js +182 -0
- package/dist/lib/sources/github.js.map +1 -0
- package/dist/lib/sources/local.d.ts +15 -0
- package/dist/lib/sources/local.d.ts.map +1 -0
- package/dist/lib/sources/local.js +52 -0
- package/dist/lib/sources/local.js.map +1 -0
- package/dist/lib/sources/registry.d.ts +21 -0
- package/dist/lib/sources/registry.d.ts.map +1 -0
- package/dist/lib/sources/registry.js +63 -0
- package/dist/lib/sources/registry.js.map +1 -0
- package/dist/lib/telemetry.d.ts +6 -0
- package/dist/lib/telemetry.d.ts.map +1 -0
- package/dist/lib/telemetry.js +68 -0
- package/dist/lib/telemetry.js.map +1 -0
- package/dist/lib/validator.d.ts +29 -0
- package/dist/lib/validator.d.ts.map +1 -0
- package/dist/lib/validator.js +107 -0
- package/dist/lib/validator.js.map +1 -0
- package/dist/types.d.ts +86 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +47 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA6BpC,wBAAgB,gBAAgB,IAAI,OAAO,CA+F1C"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import chalk from "chalk";
|
|
3
|
+
import ora from "ora";
|
|
4
|
+
import prompts from "prompts";
|
|
5
|
+
import { parseGitHubSource } from "../lib/sources/github.js";
|
|
6
|
+
import { isLocalPath, parseLocalSource } from "../lib/sources/local.js";
|
|
7
|
+
import { isRegistrySlug, resolveRegistrySource } from "../lib/sources/registry.js";
|
|
8
|
+
import { installSquad } from "../lib/installer.js";
|
|
9
|
+
/**
|
|
10
|
+
* Parse the source argument into a SquadSource object.
|
|
11
|
+
*/
|
|
12
|
+
function resolveSource(input) {
|
|
13
|
+
if (isLocalPath(input)) {
|
|
14
|
+
return parseLocalSource(input);
|
|
15
|
+
}
|
|
16
|
+
if (isRegistrySlug(input)) {
|
|
17
|
+
return {
|
|
18
|
+
type: "registry",
|
|
19
|
+
squad: input,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
// Default: treat as GitHub source
|
|
23
|
+
return parseGitHubSource(input);
|
|
24
|
+
}
|
|
25
|
+
export function createAddCommand() {
|
|
26
|
+
const cmd = new Command("add")
|
|
27
|
+
.description("Install a squad from GitHub, local path, or registry")
|
|
28
|
+
.argument("<source>", "Squad source (owner/repo, local path, or registry slug)")
|
|
29
|
+
.option("--skill <name>", "Install a specific squad from a multi-squad repo")
|
|
30
|
+
.option("-a, --agent <name>", "Install a specific agent only")
|
|
31
|
+
.option("-g, --global", "Install globally to ~/.squads/global/")
|
|
32
|
+
.option("-y, --yes", "Skip confirmation prompt")
|
|
33
|
+
.action(async (sourceArg, options) => {
|
|
34
|
+
const source = resolveSource(sourceArg);
|
|
35
|
+
// If --skill specified, set the squad path
|
|
36
|
+
if (options.skill) {
|
|
37
|
+
source.squad = options.skill;
|
|
38
|
+
}
|
|
39
|
+
// If registry type, resolve first to get actual source info
|
|
40
|
+
if (source.type === "registry") {
|
|
41
|
+
const spinner = ora("Resolving from squads.sh registry...").start();
|
|
42
|
+
try {
|
|
43
|
+
const resolved = await resolveRegistrySource(source.squad || sourceArg);
|
|
44
|
+
Object.assign(source, resolved);
|
|
45
|
+
spinner.succeed(`Found ${chalk.cyan(sourceArg)} at ${chalk.dim(`${resolved.owner}/${resolved.repo}`)}`);
|
|
46
|
+
}
|
|
47
|
+
catch (err) {
|
|
48
|
+
spinner.fail(chalk.red(err.message));
|
|
49
|
+
process.exit(1);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
// Confirmation prompt
|
|
53
|
+
if (!options.yes) {
|
|
54
|
+
const sourceLabel = source.type === "local"
|
|
55
|
+
? source.path
|
|
56
|
+
: source.owner && source.repo
|
|
57
|
+
? `${source.owner}/${source.repo}${source.squad ? `/${source.squad}` : ""}`
|
|
58
|
+
: sourceArg;
|
|
59
|
+
const { confirmed } = await prompts({
|
|
60
|
+
type: "confirm",
|
|
61
|
+
name: "confirmed",
|
|
62
|
+
message: `Install squad from ${chalk.cyan(sourceLabel)}${options.global ? chalk.yellow(" (global)") : ""}?`,
|
|
63
|
+
initial: true,
|
|
64
|
+
});
|
|
65
|
+
if (!confirmed) {
|
|
66
|
+
console.log(chalk.dim("Installation cancelled."));
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
const spinner = ora("Installing squad...").start();
|
|
71
|
+
try {
|
|
72
|
+
const result = await installSquad({
|
|
73
|
+
source,
|
|
74
|
+
projectDir: process.cwd(),
|
|
75
|
+
specificAgent: options.agent,
|
|
76
|
+
global: options.global,
|
|
77
|
+
skipConfirmation: options.yes,
|
|
78
|
+
});
|
|
79
|
+
spinner.succeed(chalk.green(`Installed ${chalk.bold(result.squadName)} v${result.version}`));
|
|
80
|
+
// Show installed agents
|
|
81
|
+
if (result.agents.length > 0) {
|
|
82
|
+
console.log();
|
|
83
|
+
console.log(chalk.dim(" Agents installed:"));
|
|
84
|
+
for (const agent of result.agents) {
|
|
85
|
+
console.log(` ${chalk.cyan(">")} ${agent}`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
console.log();
|
|
89
|
+
console.log(chalk.dim(` Squad location: ${result.squadDir}`));
|
|
90
|
+
}
|
|
91
|
+
catch (err) {
|
|
92
|
+
spinner.fail(chalk.red(err.message));
|
|
93
|
+
process.exit(1);
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
return cmd;
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=add.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAoEpC,wBAAgB,kBAAkB,IAAI,OAAO,CAuF5C"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import chalk from "chalk";
|
|
3
|
+
import ora from "ora";
|
|
4
|
+
import { readLockFile } from "../lib/lock-file.js";
|
|
5
|
+
/**
|
|
6
|
+
* Check the current tree SHA of a GitHub repository.
|
|
7
|
+
*/
|
|
8
|
+
async function getRemoteSha(owner, repo, branch) {
|
|
9
|
+
try {
|
|
10
|
+
const repoUrl = `https://api.github.com/repos/${owner}/${repo}`;
|
|
11
|
+
let ref = branch;
|
|
12
|
+
if (!ref) {
|
|
13
|
+
const repoRes = await fetch(repoUrl, {
|
|
14
|
+
headers: { Accept: "application/vnd.github.v3+json" },
|
|
15
|
+
});
|
|
16
|
+
if (!repoRes.ok)
|
|
17
|
+
return null;
|
|
18
|
+
const repoData = (await repoRes.json());
|
|
19
|
+
ref = repoData.default_branch;
|
|
20
|
+
}
|
|
21
|
+
const treeUrl = `${repoUrl}/git/trees/${ref}`;
|
|
22
|
+
const treeRes = await fetch(treeUrl, {
|
|
23
|
+
headers: { Accept: "application/vnd.github.v3+json" },
|
|
24
|
+
});
|
|
25
|
+
if (!treeRes.ok)
|
|
26
|
+
return null;
|
|
27
|
+
const data = (await treeRes.json());
|
|
28
|
+
return data.sha;
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Parse a source string to extract owner/repo.
|
|
36
|
+
*/
|
|
37
|
+
function parseSourceForCheck(source) {
|
|
38
|
+
// Handle registry:slug format
|
|
39
|
+
if (source.startsWith("registry:"))
|
|
40
|
+
return null;
|
|
41
|
+
// Handle local paths
|
|
42
|
+
if (source.startsWith("/") || source.startsWith("./"))
|
|
43
|
+
return null;
|
|
44
|
+
// Parse owner/repo[/path][#branch]
|
|
45
|
+
let rest = source;
|
|
46
|
+
let branch;
|
|
47
|
+
const hashIdx = source.indexOf("#");
|
|
48
|
+
if (hashIdx !== -1) {
|
|
49
|
+
branch = source.slice(hashIdx + 1);
|
|
50
|
+
rest = source.slice(0, hashIdx);
|
|
51
|
+
}
|
|
52
|
+
const parts = rest.split("/");
|
|
53
|
+
if (parts.length < 2)
|
|
54
|
+
return null;
|
|
55
|
+
return {
|
|
56
|
+
owner: parts[0],
|
|
57
|
+
repo: parts[1],
|
|
58
|
+
branch,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
export function createCheckCommand() {
|
|
62
|
+
const cmd = new Command("check")
|
|
63
|
+
.description("Check installed squads for available updates")
|
|
64
|
+
.action(async () => {
|
|
65
|
+
const lockFile = await readLockFile(process.cwd());
|
|
66
|
+
const entries = Object.entries(lockFile.squads);
|
|
67
|
+
if (entries.length === 0) {
|
|
68
|
+
console.log(chalk.dim("No squads installed."));
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
const spinner = ora("Checking for updates...").start();
|
|
72
|
+
const updates = [];
|
|
73
|
+
const upToDate = [];
|
|
74
|
+
const skipped = [];
|
|
75
|
+
for (const [name, entry] of entries) {
|
|
76
|
+
const parsed = parseSourceForCheck(entry.source);
|
|
77
|
+
if (!parsed) {
|
|
78
|
+
skipped.push({ name, reason: "non-GitHub source" });
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
const remoteSha = await getRemoteSha(parsed.owner, parsed.repo, parsed.branch);
|
|
82
|
+
if (remoteSha === null) {
|
|
83
|
+
skipped.push({ name, reason: "could not reach repository" });
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
// Compare SHA (rough heuristic: if remote SHA differs from stored hash,
|
|
87
|
+
// there might be updates)
|
|
88
|
+
if (remoteSha !== entry.hash) {
|
|
89
|
+
updates.push({
|
|
90
|
+
name,
|
|
91
|
+
source: entry.source,
|
|
92
|
+
current: entry.version,
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
upToDate.push(name);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
spinner.stop();
|
|
100
|
+
if (updates.length > 0) {
|
|
101
|
+
console.log(chalk.bold("\n Updates available:\n"));
|
|
102
|
+
for (const u of updates) {
|
|
103
|
+
console.log(` ${chalk.cyan(u.name)} ${chalk.dim(`v${u.current}`)} ${chalk.yellow("-> update available")}`);
|
|
104
|
+
console.log(chalk.dim(` source: ${u.source}`));
|
|
105
|
+
}
|
|
106
|
+
console.log();
|
|
107
|
+
console.log(chalk.dim(" Run: squads update [squad-name] to update"));
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
console.log(chalk.green("\n All squads are up to date."));
|
|
111
|
+
}
|
|
112
|
+
if (upToDate.length > 0) {
|
|
113
|
+
console.log();
|
|
114
|
+
console.log(chalk.dim(` Up to date: ${upToDate.join(", ")}`));
|
|
115
|
+
}
|
|
116
|
+
if (skipped.length > 0) {
|
|
117
|
+
console.log();
|
|
118
|
+
console.log(chalk.dim(" Skipped:"));
|
|
119
|
+
for (const s of skipped) {
|
|
120
|
+
console.log(chalk.dim(` ${s.name} (${s.reason})`));
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
console.log();
|
|
124
|
+
});
|
|
125
|
+
return cmd;
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"find.d.ts","sourceRoot":"","sources":["../../src/commands/find.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgCpC,wBAAgB,iBAAiB,IAAI,OAAO,CAkF3C"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import chalk from "chalk";
|
|
3
|
+
import ora from "ora";
|
|
4
|
+
import { searchRegistry } from "../lib/sources/registry.js";
|
|
5
|
+
import { trackFind } from "../lib/telemetry.js";
|
|
6
|
+
/**
|
|
7
|
+
* Format a number with K/M suffix for compact display.
|
|
8
|
+
*/
|
|
9
|
+
function formatCount(n) {
|
|
10
|
+
if (n >= 1_000_000)
|
|
11
|
+
return `${(n / 1_000_000).toFixed(1)}M`;
|
|
12
|
+
if (n >= 1_000)
|
|
13
|
+
return `${(n / 1_000).toFixed(1)}K`;
|
|
14
|
+
return String(n);
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Render stars as a visual bar (0-5 scale).
|
|
18
|
+
*/
|
|
19
|
+
function renderStars(avg) {
|
|
20
|
+
const filled = Math.round(avg);
|
|
21
|
+
const empty = 5 - filled;
|
|
22
|
+
return chalk.yellow("*".repeat(filled)) + chalk.dim("*".repeat(empty));
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Truncate a string to a max length, adding ellipsis if needed.
|
|
26
|
+
*/
|
|
27
|
+
function truncate(str, max) {
|
|
28
|
+
if (str.length <= max)
|
|
29
|
+
return str;
|
|
30
|
+
return str.slice(0, max - 1) + "\u2026";
|
|
31
|
+
}
|
|
32
|
+
export function createFindCommand() {
|
|
33
|
+
const cmd = new Command("find")
|
|
34
|
+
.description("Search for squads on squads.sh")
|
|
35
|
+
.argument("[query]", "Search query")
|
|
36
|
+
.option("-l, --limit <n>", "Max results to show", "20")
|
|
37
|
+
.action(async (query, options) => {
|
|
38
|
+
if (!query) {
|
|
39
|
+
console.log(chalk.yellow("Usage: squads find <query>"));
|
|
40
|
+
console.log();
|
|
41
|
+
console.log(chalk.dim("Examples:"));
|
|
42
|
+
console.log(chalk.dim(" squads find design-system"));
|
|
43
|
+
console.log(chalk.dim(" squads find code-review"));
|
|
44
|
+
console.log(chalk.dim(" squads find testing"));
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
const spinner = ora(`Searching for "${query}"...`).start();
|
|
48
|
+
try {
|
|
49
|
+
const limit = parseInt(options.limit, 10) || 20;
|
|
50
|
+
const results = await searchRegistry(query, limit);
|
|
51
|
+
trackFind(query);
|
|
52
|
+
if (results.length === 0) {
|
|
53
|
+
spinner.info(chalk.yellow(`No squads found for "${query}"`));
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
spinner.succeed(`Found ${results.length} squad(s)\n`);
|
|
57
|
+
// Table header
|
|
58
|
+
const nameWidth = 28;
|
|
59
|
+
const installsWidth = 10;
|
|
60
|
+
const starsWidth = 8;
|
|
61
|
+
console.log(chalk.bold(" " +
|
|
62
|
+
"Name".padEnd(nameWidth) +
|
|
63
|
+
"Installs".padEnd(installsWidth) +
|
|
64
|
+
"Rating".padEnd(starsWidth) +
|
|
65
|
+
"Description"));
|
|
66
|
+
console.log(chalk.dim(" " + "-".repeat(nameWidth + installsWidth + starsWidth + 40)));
|
|
67
|
+
for (const result of results) {
|
|
68
|
+
const name = chalk.cyan(truncate(result.display_name || result.name, nameWidth - 2).padEnd(nameWidth));
|
|
69
|
+
const installs = chalk.dim(formatCount(result.install_count).padEnd(installsWidth));
|
|
70
|
+
const stars = renderStars(result.review_avg).padEnd(starsWidth);
|
|
71
|
+
const desc = chalk.dim(truncate(result.description || "", 50));
|
|
72
|
+
console.log(` ${name}${installs}${stars}${desc}`);
|
|
73
|
+
}
|
|
74
|
+
console.log();
|
|
75
|
+
console.log(chalk.dim(" Install with: squads add <name>"));
|
|
76
|
+
}
|
|
77
|
+
catch (err) {
|
|
78
|
+
spinner.fail(chalk.red(err.message));
|
|
79
|
+
process.exit(1);
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
return cmd;
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=find.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"find.js","sourceRoot":"","sources":["../../src/commands/find.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA0MpC,wBAAgB,iBAAiB,IAAI,OAAO,CAiI3C"}
|
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import chalk from "chalk";
|
|
3
|
+
import ora from "ora";
|
|
4
|
+
import prompts from "prompts";
|
|
5
|
+
import { mkdir, writeFile, stat } from "node:fs/promises";
|
|
6
|
+
import { join, basename } from "node:path";
|
|
7
|
+
const SQUAD_YAML_TEMPLATE = (name, description) => `name: ${name}
|
|
8
|
+
version: 1.0.0
|
|
9
|
+
description: "${description}"
|
|
10
|
+
slashPrefix: ${name.slice(0, 3)}
|
|
11
|
+
|
|
12
|
+
aios:
|
|
13
|
+
minVersion: "2.1.0"
|
|
14
|
+
type: squad
|
|
15
|
+
|
|
16
|
+
components:
|
|
17
|
+
agents:
|
|
18
|
+
- agents/sample-agent.md
|
|
19
|
+
tasks:
|
|
20
|
+
- tasks/sample-task.md
|
|
21
|
+
workflows:
|
|
22
|
+
- workflows/main-workflow.yaml
|
|
23
|
+
config:
|
|
24
|
+
- config/coding-standards.md
|
|
25
|
+
- config/tech-stack.md
|
|
26
|
+
- config/source-tree.md
|
|
27
|
+
`;
|
|
28
|
+
const SAMPLE_AGENT = (name) => `---
|
|
29
|
+
agent:
|
|
30
|
+
name: SampleAgent
|
|
31
|
+
id: sample-agent
|
|
32
|
+
title: Sample Agent
|
|
33
|
+
icon: "🤖"
|
|
34
|
+
whenToUse: "Use this agent as a starting point for your squad."
|
|
35
|
+
persona_profile:
|
|
36
|
+
archetype: Builder
|
|
37
|
+
communication:
|
|
38
|
+
tone: professional
|
|
39
|
+
greeting_levels:
|
|
40
|
+
brief: "Hello! I'm the sample agent for ${name}."
|
|
41
|
+
standard: "Hello! I'm the sample agent for ${name}. I'm here to help you get started."
|
|
42
|
+
detailed: "Hello! I'm the sample agent for ${name}. I'm a starting template — customize me to fit your squad's needs."
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
# SampleAgent
|
|
46
|
+
|
|
47
|
+
## Papel
|
|
48
|
+
|
|
49
|
+
Agente de exemplo para o squad **${name}**. Substitua este arquivo com agentes reais.
|
|
50
|
+
|
|
51
|
+
## Capacidades
|
|
52
|
+
|
|
53
|
+
- Capacidade de exemplo 1
|
|
54
|
+
- Capacidade de exemplo 2
|
|
55
|
+
|
|
56
|
+
## Instruções
|
|
57
|
+
|
|
58
|
+
1. Edite este arquivo para definir o comportamento do agente
|
|
59
|
+
2. Adicione persona_profile, commands e greeting_levels
|
|
60
|
+
3. Consulte a documentação AIOS para o formato completo
|
|
61
|
+
`;
|
|
62
|
+
const SAMPLE_TASK = (name) => `---
|
|
63
|
+
task: sampleTask()
|
|
64
|
+
responsavel: "SampleAgent"
|
|
65
|
+
responsavel_type: Agente
|
|
66
|
+
atomic_layer: Molecule
|
|
67
|
+
Entrada:
|
|
68
|
+
- input_data: "Dados de entrada de exemplo"
|
|
69
|
+
Saida:
|
|
70
|
+
- output_result: "Resultado processado"
|
|
71
|
+
Checklist:
|
|
72
|
+
- Validar entrada
|
|
73
|
+
- Processar dados
|
|
74
|
+
- Retornar resultado
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
# sampleTask()
|
|
78
|
+
|
|
79
|
+
## Descrição
|
|
80
|
+
|
|
81
|
+
Task de exemplo para o squad **${name}**. Substitua com tasks reais.
|
|
82
|
+
|
|
83
|
+
## Contrato
|
|
84
|
+
|
|
85
|
+
### Entrada
|
|
86
|
+
- \`input_data\`: Dados de entrada de exemplo
|
|
87
|
+
|
|
88
|
+
### Saída
|
|
89
|
+
- \`output_result\`: Resultado processado
|
|
90
|
+
|
|
91
|
+
## Passos
|
|
92
|
+
|
|
93
|
+
1. Receber e validar os dados de entrada
|
|
94
|
+
2. Processar conforme regras de negócio
|
|
95
|
+
3. Retornar resultado formatado
|
|
96
|
+
`;
|
|
97
|
+
const SAMPLE_WORKFLOW = (name) => `workflow_name: main_workflow
|
|
98
|
+
description: "Workflow principal do squad ${name}"
|
|
99
|
+
agent_sequence:
|
|
100
|
+
- sample-agent
|
|
101
|
+
success_indicators:
|
|
102
|
+
- "Task completada com sucesso"
|
|
103
|
+
- "Output validado"
|
|
104
|
+
|
|
105
|
+
transitions:
|
|
106
|
+
start:
|
|
107
|
+
next: sample-agent
|
|
108
|
+
condition: "Sempre"
|
|
109
|
+
sample-agent:
|
|
110
|
+
next: end
|
|
111
|
+
condition: "Task finalizada"
|
|
112
|
+
`;
|
|
113
|
+
const CODING_STANDARDS = `# Padrões de Código
|
|
114
|
+
|
|
115
|
+
## Naming
|
|
116
|
+
- Arquivos: kebab-case
|
|
117
|
+
- Variáveis: camelCase
|
|
118
|
+
- Constantes: UPPER_SNAKE_CASE
|
|
119
|
+
|
|
120
|
+
## Estilo
|
|
121
|
+
- UTF-8 em todos os arquivos
|
|
122
|
+
- Indentação: 2 espaços
|
|
123
|
+
- Aspas: duplas para strings
|
|
124
|
+
|
|
125
|
+
## Testes
|
|
126
|
+
- Cobertura mínima: 80%
|
|
127
|
+
- Nomenclatura: describe/it pattern
|
|
128
|
+
`;
|
|
129
|
+
const TECH_STACK = `# Tech Stack
|
|
130
|
+
|
|
131
|
+
## Runtime
|
|
132
|
+
- Node.js >= 18
|
|
133
|
+
|
|
134
|
+
## Frameworks
|
|
135
|
+
- (Defina os frameworks do projeto-alvo aqui)
|
|
136
|
+
|
|
137
|
+
## Dependências
|
|
138
|
+
- (Liste as dependências principais aqui)
|
|
139
|
+
`;
|
|
140
|
+
const SOURCE_TREE = `# Source Tree
|
|
141
|
+
|
|
142
|
+
\`\`\`
|
|
143
|
+
project/
|
|
144
|
+
├── agents/ # Agent definitions
|
|
145
|
+
├── tasks/ # Task definitions
|
|
146
|
+
├── workflows/ # Workflow definitions
|
|
147
|
+
├── config/ # Configuration files
|
|
148
|
+
├── squad.yaml # Squad manifest
|
|
149
|
+
└── README.md # Documentation
|
|
150
|
+
\`\`\`
|
|
151
|
+
`;
|
|
152
|
+
const README_TEMPLATE = (name, description) => `# ${name}
|
|
153
|
+
|
|
154
|
+
${description}
|
|
155
|
+
|
|
156
|
+
## Instalação
|
|
157
|
+
|
|
158
|
+
\`\`\`bash
|
|
159
|
+
npx squads add ./${name}
|
|
160
|
+
\`\`\`
|
|
161
|
+
|
|
162
|
+
## Agentes
|
|
163
|
+
|
|
164
|
+
| Agente | Papel |
|
|
165
|
+
|--------|-------|
|
|
166
|
+
| sample-agent | Agente de exemplo |
|
|
167
|
+
|
|
168
|
+
## Estrutura
|
|
169
|
+
|
|
170
|
+
\`\`\`
|
|
171
|
+
${name}/
|
|
172
|
+
├── agents/
|
|
173
|
+
│ └── sample-agent.md
|
|
174
|
+
├── tasks/
|
|
175
|
+
│ └── sample-task.md
|
|
176
|
+
├── workflows/
|
|
177
|
+
│ └── main-workflow.yaml
|
|
178
|
+
├── config/
|
|
179
|
+
│ ├── coding-standards.md
|
|
180
|
+
│ ├── tech-stack.md
|
|
181
|
+
│ └── source-tree.md
|
|
182
|
+
├── squad.yaml
|
|
183
|
+
└── README.md
|
|
184
|
+
\`\`\`
|
|
185
|
+
|
|
186
|
+
## Uso
|
|
187
|
+
|
|
188
|
+
Após instalar, os agentes ficam disponíveis como slash commands no Claude Code:
|
|
189
|
+
|
|
190
|
+
\`\`\`
|
|
191
|
+
/${name.slice(0, 3)}:agents:sample-agent
|
|
192
|
+
\`\`\`
|
|
193
|
+
`;
|
|
194
|
+
export function createInitCommand() {
|
|
195
|
+
const cmd = new Command("init")
|
|
196
|
+
.description("Initialize a new squad project")
|
|
197
|
+
.argument("[name]", "Squad name (kebab-case)")
|
|
198
|
+
.option("-y, --yes", "Use defaults without prompting")
|
|
199
|
+
.action(async (nameArg, options) => {
|
|
200
|
+
let name = nameArg;
|
|
201
|
+
let description = "";
|
|
202
|
+
if (!options.yes || !name) {
|
|
203
|
+
const answers = await prompts([
|
|
204
|
+
{
|
|
205
|
+
type: name ? null : "text",
|
|
206
|
+
name: "name",
|
|
207
|
+
message: "Squad name (kebab-case):",
|
|
208
|
+
initial: name || basename(process.cwd()),
|
|
209
|
+
validate: (v) => /^[a-z0-9]([a-z0-9-]*[a-z0-9])?$/.test(v)
|
|
210
|
+
? true
|
|
211
|
+
: "Must be kebab-case (lowercase letters, numbers, hyphens)",
|
|
212
|
+
},
|
|
213
|
+
{
|
|
214
|
+
type: "text",
|
|
215
|
+
name: "description",
|
|
216
|
+
message: "Description:",
|
|
217
|
+
initial: "An AIOS squad",
|
|
218
|
+
},
|
|
219
|
+
]);
|
|
220
|
+
name = answers.name || name;
|
|
221
|
+
description = answers.description || "An AIOS squad";
|
|
222
|
+
}
|
|
223
|
+
else {
|
|
224
|
+
description = "An AIOS squad";
|
|
225
|
+
}
|
|
226
|
+
if (!name) {
|
|
227
|
+
console.log(chalk.dim("Initialization cancelled."));
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
230
|
+
const targetDir = join(process.cwd(), name);
|
|
231
|
+
// Check if directory already exists
|
|
232
|
+
try {
|
|
233
|
+
await stat(targetDir);
|
|
234
|
+
console.log(chalk.red(`Directory "${name}" already exists.`));
|
|
235
|
+
process.exit(1);
|
|
236
|
+
}
|
|
237
|
+
catch {
|
|
238
|
+
// Directory doesn't exist, good
|
|
239
|
+
}
|
|
240
|
+
const spinner = ora(`Creating squad "${name}"...`).start();
|
|
241
|
+
try {
|
|
242
|
+
// Create directories
|
|
243
|
+
await mkdir(join(targetDir, "agents"), { recursive: true });
|
|
244
|
+
await mkdir(join(targetDir, "tasks"), { recursive: true });
|
|
245
|
+
await mkdir(join(targetDir, "workflows"), { recursive: true });
|
|
246
|
+
await mkdir(join(targetDir, "config"), { recursive: true });
|
|
247
|
+
// Write files
|
|
248
|
+
await writeFile(join(targetDir, "squad.yaml"), SQUAD_YAML_TEMPLATE(name, description), "utf-8");
|
|
249
|
+
await writeFile(join(targetDir, "agents", "sample-agent.md"), SAMPLE_AGENT(name), "utf-8");
|
|
250
|
+
await writeFile(join(targetDir, "tasks", "sample-task.md"), SAMPLE_TASK(name), "utf-8");
|
|
251
|
+
await writeFile(join(targetDir, "workflows", "main-workflow.yaml"), SAMPLE_WORKFLOW(name), "utf-8");
|
|
252
|
+
await writeFile(join(targetDir, "config", "coding-standards.md"), CODING_STANDARDS, "utf-8");
|
|
253
|
+
await writeFile(join(targetDir, "config", "tech-stack.md"), TECH_STACK, "utf-8");
|
|
254
|
+
await writeFile(join(targetDir, "config", "source-tree.md"), SOURCE_TREE, "utf-8");
|
|
255
|
+
await writeFile(join(targetDir, "README.md"), README_TEMPLATE(name, description), "utf-8");
|
|
256
|
+
spinner.succeed(chalk.green(`Squad "${chalk.bold(name)}" created!`));
|
|
257
|
+
console.log();
|
|
258
|
+
console.log(chalk.dim(" Files created:"));
|
|
259
|
+
console.log(chalk.dim(` ${name}/squad.yaml`));
|
|
260
|
+
console.log(chalk.dim(` ${name}/agents/sample-agent.md`));
|
|
261
|
+
console.log(chalk.dim(` ${name}/tasks/sample-task.md`));
|
|
262
|
+
console.log(chalk.dim(` ${name}/workflows/main-workflow.yaml`));
|
|
263
|
+
console.log(chalk.dim(` ${name}/config/coding-standards.md`));
|
|
264
|
+
console.log(chalk.dim(` ${name}/config/tech-stack.md`));
|
|
265
|
+
console.log(chalk.dim(` ${name}/config/source-tree.md`));
|
|
266
|
+
console.log(chalk.dim(` ${name}/README.md`));
|
|
267
|
+
console.log();
|
|
268
|
+
console.log(chalk.dim(" Next steps:"));
|
|
269
|
+
console.log(chalk.dim(` cd ${name}`));
|
|
270
|
+
console.log(chalk.dim(" Edit agents/ to define your agents"));
|
|
271
|
+
console.log(chalk.dim(" Edit tasks/ to define your tasks"));
|
|
272
|
+
console.log(chalk.dim(" Edit workflows/ to define your workflows"));
|
|
273
|
+
}
|
|
274
|
+
catch (err) {
|
|
275
|
+
spinner.fail(chalk.red(err.message));
|
|
276
|
+
process.exit(1);
|
|
277
|
+
}
|
|
278
|
+
});
|
|
279
|
+
return cmd;
|
|
280
|
+
}
|
|
281
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|