# βš”οΈ Falyx **Falyx** is a resilient, introspectable CLI framework for building robust, asynchronous command-line 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`, or `ActionGroup` - 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 or headless (scriptable) modes - Customize output with Rich `Table`s (grouping, theming, etc.) --- ## πŸ”§ Installation ```bash pip install falyx ``` > Or install from source: ```bash git clone https://github.com/yourname/falyx.git cd falyx poetry install ``` --- ## ⚑ Quick Example ```python from falyx import Action, ChainedAction, Menu from falyx.hooks import RetryHandler, log_success async def flaky_step(): import random, asyncio await asyncio.sleep(0.2) if random.random() < 0.8: raise RuntimeError("Random failure!") return "ok" retry = RetryHandler() step1 = Action("Step 1", flaky_step) step1.hooks.register("on_error", retry.retry_on_error) step2 = Action("Step 2", flaky_step) step2.hooks.register("on_error", retry.retry_on_error) chain = ChainedAction("My Pipeline", [step1, step2]) chain.hooks.register("on_success", log_success) menu = Menu(title="πŸš€ Falyx Demo") menu.add_command("R", "Run My Pipeline", chain) if __name__ == "__main__": import asyncio asyncio.run(menu.run()) ``` --- ## πŸ“¦ 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 `ProcessAction` for CPU-bound workloads - 🧩 Custom `Table` rendering for CLI menu views - πŸ” Hook lifecycle: `before`, `on_success`, `on_error`, `after`, `on_teardown` --- ## πŸ” Execution Trace ```bash [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'] ``` --- ## 🧩 Components | Component | Purpose | |------------------|--------------------------------------------------------| | `Action` | Single async task with hook + result injection support | | `ChainedAction` | Sequential task runner with rollback | | `ActionGroup` | Parallel runner for independent tasks | | `ProcessAction` | CPU-bound task in a separate process (multiprocessing) | | `Menu` | CLI runner with toggleable prompt or headless mode | | `ExecutionContext`| Captures metadata per execution | | `HookManager` | Lifecycle hook registration engine | --- ## 🧠 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**. --- ## πŸ›£οΈ Roadmap - [ ] Retry policy DSL (e.g., `max_retries=3, backoff="exponential"`) - [ ] Metrics export (Prometheus-style) - [ ] Plugin system for menu extensions - [ ] Native support for structured logs + log forwarding - [ ] Web UI for interactive execution history (maybe!) --- ## πŸ§‘β€πŸ’Ό License MIT β€” use it, fork it, improve it. Attribution appreciated! --- ## 🌐 falyx.dev β€” **reliable actions, resilient flows** ---