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.
- package/README.md +121 -0
- package/dist/commands/init.d.ts +10 -0
- package/dist/commands/init.js +262 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/login.d.ts +4 -0
- package/dist/commands/login.js +34 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/status.d.ts +4 -0
- package/dist/commands/status.js +72 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +115 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/api.d.ts +22 -0
- package/dist/lib/api.js +50 -0
- package/dist/lib/api.js.map +1 -0
- package/dist/lib/config.d.ts +4 -0
- package/dist/lib/config.js +28 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/detect.d.ts +9 -0
- package/dist/lib/detect.js +25 -0
- package/dist/lib/detect.js.map +1 -0
- package/dist/lib/fs-utils.d.ts +23 -0
- package/dist/lib/fs-utils.js +120 -0
- package/dist/lib/fs-utils.js.map +1 -0
- package/dist/lib/merge-claude.d.ts +17 -0
- package/dist/lib/merge-claude.js +143 -0
- package/dist/lib/merge-claude.js.map +1 -0
- package/dist/lib/merge-cursor.d.ts +5 -0
- package/dist/lib/merge-cursor.js +89 -0
- package/dist/lib/merge-cursor.js.map +1 -0
- package/dist/lib/merge-windsurf.d.ts +5 -0
- package/dist/lib/merge-windsurf.js +85 -0
- package/dist/lib/merge-windsurf.js.map +1 -0
- package/dist/lib/prompts.d.ts +19 -0
- package/dist/lib/prompts.js +62 -0
- package/dist/lib/prompts.js.map +1 -0
- package/dist/lib/templates.d.ts +5 -0
- package/dist/lib/templates.js +157 -0
- package/dist/lib/templates.js.map +1 -0
- package/dist/lib/verify.d.ts +5 -0
- package/dist/lib/verify.js +37 -0
- package/dist/lib/verify.js.map +1 -0
- package/dist/types.d.ts +33 -0
- package/dist/types.js +11 -0
- package/dist/types.js.map +1 -0
- 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,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,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,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"}
|
package/dist/index.d.ts
ADDED
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
|