Contributing
Conventions, branches, and the checks your PR needs to pass.
Contributions are welcome. A little house style keeps the codebase consistent.
Conventions
- ESM everywhere. The project is
"type": "module"; local imports use.jsextensions even in TypeScript source (import env from "./utils/env.js"). - Strict TypeScript.
noUnusedLocals,noUnusedParameters,noImplicitReturns, andnoUncheckedIndexedAccessare all on. - Use the logger. Import
loggerfromsrc/utils/logger.tsand pick the right sub-logger (logger.commands.*,logger.database.*, etc.) — never rawconsole.log. - Max line length 120 (enforced by ESLint).
- Bun only — no npm, yarn, or pnpm.
Adding a slash command
- Create a file in
apps/discord/src/commands/exportingslashCommand(aSlashCommandBuilder) andexecute(client, interaction). - Add a
caseto the switch inapps/discord/src/events/interactionCreate.ts. - Register it where commands are pushed to Discord in
apps/discord/src/events/ready.ts.
Branches
| Branch | Role |
|---|---|
main | Production |
dev | Development integration |
FLUFF-{n}-... | Feature branches |
Before you open a PR
Run the same checks CI does:
bun run lint:check
bun run typecheck
bun run testGreen across the board? Open the PR against dev (or main for hotfixes) and
describe the change. Thanks for helping FluffBoost spread a little more
paw-sitivity. 🐾