opencastle 0.1.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 (224) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +215 -0
  3. package/bin/cli.mjs +69 -0
  4. package/dist/cli/adapters/claude-code.d.ts +22 -0
  5. package/dist/cli/adapters/claude-code.d.ts.map +1 -0
  6. package/dist/cli/adapters/claude-code.js +237 -0
  7. package/dist/cli/adapters/claude-code.js.map +1 -0
  8. package/dist/cli/adapters/cursor.d.ts +20 -0
  9. package/dist/cli/adapters/cursor.d.ts.map +1 -0
  10. package/dist/cli/adapters/cursor.js +231 -0
  11. package/dist/cli/adapters/cursor.js.map +1 -0
  12. package/dist/cli/adapters/vscode.d.ts +20 -0
  13. package/dist/cli/adapters/vscode.d.ts.map +1 -0
  14. package/dist/cli/adapters/vscode.js +132 -0
  15. package/dist/cli/adapters/vscode.js.map +1 -0
  16. package/dist/cli/copy.d.ts +14 -0
  17. package/dist/cli/copy.d.ts.map +1 -0
  18. package/dist/cli/copy.js +62 -0
  19. package/dist/cli/copy.js.map +1 -0
  20. package/dist/cli/dashboard.d.ts +3 -0
  21. package/dist/cli/dashboard.d.ts.map +1 -0
  22. package/dist/cli/dashboard.js +183 -0
  23. package/dist/cli/dashboard.js.map +1 -0
  24. package/dist/cli/diff.d.ts +3 -0
  25. package/dist/cli/diff.d.ts.map +1 -0
  26. package/dist/cli/diff.js +27 -0
  27. package/dist/cli/diff.js.map +1 -0
  28. package/dist/cli/eject.d.ts +3 -0
  29. package/dist/cli/eject.d.ts.map +1 -0
  30. package/dist/cli/eject.js +27 -0
  31. package/dist/cli/eject.js.map +1 -0
  32. package/dist/cli/init.d.ts +3 -0
  33. package/dist/cli/init.d.ts.map +1 -0
  34. package/dist/cli/init.js +92 -0
  35. package/dist/cli/init.js.map +1 -0
  36. package/dist/cli/manifest.d.ts +14 -0
  37. package/dist/cli/manifest.d.ts.map +1 -0
  38. package/dist/cli/manifest.js +34 -0
  39. package/dist/cli/manifest.js.map +1 -0
  40. package/dist/cli/mcp.d.ts +14 -0
  41. package/dist/cli/mcp.d.ts.map +1 -0
  42. package/dist/cli/mcp.js +35 -0
  43. package/dist/cli/mcp.js.map +1 -0
  44. package/dist/cli/prompt.d.ts +12 -0
  45. package/dist/cli/prompt.d.ts.map +1 -0
  46. package/dist/cli/prompt.js +104 -0
  47. package/dist/cli/prompt.js.map +1 -0
  48. package/dist/cli/run/adapters/claude-code.d.ts +16 -0
  49. package/dist/cli/run/adapters/claude-code.d.ts.map +1 -0
  50. package/dist/cli/run/adapters/claude-code.js +82 -0
  51. package/dist/cli/run/adapters/claude-code.js.map +1 -0
  52. package/dist/cli/run/adapters/copilot.d.ts +16 -0
  53. package/dist/cli/run/adapters/copilot.d.ts.map +1 -0
  54. package/dist/cli/run/adapters/copilot.js +84 -0
  55. package/dist/cli/run/adapters/copilot.js.map +1 -0
  56. package/dist/cli/run/adapters/cursor.d.ts +16 -0
  57. package/dist/cli/run/adapters/cursor.d.ts.map +1 -0
  58. package/dist/cli/run/adapters/cursor.js +81 -0
  59. package/dist/cli/run/adapters/cursor.js.map +1 -0
  60. package/dist/cli/run/adapters/index.d.ts +14 -0
  61. package/dist/cli/run/adapters/index.d.ts.map +1 -0
  62. package/dist/cli/run/adapters/index.js +35 -0
  63. package/dist/cli/run/adapters/index.js.map +1 -0
  64. package/dist/cli/run/executor.d.ts +15 -0
  65. package/dist/cli/run/executor.d.ts.map +1 -0
  66. package/dist/cli/run/executor.js +249 -0
  67. package/dist/cli/run/executor.js.map +1 -0
  68. package/dist/cli/run/reporter.d.ts +10 -0
  69. package/dist/cli/run/reporter.d.ts.map +1 -0
  70. package/dist/cli/run/reporter.js +112 -0
  71. package/dist/cli/run/reporter.js.map +1 -0
  72. package/dist/cli/run/schema.d.ts +28 -0
  73. package/dist/cli/run/schema.d.ts.map +1 -0
  74. package/dist/cli/run/schema.js +511 -0
  75. package/dist/cli/run/schema.js.map +1 -0
  76. package/dist/cli/run.d.ts +6 -0
  77. package/dist/cli/run.d.ts.map +1 -0
  78. package/dist/cli/run.js +123 -0
  79. package/dist/cli/run.js.map +1 -0
  80. package/dist/cli/stack-config.d.ts +12 -0
  81. package/dist/cli/stack-config.d.ts.map +1 -0
  82. package/dist/cli/stack-config.js +146 -0
  83. package/dist/cli/stack-config.js.map +1 -0
  84. package/dist/cli/types.d.ts +169 -0
  85. package/dist/cli/types.d.ts.map +1 -0
  86. package/dist/cli/types.js +2 -0
  87. package/dist/cli/types.js.map +1 -0
  88. package/dist/cli/update.d.ts +3 -0
  89. package/dist/cli/update.d.ts.map +1 -0
  90. package/dist/cli/update.js +50 -0
  91. package/dist/cli/update.js.map +1 -0
  92. package/package.json +48 -0
  93. package/src/cli/adapters/claude-code.ts +287 -0
  94. package/src/cli/adapters/cursor.ts +377 -0
  95. package/src/cli/adapters/vscode.ts +168 -0
  96. package/src/cli/copy.ts +79 -0
  97. package/src/cli/dashboard.ts +225 -0
  98. package/src/cli/diff.ts +44 -0
  99. package/src/cli/eject.ts +39 -0
  100. package/src/cli/init.ts +120 -0
  101. package/src/cli/manifest.ts +45 -0
  102. package/src/cli/mcp.ts +49 -0
  103. package/src/cli/prompt.ts +115 -0
  104. package/src/cli/run/adapters/claude-code.ts +95 -0
  105. package/src/cli/run/adapters/copilot.ts +97 -0
  106. package/src/cli/run/adapters/cursor.ts +94 -0
  107. package/src/cli/run/adapters/index.ts +40 -0
  108. package/src/cli/run/executor.ts +292 -0
  109. package/src/cli/run/reporter.ts +129 -0
  110. package/src/cli/run/schema.ts +595 -0
  111. package/src/cli/run.ts +137 -0
  112. package/src/cli/stack-config.ts +180 -0
  113. package/src/cli/types.ts +207 -0
  114. package/src/cli/update.ts +75 -0
  115. package/src/dashboard/astro.config.mjs +6 -0
  116. package/src/dashboard/package-lock.json +5455 -0
  117. package/src/dashboard/package.json +14 -0
  118. package/src/dashboard/public/data/delegations.ndjson +35 -0
  119. package/src/dashboard/public/data/panels.ndjson +13 -0
  120. package/src/dashboard/public/data/sessions.ndjson +50 -0
  121. package/src/dashboard/public/icon-192.png +0 -0
  122. package/src/dashboard/scripts/generate-seed-data.ts +355 -0
  123. package/src/dashboard/src/layouts/Layout.astro +25 -0
  124. package/src/dashboard/src/pages/index.astro +1070 -0
  125. package/src/dashboard/src/styles/dashboard.css +1078 -0
  126. package/src/dashboard/tsconfig.json +6 -0
  127. package/src/orchestrator/agent-workflows/README.md +22 -0
  128. package/src/orchestrator/agent-workflows/bug-fix.md +128 -0
  129. package/src/orchestrator/agent-workflows/data-pipeline.md +145 -0
  130. package/src/orchestrator/agent-workflows/database-migration.md +159 -0
  131. package/src/orchestrator/agent-workflows/feature-implementation.md +223 -0
  132. package/src/orchestrator/agent-workflows/performance-optimization.md +125 -0
  133. package/src/orchestrator/agent-workflows/refactoring.md +142 -0
  134. package/src/orchestrator/agent-workflows/schema-changes.md +164 -0
  135. package/src/orchestrator/agent-workflows/security-audit.md +148 -0
  136. package/src/orchestrator/agent-workflows/shared-delivery-phase.md +33 -0
  137. package/src/orchestrator/agents/api-designer.agent.md +68 -0
  138. package/src/orchestrator/agents/architect.agent.md +129 -0
  139. package/src/orchestrator/agents/content-engineer.agent.md +57 -0
  140. package/src/orchestrator/agents/copywriter.agent.md +95 -0
  141. package/src/orchestrator/agents/data-expert.agent.md +63 -0
  142. package/src/orchestrator/agents/database-engineer.agent.md +62 -0
  143. package/src/orchestrator/agents/developer.agent.md +66 -0
  144. package/src/orchestrator/agents/devops-expert.agent.md +57 -0
  145. package/src/orchestrator/agents/documentation-writer.agent.md +60 -0
  146. package/src/orchestrator/agents/performance-expert.agent.md +58 -0
  147. package/src/orchestrator/agents/release-manager.agent.md +72 -0
  148. package/src/orchestrator/agents/researcher.agent.md +145 -0
  149. package/src/orchestrator/agents/reviewer.agent.md +62 -0
  150. package/src/orchestrator/agents/security-expert.agent.md +64 -0
  151. package/src/orchestrator/agents/seo-specialist.agent.md +67 -0
  152. package/src/orchestrator/agents/team-lead.agent.md +644 -0
  153. package/src/orchestrator/agents/testing-expert.agent.md +85 -0
  154. package/src/orchestrator/agents/ui-ux-expert.agent.md +63 -0
  155. package/src/orchestrator/copilot-instructions.md +3 -0
  156. package/src/orchestrator/customizations/AGENT-EXPERTISE.md +325 -0
  157. package/src/orchestrator/customizations/AGENT-FAILURES.md +69 -0
  158. package/src/orchestrator/customizations/AGENT-PERFORMANCE.md +58 -0
  159. package/src/orchestrator/customizations/DISPUTES.md +162 -0
  160. package/src/orchestrator/customizations/KNOWLEDGE-GRAPH.md +10 -0
  161. package/src/orchestrator/customizations/LESSONS-LEARNED.md +70 -0
  162. package/src/orchestrator/customizations/README.md +59 -0
  163. package/src/orchestrator/customizations/agents/agent-registry.md +46 -0
  164. package/src/orchestrator/customizations/agents/skill-matrix.md +142 -0
  165. package/src/orchestrator/customizations/logs/README.md +181 -0
  166. package/src/orchestrator/customizations/logs/delegations.ndjson +1 -0
  167. package/src/orchestrator/customizations/logs/panels.ndjson +1 -0
  168. package/src/orchestrator/customizations/logs/sessions.ndjson +1 -0
  169. package/src/orchestrator/customizations/project/docs-structure.md +23 -0
  170. package/src/orchestrator/customizations/project/tracker-config.md +45 -0
  171. package/src/orchestrator/customizations/project.instructions.md +64 -0
  172. package/src/orchestrator/customizations/stack/api-config.md +37 -0
  173. package/src/orchestrator/customizations/stack/cms-config.md +26 -0
  174. package/src/orchestrator/customizations/stack/data-pipeline-config.md +41 -0
  175. package/src/orchestrator/customizations/stack/database-config.md +44 -0
  176. package/src/orchestrator/customizations/stack/deployment-config.md +45 -0
  177. package/src/orchestrator/customizations/stack/testing-config.md +56 -0
  178. package/src/orchestrator/instructions/ai-optimization.instructions.md +143 -0
  179. package/src/orchestrator/instructions/general.instructions.md +194 -0
  180. package/src/orchestrator/mcp.json +55 -0
  181. package/src/orchestrator/prompts/bootstrap-customizations.prompt.md +235 -0
  182. package/src/orchestrator/prompts/brainstorm.prompt.md +115 -0
  183. package/src/orchestrator/prompts/bug-fix.prompt.md +141 -0
  184. package/src/orchestrator/prompts/create-skill.prompt.md +103 -0
  185. package/src/orchestrator/prompts/generate-task-spec.prompt.md +154 -0
  186. package/src/orchestrator/prompts/implement-feature.prompt.md +124 -0
  187. package/src/orchestrator/prompts/metrics-report.prompt.md +142 -0
  188. package/src/orchestrator/prompts/quick-refinement.prompt.md +137 -0
  189. package/src/orchestrator/prompts/resolve-pr-comments.prompt.md +100 -0
  190. package/src/orchestrator/skills/accessibility-standards/SKILL.md +164 -0
  191. package/src/orchestrator/skills/agent-hooks/SKILL.md +147 -0
  192. package/src/orchestrator/skills/agent-memory/SKILL.md +144 -0
  193. package/src/orchestrator/skills/api-patterns/SKILL.md +106 -0
  194. package/src/orchestrator/skills/browser-testing/SKILL.md +203 -0
  195. package/src/orchestrator/skills/code-commenting/SKILL.md +133 -0
  196. package/src/orchestrator/skills/contentful-cms/SKILL.md +43 -0
  197. package/src/orchestrator/skills/context-map/SKILL.md +135 -0
  198. package/src/orchestrator/skills/convex-database/SKILL.md +80 -0
  199. package/src/orchestrator/skills/data-engineering/SKILL.md +99 -0
  200. package/src/orchestrator/skills/deployment-infrastructure/SKILL.md +49 -0
  201. package/src/orchestrator/skills/documentation-standards/SKILL.md +85 -0
  202. package/src/orchestrator/skills/fast-review/SKILL.md +327 -0
  203. package/src/orchestrator/skills/frontend-design/SKILL.md +42 -0
  204. package/src/orchestrator/skills/jira-management/SKILL.md +168 -0
  205. package/src/orchestrator/skills/memory-merger/SKILL.md +123 -0
  206. package/src/orchestrator/skills/nextjs-patterns/SKILL.md +75 -0
  207. package/src/orchestrator/skills/nx-workspace/SKILL.md +192 -0
  208. package/src/orchestrator/skills/panel-majority-vote/SKILL.md +184 -0
  209. package/src/orchestrator/skills/panel-majority-vote/panel-report.template.md +38 -0
  210. package/src/orchestrator/skills/performance-optimization/SKILL.md +101 -0
  211. package/src/orchestrator/skills/react-development/SKILL.md +117 -0
  212. package/src/orchestrator/skills/sanity-cms/SKILL.md +18 -0
  213. package/src/orchestrator/skills/security-hardening/SKILL.md +118 -0
  214. package/src/orchestrator/skills/self-improvement/SKILL.md +137 -0
  215. package/src/orchestrator/skills/seo-patterns/SKILL.md +40 -0
  216. package/src/orchestrator/skills/session-checkpoints/SKILL.md +205 -0
  217. package/src/orchestrator/skills/slack-notifications/SKILL.md +211 -0
  218. package/src/orchestrator/skills/strapi-cms/SKILL.md +43 -0
  219. package/src/orchestrator/skills/supabase-database/SKILL.md +24 -0
  220. package/src/orchestrator/skills/task-management/SKILL.md +143 -0
  221. package/src/orchestrator/skills/team-lead-reference/SKILL.md +317 -0
  222. package/src/orchestrator/skills/teams-notifications/SKILL.md +249 -0
  223. package/src/orchestrator/skills/testing-workflow/SKILL.md +134 -0
  224. package/src/orchestrator/skills/validation-gates/SKILL.md +100 -0
