@sylphx/cli 0.6.0 → 0.7.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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,23 @@
1
1
  # @sylphx/cli
2
2
 
3
+ ## 0.7.1
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies [[`8a38f4b`](https://github.com/SylphxAI/platform/commit/8a38f4bca6dd06eb9947478dcfcdb765cc28ad10)]:
8
+ - @sylphx/sdk@0.10.3
9
+
10
+ ## 0.7.0
11
+
12
+ ### Minor Changes
13
+
14
+ - [#586](https://github.com/SylphxAI/platform/pull/586) [`2e55a61`](https://github.com/SylphxAI/platform/commit/2e55a6194628c5ca3ca78290cbf62610231ccee6) Thanks [@shtse8](https://github.com/shtse8)! - Expose authenticated build detail through the deployments contract, Management SDK, and `sylphx deployments build` so failed builds return structured, redacted diagnostics.
15
+
16
+ ### Patch Changes
17
+
18
+ - Updated dependencies []:
19
+ - @sylphx/sdk@0.10.2
20
+
3
21
  ## 0.6.0
4
22
 
5
23
  ### Minor Changes
package/dist/main.js CHANGED
@@ -15,7 +15,7 @@ var init_package = __esm({
15
15
  "package.json"() {
16
16
  package_default = {
17
17
  name: "@sylphx/cli",
18
- version: "0.6.0",
18
+ version: "0.7.1",
19
19
  description: "Sylphx Platform CLI \u2014 deploy and manage your applications from the terminal. 63 commands across deployment, logs, env vars, domains, databases, storage, monitoring, self-service (user), admin (users/quotas/audit/invitations/jwt-keys/project-migrate), and more.",
20
20
  type: "module",
21
21
  homepage: "https://sylphx.com",
@@ -71,7 +71,7 @@ var init_package = __esm({
71
71
  "@effect/cli": "0.75.1",
72
72
  "@effect/platform": "0.96.0",
73
73
  "@effect/platform-bun": "0.89.0",
74
- "@sylphx/sdk": "0.10.1",
74
+ "@sylphx/sdk": "0.10.3",
75
75
  chalk: "^5.3.0",
76
76
  effect: "3.21.0",
77
77
  eventsource: "^2.0.2",
@@ -1596,7 +1596,7 @@ var init_admin_bootstrap2 = __esm({
1596
1596
 
1597
1597
  // ../contract/dist/schemas/ids.js
1598
1598
  import { Schema as Schema7 } from "effect";
1599
- var brandedId, OrgId, ProjectId, EnvironmentId, ServiceId, UserId, SessionId, DeploymentId, DomainId, HostnameId, SecretId, DatabaseId, BranchDatabaseId, ResourceId, InvitationId;
1599
+ var brandedId, OrgId, ProjectId, EnvironmentId, ServiceId, UserId, SessionId, DeploymentId, BuildId, DomainId, HostnameId, SecretId, DatabaseId, BranchDatabaseId, ResourceId, InvitationId;
1600
1600
  var init_ids = __esm({
1601
1601
  "../contract/dist/schemas/ids.js"() {
1602
1602
  "use strict";
@@ -1608,6 +1608,7 @@ var init_ids = __esm({
1608
1608
  UserId = brandedId("UserId");
1609
1609
  SessionId = brandedId("SessionId");
1610
1610
  DeploymentId = brandedId("DeploymentId");
1611
+ BuildId = brandedId("BuildId");
1611
1612
  DomainId = brandedId("DomainId");
1612
1613
  HostnameId = brandedId("HostnameId");
1613
1614
  SecretId = brandedId("SecretId");
@@ -6460,7 +6461,7 @@ var init_databases = __esm({
6460
6461
 
6461
6462
  // ../contract/dist/schemas/deployment.js
6462
6463
  import { Schema as Schema51 } from "effect";
6463
- var DeploymentEnvironmentStatus, DeploymentStatus, DeployResult, DeploymentHistoryItem, DeploymentHistoryResult, RollbackResult, ProjectStatusEnvironment, ProjectStatus, DeploymentServiceStatus, DeploymentDetail, TriggerDeploymentInput, RollbackDeploymentInput, DeployServiceStatus, EnvScopedAppEnvInfo, EnvScopedAppDeployments, EnvScopedTriggerDeployResult, EnvScopedRollbackByCommitInput, EnvScopedRollbackByCommitResult, CancelBuildResult, EnvScopedEnvVar, EnvScopedListEnvVarsResult, EnvScopedSetEnvVarInput, EnvScopedSetEnvVarResult, EnvScopedDeleteEnvVarResult, EnvScopedDeploymentView, EnvScopedDeploymentHistory, EnvScopedAppHealthStatus, EnvServiceRollbackInput, EnvServiceRollbackResult, PromoteArtifactInput, PromoteArtifactResult, DeployStatusLiteral, TriggerSourceLiteral, EnvServiceHistoryDeployment, EnvServiceHistoryResult;
6464
+ var DeploymentEnvironmentStatus, DeploymentStatus, DeployResult, DeploymentHistoryItem, DeploymentHistoryResult, RollbackResult, ProjectStatusEnvironment, ProjectStatus, DeploymentServiceStatus, DeploymentDetail, TriggerDeploymentInput, RollbackDeploymentInput, DeployServiceStatus, EnvScopedAppEnvInfo, EnvScopedAppDeployments, EnvScopedTriggerDeployResult, EnvScopedRollbackByCommitInput, EnvScopedRollbackByCommitResult, CancelBuildResult, BuildDetail, EnvScopedEnvVar, EnvScopedListEnvVarsResult, EnvScopedSetEnvVarInput, EnvScopedSetEnvVarResult, EnvScopedDeleteEnvVarResult, EnvScopedDeploymentView, EnvScopedDeploymentHistory, EnvScopedAppHealthStatus, EnvServiceRollbackInput, EnvServiceRollbackResult, PromoteArtifactInput, PromoteArtifactResult, DeployStatusLiteral, TriggerSourceLiteral, EnvServiceHistoryDeployment, EnvServiceHistoryResult;
6464
6465
  var init_deployment = __esm({
6465
6466
  "../contract/dist/schemas/deployment.js"() {
6466
6467
  "use strict";
@@ -6629,6 +6630,57 @@ var init_deployment = __esm({
6629
6630
  cancelled: Schema51.Boolean,
6630
6631
  buildId: Schema51.String
6631
6632
  });
6633
+ BuildDetail = Schema51.Struct({
6634
+ id: BuildId,
6635
+ status: Schema51.String,
6636
+ projectId: ProjectId,
6637
+ envId: EnvironmentId,
6638
+ environment: Schema51.Struct({
6639
+ id: EnvironmentId,
6640
+ name: Schema51.String,
6641
+ type: Schema51.String
6642
+ }),
6643
+ service: Schema51.NullOr(Schema51.Struct({
6644
+ id: ServiceId,
6645
+ name: Schema51.String,
6646
+ slug: Schema51.NullOr(Schema51.String),
6647
+ sourceKind: Schema51.NullOr(Schema51.String),
6648
+ buildContext: Schema51.NullOr(Schema51.String),
6649
+ dockerfilePath: Schema51.NullOr(Schema51.String)
6650
+ })),
6651
+ git: Schema51.Struct({
6652
+ sha: Schema51.String,
6653
+ branch: Schema51.String,
6654
+ commitMessage: Schema51.NullOr(Schema51.String)
6655
+ }),
6656
+ image: Schema51.Struct({
6657
+ digest: Schema51.NullOr(Schema51.String)
6658
+ }),
6659
+ build: Schema51.Struct({
6660
+ actualBuildKind: Schema51.NullOr(Schema51.String),
6661
+ buildpackPlanDigest: Schema51.NullOr(Schema51.String),
6662
+ logsAvailable: Schema51.Boolean
6663
+ }),
6664
+ timing: Schema51.Struct({
6665
+ createdAt: Schema51.String,
6666
+ startedAt: Schema51.NullOr(Schema51.String),
6667
+ finishedAt: Schema51.NullOr(Schema51.String),
6668
+ cancelledAt: Schema51.NullOr(Schema51.String),
6669
+ durationMs: Schema51.NullOr(Schema51.Number)
6670
+ }),
6671
+ diagnostics: Schema51.Struct({
6672
+ failureSummary: Schema51.NullOr(Schema51.String),
6673
+ cancellationReason: Schema51.NullOr(Schema51.String),
6674
+ supersededByBuildId: Schema51.NullOr(BuildId),
6675
+ supersededByGitSha: Schema51.NullOr(Schema51.String)
6676
+ }),
6677
+ deployment: Schema51.NullOr(Schema51.Struct({
6678
+ id: DeploymentId,
6679
+ status: Schema51.String,
6680
+ createdAt: Schema51.String,
6681
+ finishedAt: Schema51.NullOr(Schema51.String)
6682
+ }))
6683
+ });
6632
6684
  EnvScopedEnvVar = Schema51.Struct({
6633
6685
  key: Schema51.String,
6634
6686
  value: Schema51.String
@@ -6844,6 +6896,14 @@ var init_deployments = __esm({
6844
6896
  summary: "Cancel an in-flight build job (idempotent)",
6845
6897
  tags: ["deployments"]
6846
6898
  }),
6899
+ envScopedBuildDetail: defineEndpoint({
6900
+ method: "GET",
6901
+ path: "/deployments/builds/:buildId",
6902
+ params: BuildIdPath,
6903
+ response: BuildDetail,
6904
+ summary: "Build detail and failure summary for an authenticated project member",
6905
+ tags: ["deployments"]
6906
+ }),
6847
6907
  envScopedListEnvVars: defineEndpoint({
6848
6908
  method: "GET",
6849
6909
  path: "/deployments/projects/:envId/env",
@@ -10762,7 +10822,7 @@ var init_privacy = __esm({
10762
10822
 
10763
10823
  // ../contract/dist/schemas/project-manifest.js
10764
10824
  import { Schema as Schema83 } from "effect";
10765
- var Slug2, ManifestEnvName, ManifestRegion, MachineSize, BuildMachineSize, BuildpackName, ServiceType, DeployStrategy, WwwRedirect, ManifestProjectSection, ManifestBuildSection, ManifestDeploySection, ManifestServiceSection, ManifestEnvValue, ManifestDomainSection, PostgresTier, PostgresVersion, SearchTier, ManifestDatabaseEngine, ManifestSearchEngine, ManifestDatabaseResource, ManifestSearchResource, ManifestResourcesSection, ManifestCiSection, ManifestServiceOverride, ManifestEnvironmentOverride, ManifestEnvironmentsMap, SylphxManifest;
10825
+ var Slug2, ManifestEnvName, ManifestRegion, MachineSize, BuildMachineSize, BuildpackName, BuildStrategy, ServiceType, DeployStrategy, WwwRedirect, ManifestProjectSection, ManifestBuildSection, ManifestDeploySection, ManifestServiceBuildSection, ManifestServiceHealthSection, ManifestServiceSection, ManifestMigrationEngine, ManifestMigrationDestructivePolicy, ManifestMigrationsSection, ManifestDatabaseSection, ManifestEnvValue, ManifestDomainSection, PostgresTier, PostgresVersion, SearchTier, ManifestDatabaseEngine, ManifestSearchEngine, ManifestDatabaseResource, ManifestSearchResource, ManifestResourcesSection, ManifestCiSection, ManifestServiceOverride, ManifestEnvironmentOverride, ManifestEnvironmentsMap, SylphxManifest;
10766
10826
  var init_project_manifest = __esm({
10767
10827
  "../contract/dist/schemas/project-manifest.js"() {
10768
10828
  "use strict";
@@ -10772,6 +10832,7 @@ var init_project_manifest = __esm({
10772
10832
  MachineSize = Schema83.Literal("nano", "micro", "small", "standard", "large", "xlarge");
10773
10833
  BuildMachineSize = Schema83.Literal("standard", "large", "xlarge");
10774
10834
  BuildpackName = Schema83.Literal("auto", "ruby", "node", "python", "static", "dockerfile");
10835
+ BuildStrategy = Schema83.Literal("auto", "buildpack", "dockerfile", "nixpacks");
10775
10836
  ServiceType = Schema83.Literal("web", "worker", "cron", "function");
10776
10837
  DeployStrategy = Schema83.Literal("rolling", "blue-green", "immediate");
10777
10838
  WwwRedirect = Schema83.Literal("apex", "www", "none");
@@ -10796,8 +10857,12 @@ var init_project_manifest = __esm({
10796
10857
  * package.json / Gemfile / requirements.txt / Dockerfile.
10797
10858
  */
10798
10859
  buildpack: Schema83.optional(BuildpackName),
10860
+ /** High-level build strategy alias used by current sylphx.toml files. */
10861
+ strategy: Schema83.optional(BuildStrategy),
10799
10862
  /** Override path to Dockerfile (implies buildpack=dockerfile). */
10800
10863
  dockerfile: Schema83.optional(Schema83.String),
10864
+ /** Docker build context path. `context` is the product-facing TOML alias. */
10865
+ context: Schema83.optional(Schema83.String),
10801
10866
  /** Docker build context path (default: repo root). */
10802
10867
  docker_context: Schema83.optional(Schema83.String),
10803
10868
  /** Custom build command; overrides buildpack default. */
@@ -10824,10 +10889,26 @@ var init_project_manifest = __esm({
10824
10889
  /** Grace period before SIGKILL (seconds). */
10825
10890
  graceful_shutdown: Schema83.optional(Schema83.Number.pipe(Schema83.int(), Schema83.between(0, 300)))
10826
10891
  });
10892
+ ManifestServiceBuildSection = Schema83.Struct({
10893
+ strategy: Schema83.optional(BuildStrategy),
10894
+ dockerfile: Schema83.optional(Schema83.String),
10895
+ context: Schema83.optional(Schema83.String),
10896
+ docker_context: Schema83.optional(Schema83.String),
10897
+ build_command: Schema83.optional(Schema83.String)
10898
+ });
10899
+ ManifestServiceHealthSection = Schema83.Struct({
10900
+ mode: Schema83.optional(Schema83.Literal("http", "tcp", "command")),
10901
+ path: Schema83.optional(Schema83.String),
10902
+ command: Schema83.optional(Schema83.String)
10903
+ });
10827
10904
  ManifestServiceSection = Schema83.Struct({
10828
10905
  /** Service name — unique within project. Used as K8s Deployment name. */
10829
10906
  name: Slug2,
10830
10907
  type: ServiceType,
10908
+ /** Per-service build override. Root [build] remains the default. */
10909
+ build: Schema83.optional(ManifestServiceBuildSection),
10910
+ /** Per-service health contract. Platform owns probe translation. */
10911
+ health: Schema83.optional(ManifestServiceHealthSection),
10831
10912
  /** Container start command. */
10832
10913
  command: Schema83.optional(Schema83.String),
10833
10914
  /** Internal container port; required for `web`. */
@@ -10866,7 +10947,22 @@ var init_project_manifest = __esm({
10866
10947
  /** Per-service env var merge — refs entries from top-level [env]. */
10867
10948
  env: Schema83.optional(Schema83.Array(Schema83.String)),
10868
10949
  /** Per-service resource bindings (by resource name). */
10869
- resources: Schema83.optional(Schema83.Array(Slug2))
10950
+ resources: Schema83.optional(Schema83.Array(Slug2)),
10951
+ /** Paths whose changes should trigger this service in monorepos. */
10952
+ watch_paths: Schema83.optional(Schema83.Array(Schema83.String))
10953
+ });
10954
+ ManifestMigrationEngine = Schema83.Literal("atlas", "drizzle", "prisma", "alembic", "flyway", "goose", "sqlx", "custom");
10955
+ ManifestMigrationDestructivePolicy = Schema83.Literal("require-approval", "allow");
10956
+ ManifestMigrationsSection = Schema83.Struct({
10957
+ engine: ManifestMigrationEngine,
10958
+ dir: Schema83.optional(Schema83.String),
10959
+ image: Slug2,
10960
+ command: Schema83.String.pipe(Schema83.minLength(1)),
10961
+ timeout: Schema83.optional(Schema83.String),
10962
+ destructive_policy: Schema83.optional(ManifestMigrationDestructivePolicy)
10963
+ });
10964
+ ManifestDatabaseSection = Schema83.Struct({
10965
+ migrations: Schema83.optional(ManifestMigrationsSection)
10870
10966
  });
10871
10967
  ManifestEnvValue = Schema83.Union(Schema83.Struct({ value: Schema83.String }), Schema83.Struct({ from_secret: Schema83.String }), Schema83.Struct({ from_resource: Schema83.String, attr: Schema83.String }));
10872
10968
  ManifestDomainSection = Schema83.Struct({
@@ -10961,6 +11057,7 @@ var init_project_manifest = __esm({
10961
11057
  build: Schema83.optional(ManifestBuildSection),
10962
11058
  deploy: Schema83.optional(ManifestDeploySection),
10963
11059
  services: Schema83.optional(Schema83.Array(ManifestServiceSection)),
11060
+ database: Schema83.optional(ManifestDatabaseSection),
10964
11061
  env: Schema83.optional(Schema83.Record({ key: Schema83.String, value: ManifestEnvValue })),
10965
11062
  domains: Schema83.optional(Schema83.Array(ManifestDomainSection)),
10966
11063
  environments: Schema83.optional(ManifestEnvironmentsMap),
@@ -14488,6 +14585,7 @@ var deployments_exports = {};
14488
14585
  __export(deployments_exports, {
14489
14586
  cancel: () => cancel,
14490
14587
  get: () => get2,
14588
+ getBuild: () => getBuild,
14491
14589
  history: () => history2,
14492
14590
  rollback: () => rollback,
14493
14591
  status: () => status,
@@ -14508,7 +14606,7 @@ function normalizeHistoryRow(row) {
14508
14606
  function isHistoryEnvelope(response) {
14509
14607
  return !Array.isArray(response);
14510
14608
  }
14511
- var status, get2, trigger2, history2, rollback, cancel;
14609
+ var status, get2, getBuild, trigger2, history2, rollback, cancel;
14512
14610
  var init_deployments2 = __esm({
14513
14611
  "../management/dist/deployments.js"() {
14514
14612
  "use strict";
@@ -14526,6 +14624,12 @@ var init_deployments2 = __esm({
14526
14624
  headers: { "x-preferred-org-id": options.orgId }
14527
14625
  });
14528
14626
  };
14627
+ getBuild = (client, buildId, options = {}) => {
14628
+ const { method, path: path6 } = deploymentsEndpoints.envScopedBuildDetail;
14629
+ return request(client, method, interpolatePath(path6, { buildId }), {
14630
+ headers: { "x-preferred-org-id": options.orgId }
14631
+ });
14632
+ };
14529
14633
  trigger2 = (client, projectId, envType, options = {}) => {
14530
14634
  const { method, path: path6 } = deploymentsEndpoints.trigger;
14531
14635
  return request(client, method, interpolatePath(path6, { id: projectId }), {
@@ -16838,6 +16942,7 @@ var init_api = __esm({
16838
16942
  getDeploymentStatus: (projectId, options) => withClient((c2) => deployments_exports.status(c2, projectId, options)),
16839
16943
  triggerDeploy: (projectId, envType) => withClient((c2) => deployments_exports.trigger(c2, projectId, envType)),
16840
16944
  getDeploymentHistory: (projectId, envType, options) => withClient((c2) => deployments_exports.history(c2, projectId, envType, options)),
16945
+ getBuild: (buildId, options) => withClient((c2) => deployments_exports.getBuild(c2, buildId, options)),
16841
16946
  rollback: (projectId, body, options) => withClient(
16842
16947
  (c2) => deployments_exports.rollback(
16843
16948
  c2,
@@ -17491,6 +17596,10 @@ var ApiServiceLive = Layer2.succeed(ApiService, {
17491
17596
  try: () => withAuthedSdk((c2) => deployments_exports.get(c2, deploymentId2, options)),
17492
17597
  catch: mapApiError("deployments")
17493
17598
  }),
17599
+ getBuild: (buildId, options) => Effect6.tryPromise({
17600
+ try: () => withAuthedSdk((c2) => deployments_exports.getBuild(c2, buildId, options)),
17601
+ catch: mapApiError("deployments")
17602
+ }),
17494
17603
  rollback: (projectId, body, options) => Effect6.tryPromise({
17495
17604
  try: () => withAuthedSdk((c2) => deployments_exports.rollback(c2, projectId, body, options)),
17496
17605
  catch: mapApiError("rollback")
@@ -21337,6 +21446,11 @@ function renderManifestToml(manifest) {
21337
21446
  parts.push(...kv(manifest.deploy));
21338
21447
  parts.push("");
21339
21448
  }
21449
+ if (manifest.database?.migrations) {
21450
+ parts.push("[database.migrations]");
21451
+ parts.push(...kv(manifest.database.migrations));
21452
+ parts.push("");
21453
+ }
21340
21454
  if (manifest.services) {
21341
21455
  for (const svc of manifest.services) {
21342
21456
  parts.push("[[services]]");
@@ -22975,6 +23089,41 @@ function printDeploymentDetail(d) {
22975
23089
  yield* Console17.log("");
22976
23090
  });
22977
23091
  }
23092
+ function buildFailureLine(build) {
23093
+ return build.diagnostics.failureSummary ?? build.diagnostics.cancellationReason ?? "-";
23094
+ }
23095
+ function printBuildDetail(build) {
23096
+ return Effect27.gen(function* () {
23097
+ yield* Console17.log("");
23098
+ yield* Console17.log(chalk_default.bold(` Build ${chalk_default.white(build.id)}`));
23099
+ yield* Console17.log(chalk_default.dim(` ${"\u2500".repeat(56)}`));
23100
+ yield* Console17.log(` Status : ${statusColour3(build.status)}`);
23101
+ yield* Console17.log(` Project : ${chalk_default.white(build.projectId)}`);
23102
+ yield* Console17.log(
23103
+ ` Environment : ${chalk_default.white(`${build.environment.name} (${build.environment.type})`)}`
23104
+ );
23105
+ if (build.service) yield* Console17.log(` Service : ${chalk_default.white(build.service.name)}`);
23106
+ yield* Console17.log(` Commit : ${chalk_default.white(build.git.sha)}`);
23107
+ yield* Console17.log(` Branch : ${chalk_default.white(build.git.branch)}`);
23108
+ if (build.git.commitMessage)
23109
+ yield* Console17.log(` Message : ${chalk_default.white(build.git.commitMessage)}`);
23110
+ if (build.image.digest)
23111
+ yield* Console17.log(` Image : ${chalk_default.white(build.image.digest)}`);
23112
+ yield* Console17.log(` Build kind : ${chalk_default.white(build.build.actualBuildKind ?? "unknown")}`);
23113
+ yield* Console17.log(
23114
+ ` Started : ${chalk_default.white(build.timing.startedAt ? new Date(build.timing.startedAt).toLocaleString() : "-")}`
23115
+ );
23116
+ yield* Console17.log(
23117
+ ` Finished : ${chalk_default.white(build.timing.finishedAt ? new Date(build.timing.finishedAt).toLocaleString() : "-")}`
23118
+ );
23119
+ yield* Console17.log(` Duration : ${chalk_default.white(formatDuration(build.timing.durationMs))}`);
23120
+ yield* Console17.log(` Diagnostics : ${chalk_default.white(buildFailureLine(build))}`);
23121
+ if (build.diagnostics.supersededByBuildId) {
23122
+ yield* Console17.log(` Superseded by: ${chalk_default.white(build.diagnostics.supersededByBuildId)}`);
23123
+ }
23124
+ yield* Console17.log("");
23125
+ });
23126
+ }
22978
23127
  function deploymentsListEffect(opts) {
22979
23128
  return Effect27.gen(function* () {
22980
23129
  yield* requireAuthEffect;
@@ -23044,6 +23193,18 @@ function deploymentsGetEffect(opts) {
23044
23193
  yield* makeFormatter(output).print(detail, printDeploymentDetail);
23045
23194
  });
23046
23195
  }
23196
+ function deploymentsBuildEffect(opts) {
23197
+ return Effect27.gen(function* () {
23198
+ yield* requireAuthEffect;
23199
+ const orgId = yield* resolveOrgScopeEffect("deployments", opts.org);
23200
+ const api2 = yield* ApiService;
23201
+ const output = opts.output ?? "pretty";
23202
+ const isHumanOutput = output === "pretty" || output === "table";
23203
+ const request2 = orgId ? api2.getBuild(opts.id, { orgId }) : api2.getBuild(opts.id);
23204
+ const build = yield* isHumanOutput ? withSpinner(`Fetching build ${chalk_default.bold(opts.id)}...`, request2) : request2;
23205
+ yield* makeFormatter(output).print(build, printBuildDetail);
23206
+ });
23207
+ }
23047
23208
  function deploymentsWaitEffect(opts) {
23048
23209
  return Effect27.gen(function* () {
23049
23210
  yield* requireAuthEffect;
@@ -23141,6 +23302,11 @@ var getCmd3 = Command17.make(
23141
23302
  { id: Args14.text({ name: "id" }), org: orgOption4, output: outputOption },
23142
23303
  ({ id, org, output }) => deploymentsGetEffect({ id, org: org._tag === "Some" ? org.value : void 0, output })
23143
23304
  ).pipe(Command17.withDescription("Show details for a single deployment"));
23305
+ var buildCmd = Command17.make(
23306
+ "build",
23307
+ { id: Args14.text({ name: "id" }), org: orgOption4, output: outputOption },
23308
+ ({ id, org, output }) => deploymentsBuildEffect({ id, org: org._tag === "Some" ? org.value : void 0, output })
23309
+ ).pipe(Command17.withDescription("Show details for a single build"));
23144
23310
  function parseTimeoutMs(raw) {
23145
23311
  const m = raw.match(/^\s*(\d+)\s*(ms|s|m|h)?\s*$/i);
23146
23312
  if (!m) return WAIT_DEFAULT_TIMEOUT_MS;
@@ -23177,7 +23343,7 @@ var deploymentsCommand = Command17.make(
23177
23343
  () => Console17.log("Run `sylphx deployments --help` for usage")
23178
23344
  ).pipe(
23179
23345
  Command17.withDescription("Browse deployment history"),
23180
- Command17.withSubcommands([listCmd7, getCmd3, waitCmd])
23346
+ Command17.withSubcommands([listCmd7, getCmd3, buildCmd, waitCmd])
23181
23347
  );
23182
23348
 
23183
23349
  // src/programs/doctor.ts