rampway 0.4.0 → 0.5.1

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 (67) hide show
  1. package/README.md +78 -9
  2. package/build/src/cli.d.ts.map +1 -1
  3. package/build/src/cli.js +5 -1
  4. package/build/src/cli.js.map +1 -1
  5. package/build/src/commands/deploy.d.ts.map +1 -1
  6. package/build/src/commands/deploy.js +61 -1
  7. package/build/src/commands/deploy.js.map +1 -1
  8. package/build/src/commands/rollback.d.ts +1 -1
  9. package/build/src/commands/rollback.d.ts.map +1 -1
  10. package/build/src/commands/rollback.js +6 -4
  11. package/build/src/commands/rollback.js.map +1 -1
  12. package/build/src/commands/rollbridge.d.ts +8 -0
  13. package/build/src/commands/rollbridge.d.ts.map +1 -1
  14. package/build/src/commands/rollbridge.js +67 -18
  15. package/build/src/commands/rollbridge.js.map +1 -1
  16. package/build/src/config/validate-config.d.ts.map +1 -1
  17. package/build/src/config/validate-config.js +134 -0
  18. package/build/src/config/validate-config.js.map +1 -1
  19. package/build/src/core/deploy-runner.d.ts +4 -2
  20. package/build/src/core/deploy-runner.d.ts.map +1 -1
  21. package/build/src/core/deploy-runner.js +292 -18
  22. package/build/src/core/deploy-runner.js.map +1 -1
  23. package/build/src/core/paths.d.ts.map +1 -1
  24. package/build/src/core/paths.js +1 -0
  25. package/build/src/core/paths.js.map +1 -1
  26. package/build/src/core/release-manager.d.ts +23 -0
  27. package/build/src/core/release-manager.d.ts.map +1 -1
  28. package/build/src/core/release-manager.js +95 -7
  29. package/build/src/core/release-manager.js.map +1 -1
  30. package/build/src/core/runtime-state.d.ts +17 -0
  31. package/build/src/core/runtime-state.d.ts.map +1 -0
  32. package/build/src/core/runtime-state.js +76 -0
  33. package/build/src/core/runtime-state.js.map +1 -0
  34. package/build/src/runtimes/compose-runtime.d.ts +49 -0
  35. package/build/src/runtimes/compose-runtime.d.ts.map +1 -0
  36. package/build/src/runtimes/compose-runtime.js +106 -0
  37. package/build/src/runtimes/compose-runtime.js.map +1 -0
  38. package/build/src/runtimes/index.d.ts.map +1 -1
  39. package/build/src/runtimes/index.js +2 -1
  40. package/build/src/runtimes/index.js.map +1 -1
  41. package/build/src/runtimes/none-runtime.d.ts +2 -0
  42. package/build/src/runtimes/none-runtime.d.ts.map +1 -1
  43. package/build/src/runtimes/none-runtime.js +4 -0
  44. package/build/src/runtimes/none-runtime.js.map +1 -1
  45. package/build/src/runtimes/rollbridge-runtime.d.ts +128 -26
  46. package/build/src/runtimes/rollbridge-runtime.d.ts.map +1 -1
  47. package/build/src/runtimes/rollbridge-runtime.js +366 -61
  48. package/build/src/runtimes/rollbridge-runtime.js.map +1 -1
  49. package/build/src/transports/local-transport.d.ts +10 -0
  50. package/build/src/transports/local-transport.d.ts.map +1 -1
  51. package/build/src/transports/local-transport.js +21 -0
  52. package/build/src/transports/local-transport.js.map +1 -1
  53. package/build/src/transports/ssh-transport.d.ts +20 -0
  54. package/build/src/transports/ssh-transport.d.ts.map +1 -1
  55. package/build/src/transports/ssh-transport.js +37 -0
  56. package/build/src/transports/ssh-transport.js.map +1 -1
  57. package/build/src/types.d.ts +117 -0
  58. package/build/src/types.d.ts.map +1 -1
  59. package/build/src/velocious/client.d.ts +146 -0
  60. package/build/src/velocious/client.d.ts.map +1 -0
  61. package/build/src/velocious/client.js +292 -0
  62. package/build/src/velocious/client.js.map +1 -0
  63. package/docs/config-reference.md +143 -5
  64. package/docs/migration-from-capistrano.md +24 -1
  65. package/docs/velocious-deployment-api.md +31 -0
  66. package/examples/monorepo/rampway.config.mjs +1 -2
  67. package/package.json +1 -1
package/README.md CHANGED
@@ -55,6 +55,9 @@ rampway production plan
55
55
  rampway production plan --json
56
56
  rampway production deploy
57
57
  rampway production deploy <revision>
58
+ rampway production deploy --transport=auto
59
+ rampway production deploy --transport=http
60
+ rampway production deploy --transport=ssh
58
61
  rampway production status
59
62
  rampway production releases
60
63
  rampway production releases --json
