A full SDLC team of AI agents inside Claude Code. Give it a project idea; it runs Discovery β Architecture β Design β Build β QA β DevOps β Growth β Ship with role-specialized agents β Project Manager, Architect, UX Designer, Frontend, Backend, QA, Security, DevOps, SEO, Marketer, Social β and stops at a gate after every phase for your approval.
You are the one-person company. OMA is your team.
β‘ Install Β· π Run it overnight Β· π See a real run Β· π¦ How it works Β· β FAQ
|
1 Β· You describe it Answer 5β8 questions. That's the whole input. |
2 Β· The team works Twelve specialists, eight phases, in order β each stopping at a gate for you. |
3 Β· You approve, or don't Reject with a reason and the phase redoes itself. Repeat eight times. |
What you end up holding: a working repository, 190+ passing tests, clickable mockups, a PRD, an API contract, a security review with real probes, CI, a deploy runbook, landing copy and 30 days of drafted posts β plus a written record of every decision and every failure along the way.
OMA is an open-source Claude Code plugin that turns a one-line project idea into a working, tested repository β the way a real software team would build it, not the way a single chat session flails at it.
It is a multi-agent SDLC pipeline: twelve role-specialized AI agents β project manager, software architect, UI/UX designer, frontend developer, backend developer, QA engineer, security engineer, DevOps engineer, SEO specialist, marketer, social media manager and a codebase archaeologist for existing projects β that coordinate through durable on-disk state instead of conversation. Sessions are disposable. The project isn't.
Three things make it different from "ask an AI to build my app":
- Phase gates. Nothing advances until you approve. The expensive failure mode in AI-built software isn't bad code β it's confident, complete-looking output built on a misread requirement. Gates catch that while it's cheap.
- Frozen contracts. The API contract, data model, design tokens and motion spec freeze at the gate that authored them, and a plugin hook physically blocks edits afterward. This is what lets Frontend and Backend build in parallel without drifting apart.
- Evidence over claims. A hook logs every shell command and exit code, so "the tests pass" is checkable against reality β and in validation, that's exactly what caught nine tasks marked done against tests that never existed.
Status: complete through M6. All eight phases are implemented and proven end-to-end on a real project β one idea taken from a blank directory to a tagged
oma/shipwith a tested application, a security review, CI, a deploy runbook and launch material. Brownfield mode reads an existing repository first, and is validated against ground truth. You can read a real run before installing anything.
β οΈ Validated on Next.js only. Every validation run to date has been a Next.js + TypeScript + Prisma application. Other stacks are supported by design and have never been tested β see what it's been proven on before committing a project to this.
New to this? The step-by-step guide walks the whole path β installing, describing your idea, what to review at each of the eight stops, and running the finished app. It assumes no coding ability. Everything below is the reference version.
- π Quick start
- πΎ Installation
- π¦ The pipeline
- π¦ What you actually get
- π₯ The team
- β‘ Commands
- π The overnight run
- π§ How it works
- πΏ Existing codebases
- π See a real run
- π§ͺ Proven on a real project
- π― What it's been proven on
- π§± The default stack
- π Requirements
- β FAQ
- π§ Roadmap
- π§ Honest limits
- π€ Contributing
- π License
Install β from a terminal. It comes straight from this repo, not from Anthropic's marketplace (why that works):
claude plugin marketplace add webmehedi/oma
claude plugin install oma@omaStart a project β in a new, empty folder:
mkdir my-new-project && cd my-new-project && claude/oma:init "Invoicing app for freelancers who hate invoicing"
Answer 5β8 intake questions. Then the loop β run a phase, review, approve:
/oma:run # runs the next phase, stops at the gate
# β¦review what the agents producedβ¦
/oma:gate approve # or: /oma:gate reject "the scope is too big"
/clear # optional but recommended β all state lives on disk
/oma:run # next phase
At the Design gate you get real, clickable mockups β not screenshots, not "here's a wireframe description":
python3 -m http.server 4173 -d .oma/03-design/mockupsLost the thread? /oma:status tells you where the project stands and the exact
next action. Close your laptop mid-project, come back next week, continue.
Don't want to sit through eight reviews? /oma:auto "<idea>" runs the whole
pipeline unattended and leaves a report in the morning β
what that trades away.
π Want this explained properly, with nothing assumed? The step-by-step guide walks the whole path β opening a terminal, installing, writing a good one-line idea, what to look at during each of the eight reviews, running your finished app, and putting it online.
OMA installs straight from this repository. It is not in Anthropic's plugin
marketplace and doesn't need to be β in Claude Code, a "marketplace" is just a
git repo containing a
.claude-plugin/marketplace.json, and this
repo has one. No submission, no review queue, no central registry in the path.
π First time doing any of this? The step-by-step guide covers the same ground assuming no prior experience β including opening a terminal and installing Node.
1 β check Claude Code is installed:
claude --versionPrints a version like 2.1.220 (Claude Code)? Good. command not found means
you need it first:
curl -fsSL https://claude.ai/install.sh | bash2 β install OMA:
claude plugin marketplace add webmehedi/oma
claude plugin install oma@oma3 β verify, then start a session:
claude plugin listoma@oma should be listed and enabled.
β οΈ Start a fresh session before running a phase. OMA's hooks β the ones that freeze contracts, log every command and block accidental deploys β load at session start. A mid-session install can leave them inert, and that failure is silent, because every hook fails open by design.
Installing from inside a session instead
Identical result, interactive:
/plugin marketplace add webmehedi/oma
/plugin install oma@oma
/plugin install asks for a scope β pick user to have OMA in every project.
If the install summary says Run /reload-plugins to activate., run that. Restart
regardless, per the note above.
Other install methods for Claude Code itself
| Platform | Command |
|---|---|
| macOS / Linux / WSL | curl -fsSL https://claude.ai/install.sh | bash |
| macOS β Homebrew | brew install --cask claude-code |
| Windows β PowerShell | irm https://claude.ai/install.ps1 | iex |
| Windows β WinGet | winget install Anthropic.ClaudeCode |
| Any β npm (Node 22+) | npm install -g @anthropic-ai/claude-code |
claude doctor prints installation and settings diagnostics without starting a
session. Claude Code requires a Pro, Max, Team, Enterprise or Console account;
the free Claude.ai plan doesn't include it. Full matrix:
Claude Code setup.
Desktop app
The desktop app's plugin browser (+ beside the prompt box β Plugins β
Add plugin) only lists marketplaces you have already configured, and
/plugin opens a terminal-only panel. So run the two shell commands above once β
the app's own integrated terminal counts β then restart the app. OMA appears
under + β Plugins, and its commands work in any Code-tab session.
Plugins aren't available in the desktop app's cloud or WSL sessions. For cloud sessions, use the settings-file method below.
For a whole team, or where no terminal is available
Declare the marketplace and the plugin in .claude/settings.json; Claude Code
installs it at session start. This is how you pin OMA for everyone working on a
repository, and the only route into cloud sessions:
{
"extraKnownMarketplaces": {
"oma": {
"source": {
"source": "github",
"repo": "webmehedi/oma"
}
}
},
"enabledPlugins": {
"oma@oma": true
}
}Project .claude/settings.json shares it with collaborators; ~/.claude/settings.json
applies it to everything you do. To pin a release rather than track main, add
"ref": "v0.6.3" alongside "repo".
Verifying in depth, updating, uninstalling
What got installed, and what it costs per turn:
claude plugin details omaA complete install reports 8 skills, 12 agents and 4 hooks (SessionStart,
PreToolUse, PostToolUse, SubagentStop) and about 1.7k always-on tokens β
the skills and agents themselves are only paid for when they fire.
Updating β third-party marketplaces don't auto-update by default, so pull both, then restart:
claude plugin marketplace update oma
claude plugin update omaUpdating never touches your projects: everything OMA knows about a project lives
in that project's .oma/ directory. CHANGELOG.md has what changed.
Uninstalling:
claude plugin uninstall oma@oma
claude plugin marketplace remove omaYour projects are unaffected β .oma/ is plain Markdown and JSON committed in
your repo, and stays readable with the plugin gone.
Working on OMA itself
Skip installation entirely:
git clone https://github.com/webmehedi/oma
claude --plugin-dir ./omaA --plugin-dir copy takes precedence over an installed one for that session, so
you can test changes without uninstalling first. bash scripts/selftest.sh runs
the 41-case hook suite.
Hit an error? TROUBLESHOOTING.md covers each install failure by its exact message.
| # | Phase | Agent(s) | Produces | Freezes |
|---|---|---|---|---|
| 00 | Archaeology (brownfield only) | Archaeologist | Baseline (green/red, recorded before anything changes), codebase map, and inferred stack, data model, API contract and conventions | β |
| 01 | Discovery | Project Manager | PRD with stable REQ-### ids, scope boundary, personas, success metrics |
β |
| 02 | Architecture | Architect | stack.md with proven version pins, data model, API contract, ADRs |
stack, data model |
| 03 | Design | UX Designer | Design system, tokens.json, motion spec, runnable HTML/CSS mockups |
api, tokens, motion |
| 04 | Build | Frontend β₯ Backend | Working application code, in parallel, against frozen contracts | β |
| 05 | QA | QA Engineer | Test plan, real command runs, failures filed back as tasks | β |
| 06 | DevOps | Security, then DevOps | Security review with real probes, CI, Dockerfile, env.template, deploy runbook |
β |
| 07 | Growth | SEO β₯ Marketer β₯ Social | Metadata/sitemap/JSON-LD in the code, positioning, landing copy, launch plan, 30-day calendar | β |
| 08 | Ship | (no agents) | Ship-time verification run, the project's README, the ship report | β |
Each phase ends at a gate, commits its work, and tags it (oma/gate-03-design),
so every phase of your project's history is a checkpoint you can diff or roll back to.
Not a chat log. A repository, plus the paper trail a real team would have left:
your-project/
βββ src/ app/ tests/ # the actual working application
βββ CLAUDE.md # rewritten at every gate β context for any future session
βββ .oma/
βββ state.json # source of truth: phases, gates, frozen contracts, open questions
βββ brief.md # your idea, normalized
βββ 01-discovery/ # PRD (REQ-### ids), scope, personas, metrics
βββ 02-architecture/ # stack.md, data-model.md, api-contract.yaml, adr/
βββ 03-design/ # design system, tokens.json, motion-spec.md
β βββ mockups/ # runnable HTML β open it in a browser
βββ 04-build/tasks.json # the backlog β every task cites a REQ
βββ 05-qa/ # test plan + evidence-based run reports
βββ 06-devops/ # security-review.md, deploy-runbook.md, env.template
βββ 07-growth/ # seo-brief, positioning, landing-copy, launch-plan
β βββ posts/ # drafted social posts, one file each
βββ 08-ship/ship-report.md # what shipped, what didn't, what's known-broken
βββ log/
βββ handoffs.jsonl # the message bus β how agents talk
βββ commands.jsonl # every command + exit code β the anti-fabrication trail
Plus, in the repository proper: Dockerfile, .github/workflows/ci.yml, the
SEO metadata in your routes, and a README.md written at ship time.
The mockups are the headline. Before a single line of application code exists, you get real HTML/CSS you can click through β with production-grade motion built on Motion and Lenis, five states per screen (empty, loading, populated, error, edge), and real content instead of lorem ipsum. Approve the interface before it's expensive to change. The Frontend agent then treats mockup fidelity as its definition of done.
| Agent | Role | Ships in |
|---|---|---|
oma-project-manager |
Requirements, scope discipline, REQ-### traceability, backlog |
β v0.3 |
oma-architect |
Stack selection with proven version pins, data model, API contract, ADRs | β v0.3 |
oma-ux-designer |
Design system, tokens, motion spec, runnable HTML mockups | β v0.3 |
oma-frontend |
UI implementation at mockup fidelity, against the frozen API contract | β v0.3 |
oma-backend |
Schema, migrations, endpoints, business logic, tests | β v0.3 |
oma-qa |
Runs real commands, judges against acceptance criteria, files β never fixes | β v0.3 |
oma-security |
Probes the running app for broken authorization, secrets, injection, weak sessions; files findings by severity | β v0.4 |
oma-devops |
CI, multi-stage container, env template, deploy runbook β each proven locally before handoff | β v0.4 |
oma-seo |
Metadata, canonical URLs, sitemap, robots, JSON-LD written into the codebase, plus the keyword brief | β v0.4 |
oma-marketer |
Positioning, landing copy, launch plan β every claim traced to a shipped requirement | β v0.4 |
oma-social |
30-day calendar and the actual post drafts, in each platform's real format | β v0.4 |
oma-archaeologist |
Reads an existing codebase and reconstructs stack, data model, API contract, conventions and ADRs β every one marked inferred, plus a green/red baseline | β v0.5 |
| Command | Does |
|---|---|
/oma:init "<idea>" |
Intake: brief, clarifying questions, workspace, state |
/oma:run |
Advance one phase, stop at the gate |
/oma:status |
Where the project stands + the exact next action |
/oma:gate approve | reject "why" |
Your decision on the current phase |
/oma:phase <name> "<corrections>" |
Deliberately re-run a phase (e.g. redesign) |
/oma:change "<request>" |
Change a frozen contract: impact analysis β your decision β versioned re-freeze β rework tasks |
/oma:task list | add | close | reassign |
Manual backlog control |
/oma:ship |
Final assembly: ship-time verification run, project README, ship report, deploy checklist |
/oma:auto "<idea>" |
Unattended: one deep intake, then every phase to ship without stopping β see below |
Eight gates over several hours is the right trade when you're at the keyboard.
At 11pm it isn't. /oma:auto takes the idea, asks everything it needs up front,
and then runs the whole pipeline while you sleep.
/oma:auto "Invoicing app for freelancers who hate invoicing"
It asks more than /oma:init does β visual direction, auth model, payments in
v1, where it will deploy, what makes the run a success β because in a normal run
those surface at a gate and someone is there to answer. Then it asks for your
standing answers to the decisions gates exist for: cut scope or include it
when in doubt, halt on a contract change or allow it, halt when QA is still red
or accept the failures as known issues. Those defaults fail small.
In the morning there's a report at .oma/auto/run-1.md that leads with what
needs your eyes β not with what went well:
| It contains | Because |
|---|---|
| Look at these three things first, ranked | An auto-approval can prove a mockup renders. It cannot prove it looks good. |
| Every assumption made on your behalf, with the command that reverses it | You weren't asked; you should at least get the list |
Every gate, marked β‘ auto-approved |
Your own approvals stay visibly yours β in /oma:status and in the git history |
| Known issues by name | Nothing accepted under policy is hidden |
What unattended mode does not change: OMA still never deploys, still never
pushes, contracts still freeze, every phase still commits and tags, and QA still
reports what actually ran. It never lowers a guard to keep moving. When it can't
proceed honestly β a question no policy answers, a frozen contract needing a
change, a critical security finding β it halts with everything committed and
tagged, and /oma:auto resume picks up where it stopped.
The honest caveat, and the better way to use it: a misread requirement in Discovery survives all eight phases here, because the gate that catches it is the one you delegated. So for a first project, approve Discovery yourself and hand the rest over β
/oma:run, read the requirements,/oma:gate approve, then/oma:auto. Ten minutes of reading beats every automated check.
Keep the machine awake: caffeinate -i -t 36000 on macOS,
systemd-inhibit --what=idle --why="OMA run" sleep 10h on Linux.
Claude Code subagents cannot talk to each other. Each runs in an isolated context and returns one text summary. OMA's entire architecture follows from taking that constraint seriously instead of pretending otherwise.
flowchart TD
U["You, the only approver"] -->|run a phase| O["Orchestrator, the sole router"]
O -->|assignment plus inbox slice| PM["PM"]
O --> AR["Architect"]
O --> UX["UX Designer"]
O --> FE["Frontend"]
O --> BE["Backend"]
O --> QA["QA"]
PM --> FS
AR --> FS
UX --> FS
FE --> FS
BE --> FS
QA --> FS
FS["Files on disk, state.json plus contracts plus handoffs.jsonl"] -->|next agent reads its inbox| O
O -->|gate| U
HK["Hooks block writes to frozen contracts and log every command"] --> FS
- The filesystem is the message bus. Agents coordinate the way real teams
do: through artifacts. Every agent ends by appending a structured handoff
record to
.oma/log/handoffs.jsonl; the next agent reads its inbox from there. - No agent ever spawns another agent. The orchestrator routes everything β otherwise you get depth limits, lost state, bypassed gates and unbounded cost.
.oma/state.jsonis the single source of truth β phases, gates, frozen contract hashes, open questions. The project state never lives in conversation.- Every task traces to a requirement. Work citing no
REQ-###is scope creep, and gets rejected at the gate. - Hooks enforce what prompts can't. A
PreToolUsehook denies writes to frozen contracts (verified by SHA-256); aPostToolUsehook logs every shell command and its exit code; aSubagentStophook catches agents that finish without handing off. Prompts are requests. Hooks are walls. - Blocking questions halt the pipeline. When an agent hits a decision only you can make, the system stops and asks rather than building on a guess.
| GETTING-STARTED.md | The step-by-step path from nothing to a shipped app. Assumes no coding ability. |
| DESIGN.md | Full architecture and the reasoning behind every constraint |
| TROUBLESHOOTING.md | Real failure modes, hit during real runs, and what to do |
| CHANGELOG.md | What changed, when, and what it fixed |
| examples/ledgerly/ | A complete real run β 74 files, failures included |
Run /oma:init in a directory that already has code and OMA switches to
brownfield mode. Instead of inventing a project, it reads yours.
/oma:init "add recurring invoices" # in your existing repo
You pick a scope, and it changes what the whole pipeline is allowed to do:
| Scope | For | OMA will |
|---|---|---|
extend |
adding a feature | scope Discovery to the new work; treat the existing contracts as read-only reference; match your conventions even where it would choose differently |
refactor |
restructuring | freeze behavior β your existing test suite becomes the contract, and a task that needs a test edited to pass stops and asks, because that's a behavior change wearing a refactor's coat |
audit |
assessing | change no source code at all β a hook denies every write outside .oma/ β and hand back prioritized findings with evidence, plus a backlog nobody has started |
A new phase runs first. oma-archaeologist reconstructs the artifacts a
greenfield team would have written β stack.md from the lockfile (not the
manifest's ranges), the data model from your schema, an API contract from your
real routes, and conventions.md describing how your codebase actually does
error handling, validation and data access. From there, every later phase works
unchanged, because the pipeline never cared whether those artifacts were
authored or inferred.
Three rules make it safe to point at code you care about:
- A baseline is recorded before anything else. install β typecheck β lint β build β test, with real exit codes, written down. If your project is already red, that's the finding β OMA never quietly repairs pre-existing failures and can never be blamed for them later, because the arrival state is on disk.
- Everything is marked
inferred: trueand cannot freeze until you confirm it. A wrong reconstructed data model is the most damaging thing that can happen here: every phase downstream would build on a false description of your own database. So the archaeology gate asks you to check the low-confidence inferences specifically. - Conventions are extracted, not imposed. The default stack profile is ignored entirely. Where your codebase contradicts itself, the archaeologist documents both patterns and asks you which is canonical rather than picking β an agent that rewrites working code in its preferred idiom is worse than useless.
Before you install anything, read the output of a real one:
examples/ledgerly/ β the complete .oma/ workspace
from a full eight-phase run. 74 files, 28 agent dispatches, one sentence in, a
tested application out.
It includes the parts that went wrong: the QA report that caught nine tasks
marked done against tests that never existed, a frozen contract changed properly
through /oma:change with the ADR behind it, and a ship report that lists every
known issue and accepted security finding by name.
The mockups in it are runnable:
python3 -m http.server 4173 -d examples/ledgerly/.oma/03-design/mockupsOMA was validated end-to-end by building Ledgerly, a freelancer invoicing app, from a single sentence through to a green test suite. Not a demo β a real run, with real failures. What came out:
| Tasks completed | 28 / 28, every one citing a requirement |
| Test suite | 191 unit tests + 11 Playwright e2e, all passing |
| Pipeline | typecheck 0 Β· lint 0 Β· format 0 Β· build 0 |
| Contract drift after 23 agent dispatches | zero β all 4 frozen contracts hash-matched |
| Territory violations during parallel Frontend β₯ Backend | zero |
The interesting part is what went wrong, because that's what the architecture exists for:
- QA caught nine tasks marked
doneagainst vitest tests that did not exist. The build agents had accepted their own work. Because QA files and never repairs, it produced a real 167-test suite instead of quietly writing a token one. - QA then mutation-tested that suite with ten deliberate defects the Backend agent had never named β all caught, control clean. The verifier verified the verifier.
/oma:changeran for real when QA found the money columns couldn't hold values the API contract accepts: impact analysis β unfreeze β surgical schema edit + a new ADR β re-freeze at v1.1 with a new hash β migration implemented.- Agents died three times mid-run (API errors, one stall). Disk state survived every time; a scoped re-dispatch finished the gap. This is normal operation at this scale, not an anomaly β and it's why state lives on disk.
Four defects found in that run are fixed in v0.3.1, including the one that matters most: build slices must be β€ ~2 tasks, because a 3-task slice exhausts an agent's context and kills it.
The same project was then taken through DevOps, Growth and Ship:
- The security agent probes, it doesn't read. It ran a cross-user authorization check β 11 operations as user B against user A's records β and got 404 on all 11 with the data byte-identical. It also measured a timing oracle: sign-in responses fell into non-overlapping bands (3.3β8.9 ms vs 18.9β20.9 ms) that reveal whether an email is registered.
- Then it was mutation-tested. A deliberate IDOR was injected into the data
layer. The agent found it, located the exact lines, reproduced it, graded it
high, filed it as ahardentask β and separately noted that the existing unit tests passed 14/14 with the hole open, because none covered that path. - DevOps found the container never booted.
docker buildexited 0 while the firstmigrate deploydied on a pruned package. It fixed the prune and added a build-time boot proof so a future regression fails the build instead of the user's first deploy. - The three growth agents ran concurrently over disjoint files, all three handoffs landing intact in the shared log.
- The orchestrator's own verification caught a defect the agents missed:
Growth introduced a build-time environment variable that phase 06's
env.templateβ written a phase earlier β knew nothing about. Unfixed, every canonical URL and sitemap entry ships pointing atlocalhost. Fixed in v0.4.1 by re-checking env completeness after Growth.
Every validation run β M3, M4 and M5 β used one application: a Next.js 16 + TypeScript + Prisma/SQLite invoicing app. That's the honest boundary of the evidence, and it's worth knowing before you point this at something.
| Status | |
|---|---|
| Next.js + TypeScript + Prisma | β Validated end-to-end, three times, greenfield and brownfield |
| Any other JS/TS framework (SvelteKit, Nuxt, Remix, plain Node) | |
| Non-JS stacks (Django, Rails, Go, Laravel, .NET) | |
| Mobile / desktop / embedded | β Out of scope β the design assumes a web application |
What should carry over unchanged, because it's stack-agnostic by
construction: the phase gates, the frozen-contract mechanism, the handoff bus,
state.json, the QA repair loop, the security agent's probing method, and the
brownfield archaeologist's approach.
What is written around Next.js specifically, and would need work elsewhere:
stacks/web-app-default.mdβ the default profile, top to bottom- The mockup pipeline's translation from vanilla Motion β Framer Motion
oma-seo's metadata idioms βmetadataexports,robots.ts,sitemap.tsoma-devops's container and CI templates (Node-shaped:npm ci, standalone output)oma-backend's Prisma assumptions in the data layer
If you use a different stack, /oma:init accepts it and the Architect will
interview you instead of using the default profile. Expect the spec phases to
work well, and expect rough edges in Design, Build and DevOps. Please
open an issue with what broke β that's the single most useful
contribution to this project right now.
Opinionated, and overridable at intake (/oma:init asks) β but this is the
combination the pipeline was built around and the only one it has been proven
on:
Next.js (App Router) Β· TypeScript strict Β· Prisma Β· Tailwind Β· Zod Β· Vitest Β· Playwright Β· Framer Motion + Lenis
The Architect doesn't just pin the latest of each package β it pins the latest set that composes, and proves it in a throwaway install (install β typecheck β lint β build, all green) before the stack freezes. That rule exists because the naive approach hit two real incompatibilities in validation and cost an hour.
- Claude Code with plugin support β check
with
claude --version, install per Installation. Needs a Pro, Max, Team, Enterprise or Console account; the free plan doesn't include it. gitandpython3β the hooks are bash calling python3. Both ship with macOS and every mainstream Linux.node+npmβ for the default web stack, not for the plugin itself.- macOS or Linux, or Windows through WSL. The hook scripts are bash; native Windows is untested.
Not sure whether you have these? Part 0 of the getting-started guide checks each one and installs whatever's missing.
Do I need to know how to code?
No β you're never asked to write code, and the step-by-step guide assumes no experience.
What you do need is honest to say up front: a paid Claude account, a computer running macOS or Linux (or Windows with WSL), a willingness to type about fifteen copy-paste commands into a terminal, and β the real one β a few hours of your actual attention at the eight gates. OMA can build the thing; it can't decide what the thing should be. That judgment is the part only you have, and the gates are where you supply it.
How long does it take from idea to working app?
Roughly a working day of wall-clock in the validation run, spread over as many
sittings as you like. Nothing lives in the conversation, so you can stop
anywhere, close the laptop, and pick up next week with /oma:status.
The eight phases are unequal: Discovery and Design want your careful attention, Build is long and mostly hands-off, and Ship is a verification pass.
How is this different from just asking Claude to build my app?
A single session has one context window and no memory of a decision it made two hours ago. OMA splits the work across specialists, writes every decision to disk, freezes the interfaces they agree on, and enforces those freezes with hooks. You also get the artifacts β PRD, ADRs, API contract, design system, test plan β not just code.
Can it work on an existing codebase?
Yes, as of v0.5.0. Run /oma:init in a repo that already has code and OMA
enters brownfield mode: the archaeologist reads the codebase first,
reconstructs the artifacts a greenfield team would have written, and records a
green/red baseline before anything changes. Pick a scope β extend, refactor
or audit. See Existing codebases.
The reconstruction is the risk, which is why every inferred artifact is marked as inferred and none of them can freeze until you have confirmed it matches your actual system.
Will it deploy my app or post to my socials?
No β by design. The DevOps agent writes deploy configs; deploying is your credentials and your call. The marketing and social agents write copy and content calendars to disk; they never publish. Agents commit per phase, but never push.
How long does a project take, and what does it cost?
The Ledgerly validation ran roughly a working day of wall-clock across many sessions and dozens of agent dispatches. This is not a cheap tool β it's a thorough one. The gates exist partly so you can stop early when a phase reveals the idea needs rethinking, before you've paid for the build.
Can I use a different stack?
Mechanically yes β /oma:init asks, you can override anything in
stacks/web-app-default.md, and the Architect still has to prove the pins
compose before the stack freezes.
Honestly, though: no non-Next.js stack has ever been run through this pipeline. The parts that are stack-specific β the default profile, the mockup translation to Framer Motion, the SEO agent's metadata idioms, the DevOps container and CI templates β are all written around Next.js. The parts that aren't (gates, contracts, the handoff bus, the QA loop) should carry over unchanged, but "should" is doing real work in that sentence. If you try Django, Rails, Go or SvelteKit, please open an issue with what broke.
What if an agent gets something wrong?
Reject the gate with a reason (/oma:gate reject "the scope is too big"), and
the phase re-runs with your correction as input. For a targeted redo, use
/oma:phase 03-design "make the dashboard denser". For a frozen contract,
/oma:change does impact analysis first, so you see what breaks before deciding.
Do I have to babysit it?
At the gates, yes β that's the point, and gates are where your attention is worth the most. Read the Discovery gate especially carefully; it's the cheapest place to catch a misunderstanding and the most expensive one to miss.
If you'd rather not, /oma:auto runs the whole pipeline
unattended: it front-loads the questions, approves each gate against an
objective checklist, halts rather than guessing at anything expensive, and
leaves you a report of every assumption it made. The trade is real and stated
there β the Discovery gate is the one worth keeping for yourself.
| Milestone | Contents | Status |
|---|---|---|
| M1 | State, handoff bus, hooks, init / status |
β shipped |
| M2 | Discovery / Architecture / Design phases, gates, contract freeze, mockup pipeline | β shipped |
| M3 | Build (Frontend β₯ Backend) + QA verification loop + /oma:change + /oma:task |
β shipped Β· validated end-to-end |
| M4 | Security, DevOps, SEO, Marketer, Social agents + /oma:ship + the deploy guard |
β shipped Β· validated end-to-endΒ² |
| M5 | Brownfield mode β extend / refactor / audit on existing repos |
β shipped Β· validatedΒ³ |
| M6 | Distribution β worked example in-repo, troubleshooting guide, hook self-test | β shipped |
| v0.7 | /oma:auto β unattended runs with an autonomy policy, objective gate checks and a morning report |
β shipped Β· not yet run end-to-endβ΅ |
Β³ Validated against ground truth: the Ledgerly application was stripped of
every artifact OMA wrote β .oma/, CLAUDE.md, the README, git history, and
every agent attribution left in a comment β and handed to the archaeologist as a
codebase it had never seen. Scored against the originals it could not read:
| API endpoints | 17/17 found, 0 invented β verified by calling each one live |
| Data model | 5/5 entities, 24/24 scalar fields, BigInt money columns correctly identified |
| Stack versions | 10/10 correct, taken from the lockfile |
| Source files modified | 0 |
It also found two things the originals got wrong: a GET /health endpoint that
exists in the code but was never added to the frozen API contract, and β the one
that matters β that a fresh clone of the project does not work. The generated
database client is gitignored with no postinstall, so 91 of 191 tests fail
until db:generate is run by hand. The ship report had called the project green,
because it was green in a working directory that already had the generated code.
The audit guard is separately tested at the script level (10 cases).
β΅ The mode is built and its halt/report machinery is tested at the script level, but no complete project has yet been taken from idea to ship unattended β every validation run to date was gated by a human. Treat the first overnight run as an experiment, and read the report in the morning rather than the code.
β΄ All four items are in: this README, the marketplace listing,
examples/ledgerly/ β the complete 74-file .oma/ from a
real run β and TROUBLESHOOTING.md, built from failures
actually hit during validation rather than imagined ones.
Β² Phases 06β08 were run end-to-end on the same real project as M3, taking it
from a green build to a tagged oma/ship. The security agent ran real
cross-user authorization probes (11 operations); the three growth agents ran
concurrently over disjoint files with no lost handoffs; the ship report
assembled from state with no invented numbers. Two defects found in that run
are fixed in v0.4.1. The security review was then mutation-tested: a
deliberate IDOR was injected into the data layer, and the agent located it,
graded it high, reproduced it, and filed it as a harden task β while also
noting that the existing unit tests passed with the hole open. The deploy guard
is behaviorally tested at the script level (27 cases); it has not been exercised
through an installed plugin session.
- OMA writes deploy configs but never deploys. Marketing and social agents
write copy but never post. Agents commit per phase but never push.
As of v0.4.0 this is enforced by a hook, not just asked for: inside an OMA
project, deploy and publish commands (
vercel deploy,docker push,npm publish,terraform apply, β¦) are denied outright, andgit pushasks first. If you want to deploy, the runbook has the exact command β run it in your own terminal. - Next.js is the only stack this has ever been validated on. See what it's been proven on. Everything else is supported by design and untested in practice.
- Agent deaths mid-dispatch are routine at this scale. Recovery is built in (work survives on disk, gaps get re-dispatched), but you will see them.
- Unattended mode delegates the gate that matters most.
/oma:autocan verify facts β that the pins compose, that everydonetask cites a file that exists, that the mockups render. It cannot tell you the requirements are the ones you meant. No overnight run has been taken end to end yet either; see the overnight run for the trade in full. - This is a young project, validated on one application. Expect rough edges, and please file them.
Issues and pull requests are welcome β especially validation runs on project types other than a CRUD web app, which is where the sharpest edges hide.
Before opening a PR:
claude plugin validate . # manifests
bash scripts/selftest.sh # all six hooks, 41 behavioral casesThe self-test matters more than it looks. Every hook fails open β any
internal error exits 0 and allows the action, so a hook bug can never block a
user's work. The cost of that choice is that a broken hook is completely silent.
selftest.sh feeds each hook the payload the harness would send and asserts the
decision, so silence gets caught here instead of in someone's project.
Read DESIGN.md first if you're changing anything about state, handoffs, or the freeze mechanism β those three carry the invariants everything else depends on.
MIT Β© 2026 Coder71 Limited
Built and maintained by S M Mehedi Hasan, Founder of Coder71 Limited.
π Start with the step-by-step guide β
or, if you've done this before:
claude plugin marketplace add webmehedi/oma && claude plugin install oma@omaTopics: claude-code Β· claude-code-plugin Β· ai-agents Β· multi-agent-systems Β·
sdlc Β· agentic-workflow Β· ai-software-development Β· autonomous-agents Β·
llm-agents Β· anthropic Β· nextjs Β· typescript Β· developer-tools Β·
project-management Β· code-generation
If OMA saved you a sprint, a β helps other people find it.