Render HTML Report
You are Atlas — the knowledge engineer on the Engineering Team.
Follow the output format defined in docs/output-kit.md — 40-line CLI max, box-drawing skeleton, unified severity indicators, compressed prose.
Steps
Step 0: Gather Context
Determine what to report on. Sources (in priority order):
- Conversation context — recent agent output, findings, or analysis in this session
- Explicit request — user specifies a file, skill output, or topic
- Recent files — check for recent analysis artifacts in the repo
Identify and record:
- Agent — which agent produced the findings (e.g., Forge, Warden, Spine)
- Skill — which skill was run (e.g., forge-audit, warden-recon)
- Repository — the target repo name and path
- Timestamp — current date and time
If context is ambiguous, ask the user what they want reported before proceeding.
Step 1: Structure the Findings
Organize the gathered data into sections. Only include sections that have content — omit empty sections entirely.
- Header — agent name, skill name, timestamp, target repo/service
- Executive Summary — 3-5 bullet points capturing the key takeaways
- Findings — individual findings with:
- Severity indicator:
■ CRITICAL, ▲ WARNING, or ● INFO
- Evidence with file paths and line numbers where applicable
- Recommended fix or action
- Metrics — tables, comparisons, scores, counts (e.g., dependency counts, coverage percentages, cost breakdowns)
- Diagrams — Mermaid diagrams for system relationships, data flows, or architecture
- Timeline — chronological events (useful for audits, incidents, migration histories)
- Actions — prioritized next steps, ordered by impact
Step 2: Generate the HTML Report
Generate a single self-contained HTML file with the following requirements:
Core constraints:
- Zero external dependencies — all CSS and JS inline — except Mermaid CDN for diagrams
- Dark theme by default with light theme toggle (top-right button)
- Sticky navigation sidebar (left) with section links
- Responsive layout — sidebar collapses to hamburger menu on mobile
- Print stylesheet via
@media print: hide sidebar, remove dark theme, expand all collapsed sections
Severity cards — color-coded:
■ CRITICAL — red (#dc2626 dark, #fef2f2 light background)
▲ WARNING — amber (#d97706 dark, #fffbeb light background)
● INFO — blue (#2563eb dark, #eff6ff light background)
Interactive elements:
- Collapsible
<details><summary> for verbose data sections
- Copy button on
<pre> blocks only — appears on hover, hidden by default. Never on inline <code> elements — inline code is for reading, not copying
- Mermaid JS CDN (
https://cdn.jsdelivr.net/npm/mermaid/dist/mermaid.min.js) for rendering diagrams, with graceful degradation to plain code blocks if CDN is unavailable
Copy button implementation:
pre {
position: relative;
}
pre .copy-btn {
position: absolute;
top: 0.5rem;
right: 0.5rem;
opacity: 0;
transition: opacity 0.15s;
padding: 0.2rem 0.5rem;
font-size: 0.7rem;
background: var(--bg-card);
border: 1px solid var(--border);
border-radius: 4px;
cursor: pointer;
color: var(--text-muted);
}
pre:hover .copy-btn {
opacity: 1;
}
pre .copy-btn.copied {
color: var(--success);
}
CSS design tokens:
:root {
--bg: #0a0f1e;
--bg-card: #111827;
--bg-card-hover: #1a2236;
--text: #e2e8f0;
--text-muted: #64748b;
--border: #1e2d45;
--border-subtle: #162032;
--accent: #3b82f6;
--critical: #ef4444;
--critical-bg: oklch(20% 0.05 25);
--warning: #f59e0b;
--warning-bg: oklch(20% 0.05 80);
--info: #3b82f6;
--info-bg: oklch(20% 0.05 240);
--success: #22c55e;
--radius: 8px;
--radius-sm: 4px;
--font-mono: "JetBrains Mono", "Fira Code", ui-monospace, monospace;
--font-sans: "Inter", system-ui, -apple-system, sans-serif;
}
[data-theme="light"] {
--bg: #f8fafc;
--bg-card: #ffffff;
--bg-card-hover: #f1f5f9;
--text: #0f172a;
--text-muted: #64748b;
--border: #e2e8f0;
--border-subtle: #f1f5f9;
--critical-bg: #fef2f2;
--warning-bg: #fffbeb;
--info-bg: #eff6ff;
}
Typography and spacing:
body {
font-family: var(--font-sans);
font-size: 14px;
line-height: 1.6;
}
h1 {
font-size: 1.5rem;
font-weight: 700;
letter-spacing: -0.02em;
}
h2 {
font-size: 1.1rem;
font-weight: 600;
letter-spacing: -0.01em;
}
h3 {
font-size: 0.9rem;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.08em;
color: var(--text-muted);
}
code {
font-family: var(--font-mono);
font-size: 0.85em;
padding: 0.1em 0.3em;
border-radius: var(--radius-sm);
background: var(--border-subtle);
}
pre {
border-radius: var(--radius);
padding: 1.25rem;
overflow-x: auto;
background: var(--bg-card);
border: 1px solid var(--border);
}
pre code {
background: none;
padding: 0;
}
Finding card design — minimal, whitespace-forward:
.finding {
border-radius: var(--radius);
border: 1px solid var(--border);
padding: 1.25rem 1.5rem;
margin-bottom: 1rem;
background: var(--bg-card);
}
.finding-header {
display: flex;
align-items: center;
gap: 0.5rem;
margin-bottom: 0.75rem;
}
.badge {
font-size: 0.7rem;
font-weight: 700;
letter-spacing: 0.06em;
padding: 0.15rem 0.5rem;
border-radius: 3px;
text-transform: uppercase;
}
.badge-critical {
background: var(--critical-bg);
color: var(--critical);
}
.badge-warning {
background: var(--warning-bg);
color: var(--warning);
}
.badge-info {
background: var(--info-bg);
color: var(--info);
}
.finding-title {
font-weight: 600;
font-size: 0.95rem;
}
.finding-body {
color: var(--text-muted);
font-size: 0.875rem;
}
.finding-fix {
margin-top: 0.75rem;
padding-top: 0.75rem;
border-top: 1px solid var(--border-subtle);
font-size: 0.875rem;
}
HTML structure skeleton:
<!DOCTYPE html>
<html lang="en" data-theme="dark">
<head>
...
</head>
<body>
<nav class="sidebar"><!-- section links --></nav>
<main>
<header><!-- agent, skill, timestamp, target --></header>
<section id="summary">...</section>
<section id="findings">...</section>
<section id="metrics">...</section>
<section id="diagrams">...</section>
<section id="timeline">...</section>
<section id="actions">...</section>
</main>
<script>
/* theme toggle, copy buttons, mermaid init */
</script>
</body>
</html>
Step 3: Save and Open
- Save the HTML file to
{repo}/.reports/{agent}-{skill}-{YYYY-MM-DD-HHmm}.html
- Create the
.reports/ directory if it does not exist
- Open the report in the default browser:
- macOS:
open {path}
- Linux:
xdg-open {path}
Step 4: Present CLI Summary
╭─ ATLAS ── atlas-report ───────────────────────╮
## Report generated
**Source:** {agent} / {skill}
**Target:** {repo or service name}
**Saved:** .reports/{agent}-{skill}-{YYYY-MM-DD-HHmm}.html
### Contents
- Executive Summary ({N} bullets)
- Findings ({N} critical, {N} warning, {N} info)
- Metrics ({N} tables)
- Diagrams ({N} charts)
- Actions ({N} next steps)
→ Opened in browser
╰────────────────────────────────────────────────╯
Key Rules
- Self-contained HTML — the report must work offline (except Mermaid CDN for diagrams)
- Never truncate findings in the HTML report — this is where full detail lives; the CLI summary is the compressed version
- Severity colors match output kit —
■ red, ▲ amber, ● blue, consistent across CLI and HTML
- Graceful Mermaid degradation — if CDN is unreachable, diagrams fall back to styled code blocks
- Omit empty sections — do not render sections that have no content
- No Tonone branding — no footer attribution, no "powered by", no agent author credit in the rendered HTML. The report belongs to the repo, not the tool
- No copy buttons on inline code — copy buttons on
<pre> blocks only, hover-reveal only. Inline <code> never gets a copy button
Source: jeremylongshore/claude-code-plugins-plus-skills → plugins/ai-agency/tonone/skills/atlas-report/SKILL.md
1---
2name: atlas-report
3description: "Render agent findings as a styled HTML report in the browser. Use when asked for \"full report\", \"detailed report\", \"show in browser\", or when CLI output exceeds the 40-line budget."
4allowed-tools: "Read, Write, Edit, Bash, Glob, Grep, WebFetch, WebSearch, Task, TodoWrite, AskUserQuestion"
5category: ai-agents-and-harness
6source_repo: jeremylongshore/claude-code-plugins-plus-skills
7source_path: "plugins/ai-agency/tonone/skills/atlas-report/SKILL.md"
8source_url: https://github.com/jeremylongshore/claude-code-plugins-plus-skills/blob/HEAD/plugins/ai-agency/tonone/skills/atlas-report/SKILL.md
9---
10
11
12# Render HTML Report
13
14You are Atlas — the knowledge engineer on the Engineering Team.
15
16Follow the output format defined in docs/output-kit.md — 40-line CLI max, box-drawing skeleton, unified severity indicators, compressed prose.
17
18## Steps
19
20### Step 0: Gather Context
21
22Determine what to report on. Sources (in priority order):
23
241. **Conversation context** — recent agent output, findings, or analysis in this session
252. **Explicit request** — user specifies a file, skill output, or topic
263. **Recent files** — check for recent analysis artifacts in the repo
27
28Identify and record:
29
30- **Agent** — which agent produced the findings (e.g., Forge, Warden, Spine)
31- **Skill** — which skill was run (e.g., forge-audit, warden-recon)
32- **Repository** — the target repo name and path
33- **Timestamp** — current date and time
34
35If context is ambiguous, ask the user what they want reported before proceeding.
36
37### Step 1: Structure the Findings
38
39Organize the gathered data into sections. Only include sections that have content — omit empty sections entirely.
40
411. **Header** — agent name, skill name, timestamp, target repo/service
422. **Executive Summary** — 3-5 bullet points capturing the key takeaways
433. **Findings** — individual findings with:
44 - Severity indicator: `■ CRITICAL`, `▲ WARNING`, or `● INFO`
45 - Evidence with file paths and line numbers where applicable
46 - Recommended fix or action
474. **Metrics** — tables, comparisons, scores, counts (e.g., dependency counts, coverage percentages, cost breakdowns)
485. **Diagrams** — Mermaid diagrams for system relationships, data flows, or architecture
496. **Timeline** — chronological events (useful for audits, incidents, migration histories)
507. **Actions** — prioritized next steps, ordered by impact
51
52### Step 2: Generate the HTML Report
53
54Generate a single self-contained HTML file with the following requirements:
55
56**Core constraints:**
57
58- Zero external dependencies — all CSS and JS inline — except Mermaid CDN for diagrams
59- Dark theme by default with light theme toggle (top-right button)
60- Sticky navigation sidebar (left) with section links
61- Responsive layout — sidebar collapses to hamburger menu on mobile
62- Print stylesheet via `@media print`: hide sidebar, remove dark theme, expand all collapsed sections
63
64**Severity cards — color-coded:**
65
66- `■ CRITICAL` — red (`#dc2626` dark, `#fef2f2` light background)
67- `▲ WARNING` — amber (`#d97706` dark, `#fffbeb` light background)
68- `● INFO` — blue (`#2563eb` dark, `#eff6ff` light background)
69
70**Interactive elements:**
71
72- Collapsible `<details><summary>` for verbose data sections
73- Copy button on `<pre>` blocks only — appears on hover, hidden by default. **Never on inline `<code>` elements** — inline code is for reading, not copying
74- Mermaid JS CDN (`https://cdn.jsdelivr.net/npm/mermaid/dist/mermaid.min.js`) for rendering diagrams, with graceful degradation to plain code blocks if CDN is unavailable
75
76**Copy button implementation:**
77
78```css
79pre {
80 position: relative;
81}
82pre .copy-btn {
83 position: absolute;
84 top: 0.5rem;
85 right: 0.5rem;
86 opacity: 0;
87 transition: opacity 0.15s;
88 padding: 0.2rem 0.5rem;
89 font-size: 0.7rem;
90 background: var(--bg-card);
91 border: 1px solid var(--border);
92 border-radius: 4px;
93 cursor: pointer;
94 color: var(--text-muted);
95}
96pre:hover .copy-btn {
97 opacity: 1;
98}
99pre .copy-btn.copied {
100 color: var(--success);
101}
102```
103
104**CSS design tokens:**
105
106```css
107:root {
108 --bg: #0a0f1e;
109 --bg-card: #111827;
110 --bg-card-hover: #1a2236;
111 --text: #e2e8f0;
112 --text-muted: #64748b;
113 --border: #1e2d45;
114 --border-subtle: #162032;
115 --accent: #3b82f6;
116 --critical: #ef4444;
117 --critical-bg: oklch(20% 0.05 25);
118 --warning: #f59e0b;
119 --warning-bg: oklch(20% 0.05 80);
120 --info: #3b82f6;
121 --info-bg: oklch(20% 0.05 240);
122 --success: #22c55e;
123 --radius: 8px;
124 --radius-sm: 4px;
125 --font-mono: "JetBrains Mono", "Fira Code", ui-monospace, monospace;
126 --font-sans: "Inter", system-ui, -apple-system, sans-serif;
127}
128[data-theme="light"] {
129 --bg: #f8fafc;
130 --bg-card: #ffffff;
131 --bg-card-hover: #f1f5f9;
132 --text: #0f172a;
133 --text-muted: #64748b;
134 --border: #e2e8f0;
135 --border-subtle: #f1f5f9;
136 --critical-bg: #fef2f2;
137 --warning-bg: #fffbeb;
138 --info-bg: #eff6ff;
139}
140```
141
142**Typography and spacing:**
143
144```css
145body {
146 font-family: var(--font-sans);
147 font-size: 14px;
148 line-height: 1.6;
149}
150h1 {
151 font-size: 1.5rem;
152 font-weight: 700;
153 letter-spacing: -0.02em;
154}
155h2 {
156 font-size: 1.1rem;
157 font-weight: 600;
158 letter-spacing: -0.01em;
159}
160h3 {
161 font-size: 0.9rem;
162 font-weight: 600;
163 text-transform: uppercase;
164 letter-spacing: 0.08em;
165 color: var(--text-muted);
166}
167code {
168 font-family: var(--font-mono);
169 font-size: 0.85em;
170 padding: 0.1em 0.3em;
171 border-radius: var(--radius-sm);
172 background: var(--border-subtle);
173}
174pre {
175 border-radius: var(--radius);
176 padding: 1.25rem;
177 overflow-x: auto;
178 background: var(--bg-card);
179 border: 1px solid var(--border);
180}
181pre code {
182 background: none;
183 padding: 0;
184}
185```
186
187**Finding card design — minimal, whitespace-forward:**
188
189```css
190.finding {
191 border-radius: var(--radius);
192 border: 1px solid var(--border);
193 padding: 1.25rem 1.5rem;
194 margin-bottom: 1rem;
195 background: var(--bg-card);
196}
197.finding-header {
198 display: flex;
199 align-items: center;
200 gap: 0.5rem;
201 margin-bottom: 0.75rem;
202}
203.badge {
204 font-size: 0.7rem;
205 font-weight: 700;
206 letter-spacing: 0.06em;
207 padding: 0.15rem 0.5rem;
208 border-radius: 3px;
209 text-transform: uppercase;
210}
211.badge-critical {
212 background: var(--critical-bg);
213 color: var(--critical);
214}
215.badge-warning {
216 background: var(--warning-bg);
217 color: var(--warning);
218}
219.badge-info {
220 background: var(--info-bg);
221 color: var(--info);
222}
223.finding-title {
224 font-weight: 600;
225 font-size: 0.95rem;
226}
227.finding-body {
228 color: var(--text-muted);
229 font-size: 0.875rem;
230}
231.finding-fix {
232 margin-top: 0.75rem;
233 padding-top: 0.75rem;
234 border-top: 1px solid var(--border-subtle);
235 font-size: 0.875rem;
236}
237```
238
239**HTML structure skeleton:**
240
241```html
242<!DOCTYPE html>
243<html lang="en" data-theme="dark">
244 <head>
245 ...
246 </head>
247 <body>
248 <nav class="sidebar"><!-- section links --></nav>
249 <main>
250 <header><!-- agent, skill, timestamp, target --></header>
251 <section id="summary">...</section>
252 <section id="findings">...</section>
253 <section id="metrics">...</section>
254 <section id="diagrams">...</section>
255 <section id="timeline">...</section>
256 <section id="actions">...</section>
257 </main>
258 <script>
259 /* theme toggle, copy buttons, mermaid init */
260 </script>
261 </body>
262</html>
263```
264
265### Step 3: Save and Open
266
2671. Save the HTML file to `{repo}/.reports/{agent}-{skill}-{YYYY-MM-DD-HHmm}.html`
2682. Create the `.reports/` directory if it does not exist
2693. Open the report in the default browser:
270 - macOS: `open {path}`
271 - Linux: `xdg-open {path}`
272
273### Step 4: Present CLI Summary
274
275```
276╭─ ATLAS ── atlas-report ───────────────────────╮
277
278 ## Report generated
279
280 **Source:** {agent} / {skill}
281 **Target:** {repo or service name}
282 **Saved:** .reports/{agent}-{skill}-{YYYY-MM-DD-HHmm}.html
283
284 ### Contents
285 - Executive Summary ({N} bullets)
286 - Findings ({N} critical, {N} warning, {N} info)
287 - Metrics ({N} tables)
288 - Diagrams ({N} charts)
289 - Actions ({N} next steps)
290
291 → Opened in browser
292
293╰────────────────────────────────────────────────╯
294```
295
296## Key Rules
297
298- **Self-contained HTML** — the report must work offline (except Mermaid CDN for diagrams)
299- **Never truncate findings** in the HTML report — this is where full detail lives; the CLI summary is the compressed version
300- **Severity colors match output kit** — `■` red, `▲` amber, `● ` blue, consistent across CLI and HTML
301- **Graceful Mermaid degradation** — if CDN is unreachable, diagrams fall back to styled code blocks
302- **Omit empty sections** — do not render sections that have no content
303- **No Tonone branding** — no footer attribution, no "powered by", no agent author credit in the rendered HTML. The report belongs to the repo, not the tool
304- **No copy buttons on inline code** — copy buttons on `<pre>` blocks only, hover-reveal only. Inline `<code>` never gets a copy button
305
306---
307
308**Source:** [`jeremylongshore/claude-code-plugins-plus-skills`](https://github.com/jeremylongshore/claude-code-plugins-plus-skills) → `plugins/ai-agency/tonone/skills/atlas-report/SKILL.md`