@@ -66,13 +69,32 @@ rampway production rollback
66
69
  rampway production doctor
67
70
  rampway production doctor --json
68
71
 
69
- # Rollbridge runtime helpers for the current release
70
- rampway production rollbridge-validate
71
- rampway production rollbridge-status
72
- rampway production rollbridge-logs
73
- rampway production rollbridge-recover --yes
72
+ # Runtime maintenance for the current release
73
+ rampway production runtime-validate
74
+ rampway production runtime-status
75
+ rampway production runtime-logs
76
+ rampway production runtime-recover --yes
74
77
  ```
75
78
 
79
+ The older `rollbridge-validate`, `rollbridge-status`, `rollbridge-logs`, and
80
+ `rollbridge-recover` names remain aliases for Rollbridge stages.
81
+
82
+ ### Deploy transports
83
+
84
+ Deploys run over one of three transports selected with `--transport`:
85
+
86
+ - `http` — run the deploy through the authenticated Velocious control plane
87
+ (requires `stage.http`). Fails if the stage has no control-plane config.
88
+ - `ssh` — run directly over the stage's SSH (or local) transport, bypassing the
89
+ control plane.
90
+ - `auto` (default) — use the control plane when the stage configures
91
+ `stage.http`, and fall back to the direct transport only when the control
92
+ plane is unreachable or the project/stage is not deployed there. Never falls
93
+ back on authentication or validation errors, or once a run has been admitted.
94
+
95
+ Dry runs always use the direct transport and print a plan, regardless of
96
+ `--transport`.
97
+
76
98
  ### Live deploy output and automation
77
99
 
78
100
  A normal deploy reports real lifecycle steps and remote command output as it arrives, then ends with a concise result:
@@ -157,7 +179,6 @@ export default {
157
179
  command: "npx rollbridge",
158
180
  packageDir: "backend",
159
181
  config: "config/rollbridge.production.mjs",
160
- healthPath: "/health",
161
182
  daemonLogPath: "/home/dev/routergeist/shared/log/rollbridge.log",
162
183
  daemonPidPath: "/home/dev/routergeist/shared/tmp/pids/rollbridge.pid",
163
184
  socketPath: "/tmp/rollbridge-routergeist.sock",
@@ -168,6 +189,23 @@ export default {
168
189
  }
169
190
  ```
170
191
 
192
+ For Rollbridge, an explicit `runtime.config` is resolved relative to
193
+ `runtime.packageDir`, fingerprinted with the Rollbridge package version,
194
+ runtime options, and environment values, then copied into immutable
195
+ Rampway-owned material under `shared/rampway/runtime/`. After runtime and health
196
+ succeed, Rampway atomically records only the known-good digest and secret-free
197
+ activation locators in `shared/rampway/state.json`, indexed by release. Secret
198
+ environment values participate in change detection but are never stored or
199
+ logged. Keep the Rollbridge config self-contained; imported sibling files are
200
+ not copied.
201
+
202
+ That stable state lets rollback and runtime maintenance target a retained release
203
+ whose checkout has no Rampway helper or Rollbridge config. `packageDir` remains
204
+ relative to the selected application release, while the stored config comes from
205
+ trusted known-good material. A missing, malformed, mismatched, or config-less
206
+ Rollbridge state fails rollback before runtime or `current` changes. The first
207
+ successful Rampway deploy with an explicit config seeds this state.
208
+
171
209
  `npmInstall`, `pnpmInstall`, `yarnInstall`, `bunInstall`, and `nodePackageInstall` return normal task entries with the right install command for common Node package managers. They accept `cwd`, `env`, `optional`, `production`, and lockfile options such as `clean: false` for `npm install` instead of `npm ci`, or `frozenLockfile: false` for package managers that need explicit CI lockfile opt-outs (`--no-frozen-lockfile` for pnpm and `--no-immutable` for Yarn). Yarn production installs are intentionally not guessed; use a custom task command when that project needs a specific Yarn workspace/plugin flow.
172
210
 
173
211
  `checkExpoWebArtifacts` returns a task entry that fails if the Expo web build directory does not contain an `index.html`. It accepts `dir` (default `"dist"`), `cwd`, and `optional`.
@@ -183,7 +221,20 @@ Task entries can be strings or objects.
183
221
  - `env` — optional environment variables passed to the command.
184
222
  - `optional` — when `true`, the deploy records the task failure and continues.
185
223
 
