@ranimontagna/agent-toolkit 0.1.1

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 (69) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +426 -0
  3. package/dist/bin/agent-toolkit.d.ts +2 -0
  4. package/dist/bin/agent-toolkit.js +14 -0
  5. package/dist/bin/agent-toolkit.js.map +1 -0
  6. package/dist/src/args.d.ts +1 -0
  7. package/dist/src/args.js +152 -0
  8. package/dist/src/args.js.map +1 -0
  9. package/dist/src/checksum.d.ts +2 -0
  10. package/dist/src/checksum.js +9 -0
  11. package/dist/src/checksum.js.map +1 -0
  12. package/dist/src/context.d.ts +3 -0
  13. package/dist/src/context.js +10 -0
  14. package/dist/src/context.js.map +1 -0
  15. package/dist/src/installers/caveman.d.ts +1 -0
  16. package/dist/src/installers/caveman.js +23 -0
  17. package/dist/src/installers/caveman.js.map +1 -0
  18. package/dist/src/installers/frontend-skills.d.ts +1 -0
  19. package/dist/src/installers/frontend-skills.js +82 -0
  20. package/dist/src/installers/frontend-skills.js.map +1 -0
  21. package/dist/src/installers/graphify.d.ts +1 -0
  22. package/dist/src/installers/graphify.js +58 -0
  23. package/dist/src/installers/graphify.js.map +1 -0
  24. package/dist/src/installers/gsd.d.ts +1 -0
  25. package/dist/src/installers/gsd.js +19 -0
  26. package/dist/src/installers/gsd.js.map +1 -0
  27. package/dist/src/installers/rtk.d.ts +1 -0
  28. package/dist/src/installers/rtk.js +158 -0
  29. package/dist/src/installers/rtk.js.map +1 -0
  30. package/dist/src/installers/superpowers.d.ts +1 -0
  31. package/dist/src/installers/superpowers.js +73 -0
  32. package/dist/src/installers/superpowers.js.map +1 -0
  33. package/dist/src/logger.d.ts +18 -0
  34. package/dist/src/logger.js +35 -0
  35. package/dist/src/logger.js.map +1 -0
  36. package/dist/src/main.d.ts +1 -0
  37. package/dist/src/main.js +104 -0
  38. package/dist/src/main.js.map +1 -0
  39. package/dist/src/menu.d.ts +1 -0
  40. package/dist/src/menu.js +98 -0
  41. package/dist/src/menu.js.map +1 -0
  42. package/dist/src/provenance.d.ts +1 -0
  43. package/dist/src/provenance.js +44 -0
  44. package/dist/src/provenance.js.map +1 -0
  45. package/dist/src/runtimes.d.ts +7 -0
  46. package/dist/src/runtimes.js +123 -0
  47. package/dist/src/runtimes.js.map +1 -0
  48. package/dist/src/skills.d.ts +12 -0
  49. package/dist/src/skills.js +247 -0
  50. package/dist/src/skills.js.map +1 -0
  51. package/dist/src/state.d.ts +51 -0
  52. package/dist/src/state.js +137 -0
  53. package/dist/src/state.js.map +1 -0
  54. package/dist/src/system.d.ts +21 -0
  55. package/dist/src/system.js +109 -0
  56. package/dist/src/system.js.map +1 -0
  57. package/dist/src/tool-lock.d.ts +60 -0
  58. package/dist/src/tool-lock.js +109 -0
  59. package/dist/src/tool-lock.js.map +1 -0
  60. package/dist/src/ui.d.ts +3 -0
  61. package/dist/src/ui.js +41 -0
  62. package/dist/src/ui.js.map +1 -0
  63. package/dist/src/usage.d.ts +1 -0
  64. package/dist/src/usage.js +66 -0
  65. package/dist/src/usage.js.map +1 -0
  66. package/package.json +50 -0
  67. package/setup-agent-toolkit.sh +20 -0
  68. package/skills/core/agent-toolkit-maintainer/SKILL.md +68 -0
  69. package/tools.lock.json +84 -0
