@mannyc1/ts-release 0.0.7 → 0.3.0
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.md +184 -92
- package/CHANGELOG.md +197 -0
- package/LICENSE +21 -0
- package/README.md +404 -327
- package/SPEC.md +257 -310
- package/apps/release-ts/README.md +39 -0
- package/apps/release-ts/src/cli/command.ts +164 -0
- package/apps/release-ts/src/cli/commands.ts +351 -0
- package/apps/release-ts/src/cli/main.ts +43 -0
- package/apps/release-ts/src/cli/node-main.ts +49 -0
- package/apps/ts-release-agents/LICENSE +21 -0
- package/apps/ts-release-agents/README.md +21 -0
- package/apps/ts-release-agents/evals/cases.json +11 -0
- package/apps/ts-release-agents/manifests/claude.json +5 -0
- package/apps/ts-release-agents/manifests/codex.json +5 -0
- package/apps/ts-release-agents/package.json +11 -0
- package/apps/ts-release-agents/skills/release/SKILL.md +48 -0
- package/apps/ts-release-agents/skills/release/references/configuration.md +18 -0
- package/apps/ts-release-agents/skills/release/references/recovery.md +10 -0
- package/apps/ts-release-agents/skills/release/references/staged-workflow.md +12 -0
- package/apps/ts-release-agents/skills/release/references/target-selection.md +13 -0
- package/apps/ts-release-agents/skills/release/references/verification.md +14 -0
- package/apps/ts-release-agents/src/build.ts +105 -0
- package/apps/ts-release-agents/src/check.ts +122 -0
- package/apps/ts-release-agents/src/install.ts +121 -0
- package/apps/ts-release-agents/test/contract.test.ts +56 -0
- package/apps/ts-release-agents/tsconfig.json +5 -0
- package/dist/api/api.d.ts +15 -0
- package/dist/api/api.d.ts.map +1 -0
- package/dist/api/api.js +244 -0
- package/dist/api/api.js.map +1 -0
- package/dist/api/errors.d.ts +39 -0
- package/dist/api/errors.d.ts.map +1 -0
- package/dist/api/errors.js +32 -0
- package/dist/api/errors.js.map +1 -0
- package/dist/api/input.d.ts +10 -0
- package/dist/api/input.d.ts.map +1 -0
- package/dist/api/input.js +73 -0
- package/dist/api/input.js.map +1 -0
- package/dist/api/runtime.d.ts +18 -0
- package/dist/api/runtime.d.ts.map +1 -0
- package/dist/api/runtime.js +7 -0
- package/dist/api/runtime.js.map +1 -0
- package/dist/api/types.d.ts +76 -0
- package/dist/api/types.d.ts.map +1 -0
- package/dist/api/types.js +17 -0
- package/dist/api/types.js.map +1 -0
- package/dist/bin/ts-release.js +39346 -0
- package/dist/capabilities/bun-targets.d.ts +3 -0
- package/dist/capabilities/bun-targets.d.ts.map +1 -0
- package/dist/capabilities/bun-targets.js +3 -0
- package/dist/capabilities/bun-targets.js.map +1 -0
- package/dist/capabilities/field-ownership.d.ts +17 -0
- package/dist/capabilities/field-ownership.d.ts.map +1 -0
- package/dist/capabilities/field-ownership.js +40 -0
- package/dist/capabilities/field-ownership.js.map +1 -0
- package/dist/capabilities/module.d.ts +91 -0
- package/dist/capabilities/module.d.ts.map +1 -0
- package/dist/capabilities/module.js +2 -0
- package/dist/capabilities/module.js.map +1 -0
- package/dist/capabilities/registry.d.ts +829 -0
- package/dist/capabilities/registry.d.ts.map +1 -0
- package/dist/capabilities/registry.js +291 -0
- package/dist/capabilities/registry.js.map +1 -0
- package/dist/config/config.d.ts +6 -0
- package/dist/config/config.d.ts.map +1 -0
- package/dist/config/config.js +42 -0
- package/dist/config/config.js.map +1 -0
- package/dist/correction/coordinator.d.ts +248 -0
- package/dist/correction/coordinator.d.ts.map +1 -0
- package/dist/correction/coordinator.js +274 -0
- package/dist/correction/coordinator.js.map +1 -0
- package/dist/correction/index.d.ts +3 -0
- package/dist/correction/index.d.ts.map +1 -0
- package/dist/correction/index.js +3 -0
- package/dist/correction/index.js.map +1 -0
- package/dist/correction/intent.d.ts +111 -0
- package/dist/correction/intent.d.ts.map +1 -0
- package/dist/correction/intent.js +146 -0
- package/dist/correction/intent.js.map +1 -0
- package/dist/drivers/archive.d.ts +9 -0
- package/dist/drivers/archive.d.ts.map +1 -0
- package/dist/drivers/archive.js +105 -0
- package/dist/drivers/archive.js.map +1 -0
- package/dist/drivers/contain.d.ts +6 -0
- package/dist/drivers/contain.d.ts.map +1 -0
- package/dist/drivers/contain.js +17 -0
- package/dist/drivers/contain.js.map +1 -0
- package/dist/drivers/environment.d.ts +4 -0
- package/dist/drivers/environment.d.ts.map +1 -0
- package/dist/drivers/environment.js +18 -0
- package/dist/drivers/environment.js.map +1 -0
- package/dist/drivers/errors.d.ts +9 -0
- package/dist/drivers/errors.d.ts.map +1 -0
- package/dist/drivers/errors.js +6 -0
- package/dist/drivers/errors.js.map +1 -0
- package/dist/drivers/glob.d.ts +2 -0
- package/dist/drivers/glob.d.ts.map +1 -0
- package/dist/drivers/glob.js +162 -0
- package/dist/drivers/glob.js.map +1 -0
- package/dist/drivers/process.d.ts +48 -0
- package/dist/drivers/process.d.ts.map +1 -0
- package/dist/drivers/process.js +257 -0
- package/dist/drivers/process.js.map +1 -0
- package/dist/drivers/python-wheel.d.ts +21 -0
- package/dist/drivers/python-wheel.d.ts.map +1 -0
- package/dist/drivers/python-wheel.js +109 -0
- package/dist/drivers/python-wheel.js.map +1 -0
- package/dist/drivers/redact.d.ts +4 -0
- package/dist/drivers/redact.d.ts.map +1 -0
- package/dist/drivers/redact.js +24 -0
- package/dist/drivers/redact.js.map +1 -0
- package/dist/drivers/seccomp-helper-source.d.ts +7 -0
- package/dist/drivers/seccomp-helper-source.d.ts.map +1 -0
- package/dist/drivers/seccomp-helper-source.js +121 -0
- package/dist/drivers/seccomp-helper-source.js.map +1 -0
- package/dist/drivers/utils.d.ts +4 -0
- package/dist/drivers/utils.d.ts.map +1 -0
- package/dist/drivers/utils.js +5 -0
- package/dist/drivers/utils.js.map +1 -0
- package/dist/drivers/workspace.d.ts +9 -0
- package/dist/drivers/workspace.d.ts.map +1 -0
- package/dist/drivers/workspace.js +53 -0
- package/dist/drivers/workspace.js.map +1 -0
- package/dist/extensions/provider-adapter.d.ts +48 -0
- package/dist/extensions/provider-adapter.d.ts.map +1 -0
- package/dist/extensions/provider-adapter.js +64 -0
- package/dist/extensions/provider-adapter.js.map +1 -0
- package/dist/host.d.ts +33 -0
- package/dist/host.d.ts.map +1 -0
- package/dist/host.js +20 -0
- package/dist/host.js.map +1 -0
- package/dist/index.d.ts +19 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -1
- package/dist/index.js.map +1 -1
- package/dist/model/artifact-collection.d.ts +84 -0
- package/dist/model/artifact-collection.d.ts.map +1 -0
- package/dist/model/artifact-collection.js +185 -0
- package/dist/model/artifact-collection.js.map +1 -0
- package/dist/model/authority.d.ts +89 -0
- package/dist/model/authority.d.ts.map +1 -0
- package/dist/model/authority.js +80 -0
- package/dist/model/authority.js.map +1 -0
- package/dist/model/bun-targets.d.ts +34 -0
- package/dist/model/bun-targets.d.ts.map +1 -0
- package/dist/model/bun-targets.js +17 -0
- package/dist/model/bun-targets.js.map +1 -0
- package/dist/model/canonical.d.ts +8 -0
- package/dist/model/canonical.d.ts.map +1 -0
- package/dist/model/canonical.js +205 -0
- package/dist/model/canonical.js.map +1 -0
- package/dist/model/catalog.d.ts +76 -0
- package/dist/model/catalog.d.ts.map +1 -0
- package/dist/model/catalog.js +174 -0
- package/dist/model/catalog.js.map +1 -0
- package/dist/model/digest.d.ts +53 -0
- package/dist/model/digest.d.ts.map +1 -0
- package/dist/model/digest.js +127 -0
- package/dist/model/digest.js.map +1 -0
- package/dist/model/errors.d.ts +14 -0
- package/dist/model/errors.d.ts.map +1 -0
- package/dist/model/errors.js +8 -0
- package/dist/model/errors.js.map +1 -0
- package/dist/model/primitives.d.ts +19 -0
- package/dist/model/primitives.d.ts.map +1 -0
- package/dist/model/primitives.js +18 -0
- package/dist/model/primitives.js.map +1 -0
- package/dist/model/pypi.d.ts +12 -0
- package/dist/model/pypi.d.ts.map +1 -0
- package/dist/model/pypi.js +20 -0
- package/dist/model/pypi.js.map +1 -0
- package/dist/model/python-distribution.d.ts +33 -0
- package/dist/model/python-distribution.d.ts.map +1 -0
- package/dist/model/python-distribution.js +367 -0
- package/dist/model/python-distribution.js.map +1 -0
- package/dist/model/secret-patterns.d.ts +2 -0
- package/dist/model/secret-patterns.d.ts.map +1 -0
- package/dist/model/secret-patterns.js +12 -0
- package/dist/model/secret-patterns.js.map +1 -0
- package/dist/operation-journal/authority.d.ts +3 -0
- package/dist/operation-journal/authority.d.ts.map +1 -0
- package/dist/operation-journal/authority.js +147 -0
- package/dist/operation-journal/authority.js.map +1 -0
- package/dist/operation-journal/aws/deadline.d.ts +12 -0
- package/dist/operation-journal/aws/deadline.d.ts.map +1 -0
- package/dist/operation-journal/aws/deadline.js +38 -0
- package/dist/operation-journal/aws/deadline.js.map +1 -0
- package/dist/operation-journal/aws/oidc.d.ts +27 -0
- package/dist/operation-journal/aws/oidc.d.ts.map +1 -0
- package/dist/operation-journal/aws/oidc.js +361 -0
- package/dist/operation-journal/aws/oidc.js.map +1 -0
- package/dist/operation-journal/aws/policy.d.ts +42 -0
- package/dist/operation-journal/aws/policy.d.ts.map +1 -0
- package/dist/operation-journal/aws/policy.js +404 -0
- package/dist/operation-journal/aws/policy.js.map +1 -0
- package/dist/operation-journal/aws/s3-boundary.d.ts +17 -0
- package/dist/operation-journal/aws/s3-boundary.d.ts.map +1 -0
- package/dist/operation-journal/aws/s3-boundary.js +417 -0
- package/dist/operation-journal/aws/s3-boundary.js.map +1 -0
- package/dist/operation-journal/aws.d.ts +11 -0
- package/dist/operation-journal/aws.d.ts.map +1 -0
- package/dist/operation-journal/aws.js +50 -0
- package/dist/operation-journal/aws.js.map +1 -0
- package/dist/operation-journal/canonical.d.ts +52 -0
- package/dist/operation-journal/canonical.d.ts.map +1 -0
- package/dist/operation-journal/canonical.js +282 -0
- package/dist/operation-journal/canonical.js.map +1 -0
- package/dist/operation-journal/model.d.ts +251 -0
- package/dist/operation-journal/model.d.ts.map +1 -0
- package/dist/operation-journal/model.js +56 -0
- package/dist/operation-journal/model.js.map +1 -0
- package/dist/operation-journal/reducer.d.ts +28 -0
- package/dist/operation-journal/reducer.d.ts.map +1 -0
- package/dist/operation-journal/reducer.js +73 -0
- package/dist/operation-journal/reducer.js.map +1 -0
- package/dist/operation-journal/s3.d.ts +7 -0
- package/dist/operation-journal/s3.d.ts.map +1 -0
- package/dist/operation-journal/s3.js +667 -0
- package/dist/operation-journal/s3.js.map +1 -0
- package/dist/operation-journal.d.ts +14 -0
- package/dist/operation-journal.d.ts.map +1 -0
- package/dist/operation-journal.js +12 -0
- package/dist/operation-journal.js.map +1 -0
- package/dist/platform/bun.d.ts +7 -0
- package/dist/platform/bun.d.ts.map +1 -0
- package/dist/platform/bun.js +15 -0
- package/dist/platform/bun.js.map +1 -0
- package/dist/platform/credentials.d.ts +32 -0
- package/dist/platform/credentials.d.ts.map +1 -0
- package/dist/platform/credentials.js +834 -0
- package/dist/platform/credentials.js.map +1 -0
- package/dist/platform/host-support.d.ts +2 -0
- package/dist/platform/host-support.d.ts.map +1 -0
- package/dist/platform/host-support.js +4 -0
- package/dist/platform/host-support.js.map +1 -0
- package/dist/platform/node.d.ts +7 -0
- package/dist/platform/node.d.ts.map +1 -0
- package/dist/platform/node.js +15 -0
- package/dist/platform/node.js.map +1 -0
- package/dist/platform/release-runtime.d.ts +11 -0
- package/dist/platform/release-runtime.d.ts.map +1 -0
- package/dist/platform/release-runtime.js +34 -0
- package/dist/platform/release-runtime.js.map +1 -0
- package/dist/platform/services.d.ts +15 -0
- package/dist/platform/services.d.ts.map +1 -0
- package/dist/platform/services.js +30 -0
- package/dist/platform/services.js.map +1 -0
- package/dist/platform/source-observer.d.ts +5 -0
- package/dist/platform/source-observer.d.ts.map +1 -0
- package/dist/platform/source-observer.js +159 -0
- package/dist/platform/source-observer.js.map +1 -0
- package/dist/provider-sdk.d.ts +14 -0
- package/dist/provider-sdk.d.ts.map +1 -0
- package/dist/provider-sdk.js +10 -0
- package/dist/provider-sdk.js.map +1 -0
- package/dist/publication/adapter.d.ts +212 -0
- package/dist/publication/adapter.d.ts.map +1 -0
- package/dist/publication/adapter.js +83 -0
- package/dist/publication/adapter.js.map +1 -0
- package/dist/publication/authority.d.ts +137 -0
- package/dist/publication/authority.d.ts.map +1 -0
- package/dist/publication/authority.js +233 -0
- package/dist/publication/authority.js.map +1 -0
- package/dist/publication/catalog-git.d.ts +37 -0
- package/dist/publication/catalog-git.d.ts.map +1 -0
- package/dist/publication/catalog-git.js +451 -0
- package/dist/publication/catalog-git.js.map +1 -0
- package/dist/publication/claim.d.ts +39 -0
- package/dist/publication/claim.d.ts.map +1 -0
- package/dist/publication/claim.js +31 -0
- package/dist/publication/claim.js.map +1 -0
- package/dist/publication/coordinator.d.ts +246 -0
- package/dist/publication/coordinator.d.ts.map +1 -0
- package/dist/publication/coordinator.js +370 -0
- package/dist/publication/coordinator.js.map +1 -0
- package/dist/publication/github.d.ts +36 -0
- package/dist/publication/github.d.ts.map +1 -0
- package/dist/publication/github.js +695 -0
- package/dist/publication/github.js.map +1 -0
- package/dist/publication/http.d.ts +69 -0
- package/dist/publication/http.d.ts.map +1 -0
- package/dist/publication/http.js +29 -0
- package/dist/publication/http.js.map +1 -0
- package/dist/publication/index.d.ts +5 -0
- package/dist/publication/index.d.ts.map +1 -0
- package/dist/publication/index.js +5 -0
- package/dist/publication/index.js.map +1 -0
- package/dist/publication/npm.d.ts +40 -0
- package/dist/publication/npm.d.ts.map +1 -0
- package/dist/publication/npm.js +359 -0
- package/dist/publication/npm.js.map +1 -0
- package/dist/publication/profiles.d.ts +136 -0
- package/dist/publication/profiles.d.ts.map +1 -0
- package/dist/publication/profiles.js +90 -0
- package/dist/publication/profiles.js.map +1 -0
- package/dist/publication/publisher.d.ts +82 -0
- package/dist/publication/publisher.d.ts.map +1 -0
- package/dist/publication/publisher.js +53 -0
- package/dist/publication/publisher.js.map +1 -0
- package/dist/publication/pypi.d.ts +45 -0
- package/dist/publication/pypi.d.ts.map +1 -0
- package/dist/publication/pypi.js +369 -0
- package/dist/publication/pypi.js.map +1 -0
- package/dist/publication/recovery.d.ts +663 -0
- package/dist/publication/recovery.d.ts.map +1 -0
- package/dist/publication/recovery.js +252 -0
- package/dist/publication/recovery.js.map +1 -0
- package/dist/publication/report.d.ts +1061 -0
- package/dist/publication/report.d.ts.map +1 -0
- package/dist/publication/report.js +441 -0
- package/dist/publication/report.js.map +1 -0
- package/dist/recipes/config.d.ts +296 -0
- package/dist/recipes/config.d.ts.map +1 -0
- package/dist/recipes/config.js +325 -0
- package/dist/recipes/config.js.map +1 -0
- package/dist/release/capabilities.d.ts +12 -0
- package/dist/release/capabilities.d.ts.map +1 -0
- package/dist/release/capabilities.js +395 -0
- package/dist/release/capabilities.js.map +1 -0
- package/dist/release/compiler.d.ts +5 -0
- package/dist/release/compiler.d.ts.map +1 -0
- package/dist/release/compiler.js +19 -0
- package/dist/release/compiler.js.map +1 -0
- package/dist/release/config.d.ts +5 -0
- package/dist/release/config.d.ts.map +1 -0
- package/dist/release/config.js +10 -0
- package/dist/release/config.js.map +1 -0
- package/dist/release/context.d.ts +96 -0
- package/dist/release/context.d.ts.map +1 -0
- package/dist/release/context.js +168 -0
- package/dist/release/context.js.map +1 -0
- package/dist/release/graph.d.ts +271 -0
- package/dist/release/graph.d.ts.map +1 -0
- package/dist/release/graph.js +766 -0
- package/dist/release/graph.js.map +1 -0
- package/dist/release/inspect.d.ts +88 -0
- package/dist/release/inspect.d.ts.map +1 -0
- package/dist/release/inspect.js +75 -0
- package/dist/release/inspect.js.map +1 -0
- package/dist/release/prepare.d.ts +24 -0
- package/dist/release/prepare.d.ts.map +1 -0
- package/dist/release/prepare.js +1115 -0
- package/dist/release/prepare.js.map +1 -0
- package/dist/release/prepared-ref.d.ts +60 -0
- package/dist/release/prepared-ref.d.ts.map +1 -0
- package/dist/release/prepared-ref.js +131 -0
- package/dist/release/prepared-ref.js.map +1 -0
- package/dist/release/prepared-store.d.ts +90 -0
- package/dist/release/prepared-store.d.ts.map +1 -0
- package/dist/release/prepared-store.js +339 -0
- package/dist/release/prepared-store.js.map +1 -0
- package/dist/release/prepared.d.ts +172 -0
- package/dist/release/prepared.d.ts.map +1 -0
- package/dist/release/prepared.js +268 -0
- package/dist/release/prepared.js.map +1 -0
- package/dist/release/staging.d.ts +31 -0
- package/dist/release/staging.d.ts.map +1 -0
- package/dist/release/staging.js +218 -0
- package/dist/release/staging.js.map +1 -0
- package/dist/resolve/authored.d.ts +53 -0
- package/dist/resolve/authored.d.ts.map +1 -0
- package/dist/resolve/authored.js +55 -0
- package/dist/resolve/authored.js.map +1 -0
- package/dist/resolve/encode.d.ts +3 -0
- package/dist/resolve/encode.d.ts.map +1 -0
- package/dist/resolve/encode.js +21 -0
- package/dist/resolve/encode.js.map +1 -0
- package/dist/resolve/errors.d.ts +7 -0
- package/dist/resolve/errors.d.ts.map +1 -0
- package/dist/resolve/errors.js +17 -0
- package/dist/resolve/errors.js.map +1 -0
- package/dist/resolve/facts.d.ts +12 -0
- package/dist/resolve/facts.d.ts.map +1 -0
- package/dist/resolve/facts.js +18 -0
- package/dist/resolve/facts.js.map +1 -0
- package/dist/resolve/resolve.d.ts +10 -0
- package/dist/resolve/resolve.d.ts.map +1 -0
- package/dist/resolve/resolve.js +242 -0
- package/dist/resolve/resolve.js.map +1 -0
- package/dist/store.d.ts +11 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +9 -0
- package/dist/store.js.map +1 -0
- package/examples/README.md +20 -30
- package/examples/github-release/release.config.json +11 -18
- package/examples/homebrew-tap/README.md +11 -0
- package/examples/homebrew-tap/release.config.json +40 -28
- package/examples/multi-target/release.config.json +28 -53
- package/examples/npm-first-publish/release.config.json +23 -25
- package/examples/npm-only/release.config.json +22 -30
- package/examples/portable-cli/README.md +17 -0
- package/examples/portable-cli/artifacts/portable-example-0.1.0-darwin-arm64 +1 -0
- package/examples/portable-cli/artifacts/portable-example-0.1.0-darwin-x64 +1 -0
- package/examples/portable-cli/artifacts/portable-example-0.1.0-linux-arm64 +1 -0
- package/examples/portable-cli/artifacts/portable-example-0.1.0-linux-x64 +1 -0
- package/examples/portable-cli/artifacts/portable-example-0.1.0-windows-x64.exe +1 -0
- package/examples/portable-cli/artifacts/portable_example-0.1.0-py3-none-macosx_10_15_x86_64.whl +1 -0
- package/examples/portable-cli/artifacts/portable_example-0.1.0-py3-none-macosx_11_0_arm64.whl +1 -0
- package/examples/portable-cli/artifacts/portable_example-0.1.0-py3-none-manylinux2014_aarch64.whl +1 -0
- package/examples/portable-cli/artifacts/portable_example-0.1.0-py3-none-manylinux2014_x86_64.whl +1 -0
- package/examples/portable-cli/artifacts/portable_example-0.1.0-py3-none-win_amd64.whl +1 -0
- package/examples/portable-cli/package.json +9 -0
- package/examples/portable-cli/release.config.json +53 -0
- package/examples/portable-cli/src/cli.ts +3 -0
- package/examples/pypi-registry/README.md +8 -0
- package/examples/scoop-bucket/README.md +10 -0
- package/examples/scoop-bucket/release.config.json +40 -30
- package/package.json +73 -154
- package/src/api/api.ts +365 -0
- package/src/api/errors.ts +36 -0
- package/src/api/input.ts +92 -0
- package/src/api/runtime.ts +14 -0
- package/src/api/types.ts +103 -0
- package/src/capabilities/bun-targets.ts +2 -0
- package/src/capabilities/field-ownership.ts +60 -0
- package/src/capabilities/module.ts +158 -0
- package/src/capabilities/registry.ts +333 -0
- package/src/config/config.ts +48 -0
- package/src/correction/coordinator.ts +336 -0
- package/src/correction/index.ts +2 -0
- package/src/correction/intent.ts +172 -0
- package/src/drivers/archive.ts +111 -0
- package/src/drivers/contain.ts +20 -0
- package/src/drivers/environment.ts +28 -0
- package/src/drivers/errors.ts +6 -0
- package/src/drivers/glob.ts +137 -0
- package/src/drivers/process.ts +339 -0
- package/src/drivers/python-wheel.ts +145 -0
- package/src/drivers/redact.ts +31 -0
- package/src/drivers/seccomp-helper-source.ts +121 -0
- package/src/drivers/utils.ts +10 -0
- package/src/drivers/workspace.ts +46 -0
- package/src/extensions/provider-adapter.ts +99 -0
- package/src/host.ts +140 -0
- package/src/index.ts +64 -0
- package/src/model/artifact-collection.ts +237 -0
- package/src/model/authority.ts +116 -0
- package/src/model/bun-targets.ts +34 -0
- package/src/model/canonical.ts +205 -0
- package/src/model/catalog.ts +220 -0
- package/src/model/digest.ts +172 -0
- package/src/model/errors.ts +6 -0
- package/src/model/primitives.ts +37 -0
- package/src/model/pypi.ts +30 -0
- package/src/model/python-distribution.ts +360 -0
- package/src/model/secret-patterns.ts +11 -0
- package/src/operation-journal/authority.ts +162 -0
- package/src/operation-journal/aws/deadline.ts +41 -0
- package/src/operation-journal/aws/oidc.ts +439 -0
- package/src/operation-journal/aws/policy.ts +491 -0
- package/src/operation-journal/aws/s3-boundary.ts +562 -0
- package/src/operation-journal/aws.ts +60 -0
- package/src/operation-journal/canonical.ts +373 -0
- package/src/operation-journal/model.ts +301 -0
- package/src/operation-journal/reducer.ts +112 -0
- package/src/operation-journal/s3.ts +884 -0
- package/src/operation-journal.ts +51 -0
- package/src/platform/bun.ts +38 -0
- package/src/platform/credentials.ts +1151 -0
- package/src/platform/host-support.ts +4 -0
- package/src/platform/node.ts +38 -0
- package/src/platform/release-runtime.ts +47 -0
- package/src/platform/services.ts +57 -0
- package/src/platform/source-observer.ts +193 -0
- package/src/provider-sdk.ts +48 -0
- package/src/publication/adapter.ts +132 -0
- package/src/publication/authority.ts +397 -0
- package/src/publication/catalog-git.ts +603 -0
- package/src/publication/claim.ts +51 -0
- package/src/publication/coordinator.ts +578 -0
- package/src/publication/github.ts +1022 -0
- package/src/publication/http.ts +101 -0
- package/src/publication/index.ts +4 -0
- package/src/publication/npm.ts +525 -0
- package/src/publication/profiles.ts +94 -0
- package/src/publication/publisher.ts +130 -0
- package/src/publication/pypi.ts +463 -0
- package/src/publication/recovery.ts +349 -0
- package/src/publication/report.ts +628 -0
- package/src/recipes/config.ts +395 -0
- package/src/release/capabilities.ts +460 -0
- package/src/release/compiler.ts +28 -0
- package/src/release/config.ts +12 -0
- package/src/release/context.ts +223 -0
- package/src/release/graph.ts +866 -0
- package/src/release/inspect.ts +83 -0
- package/src/release/prepare.ts +1329 -0
- package/src/release/prepared-ref.ts +193 -0
- package/src/release/prepared-store.ts +378 -0
- package/src/release/prepared.ts +299 -0
- package/src/release/staging.ts +257 -0
- package/src/resolve/authored.ts +64 -0
- package/src/resolve/encode.ts +22 -0
- package/src/resolve/errors.ts +15 -0
- package/src/resolve/facts.ts +18 -0
- package/src/resolve/resolve.ts +328 -0
- package/src/store.ts +28 -0
- package/templates/README.md +55 -72
- package/templates/bun-cli-github/README.md +7 -9
- package/templates/bun-cli-github/release.config.json +35 -73
- package/templates/github-actions/release.yml +74 -0
- package/templates/github-actions/reviewed-release.yml +115 -0
- package/templates/multi-target-homebrew/README.md +10 -0
- package/templates/multi-target-homebrew/release.config.json +43 -60
- package/templates/multi-target-scoop/README.md +10 -0
- package/templates/multi-target-scoop/release.config.json +43 -62
- package/templates/npm-github/release.config.json +25 -38
- package/templates/npm-github/reviewed-release.config.json +37 -0
- package/templates/npm-only/README.md +10 -0
- package/templates/npm-only/release.config.json +15 -30
- package/templates/portable-cli/README.md +13 -0
- package/templates/portable-cli/release.config.json +53 -0
- package/dist/artifacts/adapter.d.ts +0 -39
- package/dist/artifacts/adapter.d.ts.map +0 -1
- package/dist/artifacts/adapter.js +0 -23
- package/dist/artifacts/adapter.js.map +0 -1
- package/dist/artifacts/registry.d.ts +0 -21
- package/dist/artifacts/registry.d.ts.map +0 -1
- package/dist/artifacts/registry.js +0 -21
- package/dist/artifacts/registry.js.map +0 -1
- package/dist/config/errors.d.ts +0 -24
- package/dist/config/errors.d.ts.map +0 -1
- package/dist/config/errors.js +0 -19
- package/dist/config/errors.js.map +0 -1
- package/dist/config/load.d.ts +0 -9
- package/dist/config/load.d.ts.map +0 -1
- package/dist/config/load.js +0 -29
- package/dist/config/load.js.map +0 -1
- package/dist/config/schema.d.ts +0 -12
- package/dist/config/schema.d.ts.map +0 -1
- package/dist/config/schema.js +0 -19
- package/dist/config/schema.js.map +0 -1
- package/dist/domain/artifact.d.ts +0 -118
- package/dist/domain/artifact.d.ts.map +0 -1
- package/dist/domain/artifact.js +0 -197
- package/dist/domain/artifact.js.map +0 -1
- package/dist/domain/evidence.d.ts +0 -59
- package/dist/domain/evidence.d.ts.map +0 -1
- package/dist/domain/evidence.js +0 -51
- package/dist/domain/evidence.js.map +0 -1
- package/dist/domain/operation.d.ts +0 -143
- package/dist/domain/operation.d.ts.map +0 -1
- package/dist/domain/operation.js +0 -198
- package/dist/domain/operation.js.map +0 -1
- package/dist/domain/release.d.ts +0 -93
- package/dist/domain/release.d.ts.map +0 -1
- package/dist/domain/release.js +0 -82
- package/dist/domain/release.js.map +0 -1
- package/dist/domain/remote-state.d.ts +0 -58
- package/dist/domain/remote-state.d.ts.map +0 -1
- package/dist/domain/remote-state.js +0 -55
- package/dist/domain/remote-state.js.map +0 -1
- package/dist/domain/target.d.ts +0 -148
- package/dist/domain/target.d.ts.map +0 -1
- package/dist/domain/target.js +0 -151
- package/dist/domain/target.js.map +0 -1
- package/dist/host/host.d.ts +0 -32
- package/dist/host/host.d.ts.map +0 -1
- package/dist/host/host.js +0 -24
- package/dist/host/host.js.map +0 -1
- package/dist/host/http-live.d.ts +0 -6
- package/dist/host/http-live.d.ts.map +0 -1
- package/dist/host/http-live.js +0 -86
- package/dist/host/http-live.js.map +0 -1
- package/dist/host/http.d.ts +0 -43
- package/dist/host/http.d.ts.map +0 -1
- package/dist/host/http.js +0 -59
- package/dist/host/http.js.map +0 -1
- package/dist/host/platform.d.ts +0 -10
- package/dist/host/platform.d.ts.map +0 -1
- package/dist/host/platform.js +0 -114
- package/dist/host/platform.js.map +0 -1
- package/dist/host/test.d.ts +0 -23
- package/dist/host/test.d.ts.map +0 -1
- package/dist/host/test.js +0 -222
- package/dist/host/test.js.map +0 -1
- package/dist/internal/workspace-path.d.ts +0 -15
- package/dist/internal/workspace-path.d.ts.map +0 -1
- package/dist/internal/workspace-path.js +0 -36
- package/dist/internal/workspace-path.js.map +0 -1
- package/dist/planner/artifact-inventory.d.ts +0 -9
- package/dist/planner/artifact-inventory.d.ts.map +0 -1
- package/dist/planner/artifact-inventory.js +0 -86
- package/dist/planner/artifact-inventory.js.map +0 -1
- package/dist/planner/create-release-plan.d.ts +0 -5
- package/dist/planner/create-release-plan.d.ts.map +0 -1
- package/dist/planner/create-release-plan.js +0 -25
- package/dist/planner/create-release-plan.js.map +0 -1
- package/dist/planner/errors.d.ts +0 -67
- package/dist/planner/errors.d.ts.map +0 -1
- package/dist/planner/errors.js +0 -58
- package/dist/planner/errors.js.map +0 -1
- package/dist/planner/evidence-recorder.d.ts +0 -28
- package/dist/planner/evidence-recorder.d.ts.map +0 -1
- package/dist/planner/evidence-recorder.js +0 -362
- package/dist/planner/evidence-recorder.js.map +0 -1
- package/dist/planner/executor.d.ts +0 -58
- package/dist/planner/executor.d.ts.map +0 -1
- package/dist/planner/executor.js +0 -147
- package/dist/planner/executor.js.map +0 -1
- package/dist/planner/normalize-release.d.ts +0 -19
- package/dist/planner/normalize-release.d.ts.map +0 -1
- package/dist/planner/normalize-release.js +0 -342
- package/dist/planner/normalize-release.js.map +0 -1
- package/dist/planner/reconcile.d.ts +0 -17
- package/dist/planner/reconcile.d.ts.map +0 -1
- package/dist/planner/reconcile.js +0 -259
- package/dist/planner/reconcile.js.map +0 -1
- package/dist/planner/render-plan.d.ts +0 -15
- package/dist/planner/render-plan.d.ts.map +0 -1
- package/dist/planner/render-plan.js +0 -231
- package/dist/planner/render-plan.js.map +0 -1
- package/dist/targets/adapter-helpers.d.ts +0 -79
- package/dist/targets/adapter-helpers.d.ts.map +0 -1
- package/dist/targets/adapter-helpers.js +0 -194
- package/dist/targets/adapter-helpers.js.map +0 -1
- package/dist/targets/adapter.d.ts +0 -17
- package/dist/targets/adapter.d.ts.map +0 -1
- package/dist/targets/adapter.js +0 -2
- package/dist/targets/adapter.js.map +0 -1
- package/dist/targets/github-release.d.ts +0 -25
- package/dist/targets/github-release.d.ts.map +0 -1
- package/dist/targets/github-release.js +0 -82
- package/dist/targets/github-release.js.map +0 -1
- package/dist/targets/github.d.ts +0 -11
- package/dist/targets/github.d.ts.map +0 -1
- package/dist/targets/github.js +0 -117
- package/dist/targets/github.js.map +0 -1
- package/dist/targets/homebrew.d.ts +0 -11
- package/dist/targets/homebrew.d.ts.map +0 -1
- package/dist/targets/homebrew.js +0 -210
- package/dist/targets/homebrew.js.map +0 -1
- package/dist/targets/live.d.ts +0 -5
- package/dist/targets/live.d.ts.map +0 -1
- package/dist/targets/live.js +0 -50
- package/dist/targets/live.js.map +0 -1
- package/dist/targets/npm.d.ts +0 -10
- package/dist/targets/npm.d.ts.map +0 -1
- package/dist/targets/npm.js +0 -112
- package/dist/targets/npm.js.map +0 -1
- package/dist/targets/pypi.d.ts +0 -11
- package/dist/targets/pypi.d.ts.map +0 -1
- package/dist/targets/pypi.js +0 -141
- package/dist/targets/pypi.js.map +0 -1
- package/dist/targets/registry.d.ts +0 -25
- package/dist/targets/registry.d.ts.map +0 -1
- package/dist/targets/registry.js +0 -34
- package/dist/targets/registry.js.map +0 -1
- package/dist/targets/scoop.d.ts +0 -11
- package/dist/targets/scoop.d.ts.map +0 -1
- package/dist/targets/scoop.js +0 -88
- package/dist/targets/scoop.js.map +0 -1
- package/dist/types/effect-internal.d.ts +0 -5
- package/dist/types/effect-internal.d.ts.map +0 -1
- package/dist/types/effect-internal.js +0 -2
- package/dist/types/effect-internal.js.map +0 -1
- package/dist/workflows/config.d.ts +0 -202
- package/dist/workflows/config.d.ts.map +0 -1
- package/dist/workflows/config.js +0 -420
- package/dist/workflows/config.js.map +0 -1
- package/dist/workflows/diagnostics.d.ts +0 -62
- package/dist/workflows/diagnostics.d.ts.map +0 -1
- package/dist/workflows/diagnostics.js +0 -530
- package/dist/workflows/diagnostics.js.map +0 -1
- package/dist/workflows/distribution.d.ts +0 -25
- package/dist/workflows/distribution.d.ts.map +0 -1
- package/dist/workflows/distribution.js +0 -24
- package/dist/workflows/distribution.js.map +0 -1
- package/dist/workflows/evidence.d.ts +0 -17
- package/dist/workflows/evidence.d.ts.map +0 -1
- package/dist/workflows/evidence.js +0 -32
- package/dist/workflows/evidence.js.map +0 -1
- package/dist/workflows/index.d.ts +0 -8
- package/dist/workflows/index.d.ts.map +0 -1
- package/dist/workflows/index.js +0 -7
- package/dist/workflows/index.js.map +0 -1
- package/dist/workflows/init.d.ts +0 -84
- package/dist/workflows/init.d.ts.map +0 -1
- package/dist/workflows/init.js +0 -487
- package/dist/workflows/init.js.map +0 -1
- package/dist/workflows/live.d.ts +0 -9
- package/dist/workflows/live.d.ts.map +0 -1
- package/dist/workflows/live.js +0 -7
- package/dist/workflows/live.js.map +0 -1
- package/dist/workflows/options.d.ts +0 -30
- package/dist/workflows/options.d.ts.map +0 -1
- package/dist/workflows/options.js +0 -16
- package/dist/workflows/options.js.map +0 -1
- package/examples/non-strict-skips/artifacts/release-example-skips-0.1.0.tgz +0 -1
- package/examples/non-strict-skips/release.config.json +0 -31
- package/examples/pypi-registry/release.config.json +0 -31
- package/templates/github-actions/plan-and-approved-execute.yml +0 -58
- package/templates/github-actions/plan-only.yml +0 -33
- package/templates/github-actions/trusted-publishing.yml +0 -61
package/README.md
CHANGED
|
@@ -1,382 +1,459 @@
|
|
|
1
|
-
#
|
|
1
|
+
# ts-release
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Automate multi-artifact releases and safely resume partial publication.
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
platform-specific artifacts when needed, and feed those artifacts into
|
|
7
|
-
target-specific package managers, catalogs, release hosts, and install surfaces.
|
|
8
|
-
Publish operations still stay reviewable and approval-gated, but the product
|
|
9
|
-
center is portable distribution data.
|
|
5
|
+
## Release locally
|
|
10
6
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
- Which binaries, archives, packages, or generated files make up this release?
|
|
14
|
-
- Which package managers or install channels consume each artifact variant?
|
|
15
|
-
- What target-specific files or commands will be generated?
|
|
16
|
-
- Which operations are only rendering data, and which ones publish externally?
|
|
17
|
-
- What evidence proves what was staged, rendered, validated, or executed?
|
|
18
|
-
|
|
19
|
-
The root package is the reusable TypeScript library. This repo also contains the
|
|
20
|
-
first-party Bun CLI app in `apps/release-ts` and the bundled GitHub Action in
|
|
21
|
-
`apps/ts-release-action`.
|
|
22
|
-
|
|
23
|
-
## What It Does
|
|
24
|
-
|
|
25
|
-
`ts-release` models distribution as data:
|
|
26
|
-
|
|
27
|
-
```text
|
|
28
|
-
release config
|
|
29
|
-
-> normalized release identity
|
|
30
|
-
-> artifact recipes and inventory
|
|
31
|
-
-> installable artifact variants
|
|
32
|
-
-> target-specific distribution operations
|
|
33
|
-
-> generated package-manager files
|
|
34
|
-
-> explicit execution evidence
|
|
35
|
-
-> verification or reconciliation
|
|
36
|
-
```
|
|
37
|
-
|
|
38
|
-
The library currently plans, stages, and validates these distribution surfaces:
|
|
39
|
-
|
|
40
|
-
| Surface | What ts-release models |
|
|
41
|
-
|---|---|
|
|
42
|
-
| npm | package publish, native dry-run validation, provenance, trusted publishing |
|
|
43
|
-
| GitHub Releases | release creation, asset uploads, REST API verification, draft reconciliation |
|
|
44
|
-
| Homebrew taps | generated formula files, macOS artifact variants, and approved tap pushes |
|
|
45
|
-
| PyPI | already-built distributions and platform CLI wrapper wheels published through Twine |
|
|
46
|
-
| Scoop buckets | generated manifest files, Windows binary shims, and approved bucket pushes |
|
|
47
|
-
| Bun executables | optional binary artifact recipe staging before target planning |
|
|
48
|
-
|
|
49
|
-
It is not a fake universal package manager and does not hide each ecosystem's
|
|
50
|
-
manifest rules. It can stage declared artifacts through adapters, but it does
|
|
51
|
-
not replace full build pipelines, compilers, signing, or installer toolchains.
|
|
52
|
-
The job is to keep shared artifact inventory and target-specific distribution
|
|
53
|
-
data in one typed plan.
|
|
54
|
-
|
|
55
|
-
## Quick Start
|
|
56
|
-
|
|
57
|
-
Inside this repository, the CLI script runs the first-party Bun app:
|
|
58
|
-
|
|
59
|
-
```sh
|
|
60
|
-
bun run cli init --template bun-cli-github --package @scope/pkg --repo owner/repo --github-actions --write
|
|
61
|
-
bun run cli validate-config --config release.config.json
|
|
62
|
-
bun run cli stage-artifacts --config release.config.json --format text
|
|
63
|
-
bun run cli plan --config release.config.json --format text
|
|
64
|
-
bun run cli render --config release.config.json
|
|
65
|
-
```
|
|
66
|
-
|
|
67
|
-
The first useful path is artifact-first: write or scaffold a config, stage any
|
|
68
|
-
declared artifact recipes, plan the target distribution work, then render
|
|
69
|
-
package-manager files or release metadata. These commands do not publish
|
|
70
|
-
anything unless an execution command receives explicit approval.
|
|
71
|
-
|
|
72
|
-
To publish through the full ordered workflow, pass both execution approvals:
|
|
73
|
-
|
|
74
|
-
```sh
|
|
75
|
-
bun run cli run --config release.config.json --execute --approve-irreversible
|
|
76
|
-
```
|
|
77
|
-
|
|
78
|
-
`run` renders generated files, validates preflights, executes approved publish
|
|
79
|
-
operations, and verifies remote state. The lower-level commands are available
|
|
80
|
-
when you want a manual pause between phases:
|
|
7
|
+
The normal path is one command from a clean Git checkout:
|
|
81
8
|
|
|
82
9
|
```sh
|
|
83
|
-
|
|
84
|
-
bun run cli validate --config release.config.json
|
|
85
|
-
bun run cli print --config release.config.json
|
|
86
|
-
bun run cli execute --config release.config.json --execute --approve-irreversible
|
|
87
|
-
bun run cli verify --config release.config.json
|
|
88
|
-
```
|
|
89
|
-
|
|
90
|
-
## GitHub Actions
|
|
91
|
-
|
|
92
|
-
The bundled action is the intended CI adapter:
|
|
93
|
-
|
|
94
|
-
```yaml
|
|
95
|
-
- uses: mannyc2/ts-release-action@v1
|
|
96
|
-
with:
|
|
97
|
-
command: plan
|
|
98
|
-
config: release.config.json
|
|
99
|
-
format: markdown
|
|
100
|
-
upload-evidence: true
|
|
10
|
+
ts-release release --config release.config.json
|
|
101
11
|
```
|
|
102
12
|
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
13
|
+
`release` resolves observed package and Git facts, materializes the exact
|
|
14
|
+
verified commit, runs declared local preparation, commits one complete
|
|
15
|
+
`prepared-release/v2` bundle, observes every configured destination, and
|
|
16
|
+
publishes only after a provider-specific decision authorizes that exact
|
|
17
|
+
subject. The command prints the durable prepared reference and correlated
|
|
18
|
+
report. A blocked or uncertain report is preserved and exits nonzero.
|
|
106
19
|
|
|
107
|
-
|
|
20
|
+
npm authentication is always explicit. A GitHub-hosted npm and GitHub release
|
|
21
|
+
can use this authored configuration:
|
|
108
22
|
|
|
109
|
-
```
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
23
|
+
```json
|
|
24
|
+
{
|
|
25
|
+
"project": { "repository": "owner/repo" },
|
|
26
|
+
"versionFrom": "manifest",
|
|
27
|
+
"npmPackage": { "path": "." },
|
|
28
|
+
"publish": {
|
|
29
|
+
"npm": {
|
|
30
|
+
"authentication": {
|
|
31
|
+
"strategy": "trusted-publishing",
|
|
32
|
+
"attestation": {
|
|
33
|
+
"provider": "github-actions",
|
|
34
|
+
"runner": "github-hosted",
|
|
35
|
+
"repository": "owner/repo",
|
|
36
|
+
"workflow": "release.yml",
|
|
37
|
+
"workflowRef": "refs/heads/main",
|
|
38
|
+
"allowedAction": "npm-publish-direct"
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
"github": {}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
117
45
|
```
|
|
118
46
|
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
`
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
47
|
+
`workflow` and `workflowRef` are local host-admission constraints, not claims
|
|
48
|
+
about fields exposed by npm's trusted-publisher configuration. They must name
|
|
49
|
+
the workflow that actually invokes publication: use `release.yml` with the
|
|
50
|
+
automatic template and `reviewed-release.yml` with the reviewed template. The
|
|
51
|
+
host must observe that exact repository/path/ref on a GitHub-hosted runner
|
|
52
|
+
before it reads either OIDC request value. Public npm metadata reads are always
|
|
53
|
+
anonymous; private or custom-registry authenticated reads are unsupported
|
|
54
|
+
until configured with a distinct read credential.
|
|
55
|
+
|
|
56
|
+
The resolver fills package name, version, tag, commit, and repository only
|
|
57
|
+
when observed facts agree with authored intent. For a non-OIDC host, use
|
|
58
|
+
`{ "strategy": "token", "credential": "NPM_TOKEN" }` instead. The value of
|
|
59
|
+
that environment variable remains host-owned and never enters configuration,
|
|
60
|
+
prepared bytes, reports, or logs.
|
|
61
|
+
|
|
62
|
+
Prebuilt Python distributions can be published to the closed `pypi` or
|
|
63
|
+
`testpypi` destination. Each named artifact must be a valid wheel or gzip
|
|
64
|
+
sdist whose filename and embedded metadata agree with the configured project
|
|
65
|
+
and version:
|
|
133
66
|
|
|
134
67
|
```json
|
|
135
68
|
{
|
|
136
|
-
"
|
|
137
|
-
"identity": {
|
|
138
|
-
"_tag": "PackageManifestReleaseIdentitySource",
|
|
139
|
-
"packagePath": "package.json",
|
|
140
|
-
"commit": "HEAD",
|
|
141
|
-
"tagTemplate": "v{version}"
|
|
142
|
-
},
|
|
69
|
+
"project": { "name": "fixture", "version": "1.0.0", "tag": "v1.0.0" },
|
|
143
70
|
"artifacts": [
|
|
144
|
-
{
|
|
145
|
-
"id": "package",
|
|
146
|
-
"path": ".",
|
|
147
|
-
"format": "directory",
|
|
148
|
-
"consumers": ["npm"]
|
|
149
|
-
}
|
|
71
|
+
{ "id": "wheel", "path": "dist/fixture-1.0.0-py3-none-any.whl", "format": "file" }
|
|
150
72
|
],
|
|
151
|
-
"
|
|
152
|
-
{
|
|
153
|
-
"
|
|
154
|
-
"
|
|
155
|
-
"
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
"workflow": "release.yml",
|
|
161
|
-
"packageExists": true,
|
|
162
|
-
"verifyPackageExists": true
|
|
163
|
-
},
|
|
164
|
-
"access": "public",
|
|
165
|
-
"provenance": true,
|
|
166
|
-
"dryRunSupport": "native",
|
|
167
|
-
"mutability": "immutable",
|
|
168
|
-
"recovery": "publish-new-version"
|
|
73
|
+
"publish": {
|
|
74
|
+
"pypi": {
|
|
75
|
+
"artifacts": ["wheel"],
|
|
76
|
+
"repository": "pypi",
|
|
77
|
+
"authentication": {
|
|
78
|
+
"strategy": "token",
|
|
79
|
+
"credential": "PYPI_TOKEN",
|
|
80
|
+
"scope": "project"
|
|
81
|
+
}
|
|
169
82
|
}
|
|
170
|
-
|
|
171
|
-
"strict": true,
|
|
172
|
-
"evidenceDirectory": ".release/evidence/{version}"
|
|
83
|
+
}
|
|
173
84
|
}
|
|
174
85
|
```
|
|
175
86
|
|
|
176
|
-
|
|
87
|
+
PyPI token upload additionally requires the host to install a shared,
|
|
88
|
+
durable terminal `PublicationClaimStore`; runner-local files and memory do not
|
|
89
|
+
satisfy that contract. The stock CLI and Action deliberately fail closed
|
|
90
|
+
without one. Library hosts can pass it to `makeNodeReleaseLayer`,
|
|
91
|
+
`makeBunReleaseLayer`, or `makeCustomReleaseLayer`. The token is projected as
|
|
92
|
+
PyPI Basic authentication only inside the authorized HTTP sink. PyPI trusted
|
|
93
|
+
publishing is represented as an external, host-owned
|
|
94
|
+
`pypa/gh-action-pypi-publish@release/v1` path; the stock coordinator neither
|
|
95
|
+
exchanges its OIDC token nor claims to recover that external upload.
|
|
96
|
+
|
|
97
|
+
This repository's selected self-release shape is declared in
|
|
98
|
+
`apps/release-ts/pypi-release.config.json`. It deterministically embeds one
|
|
99
|
+
native executable in each of these `ts-release` wheels:
|
|
100
|
+
|
|
101
|
+
- `py3-none-manylinux_2_17_x86_64`
|
|
102
|
+
- `py3-none-manylinux_2_17_aarch64`
|
|
103
|
+
- `py3-none-macosx_13_0_x86_64`
|
|
104
|
+
- `py3-none-macosx_13_0_arm64`
|
|
105
|
+
|
|
106
|
+
`.github/workflows/pypi-release.yml` prepares the exact four-file set in a
|
|
107
|
+
read-only build job, transfers it with GitHub Actions artifact retention, and
|
|
108
|
+
gives only the separate `pypi` environment job `id-token: write`. That job has
|
|
109
|
+
no checkout or arbitrary command step; it downloads the prepared wheels and
|
|
110
|
+
invokes the official PyPA trusted-publishing Action. The PyPI publisher must
|
|
111
|
+
be configured for owner `mannyc2`, repository `ts-release`, workflow
|
|
112
|
+
`pypi-release.yml`, branch `main`, and environment `pypi` before dispatch.
|
|
113
|
+
The macOS wheel tags certify the cross-compiled artifact targets; they do not
|
|
114
|
+
expand the product's Linux-only execution-host claim.
|
|
115
|
+
|
|
116
|
+
With the canonical GitHub origin or package repository configured, `init` can
|
|
117
|
+
discover the exact owner/repository coordinate and write this explicit shape:
|
|
177
118
|
|
|
178
119
|
```sh
|
|
179
|
-
|
|
180
|
-
bun run cli validate-config --config release.config.json --format text
|
|
181
|
-
bun run cli plan --config release.config.json --format summary
|
|
182
|
-
bun run cli explain npm:npm-publish --config release.config.json
|
|
183
|
-
```
|
|
184
|
-
|
|
185
|
-
Paths are release-workspace relative. Artifact paths can interpolate
|
|
186
|
-
`{version}`, `{name}`, and `{normalizedName}`. Evidence directories can
|
|
187
|
-
interpolate `{version}`.
|
|
188
|
-
|
|
189
|
-
## Artifact Variants
|
|
190
|
-
|
|
191
|
-
Artifact recipes can produce installable variants for different operating
|
|
192
|
-
systems and architectures. Bun executable recipes derive variant metadata from
|
|
193
|
-
their compile target, so the release plan can carry facts such as `linux`/`x64`
|
|
194
|
-
or `windows`/`x64` before any package-manager adapter consumes the artifact.
|
|
195
|
-
|
|
196
|
-
```json
|
|
197
|
-
{
|
|
198
|
-
"id": "cli-linux-x64",
|
|
199
|
-
"target": "bun-linux-x64-baseline",
|
|
200
|
-
"path": "artifacts/pkg-{version}-linux-x64",
|
|
201
|
-
"consumers": ["github"]
|
|
202
|
-
}
|
|
120
|
+
ts-release init --preset bun-npm-github
|
|
203
121
|
```
|
|
204
122
|
|
|
205
|
-
|
|
206
|
-
|
|
123
|
+
It refuses to guess when no repository coordinate is observable and strictly
|
|
124
|
+
inspects the exact generated configuration before writing it.
|
|
125
|
+
|
|
126
|
+
## Repository 0.3 self-release
|
|
127
|
+
|
|
128
|
+
The checked-in `.github/workflows/release.yml` is a manual, fail-closed
|
|
129
|
+
five-mode workflow. `prepare-exact-sha` has read-only repository authority
|
|
130
|
+
and independently commits one GitHub-assets bundle and one npm-tarball bundle
|
|
131
|
+
to the content-addressed Actions store. `certify-npm-oidc` adopts the exact npm
|
|
132
|
+
bundle, proves one trusted-publisher exchange through pinned npm's dry-run, and
|
|
133
|
+
proves unchanged anonymous registry state without upload, provenance, or
|
|
134
|
+
publication. `create-tag` has only the separate
|
|
135
|
+
`github-tag` environment and creates or reobserves the lightweight `v0.3.0`
|
|
136
|
+
tag at the exact candidate; it creates no Release. `publish-npm` accepts only
|
|
137
|
+
the npm bundle under the `npm` environment with `id-token: write`, then
|
|
138
|
+
rereads the public registry to prove exact tarball bytes and the exact GitHub
|
|
139
|
+
SLSA provenance identity. The pinned npm archive's Sigstore 4.1.0 verifier
|
|
140
|
+
requires the exact Fulcio workflow SAN and GitHub OIDC issuer, then binds the
|
|
141
|
+
certificate's workflow/source SHA and run-invocation extensions to the same
|
|
142
|
+
candidate and provenance statement. Its repository-subject extension must be
|
|
143
|
+
the ID-qualified `repo:mannyc2@126291407/ts-release@1271545637:environment:npm`
|
|
144
|
+
identity issued for the protected npm environment; the historical ref-bound
|
|
145
|
+
subject is rejected. Generic signature validity is insufficient.
|
|
146
|
+
Only afterward, `publish-github` accepts the GitHub
|
|
147
|
+
bundle plus the already-published npm bundle under the `github-release`
|
|
148
|
+
environment with `contents: write`. Every boundary
|
|
149
|
+
reauthenticates the checkout against the current public `main` tip immediately
|
|
150
|
+
before it can adopt or mutate anything.
|
|
151
|
+
|
|
152
|
+
The npm client itself is fetched from the canonical npm 11.11.0 tarball,
|
|
153
|
+
checked against its fixed SHA-512 and SHA-1 registry digests, and freshly
|
|
154
|
+
rematerialized before every boundary. Any nonempty `npm_config_*`, `PREFIX`,
|
|
155
|
+
`DESTDIR`, token variable, project/user npmrc, or default global npmrc stops
|
|
156
|
+
before repository or provider work.
|
|
157
|
+
|
|
158
|
+
The exact order is preparation, no-upload npm OIDC certification, lightweight
|
|
159
|
+
tag creation, npm publication and report-bound public/provenance verification,
|
|
160
|
+
then GitHub publication. A fresh
|
|
161
|
+
npm mutation must carry provenance for that exact workflow run attempt. If a
|
|
162
|
+
prior run applied the bytes but lost its response, an exact `AlreadyEquivalent`
|
|
163
|
+
retry instead authenticates the earlier canonical publishing run named by the
|
|
164
|
+
public provenance; it never demands impossible same-run provenance from a
|
|
165
|
+
no-op retry. Any uncertain, blocked, malformed, or differently bound Action
|
|
166
|
+
report stops verification. The first
|
|
167
|
+
GitHub publication invocation creates or resumes a private draft and uploads
|
|
168
|
+
only missing exact assets. For a desired public Release that staging result is
|
|
169
|
+
deliberately `uncertain`, not success, and the Release remains nonpublic. A
|
|
170
|
+
fresh invocation with the same candidate and both exact `prepared:gha:`
|
|
171
|
+
references must fully reread draft metadata and every paginated asset, download
|
|
172
|
+
and hash any asset whose API digest is absent, and only then perform a
|
|
173
|
+
PATCH-only public transition. Extra, duplicate, missing, or different assets
|
|
174
|
+
stop that transition. On 2026-09-01, repository environments `github-tag`
|
|
175
|
+
(ID `20986778371`), `npm` (ID `20985327992`), and `github-release`
|
|
176
|
+
(ID `20985328229`) were observed with reviewer `mannyc2`, self-review allowed,
|
|
177
|
+
admin bypass disabled, a custom deployment policy selecting exactly `main`,
|
|
178
|
+
and no environment secrets or variables. Re-query those mutable facts before
|
|
179
|
+
every dispatch. Repository Release immutability was also observed enabled on
|
|
180
|
+
2026-09-01; re-query it before GitHub staging or promotion. The repository OIDC
|
|
181
|
+
policy was observed on that date with the immutable ID-qualified subject
|
|
182
|
+
`repo:mannyc2@126291407/ts-release@1271545637:environment:npm`; re-query it
|
|
183
|
+
before certification or publication. That GitHub-side policy does not prove an
|
|
184
|
+
npm-side trusted-publisher record. The exact npm trusted-publisher subject
|
|
185
|
+
remains a separate prerequisite and is not inferred from an environment.
|
|
186
|
+
|
|
187
|
+
## Automatic GitHub Actions template
|
|
188
|
+
|
|
189
|
+
The reusable automatic template is one job and one Action invocation. Copy the exact
|
|
190
|
+
[automatic workflow template](templates/github-actions/release.yml). It is
|
|
191
|
+
manual-only and requires `candidate_sha` to equal the current commit on
|
|
192
|
+
`refs/heads/main` before the job can reach checkout. Its
|
|
193
|
+
mutation job grants `contents: write` for the same-repository tag, release, and
|
|
194
|
+
assets, `id-token: write` for npm trusted publishing, and `actions: read` for
|
|
195
|
+
prepared-artifact recovery. It installs the publisher boundary explicitly,
|
|
196
|
+
uses the job-scoped `GITHUB_TOKEN`, and uploads the redacted report as a
|
|
197
|
+
recovery artifact.
|
|
207
198
|
|
|
208
|
-
```
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
Direct artifact declarations can also include `variant` when an artifact was
|
|
218
|
-
built outside `ts-release`. Homebrew formulas can consume macOS `darwin` x64
|
|
219
|
-
and arm64 variants from one target, and Scoop manifests can derive a stable shim
|
|
220
|
-
from a Windows executable variant. Future package-manager adapters should follow
|
|
221
|
-
that pattern instead of guessing platform support from filenames.
|
|
222
|
-
|
|
223
|
-
## Diagnostics
|
|
224
|
-
|
|
225
|
-
Static diagnostics help catch missing auth and unsafe workflow setup before an
|
|
226
|
-
approved run:
|
|
227
|
-
|
|
228
|
-
```sh
|
|
229
|
-
bun run cli doctor --config release.config.json --format text
|
|
230
|
-
bun run cli check-auth --config release.config.json --target npm --format text
|
|
231
|
-
bun run cli check-ci --config release.config.json --workflow .github/workflows/release.yml --format markdown
|
|
199
|
+
```yaml
|
|
200
|
+
- id: release
|
|
201
|
+
uses: mannyc2/ts-release/apps/ts-release-action@v0.3.0
|
|
202
|
+
env:
|
|
203
|
+
GITHUB_TOKEN: ${{ github.token }}
|
|
204
|
+
with:
|
|
205
|
+
command: ${{ inputs.prepared_ref == '' && 'release' || 'publish' }}
|
|
206
|
+
config: ${{ inputs.prepared_ref == '' && 'release.config.json' || '' }}
|
|
207
|
+
prepared: ${{ inputs.prepared_ref }}
|
|
232
208
|
```
|
|
233
209
|
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
210
|
+
Leave `prepared_ref` empty for a fresh release. To resume after durable
|
|
211
|
+
preparation, dispatch the same candidate with the exact emitted
|
|
212
|
+
`prepared:gha:` reference; the job selects `publish`, loads and verifies the
|
|
213
|
+
original bundle, and does not rebuild.
|
|
214
|
+
|
|
215
|
+
`v0.3.0` is the immutable monorepo-subpath coordinate intended for this
|
|
216
|
+
candidate. Packaging and release certification must stop unless that tag is
|
|
217
|
+
created from the exact certified result commit before consumers can see a
|
|
218
|
+
README that names it. A floating Action branch is never an alternative.
|
|
219
|
+
|
|
220
|
+
## Optional environment-gated publication
|
|
221
|
+
|
|
222
|
+
When a host policy requires a protected environment, use the
|
|
223
|
+
[two-job workflow template](templates/github-actions/reviewed-release.yml).
|
|
224
|
+
Copy its paired
|
|
225
|
+
[reviewed configuration](templates/npm-github/reviewed-release.config.json)
|
|
226
|
+
to the repository root with the same filename; the workflow loads that exact
|
|
227
|
+
file.
|
|
228
|
+
Its prepare job has read-only repository authority and no OIDC permission. It
|
|
229
|
+
uploads one complete prepared bundle and passes only its content-addressed
|
|
230
|
+
hosted reference. The environment-gated publish job installs the publisher
|
|
231
|
+
toolchain, receives mutation permissions, reloads and verifies the bundle, and
|
|
232
|
+
then observes destinations before any write. The environment gate remains a workflow
|
|
233
|
+
fact; it is not release-engine identity or data.
|
|
234
|
+
|
|
235
|
+
The reviewed configuration attests `workflow: "reviewed-release.yml"` and
|
|
236
|
+
`workflowRef: "refs/heads/main"`. Keep the workflow filename and dispatch it
|
|
237
|
+
from that ref with `candidate_sha` equal to the current commit, or deliberately
|
|
238
|
+
update both constraints. Reusing an automatic configuration that attests
|
|
239
|
+
`release.yml` fails before OIDC acquisition. Recover a failed reviewed
|
|
240
|
+
publication by rerunning the publish job in the same workflow run, not by
|
|
241
|
+
preparing again.
|
|
242
|
+
|
|
243
|
+
## Prepare without publication
|
|
244
|
+
|
|
245
|
+
Use the split local path for build-only work or when bytes must cross an
|
|
246
|
+
explicit host boundary:
|
|
241
247
|
|
|
242
248
|
```sh
|
|
243
|
-
|
|
249
|
+
prepared_ref="$(ts-release prepare --config release.config.json)"
|
|
250
|
+
ts-release inspect "$prepared_ref"
|
|
244
251
|
```
|
|
245
252
|
|
|
246
|
-
|
|
253
|
+
The value is a path-free `prepared:local:sha256-…` reference resolved against
|
|
254
|
+
the selected content-addressed store. `--store` selects another local store;
|
|
255
|
+
the reference itself never embeds a filesystem path. Publication accepts only
|
|
256
|
+
a complete reference and never rebuilds from source as a fallback.
|
|
247
257
|
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
const root = "/path/to/release-workspace"
|
|
256
|
-
const RuntimeLayer = Live.makeLayer({ root }).pipe(
|
|
257
|
-
Layer.provideMerge(BunServices.layer),
|
|
258
|
-
Layer.provideMerge(BunHttpClient.layer)
|
|
259
|
-
)
|
|
260
|
-
|
|
261
|
-
const textPlan = await Effect.runPromise(
|
|
262
|
-
Distribution.renderPlan({ root, configPath: "release.config.json", format: "text" }).pipe(
|
|
263
|
-
Effect.provide(RuntimeLayer)
|
|
264
|
-
)
|
|
265
|
-
)
|
|
266
|
-
|
|
267
|
-
const evidence = await Effect.runPromise(
|
|
268
|
-
Distribution.run({
|
|
269
|
-
root,
|
|
270
|
-
configPath: "release.config.json",
|
|
271
|
-
execute: true,
|
|
272
|
-
approveIrreversible: true
|
|
273
|
-
}).pipe(Effect.provide(RuntimeLayer))
|
|
274
|
-
)
|
|
275
|
-
|
|
276
|
-
console.log(textPlan)
|
|
277
|
-
console.log(evidence.schemaVersion)
|
|
278
|
-
```
|
|
279
|
-
|
|
280
|
-
Use `@mannyc1/ts-release/workflows` for the curated `Distribution`, `Config`,
|
|
281
|
-
`Init`, `Diagnostics`, `Evidence`, and `Live` namespaces. The `Distribution`
|
|
282
|
-
namespace is the artifact-first facade; `Config` keeps the lower-level
|
|
283
|
-
config-file workflow names. Use exact subpaths such as
|
|
284
|
-
`@mannyc1/ts-release/workflows/distribution` or lower-level `domain/`,
|
|
285
|
-
`planner/`, `targets/`, and `host/` modules when you need tighter control or
|
|
286
|
-
maximum tree-shaking.
|
|
287
|
-
|
|
288
|
-
The package root export is intentionally empty. Public API is the explicit
|
|
289
|
-
subpath list in `package.json`.
|
|
290
|
-
|
|
291
|
-
## Templates And Examples
|
|
258
|
+
Local extension work uses two primitives. `CommandCheck` is a pass/fail gate.
|
|
259
|
+
`CommandArtifact` generates or transforms declared regular-file bytes. Data
|
|
260
|
+
flow uses declared input and output IDs. Generic preparation children receive
|
|
261
|
+
no authored host environment values, and the runner may retain only `PATH` as
|
|
262
|
+
argv execution plumbing. Trusted commands are not a sandbox or a generic
|
|
263
|
+
remote-effect mechanism.
|
|
292
264
|
|
|
293
|
-
|
|
265
|
+
## Observe and recover
|
|
294
266
|
|
|
295
|
-
|
|
296
|
-
- `npm-github`
|
|
297
|
-
- `bun-cli-github`
|
|
298
|
-
- `multi-target-homebrew`
|
|
299
|
-
- `multi-target-scoop`
|
|
300
|
-
|
|
301
|
-
Runnable fixtures live in `examples/` and are checked through the same workflow
|
|
302
|
-
path as user configs.
|
|
267
|
+
Observation is read-only:
|
|
303
268
|
|
|
304
269
|
```sh
|
|
305
|
-
|
|
306
|
-
cd examples/multi-target
|
|
307
|
-
bun ../../apps/release-ts/src/cli/main.ts plan --config release.config.json --format text
|
|
270
|
+
ts-release observe "$prepared_ref"
|
|
308
271
|
```
|
|
309
272
|
|
|
310
|
-
|
|
311
|
-
planning expects the generated files to exist:
|
|
273
|
+
To resume a partial or response-lost release, publish the same reference:
|
|
312
274
|
|
|
313
275
|
```sh
|
|
314
|
-
|
|
276
|
+
ts-release publish "$prepared_ref"
|
|
315
277
|
```
|
|
316
278
|
|
|
317
|
-
|
|
279
|
+
Every attempt verifies the manifest and blobs, then reobserves every subject.
|
|
280
|
+
Equivalent subjects are skipped. Conflict and pre-mutation uncertainty stop
|
|
281
|
+
without mutation. A post-dispatch unknown outcome stays uncertain until a new
|
|
282
|
+
exact observation converges. Publication is not an atomic transaction, so a
|
|
283
|
+
release may partially succeed and there is no universal rollback.
|
|
318
284
|
|
|
319
|
-
|
|
320
|
-
evidence bundles. Primitive commands write named files such as
|
|
321
|
-
`validation.json`; the full `run` workflow writes `evidence.json`.
|
|
285
|
+
## Provider-specific correction
|
|
322
286
|
|
|
323
|
-
|
|
324
|
-
{
|
|
325
|
-
"schemaVersion": "release-evidence/v1",
|
|
326
|
-
"releaseName": "release",
|
|
327
|
-
"releaseVersion": "0.1.0",
|
|
328
|
-
"records": [
|
|
329
|
-
{
|
|
330
|
-
"id": "npm:npm-pack-dry-run:command",
|
|
331
|
-
"operationId": "npm:npm-pack-dry-run",
|
|
332
|
-
"phase": "validation",
|
|
333
|
-
"targetId": "npm",
|
|
334
|
-
"risk": "read-only",
|
|
335
|
-
"status": "passed",
|
|
336
|
-
"severity": "info",
|
|
337
|
-
"message": "npm pack dry run passed.",
|
|
338
|
-
"startedAt": "2026-01-01T00:00:00.000Z",
|
|
339
|
-
"endedAt": "2026-01-01T00:00:00.100Z",
|
|
340
|
-
"durationMillis": 100,
|
|
341
|
-
"command": "npm pack --dry-run --json",
|
|
342
|
-
"exitCode": 0
|
|
343
|
-
}
|
|
344
|
-
]
|
|
345
|
-
}
|
|
346
|
-
```
|
|
347
|
-
|
|
348
|
-
Failed commands preserve partial evidence when possible. Non-strict mode records
|
|
349
|
-
missing validators as visible skipped evidence instead of silently dropping them.
|
|
350
|
-
|
|
351
|
-
## Reconciliation
|
|
352
|
-
|
|
353
|
-
`reconcile` is a narrow repair path for GitHub Releases. It reads the release by
|
|
354
|
-
tag, blocks on mismatched metadata or assets, skips an already matching
|
|
355
|
-
published release, and can publish a matching draft with `--execute`.
|
|
356
|
-
|
|
357
|
-
It does not replay immutable registry publishes:
|
|
287
|
+
Correction is deliberately separate from ordinary publication:
|
|
358
288
|
|
|
359
289
|
```sh
|
|
360
|
-
|
|
290
|
+
ts-release correct "$prepared_ref" correction.json
|
|
361
291
|
```
|
|
362
292
|
|
|
363
|
-
|
|
293
|
+
The command binds authored intent to the exact prepared provider subject. npm
|
|
294
|
+
and GitHub Release corrections remain canonical external operator proposals.
|
|
295
|
+
Catalog Git installs one conditional `forward-catalog-state` correction: it
|
|
296
|
+
requires a SemVer-newer replacement and changes both the consumer formula or
|
|
297
|
+
manifest and its managed-state record against the exact observed branch
|
|
298
|
+
generation. Deletion, arbitrary inverse operations, and announcements are not
|
|
299
|
+
release destinations.
|
|
300
|
+
|
|
301
|
+
## Capability and platform boundary
|
|
302
|
+
|
|
303
|
+
A source checkout or accepted field is not support evidence. The generated
|
|
304
|
+
capability inventory must join each supported row to its strict decoder,
|
|
305
|
+
default-layer entrypoint, exact observation semantics, and vertical test, and
|
|
306
|
+
the release-candidate matrix must exercise every claimed execution host.
|
|
307
|
+
|
|
308
|
+
| Axis | Kernel candidate boundary |
|
|
309
|
+
| --- | --- |
|
|
310
|
+
| Local preparation | Bun compilation, prebuilt imports, command checks/artifacts, archives, and checksums are retained; final support requires the generated capability and clean-candidate gates to agree. |
|
|
311
|
+
| Remote publication | npm, prebuilt PyPI distributions, GitHub Releases, and typed Homebrew/Scoop catalog Git delivery are installed. npm uses explicit trusted-publishing or token authentication; PyPI token writes require a host-supplied shared terminal claim store, and its trusted-publishing strategy is external-host-owned. |
|
|
312
|
+
| Correction | npm and GitHub authored proposals are exact-bound; PyPI yanking is observation-only; catalog Git installs exact paired SemVer-forward correction. |
|
|
313
|
+
| Execution hosts | Linux is the only installed execution host. The checked-in Action is a native Node 24 launcher around a workflow-installed, pinned Bun runtime. macOS and Windows are not ts-release execution hosts. |
|
|
314
|
+
| Artifact targets | The Bun builder advertises Linux and macOS x64/arm64 targets. macOS binaries are cross-compiled artifacts, not host-execution evidence. The self-release does not distribute a Windows ts-release binary. |
|
|
315
|
+
| Native tools | Linux preparation requires an external Bun executable and `libseccomp.so.2`; network-denied commands record both identities. WSL, when used, is Linux. A standalone CLI binary is not a self-contained replacement for these tools. |
|
|
316
|
+
|
|
317
|
+
Installed Node consumers must satisfy the package engine
|
|
318
|
+
`^22.22.2 || ^24.15.0 || >=26.0.0`; Bun consumers require Bun 1.3.14 or newer.
|
|
319
|
+
The checked-in Action uses GitHub's native Node 24 Action handler so the runner
|
|
320
|
+
can inject its Actions-artifact transport credentials. Its tiny checked-in
|
|
321
|
+
launcher passes no credentials to the Bun 1.3.14 runtime preloader, then runs
|
|
322
|
+
the checked-in `dist/index.js` through the workflow-installed Bun runtime.
|
|
323
|
+
Preparation stays in Bun, while every Actions-artifact upload or download is
|
|
324
|
+
delegated to the checked-in Node 24 bridge so the official artifact client runs
|
|
325
|
+
on its native stream implementation. The Action does not change the Node
|
|
326
|
+
engine of the installed library or CLI package.
|
|
327
|
+
|
|
328
|
+
The current source tree is not a release certificate. A published support
|
|
329
|
+
claim exists only after the clean-candidate evidence records all required
|
|
330
|
+
gates green; skipped live facts remain `UNVERIFIED`.
|
|
331
|
+
|
|
332
|
+
## Extension jobs and exclusions
|
|
333
|
+
|
|
334
|
+
The kernel translates extension requests to the owner that can enforce them:
|
|
335
|
+
|
|
336
|
+
| User job | Owner |
|
|
337
|
+
| --- | --- |
|
|
338
|
+
| Tests, policy checks, generated notes, and agent bundles | `CommandCheck` or declared `CommandArtifact` bytes |
|
|
339
|
+
| npm, prebuilt PyPI, GitHub Release, and catalog Git remote verification/publication | Installed provider modules; PyPI token mutation also requires the shared terminal claim boundary |
|
|
340
|
+
| Environment protection or human authorization | External workflow host |
|
|
341
|
+
| Downstream announcements | External workflow step after a complete report |
|
|
342
|
+
|
|
343
|
+
Homebrew and Scoop rendering/delivery use typed renderers and an exact paired
|
|
344
|
+
Git Data subject; arbitrary whole-file catalog templating remains excluded.
|
|
345
|
+
Generic wrapper-wheel generation remains excluded from the prebuilt PyPI
|
|
346
|
+
capability. The repository-specific four-wheel `ts-release` self-release is an
|
|
347
|
+
explicit product decision and is prepared by its dedicated workflow. PyPI
|
|
348
|
+
support is contract-tested but has not been live-write-dogfooded in this wave.
|
|
349
|
+
Custom library applications may compose full provider subjects through the
|
|
350
|
+
[`provider-sdk`](https://github.com/mannyc2/ts-release/blob/main/docs/native-extensions.md)
|
|
351
|
+
subpath. The stock CLI and Action
|
|
352
|
+
do not discover packages or treat generic hooks as remote publishers.
|
|
353
|
+
|
|
354
|
+
## Library API
|
|
355
|
+
|
|
356
|
+
The Promise API uses the same lifecycle as the CLI and Action:
|
|
364
357
|
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
358
|
+
```ts
|
|
359
|
+
import {
|
|
360
|
+
defineRelease,
|
|
361
|
+
encodeCompletePreparedReleaseRef,
|
|
362
|
+
makeReleaseApi
|
|
363
|
+
} from "@mannyc1/ts-release"
|
|
364
|
+
import { NodeReleaseLayer } from "@mannyc1/ts-release/node"
|
|
365
|
+
|
|
366
|
+
const config = defineRelease({
|
|
367
|
+
project: { repository: "owner/repo" },
|
|
368
|
+
versionFrom: "manifest" as const,
|
|
369
|
+
npmPackage: { path: "." },
|
|
370
|
+
publish: {
|
|
371
|
+
npm: {
|
|
372
|
+
authentication: {
|
|
373
|
+
strategy: "trusted-publishing" as const,
|
|
374
|
+
attestation: {
|
|
375
|
+
provider: "github-actions" as const,
|
|
376
|
+
runner: "github-hosted" as const,
|
|
377
|
+
repository: "owner/repo",
|
|
378
|
+
workflow: "release.yml",
|
|
379
|
+
workflowRef: "refs/heads/main",
|
|
380
|
+
allowedAction: "npm-publish-direct" as const
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
},
|
|
384
|
+
github: {}
|
|
385
|
+
}
|
|
386
|
+
})
|
|
387
|
+
|
|
388
|
+
const api = makeReleaseApi(NodeReleaseLayer)
|
|
389
|
+
try {
|
|
390
|
+
const result = await api.release({ config, workspace: process.cwd() })
|
|
391
|
+
console.log(encodeCompletePreparedReleaseRef(result.prepared))
|
|
392
|
+
console.log(result.report.status)
|
|
393
|
+
} finally {
|
|
394
|
+
await api.dispose()
|
|
395
|
+
}
|
|
371
396
|
```
|
|
372
397
|
|
|
373
|
-
|
|
398
|
+
The public operations are `inspect`, `prepare`, `observe`, `publish`,
|
|
399
|
+
`release`, and `correct`. Public inputs contain neither credential values nor
|
|
400
|
+
prepared paths. The derived graph is ephemeral; the verified prepared
|
|
401
|
+
manifest and blobs are the durable cross-process boundary.
|
|
402
|
+
|
|
403
|
+
The separate `@mannyc1/ts-release/operation-journal` subpath exposes the
|
|
404
|
+
provider-neutral canonical envelope and one S3 CAS protocol for durable
|
|
405
|
+
external-operation continuation. It stores consumer-owned opaque bytes and
|
|
406
|
+
never decodes provider fields. Workflow repository/run coordinates are derived
|
|
407
|
+
from the re-observed GitHub OIDC session rather than accepted from an append
|
|
408
|
+
request. A host can supply one already-authenticated, exact-policy S3 boundary
|
|
409
|
+
as the credential-agnostic qualification seam. The separate
|
|
410
|
+
`@mannyc1/ts-release/operation-journal/aws` subpath is the only operational
|
|
411
|
+
backend implementation: it accepts one sealed activation contract, rejects
|
|
412
|
+
ambient AWS variables and shared files, requests GitHub OIDC directly, uses
|
|
413
|
+
only the returned short-lived role session, and parses live STS, IAM, bucket,
|
|
414
|
+
Object Lock, ownership, public-access, and policy responses. It accepts no
|
|
415
|
+
profile, credential, endpoint, alternate bucket, or fallback-store input.
|
|
416
|
+
Operation identities are bounded to 65,536 bytes, payloads to 1,048,576 bytes,
|
|
417
|
+
and retained objects to 1,500,000 bytes before hashing or allocation. The AWS
|
|
418
|
+
trust and activation contract require the
|
|
419
|
+
reusable workflow to be called as `uses: .../operational-journal.yml@<40-hex>`;
|
|
420
|
+
a branch or tag ref is not authority, and the observed `job_workflow_ref` SHA
|
|
421
|
+
must equal `job_workflow_sha`. The frozen subject selects exactly one GitHub
|
|
422
|
+
environment-subject form: name-bound `repo:owner/repository:environment:name`
|
|
423
|
+
or immutable-ID-bound
|
|
424
|
+
`repo:owner@ownerId/repository@repositoryId:environment:name`; observed IDs
|
|
425
|
+
must reconstruct the latter exactly, and there is no runtime fallback between
|
|
426
|
+
forms. The same STS-admitted token must also report `workflow_dispatch`, a
|
|
427
|
+
branch ref, a public repository, and a GitHub-hosted runner. Every OIDC fetch,
|
|
428
|
+
AWS SDK send, and retained-object stream has a fixed 10,000 ms wall-clock
|
|
429
|
+
deadline in addition to single-attempt retry policy.
|
|
430
|
+
|
|
431
|
+
The checked-in `operational-journal.yml` is intentionally inert: it has no
|
|
432
|
+
OIDC permission, AWS coordinate, credential input, checkout, or executable
|
|
433
|
+
adapter and always stops. Activating it requires the separately provisioned
|
|
434
|
+
bucket/role, a released adapter version, a reviewed opaque-byte caller/callee
|
|
435
|
+
transport, and qualification of the exact retained object protocol. The
|
|
436
|
+
serialized SDK requests, structural boundary, and fake tests are not live AWS
|
|
437
|
+
or workflow qualification.
|
|
438
|
+
An activated reusable job must install the package-supported Node 22.22.2
|
|
439
|
+
runtime independently of the caller and launch the adapter through an
|
|
440
|
+
`env -i` allowlist containing only the exact Actions OIDC request coordinates
|
|
441
|
+
and non-secret activation inputs. The caller's Node 24.14.1 runtime is below a
|
|
442
|
+
transitive dependency's admitted Node 24 floor and must not run this package.
|
|
443
|
+
|
|
444
|
+
## Agent bundles and development
|
|
445
|
+
|
|
446
|
+
The single tracked agent source owner is `apps/ts-release-agents`. Generated
|
|
447
|
+
Codex and Claude layouts are ignored build output and are captured by the
|
|
448
|
+
self-release as declared `CommandArtifact` outputs. No root marketplace tree
|
|
449
|
+
is a second canonical owner.
|
|
374
450
|
|
|
375
451
|
```sh
|
|
376
|
-
bun
|
|
377
|
-
|
|
452
|
+
bun install --frozen-lockfile
|
|
453
|
+
bun run check:portable
|
|
454
|
+
bun test
|
|
378
455
|
```
|
|
379
456
|
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
457
|
+
The durable model is documented in [ARCHITECTURE.md](ARCHITECTURE.md), and the
|
|
458
|
+
precise public contract is in [SPEC.md](SPEC.md). Both files are included with the npm
|
|
459
|
+
package; this README does not rely on an unpackaged relative document.
|