Contributing
The short version lives in CONTRIBUTING.md; this page adds the maintainer-level context.
Dev setup
Section titled “Dev setup”npm installcp .env.example .env # tokens optional for most worknpm run dev # bot (tsx watch)npm run dev:dashboard # optional: dashboard with HMREverything CI runs:
npm run lint && npm run typecheck && npm test && npm run buildTesting philosophy
Section titled “Testing philosophy”- Pure logic gets real tests.
splitter,queue,access-control,errorsand the DB repos are fully unit-tested without any network. - Edges get interfaces. The Agent SDK hides behind
ClaudeEngine; Discord objects are only touched in thin handler/delivery code. If you find yourself wanting to mock discord.js deeply, move the logic into a pure module instead. - Error patterns need fixtures. Anything added to
claude/errors.tsmust come with a fixture string intests/errors.test.tsmirroring real CLI output.
Changes to runner.ts can’t be covered by unit tests — describe your manual
smoke test in the PR (mention → thread → follow-up → resume works).
Issue triage & labels
Section titled “Issue triage & labels”good first issue— scoped, with pointers into the code. Add these generously when triaging; they’re the project’s front door.help wanted— bigger but self-contained.security— see SECURITY.md; never discuss exploits in public issues.
Ideas looking for owners
Section titled “Ideas looking for owners”- Slash-command localization
- Forum-channel support (post = conversation)
- Idle-session pruning job (rows + workspace dirs +
~/.claudesessions) - A middle capability tier: file tools without
Bash - Per-user rate budgets
- Message-context menu (“Ask Claude about this message”)
Open a discussion before starting anything architectural.