putitoutthere 0.1.49 → 0.1.50

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -19,6 +19,8 @@ are prefixed `**BREAKING**` and link to the matching section in
19
19
 
20
20
  ### Changed
21
21
 
22
+ - **Reusable workflow + `action.yml` bumped to Node 24-compatible action majors.** GitHub deprecated Node 20 actions in September 2025; the runner forces Node 24 starting June 2, 2026 and removes Node 20 entirely on September 16, 2026. Bumps inside `.github/workflows/release.yml`: `actions/checkout@v4 → @v6`, `actions/setup-node@v4 → @v6`, `actions/setup-python@v5 → @v6`, `actions/upload-artifact@v4 → @v7`, `actions/download-artifact@v4 → @v8`. `action.yml` `runs.using: node20 → node24`. The canonical `pypi-publish` template in the README also bumps `actions/download-artifact@v4 → @v8` so consumers can paste a warning-free template; existing `@v4` copies in consumer workflows keep working but emit the deprecation warning in the caller's context. Artifact contract is unchanged: `download-artifact@v8` preserves the per-name subdirectory layout for downloads-by-name and `upload-artifact@v7`'s default behavior still produces zipped uploads keyed by `name:`. See [MIGRATIONS.md](./MIGRATIONS.md#reusable-workflow--actionyml-move-to-node-24-actions). (#253)
23
+
22
24
  - **BREAKING: PyPI uploads moved to a caller-side `pypi-publish` job.** PyPI's Trusted Publisher matching filters candidates by `repository_owner` + `repository_name` *before* checking `job_workflow_ref` ([Warehouse implementation](https://github.com/pypi/warehouse/blob/main/warehouse/oidc/models/github.py)); since the OIDC `repository` claim always reflects the caller's repo even inside a reusable workflow, a TP registered against `thekevinscott/putitoutthere` is filtered out before the workflow_ref is ever checked. PyPI explicitly documents this as unsupported ([troubleshooting](https://docs.pypi.org/trusted-publishers/troubleshooting/)). Tracked at [pypi/warehouse#11096](https://github.com/pypi/warehouse/issues/11096), no timeline. The engine still does plan + build + version-rewrite + git tag for PyPI; the actual upload (`pypa/gh-action-pypi-publish`) now runs in the consumer's workflow file as a second job, gated on `needs.release.outputs.has_pypi`. The canonical template grew from ~12 → ~30 lines but remains a single copy-paste — the `if:` skips the job for non-PyPI repos. See [MIGRATIONS.md](./MIGRATIONS.md#pypi-uploads-moved-to-caller-side-job) and [`notes/audits/2026-04-28-pypi-tp-reusable-workflow-constraint.md`](./notes/audits/2026-04-28-pypi-tp-reusable-workflow-constraint.md).
23
25
  - **Public consumer surface collapsed to the README + the reusable workflow.** The CLI, the JS action (`action.yml`), and the diagnostic subcommands (`doctor`, `preflight`) are internal seams the reusable workflow invokes; consumers do not call them. The entire `docs/` directory is removed — `README.md` is the single user-facing surface. See [MIGRATIONS.md](./MIGRATIONS.md#public-surface-collapsed-to-a-reusable-workflow) for the before/after.
24
26
  - **Auth is OIDC trusted publishers only.** The reusable workflow does not pass long-lived registry tokens (`NPM_TOKEN`, `PYPI_API_TOKEN`, `CARGO_REGISTRY_TOKEN`) as secrets. The engine's env-var fallback code paths still exist (in `src/auth.ts`); they're just not reachable through the reusable workflow.
package/MIGRATIONS.md CHANGED
@@ -21,6 +21,69 @@ Each section covers five things, in order:
21
21
 
22
22
  ## Unreleased
23
23
 
24
+ ### Reusable workflow + `action.yml` move to Node 24 actions
25
+
26
+ **Summary.** GitHub deprecated Node 20 actions in September 2025; the
27
+ hosted runner forces Node 24 starting June 2, 2026 and removes Node 20
28
+ entirely on September 16, 2026.
29
+ Every workflow run that called `putitoutthere` was emitting deprecation
30
+ warnings — one per job inside the reusable workflow, plus a top-level
31
+ `Actions running on Node.js 20` warning attributed to
32
+ `thekevinscott/putitoutthere@v0` itself, which the consumer could not
33
+ fix locally. The reusable workflow's pinned action majors and the JS
34
+ action's `runs.using` now target Node 24-compatible versions.
35
+
36
+ | Action | Before | After |
37
+ |---|---|---|
38
+ | `actions/checkout` | `@v4` | `@v6` |
39
+ | `actions/setup-node` | `@v4` | `@v6` |
40
+ | `actions/setup-python` | `@v5` | `@v6` |
41
+ | `actions/upload-artifact` | `@v4` | `@v7` |
42
+ | `actions/download-artifact` | `@v4` | `@v8` |
43
+ | `action.yml` `runs.using` | `node20` | `node24` |
44
+
45
+ **Required changes.** Consumers calling the reusable workflow at
46
+ `thekevinscott/putitoutthere/.github/workflows/release.yml@v0` get the
47
+ new pins automatically — no consumer-side YAML changes required. The
48
+ caller-side `pypi-publish` job in the canonical template now uses
49
+ `actions/download-artifact@v8`; existing copies still pinned at `@v4`
50
+ keep working but should be bumped to silence the same deprecation
51
+ warning in the consumer's own workflow file:
52
+
53
+ ```diff
54
+ pypi-publish:
55
+ ...
56
+ steps:
57
+ - - uses: actions/download-artifact@v4
58
+ + - uses: actions/download-artifact@v8
59
+ with:
60
+ pattern: '*-sdist'
61
+ ...
62
+ - - uses: actions/download-artifact@v4
63
+ + - uses: actions/download-artifact@v8
64
+ with:
65
+ pattern: '*-wheel-*'
66
+ ...
67
+ ```
68
+
69
+ **Deprecations removed.** None.
70
+
71
+ **Behavior changes without code changes.** Reusable workflow jobs now
72
+ run under Node 24 instead of Node 20. The artifact contract is
73
+ unchanged — `download-artifact@v8` preserves the per-name subdirectory
74
+ layout (`artifacts/<artifact-name>/<file>`) for downloads-by-name, and
75
+ `upload-artifact@v7`'s default still produces zipped uploads keyed by
76
+ the `name:` parameter. `download-artifact@v8` now fails on artifact
77
+ hash mismatches by default (was a warning in `@v4`); this is an
78
+ integrity check, not a behavior change for healthy uploads.
79
+
80
+ **Verification.** A consumer release run no longer emits the
81
+ `Actions running on Node.js 20 ... thekevinscott/putitoutthere@v0`
82
+ deprecation warning, nor the per-job warnings against `actions/checkout@v4`
83
+ et al. Tag, GitHub Release, and registry uploads occur as before.
84
+
85
+ ---
86
+
24
87
  ### PyPI uploads moved to caller-side job
25
88
 
26
89
  **Summary.** PyPI's Trusted Publisher matching filters candidates by
@@ -82,12 +145,12 @@ jobs:
82
145
  permissions:
83
146
  id-token: write
84
147
  steps:
85
- - uses: actions/download-artifact@v4
148
+ - uses: actions/download-artifact@v8
86
149
  with:
87
150
  pattern: '*-sdist'
88
151
  path: dist/
89
152
  merge-multiple: true
90
- - uses: actions/download-artifact@v4
153
+ - uses: actions/download-artifact@v8
91
154
  with:
92
155
  pattern: '*-wheel-*'
93
156
  path: dist/
package/README.md CHANGED
@@ -35,12 +35,12 @@ jobs:
35
35
  permissions:
36
36
  id-token: write
37
37
  steps:
38
- - uses: actions/download-artifact@v4
38
+ - uses: actions/download-artifact@v8
39
39
  with:
40
40
  pattern: '*-sdist'
41
41
  path: dist/
42
42
  merge-multiple: true
43
- - uses: actions/download-artifact@v4
43
+ - uses: actions/download-artifact@v8
44
44
  with:
45
45
  pattern: '*-wheel-*'
46
46
  path: dist/
package/action.yml CHANGED
@@ -25,5 +25,5 @@ outputs:
25
25
  description: "JSON matrix emitted by `plan`. Output key is omitted when the plan resolves to zero rows or when command is anything other than plan; downstream jobs should coalesce with `|| '[]'`."
26
26
 
27
27
  runs:
28
- using: 'node20'
28
+ using: 'node24'
29
29
  main: 'dist-action/index.js'
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "putitoutthere",
3
- "version": "0.1.49",
3
+ "version": "0.1.50",
4
4
  "description": "Polyglot release orchestrator for crates.io, PyPI, and npm",
5
5
  "license": "MIT",
6
6
  "repository": {