Early Access

Workflow building for the coding agent era.

CLI
npm i -g terse-cli
Skill
npx skills add TerseAI/Terse
Works with
  • Cursor
  • Claude Code
  • Codex
src/jobs/pr-joke.ts
import { createJob, TerseAgent } from "terse-sdk"
// generated from your workspace
import {
Triggers,
Skills,
GitHubRepo,
SlackChannel,
} from "./terse.generated"
createJob({
name: "pr-joke",
// typed triggers
triggers: [Triggers.github.onPullRequest({ repo: GitHubRepo.Terse })],
onTrigger: async () => {
const agent = TerseAgent.create({
// scoped to channels you grant
skills: [Skills.slack({ channel: SlackChannel.AllTerseInc })],
})
await agent.runAndWait("Tell a programming joke")
},
})
Built to work in coding agents
Claude Code
claude
Claude Code v2.1.42
Sonnet 4.6 · Anthropic API
~/projects/deal-desk
/terse:create Add a workflow that summarizes related PRs and DMs the assignee in Slack when a Linear issue lands in Triage.
Let me check what Linear events look like.
Read 6 sample events from Triggers.linear.onIssueCreated
Writing the workflow.
Wrote linear-triage.ts (28 lines)
Testing against the 6 sample events.
6/6 passed in 1.1s.
Deploying.
Deployed in 8.2s. Triggers active at deal-desk-linear-triage.terse.run.
Try "/terse:create …"
? for shortcutsclaude-sonnet-4-6
src/jobs/linear-triage.ts
import { createJob, TerseAgent } from "terse-sdk"
// generated types for your workspace ↓
import { Triggers, Skills, LinearProject } from "./terse.generated"
createJob({
name: "linear-triage-summary",
triggers: [Triggers.linear.onIssueCreated({ project: LinearProject.Triage })],
onTrigger: async (event) => {
const issue = event.data.data
// ACL'd skills, agent stays in scope ↓
const agent = TerseAgent.create({
prompt: "Summarize the PRs linked to this Linear issue.",
skills: [Skills.linear(), Skills.github(), Skills.slack()],
})
// agentic reasoning ↓
const summary = await agent.runAndWait(
`Summarize PRs linked to ${issue.identifier}`
)
// deterministic tool call ↓
await agent.tools.slack.sendMessage({
slackUserId: issue.assignee.slackUserId,
message: summary,
})
},
})

Why Terse

Equipped to build production workflows.

Typed end-to-end

Mistakes caught at compile time, not in prod.

Your editor knows which channels, repos, and projects Terse has access to. Reference one you haven't granted, and the type checker catches it before the workflow ever runs.

src/jobs/release-alert.ts
const agent = TerseAgent.create({
skills: [Skills.slack({ channel: SlackChannel.Engineering })],
Engineering channel either does not exist, or Terse does not have access. Add @Terse to the channel to grant access.
})

Improves with use

Production teaches the workflow.

Every week, Terse reviews recent runs and proposes patches: missing fallbacks, prompt drift, redundant calls. Apply with terse apply, verify with terse test.

terminal
terse apply
Loaded 22 agents
Choose an agent
Latest Tech News3 pending improvements
Posthog Log Chat Bot3 pending improvements
Linear Issue Daily Summary2 pending improvements
Monthly Release Notes → Gmail Draft2 pending improvements
Update Docs on PR Merged2 pending improvements
Personal To-do list1 pending improvement

Deterministic by default

Skip the agent when you don't need one.

Not every step needs reasoning. Call skill methods directly with the toolbox: same typed SDK, same ACL'd scopes, no agent overhead. Use it when you just need to push, pull, or post.

src/jobs/deploy-notify.ts
import { toolbox, SlackChannel } from "./terse.generated"
// no agent needed for deterministic calls
await toolbox.slack.sendMessage({
channelId: SlackChannel.Releases.channelId,
message: "Deployed v2.4.1",
})

Debug like code

Reproduce any run locally.

terse history lists past runs. terse replay reproduces any one locally with the exact event. terse test runs jobs locally against sample events. terse listen pipes live prod events into your dev process.

terminal
terse replay run_8a3f29
Replaying linear-triage with event from 2026-05-12 14:23:08
Loaded 1 trigger event
Loaded 3 skill responses from production
Error: Slack user not found for email assignee@terse.dev
at linear-triage.ts:38 (agent.tools.slack.dmUser)
Fix locally, verify with terse test, redeploy.

Ready?

Your first workflow in 60 seconds.

Install the CLI, write a job in TypeScript, deploy serverless.

CLI
npm i -g terse-cli
Skill
npx skills add TerseAI/Terse
View source on GitHub