refactor(skills): drop -cli suffix from six consumer-API skills

Rename ghost-cli, jira-cli, jellyfin-cli, openlibrary-cli, tmdb-cli,
and tempest-cli to ghost, jira, jellyfin, openlibrary, tmdb, and tempest
via git mv. Rewrite frontmatter name fields to match new directories,
rename bundled scripts preserving executable bits, update internal
invocation strings and README quick-start examples, and relocate the
jellyfin pytest suite to jellyfin/scripts/ with its SCRIPT constant now
resolving to the renamed sibling script.

Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
This commit is contained in:
Magnus Hedemark
2026-08-26 02:10:49 -04:00
co-authored by factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
parent e10508b034
commit dd97e846ec
20 changed files with 243 additions and 243 deletions
+1 -1
View File
@@ -16,7 +16,7 @@ When your agent loads this skill, it can **manage your Ghost CMS content** witho
| Directory | Purpose |
|-----------|---------|
| `SKILL.md` | Complete command reference with setup and examples |
| `scripts/ghost-cli` | CLI tool for Ghost Admin API operations |
| `scripts/ghost` | CLI tool for Ghost Admin API operations |
## Quick Start
+29 -29
View File
@@ -1,5 +1,5 @@
---
name: ghost-cli
name: ghost
description: Manage Ghost CMS content from the terminal — create and list posts, pages,
and tags, and fetch site info via the Ghost Admin API (v5/v6). Use when the user
asks about ghost, cms, blog, blogging, posts, pages, tags, publishing, or site configuration.
@@ -12,7 +12,7 @@ metadata:
sources: https://ghost.org/docs/admin-api/, https://ghost.org/docs/
---
# ghost-cli — Ghost CMS from the Terminal
# ghost — Ghost CMS from the Terminal
Manage content on a Ghost CMS site: view site info, list and create posts and pages, manage tags — all via the Ghost Admin API (v5/v6).
@@ -33,9 +33,9 @@ export GHOST_ADMIN_KEY="your-id:your-secret" # from Ghost Admin → Integ
### site — Get site information
```bash
ghost-cli site # show site title, URL, description
ghost-cli --json site # machine-readable JSON
ghost-cli --dry-run site # preview without API call
ghost site # show site title, URL, description
ghost --json site # machine-readable JSON
ghost --dry-run site # preview without API call
```
Shows: site title, URL, description.
@@ -43,12 +43,12 @@ Shows: site title, URL, description.
### posts — List blog posts
```bash
ghost-cli posts # 20 most recent posts
ghost-cli posts --limit 50 # more results
ghost-cli posts --status published # only published posts
ghost-cli posts --status draft # only draft posts
ghost-cli posts --status scheduled # only scheduled posts
ghost-cli posts --limit 10 --json # 10 most recent as JSON
ghost posts # 20 most recent posts
ghost posts --limit 50 # more results
ghost posts --status published # only published posts
ghost posts --status draft # only draft posts
ghost posts --status scheduled # only scheduled posts
ghost posts --limit 10 --json # 10 most recent as JSON
```
Shows: title, status, slug, and last-updated date for each post.
@@ -56,12 +56,12 @@ Shows: title, status, slug, and last-updated date for each post.
### create-post — Create a new blog post
```bash
ghost-cli create-post --title "My First Post" # draft, no HTML
ghost-cli create-post --title "Hello World" --html "<p>Hello!</p>" # with HTML content
ghost-cli create-post --title "Ready" --html "<p>Published</p>" --status published # publish immediately
ghost-cli create-post --title "Scheduled" --html "<p>Later</p>" --status scheduled # schedule
ghost-cli create-post --title "Custom Slug" --slug "my-custom-url" # custom URL slug
ghost-cli create-post --title "Draft" --dry-run # preview without creating
ghost create-post --title "My First Post" # draft, no HTML
ghost create-post --title "Hello World" --html "<p>Hello!</p>" # with HTML content
ghost create-post --title "Ready" --html "<p>Published</p>" --status published # publish immediately
ghost create-post --title "Scheduled" --html "<p>Later</p>" --status scheduled # schedule
ghost create-post --title "Custom Slug" --slug "my-custom-url" # custom URL slug
ghost create-post --title "Draft" --dry-run # preview without creating
```
Creates the post and returns its title, slug, and status.
@@ -69,9 +69,9 @@ Creates the post and returns its title, slug, and status.
### pages — List pages
```bash
ghost-cli pages # 20 most recent pages
ghost-cli pages --limit 50 # more results
ghost-cli pages --json # machine-readable JSON
ghost pages # 20 most recent pages
ghost pages --limit 50 # more results
ghost pages --json # machine-readable JSON
```
Shows: title, status, slug, and last-updated date for each page.
@@ -79,9 +79,9 @@ Shows: title, status, slug, and last-updated date for each page.
### tags — List tags
```bash
ghost-cli tags # 50 tags with post counts
ghost-cli tags --limit 100 # more results
ghost-cli tags --json # machine-readable JSON
ghost tags # 50 tags with post counts
ghost tags --limit 100 # more results
ghost tags --json # machine-readable JSON
```
Shows: tag name, slug, and number of posts using each tag.
@@ -91,11 +91,11 @@ Shows: tag name, slug, and number of posts using each tag.
These flags work anywhere in the command — before or after the subcommand:
```bash
ghost-cli --json posts # JSON output
ghost-cli posts --json # same result, after subcommand
ghost-cli --dry-run create-post --title "Test" # preview without API call
ghost-cli --quiet posts # suppress diagnostic output
ghost-cli --verbose site # verbose logging
ghost --json posts # JSON output
ghost posts --json # same result, after subcommand
ghost --dry-run create-post --title "Test" # preview without API call
ghost --quiet posts # suppress diagnostic output
ghost --verbose site # verbose logging
```
| Flag | Effect |
@@ -119,6 +119,6 @@ ghost-cli --verbose site # verbose logging
## References
- [scripts/ghost-cli](scripts/ghost-cli) — The CLI binary. Built following the cli-builder patterns: non-interactive, `--json`, `--dry-run`, `--quiet`, `--verbose`, dual-output via `emit()`, lazy auth, structured logging.
- [scripts/ghost](scripts/ghost) — The CLI binary. Built following the cli-builder patterns: non-interactive, `--json`, `--dry-run`, `--quiet`, `--verbose`, dual-output via `emit()`, lazy auth, structured logging.
- [Ghost Admin API Docs](https://ghost.org/docs/admin-api/) — Official Ghost Admin API documentation.
- [Ghost Integrations](https://ghost.org/docs/integrations/) — How to create Custom Integrations and get your Admin API key.
@@ -1,5 +1,5 @@
#!/usr/bin/env python3
"""ghost-cli — Ghost CMS from the terminal.
"""ghost — Ghost CMS from the terminal.
Manage content on a Ghost CMS site: create and edit posts and pages,
manage tags, and configure metadata. Requires GHOST_URL and GHOST_ADMIN_KEY.
@@ -204,7 +204,7 @@ def fmt_post(p):
def cmd_posts(client, args):
p = argparse.ArgumentParser(prog="ghost-cli posts")
p = argparse.ArgumentParser(prog="ghost posts")
p.add_argument("--limit", type=int, default=20)
p.add_argument("--status", choices=["published", "draft", "scheduled"])
parsed, _ = p.parse_known_args(args)
@@ -224,7 +224,7 @@ def cmd_posts(client, args):
def cmd_create_post(client, args):
p = argparse.ArgumentParser(prog="ghost-cli posts create")
p = argparse.ArgumentParser(prog="ghost posts create")
p.add_argument("--title", required=True)
p.add_argument("--html", default="")
p.add_argument("--status", default="draft", choices=["draft", "published", "scheduled"])
@@ -245,7 +245,7 @@ def cmd_create_post(client, args):
def cmd_pages(client, args):
p = argparse.ArgumentParser(prog="ghost-cli pages")
p = argparse.ArgumentParser(prog="ghost pages")
p.add_argument("--limit", type=int, default=20)
parsed, _ = p.parse_known_args(args)
@@ -262,7 +262,7 @@ def cmd_pages(client, args):
def cmd_tags(client, args):
p = argparse.ArgumentParser(prog="ghost-cli tags")
p = argparse.ArgumentParser(prog="ghost tags")
p.add_argument("--limit", type=int, default=50)
parsed, _ = p.parse_known_args(args)
@@ -302,7 +302,7 @@ def main():
if GLOBAL_FLAGS.get("json", False):
warnings.simplefilter("ignore")
parser = argparse.ArgumentParser(prog="ghost-cli", description="Ghost CMS CLI.",
parser = argparse.ArgumentParser(prog="ghost", description="Ghost CMS CLI.",
epilog="Set GHOST_URL and GHOST_ADMIN_KEY. Key format: id:secret from Integrations.")
sub = parser.add_subparsers(dest="command")
sub.add_parser("site", help="Site info")
@@ -17,12 +17,12 @@ When your agent loads this skill, it can **navigate your home media server** wit
| Directory | Purpose |
|-----------|---------|
| `SKILL.md` | Complete command reference with setup and examples |
| `scripts/jellyfin-cli` | CLI tool for Jellyfin API operations |
| `scripts/jellyfin` | CLI tool for Jellyfin API operations |
## Quick Start
```bash
scripts/jellyfin-cli --help
scripts/jellyfin --help
export JELLYFIN_URL="http://your-server:8096"
export JELLYFIN_API_KEY="your-api-key"
export JELLYFIN_USER_ID="your-jellyfin-user-id" # required by recent, next-up, and item
@@ -31,8 +31,8 @@ export JELLYFIN_USER_ID="your-jellyfin-user-id" # required by recent, next-up, a
API key from Dashboard → API Keys in the Jellyfin admin panel.
```bash
scripts/jellyfin-cli search --query "dune" --type Movie
scripts/jellyfin-cli next-up --limit 5
scripts/jellyfin search --query "dune" --type Movie
scripts/jellyfin next-up --limit 5
```
## Triggers
+33 -33
View File
@@ -1,5 +1,5 @@
---
name: jellyfin-cli
name: jellyfin
description: Query your Jellyfin media server from the terminal — recently added media,
search, item details, next-up episodes, library browsing, server info, and stats. Use
when the user asks about Jellyfin, media server, movies, TV shows, next episodes, or
@@ -14,7 +14,7 @@ metadata:
sources: https://jellyfin.org/docs/general/clients/api, https://jellyfin.org/downloads
---
# jellyfin-cli — Jellyfin Media Server from the Terminal
# jellyfin — Jellyfin Media Server from the Terminal
Query recently added movies and TV episodes, search and inspect media, browse libraries, see next-up episodes, check server info, and view library statistics — all from your Jellyfin server's REST API.
@@ -30,16 +30,16 @@ export JELLYFIN_API_KEY="your-api-key-here"
export JELLYFIN_USER_ID="your-jellyfin-user-id" # required by recent, next-up, and item
```
Run the bundled CLI as `scripts/jellyfin-cli`. `--help` and `--dry-run` work without credentials.
Run the bundled CLI as `scripts/jellyfin`. `--help` and `--dry-run` work without credentials.
## Essential Commands
### info — Server information
```bash
scripts/jellyfin-cli info # server name, version, OS, user count
scripts/jellyfin-cli info --json # machine-readable
scripts/jellyfin-cli --dry-run info # preview API requests
scripts/jellyfin info # server name, version, OS, user count
scripts/jellyfin info --json # machine-readable
scripts/jellyfin --dry-run info # preview API requests
```
Shows: server name, version, operating system, number of users.
@@ -47,13 +47,13 @@ Shows: server name, version, operating system, number of users.
### recent — Recently added media
```bash
scripts/jellyfin-cli recent # last 10 items added
scripts/jellyfin-cli recent --limit 20 # more results
scripts/jellyfin-cli recent --movies # only recently added movies
scripts/jellyfin-cli recent --episodes # only recently added episodes
scripts/jellyfin-cli recent --user-id USER_ID # override JELLYFIN_USER_ID
scripts/jellyfin-cli recent --movies --limit 5 # top 5 recently added movies
scripts/jellyfin-cli recent --json # machine-readable
scripts/jellyfin recent # last 10 items added
scripts/jellyfin recent --limit 20 # more results
scripts/jellyfin recent --movies # only recently added movies
scripts/jellyfin recent --episodes # only recently added episodes
scripts/jellyfin recent --user-id USER_ID # override JELLYFIN_USER_ID
scripts/jellyfin recent --movies --limit 5 # top 5 recently added movies
scripts/jellyfin recent --json # machine-readable
```
Uses Jellyfin's current `/Items/Latest` endpoint. `--movies` and `--episodes` send `includeItemTypes` to the server, so the requested limit applies to the selected media type. Shows: name, type (Movie/Episode), production year, series name (for episodes), date added.
@@ -61,11 +61,11 @@ Uses Jellyfin's current `/Items/Latest` endpoint. `--movies` and `--episodes` se
### search — Search your media library
```bash
scripts/jellyfin-cli search --query "dune" # search everything
scripts/jellyfin-cli search --query "dune" --type Movie # movies only
scripts/jellyfin-cli search --query "star trek" --type Series,Episode
scripts/jellyfin-cli search --query "inception" --limit 5 # top 5 results
scripts/jellyfin-cli search --query "dune" --json # machine-readable
scripts/jellyfin search --query "dune" # search everything
scripts/jellyfin search --query "dune" --type Movie # movies only
scripts/jellyfin search --query "star trek" --type Series,Episode
scripts/jellyfin search --query "inception" --limit 5 # top 5 results
scripts/jellyfin search --query "dune" --json # machine-readable
```
The `--type` flag accepts a comma-separated list of item types (e.g. `Movie,Series,Episode`).
@@ -73,13 +73,13 @@ The `--type` flag accepts a comma-separated list of item types (e.g. `Movie,Seri
### Navigation — Inspect media and browse libraries
```bash
scripts/jellyfin-cli search --query "dune" --type Movie # find an item ID
scripts/jellyfin-cli item --id ITEM_ID # inspect that item
scripts/jellyfin-cli libraries # find a library ID
scripts/jellyfin-cli browse --library-id LIBRARY_ID --type Movie --limit 20
scripts/jellyfin-cli browse --library-id LIBRARY_ID --start-index 20
scripts/jellyfin-cli next-up --limit 10 # next episodes for JELLYFIN_USER_ID
scripts/jellyfin-cli next-up --user-id USER_ID --json
scripts/jellyfin search --query "dune" --type Movie # find an item ID
scripts/jellyfin item --id ITEM_ID # inspect that item
scripts/jellyfin libraries # find a library ID
scripts/jellyfin browse --library-id LIBRARY_ID --type Movie --limit 20
scripts/jellyfin browse --library-id LIBRARY_ID --start-index 20
scripts/jellyfin next-up --limit 10 # next episodes for JELLYFIN_USER_ID
scripts/jellyfin next-up --user-id USER_ID --json
```
Use `search -> item` to look up a result's metadata, and `libraries -> browse` to page through a collection. `next-up` returns the next unwatched episodes for the selected user. `item` and `next-up` require `JELLYFIN_USER_ID` or `--user-id`; all three commands are read-only.
@@ -87,8 +87,8 @@ Use `search -> item` to look up a result's metadata, and `libraries -> browse` t
### libraries — List media libraries
```bash
scripts/jellyfin-cli libraries # all configured libraries
scripts/jellyfin-cli libraries --json # machine-readable
scripts/jellyfin libraries # all configured libraries
scripts/jellyfin libraries --json # machine-readable
```
Shows: library name, collection type (movies, tvshows, music, etc.), library ID.
@@ -96,8 +96,8 @@ Shows: library name, collection type (movies, tvshows, music, etc.), library ID.
### stats — Library statistics
```bash
scripts/jellyfin-cli stats # movie, series, episode, song counts
scripts/jellyfin-cli stats --json # machine-readable
scripts/jellyfin stats # movie, series, episode, song counts
scripts/jellyfin stats --json # machine-readable
```
Shows: total count of movies, series, episodes, and songs in the library.
@@ -107,9 +107,9 @@ Shows: total count of movies, series, episodes, and songs in the library.
These flags work anywhere in the command — before or after the subcommand:
```bash
scripts/jellyfin-cli --json recent --limit 5 # JSON output
scripts/jellyfin-cli recent --limit 5 --json # same result, after subcommand
scripts/jellyfin-cli --dry-run search --query "dune" # preview request without API call
scripts/jellyfin --json recent --limit 5 # JSON output
scripts/jellyfin recent --limit 5 --json # same result, after subcommand
scripts/jellyfin --dry-run search --query "dune" # preview request without API call
```
| Flag | Effect |
@@ -129,6 +129,6 @@ scripts/jellyfin-cli --dry-run search --query "dune" # preview request wit
## References
- [scripts/jellyfin-cli](scripts/jellyfin-cli) — The bundled read-only CLI binary with `--json`, `--dry-run`, and lazy authentication.
- [scripts/jellyfin](scripts/jellyfin) — The bundled read-only CLI binary with `--json`, `--dry-run`, and lazy authentication.
- [Jellyfin API Docs](https://jellyfin.org/docs/general/clients/api) — Official API documentation.
- [Jellyfin Downloads](https://jellyfin.org/downloads) — Server download and setup guide.
@@ -1,5 +1,5 @@
#!/usr/bin/env python3
"""jellyfin-cli — Jellyfin media server from the terminal.
"""jellyfin — Jellyfin media server from the terminal.
Query recently added media, search your library, browse by collection,
and check server status. Requires JELLYFIN_URL and JELLYFIN_API_KEY.
@@ -179,7 +179,7 @@ def cmd_info(client, args):
def cmd_recent(client, args):
p = argparse.ArgumentParser(prog="jellyfin-cli recent")
p = argparse.ArgumentParser(prog="jellyfin recent")
p.add_argument("--limit", type=int, default=10)
media_type = p.add_mutually_exclusive_group()
media_type.add_argument("--movies", action="store_true")
@@ -221,7 +221,7 @@ def cmd_recent(client, args):
def cmd_search(client, args):
p = argparse.ArgumentParser(prog="jellyfin-cli search")
p = argparse.ArgumentParser(prog="jellyfin search")
p.add_argument("--query", "-q", required=True)
p.add_argument("--type", help="Comma-separated types (Movie,Series,Episode)")
p.add_argument("--limit", type=int, default=20)
@@ -254,7 +254,7 @@ def cmd_search(client, args):
def cmd_next_up(client, args):
p = argparse.ArgumentParser(prog="jellyfin-cli next-up")
p = argparse.ArgumentParser(prog="jellyfin next-up")
p.add_argument("--user-id", default=ENV_USER_ID)
p.add_argument("--limit", type=int, default=10)
parsed, _ = p.parse_known_args(args)
@@ -276,7 +276,7 @@ def cmd_next_up(client, args):
def cmd_item(client, args):
p = argparse.ArgumentParser(prog="jellyfin-cli item")
p = argparse.ArgumentParser(prog="jellyfin item")
p.add_argument("--id", required=True)
p.add_argument("--user-id", default=ENV_USER_ID)
parsed, _ = p.parse_known_args(args)
@@ -295,7 +295,7 @@ def cmd_item(client, args):
def cmd_browse(client, args):
p = argparse.ArgumentParser(prog="jellyfin-cli browse")
p = argparse.ArgumentParser(prog="jellyfin browse")
p.add_argument("--library-id", required=True)
p.add_argument("--type")
p.add_argument("--limit", type=int, default=50)
@@ -365,35 +365,35 @@ def main():
if GLOBAL_FLAGS.get("json", False):
warnings.simplefilter("ignore")
parser = argparse.ArgumentParser(prog="jellyfin-cli", description="Jellyfin media server CLI.",
epilog="Example: jellyfin-cli search --query dune")
parser = argparse.ArgumentParser(prog="jellyfin", description="Jellyfin media server CLI.",
epilog="Example: jellyfin search --query dune")
parser.add_argument("--json", action="store_true", help="Output machine-readable JSON")
parser.add_argument("--dry-run", action="store_true", help="Preview API requests without network access")
sub = parser.add_subparsers(dest="command")
sub.add_parser("info", help="Server info", description="Show Jellyfin server details.", epilog="Example: jellyfin-cli info")
re = sub.add_parser("recent", help="Recently added", description="Show recently added movies or episodes.", epilog="Example: jellyfin-cli recent --movies --limit 5")
sub.add_parser("info", help="Server info", description="Show Jellyfin server details.", epilog="Example: jellyfin info")
re = sub.add_parser("recent", help="Recently added", description="Show recently added movies or episodes.", epilog="Example: jellyfin recent --movies --limit 5")
re.add_argument("--limit", type=int, default=10, help="Maximum items to return (default: 10)")
media_type = re.add_mutually_exclusive_group()
media_type.add_argument("--movies", action="store_true", help="Show only movies")
media_type.add_argument("--episodes", action="store_true", help="Show only episodes")
re.add_argument("--user-id", help="Jellyfin user ID (default: JELLYFIN_USER_ID)")
se = sub.add_parser("search", help="Search media", description="Search the Jellyfin media library.", epilog="Example: jellyfin-cli search --query dune --type Movie")
se = sub.add_parser("search", help="Search media", description="Search the Jellyfin media library.", epilog="Example: jellyfin search --query dune --type Movie")
se.add_argument("--query", "-q", required=True, help="Text to search for")
se.add_argument("--type", help="Comma-separated item types, such as Movie,Series")
se.add_argument("--limit", type=int, default=20, help="Maximum results to return (default: 20)")
nu = sub.add_parser("next-up", help="Next unwatched episodes", description="Show the next unwatched episodes for a Jellyfin user.", epilog="Example: jellyfin-cli next-up --user-id USER_ID --limit 5")
nu = sub.add_parser("next-up", help="Next unwatched episodes", description="Show the next unwatched episodes for a Jellyfin user.", epilog="Example: jellyfin next-up --user-id USER_ID --limit 5")
nu.add_argument("--user-id", help="Jellyfin user ID (default: JELLYFIN_USER_ID)")
nu.add_argument("--limit", type=int, default=10, help="Maximum episodes to return (default: 10)")
it = sub.add_parser("item", help="Show item details", description="Show metadata for one Jellyfin library item.", epilog="Example: jellyfin-cli item --id ITEM_ID --user-id USER_ID")
it = sub.add_parser("item", help="Show item details", description="Show metadata for one Jellyfin library item.", epilog="Example: jellyfin item --id ITEM_ID --user-id USER_ID")
it.add_argument("--id", required=True, help="Jellyfin item ID")
it.add_argument("--user-id", help="Jellyfin user ID (default: JELLYFIN_USER_ID)")
br = sub.add_parser("browse", help="Browse a library", description="List items in a Jellyfin media library.", epilog="Example: jellyfin-cli browse --library-id LIBRARY_ID --type Movie --limit 20")
br = sub.add_parser("browse", help="Browse a library", description="List items in a Jellyfin media library.", epilog="Example: jellyfin browse --library-id LIBRARY_ID --type Movie --limit 20")
br.add_argument("--library-id", required=True, help="Jellyfin library ID")
br.add_argument("--type", help="Comma-separated item types, such as Movie,Series")
br.add_argument("--limit", type=int, default=50, help="Maximum items to return (default: 50)")
br.add_argument("--start-index", type=int, default=0, help="Zero-based result offset (default: 0)")
sub.add_parser("libraries", help="List libraries", description="List configured media libraries.", epilog="Example: jellyfin-cli libraries")
sub.add_parser("stats", help="Library statistics", description="Show media library item counts.", epilog="Example: jellyfin-cli stats")
sub.add_parser("libraries", help="List libraries", description="List configured media libraries.", epilog="Example: jellyfin libraries")
sub.add_parser("stats", help="Library statistics", description="Show media library item counts.", epilog="Example: jellyfin stats")
args = parser.parse_args(filtered_argv[1:])
if not args.command:
@@ -8,7 +8,7 @@ import subprocess
import unittest
SCRIPT = pathlib.Path(__file__).parents[1] / "scripts" / "jellyfin-cli"
SCRIPT = pathlib.Path(__file__).resolve().parent / "jellyfin"
LOADER = importlib.machinery.SourceFileLoader("jellyfin_cli", str(SCRIPT))
SPEC = importlib.util.spec_from_loader(LOADER.name, LOADER)
jellyfin_cli = importlib.util.module_from_spec(SPEC)
+1 -1
View File
@@ -18,7 +18,7 @@ When your agent loads this skill, it can **manage your entire Jira workflow** wi
| Directory | Purpose |
|-----------|---------|
| `SKILL.md` | Complete command reference with setup and examples |
| `scripts/jira-cli` | CLI tool for Jira REST API v3 |
| `scripts/jira` | CLI tool for Jira REST API v3 |
## Quick Start
+27 -27
View File
@@ -1,5 +1,5 @@
---
name: jira-cli
name: jira
description: 'Interact with Atlassian Jira from the terminal: search issues, view
details, create issues, add comments, list projects, and transition status. Use
when the user mentions Jira, a ticket key (e.g. PROJ-123), or asks about issues,
@@ -13,7 +13,7 @@ metadata:
sources: https://developer.atlassian.com/cloud/jira/platform/rest/v3/, https://id.atlassian.com/manage/api-tokens
---
# jira-cli — Jira Issue Tracker from the Terminal
# jira — Jira Issue Tracker from the Terminal
Interact with Atlassian Jira Cloud via the REST API v3. Search issues, view details, create issues, add comments, list projects, and transition status.
@@ -35,17 +35,17 @@ export JIRA_SERVER="https://your-domain.atlassian.net" # defaults to this forma
### me — Current user profile
```bash
jira-cli me # your account info
jira-cli me --json # machine-readable
jira me # your account info
jira me --json # machine-readable
```
### list — Search issues
```bash
jira-cli list # recent issues
jira-cli list --project PROJ # by project
jira-cli list --jql 'assignee=currentuser() AND status=Open' # custom JQL
jira-cli list --project PROJ --max 5 --json # top 5 as JSON
jira list # recent issues
jira list --project PROJ # by project
jira list --jql 'assignee=currentuser() AND status=Open' # custom JQL
jira list --project PROJ --max 5 --json # top 5 as JSON
```
The `--jql` flag accepts any valid JQL. The `--project` flag is a shortcut for `project=KEY`.
@@ -53,8 +53,8 @@ The `--jql` flag accepts any valid JQL. The `--project` flag is a shortcut for `
### view — Issue details
```bash
jira-cli view PROJ-123 # full details
jira-cli view PROJ-123 --json # machine-readable
jira view PROJ-123 # full details
jira view PROJ-123 --json # machine-readable
```
Shows: summary, type, status, priority, assignee, reporter, timestamps, and description (plain text extracted from Atlassian Document Format).
@@ -62,33 +62,33 @@ Shows: summary, type, status, priority, assignee, reporter, timestamps, and desc
### projects — List projects
```bash
jira-cli projects # all accessible projects
jira-cli projects --json # machine-readable
jira projects # all accessible projects
jira projects --json # machine-readable
```
### create — Create an issue
```bash
jira-cli create --project PROJ --summary "Fix login bug" # Task (default)
jira-cli create --project PROJ --summary "Crash on startup" --type Bug
jira-cli create --project PROJ --summary "Add dark mode" --type Story --priority High
jira-cli create --project PROJ --summary "Test" --dry-run # preview
jira create --project PROJ --summary "Fix login bug" # Task (default)
jira create --project PROJ --summary "Crash on startup" --type Bug
jira create --project PROJ --summary "Add dark mode" --type Story --priority High
jira create --project PROJ --summary "Test" --dry-run # preview
```
### comment — Add a comment
```bash
jira-cli comment PROJ-123 -m "Fixed in latest build" # add comment
jira-cli comment PROJ-123 -m "Looking into it" --dry-run
jira comment PROJ-123 -m "Fixed in latest build" # add comment
jira comment PROJ-123 -m "Looking into it" --dry-run
```
### transition — Change issue status
```bash
jira-cli transition PROJ-123 --to "In Progress" # by name
jira-cli transition PROJ-123 --to "Done" # by name
jira-cli transition PROJ-123 --to "31" # by ID
jira-cli transition PROJ-123 --to "In Review" --dry-run
jira transition PROJ-123 --to "In Progress" # by name
jira transition PROJ-123 --to "Done" # by name
jira transition PROJ-123 --to "31" # by ID
jira transition PROJ-123 --to "In Review" --dry-run
```
The CLI looks up available transitions for the issue and matches by name or ID. If the transition doesn't exist, it shows available options.
@@ -98,10 +98,10 @@ The CLI looks up available transitions for the issue and matches by name or ID.
All flags work in any position:
```bash
jira-cli --json list --project PROJ # flag before subcommand
jira-cli list --project PROJ --json # flag after subcommand
jira-cli --dry-run create --project PROJ --summary "Test" # preview
jira-cli --quiet list # suppress non-essential output
jira --json list --project PROJ # flag before subcommand
jira list --project PROJ --json # flag after subcommand
jira --dry-run create --project PROJ --summary "Test" # preview
jira --quiet list # suppress non-essential output
```
## Known Gotchas
@@ -114,6 +114,6 @@ jira-cli --quiet list # suppress non-essential output
## References
- [scripts/jira-cli](scripts/jira-cli) — The CLI binary. Built following the cli-builder patterns: non-interactive, `--json`, `--dry-run`, `--quiet`, `--verbose`, dual-output via `emit()`, lazy auth, structured logging.
- [scripts/jira](scripts/jira) — The CLI binary. Built following the cli-builder patterns: non-interactive, `--json`, `--dry-run`, `--quiet`, `--verbose`, dual-output via `emit()`, lazy auth, structured logging.
- [Jira REST API v3 docs](https://developer.atlassian.com/cloud/jira/platform/rest/v3/) — Official API reference.
- [API Token Management](https://id.atlassian.com/manage/api-tokens) — Generate and revoke tokens.
@@ -1,5 +1,5 @@
#!/usr/bin/env python3
"""jira-cli — Jira issue tracker from the terminal.
"""jira — Jira issue tracker from the terminal.
Interact with Atlassian Jira Cloud via the REST API v3.
Requires JIRA_EMAIL and JIRA_API_TOKEN env vars (token from
@@ -234,7 +234,7 @@ def cmd_me(client: JiraClient, args: List[str]) -> None:
def cmd_list(client: JiraClient, args: List[str]) -> None:
parser = argparse.ArgumentParser(prog="jira-cli list")
parser = argparse.ArgumentParser(prog="jira list")
parser.add_argument("--jql", default="", help="JQL query (default: recent issues)")
parser.add_argument("--max", type=int, default=20, help="Max results (default: 20)")
parser.add_argument("--project", help="Shortcut: filter by project key")
@@ -282,7 +282,7 @@ def cmd_list(client: JiraClient, args: List[str]) -> None:
def cmd_view(client: JiraClient, args: List[str]) -> None:
parser = argparse.ArgumentParser(prog="jira-cli view")
parser = argparse.ArgumentParser(prog="jira view")
parser.add_argument("issue_key", help="Issue key (e.g. PROJ-123)")
parsed, _ = parser.parse_known_args(args)
@@ -377,7 +377,7 @@ def cmd_projects(client: JiraClient, args: List[str]) -> None:
def cmd_create(client: JiraClient, args: List[str]) -> None:
parser = argparse.ArgumentParser(prog="jira-cli create")
parser = argparse.ArgumentParser(prog="jira create")
parser.add_argument("--project", required=True, help="Project key (e.g. PROJ)")
parser.add_argument("--summary", required=True, help="Issue summary/title")
parser.add_argument("--type", default="Task", help="Issue type (Task, Bug, Story, etc.)")
@@ -407,7 +407,7 @@ def cmd_create(client: JiraClient, args: List[str]) -> None:
def cmd_comment(client: JiraClient, args: List[str]) -> None:
parser = argparse.ArgumentParser(prog="jira-cli comment")
parser = argparse.ArgumentParser(prog="jira comment")
parser.add_argument("issue_key", help="Issue key (e.g. PROJ-123)")
parser.add_argument("--body", "-m", required=True, help="Comment body text")
parsed, _ = parser.parse_known_args(args)
@@ -426,7 +426,7 @@ def cmd_comment(client: JiraClient, args: List[str]) -> None:
def cmd_transition(client: JiraClient, args: List[str]) -> None:
parser = argparse.ArgumentParser(prog="jira-cli transition")
parser = argparse.ArgumentParser(prog="jira transition")
parser.add_argument("issue_key", help="Issue key (e.g. PROJ-123)")
parser.add_argument("--to", required=True, help="Transition by name or ID")
parsed, _ = parser.parse_known_args(args)
@@ -474,9 +474,9 @@ def main() -> None:
warnings.simplefilter("ignore")
parser = argparse.ArgumentParser(
prog="jira-cli",
prog="jira",
description="Jira issue tracker from the terminal.",
epilog="Global flags work anywhere: jira-cli --json list --jql 'project=PROJ'"
epilog="Global flags work anywhere: jira --json list --jql 'project=PROJ'"
)
sub = parser.add_subparsers(dest="command", help="Available commands")
@@ -17,14 +17,14 @@ When your agent loads this skill, it can **access 50M+ book records** without an
| Directory | Purpose |
|-----------|---------|
| `SKILL.md` | Complete command reference with examples |
| `scripts/openlibrary-cli` | CLI tool for the Open Library API |
| `scripts/openlibrary` | CLI tool for the Open Library API |
## Quick Start
```bash
openlibrary-cli search --query "dune"
openlibrary-cli search --isbn "9780439358064"
openlibrary-cli search-authors --query "asimov"
openlibrary search --query "dune"
openlibrary search --isbn "9780439358064"
openlibrary search-authors --query "asimov"
```
## Triggers
@@ -1,5 +1,5 @@
---
name: openlibrary-cli
name: openlibrary
description: Search books, authors, and works on Open Library from the terminal. Look
up books by ISBN, search titles and authors, and fetch detailed work/author records
via the public Open Library API. No API key required.
@@ -12,7 +12,7 @@ metadata:
sources: https://openlibrary.org/developers/api, https://openlibrary.org
---
# openlibrary-cli — Book Metadata from Open Library
# openlibrary — Book Metadata from Open Library
Search books and authors, look up works and ISBNs, and fetch detailed metadata from the public [Open Library](https://openlibrary.org) API. No API key, no registration — just works.
@@ -32,13 +32,13 @@ Only Python 3.8+ and the `requests` package are required. `--help` and `--dry-ru
### search — Search books by keyword
```bash
openlibrary-cli search --query "dune" # basic search (20 results)
openlibrary-cli search --query "dune" --limit 5 # just the top 5
openlibrary-cli search --query "dune" --sort new # newest first
openlibrary-cli search --query "dune" --sort rating # highest rated first
openlibrary-cli search --query "dune" --sort title # alphabetical by title
openlibrary-cli search --query "foundation" --lang fr # French editions
openlibrary-cli search --query "dune" --json # machine-readable JSON
openlibrary search --query "dune" # basic search (20 results)
openlibrary search --query "dune" --limit 5 # just the top 5
openlibrary search --query "dune" --sort new # newest first
openlibrary search --query "dune" --sort rating # highest rated first
openlibrary search --query "dune" --sort title # alphabetical by title
openlibrary search --query "foundation" --lang fr # French editions
openlibrary search --query "dune" --json # machine-readable JSON
```
Shows: title, first publish year, authors, edition count. Supports `--sort` (editions, new, old, rating, title), `--lang`, `--offset`, and `--availability`.
@@ -46,9 +46,9 @@ Shows: title, first publish year, authors, edition count. Supports `--sort` (edi
### search-authors — Search authors by name
```bash
openlibrary-cli search-authors --query "asimov" # search authors
openlibrary-cli search-authors --query "asimov" --limit 5 # top 5
openlibrary-cli search-authors --query "asimov" --json # machine-readable
openlibrary search-authors --query "asimov" # search authors
openlibrary search-authors --query "asimov" --limit 5 # top 5
openlibrary search-authors --query "asimov" --json # machine-readable
```
Shows: name, birth/death years, author key, top work.
@@ -56,9 +56,9 @@ Shows: name, birth/death years, author key, top work.
### author — Get author details by key
```bash
openlibrary-cli author OL23919A # Isaac Asimov
openlibrary-cli author OL34184A # Ursula K. Le Guin
openlibrary-cli author OL23919A --json # full biography
openlibrary author OL23919A # Isaac Asimov
openlibrary author OL34184A # Ursula K. Le Guin
openlibrary author OL23919A --json # full biography
```
Shows: name, birth/death dates, biography (up to 500 chars), Wikipedia link, personal name. Author keys are the `OL#####A` identifiers from search results.
@@ -66,9 +66,9 @@ Shows: name, birth/death dates, biography (up to 500 chars), Wikipedia link, per
### work — Get work details by key
```bash
openlibrary-cli work OL123W # work by key
openlibrary-cli work OL81699W # "Foundation"
openlibrary-cli work OL81699W --json # full description
openlibrary work OL123W # work by key
openlibrary work OL81699W # "Foundation"
openlibrary work OL81699W --json # full description
```
Shows: title, author keys, subjects, description (up to 500 chars). Work keys are the `OL#####W` identifiers found in search results.
@@ -76,9 +76,9 @@ Shows: title, author keys, subjects, description (up to 500 chars). Work keys ar
### isbn — Lookup a book by ISBN
```bash
openlibrary-cli isbn 9780451524935 # ISBN lookup
openlibrary-cli isbn 9780553382563 # another book
openlibrary-cli isbn 9780451524935 --json # full edition metadata
openlibrary isbn 9780451524935 # ISBN lookup
openlibrary isbn 9780553382563 # another book
openlibrary isbn 9780451524935 --json # full edition metadata
```
Shows: title, author(s), page count, publish date, publisher, subjects (top 5). Accepts both ISBN-10 and ISBN-13.
@@ -88,12 +88,12 @@ Shows: title, author(s), page count, publish date, publisher, subjects (top 5).
These flags work anywhere in the command — before or after the subcommand:
```bash
openlibrary-cli --json search --query "dune" # JSON output
openlibrary-cli search --query "dune" --json # same result, after subcommand
openlibrary-cli --dry-run search --query "dune" # preview without API call
openlibrary-cli --quiet search --query "dune" # suppress diagnostic output
openlibrary-cli --verbose author OL23919A # verbose logging
openlibrary-cli --dry-run isbn 9780451524935 # see what URL would be used
openlibrary --json search --query "dune" # JSON output
openlibrary search --query "dune" --json # same result, after subcommand
openlibrary --dry-run search --query "dune" # preview without API call
openlibrary --quiet search --query "dune" # suppress diagnostic output
openlibrary --verbose author OL23919A # verbose logging
openlibrary --dry-run isbn 9780451524935 # see what URL would be used
```
| Flag | Effect |
@@ -116,6 +116,6 @@ openlibrary-cli --dry-run isbn 9780451524935 # see what URL would
## References
- [scripts/openlibrary-cli](scripts/openlibrary-cli) — The CLI binary. Built following the cli-builder patterns: non-interactive, `--json`, `--dry-run`, `--quiet`, `--verbose`, dual-output via `emit()`, structured logging.
- [scripts/openlibrary](scripts/openlibrary) — The CLI binary. Built following the cli-builder patterns: non-interactive, `--json`, `--dry-run`, `--quiet`, `--verbose`, dual-output via `emit()`, structured logging.
- [Open Library API Docs](https://openlibrary.org/developers/api) — Official API documentation.
- [Open Library](https://openlibrary.org) — The open, editable library catalog.
@@ -1,5 +1,5 @@
#!/usr/bin/env python3
"""openlibrary-cli — Open Library book metadata from the terminal.
"""openlibrary — Open Library book metadata from the terminal.
Search books, authors, works, and lookup by ISBN using the public
Open Library API. No API key required.
@@ -20,7 +20,7 @@ import requests
DEFAULT_SERVER = "https://openlibrary.org"
ENV_SERVER = os.getenv("OL_SERVER", DEFAULT_SERVER)
ENV_EMAIL = os.getenv("OL_EMAIL", "")
ENV_USER_AGENT = os.getenv("OL_USER_AGENT", "openlibrary-cli/1.0 (+https://github.com)")
ENV_USER_AGENT = os.getenv("OL_USER_AGENT", "openlibrary/1.0 (+https://github.com)")
QUIET = False
GLOBAL_FLAGS: Dict[str, Any] = {
@@ -115,7 +115,7 @@ def fmt_author(a: Dict) -> str:
def cmd_search(client, args):
parser = argparse.ArgumentParser(prog="openlibrary-cli search")
parser = argparse.ArgumentParser(prog="openlibrary search")
parser.add_argument("--query", "-q", required=True)
parser.add_argument("--limit", type=int, default=20)
parser.add_argument("--offset", type=int, default=0)
@@ -160,7 +160,7 @@ def cmd_search(client, args):
def cmd_isbn(client, args):
parser = argparse.ArgumentParser(prog="openlibrary-cli isbn")
parser = argparse.ArgumentParser(prog="openlibrary isbn")
parser.add_argument("isbn", help="ISBN number")
parsed, _ = parser.parse_known_args(args)
@@ -194,7 +194,7 @@ def cmd_isbn(client, args):
def cmd_author(client, args):
parser = argparse.ArgumentParser(prog="openlibrary-cli author")
parser = argparse.ArgumentParser(prog="openlibrary author")
parser.add_argument("key", help="Author key (e.g. OL23919A)")
parsed, _ = parser.parse_known_args(args)
@@ -225,7 +225,7 @@ def cmd_author(client, args):
def cmd_work(client, args):
parser = argparse.ArgumentParser(prog="openlibrary-cli work")
parser = argparse.ArgumentParser(prog="openlibrary work")
parser.add_argument("key", help="Work key (e.g. OL123W)")
parsed, _ = parser.parse_known_args(args)
@@ -257,7 +257,7 @@ def cmd_work(client, args):
def cmd_search_authors(client, args):
parser = argparse.ArgumentParser(prog="openlibrary-cli search-authors")
parser = argparse.ArgumentParser(prog="openlibrary search-authors")
parser.add_argument("--query", "-q", required=True)
parser.add_argument("--limit", type=int, default=20)
parser.add_argument("--offset", type=int, default=0)
@@ -298,9 +298,9 @@ def main():
warnings.simplefilter("ignore")
parser = argparse.ArgumentParser(
prog="openlibrary-cli",
prog="openlibrary",
description="Open Library book metadata from the terminal. No API key required.",
epilog="Global flags work anywhere: openlibrary-cli --json search --query 'dune'"
epilog="Global flags work anywhere: openlibrary --json search --query 'dune'"
)
sub = parser.add_subparsers(dest="command")
+3 -3
View File
@@ -17,15 +17,15 @@ When your agent loads this skill, it can **check hyper-local weather from your o
| Directory | Purpose |
|-----------|---------|
| `SKILL.md` | Complete command reference with examples |
| `scripts/tempest-cli` | CLI tool for WeatherFlow Tempest API |
| `scripts/tempest` | CLI tool for WeatherFlow Tempest API |
| `references/` | API field layout reference |
## Quick Start
```bash
export TEMPEST_TOKEN="your-token-here"
tempest-cli current
tempest-cli forecast
tempest current
tempest forecast
```
## Triggers
+20 -20
View File
@@ -1,5 +1,5 @@
---
name: tempest-cli
name: tempest
description: 'Query hyper-local weather from a WeatherFlow Tempest station: current
conditions, 7-day forecast, historical observations, and real-time UDP broadcasts.
Use when the user asks about the weather, temperature, rain, wind, humidity, forecast,
@@ -12,7 +12,7 @@ metadata:
sources: https://weatherflow.com, https://swd.weatherflow.com/swd/rest
---
# tempest-cli — Hyper-Local Weather from Your Tempest Station
# tempest — Hyper-Local Weather from Your Tempest Station
Query live weather data from a WeatherFlow Tempest station. Supports REST API access to current conditions, forecasts, and history via the cloud, plus local UDP broadcast reception from your hub on the same LAN.
@@ -32,9 +32,9 @@ The CLI reads `TEMPEST_TOKEN` from the environment. It also falls back to readin
### current — Current conditions
```bash
tempest-cli current # human-readable
tempest-cli current --station-id 12345 --device-id 67890 # specific hardware
tempest-cli current --json # machine-readable
tempest current # human-readable
tempest current --station-id 12345 --device-id 67890 # specific hardware
tempest current --json # machine-readable
```
If you have one station, it auto-selects it and picks the best sensor (ST > SKY > AIR, skips the HB hub). Pass `--station-id` or `--device-id` to override.
@@ -42,17 +42,17 @@ If you have one station, it auto-selects it and picks the best sensor (ST > SKY
### forecast — Multi-day forecast (+ current conditions + hourly)
```bash
tempest-cli forecast # current + 5-day daily + 12-hour hourly
tempest-cli forecast --days 3 # fewer days
tempest-cli forecast --station-id 12345 # specific station
tempest-cli forecast --json # machine-readable
tempest forecast # current + 5-day daily + 12-hour hourly
tempest forecast --days 3 # fewer days
tempest forecast --station-id 12345 # specific station
tempest forecast --json # machine-readable
```
### stations — List your stations and devices
```bash
tempest-cli stations # shows station names, IDs, device types, serials
tempest-cli stations --json # full device inventory
tempest stations # shows station names, IDs, device types, serials
tempest stations --json # full device inventory
```
Use this first if you don't know your station ID or want to see what sensors are online.
@@ -60,17 +60,17 @@ Use this first if you don't know your station ID or want to see what sensors are
### obs — Historical observations
```bash
tempest-cli obs --device-id 67890 --days 1 # last 24 hours
tempest-cli obs --device-id 67890 --days 7 # last week
tempest-cli obs --device-id 67890 --json # machine-readable
tempest obs --device-id 67890 --days 1 # last 24 hours
tempest obs --device-id 67890 --days 7 # last week
tempest obs --device-id 67890 --json # machine-readable
```
### udp listen — Real-time broadcasts from the hub
```bash
tempest-cli udp listen # listen indefinitely (Ctrl-C to stop)
tempest-cli udp listen --timeout 30 # auto-stop after 30s
tempest-cli udp listen --show-all # include hub_status messages
tempest udp listen # listen indefinitely (Ctrl-C to stop)
tempest udp listen --timeout 30 # auto-stop after 30s
tempest udp listen --show-all # include hub_status messages
```
Requires being on the same LAN as the hub (port 50222 UDP broadcast). Receives observations, rapid wind updates, lightning strike events, and precipitation start events in real time.
@@ -147,11 +147,11 @@ A station returns all devices including the hub (device_type `HB`). The hub cann
`--json`, `--dry-run`, `--quiet`, and `--verbose` work anywhere in the command:
```bash
tempest-cli --json current --device-id 67890 # flag before subcommand
tempest-cli current --device-id 67890 --json # flag after subcommand
tempest --json current --device-id 67890 # flag before subcommand
tempest current --device-id 67890 --json # flag after subcommand
```
## References
- [references/tempest-api-field-layouts.md](references/tempest-api-field-layouts.md) — Full field index maps for obs_st, obs_air, and obs_sky observation arrays. Read when decoding raw JSON output or building on top of the Tempest API.
- [scripts/tempest-cli](scripts/tempest-cli) — The CLI binary itself. Designed following the cli-builder patterns: non-interactive, `--json`, `--dry-run`, `--quiet`, `--verbose`, idempotent, dual-output via `emit()`, and structured logging.
- [scripts/tempest](scripts/tempest) — The CLI binary itself. Designed following the cli-builder patterns: non-interactive, `--json`, `--dry-run`, `--quiet`, `--verbose`, idempotent, dual-output via `emit()`, and structured logging.
@@ -1,5 +1,5 @@
#!/usr/bin/env python3
"""tempest-cli — Hyper-local weather from your Tempest station.
"""tempest — Hyper-local weather from your Tempest station.
Two data sources:
REST API — stations, observations, forecast via WeatherFlow cloud
@@ -319,7 +319,7 @@ def cmd_stations(client: TempestClient, args: List[str]) -> None:
def cmd_current(client: TempestClient, args: List[str]) -> None:
"""Get latest observations from your station."""
parser = argparse.ArgumentParser(prog="tempest-cli current")
parser = argparse.ArgumentParser(prog="tempest current")
parser.add_argument("--station-id", type=int, help="Station ID (optional if only one station)")
parser.add_argument("--device-id", type=int, help="Device ID (default: first Tempest device)")
parsed, _ = parser.parse_known_args(args)
@@ -385,7 +385,7 @@ def cmd_current(client: TempestClient, args: List[str]) -> None:
def cmd_obs(client: TempestClient, args: List[str]) -> None:
"""Get historical observations."""
parser = argparse.ArgumentParser(prog="tempest-cli obs")
parser = argparse.ArgumentParser(prog="tempest obs")
parser.add_argument("--device-id", type=int, required=True, help="Device ID (required)")
parser.add_argument("--days", type=int, default=1, help="Days back to fetch (default: 1)")
parsed, _ = parser.parse_known_args(args)
@@ -416,7 +416,7 @@ def cmd_obs(client: TempestClient, args: List[str]) -> None:
def cmd_forecast(client: TempestClient, args: List[str]) -> None:
"""Get forecast — current conditions + daily + hourly."""
parser = argparse.ArgumentParser(prog="tempest-cli forecast")
parser = argparse.ArgumentParser(prog="tempest forecast")
parser.add_argument("--station-id", type=int, help="Station ID (optional if only one station)")
parser.add_argument("--days", type=int, default=5, help="Days of daily forecast (default: 5)")
parsed, _ = parser.parse_known_args(args)
@@ -523,7 +523,7 @@ def cmd_forecast(client: TempestClient, args: List[str]) -> None:
def udp_listen(args: List[str]) -> None:
"""Listen for local UDP broadcasts from the Tempest hub."""
parser = argparse.ArgumentParser(prog="tempest-cli udp listen")
parser = argparse.ArgumentParser(prog="tempest udp listen")
parser.add_argument("--port", type=int, default=DEFAULT_UDP_PORT, help=f"UDP port (default: {DEFAULT_UDP_PORT})")
parser.add_argument("--timeout", type=int, default=0, help="Listen for N seconds (0 = indefinite)")
parser.add_argument("--show-all", action="store_true", help="Show raw message type even if unknown")
@@ -623,9 +623,9 @@ def main() -> None:
warnings.simplefilter("ignore")
parser = argparse.ArgumentParser(
prog="tempest-cli",
prog="tempest",
description="Hyper-local weather from your Tempest station.",
epilog="Global flags can appear anywhere: tempest-cli --json current --device-id X"
epilog="Global flags can appear anywhere: tempest --json current --device-id X"
)
sub = parser.add_subparsers(dest="command", help="Available commands")
+3 -3
View File
@@ -17,14 +17,14 @@ When your agent loads this skill, it can **access the entire TMDb catalog** with
| Directory | Purpose |
|-----------|---------|
| `SKILL.md` | Complete command reference with compound filter examples |
| `scripts/tmdb-cli` | CLI tool for TMDb v3 API |
| `scripts/tmdb` | CLI tool for TMDb v3 API |
## Quick Start
```bash
export TMDB_ACCESS_TOKEN="your-tmdb-access-token"
tmdb-cli movie search --term "dune"
tmdb-cli movie discover --genre horror --certification R
tmdb movie search --term "dune"
tmdb movie discover --genre horror --certification R
```
## Triggers
+35 -35
View File
@@ -1,5 +1,5 @@
---
name: tmdb-cli
name: tmdb
description: Search and discover movies, TV shows, and trending content via The Movie
Database (TMDb) API v3. Use when the user asks about movies, TV, film, cinema, genres,
certifications, ratings, cast, upcoming releases, or trending media.
@@ -11,7 +11,7 @@ metadata:
sources: https://developer.themoviedb.org/reference, https://www.themoviedb.org/settings/api
---
# tmdb-cli — Movie & TV Discovery from the Terminal
# tmdb — Movie & TV Discovery from the Terminal
Search movies and TV shows by keyword, discover by genre/certification/rating/date, check trending and upcoming releases, browse genre lists, and view US certification ratings — all from TMDb's v3 API.
@@ -33,9 +33,9 @@ export TMDB_API_KEY="your-tmdb-api-key"
### movie search — Search movies by keyword
```bash
tmdb-cli movie search --term "dune" # basic search
tmdb-cli movie search --term "inception" --limit 5 # top 5 results
tmdb-cli movie search --term "arrival" --json # machine-readable
tmdb movie search --term "dune" # basic search
tmdb movie search --term "inception" --limit 5 # top 5 results
tmdb movie search --term "arrival" --json # machine-readable
```
Shows: title, release year, vote average.
@@ -43,29 +43,29 @@ Shows: title, release year, vote average.
### movie discover — Discover movies by genre, certification, rating, and date
```bash
tmdb-cli movie discover --genre horror # horror movies
tmdb-cli movie discover --genre horror --certification R # horror, R-rated
tmdb-cli movie discover --genre comedy --rating 7 --limit 15 # highly-rated comedy
tmdb-cli movie discover --from 2024-01-01 --to 2024-12-31 # released in 2024
tmdb-cli movie discover --genre scifi --from 2026-05-01 # recent sci-fi
tmdb-cli movie discover --genre thriller --certification R \
tmdb movie discover --genre horror # horror movies
tmdb movie discover --genre horror --certification R # horror, R-rated
tmdb movie discover --genre comedy --rating 7 --limit 15 # highly-rated comedy
tmdb movie discover --from 2024-01-01 --to 2024-12-31 # released in 2024
tmdb movie discover --genre scifi --from 2026-05-01 # recent sci-fi
tmdb movie discover --genre thriller --certification R \
--rating 6 --from 2025-01-01 --limit 20 # compound filter
```
### movie upcoming — Upcoming movie releases
```bash
tmdb-cli movie upcoming # next 10 upcoming
tmdb-cli movie upcoming --limit 20 # more results
tmdb-cli movie upcoming --json # machine-readable
tmdb movie upcoming # next 10 upcoming
tmdb movie upcoming --limit 20 # more results
tmdb movie upcoming --json # machine-readable
```
### tv search — Search TV shows by keyword
```bash
tmdb-cli tv search --term "severance" # basic TV search
tmdb-cli tv search --term "the expanse" --limit 5
tmdb-cli tv search --term "silo" --json
tmdb tv search --term "severance" # basic TV search
tmdb tv search --term "the expanse" --limit 5
tmdb tv search --term "silo" --json
```
Shows: name, first air year, vote average.
@@ -73,33 +73,33 @@ Shows: name, first air year, vote average.
### tv discover — Discover TV shows by genre, rating, and air date
```bash
tmdb-cli tv discover --genre sci-fi # sci-fi shows
tmdb-cli tv discover --genre drama --rating 7 # critically-acclaimed drama
tmdb-cli tv discover --genre comedy --from 2025-01-01 # recent comedy
tmdb tv discover --genre sci-fi # sci-fi shows
tmdb tv discover --genre drama --rating 7 # critically-acclaimed drama
tmdb tv discover --genre comedy --from 2025-01-01 # recent comedy
```
### trending — Trending content across day or week
```bash
tmdb-cli trending # trending movies this week
tmdb-cli trending --type tv # trending TV this week
tmdb-cli trending --type all --window day # all media trending today
tmdb-cli trending --limit 20 --json # top 20 as JSON
tmdb trending # trending movies this week
tmdb trending --type tv # trending TV this week
tmdb trending --type all --window day # all media trending today
tmdb trending --limit 20 --json # top 20 as JSON
```
### genre list — Browse available genres
```bash
tmdb-cli genre list --type movie # all movie genres
tmdb-cli genre list --type tv # all TV genres
tmdb-cli genre list --type movie --json
tmdb genre list --type movie # all movie genres
tmdb genre list --type tv # all TV genres
tmdb genre list --type movie --json
```
### certification — View US movie certification ratings
```bash
tmdb-cli certification # US certification list
tmdb-cli certification --json # machine-readable
tmdb certification # US certification list
tmdb certification --json # machine-readable
```
## Global Flags
@@ -107,11 +107,11 @@ tmdb-cli certification --json # machine-readable
These flags work in any position before, between, or after subcommands:
```bash
tmdb-cli --json movie search --term "dune" # JSON output
tmdb-cli movie search --term "dune" --json # json after subcommand
tmdb-cli --dry-run movie discover --genre horror # preview without API call
tmdb-cli --quiet trending # suppress diagnostic output
tmdb-cli --verbose movie search --term "alien" # verbose logging
tmdb --json movie search --term "dune" # JSON output
tmdb movie search --term "dune" --json # json after subcommand
tmdb --dry-run movie discover --genre horror # preview without API call
tmdb --quiet trending # suppress diagnostic output
tmdb --verbose movie search --term "alien" # verbose logging
```
## Known Gotchas
@@ -124,6 +124,6 @@ tmdb-cli --verbose movie search --term "alien" # verbose logging
## References
- [scripts/tmdb-cli](scripts/tmdb-cli) — The CLI binary. Built following the cli-builder patterns: non-interactive, `--json`, `--dry-run`, `--quiet`, `--verbose`, dual-output via `emit()`, lazy auth, structured logging.
- [scripts/tmdb](scripts/tmdb) — The CLI binary. Built following the cli-builder patterns: non-interactive, `--json`, `--dry-run`, `--quiet`, `--verbose`, dual-output via `emit()`, lazy auth, structured logging.
- [TMDb API v3 Reference](https://developer.themoviedb.org/reference) — Official API documentation.
- [TMDb API Settings (get a key)](https://www.themoviedb.org/settings/api) — Free API key registration.
@@ -1,5 +1,5 @@
#!/usr/bin/env python3
"""tmdb-cli — The Movie Database API for agent-based media discovery.
"""tmdb — The Movie Database API for agent-based media discovery.
Discover movies and TV shows by genre, rating, certification, and date.
Search by term, get details, check trending, upcoming, and now playing.
@@ -170,7 +170,7 @@ def fmt_tv(t, idx=None):
def cmd_movie_search(client, args):
p = argparse.ArgumentParser(prog="tmdb-cli movie search")
p = argparse.ArgumentParser(prog="tmdb movie search")
p.add_argument("--term", "-t", required=True)
p.add_argument("--limit", type=int, default=10)
parsed, _ = p.parse_known_args(args)
@@ -186,7 +186,7 @@ def cmd_movie_search(client, args):
def cmd_movie_discover(client, args):
p = argparse.ArgumentParser(prog="tmdb-cli movie discover")
p = argparse.ArgumentParser(prog="tmdb movie discover")
p.add_argument("--genre", help="Genre name (e.g. horror, comedy)")
p.add_argument("--certification", help="US certification (G, PG, PG-13, R, NC-17)")
p.add_argument("--rating", type=float, help="Min vote average (0-10)")
@@ -231,7 +231,7 @@ def _resolve_movie_genre(client, name):
def cmd_tv_discover(client, args):
p = argparse.ArgumentParser(prog="tmdb-cli tv discover")
p = argparse.ArgumentParser(prog="tmdb tv discover")
p.add_argument("--genre", help="Genre name")
p.add_argument("--rating", type=float, help="Min vote average")
p.add_argument("--from", dest="air_date_gte", help="Air date from")
@@ -268,7 +268,7 @@ def _resolve_tv_genre(client, name):
def cmd_trending(client, args):
p = argparse.ArgumentParser(prog="tmdb-cli trending")
p = argparse.ArgumentParser(prog="tmdb trending")
p.add_argument("--type", default="movie", choices=["movie", "tv", "all"])
p.add_argument("--window", default="week", choices=["day", "week"])
p.add_argument("--limit", type=int, default=10)
@@ -294,7 +294,7 @@ def cmd_trending(client, args):
def cmd_genre_list(client, args):
p = argparse.ArgumentParser(prog="tmdb-cli genre list")
p = argparse.ArgumentParser(prog="tmdb genre list")
p.add_argument("--type", required=True, choices=["movie", "tv"])
parsed, _ = p.parse_known_args(args)
@@ -322,7 +322,7 @@ def cmd_cert_list(client, args):
def cmd_upcoming(client, args):
p = argparse.ArgumentParser(prog="tmdb-cli movie upcoming")
p = argparse.ArgumentParser(prog="tmdb movie upcoming")
p.add_argument("--limit", type=int, default=10)
parsed, _ = p.parse_known_args(args)
if client.dry_run:
@@ -341,7 +341,7 @@ def main():
if GLOBAL_FLAGS.get("json", False):
warnings.simplefilter("ignore")
parser = argparse.ArgumentParser(prog="tmdb-cli", description="The Movie Database API CLI.")
parser = argparse.ArgumentParser(prog="tmdb", description="The Movie Database API CLI.")
sub = parser.add_subparsers(dest="resource")
# movie