Contributing to Atomic
September 12, 2026 · View on GitHub
Thanks for your interest in contributing to Atomic. This guide explains how to prepare a local checkout, make changes, and submit them for review.
Getting started
-
Fork and clone the repository.
-
Install dependencies with npm:
npm ci --ignore-scriptsThe committed
.npmrcapplies a three-day minimum release age to anything you add withnpm install, and pins exact versions. -
Read
DEV_SETUP.mdfor the full development setup, local CLI workflow, testing notes, and repository layout.
Development guidelines
- Use npm for installs, builds, checks, and tests. Bun compiles the release binaries and runs
scripts/*.ts. Do not use yarn or pnpm, and do not runbun install— see the Tech Stack table inAGENTS.mdfor the full split. - Keep changes focused and small enough to review.
- Follow the existing TypeScript style and package conventions.
- Add or update tests when changing behavior.
- Do not add build output, generated artifacts, or unrelated formatting changes.
Claiming an issue
For every external contribution, first open a proposal issue for a new idea or discuss an existing issue with your intended approach. Wait for explicit maintainer approval of the proposed scope before implementing it and opening a pull request. This applies to all changes, including small fixes and documentation-only changes, and to draft pull requests.
Opening an issue, expressing interest, silence, or assignment alone does not constitute scope approval. A maintainer will respond as soon as possible. An expression of interest alone does not reserve an issue.
Assignments are normally held for seven days. Post a progress update if you need more time. Maintainers may release an assignment when there has been no activity.
Avoid competing pull requests for assigned issues. Coordinate with the assignee and a maintainer first; uncoordinated duplicate pull requests may be closed.
Assignment reserves the opportunity to work on an issue but does not guarantee merge. Maintainers are exempt from this issue-first approval process and may work on issues and open pull requests without being assigned.
Testing and checks
Before opening a pull request, run the most relevant checks for your change:
npm run check
npm run test:unit
For broader changes, use:
npm run test:all
Per-test timeouts
Every suite runs with a shared 30000 ms per-test budget, declared once as TEST_TIMEOUT_MS in the root vitest.config.ts and applied to all three projects. That single value is the whole policy:
- Do not restate the budget in a package script, in
bunfig.toml(Bun ignores[test] timeout), or only in the CI workflow (CI and local runs would drift apart), and do not make it platform-specific. - Pass an explicit third-argument timeout only when a test is structurally heavy — it reloads the full builtin package graph, spawns a real CLI child, runs
tsc, or installs a built package. Otherwise rely on the shared default; never restate it. - CI scores every test against its effective timeout on every attempt, including a failed one that a bounded retry later rescued, and fails the step at 70 % of budget. The full duration table is uploaded as a
.ci-diagnostics/artifact. If your test trips that gate, make it faster rather than raising the shared default. - That scoring reads vitest's JSON reporter, which the CI wrapper requests alongside the human one so the step log stays readable. A run that executes tests without producing durations fails the step instead of reporting no slow tests.
Tests run in parallel
vitest runs test files concurrently and this repository sets no pool or worker limits, matching upstream pi. A test that only passes on an idle machine is a bug in that test: give the real work headroom and derive the assertion from a named constant. Do not skip it, serialize the suite, or shard.
Pull requests
External contributors must complete the issue discussion and explicit scope approval process above before opening any PR. PRs opened without prior approval may be closed pending discussion.
When opening a PR:
- Describe the problem and the solution clearly.
- External contributors must link the approved issue with
Closes #<issue-number>orRelated: #<issue-number>. - Include test output or explain why tests were not run.
- Call out breaking changes, migration steps, or follow-up work.
Workflows contributions
Looking to contribute workflows? Check out the atomic-workflows repo here.
Questions
For questions, help, feedback, or feature ideas, join the Atomic Discord community.