Skip to main content

Lean CLI framework for AI-friendly micro-apps

Project description

microcli-toolkit

Lean CLI framework for AI-friendly micro-apps

Microcli is a decorator-based CLI framework designed for building tools that agents can use. Unlike traditional CLIs that return data, microcli tools return instructions that guide the next step.

Installation

pip install microcli-toolkit
# or
uv add microcli-toolkit

Quick Start

#!/usr/bin/env python3
from typing import Annotated
import microcli as m

@m.command
def hello(name: Annotated[str, "Your name"]):
    """Greet a user."""
    m.ok(f"Hello, {name}!")

if __name__ == "__main__":
    m.main()
python hello.py hello Alice
# ✓ Hello, Alice!

Composing apps with App + mount

The module-level m.command / m.main() shorthand is fine for one-file scripts. When you want to compose multiple sub-CLIs under one entry point, construct explicit App instances and mount them under prefix keys:

import microcli as m
from mosaico import app as mosaico_app
from mira import app as mira_app

root = m.App(name="claude-toolkit", description="Alex's agent toolbox.")
root.mount("image", mosaico_app)   # claude-toolkit image gen ...
root.mount("mira", mira_app)       # claude-toolkit mira search ...

@root.command
def hello(name: str):
    m.ok(f"Hello, {name}!")

if __name__ == "__main__":
    root.main()

Each App owns its own command registry — there are no name clashes between sub-apps. Mount-prefix collisions raise at mount time. --tour propagates naturally: claude-toolkit --tour shows the root tour and lists mounts; claude-toolkit image --tour shows mosaico's tour as if invoked standalone.

The Three Principles

  1. Validate before acting — Check inputs before executing
  2. Return descriptive messages — Tell the agent what to do next
  3. Use two-phase patterns — Draft → Save for safety

Parameters

Style Becomes
No default Positional argument (required)
Has default --flag optional argument
bool type Boolean flag (--flag or nothing)
def cmd(name):                    # python cmd.py cmd John
def cmd(name="World"):            # python cmd.py cmd --name John  
def cmd(verbose: bool = False):  # python cmd.py cmd --verbose

Use Annotated[type, "help text"] to add help documentation.

Utilities

Status Helpers

  • m.ok(msg) — ✓ Success message
  • m.fail(msg) — ✗ Error message + exit(1)
  • m.info(msg) — → Informational message
  • m.warn(msg) — ⚠ Warning message
  • m.step(msg) — → Step indicator

File Operations

  • m.read(path) — Read file contents
  • m.write(path, content) — Write to file
  • m.ls() / m.glob(pattern) — List files
  • m.touch(path) — Create empty file
  • m.rm(path, recursive) — Remove file/directory
  • m.cp(src, dst) — Copy file/directory
  • m.mv(src, dst) — Move/rename

Shell

  • m.sh(cmd, timeout) — Run shell command, returns Result
  • m.which(cmd) — Find command in PATH

Navigation

  • with m.cd(path): — Context manager for directory changes
  • m.env(name) — Get environment variable

Design Patterns

Two-Phase (Safety)

if not save:
    m.info("Draft mode. Rerun with --save to persist")
    return
# ... save operation

Validation First

content = sys.stdin.read().strip()
if not content:
    m.fail("No content provided via stdin")

Descriptive Outputs

# Bad:  return  # silent
# Good: m.ok("Saved to: " + str(filepath))

Follow-up Commands (.explain)

if not save:
    m.info("Draft mode. Rerun with --save:")
    m.info("  " + create.explain(title=title, save=True))
    return

--learn Mode

Auto-discovers command tours by analyzing source code:

python tool.py --learn              # Show all commands
python tool.py --learn create       # Show focused view for 'create'

Output includes:

  • Next steps — Commands discovered via .explain() calls
  • Failure modes — Errors discovered via m.fail() calls
  • Happy paths — Success messages via m.ok() calls

Complex Types from stdin

For complex data structures, use stdin[T] to read JSON from stdin. Requires pydantic extra:

uv add microcli-toolkit --extra pydantic

Basic Usage

from microcli import command, stdin

@command
def create(
    title: str,
    metadata: stdin[dict],
):
    """Create a resource with metadata."""
    m.ok(f"Creating {title} with {len(metadata)} properties")
echo '{"tags": ["a", "b"], "priority": 1}' | python cmd.py create "My Title"

With Pydantic Models

from microcli import command, stdin
from pydantic import BaseModel

class NoteMetadata(BaseModel):
    title: str
    tags: list[str] = []
    priority: int = 1

@command
def create(
    content: str,
    metadata: stdin[NoteMetadata],
):
    """Create a note with metadata."""
    m.ok(f"Creating note: {metadata.title} (priority: {metadata.priority})")
echo '{"title": "My Note", "tags": ["work", "urgent"]}' | python note.py create "Note body"

Error Handling

Invalid JSON:

✗ Invalid JSON: Expecting value

Pydantic validation errors:

✗ Validation error: 2 validation errors

License

MIT

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

microcli_toolkit-0.4.0.tar.gz (58.3 kB view details)

Uploaded Source

Built Distribution

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

microcli_toolkit-0.4.0-py3-none-any.whl (23.2 kB view details)

Uploaded Python 3

File details

Details for the file microcli_toolkit-0.4.0.tar.gz.

File metadata

  • Download URL: microcli_toolkit-0.4.0.tar.gz
  • Upload date:
  • Size: 58.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.16 {"installer":{"name":"uv","version":"0.11.16","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 microcli_toolkit-0.4.0.tar.gz
Algorithm Hash digest
SHA256 092528b8aa722246a9b2774bd7b20317d230bb2e1de30c82a688deb8504a65b2
MD5 31ddc75f1a3de4614974790ff63267ed
BLAKE2b-256 66b8577a4bd15278244d871666332b0bb1e6899cf3d33b8f961910d9d5f4a164

See more details on using hashes here.

File details

Details for the file microcli_toolkit-0.4.0-py3-none-any.whl.

File metadata

  • Download URL: microcli_toolkit-0.4.0-py3-none-any.whl
  • Upload date:
  • Size: 23.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.16 {"installer":{"name":"uv","version":"0.11.16","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 microcli_toolkit-0.4.0-py3-none-any.whl
Algorithm Hash digest
SHA256 8b4b83184f3e309fad30e2f08defe7a6f361252ad81336cbdf2a7205830b54b8
MD5 8e2fce8559bb68c676d88654056f6115
BLAKE2b-256 862d07c50b8639b7675fa5e9b5d6b7269de4f52ff484a0cb78bad95d21c348f0

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