Reliable and introspectable async CLI action framework.
Project description
⚔️ Falyx
Falyx is a battle-ready, introspectable CLI framework for building resilient, asynchronous workflows with:
- ✅ Modular action chaining and rollback
- 🔁 Built-in retry handling
- ⚙️ Full lifecycle hooks (before, after, success, error, teardown)
- 📊 Execution tracing, logging, and introspection
- 🧙♂️ Async-first design with Process support
- 🧩 Extensible CLI menus and customizable output
Built for developers who value clarity, resilience, and visibility in their terminal workflows.
✨ Why Falyx?
Modern CLI tools deserve the same resilience as production systems. Falyx makes it easy to:
- Compose workflows using
Action,ChainedAction, orActionGroup - Inject the result of one step into the next (
last_result) - Handle flaky operations with retries and exponential backoff
- Roll back safely on failure with structured undo logic
- Add observability with execution timing, result tracking, and hooks
- Run in both interactive and headless (scriptable) modes
- Customize output with Rich
Tables (grouping, theming, etc.)
🔧 Installation
pip install falyx
Or install from source:
git clone https://github.com/rolandtjr/falyx.git
cd falyx
poetry install
⚡ Quick Example
import asyncio
import random
from falyx import Falyx
from falyx.action import Action, ChainedAction
# A flaky async step that fails randomly
async def flaky_step():
await asyncio.sleep(0.2)
if random.random() < 0.5:
raise RuntimeError("Random failure!")
return "ok"
# Create the actions
step1 = Action(name="step_1", action=flaky_step)
step2 = Action(name="step_2", action=flaky_step)
# Chain the actions
chain = ChainedAction(name="my_pipeline", actions=[step1, step2])
# Create the CLI menu
falyx = Falyx("🚀 Falyx Demo")
falyx.add_command(
key="R",
description="Run My Pipeline",
action=chain,
preview_before_confirm=True,
confirm=True,
retry_all=True,
)
# Entry point
if __name__ == "__main__":
asyncio.run(falyx.run())
❯ python simple.py
🚀 Falyx Demo
[R] Run My Pipeline
[Y] History [Q] Exit
>
❯ python simple.py run R
Command: 'R' — Run My Pipeline
└── ⛓ ChainedAction 'my_pipeline'
├── ⚙ Action 'step_1'
│ ↻ Retries: 3x, delay 1.0s, backoff 2.0x
└── ⚙ Action 'step_2'
↻ Retries: 3x, delay 1.0s, backoff 2.0x
Confirm execution of R — Run My Pipeline (calls `my_pipeline`) [Y/n] y
[2025-04-15 22:03:57] WARNING ⚠️ Retry attempt 1/3 failed due to 'Random failure!'.
✅ Result: ['ok', 'ok']
📦 Core Features
- ✅ Async-native
Action,ChainedAction,ActionGroup - 🔁 Retry policies + exponential backoff
- ⛓ Rollbacks on chained failures
- 🎛️ Headless or interactive CLI with argparse and prompt_toolkit
- 📊 Built-in execution registry, result tracking, and timing
- 🧠 Supports
ProcessActionfor CPU-bound workloads - 🧩 Custom
Tablerendering for CLI menu views - 🔍 Hook lifecycle:
before,on_success,on_error,after,on_teardown
🔍 Execution Trace
[2025-04-14 10:33:22] DEBUG [Step 1] ⚙ flaky_step()
[2025-04-14 10:33:22] INFO [Step 1] 🔁 Retrying (1/3) in 1.0s...
[2025-04-14 10:33:23] DEBUG [Step 1] ✅ Success | Result: ok
[2025-04-14 10:33:23] DEBUG [My Pipeline] ✅ Result: ['ok', 'ok']
🧱 Core Building Blocks
Action
A single async unit of work. Painless retry support.
ChainedAction
Run tasks in sequence. Supports rollback on failure and context propagation.
ActionGroup
Run tasks in parallel. Useful for fan-out operations like batch API calls.
ProcessAction
Offload CPU-bound work to another process — no extra code needed.
Falyx
Your CLI controller — powers menus, subcommands, history, bottom bars, and more.
ExecutionContext
Tracks metadata, arguments, timing, and results for each action execution.
HookManager
Registers and triggers lifecycle hooks (before, after, on_error, etc.) for actions and commands.
🧠 Design Philosophy
“Like a phalanx: organized, resilient, and reliable.”
Falyx is designed for developers who don’t just want CLI tools to run — they want them to fail meaningfully, recover gracefully, and log clearly.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file falyx-0.1.60.tar.gz.
File metadata
- Download URL: falyx-0.1.60.tar.gz
- Upload date:
- Size: 86.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/2.1.3 CPython/3.13.5 Linux/6.15.5-arch1-1
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e84c369792a36ec5db14f696243ff724ee56f210ae2b28433acb17a0114f35ab
|
|
| MD5 |
91d200fe3c69baf17e4242ac87dce448
|
|
| BLAKE2b-256 |
2fa6f9c05e89748aa913007f5439dc8bccadfcf146b2fa5f66fd70acad5c8494
|
File details
Details for the file falyx-0.1.60-py3-none-any.whl.
File metadata
- Download URL: falyx-0.1.60-py3-none-any.whl
- Upload date:
- Size: 121.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/2.1.3 CPython/3.13.5 Linux/6.15.5-arch1-1
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
af96d4c1bde9a5c74a037fa9edab7ac441ce284cf0f0aead6de3bef9500ad55f
|
|
| MD5 |
975e66b59d975aaeb92e6f67e5b8d838
|
|
| BLAKE2b-256 |
423822b50118a6419bf588a74acd42e462c490a445847aa63d414ee4daa98892
|