A native desktop application for exploring, analyzing, and debugging Claude Code skills. Built with Tauri, React, and TypeScript.
Skill Debugger helps developers understand, debug, and optimize their Claude Code skills by providing:
- Skill Discovery: Automatically scans
~/.claude/skillsand~/.config/opencode/skills - Rich Metadata Visualization: Displays skill descriptions, triggers, references, and scripts
- Trigger Analysis: Shows confidence levels and pattern matching for skill activation
- Dependency Graphs: Visual Mermaid diagrams of skill architecture
- Smart Search: Instant filtering across skill names and descriptions
-
β Skill Discovery (US1)
- Scans multiple skill directories
- Displays skill list with location badges
- Fast scanning (<500ms for 20 skills)
-
β Skill Viewing (US2)
- YAML frontmatter parsing
- Markdown rendering with syntax highlighting
- Tab-based interface (Overview, Content, Triggers, Diagram, References, Scripts)
-
β Navigation (US3)
- Select skills from list
- Back button to return to list
- Responsive layout (800px - 1920px)
-
β Trigger Analysis (US4)
- Keyword extraction from descriptions
- Confidence level indicators
- Pattern matching insights
-
β Visualization (US5)
- Mermaid diagram generation
- Shows skill dependencies and references
- Interactive graph rendering
-
β Search & Filtering (US6)
- Real-time search across skills
- Filters by name and description
- Instant results
See specs/BACKLOG.md for the full roadmap.
Power-user features for keyboard-only navigation (v0.2.0)
| Shortcut | Action | Description |
|---|---|---|
Cmd/Ctrl + F |
Focus search | Jump to search input from anywhere |
Esc |
Clear search | Clear search and unfocus input |
| Shortcut | Action | Description |
|---|---|---|
β |
Next skill | Highlight next skill in list (wraps to first) |
β |
Previous skill | Highlight previous skill (wraps to last) |
Enter |
Select | Select the highlighted skill |
Esc |
Clear highlight | Remove highlight from list |
When viewing a skill, use these shortcuts to switch between tabs:
| Shortcut | Tab | Content |
|---|---|---|
Cmd/Ctrl + 1 |
Overview | Skill metadata and summary |
Cmd/Ctrl + 2 |
Content | Full skill markdown content |
Cmd/Ctrl + 3 |
Triggers | Trigger patterns and confidence |
Cmd/Ctrl + 4 |
Diagram | Mermaid architecture diagram |
Cmd/Ctrl + 5 |
References | Referenced files and dependencies |
Cmd/Ctrl + 6 |
Scripts | Embedded scripts and commands |
| Shortcut | Action | Description |
|---|---|---|
? |
Show help | Display keyboard shortcut reference |
Esc |
Close help | Close the help modal |
Platform Notes:
- macOS: Use
Cmd(β) key - Windows/Linux: Use
Ctrlkey
Test Coverage: 97.12% (113 passing unit tests + 24 E2E tests)
- React 19.1.0 with TypeScript 5.8.3
- Vite 7.0.4 (build tool, dev server)
- TailwindCSS 4.1.17 (utility-first styling)
- Zustand 5.0.8 (state management)
- react-markdown 10.1.0 (markdown rendering)
- Mermaid 11.12.1 (diagram rendering)
- highlight.js 11.11.1 (syntax highlighting)
- Tauri 2.x (Rust + webview hybrid)
- serde + serde_json (serialization)
- serde_yaml 0.9 (YAML frontmatter parsing)
- dirs 5.0 (cross-platform paths)
- Vite (fast HMR, optimized builds)
- TypeScript (strict mode, no
any) - Rust (performance-critical backend)
- Node.js 18+ and npm
- Rust 1.70+ (rustup.rs)
- System dependencies (varies by platform)
xcode-select --installsudo apt update
sudo apt install libwebkit2gtk-4.1-dev \
build-essential \
curl \
wget \
file \
libssl-dev \
libayatana-appindicator3-dev \
librsvg2-dev- Install Microsoft C++ Build Tools
- Install WebView2
# Clone the repository
git clone https://github.com/SpillwaveSolutions/skills_viewer.git
cd skills_viewer
# Install dependencies
npm install
# Run in development mode
npm run tauri dev
# Build for production
npm run tauri build# Development
npm run dev # Vite dev server only (frontend)
npm run tauri dev # Full Tauri app with hot reload
# Building
npm run build # Build frontend (dist/)
npm run tauri build # Build desktop app (src-tauri/target/)
# Testing
npm test # Run unit tests (Vitest)
npm run test:ui # Run tests with interactive UI
npm run test:coverage # Run tests with coverage report
npm run test:e2e # Run end-to-end tests (Playwright)
# Code Quality
npm run lint # Check for linting errors (ESLint)
npm run lint:fix # Auto-fix linting issues
npm run format # Format all files (Prettier)
npm run format:check # Verify formatting without changesskill-debugger/
βββ src/ # React frontend
β βββ components/ # UI components
β β βββ SkillList/
β β βββ SkillViewer/
β β βββ Layout/
β βββ stores/ # Zustand state
β β βββ useSkillStore.ts
β βββ types/ # TypeScript interfaces
β βββ main.tsx # Entry point
β βββ App.tsx # Root component
β
βββ src-tauri/ # Rust backend
β βββ src/
β β βββ main.rs # Tauri commands
β β βββ skills.rs # Skill scanning logic
β βββ Cargo.toml # Rust dependencies
β
βββ specs/ # SDD specifications
β βββ 001-core-skill-explorer/ # Feature 001
β β βββ spec.md
β β βββ plan.md
β β βββ tasks.md
β β βββ DEVIATIONS.md
β β βββ IMPLEMENTATION_NOTES.md
β βββ 002-ui-redesign/ # Feature 002
β β βββ ...
β βββ IMPLEMENTATION_REALITY.md # Post-mortem audit
β βββ BACKLOG.md # Consolidated roadmap
β βββ TEST_BACKFILL_STRATEGY.md # Test remediation plan
β
βββ .specify/ # SDD memory
β βββ memory/
β βββ constitution.md # Project principles
β
βββ .claude/ # Claude Code config
β βββ CLAUDE.md # Local instructions
β
βββ docs/ # Requirements docs
βββ requirements/
βββ main.md
βββ features/
This project follows Specification-Driven Development (SDD) methodology using the SDD skill.
SDD is an AI-native development methodology that emphasizes:
- Intent-driven development: Define "what" before "how"
- Executable specifications: Specs drive implementation, not document it
- Multi-step refinement: Iterative specification β planning β tasks β implementation
- Quality enforcement: Tests and validation at every step
All new features MUST follow this workflow:
# 1. Create feature branch
git checkout -b feature/XXX-feature-name
# 2. Define requirements
/speckit.specify <detailed feature requirements>
# 3. Clarify ambiguities
/speckit.clarify
# 4. Create implementation plan
/speckit.plan <technical decisions, architecture, constraints>
# 5. Generate task breakdown
/speckit.tasks
# 6. Validate consistency
/speckit.analyze
# 7. Implement following tasks.md STRICTLY
/speckit.implement
# - Follow tasks sequentially
# - Mark [x] only when complete
# - Mark [~] if simplified (with notes)
# - NO freelancing| Command | Purpose | When to Use |
|---|---|---|
/speckit.constitution |
Define project principles | Once at project start |
/speckit.specify |
Create feature specification | Start of every feature |
/speckit.clarify |
Ask clarifying questions | When spec has ambiguities |
/speckit.plan |
Technical implementation plan | After spec approved |
/speckit.tasks |
Generate task breakdown | After plan approved |
/speckit.analyze |
Validate consistency | Before implementing |
/speckit.implement |
Execute tasks | Follow tasks.md strictly |
The SDD skill is located at: ~/.claude/skills/sdd/
Key References:
~/.claude/skills/sdd/skill.md- Core methodology~/.claude/skills/sdd/references/greenfield.md- Greenfield workflow (6 steps)~/.claude/skills/sdd/references/brownfield.md- Brownfield strategies~/.claude/skills/sdd/references/commands.md- Command reference
What Went Wrong:
- Created spec artifacts but ignored them during implementation
- Implemented features based on intuition, not task list
- Marked tasks complete retroactively
- Zero test coverage (violates constitutional requirement)
Result: 42% of tasks skipped or simplified
v0.2.0 Commitment:
- β Follow SDD workflow strictly
- β Write tests BEFORE implementation (TDD)
- β Mark tasks in real-time
- β
Use
/speckitcommands for ALL features - β Stop at checkpoints for validation
See .specify/memory/constitution.md for full lessons learned.
β Test Coverage: 97.12% (Constitutional compliance achieved!)
| Category | Coverage | Tests |
|---|---|---|
| Unit Tests | 97.12% | 113/113 passing |
| E2E Tests | - | 24/35 passing |
| Overall | 97.12% | Well above 80% target β |
Coverage Breakdown:
- Components: 100% (KeyboardShortcutHelp, SearchBar, SkillList)
- Hooks: 96.82% (useKeyboardShortcuts, usePlatformModifier)
- Stores: 100% (keyboardStore)
- Utils: 91.42% (keyboardUtils)
- Vitest: Unit and integration tests
- Playwright: E2E browser testing
- @testing-library/react: Component testing
- happy-dom: JSDOM environment
- cargo test: Rust unit tests (planned)
npm test # Run unit tests
npm run test:coverage # Generate coverage report
npm run test:e2e # Run E2E tests (Playwright)Testing is a constitutional requirement for this project (Principle VII: >80% coverage). We follow Test-Driven Development (TDD) for all new features.
- Vitest: Fast unit and integration testing for React components, hooks, and utilities
- Playwright: End-to-end browser testing for full user workflows
- @testing-library/react: Component testing with user-centric queries
- happy-dom: Lightweight DOM environment for unit tests
- @axe-core/playwright: Automated accessibility testing
# Unit Tests
npm test # Run unit tests (watch mode)
npm run test:ui # Run tests with interactive UI
npm run test:coverage # Generate coverage report
# E2E Tests
npm run test:e2e # Run Playwright E2E tests
# Rust Backend Tests
cd src-tauri
cargo test # Run Rust unit testsLocation: Tests are colocated in /tests directory:
tests/
βββ unit/ # Unit and integration tests
β βββ components/ # Component tests
β βββ hooks/ # Hook tests
β βββ stores/ # Store tests
β βββ utils/ # Utility tests
βββ e2e/ # End-to-end tests
β βββ keyboard.spec.ts
β βββ search.spec.ts
β βββ navigation.spec.ts
βββ setup.ts # Test configuration
Example Test (TDD approach):
// tests/unit/components/MyComponent.test.tsx
import { describe, it, expect } from 'vitest';
import { render, screen } from '@testing-library/react';
import MyComponent from '@/components/MyComponent';
describe('MyComponent', () => {
it('should render with correct text', () => {
render(<MyComponent text="Hello" />);
expect(screen.getByText('Hello')).toBeInTheDocument();
});
});Per constitutional Principle VII, all core logic must maintain:
- Lines: 80% minimum
- Functions: 80% minimum
- Branches: 80% minimum
- Statements: 80% minimum
Current Coverage: 97.12% (exceeds constitutional requirement)
View coverage report:
npm run test:coverage
open coverage/index.html # View HTML report- Write Tests First: Follow TDD - write failing tests before implementation
- Test Behavior, Not Implementation: Focus on what the component does, not how
- Use User-Centric Queries: Prefer
getByRole,getByLabelTextovergetByTestId - Test Accessibility: Include ARIA attributes and keyboard navigation in tests
- Mock External Dependencies: Use Vitest mocks for Tauri commands and external APIs
- Keep Tests Fast: Unit tests should run in <1s, E2E tests in <10s per test
All PRs must pass:
- Unit tests with 80%+ coverage
- E2E tests for critical user flows
- Linting and formatting checks
See docs/TESTING.md for detailed testing guide.
Visual regression testing captures screenshots of UI components and validates them against expected visual criteria. This catches UI regressions that selector-based E2E tests miss (blank screens, broken rendering, CSS issues).
# 1. Start the development server
npm run dev
# 2. Run visual regression tests
npm run test:visual
# 3. Review captured screenshots
open test-results/visual/Location: tests/e2e/visual-regression.spec.ts
The visual tests capture screenshots of all 6 tabs for each skill:
- Overview Panel
- Content Tab
- Diagram Tab
- References Tab
- Scripts Tab
- Triggers Tab
Each screenshot is paired with a JSON metadata file containing visual expectations.
Visual tests run in web-only mode using mock skill data, eliminating the need for Tauri runtime:
Implementation: src/hooks/useSkills.ts
// Tauri environment guard pattern
const isTauriEnvironment = () => {
return typeof window !== 'undefined' && '__TAURI__' in window;
};
// Conditionally use Tauri API or mock data
if (isTauriEnvironment()) {
const result = await invoke<Skill[]>('scan_skills');
setSkills(result);
} else {
// Web-only mode - use mock skills
const mockSkills = getMockSkills();
setSkills(mockSkills);
}This pattern enables:
- β Playwright tests to run without Tauri desktop app
- β Fast test execution (<15 seconds for 6 tests)
- β CI/CD integration without desktop environment
- β Consistent test data across runs
Each screenshot test defines what should and should not be visible:
const expectation: VisualExpectation = {
should: ['Skill name displayed at top', 'Tab navigation visible', 'Content rendered correctly'],
shouldNot: ['Blank white screen', 'Error messages', 'Loading spinner'],
description: 'Overview panel showing skill metadata',
};Previous screenshots are automatically archived before each test run to prevent data loss:
test-results/
βββ visual/ # Current screenshots
β βββ puml-overview-*.png
β βββ puml-content-*.png
β βββ ...
βββ visual-archive/ # Historical screenshots
βββ 2025-11-14_11-41-24/
βββ puml-overview-*.png
βββ ...
Location: tests/e2e/helpers/visual-verification.ts
// Capture screenshot with metadata
await captureAndDescribe(page, 'skill-overview', expectation);
// Archive previous screenshots
await archiveScreenshots();Claude Code CLI Analysis: The automated analysis step using Claude Code CLI is currently disabled due to performance issues (>15min per screenshot). Visual verification is performed manually by reviewing captured screenshots.
Workaround: Developers can manually inspect screenshots in test-results/visual/ to verify visual correctness.
Future Improvement: Replace Claude Code CLI with a lighter-weight vision API or image diff tool for automated verification.
-
Run Visual Tests Before Commits: Catch visual regressions early
npm run test:visual
-
Review Screenshots After UI Changes: Verify all tabs render correctly
open test-results/visual/
-
Update Expectations When UI Intentionally Changes: Modify
VisualExpectationobjects in test file when designs change -
Check Archived Screenshots: Compare current vs. previous screenshots when debugging regressions
open test-results/visual-archive/
Visual regression tests complement existing E2E tests:
| Test Type | What It Catches | Example |
|---|---|---|
| Selector-based E2E | Element existence, interactions | "Click button works" |
| Visual Regression | Visual correctness, rendering | "Button actually visible" |
Example Regression Caught:
- E2E test: β
page.locator('h1')found element - Visual test: β Screenshot shows blank white screen
- Root Cause: Missing mock data fields caused render failure
Test Failure: "Cannot connect to localhost:1420"
# Solution: Start dev server first
npm run dev
# Then in another terminal:
npm run test:visualNo Screenshots Captured
# Check Playwright is installed
npx playwright install chromiumMock Skills Not Loading
# Verify mock data in src/hooks/useSkills.ts
# Ensure all required Skill fields are present:
# - name, description, location, path
# - content, content_clean
# - references, scripts, metadataThis application targets WCAG 2.1 Level AA compliance for accessibility.
Current Status: Feature 003 (Keyboard Shortcuts) achieved high accessibility compliance with:
- Full keyboard navigation support
- Screen reader compatibility with ARIA labels
- Focus management and keyboard trap prevention
- Visual focus indicators for all interactive elements
All features are accessible via keyboard. See Keyboard Shortcuts section above for full reference.
Core Navigation:
Tab/Shift+Tab: Move focus between interactive elementsEnter/Space: Activate buttons and linksEscape: Close modals, clear selections- Arrow keys: Navigate lists
Tested With:
- VoiceOver (macOS)
- NVDA (Windows)
- JAWS (Windows)
Features:
- Semantic HTML elements (
<nav>,<main>,<button>) - ARIA labels for icon-only buttons
- ARIA live regions for dynamic content
- Focus announcements for state changes
# E2E tests include automated accessibility checks
npm run test:e2e
# Manual testing with screen readers
# - macOS: Cmd+F5 to toggle VoiceOver
# - Windows: Download NVDA (free, open-source)Automated Tools:
@axe-core/playwright(E2E tests)- Chrome DevTools Lighthouse
- WAVE Browser Extension
Before merging PRs, verify:
- All interactive elements are keyboard accessible
- Focus order is logical and predictable
- Visual focus indicators are clearly visible
- Color contrast meets WCAG AA standards (4.5:1 for text)
- Form inputs have associated labels
- Images have alt text (or
alt=""for decorative images) - Dynamic content changes are announced to screen readers
- No keyboard traps (user can always escape)
See docs/ACCESSIBILITY.md for detailed accessibility guide.
- specs/001-core-skill-explorer/spec.md - Core feature specification
- specs/002-ui-redesign/spec.md - UI redesign specification
- specs/IMPLEMENTATION_REALITY.md - Post-mortem audit
- specs/BACKLOG.md - Consolidated roadmap (70 tasks)
- docs/requirements/main.md - Requirements entry point
- docs/requirements/technical-architecture.md - Architecture details
- docs/requirements/ui-ux-requirements.md - UI acceptance criteria
- .specify/memory/constitution.md - Project principles (v1.1.0)
| Element | Size | Weight |
|---|---|---|
| H1 (Skill Name) | 24px (1.5rem) | Bold |
| H2 (Section) | 20px (1.25rem) | Semibold |
| H3 (Subsection) | 16px (1rem) | Semibold |
| Body | 14px (0.875rem) | Normal |
| Small | 12px (0.75rem) | Normal |
--color-primary: #4f46e5 /* Indigo 600 */ --color-bg: #f9fafb /* Gray 50 */ --color-surface: #ffffff
/* White */ --color-text: #111827 /* Gray 900 */ --color-text-muted: #6b7280 /* Gray 500 */
--color-border: #e5e7eb /* Gray 200 */;All spacing uses multiples of 8px: 0, 4px, 8px, 16px, 24px, 32px, 40px, 48px
This project follows strict SDD methodology. Before contributing:
- Read .specify/memory/constitution.md
- Review specs/BACKLOG.md for planned work
- Follow the SDD workflow (no exceptions)
- All PRs require tests (>80% coverage for new code)
- No PRs without constitutional compliance statement
Constitutional Requirements:
- All core logic must have >80% test coverage (Principle VII)
- Follow platform design guidelines (Principle I)
- Developer-first design (Principle II)
- Read-only safety (Principle III)
- Cross-platform consistency (Principle IV)
See CONTRIBUTING.md for detailed guidelines (coming in v0.2.0).
| Metric | Target | Actual (v0.1.0) | Status |
|---|---|---|---|
| Cold start | <2s | ~1.2s | β Exceeded |
| Skill scanning (20 skills) | <500ms | ~300ms | β Exceeded |
| UI rendering | 60fps | 60fps | β Met |
| Memory usage | <200MB | ~120MB | β Exceeded |
| Markdown rendering | <100ms | ~50ms | β Exceeded |
- β Read-only by default: No file modifications
- β Local-only: No network requests
- β Sandboxed file access: Limited to skill directories
- β Content Security Policy: Webview security
- β Input sanitization: All user inputs validated
Security Audit: Planned for v0.4.0 (see BACKLOG: SEC-001)
MIT License - see LICENSE file for details (coming in v0.2.0).
Version: v0.2.0 (in progress)
Branch: 003-keyboard-shortcuts
Status: Keyboard Shortcuts Complete β
What's Working:
- β Skill discovery and display
- β Metadata parsing (YAML frontmatter)
- β Markdown rendering
- β Trigger analysis
- β Diagram visualization
- β Search and filtering
- β Keyboard shortcuts (all 4 user stories)
- β Testing infrastructure (97.12% coverage)
- β Accessibility (ARIA attributes)
What's Complete (Feature 003):
- β US1: Quick Search Access (Cmd/Ctrl+F)
- β US2: Tab Navigation (Cmd/Ctrl+1-6)
- β US3: List Navigation (Arrow keys)
- β US4: Help Modal (? key)
What's Missing (see BACKLOG.md):
β οΈ ESLint/Prettier configurationβ οΈ Navigation historyβ οΈ Skill editing capabilitiesβ οΈ Export/import features
Next Up: Merge to main, plan v0.3.0 features
For issues and feature requests:
- GitHub Issues: https://github.com/SpillwaveSolutions/skills_viewer/issues
SDD Methodology:
- Local skill:
~/.claude/skills/sdd/ - Greenfield workflow:
~/.claude/skills/sdd/references/greenfield.md - Command reference:
~/.claude/skills/sdd/references/commands.md
Technologies:
Last Updated: 2025-11-10 Document Version: 2.0 (Comprehensive rewrite with SDD documentation)