Contributing

August 10, 2026 · View on GitHub

Issues and pull requests are welcome. based is young and opinionated, so a quick issue describing what you want to change is usually worth more than a surprise PR. But I'll take those too!

Start with docs/development.md for setup and dev loops.

Ground rules

bun run typecheck
bun test

Both must pass. Integration tests self-skip without a SQL Server — that's expected and fine.

Match the surrounding code. This codebase has a consistent house style: comments explain why, not what, and non-obvious workarounds carry the diagnosis that justifies them. Several files (shell-tauri/bundle-core.ts especially) are load-bearing comment as much as code — read before editing.

UI conventions are in CLAUDE.md: no uppercased labels, and any icon-only control uses the shared IconButton so the whole box is the hit target rather than the glyph.

Spec-driven development

specs/based/spec.md is authoritative. Every requirement has an ID (BASED-*), an Applies to, a Test category, and acceptance criteria.

CategoryVerified by
unitA real executable test
integrationA real executable test, possibly needing a live database
e2e / manualAn implemented feature plus a documented verification procedure

If you change specified behavior, update the spec in the same change. If you add behavior worth depending on, add a requirement for it.

Tests link back with a trace comment:

// Traces: BASED-GRID-SORT

Never commit a stub as coverage. throw new Error("not implemented"), an empty body, or expect(thing).toBeDefined() are not tests. The cure for a requirement that's awkward to unit-test is to classify it e2e/manual and write the procedure down — not to leave a failing placeholder that looks like a test in the report.

Don't restructure working code purely to make it unit-testable. If extracting a pure module improves the design, do it; if it's artificial, leave the logic where it is and verify it as manual.

Commits and PRs

Reference the requirement ID in the commit or PR body when one applies. Keep the working tree typechecking at every commit — scripts/release.ps1 refuses to cut a release otherwise.