shipwright-cli 2.2.1 → 2.3.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 (156) hide show
  1. package/README.md +19 -19
  2. package/dashboard/public/index.html +224 -8
  3. package/dashboard/public/styles.css +1078 -4
  4. package/dashboard/server.ts +1100 -15
  5. package/dashboard/src/canvas/interactions.ts +74 -0
  6. package/dashboard/src/canvas/layout.ts +85 -0
  7. package/dashboard/src/canvas/overlays.ts +117 -0
  8. package/dashboard/src/canvas/particles.ts +105 -0
  9. package/dashboard/src/canvas/renderer.ts +191 -0
  10. package/dashboard/src/components/charts/bar.ts +54 -0
  11. package/dashboard/src/components/charts/donut.ts +25 -0
  12. package/dashboard/src/components/charts/pipeline-rail.ts +105 -0
  13. package/dashboard/src/components/charts/sparkline.ts +82 -0
  14. package/dashboard/src/components/header.ts +616 -0
  15. package/dashboard/src/components/modal.ts +413 -0
  16. package/dashboard/src/components/terminal.ts +144 -0
  17. package/dashboard/src/core/api.ts +381 -0
  18. package/dashboard/src/core/helpers.ts +118 -0
  19. package/dashboard/src/core/router.ts +190 -0
  20. package/dashboard/src/core/sse.ts +38 -0
  21. package/dashboard/src/core/state.ts +150 -0
  22. package/dashboard/src/core/ws.ts +143 -0
  23. package/dashboard/src/design/icons.ts +131 -0
  24. package/dashboard/src/design/tokens.ts +160 -0
  25. package/dashboard/src/main.ts +68 -0
  26. package/dashboard/src/types/api.ts +337 -0
  27. package/dashboard/src/views/activity.ts +185 -0
  28. package/dashboard/src/views/agent-cockpit.ts +236 -0
  29. package/dashboard/src/views/agents.ts +72 -0
  30. package/dashboard/src/views/fleet-map.ts +299 -0
  31. package/dashboard/src/views/insights.ts +298 -0
  32. package/dashboard/src/views/machines.ts +162 -0
  33. package/dashboard/src/views/metrics.ts +420 -0
  34. package/dashboard/src/views/overview.ts +409 -0
  35. package/dashboard/src/views/pipeline-theater.ts +219 -0
  36. package/dashboard/src/views/pipelines.ts +595 -0
  37. package/dashboard/src/views/team.ts +362 -0
  38. package/dashboard/src/views/timeline.ts +389 -0
  39. package/dashboard/tsconfig.json +21 -0
  40. package/docs/AGI-PLATFORM-PLAN.md +5 -5
  41. package/docs/AGI-WHATS-NEXT.md +19 -16
  42. package/docs/README.md +2 -0
  43. package/package.json +8 -1
  44. package/scripts/check-version-consistency.sh +72 -0
  45. package/scripts/lib/daemon-adaptive.sh +610 -0
  46. package/scripts/lib/daemon-dispatch.sh +489 -0
  47. package/scripts/lib/daemon-failure.sh +387 -0
  48. package/scripts/lib/daemon-patrol.sh +1113 -0
  49. package/scripts/lib/daemon-poll.sh +1202 -0
  50. package/scripts/lib/daemon-state.sh +550 -0
  51. package/scripts/lib/daemon-triage.sh +490 -0
  52. package/scripts/lib/helpers.sh +81 -0
  53. package/scripts/lib/pipeline-intelligence.sh +0 -6
  54. package/scripts/lib/pipeline-quality-checks.sh +3 -1
  55. package/scripts/lib/pipeline-stages.sh +20 -0
  56. package/scripts/sw +109 -168
  57. package/scripts/sw-activity.sh +1 -1
  58. package/scripts/sw-adaptive.sh +2 -2
  59. package/scripts/sw-adversarial.sh +1 -1
  60. package/scripts/sw-architecture-enforcer.sh +1 -1
  61. package/scripts/sw-auth.sh +14 -6
  62. package/scripts/sw-autonomous.sh +1 -1
  63. package/scripts/sw-changelog.sh +2 -2
  64. package/scripts/sw-checkpoint.sh +1 -1
  65. package/scripts/sw-ci.sh +1 -1
  66. package/scripts/sw-cleanup.sh +1 -1
  67. package/scripts/sw-code-review.sh +1 -1
  68. package/scripts/sw-connect.sh +1 -1
  69. package/scripts/sw-context.sh +1 -1
  70. package/scripts/sw-cost.sh +1 -1
  71. package/scripts/sw-daemon.sh +53 -4817
  72. package/scripts/sw-dashboard.sh +1 -1
  73. package/scripts/sw-db.sh +1 -1
  74. package/scripts/sw-decompose.sh +1 -1
  75. package/scripts/sw-deps.sh +1 -1
  76. package/scripts/sw-developer-simulation.sh +1 -1
  77. package/scripts/sw-discovery.sh +1 -1
  78. package/scripts/sw-doc-fleet.sh +1 -1
  79. package/scripts/sw-docs-agent.sh +1 -1
  80. package/scripts/sw-docs.sh +1 -1
  81. package/scripts/sw-doctor.sh +49 -1
  82. package/scripts/sw-dora.sh +1 -1
  83. package/scripts/sw-durable.sh +1 -1
  84. package/scripts/sw-e2e-orchestrator.sh +1 -1
  85. package/scripts/sw-eventbus.sh +1 -1
  86. package/scripts/sw-feedback.sh +1 -1
  87. package/scripts/sw-fix.sh +6 -5
  88. package/scripts/sw-fleet-discover.sh +1 -1
  89. package/scripts/sw-fleet-viz.sh +3 -3
  90. package/scripts/sw-fleet.sh +1 -1
  91. package/scripts/sw-github-app.sh +5 -2
  92. package/scripts/sw-github-checks.sh +1 -1
  93. package/scripts/sw-github-deploy.sh +1 -1
  94. package/scripts/sw-github-graphql.sh +1 -1
  95. package/scripts/sw-guild.sh +1 -1
  96. package/scripts/sw-heartbeat.sh +1 -1
  97. package/scripts/sw-hygiene.sh +1 -1
  98. package/scripts/sw-incident.sh +1 -1
  99. package/scripts/sw-init.sh +112 -9
  100. package/scripts/sw-instrument.sh +6 -1
  101. package/scripts/sw-intelligence.sh +5 -1
  102. package/scripts/sw-jira.sh +1 -1
  103. package/scripts/sw-launchd.sh +1 -1
  104. package/scripts/sw-linear.sh +20 -9
  105. package/scripts/sw-logs.sh +1 -1
  106. package/scripts/sw-loop.sh +2 -1
  107. package/scripts/sw-memory.sh +10 -1
  108. package/scripts/sw-mission-control.sh +1 -1
  109. package/scripts/sw-model-router.sh +4 -1
  110. package/scripts/sw-otel.sh +4 -4
  111. package/scripts/sw-oversight.sh +1 -1
  112. package/scripts/sw-pipeline-composer.sh +3 -1
  113. package/scripts/sw-pipeline-vitals.sh +4 -6
  114. package/scripts/sw-pipeline.sh +19 -56
  115. package/scripts/sw-pipeline.sh.mock +7 -0
  116. package/scripts/sw-pm.sh +5 -2
  117. package/scripts/sw-pr-lifecycle.sh +1 -1
  118. package/scripts/sw-predictive.sh +4 -1
  119. package/scripts/sw-prep.sh +3 -2
  120. package/scripts/sw-ps.sh +1 -1
  121. package/scripts/sw-public-dashboard.sh +10 -4
  122. package/scripts/sw-quality.sh +1 -1
  123. package/scripts/sw-reaper.sh +1 -1
  124. package/scripts/sw-recruit.sh +25 -1
  125. package/scripts/sw-regression.sh +2 -1
  126. package/scripts/sw-release-manager.sh +1 -1
  127. package/scripts/sw-release.sh +7 -5
  128. package/scripts/sw-remote.sh +1 -1
  129. package/scripts/sw-replay.sh +1 -1
  130. package/scripts/sw-retro.sh +1 -1
  131. package/scripts/sw-scale.sh +11 -5
  132. package/scripts/sw-security-audit.sh +1 -1
  133. package/scripts/sw-self-optimize.sh +172 -7
  134. package/scripts/sw-session.sh +1 -1
  135. package/scripts/sw-setup.sh +1 -1
  136. package/scripts/sw-standup.sh +4 -3
  137. package/scripts/sw-status.sh +1 -1
  138. package/scripts/sw-strategic.sh +2 -1
  139. package/scripts/sw-stream.sh +8 -2
  140. package/scripts/sw-swarm.sh +12 -10
  141. package/scripts/sw-team-stages.sh +1 -1
  142. package/scripts/sw-templates.sh +1 -1
  143. package/scripts/sw-testgen.sh +3 -2
  144. package/scripts/sw-tmux-pipeline.sh +2 -1
  145. package/scripts/sw-tmux.sh +1 -1
  146. package/scripts/sw-trace.sh +1 -1
  147. package/scripts/sw-tracker-jira.sh +1 -0
  148. package/scripts/sw-tracker-linear.sh +1 -0
  149. package/scripts/sw-tracker.sh +24 -6
  150. package/scripts/sw-triage.sh +1 -1
  151. package/scripts/sw-upgrade.sh +1 -1
  152. package/scripts/sw-ux.sh +1 -1
  153. package/scripts/sw-webhook.sh +1 -1
  154. package/scripts/sw-widgets.sh +2 -2
  155. package/scripts/sw-worktree.sh +1 -1
  156. package/dashboard/public/app.js +0 -4422
