.claude/skills/cuyamaca-settings-polish/SKILL.md
Build the Settings view and apply final polish to Cuyamaca — model configuration UI, API key management, process health monitoring, accessibility improvements, responsive refinements, and overall UX tightening. Use this skill whenever the user wants to build the settings view, configure model providers in the UI, add API key entry, polish the app's responsiveness, improve accessibility, refine animations, add keyboard navigation, or references "phase 8", "settings", "settings view", "API key management", "model configuration", "accessibility", "polish", "keyboard navigation", or "responsive refinement". Also trigger when the user asks about WCAG compliance for glass effects, reduce transparency mode, or the settings UI for Cuyamaca. This skill assumes Phase 7 is complete (runtime agent loop, all core functionality working).
npx skillsauth add yuyanghu06/cuyamaca cuyamaca-settings-polishInstall 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.
This skill completes the app by building the Settings view (model provider configuration, API key management, process health), polishing the UI (animations, transitions, edge cases), hardening accessibility (contrast, keyboard nav, reduced transparency), and tightening responsive behavior. After this phase, Cuyamaca is feature-complete for its initial release.
Replace the Settings View placeholder with the real configuration UI.
┌──────────────────────────────────────────┐
│ Settings │
│ │
│ MODELS │
│ ┌────────────────────────────────────┐ │
│ │ Code Model │ │
│ │ ┌──────────────┐ ┌────────────┐ │ │
│ │ │Provider: │ │Model: │ │ │
│ │ │[Ollama ▼] │ │[llama3.2 ▼]│ │ │
│ │ └──────────────┘ └────────────┘ │ │
│ │ API Key: [••••••••••] [Test] │ │
│ │ Status: ● Connected │ │
│ └────────────────────────────────────┘ │
│ ┌────────────────────────────────────┐ │
│ │ Runtime Model │ │
│ │ ┌──────────────┐ ┌────────────┐ │ │
│ │ │Provider: │ │Model: │ │ │
│ │ │[Ollama ▼] │ │[llava ▼] │ │ │
│ │ └──────────────┘ └────────────┘ │ │
│ │ ⚠ Multimodal required │ │
│ │ API Key: [••••••••••] [Test] │ │
│ │ Status: ● Connected │ │
│ └────────────────────────────────────┘ │
│ │
│ OLLAMA MODELS │
│ ┌────────────────────────────────────┐ │
│ │ Installed: llama3.2, llava │ │
│ │ Pull new model: [model name] [↓] │ │
│ │ Pulling llava:13b... 45% │ │
│ └────────────────────────────────────┘ │
│ │
│ CONNECTIONS │
│ ... │
└──────────────────────────────────────────┘
listOllamaModels(). When an external provider is selected, show a static list of supported models (from the CLAUDE.md table).type="password"). A "Test" button calls checkModelHealth("code") and shows the result.Same as code model slot, plus:
#[tauri::command]
pub async fn pull_ollama_model(
model: String,
on_progress: Channel<PullProgress>,
) -> Result<(), String> {
// POST /api/pull with streaming progress
// Ollama streams: {"status":"pulling manifest"}, {"status":"downloading","completed":1234,"total":5678}
}
#[derive(Clone, Serialize)]
#[serde(rename_all = "camelCase", tag = "event", content = "data")]
pub enum PullProgress {
Started,
Downloading { completed: u64, total: u64 },
Verifying,
Succeeded,
Failed { error: String },
}
┌────────────────────────────────────┐
│ CONNECTIONS │
│ │
│ Ollama │
│ URL: [http://localhost:11434] │
│ Status: ● Running │
│ [Restart Ollama] │
│ │
│ arduino-cli │
│ Path: /usr/local/bin/arduino-cli │
│ Version: 0.35.3 │
│ Status: ● Installed │
│ [Reinstall] │
│ │
│ Default Serial │
│ Baud Rate: [115200 ▼] │
│ Auto-detect board: [✓] │
└────────────────────────────────────┘
http://localhost:11434. For users running Ollama on another machine, they can change this.┌────────────────────────────────────┐
│ ABOUT │
│ │
│ Cuyamaca v0.1.0 │
│ Natural language Arduino control │
│ │
│ Accessibility │
│ [✓] Reduce transparency │
│ [✓] Reduce motion │
│ │
│ Data │
│ Projects directory: ~/... │
│ [Open in Finder/Explorer] │
└────────────────────────────────────┘
Glass effects are inherently low-contrast. Test and fix:
A toggle in Settings that replaces all glass backgrounds with solid dark surfaces:
[data-reduce-transparency="true"] .glass-subtle,
[data-reduce-transparency="true"] .glass-standard,
[data-reduce-transparency="true"] .glass-strong {
backdrop-filter: none;
background: rgba(30, 30, 35, 0.95);
}
Also respect the OS-level preference:
@media (prefers-reduced-transparency: reduce) {
.glass-subtle, .glass-standard, .glass-strong {
backdrop-filter: none;
background: rgba(30, 30, 35, 0.95);
}
}
Wrap all non-functional animations in the media query:
@media (prefers-reduced-motion: no-preference) {
.message-enter { animation: message-slide-in 300ms ease-out; }
.tool-pill-pulse { animation: pill-pulse 1s ease-out; }
.status-dot.green { animation: none; /* glow is static, not animated */ }
}
Functional animations (state transitions on toggles, panel collapse/expand) are kept — they're informational, not decorative.
Tab order follows the visual layout:
Specific keyboard behaviors:
:focus-visible {
outline: 2px solid var(--purple);
outline-offset: 2px;
}
Use :focus-visible (not :focus) so mouse clicks don't show the focus ring.
role="listitem" in a role="list" containerrole="switch" with aria-checkedaria-label="Ollama: connected" (or disconnected)aria-label="Emergency stop" with role="button"role="log" with aria-live="polite"aria-live="polite" for live updatesrole="dialog" with aria-modal="true"role="navigation" on sidebarReview and refine all animations:
@keyframes message-slide-in {
from {
opacity: 0;
transform: translateY(8px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.message-enter {
animation: message-slide-in 300ms ease-out;
}
@keyframes pill-pulse {
0% { box-shadow: 0 0 0 0 var(--cyan-dim); }
70% { box-shadow: 0 0 0 6px transparent; }
100% { box-shadow: 0 0 0 0 transparent; }
}
.tool-pill-new {
animation: pill-pulse 1s ease-out;
}
.panel-collapsible {
transition: width 200ms ease-out;
overflow: hidden;
}
.panel-collapsible.collapsed {
width: 0;
}
.status-dot {
transition: background-color 250ms ease, box-shadow 250ms ease;
}
.input-capsule:focus-within {
border-color: rgba(255, 255, 255, 0.2);
background: rgba(255, 255, 255, 0.08);
transition: border-color 200ms ease, background 200ms ease;
}
Every view needs both:
All error states use red-tinted glass. All empty states use neutral glass with a secondary text message and a primary action button.
Fine-tune the responsive behavior from Phase 1:
Use a simple toast system — notifications appear at the top-right, auto-dismiss after 4 seconds, stackable.
tools
Build serial communication, structured output parsing, sensor state management, and sensor visualization rendering for Cuyamaca. Use this skill whenever the user wants to implement serial port reading/writing, parse structured sensor output, build the sensor state panel, render sensor visualization images, manage the serial connection lifecycle, or references "phase 6", "serial communication", "serial port", "sensor parsing", "sensor state", "sensor visualization", "structured output", "serial monitor", or "serial reader". Also trigger when the user asks about the SENSOR_ID:VALUE protocol, concurrent serial read/write, sensor image rendering, or real-time state updates. This skill assumes Phase 5 is complete (arduino-cli integration, compile and flash working).
testing
Scaffold a Tauri v2 desktop app for the Cuyamaca project — an Arduino robotics controller with natural language control. Use this skill whenever the user wants to initialize the Cuyamaca project, set up the Tauri v2 scaffold, create the base layout and warm-white liquid glass UI theme, verify the IPC bridge, or references "phase 1", "scaffold", "project setup", "initialize Cuyamaca", "create the app skeleton", or "base layout". Also trigger when the user asks about Cuyamaca's three-panel layout, the warm-white glass design language, or setting up the Tauri project structure from scratch.
tools
Build the runtime agent loop for Cuyamaca — the agentic control loop where the runtime model reads sensor context, decides tool calls, writes serial commands, and iterates until the user stops it. Use this skill whenever the user wants to implement the runtime window, build the agent loop, assemble multimodal context for the runtime model, implement tool call dispatch via serial, add the kill button, or references "phase 7", "runtime agent", "agent loop", "runtime window", "runtime model", "tool calling", "kill button", "agentic loop", "multimodal context", or "control loop". Also trigger when the user asks about feeding sensor data to a vision model, executing tool calls as serial commands, or the observe-decide-act cycle. This skill assumes Phase 6 is complete (serial communication, sensor parsing, sensor visualization).
development
Write the user-facing README.md for the Cuyamaca Tauri v2 desktop app (natural language Arduino/robotics control). Use this skill whenever the user asks to create, write, draft, or update the README for Cuyamaca, or mentions "readme", "documentation", "project description", "repo docs", or "GitHub page" in the context of Cuyamaca. Also trigger when the user asks about what to put in the README, how to describe the project publicly, installation instructions for end users, or setup guides. This skill produces a polished, user-facing README — not developer docs or architecture specs.