@grackle-ai/cli 0.0.2
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 +5 -0
- package/dist/client.d.ts +5 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +35 -0
- package/dist/client.js.map +1 -0
- package/dist/commands/agent.d.ts +4 -0
- package/dist/commands/agent.d.ts.map +1 -0
- package/dist/commands/agent.js +115 -0
- package/dist/commands/agent.js.map +1 -0
- package/dist/commands/env.d.ts +4 -0
- package/dist/commands/env.d.ts.map +1 -0
- package/dist/commands/env.js +127 -0
- package/dist/commands/env.js.map +1 -0
- package/dist/commands/findings.d.ts +3 -0
- package/dist/commands/findings.d.ts.map +1 -0
- package/dist/commands/findings.js +58 -0
- package/dist/commands/findings.js.map +1 -0
- package/dist/commands/logs.d.ts +4 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js +60 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/project.d.ts +3 -0
- package/dist/commands/project.d.ts.map +1 -0
- package/dist/commands/project.js +48 -0
- package/dist/commands/project.js.map +1 -0
- package/dist/commands/serve.d.ts +4 -0
- package/dist/commands/serve.d.ts.map +1 -0
- package/dist/commands/serve.js +17 -0
- package/dist/commands/serve.js.map +1 -0
- package/dist/commands/task.d.ts +3 -0
- package/dist/commands/task.d.ts.map +1 -0
- package/dist/commands/task.js +108 -0
- package/dist/commands/task.js.map +1 -0
- package/dist/commands/token.d.ts +4 -0
- package/dist/commands/token.d.ts.map +1 -0
- package/dist/commands/token.js +69 -0
- package/dist/commands/token.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +28 -0
- package/dist/index.js.map +1 -0
- package/package.json +48 -0
package/README.md
ADDED
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { type Client } from "@connectrpc/connect";
|
|
2
|
+
import { grackle } from "@grackle-ai/common";
|
|
3
|
+
/** Create an authenticated ConnectRPC client for the central Grackle server. */
|
|
4
|
+
export declare function createGrackleClient(serverUrl?: string): Client<typeof grackle.Grackle>;
|
|
5
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAEhE,OAAO,EAAE,OAAO,EAAsD,MAAM,oBAAoB,CAAC;AAkBjG,gFAAgF;AAChF,wBAAgB,mBAAmB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,OAAO,OAAO,CAAC,OAAO,CAAC,CAatF"}
|
package/dist/client.js
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { createClient } from "@connectrpc/connect";
|
|
2
|
+
import { createGrpcTransport } from "@connectrpc/connect-node";
|
|
3
|
+
import { grackle, DEFAULT_SERVER_PORT, GRACKLE_DIR, API_KEY_FILENAME } from "@grackle-ai/common";
|
|
4
|
+
import { readFileSync } from "node:fs";
|
|
5
|
+
import { join } from "node:path";
|
|
6
|
+
import { homedir } from "node:os";
|
|
7
|
+
function loadApiKey() {
|
|
8
|
+
const grackleHome = process.env.GRACKLE_HOME
|
|
9
|
+
? join(process.env.GRACKLE_HOME, GRACKLE_DIR)
|
|
10
|
+
: join(homedir(), GRACKLE_DIR);
|
|
11
|
+
const keyPath = join(grackleHome, API_KEY_FILENAME);
|
|
12
|
+
try {
|
|
13
|
+
return readFileSync(keyPath, "utf8").trim();
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
console.error(`Warning: Could not read API key from ${keyPath}`);
|
|
17
|
+
return "";
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
/** Create an authenticated ConnectRPC client for the central Grackle server. */
|
|
21
|
+
export function createGrackleClient(serverUrl) {
|
|
22
|
+
const url = serverUrl || process.env.GRACKLE_URL || `http://localhost:${DEFAULT_SERVER_PORT}`;
|
|
23
|
+
const apiKey = process.env.GRACKLE_API_KEY || loadApiKey();
|
|
24
|
+
const transport = createGrpcTransport({
|
|
25
|
+
baseUrl: url,
|
|
26
|
+
interceptors: [
|
|
27
|
+
(next) => async (req) => {
|
|
28
|
+
req.header.set("Authorization", `Bearer ${apiKey}`);
|
|
29
|
+
return next(req);
|
|
30
|
+
},
|
|
31
|
+
],
|
|
32
|
+
});
|
|
33
|
+
return createClient(grackle.Grackle, transport);
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAe,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACjG,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,SAAS,UAAU;IACjB,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY;QAC1C,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,WAAW,CAAC;QAC7C,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAC;IACjC,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC;IACpD,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,KAAK,CAAC,wCAAwC,OAAO,EAAE,CAAC,CAAC;QACjE,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,mBAAmB,CAAC,SAAkB;IACpD,MAAM,GAAG,GAAG,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,oBAAoB,mBAAmB,EAAE,CAAC;IAC9F,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,UAAU,EAAE,CAAC;IAC3D,MAAM,SAAS,GAAG,mBAAmB,CAAC;QACpC,OAAO,EAAE,GAAG;QACZ,YAAY,EAAE;YACZ,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;gBACtB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,eAAe,EAAE,UAAU,MAAM,EAAE,CAAC,CAAC;gBACpD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;YACnB,CAAC;SACF;KACF,CAAC,CAAC;IACH,OAAO,YAAY,CAAC,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;AAClD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/commands/agent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKzC,0FAA0F;AAC1F,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA8F5D"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import { createGrackleClient } from "../client.js";
|
|
3
|
+
import Table from "cli-table3";
|
|
4
|
+
/** Register agent-related commands: `spawn`, `resume`, `status`, `kill`, and `attach`. */
|
|
5
|
+
export function registerAgentCommands(program) {
|
|
6
|
+
program
|
|
7
|
+
.command("spawn <env-id> <prompt>")
|
|
8
|
+
.description("Spawn an agent on an environment")
|
|
9
|
+
.option("--model <model>", "Model to use")
|
|
10
|
+
.option("--max-turns <n>", "Maximum turns", parseInt)
|
|
11
|
+
.option("--runtime <runtime>", "Agent runtime")
|
|
12
|
+
.action(async (environmentId, prompt, opts) => {
|
|
13
|
+
const client = createGrackleClient();
|
|
14
|
+
const session = await client.spawnAgent({
|
|
15
|
+
environmentId,
|
|
16
|
+
prompt,
|
|
17
|
+
model: opts.model || "",
|
|
18
|
+
maxTurns: opts.maxTurns || 0,
|
|
19
|
+
runtime: opts.runtime || "",
|
|
20
|
+
});
|
|
21
|
+
console.log(`Spawned session: ${session.id}`);
|
|
22
|
+
console.log(`Streaming events (Ctrl+C to detach)...\n`);
|
|
23
|
+
// Auto-attach to stream
|
|
24
|
+
for await (const event of client.streamSession({ id: session.id })) {
|
|
25
|
+
printEvent(event);
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
program
|
|
29
|
+
.command("resume <session-id>")
|
|
30
|
+
.description("Resume a suspended session")
|
|
31
|
+
.action(async (sessionId) => {
|
|
32
|
+
const client = createGrackleClient();
|
|
33
|
+
const session = await client.resumeAgent({ sessionId });
|
|
34
|
+
console.log(`Resumed session: ${session.id}`);
|
|
35
|
+
});
|
|
36
|
+
program
|
|
37
|
+
.command("status")
|
|
38
|
+
.description("List active sessions")
|
|
39
|
+
.option("--env <env-id>", "Filter by environment")
|
|
40
|
+
.option("--all", "Show all sessions including completed")
|
|
41
|
+
.action(async (opts) => {
|
|
42
|
+
const client = createGrackleClient();
|
|
43
|
+
const res = await client.listSessions({
|
|
44
|
+
environmentId: opts.env || "",
|
|
45
|
+
status: opts.all ? "" : "active",
|
|
46
|
+
});
|
|
47
|
+
if (res.sessions.length === 0) {
|
|
48
|
+
console.log("No sessions.");
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
const table = new Table({
|
|
52
|
+
head: ["ID", "Env", "Runtime", "Status", "Prompt", "Started"],
|
|
53
|
+
});
|
|
54
|
+
for (const s of res.sessions) {
|
|
55
|
+
const prompt = s.prompt.length > 40 ? s.prompt.slice(0, 40) + "..." : s.prompt;
|
|
56
|
+
table.push([s.id.slice(0, 8), s.environmentId, s.runtime, s.status, prompt, s.startedAt]);
|
|
57
|
+
}
|
|
58
|
+
console.log(table.toString());
|
|
59
|
+
});
|
|
60
|
+
program
|
|
61
|
+
.command("kill <session-id>")
|
|
62
|
+
.description("Kill a running session")
|
|
63
|
+
.action(async (sessionId) => {
|
|
64
|
+
const client = createGrackleClient();
|
|
65
|
+
await client.killAgent({ id: sessionId });
|
|
66
|
+
console.log(`Killed: ${sessionId}`);
|
|
67
|
+
});
|
|
68
|
+
program
|
|
69
|
+
.command("attach <session-id>")
|
|
70
|
+
.description("Attach to a session stream with interactive input")
|
|
71
|
+
.action(async (sessionId) => {
|
|
72
|
+
const client = createGrackleClient();
|
|
73
|
+
console.log(`Attached to ${sessionId} (Ctrl+C to detach)\n`);
|
|
74
|
+
// Set up stdin for input
|
|
75
|
+
const readline = await import("node:readline");
|
|
76
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
77
|
+
// Stream events
|
|
78
|
+
const streamPromise = (async () => {
|
|
79
|
+
for await (const event of client.streamSession({ id: sessionId })) {
|
|
80
|
+
printEvent(event);
|
|
81
|
+
if (event.type === "status" && event.content === "waiting_input") {
|
|
82
|
+
rl.question("> ", async (answer) => {
|
|
83
|
+
await client.sendInput({ sessionId, text: answer });
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
})();
|
|
88
|
+
await streamPromise;
|
|
89
|
+
rl.close();
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
function printEvent(event) {
|
|
93
|
+
const time = new Date(event.timestamp).toLocaleTimeString();
|
|
94
|
+
switch (event.type) {
|
|
95
|
+
case "system":
|
|
96
|
+
console.log(chalk.gray(`[${time}] ${event.content}`));
|
|
97
|
+
break;
|
|
98
|
+
case "text":
|
|
99
|
+
console.log(event.content);
|
|
100
|
+
break;
|
|
101
|
+
case "tool_use":
|
|
102
|
+
console.log(chalk.blue(`> ${event.content}`));
|
|
103
|
+
break;
|
|
104
|
+
case "tool_result":
|
|
105
|
+
console.log(chalk.gray(event.content));
|
|
106
|
+
break;
|
|
107
|
+
case "error":
|
|
108
|
+
console.log(chalk.red(`[ERROR] ${event.content}`));
|
|
109
|
+
break;
|
|
110
|
+
case "status":
|
|
111
|
+
console.log(chalk.yellow(`--- ${event.content} ---`));
|
|
112
|
+
break;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/commands/agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/commands/env.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMzC,qHAAqH;AACrH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAuH1D"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import { createGrackleClient } from "../client.js";
|
|
3
|
+
import Table from "cli-table3";
|
|
4
|
+
/** Register environment management commands: `env list`, `add`, `provision`, `stop`, `destroy`, `remove`, `wake`. */
|
|
5
|
+
export function registerEnvCommands(program) {
|
|
6
|
+
const env = program.command("env").description("Manage environments");
|
|
7
|
+
env
|
|
8
|
+
.command("list")
|
|
9
|
+
.description("List all environments")
|
|
10
|
+
.action(async () => {
|
|
11
|
+
const client = createGrackleClient();
|
|
12
|
+
const res = await client.listEnvironments({});
|
|
13
|
+
if (res.environments.length === 0) {
|
|
14
|
+
console.log("No environments configured.");
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
const table = new Table({
|
|
18
|
+
head: ["ID", "Type", "Runtime", "Status", "Bootstrapped"],
|
|
19
|
+
});
|
|
20
|
+
for (const e of res.environments) {
|
|
21
|
+
const status = e.status === "connected" ? chalk.green("●") + " " + e.status :
|
|
22
|
+
e.status === "sleeping" ? chalk.yellow("●") + " " + e.status :
|
|
23
|
+
e.status === "error" ? chalk.red("●") + " " + e.status :
|
|
24
|
+
chalk.gray("●") + " " + e.status;
|
|
25
|
+
table.push([e.id, e.adapterType, e.defaultRuntime, status, e.bootstrapped ? "yes" : "no"]);
|
|
26
|
+
}
|
|
27
|
+
console.log(table.toString());
|
|
28
|
+
});
|
|
29
|
+
env
|
|
30
|
+
.command("add <name>")
|
|
31
|
+
.description("Add an environment")
|
|
32
|
+
.option("--codespace", "Codespace adapter")
|
|
33
|
+
.option("--docker", "Docker adapter")
|
|
34
|
+
.option("--ssh", "SSH adapter")
|
|
35
|
+
.option("--local", "Local PowerLine adapter")
|
|
36
|
+
.option("--repo <repo>", "GitHub repo (codespace)")
|
|
37
|
+
.option("--machine <machine>", "Machine type (codespace)")
|
|
38
|
+
.option("--image <image>", "Docker image")
|
|
39
|
+
.option("--host <host>", "SSH host / local host")
|
|
40
|
+
.option("--port <port>", "PowerLine port (local adapter)")
|
|
41
|
+
.option("--user <user>", "SSH user")
|
|
42
|
+
.option("--runtime <runtime>", "Default runtime", "claude-code")
|
|
43
|
+
.action(async (name, opts) => {
|
|
44
|
+
const client = createGrackleClient();
|
|
45
|
+
let adapterType = "docker";
|
|
46
|
+
const config = {};
|
|
47
|
+
if (opts.local) {
|
|
48
|
+
adapterType = "local";
|
|
49
|
+
if (opts.host)
|
|
50
|
+
config.host = opts.host;
|
|
51
|
+
if (opts.port)
|
|
52
|
+
config.port = parseInt(opts.port, 10);
|
|
53
|
+
}
|
|
54
|
+
else if (opts.codespace) {
|
|
55
|
+
adapterType = "codespace";
|
|
56
|
+
if (opts.repo)
|
|
57
|
+
config.repo = opts.repo;
|
|
58
|
+
if (opts.machine)
|
|
59
|
+
config.machine = opts.machine;
|
|
60
|
+
}
|
|
61
|
+
else if (opts.ssh) {
|
|
62
|
+
adapterType = "ssh";
|
|
63
|
+
if (opts.host)
|
|
64
|
+
config.host = opts.host;
|
|
65
|
+
if (opts.user)
|
|
66
|
+
config.user = opts.user;
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
if (opts.image)
|
|
70
|
+
config.image = opts.image;
|
|
71
|
+
if (opts.repo)
|
|
72
|
+
config.repo = opts.repo;
|
|
73
|
+
}
|
|
74
|
+
const env = await client.addEnvironment({
|
|
75
|
+
displayName: name,
|
|
76
|
+
adapterType,
|
|
77
|
+
adapterConfig: JSON.stringify(config),
|
|
78
|
+
defaultRuntime: opts.runtime,
|
|
79
|
+
});
|
|
80
|
+
console.log(`Added environment: ${env.id} (${env.adapterType})`);
|
|
81
|
+
});
|
|
82
|
+
env
|
|
83
|
+
.command("provision <id>")
|
|
84
|
+
.description("Provision and connect an environment")
|
|
85
|
+
.action(async (id) => {
|
|
86
|
+
const client = createGrackleClient();
|
|
87
|
+
for await (const event of client.provisionEnvironment({ id })) {
|
|
88
|
+
const pct = Math.round(event.progress * 100);
|
|
89
|
+
console.log(`[${pct}%] ${event.stage}: ${event.message}`);
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
env
|
|
93
|
+
.command("stop <id>")
|
|
94
|
+
.description("Stop an environment")
|
|
95
|
+
.action(async (id) => {
|
|
96
|
+
const client = createGrackleClient();
|
|
97
|
+
await client.stopEnvironment({ id });
|
|
98
|
+
console.log(`Stopped: ${id}`);
|
|
99
|
+
});
|
|
100
|
+
env
|
|
101
|
+
.command("destroy <id>")
|
|
102
|
+
.description("Destroy an environment")
|
|
103
|
+
.action(async (id) => {
|
|
104
|
+
const client = createGrackleClient();
|
|
105
|
+
await client.destroyEnvironment({ id });
|
|
106
|
+
console.log(`Destroyed: ${id}`);
|
|
107
|
+
});
|
|
108
|
+
env
|
|
109
|
+
.command("remove <id>")
|
|
110
|
+
.description("Remove environment from registry")
|
|
111
|
+
.action(async (id) => {
|
|
112
|
+
const client = createGrackleClient();
|
|
113
|
+
await client.removeEnvironment({ id });
|
|
114
|
+
console.log(`Removed: ${id}`);
|
|
115
|
+
});
|
|
116
|
+
env
|
|
117
|
+
.command("wake <id>")
|
|
118
|
+
.description("Wake a sleeping environment")
|
|
119
|
+
.action(async (id) => {
|
|
120
|
+
const client = createGrackleClient();
|
|
121
|
+
for await (const event of client.provisionEnvironment({ id })) {
|
|
122
|
+
const pct = Math.round(event.progress * 100);
|
|
123
|
+
console.log(`[${pct}%] ${event.stage}: ${event.message}`);
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=env.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/commands/env.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"findings.d.ts","sourceRoot":"","sources":["../../src/commands/findings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIzC,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAwD9D"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { createGrackleClient } from "../client.js";
|
|
2
|
+
import Table from "cli-table3";
|
|
3
|
+
export function registerFindingCommands(program) {
|
|
4
|
+
const finding = program.command("finding").description("Manage findings");
|
|
5
|
+
finding
|
|
6
|
+
.command("list <project-id>")
|
|
7
|
+
.description("List findings in a project")
|
|
8
|
+
.option("--category <cat>", "Filter by category")
|
|
9
|
+
.option("--tag <tag>", "Filter by tag")
|
|
10
|
+
.option("--limit <n>", "Max results", parseInt)
|
|
11
|
+
.action(async (projectId, opts) => {
|
|
12
|
+
const client = createGrackleClient();
|
|
13
|
+
const res = await client.queryFindings({
|
|
14
|
+
projectId,
|
|
15
|
+
categories: opts.category ? [opts.category] : [],
|
|
16
|
+
tags: opts.tag ? [opts.tag] : [],
|
|
17
|
+
limit: opts.limit || 20,
|
|
18
|
+
});
|
|
19
|
+
if (res.findings.length === 0) {
|
|
20
|
+
console.log("No findings.");
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
const table = new Table({
|
|
24
|
+
head: ["ID", "Category", "Title", "Tags", "Created"],
|
|
25
|
+
});
|
|
26
|
+
for (const f of res.findings) {
|
|
27
|
+
table.push([
|
|
28
|
+
f.id,
|
|
29
|
+
f.category,
|
|
30
|
+
f.title.slice(0, 40),
|
|
31
|
+
f.tags.join(",") || "-",
|
|
32
|
+
f.createdAt,
|
|
33
|
+
]);
|
|
34
|
+
}
|
|
35
|
+
console.log(table.toString());
|
|
36
|
+
});
|
|
37
|
+
finding
|
|
38
|
+
.command("post <project-id> <title>")
|
|
39
|
+
.description("Post a finding")
|
|
40
|
+
.option("--category <cat>", "Finding category", "general")
|
|
41
|
+
.option("--content <text>", "Finding content", "")
|
|
42
|
+
.option("--tags <tags>", "Comma-separated tags")
|
|
43
|
+
.action(async (projectId, title, opts) => {
|
|
44
|
+
const client = createGrackleClient();
|
|
45
|
+
const tags = opts.tags ? opts.tags.split(",") : [];
|
|
46
|
+
const f = await client.postFinding({
|
|
47
|
+
projectId,
|
|
48
|
+
taskId: "",
|
|
49
|
+
sessionId: "",
|
|
50
|
+
category: opts.category,
|
|
51
|
+
title,
|
|
52
|
+
content: opts.content,
|
|
53
|
+
tags,
|
|
54
|
+
});
|
|
55
|
+
console.log(`Posted finding: ${f.id}`);
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=findings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"findings.js","sourceRoot":"","sources":["../../src/commands/findings.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logs.d.ts","sourceRoot":"","sources":["../../src/commands/logs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGzC,2FAA2F;AAC3F,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA8D1D"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { createGrackleClient } from "../client.js";
|
|
2
|
+
/** Register the `logs` command for viewing session logs, transcripts, and live tailing. */
|
|
3
|
+
export function registerLogCommands(program) {
|
|
4
|
+
program
|
|
5
|
+
.command("logs <session-id>")
|
|
6
|
+
.description("View session logs")
|
|
7
|
+
.option("--transcript", "Show markdown transcript")
|
|
8
|
+
.option("--tail", "Follow live events")
|
|
9
|
+
.action(async (sessionId, opts) => {
|
|
10
|
+
const client = createGrackleClient();
|
|
11
|
+
if (opts.tail) {
|
|
12
|
+
// Stream live
|
|
13
|
+
console.log(`Streaming session ${sessionId}...\n`);
|
|
14
|
+
for await (const event of client.streamSession({ id: sessionId })) {
|
|
15
|
+
const time = new Date(event.timestamp).toLocaleTimeString();
|
|
16
|
+
console.log(`[${time}] ${event.type}: ${event.content}`);
|
|
17
|
+
}
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
// Get session info for log path
|
|
21
|
+
const sessions = await client.listSessions({ environmentId: "", status: "" });
|
|
22
|
+
const session = sessions.sessions.find((s) => s.id === sessionId || s.id.startsWith(sessionId));
|
|
23
|
+
if (!session) {
|
|
24
|
+
console.error(`Session not found: ${sessionId}`);
|
|
25
|
+
process.exit(1);
|
|
26
|
+
}
|
|
27
|
+
if (!session.logPath) {
|
|
28
|
+
console.error("No log path for session");
|
|
29
|
+
process.exit(1);
|
|
30
|
+
}
|
|
31
|
+
if (opts.transcript) {
|
|
32
|
+
// Read transcript file
|
|
33
|
+
const { readFileSync, existsSync } = await import("node:fs");
|
|
34
|
+
const { join } = await import("node:path");
|
|
35
|
+
const transcriptPath = join(session.logPath, "transcript.md");
|
|
36
|
+
if (existsSync(transcriptPath)) {
|
|
37
|
+
console.log(readFileSync(transcriptPath, "utf-8"));
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
console.error("Transcript not yet generated (session may still be running)");
|
|
41
|
+
}
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
// Read JSONL
|
|
45
|
+
const { readFileSync, existsSync } = await import("node:fs");
|
|
46
|
+
const { join } = await import("node:path");
|
|
47
|
+
const jsonlPath = join(session.logPath, "stream.jsonl");
|
|
48
|
+
if (!existsSync(jsonlPath)) {
|
|
49
|
+
console.error("No log file found");
|
|
50
|
+
process.exit(1);
|
|
51
|
+
}
|
|
52
|
+
const lines = readFileSync(jsonlPath, "utf-8").split("\n").filter(Boolean);
|
|
53
|
+
for (const line of lines) {
|
|
54
|
+
const entry = JSON.parse(line);
|
|
55
|
+
const time = new Date(entry.timestamp).toLocaleTimeString();
|
|
56
|
+
console.log(`[${time}] ${entry.type}: ${entry.content}`);
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=logs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logs.js","sourceRoot":"","sources":["../../src/commands/logs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/commands/project.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIzC,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA+C9D"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { createGrackleClient } from "../client.js";
|
|
2
|
+
import Table from "cli-table3";
|
|
3
|
+
export function registerProjectCommands(program) {
|
|
4
|
+
const project = program.command("project").description("Manage projects");
|
|
5
|
+
project
|
|
6
|
+
.command("list")
|
|
7
|
+
.description("List all active projects")
|
|
8
|
+
.action(async () => {
|
|
9
|
+
const client = createGrackleClient();
|
|
10
|
+
const res = await client.listProjects({});
|
|
11
|
+
if (res.projects.length === 0) {
|
|
12
|
+
console.log("No projects.");
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
const table = new Table({
|
|
16
|
+
head: ["ID", "Name", "Env", "Status", "Created"],
|
|
17
|
+
});
|
|
18
|
+
for (const p of res.projects) {
|
|
19
|
+
table.push([p.id, p.name, p.defaultEnvironmentId || "-", p.status, p.createdAt]);
|
|
20
|
+
}
|
|
21
|
+
console.log(table.toString());
|
|
22
|
+
});
|
|
23
|
+
project
|
|
24
|
+
.command("create <name>")
|
|
25
|
+
.description("Create a new project")
|
|
26
|
+
.option("--repo <url>", "Repository URL")
|
|
27
|
+
.option("--env <env-id>", "Default environment ID")
|
|
28
|
+
.option("--desc <description>", "Project description")
|
|
29
|
+
.action(async (name, opts) => {
|
|
30
|
+
const client = createGrackleClient();
|
|
31
|
+
const p = await client.createProject({
|
|
32
|
+
name,
|
|
33
|
+
description: opts.desc || "",
|
|
34
|
+
repoUrl: opts.repo || "",
|
|
35
|
+
defaultEnvironmentId: opts.env || "",
|
|
36
|
+
});
|
|
37
|
+
console.log(`Created project: ${p.id} (${p.name})`);
|
|
38
|
+
});
|
|
39
|
+
project
|
|
40
|
+
.command("archive <id>")
|
|
41
|
+
.description("Archive a project")
|
|
42
|
+
.action(async (id) => {
|
|
43
|
+
const client = createGrackleClient();
|
|
44
|
+
await client.archiveProject({ id });
|
|
45
|
+
console.log(`Archived: ${id}`);
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=project.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/commands/project.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,MAAM,YAAY,CAAC;AAE/B,MAAM,UAAU,uBAAuB,CAAC,OAAgB;IACtD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,WAAW,CAAC,iBAAiB,CAAC,CAAC;IAE1E,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,0BAA0B,CAAC;SACvC,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,MAAM,GAAG,mBAAmB,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QAC1C,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9B,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;YAC5B,OAAO;QACT,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC;YACtB,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,CAAC;SACjD,CAAC,CAAC;QACH,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;YAC7B,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,oBAAoB,IAAI,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;QACnF,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,eAAe,CAAC;SACxB,WAAW,CAAC,sBAAsB,CAAC;SACnC,MAAM,CAAC,cAAc,EAAE,gBAAgB,CAAC;SACxC,MAAM,CAAC,gBAAgB,EAAE,wBAAwB,CAAC;SAClD,MAAM,CAAC,sBAAsB,EAAE,qBAAqB,CAAC;SACrD,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,IAAI,EAAE,EAAE;QACnC,MAAM,MAAM,GAAG,mBAAmB,EAAE,CAAC;QACrC,MAAM,CAAC,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC;YACnC,IAAI;YACJ,WAAW,EAAE,IAAI,CAAC,IAAI,IAAI,EAAE;YAC5B,OAAO,EAAE,IAAI,CAAC,IAAI,IAAI,EAAE;YACxB,oBAAoB,EAAE,IAAI,CAAC,GAAG,IAAI,EAAE;SACrC,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,cAAc,CAAC;SACvB,WAAW,CAAC,mBAAmB,CAAC;SAChC,MAAM,CAAC,KAAK,EAAE,EAAU,EAAE,EAAE;QAC3B,MAAM,MAAM,GAAG,mBAAmB,EAAE,CAAC;QACrC,MAAM,MAAM,CAAC,cAAc,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../src/commands/serve.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,8EAA8E;AAC9E,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAgB3D"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/** Register the `serve` command that starts the Grackle server and web UI. */
|
|
2
|
+
export function registerServeCommand(program) {
|
|
3
|
+
program
|
|
4
|
+
.command("serve")
|
|
5
|
+
.description("Start the Grackle server")
|
|
6
|
+
.option("--port <port>", "Server port", "7434")
|
|
7
|
+
.option("--web-port <port>", "Web UI port", "3000")
|
|
8
|
+
.action(async (opts) => {
|
|
9
|
+
process.env.GRACKLE_PORT = opts.port;
|
|
10
|
+
process.env.GRACKLE_WEB_PORT = opts.webPort;
|
|
11
|
+
console.log(`Starting Grackle server on port ${opts.port}...`);
|
|
12
|
+
console.log(`Web UI will be available at http://localhost:${opts.webPort}`);
|
|
13
|
+
// Dynamic import to start the server
|
|
14
|
+
await import("@grackle-ai/server");
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=serve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serve.js","sourceRoot":"","sources":["../../src/commands/serve.ts"],"names":[],"mappings":"AAEA,8EAA8E;AAC9E,MAAM,UAAU,oBAAoB,CAAC,OAAgB;IACnD,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,0BAA0B,CAAC;SACvC,MAAM,CAAC,eAAe,EAAE,aAAa,EAAE,MAAM,CAAC;SAC9C,MAAM,CAAC,mBAAmB,EAAE,aAAa,EAAE,MAAM,CAAC;SAClD,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,OAAO,CAAC,GAAG,CAAC,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,gBAAgB,GAAG,IAAI,CAAC,OAAO,CAAC;QAE5C,OAAO,CAAC,GAAG,CAAC,mCAAmC,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC;QAC/D,OAAO,CAAC,GAAG,CAAC,gDAAgD,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QAE5E,qCAAqC;QACrC,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task.d.ts","sourceRoot":"","sources":["../../src/commands/task.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIzC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA6G3D"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { createGrackleClient } from "../client.js";
|
|
2
|
+
import Table from "cli-table3";
|
|
3
|
+
export function registerTaskCommands(program) {
|
|
4
|
+
const task = program.command("task").description("Manage tasks");
|
|
5
|
+
task
|
|
6
|
+
.command("list <project-id>")
|
|
7
|
+
.description("List tasks in a project")
|
|
8
|
+
.action(async (projectId) => {
|
|
9
|
+
const client = createGrackleClient();
|
|
10
|
+
const res = await client.listTasks({ id: projectId });
|
|
11
|
+
if (res.tasks.length === 0) {
|
|
12
|
+
console.log("No tasks.");
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
const table = new Table({
|
|
16
|
+
head: ["ID", "Title", "Status", "Branch", "Deps", "Session"],
|
|
17
|
+
});
|
|
18
|
+
for (const t of res.tasks) {
|
|
19
|
+
const deps = t.dependsOn.length > 0 ? t.dependsOn.join(",") : "-";
|
|
20
|
+
table.push([t.id, t.title.slice(0, 30), t.status, t.branch.slice(0, 30), deps, t.sessionId?.slice(0, 8) || "-"]);
|
|
21
|
+
}
|
|
22
|
+
console.log(table.toString());
|
|
23
|
+
});
|
|
24
|
+
task
|
|
25
|
+
.command("create <project-id> <title>")
|
|
26
|
+
.description("Create a task")
|
|
27
|
+
.option("--desc <text>", "Task description")
|
|
28
|
+
.option("--env <env-id>", "Environment ID")
|
|
29
|
+
.option("--depends-on <ids>", "Comma-separated dependency task IDs")
|
|
30
|
+
.action(async (projectId, title, opts) => {
|
|
31
|
+
const client = createGrackleClient();
|
|
32
|
+
const dependsOn = opts.dependsOn ? opts.dependsOn.split(",") : [];
|
|
33
|
+
const t = await client.createTask({
|
|
34
|
+
projectId,
|
|
35
|
+
title,
|
|
36
|
+
description: opts.desc || "",
|
|
37
|
+
environmentId: opts.env || "",
|
|
38
|
+
dependsOn,
|
|
39
|
+
});
|
|
40
|
+
console.log(`Created task: ${t.id} (${t.title}) branch: ${t.branch}`);
|
|
41
|
+
});
|
|
42
|
+
task
|
|
43
|
+
.command("show <task-id>")
|
|
44
|
+
.description("Show task details")
|
|
45
|
+
.action(async (taskId) => {
|
|
46
|
+
const client = createGrackleClient();
|
|
47
|
+
const t = await client.getTask({ id: taskId });
|
|
48
|
+
console.log(`ID: ${t.id}`);
|
|
49
|
+
console.log(`Title: ${t.title}`);
|
|
50
|
+
console.log(`Status: ${t.status}`);
|
|
51
|
+
console.log(`Branch: ${t.branch}`);
|
|
52
|
+
console.log(`Env: ${t.environmentId || "-"}`);
|
|
53
|
+
console.log(`Session: ${t.sessionId || "-"}`);
|
|
54
|
+
console.log(`Depends On: ${t.dependsOn.length > 0 ? t.dependsOn.join(", ") : "none"}`);
|
|
55
|
+
if (t.description)
|
|
56
|
+
console.log(`Description: ${t.description}`);
|
|
57
|
+
if (t.reviewNotes)
|
|
58
|
+
console.log(`Review Notes: ${t.reviewNotes}`);
|
|
59
|
+
});
|
|
60
|
+
task
|
|
61
|
+
.command("start <task-id>")
|
|
62
|
+
.description("Start a task (spawn agent)")
|
|
63
|
+
.option("--runtime <runtime>", "Agent runtime")
|
|
64
|
+
.option("--model <model>", "Model to use")
|
|
65
|
+
.action(async (taskId, opts) => {
|
|
66
|
+
const client = createGrackleClient();
|
|
67
|
+
const session = await client.startTask({
|
|
68
|
+
taskId,
|
|
69
|
+
runtime: opts.runtime || "",
|
|
70
|
+
model: opts.model || "",
|
|
71
|
+
});
|
|
72
|
+
console.log(`Task started. Session: ${session.id}`);
|
|
73
|
+
});
|
|
74
|
+
task
|
|
75
|
+
.command("delete <task-id>")
|
|
76
|
+
.description("Delete a task")
|
|
77
|
+
.action(async (taskId) => {
|
|
78
|
+
const client = createGrackleClient();
|
|
79
|
+
await client.deleteTask({ id: taskId });
|
|
80
|
+
console.log(`Deleted: ${taskId}`);
|
|
81
|
+
});
|
|
82
|
+
task
|
|
83
|
+
.command("approve <task-id>")
|
|
84
|
+
.description("Approve a task in review")
|
|
85
|
+
.action(async (taskId) => {
|
|
86
|
+
const client = createGrackleClient();
|
|
87
|
+
const t = await client.approveTask({ id: taskId });
|
|
88
|
+
console.log(`Approved: ${t.id} → ${t.status}`);
|
|
89
|
+
});
|
|
90
|
+
task
|
|
91
|
+
.command("reject <task-id>")
|
|
92
|
+
.description("Reject a task in review")
|
|
93
|
+
.option("--notes <text>", "Review notes", "")
|
|
94
|
+
.action(async (taskId, opts) => {
|
|
95
|
+
const client = createGrackleClient();
|
|
96
|
+
const t = await client.rejectTask({
|
|
97
|
+
id: taskId,
|
|
98
|
+
title: "",
|
|
99
|
+
description: "",
|
|
100
|
+
status: "",
|
|
101
|
+
environmentId: "",
|
|
102
|
+
dependsOn: [],
|
|
103
|
+
reviewNotes: opts.notes,
|
|
104
|
+
});
|
|
105
|
+
console.log(`Rejected: ${t.id} → ${t.status}`);
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=task.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task.js","sourceRoot":"","sources":["../../src/commands/task.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token.d.ts","sourceRoot":"","sources":["../../src/commands/token.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMzC,gFAAgF;AAChF,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAgE5D"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { createGrackleClient } from "../client.js";
|
|
2
|
+
import Table from "cli-table3";
|
|
3
|
+
import { readFileSync } from "node:fs";
|
|
4
|
+
import { createInterface } from "node:readline";
|
|
5
|
+
/** Register the `token set` and `token list` subcommands on the CLI program. */
|
|
6
|
+
export function registerTokenCommands(program) {
|
|
7
|
+
const token = program.command("token").description("Manage auth tokens");
|
|
8
|
+
token
|
|
9
|
+
.command("set <name>")
|
|
10
|
+
.description("Set a token")
|
|
11
|
+
.option("--file <path>", "Read value from file")
|
|
12
|
+
.option("--env <var>", "Read value from environment variable")
|
|
13
|
+
.option("--type <type>", "Token type: env_var or file", "env_var")
|
|
14
|
+
.option("--env-var <name>", "Environment variable name to set on PowerLine")
|
|
15
|
+
.option("--file-path <path>", "File path to write on PowerLine")
|
|
16
|
+
.action(async (name, opts) => {
|
|
17
|
+
const client = createGrackleClient();
|
|
18
|
+
let value;
|
|
19
|
+
if (opts.file) {
|
|
20
|
+
value = readFileSync(opts.file, "utf-8").trim();
|
|
21
|
+
}
|
|
22
|
+
else if (opts.env) {
|
|
23
|
+
value = process.env[opts.env] || "";
|
|
24
|
+
if (!value) {
|
|
25
|
+
console.error(`Environment variable ${opts.env} is not set`);
|
|
26
|
+
process.exit(1);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
// Interactive
|
|
31
|
+
value = await new Promise((resolve) => {
|
|
32
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
33
|
+
rl.question(`Enter value for ${name}: `, (answer) => {
|
|
34
|
+
rl.close();
|
|
35
|
+
resolve(answer);
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
await client.setToken({
|
|
40
|
+
name,
|
|
41
|
+
type: opts.type,
|
|
42
|
+
envVar: opts.envVar || name.toUpperCase() + "_TOKEN",
|
|
43
|
+
filePath: opts.filePath || "",
|
|
44
|
+
value,
|
|
45
|
+
expiresAt: "",
|
|
46
|
+
});
|
|
47
|
+
console.log(`Token set: ${name}`);
|
|
48
|
+
});
|
|
49
|
+
token
|
|
50
|
+
.command("list")
|
|
51
|
+
.description("List configured tokens")
|
|
52
|
+
.action(async () => {
|
|
53
|
+
const client = createGrackleClient();
|
|
54
|
+
const res = await client.listTokens({});
|
|
55
|
+
if (res.tokens.length === 0) {
|
|
56
|
+
console.log("No tokens configured.");
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
const table = new Table({
|
|
60
|
+
head: ["Name", "Type", "Target", "Expires"],
|
|
61
|
+
});
|
|
62
|
+
for (const t of res.tokens) {
|
|
63
|
+
const target = t.type === "env_var" ? t.envVar : t.filePath;
|
|
64
|
+
table.push([t.name, t.type, target, t.expiresAt || "never"]);
|
|
65
|
+
}
|
|
66
|
+
console.log(table.toString());
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=token.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token.js","sourceRoot":"","sources":["../../src/commands/token.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command } from "commander";
|
|
3
|
+
import { registerEnvCommands } from "./commands/env.js";
|
|
4
|
+
import { registerAgentCommands } from "./commands/agent.js";
|
|
5
|
+
import { registerTokenCommands } from "./commands/token.js";
|
|
6
|
+
import { registerLogCommands } from "./commands/logs.js";
|
|
7
|
+
import { registerServeCommand } from "./commands/serve.js";
|
|
8
|
+
import { registerProjectCommands } from "./commands/project.js";
|
|
9
|
+
import { registerTaskCommands } from "./commands/task.js";
|
|
10
|
+
import { registerFindingCommands } from "./commands/findings.js";
|
|
11
|
+
const program = new Command();
|
|
12
|
+
program
|
|
13
|
+
.name("grackle")
|
|
14
|
+
.description("Multiplexed interface for AI coding agent sessions")
|
|
15
|
+
.version("0.0.1");
|
|
16
|
+
registerEnvCommands(program);
|
|
17
|
+
registerAgentCommands(program);
|
|
18
|
+
registerTokenCommands(program);
|
|
19
|
+
registerLogCommands(program);
|
|
20
|
+
registerServeCommand(program);
|
|
21
|
+
registerProjectCommands(program);
|
|
22
|
+
registerTaskCommands(program);
|
|
23
|
+
registerFindingCommands(program);
|
|
24
|
+
program.parseAsync(process.argv).catch((err) => {
|
|
25
|
+
console.error(err.message || err);
|
|
26
|
+
process.exit(1);
|
|
27
|
+
});
|
|
28
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAEjE,MAAM,OAAO,GAAY,IAAI,OAAO,EAAE,CAAC;AAEvC,OAAO;KACJ,IAAI,CAAC,SAAS,CAAC;KACf,WAAW,CAAC,oDAAoD,CAAC;KACjE,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,uBAAuB,CAAC,OAAO,CAAC,CAAC;AACjC,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,uBAAuB,CAAC,OAAO,CAAC,CAAC;AAEjC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IAC7C,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,CAAC;IAClC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@grackle-ai/cli",
|
|
3
|
+
"version": "0.0.2",
|
|
4
|
+
"description": "Command-line interface for managing Grackle environments and agents",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "https://github.com/nick-pape/grackle.git",
|
|
9
|
+
"directory": "packages/cli"
|
|
10
|
+
},
|
|
11
|
+
"keywords": [
|
|
12
|
+
"grackle",
|
|
13
|
+
"cli",
|
|
14
|
+
"grpc",
|
|
15
|
+
"ai-agents"
|
|
16
|
+
],
|
|
17
|
+
"engines": {
|
|
18
|
+
"node": ">=22.0.0"
|
|
19
|
+
},
|
|
20
|
+
"type": "module",
|
|
21
|
+
"main": "dist/index.js",
|
|
22
|
+
"types": "dist/index.d.ts",
|
|
23
|
+
"bin": {
|
|
24
|
+
"grackle": "dist/index.js"
|
|
25
|
+
},
|
|
26
|
+
"files": [
|
|
27
|
+
"dist/"
|
|
28
|
+
],
|
|
29
|
+
"dependencies": {
|
|
30
|
+
"@connectrpc/connect": "^2.0.0",
|
|
31
|
+
"@connectrpc/connect-node": "^2.0.0",
|
|
32
|
+
"@grackle-ai/common": "0.0.2",
|
|
33
|
+
"@grackle-ai/server": "0.0.2",
|
|
34
|
+
"chalk": "^5.6.2",
|
|
35
|
+
"cli-table3": "^0.6.0",
|
|
36
|
+
"commander": "^13.0.0",
|
|
37
|
+
"ora": "^8.0.0"
|
|
38
|
+
},
|
|
39
|
+
"devDependencies": {
|
|
40
|
+
"@grackle-ai/heft-rig": "0.0.1",
|
|
41
|
+
"@types/node": "^22.0.0"
|
|
42
|
+
},
|
|
43
|
+
"scripts": {
|
|
44
|
+
"build": "heft build --clean",
|
|
45
|
+
"start": "node dist/index.js",
|
|
46
|
+
"clean": "heft clean"
|
|
47
|
+
}
|
|
48
|
+
}
|