Explains step-based workflow system for Synapse plugin actions. Use when the user mentions "BaseStep", "StepRegistry", "Orchestrator", "StepResult", "BaseStepContext", "step-based workflow", "workflow steps", "rollback", "progress_weight", or needs help with multi-step action development.
View on GitHubdatamaker-kr/synapse-claude-marketplace
synapse-plugin-helper
plugins/synapse-plugin-helper/skills/step-workflow/SKILL.md
February 5, 2026
Select agents to install to:
npx add-skill https://github.com/datamaker-kr/synapse-claude-marketplace/blob/main/plugins/synapse-plugin-helper/skills/step-workflow/SKILL.md -a claude-code --skill synapse-step-workflowInstallation paths:
.claude/skills/synapse-step-workflow/# Step-based Workflow System
Synapse SDK provides a step-based workflow system for complex actions that need:
- Multi-phase execution with progress tracking
- Automatic rollback on failure
- State sharing between steps
- Conditional step execution
## Core Components
| Component | Purpose |
|-----------|---------|
| `BaseStep` | Abstract step definition |
| `StepResult` | Step execution result |
| `StepRegistry` | Ordered step registration |
| `Orchestrator` | Step execution with rollback |
| `BaseStepContext` | State sharing between steps |
## Quick Start
```python
from dataclasses import dataclass, field
from synapse_sdk.plugins.steps import (
BaseStep,
StepResult,
StepRegistry,
Orchestrator,
BaseStepContext,
)
from synapse_sdk.plugins.context import RuntimeContext
# 1. Define context for state sharing
@dataclass
class ProcessContext(BaseStepContext):
data: list = field(default_factory=list)
processed: int = 0
# 2. Define steps
class LoadStep(BaseStep[ProcessContext]):
@property
def name(self) -> str:
return 'load'
@property
def progress_weight(self) -> float:
return 0.3
def execute(self, ctx: ProcessContext) -> StepResult:
ctx.data = load_data()
return StepResult(success=True, data={'count': len(ctx.data)})
class ProcessStep(BaseStep[ProcessContext]):
@property
def name(self) -> str:
return 'process'
@property
def progress_weight(self) -> float:
return 0.7
def execute(self, ctx: ProcessContext) -> StepResult:
for item in ctx.data:
process(item)
ctx.processed += 1
ctx.set_progress(ctx.processed, len(ctx.data))
return StepResult(success=True)
# 3. Register and run
registry = StepRegistry[ProcessContext]()
registry.register(LoadStep())
registry.register(ProcessStep())
context = ProcessContext(runtime_ctx=runtime_ctx)
orchestrator = Orchestrator(registry, context)
result = orchestrator.exeIssues Found: