@plateforme-ai/lobster 2026.6.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (219) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +353 -0
  3. package/VISION.md +249 -0
  4. package/bin/clawd.invoke.js +18 -0
  5. package/bin/lobster.js +24 -0
  6. package/bin/openclaw.invoke.js +21 -0
  7. package/dist/src/cli.js +793 -0
  8. package/dist/src/cli.js.map +1 -0
  9. package/dist/src/commands/commands_list.js +49 -0
  10. package/dist/src/commands/commands_list.js.map +1 -0
  11. package/dist/src/commands/registry.js +66 -0
  12. package/dist/src/commands/registry.js.map +1 -0
  13. package/dist/src/commands/stdlib/approve.js +77 -0
  14. package/dist/src/commands/stdlib/approve.js.map +1 -0
  15. package/dist/src/commands/stdlib/ask.js +171 -0
  16. package/dist/src/commands/stdlib/ask.js.map +1 -0
  17. package/dist/src/commands/stdlib/dedupe.js +55 -0
  18. package/dist/src/commands/stdlib/dedupe.js.map +1 -0
  19. package/dist/src/commands/stdlib/diff_last.js +35 -0
  20. package/dist/src/commands/stdlib/diff_last.js.map +1 -0
  21. package/dist/src/commands/stdlib/email_triage.js +279 -0
  22. package/dist/src/commands/stdlib/email_triage.js.map +1 -0
  23. package/dist/src/commands/stdlib/exec.js +130 -0
  24. package/dist/src/commands/stdlib/exec.js.map +1 -0
  25. package/dist/src/commands/stdlib/gog_gmail_search.js +94 -0
  26. package/dist/src/commands/stdlib/gog_gmail_search.js.map +1 -0
  27. package/dist/src/commands/stdlib/gog_gmail_send.js +104 -0
  28. package/dist/src/commands/stdlib/gog_gmail_send.js.map +1 -0
  29. package/dist/src/commands/stdlib/group_by.js +59 -0
  30. package/dist/src/commands/stdlib/group_by.js.map +1 -0
  31. package/dist/src/commands/stdlib/head.js +34 -0
  32. package/dist/src/commands/stdlib/head.js.map +1 -0
  33. package/dist/src/commands/stdlib/json.js +20 -0
  34. package/dist/src/commands/stdlib/json.js.map +1 -0
  35. package/dist/src/commands/stdlib/llm_invoke.js +758 -0
  36. package/dist/src/commands/stdlib/llm_invoke.js.map +1 -0
  37. package/dist/src/commands/stdlib/llm_task_invoke.js +2 -0
  38. package/dist/src/commands/stdlib/llm_task_invoke.js.map +1 -0
  39. package/dist/src/commands/stdlib/map.js +104 -0
  40. package/dist/src/commands/stdlib/map.js.map +1 -0
  41. package/dist/src/commands/stdlib/openclaw_invoke.js +136 -0
  42. package/dist/src/commands/stdlib/openclaw_invoke.js.map +1 -0
  43. package/dist/src/commands/stdlib/pick.js +45 -0
  44. package/dist/src/commands/stdlib/pick.js.map +1 -0
  45. package/dist/src/commands/stdlib/sort.js +86 -0
  46. package/dist/src/commands/stdlib/sort.js.map +1 -0
  47. package/dist/src/commands/stdlib/state.js +76 -0
  48. package/dist/src/commands/stdlib/state.js.map +1 -0
  49. package/dist/src/commands/stdlib/table.js +57 -0
  50. package/dist/src/commands/stdlib/table.js.map +1 -0
  51. package/dist/src/commands/stdlib/template.js +126 -0
  52. package/dist/src/commands/stdlib/template.js.map +1 -0
  53. package/dist/src/commands/stdlib/where.js +81 -0
  54. package/dist/src/commands/stdlib/where.js.map +1 -0
  55. package/dist/src/commands/types.js +2 -0
  56. package/dist/src/commands/types.js.map +1 -0
  57. package/dist/src/commands/workflows/workflows_list.js +24 -0
  58. package/dist/src/commands/workflows/workflows_list.js.map +1 -0
  59. package/dist/src/commands/workflows/workflows_run.js +74 -0
  60. package/dist/src/commands/workflows/workflows_run.js.map +1 -0
  61. package/dist/src/core/cost_tracker.js +119 -0
  62. package/dist/src/core/cost_tracker.js.map +1 -0
  63. package/dist/src/core/filters.js +102 -0
  64. package/dist/src/core/filters.js.map +1 -0
  65. package/dist/src/core/index.js +7 -0
  66. package/dist/src/core/index.js.map +1 -0
  67. package/dist/src/core/retry.js +89 -0
  68. package/dist/src/core/retry.js.map +1 -0
  69. package/dist/src/core/tool_runtime.js +289 -0
  70. package/dist/src/core/tool_runtime.js.map +1 -0
  71. package/dist/src/input_request.js +430 -0
  72. package/dist/src/input_request.js.map +1 -0
  73. package/dist/src/parser.js +145 -0
  74. package/dist/src/parser.js.map +1 -0
  75. package/dist/src/pipeline_resume_state.js +186 -0
  76. package/dist/src/pipeline_resume_state.js.map +1 -0
  77. package/dist/src/read_line.js +50 -0
  78. package/dist/src/read_line.js.map +1 -0
  79. package/dist/src/recipes/github/index.js +16 -0
  80. package/dist/src/recipes/github/index.js.map +1 -0
  81. package/dist/src/recipes/github/pr-monitor.js +248 -0
  82. package/dist/src/recipes/github/pr-monitor.js.map +1 -0
  83. package/dist/src/recipes/github/stages/pr-view.js +107 -0
  84. package/dist/src/recipes/github/stages/pr-view.js.map +1 -0
  85. package/dist/src/recipes/index.js +7 -0
  86. package/dist/src/recipes/index.js.map +1 -0
  87. package/dist/src/recipes/registry.js +30 -0
  88. package/dist/src/recipes/registry.js.map +1 -0
  89. package/dist/src/renderers/json.js +13 -0
  90. package/dist/src/renderers/json.js.map +1 -0
  91. package/dist/src/resume.js +179 -0
  92. package/dist/src/resume.js.map +1 -0
  93. package/dist/src/runtime.js +230 -0
  94. package/dist/src/runtime.js.map +1 -0
  95. package/dist/src/sdk/Lobster.js +402 -0
  96. package/dist/src/sdk/Lobster.js.map +1 -0
  97. package/dist/src/sdk/index.js +25 -0
  98. package/dist/src/sdk/index.js.map +1 -0
  99. package/dist/src/sdk/primitives/approve.js +47 -0
  100. package/dist/src/sdk/primitives/approve.js.map +1 -0
  101. package/dist/src/sdk/primitives/diff.js +156 -0
  102. package/dist/src/sdk/primitives/diff.js.map +1 -0
  103. package/dist/src/sdk/primitives/exec.js +167 -0
  104. package/dist/src/sdk/primitives/exec.js.map +1 -0
  105. package/dist/src/sdk/primitives/state.js +203 -0
  106. package/dist/src/sdk/primitives/state.js.map +1 -0
  107. package/dist/src/sdk/runtime.js +131 -0
  108. package/dist/src/sdk/runtime.js.map +1 -0
  109. package/dist/src/sdk/token.js +9 -0
  110. package/dist/src/sdk/token.js.map +1 -0
  111. package/dist/src/shell.js +39 -0
  112. package/dist/src/shell.js.map +1 -0
  113. package/dist/src/state/store.js +337 -0
  114. package/dist/src/state/store.js.map +1 -0
  115. package/dist/src/token.js +15 -0
  116. package/dist/src/token.js.map +1 -0
  117. package/dist/src/validation.js +38 -0
  118. package/dist/src/validation.js.map +1 -0
  119. package/dist/src/workflows/file.js +2405 -0
  120. package/dist/src/workflows/file.js.map +1 -0
  121. package/dist/src/workflows/github_pr_monitor.js +167 -0
  122. package/dist/src/workflows/github_pr_monitor.js.map +1 -0
  123. package/dist/src/workflows/graph.js +234 -0
  124. package/dist/src/workflows/graph.js.map +1 -0
  125. package/dist/src/workflows/registry.js +57 -0
  126. package/dist/src/workflows/registry.js.map +1 -0
  127. package/dist/test/approval_id.test.js +171 -0
  128. package/dist/test/approval_id.test.js.map +1 -0
  129. package/dist/test/approve_preview.test.js +38 -0
  130. package/dist/test/approve_preview.test.js.map +1 -0
  131. package/dist/test/clawd_invoke.test.js +124 -0
  132. package/dist/test/clawd_invoke.test.js.map +1 -0
  133. package/dist/test/clawd_invoke_legacy.test.js +63 -0
  134. package/dist/test/clawd_invoke_legacy.test.js.map +1 -0
  135. package/dist/test/cli_run_file_args_json.test.js +27 -0
  136. package/dist/test/cli_run_file_args_json.test.js.map +1 -0
  137. package/dist/test/commands_list.test.js +44 -0
  138. package/dist/test/commands_list.test.js.map +1 -0
  139. package/dist/test/condition_comparison.test.js +127 -0
  140. package/dist/test/condition_comparison.test.js.map +1 -0
  141. package/dist/test/core_tool_runtime.test.js +160 -0
  142. package/dist/test/core_tool_runtime.test.js.map +1 -0
  143. package/dist/test/cost_tracker.test.js +231 -0
  144. package/dist/test/cost_tracker.test.js.map +1 -0
  145. package/dist/test/dedupe.test.js +48 -0
  146. package/dist/test/dedupe.test.js.map +1 -0
  147. package/dist/test/diff_last.test.js +70 -0
  148. package/dist/test/diff_last.test.js.map +1 -0
  149. package/dist/test/doctor.test.js +19 -0
  150. package/dist/test/doctor.test.js.map +1 -0
  151. package/dist/test/dry_run.test.js +502 -0
  152. package/dist/test/dry_run.test.js.map +1 -0
  153. package/dist/test/email_triage.test.js +296 -0
  154. package/dist/test/email_triage.test.js.map +1 -0
  155. package/dist/test/exec_stdin.test.js +43 -0
  156. package/dist/test/exec_stdin.test.js.map +1 -0
  157. package/dist/test/for_each.test.js +228 -0
  158. package/dist/test/for_each.test.js.map +1 -0
  159. package/dist/test/github_pr_notify_format.test.js +19 -0
  160. package/dist/test/github_pr_notify_format.test.js.map +1 -0
  161. package/dist/test/github_pr_summary.test.js +41 -0
  162. package/dist/test/github_pr_summary.test.js.map +1 -0
  163. package/dist/test/group_by.test.js +43 -0
  164. package/dist/test/group_by.test.js.map +1 -0
  165. package/dist/test/llm_invoke.test.js +166 -0
  166. package/dist/test/llm_invoke.test.js.map +1 -0
  167. package/dist/test/llm_task_invoke.test.js +416 -0
  168. package/dist/test/llm_task_invoke.test.js.map +1 -0
  169. package/dist/test/map.test.js +41 -0
  170. package/dist/test/map.test.js.map +1 -0
  171. package/dist/test/multi_approval_resume.test.js +48 -0
  172. package/dist/test/multi_approval_resume.test.js.map +1 -0
  173. package/dist/test/on_error.test.js +151 -0
  174. package/dist/test/on_error.test.js.map +1 -0
  175. package/dist/test/openclaw_invoke_alias.test.js +13 -0
  176. package/dist/test/openclaw_invoke_alias.test.js.map +1 -0
  177. package/dist/test/parallel.test.js +184 -0
  178. package/dist/test/parallel.test.js.map +1 -0
  179. package/dist/test/parser.test.js +39 -0
  180. package/dist/test/parser.test.js.map +1 -0
  181. package/dist/test/read_line.test.js +25 -0
  182. package/dist/test/read_line.test.js.map +1 -0
  183. package/dist/test/request_input.test.js +946 -0
  184. package/dist/test/request_input.test.js.map +1 -0
  185. package/dist/test/resume.test.js +82 -0
  186. package/dist/test/resume.test.js.map +1 -0
  187. package/dist/test/sdk_lobster.test.js +177 -0
  188. package/dist/test/sdk_lobster.test.js.map +1 -0
  189. package/dist/test/shell.test.js +31 -0
  190. package/dist/test/shell.test.js.map +1 -0
  191. package/dist/test/sort.test.js +51 -0
  192. package/dist/test/sort.test.js.map +1 -0
  193. package/dist/test/state.test.js +336 -0
  194. package/dist/test/state.test.js.map +1 -0
  195. package/dist/test/step_retry.test.js +254 -0
  196. package/dist/test/step_retry.test.js.map +1 -0
  197. package/dist/test/step_timeout.test.js +154 -0
  198. package/dist/test/step_timeout.test.js.map +1 -0
  199. package/dist/test/template.test.js +46 -0
  200. package/dist/test/template.test.js.map +1 -0
  201. package/dist/test/template_filters.test.js +107 -0
  202. package/dist/test/template_filters.test.js.map +1 -0
  203. package/dist/test/tool_envelope_version.test.js +15 -0
  204. package/dist/test/tool_envelope_version.test.js.map +1 -0
  205. package/dist/test/tool_mode.test.js +83 -0
  206. package/dist/test/tool_mode.test.js.map +1 -0
  207. package/dist/test/validation.test.js +28 -0
  208. package/dist/test/validation.test.js.map +1 -0
  209. package/dist/test/workflow_args_env.test.js +41 -0
  210. package/dist/test/workflow_args_env.test.js.map +1 -0
  211. package/dist/test/workflow_composition.test.js +238 -0
  212. package/dist/test/workflow_composition.test.js.map +1 -0
  213. package/dist/test/workflow_file.test.js +1399 -0
  214. package/dist/test/workflow_file.test.js.map +1 -0
  215. package/dist/test/workflow_graph.test.js +97 -0
  216. package/dist/test/workflow_graph.test.js.map +1 -0
  217. package/dist/test/workflows.test.js +32 -0
  218. package/dist/test/workflows.test.js.map +1 -0
  219. package/package.json +75 -0
