Skip to main content

A lightweight framework for building CLI applications on top of argparse

Project description

cliss — A lightweight framework for building CLI applications on top of argparse

Python PyPI License Platform Ruff

Write type-annotated Python functions, get a full CLI — automatic --help, validation, and async support.

✨ Features

  • Zero Dependencies — Pure stdlib: argparse, asyncio, inspect
  • Type-Driven — Automatic arguments from function signatures and type hints
  • Flexible — Declarative Argument objects, type inference, or both
  • Async-Nativeasync def handlers with automatic event loop management
  • Global Args — Define flags shared across all commands
  • Coloured Help — Beautiful terminal output via color-kiss, an ultra-lightweight library for readability and development speed
  • Bool Flags — Automatic --name/--no-name mutually exclusive group
  • argparse Access — Full access to underlying parsers for advanced use

🚀 Quick Start

Installation

pip install cliss

Usage

from cliss import CLI

cli = CLI(name="todo", description="Task manager", version="1.0.0")

@cli.command()
def add(task: str, priority: int = 1, done: bool = False):
    """Add a task."""
    status = "✓" if done else "○"
    return f"[{status}] {task} (priority: {priority})"

cli.run()
$ python todo.py add "Buy milk" --priority 2
[] Buy milk (priority: 2)

$ python todo.py add "Call mom" --done
[] Call mom (priority: 1)

$ python todo.py add "Test" --no-done
[] Test (priority: 1)

📋 API Reference

CLI class

CLI(name="myapp", description="...", version="1.0.0")
Parameter Type Default Description
name str None Program name in help
description str None Description in help
version str None Adds --version flag
usage str "{self.name} [COMMAND] [OPTIONS] [ARGS]...\n" Custom usage string

Colours with color-kiss

cliss uses color-kiss — an ultra-lightweight ANSI color library — for readable, fast, and dependency-free terminal styling. No bloat, just colors.

from color_kiss import BOLD_GREEN, BOLD_RED, RESET
print(f"{BOLD_GREEN}Success!{RESET}")

Argument class

from cliss import Argument

Argument("--output", "-o", type=str, default=None, help="...", choices=["json","csv"], action="store_true")
Parameter Type Default Description
*flags str Argument flags
type type str Value type
default Any None Default value
help str "" Help text
required bool False Make required
choices list None Allowed values
action str None argparse action

Type → CLI Mapping

Function Signature CLI Argument
name: str Positional name
count: int = 1 --count (default: 1)
verbose: bool = False --verbose/--no-verbose
mode: str = None --mode (default: None)

📖 Examples

CRUD Application

from cliss import CLI

cli = CLI(name="db")
db = {}

@cli.command()
def set(key: str, value: str):
    db[key] = value
    return f"OK: {key} = {value}"

@cli.command()
def get(key: str):
    return db.get(key, "Not found")

@cli.command()
def delete(key: str, force: bool = False):
    if force or key in db:
        db.pop(key, None)
        return f"Deleted: {key}"
    return f"Not found (use --force)"

cli.run()

Command Groups

cli = CLI(name="git")

remote = cli.group("remote", "Manage remotes")
stash = cli.group("stash", "Stash changes")

@remote.command()
def add(name: str, url: str):
    return f"Added remote {name}"

@stash.command()
def push(message: str = ""):
    return f"Stashed: {message or 'WIP'}"

cli.run()

Async Commands

@cli.command()
async def fetch(url: str, retries: int = 3):
    return f"Fetched {url} (retries: {retries})"

❓ FAQ

Why cliss over argparse/Click/Typer/Fire?

Tool Deps Style
cliss 0 + color-kiss (lightweight) Decorators + type hints
Fire 2 (termcolor, colorama) Introspection
Click 0 Decorators
Typer (0.26.0+) 0 Type hints

cliss = Fire's zero-bloat philosophy + Typer's type-driven design. ~300 lines, pure stdlib, with color-kiss for pretty output.

Bool flags?

Automatic --name/--no-name mutually exclusive group. store_true by default, store_false if default is True.

Async?

async def handlers auto-run with asyncio.run(). Sync functions returning coroutines also work.

argparse access?

cli.parser and cli.subparsers are standard argparse objects. Mutually exclusive groups, custom actions, parent parsers — all available.

📄 License

MIT — see LICENSE file.


Author: Fkernel653 Repository: github.com/Fkernel653/cliss PyPI: pypi.org/project/cliss

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

cliss-0.7.8.tar.gz (12.9 kB view details)

Uploaded Source

Built Distribution

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

cliss-0.7.8-py3-none-any.whl (11.6 kB view details)

Uploaded Python 3

File details

Details for the file cliss-0.7.8.tar.gz.

File metadata

  • Download URL: cliss-0.7.8.tar.gz
  • Upload date:
  • Size: 12.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.19 {"installer":{"name":"uv","version":"0.11.19","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for cliss-0.7.8.tar.gz
Algorithm Hash digest
SHA256 8d13b9628856575c4ef4591b234541d98872ff981804aab94c1d33fba6e89078
MD5 c9f66c0af684fdb1725d5175625aab7d
BLAKE2b-256 0f2598abaad6a44801cb7e3804743d8d05aa06edb8a3d9da384fbb6c82690519

See more details on using hashes here.

File details

Details for the file cliss-0.7.8-py3-none-any.whl.

File metadata

  • Download URL: cliss-0.7.8-py3-none-any.whl
  • Upload date:
  • Size: 11.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.19 {"installer":{"name":"uv","version":"0.11.19","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for cliss-0.7.8-py3-none-any.whl
Algorithm Hash digest
SHA256 3127b5e1fda543004364aa42e0efe08dad83039bcf23ad7f92478a45205d5e0f
MD5 80dea6d98f90d1443469f8ac3c26701c
BLAKE2b-256 ce7e20467643f2047230b9608c386ffdc03f8ad4dc0b1da66627e878b2965c5e

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