A collection of proactive agents. Each folder is a deployable agent — a typed
persona.ts (what it listens to + how it runs) and an agent.ts handler (what
it does). The persona compiles to persona.json; deploy with
agentworkforce deploy ./<agent>/persona.json --mode cloud.
| Agent | Fires on | What it does |
|---|---|---|
| cloud-team-implementer | launched by a teamSolve lead roster | Implements the assigned issue in its own sandbox and opens one focused pull request. |
| transcript-to-linear-github | Relayscribe recording → /recall/recordings/** |
Extracts action items from a meeting transcript, files Linear issues, and autonomously opens a GitHub PR per coding task. |
| transcript-slack-digest | Relayscribe recording → /recall/recordings/** |
Extracts action items, decisions, and open questions from a transcript and posts a structured Slack digest. |
| transcript-to-notion-slack | Relayscribe recording → /recall/recordings/** |
Writes structured meeting notes and action items to a Notion database, then posts the page link to Slack. |
| cloud-team-reviewer | launched by a teamSolve lead roster | Reviews a teammate's branch against the issue spec and returns verifiable, actionable findings. |
| granola | a new Granola note (Nango sync → file.created) |
Detects prospect calls, files a Linear issue with the ask, and opens a GitHub PR implementing it. |
| hn-monitor | schedule (2×/day) | Scans Hacker News for your topics and posts a digest to Slack. |
| askable-gtm | relay inbox + shared 15-minute sweep | Advertises a machine-readable GTM capability manifest, answers public-signal questions once a scoped Revternal credential bridge exists, and persists user-directed watch definitions. |
| linear | Linear issue.create (labelled) / comment.create |
Implements the issue and opens a GitHub PR; comments the PR link back. |
| neon-monitor | Neon sync-delta triggers (operation.failed / endpoint.state_changed / advisor.issue_raised) + 2h sweep |
Watches your Neon org for failed operations, endpoint thrash, advisor issues, and runaway compute/spend; posts Slack alerts and answers questions about live Neon state. |
| repo-hygiene | GitHub PR opened / updated | Diagnoses duplicated/dead code, divergent paths, stale skills/rules/docs, and code smells; comments findings and journals the run to Notion. |
| review | GitHub PR opened / updated / reviewed / CI finished | Reviews the PR, fixes the issues it (and other bots) find, resolves failing CI and merge conflicts, DMs you when it's ready, and merges once you approve. |
| spotify-releases | schedule (daily) | Checks for new releases from artists you follow and DMs them to you. |
| vendor-monitor | schedule (weekday mornings) | Watches the vendors in your stack for new releases and posts changes to your team channel. |
- Typed authoring. Personas use
definePersonafrom@agentworkforce/persona-kit(identity, runtime, integration connections); agents usedefineAgentfrom@agentworkforce/runtimefor triggers/schedules + the handler, sotriggers.<provider>[].onautocompletes the provider's real events and is linted at deploy. - Integrations are VFS-backed. Agents read/write providers (Slack, Linear, GitHub, Gmail/Google-Mail, Granola…) through the Relayfile VFS and the typed
ctxclients — no direct API calls or tokens to manage. - Repos are materialized, not cloned. For agents that touch code, the cloud materializes the GitHub repo into the sandbox (
ctx.sandbox.cwd) via Relayfile, so handlers never rungit clone— they just hand the work to the coding agent (ctx.harness.run).
npm install
npm run typecheck # tsc over every agent
npm run compile # every persona.ts -> persona.json; harness-backed personas are registered with the CLI
agentworkforce deploy ./hn-monitor/persona.json --mode cloud --input SLACK_CHANNEL=C0123ABCDnpm run compile does two things, because compiling alone leaves a persona
unrunnable. The CLI resolves personas from
<cwd>/.agentworkforce/workforce/personas/ and does not recurse, so a persona
sitting in <agent>/ is invisible to it — agentworkforce agent hn-monitor
answers Unknown persona next to a list that omits it. The compile step copies
each persona into that directory, keyed on its id rather than its directory
(granola/ publishes granola-prospect, review/ publishes pr-reviewer),
rebasing the relative paths inside so they still resolve from their new home.
Once compiled, you can sit in a persona's seat without deploying anything:
agentworkforce agent hn-monitor # interactive session: its prompt, model, and skills
agentworkforce list # every persona this repo publishesA persona without a harness is not registered — spotify-releases and
vendor-monitor are pure fetch-and-deliver handlers with no harness to sit in,
and npm run compile names each one it skips.
Every agent here is deployable into your Agent Workforce workspace, from a fork, with no interactive login and no terminal — set two secrets and dispatch a workflow.
Fork → Settings ▸ Environments ▸ "workforce" → Actions ▸ Deploy agent ▸ Run workflow
WORKFORCE_WORKSPACE_ID
WORKFORCE_WORKSPACE_TOKEN
-
Get the two secrets.
npm install && npx agentworkforce loginlogs you in through the browser and writes the workspace and its token to~/.agentworkforce/relay/workspaces.json. Read them back with:jq -r '.active' ~/.agentworkforce/relay/workspaces.json # WORKFORCE_WORKSPACE_ID jq -r '.workspaces[.active].key' ~/.agentworkforce/relay/workspaces.json # WORKFORCE_WORKSPACE_TOKEN
-
Add them to your fork under Settings → Environments → new environment named
workforce→ Environment secrets. The name matters: the deploy job declaresenvironment: workforce, and that is what resolves them. -
Dispatch it. Actions → Deploy agent → Run workflow → pick an agent from
scripts/deploy/agents.json. Tick dry-run first for a rehearsal that needs no secrets.
Or from your own shell, with the same two variables exported:
node scripts/deploy/deploy-agents.mjs --list
node scripts/deploy/deploy-agents.mjs --agent hn-monitor --dry-run
node scripts/deploy/deploy-agents.mjs --agent hn-monitor --input SLACK_CHANNEL=C0123ABCDAgent configuration (a Slack channel, a threshold, a topic list) comes from the
inputs each persona.ts declares; the deploy script resolves them from the
environment, so the self-deploy path itself commits nothing workspace-specific.
A few personas do still carry the original owner's org or project id as an input
default — the deploy refuses to inherit those, and tells you to set your own.
It also reuses integrations your workspace has already connected and fails
loudly if one is missing, rather than prompting.
→ docs/SELF-DEPLOY.md covers all of it in full: where
each secret comes from, how to pass per-agent inputs (including ones that must
stay masked in logs), what each failure message means, and why the workflow is
workflow_dispatch-only in a public repo.
