Workspaces monorepo (npm) housing twelve Razroo tools that together make AI-agent harnesses isomorphic — the same authored source producing the same behavior across every coding harness (Cursor, Claude Code, Codex, OpenCode) and every model tier (frontier → 7B local).
See INTEGRATIONS.md at the repo root for the backlog of open
cross-package compositions and the decouplings that are deliberate.
Build-time (authoring → output):
packages/agentmd—@razroo/agentmd. Structured-markdown dialect for agent prompts, linter for structure, fixture-driven adherence harness. TypeScript,tsc→dist/. Tests vianode --test --import tsx tests/*.test.ts.packages/isolint—@razroo/isolint. Lints/rewrites AI harness markdown for weak small models; also ships an Isomorphic Plan engine. TypeScript,tsc→dist/. Tests viatsx --test test/*.test.ts.packages/iso-harness—@razroo/iso-harness. Transpiles oneiso/source into per-agent configs (Claude / Cursor / Codex / OpenCode). Plain ESM.mjs(no TS build). Tests vianode --test tests/*.test.mjs.packages/iso-route—@razroo/iso-route. Compiles onemodels.yamlpolicy (default model + named roles) into each harness's native config (.claude/settings.json,.codex/config.toml,opencode.json) plus a resolved role map for iso-harness. TypeScript,tsc→dist/.
Wrapper:
packages/iso—@razroo/iso. Chainsagentmd → isolint → iso-route → iso-harnessbehind one CLI whenmodels.yamlexists. Plain ESM.mjs. Depends on the sibling packages via workspace protocol.
Feedback (post-deploy):
packages/iso-eval—@razroo/iso-eval. Behavioral eval runner: snapshot a workspace per task, hand it to a runner, score the resulting filesystem/command state. TypeScript.packages/iso-trace—@razroo/iso-trace. Parses Claude Code JSONL sessions into a normalized event model for local observability. Zero upload. TypeScript.packages/iso-guard—@razroo/iso-guard. Deterministic runtime policy checks over normalized event streams andiso-trace exportJSON/JSONL. TypeScript.
Runtime control:
packages/iso-orchestrator—@razroo/iso-orchestrator. Durable workflow primitives for agent harnesses: resumable steps, keyed mutexes, bounded parallel fan-out, and file-backed run state. TypeScript,tsc→dist/. Tests vianode --test --import tsx tests/*.test.ts.packages/iso-ledger—@razroo/iso-ledger. Append-only operational event/state ledger for agent workflows: idempotent writes, local queries, verification, and materialized views. TypeScript,tsc→dist/. Tests vianode --test --import tsx tests/*.test.ts.packages/iso-contract—@razroo/iso-contract. Deterministic artifact contracts for agent workflows: validate, parse, and render JSON/TSV/markdown records without model calls. TypeScript,tsc→dist/. Tests vianode --test --import tsx tests/*.test.ts.packages/iso-capabilities—@razroo/iso-capabilities. Deterministic role capability policies for agent workflows: resolve, check, and render tool/MCP/command/filesystem/network permissions without model calls. TypeScript,tsc→dist/. Tests vianode --test --import tsx tests/*.test.ts.
- Each package owns its
package.json, tests, README, LICENSE, and CHANGELOG. - TypeScript packages extend
../../tsconfig.base.json. - Package names stay on the
@razroo/*scope so npm publish flows keep working. - All packages are ESM (
"type": "module"). - Root
scriptsfan out vianpm run <x> --workspaces --if-present. - Each published package has a tag-triggered release workflow at
.github/workflows/<pkg>-release.yml. The workflow waits for theci-requiredCI check-run on the release commit, runsrelease:check-sourceto verify the tag matchespackage.json, thennpm publish --provenance. Mirror this pattern when adding a new package.
agentmdhas alint:isolintscript that pipes its rendered prompts throughisolint. When both are in the same workspace, prefer calling the sibling directly rather than the global binary.iso(wrapper) resolves sibling bins viarequire.resolveon the workspace package; seepackages/iso/src/pipeline.mjs.iso-routewrites.claude/iso-route.resolved.jsonas an on-disk contract for iso-harness to consume. Prefer file-based handoffs over TypeScript imports so packages stay independently installable.
- Don't add
node_modules/,dist/, or lockfiles from the former standalone repos. Only source + tests + examples + configs come over. - Don't rename published package names — they're already live on npm.
- Don't design for hypothetical integrations. If a composition isn't
listed in
INTEGRATIONS.md, it isn't planned — ask before building.