--- name: repo-change-html-report description: "Build a self-contained HTML report of a branch's changes (per-file detail grouped by atomic change, inline SVG diagrams) and open it in the user's browser" --- # Repo change → HTML report in browser Produce a standalone HTML report covering `git log main..HEAD`, grouped into atomic tasks (one task may span commits; one commit may serve several tasks), per-file `what`/`why` tables, inline SVG diagrams, then `xdg-open file://…`. ## 1. Gather facts first (never from memory) ``` git log --reverse --format="COMMIT %h %s" main..HEAD for c in $(git log --reverse --format=%h main..HEAD); do echo "== $c $(git log -1 --format=%s $c)"; git show --format="" --stat=200 "$c"; done ``` `--stat=short` is invalid; use `--stat=200`. Supplement with the session's per-file notes. ## 2. Write to a file OUTSIDE the repo `~/reports/-.html` — keeps the worktree clean. ## 3. Chunk the writes (payload limits are real) - First chunk: `write` (head + CSS + hero cards + nav). - Later chunks: `edit` with `PUT >$` (append), ~6–8 KB each. A single giant `write` gets truncated mid-arguments. - **No appended body line may begin with `-`** (e.g. a wrapped `--host H`); the edit parser rejects it as a deletion row. Keep flag-like tokens inline. - Never end a PUT mid-sentence; if a sentence spills, include ALL its lines in the same PUT, then verify the seam region reads cleanly. ## 4. Structure that worked (7-task, 13-commit branch) - Stat cards (commits, tasks, tests green, key counts) + sticky anchor nav. - Commit-arc SVG (dots on a timeline, colored by task; dashed edge for a task spanning two commits). - One section per atomic task: `why` callout → SVG before/after diagram → per-commit `File | What | Why` tables. - Footer: deploy-day notes, trash/retirement pending approvals. - CSS: only theme vars (`--fg --muted --surface --border --accent --success --error --c1..--c6`) with a `prefers-color-scheme: dark` block; SVGs style via `currentColor`/vars; no external assets, no scripts. ## 5. Validate before opening Python `html.parser` pass: tag stack empty, zero mismatches (treat `path rect circle line marker` + void HTML tags as self-closing); assert every nav anchor id exists; print table/figure counts. Then: ``` xdg-open "file:///home/blank/reports/.html" ``` `xdg-open` may block in foreground — background it, don't poll.