Skip to content

build(deps): bump @eslint/js to ^10.0.1 and eslint to ^10.3.0#12

Open
FlexNetOS wants to merge 1 commit intomainfrom
devin/1777818078-fix-pr6-eslint10
Open

build(deps): bump @eslint/js to ^10.0.1 and eslint to ^10.3.0#12
FlexNetOS wants to merge 1 commit intomainfrom
devin/1777818078-fix-pr6-eslint10

Conversation

@FlexNetOS
Copy link
Copy Markdown
Owner

@FlexNetOS FlexNetOS commented May 3, 2026

What Changed

Supersedes #6 (closed before yarn.lock was updated). Picks up the same dependency bump and lands the two follow-ups Devin Review flagged on that PR.

  • Bump @eslint/js from ^9.39.2 to ^10.0.1.
  • Bump eslint from ^9.39.2 to ^10.3.0.
  • Re-run yarn install (Yarn Berry 4.9.2) so yarn.lock actually resolves eslint@npm:10.3.0 plus the updated transitive dependencies (@eslint/config-array@0.23.5, @eslint/core, etc.). PR Bump @eslint/js from 9.39.2 to 10.0.1 #6 only updated package-lock.json.
  • Bump engines.node from >=18 to >=20.19.0. ESLint 10 / @eslint/config-array@0.23.5 require node ^20.19.0 || ^22.13.0 || >=24, so claiming >=18 was contradictory and would break yarn install / npm ci for any contributor on Node 18.
  • Drop '18.x' from the test matrix in .github/workflows/ci.yml and remove the matching node-version == '18.x' guard in .github/workflows/reusable-test.yml. The "Setup pnpm via Corepack" fallback that only existed to install pnpm@9 on Node 18 goes away with it.
  • Fix 18 ESLint 10 lint errors that surface from the new preserve-caught-error and no-useless-assignment recommended rules:
    • Attach { cause: error } to errors re-thrown in 13 catch blocks across scripts/ci/, scripts/lib/, and scripts/lib/install*/.
    • Drop dead initial assignments in 4 let declarations (scripts/hooks/evaluate-session.js, scripts/hooks/observe-runner.js, tests/hooks/hooks.test.js, tests/run-all.js) that are unconditionally overwritten in both try and catch branches before any read.

Why This Change

PR #6 (Devin Review) bumped eslint to ^10.3.0 in package.json and package-lock.json, but the second commit on that PR did not regenerate yarn.lock. Since this repo's packageManager is yarn@4.9.2, yarn.lock is the canonical lockfile — leaving it pointing at eslint@npm:^9.39.2 would cause yarn install --immutable (and any Yarn-based CI lane) to fail. Devin Review also pointed out that ESLint 10 silently broke the project's stated node >=18 support contract, since ESLint 10's own engines field requires Node 20.19+. Bumping the floor to 20.19 + dropping 18 from CI keeps the engines field, the lockfiles, and CI all consistent.

Testing Done

  • Manual testing completed
  • Automated tests pass locally (node tests/run-all.js) — same 8 pre-existing failures as main (unrelated: lib/session-manager, opencode-plugin-hooks, build-opencode, npm-publish-surface, trae-install); my changes do not introduce or fix any of these.
  • npm run lint passes (eslint . is clean, markdownlint is clean).
  • yarn install reports + @eslint/js@npm:10.0.1, eslint@npm:10.3.0 and removes the stale @eslint/config-array@npm:0.21.1 and 22 other entries.
  • package-lock.json regenerated; node_modules/eslint now resolves to 10.3.0 and node_modules/@eslint/js to 10.0.1.
  • Edge cases considered and tested

Type of Change

  • fix: Bug fix
  • feat: New feature
  • refactor: Code refactoring
  • docs: Documentation
  • test: Tests
  • chore: Maintenance/tooling
  • ci: CI/CD changes

