{"id":"7d44019a-d468-4a19-bb32-783b2114f004","entityType":"agent","slug":"clawhub-nextaltair-calibre-catalog-read","name":"Calibre Catalog Read","canonicalUrl":"https://www.xpersona.co/agent/clawhub-nextaltair-calibre-catalog-read","canonicalPath":"/agent/clawhub-nextaltair-calibre-catalog-read","generatedAt":"2026-10-09T21:37:04.846Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-04-15T00:45:39.800Z","emptyReason":null},"description":"Read Calibre catalog data via calibredb over a Content server, and run one-book analysis workflow that writes HTML analysis block back to comments while caching analysis state in SQLite. Use for list/search/id lookups and AI reading pipeline for a selected book.","descriptionLabel":"Source description","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 714 downloads reported by the source. Last updated 4/15/2026.","installCommand":"clawhub skill install kn747bx1r2jrbbyca61v6k06397zy93t:calibre-catalog-read","sourceUrl":"https://clawhub.ai/NEXTAltair/calibre-catalog-read","homepage":"https://clawhub.ai/NEXTAltair/calibre-catalog-read","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/NEXTAltair/calibre-catalog-read","kind":"source"}],"safetyScore":84,"overallRank":62,"popularityScore":57,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"Calibre Catalog Read technical dossier on Xpersona with agent coverage, OPENCLEW support, and live trust metadata."},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-04-15T00:45:39.800Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-04-15T00:45:39.800Z","emptyReason":null},"stars":null,"forks":null,"downloads":714,"packageName":null,"latestVersion":"1.0.5","tractionLabel":"714 downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-03-01T02:54:02.007Z","emptyReason":null},"lastUpdatedAt":"2026-04-15T00:45:39.800Z","lastCrawledAt":"2026-03-01T02:54:02.007Z","lastIndexedAt":null,"nextCrawlAt":"2026-03-02T02:54:02.007Z","lastVerifiedAt":null,"highlights":[{"version":"1.0.5","createdAt":"2026-02-13T14:16:21.653Z","changelog":"- Improved error handling and comments in Python analysis scripts. - Updated prompt instructions for subagent analysis to clarify required structure and language use. - Minor documentation adjustments for clarity in orchestration and session policies.","fileCount":12,"zipByteSize":20680},{"version":"1.0.4","createdAt":"2026-02-13T14:11:18.167Z","changelog":"calibre-catalog-read 1.0.4 - Added requirement and guidance to use `uv run python` instead of `python3` for running Python scripts. - Updated required bins in metadata to include `uv`. - Declared dependency on `subagent-spawn-command-builder` in metadata. - Updated documentation in SKILL.md and README.md to reflect these changes in command examples and environment setup.","fileCount":12,"zipByteSize":20666},{"version":"1.0.3","createdAt":"2026-02-13T13:59:59.747Z","changelog":"calibre-catalog-read 1.0.3 adds full subagent support for book analysis workflows. - Added subagent workflow references and schemas: prompt template, input, and output schemas for subagent analysis generation. - Added scripts for full analysis orchestration: `run_analysis_pipeline.py`, database state tracking (`analysis_db.py`), state/runs management (`run_state.mjs`), and completion handling (`handle_completion.mjs`). - Added extraction input preparation utilities to split raw book text for subagent ingestion. - Updated chat/orchestration notes and policy documentation for strict two-turn execution (start and completion). - All new files and scripts are focused on enabling scalable, non-blocking AI reading workflows via subagent calls and strict DB/state management.","fileCount":null,"zipByteSize":null},{"version":"1.0.2","createdAt":"2026-02-13T13:57:01.169Z","changelog":"- Removes all subagent and analysis pipeline scripts and reference files, simplifying the skill. - Updates documentation in README.md and SKILL.md to match the removal and current command usage. - Clarifies environment variable handling and introduces metadata block. - Removes support for book analysis workflow—now focused on read-only catalog lookups (list/search/id).","fileCount":null,"zipByteSize":null},{"version":"1.0.0","createdAt":"2026-02-13T13:22:44.861Z","changelog":"calibre-catalog-read v1.0.0 - Migrated all orchestration and pipeline helper scripts from Python to Node.js (now `.mjs`). - Added Node.js equivalents: `handle_completion.mjs`, `prepare_subagent_input.mjs`, and `run_state.mjs`. - Removed Python script versions: `handle_completion.py`, `prepare_subagent_input.py`, `run_state.py`. - Updated documentation for new environment variable authentication method and Node.js commands. - Changed cache DB path recommendations to reside within the skill's own state directory. - Clarified orchestration, authentication, and main/subagent division in documentation.","fileCount":null,"zipByteSize":null},{"version":"0.1.1","createdAt":"2026-02-12T14:06:36.081Z","changelog":"calibre-catalog-read 0.1.1 - Added required dependency on `subagent-spawn-command-builder` for subagent payload building. - Updated orchestration: main agent must use the builder skill to generate `sessions_spawn` payloads with profile `calibre-read`. - Clarified that Python commands must use `python3`. - Enhanced subagent launch policy: must use strict prompt and not send ad-hoc relaxations. - Improved documentation for orchestration, chat turn separation, and turn rules.","fileCount":null,"zipByteSize":null},{"version":"0.1.0","createdAt":"2026-02-11T15:35:17.205Z","changelog":"calibre-catalog-read 0.1.0 - Initial release with catalog reading via calibredb over a Content server. - Supports list, search, and get-by-id operations for books. - Adds one-book AI analysis workflow: export, analyze, cache, and apply HTML analysis to comments. - Caches analysis state in SQLite; includes DB initialization and status check scripts. - Implements strict main vs subagent workflow for seamless async chat operation. - Includes session state handling and orchestration guidelines for chat/agent flows.","fileCount":null,"zipByteSize":null}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install kn747bx1r2jrbbyca61v6k06397zy93t:calibre-catalog-read","setupComplexity":"low","setupSteps":["Install using `clawhub skill install kn747bx1r2jrbbyca61v6k06397zy93t:calibre-catalog-read` in an isolated environment before connecting it to live workloads.","No published capability contract is available yet, so validate auth and request/response behavior manually.","Review the upstream CLAWHUB listing at https://clawhub.ai/NEXTAltair/calibre-catalog-read before using production credentials."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-nextaltair-calibre-catalog-read/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-nextaltair-calibre-catalog-read/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-nextaltair-calibre-catalog-read/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-nextaltair-calibre-catalog-read/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-nextaltair-calibre-catalog-read/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-nextaltair-calibre-catalog-read/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-09T21:37:04.845Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-nextaltair-calibre-catalog-read/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-nextaltair-calibre-catalog-read/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-nextaltair-calibre-catalog-read/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-nextaltair-calibre-catalog-read/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-04-15T00:45:39.800Z","emptyReason":null},"readme":"Skill: Calibre Catalog Read\n\nOwner: NEXTAltair\n\nSummary: Read Calibre catalog data via calibredb over a Content server, and run one-book analysis workflow that writes HTML analysis block back to comments while caching analysis state in SQLite. Use for list/search/id lookups and AI reading pipeline for a selected book.\n\nTags: latest:1.0.5\n\nVersion history:\n\nv1.0.5 | 2026-02-13T14:16:21.653Z | auto\n\n- Improved error handling and comments in Python analysis scripts.\n- Updated prompt instructions for subagent analysis to clarify required structure and language use.\n- Minor documentation adjustments for clarity in orchestration and session policies.\n\nv1.0.4 | 2026-02-13T14:11:18.167Z | auto\n\ncalibre-catalog-read 1.0.4\n\n- Added requirement and guidance to use `uv run python` instead of `python3` for running Python scripts.\n- Updated required bins in metadata to include `uv`.\n- Declared dependency on `subagent-spawn-command-builder` in metadata.\n- Updated documentation in SKILL.md and README.md to reflect these changes in command examples and environment setup.\n\nv1.0.3 | 2026-02-13T13:59:59.747Z | auto\n\ncalibre-catalog-read 1.0.3 adds full subagent support for book analysis workflows.\n\n- Added subagent workflow references and schemas: prompt template, input, and output schemas for subagent analysis generation.\n- Added scripts for full analysis orchestration: `run_analysis_pipeline.py`, database state tracking (`analysis_db.py`), state/runs management (`run_state.mjs`), and completion handling (`handle_completion.mjs`).\n- Added extraction input preparation utilities to split raw book text for subagent ingestion.\n- Updated chat/orchestration notes and policy documentation for strict two-turn execution (start and completion).\n- All new files and scripts are focused on enabling scalable, non-blocking AI reading workflows via subagent calls and strict DB/state management.\n\nv1.0.2 | 2026-02-13T13:57:01.169Z | auto\n\n- Removes all subagent and analysis pipeline scripts and reference files, simplifying the skill.\n- Updates documentation in README.md and SKILL.md to match the removal and current command usage.\n- Clarifies environment variable handling and introduces metadata block.\n- Removes support for book analysis workflow—now focused on read-only catalog lookups (list/search/id).\n\nv1.0.0 | 2026-02-13T13:22:44.861Z | auto\n\ncalibre-catalog-read v1.0.0\n\n- Migrated all orchestration and pipeline helper scripts from Python to Node.js (now `.mjs`).\n- Added Node.js equivalents: `handle_completion.mjs`, `prepare_subagent_input.mjs`, and `run_state.mjs`.\n- Removed Python script versions: `handle_completion.py`, `prepare_subagent_input.py`, `run_state.py`.\n- Updated documentation for new environment variable authentication method and Node.js commands.\n- Changed cache DB path recommendations to reside within the skill's own state directory.\n- Clarified orchestration, authentication, and main/subagent division in documentation.\n\nv0.1.1 | 2026-02-12T14:06:36.081Z | auto\n\ncalibre-catalog-read 0.1.1\n\n- Added required dependency on `subagent-spawn-command-builder` for subagent payload building.\n- Updated orchestration: main agent must use the builder skill to generate `sessions_spawn` payloads with profile `calibre-read`.\n- Clarified that Python commands must use `python3`.\n- Enhanced subagent launch policy: must use strict prompt and not send ad-hoc relaxations.\n- Improved documentation for orchestration, chat turn separation, and turn rules.\n\nv0.1.0 | 2026-02-11T15:35:17.205Z | auto\n\ncalibre-catalog-read 0.1.0\n\n- Initial release with catalog reading via calibredb over a Content server.\n- Supports list, search, and get-by-id operations for books.\n- Adds one-book AI analysis workflow: export, analyze, cache, and apply HTML analysis to comments.\n- Caches analysis state in SQLite; includes DB initialization and status check scripts.\n- Implements strict main vs subagent workflow for seamless async chat operation.\n- Includes session state handling and orchestration guidelines for chat/agent flows.\n\nArchive index:\n\nArchive v1.0.5: 12 files, 20680 bytes\n\nFiles: README.md (4634b), references/subagent-analysis.prompt.md (1964b), references/subagent-analysis.schema.json (1460b), references/subagent-input.schema.json (575b), scripts/analysis_db.py (4148b), scripts/calibredb_read.mjs (5403b), scripts/handle_completion.mjs (3817b), scripts/prepare_subagent_input.mjs (2110b), scripts/run_analysis_pipeline.py (11510b), scripts/run_state.mjs (3027b), SKILL.md (9799b), _meta.json (139b)\n\nFile v1.0.5:SKILL.md\n\n---\nname: calibre-catalog-read\ndescription: Read Calibre catalog data via calibredb over a Content server, and run one-book analysis workflow that writes HTML analysis block back to comments while caching analysis state in SQLite. Use for list/search/id lookups and AI reading pipeline for a selected book.\nmetadata: {\"openclaw\":{\"requires\":{\"bins\":[\"node\",\"uv\",\"calibredb\",\"ebook-convert\"],\"env\":[\"CALIBRE_PASSWORD\"]},\"optionalEnv\":[\"CALIBRE_USERNAME\"],\"primaryEnv\":\"CALIBRE_PASSWORD\",\"dependsOnSkills\":[\"subagent-spawn-command-builder\"],\"localWrites\":[\"skills/calibre-catalog-read/state/runs.json\",\"skills/calibre-catalog-read/state/calibre_analysis.sqlite\",\"skills/calibre-catalog-read/state/cache/**\",\"~/.config/calibre-catalog-read/auth.json\"],\"modifiesRemoteData\":[\"calibre:comments-metadata\"]}}\n---\n\n# calibre-catalog-read\n\nUse this skill for:\n- Read-only catalog lookup (`list/search/id`)\n- One-book AI reading workflow (`export -> analyze -> cache -> comments HTML apply`)\n\n## Requirements\n\n- `calibredb` available on PATH in the runtime where scripts are executed.\n- `ebook-convert` available for text extraction.\n- `subagent-spawn-command-builder` installed (for spawn payload generation).\n- Reachable Calibre Content server URL in `--with-library` format:\n  - `http://HOST:PORT/#LIBRARY_ID`\n- Do not assume localhost/127.0.0.1; always pass explicit reachable `HOST:PORT`.\n- If auth is enabled:\n  - Preferred: set in `/home/altair/.openclaw/.env`\n    - `CALIBRE_USERNAME=<user>`\n    - `CALIBRE_PASSWORD=<password>`\n  - Then pass only `--password-env CALIBRE_PASSWORD` (username auto-loads from env)\n  - You can still override with `--username <user>` explicitly.\n  - Optional auth cache file: `~/.config/calibre-catalog-read/auth.json`\n    - Avoid `--save-plain-password` unless explicitly requested.\n\n## Commands\n\nList books (JSON):\n\n```bash\nnode skills/calibre-catalog-read/scripts/calibredb_read.mjs list \\\n  --with-library \"http://192.168.11.20:8080/#Calibreライブラリ\" \\\n  --password-env CALIBRE_PASSWORD \\\n  --limit 50\n```\n\nSearch books (JSON):\n\n```bash\nnode skills/calibre-catalog-read/scripts/calibredb_read.mjs search \\\n  --with-library \"http://192.168.11.20:8080/#Calibreライブラリ\" \\\n  --password-env CALIBRE_PASSWORD \\\n  --query 'series:\"中公文庫\"'\n```\n\nGet one book by id (JSON):\n\n```bash\nnode skills/calibre-catalog-read/scripts/calibredb_read.mjs id \\\n  --with-library \"http://192.168.11.20:8080/#Calibreライブラリ\" \\\n  --password-env CALIBRE_PASSWORD \\\n  --book-id 3\n```\n\nRun one-book pipeline (analyze + comments HTML apply + cache):\n\n```bash\nuv run python skills/calibre-catalog-read/scripts/run_analysis_pipeline.py \\\n  --with-library \"http://192.168.11.20:8080/#Calibreライブラリ\" \\\n  --password-env CALIBRE_PASSWORD \\\n  --book-id 3 --lang ja\n```\n\n## Cache DB\n\nInitialize DB schema:\n\n```bash\nuv run python skills/calibre-catalog-read/scripts/analysis_db.py init \\\n  --db skills/calibre-catalog-read/state/calibre_analysis.sqlite\n```\n\nCheck current hash state:\n\n```bash\nuv run python skills/calibre-catalog-read/scripts/analysis_db.py status \\\n  --db skills/calibre-catalog-read/state/calibre_analysis.sqlite \\\n  --book-id 3 --format EPUB\n```\n\n\n## Main vs Subagent responsibility (strict split)\n\nUse this split to avoid long blocking turns on chat listeners.\n\n### Main agent (fast control plane)\n- Validate user intent and target `book_id`.\n- Confirm subagent runtime knobs: `model`, `thinking`, `runTimeoutSeconds`.\n- Start subagent and return a short progress reply quickly.\n- After subagent result arrives, run DB upsert + Calibre apply.\n- Report final result to user.\n\n### Subagent (heavy analysis plane)\n- Read extracted source payload.\n- Generate analysis JSON strictly by schema.\n- Do not run metadata apply or user-facing channel actions.\n\n### Never do in main when avoidable\n- Long-form content analysis generation.\n- Multi-step heavy reasoning over full excerpts.\n\n### Turn policy\n- One book per run.\n- Prefer asynchronous flow: quick ack first, final result after analysis.\n- If analysis is unavailable, either ask user or use fallback only when explicitly acceptable.\n\n## Subagent pre-flight (required)\n\nBefore first subagent run in a session, confirm once:\n- `model`\n- `thinking` (`low`/`medium`/`high`)\n- `runTimeoutSeconds`\n\nDo not ask on every run. Reuse the confirmed settings for subsequent books in the same session unless the user asks to change them.\n\n## Subagent support (model-agnostic)\n\nBook-reading analysis is a heavy task. Use a subagent with a lightweight model for analysis generation, then return results to main agent for cache/apply steps.\n\n- Prompt template: `references/subagent-analysis.prompt.md`\n- Input schema: `references/subagent-input.schema.json`\n- Output schema: `references/subagent-analysis.schema.json`\n- Input preparation helper: `scripts/prepare_subagent_input.mjs`\n  - Splits extracted text into multiple files to avoid read-tool single-line size issues.\n\nRules:\n- Use subagent only for heavy analysis generation; keep main agent lightweight and non-blocking.\n- In this environment, Python commands must use `uv run python`.\n- Use the strict prompt template (`references/subagent-analysis.prompt.md`) as mandatory base; do not send ad-hoc relaxed read instructions.\n- Keep final DB upsert and Calibre metadata apply in main agent.\n- Process one book per run.\n- Confirm model/thinking/timeout once per session, then reuse; do not hardcode provider-specific model IDs in the skill.\n- Configure callback/announce behavior and rate-limit fallbacks using OpenClaw default model/subagent/fallback settings (not hardcoded in this skill).\n- Exclude manga/comic-centric books from this text pipeline (skip when title/tags indicate manga/comic).\n- If extracted text is too short, stop and ask user for confirmation before continuing.\n  - The pipeline returns `reason: low_text_requires_confirmation` with `prompt_en` text.\n\n## Language policy\n\n- Do not hardcode user-language prose in pipeline scripts.\n- Generate user-visible analysis text from subagent output, with language controlled by user-selected settings and `lang` input.\n- Fallback local analysis in scripts is generic/minimal; preferred path is subagent output following the prompt template.\n\n\n## Orchestration note (important)\n\n`run_analysis_pipeline.py` is a local script and does **not** call OpenClaw tools by itself.\nSubagent execution must be orchestrated by the agent layer using `sessions_spawn`.\n\nRequired runtime sequence:\n1. Main agent prepares `subagent_input.json` + chunked `source_files` from extracted text.\n   - Use:\n   ```bash\n   node skills/calibre-catalog-read/scripts/prepare_subagent_input.mjs \\\n     --book-id <id> --title \"<title>\" --lang ja \\\n     --text-path /tmp/book_<id>.txt --out-dir /tmp/calibre_subagent_<id>\n   ```\n2. Main agent uses the shared builder skill `subagent-spawn-command-builder` to generate the `sessions_spawn` payload, then calls `sessions_spawn`.\n   - Build with profile `calibre-read` and run-specific analysis task text.\n   - Use the generated JSON as-is (or merge minimal run-specific fields such as label/task text).\n3. Subagent reads all `source_files` and returns analysis JSON (schema-conformant).\n4. Main agent passes that file via `--analysis-json` to `run_analysis_pipeline.py` for DB/apply.\n\nIf step 2 is skipped, pipeline falls back to local minimal analysis (only for emergency/testing).\n\n\n## Chat execution model (required, strict)\n\nFor Discord/chat, always run as **two separate turns**.\n\n### Turn A: start only (must be fast)\n- Select one target book.\n- Build spawn payload with `subagent-spawn-command-builder` (`--profile calibre-read` + run-specific `--task`).\n- Call `sessions_spawn` using that payload.\n- Record run state (`runId`) via `run_state.mjs upsert`.\n- Reply to user with selected title + \"running in background\".\n- **Stop turn here.**\n\n### Turn B: completion only (separate later turn)\nTrigger: completion announce/event for that run.\n- Run one command only (completion handler):\n  - `scripts/handle_completion.mjs` (`get -> apply -> remove`, and `fail` on error).\n- If `runId` is missing, handler returns `stale_or_duplicate` and does nothing.\n- Send completion/failure reply from handler result.\n\nHard rule:\n- Never poll/wait/apply in Turn A.\n- Never keep a chat listener turn open waiting for subagent completion.\n\n## Run state management (single-file, required)\n\nFor one-book-at-a-time operation, keep a single JSON state file:\n- `skills/calibre-catalog-read/state/runs.json`\n\nUse `runId` as the primary key (subagent execution id).\n\nLifecycle:\n1. On spawn acceptance, upsert one record:\n   - `runId`, `book_id`, `title`, `status: \"running\"`, `started_at`\n2. Do not wait/poll inside the same chat turn.\n3. On completion announce, load record by `runId` and run apply.\n4. On successful apply, delete that record immediately.\n5. On failure, set `status: \"failed\"` + `error` and keep record for retry/debug.\n\nRules:\n- Keep this file small and operational (active/failed records only).\n- Ignore duplicate completion events when record is already removed.\n- If record is missing at completion time, report as stale/unknown run and do not apply blindly.\n\nUse helper scripts (avoid ad-hoc env var mistakes):\n\n```bash\n# Turn A: register running task\nnode skills/calibre-catalog-read/scripts/run_state.mjs upsert \\\n  --state skills/calibre-catalog-read/state/runs.json \\\n  --run-id <RUN_ID> --book-id <BOOK_ID> --title \"<TITLE>\"\n\n# Turn B: completion handler (preferred)\nnode skills/calibre-catalog-read/scripts/handle_completion.mjs \\\n  --state skills/calibre-catalog-read/state/runs.json \\\n  --run-id <RUN_ID> \\\n  --analysis-json /tmp/calibre_<BOOK_ID>/analysis.json \\\n  --with-library \"http://HOST:PORT/#LIBRARY_ID\" \\\n  --password-env CALIBRE_PASSWORD --lang ja\n```\n\nFile v1.0.5:README.md\n\n# calibre-catalog-read\n\nCalibreカタログ参照 + 1冊単位のAI読書パイプライン。\n\n注: このパイプラインは、テキスト解析コスト/品質の観点から漫画・コミック系タイトルを対象外にする設計です。\n\n## セットアップ\n\n1. OpenClaw実行環境(このスキルを実行するマシン/ランタイム)にCalibreをインストールする。\n   - 必須バイナリ: `calibredb` / `ebook-convert`\n2. 上記バイナリがPATHに通っていることを確認する。\n3. `subagent-spawn-command-builder` を導入する(spawn payload生成に使用)。\n\n```bash\nnpx clawhub@latest install subagent-spawn-command-builder\npnpm dlx clawhub@latest install subagent-spawn-command-builder\n```\n\n4. Calibre Content serverへ到達できることを確認する。\n5. 接続先は必ず明示的な `HOST:PORT` を使う。\n   - `http://HOST:PORT/#LIBRARY_ID`\n6. 認証が有効な場合は `~/.openclaw/.env` に設定する(推奨)。\n   - `CALIBRE_USERNAME=<user>`\n   - `CALIBRE_PASSWORD=<password>`\n   - 実行時は `--password-env CALIBRE_PASSWORD` を渡す(ユーザー名はenvから自動読込)。\n   - 任意で `~/.config/calibre-catalog-read/auth.json` に認証キャッシュ可能。\n   - `--save-plain-password` は平文保存のため、明示指示がない限り使わない。\n\n## 重要\n\nOpenClaw単体では不足です。実行環境にCalibreを入れて、必要バイナリを利用可能にしてください。\n\nWindowsではDefender Controlled Folder Accessの影響でメタデータ/ファイル操作が失敗する場合があります。\n`WinError 2/5` が出る場合は、Calibreライブラリフォルダや関連バイナリを許可対象に追加してください。\n\n## クイックテスト(カタログ参照)\n\n```bash\nnode scripts/calibredb_read.mjs list \\\n  --with-library \"http://192.168.11.20:8080/#Calibreライブラリ\" \\\n  --password-env CALIBRE_PASSWORD \\\n  --limit 5\n```\n\n## クイックテスト(1冊パイプライン)\n\n```bash\nuv run python scripts/run_analysis_pipeline.py \\\n  --with-library \"http://192.168.11.20:8080/#Calibreライブラリ\" \\\n  --password-env CALIBRE_PASSWORD \\\n  --book-id 3 --lang ja\n```\n\n## サブエージェント入力の分割(推奨)\n\nreadツールの行サイズ制限を避けるため、抽出テキストを分割し、`subagent_input.json` 経由で `source_files` を渡します。\n\n```bash\nnode scripts/prepare_subagent_input.mjs \\\n  --book-id 3 --title \"<title>\" --lang ja \\\n  --text-path /tmp/book_3.txt --out-dir /tmp/calibre_subagent_3\n```\n\n## 低テキスト時の安全策\n\n抽出テキストが短すぎる場合、パイプラインは `reason: low_text_requires_confirmation` で停止し、確認を要求します。\n`--force-low-text` はユーザー確認後のみ使ってください。\n\n## チャット運用(必須: 2ターン)\n\nチャット面では必ず2ターンに分けて実行します。\n\n1) 開始ターン(高速)\n- 対象選定\n- `subagent-spawn-command-builder` で `sessions_spawn` payloadを生成\n- 生成payloadでspawn\n- `run_state.mjs upsert`\n- 即時ACK\n\n2) 完了ターン(後続)\n- 完了イベント\n- `handle_completion.mjs`(内部で `get -> apply -> remove/fail`)\n\nspawnと同一ターンで `poll/wait/apply` を行わないでください。\n\n## spawn payload生成例(builder利用)\n\nまず `subagent-spawn-command-builder` 側の `spawn-profiles.json` に\n`calibre-read` プロファイルを定義します。\n\n例:\n\n```json\n{\n  \"version\": 1,\n  \"defaults\": {\n    \"runTimeoutSeconds\": 300,\n    \"cleanup\": \"keep\"\n  },\n  \"profiles\": {\n    \"calibre-read\": {\n      \"model\": \"openrouter/qwen/qwen3-next-80b-a3b-instruct\",\n      \"thinking\": \"low\",\n      \"runTimeoutSeconds\": 300,\n      \"cleanup\": \"keep\"\n    }\n  }\n}\n```\n\nそのうえで、まずは**スキル呼び出しとして**次の意図で実行します:\n\n- `subagent-spawn-command-builder` を使って `calibre-read` の `sessions_spawn` payloadを生成する\n- `task` には `references/subagent-analysis.prompt.md` ベースの解析指示を渡す\n\n内部実装コマンド(低レベル)は次のとおり:\n\n```bash\nuv run python ../subagent-spawn-command-builder/scripts/build_spawn_payload.py \\\n  --profile calibre-read \\\n  --task \"<analysis task text based on references/subagent-analysis.prompt.md>\"\n```\n\n出力JSONをそのまま `sessions_spawn` に渡します。\n\n注意:\n- `--task` は必ず `references/subagent-analysis.prompt.md` の厳格read契約を含む内容にする。\n- `read` ツールは `{\"path\":\"...\"}` 形式のみを使う(pathなし呼び出し禁止)。\n\nFile v1.0.5:_meta.json\n\n{\n  \"ownerId\": \"kn747bx1r2jrbbyca61v6k06397zy93t\",\n  \"slug\": \"calibre-catalog-read\",\n  \"version\": \"1.0.5\",\n  \"publishedAt\": 1770992181653\n}\n\nFile v1.0.5:references/subagent-analysis.prompt.md\n\n# Subagent Prompt Template (Model-Agnostic)\n\nUse this template with `sessions_spawn` for analysis-only tasks.\n\n## Inputs\n- `book_id`: integer\n- `lang`: `ja` or `en`\n- `title`: string\n- `source_files`: array of text file paths (read all in order)\n\n## Prompt\nYou are an analysis worker for a Calibre pipeline.\nReturn ONLY valid JSON (no markdown fences, no commentary).\nFollow the output schema exactly.\nLanguage rule: write user-visible text in `lang`.\nDo not call external tools. Work only from provided input.\n\nInput:\n- book_id: {{book_id}}\n- lang: {{lang}}\n- title: {{title}}\n- source_files:\n{{source_files}}\n\nRead all files in `source_files` in order and analyze combined content.\n\nOutput schema: `references/subagent-analysis.schema.json`\n\nQuality constraints:\n- Summary: concise and factual.\n- Highlights: concrete points, no fluff.\n- Reread: provide actionable anchors.\n- Tags: useful for retrieval and review.\n\n\n## Runtime knobs (provided by user)\n- model: <user-selected lightweight model id>\n- thinking: <low|medium|high>\n- runTimeoutSeconds: <integer seconds>\n\nDo not invent these values. Confirm once at session start and reuse unless user requests a change.\n\n\n## Runtime command rule\n\n- If you need to execute Python scripts, always use `uv run python`.\n\n## Strict read contract (hard requirement)\n\n- Never call `read` without `path`.\n- Always call `read` with this exact shape: `{\"path\":\"<absolute-or-workspace-relative-file>\"}`.\n- First read: `subagent_input.json` using `{\"path\":\".../subagent_input.json\"}`.\n- Parse `source_files` from that JSON.\n- Then read each source file exactly once, in listed order, using only `{\"path\":\"<file>\"}`.\n- Do not use `file_path`.\n- Do not use offset/limit pagination for this workflow.\n- If any read fails or path is unknown, stop and return schema-valid JSON with `analysis-error` tag instead of free text.\n\n## Output discipline\n\n- Return raw JSON object only.\n- No markdown fences.\n- No prose before/after JSON.\n\nFile v1.0.5:references/subagent-analysis.schema.json\n\n{\n  \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n  \"title\": \"CalibreSubagentAnalysisOutput\",\n  \"type\": \"object\",\n  \"required\": [\"book_id\", \"lang\", \"summary\", \"highlights\", \"reread\", \"tags\"],\n  \"properties\": {\n    \"book_id\": { \"type\": \"integer\", \"minimum\": 1 },\n    \"lang\": { \"type\": \"string\", \"enum\": [\"ja\", \"en\"] },\n    \"summary\": { \"type\": \"string\", \"minLength\": 1, \"maxLength\": 1200 },\n    \"highlights\": {\n      \"type\": \"array\",\n      \"minItems\": 2,\n      \"maxItems\": 8,\n      \"items\": { \"type\": \"string\", \"minLength\": 1, \"maxLength\": 400 }\n    },\n    \"reread\": {\n      \"type\": \"array\",\n      \"minItems\": 1,\n      \"maxItems\": 8,\n      \"items\": {\n        \"type\": \"object\",\n        \"required\": [\"section\", \"page\", \"chunk_id\", \"reason\"],\n        \"properties\": {\n          \"section\": { \"type\": \"string\", \"minLength\": 1, \"maxLength\": 200 },\n          \"page\": { \"type\": \"string\", \"minLength\": 1, \"maxLength\": 120 },\n          \"chunk_id\": { \"type\": \"string\", \"minLength\": 1, \"maxLength\": 120 },\n          \"reason\": { \"type\": \"string\", \"minLength\": 1, \"maxLength\": 300 }\n        },\n        \"additionalProperties\": false\n      }\n    },\n    \"tags\": {\n      \"type\": \"array\",\n      \"minItems\": 1,\n      \"maxItems\": 12,\n      \"items\": { \"type\": \"string\", \"minLength\": 1, \"maxLength\": 80 }\n    },\n    \"confidence\": { \"type\": \"number\", \"minimum\": 0, \"maximum\": 1 },\n    \"notes\": { \"type\": \"string\", \"maxLength\": 1200 }\n  },\n  \"additionalProperties\": false\n}\n\nFile v1.0.5:references/subagent-input.schema.json\n\n{\n  \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n  \"title\": \"CalibreSubagentInput\",\n  \"type\": \"object\",\n  \"required\": [\"book_id\", \"title\", \"lang\", \"source_files\"],\n  \"properties\": {\n    \"book_id\": { \"type\": \"integer\", \"minimum\": 1 },\n    \"title\": { \"type\": \"string\", \"minLength\": 1 },\n    \"lang\": { \"type\": \"string\", \"enum\": [\"ja\", \"en\"] },\n    \"source_files\": {\n      \"type\": \"array\",\n      \"minItems\": 1,\n      \"maxItems\": 10,\n      \"items\": { \"type\": \"string\", \"minLength\": 1 }\n    },\n    \"notes\": { \"type\": \"string\" }\n  },\n  \"additionalProperties\": false\n}\n\nArchive v1.0.4: 12 files, 20666 bytes\n\nFiles: README.md (4634b), references/subagent-analysis.prompt.md (1975b), references/subagent-analysis.schema.json (1460b), references/subagent-input.schema.json (575b), scripts/analysis_db.py (4139b), scripts/calibredb_read.mjs (5403b), scripts/handle_completion.mjs (3817b), scripts/prepare_subagent_input.mjs (2110b), scripts/run_analysis_pipeline.py (11477b), scripts/run_state.mjs (3027b), SKILL.md (9799b), _meta.json (139b)\n\nFile v1.0.4:SKILL.md\n\n---\nname: calibre-catalog-read\ndescription: Read Calibre catalog data via calibredb over a Content server, and run one-book analysis workflow that writes HTML analysis block back to comments while caching analysis state in SQLite. Use for list/search/id lookups and AI reading pipeline for a selected book.\nmetadata: {\"openclaw\":{\"requires\":{\"bins\":[\"node\",\"uv\",\"calibredb\",\"ebook-convert\"],\"env\":[\"CALIBRE_PASSWORD\"]},\"optionalEnv\":[\"CALIBRE_USERNAME\"],\"primaryEnv\":\"CALIBRE_PASSWORD\",\"dependsOnSkills\":[\"subagent-spawn-command-builder\"],\"localWrites\":[\"skills/calibre-catalog-read/state/runs.json\",\"skills/calibre-catalog-read/state/calibre_analysis.sqlite\",\"skills/calibre-catalog-read/state/cache/**\",\"~/.config/calibre-catalog-read/auth.json\"],\"modifiesRemoteData\":[\"calibre:comments-metadata\"]}}\n---\n\n# calibre-catalog-read\n\nUse this skill for:\n- Read-only catalog lookup (`list/search/id`)\n- One-book AI reading workflow (`export -> analyze -> cache -> comments HTML apply`)\n\n## Requirements\n\n- `calibredb` available on PATH in the runtime where scripts are executed.\n- `ebook-convert` available for text extraction.\n- `subagent-spawn-command-builder` installed (for spawn payload generation).\n- Reachable Calibre Content server URL in `--with-library` format:\n  - `http://HOST:PORT/#LIBRARY_ID`\n- Do not assume localhost/127.0.0.1; always pass explicit reachable `HOST:PORT`.\n- If auth is enabled:\n  - Preferred: set in `/home/altair/.openclaw/.env`\n    - `CALIBRE_USERNAME=<user>`\n    - `CALIBRE_PASSWORD=<password>`\n  - Then pass only `--password-env CALIBRE_PASSWORD` (username auto-loads from env)\n  - You can still override with `--username <user>` explicitly.\n  - Optional auth cache file: `~/.config/calibre-catalog-read/auth.json`\n    - Avoid `--save-plain-password` unless explicitly requested.\n\n## Commands\n\nList books (JSON):\n\n```bash\nnode skills/calibre-catalog-read/scripts/calibredb_read.mjs list \\\n  --with-library \"http://192.168.11.20:8080/#Calibreライブラリ\" \\\n  --password-env CALIBRE_PASSWORD \\\n  --limit 50\n```\n\nSearch books (JSON):\n\n```bash\nnode skills/calibre-catalog-read/scripts/calibredb_read.mjs search \\\n  --with-library \"http://192.168.11.20:8080/#Calibreライブラリ\" \\\n  --password-env CALIBRE_PASSWORD \\\n  --query 'series:\"中公文庫\"'\n```\n\nGet one book by id (JSON):\n\n```bash\nnode skills/calibre-catalog-read/scripts/calibredb_read.mjs id \\\n  --with-library \"http://192.168.11.20:8080/#Calibreライブラリ\" \\\n  --password-env CALIBRE_PASSWORD \\\n  --book-id 3\n```\n\nRun one-book pipeline (analyze + comments HTML apply + cache):\n\n```bash\nuv run python skills/calibre-catalog-read/scripts/run_analysis_pipeline.py \\\n  --with-library \"http://192.168.11.20:8080/#Calibreライブラリ\" \\\n  --password-env CALIBRE_PASSWORD \\\n  --book-id 3 --lang ja\n```\n\n## Cache DB\n\nInitialize DB schema:\n\n```bash\nuv run python skills/calibre-catalog-read/scripts/analysis_db.py init \\\n  --db skills/calibre-catalog-read/state/calibre_analysis.sqlite\n```\n\nCheck current hash state:\n\n```bash\nuv run python skills/calibre-catalog-read/scripts/analysis_db.py status \\\n  --db skills/calibre-catalog-read/state/calibre_analysis.sqlite \\\n  --book-id 3 --format EPUB\n```\n\n\n## Main vs Subagent responsibility (strict split)\n\nUse this split to avoid long blocking turns on chat listeners.\n\n### Main agent (fast control plane)\n- Validate user intent and target `book_id`.\n- Confirm subagent runtime knobs: `model`, `thinking`, `runTimeoutSeconds`.\n- Start subagent and return a short progress reply quickly.\n- After subagent result arrives, run DB upsert + Calibre apply.\n- Report final result to user.\n\n### Subagent (heavy analysis plane)\n- Read extracted source payload.\n- Generate analysis JSON strictly by schema.\n- Do not run metadata apply or user-facing channel actions.\n\n### Never do in main when avoidable\n- Long-form content analysis generation.\n- Multi-step heavy reasoning over full excerpts.\n\n### Turn policy\n- One book per run.\n- Prefer asynchronous flow: quick ack first, final result after analysis.\n- If analysis is unavailable, either ask user or use fallback only when explicitly acceptable.\n\n## Subagent pre-flight (required)\n\nBefore first subagent run in a session, confirm once:\n- `model`\n- `thinking` (`low`/`medium`/`high`)\n- `runTimeoutSeconds`\n\nDo not ask on every run. Reuse the confirmed settings for subsequent books in the same session unless the user asks to change them.\n\n## Subagent support (model-agnostic)\n\nBook-reading analysis is a heavy task. Use a subagent with a lightweight model for analysis generation, then return results to main agent for cache/apply steps.\n\n- Prompt template: `references/subagent-analysis.prompt.md`\n- Input schema: `references/subagent-input.schema.json`\n- Output schema: `references/subagent-analysis.schema.json`\n- Input preparation helper: `scripts/prepare_subagent_input.mjs`\n  - Splits extracted text into multiple files to avoid read-tool single-line size issues.\n\nRules:\n- Use subagent only for heavy analysis generation; keep main agent lightweight and non-blocking.\n- In this environment, Python commands must use `uv run python`.\n- Use the strict prompt template (`references/subagent-analysis.prompt.md`) as mandatory base; do not send ad-hoc relaxed read instructions.\n- Keep final DB upsert and Calibre metadata apply in main agent.\n- Process one book per run.\n- Confirm model/thinking/timeout once per session, then reuse; do not hardcode provider-specific model IDs in the skill.\n- Configure callback/announce behavior and rate-limit fallbacks using OpenClaw default model/subagent/fallback settings (not hardcoded in this skill).\n- Exclude manga/comic-centric books from this text pipeline (skip when title/tags indicate manga/comic).\n- If extracted text is too short, stop and ask user for confirmation before continuing.\n  - The pipeline returns `reason: low_text_requires_confirmation` with `prompt_en` text.\n\n## Language policy\n\n- Do not hardcode user-language prose in pipeline scripts.\n- Generate user-visible analysis text from subagent output, with language controlled by user-selected settings and `lang` input.\n- Fallback local analysis in scripts is generic/minimal; preferred path is subagent output following the prompt template.\n\n\n## Orchestration note (important)\n\n`run_analysis_pipeline.py` is a local script and does **not** call OpenClaw tools by itself.\nSubagent execution must be orchestrated by the agent layer using `sessions_spawn`.\n\nRequired runtime sequence:\n1. Main agent prepares `subagent_input.json` + chunked `source_files` from extracted text.\n   - Use:\n   ```bash\n   node skills/calibre-catalog-read/scripts/prepare_subagent_input.mjs \\\n     --book-id <id> --title \"<title>\" --lang ja \\\n     --text-path /tmp/book_<id>.txt --out-dir /tmp/calibre_subagent_<id>\n   ```\n2. Main agent uses the shared builder skill `subagent-spawn-command-builder` to generate the `sessions_spawn` payload, then calls `sessions_spawn`.\n   - Build with profile `calibre-read` and run-specific analysis task text.\n   - Use the generated JSON as-is (or merge minimal run-specific fields such as label/task text).\n3. Subagent reads all `source_files` and returns analysis JSON (schema-conformant).\n4. Main agent passes that file via `--analysis-json` to `run_analysis_pipeline.py` for DB/apply.\n\nIf step 2 is skipped, pipeline falls back to local minimal analysis (only for emergency/testing).\n\n\n## Chat execution model (required, strict)\n\nFor Discord/chat, always run as **two separate turns**.\n\n### Turn A: start only (must be fast)\n- Select one target book.\n- Build spawn payload with `subagent-spawn-command-builder` (`--profile calibre-read` + run-specific `--task`).\n- Call `sessions_spawn` using that payload.\n- Record run state (`runId`) via `run_state.mjs upsert`.\n- Reply to user with selected title + \"running in background\".\n- **Stop turn here.**\n\n### Turn B: completion only (separate later turn)\nTrigger: completion announce/event for that run.\n- Run one command only (completion handler):\n  - `scripts/handle_completion.mjs` (`get -> apply -> remove`, and `fail` on error).\n- If `runId` is missing, handler returns `stale_or_duplicate` and does nothing.\n- Send completion/failure reply from handler result.\n\nHard rule:\n- Never poll/wait/apply in Turn A.\n- Never keep a chat listener turn open waiting for subagent completion.\n\n## Run state management (single-file, required)\n\nFor one-book-at-a-time operation, keep a single JSON state file:\n- `skills/calibre-catalog-read/state/runs.json`\n\nUse `runId` as the primary key (subagent execution id).\n\nLifecycle:\n1. On spawn acceptance, upsert one record:\n   - `runId`, `book_id`, `title`, `status: \"running\"`, `started_at`\n2. Do not wait/poll inside the same chat turn.\n3. On completion announce, load record by `runId` and run apply.\n4. On successful apply, delete that record immediately.\n5. On failure, set `status: \"failed\"` + `error` and keep record for retry/debug.\n\nRules:\n- Keep this file small and operational (active/failed records only).\n- Ignore duplicate completion events when record is already removed.\n- If record is missing at completion time, report as stale/unknown run and do not apply blindly.\n\nUse helper scripts (avoid ad-hoc env var mistakes):\n\n```bash\n# Turn A: register running task\nnode skills/calibre-catalog-read/scripts/run_state.mjs upsert \\\n  --state skills/calibre-catalog-read/state/runs.json \\\n  --run-id <RUN_ID> --book-id <BOOK_ID> --title \"<TITLE>\"\n\n# Turn B: completion handler (preferred)\nnode skills/calibre-catalog-read/scripts/handle_completion.mjs \\\n  --state skills/calibre-catalog-read/state/runs.json \\\n  --run-id <RUN_ID> \\\n  --analysis-json /tmp/calibre_<BOOK_ID>/analysis.json \\\n  --with-library \"http://HOST:PORT/#LIBRARY_ID\" \\\n  --password-env CALIBRE_PASSWORD --lang ja\n```\n\nFile v1.0.4:README.md\n\n# calibre-catalog-read\n\nCalibreカタログ参照 + 1冊単位のAI読書パイプライン。\n\n注: このパイプラインは、テキスト解析コスト/品質の観点から漫画・コミック系タイトルを対象外にする設計です。\n\n## セットアップ\n\n1. OpenClaw実行環境(このスキルを実行するマシン/ランタイム)にCalibreをインストールする。\n   - 必須バイナリ: `calibredb` / `ebook-convert`\n2. 上記バイナリがPATHに通っていることを確認する。\n3. `subagent-spawn-command-builder` を導入する(spawn payload生成に使用)。\n\n```bash\nnpx clawhub@latest install subagent-spawn-command-builder\npnpm dlx clawhub@latest install subagent-spawn-command-builder\n```\n\n4. Calibre Content serverへ到達できることを確認する。\n5. 接続先は必ず明示的な `HOST:PORT` を使う。\n   - `http://HOST:PORT/#LIBRARY_ID`\n6. 認証が有効な場合は `~/.openclaw/.env` に設定する(推奨)。\n   - `CALIBRE_USERNAME=<user>`\n   - `CALIBRE_PASSWORD=<password>`\n   - 実行時は `--password-env CALIBRE_PASSWORD` を渡す(ユーザー名はenvから自動読込)。\n   - 任意で `~/.config/calibre-catalog-read/auth.json` に認証キャッシュ可能。\n   - `--save-plain-password` は平文保存のため、明示指示がない限り使わない。\n\n## 重要\n\nOpenClaw単体では不足です。実行環境にCalibreを入れて、必要バイナリを利用可能にしてください。\n\nWindowsではDefender Controlled Folder Accessの影響でメタデータ/ファイル操作が失敗する場合があります。\n`WinError 2/5` が出る場合は、Calibreライブラリフォルダや関連バイナリを許可対象に追加してください。\n\n## クイックテスト(カタログ参照)\n\n```bash\nnode scripts/calibredb_read.mjs list \\\n  --with-library \"http://192.168.11.20:8080/#Calibreライブラリ\" \\\n  --password-env CALIBRE_PASSWORD \\\n  --limit 5\n```\n\n## クイックテスト(1冊パイプライン)\n\n```bash\nuv run python scripts/run_analysis_pipeline.py \\\n  --with-library \"http://192.168.11.20:8080/#Calibreライブラリ\" \\\n  --password-env CALIBRE_PASSWORD \\\n  --book-id 3 --lang ja\n```\n\n## サブエージェント入力の分割(推奨)\n\nreadツールの行サイズ制限を避けるため、抽出テキストを分割し、`subagent_input.json` 経由で `source_files` を渡します。\n\n```bash\nnode scripts/prepare_subagent_input.mjs \\\n  --book-id 3 --title \"<title>\" --lang ja \\\n  --text-path /tmp/book_3.txt --out-dir /tmp/calibre_subagent_3\n```\n\n## 低テキスト時の安全策\n\n抽出テキストが短すぎる場合、パイプラインは `reason: low_text_requires_confirmation` で停止し、確認を要求します。\n`--force-low-text` はユーザー確認後のみ使ってください。\n\n## チャット運用(必須: 2ターン)\n\nチャット面では必ず2ターンに分けて実行します。\n\n1) 開始ターン(高速)\n- 対象選定\n- `subagent-spawn-command-builder` で `sessions_spawn` payloadを生成\n- 生成payloadでspawn\n- `run_state.mjs upsert`\n- 即時ACK\n\n2) 完了ターン(後続)\n- 完了イベント\n- `handle_completion.mjs`(内部で `get -> apply -> remove/fail`)\n\nspawnと同一ターンで `poll/wait/apply` を行わないでください。\n\n## spawn payload生成例(builder利用)\n\nまず `subagent-spawn-command-builder` 側の `spawn-profiles.json` に\n`calibre-read` プロファイルを定義します。\n\n例:\n\n```json\n{\n  \"version\": 1,\n  \"defaults\": {\n    \"runTimeoutSeconds\": 300,\n    \"cleanup\": \"keep\"\n  },\n  \"profiles\": {\n    \"calibre-read\": {\n      \"model\": \"openrouter/qwen/qwen3-next-80b-a3b-instruct\",\n      \"thinking\": \"low\",\n      \"runTimeoutSeconds\": 300,\n      \"cleanup\": \"keep\"\n    }\n  }\n}\n```\n\nそのうえで、まずは**スキル呼び出しとして**次の意図で実行します:\n\n- `subagent-spawn-command-builder` を使って `calibre-read` の `sessions_spawn` payloadを生成する\n- `task` には `references/subagent-analysis.prompt.md` ベースの解析指示を渡す\n\n内部実装コマンド(低レベル)は次のとおり:\n\n```bash\nuv run python ../subagent-spawn-command-builder/scripts/build_spawn_payload.py \\\n  --profile calibre-read \\\n  --task \"<analysis task text based on references/subagent-analysis.prompt.md>\"\n```\n\n出力JSONをそのまま `sessions_spawn` に渡します。\n\n注意:\n- `--task` は必ず `references/subagent-analysis.prompt.md` の厳格read契約を含む内容にする。\n- `read` ツールは `{\"path\":\"...\"}` 形式のみを使う(pathなし呼び出し禁止)。\n\nFile v1.0.4:_meta.json\n\n{\n  \"ownerId\": \"kn747bx1r2jrbbyca61v6k06397zy93t\",\n  \"slug\": \"calibre-catalog-read\",\n  \"version\": \"1.0.4\",\n  \"publishedAt\": 1770991878167\n}\n\nFile v1.0.4:references/subagent-analysis.prompt.md\n\n# Subagent Prompt Template (Model-Agnostic)\n\nUse this template with `sessions_spawn` for analysis-only tasks.\n\n## Inputs\n- `book_id`: integer\n- `lang`: `ja` or `en`\n- `title`: string\n- `source_files`: array of text file paths (read all in order)\n\n## Prompt\nYou are an analysis worker for a Calibre pipeline.\nReturn ONLY valid JSON (no markdown fences, no commentary).\nFollow the output schema exactly.\nLanguage rule: write user-visible text in `lang`.\nDo not call external tools. Work only from provided input.\n\nInput:\n- book_id: {{book_id}}\n- lang: {{lang}}\n- title: {{title}}\n- source_files:\n{{source_files}}\n\nRead all files in `source_files` in order and analyze combined content.\n\nOutput schema: `references/subagent-analysis.schema.json`\n\nQuality constraints:\n- Summary: concise and factual.\n- Highlights: concrete points, no fluff.\n- Reread: provide actionable anchors.\n- Tags: useful for retrieval and review.\n\n\n## Runtime knobs (provided by user)\n- model: <user-selected lightweight model id>\n- thinking: <low|medium|high>\n- runTimeoutSeconds: <integer seconds>\n\nDo not invent these values. Confirm once at session start and reuse unless user requests a change.\n\n\n## Runtime command rule\n\n- If you need to execute Python scripts, always use `python3` (never `python`).\n\n## Strict read contract (hard requirement)\n\n- Never call `read` without `path`.\n- Always call `read` with this exact shape: `{\"path\":\"<absolute-or-workspace-relative-file>\"}`.\n- First read: `subagent_input.json` using `{\"path\":\".../subagent_input.json\"}`.\n- Parse `source_files` from that JSON.\n- Then read each source file exactly once, in listed order, using only `{\"path\":\"<file>\"}`.\n- Do not use `file_path`.\n- Do not use offset/limit pagination for this workflow.\n- If any read fails or path is unknown, stop and return schema-valid JSON with `analysis-error` tag instead of free text.\n\n## Output discipline\n\n- Return raw JSON object only.\n- No markdown fences.\n- No prose before/after JSON.\n\nFile v1.0.4:references/subagent-analysis.schema.json\n\n{\n  \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n  \"title\": \"CalibreSubagentAnalysisOutput\",\n  \"type\": \"object\",\n  \"required\": [\"book_id\", \"lang\", \"summary\", \"highlights\", \"reread\", \"tags\"],\n  \"properties\": {\n    \"book_id\": { \"type\": \"integer\", \"minimum\": 1 },\n    \"lang\": { \"type\": \"string\", \"enum\": [\"ja\", \"en\"] },\n    \"summary\": { \"type\": \"string\", \"minLength\": 1, \"maxLength\": 1200 },\n    \"highlights\": {\n      \"type\": \"array\",\n      \"minItems\": 2,\n      \"maxItems\": 8,\n      \"items\": { \"type\": \"string\", \"minLength\": 1, \"maxLength\": 400 }\n    },\n    \"reread\": {\n      \"type\": \"array\",\n      \"minItems\": 1,\n      \"maxItems\": 8,\n      \"items\": {\n        \"type\": \"object\",\n        \"required\": [\"section\", \"page\", \"chunk_id\", \"reason\"],\n        \"properties\": {\n          \"section\": { \"type\": \"string\", \"minLength\": 1, \"maxLength\": 200 },\n          \"page\": { \"type\": \"string\", \"minLength\": 1, \"maxLength\": 120 },\n          \"chunk_id\": { \"type\": \"string\", \"minLength\": 1, \"maxLength\": 120 },\n          \"reason\": { \"type\": \"string\", \"minLength\": 1, \"maxLength\": 300 }\n        },\n        \"additionalProperties\": false\n      }\n    },\n    \"tags\": {\n      \"type\": \"array\",\n      \"minItems\": 1,\n      \"maxItems\": 12,\n      \"items\": { \"type\": \"string\", \"minLength\": 1, \"maxLength\": 80 }\n    },\n    \"confidence\": { \"type\": \"number\", \"minimum\": 0, \"maximum\": 1 },\n    \"notes\": { \"type\": \"string\", \"maxLength\": 1200 }\n  },\n  \"additionalProperties\": false\n}\n\nFile v1.0.4:references/subagent-input.schema.json\n\n{\n  \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n  \"title\": \"CalibreSubagentInput\",\n  \"type\": \"object\",\n  \"required\": [\"book_id\", \"title\", \"lang\", \"source_files\"],\n  \"properties\": {\n    \"book_id\": { \"type\": \"integer\", \"minimum\": 1 },\n    \"title\": { \"type\": \"string\", \"minLength\": 1 },\n    \"lang\": { \"type\": \"string\", \"enum\": [\"ja\", \"en\"] },\n    \"source_files\": {\n      \"type\": \"array\",\n      \"minItems\": 1,\n      \"maxItems\": 10,\n      \"items\": { \"type\": \"string\", \"minLength\": 1 }\n    },\n    \"notes\": { \"type\": \"string\" }\n  },\n  \"additionalProperties\": false\n}","readmeExcerpt":"Skill: Calibre Catalog Read Owner: NEXTAltair Summary: Read Calibre catalog data via calibredb over a Content server, and run one-book analysis workflow that writes HTML analysis block back to comments while caching analysis state in SQLite. Use for list/search/id lookups and AI reading pipeline for a selected book. Tags: latest:1.0.5 Version history: v1.0.5 | 2026-02-13T14:16:21.653Z | auto - Improved error handling","codeSnippets":[],"executableExamples":[{"language":"bash","snippet":"node skills/calibre-catalog-read/scripts/calibredb_read.mjs list \\\n  --with-library \"http://192.168.11.20:8080/#Calibreライブラリ\" \\\n  --password-env CALIBRE_PASSWORD \\\n  --limit 50"},{"language":"bash","snippet":"node skills/calibre-catalog-read/scripts/calibredb_read.mjs search \\\n  --with-library \"http://192.168.11.20:8080/#Calibreライブラリ\" \\\n  --password-env CALIBRE_PASSWORD \\\n  --query 'series:\"中公文庫\"'"},{"language":"bash","snippet":"node skills/calibre-catalog-read/scripts/calibredb_read.mjs id \\\n  --with-library \"http://192.168.11.20:8080/#Calibreライブラリ\" \\\n  --password-env CALIBRE_PASSWORD \\\n  --book-id 3"},{"language":"bash","snippet":"uv run python skills/calibre-catalog-read/scripts/run_analysis_pipeline.py \\\n  --with-library \"http://192.168.11.20:8080/#Calibreライブラリ\" \\\n  --password-env CALIBRE_PASSWORD \\\n  --book-id 3 --lang ja"},{"language":"bash","snippet":"uv run python skills/calibre-catalog-read/scripts/analysis_db.py init \\\n  --db skills/calibre-catalog-read/state/calibre_analysis.sqlite"},{"language":"bash","snippet":"uv run python skills/calibre-catalog-read/scripts/analysis_db.py status \\\n  --db skills/calibre-catalog-read/state/calibre_analysis.sqlite \\\n  --book-id 3 --format EPUB"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: calibre-catalog-read\ndescription: Read Calibre catalog data via calibredb over a Content server, and run one-book analysis workflow that writes HTML analysis block back to comments while caching analysis state in SQLite. Use for list/search/id lookups and AI reading pipeline for a selected book.\nmetadata: {\"openclaw\":{\"requires\":{\"bins\":[\"node\",\"uv\",\"calibredb\",\"ebook-convert\"],\"env\":[\"CALIBRE_PASSWORD\"]},\"optionalEnv\":[\"CALIBRE_USERNAME\"],\"primaryEnv\":\"CALIBRE_PASSWORD\",\"dependsOnSkills\":[\"subagent-spawn-command-builder\"],\"localWrites\":[\"skills/calibre-catalog-read/state/runs.json\",\"skills/calibre-catalog-read/state/calibre_analysis.sqlite\",\"skills/calibre-catalog-read/state/cache/**\",\"~/.config/calibre-catalog-read/auth.json\"],\"modifiesRemoteData\":[\"calibre:comments-metadata\"]}}\n---\n\n# calibre-catalog-read\n\nUse this skill for:\n- Read-only catalog lookup (`list/search/id`)\n- One-book AI reading workflow (`export -> analyze -> cache -> comments HTML apply`)\n\n## Requirements\n\n- `calibredb` available on PATH in the runtime where scripts are executed.\n- `ebook-convert` available for text extraction.\n- `subagent-spawn-command-builder` installed (for spawn payload generation).\n- Reachable Calibre Content server URL in `--with-library` format:\n  - `http://HOST:PORT/#LIBRARY_ID`\n- Do not assume localhost/127.0.0.1; always pass explicit reachable `HOST:PORT`.\n- If auth is enabled:\n  - Preferred: set in `/home/altair/.openclaw/.env`\n    - `CALIBRE_USERNAME=<user>`\n    - `CALIBRE_PASSWORD=<password>`\n  - Then pass only `--password-env CALIBRE_PASSWORD` (username auto-loads from env)\n  - You can still override with `--username <user>` explicitly.\n  - Optional auth cache file: `~/.config/calibre-catalog-read/auth.json`\n    - Avoid `--save-plain-password` unless explicitly requested.\n\n## Commands\n\nList books (JSON):\n\n```bash\nnode skills/calibre-catalog-read/scripts/calibredb_read.mjs list \\\n  --with-library \"http://192.168.11.20:8080/#Calibreライブラリ\" \\\n  --password-env CALIBRE_PASSWORD \\\n  --limit 50\n```\n\nSearch books (JSON):\n\n```bash\nnode skills/calibre-catalog-read/scripts/calibredb_read.mjs search \\\n  --with-library \"http://192.168.11.20:8080/#Calibreライブラリ\" \\\n  --password-env CALIBRE_PASSWORD \\\n  --query 'series:\"中公文庫\"'\n```\n\nGet one book by id (JSON):\n\n```bash\nnode skills/calibre-catalog-read/scripts/calibredb_read.mjs id \\\n  --with-library \"http://192.168.11.20:8080/#Calibreライブラリ\" \\\n  --password-env CALIBRE_PASSWORD \\\n  --book-id 3\n```\n\nRun one-book pipeline (analyze + comments HTML apply + cache):\n\n```bash\nuv run python skills/calibre-catalog-read/scripts/run_analysis_pipeline.py \\\n  --with-library \"http://192.168.11.20:8080/#Calibreライブラリ\" \\\n  --password-env CALIBRE_PASSWORD \\\n  --book-id 3 --lang ja\n```\n\n## Cache DB\n\nInitialize DB schema:\n\n```bash\nuv run python skills/calibre-catalog-read/scripts/analysis_db.py init \\\n  --db skills/calibre-catalog-read/state/calibre_analysis.sqlite\n```\n\nCheck current hash state:\n\n```bash\nuv run python skills/cal"},{"path":"README.md","content":"# calibre-catalog-read\n\nCalibreカタログ参照 + 1冊単位のAI読書パイプライン。\n\n注: このパイプラインは、テキスト解析コスト/品質の観点から漫画・コミック系タイトルを対象外にする設計です。\n\n## セットアップ\n\n1. OpenClaw実行環境(このスキルを実行するマシン/ランタイム)にCalibreをインストールする。\n   - 必須バイナリ: `calibredb` / `ebook-convert`\n2. 上記バイナリがPATHに通っていることを確認する。\n3. `subagent-spawn-command-builder` を導入する(spawn payload生成に使用)。\n\n```bash\nnpx clawhub@latest install subagent-spawn-command-builder\npnpm dlx clawhub@latest install subagent-spawn-command-builder\n```\n\n4. Calibre Content serverへ到達できることを確認する。\n5. 接続先は必ず明示的な `HOST:PORT` を使う。\n   - `http://HOST:PORT/#LIBRARY_ID`\n6. 認証が有効な場合は `~/.openclaw/.env` に設定する(推奨)。\n   - `CALIBRE_USERNAME=<user>`\n   - `CALIBRE_PASSWORD=<password>`\n   - 実行時は `--password-env CALIBRE_PASSWORD` を渡す(ユーザー名はenvから自動読込)。\n   - 任意で `~/.config/calibre-catalog-read/auth.json` に認証キャッシュ可能。\n   - `--save-plain-password` は平文保存のため、明示指示がない限り使わない。\n\n## 重要\n\nOpenClaw単体では不足です。実行環境にCalibreを入れて、必要バイナリを利用可能にしてください。\n\nWindowsではDefender Controlled Folder Accessの影響でメタデータ/ファイル操作が失敗する場合があります。\n`WinError 2/5` が出る場合は、Calibreライブラリフォルダや関連バイナリを許可対象に追加してください。\n\n## クイックテスト(カタログ参照)\n\n```bash\nnode scripts/calibredb_read.mjs list \\\n  --with-library \"http://192.168.11.20:8080/#Calibreライブラリ\" \\\n  --password-env CALIBRE_PASSWORD \\\n  --limit 5\n```\n\n## クイックテスト(1冊パイプライン)\n\n```bash\nuv run python scripts/run_analysis_pipeline.py \\\n  --with-library \"http://192.168.11.20:8080/#Calibreライブラリ\" \\\n  --password-env CALIBRE_PASSWORD \\\n  --book-id 3 --lang ja\n```\n\n## サブエージェント入力の分割(推奨)\n\nreadツールの行サイズ制限を避けるため、抽出テキストを分割し、`subagent_input.json` 経由で `source_files` を渡します。\n\n```bash\nnode scripts/prepare_subagent_input.mjs \\\n  --book-id 3 --title \"<title>\" --lang ja \\\n  --text-path /tmp/book_3.txt --out-dir /tmp/calibre_subagent_3\n```\n\n## 低テキスト時の安全策\n\n抽出テキストが短すぎる場合、パイプラインは `reason: low_text_requires_confirmation` で停止し、確認を要求します。\n`--force-low-text` はユーザー確認後のみ使ってください。\n\n## チャット運用(必須: 2ターン)\n\nチャット面では必ず2ターンに分けて実行します。\n\n1) 開始ターン(高速)\n- 対象選定\n- `subagent-spawn-command-builder` で `sessions_spawn` payloadを生成\n- 生成payloadでspawn\n- `run_state.mjs upsert`\n- 即時ACK\n\n2) 完了ターン(後続)\n- 完了イベント\n- `handle_completion.mjs`(内部で `get -> apply -> remove/fail`)\n\nspawnと同一ターンで `poll/wait/apply` を行わないでください。\n\n## spawn payload生成例(builder利用)\n\nまず `subagent-spawn-command-builder` 側の `spawn-profiles.json` に\n`calibre-read` プロファイルを定義します。\n\n例:\n\n```json\n{\n  \"version\": 1,\n  \"defaults\": {\n    \"runTimeoutSeconds\": 300,\n    \"cleanup\": \"keep\"\n  },\n  \"profiles\": {\n    \"calibre-read\": {\n      \"model\": \"openrouter/qwen/qwen3-next-80b-a3b-instruct\",\n      \"thinking\": \"low\",\n      \"runTimeoutSeconds\": 300,\n      \"cleanup\": \"keep\"\n    }\n  }\n}\n```\n\nそのうえで、まずは**スキル呼び出しとして**次の意図で実行します:\n\n- `subagent-spawn-command-builder` を使って `calibre-read` の `sessions_spawn` payloadを生成する\n- `task` には `references/subagent-analysis.prompt.md` ベースの解析指示を渡す\n\n内部実装コマンド(低レベル)は次のとおり:\n\n```bash\nuv run python ../subagent-spawn-command-builder/scripts/build_spawn_payload.py \\\n  --profile calibre-read \\\n  --task \"<analysis task text based on references/subagent-analysis.prompt.md>\"\n```\n\n出力JSONをそのまま `session"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn747bx1r2jrbbyca61v6k06397zy93t\",\n  \"slug\": \"calibre-catalog-read\",\n  \"version\": \"1.0.5\",\n  \"publishedAt\": 1770992181653\n}"},{"path":"references/subagent-analysis.prompt.md","content":"# Subagent Prompt Template (Model-Agnostic)\n\nUse this template with `sessions_spawn` for analysis-only tasks.\n\n## Inputs\n- `book_id`: integer\n- `lang`: `ja` or `en`\n- `title`: string\n- `source_files`: array of text file paths (read all in order)\n\n## Prompt\nYou are an analysis worker for a Calibre pipeline.\nReturn ONLY valid JSON (no markdown fences, no commentary).\nFollow the output schema exactly.\nLanguage rule: write user-visible text in `lang`.\nDo not call external tools. Work only from provided input.\n\nInput:\n- book_id: {{book_id}}\n- lang: {{lang}}\n- title: {{title}}\n- source_files:\n{{source_files}}\n\nRead all files in `source_files` in order and analyze combined content.\n\nOutput schema: `references/subagent-analysis.schema.json`\n\nQuality constraints:\n- Summary: concise and factual.\n- Highlights: concrete points, no fluff.\n- Reread: provide actionable anchors.\n- Tags: useful for retrieval and review.\n\n\n## Runtime knobs (provided by user)\n- model: <user-selected lightweight model id>\n- thinking: <low|medium|high>\n- runTimeoutSeconds: <integer seconds>\n\nDo not invent these values. Confirm once at session start and reuse unless user requests a change.\n\n\n## Runtime command rule\n\n- If you need to execute Python scripts, always use `uv run python`.\n\n## Strict read contract (hard requirement)\n\n- Never call `read` without `path`.\n- Always call `read` with this exact shape: `{\"path\":\"<absolute-or-workspace-relative-file>\"}`.\n- First read: `subagent_input.json` using `{\"path\":\".../subagent_input.json\"}`.\n- Parse `source_files` from that JSON.\n- Then read each source file exactly once, in listed order, using only `{\"path\":\"<file>\"}`.\n- Do not use `file_path`.\n- Do not use offset/limit pagination for this workflow.\n- If any read fails or path is unknown, stop and return schema-valid JSON with `analysis-error` tag instead of free text.\n\n## Output discipline\n\n- Return raw JSON object only.\n- No markdown fences.\n- No prose before/after JSON."},{"path":"references/subagent-analysis.schema.json","content":"{\n  \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n  \"title\": \"CalibreSubagentAnalysisOutput\",\n  \"type\": \"object\",\n  \"required\": [\"book_id\", \"lang\", \"summary\", \"highlights\", \"reread\", \"tags\"],\n  \"properties\": {\n    \"book_id\": { \"type\": \"integer\", \"minimum\": 1 },\n    \"lang\": { \"type\": \"string\", \"enum\": [\"ja\", \"en\"] },\n    \"summary\": { \"type\": \"string\", \"minLength\": 1, \"maxLength\": 1200 },\n    \"highlights\": {\n      \"type\": \"array\",\n      \"minItems\": 2,\n      \"maxItems\": 8,\n      \"items\": { \"type\": \"string\", \"minLength\": 1, \"maxLength\": 400 }\n    },\n    \"reread\": {\n      \"type\": \"array\",\n      \"minItems\": 1,\n      \"maxItems\": 8,\n      \"items\": {\n        \"type\": \"object\",\n        \"required\": [\"section\", \"page\", \"chunk_id\", \"reason\"],\n        \"properties\": {\n          \"section\": { \"type\": \"string\", \"minLength\": 1, \"maxLength\": 200 },\n          \"page\": { \"type\": \"string\", \"minLength\": 1, \"maxLength\": 120 },\n          \"chunk_id\": { \"type\": \"string\", \"minLength\": 1, \"maxLength\": 120 },\n          \"reason\": { \"type\": \"string\", \"minLength\": 1, \"maxLength\": 300 }\n        },\n        \"additionalProperties\": false\n      }\n    },\n    \"tags\": {\n      \"type\": \"array\",\n      \"minItems\": 1,\n      \"maxItems\": 12,\n      \"items\": { \"type\": \"string\", \"minLength\": 1, \"maxLength\": 80 }\n    },\n    \"confidence\": { \"type\": \"number\", \"minimum\": 0, \"maximum\": 1 },\n    \"notes\": { \"type\": \"string\", \"maxLength\": 1200 }\n  },\n  \"additionalProperties\": false\n}"}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":null,"editorialQuality":{"score":100,"threshold":65,"status":"thin","wordCount":1704,"uniquenessScore":40,"reasons":["uniqueness-below-45"]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-04-15T00:45:39.800Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-04-15T00:45:39.800Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-09T21:37:04.846Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}