- Theme is now a manual toggle (real sun/moon SVG icons, not glyphs that don't render consistently), persisted to localStorage, defaults to light on first visit. No more silent OS-based auto-switching. - Small wordmark + mark in a thin top bar so the page is recognizable as sitrep-panel, not just the task title. - Status board rewritten as four kanban-style columns (to do / in progress / done / blocked) with live counts, instead of a loose wrap of identically-styled cards. - Every section gets a one-line description of its purpose. - Sticky section nav with scroll-spy highlighting — real wayfinding without hiding any content behind a click, since the whole point is to be glanceable. - Log entries use a proper timeline rail (dot + connecting line) instead of a colored border-left accent. - Palette rebuilt in OKLCH with neutrals tinted toward the accent hue. Updates the SKILL.md/AGENTS.md protocol and validator for the new column-based board markup and entry structure.
7.2 KiB
name, description, license, metadata
| name | description | license | metadata | ||
|---|---|---|---|---|---|
| sitrep-panel | Keep a live local HTML report updated as you work on a task — a status board, a running "what's happening now" narrative, screenshots, and a newest-first log — served on localhost so the user can watch progress in a browser tab instead of reading the transcript. Use when the user invokes /sitrep-panel, asks for a "progress report", "status page", "live doc", or wants visibility into a multi-step task as it happens. | MIT |
|
sitrep-panel
A live local HTML report you keep updated as you work. It lives at
.sitrep-panel/report/ inside whatever project you invoke it from, served
on localhost, and it live-reloads in the browser every time you update it —
the user never has to hit refresh.
This is explicitly not a Claude Artifact. It never leaves the user's machine, needs no publish step, and works offline. Use it whenever the user wants to watch a task happen rather than read about it after the fact.
Invocation
/sitrep-panel [start | open | stop | archive] — default (no argument) is
start.
start(default) — scaffold a new report if none is active, or resume the active one. Always ends by printing the localhost URL prominently.open— just print the URL of the active report (start the server if it isn't running); never touches content.archive— move the current active report to.sitrep-panel/archive/<timestamp>-<slug>/and scaffold a fresh one. Use this when starting genuinely new, unrelated work rather than continuing the current task.stop— kill the background server. Content on disk is untouched;startoropenlater brings it back.
First run — scaffold
If .sitrep-panel/report/ doesn't exist yet in the current project:
- Create
.sitrep-panel/report/screenshots/. - Copy
assets/template.html(from this skill's own directory) to.sitrep-panel/report/index.html. Replace{{TITLE}}with a short name for the task, and{{SUBTITLE}}with one line of context (what this report is tracking, and when it started). - Write
.sitrep-panel/report/meta.json:{"updated_at": "<current ISO-8601 UTC timestamp>"} - If the project is a git repo and
.sitrep-panel/is not already covered by.gitignore, append it (echo '.sitrep-panel/' >> .gitignore) — this is local scratch, not something to commit. Mention you did this; don't ask first, it's trivially reversible. If the user tells you they want report history committed instead, skip this step and say so.
If .sitrep-panel/report/ already exists, skip scaffolding — resume it.
Use archive first if this is unrelated new work and you want a clean slate.
Serving it
Start the bundled server in the background, from this skill's own directory
(so the relative path to scripts/serve.py resolves regardless of the
user's cwd):
python3 <this-skill-dir>/scripts/serve.py <project>/.sitrep-panel/report
Run this with your background-execution mechanism (e.g. the Bash tool's
run_in_background: true) — it blocks forever. It prints exactly one line,
SERVING http://localhost:<port>/, before blocking; capture that line for
the URL. It auto-picks a free port (tries 8934 first, falls back to any free
port on conflict), so it's safe to have several reports running for
different projects at once.
Record the port for reuse: write .sitrep-panel/report/.server.json
({"port": <port>, "started_at": "<iso8601>"}) right after start, gitignored
along with the rest of .sitrep-panel/. On a later start/open in the
same or a resumed session, read this file first — if a GET to
http://localhost:<port>/meta.json succeeds, the server is already up,
reuse that URL instead of spawning a second one.
Always tell the user the URL after start or open, even if you just
reused an existing server. This is the whole point of the skill — don't
bury it in a paragraph.
The update protocol — what makes this useful
This is the part that matters. A sitrep-panel that only gets written once at the start is worthless. Update it at every real step, not just at the end:
- Update "What's happening now" (
#current-work-body) with prose — what you're doing right now and why, not just a status word. Replace the whole block's content each time; this section always reflects the present, not history. - Prepend a new log entry to
#entries(newest-first — insert right after the<div id="entries">opening tag, before whatever was already there), using the exact.entry/.entry-rail/.entry-dotmarkup shown in the template's commented example — the timeline rail depends on that structure. One entry per real step: what happened, what you decided and why, what you verified. Skip entries for trivial reads; log entries for writes, decisions, and verification results. - Save screenshots into
.sitrep-panel/report/screenshots/and reference them with a relative<img src="screenshots/whatever.png">— either inline in a log entry, or appended to#shots-body(or both, when a screenshot is the standout evidence for a step). - Update the board — the board is four columns, each with its own
container:
#board-todo,#board-progress,#board-done,#board-blocked. Add/move/remove a plain<div class="board-card">…</div>in the container matching its current status as steps start, block, or finish — moving a card means removing it from one column's container and appending it to another's, not changing a class. See the commented example markup in the template. - Touch
meta.jsonlast, always. Rewriteupdated_atto the current ISO-8601 UTC timestamp as the final write of every update — the page polls this file every 2s and reloads on change, so writing it before the content write would show a stale reload. This is the one step you must never skip.
Tracker-synced board (optional)
If the project has a working issue tracker connection available to you right
now (an already-connected Atlassian/Jira MCP, gh issue list for a GitHub
repo, a connected Linear MCP, etc.) and there are real tickets relevant
to this task, render the board from that real data — real ticket key, real
title, real link, real status mapped to the matching column. Refresh it
each time you update the doc, the same as everything else.
If no tracker is connected, or nothing relevant is filed there, fall back to a plain manually-maintained checklist — steps you define yourself, kept in sync by hand. Never fabricate ticket data to fill the board, and don't silently guess which tracker to use — if more than one is plausible, ask.
Notes
- One active report per project at a time by design (
.sitrep-panel/report/is a fixed path) — this keeps the URL stable across a whole session instead of minting a new one per task. Usearchiveto start clean. - The report is genuinely static HTML plus polling JS — no build step, no external requests, works with the browser fully offline once loaded.
- If the user asks for a report shareable with people who aren't at their machine, that's a Claude Artifact, not this — tell them so; this skill is specifically for local/private, zero-publish visibility.