@@ -0,0 +1,137 @@
1
+ import path from "node:path";
2
+ import { HOME, REPO_ROOT } from "./context.js";
3
+ import { formatGithubPackageSpec, formatNpmPackageSpec, formatPythonPackageSpec, githubReleaseApiUrl, loadToolLock, } from "./tool-lock.js";
4
+ export const toolNames = [
5
+ "rtk",
6
+ "caveman",
7
+ "superpowers",
8
+ "graphify",
9
+ "gsd",
10
+ "frontend-skills",
11
+ "skills",
12
+ ];
13
+ export const runtimeNames = ["claude", "codex", "opencode", "gemini"];
14
+ function envInstallScope(value) {
15
+ return value === "local" ? "local" : "global";
16
+ }
17
+ export function isToolName(value) {
18
+ return toolNames.includes(value);
19
+ }
20
+ export function isRuntimeName(value) {
21
+ return runtimeNames.includes(value);
22
+ }
23
+ export function splitList(value) {
24
+ return value
25
+ .split(",")
26
+ .map((item) => item.trim().toLowerCase())
27
+ .filter(Boolean);
28
+ }
29
+ export function normalizeScope(scope) {
30
+ return scope
31
+ .trim()
32
+ .toLowerCase()
33
+ .replace(/\\/g, "/")
34
+ .replace(/^\/+|\/+$/g, "");
35
+ }
36
+ const toolLock = loadToolLock();
37
+ export const state = {
38
+ rtkInstallDir: process.env.RTK_INSTALL_DIR || path.join(HOME, ".local", "bin"),
39
+ rtkGithub: process.env.RTK_GITHUB ||
40
+ githubReleaseApiUrl(toolLock.tools.rtk.repository, toolLock.tools.rtk.tag),
41
+ rtkAssetChecksums: Object.fromEntries(Object.entries(toolLock.tools.rtk.assets).map(([assetName, asset]) => [
42
+ assetName,
43
+ asset.sha256,
44
+ ])),
45
+ cavemanPackage: process.env.CAVEMAN_PACKAGE ||
46
+ formatGithubPackageSpec(toolLock.tools.caveman.repository, toolLock.tools.caveman.ref),
47
+ cavemanMode: process.env.CAVEMAN_MODE || "minimal",
48
+ graphifyPackage: process.env.GRAPHIFY_PACKAGE ||
49
+ formatPythonPackageSpec(toolLock.tools.graphify.package, toolLock.tools.graphify.version),
50
+ graphifyInstaller: process.env.GRAPHIFY_INSTALLER || "uv",
51
+ gsdPackage: process.env.GSD_PACKAGE ||
52
+ formatNpmPackageSpec(toolLock.tools.gsd.package, toolLock.tools.gsd.version),
53
+ frontendSkillsCliPackage: process.env.SKILLS_CLI_PACKAGE ||
54
+ formatNpmPackageSpec(toolLock.tools.frontendSkills.skillsCli.package, toolLock.tools.frontendSkills.skillsCli.version),
55
+ frontendSkillSources: [
56
+ {
57
+ label: "Impeccable",
58
+ repository: toolLock.tools.frontendSkills.impeccable.repository,
59
+ ref: toolLock.tools.frontendSkills.impeccable.ref,
60
+ skill: toolLock.tools.frontendSkills.impeccable.skill,
61
+ },
62
+ {
63
+ label: "Taste Skill",
64
+ repository: toolLock.tools.frontendSkills.tasteSkill.repository,
65
+ ref: toolLock.tools.frontendSkills.tasteSkill.ref,
66
+ skill: toolLock.tools.frontendSkills.tasteSkill.skill,
67
+ },
68
+ ],
69
+ gsdScope: envInstallScope(process.env.GSD_SCOPE),
70
+ customSkillsDir: process.env.CUSTOM_SKILLS_DIR || path.join(REPO_ROOT, "skills"),
71
+ skillScopes: splitList(process.env.SKILLS_SCOPE || ""),
72
+ listSkills: false,
73
+ cliPackages: {
74
+ claude: process.env.CLAUDE_CLI_PACKAGE ||
75
+ formatNpmPackageSpec(toolLock.runtimeClis.claude.package, toolLock.runtimeClis.claude.version),
76
+ codex: process.env.CODEX_CLI_PACKAGE ||
77
+ formatNpmPackageSpec(toolLock.runtimeClis.codex.package, toolLock.runtimeClis.codex.version),
78
+ opencode: process.env.OPENCODE_CLI_PACKAGE ||
79
+ formatNpmPackageSpec(toolLock.runtimeClis.opencode.package, toolLock.runtimeClis.opencode.version),
80
+ gemini: process.env.GEMINI_CLI_PACKAGE ||
81
+ formatNpmPackageSpec(toolLock.runtimeClis.gemini.package, toolLock.runtimeClis.gemini.version),
82
+ },
83
+ tools: {
84
+ rtk: true,
85
+ caveman: true,
86
+ superpowers: true,
87
+ graphify: true,
88
+ gsd: true,
89
+ "frontend-skills": true,
90
+ skills: true,
91
+ },
92
+ runtimes: {
93
+ claude: true,
94
+ codex: true,
95
+ opencode: true,
96
+ gemini: true,
97
+ },
98
+ nonInteractive: false,
99
+ installMissingClis: false,
100
+ allowMutableSources: process.env.ALLOW_MUTABLE_SOURCES === "1",
101
+ };
102
+ export const runtimeMeta = {
103
+ claude: {
104
+ command: "claude",
105
+ label: "Claude Code CLI",
106
+ display: "Claude Code",
107
+ },
108
+ codex: { command: "codex", label: "Codex CLI", display: "Codex CLI" },
109
+ opencode: { command: "opencode", label: "OpenCode CLI", display: "OpenCode" },
110
+ gemini: { command: "gemini", label: "Gemini CLI", display: "Gemini CLI" },
111
+ };
112
+ export function setAllTools(value) {
113
+ for (const key of toolNames)
114
+ state.tools[key] = value;
115
+ }
116
+ export function selectOnlyTool(tool) {
117
+ setAllTools(false);
118
+ state.tools[tool] = true;
119
+ }
120
+ export function setAllRuntimes(value) {
121
+ for (const key of runtimeNames)
122
+ state.runtimes[key] = value;
123
+ }
124
+ export function selectOnlyRuntime(runtime) {
125
+ setAllRuntimes(false);
126
+ state.runtimes[runtime] = true;
127
+ }
128
+ export function anyToolSelected() {
129
+ return Object.values(state.tools).some(Boolean);
130
+ }
131
+ export function anyRuntimeSelected() {
132
+ return Object.values(state.runtimes).some(Boolean);
133
+ }
134
+ export function normalizedSkillScopes() {
135
+ return state.skillScopes.map(normalizeScope).filter(Boolean);
136
+ }
137
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ type RunOptions = {
2
+ cwd?: string;
3
+ env?: NodeJS.ProcessEnv;
4
+ capture?: boolean;
5
+ };
6
+ export type RunResult = {
7
+ ok: boolean;
8
+ status: number;
9
+ stdout: string;
10
+ stderr: string;
11
+ error?: Error;
12
+ };
13
+ export declare function findCommand(command: string): string | null;
14
+ export declare function commandExists(command: string): boolean;
15
+ export declare function run(command: string, args?: string[], options?: RunOptions): RunResult;
16
+ export declare function capture(command: string, args?: string[]): RunResult;
17
+ export declare function requireCommand(command: string): void;
18
+ export declare function requireNode(requiredMajor: number): void;
19
+ export declare function fetchJson(url: string): Promise<unknown>;
20
+ export declare function downloadFile(url: string, destination: string): Promise<void>;
21
+ export {};
@@ -0,0 +1,109 @@
1
+ import { spawnSync } from "node:child_process";
2
+ import fs from "node:fs";
3
+ import http from "node:http";
4
+ import https from "node:https";
5
+ import path from "node:path";
6
+ import process from "node:process";
7
+ import { die } from "./logger.js";
8
+ export function findCommand(command) {
9
+ const pathValue = process.env.PATH || "";
10
+ const pathExt = process.platform === "win32"
11
+ ? (process.env.PATHEXT || ".EXE;.CMD;.BAT;.COM").split(";")
12
+ : [""];
13
+ for (const dir of pathValue.split(path.delimiter)) {
14
+ if (!dir)
15
+ continue;
16
+ for (const ext of pathExt) {
17
+ const candidate = path.join(dir, `${command}${ext}`);
18
+ try {
19
+ fs.accessSync(candidate, fs.constants.X_OK);
20
+ return candidate;
21
+ }
22
+ catch {
23
+ // Continue scanning PATH.
24
+ }
25
+ }
26
+ }
27
+ return null;
28
+ }
29
+ export function commandExists(command) {
30
+ return Boolean(findCommand(command));
31
+ }
32
+ export function run(command, args = [], options = {}) {
33
+ const result = spawnSync(command, args, {
34
+ cwd: options.cwd || process.cwd(),
35
+ env: options.env || process.env,
36
+ encoding: "utf8",
37
+ stdio: options.capture ? ["ignore", "pipe", "pipe"] : "inherit",
38
+ });
39
+ if (result.error) {
40
+ return {
41
+ ok: false,
42
+ status: typeof result.status === "number" ? result.status : 1,
43
+ stdout: result.stdout || "",
44
+ stderr: result.stderr || result.error.message,
45
+ error: result.error,
46
+ };
47
+ }
48
+ return {
49
+ ok: result.status === 0,
50
+ status: result.status ?? 0,
51
+ stdout: result.stdout || "",
52
+ stderr: result.stderr || "",
53
+ };
54
+ }
55
+ export function capture(command, args = []) {
56
+ return run(command, args, { capture: true });
57
+ }
58
+ export function requireCommand(command) {
59
+ if (!commandExists(command))
60
+ die(`Missing prerequisite: ${command}`);
61
+ }
62
+ export function requireNode(requiredMajor) {
63
+ const major = Number.parseInt(process.versions.node.split(".")[0] ?? "", 10);
64
+ if (!Number.isInteger(major) || major < requiredMajor) {
65
+ die(`Node.js >= ${requiredMajor} is required. Current: ${process.version}`);
66
+ }
67
+ }
68
+ function requestBuffer(url, redirects = 0) {
69
+ return new Promise((resolve, reject) => {
70
+ if (redirects > 5) {
71
+ reject(new Error("Too many redirects"));
72
+ return;
73
+ }
74
+ const client = url.startsWith("https:") ? https : http;
75
+ const request = client.get(url, {
76
+ headers: {
77
+ "User-Agent": "agent-toolkit",
78
+ Accept: "application/vnd.github+json, application/json",
79
+ },
80
+ }, (response) => {
81
+ const { statusCode = 0, headers } = response;
82
+ if ([301, 302, 303, 307, 308].includes(statusCode) &&
83
+ headers.location) {
84
+ response.resume();
85
+ const nextUrl = new URL(headers.location, url).toString();
86
+ requestBuffer(nextUrl, redirects + 1).then(resolve, reject);
87
+ return;
88
+ }
89
+ if (statusCode < 200 || statusCode >= 300) {
90
+ response.resume();
91
+ reject(new Error(`HTTP ${statusCode}`));
92
+ return;
93
+ }
94
+ const chunks = [];
95
+ response.on("data", (chunk) => chunks.push(Buffer.from(chunk)));
96
+ response.on("end", () => resolve(Buffer.concat(chunks)));
97
+ });
98
+ request.on("error", reject);
99
+ });
100
+ }
101
+ export async function fetchJson(url) {
102
+ const buffer = await requestBuffer(url);
103
+ return JSON.parse(buffer.toString("utf8"));
104
+ }
105
+ export async function downloadFile(url, destination) {
106
+ const buffer = await requestBuffer(url);
107
+ fs.writeFileSync(destination, buffer);
108
+ }
109
+ //# sourceMappingURL=system.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"system.js","sourceRoot":"","sources":["../../src/system.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ export type RuntimeCliLockName = "claude" | "codex" | "opencode" | "gemini";
2
+ export type ToolLock = {
3
+ version: 1;
4
+ tools: {
5
+ rtk: {
6
+ source: "github-release";
7
+ repository: string;
8
+ tag: string;
9
+ assets: Record<string, {
10
+ sha256: string;
11
+ }>;
12
+ };
13
+ caveman: {
14
+ source: "github";
15
+ repository: string;
16
+ ref: string;
17
+ };
18
+ graphify: {
19
+ source: "pypi";
20
+ package: string;
21
+ version: string;
22
+ };
23
+ gsd: {
24
+ source: "npm";
25
+ package: string;
26
+ version: string;
27
+ };
28
+ frontendSkills: {
29
+ source: "skills-cli";
30
+ skillsCli: {
31
+ source: "npm";
32
+ package: string;
33
+ version: string;
34
+ };
35
+ impeccable: {
36
+ source: "github";
37
+ repository: string;
38
+ ref: string;
39
+ skill: string;
40
+ };
41
+ tasteSkill: {
42
+ source: "github";
43
+ repository: string;
44
+ ref: string;
45
+ skill: string;
46
+ };
47
+ };
48
+ };
49
+ runtimeClis: Record<RuntimeCliLockName, {
50
+ source: "npm";
51
+ package: string;
52
+ version: string;
53
+ }>;
54
+ };
55
+ export declare function formatNpmPackageSpec(packageName: string, version: string): string;
56
+ export declare function formatPythonPackageSpec(packageName: string, version: string): string;
57
+ export declare function formatGithubPackageSpec(repository: string, ref: string): string;
58
+ export declare function githubReleaseApiUrl(repository: string, tag: string): string;
59
+ export declare function isMutableExternalSource(spec: string): boolean;
60
+ export declare function loadToolLock(lockPath?: string): ToolLock;
@@ -0,0 +1,109 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { REPO_ROOT } from "./context.js";
4
+ const exactVersionPattern = /^[0-9]+(?:\.[0-9]+){1,3}(?:[-+][0-9A-Za-z.-]+)?$/;
5
+ const sha256Pattern = /^[a-f0-9]{64}$/i;
6
+ const fullGitShaPattern = /^[a-f0-9]{40}$/i;
7
+ export function formatNpmPackageSpec(packageName, version) {
8
+ return `${packageName}@${version}`;
9
+ }
10
+ export function formatPythonPackageSpec(packageName, version) {
11
+ return `${packageName}==${version}`;
12
+ }
13
+ export function formatGithubPackageSpec(repository, ref) {
14
+ return `github:${repository}#${ref}`;
15
+ }
16
+ export function githubReleaseApiUrl(repository, tag) {
17
+ return `https://api.github.com/repos/${repository}/releases/tags/${encodeURIComponent(tag)}`;
18
+ }
19
+ function npmVersionFromSpec(spec) {
20
+ if (spec.startsWith("@")) {
21
+ const slashIndex = spec.indexOf("/");
22
+ if (slashIndex === -1)
23
+ return null;
24
+ const versionIndex = spec.indexOf("@", slashIndex);
25
+ return versionIndex === -1 ? null : spec.slice(versionIndex + 1);
26
+ }
27
+ const versionIndex = spec.lastIndexOf("@");
28
+ return versionIndex <= 0 ? null : spec.slice(versionIndex + 1);
29
+ }
30
+ function isMutableVersion(version) {
31
+ if (!version)
32
+ return true;
33
+ if (["latest", "next", "canary", "beta", "alpha"].includes(version)) {
34
+ return true;
35
+ }
36
+ return !exactVersionPattern.test(version);
37
+ }
38
+ export function isMutableExternalSource(spec) {
39
+ if (spec.startsWith("github:")) {
40
+ const refIndex = spec.lastIndexOf("#");
41
+ if (refIndex === -1)
42
+ return true;
43
+ return !fullGitShaPattern.test(spec.slice(refIndex + 1));
44
+ }
45
+ if (spec.includes("==")) {
46
+ return isMutableVersion(spec.split("==").at(-1) ?? null);
47
+ }
48
+ return isMutableVersion(npmVersionFromSpec(spec));
49
+ }
50
+ function assertString(value, label) {
51
+ if (typeof value !== "string" || value.trim() === "") {
52
+ throw new Error(`Invalid tools.lock.json: ${label} must be a string.`);
53
+ }
54
+ }
55
+ function assertExactVersion(value, label) {
56
+ assertString(value, label);
57
+ if (isMutableVersion(value)) {
58
+ throw new Error(`Invalid tools.lock.json: ${label} must be an exact version.`);
59
+ }
60
+ }
61
+ function assertGitSha(value, label) {
62
+ assertString(value, label);
63
+ if (!fullGitShaPattern.test(value)) {
64
+ throw new Error(`Invalid tools.lock.json: ${label} must be a full commit SHA.`);
65
+ }
66
+ }
67
+ function assertSha256(value, label) {
68
+ assertString(value, label);
69
+ if (!sha256Pattern.test(value)) {
70
+ throw new Error(`Invalid tools.lock.json: ${label} must be a SHA-256 hash.`);
71
+ }
72
+ }
73
+ function validateToolLock(lock) {
74
+ if (lock.version !== 1) {
75
+ throw new Error("Invalid tools.lock.json: version must be 1.");
76
+ }
77
+ assertString(lock.tools.rtk.repository, "tools.rtk.repository");
78
+ assertString(lock.tools.rtk.tag, "tools.rtk.tag");
79
+ if (lock.tools.rtk.tag === "latest") {
80
+ throw new Error("Invalid tools.lock.json: tools.rtk.tag must not be latest.");
81
+ }
82
+ for (const [assetName, asset] of Object.entries(lock.tools.rtk.assets)) {
83
+ assertSha256(asset.sha256, `tools.rtk.assets.${assetName}.sha256`);
84
+ }
85
+ assertString(lock.tools.caveman.repository, "tools.caveman.repository");
86
+ assertGitSha(lock.tools.caveman.ref, "tools.caveman.ref");
87
+ assertString(lock.tools.graphify.package, "tools.graphify.package");
88
+ assertExactVersion(lock.tools.graphify.version, "tools.graphify.version");
89
+ assertString(lock.tools.gsd.package, "tools.gsd.package");
90
+ assertExactVersion(lock.tools.gsd.version, "tools.gsd.version");
91
+ assertString(lock.tools.frontendSkills.skillsCli.package, "tools.frontendSkills.skillsCli.package");
92
+ assertExactVersion(lock.tools.frontendSkills.skillsCli.version, "tools.frontendSkills.skillsCli.version");
93
+ for (const skillName of ["impeccable", "tasteSkill"]) {
94
+ assertString(lock.tools.frontendSkills[skillName].repository, `tools.frontendSkills.${skillName}.repository`);
95
+ assertGitSha(lock.tools.frontendSkills[skillName].ref, `tools.frontendSkills.${skillName}.ref`);
96
+ assertString(lock.tools.frontendSkills[skillName].skill, `tools.frontendSkills.${skillName}.skill`);
97
+ }
98
+ for (const runtime of ["claude", "codex", "opencode", "gemini"]) {
99
+ assertString(lock.runtimeClis[runtime].package, `runtimeClis.${runtime}.package`);
100
+ assertExactVersion(lock.runtimeClis[runtime].version, `runtimeClis.${runtime}.version`);
101
+ }
102
+ return lock;
103
+ }
104
+ export function loadToolLock(lockPath = process.env.TOOLS_LOCK_PATH ||
105
+ path.join(REPO_ROOT, "tools.lock.json")) {
106
+ const raw = fs.readFileSync(lockPath, "utf8");
107
+ return validateToolLock(JSON.parse(raw));
108
+ }
109
+ //# sourceMappingURL=tool-lock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-lock.js","sourceRoot":"","sources":["../../src/tool-lock.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function printHeader(): void;
2
+ export declare function printSelections(): void;
3
+ export declare function printSummary(): void;
package/dist/src/ui.js ADDED
@@ -0,0 +1,41 @@
1
+ import { color, step } from "./logger.js";
2
+ import { normalizedSkillScopes, runtimeMeta, runtimeNames, state, } from "./state.js";
3
+ export function printHeader() {
4
+ console.log("");
5
+ console.log(`${color.bold}Agent Toolkit${color.reset}`);
6
+ console.log("Personal toolkit installer for AI coding agents");
7
+ console.log("");
8
+ }
9
+ export function printSelections() {
10
+ console.log(` ${color.bold}Selected tools:${color.reset}`);
11
+ if (state.tools.rtk)
12
+ console.log(` ${color.green}+${color.reset} RTK`);
13
+ if (state.tools.caveman)
14
+ console.log(` ${color.green}+${color.reset} Caveman`);
15
+ if (state.tools.superpowers)
16
+ console.log(` ${color.green}+${color.reset} Superpowers`);
17
+ if (state.tools.graphify)
18
+ console.log(` ${color.green}+${color.reset} Graphify`);
19
+ if (state.tools.gsd)
20
+ console.log(` ${color.green}+${color.reset} GSD`);
21
+ if (state.tools.skills)
22
+ console.log(` ${color.green}+${color.reset} Custom Skills`);
23
+ console.log("");
24
+ console.log(` ${color.bold}Target runtimes:${color.reset}`);
25
+ for (const runtime of runtimeNames) {
26
+ if (state.runtimes[runtime])
27
+ console.log(` ${color.green}+${color.reset} ${runtimeMeta[runtime].display}`);
28
+ }
29
+ console.log("");
30
+ }
31
+ export function printSummary() {
32
+ step("Summary");
33
+ console.log(` Scope: ${state.gsdScope}`);
34
+ console.log(` Skills source: ${state.customSkillsDir}`);
35
+ const scopes = normalizedSkillScopes();
36
+ if (scopes.length > 0)
37
+ console.log(` Skills scope: ${scopes.join(", ")}`);
38
+ console.log("");
39
+ console.log(" Restart open agent sessions after installing plugins or skills.");
40
+ }
41
+ //# sourceMappingURL=ui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.js","sourceRoot":"","sources":["../../src/ui.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EACL,qBAAqB,EACrB,WAAW,EACX,YAAY,EACZ,KAAK,GACN,MAAM,YAAY,CAAC;AAEpB,MAAM,UAAU,WAAW;IACzB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,gBAAgB,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;IACxD,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;IAC/D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,kBAAkB,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;IAC5D,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG;QAAE,OAAO,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,MAAM,CAAC,CAAC;IACzE,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO;QACrB,OAAO,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,UAAU,CAAC,CAAC;IAC1D,IAAI,KAAK,CAAC,KAAK,CAAC,WAAW;QACzB,OAAO,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,cAAc,CAAC,CAAC;IAC9D,IAAI,KAAK,CAAC,KAAK,CAAC,QAAQ;QACtB,OAAO,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,WAAW,CAAC,CAAC;IAC3D,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG;QAAE,OAAO,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,MAAM,CAAC,CAAC;IACzE,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM;QACpB,OAAO,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,gBAAgB,CAAC,CAAC;IAChE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,mBAAmB,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;IAC7D,KAAK,MAAM,OAAO,IAAI,YAAY,EAAE,CAAC;QACnC,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC;YACzB,OAAO,CAAC,GAAG,CACT,MAAM,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,IAAI,WAAW,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,CACnE,CAAC;IACN,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,IAAI,CAAC,SAAS,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,aAAa,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC3C,OAAO,CAAC,GAAG,CAAC,qBAAqB,KAAK,CAAC,eAAe,EAAE,CAAC,CAAC;IAC1D,MAAM,MAAM,GAAG,qBAAqB,EAAE,CAAC;IACvC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC5E,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CACT,oEAAoE,CACrE,CAAC;AACJ,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function usage(): string;
@@ -0,0 +1,66 @@
1
+ export function usage() {
2
+ return `Agent Toolkit installer
3
+
4
+ Usage:
5
+ bash setup-agent-toolkit.sh [options]
6
+ npx -y @ranimontagna/agent-toolkit [options]
7
+
8
+ Tools:
9
+ --all Install every tool without the menu
10
+ --rtk-only Install only RTK
11
+ --caveman-only Install only Caveman
12
+ --superpowers-only Install only Superpowers
13
+ --graphify-only Install only Graphify
14
+ --gsd-only Install only GSD
15
+ --frontend-skills-only Install only third-party frontend skills
16
+ --skills-only Install only Custom Skills
17
+ --no-rtk Skip RTK
18
+ --no-caveman Skip Caveman
19
+ --no-superpowers Skip Superpowers
20
+ --no-graphify Skip Graphify
21
+ --no-gsd Skip GSD
22
+ --no-frontend-skills Skip third-party frontend skills
23
+ --no-skills Skip Custom Skills
24
+
25
+ Runtimes:
26
+ --all-runtimes Target Claude Code, Codex CLI, OpenCode and Gemini CLI
27
+ --claude Target only Claude Code
28
+ --codex Target only Codex CLI
29
+ --opencode Target only OpenCode
30
+ --gemini Target only Gemini CLI
31
+ --no-claude Skip Claude Code
32
+ --no-codex Skip Codex CLI
33
+ --no-opencode Skip OpenCode
34
+ --no-gemini Skip Gemini CLI
35
+
36
+ Install scope:
37
+ --global Install runtime assets into user config directories
38
+ --local Install runtime assets into the current project
39
+ --skills-dir DIR Use another source directory for Custom Skills
40
+ --skills-scope SCOPE Install skills under a relative scope path, repeatable
41
+ --skills-list List discovered Custom Skills and exit
42
+
43
+ Other:
44
+ --install-missing-clis Install selected runtime CLIs if missing
45
+ --allow-mutable-sources Allow explicit mutable package sources like @latest
46
+ --help, -h Show this help
47
+
48
+ Environment:
49
+ RTK_INSTALL_DIR RTK binary install directory
50
+ CAVEMAN_PACKAGE Caveman package source
51
+ CAVEMAN_MODE minimal or all
52
+ GRAPHIFY_PACKAGE Python package used to install Graphify
53
+ GRAPHIFY_INSTALLER uv or pipx
54
+ GSD_PACKAGE GSD package source
55
+ SKILLS_CLI_PACKAGE npm package used for third-party skill installs
56
+ GSD_SCOPE global or local
57
+ TOOLS_LOCK_PATH External tool provenance lock path
58
+ ALLOW_MUTABLE_SOURCES Set to 1 to allow mutable source overrides
59
+ CUSTOM_SKILLS_DIR Source directory for custom skills
60
+ SKILLS_SCOPE Comma-separated skill scope filters
61
+ CLAUDE_CLI_PACKAGE npm package used to install Claude Code CLI
62
+ CODEX_CLI_PACKAGE npm package used to install Codex CLI
63
+ OPENCODE_CLI_PACKAGE npm package used to install OpenCode CLI
64
+ GEMINI_CLI_PACKAGE npm package used to install Gemini CLI`;
65
+ }
66
+ //# sourceMappingURL=usage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage.js","sourceRoot":"","sources":["../../src/usage.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,KAAK;IACnB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+DA8DsD,CAAC;AAChE,CAAC"}
package/package.json ADDED
@@ -0,0 +1,50 @@
1
+ {
2
+ "name": "@ranimontagna/agent-toolkit",
3
+ "version": "0.1.1",
4
+ "description": "Personal AI agent toolkit installer for Claude Code, Codex CLI, OpenCode, Gemini CLI and graph-aware workflows.",
5
+ "type": "module",
6
+ "bin": {
7
+ "agent-toolkit": "dist/bin/agent-toolkit.js",
8
+ "setup-agent-toolkit": "dist/bin/agent-toolkit.js"
9
+ },
10
+ "files": [
11
+ "dist",
12
+ "skills",
13
+ "tools.lock.json",
14
+ "setup-agent-toolkit.sh",
15
+ "README.md"
16
+ ],
17
+ "publishConfig": {
18
+ "access": "public"
19
+ },
20
+ "scripts": {
21
+ "build": "tsc -p tsconfig.json",
22
+ "check": "npm run lint && npm run typecheck && npm run test:unit && npm run build && find dist/bin dist/src -name '*.js' -print0 | xargs -0 -n1 node --check && bash -n setup-agent-toolkit.sh && npm run test:integration",
23
+ "format": "biome format --write .",
24
+ "lint": "biome check .",
25
+ "lint:fix": "biome check --write .",
26
+ "prepare": "npm run build",
27
+ "security": "npm run security:audit && npm run security:signatures",
28
+ "security:audit": "npm audit --audit-level=moderate",
29
+ "security:signatures": "npm audit signatures",
30
+ "test": "npm run test:unit && npm run test:integration",
31
+ "test:integration": "npm run build && bash tests/test-agent-toolkit.sh",
32
+ "test:unit": "vitest run",
33
+ "typecheck": "tsc -p tsconfig.test.json --noEmit"
34
+ },
35
+ "repository": {
36
+ "type": "git",
37
+ "url": "git+https://github.com/raniellimontagna/agent-toolkit.git"
38
+ },
39
+ "bugs": {
40
+ "url": "https://github.com/raniellimontagna/agent-toolkit/issues"
41
+ },
42
+ "homepage": "https://github.com/raniellimontagna/agent-toolkit#readme",
43
+ "license": "MIT",
44
+ "devDependencies": {
45
+ "@biomejs/biome": "^2.4.16",
46
+ "@types/node": "^25.9.1",
47
+ "typescript": "^6.0.3",
48
+ "vitest": "^4.1.8"
49
+ }
50
+ }