Install
openclaw skills install @tuanle96/html-reportProduce a report, analysis, audit, RCA, review, or summary as a standalone HTML file with ONE consistent design. Use whenever the user asks for output "as HTML" / "report html" / "bằng html" / "làm report html" / "xuất báo cáo html" / "báo cáo html", or wants an audit/review/analysis/findings rendered as a shareable HTML page instead of plain markdown. It standardizes presentation only — you still write the content. NOT for Odoo QWeb PDF/HTML business documents (invoices, pickings, certificates) — that is the odoo-reports skill. This is the local-tooling report layout for findings and write-ups.
openclaw skills install @tuanle96/html-reportEvery report this suite produces should look the same. Instead of hand-rolling a
new design (or a fresh inline <style>) each time, compose from the shared
blocks defined in assets/report.css — the bold Magazine theme: black
header/footer slab, weight-900 headings, a yellow highlighter, a pink accent.
Light + dark mode and a print stylesheet ship for free.
This skill standardizes presentation, not content — you still write the
analysis. The output is a single self-contained .html file (CSS inlined) that
opens in a browser, shares cleanly, and attaches to a PR.
odoo-review, odoo-debug, odoo-perf, an
evidence bundle, or any investigation, and want a readable page rather than a
wall of markdown.Not this skill: Odoo QWeb reports — the printable PDF/HTML business
documents rendered by Odoo (ir.actions.report, web.external_layout). Those
are the odoo-reports skill.
plans/reports/ using the existing naming pattern
<type>-<yymmdd>-<hhmm>-<slug>.html — e.g.
audit-260629-1048-sale-order-flow.html (type = the report kind:
audit, review, analysis, research, evaluation, completion, …).assets/template.html. Keep the <head> exactly as shipped —
including the marked stylesheet link:
<link rel="stylesheet" href="report.css"><!-- @odoo-ai-html-report:css -->.
Do not paste a <style> block; the build step inlines the CSS for you.<header><div class="head-inner">…</div></header>
with an optional .eyebrow pill, an <h1>, a .subtitle, and a .meta row;
and <footer><div class="foot-inner">…</div></footer> with a .foot-brand.
These give the black Magazine header/footer — keep them.<title> matters — it is the report's name (and what an index would list).skills/html-report/scripts/build_report.py plans/reports/<file>.html
assets/report.css into the file (making it
self-contained) and opens it in the browser. Add --no-open for
non-interactive/CI use. It is idempotent — safe to re-run.<em> —
<h1>Audit — <em>sale.order</em></h1>.<h2> with
<span class="num">N</span> — <h2><span class="num">1</span>Findings</h2>.<b> inside a .lead or <p> also gets the highlighter.report.css)| Block | Use |
|---|---|
.panel | A section card. Add .danger / .warn / .ok / .info for a thick colored left edge. |
.cards > .card | A row of 2–4 stat tiles. .card.danger/.warn/.ok/.info colors the big .num. |
table.zebra + td.num | Striped data table; .num right-aligns numeric columns. |
table.kv | Key/value attribute table (assessment, root cause, evidence, fix). |
.callout | An aside. .callout.danger/.warn/.ok to set the tone. |
.badge | A solid status pill — .badge.warn/.ok/.info/.gray. |
.tag | A small yellow inline tag (owner, label). |
ol.steps | A numbered, boxed step list (recommendations / order of work). |
.toc | A two-column table of contents of in-page #anchor links (use for long reports). |
<pre><code> | A code block (dark). |
.ladder | MRO / super() chain or layered flow (.rung.stop = returns before super; .rung.native = base layer). |
.tree | Parent/child, model inheritance, menu graph (nested <ul>; .node / .node.root / .node.cur). |
.barchart | Counts / SQL hotspots / quantities (.bar rows; set width:NN% on the <i>). |
table.matrix | Security / coverage heatmap (cells .y / .n / .p). |
For relationships and quantities, prefer a chart over a table — they read far faster for a human. These blocks are pure HTML+CSS (no JS, no CDN), so they inline and stay self-contained. Author the markup by hand; you already have the numbers from introspection.
Ladder — an MRO / super() chain or any layered flow (outer at top → native
at bottom). Mark a layer that returns before super() with .stop; the base
layer with .native.
<div class="ladder">
<div class="rung stop"><span class="who">bm_mrp_product_label</span><span class="note">⛔ returns before super()</span></div>
<div class="rung"><span class="who">bm_mrp</span></div>
<div class="rung native"><span class="who">mrp</span><span class="note">native</span></div>
</div>
Tree — parent/child records, model inheritance, the menu graph. Nested
<ul>; wrap each label in <span class="node"> (.root / .cur to emphasize).
<ul class="tree">
<li><span class="node root">MO/0001</span>
<ul>
<li><span class="node">MO/0002</span></li>
<li><span class="node cur">MO/0003</span></li>
</ul>
</li>
</ul>
Bar chart — counts, SQL hotspots, any quantity. Set width:NN% on the <i>
(compute the percentage against the max yourself). Tint a row with
.warn / .danger / .ok / .info.
<div class="barchart">
<div class="bar danger"><span class="bl">write</span><span class="bt"><i style="width:100%"></i></span><span class="bv">42</span></div>
<div class="bar"><span class="bl">read</span><span class="bt"><i style="width:50%"></i></span><span class="bv">21</span></div>
</div>
Matrix / heatmap — effective security per group, coverage grids. A
table.matrix with cells .y (yes), .n (no), .p (partial / via rule).
<table class="matrix">
<thead><tr><th></th><th>read</th><th>write</th><th>unlink</th></tr></thead>
<tbody>
<tr><th>Sales / User</th><td class="y">✓</td><td class="y">✓</td><td class="n">✗</td></tr>
<tr><th>Sales / Manager</th><td class="y">✓</td><td class="y">✓</td><td class="p">rule</td></tr>
</tbody>
</table>
Arbitrary graph (e.g. an ESG model→model graph) — there is no auto-layout
without a JS library, so do not pull one in. Emit the graph as Mermaid or
DOT text inside a <pre><code> block; the reader pastes it into a renderer (or
/preview --diagram). A self-contained report beats an embedded graph engine.
Auto-generate from introspection. For an Odoo audit you don't have to hand-author
these blocks: odoo-ai viz <bundle_dir> (the odoo-introspect skill) renders Layer
A/C/D/G/K JSON straight into this layout — MRO/super() ladder, menu tree, SQL-hotspot
bars, security matrix, and an ESG graph — as one self-contained HTML file.
When unsure, copy assets/example.html — it renders every component in the
Magazine theme and is the canonical reference. Re-run build_report.py after
copying so the CSS is inlined.
After build_report.py, the report carries its own CSS — no external file, no
CDN, no server. It renders offline, on mobile, and as a downloaded attachment.
The trade-off is that restyling old reports means re-running the helper on each;
that is the intended cost of shippable, self-contained files. The shipped
assets/*.html keep the plain marker link so they stay editable templates.