AI-assisted coding is welcome, hell we used it heavily for this project, but you are ultimately responsible for the correctness and quality of your contributions.
If you submit code that was written by an LLM, you must:
- Review it thoroughly - Understand the code before submitting
- Ensure it works - Test it properly and verify it solves the intended problem
- Maintain quality standards - Follow our code style, add tests, and ensure type safety
- Take ownership - You're responsible for the code you submit
Low-quality contributions (untested, broken code, or code the submitter doesn't understand) will be flagged and may result in your account being restricted from making future contributions.
Thank you for understanding and contributing to OmniDev!
Please open an issue first before making substantial changes or starting new work. This allows us to:
- Discuss whether the change aligns with the project's direction
- Coordinate with other contributors and avoid duplicate work
- Provide guidance and save you time
If an issue already exists for your intended work, please claim it or reference it in your PR.
# Clone the repository
git clone https://github.com/frmlabz/omnidev.git
cd omnidev
# Install dependencies
bun install
# Run all checks (typecheck + lint + format)
bun run check
# Run all tests (coverage + integration)
bun run test:all# Type checking
bun run typecheck
# Linting and formatting
bun run lint # Lint and fix issues
bun run format # Format code
bun run lint:fix # Fix linting issues
bun run format:fix # Fix formatting issues
# Testing
bun run test # Run unit tests
bun run test:coverage # Run tests with coverage
bun run test:watch # Watch mode
bun run test:integration # Run Docker integration tests
bun run test:all # Full test suite (coverage + integration)
# Build
bun run build # Build all packages
# Clean
bun run clean # Remove build artifactsomnidev/
├── packages/
│ ├── core/ # Core capabilities (not published)
│ ├── cli/ # Command-line interface (Stricli)
│ ├── adapters/ # Provider-specific file writers
│ └── capability/ # Capability development kit (CLI + types)
├── capabilities/ # Built-in capabilities
│ ├── ralph/ # AI orchestrator for PRD-driven development
│ └── tasks/ # Task management
├── examples/ # Runnable example configurations (CI tested)
├── tests/
│ └── integration/ # Docker integration tests
└── scripts/ # Helper scripts
test/integration/- Docker-based end-to-end tests that validate CLI flows in clean containersexamples/- Exampleomni.tomlconfigurations that are CI-tested and must always be runnablecapabilities/- Built-in capabilities included with OmniDev
@omnidev-ai/core (not published)
- Shared types and configuration loading
- Capability registry and loader
- Provider state management
- Core interfaces
@omnidev-ai/adapters
- Provider-specific file writers
- Transforms
SyncBundleinto provider-specific files - Writers for Claude, Cursor, Codex, OpenCode
@omnidev-ai/cli
- Main CLI commands (
init,sync,doctor,profile,capability,provider) - Built with Stricli
@omnidev-ai/capability
- CLI commands for capability development (
capability new,capability build) - Library exports types and utilities for building capabilities
OmniDev uses a Writer-based architecture to transform provider-agnostic content into provider-specific files:
┌─────────────────────────────────────────────────────┐
│ Core │
│ ┌─────────────┐ ┌─────────────┐ │
│ │ Capability │───▶│ SyncBundle │ │
│ │ Registry │ │ (agnostic) │ │
│ └─────────────┘ └─────────────┘ │
└─────────────────────────────────────────────────────┘
│
┌────────────────┼────────────────┐
│ │ │
▼ ▼ ▼
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ Claude │ │ Cursor │ │ Codex │
│ Writers │ │ Writers │ │ Writers │
└──────────────┘ └──────────────┘ └──────────────┘
Key concepts:
- SyncBundle: Provider-agnostic data structure with all capabilities, skills, rules, etc.
- Writers: Stateless functions that transform SyncBundle into provider-specific files
- Writer deduplication: Same writer with same output path only executes once
Capabilities can come from two sources:
- Git sources — Cloned to
.omni/capabilities/, tracked by commit hash and (optional) version - File sources — Copied to
.omni/capabilities/, tracked by content hash
The lock file (omni.lock.toml) ensures reproducible builds by tracking:
[capabilities.my-cap]
source = "github:user/repo"
version = "1.0.0"
commit = "abc123def..."
updated_at = "2026-01-16T..."This system enables configuration versioning and ensures that omni sync produces consistent outputs across runs.
The examples/ directory contains runnable omni.toml configurations that are CI-tested on every push/PR.
Important: Examples are not just demonstrations—they must always work. When adding new functionality:
- Create or update an example that uses the feature
- Ensure the example passes CI tests
- Keep examples simple and self-contained
See examples/README.md for detailed documentation.
We have three levels of testing:
Co-located with source files (*.test.ts)
bun test ./packagesDocker-based end-to-end tests in tests/integration/
bun run test:integration
# or
bash tests/integration/run.sh devIntegration tests validate:
- CLI flows (
init,sync,add cap,add mcp) - Profile switching and capability toggling
- Generated files and synced capabilities
- Doctor command validation
Validates that all example configurations work correctly
bun test ./examples- Use
setupTestDir()from@omnidev-ai/core/test-utilsfor temp directories - Prefer
testDir.pathfor filesystem work andtestDir.reset()when you need a fresh directory mid-test - Mock
process.exitfor CLI tests - Use
beforeEach/afterEachonly for test-specific setup (not temp dir cleanup)
We use Biome for linting and formatting.
Before submitting a PR, you must:
- Type check:
bun run typecheck - Lint:
bun run lint - Format:
bun run format - All tests pass:
bun run test:all
# Run everything
bun run check && bun run test:allGit hooks (via Lefthook) run these checks on commit.
- Open an issue or claim an existing one (for non-trivial changes)
- Create a branch from
main - Make your changes with tests
- Run checks:
bun run check && bun run test:all - Commit with a descriptive message
- Open a PR against
main(direct pushes tomainare blocked)
We use PR and issue templates to keep reviews and reports consistent.
Use clear, descriptive commit messages:
add file:// protocol support for capability sources
- Add FileCapabilitySourceConfig type
- Implement parseFilePath() for file:// URLs
- Add content hash tracking for change detection
- Update lock file format for file sources
| Component | Technology |
|---|---|
| Runtime | Bun |
| CLI Framework | Stricli |
| Configuration | TOML (smol-toml) |
| Linting | Biome |
| Git Hooks | Lefthook |
Open an issue for questions or discussion.