@@ -40,6 +40,84 @@
40
40
 
41
41
  --transition-fast: 0.15s ease;
42
42
  --transition-base: 0.3s ease;
43
+ --transition-slow: 0.5s ease;
44
+
45
+ /* Spacing scale */
46
+ --space-1: 4px;
47
+ --space-2: 8px;
48
+ --space-3: 12px;
49
+ --space-4: 16px;
50
+ --space-5: 20px;
51
+ --space-6: 24px;
52
+ --space-8: 32px;
53
+ --space-10: 40px;
54
+ --space-12: 48px;
55
+ --space-16: 64px;
56
+
57
+ /* Border radius */
58
+ --radius-sm: 4px;
59
+ --radius-md: 8px;
60
+ --radius-lg: 12px;
61
+ --radius-xl: 16px;
62
+ --radius-full: 9999px;
63
+
64
+ /* Shadows */
65
+ --shadow-glow-cyan: 0 0 20px rgba(0, 212, 255, 0.15);
66
+ --shadow-glow-purple: 0 0 20px rgba(124, 58, 237, 0.15);
67
+ --shadow-glow-success: 0 0 12px rgba(74, 222, 128, 0.2);
68
+ --shadow-glow-error: 0 0 12px rgba(244, 63, 94, 0.2);
69
+ --shadow-elevated: 0 8px 32px rgba(0, 0, 0, 0.4);
70
+
71
+ /* Z-index */
72
+ --z-base: 1;
73
+ --z-dropdown: 10;
74
+ --z-sticky: 20;
75
+ --z-overlay: 30;
76
+ --z-modal: 40;
77
+ --z-toast: 50;
78
+
79
+ /* Easing */
80
+ --ease-smooth: cubic-bezier(0.4, 0, 0.2, 1);
81
+ --ease-spring: cubic-bezier(0.34, 1.56, 0.64, 1);
82
+ }
83
+
84
+ /* ── Light Mode ───────────────────────────────── */
85
+ :root[data-theme="light"] {
86
+ --abyss: #f5f7fa;
87
+ --deep: #ebeef3;
88
+ --ocean: #dde2ea;
89
+ --surface: #cdd4de;
90
+ --foam: #bcc5d3;
91
+
92
+ --cyan: #0077b6;
93
+ --cyan-glow: rgba(0, 119, 182, 0.1);
94
+ --cyan-dim: rgba(0, 119, 182, 0.3);
95
+ --purple: #6d28d9;
96
+ --purple-glow: rgba(109, 40, 217, 0.1);
97
+ --blue: #0055cc;
98
+
99
+ --green: #16a34a;
100
+ --amber: #d97706;
101
+ --rose: #dc2626;
102
+
103
+ --text-primary: #1a1a2e;
104
+ --text-secondary: #475569;
105
+ --text-muted: #94a3b8;
106
+
107
+ --card-bg: rgba(255, 255, 255, 0.9);
108
+ --card-border: rgba(0, 119, 182, 0.12);
109
+ --card-hover-border: rgba(0, 119, 182, 0.25);
110
+
111
+ --shadow-elevated: 0 4px 16px rgba(0, 0, 0, 0.08);
112
+ --shadow-glow-cyan: 0 0 12px rgba(0, 119, 182, 0.1);
113
+ --shadow-glow-purple: 0 0 12px rgba(109, 40, 217, 0.1);
114
+ --shadow-glow-success: 0 0 8px rgba(22, 163, 74, 0.15);
115
+ --shadow-glow-error: 0 0 8px rgba(220, 38, 38, 0.15);
116
+
117
+ --bg-abyss: #f5f7fa;
118
+ --bg-deep: #ebeef3;
119
+ --bg-foam: #dde2ea;
120
+ --border: rgba(0, 0, 0, 0.1);
43
121
  }
