injectbook is a Node.js + TypeScript CLI that converts books into Codex-compatible agent skills.
For an input book, the CLI outputs:
SKILL.mdreferences/book_full.md(unless disabled)references/chapter-001-*.md,references/chapter-002-*.md, ...
No LLM is used. Output is deterministic.
- Calibre CLI tools (
ebook-convert)
- Works on macOS, Linux, and Windows where
ebook-convertis available. - On macOS Apple Silicon (
arm64),injectbookautomatically retries Calibre under Rosetta (x86_64) if Calibre hits the Qtneonruntime error. - Homebrew auto-install prompt for Calibre is macOS-only.
- Any format that Calibre can convert to EPUB, including PDF
brew tap prashantbhudwal/tap
brew install --cask calibre
brew install injectbook
injectbook --versionHomebrew installs a standalone injectbook binary. Node.js is not required for Homebrew installs.
pnpm install
pnpm run build
node dist/src/cli.js --versionLocal development requires Node.js v20+.
# Basic conversion
injectbook convert ./my-book.epub
# Install into a skills directory
injectbook convert ./my-book.pdf --install --install-dir .agents/skills
# Output to specific directory (creates SKILL.md + references/ here)
injectbook convert ./book.epub --out-dir ./my-output/
# Output to parent directory (creates ./skills/book-slug-skill/)
injectbook convert ./book.epub --out-parent-dir ./skillsIf Calibre is missing, the CLI explains why it is required and, on macOS terminals, asks whether you want it installed via Homebrew.
Output location (pick one):
--out-dir <path>Output directory (writes SKILL.md + references/ directly here). Alias:-o, --output, --output-dir, --skill-dir--out-parent-dir <path>Parent directory; creates<book-slug>-skill/under it--installWrite to--install-dir/<book-slug>-skill(useful for agent skill repos)--install-dir <path>Skill install directory, default.agents/skills
Naming:
--skill-name <name>Override skill name. Alias:-n, --name--description <text>Override skill description
Content:
--include-full-book/--no-include-full-bookIncludereferences/book_full.md(default: true)--chapter-prefix <string>Prefix for chapter reference files, defaultchapter---max-chapter-words <n>Split chapters larger than this word count, default15000--filter-boilerplate/--no-filter-boilerplateDrop license/cover/contents boilerplate (default: true)--strip-images/--no-strip-imagesStrip image references from markdown (default: true)--strip-internal-links/--no-strip-internal-linksStrip internal EPUB links, keep link text (default: true)--calibre-arg <arg>Repeatable; appends one raw token toebook-convert
Safety & debugging:
--overwriteReplace existing output directory (warns if directory doesn't look like a skill)--keep-tempKeep temporary conversion files when conversion fails--verboseVerbose output
PDF notes:
- Text-based PDFs work best.
- Scanned/image-only PDFs require OCR, which is not supported in this version.
Exit codes:
0success2invalid input/arguments3missing runtime dependency (Calibre/Homebrew install path)4extraction/parse failure5output write conflict
pnpm run check
pnpm run test:unit
pnpm run test:e2e
pnpm run test:all
pnpm run build:binaryFor real-book validation, run a corpus of local PDFs through the full conversion pipeline and inspect generated skill outputs. This is a corpus-based end-to-end regression test (also a smoke test across heterogeneous inputs).
Test modes:
pnpm run test:unit: parser + skill-writer unit tests onlypnpm run test:e2e: corpus conversion test only (5PDFs +5EPUBs)pnpm run test:all(andpnpm test): unit tests first, then corpus conversion
mkdir -p output/local-pdfs-verify
for f in local-pdfs/*.pdf; do
base="$(basename "$f" .pdf)"
node dist/src/cli.js convert "$f" --out-dir "output/local-pdfs-verify/${base}-skill" --overwrite
doneQuick quality checks:
- Review chapter counts and chapter size distribution in
references/chapter-*.md. - Spot-check front/back matter handling (
Contents,Notes,Index) for each converted book. - Confirm no books fail extraction unexpectedly.
Release/tap maintenance steps are documented in:
RELEASE.mdCHANGELOG.md