@boardwalk-labs/cli 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/dist/bundle.d.ts +0 -9
- package/dist/bundle.js +0 -43
- package/dist/bundle.js.map +1 -1
- package/dist/commands/dev.d.ts +3 -0
- package/dist/commands/dev.js +61 -65
- package/dist/commands/dev.js.map +1 -1
- package/dist/credentials.js +2 -6
- package/dist/credentials.js.map +1 -1
- package/dist/dev/engine.d.ts +38 -0
- package/dist/dev/engine.js +41 -0
- package/dist/dev/engine.js.map +1 -0
- package/dist/index.js +23 -4
- package/dist/index.js.map +1 -1
- package/package.json +8 -2
- package/dist/dev/host.d.ts +0 -16
- package/dist/dev/host.js +0 -76
- package/dist/dev/host.js.map +0 -1
package/README.md
CHANGED
|
@@ -4,7 +4,7 @@ The `boardwalk` command — author, validate, run locally, and deploy [Boardwalk
|
|
|
4
4
|
|
|
5
5
|
```
|
|
6
6
|
boardwalk init my-workflow # scaffold a project from a template
|
|
7
|
-
boardwalk dev ./index.ts # run it
|
|
7
|
+
boardwalk dev ./index.ts # run it locally — no account needed
|
|
8
8
|
boardwalk check ./index.ts # validate locally (no auth/network)
|
|
9
9
|
boardwalk login # browser OAuth (PKCE) → stores a session
|
|
10
10
|
boardwalk deploy ./index.ts --org my-team # ship it to the Boardwalk platform
|
|
@@ -17,7 +17,7 @@ boardwalk logout / whoami
|
|
|
17
17
|
|
|
18
18
|
- **`init [dir]`** — scaffold a workflow project: program file, `package.json`, `.env.example`,
|
|
19
19
|
`.gitignore`. The default template runs green under `dev` immediately.
|
|
20
|
-
- **`dev <file|dir>`** — run the workflow
|
|
20
|
+
- **`dev <file|dir>`** — run the workflow locally. Derives and validates the manifest
|
|
21
21
|
(precise errors before anything runs), bundles the program, executes it in-process, and streams
|
|
22
22
|
the run-event log. Secrets resolve from `.env` (or `--env <path>`); values never print.
|
|
23
23
|
Exit code is the run's verdict: `0` completed, `1` failed, `130` cancelled (Ctrl-C).
|
|
@@ -57,7 +57,7 @@ your `meta` — the CLI never sends a hand-built manifest.
|
|
|
57
57
|
|
|
58
58
|
### Project link (`.boardwalk/project.json`)
|
|
59
59
|
|
|
60
|
-
The first `deploy`/`run` in a directory writes `.boardwalk/project.json`
|
|
60
|
+
The first `deploy`/`run` in a directory writes a gitignored `.boardwalk/project.json`
|
|
61
61
|
with `{ orgSlug, workflowId }`. After that the workflow is identified by that stored **id**, so
|
|
62
62
|
`--org` is optional and renaming `meta.name` or the entry file updates the same workflow instead of
|
|
63
63
|
forking a new one. On a fresh clone, pass `--org` once to re-link (it adopts an existing same-name
|
package/dist/bundle.d.ts
CHANGED
|
@@ -24,12 +24,3 @@ export interface BundledProgram {
|
|
|
24
24
|
* `sourceMappingURL` matches the artifact's layout.
|
|
25
25
|
*/
|
|
26
26
|
export declare function bundleWorkflowWithMap(entryFile: string): Promise<BundledProgram>;
|
|
27
|
-
/**
|
|
28
|
-
* esbuild-bundle the entry for `boardwalk dev` — like {@link bundleWorkflow}, but
|
|
29
|
-
* `@boardwalk-labs/workflow` imports are rewritten to the ABSOLUTE path of the CLI's own installed
|
|
30
|
-
* copy. The SDK's host state is a module-level singleton, so the program and the CLI must load
|
|
31
|
-
* the SAME module instance for `installHost` (called by the CLI) to be visible to the program's
|
|
32
|
-
* hooks; an absolute specifier guarantees that regardless of where the bundle file lives or
|
|
33
|
-
* whether the project has its own `node_modules`.
|
|
34
|
-
*/
|
|
35
|
-
export declare function bundleForDev(entryFile: string): Promise<string>;
|
package/dist/bundle.js
CHANGED
|
@@ -9,7 +9,6 @@
|
|
|
9
9
|
// - Bundling at deploy keeps run cold-start fast and pins deps at PR time.
|
|
10
10
|
import { build } from "esbuild";
|
|
11
11
|
import { existsSync, readFileSync, statSync } from "node:fs";
|
|
12
|
-
import { createRequire } from "node:module";
|
|
13
12
|
import { join, resolve } from "node:path";
|
|
14
13
|
import { CliError } from "./errors.js";
|
|
15
14
|
const SDK_PACKAGE = "@boardwalk-labs/workflow";
|
|
@@ -115,48 +114,6 @@ export async function bundleWorkflowWithMap(entryFile) {
|
|
|
115
114
|
}
|
|
116
115
|
return { code: js.text, map: map.text };
|
|
117
116
|
}
|
|
118
|
-
/**
|
|
119
|
-
* esbuild-bundle the entry for `boardwalk dev` — like {@link bundleWorkflow}, but
|
|
120
|
-
* `@boardwalk-labs/workflow` imports are rewritten to the ABSOLUTE path of the CLI's own installed
|
|
121
|
-
* copy. The SDK's host state is a module-level singleton, so the program and the CLI must load
|
|
122
|
-
* the SAME module instance for `installHost` (called by the CLI) to be visible to the program's
|
|
123
|
-
* hooks; an absolute specifier guarantees that regardless of where the bundle file lives or
|
|
124
|
-
* whether the project has its own `node_modules`.
|
|
125
|
-
*/
|
|
126
|
-
export async function bundleForDev(entryFile) {
|
|
127
|
-
const requireFromCli = createRequire(import.meta.url);
|
|
128
|
-
let result;
|
|
129
|
-
try {
|
|
130
|
-
result = await build({
|
|
131
|
-
entryPoints: [entryFile],
|
|
132
|
-
bundle: true,
|
|
133
|
-
format: "esm",
|
|
134
|
-
platform: "node",
|
|
135
|
-
target: "node24",
|
|
136
|
-
write: false,
|
|
137
|
-
logLevel: "silent",
|
|
138
|
-
legalComments: "none",
|
|
139
|
-
plugins: [
|
|
140
|
-
{
|
|
141
|
-
name: "boardwalk-sdk-shared-instance",
|
|
142
|
-
setup(b) {
|
|
143
|
-
b.onResolve({ filter: /^@boardwalk-labs\/workflow(\/.+)?$/ }, (args) => ({
|
|
144
|
-
path: requireFromCli.resolve(args.path),
|
|
145
|
-
external: true,
|
|
146
|
-
}));
|
|
147
|
-
},
|
|
148
|
-
},
|
|
149
|
-
],
|
|
150
|
-
});
|
|
151
|
-
}
|
|
152
|
-
catch (err) {
|
|
153
|
-
throw new CliError(`Bundling failed for ${entryFile}.`, err instanceof Error ? err.message : undefined);
|
|
154
|
-
}
|
|
155
|
-
const out = result.outputFiles[0];
|
|
156
|
-
if (out === undefined)
|
|
157
|
-
throw new CliError(`Bundling produced no output for ${entryFile}.`);
|
|
158
|
-
return out.text;
|
|
159
|
-
}
|
|
160
117
|
function readPkgEntry(pkgPath) {
|
|
161
118
|
try {
|
|
162
119
|
const parsed = JSON.parse(readFileSync(pkgPath, "utf8"));
|
package/dist/bundle.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bundle.js","sourceRoot":"","sources":["../src/bundle.ts"],"names":[],"mappings":"AAAA,oBAAoB;AACpB,EAAE;AACF,gGAAgG;AAChG,8FAA8F;AAC9F,qFAAqF;AACrF,oGAAoG;AACpG,wFAAwF;AACxF,4FAA4F;AAC5F,6EAA6E;AAE7E,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC7D,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"bundle.js","sourceRoot":"","sources":["../src/bundle.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/dev.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type DevEngineFactory } from "../dev/engine.js";
|
|
1
2
|
export interface DevOptions {
|
|
2
3
|
file: string;
|
|
3
4
|
input?: string | undefined;
|
|
@@ -10,5 +11,7 @@ export interface DevDeps {
|
|
|
10
11
|
write?: (text: string) => void;
|
|
11
12
|
/** SIGINT hook installer — injected so tests don't touch real process signals. */
|
|
12
13
|
onSigint?: (handler: () => void) => () => void;
|
|
14
|
+
/** Engine factory — injected so tests can drive orchestration without spawning processes. */
|
|
15
|
+
createEngine?: DevEngineFactory;
|
|
13
16
|
}
|
|
14
17
|
export declare function runDev(opts: DevOptions, deps?: DevDeps): Promise<void>;
|
package/dist/commands/dev.js
CHANGED
|
@@ -1,22 +1,20 @@
|
|
|
1
1
|
// `boardwalk dev <file|dir>` — run the workflow NOW, locally, no account.
|
|
2
2
|
//
|
|
3
3
|
// The tightest possible author loop: derive + validate the manifest (precise errors before
|
|
4
|
-
// anything runs), bundle the program,
|
|
5
|
-
//
|
|
6
|
-
//
|
|
4
|
+
// anything runs), bundle the program, then hand the whole run to @boardwalk-labs/engine in
|
|
5
|
+
// embedded mode and stream its run-event log through the channel-filtered renderer — the same
|
|
6
|
+
// flags, frames, and run semantics (agent(), workflows.call, sleep, secrets) every engine speaks.
|
|
7
7
|
//
|
|
8
8
|
// Exit codes: 0 completed · 1 failed · 130 cancelled (Ctrl-C).
|
|
9
|
-
import { mkdtempSync, readFileSync, rmSync
|
|
9
|
+
import { mkdtempSync, readFileSync, rmSync } from "node:fs";
|
|
10
10
|
import { tmpdir } from "node:os";
|
|
11
11
|
import { join } from "node:path";
|
|
12
|
-
import { pathToFileURL } from "node:url";
|
|
13
12
|
import { parseEnv } from "node:util";
|
|
14
|
-
import { installConfig, installHost, installInput, resetRuntime, takeDeclaredOutput, } from "@boardwalk-labs/workflow/runtime";
|
|
15
13
|
import { CliError } from "../errors.js";
|
|
16
|
-
import {
|
|
14
|
+
import { bundleWorkflow, resolveEntry } from "../bundle.js";
|
|
17
15
|
import { extractValidatedManifest } from "../manifest.js";
|
|
18
16
|
import { projectDirFor } from "../project.js";
|
|
19
|
-
import {
|
|
17
|
+
import { createDevEngine } from "../dev/engine.js";
|
|
20
18
|
import { createRenderer, parseChannels } from "../render/renderer.js";
|
|
21
19
|
import { parseInput } from "./run.js";
|
|
22
20
|
export async function runDev(opts, deps = {}) {
|
|
@@ -24,79 +22,54 @@ export async function runDev(opts, deps = {}) {
|
|
|
24
22
|
((text) => {
|
|
25
23
|
process.stdout.write(text);
|
|
26
24
|
});
|
|
25
|
+
const createEngine = deps.createEngine ?? createDevEngine;
|
|
27
26
|
const channels = parseChannels({ verbose: opts.verbose, stream: opts.stream });
|
|
28
27
|
const renderer = createRenderer(channels, write);
|
|
29
28
|
// 1. Validate before anything runs — errors point at the author's real file.
|
|
30
29
|
const entry = resolveEntry(opts.file);
|
|
31
|
-
|
|
32
|
-
const input = parseInput(opts.input);
|
|
30
|
+
extractValidatedManifest(readFileSync(entry, "utf8"), entry);
|
|
31
|
+
const input = jsonInput(parseInput(opts.input));
|
|
33
32
|
// 2. The local secret store: the project's env file (explicit --env must exist).
|
|
34
33
|
const projectDir = projectDirFor(opts.file);
|
|
35
34
|
const envPath = opts.envFile ?? join(projectDir, ".env");
|
|
36
35
|
const envVars = loadEnvFile(envPath, opts.envFile !== undefined);
|
|
37
|
-
// 3.
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
const runsDir = join(projectDir, ".bw-runs", runId);
|
|
46
|
-
resetRuntime();
|
|
47
|
-
installHost(createDevHost({
|
|
48
|
-
manifest,
|
|
49
|
-
envVars,
|
|
36
|
+
// 3. Bundle the program — `@boardwalk-labs/workflow` left EXTERNAL; the engine resolves it from
|
|
37
|
+
// its own copy (one shared SDK instance, so the host seam works) when it runs the program.
|
|
38
|
+
const program = await bundleWorkflow(entry);
|
|
39
|
+
// 4. Run it on the embedded engine in a throwaway data dir; stream its events.
|
|
40
|
+
const dataDir = mkdtempSync(join(tmpdir(), "bw-dev-"));
|
|
41
|
+
const engine = createEngine({
|
|
42
|
+
dataDir,
|
|
43
|
+
env: Object.fromEntries(envVars),
|
|
50
44
|
envLabel: envPath,
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
45
|
+
});
|
|
46
|
+
const unsubscribe = engine.onEvent((event) => {
|
|
47
|
+
renderer.render(event);
|
|
48
|
+
});
|
|
49
|
+
// Ctrl-C cancels the run cooperatively; `wait` then resolves `cancelled` → exit 130.
|
|
50
|
+
let runId = null;
|
|
57
51
|
const restoreSigint = (deps.onSigint ?? defaultOnSigint)(() => {
|
|
58
|
-
|
|
59
|
-
|
|
52
|
+
if (runId !== null)
|
|
53
|
+
void engine.cancel(runId);
|
|
60
54
|
});
|
|
61
55
|
try {
|
|
62
|
-
const
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
56
|
+
const workflow = engine.deploy(program);
|
|
57
|
+
const run = engine.start(workflow.name, input);
|
|
58
|
+
runId = run.id;
|
|
59
|
+
const result = await engine.wait(run.id);
|
|
60
|
+
if (result.status === "completed")
|
|
61
|
+
return;
|
|
62
|
+
if (result.status === "cancelled") {
|
|
63
|
+
throw new CliError("Run cancelled.", undefined, undefined, 130);
|
|
70
64
|
}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
// its verdict and then throws to mark the run failed.
|
|
74
|
-
const declaredBeforeFailure = takeDeclaredOutput();
|
|
75
|
-
if (declaredBeforeFailure !== null) {
|
|
76
|
-
emit({ kind: "output", value: declaredBeforeFailure.value });
|
|
77
|
-
}
|
|
78
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
79
|
-
emit({
|
|
80
|
-
kind: "run_status",
|
|
81
|
-
status: "failed",
|
|
82
|
-
error: { code: "PROGRAM_ERROR", message },
|
|
83
|
-
});
|
|
84
|
-
const hint = err instanceof CliError ? err.hint : undefined;
|
|
85
|
-
throw new CliError(`Run failed: ${message}`, hint, undefined, 1);
|
|
86
|
-
}
|
|
87
|
-
if (typeof mod.default === "function") {
|
|
88
|
-
console.error("warning: the program has a default export, which Boardwalk does not call — a workflow " +
|
|
89
|
-
"runs top-to-bottom as a script. Move the body to the top level (top-level await is fine).");
|
|
90
|
-
}
|
|
91
|
-
const declared = takeDeclaredOutput();
|
|
92
|
-
if (declared !== null)
|
|
93
|
-
emit({ kind: "output", value: declared.value });
|
|
94
|
-
emit({ kind: "run_status", status: "completed" });
|
|
65
|
+
const message = result.error?.message ?? "the run failed";
|
|
66
|
+
throw new CliError(`Run failed: ${message}`, undefined, undefined, 1);
|
|
95
67
|
}
|
|
96
68
|
finally {
|
|
69
|
+
unsubscribe();
|
|
97
70
|
restoreSigint();
|
|
98
|
-
|
|
99
|
-
rmSync(
|
|
71
|
+
engine.close();
|
|
72
|
+
rmSync(dataDir, { recursive: true, force: true });
|
|
100
73
|
}
|
|
101
74
|
}
|
|
102
75
|
/** Parse the env file into a map. A missing file is only an error when it was named explicitly. */
|
|
@@ -119,6 +92,29 @@ function loadEnvFile(path, explicit) {
|
|
|
119
92
|
}
|
|
120
93
|
return out;
|
|
121
94
|
}
|
|
95
|
+
/** Narrow a `parseInput` result (always JSON.parse output, or undefined) to a JsonValue. */
|
|
96
|
+
function jsonInput(value) {
|
|
97
|
+
return value === undefined ? undefined : asJsonValue(value);
|
|
98
|
+
}
|
|
99
|
+
function asJsonValue(value) {
|
|
100
|
+
if (value === null ||
|
|
101
|
+
typeof value === "string" ||
|
|
102
|
+
typeof value === "number" ||
|
|
103
|
+
typeof value === "boolean") {
|
|
104
|
+
return value;
|
|
105
|
+
}
|
|
106
|
+
if (Array.isArray(value)) {
|
|
107
|
+
return value.map(asJsonValue);
|
|
108
|
+
}
|
|
109
|
+
if (typeof value === "object") {
|
|
110
|
+
const out = {};
|
|
111
|
+
for (const [key, entry] of Object.entries(value)) {
|
|
112
|
+
out[key] = asJsonValue(entry);
|
|
113
|
+
}
|
|
114
|
+
return out;
|
|
115
|
+
}
|
|
116
|
+
throw new CliError("--input must be JSON (no functions or undefined values).");
|
|
117
|
+
}
|
|
122
118
|
function defaultOnSigint(handler) {
|
|
123
119
|
process.once("SIGINT", handler);
|
|
124
120
|
return () => {
|
package/dist/commands/dev.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,EAAE;AACF,2FAA2F;AAC3F,
|
|
1
|
+
{"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"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"}
|
package/dist/credentials.js
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
// (owner-only) — the same posture as the `gh` / `aws` CLIs. AES-at-rest + an OS keychain are a
|
|
6
6
|
// hardening follow-up; the interface here (get/put/clear a session) doesn't change when that lands.
|
|
7
7
|
import { mkdirSync, readFileSync, writeFileSync, rmSync } from "node:fs";
|
|
8
|
-
import { join } from "node:path";
|
|
8
|
+
import { dirname, join } from "node:path";
|
|
9
9
|
export class CredentialStore {
|
|
10
10
|
filePath;
|
|
11
11
|
constructor(filePath) {
|
|
@@ -52,14 +52,10 @@ export class CredentialStore {
|
|
|
52
52
|
return {};
|
|
53
53
|
}
|
|
54
54
|
write(file) {
|
|
55
|
-
mkdirSync(
|
|
55
|
+
mkdirSync(dirname(this.filePath), { recursive: true, mode: 0o700 });
|
|
56
56
|
writeFileSync(this.filePath, `${JSON.stringify(file, null, 2)}\n`, { mode: 0o600 });
|
|
57
57
|
}
|
|
58
58
|
}
|
|
59
|
-
function dirOf(filePath) {
|
|
60
|
-
const idx = filePath.lastIndexOf("/");
|
|
61
|
-
return idx <= 0 ? "." : filePath.slice(0, idx);
|
|
62
|
-
}
|
|
63
59
|
function isValidSession(value) {
|
|
64
60
|
if (typeof value !== "object" || value === null)
|
|
65
61
|
return false;
|
package/dist/credentials.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"AAAA,kGAAkG;AAClG,WAAW;AACX,EAAE;AACF,kGAAkG;AAClG,+FAA+F;AAC/F,oGAAoG;AAEpG,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACzE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"AAAA,kGAAkG;AAClG,WAAW;AACX,EAAE;AACF,kGAAkG;AAClG,+FAA+F;AAC/F,oGAAoG;AAEpG,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACzE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAmB1C,MAAM,OAAO,eAAe;IACG;IAA7B,YAA6B,QAAgB;QAAhB,aAAQ,GAAR,QAAQ,CAAQ;IAAG,CAAC;IAEjD,MAAM,CAAC,WAAW,CAAC,SAAiB;QAClC,OAAO,IAAI,eAAe,CAAC,IAAI,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAClE,CAAC;IAED,UAAU;QACR,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC;QACpC,OAAO,OAAO,KAAK,SAAS,IAAI,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;IAC3E,CAAC;IAED,UAAU,CAAC,OAAsB;QAC/B,IAAI,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;IAC1B,CAAC;IAED,+EAA+E;IAC/E,KAAK;QACH,IAAI,CAAC;YACH,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,CAAC;QAAC,MAAM,CAAC;YACP,iEAAiE;QACnE,CAAC;IACH,CAAC;IAEO,IAAI;QACV,IAAI,GAAW,CAAC;QAChB,IAAI,CAAC;YACH,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC5C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC,CAAC,sCAAsC;QACnD,CAAC;QACD,IAAI,CAAC;YACH,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACxC,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,SAAS,IAAI,MAAM,EAAE,CAAC;gBACzE,MAAM,OAAO,GAAY,MAAM,CAAC,OAAO,CAAC;gBACxC,IAAI,cAAc,CAAC,OAAO,CAAC;oBAAE,OAAO,EAAE,OAAO,EAAE,CAAC;YAClD,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,6EAA6E;QAC/E,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;IAEO,KAAK,CAAC,IAAqB;QACjC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACpE,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACtF,CAAC;CACF;AAED,SAAS,cAAc,CAAC,KAAc;IACpC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC9D,MAAM,CAAC,GAAG,KAAgC,CAAC;IAC3C,OAAO,OAAO,CAAC,CAAC,WAAW,KAAK,QAAQ,IAAI,CAAC,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;AACvE,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { RunErrorShape, RunStatus } from "@boardwalk-labs/engine";
|
|
2
|
+
import type { JsonValue, RunEvent } from "@boardwalk-labs/workflow";
|
|
3
|
+
/** The terminal outcome `dev` needs from a run. */
|
|
4
|
+
export interface DevRunResult {
|
|
5
|
+
status: RunStatus;
|
|
6
|
+
output: JsonValue | null;
|
|
7
|
+
error: RunErrorShape | null;
|
|
8
|
+
}
|
|
9
|
+
/** The slice of the engine facade `boardwalk dev` drives. The real {@link Engine} satisfies it. */
|
|
10
|
+
export interface DevEngine {
|
|
11
|
+
/** Subscribe to the run's stamped events (the envelope is already applied). */
|
|
12
|
+
onEvent(listener: (event: RunEvent) => void): () => void;
|
|
13
|
+
/** Deploy the bundled program; returns the derived workflow name. */
|
|
14
|
+
deploy(program: string): {
|
|
15
|
+
name: string;
|
|
16
|
+
};
|
|
17
|
+
/** Queue + dispatch a run; returns its id immediately. */
|
|
18
|
+
start(workflowName: string, input: JsonValue | undefined): {
|
|
19
|
+
id: string;
|
|
20
|
+
};
|
|
21
|
+
/** Resolve when the run reaches a terminal status. */
|
|
22
|
+
wait(runId: string): Promise<DevRunResult>;
|
|
23
|
+
/** Cooperatively cancel a run (Ctrl-C). */
|
|
24
|
+
cancel(runId: string): Promise<void>;
|
|
25
|
+
/** Release the engine (DB + any held processes). */
|
|
26
|
+
close(): void;
|
|
27
|
+
}
|
|
28
|
+
export interface DevEngineOptions {
|
|
29
|
+
/** Throwaway per-invocation data dir (SQLite + run dirs live here; removed after the run). */
|
|
30
|
+
dataDir: string;
|
|
31
|
+
/** The local secret/env source (parsed .env). The engine falls back to process.env. */
|
|
32
|
+
env: Record<string, string>;
|
|
33
|
+
/** Where secrets come from, for the engine's error hints — never their values. */
|
|
34
|
+
envLabel: string;
|
|
35
|
+
}
|
|
36
|
+
export type DevEngineFactory = (opts: DevEngineOptions) => DevEngine;
|
|
37
|
+
/** Production factory: the real single-node engine in embedded mode. */
|
|
38
|
+
export declare const createDevEngine: DevEngineFactory;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
// The engine seam for `boardwalk dev`.
|
|
2
|
+
//
|
|
3
|
+
// `dev` delegates a one-off local run to @boardwalk-labs/engine in EMBEDDED mode: construct →
|
|
4
|
+
// deploy → start → stream events → wait → close. The engine owns everything that makes a real
|
|
5
|
+
// run real — spawning the run process, the agent() loop, workflows.call, secret resolution from
|
|
6
|
+
// env, hold-and-pay sleep, crash-restart — so `dev` matches the server and hosted engines by
|
|
7
|
+
// construction (parity), instead of re-implementing a thinner host.
|
|
8
|
+
//
|
|
9
|
+
// The real Engine is wrapped behind a tiny interface so tests can drive dev's orchestration
|
|
10
|
+
// (event rendering, exit codes, Ctrl-C cancel) with a fake, without spawning real processes.
|
|
11
|
+
import { Engine } from "@boardwalk-labs/engine";
|
|
12
|
+
/** Production factory: the real single-node engine in embedded mode. */
|
|
13
|
+
export const createDevEngine = (opts) => {
|
|
14
|
+
const engine = new Engine({
|
|
15
|
+
dataDir: opts.dataDir,
|
|
16
|
+
env: opts.env,
|
|
17
|
+
envLabel: opts.envLabel,
|
|
18
|
+
});
|
|
19
|
+
return {
|
|
20
|
+
onEvent: (listener) => engine.onEvent((row) => {
|
|
21
|
+
listener(row.event);
|
|
22
|
+
}),
|
|
23
|
+
deploy: (program) => {
|
|
24
|
+
const workflow = engine.deployWorkflow({ program });
|
|
25
|
+
return { name: workflow.name };
|
|
26
|
+
},
|
|
27
|
+
start: (workflowName, input) => {
|
|
28
|
+
const run = engine.startRun(workflowName, input !== undefined ? { input } : {});
|
|
29
|
+
return { id: run.id };
|
|
30
|
+
},
|
|
31
|
+
wait: async (runId) => {
|
|
32
|
+
const row = await engine.waitForRun(runId);
|
|
33
|
+
return { status: row.status, output: row.output, error: row.error };
|
|
34
|
+
},
|
|
35
|
+
cancel: (runId) => engine.cancelRun(runId),
|
|
36
|
+
close: () => {
|
|
37
|
+
engine.close();
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
};
|
|
41
|
+
//# sourceMappingURL=engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/dev/engine.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,EAAE;AACF,8FAA8F;AAC9F,8FAA8F;AAC9F,gGAAgG;AAChG,6FAA6F;AAC7F,oEAAoE;AACpE,EAAE;AACF,4FAA4F;AAC5F,6FAA6F;AAE7F,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAsChD,wEAAwE;AACxE,MAAM,CAAC,MAAM,eAAe,GAAqB,CAAC,IAAI,EAAE,EAAE;IACxD,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC;QACxB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,QAAQ,EAAE,IAAI,CAAC,QAAQ;KACxB,CAAC,CAAC;IACH,OAAO;QACL,OAAO,EAAE,CAAC,QAAQ,EAAE,EAAE,CACpB,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YACrB,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC,CAAC;QACJ,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE;YAClB,MAAM,QAAQ,GAAG,MAAM,CAAC,cAAc,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;YACpD,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC;QACjC,CAAC;QACD,KAAK,EAAE,CAAC,YAAY,EAAE,KAAK,EAAE,EAAE;YAC7B,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,YAAY,EAAE,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAChF,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC;QACxB,CAAC;QACD,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;YACpB,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YAC3C,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC;QACtE,CAAC;QACD,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC;QAC1C,KAAK,EAAE,GAAG,EAAE;YACV,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,CAAC;KACF,CAAC;AACJ,CAAC,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
//
|
|
3
3
|
// Commands:
|
|
4
4
|
// boardwalk init [dir] Scaffold a new workflow project from a template.
|
|
5
|
-
// boardwalk dev <file> Run the workflow now, locally
|
|
5
|
+
// boardwalk dev <file> Run the workflow now, locally (no account needed).
|
|
6
6
|
// boardwalk check <file> Validate a workflow locally (no auth/network).
|
|
7
7
|
// boardwalk login Authenticate via browser (OAuth PKCE).
|
|
8
8
|
// boardwalk logout Remove local credentials.
|
|
@@ -15,15 +15,34 @@
|
|
|
15
15
|
//
|
|
16
16
|
// Every command body is lazy-imported inside its action — `boardwalk --help` must stay fast, so
|
|
17
17
|
// nothing heavy (esbuild, the SDK extractor, the API client) loads until its command actually runs.
|
|
18
|
+
import { readFileSync } from "node:fs";
|
|
18
19
|
import { Command } from "commander";
|
|
19
20
|
import { CliError } from "./errors.js";
|
|
20
21
|
import { loadConfig } from "./config.js";
|
|
21
|
-
|
|
22
|
+
// Read the version from package.json (one level up from both src/ and dist/) so `--version`
|
|
23
|
+
// can never drift from the published package. Cheap sync read at load — doesn't touch the
|
|
24
|
+
// lazy-import budget that keeps `--help` fast.
|
|
25
|
+
function readVersion() {
|
|
26
|
+
try {
|
|
27
|
+
const raw = readFileSync(new URL("../package.json", import.meta.url), "utf8");
|
|
28
|
+
const parsed = JSON.parse(raw);
|
|
29
|
+
if (typeof parsed === "object" && parsed !== null && "version" in parsed) {
|
|
30
|
+
const version = parsed.version;
|
|
31
|
+
if (typeof version === "string" && version.length > 0)
|
|
32
|
+
return version;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
// Fall through — a missing/unreadable package.json shouldn't break the CLI.
|
|
37
|
+
}
|
|
38
|
+
return "0.0.0";
|
|
39
|
+
}
|
|
40
|
+
const VERSION = readVersion();
|
|
22
41
|
function buildProgram() {
|
|
23
42
|
const program = new Command();
|
|
24
43
|
program
|
|
25
44
|
.name("boardwalk")
|
|
26
|
-
.description("Boardwalk CLI
|
|
45
|
+
.description("Boardwalk CLI: author and ship agent workflows.")
|
|
27
46
|
.version(VERSION);
|
|
28
47
|
program
|
|
29
48
|
.command("init")
|
|
@@ -43,7 +62,7 @@ function buildProgram() {
|
|
|
43
62
|
.option("--env <path>", "env file resolving secrets for the run (default: .env)")
|
|
44
63
|
.option("--verbose", "stream every event channel (agent turns, tool calls, logs)", false)
|
|
45
64
|
.option("--stream <channels>", "comma-separated channels: lifecycle,phase,output,log,agent")
|
|
46
|
-
.description("Run the workflow now, locally
|
|
65
|
+
.description("Run the workflow now, locally (no account needed).")
|
|
47
66
|
.action(async (file, options) => {
|
|
48
67
|
const { runDev } = await import("./commands/dev.js");
|
|
49
68
|
await runDev({
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,EAAE;AACF,YAAY;AACZ,yFAAyF;AACzF,2FAA2F;AAC3F,uFAAuF;AACvF,+EAA+E;AAC/E,kEAAkE;AAClE,kEAAkE;AAClE,sFAAsF;AACtF,0FAA0F;AAC1F,0EAA0E;AAC1E,EAAE;AACF,mGAAmG;AACnG,EAAE;AACF,gGAAgG;AAChG,oGAAoG;AAEpG,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,OAAO,GAAG,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,EAAE;AACF,YAAY;AACZ,yFAAyF;AACzF,2FAA2F;AAC3F,uFAAuF;AACvF,+EAA+E;AAC/E,kEAAkE;AAClE,kEAAkE;AAClE,sFAAsF;AACtF,0FAA0F;AAC1F,0EAA0E;AAC1E,EAAE;AACF,mGAAmG;AACnG,EAAE;AACF,gGAAgG;AAChG,oGAAoG;AAEpG,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,4FAA4F;AAC5F,0FAA0F;AAC1F,+CAA+C;AAC/C,SAAS,WAAW;IAClB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;QAC9E,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACxC,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,SAAS,IAAI,MAAM,EAAE,CAAC;YACzE,MAAM,OAAO,GAAY,MAAM,CAAC,OAAO,CAAC;YACxC,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;gBAAE,OAAO,OAAO,CAAC;QACxE,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,4EAA4E;IAC9E,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,OAAO,GAAG,WAAW,EAAE,CAAC;AAsB9B,SAAS,YAAY;IACnB,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAC9B,OAAO;SACJ,IAAI,CAAC,WAAW,CAAC;SACjB,WAAW,CAAC,iDAAiD,CAAC;SAC9D,OAAO,CAAC,OAAO,CAAC,CAAC;IAEpB,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,QAAQ,CAAC,OAAO,EAAE,iDAAiD,EAAE,GAAG,CAAC;SACzE,MAAM,CACL,mBAAmB,EACnB,wEAAwE,EACxE,OAAO,CACR;SACA,WAAW,CAAC,kDAAkD,CAAC;SAC/D,MAAM,CAAC,KAAK,EAAE,GAAW,EAAE,OAA8B,EAAE,EAAE;QAC5D,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QACvD,MAAM,OAAO,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,OAAO,EAAE,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,KAAK,CAAC;SACd,QAAQ,CAAC,QAAQ,EAAE,+CAA+C,CAAC;SACnE,MAAM,CAAC,gBAAgB,EAAE,mDAAmD,CAAC;QAC9E,uFAAuF;QACvF,4FAA4F;SAC3F,MAAM,CAAC,cAAc,EAAE,wDAAwD,CAAC;SAChF,MAAM,CAAC,WAAW,EAAE,4DAA4D,EAAE,KAAK,CAAC;SACxF,MAAM,CAAC,qBAAqB,EAAE,4DAA4D,CAAC;SAC3F,WAAW,CAAC,oDAAoD,CAAC;SACjE,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,OAAsB,EAAE,EAAE;QACrD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;QACrD,MAAM,MAAM,CAAC;YACX,IAAI;YACJ,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,OAAO,EAAE,OAAO,CAAC,GAAG;YACpB,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,KAAK;YACjC,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,QAAQ,CAAC,QAAQ,EAAE,+CAA+C,CAAC;SACnE,WAAW,CAAC,oDAAoD,CAAC;SACjE,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,EAAE;QAC7B,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC;QACzD,MAAM,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,0EAA0E,CAAC;SACvF,MAAM,CAAC,eAAe,EAAE,wDAAwD,CAAC;SACjF,MAAM,CAAC,KAAK,EAAE,OAA2B,EAAE,EAAE;QAC5C,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;QAC3D,MAAM,QAAQ,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,2BAA2B,CAAC;SACxC,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;QAC5D,SAAS,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,2BAA2B,CAAC;SACxC,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;QAC5D,SAAS,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,QAAQ,CAAC,QAAQ,EAAE,+CAA+C,CAAC;SACnE,MAAM,CAAC,cAAc,EAAE,8DAA8D,CAAC;SACtF,MAAM,CAAC,WAAW,EAAE,mDAAmD,EAAE,KAAK,CAAC;SAC/E,MAAM,CAAC,iBAAiB,EAAE,yDAAyD,CAAC;SACpF,WAAW,CAAC,kDAAkD,CAAC;SAC/D,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,OAAyB,EAAE,EAAE;QACxD,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;QAC3D,MAAM,SAAS,CACb;YACE,IAAI;YACJ,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,KAAK,EAAE,OAAO,CAAC,MAAM,IAAI,KAAK;YAC9B,KAAK,EAAE,OAAO,CAAC,KAAK;SACrB,EACD,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,CACzB,CAAC;IACJ,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,KAAK,CAAC;SACd,QAAQ,CAAC,QAAQ,EAAE,+CAA+C,CAAC;SACnE,MAAM,CAAC,cAAc,EAAE,yDAAyD,CAAC;SACjF,MAAM,CAAC,gBAAgB,EAAE,mDAAmD,CAAC;SAC7E,MAAM,CAAC,WAAW,EAAE,wDAAwD,CAAC;SAC7E,MAAM,CAAC,iBAAiB,EAAE,yDAAyD,CAAC;SACpF,WAAW,CAAC,kEAAkE,CAAC;SAC/E,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,OAAsB,EAAE,EAAE;QACrD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;QACrD,MAAM,MAAM,CACV;YACE,IAAI;YACJ,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,MAAM,EAAE,OAAO,CAAC,IAAI,KAAK,KAAK;YAC9B,KAAK,EAAE,OAAO,CAAC,KAAK;SACrB,EACD,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,CACzB,CAAC;IACJ,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,QAAQ,CAAC,SAAS,EAAE,mBAAmB,CAAC;SACxC,MAAM,CAAC,iBAAiB,EAAE,yDAAyD,CAAC;SACpF,WAAW,CAAC,mCAAmC,CAAC;SAChD,MAAM,CAAC,KAAK,EAAE,KAAa,EAAE,OAA2B,EAAE,EAAE;QAC3D,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;QAC3D,MAAM,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;IAC7E,CAAC,CAAC,CAAC;IAEL,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,YAAY,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAChD,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;IAC5B,IAAI,GAAG,YAAY,QAAQ,EAAE,CAAC;QAC5B,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACvC,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS;YAAE,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QAC3D,OAAO,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,IAAI,CAAC,CAAC;IACvC,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACnB,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,15 +1,20 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@boardwalk-labs/cli",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"description": "The boardwalk CLI: author, validate, run, and deploy Boardwalk workflows.",
|
|
5
5
|
"license": "MIT",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://github.com/boardwalk-labs/cli.git"
|
|
9
|
+
},
|
|
10
|
+
"homepage": "https://github.com/boardwalk-labs/cli#readme",
|
|
6
11
|
"type": "module",
|
|
7
12
|
"engines": {
|
|
8
13
|
"node": ">=24.0.0"
|
|
9
14
|
},
|
|
10
15
|
"packageManager": "pnpm@10.23.0",
|
|
11
16
|
"bin": {
|
|
12
|
-
"boardwalk": "
|
|
17
|
+
"boardwalk": "bin/boardwalk.js"
|
|
13
18
|
},
|
|
14
19
|
"files": [
|
|
15
20
|
"dist",
|
|
@@ -30,6 +35,7 @@
|
|
|
30
35
|
"boardwalk": "tsx src/index.ts"
|
|
31
36
|
},
|
|
32
37
|
"dependencies": {
|
|
38
|
+
"@boardwalk-labs/engine": "^0.1.0",
|
|
33
39
|
"@boardwalk-labs/workflow": "^0.1.0",
|
|
34
40
|
"commander": "^13.1.0",
|
|
35
41
|
"env-paths": "^3.0.0",
|
package/dist/dev/host.d.ts
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import type { WorkflowManifest } from "@boardwalk-labs/workflow";
|
|
2
|
-
import type { WorkflowHost } from "@boardwalk-labs/workflow/runtime";
|
|
3
|
-
import type { RunEvent } from "@boardwalk-labs/workflow";
|
|
4
|
-
/** A run event minus its envelope — the emitter (dev.ts) stamps runId/turnId/seq/t. */
|
|
5
|
-
export type RunEventBody = RunEvent extends infer E ? E extends RunEvent ? Omit<E, "runId" | "turnId" | "seq" | "t"> : never : never;
|
|
6
|
-
export interface DevHostContext {
|
|
7
|
-
manifest: WorkflowManifest;
|
|
8
|
-
/** Parsed env file contents — the local secret store. */
|
|
9
|
-
envVars: ReadonlyMap<string, string>;
|
|
10
|
-
/** The env file path, for actionable error messages (never its contents). */
|
|
11
|
-
envLabel: string;
|
|
12
|
-
/** Directory artifacts are written under (created lazily). */
|
|
13
|
-
artifactsDir: string;
|
|
14
|
-
emit: (body: RunEventBody) => void;
|
|
15
|
-
}
|
|
16
|
-
export declare function createDevHost(ctx: DevHostContext): WorkflowHost;
|
package/dist/dev/host.js
DELETED
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
// The `boardwalk dev` WorkflowHost — the minimal embedded host backing a one-off local run.
|
|
2
|
-
//
|
|
3
|
-
// Scope (v0.1, until `@boardwalk-labs/engine` ships and `dev` delegates to its embedded mode):
|
|
4
|
-
// - secrets resolve from the project's env file (fail-closed against `meta.secrets`)
|
|
5
|
-
// - sleep really sleeps (hold-and-pay semantics: locals survive, the process waits)
|
|
6
|
-
// - Phase() markers and output() flow into the run-event stream
|
|
7
|
-
// - artifacts write under `.bw-runs/<runId>/artifacts/`
|
|
8
|
-
// - agent() and workflows.call() fail with a clear pointer at what supports them
|
|
9
|
-
//
|
|
10
|
-
// Secret VALUES never reach the event stream or any error message.
|
|
11
|
-
import { mkdirSync, writeFileSync } from "node:fs";
|
|
12
|
-
import { join } from "node:path";
|
|
13
|
-
import { pathToFileURL } from "node:url";
|
|
14
|
-
import { CliError } from "../errors.js";
|
|
15
|
-
export function createDevHost(ctx) {
|
|
16
|
-
let phaseCount = 0;
|
|
17
|
-
let artifactCount = 0;
|
|
18
|
-
return {
|
|
19
|
-
setPhase(name, opts) {
|
|
20
|
-
phaseCount += 1;
|
|
21
|
-
ctx.emit({ kind: "phase", name, id: opts?.id ?? `phase-${String(phaseCount)}` });
|
|
22
|
-
},
|
|
23
|
-
agent() {
|
|
24
|
-
throw new CliError("agent() isn't available in `boardwalk dev` yet.", "The embedded local engine ships with @boardwalk-labs/engine — until then, deploy and use " +
|
|
25
|
-
"`boardwalk run` to execute agent loops.");
|
|
26
|
-
},
|
|
27
|
-
callWorkflow() {
|
|
28
|
-
throw new CliError("workflows.call() isn't available in `boardwalk dev` — durable child runs need an engine.", "Deploy and use `boardwalk run`, or run the callee directly with `boardwalk dev <its file>`.");
|
|
29
|
-
},
|
|
30
|
-
async sleep(arg) {
|
|
31
|
-
const ms = sleepMs(arg);
|
|
32
|
-
if (ms <= 0)
|
|
33
|
-
return;
|
|
34
|
-
await new Promise((resolve) => {
|
|
35
|
-
setTimeout(resolve, ms);
|
|
36
|
-
});
|
|
37
|
-
},
|
|
38
|
-
getSecret(name) {
|
|
39
|
-
const declared = (ctx.manifest.secrets ?? []).some((s) => s.name === name);
|
|
40
|
-
if (!declared) {
|
|
41
|
-
throw new CliError(`Secret "${name}" is not declared in meta.secrets.`, `Add { name: "${name}" } to meta.secrets — secret access is fail-closed everywhere.`);
|
|
42
|
-
}
|
|
43
|
-
const value = ctx.envVars.get(name) ?? process.env[name];
|
|
44
|
-
if (value === undefined || value.length === 0) {
|
|
45
|
-
throw new CliError(`Secret "${name}" has no value for this local run.`, `Set ${name}=… in ${ctx.envLabel} (boardwalk dev resolves secrets from your env file).`);
|
|
46
|
-
}
|
|
47
|
-
return Promise.resolve(value);
|
|
48
|
-
},
|
|
49
|
-
writeArtifact(name, _contentType, body, _metadata) {
|
|
50
|
-
if (name.includes("/") || name.includes("\\") || name.includes("..")) {
|
|
51
|
-
throw new CliError(`Artifact name "${name}" must be a plain file name.`);
|
|
52
|
-
}
|
|
53
|
-
mkdirSync(ctx.artifactsDir, { recursive: true });
|
|
54
|
-
const path = join(ctx.artifactsDir, name);
|
|
55
|
-
writeFileSync(path, body);
|
|
56
|
-
artifactCount += 1;
|
|
57
|
-
return Promise.resolve({
|
|
58
|
-
id: `art-${String(artifactCount)}`,
|
|
59
|
-
name,
|
|
60
|
-
url: pathToFileURL(path).href,
|
|
61
|
-
});
|
|
62
|
-
},
|
|
63
|
-
};
|
|
64
|
-
}
|
|
65
|
-
function sleepMs(arg) {
|
|
66
|
-
if (typeof arg === "number")
|
|
67
|
-
return arg;
|
|
68
|
-
if ("durationMs" in arg)
|
|
69
|
-
return arg.durationMs;
|
|
70
|
-
const until = arg.until instanceof Date ? arg.until.getTime() : Date.parse(arg.until);
|
|
71
|
-
if (Number.isNaN(until)) {
|
|
72
|
-
throw new CliError(`sleep({ until }) got an unparseable date: ${String(arg.until)}`);
|
|
73
|
-
}
|
|
74
|
-
return until - Date.now();
|
|
75
|
-
}
|
|
76
|
-
//# sourceMappingURL=host.js.map
|
package/dist/dev/host.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"host.js","sourceRoot":"","sources":["../../src/dev/host.ts"],"names":[],"mappings":"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"}
|