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.
Files changed (445) hide show
  1. package/.brv/.obsidian/app.json +1 -0
  2. package/.brv/.obsidian/appearance.json +1 -0
  3. package/.brv/.obsidian/core-plugins.json +33 -0
  4. package/.brv/.obsidian/graph.json +22 -0
  5. package/.brv/.obsidian/workspace.json +195 -0
  6. package/.brv/Sin ti/314/201tulo 1.canvas" +1 -0
  7. package/.brv/Sin ti/314/201tulo 2.canvas" +1 -0
  8. package/.brv/Sin ti/314/201tulo.canvas" +1 -0
  9. package/.brv/_queue_status.json +1 -0
  10. package/.brv/config.json +5 -0
  11. package/.brv/context-tree/_index.md +60 -0
  12. package/.brv/context-tree/_manifest.json +165 -0
  13. package/.brv/context-tree/backend/_index.md +24 -0
  14. package/.brv/context-tree/backend/backend/_index.md +40 -0
  15. package/.brv/context-tree/backend/backend/init.abstract.md +0 -0
  16. package/.brv/context-tree/backend/backend/init.md +27 -0
  17. package/.brv/context-tree/backend/backend/init.overview.md +29 -0
  18. package/.brv/context-tree/backend/backend/job_tracker.abstract.md +1 -0
  19. package/.brv/context-tree/backend/backend/job_tracker.md +273 -0
  20. package/.brv/context-tree/backend/backend/job_tracker.overview.md +31 -0
  21. package/.brv/context-tree/backend/backend/main.abstract.md +0 -0
  22. package/.brv/context-tree/backend/backend/main.md +1292 -0
  23. package/.brv/context-tree/backend/backend/main.overview.md +30 -0
  24. package/.brv/context-tree/backend/backend/requirements.abstract.md +1 -0
  25. package/.brv/context-tree/backend/backend/requirements.md +37 -0
  26. package/.brv/context-tree/backend/backend/requirements.overview.md +28 -0
  27. package/.brv/context-tree/docs/_index.md +37 -0
  28. package/.brv/context-tree/docs/api/_index.md +54 -0
  29. package/.brv/context-tree/docs/api/context.md +11 -0
  30. package/.brv/context-tree/docs/api/hermes_api_openapi_specification.abstract.md +0 -0
  31. package/.brv/context-tree/docs/api/hermes_api_openapi_specification.md +468 -0
  32. package/.brv/context-tree/docs/api/hermes_api_openapi_specification.overview.md +44 -0
  33. package/.brv/context-tree/frontend/_index.md +48 -0
  34. package/.brv/context-tree/frontend/hermes_dashboard/_index.md +31 -0
  35. package/.brv/context-tree/frontend/hermes_dashboard/architecture_overview.abstract.md +0 -0
  36. package/.brv/context-tree/frontend/hermes_dashboard/architecture_overview.md +41 -0
  37. package/.brv/context-tree/frontend/hermes_dashboard/architecture_overview.overview.md +34 -0
  38. package/.brv/context-tree/frontend/src/_index.md +53 -0
  39. package/.brv/context-tree/frontend/src/components/_index.md +52 -0
  40. package/.brv/context-tree/frontend/src/components/sidebar_navigation_component.abstract.md +0 -0
  41. package/.brv/context-tree/frontend/src/components/sidebar_navigation_component.md +161 -0
  42. package/.brv/context-tree/frontend/src/components/sidebar_navigation_component.overview.md +32 -0
  43. package/.brv/context-tree/frontend/src/context.md +10 -0
  44. package/.brv/context-tree/frontend/src/functioncallingpage.abstract.md +0 -0
  45. package/.brv/context-tree/frontend/src/functioncallingpage.md +34 -0
  46. package/.brv/context-tree/frontend/src/functioncallingpage.overview.md +26 -0
  47. package/.brv/context-tree/frontend/src/lib/_index.md +48 -0
  48. package/.brv/context-tree/frontend/src/lib/api_client_library.abstract.md +1 -0
  49. package/.brv/context-tree/frontend/src/lib/api_client_library.md +403 -0
  50. package/.brv/context-tree/frontend/src/lib/api_client_library.overview.md +69 -0
  51. package/.brv/context-tree/frontend/src/page.abstract.md +0 -0
  52. package/.brv/context-tree/frontend/src/page.md +103 -0
  53. package/.brv/context-tree/frontend/src/page.overview.md +7 -0
  54. package/.brv/context-tree/frontend/src/settingspage.abstract.md +0 -0
  55. package/.brv/context-tree/frontend/src/settingspage.md +124 -0
  56. package/.brv/context-tree/frontend/src/settingspage.overview.md +34 -0
  57. package/.brv/context-tree/frontend/src/sidebar.abstract.md +0 -0
  58. package/.brv/context-tree/frontend/src/sidebar.md +170 -0
  59. package/.brv/context-tree/frontend/src/sidebar.overview.md +25 -0
  60. package/.brv/context-tree/meta/_index.md +24 -0
  61. package/.brv/context-tree/meta/curation_context/_index.md +24 -0
  62. package/.brv/context-tree/meta/curation_context/empty_context.abstract.md +4 -0
  63. package/.brv/context-tree/meta/curation_context/empty_context.md +35 -0
  64. package/.brv/context-tree/meta/curation_context/empty_context.overview.md +20 -0
  65. package/.brv/dream-log/drm-1777341062653.json +33 -0
  66. package/.brv/dream-state.json +8 -0
  67. package/.brv/dream.lock +0 -0
  68. package/.brv/review-backups/docs/api/hermes_api_openapi_specification.md +468 -0
  69. package/.claude/settings.local.json +7 -0
  70. package/.claude/worktrees/phase-2-mcp/.brv/.obsidian/app.json +1 -0
  71. package/.claude/worktrees/phase-2-mcp/.brv/.obsidian/appearance.json +1 -0
  72. package/.claude/worktrees/phase-2-mcp/.brv/.obsidian/core-plugins.json +33 -0
  73. package/.claude/worktrees/phase-2-mcp/.brv/.obsidian/graph.json +22 -0
  74. package/.claude/worktrees/phase-2-mcp/.brv/.obsidian/workspace.json +195 -0
  75. package/.claude/worktrees/phase-2-mcp/.brv/Sin t/303/255tulo 1.canvas" +1 -0
  76. package/.claude/worktrees/phase-2-mcp/.brv/Sin t/303/255tulo 2.canvas" +1 -0
  77. package/.claude/worktrees/phase-2-mcp/.brv/Sin t/303/255tulo.canvas" +1 -0
  78. package/.claude/worktrees/phase-2-mcp/.brv/_queue_status.json +1 -0
  79. package/.claude/worktrees/phase-2-mcp/.brv/config.json +5 -0
  80. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/_index.md +60 -0
  81. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/_manifest.json +165 -0
  82. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/backend/_index.md +24 -0
  83. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/backend/backend/_index.md +40 -0
  84. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/backend/backend/init.abstract.md +0 -0
  85. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/backend/backend/init.md +27 -0
  86. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/backend/backend/init.overview.md +29 -0
  87. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/backend/backend/job_tracker.abstract.md +1 -0
  88. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/backend/backend/job_tracker.md +273 -0
  89. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/backend/backend/job_tracker.overview.md +31 -0
  90. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/backend/backend/main.abstract.md +0 -0
  91. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/backend/backend/main.md +1292 -0
  92. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/backend/backend/main.overview.md +30 -0
  93. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/backend/backend/requirements.abstract.md +1 -0
  94. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/backend/backend/requirements.md +37 -0
  95. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/backend/backend/requirements.overview.md +28 -0
  96. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/docs/_index.md +37 -0
  97. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/docs/api/_index.md +54 -0
  98. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/docs/api/context.md +11 -0
  99. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/docs/api/hermes_api_openapi_specification.abstract.md +0 -0
  100. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/docs/api/hermes_api_openapi_specification.md +468 -0
  101. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/docs/api/hermes_api_openapi_specification.overview.md +44 -0
  102. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/_index.md +48 -0
  103. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/hermes_dashboard/_index.md +31 -0
  104. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/hermes_dashboard/architecture_overview.abstract.md +0 -0
  105. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/hermes_dashboard/architecture_overview.md +41 -0
  106. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/hermes_dashboard/architecture_overview.overview.md +34 -0
  107. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/_index.md +53 -0
  108. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/components/_index.md +52 -0
  109. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/components/sidebar_navigation_component.abstract.md +0 -0
  110. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/components/sidebar_navigation_component.md +161 -0
  111. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/components/sidebar_navigation_component.overview.md +32 -0
  112. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/context.md +10 -0
  113. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/functioncallingpage.abstract.md +0 -0
  114. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/functioncallingpage.md +34 -0
  115. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/functioncallingpage.overview.md +26 -0
  116. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/lib/_index.md +48 -0
  117. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/lib/api_client_library.abstract.md +1 -0
  118. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/lib/api_client_library.md +403 -0
  119. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/lib/api_client_library.overview.md +69 -0
  120. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/page.abstract.md +0 -0
  121. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/page.md +103 -0
  122. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/page.overview.md +7 -0
  123. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/settingspage.abstract.md +0 -0
  124. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/settingspage.md +124 -0
  125. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/settingspage.overview.md +34 -0
  126. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/sidebar.abstract.md +0 -0
  127. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/sidebar.md +170 -0
  128. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/frontend/src/sidebar.overview.md +25 -0
  129. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/meta/_index.md +24 -0
  130. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/meta/curation_context/_index.md +24 -0
  131. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/meta/curation_context/empty_context.abstract.md +4 -0
  132. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/meta/curation_context/empty_context.md +35 -0
  133. package/.claude/worktrees/phase-2-mcp/.brv/context-tree/meta/curation_context/empty_context.overview.md +20 -0
  134. package/.claude/worktrees/phase-2-mcp/.brv/dream-log/drm-1777341062653.json +33 -0
  135. package/.claude/worktrees/phase-2-mcp/.brv/dream-state.json +8 -0
  136. package/.claude/worktrees/phase-2-mcp/.brv/dream.lock +0 -0
  137. package/.claude/worktrees/phase-2-mcp/.brv/review-backups/docs/api/hermes_api_openapi_specification.md +468 -0
  138. package/.claude/worktrees/phase-2-mcp/.claude/settings.local.json +13 -0
  139. package/.claude/worktrees/phase-2-mcp/.kilocode/package-lock.json +378 -0
  140. package/.claude/worktrees/phase-2-mcp/.kilocode/package.json +5 -0
  141. package/.claude/worktrees/phase-2-mcp/AGENTS.md +5 -0
  142. package/.claude/worktrees/phase-2-mcp/CLAUDE.md +29 -0
  143. package/.claude/worktrees/phase-2-mcp/QA_AUDIT_PLAN.md +156 -0
  144. package/.claude/worktrees/phase-2-mcp/README.md +316 -0
  145. package/.claude/worktrees/phase-2-mcp/agent-agnostic-evolution-dashboard.md +405 -0
  146. package/.claude/worktrees/phase-2-mcp/backend/__init__.py +0 -0
  147. package/.claude/worktrees/phase-2-mcp/backend/collectors/__init__.py +0 -0
  148. package/.claude/worktrees/phase-2-mcp/backend/collectors/claude_code_collector.py +277 -0
  149. package/.claude/worktrees/phase-2-mcp/backend/collectors/hermes_collector.py +68 -0
  150. package/.claude/worktrees/phase-2-mcp/backend/curator.py +512 -0
  151. package/.claude/worktrees/phase-2-mcp/backend/eval/__init__.py +19 -0
  152. package/.claude/worktrees/phase-2-mcp/backend/eval/engine.py +116 -0
  153. package/.claude/worktrees/phase-2-mcp/backend/eval/scorers.py +201 -0
  154. package/.claude/worktrees/phase-2-mcp/backend/generate_dataset.py +86 -0
  155. package/.claude/worktrees/phase-2-mcp/backend/job_tracker.py +232 -0
  156. package/.claude/worktrees/phase-2-mcp/backend/main.py +1746 -0
  157. package/.claude/worktrees/phase-2-mcp/backend/mcp_server.py +250 -0
  158. package/.claude/worktrees/phase-2-mcp/backend/promethean/__init__.py +24 -0
  159. package/.claude/worktrees/phase-2-mcp/backend/promethean/cycle_orchestrator.py +270 -0
  160. package/.claude/worktrees/phase-2-mcp/backend/promethean/delta_validator.py +191 -0
  161. package/.claude/worktrees/phase-2-mcp/backend/promethean/dspy_compiler.py +315 -0
  162. package/.claude/worktrees/phase-2-mcp/backend/promethean/gepa_strategist.py +213 -0
  163. package/.claude/worktrees/phase-2-mcp/backend/promethean/models.py +260 -0
  164. package/.claude/worktrees/phase-2-mcp/backend/promethean/skill_deployer.py +195 -0
  165. package/.claude/worktrees/phase-2-mcp/backend/promethean/trace_ingestion.py +142 -0
  166. package/.claude/worktrees/phase-2-mcp/backend/requirements.txt +6 -0
  167. package/.claude/worktrees/phase-2-mcp/backend/sdd_evolve.py +459 -0
  168. package/.claude/worktrees/phase-2-mcp/backend/skill_detector.py +227 -0
  169. package/.claude/worktrees/phase-2-mcp/backend/skill_registry.py +289 -0
  170. package/.claude/worktrees/phase-2-mcp/backend/storage/__init__.py +5 -0
  171. package/.claude/worktrees/phase-2-mcp/backend/storage/run_store.py +393 -0
  172. package/.claude/worktrees/phase-2-mcp/backend/storage/schema.sql +99 -0
  173. package/.claude/worktrees/phase-2-mcp/backend/validate_evolution.py +267 -0
  174. package/.claude/worktrees/phase-2-mcp/components.json +28 -0
  175. package/.claude/worktrees/phase-2-mcp/docs/api/hermes-api.openapi.yaml +438 -0
  176. package/.claude/worktrees/phase-2-mcp/docs/hero.svg +148 -0
  177. package/.claude/worktrees/phase-2-mcp/eslint.config.mjs +18 -0
  178. package/.claude/worktrees/phase-2-mcp/install.sh +245 -0
  179. package/.claude/worktrees/phase-2-mcp/next-env.d.ts +6 -0
  180. package/.claude/worktrees/phase-2-mcp/next.config.ts +32 -0
  181. package/.claude/worktrees/phase-2-mcp/package-lock.json +11936 -0
  182. package/.claude/worktrees/phase-2-mcp/package.json +41 -0
  183. package/.claude/worktrees/phase-2-mcp/pnpm-workspace.yaml +4 -0
  184. package/.claude/worktrees/phase-2-mcp/postcss.config.mjs +7 -0
  185. package/.claude/worktrees/phase-2-mcp/public/file.svg +1 -0
  186. package/.claude/worktrees/phase-2-mcp/public/fonts/SF-Pro-Display-Bold.otf +0 -0
  187. package/.claude/worktrees/phase-2-mcp/public/fonts/SF-Pro-Display-Heavy.otf +0 -0
  188. package/.claude/worktrees/phase-2-mcp/public/fonts/SF-Pro-Display-Medium.otf +0 -0
  189. package/.claude/worktrees/phase-2-mcp/public/fonts/SF-Pro-Display-Regular.otf +0 -0
  190. package/.claude/worktrees/phase-2-mcp/public/fonts/SF-Pro-Display-Semibold.otf +0 -0
  191. package/.claude/worktrees/phase-2-mcp/public/fonts/SF-Pro-Text-Bold.otf +0 -0
  192. package/.claude/worktrees/phase-2-mcp/public/fonts/SF-Pro-Text-Heavy.otf +0 -0
  193. package/.claude/worktrees/phase-2-mcp/public/fonts/SF-Pro-Text-Medium.otf +0 -0
  194. package/.claude/worktrees/phase-2-mcp/public/fonts/SF-Pro-Text-Regular.otf +0 -0
  195. package/.claude/worktrees/phase-2-mcp/public/fonts/SF-Pro-Text-Semibold.otf +0 -0
  196. package/.claude/worktrees/phase-2-mcp/public/globe.svg +1 -0
  197. package/.claude/worktrees/phase-2-mcp/public/next.svg +1 -0
  198. package/.claude/worktrees/phase-2-mcp/public/theme-preview.html +257 -0
  199. package/.claude/worktrees/phase-2-mcp/public/vercel.svg +1 -0
  200. package/.claude/worktrees/phase-2-mcp/public/window.svg +1 -0
  201. package/.claude/worktrees/phase-2-mcp/run.sh +26 -0
  202. package/.claude/worktrees/phase-2-mcp/skills-lock.json +10 -0
  203. package/.claude/worktrees/phase-2-mcp/specs/event-schema.md +223 -0
  204. package/.claude/worktrees/phase-2-mcp/specs/examples/run.jsonl +3 -0
  205. package/.claude/worktrees/phase-2-mcp/src/app/api/[...path]/route.ts +55 -0
  206. package/.claude/worktrees/phase-2-mcp/src/app/api/auth/token/route.ts +22 -0
  207. package/.claude/worktrees/phase-2-mcp/src/app/evolution/page.tsx +589 -0
  208. package/.claude/worktrees/phase-2-mcp/src/app/favicon.ico +0 -0
  209. package/.claude/worktrees/phase-2-mcp/src/app/globals.css +321 -0
  210. package/.claude/worktrees/phase-2-mcp/src/app/layout.tsx +63 -0
  211. package/.claude/worktrees/phase-2-mcp/src/app/page.tsx +70 -0
  212. package/.claude/worktrees/phase-2-mcp/src/app/skills/page.tsx +369 -0
  213. package/.claude/worktrees/phase-2-mcp/src/components/ApiConfigCard.tsx +199 -0
  214. package/.claude/worktrees/phase-2-mcp/src/components/ColorBends.css +1 -0
  215. package/.claude/worktrees/phase-2-mcp/src/components/ColorBends.d.ts +1 -0
  216. package/.claude/worktrees/phase-2-mcp/src/components/ColorBends.jsx +1 -0
  217. package/.claude/worktrees/phase-2-mcp/src/components/CoreLoopToggle.tsx +111 -0
  218. package/.claude/worktrees/phase-2-mcp/src/components/EnvironmentStatus.tsx +176 -0
  219. package/.claude/worktrees/phase-2-mcp/src/components/EvolutionBackground.tsx +1 -0
  220. package/.claude/worktrees/phase-2-mcp/src/components/ReactQueryProvider.tsx +24 -0
  221. package/.claude/worktrees/phase-2-mcp/src/components/Sidebar.tsx +247 -0
  222. package/.claude/worktrees/phase-2-mcp/src/components/SkillDiffViewer.tsx +154 -0
  223. package/.claude/worktrees/phase-2-mcp/src/components/ThemeAwareBackground.tsx +67 -0
  224. package/.claude/worktrees/phase-2-mcp/src/components/ThemeToggle.tsx +54 -0
  225. package/.claude/worktrees/phase-2-mcp/src/components/WelcomeHero.tsx +77 -0
  226. package/.claude/worktrees/phase-2-mcp/src/components/bits/ClickSpark.tsx +116 -0
  227. package/.claude/worktrees/phase-2-mcp/src/components/bits/CountUp.tsx +98 -0
  228. package/.claude/worktrees/phase-2-mcp/src/components/bits/DarkSelect.tsx +95 -0
  229. package/.claude/worktrees/phase-2-mcp/src/components/bits/DecryptedText.tsx +161 -0
  230. package/.claude/worktrees/phase-2-mcp/src/components/bits/ElectricBorder.tsx +184 -0
  231. package/.claude/worktrees/phase-2-mcp/src/components/bits/GlitchText.tsx +34 -0
  232. package/.claude/worktrees/phase-2-mcp/src/components/bits/ShinyText.tsx +55 -0
  233. package/.claude/worktrees/phase-2-mcp/src/components/bits/SpotlightCard.tsx +42 -0
  234. package/.claude/worktrees/phase-2-mcp/src/components/bits/TextType.tsx +95 -0
  235. package/.claude/worktrees/phase-2-mcp/src/components/bits/index.ts +9 -0
  236. package/.claude/worktrees/phase-2-mcp/src/components/pages/CuratorPage.tsx +632 -0
  237. package/.claude/worktrees/phase-2-mcp/src/components/pages/DatasetPage.tsx +271 -0
  238. package/.claude/worktrees/phase-2-mcp/src/components/pages/EvolutionPage.tsx +676 -0
  239. package/.claude/worktrees/phase-2-mcp/src/components/pages/FunctionCallingPage.tsx +1 -0
  240. package/.claude/worktrees/phase-2-mcp/src/components/pages/LogsPage.tsx +272 -0
  241. package/.claude/worktrees/phase-2-mcp/src/components/pages/MetricsPage.tsx +246 -0
  242. package/.claude/worktrees/phase-2-mcp/src/components/pages/OverviewPage.tsx +420 -0
  243. package/.claude/worktrees/phase-2-mcp/src/components/pages/SettingsPage.tsx +88 -0
  244. package/.claude/worktrees/phase-2-mcp/src/components/pages/SkillStudioPage.tsx +376 -0
  245. package/.claude/worktrees/phase-2-mcp/src/components/ui/animated-theme-toggler.tsx +97 -0
  246. package/.claude/worktrees/phase-2-mcp/src/components/ui/button.tsx +67 -0
  247. package/.claude/worktrees/phase-2-mcp/src/components/ui/card.tsx +103 -0
  248. package/.claude/worktrees/phase-2-mcp/src/components/ui/input.tsx +19 -0
  249. package/.claude/worktrees/phase-2-mcp/src/components/ui/separator.tsx +28 -0
  250. package/.claude/worktrees/phase-2-mcp/src/components/ui/sheet.tsx +147 -0
  251. package/.claude/worktrees/phase-2-mcp/src/components/ui/sidebar.tsx +702 -0
  252. package/.claude/worktrees/phase-2-mcp/src/components/ui/skeleton.tsx +13 -0
  253. package/.claude/worktrees/phase-2-mcp/src/components/ui/theme-toggle.tsx +272 -0
  254. package/.claude/worktrees/phase-2-mcp/src/components/ui/tooltip.tsx +57 -0
  255. package/.claude/worktrees/phase-2-mcp/src/hooks/use-mobile.ts +19 -0
  256. package/.claude/worktrees/phase-2-mcp/src/lib/api.ts +455 -0
  257. package/.claude/worktrees/phase-2-mcp/src/lib/queryClient.ts +12 -0
  258. package/.claude/worktrees/phase-2-mcp/src/lib/utils.ts +6 -0
  259. package/.claude/worktrees/phase-2-mcp/stitch/agent_dashboard/DESIGN_SPEC.md +521 -0
  260. package/.claude/worktrees/phase-2-mcp/stitch/agent_dashboard/prototype.html +676 -0
  261. package/.claude/worktrees/phase-2-mcp/stitch/curator_workspace/code.html +448 -0
  262. package/.claude/worktrees/phase-2-mcp/stitch/curator_workspace/screen.png +0 -0
  263. package/.claude/worktrees/phase-2-mcp/stitch/datasets/code.html +479 -0
  264. package/.claude/worktrees/phase-2-mcp/stitch/datasets/screen.png +0 -0
  265. package/.claude/worktrees/phase-2-mcp/stitch/evolution_history/code.html +461 -0
  266. package/.claude/worktrees/phase-2-mcp/stitch/evolution_history/screen.png +0 -0
  267. package/.claude/worktrees/phase-2-mcp/stitch/hermes_dashboard/DESIGN.md +192 -0
  268. package/.claude/worktrees/phase-2-mcp/stitch/hermes_dashboard/DESIGN_SPEC.md +455 -0
  269. package/.claude/worktrees/phase-2-mcp/stitch/hermes_overview/code.html +399 -0
  270. package/.claude/worktrees/phase-2-mcp/stitch/hermes_overview/screen.png +0 -0
  271. package/.claude/worktrees/phase-2-mcp/stitch/live_logs/code.html +324 -0
  272. package/.claude/worktrees/phase-2-mcp/stitch/live_logs/screen.png +0 -0
  273. package/.claude/worktrees/phase-2-mcp/stitch/skill_hub/code.html +596 -0
  274. package/.claude/worktrees/phase-2-mcp/stitch/skill_hub/screen.png +0 -0
  275. package/.claude/worktrees/phase-2-mcp/stitch/system_metrics/code.html +527 -0
  276. package/.claude/worktrees/phase-2-mcp/stitch/system_metrics/screen.png +0 -0
  277. package/.claude/worktrees/phase-2-mcp/stitch/system_settings/code.html +257 -0
  278. package/.claude/worktrees/phase-2-mcp/stitch/system_settings/screen.png +0 -0
  279. package/.claude/worktrees/phase-2-mcp/test_dashboard.py +201 -0
  280. package/.claude/worktrees/phase-2-mcp/tests/collectors/__init__.py +0 -0
  281. package/.claude/worktrees/phase-2-mcp/tests/collectors/fixtures/sample_session.jsonl +7 -0
  282. package/.claude/worktrees/phase-2-mcp/tests/collectors/test_claude_code_collector.py +171 -0
  283. package/.claude/worktrees/phase-2-mcp/tests/collectors/test_hermes_collector.py +167 -0
  284. package/.claude/worktrees/phase-2-mcp/tests/eval/test_engine.py +234 -0
  285. package/.claude/worktrees/phase-2-mcp/tests/eval/test_scorers.py +249 -0
  286. package/.claude/worktrees/phase-2-mcp/tests/storage/__init__.py +0 -0
  287. package/.claude/worktrees/phase-2-mcp/tests/storage/test_run_store.py +359 -0
  288. package/.claude/worktrees/phase-2-mcp/tests/test_curator.py +559 -0
  289. package/.claude/worktrees/phase-2-mcp/tests/test_mcp_server.py +114 -0
  290. package/.claude/worktrees/phase-2-mcp/tsconfig.json +34 -0
  291. package/.env.example +72 -0
  292. package/.kilocode/package-lock.json +378 -0
  293. package/.kilocode/package.json +5 -0
  294. package/AGENTS.md +5 -0
  295. package/CLAUDE.md +29 -0
  296. package/QA_AUDIT_PLAN.md +156 -0
  297. package/README.md +355 -0
  298. package/agent-agnostic-evolution-dashboard.md +405 -0
  299. package/backend/__init__.py +0 -0
  300. package/backend/collectors/__init__.py +0 -0
  301. package/backend/collectors/claude_code_collector.py +277 -0
  302. package/backend/collectors/hermes_collector.py +68 -0
  303. package/backend/curator.py +512 -0
  304. package/backend/eval/__init__.py +19 -0
  305. package/backend/eval/engine.py +116 -0
  306. package/backend/eval/scorers.py +201 -0
  307. package/backend/generate_dataset.py +86 -0
  308. package/backend/job_tracker.py +232 -0
  309. package/backend/main.py +1746 -0
  310. package/backend/mcp_server.py +250 -0
  311. package/backend/promethean/__init__.py +24 -0
  312. package/backend/promethean/cycle_orchestrator.py +270 -0
  313. package/backend/promethean/delta_validator.py +191 -0
  314. package/backend/promethean/dspy_compiler.py +315 -0
  315. package/backend/promethean/gepa_strategist.py +213 -0
  316. package/backend/promethean/models.py +260 -0
  317. package/backend/promethean/skill_deployer.py +195 -0
  318. package/backend/promethean/trace_ingestion.py +142 -0
  319. package/backend/requirements.txt +6 -0
  320. package/backend/sdd_evolve.py +459 -0
  321. package/backend/skill_detector.py +227 -0
  322. package/backend/skill_registry.py +289 -0
  323. package/backend/storage/__init__.py +5 -0
  324. package/backend/storage/run_store.py +393 -0
  325. package/backend/storage/schema.sql +99 -0
  326. package/backend/validate_evolution.py +267 -0
  327. package/bin/genoma.js +250 -0
  328. package/components.json +28 -0
  329. package/docs/api/hermes-api.openapi.yaml +438 -0
  330. package/docs/hero.svg +148 -0
  331. package/eslint.config.mjs +18 -0
  332. package/install.sh +245 -0
  333. package/next-env.d.ts +6 -0
  334. package/next.config.ts +32 -0
  335. package/package.json +46 -0
  336. package/pnpm-workspace.yaml +4 -0
  337. package/postcss.config.mjs +7 -0
  338. package/public/file.svg +1 -0
  339. package/public/fonts/SF-Pro-Display-Bold.otf +0 -0
  340. package/public/fonts/SF-Pro-Display-Heavy.otf +0 -0
  341. package/public/fonts/SF-Pro-Display-Medium.otf +0 -0
  342. package/public/fonts/SF-Pro-Display-Regular.otf +0 -0
  343. package/public/fonts/SF-Pro-Display-Semibold.otf +0 -0
  344. package/public/fonts/SF-Pro-Text-Bold.otf +0 -0
  345. package/public/fonts/SF-Pro-Text-Heavy.otf +0 -0
  346. package/public/fonts/SF-Pro-Text-Medium.otf +0 -0
  347. package/public/fonts/SF-Pro-Text-Regular.otf +0 -0
  348. package/public/fonts/SF-Pro-Text-Semibold.otf +0 -0
  349. package/public/globe.svg +1 -0
  350. package/public/next.svg +1 -0
  351. package/public/theme-preview.html +257 -0
  352. package/public/vercel.svg +1 -0
  353. package/public/window.svg +1 -0
  354. package/run.sh +26 -0
  355. package/scripts/postinstall.js +50 -0
  356. package/skills-lock.json +10 -0
  357. package/specs/event-schema.md +223 -0
  358. package/specs/examples/run.jsonl +3 -0
  359. package/src/app/api/[...path]/route.ts +55 -0
  360. package/src/app/api/auth/token/route.ts +22 -0
  361. package/src/app/evolution/page.tsx +589 -0
  362. package/src/app/favicon.ico +0 -0
  363. package/src/app/globals.css +321 -0
  364. package/src/app/layout.tsx +63 -0
  365. package/src/app/page.tsx +70 -0
  366. package/src/app/skills/page.tsx +369 -0
  367. package/src/components/ApiConfigCard.tsx +199 -0
  368. package/src/components/ColorBends.css +1 -0
  369. package/src/components/ColorBends.d.ts +1 -0
  370. package/src/components/ColorBends.jsx +1 -0
  371. package/src/components/CoreLoopToggle.tsx +111 -0
  372. package/src/components/EnvironmentStatus.tsx +176 -0
  373. package/src/components/EvolutionBackground.tsx +1 -0
  374. package/src/components/ReactQueryProvider.tsx +24 -0
  375. package/src/components/Sidebar.tsx +247 -0
  376. package/src/components/SkillDiffViewer.tsx +154 -0
  377. package/src/components/ThemeAwareBackground.tsx +67 -0
  378. package/src/components/ThemeToggle.tsx +54 -0
  379. package/src/components/WelcomeHero.tsx +77 -0
  380. package/src/components/bits/ClickSpark.tsx +116 -0
  381. package/src/components/bits/CountUp.tsx +98 -0
  382. package/src/components/bits/DarkSelect.tsx +95 -0
  383. package/src/components/bits/DecryptedText.tsx +161 -0
  384. package/src/components/bits/ElectricBorder.tsx +184 -0
  385. package/src/components/bits/GlitchText.tsx +34 -0
  386. package/src/components/bits/ShinyText.tsx +55 -0
  387. package/src/components/bits/SpotlightCard.tsx +42 -0
  388. package/src/components/bits/TextType.tsx +95 -0
  389. package/src/components/bits/index.ts +9 -0
  390. package/src/components/pages/CuratorPage.tsx +632 -0
  391. package/src/components/pages/DatasetPage.tsx +271 -0
  392. package/src/components/pages/EvolutionPage.tsx +676 -0
  393. package/src/components/pages/FunctionCallingPage.tsx +1 -0
  394. package/src/components/pages/LogsPage.tsx +272 -0
  395. package/src/components/pages/MetricsPage.tsx +246 -0
  396. package/src/components/pages/OverviewPage.tsx +420 -0
  397. package/src/components/pages/SettingsPage.tsx +88 -0
  398. package/src/components/pages/SkillStudioPage.tsx +376 -0
  399. package/src/components/ui/animated-theme-toggler.tsx +97 -0
  400. package/src/components/ui/button.tsx +67 -0
  401. package/src/components/ui/card.tsx +103 -0
  402. package/src/components/ui/input.tsx +19 -0
  403. package/src/components/ui/separator.tsx +28 -0
  404. package/src/components/ui/sheet.tsx +147 -0
  405. package/src/components/ui/sidebar.tsx +702 -0
  406. package/src/components/ui/skeleton.tsx +13 -0
  407. package/src/components/ui/theme-toggle.tsx +272 -0
  408. package/src/components/ui/tooltip.tsx +57 -0
  409. package/src/hooks/use-mobile.ts +19 -0
  410. package/src/lib/api.ts +455 -0
  411. package/src/lib/queryClient.ts +12 -0
  412. package/src/lib/utils.ts +6 -0
  413. package/stitch/agent_dashboard/DESIGN_SPEC.md +521 -0
  414. package/stitch/agent_dashboard/prototype.html +676 -0
  415. package/stitch/curator_workspace/code.html +448 -0
  416. package/stitch/curator_workspace/screen.png +0 -0
  417. package/stitch/datasets/code.html +479 -0
  418. package/stitch/datasets/screen.png +0 -0
  419. package/stitch/evolution_history/code.html +461 -0
  420. package/stitch/evolution_history/screen.png +0 -0
  421. package/stitch/hermes_dashboard/DESIGN.md +192 -0
  422. package/stitch/hermes_dashboard/DESIGN_SPEC.md +455 -0
  423. package/stitch/hermes_overview/code.html +399 -0
  424. package/stitch/hermes_overview/screen.png +0 -0
  425. package/stitch/live_logs/code.html +324 -0
  426. package/stitch/live_logs/screen.png +0 -0
  427. package/stitch/skill_hub/code.html +596 -0
  428. package/stitch/skill_hub/screen.png +0 -0
  429. package/stitch/system_metrics/code.html +527 -0
  430. package/stitch/system_metrics/screen.png +0 -0
  431. package/stitch/system_settings/code.html +257 -0
  432. package/stitch/system_settings/screen.png +0 -0
  433. package/test_dashboard.py +201 -0
  434. package/tests/collectors/__init__.py +0 -0
  435. package/tests/collectors/fixtures/sample_session.jsonl +7 -0
  436. package/tests/collectors/test_claude_code_collector.py +171 -0
  437. package/tests/collectors/test_hermes_collector.py +167 -0
  438. package/tests/eval/test_engine.py +234 -0
  439. package/tests/eval/test_scorers.py +249 -0
  440. package/tests/storage/__init__.py +0 -0
  441. package/tests/storage/test_run_store.py +359 -0
  442. package/tests/test_curator.py +559 -0
  443. package/tests/test_e2e_npm.py +621 -0
  444. package/tests/test_mcp_server.py +114 -0
  445. package/tsconfig.json +34 -0
