Deterministic logic
Pure TypeScript. Type-checked input and output. The boring, predictable backbone of every workflow — fetches, transforms, branches, parallelism, retries.
Build typed orchestrations that mix deterministic code, LLM inference, and full agent loops behind a single default-deny execution model. Schedule them on cron, behind a webhook, or run them inside a long-lived gateway.
$ npm install -g skelm
$ skelm init my-bot && cd my-bot && npm install
$ skelm run workflows/hello.workflow.ts --input '{"name":"world"}'
A workflow is a TypeScript module made of three composable primitives — pick the right tool for each step instead of forcing every problem through one abstraction.
Pure TypeScript. Type-checked input and output. The boring, predictable backbone of every workflow — fetches, transforms, branches, parallelism, retries.
One model call with a typed prompt and a typed response. No tool loop, no surprise iterations — useful when you want LLM judgment but not LLM agency.
Full agentic loops with tools, MCP servers, and Markdown skills. Backed by Opencode, Claude Code, OpenAI, Anthropic, Pi, or your own provider — all under default-deny permissions.
Every agent step declares the tools, MCP servers, network hosts, and filesystem roots it may use. Anything undeclared is denied at step start.
Triage a GitHub issue with an agent step that follows a Markdown skill — and a permission policy that denies the network.
import { agent, pipeline } from 'skelm'
import { z } from 'zod'
export default pipeline({
id: 'triage-issue',
input: z.object({ title: z.string(), body: z.string() }),
output: z.object({ label: z.string(), reasoning: z.string() }),
steps: [
agent({
id: 'classify',
backend: 'pi',
skills: ['triage-guide'],
prompt: (ctx) => `Triage this issue:\nTitle: ${ctx.input.title}\n${ctx.input.body}`,
permissions: {
allowedSkills: ['triage-guide'],
networkEgress: 'deny',
},
output: z.object({ label: z.string(), reasoning: z.string() }),
maxTurns: 3,
}),
],
})
skelm ships as a small set of focused packages. Install the meta-package skelm — everything below comes along, and you opt into the rest as you need them.
skelmMeta-package — install this. Re-exports @skelm/core and ships the skelm CLI binary.
@skelm/coreRuntime, types, builders, permission model, and event bus. The substrate every workflow runs on.
@skelm/cliCLI primitives — parser, commands, programmatic entry point. Drives `skelm init`, `skelm run`, `skelm schedule`.
@skelm/gatewayLong-running orchestrator: HTTP + SSE surface, registries, audit log, network proxy, agent lifecycle.
@skelm/schedulerTriggers — cron, interval, webhook, poll, queue. Every workflow run is a schedule.
@skelm/integrationsTyped connectors for GitHub, Slack, Telegram, Jira, and friends.
@skelm/opencodeOpencode.ai coding-agent backend with full permission enforcement.
@skelm/piPi (Claude Code) coding-agent backend with full permission enforcement.
@skelm/vercel-aiWrap any Vercel AI SDK model under skelm's permission policy.
@skelm/metricsPrometheus-format metrics for skelm event streams.
@skelm/otelOpenTelemetry tracing for skelm event streams.
Install the CLI and have your first pipeline running in under a minute.