
Agent-abinibi
Full-Stack Framework
Bí AI bá ń da koodu jade, mandu kì í fọ́. 🥟
Engineering decisions, handed to the framework. 100+ MCP tools · battle-tested Skills workflows · runtime Guard.
10,000 lines a day from coding agents,
who fixes it?
Laisi awọn aabo igbekalẹ, koodu ti AI ṣe yipada si rudurudu gbese imọ-ẹrọ ni kiakia.
Itankalẹ ẹya
Awọn aṣoju AI ṣẹda awọn ohun elo meji-meji ti wọn si foju awọn ilana ti o wa tẹlẹ, ti wọn nmu koodu-ipilẹ rẹ wu.
→ negotiate + Skills keep structure consistent
Ikuna dakẹ
Awọn aṣiṣe ọgbọn ti o sin jinlẹ ninu awọn iṣẹ ti a ṣe ti o kọja awọn idanwo ipilẹ ṣugbọn kuna ni iṣelọpọ.
→ ATE writes tests and heals failures
Iyipada eto-iṣẹ
Eto-iṣẹ rẹ ti o mọ n bajẹ bi AI ṣe n lẹ koodu laisi oye awọn aala.
→ Guard enforces boundaries at runtime
Ailewu. Iwọn-agbara. Eto-ṣiṣe.
Already giving your agent the same instruction for the third time?
One contract file brings types, API, tests, and runtime validation with it. When the agent drifts, Guard stops it at runtime.
Clean architecture, fell apart in a week?
Guard enforces layer boundaries, naming, and dependency rules at runtime. Six presets ready — FSD, Clean, Hexagonal, Atomic, CQRS, Mandu.
// layer violation detected
Agent "claude" blocked.
Reason: layer-violation: shared → features
Architecture preserved. ✅
Eto-iṣẹ ti o da lori Slot
Awọn agbegbe iṣẹ ti o ya sọtọ. Rọpo awọn apa eto rẹ laisi fifọ gbogbo rẹ.
Agent-abinibi (MCP)
Ti a kọ fun Model Context Protocol. Awọn aṣoju loye igbekalẹ koodu-ipilẹ rẹ ni abinibi.
Still writing tests yourself?
ATE auto-generates Playwright specs from your routes. Pick an oracle level (L0–L3, smoke to contract). When a test fails, the LLM suggests a repair diff.
One click to undo an agent's mistake.
Snapshot with `mandu change begin` before the agent edits. Rollback if it's wrong, commit if it's right. File-level atomic recovery — no branches.
How is this different from Next · Remix · Hono?
| Feature | Mandu 🥟 | Next.js | Remix | Hono |
|---|---|---|---|---|
| Runtime | Bun-native | Node/Edge | Node/CF | Bun/Node/Deno |
| Type ↔ API | One contract → type · OpenAPI · tests | Manual sync | Manual sync | Zod middleware (manual) |
| Architecture enforcement | Guard at runtime | ESLint | None | None |
| Test automation | ATE auto-generate & heal | Manual | Manual | Manual |
| Agent interface | 100+ MCP tools built-in | Plugin | Plugin | Plugin |
| AI edit rollback | change begin/commit/rollback | git (manual) | git (manual) | git (manual) |
| Deploy targets | 4 edge + 7 deploy adapters | Vercel-first | Multi | Multi |
| DB client | Bun.SQL (Postgres · MySQL · SQLite) | — | — | — |
| Auth / Session | session · JWT · OAuth · email | 3rd-party | 3rd-party | 3rd-party |
6-line handler, 8-line contract.
A 30-line file becomes two files, 14 lines total. Same /api/signup.
import { z } from "zod";
import { NextRequest, NextResponse } from "next/server";
import { db, hash, isRateLimited } from "@/lib";
const SignupSchema = z.object({
email: z.string().email(),
password: z.string().min(8),
});
export async function POST(req: NextRequest) {
const csrf = req.headers.get("x-csrf-token");
if (csrf !== req.cookies.get("__csrf")?.value)
return NextResponse.json({ error: "csrf" }, { status: 403 });
if (await isRateLimited(req.ip))
return NextResponse.json({ error: "rate" }, { status: 429 });
const raw = await req.json().catch(() => null);
const parsed = SignupSchema.safeParse(raw);
if (!parsed.success)
return NextResponse.json({ error: parsed.error.flatten() }, { status: 400 });
try {
const user = await db.user.create({
data: {
email: parsed.data.email,
password: await hash(parsed.data.password),
},
});
return NextResponse.json({ id: user.id }, { status: 201 });
} catch (err) {
if ((err as any).code === "P2002")
return NextResponse.json({ error: "duplicate" }, { status: 409 });
return NextResponse.json({ error: "internal" }, { status: 500 });
}
}import { Mandu } from "@mandujs/core"; import { SignupContract } from "@/spec/contracts/signup.contract"; export default Mandu.filling(SignupContract, async (ctx) => ctx.ok(await ctx.db.user.create({ ...ctx.body })) ).guard("auth").rateLimit({ rpm: 10 });
import { defineContract } from "@mandujs/core/contract"; import { z } from "zod"; export const SignupContract = defineContract({ method: "POST", request: z.object({ email: z.string().email(), password: z.string().min(8) }), response: z.object({ id: z.string() }), });
One command, 7 destinations.
Mandu generates platform configs for you. wrangler.toml · vercel.json · Dockerfile · …
Ibamu pẹlu

Darapọ mọ ilede
Mandu jẹ orisun-ṣiṣi ati awujọ ṣe itọsọna rẹ. Ran wa lọwọ lati kọ awọn Guard ti o jẹ ki idagbasoke AI jẹ ailewu.