Claude Saga — Development skill for Claude Code
A saga framework for writing claude code hooks.
How to install Claude Saga
This entry records only its repository, not the path inside it, so there is no
exact command to give. Open listfold/claude-saga and copy the folder into
~/.claude/skills/, or the file into ~/.claude/agents/.
What Claude Saga does
A saga framework for writing claude code hooks.
Alternatives in Development
- Scientific Agent Skills — A set of ready to use Agent Skills for research, science, engineering, analysis, finance and writing 18.7k ★
- Create Handoff — You are tasked with writing a handoff document to hand off your work to another agent in a new session 10k ★
- Codex Claude Academic Skills — 本仓库包含三个面向学术科研人员的Skills,覆盖从文献阅读、论文写作到科学计算的完整研究工作流 3.2k ★
README
Claude Saga
A side-effect manager for Python scripts, specifically designed for building maintainable (easy to build, test, debug) [Claude Code hooks](https://docs.anthropic.com/en/docs/claude-code/hooks), inspired by [Redux Saga](https://redux-saga.js.org/).
Disclaimer:
Unstable - API subject to change.
Quick Start
Conceptual overview
from claude_saga import (
BaseSagaState, SagaRuntime,
Call, Put, Select, Log, Stop, Complete,
run_command_effect
)
def add(x, y):
return x + y
class State(BaseSagaState):
math_result: int = 2
command_result: str = ""
def my_saga():
yield Log("info", "Starting saga")
initial_state = yield Select()
math_result = yield Call(add, initial_state.math_result, 3)
command_result = yield Call(run_command_effect, "echo 'Hello World'")
if command_result is None:
yield Log("error", "unable to run command")
yield Stop("hook failed, exited early")
yield Put({"command_result": command_result.stdout, "math_result": math_result})
yield Complete("Saga completed successfully")
runtime = SagaRuntime(State())
final_state = runtime.run(my_saga())
print(final_state.to_json())
Building Claude Code Hooks
Claude Saga handles input/output conventions of claude code hooks:
#!/usr/bin/env python
import json
import sys
from claude_saga import (
BaseSagaState, SagaRuntime,
validate_input_saga, parse_json_saga,
Complete
)
class HookState(BaseSagaState):
# Add your custom state fields
pass
def main_saga():
# Validate and parse input
# https://docs.anthropic.com/en/docs/claude-code/hooks#hook-input
yield from validate_input_saga()
# Adds input data to state
yield from parse_json_saga()
# Your hook logic here
# Complete
yield Complete("Hook executed successfully")
def main():
runtime = SagaRuntime(HookState())
# Final state is an object that conforms to common json fields:
# htt
Related Skills
Writing Hooks
Claude Code / Cowork skill that generates scroll-stopping opening lines for any content. 5 hooks per run acros
Orchestrate Saga
Generate strict <3900-char goal-orchestrator prompt for a saga and lock via /goal
Claude Scholar
Semi-automated research assistant for academic research and software development. Supports Claude Code, OpenCo
Claude Prism
An offline-first scientific writing workspace powered by Claude. LaTeX + Python + 100+ scientific skills all r
GGA — Agent Skills Index
When working on this project, load the relevant skill(s) BEFORE writing any code.
/validate
Run full validation on the current finding before writing a report.
Related Agents
Module Developer
Use this agent when developing features inside a LaraDashboard module — writing controllers, services, models,
Frontend Test Engineer
Use this agent when you need to create, review, or improve unit tests for React frontend components, hooks, an
Claude Code Writer
Explicit file-writing Claude Code CLI mode; requires local authentication and trusted user settings/hooks