issue-flow 0.12.0 → 0.14.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 (197) hide show
  1. package/README.md +79 -274
  2. package/dist/agent-OX3KPHE4.js +30 -0
  3. package/dist/{analyze-OEET7KGE.js → analyze-WIND2SEB.js} +31 -16
  4. package/dist/analyze-WIND2SEB.js.map +1 -0
  5. package/dist/{apply-ZIA3C52S.js → apply-JNOI2LR4.js} +18 -7
  6. package/dist/{apply-ZIA3C52S.js.map → apply-JNOI2LR4.js.map} +1 -1
  7. package/dist/bench-B4VZON7E.js +910 -0
  8. package/dist/bench-B4VZON7E.js.map +1 -0
  9. package/dist/{chunk-FADTCQGM.js → chunk-2IQ6M4ZE.js} +94 -32
  10. package/dist/chunk-2IQ6M4ZE.js.map +1 -0
  11. package/dist/chunk-3BWZO4YI.js +141 -0
  12. package/dist/chunk-3BWZO4YI.js.map +1 -0
  13. package/dist/chunk-3WFZETIM.js +163 -0
  14. package/dist/chunk-3WFZETIM.js.map +1 -0
  15. package/dist/chunk-67YIU2VB.js +362 -0
  16. package/dist/chunk-67YIU2VB.js.map +1 -0
  17. package/dist/{chunk-QCPGHBSZ.js → chunk-6BENHR2I.js} +63 -21
  18. package/dist/chunk-6BENHR2I.js.map +1 -0
  19. package/dist/{chunk-BYZDPR7N.js → chunk-6QYMSNVA.js} +194 -235
  20. package/dist/chunk-6QYMSNVA.js.map +1 -0
  21. package/dist/{chunk-Y5ZDJ4PJ.js → chunk-76MMPJ53.js} +20 -10
  22. package/dist/chunk-76MMPJ53.js.map +1 -0
  23. package/dist/chunk-7Z4Y3VKM.js +26 -0
  24. package/dist/chunk-7Z4Y3VKM.js.map +1 -0
  25. package/dist/{chunk-3QHK4YQA.js → chunk-B72RQZBV.js} +346 -119
  26. package/dist/chunk-B72RQZBV.js.map +1 -0
  27. package/dist/chunk-BEZ5BA5U.js +625 -0
  28. package/dist/chunk-BEZ5BA5U.js.map +1 -0
  29. package/dist/chunk-BRCNQXYQ.js +74 -0
  30. package/dist/chunk-BRCNQXYQ.js.map +1 -0
  31. package/dist/chunk-CGKLE6WR.js +1203 -0
  32. package/dist/chunk-CGKLE6WR.js.map +1 -0
  33. package/dist/chunk-CRGIQFUQ.js +83 -0
  34. package/dist/chunk-CRGIQFUQ.js.map +1 -0
  35. package/dist/{chunk-NS6R37II.js → chunk-F6TOYSYY.js} +141 -12
  36. package/dist/chunk-F6TOYSYY.js.map +1 -0
  37. package/dist/chunk-G5EK2XRN.js +25 -0
  38. package/dist/chunk-G5EK2XRN.js.map +1 -0
  39. package/dist/chunk-HAKDLR6N.js +134 -0
  40. package/dist/chunk-HAKDLR6N.js.map +1 -0
  41. package/dist/chunk-J3SOTUVI.js +298 -0
  42. package/dist/chunk-J3SOTUVI.js.map +1 -0
  43. package/dist/chunk-JN6D3MY6.js +30 -0
  44. package/dist/chunk-JN6D3MY6.js.map +1 -0
  45. package/dist/{chunk-LAFNLLQP.js → chunk-KMRFRXIT.js} +5 -5
  46. package/dist/chunk-KT7JKOXB.js +72 -0
  47. package/dist/chunk-KT7JKOXB.js.map +1 -0
  48. package/dist/chunk-L6HSKTQE.js +77 -0
  49. package/dist/chunk-L6HSKTQE.js.map +1 -0
  50. package/dist/chunk-LBGHI4S2.js +1264 -0
  51. package/dist/chunk-LBGHI4S2.js.map +1 -0
  52. package/dist/chunk-LEW4QM74.js +180 -0
  53. package/dist/chunk-LEW4QM74.js.map +1 -0
  54. package/dist/{chunk-FJP3UQGD.js → chunk-LFEQIZLB.js} +115 -20
  55. package/dist/chunk-LFEQIZLB.js.map +1 -0
  56. package/dist/chunk-OOVG2KBY.js +77 -0
  57. package/dist/chunk-OOVG2KBY.js.map +1 -0
  58. package/dist/{chunk-56KS3TFQ.js → chunk-OR43364P.js} +115 -160
  59. package/dist/chunk-OR43364P.js.map +1 -0
  60. package/dist/chunk-P3LRUNC6.js +16 -0
  61. package/dist/chunk-P3LRUNC6.js.map +1 -0
  62. package/dist/{chunk-TSOLWK7Y.js → chunk-PBTA3QQX.js} +8 -7
  63. package/dist/{chunk-TSOLWK7Y.js.map → chunk-PBTA3QQX.js.map} +1 -1
  64. package/dist/{chunk-MJULIKQU.js → chunk-PHW2YV6N.js} +23 -47
  65. package/dist/chunk-PHW2YV6N.js.map +1 -0
  66. package/dist/{chunk-73ATPIYX.js → chunk-PZTWU277.js} +36 -71
  67. package/dist/chunk-PZTWU277.js.map +1 -0
  68. package/dist/{chunk-M5UCXTIT.js → chunk-QD4VOILZ.js} +22 -18
  69. package/dist/chunk-QD4VOILZ.js.map +1 -0
  70. package/dist/chunk-QJ5UZAH5.js +2718 -0
  71. package/dist/chunk-QJ5UZAH5.js.map +1 -0
  72. package/dist/chunk-QK7WUO7A.js +283 -0
  73. package/dist/chunk-QK7WUO7A.js.map +1 -0
  74. package/dist/{chunk-A4SLHOW7.js → chunk-QZVKRDJY.js} +27 -19
  75. package/dist/chunk-QZVKRDJY.js.map +1 -0
  76. package/dist/chunk-REO3PXXO.js +71 -0
  77. package/dist/chunk-REO3PXXO.js.map +1 -0
  78. package/dist/{chunk-EZATO3DW.js → chunk-RVO7L4FX.js} +594 -17
  79. package/dist/chunk-RVO7L4FX.js.map +1 -0
  80. package/dist/{chunk-XQUSIEKA.js → chunk-SZMHCEYV.js} +63 -14
  81. package/dist/chunk-SZMHCEYV.js.map +1 -0
  82. package/dist/chunk-TYRNTSPJ.js +243 -0
  83. package/dist/chunk-TYRNTSPJ.js.map +1 -0
  84. package/dist/chunk-UJ3L2MS7.js +238 -0
  85. package/dist/chunk-UJ3L2MS7.js.map +1 -0
  86. package/dist/chunk-V7MO5EDS.js +120 -0
  87. package/dist/chunk-V7MO5EDS.js.map +1 -0
  88. package/dist/chunk-WB2X37MO.js +415 -0
  89. package/dist/chunk-WB2X37MO.js.map +1 -0
  90. package/dist/{chunk-NTMMF5UD.js → chunk-X44FKNKP.js} +525 -252
  91. package/dist/chunk-X44FKNKP.js.map +1 -0
  92. package/dist/chunk-XEYH6ZZI.js +289 -0
  93. package/dist/chunk-XEYH6ZZI.js.map +1 -0
  94. package/dist/cli.js +267 -44
  95. package/dist/cli.js.map +1 -1
  96. package/dist/{config-PRJGWW7J.js → config-HMFMCY2M.js} +31 -5
  97. package/dist/contract-JH2WBIO6.js +8 -0
  98. package/dist/conventions-NJF2OPVQ.js +146 -0
  99. package/dist/conventions-NJF2OPVQ.js.map +1 -0
  100. package/dist/diagnostics-THH42ZMP.js +23 -0
  101. package/dist/execute-KFNNZZHI.js +35 -0
  102. package/dist/{generate-EGB4KV2B.js → generate-FW5C6NP7.js} +37 -20
  103. package/dist/{generate-EGB4KV2B.js.map → generate-FW5C6NP7.js.map} +1 -1
  104. package/dist/git-W72QQ6GT.js +33 -0
  105. package/dist/init-HTN4V67Q.js +24 -0
  106. package/dist/{operations-BYT626KQ.js → operations-BCFOBH42.js} +27 -15
  107. package/dist/{operations-BYT626KQ.js.map → operations-BCFOBH42.js.map} +1 -1
  108. package/dist/permissions-4AKNQZHK.js +18 -0
  109. package/dist/plan-SIZLGA4V.js +34 -0
  110. package/dist/{policy-6S4GFC76.js → policy-DT6Q6ZVM.js} +20 -6
  111. package/dist/policy-DT6Q6ZVM.js.map +1 -0
  112. package/dist/pr-OMWCGUOW.js +39 -0
  113. package/dist/pr-review-N24CZPKR.js +32 -0
  114. package/dist/pr-review-N24CZPKR.js.map +1 -0
  115. package/dist/prd-5OFTZAHJ.js +33 -0
  116. package/dist/prd-5OFTZAHJ.js.map +1 -0
  117. package/dist/ps-RFORTCUD.js +93 -0
  118. package/dist/ps-RFORTCUD.js.map +1 -0
  119. package/dist/recorder-KCCPMKQG.js +32 -0
  120. package/dist/recorder-KCCPMKQG.js.map +1 -0
  121. package/dist/registry-GLPXOMFG.js +15 -0
  122. package/dist/registry-GLPXOMFG.js.map +1 -0
  123. package/dist/{resume-PPCNQVVV.js → resume-M5RLKP4I.js} +55 -34
  124. package/dist/{resume-PPCNQVVV.js.map → resume-M5RLKP4I.js.map} +1 -1
  125. package/dist/review-YM4JAABY.js +35 -0
  126. package/dist/review-YM4JAABY.js.map +1 -0
  127. package/dist/routing-NNT5WKGX.js +94 -0
  128. package/dist/routing-NNT5WKGX.js.map +1 -0
  129. package/dist/run-PZUKHPQK.js +54 -0
  130. package/dist/run-PZUKHPQK.js.map +1 -0
  131. package/dist/session-publisher-T7EI3CIP.js +11 -0
  132. package/dist/session-publisher-T7EI3CIP.js.map +1 -0
  133. package/dist/{state-manager-2EDVDBAR.js → state-manager-GQH32C44.js} +4 -2
  134. package/dist/state-manager-GQH32C44.js.map +1 -0
  135. package/dist/usage-V2CHE5PY.js +177 -0
  136. package/dist/usage-V2CHE5PY.js.map +1 -0
  137. package/dist/{web-EF5WIIGG.js → web-EA3KGNFN.js} +45 -30
  138. package/dist/web-EA3KGNFN.js.map +1 -0
  139. package/package.json +6 -2
  140. package/prompts/execute.md +7 -8
  141. package/prompts/plan.md +4 -5
  142. package/prompts/pr.md +2 -2
  143. package/web/AGENTS.md +152 -13
  144. package/web/public/app.css +380 -109
  145. package/web/public/app.js +525 -25
  146. package/web/public/index.html +68 -1
  147. package/dist/analyze-OEET7KGE.js.map +0 -1
  148. package/dist/chunk-3QHK4YQA.js.map +0 -1
  149. package/dist/chunk-42PJFMAR.js +0 -605
  150. package/dist/chunk-42PJFMAR.js.map +0 -1
  151. package/dist/chunk-4JSOYE4G.js +0 -368
  152. package/dist/chunk-4JSOYE4G.js.map +0 -1
  153. package/dist/chunk-56KS3TFQ.js.map +0 -1
  154. package/dist/chunk-73ATPIYX.js.map +0 -1
  155. package/dist/chunk-A4SLHOW7.js.map +0 -1
  156. package/dist/chunk-BAUPQXPE.js +0 -173
  157. package/dist/chunk-BAUPQXPE.js.map +0 -1
  158. package/dist/chunk-BYZDPR7N.js.map +0 -1
  159. package/dist/chunk-CD5ULRVC.js +0 -615
  160. package/dist/chunk-CD5ULRVC.js.map +0 -1
  161. package/dist/chunk-DIDUVL6O.js +0 -1365
  162. package/dist/chunk-DIDUVL6O.js.map +0 -1
  163. package/dist/chunk-EZATO3DW.js.map +0 -1
  164. package/dist/chunk-FADTCQGM.js.map +0 -1
  165. package/dist/chunk-FJP3UQGD.js.map +0 -1
  166. package/dist/chunk-LWRSMTTZ.js +0 -18
  167. package/dist/chunk-LWRSMTTZ.js.map +0 -1
  168. package/dist/chunk-M5UCXTIT.js.map +0 -1
  169. package/dist/chunk-M66SJHQQ.js +0 -206
  170. package/dist/chunk-M66SJHQQ.js.map +0 -1
  171. package/dist/chunk-MJULIKQU.js.map +0 -1
  172. package/dist/chunk-NS6R37II.js.map +0 -1
  173. package/dist/chunk-NTMMF5UD.js.map +0 -1
  174. package/dist/chunk-QCPGHBSZ.js.map +0 -1
  175. package/dist/chunk-XQUSIEKA.js.map +0 -1
  176. package/dist/chunk-Y5ZDJ4PJ.js.map +0 -1
  177. package/dist/execute-XBNVL753.js +0 -18
  178. package/dist/init-AJHCXJBP.js +0 -10
  179. package/dist/plan-QOZ3RIO6.js +0 -21
  180. package/dist/policy-6S4GFC76.js.map +0 -1
  181. package/dist/pr-EBBHD2ZX.js +0 -26
  182. package/dist/pr-review-VVMW5PO4.js +0 -20
  183. package/dist/prd-JQSZF7PR.js +0 -21
  184. package/dist/review-3F6MARWH.js +0 -19
  185. package/dist/run-RXE5GDQO.js +0 -36
  186. package/dist/web-EF5WIIGG.js.map +0 -1
  187. /package/dist/{config-PRJGWW7J.js.map → agent-OX3KPHE4.js.map} +0 -0
  188. /package/dist/{chunk-LAFNLLQP.js.map → chunk-KMRFRXIT.js.map} +0 -0
  189. /package/dist/{execute-XBNVL753.js.map → config-HMFMCY2M.js.map} +0 -0
  190. /package/dist/{init-AJHCXJBP.js.map → contract-JH2WBIO6.js.map} +0 -0
  191. /package/dist/{plan-QOZ3RIO6.js.map → diagnostics-THH42ZMP.js.map} +0 -0
  192. /package/dist/{pr-EBBHD2ZX.js.map → execute-KFNNZZHI.js.map} +0 -0
  193. /package/dist/{pr-review-VVMW5PO4.js.map → git-W72QQ6GT.js.map} +0 -0
  194. /package/dist/{prd-JQSZF7PR.js.map → init-HTN4V67Q.js.map} +0 -0
  195. /package/dist/{review-3F6MARWH.js.map → permissions-4AKNQZHK.js.map} +0 -0
  196. /package/dist/{run-RXE5GDQO.js.map → plan-SIZLGA4V.js.map} +0 -0
  197. /package/dist/{state-manager-2EDVDBAR.js.map → pr-OMWCGUOW.js.map} +0 -0
