@clawpow/cli 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.
@@ -0,0 +1,2 @@
1
+ import { Command } from "commander";
2
+ export declare const loginCommand: Command;
@@ -0,0 +1,128 @@
1
+ import { Command } from "commander";
2
+ import { createServer } from "node:http";
3
+ import { randomBytes } from "node:crypto";
4
+ import chalk from "chalk";
5
+ import ora from "ora";
6
+ import open from "open";
7
+ import { saveCredentials, getCredentials, isTokenExpired } from "../../lib/config.js";
8
+ import { handleError } from "../../lib/errors.js";
9
+ const APP_URL = process.env.CLAWPOW_APP_URL ?? "http://localhost:3000";
10
+ function generateToken() {
11
+ return "cpw_" + randomBytes(48).toString("base64url");
12
+ }
13
+ export const loginCommand = new Command("login")
14
+ .description("Authenticate with ClawPow")
15
+ .action(async () => {
16
+ try {
17
+ // Check if already logged in
18
+ const existing = getCredentials();
19
+ if (existing && !isTokenExpired(existing)) {
20
+ console.log(chalk.green("✓") + ` Already logged in as ${chalk.bold(existing.email)}`);
21
+ return;
22
+ }
23
+ const rawToken = generateToken();
24
+ const state = randomBytes(16).toString("hex");
25
+ // Start temporary localhost server to receive the callback
26
+ const { port, waitForCallback, close } = await startCallbackServer(state);
27
+ const authUrl = `${APP_URL}/cli/auth?port=${port}&state=${state}&token=${rawToken}`;
28
+ console.log("Opening browser for authentication...");
29
+ console.log(chalk.dim(`If the browser doesn't open, visit: ${authUrl}`));
30
+ await open(authUrl);
31
+ const spinner = ora("Waiting for authentication...").start();
32
+ try {
33
+ const result = await waitForCallback(rawToken);
34
+ spinner.stop();
35
+ // Save credentials
36
+ saveCredentials({
37
+ token: rawToken,
38
+ expiresAt: result.expiresAt,
39
+ email: result.email,
40
+ });
41
+ console.log(chalk.green("✓") + ` Logged in as ${chalk.bold(result.email)}`);
42
+ }
43
+ catch (error) {
44
+ spinner.stop();
45
+ throw error;
46
+ }
47
+ finally {
48
+ close();
49
+ }
50
+ }
51
+ catch (error) {
52
+ handleError(error);
53
+ }
54
+ });
55
+ function startCallbackServer(expectedState) {
56
+ return new Promise((resolve, reject) => {
57
+ let callbackResolve;
58
+ let callbackReject;
59
+ const callbackPromise = new Promise((res, rej) => {
60
+ callbackResolve = res;
61
+ callbackReject = rej;
62
+ });
63
+ const server = createServer(async (req, res) => {
64
+ const url = new URL(req.url, `http://localhost`);
65
+ if (url.pathname === "/callback") {
66
+ const email = url.searchParams.get("email");
67
+ const expiresAt = url.searchParams.get("expiresAt");
68
+ const state = url.searchParams.get("state");
69
+ const error = url.searchParams.get("error");
70
+ if (error) {
71
+ res.writeHead(200, { "Content-Type": "text/html" });
72
+ res.end("<html><body><h2>Authentication failed</h2><p>You can close this tab.</p></body></html>");
73
+ callbackReject(new Error(`Authentication failed: ${error}`));
74
+ return;
75
+ }
76
+ if (state !== expectedState) {
77
+ res.writeHead(400, { "Content-Type": "text/html" });
78
+ res.end("<html><body><h2>Invalid state</h2></body></html>");
79
+ return;
80
+ }
81
+ if (!email || !expiresAt) {
82
+ res.writeHead(400, { "Content-Type": "text/html" });
83
+ res.end("<html><body><h2>Missing parameters</h2></body></html>");
84
+ return;
85
+ }
86
+ res.writeHead(200, { "Content-Type": "text/html" });
87
+ res.end("<html><body><h2>Authenticated!</h2><p>You can close this tab and return to your terminal.</p></body></html>");
88
+ callbackResolve({
89
+ email,
90
+ expiresAt: parseInt(expiresAt, 10),
91
+ });
92
+ }
93
+ else {
94
+ res.writeHead(404);
95
+ res.end();
96
+ }
97
+ });
98
+ server.listen(0, "127.0.0.1", () => {
99
+ const addr = server.address();
100
+ if (!addr || typeof addr === "string") {
101
+ reject(new Error("Failed to start callback server"));
102
+ return;
103
+ }
104
+ resolve({
105
+ port: addr.port,
106
+ waitForCallback: async (rawToken) => {
107
+ // Set a 5-minute timeout
108
+ const timeout = setTimeout(() => {
109
+ callbackReject(new Error("Authentication timed out. Please try again."));
110
+ }, 5 * 60 * 1000);
111
+ try {
112
+ const result = await callbackPromise;
113
+ clearTimeout(timeout);
114
+ return result;
115
+ }
116
+ catch (error) {
117
+ clearTimeout(timeout);
118
+ throw error;
119
+ }
120
+ },
121
+ close: () => {
122
+ server.close();
123
+ },
124
+ });
125
+ });
126
+ });
127
+ }
128
+ //# sourceMappingURL=login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../../src/commands/auth/login.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from "commander";
2
+ export declare const logoutCommand: Command;
@@ -0,0 +1,15 @@
1
+ import { Command } from "commander";
2
+ import chalk from "chalk";
3
+ import { getCredentials, deleteCredentials } from "../../lib/config.js";
4
+ export const logoutCommand = new Command("logout")
5
+ .description("Log out and clear stored credentials")
6
+ .action(() => {
7
+ const creds = getCredentials();
8
+ if (!creds) {
9
+ console.log("Not logged in.");
10
+ return;
11
+ }
12
+ deleteCredentials();
13
+ console.log(chalk.green("✓") + " Logged out successfully.");
14
+ });
15
+ //# sourceMappingURL=logout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logout.js","sourceRoot":"","sources":["../../../src/commands/auth/logout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExE,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;KAC/C,WAAW,CAAC,sCAAsC,CAAC;KACnD,MAAM,CAAC,GAAG,EAAE;IACX,MAAM,KAAK,GAAG,cAAc,EAAE,CAAC;IAE/B,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAC9B,OAAO;IACT,CAAC;IAED,iBAAiB,EAAE,CAAC;IACpB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,2BAA2B,CAAC,CAAC;AAC9D,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { Command } from "commander";
2
+ export declare const statusCommand: Command;
@@ -0,0 +1,21 @@
1
+ import { Command } from "commander";
2
+ import chalk from "chalk";
3
+ import { getCredentials, isTokenExpired } from "../../lib/config.js";
4
+ export const statusCommand = new Command("status")
5
+ .description("Show current authentication status")
6
+ .action(() => {
7
+ const creds = getCredentials();
8
+ if (!creds) {
9
+ console.log(chalk.yellow("Not logged in.") + " Run `clawpow auth login` to authenticate.");
10
+ process.exit(1);
11
+ }
12
+ if (isTokenExpired(creds)) {
13
+ console.log(chalk.yellow("Session expired.") + " Run `clawpow auth login` to re-authenticate.");
14
+ process.exit(1);
15
+ }
16
+ const expiresDate = new Date(creds.expiresAt);
17
+ const daysLeft = Math.ceil((creds.expiresAt - Date.now()) / (24 * 60 * 60 * 1000));
18
+ console.log(chalk.green("✓") + ` Logged in as ${chalk.bold(creds.email)}`);
19
+ console.log(` Token expires: ${expiresDate.toLocaleDateString()} (${daysLeft} days)`);
20
+ });
21
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/commands/auth/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErE,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;KAC/C,WAAW,CAAC,oCAAoC,CAAC;KACjD,MAAM,CAAC,GAAG,EAAE;IACX,MAAM,KAAK,GAAG,cAAc,EAAE,CAAC;IAE/B,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,gBAAgB,CAAC,GAAG,4CAA4C,CAAC,CAAC;QAC3F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,kBAAkB,CAAC,GAAG,+CAA+C,CAAC,CAAC;QAChG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;IAEnF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,iBAAiB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC3E,OAAO,CAAC,GAAG,CAAC,oBAAoB,WAAW,CAAC,kBAAkB,EAAE,KAAK,QAAQ,QAAQ,CAAC,CAAC;AACzF,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { Command } from "commander";
2
+ export declare const setupCommand: Command;
@@ -0,0 +1,203 @@
1
+ import { Command } from "commander";
2
+ import chalk from "chalk";
3
+ import ora from "ora";
4
+ import open from "open";
5
+ import { select, checkbox } from "@inquirer/prompts";
6
+ import { getCredentials, isTokenExpired } from "../lib/config.js";
7
+ import { getAuthenticatedClient } from "../lib/client.js";
8
+ import { handleError } from "../lib/errors.js";
9
+ import { AGENTS, installSkillFile } from "../lib/skills.js";
10
+ import { loginCommand } from "./auth/login.js";
11
+ const APP_URL = process.env.CLAWPOW_APP_URL ?? "http://localhost:3000";
12
+ export const setupCommand = new Command("setup")
13
+ .description("Set up ClawPow for your AI agents")
14
+ .action(async () => {
15
+ try {
16
+ console.log("");
17
+ console.log(chalk.bold("Welcome to ClawPow!"));
18
+ console.log("");
19
+ // ── Step 1: Authentication ──────────────────────────
20
+ console.log(chalk.bold("Step 1: Authentication"));
21
+ console.log(chalk.dim("─".repeat(40)));
22
+ const creds = getCredentials();
23
+ if (creds && !isTokenExpired(creds)) {
24
+ console.log(chalk.green("✓") + ` Logged in as ${chalk.bold(creds.email)}`);
25
+ }
26
+ else {
27
+ // Run the login flow
28
+ await loginCommand.parseAsync([], { from: "user" });
29
+ // Verify login succeeded
30
+ const newCreds = getCredentials();
31
+ if (!newCreds || isTokenExpired(newCreds)) {
32
+ console.error("Login failed. Please try again.");
33
+ process.exit(1);
34
+ }
35
+ console.log(chalk.green("✓") + ` Logged in as ${chalk.bold(newCreds.email)}`);
36
+ }
37
+ console.log("");
38
+ // ── Step 2: Select superskills ──────────────────────
39
+ console.log(chalk.bold("Step 2: Select superskills"));
40
+ console.log(chalk.dim("─".repeat(40)));
41
+ const client = getAuthenticatedClient();
42
+ const listRes = await client.fetch("/superskills?cli=1");
43
+ if (!listRes.ok) {
44
+ throw new Error("Failed to fetch superskills");
45
+ }
46
+ const { superskills } = (await listRes.json());
47
+ const activeSuperskills = superskills.filter((s) => s.status === "active");
48
+ const comingSoonSuperskills = superskills.filter((s) => s.status !== "active");
49
+ if (activeSuperskills.length === 0) {
50
+ console.log("No superskills available yet.");
51
+ return;
52
+ }
53
+ const choices = [
54
+ ...activeSuperskills.map((s) => ({
55
+ name: `${s.name} — ${s.description}`,
56
+ value: s.id,
57
+ checked: s.enabled,
58
+ })),
59
+ ...comingSoonSuperskills.map((s) => ({
60
+ name: chalk.dim(`${s.name} (coming soon)`),
61
+ value: s.id,
62
+ disabled: "(coming soon)",
63
+ })),
64
+ ];
65
+ const selectedIds = await checkbox({
66
+ message: "Which superskills do you want to enable?",
67
+ choices,
68
+ });
69
+ if (selectedIds.length === 0) {
70
+ console.log("No superskills selected. You can run `clawpow setup` again later.");
71
+ return;
72
+ }
73
+ // Enable each selected superskill
74
+ for (const id of selectedIds) {
75
+ const ss = activeSuperskills.find((s) => s.id === id);
76
+ if (!ss?.enabled) {
77
+ const enableRes = await client.fetch(`/superskills/${id}/enable?cli=1`, {
78
+ method: "POST",
79
+ });
80
+ if (enableRes.ok) {
81
+ console.log(chalk.green("✓") + ` ${ss?.name ?? id} enabled`);
82
+ }
83
+ else {
84
+ const body = await enableRes.json();
85
+ console.log(chalk.yellow("!") + ` Could not enable ${id}: ${body.error}`);
86
+ }
87
+ }
88
+ else {
89
+ console.log(chalk.green("✓") + ` ${ss.name} already enabled`);
90
+ }
91
+ }
92
+ console.log("");
93
+ // ── Step 3: Per-superskill setup ────────────────────
94
+ for (const id of selectedIds) {
95
+ const ss = activeSuperskills.find((s) => s.id === id);
96
+ if (!ss)
97
+ continue;
98
+ console.log(chalk.bold(`Step 3: ${ss.name} setup`));
99
+ console.log(chalk.dim("─".repeat(40)));
100
+ const statusRes = await client.fetch(`/superskills/${id}/status?cli=1`);
101
+ if (!statusRes.ok) {
102
+ console.log(chalk.yellow("!") + ` Could not check status for ${ss.name}`);
103
+ continue;
104
+ }
105
+ const status = (await statusRes.json());
106
+ if (status.setupComplete) {
107
+ const accountList = status.connectedAccounts
108
+ .filter((a) => a.status === "active")
109
+ .map((a) => `${a.platform} (${a.platformAccountName})`)
110
+ .join(", ");
111
+ console.log(chalk.green("✓") + ` Already set up. Connected: ${accountList}`);
112
+ }
113
+ else {
114
+ const setupUrl = `${APP_URL}/studio/${id}/setup`;
115
+ console.log("You need to complete setup in your browser.");
116
+ console.log(chalk.dim(`→ Opening ${setupUrl}`));
117
+ await open(setupUrl);
118
+ const spinner = ora("Waiting for setup to complete...").start();
119
+ const pollResult = await pollForSetup(client, id, 5 * 60 * 1000);
120
+ spinner.stop();
121
+ if (pollResult) {
122
+ const accountList = pollResult.connectedAccounts
123
+ .filter((a) => a.status === "active")
124
+ .map((a) => `${a.platform} (${a.platformAccountName})`)
125
+ .join(", ");
126
+ console.log(chalk.green("✓") + ` Setup complete! Connected: ${accountList}`);
127
+ }
128
+ else {
129
+ console.log(chalk.yellow("!") + ` Setup timed out. Complete setup at: ${setupUrl}`);
130
+ console.log(chalk.dim(" You can re-run `clawpow setup` after completing setup."));
131
+ }
132
+ }
133
+ console.log("");
134
+ }
135
+ // ── Step 4: Install skill files ─────────────────────
136
+ console.log(chalk.bold("Step 4: Install skills for your agents"));
137
+ console.log(chalk.dim("─".repeat(40)));
138
+ const agentChoices = AGENTS.map((a) => ({
139
+ name: a.label,
140
+ value: a.id,
141
+ }));
142
+ const selectedAgents = await checkbox({
143
+ message: "Which agents do you use?",
144
+ choices: agentChoices,
145
+ });
146
+ if (selectedAgents.length === 0) {
147
+ console.log("No agents selected. You can run `clawpow setup` again later.");
148
+ return;
149
+ }
150
+ const scope = await select({
151
+ message: "Install skills globally or for this project only?",
152
+ choices: [
153
+ {
154
+ name: "Global (all projects)",
155
+ value: "global",
156
+ },
157
+ {
158
+ name: "This project only",
159
+ value: "project",
160
+ },
161
+ ],
162
+ });
163
+ // Fetch and install skill files
164
+ for (const superskillId of selectedIds) {
165
+ const skillRes = await client.fetch(`/superskills/${superskillId}/skill-file`);
166
+ if (!skillRes.ok) {
167
+ const body = await skillRes.json();
168
+ console.log(chalk.yellow("!") + ` Could not fetch skill file for ${superskillId}: ${body.error}`);
169
+ continue;
170
+ }
171
+ const { content } = (await skillRes.json());
172
+ for (const agentId of selectedAgents) {
173
+ const filePath = installSkillFile(agentId, superskillId, content, scope);
174
+ console.log(chalk.green("✓") + ` Installed ${chalk.dim(filePath)}`);
175
+ }
176
+ }
177
+ console.log("");
178
+ console.log(chalk.bold("Done!") + " Your agents can now use ClawPow superskills.");
179
+ }
180
+ catch (error) {
181
+ handleError(error);
182
+ }
183
+ });
184
+ async function pollForSetup(client, superskillId, timeoutMs) {
185
+ const deadline = Date.now() + timeoutMs;
186
+ while (Date.now() < deadline) {
187
+ await new Promise((resolve) => setTimeout(resolve, 3000));
188
+ try {
189
+ const res = await client.fetch(`/superskills/${superskillId}/status?cli=1`);
190
+ if (res.ok) {
191
+ const status = (await res.json());
192
+ if (status.setupComplete) {
193
+ return status;
194
+ }
195
+ }
196
+ }
197
+ catch {
198
+ // continue polling
199
+ }
200
+ }
201
+ return null;
202
+ }
203
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/index.js ADDED
@@ -0,0 +1,24 @@
1
+ #!/usr/bin/env node
2
+ import { readFileSync } from "node:fs";
3
+ import { fileURLToPath } from "node:url";
4
+ import { dirname, join } from "node:path";
5
+ import { Command } from "commander";
6
+ import { loginCommand } from "./commands/auth/login.js";
7
+ import { statusCommand } from "./commands/auth/status.js";
8
+ import { logoutCommand } from "./commands/auth/logout.js";
9
+ import { setupCommand } from "./commands/setup.js";
10
+ const __dirname = dirname(fileURLToPath(import.meta.url));
11
+ const pkg = JSON.parse(readFileSync(join(__dirname, "..", "package.json"), "utf-8"));
12
+ const program = new Command();
13
+ program
14
+ .name("clawpow")
15
+ .description("ClawPow CLI — Superpowers for your AI agents")
16
+ .version(pkg.version);
17
+ const auth = new Command("auth").description("Manage authentication");
18
+ auth.addCommand(loginCommand);
19
+ auth.addCommand(statusCommand);
20
+ auth.addCommand(logoutCommand);
21
+ program.addCommand(auth);
22
+ program.addCommand(setupCommand);
23
+ program.parse();
24
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;AAErF,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,SAAS,CAAC;KACf,WAAW,CAAC,8CAA8C,CAAC;KAC3D,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAExB,MAAM,IAAI,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,uBAAuB,CAAC,CAAC;AACtE,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AAC9B,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAC/B,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAE/B,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;AACzB,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AAEjC,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -0,0 +1,5 @@
1
+ export type ApiFetch = (path: string, options?: RequestInit) => Promise<Response>;
2
+ export declare function getAuthenticatedClient(): {
3
+ fetch: ApiFetch;
4
+ apiUrl: string;
5
+ };
@@ -0,0 +1,25 @@
1
+ import { getCredentials, getConfig, isTokenExpired } from "./config.js";
2
+ import { ClawpowError } from "./errors.js";
3
+ export function getAuthenticatedClient() {
4
+ const creds = getCredentials();
5
+ if (!creds) {
6
+ throw new ClawpowError("Not logged in. Run `clawpow auth login` first.", "AUTH_REQUIRED");
7
+ }
8
+ if (isTokenExpired(creds)) {
9
+ throw new ClawpowError("Your session has expired. Run `clawpow auth login` to re-authenticate.", "TOKEN_EXPIRED");
10
+ }
11
+ const config = getConfig();
12
+ async function apiFetch(path, options = {}) {
13
+ const url = `${config.apiUrl}${path}`;
14
+ const headers = new Headers(options.headers);
15
+ headers.set("Authorization", `Bearer ${creds.token}`);
16
+ headers.set("Content-Type", "application/json");
17
+ const response = await fetch(url, { ...options, headers });
18
+ if (response.status === 401) {
19
+ throw new ClawpowError("Authentication failed. Run `clawpow auth login` to re-authenticate.", "AUTH_FAILED");
20
+ }
21
+ return response;
22
+ }
23
+ return { fetch: apiFetch, apiUrl: config.apiUrl };
24
+ }
25
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/lib/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACxE,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAI3C,MAAM,UAAU,sBAAsB;IACpC,MAAM,KAAK,GAAG,cAAc,EAAE,CAAC;IAC/B,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,YAAY,CACpB,gDAAgD,EAChD,eAAe,CAChB,CAAC;IACJ,CAAC;IAED,IAAI,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,YAAY,CACpB,wEAAwE,EACxE,eAAe,CAChB,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAE3B,KAAK,UAAU,QAAQ,CAAC,IAAY,EAAE,UAAuB,EAAE;QAC7D,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC,MAAM,GAAG,IAAI,EAAE,CAAC;QACtC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,UAAU,KAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QACvD,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;QAEhD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QAE3D,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC5B,MAAM,IAAI,YAAY,CACpB,qEAAqE,EACrE,aAAa,CACd,CAAC;QACJ,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;AACpD,CAAC"}
@@ -0,0 +1,14 @@
1
+ export interface Credentials {
2
+ token: string;
3
+ expiresAt: number;
4
+ email: string;
5
+ }
6
+ export interface Config {
7
+ apiUrl: string;
8
+ }
9
+ export declare function getCredentials(): Credentials | null;
10
+ export declare function saveCredentials(creds: Credentials): void;
11
+ export declare function deleteCredentials(): void;
12
+ export declare function isTokenExpired(creds: Credentials): boolean;
13
+ export declare function getConfig(): Config;
14
+ export declare function saveConfig(config: Config): void;
@@ -0,0 +1,58 @@
1
+ import { existsSync, mkdirSync, readFileSync, writeFileSync, unlinkSync, chmodSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { homedir } from "node:os";
4
+ const CONFIG_DIR = join(homedir(), ".clawpow");
5
+ const CREDENTIALS_PATH = join(CONFIG_DIR, "credentials.json");
6
+ const CONFIG_PATH = join(CONFIG_DIR, "config.json");
7
+ // Default Convex site URL — update for production
8
+ const DEFAULT_API_URL = "https://intent-chipmunk-988.convex.site";
9
+ function ensureConfigDir() {
10
+ if (!existsSync(CONFIG_DIR)) {
11
+ mkdirSync(CONFIG_DIR, { recursive: true });
12
+ }
13
+ }
14
+ export function getCredentials() {
15
+ if (!existsSync(CREDENTIALS_PATH))
16
+ return null;
17
+ try {
18
+ const raw = readFileSync(CREDENTIALS_PATH, "utf-8");
19
+ const parsed = JSON.parse(raw);
20
+ if (!parsed.token || !parsed.expiresAt || !parsed.email)
21
+ return null;
22
+ return parsed;
23
+ }
24
+ catch {
25
+ return null;
26
+ }
27
+ }
28
+ export function saveCredentials(creds) {
29
+ ensureConfigDir();
30
+ writeFileSync(CREDENTIALS_PATH, JSON.stringify(creds, null, 2), "utf-8");
31
+ chmodSync(CREDENTIALS_PATH, 0o600);
32
+ }
33
+ export function deleteCredentials() {
34
+ if (existsSync(CREDENTIALS_PATH)) {
35
+ unlinkSync(CREDENTIALS_PATH);
36
+ }
37
+ }
38
+ export function isTokenExpired(creds) {
39
+ return creds.expiresAt < Date.now();
40
+ }
41
+ export function getConfig() {
42
+ if (existsSync(CONFIG_PATH)) {
43
+ try {
44
+ const raw = readFileSync(CONFIG_PATH, "utf-8");
45
+ const parsed = JSON.parse(raw);
46
+ return { apiUrl: parsed.apiUrl ?? DEFAULT_API_URL };
47
+ }
48
+ catch {
49
+ // fall through
50
+ }
51
+ }
52
+ return { apiUrl: DEFAULT_API_URL };
53
+ }
54
+ export function saveConfig(config) {
55
+ ensureConfigDir();
56
+ writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2), "utf-8");
57
+ }
58
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpG,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,CAAC;AAC/C,MAAM,gBAAgB,GAAG,IAAI,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAC;AAC9D,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAEpD,kDAAkD;AAClD,MAAM,eAAe,GAAG,yCAAyC,CAAC;AAYlE,SAAS,eAAe;IACtB,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,CAAC;AACH,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;QACpD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAgB,CAAC;QAC9C,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,CAAC,MAAM,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QACrE,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAkB;IAChD,eAAe,EAAE,CAAC;IAClB,aAAa,CAAC,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACzE,SAAS,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,IAAI,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACjC,UAAU,CAAC,gBAAgB,CAAC,CAAC;IAC/B,CAAC;AACH,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAkB;IAC/C,OAAO,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;YAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAoB,CAAC;YAClD,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,eAAe,EAAE,CAAC;QACtD,CAAC;QAAC,MAAM,CAAC;YACP,eAAe;QACjB,CAAC;IACH,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAAc;IACvC,eAAe,EAAE,CAAC;IAClB,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AACvE,CAAC"}
@@ -0,0 +1,6 @@
1
+ export declare class ClawpowError extends Error {
2
+ readonly code: string;
3
+ readonly exitCode: number;
4
+ constructor(message: string, code: string, exitCode?: number);
5
+ }
6
+ export declare function handleError(error: unknown): never;
@@ -0,0 +1,23 @@
1
+ export class ClawpowError extends Error {
2
+ code;
3
+ exitCode;
4
+ constructor(message, code, exitCode = 1) {
5
+ super(message);
6
+ this.code = code;
7
+ this.exitCode = exitCode;
8
+ this.name = "ClawpowError";
9
+ }
10
+ }
11
+ export function handleError(error) {
12
+ if (error instanceof ClawpowError) {
13
+ console.error(`Error: ${error.message}`);
14
+ process.exit(error.exitCode);
15
+ }
16
+ if (error instanceof Error) {
17
+ console.error(`Error: ${error.message}`);
18
+ process.exit(1);
19
+ }
20
+ console.error("An unexpected error occurred");
21
+ process.exit(1);
22
+ }
23
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/lib/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,YAAa,SAAQ,KAAK;IAGnB;IACA;IAHlB,YACE,OAAe,EACC,IAAY,EACZ,WAAmB,CAAC;QAEpC,KAAK,CAAC,OAAO,CAAC,CAAC;QAHC,SAAI,GAAJ,IAAI,CAAQ;QACZ,aAAQ,GAAR,QAAQ,CAAY;QAGpC,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC7B,CAAC;CACF;AAED,MAAM,UAAU,WAAW,CAAC,KAAc;IACxC,IAAI,KAAK,YAAY,YAAY,EAAE,CAAC;QAClC,OAAO,CAAC,KAAK,CAAC,UAAU,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACzC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC/B,CAAC;IAED,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,OAAO,CAAC,KAAK,CAAC,UAAU,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACzC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAC9C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
@@ -0,0 +1,9 @@
1
+ interface AgentConfig {
2
+ label: string;
3
+ id: string;
4
+ projectDir: string;
5
+ globalDir: string;
6
+ }
7
+ export declare const AGENTS: Array<AgentConfig>;
8
+ export declare function installSkillFile(agentId: string, superskillId: string, content: string, scope: "global" | "project"): string;
9
+ export {};
@@ -0,0 +1,47 @@
1
+ import { mkdirSync, writeFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { homedir } from "node:os";
4
+ export const AGENTS = [
5
+ {
6
+ label: "Claude Code",
7
+ id: "claude-code",
8
+ projectDir: ".claude/skills",
9
+ globalDir: join(homedir(), ".claude", "skills"),
10
+ },
11
+ {
12
+ label: "Codex",
13
+ id: "codex",
14
+ projectDir: ".agents/skills",
15
+ globalDir: join(homedir(), ".agents", "skills"),
16
+ },
17
+ {
18
+ label: "Cursor",
19
+ id: "cursor",
20
+ projectDir: ".cursor/skills",
21
+ globalDir: join(homedir(), ".cursor", "skills"),
22
+ },
23
+ {
24
+ label: "OpenClaw",
25
+ id: "openclaw",
26
+ projectDir: "skills",
27
+ globalDir: join(homedir(), ".openclaw", "skills"),
28
+ },
29
+ {
30
+ label: "GitHub Copilot",
31
+ id: "github-copilot",
32
+ projectDir: ".github/skills",
33
+ globalDir: join(homedir(), ".github", "skills"),
34
+ },
35
+ ];
36
+ export function installSkillFile(agentId, superskillId, content, scope) {
37
+ const agent = AGENTS.find((a) => a.id === agentId);
38
+ if (!agent)
39
+ throw new Error(`Unknown agent: ${agentId}`);
40
+ const baseDir = scope === "global" ? agent.globalDir : join(process.cwd(), agent.projectDir);
41
+ const skillDir = join(baseDir, `clawpow-${superskillId}`);
42
+ mkdirSync(skillDir, { recursive: true });
43
+ const filePath = join(skillDir, "SKILL.md");
44
+ writeFileSync(filePath, content, "utf-8");
45
+ return filePath;
46
+ }
47
+ //# sourceMappingURL=skills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/lib/skills.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AASlC,MAAM,CAAC,MAAM,MAAM,GAAuB;IACxC;QACE,KAAK,EAAE,aAAa;QACpB,EAAE,EAAE,aAAa;QACjB,UAAU,EAAE,gBAAgB;QAC5B,SAAS,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC;KAChD;IACD;QACE,KAAK,EAAE,OAAO;QACd,EAAE,EAAE,OAAO;QACX,UAAU,EAAE,gBAAgB;QAC5B,SAAS,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC;KAChD;IACD;QACE,KAAK,EAAE,QAAQ;QACf,EAAE,EAAE,QAAQ;QACZ,UAAU,EAAE,gBAAgB;QAC5B,SAAS,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC;KAChD;IACD;QACE,KAAK,EAAE,UAAU;QACjB,EAAE,EAAE,UAAU;QACd,UAAU,EAAE,QAAQ;QACpB,SAAS,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,QAAQ,CAAC;KAClD;IACD;QACE,KAAK,EAAE,gBAAgB;QACvB,EAAE,EAAE,gBAAgB;QACpB,UAAU,EAAE,gBAAgB;QAC5B,SAAS,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC;KAChD;CACF,CAAC;AAEF,MAAM,UAAU,gBAAgB,CAC9B,OAAe,EACf,YAAoB,EACpB,OAAe,EACf,KAA2B;IAE3B,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC;IACnD,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,OAAO,EAAE,CAAC,CAAC;IAEzD,MAAM,OAAO,GAAG,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IAC7F,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,WAAW,YAAY,EAAE,CAAC,CAAC;IAE1D,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEzC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IAC5C,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAE1C,OAAO,QAAQ,CAAC;AAClB,CAAC"}
package/package.json ADDED
@@ -0,0 +1,48 @@
1
+ {
2
+ "name": "@clawpow/cli",
3
+ "version": "0.1.0",
4
+ "description": "ClawPow CLI — Superpowers for your AI agents",
5
+ "type": "module",
6
+ "bin": {
7
+ "clawpow": "./dist/index.js"
8
+ },
9
+ "files": [
10
+ "dist"
11
+ ],
12
+ "engines": {
13
+ "node": ">=18"
14
+ },
15
+ "scripts": {
16
+ "build": "tsc",
17
+ "dev": "tsc --watch",
18
+ "start": "node dist/index.js",
19
+ "prepublishOnly": "npm run build"
20
+ },
21
+ "keywords": [
22
+ "cli",
23
+ "ai",
24
+ "agents",
25
+ "openclaw",
26
+ "superskills"
27
+ ],
28
+ "license": "MIT",
29
+ "repository": {
30
+ "type": "git",
31
+ "url": "git+https://github.com/SeriousPeople/clawpow.git",
32
+ "directory": "apps/clawpow-cli"
33
+ },
34
+ "publishConfig": {
35
+ "access": "public"
36
+ },
37
+ "dependencies": {
38
+ "chalk": "^5.4.0",
39
+ "commander": "^14.0.0",
40
+ "@inquirer/prompts": "^7.0.0",
41
+ "open": "^10.0.0",
42
+ "ora": "^8.0.0"
43
+ },
44
+ "devDependencies": {
45
+ "@types/node": "^22.0.0",
46
+ "typescript": "^5.0.0"
47
+ }
48
+ }