--- name: create-full-stack-panel-feature description: Multi-layer workflow for creating complete panel features by analyzing existing patterns and generating coordinated server routes, services, UI components, registration, and styling files. --- # Create Full-Stack Panel Feature This skill guides you through creating a complete, pattern-consistent panel feature across all application layers: backend API routes, service logic, frontend components, registration, and styling. ## When to Use - Adding a new panel type to a dashboard or admin interface - Creating a feature that spans multiple architectural layers - Ensuring consistency with existing codebase patterns across the stack ## Workflow Steps ### 1. Identify Pattern Files Locate existing examples for each layer you need to implement: ```bash # Find existing server routes find . -name "*route*.js" -o -name "*routes*.js" | grep -E "(panel|dashboard)" # Find service files find . -name "*service*.js" | grep -E "(panel|dashboard)" # Find UI components find . -name "*.jsx" -o -name "*.tsx" | grep -i panel # Find registration/config files find . -name "*config*.js" -o -name "*registry*.js" # Find styling files find . -name "*.css" -o -name "*.scss" | grep -i panel ``` ### 2. Read and Analyze Patterns Read 1-2 representative examples from **each layer** to understand: - Naming conventions (e.g., `MetricsPanel`, `metrics-service.js`) - Code structure and organization - Import/export patterns - Registration mechanisms - API endpoint patterns - Error handling approaches - Styling conventions **Example analysis checklist:** ``` Server Route Pattern: - ✓ Endpoint naming: /api/panels/{type} - ✓ Authentication middleware - ✓ Response format: { success, data, error } Service Pattern: - ✓ Export structure: class vs functions - ✓ Data transformation logic - ✓ Error propagation Component Pattern: - ✓ Props interface - ✓ State management (hooks/class) - ✓ Data fetching approach - ✓ Loading/error states Registration Pattern: - ✓ Registry file location - ✓ Registration format (array/object) - ✓ Required metadata fields ``` ### 3. Plan Your Feature Files Based on patterns, list the files you need to create: **Typical full-stack panel structure:** 1. **Server route** (e.g., `server/routes/system-health-route.js`) 2. **Service layer** (e.g., `server/services/system-health-service.js`) 3. **UI component** (e.g., `client/components/SystemHealthPanel.jsx`) 4. **Panel registration** (e.g., update `client/config/panel-registry.js`) 5. **Styling** (e.g., `client/styles/system-health-panel.css`) 6. **Type definitions** (if TypeScript, e.g., `types/system-health.ts`) ### 4. Create Files in Order ### 3b. Detect Project Framework **Before selecting templates in Step 4, determine the frontend framework in use:** ```bash # Check for React grep -s "react" package.json | head -5 # Check for TypeScript without React (vanilla TS) ls client/components/*.ts 2>/dev/null | head -3 ls client/panels/*.ts 2>/dev/null | head -3 # Check for a Panel base class (common in vanilla TS dashboards) grep -r "class.*Panel" client/ --include="*.ts" -l | head -3 grep -r "extends Panel" client/ --include="*.ts" -l | head -3 ``` **Decision rule:** - If `react` or `react-dom` is present in `package.json` → use the **React/JSX template** (Step 4C-React). - If components are `.ts` files extending a `Panel` base class → use the **Vanilla TS template** (Step 4C-Vanilla). - When in doubt, read one or two existing component files to confirm before proceeding. ### 4. Create Files in Order Generate files in dependency order (backend → frontend → registration): #### A. Server Route ```javascript // server/routes/{feature}-route.js const express = require('express'); const router = express.Router(); const featureService = require('../services/{feature}-service'); router.get('/api/panels/{feature}', async (req, res) => { try { const data = await featureService.getData(); res.json({ success: true, data }); } catch (error) { res.status(500).json({ success: false, error: error.message }); } }); module.exports = router; ``` #### B. Service Layer ```javascript // server/services/{feature}-service.js class FeatureService { async getData() { // Implementation following existing service patterns // - Data fetching // - Business logic // - Data transformation return processedData; } } module.exports = new FeatureService(); ``` #### C-React. UI Component (React/JSX projects) *Use this template only when React is confirmed in Step 3b.* ```javascript // client/components/{Feature}Panel.jsx import React, { useState, useEffect } from 'react'; import './styles/{feature}-panel.css'; const FeaturePanel = () => { const [data, setData] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); useEffect(() => { fetch('/api/panels/{feature}') .then(res => res.json()) .then(result => { setData(result.data); setLoading(false); }) .catch(err => { setError(err.message); setLoading(false); }); }, []); if (loading) return