@@ -1,56 +1,149 @@
1
1
  /* Interface do monitoramento web do issue-flow.
2
2
  Autocontida: sem fontes externas, sem CDN — funciona offline. */
3
3
 
4
+ /* ---- Paleta ----
5
+
6
+ Tokens nomeados por papel (superfície, texto, borda, acento, estado, foco),
7
+ nunca por local de uso: mexer na hierarquia visual não exige inventar uma cor
8
+ por componente. `:root` carrega a paleta clara **inteira** — nenhum token
9
+ pode ter sua única definição dentro de um `@media` ou de um `[data-theme]`,
10
+ ou o tema oposto fica sem ele. */
11
+
4
12
  :root {
5
- --bg: #f4f5f7;
6
- --card: #ffffff;
7
- --fg: #1a1f27;
8
- --muted: #6b7280;
13
+ /* Esquema dos controles nativos. Os blocos de tema escuro abaixo o
14
+ sobrescrevem. */
15
+ color-scheme: light;
16
+
17
+ /* Superfície: página, cartão elevado e recesso neutro. */
18
+ --surface-page: #f4f5f7;
19
+ --surface: #ffffff;
20
+ --surface-sunken: #e5e7eb;
21
+
22
+ /* Texto. `--text-subtle` está reservado para uma terceira hierarquia
23
+ (legendas, metadados) que o painel ainda não usa — mas já cumpre 4,5:1
24
+ sobre as três superfícies, para poder ser usado sem nova auditoria.
25
+ Os três são medidos contra a superfície mais escura do tema claro
26
+ (`--surface-sunken`); ver a tabela de contraste em `web/AGENTS.md`. */
27
+ --text: #1a1f27;
28
+ --text-muted: #4b5563;
29
+ --text-subtle: #5f6773;
30
+
31
+ /* Borda. `--border-strong` está reservado para separadores que precisem
32
+ vencer o ruído de uma lista densa; hoje nenhum precisa. */
9
33
  --border: #e2e5ea;
34
+ --border-strong: #c7ccd4;
35
+
36
+ /* Acento. `--accent-text` é o texto sobre um preenchimento sólido de acento
37
+ ou de estado (hoje: o banner de desconexão). */
10
38
  --accent: #4f46e5;
11
- --ok: #16a34a;
12
- --warn: #b45309;
13
- --warn-bg: #fef3c7;
14
- --err: #dc2626;
15
- --err-bg: #fee2e2;
16
- --run: #2563eb;
17
- --run-bg: #dbeafe;
18
- --ok-bg: #dcfce7;
19
- --idle-bg: #e5e7eb;
39
+ --accent-text: #ffffff;
40
+
41
+ /* Estado: a cor do texto/ícone e a superfície que a acompanha no badge.
42
+ No tema claro as quatro cores ficam no nível 700 da escala — é o mais
43
+ claro que atende 4,5:1 sobre a própria superfície do badge. O limiar é
44
+ 4,5:1 e não 3:1 porque `.badge` é 0.78rem/600, abaixo de texto grande. */
45
+ --state-ok: #15803d;
46
+ --state-ok-surface: #dcfce7;
47
+ --state-run: #1d4ed8;
48
+ --state-run-surface: #dbeafe;
49
+ --state-warn: #b45309;
50
+ --state-warn-surface: #fef3c7;
51
+ --state-error: #b91c1c;
52
+ --state-error-surface: #fee2e2;
53
+
54
+ /* Foco por teclado: o anel de `:focus-visible`. Precisa de 3:1 contra o que
55
+ estiver adjacente (a superfície ao redor do anel), não de 4,5:1 — é um
56
+ componente gráfico, não texto. */
57
+ --focus-ring: #4f46e5;
58
+
20
59
  --shadow: 0 1px 2px rgb(0 0 0 / 0.06);
21
60
  --overlay: rgb(0 0 0 / 0.45);
22
61
  }
