CtrlK
BlogDocsLog inGet started
Tessl Logo

tessleng/skill-insights

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

1.44x
Quality

90%

Does it follow best practices?

Impact

97%

1.44x

Average score across 2 eval scenarios

SecuritybySnyk

Advisory

Suggest reviewing before use

Overview
Quality
Evals
Security
Files

render_report.pyskills/run-skill-insights/scripts/

#!/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())

skills

run-skill-insights

README.md

tile.json