- 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.
6.0 KiB
sitrep-panel
A live local HTML report you keep updated as you work. It lives at
.sitrep-panel/report/ inside whatever project you're invoked 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 not a hosted 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 — they'll typically ask by name ("start a sitrep-panel", "/sitrep-panel") or describe wanting a "progress report", "status page", or "live doc" for a task.
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 package'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 — this is local scratch, not something to commit. Mention you did this; don't ask first, it's trivially reversible.
If .sitrep-panel/report/ already exists, skip scaffolding — resume it. Use
archive first for unrelated new work if you want a clean slate.
Serving it
Start the bundled server in the background, from this package's own
directory (so the relative path to scripts/serve.py resolves regardless of
the caller's cwd):
python3 <package-dir>/scripts/serve.py <project>/.sitrep-panel/report
Run this via your background-execution mechanism — it blocks forever. It
prints exactly one line, SERVING http://localhost:<port>/, before
blocking; capture that for the URL. It auto-picks a free port (tries 8934
first, falls back to any free port on conflict), so several reports can run
for different projects at once. Stdlib-only Python, no dependencies.
Record the port for reuse: write .sitrep-panel/report/.server.json
({"port": <port>, "started_at": "<iso8601>"}), gitignored along with the
rest of .sitrep-panel/. On a later start/open, 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.
The update protocol — what makes this useful
A sitrep-panel that only gets written once at the start is worthless. Update it at every real step:
- Update "What's happening now" (
#current-work-body) with prose — what you're doing right now and why. Replace the block's content each time; it always reflects the present, not history. - Prepend a new log entry to
#entries(newest-first — insert right after the<div id="entries">opening tag), 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 was decided and why, what was verified. Skip entries for trivial reads; log entries for writes, decisions, and verification. - Save screenshots into
.sitrep-panel/report/screenshots/and reference them with a relative<img src="screenshots/whatever.png">— inline in a log entry, appended to#shots-body, or both. - 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. This is the one step you must never skip.
Tracker-synced board (optional)
If the project has a working issue-tracker connection available right now and there are real tickets relevant to this task, render the board from that real data — real key, real title, real link, real status. Refresh it each time you update the doc.
If no tracker is connected, or nothing relevant is filed there, fall back to a plain manually-maintained checklist kept in sync by hand. Never fabricate ticket data, 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) — the URL stays stable across a whole session. Usearchiveto start clean. - Genuinely static HTML plus polling JS — no build step, no external requests, works fully offline once loaded.
- If the user wants something shareable with people not at their machine, that's a hosted artifact, not this — this is specifically for local/private, zero-publish visibility.