23
62
 
63
+ /* ---- Tema escuro ----
64
+
65
+ Dois blocos gêmeos: o do sistema e o forçado pelo controle do painel.
66
+ **Os dois carregam exatamente a mesma lista de overrides e precisam mudar
67
+ juntos** — mexeu em um, mexa no outro. Só entram aqui os tokens cujo valor
68
+ muda; o que é igual nos dois temas fica só em `:root`.
69
+
70
+ O guarda `:not([data-theme='light'])` é o que faz a escolha manual vencer o
71
+ sistema: com o SO em escuro e o tema forçado em claro, o `@media` não
72
+ sobrescreve nada.
73
+
74
+ `color-scheme` vai dentro de cada bloco (e não no `<html>` nem num `<meta>`)
75
+ porque é ele que manda nos controles nativos — `<select>`, `<progress>`,
76
+ barras de rolagem — e precisa acompanhar o tema efetivo, não o do SO. */
77
+
24
78
  @media (prefers-color-scheme: dark) {
25
- :root {
26
- --bg: #0f1218;
27
- --card: #171c24;
28
- --fg: #e5e9f0;
29
- --muted: #8b93a1;
79
+ :root:not([data-theme='light']) {
80
+ color-scheme: dark;
81
+
82
+ --surface-page: #0f1218;
83
+ --surface: #171c24;
84
+ --surface-sunken: #262d38;
85
+ --text: #e5e9f0;
86
+ --text-muted: #9aa1ad;
87
+ --text-subtle: #8f97a5;
30
88
  --border: #262d38;
31
89
  --accent: #818cf8;
32
- --ok: #4ade80;
33
- --warn: #fbbf24;
34
- --warn-bg: #3a2d10;
35
- --err: #f87171;
36
- --err-bg: #3b1a1a;
37
- --run: #60a5fa;
38
- --run-bg: #172a45;
39
- --ok-bg: #14301f;
40
- --idle-bg: #262d38;
90
+ /* No escuro os preenchimentos sólidos (acento e estado) são claros, então
91
+ o texto sobre eles inverte — branco sobre `--state-error` daria 2,98:1
92
+ no banner de desconexão. */
93
+ --accent-text: #0f1218;
94
+ --state-ok: #4ade80;
95
+ --state-ok-surface: #14301f;
96
+ --state-run: #60a5fa;
97
+ --state-run-surface: #172a45;
98
+ --state-warn: #fbbf24;
99
+ --state-warn-surface: #3a2d10;
100
+ --state-error: #f87171;
101
+ --state-error-surface: #3b1a1a;
102
+ --focus-ring: #818cf8;
41
103
  --shadow: none;
42
104
  --overlay: rgb(0 0 0 / 0.65);
43
105
  }
44
106
  }
45
107
 
108
+ /* Gêmeo do bloco acima — mesma lista de overrides, mudam juntos. */
109
+ :root[data-theme='dark'] {
110
+ color-scheme: dark;
111
+
112
+ --surface-page: #0f1218;
113
+ --surface: #171c24;
114
+ --surface-sunken: #262d38;
115
+ --text: #e5e9f0;
116
+ --text-muted: #9aa1ad;
117
+ --text-subtle: #8f97a5;
118
+ --border: #262d38;
119
+ --accent: #818cf8;
120
+ /* Ver o comentário do bloco gêmeo acima. */
121
+ --accent-text: #0f1218;
122
+ --state-ok: #4ade80;
123
+ --state-ok-surface: #14301f;
124
+ --state-run: #60a5fa;
125
+ --state-run-surface: #172a45;
126
+ --state-warn: #fbbf24;
127
+ --state-warn-surface: #3a2d10;
128
+ --state-error: #f87171;
129
+ --state-error-surface: #3b1a1a;
130
+ --focus-ring: #818cf8;
131
+ --shadow: none;
132
+ --overlay: rgb(0 0 0 / 0.65);
133
+ }
134
+
46
135
  * {
47
136
  box-sizing: border-box;
48
137
  }
49
138
 
139
+ [hidden] {
140
+ display: none !important;
141
+ }
142
+
50
143
  body {
51
144
  margin: 0;
52
- background: var(--bg);
53
- color: var(--fg);
145
+ background: var(--surface-page);
146
+ color: var(--text);
54
147
  font: 15px/1.5 system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif;
55
148
  }
56
149
 
@@ -75,11 +168,11 @@ main > *,
75
168
  }
