Skip to main content

Temporal-backed workflow runtime for Claude Code skills

Project description

sagaflow

CI PyPI Python 3.11+ License: MIT Docs

Run durable agent workflows that outlive your session.

The problem

Multi-agent skills for code review, debugging, and research spawn parallel subagents and thread their output back together through ad-hoc file-based state machines. When the session crashes — or a subagent wedges silently for hours — that state fragments, retries are brittle prose inside markdown, and there's no visibility into what's still in flight. Rolling a durable execution layer per skill duplicates a lot of work that Temporal already solves.

Quick start

pip install sagaflow
temporal server start-dev &
export ANTHROPIC_API_KEY=sk-ant-...
sagaflow launch hello-world --name alice --await
# → hello, alice

A DONE entry also lands in ~/.sagaflow/INBOX.md and fires a desktop notification. Kill your terminal mid-run and re-launch: the workflow resumes from the last completed activity.

Install

pip install sagaflow

Requirements:

  • Python 3.11+
  • Temporal CLI running locally: brew install temporal && temporal server start-dev
  • An Anthropic API key: export ANTHROPIC_API_KEY=sk-ant-...

Optional: set ANTHROPIC_BASE_URL to route through any Anthropic-compatible proxy (Bedrock, a local model gateway, etc.).

Usage

Launch and wait for the result

sagaflow launch hello-world --name alice --await

Fire and forget; check the inbox later

sagaflow launch hello-world --name alice
sagaflow inbox
# [2026-04-22 14:33:22] hello-world-20260422-143322 DONE hello-world  hello, alice
sagaflow dismiss hello-world-20260422-143322

Diagnose a broken setup

sagaflow doctor
# [OK] temporal
# [OK] transport
# [WARN] worker: no worker polling; will auto-spawn on launch
# [OK] hook

How it works

sagaflow launch <skill> --await
        │
        ▼
preflight → auto-install SessionStart hook
         → auto-spawn worker daemon if none running
         → submit workflow to Temporal (localhost:7233)
         │
         ▼
worker daemon polls task queue "sagaflow"
         runs @workflow.defn → executes activities:
           • write_artifact     (file I/O)
           • spawn_subagent     (Anthropic SDK or `claude -p`)
           • emit_finding       (INBOX + desktop notify)
         │
         ▼
4-layer result-surfacing safety net:
  1. --await completion → caller prints
  2. ~/.sagaflow/INBOX.md (append-only)
  3. SessionStart hook → next Claude Code session surfaces unread
  4. desktop notification (osascript / notify-send)

If the worker crashes mid-run, the next sagaflow launch auto-spawns a fresh one and Temporal resumes from the last completed activity.

Generic interpreter

Any claude-skill with a SKILL.md is automatically Temporal-runnable — no Python needed:

sagaflow launch my-new-skill --arg topic='something' --await

sagaflow reads the SKILL.md, runs Claude in a tool-use loop where each tool call is a distinct Temporal activity, and writes the result to ~/.sagaflow/runs/<id>/. If the worker crashes mid-run, Temporal resumes from the last completed activity.

For skills that benefit from explicit parallelism (fan-out critics, independent judges), add a workflow.py alongside the SKILL.md in claude-skills. sagaflow discovers it at runtime.

Mission mode (ex-swarmd)

Run a claude agent against success criteria with tamper detection, anti-cheat, and progress monitoring:

sagaflow mission launch mission.yaml
sagaflow mission status <workflow-id>
sagaflow mission abort <workflow-id>

See docs/specs/ for mission.yaml format and observer details.

Skills

Skills live in the claude-skills repo (~/.claude/skills/). sagaflow discovers them dynamically at worker startup — zero skill-specific imports in sagaflow. 11 skills have bespoke Temporal workflows:

Skill What it does
hello-world Framework smoke test — greets a name and emits a finding
deep-qa Multi-round QA of docs, code, research, or skills with parallel critics and synthesis
deep-debug Hypothesis-driven debugging: generate → judge → synthesize root-cause report
deep-research WHO/WHAT/HOW/WHERE/WHEN/WHY dimension expansion with per-direction findings
deep-design Draft spec → critique × N → redesign → final spec.md
deep-plan Planner → Architect → Critic consensus loop with ADR output
proposal-reviewer Claim extraction + 4-dimension critique + fact-check + assembly
team Plan → PRD → N parallel workers → verify → fix loop
autopilot Expand → plan → exec → qa → validate (3 judges) → completion report
loop-until-done PRD + falsifiability judge + per-criterion verify loop until all pass
flaky-test-diagnoser Multi-run N × → hypothesis generation → judge → report

All skills use the same transport layer (Anthropic SDK or claude -p subprocess) and the same 4-layer result-surfacing (INBOX → SessionStart hook → desktop notify → --await return).

Writing a new skill

Simple skill (no Python): Add ~/.claude/skills/my-skill/SKILL.md. Done — the generic interpreter handles it.

Bespoke skill (with parallelism): Add __init__.py + workflow.py alongside SKILL.md. The workflow imports sagaflow types (SpawnSubagentInput, WriteArtifactInput, retry policies) and is discovered dynamically. See ~/.claude/skills/hello-world-temporal/ for the minimal example.

Development

git clone https://github.com/npow/sagaflow
git clone https://github.com/npow/claude-skills ~/.claude/skills  # or your existing checkout
cd sagaflow
python -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]"

ruff check sagaflow tests
mypy sagaflow
pytest

# Opt-in end-to-end tests (require live Temporal + real Anthropic access)
SAGAFLOW_E2E=1 pytest

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

sagaflow-0.7.3.tar.gz (236.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

sagaflow-0.7.3-py3-none-any.whl (164.9 kB view details)

Uploaded Python 3

File details

Details for the file sagaflow-0.7.3.tar.gz.

File metadata

  • Download URL: sagaflow-0.7.3.tar.gz
  • Upload date:
  • Size: 236.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for sagaflow-0.7.3.tar.gz
Algorithm Hash digest
SHA256 78d121cdb09e4250f274c59564fe31db240e3b64240c62844e23929516336f29
MD5 a1ad97a1ada23cb60a5c81518f3f96c2
BLAKE2b-256 838080e9b22cee13130570f8da362f3a1b7906034fa1cf885f583a1503c8b3b9

See more details on using hashes here.

Provenance

The following attestation bundles were made for sagaflow-0.7.3.tar.gz:

Publisher: publish.yml on npow/sagaflow

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file sagaflow-0.7.3-py3-none-any.whl.

File metadata

  • Download URL: sagaflow-0.7.3-py3-none-any.whl
  • Upload date:
  • Size: 164.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for sagaflow-0.7.3-py3-none-any.whl
Algorithm Hash digest
SHA256 576e8fb8cb969e2ea1ec9d21542032c4894d0b3afde5c72bfbb0dec3748d4005
MD5 72c9d5f1f3c97f1640091dd6e6b2b946
BLAKE2b-256 cf68f80ec9c418f186f00106f20e98bba23667595b7cb452d2d1309ee5bb09ed

See more details on using hashes here.

Provenance

The following attestation bundles were made for sagaflow-0.7.3-py3-none-any.whl:

Publisher: publish.yml on npow/sagaflow

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page