@boardwalk-labs/cli 0.1.8 → 0.1.10

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
@@ -44,7 +44,7 @@ boardwalk dev ./index.ts --stream phase,log
44
44
 
45
45
  ## Deploying
46
46
 
47
- - **`deploy <file|dir> --org <slug>`** — create/update the workflow (idempotent by `meta.name`).
47
+ - **`deploy <file|dir> --org <slug>`** — create/update the workflow (idempotent by `meta.slug`).
48
48
  `--dry-run` prints the plan only.
49
49
  - **`run <file|dir> --org <slug>`** — deploy the current source, trigger a **real run on the
50
50
  platform**, and wait for it to finish. `--no-wait` triggers and exits.
@@ -59,7 +59,7 @@ your `meta` — the CLI never sends a hand-built manifest.
59
59
 
60
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
- `--org` is optional and renaming `meta.name` or the entry file updates the same workflow instead of
62
+ `--org` is optional and renaming `meta.slug` 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
64
64
  workflow if present, else creates one).
65
65
 
package/dist/client.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import type { FetchLike } from "./auth/pkce.js";
2
2
  export interface WorkflowSummary {
3
3
  id: string;
4
- name: string;
4
+ slug: string;
5
5
  currentVersionId: string | null;
6
6
  }
7
7
  export interface DeployResult {
@@ -19,10 +19,10 @@ export async function runBuild(opts, deps = {}) {
19
19
  // Validate before bundling: precise manifest errors here, and the name seeds the default output.
20
20
  const manifest = extractValidatedManifest(readFileSync(entry, "utf8"), entry);
21
21
  const program = await bundleWorkflow(entry);
22
- const outPath = resolve(opts.out ?? `${manifest.name}.mjs`);
22
+ const outPath = resolve(opts.out ?? `${manifest.slug}.mjs`);
23
23
  mkdirSync(dirname(outPath), { recursive: true });
24
24
  writeFileSync(outPath, program, "utf8");
25
- log(`built "${manifest.name}" → ${outPath}`);
25
+ log(`built "${manifest.slug}" → ${outPath}`);
26
26
  return outPath;
27
27
  }
28
28
  //# sourceMappingURL=build.js.map
@@ -22,7 +22,7 @@ export async function runCheck(opts, deps = {}) {
22
22
  // Build the artifact (esbuild bundle + assets) — proves the program compiles end-to-end.
23
23
  const artifact = await buildArtifact(opts.file);
24
24
  const assets = artifact.assetPaths.length;
25
- log(`✓ "${manifest.name}" is valid`);
25
+ log(`✓ "${manifest.slug}" is valid`);
26
26
  log(` entry: ${artifact.entry}`);
27
27
  log(` triggers: ${manifest.triggers.map((t) => t.kind).join(", ")}`);
28
28
  const secrets = manifest.permissions?.secrets;
@@ -31,7 +31,7 @@ export async function runDeploy(opts, deps) {
31
31
  const dep = await deployWithLink(client, { orgSlug: opts.org, target: opts.file, prog });
32
32
  if (dep.gitignoreUpdated)
33
33
  log(" linked → .boardwalk/project.json (added .boardwalk/ to .gitignore)");
34
- log(`✓ ${dep.outcome} "${prog.name}" version ${String(dep.versionNumber)} (${dep.workflowId})`);
34
+ log(`✓ ${dep.outcome} "${prog.slug}" version ${String(dep.versionNumber)} (${dep.workflowId})`);
35
35
  }
36
36
  /** Read-only preview of what `deploy` would do (no writes). */
37
37
  async function printPlan(client, opts, prog, log) {
@@ -41,12 +41,12 @@ async function printPlan(client, opts, prog, log) {
41
41
  return;
42
42
  }
43
43
  if (opts.org === undefined || opts.org.length === 0) {
44
- log(`plan: CREATE "${prog.name}" (unlinked — pass --org to check for an existing match)`);
44
+ log(`plan: CREATE "${prog.slug}" (unlinked — pass --org to check for an existing match)`);
45
45
  return;
46
46
  }
47
- const plan = planDeploy(await client.listWorkflows(opts.org), prog.name);
47
+ const plan = planDeploy(await client.listWorkflows(opts.org), prog.slug);
48
48
  log(plan.action === "create"
49
- ? `plan: CREATE "${prog.name}" in org ${opts.org}`
50
- : `plan: ADOPT existing "${prog.name}" (${plan.workflowId ?? "?"}) → new version`);
49
+ ? `plan: CREATE "${prog.slug}" in org ${opts.org}`
50
+ : `plan: ADOPT existing "${prog.slug}" (${plan.workflowId ?? "?"}) → new version`);
51
51
  }
52
52
  //# sourceMappingURL=deploy.js.map
@@ -70,7 +70,7 @@ export async function runDev(opts, deps = {}) {
70
70
  });