76
169
 
77
170
  .muted {
78
- color: var(--muted);
171
+ color: var(--text-muted);
79
172
  }
80
173
 
81
174
  .card {
82
- background: var(--card);
175
+ background: var(--surface);
83
176
  border: 1px solid var(--border);
84
177
  border-radius: 10px;
85
178
  padding: 16px;
@@ -100,7 +193,7 @@ h2 {
100
193
  font-weight: 600;
101
194
  text-transform: uppercase;
102
195
  letter-spacing: 0.06em;
103
- color: var(--muted);
196
+ color: var(--text-muted);
104
197
  }
105
198
 
106
199
  a {
@@ -129,14 +222,14 @@ a:hover {
129
222
  padding: 8px 14px;
130
223
  font: inherit;
131
224
  font-weight: 600;
132
- color: var(--muted);
225
+ color: var(--text-muted);
133
226
  cursor: pointer;
134
227
  border-radius: 6px 6px 0 0;
135
228
  }
136
229
 
137
230
  .tab:hover {
138
- color: var(--fg);
139
- background: var(--card);
231
+ color: var(--text);
232
+ background: var(--surface);
140
233
  }
141
234
 
142
235
  .tab.is-active {
@@ -195,17 +288,18 @@ a:hover {
195
288
  }
196
289
 
197
290
  .refresh-control,
291
+ .theme-control,
198
292
  .log-filter-control {
199
293
  font-size: 0.82rem;
200
- color: var(--muted);
294
+ color: var(--text-muted);
201
295
  display: inline-flex;
202
296
  align-items: center;
203
297
  gap: 6px;
204
298
  }
205
299
 
206
300
  select {
207
- background: var(--card);
208
- color: var(--fg);
301
+ background: var(--surface);
302
+ color: var(--text);
209
303
  border: 1px solid var(--border);
210
304
  border-radius: 6px;
211
305
  padding: 3px 6px;
@@ -226,23 +320,23 @@ select {
226
320
  }
227
321
 
228
322
  .status-idle {
229
- background: var(--idle-bg);
230
- color: var(--muted);
323
+ background: var(--surface-sunken);
324
+ color: var(--text-muted);
231
325
  }
232
326
 
233
327
  .status-running {
234
- background: var(--run-bg);
235
- color: var(--run);
328
+ background: var(--state-run-surface);
329
+ color: var(--state-run);
236
330
  }
237
331
 
238
332
  .status-completed {
239
- background: var(--ok-bg);
240
- color: var(--ok);
333
+ background: var(--state-ok-surface);
334
+ color: var(--state-ok);
241
335
  }
242
336
 
243
337
  .status-failed {
244
- background: var(--err-bg);
245
- color: var(--err);
338
+ background: var(--state-error-surface);
339
+ color: var(--state-error);
246
340
  }
247
341
 
248
342
  /* ---- Banner de desconexão ---- */
@@ -251,8 +345,8 @@ select {
251
345
  position: sticky;
252
346
  top: 0;
253
347
  z-index: 10;
254
- background: var(--err);
255
- color: #fff;
348
+ background: var(--state-error);
349
+ color: var(--accent-text);
256
350
  text-align: center;
257
351
  padding: 8px 16px;
258
352
  font-weight: 600;
@@ -261,25 +355,25 @@ select {
261
355
  /* ---- Erros e avisos em destaque ---- */
262
356
 
263
357
  .alerts {
264
- border-color: var(--err);
358
+ border-color: var(--state-error);
265
359
  }
266
360
 
267
361
  .alert-entry {
268
- border-left: 3px solid var(--err);
362
+ border-left: 3px solid var(--state-error);
269
363
  padding: 4px 10px;
270
364
  margin: 6px 0;
271
365
  border-radius: 0 6px 6px 0;
272
- background: var(--err-bg);
366
+ background: var(--state-error-surface);
273
367
  }
274
368
 
275
369
  .alert-entry.level-warn {
276
- border-left-color: var(--warn);
277
- background: var(--warn-bg);
370
+ border-left-color: var(--state-warn);
371
+ background: var(--state-warn-surface);
278
372
  }
279
373
 
280
374
  .alert-count {
281
375
  font-size: 0.82rem;
282
- color: var(--muted);
376
+ color: var(--text-muted);
283
377
  margin: 0 0 4px;
284
378
  }
285
379
 
@@ -306,26 +400,26 @@ select {
306
400
  }
307
401
 
308
402
  .label-badge {
309
- background: var(--idle-bg);
310
- color: var(--fg);
403
+ background: var(--surface-sunken);
404
+ color: var(--text);
311
405
  text-transform: none;
312
406
  font-weight: 500;
313
407
  letter-spacing: normal;
314
408
  }
315
409
 
316
410
  .state-open {
317
- background: var(--run-bg);
318
- color: var(--run);
411
+ background: var(--state-run-surface);
412
+ color: var(--state-run);
319
413
  }
320
414
 
321
415
  .state-closed {
322
- background: var(--ok-bg);
323
- color: var(--ok);
416
+ background: var(--state-ok-surface);
417
+ color: var(--state-ok);
324
418
  }
325
419
 
326
420
  .state-unknown {
327
- background: var(--idle-bg);
328
- color: var(--muted);
421
+ background: var(--surface-sunken);
422
+ color: var(--text-muted);
329
423
  }
330
424
 
331
425
  .issue-description {
@@ -347,23 +441,23 @@ select {
347
441
  }
348
442
 
349
443
  .story-status-backlog {
350
- background: var(--idle-bg);
351
- color: var(--muted);
444
+ background: var(--surface-sunken);
445
+ color: var(--text-muted);
352
446
  }
353
447
 
354
448
  .story-status-in_progress {
355
- background: var(--run-bg);
356
- color: var(--run);
449
+ background: var(--state-run-surface);
450
+ color: var(--state-run);
357
451
  }
358
452
 
359
453
  .story-status-in_review {
360
- background: var(--warn-bg);
361
- color: var(--warn);
454
+ background: var(--state-warn-surface);
455
+ color: var(--state-warn);
362
456
  }
363
457
 
364
458
  .story-status-done {
365
- background: var(--ok-bg);
366
- color: var(--ok);
459
+ background: var(--state-ok-surface);
460
+ color: var(--state-ok);
367
461
  }
368
462
 
369
463
  .story-deps {
@@ -405,7 +499,7 @@ progress {
405
499
  }
406
500
 
407
501
  .now-grid dt {
408
- color: var(--muted);
502
+ color: var(--text-muted);
409
503
  font-size: 0.86rem;
410
504
  }
411
505
 
@@ -421,7 +515,7 @@ progress {
421
515
  width: 8px;
422
516
  height: 8px;
423
517
  border-radius: 50%;
424
- background: var(--run);
518
+ background: var(--state-run);
425
519
  margin-right: 6px;
426
520
  animation: pulse 1.4s ease-in-out infinite;
427
521
  }
@@ -454,6 +548,34 @@ progress {
454
548
  border-bottom: 1px solid var(--border);
455
549
  }
456
550
 
551
+ .plain-list .history-entry {
552
+ align-items: flex-start;
553
+ }
554
+
555
+ .history-type {
556
+ flex: 0 0 9rem;
557
+ color: var(--text-muted);
558
+ }
559
+
560
+ .history-message {
561
+ min-width: 0;
562
+ overflow-wrap: anywhere;
563
+ }
564
+
565
+ @media (max-width: 560px) {
566
+ .plain-list .history-entry {
567
+ flex-wrap: wrap;
568
+ }
569
+
570
+ .history-type {
571
+ flex-basis: auto;
572
+ }
573
+
574
+ .history-message {
575
+ flex-basis: 100%;
576
+ }
577
+ }
578
+
457
579
  .plain-list li:last-child {
458
580
  border-bottom: none;
459
581
  }
@@ -469,26 +591,26 @@ progress {
469
591
  "User stories". A borda esquerda usa box-shadow (não border) para não
470
592
  deslocar o conteúdo do item ao ganhar/perder a classe. */
471
593
  .story-executing {
472
- background: var(--run-bg);
594
+ background: var(--state-run-surface);
473
595
  border-radius: 6px;
474
- box-shadow: inset 3px 0 0 0 var(--run);
596
+ box-shadow: inset 3px 0 0 0 var(--state-run);
475
597
  padding-left: 9px;
476
598
  }
477
599
 
478
600
  .icon-completed {
479
- color: var(--ok);
601
+ color: var(--state-ok);
480
602
  }
481
603
 
482
604
  .icon-running {
483
- color: var(--run);
605
+ color: var(--state-run);
484
606
  }
485
607
 
486
608
  .icon-failed {
487
- color: var(--err);
609
+ color: var(--state-error);
488
610
  }
489
611
 
490
612
  .icon-pending {
491
- color: var(--muted);
613
+ color: var(--text-muted);
492
614
  }
493
615
 
494
616
  .item-main {
@@ -503,7 +625,7 @@ progress {
503
625
  }
504
626
 
505
627
  .item-error {
506
- color: var(--err);
628
+ color: var(--state-error);
507
629
  font-size: 0.85rem;
508
630
  white-space: pre-wrap;
509
631
  word-break: break-word;
@@ -511,7 +633,7 @@ progress {
511
633
 
512
634
  .item-side {
513
635
  flex: none;
514
- color: var(--muted);
636
+ color: var(--text-muted);
515
637
  font-size: 0.84rem;
516
638
  font-variant-numeric: tabular-nums;
517
639
  /* Com duração + tokens + custo o slot fica bem mais largo; alinhar à
@@ -565,7 +687,7 @@ progress {
565
687
 
566
688
  .log-time {
567
689
  flex: none;
568
- color: var(--muted);
690
+ color: var(--text-muted);
569
691
  }
570
692
 
571
693
  .log-level {
@@ -575,15 +697,15 @@ progress {
575
697
  }
576
698
 
577
699
  .level-info .log-level {
578
- color: var(--muted);
700
+ color: var(--text-muted);
579
701
  }
580
702
 
581
703
  .level-warn .log-level {
582
- color: var(--warn);
704
+ color: var(--state-warn);
583
705
  }
584
706
 
585
707
  .level-error .log-level {
586
- color: var(--err);
708
+ color: var(--state-error);
587
709
  }
588
710
 
589
711
  .log-message {
@@ -603,7 +725,7 @@ progress {
603
725
  }
604
726
 
605
727
  .kanban-column {
606
- background: var(--bg);
728
+ background: var(--surface-page);
607
729
  border: 1px solid var(--border);
608
730
  border-radius: 8px;
609
731
  padding: 10px;
@@ -625,13 +747,13 @@ progress {
625
747
  font-weight: 600;
626
748
  text-transform: uppercase;
627
749
  letter-spacing: 0.06em;
628
- color: var(--muted);
750
+ color: var(--text-muted);
629
751
  }
630
752
 
631
753
  .kanban-column-count {
632
754
  flex: none;
633
- background: var(--idle-bg);
634
- color: var(--muted);
755
+ background: var(--surface-sunken);
756
+ color: var(--text-muted);
635
757
  border-radius: 999px;
636
758
  padding: 0 7px;
637
759
  font-size: 0.74rem;
@@ -645,7 +767,7 @@ progress {
645
767
  justify-items: start;
646
768
  width: 100%;
647
769
  text-align: left;
648
- background: var(--card);
770
+ background: var(--surface);
649
771
  border: 1px solid var(--border);
650
772
  border-radius: 8px;
651
773
  padding: 10px;
@@ -663,7 +785,7 @@ progress {
663
785
  display: flex;
664
786
  align-items: center;
665
787
  gap: 2px;
666
- color: var(--muted);
788
+ color: var(--text-muted);
667
789
  font-size: 0.8rem;
668
790
  }
669
791
 
@@ -678,7 +800,7 @@ progress {
678
800
  continua no DOM para leitores de tela e para o drawer. */
679
801
  .kanban-card-desc {
680
802
  margin: 0;
681
- color: var(--muted);
803
+ color: var(--text-muted);
682
804
  font-size: 0.84rem;
683
805
  line-height: 1.4;
684
806
  overflow: hidden;
@@ -718,7 +840,7 @@ progress {
718
840
  z-index: 21;
719
841
  display: flex;
720
842
  flex-direction: column;
721
- background: var(--card);
843
+ background: var(--surface);
722
844
  border-left: 1px solid var(--border);
723
845
  padding: 16px;
724
846
  gap: 12px;
@@ -743,7 +865,7 @@ progress {
743
865
  font-size: 0.95rem;
744
866
  text-transform: none;
745
867
  letter-spacing: normal;
746
- color: var(--fg);
868
+ color: var(--text);
747
869
  overflow-wrap: anywhere;
748
870
  }
749
871
 
@@ -754,14 +876,14 @@ progress {
754
876
  border: none;
755
877
  padding: 2px 6px;
756
878
  font: inherit;
757
- color: var(--muted);
879
+ color: var(--text-muted);
758
880
  cursor: pointer;
759
881
  border-radius: 6px;
760
882
  }
761
883
 
762
884
  .drawer-close:hover {
763
- color: var(--fg);
764
- background: var(--idle-bg);
885
+ color: var(--text);
886
+ background: var(--surface-sunken);
765
887
  }
766
888
 
767
889
  /* A rolagem vive aqui, não na página: o drawer é fixo e ocupa a altura toda. */
@@ -790,7 +912,7 @@ progress {
790
912
  font-weight: 600;
791
913
  text-transform: uppercase;
792
914
  letter-spacing: 0.06em;
793
- color: var(--muted);
915
+ color: var(--text-muted);
794
916
  }
795
917
 
796
918
  .drawer-text {
@@ -810,10 +932,147 @@ progress {
810
932
  overflow-wrap: anywhere;
811
933
  }
812
934
 
935
+ .detail-row {
936
+ cursor: pointer;
937
+ border-radius: 8px;
938
+ transition: background 120ms ease, box-shadow 120ms ease;
939
+ }
940
+
941
+ .detail-row:hover {
942
+ background: var(--surface-sunken);
943
+ }
944
+
945
+ .detail-row:focus-visible,
946
+ .config-phase-row:focus-visible {
947
+ outline: 2px solid var(--focus-ring);
948
+ outline-offset: 2px;
949
+ }
950
+
951
+ .config-phase-grid {
952
+ display: grid;
953
+ gap: 1px;
954
+ margin-top: 1rem;
955
+ border: 1px solid var(--border);
956
+ border-radius: 10px;
957
+ overflow: hidden;
958
+ background: var(--border);
959
+ }
960
+
961
+ .config-phase-row {
962
+ display: grid;
963
+ grid-template-columns: minmax(5rem, 0.7fr) minmax(6rem, 1fr) minmax(8rem, 1.4fr) minmax(10rem, 1.4fr);
964
+ gap: 0.75rem;
965
+ align-items: center;
966
+ padding: 0.65rem 0.8rem;
967
+ border: 0;
968
+ color: var(--text);
969
+ background: var(--surface);
970
+ text-align: left;
971
+ cursor: pointer;
972
+ }
973
+
974
+ .config-phase-row:hover {
975
+ background: var(--surface-sunken);
976
+ }
977
+
978
+ .config-form {
979
+ display: grid;
980
+ grid-template-columns: minmax(8rem, 0.7fr) minmax(12rem, 1fr) auto minmax(10rem, 1fr);
981
+ gap: 0.65rem;
982
+ align-items: center;
983
+ margin-top: 1rem;
984
+ padding-top: 1rem;
985
+ border-top: 1px solid var(--border);
986
+ }
987
+
988
+ .config-form[hidden] {
989
+ display: none;
990
+ }
991
+
992
+ .config-form select,
993
+ .config-form input,
994
+ .config-save {
995
+ min-height: 2.25rem;
996
+ border: 1px solid var(--border-strong);
997
+ border-radius: 7px;
998
+ padding: 0.4rem 0.65rem;
999
+ color: var(--text);
1000
+ background: var(--surface);
1001
+ }
1002
+
1003
+ .config-save {
1004
+ color: var(--accent-text);
1005
+ border-color: var(--accent);
1006
+ background: var(--accent);
1007
+ cursor: pointer;
1008
+ }
1009
+
1010
+ .execution-timeline {
1011
+ display: grid;
1012
+ gap: 0.75rem;
1013
+ margin: 0;
1014
+ padding: 0;
1015
+ list-style: none;
1016
+ }
1017
+
1018
+ .execution-entry {
1019
+ padding: 0.8rem;
1020
+ border: 1px solid var(--border);
1021
+ border-radius: 9px;
1022
+ background: var(--surface-sunken);
1023
+ }
1024
+
1025
+ .execution-entry-head {
1026
+ display: flex;
1027
+ gap: 0.6rem;
1028
+ align-items: center;
1029
+ margin-bottom: 0.65rem;
1030
+ }
1031
+
1032
+ .execution-grid,
1033
+ .drawer-summary-grid {
1034
+ margin-top: 0.75rem;
1035
+ }
1036
+
1037
+ .process-output summary {
1038
+ cursor: pointer;
1039
+ color: var(--text-muted);
1040
+ }
1041
+
1042
+ .process-output-body {
1043
+ max-height: 22rem;
1044
+ overflow: auto;
1045
+ padding: 0.8rem;
1046
+ border-radius: 8px;
1047
+ color: var(--text);
1048
+ background: var(--surface-sunken);
1049
+ white-space: pre-wrap;
1050
+ overflow-wrap: anywhere;
1051
+ font-size: 0.75rem;
1052
+ line-height: 1.45;
1053
+ }
1054
+
1055
+ .commit-meta {
1056
+ display: block;
1057
+ margin-top: 0.2rem;
1058
+ font-size: 0.76rem;
1059
+ font-weight: 400;
1060
+ }
1061
+
1062
+ @media (max-width: 720px) {
1063
+ .config-phase-row {
1064
+ grid-template-columns: 1fr 1fr;
1065
+ }
1066
+
1067
+ .config-form {
1068
+ grid-template-columns: 1fr;
1069
+ }
1070
+ }
1071
+
813
1072
  /* ---- Diversos ---- */
814
1073
 
815
1074
  .empty {
816
- color: var(--muted);
1075
+ color: var(--text-muted);
817
1076
  font-style: italic;
818
1077
  margin: 0;
819
1078
  }
@@ -895,7 +1154,7 @@ progress {
895
1154
  .dashboard-card {
896
1155
  appearance: none;
897
1156
  text-align: left;
898
- background: var(--card);
1157
+ background: var(--surface);
899
1158
  border: 1px solid var(--border);
900
1159
  border-radius: 10px;
901
1160
  padding: 16px;
@@ -904,18 +1163,30 @@ progress {
904
1163
  font: inherit;
905
1164
  cursor: pointer;
906
1165
  display: grid;
1166
+ /* O grid externo estica os cards de uma linha para a mesma altura. Sem isto,
1167
+ `align-content: stretch` distribui a sobra entre as faixas — inclusive a do
1168
+ resumo — e a faixa fica mais alta que as 3 linhas do clamp, deixando vazar
1169
+ uma 4ª linha cortada por baixo do reticente. Empacotar no topo manda a
1170
+ sobra para o fim do card, que é onde ela não engana ninguém. */
1171
+ align-content: start;
907
1172
  gap: 10px;
908
1173
  transition: border-color 0.15s ease, box-shadow 0.15s ease;
909
1174
  }
910
1175
 
911
- .dashboard-card:hover,
912
- .dashboard-card:focus-visible {
1176
+ /* Hover e foco por teclado precisam ser distinguíveis: o hover só acende a
1177
+ borda; o foco desenha um anel de `--focus-ring` destacado do cartão, que é
1178
+ visível mesmo em cima do hover. Era aqui que o `outline` estava suprimido. */
1179
+ .dashboard-card:hover {
913
1180
  border-color: var(--accent);
914
- outline: none;
1181
+ }
1182
+
1183
+ .dashboard-card:focus-visible {
1184
+ outline: 2px solid var(--focus-ring);
1185
+ outline-offset: 2px;
915
1186
  }
916
1187
 
917
1188
  .dashboard-card.is-live {
918
- border-color: var(--run);
1189
+ border-color: var(--state-run);
919
1190
  }
920
1191
 
921
1192
  .dashboard-card-head {
@@ -928,7 +1199,7 @@ progress {
928
1199
  .dashboard-project {
929
1200
  font-size: 0.82rem;
930
1201
  font-weight: 600;
931
- color: var(--muted);
1202
+ color: var(--text-muted);
932
1203
  overflow-wrap: anywhere;
933
1204
  }
934
1205
 
@@ -966,14 +1237,14 @@ progress {
966
1237
  flex-wrap: wrap;
967
1238
  gap: 10px;
968
1239
  font-size: 0.82rem;
969
- color: var(--muted);
1240
+ color: var(--text-muted);
970
1241
  font-variant-numeric: tabular-nums;
971
1242
  }
972
1243
 
973
1244
  .dashboard-progress {
974
1245
  display: block;
975
1246
  height: 6px;
976
- background: var(--idle-bg);
1247
+ background: var(--surface-sunken);
977
1248
  border-radius: 999px;
978
1249
  overflow: hidden;
979
1250
  }
@@ -981,7 +1252,7 @@ progress {
981
1252
  .dashboard-progress-bar {
982
1253
  display: block;
983
1254
  height: 100%;
984
- background: var(--run);
1255
+ background: var(--state-run);
985
1256
  border-radius: 999px;
986
1257
  transition: width 0.3s ease;
987
1258
  }
@@ -989,7 +1260,7 @@ progress {
989
1260
  .dashboard-live-dot {
990
1261
  font-size: 0.75rem;
991
1262
  font-weight: 600;
992
- color: var(--run);
1263
+ color: var(--state-run);
993
1264
  text-transform: uppercase;
994
1265
  letter-spacing: 0.04em;
995
1266
  }
@@ -1001,7 +1272,7 @@ progress {
1001
1272
  height: 7px;
1002
1273
  margin-right: 6px;
1003
1274
  border-radius: 50%;
1004
- background: var(--run);
1275
+ background: var(--state-run);
1005
1276
  vertical-align: middle;
1006
1277
  animation: dashboard-pulse 1.4s ease-in-out infinite;
1007
1278
  }