htmlgraph 0.20.1__py3-none-any.whl → 0.27.5__py3-none-any.whl

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 (304) hide show
  1. htmlgraph/.htmlgraph/.session-warning-state.json +6 -0
  2. htmlgraph/.htmlgraph/agents.json +72 -0
  3. htmlgraph/.htmlgraph/htmlgraph.db +0 -0
  4. htmlgraph/__init__.py +51 -1
  5. htmlgraph/__init__.pyi +123 -0
  6. htmlgraph/agent_detection.py +26 -10
  7. htmlgraph/agent_registry.py +2 -1
  8. htmlgraph/analytics/__init__.py +8 -1
  9. htmlgraph/analytics/cli.py +86 -20
  10. htmlgraph/analytics/cost_analyzer.py +391 -0
  11. htmlgraph/analytics/cost_monitor.py +664 -0
  12. htmlgraph/analytics/cost_reporter.py +675 -0
  13. htmlgraph/analytics/cross_session.py +617 -0
  14. htmlgraph/analytics/dependency.py +10 -6
  15. htmlgraph/analytics/pattern_learning.py +771 -0
  16. htmlgraph/analytics/session_graph.py +707 -0
  17. htmlgraph/analytics/strategic/__init__.py +80 -0
  18. htmlgraph/analytics/strategic/cost_optimizer.py +611 -0
  19. htmlgraph/analytics/strategic/pattern_detector.py +876 -0
  20. htmlgraph/analytics/strategic/preference_manager.py +709 -0
  21. htmlgraph/analytics/strategic/suggestion_engine.py +747 -0
  22. htmlgraph/analytics/work_type.py +67 -27
  23. htmlgraph/analytics_index.py +53 -20
  24. htmlgraph/api/__init__.py +3 -0
  25. htmlgraph/api/cost_alerts_websocket.py +416 -0
  26. htmlgraph/api/main.py +2498 -0
  27. htmlgraph/api/static/htmx.min.js +1 -0
  28. htmlgraph/api/static/style-redesign.css +1344 -0
  29. htmlgraph/api/static/style.css +1079 -0
  30. htmlgraph/api/templates/dashboard-redesign.html +1366 -0
  31. htmlgraph/api/templates/dashboard.html +794 -0
  32. htmlgraph/api/templates/partials/activity-feed-hierarchical.html +326 -0
  33. htmlgraph/api/templates/partials/activity-feed.html +1100 -0
  34. htmlgraph/api/templates/partials/agents-redesign.html +317 -0
  35. htmlgraph/api/templates/partials/agents.html +317 -0
  36. htmlgraph/api/templates/partials/event-traces.html +373 -0
  37. htmlgraph/api/templates/partials/features-kanban-redesign.html +509 -0
  38. htmlgraph/api/templates/partials/features.html +578 -0
  39. htmlgraph/api/templates/partials/metrics-redesign.html +346 -0
  40. htmlgraph/api/templates/partials/metrics.html +346 -0
  41. htmlgraph/api/templates/partials/orchestration-redesign.html +443 -0
  42. htmlgraph/api/templates/partials/orchestration.html +198 -0
  43. htmlgraph/api/templates/partials/spawners.html +375 -0
  44. htmlgraph/api/templates/partials/work-items.html +613 -0
  45. htmlgraph/api/websocket.py +538 -0
  46. htmlgraph/archive/__init__.py +24 -0
  47. htmlgraph/archive/bloom.py +234 -0
  48. htmlgraph/archive/fts.py +297 -0
  49. htmlgraph/archive/manager.py +583 -0
  50. htmlgraph/archive/search.py +244 -0
  51. htmlgraph/atomic_ops.py +560 -0
  52. htmlgraph/attribute_index.py +2 -1
  53. htmlgraph/bounded_paths.py +539 -0
  54. htmlgraph/builders/base.py +57 -2
  55. htmlgraph/builders/bug.py +19 -3
  56. htmlgraph/builders/chore.py +19 -3
  57. htmlgraph/builders/epic.py +19 -3
  58. htmlgraph/builders/feature.py +27 -3
  59. htmlgraph/builders/insight.py +2 -1
  60. htmlgraph/builders/metric.py +2 -1
  61. htmlgraph/builders/pattern.py +2 -1
  62. htmlgraph/builders/phase.py +19 -3
  63. htmlgraph/builders/spike.py +29 -3
  64. htmlgraph/builders/track.py +42 -1
  65. htmlgraph/cigs/__init__.py +81 -0
  66. htmlgraph/cigs/autonomy.py +385 -0
  67. htmlgraph/cigs/cost.py +475 -0
  68. htmlgraph/cigs/messages_basic.py +472 -0
  69. htmlgraph/cigs/messaging.py +365 -0
  70. htmlgraph/cigs/models.py +771 -0
  71. htmlgraph/cigs/pattern_storage.py +427 -0
  72. htmlgraph/cigs/patterns.py +503 -0
  73. htmlgraph/cigs/posttool_analyzer.py +234 -0
  74. htmlgraph/cigs/reporter.py +818 -0
  75. htmlgraph/cigs/tracker.py +317 -0
  76. htmlgraph/cli/.htmlgraph/.session-warning-state.json +6 -0
  77. htmlgraph/cli/.htmlgraph/agents.json +72 -0
  78. htmlgraph/cli/.htmlgraph/htmlgraph.db +0 -0
  79. htmlgraph/cli/__init__.py +42 -0
  80. htmlgraph/cli/__main__.py +6 -0
  81. htmlgraph/cli/analytics.py +1424 -0
  82. htmlgraph/cli/base.py +685 -0
  83. htmlgraph/cli/constants.py +206 -0
  84. htmlgraph/cli/core.py +954 -0
  85. htmlgraph/cli/main.py +147 -0
  86. htmlgraph/cli/models.py +475 -0
  87. htmlgraph/cli/templates/__init__.py +1 -0
  88. htmlgraph/cli/templates/cost_dashboard.py +399 -0
  89. htmlgraph/cli/work/__init__.py +239 -0
  90. htmlgraph/cli/work/browse.py +115 -0
  91. htmlgraph/cli/work/features.py +568 -0
  92. htmlgraph/cli/work/orchestration.py +676 -0
  93. htmlgraph/cli/work/report.py +728 -0
  94. htmlgraph/cli/work/sessions.py +466 -0
  95. htmlgraph/cli/work/snapshot.py +559 -0
  96. htmlgraph/cli/work/tracks.py +486 -0
  97. htmlgraph/cli_commands/__init__.py +1 -0
  98. htmlgraph/cli_commands/feature.py +195 -0
  99. htmlgraph/cli_framework.py +115 -0
  100. htmlgraph/collections/__init__.py +2 -0
  101. htmlgraph/collections/base.py +197 -14
  102. htmlgraph/collections/bug.py +2 -1
  103. htmlgraph/collections/chore.py +2 -1
  104. htmlgraph/collections/epic.py +2 -1
  105. htmlgraph/collections/feature.py +2 -1
  106. htmlgraph/collections/insight.py +2 -1
  107. htmlgraph/collections/metric.py +2 -1
  108. htmlgraph/collections/pattern.py +2 -1
  109. htmlgraph/collections/phase.py +2 -1
  110. htmlgraph/collections/session.py +194 -0
  111. htmlgraph/collections/spike.py +13 -2
  112. htmlgraph/collections/task_delegation.py +241 -0
  113. htmlgraph/collections/todo.py +14 -1
  114. htmlgraph/collections/traces.py +487 -0
  115. htmlgraph/config/cost_models.json +56 -0
  116. htmlgraph/config.py +190 -0
  117. htmlgraph/context_analytics.py +2 -1
  118. htmlgraph/converter.py +116 -7
  119. htmlgraph/cost_analysis/__init__.py +5 -0
  120. htmlgraph/cost_analysis/analyzer.py +438 -0
  121. htmlgraph/dashboard.html +2246 -248
  122. htmlgraph/dashboard.html.backup +6592 -0
  123. htmlgraph/dashboard.html.bak +7181 -0
  124. htmlgraph/dashboard.html.bak2 +7231 -0
  125. htmlgraph/dashboard.html.bak3 +7232 -0
  126. htmlgraph/db/__init__.py +38 -0
  127. htmlgraph/db/queries.py +790 -0
  128. htmlgraph/db/schema.py +1788 -0
  129. htmlgraph/decorators.py +317 -0
  130. htmlgraph/dependency_models.py +2 -1
  131. htmlgraph/deploy.py +26 -27
  132. htmlgraph/docs/API_REFERENCE.md +841 -0
  133. htmlgraph/docs/HTTP_API.md +750 -0
  134. htmlgraph/docs/INTEGRATION_GUIDE.md +752 -0
  135. htmlgraph/docs/ORCHESTRATION_PATTERNS.md +717 -0
  136. htmlgraph/docs/README.md +532 -0
  137. htmlgraph/docs/__init__.py +77 -0
  138. htmlgraph/docs/docs_version.py +55 -0
  139. htmlgraph/docs/metadata.py +93 -0
  140. htmlgraph/docs/migrations.py +232 -0
  141. htmlgraph/docs/template_engine.py +143 -0
  142. htmlgraph/docs/templates/_sections/cli_reference.md.j2 +52 -0
  143. htmlgraph/docs/templates/_sections/core_concepts.md.j2 +29 -0
  144. htmlgraph/docs/templates/_sections/sdk_basics.md.j2 +69 -0
  145. htmlgraph/docs/templates/base_agents.md.j2 +78 -0
  146. htmlgraph/docs/templates/example_user_override.md.j2 +47 -0
  147. htmlgraph/docs/version_check.py +163 -0
  148. htmlgraph/edge_index.py +2 -1
  149. htmlgraph/error_handler.py +544 -0
  150. htmlgraph/event_log.py +86 -37
  151. htmlgraph/event_migration.py +2 -1
  152. htmlgraph/file_watcher.py +12 -8
  153. htmlgraph/find_api.py +2 -1
  154. htmlgraph/git_events.py +67 -9
  155. htmlgraph/hooks/.htmlgraph/.session-warning-state.json +6 -0
  156. htmlgraph/hooks/.htmlgraph/agents.json +72 -0
  157. htmlgraph/hooks/.htmlgraph/index.sqlite +0 -0
  158. htmlgraph/hooks/__init__.py +8 -0
  159. htmlgraph/hooks/bootstrap.py +169 -0
  160. htmlgraph/hooks/cigs_pretool_enforcer.py +354 -0
  161. htmlgraph/hooks/concurrent_sessions.py +208 -0
  162. htmlgraph/hooks/context.py +350 -0
  163. htmlgraph/hooks/drift_handler.py +525 -0
  164. htmlgraph/hooks/event_tracker.py +790 -99
  165. htmlgraph/hooks/git_commands.py +175 -0
  166. htmlgraph/hooks/installer.py +5 -1
  167. htmlgraph/hooks/orchestrator.py +327 -76
  168. htmlgraph/hooks/orchestrator_reflector.py +31 -4
  169. htmlgraph/hooks/post_tool_use_failure.py +32 -7
  170. htmlgraph/hooks/post_tool_use_handler.py +257 -0
  171. htmlgraph/hooks/posttooluse.py +92 -19
  172. htmlgraph/hooks/pretooluse.py +527 -7
  173. htmlgraph/hooks/prompt_analyzer.py +637 -0
  174. htmlgraph/hooks/session_handler.py +668 -0
  175. htmlgraph/hooks/session_summary.py +395 -0
  176. htmlgraph/hooks/state_manager.py +504 -0
  177. htmlgraph/hooks/subagent_detection.py +202 -0
  178. htmlgraph/hooks/subagent_stop.py +369 -0
  179. htmlgraph/hooks/task_enforcer.py +99 -4
  180. htmlgraph/hooks/validator.py +212 -91
  181. htmlgraph/ids.py +2 -1
  182. htmlgraph/learning.py +125 -100
  183. htmlgraph/mcp_server.py +2 -1
  184. htmlgraph/models.py +217 -18
  185. htmlgraph/operations/README.md +62 -0
  186. htmlgraph/operations/__init__.py +79 -0
  187. htmlgraph/operations/analytics.py +339 -0
  188. htmlgraph/operations/bootstrap.py +289 -0
  189. htmlgraph/operations/events.py +244 -0
  190. htmlgraph/operations/fastapi_server.py +231 -0
  191. htmlgraph/operations/hooks.py +350 -0
  192. htmlgraph/operations/initialization.py +597 -0
  193. htmlgraph/operations/initialization.py.backup +228 -0
  194. htmlgraph/operations/server.py +303 -0
  195. htmlgraph/orchestration/__init__.py +58 -0
  196. htmlgraph/orchestration/claude_launcher.py +179 -0
  197. htmlgraph/orchestration/command_builder.py +72 -0
  198. htmlgraph/orchestration/headless_spawner.py +281 -0
  199. htmlgraph/orchestration/live_events.py +377 -0
  200. htmlgraph/orchestration/model_selection.py +327 -0
  201. htmlgraph/orchestration/plugin_manager.py +140 -0
  202. htmlgraph/orchestration/prompts.py +137 -0
  203. htmlgraph/orchestration/spawner_event_tracker.py +383 -0
  204. htmlgraph/orchestration/spawners/__init__.py +16 -0
  205. htmlgraph/orchestration/spawners/base.py +194 -0
  206. htmlgraph/orchestration/spawners/claude.py +173 -0
  207. htmlgraph/orchestration/spawners/codex.py +435 -0
  208. htmlgraph/orchestration/spawners/copilot.py +294 -0
  209. htmlgraph/orchestration/spawners/gemini.py +471 -0
  210. htmlgraph/orchestration/subprocess_runner.py +36 -0
  211. htmlgraph/{orchestration.py → orchestration/task_coordination.py} +16 -8
  212. htmlgraph/orchestration.md +563 -0
  213. htmlgraph/orchestrator-system-prompt-optimized.txt +863 -0
  214. htmlgraph/orchestrator.py +2 -1
  215. htmlgraph/orchestrator_config.py +357 -0
  216. htmlgraph/orchestrator_mode.py +115 -4
  217. htmlgraph/parallel.py +2 -1
  218. htmlgraph/parser.py +86 -6
  219. htmlgraph/path_query.py +608 -0
  220. htmlgraph/pattern_matcher.py +636 -0
  221. htmlgraph/pydantic_models.py +476 -0
  222. htmlgraph/quality_gates.py +350 -0
  223. htmlgraph/query_builder.py +2 -1
  224. htmlgraph/query_composer.py +509 -0
  225. htmlgraph/reflection.py +443 -0
  226. htmlgraph/refs.py +344 -0
  227. htmlgraph/repo_hash.py +512 -0
  228. htmlgraph/repositories/__init__.py +292 -0
  229. htmlgraph/repositories/analytics_repository.py +455 -0
  230. htmlgraph/repositories/analytics_repository_standard.py +628 -0
  231. htmlgraph/repositories/feature_repository.py +581 -0
  232. htmlgraph/repositories/feature_repository_htmlfile.py +668 -0
  233. htmlgraph/repositories/feature_repository_memory.py +607 -0
  234. htmlgraph/repositories/feature_repository_sqlite.py +858 -0
  235. htmlgraph/repositories/filter_service.py +620 -0
  236. htmlgraph/repositories/filter_service_standard.py +445 -0
  237. htmlgraph/repositories/shared_cache.py +621 -0
  238. htmlgraph/repositories/shared_cache_memory.py +395 -0
  239. htmlgraph/repositories/track_repository.py +552 -0
  240. htmlgraph/repositories/track_repository_htmlfile.py +619 -0
  241. htmlgraph/repositories/track_repository_memory.py +508 -0
  242. htmlgraph/repositories/track_repository_sqlite.py +711 -0
  243. htmlgraph/sdk/__init__.py +398 -0
  244. htmlgraph/sdk/__init__.pyi +14 -0
  245. htmlgraph/sdk/analytics/__init__.py +19 -0
  246. htmlgraph/sdk/analytics/engine.py +155 -0
  247. htmlgraph/sdk/analytics/helpers.py +178 -0
  248. htmlgraph/sdk/analytics/registry.py +109 -0
  249. htmlgraph/sdk/base.py +484 -0
  250. htmlgraph/sdk/constants.py +216 -0
  251. htmlgraph/sdk/core.pyi +308 -0
  252. htmlgraph/sdk/discovery.py +120 -0
  253. htmlgraph/sdk/help/__init__.py +12 -0
  254. htmlgraph/sdk/help/mixin.py +699 -0
  255. htmlgraph/sdk/mixins/__init__.py +15 -0
  256. htmlgraph/sdk/mixins/attribution.py +113 -0
  257. htmlgraph/sdk/mixins/mixin.py +410 -0
  258. htmlgraph/sdk/operations/__init__.py +12 -0
  259. htmlgraph/sdk/operations/mixin.py +427 -0
  260. htmlgraph/sdk/orchestration/__init__.py +17 -0
  261. htmlgraph/sdk/orchestration/coordinator.py +203 -0
  262. htmlgraph/sdk/orchestration/spawner.py +204 -0
  263. htmlgraph/sdk/planning/__init__.py +19 -0
  264. htmlgraph/sdk/planning/bottlenecks.py +93 -0
  265. htmlgraph/sdk/planning/mixin.py +211 -0
  266. htmlgraph/sdk/planning/parallel.py +186 -0
  267. htmlgraph/sdk/planning/queue.py +210 -0
  268. htmlgraph/sdk/planning/recommendations.py +87 -0
  269. htmlgraph/sdk/planning/smart_planning.py +319 -0
  270. htmlgraph/sdk/session/__init__.py +19 -0
  271. htmlgraph/sdk/session/continuity.py +57 -0
  272. htmlgraph/sdk/session/handoff.py +110 -0
  273. htmlgraph/sdk/session/info.py +309 -0
  274. htmlgraph/sdk/session/manager.py +103 -0
  275. htmlgraph/sdk/strategic/__init__.py +26 -0
  276. htmlgraph/sdk/strategic/mixin.py +563 -0
  277. htmlgraph/server.py +295 -107
  278. htmlgraph/session_hooks.py +300 -0
  279. htmlgraph/session_manager.py +285 -3
  280. htmlgraph/session_registry.py +587 -0
  281. htmlgraph/session_state.py +436 -0
  282. htmlgraph/session_warning.py +2 -1
  283. htmlgraph/sessions/__init__.py +23 -0
  284. htmlgraph/sessions/handoff.py +756 -0
  285. htmlgraph/system_prompts.py +450 -0
  286. htmlgraph/templates/orchestration-view.html +350 -0
  287. htmlgraph/track_builder.py +33 -1
  288. htmlgraph/track_manager.py +38 -0
  289. htmlgraph/transcript.py +18 -5
  290. htmlgraph/validation.py +115 -0
  291. htmlgraph/watch.py +2 -1
  292. htmlgraph/work_type_utils.py +2 -1
  293. {htmlgraph-0.20.1.data → htmlgraph-0.27.5.data}/data/htmlgraph/dashboard.html +2246 -248
  294. {htmlgraph-0.20.1.dist-info → htmlgraph-0.27.5.dist-info}/METADATA +95 -64
  295. htmlgraph-0.27.5.dist-info/RECORD +337 -0
  296. {htmlgraph-0.20.1.dist-info → htmlgraph-0.27.5.dist-info}/entry_points.txt +1 -1
  297. htmlgraph/cli.py +0 -4839
  298. htmlgraph/sdk.py +0 -2359
  299. htmlgraph-0.20.1.dist-info/RECORD +0 -118
  300. {htmlgraph-0.20.1.data → htmlgraph-0.27.5.data}/data/htmlgraph/styles.css +0 -0
  301. {htmlgraph-0.20.1.data → htmlgraph-0.27.5.data}/data/htmlgraph/templates/AGENTS.md.template +0 -0
  302. {htmlgraph-0.20.1.data → htmlgraph-0.27.5.data}/data/htmlgraph/templates/CLAUDE.md.template +0 -0
  303. {htmlgraph-0.20.1.data → htmlgraph-0.27.5.data}/data/htmlgraph/templates/GEMINI.md.template +0 -0
  304. {htmlgraph-0.20.1.dist-info → htmlgraph-0.27.5.dist-info}/WHEEL +0 -0
