svamp-cli 0.2.175 → 0.2.177

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 (33) hide show
  1. package/bin/skills/loop/SKILL.md +1 -1
  2. package/dist/{agentCommands-C4upUtMc.mjs → agentCommands-DWvXxX8p.mjs} +5 -5
  3. package/dist/{auth-BKN98KO4.mjs → auth-Dxka4cE6.mjs} +1 -1
  4. package/dist/cli.mjs +60 -64
  5. package/dist/{commands-D2lD-S4d.mjs → commands--dKRqMv8.mjs} +5 -5
  6. package/dist/{commands-BssfhM-2.mjs → commands-B4u6CUWH.mjs} +1 -1
  7. package/dist/{commands-CSK-jSnk.mjs → commands-Bf-TovMw.mjs} +1 -1
  8. package/dist/{commands-DICHik9Y.mjs → commands-BwBxmMxJ.mjs} +19 -13
  9. package/dist/{commands-BF_Wy2B4.mjs → commands-CwdYZQ-a.mjs} +1 -1
  10. package/dist/{commands-BbqjhR4z.mjs → commands-DVKFo1pt.mjs} +2 -2
  11. package/dist/{commands-D03sBXV4.mjs → commands-iXMwyExn.mjs} +2 -2
  12. package/dist/{fleet-qUmhLn41.mjs → fleet-plROHfB8.mjs} +1 -1
  13. package/dist/{frpc-BDZgTsi8.mjs → frpc-yc5-4EUe.mjs} +1 -1
  14. package/dist/{headlessCli-BG-PcYjM.mjs → headlessCli-D7vLrl7K.mjs} +2 -2
  15. package/dist/index.mjs +1 -1
  16. package/dist/{package-CMB-hfB0.mjs → package-Do-iBoUv.mjs} +2 -2
  17. package/dist/{rpc-CQTahguB.mjs → rpc-D1gr74eF.mjs} +11 -9
  18. package/dist/{rpc-gCEvLUNu.mjs → rpc-DUZqKPK4.mjs} +1 -1
  19. package/dist/{run-Buov6wz-.mjs → run-21-bMHCc.mjs} +37 -402
  20. package/dist/{run-DGs1hcvd.mjs → run-C__yViCA.mjs} +1 -1
  21. package/dist/scheduler-DweevMw_.mjs +93 -0
  22. package/dist/{serveCommands-C6l8yA9_.mjs → serveCommands-BZmiAjxi.mjs} +5 -5
  23. package/dist/{serveManager-B_Bj1AF4.mjs → serveManager-AbWv-Akt.mjs} +2 -2
  24. package/dist/{sideband-BYiyQgZR.mjs → sideband-CzzHtakf.mjs} +1 -1
  25. package/dist/store-BPL__e4D.mjs +125 -0
  26. package/package.json +2 -2
  27. package/bin/skills/loop/bin/routine-cli.mjs +0 -121
  28. package/bin/skills/loop/bin/routine-runner.mjs +0 -125
  29. package/bin/skills/loop/bin/routine-store.mjs +0 -49
  30. package/bin/skills/loop/routines.process.yaml +0 -20
  31. package/bin/skills/loop/test/test-routine-engine.mjs +0 -122
  32. package/dist/commands-CkygtYMZ.mjs +0 -223
  33. package/dist/store-D2HNe-Kv.mjs +0 -74
@@ -1,6 +1,6 @@
1
1
  import { spawnSync } from 'node:child_process';
2
- import { m as resolveProjectRoot } from './run-Buov6wz-.mjs';
3
- import { r as removeWorkflow, g as getWorkflow, l as listWorkflows, s as saveWorkflow, a as rawWorkflow } from './store-D2HNe-Kv.mjs';
2
+ import { m as resolveProjectRoot } from './run-21-bMHCc.mjs';
3
+ import { w as workflowSteps, r as removeWorkflow, g as getWorkflow, l as listWorkflows, s as saveWorkflow, a as rawWorkflow } from './store-BPL__e4D.mjs';
4
4
  import 'os';
5
5
  import 'fs/promises';
6
6
  import 'fs';
