@slowcook-ai/cli 0.19.5 → 0.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) hide show
  1. package/README.md +192 -28
  2. package/dist/cli.js +65 -73
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/brew/fidelity-loop.d.ts +71 -0
  5. package/dist/commands/brew/fidelity-loop.d.ts.map +1 -0
  6. package/dist/commands/brew/fidelity-loop.js +108 -0
  7. package/dist/commands/brew/fidelity-loop.js.map +1 -0
  8. package/dist/commands/brew/fidelity-phase.d.ts +49 -0
  9. package/dist/commands/brew/fidelity-phase.d.ts.map +1 -0
  10. package/dist/commands/brew/fidelity-phase.js +75 -0
  11. package/dist/commands/brew/fidelity-phase.js.map +1 -0
  12. package/dist/commands/eye/index.d.ts +2 -0
  13. package/dist/commands/eye/index.d.ts.map +1 -0
  14. package/dist/commands/eye/index.js +64 -0
  15. package/dist/commands/eye/index.js.map +1 -0
  16. package/dist/commands/eye/plan.d.ts +61 -0
  17. package/dist/commands/eye/plan.d.ts.map +1 -0
  18. package/dist/commands/eye/plan.js +81 -0
  19. package/dist/commands/eye/plan.js.map +1 -0
  20. package/dist/commands/eye/run.d.ts +19 -0
  21. package/dist/commands/eye/run.d.ts.map +1 -0
  22. package/dist/commands/eye/run.js +47 -0
  23. package/dist/commands/eye/run.js.map +1 -0
  24. package/dist/commands/eye/spec-modes.d.ts +5 -0
  25. package/dist/commands/eye/spec-modes.d.ts.map +1 -0
  26. package/dist/commands/eye/spec-modes.js +36 -0
  27. package/dist/commands/eye/spec-modes.js.map +1 -0
  28. package/dist/commands/gate/github.d.ts +27 -0
  29. package/dist/commands/gate/github.d.ts.map +1 -0
  30. package/dist/commands/gate/github.js +46 -0
  31. package/dist/commands/gate/github.js.map +1 -0
  32. package/dist/commands/gate/index.d.ts +2 -0
  33. package/dist/commands/gate/index.d.ts.map +1 -0
  34. package/dist/commands/gate/index.js +68 -0
  35. package/dist/commands/gate/index.js.map +1 -0
  36. package/dist/commands/gate/model.d.ts +55 -0
  37. package/dist/commands/gate/model.d.ts.map +1 -0
  38. package/dist/commands/gate/model.js +64 -0
  39. package/dist/commands/gate/model.js.map +1 -0
  40. package/dist/commands/gate/reviewers.d.ts +24 -0
  41. package/dist/commands/gate/reviewers.d.ts.map +1 -0
  42. package/dist/commands/gate/reviewers.js +69 -0
  43. package/dist/commands/gate/reviewers.js.map +1 -0
  44. package/dist/commands/recon/shape-preserve.d.ts +38 -0
  45. package/dist/commands/recon/shape-preserve.d.ts.map +1 -1
  46. package/dist/commands/recon/shape-preserve.js +112 -1
  47. package/dist/commands/recon/shape-preserve.js.map +1 -1
  48. package/dist/commands/refine/spec-yaml.d.ts +3 -0
  49. package/dist/commands/refine/spec-yaml.d.ts.map +1 -1
  50. package/dist/commands/refine/spec-yaml.js +4 -0
  51. package/dist/commands/refine/spec-yaml.js.map +1 -1
  52. package/dist/commands/serve/config.d.ts +159 -0
  53. package/dist/commands/serve/config.d.ts.map +1 -0
  54. package/dist/commands/serve/config.js +216 -0
  55. package/dist/commands/serve/config.js.map +1 -0
  56. package/dist/commands/serve/detect.d.ts +31 -0
  57. package/dist/commands/serve/detect.d.ts.map +1 -0
  58. package/dist/commands/serve/detect.js +56 -0
  59. package/dist/commands/serve/detect.js.map +1 -0
  60. package/dist/commands/serve/dev.d.ts +46 -0
  61. package/dist/commands/serve/dev.d.ts.map +1 -0
  62. package/dist/commands/serve/dev.js +122 -0
  63. package/dist/commands/serve/dev.js.map +1 -0
  64. package/dist/commands/serve/index.d.ts +28 -0
  65. package/dist/commands/serve/index.d.ts.map +1 -0
  66. package/dist/commands/serve/index.js +224 -0
  67. package/dist/commands/serve/index.js.map +1 -0
  68. package/dist/commands/serve/mock.d.ts +24 -0
  69. package/dist/commands/serve/mock.d.ts.map +1 -0
  70. package/dist/commands/serve/mock.js +111 -0
  71. package/dist/commands/serve/mock.js.map +1 -0
  72. package/dist/commands/serve/runner.d.ts +52 -0
  73. package/dist/commands/serve/runner.d.ts.map +1 -0
  74. package/dist/commands/serve/runner.js +53 -0
  75. package/dist/commands/serve/runner.js.map +1 -0
  76. package/dist/commands/serve/staging.d.ts +28 -0
  77. package/dist/commands/serve/staging.d.ts.map +1 -0
  78. package/dist/commands/serve/staging.js +152 -0
  79. package/dist/commands/serve/staging.js.map +1 -0
  80. package/dist/commands/stories/index.d.ts +15 -0
  81. package/dist/commands/stories/index.d.ts.map +1 -0
  82. package/dist/commands/stories/index.js +280 -0
  83. package/dist/commands/stories/index.js.map +1 -0
  84. package/dist/commands/stories/status.d.ts +74 -0
  85. package/dist/commands/stories/status.d.ts.map +1 -0
  86. package/dist/commands/stories/status.js +176 -0
  87. package/dist/commands/stories/status.js.map +1 -0
  88. package/dist/commands/upsert-agent-docs.d.ts.map +1 -1
  89. package/dist/commands/upsert-agent-docs.js +12 -0
  90. package/dist/commands/upsert-agent-docs.js.map +1 -1
  91. package/dist/commands.manifest.d.ts +37 -0
  92. package/dist/commands.manifest.d.ts.map +1 -0
  93. package/dist/commands.manifest.js +301 -0
  94. package/dist/commands.manifest.js.map +1 -0
  95. package/dist/help.d.ts +43 -0
  96. package/dist/help.d.ts.map +1 -0
  97. package/dist/help.js +131 -0
  98. package/dist/help.js.map +1 -0
  99. package/package.json +8 -6
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect.js","sourceRoot":"","sources":["../../../src/commands/serve/detect.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAajC;;;;;;;;GAQG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAAgB;IACjD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,cAAc,CAAC,CAAC;IACvD,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACzB,OAAO;YACL,MAAM,EAAE,KAAK;YACb,YAAY,EAAE,KAAK;YACnB,MAAM,EAAE,qEAAqE;SAC9E,CAAC;IACJ,CAAC;IACD,IAAI,GAAyC,CAAC;IAC9C,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;IAClD,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO;YACL,MAAM,EAAE,IAAI;YACZ,YAAY,EAAE,KAAK;YACnB,MAAM,EAAE,wCAAyC,CAAW,CAAC,OAAO,EAAE;SACvE,CAAC;IACJ,CAAC;IACD,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC;IACnC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO;YACL,MAAM,EAAE,IAAI;YACZ,YAAY,EAAE,KAAK;YACnB,MAAM,EACJ,wGAAwG;SAC3G,CAAC;IACJ,CAAC;IACD,OAAO;QACL,MAAM,EAAE,IAAI;QACZ,YAAY,EAAE,IAAI;QAClB,SAAS;KACV,CAAC;AACJ,CAAC"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * `slowcook serve dev <verb>` — Phase 1 implementation.
3
+ *
4
+ * Verbs (Phase 1):
5
+ * - up — bring up the dev profile (compose overlay or fallback)
6
+ * - sync — push source-branch + restart bind-mount targets
7
+ * - down — stop the profile's services (volumes preserved)
8
+ * - logs — pass-through to docker-compose logs
9
+ * - reset — no-op for dev profile (only meaningful for staging)
10
+ *
11
+ * Backward-compat aliases preserved on the cli switch:
12
+ * - `slowcook dev-env push --branch X` ≡ `slowcook serve dev sync --branch X`
13
+ * - `slowcook dev-env up` ≡ `slowcook serve dev up`
14
+ * - `slowcook dev-env reset` ≡ `slowcook serve dev reset` (no-op + notice)
15
+ *
16
+ * 0.19.7 (sc#173 fixes):
17
+ * - Planner populates `commands[]` (structured ShellCommand records).
18
+ * The cli wrapper invokes runCommands() to actually execute (or
19
+ * dry-run); previously `up`/`down`/`logs` were planners only.
20
+ * - Compose-file layering: respects `profile.compose_files` (multi-`-f`)
21
+ * OR `compose_overlay` (single). Real consumers need base+overlay.
22
+ * - `--build` flag is suppressed for `bind-mount-source` mode (the
23
+ * mode's whole point is skipping the build loop).
24
+ */
25
+ import type { ProfileConfig, ServeConfig } from "./config.js";
26
+ import type { ShellCommand } from "./runner.js";
27
+ export interface DevVerbArgs {
28
+ verb: string;
29
+ branch?: string;
30
+ story?: string;
31
+ service?: string;
32
+ follow?: boolean;
33
+ prune?: boolean;
34
+ repoRoot: string;
35
+ /** Test seam: report the plan but skip actual git rev-parse. */
36
+ dryRun?: boolean;
37
+ }
38
+ export interface DevVerbResult {
39
+ exitCode: number;
40
+ /** Human narrative emitted by the planner. */
41
+ output: string[];
42
+ /** Shell commands the cli wrapper should execute (in order). */
43
+ commands?: ShellCommand[];
44
+ }
45
+ export declare function planServeDev(args: DevVerbArgs, _config: ServeConfig, profile: ProfileConfig): DevVerbResult;
46
+ //# sourceMappingURL=dev.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../../src/commands/serve/dev.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE9D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,gEAAgE;IAChE,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,8CAA8C;IAC9C,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,gEAAgE;IAChE,QAAQ,CAAC,EAAE,YAAY,EAAE,CAAC;CAC3B;AAED,wBAAgB,YAAY,CAC1B,IAAI,EAAE,WAAW,EACjB,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE,aAAa,GACrB,aAAa,CAkBf"}
@@ -0,0 +1,122 @@
1
+ /**
2
+ * `slowcook serve dev <verb>` — Phase 1 implementation.
3
+ *
4
+ * Verbs (Phase 1):
5
+ * - up — bring up the dev profile (compose overlay or fallback)
6
+ * - sync — push source-branch + restart bind-mount targets
7
+ * - down — stop the profile's services (volumes preserved)
8
+ * - logs — pass-through to docker-compose logs
9
+ * - reset — no-op for dev profile (only meaningful for staging)
10
+ *
11
+ * Backward-compat aliases preserved on the cli switch:
12
+ * - `slowcook dev-env push --branch X` ≡ `slowcook serve dev sync --branch X`
13
+ * - `slowcook dev-env up` ≡ `slowcook serve dev up`
14
+ * - `slowcook dev-env reset` ≡ `slowcook serve dev reset` (no-op + notice)
15
+ *
16
+ * 0.19.7 (sc#173 fixes):
17
+ * - Planner populates `commands[]` (structured ShellCommand records).
18
+ * The cli wrapper invokes runCommands() to actually execute (or
19
+ * dry-run); previously `up`/`down`/`logs` were planners only.
20
+ * - Compose-file layering: respects `profile.compose_files` (multi-`-f`)
21
+ * OR `compose_overlay` (single). Real consumers need base+overlay.
22
+ * - `--build` flag is suppressed for `bind-mount-source` mode (the
23
+ * mode's whole point is skipping the build loop).
24
+ */
25
+ import { execSync } from "node:child_process";
26
+ import { composeFiles, shouldBuildOnUp } from "./config.js";
27
+ export function planServeDev(args, _config, profile) {
28
+ switch (args.verb) {
29
+ case "up":
30
+ return planUp(args, profile);
31
+ case "sync":
32
+ return planSync(args, profile);
33
+ case "down":
34
+ return planDown(args, profile);
35
+ case "logs":
36
+ return planLogs(args, profile);
37
+ case "reset":
38
+ return {
39
+ exitCode: 0,
40
+ output: ["[serve dev reset] dev profile has no scenario seed; nothing to reset (only meaningful for staging)."],
41
+ };
42
+ default:
43
+ return { exitCode: 64, output: [`Unknown verb: ${args.verb}. See \`slowcook serve dev --help\`.`] };
44
+ }
45
+ }
46
+ function planUp(_args, profile) {
47
+ const files = composeFiles(profile);
48
+ const apps = Object.keys(profile.apps);
49
+ const output = [`[serve dev up] bringing up: ${apps.join(", ") || "(no apps configured)"}`];
50
+ if (files.length === 0) {
51
+ output.push(" (no compose_files / compose_overlay set; declare one in serve.yaml)");
52
+ return { exitCode: 64, output };
53
+ }
54
+ const fileFlags = files.map((f) => `-f ${f}`).join(" ");
55
+ const buildFlag = shouldBuildOnUp(profile) ? " --build" : "";
56
+ const commands = [
57
+ { cmd: `docker compose ${fileFlags} up -d${buildFlag}`, remote: true, label: "bring up" },
58
+ ];
59
+ if (profile.seed_script) {
60
+ commands.push({ cmd: `pnpm exec ts-node ${profile.seed_script}`, remote: true, label: "seed" });
61
+ }
62
+ return { exitCode: 0, output, commands };
63
+ }
64
+ function planSync(args, profile) {
65
+ const sourceBranch = profile.source_branch;
66
+ let localBranch = args.branch;
67
+ if (!localBranch && !args.dryRun) {
68
+ try {
69
+ localBranch = execSync("git rev-parse --abbrev-ref HEAD", { cwd: args.repoRoot, encoding: "utf8" }).trim();
70
+ }
71
+ catch {
72
+ // handled below
73
+ }
74
+ }
75
+ else if (!localBranch && args.dryRun) {
76
+ localBranch = "<current-branch>";
77
+ }
78
+ if (!localBranch || localBranch === "HEAD") {
79
+ return {
80
+ exitCode: 64,
81
+ output: ["[serve dev sync] couldn't resolve a local branch (detached HEAD?). Pass --branch <name>."],
82
+ };
83
+ }
84
+ const output = [
85
+ `[serve dev sync] ${localBranch} → origin/${sourceBranch}${args.story ? ` (story-${args.story})` : ""}`,
86
+ ];
87
+ const commands = [
88
+ { cmd: `git push --force origin ${localBranch}:${sourceBranch}`, remote: false, label: "git push" },
89
+ ];
90
+ return { exitCode: 0, output, commands };
91
+ }
92
+ function planDown(args, profile) {
93
+ const files = composeFiles(profile);
94
+ if (files.length === 0) {
95
+ return { exitCode: 64, output: ["[serve dev down] no compose_files / compose_overlay set; nothing to stop."] };
96
+ }
97
+ const fileFlags = files.map((f) => `-f ${f}`).join(" ");
98
+ const cmd = args.prune
99
+ ? `docker compose ${fileFlags} down -v`
100
+ : `docker compose ${fileFlags} down`;
101
+ return {
102
+ exitCode: 0,
103
+ output: ["[serve dev down]"],
104
+ commands: [{ cmd, remote: true, label: "compose down" }],
105
+ };
106
+ }
107
+ function planLogs(args, profile) {
108
+ const files = composeFiles(profile);
109
+ if (files.length === 0) {
110
+ return { exitCode: 64, output: ["[serve dev logs] no compose_files / compose_overlay set; nothing to tail."] };
111
+ }
112
+ const fileFlags = files.map((f) => `-f ${f}`).join(" ");
113
+ const follow = args.follow ? "-f" : "";
114
+ const service = args.service ?? "";
115
+ const cmd = `docker compose ${fileFlags} logs ${follow} ${service}`.replace(/\s+/g, " ").trim();
116
+ return {
117
+ exitCode: 0,
118
+ output: ["[serve dev logs]"],
119
+ commands: [{ cmd, remote: true, label: "compose logs" }],
120
+ };
121
+ }
122
+ //# sourceMappingURL=dev.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev.js","sourceRoot":"","sources":["../../../src/commands/serve/dev.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAuB5D,MAAM,UAAU,YAAY,CAC1B,IAAiB,EACjB,OAAoB,EACpB,OAAsB;IAEtB,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,KAAK,IAAI;YACP,OAAO,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC/B,KAAK,MAAM;YACT,OAAO,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACjC,KAAK,MAAM;YACT,OAAO,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACjC,KAAK,MAAM;YACT,OAAO,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACjC,KAAK,OAAO;YACV,OAAO;gBACL,QAAQ,EAAE,CAAC;gBACX,MAAM,EAAE,CAAC,qGAAqG,CAAC;aAChH,CAAC;QACJ;YACE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,iBAAiB,IAAI,CAAC,IAAI,sCAAsC,CAAC,EAAE,CAAC;IACxG,CAAC;AACH,CAAC;AAED,SAAS,MAAM,CAAC,KAAkB,EAAE,OAAsB;IACxD,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IACpC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,MAAM,MAAM,GAAa,CAAC,+BAA+B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,sBAAsB,EAAE,CAAC,CAAC;IAEtG,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,CAAC,IAAI,CAAC,uEAAuE,CAAC,CAAC;QACrF,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC;IAClC,CAAC;IAED,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACxD,MAAM,SAAS,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7D,MAAM,QAAQ,GAAmB;QAC/B,EAAE,GAAG,EAAE,kBAAkB,SAAS,SAAS,SAAS,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE;KAC1F,CAAC;IACF,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;QACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,qBAAqB,OAAO,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IAClG,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AAC3C,CAAC;AAED,SAAS,QAAQ,CAAC,IAAiB,EAAE,OAAsB;IACzD,MAAM,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC;IAC3C,IAAI,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC;IAC9B,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QACjC,IAAI,CAAC;YACH,WAAW,GAAG,QAAQ,CAAC,iCAAiC,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC7G,CAAC;QAAC,MAAM,CAAC;YACP,gBAAgB;QAClB,CAAC;IACH,CAAC;SAAM,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QACvC,WAAW,GAAG,kBAAkB,CAAC;IACnC,CAAC;IACD,IAAI,CAAC,WAAW,IAAI,WAAW,KAAK,MAAM,EAAE,CAAC;QAC3C,OAAO;YACL,QAAQ,EAAE,EAAE;YACZ,MAAM,EAAE,CAAC,0FAA0F,CAAC;SACrG,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,GAAa;QACvB,oBAAoB,WAAW,aAAa,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;KACxG,CAAC;IACF,MAAM,QAAQ,GAAmB;QAC/B,EAAE,GAAG,EAAE,2BAA2B,WAAW,IAAI,YAAY,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE;KACpG,CAAC;IACF,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AAC3C,CAAC;AAED,SAAS,QAAQ,CAAC,IAAiB,EAAE,OAAsB;IACzD,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IACpC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,2EAA2E,CAAC,EAAE,CAAC;IACjH,CAAC;IACD,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACxD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK;QACpB,CAAC,CAAC,kBAAkB,SAAS,UAAU;QACvC,CAAC,CAAC,kBAAkB,SAAS,OAAO,CAAC;IACvC,OAAO;QACL,QAAQ,EAAE,CAAC;QACX,MAAM,EAAE,CAAC,kBAAkB,CAAC;QAC5B,QAAQ,EAAE,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC;KACzD,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,IAAiB,EAAE,OAAsB;IACzD,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IACpC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,2EAA2E,CAAC,EAAE,CAAC;IACjH,CAAC;IACD,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACxD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IACvC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;IACnC,MAAM,GAAG,GAAG,kBAAkB,SAAS,SAAS,MAAM,IAAI,OAAO,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAChG,OAAO;QACL,QAAQ,EAAE,CAAC;QACX,MAAM,EAAE,CAAC,kBAAkB,CAAC;QAC5B,QAAQ,EAAE,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC;KACzD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * `slowcook serve <profile> <verb>` — multi-mode dev/mock/staging.
3
+ *
4
+ * See `docs/plans/0.20-design-discussions.md` design #5.
5
+ *
6
+ * Phase 1 (this cut): `serve dev` is implemented end-to-end. `serve
7
+ * mock` and `serve staging` parse config + print a "Phase 2/3 stub"
8
+ * notice; the runtime implementation lands in tasks #20 / #21.
9
+ *
10
+ * Backward-compat: `slowcook dev-env <verb>` continues to work as an
11
+ * alias for `slowcook serve dev <verb>` (wired in cli.ts).
12
+ */
13
+ export interface ServeArgs {
14
+ profile?: string;
15
+ verb?: string;
16
+ branch?: string;
17
+ story?: string;
18
+ service?: string;
19
+ scenario?: string;
20
+ follow?: boolean;
21
+ prune?: boolean;
22
+ repoRoot: string;
23
+ dryRun?: boolean;
24
+ }
25
+ export declare function parseServeArgs(argv: string[]): ServeArgs;
26
+ export declare function printHelp(): void;
27
+ export declare function serve(argv: string[]): Promise<void>;
28
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/serve/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AASH,MAAM,WAAW,SAAS;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,SAAS,CAwBxD;AAED,wBAAgB,SAAS,IAAI,IAAI,CAkChC;AAED,wBAAsB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAsEzD"}
@@ -0,0 +1,224 @@
1
+ /**
2
+ * `slowcook serve <profile> <verb>` — multi-mode dev/mock/staging.
3
+ *
4
+ * See `docs/plans/0.20-design-discussions.md` design #5.
5
+ *
6
+ * Phase 1 (this cut): `serve dev` is implemented end-to-end. `serve
7
+ * mock` and `serve staging` parse config + print a "Phase 2/3 stub"
8
+ * notice; the runtime implementation lands in tasks #20 / #21.
9
+ *
10
+ * Backward-compat: `slowcook dev-env <verb>` continues to work as an
11
+ * alias for `slowcook serve dev <verb>` (wired in cli.ts).
12
+ */
13
+ import { loadServeConfig, getProfile } from "./config.js";
14
+ import { planServeDev } from "./dev.js";
15
+ import { planServeMock } from "./mock.js";
16
+ import { detectMockRunnable } from "./detect.js";
17
+ import { planServeStaging } from "./staging.js";
18
+ import { runCommands } from "./runner.js";
19
+ export function parseServeArgs(argv) {
20
+ const args = { repoRoot: process.cwd() };
21
+ // First two positionals (if present + not flags) are profile + verb.
22
+ let positionalIdx = 0;
23
+ for (let i = 0; i < argv.length; i++) {
24
+ const a = argv[i];
25
+ if (!a)
26
+ continue;
27
+ if (a.startsWith("-")) {
28
+ const next = argv[i + 1];
29
+ if (a === "--branch" && next) {
30
+ args.branch = next;
31
+ i++;
32
+ }
33
+ else if (a === "--story" && next) {
34
+ args.story = next;
35
+ i++;
36
+ }
37
+ else if (a === "--service" && next) {
38
+ args.service = next;
39
+ i++;
40
+ }
41
+ else if (a === "--scenario" && next) {
42
+ args.scenario = next;
43
+ i++;
44
+ }
45
+ else if (a === "--cwd" && next) {
46
+ args.repoRoot = next;
47
+ i++;
48
+ }
49
+ else if (a === "--follow" || a === "-f") {
50
+ args.follow = true;
51
+ }
52
+ else if (a === "--prune") {
53
+ args.prune = true;
54
+ }
55
+ else if (a === "--dry-run") {
56
+ args.dryRun = true;
57
+ }
58
+ else if (a === "--help" || a === "-h") {
59
+ args.verb = "--help";
60
+ }
61
+ continue;
62
+ }
63
+ if (positionalIdx === 0) {
64
+ args.profile = a;
65
+ positionalIdx++;
66
+ }
67
+ else if (positionalIdx === 1) {
68
+ args.verb = a;
69
+ positionalIdx++;
70
+ }
71
+ }
72
+ return args;
73
+ }
74
+ export function printHelp() {
75
+ console.log(`
76
+ slowcook serve — multi-mode dev / mock / staging on a shared box
77
+
78
+ Usage:
79
+ slowcook serve <profile> <verb> [options]
80
+
81
+ Profiles:
82
+ dev Bind-mount source for fast UI iteration.
83
+ mock Vite-dev mock app for vibe-feedback loops (auto-skip if mock/ lacks scripts.dev).
84
+ staging Built-image staging + named-scenario seed reset for PM walkthroughs.
85
+
86
+ Verbs:
87
+ up Bring up the profile (compose overlay or consumer's bringup_cmd).
88
+ sync [--branch X] Force-push branch X (or current HEAD) to the profile's source_branch.
89
+ down [--prune] Stop the profile's services. --prune also drops volumes.
90
+ logs [--service] [--follow] Tail logs (optionally one service).
91
+ reset [--scenario <name>] Re-run a staging scenario's seed scripts (no-op for dev/mock).
92
+
93
+ Backward-compat:
94
+ slowcook dev-env push ≡ slowcook serve dev sync
95
+ slowcook dev-env up ≡ slowcook serve dev up
96
+ slowcook dev-env reset ≡ slowcook serve dev reset
97
+
98
+ Config:
99
+ .brewing/serve.yaml (new, optional) OR .brewing/dev-env.yaml (legacy).
100
+ See \`docs/plans/0.20-design-discussions.md\` design #5 for the schema.
101
+
102
+ Examples:
103
+ slowcook serve dev up
104
+ slowcook serve dev sync --story 042
105
+ slowcook serve dev logs --service patient --follow
106
+ slowcook serve dev down --prune
107
+ `);
108
+ }
109
+ export async function serve(argv) {
110
+ const args = parseServeArgs(argv);
111
+ if (args.verb === "--help" || (!args.profile && !args.verb)) {
112
+ printHelp();
113
+ return;
114
+ }
115
+ if (!args.profile) {
116
+ console.error("slowcook serve: missing <profile>. Try `slowcook serve --help`.");
117
+ process.exit(64);
118
+ }
119
+ if (!args.verb) {
120
+ console.error(`slowcook serve ${args.profile}: missing <verb>. Try \`slowcook serve --help\`.`);
121
+ process.exit(64);
122
+ }
123
+ let config;
124
+ try {
125
+ config = loadServeConfig(args.repoRoot);
126
+ }
127
+ catch (e) {
128
+ console.error(`slowcook serve: ${e.message}`);
129
+ process.exit(64);
130
+ }
131
+ const profile = getProfile(config, args.profile);
132
+ if (!profile) {
133
+ const available = Object.keys(config.profiles).join(", ") || "(none)";
134
+ console.error(`slowcook serve: profile "${args.profile}" not found in config. Available: ${available}.`);
135
+ process.exit(64);
136
+ }
137
+ let planResult;
138
+ switch (args.profile) {
139
+ case "dev":
140
+ planResult = runDevVerb(args, config, profile);
141
+ break;
142
+ case "mock": {
143
+ // Trade-off #4: auto-skip if mock/ isn't vite-runnable.
144
+ const detect = detectMockRunnable(args.repoRoot);
145
+ if (!detect.hasDevScript) {
146
+ console.log(`[serve mock] skipped — ${detect.reason}`);
147
+ return;
148
+ }
149
+ planResult = runMockVerb(args, config, profile);
150
+ break;
151
+ }
152
+ case "staging":
153
+ planResult = runStagingVerb(args, config, profile);
154
+ break;
155
+ default:
156
+ console.error(`slowcook serve: profile "${args.profile}" has no runtime in this release.`);
157
+ process.exit(64);
158
+ }
159
+ for (const line of planResult.output)
160
+ console.log(line);
161
+ if (planResult.exitCode !== 0)
162
+ process.exit(planResult.exitCode);
163
+ // sc#173 #1: actually execute the plan. Wraps `remote: true` commands
164
+ // in `ssh user@host 'cd <checkout_dir> && <cmd>'` when ssh_target is
165
+ // set; runs locally otherwise. --dry-run prints the wrapped form
166
+ // without executing.
167
+ if (planResult.commands && planResult.commands.length > 0) {
168
+ const runResult = runCommands({
169
+ commands: planResult.commands,
170
+ profile,
171
+ repoRoot: args.repoRoot,
172
+ dryRun: args.dryRun,
173
+ });
174
+ for (const line of runResult.output)
175
+ console.log(line);
176
+ if (runResult.exitCode !== 0)
177
+ process.exit(runResult.exitCode);
178
+ }
179
+ }
180
+ function runDevVerb(args, config, profile) {
181
+ if (!profile)
182
+ throw new Error("unreachable");
183
+ const devArgs = {
184
+ verb: args.verb,
185
+ branch: args.branch,
186
+ story: args.story,
187
+ service: args.service,
188
+ follow: args.follow,
189
+ prune: args.prune,
190
+ repoRoot: args.repoRoot,
191
+ dryRun: args.dryRun,
192
+ };
193
+ return planServeDev(devArgs, config, profile);
194
+ }
195
+ function runMockVerb(args, config, profile) {
196
+ if (!profile)
197
+ throw new Error("unreachable");
198
+ const mockArgs = {
199
+ verb: args.verb,
200
+ branch: args.branch,
201
+ service: args.service,
202
+ follow: args.follow,
203
+ prune: args.prune,
204
+ repoRoot: args.repoRoot,
205
+ dryRun: args.dryRun,
206
+ };
207
+ return planServeMock(mockArgs, config, profile);
208
+ }
209
+ function runStagingVerb(args, config, profile) {
210
+ if (!profile)
211
+ throw new Error("unreachable");
212
+ const stagingArgs = {
213
+ verb: args.verb,
214
+ branch: args.branch,
215
+ scenario: args.scenario,
216
+ service: args.service,
217
+ follow: args.follow,
218
+ prune: args.prune,
219
+ repoRoot: args.repoRoot,
220
+ dryRun: args.dryRun,
221
+ };
222
+ return planServeStaging(stagingArgs, config, profile);
223
+ }
224
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/serve/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * `slowcook serve mock <verb>` — Phase 2 implementation.
3
+ *
4
+ * The mock profile runs the consumer's `mock/` package as a vite-dev
5
+ * server on a shared box. See `dev.ts` header for the broader pattern.
6
+ *
7
+ * 0.19.7 (sc#173): same refactor as dev.ts — emit ShellCommand[] so
8
+ * runCommands() can actually execute (including ssh-wrapping for the
9
+ * remote case); support `compose_files` multi-`-f`; suppress `--build`
10
+ * for `bind-mount-source`.
11
+ */
12
+ import type { ProfileConfig, ServeConfig } from "./config.js";
13
+ import type { DevVerbResult } from "./dev.js";
14
+ export interface MockVerbArgs {
15
+ verb: string;
16
+ branch?: string;
17
+ service?: string;
18
+ follow?: boolean;
19
+ prune?: boolean;
20
+ repoRoot: string;
21
+ dryRun?: boolean;
22
+ }
23
+ export declare function planServeMock(args: MockVerbArgs, _config: ServeConfig, profile: ProfileConfig): DevVerbResult;
24
+ //# sourceMappingURL=mock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock.d.ts","sourceRoot":"","sources":["../../../src/commands/serve/mock.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAG9C,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,wBAAgB,aAAa,CAC3B,IAAI,EAAE,YAAY,EAClB,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE,aAAa,GACrB,aAAa,CAkBf"}
@@ -0,0 +1,111 @@
1
+ /**
2
+ * `slowcook serve mock <verb>` — Phase 2 implementation.
3
+ *
4
+ * The mock profile runs the consumer's `mock/` package as a vite-dev
5
+ * server on a shared box. See `dev.ts` header for the broader pattern.
6
+ *
7
+ * 0.19.7 (sc#173): same refactor as dev.ts — emit ShellCommand[] so
8
+ * runCommands() can actually execute (including ssh-wrapping for the
9
+ * remote case); support `compose_files` multi-`-f`; suppress `--build`
10
+ * for `bind-mount-source`.
11
+ */
12
+ import { execSync } from "node:child_process";
13
+ import { composeFiles, shouldBuildOnUp } from "./config.js";
14
+ export function planServeMock(args, _config, profile) {
15
+ switch (args.verb) {
16
+ case "up":
17
+ return planUp(args, profile);
18
+ case "sync":
19
+ return planSync(args, profile);
20
+ case "down":
21
+ return planDown(args, profile);
22
+ case "logs":
23
+ return planLogs(args, profile);
24
+ case "reset":
25
+ return {
26
+ exitCode: 0,
27
+ output: ["[serve mock reset] mock profile has no scenario seed; nothing to reset (only meaningful for staging)."],
28
+ };
29
+ default:
30
+ return { exitCode: 64, output: [`Unknown verb: ${args.verb}. See \`slowcook serve --help\`.`] };
31
+ }
32
+ }
33
+ function planUp(_args, profile) {
34
+ const files = composeFiles(profile);
35
+ const apps = Object.keys(profile.apps);
36
+ const output = [`[serve mock up] bringing up: ${apps.join(", ") || "(no apps configured)"}`];
37
+ if (files.length === 0) {
38
+ // Fallback: no compose, run `pnpm --filter ./mock dev` locally. Used on
39
+ // a dev's laptop without a docker box.
40
+ output.push(" (no compose_files / compose_overlay set; falling back to local pnpm filter)");
41
+ return {
42
+ exitCode: 0,
43
+ output,
44
+ commands: [{ cmd: "pnpm --filter ./mock dev", remote: false, label: "vite dev" }],
45
+ };
46
+ }
47
+ // PM + designer reference URL: surface the vite port if exactly one app.
48
+ if (apps.length === 1) {
49
+ const vitePort = profile.apps[apps[0]].port;
50
+ output.push(` vite dev URL (once up): http://<your-box>:${vitePort}`);
51
+ }
52
+ const fileFlags = files.map((f) => `-f ${f}`).join(" ");
53
+ const buildFlag = shouldBuildOnUp(profile) ? " --build" : "";
54
+ return {
55
+ exitCode: 0,
56
+ output,
57
+ commands: [{ cmd: `docker compose ${fileFlags} up -d${buildFlag}`, remote: true, label: "bring up" }],
58
+ };
59
+ }
60
+ function planSync(args, profile) {
61
+ const sourceBranch = profile.source_branch;
62
+ let localBranch = args.branch;
63
+ if (!localBranch && !args.dryRun) {
64
+ try {
65
+ localBranch = execSync("git rev-parse --abbrev-ref HEAD", {
66
+ cwd: args.repoRoot,
67
+ encoding: "utf8",
68
+ }).trim();
69
+ }
70
+ catch {
71
+ // handled below
72
+ }
73
+ }
74
+ else if (!localBranch && args.dryRun) {
75
+ localBranch = "<current-branch>";
76
+ }
77
+ if (!localBranch || localBranch === "HEAD") {
78
+ return {
79
+ exitCode: 64,
80
+ output: ["[serve mock sync] couldn't resolve a local branch (detached HEAD?). Pass --branch <name>."],
81
+ };
82
+ }
83
+ return {
84
+ exitCode: 0,
85
+ output: [`[serve mock sync] ${localBranch} → origin/${sourceBranch}`],
86
+ commands: [{ cmd: `git push --force origin ${localBranch}:${sourceBranch}`, remote: false, label: "git push" }],
87
+ };
88
+ }
89
+ function planDown(args, profile) {
90
+ const files = composeFiles(profile);
91
+ if (files.length === 0) {
92
+ return { exitCode: 64, output: ["[serve mock down] no compose_files / compose_overlay set; nothing to stop."] };
93
+ }
94
+ const fileFlags = files.map((f) => `-f ${f}`).join(" ");
95
+ const cmd = args.prune
96
+ ? `docker compose ${fileFlags} down -v`
97
+ : `docker compose ${fileFlags} down`;
98
+ return { exitCode: 0, output: ["[serve mock down]"], commands: [{ cmd, remote: true, label: "compose down" }] };
99
+ }
100
+ function planLogs(args, profile) {
101
+ const files = composeFiles(profile);
102
+ if (files.length === 0) {
103
+ return { exitCode: 64, output: ["[serve mock logs] no compose_files / compose_overlay set; nothing to tail."] };
104
+ }
105
+ const fileFlags = files.map((f) => `-f ${f}`).join(" ");
106
+ const follow = args.follow ? "-f" : "";
107
+ const service = args.service ?? "";
108
+ const cmd = `docker compose ${fileFlags} logs ${follow} ${service}`.replace(/\s+/g, " ").trim();
109
+ return { exitCode: 0, output: ["[serve mock logs]"], commands: [{ cmd, remote: true, label: "compose logs" }] };
110
+ }
111
+ //# sourceMappingURL=mock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock.js","sourceRoot":"","sources":["../../../src/commands/serve/mock.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Shell-command execution layer for `slowcook serve`.
3
+ *
4
+ * Closes sc#173 finding #1: prior to this, planners emitted command
5
+ * strings into `output[]` and exited without executing them, even when
6
+ * `profile.ssh_target` was set. Operators had to copy-paste the emitted
7
+ * command and run it themselves — the verb was documentation, not
8
+ * automation.
9
+ *
10
+ * Now planners populate `result.commands[]` with structured ShellCommand
11
+ * records; `runCommands()` wraps `remote: true` commands in
12
+ * `ssh user@host 'cd checkout_dir && <cmd>'` and executes (unless
13
+ * --dry-run, in which case the wrapped form is just printed).
14
+ *
15
+ * Local commands run via execSync in the repoRoot. Remote commands run
16
+ * via execSync of an ssh invocation. Either way: stdio inherited so the
17
+ * operator sees docker / git output in real time.
18
+ */
19
+ import type { ProfileConfig } from "./config.js";
20
+ export interface ShellCommand {
21
+ /** The local-shell-shape command (e.g. `docker compose -f a.yml up -d`). */
22
+ cmd: string;
23
+ /**
24
+ * When true AND `profile.ssh_target` is set, wrap the command in
25
+ * `ssh <user>@<host> 'cd <checkout_dir> && <cmd>'`. When `ssh_target`
26
+ * is absent, runs locally regardless. Use for docker / box-side
27
+ * operations (up, down, logs). Local-only operations like `git push`
28
+ * should pass `remote: false`.
29
+ */
30
+ remote?: boolean;
31
+ /** Optional label printed before the command (e.g. "bring up", "seed"). */
32
+ label?: string;
33
+ }
34
+ export interface RunCommandsArgs {
35
+ commands: ShellCommand[];
36
+ profile: ProfileConfig;
37
+ repoRoot: string;
38
+ /** When true: print the resolved command but don't execute. */
39
+ dryRun?: boolean;
40
+ }
41
+ export interface RunCommandsResult {
42
+ exitCode: number;
43
+ /** Additional human-readable lines emitted by the runner (resolved cmds, errors). */
44
+ output: string[];
45
+ }
46
+ /**
47
+ * Resolve a single ShellCommand into the wire-form string we'd actually
48
+ * pass to /bin/sh. Pure; useful for tests + the dry-run print path.
49
+ */
50
+ export declare function resolveCommand(cmd: ShellCommand, profile: ProfileConfig): string;
51
+ export declare function runCommands(args: RunCommandsArgs): RunCommandsResult;
52
+ //# sourceMappingURL=runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../../src/commands/serve/runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,MAAM,WAAW,YAAY;IAC3B,4EAA4E;IAC5E,GAAG,EAAE,MAAM,CAAC;IACZ;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,2EAA2E;IAC3E,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,OAAO,EAAE,aAAa,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,+DAA+D;IAC/D,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,qFAAqF;IACrF,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,YAAY,EAAE,OAAO,EAAE,aAAa,GAAG,MAAM,CAShF;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,eAAe,GAAG,iBAAiB,CAepE"}