Contributing
Thank you for contributing to skeeditor! This guide covers everything you need to know before submitting a pull request.
Beans workflow
All work is tracked with Beans. Before writing any code:
- Search for a relevant bean (
@beans /search <keyword>) or create a new one. - Set it to
in-progress. - Create or check out the issue branch (see Branch naming).
- Maintain a
## Todochecklist in the bean body. Update it after each step. - When done, add
## Summary of Changes, set status tocompleted, and commit.
Branch naming
<type>/<bean-id>-<short-slug>Examples:
feat/1234-add-search
fix/987-crash-on-init
test/456-mock-xrpc
docs/lydm-vitepress-docsTypes: feat, fix, test, refactor, docs, chore, build, ci.
TDD workflow (required)
All changes must follow Red-Green-Refactor:
- RED — Write a failing test first. Confirm it fails for the expected reason. Commit:
test: add failing test for <feature>. - GREEN — Write the minimum code to make the test pass. Confirm no regressions. Commit:
feat: implement <feature>. - REFACTOR — Clean up while keeping tests green. Commit:
refactor: <description>.
Never submit a PR without tests covering the changed behaviour. Bug fixes must include a test that would have caught the bug.
Commit style
<type>(<scope>): <description>
[optional body]
[optional footer — e.g., Closes #<bean-id>]Types: feat, fix, test, refactor, docs, chore, build, ci.
Scopes: api, content, background, popup, options, build, manifest, auth, facets.
Code style
- TypeScript strict mode.
noImplicitAny,strictNullChecks,strictFunctionTypesmust all pass. Noanywithout an explicit// eslint-disable-next-linecomment. - Named exports only. No default exports.
interfacefor object shapes. Usetypefor unions, intersections, and mapped types.- Explicit return types on all exported functions and all
asyncfunctions. - Explicit
publicmodifiers on exported class members and constructors. @srcalias for all intra-repo imports (not relative../../../).
Formatter: oxfmt with arrowParens: 'avoid' (single-parameter arrow functions omit parentheses), printWidth: 120, singleQuote: true.
pnpm format # auto-format
pnpm format:check # check without writing
pnpm lint # ESLint + oxlint
pnpm lint:fix # fix auto-fixable issues
pnpm typecheck # tsc --noEmitAll three must pass before pushing.
PR requirements
- Reference the bean ID in the PR description.
- All unit and integration tests must pass (
pnpm test). pnpm lintandpnpm typecheckmust pass without errors.- E2E tests run on-demand for PRs and are always required on merge to
main. - Squash-merge to
main. The squash commit message must be a valid conventional commit. - Coverage must not regress below threshold (see Testing → Coverage targets).
CI pipeline
Every push and every PR runs:
- Lint + type-check
- Unit tests (Vitest)
- Integration tests (Vitest + MSW)
- Build all browser targets
- E2E tests (Playwright — Chrome + Firefox)
- Safari build verification (xcrun converter, macOS runner only)
Safari E2E is manual (Xcode simulator); CI only verifies the converter succeeds.
Setting up the environment
See Getting Started for prerequisites, clone instructions, and how to load the extension in your browser for development.