@kungfu-tech/buildchain 3.0.3-alpha.0 → 3.0.3-alpha.2
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/AGENTS.md +1 -1
- package/CONTRIBUTING.md +1 -1
- package/README.md +32 -1
- package/actions/promote-buildchain-ref/README.md +90 -19
- package/actions/report-buildchain-issue/README.md +19 -1
- package/actions/run-lifecycle/README.md +5 -0
- package/actions/validate-config/README.md +19 -1
- package/bin/buildchain.mjs +41 -241
- package/bin/internal/command-registry.mjs +82 -0
- package/bin/internal/trust-release-cli.mjs +1 -0
- package/contracts/auditable-demo-media-profiles-v1.json +116 -1
- package/contracts/buildchain-v2-residuals-v1.json +0 -45
- package/contracts/evidence/auditable-demo-responsive-web-delivery-v1.json +143 -0
- package/contracts/evidence/auditable-demo-web-delivery-v1.json +7 -3
- package/contracts/fixtures/auditable-demo-responsive-web-delivery-v1/complete-transcript.txt +2 -0
- package/contracts/fixtures/auditable-demo-responsive-web-delivery-v1/public-projection.json +16 -0
- package/contracts/fixtures/auditable-demo-responsive-web-delivery-v1/scene.json +12 -0
- package/dist/site/buildchain-contract.json +161 -42
- package/dist/site/buildchain-site.json +180 -84
- package/dist/site/capability-registry.json +6 -6
- package/dist/site/cli-registry.json +932 -98
- package/dist/site/controller-registry.json +97 -5
- package/dist/site/kfd-claims.json +316 -23
- package/dist/site/kfd-upstream-aggregate.json +1 -1
- package/dist/site/manual-registry.json +20 -20
- package/dist/site/node-api-registry.json +371 -56
- package/dist/site/page-registry.json +155 -59
- package/dist/site/public-surface-audit.json +286 -24
- package/dist/site/publication-registry.json +4 -4
- package/dist/site/release-provenance.json +3 -0
- package/dist/site/site-manifest.json +24 -24
- package/dist/site/workflow-registry.json +570 -79
- package/docs/MAP.md +22 -4
- package/docs/auditable-demo.md +35 -12
- package/docs/aws-us-elastic-runner-burst-plane.md +381 -0
- package/docs/cli.md +143 -12
- package/docs/consumer-issue-reporting.md +19 -1
- package/docs/github-governance-authority.md +2 -2
- package/docs/lifecycle-protocol.md +20 -2
- package/docs/migration-inventory.md +24 -5
- package/docs/ownership.md +19 -1
- package/docs/publication-artifacts.md +185 -18
- package/docs/publication-authority.md +4 -4
- package/docs/publish-transaction.md +78 -31
- package/docs/release-candidate.md +24 -0
- package/docs/release-flow.md +50 -32
- package/docs/release-governance.md +31 -31
- package/docs/release-passport.md +4 -0
- package/docs/release-propagation.md +57 -12
- package/docs/reusable-build-surface.md +95 -27
- package/docs/runtime-train-validation.md +20 -2
- package/docs/stable-candidate-patrol.md +6 -6
- package/docs/toolkit-observability.md +22 -0
- package/docs/versioning.md +6 -4
- package/docs/web-surface-deployments.md +62 -0
- package/package.json +7 -5
- package/packages/core/README.md +61 -4
- package/packages/core/buildchain-contract.js +8 -4
- package/packages/core/cache-evidence.js +1 -0
- package/packages/core/diagnostics.js +105 -30
- package/packages/core/github-governance-authority.js +10 -25
- package/packages/core/index.js +40 -0
- package/packages/core/paper-fleet.js +260 -0
- package/packages/core/paper-repository.js +210 -0
- package/packages/core/paper-work.js +365 -0
- package/packages/core/paper.js +3180 -0
- package/packages/core/public-surface-audit.js +26 -75
- package/packages/core/public-surface-cli.js +117 -0
- package/packages/core/publication-artifact.js +1 -6
- package/packages/core/publication-authority.js +1 -0
- package/packages/core/publication-reproducibility.js +947 -0
- package/packages/core/publication-sealed-bundle.js +190 -0
- package/packages/core/publish-transaction.js +147 -17
- package/packages/core/release-candidate.js +234 -0
- package/packages/core/release-passport.js +483 -201
- package/packages/core/release-propagation.js +175 -1
- package/scripts/auditable-demo.mjs +119 -5
- package/scripts/aws-codebuild-toolchain.mjs +285 -0
- package/scripts/aws-macos-jit-core.mjs +378 -0
- package/scripts/aws-macos-jit.mjs +123 -0
- package/scripts/aws-runner-burst-core.mjs +248 -0
- package/scripts/aws-runner-burst.mjs +79 -0
- package/scripts/aws-windows-jit-core.mjs +374 -0
- package/scripts/aws-windows-jit.mjs +121 -0
- package/scripts/build-contract-core.mjs +69 -6
- package/scripts/build-standalone-binary.mjs +23 -0
- package/scripts/buildchain-cli-help.mjs +256 -0
- package/scripts/buildchain-contract-lock.mjs +1 -1
- package/scripts/check-internal-architecture.mjs +69 -2
- package/scripts/check-inventory.mjs +69 -2
- package/scripts/check-javascript-syntax.mjs +31 -0
- package/scripts/check-maintainability.mjs +371 -0
- package/scripts/compiler-cache-evidence.mjs +221 -0
- package/scripts/dev-alpha-candidate-patrol.mjs +268 -43
- package/scripts/finalize-native-artifact-signing-result.mjs +75 -4
- package/scripts/generate-channel-promotion-workflow.mjs +3 -12
- package/scripts/generate-release-candidate-passport.mjs +4 -0
- package/scripts/generate-site-bundle.mjs +68 -188
- package/scripts/import-artifact-signing-results.mjs +64 -5
- package/scripts/inspect-artifact-signing-requests.mjs +7 -0
- package/scripts/maintainability-metrics.mjs +339 -0
- package/scripts/npm-publish-transaction.mjs +57 -6
- package/scripts/paper-work-fleet-cli.mjs +563 -0
- package/scripts/paper.mjs +631 -0
- package/scripts/promotion-channel-router.mjs +16 -4
- package/scripts/publication-reproducibility.mjs +62 -0
- package/scripts/release-propagation.mjs +39 -0
- package/scripts/resolve-build-contract.mjs +6 -0
- package/scripts/route-offline-runners.mjs +236 -0
- package/scripts/run-lifecycle-core.mjs +62 -1
- package/scripts/runtime-ref-core.mjs +23 -2
- package/scripts/seal-artifact-signing-requests.mjs +13 -6
- package/scripts/site-capability-metadata.mjs +202 -0
- package/scripts/stable-candidate-qualification.mjs +42 -0
- package/scripts/web-surface-core.mjs +272 -86
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
export const BUILDCHAIN_USAGE = `Usage:
|
|
2
|
+
buildchain --help
|
|
3
|
+
buildchain version
|
|
4
|
+
buildchain layout [--cwd <dir>] [--json]
|
|
5
|
+
buildchain portable-cache plan --manifest <file-or-json> [--output <file>]
|
|
6
|
+
[--github-output <file>] [--json]
|
|
7
|
+
buildchain portable-cache receipt --plan <file-or-json> [--matched-key <key>]
|
|
8
|
+
[--cache-hit true|false]
|
|
9
|
+
[--validation-status pass|fail]
|
|
10
|
+
[--validation-reason <text>]
|
|
11
|
+
[--cold-fallback-status not-run|passed|failed]
|
|
12
|
+
[--output <file>] [--json]
|
|
13
|
+
buildchain candidate timeline --input <file-or-json> [--output <file>] [--json]
|
|
14
|
+
buildchain init [--cwd <dir>] [--type package|native|web-surface|infra-contract|publication-artifact|anchored-package] [--force]
|
|
15
|
+
[--package-manager pnpm|npm|yarn] [--runner-preset <preset>]
|
|
16
|
+
[--artifact-name <template>]
|
|
17
|
+
buildchain validate [--cwd <dir>] [--require-version-state]
|
|
18
|
+
[--require-lifecycle-stages <comma-list>]
|
|
19
|
+
buildchain lifecycle run <stage> [--cwd <dir>] [--required]
|
|
20
|
+
[--artifact-name <name>] [--artifact-path <path>]...
|
|
21
|
+
[--manifest-path <path>] [--summary-path <path>]
|
|
22
|
+
[--process-summary <json>]
|
|
23
|
+
buildchain npm dry-run [--cwd <dir>] [--expected-tag <tag>] [--registry <url>]
|
|
24
|
+
[--dist-tag <tag>] [--skip-npm-publish-dry-run] [--json]
|
|
25
|
+
buildchain release --dry-run --target-ref <ref> [--sha <sha>] [--source-ref <ref>]
|
|
26
|
+
[--tags <comma-list>] [--json]
|
|
27
|
+
buildchain release explain --target-ref <ref> [--sha <sha>] [--source-ref <ref>]
|
|
28
|
+
[--tags <comma-list>] [--json]
|
|
29
|
+
buildchain release dry-run --target-ref <ref> [--sha <sha>] [--source-ref <ref>]
|
|
30
|
+
[--tags <comma-list>] [--json]
|
|
31
|
+
buildchain release line open --major <n> --minor <n> [--source-ref <ref>]
|
|
32
|
+
[--initial-version <version>] [--write] [--json]
|
|
33
|
+
buildchain release-governance reconcile --repository <owner/repo>
|
|
34
|
+
--branch <dev|alpha|release/vN/vN.N>
|
|
35
|
+
--candidate-sha <sha> [--apply] [--json]
|
|
36
|
+
buildchain github-governance <plan|apply|rollback|protection-policy-plan|ruleset-policy-plan> ...
|
|
37
|
+
buildchain release <inspect|recover|finalize|abort> ...
|
|
38
|
+
buildchain transaction inspect ...
|
|
39
|
+
buildchain collect github-release --tag <tag> [--repository <owner/repo>]
|
|
40
|
+
[--assets-dir <dir>] [--assets-json <json-or-path>]
|
|
41
|
+
[--release-json <json-or-path>] [--package-set-json <json-or-path>]
|
|
42
|
+
[--product-name <name>]
|
|
43
|
+
[--publish-evidence-json <json-or-path>]
|
|
44
|
+
[--trusted-publishing-json <json-or-path>]
|
|
45
|
+
[--transaction-json <json-or-path>]
|
|
46
|
+
[--anchor-manifest-json <json-or-path>]
|
|
47
|
+
[--impact-json <json-or-path>]
|
|
48
|
+
[--build-summary-json <json-or-path>]
|
|
49
|
+
[--build-facts-json <json-or-path>]...
|
|
50
|
+
[--platform-manifest-json <json-or-path>]...
|
|
51
|
+
[--dist-tag-evidence-json <json-or-path>]
|
|
52
|
+
[--kfd-1-witness-json <json-or-path>]...
|
|
53
|
+
[--kfd-2-claim-json <json-or-path>]...
|
|
54
|
+
[--kfd-3-prebuild-witness-json <json-or-path>]...
|
|
55
|
+
[--kfd-3-artifact-witness-json <json-or-path>]...
|
|
56
|
+
[--kfd-3-artifact-verify-cmd <command>]
|
|
57
|
+
[--kfd-support-matrix-json <json-or-path>]
|
|
58
|
+
[--kfd-product-gate-json <json-or-path>]...
|
|
59
|
+
[--invariant-passport-json <json-or-path>]...
|
|
60
|
+
[--invariant-passport-cmd <command>]
|
|
61
|
+
[--release-evidence-json <json-or-path>]...
|
|
62
|
+
[--github-artifact-attestation-policy-json <json-or-path>]...
|
|
63
|
+
[--kfd-agent-hub-evidence-json <json-or-path>]
|
|
64
|
+
[--base-passport-json <json-or-path>] [--require-base-kfd]
|
|
65
|
+
[--release-extra-json <json-or-path>]
|
|
66
|
+
[--publish-json <json-or-path>] [--output-dir <dir>] [--json]
|
|
67
|
+
buildchain create publication-admission --input-json <file-or-json> [--output <file>] [--json]
|
|
68
|
+
buildchain create runner-provenance --input-json <file-or-json> [--output <file>] [--json]
|
|
69
|
+
buildchain create github-artifact-attestation-policy --input-json <file-or-json> [--output <file>] [--json]
|
|
70
|
+
buildchain verify release-passport <file-or-url> [--json]
|
|
71
|
+
buildchain verify github-artifact-attestation <artifact>
|
|
72
|
+
--evidence <file> --bundle <file>
|
|
73
|
+
--platform-manifest <file> --release-passport <file> [--json]
|
|
74
|
+
buildchain verify publication-admission <file-or-json>
|
|
75
|
+
--registry-json <file-or-json>
|
|
76
|
+
--runner-json <file-or-json>
|
|
77
|
+
--control-plane-audit-json <file-or-json>
|
|
78
|
+
--publication-evidence-json <file-or-json>
|
|
79
|
+
[--expected-json <file-or-json>] [--used-nonce <nonce>]... [--json]
|
|
80
|
+
buildchain audit publication-control-plane --repository <owner/repo> --branch <protected-branch>
|
|
81
|
+
buildchain audit github-governance [--organization <owner>] [--repository <owner/repo>]
|
|
82
|
+
[--output <file>] [--require-qualifying] [--json]
|
|
83
|
+
[--source-sha <merged-branch-sha>] [--workflow-repository <owner/repo>]
|
|
84
|
+
[--workflow <path>] [--workflow-ref <sha-or-ref>]
|
|
85
|
+
[--job <id>] [--environment <name>] [--package <name>]
|
|
86
|
+
[--publisher-mode npm-trusted-publisher|github-token|oidc-role]
|
|
87
|
+
[--npm-trust-json <file-or-json>]
|
|
88
|
+
[--provider-audit-json <file>] [--output <file>] [--allow-nonqualifying]
|
|
89
|
+
buildchain verify artifact <file|dir|url|npm:...|oci:...|github-release:...>
|
|
90
|
+
[--passport <file-or-url>] [--locator-config <json>]
|
|
91
|
+
[--repository <owner/repo>] [--tag <tag>]
|
|
92
|
+
[--npm-registry <url>] [--json]
|
|
93
|
+
buildchain verify artifact-envelope <file-or-json> [--assessment-time <epoch>]
|
|
94
|
+
[--expected-root <sha256:...>] [--expected-issuer <issuer>]
|
|
95
|
+
[--expected-publisher <publisher>]
|
|
96
|
+
[--expected-contract <version>] [--json]
|
|
97
|
+
buildchain project kfx-admission <file-or-json> [--assessment-time <epoch>]
|
|
98
|
+
[--expected-root <sha256:...>] [--expected-issuer <issuer>]
|
|
99
|
+
[--expected-publisher <publisher>]
|
|
100
|
+
[--expected-contract <version>] [--json]
|
|
101
|
+
buildchain verify infra-contract-evidence-bundle <file> [--json]
|
|
102
|
+
buildchain verify observability-log <jsonl> [--min-events <n>]
|
|
103
|
+
[--require-phase <csv>]
|
|
104
|
+
[--require-component <csv>]
|
|
105
|
+
[--require-event <csv>] [--allow-errors] [--json]
|
|
106
|
+
buildchain explain release --passport <file-or-url> [--for human|agent] [--json]
|
|
107
|
+
buildchain explain artifact <subject> [--passport <file-or-url>] [--npm-registry <url>] [--for human|agent] [--json]
|
|
108
|
+
buildchain inspect release --passport <file-or-url> [--json]
|
|
109
|
+
buildchain inspect artifact <subject> [--passport <file-or-url>] [--npm-registry <url>] [--json]
|
|
110
|
+
buildchain doctor [--cwd <dir>] [--require-publish-source-lock] [--json]
|
|
111
|
+
buildchain dev merge-queue --repository <owner/repo> --branch <dev/vN/vN.M>
|
|
112
|
+
[--from-config | --workflow <required-workflow.yml>...] [--cwd <dir>]
|
|
113
|
+
[--check-response-timeout-minutes <n>]
|
|
114
|
+
[--max-entries-to-build <n>] [--apply]
|
|
115
|
+
buildchain log <info|warn|error> --event <name> [--phase <phase>]
|
|
116
|
+
[--component <name>] [--source <name>] [--attribute key=value]...
|
|
117
|
+
[--path <jsonl>] [--json]
|
|
118
|
+
buildchain log summary [--path <jsonl>] [--json]
|
|
119
|
+
buildchain diagnostics summary <diagnostics.json>... [--artifact <file>]...
|
|
120
|
+
[--output <file>] [--json]
|
|
121
|
+
buildchain facts module [--cwd <dir>] [--module <id>] [--module-root <path>]
|
|
122
|
+
[--version-source <id>] [--output <file>]
|
|
123
|
+
[--output-path <path>]... [--legacy-kungfu-buildinfo <file>] [--json]
|
|
124
|
+
buildchain facts aggregate [--cwd <dir>] [--product <id>]
|
|
125
|
+
[--module-fact <file>]... [--artifact <path>]...
|
|
126
|
+
[--output <file>] [--json]
|
|
127
|
+
buildchain facts verify [--cwd <dir>] --fact <file> [--json]
|
|
128
|
+
buildchain kfd ...
|
|
129
|
+
buildchain kfd hub <init|inspect|test|explain> [--cwd <dir>]
|
|
130
|
+
[--declaration <path>] [--output-dir <path>]
|
|
131
|
+
[--write] [--force] [--for agent] [--json]
|
|
132
|
+
buildchain kfd status [--cwd <dir>] [--json]
|
|
133
|
+
buildchain kfd migrate-layout [--cwd <dir>] [--write] [--force] [--json]
|
|
134
|
+
buildchain kfd schema list [--standard kfd-1|kfd-2|kfd-3|kfd-4] [--json]
|
|
135
|
+
buildchain kfd schema show <kfd-1|kfd-2|kfd-3|kfd-4> [--schema <name>] [--json]
|
|
136
|
+
buildchain kfd upstream roles [--json]
|
|
137
|
+
buildchain kfd upstream collect [--cwd <dir>] [--output <file>] [--json]
|
|
138
|
+
buildchain kfd upstream check [--cwd <dir>] [--aggregate-json <file-or-json>] [--json]
|
|
139
|
+
buildchain kfd aggregate [--cwd <dir>] [--json]
|
|
140
|
+
buildchain kfd 1 schema [--schema <name>] [--json]
|
|
141
|
+
buildchain kfd 1 witness [--cwd <dir>] [--source-sha <sha>] [--output <file>] [--json]
|
|
142
|
+
buildchain kfd 1 gate --witness-json <file-or-json>... [--cwd <dir>] [--artifact-root <dir>]
|
|
143
|
+
[--output <file>] [--json]
|
|
144
|
+
buildchain kfd 1 verify --gate-json <file-or-json> [--json]
|
|
145
|
+
buildchain kfd 2 schema [--schema <name>] [--json]
|
|
146
|
+
buildchain kfd 2 taxonomy --entry-json <file-or-json>... [--kind residualRisk|downgradeReason] [--json]
|
|
147
|
+
buildchain kfd 2 claims [--cwd <dir>] [--output-dir <dir>] [--json]
|
|
148
|
+
buildchain kfd 2 product-claims <check|write|render> [--cwd <dir>] [--registry <path>]
|
|
149
|
+
[--output-dir <dir>] [--version <version>]
|
|
150
|
+
[--channel <channel>] [--tag <tag>] [--source-sha <sha>] [--json]
|
|
151
|
+
buildchain kfd 2 trust-claims [--claims-json <file-or-json>] [--json]
|
|
152
|
+
buildchain kfd 2 trust-assessment [--assessment-json <file-or-json>] [--json]
|
|
153
|
+
buildchain kfd 3 ...
|
|
154
|
+
buildchain kfd 3 detect [--cwd <dir>] [--kind <kind>]... [--artifact <path>] [--json]
|
|
155
|
+
buildchain kfd 3 register <node-api|python-api|cli|binary|documentation|site-bundle>
|
|
156
|
+
[--cwd <dir>] [--registry <path>] [--artifact <path>]
|
|
157
|
+
[--product <name>] [--json]
|
|
158
|
+
buildchain kfd 3 audit [--cwd <dir>] [--registry <path>] [--artifact <path>] [--json]
|
|
159
|
+
buildchain kfd 3 witness [--cwd <dir>] [--registry <path>] [--kind prebuild|artifact]
|
|
160
|
+
[--source-sha <sha>] [--artifact <path>] [--output <file>] [--json]
|
|
161
|
+
buildchain kfd 3 query [<product>] [--cwd <dir>] [--registry <path>]
|
|
162
|
+
[--passport <file-or-url>] [--artifact <path>] [--json]
|
|
163
|
+
buildchain kfd 4 schema [--schema <name>] [--json]
|
|
164
|
+
buildchain kfd 4 gate --input-json <file-or-json> [--cwd <dir>] [--output <file>] [--json]
|
|
165
|
+
buildchain kfd 4 verify --gate-json <file-or-json> [--expected-source-sha <sha>] [--json]
|
|
166
|
+
buildchain kfd 5 schema [--schema <name>] [--json]
|
|
167
|
+
buildchain kfd 5 gate --input-json <file-or-json> [--cwd <dir>] [--output <file>] [--json]
|
|
168
|
+
buildchain kfd 5 verify --gate-json <file-or-json> [--expected-source-sha <sha>] [--json]
|
|
169
|
+
buildchain kfd 7 schema [--schema <name>] [--json]
|
|
170
|
+
buildchain kfd 7 gate --input-json <file-or-json> [--cwd <dir>] [--output <file>] [--json]
|
|
171
|
+
buildchain kfd 7 verify --gate-json <file-or-json> [--expected-source-sha <sha>] [--json]
|
|
172
|
+
buildchain kfd support project --matrix-json <file-or-json> --gate-json <file-or-json>...
|
|
173
|
+
[--expected-source-sha <sha>] [--checked-at <date-time>]
|
|
174
|
+
[--output <file>] [--json]
|
|
175
|
+
buildchain kfd support verify --projection-json <file-or-json>
|
|
176
|
+
[--expected-source-sha <sha>] [--checked-at <date-time>] [--json]
|
|
177
|
+
buildchain sample process-tree [--interval-ms <n>] [--label <name>]
|
|
178
|
+
[--output <jsonl>] [--summary-output <json>]
|
|
179
|
+
[--requested-parallelism <n>] [--json]
|
|
180
|
+
-- <command> [args...]
|
|
181
|
+
buildchain mark --event <name> [--phase <phase>] [--component <name>]
|
|
182
|
+
[--attribute key=value]... [--path <jsonl>] [--json]
|
|
183
|
+
buildchain span --event <name> [--phase <phase>] [--component <name>]
|
|
184
|
+
[--path <jsonl>] -- <command> [args...]
|
|
185
|
+
buildchain web-surface ...
|
|
186
|
+
buildchain infra-contract ...
|
|
187
|
+
buildchain publication-artifact manifest [--cwd <dir>] [--source-sha <sha>]
|
|
188
|
+
[--output <file>] [--passport-output <file>]
|
|
189
|
+
[--registry-output <file>] [--source-bundle <file>]
|
|
190
|
+
[--no-source-bundle] [--json]
|
|
191
|
+
buildchain publication-artifact npm-package [--cwd <dir>] [--output-dir <dir>] [--package-name <name>] [--json]
|
|
192
|
+
buildchain publication-artifact reproducibility [--cwd <dir>] [--source-sha <sha>]
|
|
193
|
+
[--output <file>] [--promote]
|
|
194
|
+
[--no-toolchain-pull]
|
|
195
|
+
[--allow-unpinned-toolchain] [--json]
|
|
196
|
+
buildchain paper scaffold --package <name> --repository <owner/repo> [--write] [--json]
|
|
197
|
+
buildchain paper migrate [--cwd <dir>] [--write] [--json]
|
|
198
|
+
buildchain paper work start <topic> [--cwd <dir>] [--branch <branch>] [--execute] [--json]
|
|
199
|
+
buildchain paper work submit [--cwd <dir>] [--title <title>] [--body <body>] [--execute] [--json]
|
|
200
|
+
buildchain paper fleet audit [--root <dir>] [--offline] [--json]
|
|
201
|
+
buildchain paper fleet update [--root <dir>] [--write] [--json]
|
|
202
|
+
buildchain paper preflight [--cwd <dir>] [--offline] [--json]
|
|
203
|
+
buildchain paper bootstrap npm [--cwd <dir>] [--execute]
|
|
204
|
+
[--confirm-public-package <name>] [--json]
|
|
205
|
+
buildchain paper build [--cwd <dir>] [--execute] [--json]
|
|
206
|
+
buildchain paper alpha [--cwd <dir>] [--source-ref <ref>] [--target-ref <ref>]
|
|
207
|
+
[--execute] [--json]
|
|
208
|
+
buildchain paper status [--cwd <dir>] [--json]
|
|
209
|
+
buildchain paper resume [--cwd <dir>] [--buildchain-ref <ref>] [--execute] [--json]
|
|
210
|
+
buildchain release-propagation <plan|write-lock> ...
|
|
211
|
+
buildchain badges readme [--cwd <dir>] [--readme <path>] [--check] [--write] [--json]
|
|
212
|
+
buildchain badges bundle [--cwd <dir>] [--readme <path>] [--claims <csv>] [--check] [--write] [--json]
|
|
213
|
+
buildchain homebrew update-formula --package <name> --release-passport <file-or-url> [--write] [--json]
|
|
214
|
+
buildchain homebrew check [--cwd <dir>] [--package <name>] [--release-passport <file-or-url>] [--json]
|
|
215
|
+
buildchain publish-source <lock|manifest|verify-lock|verify-channel-ref|validate-anchored-release> ...
|
|
216
|
+
buildchain build-contract ...
|
|
217
|
+
|
|
218
|
+
Examples:
|
|
219
|
+
buildchain init --type package --package-manager pnpm
|
|
220
|
+
buildchain validate --require-version-state --require-lifecycle-stages build,verify
|
|
221
|
+
buildchain lifecycle run build --artifact-path dist --artifact-name "{repo}-{version}-{platform}"
|
|
222
|
+
buildchain npm dry-run --json
|
|
223
|
+
buildchain release --dry-run --target-ref alpha/v3/v3.0
|
|
224
|
+
buildchain release line open --major 3 --minor 1 --source-ref release/v3/v3.0 --json
|
|
225
|
+
buildchain span --event native.build -- cmake --build build
|
|
226
|
+
buildchain collect github-release --tag v3.0.0 --assets-dir dist --output-dir .buildchain/release-passport
|
|
227
|
+
buildchain create publication-admission --input-json admission-input.json --output admission.json
|
|
228
|
+
buildchain create runner-provenance --input-json runner-input.json --output runner.json
|
|
229
|
+
buildchain verify release-passport .buildchain/release-passport/buildchain.release.json
|
|
230
|
+
buildchain verify publication-admission admission.json --registry-json publication-authority-registry.json --runner-json runner.json --control-plane-audit-json control-plane.json --expected-json expected.json --json
|
|
231
|
+
buildchain audit publication-control-plane --repository kungfu-systems/buildchain --branch release/v3/v3.0
|
|
232
|
+
buildchain verify artifact ./dist/buildchain-x86_64-unknown-linux-gnu.tar.gz --passport .buildchain/release-passport/buildchain.release.json
|
|
233
|
+
buildchain verify artifact-envelope .buildchain/kfx/artifact-verification-envelope.json --json
|
|
234
|
+
buildchain project kfx-admission .buildchain/kfx/artifact-verification-envelope.json --json
|
|
235
|
+
buildchain verify infra-contract-evidence-bundle .buildchain/infra-contract-evidence-bundle.json
|
|
236
|
+
buildchain verify observability-log .buildchain/logs/events.jsonl --min-events 4 --require-phase build
|
|
237
|
+
buildchain infra-contract --mode plan --source-sha <sha>
|
|
238
|
+
buildchain infra-contract --mode ci --source-sha <sha>
|
|
239
|
+
buildchain infra-contract --mode plan --source-sha <sha> --execute-adapter-commands true
|
|
240
|
+
buildchain infra-contract --mode apply --plan <plan.json> --source-sha <sha> --approval-id <id>
|
|
241
|
+
buildchain infra-contract --mode apply --plan <plan.json> --source-sha <sha> --approval-id <id> --dry-run false --execute-adapter-commands true
|
|
242
|
+
buildchain infra-contract --mode propagation-apply --propagation-plan <plan.json> --dry-run true
|
|
243
|
+
buildchain infra-contract --mode evidence-bundle --artifact <artifact.json> --propagation-result <result.json>
|
|
244
|
+
buildchain publication-artifact manifest --source-sha <sha> --json
|
|
245
|
+
buildchain paper preflight --json
|
|
246
|
+
buildchain paper status --json
|
|
247
|
+
buildchain release-propagation plan --graph graph.json --upstream-release release.json --json
|
|
248
|
+
buildchain kfd status --json
|
|
249
|
+
buildchain kfd schema list --json
|
|
250
|
+
buildchain kfd 1 witness --json
|
|
251
|
+
buildchain kfd 2 claims --json
|
|
252
|
+
buildchain kfd 2 trust-assessment --json
|
|
253
|
+
buildchain kfd upstream collect --json
|
|
254
|
+
buildchain kfd aggregate --json
|
|
255
|
+
buildchain kfd 3 query buildchain --json
|
|
256
|
+
`;
|
|
@@ -131,7 +131,7 @@ export function writeBuildchainContractLock({
|
|
|
131
131
|
output = env("BUILDCHAIN_CONTRACT_LOCK_PATH", BUILDCHAIN_CONTRACT_LOCK_PATH),
|
|
132
132
|
currentContractPath = env("BUILDCHAIN_CONTRACT_CURRENT_PATH", "dist/site/buildchain-contract.json"),
|
|
133
133
|
runtimeRoot = env("BUILDCHAIN_RUNTIME_ROOT", process.cwd()),
|
|
134
|
-
buildchainRef = env("BUILDCHAIN_RUNTIME_REF", "
|
|
134
|
+
buildchainRef = env("BUILDCHAIN_RUNTIME_REF", "v3"),
|
|
135
135
|
resolvedSha = env("BUILDCHAIN_RUNTIME_SHA"),
|
|
136
136
|
compatibilityPolicy = env("BUILDCHAIN_CONTRACT_COMPATIBILITY_POLICY", "major-compatible"),
|
|
137
137
|
acceptedAt = env("BUILDCHAIN_CONTRACT_ACCEPTED_AT") || new Date().toISOString(),
|
|
@@ -42,6 +42,52 @@ function resolveImportTarget(root, sourcePath, specifier) {
|
|
|
42
42
|
return normalizeRelative(root, absolute);
|
|
43
43
|
}
|
|
44
44
|
|
|
45
|
+
function resolveGraphTarget(root, sourcePath, specifier, implementationPaths) {
|
|
46
|
+
const target = resolveImportTarget(root, sourcePath, specifier);
|
|
47
|
+
return [
|
|
48
|
+
target,
|
|
49
|
+
`${target}.js`,
|
|
50
|
+
`${target}.mjs`,
|
|
51
|
+
`${target}.cjs`,
|
|
52
|
+
`${target}/index.js`,
|
|
53
|
+
`${target}/index.mjs`,
|
|
54
|
+
].find((candidate) => implementationPaths.has(candidate));
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function dependencyCycles(graph) {
|
|
58
|
+
const cycles = [];
|
|
59
|
+
const visited = new Set();
|
|
60
|
+
const active = new Set();
|
|
61
|
+
const stack = [];
|
|
62
|
+
const canonical = new Set();
|
|
63
|
+
const visit = (node) => {
|
|
64
|
+
if (active.has(node)) {
|
|
65
|
+
const start = stack.indexOf(node);
|
|
66
|
+
const cycle = [...stack.slice(start), node];
|
|
67
|
+
const members = cycle.slice(0, -1);
|
|
68
|
+
const rotations = members.map((_, index) => [
|
|
69
|
+
...members.slice(index),
|
|
70
|
+
...members.slice(0, index),
|
|
71
|
+
].join(" -> "));
|
|
72
|
+
const key = rotations.sort()[0];
|
|
73
|
+
if (!canonical.has(key)) {
|
|
74
|
+
canonical.add(key);
|
|
75
|
+
cycles.push(cycle);
|
|
76
|
+
}
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
if (visited.has(node)) return;
|
|
80
|
+
visited.add(node);
|
|
81
|
+
active.add(node);
|
|
82
|
+
stack.push(node);
|
|
83
|
+
for (const target of graph.get(node) || []) visit(target);
|
|
84
|
+
stack.pop();
|
|
85
|
+
active.delete(node);
|
|
86
|
+
};
|
|
87
|
+
for (const node of [...graph.keys()].sort()) visit(node);
|
|
88
|
+
return cycles;
|
|
89
|
+
}
|
|
90
|
+
|
|
45
91
|
function assertIndexShape(index) {
|
|
46
92
|
if (index?.schemaVersion !== 1) {
|
|
47
93
|
throw new Error("internal architecture index schemaVersion must be 1");
|
|
@@ -74,6 +120,9 @@ function checkInternalArchitecture({
|
|
|
74
120
|
continue;
|
|
75
121
|
}
|
|
76
122
|
capabilityIds.add(capability.id);
|
|
123
|
+
if (!capability.owner || typeof capability.owner !== "string") {
|
|
124
|
+
issues.push(`${capability.id}: owner is empty`);
|
|
125
|
+
}
|
|
77
126
|
if (!Array.isArray(capability.implementation) || capability.implementation.length === 0) {
|
|
78
127
|
issues.push(`${capability.id}: implementation mapping is empty`);
|
|
79
128
|
}
|
|
@@ -139,6 +188,22 @@ function checkInternalArchitecture({
|
|
|
139
188
|
}
|
|
140
189
|
}
|
|
141
190
|
|
|
191
|
+
const graph = new Map([...expectedImplementation].map((file) => [file, new Set()]));
|
|
192
|
+
for (const sourcePath of expectedImplementation) {
|
|
193
|
+
if (![".js", ".mjs", ".cjs"].includes(path.extname(sourcePath))) continue;
|
|
194
|
+
const source = sourceOverrides.has(sourcePath)
|
|
195
|
+
? sourceOverrides.get(sourcePath)
|
|
196
|
+
: fs.readFileSync(path.resolve(root, sourcePath), "utf8");
|
|
197
|
+
for (const specifier of relativeImports(source)) {
|
|
198
|
+
const target = resolveGraphTarget(root, sourcePath, specifier, expectedImplementation);
|
|
199
|
+
if (target) graph.get(sourcePath).add(target);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
const cycles = dependencyCycles(graph);
|
|
203
|
+
for (const cycle of cycles) {
|
|
204
|
+
issues.push(`internal dependency cycle: ${cycle.join(" -> ")}`);
|
|
205
|
+
}
|
|
206
|
+
|
|
142
207
|
if (issues.length > 0) {
|
|
143
208
|
throw new Error(
|
|
144
209
|
`internal architecture check failed:\n- ${issues.join("\n- ")}`,
|
|
@@ -149,6 +214,7 @@ function checkInternalArchitecture({
|
|
|
149
214
|
capabilities: index.capabilities.length,
|
|
150
215
|
implementations: expectedImplementation.size,
|
|
151
216
|
dependencyRules: index.dependencyRules.length,
|
|
217
|
+
dependencyCycles: cycles.length,
|
|
152
218
|
};
|
|
153
219
|
}
|
|
154
220
|
|
|
@@ -160,7 +226,8 @@ if (
|
|
|
160
226
|
const report = checkInternalArchitecture();
|
|
161
227
|
console.log(
|
|
162
228
|
`internal architecture check passed: ${report.capabilities} capabilities, ` +
|
|
163
|
-
`${report.implementations} implementations, ${report.dependencyRules} dependency rules
|
|
229
|
+
`${report.implementations} implementations, ${report.dependencyRules} dependency rules, ` +
|
|
230
|
+
`${report.dependencyCycles} cycles`,
|
|
164
231
|
);
|
|
165
232
|
} catch (error) {
|
|
166
233
|
console.error(error instanceof Error ? error.message : String(error));
|
|
@@ -168,4 +235,4 @@ if (
|
|
|
168
235
|
}
|
|
169
236
|
}
|
|
170
237
|
|
|
171
|
-
export { checkInternalArchitecture, relativeImports };
|
|
238
|
+
export { checkInternalArchitecture, dependencyCycles, relativeImports };
|
|
@@ -56,6 +56,9 @@ const requiredPaths = [
|
|
|
56
56
|
"packages/core/anchored-version-material.js",
|
|
57
57
|
"packages/core/build-facts.js",
|
|
58
58
|
"packages/core/publication-package.js",
|
|
59
|
+
"packages/core/publication-reproducibility.js",
|
|
60
|
+
"packages/core/publication-sealed-bundle.js",
|
|
61
|
+
"packages/core/paper.js",
|
|
59
62
|
"packages/core/release-line-bootstrap.js",
|
|
60
63
|
"packages/core/public-surface-audit.js",
|
|
61
64
|
"docs/MAP.md",
|
|
@@ -73,10 +76,14 @@ const requiredPaths = [
|
|
|
73
76
|
"docs/auditable-demo.md",
|
|
74
77
|
"contracts/auditable-demo-media-profiles-v1.json",
|
|
75
78
|
"contracts/evidence/auditable-demo-web-delivery-v1.json",
|
|
79
|
+
"contracts/evidence/auditable-demo-responsive-web-delivery-v1.json",
|
|
76
80
|
"contracts/buildchain-v2-residuals-v1.json",
|
|
77
81
|
"contracts/fixtures/auditable-demo-web-delivery-v1/complete-transcript.txt",
|
|
78
82
|
"contracts/fixtures/auditable-demo-web-delivery-v1/public-projection.json",
|
|
79
83
|
"contracts/fixtures/auditable-demo-web-delivery-v1/scene.json",
|
|
84
|
+
"contracts/fixtures/auditable-demo-responsive-web-delivery-v1/complete-transcript.txt",
|
|
85
|
+
"contracts/fixtures/auditable-demo-responsive-web-delivery-v1/public-projection.json",
|
|
86
|
+
"contracts/fixtures/auditable-demo-responsive-web-delivery-v1/scene.json",
|
|
80
87
|
"docs/release-propagation.md",
|
|
81
88
|
"docs/site-bundle-contract.md",
|
|
82
89
|
"docs/toolkit-observability.md",
|
|
@@ -102,8 +109,10 @@ const requiredPaths = [
|
|
|
102
109
|
"scripts/anchored-version-material.mjs",
|
|
103
110
|
"scripts/npm-publish-dry-run.mjs",
|
|
104
111
|
"scripts/npm-publish-transaction.mjs",
|
|
112
|
+
"scripts/paper.mjs",
|
|
105
113
|
"scripts/publication-package.mjs",
|
|
106
114
|
"scripts/publication-commit-evidence.mjs",
|
|
115
|
+
"scripts/publication-reproducibility.mjs",
|
|
107
116
|
"scripts/release-candidate-resolver.mjs",
|
|
108
117
|
"scripts/buildchain-patrol.mjs",
|
|
109
118
|
"scripts/observed-evidence.mjs",
|
|
@@ -114,6 +123,7 @@ const requiredPaths = [
|
|
|
114
123
|
"docs/observed-evidence-patrol.md",
|
|
115
124
|
"docs/ownership.md",
|
|
116
125
|
"tests/buildchain-inventory.json",
|
|
126
|
+
"tests/paper.test.mjs",
|
|
117
127
|
".buildchain/buildchain.toml",
|
|
118
128
|
".buildchain/contract-lock.json",
|
|
119
129
|
".buildchain/alpha-contract-lock.json",
|
|
@@ -261,12 +271,19 @@ for (const requiredSnippet of [
|
|
|
261
271
|
`/${promotionShellRouting.stable.workflowPath}@${promotionShellRouting.stable.callRef}`,
|
|
262
272
|
`STABLE_SHELL_REF: v${selfDogfoodMajor}`,
|
|
263
273
|
"promotion-contract-lock-digest:",
|
|
264
|
-
"promotion
|
|
274
|
+
"authorize-promotion-runtime-override.cjs",
|
|
265
275
|
]) {
|
|
266
276
|
if (!channelPromotionWorkflow.includes(requiredSnippet)) {
|
|
267
277
|
throw new Error(`channel promotion workflow missing routing contract: ${requiredSnippet}`);
|
|
268
278
|
}
|
|
269
279
|
}
|
|
280
|
+
const promotionOverrideAuthorization = fs.readFileSync(
|
|
281
|
+
path.join(root, "scripts/authorize-promotion-runtime-override.cjs"),
|
|
282
|
+
"utf8",
|
|
283
|
+
);
|
|
284
|
+
if (!promotionOverrideAuthorization.includes("promotion runtime override is only allowed for trusted workflow_dispatch runs")) {
|
|
285
|
+
throw new Error("promotion runtime override authorization must remain fail closed");
|
|
286
|
+
}
|
|
270
287
|
for (const requiredSnippet of [
|
|
271
288
|
"buildchain-channel:",
|
|
272
289
|
"uses: ./.github/workflows/.build.yml",
|
|
@@ -383,6 +400,9 @@ if (rootPackage.exports?.["./buildchain-kfd-claims"] !== "./packages/core/buildc
|
|
|
383
400
|
if (rootPackage.exports?.["./public-surface-audit"] !== "./packages/core/public-surface-audit.js") {
|
|
384
401
|
throw new Error("root package must export @kungfu-tech/buildchain/public-surface-audit");
|
|
385
402
|
}
|
|
403
|
+
if (rootPackage.exports?.["./paper"] !== "./packages/core/paper.js") {
|
|
404
|
+
throw new Error("root package must export @kungfu-tech/buildchain/paper");
|
|
405
|
+
}
|
|
386
406
|
if (rootPackage.exports?.["./site/buildchain-site.json"] !== "./dist/site/buildchain-site.json") {
|
|
387
407
|
throw new Error("root package must export @kungfu-tech/buildchain/site/buildchain-site.json");
|
|
388
408
|
}
|
|
@@ -647,16 +667,60 @@ for (const manual of manualRegistry.manuals || []) {
|
|
|
647
667
|
}
|
|
648
668
|
}
|
|
649
669
|
const cliRegistry = JSON.parse(fs.readFileSync(path.join(root, "dist/site/cli-registry.json"), "utf8"));
|
|
670
|
+
const requiredPublicLifecycleFields = [
|
|
671
|
+
"owner",
|
|
672
|
+
"maturity",
|
|
673
|
+
"introducedVersion",
|
|
674
|
+
"compatibilityPromise",
|
|
675
|
+
"deprecationReplacement",
|
|
676
|
+
"sunsetCondition",
|
|
677
|
+
"capabilityGroup",
|
|
678
|
+
"nonDuplicationRationale",
|
|
679
|
+
];
|
|
680
|
+
function assertPublicLifecycle(entry, label) {
|
|
681
|
+
for (const field of requiredPublicLifecycleFields) {
|
|
682
|
+
if (!Object.prototype.hasOwnProperty.call(entry, field) || typeof entry[field] !== "string") {
|
|
683
|
+
throw new Error(`${label} missing public lifecycle field: ${field}`);
|
|
684
|
+
}
|
|
685
|
+
}
|
|
686
|
+
if (!entry.owner || !entry.maturity || !entry.introducedVersion || !entry.compatibilityPromise || !entry.sunsetCondition || !entry.nonDuplicationRationale) {
|
|
687
|
+
throw new Error(`${label} has incomplete public lifecycle metadata`);
|
|
688
|
+
}
|
|
689
|
+
}
|
|
650
690
|
for (const command of cliRegistry.commands || []) {
|
|
651
691
|
if (!command.capabilityGroup || !capabilityGroupIds.has(command.capabilityGroup) || !Array.isArray(command.audience) || !command.maturity || !command.purpose || command.purpose.includes("Add a specific purpose")) {
|
|
652
692
|
throw new Error(`cli-registry.json command missing capability metadata: ${command.id || command.usage}`);
|
|
653
693
|
}
|
|
694
|
+
assertPublicLifecycle(command, `cli-registry.json command ${command.id || command.usage}`);
|
|
654
695
|
}
|
|
655
696
|
const nodeApiRegistry = JSON.parse(fs.readFileSync(path.join(root, "dist/site/node-api-registry.json"), "utf8"));
|
|
656
697
|
for (const exported of nodeApiRegistry.exports || []) {
|
|
657
698
|
if (!exported.capabilityGroup || !capabilityGroupIds.has(exported.capabilityGroup) || !Array.isArray(exported.audience) || !exported.maturity || !exported.summary) {
|
|
658
699
|
throw new Error(`node-api-registry.json export missing capability metadata: ${exported.export || exported.specifier}`);
|
|
659
700
|
}
|
|
701
|
+
assertPublicLifecycle(exported, `node-api-registry.json export ${exported.export || exported.specifier}`);
|
|
702
|
+
}
|
|
703
|
+
const workflowRegistry = JSON.parse(fs.readFileSync(path.join(root, "dist/site/workflow-registry.json"), "utf8"));
|
|
704
|
+
for (const workflow of workflowRegistry.workflows || []) {
|
|
705
|
+
assertPublicLifecycle(workflow, `workflow-registry.json workflow ${workflow.id || workflow.path}`);
|
|
706
|
+
}
|
|
707
|
+
for (const action of workflowRegistry.actions || []) {
|
|
708
|
+
assertPublicLifecycle(action, `workflow-registry.json action ${action.id || action.path}`);
|
|
709
|
+
}
|
|
710
|
+
const registeredActionIds = (workflowRegistry.actions || []).map((entry) => entry.id).sort();
|
|
711
|
+
const readmeActionIndex = fs.readFileSync(path.join(root, "README.md"), "utf8");
|
|
712
|
+
const mapActionIndex = fs.readFileSync(path.join(root, "docs/MAP.md"), "utf8");
|
|
713
|
+
const retrospectiveActionIndex = fs.readFileSync(path.join(root, ".github/retrospectives/2026-07-10-buildchain-consolidation.md"), "utf8");
|
|
714
|
+
if (registeredActionIds.length !== 6) {
|
|
715
|
+
throw new Error(`workflow-registry.json must expose the six current action entries, got ${registeredActionIds.length}`);
|
|
716
|
+
}
|
|
717
|
+
for (const actionId of registeredActionIds) {
|
|
718
|
+
if (!readmeActionIndex.includes(`actions/${actionId}`) || !mapActionIndex.includes(`actions/${actionId}`)) {
|
|
719
|
+
throw new Error(`README and docs/MAP.md must index registered action: ${actionId}`);
|
|
720
|
+
}
|
|
721
|
+
}
|
|
722
|
+
if (!retrospectiveActionIndex.includes("snapshot of the four consumer-facing actions")) {
|
|
723
|
+
throw new Error("the v2 four-action retrospective must remain explicitly classified as historical");
|
|
660
724
|
}
|
|
661
725
|
if (!pageRegistry.pages?.some((page) => page.sourcePath === "actions/promote-buildchain-ref/README.md")) {
|
|
662
726
|
throw new Error("page-registry.json must include action manuals");
|
|
@@ -1069,7 +1133,10 @@ if (commonJsSourcePattern.test(npmDryRunScript)) {
|
|
|
1069
1133
|
}
|
|
1070
1134
|
for (const requiredSnippet of [
|
|
1071
1135
|
"BUILDCHAIN_PUBLISH_EVIDENCE",
|
|
1072
|
-
"
|
|
1136
|
+
"BUILDCHAIN_SEALED_NPM_TARBALL",
|
|
1137
|
+
"...(pack.tarballPath ? [pack.tarballPath] : [])",
|
|
1138
|
+
"\"--access\"",
|
|
1139
|
+
"\"--tag\"",
|
|
1073
1140
|
"artifact digest mismatch",
|
|
1074
1141
|
]) {
|
|
1075
1142
|
if (!npmPublishTransactionScript.includes(requiredSnippet)) {
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { execFileSync, spawnSync } from "node:child_process";
|
|
5
|
+
|
|
6
|
+
const root = process.cwd();
|
|
7
|
+
const files = execFileSync(
|
|
8
|
+
"git",
|
|
9
|
+
["ls-files", "--cached", "--others", "--exclude-standard"],
|
|
10
|
+
{ cwd: root, encoding: "utf8" },
|
|
11
|
+
)
|
|
12
|
+
.split("\n")
|
|
13
|
+
.filter((file) => [".js", ".mjs", ".cjs"].includes(path.extname(file)))
|
|
14
|
+
.filter((file) => !/^actions\/[^/]+\/dist\//u.test(file))
|
|
15
|
+
.sort();
|
|
16
|
+
|
|
17
|
+
const failures = [];
|
|
18
|
+
for (const file of files) {
|
|
19
|
+
const result = spawnSync(process.execPath, ["--check", file], {
|
|
20
|
+
cwd: root,
|
|
21
|
+
encoding: "utf8",
|
|
22
|
+
});
|
|
23
|
+
if (result.status !== 0) {
|
|
24
|
+
failures.push(`${file}: ${(result.stderr || result.stdout).trim()}`);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
if (failures.length > 0) {
|
|
29
|
+
throw new Error(`JavaScript syntax check failed:\n${failures.join("\n")}`);
|
|
30
|
+
}
|
|
31
|
+
console.log(`JavaScript syntax check passed: ${files.length} files`);
|