Security & Quality Checklist

  • No secrets or API keys committed (ghp_, sk-, AKIA, xoxb, xoxp patterns checked)
  • JSON files validate cleanly
  • Shell scripts pass shellcheck (if applicable) — N/A
  • Pre-commit hooks pass locally (if configured) — none configured
  • No sensitive data exposed in logs or output
  • Follows conventional commits format

Documentation

  • Updated relevant documentation — engines bump and CI matrix change documented in this description; no user-facing docs reference Node 18 explicitly.
  • Added comments for complex logic — N/A
  • README updated (if needed) — not needed

Link to Devin session: https://app.devin.ai/sessions/af73321ca16a4da6bbbbb27fc0d6bf24
Requested by: @FlexNetOS


Open in Devin Review

Supersedes #6 (closed before yarn.lock was updated).

Addresses two Devin Review findings on PR #6:

1. yarn.lock desync — PR #6 bumped eslint to ^10.3.0 in package.json and
   package-lock.json but left yarn.lock pointing at eslint@npm:^9.39.2.
   Since the project's packageManager is Yarn Berry 4.9.2, yarn.lock is
   the primary lockfile and 'yarn install --immutable' would fail. Re-ran
   'yarn install' so yarn.lock now resolves eslint@10.3.0 and updated
   transitive deps (@eslint/config-array@0.23.5, @eslint/core, etc.).

2. ESLint 10 dropped Node 18 — bumped engines.node from '>=18' to
   '>=20.19.0' (matching what eslint 10.x and @eslint/config-array 0.23.5
   actually require) and removed Node 18.x from the CI test matrix in
   ci.yml + reusable-test.yml. The Setup-pnpm-via-Corepack fallback that
   only existed for Node 18 is no longer needed.

Also fixes 18 ESLint 10 errors that surface from the new
preserve-caught-error and no-useless-assignment recommended rules:
- Attach { cause } to errors re-thrown in 13 catch blocks.
- Drop dead initial assignments in 4 let declarations that are
  unconditionally overwritten before any read.
@devin-ai-integration
Copy link
Copy Markdown

Original prompt from FlexNetOS

Take over and fix the bugs found by Devin Review in PR #6 in flexnetos/agent_harness.

@devin-ai-integration
Copy link
Copy Markdown

🤖 Devin AI Engineer

I'll be helping with this pull request! Here's what you should know:

✅ I will automatically:

  • Address comments on this PR. Add '(aside)' to your comment to have me ignore it.
  • Look at CI failures and help fix them

Note: I can only respond to comments from users who have write access to this repository.

⚙️ Control Options:

  • Disable automatic comment and CI monitoring

@devin-ai-integration
Copy link
Copy Markdown

Devin is archived and cannot be woken up. Please unarchive Devin if you want to continue using it.

11 similar comments
@devin-ai-integration
Copy link
Copy Markdown

Devin is archived and cannot be woken up. Please unarchive Devin if you want to continue using it.

@devin-ai-integration
Copy link
Copy Markdown

Devin is archived and cannot be woken up. Please unarchive Devin if you want to continue using it.

@devin-ai-integration
Copy link
Copy Markdown

Devin is archived and cannot be woken up. Please unarchive Devin if you want to continue using it.

@devin-ai-integration
Copy link
Copy Markdown

Devin is archived and cannot be woken up. Please unarchive Devin if you want to continue using it.

@devin-ai-integration
Copy link
Copy Markdown

Devin is archived and cannot be woken up. Please unarchive Devin if you want to continue using it.

@devin-ai-integration
Copy link
Copy Markdown

Devin is archived and cannot be woken up. Please unarchive Devin if you want to continue using it.

@devin-ai-integration
Copy link
Copy Markdown

Devin is archived and cannot be woken up. Please unarchive Devin if you want to continue using it.

@devin-ai-integration
Copy link
Copy Markdown

Devin is archived and cannot be woken up. Please unarchive Devin if you want to continue using it.

