@alisio/plugin-swarm 0.0.0-stage → 0.1.1

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 (266) hide show
  1. package/.agents/agents/swarm-architect.md +20 -0
  2. package/.agents/agents/swarm-cleaner.md +20 -0
  3. package/.agents/agents/swarm-coder.md +20 -0
  4. package/.agents/agents/swarm-hardener.md +20 -0
  5. package/.agents/agents/swarm-lieutenant.md +20 -0
  6. package/.agents/agents/swarm-qa.md +20 -0
  7. package/.agents/agents/swarm-refactorer.md +20 -0
  8. package/.agents/agents/swarm-specifier.md +20 -0
  9. package/.agents/skills/swarm-architecture-rules/SKILL.md +43 -0
  10. package/.agents/skills/swarm-clarification/SKILL.md +42 -0
  11. package/.agents/skills/swarm-cleaner-metrics/SKILL.md +44 -0
  12. package/.agents/skills/swarm-engineering-constitution/SKILL.md +44 -0
  13. package/.agents/skills/swarm-gherkin-spec/SKILL.md +43 -0
  14. package/.agents/skills/swarm-handoff-protocol/SKILL.md +45 -0
  15. package/.agents/skills/swarm-lieutenant/SKILL.md +41 -0
  16. package/.agents/skills/swarm-mutation-hardening/SKILL.md +43 -0
  17. package/.agents/skills/swarm-qa-acceptance/SKILL.md +42 -0
  18. package/.agents/skills/swarm-tdd-slice/SKILL.md +44 -0
  19. package/.agents/skills/swarm-toolchain-profile/SKILL.md +41 -0
  20. package/LICENSE +21 -0
  21. package/README.es.md +337 -0
  22. package/README.md +322 -2
  23. package/assets/approval-flow.svg +1 -0
  24. package/assets/architecture.svg +1 -0
  25. package/assets/audit-states.svg +1 -0
  26. package/assets/dashboard.css +964 -0
  27. package/assets/dashboard.html +123 -0
  28. package/assets/dashboard.js +965 -0
  29. package/assets/dashboard.svg +1 -0
  30. package/assets/handoff-sequence.svg +1 -0
  31. package/assets/pack-pipelines.svg +1 -0
  32. package/assets/packs/four-pack/pack.json +18 -0
  33. package/assets/packs/six-pack/pack.json +22 -0
  34. package/assets/packs/two-pack/pack.json +14 -0
  35. package/assets/screenshots/dashboard-board-dark.png +0 -0
  36. package/assets/screenshots/dashboard-board-light.png +0 -0
  37. package/assets/screenshots/dashboard-documents-diff.png +0 -0
  38. package/assets/screenshots/dashboard-empty-state.png +0 -0
  39. package/assets/screenshots/dashboard-phone.png +0 -0
  40. package/assets/screenshots/dashboard-reject-dialog.png +0 -0
  41. package/assets/screenshots/dashboard-transcript-tail.png +0 -0
  42. package/assets/screenshots/dashboard-work-queue.png +0 -0
  43. package/assets/task-states.svg +1 -0
  44. package/assets/toolchains/node-ts.json +61 -0
  45. package/cover.svg +46 -0
  46. package/dist/adapters/child-session-runner.d.ts +36 -0
  47. package/dist/adapters/child-session-runner.d.ts.map +1 -0
  48. package/dist/adapters/child-session-runner.js +156 -0
  49. package/dist/adapters/child-session-runner.js.map +1 -0
  50. package/dist/adapters/fs-board-store.d.ts +11 -0
  51. package/dist/adapters/fs-board-store.d.ts.map +1 -0
  52. package/dist/adapters/fs-board-store.js +27 -0
  53. package/dist/adapters/fs-board-store.js.map +1 -0
  54. package/dist/adapters/fs-handoff-store.d.ts +36 -0
  55. package/dist/adapters/fs-handoff-store.d.ts.map +1 -0
  56. package/dist/adapters/fs-handoff-store.js +254 -0
  57. package/dist/adapters/fs-handoff-store.js.map +1 -0
  58. package/dist/adapters/fs-task-state-store.d.ts +16 -0
  59. package/dist/adapters/fs-task-state-store.d.ts.map +1 -0
  60. package/dist/adapters/fs-task-state-store.js +66 -0
  61. package/dist/adapters/fs-task-state-store.js.map +1 -0
  62. package/dist/adapters/git-worktree.d.ts +31 -0
  63. package/dist/adapters/git-worktree.d.ts.map +1 -0
  64. package/dist/adapters/git-worktree.js +209 -0
  65. package/dist/adapters/git-worktree.js.map +1 -0
  66. package/dist/adapters/process-exec.d.ts +36 -0
  67. package/dist/adapters/process-exec.d.ts.map +1 -0
  68. package/dist/adapters/process-exec.js +138 -0
  69. package/dist/adapters/process-exec.js.map +1 -0
  70. package/dist/adapters/process-gate-runner.d.ts +39 -0
  71. package/dist/adapters/process-gate-runner.d.ts.map +1 -0
  72. package/dist/adapters/process-gate-runner.js +242 -0
  73. package/dist/adapters/process-gate-runner.js.map +1 -0
  74. package/dist/adapters/unavailable-runner.d.ts +4 -0
  75. package/dist/adapters/unavailable-runner.d.ts.map +1 -0
  76. package/dist/adapters/unavailable-runner.js +12 -0
  77. package/dist/adapters/unavailable-runner.js.map +1 -0
  78. package/dist/app/audit.d.ts +23 -0
  79. package/dist/app/audit.d.ts.map +1 -0
  80. package/dist/app/audit.js +9 -0
  81. package/dist/app/audit.js.map +1 -0
  82. package/dist/app/budget.d.ts +29 -0
  83. package/dist/app/budget.d.ts.map +1 -0
  84. package/dist/app/budget.js +78 -0
  85. package/dist/app/budget.js.map +1 -0
  86. package/dist/app/chat-store.d.ts +18 -0
  87. package/dist/app/chat-store.d.ts.map +1 -0
  88. package/dist/app/chat-store.js +48 -0
  89. package/dist/app/chat-store.js.map +1 -0
  90. package/dist/app/documents.d.ts +33 -0
  91. package/dist/app/documents.d.ts.map +1 -0
  92. package/dist/app/documents.js +63 -0
  93. package/dist/app/documents.js.map +1 -0
  94. package/dist/app/forge.d.ts +106 -0
  95. package/dist/app/forge.d.ts.map +1 -0
  96. package/dist/app/forge.js +420 -0
  97. package/dist/app/forge.js.map +1 -0
  98. package/dist/app/operator.d.ts +46 -0
  99. package/dist/app/operator.d.ts.map +1 -0
  100. package/dist/app/operator.js +168 -0
  101. package/dist/app/operator.js.map +1 -0
  102. package/dist/app/pidfile.d.ts +18 -0
  103. package/dist/app/pidfile.d.ts.map +1 -0
  104. package/dist/app/pidfile.js +56 -0
  105. package/dist/app/pidfile.js.map +1 -0
  106. package/dist/app/project.d.ts +93 -0
  107. package/dist/app/project.d.ts.map +1 -0
  108. package/dist/app/project.js +291 -0
  109. package/dist/app/project.js.map +1 -0
  110. package/dist/app/prompts.d.ts +48 -0
  111. package/dist/app/prompts.d.ts.map +1 -0
  112. package/dist/app/prompts.js +88 -0
  113. package/dist/app/prompts.js.map +1 -0
  114. package/dist/app/pump.d.ts +144 -0
  115. package/dist/app/pump.d.ts.map +1 -0
  116. package/dist/app/pump.js +707 -0
  117. package/dist/app/pump.js.map +1 -0
  118. package/dist/app/services.d.ts +112 -0
  119. package/dist/app/services.d.ts.map +1 -0
  120. package/dist/app/services.js +323 -0
  121. package/dist/app/services.js.map +1 -0
  122. package/dist/app/state.d.ts +70 -0
  123. package/dist/app/state.d.ts.map +1 -0
  124. package/dist/app/state.js +96 -0
  125. package/dist/app/state.js.map +1 -0
  126. package/dist/args.d.ts +10 -0
  127. package/dist/args.d.ts.map +1 -0
  128. package/dist/args.js +33 -0
  129. package/dist/args.js.map +1 -0
  130. package/dist/coordinator.d.ts +80 -0
  131. package/dist/coordinator.d.ts.map +1 -0
  132. package/dist/coordinator.js +481 -0
  133. package/dist/coordinator.js.map +1 -0
  134. package/dist/dashboard/api.d.ts +28 -0
  135. package/dist/dashboard/api.d.ts.map +1 -0
  136. package/dist/dashboard/api.js +178 -0
  137. package/dist/dashboard/api.js.map +1 -0
  138. package/dist/dashboard/auth.d.ts +13 -0
  139. package/dist/dashboard/auth.d.ts.map +1 -0
  140. package/dist/dashboard/auth.js +36 -0
  141. package/dist/dashboard/auth.js.map +1 -0
  142. package/dist/dashboard/open.d.ts +7 -0
  143. package/dist/dashboard/open.d.ts.map +1 -0
  144. package/dist/dashboard/open.js +17 -0
  145. package/dist/dashboard/open.js.map +1 -0
  146. package/dist/dashboard/server.d.ts +28 -0
  147. package/dist/dashboard/server.d.ts.map +1 -0
  148. package/dist/dashboard/server.js +176 -0
  149. package/dist/dashboard/server.js.map +1 -0
  150. package/dist/doctor.d.ts +28 -0
  151. package/dist/doctor.d.ts.map +1 -0
  152. package/dist/doctor.js +108 -0
  153. package/dist/doctor.js.map +1 -0
  154. package/dist/domain/attention.d.ts +20 -0
  155. package/dist/domain/attention.d.ts.map +1 -0
  156. package/dist/domain/attention.js +41 -0
  157. package/dist/domain/attention.js.map +1 -0
  158. package/dist/domain/envelope.d.ts +37 -0
  159. package/dist/domain/envelope.d.ts.map +1 -0
  160. package/dist/domain/envelope.js +106 -0
  161. package/dist/domain/envelope.js.map +1 -0
  162. package/dist/domain/handoff.d.ts +57 -0
  163. package/dist/domain/handoff.d.ts.map +1 -0
  164. package/dist/domain/handoff.js +191 -0
  165. package/dist/domain/handoff.js.map +1 -0
  166. package/dist/domain/identifiers.d.ts +18 -0
  167. package/dist/domain/identifiers.d.ts.map +1 -0
  168. package/dist/domain/identifiers.js +70 -0
  169. package/dist/domain/identifiers.js.map +1 -0
  170. package/dist/domain/pack.d.ts +45 -0
  171. package/dist/domain/pack.d.ts.map +1 -0
  172. package/dist/domain/pack.js +207 -0
  173. package/dist/domain/pack.js.map +1 -0
  174. package/dist/domain/pipeline.d.ts +33 -0
  175. package/dist/domain/pipeline.d.ts.map +1 -0
  176. package/dist/domain/pipeline.js +50 -0
  177. package/dist/domain/pipeline.js.map +1 -0
  178. package/dist/domain/task.d.ts +26 -0
  179. package/dist/domain/task.d.ts.map +1 -0
  180. package/dist/domain/task.js +154 -0
  181. package/dist/domain/task.js.map +1 -0
  182. package/dist/domain/taskstate.d.ts +37 -0
  183. package/dist/domain/taskstate.d.ts.map +1 -0
  184. package/dist/domain/taskstate.js +98 -0
  185. package/dist/domain/taskstate.js.map +1 -0
  186. package/dist/gates/dry.d.ts +14 -0
  187. package/dist/gates/dry.d.ts.map +1 -0
  188. package/dist/gates/dry.js +71 -0
  189. package/dist/gates/dry.js.map +1 -0
  190. package/dist/gates/parsers.d.ts +34 -0
  191. package/dist/gates/parsers.d.ts.map +1 -0
  192. package/dist/gates/parsers.js +120 -0
  193. package/dist/gates/parsers.js.map +1 -0
  194. package/dist/index.d.ts +45 -0
  195. package/dist/index.d.ts.map +1 -0
  196. package/dist/index.js +207 -0
  197. package/dist/index.js.map +1 -0
  198. package/dist/options.d.ts +13 -0
  199. package/dist/options.d.ts.map +1 -0
  200. package/dist/options.js +27 -0
  201. package/dist/options.js.map +1 -0
  202. package/dist/panel.d.ts +5 -0
  203. package/dist/panel.d.ts.map +1 -0
  204. package/dist/panel.js +52 -0
  205. package/dist/panel.js.map +1 -0
  206. package/dist/ports/agent-runner.d.ts +51 -0
  207. package/dist/ports/agent-runner.d.ts.map +1 -0
  208. package/dist/ports/agent-runner.js +2 -0
  209. package/dist/ports/agent-runner.js.map +1 -0
  210. package/dist/ports/board-store.d.ts +7 -0
  211. package/dist/ports/board-store.d.ts.map +1 -0
  212. package/dist/ports/board-store.js +2 -0
  213. package/dist/ports/board-store.js.map +1 -0
  214. package/dist/ports/clock.d.ts +5 -0
  215. package/dist/ports/clock.d.ts.map +1 -0
  216. package/dist/ports/clock.js +2 -0
  217. package/dist/ports/clock.js.map +1 -0
  218. package/dist/ports/gate-runner.d.ts +34 -0
  219. package/dist/ports/gate-runner.d.ts.map +1 -0
  220. package/dist/ports/gate-runner.js +2 -0
  221. package/dist/ports/gate-runner.js.map +1 -0
  222. package/dist/ports/handoff-store.d.ts +39 -0
  223. package/dist/ports/handoff-store.d.ts.map +1 -0
  224. package/dist/ports/handoff-store.js +2 -0
  225. package/dist/ports/handoff-store.js.map +1 -0
  226. package/dist/ports/isolation.d.ts +43 -0
  227. package/dist/ports/isolation.d.ts.map +1 -0
  228. package/dist/ports/isolation.js +2 -0
  229. package/dist/ports/isolation.js.map +1 -0
  230. package/dist/ports/notifier.d.ts +28 -0
  231. package/dist/ports/notifier.d.ts.map +1 -0
  232. package/dist/ports/notifier.js +2 -0
  233. package/dist/ports/notifier.js.map +1 -0
  234. package/dist/ports/task-state-store.d.ts +10 -0
  235. package/dist/ports/task-state-store.d.ts.map +1 -0
  236. package/dist/ports/task-state-store.js +2 -0
  237. package/dist/ports/task-state-store.js.map +1 -0
  238. package/dist/refs.d.ts +10 -0
  239. package/dist/refs.d.ts.map +1 -0
  240. package/dist/refs.js +19 -0
  241. package/dist/refs.js.map +1 -0
  242. package/dist/resources.d.ts +55 -0
  243. package/dist/resources.d.ts.map +1 -0
  244. package/dist/resources.js +255 -0
  245. package/dist/resources.js.map +1 -0
  246. package/dist/status.d.ts +18 -0
  247. package/dist/status.d.ts.map +1 -0
  248. package/dist/status.js +60 -0
  249. package/dist/status.js.map +1 -0
  250. package/dist/storage.d.ts +18 -0
  251. package/dist/storage.d.ts.map +1 -0
  252. package/dist/storage.js +79 -0
  253. package/dist/storage.js.map +1 -0
  254. package/dist/toolchains/profile.d.ts +21 -0
  255. package/dist/toolchains/profile.d.ts.map +1 -0
  256. package/dist/toolchains/profile.js +60 -0
  257. package/dist/toolchains/profile.js.map +1 -0
  258. package/dist/toolchains/thresholds.d.ts +29 -0
  259. package/dist/toolchains/thresholds.d.ts.map +1 -0
  260. package/dist/toolchains/thresholds.js +45 -0
  261. package/dist/toolchains/thresholds.js.map +1 -0
  262. package/dist/version.d.ts +2 -0
  263. package/dist/version.d.ts.map +1 -0
  264. package/dist/version.js +3 -0
  265. package/dist/version.js.map +1 -0
  266. package/package.json +51 -3