186
- Task groups run in config order. Required task failures stop the deploy before publish. Deploy failures include whether `current` changed and recovery hints for the affected stage, such as rerunning a before-publish failure, inspecting a newly created failed release directory, or inspecting `rampway status`, `rampway releases`, and `rampway rollback` after a failure that happened after publish. Existing release-id collisions do not suggest deleting the release directory.
224
+ Task groups run in config order. Required task failures stop the deploy before publish. If a candidate runtime handoff starts and then fails before publish, Rampway reactivates and health-checks the previous release using that release's known-good snapshot. Deploy failures include whether `current` changed and recovery hints for the affected stage, such as rerunning a before-publish failure, inspecting a newly created failed release directory, or inspecting `rampway status`, `rampway releases`, and `rampway rollback` after a failure that happened after publish. Existing release-id collisions do not suggest deleting the release directory.
225
+
226
+ Rollback runs under the same exclusive lock as deploy but never runs deploy task
227
+ groups, migrations, or candidate-local Rampway helpers. Rampway resolves one
228
+ retained release directory, activates it with the installed runtime adapter,
229
+ runs the configured health checks, and only then publishes `current`. If target
230
+ activation or health fails, Rampway reactivates and health-checks the prior
231
+ release before returning the original failure. Use `--to <exact-release-id>` for
232
+ a retained Capistrano release. Unsafe, nested, temporary, escaping, and
233
+ outside-symlink targets are rejected.
234
+
235
+ Release diagnostics include safe retained legacy directories. Cleanup ownership
236
+ does not: only releases carrying valid Rampway metadata for the configured
237
+ application and stage count toward `keepReleases` or can be removed by Rampway.
187
238
 
188
239
  Standalone operational tasks are configured separately under `operationalTasks` and run only when explicitly selected with `rampway <stage> task <exact-name>`. Rampway acquires the shared deploy lock, strictly resolves the active release, and runs every required entry against that immutable release path. `forwardEnv` names caller-supplied environment variables that must be present; their values are transported separately from ordinary `env` and redacted from output and errors. Operational tasks do not run during deploy, accept no command arguments or `--force`, and are not included in the plural `tasks` deploy-task inventory.
189
240
 
@@ -212,7 +263,10 @@ Every successful deploy or rollback appends one JSON object per line to `shared/
212
263
  - sanitized runtime status
213
264
  - `cleanupRemoved` release IDs
214
265
 
215
- Rollback events include `event: "rollback"`, the target `releaseId`, `rolledBackAt`, and `previousRelease`. Reports intentionally record runtime result summaries, not runtime configuration secrets.
266
+ Rollback events include `event: "rollback"`, target `releaseId` and `revision`,
267
+ `rolledBackAt`, `durationMs`, `previousRelease`, `healthChecks: "passed"`, and a
268
+ sanitized runtime result. Reports intentionally record runtime result summaries,
269
+ not runtime configuration or secrets.
216
270
 
217
271
  ## Releasing
218
272
 
@@ -230,7 +284,12 @@ Publishing requires an npm access token stored as the repository secret `NPM_TOK
230
284
 
231
285
  ## Runtime adapters
232
286
 
233
- Rampway resolves runtimes through a small adapter registry. Built-in adapters are `none` and `rollbridge`; future adapters can register a runtime type without changing the deploy lifecycle core. Runtime adapters implement `plan()` and `deploy(...)`; optional maintenance methods such as `status`, `logs`, and `recover` can be exposed by adapter-specific commands.
287
+ Rampway resolves runtimes through a small adapter registry. Built-in adapters are
288
+ `compose`, `none`, and `rollbridge`; future adapters can register a runtime type without
289
+ changing the deploy lifecycle core. Runtime adapters implement `plan()` and
290
+ `deploy(...)`. Optional `prepare(...)` and `commit(...)` methods participate in
291
+ secret-free known-good state, and optional `validate`, `status`, `logs`, and
292
+ `recover` methods are exposed by the generic runtime commands.
234
293
 
235
294
  Rollbridge runtime options:
236
295
 
@@ -243,6 +302,16 @@ Rollbridge runtime options:
243
302
 
244
303
  When `versionPath` is configured, Rampway reads the release's installed Rollbridge package version before deploy. If it differs from the recorded version and the current runtime is responsive, Rampway shuts down the current Rollbridge daemon, removes configured stale daemon artifacts, deploys the new release, and records the new version.
245
304
 