@devin-ai-integration
Copy link
Copy Markdown

Devin is archived and cannot be woken up. Please unarchive Devin if you want to continue using it.

@devin-ai-integration
Copy link
Copy Markdown

Devin is archived and cannot be woken up. Please unarchive Devin if you want to continue using it.

@devin-ai-integration
Copy link
Copy Markdown

Devin is archived and cannot be woken up. Please unarchive Devin if you want to continue using it.

Copy link
Copy Markdown

@devin-ai-integration devin-ai-integration Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Devin Review found 4 potential issues.

Open in Devin Review

Comment thread tests/hooks/hooks.test.js
Comment on lines +66 to 69
let comparablePath;
try {
comparablePath = fs.realpathSync.native ? fs.realpathSync.native(nativePath) : fs.realpathSync(nativePath);
} catch {
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📝 Info: Variable un-initialization in hooks.test.js is safe but removes a subtle fallback

The change from let comparablePath = nativePath to let comparablePath; at tests/hooks/hooks.test.js:66 removes an implicit fallback. Previously, if the try block threw before the assignment (e.g., if fs.realpathSync.native itself threw during property access rather than during the function call), comparablePath would retain nativePath. Now the catch block handles it with path.resolve(nativePath), which is functionally equivalent for this use case. Both nativePath and path.resolve(nativePath) resolve to the same value when nativePath is already absolute, which it will be after fromBashPath(). Safe, but the semantic intent shifted slightly from 'use raw path as fallback' to 'use resolved path as fallback'.

(Refers to lines 66-71)

Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

Comment thread package.json
Comment on lines +266 to +270
"@eslint/js": "^10.0.1",
"@opencode-ai/plugin": "^1.0.0",
"@types/node": "^20.19.24",
"c8": "^11.0.0",
"eslint": "^9.39.2",
"eslint": "^10.3.0",
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🚩 ESLint major version bump (v9 → v10) with no config changes

Both eslint and @eslint/js are bumped from v9 to v10. The repo uses the flat config format (eslint.config.js with module.exports = [...]), which was introduced in ESLint v8 and is the default in v9+. The config uses js.configs.recommended, standard languageOptions, and basic rules — all of which should be stable across the v9→v10 transition. However, ESLint major versions can introduce breaking changes in rule defaults or config schema. This should be validated by CI (the lint job runs npx eslint scripts/**/*.js tests/**/*.js), so any incompatibility would surface there.

Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

Comment thread package.json
},
"engines": {
"node": ">=18"
"node": ">=20.19.0"
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🚩 Engine constraint uses unusually specific minor version >=20.19.0

The engine field changed from >=18 to >=20.19.0. While dropping Node 18 is consistent with the CI matrix change, the specific minor version 20.19.0 (rather than simply >=20) is notable. This may be intentional to require a specific Node 20 patch that includes a needed API (e.g., path.matchesGlob used in tests/run-all.js:18 was added in Node 22 and has a fallback, but other APIs may be version-sensitive). The @types/node version ^20.19.24 suggests 20.19.x is a real Node.js release line. Worth confirming this minimum is intentional and documented.

Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

Comment thread scripts/ci/catalog.js
return fs.readFileSync(filePath, 'utf8');
} catch (error) {
throw new Error(`Failed to read ${path.basename(filePath)}: ${error.message}`);
throw new Error(`Failed to read ${path.basename(filePath)}: ${error.message}`, { cause: error });
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📝 Info: Consistent application of { cause: error } across all error re-throw sites

The PR adds { cause: error } to 14 different new Error() re-throw sites across 11 files. This is a systematic improvement for debuggability — the cause property (standardized in ES2022/Node 16.9+) preserves the original error in the chain. The pattern is applied consistently: every catch (error) { throw new Error(...) } site now includes the cause. This is safe given the engine bump to >=20.19.0.

Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

Sign up for free to 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