mirror of
https://github.com/luongnv89/claude-howto.git
synced 2026-08-08 00:08:36 +02:00
* fix(ci): move the EPUB build out of pre-commit into CI The build-epub hooks called scripts/build_epub.py, which raises when the mmdc binary is missing, while check_mermaid.py skips with a warning in the same situation. On arm64 — where @mermaid-js/mermaid-cli has no working build — that made 'pre-commit run --all-files' impossible to satisfy for a docs-only change without --no-verify. Remove the build-epub, vietnamese-build-epub and japanese-build-epub hooks and widen the CI build-epub job to a language matrix so PR-time coverage is not reduced: it previously built en only, and now builds en, vi, zh and ja. zh was covered by neither the hooks nor this job, so a broken zh diagram could only surface at release time. Closes #156 * docs: replace the stale Kroki narrative with local mmdc rendering Commite76bbe4swapped the Kroki HTTP dependency for local mmdc rendering but left the docs describing the old design. The claim appeared in seven live files, not the two originally reported: CLAUDE.md, scripts/README.md and their ja/uk/vi copies. Also corrects what the same staleness dragged along: - scripts/README.md documented --timeout and --max-concurrent, which no longer exist, and omitted --mmdc-path, --lang and --puppeteer-config - 'Async concurrent fetching' described a render_all() that is now a plain sequential loop with a dedupe cache - the network-error/rate-limiting troubleshooting entries are replaced with the failures that actually occur now (missing mmdc, Chromium sandbox) CHANGELOG entries recording the Kroki-to-mmdc switch are left alone; they describe the past accurately. Closes #157 * fix(scripts): make the ruff config match files that exist Ruff resolves include/per-file-ignores patterns relative to the directory holding pyproject.toml. Since the config lives in scripts/, the pattern "scripts/**/*.py" meant scripts/scripts/**/*.py, which matches nothing — 'ruff check scripts/' printed 'warning: No Python files found under the given path(s)' and then 'All checks passed!'. per-file-ignores had the same mistake. Both are now relative to scripts/, so ruff sees all 14 files. This silently disabled the pre-commit ruff hooks too, not just the documented command, and two test files had drifted out of format as a result. Reformatting them exposed a second problem: the pre-commit hook pinned ruff v0.8.2 while the CI lint job installs unpinned latest and this venv has 0.15.10. The versions disagree on formatting, so each reverted the other's output, and CI would have started failing on a file the local hook kept rewriting. Bump the hook pin and the requirements-dev floor to 0.15.10 so all three agree. Verified: 'pre-commit run --all-files' is stable across consecutive runs, 'ruff format --check scripts/' and 'ruff check scripts/' both pass, 92 tests pass. Closes #160 * docs: point localized module links at their own trees Files at the root of a language directory used ../NN-module/, which from uk/CATALOG.md resolves to the English 05-mcp/ at the repo root rather than uk/05-mcp/. Readers following a count stated about the localized tree landed in the English one. The link checker never caught it because the English target does exist. Files one level deeper (uk/04-subagents/README.md and friends) were already correct — ../06-hooks/ from there resolves to uk/06-hooks/ — so this is scoped to the 7 depth-1 files that actually escape: CATALOG.md in uk, vi, ja and zh, LEARNING-ROADMAP.md in uk and vi, and ja/claude_concepts_guide.md. 119 links in total. The ../NN- occurrences left in STYLE_GUIDE.md and TRANSLATION_NOTES.md are inside fenced examples showing what a module page should contain, where the ../ form is the correct convention. All 119 rewritten targets were verified to exist. Closes #158 * docs(hooks): stop conflating hook types with hook event categories '**Hook Types** (5 types, 31 events)' sat above four bullets, so the count read as wrong. It was not — the two numbers describe different axes that had been merged into one label. 06-hooks/README.md:126 documents five hook *types*: command, http, prompt, mcp_tool and agent. Those describe how a hook runs. The four bullets are event *categories* — Tool, Session, Task, Lifecycle — holding 31 events (6+7+6+12), and describe when it runs. Split the label so each number belongs to the axis it counts, in all nine affected files: README.md and INDEX.md plus the ja, uk, vi and zh copies. QUICK_REFERENCE.md and LEARNING-ROADMAP.md already stated '5 types' with the handler names attached and needed no change. Closes #159 * chore(scripts): drop the unused httpx dependency httpx was the HTTP client for Kroki rendering. Nothing has imported it sincee76bbe4moved diagram rendering to a local mmdc subprocess — check_links.py, the only other network caller, uses stdlib urllib.request. The PEP 723 blocks in build_epub.py and build_website.py had already dropped it; only the manifests and docs still declared it. Removes it from requirements.txt, pyproject.toml dependencies, the dependency tables and uv --with lines in scripts/README.md and its ja/uk copies, and the .cspell.json word list. Also drops the B113 bandit suppression, which existed solely for an httpx timeout false positive — bandit reports no issues without it. Also corrects two Requirements lines missed in the previous pass: the ja and uk script READMEs still listed an internet connection rather than mmdc. Note: tenacity is now dead for the same reason and is left in place. * chore(scripts): drop the unused tenacity dependency Nothing imports tenacity — the retry logic it was added for went away with the Kroki HTTP fetching ine76bbe4. It was still declared in requirements.txt, pyproject.toml, both `uv run --with` lines and all three dependency tables. * docs(i18n): sync the localized pre-commit check lists The ja/uk/vi CLAUDE.md files still listed build-epub as pre-commit check #5, stale since 6da8184 moved the EPUB build to CI. They also omitted markdown-rendering, and the ja/uk stated counts disagreed with their own lists. Now matches the English CLAUDE.md. * fix(scripts): silence PLR0917 now stable in ruff 0.16 CI installs the latest ruff (uv pip install ruff, unpinned), and 0.16.1 promoted too-many-positional-arguments from preview to stable, hard-failing the Code Quality check on build_epub.py's long-signature draw/helper functions. These sit in the same family as PLR0913, which is already ignored. Add PLR0917 so the local 0.15.10 pin and unpinned CI lint agree again.
214 lines
7.1 KiB
Markdown
214 lines
7.1 KiB
Markdown
<picture>
|
|
<source media="(prefers-color-scheme: dark)" srcset="../resources/logos/claude-howto-logo-dark.svg">
|
|
<img alt="Claude How To" src="../resources/logos/claude-howto-logo.svg">
|
|
</picture>
|
|
|
|
# Build Scripts
|
|
|
|
This directory contains two generators that turn the tutorial markdown files
|
|
into distributable formats:
|
|
|
|
- [**EPUB Builder**](#epub-builder-script) — `build_epub.py`
|
|
- [**Static Website Builder**](#static-website-builder) — `build_website.py`
|
|
|
|
Both treat the `.md` files as the single source of truth — re-run the relevant
|
|
script after editing markdown to regenerate the output.
|
|
|
|
---
|
|
|
|
# EPUB Builder Script
|
|
|
|
Build an EPUB ebook from the Claude How-To markdown files.
|
|
|
|
## Features
|
|
|
|
- Organizes chapters by folder structure (01-slash-commands, 02-memory, etc.)
|
|
- Renders Mermaid diagrams as PNG images via the local `mmdc` CLI (no network required)
|
|
- Caches identical diagrams so each unique diagram is rendered only once
|
|
- Generates a cover image from the project logo
|
|
- Converts internal markdown links to EPUB chapter references
|
|
- Strict error mode - fails if any diagram cannot be rendered
|
|
|
|
## Requirements
|
|
|
|
- Python 3.10+
|
|
- [uv](https://github.com/astral-sh/uv)
|
|
- [`mmdc`](https://github.com/mermaid-js/mermaid-cli) on `PATH` for Mermaid diagram rendering (`npm install -g @mermaid-js/mermaid-cli`)
|
|
|
|
## Quick Start
|
|
|
|
```bash
|
|
# Simplest way - uv handles everything
|
|
uv run scripts/build_epub.py
|
|
```
|
|
|
|
## Development Setup
|
|
|
|
```bash
|
|
# Create virtual environment
|
|
uv venv
|
|
|
|
# Activate and install dependencies
|
|
source .venv/bin/activate
|
|
uv pip install -r requirements-dev.txt
|
|
|
|
# Run tests
|
|
pytest scripts/tests/ -v
|
|
|
|
# Run the script
|
|
python scripts/build_epub.py
|
|
```
|
|
|
|
## Command-Line Options
|
|
|
|
```
|
|
usage: build_epub.py [-h] [--root ROOT] [--output OUTPUT] [--verbose]
|
|
[--mmdc-path MMDC_PATH] [--lang {en,vi,zh,ja}]
|
|
[--puppeteer-config PUPPETEER_CONFIG]
|
|
|
|
options:
|
|
-h, --help show this help message and exit
|
|
--root, -r ROOT Root directory (default: repo root)
|
|
--output, -o OUTPUT Output path (default: claude-howto-guide.epub)
|
|
--verbose, -v Enable verbose logging
|
|
--mmdc-path PATH Path to mmdc binary (default: mmdc from PATH)
|
|
--lang {en,vi,zh,ja} Language to build (default: en)
|
|
--puppeteer-config P Puppeteer config JSON passed to mmdc via -p
|
|
```
|
|
|
|
## Examples
|
|
|
|
```bash
|
|
# Build with verbose output
|
|
uv run scripts/build_epub.py --verbose
|
|
|
|
# Custom output location
|
|
uv run scripts/build_epub.py --output ~/Desktop/claude-guide.epub
|
|
|
|
# Build a translated edition
|
|
uv run scripts/build_epub.py --lang vi
|
|
|
|
# Point at an mmdc that is not on PATH
|
|
uv run scripts/build_epub.py --mmdc-path ./node_modules/.bin/mmdc
|
|
```
|
|
|
|
## Output
|
|
|
|
Creates `claude-howto-guide.epub` in the repository root directory.
|
|
|
|
The EPUB includes:
|
|
- Cover image with project logo
|
|
- Table of contents with nested sections
|
|
- All markdown content converted to EPUB-compatible HTML
|
|
- Mermaid diagrams rendered as PNG images
|
|
|
|
## Running Tests
|
|
|
|
```bash
|
|
# With virtual environment
|
|
source .venv/bin/activate
|
|
pytest scripts/tests/ -v
|
|
|
|
# Or with uv directly
|
|
uv run --with pytest --with pytest-asyncio \
|
|
--with ebooklib --with markdown --with beautifulsoup4 \
|
|
--with pillow \
|
|
pytest scripts/tests/ -v
|
|
```
|
|
|
|
## Dependencies
|
|
|
|
Managed via PEP 723 inline script metadata:
|
|
|
|
| Package | Purpose |
|
|
|---------|---------|
|
|
| `ebooklib` | EPUB generation |
|
|
| `markdown` | Markdown to HTML conversion |
|
|
| `beautifulsoup4` | HTML parsing |
|
|
| `pillow` | Cover image generation |
|
|
|
|
## Troubleshooting
|
|
|
|
**Build fails with `mmdc not found`**: Install the Mermaid CLI (`npm install -g @mermaid-js/mermaid-cli`), or pass `--mmdc-path` if the binary is not on `PATH`. There is no working arm64 build of the bundled Chromium, so on arm64 machines build the EPUB in CI instead — the `build-epub` job in `.github/workflows/test.yml` covers every language.
|
|
|
|
**`mmdc` fails in CI or a container**: Chromium needs a sandbox-free profile. Write `{"args":["--no-sandbox","--disable-setuid-sandbox"]}` to a file and pass it via `--puppeteer-config`.
|
|
|
|
**Missing logo**: The script generates a text-only cover if `claude-howto-logo.png` is not found.
|
|
|
|
---
|
|
|
|
# Static Website Builder
|
|
|
|
Generate an elegant, mobile-friendly static website from the same markdown
|
|
files used by the EPUB build. The website is the rendered view; the `.md`
|
|
files remain the single source of truth.
|
|
|
|
## Features
|
|
|
|
- One HTML page per markdown source — internal `.md` links are rewritten to
|
|
the corresponding pages on the site
|
|
- References to non-markdown repo files (templates, scripts, JSON) become
|
|
GitHub blob URLs that open the source on github.com
|
|
- Mermaid diagrams render client-side via `mermaid.min.js`, served from the
|
|
built site (no CDN at runtime)
|
|
- Tailwind CSS compiled with the standalone CLI (Go binary, no Node.js) and
|
|
served from the built site — responsive layout with sidebar nav, in-page
|
|
TOC, dark mode toggle, and prev/next page navigation
|
|
- Inter + JetBrains Mono fonts are self-hosted alongside the CSS — no
|
|
third-party requests at page load
|
|
- Mirrors the EPUB curriculum order (`01-` … `10-` plus top-level docs)
|
|
- Hostable as plain static files — designed to deploy to GitHub Pages
|
|
|
|
## Quick Start
|
|
|
|
```bash
|
|
# Build the English website into ./site/
|
|
uv run scripts/build_website.py
|
|
|
|
# Preview locally
|
|
python -m http.server --directory site 8080
|
|
# then open http://localhost:8080
|
|
```
|
|
|
|
## Command-Line Options
|
|
|
|
```
|
|
usage: build_website.py [-h] [--root ROOT] [--output OUTPUT]
|
|
[--lang {en,vi,zh,ja,uk}] [--repo-url REPO_URL]
|
|
[--branch BRANCH] [--verbose]
|
|
|
|
options:
|
|
--root, -r ROOT Source root (default: repo root)
|
|
--output, -o OUTPUT Output directory (default: <repo>/site)
|
|
--lang LANG Language to build: en | vi | zh | ja | uk
|
|
--repo-url URL GitHub repo for blob links (default: luongnv89/claude-howto)
|
|
--branch BRANCH Branch for blob links (default: main)
|
|
--verbose, -v Enable verbose logging
|
|
```
|
|
|
|
## GitHub Pages Deploy
|
|
|
|
The repo ships a workflow at `.github/workflows/pages.yml` that builds the
|
|
site on every push to `main` (when any `.md` or generator file changes) and
|
|
publishes via `actions/deploy-pages`. Enable GitHub Pages in repo settings
|
|
with **Source: GitHub Actions** to activate it.
|
|
|
|
## Architecture
|
|
|
|
`build_website.py` reuses the chapter-ordering logic from `build_epub.py` and
|
|
ships HTML templates under `scripts/website_templates/`:
|
|
|
|
- `page.html.j2` — per-page Jinja2 template with sidebar nav, TOC, prev/next
|
|
- `tailwind.config.js`, `tailwind.input.css` — config + entry CSS for the
|
|
Tailwind standalone CLI; the CLI scans the built HTML and produces
|
|
`site/assets/tailwind.css` with just the utilities actually used
|
|
- `site.css` — small layer of site-specific styles plus Pygments theme
|
|
|
|
The Tailwind CLI binary, Mermaid bundle, and font files are downloaded on
|
|
first build into `scripts/.vendor-cache/` (gitignored) — see
|
|
`scripts/vendor_assets.py`.
|
|
|
|
Heading anchors are generated using the exact algorithm in
|
|
`check_cross_references.heading_to_anchor`, so `#anchor` links validated by
|
|
the pre-commit hook resolve correctly on the rendered site.
|