305
+ ### Compose runtime
306
+
307
+ Use `runtime: {type: "compose", composeRoot, handoffCommand, healthCommand}`
308
+ when an application is managed by a trusted, fixed Docker Compose deployment.
309
+ Rampway executes the static handoff command and then the static health command
310
+ from the absolute `composeRoot`. It records only a digest and the root in
311
+ known-good runtime state, never command text or secrets. See the
312
+ [config reference](docs/config-reference.md#compose) for the strict field
313
+ contract and rollback behavior.
314
+
246
315
  ## Safety model
247
316
 
248
317
  Rampway prepares a complete release before flipping `current`. If a deploy fails before publish, `current` remains unchanged. Rollbridge runtime deploys are validated and health-checked with `rollbridge status` before `current` is updated. Cleanup never removes the current release. Rollback changes `current` to a previously prepared release and records a deployment event.
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli.js"],"names":[],"mappings":";AA8CA;;;GAGG;AACH,2BAHW,MAAM,EAAE,GACN,OAAO,CAAC,IAAI,CAAC,CAUzB;AAED;;;;;;;GAOG;AACH,wCAHW,MAAM,EAAE,GACN;IAAC,OAAO,EAAE,MAAM,GAAC,SAAS,CAAC;IAAC,SAAS,EAAE,MAAM,GAAC,SAAS,CAAC;IAAC,OAAO,EAAE,OAAO,QAAQ,EAAE,cAAc,CAAA;CAAC,CA2B9G"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli.js"],"names":[],"mappings":";AAkDA;;;GAGG;AACH,2BAHW,MAAM,EAAE,GACN,OAAO,CAAC,IAAI,CAAC,CAUzB;AAED;;;;;;;GAOG;AACH,wCAHW,MAAM,EAAE,GACN;IAAC,OAAO,EAAE,MAAM,GAAC,SAAS,CAAC;IAAC,SAAS,EAAE,MAAM,GAAC,SAAS,CAAC;IAAC,OAAO,EAAE,OAAO,QAAQ,EAAE,cAAc,CAAA;CAAC,CA2B9G"}
package/build/src/cli.js CHANGED
@@ -7,7 +7,7 @@ import { doctorCommand } from "./commands/doctor.js";
7
7
  import { deployCommand } from "./commands/deploy.js";
8
8
  import { releasesCommand, statusCommand } from "./commands/releases.js";
9
9
  import { rollbackCommand } from "./commands/rollback.js";
10
- import { rollbridgeValidateCommand, rollbridgeStatusCommand, rollbridgeLogsCommand, rollbridgeRecoverCommand } from "./commands/rollbridge.js";
10
+ import { rollbridgeValidateCommand, rollbridgeStatusCommand, rollbridgeLogsCommand, rollbridgeRecoverCommand, runtimeValidateCommand, runtimeStatusCommand, runtimeLogsCommand, runtimeRecoverCommand } from "./commands/rollbridge.js";
11
11
  import { tasksCommand } from "./commands/tasks.js";
12
12
  import { taskCommand } from "./commands/task.js";
13
13
  import { initCommand } from "./commands/init.js";
@@ -27,6 +27,10 @@ const COMMANDS = {
27
27
  "rollbridge-status": rollbridgeStatusCommand,
28
28
  "rollbridge-logs": rollbridgeLogsCommand,
29
29
  "rollbridge-recover": rollbridgeRecoverCommand,
30
+ "runtime-validate": runtimeValidateCommand,
31
+ "runtime-status": runtimeStatusCommand,
32
+ "runtime-logs": runtimeLogsCommand,
33
+ "runtime-recover": runtimeRecoverCommand,
30
34
  doctor: doctorCommand
31
35
  };
32
36
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.js"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.js"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../../src/commands/deploy.js"],"names":[],"mappings":"AAMA;;;GAGG;AACH,sEAHW,OAAO,QAAQ,EAAE,WAAW,GAC1B,OAAO,CAAC,IAAI,CAAC,CAgCzB"}
1
+ {"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../../src/commands/deploy.js"],"names":[],"mappings":"AASA;;;GAGG;AACH,sEAHW,OAAO,QAAQ,EAAE,WAAW,GAC1B,OAAO,CAAC,IAAI,CAAC,CAoEzB"}
@@ -3,13 +3,19 @@ import { commandContext as defaultCommandContext } from "./context.js";
3
3
  import { deploy } from "../core/deploy-runner.js";
4
4
  import { openDeployLog } from "../core/deploy-log.js";
5
5
  import { humanReporter, jsonReporter } from "../core/reporter.js";
6
+ import { deployViaControlPlane, isFallbackEligible } from "../velocious/client.js";
7
+ const TRANSPORT_CHOICES = new Set(["http", "ssh", "auto"]);
6
8
  /**
7
9
  * @param {import('#types').CommandArgs} args
8
10
  * @returns {Promise<void>}
9
11
  */