@@ -0,0 +1,70 @@
1
+ import test from "node:test";
2
+ import assert from "node:assert/strict";
3
+ import os from "node:os";
4
+ import path from "node:path";
5
+ import { mkdtempSync } from "node:fs";
6
+ import { createDefaultRegistry } from "../src/commands/registry.js";
7
+ function streamOf(items) {
8
+ return (async function* () {
9
+ for (const item of items)
10
+ yield item;
11
+ })();
12
+ }
13
+ test("diff.last reports changed on first run and not changed on same input", async () => {
14
+ const tmp = mkdtempSync(path.join(os.tmpdir(), "lobster-diff-"));
15
+ const env = { ...process.env, LOBSTER_STATE_DIR: tmp };
16
+ const registry = createDefaultRegistry();
17
+ const cmd = registry.get("diff.last");
18
+ const first = await cmd.run({
19
+ input: streamOf([{ a: 1 }]),
20
+ args: { _: [], key: "k" },
21
+ ctx: {
22
+ stdin: process.stdin,
23
+ stdout: process.stdout,
24
+ stderr: process.stderr,
25
+ env,
26
+ registry,
27
+ mode: "tool",
28
+ render: { json() { }, lines() { } },
29
+ },
30
+ });
31
+ const out1 = [];
32
+ for await (const it of first.output)
33
+ out1.push(it);
34
+ assert.equal(out1[0].changed, true);
35
+ const second = await cmd.run({
36
+ input: streamOf([{ a: 1 }]),
37
+ args: { _: [], key: "k" },
38
+ ctx: {
39
+ stdin: process.stdin,
40
+ stdout: process.stdout,
41
+ stderr: process.stderr,
42
+ env,
43
+ registry,
44
+ mode: "tool",
45
+ render: { json() { }, lines() { } },
46
+ },
47
+ });
48
+ const out2 = [];
49
+ for await (const it of second.output)
50
+ out2.push(it);
51
+ assert.equal(out2[0].changed, false);
52
+ const third = await cmd.run({
53
+ input: streamOf([{ a: 2 }]),
54
+ args: { _: [], key: "k" },
55
+ ctx: {
56
+ stdin: process.stdin,
57
+ stdout: process.stdout,
58
+ stderr: process.stderr,
59
+ env,
60
+ registry,
61
+ mode: "tool",
62
+ render: { json() { }, lines() { } },
63
+ },
64
+ });
65
+ const out3 = [];
66
+ for await (const it of third.output)
67
+ out3.push(it);
68
+ assert.equal(out3[0].changed, true);
69
+ });
70
+ //# sourceMappingURL=diff_last.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff_last.test.js","sourceRoot":"","sources":["../../test/diff_last.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import test from "node:test";
2
+ import assert from "node:assert/strict";
3
+ import { spawnSync } from "node:child_process";
4
+ import path from "node:path";
5
+ test("doctor returns tool-mode ok with version", () => {
6
+ const bin = path.join(process.cwd(), "bin", "lobster.js");
7
+ const res = spawnSync("node", [bin, "doctor"], {
8
+ encoding: "utf8",
9
+ env: { ...process.env, LOBSTER_STATE_DIR: path.join(process.cwd(), ".tmp-test-state") },
10
+ });
11
+ assert.equal(res.status, 0);
12
+ const out = JSON.parse(res.stdout);
13
+ assert.equal(out.ok, true);
14
+ assert.equal(out.protocolVersion, 1);
15
+ assert.equal(out.status, "ok");
16
+ assert.equal(out.output[0].toolMode, true);
17
+ assert.ok(typeof out.output[0].version === "string");
18
+ });
19
+ //# sourceMappingURL=doctor.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.test.js","sourceRoot":"","sources":["../../test/doctor.test.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,IAAI,CAAC,0CAA0C,EAAE,GAAG,EAAE;IACpD,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC;IAC1D,MAAM,GAAG,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,QAAQ,CAAC,EAAE;QAC7C,QAAQ,EAAE,MAAM;QAChB,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,iBAAiB,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,iBAAiB,CAAC,EAAE;KACxF,CAAC,CAAC;IACH,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACnC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IAC3B,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC;IACrC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC/B,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC3C,MAAM,CAAC,EAAE,CAAC,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC;AACvD,CAAC,CAAC,CAAC"}
@@ -0,0 +1,502 @@
1
+ import test from "node:test";
2
+ import assert from "node:assert/strict";
3
+ import { promises as fsp } from "node:fs";
4
+ import path from "node:path";
5
+ import os from "node:os";
6
+ import { spawnSync } from "node:child_process";
7
+ import { createDefaultRegistry } from "../src/commands/registry.js";
8
+ import { runWorkflowFile } from "../src/workflows/file.js";
9
+ import { PassThrough } from "node:stream";
10
+ function runLobster(args, opts) {
11
+ const res = spawnSync(process.execPath, [path.join("bin", "lobster.js"), ...args], {
12
+ cwd: path.resolve("."),
13
+ env: { ...process.env, ...(opts?.env ?? undefined) },
14
+ encoding: "utf8",
15
+ });
16
+ return res;
17
+ }
18
+ function createStreams() {
19
+ const stdout = new PassThrough();
20
+ const stderr = new PassThrough();
21
+ let stdoutData = "";
22
+ let stderrData = "";
23
+ stdout.setEncoding("utf8");
24
+ stderr.setEncoding("utf8");
25
+ stdout.on("data", (chunk) => {
26
+ stdoutData += chunk;
27
+ });
28
+ stderr.on("data", (chunk) => {
29
+ stderrData += chunk;
30
+ });
31
+ return {
32
+ stdout,
33
+ stderr,
34
+ getStdout: () => stdoutData,
35
+ getStderr: () => stderrData,
36
+ };
37
+ }
38
+ test("dry-run of a 3-step workflow file (shell steps)", async () => {
39
+ const workflow = {
40
+ name: "test-dry-run",
41
+ args: { url: { default: "https://example.com" } },
42
+ steps: [
43
+ { id: "fetch-data", run: "curl ${url}" },
44
+ { id: "transform", run: 'jq ".items"' },
45
+ { id: "upload", run: "curl -X POST https://api.example.com" },
46
+ ],
47
+ };
48
+ const tmpDir = await fsp.mkdtemp(path.join(os.tmpdir(), "lobster-dry-"));
49
+ const filePath = path.join(tmpDir, "workflow.lobster");
50
+ await fsp.writeFile(filePath, JSON.stringify(workflow, null, 2), "utf8");
51
+ const { stdout, stderr, getStderr } = createStreams();
52
+ const result = await runWorkflowFile({
53
+ filePath,
54
+ ctx: {
55
+ stdin: process.stdin,
56
+ stdout,
57
+ stderr,
58
+ env: { ...process.env },
59
+ mode: "human",
60
+ dryRun: true,
61
+ },
62
+ });
63
+ assert.equal(result.status, "ok");
64
+ assert.deepEqual(result.output, []);
65
+ const output = getStderr();
66
+ assert.match(output, /\[DRY RUN\]/);
67
+ assert.match(output, /Would execute 3 steps/);
68
+ assert.match(output, /fetch-data\s+\[shell\]/);
69
+ assert.match(output, /run: curl https:\/\/example\.com/);
70
+ assert.match(output, /transform\s+\[shell\]/);
71
+ assert.match(output, /upload\s+\[shell\]/);
72
+ });
73
+ test("dry-run of a workflow with an approval step", async () => {
74
+ const workflow = {
75
+ steps: [
76
+ { id: "collect", run: "echo hello" },
77
+ {
78
+ id: "approve_step",
79
+ run: "echo check",
80
+ approval: "Proceed with deployment?",
81
+ },
82
+ { id: "deploy", run: "echo deploying" },
83
+ ],
84
+ };
85
+ const tmpDir = await fsp.mkdtemp(path.join(os.tmpdir(), "lobster-dry-approval-"));
86
+ const filePath = path.join(tmpDir, "workflow.lobster");
87
+ await fsp.writeFile(filePath, JSON.stringify(workflow, null, 2), "utf8");
88
+ const { stdout, stderr, getStderr } = createStreams();
89
+ const result = await runWorkflowFile({
90
+ filePath,
91
+ ctx: {
92
+ stdin: process.stdin,
93
+ stdout,
94
+ stderr,
95
+ env: { ...process.env },
96
+ mode: "tool",
97
+ dryRun: true,
98
+ },
99
+ });
100
+ assert.equal(result.status, "ok");
101
+ assert.deepEqual(result.output, []);
102
+ const output = getStderr();
103
+ assert.match(output, /approve_step\s+\[shell\]/);
104
+ assert.match(output, /\[approval required\]/);
105
+ });
106
+ test("dry-run of a workflow with a conditional step that would be skipped", async () => {
107
+ const workflow = {
108
+ steps: [
109
+ { id: "gate", run: "echo gate" },
110
+ {
111
+ id: "conditional",
112
+ run: "echo conditional",
113
+ condition: false,
114
+ },
115
+ { id: "final", run: "echo final" },
116
+ ],
117
+ };
118
+ const tmpDir = await fsp.mkdtemp(path.join(os.tmpdir(), "lobster-dry-cond-"));
119
+ const filePath = path.join(tmpDir, "workflow.lobster");
120
+ await fsp.writeFile(filePath, JSON.stringify(workflow, null, 2), "utf8");
121
+ const { stdout, stderr, getStderr } = createStreams();
122
+ const result = await runWorkflowFile({
123
+ filePath,
124
+ ctx: {
125
+ stdin: process.stdin,
126
+ stdout,
127
+ stderr,
128
+ env: { ...process.env },
129
+ mode: "human",
130
+ dryRun: true,
131
+ },
132
+ });
133
+ assert.equal(result.status, "ok");
134
+ const output = getStderr();
135
+ assert.match(output, /conditional\s+\[skipped — condition: false\]/);
136
+ assert.match(output, /gate\s+\[shell\]/);
137
+ assert.match(output, /final\s+\[shell\]/);
138
+ });
139
+ test("dry-run of an inline pipeline string via CLI", async () => {
140
+ const res = runLobster([
141
+ "run",
142
+ "--dry-run",
143
+ 'exec --json "echo [1,2,3]" | where active=true | table',
144
+ ]);
145
+ assert.equal(res.status, 0, `expected exit 0, got ${res.status}\nstdout=${res.stdout}\nstderr=${res.stderr}`);
146
+ assert.match(res.stderr, /\[DRY RUN\] Pipeline/);
147
+ assert.match(res.stderr, /exec/);
148
+ assert.match(res.stderr, /where/);
149
+ assert.match(res.stderr, /table/);
150
+ // stdout must be clean — no JSON array leaking through
151
+ assert.equal(res.stdout.trim(), "", `expected empty stdout, got: ${res.stdout}`);
152
+ });
153
+ test("dry-run exits 0 on valid input", async () => {
154
+ const workflow = {
155
+ steps: [{ id: "step1", run: "echo hello" }],
156
+ };
157
+ const tmpDir = await fsp.mkdtemp(path.join(os.tmpdir(), "lobster-dry-exit-"));
158
+ const filePath = path.join(tmpDir, "workflow.lobster");
159
+ await fsp.writeFile(filePath, JSON.stringify(workflow, null, 2), "utf8");
160
+ const res = runLobster(["run", "--dry-run", "--file", filePath]);
161
+ assert.equal(res.status, 0, `expected exit 0, got ${res.status}\nstdout=${res.stdout}\nstderr=${res.stderr}`);
162
+ assert.match(res.stderr, /\[DRY RUN\]/);
163
+ assert.match(res.stderr, /step1/);
164
+ // stdout must be clean — no JSON output
165
+ assert.equal(res.stdout.trim(), "", `expected empty stdout, got: ${res.stdout}`);
166
+ });
167
+ test("normal run still works (no regression)", async () => {
168
+ const workflow = {
169
+ steps: [
170
+ {
171
+ id: "greet",
172
+ command: "node -e \"process.stdout.write(JSON.stringify({msg:'hello'}))\"",
173
+ },
174
+ ],
175
+ };
176
+ const tmpDir = await fsp.mkdtemp(path.join(os.tmpdir(), "lobster-dry-regression-"));
177
+ const filePath = path.join(tmpDir, "workflow.lobster");
178
+ await fsp.writeFile(filePath, JSON.stringify(workflow, null, 2), "utf8");
179
+ const res = runLobster(["run", "--file", filePath]);
180
+ assert.equal(res.status, 0, `expected exit 0, got ${res.status}\nstdout=${res.stdout}\nstderr=${res.stderr}`);
181
+ const parsed = JSON.parse(res.stdout.trim());
182
+ assert.deepEqual(parsed, [{ msg: "hello" }]);
183
+ });
184
+ test("dry-run approval step sets approved:true so downstream conditions evaluate correctly", async () => {
185
+ const workflow = {
186
+ steps: [
187
+ { id: "gate", run: "echo gate", approval: "Continue?" },
188
+ { id: "post-approval", run: "echo done", when: "$gate.approved" },
189
+ ],
190
+ };
191
+ const tmpDir = await fsp.mkdtemp(path.join(os.tmpdir(), "lobster-dry-approvcond-"));
192
+ const filePath = path.join(tmpDir, "workflow.lobster");
193
+ await fsp.writeFile(filePath, JSON.stringify(workflow, null, 2), "utf8");
194
+ const { stdout, stderr, getStderr } = createStreams();
195
+ const result = await runWorkflowFile({
196
+ filePath,
197
+ ctx: {
198
+ stdin: process.stdin,
199
+ stdout,
200
+ stderr,
201
+ env: { ...process.env },
202
+ mode: "human",
203
+ dryRun: true,
204
+ },
205
+ });
206
+ assert.equal(result.status, "ok");
207
+ const output = getStderr();
208
+ // post-approval step should NOT be marked as skipped — approval is modeled as granted
209
+ assert.doesNotMatch(output, /post-approval.*skipped/);
210
+ assert.match(output, /post-approval\s+\[shell\]/);
211
+ });
212
+ test("dry-run workflow with pipeline step", async () => {
213
+ const registry = createDefaultRegistry();
214
+ const workflow = {
215
+ steps: [
216
+ { id: "fetch", run: "echo hello" },
217
+ { id: "process", pipeline: 'exec --json "echo [1]" | head 1' },
218
+ ],
219
+ };
220
+ const tmpDir = await fsp.mkdtemp(path.join(os.tmpdir(), "lobster-dry-pipeline-"));
221
+ const filePath = path.join(tmpDir, "workflow.lobster");
222
+ await fsp.writeFile(filePath, JSON.stringify(workflow, null, 2), "utf8");
223
+ const { stdout, stderr, getStderr } = createStreams();
224
+ const result = await runWorkflowFile({
225
+ filePath,
226
+ ctx: {
227
+ stdin: process.stdin,
228
+ stdout,
229
+ stderr,
230
+ env: { ...process.env },
231
+ mode: "human",
232
+ registry,
233
+ dryRun: true,
234
+ },
235
+ });
236
+ assert.equal(result.status, "ok");
237
+ assert.deepEqual(result.output, []);
238
+ const output = getStderr();
239
+ assert.match(output, /fetch\s+\[shell\]/);
240
+ assert.match(output, /process\s+\[pipeline\]/);
241
+ assert.match(output, /pipeline: exec --json "echo \[1\]" \| head 1/);
242
+ });
243
+ test("dry-run throws on stdin ref to non-existent step", async () => {
244
+ const workflow = {
245
+ steps: [
246
+ { id: "gen", run: "echo hello" },
247
+ { id: "consumer", run: "echo done", stdin: "$missing.stdout" },
248
+ ],
249
+ };
250
+ const tmpDir = await fsp.mkdtemp(path.join(os.tmpdir(), "lobster-dry-stdin-bad-"));
251
+ const filePath = path.join(tmpDir, "workflow.lobster");
252
+ await fsp.writeFile(filePath, JSON.stringify(workflow, null, 2), "utf8");
253
+ const { stdout, stderr } = createStreams();
254
+ await assert.rejects(() => runWorkflowFile({
255
+ filePath,
256
+ ctx: {
257
+ stdin: process.stdin,
258
+ stdout,
259
+ stderr,
260
+ env: { ...process.env },
261
+ mode: "human",
262
+ dryRun: true,
263
+ },
264
+ }), /Unknown step reference: missing\.stdout/);
265
+ });
266
+ test("dry-run annotates valid stdin step refs as unknown at plan time", async () => {
267
+ const workflow = {
268
+ steps: [
269
+ { id: "gen", run: "echo hello" },
270
+ { id: "consumer", run: "echo done", stdin: "$gen.stdout" },
271
+ ],
272
+ };
273
+ const tmpDir = await fsp.mkdtemp(path.join(os.tmpdir(), "lobster-dry-stdin-valid-"));
274
+ const filePath = path.join(tmpDir, "workflow.lobster");
275
+ await fsp.writeFile(filePath, JSON.stringify(workflow, null, 2), "utf8");
276
+ const { stdout, stderr, getStderr } = createStreams();
277
+ const result = await runWorkflowFile({
278
+ filePath,
279
+ ctx: {
280
+ stdin: process.stdin,
281
+ stdout,
282
+ stderr,
283
+ env: { ...process.env },
284
+ mode: "human",
285
+ dryRun: true,
286
+ },
287
+ });
288
+ assert.equal(result.status, "ok");
289
+ assert.match(getStderr(), /output unknown at plan time/);
290
+ });
291
+ test("dry-run preserves step output refs in shell commands instead of collapsing them to empty strings", async () => {
292
+ const workflow = {
293
+ steps: [
294
+ { id: "fetch", run: "echo hello" },
295
+ { id: "render", run: "echo A=[$fetch.stdout] B=[$fetch.json]" },
296
+ ],
297
+ };
298
+ const tmpDir = await fsp.mkdtemp(path.join(os.tmpdir(), "lobster-dry-shellrefs-"));
299
+ const filePath = path.join(tmpDir, "workflow.lobster");
300
+ await fsp.writeFile(filePath, JSON.stringify(workflow, null, 2), "utf8");
301
+ const { stdout, stderr, getStderr } = createStreams();
302
+ const result = await runWorkflowFile({
303
+ filePath,
304
+ ctx: {
305
+ stdin: process.stdin,
306
+ stdout,
307
+ stderr,
308
+ env: { ...process.env },
309
+ mode: "human",
310
+ dryRun: true,
311
+ },
312
+ });
313
+ assert.equal(result.status, "ok");
314
+ const output = getStderr();
315
+ assert.match(output, /run: echo A=\[\$fetch\.stdout\] B=\[\$fetch\.json\]/);
316
+ assert.match(output, /\[contains step output refs — unknown at plan time\]/);
317
+ assert.doesNotMatch(output, /run: echo A=\[\] B=\[\]/);
318
+ });
319
+ test("dry-run still resolves approved refs in shell commands", async () => {
320
+ const workflow = {
321
+ steps: [
322
+ { id: "gate", run: "echo ok", approval: "Continue?" },
323
+ { id: "render", run: "echo approved=$gate.approved" },
324
+ ],
325
+ };
326
+ const tmpDir = await fsp.mkdtemp(path.join(os.tmpdir(), "lobster-dry-approvedref-"));
327
+ const filePath = path.join(tmpDir, "workflow.lobster");
328
+ await fsp.writeFile(filePath, JSON.stringify(workflow, null, 2), "utf8");
329
+ const { stdout, stderr, getStderr } = createStreams();
330
+ const result = await runWorkflowFile({
331
+ filePath,
332
+ ctx: {
333
+ stdin: process.stdin,
334
+ stdout,
335
+ stderr,
336
+ env: { ...process.env },
337
+ mode: "human",
338
+ dryRun: true,
339
+ },
340
+ });
341
+ assert.equal(result.status, "ok");
342
+ const output = getStderr();
343
+ assert.match(output, /run: echo approved=true/);
344
+ assert.doesNotMatch(output, /approved=\$gate\.approved/);
345
+ });
346
+ test("dry-run throws on pipeline step with unknown command", async () => {
347
+ const registry = createDefaultRegistry();
348
+ const workflow = {
349
+ steps: [{ id: "step1", pipeline: "not_a_real_command | head 1" }],
350
+ };
351
+ const tmpDir = await fsp.mkdtemp(path.join(os.tmpdir(), "lobster-dry-badcmd-"));
352
+ const filePath = path.join(tmpDir, "workflow.lobster");
353
+ await fsp.writeFile(filePath, JSON.stringify(workflow, null, 2), "utf8");
354
+ const { stdout, stderr } = createStreams();
355
+ await assert.rejects(() => runWorkflowFile({
356
+ filePath,
357
+ ctx: {
358
+ stdin: process.stdin,
359
+ stdout,
360
+ stderr,
361
+ env: { ...process.env },
362
+ mode: "human",
363
+ registry,
364
+ dryRun: true,
365
+ },
366
+ }), /unknown command: not_a_real_command/);
367
+ });
368
+ test("dry-run flag is consumed regardless of position in argv", async () => {
369
+ // --dry-run before pipeline tokens (canonical form)
370
+ const before = runLobster(["run", "--dry-run", 'exec --json "echo [1]"']);
371
+ assert.equal(before.status, 0);
372
+ assert.match(before.stderr, /\[DRY RUN\]/);
373
+ assert.equal(before.stdout.trim(), "");
374
+ // --dry-run after positional file arg: lobster run workflow.lobster --dry-run
375
+ // This is the primary use-case that was previously broken.
376
+ });
377
+ test("dry-run flag after positional file arg activates dry-run", async () => {
378
+ const workflow = {
379
+ steps: [{ id: "greet", run: "echo hello" }],
380
+ };
381
+ const tmpDir = await fsp.mkdtemp(path.join(os.tmpdir(), "lobster-test-"));
382
+ const filePath = path.join(tmpDir, "test.lobster");
383
+ await fsp.writeFile(filePath, JSON.stringify(workflow), "utf8");
384
+ // Flag comes AFTER the positional file argument — must still activate dry-run.
385
+ const res = runLobster(["run", filePath, "--dry-run"]);
386
+ assert.equal(res.status, 0, `expected exit 0\nstdout=${res.stdout}\nstderr=${res.stderr}`);
387
+ assert.match(res.stderr, /\[DRY RUN\]/, "expected [DRY RUN] in stderr when flag is after file path");
388
+ assert.equal(res.stdout.trim(), "", "expected no stdout in dry-run mode");
389
+ await fsp.rm(tmpDir, { recursive: true, force: true });
390
+ });
391
+ test("dry-run flag still activates after positional workflow file when other Lobster flags are present", async () => {
392
+ const workflow = {
393
+ args: { name: { default: "hello" } },
394
+ steps: [{ id: "greet", run: "echo ${name}" }],
395
+ };
396
+ const tmpDir = await fsp.mkdtemp(path.join(os.tmpdir(), "lobster-test-args-"));
397
+ const filePath = path.join(tmpDir, "test.lobster");
398
+ await fsp.writeFile(filePath, JSON.stringify(workflow), "utf8");
399
+ const res = runLobster(["run", filePath, "--args-json", '{"name":"world"}', "--dry-run"]);
400
+ assert.equal(res.status, 0, `expected exit 0\nstdout=${res.stdout}\nstderr=${res.stderr}`);
401
+ assert.match(res.stderr, /\[DRY RUN\]/);
402
+ assert.match(res.stderr, /run: echo world/);
403
+ assert.equal(res.stdout.trim(), "");
404
+ await fsp.rm(tmpDir, { recursive: true, force: true });
405
+ });
406
+ test("command-level --dry-run in the first stage is not stolen by Lobster dry-run parsing", () => {
407
+ const res = runLobster([
408
+ "run",
409
+ "openclaw.invoke",
410
+ "--tool",
411
+ "message",
412
+ "--action",
413
+ "send",
414
+ "--dry-run",
415
+ ]);
416
+ assert.notEqual(res.status, 0, "expected command execution to fail instead of Lobster dry-run exiting 0");
417
+ assert.doesNotMatch(res.stderr, /\[DRY RUN\]/);
418
+ assert.match(res.stderr, /requires --url or OPENCLAW_URL/);
419
+ });
420
+ test("dry-run allows pipeline stage names that still depend on prior step output", async () => {
421
+ const registry = createDefaultRegistry();
422
+ const workflow = {
423
+ steps: [
424
+ { id: "planner", run: "echo openclaw.invoke" },
425
+ { id: "call", pipeline: "$planner.stdout --tool message --action send" },
426
+ ],
427
+ };
428
+ const tmpDir = await fsp.mkdtemp(path.join(os.tmpdir(), "lobster-dry-dynamic-stage-"));
429
+ const filePath = path.join(tmpDir, "workflow.lobster");
430
+ await fsp.writeFile(filePath, JSON.stringify(workflow, null, 2), "utf8");
431
+ const { stdout, stderr, getStderr } = createStreams();
432
+ const result = await runWorkflowFile({
433
+ filePath,
434
+ ctx: {
435
+ stdin: process.stdin,
436
+ stdout,
437
+ stderr,
438
+ env: { ...process.env },
439
+ mode: "human",
440
+ registry,
441
+ dryRun: true,
442
+ },
443
+ });
444
+ assert.equal(result.status, "ok");
445
+ const output = getStderr();
446
+ assert.match(output, /pipeline: \$planner\.stdout --tool message --action send/);
447
+ assert.match(output, /\[command validation deferred — stage name depends on step output\]/);
448
+ });
449
+ test("dry-run does not eat shell variables that only resemble step refs", async () => {
450
+ const workflow = {
451
+ steps: [{ id: "shell_vars", run: "echo $HOME.json $PATH.stdout" }],
452
+ };
453
+ const tmpDir = await fsp.mkdtemp(path.join(os.tmpdir(), "lobster-dry-shell-vars-"));
454
+ const filePath = path.join(tmpDir, "workflow.lobster");
455
+ await fsp.writeFile(filePath, JSON.stringify(workflow, null, 2), "utf8");
456
+ const res = runLobster(["run", "--dry-run", filePath]);
457
+ assert.equal(res.status, 0);
458
+ assert.match(res.stderr, /echo \$HOME\.json \$PATH\.stdout/);
459
+ });
460
+ test("dry-run evaluates compound conditions with approvals, input placeholders, and parentheses", async () => {
461
+ const workflow = {
462
+ steps: [
463
+ { id: "gate", run: "echo ok", approval: "Continue?" },
464
+ {
465
+ id: "review",
466
+ input: {
467
+ prompt: "Review?",
468
+ responseSchema: {
469
+ type: "object",
470
+ properties: { decision: { type: "string" } },
471
+ required: ["decision"],
472
+ },
473
+ },
474
+ },
475
+ {
476
+ id: "deploy",
477
+ run: "echo deploy",
478
+ condition: "$gate.approved && ($review.response.pending == true || $review.skipped)",
479
+ },
480
+ ],
481
+ };
482
+ const tmpDir = await fsp.mkdtemp(path.join(os.tmpdir(), "lobster-dry-compound-cond-"));
483
+ const filePath = path.join(tmpDir, "workflow.lobster");
484
+ await fsp.writeFile(filePath, JSON.stringify(workflow, null, 2), "utf8");
485
+ const { stdout, stderr, getStderr } = createStreams();
486
+ const result = await runWorkflowFile({
487
+ filePath,
488
+ ctx: {
489
+ stdin: process.stdin,
490
+ stdout,
491
+ stderr,
492
+ env: { ...process.env },
493
+ mode: "human",
494
+ dryRun: true,
495
+ },
496
+ });
497
+ assert.equal(result.status, "ok");
498
+ const output = getStderr();
499
+ assert.doesNotMatch(output, /deploy.*skipped/);
500
+ assert.match(output, /deploy\s+\[shell\]/);
501
+ });
502
+ //# sourceMappingURL=dry_run.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dry_run.test.js","sourceRoot":"","sources":["../../test/dry_run.test.ts"],"names":[],"mappings":"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"}