@@ -0,0 +1,1078 @@
1
+ /* ============================================================
2
+ OpenCastle Agent Dashboard — Styles
3
+ Design: Dark theme matching opencastle.dev
4
+ Charts: CSS + SVG (zero dependencies)
5
+ ============================================================ */
6
+
7
+ /* ---------- Design Tokens ---------- */
8
+ :root {
9
+ --bg-primary: #0a0a0f;
10
+ --bg-secondary: #111118;
11
+ --bg-tertiary: #1a1a24;
12
+ --bg-card: rgba(255, 255, 255, 0.03);
13
+ --bg-card-hover: rgba(255, 255, 255, 0.06);
14
+
15
+ --text-primary: #f0f0f5;
16
+ --text-secondary: #8a8a9a;
17
+ --text-tertiary: #5a5a6e;
18
+ --text-accent: #a78bfa;
19
+
20
+ --gradient-accent: linear-gradient(135deg, #a78bfa 0%, #6366f1 50%, #3b82f6 100%);
21
+ --gradient-glow: radial-gradient(ellipse 800px 400px at 50% 0%, rgba(99, 102, 241, 0.12) 0%, transparent 70%);
22
+
23
+ --border-color: rgba(255, 255, 255, 0.06);
24
+ --border-accent: rgba(167, 139, 250, 0.3);
25
+
26
+ --color-success: #22c55e;
27
+ --color-partial: #f59e0b;
28
+ --color-failed: #ef4444;
29
+ --color-redirected: #64748b;
30
+
31
+ --color-premium: #f59e0b;
32
+ --color-standard: #a78bfa;
33
+ --color-utility: #3b82f6;
34
+ --color-economy: #64748b;
35
+
36
+ --accent-blue: #3b82f6;
37
+ --accent-purple: #a78bfa;
38
+ --accent-indigo: #6366f1;
39
+
40
+ --max-width: 1280px;
41
+ --transition-fast: 150ms cubic-bezier(0.4, 0, 0.2, 1);
42
+ --transition-base: 300ms cubic-bezier(0.4, 0, 0.2, 1);
43
+ }
44
+
45
+ /* ---------- Reset ---------- */
46
+ *,
47
+ *::before,
48
+ *::after {
49
+ box-sizing: border-box;
50
+ margin: 0;
51
+ padding: 0;
52
+ }
53
+
54
+ html {
55
+ font-size: 16px;
56
+ -webkit-font-smoothing: antialiased;
57
+ -moz-osx-font-smoothing: grayscale;
58
+ }
59
+
60
+ body {
61
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Inter', Roboto,
62
+ Helvetica, Arial, sans-serif;
63
+ background-color: var(--bg-primary);
64
+ color: var(--text-primary);
65
+ line-height: 1.6;
66
+ overflow-x: hidden;
67
+ min-height: 100vh;
68
+ }
69
+
70
+ /* ---------- Header ---------- */
71
+ .dash-header {
72
+ position: sticky;
73
+ top: 0;
74
+ z-index: 50;
75
+ background: rgba(10, 10, 15, 0.85);
76
+ backdrop-filter: blur(16px);
77
+ -webkit-backdrop-filter: blur(16px);
78
+ border-bottom: 1px solid var(--border-color);
79
+ }
80
+
81
+ .dash-header__inner {
82
+ max-width: var(--max-width);
83
+ margin: 0 auto;
84
+ padding: 0 24px;
85
+ height: 56px;
86
+ display: flex;
87
+ align-items: center;
88
+ justify-content: space-between;
89
+ }
90
+
91
+ .dash-header__brand {
92
+ display: flex;
93
+ align-items: center;
94
+ gap: 10px;
95
+ }
96
+
97
+ .dash-header__icon {
98
+ width: 32px;
99
+ height: 32px;
100
+ border-radius: 8px;
101
+ object-fit: contain;
102
+ }
103
+
104
+ .dash-header__title {
105
+ font-size: 1rem;
106
+ font-weight: 600;
107
+ color: var(--text-primary);
108
+ }
109
+
110
+ /* ---------- Main Layout ---------- */
111
+ .dash-layout {
112
+ display: flex;
113
+ max-width: var(--max-width);
114
+ margin: 0 auto;
115
+ position: relative;
116
+ }
117
+
118
+ .dash-sidebar {
119
+ position: sticky;
120
+ top: 56px;
121
+ height: calc(100vh - 56px);
122
+ width: 180px;
123
+ flex-shrink: 0;
124
+ padding: 24px 0 24px 24px;
125
+ overflow-y: auto;
126
+ display: none;
127
+ }
128
+
129
+ @media (min-width: 1024px) {
130
+ .dash-sidebar {
131
+ display: block;
132
+ }
133
+ }
134
+
135
+ .dash-sidebar__list {
136
+ list-style: none;
137
+ display: flex;
138
+ flex-direction: column;
139
+ gap: 2px;
140
+ }
141
+
142
+ .dash-sidebar__link {
143
+ display: block;
144
+ padding: 8px 16px;
145
+ font-size: 0.8125rem;
146
+ font-weight: 500;
147
+ color: var(--text-tertiary);
148
+ text-decoration: none;
149
+ border-radius: 8px;
150
+ transition: color var(--transition-fast), background var(--transition-fast);
151
+ }
152
+
153
+ .dash-sidebar__link:hover {
154
+ color: var(--text-secondary);
155
+ background: rgba(255, 255, 255, 0.04);
156
+ }
157
+
158
+ .dash-sidebar__link--active {
159
+ color: var(--text-accent);
160
+ background: rgba(167, 139, 250, 0.08);
161
+ font-weight: 600;
162
+ }
163
+
164
+ .dash-main {
165
+ flex: 1;
166
+ min-width: 0;
167
+ max-width: var(--max-width);
168
+ margin: 0 auto;
169
+ padding: 24px;
170
+ display: flex;
171
+ flex-direction: column;
172
+ gap: 20px;
173
+ position: relative;
174
+ }
175
+
176
+ .dash-main::before {
177
+ content: '';
178
+ position: fixed;
179
+ top: 0;
180
+ left: 50%;
181
+ transform: translateX(-50%);
182
+ width: 100%;
183
+ height: 600px;
184
+ background: var(--gradient-glow);
185
+ pointer-events: none;
186
+ z-index: 0;
187
+ }
188
+
189
+ .dash-main > * {
190
+ position: relative;
191
+ z-index: 1;
192
+ }
193
+
194
+ /* ---------- Scroll offset for sticky header ---------- */
195
+ [data-nav-section] {
196
+ scroll-margin-top: 72px;
197
+ }
198
+
199
+ /* ---------- KPI Cards ---------- */
200
+ .kpi-row {
201
+ display: grid;
202
+ grid-template-columns: 1fr;
203
+ gap: 12px;
204
+ }
205
+
206
+ @media (min-width: 480px) {
207
+ .kpi-row {
208
+ grid-template-columns: repeat(2, 1fr);
209
+ }
210
+ }
211
+
212
+ @media (min-width: 960px) {
213
+ .kpi-row {
214
+ grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
215
+ }
216
+ }
217
+
218
+ .kpi-card {
219
+ background: var(--bg-secondary);
220
+ border: 1px solid var(--border-color);
221
+ border-radius: 12px;
222
+ padding: 20px 24px;
223
+ display: flex;
224
+ flex-direction: column;
225
+ gap: 4px;
226
+ transition: border-color var(--transition-fast);
227
+ }
228
+
229
+ .kpi-card:hover {
230
+ border-color: rgba(255, 255, 255, 0.1);
231
+ }
232
+
233
+ .kpi-card__label {
234
+ font-size: 0.75rem;
235
+ font-weight: 500;
236
+ color: var(--text-tertiary);
237
+ text-transform: uppercase;
238
+ letter-spacing: 0.05em;
239
+ }
240
+
241
+ .kpi-card__value {
242
+ font-size: 2rem;
243
+ font-weight: 700;
244
+ color: var(--text-primary);
245
+ line-height: 1.2;
246
+ letter-spacing: -0.02em;
247
+ }
248
+
249
+ .kpi-card__sub {
250
+ font-size: 0.75rem;
251
+ color: var(--text-secondary);
252
+ display: flex;
253
+ align-items: center;
254
+ gap: 4px;
255
+ }
256
+
257
+ .kpi-trend {
258
+ font-weight: 600;
259
+ }
260
+
261
+ .kpi-trend--up {
262
+ color: var(--color-success);
263
+ }
264
+
265
+ .kpi-trend--down {
266
+ color: var(--color-failed);
267
+ }
268
+
269
+ .kpi-trend--neutral {
270
+ color: var(--text-tertiary);
271
+ }
272
+
273
+ /* ---------- Chart Card ---------- */
274
+ .chart-card {
275
+ background: var(--bg-secondary);
276
+ border: 1px solid var(--border-color);
277
+ border-radius: 12px;
278
+ overflow: hidden;
279
+ transition: border-color var(--transition-fast);
280
+ }
281
+
282
+ .chart-card:hover {
283
+ border-color: rgba(255, 255, 255, 0.1);
284
+ }
285
+
286
+ .chart-card__header {
287
+ padding: 20px 24px 8px;
288
+ }
289
+
290
+ .chart-card__title {
291
+ font-size: 0.9375rem;
292
+ font-weight: 600;
293
+ color: var(--text-primary);
294
+ }
295
+
296
+ .chart-card__desc {
297
+ font-size: 0.75rem;
298
+ color: var(--text-tertiary);
299
+ margin-top: 2px;
300
+ }
301
+
302
+ .chart-card__body {
303
+ padding: 16px 24px 24px;
304
+ min-height: 120px;
305
+ }
306
+
307
+ .chart-card__body--table {
308
+ padding: 0;
309
+ }
310
+
311
+ .charts-row {
312
+ display: grid;
313
+ grid-template-columns: 1fr;
314
+ gap: 20px;
315
+ }
316
+
317
+ @media (min-width: 768px) {
318
+ .charts-row {
319
+ grid-template-columns: repeat(2, 1fr);
320
+ }
321
+ }
322
+
323
+ /* ---------- Bar Charts (CSS-based) ---------- */
324
+ .bar-row {
325
+ display: flex;
326
+ align-items: center;
327
+ gap: 12px;
328
+ padding: 6px 0;
329
+ }
330
+
331
+ .bar-row + .bar-row {
332
+ border-top: 1px solid rgba(255, 255, 255, 0.03);
333
+ }
334
+
335
+ .bar-label {
336
+ font-size: 0.8125rem;
337
+ color: var(--text-secondary);
338
+ width: 130px;
339
+ flex-shrink: 0;
340
+ white-space: nowrap;
341
+ overflow: hidden;
342
+ text-overflow: ellipsis;
343
+ }
344
+
345
+ .bar-track {
346
+ flex: 1;
347
+ height: 24px;
348
+ background: var(--bg-tertiary);
349
+ border-radius: 6px;
350
+ display: flex;
351
+ overflow: hidden;
352
+ }
353
+
354
+ .bar-segment {
355
+ height: 100%;
356
+ transition: width 0.8s cubic-bezier(0.4, 0, 0.2, 1);
357
+ min-width: 0;
358
+ }
359
+
360
+ .bar--success {
361
+ background: var(--color-success);
362
+ }
363
+
364
+ .bar--partial {
365
+ background: var(--color-partial);
366
+ }
367
+
368
+ .bar--failed {
369
+ background: var(--color-failed);
370
+ }
371
+
372
+ .bar--premium {
373
+ background: var(--color-premium);
374
+ }
375
+
376
+ .bar--standard {
377
+ background: var(--color-standard);
378
+ }
379
+
380
+ .bar--utility {
381
+ background: var(--color-utility);
382
+ }
383
+
384
+ .bar--economy {
385
+ background: var(--color-economy);
386
+ }
387
+
388
+ .bar--accent {
389
+ background: var(--accent-blue);
390
+ }
391
+
392
+ .bar-value {
393
+ font-size: 0.8125rem;
394
+ font-weight: 600;
395
+ color: var(--text-primary);
396
+ width: 36px;
397
+ text-align: right;
398
+ flex-shrink: 0;
399
+ font-variant-numeric: tabular-nums;
400
+ }
401
+
402
+ /* ---------- Donut Chart (SVG-based) ---------- */
403
+ .donut-container {
404
+ display: flex;
405
+ align-items: center;
406
+ justify-content: center;
407
+ gap: 32px;
408
+ flex-wrap: wrap;
409
+ }
410
+
411
+ .donut-wrap {
412
+ position: relative;
413
+ width: 180px;
414
+ height: 180px;
415
+ flex-shrink: 0;
416
+ }
417
+
418
+ .donut-svg {
419
+ width: 100%;
420
+ height: 100%;
421
+ }
422
+
423
+ .donut-svg circle {
424
+ transition: stroke-dasharray 0.8s cubic-bezier(0.4, 0, 0.2, 1),
425
+ stroke-dashoffset 0.8s cubic-bezier(0.4, 0, 0.2, 1);
426
+ }
427
+
428
+ .donut-center {
429
+ position: absolute;
430
+ top: 50%;
431
+ left: 50%;
432
+ transform: translate(-50%, -50%);
433
+ text-align: center;
434
+ }
435
+
436
+ .donut-total {
437
+ display: block;
438
+ font-size: 1.5rem;
439
+ font-weight: 700;
440
+ color: var(--text-primary);
441
+ line-height: 1;
442
+ }
443
+
444
+ .donut-total-label {
445
+ display: block;
446
+ font-size: 0.6875rem;
447
+ color: var(--text-tertiary);
448
+ text-transform: uppercase;
449
+ letter-spacing: 0.08em;
450
+ margin-top: 2px;
451
+ }
452
+
453
+ .donut-legend {
454
+ display: flex;
455
+ flex-direction: column;
456
+ gap: 10px;
457
+ }
458
+
459
+ .legend-item {
460
+ display: flex;
461
+ align-items: center;
462
+ gap: 8px;
463
+ font-size: 0.8125rem;
464
+ }
465
+
466
+ .legend-dot {
467
+ width: 10px;
468
+ height: 10px;
469
+ border-radius: 3px;
470
+ flex-shrink: 0;
471
+ }
472
+
473
+ .legend-name {
474
+ color: var(--text-secondary);
475
+ text-transform: capitalize;
476
+ }
477
+
478
+ .legend-count {
479
+ color: var(--text-tertiary);
480
+ font-variant-numeric: tabular-nums;
481
+ margin-left: auto;
482
+ }
483
+
484
+ /* ---------- Timeline Chart (SVG) ---------- */
485
+ .timeline-svg {
486
+ width: 100%;
487
+ height: auto;
488
+ display: block;
489
+ }
490
+
491
+ .timeline-svg text {
492
+ font-family: inherit;
493
+ }
494
+
495
+ .timeline-legend {
496
+ display: flex;
497
+ gap: 16px;
498
+ justify-content: center;
499
+ margin-top: 12px;
500
+ }
501
+
502
+ .timeline-legend__item {
503
+ display: flex;
504
+ align-items: center;
505
+ gap: 6px;
506
+ font-size: 0.75rem;
507
+ color: var(--text-tertiary);
508
+ }
509
+
510
+ .timeline-legend__dot {
511
+ width: 8px;
512
+ height: 8px;
513
+ border-radius: 2px;
514
+ }
515
+
516
+ /* ---------- Pipeline View (Steroids-inspired) ---------- */
517
+ .pipeline {
518
+ display: flex;
519
+ align-items: stretch;
520
+ gap: 0;
521
+ overflow-x: auto;
522
+ padding: 8px 0;
523
+ }
524
+
525
+ .pipeline-stage {
526
+ flex: 1;
527
+ min-width: 140px;
528
+ display: flex;
529
+ flex-direction: column;
530
+ align-items: center;
531
+ gap: 8px;
532
+ padding: 16px 12px;
533
+ position: relative;
534
+ }
535
+
536
+ .pipeline-stage:not(:last-child)::after {
537
+ content: '';
538
+ position: absolute;
539
+ right: -1px;
540
+ top: 50%;
541
+ transform: translateY(-50%);
542
+ width: 2px;
543
+ height: 40%;
544
+ background: var(--border-color);
545
+ }
546
+
547
+ .pipeline-stage__icon {
548
+ width: 40px;
549
+ height: 40px;
550
+ border-radius: 10px;
551
+ display: flex;
552
+ align-items: center;
553
+ justify-content: center;
554
+ font-size: 1rem;
555
+ }
556
+
557
+ .pipeline-stage__icon--pending {
558
+ background: rgba(100, 116, 139, 0.15);
559
+ color: #94a3b8;
560
+ border: 1px solid rgba(100, 116, 139, 0.2);
561
+ }
562
+
563
+ .pipeline-stage__icon--active {
564
+ background: rgba(59, 130, 246, 0.15);
565
+ color: #60a5fa;
566
+ border: 1px solid rgba(59, 130, 246, 0.3);
567
+ animation: pulse-glow 2s ease-in-out infinite;
568
+ }
569
+
570
+ .pipeline-stage__icon--review {
571
+ background: rgba(245, 158, 11, 0.15);
572
+ color: #fbbf24;
573
+ border: 1px solid rgba(245, 158, 11, 0.3);
574
+ }
575
+
576
+ .pipeline-stage__icon--done {
577
+ background: rgba(34, 197, 94, 0.15);
578
+ color: #4ade80;
579
+ border: 1px solid rgba(34, 197, 94, 0.3);
580
+ }
581
+
582
+ @keyframes pulse-glow {
583
+ 0%,
584
+ 100% {
585
+ box-shadow: 0 0 0 0 rgba(59, 130, 246, 0.2);
586
+ }
587
+ 50% {
588
+ box-shadow: 0 0 12px 4px rgba(59, 130, 246, 0.15);
589
+ }
590
+ }
591
+
592
+ .pipeline-stage__count {
593
+ font-size: 1.5rem;
594
+ font-weight: 700;
595
+ color: var(--text-primary);
596
+ line-height: 1;
597
+ }
598
+
599
+ .pipeline-stage__label {
600
+ font-size: 0.75rem;
601
+ color: var(--text-tertiary);
602
+ text-transform: uppercase;
603
+ letter-spacing: 0.04em;
604
+ font-weight: 500;
605
+ }
606
+
607
+ .pipeline-arrow {
608
+ display: flex;
609
+ align-items: center;
610
+ color: var(--text-tertiary);
611
+ font-size: 1.25rem;
612
+ padding: 0 4px;
613
+ flex-shrink: 0;
614
+ }
615
+
616
+ /* ---------- Execution Log (Duvo-inspired) ---------- */
617
+ .exec-log {
618
+ display: flex;
619
+ flex-direction: column;
620
+ }
621
+
622
+ .exec-step {
623
+ display: flex;
624
+ gap: 16px;
625
+ padding: 14px 0;
626
+ position: relative;
627
+ }
628
+
629
+ .exec-step + .exec-step {
630
+ border-top: 1px solid rgba(255, 255, 255, 0.03);
631
+ }
632
+
633
+ .exec-step__indicator {
634
+ display: flex;
635
+ flex-direction: column;
636
+ align-items: center;
637
+ flex-shrink: 0;
638
+ width: 32px;
639
+ }
640
+
641
+ .exec-step__dot {
642
+ width: 24px;
643
+ height: 24px;
644
+ border-radius: 50%;
645
+ display: flex;
646
+ align-items: center;
647
+ justify-content: center;
648
+ font-size: 0.6875rem;
649
+ font-weight: 700;
650
+ flex-shrink: 0;
651
+ }
652
+
653
+ .exec-step__dot--success {
654
+ background: rgba(34, 197, 94, 0.15);
655
+ color: var(--color-success);
656
+ border: 1.5px solid rgba(34, 197, 94, 0.3);
657
+ }
658
+
659
+ .exec-step__dot--partial {
660
+ background: rgba(245, 158, 11, 0.15);
661
+ color: var(--color-partial);
662
+ border: 1.5px solid rgba(245, 158, 11, 0.3);
663
+ }
664
+
665
+ .exec-step__dot--failed {
666
+ background: rgba(239, 68, 68, 0.15);
667
+ color: var(--color-failed);
668
+ border: 1.5px solid rgba(239, 68, 68, 0.3);
669
+ }
670
+
671
+ .exec-step__line {
672
+ flex: 1;
673
+ width: 1.5px;
674
+ background: var(--border-color);
675
+ margin-top: 4px;
676
+ }
677
+
678
+ .exec-step__content {
679
+ flex: 1;
680
+ min-width: 0;
681
+ }
682
+
683
+ .exec-step__header {
684
+ display: flex;
685
+ align-items: center;
686
+ gap: 8px;
687
+ flex-wrap: wrap;
688
+ }
689
+
690
+ .exec-step__agent {
691
+ font-size: 0.875rem;
692
+ font-weight: 600;
693
+ color: var(--text-primary);
694
+ }
695
+
696
+ .exec-step__badge {
697
+ display: inline-flex;
698
+ align-items: center;
699
+ padding: 2px 8px;
700
+ font-size: 0.6875rem;
701
+ font-weight: 600;
702
+ border-radius: 100px;
703
+ text-transform: capitalize;
704
+ }
705
+
706
+ .exec-step__badge--success {
707
+ background: rgba(34, 197, 94, 0.12);
708
+ color: var(--color-success);
709
+ border: 1px solid rgba(34, 197, 94, 0.2);
710
+ }
711
+
712
+ .exec-step__badge--partial {
713
+ background: rgba(245, 158, 11, 0.12);
714
+ color: var(--color-partial);
715
+ border: 1px solid rgba(245, 158, 11, 0.2);
716
+ }
717
+
718
+ .exec-step__badge--failed {
719
+ background: rgba(239, 68, 68, 0.12);
720
+ color: var(--color-failed);
721
+ border: 1px solid rgba(239, 68, 68, 0.2);
722
+ }
723
+
724
+ .exec-step__task {
725
+ font-size: 0.8125rem;
726
+ color: var(--text-secondary);
727
+ margin-top: 4px;
728
+ white-space: nowrap;
729
+ overflow: hidden;
730
+ text-overflow: ellipsis;
731
+ }
732
+
733
+ .exec-step__meta {
734
+ display: flex;
735
+ gap: 16px;
736
+ margin-top: 6px;
737
+ font-size: 0.6875rem;
738
+ color: var(--text-tertiary);
739
+ }
740
+
741
+ .exec-step__meta-item {
742
+ display: flex;
743
+ align-items: center;
744
+ gap: 4px;
745
+ }
746
+
747
+ /* ---------- Panel Chart ---------- */
748
+ .panel-grid {
749
+ display: grid;
750
+ grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
751
+ gap: 12px;
752
+ }
753
+
754
+ .panel-item {
755
+ background: var(--bg-tertiary);
756
+ border-radius: 8px;
757
+ padding: 16px;
758
+ display: flex;
759
+ flex-direction: column;
760
+ gap: 8px;
761
+ border: 1px solid transparent;
762
+ transition: border-color var(--transition-fast);
763
+ }
764
+
765
+ .panel-item:hover {
766
+ border-color: var(--border-color);
767
+ }
768
+
769
+ .panel-item__header {
770
+ display: flex;
771
+ align-items: center;
772
+ justify-content: space-between;
773
+ }
774
+
775
+ .panel-item__key {
776
+ font-size: 0.8125rem;
777
+ font-weight: 600;
778
+ color: var(--text-primary);
779
+ white-space: nowrap;
780
+ overflow: hidden;
781
+ text-overflow: ellipsis;
782
+ }
783
+
784
+ .panel-item__verdict {
785
+ font-size: 0.6875rem;
786
+ font-weight: 700;
787
+ padding: 2px 8px;
788
+ border-radius: 4px;
789
+ text-transform: uppercase;
790
+ letter-spacing: 0.04em;
791
+ }
792
+
793
+ .panel-item__verdict--pass {
794
+ background: rgba(34, 197, 94, 0.15);
795
+ color: var(--color-success);
796
+ }
797
+
798
+ .panel-item__verdict--block {
799
+ background: rgba(239, 68, 68, 0.15);
800
+ color: var(--color-failed);
801
+ }
802
+
803
+ .panel-item__votes {
804
+ display: flex;
805
+ gap: 4px;
806
+ }
807
+
808
+ .panel-item__vote {
809
+ width: 24px;
810
+ height: 24px;
811
+ border-radius: 50%;
812
+ display: flex;
813
+ align-items: center;
814
+ justify-content: center;
815
+ font-size: 0.625rem;
816
+ font-weight: 700;
817
+ }
818
+
819
+ .panel-item__vote--pass {
820
+ background: rgba(34, 197, 94, 0.12);
821
+ color: var(--color-success);
822
+ border: 1px solid rgba(34, 197, 94, 0.2);
823
+ }
824
+
825
+ .panel-item__vote--block {
826
+ background: rgba(239, 68, 68, 0.12);
827
+ color: var(--color-failed);
828
+ border: 1px solid rgba(239, 68, 68, 0.2);
829
+ }
830
+
831
+ .panel-item__fixes {
832
+ font-size: 0.6875rem;
833
+ color: var(--text-tertiary);
834
+ }
835
+
836
+ .panel-item__meta {
837
+ display: flex;
838
+ flex-wrap: wrap;
839
+ gap: 8px;
840
+ margin-top: 8px;
841
+ padding-top: 8px;
842
+ border-top: 1px solid var(--border-color);
843
+ }
844
+
845
+ .panel-item__meta-item {
846
+ font-size: 0.625rem;
847
+ color: var(--text-tertiary);
848
+ white-space: nowrap;
849
+ }
850
+
851
+ /* ---------- Sessions Table ---------- */
852
+ .sessions-table {
853
+ width: 100%;
854
+ border-collapse: collapse;
855
+ font-size: 0.8125rem;
856
+ }
857
+
858
+ .sessions-table thead {
859
+ position: sticky;
860
+ top: 0;
861
+ }
862
+
863
+ .sessions-table th {
864
+ padding: 12px 16px;
865
+ font-size: 0.6875rem;
866
+ font-weight: 600;
867
+ color: var(--text-tertiary);
868
+ text-align: left;
869
+ text-transform: uppercase;
870
+ letter-spacing: 0.06em;
871
+ background: var(--bg-tertiary);
872
+ border-bottom: 1px solid var(--border-color);
873
+ }
874
+
875
+ .sessions-table th:last-child,
876
+ .sessions-table td:last-child {
877
+ text-align: right;
878
+ }
879
+
880
+ .sessions-table th:nth-child(5),
881
+ .sessions-table td:nth-child(5) {
882
+ text-align: right;
883
+ }
884
+
885
+ .sessions-table td {
886
+ padding: 10px 16px;
887
+ color: var(--text-secondary);
888
+ border-bottom: 1px solid rgba(255, 255, 255, 0.03);
889
+ white-space: nowrap;
890
+ }
891
+
892
+ .sessions-table tr:hover td {
893
+ background: rgba(255, 255, 255, 0.02);
894
+ }
895
+
896
+ .sessions-table .td-agent {
897
+ font-weight: 500;
898
+ color: var(--text-primary);
899
+ }
900
+
901
+ .sessions-table .td-task {
902
+ max-width: 260px;
903
+ overflow: hidden;
904
+ text-overflow: ellipsis;
905
+ }
906
+
907
+ .outcome-badge {
908
+ display: inline-flex;
909
+ align-items: center;
910
+ padding: 3px 10px;
911
+ font-size: 0.6875rem;
912
+ font-weight: 600;
913
+ border-radius: 100px;
914
+ text-transform: capitalize;
915
+ }
916
+
917
+ .outcome-badge--success {
918
+ background: rgba(34, 197, 94, 0.12);
919
+ color: var(--color-success);
920
+ border: 1px solid rgba(34, 197, 94, 0.2);
921
+ }
922
+
923
+ .outcome-badge--partial {
924
+ background: rgba(245, 158, 11, 0.12);
925
+ color: var(--color-partial);
926
+ border: 1px solid rgba(245, 158, 11, 0.2);
927
+ }
928
+
929
+ .outcome-badge--failed {
930
+ background: rgba(239, 68, 68, 0.12);
931
+ color: var(--color-failed);
932
+ border: 1px solid rgba(239, 68, 68, 0.2);
933
+ }
934
+
935
+ .td-num {
936
+ font-variant-numeric: tabular-nums;
937
+ text-align: right;
938
+ }
939
+
940
+ .td-issue {
941
+ font-size: 0.75rem;
942
+ color: var(--text-accent);
943
+ font-weight: 500;
944
+ font-variant-numeric: tabular-nums;
945
+ }
946
+
947
+ /* ---------- Loading State ---------- */
948
+ .loading-skeleton {
949
+ display: flex;
950
+ align-items: center;
951
+ justify-content: center;
952
+ min-height: 200px;
953
+ color: var(--text-tertiary);
954
+ font-size: 0.8125rem;
955
+ }
956
+
957
+ .loading-skeleton::after {
958
+ content: 'Loading data\2026';
959
+ animation: fade-pulse 1.5s ease-in-out infinite;
960
+ }
961
+
962
+ @keyframes fade-pulse {
963
+ 0%,
964
+ 100% {
965
+ opacity: 0.4;
966
+ }
967
+ 50% {
968
+ opacity: 1;
969
+ }
970
+ }
971
+
972
+ /* ---------- Empty State ---------- */
973
+ .empty-state {
974
+ display: flex;
975
+ flex-direction: column;
976
+ align-items: center;
977
+ justify-content: center;
978
+ padding: 48px 24px;
979
+ text-align: center;
980
+ gap: 12px;
981
+ }
982
+
983
+ .empty-state__icon {
984
+ font-size: 2rem;
985
+ opacity: 0.4;
986
+ }
987
+
988
+ .empty-state__text {
989
+ font-size: 0.875rem;
990
+ color: var(--text-tertiary);
991
+ max-width: 320px;
992
+ }
993
+
994
+ /* ---------- Animations ---------- */
995
+ @keyframes slide-up {
996
+ from {
997
+ opacity: 0;
998
+ transform: translateY(12px);
999
+ }
1000
+ to {
1001
+ opacity: 1;
1002
+ transform: translateY(0);
1003
+ }
1004
+ }
1005
+
1006
+ .dash-main > * {
1007
+ animation: slide-up 0.5s ease-out backwards;
1008
+ }
1009
+
1010
+ .dash-main > *:nth-child(1) {
1011
+ animation-delay: 0ms;
1012
+ }
1013
+ .dash-main > *:nth-child(2) {
1014
+ animation-delay: 60ms;
1015
+ }
1016
+ .dash-main > *:nth-child(3) {
1017
+ animation-delay: 120ms;
1018
+ }
1019
+ .dash-main > *:nth-child(4) {
1020
+ animation-delay: 180ms;
1021
+ }
1022
+ .dash-main > *:nth-child(5) {
1023
+ animation-delay: 240ms;
1024
+ }
1025
+ .dash-main > *:nth-child(6) {
1026
+ animation-delay: 300ms;
1027
+ }
1028
+ .dash-main > *:nth-child(7) {
1029
+ animation-delay: 360ms;
1030
+ }
1031
+ .dash-main > *:nth-child(8) {
1032
+ animation-delay: 420ms;
1033
+ }
1034
+ .dash-main > *:nth-child(9) {
1035
+ animation-delay: 480ms;
1036
+ }
1037
+ .dash-main > *:nth-child(10) {
1038
+ animation-delay: 540ms;
1039
+ }
1040
+ .dash-main > *:nth-child(11) {
1041
+ animation-delay: 600ms;
1042
+ }
1043
+
1044
+ /* ---------- Responsive Fine-Tuning ---------- */
1045
+ @media (max-width: 640px) {
1046
+ .bar-label {
1047
+ width: 90px;
1048
+ font-size: 0.75rem;
1049
+ }
1050
+
1051
+ .donut-container {
1052
+ flex-direction: column;
1053
+ align-items: center;
1054
+ }
1055
+
1056
+ .donut-wrap {
1057
+ width: 150px;
1058
+ height: 150px;
1059
+ }
1060
+
1061
+ .pipeline {
1062
+ gap: 0;
1063
+ }
1064
+
1065
+ .pipeline-stage {
1066
+ min-width: 100px;
1067
+ padding: 12px 8px;
1068
+ }
1069
+
1070
+ .panel-grid {
1071
+ grid-template-columns: 1fr;
1072
+ }
1073
+
1074
+ .sessions-table th:nth-child(3),
1075
+ .sessions-table td:nth-child(3) {
1076
+ display: none;
1077
+ }
1078
+ }