10
12
  export async function deployCommand({ stageName, options, commandContext = defaultCommandContext }) {
11
13
  const reporter = options.json ? jsonReporter() : humanReporter();
14
+ const transportChoice = resolveTransportChoice(options.transport);
12
15
  const { config, stage, transport } = await commandContext(options, stageName, { reporter });
16
+ if (transportChoice === "http" && !stage.http) {
17
+ throw new Error(`Stage '${stageName}' has no HTTP control-plane configuration; add stage.http or use --transport=ssh.`);
18
+ }
13
19
  const resolvedStage = options.branch && !options.revision ? { ...stage, revision: undefined } : stage;
14
20
  const sourcePath = options.source ?? process.cwd();
15
21
  // A dry run only prints a plan, so there is no deploy transcript worth keeping.
@@ -21,7 +27,43 @@ export async function deployCommand({ stageName, options, commandContext = defau
21
27
  reporter.line(`Logging deploy output to ${deployLog.path}`);
22
28
  }
23
29
  try {
24
- const report = await deploy({ transport, stage: resolvedStage, sourcePath, revision: options.revision, branch: options.branch ?? stage.branch, dryRun: options.dryRun, force: options.force, reporter });
30
+ const directDeploy = () => deploy({
31
+ transport,
32
+ stage: resolvedStage,
33
+ sourcePath,
34
+ revision: options.revision,
35
+ branch: options.branch ?? stage.branch,
36
+ dryRun: options.dryRun,
37
+ force: options.force,
38
+ reporter
39
+ });
40
+ const controlPlaneDeploy = () => deployViaControlPlane({
41
+ stage,
42
+ httpConfig: /** @type {import('#types').HttpTransportConfig} */ (stage.http),
43
+ revision: options.revision ?? stage.revision,
44
+ reporter
45
+ });
46
+ let report;
47
+ if (options.dryRun) {
48
+ report = await directDeploy();
49
+ }
50
+ else if (transportChoice === "http") {
51
+ report = await controlPlaneDeploy();
52
+ }
53
+ else if (transportChoice === "auto" && stage.http) {
54
+ try {
55
+ report = await controlPlaneDeploy();
56
+ }
57
+ catch (error) {
58
+ if (!isFallbackEligible(error))
59
+ throw error;
60
+ reporter.line(`HTTP control plane unavailable (${ /** @type {Error} */(error).message}); falling back to ${transportLabel(stage.transport)} transport`);
61
+ report = await directDeploy();
62
+ }
63
+ }
64
+ else {
65
+ report = await directDeploy();
66
+ }
25
67
  if (options.json || "plan" in report) {
26
68
  console.log(JSON.stringify(report, null, 2));
27
69
  return;
@@ -38,6 +80,24 @@ export async function deployCommand({ stageName, options, commandContext = defau
38
80
  await deployLog.close();
39
81
  }
40
82
  }
83
+ /**
84
+ * @param {string|undefined} configured
85
+ * @returns {"http"|"ssh"|"auto"}
86
+ */
87
+ function resolveTransportChoice(configured) {
88
+ const choice = configured ?? "auto";
89
+ if (!TRANSPORT_CHOICES.has(choice)) {
90
+ throw new Error(`Invalid --transport '${choice}'. Supported: ${Array.from(TRANSPORT_CHOICES).join(", ")}.`);
91
+ }
92
+ return /** @type {"http"|"ssh"|"auto"} */ (choice);
93
+ }
94
+ /**
95
+ * @param {import('#types').TransportConfig} transport
96
+ * @returns {string}
97
+ */
98
+ function transportLabel(transport) {
99
+ return transport.type === "ssh" ? "ssh" : "local";
100
+ }
41
101
  /**
42
102
  * Prints a concise Capistrano-style final summary of a successful deploy.
43
103
  *
@@ -1 +1 @@
1
- {"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../../src/commands/deploy.js"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../../src/commands/deploy.js"],"names":[],"mappings":"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"}
@@ -2,5 +2,5 @@
2
2
  * @param {import('#types').CommandArgs} args
3
3
  * @returns {Promise<void>}
4
4
  */
5
- export function rollbackCommand({ stageName, options }: import("#types").CommandArgs): Promise<void>;
5
+ export function rollbackCommand({ stageName, options, commandContext }: import("#types").CommandArgs): Promise<void>;
6
6
  //# sourceMappingURL=rollback.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"rollback.d.ts","sourceRoot":"","sources":["../../../src/commands/rollback.js"],"names":[],"mappings":"AAGA;;;GAGG;AACH,wDAHW,OAAO,QAAQ,EAAE,WAAW,GAC1B,OAAO,CAAC,IAAI,CAAC,CAMzB"}
1
+ {"version":3,"file":"rollback.d.ts","sourceRoot":"","sources":["../../../src/commands/rollback.js"],"names":[],"mappings":"AAIA;;;GAGG;AACH,wEAHW,OAAO,QAAQ,EAAE,WAAW,GAC1B,OAAO,CAAC,IAAI,CAAC,CAOzB"}
@@ -1,12 +1,14 @@
1
- import { commandContext } from "./context.js";
1
+ import { commandContext as defaultCommandContext } from "./context.js";
2
2
  import { rollback } from "../core/deploy-runner.js";
3
+ import { jsonReporter } from "../core/reporter.js";
3
4
  /**
4
5
  * @param {import('#types').CommandArgs} args
5
6
  * @returns {Promise<void>}
6
7
  */
7
- export async function rollbackCommand({ stageName, options }) {
8
- const { stage, transport } = await commandContext(options, stageName);
9
- const report = await rollback({ transport, stage, to: options.to });
8
+ export async function rollbackCommand({ stageName, options, commandContext = defaultCommandContext }) {
9
+ const reporter = jsonReporter();
10
+ const { stage, transport } = await commandContext(options, stageName, { reporter });
11
+ const report = await rollback({ transport, stage, to: options.to, reporter });
10
12
  console.log(JSON.stringify(report, null, 2));
11
13
  }
12
14
  //# sourceMappingURL=rollback.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"rollback.js","sourceRoot":"","sources":["../../../src/commands/rollback.js"],"names":[],"mappings":"AAAA,OAAO,EAAC,cAAc,EAAC,MAAM,cAAc,CAAA;AAC3C,OAAO,EAAC,QAAQ,EAAC,MAAM,0BAA0B,CAAA;AAEjD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,EAAC,SAAS,EAAE,OAAO,EAAC;IACxD,MAAM,EAAC,KAAK,EAAE,SAAS,EAAC,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,SAAS,CAAC,CAAA;IACnE,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,EAAC,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAC,CAAC,CAAA;IACjE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;AAC9C,CAAC"}
1
+ {"version":3,"file":"rollback.js","sourceRoot":"","sources":["../../../src/commands/rollback.js"],"names":[],"mappings":"AAAA,OAAO,EAAC,cAAc,IAAI,qBAAqB,EAAC,MAAM,cAAc,CAAA;AACpE,OAAO,EAAC,QAAQ,EAAC,MAAM,0BAA0B,CAAA;AACjD,OAAO,EAAC,YAAY,EAAC,MAAM,qBAAqB,CAAA;AAEhD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,EAAC,SAAS,EAAE,OAAO,EAAE,cAAc,GAAG,qBAAqB,EAAC;IAChG,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAA;IAC/B,MAAM,EAAC,KAAK,EAAE,SAAS,EAAC,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,SAAS,EAAE,EAAC,QAAQ,EAAC,CAAC,CAAA;IAC/E,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,EAAC,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,QAAQ,EAAC,CAAC,CAAA;IAC3E,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;AAC9C,CAAC"}
@@ -18,4 +18,12 @@ export function rollbridgeLogsCommand({ stageName, options, commandContext }: im
18
18
  * @returns {Promise<void>}
19
19
  */
20
20
  export function rollbridgeRecoverCommand({ stageName, options, commandContext }: import("#types").CommandArgs): Promise<void>;
21
+ /** @param {import('#types').CommandArgs} args @returns {Promise<void>} */
22
+ export function runtimeValidateCommand({ stageName, options, commandContext }: import("#types").CommandArgs): Promise<void>;
23
+ /** @param {import('#types').CommandArgs} args @returns {Promise<void>} */
24
+ export function runtimeStatusCommand({ stageName, options, commandContext }: import("#types").CommandArgs): Promise<void>;
25
+ /** @param {import('#types').CommandArgs} args @returns {Promise<void>} */
26
+ export function runtimeLogsCommand({ stageName, options, commandContext }: import("#types").CommandArgs): Promise<void>;
27
+ /** @param {import('#types').CommandArgs} args @returns {Promise<void>} */
28
+ export function runtimeRecoverCommand({ stageName, options, commandContext }: import("#types").CommandArgs): Promise<void>;
21
29
  //# sourceMappingURL=rollbridge.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"rollbridge.d.ts","sourceRoot":"","sources":["../../../src/commands/rollbridge.js"],"names":[],"mappings":"AAKA;;;GAGG;AACH,kFAHW,OAAO,QAAQ,EAAE,WAAW,GAC1B,OAAO,CAAC,IAAI,CAAC,CAIzB;AAED;;;GAGG;AACH,gFAHW,OAAO,QAAQ,EAAE,WAAW,GAC1B,OAAO,CAAC,IAAI,CAAC,CAIzB;AAED;;;GAGG;AACH,8EAHW,OAAO,QAAQ,EAAE,WAAW,GAC1B,OAAO,CAAC,IAAI,CAAC,CAIzB;AAED;;;GAGG;AACH,iFAHW,OAAO,QAAQ,EAAE,WAAW,GAC1B,OAAO,CAAC,IAAI,CAAC,CAKzB"}
1
+ {"version":3,"file":"rollbridge.d.ts","sourceRoot":"","sources":["../../../src/commands/rollbridge.js"],"names":[],"mappings":"AAQA;;;GAGG;AACH,kFAHW,OAAO,QAAQ,EAAE,WAAW,GAC1B,OAAO,CAAC,IAAI,CAAC,CAIzB;AAED;;;GAGG;AACH,gFAHW,OAAO,QAAQ,EAAE,WAAW,GAC1B,OAAO,CAAC,IAAI,CAAC,CAIzB;AAED;;;GAGG;AACH,8EAHW,OAAO,QAAQ,EAAE,WAAW,GAC1B,OAAO,CAAC,IAAI,CAAC,CAIzB;AAED;;;GAGG;AACH,iFAHW,OAAO,QAAQ,EAAE,WAAW,GAC1B,OAAO,CAAC,IAAI,CAAC,CAKzB;AAED,0EAA0E;AAC1E,+EADY,OAAO,QAAQ,EAAE,WAAW,GAAiB,OAAO,CAAC,IAAI,CAAC,CAGrE;AAED,0EAA0E;AAC1E,6EADY,OAAO,QAAQ,EAAE,WAAW,GAAiB,OAAO,CAAC,IAAI,CAAC,CAGrE;AAED,0EAA0E;AAC1E,2EADY,OAAO,QAAQ,EAAE,WAAW,GAAiB,OAAO,CAAC,IAAI,CAAC,CAGrE;AAED,0EAA0E;AAC1E,8EADY,OAAO,QAAQ,EAAE,WAAW,GAAiB,OAAO,CAAC,IAAI,CAAC,CAIrE"}
@@ -1,27 +1,30 @@
1
1
  import path from "node:path";
2
2
  import { commandContext as defaultCommandContext } from "./context.js";
3
3
  import { runtimeFor } from "../runtimes/index.js";
4
+ import { requireCurrentRelease, resolveRetainedRelease } from "../core/release-manager.js";
5
+ import { readRuntimeState } from "../core/runtime-state.js";
6
+ import { acquireLock, releaseLock } from "../core/locks.js";
4
7
  import { deployPaths } from "../core/paths.js";
5
8
  /**
6
9
  * @param {import('#types').CommandArgs} args
7
10
  * @returns {Promise<void>}
8
11
  */
9
12
  export async function rollbridgeValidateCommand({ stageName, options, commandContext = defaultRuntimeCommandContext }) {
10
- await runRollbridgeCommand({ stageName, options, commandContext, method: "validate" });
13
+ await runRuntimeCommand({ stageName, options, commandContext, method: "validate", requiredType: "rollbridge" });
11
14
  }
12
15
  /**
13
16
  * @param {import('#types').CommandArgs} args
14
17
  * @returns {Promise<void>}
15
18
  */
16
19
  export async function rollbridgeStatusCommand({ stageName, options, commandContext = defaultRuntimeCommandContext }) {
17
- await runRollbridgeCommand({ stageName, options, commandContext, method: "status" });
20
+ await runRuntimeCommand({ stageName, options, commandContext, method: "status", requiredType: "rollbridge" });
18
21
  }
19
22
  /**
20
23
  * @param {import('#types').CommandArgs} args
21
24
  * @returns {Promise<void>}
22
25
  */
23
26
  export async function rollbridgeLogsCommand({ stageName, options, commandContext = defaultRuntimeCommandContext }) {
24
- await runRollbridgeCommand({ stageName, options, commandContext, method: "logs" });
27
+ await runRuntimeCommand({ stageName, options, commandContext, method: "logs", requiredType: "rollbridge" });
25
28
  }
26
29
  /**
27
30
  * @param {import('#types').CommandArgs} args
@@ -30,7 +33,25 @@ export async function rollbridgeLogsCommand({ stageName, options, commandContext
30
33
  export async function rollbridgeRecoverCommand({ stageName, options, commandContext = defaultRuntimeCommandContext }) {
31
34
  if (!options.yes && stageName === "production")
32
35
  throw new Error("Refusing production Rollbridge recover without --yes in non-interactive MVP mode.");
33
- await runRollbridgeCommand({ stageName, options, commandContext, method: "recover", runtimeOptions: { force: true } });
36
+ await runRuntimeCommand({ stageName, options, commandContext, method: "recover", runtimeOptions: { force: true }, requiredType: "rollbridge" });
37
+ }
38
+ /** @param {import('#types').CommandArgs} args @returns {Promise<void>} */
39
+ export async function runtimeValidateCommand({ stageName, options, commandContext = defaultRuntimeCommandContext }) {
40
+ await runRuntimeCommand({ stageName, options, commandContext, method: "validate" });
41
+ }
42
+ /** @param {import('#types').CommandArgs} args @returns {Promise<void>} */
43
+ export async function runtimeStatusCommand({ stageName, options, commandContext = defaultRuntimeCommandContext }) {
44
+ await runRuntimeCommand({ stageName, options, commandContext, method: "status" });
45
+ }
46
+ /** @param {import('#types').CommandArgs} args @returns {Promise<void>} */
47
+ export async function runtimeLogsCommand({ stageName, options, commandContext = defaultRuntimeCommandContext }) {
48
+ await runRuntimeCommand({ stageName, options, commandContext, method: "logs" });
49
+ }
50
+ /** @param {import('#types').CommandArgs} args @returns {Promise<void>} */
51
+ export async function runtimeRecoverCommand({ stageName, options, commandContext = defaultRuntimeCommandContext }) {
52
+ if (!options.yes && stageName === "production")
53
+ throw new Error("Refusing production runtime recover without --yes in non-interactive MVP mode.");
54
+ await runRuntimeCommand({ stageName, options, commandContext, method: "recover", runtimeOptions: { force: true } });
34
55
  }
35
56
  /**
36
57
  * @param {import('#types').CommandOptions} options
@@ -42,28 +63,56 @@ async function defaultRuntimeCommandContext(options, stageName) {
42
63
  return { ...context, runtime: runtimeFor(context.stage) };
43
64
  }
44
65
  /**
45
- * @param {{stageName: string, options: import('#types').CommandOptions, commandContext: Function, method: string, runtimeOptions?: object}} opts
66
+ * @param {{stageName: string, options: import('#types').CommandOptions, commandContext: Function, method: string, runtimeOptions?: object, requiredType?: string}} opts
46
67
  * @returns {Promise<void>}
47
68
  */
48
- async function runRollbridgeCommand({ stageName, options, commandContext, method, runtimeOptions = {} }) {
69
+ async function runRuntimeCommand({ stageName, options, commandContext, method, runtimeOptions = {}, requiredType }) {
49
70
  const { stage, transport, runtime } = await commandContext(options, stageName);
50
- if (stage.runtime.type !== "rollbridge")
71
+ if (requiredType && stage.runtime.type !== requiredType)
51
72
  throw new Error(`Stage '${stageName}' does not use the Rollbridge runtime.`);
52
- const releasePath = pathForRollbridgeCommand(stage, options);
53
- const result = await runtime[method](transport, { releasePath, ...runtimeOptions });
54
- if (result?.output)
55
- process.stdout.write(result.output);
73
+ if (typeof runtime[method] !== "function")
74
+ throw new Error(`Runtime '${stage.runtime.type}' does not support ${method}.`);
75
+ const lock = await acquireLock(transport, stage);
76
+ try {
77
+ const target = await runtimeCommandTarget(transport, stage, options);
78
+ const state = await readRuntimeState(transport, stage);
79
+ const active = state?.active;
80
+ const snapshot = target.releaseId && active?.releaseId === target.releaseId && active.runtime.type === stage.runtime.type ? active.runtime : undefined;
81
+ if (snapshot && runtime.verifySnapshot)
82
+ await runtime.verifySnapshot(transport, { snapshot, runtimePath: deployPaths(stage).runtimePath });
83
+ const result = await runtime[method](transport, { releasePath: target.releasePath, ...(snapshot ? { snapshot } : {}), ...runtimeOptions });
84
+ if (result?.output)
85
+ process.stdout.write(result.output);
86
+ }
87
+ finally {
88
+ await releaseLock(transport, stage, lock);
89
+ }
56
90
  }
57
91
  /**
92
+ * @param {import('#types').Transport} transport
58
93
  * @param {import('#types').StageConfig} stage
59
94
  * @param {import('#types').CommandOptions} options
60
- * @returns {string}
95
+ * @returns {Promise<{releasePath: string, releaseId?: string}>}
61
96
  */
62
- function pathForRollbridgeCommand(stage, options) {
63
- if (options.releasePath)
64
- return options.releasePath;
65
- if (options.releaseId)
66
- return path.join(deployPaths(stage).releasesPath, options.releaseId);
67
- return deployPaths(stage).currentPath;
97
+ async function runtimeCommandTarget(transport, stage, options) {
98
+ const current = await requireCurrentRelease(transport, stage);
99
+ let selected;
100
+ if (options.releasePath) {
101
+ const releasesPath = path.resolve(deployPaths(stage).releasesPath);
102
+ const relative = path.relative(releasesPath, path.resolve(options.releasePath));
103
+ if (!relative || path.isAbsolute(relative) || relative.includes(path.sep)) {
104
+ throw new Error("Runtime command --release-path must identify one direct child of releases/.");
105
+ }
106
+ selected = await resolveRetainedRelease(transport, stage, relative);
107
+ }
108
+ else if (options.releaseId) {
109
+ selected = await resolveRetainedRelease(transport, stage, options.releaseId);
110
+ }
111
+ else {
112
+ return current;
113
+ }
114
+ if (selected.releaseId !== current.releaseId)
115
+ throw new Error("Runtime maintenance commands can target only the active release.");
116
+ return selected;
68
117
  }
69
118
  //# sourceMappingURL=rollbridge.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"rollbridge.js","sourceRoot":"","sources":["../../../src/commands/rollbridge.js"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rollbridge.js","sourceRoot":"","sources":["../../../src/commands/rollbridge.js"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"validate-config.d.ts","sourceRoot":"","sources":["../../../src/config/validate-config.js"],"names":[],"mappings":"AAWA;;;;GAIG;AACH,uCAJW,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,aACvB,MAAM,GACJ,OAAO,QAAQ,EAAE,WAAW,CAcxC;AAmED;;;GAGG;AACH,iDAHW,OAAO,GACL,OAAO,CAInB"}
1
+ {"version":3,"file":"validate-config.d.ts","sourceRoot":"","sources":["../../../src/config/validate-config.js"],"names":[],"mappings":"AAWA;;;;GAIG;AACH,uCAJW,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,aACvB,MAAM,GACJ,OAAO,QAAQ,EAAE,WAAW,CAcxC;AA8KD;;;GAGG;AACH,iDAHW,OAAO,GACL,OAAO,CAInB"}