@@ -0,0 +1,1344 @@
1
+ /* ============================================================================
2
+ HtmlGraph Dashboard - Maximalist Redesign
3
+ Aesthetic: Information-Dense + Technical Sophistication
4
+ ============================================================================ */
5
+
6
+ /* ============================================================================
7
+ ROOT VARIABLES & RESET
8
+ ============================================================================ */
9
+
10
+ * {
11
+ margin: 0;
12
+ padding: 0;
13
+ box-sizing: border-box;
14
+ }
15
+
16
+ :root {
17
+ /* Primary Colors */
18
+ --bg-dark: #0a0a0a;
19
+ --bg-darker: #1a1a1a;
20
+ --bg-card: #151515;
21
+ --bg-hover: #202020;
22
+ --accent-lime: #CDFF00;
23
+ --accent-secondary: #6C5CE7;
24
+
25
+ /* Text Colors */
26
+ --text-primary: #FFFFFF;
27
+ --text-secondary: #A3A3A3;
28
+ --text-muted: #6B7280;
29
+
30
+ /* Border & Dividers */
31
+ --border-subtle: #2A2A2A;
32
+ --border-medium: #3A3A3A;
33
+ --border-bright: #4A4A4A;
34
+
35
+ /* Agent Model Colors */
36
+ --agent-claude: #8B5CF6;
37
+ --agent-gemini: #3B82F6;
38
+ --agent-copilot: #6B7280;
39
+ --agent-openai: #10B981;
40
+
41
+ /* Status Colors */
42
+ --status-success: #10B981;
43
+ --status-progress: #3B82F6;
44
+ --status-blocked: #EF4444;
45
+ --status-todo: #6B7280;
46
+ --status-done: #8B5CF6;
47
+
48
+ /* Spacing */
49
+ --spacing-xs: 0.25rem;
50
+ --spacing-sm: 0.5rem;
51
+ --spacing-md: 1rem;
52
+ --spacing-lg: 1.5rem;
53
+ --spacing-xl: 2rem;
54
+ --spacing-2xl: 3rem;
55
+
56
+ /* Shadows */
57
+ --shadow-sm: 0 1px 3px rgba(205, 255, 0, 0.05);
58
+ --shadow-md: 0 4px 12px rgba(205, 255, 0, 0.08);
59
+ --shadow-lg: 0 8px 24px rgba(205, 255, 0, 0.12);
60
+ --shadow-glow: 0 0 20px rgba(205, 255, 0, 0.15);
61
+
62
+ /* Transitions */
63
+ --transition-fast: 150ms ease;
64
+ --transition-base: 300ms ease;
65
+ --transition-slow: 500ms ease;
66
+
67
+ /* Z-Index */
68
+ --z-base: 1;
69
+ --z-overlay: 10;
70
+ --z-modal: 100;
71
+ --z-tooltip: 1000;
72
+ }
73
+
74
+ html, body {
75
+ width: 100%;
76
+ height: 100%;
77
+ overflow: hidden;
78
+ }
79
+
80
+ body {
81
+ background-color: var(--bg-dark);
82
+ color: var(--text-primary);
83
+ font-family: 'Courier New', Courier, monospace;
84
+ font-size: 1rem;
85
+ line-height: 1.6;
86
+ overflow: hidden;
87
+ }
88
+
89
+ /* ============================================================================
90
+ TYPOGRAPHY
91
+ ============================================================================ */
92
+
93
+ h1, h2, h3, h4, h5, h6 {
94
+ font-family: 'JetBrains Mono', 'IBM Plex Mono', monospace;
95
+ font-weight: 700;
96
+ letter-spacing: 0.05em;
97
+ color: var(--text-primary);
98
+ }
99
+
100
+ h1 { font-size: 2.5rem; }
101
+ h2 { font-size: 1.75rem; }
102
+ h3 { font-size: 1.25rem; }
103
+ h4 { font-size: 1.1rem; }
104
+ h5 { font-size: 1rem; }
105
+ h6 { font-size: 0.9rem; }
106
+
107
+ code, pre {
108
+ font-family: 'JetBrains Mono', monospace;
109
+ font-size: 0.875rem;
110
+ color: var(--accent-lime);
111
+ }
112
+
113
+ small {
114
+ font-size: 0.85rem;
115
+ color: var(--text-secondary);
116
+ }
117
+
118
+ /* ============================================================================
119
+ DASHBOARD LAYOUT
120
+ ============================================================================ */
121
+
122
+ .dashboard-container {
123
+ display: flex;
124
+ flex-direction: column;
125
+ height: 100vh;
126
+ width: 100vw;
127
+ background-color: var(--bg-dark);
128
+ }
129
+
130
+ /* Header */
131
+ .dashboard-header {
132
+ background: linear-gradient(135deg, var(--bg-dark) 0%, var(--bg-darker) 100%);
133
+ border-bottom: 2px solid var(--accent-lime);
134
+ padding: var(--spacing-xl) var(--spacing-2xl);
135
+ flex-shrink: 0;
136
+ height: auto;
137
+ box-shadow: var(--shadow-glow);
138
+ }
139
+
140
+ .header-content {
141
+ display: flex;
142
+ justify-content: space-between;
143
+ align-items: center;
144
+ max-width: 1600px;
145
+ margin: 0 auto;
146
+ width: 100%;
147
+ }
148
+
149
+ .logo {
150
+ display: flex;
151
+ align-items: center;
152
+ gap: var(--spacing-lg);
153
+ font-size: 1.75rem;
154
+ font-weight: 700;
155
+ color: var(--accent-lime);
156
+ text-transform: uppercase;
157
+ letter-spacing: 0.1em;
158
+ }
159
+
160
+ .logo-icon {
161
+ font-size: 2.5rem;
162
+ animation: pulse-icon 2s ease-in-out infinite;
163
+ display: inline-block;
164
+ }
165
+
166
+ @keyframes pulse-icon {
167
+ 0%, 100% { opacity: 1; }
168
+ 50% { opacity: 0.6; }
169
+ }
170
+
171
+ .header-stats {
172
+ display: flex;
173
+ gap: var(--spacing-xl);
174
+ align-items: center;
175
+ }
176
+
177
+ .stat-badge {
178
+ background: var(--bg-card);
179
+ border: 1px solid var(--border-subtle);
180
+ border-radius: 2px;
181
+ padding: var(--spacing-sm) var(--spacing-lg);
182
+ display: flex;
183
+ align-items: center;
184
+ gap: var(--spacing-md);
185
+ transition: all var(--transition-base);
186
+ }
187
+
188
+ .stat-badge:hover {
189
+ border-color: var(--accent-lime);
190
+ background: var(--bg-hover);
191
+ box-shadow: var(--shadow-md);
192
+ }
193
+
194
+ .stat-badge.pulse {
195
+ animation: pulse-badge 0.5s ease-out;
196
+ border-color: var(--accent-lime);
197
+ }
198
+
199
+ @keyframes pulse-badge {
200
+ 0% {
201
+ box-shadow: 0 0 0 0 rgba(205, 255, 0, 0.7);
202
+ }
203
+ 70% {
204
+ box-shadow: 0 0 0 8px rgba(205, 255, 0, 0);
205
+ }
206
+ 100% {
207
+ box-shadow: 0 0 0 0 rgba(205, 255, 0, 0);
208
+ }
209
+ }
210
+
211
+ .stat-label {
212
+ color: var(--text-muted);
213
+ font-size: 0.85rem;
214
+ text-transform: uppercase;
215
+ letter-spacing: 0.05em;
216
+ }
217
+
218
+ .stat-value {
219
+ font-weight: 700;
220
+ color: var(--accent-lime);
221
+ font-size: 1.4rem;
222
+ font-family: 'JetBrains Mono', monospace;
223
+ }
224
+
225
+ .ws-indicator {
226
+ display: flex;
227
+ align-items: center;
228
+ gap: var(--spacing-sm);
229
+ padding: var(--spacing-sm) var(--spacing-md);
230
+ background: var(--bg-card);
231
+ border: 1px solid var(--border-subtle);
232
+ border-radius: 2px;
233
+ font-size: 0.85rem;
234
+ }
235
+
236
+ .ws-dot {
237
+ width: 8px;
238
+ height: 8px;
239
+ border-radius: 50%;
240
+ animation: pulse-ws 2s infinite;
241
+ }
242
+
243
+ .ws-dot.connected {
244
+ background: var(--status-success);
245
+ }
246
+
247
+ .ws-dot.disconnected {
248
+ background: var(--status-blocked);
249
+ }
250
+
251
+ @keyframes pulse-ws {
252
+ 0%, 100% { opacity: 1; }
253
+ 50% { opacity: 0.5; }
254
+ }
255
+
256
+ /* Navigation Tabs */
257
+ .tabs-navigation {
258
+ display: flex;
259
+ border-bottom: 1px solid var(--border-subtle);
260
+ background-color: var(--bg-darker);
261
+ padding: 0;
262
+ overflow-x: auto;
263
+ flex-shrink: 0;
264
+ gap: var(--spacing-md);
265
+ padding-left: var(--spacing-xl);
266
+ }
267
+
268
+ .tabs-navigation::-webkit-scrollbar {
269
+ height: 4px;
270
+ }
271
+
272
+ .tabs-navigation::-webkit-scrollbar-thumb {
273
+ background: var(--border-medium);
274
+ border-radius: 2px;
275
+ }
276
+
277
+ .tab-button {
278
+ flex: 0 0 auto;
279
+ padding: var(--spacing-lg) var(--spacing-xl);
280
+ background: none;
281
+ border: none;
282
+ color: var(--text-secondary);
283
+ cursor: pointer;
284
+ font-size: 1rem;
285
+ font-weight: 500;
286
+ font-family: 'JetBrains Mono', monospace;
287
+ display: flex;
288
+ align-items: center;
289
+ gap: var(--spacing-md);
290
+ transition: all var(--transition-base);
291
+ border-bottom: 3px solid transparent;
292
+ position: relative;
293
+ text-transform: uppercase;
294
+ letter-spacing: 0.05em;
295
+ white-space: nowrap;
296
+ }
297
+
298
+ .tab-button:hover {
299
+ color: var(--accent-lime);
300
+ }
301
+
302
+ .tab-button.active {
303
+ color: var(--accent-lime);
304
+ border-bottom-color: var(--accent-lime);
305
+ box-shadow: inset 0 -2px 0 var(--accent-lime);
306
+ }
307
+
308
+ .tab-icon {
309
+ font-size: 1.2rem;
310
+ }
311
+
312
+ /* Content Area */
313
+ .content-area {
314
+ flex: 1;
315
+ overflow-y: auto;
316
+ overflow-x: hidden;
317
+ padding: var(--spacing-2xl);
318
+ background: var(--bg-dark);
319
+ }
320
+
321
+ .content-area::-webkit-scrollbar {
322
+ width: 8px;
323
+ }
324
+
325
+ .content-area::-webkit-scrollbar-track {
326
+ background: var(--bg-darker);
327
+ }
328
+
329
+ .content-area::-webkit-scrollbar-thumb {
330
+ background: var(--border-medium);
331
+ border-radius: 4px;
332
+ }
333
+
334
+ .content-area::-webkit-scrollbar-thumb:hover {
335
+ background: var(--accent-lime);
336
+ }
337
+
338
+ /* Loading Indicator */
339
+ .loading-indicator {
340
+ display: flex;
341
+ flex-direction: column;
342
+ align-items: center;
343
+ justify-content: center;
344
+ height: 100%;
345
+ gap: var(--spacing-xl);
346
+ color: var(--text-secondary);
347
+ }
348
+
349
+ .spinner {
350
+ width: 40px;
351
+ height: 40px;
352
+ border: 3px solid var(--border-medium);
353
+ border-top-color: var(--accent-lime);
354
+ border-radius: 50%;
355
+ animation: spin 1s linear infinite;
356
+ }
357
+
358
+ @keyframes spin {
359
+ to { transform: rotate(360deg); }
360
+ }
361
+
362
+ /* ============================================================================
363
+ VIEW CONTAINERS
364
+ ============================================================================ */
365
+
366
+ .view-container {
367
+ display: flex;
368
+ flex-direction: column;
369
+ height: 100%;
370
+ gap: var(--spacing-xl);
371
+ animation: fadeInUp 0.4s ease;
372
+ }
373
+
374
+ @keyframes fadeInUp {
375
+ from {
376
+ opacity: 0;
377
+ transform: translateY(10px);
378
+ }
379
+ to {
380
+ opacity: 1;
381
+ transform: translateY(0);
382
+ }
383
+ }
384
+
385
+ .view-header {
386
+ display: flex;
387
+ flex-direction: column;
388
+ gap: var(--spacing-md);
389
+ padding-bottom: var(--spacing-lg);
390
+ border-bottom: 2px solid var(--border-subtle);
391
+ }
392
+
393
+ .view-header h2 {
394
+ color: var(--accent-lime);
395
+ text-transform: uppercase;
396
+ letter-spacing: 0.1em;
397
+ }
398
+
399
+ .view-description {
400
+ color: var(--text-secondary);
401
+ font-size: 0.9rem;
402
+ }
403
+
404
+ .view-filters {
405
+ display: flex;
406
+ gap: var(--spacing-lg);
407
+ align-items: center;
408
+ flex-wrap: wrap;
409
+ }
410
+
411
+ .filter-group {
412
+ display: flex;
413
+ align-items: center;
414
+ gap: var(--spacing-md);
415
+ }
416
+
417
+ .filter-input, .filter-select {
418
+ background: var(--bg-card);
419
+ border: 1px solid var(--border-subtle);
420
+ border-radius: 2px;
421
+ padding: var(--spacing-sm) var(--spacing-md);
422
+ color: var(--text-primary);
423
+ font-family: 'Courier New', monospace;
424
+ font-size: 0.95rem;
425
+ transition: all var(--transition-base);
426
+ }
427
+
428
+ .filter-input:focus, .filter-select:focus {
429
+ outline: none;
430
+ border-color: var(--accent-lime);
431
+ box-shadow: 0 0 0 2px rgba(205, 255, 0, 0.1);
432
+ }
433
+
434
+ .filter-input::placeholder {
435
+ color: var(--text-muted);
436
+ }
437
+
438
+ /* ============================================================================
439
+ ACTIVITY TIMELINE (HIERARCHICAL)
440
+ ============================================================================ */
441
+
442
+ .activity-timeline {
443
+ display: flex;
444
+ flex-direction: column;
445
+ gap: var(--spacing-lg);
446
+ position: relative;
447
+ padding-left: var(--spacing-xl);
448
+ }
449
+
450
+ .activity-timeline::before {
451
+ content: '';
452
+ position: absolute;
453
+ left: 0;
454
+ top: 0;
455
+ bottom: 0;
456
+ width: 2px;
457
+ background: linear-gradient(180deg, var(--accent-lime) 0%, transparent 100%);
458
+ }
459
+
460
+ .timeline-event {
461
+ display: flex;
462
+ gap: var(--spacing-lg);
463
+ animation: slideInLeft 0.4s ease;
464
+ }
465
+
466
+ @keyframes slideInLeft {
467
+ from {
468
+ opacity: 0;
469
+ transform: translateX(-20px);
470
+ }
471
+ to {
472
+ opacity: 1;
473
+ transform: translateX(0);
474
+ }
475
+ }
476
+
477
+ .timeline-node {
478
+ position: relative;
479
+ margin-top: 8px;
480
+ flex-shrink: 0;
481
+ }
482
+
483
+ .timeline-node::before {
484
+ content: '';
485
+ position: absolute;
486
+ left: -18px;
487
+ top: 0;
488
+ width: 12px;
489
+ height: 12px;
490
+ border-radius: 50%;
491
+ background: var(--accent-lime);
492
+ border: 2px solid var(--bg-dark);
493
+ box-shadow: 0 0 8px rgba(205, 255, 0, 0.3);
494
+ }
495
+
496
+ .timeline-content {
497
+ flex: 1;
498
+ background: var(--bg-card);
499
+ border: 1px solid var(--border-subtle);
500
+ border-radius: 2px;
501
+ padding: var(--spacing-lg);
502
+ transition: all var(--transition-base);
503
+ }
504
+
505
+ .timeline-content:hover {
506
+ border-color: var(--accent-lime);
507
+ box-shadow: var(--shadow-md);
508
+ }
509
+
510
+ .timeline-header {
511
+ display: flex;
512
+ align-items: center;
513
+ gap: var(--spacing-md);
514
+ margin-bottom: var(--spacing-md);
515
+ }
516
+
517
+ .event-badge {
518
+ display: inline-flex;
519
+ align-items: center;
520
+ justify-content: center;
521
+ width: 24px;
522
+ height: 24px;
523
+ background: var(--accent-lime);
524
+ border-radius: 2px;
525
+ font-weight: 700;
526
+ color: var(--bg-dark);
527
+ font-size: 0.75rem;
528
+ }
529
+
530
+ .timestamp {
531
+ color: var(--accent-lime);
532
+ font-family: 'JetBrains Mono', monospace;
533
+ font-size: 0.85rem;
534
+ font-weight: 600;
535
+ }
536
+
537
+ .agent-badge {
538
+ display: inline-flex;
539
+ align-items: center;
540
+ gap: var(--spacing-sm);
541
+ padding: var(--spacing-sm) var(--spacing-md);
542
+ border-radius: 2px;
543
+ font-size: 0.85rem;
544
+ font-weight: 600;
545
+ text-transform: uppercase;
546
+ letter-spacing: 0.05em;
547
+ }
548
+
549
+ .agent-badge.claude {
550
+ background: rgba(139, 92, 246, 0.15);
551
+ color: var(--agent-claude);
552
+ border: 1px solid var(--agent-claude);
553
+ }
554
+
555
+ .agent-badge.gemini {
556
+ background: rgba(59, 130, 246, 0.15);
557
+ color: var(--agent-gemini);
558
+ border: 1px solid var(--agent-gemini);
559
+ }
560
+
561
+ .agent-badge.copilot {
562
+ background: rgba(107, 114, 128, 0.15);
563
+ color: var(--agent-copilot);
564
+ border: 1px solid var(--agent-copilot);
565
+ }
566
+
567
+ .agent-badge.openai {
568
+ background: rgba(16, 185, 129, 0.15);
569
+ color: var(--agent-openai);
570
+ border: 1px solid var(--agent-openai);
571
+ }
572
+
573
+ .timeline-meta {
574
+ display: flex;
575
+ gap: var(--spacing-md);
576
+ align-items: center;
577
+ font-size: 0.85rem;
578
+ color: var(--text-secondary);
579
+ margin-bottom: var(--spacing-md);
580
+ flex-wrap: wrap;
581
+ }
582
+
583
+ .meta-item {
584
+ display: flex;
585
+ align-items: center;
586
+ gap: var(--spacing-sm);
587
+ }
588
+
589
+ .status-badge {
590
+ display: inline-flex;
591
+ align-items: center;
592
+ padding: var(--spacing-xs) var(--spacing-sm);
593
+ border-radius: 2px;
594
+ font-size: 0.75rem;
595
+ font-weight: 600;
596
+ text-transform: uppercase;
597
+ letter-spacing: 0.05em;
598
+ }
599
+
600
+ .status-badge.success {
601
+ background: rgba(16, 185, 129, 0.15);
602
+ color: var(--status-success);
603
+ border: 1px solid var(--status-success);
604
+ }
605
+
606
+ .status-badge.progress {
607
+ background: rgba(59, 130, 246, 0.15);
608
+ color: var(--status-progress);
609
+ border: 1px solid var(--status-progress);
610
+ }
611
+
612
+ .status-badge.blocked {
613
+ background: rgba(239, 68, 68, 0.15);
614
+ color: var(--status-blocked);
615
+ border: 1px solid var(--status-blocked);
616
+ }
617
+
618
+ .status-badge.todo {
619
+ background: rgba(107, 114, 128, 0.15);
620
+ color: var(--status-todo);
621
+ border: 1px solid var(--status-todo);
622
+ }
623
+
624
+ .timeline-description {
625
+ color: var(--text-secondary);
626
+ line-height: 1.6;
627
+ margin-bottom: var(--spacing-md);
628
+ }
629
+
630
+ .timeline-details {
631
+ display: grid;
632
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
633
+ gap: var(--spacing-md);
634
+ background: var(--bg-darker);
635
+ padding: var(--spacing-md);
636
+ border-radius: 2px;
637
+ border: 1px solid var(--border-subtle);
638
+ margin-top: var(--spacing-md);
639
+ }
640
+
641
+ .detail-row {
642
+ display: flex;
643
+ flex-direction: column;
644
+ gap: var(--spacing-xs);
645
+ }
646
+
647
+ .detail-label {
648
+ font-size: 0.75rem;
649
+ color: var(--text-muted);
650
+ text-transform: uppercase;
651
+ letter-spacing: 0.05em;
652
+ }
653
+
654
+ .detail-value {
655
+ color: var(--text-primary);
656
+ word-break: break-all;
657
+ font-family: 'JetBrains Mono', monospace;
658
+ }
659
+
660
+ .timeline-children {
661
+ margin-top: var(--spacing-lg);
662
+ padding-left: var(--spacing-xl);
663
+ border-left: 2px dashed var(--border-subtle);
664
+ position: relative;
665
+ }
666
+
667
+ .timeline-children::before {
668
+ content: '';
669
+ position: absolute;
670
+ left: -13px;
671
+ top: -16px;
672
+ width: 12px;
673
+ height: 16px;
674
+ border: 2px solid var(--border-subtle);
675
+ border-top: none;
676
+ border-right: none;
677
+ }
678
+
679
+ .timeline-expand-btn {
680
+ background: none;
681
+ border: none;
682
+ color: var(--accent-lime);
683
+ cursor: pointer;
684
+ font-family: 'JetBrains Mono', monospace;
685
+ font-size: 0.85rem;
686
+ padding: 0;
687
+ transition: all var(--transition-fast);
688
+ }
689
+
690
+ .timeline-expand-btn:hover {
691
+ transform: translateX(4px);
692
+ }
693
+
694
+ /* ============================================================================
695
+ ORCHESTRATION GRAPH
696
+ ============================================================================ */
697
+
698
+ .orchestration-graph {
699
+ background: var(--bg-card);
700
+ border: 1px solid var(--border-subtle);
701
+ border-radius: 2px;
702
+ padding: var(--spacing-xl);
703
+ height: 600px;
704
+ position: relative;
705
+ overflow: hidden;
706
+ }
707
+
708
+ .graph-container {
709
+ width: 100%;
710
+ height: 100%;
711
+ position: relative;
712
+ }
713
+
714
+ .graph-node {
715
+ position: absolute;
716
+ background: var(--bg-darker);
717
+ border: 2px solid var(--border-medium);
718
+ border-radius: 4px;
719
+ padding: var(--spacing-md);
720
+ min-width: 120px;
721
+ text-align: center;
722
+ cursor: pointer;
723
+ transition: all var(--transition-base);
724
+ user-select: none;
725
+ }
726
+
727
+ .graph-node:hover {
728
+ border-color: var(--accent-lime);
729
+ box-shadow: var(--shadow-lg);
730
+ transform: scale(1.05);
731
+ }
732
+
733
+ .graph-node.claude {
734
+ background: rgba(139, 92, 246, 0.1);
735
+ border-color: var(--agent-claude);
736
+ }
737
+
738
+ .graph-node.gemini {
739
+ background: rgba(59, 130, 246, 0.1);
740
+ border-color: var(--agent-gemini);
741
+ }
742
+
743
+ .node-label {
744
+ font-weight: 700;
745
+ color: var(--accent-lime);
746
+ font-size: 0.95rem;
747
+ margin-bottom: var(--spacing-sm);
748
+ }
749
+
750
+ .node-cost {
751
+ font-size: 0.75rem;
752
+ color: var(--text-secondary);
753
+ }
754
+
755
+ /* SVG Edges */
756
+ .graph-edges {
757
+ position: absolute;
758
+ top: 0;
759
+ left: 0;
760
+ width: 100%;
761
+ height: 100%;
762
+ pointer-events: none;
763
+ z-index: 0;
764
+ }
765
+
766
+ .graph-nodes {
767
+ position: relative;
768
+ z-index: 1;
769
+ }
770
+
771
+ /* ============================================================================
772
+ KANBAN BOARD (SMART)
773
+ ============================================================================ */
774
+
775
+ .kanban-board {
776
+ display: grid;
777
+ grid-template-columns: repeat(4, 1fr);
778
+ gap: var(--spacing-lg);
779
+ height: calc(100% - 100px);
780
+ auto-rows: max-content;
781
+ }
782
+
783
+ .kanban-column {
784
+ display: flex;
785
+ flex-direction: column;
786
+ background: var(--bg-card);
787
+ border: 1px solid var(--border-subtle);
788
+ border-radius: 2px;
789
+ overflow: hidden;
790
+ transition: all var(--transition-base);
791
+ max-height: 100%;
792
+ }
793
+
794
+ .kanban-column.collapsed {
795
+ background: var(--bg-darker);
796
+ grid-column: span 1;
797
+ }
798
+
799
+ .column-header {
800
+ display: flex;
801
+ justify-content: space-between;
802
+ align-items: center;
803
+ padding: var(--spacing-lg);
804
+ background: var(--bg-darker);
805
+ border-bottom: 1px solid var(--border-subtle);
806
+ cursor: pointer;
807
+ transition: all var(--transition-base);
808
+ }
809
+
810
+ .kanban-column.collapsed .column-header {
811
+ background: var(--bg-dark);
812
+ }
813
+
814
+ .column-header:hover {
815
+ background: var(--bg-hover);
816
+ }
817
+
818
+ .column-header h3 {
819
+ margin: 0;
820
+ font-size: 1.1rem;
821
+ color: var(--accent-lime);
822
+ text-transform: uppercase;
823
+ letter-spacing: 0.05em;
824
+ }
825
+
826
+ .column-count {
827
+ background: var(--accent-lime);
828
+ color: var(--bg-dark);
829
+ padding: var(--spacing-xs) var(--spacing-sm);
830
+ border-radius: 2px;
831
+ font-weight: 700;
832
+ font-size: 0.85rem;
833
+ }
834
+
835
+ .kanban-column.collapsed .column-count {
836
+ display: inline-flex;
837
+ align-items: center;
838
+ gap: var(--spacing-sm);
839
+ }
840
+
841
+ .column-collapse-indicator::after {
842
+ content: ' ▼';
843
+ font-size: 0.7rem;
844
+ color: var(--text-secondary);
845
+ }
846
+
847
+ .kanban-column.collapsed .column-collapse-indicator::after {
848
+ content: ' ▶';
849
+ }
850
+
851
+ .column-cards {
852
+ flex: 1;
853
+ overflow-y: auto;
854
+ padding: var(--spacing-md);
855
+ display: flex;
856
+ flex-direction: column;
857
+ gap: var(--spacing-md);
858
+ }
859
+
860
+ .kanban-column.collapsed .column-cards {
861
+ display: none;
862
+ }
863
+
864
+ .feature-card {
865
+ background: var(--bg-darker);
866
+ border: 1px solid var(--border-subtle);
867
+ border-radius: 2px;
868
+ padding: var(--spacing-lg);
869
+ cursor: grab;
870
+ transition: all var(--transition-base);
871
+ flex-shrink: 0;
872
+ user-select: none;
873
+ }
874
+
875
+ .feature-card:hover {
876
+ border-color: var(--accent-lime);
877
+ box-shadow: var(--shadow-md);
878
+ transform: translateY(-2px);
879
+ }
880
+
881
+ .feature-card.dragging {
882
+ opacity: 0.5;
883
+ cursor: grabbing;
884
+ }
885
+
886
+ .card-header {
887
+ display: flex;
888
+ gap: var(--spacing-md);
889
+ margin-bottom: var(--spacing-md);
890
+ flex-wrap: wrap;
891
+ }
892
+
893
+ .feature-type-badge {
894
+ padding: var(--spacing-xs) var(--spacing-sm);
895
+ border-radius: 2px;
896
+ font-size: 0.75rem;
897
+ font-weight: 600;
898
+ text-transform: uppercase;
899
+ letter-spacing: 0.05em;
900
+ background: var(--bg-card);
901
+ color: var(--text-primary);
902
+ border: 1px solid var(--border-subtle);
903
+ }
904
+
905
+ .priority-badge {
906
+ padding: var(--spacing-xs) var(--spacing-sm);
907
+ border-radius: 2px;
908
+ font-size: 0.75rem;
909
+ font-weight: 600;
910
+ text-transform: uppercase;
911
+ letter-spacing: 0.05em;
912
+ }
913
+
914
+ .priority-badge.high {
915
+ background: rgba(239, 68, 68, 0.15);
916
+ color: var(--status-blocked);
917
+ border: 1px solid var(--status-blocked);
918
+ }
919
+
920
+ .priority-badge.medium {
921
+ background: rgba(251, 191, 36, 0.15);
922
+ color: #FBBF24;
923
+ border: 1px solid #FBBF24;
924
+ }
925
+
926
+ .priority-badge.low {
927
+ background: rgba(34, 197, 94, 0.15);
928
+ color: var(--status-success);
929
+ border: 1px solid var(--status-success);
930
+ }
931
+
932
+ .card-title {
933
+ color: var(--text-primary);
934
+ font-size: 1rem;
935
+ margin: 0;
936
+ line-height: 1.4;
937
+ }
938
+
939
+ .card-description {
940
+ color: var(--text-secondary);
941
+ font-size: 0.9rem;
942
+ margin: var(--spacing-md) 0 0 0;
943
+ line-height: 1.5;
944
+ }
945
+
946
+ .card-footer {
947
+ display: flex;
948
+ justify-content: space-between;
949
+ align-items: center;
950
+ margin-top: var(--spacing-md);
951
+ padding-top: var(--spacing-md);
952
+ border-top: 1px solid var(--border-subtle);
953
+ font-size: 0.85rem;
954
+ color: var(--text-secondary);
955
+ }
956
+
957
+ .feature-id {
958
+ font-family: 'JetBrains Mono', monospace;
959
+ color: var(--accent-lime);
960
+ font-weight: 600;
961
+ }
962
+
963
+ .assigned-to {
964
+ color: var(--text-muted);
965
+ }
966
+
967
+ .empty-column {
968
+ display: flex;
969
+ align-items: center;
970
+ justify-content: center;
971
+ height: 100px;
972
+ color: var(--text-muted);
973
+ font-size: 0.9rem;
974
+ text-align: center;
975
+ padding: var(--spacing-lg);
976
+ }
977
+
978
+ /* ============================================================================
979
+ AGENTS GRID
980
+ ============================================================================ */
981
+
982
+ .agents-grid {
983
+ display: grid;
984
+ grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
985
+ gap: var(--spacing-lg);
986
+ }
987
+
988
+ .agent-card {
989
+ background: var(--bg-card);
990
+ border: 1px solid var(--border-subtle);
991
+ border-radius: 2px;
992
+ padding: var(--spacing-xl);
993
+ display: flex;
994
+ flex-direction: column;
995
+ gap: var(--spacing-lg);
996
+ transition: all var(--transition-base);
997
+ }
998
+
999
+ .agent-card:hover {
1000
+ border-color: var(--accent-lime);
1001
+ box-shadow: var(--shadow-lg);
1002
+ transform: translateY(-4px);
1003
+ }
1004
+
1005
+ .agent-header {
1006
+ display: flex;
1007
+ align-items: center;
1008
+ gap: var(--spacing-lg);
1009
+ padding-bottom: var(--spacing-lg);
1010
+ border-bottom: 1px solid var(--border-subtle);
1011
+ }
1012
+
1013
+ .agent-icon {
1014
+ width: 48px;
1015
+ height: 48px;
1016
+ border-radius: 4px;
1017
+ display: flex;
1018
+ align-items: center;
1019
+ justify-content: center;
1020
+ font-size: 1.5rem;
1021
+ font-weight: 700;
1022
+ }
1023
+
1024
+ .agent-icon.claude {
1025
+ background: rgba(139, 92, 246, 0.2);
1026
+ color: var(--agent-claude);
1027
+ }
1028
+
1029
+ .agent-icon.gemini {
1030
+ background: rgba(59, 130, 246, 0.2);
1031
+ color: var(--agent-gemini);
1032
+ }
1033
+
1034
+ .agent-name {
1035
+ color: var(--text-primary);
1036
+ font-size: 1.1rem;
1037
+ font-weight: 700;
1038
+ margin: 0;
1039
+ }
1040
+
1041
+ .agent-status {
1042
+ display: inline-flex;
1043
+ align-items: center;
1044
+ gap: var(--spacing-sm);
1045
+ color: var(--status-success);
1046
+ font-size: 0.85rem;
1047
+ }
1048
+
1049
+ .agent-status.idle {
1050
+ color: var(--text-muted);
1051
+ }
1052
+
1053
+ .status-dot {
1054
+ width: 6px;
1055
+ height: 6px;
1056
+ border-radius: 50%;
1057
+ background: currentColor;
1058
+ animation: pulse-dot 2s infinite;
1059
+ }
1060
+
1061
+ @keyframes pulse-dot {
1062
+ 0%, 100% { opacity: 1; }
1063
+ 50% { opacity: 0.5; }
1064
+ }
1065
+
1066
+ .agent-stats {
1067
+ display: grid;
1068
+ grid-template-columns: 1fr 1fr;
1069
+ gap: var(--spacing-md);
1070
+ }
1071
+
1072
+ .stat-item {
1073
+ display: flex;
1074
+ flex-direction: column;
1075
+ gap: var(--spacing-xs);
1076
+ }
1077
+
1078
+ .stat-item-label {
1079
+ font-size: 0.75rem;
1080
+ color: var(--text-muted);
1081
+ text-transform: uppercase;
1082
+ letter-spacing: 0.05em;
1083
+ }
1084
+
1085
+ .stat-item-value {
1086
+ font-size: 1.3rem;
1087
+ color: var(--accent-lime);
1088
+ font-weight: 700;
1089
+ font-family: 'JetBrains Mono', monospace;
1090
+ }
1091
+
1092
+ /* ============================================================================
1093
+ METRICS PAGE
1094
+ ============================================================================ */
1095
+
1096
+ .metrics-section {
1097
+ margin-bottom: var(--spacing-2xl);
1098
+ }
1099
+
1100
+ .metrics-section h3 {
1101
+ color: var(--accent-lime);
1102
+ text-transform: uppercase;
1103
+ letter-spacing: 0.1em;
1104
+ margin-bottom: var(--spacing-lg);
1105
+ padding-bottom: var(--spacing-md);
1106
+ border-bottom: 2px solid var(--border-subtle);
1107
+ }
1108
+
1109
+ .metrics-grid {
1110
+ display: grid;
1111
+ grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
1112
+ gap: var(--spacing-lg);
1113
+ }
1114
+
1115
+ .metric-card {
1116
+ background: var(--bg-card);
1117
+ border: 1px solid var(--border-subtle);
1118
+ border-radius: 2px;
1119
+ padding: var(--spacing-xl);
1120
+ text-align: center;
1121
+ }
1122
+
1123
+ .metric-label {
1124
+ font-size: 0.85rem;
1125
+ color: var(--text-secondary);
1126
+ text-transform: uppercase;
1127
+ letter-spacing: 0.05em;
1128
+ margin-bottom: var(--spacing-md);
1129
+ }
1130
+
1131
+ .metric-value {
1132
+ font-size: 2.5rem;
1133
+ color: var(--accent-lime);
1134
+ font-weight: 700;
1135
+ font-family: 'JetBrains Mono', monospace;
1136
+ margin-bottom: var(--spacing-md);
1137
+ }
1138
+
1139
+ .metric-trend {
1140
+ font-size: 0.9rem;
1141
+ color: var(--status-success);
1142
+ }
1143
+
1144
+ .metric-trend.down {
1145
+ color: var(--status-blocked);
1146
+ }
1147
+
1148
+ .chart-container {
1149
+ background: var(--bg-card);
1150
+ border: 1px solid var(--border-subtle);
1151
+ border-radius: 2px;
1152
+ padding: var(--spacing-xl);
1153
+ height: 300px;
1154
+ display: flex;
1155
+ align-items: flex-end;
1156
+ justify-content: space-around;
1157
+ gap: var(--spacing-md);
1158
+ }
1159
+
1160
+ .chart-bar {
1161
+ flex: 1;
1162
+ background: linear-gradient(180deg, var(--accent-lime) 0%, var(--accent-secondary) 100%);
1163
+ border-radius: 2px 2px 0 0;
1164
+ position: relative;
1165
+ min-height: 20px;
1166
+ transition: all var(--transition-base);
1167
+ cursor: pointer;
1168
+ }
1169
+
1170
+ .chart-bar:hover {
1171
+ filter: brightness(1.2);
1172
+ }
1173
+
1174
+ .chart-label {
1175
+ position: absolute;
1176
+ bottom: -25px;
1177
+ left: 50%;
1178
+ transform: translateX(-50%);
1179
+ font-size: 0.75rem;
1180
+ color: var(--text-secondary);
1181
+ white-space: nowrap;
1182
+ }
1183
+
1184
+ .chart-value {
1185
+ position: absolute;
1186
+ top: -25px;
1187
+ left: 50%;
1188
+ transform: translateX(-50%);
1189
+ font-size: 0.8rem;
1190
+ color: var(--accent-lime);
1191
+ font-weight: 700;
1192
+ }
1193
+
1194
+ /* ============================================================================
1195
+ RESPONSIVE DESIGN
1196
+ ============================================================================ */
1197
+
1198
+ @media (max-width: 1400px) {
1199
+ .kanban-board {
1200
+ grid-template-columns: repeat(3, 1fr);
1201
+ }
1202
+
1203
+ .agents-grid {
1204
+ grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
1205
+ }
1206
+ }
1207
+
1208
+ @media (max-width: 1024px) {
1209
+ .kanban-board {
1210
+ grid-template-columns: repeat(2, 1fr);
1211
+ }
1212
+
1213
+ .agents-grid {
1214
+ grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
1215
+ }
1216
+
1217
+ .header-content {
1218
+ flex-direction: column;
1219
+ gap: var(--spacing-lg);
1220
+ }
1221
+
1222
+ .header-stats {
1223
+ width: 100%;
1224
+ justify-content: space-around;
1225
+ }
1226
+ }
1227
+
1228
+ @media (max-width: 768px) {
1229
+ .dashboard-container {
1230
+ height: 100vh;
1231
+ }
1232
+
1233
+ .dashboard-header {
1234
+ padding: var(--spacing-lg) var(--spacing-lg);
1235
+ }
1236
+
1237
+ .logo {
1238
+ font-size: 1.3rem;
1239
+ }
1240
+
1241
+ .logo-icon {
1242
+ font-size: 1.8rem;
1243
+ }
1244
+
1245
+ .header-stats {
1246
+ gap: var(--spacing-md);
1247
+ }
1248
+
1249
+ .stat-badge {
1250
+ padding: var(--spacing-sm) var(--spacing-md);
1251
+ }
1252
+
1253
+ .tabs-navigation {
1254
+ gap: var(--spacing-sm);
1255
+ padding-left: var(--spacing-md);
1256
+ }
1257
+
1258
+ .tab-button {
1259
+ padding: var(--spacing-md) var(--spacing-lg);
1260
+ font-size: 0.9rem;
1261
+ }
1262
+
1263
+ .content-area {
1264
+ padding: var(--spacing-lg);
1265
+ }
1266
+
1267
+ .kanban-board {
1268
+ grid-template-columns: 1fr;
1269
+ gap: var(--spacing-md);
1270
+ }
1271
+
1272
+ .agents-grid {
1273
+ grid-template-columns: 1fr;
1274
+ }
1275
+
1276
+ .activity-timeline {
1277
+ padding-left: var(--spacing-lg);
1278
+ }
1279
+
1280
+ .timeline-details {
1281
+ grid-template-columns: 1fr;
1282
+ }
1283
+
1284
+ .metrics-grid {
1285
+ grid-template-columns: 1fr;
1286
+ }
1287
+ }
1288
+
1289
+ /* ============================================================================
1290
+ UTILITIES
1291
+ ============================================================================ */
1292
+
1293
+ .hidden {
1294
+ display: none !important;
1295
+ }
1296
+
1297
+ .truncate {
1298
+ overflow: hidden;
1299
+ text-overflow: ellipsis;
1300
+ white-space: nowrap;
1301
+ }
1302
+
1303
+ .text-muted {
1304
+ color: var(--text-muted);
1305
+ }
1306
+
1307
+ .text-secondary {
1308
+ color: var(--text-secondary);
1309
+ }
1310
+
1311
+ .bg-dark {
1312
+ background-color: var(--bg-dark);
1313
+ }
1314
+
1315
+ .border-subtle {
1316
+ border: 1px solid var(--border-subtle);
1317
+ }
1318
+
1319
+ .rounded {
1320
+ border-radius: 2px;
1321
+ }
1322
+
1323
+ .transition {
1324
+ transition: all var(--transition-base);
1325
+ }
1326
+
1327
+ /* Scrollbar Styling */
1328
+ ::-webkit-scrollbar {
1329
+ width: 8px;
1330
+ height: 8px;
1331
+ }
1332
+
1333
+ ::-webkit-scrollbar-track {
1334
+ background: var(--bg-darker);
1335
+ }
1336
+
1337
+ ::-webkit-scrollbar-thumb {
1338
+ background: var(--border-medium);
1339
+ border-radius: 4px;
1340
+ }
1341
+
1342
+ ::-webkit-scrollbar-thumb:hover {
1343
+ background: var(--accent-lime);
1344
+ }