/SKILL.md
Deep research on any topic and build an interactive statistical visualization dashboard. Use when the user asks to research a topic, visualize data, create a research dashboard, explore trends, compare populations, or analyze statistics across time periods or groups. Supports a pluggable extension system with two output modes: bespoke (unique React dashboards) and template (shared component + JSON data for high-volume structured reports). Extensions auto-detect from user prompts and augment the pipeline with specialized logic. Handles the full pipeline from research discovery through interactive React dashboard delivery.
npx skillsauth add mrshaun13/research-visualizer research-visualizerInstall 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.
Takes a simple research topic from a user, autonomously discovers dimensions, metrics, subgroups, and taxonomies, then produces an interactive web dashboard.
Extension System — Specialized workflows (product comparisons, incident reviews, sprint analyses) are handled by pluggable extensions that auto-detect from user prompts and augment the pipeline. See extensions/registry.md.
ENVIRONMENT CHECK → INTERPRET → SURVEY → DISCOVER → RESEARCH → ANALYZE → BUILD → ENRICH → PRESENT
↓ ↓ ↓ ↓
Hub exists? Extension? User Checkpoint Glossary (always on)
↓ no ↓ yes
FIRST-TIME SETUP Extension Phase 1B
See hub-architecture.md for config schema, directory structure, and project registry.
SKILL_ROOT is the directory containing this SKILL.md file. Set once per session:
GEN="<skill-root>/scripts/hub-gen.mjs"
HUB=$(node -e "try{console.log(JSON.parse(require('fs').readFileSync('<skill-root>/config.json','utf-8')).personalHubPath)}catch{process.exit(1)}")
Pre-check: If $GEN does not exist, halt with: hub-gen.mjs not found at $GEN — check skill installation.
<skill-root>/config.json): Machine-local. Contains only personalHubPath. Written by hub-gen.mjs scaffold --init. Located relative to the skill's install directory (works for both global and workspace installs).<personalHubPath>/hub-config.json): Git-synced. Port, gitRepo, libraries, projects, telemetry.<personalHubPath>/.local-config.json): Gitignored. Library paths for Vite aliases.If invoked without a topic: run detection/setup, start dev server, open browser preview, stop — do NOT proceed to Phase 1.
Track: Derive slug (kebab-case) from topic immediately. Batch in one command:
node $GEN $HUB track <slug> session-start 2>&1 | tail -1 && \ node $GEN $HUB track <slug> phase-start environment 2>&1 | tail -1
personalHubPath → read hub-config.json → git pull (stash if needed) → sync libraries (git -C <localPath> pull for each with browseEnabled: true) → check dev server on port → if no topic, start server + stop; if topic, run batch then → Phase 1:
node $GEN $HUB track <slug> phase-end environment 2>&1 | tail -1 && \
node $GEN $HUB track <slug> phase-start interpret 2>&1 | tail -1
Phase timing via build-log.jsonl. write-meta reads build log → computes timing → writes session-end → preserves the file as a permanent committed artifact. AI provides zero timing data.
Opt-out: Phase timing is on by default. User can say "skip timing" at any point to disable for the current project.
SafeToAutoRun: true. Note to user: "Phase timing enabled. Say skip timing to disable."track commands. At write-meta, pass "phaseTiming": null. write-meta will set timingSource: "estimated" automatically (no build log).When disabled: Skip all > **Track** blocks throughout the phases.
When enabled:
track <slug> phase-start <phase> / phase-end <phase> at every boundary.track <slug> user-prompt discover checkpoint before and user-response discover checkpoint after.> Track block is exactly ONE run_command. Chain all calls with &&. This is not optional.$GEN and $HUB are set in the Shell Variables block above; up to 6 track calls per command.node $GEN $HUB track <slug> phase-end <A> 2>&1 | tail -1 && \
node $GEN $HUB track <slug> phase-start <B> 2>&1 | tail -1 && \
node $GEN $HUB track <slug> phase-end <B> 2>&1 | tail -1 && \
node $GEN $HUB track <slug> phase-start <C> 2>&1 | tail -1
SafeToAutoRun: true on track commands. No other hub-gen.mjs subcommands qualify.environment, interpret, survey, discover, research, analyze, build, enrich, present) must have both phase-start and phase-end events.Derive slug in Phase 1 (kebab-case, same as add-project). For resumed sessions: track-read <slug> --json. See hub-architecture.md § Build Log for the full event table.
Track: Batched with
phase-end environmentfrom Phase 0 (no separate command needed if chained).
Parse natural language into research parameters:
Scan prompt against extensions/registry.md triggers. If matched, load EXTENSION.md — it may inject Phase 1B before Phase 2.
Output: Topic, populations, time scope, intent, lenses, active extension. → Phase 2.
Track (batch):
node $GEN $HUB track <slug> phase-end interpret 2>&1 | tail -1 && \ node $GEN $HUB track <slug> phase-start survey 2>&1 | tail -1
Extension hook: Load Phase 2 instructions if active.
Track (batch):
node $GEN $HUB track <slug> phase-end survey 2>&1 | tail -1 && \ node $GEN $HUB track <slug> phase-start discover 2>&1 | tail -1
Split test: >20% difference → SPLIT; <20% → MERGE. Max 2 levels, 5 subgroups. See subgroup-discovery.md.
Apply Standard Research Dimensions Framework per lenses. See research-dimensions.md.
Search academic taxonomies, cross-reference 2-3 sources, trim to top 25-30. See subgroup-discovery.md.
Extension hook: May override 3A-3C.
Track (batch — run immediately before presenting checkpoint):
node $GEN $HUB track <slug> phase-end discover 2>&1 | tail -1 && \ node $GEN $HUB track <slug> user-prompt discover checkpoint 2>&1 | tail -1
Present research plan:
TOPIC · TIME AXIS · POPULATIONS · CORE METRICS · TAXONOMIES · PROPOSED SECTIONS · KEY DATA SOURCES
Ask: "Should I proceed, or adjust anything?"
HARD RULE: ALWAYS wait for explicit user response. Do NOT auto-approve for benchmarks, speed tests, or any reason. Silence does not count as approval.
After presenting, inform default visibility (personal if gitRepo exists, local if not). See hub-visibility.md. For libraries with contributeEnabled: true: if confirmEachShare: true (default), ask about sharing; if confirmEachShare: false (power-user pre-approval), auto-set visibility: "public" — no ask needed. Never push to a public library without user approval (either per-project ask or blanket pre-approval via confirmEachShare: false).
Track (batch — run immediately after user approves):
node $GEN $HUB track <slug> user-response discover checkpoint 2>&1 | tail -1 && \ node $GEN $HUB track <slug> phase-start research 2>&1 | tail -1
See subgroup-discovery.md for tier definitions. Extension hook: Load Phase 4 if active.
Track (batch):
node $GEN $HUB track <slug> phase-end research 2>&1 | tail -1 && \ node $GEN $HUB track <slug> phase-start analyze 2>&1 | tail -1
Decisions made HERE, after seeing the data.
Extension hook: Load Phase 5 if active.
Track (batch):
node $GEN $HUB track <slug> phase-end analyze 2>&1 | tail -1 && \ node $GEN $HUB track <slug> phase-start build 2>&1 | tail -1
Never create a standalone Vite project. See hub-architecture.md, build-templates.md, collections-architecture.md.
hub-gen.mjs handles structure; AI writes only creative content.
personalHubPathhub-config.json for port and project listnode scripts/hub-gen.mjs <hub-path> add-project --json '<payload>' — payload: slug, title, subtitle, query, lens, icon, accentColor, visibility, createdAt, sections. Creates directory, App.jsx, updates config + registry. Parse --json output for createdPaths.components/*.jsx — sections with charts, callouts. Import shared components from ../../../components/.data/*.js — research data as ES module exports.node scripts/hub-gen.mjs <hub-path> install-componentshub-config.json):
lsof -i :<port> | grep -q LISTEN || npm run dev &
Code hygiene rule: Only declare a variable (
const,let) if it is referenced in the JSX return value or passed to a child component. Do not leave computed values that are unused. If a value was computed for exploration but isn't needed in the final render, delete it before moving to the next component.
Atomic write groups: Write files in three ordered batches to prevent Vite HMR from seeing partial project state:
- All
data/files (researchData.js, any JSON)- All
components/filesApp.jsx+ registry update (sync-registry) +hub-config.jsonupdate
Track (batch):
node $GEN $HUB track <slug> phase-end build 2>&1 | tail -1 && \ node $GEN $HUB track <slug> phase-start enrich 2>&1 | tail -1
Import path: ../../../components/ — that's 3 levels up from src/projects/<slug>/components/. NOT 2.
| Component | Import | Props | Notes |
|-----------|--------|-------|-------|
| InsightCallout | import InsightCallout from '../../../components/InsightCallout' | children, color | Colors: violet (default), amber, emerald, blue, red, cyan, orange, indigo, rose, teal, purple. No emoji/icon prop. |
| CustomTooltip | import CustomTooltip from '../../../components/CustomTooltip' | Recharts content | <Tooltip content={<CustomTooltip />} /> |
| GlossaryTerm | import { GlossaryTerm } from '../../../components/GlossaryTerm' | term, glossary, children | term must exactly match a glossaryTerms key. |
When extension has output_mode: template → produces JSON data file. See collections-architecture.md.
Always store user's original query in hub-config.json query field for hub UI display.
Scan built project text, identify domain/technical terms a general audience wouldn't know, wrap in <GlossaryTerm>. Enabled by default (glossaryEnrichment: true).
Density: terms = max(3, floor(wordCount / 250)). Max 2 per section. Never two in same sentence.
Priority: Acronyms → Jargon → Technical → Tribal. Skip common words, proper nouns.
data/glossaryTerms.js — { definition, researchPrompt } per term<GlossaryTerm term="X" glossary={glossaryTerms}>X</GlossaryTerm>components/*.jsx ONLY. NEVER in data/*.js.term="X" must exactly match a glossaryTerms.js key. Verify before writing.multi_edit per file. No iterative fix passes.Track (batch):
node $GEN $HUB track <slug> phase-end enrich 2>&1 | tail -1 && \ node $GEN $HUB track <slug> phase-start present 2>&1 | tail -1
Steps 1-5 must complete before 6-9.
node scripts/hub-gen.mjs <hub-path> validate --fix --build --json — 13 categories + vite build. Parse summary.passed.
--fix, re-run node $GEN $HUB validate --check. Exit code 0 = clean. Exit code 1 = errors (fix before proceeding). Exit code 2 = warnings remain (run node $GEN $HUB doctor then re-validate).track <slug> phase-end present — must run before write-meta.node $GEN $HUB track <slug> phase-end present 2>&1 | tail -1
node scripts/hub-gen.mjs <hub-path> write-meta <slug> '<json>' — provide all required fields per hub-architecture.md § Telemetry. Missing fields = exit 1.
model: Use the exact model identifier if known (e.g. "claude-sonnet-4-5"). Use null if not retrievable — the card will not show it.phaseTiming estimates (tracker overrides with real values). write-meta sets timingSource automatically ("verified" if build log has session-end, "estimated" otherwise)."phaseTiming": null. write-meta sets timingSource: "estimated" automatically.git add -A → git commit → git pushvisibility: "public". Push via GitHub API per hub-contribution.md.git -C <localPath> pull for pushed libraries.hub-config.json (not any default). Verify port: lsof -i :<port> | grep -q LISTEN && echo running || echo not running. Summarize.See hub-architecture.md.
tools
Use when work should span one or more detached tasks but still behave like one job with a single owner context. TaskFlow is the durable flow substrate under authoring layers like Lobster, ACPX, plugins, or plain code. Keep conditional logic in the caller; use TaskFlow for flow identity, child-task linkage, waiting state, revision-checked mutations, and user-facing emergence.
tools
# Lobster Lobster executes multi-step workflows with approval checkpoints. Use it when: - User wants a repeatable automation (triage, monitor, sync) - Actions need human approval before executing (send, post, delete) - Multiple tool calls should run as one deterministic operation ## When to use Lobster | User intent | Use Lobster? | | ------------------------------------------------------ | --------------------------
tools
# Lobster Lobster executes multi-step workflows with approval checkpoints. Use it when: - User wants a repeatable automation (triage, monitor, sync) - Actions need human approval before executing (send, post, delete) - Multiple tool calls should run as one deterministic operation ## When to use Lobster | User intent | Use Lobster? | | ------------------------------------------------------ | --------------------------
tools
A CLI tool for making authenticated requests to the X (Twitter) API. Use this skill when you need to post tweets, reply, quote, search, read posts, manage followers, send DMs, upload media, or interact with any X API v2 endpoint.