Contributing
Development Setup
Set up your development environment and learn the dev workflow.
Setup
git clone https://github.com/grovemotorco/ignition.git
cd ignition
bun installDevelopment commands
| Command | Description |
|---|---|
bun run src/cli.ts run <recipe> <target> | Run CLI from source |
bun run verify | Full quality gate: typecheck → lint → fmt:check → test |
bun run typecheck | Type-check (tsgo --noEmit) |
bun run lint | Lint with oxlint |
bun run fmt | Format with oxfmt |
bun run fmt:check | Format check (CI) |
bun run test | Run unit tests |
bun test tests/core/resource_test.ts | Run a single test file |
bun run build:executable | Build standalone binary |
Quality gate
bun run verify must pass before every commit. It runs:
bun run typecheck— type-checkoxlint --type-aware --type-check— lintoxfmt --check— format checkbun test— test suite
Commit conventions
Use conventional commits:
<type>(<scope>): <description>Types: feat, fix, chore, docs, refactor, test
Scopes: core, cli, ssh, resources, output, dashboard, inventory, recipe
Examples:
feat(resources): add user resource
fix(ssh): handle connection timeout gracefully
chore(cli): update help textDashboard development
Start two processes:
Terminal 1 — mock event server on :9090:
bun run dev:dashboardThis pushes synthetic run events with realistic timing.
Terminal 2 — Vite dev server on :5173:
bun run dev:uiOpen http://localhost:5173 — the React UI has HMR and proxies /ws and /api to the mock backend.
Building the dashboard
The dashboard UI is a React SPA embedded as a single HTML string:
bun run dashboard:buildThis compiles the React app, produces dist/index.html, and auto-embeds it into src/dashboard/assets.ts.
Building an executable
bun run build:executableProduces dist/ignition — a single-file binary.
Code style
- 2-space indentation, 100 character line width, no semicolons
- Enforced by oxfmt (
bun run fmt) and oxlint (bun run lint)