dashboard — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited dashboard (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Visualize Claude Code's CLAUDE.md and agents/*.md as "blogger profile"-style HTML pages.
User types /dashboard (default) or with explicit args:
/dashboard --agent <name> → Focus mode for one agent/dashboard --team → Team mode (CLAUDE.md hero + agent grid)/dashboard --claude → CLAUDE.md-only modeopen the HTML in browserscripts/render.py — JSON + template → HTMLscripts/detect_mode.py — pick mode from agent countscripts/frontmatter.py — parse YAML frontmatterscripts/cache.py — hash-based JSON cachetemplates/agent-profile.html — Focus modetemplates/team-dashboard.html — Team mode (Task 13)templates/claude-charter.html — CLAUDE.md mode (Task 14)samples/*.json — canonical examples for testing/dashboard --agent <name>)When the user asks to view a specific agent:
Search in this order, take first match:
.claude/agents/<name>.md (project-level)~/.claude/agents/<name>.md (user-level)If not found: tell the user the agent doesn't exist and list available agent names from the search dirs.
Compute file_hash(file_text). If ~/.claude/dashboard-cache/<hash>.json exists, load it; skip to Step D.
Read the file. Parse frontmatter and body. Output a JSON object matching this shape (every field must be present):
{
"type": "agent",
"source_path": "<absolute path to .md>",
"name": "<from frontmatter>",
"cn_name": "<2-3 char Chinese花名 you choose, evoking the role>",
"avatar_emoji": "<one emoji that captures the agent's vibe>",
"model": "<from frontmatter>",
"tier": "<S=opus, A=sonnet, B=haiku>",
"tools": ["<from frontmatter>"],
"title_line": "<one line role description, e.g. '资深代码审查师 · Quality 部 · 入职 N 年'>",
"bio": "<first-person 1-2 sentence intro from agent's perspective>",
"mbti": "<4-letter code inferred from prompt's structural traits>",
"mbti_name": "<Chinese 人格名 e.g. 检察官>",
"archetype": "<one phrase, e.g. '完美主义晚期'>",
"tags": ["<6-8 hashtag tags including MBTI, zodiac, vibe>"],
"personality": {
"rigor": <0-100>, "speed": <0-100>, "empathy": <0-100>,
"creative": <0-100>, "stress": <0-100>, "communication": <0-100>
},
"basic": {
"gender": "<inclusive default like they/them>",
"birthday": "<random plausible date matching MBTI archetype with zodiac sign emoji>",
"blood_type": "<A/B/O/AB type with one-line stereotype>",
"education": "<thematic joke degree, e.g. 'SICP 重读 7 遍'>",
"origin": "<github org or playful birthplace>",
"joined": "<plausible date>",
"team": "<short team name e.g. 'Quality 部'>",
"location": "<short path display, e.g. '~/.claude/agents/'>"
},
"quotes": ["<4-5 catchphrases inferred from prompt's voice>"],
"moves": [{"icon": "<emoji>", "name": "<招式名>", "desc": "<short desc>"}],
"peeves": ["<5 things this agent finds intolerable, derived from prompt's anti-patterns>"],
"daily": [{"time": "<HH:MM>", "do": "<activity inferred from When invoked steps>"}],
"playlist": [{"num": "01", "title": "<song matching agent's vibe>", "artist": "<artist>"}],
"books": [{"label": "<emoji + label>", "title": "<book matching domain>"}],
"coop": {"good": ["<other agent names>"], "warn": [], "bad": []},
"reviews": [{"stars": <1-5>, "stars_str": "<★★★★★ matching count>", "text": "<faux quote>", "reviewer": "<name>"}],
"stats": {
"monthly_calls": <plausible 10-100>,
"p0_caught": <plausible 0-10>,
"prs_reviewed": <plausible 0-200>,
"last_seen": "<ISO 8601>",
"last_seen_pretty": "<human-readable last action>"
},
"reasoning_trace": [
{
"conclusion": "<what was inferred>",
"sources": ["<exact prompt snippet that supports it>", "..."],
"reasoning": "<one-line explanation of the leap>"
}
]
}Inference rules:
coop, only list other agents that exist in the same project (you can read sibling .md files to know names). If you don't know, leave arrays empty.Every rendered Focus / CLAUDE.md page must include a `source_text` field containing the raw .md content, HTML-escaped (& → &, < → <, > → >). The template renders it inside a collapsible <details><pre> block at the bottom so the user can verify the persona against the original. Also include source_lines (integer line count). Team mode pages do NOT need source_text (the source for each agent lives on its own Focus page).
Every rendered page (Focus / Team / CLAUDE.md) must include a `nav` block so the topnav renders cross-page links. Compose it once, inject into every JSON before render:
"nav": {
"project_name": "<project dir basename>",
"charter_url": "file://<absolute>/charter-<hash>.html",
"team_url": "file://<absolute>/team-<hash>.html",
"agents": [
{"name": "code-reviewer", "cn_name": "柯瑞", "avatar_emoji": "🧐",
"url": "file://<absolute>/<agent-hash>.html"}
],
"no_agents": false
}For CLAUDE.md mode when 0 agents exist: set nav.no_agents: true and nav.agents: [] — the charter template will render an empty-state CTA inviting the user to run /agents.
~/.claude/dashboard-cache/<hash>.json via Bash.python3 $DASHBOARD/scripts/render.py --json <cache>.json --template .claude/skills/dashboard/templates/agent-profile.html --out ~/.claude/dashboard-cache/<hash>.html` via Bash.
open ~/.claude/dashboard-cache/<hash>.html to launch browser./dashboard --team or auto when 2+ agents)Use scan_agents() from scripts/detect_mode.py (or replicate logic): list *.md from .claude/agents/ then ~/.claude/agents/, dedup by stem name, project takes precedence.
Find CLAUDE.md in this order:
./CLAUDE.md (project root)~/.claude/CLAUDE.mdIf neither exists: skip the CLAUDE.md hero, render a placeholder ("项目暂无宪章").
For each agent, run the full Focus pipeline (Steps A-D from the Focus mode section) so its detail page exists in cache. Note the resulting hash for each.
This makes mini-cards in the team page clickable — they link straight to the Focus HTML.
Output a compact JSON for the team grid (just the fields used in mini-card — see samples/team.json for shape). Skip the full reasoning_trace and big arrays. Each agent must include `focus_url`: file:///<absolute-path-to-focus-html-in-cache> (use ~ expansion to the absolute home dir).
Merge the CLAUDE.md persona, agent mini-personas, and computed stats (online_pretty, tier_distribution) into one team JSON.
Use templates/team-dashboard.html. Same render-and-open pattern as Focus mode.
The rendered team HTML wraps each mini-card in <a href="{{focus_url}}"> — clicking a card opens that agent's Focus page in the same browser tab.
/dashboard --claude or auto when 0 agents)Search order: ./CLAUDE.md, ~/.claude/CLAUDE.md. If neither: tell user "no CLAUDE.md found in project or user dir" and exit.
Output JSON matching samples/claude-md.json shape. Same inference principles as agent persona — but treat the document as the entity:
cn_title: name the charter ("约法四章" / "守则" — your call based on tone)vibe: one phrase capturing the document's charactermbti: yes, CLAUDE.md has an MBTI too (e.g., ISTJ-J for rule-heavy charters, ENFP for permissive ones)principles: extract the top-level principles from the doc bodyaversions: list things the doc forbids/discouragesorigin_story: one paragraph on where the doc came from (Karpathy风/项目原创/OSS模板)personality: 6 numeric scores (rigor, speed, empathy, creative, stress, communication)For each agent in .claude/agents/ and ~/.claude/agents/:
level: high if ≥75, mid if 50-74, low if <50If any agent's score < 50, set has_low_affinity: true and write a low_affinity_warning explaining the specific conflict and proposing a fix.
Use templates/claude-charter.html. Same pattern.
/dashboard with no args)Run via Bash:
python3 $DASHBOARD/scripts/detect_mode.py 2>&1 || trueOr replicate the logic inline: count agents in .claude/agents/*.md ∪ ~/.claude/agents/*.md (dedupe by name).
Follow that mode's pipeline.
One line: "Detected N agents → rendered Team mode → opening browser." Include the file path so the user can re-open if needed.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.