Upgrade kolibri-format to 3.0.1 and migrate ESLint to flat config
Les mainteneurs répondent en général sous 1 jour
@LianaHarris360 y travaille déjà.
Depuis le 22/10/2026.
Évaluation
Cette issue n'a pas encore été évaluée.
Description
❌ This issue is not open for contribution. Visit Contributing guidelines to learn about the contributing process and how to find suitable issues.
Overview
kolibri-format 3.0.1 runs ESLint 9 and uses flat configuration. Flat configuration is the eslint.config.mjs format that replaced .eslintrc. Studio runs kolibri-format 1.0.1 and loads kolibri-format/.eslintrc, a file the package stopped shipping in version 2.4.0.
This issue moves Studio onto the new toolchain and keeps CI green. The new rules that version 3.0.1 adds stay off.
Complexity: High
Target branch: unstable
Context
What changed between the two versions:
| Item | 1.0.1 | 3.0.1 |
|---|---|---|
| ESLint | ^8.57 with .eslintrc |
^9.39 with flat configuration |
| Configuration file | .eslintrc.js |
eslint.config.mjs |
| Import plugin | eslint-plugin-import |
eslint-plugin-import-x, new rule names |
eslint-plugin-kolibri |
0.18.0 | 1.3.0 |
| Added plugins | none | jsdoc, vuejs-accessibility, n, small-import |
| Added dependency | none | kolibri-css-variables |
| Node engine | 18.x | 20.19.0 or later |
Version 1.3.0 of eslint-plugin-kolibri removes vue-no-unused-methods. It adds tests-no-hardcoded-strings, tests-no-stubs, no-undefined-translator-keys, vue-no-root-v-if-with-style-v-bind, and two theming rules.
Measured results across 943 frontend files. Autofix is the set of fixes that --write applies without help. Autofix rewrites 230 files. 2425 problems will remain in 364 files:
| Plugin | Problems | Autofix clears | Files |
|---|---|---|---|
| jsdoc | 1890 | 938 | 177 |
| kolibri | 833 | 203 | 135 |
| vue | 422 | 0 | 103 |
| jest | 170 | 155 | 19 |
| vuejs-accessibility | 51 | 0 | 28 |
| import-x, n, core | 59 | 14 | 44 |
Import resolution depends on the resolver settings. Measured counts for import-x/no-unresolved and import-x/order:
- No webpack resolver: 1284 and 530.
- Webpack resolver only: 518 and 0.
- Webpack resolver and node resolver: 0 and 0.
The linting job in CI runs pre-commit run --all-files. The frontend-lint hook calls pnpm run lint-frontend:format, which writes fixes to disk and fails when it changes a file. A commit that changes the configuration and leaves 230 files unformatted will fail that job on unstable.
Prettier 3.9 on its own wants to change 345 files, because it removes blank lines inside single file component blocks. The rule kolibri/vue-component-block-padding puts those lines back in the same pass. The result is 230 files, not 345.
The Change
eslint.config.mjsmust carry everything that.eslintrc.jscarries today: the six globals, the webpack resolver, the node resolver that pnpm needs, and the three rule overrides forkolibri/vue-component-class-name-casing,vue/no-v-text-v-html-on-component, andvue/attribute-hyphenation.package.jsonmust keepeslint-import-resolver-webpack, because the new configuration calls it, and thestylelint-config-*packages, because stylelint resolvesextendsagainst the repository root.- The lint dependencies in
package.jsonmust stop conflicting with ESLint 9.eslint ^8.57.0,eslint-plugin-kolibri 0.18.0,eslint-plugin-import, andeslint-plugin-jest ^29each need a bump or a removal. - Thirteen disable comments name
import/*rules. They must nameimport-x/*instead. - Nine comments name
kolibri/vue-no-unused-methods. Seven of them also namevue/no-unused-properties, which stays, so those seven need an edit and not a delete. The pair inshared/views/Tabs.vueat lines 30 and 107 can go. - Those nine comments must change in the same commit as the version bump. The rule is live in 0.18.0, so the comments still do work until the bump lands.
- Two files use
/* eslint-env jest */. Flat configuration ignores it and ESLint 10 fails on it. Both must use/* global jest */. - The scripts
lint-frontend:watchandlint-frontend:watch:formatpass--monitor. No version of the command line tool accepts that flag, so both scripts should be removed. - The 45
import-x,n, and core problems that autofix leaves behind must be fixed by hand. They are the evidence that the resolver settings work. - Every rule whose output autofix cannot clear must be turned off, each with a comment that names the follow-up issue: all
jsdocrules,kolibri/tests-no-hardcoded-strings,vue/no-restricted-static-attribute,vue/no-bare-strings-in-template, thevuejs-accessibilityrules, the two theming rules, and thejestrules that still report after autofix. .github/dependabot.ymlmust excludekolibri-globandkolibri-css-variablesfrom cooldown.- The formatting rewrite must land in the same pull request as the configuration change. It must be a commit of its own, and that commit must go in
.git-blame-ignore-revs.
Check these two things before writing any code:
- Make sure that pnpm links the Kolibri Design System into
kolibri-css-variables. That package declareskolibri-design-systemas an optional peer dependency and reads theme names from it. The Kolibri Design System is not in the hoistednode_modules/.pnpm/node_modules/. If the link is missing, each theming rule reportsThis rule cannot check theme namesonce per file and finds nothing. If the link is missing, addkolibri-css-variablesas a direct development dependency. - Read the autofix output for the four files that raise
ESLintCircularFixesWarning. Two fixers disagree in each one. The files areshared/composables/useChannelVersionHistory.js,shared/composables/useSpecialPermissions.js,shared/views/SidePanelModal/index.vue, andshared/vuex/draggablePlugin/module/getters.js.
Out of Scope
- The two theming rules.
kolibri/tests-no-hardcoded-stringsat 606 problems,vue/no-restricted-static-attributeat 261,vue/no-bare-strings-in-templateat 161,vuejs-accessibilityat 51, and thejsdocrules. Autofix forjsdoc/require-paraminserts@paramstubs. Those stubs raisejsdoc/require-param-descriptionfrom 359 to 551. Leave thejsdocblock off until enabled it rule by rule.kolibri/vue-no-rtl-breaking-inline-styles, which kolibri-format does not enable.- Changes to how the application behaves. If a rule cannot be satisfied by autofix or a small edit, turn it off and record it.
Acceptance Criteria
General
-
package.jsonlistskolibri-formatat3.0.1. -
.eslintrc.jsis gone andeslint.config.mjsholds every setting it carried. -
pnpm installruns under pnpm, andkolibri-css-variablesresolveskolibri-design-system. - The two theming rules report real violations when switched on by hand, and not
This rule cannot check theme names. -
import-x/no-unresolvedandimport-x/ordereach report 0 across the frontend. - No lint dependency in
package.jsonconflicts with ESLint 9. -
eslint-import-resolver-webpackand thestylelint-config-*packages are still listed. - No
/* eslint-env */comment is left in the frontend. - No disable comment names an
import/*rule orkolibri/vue-no-unused-methods. - The seven comments that also name
vue/no-unused-propertiesstill name it. - Every rule turned off in
eslint.config.mjscarries a comment that names the follow-up issue. - The formatting rewrite is a separate commit and its hash is in
.git-blame-ignore-revs. -
.github/dependabot.ymlexcludeskolibri-globandkolibri-css-variablesfrom cooldown. -
package.jsonno longer containslint-frontend:watchorlint-frontend:watch:format.
Testing
-
pre-commit run --all-filespasses from a clean tree. - A second
pre-commit run --all-fileschanges no file. -
pnpm testpasses. -
pnpm run buildsucceeds. -
ESLintCircularFixesWarningno longer appears, and the four files it named are correct.
Testing
pnpm install
pnpm run lint-frontend
pre-commit run --all-files
pnpm test
pnpm run build
Run pnpm install with pnpm and not with npm. The link between kolibri-css-variables and the Kolibri Design System is what the install is checking.
To confirm that link, turn the two theming rules on for one run. They must report about 155 and 58 problems. If there is a cannot check theme names error per file means the link is missing.
References
.github/workflows/pre-commit.ymlruns the lint job across all files..pre-commit-config.yamlholds thefrontend-linthook that writes fixes..git-blame-ignore-revsalready lists two formatting commits.- CI runs Node 20.x, which meets the new engine requirement. Local machines on Node 18 need an upgrade.
AI usage
I ran the kolibri-format 3.0.1 toolchain against Studio's frontend from a scratch install to produce the counts in this issue, with the repo working tree untouched. I used Claude Code to draft the issue from those results. I checked its claims about the CI lint job, the nine vue-no-unused-methods comments, and the resolver counts against the repository myself.
- Langage dominant
- Python
- Étoiles
- 213
- Forks
- 314
- Merge moyen
- 2 j 20 h
- PR mergées (30 j)
- 65
Préparer son environnement
- Fournit un Dockerfile ou un fichier Docker Compose
- Aucun modèle de pull request
- Lire le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de learningequality/studio
-
Set unpublishable: true on PublishedChange by construction to simplify handleMaxRevs predicateOuverteDEV: frontend P3 - low
Difficulté 2/5 1-3 heures Accessibilité débutants 74/100
learningequality/studio#5868 ·
Les mainteneurs répondent en général sous 1 jour
-
TAG: tech update / debt
Difficulté 2/5 1-3 heures Accessibilité débutants 62/100
learningequality/studio#2245 ·
Les mainteneurs répondent en général sous 1 jour
-
bug DEV: frontend
Difficulté 2/5 1-3 heures Accessibilité débutants 25/100
learningequality/studio#6331 ·
Les mainteneurs répondent en général sous 1 jour
-
Turn on the KDS theming lint rules and move theme values out of inline stylesPeut-être pris @LianaHarris360 l’a pris il y a 2 jours. OuverteDEV: frontend P1 - important
learningequality/studio#6329 · 1 personne assignée ·
Les mainteneurs répondent en général sous 1 jour
-
bug DEV: frontend P0 - critical
Difficulté 4/5 3-5 jours Accessibilité débutants 25/100
learningequality/studio#6327 · 1 commentaire · 1 réaction ·
Les mainteneurs répondent en général sous 1 jour
Toutes les issues de learningequality/studio
Issues similaires
-
Project submission:Ouverte
Difficulté 1/5 Moins d'une heure Accessibilité débutants 72/100
slavakurilyak/awesome-ai-agents#845 ·
Les mainteneurs répondent en général sous 1 jour
-
tests: pin that the atomic writers in utils/paths.py stage the temporary file in the target's directoryPeut-être pris Une pull request liée à cette issue est ouverte ou déjà fusionnée. Ouvertedifficulty:2 enhancement good first issue
Difficulté 1/5 1-3 heures Accessibilité débutants 92/100
MakazhanAlpamys/Soup#2178 ·
Les mainteneurs répondent en général sous 1 jour
-
[BUG] dcg.waggr permutation p-values are folded twice, so near-zero scores get the smallest p-valuesOuverte
Difficulté 2/5 1-3 heures Accessibilité débutants 75/100
scverse/rapids-singlecell#854 ·
Les mainteneurs répondent en général sous 1 jour
-
Slang input: int8_t4_packed and uint8_t4_packed are copied into CrossGLPeut-être pris @ninglinLiu l’a pris aujourd’hui. Ouvertearea:frontend backend:slang bug direction:input
Difficulté 2/5 1-3 heures Accessibilité débutants 70/100
Les mainteneurs répondent en général sous 1 jour
-
random_elements(unique=True) on an OrderedDict: ZeroDivisionError once only zero weights remain, AssertionError with use_weighting=FalsePeut-être pris Une pull request liée à cette issue est ouverte ou déjà fusionnée. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 85/100
Les mainteneurs répondent en général sous 13 jours