Dashboard
Skill luck1ncoder/agent-colleague-dashboard/.claude/skills/dashboard
Anthropomorphize your Claude Code CLAUDE.md and subagents as 'blogger-profile' HTML pages, with reasoning traces and CLAUDE.md-↔-agent affinity scoring. 4 skills, zero deps.
npx -y skills add luck1ncoder/agent-colleague-dashboard --skill dashboardAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Render agent.md and CLAUDE.md as anthropomorphized HTML profiles. Triggered by /dashboard. Auto-detects layout (Focus for single agent, Team for multiple, CLAUDE.md-only when no agents). Use when user asks to visualize, view, or explain their Claude Code agents and project charter.
SKILL.md
10.3 KB, ~2.8k tokens by cl100k_base, as published. Nobody here has run it
Dashboard skill
Visualize Claude Code's CLAUDE.md and agents/*.md as "blogger profile"-style HTML pages.
Trigger
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 mode
Pipeline (overall)
- Determine mode (auto or from args)
- For each .md file in scope: read, infer persona JSON, cache
- Render the appropriate template with the JSON
openthe HTML in browser
File layout
scripts/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
Mode: Focus (/dashboard --agent <name>)
When the user asks to view a specific agent:
Step A. Locate the agent file
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.
Step B. Check cache
Compute file_hash(file_text). If ~/.claude/dashboard-cache/<hash>.json exists, load it; skip to Step D.
Step C. Infer persona JSON
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:
- The same .md should always produce the same JSON. Use the file content as the only source of truth — do not invent traits not implied by the prompt.
- Reasoning trace is mandatory — at minimum 4 entries (MBTI, two personality scores with extreme values, one peeve mapping). Each entry's sources must be verbatim quotes from the prompt.
- For
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.
Step D. Save to cache, render, open
- Write JSON to
~/.claude/dashboard-cache/<hash>.jsonvia Bash. - Run
DASHBOARD=.claude/skills/dashboard python3 $DASHBOARD/scripts/render.py --json <cache>.json --template .claude/skills/dashboard/templates/agent-profile.html --out ~/.claude/dashboard-cache/<hash>.htmlvia Bash. - Run
open ~/.claude/dashboard-cache/<hash>.htmlto launch browser. - Tell the user the file path and a one-line summary ("Rendered 柯瑞 · Focus mode → opening browser").
Mode: Team (/dashboard --team or auto when 2+ agents)
Step A. Discover all 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.
Step B. Read CLAUDE.md
Find CLAUDE.md in this order:
./CLAUDE.md(project root)~/.claude/CLAUDE.md
If neither exists: skip the CLAUDE.md hero, render a placeholder ("项目暂无宪章").
Step C. For each agent, also pre-render its Focus page
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.
Step D. For each agent, infer mini-persona (with focus_url)
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).
Step E. Compose team JSON
Merge the CLAUDE.md persona, agent mini-personas, and computed stats (online_pretty, tier_distribution) into one team JSON.
Step F. Render + open
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.
Mode: CLAUDE.md (/dashboard --claude or auto when 0 agents)
Step A. Find CLAUDE.md
Search order: ./CLAUDE.md, ~/.claude/CLAUDE.md. If neither: tell user "no CLAUDE.md found in project or user dir" and exit.
Step B. Infer charter persona
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)
Step C. Compute affinity (CLAUDE.md ↔ each agent)
For each agent in .claude/agents/ and ~/.claude/agents/:
- Read the agent's prompt
- Score 0-100 on how well the agent's behavior aligns with each CLAUDE.md principle
- Average the per-principle scores → affinity score
- Set
level:highif ≥75,midif 50-74,lowif <50
If any agent's score < 50, set has_low_affinity: true and write a low_affinity_warning explaining the specific conflict and proposing a fix.
Step D. Render + open
Use templates/claude-charter.html. Same pattern.
Smart default (/dashboard with no args)
Step A. Scan agents
Run via Bash:
python3 $DASHBOARD/scripts/detect_mode.py 2>&1 || true
Or replicate the logic inline: count agents in .claude/agents/*.md ∪ ~/.claude/agents/*.md (dedupe by name).
Step B. Pick mode
- 0 agents → CLAUDE.md mode (Step A of CLAUDE.md section)
- 1 agent → Focus mode (Step A of Focus section, with that single agent name)
- 2+ agents → Team mode (Step A of Team section)
Step C. Execute the chosen mode
Follow that mode's pipeline.
Step D. Tell the user what was rendered
One line: "Detected N agents → rendered Team mode → opening browser." Include the file path so the user can re-open if needed.
What ships with it: 25 files
104.0 KB alongside SKILL.md, 15 of them executable
samples/
- claude-md.json3.8 KB
- code-reviewer.json5.1 KB
- .gitkeep0 B
- team.json2.0 KB
scripts/
- backup.pyruns986 B
- cache.pyruns672 B
- detect_mode.pyruns1.3 KB
- frontmatter.pyruns1.2 KB
- .gitkeep0 B
- invalidate_cache.pyruns1.9 KB
- persona_schema.pyruns1.3 KB
- render.pyruns947 B
- tmpl_engine.pyruns3.3 KB
templates/
- agent-profile.html28.9 KB
- claude-charter.html28.9 KB
- .gitkeep0 B
- team-dashboard.html9.9 KB
tests/
- .gitkeep0 B
- test_backup.pyruns1.6 KB
- test_cache.pyruns1.1 KB
- test_detect_mode.pyruns2.0 KB
- test_frontmatter.pyruns1.2 KB
- test_invalidate_cache.pyruns1.8 KB
- test_render.pyruns3.0 KB
- test_tmpl_engine.pyruns3.3 KB