Skip to main content
Skills define what integrations your workflow can interact with. Each skill exposes a set of tools that the agent can call (via agentic loops) or that you can call deterministically (via agent.tools.*). In TypeScript, terse generate writes a single Skills object in src/terse.generated.ts. Import it and call the nested factory for the integration you want (for example Skills.github({ repos: [...] })). Built-in capabilities like Skills.web(), Skills.imageEdit(), and Skills.memory() are documented in their sections below.

GitHub

Read-only access to repositories.
skills: [Skills.github({ repos: [Repos.MyOrg.MyRepo] })]
ToolDescriptionAccess
searchGitHubCodeSemantic code search across repositoriesRead
grepGitHubCodeExact-match code search (grep-like)Read
readGitHubFileRead file contentsRead
listGitHubDirectoryList directory contentsRead
listGitHubPullRequestsList pull requestsRead
listGitHubCommitsList commitsRead
summarizeGitHubPullRequestDiffSummarize PR changesRead

Slack

Send messages and read conversations.
skills: [Skills.slack({ channel: SlackChannel.Engineering })]
ToolDescriptionAccess
slack_send_messageSend to a channel, an existing DM (channelId), or a member 1:1 (slackUserId)Write
slack_list_usersList workspace usersRead
slack_list_channelsList channelsRead
slack_read_conversationRead conversation historyRead
For slack_send_message, pass either channelId (a public or private channel id, or an existing DM channel id) or slackUserId (a member id, U…). Terse opens the DM if needed. If you pass both, channelId wins and the message goes there. After terse generate, use SlackChannel.*.channelId and SlackUser.*.userId from src/terse.generated.ts instead of hand-copying ids.

Linear

Create, update, and search issues.
skills: [Skills.linear()]
ToolDescriptionAccess
linear_search_ticketSearch ticketsRead
linear_get_teamsList teamsRead
linear_get_statesGet issue statesRead
linear_get_labelsGet available labelsRead
linear_get_projectsList projectsRead
linear_get_usersList team membersRead
linear_read_ticketRead ticket detailsRead
linear_create_ticketCreate a new ticketWrite
linear_update_ticketUpdate a ticketWrite
linear_add_commentAdd a comment to a ticketWrite

Attio

Query and manage CRM records.
skills: [Skills.attio({ object: AttioObject.People })]
ToolDescriptionAccess
attio_list_objectsList available objectsRead
attio_query_recordsQuery recordsRead
attio_upsert_recordCreate or update a recordWrite

Notion

Read and write databases and pages. Optionally scope to specific databases or pages.
import { NotionDatabase, NotionPage, Skills } from "./terse.generated"

skills: [Skills.notion({ databases: [NotionDatabase.Roadmap], pages: [NotionPage.OnCallRunbook] })]
databases and pages are both optional. Omit them to give the model access to every database and page the integration can reach.
ToolDescriptionAccess
notion_get_schemaGet database schemaRead
notion_query_databaseQuery a databaseRead
notion_query_pageQuery page contentRead
notion_list_usersList workspace usersRead
notion_create_or_update_database_rowCreate or update database rowsWrite
notion_create_or_update_pageCreate or update standalone pagesWrite
notion_modify_blocksModify page blocksWrite

Gmail

Send emails (auto-send, no human review).
skills: [Skills.gmail()]
ToolDescriptionAccess
gmail_send_emailSend emails or reply to threadsWrite

Gmail Draft

Create draft emails for a human to review and send manually.
skills: [Skills.gmailDraft()]
ToolDescriptionAccess
gmail_create_draftCreate draft emails for human reviewWrite

Snowflake

Read-only SQL query execution.
skills: [Skills.snowflake()]
ToolDescriptionAccess
snowflakeExplainQueryExplain query execution planRead
snowflakeExecuteQueryExecute SELECT queries (requires approval)Read

Datadog

Read-only access to logs and RUM events. Optionally scope to specific log indexes.
import { DatadogIndex, Skills } from "./terse.generated"

skills: [Skills.datadog({ indexes: [DatadogIndex.Main] })]
indexes is optional. Omit it to search across every index the integration can reach.
ToolDescriptionAccess
searchDatadogLogsSearch logsRead
listRumEventsList RUM eventsRead
searchRumEventsSearch RUM eventsRead
aggregateRumEventsAggregate RUM event dataRead

PostHog

Read-only access to product analytics. Supports US PostHog Cloud (us.posthog.com) only; EU-hosted PostHog is not supported.
import { PosthogProject, Skills } from "./terse.generated"

skills: [Skills.posthog({ project: PosthogProject.MyTeam })]
terse generate also emits a PosthogEventName union of the custom event names observed in your project over the last 180 days, so eventName filters are checked at compile time. Built-in $-prefixed events like $pageview are always accepted.
ToolDescriptionAccess
searchPosthogLogsSearch logsRead
searchPosthogSessionsSearch sessionsRead
getPosthogSessionEventsGet events for a sessionRead
listPosthogEventNamesList event names with occurrence countsRead
searchPosthogEventsSearch eventsRead

LaunchDarkly

Read-only access to feature flags.
import { LaunchDarklyProject, Skills } from "./terse.generated"

skills: [Skills.launchDarkly({ project: LaunchDarklyProject.MyFlags, environmentKeys: ["production"] })]
ToolDescriptionAccess
listLaunchDarklyFlagsList feature flagsRead
getLaunchDarklyFlagDetailsGet flag detailsRead

WorkOS

Read-only access to users and organizations.
skills: [Skills.workOS()]
ToolDescriptionAccess
listWorkOSUsersList usersRead
listWorkOSOrganizationsList organizationsRead
getWorkOSUserGet user detailsRead

Web (built-in)

Web search and research tools available to all workflows.
skills: [Skills.web()]
Pass allowedDomains to restrict the agent to a whitelist of sites. When set, web_search results and web_extract page fetches are limited to those domains and their subdomains; requests to any other domain are blocked.
skills: [Skills.web({ allowedDomains: ["example.com", "docs.acme.com"] })]
ToolDescriptionAccessRespects allowedDomains
web_searchSearch the webReadYes
web_extractExtract and process web page contentReadYes
web_researchResearch and synthesize web informationReadNo (not domain-limited)

Image Edit (built-in)

Edit and generate images.
skills: [Skills.imageEdit()]
ToolDescriptionAccess
image_editEdit and manipulate imagesWrite

Memory (built-in)

Gives a job a persistent /memories directory it can read and write across runs. With the skill added, the agent checks /memories before starting and records progress, context, and learnings as it works, so later runs pick up where earlier ones left off.
skills: [Skills.memory()]
ToolDescriptionAccess
memoryRead, write, edit, and organize files under /memories (view, create, str_replace, insert, delete, rename)Write

What persists between runs

Only files under /memories carry over. Every run otherwise starts fresh from your deployed code, so anything written elsewhere in the run is discarded. Anything the agent saves to /memories is still there on the next run.

How memory is organized

  • Per project — each project has its own isolated memory. Jobs in different projects never share memory.
  • Per job — within a project, every job gets its own private space; one job cannot see another job’s memory.
  • Scoped to /memories — all paths stay inside the /memories directory.
Cleanup is automatic: deleting a job removes that job’s memory, and deleting a project removes all memory for the project. terse test runs against a separate, isolated test memory, so local testing never touches what your deployed job has saved.

Inspecting memory

Use the terse memory commands to list, read, write, and delete a job’s memory files from the terminal. Add --test to any of them to target the isolated terse test memory instead of production.