Skip to main content

Reliable and introspectable async CLI action framework.

Project description

⚔️ Falyx

Python License Async-Ready

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, 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 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 ProcessAction for CPU-bound workloads
  • 🧩 Custom Table rendering 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

falyx-0.1.46.tar.gz (73.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

falyx-0.1.46-py3-none-any.whl (103.0 kB view details)

Uploaded Python 3

File details

Details for the file falyx-0.1.46.tar.gz.

File metadata

  • Download URL: falyx-0.1.46.tar.gz
  • Upload date:
  • Size: 73.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/2.1.2 CPython/3.13.2 Linux/6.14.2-arch1-1

File hashes

Hashes for falyx-0.1.46.tar.gz
Algorithm Hash digest
SHA256 72bc6f5d49d28b67ad8fb664fe71c9c1a6c8a61eb54f7c41b736d0a84f4a0316
MD5 964b4bcde40cae5b849545a94d9d989c
BLAKE2b-256 902b883a6a56655cbd73a47e52b014a08992aec7244fe11871103b2658905b83

See more details on using hashes here.

File details

Details for the file falyx-0.1.46-py3-none-any.whl.

File metadata

  • Download URL: falyx-0.1.46-py3-none-any.whl
  • Upload date:
  • Size: 103.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/2.1.2 CPython/3.13.2 Linux/6.14.2-arch1-1

File hashes

Hashes for falyx-0.1.46-py3-none-any.whl
Algorithm Hash digest
SHA256 b2a2122ffc25e237a6b0d31e8c619cadc5b071e5dc9da67d0537468e3b9c0cd1
MD5 a1216536287079b2de7afad9f56e9342
BLAKE2b-256 bede0f75e07189df7378376ea8aedc82e8eb789eef24f6dd8aa37f54e2c1a399

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page