@kungfu-tech/buildchain 4.0.2-alpha.26 → 4.0.2-alpha.28
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/architecture/agent-change-map.md +2 -0
- package/architecture/maintainability-debt.json +6 -4
- package/architecture/maintainability-policy.json +4 -4
- package/architecture/v4-universal-workflow-bootstrap.json +1 -1
- package/architecture/v4-universal-workflow-train-admission.json +1 -1
- package/dist/site/buildchain-contract.json +5 -5
- package/dist/site/buildchain-site.json +4 -4
- package/dist/site/kfd-claims.json +4 -3
- package/dist/site/kfd-upstream-aggregate.json +1 -1
- package/dist/site/public-surface-audit.json +3 -2
- package/dist/site/publication-registry.json +4 -4
- package/dist/site/site-manifest.json +4 -4
- package/dist/site/workflow-registry.json +6 -5
- package/package.json +1 -1
- package/packages/core/v4-product-publication.js +61 -25
- package/scripts/v4-product-publication-intent.mjs +13 -6
|
@@ -151,6 +151,8 @@ Safe change route: Reduce one owned responsibility behind the stable facade, run
|
|
|
151
151
|
|
|
152
152
|
### Current top twenty maintenance hotspots
|
|
153
153
|
|
|
154
|
+
- `.github/workflows/.build.yml`
|
|
155
|
+
- `.github/workflows/.publication-authority.yml`
|
|
154
156
|
- `.github/workflows/bootstrap.yml`
|
|
155
157
|
- `scripts/check-v4-universal-workflow-bootstrap.mjs`
|
|
156
158
|
- `scripts/v4-universal-workflow-engine.mjs`
|
|
@@ -7,8 +7,8 @@
|
|
|
7
7
|
},
|
|
8
8
|
"totalExcessLedger": {
|
|
9
9
|
"metric": "calibrated-full-dimensional-excess-v1",
|
|
10
|
-
"measuredExcess":
|
|
11
|
-
"current":
|
|
10
|
+
"measuredExcess": 64434,
|
|
11
|
+
"current": 56373
|
|
12
12
|
},
|
|
13
13
|
"defaults": {
|
|
14
14
|
"owner": "Buildchain architecture maintainers",
|
|
@@ -2948,7 +2948,7 @@
|
|
|
2948
2948
|
"lines": 2736
|
|
2949
2949
|
},
|
|
2950
2950
|
"current": {
|
|
2951
|
-
"lines":
|
|
2951
|
+
"lines": 1217
|
|
2952
2952
|
},
|
|
2953
2953
|
"target": {
|
|
2954
2954
|
"lines": 600
|
|
@@ -3094,6 +3094,8 @@
|
|
|
3094
3094
|
}
|
|
3095
3095
|
},
|
|
3096
3096
|
"hotspots": [
|
|
3097
|
+
".github/workflows/.build.yml",
|
|
3098
|
+
".github/workflows/.publication-authority.yml",
|
|
3097
3099
|
".github/workflows/bootstrap.yml",
|
|
3098
3100
|
"scripts/check-v4-universal-workflow-bootstrap.mjs",
|
|
3099
3101
|
"scripts/v4-universal-workflow-engine.mjs",
|
|
@@ -3155,7 +3157,7 @@
|
|
|
3155
3157
|
"path": ".github/workflows/.release-candidate-promote.yml",
|
|
3156
3158
|
"metric": "lines",
|
|
3157
3159
|
"baseline": 2736,
|
|
3158
|
-
"current":
|
|
3160
|
+
"current": 1217
|
|
3159
3161
|
},
|
|
3160
3162
|
{
|
|
3161
3163
|
"domain": "sources",
|
|
@@ -25,13 +25,13 @@
|
|
|
25
25
|
"rationale": "Wave 4 freezes both the aggregate exception inventory and every exception class at the exact protected baseline; reductions may ratchet these ceilings downward, but entries cannot be moved between classes to create hidden headroom."
|
|
26
26
|
},
|
|
27
27
|
"repositoryBudgets": {
|
|
28
|
-
"baselineRevision": "
|
|
28
|
+
"baselineRevision": "4d404e012cd6c199c4d3fa770625ce0d33c9a2cf",
|
|
29
29
|
"maxHandMaintainedSourceFiles": 463,
|
|
30
|
-
"maxHandMaintainedSourceLines":
|
|
30
|
+
"maxHandMaintainedSourceLines": 170637,
|
|
31
31
|
"maxWorkflowFiles": 80,
|
|
32
32
|
"maxWorkflowLines": 26791,
|
|
33
|
-
"latestTransition": "V4
|
|
34
|
-
"latestTransitionRationale": "
|
|
33
|
+
"latestTransition": "V4 zero-delta version-state publication reuses the rooted source tree and retains safe GitHub mutation status codes.",
|
|
34
|
+
"latestTransitionRationale": "When declared version files already equal the qualified product version, the GitHub provider now reuses the exact source tree instead of submitting an invalid empty createTree request. Non-empty materialization, bounded retry, protected-ref fallback, npm publication, permissions, and publication targets remain unchanged. Provider failures retain only a safe status-scoped code, avoiding both raw provider details and an undiagnosable generic failure. Focused tests isolate the zero-delta and failure-classification behavior in a new 99-line test surface; the exact inventory grows by 15 hand-maintained source lines to 170637 and grants no new workflow, credential, provider permission, merge authority, capability, or publication target.",
|
|
35
35
|
"rationale": "Bounded modules separate candidate, evidence, native proof and execution, canonical failure verification, closed-set execution transfer, process-boundary verification, Warrant state and qualification, authority state, qualification, Landing acquisition, verified-attempt admission, Landing settlement and fence validation, provider attempt and heartbeat readback, sealed terminal evidence, hosted heartbeat, resume, store, options, command-specific adapters, and CLI orchestration responsibilities. The protected delivery workflow gives candidate and seal jobs no provider write credential, recursively rejects transfer drift, scopes every transfer artifact to the exact provider run attempt, chains every durable heartbeat state and receipt root on a distinct hosted runner domain, and permits qualification or exact failure settlement only after the finalizer verifies live jobs and the latest durable authority state. Public Landing admission and heartbeat always perform non-injectable fresh exact-attempt provider readback, tolerate only a not-yet-materialized seal job while retaining exact native and duplicate-job rejection, and heartbeat-loss coordination never invokes GitHub's run-scoped cancellation API where a successor rerun could race. The hosted process boundary anchors trust in the kernel-resolved versioned Runner.Worker path while accepting an equivalent argv-zero spelling with the same basename; its public boundary marker is allowed only at the one exact non-secret value, so a forged value under the same credential-like name still fails closed. The credentialless transfer seal validates the rooted native reuse decision against the Warrant-bound source, closure, dependency, toolchain, environment and command inputs; qualifiedBase stays in the proof and decision where it is rooted and later independently rechecked, rather than being assumed on the Warrant schema. V2 mutation cannot initialize a second empty authority beside a legacy ref: migration reads and roots the canonical live v1 ref, rechecks it, applies the explicit configured v2 policy, and atomically replaces its bytes through one expected-old non-force update, so old v1 controllers fail closed while the prior commit remains immutable history. Candidate ancestry classifies the GitHub artifact runtime token as credential authority. Every Landing settlement, including an unexpired fence, requires product-owned terminal readback. Terminal cleanup reads the immutable historical attempt, derives workflow and hosted Landing job identity from live run data, reads the exact protected ref head and compares containment against that immutable SHA, and seals merged only when the admitted merge-group head is contained by that protected base; a later different-head merge settles the old attempt as dequeued. Terminal normalization preserves transfer, finalizer boundary, native and seal job, admitted provider attempt, protected-base head, containment result, and terminal readback coordinates. The public reusable workflow truthfully retains its single-flight v1 authority without advertising v2 migration, while bounded v2 remains a separate opt-in CLI, Node API, and schema contract; the tracked self-caller stays on public v4-alpha with matching stable and alpha locks, and transient train selection is dispatch-only. Next-development parity adds one versioned transition authority, one durable controller, one bounded reservation adapter, and pure public-contract recovery evidence while retaining the existing thin floating-channel callers byte-for-byte. The floating-consumer gate reuses the existing contract-world evaluator so SHA drift passes only under the selected lock's compatibility policy, breaking surface drift still fails closed, and external certification reconstructs the receipt from the observed workflow SHA rather than the lock's historical evidence SHA. Tail reseal adds no Stage Capsule effect or general rebuild authority: it verifies the exact retained four-platform bytes, admits one known macOS tail failure through live provider readback, fences signing and finalization to explicit credentials and Warrant identity, and requires standard candidate Passport plus provider and protected readback. Compatibility Facts parity isolates canonical encoding, temporal verification, lifecycle validation, fixture projection, public authority projection, and CLI adaptation into bounded modules; legacy digest and proof arrays are derived only from exact current Fact lineage. Publication Rehearsal adds no production release authority: the content-addressed capsule contract binds source, candidate, manifest, config, canonical data-only provider bindings, provider policy, observations and core version separately from filesystem, runtime and rehearsal-only provider authority; simulate, replay and explicitly authorized provider rehearsal all reuse the release-tail planner, while same-commit local dogfood resolves the new reusable contract and exact current runtime before external callers remain on floating v4-alpha. Cross-runtime candidate recovery preserves original runtime and provider roots and creates resume lineage only after exact public ref, tag, ancestry, npm version and integrity readback. Adopter Delivery restores the reviewed public v3 gate, drivers, Passport binding, N-1 bootstrap and exact archive loader through one public v4 surface while keeping provider and release authority explicit non-claims. Floating Alpha bootstrap uses only the existing exact resolver and protected Alpha private shell to move an otherwise stale floating shell, retains public v4 stable promotion, and removes itself after protected readback. CI lane change-budget enforcement adds a bounded parser, evaluator, guard, and tests without creating another merge authority.",
|
|
36
36
|
"governance": "legacy-debt-sunset-2026q4"
|
|
37
37
|
},
|
|
@@ -156,7 +156,7 @@
|
|
|
156
156
|
],
|
|
157
157
|
"migration": {
|
|
158
158
|
"compatibilityFacadeGenerator": "scripts/generate-v4-universal-workflow-facades.mjs",
|
|
159
|
-
"facadeSourceRevision": "
|
|
159
|
+
"facadeSourceRevision": "06a2d9f7d5753c5c9b2bf0e7f0e3220fc18cc183",
|
|
160
160
|
"channelGeneratedFacades": [
|
|
161
161
|
".github/workflows/build.yml",
|
|
162
162
|
".github/workflows/release-candidate-promote.yml"
|
|
@@ -24,11 +24,11 @@
|
|
|
24
24
|
},
|
|
25
25
|
"contractRoots": [
|
|
26
26
|
"sha256:4563c954e84d34b73e6683981e1e23dd6b8bb9b9551392b4e393efb624cc980e",
|
|
27
|
+
"sha256:639c9b8e68e0735030450d9014937dc0d427dfc105dafc6f1a659be426437ce5",
|
|
27
28
|
"sha256:65a0c2fc3faecaddf5076fff086b5d6e12eb9ba27796efc10aed19f2d93b9457",
|
|
28
29
|
"sha256:b6737ed958e8f53f7770b1c214c092591573ad63af41e05797117d9b7b212ed8",
|
|
29
30
|
"sha256:b94023c4abe4216765198adcaefb4825874a4d9053be096d35a53d6821128b52",
|
|
30
31
|
"sha256:ca0592275354f0690756e3f11accdd23615987827c346618c50c2e8a2807ad4d",
|
|
31
|
-
"sha256:cf3c5a79de580525953e1fc02b2b2937a1d1a50219b4464510dd5b4725ca9ca5",
|
|
32
32
|
"sha256:d6ad9cf661c0ba3825cabdc7185fd122a60fc1929dfc799cda3352650588663f"
|
|
33
33
|
],
|
|
34
34
|
"targetRef": "dev/v4/v4.0",
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"product": {
|
|
5
5
|
"name": "Buildchain",
|
|
6
6
|
"package": "@kungfu-tech/buildchain",
|
|
7
|
-
"version": "4.0.2-alpha.
|
|
7
|
+
"version": "4.0.2-alpha.28",
|
|
8
8
|
"repository": "https://github.com/kungfu-systems/buildchain"
|
|
9
9
|
},
|
|
10
10
|
"majorLine": "v4",
|
|
@@ -1646,7 +1646,7 @@
|
|
|
1646
1646
|
"resume-from-candidate-run is fail-closed and uses a fresh caller event instead of rerunning a frozen startup graph"
|
|
1647
1647
|
],
|
|
1648
1648
|
"breakingDigest": "sha256:9db8dd07152855d03ff30f9c571438593c689d3e8139fa45431d000f548242f5",
|
|
1649
|
-
"auditDigest": "sha256:
|
|
1649
|
+
"auditDigest": "sha256:177b3c50685405e5ed2bf1ac893469fdb3a27e7b03d55025611b2985028cd8cf",
|
|
1650
1650
|
"compatibleBreakingDigests": [
|
|
1651
1651
|
"sha256:aa30f22e3af0a89841310bdbdc900844dd95a66974db173fa140a71bbd7e82c0"
|
|
1652
1652
|
],
|
|
@@ -1863,7 +1863,7 @@
|
|
|
1863
1863
|
"no consumer command, script, shell, checkout, or executable tail hook is accepted"
|
|
1864
1864
|
],
|
|
1865
1865
|
"breakingDigest": "sha256:9229eb3a000fb408feb6b8793c209c77afbf9327026467d68954470e22e4f8f4",
|
|
1866
|
-
"auditDigest": "sha256:
|
|
1866
|
+
"auditDigest": "sha256:4d51bce0908155875a70f8168fc545fe164bd1b6a4146a3de56b4dd7a5c1758c"
|
|
1867
1867
|
},
|
|
1868
1868
|
{
|
|
1869
1869
|
"contractVersion": 1,
|
|
@@ -5213,7 +5213,7 @@
|
|
|
5213
5213
|
"missing receipts are non-qualifying and must not be represented as a successful controller run"
|
|
5214
5214
|
],
|
|
5215
5215
|
"breakingDigest": "sha256:015d8de793adbd4c539416be7d7512e18cc92097e629b0203fa06d2c183e98bd",
|
|
5216
|
-
"auditDigest": "sha256:
|
|
5216
|
+
"auditDigest": "sha256:177b3c50685405e5ed2bf1ac893469fdb3a27e7b03d55025611b2985028cd8cf"
|
|
5217
5217
|
},
|
|
5218
5218
|
{
|
|
5219
5219
|
"contractVersion": 1,
|
|
@@ -5444,5 +5444,5 @@
|
|
|
5444
5444
|
"compatibilityFactCutRoot": "sha256:f61b975d4a96c921cc4bd37fb3ed9a0596b47004fe34dc7219979d697e3707f9",
|
|
5445
5445
|
"compatibilityProofRegistryRoot": "sha256:b7194b811e4d3af2df4390bc4d1731e16a86215bd64ee18cb630dd5492f4fb63",
|
|
5446
5446
|
"compatibilityDigest": "sha256:20411029d83211dff426fb6535a608902129844a5ccb4788db77d3f81becb839",
|
|
5447
|
-
"contractDigest": "sha256:
|
|
5447
|
+
"contractDigest": "sha256:a20ed3dbffe4211e82a368c28a78d3ddea7d147d0034482508e078af674e16fb"
|
|
5448
5448
|
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 1,
|
|
3
3
|
"contract": "kungfu-buildchain-site-bundle",
|
|
4
|
-
"generatedAt": "2026-09-
|
|
5
|
-
"publishedAt": "2026-09-
|
|
4
|
+
"generatedAt": "2026-09-03T11:14:58.000Z",
|
|
5
|
+
"publishedAt": "2026-09-03T11:14:58.000Z",
|
|
6
6
|
"reproducible": true,
|
|
7
7
|
"timestampPolicy": "ci-injected",
|
|
8
8
|
"deterministicInputs": [
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"declared Buildchain surface manifest contract"
|
|
20
20
|
],
|
|
21
21
|
"sourceDateEpoch": "0",
|
|
22
|
-
"sourceRevision": "
|
|
22
|
+
"sourceRevision": "6b0935c5663d38893a9ff4688fed4cbbe6b9f0ac",
|
|
23
23
|
"timestampPolicyDetails": {
|
|
24
24
|
"contract": "kungfu-buildchain-surface-timestamp-policy",
|
|
25
25
|
"timestampFields": [
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
},
|
|
38
38
|
"package": {
|
|
39
39
|
"name": "@kungfu-tech/buildchain",
|
|
40
|
-
"version": "4.0.2-alpha.
|
|
40
|
+
"version": "4.0.2-alpha.28",
|
|
41
41
|
"versionSource": "package.json#version"
|
|
42
42
|
},
|
|
43
43
|
"source": {
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
"contract": "kungfu-buildchain-public-surface-reverse-audit",
|
|
22
22
|
"path": "dist/site/public-surface-audit.json",
|
|
23
23
|
"status": "passed",
|
|
24
|
-
"sha256": "
|
|
24
|
+
"sha256": "976d0c0c6c20b2c98342de9a7cabd7df9c242ae3f47a58b2144621c25b433d85",
|
|
25
25
|
"summary": {
|
|
26
26
|
"cliCommandCount": 117,
|
|
27
27
|
"workflowCount": 74,
|
|
@@ -246,7 +246,7 @@
|
|
|
246
246
|
"contract": "kungfu-buildchain-public-surface-reverse-audit",
|
|
247
247
|
"path": "dist/site/public-surface-audit.json",
|
|
248
248
|
"status": "passed",
|
|
249
|
-
"sha256": "
|
|
249
|
+
"sha256": "976d0c0c6c20b2c98342de9a7cabd7df9c242ae3f47a58b2144621c25b433d85",
|
|
250
250
|
"summary": {
|
|
251
251
|
"cliCommandCount": 117,
|
|
252
252
|
"workflowCount": 74,
|
|
@@ -6234,7 +6234,7 @@
|
|
|
6234
6234
|
"visibility": "public",
|
|
6235
6235
|
"participantFacing": true,
|
|
6236
6236
|
"public": true,
|
|
6237
|
-
"inputCount":
|
|
6237
|
+
"inputCount": 31,
|
|
6238
6238
|
"inputs": [
|
|
6239
6239
|
"artifact-paths",
|
|
6240
6240
|
"candidate-build-summary-path",
|
|
@@ -6243,6 +6243,7 @@
|
|
|
6243
6243
|
"mutation-token",
|
|
6244
6244
|
"product-publication-intent-path",
|
|
6245
6245
|
"publication-qualification-path",
|
|
6246
|
+
"publish-artifact-kind",
|
|
6246
6247
|
"publish-auth",
|
|
6247
6248
|
"publish-command",
|
|
6248
6249
|
"publish-dist-tag",
|
|
@@ -3271,6 +3271,7 @@
|
|
|
3271
3271
|
"mutation-token",
|
|
3272
3272
|
"product-publication-intent-path",
|
|
3273
3273
|
"publication-qualification-path",
|
|
3274
|
+
"publish-artifact-kind",
|
|
3274
3275
|
"publish-auth",
|
|
3275
3276
|
"publish-command",
|
|
3276
3277
|
"publish-dist-tag",
|
|
@@ -3295,7 +3296,7 @@
|
|
|
3295
3296
|
"target-sha",
|
|
3296
3297
|
"token"
|
|
3297
3298
|
],
|
|
3298
|
-
"inputCount":
|
|
3299
|
+
"inputCount": 31
|
|
3299
3300
|
},
|
|
3300
3301
|
{
|
|
3301
3302
|
"id": "validate-config",
|
|
@@ -8904,7 +8905,7 @@
|
|
|
8904
8905
|
"workflowRegistryPath": "dist/site/workflow-registry.json",
|
|
8905
8906
|
"pageRegistryPath": "dist/site/page-registry.json",
|
|
8906
8907
|
"cliRegistryDigest": "fbc23073bbae240489a2f826b2c26daadc58e704050c5f8df366509f5c5a1c3e",
|
|
8907
|
-
"workflowRegistryDigest": "
|
|
8908
|
+
"workflowRegistryDigest": "d89f5d875f63d04ba2ab055fe3741acb72c5a537e53db8af9df3fe3170317d52",
|
|
8908
8909
|
"pageRegistryDigest": "ae0b1b9c7b883027cf53403221ff2fe2e41ad1aa4d16851d4550e89947d6d6d7"
|
|
8909
8910
|
},
|
|
8910
8911
|
"comparison": {
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 1,
|
|
3
3
|
"contract": "kungfu-buildchain-publication-release-registry",
|
|
4
|
-
"generatedAt": "2026-09-
|
|
5
|
-
"publishedAt": "2026-09-
|
|
4
|
+
"generatedAt": "2026-09-03T11:14:58.000Z",
|
|
5
|
+
"publishedAt": "2026-09-03T11:14:58.000Z",
|
|
6
6
|
"reproducible": true,
|
|
7
7
|
"timestampPolicy": "ci-injected",
|
|
8
8
|
"deterministicInputs": [
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"declared Buildchain surface manifest contract"
|
|
20
20
|
],
|
|
21
21
|
"sourceDateEpoch": "0",
|
|
22
|
-
"sourceRevision": "
|
|
22
|
+
"sourceRevision": "6b0935c5663d38893a9ff4688fed4cbbe6b9f0ac",
|
|
23
23
|
"timestampPolicyDetails": {
|
|
24
24
|
"contract": "kungfu-buildchain-surface-timestamp-policy",
|
|
25
25
|
"timestampFields": [
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
},
|
|
33
33
|
"package": {
|
|
34
34
|
"name": "@kungfu-tech/buildchain",
|
|
35
|
-
"version": "4.0.2-alpha.
|
|
35
|
+
"version": "4.0.2-alpha.28",
|
|
36
36
|
"versionSource": "package.json#version"
|
|
37
37
|
},
|
|
38
38
|
"sourceKind": "package-site-bundle",
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 1,
|
|
3
3
|
"contract": "kungfu-buildchain-site-manifest",
|
|
4
|
-
"generatedAt": "2026-09-
|
|
5
|
-
"publishedAt": "2026-09-
|
|
4
|
+
"generatedAt": "2026-09-03T11:14:58.000Z",
|
|
5
|
+
"publishedAt": "2026-09-03T11:14:58.000Z",
|
|
6
6
|
"reproducible": true,
|
|
7
7
|
"timestampPolicy": "ci-injected",
|
|
8
8
|
"deterministicInputs": [
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"declared Buildchain surface manifest contract"
|
|
20
20
|
],
|
|
21
21
|
"sourceDateEpoch": "0",
|
|
22
|
-
"sourceRevision": "
|
|
22
|
+
"sourceRevision": "6b0935c5663d38893a9ff4688fed4cbbe6b9f0ac",
|
|
23
23
|
"timestampPolicyDetails": {
|
|
24
24
|
"contract": "kungfu-buildchain-surface-timestamp-policy",
|
|
25
25
|
"timestampFields": [
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
},
|
|
38
38
|
"package": {
|
|
39
39
|
"name": "@kungfu-tech/buildchain",
|
|
40
|
-
"version": "4.0.2-alpha.
|
|
40
|
+
"version": "4.0.2-alpha.28",
|
|
41
41
|
"versionSource": "package.json#version"
|
|
42
42
|
},
|
|
43
43
|
"entrypoint": "buildchain-site.json",
|
|
@@ -1926,7 +1926,7 @@
|
|
|
1926
1926
|
"status": "preview",
|
|
1927
1927
|
"owner": "buildchain-workflows",
|
|
1928
1928
|
"maturity": "preview",
|
|
1929
|
-
"introducedVersion": "4.0.2-alpha.
|
|
1929
|
+
"introducedVersion": "4.0.2-alpha.28",
|
|
1930
1930
|
"compatibilityPromise": "preserved-through-the-v3-major-line",
|
|
1931
1931
|
"deprecationReplacement": "",
|
|
1932
1932
|
"sunsetCondition": "explicit-breaking-change-review-in-a-future-major-line",
|
|
@@ -1947,7 +1947,7 @@
|
|
|
1947
1947
|
"status": "preview",
|
|
1948
1948
|
"owner": "buildchain-workflows",
|
|
1949
1949
|
"maturity": "preview",
|
|
1950
|
-
"introducedVersion": "4.0.2-alpha.
|
|
1950
|
+
"introducedVersion": "4.0.2-alpha.28",
|
|
1951
1951
|
"compatibilityPromise": "preserved-through-the-v3-major-line",
|
|
1952
1952
|
"deprecationReplacement": "",
|
|
1953
1953
|
"sunsetCondition": "explicit-breaking-change-review-in-a-future-major-line",
|
|
@@ -1968,7 +1968,7 @@
|
|
|
1968
1968
|
"status": "preview",
|
|
1969
1969
|
"owner": "buildchain-workflows",
|
|
1970
1970
|
"maturity": "preview",
|
|
1971
|
-
"introducedVersion": "4.0.2-alpha.
|
|
1971
|
+
"introducedVersion": "4.0.2-alpha.28",
|
|
1972
1972
|
"compatibilityPromise": "preserved-through-the-v3-major-line",
|
|
1973
1973
|
"deprecationReplacement": "",
|
|
1974
1974
|
"sunsetCondition": "explicit-breaking-change-review-in-a-future-major-line",
|
|
@@ -2019,7 +2019,7 @@
|
|
|
2019
2019
|
"status": "preview",
|
|
2020
2020
|
"owner": "buildchain-workflows",
|
|
2021
2021
|
"maturity": "preview",
|
|
2022
|
-
"introducedVersion": "4.0.2-alpha.
|
|
2022
|
+
"introducedVersion": "4.0.2-alpha.28",
|
|
2023
2023
|
"compatibilityPromise": "preserved-through-the-v3-major-line",
|
|
2024
2024
|
"deprecationReplacement": "",
|
|
2025
2025
|
"sunsetCondition": "explicit-breaking-change-review-in-a-future-major-line",
|
|
@@ -3470,6 +3470,7 @@
|
|
|
3470
3470
|
"mutation-token",
|
|
3471
3471
|
"product-publication-intent-path",
|
|
3472
3472
|
"publication-qualification-path",
|
|
3473
|
+
"publish-artifact-kind",
|
|
3473
3474
|
"publish-auth",
|
|
3474
3475
|
"publish-command",
|
|
3475
3476
|
"publish-dist-tag",
|
|
@@ -3494,7 +3495,7 @@
|
|
|
3494
3495
|
"target-sha",
|
|
3495
3496
|
"token"
|
|
3496
3497
|
],
|
|
3497
|
-
"inputCount":
|
|
3498
|
+
"inputCount": 31,
|
|
3498
3499
|
"capabilityGroup": "api-cli-reference",
|
|
3499
3500
|
"status": "active",
|
|
3500
3501
|
"owner": "buildchain-actions",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kungfu-tech/buildchain",
|
|
3
|
-
"version": "4.0.2-alpha.
|
|
3
|
+
"version": "4.0.2-alpha.28",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Buildchain Release Passport, release governance, CLI toolkit, and site facts.",
|
|
6
6
|
"repository": "https://github.com/kungfu-systems/buildchain",
|
|
@@ -41,6 +41,29 @@ function channelName(value) {
|
|
|
41
41
|
fail(`unsupported channel '${value}'`);
|
|
42
42
|
}
|
|
43
43
|
|
|
44
|
+
function publicationArtifactKind(value) {
|
|
45
|
+
if (!value || value === "npm") return "npm";
|
|
46
|
+
if (value === "custom") return "custom";
|
|
47
|
+
fail(`unsupported artifactKind '${value}'`);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function publicationProductCoordinates({
|
|
51
|
+
artifactKind,
|
|
52
|
+
packageName,
|
|
53
|
+
distTag,
|
|
54
|
+
sealedBundleRoot,
|
|
55
|
+
}) {
|
|
56
|
+
if (artifactKind === "custom") return { artifactKind };
|
|
57
|
+
const normalizedDistTag = requiredString(distTag, "distTag");
|
|
58
|
+
if (!/^[a-z0-9][a-z0-9._-]*$/u.test(normalizedDistTag))
|
|
59
|
+
fail("distTag must be an npm dist-tag");
|
|
60
|
+
return {
|
|
61
|
+
packageName: requiredString(packageName, "packageName"),
|
|
62
|
+
distTag: normalizedDistTag,
|
|
63
|
+
sealedBundleRoot: requiredRoot(sealedBundleRoot, "sealedBundleRoot"),
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
|
|
44
67
|
function assertLane({ channel, targetRef, version }) {
|
|
45
68
|
const expression =
|
|
46
69
|
channel === "alpha"
|
|
@@ -83,6 +106,7 @@ export function selectV4ProductPublicationIntent({
|
|
|
83
106
|
sourceSha,
|
|
84
107
|
sourceTimestamp,
|
|
85
108
|
repository,
|
|
109
|
+
artifactKind = "npm",
|
|
86
110
|
packageName,
|
|
87
111
|
distTag,
|
|
88
112
|
sealedBundleRoot,
|
|
@@ -102,10 +126,15 @@ export function selectV4ProductPublicationIntent({
|
|
|
102
126
|
);
|
|
103
127
|
if (Number.isNaN(Date.parse(normalizedTimestamp)))
|
|
104
128
|
fail("sourceTimestamp must be an ISO timestamp");
|
|
105
|
-
const
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
129
|
+
const normalizedArtifactKind = publicationArtifactKind(
|
|
130
|
+
String(artifactKind || "").trim(),
|
|
131
|
+
);
|
|
132
|
+
const productCoordinates = publicationProductCoordinates({
|
|
133
|
+
artifactKind: normalizedArtifactKind,
|
|
134
|
+
packageName,
|
|
135
|
+
distTag,
|
|
136
|
+
sealedBundleRoot,
|
|
137
|
+
});
|
|
109
138
|
if (!Array.isArray(observedVersions))
|
|
110
139
|
fail("observedVersions must be an array");
|
|
111
140
|
const candidate = parseVersion(candidateVersion, "candidateVersion");
|
|
@@ -128,12 +157,16 @@ export function selectV4ProductPublicationIntent({
|
|
|
128
157
|
} else if (normalizedChannel === "alpha") {
|
|
129
158
|
if (candidate.alpha === null)
|
|
130
159
|
fail("fresh alpha publication requires an alpha candidate version");
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
160
|
+
if (normalizedArtifactKind === "custom") {
|
|
161
|
+
version = candidate.value;
|
|
162
|
+
} else {
|
|
163
|
+
const highest = observed.reduce(
|
|
164
|
+
(current, entry) =>
|
|
165
|
+
Math.max(current, observedAlphaNumber(entry, candidate) ?? -1),
|
|
166
|
+
candidate.alpha,
|
|
167
|
+
);
|
|
168
|
+
version = `${candidate.major}.${candidate.minor}.${candidate.patch}-alpha.${highest + 1}`;
|
|
169
|
+
}
|
|
137
170
|
} else {
|
|
138
171
|
version = `${candidate.major}.${candidate.minor}.${candidate.patch}`;
|
|
139
172
|
}
|
|
@@ -145,9 +178,7 @@ export function selectV4ProductPublicationIntent({
|
|
|
145
178
|
sourceSha,
|
|
146
179
|
sourceTimestamp: new Date(normalizedTimestamp).toISOString(),
|
|
147
180
|
repository,
|
|
148
|
-
|
|
149
|
-
distTag: normalizedDistTag,
|
|
150
|
-
sealedBundleRoot: requiredRoot(sealedBundleRoot, "sealedBundleRoot"),
|
|
181
|
+
...productCoordinates,
|
|
151
182
|
requiredArtifactsRoot: requiredRoot(
|
|
152
183
|
requiredArtifactsRoot,
|
|
153
184
|
"requiredArtifactsRoot",
|
|
@@ -202,6 +233,7 @@ export function createV4ProductPublicationPlan({
|
|
|
202
233
|
sourceSha: intent.sourceSha,
|
|
203
234
|
sourceTimestamp: intent.sourceTimestamp,
|
|
204
235
|
repository: intent.repository,
|
|
236
|
+
artifactKind: intent.artifactKind,
|
|
205
237
|
packageName: intent.packageName,
|
|
206
238
|
distTag: intent.distTag,
|
|
207
239
|
sealedBundleRoot: intent.sealedBundleRoot,
|
|
@@ -231,18 +263,22 @@ export function createV4ProductPublicationPlan({
|
|
|
231
263
|
stateRef,
|
|
232
264
|
},
|
|
233
265
|
},
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
266
|
+
...(intent.artifactKind === "custom"
|
|
267
|
+
? []
|
|
268
|
+
: [
|
|
269
|
+
{
|
|
270
|
+
id: "product.package.publish",
|
|
271
|
+
adapter: "npm-trusted-publishing",
|
|
272
|
+
authority: "oidc-provider-mutation",
|
|
273
|
+
target: {
|
|
274
|
+
packageName: intent.packageName,
|
|
275
|
+
version: intent.version,
|
|
276
|
+
distTag: intent.distTag,
|
|
277
|
+
sealedBundleRoot: intent.sealedBundleRoot,
|
|
278
|
+
requiredArtifactsRoot: intent.requiredArtifactsRoot,
|
|
279
|
+
},
|
|
280
|
+
},
|
|
281
|
+
]),
|
|
246
282
|
{
|
|
247
283
|
id: "product.release-refs.converge",
|
|
248
284
|
adapter: "github-release-refs",
|
|
@@ -18,7 +18,8 @@ function readJson(file) {
|
|
|
18
18
|
return JSON.parse(fs.readFileSync(path.resolve(file), "utf8"));
|
|
19
19
|
}
|
|
20
20
|
|
|
21
|
-
function packageName() {
|
|
21
|
+
function packageName(artifactKind) {
|
|
22
|
+
if (artifactKind !== "npm") return "";
|
|
22
23
|
const declared = env("BUILDCHAIN_PUBLISH_PACKAGE_MAIN");
|
|
23
24
|
if (declared) return declared;
|
|
24
25
|
const manifestPath = env("BUILDCHAIN_SEALED_BUNDLE_MANIFEST", true);
|
|
@@ -59,9 +60,14 @@ function writeOutput(name, value) {
|
|
|
59
60
|
}
|
|
60
61
|
|
|
61
62
|
export function resolveV4ProductPublicationIntent() {
|
|
62
|
-
const
|
|
63
|
+
const artifactKind = env("BUILDCHAIN_PUBLISH_ARTIFACT_KIND") || "npm";
|
|
64
|
+
const name = packageName(artifactKind);
|
|
63
65
|
const sourceSha = env("BUILDCHAIN_SOURCE_SHA", true);
|
|
64
|
-
const
|
|
66
|
+
const manifestPath = env(
|
|
67
|
+
"BUILDCHAIN_SEALED_BUNDLE_MANIFEST",
|
|
68
|
+
artifactKind === "npm",
|
|
69
|
+
);
|
|
70
|
+
const manifest = manifestPath ? readJson(manifestPath) : null;
|
|
65
71
|
const requiredArtifacts = readJson(
|
|
66
72
|
env("BUILDCHAIN_REQUIRED_ARTIFACTS_PATH", true),
|
|
67
73
|
);
|
|
@@ -72,18 +78,19 @@ export function resolveV4ProductPublicationIntent() {
|
|
|
72
78
|
sourceSha,
|
|
73
79
|
sourceTimestamp: env("BUILDCHAIN_SOURCE_TIMESTAMP", true),
|
|
74
80
|
repository: env("BUILDCHAIN_REPOSITORY", true),
|
|
81
|
+
artifactKind,
|
|
75
82
|
packageName: name,
|
|
76
83
|
distTag:
|
|
77
84
|
env("BUILDCHAIN_PUBLISH_DIST_TAG") ||
|
|
78
85
|
(channel === "alpha" ? "alpha" : "latest"),
|
|
79
|
-
sealedBundleRoot: manifest
|
|
86
|
+
sealedBundleRoot: manifest?.root,
|
|
80
87
|
requiredArtifactsRoot: v4ContentRoot(
|
|
81
88
|
"v4-product-required-artifacts",
|
|
82
89
|
requiredArtifacts,
|
|
83
90
|
),
|
|
84
91
|
candidateVersion: env("BUILDCHAIN_CANDIDATE_VERSION", true),
|
|
85
92
|
recoveredVersion: env("BUILDCHAIN_RECOVERED_PUBLICATION_VERSION"),
|
|
86
|
-
observedVersions: observedVersions(name),
|
|
93
|
+
observedVersions: artifactKind === "npm" ? observedVersions(name) : [],
|
|
87
94
|
});
|
|
88
95
|
const outputPath = path.resolve(
|
|
89
96
|
env("BUILDCHAIN_PRODUCT_PUBLICATION_INTENT_PATH") ||
|
|
@@ -95,7 +102,7 @@ export function resolveV4ProductPublicationIntent() {
|
|
|
95
102
|
writeOutput("exact-tag", intent.exactTag);
|
|
96
103
|
writeOutput("intent-path", outputPath);
|
|
97
104
|
writeOutput("intent-root", intent.intentRoot);
|
|
98
|
-
return { name, intent, outputPath };
|
|
105
|
+
return { name: name || artifactKind, intent, outputPath };
|
|
99
106
|
}
|
|
100
107
|
|
|
101
108
|
if (
|