genoma-evolution 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.brv/.obsidian/app.json +1 -0
- package/.brv/.obsidian/appearance.json +1 -0
- package/.brv/.obsidian/core-plugins.json +33 -0
- package/.brv/.obsidian/graph.json +22 -0
- package/.brv/.obsidian/workspace.json +195 -0
- package/.brv/Sin ti/314/201tulo 1.canvas" +1 -0
- package/.brv/Sin ti/314/201tulo 2.canvas" +1 -0
- package/.brv/Sin ti/314/201tulo.canvas" +1 -0
- package/.brv/_queue_status.json +1 -0
- package/.brv/config.json +5 -0
- package/.brv/context-tree/_index.md +60 -0
- package/.brv/context-tree/_manifest.json +165 -0
- package/.brv/context-tree/backend/_index.md +24 -0
- package/.brv/context-tree/backend/backend/_index.md +40 -0
- package/.brv/context-tree/backend/backend/init.abstract.md +0 -0
- package/.brv/context-tree/backend/backend/init.md +27 -0
- package/.brv/context-tree/backend/backend/init.overview.md +29 -0
- package/.brv/context-tree/backend/backend/job_tracker.abstract.md +1 -0
- package/.brv/context-tree/backend/backend/job_tracker.md +273 -0
- package/.brv/context-tree/backend/backend/job_tracker.overview.md +31 -0
- package/.brv/context-tree/backend/backend/main.abstract.md +0 -0
- package/.brv/context-tree/backend/backend/main.md +1292 -0
- package/.brv/context-tree/backend/backend/main.overview.md +30 -0
- package/.brv/context-tree/backend/backend/requirements.abstract.md +1 -0
- package/.brv/context-tree/backend/backend/requirements.md +37 -0
- package/.brv/context-tree/backend/backend/requirements.overview.md +28 -0
- package/.brv/context-tree/docs/_index.md +37 -0
- package/.brv/context-tree/docs/api/_index.md +54 -0
- package/.brv/context-tree/docs/api/context.md +11 -0
- package/.brv/context-tree/docs/api/hermes_api_openapi_specification.abstract.md +0 -0
- package/.brv/context-tree/docs/api/hermes_api_openapi_specification.md +468 -0
- package/.brv/context-tree/docs/api/hermes_api_openapi_specification.overview.md +44 -0
- package/.brv/context-tree/frontend/_index.md +48 -0
- package/.brv/context-tree/frontend/hermes_dashboard/_index.md +31 -0
- package/.brv/context-tree/frontend/hermes_dashboard/architecture_overview.abstract.md +0 -0
- package/.brv/context-tree/frontend/hermes_dashboard/architecture_overview.md +41 -0
- package/.brv/context-tree/frontend/hermes_dashboard/architecture_overview.overview.md +34 -0
- package/.brv/context-tree/frontend/src/_index.md +53 -0
- package/.brv/context-tree/frontend/src/components/_index.md +52 -0
- package/.brv/context-tree/frontend/src/components/sidebar_navigation_component.abstract.md +0 -0
- package/.brv/context-tree/frontend/src/components/sidebar_navigation_component.md +161 -0
- package/.brv/context-tree/frontend/src/components/sidebar_navigation_component.overview.md +32 -0
- package/.brv/context-tree/frontend/src/context.md +10 -0
- package/.brv/context-tree/frontend/src/functioncallingpage.abstract.md +0 -0
- package/.brv/context-tree/frontend/src/functioncallingpage.md +34 -0
- package/.brv/context-tree/frontend/src/functioncallingpage.overview.md +26 -0
- package/.brv/context-tree/frontend/src/lib/_index.md +48 -0
- package/.brv/context-tree/frontend/src/lib/api_client_library.abstract.md +1 -0
- package/.brv/context-tree/frontend/src/lib/api_client_library.md +403 -0
- package/.brv/context-tree/frontend/src/lib/api_client_library.overview.md +69 -0
- package/.brv/context-tree/frontend/src/page.abstract.md +0 -0
- package/.brv/context-tree/frontend/src/page.md +103 -0
- package/.brv/context-tree/frontend/src/page.overview.md +7 -0
- package/.brv/context-tree/frontend/src/settingspage.abstract.md +0 -0
- package/.brv/context-tree/frontend/src/settingspage.md +124 -0
- package/.brv/context-tree/frontend/src/settingspage.overview.md +34 -0
- package/.brv/context-tree/frontend/src/sidebar.abstract.md +0 -0
- package/.brv/context-tree/frontend/src/sidebar.md +170 -0
- package/.brv/context-tree/frontend/src/sidebar.overview.md +25 -0
- package/.brv/context-tree/meta/_index.md +24 -0
- package/.brv/context-tree/meta/curation_context/_index.md +24 -0
- package/.brv/context-tree/meta/curation_context/empty_context.abstract.md +4 -0
- package/.brv/context-tree/meta/curation_context/empty_context.md +35 -0
- package/.brv/context-tree/meta/curation_context/empty_context.overview.md +20 -0
- package/.brv/dream-log/drm-1777341062653.json +33 -0
- package/.brv/dream-state.json +8 -0
- package/.brv/dream.lock +0 -0
- package/.brv/review-backups/docs/api/hermes_api_openapi_specification.md +468 -0
- package/.claude/settings.local.json +7 -0
- package/.claude/worktrees/phase-2-mcp/.brv/.obsidian/app.json +1 -0
- package/.claude/worktrees/phase-2-mcp/.brv/.obsidian/appearance.json +1 -0
- package/.claude/worktrees/phase-2-mcp/.brv/.obsidian/core-plugins.json +33 -0
- package/.claude/worktrees/phase-2-mcp/.brv/.obsidian/graph.json +22 -0
- package/.claude/worktrees/phase-2-mcp/.brv/.obsidian/workspace.json +195 -0
- package/.claude/worktrees/phase-2-mcp/.brv/Sin t/303/255tulo 1.canvas" +1 -0
- package/.claude/worktrees/phase-2-mcp/.brv/Sin t/303/255tulo 2.canvas" +1 -0
- package/.claude/worktrees/phase-2-mcp/.brv/Sin t/303/255tulo.canvas" +1 -0
- package/.claude/worktrees/phase-2-mcp/.brv/_queue_status.json +1 -0
- package/.claude/worktrees/phase-2-mcp/.brv/config.json +5 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/_index.md +60 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/_manifest.json +165 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/backend/_index.md +24 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/backend/backend/_index.md +40 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/backend/backend/init.abstract.md +0 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/backend/backend/init.md +27 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/backend/backend/init.overview.md +29 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/backend/backend/job_tracker.abstract.md +1 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/backend/backend/job_tracker.md +273 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/backend/backend/job_tracker.overview.md +31 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/backend/backend/main.abstract.md +0 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/backend/backend/main.md +1292 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/backend/backend/main.overview.md +30 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/backend/backend/requirements.abstract.md +1 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/backend/backend/requirements.md +37 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/backend/backend/requirements.overview.md +28 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/docs/_index.md +37 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/docs/api/_index.md +54 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/docs/api/context.md +11 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/docs/api/hermes_api_openapi_specification.abstract.md +0 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/docs/api/hermes_api_openapi_specification.md +468 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/docs/api/hermes_api_openapi_specification.overview.md +44 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/_index.md +48 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/hermes_dashboard/_index.md +31 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/hermes_dashboard/architecture_overview.abstract.md +0 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/hermes_dashboard/architecture_overview.md +41 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/hermes_dashboard/architecture_overview.overview.md +34 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/_index.md +53 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/components/_index.md +52 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/components/sidebar_navigation_component.abstract.md +0 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/components/sidebar_navigation_component.md +161 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/components/sidebar_navigation_component.overview.md +32 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/context.md +10 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/functioncallingpage.abstract.md +0 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/functioncallingpage.md +34 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/functioncallingpage.overview.md +26 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/lib/_index.md +48 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/lib/api_client_library.abstract.md +1 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/lib/api_client_library.md +403 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/lib/api_client_library.overview.md +69 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/page.abstract.md +0 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/page.md +103 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/page.overview.md +7 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/settingspage.abstract.md +0 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/settingspage.md +124 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/settingspage.overview.md +34 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/sidebar.abstract.md +0 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/sidebar.md +170 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/sidebar.overview.md +25 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/meta/_index.md +24 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/meta/curation_context/_index.md +24 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/meta/curation_context/empty_context.abstract.md +4 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/meta/curation_context/empty_context.md +35 -0
- package/.claude/worktrees/phase-2-mcp/.brv/context-tree/meta/curation_context/empty_context.overview.md +20 -0
- package/.claude/worktrees/phase-2-mcp/.brv/dream-log/drm-1777341062653.json +33 -0
- package/.claude/worktrees/phase-2-mcp/.brv/dream-state.json +8 -0
- package/.claude/worktrees/phase-2-mcp/.brv/dream.lock +0 -0
- package/.claude/worktrees/phase-2-mcp/.brv/review-backups/docs/api/hermes_api_openapi_specification.md +468 -0
- package/.claude/worktrees/phase-2-mcp/.claude/settings.local.json +13 -0
- package/.claude/worktrees/phase-2-mcp/.kilocode/package-lock.json +378 -0
- package/.claude/worktrees/phase-2-mcp/.kilocode/package.json +5 -0
- package/.claude/worktrees/phase-2-mcp/AGENTS.md +5 -0
- package/.claude/worktrees/phase-2-mcp/CLAUDE.md +29 -0
- package/.claude/worktrees/phase-2-mcp/QA_AUDIT_PLAN.md +156 -0
- package/.claude/worktrees/phase-2-mcp/README.md +316 -0
- package/.claude/worktrees/phase-2-mcp/agent-agnostic-evolution-dashboard.md +405 -0
- package/.claude/worktrees/phase-2-mcp/backend/__init__.py +0 -0
- package/.claude/worktrees/phase-2-mcp/backend/collectors/__init__.py +0 -0
- package/.claude/worktrees/phase-2-mcp/backend/collectors/claude_code_collector.py +277 -0
- package/.claude/worktrees/phase-2-mcp/backend/collectors/hermes_collector.py +68 -0
- package/.claude/worktrees/phase-2-mcp/backend/curator.py +512 -0
- package/.claude/worktrees/phase-2-mcp/backend/eval/__init__.py +19 -0
- package/.claude/worktrees/phase-2-mcp/backend/eval/engine.py +116 -0
- package/.claude/worktrees/phase-2-mcp/backend/eval/scorers.py +201 -0
- package/.claude/worktrees/phase-2-mcp/backend/generate_dataset.py +86 -0
- package/.claude/worktrees/phase-2-mcp/backend/job_tracker.py +232 -0
- package/.claude/worktrees/phase-2-mcp/backend/main.py +1746 -0
- package/.claude/worktrees/phase-2-mcp/backend/mcp_server.py +250 -0
- package/.claude/worktrees/phase-2-mcp/backend/promethean/__init__.py +24 -0
- package/.claude/worktrees/phase-2-mcp/backend/promethean/cycle_orchestrator.py +270 -0
- package/.claude/worktrees/phase-2-mcp/backend/promethean/delta_validator.py +191 -0
- package/.claude/worktrees/phase-2-mcp/backend/promethean/dspy_compiler.py +315 -0
- package/.claude/worktrees/phase-2-mcp/backend/promethean/gepa_strategist.py +213 -0
- package/.claude/worktrees/phase-2-mcp/backend/promethean/models.py +260 -0
- package/.claude/worktrees/phase-2-mcp/backend/promethean/skill_deployer.py +195 -0
- package/.claude/worktrees/phase-2-mcp/backend/promethean/trace_ingestion.py +142 -0
- package/.claude/worktrees/phase-2-mcp/backend/requirements.txt +6 -0
- package/.claude/worktrees/phase-2-mcp/backend/sdd_evolve.py +459 -0
- package/.claude/worktrees/phase-2-mcp/backend/skill_detector.py +227 -0
- package/.claude/worktrees/phase-2-mcp/backend/skill_registry.py +289 -0
- package/.claude/worktrees/phase-2-mcp/backend/storage/__init__.py +5 -0
- package/.claude/worktrees/phase-2-mcp/backend/storage/run_store.py +393 -0
- package/.claude/worktrees/phase-2-mcp/backend/storage/schema.sql +99 -0
- package/.claude/worktrees/phase-2-mcp/backend/validate_evolution.py +267 -0
- package/.claude/worktrees/phase-2-mcp/components.json +28 -0
- package/.claude/worktrees/phase-2-mcp/docs/api/hermes-api.openapi.yaml +438 -0
- package/.claude/worktrees/phase-2-mcp/docs/hero.svg +148 -0
- package/.claude/worktrees/phase-2-mcp/eslint.config.mjs +18 -0
- package/.claude/worktrees/phase-2-mcp/install.sh +245 -0
- package/.claude/worktrees/phase-2-mcp/next-env.d.ts +6 -0
- package/.claude/worktrees/phase-2-mcp/next.config.ts +32 -0
- package/.claude/worktrees/phase-2-mcp/package-lock.json +11936 -0
- package/.claude/worktrees/phase-2-mcp/package.json +41 -0
- package/.claude/worktrees/phase-2-mcp/pnpm-workspace.yaml +4 -0
- package/.claude/worktrees/phase-2-mcp/postcss.config.mjs +7 -0
- package/.claude/worktrees/phase-2-mcp/public/file.svg +1 -0
- package/.claude/worktrees/phase-2-mcp/public/fonts/SF-Pro-Display-Bold.otf +0 -0
- package/.claude/worktrees/phase-2-mcp/public/fonts/SF-Pro-Display-Heavy.otf +0 -0
- package/.claude/worktrees/phase-2-mcp/public/fonts/SF-Pro-Display-Medium.otf +0 -0
- package/.claude/worktrees/phase-2-mcp/public/fonts/SF-Pro-Display-Regular.otf +0 -0
- package/.claude/worktrees/phase-2-mcp/public/fonts/SF-Pro-Display-Semibold.otf +0 -0
- package/.claude/worktrees/phase-2-mcp/public/fonts/SF-Pro-Text-Bold.otf +0 -0
- package/.claude/worktrees/phase-2-mcp/public/fonts/SF-Pro-Text-Heavy.otf +0 -0
- package/.claude/worktrees/phase-2-mcp/public/fonts/SF-Pro-Text-Medium.otf +0 -0
- package/.claude/worktrees/phase-2-mcp/public/fonts/SF-Pro-Text-Regular.otf +0 -0
- package/.claude/worktrees/phase-2-mcp/public/fonts/SF-Pro-Text-Semibold.otf +0 -0
- package/.claude/worktrees/phase-2-mcp/public/globe.svg +1 -0
- package/.claude/worktrees/phase-2-mcp/public/next.svg +1 -0
- package/.claude/worktrees/phase-2-mcp/public/theme-preview.html +257 -0
- package/.claude/worktrees/phase-2-mcp/public/vercel.svg +1 -0
- package/.claude/worktrees/phase-2-mcp/public/window.svg +1 -0
- package/.claude/worktrees/phase-2-mcp/run.sh +26 -0
- package/.claude/worktrees/phase-2-mcp/skills-lock.json +10 -0
- package/.claude/worktrees/phase-2-mcp/specs/event-schema.md +223 -0
- package/.claude/worktrees/phase-2-mcp/specs/examples/run.jsonl +3 -0
- package/.claude/worktrees/phase-2-mcp/src/app/api/[...path]/route.ts +55 -0
- package/.claude/worktrees/phase-2-mcp/src/app/api/auth/token/route.ts +22 -0
- package/.claude/worktrees/phase-2-mcp/src/app/evolution/page.tsx +589 -0
- package/.claude/worktrees/phase-2-mcp/src/app/favicon.ico +0 -0
- package/.claude/worktrees/phase-2-mcp/src/app/globals.css +321 -0
- package/.claude/worktrees/phase-2-mcp/src/app/layout.tsx +63 -0
- package/.claude/worktrees/phase-2-mcp/src/app/page.tsx +70 -0
- package/.claude/worktrees/phase-2-mcp/src/app/skills/page.tsx +369 -0
- package/.claude/worktrees/phase-2-mcp/src/components/ApiConfigCard.tsx +199 -0
- package/.claude/worktrees/phase-2-mcp/src/components/ColorBends.css +1 -0
- package/.claude/worktrees/phase-2-mcp/src/components/ColorBends.d.ts +1 -0
- package/.claude/worktrees/phase-2-mcp/src/components/ColorBends.jsx +1 -0
- package/.claude/worktrees/phase-2-mcp/src/components/CoreLoopToggle.tsx +111 -0
- package/.claude/worktrees/phase-2-mcp/src/components/EnvironmentStatus.tsx +176 -0
- package/.claude/worktrees/phase-2-mcp/src/components/EvolutionBackground.tsx +1 -0
- package/.claude/worktrees/phase-2-mcp/src/components/ReactQueryProvider.tsx +24 -0
- package/.claude/worktrees/phase-2-mcp/src/components/Sidebar.tsx +247 -0
- package/.claude/worktrees/phase-2-mcp/src/components/SkillDiffViewer.tsx +154 -0
- package/.claude/worktrees/phase-2-mcp/src/components/ThemeAwareBackground.tsx +67 -0
- package/.claude/worktrees/phase-2-mcp/src/components/ThemeToggle.tsx +54 -0
- package/.claude/worktrees/phase-2-mcp/src/components/WelcomeHero.tsx +77 -0
- package/.claude/worktrees/phase-2-mcp/src/components/bits/ClickSpark.tsx +116 -0
- package/.claude/worktrees/phase-2-mcp/src/components/bits/CountUp.tsx +98 -0
- package/.claude/worktrees/phase-2-mcp/src/components/bits/DarkSelect.tsx +95 -0
- package/.claude/worktrees/phase-2-mcp/src/components/bits/DecryptedText.tsx +161 -0
- package/.claude/worktrees/phase-2-mcp/src/components/bits/ElectricBorder.tsx +184 -0
- package/.claude/worktrees/phase-2-mcp/src/components/bits/GlitchText.tsx +34 -0
- package/.claude/worktrees/phase-2-mcp/src/components/bits/ShinyText.tsx +55 -0
- package/.claude/worktrees/phase-2-mcp/src/components/bits/SpotlightCard.tsx +42 -0
- package/.claude/worktrees/phase-2-mcp/src/components/bits/TextType.tsx +95 -0
- package/.claude/worktrees/phase-2-mcp/src/components/bits/index.ts +9 -0
- package/.claude/worktrees/phase-2-mcp/src/components/pages/CuratorPage.tsx +632 -0
- package/.claude/worktrees/phase-2-mcp/src/components/pages/DatasetPage.tsx +271 -0
- package/.claude/worktrees/phase-2-mcp/src/components/pages/EvolutionPage.tsx +676 -0
- package/.claude/worktrees/phase-2-mcp/src/components/pages/FunctionCallingPage.tsx +1 -0
- package/.claude/worktrees/phase-2-mcp/src/components/pages/LogsPage.tsx +272 -0
- package/.claude/worktrees/phase-2-mcp/src/components/pages/MetricsPage.tsx +246 -0
- package/.claude/worktrees/phase-2-mcp/src/components/pages/OverviewPage.tsx +420 -0
- package/.claude/worktrees/phase-2-mcp/src/components/pages/SettingsPage.tsx +88 -0
- package/.claude/worktrees/phase-2-mcp/src/components/pages/SkillStudioPage.tsx +376 -0
- package/.claude/worktrees/phase-2-mcp/src/components/ui/animated-theme-toggler.tsx +97 -0
- package/.claude/worktrees/phase-2-mcp/src/components/ui/button.tsx +67 -0
- package/.claude/worktrees/phase-2-mcp/src/components/ui/card.tsx +103 -0
- package/.claude/worktrees/phase-2-mcp/src/components/ui/input.tsx +19 -0
- package/.claude/worktrees/phase-2-mcp/src/components/ui/separator.tsx +28 -0
- package/.claude/worktrees/phase-2-mcp/src/components/ui/sheet.tsx +147 -0
- package/.claude/worktrees/phase-2-mcp/src/components/ui/sidebar.tsx +702 -0
- package/.claude/worktrees/phase-2-mcp/src/components/ui/skeleton.tsx +13 -0
- package/.claude/worktrees/phase-2-mcp/src/components/ui/theme-toggle.tsx +272 -0
- package/.claude/worktrees/phase-2-mcp/src/components/ui/tooltip.tsx +57 -0
- package/.claude/worktrees/phase-2-mcp/src/hooks/use-mobile.ts +19 -0
- package/.claude/worktrees/phase-2-mcp/src/lib/api.ts +455 -0
- package/.claude/worktrees/phase-2-mcp/src/lib/queryClient.ts +12 -0
- package/.claude/worktrees/phase-2-mcp/src/lib/utils.ts +6 -0
- package/.claude/worktrees/phase-2-mcp/stitch/agent_dashboard/DESIGN_SPEC.md +521 -0
- package/.claude/worktrees/phase-2-mcp/stitch/agent_dashboard/prototype.html +676 -0
- package/.claude/worktrees/phase-2-mcp/stitch/curator_workspace/code.html +448 -0
- package/.claude/worktrees/phase-2-mcp/stitch/curator_workspace/screen.png +0 -0
- package/.claude/worktrees/phase-2-mcp/stitch/datasets/code.html +479 -0
- package/.claude/worktrees/phase-2-mcp/stitch/datasets/screen.png +0 -0
- package/.claude/worktrees/phase-2-mcp/stitch/evolution_history/code.html +461 -0
- package/.claude/worktrees/phase-2-mcp/stitch/evolution_history/screen.png +0 -0
- package/.claude/worktrees/phase-2-mcp/stitch/hermes_dashboard/DESIGN.md +192 -0
- package/.claude/worktrees/phase-2-mcp/stitch/hermes_dashboard/DESIGN_SPEC.md +455 -0
- package/.claude/worktrees/phase-2-mcp/stitch/hermes_overview/code.html +399 -0
- package/.claude/worktrees/phase-2-mcp/stitch/hermes_overview/screen.png +0 -0
- package/.claude/worktrees/phase-2-mcp/stitch/live_logs/code.html +324 -0
- package/.claude/worktrees/phase-2-mcp/stitch/live_logs/screen.png +0 -0
- package/.claude/worktrees/phase-2-mcp/stitch/skill_hub/code.html +596 -0
- package/.claude/worktrees/phase-2-mcp/stitch/skill_hub/screen.png +0 -0
- package/.claude/worktrees/phase-2-mcp/stitch/system_metrics/code.html +527 -0
- package/.claude/worktrees/phase-2-mcp/stitch/system_metrics/screen.png +0 -0
- package/.claude/worktrees/phase-2-mcp/stitch/system_settings/code.html +257 -0
- package/.claude/worktrees/phase-2-mcp/stitch/system_settings/screen.png +0 -0
- package/.claude/worktrees/phase-2-mcp/test_dashboard.py +201 -0
- package/.claude/worktrees/phase-2-mcp/tests/collectors/__init__.py +0 -0
- package/.claude/worktrees/phase-2-mcp/tests/collectors/fixtures/sample_session.jsonl +7 -0
- package/.claude/worktrees/phase-2-mcp/tests/collectors/test_claude_code_collector.py +171 -0
- package/.claude/worktrees/phase-2-mcp/tests/collectors/test_hermes_collector.py +167 -0
- package/.claude/worktrees/phase-2-mcp/tests/eval/test_engine.py +234 -0
- package/.claude/worktrees/phase-2-mcp/tests/eval/test_scorers.py +249 -0
- package/.claude/worktrees/phase-2-mcp/tests/storage/__init__.py +0 -0
- package/.claude/worktrees/phase-2-mcp/tests/storage/test_run_store.py +359 -0
- package/.claude/worktrees/phase-2-mcp/tests/test_curator.py +559 -0
- package/.claude/worktrees/phase-2-mcp/tests/test_mcp_server.py +114 -0
- package/.claude/worktrees/phase-2-mcp/tsconfig.json +34 -0
- package/.env.example +72 -0
- package/.kilocode/package-lock.json +378 -0
- package/.kilocode/package.json +5 -0
- package/AGENTS.md +5 -0
- package/CLAUDE.md +29 -0
- package/QA_AUDIT_PLAN.md +156 -0
- package/README.md +355 -0
- package/agent-agnostic-evolution-dashboard.md +405 -0
- package/backend/__init__.py +0 -0
- package/backend/collectors/__init__.py +0 -0
- package/backend/collectors/claude_code_collector.py +277 -0
- package/backend/collectors/hermes_collector.py +68 -0
- package/backend/curator.py +512 -0
- package/backend/eval/__init__.py +19 -0
- package/backend/eval/engine.py +116 -0
- package/backend/eval/scorers.py +201 -0
- package/backend/generate_dataset.py +86 -0
- package/backend/job_tracker.py +232 -0
- package/backend/main.py +1746 -0
- package/backend/mcp_server.py +250 -0
- package/backend/promethean/__init__.py +24 -0
- package/backend/promethean/cycle_orchestrator.py +270 -0
- package/backend/promethean/delta_validator.py +191 -0
- package/backend/promethean/dspy_compiler.py +315 -0
- package/backend/promethean/gepa_strategist.py +213 -0
- package/backend/promethean/models.py +260 -0
- package/backend/promethean/skill_deployer.py +195 -0
- package/backend/promethean/trace_ingestion.py +142 -0
- package/backend/requirements.txt +6 -0
- package/backend/sdd_evolve.py +459 -0
- package/backend/skill_detector.py +227 -0
- package/backend/skill_registry.py +289 -0
- package/backend/storage/__init__.py +5 -0
- package/backend/storage/run_store.py +393 -0
- package/backend/storage/schema.sql +99 -0
- package/backend/validate_evolution.py +267 -0
- package/bin/genoma.js +250 -0
- package/components.json +28 -0
- package/docs/api/hermes-api.openapi.yaml +438 -0
- package/docs/hero.svg +148 -0
- package/eslint.config.mjs +18 -0
- package/install.sh +245 -0
- package/next-env.d.ts +6 -0
- package/next.config.ts +32 -0
- package/package.json +46 -0
- package/pnpm-workspace.yaml +4 -0
- package/postcss.config.mjs +7 -0
- package/public/file.svg +1 -0
- package/public/fonts/SF-Pro-Display-Bold.otf +0 -0
- package/public/fonts/SF-Pro-Display-Heavy.otf +0 -0
- package/public/fonts/SF-Pro-Display-Medium.otf +0 -0
- package/public/fonts/SF-Pro-Display-Regular.otf +0 -0
- package/public/fonts/SF-Pro-Display-Semibold.otf +0 -0
- package/public/fonts/SF-Pro-Text-Bold.otf +0 -0
- package/public/fonts/SF-Pro-Text-Heavy.otf +0 -0
- package/public/fonts/SF-Pro-Text-Medium.otf +0 -0
- package/public/fonts/SF-Pro-Text-Regular.otf +0 -0
- package/public/fonts/SF-Pro-Text-Semibold.otf +0 -0
- package/public/globe.svg +1 -0
- package/public/next.svg +1 -0
- package/public/theme-preview.html +257 -0
- package/public/vercel.svg +1 -0
- package/public/window.svg +1 -0
- package/run.sh +26 -0
- package/scripts/postinstall.js +50 -0
- package/skills-lock.json +10 -0
- package/specs/event-schema.md +223 -0
- package/specs/examples/run.jsonl +3 -0
- package/src/app/api/[...path]/route.ts +55 -0
- package/src/app/api/auth/token/route.ts +22 -0
- package/src/app/evolution/page.tsx +589 -0
- package/src/app/favicon.ico +0 -0
- package/src/app/globals.css +321 -0
- package/src/app/layout.tsx +63 -0
- package/src/app/page.tsx +70 -0
- package/src/app/skills/page.tsx +369 -0
- package/src/components/ApiConfigCard.tsx +199 -0
- package/src/components/ColorBends.css +1 -0
- package/src/components/ColorBends.d.ts +1 -0
- package/src/components/ColorBends.jsx +1 -0
- package/src/components/CoreLoopToggle.tsx +111 -0
- package/src/components/EnvironmentStatus.tsx +176 -0
- package/src/components/EvolutionBackground.tsx +1 -0
- package/src/components/ReactQueryProvider.tsx +24 -0
- package/src/components/Sidebar.tsx +247 -0
- package/src/components/SkillDiffViewer.tsx +154 -0
- package/src/components/ThemeAwareBackground.tsx +67 -0
- package/src/components/ThemeToggle.tsx +54 -0
- package/src/components/WelcomeHero.tsx +77 -0
- package/src/components/bits/ClickSpark.tsx +116 -0
- package/src/components/bits/CountUp.tsx +98 -0
- package/src/components/bits/DarkSelect.tsx +95 -0
- package/src/components/bits/DecryptedText.tsx +161 -0
- package/src/components/bits/ElectricBorder.tsx +184 -0
- package/src/components/bits/GlitchText.tsx +34 -0
- package/src/components/bits/ShinyText.tsx +55 -0
- package/src/components/bits/SpotlightCard.tsx +42 -0
- package/src/components/bits/TextType.tsx +95 -0
- package/src/components/bits/index.ts +9 -0
- package/src/components/pages/CuratorPage.tsx +632 -0
- package/src/components/pages/DatasetPage.tsx +271 -0
- package/src/components/pages/EvolutionPage.tsx +676 -0
- package/src/components/pages/FunctionCallingPage.tsx +1 -0
- package/src/components/pages/LogsPage.tsx +272 -0
- package/src/components/pages/MetricsPage.tsx +246 -0
- package/src/components/pages/OverviewPage.tsx +420 -0
- package/src/components/pages/SettingsPage.tsx +88 -0
- package/src/components/pages/SkillStudioPage.tsx +376 -0
- package/src/components/ui/animated-theme-toggler.tsx +97 -0
- package/src/components/ui/button.tsx +67 -0
- package/src/components/ui/card.tsx +103 -0
- package/src/components/ui/input.tsx +19 -0
- package/src/components/ui/separator.tsx +28 -0
- package/src/components/ui/sheet.tsx +147 -0
- package/src/components/ui/sidebar.tsx +702 -0
- package/src/components/ui/skeleton.tsx +13 -0
- package/src/components/ui/theme-toggle.tsx +272 -0
- package/src/components/ui/tooltip.tsx +57 -0
- package/src/hooks/use-mobile.ts +19 -0
- package/src/lib/api.ts +455 -0
- package/src/lib/queryClient.ts +12 -0
- package/src/lib/utils.ts +6 -0
- package/stitch/agent_dashboard/DESIGN_SPEC.md +521 -0
- package/stitch/agent_dashboard/prototype.html +676 -0
- package/stitch/curator_workspace/code.html +448 -0
- package/stitch/curator_workspace/screen.png +0 -0
- package/stitch/datasets/code.html +479 -0
- package/stitch/datasets/screen.png +0 -0
- package/stitch/evolution_history/code.html +461 -0
- package/stitch/evolution_history/screen.png +0 -0
- package/stitch/hermes_dashboard/DESIGN.md +192 -0
- package/stitch/hermes_dashboard/DESIGN_SPEC.md +455 -0
- package/stitch/hermes_overview/code.html +399 -0
- package/stitch/hermes_overview/screen.png +0 -0
- package/stitch/live_logs/code.html +324 -0
- package/stitch/live_logs/screen.png +0 -0
- package/stitch/skill_hub/code.html +596 -0
- package/stitch/skill_hub/screen.png +0 -0
- package/stitch/system_metrics/code.html +527 -0
- package/stitch/system_metrics/screen.png +0 -0
- package/stitch/system_settings/code.html +257 -0
- package/stitch/system_settings/screen.png +0 -0
- package/test_dashboard.py +201 -0
- package/tests/collectors/__init__.py +0 -0
- package/tests/collectors/fixtures/sample_session.jsonl +7 -0
- package/tests/collectors/test_claude_code_collector.py +171 -0
- package/tests/collectors/test_hermes_collector.py +167 -0
- package/tests/eval/test_engine.py +234 -0
- package/tests/eval/test_scorers.py +249 -0
- package/tests/storage/__init__.py +0 -0
- package/tests/storage/test_run_store.py +359 -0
- package/tests/test_curator.py +559 -0
- package/tests/test_e2e_npm.py +621 -0
- package/tests/test_mcp_server.py +114 -0
- package/tsconfig.json +34 -0
package/QA_AUDIT_PLAN.md
ADDED
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
# Auditoría de Funcionalidad - Hermes Dashboard
|
|
2
|
+
|
|
3
|
+
## Contexto del Sistema
|
|
4
|
+
|
|
5
|
+
| Campo | Descripción |
|
|
6
|
+
|-------|-------------|
|
|
7
|
+
| **Propósito** | Dashboard de monitoreo y evolución autónoma de agentes IA |
|
|
8
|
+
| **Stack** | Next.js / React, TypeScript, Framer Motion |
|
|
9
|
+
| **Módulo auditado** | Varias páginas y componentes |
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Plan de Auditoría
|
|
14
|
+
|
|
15
|
+
### 1. Caminos Felices (Happy Path)
|
|
16
|
+
|
|
17
|
+
| Escenario de Prueba | Resultado Esperado | Riesgo Potencial | Sugerencia de Mejora |
|
|
18
|
+
|--------------------|--------------------|--------------------|--------------------|
|
|
19
|
+
| Carga inicial del dashboard | Página Overview carga con todas las métricas visibles | Bajo | - |
|
|
20
|
+
| Navegación entre páginas via Sidebar | Transición suave entre Overview, Evolution, Metrics, etc. | Bajo | Verificar lazy loading de páginas |
|
|
21
|
+
| Inicio de evolución de skill | Modal de Launch Evolution abre correctamente | Medio | Agregar validación de campos requeridos |
|
|
22
|
+
| Colapso/expansión del Sidebar | Animación fluida, estado persiste | Bajo | Guardar estado en localStorage |
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
### 2. Casos de Borde (Edge Cases)
|
|
27
|
+
|
|
28
|
+
| Escenario de Prueba | Resultado Esperado | Riesgo Potencial | Sugerencia de Mejora |
|
|
29
|
+
|--------------------|--------------------|--------------------|--------------------|
|
|
30
|
+
| API no responde (timeout) | Mostrar mensaje de error con opción de reintentar | Alto | Implementar retry con backoff exponencial |
|
|
31
|
+
| Métricas con valores nulos/undefined | Mostrar "N/A" o "-" en lugar de crash | Alto | Agregar default values en fetchMetrics |
|
|
32
|
+
| Strings excesivamente largos en logs | Truncar con "..." y tooltip completo | Medio | Implementar ellipsis con hover expandable |
|
|
33
|
+
| Sidebar en viewport muy pequeño (<320px) | Ocultar texto, mostrar solo iconos | Medio | Testear en viewport iPhone SE |
|
|
34
|
+
| Navegación durante carga de datos | Mostrar loader sin duplicar requests | Medio | Cancelar requests pendientes con AbortController |
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
### 3. Lógica de Negocio
|
|
39
|
+
|
|
40
|
+
| Escenario de Prueba | Resultado Esperado | Riesgo Potencial | Sugerencia de Mejora |
|
|
41
|
+
|--------------------|--------------------|--------------------|--------------------|
|
|
42
|
+
| Skill sin nombre | Rechazar con mensaje de validación | Alto | Validación en frontend + backend |
|
|
43
|
+
| Permisos insuficientes para acción | Mostrar error 403, deshabilitar botón | Alto | Verificar RBAC en API routes |
|
|
44
|
+
| Evolución ya en proceso | Deshabilitar botón "Launch", mostrar estado | Medio | Poll estado hasta completarse |
|
|
45
|
+
| Cálculo de métricas (uptime, success rate) | Fórmulas correctas con edge cases (div/0) | Medio | Manejar división por cero |
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
### 4. Consistencia de UI/UX
|
|
50
|
+
|
|
51
|
+
| Escenario de Prueba | Resultado Esperado | Riesgo Potencial | Sugerencia de Mejora |
|
|
52
|
+
|--------------------|--------------------|--------------------|--------------------|
|
|
53
|
+
| Tema claro/oscuro (si aplica) | Colores consistentes en todos los componentes | Medio | Crear constantes de tema centralizadas |
|
|
54
|
+
| Indicadores de carga | Spinner/skeleton visible durante fetches | Medio | Implementar loading states globales |
|
|
55
|
+
| Notificaciones toast | Aparece y desaparece sin romper layout | Bajo | Usar portal para toasts |
|
|
56
|
+
| Scroll en listas largas | Performance aceptable sin jank | Medio | Implementar virtualización si >100 items |
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
### 5. Negative Testing
|
|
61
|
+
|
|
62
|
+
| Escenario de Prueba | Resultado Esperado | Riesgo Potencial | Sugerencia de Mejora |
|
|
63
|
+
|--------------------|--------------------|--------------------|--------------------|
|
|
64
|
+
| Inyección de código en inputs | Sanitizar output, no ejecutar | Alto | Escapar caracteres especiales |
|
|
65
|
+
| Requests malformados a API | Retornar error 400 con mensaje claro | Alto | Validación Zod en API |
|
|
66
|
+
| Manipulación de estado via DevTools | Revertir a estado válido | Alto | Verificaciones en backend |
|
|
67
|
+
| Carga de archivos binarios como logs | Ignorar o mostrar error | Medio | Validar content-type |
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
### 6. Validación de Estado
|
|
72
|
+
|
|
73
|
+
| Escenario de Prueba | Resultado Esperado | Riesgo Potencial | Sugerencia de Mejora |
|
|
74
|
+
|--------------------|--------------------|--------------------|--------------------|
|
|
75
|
+
| Refresco de página | Estado de sidebar persiste, no reinicia | Medio | Sincronizar con URL params o Context |
|
|
76
|
+
| Browser back/forward | Historial de navegación funcional | Bajo | - |
|
|
77
|
+
| Desconexión de red durante operación | Estado local preservado, sync al reconectar | Alto | Implementar offline queue |
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
## Casos de Prueba - Formato Gherkin
|
|
82
|
+
|
|
83
|
+
### Feature: Navegación del Dashboard
|
|
84
|
+
|
|
85
|
+
```gherkin
|
|
86
|
+
Feature: Navegación entre páginas
|
|
87
|
+
Scenario: Usuario navega a página de Evolution
|
|
88
|
+
Given Usuario está en OverviewPage
|
|
89
|
+
When Usuario hace click en "Evolution" en el sidebar
|
|
90
|
+
Then URL cambia a /evolution
|
|
91
|
+
And EvolutionPage se muestra con animación de entrada
|
|
92
|
+
|
|
93
|
+
Scenario: Usuario colapsa el sidebar
|
|
94
|
+
Given Sidebar está expandido
|
|
95
|
+
When Usuario hace click en botón de colapsar
|
|
96
|
+
Then Sidebar se reduce a iconos
|
|
97
|
+
And Iconos permanecen visibles
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
### Feature: Evolución de Skills
|
|
101
|
+
|
|
102
|
+
```gherkin
|
|
103
|
+
Feature: Launch Evolution
|
|
104
|
+
Scenario: Evolución exitosa
|
|
105
|
+
Given Campos de skill están completos
|
|
106
|
+
When Usuario clickea "Launch Evolution"
|
|
107
|
+
Then Modal muestra loading spinner
|
|
108
|
+
And Botón se deshabilita
|
|
109
|
+
And Después de éxito, mostrar toast "Evolution started"
|
|
110
|
+
|
|
111
|
+
Scenario: Campo requerido faltante
|
|
112
|
+
Given Campo "Skill" está vacío
|
|
113
|
+
When Usuario clickea "Launch Evolution"
|
|
114
|
+
Then Mostrar error "Skill es requerido"
|
|
115
|
+
And Modal permanece abierto
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
### Feature: Manejo de Errores
|
|
119
|
+
|
|
120
|
+
```gherkin
|
|
121
|
+
Feature: Respuestas de API
|
|
122
|
+
Scenario: API timeout
|
|
123
|
+
Given API no responde en 10 segundos
|
|
124
|
+
When Usuario está esperando datos
|
|
125
|
+
Then Mostrar "Connection timeout. Retry?"
|
|
126
|
+
And Botón de reintentar visible
|
|
127
|
+
|
|
128
|
+
Scenario: Error 500 del servidor
|
|
129
|
+
Given API retorna 500 Internal Server Error
|
|
130
|
+
When Usuario recibe respuesta
|
|
131
|
+
Then Mostrar "Something went wrong"
|
|
132
|
+
And Log error para debugging
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
---
|
|
136
|
+
|
|
137
|
+
## Priorización de Pruebas
|
|
138
|
+
|
|
139
|
+
| Prioridad | Tipo de Prueba | Tiempo Estimado |
|
|
140
|
+
|----------|--------------|---------------|
|
|
141
|
+
| P0 - Crítico | Happy path básico, manejo de errores API | 2h |
|
|
142
|
+
| P1 - Alto | Edge cases, validación de estado | 3h |
|
|
143
|
+
| P2 - Medio | Negative testing, consistencia UI | 2h |
|
|
144
|
+
| P3 - Bajo | Edge cases visuales, optimizaciones | 1h |
|
|
145
|
+
|
|
146
|
+
---
|
|
147
|
+
|
|
148
|
+
## Checklist de Ejecución
|
|
149
|
+
|
|
150
|
+
- [ ] Verificar build pasa sin errores
|
|
151
|
+
- [ ] Verificar TypeScript sin errors
|
|
152
|
+
- [ ] Probar en viewport móvil (375px, 768px, 1440px)
|
|
153
|
+
- [ ] Probar sin conexión de red (Network throttling)
|
|
154
|
+
- [ ] Verificar consola sin errores en producción
|
|
155
|
+
- [ ] Audit accessibility (contraste, keyboard nav)
|
|
156
|
+
- [ ] Verificar performance (LCP < 2.5s)
|
package/README.md
ADDED
|
@@ -0,0 +1,355 @@
|
|
|
1
|
+
# 🧬 Genoma — Agent-Agnostic Evolution Dashboard
|
|
2
|
+
|
|
3
|
+
**Autonomous Evolution Interface** — Cross-agent observability, evaluation, and evolution dashboard for any AI coding agent (Claude Code, Hermes, Codex, OpenCode, etc.).
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## ❓ ¿Qué es?
|
|
8
|
+
|
|
9
|
+
Genoma es la interfaz web que permite **monitorear, evaluar y evolucionar** runs de cualquier agente AI en tiempo real. Agnóstico a provider: funciona con Claude Code, Hermes, Codex, o cualquier agente que genere traces. Conecta con el backend FastAPI (:8000) y expone:
|
|
10
|
+
|
|
11
|
+
- **Overview** — Métricas globales, estado del backend, últimos evolution runs
|
|
12
|
+
- **Skill Hub** — Catálogo multi-provider de 229+ skills, toggle enable/disable
|
|
13
|
+
- **Evolution** — Lanzar y monitorear evoluciones DSPy+GEPA con约束es de seguridad
|
|
14
|
+
- **Datasets** — Gestión de datasets de prueba y holdout para validación
|
|
15
|
+
- **Metrics** — Scores, tasas de éxito, tiempos, deltas before/after
|
|
16
|
+
- **Live Logs** — Streaming en tiempo real vía WebSocket
|
|
17
|
+
- **Curator** — Lifecycle management (active → stale → archive) con pin/restore
|
|
18
|
+
- **Settings** — Configuración del ecosistema
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## 🎯 ¿Qué resuelve?
|
|
23
|
+
|
|
24
|
+
| Problema | Solución |
|
|
25
|
+
|---|---|
|
|
26
|
+
| Skills estancadas sin mejora medible | Evolution automatizada con DSPy — mide delta (before → after) no scores absolutos |
|
|
27
|
+
| Catálogo caótico (229+ skills) | Curator: clasifica active/stale/archived, detecta skills sin uso, consolida duplicados |
|
|
28
|
+
| Zero observabilidad de agentes | Métricas en tiempo real, WebSocket streaming, Promethean traces |
|
|
29
|
+
| Validación débil (sin holdout) | Datasets con splits train/test, LLM Judge para evaluar evoluciones |
|
|
30
|
+
| Setup frágil | Health check automático, Circuit Breaker, auto-reconnect |
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## 🚀 Instalación & Startup
|
|
35
|
+
|
|
36
|
+
### NPM CLI (Recomendado — usuarios)
|
|
37
|
+
|
|
38
|
+
Instala Genoma globalmente desde npm registry:
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
npx genoma@latest serve
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Esto:
|
|
45
|
+
- ✅ Instala dependencias (Node.js, Python 3.10+, pnpm)
|
|
46
|
+
- ✅ Inicia backend en `http://localhost:8000`
|
|
47
|
+
- ✅ Inicia frontend en `http://localhost:3000`
|
|
48
|
+
- ✅ Inicia MCP server en stdio (para agents)
|
|
49
|
+
- ✅ Maneja shutdown graceful en Ctrl+C
|
|
50
|
+
|
|
51
|
+
**Requisitos:**
|
|
52
|
+
- Node.js 18+
|
|
53
|
+
- Python 3.10+
|
|
54
|
+
- `ANTHROPIC_API_KEY` (u otras API keys para evolution)
|
|
55
|
+
|
|
56
|
+
### Local Development (./run.sh)
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
./run.sh
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Inicia backend (:8000) + frontend (:3000) + MCP en paralelo. Ctrl+C kills todos.
|
|
63
|
+
|
|
64
|
+
### Manual setup
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
# Terminal 1: Backend
|
|
68
|
+
python3 -m pip install fastapi uvicorn pydantic python-dotenv --break-system-packages -q
|
|
69
|
+
python3 -m uvicorn backend.main:app --reload --port 8000
|
|
70
|
+
|
|
71
|
+
# Terminal 2: Frontend
|
|
72
|
+
pnpm install --ignore-scripts
|
|
73
|
+
pnpm dev # → http://localhost:3000
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
### Build para producción
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
pnpm build # TypeScript + Turbopack, 0 errores
|
|
80
|
+
pnpm start # Production server
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### Configuración requerida (para evolución de skills)
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
export ANTHROPIC_API_KEY="sk-ant-..."
|
|
87
|
+
# O OPENROUTER_API_KEY, OPENAI_API_KEY, etc.
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
## 🔌 MCP / Comunicación
|
|
93
|
+
|
|
94
|
+
Genoma expone 3 canales de comunicación:
|
|
95
|
+
|
|
96
|
+
### MCP Server (stdio) — Para Agents
|
|
97
|
+
|
|
98
|
+
Agents (Claude Code, Codex, etc.) se conectan via MCP protocol (stdio transport). 4 tools disponibles:
|
|
99
|
+
|
|
100
|
+
| Tool | Input | Output |
|
|
101
|
+
|---|---|---|
|
|
102
|
+
| `ingest_run` | `run_id`, `agent_name`, `started_at`, `task_name`, `outcome` + optionals | Inserted/updated run ID |
|
|
103
|
+
| `ingest_trace` | `agent`, `agent_version`, `timestamp`, `task`, `outcome` + optionals | Trace ID + canonical run ID |
|
|
104
|
+
| `query_runs` | `agent_name`, `outcome`, `repo`, `since`, `until`, `limit` (optional) | Array of past runs |
|
|
105
|
+
| `get_agent_stats` | `agent_name` (optional) | Per-agent performance summary |
|
|
106
|
+
|
|
107
|
+
Ejemplo (Claude Code):
|
|
108
|
+
```bash
|
|
109
|
+
# Genoma MCP server runs automatically when you do: npx genoma serve
|
|
110
|
+
# Claude Code agent can then invoke tools via stdio
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
El dashboard se comunica con el backend por 2 canales adicionales:
|
|
114
|
+
|
|
115
|
+
### REST API (`http://localhost:8000`)
|
|
116
|
+
|
|
117
|
+
| Endpoint | Verbo | Descripción |
|
|
118
|
+
|---|---|---|
|
|
119
|
+
| `/api/health` | `GET` | Health check (skills count, categorías) |
|
|
120
|
+
| `/api/metrics` | `GET` | Métricas agregadas (runs, tasa éxito, avg improvement) |
|
|
121
|
+
| `/api/skills` | `GET` | Lista plana de skills |
|
|
122
|
+
| `/api/skills/providers` | `GET` | Skills agrupadas por provider |
|
|
123
|
+
| `/api/skills/{name}` | `GET` | Detalle completo (frontmatter + body) |
|
|
124
|
+
| `/api/skills/toggle` | `POST` | Enable/disable skill por provider |
|
|
125
|
+
| `/api/skills/refresh` | `GET` | Re-scan del filesystem |
|
|
126
|
+
| `/api/evolution/start` | `POST` | Lanzar evolución (`skill_name`, `iterations`) |
|
|
127
|
+
| `/api/evolution/runs` | `GET` | Historial de runs |
|
|
128
|
+
| `/api/evolution/validate/{name}` | `POST` | Validar constraints pre-evolución |
|
|
129
|
+
| `/api/jobs` | `GET` | Jobs activos/completados |
|
|
130
|
+
| `/api/jobs/{id}` | `DELETE` | Cancelar job |
|
|
131
|
+
| `/api/jobs/{id}/logs` | `GET` | Logs live de un job |
|
|
132
|
+
| `/api/datasets` | `GET` | Datasets disponibles |
|
|
133
|
+
| `/api/datasets/{skill}` | `GET` | Splits (train/holdout) de un dataset |
|
|
134
|
+
| `/api/curator/status` | `GET` | Estado del curator (active/stale/archived counts) |
|
|
135
|
+
| `/api/curator/skills` | `GET` | Skills con metadata de uso |
|
|
136
|
+
| `/api/curator/run` | `POST` | Ejecutar curator (clasifica + archiva) |
|
|
137
|
+
| `/api/curator/pin/{skill}` | `POST` | Pinear skill (inmune a archive) |
|
|
138
|
+
| `/api/curator/restore/{skill}` | `POST` | Restaurar skill archivada |
|
|
139
|
+
| `/api/memory` | `GET` | Memoria persistente del agente |
|
|
140
|
+
| `/api/graph` | `GET` | Knowledge graph |
|
|
141
|
+
| `/api/promethean/traces` | `POST` | Enviar trace de ejecución |
|
|
142
|
+
| `/api/promethean/status` | `GET` | Estado del ciclo Promethean |
|
|
143
|
+
| `/api/runs` | `GET` | Lista canonical runs (agent, outcome, repo, limit) |
|
|
144
|
+
| `/api/runs/{id}` | `GET` | Run detallado con métricas + errors |
|
|
145
|
+
| `/api/agents` | `GET` | Resumen por agente (count, success_rate, tokens) |
|
|
146
|
+
| `/api/runs/migrate` | `POST` | Migrar runs Hermes + Claude Code a SQLite |
|
|
147
|
+
| `/api/runs/{id}/evaluate` | `POST` | Evaluar run con scorers composables |
|
|
148
|
+
| `/api/runs/{id}/scores` | `GET` | Scores de evaluación guardados |
|
|
149
|
+
| `/api/runs/compare` | `POST` | Regression detection (baseline vs evolved) |
|
|
150
|
+
| `/api/skills/{name}/evolve` | `POST` | Evolucionar skill con SDD optimizer |
|
|
151
|
+
|
|
152
|
+
### WebSocket (`ws://localhost:8000/ws/stream`)
|
|
153
|
+
|
|
154
|
+
Streaming en tiempo real de eventos del backend. El dashboard se auto-reconecta cada 3s si se cae.
|
|
155
|
+
|
|
156
|
+
### Next.js Proxy (`/api/*`)
|
|
157
|
+
|
|
158
|
+
El `app/api/[...path]/route.ts` actúa como catch-all proxy hacia `http://localhost:8000/api/*`, permitiendo llamadas relativas desde el frontend sin CORS.
|
|
159
|
+
|
|
160
|
+
---
|
|
161
|
+
|
|
162
|
+
## ✨ Características
|
|
163
|
+
|
|
164
|
+
- 🧬 **Genoma Design System** — `#002444` (Navy), `#a93800` (Orange), `#fcf9f8` (Warm White)
|
|
165
|
+
- 🔤 **Inter** (rsms/inter, variable font) + Geist Mono
|
|
166
|
+
- 🧩 **shadcn/ui v4** — Sidebar colapsable a iconos, tooltips, sheets, cards
|
|
167
|
+
- 🌓 **Dark mode** — Script inline anti-FOUC + animated toggler
|
|
168
|
+
- 📐 **Pretext.js** — Text layout measurement sin DOM
|
|
169
|
+
- ⚡ **CountUp** — Animaciones de números con `useState`
|
|
170
|
+
- 🎯 **SpotlightCard** — Efecto hover con gradiente radial
|
|
171
|
+
- 📡 **WebSocket** — Auto-reconnect con token de sesión
|
|
172
|
+
- 🛡️ **Circuit Breaker** — Health check + banner "Backend Unavailable" + retry
|
|
173
|
+
- 📱 **Responsive** — Sidebar drawer en mobile (vía shadcn Sheet)
|
|
174
|
+
|
|
175
|
+
---
|
|
176
|
+
|
|
177
|
+
## 📦 Stack
|
|
178
|
+
|
|
179
|
+
| Capa | Tecnología |
|
|
180
|
+
|---|---|
|
|
181
|
+
| Framework | Next.js 16.2.4 (Turbopack) |
|
|
182
|
+
| Estilos | Tailwind CSS v4 + `tw-animate-css` |
|
|
183
|
+
| Componentes | shadcn/ui v4 (`radix-nova`) |
|
|
184
|
+
| Fuente | Inter variable (`next/font/google`) |
|
|
185
|
+
| Animaciones | Framer Motion 12.x |
|
|
186
|
+
| Datos | TanStack React Query 5 |
|
|
187
|
+
| Iconos | Lucide React |
|
|
188
|
+
| Medición texto | Pretext.js 0.0.6 |
|
|
189
|
+
| Tema | next-themes (`genoma-theme`) |
|
|
190
|
+
|
|
191
|
+
---
|
|
192
|
+
|
|
193
|
+
## 🎨 Design Rules (GENOMA.md)
|
|
194
|
+
|
|
195
|
+
1. **No-Line Rule** — Sin bordes `1px`. Separación por shifts de background + espaciado
|
|
196
|
+
2. **Glass & Gradient** — Headers `backdrop-blur-xl`, CTAs gradiente `135deg`
|
|
197
|
+
3. **Shadow Rule** — `editorial-shadow`: `0px 20px 40px rgba(28,27,27,0.06)`
|
|
198
|
+
4. **No-Divider Rule** — Ítems separados solo por espaciado vertical
|
|
199
|
+
|
|
200
|
+
---
|
|
201
|
+
|
|
202
|
+
## Agent-Agnostic Evolution Layer
|
|
203
|
+
|
|
204
|
+
Extensión del sistema original para soportar cualquier agente (Claude Code, Codex, OpenCode) usando el mismo motor de evaluación que Hermes. Los datos de cualquier agente se normalizan a `CanonicalRun` y se evalúan con los mismos scorers.
|
|
205
|
+
|
|
206
|
+
### Cómo genera las evaluaciones: Promethean + GEPA + DSPy
|
|
207
|
+
|
|
208
|
+
#### 1. Promethean (Sistema base)
|
|
209
|
+
|
|
210
|
+
Promethean es la capa de evaluación de Hermes. Define el contrato entre ejecución y validación:
|
|
211
|
+
|
|
212
|
+
- `TraceRecord`: Modelo canónico de una traza de ejecución
|
|
213
|
+
- `TraceIngestor`: Recolecta trazas desde `~/.hermes/traces/ingested/`
|
|
214
|
+
- `DeltaValidator`: Valida skills usando un dataset con split holdout
|
|
215
|
+
|
|
216
|
+
#### 2. GEPA (Modelo matemático de evaluación)
|
|
217
|
+
|
|
218
|
+
GEPA (Generic Evolutionary Pattern Analyzer) implementa un ciclo de mejora iterativa basado en **holdout validation con comparación delta**:
|
|
219
|
+
|
|
220
|
+
```
|
|
221
|
+
Dataset = train_set + holdout_set (holdout ≈ 30% por defecto)
|
|
222
|
+
|
|
223
|
+
Baseline:
|
|
224
|
+
success_rate_baseline = count(resolved) / count(holdout)
|
|
225
|
+
|
|
226
|
+
Evolved (post-compilación DSPy):
|
|
227
|
+
success_rate_evolved = baseline + compilation.delta
|
|
228
|
+
|
|
229
|
+
Delta:
|
|
230
|
+
Δ[metric] = evolved[metric] - baseline[metric]
|
|
231
|
+
|
|
232
|
+
Gate de aceptación:
|
|
233
|
+
passed = |Δ[primary_metric]| ≥ threshold
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
**Nota importante:** La simulación actual es aritmética — usa el `compilation.delta` que reporta DSPy sobre el baseline. No ejecuta el skill real contra el holdout. En producción esto debería ejecutar el skill compilado directamente.
|
|
237
|
+
|
|
238
|
+
#### 3. DSPy (Optimizer de prompts)
|
|
239
|
+
|
|
240
|
+
DSPy optimiza las instrucciones del skill usando métodos que no requieren gradientes (LLMs son non-differentiable):
|
|
241
|
+
|
|
242
|
+
- **Bootstrap Few-Shot**: Muestrea ejemplos del dataset, los ejecuta, filtra por métrica, usa top-k como demonstrations
|
|
243
|
+
- **MIPRO**: Bayesian optimization sobre el espacio de instrucciones del prompt
|
|
244
|
+
- `compilation.delta` = mejora de métrica que el optimizer reportó
|
|
245
|
+
|
|
246
|
+
DSPy no ejecuta el modelo directamente — compila el programa de prompts para maximizar una función de métrica M(ejemplo, predicción) ∈ [0, 1].
|
|
247
|
+
|
|
248
|
+
#### 4. DeltaScorer (Integración en evaluation engine)
|
|
249
|
+
|
|
250
|
+
El `DeltaScorer` del evaluation engine es el puente entre DSPy/GEPA y el sistema de scoring agnóstico:
|
|
251
|
+
|
|
252
|
+
```python
|
|
253
|
+
# Solo aplica a Hermes runs con context.skill_name
|
|
254
|
+
def applies_to(run: CanonicalRun) -> bool:
|
|
255
|
+
return run.agent_name == "hermes" and "skill_name" in run.context
|
|
256
|
+
|
|
257
|
+
# Wraps DeltaValidator.validate()
|
|
258
|
+
def score(run: CanonicalRun) -> EvalScore:
|
|
259
|
+
result = validator.validate(skill_name, baseline)
|
|
260
|
+
score = 1.0 if result["passed"] else 0.0
|
|
261
|
+
return EvalScore(scorer="delta", score=score, passed=result["passed"])
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
---
|
|
265
|
+
|
|
266
|
+
### Agent-Agnostic Architecture
|
|
267
|
+
|
|
268
|
+
```
|
|
269
|
+
COLLECTORS (normalizan trazas propias de cada agente)
|
|
270
|
+
HermesCollector ── TraceRecord → CanonicalRun
|
|
271
|
+
ClaudeCodeCollector ── JSONL session events → CanonicalRun
|
|
272
|
+
(extensible)
|
|
273
|
+
|
|
274
|
+
│
|
|
275
|
+
▼ CanonicalRun (schema canónico)
|
|
276
|
+
│ run_id, agent_name, collector, outcome,
|
|
277
|
+
│ tool_calls[], metrics{}, errors[], context{}
|
|
278
|
+
│
|
|
279
|
+
▼
|
|
280
|
+
|
|
281
|
+
STORAGE (SQLite, WAL mode)
|
|
282
|
+
runs / tool_calls / run_metrics / run_errors / eval_scores
|
|
283
|
+
|
|
284
|
+
│
|
|
285
|
+
▼
|
|
286
|
+
|
|
287
|
+
EVALUATION ENGINE (scorers composables)
|
|
288
|
+
OutcomeScorer success=1.0, partial=0.5, failure=0.0
|
|
289
|
+
ToolEfficiencyScorer unique_tools / total_calls (threshold > 0.3)
|
|
290
|
+
TokenCostScorer max(0, 1 - tokens/50000)
|
|
291
|
+
ErrorRecoveryScorer success_no_errors=1.0, success_with_errors=0.8
|
|
292
|
+
DeltaScorer wraps DeltaValidator (solo Hermes)
|
|
293
|
+
|
|
294
|
+
aggregate_score = mean(scores aplicables)
|
|
295
|
+
|
|
296
|
+
detect_regression:
|
|
297
|
+
delta = evolved_aggregate - baseline_aggregate
|
|
298
|
+
regression = delta < -threshold
|
|
299
|
+
improvement = delta > threshold
|
|
300
|
+
neutral = |delta| ≤ threshold
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
### Nuevos API Endpoints
|
|
304
|
+
|
|
305
|
+
| Endpoint | Verbo | Descripción |
|
|
306
|
+
|---|---|---|
|
|
307
|
+
| `/api/runs` | `GET` | Lista runs con filtros: agent, outcome, repo, since, until, limit |
|
|
308
|
+
| `/api/runs/{id}` | `GET` | Run detallado con metrics, tool_calls, errors |
|
|
309
|
+
| `/api/runs/{id}/evaluate` | `POST` | Corre scorers sobre el run, devuelve scores + aggregate |
|
|
310
|
+
| `/api/runs/{id}/scores` | `GET` | Scores de evaluación guardados en DB |
|
|
311
|
+
| `/api/runs/compare` | `POST` | Regression detection: baseline vs evolved (threshold configurable) |
|
|
312
|
+
| `/api/agents` | `GET` | Stats por agente: count, success_rate, avg_tokens |
|
|
313
|
+
| `/api/runs/migrate` | `POST` | Migra traces existentes (Hermes + Claude Code) a SQLite |
|
|
314
|
+
|
|
315
|
+
### Adding a New Collector
|
|
316
|
+
|
|
317
|
+
```python
|
|
318
|
+
# 1. Crear backend/collectors/my_collector.py
|
|
319
|
+
class MyCollector:
|
|
320
|
+
AGENT_NAME = "my-agent"
|
|
321
|
+
VERSION = "0.1.0"
|
|
322
|
+
|
|
323
|
+
def collect_session(self, source: Path) -> Optional[CanonicalRun]:
|
|
324
|
+
# Parsear source, extraer campos requeridos
|
|
325
|
+
return CanonicalRun(
|
|
326
|
+
run_id=...,
|
|
327
|
+
agent_name=self.AGENT_NAME,
|
|
328
|
+
collector=f"{self.AGENT_NAME}-collector",
|
|
329
|
+
started_at=...,
|
|
330
|
+
task_name=...,
|
|
331
|
+
outcome=...,
|
|
332
|
+
# campos opcionales: tool_calls, metrics, errors, etc.
|
|
333
|
+
)
|
|
334
|
+
|
|
335
|
+
# 2. Agregar tests en tests/collectors/test_my_collector.py
|
|
336
|
+
# 3. Agregar endpoint en backend/main.py
|
|
337
|
+
```
|
|
338
|
+
|
|
339
|
+
### Adding a New Scorer
|
|
340
|
+
|
|
341
|
+
```python
|
|
342
|
+
# Agregar en backend/eval/scorers.py
|
|
343
|
+
class MyScorer:
|
|
344
|
+
name = "my_scorer"
|
|
345
|
+
|
|
346
|
+
def score(self, run: CanonicalRun) -> EvalScore:
|
|
347
|
+
score = ... # 0.0 a 1.0
|
|
348
|
+
return EvalScore(scorer=self.name, score=score, passed=score > 0.5)
|
|
349
|
+
|
|
350
|
+
def applies_to(self, run: CanonicalRun) -> bool:
|
|
351
|
+
return True # o condición específica
|
|
352
|
+
|
|
353
|
+
# Pasar custom scorers al engine:
|
|
354
|
+
engine = EvaluationEngine(store=store, scorers=[MyScorer(), OutcomeScorer()])
|
|
355
|
+
```
|