Files
CapaKraken/plan.md
T
Hartmut c7b76e086d feat: unified Skills Hub — merge analytics + marketplace into one page
Combines SkillsAnalytics (496 LOC) and SkillMarketplace (346 LOC) into
a single tabbed Skills Hub (770 LOC total, -9% code).

New structure:
- skills/shared.tsx: ProficiencyBadge, GapIndicator, constants (extracted)
- skills/OverviewTab.tsx: KPI cards, top 10 table, distribution chart, export
- skills/SearchTab.tsx: skill search + proficiency + availability filter
- skills/GapsTab.tsx: supply vs demand table with gap indicators
- skills/PeopleFinderTab.tsx: multi-rule AND/OR builder, chapter filter, export
- SkillsHub.tsx: tabbed container with URL-persisted tab state (?tab=)

Routing:
- /analytics/skills renders SkillsHub (was SkillsAnalytics)
- /analytics/skill-marketplace redirects to /analytics/skills?tab=search
- Sidebar: "Skill Marketplace" removed, renamed to "Skills Hub"

No API changes — reuses existing queries with conditional fetching per tab.
Full dark theme support on all components.

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-03-22 21:33:21 +01:00

126 lines
6.3 KiB
Markdown

# Unified Skills Hub — Plan
## Anforderungsanalyse
**Was:** Die zwei getrennten Skill-Seiten (`/analytics/skills` = SkillsAnalytics, `/analytics/skill-marketplace` = SkillMarketplace) zu **einer einzigen, nutzerfreundlichen Skills-Hub-Seite** zusammenfuehren.
**Problem heute:**
- **SkillsAnalytics** (496 LOC): Skill-Tabelle mit Filtern, People Finder (AND/OR Suche), XLSX Export, Skill Distribution Chart, Skill Gap Alerts
- **SkillMarketplace** (346 LOC): Skill-Suche mit Verfuegbarkeitsfilter, Skill Gap Heat Map (Supply vs Demand), Skill Distribution Chart (dupliziert!)
- **Ueberlappung:** Beide haben `ProficiencyBadge`, `PROFICIENCY_CLASSES`, `SkillDistributionChart`, aehnliche Tabellen
- **Verwirrung:** User muss zwei Seiten besuchen fuer zusammenhaengende Informationen
- **Inkonsistenz:** Analytics hat kein Dark-Theme auf manchen Elementen, Marketplace hat es
**Ziel:** Eine Seite `/analytics/skills` mit Tab-basiertem Layout:
```
+-------------------------------------------------------------+
| Skills Hub [Export] |
| 125 resources . 47 distinct skills |
+----------+----------+----------+-------------+--------------+
| Overview | Search | Gaps | People | Distribution |
+----------+----------+----------+-------------+--------------+
| |
| [Tab content area] |
| |
+--------------------------------------------------------------+
```
### Betroffene Pakete & Dateien
| Paket | Dateien | Art der Aenderung |
|-------|---------|------------------|
| `apps/web` | `src/components/analytics/SkillsHub.tsx` | **create** — neue unified component |
| `apps/web` | `src/components/analytics/skills/OverviewTab.tsx` | **create** — KPI cards + distribution chart |
| `apps/web` | `src/components/analytics/skills/SearchTab.tsx` | **create** — skill search + availability (from Marketplace) |
| `apps/web` | `src/components/analytics/skills/GapsTab.tsx` | **create** — supply/demand gap analysis (from Marketplace) |
| `apps/web` | `src/components/analytics/skills/PeopleFinderTab.tsx` | **create** — AND/OR skill search (from Analytics) |
| `apps/web` | `src/components/analytics/skills/shared.tsx` | **create** — ProficiencyBadge, GapIndicator, constants |
| `apps/web` | `src/app/(app)/analytics/skills/page.tsx` | **edit** — render SkillsHub statt SkillsAnalytics |
| `apps/web` | `src/app/(app)/analytics/skill-marketplace/page.tsx` | **edit** — redirect to /analytics/skills |
| `apps/web` | `src/components/layout/AppShell.tsx` | **edit** — remove "Skill Marketplace" nav link |
| `packages/api` | `src/router/resource.ts` | **edit** — add unified getSkillsHub query |
### Task-Liste
- [ ] **Task 1:** Shared utilities extrahieren -> `skills/shared.tsx`
- `ProficiencyBadge`, `GapIndicator`, `PROFICIENCY_CLASSES`, `PROFICIENCY_LABELS`, `proficiencyClasses()`
- Einmal definieren, ueberall nutzen
- [ ] **Task 2:** API: neuen `getSkillsHub` Query -> `resource.ts`
- Kombiniert alle Daten in einem Call:
- `aggregated` (from getSkillsAnalytics)
- `searchResults` (from getSkillMarketplace)
- `gapData` (from getSkillMarketplace)
- `distribution` (from both, dedupliziert)
- `totalResources`, `totalSkillEntries`
- Alte Queries behalten (AI Assistant nutzt sie)
- [ ] **Task 3:** OverviewTab bauen -> `skills/OverviewTab.tsx`
- KPI Cards: Total Resources, Total Skills, Avg Proficiency, Skill Gaps Count
- Top 10 Skills Tabelle (sortierbar)
- Skill Distribution Chart (lazy-loaded)
- Quick filters: Category, Min Count
- [ ] **Task 4:** SearchTab bauen -> `skills/SearchTab.tsx`
- Skill name Suche (debounced)
- Min Proficiency Filter (1-5 Buttons)
- "Available in 30 days" Toggle
- Ergebnis-Tabelle: Resource, Chapter, Skill, Proficiency, Utilization, Available From
- Links zu `/resources/[id]`
- [ ] **Task 5:** GapsTab bauen -> `skills/GapsTab.tsx`
- Supply vs Demand Tabelle
- Supply/Demand Bar Visualisierung
- Gap Indicator (shortage/surplus/balanced)
- Sortierbar nach groesstem Gap
- Click auf Skill -> fuellt Search Tab
- [ ] **Task 6:** PeopleFinderTab bauen -> `skills/PeopleFinderTab.tsx`
- Multi-rule Builder: Skill + Min Proficiency pro Regel
- AND/OR Operator Toggle
- Chapter Filter
- Ergebnis-Tabelle mit Match Score
- XLSX Export Button
- [ ] **Task 7:** SkillsHub zusammenfuegen -> `SkillsHub.tsx`
- Tab Navigation (Overview, Search, Gaps, People Finder)
- Header mit KPI Summary + Export Button
- Tab State via URL search params
- Lazy-load Tabs fuer Performance
- [ ] **Task 8:** Routing + Navigation aktualisieren
- `/analytics/skills/page.tsx` -> rendert `<SkillsHub />`
- `/analytics/skill-marketplace/page.tsx` -> redirect zu `/analytics/skills?tab=search`
- AppShell: "Skill Marketplace" entfernen, "Skills Analytics" umbenennen zu "Skills Hub"
- [ ] **Task 9:** Dark Theme durchgaengig
- Alle Elemente mit `dark:` Varianten
- Konsistenz mit dem Rest der App
### Abhaengigkeiten
- Task 1 muss zuerst (shared utilities fuer alle Tabs)
- Task 2 kann parallel zu Task 1 (API aendern)
- Tasks 3-6 koennen parallel nach Task 1 (4 Tabs, unabhaengige Dateien)
- Task 7 benoetigt Tasks 3-6 (importiert alle Tabs)
- Task 8 benoetigt Task 7 (Routing zeigt auf neue Komponente)
- Task 9 kann parallel zu Task 8
### Akzeptanzkriterien
- [ ] `pnpm --filter @planarchy/web exec tsc --noEmit` — keine neuen Errors
- [ ] `/analytics/skills` zeigt die vereinte Seite mit 4 Tabs
- [ ] `/analytics/skill-marketplace` redirected zu `/analytics/skills?tab=search`
- [ ] Alle Features beider Seiten sind auf der neuen Seite verfuegbar
- [ ] Dark Theme funktioniert durchgehend
- [ ] Sidebar zeigt nur noch "Skills Hub" statt zwei Links
- [ ] XLSX Export funktioniert weiterhin
- [ ] People Finder AND/OR Suche funktioniert
- [ ] Skill Gap Heat Map mit Supply/Demand funktioniert
- [ ] Availability Filter (30 Tage) funktioniert
### Risiken & offene Fragen
- **API Performance:** Ein kombinierter Query koennte langsamer sein -> Loesung: Lazy-load per Tab, Query nur wenn Tab aktiv
- **URL State:** Aktiver Tab via `?tab=search` Query Param persistiert
- **Export:** Nur aktiver Tab exportierbar
- **Backwards-Kompatibilitaet:** AI Assistant Tools nutzen alte Queries -> behalten