/cli-anything-joplin
Command-line interface for Joplin workflows using the real joplin terminal backend
$ npx -y skills add HKUDS/CLI-Anything --skill cli-anything-joplin --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
- Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
- You can call itInvoke it directly when you want it.
- Slash command
/cli-anything-joplin
Context preview
The summary Claude sees to decide when to auto-load this skill.
Command-line interface for Joplin workflows using the real joplin terminal backend
SKILL.md
cli-anything-joplin.SKILL.mdname: "cli-anything-joplin"
description: "Command-line interface for Joplin workflows using the real joplin terminal backend"
cli-anything-joplin
Use this skill to automate Joplin notebook, note, to-do, tag, attachment, search, sync, and import/export workflows through a stateful harness backed by the real `joplin` terminal binary.
Requirements
- Python 3.10+
- Joplin terminal binary available as `joplin`
- Optional: pass `--profile` to target a specific Joplin profile
Install
cd joplin/agent-harness
pip install -e .
Usage
# REPL mode (default)
cli-anything-joplin
# Machine-readable one-shot command
cli-anything-joplin --json notebooks list
# Stateful project
cli-anything-joplin project new --name demo -o ./demo.joplin-harness.json
cli-anything-joplin --project ./demo.joplin-harness.json notes create "Meeting note"
# Dry-run (no auto-save)
cli-anything-joplin --json --dry-run --project ./demo.joplin-harness.json notes create temp
JSON output contract
When `--json` is enabled, commands return:
- `ok`: boolean
- `command`: stable command identifier such as `notes.list`, `todos.toggle`
- `data`: command payload
- `error`: null on success, or `{ type, message }` on failure
Command groups
- `project`: `new`, `open`, `save`, `info`, `json`, `status`
- `notebooks`: `list`, `create`, `use`, `remove`
- `notes`: `list`, `create`, `set`, `get`, `remove`, `copy`, `move`, `rename`
- `todos`: `list`, `create`, `toggle`, `clear`, `done`, `undone`
- `tags`: `list`, `add`, `remove`, `notetags`, `tagnotes`
- `search`: `run`
- `sync`: `run` (`--target`, `--upgrade`, `--use-lock`)
- `interop`: `import`, `export`
- `config`: `get`, `set`, `list`, `export`, `import-file`
- `attach`: `add`
- `status`: `show`, `restore`
- `backend`: `version`, `dump`, `keymap`, `geoloc`, `export-sync-status`
- `server`: `status`, `start`, `stop`
- `e2ee`: `status`, `target-status`, `decrypt`, `decrypt-file`
- `session`: `status`, `undo`, `redo`, `history`
Agent guidance
- Prefer `--json` for parseable output.
- Use `--project` when running multi-step workflows so history is persisted.
- One-shot mutating commands auto-save the project unless `--dry-run` is set.
- REPL mode does not auto-save; run `project save` explicitly.
- Some Joplin CLI builds gate `search` behind GUI mode; if you see
`"only available in GUI mode"`, treat search as best-effort.
- Joplin 3.6.x can have a broken `version` command in npm global layouts; the
harness falls back to installed package metadata for `backend version`, probing the symlink-resolved binary directory, the Windows-style sibling `node_modules/joplin`, the Unix-style parent `lib/node_modules/joplin`, and finally `npm root -g`.
- Backend `stdout`/`stderr` in command results are verbatim; do not assume
warnings were stripped from note bodies or exports.
- On failure, parse `error` using the same `command` field as success
(`config.import_file`, `e2ee.decrypt_file`). Multi-word subcommands use a single dot between group and subcommand.
Test workflow
# Quick feedback loop
python -m pytest -q cli_anything/joplin/tests/test_core.py
python -m pytest -q cli_anything/joplin/tests/test_full_e2e.py::TestCLISubprocess
# Real backend (joplin must be in PATH)
python -m pytest -v cli_anything/joplin/tests/test_full_e2e.py::TestBackendCommands
python -m pytest -v cli_anything/joplin/tests/test_full_e2e.py::TestBackendWorkflows
python -m pytest -v cli_anything/joplin/tests/test_full_e2e.py::TestBackendIntegration
# Full suite
python -m pytest -v --tb=no cli_anything/joplin/tests
# Verify the installed console script entry point
CLI_ANYTHING_FORCE_INSTALLED=1 python -m pytest -v -s cli_anything/joplin/tests/test_full_e2e.py
Current validation baseline (Windows + Joplin CLI 3.6.2):
- `python -m pytest -q cli_anything/joplin/tests/test_core.py` -> `107 passed`
- `python -m pytest -q cli_anything/joplin/tests` -> `134 passed, 1 skipped`
Read more
name: "cli-anything-joplin" description: "Command-line interface for Joplin workflows using the real joplin terminal backend"
cli-anything-joplin
Use this skill to automate Joplin notebook, note, to-do, tag, attachment, search, sync, and import/export workflows through a stateful harness backed by the real `joplin` terminal binary.
Requirements
- Python 3.10+
- Joplin terminal binary available as `joplin`
- Optional: pass `--profile` to target a specific Joplin profile
Install
cd joplin/agent-harness pip install -e .
Usage
# REPL mode (default) cli-anything-joplin # Machine-readable one-shot command cli-anything-joplin --json notebooks list # Stateful project cli-anything-joplin project new --name demo -o ./demo.joplin-harness.json cli-anything-joplin --project ./demo.joplin-harness.json notes create "Meeting note" # Dry-run (no auto-save) cli-anything-joplin --json --dry-run --project ./demo.joplin-harness.json notes create temp
JSON output contract
When `--json` is enabled, commands return:
- `ok`: boolean
- `command`: stable command identifier such as `notes.list`, `todos.toggle`
- `data`: command payload
- `error`: null on success, or `{ type, message }` on failure
Command groups
- `project`: `new`, `open`, `save`, `info`, `json`, `status`
- `notebooks`: `list`, `create`, `use`, `remove`
- `notes`: `list`, `create`, `set`, `get`, `remove`, `copy`, `move`, `rename`
- `todos`: `list`, `create`, `toggle`, `clear`, `done`, `undone`
- `tags`: `list`, `add`, `remove`, `notetags`, `tagnotes`
- `search`: `run`
- `sync`: `run` (`--target`, `--upgrade`, `--use-lock`)
- `interop`: `import`, `export`
- `config`: `get`, `set`, `list`, `export`, `import-file`
- `attach`: `add`
- `status`: `show`, `restore`
- `backend`: `version`, `dump`, `keymap`, `geoloc`, `export-sync-status`
- `server`: `status`, `start`, `stop`
- `e2ee`: `status`, `target-status`, `decrypt`, `decrypt-file`
- `session`: `status`, `undo`, `redo`, `history`
Agent guidance
- Prefer `--json` for parseable output.
- Use `--project` when running multi-step workflows so history is persisted.
- One-shot mutating commands auto-save the project unless `--dry-run` is set.
- REPL mode does not auto-save; run `project save` explicitly.
- Some Joplin CLI builds gate `search` behind GUI mode; if you see
`"only available in GUI mode"`, treat search as best-effort.
- Joplin 3.6.x can have a broken `version` command in npm global layouts; the
harness falls back to installed package metadata for `backend version`, probing the symlink-resolved binary directory, the Windows-style sibling `node_modules/joplin`, the Unix-style parent `lib/node_modules/joplin`, and finally `npm root -g`.
- Backend `stdout`/`stderr` in command results are verbatim; do not assume
warnings were stripped from note bodies or exports.
- On failure, parse `error` using the same `command` field as success
(`config.import_file`, `e2ee.decrypt_file`). Multi-word subcommands use a single dot between group and subcommand.
Test workflow
# Quick feedback loop python -m pytest -q cli_anything/joplin/tests/test_core.py python -m pytest -q cli_anything/joplin/tests/test_full_e2e.py::TestCLISubprocess # Real backend (joplin must be in PATH) python -m pytest -v cli_anything/joplin/tests/test_full_e2e.py::TestBackendCommands python -m pytest -v cli_anything/joplin/tests/test_full_e2e.py::TestBackendWorkflows python -m pytest -v cli_anything/joplin/tests/test_full_e2e.py::TestBackendIntegration # Full suite python -m pytest -v --tb=no cli_anything/joplin/tests # Verify the installed console script entry point CLI_ANYTHING_FORCE_INSTALLED=1 python -m pytest -v -s cli_anything/joplin/tests/test_full_e2e.py
Current validation baseline (Windows + Joplin CLI 3.6.2):
- `python -m pytest -q cli_anything/joplin/tests/test_core.py` -> `107 passed`
- `python -m pytest -q cli_anything/joplin/tests` -> `134 passed, 1 skipped`
"CLI-Anything: Making ALL Software Agent-Native" -- CLI-Hub: https://clianything.cc/
Repo: HKUDS/CLI-Anything
Other skills on cli-anything.
- /cli-anything-firefly-iii
Firefly III CLI - Personal finance management via CLI-Anything
Open skill - /cli-anything-openrefine
Use OpenRefine through an agent-native CLI for importing messy data, applying JSON operation histories, inspecting rows, exporting cleaned data, and managing session undo/redo.
Open skill - /cli-anything-adguardhome
Command-line interface for AdGuard Home - Network-wide ad blocking and DNS management via AdGuard Home REST API. Designed for AI agents and power users who need to manage filtering, DNS rewrites, clients, DHCP, and query logs without a GUI.
Open skill - /cli-anything-anygen
Command-line interface for Anygen - A stateful command-line interface for AnyGen OpenAPI — generate professional slides, documents, webs...
Open skill - /cli-anything-audacity
Command-line interface for Audacity - A stateful command-line interface for audio editing, following the same patterns as the GIMP and Ble...
Open skill - /cli-anything-blender
Command-line interface for Blender - A stateful command-line interface for 3D scene editing, following the same patterns as the GIMP CLI ...
Open skill

