@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.
Files changed (42) hide show
  1. package/README.md +5 -0
  2. package/dist/client.d.ts +5 -0
  3. package/dist/client.d.ts.map +1 -0
  4. package/dist/client.js +35 -0
  5. package/dist/client.js.map +1 -0
  6. package/dist/commands/agent.d.ts +4 -0
  7. package/dist/commands/agent.d.ts.map +1 -0
  8. package/dist/commands/agent.js +115 -0
  9. package/dist/commands/agent.js.map +1 -0
  10. package/dist/commands/env.d.ts +4 -0
  11. package/dist/commands/env.d.ts.map +1 -0
  12. package/dist/commands/env.js +127 -0
  13. package/dist/commands/env.js.map +1 -0
  14. package/dist/commands/findings.d.ts +3 -0
  15. package/dist/commands/findings.d.ts.map +1 -0
  16. package/dist/commands/findings.js +58 -0
  17. package/dist/commands/findings.js.map +1 -0
  18. package/dist/commands/logs.d.ts +4 -0
  19. package/dist/commands/logs.d.ts.map +1 -0
  20. package/dist/commands/logs.js +60 -0
  21. package/dist/commands/logs.js.map +1 -0
  22. package/dist/commands/project.d.ts +3 -0
  23. package/dist/commands/project.d.ts.map +1 -0
  24. package/dist/commands/project.js +48 -0
  25. package/dist/commands/project.js.map +1 -0
  26. package/dist/commands/serve.d.ts +4 -0
  27. package/dist/commands/serve.d.ts.map +1 -0
  28. package/dist/commands/serve.js +17 -0
  29. package/dist/commands/serve.js.map +1 -0
  30. package/dist/commands/task.d.ts +3 -0
  31. package/dist/commands/task.d.ts.map +1 -0
  32. package/dist/commands/task.js +108 -0
  33. package/dist/commands/task.js.map +1 -0
  34. package/dist/commands/token.d.ts +4 -0
  35. package/dist/commands/token.d.ts.map +1 -0
  36. package/dist/commands/token.js +69 -0
  37. package/dist/commands/token.js.map +1 -0
  38. package/dist/index.d.ts +3 -0
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +28 -0
  41. package/dist/index.js.map +1 -0
  42. package/package.json +48 -0
package/README.md ADDED
@@ -0,0 +1,5 @@
1
+ # @grackle-ai/cli
2
+
3
+ Command-line interface for managing Grackle environments and agents.
4
+
5
+ See the [main repository](https://github.com/nick-pape/grackle) for full documentation.
@@ -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,4 @@
1
+ import type { Command } from "commander";
2
+ /** Register agent-related commands: `spawn`, `resume`, `status`, `kill`, and `attach`. */
3
+ export declare function registerAgentCommands(program: Command): void;
4
+ //# sourceMappingURL=agent.d.ts.map
@@ -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,4 @@
1
+ import type { Command } from "commander";
2
+ /** Register environment management commands: `env list`, `add`, `provision`, `stop`, `destroy`, `remove`, `wake`. */
3
+ export declare function registerEnvCommands(program: Command): void;
4
+ //# sourceMappingURL=env.d.ts.map
@@ -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,3 @@
1
+ import type { Command } from "commander";
2
+ export declare function registerFindingCommands(program: Command): void;
3
+ //# sourceMappingURL=findings.d.ts.map
@@ -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,4 @@
1
+ import type { Command } from "commander";
2
+ /** Register the `logs` command for viewing session logs, transcripts, and live tailing. */
3
+ export declare function registerLogCommands(program: Command): void;
4
+ //# sourceMappingURL=logs.d.ts.map
@@ -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,3 @@
1
+ import type { Command } from "commander";
2
+ export declare function registerProjectCommands(program: Command): void;
3
+ //# sourceMappingURL=project.d.ts.map
@@ -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,4 @@
1
+ import type { Command } from "commander";
2
+ /** Register the `serve` command that starts the Grackle server and web UI. */
3
+ export declare function registerServeCommand(program: Command): void;
4
+ //# sourceMappingURL=serve.d.ts.map
@@ -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,3 @@
1
+ import type { Command } from "commander";
2
+ export declare function registerTaskCommands(program: Command): void;
3
+ //# sourceMappingURL=task.d.ts.map
@@ -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,4 @@
1
+ import type { Command } from "commander";
2
+ /** Register the `token set` and `token list` subcommands on the CLI program. */
3
+ export declare function registerTokenCommands(program: Command): void;
4
+ //# sourceMappingURL=token.d.ts.map
@@ -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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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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
+ }