44
122
 
45
123
  ::selection {
@@ -4355,6 +4433,38 @@ select.form-input {
4355
4433
  }
4356
4434
  }
4357
4435
 
4436
+ @media (max-width: 768px) {
4437
+ .tab-bar-inner {
4438
+ overflow-x: auto;
4439
+ -webkit-overflow-scrolling: touch;
4440
+ scrollbar-width: none;
4441
+ padding: 0 8px;
4442
+ }
4443
+ .tab-bar-inner::-webkit-scrollbar {
4444
+ display: none;
4445
+ }
4446
+ .tab-btn {
4447
+ padding: 0 10px;
4448
+ font-size: 0.75rem;
4449
+ white-space: nowrap;
4450
+ flex-shrink: 0;
4451
+ }
4452
+ .header {
4453
+ padding: 0 12px;
4454
+ height: 48px;
4455
+ }
4456
+ .header-left .dashboard-title {
4457
+ font-size: 0.9rem;
4458
+ }
4459
+ .daemon-control-bar {
4460
+ flex-wrap: wrap;
4461
+ gap: 0.25rem;
4462
+ }
4463
+ .daemon-control-info {
4464
+ display: none;
4465
+ }
4466
+ }
4467
+
4358
4468
  @media (max-width: 640px) {
4359
4469
  .stats-row {
4360
4470
  grid-template-columns: 1fr;
@@ -4365,13 +4475,13 @@ select.form-input {
4365
4475
  }
4366
4476
 
4367
4477
  .tab-btn {
4368
- padding: 0 12px;
4369
- font-size: 0.8rem;
4478
+ padding: 0 8px;
4479
+ font-size: 0.7rem;
4370
4480
  }
4371
4481
 
4372
4482
  .main {
4373
- padding-left: 12px;
4374
- padding-right: 12px;
4483
+ padding-left: 8px;
4484
+ padding-right: 8px;
4375
4485
  }
4376
4486
 
4377
4487
  .agents-grid {
@@ -4384,6 +4494,18 @@ select.form-input {
4384
4494
  font-size: 1.1rem;
4385
4495
  }
4386
4496
 
4497
+ .header-actions {
4498
+ gap: 4px;
4499
+ }
4500
+ .sound-toggle,
4501
+ .theme-toggle {
4502
+ font-size: 0.65rem;
4503
+ padding: 3px 6px;
4504
+ }
4505
+ .cost-ticker {
4506
+ display: none;
4507
+ }
4508
+
4387
4509
  .dora-grades-row {
4388
4510
  grid-template-columns: repeat(2, 1fr);
4389
4511
  }
@@ -4753,3 +4875,955 @@ select.form-input {
4753
4875
  }
4754
4876
 
4755
4877
  /* presence-pulse: used by pulse-dot keyframes on .presence-dot.online */
4878
+
4879
+ /* ═══════════════════════════════════════════════════════════════════
4880
+ NEW VISUALIZATION VIEWS
4881
+ ═══════════════════════════════════════════════════════════════════ */
4882
+
4883
+ /* ── Fleet Map ──────────────────────────────────── */
4884
+ .fleet-map-canvas {
4885
+ border-radius: var(--card-radius);
4886
+ overflow: hidden;
4887
+ background: var(--abyss);
4888
+ }
4889
+
4890
+ .fleet-map-canvas canvas {
4891
+ border-radius: var(--card-radius);
4892
+ }
4893
+
4894
+ /* ── Pipeline Theater ───────────────────────────── */
4895
+ .theater-layout {
4896
+ display: grid;
4897
+ grid-template-columns: 240px 1fr;
4898
+ gap: 16px;
4899
+ height: calc(100vh - 160px);
4900
+ }
4901
+
4902
+ .theater-sidebar {
4903
+ background: var(--card-bg);
4904
+ border: 1px solid var(--card-border);
4905
+ border-radius: var(--card-radius);
4906
+ overflow-y: auto;
4907
+ padding: 16px;
4908
+ }
4909
+
4910
+ .theater-sidebar-header {
4911
+ font-family: var(--font-body);
4912
+ font-weight: 600;
4913
+ font-size: 0.85rem;
4914
+ color: var(--text-secondary);
4915
+ text-transform: uppercase;
4916
+ letter-spacing: 0.05em;
4917
+ margin-bottom: 12px;
4918
+ }
4919
+
4920
+ .theater-pipeline-item {
4921
+ display: flex;
4922
+ align-items: center;
4923
+ gap: 8px;
4924
+ padding: 10px 12px;
4925
+ border-radius: 8px;
4926
+ cursor: pointer;
4927
+ transition: background var(--transition-fast);
4928
+ margin-bottom: 4px;
4929
+ }
4930
+
4931
+ .theater-pipeline-item:hover {
4932
+ background: var(--surface);
4933
+ }
4934
+
4935
+ .theater-pipeline-item.selected {
4936
+ background: var(--surface);
4937
+ border: 1px solid var(--cyan-dim);
4938
+ }
4939
+
4940
+ .theater-issue {
4941
+ font-family: var(--font-mono);
4942
+ font-size: 0.8rem;
4943
+ color: var(--cyan);
4944
+ font-weight: 600;
4945
+ min-width: 40px;
4946
+ }
4947
+
4948
+ .theater-stage {
4949
+ font-family: var(--font-mono);
4950
+ font-size: 0.7rem;
4951
+ color: var(--text-secondary);
4952
+ flex: 1;
4953
+ }
4954
+
4955
+ .theater-elapsed {
4956
+ font-family: var(--font-mono);
4957
+ font-size: 0.7rem;
4958
+ color: var(--text-muted);
4959
+ }
4960
+
4961
+ .theater-main {
4962
+ display: flex;
4963
+ flex-direction: column;
4964
+ gap: 12px;
4965
+ overflow: hidden;
4966
+ }
4967
+
4968
+ .theater-stage-rail {
4969
+ padding: 8px 16px;
4970
+ background: var(--card-bg);
4971
+ border: 1px solid var(--card-border);
4972
+ border-radius: var(--card-radius);
4973
+ }
4974
+
4975
+ .theater-metrics-bar {
4976
+ display: flex;
4977
+ gap: 16px;
4978
+ padding: 12px 16px;
4979
+ background: var(--card-bg);
4980
+ border: 1px solid var(--card-border);
4981
+ border-radius: var(--card-radius);
4982
+ }
4983
+
4984
+ .theater-metric {
4985
+ display: flex;
4986
+ align-items: center;
4987
+ gap: 8px;
4988
+ }
4989
+
4990
+ .theater-metric-label {
4991
+ font-family: var(--font-mono);
4992
+ font-size: 0.7rem;
4993
+ color: var(--text-muted);
4994
+ display: flex;
4995
+ align-items: center;
4996
+ gap: 4px;
4997
+ }
4998
+
4999
+ .theater-metric-value {
5000
+ font-family: var(--font-mono);
5001
+ font-size: 0.85rem;
5002
+ color: var(--text-primary);
5003
+ font-weight: 600;
5004
+ }
5005
+
5006
+ .theater-terminal {
5007
+ flex: 1;
5008
+ background: var(--abyss);
5009
+ border: 1px solid var(--card-border);
5010
+ border-radius: var(--card-radius);
5011
+ overflow: hidden;
5012
+ min-height: 300px;
5013
+ }
5014
+
5015
+ /* ── Live Terminal ──────────────────────────────── */
5016
+ .live-terminal {
5017
+ font-family: var(--font-mono);
5018
+ font-size: 12px;
5019
+ line-height: 1.5;
5020
+ color: var(--text-primary);
5021
+ padding: 12px;
5022
+ overflow-y: auto;
5023
+ height: 100%;
5024
+ background: var(--abyss);
5025
+ }
5026
+
5027
+ .terminal-line {
5028
+ display: flex;
5029
+ gap: 12px;
5030
+ white-space: pre-wrap;
5031
+ word-break: break-all;
5032
+ }
5033
+
5034
+ .terminal-line-num {
5035
+ color: var(--text-muted);
5036
+ min-width: 40px;
5037
+ text-align: right;
5038
+ user-select: none;
5039
+ flex-shrink: 0;
5040
+ }
5041
+
5042
+ .terminal-line-text {
5043
+ flex: 1;
5044
+ }
5045
+
5046
+ /* ── Agent Cockpit ──────────────────────────────── */
5047
+ .cockpit-layout {
5048
+ display: flex;
5049
+ flex-direction: column;
5050
+ height: calc(100vh - 160px);
5051
+ gap: 12px;
5052
+ }
5053
+
5054
+ .cockpit-agent-bar {
5055
+ display: flex;
5056
+ gap: 8px;
5057
+ padding: 8px 16px;
5058
+ background: var(--card-bg);
5059
+ border: 1px solid var(--card-border);
5060
+ border-radius: var(--card-radius);
5061
+ overflow-x: auto;
5062
+ flex-shrink: 0;
5063
+ }
5064
+
5065
+ .cockpit-agent-btn {
5066
+ display: flex;
5067
+ align-items: center;
5068
+ gap: 6px;
5069
+ padding: 8px 16px;
5070
+ background: transparent;
5071
+ border: 1px solid var(--card-border);
5072
+ border-radius: 8px;
5073
+ color: var(--text-secondary);
5074
+ font-family: var(--font-mono);
5075
+ font-size: 0.8rem;
5076
+ cursor: pointer;
5077
+ transition: all var(--transition-fast);
5078
+ white-space: nowrap;
5079
+ }
5080
+
5081
+ .cockpit-agent-btn:hover {
5082
+ background: var(--surface);
5083
+ border-color: var(--cyan-dim);
5084
+ }
5085
+
5086
+ .cockpit-agent-btn.selected {
5087
+ background: var(--surface);
5088
+ border-color: var(--cyan);
5089
+ color: var(--cyan);
5090
+ }
5091
+
5092
+ .cockpit-main {
5093
+ flex: 1;
5094
+ display: flex;
5095
+ flex-direction: column;
5096
+ gap: 12px;
5097
+ overflow: hidden;
5098
+ }
5099
+
5100
+ .cockpit-metrics {
5101
+ display: grid;
5102
+ grid-template-columns: repeat(4, 1fr);
5103
+ gap: 12px;
5104
+ flex-shrink: 0;
5105
+ }
5106
+
5107
+ .cockpit-metric-card {
5108
+ background: var(--card-bg);
5109
+ border: 1px solid var(--card-border);
5110
+ border-radius: var(--card-radius);
5111
+ padding: 16px;
5112
+ }
5113
+
5114
+ .cockpit-metric-header {
5115
+ font-family: var(--font-body);
5116
+ font-size: 0.75rem;
5117
+ font-weight: 600;
5118
+ color: var(--text-muted);
5119
+ text-transform: uppercase;
5120
+ letter-spacing: 0.05em;
5121
+ margin-bottom: 8px;
5122
+ display: flex;
5123
+ align-items: center;
5124
+ gap: 6px;
5125
+ }
5126
+
5127
+ .cockpit-metric-chart {
5128
+ display: flex;
5129
+ align-items: center;
5130
+ justify-content: center;
5131
+ }
5132
+
5133
+ .cockpit-status-info {
5134
+ font-family: var(--font-mono);
5135
+ font-size: 0.8rem;
5136
+ color: var(--text-secondary);
5137
+ line-height: 1.8;
5138
+ }
5139
+
5140
+ .cockpit-status-info strong {
5141
+ color: var(--cyan);
5142
+ }
5143
+
5144
+ .cockpit-terminal {
5145
+ flex: 1;
5146
+ background: var(--abyss);
5147
+ border: 1px solid var(--card-border);
5148
+ border-radius: var(--card-radius);
5149
+ overflow: hidden;
5150
+ min-height: 200px;
5151
+ }
5152
+
5153
+ /* ── Cost Burn Animation ────────────────────────── */
5154
+ @keyframes cost-burn {
5155
+ 0% {
5156
+ background-position: 0% 50%;
5157
+ }
5158
+ 100% {
5159
+ background-position: 200% 50%;
5160
+ }
5161
+ }
5162
+
5163
+ .cost-ticker-animated {
5164
+ background: linear-gradient(
5165
+ 90deg,
5166
+ var(--cyan) 0%,
5167
+ var(--purple) 25%,
5168
+ var(--cyan) 50%,
5169
+ var(--purple) 75%,
5170
+ var(--cyan) 100%
5171
+ );
5172
+ background-size: 200% 100%;
5173
+ -webkit-background-clip: text;
5174
+ background-clip: text;
5175
+ -webkit-text-fill-color: transparent;
5176
+ animation: cost-burn 3s linear infinite;
5177
+ }
5178
+
5179
+ /* ── Sound Toggle ───────────────────────────────── */
5180
+ .sound-toggle {
5181
+ display: flex;
5182
+ align-items: center;
5183
+ gap: 6px;
5184
+ padding: 4px 10px;
5185
+ background: transparent;
5186
+ border: 1px solid var(--card-border);
5187
+ border-radius: var(--radius-full);
5188
+ color: var(--text-muted);
5189
+ font-family: var(--font-mono);
5190
+ font-size: 0.7rem;
5191
+ cursor: pointer;
5192
+ transition: all var(--transition-fast);
5193
+ }
5194
+
5195
+ .sound-toggle:hover {
5196
+ border-color: var(--cyan-dim);
5197
+ color: var(--text-secondary);
5198
+ }
5199
+
5200
+ .sound-toggle.active {
5201
+ border-color: var(--cyan);
5202
+ color: var(--cyan);
5203
+ }
5204
+
5205
+ /* ── Pipeline Completion Flash ──────────────────── */
5206
+ @keyframes completion-flash {
5207
+ 0% {
5208
+ box-shadow: 0 0 0 0 rgba(74, 222, 128, 0.6);
5209
+ transform: scale(1);
5210
+ }
5211
+ 50% {
5212
+ box-shadow: 0 0 30px 10px rgba(74, 222, 128, 0.3);
5213
+ transform: scale(1.02);
5214
+ }
5215
+ 100% {
5216
+ box-shadow: 0 0 0 0 rgba(74, 222, 128, 0);
5217
+ transform: scale(1);
5218
+ }
5219
+ }
5220
+
5221
+ @keyframes failure-flash {
5222
+ 0% {
5223
+ box-shadow: 0 0 0 0 rgba(244, 63, 94, 0.6);
5224
+ transform: scale(1);
5225
+ }
5226
+ 50% {
5227
+ box-shadow: 0 0 30px 10px rgba(244, 63, 94, 0.3);
5228
+ transform: scale(1.02);
5229
+ }
5230
+ 100% {
5231
+ box-shadow: 0 0 0 0 rgba(244, 63, 94, 0);
5232
+ transform: scale(1);
5233
+ }
5234
+ }
5235
+
5236
+ .pipeline-card.completing {
5237
+ animation: completion-flash 1s var(--ease-smooth);
5238
+ }
5239
+
5240
+ .pipeline-card.failing {
5241
+ animation: failure-flash 1s var(--ease-smooth);
5242
+ }
5243
+
5244
+ /* ── Ambient Activity Pulse ─────────────────────── */
5245
+ @keyframes ambient-pulse {
5246
+ 0%,
5247
+ 100% {
5248
+ opacity: 0.3;
5249
+ }
5250
+ 50% {
5251
+ opacity: 0.6;
5252
+ }
5253
+ }
5254
+
5255
+ .ambient-indicator {
5256
+ position: fixed;
5257
+ bottom: 16px;
5258
+ right: 16px;
5259
+ width: 8px;
5260
+ height: 8px;
5261
+ border-radius: var(--radius-full);
5262
+ background: var(--cyan);
5263
+ animation: ambient-pulse 3s ease-in-out infinite;
5264
+ z-index: var(--z-base);
5265
+ pointer-events: none;
5266
+ }
5267
+
5268
+ .ambient-indicator.busy {
5269
+ background: var(--amber);
5270
+ animation-duration: 1s;
5271
+ }
5272
+
5273
+ .ambient-indicator.critical {
5274
+ background: var(--rose);
5275
+ animation-duration: 0.5s;
5276
+ }
5277
+
5278
+ /* ── Responsive: New Views ──────────────────────── */
5279
+ @media (max-width: 768px) {
5280
+ .theater-layout {
5281
+ grid-template-columns: 1fr;
5282
+ height: auto;
5283
+ }
5284
+
5285
+ .theater-sidebar {
5286
+ max-height: 200px;
5287
+ }
5288
+
5289
+ .cockpit-metrics {
5290
+ grid-template-columns: repeat(2, 1fr);
5291
+ }
5292
+
5293
+ .cockpit-layout {
5294
+ height: auto;
5295
+ }
5296
+ }
5297
+
5298
+ /* ── Global Learnings ─────────────────────────── */
5299
+ .learnings-list {
5300
+ display: flex;
5301
+ flex-direction: column;
5302
+ gap: 0.5rem;
5303
+ }
5304
+ .learning-card {
5305
+ background: var(--bg-foam);
5306
+ border: 1px solid var(--border);
5307
+ border-radius: var(--radius-md);
5308
+ padding: 0.75rem 1rem;
5309
+ }
5310
+ .learning-header {
5311
+ display: flex;
5312
+ align-items: center;
5313
+ gap: 0.5rem;
5314
+ margin-bottom: 0.25rem;
5315
+ font-size: 0.75rem;
5316
+ }
5317
+ .learning-category {
5318
+ background: var(--cyan);
5319
+ color: var(--bg-abyss);
5320
+ padding: 0.125rem 0.5rem;
5321
+ border-radius: var(--radius-sm);
5322
+ font-weight: 600;
5323
+ text-transform: uppercase;
5324
+ font-size: 0.65rem;
5325
+ }
5326
+ .learning-source {
5327
+ color: var(--text-muted);
5328
+ }
5329
+ .learning-time {
5330
+ color: var(--text-muted);
5331
+ margin-left: auto;
5332
+ }
5333
+ .learning-content {
5334
+ font-size: 0.85rem;
5335
+ color: var(--text-primary);
5336
+ line-height: 1.4;
5337
+ }
5338
+
5339
+ /* ── Triage Reasoning ─────────────────────────── */
5340
+ .queue-triage-reasoning {
5341
+ padding: 0.5rem 0.75rem;
5342
+ }
5343
+ .triage-reason {
5344
+ color: var(--text-primary);
5345
+ margin-bottom: 0.25rem;
5346
+ font-size: 0.85rem;
5347
+ }
5348
+ .triage-detail {
5349
+ color: var(--text-muted);
5350
+ font-size: 0.8rem;
5351
+ }
5352
+
5353
+ /* ── Team Invite ──────────────────────────────── */
5354
+ .invite-result {
5355
+ margin-bottom: 1rem;
5356
+ }
5357
+ .invite-link-box {
5358
+ display: flex;
5359
+ align-items: center;
5360
+ gap: 0.5rem;
5361
+ background: var(--bg-foam);
5362
+ border: 1px solid var(--border);
5363
+ border-radius: var(--radius-md);
5364
+ padding: 0.75rem 1rem;
5365
+ }
5366
+ .invite-label {
5367
+ font-size: 0.8rem;
5368
+ color: var(--text-muted);
5369
+ white-space: nowrap;
5370
+ }
5371
+ .invite-url {
5372
+ background: var(--bg-deep);
5373
+ padding: 0.25rem 0.5rem;
5374
+ border-radius: var(--radius-sm);
5375
+ font-size: 0.8rem;
5376
+ overflow: hidden;
5377
+ text-overflow: ellipsis;
5378
+ flex: 1;
5379
+ }
5380
+ .invite-error {
5381
+ color: var(--rose);
5382
+ font-size: 0.85rem;
5383
+ }
5384
+
5385
+ /* ── Live Changes Panel ───────────────────────── */
5386
+ .theater-changes,
5387
+ .cockpit-changes {
5388
+ border: 1px solid var(--border);
5389
+ border-radius: var(--radius-md);
5390
+ overflow: hidden;
5391
+ margin-bottom: 0.5rem;
5392
+ }
5393
+ .theater-changes-header,
5394
+ .cockpit-changes-header {
5395
+ display: flex;
5396
+ align-items: center;
5397
+ gap: 0.5rem;
5398
+ padding: 0.5rem 0.75rem;
5399
+ background: var(--bg-foam);
5400
+ border-bottom: 1px solid var(--border);
5401
+ font-size: 0.85rem;
5402
+ font-weight: 600;
5403
+ }
5404
+ .theater-changes-body,
5405
+ .cockpit-changes-body {
5406
+ padding: 0.5rem 0.75rem;
5407
+ max-height: 200px;
5408
+ overflow-y: auto;
5409
+ }
5410
+ .changes-stats {
5411
+ display: flex;
5412
+ gap: 0.75rem;
5413
+ margin-bottom: 0.5rem;
5414
+ font-size: 0.8rem;
5415
+ }
5416
+ .stat-add {
5417
+ color: var(--green);
5418
+ }
5419
+ .stat-del {
5420
+ color: var(--rose);
5421
+ }
5422
+ .stat-files {
5423
+ color: var(--text-muted);
5424
+ }
5425
+ .changes-file-list {
5426
+ display: flex;
5427
+ flex-direction: column;
5428
+ gap: 0.125rem;
5429
+ }
5430
+ .changes-file-item {
5431
+ display: flex;
5432
+ align-items: center;
5433
+ gap: 0.5rem;
5434
+ font-size: 0.8rem;
5435
+ font-family: var(--font-mono);
5436
+ padding: 0.125rem 0;
5437
+ }
5438
+ .file-status {
5439
+ width: 1.25rem;
5440
+ text-align: center;
5441
+ font-weight: 700;
5442
+ }
5443
+ .file-added .file-status {
5444
+ color: var(--green);
5445
+ }
5446
+ .file-deleted .file-status {
5447
+ color: var(--rose);
5448
+ }
5449
+ .file-modified .file-status {
5450
+ color: var(--amber);
5451
+ }
5452
+ .file-path {
5453
+ overflow: hidden;
5454
+ text-overflow: ellipsis;
5455
+ white-space: nowrap;
5456
+ }
5457
+ .changes-diff-details {
5458
+ margin-top: 0.5rem;
5459
+ }
5460
+ .changes-diff-details summary {
5461
+ cursor: pointer;
5462
+ font-size: 0.8rem;
5463
+ color: var(--cyan);
5464
+ }
5465
+ .changes-diff {
5466
+ margin-top: 0.25rem;
5467
+ padding: 0.5rem;
5468
+ background: var(--bg-abyss);
5469
+ border-radius: var(--radius-sm);
5470
+ font-size: 0.75rem;
5471
+ max-height: 300px;
5472
+ overflow: auto;
5473
+ white-space: pre-wrap;
5474
+ }
5475
+
5476
+ /* ── Reasoning & Failure ──────────────────────── */
5477
+ .reasoning-list,
5478
+ .failure-analysis-list {
5479
+ display: flex;
5480
+ flex-direction: column;
5481
+ gap: 0.75rem;
5482
+ }
5483
+ .reasoning-entry,
5484
+ .failure-entry {
5485
+ background: var(--bg-foam);
5486
+ border: 1px solid var(--border);
5487
+ border-radius: var(--radius-md);
5488
+ padding: 0.75rem 1rem;
5489
+ }
5490
+ .reasoning-stage,
5491
+ .failure-type {
5492
+ font-weight: 700;
5493
+ font-size: 0.8rem;
5494
+ text-transform: uppercase;
5495
+ color: var(--cyan);
5496
+ margin-bottom: 0.25rem;
5497
+ }
5498
+ .reasoning-content {
5499
+ font-size: 0.85rem;
5500
+ line-height: 1.5;
5501
+ color: var(--text-primary);
5502
+ }
5503
+ .failure-desc {
5504
+ font-size: 0.85rem;
5505
+ color: var(--text-primary);
5506
+ margin-bottom: 0.25rem;
5507
+ }
5508
+ .failure-root-cause,
5509
+ .failure-fix {
5510
+ font-size: 0.8rem;
5511
+ color: var(--text-muted);
5512
+ margin-top: 0.25rem;
5513
+ }
5514
+
5515
+ /* ── Quality Gates ────────────────────────────── */
5516
+ .quality-gate-panel {
5517
+ margin-bottom: 0.75rem;
5518
+ border: 1px solid var(--border);
5519
+ border-radius: var(--radius-md);
5520
+ padding: 0.75rem 1rem;
5521
+ }
5522
+ .quality-gate-header {
5523
+ display: flex;
5524
+ align-items: center;
5525
+ gap: 0.5rem;
5526
+ margin-bottom: 0.5rem;
5527
+ font-weight: 600;
5528
+ }
5529
+ .quality-gate-rules {
5530
+ display: flex;
5531
+ flex-direction: column;
5532
+ gap: 0.25rem;
5533
+ }
5534
+ .quality-gate-rule {
5535
+ display: flex;
5536
+ align-items: center;
5537
+ gap: 0.5rem;
5538
+ font-size: 0.85rem;
5539
+ padding: 0.25rem 0.5rem;
5540
+ border-radius: var(--radius-sm);
5541
+ }
5542
+ .quality-gate-rule.gate-pass {
5543
+ background: rgba(74, 222, 128, 0.08);
5544
+ }
5545
+ .quality-gate-rule.gate-fail {
5546
+ background: rgba(244, 63, 94, 0.1);
5547
+ }
5548
+ .gate-status {
5549
+ width: 1rem;
5550
+ text-align: center;
5551
+ font-weight: 700;
5552
+ }
5553
+ .gate-pass .gate-status {
5554
+ color: var(--green);
5555
+ }
5556
+ .gate-fail .gate-status {
5557
+ color: var(--rose);
5558
+ }
5559
+ .gate-name {
5560
+ flex: 1;
5561
+ }
5562
+ .gate-threshold {
5563
+ color: var(--text-muted);
5564
+ font-size: 0.8rem;
5565
+ }
5566
+ .gate-value {
5567
+ color: var(--text-muted);
5568
+ font-size: 0.8rem;
5569
+ }
5570
+
5571
+ /* ── Approval Gates ───────────────────────────── */
5572
+ .approval-gate-banner {
5573
+ margin-bottom: 0.75rem;
5574
+ }
5575
+ .approval-gate-waiting {
5576
+ display: flex;
5577
+ align-items: center;
5578
+ gap: 0.75rem;
5579
+ background: rgba(251, 191, 36, 0.12);
5580
+ border: 1px solid var(--amber);
5581
+ border-radius: var(--radius-md);
5582
+ padding: 0.75rem 1rem;
5583
+ font-size: 0.9rem;
5584
+ }
5585
+ .approval-icon {
5586
+ font-size: 1.25rem;
5587
+ }
5588
+ .approval-actions {
5589
+ margin-left: auto;
5590
+ display: flex;
5591
+ gap: 0.5rem;
5592
+ }
5593
+ .approval-approved {
5594
+ background: rgba(74, 222, 128, 0.1);
5595
+ border: 1px solid var(--green);
5596
+ border-radius: var(--radius-md);
5597
+ padding: 0.75rem 1rem;
5598
+ color: var(--green);
5599
+ }
5600
+ .approval-rejected {
5601
+ background: rgba(244, 63, 94, 0.1);
5602
+ border: 1px solid var(--rose);
5603
+ border-radius: var(--radius-md);
5604
+ padding: 0.75rem 1rem;
5605
+ color: var(--rose);
5606
+ }
5607
+ .approval-gate-info {
5608
+ display: flex;
5609
+ align-items: center;
5610
+ gap: 0.5rem;
5611
+ background: var(--bg-foam);
5612
+ border: 1px solid var(--border);
5613
+ border-radius: var(--radius-md);
5614
+ padding: 0.5rem 0.75rem;
5615
+ font-size: 0.85rem;
5616
+ color: var(--text-muted);
5617
+ }
5618
+
5619
+ /* ── Audit Log ────────────────────────────────── */
5620
+ .audit-list {
5621
+ display: flex;
5622
+ flex-direction: column;
5623
+ gap: 0.25rem;
5624
+ }
5625
+ .audit-entry {
5626
+ display: flex;
5627
+ align-items: center;
5628
+ gap: 0.75rem;
5629
+ padding: 0.375rem 0.5rem;
5630
+ border-radius: var(--radius-sm);
5631
+ font-size: 0.85rem;
5632
+ border-bottom: 1px solid var(--border);
5633
+ }
5634
+ .audit-ts {
5635
+ color: var(--text-muted);
5636
+ font-size: 0.75rem;
5637
+ white-space: nowrap;
5638
+ min-width: 120px;
5639
+ }
5640
+ .audit-action {
5641
+ font-weight: 600;
5642
+ color: var(--cyan);
5643
+ min-width: 150px;
5644
+ }
5645
+ .audit-details {
5646
+ color: var(--text-muted);
5647
+ font-size: 0.8rem;
5648
+ overflow: hidden;
5649
+ text-overflow: ellipsis;
5650
+ white-space: nowrap;
5651
+ }
5652
+
5653
+ /* ── Webhook Config ───────────────────────────── */
5654
+ .webhook-item {
5655
+ display: flex;
5656
+ align-items: center;
5657
+ gap: 0.75rem;
5658
+ padding: 0.5rem 0.75rem;
5659
+ border: 1px solid var(--border);
5660
+ border-radius: var(--radius-sm);
5661
+ margin-bottom: 0.25rem;
5662
+ font-size: 0.85rem;
5663
+ }
5664
+ .webhook-label {
5665
+ font-weight: 600;
5666
+ min-width: 80px;
5667
+ }
5668
+ .webhook-url {
5669
+ flex: 1;
5670
+ color: var(--text-muted);
5671
+ overflow: hidden;
5672
+ text-overflow: ellipsis;
5673
+ white-space: nowrap;
5674
+ font-family: var(--font-mono);
5675
+ font-size: 0.75rem;
5676
+ }
5677
+ .webhook-events {
5678
+ color: var(--text-muted);
5679
+ font-size: 0.75rem;
5680
+ }
5681
+ .btn-danger {
5682
+ background: var(--rose);
5683
+ color: white;
5684
+ border: none;
5685
+ padding: 0.25rem 0.5rem;
5686
+ border-radius: var(--radius-sm);
5687
+ cursor: pointer;
5688
+ font-size: 0.75rem;
5689
+ }
5690
+
5691
+ /* ── Theme Toggle ─────────────────────────────── */
5692
+ .theme-toggle {
5693
+ background: transparent;
5694
+ border: 1px solid var(--card-border);
5695
+ color: var(--text-secondary);
5696
+ padding: 4px 10px;
5697
+ border-radius: var(--radius-full);
5698
+ cursor: pointer;
5699
+ font-size: 0.75rem;
5700
+ font-family: var(--font-body);
5701
+ transition: all var(--transition-fast);
5702
+ white-space: nowrap;
5703
+ }
5704
+ .theme-toggle:hover {
5705
+ color: var(--cyan);
5706
+ border-color: var(--cyan);
5707
+ }
5708
+
5709
+ /* ── Integrations ─────────────────────────────── */
5710
+ .integrations-grid {
5711
+ display: grid;
5712
+ grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
5713
+ gap: 0.75rem;
5714
+ }
5715
+ .integration-card {
5716
+ background: var(--card-bg);
5717
+ border: 1px solid var(--card-border);
5718
+ border-radius: var(--radius-md);
5719
+ padding: 1rem;
5720
+ }
5721
+ .integration-card.integration-active {
5722
+ border-color: var(--green);
5723
+ }
5724
+ .integration-card.integration-inactive {
5725
+ border-color: var(--text-muted);
5726
+ opacity: 0.7;
5727
+ }
5728
+ .integration-name {
5729
+ display: flex;
5730
+ align-items: center;
5731
+ gap: 0.5rem;
5732
+ font-weight: 600;
5733
+ font-size: 0.9rem;
5734
+ margin-bottom: 0.25rem;
5735
+ }
5736
+ .integration-status {
5737
+ font-size: 0.8rem;
5738
+ color: var(--text-muted);
5739
+ }
5740
+ .integration-detail {
5741
+ font-size: 0.75rem;
5742
+ color: var(--text-muted);
5743
+ margin-top: 0.25rem;
5744
+ }
5745
+
5746
+ /* ── Admin Debug Panel ────────────────────────── */
5747
+ .admin-debug-output {
5748
+ max-height: 400px;
5749
+ overflow: auto;
5750
+ }
5751
+ .admin-debug-pre {
5752
+ background: var(--bg-deep);
5753
+ border: 1px solid var(--card-border);
5754
+ border-radius: var(--radius-md);
5755
+ padding: 1rem;
5756
+ font-family: var(--font-mono);
5757
+ font-size: 0.75rem;
5758
+ white-space: pre-wrap;
5759
+ word-break: break-all;
5760
+ max-height: 380px;
5761
+ overflow: auto;
5762
+ }
5763
+
5764
+ /* ── Claim Panel ──────────────────────────────── */
5765
+ .claim-panel {
5766
+ margin-bottom: 2rem;
5767
+ }
5768
+
5769
+ /* ── Error Boundary ───────────────────────────── */
5770
+ .tab-error-boundary {
5771
+ margin-bottom: 1rem;
5772
+ }
5773
+ .error-boundary-content {
5774
+ display: flex;
5775
+ align-items: flex-start;
5776
+ gap: 0.75rem;
5777
+ background: rgba(244, 63, 94, 0.08);
5778
+ border: 1px solid var(--rose);
5779
+ border-radius: var(--radius-md);
5780
+ padding: 1rem;
5781
+ }
5782
+ .error-boundary-icon {
5783
+ font-size: 1.5rem;
5784
+ flex-shrink: 0;
5785
+ }
5786
+ .error-boundary-msg {
5787
+ margin-top: 0.25rem;
5788
+ font-family: var(--font-mono);
5789
+ font-size: 0.75rem;
5790
+ color: var(--rose);
5791
+ white-space: pre-wrap;
5792
+ word-break: break-all;
5793
+ }
5794
+ .error-boundary-retry {
5795
+ margin-left: auto;
5796
+ flex-shrink: 0;
5797
+ }
5798
+
5799
+ /* ── Offline / Stale Data Banners ─────────────── */
5800
+ .offline-banner {
5801
+ display: flex;
5802
+ align-items: center;
5803
+ gap: 0.75rem;
5804
+ background: rgba(244, 63, 94, 0.1);
5805
+ border: 1px solid var(--rose);
5806
+ border-radius: var(--radius-md);
5807
+ padding: 0.75rem 1rem;
5808
+ margin-bottom: 1rem;
5809
+ font-size: 0.9rem;
5810
+ color: var(--rose);
5811
+ }
5812
+ .offline-icon {
5813
+ font-size: 1.25rem;
5814
+ }
5815
+ .stale-data-banner {
5816
+ display: flex;
5817
+ align-items: center;
5818
+ gap: 0.5rem;
5819
+ background: rgba(251, 191, 36, 0.08);
5820
+ border: 1px solid var(--amber);
5821
+ border-radius: var(--radius-md);
5822
+ padding: 0.5rem 1rem;
5823
+ margin-bottom: 0.75rem;
5824
+ font-size: 0.8rem;
5825
+ color: var(--amber);
5826
+ }
5827
+ .stale-icon {
5828
+ font-size: 1rem;
5829
+ }