Skill Development
letta-ai/skills
Create and contribute skills to the communal knowledge base.
Converts books and documents in PDF, EPUB, DOCX, HTML, Markdown, text, RTF or MOBI form into agent skills built from frameworks, principles, techniques and anti-patterns.
$ npx skills add virgiliojr94/book-to-skill --skill book-to-skill -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install virgiliojr94/book-to-skill book-to-skill --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
Claude Code skills documentation · loads skills from .claude/skills/
Install the "book-to-skill" agent skill from https://github.com/virgiliojr94/book-to-skill/tree/master into .claude/skills/book-to-skill/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "book-to-skill", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add virgiliojr94/book-to-skill --skill book-to-skill -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install virgiliojr94/book-to-skill book-to-skill --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "book-to-skill" agent skill from https://github.com/virgiliojr94/book-to-skill/tree/master into .agents/skills/book-to-skill/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "book-to-skill", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add virgiliojr94/book-to-skill --skill book-to-skill -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install virgiliojr94/book-to-skill book-to-skill --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "book-to-skill" agent skill from https://github.com/virgiliojr94/book-to-skill/tree/master into .cursor/skills/book-to-skill/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "book-to-skill", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add virgiliojr94/book-to-skill --skill book-to-skill -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install virgiliojr94/book-to-skill book-to-skill --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "book-to-skill" agent skill from https://github.com/virgiliojr94/book-to-skill/tree/master into .gemini/skills/book-to-skill/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "book-to-skill", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install virgiliojr94/book-to-skill book-to-skillInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add virgiliojr94/book-to-skill --skill book-to-skill -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "book-to-skill" agent skill from https://github.com/virgiliojr94/book-to-skill/tree/master into .github/skills/book-to-skill/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "book-to-skill", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add virgiliojr94/book-to-skill --skill book-to-skill -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install virgiliojr94/book-to-skill book-to-skill --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "book-to-skill" agent skill from https://github.com/virgiliojr94/book-to-skill/tree/master into .opencode/skills/book-to-skill/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "book-to-skill", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
book-to-skillConverts books and documents in PDF, EPUB, DOCX, HTML, Markdown, text, RTF or MOBI form into agent skills built from frameworks, principles, techniques and anti-patterns.
The skill extracts structure instead of writing summaries. From a book or document it pulls named frameworks, actionable principles, step-by-step techniques, anti-patterns and the author's voice, keeping the author's exact framework names. It scales the result to the source: simple books become simple skills, while complex ones get reference files and on-demand chapters. The output is a skill folder with a SKILL.md, chapters, a glossary, patterns and a cheatsheet.
There are four modes. Full conversion is the default when you give it files, directories or globs. Analyze only runs the early steps and produces an extraction report for your review without writing skill files. Generate from prior analysis starts from notes you already have, and update or fold-in adds new sources to an existing skill. MOBI and AZW files are read with Calibre.
It targets coding agents such as GitHub Copilot CLI, Amp, Claude Code, Hermes Agent, OpenCode and OpenClaw, and suits studying a document, applying an author's frameworks while you work, or building a reusable knowledge base from a file.
10 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit e180fc4. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Ships 1 file in scripts/, which the agent can run.
Shell commands in SKILL.md call:
gitghnpxpython3claudebrewFrom the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
github.comFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Book to Skill Converter loads about 14k tokens when it runs. Until then it costs about 112 tokens; SKILL.md has 5,099 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); the scripts in this folder are not scanned.
The full file from virgiliojr94/book-to-skill at commit e180fc4, republished under its MIT licence (© virgiliojr94). 5,099 words, ~13,632 tokens.
.claude/skills/book-to-skill/SKILL.md (or your agent's skills folder). This skill also uses 133 other files; get the full folder from GitHub.<!--
Cross-agent notes (informational; ignored by host agents):
- Compatible skill roots: GitHub Copilot CLI (~/.copilot/skills, ~/.agents/skills,
.github/skills, .claude/skills, .agents/skills), Amp (.agents/skills,
~/.config/agents/skills, ~/.config/amp/skills), Claude Code (~/.claude/skills),
Hermes Agent ($HERMES_HOME/skills, .hermes/skills, .agents/skills),
OpenClaw (${OPENCLAW_STATE_DIR:-~/.openclaw}/skills, .agents/skills, skills/;
~/.agents/skills only with the default state).
OpenCode (~/.config/opencode/skills, ~/.claude/skills, .opencode/skills,
~/.agents/skills, .agents/skills).
- `allowed-tools` is intentionally omitted to stay agent-neutral: Copilot CLI uses
`shell`/MCP-server names, Claude uses `Bash`/`Read`/`Write`/`Glob`/`Grep`, Amp
adds `shell_command`. The skill needs shell (to run extract.py) and file
read/write — each host will prompt for those on first use.
- Argument hint: <path-to-document-folder-or-glob>... [skill-name-slug]
-->
Transform written knowledge into actionable agent skills by extracting structure — not producing summaries.
Books contain crystallized expertise: frameworks, principles, and techniques that took years to develop. This skill extracts that knowledge into a format GitHub Copilot CLI, Amp, Claude Code, Hermes Agent, OpenCode, OpenClaw, or another compatible agent can leverage repeatedly. Extract structure, not summaries. A skill isn't a book report. It's a toolkit of:
Preserve the author's precision. Frameworks often have specific names for reasons. "The 5 Whys" isn't interchangeable with "ask why multiple times." Capture the exact formulation.
Layer depth appropriately. Simple books → simple skills. Complex books with 10+ frameworks → skills with reference files and on-demand chapters.
Four paths available. Route based on what the user asks:
Trigger: User provides one or more document/directory/glob paths without special instructions Action: Run all steps below (Steps 0–9) Output: Complete skill with SKILL.md, chapters/, glossary, patterns, cheatsheet
Trigger: User says "analyze", "just extract", or "I want to review before generating" Action: Run Steps 0–3, then produce a structured extraction report (frameworks, principles, techniques found). Stop — do NOT generate skill files. Output: Analysis report for user review
Trigger: User has existing analysis notes or previously ran analyze-only Action: Skip Steps 0–3, use the provided analysis as input, run Steps 4–9 Output: Skill files from the provided analysis
Trigger: User provides one or more new source paths and indicates they want to update an existing skill (either by pointing to the existing skill folder, providing a skill slug that already exists in SKILLS_HOME, or explicitly requesting an update).
Action: Run Step 0 (out-of-scope check), Step 1 (validate inputs), Step 1.5 (identify book type), and Step 2 (extract new files). Then skip to Step 5 (identify/detect existing skill path) and run the Update / Fold-in Workflow to merge the new content into the existing skill files.
Output: Updated existing skill with new/revised chapter summaries and merged indexes/glossaries.
This converter can run from multiple skill systems. When looking for this converter's helper script or writing the generated book skill, prefer these locations in order:
~/.copilot/skills/~/.agents/skills/~/.claude/skills/.github/skills/.claude/skills/.agents/skills/~/.config/agents/skills/~/.config/amp/skills/$HERMES_HOME/skills/ (defaults to ~/.hermes/skills/).hermes/skills/ or .agents/skills/${OPENCLAW_STATE_DIR:-~/.openclaw}/skills/ (active state; ~/.agents/skills/ is shared only with the default state).agents/skills/ or skills/~/.config/opencode/skills/ or ~/.agents/skills/.opencode/skills/ or .agents/skills/For generated book skills, prefer the user-level cross-agent root ~/.agents/skills/ — one physical copy serves the cross-agent hosts and OpenClaw when it uses its default state. Copilot CLI and Amp discover it natively; Claude Code needs a symlink from ~/.claude/skills/<skill_name> (created in Step 10, see Step 5 for the rules). Pick a host-private or project-local root only when the user explicitly asks for one. BOOK_TO_SKILL_SCOPE=project or personal can make that choice explicit for automation; do not ask a mandatory scope question merely because both scopes are available.
If no arguments are provided, stop and respond:
"book-to-skill requires a supported document path, folder, or glob pattern. Usage:
book-to-skill <path-to-document-folder-or-glob>... [skill-name-slug]"
Throughout the workflow:
SKILL_NAME.INPUT_PATHS.SKILL.md and a chapters/ sub-folder), or if SKILL_NAME matches an existing skill slug in the resolved root, flag this run as an Update/Fold-in operation (Mode 4).SKILL_NAME given — and check the resolved root for an existing match. On a match, STOP and ask the user: "<skill-name> already exists. Choose: (1) Update/Fold-in (Mode 4), (2) verify the existing skill is complete and stop, or (3) force full regeneration." Do not re-extract until the user chooses. On context recovery after an interrupted run (network cut-off, replayed or continued conversation), reuse the extraction work directory that run reported (Workdir -> in its output, or the path you set in BOOK_SKILL_WORKDIR) only if it is still intact and still matches the current inputs and options — the directory exists, its metadata.json is readable, the sources it lists match the files being converted now one-to-one on filename and content fingerprint (the extractor records a per-source sha256 in metadata.json; recompute the fingerprint from each file as it exists now and require an exact match — reuse_is_safe() in book_to_skill/utils.py is the executable form of this check), and its recorded extraction_mode is the mode this run is using (Step 2's "confirm the extraction is the document you asked for" rule). If it is missing (temp cleanup), its metadata.json is gone, the sources no longer match (a different filename, or a changed content fingerprint), the recorded metadata has no sha256 for a source (recorded before fingerprints existed, so freshness cannot be established), or the mode differs, say so and start a fresh extraction instead of resuming. When in doubt, ask the user before discarding or resuming.Verify that there is at least one supported file, directory, or glob pattern among the INPUT_PATHS.
For directories and globs, expand them to find matching supported files (.pdf, .epub, .docx, .txt, .md, .markdown, .rst, .adoc, .html, .htm, .rtf, .mobi, .azw, .azw3).
If no supported files are found, stop with a clear error message.
Before extracting, ask the user:
"What kind of content do these sources have? This helps me choose the best extraction method.
- Technical — has code blocks, tables, formulas, diagrams (e.g. programming books, academic papers, architecture guides)
- Text-heavy — mostly prose, few or no tables/code (e.g. management, productivity, narrative non-fiction)
- Not sure — I'll use the fast method and warn you if quality seems limited"
Store the answer as BOOK_TYPE:
BOOK_TYPE=technicalBOOK_TYPE=textBOOK_TYPE=textIf BOOK_TYPE=technical, inform the user before proceeding:
"📐 Technical mode selected — using Docling for structure-aware extraction (tables, code blocks, formulas preserved as markdown). This takes ~1.5s per page, so expect a few minutes for longer sources. Starting now…"
If BOOK_TYPE=text, inform:
"📄 Text mode selected — using the fastest suitable extractor for each file type. Plain text/Markdown/HTML are usually ready in seconds; PDFs use pdftotext when available."
Run the extraction script, passing the input paths:
SCRIPT_PATH=""
HERMES_HOME_RESOLVED="${HERMES_HOME:-$HOME/.hermes}"
OPENCLAW_STATE_DIR_RESOLVED="${OPENCLAW_STATE_DIR:-$HOME/.openclaw}"
PROJECT_ROOT="$(git rev-parse --show-toplevel 2>/dev/null || true)"
HERMES_PROJECT_TRUSTED=false
if [ -n "$PROJECT_ROOT" ] && [ "${HERMES_AGENT:-}" = true ] && \
command -v hermes >/dev/null 2>&1 && \
command -v python3 >/dev/null 2>&1 && \
hermes config get skills.trusted_project_dirs --json 2>/dev/null | PROJECT_ROOT="$PROJECT_ROOT" python3 -c 'import json, os, pathlib, sys; root=pathlib.Path(os.environ["PROJECT_ROOT"]).resolve(); sys.exit(not any(pathlib.Path(p).expanduser().resolve() == root for p in json.load(sys.stdin)))' 2>/dev/null
then
HERMES_PROJECT_TRUSTED=true
fi
CANDIDATES=(
"$HOME/.copilot/skills/book-to-skill/scripts/extract.py"
"$HOME/.agents/skills/book-to-skill/scripts/extract.py"
"$HOME/.claude/skills/book-to-skill/scripts/extract.py"
"${OPENCLAW_STATE_DIR_RESOLVED}/skills/book-to-skill/scripts/extract.py"
"${OPENCLAW_STATE_DIR_RESOLVED}/skills"/*/book-to-skill/scripts/extract.py
"${OPENCLAW_STATE_DIR_RESOLVED}/skills"/*/*/book-to-skill/scripts/extract.py
"${OPENCLAW_STATE_DIR_RESOLVED}/skills"/*/*/*/book-to-skill/scripts/extract.py
"${OPENCLAW_STATE_DIR_RESOLVED}/skills"/*/*/*/*/book-to-skill/scripts/extract.py
"${OPENCLAW_STATE_DIR_RESOLVED}/skills"/*/*/*/*/*/book-to-skill/scripts/extract.py
"${OPENCLAW_STATE_DIR_RESOLVED}/skills"/*/*/*/*/*/*/book-to-skill/scripts/extract.py
"$HOME/.config/opencode/skills/book-to-skill/scripts/extract.py"
"$HERMES_HOME_RESOLVED/skills/book-to-skill/scripts/extract.py"
"$HERMES_HOME_RESOLVED"/skills/*/book-to-skill/scripts/extract.py
)
if [ "${HERMES_AGENT:-}" != true ]; then
# Project-local roots are resolved against the git worktree, not the current
# directory: an agent can be invoked from anywhere inside the project (e.g.
# `src/nested`) and these roots still have to be found — that is how OpenCode
# and the other hosts discover project skills. The CWD-relative forms are kept
# so the probe also works outside a git repository.
if [ -n "$PROJECT_ROOT" ]; then
CANDIDATES+=(
"$PROJECT_ROOT/.github/skills/book-to-skill/scripts/extract.py"
"$PROJECT_ROOT/.claude/skills/book-to-skill/scripts/extract.py"
"$PROJECT_ROOT/.agents/skills/book-to-skill/scripts/extract.py"
"$PROJECT_ROOT/.opencode/skills/book-to-skill/scripts/extract.py"
)
fi
CANDIDATES+=(
".github/skills/book-to-skill/scripts/extract.py"
".claude/skills/book-to-skill/scripts/extract.py"
".agents/skills/book-to-skill/scripts/extract.py"
"skills/book-to-skill/scripts/extract.py"
"skills"/*/book-to-skill/scripts/extract.py
"skills"/*/*/book-to-skill/scripts/extract.py
"skills"/*/*/*/book-to-skill/scripts/extract.py
"skills"/*/*/*/*/book-to-skill/scripts/extract.py
"skills"/*/*/*/*/*/book-to-skill/scripts/extract.py
"skills"/*/*/*/*/*/*/book-to-skill/scripts/extract.py
".opencode/skills/book-to-skill/scripts/extract.py"
)
if [ -n "$PROJECT_ROOT" ]; then
CANDIDATES+=(
"$PROJECT_ROOT/skills/book-to-skill/scripts/extract.py"
"$PROJECT_ROOT/skills"/*/book-to-skill/scripts/extract.py
"$PROJECT_ROOT/skills"/*/*/book-to-skill/scripts/extract.py
"$PROJECT_ROOT/skills"/*/*/*/book-to-skill/scripts/extract.py
"$PROJECT_ROOT/skills"/*/*/*/*/book-to-skill/scripts/extract.py
"$PROJECT_ROOT/skills"/*/*/*/*/*/book-to-skill/scripts/extract.py
"$PROJECT_ROOT/skills"/*/*/*/*/*/*/book-to-skill/scripts/extract.py
)
fi
fi
CANDIDATES+=(
"$HOME/.config/agents/skills/book-to-skill/scripts/extract.py"
"$HOME/.config/amp/skills/book-to-skill/scripts/extract.py"
)
if [ "$HERMES_PROJECT_TRUSTED" = true ]; then
CANDIDATES=(
"$PROJECT_ROOT/.hermes/skills/book-to-skill/scripts/extract.py"
"$PROJECT_ROOT/.hermes/skills"/*/book-to-skill/scripts/extract.py
"$PROJECT_ROOT/.agents/skills/book-to-skill/scripts/extract.py"
"$PROJECT_ROOT/.agents/skills"/*/book-to-skill/scripts/extract.py
"${CANDIDATES[@]}"
)
fi
for candidate in "${CANDIDATES[@]}"
do
if [ -f "$candidate" ]; then
SCRIPT_PATH="$candidate"
break
fi
done
if [ -z "$SCRIPT_PATH" ]; then
echo "Could not find scripts/extract.py for book-to-skill" >&2
exit 1
fi
PYTHON_BIN="${PYTHON_BIN:-python3}"
if ! command -v "$PYTHON_BIN" >/dev/null 2>&1; then
PYTHON_BIN="python"
fi
"$PYTHON_BIN" "$SCRIPT_PATH" $INPUT_PATHS --mode <BOOK_TYPE> --install-missing askBefore extraction, the script checks optional Python packages needed for the detected format. If a better extractor is missing, it prompts the user with the available fallback. Non-interactive sessions default to fallback unless install mode is explicitly yes.
Tip — preflight the environment: run "$PYTHON_BIN" "$SCRIPT_PATH" --check to print a per-format report of which extractors are installed and the exact command to install whatever is missing, without processing any file. Useful when a user reports a setup or quality problem.
This creates a per-run work directory — <tempdir>/book_skill_work-<pid>/ by default, or exactly the path you set in BOOK_SKILL_WORKDIR — containing:
full_text.txt — combined extracted text of all sources with clear visually demarcated boundaries.metadata.json — overall combined size, words, pages, token counts, dropped EPUB image counts, the resolved workdir, and a detailed list of individual processed sources.The run prints all three paths on completion (Workdir ->, Text ->, Meta ->). Take the paths from that output (or from metadata.json's own workdir field) rather than assuming a fixed location — the directory name differs per run so that concurrent extractions on one machine cannot overwrite each other's results.
Read that run's metadata.json to inspect the results.
Always confirm the extraction is the document you asked for before generating anything: check filename / source_file in metadata.json, or the SOURCE: header on the first line of full_text.txt. If you are waiting on a background run, wait on its specific workdir — polling a shared path can surface a different run's output.
Read this run's metadata.json (the Meta -> path from the extraction output) and present the user with an estimate before doing any generation:
📖 Sources detected: <total_sources> source(s)
<list each source filename and format from the sources metadata list>
<if images_dropped > 5: warn that N source images were not read>
📄 Combined Pages/Sections: ~<N> | Words: ~<N> | Total tokens: ~<N>K
💰 Estimated token cost (Full Conversion / Update):
Input (reading + prompts): ~<N>K tokens
Output (skill files generated/updated): ~<N>K tokens
Total: ~<N>K tokens
Cost: multiply the token counts above by your model's current
input/output per-1M-token rates (prices and model names change often —
do not hardcode them; quote today's rate and label it as an estimate).
⏱ Estimated time: ~<N> minutes
📁 Files to be generated/updated:
SKILL.md + chapter files + glossary + patterns + cheatsheet
➡ Proceed with Full Conversion / Update? (or type "analyze only" to preview first)How to estimate:
estimated_tokens from metadata × 1.3 (prompts overhead per chapter pass)BOOK_TYPE (DEPTH is decided later in Step 4 and can raise it): text ≈ 1,000, technical ≈ 1,800. If the user has already indicated reference-only vs deep study, use the matching row of the Step 7 matrix.Wait for the user to confirm before proceeding. If they say "analyze only", switch to Mode 2.
Inspired by the Recursive Language Model (RLM) paradigm: treat full_text.txt as a queryable corpus, not a single read. Loading the whole file into context burns budget you will need later for generation.
For books over ~50k tokens, prefer programmatic probes over Read(full_text.txt) without bounds:
# Size check before any Read
wc -w "$FULL_TEXT_PATH"
# Find chapter offsets without loading the whole file
grep -n -E "^\s*(Chapter|CHAPTER)\s+[0-9]+" "$FULL_TEXT_PATH" | head -40
# Pull only the chapter you need (lines start..end inclusive)
sed -n '<start>,<end>p' "$FULL_TEXT_PATH"
# Verify a framework is actually mentioned before claiming it in SKILL.md
grep -c -i "westrum\|dora" "$FULL_TEXT_PATH"
# Targeted Read with offset/limit avoids dumping the full file
# Read(file_path=full_text.txt, offset=<line>, limit=<lines>)Use this approach for Step 3 (structure analysis), Step 7 (per-chapter summaries), and Step 8 (glossary / patterns extraction). On books under 50k tokens, a single Read is fine.
Why this matters: a 200-page book is ~75k tokens. Re-reading it once per chapter (28 passes) costs ~2M input tokens; using grep + sed to pull only relevant slices keeps generation cost proportional to the output, not the source.
Read the first 8,000 characters of the extracted full_text.txt to identify:
Then read the Table of Contents section if present to map all chapters.
If mode is "Analyze Only": produce the extraction report now and stop. Structure:
## Extraction Report — <Title>
### Author's Core Frameworks
- **<Framework Name>**: <what it is and when to apply>
### Key Principles
- <Principle>: <actionable rule>
### Techniques & Methods
- <Technique>: <step-by-step or how-to>
### Anti-patterns
- <What to avoid>: <why>
### Suggested Skill Name
`{author-lastname}-{core-concept}` — e.g. `cialdini-influence`
### Chapters Detected
| # | Title | Main Frameworks |Before generating, ask the user:
"What should this skill help you do? (Pick one or more)
- Apply the author's frameworks while working
- Think with the author's mental models
- Reference specific chapters and concepts
- All of the above"
Use the answer to weight what gets highlighted in the SKILL.md Core section.
Derive DEPTH from the answer (no extra prompt):
DEPTH=reference — lean, fast-lookup chapters.DEPTH=study — deeper chapters with more worked detail, examples, and reasoning.DEPTH and BOOK_TYPE together set the per-chapter token budget in Step 7. Do not ask a separate "study vs reference" question — it is inferred here. (In Modes 2/3, where Step 4 is skipped, default DEPTH=study.)
If SKILL_NAME was provided, use it as the skill slug.
Otherwise, propose two options and let the user choose:
{author-lastname}-{core-concept} (e.g. cialdini-influence, meadows-systems)designing-data-intensive-apps)Default to author-concept format if the book has a strong methodological identity.
Choose the destination skill root (SKILLS_HOME). First resolve scope from an explicit user request or BOOK_TO_SKILL_SCOPE, then probe host. A request for project-local/project output selects the project-local row; a request for personal/global output selects the personal row. If neither scope is requested, preserve the established personal default (~/.agents/skills for non-Hermes hosts). Do not ask a mandatory scope question solely because project-local roots exist. The selected root may still require host approval before writing.
| Host agent | Personal skill root | Project-local root |
|---|---|---|
| GitHub Copilot CLI | ~/.agents/skills (discovered natively) | .github/skills → .claude/skills → .agents/skills |
| Amp | ~/.agents/skills (discovered natively) | .agents/skills |
| OpenAI Codex | ~/.agents/skills (discovered natively; follows symlinks) | .agents/skills |
| Hermes Agent | $HERMES_HOME/skills/<category> (defaults to ~/.hermes/skills/<category>) | .hermes/skills/<category> → .agents/skills |
| Claude Code | ~/.agents/skills + symlink from ~/.claude/skills/<skill_name> | .claude/skills |
| OpenClaw | ${OPENCLAW_STATE_DIR:-~/.openclaw}/skills (active state; ~/.agents/skills only with default state) | .agents/skills → skills/ |
Hermes Agent is the one host that keeps its own personal root: it partitions personal skills by category and does not scan the cross-agent root. Use the active profile's HERMES_HOME and choose a category that matches the generated skill's subject. Do not construct profile paths manually. If the user selects a project-local Hermes root, run hermes skills trust <project-root> after generation and verify discovery with hermes skills list; project skills remain unavailable until the project is trusted.
For OpenClaw, use the active state directory's skills/ root: ${OPENCLAW_STATE_DIR:-~/.openclaw}/skills/. The shared ~/.agents/skills compatibility root is discoverable only when OPENCLAW_STATE_DIR is unset or the default ~/.openclaw; with a non-default state, do not claim that OpenClaw will see a shared-root install. Verify discovery with openclaw skills list after generation.
| OpenCode | ~/.agents/skills (discovered natively; ~/.config/opencode/skills and ~/.claude/skills are read too) | .opencode/skills → .agents/skills → .claude/skills |
Hermes Agent is the one host that keeps its own personal root: it partitions personal skills by category and does not scan the cross-agent root. Use the active profile's HERMES_HOME and choose a category that matches the generated skill's subject. Do not construct profile paths manually. If the user selects a project-local Hermes root, run hermes skills trust <project-root> after generation and verify discovery with hermes skills list; project skills remain unavailable until the project is trusted.
OpenCode scans the cross-agent ~/.agents/skills root natively, so the generated-skill default above already serves it — no symlink and no trust step. It also reads its own managed ~/.config/opencode/skills root and the Claude compatibility root ~/.claude/skills; use the OpenCode-managed root only when the user asks for it. Project skills are discovered by walking up from the working directory to the git worktree, so start a new session after generation if the skill does not appear. (~/.cache/opencode/skills is the remote-skill download cache from skills.urls, not an authoring root — never write a generated skill there.)
Selection rules:
SKILLS_HOME to ~/.agents/skills (create the directory if missing). One exception, so the default does not invent a convention in someone else's house: if ~/.agents/skills does not exist and the host's private root already contains skills, use the private root instead and say why in the report.~/.agents/skills — after generation completes, Step 10 links the skill in with ln -sfn "$HOME/.agents/skills/<skill_name>" "$HOME/.claude/skills/<skill_name>".~/.copilot/skills, ~/.claude/skills, ~/.config/agents/skills, ~/.config/amp/skills), honor it and skip the symlink.${OPENCLAW_STATE_DIR:-$HOME/.openclaw}/skills. The shared ~/.agents/skills root is a valid OpenClaw destination only when OPENCLAW_STATE_DIR is unset or equals the default $HOME/.openclaw; otherwise use the active state root or a project/extra directory.openclaw skills list.Set SKILLS_HOME to the selected root and check if $SKILLS_HOME/<skill_name>/ already exists. On Claude Code, also check whether ~/.claude/skills/<skill_name> exists as a real directory (not a symlink) — a previous install may live there; if so, offer to migrate it (move the directory into ~/.agents/skills/ and replace the original path with the symlink) before continuing.
If the skill already exists, prompt the user to choose:
-2 or use a different custom slug.If the user selects Update / Fold-in, proceed immediately to the Update / Fold-in Workflow section after Step 2.5 (skipping Steps 3, 4, 6, 7, 8, 9).
mkdir -p "$SKILLS_HOME/<skill_name>/chapters"TOKEN BUDGET RULE — CRITICAL (adaptive):
The per-chapter budget scales with BOOK_TYPE and DEPTH. Technical chapters need room for code and tables; study depth needs room for worked reasoning. Pick the budget from this matrix:
DEPTH=reference | DEPTH=study | |
|---|---|---|
BOOK_TYPE=text | 800–1,200 tokens | 1,000–1,800 tokens |
BOOK_TYPE=technical | 1,200–1,800 tokens | 2,000–3,000 tokens |
DEPTH=study is earned with content, not a bigger number. The standard section template (Core Idea → Connects To) naturally lands a dense prose chapter around 700–900 tokens. To reach the study budget honestly — not by padding — a study-depth chapter must add concrete material:
## Worked Example section. This is the single biggest lever and the main thing a learner returns for.If a chapter genuinely has no worked example and resists expansion, let it land below the study floor rather than padding — and note that the chapter is thin in its Core Idea. A reference-depth chapter, by contrast, deliberately omits worked examples and keeps only the decision-ready essentials.
For EACH chapter/major section identified in Step 3:
Read the corresponding section of the extracted full_text.txt (use character offsets or grep for chapter headings).
Create $SKILLS_HOME/<skill_name>/chapters/ch<NN>-<slug>.md using the structure below.
Adapt emphasis based on BOOK_TYPE:
technical → prioritize "Code Examples", "Reference Tables", and "Commands & APIs" sections; preserve exact syntaxtext → prioritize "Frameworks Introduced", "Mental Models", and "Key Takeaways"; skip empty technical sections# Chapter N: <Full Title>
## Core Idea
<1–2 sentences: the single most important thing this chapter teaches>
## Frameworks Introduced
- **<Framework Name>**: <exact formulation — preserve the author's naming>
- When to use: <specific situation>
- How: <steps or criteria>
## Key Concepts
- **<Term>**: <precise definition in 1 sentence>
(5–10 most important terms from this chapter)
## Mental Models
<2–4 frameworks or thinking tools. Write as "Use X when Y" or "Think of X as Y">
## Anti-patterns
- **<What to avoid>**: <why it fails>
## Code Examples *(technical books only — omit if BOOK_TYPE=text)*
<!-- Copy the most instructive snippet from the chapter. Preserve indentation exactly. -->
```<language>
<key code example from this chapter><one line><!-- Reproduce any comparison matrix, parameter table, or decision table from the chapter in markdown. -->
<!-- Reproduce or reconstruct one concrete example the author works through: a
sample document, a dialogue, a filled-in template, a before/after, or a
decision walked end-to-end. This is what makes a study chapter worth its
budget. Keep it faithful to the source; never copy long raw passages —
reconstruct the example compactly. -->
<Actionable insight>
<Actionable insight>
<Actionable insight>
(3–7 takeaways a practitioner must remember)
<why this chapter relates><Concept>: <external concept or standard it connects with>
---
## Step 8 — Generate supporting files
### glossary.md
Create `$SKILLS_HOME/<skill_name>/glossary.md`:
- Every significant term from the book, alphabetically sorted
- Format: `**Term** — definition (Ch N)`
- Max 1,500 tokens
### patterns.md
Create `$SKILLS_HOME/<skill_name>/patterns.md`:
- All concrete techniques, design patterns, algorithms from the book
- Format: `## Pattern Name\n**When to use**: ...\n**How**: ...\n**Trade-offs**: ...`
- Max 2,000 tokens
### cheatsheet.md
Create `$SKILLS_HOME/<skill_name>/cheatsheet.md`:
**This is the most differentiated layer of the skill — treat it as a reasoning aid, not a keyword list.** Anyone can grep the glossary for a term. The cheatsheet captures the author's *judgment*: the decisions they'd make and why. It's the file that turns "I know the words" into "I'd act the way the author would".
Prioritize, in order:
1. **Decision rules** — "When X, do Y, because Z." The if/then logic the author applies, stated so the reader can apply it without re-reading the book.
2. **Decision trees / flowcharts** (as nested bullets or a small table) — for choices with more than two branches.
3. **Trade-off matrices** — competing options scored on the dimensions the author cares about, so the reader can pick under their own constraints.
4. **Thresholds & defaults** — the specific numbers, ratios, or rules of thumb the author commits to (e.g. "keep functions under ~20 lines", "alert when error budget < 10%").
5. **Tells & smells** — fast heuristics for recognizing a situation ("if you see X, you're probably in trouble Y").
Avoid: bare term→definition rows (that's the glossary), and prose paragraphs (that's the chapters). Every line should help the reader *decide* something.
- Format mostly as compact tables and decision rules; the content you'd want on a single printed page kept beside you while working.
- Max 1,200 tokens.
---
## Step 9 — Generate the master SKILL.md
**CRITICAL TOKEN BUDGET: Keep SKILL.md body under 4,000 tokens.**
Compaction truncates from the END — put the most important content FIRST.
Create `$SKILLS_HOME/<skill_name>/SKILL.md`:
```markdown
---
name: <skill_name>
description: "Knowledge base from \"<Full Title>\" by <Author(s)>. Use when applying <author>'s frameworks for <key topics, 3–6 terms>, studying the book, or referencing its concepts."
---
<!-- argument-hint: [topic, framework name, or chapter number] -->
# <Full Title>
**Author**: <Author(s)> | **Pages**: ~<N> | **Chapters**: <N> | **Generated**: <YYYY-MM-DD>
## How to Use This Skill
- **Without arguments** — load core frameworks for reference
- **With a topic** — ask about `replication`, `pricing`, or another indexed topic; I find and read the relevant chapter
- **With chapter** — ask for `ch05`; I load that specific chapter
- **Browse** — ask "what chapters do you have?" to see the full index
When you ask about a topic not covered in Core Frameworks below, I will read
the relevant chapter file before answering.
---
## Core Frameworks & Mental Models
<!-- ~2,000 tokens: the author's most important named frameworks and principles.
Preserve exact names. Write as "Use X when Y", "Prefer X over Y because Z".
This is a toolkit, not a summary. -->
<generate 2,000 tokens of the most critical frameworks and insights here>
---
## Chapter Index
| # | Title | Key Frameworks |
|---|-------|----------------|
| [ch01](chapters/ch01-<slug>.md) | <Title> | <framework1>, <framework2> |
| [ch02](chapters/ch02-<slug>.md) | <Title> | <framework1>, <framework2> |
...
## Topic Index
<!-- Alphabetical. Major terms/frameworks → chapter(s) that cover them. -->
- **<Term>** → ch<N>[, ch<N>]
- **<Term>** → ch<N>
## Supporting Files
- [glossary.md](glossary.md) — all key terms with definitions
- [patterns.md](patterns.md) — all techniques and design patterns
- [cheatsheet.md](cheatsheet.md) — quick reference tables and decision guides
---
## Scope & Limits
This skill covers the book content only. For hands-on implementation in your codebase,
combine with project-specific tools. For topics beyond this book, check related skills
or ask the agent directly.
<if images_dropped > 5: state that N source images were not read>Before reporting success, loading the skill in another session, or publishing it, run the advisory security scan:
SKILL_CONVERTER_ROOT="$(cd "$(dirname "$SCRIPT_PATH")/.." && pwd)"
"$PYTHON_BIN" "$SKILL_CONVERTER_ROOT/tools/scan_generated_skill.py" "$SKILLS_HOME/<skill_name>"If the scanner exits non-zero, stop and ask a human to review its file/line findings. Do not silently rewrite the generated files, and do not load or publish the skill until the findings are resolved or explicitly accepted.
If the host is Claude Code and SKILLS_HOME is ~/.agents/skills (the default personal install), expose the skill to Claude Code with a symlink — Claude Code only scans ~/.claude/skills:
mkdir -p "$HOME/.claude/skills"
LINK="$HOME/.claude/skills/<skill_name>"
TARGET="$HOME/.agents/skills/<skill_name>"
if [ -d "$LINK" ] && [ ! -L "$LINK" ]; then
CLAUDE_STATUS="skipped-realdir" # Step 5 migration declined; leave the old dir
else
ln -sfn "$TARGET" "$LINK" 2>/dev/null || true
# Read the link back — do NOT trust that `ln` did what was asked. On Windows/MSYS
# `ln -s` may COPY instead of link (or need Developer Mode / an elevated shell), and
# PowerShell/cmd have no `ln` at all. The report must reflect what is on disk, not the
# fact that the command ran.
if [ -L "$LINK" ] && [ "$(readlink "$LINK")" = "$TARGET" ]; then
CLAUDE_STATUS="linked"
elif [ -e "$LINK" ]; then
CLAUDE_STATUS="copy" # a real file/dir landed instead of a link
else
CLAUDE_STATUS="absent" # ln unavailable or refused
fi
fiThe real-directory guard is required: ln -sfn into an existing real directory would nest the link inside it (~/.claude/skills/<skill_name>/<skill_name>), leaving Claude Code loading the stale copy. If the user declined the Step 5 migration, skip the symlink and say so in the report — Claude Code keeps using the old directory until it is migrated.
Read the link back before you report anything about it. The symlink is a claim, not a fact: fill the "Discoverable by" line from CLAUDE_STATUS (what is actually on disk), never from "the command was issued". Do not hard-fail when the link is missing or is a copy — the skill exists at the hub and every other host still finds it; the honest report is "written to ~/.agents/skills/<skill_name>; Claude Code will not see it until the link is created", not an abort. (Windows lead, unverified: a directory junction — mklink /J in an elevated cmd, or New-Item -ItemType Junction in PowerShell — needs neither Developer Mode nor a symlink privilege; if you attempt it, it does not change the read-back-then-report rule.)
Skip this when the user chose a host-private or project-local root (Step 5, rules 3-4).
Then clean up the extraction workdir:
PYTHON_BIN="${PYTHON_BIN:-python3}"
if ! command -v "$PYTHON_BIN" >/dev/null 2>&1; then
PYTHON_BIN="python"
fi
Remove **the work directory this run actually used** — the `Workdir ->` path from the
extraction output, which is also stored as `workdir` in `metadata.json`. Never delete a
directory you did not create: another extraction may be running beside yours.
```bash
# WORKDIR is the path this run reported; quote it in case of spaces.
rm -rf "$WORKDIR"Equivalently, if you still have the metadata file:
"$PYTHON_BIN" - "$WORKDIR_METADATA_JSON" <<'PY'
import json
import shutil
import sys
from pathlib import Path
meta_path = Path(sys.argv[1])
workdir = json.loads(meta_path.read_text(encoding="utf-8")).get("workdir")
if workdir:
shutil.rmtree(workdir, ignore_errors=True)
PYOlder copies of this file removed a single fixed book_skill_work directory. That path is
no longer used, so such a cleanup is now a harmless no-op rather than something that could
delete a concurrent run's output.
Then report to the user:
✅ Skill created: $SKILLS_HOME/<skill_name>/
📚 Book: <Full Title> — <Author>
📄 Pages: ~<N> | Chapters: <N>
Files generated:
SKILL.md — core frameworks + index (~X tokens)
chapters/ — <N> chapter summaries (~X tokens each, ~X total)
glossary.md — key terms (~X tokens)
patterns.md — techniques & patterns (~X tokens)
cheatsheet.md — quick reference (~X tokens)
─────────────────────────────────────────────────────
Total skill size: ~X tokens (loaded on-demand, not all at once)
💡 Tip: check your agent's session cost/usage command to see actual token usage.
Usage:
Ask for <skill_name> → load core frameworks
Ask <skill_name> about <topic> → find and explain a topic
Ask <skill_name> for ch<N> → dive into a specific chapter
Discoverable by: <only what is true for the chosen destination — see below>
Somewhere else? mv ~/.agents/skills/<skill_name> <dest_root>/<skill_name> \
&& ln -sfn <dest_root>/<skill_name> ~/.claude/skills/<skill_name>
Prompted for permission on every file? That is your host gating writes outside the
working directory. Say "save it in this project" and re-run to write inside it.
Reload (if your agent doesn't auto-detect new skills):
GitHub Copilot CLI: /skills reload
Claude Code: restart the session
Amp: restart the session
Hermes Agent: start a new session
OpenClaw: openclaw skills list (new session if watcher disabled)
OpenCode: start a new session
Share this skill (optional):
GitHub repo, installable on any host (Step 11): say "publish"
Copilot ecosystem: gh skill publish $SKILLS_HOME/<skill_name>Fill the "Discoverable by" line from CLAUDE_STATUS (the read-back result), never from the fact that ln ran — for ~/.agents/skills installs:
linked → "Copilot CLI, Amp, Codex (natively); Claude Code via symlink ~/.claude/skills/<skill_name>"skipped-realdir → "Copilot CLI, Amp, Codex (natively); NOT Claude Code — migrate the real directory at ~/.claude/skills/<skill_name> first"copy or absent → "Copilot CLI, Amp, Codex (natively); NOT Claude Code — the host could not create the symlink (a plain copy drifts on the next Update/Fold-in). Enable Developer Mode / create the link manually, or run the skill from ~/.agents/skills"$HERMES_HOME/skills/<category>)"; no symlink claim, and no cross-agent claim, because the other hosts do not scan the Hermes rootThe "Somewhere else?" relocation line must be correct for the path actually taken, so it never breaks the symlink the run just created. mv always targets the final skill directory, <dest_root>/<skill_name>, never <dest_root> itself. mv ~/.agents/skills/mybook ~/.copilot/skills && ln -sfn ~/.copilot/skills ~/.claude/skills/mybook reads as valid and is not: the skill lands at ~/.copilot/skills/mybook while the link points one level up at the root, so Claude Code resolves to a directory with no SKILL.md, which is the exact breakage this line exists to avoid. Substitute the destination the user actually named, so the printed command carries real paths and there is nothing left to interpret:
~/.agents/skills + symlink → mv ~/.agents/skills/<skill_name> <dest_root>/<skill_name> && ln -sfn <dest_root>/<skill_name> ~/.claude/skills/<skill_name>mv <src_root>/<skill_name> <dest_root>/<skill_name>mv <project_root>/<skill_name> <dest_root>/<skill_name>The "Prompted for permission on every file?" line is the answer to a host that gates writes outside the working directory (any personal-scope root is out-of-cwd): the destination was announced above, and the one-line fix — re-run asking for the project-local root — sits next to it. Keep it only for personal-scope installs; drop it when the user already chose project-local.
After the Step 10 report, offer once — and only if the Step 9.5 scan passed:
"Want me to publish this skill to GitHub so any Agent Skills host can install it with
npx skills add? (yes / skip)"
If the user declines, stop here. Requirements: the gh CLI, authenticated (check gh auth status). If gh is missing or unauthenticated, offer to set it up (brew install gh or https://cli.github.com, then gh auth login) — or use the no-gh path: the user creates an empty repo of the chosen visibility in the GitHub web UI, then you run the git init/add/commit commands below followed by git remote add origin <repo-url> && git push -u origin main. The visibility rule below applies to the web-created repo exactly the same.
Visibility is a separate closed question — never inferred, never read out of an earlier answer. Once the user accepts, ask it on its own and require a one-word reply:
"Private or public repository? Reply with one word:
privateorpublic."
The reply must be public, not merely contain it — a hard rule, not a suggestion. Run gh repo create with --private in every case except one: the answer to the visibility question is the bare word public. Substring matching is forbidden, because a sentence about the source's licence is not a visibility answer — "it's public domain", "the book is public domain", "it's publicly available" all describe the material, not the repository, and all resolve to --private. A paraphrase, a sentence, an ambiguous answer, silence, or your own inference is NOT consent: re-ask once, and if the reply is still not the bare word, use --private and say so in the report. A private repo can be flipped public later; a public push of book-derived content cannot be un-published.
Copyright gate — always apply before creating the repo: chapter files are synthesized summaries, not raw text, but they still derive from the source material. Per the README's Copyright & fair use policy, skills generated from third-party copyrighted books must stay private; offer public only when the source is the user's own writing, openly licensed content, or material the user explicitly confirms they are authorized to redistribute publicly — and state which case applies. Having access to internal company material is not permission to disclose it: skills from internal docs stay private unless the user states they hold publication rights.
If accepted:
README.md inside $SKILLS_HOME/<skill_name>/ (never overwrite an existing file) — the skill title, a one-paragraph description ("Agent skill generated from <Title> by <Author> with book-to-skill"), the install command from step 3 below, the file inventory, and a note that the content is synthesized summaries, not the book text.<skill_name>; let the user override — some prefer a <skill_name>-skill suffix). Nested-repo guard: first check whether the skill folder already sits inside a git repository (git -C "$SKILLS_HOME/<skill_name>" rev-parse --show-toplevel — always the case for project-local roots like .claude/skills/). If it does, do NOT git init in place: the outer repository would record the folder as an embedded repo (gitlink, mode 160000) without .gitmodules, and fresh clones of the outer project would silently omit the skill. Instead, copy the skill folder to a scratch directory, run the commands below from the copy, and tell the user the published repo — not the project-local folder — is the remote's working copy.cd "$SKILLS_HOME/<skill_name>"
git init -b main
git add -A
git commit -m "Add <skill_name> skill"
gh repo create <repo_name> --private --source . --push
# --private is the default; substitute --public ONLY under the visibility rule above
# (the visibility answer WAS the bare word "public" AND the copyright gate allows it)✅ Published: https://github.com/<owner>/<repo_name> (<private|public>)
Install on any Agent Skills host:
npx skills add https://github.com/<owner>/<repo_name> --skill <skill_name>When the nested-repo guard fired and the repo was published from a scratch copy, add one line — that local folder never gains a remote, so the Update/Fold-in push offer will never appear for it:
⚠️ Published from a copy: <skill folder> sits inside another git repository, so it has
no remote of its own. To publish a later update, re-run Step 11, or clone
https://github.com/<owner>/<repo_name> and fold new material into the clone.The root-level SKILL.md layout is exactly what the skills CLI detects, so the repo is installable as-is — no restructuring needed. Outside the nested-repo case the local folder stays the live install for this machine and is the remote's working copy, so later Update/Fold-in runs can commit and push their changes to the same remote.
When performing an Update/Fold-in operation on an existing skill at $SKILLS_HOME/<skill_name>/:
Read and parse the existing skill's files:
$SKILLS_HOME/<skill_name>/SKILL.md to parse the existing Chapter Index, Topic Index, metadata (author, total chapters), and Core Frameworks.$SKILLS_HOME/<skill_name>/chapters/ to find the highest chapter number (e.g. ch12).$SKILLS_HOME/<skill_name>/glossary.md, $SKILLS_HOME/<skill_name>/patterns.md, and $SKILLS_HOME/<skill_name>/cheatsheet.md to see what terms and frameworks are already indexed.Analyze the new extracted text in this run's full_text.txt (the Text -> path from the extraction output) to identify if the new content represents:
chapters/. Start numbering these files after the highest existing chapter number (e.g. if the existing chapters stop at ch12, create ch13-*.md, ch14-*.md, etc.).For each new or revised chapter:
$SKILLS_HOME/<skill_name>/chapters/.$SKILLS_HOME/<skill_name>/glossary.md.**Term** — definition (Ch 4, Ch 13)).$SKILLS_HOME/<skill_name>/glossary.md with the fully merged, alphabetized list.$SKILLS_HOME/<skill_name>/patterns.md.$SKILLS_HOME/<skill_name>/cheatsheet.md.Update the master skill file $SKILLS_HOME/<skill_name>/SKILL.md:
Generated date to the current date.- **Topic** → ch05, ch13).Once the files are successfully written and merged, run Step 9.5, then proceed to Step 10 to perform cleanup and print a custom update report summarizing the newly added chapters, merged glossary terms, and updated indices. If the skill folder is a git repository with a remote (published via Step 11), offer to commit the update and push it.
© virgiliojr94, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 133 other files (scripts) in the repository root of virgiliojr94/book-to-skill.
Open the folder on GitHubat commit e180fc4
Book to Skill Converter next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Book to Skill Converter this skillvirgiliojr94/book-to-skill | 34k | — | ~14k | Automated safety check: Pass | MIT | |
| Skill Developmentletta-ai/skills | 149 | — | ~941 | Automated safety check: Pass | MIT | |
| Wiki CoreIssacW228/student-llm-wiki | 177 | — | ~708 | Automated safety check: Pass | MIT | |
| OutlineVortiago/mcp-outline | 156 | — | ~818 | Automated safety check: Pass | MIT | |
| Local Knowledge Base RetrieverConardLi/rag-skill | 715 | 2 repos | ~1.7k | Automated safety check: Pass | None | |
| Learn From Materialsdmoshehun-prog/learn-from-materials | 947 | — | ~7.9k | Automated safety check: Pass | MIT |
letta-ai/skills
Create and contribute skills to the communal knowledge base.
IssacW228/student-llm-wiki
Core operating rules for the student knowledge wiki. An agent skill from IssacW228/student-llm-wiki.
Vortiago/mcp-outline
Conventions and efficient workflows for Outline knowledge bases via mcp-outline tools.
ConardLi/rag-skill
Answers questions from a local knowledge base folder by walking hierarchical index files and searching with grep, pdfplumber and pandas instead of loading whole files.
dmoshehun-prog/learn-from-materials
Turns books, PDFs, slides and web pages into a source-grounded knowledge base and an interactive learning page in English or Chinese, with quizzes, relationship maps and reusable methodology notes.
inkeep/open-knowledge
A skill your agent uses when the user wants to create, author, write, or design a new Agent Skill (a SKILL.md) — for OpenKnowledge or for their editors — including requests like 'help me write a…
Converts books and documents in PDF, EPUB, DOCX, HTML, Markdown, text, RTF or MOBI form into agent skills built from frameworks, principles, techniques and anti-patterns. The skill extracts structure instead of writing summaries. From a book or document it pulls named frameworks, actionable principles, step-by-step techniques, anti-patterns and the author's voice, keeping the author's exact framework names.
Book to Skill Converter fits situations like: turning a technical book PDF into a skill you can study and reference; applying an author's frameworks while working on a task; building a reusable knowledge base from a document; reviewing an extraction report before any files are generated.
Run `npx skills add virgiliojr94/book-to-skill --skill book-to-skill -a claude-code`. Or copy the skill folder (the virgiliojr94/book-to-skill repository) into .claude/skills/book-to-skill in your project. Claude Code loads it when a task matches its description.
Run `npx skills add virgiliojr94/book-to-skill --skill book-to-skill -a codex`. Or copy the skill folder (the virgiliojr94/book-to-skill repository) into .agents/skills/book-to-skill in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add virgiliojr94/book-to-skill --skill book-to-skill -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/book-to-skill, .gemini/skills/book-to-skill, .github/skills/book-to-skill and .opencode/skills/book-to-skill in your project.
Going by SKILL.md and its folder, Book to Skill Converter needs the command-line tools its instructions call (git, gh, npx, python3, claude and brew). Our summary lists: Calibre, for MOBI and AZW files.
SKILL.md names 1 domain. In commands or code: github.com; the agent is likely to contact it when it follows the instructions. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.
Book to Skill Converter is published under the MIT licence (from the LICENSE file in the skill folder). It allows redistribution, so the full SKILL.md is shown on this page.
About 14k tokens (SKILL.md is roughly 55k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Book to Skill Converter: Skill Development (letta-ai/skills, 149 stars), Wiki Core (IssacW228/student-llm-wiki, 177 stars), Outline (Vortiago/mcp-outline, 156 stars) and Local Knowledge Base Retriever (ConardLi/rag-skill, 715 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
virgiliojr94 (a GitHub user) maintains it in virgiliojr94/book-to-skill, which has 34,360 GitHub stars. The repository was last updated on October 5, 2026.
Source: virgiliojr94/book-to-skill on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.