@@ -0,0 +1,964 @@
1
+ /*
2
+ * Swarm dashboard styles. Tokens are aligned with the Alisio web app design tokens (palette, font
3
+ * stack, radii, focus ring, light/dark behaviour) under our own --swarm-* names. Light is the base;
4
+ * prefers-color-scheme switches to dark unless data-theme="light" is set, and data-theme="dark"
5
+ * forces dark. The body always has an explicit background.
6
+ */
7
+ :root {
8
+ color-scheme: light dark;
9
+ --swarm-bg: #f6f8f8;
10
+ --swarm-surface: #eef2f2;
11
+ --swarm-panel: #ffffff;
12
+ --swarm-raised: #ffffff;
13
+ --swarm-hover: #e6ecec;
14
+ --swarm-border: #d6dfe0;
15
+ --swarm-border-strong: #bccbcd;
16
+ --swarm-text: #172125;
17
+ --swarm-muted: #56646b;
18
+ --swarm-accent: #0a7768;
19
+ --swarm-accent-strong: #075e52;
20
+ --swarm-accent-soft: rgb(10 119 104 / 10%);
21
+ --swarm-accent-contrast: #ffffff;
22
+ --swarm-danger: #b92f39;
23
+ --swarm-danger-soft: rgb(185 47 57 / 9%);
24
+ --swarm-warn: #8a5f00;
25
+ --swarm-warn-soft: rgb(138 95 0 / 11%);
26
+ --swarm-ok: #2b7a3d;
27
+ --swarm-code-bg: #f1f5f5;
28
+ --swarm-control-border: color-mix(in srgb, var(--swarm-muted) 75%, var(--swarm-panel));
29
+ --swarm-shadow: 0 12px 32px rgb(20 40 45 / 16%);
30
+ --swarm-focus: 0 0 0 2px var(--swarm-bg), 0 0 0 4px var(--swarm-accent);
31
+ --swarm-radius-sm: 6px;
32
+ --swarm-radius: 10px;
33
+ --swarm-space-1: 4px;
34
+ --swarm-space-2: 8px;
35
+ --swarm-space-3: 12px;
36
+ --swarm-space-4: 16px;
37
+ --swarm-space-5: 24px;
38
+ --swarm-sans: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
39
+ --swarm-mono: ui-monospace, "SF Mono", "JetBrains Mono", "Cascadia Code", Menlo, Consolas, monospace;
40
+ --swarm-rail-width: 340px;
41
+ --swarm-queue-height: 52%;
42
+ }
43
+
44
+ :root[data-theme="dark"] {
45
+ color-scheme: dark;
46
+ --swarm-bg: #0f1417;
47
+ --swarm-surface: #13191d;
48
+ --swarm-panel: #182025;
49
+ --swarm-raised: #1e272d;
50
+ --swarm-hover: #222c33;
51
+ --swarm-border: #283239;
52
+ --swarm-border-strong: #35424a;
53
+ --swarm-text: #e3e9ec;
54
+ --swarm-muted: #93a0a8;
55
+ --swarm-accent: #4cc2b1;
56
+ --swarm-accent-strong: #7ad8ca;
57
+ --swarm-accent-soft: rgb(76 194 177 / 14%);
58
+ --swarm-accent-contrast: #062b26;
59
+ --swarm-danger: #f07a7f;
60
+ --swarm-danger-soft: rgb(240 122 127 / 14%);
61
+ --swarm-warn: #e3b55c;
62
+ --swarm-warn-soft: rgb(227 181 92 / 14%);
63
+ --swarm-ok: #7ccf8e;
64
+ --swarm-code-bg: #121a1e;
65
+ --swarm-shadow: 0 12px 32px rgb(0 0 0 / 45%);
66
+ }
67
+
68
+ @media (prefers-color-scheme: dark) {
69
+ :root:not([data-theme="light"]) {
70
+ color-scheme: dark;
71
+ --swarm-bg: #0f1417;
72
+ --swarm-surface: #13191d;
73
+ --swarm-panel: #182025;
74
+ --swarm-raised: #1e272d;
75
+ --swarm-hover: #222c33;
76
+ --swarm-border: #283239;
77
+ --swarm-border-strong: #35424a;
78
+ --swarm-text: #e3e9ec;
79
+ --swarm-muted: #93a0a8;
80
+ --swarm-accent: #4cc2b1;
81
+ --swarm-accent-strong: #7ad8ca;
82
+ --swarm-accent-soft: rgb(76 194 177 / 14%);
83
+ --swarm-accent-contrast: #062b26;
84
+ --swarm-danger: #f07a7f;
85
+ --swarm-danger-soft: rgb(240 122 127 / 14%);
86
+ --swarm-warn: #e3b55c;
87
+ --swarm-warn-soft: rgb(227 181 92 / 14%);
88
+ --swarm-ok: #7ccf8e;
89
+ --swarm-code-bg: #121a1e;
90
+ --swarm-shadow: 0 12px 32px rgb(0 0 0 / 45%);
91
+ }
92
+ }
93
+
94
+ *,
95
+ *::before,
96
+ *::after {
97
+ box-sizing: border-box;
98
+ }
99
+
100
+ html,
101
+ body {
102
+ margin: 0;
103
+ height: 100%;
104
+ }
105
+
106
+ body {
107
+ display: flex;
108
+ flex-direction: column;
109
+ background: var(--swarm-bg);
110
+ color: var(--swarm-text);
111
+ font: 14px / 1.5 var(--swarm-sans);
112
+ -webkit-font-smoothing: antialiased;
113
+ }
114
+
115
+ h1,
116
+ h2,
117
+ h3,
118
+ h4 {
119
+ margin: 0;
120
+ }
121
+
122
+ a {
123
+ color: var(--swarm-accent);
124
+ }
125
+
126
+ button,
127
+ input,
128
+ textarea,
129
+ select {
130
+ font: inherit;
131
+ color: inherit;
132
+ }
133
+
134
+ button {
135
+ cursor: pointer;
136
+ }
137
+
138
+ :focus-visible {
139
+ outline: none;
140
+ box-shadow: var(--swarm-focus);
141
+ border-radius: var(--swarm-radius-sm);
142
+ }
143
+
144
+ code,
145
+ pre {
146
+ font-family: var(--swarm-mono);
147
+ font-size: 0.875em;
148
+ }
149
+
150
+ [hidden] {
151
+ display: none !important;
152
+ }
153
+
154
+ .sr-only {
155
+ position: absolute;
156
+ width: 1px;
157
+ height: 1px;
158
+ margin: -1px;
159
+ overflow: hidden;
160
+ clip: rect(0 0 0 0);
161
+ white-space: nowrap;
162
+ }
163
+
164
+ .skip {
165
+ position: absolute;
166
+ left: 8px;
167
+ top: -40px;
168
+ z-index: 100;
169
+ padding: 6px 10px;
170
+ background: var(--swarm-accent);
171
+ color: var(--swarm-accent-contrast);
172
+ border-radius: var(--swarm-radius-sm);
173
+ }
174
+
175
+ .skip:focus {
176
+ top: 8px;
177
+ }
178
+
179
+ /* top bar and filters */
180
+ .topbar {
181
+ display: flex;
182
+ align-items: center;
183
+ flex-wrap: wrap;
184
+ gap: var(--swarm-space-2) var(--swarm-space-3);
185
+ padding: var(--swarm-space-3) var(--swarm-space-4);
186
+ background: var(--swarm-surface);
187
+ border-bottom: 1px solid var(--swarm-border);
188
+ }
189
+
190
+ .topbar h1 {
191
+ font-size: 16px;
192
+ }
193
+
194
+ .spacer {
195
+ flex: 1;
196
+ }
197
+
198
+ .chip {
199
+ display: inline-flex;
200
+ align-items: center;
201
+ gap: 6px;
202
+ color: var(--swarm-muted);
203
+ }
204
+
205
+ .chip.strong {
206
+ padding: 1px 10px;
207
+ border-radius: 999px;
208
+ color: var(--swarm-text);
209
+ background: var(--swarm-warn-soft);
210
+ border: 1px solid var(--swarm-warn);
211
+ font-weight: 600;
212
+ }
213
+
214
+ .chime {
215
+ display: inline-flex;
216
+ gap: 4px;
217
+ align-items: center;
218
+ color: var(--swarm-muted);
219
+ }
220
+
221
+ .filters {
222
+ display: flex;
223
+ flex-wrap: wrap;
224
+ align-items: center;
225
+ gap: var(--swarm-space-2) var(--swarm-space-4);
226
+ padding: var(--swarm-space-2) var(--swarm-space-4);
227
+ background: var(--swarm-bg);
228
+ border-bottom: 1px solid var(--swarm-border);
229
+ color: var(--swarm-muted);
230
+ }
231
+
232
+ .filters select {
233
+ background: var(--swarm-panel);
234
+ color: var(--swarm-text);
235
+ border: 1px solid var(--swarm-control-border);
236
+ border-radius: var(--swarm-radius-sm);
237
+ padding: 2px 6px;
238
+ }
239
+
240
+ .btn {
241
+ padding: 4px 12px;
242
+ border: 1px solid var(--swarm-control-border);
243
+ border-radius: var(--swarm-radius-sm);
244
+ background: var(--swarm-panel);
245
+ color: var(--swarm-text);
246
+ }
247
+
248
+ .btn:hover:not(:disabled) {
249
+ background: var(--swarm-hover);
250
+ }
251
+
252
+ .btn:disabled {
253
+ opacity: 0.6;
254
+ cursor: not-allowed;
255
+ text-decoration: line-through;
256
+ }
257
+
258
+ .btn.primary {
259
+ background: var(--swarm-accent);
260
+ border-color: var(--swarm-accent);
261
+ color: var(--swarm-accent-contrast);
262
+ }
263
+
264
+ .btn.primary:hover:not(:disabled) {
265
+ background: var(--swarm-accent-strong);
266
+ }
267
+
268
+ .btn.danger {
269
+ border-color: var(--swarm-danger);
270
+ color: var(--swarm-danger);
271
+ }
272
+
273
+ .btn[aria-pressed="true"] {
274
+ background: var(--swarm-accent-soft);
275
+ border-color: var(--swarm-accent);
276
+ }
277
+
278
+ .btn.small {
279
+ padding: 1px 8px;
280
+ font-size: 12px;
281
+ }
282
+
283
+ /* status dots: shape plus a text label carry the state; colour only reinforces it */
284
+ .dot {
285
+ display: inline-block;
286
+ width: 10px;
287
+ height: 10px;
288
+ border-radius: 50%;
289
+ flex: none;
290
+ }
291
+
292
+ .dot.live {
293
+ background: var(--swarm-ok);
294
+ }
295
+
296
+ .dot.idle {
297
+ background: var(--swarm-panel);
298
+ border: 3px solid var(--swarm-warn);
299
+ }
300
+
301
+ .dot.none {
302
+ height: 3px;
303
+ border-radius: 2px;
304
+ background: var(--swarm-muted);
305
+ }
306
+
307
+ /* attention strip */
308
+ .attention {
309
+ display: flex;
310
+ gap: var(--swarm-space-3);
311
+ align-items: flex-start;
312
+ padding: var(--swarm-space-2) var(--swarm-space-4) var(--swarm-space-3);
313
+ background: var(--swarm-warn-soft);
314
+ border-bottom: 1px solid var(--swarm-border-strong);
315
+ }
316
+
317
+ .attention h2 {
318
+ padding-top: 8px;
319
+ font-size: 11px;
320
+ letter-spacing: 0.08em;
321
+ text-transform: uppercase;
322
+ color: var(--swarm-text);
323
+ }
324
+
325
+ .attention ul {
326
+ flex: 1;
327
+ margin: 0;
328
+ padding: 0;
329
+ list-style: none;
330
+ display: grid;
331
+ gap: 6px;
332
+ }
333
+
334
+ .attention li {
335
+ display: flex;
336
+ flex-wrap: wrap;
337
+ align-items: center;
338
+ gap: 6px 8px;
339
+ padding: 5px 10px;
340
+ background: var(--swarm-panel);
341
+ border: 1px solid var(--swarm-border);
342
+ border-radius: var(--swarm-radius-sm);
343
+ }
344
+
345
+ .tag {
346
+ padding: 0 8px;
347
+ font-size: 11px;
348
+ font-weight: 700;
349
+ border-radius: 999px;
350
+ border: 1px solid var(--swarm-warn);
351
+ background: var(--swarm-warn-soft);
352
+ color: var(--swarm-warn);
353
+ }
354
+
355
+ .tag::before {
356
+ content: "! ";
357
+ }
358
+
359
+ .tag[data-kind="blocked"],
360
+ .tag[data-kind="gate-failed"] {
361
+ border-color: var(--swarm-danger);
362
+ background: var(--swarm-danger-soft);
363
+ color: var(--swarm-danger);
364
+ }
365
+
366
+ .linkish {
367
+ padding: 0;
368
+ border: 0;
369
+ background: none;
370
+ font-weight: 600;
371
+ color: var(--swarm-text);
372
+ text-decoration: underline;
373
+ }
374
+
375
+ a.linkish,
376
+ .card-name {
377
+ color: var(--swarm-text);
378
+ }
379
+
380
+ .detail {
381
+ flex-basis: 100%;
382
+ margin: 0;
383
+ color: var(--swarm-muted);
384
+ white-space: pre-wrap;
385
+ overflow-wrap: anywhere;
386
+ }
387
+
388
+ .notice {
389
+ margin: 0;
390
+ padding: 6px var(--swarm-space-4);
391
+ background: var(--swarm-danger-soft);
392
+ color: var(--swarm-danger);
393
+ border-bottom: 1px solid var(--swarm-danger);
394
+ overflow-wrap: anywhere;
395
+ }
396
+
397
+ /* layout */
398
+ .layout {
399
+ flex: 1;
400
+ min-height: 0;
401
+ display: grid;
402
+ grid-template-columns: minmax(0, 1fr) 6px var(--swarm-rail-width);
403
+ }
404
+
405
+ .board {
406
+ min-width: 0;
407
+ overflow: auto;
408
+ padding: var(--swarm-space-3) var(--swarm-space-4) var(--swarm-space-5);
409
+ }
410
+
411
+ .empty-state {
412
+ padding: var(--swarm-space-5) 4px;
413
+ color: var(--swarm-muted);
414
+ }
415
+
416
+ .empty-state p {
417
+ margin: 0 0 var(--swarm-space-2);
418
+ }
419
+
420
+ .band {
421
+ margin-bottom: var(--swarm-space-4);
422
+ padding-bottom: var(--swarm-space-4);
423
+ border-bottom: 2px solid var(--swarm-border);
424
+ }
425
+
426
+ .band-head {
427
+ display: flex;
428
+ align-items: center;
429
+ gap: var(--swarm-space-2);
430
+ margin-bottom: var(--swarm-space-2);
431
+ }
432
+
433
+ .band-head h3 {
434
+ flex: 1;
435
+ font-size: 15px;
436
+ }
437
+
438
+ .columns {
439
+ display: grid;
440
+ grid-auto-flow: column;
441
+ grid-auto-columns: minmax(150px, 1fr);
442
+ gap: var(--swarm-space-3);
443
+ overflow-x: auto;
444
+ padding-bottom: 4px;
445
+ }
446
+
447
+ .column h4 {
448
+ margin-bottom: 6px;
449
+ font-size: 11px;
450
+ letter-spacing: 0.08em;
451
+ color: var(--swarm-muted);
452
+ }
453
+
454
+ .dropzone {
455
+ display: grid;
456
+ gap: var(--swarm-space-2);
457
+ align-content: start;
458
+ min-height: 92px;
459
+ padding: var(--swarm-space-2);
460
+ border: 1px dashed var(--swarm-border-strong);
461
+ border-radius: var(--swarm-radius);
462
+ }
463
+
464
+ .card {
465
+ min-width: 0;
466
+ padding: 8px 10px;
467
+ background: var(--swarm-panel);
468
+ border: 1px solid var(--swarm-border);
469
+ border-radius: var(--swarm-radius-sm);
470
+ }
471
+
472
+ .card.merging {
473
+ border: 2px solid var(--swarm-accent);
474
+ background: var(--swarm-accent-soft);
475
+ }
476
+
477
+ .card[data-status="done"] .badge {
478
+ border-color: var(--swarm-ok);
479
+ color: var(--swarm-ok);
480
+ }
481
+
482
+ .card[data-status="waiting_approval"] .badge,
483
+ .card[data-status="clarifying"] .badge {
484
+ border-color: var(--swarm-warn);
485
+ color: var(--swarm-warn);
486
+ }
487
+
488
+ .card[data-status="blocked"] .badge,
489
+ .card[data-status="rejected"] .badge {
490
+ border-color: var(--swarm-danger);
491
+ color: var(--swarm-danger);
492
+ }
493
+
494
+ .linked {
495
+ box-shadow: var(--swarm-focus);
496
+ }
497
+
498
+ .card-head {
499
+ display: flex;
500
+ justify-content: space-between;
501
+ gap: 6px;
502
+ }
503
+
504
+ .card-name {
505
+ font-weight: 700;
506
+ overflow-wrap: anywhere;
507
+ }
508
+
509
+ .audits {
510
+ white-space: nowrap;
511
+ color: var(--swarm-muted);
512
+ }
513
+
514
+ .snippet {
515
+ display: -webkit-box;
516
+ margin: 3px 0 0;
517
+ overflow: hidden;
518
+ font-size: 12px;
519
+ line-height: 1.4;
520
+ color: var(--swarm-muted);
521
+ overflow-wrap: anywhere;
522
+ -webkit-line-clamp: 3;
523
+ line-clamp: 3;
524
+ -webkit-box-orient: vertical;
525
+ }
526
+
527
+ .card-foot {
528
+ display: flex;
529
+ align-items: center;
530
+ justify-content: space-between;
531
+ gap: 6px;
532
+ margin-top: 6px;
533
+ }
534
+
535
+ .badge {
536
+ padding: 0 6px;
537
+ font-size: 11px;
538
+ border: 1px solid var(--swarm-border-strong);
539
+ border-radius: 4px;
540
+ color: var(--swarm-text);
541
+ }
542
+
543
+ .card.merging .badge {
544
+ border-color: var(--swarm-accent);
545
+ color: var(--swarm-accent);
546
+ font-weight: 700;
547
+ }
548
+
549
+ /* rail */
550
+ .rail {
551
+ display: flex;
552
+ flex-direction: column;
553
+ min-width: 0;
554
+ min-height: 0;
555
+ background: var(--swarm-surface);
556
+ border-left: 1px solid var(--swarm-border);
557
+ }
558
+
559
+ .pane {
560
+ display: flex;
561
+ flex-direction: column;
562
+ min-height: 0;
563
+ padding: var(--swarm-space-3);
564
+ }
565
+
566
+ #queue-pane {
567
+ flex: 0 0 var(--swarm-queue-height);
568
+ overflow: auto;
569
+ }
570
+
571
+ #activity-pane {
572
+ flex: 1 1 0;
573
+ }
574
+
575
+ .pane-title {
576
+ margin-bottom: 6px;
577
+ font-size: 11px;
578
+ letter-spacing: 0.08em;
579
+ text-transform: uppercase;
580
+ color: var(--swarm-muted);
581
+ }
582
+
583
+ .queue {
584
+ overflow: auto;
585
+ }
586
+
587
+ .queue h3 {
588
+ margin: 8px 0 4px;
589
+ font-size: 12px;
590
+ }
591
+
592
+ .queue table {
593
+ width: 100%;
594
+ border-collapse: collapse;
595
+ background: var(--swarm-panel);
596
+ border: 1px solid var(--swarm-border);
597
+ }
598
+
599
+ .queue th {
600
+ padding: 3px 6px;
601
+ text-align: left;
602
+ font-size: 11px;
603
+ color: var(--swarm-muted);
604
+ border-bottom: 1px solid var(--swarm-border);
605
+ }
606
+
607
+ .queue td {
608
+ padding: 3px 6px;
609
+ vertical-align: middle;
610
+ border-bottom: 1px solid var(--swarm-border);
611
+ overflow-wrap: anywhere;
612
+ }
613
+
614
+ .queue td.age {
615
+ text-align: right;
616
+ white-space: nowrap;
617
+ color: var(--swarm-muted);
618
+ }
619
+
620
+ .role-cell {
621
+ display: flex;
622
+ align-items: flex-start;
623
+ gap: 6px;
624
+ }
625
+
626
+ .role-cell .dot {
627
+ margin-top: 6px;
628
+ }
629
+
630
+ .session {
631
+ display: flex;
632
+ align-items: center;
633
+ gap: 4px;
634
+ margin-top: 2px;
635
+ }
636
+
637
+ .session code {
638
+ max-width: 120px;
639
+ overflow: hidden;
640
+ text-overflow: ellipsis;
641
+ white-space: nowrap;
642
+ color: var(--swarm-muted);
643
+ }
644
+
645
+ .meter {
646
+ display: inline-flex;
647
+ gap: 1px;
648
+ align-items: flex-end;
649
+ height: 9px;
650
+ }
651
+
652
+ .meter i {
653
+ width: 2px;
654
+ height: 100%;
655
+ background: var(--swarm-border-strong);
656
+ }
657
+
658
+ .meter i.on {
659
+ background: var(--swarm-accent);
660
+ }
661
+
662
+ .splitter {
663
+ background: transparent;
664
+ touch-action: none;
665
+ }
666
+
667
+ .splitter.vertical {
668
+ cursor: col-resize;
669
+ border-left: 1px solid var(--swarm-border);
670
+ }
671
+
672
+ .splitter.horizontal {
673
+ flex: none;
674
+ height: 6px;
675
+ cursor: row-resize;
676
+ border-top: 1px solid var(--swarm-border);
677
+ border-bottom: 1px solid var(--swarm-border);
678
+ }
679
+
680
+ .splitter:hover,
681
+ .splitter.dragging {
682
+ background: var(--swarm-accent-soft);
683
+ }
684
+
685
+ /* activity log */
686
+ .activity-log {
687
+ flex: 1;
688
+ min-height: 60px;
689
+ margin: 0;
690
+ padding: var(--swarm-space-2) 10px;
691
+ overflow: auto;
692
+ list-style: none;
693
+ background: var(--swarm-panel);
694
+ border: 1px solid var(--swarm-border);
695
+ border-radius: var(--swarm-radius);
696
+ }
697
+
698
+ .activity-log li {
699
+ margin: 0 0 8px;
700
+ overflow-wrap: anywhere;
701
+ }
702
+
703
+ .activity-log .time,
704
+ .tail-log .hint {
705
+ margin-right: 6px;
706
+ font-family: var(--swarm-mono);
707
+ font-size: 11px;
708
+ color: var(--swarm-muted);
709
+ }
710
+
711
+ .activity-log .kind,
712
+ .tail-log .kind {
713
+ margin-right: 6px;
714
+ padding: 0 6px;
715
+ font-size: 11px;
716
+ font-weight: 700;
717
+ border: 1px solid var(--swarm-border-strong);
718
+ border-radius: 4px;
719
+ }
720
+
721
+ .activity-log .kind {
722
+ text-transform: uppercase;
723
+ }
724
+
725
+ /* dialogs */
726
+ dialog {
727
+ width: min(520px, calc(100vw - 24px));
728
+ max-height: calc(100vh - 24px);
729
+ padding: var(--swarm-space-4) 18px;
730
+ overflow: auto;
731
+ color: var(--swarm-text);
732
+ background: var(--swarm-raised);
733
+ border: 1px solid var(--swarm-border-strong);
734
+ border-radius: var(--swarm-radius);
735
+ box-shadow: var(--swarm-shadow);
736
+ }
737
+
738
+ dialog.wide {
739
+ width: min(960px, calc(100vw - 24px));
740
+ }
741
+
742
+ dialog::backdrop {
743
+ background: rgb(0 0 0 / 50%);
744
+ }
745
+
746
+ dialog h2 {
747
+ margin-bottom: var(--swarm-space-2);
748
+ font-size: 16px;
749
+ }
750
+
751
+ dialog h3 {
752
+ margin: var(--swarm-space-3) 0 4px;
753
+ font-size: 13px;
754
+ }
755
+
756
+ dialog label {
757
+ display: block;
758
+ margin: var(--swarm-space-2) 0;
759
+ font-weight: 600;
760
+ }
761
+
762
+ dialog label.inline {
763
+ display: flex;
764
+ gap: 6px;
765
+ align-items: flex-start;
766
+ font-weight: 400;
767
+ }
768
+
769
+ dialog fieldset {
770
+ margin: var(--swarm-space-2) 0;
771
+ border: 1px solid var(--swarm-border);
772
+ border-radius: var(--swarm-radius-sm);
773
+ }
774
+
775
+ dialog legend {
776
+ padding: 0 4px;
777
+ font-weight: 600;
778
+ }
779
+
780
+ dialog textarea {
781
+ width: 100%;
782
+ padding: 6px 8px;
783
+ background: var(--swarm-panel);
784
+ color: var(--swarm-text);
785
+ border: 1px solid var(--swarm-control-border);
786
+ border-radius: var(--swarm-radius-sm);
787
+ }
788
+
789
+ .hint {
790
+ margin: 2px 0;
791
+ font-size: 12px;
792
+ color: var(--swarm-muted);
793
+ }
794
+
795
+ .error {
796
+ min-height: 1.2em;
797
+ margin: 6px 0 0;
798
+ color: var(--swarm-danger);
799
+ }
800
+
801
+ .actions {
802
+ display: flex;
803
+ flex-wrap: wrap;
804
+ justify-content: flex-end;
805
+ gap: var(--swarm-space-2);
806
+ margin-top: var(--swarm-space-3);
807
+ }
808
+
809
+ .diff-head {
810
+ display: flex;
811
+ align-items: center;
812
+ justify-content: space-between;
813
+ }
814
+
815
+ .diff,
816
+ .plain,
817
+ .doc-text {
818
+ max-height: 280px;
819
+ margin: 0;
820
+ padding: var(--swarm-space-2);
821
+ overflow: auto;
822
+ white-space: pre-wrap;
823
+ overflow-wrap: anywhere;
824
+ font: 12px / 1.45 var(--swarm-mono);
825
+ background: var(--swarm-code-bg);
826
+ border: 1px solid var(--swarm-border);
827
+ border-radius: var(--swarm-radius-sm);
828
+ }
829
+
830
+ .diff .plain {
831
+ max-height: none;
832
+ border: 0;
833
+ padding: 0;
834
+ }
835
+
836
+ .diff .add,
837
+ .sbs td.add {
838
+ color: var(--swarm-ok);
839
+ }
840
+
841
+ .diff .del,
842
+ .sbs td.del {
843
+ color: var(--swarm-danger);
844
+ }
845
+
846
+ .diff .hunk,
847
+ .sbs .hunk-row td {
848
+ color: var(--swarm-muted);
849
+ }
850
+
851
+ .sbs {
852
+ width: 100%;
853
+ table-layout: fixed;
854
+ border-collapse: collapse;
855
+ }
856
+
857
+ .sbs th {
858
+ text-align: left;
859
+ font: 11px var(--swarm-sans);
860
+ color: var(--swarm-muted);
861
+ border-bottom: 1px solid var(--swarm-border);
862
+ }
863
+
864
+ .sbs td {
865
+ width: 50%;
866
+ padding: 0 6px;
867
+ vertical-align: top;
868
+ white-space: pre-wrap;
869
+ overflow-wrap: anywhere;
870
+ }
871
+
872
+ .sbs td.add {
873
+ background: var(--swarm-accent-soft);
874
+ }
875
+
876
+ .sbs td.del {
877
+ background: var(--swarm-danger-soft);
878
+ }
879
+
880
+ .sbs td + td {
881
+ border-left: 1px solid var(--swarm-border);
882
+ }
883
+
884
+ .doc {
885
+ margin: var(--swarm-space-2) 0 var(--swarm-space-3);
886
+ }
887
+
888
+ .doc h3 {
889
+ font-family: var(--swarm-mono);
890
+ }
891
+
892
+ .comments {
893
+ margin: 6px 0;
894
+ padding-left: 18px;
895
+ }
896
+
897
+ .comment-form {
898
+ display: flex;
899
+ gap: 6px;
900
+ align-items: flex-start;
901
+ margin-top: 6px;
902
+ }
903
+
904
+ .comment-form textarea {
905
+ flex: 1;
906
+ }
907
+
908
+ .tail-log {
909
+ max-height: 360px;
910
+ margin: 0;
911
+ padding: var(--swarm-space-2);
912
+ overflow: auto;
913
+ list-style: none;
914
+ background: var(--swarm-panel);
915
+ border: 1px solid var(--swarm-border);
916
+ border-radius: var(--swarm-radius-sm);
917
+ }
918
+
919
+ .tail-log li {
920
+ margin: 0 0 8px;
921
+ white-space: pre-wrap;
922
+ overflow-wrap: anywhere;
923
+ }
924
+
925
+ /* narrow screens: the rail stacks under the board */
926
+ @media (max-width: 820px) {
927
+ body {
928
+ height: auto;
929
+ min-height: 100%;
930
+ }
931
+
932
+ .layout {
933
+ display: block;
934
+ }
935
+
936
+ .splitter {
937
+ display: none;
938
+ }
939
+
940
+ .rail {
941
+ border-left: 0;
942
+ border-top: 1px solid var(--swarm-border);
943
+ }
944
+
945
+ #queue-pane {
946
+ flex: none;
947
+ }
948
+
949
+ #activity-pane {
950
+ min-height: 260px;
951
+ }
952
+
953
+ .topbar,
954
+ .filters,
955
+ .attention,
956
+ .notice {
957
+ padding-left: var(--swarm-space-3);
958
+ padding-right: var(--swarm-space-3);
959
+ }
960
+
961
+ .board {
962
+ padding: 10px var(--swarm-space-3) var(--swarm-space-4);
963
+ }
964
+ }