@@ -45,8 +45,8 @@ function positional(args) {
45
45
  function describeOn(on) {
46
46
  if (!on) return "manual";
47
47
  const parts = [];
48
- if (on.schedule) parts.push(`schedule(${on.schedule})`);
49
- if (on.dispatch) parts.push("dispatch");
48
+ if (on.schedule?.length) parts.push(`schedule(${on.schedule.map((s) => s.cron).join(", ")})`);
49
+ if (on.workflow_dispatch) parts.push("workflow_dispatch");
50
50
  if (on.channel) parts.push(`channel(${on.channel})`);
51
51
  if (on.issue?.length) parts.push(`issue(${on.issue.join("/")})`);
52
52
  return parts.length ? parts.join(" ") : "manual";
@@ -65,16 +65,18 @@ async function workflowCommand(args) {
65
65
  process.exit(1);
66
66
  }
67
67
  const onKinds = allFlags(rest, "--on");
68
+ const crons = allFlags(rest, "--cron");
68
69
  const on = {};
69
- if (onKinds.includes("schedule") || flag(rest, "--cron")) on.schedule = flag(rest, "--cron") || "0 * * * *";
70
- if (onKinds.includes("dispatch")) on.dispatch = true;
70
+ if (onKinds.includes("schedule") || crons.length) on.schedule = (crons.length ? crons : ["0 * * * *"]).map((c) => ({ cron: c }));
71
+ if (onKinds.includes("dispatch") || onKinds.includes("workflow_dispatch")) on.workflow_dispatch = true;
71
72
  if (onKinds.includes("channel") || flag(rest, "--channel")) on.channel = flag(rest, "--channel") || "default";
72
73
  if (onKinds.includes("issue") || flag(rest, "--issue")) on.issue = (flag(rest, "--issue") || "ready").split(",").map((s) => s.trim()).filter(Boolean);
73
74
  const owner = flag(rest, "--session") || process.env.SVAMP_SESSION_ID || null;
74
- const wf = { name, on: Object.keys(on).length ? on : void 0, jobs: runs.map((r) => ({ run: r })), session: owner };
75
+ const wf = { name, on: Object.keys(on).length ? on : void 0, jobs: { run: { steps: runs.map((r) => ({ run: r })) } }, session: owner };
75
76
  saveWorkflow(root, wf);
77
+ const nSteps = workflowSteps(wf).length;
76
78
  if (json) console.log(JSON.stringify(wf));
77
- else console.log(`Saved workflow "${name}" (on: ${describeOn(wf.on)}, ${wf.jobs.length} step${wf.jobs.length === 1 ? "" : "s"}).`);
79
+ else console.log(`Saved workflow "${name}" (on: ${describeOn(wf.on)}, ${nSteps} step${nSteps === 1 ? "" : "s"}).`);
78
80
  break;
79
81
  }
80
82
  case "list":
@@ -88,7 +90,10 @@ async function workflowCommand(args) {
88
90
  console.log("No workflows.");
89
91
  break;
90
92
  }
91
- for (const wf of all) console.log(`${wf.name} [${describeOn(wf.on)}] ${wf.jobs.length} step${wf.jobs.length === 1 ? "" : "s"}`);
93
+ for (const wf of all) {
94
+ const n = workflowSteps(wf).length;
95
+ console.log(`${wf.name} [${describeOn(wf.on)}] ${n} step${n === 1 ? "" : "s"}`);
96
+ }
92
97
  break;
93
98
  }
