agentpilot 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 (47) hide show
  1. package/README.md +121 -0
  2. package/dist/commands/init.d.ts +10 -0
  3. package/dist/commands/init.js +262 -0
  4. package/dist/commands/init.js.map +1 -0
  5. package/dist/commands/login.d.ts +4 -0
  6. package/dist/commands/login.js +34 -0
  7. package/dist/commands/login.js.map +1 -0
  8. package/dist/commands/status.d.ts +4 -0
  9. package/dist/commands/status.js +72 -0
  10. package/dist/commands/status.js.map +1 -0
  11. package/dist/index.d.ts +2 -0
  12. package/dist/index.js +115 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/lib/api.d.ts +22 -0
  15. package/dist/lib/api.js +50 -0
  16. package/dist/lib/api.js.map +1 -0
  17. package/dist/lib/config.d.ts +4 -0
  18. package/dist/lib/config.js +28 -0
  19. package/dist/lib/config.js.map +1 -0
  20. package/dist/lib/detect.d.ts +9 -0
  21. package/dist/lib/detect.js +25 -0
  22. package/dist/lib/detect.js.map +1 -0
  23. package/dist/lib/fs-utils.d.ts +23 -0
  24. package/dist/lib/fs-utils.js +120 -0
  25. package/dist/lib/fs-utils.js.map +1 -0
  26. package/dist/lib/merge-claude.d.ts +17 -0
  27. package/dist/lib/merge-claude.js +143 -0
  28. package/dist/lib/merge-claude.js.map +1 -0
  29. package/dist/lib/merge-cursor.d.ts +5 -0
  30. package/dist/lib/merge-cursor.js +89 -0
  31. package/dist/lib/merge-cursor.js.map +1 -0
  32. package/dist/lib/merge-windsurf.d.ts +5 -0
  33. package/dist/lib/merge-windsurf.js +85 -0
  34. package/dist/lib/merge-windsurf.js.map +1 -0
  35. package/dist/lib/prompts.d.ts +19 -0
  36. package/dist/lib/prompts.js +62 -0
  37. package/dist/lib/prompts.js.map +1 -0
  38. package/dist/lib/templates.d.ts +5 -0
  39. package/dist/lib/templates.js +157 -0
  40. package/dist/lib/templates.js.map +1 -0
  41. package/dist/lib/verify.d.ts +5 -0
  42. package/dist/lib/verify.js +37 -0
  43. package/dist/lib/verify.js.map +1 -0
  44. package/dist/types.d.ts +33 -0
  45. package/dist/types.js +11 -0
  46. package/dist/types.js.map +1 -0
  47. package/package.json +42 -0
