skills/tools/report-writer/SKILL.md
Generate a polished standalone HTML report summarizing changes, findings, debug investigations, or architectural decisions. Opens automatically in the browser. Use after completing work on a ticket, investigation, or debug session.
npx skillsauth add krzysztofsurdy/code-virtuoso report-writerInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Generate a professional, standalone HTML report summarizing the work you just completed -- bug fixes, features, refactoring, investigations, or debug sessions. The report opens automatically in the default browser.
ticket-delivery skill)/report-writer PROJ-1234
/report-writer auth-migration-investigation
/report-writer # auto-names from branch
Sections to include:
Sections to include:
Sections to include:
Sections to include:
Collect information from your working session:
# Detect the main branch dynamically
MAIN_BRANCH=$(git symbolic-ref refs/remotes/origin/HEAD 2>/dev/null | sed 's@^refs/remotes/origin/@@' || echo "main")
# Get the merge base
MERGE_BASE=$(git merge-base HEAD "$MAIN_BRANCH")
# Changed files
git diff --name-status "$MERGE_BASE"..HEAD
# Full diff
git diff "$MERGE_BASE"..HEAD
# Commit log
git log --oneline "$MERGE_BASE"..HEAD
# Stats
git diff --stat "$MERGE_BASE"..HEAD
Use the template at references/template.html as the base. Replace the placeholder tokens:
| Token | Replace With |
|-------|-------------|
| {{REPORT_TITLE}} | Report title (e.g., "PROJ-1234: Fix payment timeout") |
| {{REPORT_SUBTITLE}} | Short subtitle or ticket summary |
| {{REPORT_DATE}} | Date in format "January 15, 2025" |
| {{REPORT_CONTENT}} | All HTML content sections (see components below) |
| {{TICKET_ID}} | Ticket identifier (e.g., "PROJ-1234") |
| {{BRANCH_NAME}} | Git branch name |
| {{AUTHOR_NAME}} | Author name |
| {{GENERATED_BY}} | "report-writer" |
# Save to /tmp
REPORT_PATH="/tmp/report-$(date +%Y%m%d-%H%M%S).html"
# Write the HTML content to the file
cat > "$REPORT_PATH" << 'REPORT_EOF'
... generated HTML ...
REPORT_EOF
# Open in the default browser
# macOS: open "$REPORT_PATH"
# Linux: xdg-open "$REPORT_PATH"
# Windows: start "$REPORT_PATH"
All components go inside the {{REPORT_CONTENT}} placeholder.
Uses Bootstrap Icons via CDN (already included in the template).
<div class="section mb-9">
<h2 class="text-xl font-bold text-slate-900 mb-4 pb-2 border-b border-slate-200 flex items-center gap-2">
<i class="bi bi-search"></i> Root Cause Analysis
</h2>
<p>Description text here...</p>
</div>
| Icon class | Use For |
|------|---------|
| bi bi-bullseye | Overview, Objective, Problem Statement |
| bi bi-search | Root Cause, Investigation, Analysis |
| bi bi-tools | Solution, Implementation, Approach |
| bi bi-folder2-open | Files Changed, Scope |
| bi bi-check-circle | Testing, Verification |
| bi bi-bar-chart | Impact, Metrics, Statistics |
| bi bi-rocket-takeoff | Deployment, Next Steps |
| bi bi-clock-history | Timeline, Chronology |
| bi bi-lightbulb | Recommendations, Insights |
| bi bi-exclamation-triangle | Risks, Warnings, Caveats |
| bi bi-building | Architecture, Design |
| bi bi-card-checklist | Summary, Configuration |
| bi bi-gear | Configuration, Setup |
| bi bi-pencil-square | Notes, Documentation |
<div class="card">
<strong>Key Finding:</strong> The timeout was caused by a missing index
on the <code>payments</code> table, leading to full table scans under load.
</div>
<div class="card highlight">
<strong>⚠️ Important:</strong> This change requires a database migration
to be run before deployment.
</div>
<div class="timeline">
<div class="timeline-item">
<div class="timeline-marker"></div>
<div class="timeline-content">
<strong>Step 1: Reproduced the issue</strong>
<p>Confirmed the timeout occurs on orders with 50+ line items...</p>
</div>
</div>
<div class="timeline-item">
<div class="timeline-marker"></div>
<div class="timeline-content">
<strong>Step 2: Identified slow query</strong>
<p>Used <code>EXPLAIN ANALYZE</code> to find the missing index...</p>
</div>
</div>
</div>
<pre><code># Before: N+1 query pattern
for order in orders:
items = order_repo.find_by_order_id(order.id)
# After: Eager loading with single query
orders = order_repo.find_with_items(criteria)</code></pre>
<div class="impact-grid">
<div class="impact-item low">
<strong>Performance</strong>
<span>Query time: 2.3s → 45ms</span>
</div>
<div class="impact-item medium">
<strong>Risk Level</strong>
<span>Medium -- new index on production table</span>
</div>
<div class="impact-item high">
<strong>Urgency</strong>
<span>High -- affecting 12% of checkouts</span>
</div>
</div>
Impact item classes: low (green), medium (amber), high (red).
<div class="decision-log">
<div class="decision">
<div class="decision-title">Accepted: Use composite index instead of separate indexes</div>
<div class="decision-detail">
<strong>Rationale:</strong> Composite index covers both the WHERE clause
and ORDER BY, avoiding a filesort. Benchmarked 3x faster than two
separate indexes.
</div>
</div>
<div class="decision">
<div class="decision-title">Rejected: Caching layer</div>
<div class="decision-detail">
<strong>Reason:</strong> Would add complexity and staleness risk.
The index fix resolves the root cause without adding infrastructure.
</div>
</div>
</div>
<div class="file-list">
<div class="file-item">
<span class="file-name">src/repository/order_repository.ext</span>
<span class="file-badge modified">Modified</span>
<div class="file-detail">Added eager loading for order items</div>
</div>
<div class="file-item">
<span class="file-name">migrations/20250115_add_order_index.ext</span>
<span class="file-badge added">Added</span>
<div class="file-detail">Composite index on (user_id, created_at)</div>
</div>
<div class="file-item">
<span class="file-name">src/service/legacy_order_loader.ext</span>
<span class="file-badge deleted">Deleted</span>
<div class="file-detail">Replaced by repository method</div>
</div>
</div>
File badge classes: added (green), modified (blue), deleted (red).
<div class="stats-bar">
<div class="stat">
<div class="stat-value">7</div>
<div class="stat-label">Files Changed</div>
</div>
<div class="stat">
<div class="stat-value">+142</div>
<div class="stat-label">Lines Added</div>
</div>
<div class="stat">
<div class="stat-value">-89</div>
<div class="stat-label">Lines Removed</div>
</div>
<div class="stat">
<div class="stat-value">5</div>
<div class="stat-label">Tests Added</div>
</div>
</div>
<div class="horizontal-timeline">
<div class="ht-phase completed">
<div class="ht-marker">1</div>
<div class="ht-label">Discovery</div>
</div>
<div class="ht-connector completed"></div>
<div class="ht-phase completed">
<div class="ht-marker">2</div>
<div class="ht-label">Analysis</div>
</div>
<div class="ht-connector active"></div>
<div class="ht-phase active">
<div class="ht-marker">3</div>
<div class="ht-label">Implementation</div>
</div>
<div class="ht-connector"></div>
<div class="ht-phase">
<div class="ht-marker">4</div>
<div class="ht-label">Verification</div>
</div>
</div>
Phase classes: (none) = pending, active = current, completed = done.
<div class="phase-timeline">
<div class="phase-group">
<div class="phase-header">Phase 1: Discovery</div>
<div class="timeline">
<div class="timeline-item">
<div class="timeline-marker"></div>
<div class="timeline-content">
<strong>Identified failing tests</strong>
<p>3 integration tests failing intermittently on CI...</p>
</div>
</div>
</div>
</div>
<div class="phase-group">
<div class="phase-header">Phase 2: Root Cause</div>
<div class="timeline">
<div class="timeline-item">
<div class="timeline-marker"></div>
<div class="timeline-content">
<strong>Race condition in event handler</strong>
<p>Two listeners processing the same event concurrently...</p>
</div>
</div>
</div>
</div>
</div>
<table class="data-table">
<thead>
<tr>
<th>Endpoint</th>
<th>Before</th>
<th>After</th>
<th>Improvement</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>/api/orders</code></td>
<td>2,340ms</td>
<td>45ms</td>
<td class="positive">98% faster</td>
</tr>
<tr>
<td><code>/api/users</code></td>
<td>180ms</td>
<td>165ms</td>
<td class="neutral">8% faster</td>
</tr>
</tbody>
</table>
Table cell classes: positive (green), negative (red), neutral (gray).
<div class="arrow-annotation">
<div class="arrow-from">
<code>OrderService.checkout()</code>
</div>
<div class="arrow-line">→</div>
<div class="arrow-to">
<code>PaymentGateway.charge()</code>
</div>
<div class="arrow-label">Timeout occurs here (>30s)</div>
</div>
When using report-writer after completing a ticket with ticket-delivery:
# 1. Complete the ticket work
/ticket-delivery PROJ-1234
# 2. Generate a report summarizing what was done
/report-writer PROJ-1234
The report generator will automatically gather git diff data, commit history, and file changes from your working branch.
| Reference | Contents | |---|---| | template.html | Full standalone HTML template with all CSS, JS, and component styles baked in |
| Situation | Recommended Skill |
|---|---|
| When completing a ticket end-to-end | ticket-delivery |
| When writing a PR description | pr-message-writer |
/report-writer PROJ-1234 # Bug fix report for ticket PROJ-1234
/report-writer PROJ-5678 # Feature report for ticket PROJ-5678
/report-writer PROJ-9012 # Refactoring report for ticket PROJ-9012
/report-writer auth-investigation # Investigation report (no ticket)
/report-writer # Auto-detect from branch name
development
Spawn and coordinate a pre-composed agent team from a team definition file. Reads team files from teams/, resolves agents and skills, picks the best spawning mode (peer or sequential), and runs the workflow. Use when the user asks to run a team, dispatch a development team, start a feature delivery, or coordinate multiple agents for a multi-phase task.
development
Pre-composed agent team library. Use when the user asks which teams are available, what a team does, when to pick one team over another, or to browse multi-agent compositions. Catalogs ready-to-run teams (development team, review squad, war room) with their purpose, agent roster, workflow type, and when to use each. The actual dispatching is handled by the dispatching-agent-teams skill.
tools
Ecosystem discovery advisor. Use when the user asks 'what skill should I use', 'what agent should I delegate to', 'which team fits this task', or when onboarding to available skills, agents, and teams. Scans ALL installed skills at runtime -- not limited to any single plugin or vendor. Triggers: 'which skill', 'which agent', 'what do I use for', 'orient me', 'what tools do I have'.
tools
Interactive tool to scaffold a complete Claude Code plugin -- plugin.json manifest, skills, agents, hooks, MCP servers, LSP servers, and an optional marketplace.json catalog entry. Use when the user asks to create a plugin, build a Claude Code plugin, scaffold a plugin marketplace, convert an existing .claude/ configuration into a plugin, or package skills and agents for distribution. Runs a guided questionnaire, writes all required files to disk, and prints test instructions.