From 66241a25c1e615e401adadbc7acb077cc1381d1e Mon Sep 17 00:00:00 2001 From: ChengYe <666@orgleaf.com> Date: Thu, 16 Apr 2026 11:37:34 +0800 Subject: [PATCH 01/20] feat: add Calibre CLI harness for e-book library management - Add calibre/agent-harness with 58 tests (38 unit + 20 e2e) - Wraps calibredb, ebook-convert, ebook-meta for library operations - Includes SKILL.md for agent skill discovery - Update registry.json with calibre entry - Update .gitignore to track calibre/agent-harness/ Co-Authored-By: Claude Opus 4.6 --- .gitignore | 4 + calibre/agent-harness/.gitignore | 24 + calibre/agent-harness/CALIBRE.md | 160 ++++ .../cli_anything/calibre/README.md | 188 ++++ .../cli_anything/calibre/__init__.py | 3 + .../cli_anything/calibre/__main__.py | 5 + .../cli_anything/calibre/calibre_cli.py | 815 ++++++++++++++++++ .../cli_anything/calibre/core/__init__.py | 1 + .../cli_anything/calibre/core/custom.py | 105 +++ .../cli_anything/calibre/core/export.py | 375 ++++++++ .../cli_anything/calibre/core/formats.py | 168 ++++ .../cli_anything/calibre/core/library.py | 193 +++++ .../cli_anything/calibre/core/metadata.py | 158 ++++ .../cli_anything/calibre/core/session.py | 76 ++ .../cli_anything/calibre/skills/SKILL.md | 282 ++++++ .../cli_anything/calibre/tests/TEST.md | 273 ++++++ .../cli_anything/calibre/tests/__init__.py | 0 .../cli_anything/calibre/tests/test_core.py | 618 +++++++++++++ .../calibre/tests/test_full_e2e.py | 536 ++++++++++++ .../cli_anything/calibre/utils/__init__.py | 1 + .../calibre/utils/calibre_backend.py | 182 ++++ .../cli_anything/calibre/utils/repl_skin.py | 498 +++++++++++ calibre/agent-harness/setup.py | 25 + registry.json | 19 + 24 files changed, 4709 insertions(+) create mode 100644 calibre/agent-harness/.gitignore create mode 100644 calibre/agent-harness/CALIBRE.md create mode 100644 calibre/agent-harness/cli_anything/calibre/README.md create mode 100644 calibre/agent-harness/cli_anything/calibre/__init__.py create mode 100644 calibre/agent-harness/cli_anything/calibre/__main__.py create mode 100644 calibre/agent-harness/cli_anything/calibre/calibre_cli.py create mode 100644 calibre/agent-harness/cli_anything/calibre/core/__init__.py create mode 100644 calibre/agent-harness/cli_anything/calibre/core/custom.py create mode 100644 calibre/agent-harness/cli_anything/calibre/core/export.py create mode 100644 calibre/agent-harness/cli_anything/calibre/core/formats.py create mode 100644 calibre/agent-harness/cli_anything/calibre/core/library.py create mode 100644 calibre/agent-harness/cli_anything/calibre/core/metadata.py create mode 100644 calibre/agent-harness/cli_anything/calibre/core/session.py create mode 100644 calibre/agent-harness/cli_anything/calibre/skills/SKILL.md create mode 100644 calibre/agent-harness/cli_anything/calibre/tests/TEST.md create mode 100644 calibre/agent-harness/cli_anything/calibre/tests/__init__.py create mode 100644 calibre/agent-harness/cli_anything/calibre/tests/test_core.py create mode 100644 calibre/agent-harness/cli_anything/calibre/tests/test_full_e2e.py create mode 100644 calibre/agent-harness/cli_anything/calibre/utils/__init__.py create mode 100644 calibre/agent-harness/cli_anything/calibre/utils/calibre_backend.py create mode 100644 calibre/agent-harness/cli_anything/calibre/utils/repl_skin.py create mode 100644 calibre/agent-harness/setup.py diff --git a/.gitignore b/.gitignore index e1b286a08..cef559d80 100644 --- a/.gitignore +++ b/.gitignore @@ -93,6 +93,7 @@ !/quietshrink/ !/mailchimp/ !/3MF/ +!/calibre/ # Step 5: Inside each software dir, ignore everything (including dotfiles) /gimp/* /gimp/.* @@ -192,6 +193,8 @@ /quietshrink/.* /mailchimp/* /mailchimp/.* +/calibre/* +/calibre/.* # Step 6: ...except agent-harness/ !/gimp/agent-harness/ @@ -241,6 +244,7 @@ !/QGIS/agent-harness/ !/n8n/agent-harness/ !/obsidian/agent-harness/ +!/calibre/agent-harness/ !/safari/ !/safari/agent-harness/ !/unrealinsights/agent-harness/ diff --git a/calibre/agent-harness/.gitignore b/calibre/agent-harness/.gitignore new file mode 100644 index 000000000..8278e6b7b --- /dev/null +++ b/calibre/agent-harness/.gitignore @@ -0,0 +1,24 @@ +# Python +__pycache__/ +*.py[cod] +*$py.class +*.so + +# Package build +*.egg-info/ +dist/ +build/ +*.egg + +# Testing +.pytest_cache/ +.coverage +htmlcov/ + +# IDE +.idea/ +.vscode/ +*.swp + +# Session files +.cli-anything-calibre/ \ No newline at end of file diff --git a/calibre/agent-harness/CALIBRE.md b/calibre/agent-harness/CALIBRE.md new file mode 100644 index 000000000..9e27bfda2 --- /dev/null +++ b/calibre/agent-harness/CALIBRE.md @@ -0,0 +1,160 @@ +# Calibre CLI Harness — SOP + +## Overview + +Calibre is the world's most popular e-book management application. This CLI harness wraps the real Calibre tools (`calibredb`, `ebook-convert`, `ebook-meta`) to give AI agents and scripts a clean, structured interface for library management, metadata editing, and format conversion. + +## Backend Architecture + +### Real Software Used + +All heavy lifting is done by the **actual Calibre binaries**: + +| Task | Tool | Command Pattern | +|------|------|----------------| +| Library operations | `calibredb` | `calibredb --library-path ` | +| Format conversion | `ebook-convert` | `ebook-convert input.epub output.mobi` | +| File metadata | `ebook-meta` | `ebook-meta book.epub --field value` | + +The CLI harness is a **stateful wrapper** — it tracks the library path in a session file and passes it to every `calibredb` invocation. It never reimplements library logic. + +### Data Model + +``` +~/Calibre Library/ +├── metadata.db # SQLite database (all metadata) +├── Author Name (ID)/ +│ ├── Book Title (ID)/ +│ │ ├── cover.jpg # Cover image +│ │ ├── metadata.opf # OPF metadata file +│ │ ├── Title - Author.epub +│ │ └── Title - Author.mobi +``` + +### Session State + +The CLI maintains a JSON session file at `~/.cli-anything-calibre/session.json`: +```json +{ + "library_path": "/path/to/Calibre Library", + "last_command": "list", + "filters": {} +} +``` + +## Command Groups + +### `library` - Library management +- `connect ` — Set active library path +- `info` — Show library stats (book count, formats, size) +- `check` — Verify library integrity + +### `books` — Book operations (wrap `calibredb`) +- `list` — List books with filtering and sorting +- `search ` — Search using Calibre query language +- `add ` — Add book files to library +- `remove ` — Remove books (move to trash) +- `show ` — Show full metadata for a book +- `export ` — Export books to directory + +### `meta` — Metadata editing (wrap `calibredb set_metadata`) +- `set ` — Set a metadata field +- `get [field]` — Get metadata (all or specific field) +- `embed ` — Embed metadata into book files + +### `formats` — Format management (wrap `calibredb` + `ebook-convert`) +- `list ` — List available formats for a book +- `add ` — Add a format to a book +- `remove ` — Remove a format from a book +- `convert ` — Convert book format + +### `custom` — Custom columns (wrap `calibredb`) +- `list` — List all custom columns +- `add