@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 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`. This applies in either cone
68
- mode and to delegated sources. Dynamic, empty, glob, negation, or unsupported
69
- sparse configurations fail; a cone-mode input alone is insufficient. Directory
70
- entries cannot substitute for the selected file.
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. Literal refs and unpaired `${{ github.sha }}` /
75
- `${{ job.workflow_sha }}` remain rejected.
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 within the declared list: use `[]` for runtimes and
202
- dependencies only. No `cloud` declaration means no cloud setup script.
203
- `envFile` must be a canonical repository-relative path; its existing parent
204
- must be safe at runtime. Track an exact stable Node patch in root
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