@@ -0,0 +1,267 @@
1
+ """
2
+ Evolution Validator — LLM Judge que compara skill original vs evolucionada.
3
+
4
+ Flujo:
5
+ 1. Carga skill original y evolucionada
6
+ 2. Corre ambas contra el dataset de validación (holdout.jsonl)
7
+ 3. LLM Judge evalúa cada output en 4 dimensiones
8
+ 4. Veredicto final: PASS / MIXED / FAIL
9
+
10
+ Usage:
11
+ python validate_evolution.py --skill code-review --run 20260428_015945
12
+ """
13
+ import argparse
14
+ import json
15
+ import re
16
+ import sys
17
+ import time
18
+ from datetime import datetime
19
+ from pathlib import Path
20
+ from typing import Optional
21
+ from openai import OpenAI
22
+
23
+ # ── Config ──────────────────────────────────────────────────────────
24
+ OLLAMA_BASE = "http://localhost:11434/v1"
25
+ OLLAMA_MODEL = "gemma4:31b-cloud"
26
+ EVOLUTION_DIR = Path.home() / ".hermes" / "hermes-agent-self-evolution" / "output"
27
+ DATASETS_DIR = Path.home() / ".hermes" / "datasets"
28
+
29
+ client = OpenAI(base_url=OLLAMA_BASE, api_key="ollama")
30
+
31
+
32
+ # ── Skill runner (simple) ──────────────────────────────────────────
33
+ def run_skill(skill_content: str, code_input: str) -> str:
34
+ """Ejecuta la skill contra un input — simula lo que haría Hermes."""
35
+ resp = client.chat.completions.create(
36
+ model=OLLAMA_MODEL,
37
+ messages=[
38
+ {"role": "system", "content": skill_content[:3000]},
39
+ {"role": "user", "content": code_input}
40
+ ],
41
+ temperature=0.2,
42
+ max_tokens=1500,
43
+ )
44
+ return resp.choices[0].message.content or ""
45
+
46
+
47
+ # ── LLM Judge ──────────────────────────────────────────────────────
48
+ JUDGE_PROMPT = """Sos un juez experto en calidad de code reviews.
49
+ Compará DOS revisiones de código del mismo input.
50
+
51
+ INPUT ORIGINAL:
52
+ {code_input}
53
+
54
+ REVIEW A (skill original):
55
+ {output_a}
56
+
57
+ REVIEW B (skill evolucionada):
58
+ {output_b}
59
+
60
+ Evaluá CADA UNA en estas 4 dimensiones (puntaje 1-10):
61
+
62
+ 1. Corrección (35%): ¿Detecta todos los bugs reales? ¿No alucina problemas inexistentes?
63
+ 2. Precisión (25%): ¿Señala ubicaciones exactas? ¿Sugerencias son accionables? ¿Código de ejemplo?
64
+ 3. Cobertura (25%): ¿Cubre seguridad, tipos, async, edge cases, performance, estilo?
65
+ 4. Concisión (15%): ¿Va al punto? ¿Sin relleno innecesario?
66
+
67
+ Luego respondé en este formato EXACTO (sin markdown, sin explicaciones adicionales):
68
+
69
+ VEREDICT: <PASS|MIXED|FAIL>
70
+ A_CORRECCION: <1-10>
71
+ A_PRECISION: <1-10>
72
+ A_COBERTURA: <1-10>
73
+ A_CONCISION: <1-10>
74
+ B_CORRECCION: <1-10>
75
+ B_PRECISION: <1-10>
76
+ B_COBERTURA: <1-10>
77
+ B_CONCISION: <1-10>
78
+ REASON: <una frase explicando el veredicto>"""
79
+
80
+
81
+ def judge_output(code_input: str, output_a: str, output_b: str) -> Optional[dict]:
82
+ """LLM Judge evalúa A vs B."""
83
+ prompt = JUDGE_PROMPT.format(
84
+ code_input=code_input[:2000],
85
+ output_a=output_a[:2000],
86
+ output_b=output_b[:2000],
87
+ )
88
+
89
+ for attempt in range(3):
90
+ try:
91
+ resp = client.chat.completions.create(
92
+ model=OLLAMA_MODEL,
93
+ messages=[{"role": "user", "content": prompt}],
94
+ temperature=0.1,
95
+ max_tokens=800,
96
+ )
97
+ raw = resp.choices[0].message.content or ""
98
+
99
+ # Parsear
100
+ verdict = re.search(r"VEREDICT:\s*(PASS|MIXED|FAIL)", raw)
101
+ if not verdict:
102
+ continue
103
+
104
+ scores = {}
105
+ for dim in ["A_CORRECCION", "A_PRECISION", "A_COBERTURA", "A_CONCISION",
106
+ "B_CORRECCION", "B_PRECISION", "B_COBERTURA", "B_CONCISION"]:
107
+ m = re.search(rf"{dim}:\s*(\d+)", raw)
108
+ scores[dim.lower()] = int(m.group(1)) if m else 5
109
+
110
+ reason = re.search(r"REASON:\s*(.+?)$", raw, re.MULTILINE)
111
+
112
+ return {
113
+ "verdict": verdict.group(1),
114
+ "scores_a": {
115
+ "correccion": scores["a_correccion"],
116
+ "precision": scores["a_precision"],
117
+ "cobertura": scores["a_cobertura"],
118
+ "concision": scores["a_concision"],
119
+ },
120
+ "scores_b": {
121
+ "correccion": scores["b_correccion"],
122
+ "precision": scores["b_precision"],
123
+ "cobertura": scores["b_cobertura"],
124
+ "concision": scores["b_concision"],
125
+ },
126
+ "reason": reason.group(1).strip() if reason else "N/A",
127
+ "raw_judge": raw,
128
+ }
129
+ except Exception as e:
130
+ print(f" ⚠️ Judge attempt {attempt+1} failed: {e}")
131
+ time.sleep(2)
132
+
133
+ return None
134
+
135
+
136
+ # ── Main ────────────────────────────────────────────────────────────
137
+ def validate_evolution(skill_name: str, run_dir: Optional[str] = None):
138
+ print(f"🧬 Validating evolution: {skill_name}")
139
+
140
+ # 1. Find latest run
141
+ skill_output = EVOLUTION_DIR / skill_name
142
+ if not skill_output.exists():
143
+ print(f"❌ No evolution output for '{skill_name}'")
144
+ return None
145
+
146
+ if run_dir:
147
+ run_path = skill_output / run_dir
148
+ else:
149
+ runs = sorted([d for d in skill_output.iterdir() if d.is_dir()], key=lambda d: d.stat().st_mtime)
150
+ if not runs:
151
+ print(f"❌ No evolution runs for '{skill_name}'")
152
+ return None
153
+ run_path = runs[-1]
154
+ run_dir = run_path.name
155
+
156
+ print(f" Run: {run_dir}")
157
+
158
+ # 2. Load skills
159
+ baseline_path = run_path / "baseline_skill.md"
160
+ evolved_path = run_path / "evolved_skill.md"
161
+
162
+ if not baseline_path.exists() or not evolved_path.exists():
163
+ print(f"❌ Missing baseline or evolved skill files")
164
+ return None
165
+
166
+ baseline = baseline_path.read_text()
167
+ evolved = evolved_path.read_text()
168
+ print(f" Baseline: {len(baseline)} chars → Evolved: {len(evolved)} chars")
169
+
170
+ # 3. Load holdout dataset
171
+ holdout_path = DATASETS_DIR / skill_name / "holdout.jsonl"
172
+ if not holdout_path.exists():
173
+ print(f"⚠️ No holdout.jsonl for '{skill_name}'. Using built-in tests.")
174
+ test_cases = [
175
+ {"input": "Revisá:\n```python\ndef get_user(id):\n return db.execute(f\"SELECT * FROM users WHERE id = {id}\")\n```",
176
+ "expected": "SQL injection + sin type hints + sin manejo errores"},
177
+ ]
178
+ else:
179
+ test_cases = []
180
+ with open(holdout_path) as f:
181
+ for line in f:
182
+ line = line.strip()
183
+ if line:
184
+ test_cases.append(json.loads(line))
185
+ print(f" Holdout: {len(test_cases)} test cases")
186
+
187
+ # 4. Run both skills against holdout
188
+ results = []
189
+ for i, tc in enumerate(test_cases):
190
+ print(f"\n ── Test {i+1}/{len(test_cases)} ──")
191
+
192
+ # Run skill A (original)
193
+ print(f" Running skill A (original)...", end=" ", flush=True)
194
+ t0 = time.time()
195
+ out_a = run_skill(baseline, tc["input"])
196
+ print(f"{len(out_a)} chars, {time.time()-t0:.1f}s")
197
+
198
+ # Run skill B (evolved)
199
+ print(f" Running skill B (evolved)...", end=" ", flush=True)
200
+ t0 = time.time()
201
+ out_b = run_skill(evolved, tc["input"])
202
+ print(f"{len(out_b)} chars, {time.time()-t0:.1f}s")
203
+
204
+ # Judge
205
+ print(f" 🧑‍⚖️ LLM Judge evaluating...", end=" ", flush=True)
206
+ judgment = judge_output(tc["input"], out_a, out_b)
207
+ if judgment:
208
+ print(f"→ {judgment['verdict']}")
209
+ results.append({
210
+ "test_id": i + 1,
211
+ "verdict": judgment["verdict"],
212
+ "scores_a": judgment["scores_a"],
213
+ "scores_b": judgment["scores_b"],
214
+ "reason": judgment["reason"],
215
+ })
216
+ else:
217
+ print(f"→ ❌ Judge failed")
218
+ results.append({"test_id": i + 1, "verdict": "ERROR", "reason": "Judge failed"})
219
+
220
+ # 5. Compute final verdict
221
+ passes = sum(1 for r in results if r["verdict"] == "PASS")
222
+ mixed = sum(1 for r in results if r["verdict"] == "MIXED")
223
+ fails = sum(1 for r in results if r["verdict"] == "FAIL")
224
+
225
+ if passes >= len(results) * 0.8 and fails == 0:
226
+ final = "PASS ✅"
227
+ elif fails > 0:
228
+ final = "FAIL ❌"
229
+ else:
230
+ final = "MIXED ⚠️"
231
+
232
+ # 6. Report
233
+ report = {
234
+ "skill_name": skill_name,
235
+ "run_dir": run_dir,
236
+ "timestamp": datetime.now().isoformat(),
237
+ "final_verdict": final,
238
+ "summary": {
239
+ "pass": passes,
240
+ "mixed": mixed,
241
+ "fail": fails,
242
+ "total": len(results),
243
+ },
244
+ "details": results,
245
+ "baseline_size": len(baseline),
246
+ "evolved_size": len(evolved),
247
+ }
248
+
249
+ print(f"\n{'='*60}")
250
+ print(f" FINAL VERDICT: {final}")
251
+ print(f" PASS={passes} MIXED={mixed} FAIL={fails} (total={len(results)})")
252
+ print(f"{'='*60}")
253
+
254
+ # Save report
255
+ report_path = run_path / "validation_report.json"
256
+ report_path.write_text(json.dumps(report, indent=2, ensure_ascii=False))
257
+ print(f"\n📄 Report saved to {report_path}")
258
+
259
+ return report
260
+
261
+
262
+ if __name__ == "__main__":
263
+ parser = argparse.ArgumentParser(description="Validate skill evolution with LLM Judge")
264
+ parser.add_argument("--skill", required=True, help="Skill name")
265
+ parser.add_argument("--run", default=None, help="Run directory (default: latest)")
266
+ args = parser.parse_args()
267
+ validate_evolution(args.skill, args.run)
package/bin/genoma.js ADDED
@@ -0,0 +1,250 @@
1
+ #!/usr/bin/env node
2
+
3
+ 'use strict';
4
+
5
+ const { spawn, execFileSync } = require('child_process');
6
+ const path = require('path');
7
+ const os = require('os');
8
+
9
+ // ─── Constants ───────────────────────────────────────────────────────────────
10
+
11
+ const DEFAULT_PORT = 8000;
12
+ const FRONTEND_PORT = 3000;
13
+ const MIN_PYTHON_MAJOR = 3;
14
+ const MIN_PYTHON_MINOR = 10;
15
+
16
+ const isWindows = os.platform() === 'win32';
17
+ const python3 = isWindows ? 'python' : 'python3';
18
+ const pnpm = isWindows ? 'pnpm.cmd' : 'pnpm';
19
+
20
+ // ─── Arg parsing ─────────────────────────────────────────────────────────────
21
+
22
+ function parseArgs(argv) {
23
+ const args = argv.slice(2);
24
+ let port = DEFAULT_PORT;
25
+ let dev = false;
26
+
27
+ for (let i = 0; i < args.length; i++) {
28
+ if (args[i] === '--port') {
29
+ const value = parseInt(args[i + 1], 10);
30
+ if (!isNaN(value) && value > 0 && value < 65536) {
31
+ port = value;
32
+ i++;
33
+ } else {
34
+ fatal(`Invalid --port value: "${args[i + 1]}"`);
35
+ }
36
+ } else if (args[i] === '--dev') {
37
+ dev = true;
38
+ } else if (args[i] === '--help' || args[i] === '-h') {
39
+ printHelp();
40
+ process.exit(0);
41
+ }
42
+ }
43
+
44
+ return { port, dev };
45
+ }
46
+
47
+ function printHelp() {
48
+ console.log(`
49
+ Usage: genoma [options]
50
+
51
+ Options:
52
+ --port <number> Backend port (default: ${DEFAULT_PORT})
53
+ --dev Run frontend in development mode (default: false)
54
+ --help, -h Show this help message
55
+ `);
56
+ }
57
+
58
+ // ─── Dependency checks ───────────────────────────────────────────────────────
59
+
60
+ function checkNode() {
61
+ const [major] = process.versions.node.split('.').map(Number);
62
+ if (major < 16) {
63
+ fatal(`Node.js 16+ required. Found: ${process.version}`);
64
+ }
65
+ }
66
+
67
+ function checkPython() {
68
+ try {
69
+ const raw = execFileSync(python3, ['--version'], {
70
+ encoding: 'utf8',
71
+ stdio: ['ignore', 'pipe', 'pipe'],
72
+ }).trim();
73
+
74
+ // "Python 3.11.2"
75
+ const match = raw.match(/Python\s+(\d+)\.(\d+)/i);
76
+ if (!match) {
77
+ fatal(`Could not parse Python version from: "${raw}"`);
78
+ }
79
+
80
+ const major = parseInt(match[1], 10);
81
+ const minor = parseInt(match[2], 10);
82
+
83
+ if (
84
+ major < MIN_PYTHON_MAJOR ||
85
+ (major === MIN_PYTHON_MAJOR && minor < MIN_PYTHON_MINOR)
86
+ ) {
87
+ fatal(
88
+ `Python ${MIN_PYTHON_MAJOR}.${MIN_PYTHON_MINOR}+ required. ` +
89
+ `Found: ${major}.${minor}`
90
+ );
91
+ }
92
+ } catch (err) {
93
+ fatal(
94
+ `Python 3 not found. Install Python ${MIN_PYTHON_MAJOR}.${MIN_PYTHON_MINOR}+ and ensure it is in your PATH.\n` +
95
+ ` Detail: ${err.message}`
96
+ );
97
+ }
98
+ }
99
+
100
+ function checkPnpm() {
101
+ try {
102
+ execFileSync(pnpm, ['--version'], {
103
+ encoding: 'utf8',
104
+ stdio: ['ignore', 'pipe', 'pipe'],
105
+ });
106
+ } catch {
107
+ fatal('pnpm not found. Install it with: npm install -g pnpm');
108
+ }
109
+ }
110
+
111
+ function checkDependencies() {
112
+ checkNode();
113
+ checkPython();
114
+ checkPnpm();
115
+ }
116
+
117
+ // ─── Process management ──────────────────────────────────────────────────────
118
+
119
+ const children = new Map(); // name → ChildProcess
120
+
121
+ function spawnProcess(name, cmd, args, opts = {}) {
122
+ const child = spawn(cmd, args, {
123
+ stdio: ['ignore', 'pipe', 'pipe'],
124
+ env: { ...process.env },
125
+ ...opts,
126
+ });
127
+
128
+ children.set(name, child);
129
+
130
+ child.stdout.on('data', (data) => {
131
+ process.stdout.write(`[${name}] ${data}`);
132
+ });
133
+
134
+ child.stderr.on('data', (data) => {
135
+ process.stderr.write(`[${name}] ${data}`);
136
+ });
137
+
138
+ child.on('error', (err) => {
139
+ console.error(`[${name}] Failed to start: ${err.message}`);
140
+ shutdown(1);
141
+ });
142
+
143
+ child.on('exit', (code, signal) => {
144
+ if (!shuttingDown) {
145
+ console.error(
146
+ `[${name}] Exited unexpectedly (code=${code ?? 'null'}, signal=${signal ?? 'none'})`
147
+ );
148
+ shutdown(1);
149
+ }
150
+ });
151
+
152
+ return child;
153
+ }
154
+
155
+ let shuttingDown = false;
156
+
157
+ function shutdown(exitCode = 0) {
158
+ if (shuttingDown) return;
159
+ shuttingDown = true;
160
+
161
+ console.log('\n[genoma] Shutting down...');
162
+
163
+ for (const [name, child] of children.entries()) {
164
+ if (!child.killed) {
165
+ console.log(`[genoma] Stopping ${name} (pid ${child.pid})...`);
166
+ child.kill('SIGTERM');
167
+ }
168
+ }
169
+
170
+ // Give processes a moment to clean up, then hard-kill stragglers
171
+ setTimeout(() => {
172
+ for (const child of children.values()) {
173
+ if (!child.killed) child.kill('SIGKILL');
174
+ }
175
+ process.exit(exitCode);
176
+ }, 3000);
177
+ }
178
+
179
+ // ─── Startup ─────────────────────────────────────────────────────────────────
180
+
181
+ function startBackend(port) {
182
+ return spawnProcess('backend', python3, [
183
+ '-m',
184
+ 'uvicorn',
185
+ 'backend.main:app',
186
+ '--host',
187
+ '0.0.0.0',
188
+ '--port',
189
+ String(port),
190
+ ]);
191
+ }
192
+
193
+ function startMcp() {
194
+ return spawnProcess('mcp', python3, ['-m', 'backend.mcp_server']);
195
+ }
196
+
197
+ function startFrontend(dev) {
198
+ const script = dev ? 'dev' : 'start';
199
+ return spawnProcess('frontend', pnpm, [script]);
200
+ }
201
+
202
+ function printBanner(port, dev) {
203
+ console.log(`
204
+ ╔══════════════════════════════════════╗
205
+ ║ genoma stack ║
206
+ ╠══════════════════════════════════════╣
207
+ ║ Backend → http://localhost:${String(port).padEnd(5)} ║
208
+ ║ Frontend → http://localhost:${String(FRONTEND_PORT).padEnd(5)} ║
209
+ ║ MCP → stdio ready ║
210
+ ╚══════════════════════════════════════╝
211
+
212
+ Mode: ${dev ? 'development' : 'production'}
213
+ Press Ctrl+C to stop all processes.
214
+ `);
215
+ }
216
+
217
+ // ─── Signal handlers ─────────────────────────────────────────────────────────
218
+
219
+ process.on('SIGINT', () => shutdown(0));
220
+ process.on('SIGTERM', () => shutdown(0));
221
+
222
+ // Windows does not support SIGHUP
223
+ if (!isWindows) {
224
+ process.on('SIGHUP', () => shutdown(0));
225
+ }
226
+
227
+ // ─── Helpers ─────────────────────────────────────────────────────────────────
228
+
229
+ function fatal(message) {
230
+ console.error(`[genoma] ERROR: ${message}`);
231
+ process.exit(1);
232
+ }
233
+
234
+ // ─── Main ─────────────────────────────────────────────────────────────────────
235
+
236
+ function main() {
237
+ const { port, dev } = parseArgs(process.argv);
238
+
239
+ console.log('[genoma] Checking dependencies...');
240
+ checkDependencies();
241
+ console.log('[genoma] All dependencies satisfied.');
242
+
243
+ printBanner(port, dev);
244
+
245
+ startBackend(port);
246
+ startMcp();
247
+ startFrontend(dev);
248
+ }
249
+
250
+ main();
@@ -0,0 +1,28 @@
1
+ {
2
+ "$schema": "https://ui.shadcn.com/schema.json",
3
+ "style": "radix-nova",
4
+ "rsc": true,
5
+ "tsx": true,
6
+ "tailwind": {
7
+ "config": "",
8
+ "css": "src/app/globals.css",
9
+ "baseColor": "neutral",
10
+ "cssVariables": true,
11
+ "prefix": ""
12
+ },
13
+ "iconLibrary": "lucide",
14
+ "rtl": false,
15
+ "menuColor": "default",
16
+ "menuAccent": "subtle",
17
+ "aliases": {
18
+ "components": "@/components",
19
+ "utils": "@/lib/utils",
20
+ "ui": "@/components/ui",
21
+ "lib": "@/lib",
22
+ "hooks": "@/hooks"
23
+ },
24
+ "registries": {
25
+ "@magicui": "https://magicui.design/r/{name}",
26
+ "@react-bits": "https://reactbits.dev/r/{name}.json"
27
+ }
28
+ }