Contributing
git clone https://github.com/tylerjrbuell/reactive-agents-ts.gitcd reactive-agents-tsbun installbun test # 1773 tests — all must passbun run build # ESM + DTS for all 20 packagesDevelopment Cycle
Section titled “Development Cycle”bun test # Run full suitebun test --watch # Watch mode during developmentbun run typecheck # Workspace-wide type checkingbun run build # Build all packages and appsbun run rax -- <args> # Run the local rax CLIbun run docs:dev # Docs site dev serverBefore opening a PR
Section titled “Before opening a PR”-
bun test— 100% green -
bun run build— no errors - Documentation updated (see below)
- Changeset added (see Release Workflow below)
Release Workflow
Section titled “Release Workflow”This project uses Changesets for versioning and publishing. Never manually bump package.json versions or edit CHANGELOG.md for a new release.
1. Add a changeset with your PR
Section titled “1. Add a changeset with your PR”Every PR that changes user-facing behaviour needs a changeset:
bun run changesetThe interactive prompt asks:
- Which packages changed? — Select any package (all 20 are in a fixed group, so all move together)
- Bump type? —
patchfor fixes,minorfor new features,majorfor breaking changes - Summary? — One line description that becomes the CHANGELOG entry
This creates .changeset/<random-name>.md. Commit it alongside your code.
2. Merge to main
Section titled “2. Merge to main”The changesets/action workflow detects pending changesets and automatically opens a “chore: version packages” PR that:
- Bumps all package versions consistently
- Generates
CHANGELOG.mdentries from your changeset summaries - Stays open and accumulates more changesets until you’re ready to release
3. Merge the Version Packages PR to publish
Section titled “3. Merge the Version Packages PR to publish”When you’re ready to ship, merge the “chore: version packages” PR. The workflow then:
- Builds all packages
- Runs
changeset publish— correctly resolvesworkspace:*deps and publishes to npm - Creates a GitHub Release with the generated notes
Bump types
Section titled “Bump types”| Type | When | Example |
|---|---|---|
patch | Bug fixes, test fixes, internal refactors | 0.7.6 → 0.7.7 |
minor | New features, new builder methods, new exports | 0.7.6 → 0.8.0 |
major | Breaking API changes | 0.7.6 → 1.0.0 |
All 20 publishable packages move together in a fixed group — bumping any one bumps all of them to the same version.
Documentation
Section titled “Documentation”When to update what
Section titled “When to update what”| Change | Update |
|---|---|
| New package | CLAUDE.md package map, README.md packages table, docs sidebar |
| New builder method | README.md, apps/docs/src/content/docs/reference/builder-api.md, CLAUDE.md |
| New CLI command | README.md, apps/docs/src/content/docs/reference/cli.md |
| New feature | apps/docs/src/content/docs/features/<name>.md |
| API signature change | Search docs: grep -r "oldMethod" apps/docs/ |
Docs site
Section titled “Docs site”bun run docs:dev # http://localhost:4321bun run docs:build # Production buildbun run docs:preview # Preview built outputDocs are deployed to docs.reactiveagents.dev on every push to main.
Package Structure
Section titled “Package Structure”New packages follow this layout:
packages/<name>/ src/ types.ts # Schema.Struct types, tagged errors errors.ts # Data.TaggedError definitions services/ # Effect-TS Context.Tag services runtime.ts # Layer factories (createXxxLayer) index.ts # All public exports tests/ package.json # "version" matches workspace, "private": true if internal tsconfig.json # extends ../../tsconfig.jsonInternal packages that should never be published must have "private": true in package.json.
Adding a new package to the publish pipeline
Section titled “Adding a new package to the publish pipeline”- Create the package following the structure above
- Add it to the
fixedgroup in.changeset/config.json - Add its build step to the
build:packagesscript in rootpackage.json - Add it to the workspace in root
package.jsonworkspaces
Code Standards
Section titled “Code Standards”This project uses Effect-TS throughout. Load the effect-ts-patterns skill before writing any service code.
- No
throw— useEffect.failwith tagged errors - No raw
await— useEffect.promiseorEffect.tryPromise - No
any— use precise types, generics, and tagged unions - All public APIs need JSDoc comments
- New services need tests in
tests/