Skip to content

ci: wire Biome as the linter (replace never-installed eslint)#8

Merged
kazukinakai merged 1 commit into
mainfrom
ci/biome-linter
Jun 17, 2026
Merged

ci: wire Biome as the linter (replace never-installed eslint)#8
kazukinakai merged 1 commit into
mainfrom
ci/biome-linter

Conversation

@kazukinakai

Copy link
Copy Markdown
Member

Why

The org reusable CI (node-pnpm-ci.yml, adopted in #4) runs pnpm turbo run build lint test, but lint was guaranteed to fail: every workspace package shipped a "lint": "eslint ..." script while eslint was never installed anywhere in this fork (no devDependency, absent from pnpm-lock.yaml), and the leftover root .eslintrc.json never actually ran. The org standard linter is Biome (see the agiletec repo).

#4 merged the CI workflow to main but did not fix the eslint wiring, so ci / ci is currently red on main. This PR makes pnpm turbo run lint pass.

What

  • Add @biomejs/biome@^2.4.16 to root devDependencies (no pnpm catalog in this repo, so pinned literally).
  • Add biome.json replicating agiletec's curated ruleset (recommended: false + error-level rules), formatter, and vcs blocks; files.includes adapted to this layout.
  • Replace "eslint ..." with "biome check ." in all 20 package lint scripts (packages/gemini-core keeps its echo no-op by design).
  • Remove the orphaned .eslintrc.json.
  • Apply biome check --write (formatting + safe fixes) and fix the residual real violations: unused catch bindings, escape/shadowed-global renames, redundant test non-null assertions, a placeholder async generator, and a generic-T cast where biome's Object.hasOwn safe-fix outran tsc.

Rules tuned for inherited Qwen-fork code

  • noControlCharactersInRegex: off — terminal/ANSI handling intentionally matches control chars (every hit carried an eslint-disable no-control-regex).
  • noUndeclaredVariables: off — redundant with tsc and misfires on TS type references; mirrors agiletec's TypeScript override.
  • noExplicitAny / noEmptyBlockStatements: warn — too noisy to gate on now across the fork; kept visible as warnings for later cleanup.

Verification

  • pnpm turbo run lint2 successful, 2 total (the two workspace packages, @airiscode/cli + @airiscode/core).

Pre-existing failures (NOT addressed here — out of lint scope)

ci / ci runs build lint test. Two pre-existing, unrelated failures remain (they were masked in #4's run because turbo fail-fast aborted on the eslint error first):

  1. @airiscode/cli#build fails error TS17004: Cannot use JSX unless the '--jsx' flag is provided — the airis-generated tsconfig.base.json has no jsx option but the CLI uses Ink/React JSX. Fix belongs in manifest.toml [typescript] + airis gen (or a hand-set jsx in the generated tsconfig).
  2. @airiscode/core#test (and cli) fail MISSING DEPENDENCY '@vitest/coverage-v8' — the vitest config requests coverage but the provider is not installed anywhere. Fix: add @vitest/coverage-v8 devDep (or drop coverage from the vitest config).

These block full ci / ci green and should be handled separately.

Every workspace package shipped a "lint": "eslint ..." script, but eslint
was never installed anywhere in this fork (no devDependency, absent from
the lockfile) and the leftover root .eslintrc.json never actually ran.
The org standard linter is Biome, so adopt it to match the agiletec repo.

- Add @biomejs/biome to root devDependencies (no pnpm catalog here, pinned).
- Add biome.json replicating agiletec's curated ruleset
  (recommended:false + error-level rules), formatter, and vcs blocks.
- Replace "eslint ..." with "biome check ." in all 20 package lint scripts
  (packages/gemini-core left as its echo no-op, per design).
- Remove the orphaned .eslintrc.json.
- Apply `biome check --write` (formatting + safe fixes) and fix the residual
  real violations: unused catch bindings, escape/shadowed-global renames,
  redundant test non-null assertions, a placeholder async generator, and a
  generic-T cast where biome's Object.hasOwn safe-fix outran tsc.

Rules tuned for inherited Qwen-fork code (for reviewers):
- noControlCharactersInRegex: off — terminal/ANSI handling intentionally
  matches control chars (every hit carried an eslint-disable no-control-regex).
- noUndeclaredVariables: off — redundant with tsc and misfires on TS type
  references; mirrors agiletec's TypeScript override.
- noExplicitAny / noEmptyBlockStatements: warn — too noisy to gate on now
  across the fork; kept visible as warnings for later cleanup.
@kazukinakai kazukinakai merged commit 125e455 into main Jun 17, 2026
1 of 2 checks passed
@kazukinakai kazukinakai deleted the ci/biome-linter branch June 17, 2026 22:51
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