Skip to main content

Build and publish CMDOP skills

Project description

cmdop-skill

Build and publish CMDOP skills.

Install

pip install cmdop-skill

Quick Start

Create a new skill (scaffold wizard)

cmdop-skill init

Interactive wizard: name (with PyPI availability check), description, author. Category, tags, and visibility are determined automatically by the server during publish.

Or write one from scratch

from cmdop_skill import Skill, Arg

skill = Skill()  # name, version, description from pyproject.toml

@skill.command
async def greet(name: str = Arg(help="Who to greet", required=True)) -> dict:
    """Say hello."""
    return {"message": f"Hello, {name}!"}

if __name__ == "__main__":
    skill.run()

Skill() and SkillConfig() auto-resolve name, version, description from the nearest pyproject.toml. Explicit arguments still win:

skill = Skill(name="override-name")  # only name overridden, rest from pyproject.toml

Framework Features

  • @skill.command — turn async/sync functions into CLI subcommands
  • Arg() — declarative arguments with help, required, default, choices, nargs, action
  • @skill.setup / @skill.teardown — lifecycle hooks
  • TestClient — test harness for skills (client.run() and client.run_cli())
  • pyproject.toml as single source of truthname, version, description auto-resolved; no duplication
  • Auto src/ pathsrc/ is added to sys.path automatically
  • JSON output — all commands return {"ok": true, ...} by default

CLI Commands

Command Description
init [path] Scaffold a new skill project (interactive wizard)
install <path> Symlink skill into system skills directory
uninstall <name> Remove skill from system skills directory
run <path> <prompt> Run skill via cmdop SDK
test <path> Run pytest in skill directory
bump [path] Bump version in pyproject.toml (semver)
check-name <name> Check if package name is available on PyPI
release [path] Bump + build + upload to PyPI + publish to CMDOP
publish Publish skill to the CMDOP marketplace
list List your published skills
config set-key Save API key globally
config show Show saved config (key masked)
config reset Remove saved API key

init

cmdop-skill init                        # scaffold in current directory
cmdop-skill init ./skills               # scaffold in ./skills/

Also available programmatically:

from cmdop_skill.scaffold import ScaffoldConfig, scaffold_skill

config = ScaffoldConfig(name="my-skill", description="Does things")
files = scaffold_skill(config, target_dir=Path("."))

config

API key is resolved in order: --api-key flag > CMDOP_API_KEY env > saved config > interactive prompt.

cmdop-skill config set-key              # interactive (masked input)
cmdop-skill config set-key cmdop_xxx    # direct
cmdop-skill config show
cmdop-skill config reset

On auth errors (401/403), the CLI prompts for a new key and saves it automatically.

install / uninstall

cmdop-skill install ./skills/my-skill
# Installed my-skill -> ~/Library/Application Support/cmdop/skills/my-skill (symlink)

cmdop-skill uninstall my-skill

bump

cmdop-skill bump                        # patch: 0.1.0 -> 0.1.1
cmdop-skill bump --minor                # minor: 0.1.1 -> 0.2.0
cmdop-skill bump --major                # major: 0.2.0 -> 1.0.0

check-name

cmdop-skill check-name my-cool-skill
# my-cool-skill is available on PyPI

cmdop-skill check-name requests
# requests is taken on PyPI

release

cmdop-skill release                     # bump patch + build + PyPI + CMDOP
cmdop-skill release -b minor            # bump minor
cmdop-skill release --no-bump           # current version
cmdop-skill release --test-pypi         # TestPyPI only (skips CMDOP)
cmdop-skill release --no-publish        # PyPI only (skips CMDOP)

Publish

Only the skill name is required to create a skill on the marketplace. Everything else is automatic:

  • Category — determined by the server from manifest keywords
  • Tags — extracted from pyproject.toml keywords
  • Description — from README / pyproject.toml
  • Repository URL — from pyproject.toml
  • Visibility — public by default
  • Translations — generated server-side via LLM
cmdop-skill publish --path .            # publish to prod
cmdop-skill publish --mode local        # publish to localhost:8000
cmdop-skill publish --json              # CI mode (no interactive prompts)

Skill Structure

my-skill/
├── pyproject.toml
├── Makefile
├── README.md
├── .gitignore
├── skill/
│   ├── config.py            # SkillConfig manifest (required)
│   ├── skill.md             # skill system prompt / description
│   └── readme.md            # description for marketplace
├── src/my_skill/
│   ├── __init__.py
│   └── ...                  # your code
└── tests/

skill/config.py — minimal manifest:

from cmdop_skill import SkillConfig

config = SkillConfig()

All metadata (name, version, description) is auto-resolved from pyproject.toml. Category, tags, and visibility are determined automatically by the server during publish.

Python API

Export Description
Skill Main class — registers commands, runs CLI
Arg Argument descriptor with metadata
SkillConfig Typed skill manifest (pydantic model)
TestClient Test harness — await client.run("cmd", key=val) / await client.run_cli("cmd", "--flag")
resolve_project_meta Resolve name/version/description from nearest pyproject.toml
generate_manifest Generate skill/config.py content
publish_skill Programmatic publish to marketplace
json_output / wrap_result / format_error Output formatting helpers
scaffold.ScaffoldConfig Pydantic model for scaffold parameters
scaffold.scaffold_skill Generate a complete skill directory from config

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

cmdop_skill-2026.3.5.5.tar.gz (51.0 kB view details)

Uploaded Source

Built Distribution

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

cmdop_skill-2026.3.5.5-py3-none-any.whl (71.4 kB view details)

Uploaded Python 3

File details

Details for the file cmdop_skill-2026.3.5.5.tar.gz.

File metadata

  • Download URL: cmdop_skill-2026.3.5.5.tar.gz
  • Upload date:
  • Size: 51.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.8

File hashes

Hashes for cmdop_skill-2026.3.5.5.tar.gz
Algorithm Hash digest
SHA256 472ce4dcc80cc045280687638e33a4707457e7ffe36b7baa53f3f1ac0968fb78
MD5 b65486e4c971ecc8b6707d470e3fd032
BLAKE2b-256 d4a91b62a8a8270c3b4f0d1a88b9891206952c14fe5518dcfc010188104773d1

See more details on using hashes here.

File details

Details for the file cmdop_skill-2026.3.5.5-py3-none-any.whl.

File metadata

File hashes

Hashes for cmdop_skill-2026.3.5.5-py3-none-any.whl
Algorithm Hash digest
SHA256 97fcebb65e71616ce2b3949fad17471b6f890cb098e3e162c6233c92d7f5d679
MD5 8e4c4c634095e82037187136f49b8499
BLAKE2b-256 f1df180012a6203e41935c53bfbffc4d21362deac6be9ad658095de7355c9d0e

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