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, category, visibility, tags, author. Generates a complete project structure ready for development.
Or write one from scratch
from cmdop_skill import Skill, Arg
skill = Skill(name="my-skill", description="Does things", version="1.0.0")
@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()
Framework Features
@skill.command— turn async/sync functions into CLI subcommandsArg()— declarative arguments withhelp,required,default,choices,nargs,action@skill.setup/@skill.teardown— lifecycle hooksTestClient— test harness for skills (client.run()andclient.run_cli())- Auto
src/path —src/is added tosys.pathautomatically - 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", category="security")
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)
Skill Structure
my-skill/
├── pyproject.toml
├── Makefile
├── README.md
├── .gitignore
├── skill/
│ ├── config.py # SkillConfig manifest (required)
│ └── readme.md # description for LLM / marketplace
├── src/my_skill/
│ ├── __init__.py
│ └── ... # your code
└── tests/
skill/config.py — typed manifest:
from cmdop_skill import SkillCategory, SkillConfig
config = SkillConfig(
name="my-skill",
category=SkillCategory.SECURITY,
visibility="public",
)
Fields like version, description, requires, tags, repository_url are auto-filled from pyproject.toml if not set in config.
Available categories
development, code-review, testing, devops, cloud, databases, git, web, apis, data, ai, writing, communication, security, productivity, finance, design, mobile, research, other
Python API
| Export | Description |
|---|---|
Skill |
Main class — registers commands, runs CLI |
Arg |
Argument descriptor with metadata |
SkillConfig |
Typed skill manifest (pydantic model) |
SkillCategory |
Category enum (20 values) |
TestClient |
Test harness — await client.run("cmd", key=val) / await client.run_cli("cmd", "--flag") |
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
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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file cmdop_skill-2026.3.4.5.tar.gz.
File metadata
- Download URL: cmdop_skill-2026.3.4.5.tar.gz
- Upload date:
- Size: 47.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.8
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
97d8f2343337f390599bc156d27d629bce85735b97d6879dc9c9f7a6e9c93d09
|
|
| MD5 |
1005f749421ccec39fe3c0ac069f31be
|
|
| BLAKE2b-256 |
1eae2d844823a07d5ddd80fed212534b9623897341bc6edefee2455900919bdd
|
File details
Details for the file cmdop_skill-2026.3.4.5-py3-none-any.whl.
File metadata
- Download URL: cmdop_skill-2026.3.4.5-py3-none-any.whl
- Upload date:
- Size: 67.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.8
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7e77eff9002445ffea36e20da5b909768c8a3ab283caf62308b8f2d094987654
|
|
| MD5 |
562d7bd53a0e245d5074c3d0eb36c0e2
|
|
| BLAKE2b-256 |
a087eaac956a51b52ff378472ad4335bb111f9c5b89c143b044fe2dc6281a8d7
|