workplane 0.3.0 → 0.4.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
@@ -2,16 +2,14 @@
2
2
 
3
3
  [![website](https://img.shields.io/badge/website-mindstaq.github.io%2Fworkplane-3dd6c6)](https://mindstaq.github.io/workplane/)
4
4
  [![npm version](https://img.shields.io/npm/v/workplane)](https://www.npmjs.com/package/workplane)
5
- [![status](https://img.shields.io/badge/status-beta-orange)](https://github.com/MindStaq/workplane)
5
+ [![status](https://img.shields.io/badge/status-alpha-orange)](https://github.com/MindStaq/workplane)
6
6
  [![license](https://img.shields.io/npm/l/workplane)](https://github.com/MindStaq/workplane/blob/main/packages/workplane/LICENSE)
7
7
 
8
- > **Beta** — Workplane v0.1.x is under active development. APIs, CLI commands, and deployment expectations may change. Not recommended for production workloads yet.
8
+ > **Alpha software.** APIs and data models are unstable and will change between releases. Not recommended for production use.
9
9
 
10
- Route durable work—shell commands, local inference (Ollama), and batch agent harness jobs (Aider, Codex, Claude Code)—to capable machines on your private network.
10
+ Route durable work to capable nodes on your private network. Compose multi-step AI workplans that mix local Ollama with frontier APIs. Supports shell commands, local inference, and AI coding agents (Codex, Claude Code, Aider) — both **batch** (one-shot) and **interactive** (multi-turn PTY/stdin sessions mediated through the control plane with no direct client-to-node connection).
11
11
 
12
- Workplane is a control plane + polling node runtime backed by Postgres and [DBOS](https://www.dbos.dev/). You submit tasks from a CLI; nodes pull work, run it in isolated workspaces, and report logs and artifacts.
13
-
14
- **Requires Node.js 20+** and **Postgres**.
12
+ **Requires Node.js 20+.**
15
13
 
16
14
  ## Install
17
15
 
@@ -19,117 +17,206 @@ Workplane is a control plane + polling node runtime backed by Postgres and [DBOS
19
17
  npm install -g workplane
20
18
  ```
21
19
 
22
- ### Binaries
23
-
24
- | Command | Purpose |
25
- |---------|---------|
26
- | `workplane` | CLI — submit and inspect tasks |
20
+ | Binary | Purpose |
21
+ |--------|---------|
22
+ | `workplane-setup` | First-run wizard — configure and migrate in one step |
23
+ | `workplane` | CLI — skills, workplans, fleet task submit/inspect |
27
24
  | `workplane-server` | Control plane API |
28
25
  | `workplane-node` | Worker that polls and executes tasks |
29
- | `workplane-db-migrate` | Apply database schema |
26
+ | `workplane-db-migrate` | Apply schema (called automatically by `workplane-setup`) |
30
27
 
31
- ## Quick start (single machine)
28
+ ## Quick start — skills (no server needed)
32
29
 
33
- **1. Postgres** — running locally or reachable via `DATABASE_URL`.
34
-
35
- **2. Environment** — create a `.env` file or export:
30
+ Run built-in AI skills directly on your machine. No server, no database, no configuration required.
36
31
 
37
32
  ```bash
38
- export DATABASE_URL=postgres://postgres:postgres@localhost:5432/workplane
39
- export WORKPLANE_SERVER_URL=http://localhost:8787
33
+ export ANTHROPIC_API_KEY=... # for frontier model steps
34
+ export OLLAMA_HOST=http://localhost:11434 # optional; shown is the default
40
35
 
41
- # Recommended when the server is not localhost-only:
42
- export WORKPLANE_NODE_TOKEN=your-node-secret
43
- export WORKPLANE_OPERATOR_TOKEN=your-operator-secret
36
+ workplane skill list
37
+ workplane skill run summarize-file --file ./README.md
38
+ workplane skill run code-review --repo . --model claude-haiku-4-5-20251001
44
39
  ```
45
40
 
46
- **3. Migrate, server, node** (three terminals):
41
+ ## Quick start — fleet (single machine)
47
42
 
48
43
  ```bash
49
- workplane-db-migrate
44
+ # 1. Run setup — interactive wizard, press Enter to accept smart defaults
45
+ workplane-setup
46
+
47
+ # 2. Start the control plane and a worker (two terminals)
50
48
  workplane-server
51
49
  workplane-node
52
- ```
53
-
54
- **4. Submit a task** (fourth terminal):
55
-
56
- ```bash
57
- export WORKPLANE_OPERATOR_TOKEN=your-operator-secret # if auth enabled on server
58
50
 
51
+ # 3. Submit work (third terminal)
59
52
  workplane task submit shell --command "echo hello"
60
53
  workplane tasks
61
- workplane runs
62
54
  workplane logs <runId>
63
55
  ```
64
56
 
57
+ `workplane-setup` configures tokens, picks a database, and runs migrations. The default database is SQLite at `~/.workplane/workplane.db` — no Postgres required for a single-machine fleet. Run `workplane-setup` again at any time to reconfigure.
58
+
59
+ ### Switching to Postgres
60
+
61
+ Re-run setup and enter a Postgres URL when prompted:
62
+
63
+ ```bash
64
+ workplane-setup
65
+ # DATABASE_URL [sqlite://~/.workplane/workplane.db]: postgres://user:pass@host:5432/workplane
66
+ ```
67
+
68
+ Postgres is recommended when running multiple server instances or when you need managed backups.
69
+
65
70
  ## Authentication
66
71
 
67
- When `WORKPLANE_NODE_TOKEN` is set on the **server**, every node must use the same value. When `WORKPLANE_OPERATOR_TOKEN` is set, the CLI must send it for `task submit`, `retry`, and `cancel`.
72
+ `workplane-setup` generates tokens automatically. To set them manually:
68
73
 
69
74
  | Variable | Used by |
70
75
  |----------|---------|
71
- | `WORKPLANE_NODE_TOKEN` | `workplane-node` |
72
- | `WORKPLANE_OPERATOR_TOKEN` | `workplane` CLI (mutating commands) |
76
+ | `WORKPLANE_NODE_TOKEN` | `workplane-node` (must match the server's value) |
77
+ | `WORKPLANE_OPERATOR_TOKEN` | `workplane` CLI — task submit, retry, cancel |
73
78
 
74
- Read-only CLI commands (`tasks`, `logs`, `runs`, …) work without the operator token unless you add stricter rules in your deployment.
79
+ Read-only commands (`tasks`, `logs`, `runs`, …) work without the operator token.
75
80
 
76
- ## CLI examples
81
+ ## CLI reference
77
82
 
78
83
  ```bash
79
- # Shell
84
+ export WORKPLANE_OPERATOR_TOKEN=... # set once; stored in ~/.workplane/.env by setup
85
+
86
+ # Shell task
80
87
  workplane task submit shell --command "npm test" \
81
- --repo https://github.com/you/your-repo.git
88
+ --repo https://github.com/you/repo.git --requires shell,git
82
89
 
83
90
  # Local inference (node must advertise ollama capability)
84
- workplane task submit inference --model llama3.2 --prompt "Say hello"
91
+ workplane task submit inference --model llama3.2 --prompt "Summarise this"
85
92
 
86
- # Agent harness (node must have codex or claude-code installed)
87
- workplane task submit harness --harness codex \
93
+ # Batch agent (one-shot)
94
+ workplane task submit harness --harness claude-code \
88
95
  --repo git@github.com:you/app.git \
89
- --prompt "Fix failing tests"
96
+ --prompt "Refactor auth middleware" --requires claude-code,git
90
97
 
91
- workplane task submit aider \
98
+ # Interactive agent (multi-turn PTY/stdin session)
99
+ workplane task submit harness --harness claude-code \
92
100
  --repo git@github.com:you/app.git \
93
- --prompt "Fix the bug" \
94
- --test-command "npm test"
95
-
96
- workplane task retry <taskId>
97
- workplane task cancel <taskId>
101
+ --prompt "Start exploring the codebase" \
102
+ --interactive --requires claude-code,git
103
+
104
+ # Send input to a running interactive session
105
+ workplane run input <runId> --stdin "Focus on the auth module"
106
+ workplane run input <runId> --signal SIGINT
107
+ workplane run input <runId> --resize 220x50
108
+
109
+ # Skills
110
+ workplane skill list
111
+ workplane skill run code-review --repo . --model claude-haiku-4-5-20251001
112
+
113
+ # Inspect
114
+ workplane tasks [--status running]
115
+ workplane runs --task-id <taskId>
116
+ workplane run show <runId>
117
+ workplane logs <runId>
98
118
  workplane artifacts <runId>
119
+ workplane task cancel <taskId>
120
+ workplane task retry <taskId>
121
+ ```
122
+
123
+ ## Workplans
124
+
125
+ Compose multi-step AI pipelines with the `@workplane/workplans` DSL:
126
+
127
+ ```ts
128
+ import { SequentialWorkplanRunner, LocalWorkplanContext } from "@workplane/workplans";
129
+
130
+ const plan = {
131
+ id: "review", name: "Code Review",
132
+ steps: [
133
+ {
134
+ id: "diff", adapter: "shell", provider: "shell",
135
+ payload: { command: "git diff HEAD~1", cwd: "./my-repo" },
136
+ output: { dest: "next" },
137
+ },
138
+ {
139
+ id: "summarize", adapter: "ollama", provider: "ollama", model: "llama3",
140
+ payload: { prompt: "Summarize these changes:\n{{prevOutput}}" },
141
+ output: { dest: "next" },
142
+ },
143
+ {
144
+ id: "critique", adapter: "anthropic", provider: "anthropic",
145
+ model: "claude-haiku-4-5-20251001",
146
+ payload: { prompt: "Review for correctness and security:\n{{prevOutput}}" },
147
+ },
148
+ ],
149
+ };
150
+
151
+ await new SequentialWorkplanRunner().run(plan, new LocalWorkplanContext());
152
+ ```
153
+
154
+ Inline providers (`anthropic`, `openai`, `ollama`, `shell`, `file`) run without dispatching to a fleet node.
155
+
156
+ ## Agent skills
157
+
158
+ Pre-built workplans via `@workplane/agent-skills`:
159
+
160
+ ```ts
161
+ import { createDefaultRegistry } from "@workplane/agent-skills";
162
+ import { SequentialWorkplanRunner, LocalWorkplanContext } from "@workplane/workplans";
163
+
164
+ const skill = createDefaultRegistry().get("code-review");
165
+ const plan = skill.buildPlan({ repo: ".", model: "claude-haiku-4-5-20251001" });
166
+ await new SequentialWorkplanRunner().run(plan, new LocalWorkplanContext());
99
167
  ```
100
168
 
169
+ Or via CLI: `workplane skill run code-review --repo . --model claude-haiku-4-5-20251001`
170
+
101
171
  ## Node capabilities
102
172
 
103
- Register capabilities when starting a node:
173
+ Nodes advertise what they can run. Tasks declare what they need.
104
174
 
105
175
  ```bash
106
176
  export WORKPLANE_NODE_CAPABILITIES=shell,git,ollama,aider,codex,claude-code
107
177
  workplane-node
108
178
  ```
109
179
 
110
- Tasks declare `requires`; the control plane assigns work to a node whose capabilities are a superset.
111
-
112
- | Adapter | Typical capabilities |
113
- |---------|----------------------|
114
- | Shell | `shell` |
115
- | Ollama | `ollama` |
116
- | Aider | `git`, `aider` |
117
- | Codex | `git`, `codex` |
118
- | Claude Code | `git`, `claude-code` |
180
+ | Adapter | Capability tags | Modes |
181
+ |---------|----------------|-------|
182
+ | Shell | `shell` | batch |
183
+ | Ollama | `ollama` | batch |
184
+ | Aider | `aider`, `git` | batch |
185
+ | Codex | `codex`, `git` | batch, interactive (stdio) |
186
+ | Claude Code | `claude-code`, `git` | batch, interactive (PTY) |
119
187
 
120
188
  Override harness binaries: `WORKPLANE_CODEX_BIN`, `WORKPLANE_CLAUDE_CODE_BIN`.
121
189
 
122
190
  ## Personal fleet (home + office)
123
191
 
124
- Run the control plane on an always-on host (VPS, NAS, or home server). Run nodes on each machine where tools or GPUs live. Connect machines with Tailscale, WireGuard, or a trusted LAN.
192
+ Run the control plane on an always-on host (VPS, NAS, or home server). Run nodes on each machine where tools or GPUs live. Nodes poll outbound — no inbound ports required on workers. Use Tailscale, WireGuard, or a trusted LAN.
125
193
 
126
- Set `WORKPLANE_SERVER_URL` to the control plane’s reachable URL on every node and CLI client.
194
+ On each machine, run `workplane-setup` and set `WORKPLANE_SERVER_URL` to the control plane's reachable address.
127
195
 
128
- Full deployment guide: [github.com/MindStaq/workplane/blob/main/docs/deployment/FLEET.md](https://github.com/MindStaq/workplane/blob/main/docs/deployment/FLEET.md)
196
+ Full deployment guide: [docs/deployment/FLEET.md](https://github.com/MindStaq/workplane/blob/main/docs/deployment/FLEET.md)
197
+
198
+ ## Library packages
199
+
200
+ All packages are published under `@workplane/` and can be imported independently:
201
+
202
+ | Package | Purpose |
203
+ |---------|---------|
204
+ | `@workplane/workplans` | Workplan DSL, sequential runner, inline providers |
205
+ | `@workplane/agent-skills` | Pre-built skills, SkillRegistry, CanonicalSkillWorkflow |
206
+ | `@workplane/adapter-sdk` | Build custom adapters — WorkAdapter, WorkContext, cancellable exec |
207
+ | `@workplane/types` | Shared TypeScript types |
208
+ | `@workplane/core` | Config, HTTP client, auth, git utilities |
209
+ | `@workplane/adapter-shell` | Shell command adapter |
210
+ | `@workplane/adapter-ollama` | Ollama inference adapter |
211
+ | `@workplane/adapter-aider` | Aider coding agent adapter |
212
+ | `@workplane/adapter-harness` | Base harness adapter |
213
+ | `@workplane/adapter-claude-code` | Claude Code adapter (PTY interactive) |
214
+ | `@workplane/adapter-codex` | Codex adapter (stdio interactive) |
215
+ | `@workplane/dbos` | Optional DBOS durability layer (step checkpointing + replay) |
129
216
 
130
217
  ## Documentation
131
218
 
132
- - [v0.1.0 specification](https://github.com/MindStaq/workplane/blob/main/docs/specs/v0.1.0/WORKPLANE_SPEC.md)
219
+ - [v0.3.0 specification](https://github.com/MindStaq/workplane/blob/main/docs/specs/v0.3.0/WORKPLANE_SPEC.md)
133
220
  - [Source repository](https://github.com/MindStaq/workplane)
134
221
  - [Issues](https://github.com/MindStaq/workplane/issues)
135
222
 
package/dist/cli.js CHANGED
@@ -108,13 +108,16 @@ var init_file = __esm({
108
108
 
109
109
  // ../core/src/env.ts
110
110
  import { config as dotenvConfig } from "dotenv";
111
+ import { homedir } from "os";
112
+ import { join } from "path";
111
113
  var envLoaded = false;
112
114
  function loadLocalEnv() {
113
115
  if (envLoaded) {
114
116
  return;
115
117
  }
118
+ dotenvConfig({ path: ".env.local" });
119
+ dotenvConfig({ path: join(homedir(), ".workplane", ".env") });
116
120
  dotenvConfig({ path: ".env" });
117
- dotenvConfig({ path: ".env.local", override: true });
118
121
  envLoaded = true;
119
122
  }
120
123
 
@@ -122,7 +125,7 @@ function loadLocalEnv() {
122
125
  import { z } from "zod";
123
126
  loadLocalEnv();
124
127
  var serverEnvSchema = z.object({
125
- DATABASE_URL: z.string().min(1),
128
+ DATABASE_URL: z.string().optional().default("sqlite://~/.workplane/workplane.db"),
126
129
  WORKPLANE_SERVER_PORT: z.string().optional().default("8787").transform((value) => Number.parseInt(value, 10)),
127
130
  WORKPLANE_NODE_TOKEN: z.string().optional(),
128
131
  WORKPLANE_OPERATOR_TOKEN: z.string().optional(),
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../../workplans/src/providers/anthropic.ts","../../workplans/src/providers/openai.ts","../../workplans/src/providers/ollama.ts","../../workplans/src/providers/shell.ts","../../workplans/src/providers/file.ts","../../core/src/env.ts","../../core/src/config.ts","../../core/src/auth.ts","../../core/src/http-client.ts","../../agent-skills/src/skills/code-review.ts","../../agent-skills/src/skills/summarize-file.ts","../../agent-skills/src/skills/index.ts","../../workplans/src/template.ts","../../workplans/src/runner.ts","../../workplans/src/sinks/stdout.ts","../../workplans/src/context.ts","../../cli/src/index.ts"],"sourcesContent":["import Anthropic from \"@anthropic-ai/sdk\";\n\nexport interface AnthropicStepOptions {\n model: string;\n prompt: string;\n apiKey?: string;\n}\n\nexport async function runAnthropicStep(opts: AnthropicStepOptions): Promise<string> {\n const client = new Anthropic({ apiKey: opts.apiKey ?? process.env.ANTHROPIC_API_KEY });\n const message = await client.messages.create({\n model: opts.model,\n max_tokens: 4096,\n messages: [{ role: \"user\", content: opts.prompt }],\n });\n const block = message.content[0];\n return block.type === \"text\" ? block.text : \"\";\n}\n","import OpenAI from \"openai\";\n\nexport interface OpenAIStepOptions {\n model: string;\n prompt: string;\n apiKey?: string;\n}\n\nexport async function runOpenAIStep(opts: OpenAIStepOptions): Promise<string> {\n const client = new OpenAI({ apiKey: opts.apiKey ?? process.env.OPENAI_API_KEY });\n const completion = await client.chat.completions.create({\n model: opts.model,\n messages: [{ role: \"user\", content: opts.prompt }],\n });\n return completion.choices[0]?.message.content ?? \"\";\n}\n","import { Ollama } from \"ollama\";\n\nexport interface OllamaStepOptions {\n model: string;\n prompt: string;\n host?: string;\n}\n\nexport async function runOllamaStep(opts: OllamaStepOptions): Promise<string> {\n const host = opts.host ?? process.env.OLLAMA_HOST ?? \"http://localhost:11434\";\n const client = new Ollama({ host });\n const response = await client.generate({ model: opts.model, prompt: opts.prompt });\n return response.response;\n}\n","import { exec } from \"node:child_process\";\nimport { promisify } from \"node:util\";\n\nconst execAsync = promisify(exec);\n\nexport interface ShellStepOptions {\n command: string;\n cwd?: string;\n}\n\nexport async function runShellStep(opts: ShellStepOptions): Promise<string> {\n const { stdout } = await execAsync(opts.command, {\n cwd: opts.cwd,\n maxBuffer: 10 * 1024 * 1024,\n });\n return stdout;\n}\n","import { readFile } from \"node:fs/promises\";\n\nexport interface FileStepOptions {\n path: string;\n encoding?: BufferEncoding;\n}\n\nexport async function runFileStep(opts: FileStepOptions): Promise<string> {\n return readFile(opts.path, opts.encoding ?? \"utf8\");\n}\n","import { config as dotenvConfig } from \"dotenv\";\n\nlet envLoaded = false;\n\nexport function loadLocalEnv(): void {\n if (envLoaded) {\n return;\n }\n\n dotenvConfig({ path: \".env\" });\n dotenvConfig({ path: \".env.local\", override: true });\n\n envLoaded = true;\n}\n\n","import { z } from \"zod\";\nimport { loadLocalEnv } from \"./env.js\";\n\nloadLocalEnv();\n\nconst serverEnvSchema = z.object({\n DATABASE_URL: z.string().min(1),\n WORKPLANE_SERVER_PORT: z\n .string()\n .optional()\n .default(\"8787\")\n .transform((value) => Number.parseInt(value, 10)),\n WORKPLANE_NODE_TOKEN: z.string().optional(),\n WORKPLANE_OPERATOR_TOKEN: z.string().optional(),\n WORKPLANE_ENV_ALLOWLIST: z.string().optional(),\n});\n\nconst nodeEnvSchema = z.object({\n WORKPLANE_SERVER_URL: z.string().url().optional().default(\"http://localhost:8787\"),\n WORKPLANE_NODE_NAME: z.string().optional().default(\"local-node-1\"),\n WORKPLANE_NODE_ID: z.string().optional(),\n WORKPLANE_NODE_CAPABILITIES: z\n .string()\n .optional()\n .default(\"shell,git,node,typescript,aider,ollama,codex,claude-code\"),\n WORKPLANE_NODE_TOKEN: z.string().optional(),\n WORKPLANE_POLL_INTERVAL_MS: z\n .string()\n .optional()\n .default(\"3000\")\n .transform((value) => Number.parseInt(value, 10)),\n WORKPLANE_ENV_ALLOWLIST: z.string().optional(),\n});\n\nexport interface ServerConfig {\n databaseUrl: string;\n port: number;\n nodeToken?: string;\n operatorToken?: string;\n envAllowlist: string[];\n}\n\nexport interface NodeConfig {\n serverUrl: string;\n nodeName: string;\n nodeId?: string;\n nodeCapabilities: string[];\n nodeToken?: string;\n pollIntervalMs: number;\n envAllowlist: string[];\n}\n\nexport function loadServerConfig(env: NodeJS.ProcessEnv = process.env): ServerConfig {\n const parsed = serverEnvSchema.parse(env);\n\n return {\n databaseUrl: parsed.DATABASE_URL,\n port: parsed.WORKPLANE_SERVER_PORT,\n nodeToken: parsed.WORKPLANE_NODE_TOKEN,\n operatorToken: parsed.WORKPLANE_OPERATOR_TOKEN,\n envAllowlist: parseCsv(parsed.WORKPLANE_ENV_ALLOWLIST ?? \"\"),\n };\n}\n\nexport function loadNodeConfig(env: NodeJS.ProcessEnv = process.env): NodeConfig {\n const parsed = nodeEnvSchema.parse(env);\n\n return {\n serverUrl: parsed.WORKPLANE_SERVER_URL,\n nodeName: parsed.WORKPLANE_NODE_NAME,\n nodeId: parsed.WORKPLANE_NODE_ID,\n nodeCapabilities: parseCsv(parsed.WORKPLANE_NODE_CAPABILITIES),\n nodeToken: parsed.WORKPLANE_NODE_TOKEN,\n pollIntervalMs: parsed.WORKPLANE_POLL_INTERVAL_MS,\n envAllowlist: parseCsv(parsed.WORKPLANE_ENV_ALLOWLIST ?? \"\"),\n };\n}\n\nexport function parseCsv(value: string): string[] {\n return value\n .split(\",\")\n .map((entry) => entry.trim())\n .filter(Boolean);\n}\n","import type { IncomingMessage } from \"node:http\";\n\nexport function parseBearerToken(authorizationHeader: string | undefined): string | undefined {\n if (!authorizationHeader) {\n return undefined;\n }\n const match = /^Bearer\\s+(.+)$/i.exec(authorizationHeader.trim());\n return match?.[1];\n}\n\nexport function isAuthorizedBearer(provided: string | undefined, expected: string | undefined): boolean {\n if (!expected) {\n return true;\n }\n if (!provided) {\n return false;\n }\n return provided === expected;\n}\n\nexport function getRequestBearer(req: IncomingMessage): string | undefined {\n const header = req.headers.authorization;\n const value = Array.isArray(header) ? header[0] : header;\n return parseBearerToken(value);\n}\n\nexport function authHeaders(token: string | undefined): Record<string, string> {\n if (!token) {\n return {};\n }\n return { authorization: `Bearer ${token}` };\n}\n","import { authHeaders } from \"./auth.js\";\n\nexport interface WorkplaneHttpOptions {\n method?: string;\n body?: unknown;\n nodeToken?: string;\n operatorToken?: string;\n}\n\nexport function buildWorkplaneHeaders(options: WorkplaneHttpOptions = {}): Record<string, string> {\n const token = options.nodeToken ?? options.operatorToken;\n return {\n \"content-type\": \"application/json\",\n ...authHeaders(token),\n };\n}\n\nexport async function workplaneFetch<T>(\n serverUrl: string,\n path: string,\n options: WorkplaneHttpOptions = {},\n): Promise<T> {\n const response = await fetch(`${serverUrl}${path}`, {\n method: options.method ?? \"GET\",\n headers: buildWorkplaneHeaders(options),\n body: options.body ? JSON.stringify(options.body) : undefined,\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`${response.status} ${response.statusText} from ${path}: ${text}`);\n }\n\n return (await response.json()) as T;\n}\n","import type { Workplan } from \"@workplane/workplans\";\n\nexport interface CodeReviewOptions {\n repoPath?: string;\n model?: string;\n branch?: string;\n}\n\nexport function codeReviewPlan(opts: CodeReviewOptions = {}): Workplan {\n const { repoPath = \".\", model = \"claude-haiku-4-5-20251001\", branch } = opts;\n const diffCmd = branch ? `git diff ${branch}..HEAD` : \"git diff HEAD~1\";\n\n return {\n id: \"code-review\",\n name: \"Code Review\",\n steps: [\n {\n id: \"diff\",\n name: \"Git Diff\",\n adapter: \"shell\",\n provider: \"shell\",\n payload: { command: diffCmd, cwd: repoPath },\n output: { dest: \"next\" },\n },\n {\n id: \"summarize\",\n name: \"Summarize\",\n adapter: \"ollama\",\n provider: \"ollama\",\n model: \"llama3\",\n payload: { prompt: \"Summarize these code changes concisely:\\n{{prevOutput}}\" },\n output: { dest: \"next\" },\n },\n {\n id: \"critique\",\n name: \"Critique\",\n adapter: \"anthropic\",\n provider: \"anthropic\",\n model,\n payload: { prompt: \"Review this summary for correctness, security issues, and code quality:\\n{{prevOutput}}\" },\n },\n ],\n };\n}\n","import type { Workplan } from \"@workplane/workplans\";\n\nexport interface SummarizeFileOptions {\n filePath: string;\n provider?: string;\n model?: string;\n}\n\nexport function summarizeFilePlan(opts: SummarizeFileOptions): Workplan {\n const { filePath, provider = \"ollama\", model = \"llama3\" } = opts;\n\n return {\n id: \"summarize-file\",\n name: \"Summarize File\",\n steps: [\n {\n id: \"read\",\n name: \"Read File\",\n adapter: \"file\",\n provider: \"file\",\n payload: { path: filePath },\n output: { dest: \"next\" },\n },\n {\n id: \"summarize\",\n name: \"Summarize\",\n adapter: provider,\n provider,\n model,\n payload: { prompt: \"Summarize the following file content concisely:\\n{{prevOutput}}\" },\n },\n ],\n };\n}\n","import type { SkillEntry } from \"../types.js\";\nimport { codeReviewPlan } from \"./code-review.js\";\nimport { summarizeFilePlan } from \"./summarize-file.js\";\n\nexport class SkillRegistry {\n private readonly skills = new Map<string, SkillEntry>();\n\n register(entry: SkillEntry): void {\n this.skills.set(entry.name, entry);\n }\n\n get(name: string): SkillEntry | undefined {\n return this.skills.get(name);\n }\n\n list(): SkillEntry[] {\n return Array.from(this.skills.values());\n }\n}\n\nexport function createDefaultRegistry(): SkillRegistry {\n const registry = new SkillRegistry();\n\n registry.register({\n name: \"code-review\",\n description: \"Git diff → local summarize (ollama) → frontier critique (anthropic)\",\n buildPlan: (opts) =>\n codeReviewPlan({\n repoPath: typeof opts.repo === \"string\" ? opts.repo : undefined,\n model: typeof opts.model === \"string\" ? opts.model : undefined,\n branch: typeof opts.branch === \"string\" ? opts.branch : undefined,\n }),\n });\n\n registry.register({\n name: \"summarize-file\",\n description: \"Read file → summarize with configurable provider (default: ollama)\",\n buildPlan: (opts) => {\n const filePath = typeof opts.file === \"string\" ? opts.file : \"\";\n if (!filePath) throw new Error(\"--file is required for summarize-file\");\n return summarizeFilePlan({\n filePath,\n provider: typeof opts.provider === \"string\" ? opts.provider : undefined,\n model: typeof opts.model === \"string\" ? opts.model : undefined,\n });\n },\n });\n\n return registry;\n}\n\nexport function listSkills(registry: SkillRegistry): void {\n for (const skill of registry.list()) {\n process.stdout.write(` ${skill.name.padEnd(20)} ${skill.description}\\n`);\n }\n}\n","export function applyTemplate(payload: Record<string, unknown>, prevOutput: string): Record<string, unknown> {\n return Object.fromEntries(\n Object.entries(payload).map(([k, v]) => [\n k,\n typeof v === \"string\" ? v.replaceAll(\"{{prevOutput}}\", prevOutput) : v,\n ]),\n );\n}\n","import type { Workplan, WorkplanResult, WorkplanRunner, WorkplanRunContext, StepResult, WorkplanStep } from \"./types.js\";\nimport { applyTemplate } from \"./template.js\";\n\nconst INLINE_PROVIDERS = new Set([\"anthropic\", \"openai\", \"ollama\", \"shell\", \"file\"]);\n\nasync function runInlineStep(step: WorkplanStep, prompt: string): Promise<string> {\n const provider = step.provider!;\n if (provider === \"anthropic\") {\n const { runAnthropicStep } = await import(\"./providers/anthropic.js\");\n return runAnthropicStep({ model: step.model ?? \"claude-haiku-4-5-20251001\", prompt });\n }\n if (provider === \"openai\") {\n const { runOpenAIStep } = await import(\"./providers/openai.js\");\n return runOpenAIStep({ model: step.model ?? \"gpt-4o-mini\", prompt });\n }\n if (provider === \"ollama\") {\n const { runOllamaStep } = await import(\"./providers/ollama.js\");\n return runOllamaStep({ model: step.model ?? \"llama3\", prompt });\n }\n if (provider === \"shell\") {\n const { runShellStep } = await import(\"./providers/shell.js\");\n return runShellStep({\n command: String(step.payload.command ?? \"\"),\n cwd: typeof step.payload.cwd === \"string\" ? step.payload.cwd : undefined,\n });\n }\n if (provider === \"file\") {\n const { runFileStep } = await import(\"./providers/file.js\");\n return runFileStep({ path: String(step.payload.path ?? \"\") });\n }\n throw new Error(`unknown inline provider: ${provider}`);\n}\n\nexport class SequentialWorkplanRunner implements WorkplanRunner {\n async run(plan: Workplan, ctx: WorkplanRunContext): Promise<WorkplanResult> {\n const results: StepResult[] = [];\n let prevOutput = \"\";\n let planSucceeded = true;\n\n for (const step of plan.steps) {\n const payload = prevOutput ? applyTemplate(step.payload, prevOutput) : step.payload;\n const prompt = typeof payload.prompt === \"string\" ? payload.prompt : \"\";\n const start = Date.now();\n let output = \"\";\n let exitCode = 0;\n\n try {\n if (step.provider && INLINE_PROVIDERS.has(step.provider)) {\n output = await runInlineStep({ ...step, payload }, prompt);\n } else {\n const node = await ctx.resolveNode(step.requires ?? [], step.provider);\n const result = await node.execute({ ...step, payload });\n output = result.output;\n exitCode = result.exitCode;\n }\n } catch (err) {\n exitCode = 1;\n output = err instanceof Error ? err.message : String(err);\n planSucceeded = false;\n\n const stepResult: StepResult = {\n stepId: step.id,\n output,\n exitCode,\n durationMs: Date.now() - start,\n };\n results.push(stepResult);\n ctx.emitResult(step.id, step.name, output);\n\n if (!step.continueOnError) {\n return {\n planId: plan.id,\n status: \"step_failed\",\n steps: results,\n succeeded: false,\n };\n }\n prevOutput = \"\";\n continue;\n }\n\n const dest = step.output?.dest ?? \"stdout\";\n const stepResult: StepResult = {\n stepId: step.id,\n output,\n exitCode,\n durationMs: Date.now() - start,\n };\n results.push(stepResult);\n\n if (dest === \"stdout\" || dest === \"artifact\") {\n ctx.emitResult(step.id, step.name, output);\n prevOutput = \"\";\n } else if (dest === \"next\") {\n prevOutput = output;\n }\n }\n\n return {\n planId: plan.id,\n status: planSucceeded ? \"completed\" : \"failed\",\n steps: results,\n succeeded: planSucceeded,\n };\n }\n}\n","export function printStepResult(stepName: string, output: string): void {\n process.stdout.write(`=== step: ${stepName} ===\\n${output}\\n\\n`);\n}\n","import type { NodeHandle, WorkplanRunContext, WorkplanStep, StepResult } from \"./types.js\";\nimport { printStepResult } from \"./sinks/stdout.js\";\n\nexport interface LocalWorkplanContextOptions {\n serverUrl?: string;\n nodeToken?: string;\n}\n\nclass WorkplaneNodeHandle implements NodeHandle {\n constructor(\n private readonly serverUrl: string,\n private readonly nodeToken: string,\n ) {}\n\n async execute(step: WorkplanStep): Promise<StepResult> {\n const start = Date.now();\n const taskRes = await fetch(`${this.serverUrl}/tasks`, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n authorization: `Bearer ${this.nodeToken}`,\n },\n body: JSON.stringify({\n kind: \"workplan.step\",\n adapter: step.adapter,\n payload: step.payload,\n requires: step.requires ?? [],\n }),\n });\n\n if (!taskRes.ok) {\n throw new Error(`failed to submit step ${step.id}: ${taskRes.status}`);\n }\n\n const task = (await taskRes.json()) as { id: string };\n const output = await this.pollUntilDone(task.id);\n return { stepId: step.id, output, exitCode: 0, durationMs: Date.now() - start };\n }\n\n private async pollUntilDone(taskId: string): Promise<string> {\n const terminalStatuses = new Set([\"succeeded\", \"failed\", \"cancelled\"]);\n for (;;) {\n await new Promise((r) => setTimeout(r, 1000));\n const res = await fetch(`${this.serverUrl}/tasks/${taskId}`, {\n headers: { authorization: `Bearer ${this.nodeToken}` },\n });\n const task = (await res.json()) as { status: string; payload?: Record<string, unknown> };\n if (terminalStatuses.has(task.status)) {\n if (task.status !== \"succeeded\") {\n throw new Error(`step task ${taskId} ended with status: ${task.status}`);\n }\n return typeof task.payload?.output === \"string\" ? task.payload.output : \"\";\n }\n }\n }\n}\n\nexport class LocalWorkplanContext implements WorkplanRunContext {\n private readonly serverUrl: string;\n private readonly nodeToken: string;\n\n constructor(opts: LocalWorkplanContextOptions = {}) {\n this.serverUrl = opts.serverUrl ?? process.env.WORKPLANE_SERVER_URL ?? \"http://localhost:8787\";\n this.nodeToken = opts.nodeToken ?? process.env.WORKPLANE_NODE_TOKEN ?? \"\";\n }\n\n async resolveNode(_requires: string[], _provider?: string): Promise<NodeHandle> {\n return new WorkplaneNodeHandle(this.serverUrl, this.nodeToken);\n }\n\n emitResult(_stepId: string, stepName: string, output: string): void {\n printStepResult(stepName, output);\n }\n}\n","import { loadLocalEnv } from \"../../core/src/env.js\";\nimport { parseCsv } from \"../../core/src/config.js\";\nimport { workplaneFetch } from \"../../core/src/http-client.js\";\nimport { createDefaultRegistry, listSkills } from \"../../agent-skills/src/skills/index.js\";\nimport { SequentialWorkplanRunner } from \"../../workplans/src/runner.js\";\nimport { LocalWorkplanContext } from \"../../workplans/src/context.js\";\n\nloadLocalEnv();\n\nconst serverUrl = process.env.WORKPLANE_SERVER_URL ?? \"http://localhost:8787\";\nconst operatorToken = process.env.WORKPLANE_OPERATOR_TOKEN;\n\nasync function httpJson<T>(\n path: string,\n options?: { method?: string; body?: Record<string, unknown>; operator?: boolean },\n): Promise<T> {\n return workplaneFetch<T>(serverUrl, path, {\n method: options?.method,\n body: options?.body,\n operatorToken: options?.operator ? operatorToken : undefined,\n });\n}\n\ninterface RunListResponse {\n runs: Array<{ id: string }>;\n}\n\nfunction valueArg(args: string[], flag: string): string | undefined {\n const index = args.indexOf(flag);\n if (index === -1) {\n return undefined;\n }\n return args[index + 1];\n}\n\nfunction printJson(payload: unknown): void {\n process.stdout.write(`${JSON.stringify(payload, null, 2)}\\n`);\n}\n\nasync function resolveRunIdFromTaskId(taskId: string): Promise<string> {\n const runs = await httpJson<RunListResponse>(`/runs?taskId=${encodeURIComponent(taskId)}`);\n const runId = runs.runs[0]?.id;\n if (!runId) {\n throw new Error(`no runs found for task ${taskId}`);\n }\n return runId;\n}\n\nasync function showLogsById(id: string): Promise<void> {\n const runId = id.startsWith(\"task_\") ? await resolveRunIdFromTaskId(id) : id;\n const logs = await httpJson(`/runs/${runId}/logs`);\n printJson(logs);\n}\n\nfunction usage(): void {\n process.stdout.write(\n [\n \"workplane CLI\",\n \"\",\n \"Env: WORKPLANE_SERVER_URL, WORKPLANE_OPERATOR_TOKEN (for task submit/retry/cancel)\",\n \"\",\n \"Commands:\",\n \" server start / node start # use pnpm dev:server / dev:node\",\n \" task submit shell --command <cmd> [--repo <url>] [--branch <b>] [--cwd <path>]\",\n \" task submit aider --prompt <text> --repo <url> [--model <m>] [--test-command <cmd>]\",\n \" task submit inference --model <m> --prompt <text> [--requires ollama]\",\n \" task submit harness --harness <codex|claude-code> --repo <url> --prompt <text> [--interactive]\",\n \" tasks [--status <status>]\",\n \" task show|logs|retry|cancel <taskId>\",\n \" runs [--task-id <id>] [--status <status>]\",\n \" run show <runId>\",\n \" run input <runId> --stdin <text>\",\n \" run input <runId> --signal <SIGTERM|SIGKILL|SIGINT>\",\n \" run input <runId> --resize <COLSxROWS>\",\n \" logs <runId|taskId>\",\n \" artifacts <runId>\",\n \" skill list\",\n \" skill run <name> [--key value ...]\",\n ].join(\"\\n\"),\n );\n}\n\nasync function submitShell(args: string[]): Promise<void> {\n const command = valueArg(args, \"--command\");\n if (!command) {\n throw new Error(\"--command is required\");\n }\n\n const requires = parseCsv(valueArg(args, \"--requires\") ?? \"shell\");\n const repo = valueArg(args, \"--repo\");\n const branch = valueArg(args, \"--branch\");\n const cwd = valueArg(args, \"--cwd\");\n const task = await httpJson(\"/tasks\", {\n method: \"POST\",\n operator: true,\n body: {\n kind: \"shell.exec\",\n adapter: \"shell\",\n requires,\n payload: { command, repo, branch, cwd },\n },\n });\n\n printJson(task);\n}\n\nasync function submitAider(args: string[]): Promise<void> {\n const prompt = valueArg(args, \"--prompt\");\n if (!prompt) {\n throw new Error(\"--prompt is required\");\n }\n\n const model = valueArg(args, \"--model\");\n const repo = valueArg(args, \"--repo\");\n if (!repo) {\n throw new Error(\"--repo is required\");\n }\n const branch = valueArg(args, \"--branch\");\n const testCommand = valueArg(args, \"--test-command\");\n const requires = parseCsv(valueArg(args, \"--requires\") ?? \"git,aider\");\n const task = await httpJson(\"/tasks\", {\n method: \"POST\",\n operator: true,\n body: {\n kind: \"agent.run\",\n adapter: \"aider\",\n requires,\n payload: { prompt, model, repo, branch, testCommand },\n },\n });\n\n printJson(task);\n}\n\nasync function submitInference(args: string[]): Promise<void> {\n const model = valueArg(args, \"--model\");\n const prompt = valueArg(args, \"--prompt\");\n if (!model || !prompt) {\n throw new Error(\"--model and --prompt are required\");\n }\n\n const adapter = valueArg(args, \"--adapter\") ?? \"ollama\";\n const requires = parseCsv(valueArg(args, \"--requires\") ?? adapter);\n const inputFile = valueArg(args, \"--input-file\");\n\n const task = await httpJson(\"/tasks\", {\n method: \"POST\",\n operator: true,\n body: {\n kind: \"inference.batch\",\n adapter,\n requires,\n payload: { model, prompt, inputFile },\n },\n });\n\n printJson(task);\n}\n\nasync function submitHarness(args: string[]): Promise<void> {\n const harness = valueArg(args, \"--harness\");\n const prompt = valueArg(args, \"--prompt\");\n const repo = valueArg(args, \"--repo\");\n if (!harness || !prompt || !repo) {\n throw new Error(\"--harness, --prompt, and --repo are required\");\n }\n\n if (harness !== \"codex\" && harness !== \"claude-code\") {\n throw new Error(\"--harness must be codex or claude-code\");\n }\n\n const model = valueArg(args, \"--model\");\n const branch = valueArg(args, \"--branch\");\n const testCommand = valueArg(args, \"--test-command\");\n const interactive = args.includes(\"--interactive\") || undefined;\n const requires = parseCsv(valueArg(args, \"--requires\") ?? `${harness},git`);\n\n const task = await httpJson(\"/tasks\", {\n method: \"POST\",\n operator: true,\n body: {\n kind: \"agent.run\",\n adapter: harness,\n requires,\n payload: { prompt, repo, model, branch, testCommand, interactive },\n },\n });\n\n printJson(task);\n}\n\nasync function main(): Promise<void> {\n const [command, subcommand, ...rest] = process.argv.slice(2);\n\n if (!command) {\n usage();\n return;\n }\n\n if (command === \"server\" && subcommand === \"start\") {\n process.stdout.write(\"Use: pnpm dev:server\\n\");\n return;\n }\n\n if (command === \"node\" && subcommand === \"start\") {\n process.stdout.write(\"Use: pnpm dev:node\\n\");\n return;\n }\n\n if (command === \"task\" && subcommand === \"submit\") {\n const adapter = rest[0];\n const adapterArgs = rest.slice(1);\n if (adapter === \"shell\") {\n await submitShell(adapterArgs);\n return;\n }\n if (adapter === \"aider\") {\n await submitAider(adapterArgs);\n return;\n }\n if (adapter === \"inference\") {\n await submitInference(adapterArgs);\n return;\n }\n if (adapter === \"harness\") {\n await submitHarness(adapterArgs);\n return;\n }\n throw new Error(`unsupported adapter submit: ${adapter}`);\n }\n\n if (command === \"tasks\") {\n const status = valueArg([subcommand, ...rest].filter(Boolean) as string[], \"--status\");\n const tasks = await httpJson(status ? `/tasks?status=${encodeURIComponent(status)}` : \"/tasks\");\n printJson(tasks);\n return;\n }\n\n if (command === \"task\" && subcommand === \"show\") {\n const taskId = rest[0];\n if (!taskId) {\n throw new Error(\"task id is required\");\n }\n const task = await httpJson(`/tasks/${taskId}`);\n printJson(task);\n return;\n }\n\n if (command === \"task\" && subcommand === \"retry\") {\n const taskId = rest[0];\n if (!taskId) {\n throw new Error(\"task id is required\");\n }\n const task = await httpJson(`/tasks/${taskId}/retry`, { method: \"POST\", operator: true });\n printJson(task);\n return;\n }\n\n if (command === \"task\" && subcommand === \"logs\") {\n const taskId = rest[0];\n if (!taskId) {\n throw new Error(\"task id is required\");\n }\n await showLogsById(taskId);\n return;\n }\n\n if (command === \"task\" && subcommand === \"cancel\") {\n const taskId = rest[0];\n if (!taskId) {\n throw new Error(\"task id is required\");\n }\n const task = await httpJson(`/tasks/${taskId}/cancel`, { method: \"POST\", operator: true });\n printJson(task);\n return;\n }\n\n if (command === \"runs\") {\n const taskId = valueArg(rest, \"--task-id\");\n const status = valueArg(rest, \"--status\");\n const query = new URLSearchParams();\n if (taskId) {\n query.set(\"taskId\", taskId);\n }\n if (status) {\n query.set(\"status\", status);\n }\n const runs = await httpJson(query.size > 0 ? `/runs?${query.toString()}` : \"/runs\");\n printJson(runs);\n return;\n }\n\n if (command === \"run\" && subcommand === \"input\") {\n const runId = rest[0];\n if (!runId) {\n throw new Error(\"run id is required\");\n }\n const inputArgs = rest.slice(1);\n const stdinData = valueArg(inputArgs, \"--stdin\");\n const signal = valueArg(inputArgs, \"--signal\");\n const resize = valueArg(inputArgs, \"--resize\");\n\n let body: Record<string, unknown>;\n if (stdinData !== undefined) {\n body = { kind: \"stdin\", payload: { data: stdinData } };\n } else if (signal !== undefined) {\n if (signal !== \"SIGTERM\" && signal !== \"SIGKILL\" && signal !== \"SIGINT\") {\n throw new Error(\"--signal must be SIGTERM, SIGKILL, or SIGINT\");\n }\n body = { kind: \"signal\", payload: { signal } };\n } else if (resize !== undefined) {\n const match = /^(\\d+)x(\\d+)$/.exec(resize);\n if (!match) {\n throw new Error(\"--resize must be in COLSxROWS format, e.g. 220x50\");\n }\n body = { kind: \"resize\", payload: { cols: Number(match[1]), rows: Number(match[2]) } };\n } else {\n throw new Error(\"one of --stdin, --signal, or --resize is required\");\n }\n\n const result = await httpJson(`/runs/${runId}/input`, { method: \"POST\", operator: true, body });\n printJson(result);\n return;\n }\n\n if (command === \"run\" && subcommand === \"show\") {\n const runId = rest[0];\n if (!runId) {\n throw new Error(\"run id is required\");\n }\n const run = await httpJson(`/runs/${runId}`);\n printJson(run);\n return;\n }\n\n if (command === \"logs\") {\n const id = subcommand;\n if (!id) {\n throw new Error(\"run id or task id is required\");\n }\n await showLogsById(id);\n return;\n }\n\n if (command === \"artifacts\") {\n const runId = subcommand;\n if (!runId) {\n throw new Error(\"run id is required\");\n }\n const artifacts = await httpJson(`/runs/${runId}/artifacts`);\n printJson(artifacts);\n return;\n }\n\n if (command === \"skill\" && subcommand === \"list\") {\n const registry = createDefaultRegistry();\n process.stdout.write(\"Available skills:\\n\");\n listSkills(registry);\n return;\n }\n\n if (command === \"skill\" && subcommand === \"run\") {\n const skillName = rest[0];\n if (!skillName) {\n throw new Error(\"skill name is required\");\n }\n const registry = createDefaultRegistry();\n const skill = registry.get(skillName);\n if (!skill) {\n throw new Error(`unknown skill: ${skillName}. Run 'workplane skill list' to see available skills.`);\n }\n\n const optArgs = rest.slice(1);\n const options: Record<string, unknown> = {};\n for (let i = 0; i < optArgs.length - 1; i++) {\n if (optArgs[i].startsWith(\"--\")) {\n options[optArgs[i].slice(2)] = optArgs[i + 1];\n i++;\n }\n }\n\n const plan = skill.buildPlan(options);\n const runner = new SequentialWorkplanRunner();\n const ctx = new LocalWorkplanContext();\n const result = await runner.run(plan, ctx);\n\n if (!result.succeeded) {\n process.stderr.write(`skill '${skillName}' failed at step '${result.steps.at(-1)?.stepId ?? \"unknown\"}'\\n`);\n process.exit(1);\n }\n return;\n }\n\n usage();\n}\n\nmain().catch((error) => {\n process.stderr.write(`${String(error)}\\n`);\n process.exit(1);\n});\n"],"mappings":"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","names":["serverUrl","runAnthropicStep","runOpenAIStep","runOllamaStep","runShellStep","runFileStep","stepResult","serverUrl"]}
1
+ {"version":3,"sources":["../../workplans/src/providers/anthropic.ts","../../workplans/src/providers/openai.ts","../../workplans/src/providers/ollama.ts","../../workplans/src/providers/shell.ts","../../workplans/src/providers/file.ts","../../core/src/env.ts","../../core/src/config.ts","../../core/src/auth.ts","../../core/src/http-client.ts","../../agent-skills/src/skills/code-review.ts","../../agent-skills/src/skills/summarize-file.ts","../../agent-skills/src/skills/index.ts","../../workplans/src/template.ts","../../workplans/src/runner.ts","../../workplans/src/sinks/stdout.ts","../../workplans/src/context.ts","../../cli/src/index.ts"],"sourcesContent":["import Anthropic from \"@anthropic-ai/sdk\";\n\nexport interface AnthropicStepOptions {\n model: string;\n prompt: string;\n apiKey?: string;\n}\n\nexport async function runAnthropicStep(opts: AnthropicStepOptions): Promise<string> {\n const client = new Anthropic({ apiKey: opts.apiKey ?? process.env.ANTHROPIC_API_KEY });\n const message = await client.messages.create({\n model: opts.model,\n max_tokens: 4096,\n messages: [{ role: \"user\", content: opts.prompt }],\n });\n const block = message.content[0];\n return block.type === \"text\" ? block.text : \"\";\n}\n","import OpenAI from \"openai\";\n\nexport interface OpenAIStepOptions {\n model: string;\n prompt: string;\n apiKey?: string;\n}\n\nexport async function runOpenAIStep(opts: OpenAIStepOptions): Promise<string> {\n const client = new OpenAI({ apiKey: opts.apiKey ?? process.env.OPENAI_API_KEY });\n const completion = await client.chat.completions.create({\n model: opts.model,\n messages: [{ role: \"user\", content: opts.prompt }],\n });\n return completion.choices[0]?.message.content ?? \"\";\n}\n","import { Ollama } from \"ollama\";\n\nexport interface OllamaStepOptions {\n model: string;\n prompt: string;\n host?: string;\n}\n\nexport async function runOllamaStep(opts: OllamaStepOptions): Promise<string> {\n const host = opts.host ?? process.env.OLLAMA_HOST ?? \"http://localhost:11434\";\n const client = new Ollama({ host });\n const response = await client.generate({ model: opts.model, prompt: opts.prompt });\n return response.response;\n}\n","import { exec } from \"node:child_process\";\nimport { promisify } from \"node:util\";\n\nconst execAsync = promisify(exec);\n\nexport interface ShellStepOptions {\n command: string;\n cwd?: string;\n}\n\nexport async function runShellStep(opts: ShellStepOptions): Promise<string> {\n const { stdout } = await execAsync(opts.command, {\n cwd: opts.cwd,\n maxBuffer: 10 * 1024 * 1024,\n });\n return stdout;\n}\n","import { readFile } from \"node:fs/promises\";\n\nexport interface FileStepOptions {\n path: string;\n encoding?: BufferEncoding;\n}\n\nexport async function runFileStep(opts: FileStepOptions): Promise<string> {\n return readFile(opts.path, opts.encoding ?? \"utf8\");\n}\n","import { config as dotenvConfig } from \"dotenv\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nlet envLoaded = false;\n\n// Load order (highest priority first, all with override:false so shell env vars win):\n// 1. .env.local — project-local overrides (gitignored)\n// 2. ~/.workplane/.env — user global config written by workplane-setup\n// 3. .env — project defaults (committed)\nexport function loadLocalEnv(): void {\n if (envLoaded) {\n return;\n }\n\n dotenvConfig({ path: \".env.local\" });\n dotenvConfig({ path: join(homedir(), \".workplane\", \".env\") });\n dotenvConfig({ path: \".env\" });\n\n envLoaded = true;\n}\n","import { z } from \"zod\";\nimport { loadLocalEnv } from \"./env.js\";\n\nloadLocalEnv();\n\nconst serverEnvSchema = z.object({\n DATABASE_URL: z.string().optional().default(\"sqlite://~/.workplane/workplane.db\"),\n WORKPLANE_SERVER_PORT: z\n .string()\n .optional()\n .default(\"8787\")\n .transform((value) => Number.parseInt(value, 10)),\n WORKPLANE_NODE_TOKEN: z.string().optional(),\n WORKPLANE_OPERATOR_TOKEN: z.string().optional(),\n WORKPLANE_ENV_ALLOWLIST: z.string().optional(),\n});\n\nconst nodeEnvSchema = z.object({\n WORKPLANE_SERVER_URL: z.string().url().optional().default(\"http://localhost:8787\"),\n WORKPLANE_NODE_NAME: z.string().optional().default(\"local-node-1\"),\n WORKPLANE_NODE_ID: z.string().optional(),\n WORKPLANE_NODE_CAPABILITIES: z\n .string()\n .optional()\n .default(\"shell,git,node,typescript,aider,ollama,codex,claude-code\"),\n WORKPLANE_NODE_TOKEN: z.string().optional(),\n WORKPLANE_POLL_INTERVAL_MS: z\n .string()\n .optional()\n .default(\"3000\")\n .transform((value) => Number.parseInt(value, 10)),\n WORKPLANE_ENV_ALLOWLIST: z.string().optional(),\n});\n\nexport interface ServerConfig {\n databaseUrl: string;\n port: number;\n nodeToken?: string;\n operatorToken?: string;\n envAllowlist: string[];\n}\n\nexport interface NodeConfig {\n serverUrl: string;\n nodeName: string;\n nodeId?: string;\n nodeCapabilities: string[];\n nodeToken?: string;\n pollIntervalMs: number;\n envAllowlist: string[];\n}\n\nexport function loadServerConfig(env: NodeJS.ProcessEnv = process.env): ServerConfig {\n const parsed = serverEnvSchema.parse(env);\n\n return {\n databaseUrl: parsed.DATABASE_URL,\n port: parsed.WORKPLANE_SERVER_PORT,\n nodeToken: parsed.WORKPLANE_NODE_TOKEN,\n operatorToken: parsed.WORKPLANE_OPERATOR_TOKEN,\n envAllowlist: parseCsv(parsed.WORKPLANE_ENV_ALLOWLIST ?? \"\"),\n };\n}\n\nexport function loadNodeConfig(env: NodeJS.ProcessEnv = process.env): NodeConfig {\n const parsed = nodeEnvSchema.parse(env);\n\n return {\n serverUrl: parsed.WORKPLANE_SERVER_URL,\n nodeName: parsed.WORKPLANE_NODE_NAME,\n nodeId: parsed.WORKPLANE_NODE_ID,\n nodeCapabilities: parseCsv(parsed.WORKPLANE_NODE_CAPABILITIES),\n nodeToken: parsed.WORKPLANE_NODE_TOKEN,\n pollIntervalMs: parsed.WORKPLANE_POLL_INTERVAL_MS,\n envAllowlist: parseCsv(parsed.WORKPLANE_ENV_ALLOWLIST ?? \"\"),\n };\n}\n\nexport function parseCsv(value: string): string[] {\n return value\n .split(\",\")\n .map((entry) => entry.trim())\n .filter(Boolean);\n}\n","import type { IncomingMessage } from \"node:http\";\n\nexport function parseBearerToken(authorizationHeader: string | undefined): string | undefined {\n if (!authorizationHeader) {\n return undefined;\n }\n const match = /^Bearer\\s+(.+)$/i.exec(authorizationHeader.trim());\n return match?.[1];\n}\n\nexport function isAuthorizedBearer(provided: string | undefined, expected: string | undefined): boolean {\n if (!expected) {\n return true;\n }\n if (!provided) {\n return false;\n }\n return provided === expected;\n}\n\nexport function getRequestBearer(req: IncomingMessage): string | undefined {\n const header = req.headers.authorization;\n const value = Array.isArray(header) ? header[0] : header;\n return parseBearerToken(value);\n}\n\nexport function authHeaders(token: string | undefined): Record<string, string> {\n if (!token) {\n return {};\n }\n return { authorization: `Bearer ${token}` };\n}\n","import { authHeaders } from \"./auth.js\";\n\nexport interface WorkplaneHttpOptions {\n method?: string;\n body?: unknown;\n nodeToken?: string;\n operatorToken?: string;\n}\n\nexport function buildWorkplaneHeaders(options: WorkplaneHttpOptions = {}): Record<string, string> {\n const token = options.nodeToken ?? options.operatorToken;\n return {\n \"content-type\": \"application/json\",\n ...authHeaders(token),\n };\n}\n\nexport async function workplaneFetch<T>(\n serverUrl: string,\n path: string,\n options: WorkplaneHttpOptions = {},\n): Promise<T> {\n const response = await fetch(`${serverUrl}${path}`, {\n method: options.method ?? \"GET\",\n headers: buildWorkplaneHeaders(options),\n body: options.body ? JSON.stringify(options.body) : undefined,\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`${response.status} ${response.statusText} from ${path}: ${text}`);\n }\n\n return (await response.json()) as T;\n}\n","import type { Workplan } from \"@workplane/workplans\";\n\nexport interface CodeReviewOptions {\n repoPath?: string;\n model?: string;\n branch?: string;\n}\n\nexport function codeReviewPlan(opts: CodeReviewOptions = {}): Workplan {\n const { repoPath = \".\", model = \"claude-haiku-4-5-20251001\", branch } = opts;\n const diffCmd = branch ? `git diff ${branch}..HEAD` : \"git diff HEAD~1\";\n\n return {\n id: \"code-review\",\n name: \"Code Review\",\n steps: [\n {\n id: \"diff\",\n name: \"Git Diff\",\n adapter: \"shell\",\n provider: \"shell\",\n payload: { command: diffCmd, cwd: repoPath },\n output: { dest: \"next\" },\n },\n {\n id: \"summarize\",\n name: \"Summarize\",\n adapter: \"ollama\",\n provider: \"ollama\",\n model: \"llama3\",\n payload: { prompt: \"Summarize these code changes concisely:\\n{{prevOutput}}\" },\n output: { dest: \"next\" },\n },\n {\n id: \"critique\",\n name: \"Critique\",\n adapter: \"anthropic\",\n provider: \"anthropic\",\n model,\n payload: { prompt: \"Review this summary for correctness, security issues, and code quality:\\n{{prevOutput}}\" },\n },\n ],\n };\n}\n","import type { Workplan } from \"@workplane/workplans\";\n\nexport interface SummarizeFileOptions {\n filePath: string;\n provider?: string;\n model?: string;\n}\n\nexport function summarizeFilePlan(opts: SummarizeFileOptions): Workplan {\n const { filePath, provider = \"ollama\", model = \"llama3\" } = opts;\n\n return {\n id: \"summarize-file\",\n name: \"Summarize File\",\n steps: [\n {\n id: \"read\",\n name: \"Read File\",\n adapter: \"file\",\n provider: \"file\",\n payload: { path: filePath },\n output: { dest: \"next\" },\n },\n {\n id: \"summarize\",\n name: \"Summarize\",\n adapter: provider,\n provider,\n model,\n payload: { prompt: \"Summarize the following file content concisely:\\n{{prevOutput}}\" },\n },\n ],\n };\n}\n","import type { SkillEntry } from \"../types.js\";\nimport { codeReviewPlan } from \"./code-review.js\";\nimport { summarizeFilePlan } from \"./summarize-file.js\";\n\nexport class SkillRegistry {\n private readonly skills = new Map<string, SkillEntry>();\n\n register(entry: SkillEntry): void {\n this.skills.set(entry.name, entry);\n }\n\n get(name: string): SkillEntry | undefined {\n return this.skills.get(name);\n }\n\n list(): SkillEntry[] {\n return Array.from(this.skills.values());\n }\n}\n\nexport function createDefaultRegistry(): SkillRegistry {\n const registry = new SkillRegistry();\n\n registry.register({\n name: \"code-review\",\n description: \"Git diff → local summarize (ollama) → frontier critique (anthropic)\",\n buildPlan: (opts) =>\n codeReviewPlan({\n repoPath: typeof opts.repo === \"string\" ? opts.repo : undefined,\n model: typeof opts.model === \"string\" ? opts.model : undefined,\n branch: typeof opts.branch === \"string\" ? opts.branch : undefined,\n }),\n });\n\n registry.register({\n name: \"summarize-file\",\n description: \"Read file → summarize with configurable provider (default: ollama)\",\n buildPlan: (opts) => {\n const filePath = typeof opts.file === \"string\" ? opts.file : \"\";\n if (!filePath) throw new Error(\"--file is required for summarize-file\");\n return summarizeFilePlan({\n filePath,\n provider: typeof opts.provider === \"string\" ? opts.provider : undefined,\n model: typeof opts.model === \"string\" ? opts.model : undefined,\n });\n },\n });\n\n return registry;\n}\n\nexport function listSkills(registry: SkillRegistry): void {\n for (const skill of registry.list()) {\n process.stdout.write(` ${skill.name.padEnd(20)} ${skill.description}\\n`);\n }\n}\n","export function applyTemplate(payload: Record<string, unknown>, prevOutput: string): Record<string, unknown> {\n return Object.fromEntries(\n Object.entries(payload).map(([k, v]) => [\n k,\n typeof v === \"string\" ? v.replaceAll(\"{{prevOutput}}\", prevOutput) : v,\n ]),\n );\n}\n","import type { Workplan, WorkplanResult, WorkplanRunner, WorkplanRunContext, StepResult, WorkplanStep } from \"./types.js\";\nimport { applyTemplate } from \"./template.js\";\n\nconst INLINE_PROVIDERS = new Set([\"anthropic\", \"openai\", \"ollama\", \"shell\", \"file\"]);\n\nasync function runInlineStep(step: WorkplanStep, prompt: string): Promise<string> {\n const provider = step.provider!;\n if (provider === \"anthropic\") {\n const { runAnthropicStep } = await import(\"./providers/anthropic.js\");\n return runAnthropicStep({ model: step.model ?? \"claude-haiku-4-5-20251001\", prompt });\n }\n if (provider === \"openai\") {\n const { runOpenAIStep } = await import(\"./providers/openai.js\");\n return runOpenAIStep({ model: step.model ?? \"gpt-4o-mini\", prompt });\n }\n if (provider === \"ollama\") {\n const { runOllamaStep } = await import(\"./providers/ollama.js\");\n return runOllamaStep({ model: step.model ?? \"llama3\", prompt });\n }\n if (provider === \"shell\") {\n const { runShellStep } = await import(\"./providers/shell.js\");\n return runShellStep({\n command: String(step.payload.command ?? \"\"),\n cwd: typeof step.payload.cwd === \"string\" ? step.payload.cwd : undefined,\n });\n }\n if (provider === \"file\") {\n const { runFileStep } = await import(\"./providers/file.js\");\n return runFileStep({ path: String(step.payload.path ?? \"\") });\n }\n throw new Error(`unknown inline provider: ${provider}`);\n}\n\nexport class SequentialWorkplanRunner implements WorkplanRunner {\n async run(plan: Workplan, ctx: WorkplanRunContext): Promise<WorkplanResult> {\n const results: StepResult[] = [];\n let prevOutput = \"\";\n let planSucceeded = true;\n\n for (const step of plan.steps) {\n const payload = prevOutput ? applyTemplate(step.payload, prevOutput) : step.payload;\n const prompt = typeof payload.prompt === \"string\" ? payload.prompt : \"\";\n const start = Date.now();\n let output = \"\";\n let exitCode = 0;\n\n try {\n if (step.provider && INLINE_PROVIDERS.has(step.provider)) {\n output = await runInlineStep({ ...step, payload }, prompt);\n } else {\n const node = await ctx.resolveNode(step.requires ?? [], step.provider);\n const result = await node.execute({ ...step, payload });\n output = result.output;\n exitCode = result.exitCode;\n }\n } catch (err) {\n exitCode = 1;\n output = err instanceof Error ? err.message : String(err);\n planSucceeded = false;\n\n const stepResult: StepResult = {\n stepId: step.id,\n output,\n exitCode,\n durationMs: Date.now() - start,\n };\n results.push(stepResult);\n ctx.emitResult(step.id, step.name, output);\n\n if (!step.continueOnError) {\n return {\n planId: plan.id,\n status: \"step_failed\",\n steps: results,\n succeeded: false,\n };\n }\n prevOutput = \"\";\n continue;\n }\n\n const dest = step.output?.dest ?? \"stdout\";\n const stepResult: StepResult = {\n stepId: step.id,\n output,\n exitCode,\n durationMs: Date.now() - start,\n };\n results.push(stepResult);\n\n if (dest === \"stdout\" || dest === \"artifact\") {\n ctx.emitResult(step.id, step.name, output);\n prevOutput = \"\";\n } else if (dest === \"next\") {\n prevOutput = output;\n }\n }\n\n return {\n planId: plan.id,\n status: planSucceeded ? \"completed\" : \"failed\",\n steps: results,\n succeeded: planSucceeded,\n };\n }\n}\n","export function printStepResult(stepName: string, output: string): void {\n process.stdout.write(`=== step: ${stepName} ===\\n${output}\\n\\n`);\n}\n","import type { NodeHandle, WorkplanRunContext, WorkplanStep, StepResult } from \"./types.js\";\nimport { printStepResult } from \"./sinks/stdout.js\";\n\nexport interface LocalWorkplanContextOptions {\n serverUrl?: string;\n nodeToken?: string;\n}\n\nclass WorkplaneNodeHandle implements NodeHandle {\n constructor(\n private readonly serverUrl: string,\n private readonly nodeToken: string,\n ) {}\n\n async execute(step: WorkplanStep): Promise<StepResult> {\n const start = Date.now();\n const taskRes = await fetch(`${this.serverUrl}/tasks`, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n authorization: `Bearer ${this.nodeToken}`,\n },\n body: JSON.stringify({\n kind: \"workplan.step\",\n adapter: step.adapter,\n payload: step.payload,\n requires: step.requires ?? [],\n }),\n });\n\n if (!taskRes.ok) {\n throw new Error(`failed to submit step ${step.id}: ${taskRes.status}`);\n }\n\n const task = (await taskRes.json()) as { id: string };\n const output = await this.pollUntilDone(task.id);\n return { stepId: step.id, output, exitCode: 0, durationMs: Date.now() - start };\n }\n\n private async pollUntilDone(taskId: string): Promise<string> {\n const terminalStatuses = new Set([\"succeeded\", \"failed\", \"cancelled\"]);\n for (;;) {\n await new Promise((r) => setTimeout(r, 1000));\n const res = await fetch(`${this.serverUrl}/tasks/${taskId}`, {\n headers: { authorization: `Bearer ${this.nodeToken}` },\n });\n const task = (await res.json()) as { status: string; payload?: Record<string, unknown> };\n if (terminalStatuses.has(task.status)) {\n if (task.status !== \"succeeded\") {\n throw new Error(`step task ${taskId} ended with status: ${task.status}`);\n }\n return typeof task.payload?.output === \"string\" ? task.payload.output : \"\";\n }\n }\n }\n}\n\nexport class LocalWorkplanContext implements WorkplanRunContext {\n private readonly serverUrl: string;\n private readonly nodeToken: string;\n\n constructor(opts: LocalWorkplanContextOptions = {}) {\n this.serverUrl = opts.serverUrl ?? process.env.WORKPLANE_SERVER_URL ?? \"http://localhost:8787\";\n this.nodeToken = opts.nodeToken ?? process.env.WORKPLANE_NODE_TOKEN ?? \"\";\n }\n\n async resolveNode(_requires: string[], _provider?: string): Promise<NodeHandle> {\n return new WorkplaneNodeHandle(this.serverUrl, this.nodeToken);\n }\n\n emitResult(_stepId: string, stepName: string, output: string): void {\n printStepResult(stepName, output);\n }\n}\n","import { loadLocalEnv } from \"../../core/src/env.js\";\nimport { parseCsv } from \"../../core/src/config.js\";\nimport { workplaneFetch } from \"../../core/src/http-client.js\";\nimport { createDefaultRegistry, listSkills } from \"../../agent-skills/src/skills/index.js\";\nimport { SequentialWorkplanRunner } from \"../../workplans/src/runner.js\";\nimport { LocalWorkplanContext } from \"../../workplans/src/context.js\";\n\nloadLocalEnv();\n\nconst serverUrl = process.env.WORKPLANE_SERVER_URL ?? \"http://localhost:8787\";\nconst operatorToken = process.env.WORKPLANE_OPERATOR_TOKEN;\n\nasync function httpJson<T>(\n path: string,\n options?: { method?: string; body?: Record<string, unknown>; operator?: boolean },\n): Promise<T> {\n return workplaneFetch<T>(serverUrl, path, {\n method: options?.method,\n body: options?.body,\n operatorToken: options?.operator ? operatorToken : undefined,\n });\n}\n\ninterface RunListResponse {\n runs: Array<{ id: string }>;\n}\n\nfunction valueArg(args: string[], flag: string): string | undefined {\n const index = args.indexOf(flag);\n if (index === -1) {\n return undefined;\n }\n return args[index + 1];\n}\n\nfunction printJson(payload: unknown): void {\n process.stdout.write(`${JSON.stringify(payload, null, 2)}\\n`);\n}\n\nasync function resolveRunIdFromTaskId(taskId: string): Promise<string> {\n const runs = await httpJson<RunListResponse>(`/runs?taskId=${encodeURIComponent(taskId)}`);\n const runId = runs.runs[0]?.id;\n if (!runId) {\n throw new Error(`no runs found for task ${taskId}`);\n }\n return runId;\n}\n\nasync function showLogsById(id: string): Promise<void> {\n const runId = id.startsWith(\"task_\") ? await resolveRunIdFromTaskId(id) : id;\n const logs = await httpJson(`/runs/${runId}/logs`);\n printJson(logs);\n}\n\nfunction usage(): void {\n process.stdout.write(\n [\n \"workplane CLI\",\n \"\",\n \"Env: WORKPLANE_SERVER_URL, WORKPLANE_OPERATOR_TOKEN (for task submit/retry/cancel)\",\n \"\",\n \"Commands:\",\n \" server start / node start # use pnpm dev:server / dev:node\",\n \" task submit shell --command <cmd> [--repo <url>] [--branch <b>] [--cwd <path>]\",\n \" task submit aider --prompt <text> --repo <url> [--model <m>] [--test-command <cmd>]\",\n \" task submit inference --model <m> --prompt <text> [--requires ollama]\",\n \" task submit harness --harness <codex|claude-code> --repo <url> --prompt <text> [--interactive]\",\n \" tasks [--status <status>]\",\n \" task show|logs|retry|cancel <taskId>\",\n \" runs [--task-id <id>] [--status <status>]\",\n \" run show <runId>\",\n \" run input <runId> --stdin <text>\",\n \" run input <runId> --signal <SIGTERM|SIGKILL|SIGINT>\",\n \" run input <runId> --resize <COLSxROWS>\",\n \" logs <runId|taskId>\",\n \" artifacts <runId>\",\n \" skill list\",\n \" skill run <name> [--key value ...]\",\n ].join(\"\\n\"),\n );\n}\n\nasync function submitShell(args: string[]): Promise<void> {\n const command = valueArg(args, \"--command\");\n if (!command) {\n throw new Error(\"--command is required\");\n }\n\n const requires = parseCsv(valueArg(args, \"--requires\") ?? \"shell\");\n const repo = valueArg(args, \"--repo\");\n const branch = valueArg(args, \"--branch\");\n const cwd = valueArg(args, \"--cwd\");\n const task = await httpJson(\"/tasks\", {\n method: \"POST\",\n operator: true,\n body: {\n kind: \"shell.exec\",\n adapter: \"shell\",\n requires,\n payload: { command, repo, branch, cwd },\n },\n });\n\n printJson(task);\n}\n\nasync function submitAider(args: string[]): Promise<void> {\n const prompt = valueArg(args, \"--prompt\");\n if (!prompt) {\n throw new Error(\"--prompt is required\");\n }\n\n const model = valueArg(args, \"--model\");\n const repo = valueArg(args, \"--repo\");\n if (!repo) {\n throw new Error(\"--repo is required\");\n }\n const branch = valueArg(args, \"--branch\");\n const testCommand = valueArg(args, \"--test-command\");\n const requires = parseCsv(valueArg(args, \"--requires\") ?? \"git,aider\");\n const task = await httpJson(\"/tasks\", {\n method: \"POST\",\n operator: true,\n body: {\n kind: \"agent.run\",\n adapter: \"aider\",\n requires,\n payload: { prompt, model, repo, branch, testCommand },\n },\n });\n\n printJson(task);\n}\n\nasync function submitInference(args: string[]): Promise<void> {\n const model = valueArg(args, \"--model\");\n const prompt = valueArg(args, \"--prompt\");\n if (!model || !prompt) {\n throw new Error(\"--model and --prompt are required\");\n }\n\n const adapter = valueArg(args, \"--adapter\") ?? \"ollama\";\n const requires = parseCsv(valueArg(args, \"--requires\") ?? adapter);\n const inputFile = valueArg(args, \"--input-file\");\n\n const task = await httpJson(\"/tasks\", {\n method: \"POST\",\n operator: true,\n body: {\n kind: \"inference.batch\",\n adapter,\n requires,\n payload: { model, prompt, inputFile },\n },\n });\n\n printJson(task);\n}\n\nasync function submitHarness(args: string[]): Promise<void> {\n const harness = valueArg(args, \"--harness\");\n const prompt = valueArg(args, \"--prompt\");\n const repo = valueArg(args, \"--repo\");\n if (!harness || !prompt || !repo) {\n throw new Error(\"--harness, --prompt, and --repo are required\");\n }\n\n if (harness !== \"codex\" && harness !== \"claude-code\") {\n throw new Error(\"--harness must be codex or claude-code\");\n }\n\n const model = valueArg(args, \"--model\");\n const branch = valueArg(args, \"--branch\");\n const testCommand = valueArg(args, \"--test-command\");\n const interactive = args.includes(\"--interactive\") || undefined;\n const requires = parseCsv(valueArg(args, \"--requires\") ?? `${harness},git`);\n\n const task = await httpJson(\"/tasks\", {\n method: \"POST\",\n operator: true,\n body: {\n kind: \"agent.run\",\n adapter: harness,\n requires,\n payload: { prompt, repo, model, branch, testCommand, interactive },\n },\n });\n\n printJson(task);\n}\n\nasync function main(): Promise<void> {\n const [command, subcommand, ...rest] = process.argv.slice(2);\n\n if (!command) {\n usage();\n return;\n }\n\n if (command === \"server\" && subcommand === \"start\") {\n process.stdout.write(\"Use: pnpm dev:server\\n\");\n return;\n }\n\n if (command === \"node\" && subcommand === \"start\") {\n process.stdout.write(\"Use: pnpm dev:node\\n\");\n return;\n }\n\n if (command === \"task\" && subcommand === \"submit\") {\n const adapter = rest[0];\n const adapterArgs = rest.slice(1);\n if (adapter === \"shell\") {\n await submitShell(adapterArgs);\n return;\n }\n if (adapter === \"aider\") {\n await submitAider(adapterArgs);\n return;\n }\n if (adapter === \"inference\") {\n await submitInference(adapterArgs);\n return;\n }\n if (adapter === \"harness\") {\n await submitHarness(adapterArgs);\n return;\n }\n throw new Error(`unsupported adapter submit: ${adapter}`);\n }\n\n if (command === \"tasks\") {\n const status = valueArg([subcommand, ...rest].filter(Boolean) as string[], \"--status\");\n const tasks = await httpJson(status ? `/tasks?status=${encodeURIComponent(status)}` : \"/tasks\");\n printJson(tasks);\n return;\n }\n\n if (command === \"task\" && subcommand === \"show\") {\n const taskId = rest[0];\n if (!taskId) {\n throw new Error(\"task id is required\");\n }\n const task = await httpJson(`/tasks/${taskId}`);\n printJson(task);\n return;\n }\n\n if (command === \"task\" && subcommand === \"retry\") {\n const taskId = rest[0];\n if (!taskId) {\n throw new Error(\"task id is required\");\n }\n const task = await httpJson(`/tasks/${taskId}/retry`, { method: \"POST\", operator: true });\n printJson(task);\n return;\n }\n\n if (command === \"task\" && subcommand === \"logs\") {\n const taskId = rest[0];\n if (!taskId) {\n throw new Error(\"task id is required\");\n }\n await showLogsById(taskId);\n return;\n }\n\n if (command === \"task\" && subcommand === \"cancel\") {\n const taskId = rest[0];\n if (!taskId) {\n throw new Error(\"task id is required\");\n }\n const task = await httpJson(`/tasks/${taskId}/cancel`, { method: \"POST\", operator: true });\n printJson(task);\n return;\n }\n\n if (command === \"runs\") {\n const taskId = valueArg(rest, \"--task-id\");\n const status = valueArg(rest, \"--status\");\n const query = new URLSearchParams();\n if (taskId) {\n query.set(\"taskId\", taskId);\n }\n if (status) {\n query.set(\"status\", status);\n }\n const runs = await httpJson(query.size > 0 ? `/runs?${query.toString()}` : \"/runs\");\n printJson(runs);\n return;\n }\n\n if (command === \"run\" && subcommand === \"input\") {\n const runId = rest[0];\n if (!runId) {\n throw new Error(\"run id is required\");\n }\n const inputArgs = rest.slice(1);\n const stdinData = valueArg(inputArgs, \"--stdin\");\n const signal = valueArg(inputArgs, \"--signal\");\n const resize = valueArg(inputArgs, \"--resize\");\n\n let body: Record<string, unknown>;\n if (stdinData !== undefined) {\n body = { kind: \"stdin\", payload: { data: stdinData } };\n } else if (signal !== undefined) {\n if (signal !== \"SIGTERM\" && signal !== \"SIGKILL\" && signal !== \"SIGINT\") {\n throw new Error(\"--signal must be SIGTERM, SIGKILL, or SIGINT\");\n }\n body = { kind: \"signal\", payload: { signal } };\n } else if (resize !== undefined) {\n const match = /^(\\d+)x(\\d+)$/.exec(resize);\n if (!match) {\n throw new Error(\"--resize must be in COLSxROWS format, e.g. 220x50\");\n }\n body = { kind: \"resize\", payload: { cols: Number(match[1]), rows: Number(match[2]) } };\n } else {\n throw new Error(\"one of --stdin, --signal, or --resize is required\");\n }\n\n const result = await httpJson(`/runs/${runId}/input`, { method: \"POST\", operator: true, body });\n printJson(result);\n return;\n }\n\n if (command === \"run\" && subcommand === \"show\") {\n const runId = rest[0];\n if (!runId) {\n throw new Error(\"run id is required\");\n }\n const run = await httpJson(`/runs/${runId}`);\n printJson(run);\n return;\n }\n\n if (command === \"logs\") {\n const id = subcommand;\n if (!id) {\n throw new Error(\"run id or task id is required\");\n }\n await showLogsById(id);\n return;\n }\n\n if (command === \"artifacts\") {\n const runId = subcommand;\n if (!runId) {\n throw new Error(\"run id is required\");\n }\n const artifacts = await httpJson(`/runs/${runId}/artifacts`);\n printJson(artifacts);\n return;\n }\n\n if (command === \"skill\" && subcommand === \"list\") {\n const registry = createDefaultRegistry();\n process.stdout.write(\"Available skills:\\n\");\n listSkills(registry);\n return;\n }\n\n if (command === \"skill\" && subcommand === \"run\") {\n const skillName = rest[0];\n if (!skillName) {\n throw new Error(\"skill name is required\");\n }\n const registry = createDefaultRegistry();\n const skill = registry.get(skillName);\n if (!skill) {\n throw new Error(`unknown skill: ${skillName}. Run 'workplane skill list' to see available skills.`);\n }\n\n const optArgs = rest.slice(1);\n const options: Record<string, unknown> = {};\n for (let i = 0; i < optArgs.length - 1; i++) {\n if (optArgs[i].startsWith(\"--\")) {\n options[optArgs[i].slice(2)] = optArgs[i + 1];\n i++;\n }\n }\n\n const plan = skill.buildPlan(options);\n const runner = new SequentialWorkplanRunner();\n const ctx = new LocalWorkplanContext();\n const result = await runner.run(plan, ctx);\n\n if (!result.succeeded) {\n process.stderr.write(`skill '${skillName}' failed at step '${result.steps.at(-1)?.stepId ?? \"unknown\"}'\\n`);\n process.exit(1);\n }\n return;\n }\n\n usage();\n}\n\nmain().catch((error) => {\n process.stderr.write(`${String(error)}\\n`);\n process.exit(1);\n});\n"],"mappings":"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","names":["serverUrl","runAnthropicStep","runOpenAIStep","runOllamaStep","runShellStep","runFileStep","stepResult","serverUrl"]}