@elpapi42/pi-fleet-cli 0.2.1 → 0.3.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 CHANGED
@@ -18,4 +18,4 @@ pif create named --cwd "$PWD" -- --session-id my-session
18
18
 
19
19
  Arguments after `--` pass through to Pi. Pi-fleet adds `--mode rpc` and rejects `--mode` and `--no-session`. Pi owns session lookup, working-directory selection, prompts, and failures.
20
20
 
21
- Commands emit compact JSONL. Slice 1 supports Unix-like hosts with ZeroMQ `ipc://` support. It provides `create`, `list`, and `status`. Sending work, event streaming, recovery, retirement, compact, and destroy come in later slices.
21
+ Commands print human-readable output. Use `pif --help` or `pif COMMAND --help` for generated usage. This CLI requires Node.js 22.12 or later. Slice 1 supports Unix-like hosts with ZeroMQ `ipc://` support. It provides `create`, `list`, and `status`. Sending work, event streaming, recovery, retirement, compact, and destroy come in later slices.
package/dist/main.js CHANGED
@@ -1,66 +1,85 @@
1
1
  #!/usr/bin/env node
2
- import { connectPiFleet, version } from "@elpapi42/pi-fleet-sdk";
3
- const usage = `pi-fleet CLI ${version}
4
-
5
- Usage:
6
- pif create NAME [INSTRUCTIONS] [--cwd PATH] [-- PI_ARGS...]
7
- pif status NAME
8
- pif list
9
- pif --help
10
-
11
- Arguments after -- pass through to Pi.
12
- Pi-fleet manages --mode and --no-session.`;
13
- async function main(args) {
14
- if (args.length === 0 || args[0] === "--help" || args[0] === "-h") {
15
- console.log(usage);
16
- return;
17
- }
2
+ import { Command } from "commander";
3
+ import { connectPiFleet } from "@elpapi42/pi-fleet-sdk";
4
+ const version = "0.3.0";
5
+ function splitPiArgs(args) {
6
+ const separator = args.indexOf("--");
7
+ if (separator < 0)
8
+ return { pifArgs: args, piArgs: [] };
9
+ return {
10
+ pifArgs: args.slice(0, separator),
11
+ piArgs: args.slice(separator + 1),
12
+ };
13
+ }
14
+ function printAgent(id, name, state) {
15
+ console.log(`ID: ${id}`);
16
+ console.log(`Name: ${name}`);
17
+ console.log(`State: ${state}`);
18
+ }
19
+ async function withClient(action) {
18
20
  const client = await connectPiFleet();
19
21
  try {
20
- switch (args[0]) {
21
- case "create": {
22
- const [name, ...remaining] = args.slice(1);
23
- if (!name)
24
- throw new Error("Usage: pif create NAME [INSTRUCTIONS] [--cwd PATH] [-- PI_ARGS...]");
25
- const instructions = remaining[0] && !remaining[0].startsWith("--") ? remaining.shift() : undefined;
26
- const separator = remaining.indexOf("--");
27
- const options = separator < 0 ? remaining : remaining.slice(0, separator);
28
- const piArgs = separator < 0 ? [] : remaining.slice(separator + 1);
29
- const cwdIndex = options.indexOf("--cwd");
30
- if (cwdIndex >= 0 && (cwdIndex + 1 >= options.length || options.length !== 2)) {
31
- throw new Error("Usage: pif create NAME [INSTRUCTIONS] [--cwd PATH] [-- PI_ARGS...]");
32
- }
33
- if (cwdIndex < 0 && options.length !== 0)
34
- throw new Error("Usage: pif create NAME [INSTRUCTIONS] [--cwd PATH] [-- PI_ARGS...]");
35
- const cwd = cwdIndex < 0 ? process.cwd() : options[cwdIndex + 1];
36
- const agent = await client.create({ name, instructions, cwd, piArgs });
37
- console.log(JSON.stringify({ id: agent.id, name: agent.name }));
38
- return;
39
- }
40
- case "status": {
41
- const name = args[1];
42
- if (!name || args.length !== 2)
43
- throw new Error("Usage: pif status NAME");
44
- console.log(JSON.stringify(await (await client.get(name)).status()));
45
- return;
46
- }
47
- case "list":
48
- if (args.length !== 1)
49
- throw new Error("Usage: pif list");
50
- for (const agent of await client.list())
51
- console.log(JSON.stringify(agent));
52
- return;
53
- default:
54
- throw new Error(`Unknown command: ${args[0]}`);
55
- }
22
+ return await action(client);
56
23
  }
57
24
  finally {
58
25
  await client.close();
59
26
  }
60
27
  }
28
+ function createProgram(piArgs) {
29
+ const program = new Command();
30
+ program
31
+ .name("pif")
32
+ .description("Manage durable, host-local Pi agents")
33
+ .version(version)
34
+ .showSuggestionAfterError()
35
+ .showHelpAfterError();
36
+ program
37
+ .command("create <name> [instructions]")
38
+ .description("Create a durable Pi agent")
39
+ .option("--cwd <path>", "working directory", process.cwd())
40
+ .addHelpText("after", "\nArguments after -- pass through to Pi.")
41
+ .action(async (name, instructions, options) => {
42
+ const agent = await withClient((client) => client.create({ name, instructions, cwd: options.cwd, piArgs }));
43
+ console.log(`Created agent ${agent.name}`);
44
+ printAgent(agent.id, agent.name, "idle");
45
+ });
46
+ program
47
+ .command("status <name>")
48
+ .description("Show an agent's current state")
49
+ .action(async (name) => {
50
+ const status = await withClient(async (client) => (await client.get(name)).status());
51
+ printAgent(status.id, status.name, status.state);
52
+ });
53
+ program
54
+ .command("list")
55
+ .description("List durable Pi agents")
56
+ .action(async () => {
57
+ const agents = await withClient((client) => client.list());
58
+ if (agents.length === 0) {
59
+ console.log("No agents.");
60
+ return;
61
+ }
62
+ console.log("NAME\tID\tSTATE");
63
+ for (const agent of agents)
64
+ console.log(`${agent.name}\t${agent.id}\t${agent.state}`);
65
+ });
66
+ return program;
67
+ }
68
+ async function main(args) {
69
+ const { pifArgs, piArgs } = splitPiArgs(args);
70
+ const program = createProgram(piArgs);
71
+ if (piArgs.length > 0 && pifArgs[0] !== "create") {
72
+ program.error("Arguments after -- are supported only by pif create");
73
+ }
74
+ if (pifArgs.length === 0) {
75
+ program.help();
76
+ return;
77
+ }
78
+ await program.parseAsync(["node", "pif", ...pifArgs]);
79
+ }
61
80
  void main(process.argv.slice(2)).catch((error) => {
62
81
  const message = error instanceof Error ? error.message : String(error);
63
- process.stderr.write(`${JSON.stringify({ error: message })}\n`);
82
+ console.error(message);
64
83
  process.exitCode = 1;
65
84
  });
66
85
  //# sourceMappingURL=main.js.map
package/dist/main.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAA;AAEhE,MAAM,KAAK,GAAG,gBAAgB,OAAO;;;;;;;;;0CASK,CAAA;AAE1C,KAAK,UAAU,IAAI,CAAC,IAAc;IAChC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAClE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;QAClB,OAAM;IACR,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,cAAc,EAAE,CAAA;IACrC,IAAI,CAAC;QACH,QAAQ,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YAChB,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,MAAM,CAAC,IAAI,EAAE,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;gBAC1C,IAAI,CAAC,IAAI;oBAAE,MAAM,IAAI,KAAK,CAAC,oEAAoE,CAAC,CAAA;gBAChG,MAAM,YAAY,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAA;gBACnG,MAAM,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;gBACzC,MAAM,OAAO,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAA;gBACzE,MAAM,MAAM,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAA;gBAClE,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;gBACzC,IAAI,QAAQ,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;oBAC9E,MAAM,IAAI,KAAK,CAAC,oEAAoE,CAAC,CAAA;gBACvF,CAAC;gBACD,IAAI,QAAQ,GAAG,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;oBAAE,MAAM,IAAI,KAAK,CAAC,oEAAoE,CAAC,CAAA;gBAC/H,MAAM,GAAG,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAA;gBAChE,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAA;gBACtE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;gBAC/D,OAAM;YACR,CAAC;YACD,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;gBACpB,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;oBAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAA;gBACzE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;gBACpE,OAAM;YACR,CAAC;YACD,KAAK,MAAM;gBACT,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;oBAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAA;gBACzD,KAAK,MAAM,KAAK,IAAI,MAAM,MAAM,CAAC,IAAI,EAAE;oBAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAA;gBAC3E,OAAM;YACR;gBACE,MAAM,IAAI,KAAK,CAAC,oBAAoB,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;QAClD,CAAC;IACH,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAA;IACtB,CAAC;AACH,CAAC;AAED,KAAK,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IAC/C,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IACtE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,IAAI,CAAC,CAAA;IAC/D,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAA;AACtB,CAAC,CAAC,CAAA"}
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@elpapi42/pi-fleet-cli",
3
- "version": "0.2.1",
3
+ "version": "0.3.0",
4
4
  "description": "CLI for durable, host-local Pi agents",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -10,7 +10,7 @@
10
10
  },
11
11
  "type": "module",
12
12
  "engines": {
13
- "node": ">=22"
13
+ "node": ">=22.12.0"
14
14
  },
15
15
  "bin": {
16
16
  "pif": "./dist/main.js"
@@ -24,6 +24,7 @@
24
24
  "test": "node --test test/*.test.mjs"
25
25
  },
26
26
  "dependencies": {
27
- "@elpapi42/pi-fleet-sdk": "0.2.1"
27
+ "@elpapi42/pi-fleet-sdk": "0.2.1",
28
+ "commander": "15.0.0"
28
29
  }
29
30
  }