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,632 @@
1
+ "use client";
2
+
3
+ import { useState, useEffect, useCallback } from "react";
4
+ import { motion } from "framer-motion";
5
+ import {
6
+ Dna,
7
+ Activity,
8
+ Clock,
9
+ Pin,
10
+ PinOff,
11
+ Archive,
12
+ ArchiveRestore,
13
+ Play,
14
+ Loader2,
15
+ CheckCircle2,
16
+ AlertTriangle,
17
+ Trash2,
18
+ RefreshCw,
19
+ FileText,
20
+ Eye,
21
+ MousePointerClick,
22
+ Code2,
23
+ TrendingUp,
24
+ WifiOff,
25
+ Search,
26
+ } from "lucide-react";
27
+ import {
28
+ fetchCuratorStatus,
29
+ fetchCuratorSkills,
30
+ fetchCuratorReports,
31
+ fetchCuratorReport,
32
+ curatorPin,
33
+ curatorUnpin,
34
+ curatorRestore,
35
+ curatorRun,
36
+ fetchCuratorReport as fetchCuratorReportDetail,
37
+ type CuratorStatus,
38
+ type CuratorSkillUsage,
39
+ type CuratorReport,
40
+ type CuratorReportDetail,
41
+ } from "@/lib/api";
42
+ import { SpotlightCard, CountUp } from "@/components/bits";
43
+
44
+ // ── Helpers ────────────────────────────────────────────────────────
45
+
46
+ function formatDate(iso: string | null | undefined): string {
47
+ if (!iso) return "—";
48
+ try {
49
+ const d = new Date(iso);
50
+ return d.toLocaleDateString("es-MX", {
51
+ month: "short",
52
+ day: "numeric",
53
+ hour: "2-digit",
54
+ minute: "2-digit",
55
+ });
56
+ } catch {
57
+ return iso;
58
+ }
59
+ }
60
+
61
+ function stateColor(state: string): string {
62
+ switch (state) {
63
+ case "active": return "#22c55e";
64
+ case "stale": return "#eab308";
65
+ case "archived": return "#ef4444";
66
+ case "untracked": return "#6b7280";
67
+ default: return "#6b7280";
68
+ }
69
+ }
70
+
71
+ function stateLabel(state: string): string {
72
+ switch (state) {
73
+ case "active": return "Active";
74
+ case "stale": return "Stale";
75
+ case "archived": return "Archived";
76
+ case "untracked": return "Untracked";
77
+ default: return state;
78
+ }
79
+ }
80
+
81
+ function StateBadge({ state }: { state: string }) {
82
+ const colors: Record<string, string> = {
83
+ active: "bg-[#22c55e]/10 text-[#22c55e] border-[#22c55e]/20",
84
+ stale: "bg-[#eab308]/10 text-[#eab308] border-[#eab308]/20",
85
+ archived: "bg-[#ef4444]/10 text-[#ef4444] border-[#ef4444]/20",
86
+ untracked: "bg-[#6b7280]/10 text-[#6b7280] border-[#6b7280]/20",
87
+ };
88
+ return (
89
+ <span
90
+ className={`text-[10px] font-medium px-2 py-0.5 rounded-full border ${
91
+ colors[state] || colors.untracked
92
+ }`}
93
+ >
94
+ {stateLabel(state)}
95
+ </span>
96
+ );
97
+ }
98
+
99
+ // ── Sub-components ─────────────────────────────────────────────────
100
+
101
+ function StatCard({
102
+ label,
103
+ value,
104
+ icon,
105
+ color,
106
+ delay,
107
+ }: {
108
+ label: string;
109
+ value: number;
110
+ icon: React.ReactNode;
111
+ color: string;
112
+ delay: number;
113
+ }) {
114
+ return (
115
+ <motion.div
116
+ initial={{ opacity: 0, y: 15 }}
117
+ animate={{ opacity: 1, y: 0 }}
118
+ transition={{ delay, duration: 0.5 }}
119
+ >
120
+ <SpotlightCard
121
+ spotlightColor={`${color}15`}
122
+ className="glass-card rounded-2xl p-5"
123
+ >
124
+ <div className="flex items-center justify-between mb-3">
125
+ <span className="text-xs text-muted-foreground uppercase tracking-wider">
126
+ {label}
127
+ </span>
128
+ <div
129
+ className="w-7 h-7 rounded-lg flex items-center justify-center"
130
+ style={{ backgroundColor: `${color}15` }}
131
+ >
132
+ <span style={{ color }}>{icon}</span>
133
+ </div>
134
+ </div>
135
+ <p className="text-2xl font-bold font-mono tracking-tight">
136
+ <CountUp to={value} duration={1.5} delay={delay} />
137
+ </p>
138
+ </SpotlightCard>
139
+ </motion.div>
140
+ );
141
+ }
142
+
143
+ // ── Main Page ──────────────────────────────────────────────────────
144
+
145
+ export default function CuratorPage() {
146
+ const [status, setStatus] = useState<CuratorStatus | null>(null);
147
+ const [skills, setSkills] = useState<CuratorSkillUsage[]>([]);
148
+ const [reports, setReports] = useState<CuratorReport[]>([]);
149
+ const [loading, setLoading] = useState(true);
150
+ const [running, setRunning] = useState(false);
151
+ const [search, setSearch] = useState("");
152
+ const [stateFilter, setStateFilter] = useState<string>("all");
153
+ const [selectedReport, setSelectedReport] = useState<CuratorReportDetail | null>(null);
154
+ const [runResult, setRunResult] = useState<string | null>(null);
155
+ const [error, setError] = useState<string | null>(null);
156
+
157
+ const fetchAll = useCallback(async () => {
158
+ setLoading(true);
159
+ setError(null);
160
+ try {
161
+ const [s, sk, r] = await Promise.all([
162
+ fetchCuratorStatus(),
163
+ fetchCuratorSkills(),
164
+ fetchCuratorReports(),
165
+ ]);
166
+ setStatus(s);
167
+ setSkills(sk.skills);
168
+ setReports(r.reports);
169
+ } catch (err) {
170
+ setError(err instanceof Error ? err.message : "Failed to fetch curator data");
171
+ }
172
+ setLoading(false);
173
+ }, []);
174
+
175
+ useEffect(() => {
176
+ fetchAll();
177
+ }, [fetchAll]);
178
+
179
+ const handleRun = async () => {
180
+ setRunning(true);
181
+ setRunResult(null);
182
+ try {
183
+ const result = await curatorRun(false);
184
+ setRunResult(result.status === "ok" ? `✅ Curator run complete (report: ${result.report_id})` : `❌ ${result.status}`);
185
+ await fetchAll();
186
+ } catch (err) {
187
+ setRunResult(`❌ ${err instanceof Error ? err.message : "Run failed"}`);
188
+ }
189
+ setRunning(false);
190
+ };
191
+
192
+ const handlePin = async (skill: string, currentlyPinned: boolean) => {
193
+ try {
194
+ if (currentlyPinned) {
195
+ await curatorUnpin(skill);
196
+ } else {
197
+ await curatorPin(skill);
198
+ }
199
+ await Promise.all([fetchCuratorStatus(), fetchCuratorSkills().then(r => setSkills(r.skills))]);
200
+ } catch (err) {
201
+ console.error("Pin/unpin failed:", err);
202
+ }
203
+ };
204
+
205
+ const handleRestore = async (skill: string) => {
206
+ try {
207
+ await curatorRestore(skill);
208
+ await fetchAll();
209
+ } catch (err) {
210
+ console.error("Restore failed:", err);
211
+ }
212
+ };
213
+
214
+ const handleViewReport = async (reportId: string) => {
215
+ try {
216
+ const detail = await fetchCuratorReportDetail(reportId);
217
+ setSelectedReport(detail);
218
+ } catch (err) {
219
+ console.error("Failed to load report:", err);
220
+ }
221
+ };
222
+
223
+ // Filter skills
224
+ const filteredSkills = skills.filter((s) => {
225
+ if (stateFilter !== "all" && s.state !== stateFilter) return false;
226
+ if (search && !s.name.toLowerCase().includes(search.toLowerCase())) return false;
227
+ return true;
228
+ });
229
+
230
+ if (loading) {
231
+ return (
232
+ <div className="min-h-[20rem] flex items-center justify-center">
233
+ <Loader2 className="w-6 h-6 text-accent-cyan animate-spin mr-2" />
234
+ <span className="text-muted-foreground">Loading Curator...</span>
235
+ </div>
236
+ );
237
+ }
238
+
239
+ if (error) {
240
+ return (
241
+ <div className="min-h-[20rem] flex flex-col items-center justify-center gap-4">
242
+ <WifiOff className="w-12 h-12 text-error" />
243
+ <p className="text-muted-foreground">{error}</p>
244
+ <button
245
+ onClick={fetchAll}
246
+ className="flex items-center gap-2 px-4 py-2 rounded-xl bg-accent-violet/10 text-accent-violet hover:bg-accent-violet/20 transition-colors"
247
+ >
248
+ <RefreshCw className="w-4 h-4" />
249
+ Retry
250
+ </button>
251
+ </div>
252
+ );
253
+ }
254
+
255
+ return (
256
+ <div className="space-y-6">
257
+ {/* Header */}
258
+ <motion.div
259
+ initial={{ opacity: 0, y: 20 }}
260
+ animate={{ opacity: 1, y: 0 }}
261
+ className="relative overflow-hidden rounded-2xl p-8 glass-card"
262
+ >
263
+ <div className="absolute inset-0 overflow-hidden pointer-events-none">
264
+ <div
265
+ className="absolute -top-20 -right-20 w-64 h-64 rounded-full opacity-10"
266
+ style={{
267
+ background:
268
+ "radial-gradient(circle, rgba(34,197,94,0.5) 0%, transparent 70%)",
269
+ }}
270
+ />
271
+ </div>
272
+ <div className="relative">
273
+ <div className="flex items-center gap-2 mb-2">
274
+ <Dna className="w-5 h-5 text-success" />
275
+ <span className="text-xs font-medium text-success uppercase tracking-wider">
276
+ Skill Lifecycle Management
277
+ </span>
278
+ </div>
279
+ <div className="flex items-start justify-between">
280
+ <div>
281
+ <h1 className="text-3xl font-bold">
282
+ <span className="gradient-text">Curator</span>
283
+ </h1>
284
+ <p className="text-muted-foreground mt-2 text-sm">
285
+ Background maintenance for agent-created skills. Active → Stale → Archived lifecycle.
286
+ </p>
287
+ </div>
288
+ <div className="flex items-center gap-3">
289
+ {runResult && (
290
+ <span className="text-xs text-muted-foreground max-w-[200px] truncate">
291
+ {runResult}
292
+ </span>
293
+ )}
294
+ <button
295
+ onClick={handleRun}
296
+ disabled={running}
297
+ className="flex items-center gap-2 px-4 py-2 rounded-xl bg-accent-violet/10 text-accent-violet hover:bg-accent-violet/20 border border-accent-violet/20 disabled:opacity-50 transition-colors text-sm"
298
+ >
299
+ {running ? (
300
+ <Loader2 className="w-4 h-4 animate-spin" />
301
+ ) : (
302
+ <Play className="w-4 h-4" />
303
+ )}
304
+ {running ? "Running..." : "Run Curator"}
305
+ </button>
306
+ <button
307
+ onClick={fetchAll}
308
+ className="p-2 rounded-xl text-muted-foreground hover:text-foreground hover:bg-white/[0.06] transition-colors"
309
+ title="Refresh"
310
+ >
311
+ <RefreshCw className="w-4 h-4" />
312
+ </button>
313
+ </div>
314
+ </div>
315
+ </div>
316
+ </motion.div>
317
+
318
+ {/* Stats grid */}
319
+ {status && (
320
+ <div className="grid grid-cols-2 sm:grid-cols-4 lg:grid-cols-6 gap-3">
321
+ <StatCard label="Active" value={status.stats.active} icon={<Activity className="w-4 h-4" />} color="#22c55e" delay={0.05} />
322
+ <StatCard label="Stale" value={status.stats.stale} icon={<AlertTriangle className="w-4 h-4" />} color="#eab308" delay={0.1} />
323
+ <StatCard label="Archived" value={status.stats.archived} icon={<Archive className="w-4 h-4" />} color="#ef4444" delay={0.15} />
324
+ <StatCard label="Pinned" value={status.stats.pinned} icon={<Pin className="w-4 h-4" />} color="#8b5cf6" delay={0.2} />
325
+ <StatCard label="Total Tracked" value={status.stats.total} icon={<Dna className="w-4 h-4" />} color="#06b6d4" delay={0.25} />
326
+ <StatCard label="Reports" value={reports.length} icon={<FileText className="w-4 h-4" />} color="#f97316" delay={0.3} />
327
+ </div>
328
+ )}
329
+
330
+ {/* Last run info + LRU */}
331
+ {status && (
332
+ <motion.div
333
+ initial={{ opacity: 0, y: 15 }}
334
+ animate={{ opacity: 1, y: 0 }}
335
+ transition={{ delay: 0.35 }}
336
+ className="grid grid-cols-1 lg:grid-cols-2 gap-4"
337
+ >
338
+ <SpotlightCard spotlightColor="rgba(6,182,212,0.08)" className="glass-card rounded-2xl p-5">
339
+ <h3 className="text-xs uppercase tracking-wider text-muted-foreground flex items-center gap-2 mb-3">
340
+ <Clock className="w-3 h-3" />
341
+ Last Curator Run
342
+ </h3>
343
+ {status.last_run?.timestamp ? (
344
+ <div>
345
+ <p className="text-sm font-mono">{formatDate(status.last_run.timestamp as string)}</p>
346
+ {status.last_run_dir && (
347
+ <p className="text-[10px] text-muted-foreground mt-1">
348
+ Report: {status.last_run_dir}
349
+ </p>
350
+ )}
351
+ </div>
352
+ ) : (
353
+ <p className="text-sm text-muted-foreground">No runs yet</p>
354
+ )}
355
+ </SpotlightCard>
356
+
357
+ <SpotlightCard spotlightColor="rgba(234,179,8,0.08)" className="glass-card rounded-2xl p-5">
358
+ <h3 className="text-xs uppercase tracking-wider text-muted-foreground flex items-center gap-2 mb-3">
359
+ <TrendingUp className="w-3 h-3" />
360
+ Least Recently Used (Top 5)
361
+ </h3>
362
+ {status.least_recently_used?.length > 0 ? (
363
+ <div className="space-y-1.5">
364
+ {status.least_recently_used.map((s, i) => (
365
+ <div key={s.name} className="flex items-center justify-between text-xs">
366
+ <span className="font-mono truncate max-w-[180px]">{s.name}</span>
367
+ <span className="text-muted-foreground">{formatDate(s.last_used)}</span>
368
+ </div>
369
+ ))}
370
+ </div>
371
+ ) : (
372
+ <p className="text-sm text-muted-foreground">No usage data yet</p>
373
+ )}
374
+ </SpotlightCard>
375
+ </motion.div>
376
+ )}
377
+
378
+ {/* Skill health table */}
379
+ <motion.div
380
+ initial={{ opacity: 0, y: 15 }}
381
+ animate={{ opacity: 1, y: 0 }}
382
+ transition={{ delay: 0.4 }}
383
+ className="glass-card rounded-2xl p-6"
384
+ >
385
+ <div className="flex items-center justify-between mb-4">
386
+ <h2 className="text-sm font-semibold uppercase tracking-wider flex items-center gap-2">
387
+ <Activity className="w-4 h-4 text-accent-cyan" />
388
+ Skill Health
389
+ </h2>
390
+ <div className="flex items-center gap-3">
391
+ {/* Search */}
392
+ <div className="relative">
393
+ <Search className="absolute left-2.5 top-1/2 -translate-y-1/2 w-3.5 h-3.5 text-muted-foreground" />
394
+ <input
395
+ type="text"
396
+ value={search}
397
+ onChange={(e) => setSearch(e.target.value)}
398
+ placeholder="Search skills..."
399
+ className="w-40 pl-8 pr-3 py-1.5 text-xs rounded-lg bg-white/[0.03] border border-white/[0.08] text-foreground placeholder:text-muted-foreground focus:outline-none focus:border-accent-violet/40"
400
+ />
401
+ </div>
402
+ {/* State filter */}
403
+ <select
404
+ value={stateFilter}
405
+ onChange={(e) => setStateFilter(e.target.value)}
406
+ className="text-xs px-2 py-1.5 rounded-lg bg-white/[0.03] border border-white/[0.08] text-foreground focus:outline-none focus:border-accent-violet/40"
407
+ >
408
+ <option value="all">All States</option>
409
+ <option value="active">Active</option>
410
+ <option value="stale">Stale</option>
411
+ <option value="archived">Archived</option>
412
+ <option value="untracked">Untracked</option>
413
+ </select>
414
+ </div>
415
+ </div>
416
+
417
+ <div className="overflow-x-auto">
418
+ <table className="w-full text-xs">
419
+ <thead>
420
+ <tr className="border-b border-white/[0.06] text-muted-foreground uppercase tracking-wider">
421
+ <th className="text-left py-2 pr-3 font-medium">Skill</th>
422
+ <th className="text-left py-2 px-3 font-medium">State</th>
423
+ <th className="text-center py-2 px-3 font-medium">Uses</th>
424
+ <th className="text-center py-2 px-3 font-medium">Views</th>
425
+ <th className="text-center py-2 px-3 font-medium">Patches</th>
426
+ <th className="text-left py-2 px-3 font-medium">Last Used</th>
427
+ <th className="text-center py-2 px-3 font-medium">Created</th>
428
+ <th className="text-center py-2 px-3 font-medium">Agent</th>
429
+ <th className="text-right py-2 pl-3 font-medium">Actions</th>
430
+ </tr>
431
+ </thead>
432
+ <tbody>
433
+ {filteredSkills.length === 0 && (
434
+ <tr>
435
+ <td colSpan={9} className="py-8 text-center text-muted-foreground">
436
+ {search || stateFilter !== "all"
437
+ ? "No skills match your filters"
438
+ : "No skills tracked yet. Run the curator to start tracking."}
439
+ </td>
440
+ </tr>
441
+ )}
442
+ {filteredSkills.map((skill, i) => (
443
+ <motion.tr
444
+ key={skill.name}
445
+ initial={{ opacity: 0 }}
446
+ animate={{ opacity: 1 }}
447
+ transition={{ delay: 0.02 * i }}
448
+ className="border-b border-white/[0.03] hover:bg-white/[0.02] transition-colors"
449
+ >
450
+ <td className="py-2.5 pr-3">
451
+ <span className="font-mono text-xs font-medium">{skill.name}</span>
452
+ </td>
453
+ <td className="py-2.5 px-3">
454
+ <StateBadge state={skill.state} />
455
+ </td>
456
+ <td className="py-2.5 px-3 text-center font-mono">{skill.use_count}</td>
457
+ <td className="py-2.5 px-3 text-center font-mono">{skill.view_count}</td>
458
+ <td className="py-2.5 px-3 text-center font-mono">{skill.patch_count}</td>
459
+ <td className="py-2.5 px-3 text-muted-foreground font-mono">{formatDate(skill.last_used_at)}</td>
460
+ <td className="py-2.5 px-3 text-muted-foreground font-mono">{formatDate(skill.created_at)}</td>
461
+ <td className="py-2.5 px-3 text-center">
462
+ <span
463
+ className={`inline-block w-2 h-2 rounded-full ${
464
+ skill.agent_created ? "bg-accent-cyan" : "bg-muted"
465
+ }`}
466
+ title={skill.agent_created ? "Agent-created" : "Bundled/Hub"}
467
+ />
468
+ </td>
469
+ <td className="py-2.5 pl-3 text-right">
470
+ <div className="flex items-center justify-end gap-1">
471
+ {skill.state === "archived" ? (
472
+ <button
473
+ onClick={() => handleRestore(skill.name)}
474
+ className="p-1.5 rounded-lg text-muted-foreground hover:text-success hover:bg-success/10 transition-colors"
475
+ title="Restore from archive"
476
+ >
477
+ <ArchiveRestore className="w-3.5 h-3.5" />
478
+ </button>
479
+ ) : skill.agent_created ? (
480
+ <button
481
+ onClick={() => handlePin(skill.name, skill.pinned)}
482
+ className={`p-1.5 rounded-lg transition-colors ${
483
+ skill.pinned
484
+ ? "text-accent-violet hover:bg-accent-violet/10"
485
+ : "text-muted-foreground hover:text-foreground hover:bg-white/[0.06]"
486
+ }`}
487
+ title={skill.pinned ? "Unpin skill" : "Pin skill"}
488
+ >
489
+ {skill.pinned ? (
490
+ <PinOff className="w-3.5 h-3.5" />
491
+ ) : (
492
+ <Pin className="w-3.5 h-3.5" />
493
+ )}
494
+ </button>
495
+ ) : null}
496
+ </div>
497
+ </td>
498
+ </motion.tr>
499
+ ))}
500
+ </tbody>
501
+ </table>
502
+ </div>
503
+ </motion.div>
504
+
505
+ {/* Reports timeline */}
506
+ {reports.length > 0 && (
507
+ <motion.div
508
+ initial={{ opacity: 0, y: 15 }}
509
+ animate={{ opacity: 1, y: 0 }}
510
+ transition={{ delay: 0.5 }}
511
+ className="glass-card rounded-2xl p-6"
512
+ >
513
+ <h2 className="text-sm font-semibold uppercase tracking-wider mb-4 flex items-center gap-2">
514
+ <FileText className="w-4 h-4 text-accent-cyan" />
515
+ Curator Reports
516
+ </h2>
517
+
518
+ <div className="space-y-2">
519
+ {reports.map((report, i) => (
520
+ <div
521
+ key={report.id}
522
+ className="flex items-center justify-between py-2.5 px-4 rounded-xl border border-white/[0.04] hover:bg-white/[0.02] transition-colors cursor-pointer"
523
+ onClick={() => handleViewReport(report.id)}
524
+ >
525
+ <div className="flex items-center gap-3">
526
+ <FileText className="w-4 h-4 text-muted-foreground flex-shrink-0" />
527
+ <div>
528
+ <p className="text-sm font-mono">{report.id}</p>
529
+ {report.summary && (
530
+ <p className="text-[10px] text-muted-foreground">
531
+ {report.summary.skills_reviewed} skills reviewed
532
+ {report.summary.archived > 0 && ` · ${report.summary.archived} archived`}
533
+ {report.summary.patched > 0 && ` · ${report.summary.patched} patched`}
534
+ </p>
535
+ )}
536
+ </div>
537
+ </div>
538
+ <div className="flex items-center gap-2">
539
+ {report.has_report && (
540
+ <span className="text-[10px] text-accent-cyan bg-accent-cyan/10 px-2 py-0.5 rounded-full">
541
+ REPORT.md
542
+ </span>
543
+ )}
544
+ <ChevronRight className="w-4 h-4 text-muted-foreground" />
545
+ </div>
546
+ </div>
547
+ ))}
548
+ </div>
549
+ </motion.div>
550
+ )}
551
+
552
+ {/* Report detail modal */}
553
+ {selectedReport && (
554
+ <div className="fixed inset-0 z-50 flex items-center justify-center bg-black/60 backdrop-blur-sm" onClick={() => setSelectedReport(null)}>
555
+ <div className="max-w-3xl w-full max-h-[80vh] overflow-y-auto m-4 rounded-2xl glass-card p-6" onClick={(e) => e.stopPropagation()}>
556
+ <div className="flex items-center justify-between mb-4">
557
+ <h3 className="text-sm font-semibold font-mono">{selectedReport.id}</h3>
558
+ <button
559
+ onClick={() => setSelectedReport(null)}
560
+ className="p-1.5 rounded-lg text-muted-foreground hover:text-foreground hover:bg-white/[0.06]"
561
+ >
562
+ <X className="w-4 h-4" />
563
+ </button>
564
+ </div>
565
+
566
+ {selectedReport.run_data && (
567
+ <div className="mb-4">
568
+ <h4 className="text-xs uppercase tracking-wider text-muted-foreground mb-2">Run Data</h4>
569
+ <pre className="text-xs font-mono bg-white/[0.03] rounded-xl p-4 overflow-x-auto">
570
+ {JSON.stringify(selectedReport.run_data, null, 2)}
571
+ </pre>
572
+ </div>
573
+ )}
574
+
575
+ {selectedReport.report_md && (
576
+ <div>
577
+ <h4 className="text-xs uppercase tracking-wider text-muted-foreground mb-2">Report</h4>
578
+ <div className="text-xs font-mono bg-white/[0.03] rounded-xl p-4 whitespace-pre-wrap">
579
+ {selectedReport.report_md}
580
+ </div>
581
+ </div>
582
+ )}
583
+
584
+ {!selectedReport.run_data && !selectedReport.report_md && (
585
+ <p className="text-sm text-muted-foreground">No report data available.</p>
586
+ )}
587
+ </div>
588
+ </div>
589
+ )}
590
+ </div>
591
+ );
592
+ }
593
+
594
+ // Needed for the report detail modal
595
+ function ChevronRight({ className }: { className?: string }) {
596
+ return (
597
+ <svg
598
+ xmlns="http://www.w3.org/2000/svg"
599
+ width="16"
600
+ height="16"
601
+ viewBox="0 0 24 24"
602
+ fill="none"
603
+ stroke="currentColor"
604
+ strokeWidth="2"
605
+ strokeLinecap="round"
606
+ strokeLinejoin="round"
607
+ className={className}
608
+ >
609
+ <polyline points="9 18 15 12 9 6" />
610
+ </svg>
611
+ );
612
+ }
613
+
614
+ function X({ className }: { className?: string }) {
615
+ return (
616
+ <svg
617
+ xmlns="http://www.w3.org/2000/svg"
618
+ width="16"
619
+ height="16"
620
+ viewBox="0 0 24 24"
621
+ fill="none"
622
+ stroke="currentColor"
623
+ strokeWidth="2"
624
+ strokeLinecap="round"
625
+ strokeLinejoin="round"
626
+ className={className}
627
+ >
628
+ <line x1="18" y1="6" x2="6" y2="18" />
629
+ <line x1="6" y1="6" x2="18" y2="18" />
630
+ </svg>
631
+ );
632
+ }