Ballast installs AI agent rules for Cursor, Claude Code, OpenCode, and Codex.
Release v4.0.0 supports three first-class language profiles in this repository:
- TypeScript
- Python
- Go
@everydaydevopsio/ballast(npm)ballast-python(GitHub Releases artifact)ballast-go(Go)ballast(Homebrew formula on Linux, Homebrew cask on macOS)
Common agents (all languages):
local-devcicdobservability
Language-specific agents:
- TypeScript:
linting,logging,testing - Python:
linting,logging,testing - Go:
linting,logging,testing
Agent sources in this repo:
agents/common/*agents/typescript/*agents/python/*agents/go/*
ballast is the wrapper command (intended for Homebrew) that detects repo language and dispatches to the matching language CLI.
brew tap everydaydevopsio/ballast
brew reinstall --formula ballast
ballast install --target cursor --allbrew tap everydaydevopsio/ballast
brew install --cask ballast
ballast install --target cursor --allpnpm add -D @everydaydevopsio/ballast
pnpm exec ballast-typescript install --target cursor --allVERSION=4.0.0
uv tool install --from "https://github.com/everydaydevopsio/ballast/releases/download/v${VERSION}/ballast_python-${VERSION}-py3-none-any.whl" ballast-python
ballast-python install --target cursor --all
# or
uvx --from "https://github.com/everydaydevopsio/ballast/releases/download/v${VERSION}/ballast_python-${VERSION}-py3-none-any.whl" ballast-python install --target codex --agent lintinggo install github.com/everydaydevopsio/ballast/packages/ballast-go/cmd/ballast-go@latest
ballast-go install --target cursor --allIn a monorepo that contains TypeScript, Python, and Go projects, run Ballast once per language profile.
pnpm exec ballast-typescript install --target cursor --allVERSION=4.0.0
uvx --from "https://github.com/everydaydevopsio/ballast/releases/download/v${VERSION}/ballast_python-${VERSION}-py3-none-any.whl" ballast-python install --target cursor --allgo run github.com/everydaydevopsio/ballast/packages/ballast-go/cmd/ballast-go@latest install --target cursor --allRecommended order for one repository that uses all three languages:
- Run the TypeScript command.
- Run the Python command.
- Run the Go command.
Ballast only installs shipped agents and follows the single overwrite policy (existing rule files are preserved unless --force is passed). Use --patch to merge new Ballast content into an existing rule file while preserving the user's version of edited sections.
--target, -t:cursor,claude,opencode,codex--agent, -a: comma-separated agent list--all: install all agents for the selected language--force, -f: overwrite existing rule files--patch, -p: merge upstream rule updates into existing rule files while preserving user-edited sections (--forcewins if both are set)--yes, -y: non-interactive mode
- TypeScript CLI:
.rulesrc.ts.json - Python CLI:
.rulesrc.python.json - Go CLI:
.rulesrc.go.json
- Cursor:
.cursor/rules/<agent>.mdc - Claude:
.claude/rules/<agent>.md - OpenCode:
.opencode/<agent>.md - Codex:
.codex/rules/<agent>.mdand rootAGENTS.md
nvm install
pnpm install
pnpm test
pnpm run lint
pnpm run buildTo test the wrapper against the local checkout instead of installed package binaries:
cd ~/src/ballast
make build
~/src/ballast/cli/ballast/ballast install --target cursor --allmake build builds the local artifacts the wrapper looks for:
packages/ballast-typescript/dist/cli.jspackages/ballast-go/ballast-gocli/ballast/ballast
The wrapper then dispatches to the local TypeScript, Python, and Go backends from this repo when those artifacts are present. If a local backend artifact is missing, the wrapper falls back to an installed backend on PATH.
Use Dockerfile.smoke to test wrapper + language CLIs.
Default (all binaries preinstalled from local checkout):
docker build -f Dockerfile.smoke -t ballast-smoke .
docker run --rm -it ballast-smokeOn-demand mode (start with ballast wrapper and lazy-download language CLIs from GitHub):
docker build -f Dockerfile.smoke --build-arg PREINSTALL_ALL_BINARIES=0 -t ballast-smoke-lazy .
docker run --rm -it ballast-smoke-lazyMIT