package/README.md ADDED
@@ -0,0 +1,121 @@
1
+ # agentpilot
2
+
3
+ CLI for [AgentPilot](https://app.agentpilot.dev) — one-click IDE hook setup for AI agent monitoring.
4
+
5
+ ## Quick Start
6
+
7
+ ```bash
8
+ npx agentpilot init
9
+ ```
10
+
11
+ This will:
12
+ 1. Authenticate with your API key
13
+ 2. Auto-detect your IDE (Claude Code, Cursor, or Windsurf)
14
+ 3. Create an agent on your dashboard
15
+ 4. Install hook scripts with safe settings merge
16
+ 5. Verify the connection
17
+
18
+ ## Commands
19
+
20
+ ### `init`
21
+
22
+ Interactive setup wizard. Auto-detects IDE, creates agent, installs hooks.
23
+
24
+ ```bash
25
+ npx agentpilot init # interactive
26
+ npx agentpilot init --key ap_xxx --type claude-code --name "X" # non-interactive
27
+ npx agentpilot init --key ap_xxx --type cursor --yes # skip confirmations
28
+ ```
29
+
30
+ ### `status`
31
+
32
+ List your agents and their current status.
33
+
34
+ ```bash
35
+ npx agentpilot status
36
+ ```
37
+
38
+ ### `login`
39
+
40
+ Store your API key for future use.
41
+
42
+ ```bash
43
+ npx agentpilot login --key ap_xxx
44
+ ```
45
+
46
+ ## Flags
47
+
48
+ | Flag | Description |
49
+ |------|-------------|
50
+ | `--key ap_xxx` | API key (or set via stored config) |
51
+ | `--type <type>` | IDE type: `claude-code`, `cursor`, `windsurf` |
52
+ | `--name <name>` | Agent name (defaults to directory name) |
53
+ | `--yes` | Skip confirmation prompts |
54
+ | `--base-url <url>` | Custom API base URL |
55
+ | `--version` | Show version |
56
+ | `--help` | Show help |
57
+
58
+ ## Environment Variables
59
+
60
+ | Variable | Description |
61
+ |----------|-------------|
62
+ | `AGENTPILOT_BASE_URL` | Override API base URL (for self-hosted/staging) |
63
+
64
+ ## Credentials
65
+
66
+ API keys are stored in `~/.agentpilot/config.json` with mode `0600` on Unix.
67
+ On Windows, the file is protected by the user's home directory ACLs.
68
+
69
+ Get your API key at [app.agentpilot.dev/settings/integrations](https://app.agentpilot.dev/settings/integrations).
70
+
71
+ ## Settings Merge
72
+
73
+ The CLI safely merges hooks into your IDE config:
74
+ - Creates a timestamped backup before any change
75
+ - Only touches the `hooks` section, preserving all other settings
76
+ - Idempotent: running twice is a no-op
77
+ - Shows a diff before applying (skip with `--yes`)
78
+
79
+ ## Backup Files
80
+
81
+ Backup files (`*.bak.<timestamp>`) are kept in the same directory. Only the 3
82
+ most recent backups per file are retained. Add `*.bak.*` to your `.gitignore`.
83
+
84
+ ## Development
85
+
86
+ ### Building
87
+
88
+ ```bash
89
+ cd packages/cli
90
+ npm run build # compile TypeScript → dist/
91
+ ```
92
+
93
+ ### Testing
94
+
95
+ ```bash
96
+ npm test # run tests once (vitest)
97
+ npm run test:watch # watch mode
98
+ ```
99
+
100
+ ### Publishing to npm
101
+
102
+ The package name is `agentpilot` (unscoped). Before publishing for the first time:
103
+
104
+ 1. Log in to npm: `npm login` (or `npm whoami` to verify)
105
+ 2. Preview the package: `npm pack --dry-run`
106
+ 3. Publish: `npm publish` from `packages/cli/`
107
+
108
+ The `prepublishOnly` script automatically runs build + tests before every publish.
109
+
110
+ After publishing, verify: `npx agentpilot --version`
111
+
112
+ > **Note:** If the unscoped name `agentpilot` is unavailable on npm, switch to a
113
+ > scoped name (e.g. `@agentpilot/cli`) in `package.json` and publish with
114
+ > `npm publish --access public`. Update all `npx agentpilot` references in the
115
+ > codebase accordingly.
116
+
117
+ ## Requirements
118
+
119
+ - Node.js 18+
120
+ - `bash` (Git Bash on Windows, native on macOS/Linux)
121
+ - `curl` (included in Git Bash, native on macOS/Linux)
@@ -0,0 +1,10 @@
1
+ interface InitFlags {
2
+ key?: string;
3
+ type?: string;
4
+ name?: string;
5
+ yes?: boolean;
6
+ baseUrl?: string;
7
+ appUrl?: string;
8
+ }
9
+ export declare function initCommand(flags: InitFlags): Promise<void>;
10
+ export {};
@@ -0,0 +1,262 @@
1
+ import path from "path";
2
+ import fs from "fs";
3
+ import { spawnSync } from "child_process";
4
+ import { readConfig, writeConfig } from "../lib/config.js";
5
+ import { listAgents, createAgent, ApiError } from "../lib/api.js";
6
+ import { detectIdes, isVscodeCopilotProject, getIdeLabel } from "../lib/detect.js";
7
+ import { getTemplateBuilder } from "../lib/templates.js";
8
+ import { mergeClaude, previewClaude } from "../lib/merge-claude.js";
9
+ import { mergeCursor } from "../lib/merge-cursor.js";
10
+ import { mergeWindsurf } from "../lib/merge-windsurf.js";
11
+ import { simpleDiff } from "../lib/fs-utils.js";
12
+ import { verifyConnection } from "../lib/verify.js";
13
+ import * as prompt from "../lib/prompts.js";
14
+ function checkBash() {
15
+ // Try bare `bash` first — works on macOS/Linux and Windows when Git Bash is in PATH
16
+ const bare = spawnSync("bash", ["--version"], { stdio: "pipe" });
17
+ if (!bare.error && bare.status === 0)
18
+ return "bash";
19
+ // On Windows, probe well-known Git Bash and WSL locations
20
+ if (process.platform === "win32") {
21
+ const programFiles = process.env["PROGRAMFILES"] ?? "C:\\Program Files";
22
+ const programFilesX86 = process.env["PROGRAMFILES(X86)"] ?? "C:\\Program Files (x86)";
23
+ const localAppData = process.env["LOCALAPPDATA"] ?? "";
24
+ const systemRoot = process.env["SYSTEMROOT"] ?? "C:\\Windows";
25
+ const candidates = [
26
+ path.join(programFiles, "Git", "bin", "bash.exe"),
27
+ path.join(programFiles, "Git", "usr", "bin", "bash.exe"),
28
+ path.join(programFilesX86, "Git", "bin", "bash.exe"),
29
+ ...(localAppData ? [path.join(localAppData, "Programs", "Git", "bin", "bash.exe")] : []),
30
+ path.join(systemRoot, "System32", "bash.exe"), // WSL
31
+ ];
32
+ for (const candidate of candidates) {
33
+ if (fs.existsSync(candidate)) {
34
+ const check = spawnSync(candidate, ["--version"], { stdio: "pipe" });
35
+ if (!check.error && check.status === 0)
36
+ return candidate;
37
+ }
38
+ }
39
+ console.error("Error: bash is required but not found.\n\n" +
40
+ "On Windows you can fix this by:\n" +
41
+ " 1. Installing Git for Windows (includes Git Bash):\n" +
42
+ " https://git-scm.com/download/win\n" +
43
+ " 2. Or enabling WSL:\n" +
44
+ " wsl --install\n\n" +
45
+ "See https://app.agentpilot.dev/developers?tab=cli for troubleshooting.");
46
+ process.exit(1);
47
+ }
48
+ // macOS / Linux — bash should exist but doesn't
49
+ console.error("Error: bash is required but not found.\n" +
50
+ "Install bash via your package manager (e.g. apt install bash, brew install bash).\n\n" +
51
+ "See https://app.agentpilot.dev/developers?tab=cli for troubleshooting.");
52
+ process.exit(1);
53
+ }
54
+ function defaultAgentName() {
55
+ const base = path.basename(process.cwd());
56
+ const cleaned = base.trim();
57
+ if (!cleaned || cleaned === "." || cleaned === "/" || cleaned === "\\") {
58
+ return "my-agent";
59
+ }
60
+ return cleaned.slice(0, 64);
61
+ }
62
+ export async function initCommand(flags) {
63
+ const bashPath = checkBash();
64
+ void bashPath; // resolved bash path available for future use
65
+ const cwd = process.cwd();
66
+ const baseUrl = flags.baseUrl;
67
+ // ── Step 0: Resolve credentials ──────────────────────────────────────
68
+ let apiKey = flags.key;
69
+ if (!apiKey) {
70
+ const config = await readConfig();
71
+ apiKey = config?.apiKey;
72
+ }
73
+ if (!apiKey) {
74
+ apiKey = await prompt.password("Paste your API key (get one at app.agentpilot.dev/settings/integrations):");
75
+ }
76
+ if (!apiKey?.startsWith("ap_")) {
77
+ console.error("Error: API key must start with 'ap_'");
78
+ process.exit(1);
79
+ }
80
+ // Validate key
81
+ console.log("Validating API key...");
82
+ try {
83
+ await listAgents(apiKey, baseUrl);
84
+ }
85
+ catch (err) {
86
+ if (err instanceof ApiError && err.status === 401) {
87
+ console.error("Error: Invalid API key.");
88
+ process.exit(1);
89
+ }
90
+ // Network error — retry once
91
+ console.log("Connection failed, retrying...");
92
+ try {
93
+ await listAgents(apiKey, baseUrl);
94
+ }
95
+ catch {
96
+ console.error("Error: Could not reach API. Check your connection.");
97
+ process.exit(1);
98
+ }
99
+ }
100
+ // Save key
101
+ await writeConfig({ apiKey, baseUrl });
102
+ // ── Step 1: Detect IDE ───────────────────────────────────────────────
103
+ let ideType;
104
+ if (flags.type) {
105
+ const validTypes = ["claude-code", "cursor", "windsurf"];
106
+ if (flags.type === "vscode-copilot") {
107
+ console.error("VS Code Copilot setup is not yet supported in the CLI.\n" +
108
+ "Use https://app.agentpilot.dev/agents/new instead.");
109
+ process.exit(1);
110
+ }
111
+ if (!validTypes.includes(flags.type)) {
112
+ console.error(`Invalid type: ${flags.type}\nValid types: ${validTypes.join(", ")}`);
113
+ process.exit(1);
114
+ }
115
+ ideType = flags.type;
116
+ }
117
+ else {
118
+ // Check VS Code Copilot first (unsupported)
119
+ if (isVscodeCopilotProject(cwd)) {
120
+ console.log("Detected VS Code Copilot project (.agent.md found).\n" +
121
+ "VS Code Copilot setup is not yet supported in the CLI.\n" +
122
+ "Use https://app.agentpilot.dev/agents/new instead.");
123
+ }
124
+ const detected = detectIdes(cwd);
125
+ if (detected.length === 0) {
126
+ ideType = await prompt.select("Select your IDE:", [
127
+ { title: "Claude Code", value: "claude-code" },
128
+ { title: "Cursor", value: "cursor" },
129
+ { title: "Windsurf", value: "windsurf" },
130
+ ]);
131
+ }
132
+ else if (detected.length === 1) {
133
+ const ok = flags.yes || await prompt.confirm(`Detected ${detected[0].label}. Continue?`);
134
+ if (!ok)
135
+ process.exit(0);
136
+ ideType = detected[0].type;
137
+ }
138
+ else {
139
+ ideType = await prompt.select("Multiple IDEs detected. Select one:", detected.map((d) => ({ title: d.label, value: d.type })));
140
+ }
141
+ }
142
+ // ── Step 2: Agent name ───────────────────────────────────────────────
143
+ let agentName;
144
+ if (flags.name) {
145
+ agentName = flags.name.trim().slice(0, 64);
146
+ }
147
+ else {
148
+ const defaultName = defaultAgentName();
149
+ agentName = flags.yes
150
+ ? defaultName
151
+ : await prompt.text("Agent name:", defaultName);
152
+ }
153
+ if (!agentName)
154
+ agentName = "my-agent";
155
+ // ── Step 3: Create agent via API ─────────────────────────────────────
156
+ console.log(`Creating agent "${agentName}"...`);
157
+ let agentId;
158
+ let webhookToken;
159
+ try {
160
+ const res = await createAgent(apiKey, { name: agentName, type: ideType, icon: "bot" }, baseUrl);
161
+ agentId = res.agent._id;
162
+ webhookToken = res.agent.webhookToken;
163
+ }
164
+ catch (err) {
165
+ if (err instanceof ApiError) {
166
+ if (err.status === 400 && err.body?.error === "agent_limit_reached") {
167
+ const limit = err.body.limit;
168
+ const plan = err.body.plan;
169
+ console.error(`You've reached the limit of ${limit} agents on the ${plan} plan.\n` +
170
+ "Upgrade at https://app.agentpilot.dev/pricing");
171
+ process.exit(1);
172
+ }
173
+ if (err.status === 401) {
174
+ console.error("Error: API key invalid.");
175
+ process.exit(1);
176
+ }
177
+ if (err.status === 429) {
178
+ console.error("Rate limited. Try again in a moment.");
179
+ process.exit(1);
180
+ }
181
+ console.error(`Error: ${err.message}`);
182
+ }
183
+ else {
184
+ console.error("Error: Could not create agent.");
185
+ }
186
+ process.exit(1);
187
+ }
188
+ // Webhook lives on the Next.js app, not the Convex API
189
+ const appHost = flags.appUrl || process.env.AGENTPILOT_APP_URL || "https://app.agentpilot.dev";
190
+ const webhookUrl = appHost + "/api/webhook/" + webhookToken;
191
+ // ── Step 4: Generate hook files ──────────────────────────────────────
192
+ const builder = getTemplateBuilder(ideType);
193
+ builder(webhookUrl); // pre-validate templates, actual writing happens in merge
194
+ // ── Step 5: Settings merge ───────────────────────────────────────────
195
+ let settingsChanged = false;
196
+ let backupPath = null;
197
+ let configFilePath = "";
198
+ // Show diff before applying (unless --yes)
199
+ if (!flags.yes && ideType === "claude-code") {
200
+ const preview = await previewClaude(cwd);
201
+ const diff = simpleDiff(preview.current, preview.proposed, preview.settingsPath);
202
+ if (diff) {
203
+ console.log("\nProposed changes:\n");
204
+ console.log(diff);
205
+ console.log();
206
+ const ok = await prompt.confirm("Apply these changes?");
207
+ if (!ok) {
208
+ console.log("Aborted. Agent was created but hooks were not installed.");
209
+ process.exit(0);
210
+ }
211
+ }
212
+ }
213
+ if (ideType === "claude-code") {
214
+ const result = await mergeClaude(cwd, webhookUrl);
215
+ settingsChanged = result.changed;
216
+ backupPath = result.backupPath;
217
+ configFilePath = result.settingsPath;
218
+ }
219
+ else if (ideType === "cursor") {
220
+ const result = await mergeCursor(cwd, webhookUrl);
221
+ settingsChanged = result.changed;
222
+ backupPath = result.backupPath;
223
+ configFilePath = result.hooksPath;
224
+ }
225
+ else if (ideType === "windsurf") {
226
+ const result = await mergeWindsurf(cwd, webhookUrl);
227
+ settingsChanged = result.changed;
228
+ backupPath = result.backupPath;
229
+ configFilePath = result.hooksPath;
230
+ }
231
+ // ── Step 6: Verify connection ────────────────────────────────────────
232
+ process.stdout.write("Verifying connection...");
233
+ const verified = await verifyConnection(apiKey, agentId, baseUrl);
234
+ // ── Step 7: Output ──────────────────────────────────────────────────
235
+ console.log("\n");
236
+ const label = getIdeLabel(ideType);
237
+ const hookDir = ideType === "claude-code" ? ".claude/" : ideType === "cursor" ? ".cursor/" : ".windsurf/";
238
+ console.log(` ✓ Agent "${agentName}" created`);
239
+ console.log(` ✓ Hook files installed in ${hookDir}`);
240
+ if (settingsChanged) {
241
+ const backupInfo = backupPath ? ` (backup: ${path.basename(backupPath)})` : "";
242
+ console.log(` ✓ ${path.basename(configFilePath)} merged${backupInfo}`);
243
+ }
244
+ else {
245
+ console.log(` ✓ ${path.basename(configFilePath)} already up to date`);
246
+ }
247
+ if (verified) {
248
+ console.log(" ✓ Test heartbeat received");
249
+ }
250
+ else {
251
+ console.log(" ⚠ Heartbeat timed out (hooks will work after restart)");
252
+ }
253
+ console.log();
254
+ console.log(` Webhook URL: ${webhookUrl}`);
255
+ console.log(` Dashboard: ${appHost}/agents/${agentId}`);
256
+ console.log();
257
+ console.log(" Next steps:");
258
+ console.log(` • Restart your ${label} session to activate hooks`);
259
+ console.log(" • Set AGENTPILOT_VERBOSITY=verbose to track all tool calls (Pro/Team only)");
260
+ console.log();
261
+ }
262
+ //# 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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"}
@@ -0,0 +1,4 @@
1
+ export declare function loginCommand(flags: {
2
+ key?: string;
3
+ baseUrl?: string;
4
+ }): Promise<void>;
@@ -0,0 +1,34 @@
1
+ import { readConfig, writeConfig } from "../lib/config.js";
2
+ import { listAgents, ApiError } from "../lib/api.js";
3
+ import * as prompt from "../lib/prompts.js";
4
+ export async function loginCommand(flags) {
5
+ let apiKey = flags.key;
6
+ if (!apiKey) {
7
+ const config = await readConfig();
8
+ if (config?.apiKey) {
9
+ console.log("Already logged in. Use --key to change your API key.");
10
+ return;
11
+ }
12
+ apiKey = await prompt.password("Paste your API key (get one at app.agentpilot.dev/settings/integrations):");
13
+ }
14
+ if (!apiKey?.startsWith("ap_")) {
15
+ console.error("Error: API key must start with 'ap_'");
16
+ process.exit(1);
17
+ }
18
+ // Validate
19
+ console.log("Validating API key...");
20
+ try {
21
+ await listAgents(apiKey, flags.baseUrl);
22
+ }
23
+ catch (err) {
24
+ if (err instanceof ApiError && err.status === 401) {
25
+ console.error("Error: Invalid API key.");
26
+ process.exit(1);
27
+ }
28
+ console.error("Error: Could not reach API. Check your connection.");
29
+ process.exit(1);
30
+ }
31
+ await writeConfig({ apiKey, baseUrl: flags.baseUrl });
32
+ console.log("API key saved. You're logged in.");
33
+ }
34
+ //# sourceMappingURL=login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAC;AAE5C,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,KAGlC;IACC,IAAI,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC;IAEvB,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;QAClC,IAAI,MAAM,EAAE,MAAM,EAAE,CAAC;YACnB,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;YACpE,OAAO;QACT,CAAC;QACD,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAC5B,2EAA2E,CAC5E,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;QACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,WAAW;IACX,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;IACrC,IAAI,CAAC;QACH,MAAM,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IAC1C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,QAAQ,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAClD,OAAO,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;YACzC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,OAAO,CAAC,KAAK,CAAC,oDAAoD,CAAC,CAAC;QACpE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,WAAW,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACtD,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;AAClD,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare function statusCommand(flags: {
2
+ key?: string;
3
+ baseUrl?: string;
4
+ }): Promise<void>;
@@ -0,0 +1,72 @@
1
+ import { readConfig } from "../lib/config.js";
2
+ import { listAgents, ApiError } from "../lib/api.js";
3
+ const isTTY = process.stdout.isTTY && !process.env.NO_COLOR;
4
+ function color(code, text) {
5
+ return isTTY ? `\x1b[${code}m${text}\x1b[0m` : text;
6
+ }
7
+ function statusColor(status) {
8
+ switch (status) {
9
+ case "active":
10
+ return color("32", status); // green
11
+ case "paused":
12
+ return color("33", status); // yellow
13
+ case "error":
14
+ case "offline":
15
+ return color("31", status); // red
16
+ default:
17
+ return status;
18
+ }
19
+ }
20
+ function timeAgo(ms) {
21
+ const diff = Date.now() - ms;
22
+ const secs = Math.floor(diff / 1000);
23
+ if (secs < 60)
24
+ return `${secs}s ago`;
25
+ const mins = Math.floor(secs / 60);
26
+ if (mins < 60)
27
+ return `${mins}m ago`;
28
+ const hours = Math.floor(mins / 60);
29
+ if (hours < 24)
30
+ return `${hours}h ago`;
31
+ const days = Math.floor(hours / 24);
32
+ return `${days}d ago`;
33
+ }
34
+ export async function statusCommand(flags) {
35
+ let apiKey = flags.key;
36
+ if (!apiKey) {
37
+ const config = await readConfig();
38
+ apiKey = config?.apiKey;
39
+ }
40
+ if (!apiKey) {
41
+ console.error("Not logged in. Run: agentpilot login --key ap_xxx");
42
+ process.exit(1);
43
+ }
44
+ let agents;
45
+ try {
46
+ const res = await listAgents(apiKey, flags.baseUrl);
47
+ agents = res.agents;
48
+ }
49
+ catch (err) {
50
+ if (err instanceof ApiError && err.status === 401) {
51
+ console.error("Error: Invalid API key. Run: agentpilot login --key ap_xxx");
52
+ process.exit(1);
53
+ }
54
+ console.error("Error: Could not reach API.");
55
+ process.exit(1);
56
+ }
57
+ if (agents.length === 0) {
58
+ console.log("No agents found. Run: agentpilot init");
59
+ return;
60
+ }
61
+ // Header
62
+ const nameW = Math.max(20, ...agents.map((a) => a.name.length));
63
+ const typeW = 14;
64
+ const statusW = 10;
65
+ console.log(`${"NAME".padEnd(nameW)} ${"TYPE".padEnd(typeW)} ${"STATUS".padEnd(statusW)} LAST HEARTBEAT`);
66
+ console.log("-".repeat(nameW + typeW + statusW + 20));
67
+ for (const agent of agents) {
68
+ const hb = agent.lastHeartbeat ? timeAgo(agent.lastHeartbeat) : "never";
69
+ console.log(`${agent.name.padEnd(nameW)} ${agent.type.padEnd(typeW)} ${statusColor(agent.status).padEnd(statusW + (isTTY ? 9 : 0))} ${hb}`);
70
+ }
71
+ }
72
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAGrD,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;AAE5D,SAAS,KAAK,CAAC,IAAY,EAAE,IAAY;IACvC,OAAO,KAAK,CAAC,CAAC,CAAC,QAAQ,IAAI,IAAI,IAAI,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;AACtD,CAAC;AAED,SAAS,WAAW,CAAC,MAAc;IACjC,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,QAAQ;YACX,OAAO,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ;QACtC,KAAK,QAAQ;YACX,OAAO,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS;QACvC,KAAK,OAAO,CAAC;QACb,KAAK,SAAS;YACZ,OAAO,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM;QACpC;YACE,OAAO,MAAM,CAAC;IAClB,CAAC;AACH,CAAC;AAED,SAAS,OAAO,CAAC,EAAU;IACzB,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;IAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;IACrC,IAAI,IAAI,GAAG,EAAE;QAAE,OAAO,GAAG,IAAI,OAAO,CAAC;IACrC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;IACnC,IAAI,IAAI,GAAG,EAAE;QAAE,OAAO,GAAG,IAAI,OAAO,CAAC;IACrC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;IACpC,IAAI,KAAK,GAAG,EAAE;QAAE,OAAO,GAAG,KAAK,OAAO,CAAC;IACvC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;IACpC,OAAO,GAAG,IAAI,OAAO,CAAC;AACxB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,KAGnC;IACC,IAAI,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC;IAEvB,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;QAClC,MAAM,GAAG,MAAM,EAAE,MAAM,CAAC;IAC1B,CAAC;IAED,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC;QACnE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,MAAM,CAAC;IACX,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QACpD,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;IACtB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,QAAQ,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAClD,OAAO,CAAC,KAAK,CAAC,4DAA4D,CAAC,CAAC;YAC5E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,OAAO,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;QAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;QACrD,OAAO;IACT,CAAC;IAED,SAAS;IACT,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IAChE,MAAM,KAAK,GAAG,EAAE,CAAC;IACjB,MAAM,OAAO,GAAG,EAAE,CAAC;IAEnB,OAAO,CAAC,GAAG,CACT,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAChG,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,KAAK,GAAG,OAAO,GAAG,EAAE,CAAC,CAAC,CAAC;IAEtD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,EAAE,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;QACxE,OAAO,CAAC,GAAG,CACT,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,CAClI,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/index.js ADDED
@@ -0,0 +1,115 @@
1
+ #!/usr/bin/env node
2
+ import { initCommand } from "./commands/init.js";
3
+ import { statusCommand } from "./commands/status.js";
4
+ import { loginCommand } from "./commands/login.js";
5
+ const VERSION = "0.1.0";
6
+ function parseArgs(argv) {
7
+ const args = argv.slice(2);
8
+ const flags = {};
9
+ let command = "";
10
+ for (let i = 0; i < args.length; i++) {
11
+ const arg = args[i];
12
+ if (arg === "--version" || arg === "-v") {
13
+ flags.version = true;
14
+ }
15
+ else if (arg === "--help" || arg === "-h") {
16
+ flags.help = true;
17
+ }
18
+ else if (arg === "--yes" || arg === "-y") {
19
+ flags.yes = true;
20
+ }
21
+ else if (arg === "--key" && i + 1 < args.length) {
22
+ flags.key = args[++i];
23
+ }
24
+ else if (arg === "--type" && i + 1 < args.length) {
25
+ flags.type = args[++i];
26
+ }
27
+ else if (arg === "--name" && i + 1 < args.length) {
28
+ flags.name = args[++i];
29
+ }
30
+ else if (arg === "--base-url" && i + 1 < args.length) {
31
+ flags["base-url"] = args[++i];
32
+ }
33
+ else if (arg === "--app-url" && i + 1 < args.length) {
34
+ flags["app-url"] = args[++i];
35
+ }
36
+ else if (!arg.startsWith("-")) {
37
+ command = arg;
38
+ }
39
+ }
40
+ return { command, flags };
41
+ }
42
+ function showHelp() {
43
+ console.log(`
44
+ agentpilot v${VERSION}
45
+
46
+ Usage:
47
+ agentpilot init Interactive setup wizard
48
+ agentpilot status List your agents
49
+ agentpilot login Store API key
50
+
51
+ Flags:
52
+ --key <key> API key (ap_xxx)
53
+ --type <type> IDE: claude-code, cursor, windsurf
54
+ --name <name> Agent name
55
+ --yes Skip confirmations
56
+ --base-url <url> Custom API base URL (Convex site URL)
57
+ --app-url <url> Custom app URL for webhook (Next.js URL)
58
+ --version Show version
59
+ --help Show this help
60
+ `);
61
+ }
62
+ // ── Node version check ─────────────────────────────────────────────────
63
+ const major = parseInt(process.version.slice(1), 10);
64
+ if (major < 18) {
65
+ console.error(`Error: agentpilot requires Node.js 18 or later (you have ${process.version}).\n` +
66
+ "Install a newer version at https://nodejs.org");
67
+ process.exit(1);
68
+ }
69
+ // ── Main ───────────────────────────────────────────────────────────────
70
+ const { command, flags } = parseArgs(process.argv);
71
+ if (flags.version) {
72
+ console.log(`agentpilot v${VERSION}`);
73
+ process.exit(0);
74
+ }
75
+ if (flags.help || !command) {
76
+ showHelp();
77
+ process.exit(0);
78
+ }
79
+ const commonFlags = {
80
+ key: flags.key,
81
+ baseUrl: flags["base-url"],
82
+ appUrl: flags["app-url"],
83
+ };
84
+ try {
85
+ switch (command) {
86
+ case "init":
87
+ await initCommand({
88
+ ...commonFlags,
89
+ type: flags.type,
90
+ name: flags.name,
91
+ yes: !!flags.yes,
92
+ });
93
+ break;
94
+ case "status":
95
+ await statusCommand(commonFlags);
96
+ break;
97
+ case "login":
98
+ await loginCommand(commonFlags);
99
+ break;
100
+ default:
101
+ console.error(`Unknown command: ${command}`);
102
+ showHelp();
103
+ process.exit(1);
104
+ }
105
+ }
106
+ catch (err) {
107
+ if (err instanceof Error) {
108
+ console.error(`Error: ${err.message}`);
109
+ }
110
+ else {
111
+ console.error("An unexpected error occurred.");
112
+ }
113
+ process.exit(1);
114
+ }
115
+ //# sourceMappingURL=index.js.map