
Prompt Library
- 6 installs
- Updated March 18, 2026
- broomva/prompt-library
prompt-library is a Claude Code skill that manages and retrieves reusable, versioned prompts from a prompt repository via a JSON API, supporting pull, push, update, and delete.
About
prompt-library is a skill for managing and retrieving reusable, versioned prompts from broomva.tech or any compatible prompt repository. It pulls prompts by slug, category, or tag, supports variable substitution, and can push, update, or soft-delete prompts remotely through an authenticated JSON API. A developer uses it to fetch a reusable system prompt for a task or to save a prompt for later reuse. The default endpoint is https://broomva.tech/api/prompts and the endpoint is configurable.
- Pull, push, and update reusable prompts by slug, category, or tag via a JSON API
- Supports remote push/update/delete with OAuth session-token auth
- Configurable --endpoint so any compatible prompt repository can be targeted
Prompt Library by the numbers
- 6 all-time installs (skills.sh)
- Ranked #12,756 of 16,546 AI & Agent Building skills by installs in the Skillselion catalog
- Data as of Jul 8, 2026 (Skillselion catalog sync)
prompt-library capabilities & compatibility
Free to read public prompts; remote writes require an OAuth session token from broomva.tech.
- Capabilities
- prompt management · prompt retrieval · prompt versioning
- Works with
- github · vercel
- Use cases
- orchestration · documentation
- Pricing
- Bring your own API key
What prompt-library says it does
Manage and retrieve reusable prompts from broomva.tech or any compatible prompt repository.
All commands accept `--endpoint URL` to target a different prompt repository.
The token is your OAuth session token — it's user-scoped and auto-expires. No static API keys needed.
npx skills add https://github.com/broomva/prompt-library --skill prompt-libraryAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 6 |
|---|---|
| Last updated | March 18, 2026 |
| Repository | broomva/prompt-library ↗ |
What it does
Pull, save, and update reusable versioned prompts and agent directives from a prompt repository via a JSON API.
Who is it for?
Fetching, saving, and versioning reusable system prompts and agent directives across projects.
Skip if: Ad-hoc one-off prompts with no reuse value or repositories without the standard prompt API contract.
When should I use this skill?
A user asks for a named prompt or system instruction, or wants to save a prompt for reuse.
What you get
Prompts are pulled, pushed, and versioned through a single JSON API from any compatible repository.
- Retrieved prompts
- Prompt MDX files
- Synced prompt records
By the numbers
- 7 documented commands
- 6 API endpoints
- 5 prompt categories
Files
Prompt Library
Manage versioned, parameterized prompts stored in a database and distributed via a JSON API.
Quick Start
Pull a prompt
python3 scripts/prompt-sync.py pull code-review-agentList available prompts
python3 scripts/prompt-sync.py listPull with variable substitution
python3 scripts/prompt-sync.py pull code-review-agent --var language=python --var strictness=strictPush a prompt remotely (over the air)
python3 scripts/prompt-sync.py remote-push \
--title "My Prompt" \
--category system-prompts \
--body "You are a helpful assistant..." \
--tags "tag1,tag2" \
--token "$BROOMVA_API_TOKEN"Commands
Read Commands
| Command | Description |
|---|---|
list | List all prompts (supports --category, --tag, --model filters) |
pull <slug> | Fetch a prompt by slug, print raw content |
Local Write Commands
| Command | Description |
|---|---|
push | Write a new prompt MDX file to local content/prompts/ |
update <slug> | Update an existing local prompt, optionally bump version |
Remote Write Commands (API-based)
| Command | Description |
|---|---|
remote-push | Create a prompt via the remote API (requires auth token) |
remote-update <slug> | Update a prompt remotely (owner or admin only) |
remote-delete <slug> | Soft-delete a prompt remotely (owner or admin only) |
All commands accept --endpoint URL to target a different prompt repository. Default: https://broomva.tech/api/prompts.
Authentication
Remote commands require an API token. Get yours by:
1. Log in at broomva.tech via OAuth (Google/GitHub) 2. Visit https://broomva.tech/api/auth/api-token to get your session token 3. Set it: export BROOMVA_API_TOKEN="your-token-here"
Or pass --token directly to any remote command.
The token is your OAuth session token — it's user-scoped and auto-expires. No static API keys needed.
Admin Features
For the admin user (carlosdavidescobar@gmail.com), remote pushes and updates also:
- Commit the prompt as an MDX file to the GitHub repo
- Trigger a Vercel redeploy automatically
Prompt Schema
See references/prompt-schema.md for the full frontmatter specification.
Key fields:
category: system-prompts, agent-instructions, templates, chains, evaluatorsversion: Semver string for tracking prompt evolutionvariables: Declared template variables with{{name}}syntax and defaultsmodel: Target model (optional)tags: Searchable tag array
Category Taxonomy
See references/categories.md for the full taxonomy.
API Endpoints
| Method | Endpoint | Auth | Description |
|---|---|---|---|
GET | /api/prompts | Public | List prompts (DB + MDX fallback) |
POST | /api/prompts | Required | Create a new prompt |
GET | /api/prompts/[slug] | Public | Get prompt by slug |
PUT | /api/prompts/[slug] | Owner/Admin | Update a prompt |
DELETE | /api/prompts/[slug] | Owner/Admin | Soft-delete a prompt |
GET | /api/auth/api-token | Session | Get your bearer token |
For Other Repositories
Anyone can host their own prompt library:
1. Create a database table for prompts (or use content/prompts/ with .mdx files) 2. Add the API routes: GET /api/prompts, GET /api/prompts/[slug], POST /api/prompts 3. Use --endpoint https://your-site.com/api/prompts with the sync script
The schema and API contract are the standard. The endpoint is configurable.
__pycache__/
*.pyc
.DS_Store
Prompt Library installed
The prompt-library skill is now available. Your agent can pull, list, push, and update prompts from broomva.tech/prompts or any compatible endpoint.
Try it
Ask your agent:
- "Pull the code-review-agent prompt"
- "List available prompts"
- "Save this as a prompt for later"
- "Push this prompt to the library" (requires auth token)
Remote access
To push prompts over the air:
1. Log in at broomva.tech via OAuth 2. Get your token: curl https://broomva.tech/api/auth/api-token 3. Set it: export BROOMVA_API_TOKEN="your-token" 4. Push: prompt-sync.py remote-push --title "..." --category system-prompts --body "..."
API endpoint
Default: https://broomva.tech/api/prompts
Override with --endpoint in the sync script, or point to your own prompt repository.
MIT License
Copyright (c) 2026 Carlos Escobar (BroomVA)
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
prompt-library
Manage and retrieve reusable prompts from broomva.tech or any compatible prompt repository. Pull prompts by slug, category, or tag; push new prompts or update existing ones; list available prompts with filtering.
This is a skills.sh agent skill -- it can be installed by any AI agent that supports the skills protocol.
Features
- Pull prompts by slug with optional variable substitution (
{{name}}syntax) - List available prompts filtered by category, tag, or model
- Push new prompts locally (MDX files) or remotely via authenticated API
- Update and delete prompts with owner/admin scoping
- Configurable endpoint -- point to broomva.tech or your own prompt repository
Quick Start
Pull a prompt
python3 scripts/prompt-sync.py pull code-review-agentList available prompts
python3 scripts/prompt-sync.py listPull with variable substitution
python3 scripts/prompt-sync.py pull code-review-agent \
--var language=python \
--var strictness=strictPush a prompt remotely
python3 scripts/prompt-sync.py remote-push \
--title "My Prompt" \
--category system-prompts \
--body "You are a helpful assistant..." \
--tags "tag1,tag2" \
--token "$BROOMVA_API_TOKEN"Commands
| Command | Description |
|---|---|
list | List all prompts (supports --category, --tag, --model filters) |
pull <slug> | Fetch a prompt by slug, print raw content |
push | Write a new prompt MDX file locally |
update <slug> | Update an existing local prompt, optionally bump version |
remote-push | Create a prompt via the remote API (requires auth token) |
remote-update <slug> | Update a prompt remotely (owner or admin only) |
remote-delete <slug> | Soft-delete a prompt remotely (owner or admin only) |
All commands accept --endpoint URL to target a different prompt repository. Default: https://broomva.tech/api/prompts.
Authentication
Remote write commands require an API token:
1. Log in at broomva.tech via OAuth (Google/GitHub) 2. Get your token: visit https://broomva.tech/api/auth/api-token 3. Set it: export BROOMVA_API_TOKEN="your-token-here"
Or pass --token directly to any remote command.
API Endpoints
| Method | Endpoint | Auth | Description |
|---|---|---|---|
GET | /api/prompts | Public | List prompts |
POST | /api/prompts | Required | Create a new prompt |
GET | /api/prompts/[slug] | Public | Get prompt by slug |
PUT | /api/prompts/[slug] | Owner/Admin | Update a prompt |
DELETE | /api/prompts/[slug] | Owner/Admin | Soft-delete a prompt |
Prompt Schema
Prompts use MDX frontmatter with key fields:
- category:
system-prompts,agent-instructions,templates,chains,evaluators - version: Semver string for tracking prompt evolution
- variables: Declared template variables with
{{name}}syntax and defaults - model: Target model (optional)
- tags: Searchable tag array
See references/prompt-schema.md for the full specification.
Hosting Your Own
Anyone can host a compatible prompt library:
1. Create a database table for prompts (or use content/prompts/ with .mdx files) 2. Add the API routes: GET /api/prompts, GET /api/prompts/[slug], POST /api/prompts 3. Use --endpoint https://your-site.com/api/prompts with the sync script
License
MIT
Prompt Categories
Taxonomy
| Category | Description | Examples |
|---|---|---|
system-prompts | Persona and behavior-defining prompts that set the agent's role, constraints, and output format | Code Review Agent, Brutally Honest Advisor, Deep Thinking Directive |
agent-instructions | Step-by-step workflow instructions for multi-phase tasks | Content Creation Pipeline, Codebase Deep Analysis, Agentic Development Loop |
templates | Structural templates with high variable density, designed to be filled in per use case | Ontology & State Design, UX Interaction Design, Prompt Engineering Guide |
chains | Multi-prompt sequences where the output of one feeds the input of the next | (future: research-then-write, analyze-then-fix) |
evaluators | Prompts that judge or score the output of other prompts or agent actions | (future: output-quality-scorer, safety-checker) |
Adding a New Category
1. Add the category to this file with description and examples 2. Use it in prompt frontmatter: category: your-new-category 3. The API and UI filter automatically pick it up
Prompt Schema Reference
Frontmatter Fields
Every prompt is an .mdx file in content/prompts/ with YAML frontmatter.
Required Fields
| Field | Type | Description |
|---|---|---|
title | string | Human-readable prompt name |
summary | string | One-sentence description of what the prompt does |
date | string (YYYY-MM-DD) | Publication or last-modified date |
published | boolean | Whether the prompt is publicly visible |
Prompt-Specific Fields
| Field | Type | Default | Description |
|---|---|---|---|
category | string | - | Taxonomic grouping (see categories.md) |
version | string | "1.0" | Semver for tracking prompt evolution |
model | string | - | Target model (e.g., "claude-4", "gpt-4o") |
variables | array | - | Template variables the prompt expects |
tags | string[] | [] | Searchable tags |
links | array | [] | Related resources with label and url |
Variable Schema
variables:
- name: language # Variable name (used as {{language}} in body)
description: "..." # Human-readable description
default: "typescript" # Default value if not providedBody
The markdown body after the frontmatter --- is the prompt itself. Use {{variable_name}} for template variables that get substituted at pull time.
API Response Shape
List endpoint (GET /api/prompts)
Returns ContentSummary[]:
[
{
"title": "Code Review Agent",
"summary": "...",
"date": "2026-03-18",
"slug": "code-review-agent",
"kind": "prompts",
"published": true,
"category": "system-prompts",
"version": "1.0",
"model": "claude-4",
"tags": ["code-review", "agent"],
"variables": [{ "name": "language", "description": "...", "default": "typescript" }]
}
]Query parameters: ?category=, ?tag=, ?model=, ?format=full (includes raw content).
Detail endpoint (GET /api/prompts/[slug])
Returns ContentDocument (summary fields plus content and html).
#!/usr/bin/env python3
"""Prompt library sync CLI.
Pull, push, list, and update prompts from a broomva.tech-compatible prompt API.
Usage:
python3 prompt-sync.py list [--category CAT] [--tag TAG] [--model MODEL] [--endpoint URL]
python3 prompt-sync.py pull SLUG [--var KEY=VAL ...] [--endpoint URL] [--raw]
python3 prompt-sync.py push --title TITLE --category CAT --body BODY [--model MODEL] [--tags T1,T2] [--repo-path PATH]
python3 prompt-sync.py update SLUG [--body BODY] [--bump-version] [--repo-path PATH]
python3 prompt-sync.py remote-push --title TITLE --category CAT --body BODY [--token TOKEN] [--endpoint URL]
python3 prompt-sync.py remote-update SLUG [--body BODY] [--title TITLE] [--token TOKEN] [--endpoint URL]
python3 prompt-sync.py remote-delete SLUG [--token TOKEN] [--endpoint URL]
"""
import argparse
import json
import os
import re
import sys
from datetime import date
from pathlib import Path
from urllib.request import Request, urlopen
from urllib.error import HTTPError, URLError
from urllib.parse import urlencode
DEFAULT_ENDPOINT = "https://broomva.tech/api/prompts"
def _get_token(args: argparse.Namespace) -> str:
token = getattr(args, "token", None) or os.environ.get("BROOMVA_API_TOKEN")
if not token:
print("Error: --token or BROOMVA_API_TOKEN env var required", file=sys.stderr)
sys.exit(1)
return token
def api_get(url: str) -> dict | list:
req = Request(url, headers={"Accept": "application/json", "User-Agent": "prompt-sync/1.0"})
try:
with urlopen(req, timeout=15) as resp:
return json.loads(resp.read().decode())
except HTTPError as e:
print(f"HTTP {e.code}: {e.reason}", file=sys.stderr)
sys.exit(1)
except URLError as e:
print(f"Connection error: {e.reason}", file=sys.stderr)
sys.exit(1)
def api_mutate(url: str, method: str, token: str, payload: dict | None = None) -> dict:
data = json.dumps(payload).encode() if payload else None
req = Request(
url,
data=data,
headers={
"Accept": "application/json",
"Content-Type": "application/json",
"Authorization": f"Bearer {token}",
"User-Agent": "prompt-sync/1.0",
},
method=method,
)
try:
with urlopen(req, timeout=30) as resp:
return json.loads(resp.read().decode())
except HTTPError as e:
body = e.read().decode() if e.readable() else e.reason
print(f"HTTP {e.code}: {body}", file=sys.stderr)
sys.exit(1)
except URLError as e:
print(f"Connection error: {e.reason}", file=sys.stderr)
sys.exit(1)
def cmd_list(args: argparse.Namespace) -> None:
params = {}
if args.category:
params["category"] = args.category
if args.tag:
params["tag"] = args.tag
if args.model:
params["model"] = args.model
url = args.endpoint
if params:
url += "?" + urlencode(params)
entries = api_get(url)
if not entries:
print("No prompts found.")
return
max_title = max(len(e.get("title", "")) for e in entries)
max_cat = max((len(e.get("category", "") or "") for e in entries), default=0)
for entry in entries:
title = entry.get("title", "").ljust(max_title)
cat = (entry.get("category") or "").ljust(max_cat)
ver = entry.get("version", "")
slug = entry.get("slug", "")
tags = ", ".join(entry.get("tags", [])[:3])
print(f" {slug:<35} {cat} v{ver:<6} {title} [{tags}]")
def cmd_pull(args: argparse.Namespace) -> None:
url = f"{args.endpoint}/{args.slug}"
entry = api_get(url)
if "error" in entry:
print(f"Error: {entry['error']}", file=sys.stderr)
sys.exit(1)
content = entry.get("content", "")
if args.var:
for var_pair in args.var:
if "=" not in var_pair:
print(f"Invalid variable format: {var_pair} (expected KEY=VALUE)", file=sys.stderr)
continue
key, val = var_pair.split("=", 1)
content = content.replace(f"{{{{{key}}}}}", val)
if args.raw:
print(content)
else:
title = entry.get("title", args.slug)
category = entry.get("category", "")
version = entry.get("version", "")
model = entry.get("model", "")
variables = entry.get("variables", [])
print(f"# {title}")
meta_parts = []
if category:
meta_parts.append(f"category: {category}")
if version:
meta_parts.append(f"version: {version}")
if model:
meta_parts.append(f"model: {model}")
if meta_parts:
print(f"# {' | '.join(meta_parts)}")
if variables:
print("\n## Variables")
for v in variables:
default = v.get("default", "")
print(f" {{{{{v['name']}}}}} — {v['description']} (default: {default})")
print(f"\n{content}")
def cmd_push(args: argparse.Namespace) -> None:
repo_path = Path(args.repo_path).resolve()
prompts_dir = repo_path / "apps" / "chat" / "content" / "prompts"
if not prompts_dir.exists():
prompts_dir = repo_path / "content" / "prompts"
if not prompts_dir.exists():
prompts_dir.mkdir(parents=True, exist_ok=True)
slug = re.sub(r"[^a-z0-9]+", "-", args.title.lower()).strip("-")
filepath = prompts_dir / f"{slug}.mdx"
if filepath.exists():
print(f"Prompt already exists: {filepath}", file=sys.stderr)
print("Use 'update' command to modify existing prompts.", file=sys.stderr)
sys.exit(1)
tags_yaml = ""
if args.tags:
tag_list = [t.strip() for t in args.tags.split(",")]
tags_yaml = "\ntags:\n" + "\n".join(f" - {t}" for t in tag_list)
model_yaml = f"\nmodel: {args.model}" if args.model else ""
frontmatter = f"""---
title: "{args.title}"
summary: ""
date: {date.today().isoformat()}
published: false
category: {args.category}{model_yaml}
version: "1.0"{tags_yaml}
---"""
filepath.write_text(f"{frontmatter}\n\n{args.body}\n", encoding="utf-8")
print(f"Created: {filepath}")
print("Note: published=false — review and set to true when ready.")
def cmd_update(args: argparse.Namespace) -> None:
repo_path = Path(args.repo_path).resolve()
prompts_dir = repo_path / "apps" / "chat" / "content" / "prompts"
if not prompts_dir.exists():
prompts_dir = repo_path / "content" / "prompts"
filepath = prompts_dir / f"{args.slug}.mdx"
if not filepath.exists():
print(f"Prompt not found: {filepath}", file=sys.stderr)
sys.exit(1)
content = filepath.read_text(encoding="utf-8")
if args.body:
parts = content.split("---", 2)
if len(parts) >= 3:
content = f"---{parts[1]}---\n\n{args.body}\n"
if args.bump_version:
match = re.search(r'version:\s*"(\d+)\.(\d+)"', content)
if match:
major, minor = int(match.group(1)), int(match.group(2))
new_version = f"{major}.{minor + 1}"
content = content.replace(match.group(0), f'version: "{new_version}"')
today = date.today().isoformat()
content = re.sub(r"date:\s*\S+", f"date: {today}", content)
filepath.write_text(content, encoding="utf-8")
print(f"Updated: {filepath}")
# ─── Remote (API-based) commands ──────────────────────────────────────────────
def cmd_remote_push(args: argparse.Namespace) -> None:
"""Push a new prompt to the remote API."""
token = _get_token(args)
payload: dict = {
"title": args.title,
"content": args.body,
"category": args.category,
"visibility": args.visibility,
}
if args.summary:
payload["summary"] = args.summary
if args.model:
payload["model"] = args.model
if args.version:
payload["version"] = args.version
if args.tags:
payload["tags"] = [t.strip() for t in args.tags.split(",")]
result = api_mutate(args.endpoint, "POST", token, payload)
slug = result.get("slug", "")
print(f"Created: {slug}")
print(f" URL: {args.endpoint}/{slug}")
def cmd_remote_update(args: argparse.Namespace) -> None:
"""Update an existing prompt via the remote API."""
token = _get_token(args)
url = f"{args.endpoint}/{args.slug}"
payload: dict = {}
if args.title:
payload["title"] = args.title
if args.body:
payload["content"] = args.body
if args.category:
payload["category"] = args.category
if args.model:
payload["model"] = args.model
if args.tags:
payload["tags"] = [t.strip() for t in args.tags.split(",")]
if args.bump_version:
# Fetch current version first
entry = api_get(url)
ver = entry.get("version", "1.0")
match = re.match(r"(\d+)\.(\d+)", ver)
if match:
payload["version"] = f"{match.group(1)}.{int(match.group(2)) + 1}"
if not payload:
print("Nothing to update. Provide at least one of: --title, --body, --category, --model, --tags, --bump-version", file=sys.stderr)
sys.exit(1)
result = api_mutate(url, "PUT", token, payload)
print(f"Updated: {args.slug}")
if "version" in result:
print(f" Version: {result['version']}")
def cmd_remote_delete(args: argparse.Namespace) -> None:
"""Soft-delete a prompt via the remote API."""
token = _get_token(args)
url = f"{args.endpoint}/{args.slug}"
result = api_mutate(url, "DELETE", token)
if result.get("deleted"):
print(f"Deleted: {args.slug}")
else:
print(f"Failed to delete: {args.slug}", file=sys.stderr)
sys.exit(1)
def main() -> None:
parser = argparse.ArgumentParser(description="Prompt library sync CLI")
sub = parser.add_subparsers(dest="command", required=True)
# ── Read commands ──
ls = sub.add_parser("list", help="List available prompts")
ls.add_argument("--category", help="Filter by category")
ls.add_argument("--tag", help="Filter by tag")
ls.add_argument("--model", help="Filter by model")
ls.add_argument("--endpoint", default=DEFAULT_ENDPOINT, help="API endpoint")
pull = sub.add_parser("pull", help="Pull a prompt by slug")
pull.add_argument("slug", help="Prompt slug")
pull.add_argument("--var", action="append", help="Variable substitution KEY=VALUE")
pull.add_argument("--raw", action="store_true", help="Print raw content only")
pull.add_argument("--endpoint", default=DEFAULT_ENDPOINT, help="API endpoint")
# ── Local write commands ──
push = sub.add_parser("push", help="Create a new prompt MDX file locally")
push.add_argument("--title", required=True, help="Prompt title")
push.add_argument("--category", required=True, help="Prompt category")
push.add_argument("--body", required=True, help="Prompt body content")
push.add_argument("--model", help="Target model")
push.add_argument("--tags", help="Comma-separated tags")
push.add_argument("--repo-path", default=".", help="Repository root path")
update = sub.add_parser("update", help="Update an existing prompt locally")
update.add_argument("slug", help="Prompt slug")
update.add_argument("--body", help="New body content")
update.add_argument("--bump-version", action="store_true", help="Bump minor version")
update.add_argument("--repo-path", default=".", help="Repository root path")
# ── Remote write commands (API-based) ──
rp = sub.add_parser("remote-push", help="Create a prompt via the remote API")
rp.add_argument("--title", required=True, help="Prompt title")
rp.add_argument("--category", required=True, help="Prompt category")
rp.add_argument("--body", required=True, help="Prompt body content")
rp.add_argument("--summary", help="Short summary")
rp.add_argument("--model", help="Target model")
rp.add_argument("--version", help="Version string (default: 1.0)")
rp.add_argument("--tags", help="Comma-separated tags")
rp.add_argument("--visibility", default="public", choices=["public", "private"], help="Visibility")
rp.add_argument("--token", help="API token (or set BROOMVA_API_TOKEN)")
rp.add_argument("--endpoint", default=DEFAULT_ENDPOINT, help="API endpoint")
ru = sub.add_parser("remote-update", help="Update a prompt via the remote API")
ru.add_argument("slug", help="Prompt slug")
ru.add_argument("--title", help="New title")
ru.add_argument("--body", help="New body content")
ru.add_argument("--category", help="New category")
ru.add_argument("--model", help="New model")
ru.add_argument("--tags", help="New comma-separated tags")
ru.add_argument("--bump-version", action="store_true", help="Bump minor version")
ru.add_argument("--token", help="API token (or set BROOMVA_API_TOKEN)")
ru.add_argument("--endpoint", default=DEFAULT_ENDPOINT, help="API endpoint")
rd = sub.add_parser("remote-delete", help="Delete a prompt via the remote API")
rd.add_argument("slug", help="Prompt slug")
rd.add_argument("--token", help="API token (or set BROOMVA_API_TOKEN)")
rd.add_argument("--endpoint", default=DEFAULT_ENDPOINT, help="API endpoint")
args = parser.parse_args()
commands = {
"list": cmd_list,
"pull": cmd_pull,
"push": cmd_push,
"update": cmd_update,
"remote-push": cmd_remote_push,
"remote-update": cmd_remote_update,
"remote-delete": cmd_remote_delete,
}
commands[args.command](args)
if __name__ == "__main__":
main()
Related skills
FAQ
How do I authenticate for remote writes?
Remote commands require an OAuth session token from broomva.tech (via /api/auth/api-token), passed as BROOMVA_API_TOKEN or --token; no static API keys are needed.
Can I use my own prompt repository?
Yes. Every command accepts --endpoint URL, and any site implementing the standard GET/POST prompt API routes works.