@stll/oxlint-config 0.12.0 → 0.12.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +84 -10
- package/dist/toolchain-guard.cjs +343 -114
- package/dist/toolchain-guard.cjs.map +1 -1
- package/dist/toolchain-guard.mjs +343 -114
- package/dist/toolchain-guard.mjs.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -64,15 +64,41 @@ The checkout must omit both `if` and `continue-on-error`, and its normalized
|
|
|
64
64
|
path must be unique among every checkout in that job, including later steps.
|
|
65
65
|
Unknown checkout destinations prevent mapped selectors from proving provenance.
|
|
66
66
|
Sparse checkouts must explicitly list the selected repository-relative file,
|
|
67
|
-
without the checkout prefix, in `sparse-checkout
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
entries cannot substitute for
|
|
67
|
+
without the checkout prefix, in `sparse-checkout`; a root-anchored entry such as
|
|
68
|
+
`/package.json` is accepted. This applies in either cone mode and to delegated
|
|
69
|
+
sources. Empty, glob, negation, or unsupported sparse configurations fail; a
|
|
70
|
+
cone-mode input alone is insufficient. Directory entries cannot substitute for
|
|
71
|
+
the selected file. A scoped Bun-source declaration can acknowledge a dynamic
|
|
72
|
+
sparse expression, but cannot waive a literal omission or invalid pattern,
|
|
73
|
+
including literal patterns mixed with expression lines or literal fragments
|
|
74
|
+
adjoining an expression. The deepest checkout destination containing a static selected file supplies that
|
|
75
|
+
file. Sparse validation checks that provider, including every writer at the same
|
|
76
|
+
destination, before expression acknowledgement; ancestor sparse settings do not
|
|
77
|
+
constrain an independent nested checkout. Checkout writes are processed in step
|
|
78
|
+
order: any later ancestor checkout invalidates earlier descendants, regardless of
|
|
79
|
+
its clean input. Checkout may clear a destination without a matching Git repository
|
|
80
|
+
even when clean is false. Unresolved clean values remain untrusted. Unknown
|
|
81
|
+
selectors remain fail closed. Mixed literal/expression sparse
|
|
82
|
+
configurations retain their literal paths: those paths must explicitly include a
|
|
83
|
+
static selected manifest. A declaration acknowledges only expression additions;
|
|
84
|
+
For every static manifest selector from the inspected source, the manifest pin
|
|
85
|
+
is validated after sparse acknowledgement, including fully dynamic sparse inputs.
|
|
71
86
|
Other nonempty, nonconstant GitHub expression refs on same-repository checkouts
|
|
72
87
|
(including `${{ job.workflow_repository }}`) delegate a safe static version-file selector
|
|
73
88
|
to that checkout. The CLI reports delegation on stdout without validating the
|
|
74
|
-
current source's version file.
|
|
75
|
-
`${{
|
|
89
|
+
current source's version file. Current-source checkouts also accept
|
|
90
|
+
`${{ github.sha }}` on the same repository, except reusable `workflow_call`
|
|
91
|
+
workflows whose GitHub context belongs to the caller. Reusable workflows must
|
|
92
|
+
use the exact workflow repository/SHA pair to authorize local actions. A default
|
|
93
|
+
reusable-workflow checkout delegates the caller manifest just like an explicit
|
|
94
|
+
caller repository/SHA binding. This default applies only when the repository is
|
|
95
|
+
omitted or exactly `${{ github.repository }}`; a literal workflow-repository
|
|
96
|
+
checkout without a ref does not identify the caller snapshot. Mutable `${{ github.ref }}` bindings delegate
|
|
97
|
+
on every event; only the event SHA establishes the inspected snapshot. PR-head
|
|
98
|
+
SHA/ref expressions and their fallbacks are delegated: they cannot establish
|
|
99
|
+
local-action provenance or validate the inspected source's manifest. Local
|
|
100
|
+
actions require current-source bindings. Literal refs, foreign repositories and
|
|
101
|
+
unpaired `${{ job.workflow_sha }}` remain rejected.
|
|
76
102
|
For snapshot-bound sources, the guard maps the selector to its tracked source
|
|
77
103
|
file. Literal commit SHAs,
|
|
78
104
|
branches, tags, unpaired snapshot contexts, foreign repositories, and traversal
|
|
@@ -92,6 +118,15 @@ part of major 26 fail.
|
|
|
92
118
|
Release and publish workflows use exact patch version-file selectors for
|
|
93
119
|
reproducible builds; this repository pins `.node-version` to `26.10.0`.
|
|
94
120
|
The series policy accepts that patch without weakening release validation.
|
|
121
|
+
Runtime images may retain a full SHA256 digest alongside an exact stable patch
|
|
122
|
+
tag: Node must be inside its policy series and match tracked root `.node-version`
|
|
123
|
+
when present; Python must be a patch in its policy series; Bun must equal its
|
|
124
|
+
policy version. Supported image variants remain allowed.
|
|
125
|
+
Digest validation is declaration-only: the guard enforces the exact policy tag
|
|
126
|
+
and a full SHA256 digest, but does not verify that the digest belongs to the tag.
|
|
127
|
+
Dependabot refreshes digests per repository; a shared tag-to-digest map would
|
|
128
|
+
require a tooling release for every base-image digest bump across repositories,
|
|
129
|
+
which costs more than it buys.
|
|
95
130
|
GitHub JavaScript action host runtimes (`runs.using`) are platform-managed
|
|
96
131
|
and do not select the project toolchain Node version.
|
|
97
132
|
|
|
@@ -119,6 +154,44 @@ Missing packages or jobs, private packages, absent setup-node selectors and
|
|
|
119
154
|
floor mismatches fail configuration validation. `optOuts` is optional when
|
|
120
155
|
only `engineFloors` is declared.
|
|
121
156
|
|
|
157
|
+
A runtime image or Bun source selected by an expression can have a scoped,
|
|
158
|
+
reviewed `dynamicSelectors` declaration instead of a whole-rule opt-out:
|
|
159
|
+
|
|
160
|
+
```json
|
|
161
|
+
{
|
|
162
|
+
"dynamicSelectors": [
|
|
163
|
+
{
|
|
164
|
+
"path": ".github/workflows/example.yml",
|
|
165
|
+
"at": "jobs.example.services.database",
|
|
166
|
+
"kind": "image",
|
|
167
|
+
"reason": "The scoped image producer validates the selected image."
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
"path": ".github/workflows/example.yml",
|
|
171
|
+
"at": "jobs.example.steps.setup",
|
|
172
|
+
"kind": "bun-source",
|
|
173
|
+
"reason": "The manifest producer selects the owned source snapshot."
|
|
174
|
+
}
|
|
175
|
+
]
|
|
176
|
+
}
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
`at` identifies a job container (`jobs.<job>.container`), job service
|
|
180
|
+
(`jobs.<job>.services.<service>`), Compose image (`services.<service>.image`),
|
|
181
|
+
or setup step ID (`jobs.<job>.steps.<id>`; `runs.steps.<id>` in a composite
|
|
182
|
+
action). If a step has no ID, replace `at` with a positive `line` number
|
|
183
|
+
pointing at its version-file selector. Images without an ID locator (including
|
|
184
|
+
unresolved Dockerfile `FROM` arguments) can also use a line number. Prefer IDs so unrelated edits do not
|
|
185
|
+
move the declaration. Each declaration requires an exact tracked path, one
|
|
186
|
+
locator, a known kind and a nonempty reason. It must match exactly one unresolved
|
|
187
|
+
selector; missing, static or ambiguous locations fail configuration validation.
|
|
188
|
+
An image declaration applies only to an expression, never a literal runtime pin.
|
|
189
|
+
A Bun declaration acknowledges an unresolved manifest expression or same-source
|
|
190
|
+
dynamic checkout ambiguity; it does not verify the selected version. Foreign or
|
|
191
|
+
literal-ref checkouts, incorrect action pins and conditional/error-tolerant
|
|
192
|
+
checkouts still fail. Local-action provenance is independent of these declarations.
|
|
193
|
+
Review the producer named in the reason whenever the selector changes.
|
|
194
|
+
|
|
122
195
|
Run the installed checker from the repository root in CI:
|
|
123
196
|
|
|
124
197
|
```sh
|
|
@@ -198,10 +271,11 @@ Add an explicit declaration to tracked root `stll-toolchain.json`:
|
|
|
198
271
|
}
|
|
199
272
|
```
|
|
200
273
|
|
|
201
|
-
Services are optional
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
274
|
+
Services are optional: omit `services` or use `[]` for runtimes and dependencies
|
|
275
|
+
only. No `cloud` declaration means no cloud setup script. `envFile` is required
|
|
276
|
+
with services and rejected without services; runtime-only scripts emit no
|
|
277
|
+
environment file code. With services, `envFile` must be a canonical
|
|
278
|
+
repository-relative path; its existing parent must be safe at runtime. Track an exact stable Node patch in root
|
|
205
279
|
`.node-version` within the shared Node series. Generate and commit the script:
|
|
206
280
|
|
|
207
281
|
```sh
|