71
71
  try {
72
72
  const workflow = engine.deploy(program);
73
- const run = engine.start(workflow.name, input);
73
+ const run = engine.start(workflow.slug, input);
74
74
  runId = run.id;
75
75
  const result = await engine.wait(run.id);
76
76
  if (result.status === "completed")
@@ -8,5 +8,5 @@ export interface InitDeps {
8
8
  env?: NodeJS.ProcessEnv;
9
9
  }
10
10
  export declare function runInit(opts: InitOptions, deps?: InitDeps): Promise<void>;
11
- /** Derive a manifest-legal workflow name from the target directory's basename. */
11
+ /** Derive a manifest-legal workflow slug from the target directory's basename. */
12
12
  export declare function workflowNameFor(absDir: string): string;
@@ -17,7 +17,8 @@ const DEFAULT_TEMPLATES_URL = "https://raw.githubusercontent.com/boardwalk-labs/
17
17
  const HELLO_PROGRAM = `import { input, output, type WorkflowMeta } from "@boardwalk-labs/workflow";
18
18
 
19
19
  export const meta = {
20
- name: "{{name}}",
20
+ slug: "{{slug}}",
21
+ title: "{{title}}",
21
22
  description: "A starting point — run it locally with \`boardwalk dev\`.",
22
23
  triggers: [{ kind: "manual" }],
23
24
  } satisfies WorkflowMeta;
@@ -65,10 +66,17 @@ export async function runInit(opts, deps = {}) {
65
66
  const builtin = BUILTIN_TEMPLATES[opts.template];
66
67
  if (builtin !== undefined) {
67
68
  const dir = resolve(opts.dir);
68
- const name = workflowNameFor(dir);
69
- const files = Object.fromEntries(Object.entries(builtin).map(([rel, body]) => [rel, body.replaceAll("{{name}}", name)]));
69
+ const slug = workflowNameFor(dir);
70
+ const title = titleCaseSlug(slug);
71
+ const files = Object.fromEntries(Object.entries(builtin).map(([rel, body]) => [
72
+ rel,
73
+ body
74
+ .replaceAll("{{slug}}", slug)
75
+ .replaceAll("{{title}}", title)
76
+ .replaceAll("{{name}}", slug),
77
+ ]));
70
78
  scaffold(dir, files);
71
- finish(log, opts, name, opts.template, []);
79
+ finish(log, opts, slug, opts.template, []);
72
80
  return;
73
81
  }
74
82
  // Remote template: registry lookup, then fetch each listed file.
@@ -158,7 +166,7 @@ function isRegistryTemplate(value) {
158
166
  value.files.every((f) => typeof f === "string") &&
159
167
  value.files.length > 0);
160
168
  }
161
- /** Derive a manifest-legal workflow name from the target directory's basename. */
169
+ /** Derive a manifest-legal workflow slug from the target directory's basename. */
162
170
  export function workflowNameFor(absDir) {
163
171
  const base = basename(absDir)
164
172
  .toLowerCase()
@@ -167,4 +175,12 @@ export function workflowNameFor(absDir) {
167
175
  .slice(0, 100);
168
176
  return base.length > 0 ? base : "my-workflow";
169
177
  }
178
+ /** A human-friendly title from a slug: "morning-digest" → "Morning Digest". */
179
+ function titleCaseSlug(slug) {
180
+ return slug
181
+ .split("-")
182
+ .filter((s) => s.length > 0)
183
+ .map((s) => s.charAt(0).toUpperCase() + s.slice(1))
184
+ .join(" ");
185
+ }
170
186
  //# sourceMappingURL=init.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -66,7 +66,7 @@ export async function runRun(opts, deps) {
66
66
  const dep = await deployWithLink(client, { orgSlug: opts.org, target: opts.file, prog });
67
67
  if (dep.gitignoreUpdated)
68
68
  log(" linked → .boardwalk/project.json (added .boardwalk/ to .gitignore)");
69
- log(`✓ ${dep.outcome} "${prog.name}" version ${String(dep.versionNumber)}`);
69
+ log(`✓ ${dep.outcome} "${prog.slug}" version ${String(dep.versionNumber)}`);
70
70
  const input = parseInput(opts.input);
71
71
  const run = await client.triggerRun(dep.orgSlug, dep.workflowId, input);
72
72
  log(`▶ run ${run.id} triggered (${run.status})`);
@@ -1,7 +1,7 @@
1
1
  import { type BuiltArtifact } from "./artifact.js";
2
2
  import type { BoardwalkClient, WorkflowSummary } from "./client.js";
3
3
  export interface PreparedProgram {
4
- name: string;
4
+ slug: string;
5
5
  /** Entry module inside the artifact (e.g. `index.mjs`). */
6
6
  entry: string;
7
7
  /** The built, content-addressed program artifact (tarball + digest + metadata). */
@@ -9,17 +9,17 @@ export interface PreparedProgram {
9
9
  }
10
10
  /**
11
11
  * Resolve a target path to its deployable artifact: build the program (bundle + assets → tarball,
12
- * content-addressed) and extract `meta.name` from the bundled entry for the deploy identity.
12
+ * content-addressed) and extract `meta.slug` from the bundled entry for the deploy identity.
13
13
  */
14
14
  export declare function loadProgram(file: string): Promise<PreparedProgram>;
15
15
  export interface DeployPlan {
16
16
  action: "create" | "update";
17
- name: string;
17
+ slug: string;
18
18
  /** Present only for `update` — the existing workflow id to PUT. */
19
19
  workflowId?: string;
20
20
  }
21
- /** Decide create vs update by matching the program name against the org's existing workflows. */
22
- export declare function planDeploy(existing: readonly WorkflowSummary[], name: string): DeployPlan;
21
+ /** Decide create vs update by matching the program slug against the org's existing workflows. */
22
+ export declare function planDeploy(existing: readonly WorkflowSummary[], slug: string): DeployPlan;
23
23
  export interface DeployResultSummary {
24
24
  workflowId: string;
25
25
  orgSlug: string;
@@ -10,24 +10,24 @@
10
10
  // 3. upload the artifact, then update the linked workflow BY ID (rename-safe) — or, when unlinked,
11
11
  // adopt an existing same-name workflow / create a new one — then (re)write the link.
12
12
  import { CliError } from "./errors.js";
13
- import { extractWorkflowName } from "./manifest.js";
13
+ import { extractWorkflowSlug } from "./manifest.js";
14
14
  import { buildArtifact } from "./artifact.js";
15
15
  import { projectDirFor, readLink, writeLink } from "./project.js";
16
16
  /**
17
17
  * Resolve a target path to its deployable artifact: build the program (bundle + assets → tarball,
18
- * content-addressed) and extract `meta.name` from the bundled entry for the deploy identity.
18
+ * content-addressed) and extract `meta.slug` from the bundled entry for the deploy identity.
19
19
  */
20
20
  export async function loadProgram(file) {
21
21
  const artifact = await buildArtifact(file);
22
- const name = extractWorkflowName(artifact.entrySource, artifact.entry);
23
- return { name, entry: artifact.entry, artifact };
22
+ const slug = extractWorkflowSlug(artifact.entrySource, artifact.entry);
23
+ return { slug, entry: artifact.entry, artifact };
24
24
  }
25
- /** Decide create vs update by matching the program name against the org's existing workflows. */
26
- export function planDeploy(existing, name) {
27
- const match = existing.find((w) => w.name === name);
25
+ /** Decide create vs update by matching the program slug against the org's existing workflows. */
26
+ export function planDeploy(existing, slug) {
27
+ const match = existing.find((w) => w.slug === slug);
28
28
  return match !== undefined
29
- ? { action: "update", name, workflowId: match.id }
30
- : { action: "create", name };
29
+ ? { action: "update", slug, workflowId: match.id }
30
+ : { action: "create", slug };
31
31
  }
32
32
  /** The artifact reference recorded on the version (everything but the bytes, which go to storage). */
33
33
  function refOf(artifact) {
@@ -56,7 +56,7 @@ export async function deployWithLink(client, ctx) {
56
56
  // Unlinked: adopt an existing workflow with the same name, if any (so a second machine re-links
57
57
  // instead of creating a duplicate). Otherwise we'll create below.
58
58
  if (workflowId === null) {
59
- const match = (await client.listWorkflows(orgSlug)).find((w) => w.name === ctx.prog.name);
59
+ const match = (await client.listWorkflows(orgSlug)).find((w) => w.slug === ctx.prog.slug);
60
60
  if (match !== undefined) {
61
61
  workflowId = match.id;
62
62
  outcome = "adopted";
@@ -12,7 +12,7 @@ export interface DevEngine {
12
12
  onEvent(listener: (event: RunEvent) => void): () => void;
13
13
  /** Deploy the bundled program; returns the derived workflow name. */
14
14
  deploy(program: string): {
15
- name: string;
15
+ slug: string;
16
16
  };
17
17
  /** Queue + dispatch a run; returns its id immediately. */
18
18
  start(workflowName: string, input: JsonValue | undefined): {
@@ -23,7 +23,7 @@ export const createDevEngine = (opts) => {
23
23
  }),
24
24
  deploy: (program) => {
25
25
  const workflow = engine.deployWorkflow({ program });
26
- return { name: workflow.name };
26
+ return { slug: workflow.slug };
27
27
  },
28
28
  start: (workflowName, input) => {
29
29
  const run = engine.startRun(workflowName, input !== undefined ? { input } : {});
@@ -1,9 +1,9 @@
1
1
  import { type WorkflowManifest } from "@boardwalk-labs/workflow";
2
2
  /**
3
- * Statically read `export const meta = { name: "...", ... }` and return the name string.
4
- * Throws `CliError` when there is no pure-literal `meta` or `name` is missing/empty/not a string.
3
+ * Statically read `export const meta = { slug: "...", ... }` and return the slug string.
4
+ * Throws `CliError` when there is no pure-literal `meta` or `slug` is missing/empty/not a string.
5
5
  */
6
- export declare function extractWorkflowName(source: string, fileName?: string): string;
6
+ export declare function extractWorkflowSlug(source: string, fileName?: string): string;
7
7
  /**
8
8
  * Statically extract `meta` and validate it against the manifest schema (the same one every
9
9
  * engine consumes), returning the fully-defaulted manifest. Throws `CliError` with the precise
package/dist/manifest.js CHANGED
@@ -3,8 +3,8 @@
3
3
  // translating extraction/validation failures into actionable `CliError`s.
4
4
  //
5
5
  // Two tiers, on purpose:
6
- // - `extractWorkflowName` — name only. `deploy`/`run` need the deploy identity (create-vs-update
7
- // is matched by NAME, which is environment-independent, unlike a path or stored id); the server
6
+ // - `extractWorkflowSlug` — slug only. `deploy`/`run` need the deploy identity (create-vs-update
7
+ // is matched by SLUG, which is environment-independent, unlike a path or stored id); the server
8
8
  // re-derives and validates the FULL manifest from the uploaded source, so the CLI doesn't
9
9
  // pre-judge field-level validity on the way to a deploy.
10
10
  // - `extractValidatedManifest` — the full schema. `check` and `dev` run entirely locally, so they
@@ -15,18 +15,18 @@ import { extractManifest, extractMetaLiteral, MetaExtractionError, } from "@boar
15
15
  import { MetaValidationError } from "@boardwalk-labs/workflow";
16
16
  import { CliError } from "./errors.js";
17
17
  /**
18
- * Statically read `export const meta = { name: "...", ... }` and return the name string.
19
- * Throws `CliError` when there is no pure-literal `meta` or `name` is missing/empty/not a string.
18
+ * Statically read `export const meta = { slug: "...", ... }` and return the slug string.
19
+ * Throws `CliError` when there is no pure-literal `meta` or `slug` is missing/empty/not a string.
20
20
  */
21
- export function extractWorkflowName(source, fileName = "index.ts") {
21
+ export function extractWorkflowSlug(source, fileName = "index.ts") {
22
22
  const meta = extractLiteralOrThrow(source, fileName);
23
- const name = meta.name;
24
- if (name !== undefined && typeof name !== "string") {
25
- throw new CliError("`meta.name` must be a plain string literal.");
23
+ const slug = meta.slug;
24
+ if (slug !== undefined && typeof slug !== "string") {
25
+ throw new CliError("`meta.slug` must be a plain string literal.");
26
26
  }
27
- const trimmed = typeof name === "string" ? name.trim() : "";
27
+ const trimmed = typeof slug === "string" ? slug.trim() : "";
28
28
  if (trimmed.length === 0) {
29
- throw new CliError("`meta.name` is missing or empty.", "Give the workflow a stable name — it's the deploy identity used to match create vs update.");
29
+ throw new CliError("`meta.slug` is missing or empty.", "Give the workflow a stable slug — it's the deploy identity used to match create vs update.");
30
30
  }
31
31
  return trimmed;
32
32
  }
package/dist/project.js CHANGED
@@ -2,7 +2,7 @@
2
2
  // Project link — the Vercel-style tie between a local workflow directory and its deployed workflow.
3
3
  //
4
4
  // `<projectDir>/.boardwalk/project.json` (gitignored) stores `{ orgSlug, workflowId }`. Once linked,
5
- // `deploy`/`run` update the workflow BY ID — so renaming `meta.name` (or the entry file) just
5
+ // `deploy`/`run` update the workflow BY ID — so renaming `meta.slug` (or the entry file) just
6
6
  // updates the same workflow instead of forking a new one, and `--org` is no longer needed. The id is
7
7
  // environment-specific (a dev workflow id ≠ prod), so the link is gitignored, not committed.
8
8
  //
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@boardwalk-labs/cli",
3
- "version": "0.1.8",
3
+ "version": "0.1.10",
4
4
  "description": "The boardwalk CLI: author, validate, run, and deploy Boardwalk workflows.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -35,8 +35,8 @@
35
35
  "boardwalk": "tsx src/index.ts"
36
36
  },
37
37
  "dependencies": {
38
- "@boardwalk-labs/engine": "^0.1.2",
39
- "@boardwalk-labs/workflow": "^0.1.2",
38
+ "@boardwalk-labs/engine": "^0.1.5",
39
+ "@boardwalk-labs/workflow": "^0.1.5",
40
40
  "commander": "^13.1.0",
41
41
  "env-paths": "^3.0.0",
42
42
  "esbuild": "^0.25.0",