@kungfu-tech/buildchain 3.0.4-alpha.2 → 3.0.4-alpha.4

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 (50) hide show
  1. package/bin/buildchain.mjs +126 -72
  2. package/bin/internal/trust-release-cli.mjs +15 -537
  3. package/bin/internal/trust-release-command-handlers.mjs +14 -0
  4. package/bin/internal/trust-release-inspection-handlers.mjs +175 -0
  5. package/bin/internal/trust-release-release-handlers.mjs +317 -0
  6. package/bin/internal/trust-release-verification-handlers.mjs +306 -0
  7. package/dist/site/buildchain-contract.json +35 -24
  8. package/dist/site/buildchain-site.json +22 -10
  9. package/dist/site/controller-registry.json +16 -3
  10. package/dist/site/kfd-claims.json +9 -7
  11. package/dist/site/kfd-upstream-aggregate.json +1 -1
  12. package/dist/site/manual-registry.json +2 -2
  13. package/dist/site/node-api-registry.json +7 -7
  14. package/dist/site/page-registry.json +9 -4
  15. package/dist/site/public-surface-audit.json +56 -8
  16. package/dist/site/publication-registry.json +4 -4
  17. package/dist/site/release-model.json +7 -0
  18. package/dist/site/site-manifest.json +6 -6
  19. package/dist/site/workflow-registry.json +13 -5
  20. package/docs/MAP.md +1 -1
  21. package/docs/release-propagation.md +166 -8
  22. package/package.json +1 -1
  23. package/packages/core/buildchain-kfd-claims.js +1 -1
  24. package/packages/core/controller-evidence.js +8 -1
  25. package/packages/core/index.js +1 -13
  26. package/packages/core/paper-agent-entry.js +10 -11
  27. package/packages/core/paper-npm-bootstrap.js +492 -0
  28. package/packages/core/paper.js +271 -669
  29. package/packages/core/public-surface-cli.js +12 -1
  30. package/packages/core/release-passport.js +67 -71
  31. package/packages/core/release-propagation-common.js +64 -0
  32. package/packages/core/release-propagation-execution-profile.js +59 -0
  33. package/packages/core/release-propagation-release.js +196 -0
  34. package/packages/core/release-propagation-stage-evidence.js +364 -0
  35. package/packages/core/release-propagation-work-capture.js +64 -0
  36. package/packages/core/release-propagation-work-constants.js +34 -0
  37. package/packages/core/release-propagation-work-control.js +203 -0
  38. package/packages/core/release-propagation-work-transitions.js +145 -0
  39. package/packages/core/release-propagation-work.js +517 -0
  40. package/packages/core/release-propagation.js +34 -158
  41. package/scripts/aws-windows-jit-controller-core.mjs +269 -0
  42. package/scripts/aws-windows-jit-controller.mjs +502 -0
  43. package/scripts/check-internal-architecture.mjs +178 -52
  44. package/scripts/check-maintainability.mjs +76 -17
  45. package/scripts/generate-site-bundle.mjs +16 -7
  46. package/scripts/maintainability-metrics.mjs +24 -4
  47. package/scripts/release-propagation.mjs +126 -0
  48. package/scripts/resolve-artifact-transfer-mode.mjs +117 -0
  49. package/scripts/web-surface-core.mjs +46 -207
  50. package/scripts/web-surface-routing.mjs +286 -0
