Iii iii-state-management
install
source · Clone the upstream repo
git clone https://github.com/iii-hq/iii
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/iii-hq/iii "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/iii-state-management" ~/.claude/skills/iii-hq-iii-iii-state-management && rm -rf "$T"
manifest:
skills/iii-state-management/SKILL.mdsource content
State Management
Comparable to: Redis, DynamoDB, Memcached
Key Concepts
Use the concepts below when they fit the task. Not every state operation needs all of them.
- State is a scoped key-value store accessed via built-in trigger functions
- state::set writes a value; state::get reads it (returns
for missing keys)null - state::list retrieves all keys in a scope; state::delete removes a key
- state::update performs a partial merge using an
array for fine-grained changesops - Payloads use
,scope
, andkey
to address state entriesvalue - State is shared across all functions — use meaningful scope names to avoid collisions
Architecture
Function → trigger('state::set', { scope, key, value }) → trigger('state::get', { scope, key }) → trigger('state::update', { scope, key, ops }) → trigger('state::delete', { scope, key }) → trigger('state::list', { scope }) → iii-state → KvStore / Redis adapter
iii Primitives Used
| Primitive | Purpose |
|---|---|
| Write a value to state |
| Read a value from state |
| List all keys in a scope |
| Remove a key from state |
| Partial merge with operations array |
Reference Implementation
See ../references/state-management.js for the full working example — functions that read, write, update, and delete state entries across a shared scope.
Also available in Python: ../references/state-management.py
Also available in Rust: ../references/state-management.rs
Common Patterns
Code using this pattern commonly includes, when relevant:
— worker initializationregisterWorker(url, { workerName })
— write statetrigger({ function_id: 'state::set', payload: { scope, key, value } })
— read state (returnstrigger({ function_id: 'state::get', payload: { scope, key } })
if missing)null
— partial mergetrigger({ function_id: 'state::update', payload: { scope, key, ops } })
— enumerate keystrigger({ function_id: 'state::list', payload: { scope } })
— remove entrytrigger({ function_id: 'state::delete', payload: { scope, key } })
— structured loggingconst logger = new Logger()
Adapting This Pattern
Use the adaptations below when they apply to the task.
- Name scopes after your domain (e.g.
,user-sessions
,order-data
)config - Use
with astate::get
check to handle missing keys gracefullynull - Use
withstate::update
for partial updates instead of read-modify-write cyclesops - Combine with
to persist results after async job completioniii-queue-processing
Engine Configuration
iii-state must be enabled in iii-config.yaml with either the
kv adapter (file-based or in-memory) or the separate redis adapter. See ../references/iii-config.yaml for the full annotated config reference.
Pattern Boundaries
- If the task needs reactive side effects when state changes, prefer
.iii-state-reactions - If the task needs real-time client push when data updates, prefer
.iii-realtime-streams - Stay with
when the primary need is reading and writing persistent key-value data.iii-state-management
When to Use
- Use this skill when the task is primarily about
in the iii engine.iii-state-management - Triggers when the request directly asks for this pattern or an equivalent implementation.
Boundaries
- Never use this skill as a generic fallback for unrelated tasks.
- You must not apply this skill when a more specific iii skill is a better fit.
- Always verify environment and safety constraints before applying examples from this skill.