Thanks for helping improve ep_ai_chat — a plugin for Etherpad. LLM/Agent contributions are explicitly welcome, provided they follow the rules below.
For shared rules that apply to all Etherpad code (linear commits, deprecation policy, feature flags, stability guarantees), please read ether/etherpad's CONTRIBUTING.md. This document only covers what's specific to plugin work.
- Target branch: PRs go to
mainon this repo. Plugin repos do not use git-flow'sdevelopbranch. - Linear commits, no merge commits. Rebase if needed.
- Every bug fix must include a regression test in the same commit.
- Internationalization (i18n): every user-facing string lives in
locales/<lang>.jsonand is referenced viadata-l10n-idin templates orhtml10n.get(key)in code. No hardcoded English in markup. - Accessibility (a11y): no nested interactive elements (no
<button>inside<a>); every interactive control has an accessible name; keyboard focus order matches visual order. Note that on icon-only controls you should rely on Etherpad's html10n to populatearia-labelfrom thedata-l10n-idtranslation — adding a hardcoded Englisharia-labelblocks that and leaves the control untranslated.
ep_ai_chat is a plugin, so you develop it inside a checkout of ether/etherpad.
# Once: clone etherpad alongside this repo
git clone https://github.com/ether/etherpad.git
cd etherpad
pnpm install
# Install ep_ai_chat from your local clone
pnpm run plugins i --path ../ep_ai_chat
# Start the dev server (port 9001)
pnpm --filter ep_etherpad-lite run devEdits in ../ep_ai_chat/ are picked up after a server restart.
Tests live inside this repo and are executed by Etherpad's test harness:
- Backend (Mocha):
static/tests/backend/specs/ - Playwright (frontend E2E):
static/tests/frontend-new/specs/
Run them from the etherpad checkout:
# Backend (no separate server needed, harness boots one)
pnpm --filter ep_etherpad-lite run test
# Playwright (requires `pnpm run dev` in another terminal)
pnpm --filter ep_etherpad-lite run test-uiLint locally before pushing:
pnpm run lint- JS/CSS/HTML: 2 spaces, no tabs.
pnpm run lintmust pass (configured viaeslint-config-etherpad).- Avoid breaking changes to public hooks, the line-attribute storage shape, or HTML export output. The backend export spec enforces a stable shape.
Please include:
- Etherpad version, ep_ai_chat version, browser + OS
- Steps to reproduce
- What you expected, what actually happened
- Server log excerpt (set
"loglevel": "DEBUG"insettings.jsonfor verbose output)
If you are an LLM/agent contributor, also read AGENTS.md — it documents the file layout, helper usage, and standing rules for autonomous edits.