94
99
  case "show": {
@@ -119,10 +124,11 @@ async function workflowCommand(args) {
119
124
  console.error(`Workflow not found: ${name}`);
120
125
  process.exit(1);
121
126
  }
122
- console.log(`\u25B6 running workflow "${wf.name}" (${wf.jobs.length} step${wf.jobs.length === 1 ? "" : "s"})`);
123
- for (let i = 0; i < wf.jobs.length; i++) {
124
- const step = wf.jobs[i];
125
- console.log(` [${i + 1}/${wf.jobs.length}] $ ${step.run}`);
127
+ const steps = workflowSteps(wf);
128
+ console.log(`\u25B6 running workflow "${wf.name}" (${steps.length} step${steps.length === 1 ? "" : "s"})`);
129
+ for (let i = 0; i < steps.length; i++) {
130
+ const step = steps[i];
131
+ console.log(` [${i + 1}/${steps.length}] $ ${step.run}`);
126
132
  const r = spawnSync("sh", ["-c", step.run], { cwd: root, stdio: "inherit" });
127
133
  if (r.status !== 0) {
128
134
  console.error(` \u2717 step ${i + 1} failed (exit ${r.status ?? "signal"}). Stopping.`);
@@ -1,5 +1,5 @@
1
1
  import { execSync } from 'node:child_process';
2
- import { m as resolveProjectRoot, t as searchIssues, q as listIssues, o as addComment, u as updateIssue, n as getIssue, v as summarize, p as addIssue } from './run-Buov6wz-.mjs';
2
+ import { m as resolveProjectRoot, t as searchIssues, q as listIssues, o as addComment, u as updateIssue, n as getIssue, w as summarize, p as addIssue } from './run-21-bMHCc.mjs';
3
3
  import 'os';
4
4
  import 'fs/promises';
5
5
  import 'fs';
@@ -1,11 +1,11 @@
1
1
  import { writeFileSync, readFileSync } from 'fs';
2
2
  import { resolve } from 'path';
3
- import { connectAndGetMachine } from './commands-BssfhM-2.mjs';
3
+ import { connectAndGetMachine } from './commands-B4u6CUWH.mjs';
4
4
  import 'node:fs';
5
5
  import 'node:child_process';
6
6
  import 'node:path';
7
7
  import 'node:os';
8
- import './run-Buov6wz-.mjs';
8
+ import './run-21-bMHCc.mjs';
9
9
  import 'os';
10
10
  import 'fs/promises';
11
11
  import 'url';
@@ -1,7 +1,7 @@
1
1
  import { existsSync } from 'node:fs';
2
- import { connectAndGetMachine, resolveSessionId, createWorktree, connectAndResolveSession } from './commands-BssfhM-2.mjs';
2
+ import { connectAndGetMachine, resolveSessionId, createWorktree, connectAndResolveSession } from './commands-B4u6CUWH.mjs';
3
3
  import { execSync } from 'node:child_process';
4
- import { u as updateIssue, o as addComment, p as addIssue, x as shortId } from './run-Buov6wz-.mjs';
4
+ import { u as updateIssue, o as addComment, p as addIssue, x as shortId } from './run-21-bMHCc.mjs';
5
5
  import 'node:path';
6
6
  import 'node:os';
7
7
  import 'os';
@@ -1,7 +1,7 @@
1
1
  import { existsSync, readFileSync } from 'node:fs';
2
2
  import { join } from 'node:path';
3
3
  import os from 'node:os';
4
- import { c as connectToHypha } from './run-Buov6wz-.mjs';
4
+ import { c as connectToHypha } from './run-21-bMHCc.mjs';
5
5
  import { PINNED_CLAUDE_CODE_VERSION } from './pinnedClaudeCode-HydRNEt7.mjs';
6
6
  import 'os';
7
7
  import 'fs/promises';
@@ -4,7 +4,7 @@ import { mkdirSync, writeFileSync, unlinkSync, existsSync, chmodSync, readFileSy
4
4
  import { join } from 'path';
5
5
  import { homedir, platform, arch } from 'os';
6
6
  import { randomUUID, createHash } from 'crypto';
7
- import { h as getFrpsSubdomainHost, i as getFrpsServerPort, j as getFrpsServerAddr } from './run-Buov6wz-.mjs';
7
+ import { h as getFrpsSubdomainHost, i as getFrpsServerPort, j as getFrpsServerAddr } from './run-21-bMHCc.mjs';
8
8
  import 'fs/promises';
9
9
  import 'url';
10
10
  import 'node:crypto';
@@ -1,5 +1,5 @@
1
- import { N as resolveModel, $ as describeMisconfiguration, a0 as buildMachineDeps } from './run-Buov6wz-.mjs';
2
- import { handleRealtimeEvent, initMachineVoiceSession } from './sideband-BYiyQgZR.mjs';
1
+ import { M as resolveModel, _ as describeMisconfiguration, $ as buildMachineDeps } from './run-21-bMHCc.mjs';
2
+ import { handleRealtimeEvent, initMachineVoiceSession } from './sideband-CzzHtakf.mjs';
3
3
  import { WebSocket } from 'ws';
4
4
  import { execSync, spawn } from 'child_process';
5
5
  import 'os';
package/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- export { c as connectToHypha, a as createSessionStore, d as daemonStatus, g as getHyphaServerUrl, r as registerMachineService, s as startDaemon, b as stopDaemon } from './run-Buov6wz-.mjs';
1
+ export { c as connectToHypha, a as createSessionStore, d as daemonStatus, g as getHyphaServerUrl, r as registerMachineService, s as startDaemon, b as stopDaemon } from './run-21-bMHCc.mjs';
2
2
  import 'os';
3
3
  import 'fs/promises';
4
4
  import 'fs';
@@ -1,5 +1,5 @@
1
1
  var name = "svamp-cli";
2
- var version = "0.2.175";
2
+ var version = "0.2.177";
3
3
  var description = "Svamp CLI — AI workspace daemon on Hypha Cloud";
4
4
  var author = "Amun AI AB";
5
5
  var license = "SEE LICENSE IN LICENSE";
@@ -19,7 +19,7 @@ var exports$1 = {
19
19
  var scripts = {
20
20
  build: "rm -rf dist bin/skills && mkdir -p bin/skills && cp -r ../../skills/artifact bin/skills/artifact && cp -r ../../skills/loop bin/skills/loop && cp -r ../../skills/crew bin/skills/crew && tsc --noEmit && pkgroll",
21
21
  typecheck: "tsc --noEmit",
22
- test: "npx tsx test/test-context-window.mjs && npx tsx test/test-ratelimit-retry.mjs && npx tsx test/test-instance-config.mjs && npx tsx test/test-authorize.mjs && npx tsx test/test-normalize-allowed-user.mjs && npx tsx test/test-share-url.mjs && npx tsx test/test-update-sharing-normalization.mjs && npx tsx test/test-sharing-notify-sync.mjs && npx tsx test/test-staged-homes-sweep.mjs && npx tsx test/test-session-helpers.mjs && npx tsx test/test-cli-routing.mjs && npx tsx test/test-security-context.mjs && npx tsx test/test-isolation-decision.mjs && npx tsx test/test-loop-activation.mjs && npx tsx test/test-message-helpers.mjs && npx tsx test/test-agent-config.mjs && npx tsx test/test-wrap-command.mjs && npx tsx test/test-credential-staging.mjs && npx tsx test/test-claude-auth.mjs && npx tsx test/test-output-formatters.mjs && npx tsx test/test-inbox-guard.mjs && npx tsx test/test-auto-topic.mjs && npx tsx test/test-project-info.mjs && npx tsx test/test-agent-types.mjs && npx tsx test/test-transport.mjs && npx tsx test/test-session-update-handlers.mjs && npx tsx test/test-session-scanner.mjs && npx tsx test/test-hypha-client.mjs && npx tsx test/test-hook-settings.mjs && npx tsx test/test-session-service-logic.mjs && npx tsx test/test-daemon-persistence.mjs && npx tsx test/test-detect-isolation.mjs && npx tsx test/test-machine-service-logic.mjs && npx tsx test/test-interactive-helpers.mjs && npx tsx test/test-codex-backend.mjs && npx tsx test/test-acp-backend.mjs && npx tsx test/test-acp-bridge.mjs && npx tsx test/test-hook-server.mjs && npx tsx test/test-session-commands.mjs && npx tsx test/test-interactive-console.mjs && npx tsx test/test-session-messages.mjs && npx tsx test/test-session-send-query.mjs && npx tsx test/test-skills.mjs && npx tsx test/test-agent-grouping.mjs && npx tsx test/test-machine-list-directory.mjs && npx tsx test/test-service-commands.mjs && npx tsx test/test-supervisor.mjs && npx tsx test/test-supervisor-lock.mjs && node test/test-supervisor-restart.mjs && npx tsx test/test-clear-detection.mjs && npx tsx test/test-session-consolidation.mjs && npx tsx test/test-inbox.mjs && npx tsx test/test-inbox-cross-machine.mjs && npx tsx test/test-issue-store.mjs && npx tsx test/test-issue-close-gate.mjs && npx tsx test/test-issue-rpc.mjs && npx tsx test/test-workflow-store.mjs && npx tsx test/test-workflow-rpc.mjs && npx tsx test/test-serve-link-subdomain.mjs && npx tsx test/test-short-id.mjs && npx tsx test/test-transcript-edit.mjs && npx tsx test/test-edit-history.mjs && npx tsx test/test-friendly-name.mjs && npx tsx test/test-session-rpc-dispatch.mjs && npx tsx test/test-sandbox-cli.mjs && npx tsx test/test-serve-manager.mjs && npx tsx test/test-serve-stability.mjs && npx tsx test/test-frpc-e2e.mjs --unit-only && npx tsx test/test-frpc-status.mjs && node test/pinnedClaudeCode.test.mjs && node test/fleet.test.mjs && npx tsx test/test-routine.mjs && npx tsx test/test-routine-rpc.mjs && npx tsx test/test-session-file.mjs && npx tsx test/test-channel-rpc.mjs && npx tsx test/test-wise-agent.mjs && npx tsx test/test-channel-agent.mjs && npx tsx test/test-channels-service.mjs && npx tsx test/test-channel-async-reply.mjs && npx tsx test/test-channel-binding.mjs && npx tsx test/test-channel-identity.mjs && npx tsx test/test-shared-session-identity.mjs && npx tsx test/test-wise-agent-auth.mjs && npx tsx test/test-channel-http.mjs && npx tsx test/test-wise-voice.mjs && npx tsx test/test-wise-headless.mjs && npx tsx test/test-wise-machine.mjs && npx tsx test/test-crew-merge.mjs && npx tsx test/test-crew-verdict-routing.mjs",
22
+ test: "npx tsx test/test-context-window.mjs && npx tsx test/test-ratelimit-retry.mjs && npx tsx test/test-instance-config.mjs && npx tsx test/test-authorize.mjs && npx tsx test/test-normalize-allowed-user.mjs && npx tsx test/test-share-url.mjs && npx tsx test/test-update-sharing-normalization.mjs && npx tsx test/test-sharing-notify-sync.mjs && npx tsx test/test-staged-homes-sweep.mjs && npx tsx test/test-session-helpers.mjs && npx tsx test/test-cli-routing.mjs && npx tsx test/test-security-context.mjs && npx tsx test/test-isolation-decision.mjs && npx tsx test/test-loop-activation.mjs && npx tsx test/test-message-helpers.mjs && npx tsx test/test-agent-config.mjs && npx tsx test/test-wrap-command.mjs && npx tsx test/test-credential-staging.mjs && npx tsx test/test-claude-auth.mjs && npx tsx test/test-output-formatters.mjs && npx tsx test/test-inbox-guard.mjs && npx tsx test/test-auto-topic.mjs && npx tsx test/test-project-info.mjs && npx tsx test/test-agent-types.mjs && npx tsx test/test-transport.mjs && npx tsx test/test-session-update-handlers.mjs && npx tsx test/test-session-scanner.mjs && npx tsx test/test-hypha-client.mjs && npx tsx test/test-hook-settings.mjs && npx tsx test/test-session-service-logic.mjs && npx tsx test/test-daemon-persistence.mjs && npx tsx test/test-detect-isolation.mjs && npx tsx test/test-machine-service-logic.mjs && npx tsx test/test-interactive-helpers.mjs && npx tsx test/test-codex-backend.mjs && npx tsx test/test-acp-backend.mjs && npx tsx test/test-acp-bridge.mjs && npx tsx test/test-hook-server.mjs && npx tsx test/test-session-commands.mjs && npx tsx test/test-interactive-console.mjs && npx tsx test/test-session-messages.mjs && npx tsx test/test-session-send-query.mjs && npx tsx test/test-skills.mjs && npx tsx test/test-agent-grouping.mjs && npx tsx test/test-machine-list-directory.mjs && npx tsx test/test-service-commands.mjs && npx tsx test/test-supervisor.mjs && npx tsx test/test-supervisor-lock.mjs && node test/test-supervisor-restart.mjs && npx tsx test/test-clear-detection.mjs && npx tsx test/test-session-consolidation.mjs && npx tsx test/test-inbox.mjs && npx tsx test/test-inbox-cross-machine.mjs && npx tsx test/test-issue-store.mjs && npx tsx test/test-issue-close-gate.mjs && npx tsx test/test-issue-rpc.mjs && npx tsx test/test-workflow-store.mjs && npx tsx test/test-workflow-rpc.mjs && npx tsx test/test-workflow-scheduler.mjs && npx tsx test/test-serve-link-subdomain.mjs && npx tsx test/test-short-id.mjs && npx tsx test/test-transcript-edit.mjs && npx tsx test/test-edit-history.mjs && npx tsx test/test-friendly-name.mjs && npx tsx test/test-session-rpc-dispatch.mjs && npx tsx test/test-sandbox-cli.mjs && npx tsx test/test-serve-manager.mjs && npx tsx test/test-serve-stability.mjs && npx tsx test/test-frpc-e2e.mjs --unit-only && npx tsx test/test-frpc-status.mjs && node test/pinnedClaudeCode.test.mjs && node test/fleet.test.mjs && npx tsx test/test-session-file.mjs && npx tsx test/test-channel-rpc.mjs && npx tsx test/test-wise-agent.mjs && npx tsx test/test-channel-agent.mjs && npx tsx test/test-channels-service.mjs && npx tsx test/test-channel-async-reply.mjs && npx tsx test/test-channel-binding.mjs && npx tsx test/test-channel-identity.mjs && npx tsx test/test-shared-session-identity.mjs && npx tsx test/test-wise-agent-auth.mjs && npx tsx test/test-channel-http.mjs && npx tsx test/test-wise-voice.mjs && npx tsx test/test-wise-headless.mjs && npx tsx test/test-wise-machine.mjs && npx tsx test/test-crew-merge.mjs && npx tsx test/test-crew-verdict-routing.mjs",
23
23
  "test:hypha": "node --no-warnings test/test-hypha-service.mjs",
24
24
  dev: "tsx src/cli.ts",
25
25
  "dev:daemon": "tsx src/cli.ts daemon start-sync",
@@ -1,6 +1,6 @@
1
1
  import { spawnSync } from 'node:child_process';
2
- import { m as resolveProjectRoot } from './run-Buov6wz-.mjs';
3
- import { g as getWorkflow, r as removeWorkflow, s as saveWorkflow, a as rawWorkflow, l as listWorkflows } from './store-D2HNe-Kv.mjs';
2
+ import { m as resolveProjectRoot } from './run-21-bMHCc.mjs';
3
+ import { g as getWorkflow, w as workflowSteps, r as removeWorkflow, s as saveWorkflow, a as rawWorkflow, l as listWorkflows } from './store-BPL__e4D.mjs';
4
4
  import 'os';
5
5
  import 'fs/promises';
6
6
  import 'fs';
@@ -35,8 +35,9 @@ function workflowRpc(cwd, params) {
35
35
  }
36
36
  case "add": {
37
37
  const on = {};
38
- if (params.cron) on.schedule = String(params.cron);
39
- if (params.dispatch) on.dispatch = true;
38
+ const crons = Array.isArray(params.cron) ? params.cron.map(String) : params.cron ? [String(params.cron)] : [];
39
+ if (crons.length) on.schedule = crons.map((c) => ({ cron: c }));
40
+ if (params.dispatch || params.workflow_dispatch) on.workflow_dispatch = true;
40
41
  if (params.channel) on.channel = String(params.channel);
41
42
  if (Array.isArray(params.issue) && params.issue.length) on.issue = params.issue.map(String);
42
43
  const runs = Array.isArray(params.runs) ? params.runs.map(String).filter(Boolean) : [];
@@ -44,7 +45,7 @@ function workflowRpc(cwd, params) {
44
45
  const wf = {
45
46
  name: String(params.name),
46
47
  on: Object.keys(on).length ? on : void 0,
47
- jobs: runs.map((r) => ({ run: r })),
48
+ jobs: { run: { steps: runs.map((r) => ({ run: r })) } },
48
49
  session: params.session || null
49
50
  };
50
51
  saveWorkflow(root, wf);
@@ -55,10 +56,11 @@ function workflowRpc(cwd, params) {
55
56
  case "run": {
56
57
  const wf = getWorkflow(root, String(params.name));
57
58
  if (!wf) throw new Error(`Workflow not found: ${params.name}`);
58
- const out = [`\u25B6 running workflow "${wf.name}" (${wf.jobs.length} step${wf.jobs.length === 1 ? "" : "s"})`];
59
- for (let i = 0; i < wf.jobs.length; i++) {
60
- const step = wf.jobs[i];
61
- out.push(` [${i + 1}/${wf.jobs.length}] $ ${step.run}`);
59
+ const steps = workflowSteps(wf);
60
+ const out = [`\u25B6 running workflow "${wf.name}" (${steps.length} step${steps.length === 1 ? "" : "s"})`];
61
+ for (let i = 0; i < steps.length; i++) {
62
+ const step = steps[i];
63
+ out.push(` [${i + 1}/${steps.length}] $ ${step.run}`);
62
64
  const r = spawnSync("sh", ["-c", step.run], { cwd: root, encoding: "utf-8", timeout: 12e4 });
63
65
  if (r.stdout) out.push(r.stdout.trimEnd());
64
66
  if (r.stderr) out.push(r.stderr.trimEnd());
@@ -1,4 +1,4 @@
1
- import { m as resolveProjectRoot, u as updateIssue, n as getIssue, o as addComment, p as addIssue, q as listIssues, t as searchIssues } from './run-Buov6wz-.mjs';
1
+ import { m as resolveProjectRoot, u as updateIssue, n as getIssue, o as addComment, p as addIssue, q as listIssues, t as searchIssues } from './run-21-bMHCc.mjs';
2
2
  import 'os';
3
3
  import 'fs/promises';
4
4
  import 'fs';