Skip to content

[JUM-21][Refactor] Adopt Airbnb Extended ESLint 9 flat configuration (epic-wide, single-PR exception) - #545

Open
web2solutions wants to merge 9 commits into
devfrom
kimi-code-primary-001/refactor/JUM-21-eslint-9-flat-config-epic
Open

web2solutions wants to merge 9 commits into
devfrom
kimi-code-primary-001/refactor/JUM-21-eslint-9-flat-config-epic

Conversation

@web2solutions

@web2solutions web2solutions commented Sep 27, 2026 •

Copy link
Copy Markdown
Owner

Summary

Adopts the Airbnb Extended ESLint 9 flat configuration across the whole monorepo in a single PR (owner-approved exception to Requirement 086's one-issue-one-PR rule): the new @jumentix/config-eslint workspace package is the single source of truth for lint profiles (base, type-aware TypeScript, Node, Vue, React/Next/a11y, test, Stylistic+Prettier, each with a *Strict variant), all three lint consumers (root, apps/frontend, apps/jumentix-website) run the strict profiles at 0 errors / 0 warnings under --max-warnings=0, Prettier is integrated with format / format:check gates, and the lint gate is hardened against false greens (anti empty-glob runner with per-consumer coverage floors). Measured strict remediation: 252,732 → 0 violations.

Problem Statement

ESLint 8 .eslintrc reached end of life and the repo carried per-app configs with six legacy-disabled rules and no shared, versioned profile source. The epic migrates to ESLint 9 flat config via eslint-config-airbnb-extended, productizes the shared config, remediates every strict violation, and makes the gates impossible to false-green.

  • Related issue(s): JUM-5, JUM-6, JUM-7, JUM-8, JUM-9, JUM-10, JUM-11, JUM-12, JUM-13, JUM-14, JUM-15, JUM-16, JUM-17, JUM-18, JUM-19, JUM-20, JUM-21, JUM-44, JUM-866, JUM-867, JUM-868, JUM-869 (full epic, 21 issues)
  • Related PR(s): none
  • Related check run(s): CI on this PR

Project Tracking (Required)

  • Linear Project: Jumentix (https://linear.app/jumentix)
  • Focused epic link: https://linear.app/jumentix/project/tooling-adopt-airbnb-extended-eslint-9-flat-configuration-eca1518a751b/overview
  • Epic milestone: M1–M5 (all covered by this PR)
  • Primary task nature: Refactor (tooling)
  • Epic-delegated agent ID: kimi-code-primary-001
  • Child task issue link: see issue list above
  • Project Update: 5 updates posted on the project (baseline, pin, platform, strict decisions, final)
  • Linear Project link(s): epic link above
  • Linear Issue link(s): https://linear.app/jumentix/issue/JUM-21 (epic-close issue) + 20 siblings
  • Linear Issue ID list (comma separated): JUM-5, JUM-6, JUM-7, JUM-8, JUM-9, JUM-10, JUM-11, JUM-12, JUM-13, JUM-14, JUM-15, JUM-16, JUM-17, JUM-18, JUM-19, JUM-20, JUM-21, JUM-44, JUM-866, JUM-867, JUM-868, JUM-869
  • Item status at PR creation: In Progress (JUM-866 Done); issues move to Done only after merge
  • Target cycle (Start date -> End date): current cycle
  • Priority group for this PR (P0 / P1 / P2): P1
  • This PR contains tasks from only one priority group.

Branch Promotion Path (Required)

  • Source branch: kimi-code-primary-001/refactor/JUM-21-eslint-9-flat-config-epic
  • Target branch: dev
  • Required PR title format: [JUM-XXXX][Nature] <concise outcome>
  • The leading JUM-XXXX matches the single Linear Issue declared above (JUM-21, the epic-close issue; full mapping below).
  • This task PR targets dev.
  • If this PR targets main, it is a release promotion sourced from dev... — N/A
  • This PR is not a direct task/topic branch promotion to main.

Bidirectional Traceability (Required)

  • Every linked issue already contains this PR URL (attached post-creation).
  • Every linked issue already contains commit hash/range evidence (branch range 5410581d..HEAD, posted with the PR URL).
  • PR description includes mapping of task -> commit(s).
  • Task -> commit(s) mapping:
    • JUM-5: no code commit — baseline measurements published as Linear Project Updates (ESLint 9.39.5 selected over 10.x because eslint-config-airbnb-extended@3.2.0 peers ^9.0.0)
    • JUM-6: 86ffd73f chore(JUM-6): pin ESLint 9.39.5 across the monorepo
    • JUM-7, JUM-9, JUM-10, JUM-12, JUM-14: d095bcd4 refactor(JUM-7)+test(JUM-14): productize @jumentix/config-eslint (profiles base/typescript/node + import-x resolution/ordering; 41 contract tests with versioned snapshots)
    • JUM-8, JUM-867, JUM-11, JUM-868: c664e330 refactor(JUM-8+867+11): flat-config consumers for root, frontend (Vue+a11y) and website (React/Next/a11y)
    • JUM-15, JUM-16, JUM-17, JUM-18, JUM-869, JUM-44: 7d8def49 fix: remediate strict-profile violations across all surfaces (252,732 → 0)
    • JUM-13: 7b8e49b4 chore(JUM-13): integrate Prettier with the shared config and format the repo
    • JUM-19: 538b9724 ci(JUM-19): make lint and formatting gates impossible to false-green
    • JUM-866: 12db5a6b docs(JUM-866): write requirement 138 ESLint 9 flat-config governance
    • JUM-20: e87f0b12 docs(JUM-20): publish the ESLint and formatting developer guide
    • JUM-21: 3c6fb366 chore(JUM-21): regenerate cli-init templates and close the epic rollout

Scope of Change

Domain / Business Rules

  • None.

Application / Use Cases

  • None (lint-only mechanical changes: import ordering, default-export conversions, type-only imports).

Adapters / Infrastructure

  • packages/config-eslint (new workspace package): profile factory + strict variants + 41 contract tests.
  • eslint.config.mjs (root), apps/frontend/eslint.config.mjs, apps/jumentix-website/eslint.config.mjs: flat configs consuming the shared package; legacy .eslintrc.js / .prettierrc.js removed.
  • ci-cd/run-lint.js + ci-cd/lint-coverage-floors.json + ci-cd/test/run-lint.test.ts: fail-closed lint runner (empty-glob proof, per-consumer file-count floors: root 2,802 / frontend 178 / website 179).
  • 12 packages/* tsconfigs: @jumentix/* path mapping to src for tests + per-package tsconfig.build.json (no paths) — fixes dual class identity between src and dist (~50 test failures).
  • prettier.config.mjs, .prettierignore, format / format:check scripts.

API / Contracts (OpenAPI, DTOs, handlers, controllers)

  • No runtime contract change. Dynamic controller resolution (RealtimeAPIBase, RestAPI) accepts both default and named exports after the JUM-44 codemod; serverless.ts keeps module.exports with a justified disable (framework contract, covered by aws-service-name.test.ts).

Detailed Technical Changes

  1. Single-PR exception (owner-approved). Requirement 086 mandates one issue = one PR; the owner explicitly approved executing this 21-issue epic as one PR because the remediation is inseparable from the platform change (intermediate states do not lint).
  2. ESLint 9.39.5, not 10. eslint-config-airbnb-extended@3.2.0 declares peer eslint: ^9.0.0 only; per the epic's own fallback rule the pin stays on 9.x.
  3. JUM-44 legacy rules, measured decisions. arrow-body-style, jest/unbound-method enabled and remediated; import-x/no-cycle enabled at depth 1 (0 violations); import-x/prefer-default-export enforced via codemod (309 modules converted, barrels preserved as re-exports, 4 justified Next.js contract suppressions); @typescript-eslint/no-explicit-any (3,482 measured) and no-underscore-dangle (366 measured) remain OFF as documented owner decisions recorded in the typescript/parity profiles.
  4. Prettier without conflicts. Stylistic profile defers formatting to Prettier; format:check is part of ci:gate; YAML keeps double quotes so the check-ci-provider cron contract survives formatting; CHANGELOG files are prettier-ignored (release-owned).
  5. False-green hardening. The lint runner proves non-empty globs, enforces per-consumer file-count floors, and runs --max-warnings=0 everywhere.

Architecture and Design Alignment

  • Domain logic remains inside domain/application layers.
  • Controllers/handlers do not instantiate repositories/services directly.
  • Ports/adapters boundaries are respected (arch:check-boundaries green).
  • No new circular dependencies introduced (import-x/no-cycle depth 1 enforced; deps:check-cycles green).
  • Event publishing/listening flow remains consistent.

Security Impact

  • Security impact: none — tooling/lint-only change; no auth, crypto, or data-path edits.
  • Secrets handling reviewed: [x] Yes [ ] No [ ] N/A (no secret-bearing file touched)
  • Input/output sanitization reviewed: [ ] Yes [ ] No [x] N/A
  • AuthN/AuthZ impact: [ ] Yes [x] No
  • Data exposure risk (password/salt/token/PII): [ ] Yes [x] No
  • Sonar security findings addressed or unaffected: [x] Yes [ ] No

Data and Migration Impact

  • Data model impact: none. Seed JSON fixtures were re-indented by Prettier (content-identical).
  • Migration required: [ ] Yes [x] No
  • Rollback strategy: revert the branch; no runtime state involved.

Breaking Changes

None for runtime behavior. Developer-facing: bun run lint now runs the strict shared profiles with --max-warnings=0; local eslint plugins overrides in app-level .eslintrc files are gone in favor of the shared package (migration guide in documentation/md/ESLINT-AND-FORMATTING-GUIDE.md).

Acceptance Criteria

  • Feature/bug behavior matches expected functional outcome (lint platform adopted; runtime behavior unchanged — full test gate green).
  • Error paths and edge cases are covered (contract tests include negative fixtures per profile, empty-glob proof, external consumer test).
  • API contract changes (if any) are documented and validated — none.
  • Architecture boundaries remain enforced.
  • No regression in existing workflows (ci:gate:task 3,988+ tests green).

Test Plan (Evidence)

  • bun run lint — exit 0, root 2,803 files 0 errors / 0 warnings (strict, --max-warnings=0)
  • bun run deps:check-cycles — exit 0
  • bun run arch:check-boundaries — exit 0
  • bun run arch:check-users-legacy-imports — exit 0
  • bun run test:unit — exit 0 (bun phase of ci:gate:task: 3,988 tests)
  • bun run oas:check-routes — exit 0
  • bun run build:dev — exit 0
  • bun run ci:smoke — exit 0
  • bun run ci:gate — every step executed and green across the final runs except deps:audit, which fails identically on dev (11 fatal advisories on dev's own lockfile — verified on the dev checkout; 20 here with current OSV data). The flagged advisories (next, sharp, adm-zip, nanoid, svgo, js-yaml) predate this branch and belong to the dependency-upgrade track, not this epic. Chain executed step-by-step after the deps:audit stop: lint (3 consumers, 0/0), format:check, all arch/boundary/cycle guards, workspace quality + coverage policy, release/authorship governance, requirements:check (129), docs governance, packages suites + build freshness, cli template freshness, website content routes, rtdb indexes, test:integrity, test-map:check, ci provider + third-party review, integrations + migration checks, agent-registry, test:unit (3,988 tests), frontend coverage (311 tests, thresholds met), ci:security-smoke, oas checks, serverless handlers, build:dev, ci:smoke — all exit 0.
  • Additional: bun run format:check exit 0; bun run requirements:check exit 0; bun run test-map:check exit 0; bun run packages:check-suites exit 0; bun run cli:check-template-freshness exit 0; bun test packages/config-eslint 41/41 pass.

Feedback Resolution (Required)

  • Every GitHub review thread is resolved natively. (post-review)
  • Every general comment has a visible resolution response by the PR author or a repository maintainer. (post-review)
  • Each resolution response uses exactly one marker and, for resolved, a SHA from this PR. (post-review)

Coverage

  • Project coverage >= 95%: [x] Yes [ ] No (unchanged thresholds; check-coverage-thresholds green)
  • Patch coverage >= 95%: [ ] Yes [ ] No — reported by Codecov on this PR; remediation lines are mechanical and covered by existing suites
  • Codecov status passing: [ ] Yes [ ] No (CI)

SonarQube Cloud

  • Quality Gate passing: [ ] Yes [ ] No (CI)
  • New vulnerabilities introduced: [ ] Yes [x] No
  • New security hotspots reviewed: [ ] Yes [ ] No [x] N/A

Performance / Reliability Impact

Lint runtime is comparable to the legacy setup (type-aware profiles run with project service). One test-harness fix improves reliability under parallel load: serverHarness now waits for child close instead of exit so EADDRINUSE is never misclassified. No runtime latency/throughput impact.

Observability

  • Logs updated: [ ] Yes [x] No
  • Metrics/Tracing updated: [ ] Yes [ ] No [x] N/A

Deployment and Rollout

  • Deployment notes: merge to dev; no deploy step (tooling only).
  • Feature flag needed: [ ] Yes [x] No
  • Rollout strategy: standard dev promotion.
  • Rollback steps: revert the squash commit on dev.

Risks and Mitigations

  1. Risk: sheer diff size hides a behavioral change.
    Mitigation: remediation was mechanical and rule-driven; every commit passed the full pre-commit branch gate (lint + integrity + affected task tests); the final ci:gate run is attached above; class-split and default-export edge cases have targeted regression tests (RealtimeAPIBase.moduleResolution, index.exports suites).
  2. Risk: future lint drift / false green.
    Mitigation: JUM-19 runner fails closed on empty globs and enforces file-count floors; requirement 138 makes the shared package the governed source; contract tests snapshot every profile.

Documentation Updates

  • README updated (if needed) — packages/config-eslint README EN/PT
  • Additional docs updated (if needed) — documentation/md/ESLINT-AND-FORMATTING-GUIDE.md (+ pt-BR), SPEC index entries, apps/frontend/AGENTS.md note, requirement 138
  • Changelog untouched; GitHub Actions synchronizes it only after the validated main merge (CHANGELOG files byte-identical to dev and prettier-ignored)

Reviewer Checklist

  • Changes are clear and scoped.
  • Acceptance criteria are testable and satisfied.
  • Tests are sufficient for risk level.
  • Security and data impacts are addressed.
  • CI checks pass fully.

Note

Medium Risk
Monorepo-wide lint/format and CI gate changes touch every workspace but not runtime auth or data paths; large diff size increases review risk for accidental behavioral edits amid mechanical fixes.

Overview
Migrates the monorepo from ESLint 8 .eslintrc to ESLint 9 flat config with a new shared package @jumentix/config-eslint as the only rule source (Airbnb-extended profiles for base, TypeScript, Node, Vue, React/Next/a11y, test, and Stylistic+Prettier). Root .eslintrc.js is removed; root, apps/frontend, and apps/jumentix-website now compose eslint.config.mjs from strict profiles with --max-warnings=0.

Remediation and gates: Strict-profile violations are cleared across the tree (per PR: 252,732 → 0), with mechanical import/default-export and type-import fixes. Prettier becomes the formatting authority via prettier.config.mjs, .prettierignore, and format / format:check in ci:gate; repo-wide Prettier pass shows up in docs, compose files, and similar. ci-cd/run-lint.js plus coverage floors and tests harden lint against empty globs and shrinking file counts.

Governance and CI: Requirement 138 is added (NFR registry, .agents/README.md, full spec). Developer docs and cli-init templates are regenerated to match the new lint/format setup. CircleCI patch coverage now includes packages/config-eslint coverage.

Reviewed by Cursor Bugbot for commit 3c6fb36. Bugbot is set up for automated code reviews on this repo. Configure here.

- eslint 9.39.5 in root, apps/frontend, apps/jumentix-website and
  packages/config-eslint (single major; eslint-config-airbnb-extended@3.2.0
  declares peer eslint ^9 only, so JUM-6's own fallback rule applies and
  apps/frontend steps down from 10.x)
- remove legacy ESLint 8 family from the root: eslint-config-airbnb-base,
  eslint-import-resolver-alias, eslint-plugin-import, eslint-plugin-jest,
  eslint-plugin-module-resolver, eslint-plugin-no-async-foreach,
  @typescript-eslint/* (superseded by @jumentix/config-eslint's own deps)
- add prettier 3.9.9 + globals 17.12.0; apps/frontend declares cypress,
  apps/jumentix-website declares cypress and @jumentix/service-management
  (hoist-only latent gaps the legacy resolver could not see, JUM-16 class)
- package.json script wiring for the new gates (JUM-13/JUM-19): lint runs
  through ci-cd/run-lint.js with --max-warnings=0; lint:frontend/lint:website
  per-surface; format/format:check; ci:gate chains all four
- apps/frontend and apps/jumentix-website lint scripts drop 'next lint'
  (removed in Next.js 16) for direct eslint with --max-warnings=0

Verified: bun install --frozen-lockfile clean, deps:check-overrides exit 0,
zero peer warnings in the ESLint family.
…he single flat-config source

- packages/config-eslint/src exports composable flat-config profiles on
  eslint-config-airbnb-extended: base, typescript, node, vue, reactNextA11y,
  test, stylistic, each with a *Strict variant (strict is what every consumer
  runs)
- Jumentix parity layer: no-console, no-async-foreach, dependency-declaration
  guard with workspace-union packageDirs, deliberate legacy relaxations with
  reasons; strict variant adds the four JUM-44 rules the owner accepted
  (no-cycle depth 1, arrow-body-style, prefer-default-export,
  jest/unbound-method) plus the JUM-9 type policies
- typescript profile: per-workspace projectService resolution (JUM-9);
  untypedFiles fallback for trees no tsconfig covers (985 parse fatals at
  first measurement, now zero); resolverProjects wiring import-x resolution
  for @src/* and @jumentix/* aliases (JUM-12)
- node profile: eslint-plugin-n with the Node 22 floor from root engines;
  n/no-sync off (type-aware crash on plain JS); Bun API allowances documented
- vue profile: tiers + vuejs-accessibility (strict) + typed <script setup>;
  reactNextA11y: React/Hooks/jsx-a11y/@next core web vitals; react strict
  tier's arrow-function demand neutralized (recommended tier's declaration
  convention wins)
- test profile: Jest scoped to test files only (JUM-619), docker-gated and
  bun:test and Cypress/Mocha exception blocks preserved from the legacy
  per-path overrides; jest padding family and two jest-29 additions off with
  reasons
- stylistic profile: eslint-config-prettier last in every array (JUM-13)
- contract suite (41 tests): positive/negative fixtures per profile,
  effective-config snapshots (committed JSON, runtime-neutral for bun test
  and jest), export resolution, empty-glob detection, external-consumption
  fixture project; bun coverage feeds coverage/config-eslint into the merge
- real package.json (build via tsc ESM, lint/typecheck/test), README EN+pt-BR
- codemod/strict follow-ups: controller dynamic resolution reads default
  exports first (RealtimeAPIBase/RestAPI); hoisting-safe firebase mocks in
  agent-registry suites; handler imports restored in handlers.test.ts;
  authenticateForHeader seed helper replaces dropped non-null spreads in
  integration suites (authenticate returns IServiceResponse with optional
  result — proving it exists, JUM-44 compliant)

Verified: bun run --cwd packages/config-eslint build|lint|typecheck|test all
exit 0; suite fails on a deliberately broken profile (rule drop, empty glob).
…website

- root eslint.config.mjs consumes @jumentix/config-eslint strict profiles,
  reproducing every legacy ignorePattern and per-path override (Jest scoped
  to test files, docker-gated integration suites, frontend bun:test suites,
  Cypress/Mocha browser globals, restify allow-list); scoped JUM-18
  overrides documented inline: service-management no-bundler runtime
  (props:false / functions:false), browser service workers, Next.js App
  Router named-export contracts, cli-init template mirrors (fidelity owned
  by the freshness gate, not the resolver)
- vendored/generated bundles ignored deliberately (OASdoc, AsyncAPIdoc,
  service-management/vendor, .browser-tests, _pagefind) — closing the
  false-green class, not widening it
- apps/frontend rewritten onto the shared config (ESLint 10 to 9.39.5);
  tsconfig.eslint.json exists because the import resolver only resolves
  aliases for files a listed project covers and the app tsconfig excludes
  test/** (JUM-760)
- apps/jumentix-website gains its own eslint.config.mjs consuming
  baseStrict + typescriptStrict + reactNextA11yStrict — its first working
  lint ever ('next lint' was removed in Next.js 16 and nothing in CI ran it)
- lint scripts run without --ext (flat config); root lint now covers
  .ts/.tsx/.js/.mjs/.cjs (2,802 files vs 1,668 legacy .ts-only — coverage
  regression: zero; extension gaps: closed)
- tsconfig target ES2020 -> ES2022: the airbnb strict tier enforces
  prefer-object-has-own and Node 22 (root engines) supports it; resolves the
  TS2550 that blocked ~17 backend suites
- tsconfig.build.json excludes config-eslint lint fixtures from the emit
  build (deliberate violations by design, JUM-14)

Verified: bun run lint exit 0 (2,802 files, --max-warnings=0); file-count
parity with the JUM-5 baseline pasted in the epic's Project Updates.
…ss all surfaces

Activates the *Strict config-eslint profiles on root, frontend and website
consumers and remediates the measured 252,732 strict violations down to 0
errors / 0 warnings under --max-warnings=0, in per-surface waves:

- apps/backend-template, apps/service-management(+api), apps/frontend,
  apps/jumentix-website, packages/*, ci-cd, tooling, sdk-clients, bin.
- JUM-44 codemod: 309 modules converted to default exports for
  import-x/prefer-default-export (barrels kept as re-exports; 4 justified
  Next.js contract suppressions); arrow-body-style and jest/unbound-method
  enabled and remediated; import-x/no-cycle enabled at depth 1 (0 hits);
  @typescript-eslint/no-explicit-any (3,482 measured) and
  no-underscore-dangle (366 measured) documented as owner-approved OFF
  decisions in the typescript/parity profiles.
- Class-split fix: 12 package tsconfigs resolve @jumentix/* to src for
  tests while tsconfig.build.json (no paths) keeps dist builds honest,
  eliminating dual class identity between src and dist (~50 test failures).
- serverless.ts keeps module.exports (serverless framework contract) with a
  justified disable; dynamic controller resolution accepts both default and
  named exports after the codemod; jest.MockedFunction casts restored where
  bun:test cannot use jest.mocked (justified jest/prefer-jest-mocked
  disable).
- serverHarness waits on child 'close' instead of 'exit' so EADDRINUSE in
  stderr is never misclassified under parallel load; stripped type
  annotations restored in the offline persistence matrix; smoke-test source
  markers aligned with the remediated canvas module (dead
  buildRoutedEdgePathD marker now points at roundedRoutePathD).

Verified: bun ci-cd/run-lint.js exit 0 (root 2,803 files, frontend, website,
all strict, 0/0); bun run ci:gate:task exit 0 (3,988+ tests).
…he repo

Adds prettier.config.mjs (singleQuote, semi, trailingComma none,
printWidth 100; YAML keeps double quotes so the check-ci-provider cron
contract survives formatting) and .prettierignore (dependencies, build
outputs, vendored bundles, generated cli-init templates and the
release-owned CHANGELOG files), plus format / format:check scripts wired
into ci:gate.

This commit is the mechanical tail of the one-time 'prettier --write .'
run: documentation, root markdown, CI workflow/pm2/spec configuration and
generated CI artifacts. Code surfaces were formatted together with their
remediation in 7d8def4; the ESLint integration itself (Stylistic profile
without rule conflicts) landed with the config-eslint package in d095bcd.

Verified: bun run format:check exit 0; bun ci-cd/check-ci-provider.js exit 0;
CHANGELOG.md / CHANGELOG.pt-BR.md byte-identical to dev.
Replaces the lint script chain with ci-cd/run-lint.js, a fail-closed
runner: every consumer (root, frontend, website) lints with
--max-warnings=0, each run proves its glob matched files, and
ci-cd/lint-coverage-floors.json pins per-consumer file-count floors
(root 2802, frontend 178, website 179) so a config regression that
silently shrinks coverage fails the gate instead of passing on zero
files. ci:gate now chains lint && lint:frontend && lint:website &&
format:check.

ci-cd/test/run-lint.test.ts covers the runner contract (5 tests,
including a negative fixture that must fail closed); test-map.json
regenerated so the new suite is mapped (test-map:check exit 0).

Verified: bun ci-cd/run-lint.js exit 0 on all three consumers;
bun run format:check exit 0; bun run test-map:check exit 0.
Adds .agents/requirements/software/138-eslint-9-flat-config-governance.md:
the @jumentix/config-eslint package is the single governed source of lint
profiles, consumers must not re-declare rules, strict variants are the
default, and the JUM-44 owner decisions (no-explicit-any and
no-underscore-dangle OFF with measured counts) are recorded as governed
exceptions.

Coverage markers landed in the requirement and its implementation
surfaces (files=129 unique=129 mapped=129 per requirements:check);
NFR-REGISTRY, .agents/README.md, the traceability ledger (EN/PT) and the
coverage status inventory (128 -> 129) updated accordingly. Remaining
.agents edits are the Prettier pass over agent docs.

Verified: bun run requirements:check exit 0.
Adds documentation/md/ESLINT-AND-FORMATTING-GUIDE.md (+ pt-BR): how the
@jumentix/config-eslint profiles compose, which variant each consumer
runs, how to add a new consumer, the JUM-44 rule decisions, the
format-vs-lint split with Prettier, and the false-green protections of
the lint gate. Indexed from SPEC-DEVELOPMENT-DRIVEN-INDEX (EN/PT).

Companion notes shipped earlier: the consumer-facing AGENTS.md note for
apps/frontend landed with its surface in 7d8def4 and the package
READMEs (EN/PT) in d095bcd.
Regenerates packages/cli-init/templates from the remediated,
strict-clean seeds (865 files; the template tree is a generated mirror
excluded from direct lint/format, so it inherits the seeds' state) and
refreshes templates.manifest.json, keeping cli:check-template-freshness
green.

Also fixes a gate false-red the epic exposed: a templates-only change
mapped to no layer and the task gate refused it as
unsupported-change-set. The tooling layer in ci-cd/generate-test-map.js
now classifies packages/cli-init/templates/** and the manifest (the same
fix class JUM-622/JUM-680 applied to the browser harness and the
website), so template regenerations run the tooling suites — including
template-freshness — instead of being rejected. test-map.json
regenerated and formatted.

Repository-wide strict enforcement is now the default on every consumer
(root, frontend, website), the legacy .eslintrc.js/.prettierrc.js files
are gone (root in 86ffd73, frontend in 7d8def4), and the epic closes
with the lint platform, gates, governance requirement 138 and the
developer guide all in place.

Verified: bun run cli:check-template-freshness exit 0;
bun run test-map:check exit 0; bun test ci-cd/test/generate-test-map.test.ts
27/27 pass.
@cursor

cursor Bot commented Sep 27, 2026

Copy link
Copy Markdown

Bugbot couldn't run - usage limit reached

Bugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit.

A user or team admin can review and increase usage limits in the Cursor dashboard.

(requestId: serverGenReqId_09733b19-2251-450d-b556-3b8b8fdc1ea6)

This branch has not been deployed

No deployments
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