chore: modernize stack - #5

Merged
vmaerten merged 26 commits into
mainfrom
modernize-stack
Apr 19, 2026
Merged

chore: modernize stack#5
vmaerten merged 26 commits into
mainfrom
modernize-stack

Conversation

@vmaerten

@vmaertenvmaerten commented Feb 8, 2026

Copy link
Copy Markdown
Member

Summary

  • Replace ESLint with oxlint for faster linting
  • Replace Jest with Vitest for testing
  • Upgrade @actions/core to v2
  • Add npm caching (cache: "npm") to all CI workflows
  • Use npm ci instead of npm install in CI and Taskfile
  • Remove tsconfig.eslint.json and ESLint-specific config files
  • Add .licensed.yml reviewed entries for packages detected as "other"
  • Ignore npmjs.com URLs in markdown link checks
  • Simplify npx calls in workflows (remove --package/--call patterns)

@vmaerten
vmaerten marked this pull request as ready for review April 18, 2026 16:59
- Replace npm with pnpm
- Replace Jest with Vitest
- Replace ESLint with Oxlint
- Update all GitHub Actions workflows to use pnpm
- Update Taskfile.yml for new tools
- Add retry mechanism for flaky network tests
- Update all dependencies to latest versions
nock 14.x has different network interception behavior that causes
downloads to abort even with enableNetConnect(). Tests now pass
in ~2s instead of timing out.
Also switch license cache from npm to pnpm source.
The pnpm source for the licensed tool doesn't work properly
(doesn't detect licenses, wrong file paths). Reverting to npm
which works correctly with the license cache.
Changes:
- Remove packageManager field from package.json
- Replace pnpm with npm in Taskfile.yml
- Remove pnpm/action-setup from all workflows
- Regenerate license cache with npm source
Eliminates the Node 24 DEP0169 deprecation warning emitted at runtime by
`typed-rest-client` (which still relies on `url.parse()` in its latest 2.3.0
release). `@actions/http-client` uses the WHATWG `new URL()` API and exposes
an equivalent `HttpClient.getJson()` with the same `allowRetries` /
`maxRetries` options, so retry behavior is preserved.
- @actions/core 2.0.1 -> 2.0.3
- @types/node 25.0.3 -> 25.6.0
- oxlint 1.36.0 -> 1.60.0
- prettier 3.7.4 -> 3.8.3
- semver 7.7.3 -> 7.7.4
- vitest 4.0.16 -> 4.1.4
nock kept at 13.x (see 400d08f).
Bumps (nock kept at 13.x, see 400d08f):
- @actions/core 2 -> 3
- @actions/http-client 2 -> 4
- @actions/io 2 -> 3
- @actions/tool-cache 2 -> 4
- typescript 5 -> 6
- markdownlint-cli 0.47 -> 0.48
All @actions/* v3+/v4+ are ESM only, so the project follows suit:
- package.json: `"type": "module"`
- tsconfig.json: module/moduleResolution NodeNext, target es2022
- sources migrated from `import foo = require(...)` to `import * as foo`
- `__dirname` replaced by `import.meta.dirname` in tests
- ncc auto-detects ESM and produces an ESM bundle
(`dist/index.js` drops from ~2.1MB to ~1.1MB thanks to tree-shaking)
The action surface is unchanged: inputs/outputs are identical and the
runner still executes `node dist/index.js`. Only internal format changes.
ESM-idiomatic style: `import { join } from "node:path"` instead of
`import * as path from "path"`. Applies to node builtins (with the `node:`
prefix) and to `@actions/*`, `semver`, `nock`.
Two local vars in `getFileName` were renamed (`platform`/`arch` → `taskPlatform`/`taskArch`)
to avoid shadowing the new named imports.
No behavior change. Tests still 4/4 PASS, bundle unchanged in size.
- Reformat workflow YAML and src/installer.ts with prettier 3.8.3
(new formatting rules from the version bump).
- Skip package-lock.json in codespell config to silence false positives
on package names like `devlop` that collide with dictionary entries.
- Refresh .licenses/npm cache to reflect the dependency tree after the
ESM migration and majors bump. Obsolete transitive license files
(typed-rest-client, tunnel sub-tree, qs/side-channel-*, etc.) removed;
new cache produced by licensed 5.x in CI (artifact from run 24605756090).
Pre-existing `npm:validate` failure left as-is (same failure on main:
schemastore `nodemon.json` $ref unresolved, out of scope).
Replaces check-action-metadata, check-license, check-markdown, check-npm,
check-npm-dependencies, check-prettier-formatting, check-tsconfig,
check-typescript, spell-check, test-typescript, and test-integration with
a single workflow running the same jobs in parallel.
Simplifications:
- One unified trigger (push, pull_request, weekly cron) instead of
per-workflow path filters. For a project this size, always running the
full suite is simpler than maintaining 11 distinct path lists.
- Dropped the `run-determination` gate specific to the arduino release
branches convention — not relevant to this fork.
- Single check suite shown per PR/commit instead of 11.
sync-labels-npm.yml left untouched (different trigger, independent).
Aligns with the rest of the oxc-based tooling (oxlint).
- Replace `prettier` with `oxfmt` in devDependencies.
- Taskfile: `general:format-prettier` -> `general:format`, now runs `npx oxfmt --write .`.
- CI: `check-prettier` job -> `check-format` using `oxfmt --check .`
directly (no more git-diff trick, oxfmt exits non-zero on drift).
- `.prettierignore` kept under that name (oxfmt reads it by default as the
default ignore file).
- src/installer.ts reformatted by oxfmt (wider default print-width than
prettier, collapses multi-line imports and function signatures that fit).
- package.json re-ordered: oxfmt sorts the keyword list alphabetically and
places top-level keys in a different order than prettier did.
oxfmt is still 0.x so the defaults may shift before 1.0 — if that becomes
disruptive we can pin an exact version and add an `.oxfmtrc.json` to freeze
the style.
Tradeoff: oxfmt only formats JS/TS/JSON (no YAML/Markdown). The workflow
YAML files and CHANGELOG.md will remain as prettier left them until someone
edits them by hand; no CI enforcement on those file types anymore.
The schemastore `package.json` schema references `nodemon.json` via `$ref`
for the `scripts` property. Without that referenced schema passed via `-r`
to ajv-cli, validation fails with:
error: can't resolve reference https://json.schemastore.org/nodemon.json
from id https://json.schemastore.org/package.json#
This has been failing on main since a schemastore refresh. Fix by downloading
the nodemon schema alongside the other 10 and passing it as a reference.
Validation now succeeds with `package.json valid`.
Taskfile.dev migrated away from the docsify hash-routed URLs (`/#/...`)
to plain paths. The old URLs hang with Status 0 in markdown-link-check,
breaking CI.
/#/ -> /
/#/installation -> /installation/
The next release of this action will be v2 (Node 24 breaking change
already documented in CHANGELOG). Update self-referential uses in CI
and README examples accordingly.
CONTRIBUTING.md release workflow left as-is — its v1/v2 example now
matches the current upgrade in progress.
…trix
- actions/checkout@v5 -> @v6 (ci.yml + sync-labels-npm.yml).
- Remove Task 2.x (2.8.1) from integration tests. Task 2.x is years old,
has no macOS arm64 build (requiring an exclude rule), and its archive
layout differed from 3.x which made the extraction path fragile.
- Replace with Task 3.50.0 (latest). Task dropped the "Task version: "
prefix and h1 hash from `--version` output at some point, so the
expected string is just the bare version number.
Every push to a branch with an open PR triggered two CI runs: one from
the `push` event and one from the `pull_request` event. Restrict `push`
to the main branch so PR branches only trigger a single run via
`pull_request`, while merges to main still get validated.
Trade-off: PRs from forks won't be CI'd automatically — they'll need a
manual re-push or the maintainer to push the branch into the main repo.
For this project's contribution pattern that's acceptable; avoids double
runs on every internal push.
@vmaerten
vmaerten merged commit 035a5f1 into mainApr 19, 2026
31 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@vmaerten
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

chore: modernize stack - #5

Merged
vmaerten merged 26 commits into
mainfrom
modernize-stack
Apr 19, 2026
Merged

chore: modernize stack#5
vmaerten merged 26 commits into
mainfrom
modernize-stack

Conversation

@vmaerten

@vmaertenvmaerten commented Feb 8, 2026

Copy link
Copy Markdown
Member

Summary

  • Replace ESLint with oxlint for faster linting
  • Replace Jest with Vitest for testing
  • Upgrade @actions/core to v2
  • Add npm caching (cache: "npm") to all CI workflows
  • Use npm ci instead of npm install in CI and Taskfile
  • Remove tsconfig.eslint.json and ESLint-specific config files
  • Add .licensed.yml reviewed entries for packages detected as "other"
  • Ignore npmjs.com URLs in markdown link checks
  • Simplify npx calls in workflows (remove --package/--call patterns)

@vmaerten
vmaerten marked this pull request as ready for review April 18, 2026 16:59
- Replace npm with pnpm
- Replace Jest with Vitest
- Replace ESLint with Oxlint
- Update all GitHub Actions workflows to use pnpm
- Update Taskfile.yml for new tools
- Add retry mechanism for flaky network tests
- Update all dependencies to latest versions
nock 14.x has different network interception behavior that causes
downloads to abort even with enableNetConnect(). Tests now pass
in ~2s instead of timing out.
Also switch license cache from npm to pnpm source.
The pnpm source for the licensed tool doesn't work properly
(doesn't detect licenses, wrong file paths). Reverting to npm
which works correctly with the license cache.
Changes:
- Remove packageManager field from package.json
- Replace pnpm with npm in Taskfile.yml
- Remove pnpm/action-setup from all workflows
- Regenerate license cache with npm source
Eliminates the Node 24 DEP0169 deprecation warning emitted at runtime by
`typed-rest-client` (which still relies on `url.parse()` in its latest 2.3.0
release). `@actions/http-client` uses the WHATWG `new URL()` API and exposes
an equivalent `HttpClient.getJson()` with the same `allowRetries` /
`maxRetries` options, so retry behavior is preserved.
- @actions/core 2.0.1 -> 2.0.3
- @types/node 25.0.3 -> 25.6.0
- oxlint 1.36.0 -> 1.60.0
- prettier 3.7.4 -> 3.8.3
- semver 7.7.3 -> 7.7.4
- vitest 4.0.16 -> 4.1.4
nock kept at 13.x (see 400d08f).
Bumps (nock kept at 13.x, see 400d08f):
- @actions/core 2 -> 3
- @actions/http-client 2 -> 4
- @actions/io 2 -> 3
- @actions/tool-cache 2 -> 4
- typescript 5 -> 6
- markdownlint-cli 0.47 -> 0.48
All @actions/* v3+/v4+ are ESM only, so the project follows suit:
- package.json: `"type": "module"`
- tsconfig.json: module/moduleResolution NodeNext, target es2022
- sources migrated from `import foo = require(...)` to `import * as foo`
- `__dirname` replaced by `import.meta.dirname` in tests
- ncc auto-detects ESM and produces an ESM bundle
(`dist/index.js` drops from ~2.1MB to ~1.1MB thanks to tree-shaking)
The action surface is unchanged: inputs/outputs are identical and the
runner still executes `node dist/index.js`. Only internal format changes.
ESM-idiomatic style: `import { join } from "node:path"` instead of
`import * as path from "path"`. Applies to node builtins (with the `node:`
prefix) and to `@actions/*`, `semver`, `nock`.
Two local vars in `getFileName` were renamed (`platform`/`arch` → `taskPlatform`/`taskArch`)
to avoid shadowing the new named imports.
No behavior change. Tests still 4/4 PASS, bundle unchanged in size.
- Reformat workflow YAML and src/installer.ts with prettier 3.8.3
(new formatting rules from the version bump).
- Skip package-lock.json in codespell config to silence false positives
on package names like `devlop` that collide with dictionary entries.
- Refresh .licenses/npm cache to reflect the dependency tree after the
ESM migration and majors bump. Obsolete transitive license files
(typed-rest-client, tunnel sub-tree, qs/side-channel-*, etc.) removed;
new cache produced by licensed 5.x in CI (artifact from run 24605756090).
Pre-existing `npm:validate` failure left as-is (same failure on main:
schemastore `nodemon.json` $ref unresolved, out of scope).
Replaces check-action-metadata, check-license, check-markdown, check-npm,
check-npm-dependencies, check-prettier-formatting, check-tsconfig,
check-typescript, spell-check, test-typescript, and test-integration with
a single workflow running the same jobs in parallel.
Simplifications:
- One unified trigger (push, pull_request, weekly cron) instead of
per-workflow path filters. For a project this size, always running the
full suite is simpler than maintaining 11 distinct path lists.
- Dropped the `run-determination` gate specific to the arduino release
branches convention — not relevant to this fork.
- Single check suite shown per PR/commit instead of 11.
sync-labels-npm.yml left untouched (different trigger, independent).
Aligns with the rest of the oxc-based tooling (oxlint).
- Replace `prettier` with `oxfmt` in devDependencies.
- Taskfile: `general:format-prettier` -> `general:format`, now runs `npx oxfmt --write .`.
- CI: `check-prettier` job -> `check-format` using `oxfmt --check .`
directly (no more git-diff trick, oxfmt exits non-zero on drift).
- `.prettierignore` kept under that name (oxfmt reads it by default as the
default ignore file).
- src/installer.ts reformatted by oxfmt (wider default print-width than
prettier, collapses multi-line imports and function signatures that fit).
- package.json re-ordered: oxfmt sorts the keyword list alphabetically and
places top-level keys in a different order than prettier did.
oxfmt is still 0.x so the defaults may shift before 1.0 — if that becomes
disruptive we can pin an exact version and add an `.oxfmtrc.json` to freeze
the style.
Tradeoff: oxfmt only formats JS/TS/JSON (no YAML/Markdown). The workflow
YAML files and CHANGELOG.md will remain as prettier left them until someone
edits them by hand; no CI enforcement on those file types anymore.
The schemastore `package.json` schema references `nodemon.json` via `$ref`
for the `scripts` property. Without that referenced schema passed via `-r`
to ajv-cli, validation fails with:
error: can't resolve reference https://json.schemastore.org/nodemon.json
from id https://json.schemastore.org/package.json#
This has been failing on main since a schemastore refresh. Fix by downloading
the nodemon schema alongside the other 10 and passing it as a reference.
Validation now succeeds with `package.json valid`.
Taskfile.dev migrated away from the docsify hash-routed URLs (`/#/...`)
to plain paths. The old URLs hang with Status 0 in markdown-link-check,
breaking CI.
/#/ -> /
/#/installation -> /installation/
The next release of this action will be v2 (Node 24 breaking change
already documented in CHANGELOG). Update self-referential uses in CI
and README examples accordingly.
CONTRIBUTING.md release workflow left as-is — its v1/v2 example now
matches the current upgrade in progress.
…trix
- actions/checkout@v5 -> @v6 (ci.yml + sync-labels-npm.yml).
- Remove Task 2.x (2.8.1) from integration tests. Task 2.x is years old,
has no macOS arm64 build (requiring an exclude rule), and its archive
layout differed from 3.x which made the extraction path fragile.
- Replace with Task 3.50.0 (latest). Task dropped the "Task version: "
prefix and h1 hash from `--version` output at some point, so the
expected string is just the bare version number.
Every push to a branch with an open PR triggered two CI runs: one from
the `push` event and one from the `pull_request` event. Restrict `push`
to the main branch so PR branches only trigger a single run via
`pull_request`, while merges to main still get validated.
Trade-off: PRs from forks won't be CI'd automatically — they'll need a
manual re-push or the maintainer to push the branch into the main repo.
For this project's contribution pattern that's acceptable; avoids double
runs on every internal push.
@vmaerten
vmaerten merged commit 035a5f1 into mainApr 19, 2026
31 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@vmaerten
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

chore: modernize stack - #5

Merged
vmaerten merged 26 commits into
mainfrom
modernize-stack
Apr 19, 2026
Merged

chore: modernize stack#5
vmaerten merged 26 commits into
mainfrom
modernize-stack

Conversation

@vmaerten

@vmaertenvmaerten commented Feb 8, 2026

Copy link
Copy Markdown
Member

Summary

  • Replace ESLint with oxlint for faster linting
  • Replace Jest with Vitest for testing
  • Upgrade @actions/core to v2
  • Add npm caching (cache: "npm") to all CI workflows
  • Use npm ci instead of npm install in CI and Taskfile
  • Remove tsconfig.eslint.json and ESLint-specific config files
  • Add .licensed.yml reviewed entries for packages detected as "other"
  • Ignore npmjs.com URLs in markdown link checks
  • Simplify npx calls in workflows (remove --package/--call patterns)

@vmaerten
vmaerten marked this pull request as ready for review April 18, 2026 16:59
- Replace npm with pnpm
- Replace Jest with Vitest
- Replace ESLint with Oxlint
- Update all GitHub Actions workflows to use pnpm
- Update Taskfile.yml for new tools
- Add retry mechanism for flaky network tests
- Update all dependencies to latest versions
nock 14.x has different network interception behavior that causes
downloads to abort even with enableNetConnect(). Tests now pass
in ~2s instead of timing out.
Also switch license cache from npm to pnpm source.
The pnpm source for the licensed tool doesn't work properly
(doesn't detect licenses, wrong file paths). Reverting to npm
which works correctly with the license cache.
Changes:
- Remove packageManager field from package.json
- Replace pnpm with npm in Taskfile.yml
- Remove pnpm/action-setup from all workflows
- Regenerate license cache with npm source
Eliminates the Node 24 DEP0169 deprecation warning emitted at runtime by
`typed-rest-client` (which still relies on `url.parse()` in its latest 2.3.0
release). `@actions/http-client` uses the WHATWG `new URL()` API and exposes
an equivalent `HttpClient.getJson()` with the same `allowRetries` /
`maxRetries` options, so retry behavior is preserved.
- @actions/core 2.0.1 -> 2.0.3
- @types/node 25.0.3 -> 25.6.0
- oxlint 1.36.0 -> 1.60.0
- prettier 3.7.4 -> 3.8.3
- semver 7.7.3 -> 7.7.4
- vitest 4.0.16 -> 4.1.4
nock kept at 13.x (see 400d08f).
Bumps (nock kept at 13.x, see 400d08f):
- @actions/core 2 -> 3
- @actions/http-client 2 -> 4
- @actions/io 2 -> 3
- @actions/tool-cache 2 -> 4
- typescript 5 -> 6
- markdownlint-cli 0.47 -> 0.48
All @actions/* v3+/v4+ are ESM only, so the project follows suit:
- package.json: `"type": "module"`
- tsconfig.json: module/moduleResolution NodeNext, target es2022
- sources migrated from `import foo = require(...)` to `import * as foo`
- `__dirname` replaced by `import.meta.dirname` in tests
- ncc auto-detects ESM and produces an ESM bundle
(`dist/index.js` drops from ~2.1MB to ~1.1MB thanks to tree-shaking)
The action surface is unchanged: inputs/outputs are identical and the
runner still executes `node dist/index.js`. Only internal format changes.
ESM-idiomatic style: `import { join } from "node:path"` instead of
`import * as path from "path"`. Applies to node builtins (with the `node:`
prefix) and to `@actions/*`, `semver`, `nock`.
Two local vars in `getFileName` were renamed (`platform`/`arch` → `taskPlatform`/`taskArch`)
to avoid shadowing the new named imports.
No behavior change. Tests still 4/4 PASS, bundle unchanged in size.
- Reformat workflow YAML and src/installer.ts with prettier 3.8.3
(new formatting rules from the version bump).
- Skip package-lock.json in codespell config to silence false positives
on package names like `devlop` that collide with dictionary entries.
- Refresh .licenses/npm cache to reflect the dependency tree after the
ESM migration and majors bump. Obsolete transitive license files
(typed-rest-client, tunnel sub-tree, qs/side-channel-*, etc.) removed;
new cache produced by licensed 5.x in CI (artifact from run 24605756090).
Pre-existing `npm:validate` failure left as-is (same failure on main:
schemastore `nodemon.json` $ref unresolved, out of scope).
Replaces check-action-metadata, check-license, check-markdown, check-npm,
check-npm-dependencies, check-prettier-formatting, check-tsconfig,
check-typescript, spell-check, test-typescript, and test-integration with
a single workflow running the same jobs in parallel.
Simplifications:
- One unified trigger (push, pull_request, weekly cron) instead of
per-workflow path filters. For a project this size, always running the
full suite is simpler than maintaining 11 distinct path lists.
- Dropped the `run-determination` gate specific to the arduino release
branches convention — not relevant to this fork.
- Single check suite shown per PR/commit instead of 11.
sync-labels-npm.yml left untouched (different trigger, independent).
Aligns with the rest of the oxc-based tooling (oxlint).
- Replace `prettier` with `oxfmt` in devDependencies.
- Taskfile: `general:format-prettier` -> `general:format`, now runs `npx oxfmt --write .`.
- CI: `check-prettier` job -> `check-format` using `oxfmt --check .`
directly (no more git-diff trick, oxfmt exits non-zero on drift).
- `.prettierignore` kept under that name (oxfmt reads it by default as the
default ignore file).
- src/installer.ts reformatted by oxfmt (wider default print-width than
prettier, collapses multi-line imports and function signatures that fit).
- package.json re-ordered: oxfmt sorts the keyword list alphabetically and
places top-level keys in a different order than prettier did.
oxfmt is still 0.x so the defaults may shift before 1.0 — if that becomes
disruptive we can pin an exact version and add an `.oxfmtrc.json` to freeze
the style.
Tradeoff: oxfmt only formats JS/TS/JSON (no YAML/Markdown). The workflow
YAML files and CHANGELOG.md will remain as prettier left them until someone
edits them by hand; no CI enforcement on those file types anymore.
The schemastore `package.json` schema references `nodemon.json` via `$ref`
for the `scripts` property. Without that referenced schema passed via `-r`
to ajv-cli, validation fails with:
error: can't resolve reference https://json.schemastore.org/nodemon.json
from id https://json.schemastore.org/package.json#
This has been failing on main since a schemastore refresh. Fix by downloading
the nodemon schema alongside the other 10 and passing it as a reference.
Validation now succeeds with `package.json valid`.
Taskfile.dev migrated away from the docsify hash-routed URLs (`/#/...`)
to plain paths. The old URLs hang with Status 0 in markdown-link-check,
breaking CI.
/#/ -> /
/#/installation -> /installation/
The next release of this action will be v2 (Node 24 breaking change
already documented in CHANGELOG). Update self-referential uses in CI
and README examples accordingly.
CONTRIBUTING.md release workflow left as-is — its v1/v2 example now
matches the current upgrade in progress.
…trix
- actions/checkout@v5 -> @v6 (ci.yml + sync-labels-npm.yml).
- Remove Task 2.x (2.8.1) from integration tests. Task 2.x is years old,
has no macOS arm64 build (requiring an exclude rule), and its archive
layout differed from 3.x which made the extraction path fragile.
- Replace with Task 3.50.0 (latest). Task dropped the "Task version: "
prefix and h1 hash from `--version` output at some point, so the
expected string is just the bare version number.
Every push to a branch with an open PR triggered two CI runs: one from
the `push` event and one from the `pull_request` event. Restrict `push`
to the main branch so PR branches only trigger a single run via
`pull_request`, while merges to main still get validated.
Trade-off: PRs from forks won't be CI'd automatically — they'll need a
manual re-push or the maintainer to push the branch into the main repo.
For this project's contribution pattern that's acceptable; avoids double
runs on every internal push.
@vmaerten
vmaerten merged commit 035a5f1 into mainApr 19, 2026
31 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@vmaerten
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

chore: modernize stack - #5

Merged
vmaerten merged 26 commits into
mainfrom
modernize-stack
Apr 19, 2026
Merged

chore: modernize stack#5
vmaerten merged 26 commits into
mainfrom
modernize-stack

Conversation

@vmaerten

@vmaertenvmaerten commented Feb 8, 2026

Copy link
Copy Markdown
Member

Summary

  • Replace ESLint with oxlint for faster linting
  • Replace Jest with Vitest for testing
  • Upgrade @actions/core to v2
  • Add npm caching (cache: "npm") to all CI workflows
  • Use npm ci instead of npm install in CI and Taskfile
  • Remove tsconfig.eslint.json and ESLint-specific config files
  • Add .licensed.yml reviewed entries for packages detected as "other"
  • Ignore npmjs.com URLs in markdown link checks
  • Simplify npx calls in workflows (remove --package/--call patterns)

@vmaerten
vmaerten marked this pull request as ready for review April 18, 2026 16:59
- Replace npm with pnpm
- Replace Jest with Vitest
- Replace ESLint with Oxlint
- Update all GitHub Actions workflows to use pnpm
- Update Taskfile.yml for new tools
- Add retry mechanism for flaky network tests
- Update all dependencies to latest versions
nock 14.x has different network interception behavior that causes
downloads to abort even with enableNetConnect(). Tests now pass
in ~2s instead of timing out.
Also switch license cache from npm to pnpm source.
The pnpm source for the licensed tool doesn't work properly
(doesn't detect licenses, wrong file paths). Reverting to npm
which works correctly with the license cache.
Changes:
- Remove packageManager field from package.json
- Replace pnpm with npm in Taskfile.yml
- Remove pnpm/action-setup from all workflows
- Regenerate license cache with npm source
Eliminates the Node 24 DEP0169 deprecation warning emitted at runtime by
`typed-rest-client` (which still relies on `url.parse()` in its latest 2.3.0
release). `@actions/http-client` uses the WHATWG `new URL()` API and exposes
an equivalent `HttpClient.getJson()` with the same `allowRetries` /
`maxRetries` options, so retry behavior is preserved.
- @actions/core 2.0.1 -> 2.0.3
- @types/node 25.0.3 -> 25.6.0
- oxlint 1.36.0 -> 1.60.0
- prettier 3.7.4 -> 3.8.3
- semver 7.7.3 -> 7.7.4
- vitest 4.0.16 -> 4.1.4
nock kept at 13.x (see 400d08f).
Bumps (nock kept at 13.x, see 400d08f):
- @actions/core 2 -> 3
- @actions/http-client 2 -> 4
- @actions/io 2 -> 3
- @actions/tool-cache 2 -> 4
- typescript 5 -> 6
- markdownlint-cli 0.47 -> 0.48
All @actions/* v3+/v4+ are ESM only, so the project follows suit:
- package.json: `"type": "module"`
- tsconfig.json: module/moduleResolution NodeNext, target es2022
- sources migrated from `import foo = require(...)` to `import * as foo`
- `__dirname` replaced by `import.meta.dirname` in tests
- ncc auto-detects ESM and produces an ESM bundle
(`dist/index.js` drops from ~2.1MB to ~1.1MB thanks to tree-shaking)
The action surface is unchanged: inputs/outputs are identical and the
runner still executes `node dist/index.js`. Only internal format changes.
ESM-idiomatic style: `import { join } from "node:path"` instead of
`import * as path from "path"`. Applies to node builtins (with the `node:`
prefix) and to `@actions/*`, `semver`, `nock`.
Two local vars in `getFileName` were renamed (`platform`/`arch` → `taskPlatform`/`taskArch`)
to avoid shadowing the new named imports.
No behavior change. Tests still 4/4 PASS, bundle unchanged in size.
- Reformat workflow YAML and src/installer.ts with prettier 3.8.3
(new formatting rules from the version bump).
- Skip package-lock.json in codespell config to silence false positives
on package names like `devlop` that collide with dictionary entries.
- Refresh .licenses/npm cache to reflect the dependency tree after the
ESM migration and majors bump. Obsolete transitive license files
(typed-rest-client, tunnel sub-tree, qs/side-channel-*, etc.) removed;
new cache produced by licensed 5.x in CI (artifact from run 24605756090).
Pre-existing `npm:validate` failure left as-is (same failure on main:
schemastore `nodemon.json` $ref unresolved, out of scope).
Replaces check-action-metadata, check-license, check-markdown, check-npm,
check-npm-dependencies, check-prettier-formatting, check-tsconfig,
check-typescript, spell-check, test-typescript, and test-integration with
a single workflow running the same jobs in parallel.
Simplifications:
- One unified trigger (push, pull_request, weekly cron) instead of
per-workflow path filters. For a project this size, always running the
full suite is simpler than maintaining 11 distinct path lists.
- Dropped the `run-determination` gate specific to the arduino release
branches convention — not relevant to this fork.
- Single check suite shown per PR/commit instead of 11.
sync-labels-npm.yml left untouched (different trigger, independent).
Aligns with the rest of the oxc-based tooling (oxlint).
- Replace `prettier` with `oxfmt` in devDependencies.
- Taskfile: `general:format-prettier` -> `general:format`, now runs `npx oxfmt --write .`.
- CI: `check-prettier` job -> `check-format` using `oxfmt --check .`
directly (no more git-diff trick, oxfmt exits non-zero on drift).
- `.prettierignore` kept under that name (oxfmt reads it by default as the
default ignore file).
- src/installer.ts reformatted by oxfmt (wider default print-width than
prettier, collapses multi-line imports and function signatures that fit).
- package.json re-ordered: oxfmt sorts the keyword list alphabetically and
places top-level keys in a different order than prettier did.
oxfmt is still 0.x so the defaults may shift before 1.0 — if that becomes
disruptive we can pin an exact version and add an `.oxfmtrc.json` to freeze
the style.
Tradeoff: oxfmt only formats JS/TS/JSON (no YAML/Markdown). The workflow
YAML files and CHANGELOG.md will remain as prettier left them until someone
edits them by hand; no CI enforcement on those file types anymore.
The schemastore `package.json` schema references `nodemon.json` via `$ref`
for the `scripts` property. Without that referenced schema passed via `-r`
to ajv-cli, validation fails with:
error: can't resolve reference https://json.schemastore.org/nodemon.json
from id https://json.schemastore.org/package.json#
This has been failing on main since a schemastore refresh. Fix by downloading
the nodemon schema alongside the other 10 and passing it as a reference.
Validation now succeeds with `package.json valid`.
Taskfile.dev migrated away from the docsify hash-routed URLs (`/#/...`)
to plain paths. The old URLs hang with Status 0 in markdown-link-check,
breaking CI.
/#/ -> /
/#/installation -> /installation/
The next release of this action will be v2 (Node 24 breaking change
already documented in CHANGELOG). Update self-referential uses in CI
and README examples accordingly.
CONTRIBUTING.md release workflow left as-is — its v1/v2 example now
matches the current upgrade in progress.
…trix
- actions/checkout@v5 -> @v6 (ci.yml + sync-labels-npm.yml).
- Remove Task 2.x (2.8.1) from integration tests. Task 2.x is years old,
has no macOS arm64 build (requiring an exclude rule), and its archive
layout differed from 3.x which made the extraction path fragile.
- Replace with Task 3.50.0 (latest). Task dropped the "Task version: "
prefix and h1 hash from `--version` output at some point, so the
expected string is just the bare version number.
Every push to a branch with an open PR triggered two CI runs: one from
the `push` event and one from the `pull_request` event. Restrict `push`
to the main branch so PR branches only trigger a single run via
`pull_request`, while merges to main still get validated.
Trade-off: PRs from forks won't be CI'd automatically — they'll need a
manual re-push or the maintainer to push the branch into the main repo.
For this project's contribution pattern that's acceptable; avoids double
runs on every internal push.
@vmaerten
vmaerten merged commit 035a5f1 into mainApr 19, 2026
31 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@vmaerten
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

chore: modernize stack - #5

Merged
vmaerten merged 26 commits into
mainfrom
modernize-stack
Apr 19, 2026
Merged

chore: modernize stack#5
vmaerten merged 26 commits into
mainfrom
modernize-stack

Conversation

@vmaerten

@vmaertenvmaerten commented Feb 8, 2026

Copy link
Copy Markdown
Member

Summary

  • Replace ESLint with oxlint for faster linting
  • Replace Jest with Vitest for testing
  • Upgrade @actions/core to v2
  • Add npm caching (cache: "npm") to all CI workflows
  • Use npm ci instead of npm install in CI and Taskfile
  • Remove tsconfig.eslint.json and ESLint-specific config files
  • Add .licensed.yml reviewed entries for packages detected as "other"
  • Ignore npmjs.com URLs in markdown link checks
  • Simplify npx calls in workflows (remove --package/--call patterns)

@vmaerten
vmaerten marked this pull request as ready for review April 18, 2026 16:59
- Replace npm with pnpm
- Replace Jest with Vitest
- Replace ESLint with Oxlint
- Update all GitHub Actions workflows to use pnpm
- Update Taskfile.yml for new tools
- Add retry mechanism for flaky network tests
- Update all dependencies to latest versions
nock 14.x has different network interception behavior that causes
downloads to abort even with enableNetConnect(). Tests now pass
in ~2s instead of timing out.
Also switch license cache from npm to pnpm source.
The pnpm source for the licensed tool doesn't work properly
(doesn't detect licenses, wrong file paths). Reverting to npm
which works correctly with the license cache.
Changes:
- Remove packageManager field from package.json
- Replace pnpm with npm in Taskfile.yml
- Remove pnpm/action-setup from all workflows
- Regenerate license cache with npm source
Eliminates the Node 24 DEP0169 deprecation warning emitted at runtime by
`typed-rest-client` (which still relies on `url.parse()` in its latest 2.3.0
release). `@actions/http-client` uses the WHATWG `new URL()` API and exposes
an equivalent `HttpClient.getJson()` with the same `allowRetries` /
`maxRetries` options, so retry behavior is preserved.
- @actions/core 2.0.1 -> 2.0.3
- @types/node 25.0.3 -> 25.6.0
- oxlint 1.36.0 -> 1.60.0
- prettier 3.7.4 -> 3.8.3
- semver 7.7.3 -> 7.7.4
- vitest 4.0.16 -> 4.1.4
nock kept at 13.x (see 400d08f).
Bumps (nock kept at 13.x, see 400d08f):
- @actions/core 2 -> 3
- @actions/http-client 2 -> 4
- @actions/io 2 -> 3
- @actions/tool-cache 2 -> 4
- typescript 5 -> 6
- markdownlint-cli 0.47 -> 0.48
All @actions/* v3+/v4+ are ESM only, so the project follows suit:
- package.json: `"type": "module"`
- tsconfig.json: module/moduleResolution NodeNext, target es2022
- sources migrated from `import foo = require(...)` to `import * as foo`
- `__dirname` replaced by `import.meta.dirname` in tests
- ncc auto-detects ESM and produces an ESM bundle
(`dist/index.js` drops from ~2.1MB to ~1.1MB thanks to tree-shaking)
The action surface is unchanged: inputs/outputs are identical and the
runner still executes `node dist/index.js`. Only internal format changes.
ESM-idiomatic style: `import { join } from "node:path"` instead of
`import * as path from "path"`. Applies to node builtins (with the `node:`
prefix) and to `@actions/*`, `semver`, `nock`.
Two local vars in `getFileName` were renamed (`platform`/`arch` → `taskPlatform`/`taskArch`)
to avoid shadowing the new named imports.
No behavior change. Tests still 4/4 PASS, bundle unchanged in size.
- Reformat workflow YAML and src/installer.ts with prettier 3.8.3
(new formatting rules from the version bump).
- Skip package-lock.json in codespell config to silence false positives
on package names like `devlop` that collide with dictionary entries.
- Refresh .licenses/npm cache to reflect the dependency tree after the
ESM migration and majors bump. Obsolete transitive license files
(typed-rest-client, tunnel sub-tree, qs/side-channel-*, etc.) removed;
new cache produced by licensed 5.x in CI (artifact from run 24605756090).
Pre-existing `npm:validate` failure left as-is (same failure on main:
schemastore `nodemon.json` $ref unresolved, out of scope).
Replaces check-action-metadata, check-license, check-markdown, check-npm,
check-npm-dependencies, check-prettier-formatting, check-tsconfig,
check-typescript, spell-check, test-typescript, and test-integration with
a single workflow running the same jobs in parallel.
Simplifications:
- One unified trigger (push, pull_request, weekly cron) instead of
per-workflow path filters. For a project this size, always running the
full suite is simpler than maintaining 11 distinct path lists.
- Dropped the `run-determination` gate specific to the arduino release
branches convention — not relevant to this fork.
- Single check suite shown per PR/commit instead of 11.
sync-labels-npm.yml left untouched (different trigger, independent).
Aligns with the rest of the oxc-based tooling (oxlint).
- Replace `prettier` with `oxfmt` in devDependencies.
- Taskfile: `general:format-prettier` -> `general:format`, now runs `npx oxfmt --write .`.
- CI: `check-prettier` job -> `check-format` using `oxfmt --check .`
directly (no more git-diff trick, oxfmt exits non-zero on drift).
- `.prettierignore` kept under that name (oxfmt reads it by default as the
default ignore file).
- src/installer.ts reformatted by oxfmt (wider default print-width than
prettier, collapses multi-line imports and function signatures that fit).
- package.json re-ordered: oxfmt sorts the keyword list alphabetically and
places top-level keys in a different order than prettier did.
oxfmt is still 0.x so the defaults may shift before 1.0 — if that becomes
disruptive we can pin an exact version and add an `.oxfmtrc.json` to freeze
the style.
Tradeoff: oxfmt only formats JS/TS/JSON (no YAML/Markdown). The workflow
YAML files and CHANGELOG.md will remain as prettier left them until someone
edits them by hand; no CI enforcement on those file types anymore.
The schemastore `package.json` schema references `nodemon.json` via `$ref`
for the `scripts` property. Without that referenced schema passed via `-r`
to ajv-cli, validation fails with:
error: can't resolve reference https://json.schemastore.org/nodemon.json
from id https://json.schemastore.org/package.json#
This has been failing on main since a schemastore refresh. Fix by downloading
the nodemon schema alongside the other 10 and passing it as a reference.
Validation now succeeds with `package.json valid`.
Taskfile.dev migrated away from the docsify hash-routed URLs (`/#/...`)
to plain paths. The old URLs hang with Status 0 in markdown-link-check,
breaking CI.
/#/ -> /
/#/installation -> /installation/
The next release of this action will be v2 (Node 24 breaking change
already documented in CHANGELOG). Update self-referential uses in CI
and README examples accordingly.
CONTRIBUTING.md release workflow left as-is — its v1/v2 example now
matches the current upgrade in progress.
…trix
- actions/checkout@v5 -> @v6 (ci.yml + sync-labels-npm.yml).
- Remove Task 2.x (2.8.1) from integration tests. Task 2.x is years old,
has no macOS arm64 build (requiring an exclude rule), and its archive
layout differed from 3.x which made the extraction path fragile.
- Replace with Task 3.50.0 (latest). Task dropped the "Task version: "
prefix and h1 hash from `--version` output at some point, so the
expected string is just the bare version number.
Every push to a branch with an open PR triggered two CI runs: one from
the `push` event and one from the `pull_request` event. Restrict `push`
to the main branch so PR branches only trigger a single run via
`pull_request`, while merges to main still get validated.
Trade-off: PRs from forks won't be CI'd automatically — they'll need a
manual re-push or the maintainer to push the branch into the main repo.
For this project's contribution pattern that's acceptable; avoids double
runs on every internal push.
@vmaerten
vmaerten merged commit 035a5f1 into mainApr 19, 2026
31 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@vmaerten
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

chore: modernize stack - #5

Merged
vmaerten merged 26 commits into
mainfrom
modernize-stack
Apr 19, 2026
Merged

chore: modernize stack#5
vmaerten merged 26 commits into
mainfrom
modernize-stack

Conversation

@vmaerten

@vmaertenvmaerten commented Feb 8, 2026

Copy link
Copy Markdown
Member

Summary

  • Replace ESLint with oxlint for faster linting
  • Replace Jest with Vitest for testing
  • Upgrade @actions/core to v2
  • Add npm caching (cache: "npm") to all CI workflows
  • Use npm ci instead of npm install in CI and Taskfile
  • Remove tsconfig.eslint.json and ESLint-specific config files
  • Add .licensed.yml reviewed entries for packages detected as "other"
  • Ignore npmjs.com URLs in markdown link checks
  • Simplify npx calls in workflows (remove --package/--call patterns)

@vmaerten
vmaerten marked this pull request as ready for review April 18, 2026 16:59
- Replace npm with pnpm
- Replace Jest with Vitest
- Replace ESLint with Oxlint
- Update all GitHub Actions workflows to use pnpm
- Update Taskfile.yml for new tools
- Add retry mechanism for flaky network tests
- Update all dependencies to latest versions
nock 14.x has different network interception behavior that causes
downloads to abort even with enableNetConnect(). Tests now pass
in ~2s instead of timing out.
Also switch license cache from npm to pnpm source.
The pnpm source for the licensed tool doesn't work properly
(doesn't detect licenses, wrong file paths). Reverting to npm
which works correctly with the license cache.
Changes:
- Remove packageManager field from package.json
- Replace pnpm with npm in Taskfile.yml
- Remove pnpm/action-setup from all workflows
- Regenerate license cache with npm source
Eliminates the Node 24 DEP0169 deprecation warning emitted at runtime by
`typed-rest-client` (which still relies on `url.parse()` in its latest 2.3.0
release). `@actions/http-client` uses the WHATWG `new URL()` API and exposes
an equivalent `HttpClient.getJson()` with the same `allowRetries` /
`maxRetries` options, so retry behavior is preserved.
- @actions/core 2.0.1 -> 2.0.3
- @types/node 25.0.3 -> 25.6.0
- oxlint 1.36.0 -> 1.60.0
- prettier 3.7.4 -> 3.8.3
- semver 7.7.3 -> 7.7.4
- vitest 4.0.16 -> 4.1.4
nock kept at 13.x (see 400d08f).
Bumps (nock kept at 13.x, see 400d08f):
- @actions/core 2 -> 3
- @actions/http-client 2 -> 4
- @actions/io 2 -> 3
- @actions/tool-cache 2 -> 4
- typescript 5 -> 6
- markdownlint-cli 0.47 -> 0.48
All @actions/* v3+/v4+ are ESM only, so the project follows suit:
- package.json: `"type": "module"`
- tsconfig.json: module/moduleResolution NodeNext, target es2022
- sources migrated from `import foo = require(...)` to `import * as foo`
- `__dirname` replaced by `import.meta.dirname` in tests
- ncc auto-detects ESM and produces an ESM bundle
(`dist/index.js` drops from ~2.1MB to ~1.1MB thanks to tree-shaking)
The action surface is unchanged: inputs/outputs are identical and the
runner still executes `node dist/index.js`. Only internal format changes.
ESM-idiomatic style: `import { join } from "node:path"` instead of
`import * as path from "path"`. Applies to node builtins (with the `node:`
prefix) and to `@actions/*`, `semver`, `nock`.
Two local vars in `getFileName` were renamed (`platform`/`arch` → `taskPlatform`/`taskArch`)
to avoid shadowing the new named imports.
No behavior change. Tests still 4/4 PASS, bundle unchanged in size.
- Reformat workflow YAML and src/installer.ts with prettier 3.8.3
(new formatting rules from the version bump).
- Skip package-lock.json in codespell config to silence false positives
on package names like `devlop` that collide with dictionary entries.
- Refresh .licenses/npm cache to reflect the dependency tree after the
ESM migration and majors bump. Obsolete transitive license files
(typed-rest-client, tunnel sub-tree, qs/side-channel-*, etc.) removed;
new cache produced by licensed 5.x in CI (artifact from run 24605756090).
Pre-existing `npm:validate` failure left as-is (same failure on main:
schemastore `nodemon.json` $ref unresolved, out of scope).
Replaces check-action-metadata, check-license, check-markdown, check-npm,
check-npm-dependencies, check-prettier-formatting, check-tsconfig,
check-typescript, spell-check, test-typescript, and test-integration with
a single workflow running the same jobs in parallel.
Simplifications:
- One unified trigger (push, pull_request, weekly cron) instead of
per-workflow path filters. For a project this size, always running the
full suite is simpler than maintaining 11 distinct path lists.
- Dropped the `run-determination` gate specific to the arduino release
branches convention — not relevant to this fork.
- Single check suite shown per PR/commit instead of 11.
sync-labels-npm.yml left untouched (different trigger, independent).
Aligns with the rest of the oxc-based tooling (oxlint).
- Replace `prettier` with `oxfmt` in devDependencies.
- Taskfile: `general:format-prettier` -> `general:format`, now runs `npx oxfmt --write .`.
- CI: `check-prettier` job -> `check-format` using `oxfmt --check .`
directly (no more git-diff trick, oxfmt exits non-zero on drift).
- `.prettierignore` kept under that name (oxfmt reads it by default as the
default ignore file).
- src/installer.ts reformatted by oxfmt (wider default print-width than
prettier, collapses multi-line imports and function signatures that fit).
- package.json re-ordered: oxfmt sorts the keyword list alphabetically and
places top-level keys in a different order than prettier did.
oxfmt is still 0.x so the defaults may shift before 1.0 — if that becomes
disruptive we can pin an exact version and add an `.oxfmtrc.json` to freeze
the style.
Tradeoff: oxfmt only formats JS/TS/JSON (no YAML/Markdown). The workflow
YAML files and CHANGELOG.md will remain as prettier left them until someone
edits them by hand; no CI enforcement on those file types anymore.
The schemastore `package.json` schema references `nodemon.json` via `$ref`
for the `scripts` property. Without that referenced schema passed via `-r`
to ajv-cli, validation fails with:
error: can't resolve reference https://json.schemastore.org/nodemon.json
from id https://json.schemastore.org/package.json#
This has been failing on main since a schemastore refresh. Fix by downloading
the nodemon schema alongside the other 10 and passing it as a reference.
Validation now succeeds with `package.json valid`.
Taskfile.dev migrated away from the docsify hash-routed URLs (`/#/...`)
to plain paths. The old URLs hang with Status 0 in markdown-link-check,
breaking CI.
/#/ -> /
/#/installation -> /installation/
The next release of this action will be v2 (Node 24 breaking change
already documented in CHANGELOG). Update self-referential uses in CI
and README examples accordingly.
CONTRIBUTING.md release workflow left as-is — its v1/v2 example now
matches the current upgrade in progress.
…trix
- actions/checkout@v5 -> @v6 (ci.yml + sync-labels-npm.yml).
- Remove Task 2.x (2.8.1) from integration tests. Task 2.x is years old,
has no macOS arm64 build (requiring an exclude rule), and its archive
layout differed from 3.x which made the extraction path fragile.
- Replace with Task 3.50.0 (latest). Task dropped the "Task version: "
prefix and h1 hash from `--version` output at some point, so the
expected string is just the bare version number.
Every push to a branch with an open PR triggered two CI runs: one from
the `push` event and one from the `pull_request` event. Restrict `push`
to the main branch so PR branches only trigger a single run via
`pull_request`, while merges to main still get validated.
Trade-off: PRs from forks won't be CI'd automatically — they'll need a
manual re-push or the maintainer to push the branch into the main repo.
For this project's contribution pattern that's acceptable; avoids double
runs on every internal push.
@vmaerten
vmaerten merged commit 035a5f1 into mainApr 19, 2026
31 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@vmaerten
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

chore: modernize stack - #5

Merged
vmaerten merged 26 commits into
mainfrom
modernize-stack
Apr 19, 2026
Merged

chore: modernize stack#5
vmaerten merged 26 commits into
mainfrom
modernize-stack

Conversation

@vmaerten

@vmaertenvmaerten commented Feb 8, 2026

Copy link
Copy Markdown
Member

Summary

  • Replace ESLint with oxlint for faster linting
  • Replace Jest with Vitest for testing
  • Upgrade @actions/core to v2
  • Add npm caching (cache: "npm") to all CI workflows
  • Use npm ci instead of npm install in CI and Taskfile
  • Remove tsconfig.eslint.json and ESLint-specific config files
  • Add .licensed.yml reviewed entries for packages detected as "other"
  • Ignore npmjs.com URLs in markdown link checks
  • Simplify npx calls in workflows (remove --package/--call patterns)

@vmaerten
vmaerten marked this pull request as ready for review April 18, 2026 16:59
- Replace npm with pnpm
- Replace Jest with Vitest
- Replace ESLint with Oxlint
- Update all GitHub Actions workflows to use pnpm
- Update Taskfile.yml for new tools
- Add retry mechanism for flaky network tests
- Update all dependencies to latest versions
nock 14.x has different network interception behavior that causes
downloads to abort even with enableNetConnect(). Tests now pass
in ~2s instead of timing out.
Also switch license cache from npm to pnpm source.
The pnpm source for the licensed tool doesn't work properly
(doesn't detect licenses, wrong file paths). Reverting to npm
which works correctly with the license cache.
Changes:
- Remove packageManager field from package.json
- Replace pnpm with npm in Taskfile.yml
- Remove pnpm/action-setup from all workflows
- Regenerate license cache with npm source
Eliminates the Node 24 DEP0169 deprecation warning emitted at runtime by
`typed-rest-client` (which still relies on `url.parse()` in its latest 2.3.0
release). `@actions/http-client` uses the WHATWG `new URL()` API and exposes
an equivalent `HttpClient.getJson()` with the same `allowRetries` /
`maxRetries` options, so retry behavior is preserved.
- @actions/core 2.0.1 -> 2.0.3
- @types/node 25.0.3 -> 25.6.0
- oxlint 1.36.0 -> 1.60.0
- prettier 3.7.4 -> 3.8.3
- semver 7.7.3 -> 7.7.4
- vitest 4.0.16 -> 4.1.4
nock kept at 13.x (see 400d08f).
Bumps (nock kept at 13.x, see 400d08f):
- @actions/core 2 -> 3
- @actions/http-client 2 -> 4
- @actions/io 2 -> 3
- @actions/tool-cache 2 -> 4
- typescript 5 -> 6
- markdownlint-cli 0.47 -> 0.48
All @actions/* v3+/v4+ are ESM only, so the project follows suit:
- package.json: `"type": "module"`
- tsconfig.json: module/moduleResolution NodeNext, target es2022
- sources migrated from `import foo = require(...)` to `import * as foo`
- `__dirname` replaced by `import.meta.dirname` in tests
- ncc auto-detects ESM and produces an ESM bundle
(`dist/index.js` drops from ~2.1MB to ~1.1MB thanks to tree-shaking)
The action surface is unchanged: inputs/outputs are identical and the
runner still executes `node dist/index.js`. Only internal format changes.
ESM-idiomatic style: `import { join } from "node:path"` instead of
`import * as path from "path"`. Applies to node builtins (with the `node:`
prefix) and to `@actions/*`, `semver`, `nock`.
Two local vars in `getFileName` were renamed (`platform`/`arch` → `taskPlatform`/`taskArch`)
to avoid shadowing the new named imports.
No behavior change. Tests still 4/4 PASS, bundle unchanged in size.
- Reformat workflow YAML and src/installer.ts with prettier 3.8.3
(new formatting rules from the version bump).
- Skip package-lock.json in codespell config to silence false positives
on package names like `devlop` that collide with dictionary entries.
- Refresh .licenses/npm cache to reflect the dependency tree after the
ESM migration and majors bump. Obsolete transitive license files
(typed-rest-client, tunnel sub-tree, qs/side-channel-*, etc.) removed;
new cache produced by licensed 5.x in CI (artifact from run 24605756090).
Pre-existing `npm:validate` failure left as-is (same failure on main:
schemastore `nodemon.json` $ref unresolved, out of scope).
Replaces check-action-metadata, check-license, check-markdown, check-npm,
check-npm-dependencies, check-prettier-formatting, check-tsconfig,
check-typescript, spell-check, test-typescript, and test-integration with
a single workflow running the same jobs in parallel.
Simplifications:
- One unified trigger (push, pull_request, weekly cron) instead of
per-workflow path filters. For a project this size, always running the
full suite is simpler than maintaining 11 distinct path lists.
- Dropped the `run-determination` gate specific to the arduino release
branches convention — not relevant to this fork.
- Single check suite shown per PR/commit instead of 11.
sync-labels-npm.yml left untouched (different trigger, independent).
Aligns with the rest of the oxc-based tooling (oxlint).
- Replace `prettier` with `oxfmt` in devDependencies.
- Taskfile: `general:format-prettier` -> `general:format`, now runs `npx oxfmt --write .`.
- CI: `check-prettier` job -> `check-format` using `oxfmt --check .`
directly (no more git-diff trick, oxfmt exits non-zero on drift).
- `.prettierignore` kept under that name (oxfmt reads it by default as the
default ignore file).
- src/installer.ts reformatted by oxfmt (wider default print-width than
prettier, collapses multi-line imports and function signatures that fit).
- package.json re-ordered: oxfmt sorts the keyword list alphabetically and
places top-level keys in a different order than prettier did.
oxfmt is still 0.x so the defaults may shift before 1.0 — if that becomes
disruptive we can pin an exact version and add an `.oxfmtrc.json` to freeze
the style.
Tradeoff: oxfmt only formats JS/TS/JSON (no YAML/Markdown). The workflow
YAML files and CHANGELOG.md will remain as prettier left them until someone
edits them by hand; no CI enforcement on those file types anymore.
The schemastore `package.json` schema references `nodemon.json` via `$ref`
for the `scripts` property. Without that referenced schema passed via `-r`
to ajv-cli, validation fails with:
error: can't resolve reference https://json.schemastore.org/nodemon.json
from id https://json.schemastore.org/package.json#
This has been failing on main since a schemastore refresh. Fix by downloading
the nodemon schema alongside the other 10 and passing it as a reference.
Validation now succeeds with `package.json valid`.
Taskfile.dev migrated away from the docsify hash-routed URLs (`/#/...`)
to plain paths. The old URLs hang with Status 0 in markdown-link-check,
breaking CI.
/#/ -> /
/#/installation -> /installation/
The next release of this action will be v2 (Node 24 breaking change
already documented in CHANGELOG). Update self-referential uses in CI
and README examples accordingly.
CONTRIBUTING.md release workflow left as-is — its v1/v2 example now
matches the current upgrade in progress.
…trix
- actions/checkout@v5 -> @v6 (ci.yml + sync-labels-npm.yml).
- Remove Task 2.x (2.8.1) from integration tests. Task 2.x is years old,
has no macOS arm64 build (requiring an exclude rule), and its archive
layout differed from 3.x which made the extraction path fragile.
- Replace with Task 3.50.0 (latest). Task dropped the "Task version: "
prefix and h1 hash from `--version` output at some point, so the
expected string is just the bare version number.
Every push to a branch with an open PR triggered two CI runs: one from
the `push` event and one from the `pull_request` event. Restrict `push`
to the main branch so PR branches only trigger a single run via
`pull_request`, while merges to main still get validated.
Trade-off: PRs from forks won't be CI'd automatically — they'll need a
manual re-push or the maintainer to push the branch into the main repo.
For this project's contribution pattern that's acceptable; avoids double
runs on every internal push.
@vmaerten
vmaerten merged commit 035a5f1 into mainApr 19, 2026
31 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@vmaerten
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

chore: modernize stack - #5

Merged
vmaerten merged 26 commits into
mainfrom
modernize-stack
Apr 19, 2026
Merged

chore: modernize stack#5
vmaerten merged 26 commits into
mainfrom
modernize-stack

Conversation

@vmaerten

@vmaertenvmaerten commented Feb 8, 2026

Copy link
Copy Markdown
Member

Summary

  • Replace ESLint with oxlint for faster linting
  • Replace Jest with Vitest for testing
  • Upgrade @actions/core to v2
  • Add npm caching (cache: "npm") to all CI workflows
  • Use npm ci instead of npm install in CI and Taskfile
  • Remove tsconfig.eslint.json and ESLint-specific config files
  • Add .licensed.yml reviewed entries for packages detected as "other"
  • Ignore npmjs.com URLs in markdown link checks
  • Simplify npx calls in workflows (remove --package/--call patterns)

@vmaerten
vmaerten marked this pull request as ready for review April 18, 2026 16:59
- Replace npm with pnpm
- Replace Jest with Vitest
- Replace ESLint with Oxlint
- Update all GitHub Actions workflows to use pnpm
- Update Taskfile.yml for new tools
- Add retry mechanism for flaky network tests
- Update all dependencies to latest versions
nock 14.x has different network interception behavior that causes
downloads to abort even with enableNetConnect(). Tests now pass
in ~2s instead of timing out.
Also switch license cache from npm to pnpm source.
The pnpm source for the licensed tool doesn't work properly
(doesn't detect licenses, wrong file paths). Reverting to npm
which works correctly with the license cache.
Changes:
- Remove packageManager field from package.json
- Replace pnpm with npm in Taskfile.yml
- Remove pnpm/action-setup from all workflows
- Regenerate license cache with npm source
Eliminates the Node 24 DEP0169 deprecation warning emitted at runtime by
`typed-rest-client` (which still relies on `url.parse()` in its latest 2.3.0
release). `@actions/http-client` uses the WHATWG `new URL()` API and exposes
an equivalent `HttpClient.getJson()` with the same `allowRetries` /
`maxRetries` options, so retry behavior is preserved.
- @actions/core 2.0.1 -> 2.0.3
- @types/node 25.0.3 -> 25.6.0
- oxlint 1.36.0 -> 1.60.0
- prettier 3.7.4 -> 3.8.3
- semver 7.7.3 -> 7.7.4
- vitest 4.0.16 -> 4.1.4
nock kept at 13.x (see 400d08f).
Bumps (nock kept at 13.x, see 400d08f):
- @actions/core 2 -> 3
- @actions/http-client 2 -> 4
- @actions/io 2 -> 3
- @actions/tool-cache 2 -> 4
- typescript 5 -> 6
- markdownlint-cli 0.47 -> 0.48
All @actions/* v3+/v4+ are ESM only, so the project follows suit:
- package.json: `"type": "module"`
- tsconfig.json: module/moduleResolution NodeNext, target es2022
- sources migrated from `import foo = require(...)` to `import * as foo`
- `__dirname` replaced by `import.meta.dirname` in tests
- ncc auto-detects ESM and produces an ESM bundle
(`dist/index.js` drops from ~2.1MB to ~1.1MB thanks to tree-shaking)
The action surface is unchanged: inputs/outputs are identical and the
runner still executes `node dist/index.js`. Only internal format changes.
ESM-idiomatic style: `import { join } from "node:path"` instead of
`import * as path from "path"`. Applies to node builtins (with the `node:`
prefix) and to `@actions/*`, `semver`, `nock`.
Two local vars in `getFileName` were renamed (`platform`/`arch` → `taskPlatform`/`taskArch`)
to avoid shadowing the new named imports.
No behavior change. Tests still 4/4 PASS, bundle unchanged in size.
- Reformat workflow YAML and src/installer.ts with prettier 3.8.3
(new formatting rules from the version bump).
- Skip package-lock.json in codespell config to silence false positives
on package names like `devlop` that collide with dictionary entries.
- Refresh .licenses/npm cache to reflect the dependency tree after the
ESM migration and majors bump. Obsolete transitive license files
(typed-rest-client, tunnel sub-tree, qs/side-channel-*, etc.) removed;
new cache produced by licensed 5.x in CI (artifact from run 24605756090).
Pre-existing `npm:validate` failure left as-is (same failure on main:
schemastore `nodemon.json` $ref unresolved, out of scope).
Replaces check-action-metadata, check-license, check-markdown, check-npm,
check-npm-dependencies, check-prettier-formatting, check-tsconfig,
check-typescript, spell-check, test-typescript, and test-integration with
a single workflow running the same jobs in parallel.
Simplifications:
- One unified trigger (push, pull_request, weekly cron) instead of
per-workflow path filters. For a project this size, always running the
full suite is simpler than maintaining 11 distinct path lists.
- Dropped the `run-determination` gate specific to the arduino release
branches convention — not relevant to this fork.
- Single check suite shown per PR/commit instead of 11.
sync-labels-npm.yml left untouched (different trigger, independent).
Aligns with the rest of the oxc-based tooling (oxlint).
- Replace `prettier` with `oxfmt` in devDependencies.
- Taskfile: `general:format-prettier` -> `general:format`, now runs `npx oxfmt --write .`.
- CI: `check-prettier` job -> `check-format` using `oxfmt --check .`
directly (no more git-diff trick, oxfmt exits non-zero on drift).
- `.prettierignore` kept under that name (oxfmt reads it by default as the
default ignore file).
- src/installer.ts reformatted by oxfmt (wider default print-width than
prettier, collapses multi-line imports and function signatures that fit).
- package.json re-ordered: oxfmt sorts the keyword list alphabetically and
places top-level keys in a different order than prettier did.
oxfmt is still 0.x so the defaults may shift before 1.0 — if that becomes
disruptive we can pin an exact version and add an `.oxfmtrc.json` to freeze
the style.
Tradeoff: oxfmt only formats JS/TS/JSON (no YAML/Markdown). The workflow
YAML files and CHANGELOG.md will remain as prettier left them until someone
edits them by hand; no CI enforcement on those file types anymore.
The schemastore `package.json` schema references `nodemon.json` via `$ref`
for the `scripts` property. Without that referenced schema passed via `-r`
to ajv-cli, validation fails with:
error: can't resolve reference https://json.schemastore.org/nodemon.json
from id https://json.schemastore.org/package.json#
This has been failing on main since a schemastore refresh. Fix by downloading
the nodemon schema alongside the other 10 and passing it as a reference.
Validation now succeeds with `package.json valid`.
Taskfile.dev migrated away from the docsify hash-routed URLs (`/#/...`)
to plain paths. The old URLs hang with Status 0 in markdown-link-check,
breaking CI.
/#/ -> /
/#/installation -> /installation/
The next release of this action will be v2 (Node 24 breaking change
already documented in CHANGELOG). Update self-referential uses in CI
and README examples accordingly.
CONTRIBUTING.md release workflow left as-is — its v1/v2 example now
matches the current upgrade in progress.
…trix
- actions/checkout@v5 -> @v6 (ci.yml + sync-labels-npm.yml).
- Remove Task 2.x (2.8.1) from integration tests. Task 2.x is years old,
has no macOS arm64 build (requiring an exclude rule), and its archive
layout differed from 3.x which made the extraction path fragile.
- Replace with Task 3.50.0 (latest). Task dropped the "Task version: "
prefix and h1 hash from `--version` output at some point, so the
expected string is just the bare version number.
Every push to a branch with an open PR triggered two CI runs: one from
the `push` event and one from the `pull_request` event. Restrict `push`
to the main branch so PR branches only trigger a single run via
`pull_request`, while merges to main still get validated.
Trade-off: PRs from forks won't be CI'd automatically — they'll need a
manual re-push or the maintainer to push the branch into the main repo.
For this project's contribution pattern that's acceptable; avoids double
runs on every internal push.
@vmaerten
vmaerten merged commit 035a5f1 into mainApr 19, 2026
31 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@vmaerten