Scan a directory or workspace for SKILL.md files across all agents and repos, capture supporting files (references, scripts, linked docs), dedupe vendored copies, enrich each Tessl tile with registry signals, and emit a canonical JSON inventory validated by JSON Schema. Then run four analytical phases in parallel against the inventory — staleness + git provenance (history, broken refs, contributors), quality (Tessl `skill review`), duplicates (similarity + LLM judgement), registry-search (per-standalone-skill registry suggestions, HTTP only) — and render a self-contained interactive HTML report with a top-of-report health overview, top-issues panel, recently-changed list, and per-tessl.json manifests view.
84
90%
Does it follow best practices?
Impact
97%
1.44xAverage score across 2 eval scenarios
Advisory
Suggest reviewing before use
#!/usr/bin/env python3
"""Render the self-contained Skill Insights HTML report."""
from __future__ import annotations
import argparse
from pathlib import Path
PLACEHOLDERS = {
"<!--@DISCOVERY_DATA@-->": "discovery.json",
"<!--@STALENESS_DATA@-->": "staleness.json",
"<!--@QUALITY_DATA@-->": "quality.json",
"<!--@DUPLICATES_DATA@-->": "duplicates.json",
"<!--@REGISTRY_SEARCH_DATA@-->": "registry-search.json",
}
def load_json_or_null(path: Path) -> str:
if not path.exists():
return "null"
return path.read_text().replace("</", "<\\/")
def parse_args() -> argparse.Namespace:
parser = argparse.ArgumentParser(description="Render skill-insights report.html")
parser.add_argument("--template", required=True, help="Path to report-template.html")
parser.add_argument("--output-dir", required=True, help="Directory containing phase JSON files")
parser.add_argument("--report", default=None, help="Output HTML path (default: <output-dir>/report.html)")
return parser.parse_args()
def main() -> int:
args = parse_args()
template_path = Path(args.template)
output_dir = Path(args.output_dir)
report_path = Path(args.report) if args.report else output_dir / "report.html"
template = template_path.read_text()
rendered = template
for placeholder, filename in PLACEHOLDERS.items():
rendered = rendered.replace(placeholder, load_json_or_null(output_dir / filename))
remaining = [placeholder for placeholder in PLACEHOLDERS if placeholder in rendered]
if remaining:
raise SystemExit(f"ERROR: placeholders were not substituted: {', '.join(remaining)}")
report_path.parent.mkdir(parents=True, exist_ok=True)
report_path.write_text(rendered)
print(f"wrote {report_path}")
return 0
if __name__ == "__main__":
raise SystemExit(main())