The open-source software factory — multi-agent fleet management for coding agents.
AgentFactory turns your issue backlog into shipped code. It orchestrates a fleet of coding agents (Claude, Codex, Spring AI) through an automated pipeline: development, QA, and acceptance — like an assembly line for software.
| Package | npm | Description |
|---|---|---|
| @supaku/agentfactory | @supaku/agentfactory |
Core orchestrator, provider abstraction, crash recovery |
| @supaku/agentfactory-linear | @supaku/agentfactory-linear |
Linear issue tracker integration |
| @supaku/agentfactory-server | @supaku/agentfactory-server |
Redis work queue, session storage, worker pool |
| @supaku/agentfactory-cli | @supaku/agentfactory-cli |
CLI tools: orchestrator, workers, Linear CLI (af-linear) |
| @supaku/agentfactory-nextjs | @supaku/agentfactory-nextjs |
Next.js route handlers, webhook processor, middleware |
| @supaku/agentfactory-mcp | @supaku/agentfactory-mcp |
MCP server exposing fleet capabilities to external clients |
| @supaku/create-agentfactory-app | @supaku/create-agentfactory-app |
Project scaffolding tool |
Deploy the dashboard with a single click — no local setup required:
| Platform | Deploy | Redis |
|---|---|---|
| Vercel | Add Vercel KV or Upstash after deploy | |
| Railway | Bundled automatically |
See the dashboard template for full setup instructions.
npx @supaku/create-agentfactory-app my-agent
cd my-agent
cp .env.example .env.local # Fill in LINEAR_ACCESS_TOKEN
pnpm install && pnpm dev # Start webhook server
pnpm worker # Start local worker (in another terminal)For production use, AgentFactory provides a webhook server that receives Linear events and dispatches agents:
// src/lib/config.ts
import { createAllRoutes, createDefaultLinearClientResolver } from '@supaku/agentfactory-nextjs'
export const routes = createAllRoutes({
linearClient: createDefaultLinearClientResolver(),
})// src/app/webhook/route.ts
import { routes } from '@/lib/config'
export const POST = routes.webhook.POST
export const GET = routes.webhook.GETimport { createOrchestrator } from '@supaku/agentfactory'
const orchestrator = createOrchestrator({
maxConcurrent: 3,
worktreePath: '.worktrees',
})
// Process a single issue
await orchestrator.spawnAgentForIssue('PROJ-123')
await orchestrator.waitForAll()const orchestrator = createOrchestrator({
project: 'MyProject',
maxConcurrent: 3,
})
const result = await orchestrator.run()
console.log(`Spawned ${result.agents.length} agents`)
await orchestrator.waitForAll()# Process backlog issues from a project
npx af-orchestrator --project MyProject --max 3
# Process a single issue
npx af-orchestrator --single PROJ-123
# Preview what would be processed
npx af-orchestrator --project MyProject --dry-run# Get issue details
npx af-linear get-issue PROJ-123
# List backlog issues for a project
npx af-linear list-backlog-issues --project "MyProject"
# Update issue status
npx af-linear update-issue PROJ-123 --state "Finished"
# Create a comment
npx af-linear create-comment PROJ-123 --body "Work complete"┌─────────────────────────────────────────────────┐
│ Orchestrator │
│ ┌───────────┐ ┌───────────┐ ┌───────────┐ │
│ │ Agent 1 │ │ Agent 2 │ │ Agent 3 │ │
│ │ (Claude) │ │ (Codex) │ │ (Claude) │ │
│ │ DEV: #123 │ │ QA: #120 │ │ DEV: #125 │ │
│ └─────┬─────┘ └─────┬─────┘ └─────┬─────┘ │
│ │ │ │ │
│ ┌─────┴─────┐ ┌─────┴─────┐ ┌─────┴─────┐ │
│ │ Worktree │ │ Worktree │ │ Worktree │ │
│ │ .wt/#123 │ │ .wt/#120 │ │ .wt/#125 │ │
│ └───────────┘ └───────────┘ └───────────┘ │
└─────────────────────────────────────────────────┘
│ │
┌────┴────┐ ┌────┴────┐
│ Linear │ │ Git │
│ API │ │ Repo │
└─────────┘ └─────────┘
AgentFactory supports multiple coding agent providers through a unified interface:
interface AgentProvider {
readonly name: 'claude' | 'codex' | 'spring-ai'
spawn(config: AgentSpawnConfig): AgentHandle
resume(sessionId: string, config: AgentSpawnConfig): AgentHandle
}
interface AgentHandle {
sessionId: string | null
stream: AsyncIterable<AgentEvent>
injectMessage(text: string): Promise<void>
stop(): Promise<void>
}Spring AI support means enterprise Java teams can orchestrate Spring AI-based agents in the same fleet as Claude and Codex agents, with the same pipeline, governance, and cost tracking.
Provider is selected via environment variables:
AGENT_PROVIDER=claude # Global default
AGENT_PROVIDER_QA=codex # Per-work-type override
AGENT_PROVIDER_SOCIAL=spring-ai # Per-project overrideAgentFactory implements the A2A protocol (v0.3.0), operating as both client and server.
- Client mode: Invoke remote A2A agents (Spring AI or any A2A-compliant agent) as part of an orchestrated fleet. Route specific work types to external agents via environment config.
- Server mode: Expose fleet capabilities via
/.well-known/agent-card.jsondiscovery and JSON-RPC task submission. Any A2A-aware tool can submit work to the fleet.
This enables mixed fleets across languages, frameworks, and infrastructure with no coupling.
Fleet capabilities are exposed as an MCP server. Any MCP-aware client (Claude Desktop, Spring AI apps, IDE agents) can interact with the fleet.
Tools:
| Tool | Description |
|---|---|
submit-task |
Submit a new task to the fleet |
get-task-status |
Check status of a running task |
list-fleet |
List active agents and their assignments |
get-cost-report |
Retrieve cost tracking data |
stop-agent |
Stop a running agent |
forward-prompt |
Send a prompt to a specific agent |
Resources:
| URI | Description |
|---|---|
fleet://agents |
Current fleet state |
fleet://issues/{id} |
Issue progress details |
fleet://logs/{id} |
Agent execution logs |
Transport: Streamable HTTP for remote access, STDIO for local CLI.
AgentFactory agents can be evaluated through Spring AI Bench. The multi-agent pipeline (dev, QA, acceptance) improves benchmark reliability over single-agent runs.
Issues flow through work stations based on their status:
| Status | Work Type | Agent Role |
|---|---|---|
| Backlog | development |
Implement the feature/fix |
| Started | inflight |
Continue in-progress work |
| Finished | qa |
Validate implementation |
| Delivered | acceptance |
Final acceptance testing |
| Rejected | refinement |
Address feedback |
AgentFactory includes built-in crash recovery:
- Heartbeat monitoring — agents send periodic health signals
- State persistence — session state saved to
.agent/directory - Automatic resume — crashed agents are detected and restarted
- Recovery limits — configurable max recovery attempts
Agents are monitored for inactivity:
const orchestrator = createOrchestrator({
inactivityTimeoutMs: 300000, // 5 minutes default
maxSessionTimeoutMs: 7200000, // 2 hour hard cap
workTypeTimeouts: {
qa: { inactivityTimeoutMs: 600000 }, // QA gets 10 min
},
})For teams that need horizontal scaling, AgentFactory supports a distributed worker pool:
┌────────────────┐ ┌─────────┐ ┌────────────────┐
│ Webhook Server │────▶│ Redis │◀────│ Worker Node 1 │
│ (receives │ │ Queue │ │ (claims work) │
│ issues) │ │ │ └────────────────┘
└────────────────┘ │ │ ┌────────────────┐
│ │◀────│ Worker Node 2 │
│ │ │ (claims work) │
└─────────┘ └────────────────┘
This requires the @supaku/agentfactory-server package and a Redis instance.
| Variable | Required | Description |
|---|---|---|
LINEAR_ACCESS_TOKEN |
Yes | Linear API key (used by Next.js webhook server) |
LINEAR_API_KEY |
Yes | Linear API key (used by CLI tools) |
AGENT_PROVIDER |
No | Default provider: claude, codex, spring-ai (default: claude) |
LINEAR_TEAM_ID |
No | Linear team UUID |
REDIS_URL |
For distributed | Redis connection URL |
Note: Set both
LINEAR_ACCESS_TOKENandLINEAR_API_KEYto the same value, or see Configuration for details.
interface OrchestratorConfig {
provider?: AgentProvider // Agent provider instance
maxConcurrent?: number // Max concurrent agents (default: 3)
project?: string // Project name filter
worktreePath?: string // Git worktree base path (default: .worktrees)
linearApiKey?: string // Linear API key
autoTransition?: boolean // Auto-update issue status (default: true)
sandboxEnabled?: boolean // Enable agent sandboxing (default: false)
inactivityTimeoutMs?: number // Inactivity timeout (default: 300000)
maxSessionTimeoutMs?: number // Hard session cap
workTypeTimeouts?: Record<string, WorkTypeTimeoutConfig>
}The @supaku/agentfactory-linear package provides:
- Agent sessions — lifecycle management with status transitions
- Activity streaming — thoughts, actions, and responses visible in Linear
- Plan tracking — task checklists with progress states
- Work routing — automatic work type detection from issue status
- Sub-issue coordination — dependency-aware parallel execution
import { createLinearAgentClient, createAgentSession } from '@supaku/agentfactory-linear'
const client = createLinearAgentClient({ apiKey: process.env.LINEAR_API_KEY! })
const session = createAgentSession({
client: client.linearClient,
issueId: 'issue-uuid',
autoTransition: true,
workType: 'development',
})
await session.start()
await session.emitThought('Analyzing requirements...')
await session.complete('Feature implemented with tests')1. Create a Linear API Key
Go to Linear Settings > API and create a Personal API Key (starts with lin_api_).
2. Configure the Webhook
In Linear Settings > API > Webhooks, create a webhook:
- URL:
https://your-app.example.com/webhook - Events to subscribe:
AgentSession(created, updated, prompted) andIssue(updated) - Copy the Signing Secret — this is your
LINEAR_WEBHOOK_SECRET
The webhook signature is verified using HMAC-SHA256 via the linear-signature header. Verification is enforced in production and optional in development.
3. Set Environment Variables
| Variable | Required | Description |
|---|---|---|
LINEAR_ACCESS_TOKEN |
Yes | API key for the Next.js webhook server |
LINEAR_API_KEY |
Yes | API key for CLI tools (can be the same value as above) |
LINEAR_WEBHOOK_SECRET |
Production | Signing secret from your Linear webhook |
LINEAR_CLIENT_ID |
No | OAuth app client ID (multi-workspace only) |
LINEAR_CLIENT_SECRET |
No | OAuth app client secret (multi-workspace only) |
NEXT_PUBLIC_APP_URL |
No | App URL for OAuth redirects (default: http://localhost:3000) |
REDIS_URL |
Distributed mode | Redis connection URL for worker pool and OAuth token storage |
Tip:
LINEAR_ACCESS_TOKENandLINEAR_API_KEYcan be the same key. The server usesLINEAR_ACCESS_TOKEN; CLI tools useLINEAR_API_KEY.
For the full environment variable reference and OAuth setup, see the Getting Started guide and Configuration reference.
Agent definitions tell coding agents how to behave at each stage of the pipeline. See examples/agent-definitions for ready-to-use templates:
| Definition | Stage | What it does |
|---|---|---|
| developer.md | Development | Implements features, fixes bugs, creates PRs |
| qa-reviewer.md | QA | Validates implementation, runs tests |
| coordinator.md | Coordination | Orchestrates parallel sub-issues |
| acceptance-handler.md | Acceptance | Validates, merges PRs, cleans up |
| backlog-writer.md | Planning | Transforms plans into Linear issues |
Place your definitions in .claude/agents/ at the root of your repository. Customize them for your stack — add your test commands, framework patterns, and deployment checks.
# Install dependencies
pnpm install
# Build all packages
pnpm build
# Run type checking
pnpm typecheck
# Run tests
pnpm testAgentFactory powers real products in production:
| Product | What it does |
|---|---|
| Supaku Social | AI-powered social media management |
| Supaku Art | Art collection curation platform |
| Supaku Account | Unified auth across the Supaku ecosystem |
Building with AgentFactory? Add the badge to your project and share it in Discussions.
If you're building with AgentFactory, add the badge to your README:
Or use HTML for GitHub theme-switching (auto light/dark):
<a href="https://github.com/supaku/agentfactory">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/supaku/agentfactory/main/docs/assets/badge-built-with-dark.svg">
<source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/supaku/agentfactory/main/docs/assets/badge-built-with-light.svg">
<img alt="Built with AgentFactory" src="https://raw.githubusercontent.com/supaku/agentfactory/main/docs/assets/badge-built-with.svg">
</picture>
</a>MIT - see LICENSE
Built by Supaku