From fda2ece848d4763f0f4687a50dc3a651b97c4124 Mon Sep 17 00:00:00 2001 From: John McLear Date: Tue, 14 Apr 2026 12:59:21 +0100 Subject: [PATCH 1/3] Add showAuthorColors pad option to default authorship colors off MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds a new padOptions.showAuthorColors setting (default: true) that lets admins default authorship colors to off for new users. Users can still toggle colors on via the checkbox — their cookie preference always overrides the server default. - Settings.ts: add showAuthorColors to padOptions type and defaults - pad.ts: process showAuthorColors from padOptions, apply as default, ensure cookie preference (true or false) overrides server setting - settings.json.template + settings.json.docker: document the option - SocketIOMessage.ts: add to PadOption type Fixes #5563 Co-Authored-By: Claude Opus 4.6 (1M context) --- settings.json.docker | 1 + settings.json.template | 1 + src/node/utils/Settings.ts | 2 ++ src/static/js/pad.ts | 20 +++++++++++++++++++- src/static/js/types/SocketIOMessage.ts | 1 + 5 files changed, 24 insertions(+), 1 deletion(-) diff --git a/settings.json.docker b/settings.json.docker index a265a9235cf..3fa7495038d 100644 --- a/settings.json.docker +++ b/settings.json.docker @@ -273,6 +273,7 @@ */ "padOptions": { "noColors": "${PAD_OPTIONS_NO_COLORS:false}", + "showAuthorColors": "${PAD_OPTIONS_SHOW_AUTHOR_COLORS:true}", "showControls": "${PAD_OPTIONS_SHOW_CONTROLS:true}", "showChat": "${PAD_OPTIONS_SHOW_CHAT:true}", "showLineNumbers": "${PAD_OPTIONS_SHOW_LINE_NUMBERS:true}", diff --git a/settings.json.template b/settings.json.template index 9f0bc55a00e..0a655cd5ad1 100644 --- a/settings.json.template +++ b/settings.json.template @@ -252,6 +252,7 @@ */ "padOptions": { "noColors": false, + "showAuthorColors": true, "showControls": true, "showChat": true, "showLineNumbers": true, diff --git a/src/node/utils/Settings.ts b/src/node/utils/Settings.ts index d25c3d4e1a3..f6f758d84a8 100644 --- a/src/node/utils/Settings.ts +++ b/src/node/utils/Settings.ts @@ -192,6 +192,7 @@ export type SettingsType = { defaultPadText: string, padOptions: { noColors: boolean, + showAuthorColors: boolean, showControls: boolean, showChat: boolean, showLineNumbers: boolean, @@ -398,6 +399,7 @@ const settings: SettingsType = { */ padOptions: { noColors: false, + showAuthorColors: true, showControls: true, showChat: true, showLineNumbers: true, diff --git a/src/static/js/pad.ts b/src/static/js/pad.ts index d9cc4e902ed..812fbc4170d 100644 --- a/src/static/js/pad.ts +++ b/src/static/js/pad.ts @@ -69,6 +69,13 @@ const getParameters = [ $('#clearAuthorship').hide(); }, }, + { + name: 'showAuthorColors', + checkVal: 'false', + callback: (val) => { + settings.showAuthorColorsDisabled = true; + }, + }, { name: 'showControls', checkVal: 'true', @@ -461,7 +468,10 @@ const pad = { chat.chatAndUsers(true); // stick it to the screen $('#options-chatandusers').prop('checked', true); // set the checkbox to on } - if (padcookie.getPref('showAuthorshipColors') === false) { + const authorColorsPref = padcookie.getPref('showAuthorshipColors'); + if (authorColorsPref === true) { + pad.changeViewOption('showAuthorColors', true); + } else if (authorColorsPref === false) { pad.changeViewOption('showAuthorColors', false); } if (padcookie.getPref('showLineNumbers') === false) { @@ -555,6 +565,13 @@ const pad = { this.changeViewOption('noColors', true); } + // If showAuthorColors is set to false in padOptions, default colors off. + // The user can still toggle them on via the checkbox; the cookie will + // override this default on subsequent visits. + if (settings.showAuthorColorsDisabled === true) { + this.changeViewOption('showAuthorColors', false); + } + // RTL override is applied in postAceInit (after padeditor.init resolves) // to avoid a race where setViewOptions(initialViewOptions) overwrites it. @@ -783,6 +800,7 @@ const init = () => pad.init(); const settings = { LineNumbersDisabled: false, noColors: false, + showAuthorColorsDisabled: false, useMonospaceFontGlobal: false, globalUserName: false, globalUserColor: false, diff --git a/src/static/js/types/SocketIOMessage.ts b/src/static/js/types/SocketIOMessage.ts index f2b8cfc14fa..99622b01e8d 100644 --- a/src/static/js/types/SocketIOMessage.ts +++ b/src/static/js/types/SocketIOMessage.ts @@ -239,6 +239,7 @@ export type PadOptionsMessage = { export type PadOption = { "noColors"?: boolean, + "showAuthorColors"?: boolean, "showControls"?: boolean, "showChat"?: boolean, "showLineNumbers"?: boolean, From e46ca807f0daf5a29f6696b787289035f40c6e82 Mon Sep 17 00:00:00 2001 From: John McLear Date: Tue, 14 Apr 2026 13:02:28 +0100 Subject: [PATCH 2/3] Fix noColors checkbox sync and add Playwright tests - Fix pre-existing bug: noColors query param disabled colors but left the checkbox checked. Now the checkbox correctly reflects the state. - Add Playwright tests for: - Default checkbox state (checked) - noColors=true unchecks the checkbox - Toggling the checkbox works Co-Authored-By: Claude Opus 4.6 (1M context) --- .../memory/MEMORY.md | 2 + .../memory/feedback_fix_tests.md | 11 +++++ .../memory/feedback_test_coverage.md | 11 +++++ .claude/worktrees/agent-a242cfc4 | 1 + .claude/worktrees/agent-a3519d24 | 1 + .claude/worktrees/agent-a6000956 | 1 + .claude/worktrees/agent-a80c319f | 1 + .claude/worktrees/agent-a95c4e0a | 1 + .claude/worktrees/agent-a9ef0b92 | 1 + .claude/worktrees/agent-aa620594 | 1 + .claude/worktrees/agent-aca8794f | 1 + .claude/worktrees/agent-ad831b76 | 1 + .claude/worktrees/agent-ad983e8c | 1 + .claude/worktrees/agent-af8d6bb9 | 1 + .claude/worktrees/agent-afe6be83 | 1 + .claude/worktrees/docker-fix | 1 + .claude/worktrees/flush-fix | 1 + .claude/worktrees/import-fix | 1 + CLAUDE.md | 33 +++++++++++++++ src/static/js/pad_editor.ts | 9 ++-- .../specs/show_author_colors.spec.ts | 41 +++++++++++++++++++ 21 files changed, 117 insertions(+), 5 deletions(-) create mode 100644 .claude/projects/-home-jose-etherpad-etherpad-lite/memory/MEMORY.md create mode 100644 .claude/projects/-home-jose-etherpad-etherpad-lite/memory/feedback_fix_tests.md create mode 100644 .claude/projects/-home-jose-etherpad-etherpad-lite/memory/feedback_test_coverage.md create mode 160000 .claude/worktrees/agent-a242cfc4 create mode 160000 .claude/worktrees/agent-a3519d24 create mode 160000 .claude/worktrees/agent-a6000956 create mode 160000 .claude/worktrees/agent-a80c319f create mode 160000 .claude/worktrees/agent-a95c4e0a create mode 160000 .claude/worktrees/agent-a9ef0b92 create mode 160000 .claude/worktrees/agent-aa620594 create mode 160000 .claude/worktrees/agent-aca8794f create mode 160000 .claude/worktrees/agent-ad831b76 create mode 160000 .claude/worktrees/agent-ad983e8c create mode 160000 .claude/worktrees/agent-af8d6bb9 create mode 160000 .claude/worktrees/agent-afe6be83 create mode 160000 .claude/worktrees/docker-fix create mode 160000 .claude/worktrees/flush-fix create mode 160000 .claude/worktrees/import-fix create mode 100644 CLAUDE.md create mode 100644 src/tests/frontend-new/specs/show_author_colors.spec.ts diff --git a/.claude/projects/-home-jose-etherpad-etherpad-lite/memory/MEMORY.md b/.claude/projects/-home-jose-etherpad-etherpad-lite/memory/MEMORY.md new file mode 100644 index 00000000000..9cf8272f2f4 --- /dev/null +++ b/.claude/projects/-home-jose-etherpad-etherpad-lite/memory/MEMORY.md @@ -0,0 +1,2 @@ +- [PR test coverage requirement](feedback_test_coverage.md) — every PR must include tests, no exceptions +- [Fix failing tests, don't remove](feedback_fix_tests.md) — never delete a test to make CI green, fix the root cause diff --git a/.claude/projects/-home-jose-etherpad-etherpad-lite/memory/feedback_fix_tests.md b/.claude/projects/-home-jose-etherpad-etherpad-lite/memory/feedback_fix_tests.md new file mode 100644 index 00000000000..011af61c17b --- /dev/null +++ b/.claude/projects/-home-jose-etherpad-etherpad-lite/memory/feedback_fix_tests.md @@ -0,0 +1,11 @@ +--- +name: Fix failing tests, don't remove them +description: When a test fails, fix the underlying issue or the test — never remove the test to make CI green +type: feedback +--- + +If a test fails, don't remove it — fix it. Either fix the underlying code so the test passes, or fix the test if it's wrong. + +**Why:** User explicitly corrected this behavior. Removing tests to pass CI hides bugs. + +**How to apply:** When a test fails, diagnose the root cause. If the code is wrong, fix the code. If the test assertion is wrong, fix the assertion. Never delete a test just because it's failing. diff --git a/.claude/projects/-home-jose-etherpad-etherpad-lite/memory/feedback_test_coverage.md b/.claude/projects/-home-jose-etherpad-etherpad-lite/memory/feedback_test_coverage.md new file mode 100644 index 00000000000..06c561bbb97 --- /dev/null +++ b/.claude/projects/-home-jose-etherpad-etherpad-lite/memory/feedback_test_coverage.md @@ -0,0 +1,11 @@ +--- +name: PR test coverage requirement +description: Every PR must include test coverage — regression tests for bug fixes, unit/integration tests for features +type: feedback +--- + +Every PR must include test coverage. Bug fixes need regression tests, features need unit/integration tests. + +**Why:** User explicitly requires this as a non-negotiable part of the PR workflow. + +**How to apply:** Before submitting any PR, ensure there are corresponding tests. Backend tests in `src/tests/backend/specs/`, frontend Playwright tests in `src/tests/frontend-new/specs/`. Run tests locally before pushing. diff --git a/.claude/worktrees/agent-a242cfc4 b/.claude/worktrees/agent-a242cfc4 new file mode 160000 index 00000000000..189d3a74a85 --- /dev/null +++ b/.claude/worktrees/agent-a242cfc4 @@ -0,0 +1 @@ +Subproject commit 189d3a74a85ceb4bedcf7610ee6bae10bc279272 diff --git a/.claude/worktrees/agent-a3519d24 b/.claude/worktrees/agent-a3519d24 new file mode 160000 index 00000000000..2911c78e7c4 --- /dev/null +++ b/.claude/worktrees/agent-a3519d24 @@ -0,0 +1 @@ +Subproject commit 2911c78e7c43b693802a55ba5747c6245f2127ed diff --git a/.claude/worktrees/agent-a6000956 b/.claude/worktrees/agent-a6000956 new file mode 160000 index 00000000000..4226e25c4b7 --- /dev/null +++ b/.claude/worktrees/agent-a6000956 @@ -0,0 +1 @@ +Subproject commit 4226e25c4b7b66bebef1976748cfe22a800215b4 diff --git a/.claude/worktrees/agent-a80c319f b/.claude/worktrees/agent-a80c319f new file mode 160000 index 00000000000..3cfa36d15fd --- /dev/null +++ b/.claude/worktrees/agent-a80c319f @@ -0,0 +1 @@ +Subproject commit 3cfa36d15fdb600e49e35c1fc86305f2c038833f diff --git a/.claude/worktrees/agent-a95c4e0a b/.claude/worktrees/agent-a95c4e0a new file mode 160000 index 00000000000..2891c3979ea --- /dev/null +++ b/.claude/worktrees/agent-a95c4e0a @@ -0,0 +1 @@ +Subproject commit 2891c3979ea7959951f61391fbd8045f42e82784 diff --git a/.claude/worktrees/agent-a9ef0b92 b/.claude/worktrees/agent-a9ef0b92 new file mode 160000 index 00000000000..16a40e7d223 --- /dev/null +++ b/.claude/worktrees/agent-a9ef0b92 @@ -0,0 +1 @@ +Subproject commit 16a40e7d22392c7db9fe944c8dc6edd3640c86ee diff --git a/.claude/worktrees/agent-aa620594 b/.claude/worktrees/agent-aa620594 new file mode 160000 index 00000000000..430ebddad7e --- /dev/null +++ b/.claude/worktrees/agent-aa620594 @@ -0,0 +1 @@ +Subproject commit 430ebddad7e50f6326914d28558be36ecf228198 diff --git a/.claude/worktrees/agent-aca8794f b/.claude/worktrees/agent-aca8794f new file mode 160000 index 00000000000..4c1a05335a6 --- /dev/null +++ b/.claude/worktrees/agent-aca8794f @@ -0,0 +1 @@ +Subproject commit 4c1a05335a696f73f27081b19a96fe8bc8b0bae8 diff --git a/.claude/worktrees/agent-ad831b76 b/.claude/worktrees/agent-ad831b76 new file mode 160000 index 00000000000..df09857de71 --- /dev/null +++ b/.claude/worktrees/agent-ad831b76 @@ -0,0 +1 @@ +Subproject commit df09857de71cbed771d6eddc5be10b13087c3f72 diff --git a/.claude/worktrees/agent-ad983e8c b/.claude/worktrees/agent-ad983e8c new file mode 160000 index 00000000000..976ebb116b6 --- /dev/null +++ b/.claude/worktrees/agent-ad983e8c @@ -0,0 +1 @@ +Subproject commit 976ebb116b6ab1c98d712da37698321818d74ec5 diff --git a/.claude/worktrees/agent-af8d6bb9 b/.claude/worktrees/agent-af8d6bb9 new file mode 160000 index 00000000000..fce4d05c2f2 --- /dev/null +++ b/.claude/worktrees/agent-af8d6bb9 @@ -0,0 +1 @@ +Subproject commit fce4d05c2f20b84c7b34f70761c8ce93feff4c5b diff --git a/.claude/worktrees/agent-afe6be83 b/.claude/worktrees/agent-afe6be83 new file mode 160000 index 00000000000..98fd8254669 --- /dev/null +++ b/.claude/worktrees/agent-afe6be83 @@ -0,0 +1 @@ +Subproject commit 98fd825466931fa56645eb1e86324addf93117ac diff --git a/.claude/worktrees/docker-fix b/.claude/worktrees/docker-fix new file mode 160000 index 00000000000..115783d36a8 --- /dev/null +++ b/.claude/worktrees/docker-fix @@ -0,0 +1 @@ +Subproject commit 115783d36a8b8c5f57f1f022be0fe7f982887f6e diff --git a/.claude/worktrees/flush-fix b/.claude/worktrees/flush-fix new file mode 160000 index 00000000000..a7c0e07d8f8 --- /dev/null +++ b/.claude/worktrees/flush-fix @@ -0,0 +1 @@ +Subproject commit a7c0e07d8f83581c1e545a9ceedbeff4ac10fc15 diff --git a/.claude/worktrees/import-fix b/.claude/worktrees/import-fix new file mode 160000 index 00000000000..9195ce0a61a --- /dev/null +++ b/.claude/worktrees/import-fix @@ -0,0 +1 @@ +Subproject commit 9195ce0a61a0043766062b6553e7e95ee3b9889c diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 00000000000..d81cb6ed263 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,33 @@ +# Claude Code Guidelines for Etherpad + +## PR Requirements + +- **Every PR must include test coverage.** Bug fixes need regression tests. New features need unit/integration tests. No exceptions. +- Backend tests go in `src/tests/backend/specs/` +- Frontend (Playwright) tests go in `src/tests/frontend-new/specs/` +- Run tests locally before submitting a PR + +## Running Tests + +```bash +# Install dependencies +pnpm install + +# Type check +pnpm run ts-check + +# Backend tests +pnpm run test + +# Frontend Playwright tests (requires running server) +pnpm run test-ui +``` + +## Project Structure + +- `src/` — main application (ep_etherpad-lite package) +- `bin/` — CLI scripts +- `admin/` — admin UI +- `ui/` — frontend UI build +- Plugin packages live in `src/plugin_packages/` +- Uses pnpm workspaces (not npm) diff --git a/src/static/js/pad_editor.ts b/src/static/js/pad_editor.ts index 7feb81e30ea..113b99c9c33 100644 --- a/src/static/js/pad_editor.ts +++ b/src/static/js/pad_editor.ts @@ -172,16 +172,15 @@ const padeditor = (() => { padutils.setCheckbox($('#options-linenoscheck'), v); v = getOption('showAuthorColors', true); + // noColors overrides showAuthorColors completely + if (settings.noColors) { + v = false; + } self.ace.setProperty('showsauthorcolors', v); $('#chattext').toggleClass('authorColors', v); $('iframe[name="ace_outer"]').contents().find('#sidedivinner').toggleClass('authorColors', v); padutils.setCheckbox($('#options-colorscheck'), v); - // Override from parameters if true - if (settings.noColors !== false) { - self.ace.setProperty('showsauthorcolors', !settings.noColors); - } - self.ace.setProperty('textface', newOptions.padFontFamily || ''); }, dispose: () => { diff --git a/src/tests/frontend-new/specs/show_author_colors.spec.ts b/src/tests/frontend-new/specs/show_author_colors.spec.ts new file mode 100644 index 00000000000..fbd4cfce1b1 --- /dev/null +++ b/src/tests/frontend-new/specs/show_author_colors.spec.ts @@ -0,0 +1,41 @@ +import {expect, test} from "@playwright/test"; +import { + appendQueryParams, + clearPadContent, + getPadBody, + goToNewPad, + writeToPad, +} from "../helper/padHelper"; + +test.describe('showAuthorColors pad option', () => { + test('authorship colors checkbox is checked by default', async ({page}) => { + await goToNewPad(page); + const checkbox = page.locator('#options-colorscheck'); + await expect(checkbox).toBeChecked(); + }); + + test('noColors query param unchecks the authorship colors checkbox', async ({page}) => { + const padId = await goToNewPad(page); + await appendQueryParams(page, {noColors: 'true'}); + const checkbox = page.locator('#options-colorscheck'); + await expect(checkbox).not.toBeChecked(); + }); + + test('toggling authorship colors checkbox works', async ({page}) => { + await goToNewPad(page); + const padBody = await getPadBody(page); + + await clearPadContent(page); + await writeToPad(page, 'Hello colors'); + await expect(padBody.locator('div span').first()).toHaveAttribute('class', /author-/); + + // Uncheck colors + const checkbox = page.locator('#options-colorscheck'); + await checkbox.click(); + await expect(checkbox).not.toBeChecked(); + + // Re-check colors + await checkbox.click(); + await expect(checkbox).toBeChecked(); + }); +}); From 5e0688eff3b49b0b2ec49e561bedcd1513698d19 Mon Sep 17 00:00:00 2001 From: John McLear Date: Tue, 14 Apr 2026 13:03:26 +0100 Subject: [PATCH 3/3] Remove accidentally committed .claude/ worktrees Co-Authored-By: Claude Opus 4.6 (1M context) --- .../memory/MEMORY.md | 2 -- .../memory/feedback_fix_tests.md | 11 ------- .../memory/feedback_test_coverage.md | 11 ------- .claude/worktrees/agent-a242cfc4 | 1 - .claude/worktrees/agent-a3519d24 | 1 - .claude/worktrees/agent-a6000956 | 1 - .claude/worktrees/agent-a80c319f | 1 - .claude/worktrees/agent-a95c4e0a | 1 - .claude/worktrees/agent-a9ef0b92 | 1 - .claude/worktrees/agent-aa620594 | 1 - .claude/worktrees/agent-aca8794f | 1 - .claude/worktrees/agent-ad831b76 | 1 - .claude/worktrees/agent-ad983e8c | 1 - .claude/worktrees/agent-af8d6bb9 | 1 - .claude/worktrees/agent-afe6be83 | 1 - .claude/worktrees/docker-fix | 1 - .claude/worktrees/flush-fix | 1 - .claude/worktrees/import-fix | 1 - .gitignore | 1 + CLAUDE.md | 33 ------------------- 20 files changed, 1 insertion(+), 72 deletions(-) delete mode 100644 .claude/projects/-home-jose-etherpad-etherpad-lite/memory/MEMORY.md delete mode 100644 .claude/projects/-home-jose-etherpad-etherpad-lite/memory/feedback_fix_tests.md delete mode 100644 .claude/projects/-home-jose-etherpad-etherpad-lite/memory/feedback_test_coverage.md delete mode 160000 .claude/worktrees/agent-a242cfc4 delete mode 160000 .claude/worktrees/agent-a3519d24 delete mode 160000 .claude/worktrees/agent-a6000956 delete mode 160000 .claude/worktrees/agent-a80c319f delete mode 160000 .claude/worktrees/agent-a95c4e0a delete mode 160000 .claude/worktrees/agent-a9ef0b92 delete mode 160000 .claude/worktrees/agent-aa620594 delete mode 160000 .claude/worktrees/agent-aca8794f delete mode 160000 .claude/worktrees/agent-ad831b76 delete mode 160000 .claude/worktrees/agent-ad983e8c delete mode 160000 .claude/worktrees/agent-af8d6bb9 delete mode 160000 .claude/worktrees/agent-afe6be83 delete mode 160000 .claude/worktrees/docker-fix delete mode 160000 .claude/worktrees/flush-fix delete mode 160000 .claude/worktrees/import-fix delete mode 100644 CLAUDE.md diff --git a/.claude/projects/-home-jose-etherpad-etherpad-lite/memory/MEMORY.md b/.claude/projects/-home-jose-etherpad-etherpad-lite/memory/MEMORY.md deleted file mode 100644 index 9cf8272f2f4..00000000000 --- a/.claude/projects/-home-jose-etherpad-etherpad-lite/memory/MEMORY.md +++ /dev/null @@ -1,2 +0,0 @@ -- [PR test coverage requirement](feedback_test_coverage.md) — every PR must include tests, no exceptions -- [Fix failing tests, don't remove](feedback_fix_tests.md) — never delete a test to make CI green, fix the root cause diff --git a/.claude/projects/-home-jose-etherpad-etherpad-lite/memory/feedback_fix_tests.md b/.claude/projects/-home-jose-etherpad-etherpad-lite/memory/feedback_fix_tests.md deleted file mode 100644 index 011af61c17b..00000000000 --- a/.claude/projects/-home-jose-etherpad-etherpad-lite/memory/feedback_fix_tests.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -name: Fix failing tests, don't remove them -description: When a test fails, fix the underlying issue or the test — never remove the test to make CI green -type: feedback ---- - -If a test fails, don't remove it — fix it. Either fix the underlying code so the test passes, or fix the test if it's wrong. - -**Why:** User explicitly corrected this behavior. Removing tests to pass CI hides bugs. - -**How to apply:** When a test fails, diagnose the root cause. If the code is wrong, fix the code. If the test assertion is wrong, fix the assertion. Never delete a test just because it's failing. diff --git a/.claude/projects/-home-jose-etherpad-etherpad-lite/memory/feedback_test_coverage.md b/.claude/projects/-home-jose-etherpad-etherpad-lite/memory/feedback_test_coverage.md deleted file mode 100644 index 06c561bbb97..00000000000 --- a/.claude/projects/-home-jose-etherpad-etherpad-lite/memory/feedback_test_coverage.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -name: PR test coverage requirement -description: Every PR must include test coverage — regression tests for bug fixes, unit/integration tests for features -type: feedback ---- - -Every PR must include test coverage. Bug fixes need regression tests, features need unit/integration tests. - -**Why:** User explicitly requires this as a non-negotiable part of the PR workflow. - -**How to apply:** Before submitting any PR, ensure there are corresponding tests. Backend tests in `src/tests/backend/specs/`, frontend Playwright tests in `src/tests/frontend-new/specs/`. Run tests locally before pushing. diff --git a/.claude/worktrees/agent-a242cfc4 b/.claude/worktrees/agent-a242cfc4 deleted file mode 160000 index 189d3a74a85..00000000000 --- a/.claude/worktrees/agent-a242cfc4 +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 189d3a74a85ceb4bedcf7610ee6bae10bc279272 diff --git a/.claude/worktrees/agent-a3519d24 b/.claude/worktrees/agent-a3519d24 deleted file mode 160000 index 2911c78e7c4..00000000000 --- a/.claude/worktrees/agent-a3519d24 +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 2911c78e7c43b693802a55ba5747c6245f2127ed diff --git a/.claude/worktrees/agent-a6000956 b/.claude/worktrees/agent-a6000956 deleted file mode 160000 index 4226e25c4b7..00000000000 --- a/.claude/worktrees/agent-a6000956 +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 4226e25c4b7b66bebef1976748cfe22a800215b4 diff --git a/.claude/worktrees/agent-a80c319f b/.claude/worktrees/agent-a80c319f deleted file mode 160000 index 3cfa36d15fd..00000000000 --- a/.claude/worktrees/agent-a80c319f +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 3cfa36d15fdb600e49e35c1fc86305f2c038833f diff --git a/.claude/worktrees/agent-a95c4e0a b/.claude/worktrees/agent-a95c4e0a deleted file mode 160000 index 2891c3979ea..00000000000 --- a/.claude/worktrees/agent-a95c4e0a +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 2891c3979ea7959951f61391fbd8045f42e82784 diff --git a/.claude/worktrees/agent-a9ef0b92 b/.claude/worktrees/agent-a9ef0b92 deleted file mode 160000 index 16a40e7d223..00000000000 --- a/.claude/worktrees/agent-a9ef0b92 +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 16a40e7d22392c7db9fe944c8dc6edd3640c86ee diff --git a/.claude/worktrees/agent-aa620594 b/.claude/worktrees/agent-aa620594 deleted file mode 160000 index 430ebddad7e..00000000000 --- a/.claude/worktrees/agent-aa620594 +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 430ebddad7e50f6326914d28558be36ecf228198 diff --git a/.claude/worktrees/agent-aca8794f b/.claude/worktrees/agent-aca8794f deleted file mode 160000 index 4c1a05335a6..00000000000 --- a/.claude/worktrees/agent-aca8794f +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 4c1a05335a696f73f27081b19a96fe8bc8b0bae8 diff --git a/.claude/worktrees/agent-ad831b76 b/.claude/worktrees/agent-ad831b76 deleted file mode 160000 index df09857de71..00000000000 --- a/.claude/worktrees/agent-ad831b76 +++ /dev/null @@ -1 +0,0 @@ -Subproject commit df09857de71cbed771d6eddc5be10b13087c3f72 diff --git a/.claude/worktrees/agent-ad983e8c b/.claude/worktrees/agent-ad983e8c deleted file mode 160000 index 976ebb116b6..00000000000 --- a/.claude/worktrees/agent-ad983e8c +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 976ebb116b6ab1c98d712da37698321818d74ec5 diff --git a/.claude/worktrees/agent-af8d6bb9 b/.claude/worktrees/agent-af8d6bb9 deleted file mode 160000 index fce4d05c2f2..00000000000 --- a/.claude/worktrees/agent-af8d6bb9 +++ /dev/null @@ -1 +0,0 @@ -Subproject commit fce4d05c2f20b84c7b34f70761c8ce93feff4c5b diff --git a/.claude/worktrees/agent-afe6be83 b/.claude/worktrees/agent-afe6be83 deleted file mode 160000 index 98fd8254669..00000000000 --- a/.claude/worktrees/agent-afe6be83 +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 98fd825466931fa56645eb1e86324addf93117ac diff --git a/.claude/worktrees/docker-fix b/.claude/worktrees/docker-fix deleted file mode 160000 index 115783d36a8..00000000000 --- a/.claude/worktrees/docker-fix +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 115783d36a8b8c5f57f1f022be0fe7f982887f6e diff --git a/.claude/worktrees/flush-fix b/.claude/worktrees/flush-fix deleted file mode 160000 index a7c0e07d8f8..00000000000 --- a/.claude/worktrees/flush-fix +++ /dev/null @@ -1 +0,0 @@ -Subproject commit a7c0e07d8f83581c1e545a9ceedbeff4ac10fc15 diff --git a/.claude/worktrees/import-fix b/.claude/worktrees/import-fix deleted file mode 160000 index 9195ce0a61a..00000000000 --- a/.claude/worktrees/import-fix +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 9195ce0a61a0043766062b6553e7e95ee3b9889c diff --git a/.gitignore b/.gitignore index 71584e76bb5..fbd45ade780 100644 --- a/.gitignore +++ b/.gitignore @@ -28,3 +28,4 @@ plugin_packages playwright-report state.json /src/static/oidc +.claude/ diff --git a/CLAUDE.md b/CLAUDE.md deleted file mode 100644 index d81cb6ed263..00000000000 --- a/CLAUDE.md +++ /dev/null @@ -1,33 +0,0 @@ -# Claude Code Guidelines for Etherpad - -## PR Requirements - -- **Every PR must include test coverage.** Bug fixes need regression tests. New features need unit/integration tests. No exceptions. -- Backend tests go in `src/tests/backend/specs/` -- Frontend (Playwright) tests go in `src/tests/frontend-new/specs/` -- Run tests locally before submitting a PR - -## Running Tests - -```bash -# Install dependencies -pnpm install - -# Type check -pnpm run ts-check - -# Backend tests -pnpm run test - -# Frontend Playwright tests (requires running server) -pnpm run test-ui -``` - -## Project Structure - -- `src/` — main application (ep_etherpad-lite package) -- `bin/` — CLI scripts -- `admin/` — admin UI -- `ui/` — frontend UI build -- Plugin packages live in `src/plugin_packages/` -- Uses pnpm workspaces (not npm)