Skip to main content

arg-kiss — Keep It Stupidly Simple CLI builder on top of argparse

Project description

arg-kiss — Keep It Stupidly Simple CLI builder on top of argparse

Python PyPI License Platform

Write type-annotated Python functions, get a CLI with argparse's native --help — no magic, no bloat.

arg-kiss is a fork of cliss with one key difference: no custom --help.
It uses argparse's standard help output instead of a custom formatter. If you want coloured help, Argument objects, and more features — use cliss.

✨ Features

  • Zero Dependencies — Pure stdlib: argparse, asyncio, inspect
  • Type-Driven — Automatic arguments from function signatures and type hints
  • Async-Nativeasync def handlers with automatic event loop management
  • Bool Flags — Automatic --name/--no-name mutually exclusive group
  • Command Groups — Nested subcommands via cli.group()
  • Standard --help — Clean argparse output, nothing custom

🚀 Quick Start

Installation

pip install arg-kiss

Usage

from arg_kiss import CLI

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

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

cli.run()
$ python todo.py --help
usage: todo [-h] {add} ...

Task manager

options:
  -h, --help  show this help message and exit

Commands:
  {add}
    add        Add a task.

$ python todo.py add --help
usage: todo add [-h] [--priority PRIORITY] [--done | --no-done] task

Add a task.

positional arguments:
  task

options:
  -h, --help           show this help message and exit
  --priority PRIORITY  (default: 1)
  --done               Enable done
  --no-done            Disable done

📋 API Reference

CLI class

CLI(name="myapp", description="Description")
Parameter Type Default Description
name str None None
description str None None
version str None None

Type → CLI Mapping

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

📖 Examples

Multiple Commands

from arg_kiss import CLI

cli = CLI(name="db", description="Simple database")

db = {}

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

@cli.command()
def get(key: str):
    """Retrieve a value."""
    print(db.get(key, "Not found"))

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

cli.run()
$ python db.py --help
usage: db [-h] {set,get,delete} ...

Simple database

options:
  -h, --help       show this help message and exit

Commands:
  {set,get,delete}
    set            Store a value.
    get            Retrieve a value.
    delete         Delete a key.

$ python db.py set hello world
OK: hello = world

$ python db.py get hello
world

Command Groups

cli = CLI(name="git", description="Version control")

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

@remote.command()
def add(name: str, url: str):
    """Add a remote."""
    print(f"Added remote {name} -> {url}")

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

cli.run()
$ python git.py --help
usage: git [-h] {remote,stash} ...

Version control

options:
  -h, --help       show this help message and exit

Commands:
  {remote,stash}
    remote         Manage remotes
    stash          Stash changes

$ python git.py remote --help
usage: git remote [-h] {add} ...

options:
  -h, --help  show this help message and exit

Subcommands:
  {add}
    add        Add a remote.

$ python git.py remote add origin https://github.com/user/repo
Added remote origin -> https://github.com/user/repo

Async Commands

@cli.command()
async def fetch(url: str, retries: int = 3):
    """Fetch a URL."""
    import httpx
    async with httpx.AsyncClient() as client:
        r = await client.get(url)
        print(f"Status: {r.status_code}")

❓ FAQ

arg-kiss vs cliss?

arg-kiss is a fork of cliss that removes the custom --help formatter. Use arg-kiss if you want:

  • Standard argparse --help output
  • Zero dependencies beyond stdlib
  • Simple, predictable behaviour

Use cliss if you want:

  • Coloured terminal output
  • Argument descriptor objects
  • Custom error messages
  • More features overall

Why fork instead of a flag?

The custom help system in cliss is deeply integrated (custom formatter, colour library, error handling). A fork keeps arg-kiss clean and minimal while letting cliss grow independently.

Bool flags?

Automatic --name/--no-name mutually exclusive group with store_true/store_false.

Async?

async def handlers auto-run with asyncio.run().

📄 License

MIT — see LICENSE file.


Author: Fkernel653
Repository: github.com/Fkernel653/arg-kiss
PyPI: pypi.org/project/arg-kiss
Based on: cliss — a richer CLI framework with coloured help

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

arg_kiss-0.1.1.tar.gz (6.6 kB view details)

Uploaded Source

Built Distribution

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

arg_kiss-0.1.1-py3-none-any.whl (7.7 kB view details)

Uploaded Python 3

File details

Details for the file arg_kiss-0.1.1.tar.gz.

File metadata

  • Download URL: arg_kiss-0.1.1.tar.gz
  • Upload date:
  • Size: 6.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.17 {"installer":{"name":"uv","version":"0.11.17","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"CachyOS Linux","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for arg_kiss-0.1.1.tar.gz
Algorithm Hash digest
SHA256 abe9ef1686b5fd58f0d0c83480752247af5083d4684bbea78a17015ee6bf3a23
MD5 06fe4107599268930f90079b327168df
BLAKE2b-256 ee7e0ec029df0843b562ec7ce114ec8b9c6056638a8639762b4661f9d958ead7

See more details on using hashes here.

File details

Details for the file arg_kiss-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: arg_kiss-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 7.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.17 {"installer":{"name":"uv","version":"0.11.17","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"CachyOS Linux","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for arg_kiss-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 6b3614a3900ad0631c6e6e6812d1d1cd2dc21008bb108e15ff3f4004429f3016
MD5 830bb78ce854d31f2f3e4e172f8f6350
BLAKE2b-256 2ce18695020c6313870b9d92875298aa39f11141453ee5a8a731823240f4a6c9

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