sms-baseline
A headless baseline for self-modifying software driven by agentic AI. Users prompt a model; the software’s behaviour changes live — no rebuild, no restart — and stays reliable because every change is a plugin that is judged before it mounts, undone mechanically when it fails or is disabled, and persisted so it survives restarts.
It is a set of packages, not an app. A downstream project installs the baseline, brings its own plugins (domain modules) and its own UI (any frontend against the JSON admin API), picks the drivers for its stack, and gets self-modification for free.
ring 0 @sms/kernel loader · registry · fibers · derived undo · event log · trust tiers
ring 1 @sms/plugin-sdk | @sms/contracts what agent code sees | the driver contracts
ring 2 drivers | plugins store · host · executor · model · objects | http · collections · judge · agent-loop · admin-api · …
ring 3 @sms/baseline createBaseline() · createTenantPool()
ring 4 examples/* — and your app
Quick start
pnpm add "github:<owner>/sms-baseline#vX.Y.Z&path:/packages/baseline" # + the drivers you use (see docs/getting-started.md)
import { createBaseline } from "@sms/baseline";
import { QuickJSExecutor } from "@sms/executor-quickjs";
import { createNodeHost } from "@sms/host-node";
import { createClaudeModel } from "@sms/model-claude";
import { openSqliteStore } from "@sms/store-sqlite";
const app = await createBaseline({
store: await openSqliteStore("app.db"),
executor: new QuickJSExecutor(),
model: createClaudeModel(),
plugins: [/* your plugins */],
adminToken: process.env.SMS_ADMIN_TOKEN,
});
await createNodeHost({ port: 8787 }).listen(app.handle);
Documentation
Everything lives in docs/ (also published as an mdBook site — see
docs/documentation-site.md):
- Getting started · Writing plugins · Building a UI
- Drivers · Tenancy
- Architecture · Dependency graph · Research positioning
- Releasing · Quality gate · Benchmarking
Developing the baseline
pnpm install
pnpm check # typecheck · lint · quality gate · knip · tests with coverage — run before every push (no CI on main)
pnpm --filter @sms/example-reference-node-sqlite demo
git tag vX.Y.Z && git push origin vX.Y.Z # cut a release; CD does the rest (docs/releasing.md)
Agent notes for this repo are in CLAUDE.md at the repo root.