Reusable primitives for building agentic harnesses — Claude Code runners, git/github adapters, composer steps, multi-model review.
The common spine that agentic harnesses otherwise reinvent — model runners, git/GitHub plumbing, composable pipeline steps, and multi-model review — behind a small ports/adapters surface.
Pre-1.0. Independent semver; see docs/adr/ for design decisions.
Two layers over a port surface:
ports/— Interfaces only. The injectable seam. Structural subtypes consumers satisfy.domain/— Pure, I/O-free logic. Imports only fromports/.adapters/— I/O implementations of ports. Imports node APIs, thegit/ghCLIs, octokit, etc.steps/— composer-compatible step bodies (run-functions) that consumers wrap in@lotiai/composer'sstep().
See docs/adr/ for 44 architecture decision records covering every non-trivial choice.
Prefer narrow imports over the top-level barrel:
import { defineArtifact } from "@lotiai/agent-kit/artifacts";
import { defaultSpawn } from "@lotiai/agent-kit/process";
import type { ModelRunner } from "@lotiai/agent-kit/ports";
import type { ReviewFinding } from "@lotiai/agent-kit/review";The top-level import { ... } from "@lotiai/agent-kit" re-exports the curated public surface.
ESM ("type": "module", tsconfig module: NodeNext). Relative imports carry .js suffixes. Consumes @lotiai/composer (CommonJS) via its package name — Node resolves CJS-from-ESM natively.
pnpm testSpawn-touching code takes an injected SpawnFn, so most unit tests don't spawn real processes or hit the network; the defaultSpawn adapter and a few git/worktree tests do use real short-lived subprocesses / temp dirs. A gated smoke/ suite that spawns the real Claude CLI is planned (see ADR-0013).
zod(runtime) — all artifact schemas@lotiai/composer(optional peer) — orchestration layer for thesteps/subpath (sync for CLIs, async/Temporal for services)
No heavy internal shared library dep (ADR-0010) so tool CLIs stay lean.