@@ -0,0 +1,175 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { spawnSync } from "node:child_process";
4
+ import { verifyInfraContractEvidenceBundle } from "../../scripts/infra-contract-core.mjs";
5
+ import { verifyBuildchainLogEvents } from "../../packages/core/logging.js";
6
+ import {
7
+ explainReleaseLineDryRun,
8
+ formatReleaseLineDryRun,
9
+ } from "../../packages/core/release-line-dry-run.js";
10
+ import {
11
+ planReleaseLineBootstrap,
12
+ writeReleaseLineBootstrapVersionState,
13
+ } from "../../packages/core/release-line-bootstrap.js";
14
+ import {
15
+ collectGitHubReleasePassport,
16
+ explainReleasePassport,
17
+ verifyReleasePassport,
18
+ } from "../../packages/core/release-passport.js";
19
+ import {
20
+ createPublicationAdmission,
21
+ createRunnerProvenance,
22
+ verifyPublicationAdmission,
23
+ } from "../../packages/core/publication-authority.js";
24
+ import {
25
+ createGitHubArtifactAttestationPolicy,
26
+ createGitHubArtifactAttestationVerificationPlan,
27
+ verifyGitHubArtifactAttestationEvidence,
28
+ } from "../../packages/core/github-artifact-attestation.js";
29
+ import {
30
+ explainArtifactPassport,
31
+ verifyArtifactPassport,
32
+ } from "../../packages/core/artifact-passport.js";
33
+ import {
34
+ projectArtifactVerificationEnvelopeToKfx,
35
+ verifyArtifactVerificationEnvelope,
36
+ } from "../../packages/core/artifact-verification-envelope.js";
37
+ import {
38
+ artifactEnvelopeOptions,
39
+ printJson,
40
+ readBooleanFlag,
41
+ readFlag,
42
+ readJsonInput,
43
+ readRepeatedFlag,
44
+ writeJsonFile,
45
+ } from "./cli-options.mjs";
46
+
47
+ async function handleAuditCommand({ args, runScript, packageVersion }) {
48
+ const [subcommand = "", ...auditArgs] = args;
49
+ if (subcommand === "publication-control-plane") {
50
+ runScript("audit-publication-control-plane.mjs", auditArgs);
51
+ return;
52
+ }
53
+ if (subcommand === "github-governance") {
54
+ runScript("audit-github-governance.mjs", auditArgs);
55
+ return;
56
+ }
57
+ throw new Error(
58
+ "usage: buildchain audit <publication-control-plane|github-governance> ...",
59
+ );
60
+ }
61
+
62
+ async function handleExplainCommand({ args, runScript, packageVersion }) {
63
+ const [subcommand = "", ...explainArgs] = args;
64
+ if (subcommand === "artifact") {
65
+ const subject = explainArgs[0] || "";
66
+ if (!subject) {
67
+ throw new Error("usage: buildchain explain artifact <subject>");
68
+ }
69
+ const explanation = await explainArtifactPassport({
70
+ subject,
71
+ cwd: process.cwd(),
72
+ passportLocation: readFlag(explainArgs, "passport", ""),
73
+ locatorConfig: readFlag(explainArgs, "locator-config", ""),
74
+ repository: readFlag(explainArgs, "repository", ""),
75
+ tag: readFlag(explainArgs, "tag", ""),
76
+ githubReleaseBaseUrl: readFlag(
77
+ explainArgs,
78
+ "github-release-base-url",
79
+ "",
80
+ ),
81
+ subjectDigest: readFlag(explainArgs, "subject-digest", ""),
82
+ subjectKind: readFlag(explainArgs, "subject-kind", ""),
83
+ npmRegistryBaseUrl: readFlag(explainArgs, "npm-registry", ""),
84
+ forAudience: readFlag(explainArgs, "for", "human"),
85
+ });
86
+ if (readBooleanFlag(explainArgs, "json")) {
87
+ printJson(explanation);
88
+ } else {
89
+ process.stdout.write(
90
+ `artifact: ${explanation.subject?.name || subject}\n`,
91
+ );
92
+ process.stdout.write(`trust: ${explanation.trust}\n`);
93
+ process.stdout.write(`next action: ${explanation.nextAction}\n`);
94
+ }
95
+ process.exitCode = explanation.trust === "pass" ? 0 : 1;
96
+ return;
97
+ }
98
+ if (subcommand !== "release") {
99
+ throw new Error(
100
+ "usage: buildchain explain release --passport <file-or-url>",
101
+ );
102
+ }
103
+ const passport = readFlag(explainArgs, "passport", "");
104
+ if (!passport) {
105
+ throw new Error(
106
+ "buildchain explain release requires --passport <file-or-url>",
107
+ );
108
+ }
109
+ const explanation = await explainReleasePassport({
110
+ passportLocation: passport,
111
+ forAudience: readFlag(explainArgs, "for", "human"),
112
+ });
113
+ if (readBooleanFlag(explainArgs, "json")) {
114
+ printJson(explanation);
115
+ } else {
116
+ process.stdout.write(`release: ${explanation.release?.tag || "unknown"}\n`);
117
+ process.stdout.write(`trust: ${explanation.trust}\n`);
118
+ process.stdout.write(`next action: ${explanation.nextAction}\n`);
119
+ }
120
+ return;
121
+ }
122
+
123
+ async function handleInspectCommand({ args, runScript, packageVersion }) {
124
+ const [subcommand = "", ...inspectArgs] = args;
125
+ if (subcommand === "artifact") {
126
+ const subject = inspectArgs[0] || "";
127
+ if (!subject) {
128
+ throw new Error("usage: buildchain inspect artifact <subject>");
129
+ }
130
+ const report = await verifyArtifactPassport({
131
+ subject,
132
+ cwd: process.cwd(),
133
+ passportLocation: readFlag(inspectArgs, "passport", ""),
134
+ locatorConfig: readFlag(inspectArgs, "locator-config", ""),
135
+ repository: readFlag(inspectArgs, "repository", ""),
136
+ tag: readFlag(inspectArgs, "tag", ""),
137
+ githubReleaseBaseUrl: readFlag(
138
+ inspectArgs,
139
+ "github-release-base-url",
140
+ "",
141
+ ),
142
+ subjectDigest: readFlag(inspectArgs, "subject-digest", ""),
143
+ subjectKind: readFlag(inspectArgs, "subject-kind", ""),
144
+ npmRegistryBaseUrl: readFlag(inspectArgs, "npm-registry", ""),
145
+ });
146
+ printJson(report);
147
+ process.exitCode = report.ok ? 0 : 1;
148
+ return;
149
+ }
150
+ if (subcommand !== "release") {
151
+ throw new Error(
152
+ "usage: buildchain inspect release --passport <file-or-url>",
153
+ );
154
+ }
155
+ const passport = readFlag(inspectArgs, "passport", "");
156
+ if (!passport) {
157
+ throw new Error(
158
+ "buildchain inspect release requires --passport <file-or-url>",
159
+ );
160
+ }
161
+ const explanation = await explainReleasePassport({
162
+ passportLocation: passport,
163
+ forAudience: readFlag(inspectArgs, "for", "human"),
164
+ });
165
+ printJson(explanation);
166
+ return;
167
+ }
168
+
169
+ const INSPECTION_COMMAND_HANDLERS = Object.freeze({
170
+ audit: handleAuditCommand,
171
+ explain: handleExplainCommand,
172
+ inspect: handleInspectCommand,
173
+ });
174
+
175
+ export { INSPECTION_COMMAND_HANDLERS };
@@ -0,0 +1,317 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { spawnSync } from "node:child_process";
4
+ import { verifyInfraContractEvidenceBundle } from "../../scripts/infra-contract-core.mjs";
5
+ import { verifyBuildchainLogEvents } from "../../packages/core/logging.js";
6
+ import {
7
+ explainReleaseLineDryRun,
8
+ formatReleaseLineDryRun,
9
+ } from "../../packages/core/release-line-dry-run.js";
10
+ import {
11
+ planReleaseLineBootstrap,
12
+ writeReleaseLineBootstrapVersionState,
13
+ } from "../../packages/core/release-line-bootstrap.js";
14
+ import {
15
+ collectGitHubReleasePassport,
16
+ explainReleasePassport,
17
+ verifyReleasePassport,
18
+ } from "../../packages/core/release-passport.js";
19
+ import {
20
+ createPublicationAdmission,
21
+ createRunnerProvenance,
22
+ verifyPublicationAdmission,
23
+ } from "../../packages/core/publication-authority.js";
24
+ import {
25
+ createGitHubArtifactAttestationPolicy,
26
+ createGitHubArtifactAttestationVerificationPlan,
27
+ verifyGitHubArtifactAttestationEvidence,
28
+ } from "../../packages/core/github-artifact-attestation.js";
29
+ import {
30
+ explainArtifactPassport,
31
+ verifyArtifactPassport,
32
+ } from "../../packages/core/artifact-passport.js";
33
+ import {
34
+ projectArtifactVerificationEnvelopeToKfx,
35
+ verifyArtifactVerificationEnvelope,
36
+ } from "../../packages/core/artifact-verification-envelope.js";
37
+ import {
38
+ artifactEnvelopeOptions,
39
+ printJson,
40
+ readBooleanFlag,
41
+ readFlag,
42
+ readJsonInput,
43
+ readRepeatedFlag,
44
+ writeJsonFile,
45
+ } from "./cli-options.mjs";
46
+
47
+ async function handleReleaseCommand({ args, runScript, packageVersion }) {
48
+ if (args[0] === "line" && args[1] === "open") {
49
+ const lineArgs = args.slice(2);
50
+ const options = {
51
+ cwd: readFlag(lineArgs, "cwd", process.cwd()),
52
+ major: readFlag(lineArgs, "major", ""),
53
+ minor: readFlag(lineArgs, "minor", ""),
54
+ sourceRef: readFlag(lineArgs, "source-ref", ""),
55
+ initialVersion: readFlag(lineArgs, "initial-version", ""),
56
+ };
57
+ const result = readBooleanFlag(lineArgs, "write")
58
+ ? writeReleaseLineBootstrapVersionState({
59
+ ...options,
60
+ runVersionStateLifecycle: !readBooleanFlag(
61
+ lineArgs,
62
+ "skip-version-state-lifecycle",
63
+ ),
64
+ generatedAt: readFlag(lineArgs, "generated-at", ""),
65
+ })
66
+ : planReleaseLineBootstrap({
67
+ ...options,
68
+ requiredStatusCheck: readFlag(
69
+ lineArgs,
70
+ "required-status-check",
71
+ "check",
72
+ ),
73
+ setDefault: !readBooleanFlag(lineArgs, "no-set-default"),
74
+ createAlphaPr: !readBooleanFlag(lineArgs, "no-alpha-pr"),
75
+ approvalCount: Number(readFlag(lineArgs, "approval-count", "1")),
76
+ bootstrapBranch: readFlag(lineArgs, "bootstrap-branch", ""),
77
+ });
78
+ if (readBooleanFlag(lineArgs, "json")) {
79
+ printJson(result);
80
+ } else {
81
+ process.stdout.write(
82
+ `Buildchain release line bootstrap ${result.line}\n`,
83
+ );
84
+ process.stdout.write(
85
+ `- source: ${result.source.ref}${result.source.sha ? ` (${result.source.sha})` : ""}\n`,
86
+ );
87
+ process.stdout.write(`- initial version: ${result.initialVersion}\n`);
88
+ process.stdout.write(`- dev: ${result.refs.dev}\n`);
89
+ process.stdout.write(`- alpha: ${result.refs.alpha}\n`);
90
+ process.stdout.write(`- release: ${result.refs.release}\n`);
91
+ process.stdout.write(
92
+ `- version files: ${result.versionState.files.join(", ") || "none"}\n`,
93
+ );
94
+ if (result.changedFiles) {
95
+ process.stdout.write(
96
+ `- changed files: ${result.changedFiles.join(", ") || "none"}\n`,
97
+ );
98
+ }
99
+ process.stdout.write(
100
+ result.dryRun
101
+ ? "No refs, branches, PRs, or files were modified.\n"
102
+ : "Version-state files were updated in the working tree.\n",
103
+ );
104
+ }
105
+ return;
106
+ }
107
+ const explainMode = args[0] === "dry-run" || args[0] === "explain";
108
+ const releaseArgs = explainMode ? args.slice(1) : args;
109
+ if (explainMode || readBooleanFlag(args, "dry-run")) {
110
+ const plan = explainReleaseLineDryRun({
111
+ cwd: readFlag(releaseArgs, "cwd", process.cwd()),
112
+ targetRef: readFlag(releaseArgs, "target-ref", ""),
113
+ sourceRef: readFlag(releaseArgs, "source-ref", ""),
114
+ sha: readFlag(releaseArgs, "sha", ""),
115
+ tags: readFlag(releaseArgs, "tags", ""),
116
+ publishTransaction: readBooleanFlag(releaseArgs, "publish-transaction"),
117
+ publishCommand: readFlag(releaseArgs, "publish-command", ""),
118
+ });
119
+ if (readBooleanFlag(releaseArgs, "json")) {
120
+ printJson(plan);
121
+ } else {
122
+ process.stdout.write(formatReleaseLineDryRun(plan));
123
+ }
124
+ return;
125
+ }
126
+ runScript("release-transaction.mjs", args);
127
+ return;
128
+ }
129
+
130
+ async function handleTransactionCommand({ args, runScript, packageVersion }) {
131
+ const [subcommand = "inspect", ...transactionArgs] = args;
132
+ if (subcommand !== "inspect") {
133
+ throw new Error("usage: buildchain transaction inspect ...");
134
+ }
135
+ runScript("release-transaction.mjs", ["inspect", ...transactionArgs]);
136
+ return;
137
+ }
138
+
139
+ async function handleCreateCommand({ args, runScript, packageVersion }) {
140
+ const [subcommand = "", ...createArgs] = args;
141
+ const inputValue = readFlag(createArgs, "input-json", "");
142
+ if (
143
+ !inputValue ||
144
+ ![
145
+ "publication-admission",
146
+ "runner-provenance",
147
+ "github-artifact-attestation-policy",
148
+ ].includes(subcommand)
149
+ ) {
150
+ throw new Error(
151
+ "usage: buildchain create <publication-admission|runner-provenance|github-artifact-attestation-policy> --input-json <file-or-json> [--output <file>]",
152
+ );
153
+ }
154
+ const input = readJsonInput(inputValue, { label: "input-json" });
155
+ const value =
156
+ subcommand === "publication-admission"
157
+ ? createPublicationAdmission(input)
158
+ : subcommand === "runner-provenance"
159
+ ? createRunnerProvenance(input)
160
+ : createGitHubArtifactAttestationPolicy(input);
161
+ const output = readFlag(createArgs, "output", "");
162
+ if (output) writeJsonFile(path.resolve(output), value);
163
+ if (!output || readBooleanFlag(createArgs, "json")) printJson(value);
164
+ else process.stdout.write(`${subcommand}: ${output}\n`);
165
+ return;
166
+ }
167
+
168
+ async function handleCollectCommand({ args, runScript, packageVersion }) {
169
+ const [subcommand = "", ...collectArgs] = args;
170
+ if (subcommand !== "github-release") {
171
+ throw new Error("usage: buildchain collect github-release --tag <tag>");
172
+ }
173
+ const workflow = {
174
+ name: process.env.GITHUB_WORKFLOW || "",
175
+ runId: process.env.GITHUB_RUN_ID || "",
176
+ runAttempt: process.env.GITHUB_RUN_ATTEMPT || "",
177
+ url:
178
+ process.env.GITHUB_SERVER_URL &&
179
+ process.env.GITHUB_REPOSITORY &&
180
+ process.env.GITHUB_RUN_ID
181
+ ? `${process.env.GITHUB_SERVER_URL}/${process.env.GITHUB_REPOSITORY}/actions/runs/${process.env.GITHUB_RUN_ID}`
182
+ : "",
183
+ runnerKind: process.env.BUILDCHAIN_RUNNER_KIND || "github-hosted",
184
+ runnerOs: process.env.RUNNER_OS || process.platform,
185
+ runnerArch: process.env.RUNNER_ARCH || process.arch,
186
+ runnerImage: process.env.ImageOS || "",
187
+ };
188
+ const result = collectGitHubReleasePassport({
189
+ cwd: readFlag(collectArgs, "cwd", process.cwd()),
190
+ tag: readFlag(collectArgs, "tag", ""),
191
+ repository: readFlag(
192
+ collectArgs,
193
+ "repository",
194
+ process.env.GITHUB_REPOSITORY || "",
195
+ ),
196
+ sourceSha: readFlag(
197
+ collectArgs,
198
+ "source-sha",
199
+ process.env.GITHUB_SHA || "",
200
+ ),
201
+ line: readFlag(collectArgs, "line", ""),
202
+ outputDir: readFlag(
203
+ collectArgs,
204
+ "output-dir",
205
+ ".buildchain/release-passport",
206
+ ),
207
+ assetsDir: readFlag(collectArgs, "assets-dir", ""),
208
+ assetsJson: readFlag(collectArgs, "assets-json", ""),
209
+ releaseJson: readFlag(collectArgs, "release-json", ""),
210
+ productName: readFlag(collectArgs, "product-name", "Buildchain"),
211
+ packageName: readFlag(
212
+ collectArgs,
213
+ "package-name",
214
+ "@kungfu-tech/buildchain",
215
+ ),
216
+ packageVersion: readFlag(collectArgs, "package-version", packageVersion()),
217
+ packageSetJson: readFlag(collectArgs, "package-set-json", ""),
218
+ publishEvidenceJson: readFlag(collectArgs, "publish-evidence-json", ""),
219
+ trustedPublishingJson: readFlag(collectArgs, "trusted-publishing-json", ""),
220
+ transactionJson: readFlag(collectArgs, "transaction-json", ""),
221
+ anchorManifestJson: readFlag(collectArgs, "anchor-manifest-json", ""),
222
+ impactJson: readFlag(collectArgs, "impact-json", ""),
223
+ buildSummaryJson: readFlag(collectArgs, "build-summary-json", ""),
224
+ buildFactsJsons: readRepeatedFlag(collectArgs, "build-facts-json"),
225
+ platformManifestJsons: readRepeatedFlag(
226
+ collectArgs,
227
+ "platform-manifest-json",
228
+ ),
229
+ distTagEvidenceJson: readFlag(collectArgs, "dist-tag-evidence-json", ""),
230
+ kfd1WitnessJsons: readRepeatedFlag(collectArgs, "kfd-1-witness-json"),
231
+ kfd2ClaimJsons: readRepeatedFlag(collectArgs, "kfd-2-claim-json"),
232
+ kfd3PrebuildWitnessJsons: readRepeatedFlag(
233
+ collectArgs,
234
+ "kfd-3-prebuild-witness-json",
235
+ ),
236
+ kfd3ArtifactWitnessJsons: readRepeatedFlag(
237
+ collectArgs,
238
+ "kfd-3-artifact-witness-json",
239
+ ),
240
+ kfd3ArtifactVerifyCommand: readFlag(
241
+ collectArgs,
242
+ "kfd-3-artifact-verify-cmd",
243
+ "",
244
+ ),
245
+ kfdSupportMatrixJson: readFlag(collectArgs, "kfd-support-matrix-json", ""),
246
+ kfdProductGateJsons: readRepeatedFlag(collectArgs, "kfd-product-gate-json"),
247
+ invariantPassportJsons: readRepeatedFlag(
248
+ collectArgs,
249
+ "invariant-passport-json",
250
+ ),
251
+ invariantPassportCommand: readFlag(
252
+ collectArgs,
253
+ "invariant-passport-cmd",
254
+ "",
255
+ ),
256
+ releaseEvidenceJsons: readRepeatedFlag(
257
+ collectArgs,
258
+ "release-evidence-json",
259
+ ),
260
+ githubArtifactAttestationPolicyJsons: readRepeatedFlag(
261
+ collectArgs,
262
+ "github-artifact-attestation-policy-json",
263
+ ),
264
+ kfdAgentHubEvidenceJson: readFlag(
265
+ collectArgs,
266
+ "kfd-agent-hub-evidence-json",
267
+ "",
268
+ ),
269
+ basePassportJson: readFlag(collectArgs, "base-passport-json", ""),
270
+ requireBaseKfd: readBooleanFlag(collectArgs, "require-base-kfd"),
271
+ releaseJsonExtra: readFlag(collectArgs, "release-extra-json", ""),
272
+ publishJson: readFlag(collectArgs, "publish-json", ""),
273
+ workflow,
274
+ });
275
+ if (readBooleanFlag(collectArgs, "json")) {
276
+ printJson(result);
277
+ } else {
278
+ process.stdout.write(
279
+ `release passport collected: ${path.relative(process.cwd(), result.outputDir)}\n`,
280
+ );
281
+ process.stdout.write(
282
+ `artifacts: ${result.artifactEvidence.artifacts.length}\n`,
283
+ );
284
+ }
285
+ return;
286
+ }
287
+
288
+ async function handleProjectCommand({ args, runScript, packageVersion }) {
289
+ const [subcommand = "", location = "", ...projectArgs] = args;
290
+ if (subcommand !== "kfx-admission" || !location) {
291
+ throw new Error("usage: buildchain project kfx-admission <file-or-json>");
292
+ }
293
+ const projection = projectArtifactVerificationEnvelopeToKfx({
294
+ envelope: readJsonInput(location, {
295
+ label: "artifact verification envelope",
296
+ }),
297
+ ...artifactEnvelopeOptions(projectArgs),
298
+ });
299
+ if (readBooleanFlag(projectArgs, "json")) {
300
+ printJson(projection);
301
+ } else {
302
+ process.stdout.write(
303
+ `KFX admission envelope: ${projection.envelopeRoot}\n`,
304
+ );
305
+ }
306
+ return;
307
+ }
308
+
309
+ const RELEASE_COMMAND_HANDLERS = Object.freeze({
310
+ release: handleReleaseCommand,
311
+ transaction: handleTransactionCommand,
312
+ create: handleCreateCommand,
313
+ collect: handleCollectCommand,
314
+ project: handleProjectCommand,
315
+ });
316
+
317
+ export { RELEASE_COMMAND_HANDLERS };