coding-agent-harness 1.0.8 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (232) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/CONTRIBUTING.md +8 -4
  3. package/README.md +12 -2
  4. package/README.zh-CN.md +10 -2
  5. package/SKILL.md +14 -3
  6. package/dist/build-dist.mjs +19 -6
  7. package/dist/check-dist-observation.mjs +57 -29
  8. package/dist/check-harness.mjs +0 -1
  9. package/dist/check-import-graph.mjs +44 -27
  10. package/dist/check-lite-forbidden-surfaces.mjs +121 -0
  11. package/dist/check-no-ts-nocheck.mjs +7 -7
  12. package/dist/check-runtime-emit.mjs +10 -3
  13. package/dist/check-type-boundaries.mjs +51 -9
  14. package/dist/commands/dashboard-command.mjs +52 -14
  15. package/dist/commands/migration-command.mjs +18 -8
  16. package/dist/commands/module-command.mjs +142 -0
  17. package/dist/commands/preset-command.mjs +51 -12
  18. package/dist/commands/registry.mjs +483 -0
  19. package/dist/commands/task-command.mjs +109 -52
  20. package/dist/harness.mjs +6 -304
  21. package/dist/lib/capability-registry.mjs +229 -53
  22. package/dist/lib/check-module-parallel.mjs +1 -6
  23. package/dist/lib/check-profiles.mjs +39 -46
  24. package/dist/lib/check-task-contracts.mjs +6 -4
  25. package/dist/lib/command-registry.mjs +248 -0
  26. package/dist/lib/core-shared.mjs +78 -3
  27. package/dist/lib/dashboard-data.mjs +203 -22
  28. package/dist/lib/dashboard-workbench.mjs +245 -21
  29. package/dist/lib/dashboard-writer.mjs +4 -1
  30. package/dist/lib/git-status-summary.mjs +0 -1
  31. package/dist/lib/governance-index-generator.mjs +7 -5
  32. package/dist/lib/governance-sync.mjs +46 -121
  33. package/dist/lib/governance-table-boundary.mjs +1 -14
  34. package/dist/lib/harness-core.mjs +4 -1
  35. package/dist/lib/harness-paths.mjs +115 -1
  36. package/dist/lib/impact-classifier.mjs +420 -0
  37. package/dist/lib/lesson-maintenance.mjs +1 -2
  38. package/dist/lib/markdown-utils.mjs +50 -1
  39. package/dist/lib/migration-planner.mjs +31 -16
  40. package/dist/lib/migration-support.mjs +5 -4
  41. package/dist/lib/module-registry.mjs +296 -0
  42. package/dist/lib/preset-audit-contracts.mjs +24 -1
  43. package/dist/lib/preset-engine.mjs +67 -29
  44. package/dist/lib/preset-registry.mjs +361 -71
  45. package/dist/lib/preset-runner.mjs +292 -26
  46. package/dist/lib/review-confirm-git-gate.mjs +73 -19
  47. package/dist/lib/status-builder.mjs +23 -8
  48. package/dist/lib/structure-migration.mjs +6 -4
  49. package/dist/lib/subagent-authorization-audit.mjs +8 -2
  50. package/dist/lib/task-archive-eligibility.mjs +65 -0
  51. package/dist/lib/task-audit-metadata.mjs +25 -11
  52. package/dist/lib/task-audit-migration.mjs +21 -14
  53. package/dist/lib/task-discovery-contract.mjs +32 -0
  54. package/dist/lib/task-index.mjs +3 -2
  55. package/dist/lib/task-lesson-candidates.mjs +1 -2
  56. package/dist/lib/task-lesson-sedimentation.mjs +310 -9
  57. package/dist/lib/task-lifecycle/create-task-helpers.mjs +6 -3
  58. package/dist/lib/task-lifecycle/phase-sync.mjs +0 -1
  59. package/dist/lib/task-lifecycle/preset-interop.mjs +16 -0
  60. package/dist/lib/task-lifecycle/review-confirm.mjs +34 -2
  61. package/dist/lib/task-lifecycle/review-gates.mjs +12 -5
  62. package/dist/lib/task-lifecycle/review-submission.mjs +1 -2
  63. package/dist/lib/task-lifecycle/scaffold-provenance.mjs +0 -1
  64. package/dist/lib/task-lifecycle/template-files.mjs +2 -5
  65. package/dist/lib/task-lifecycle.mjs +116 -160
  66. package/dist/lib/task-metadata.mjs +10 -5
  67. package/dist/lib/task-preset-contract-drift.mjs +45 -0
  68. package/dist/lib/task-repository.mjs +192 -0
  69. package/dist/lib/task-review-model.mjs +36 -17
  70. package/dist/lib/task-scanner.mjs +74 -23
  71. package/dist/lib/task-template-materials.mjs +131 -0
  72. package/dist/lib/task-tombstone-commands.mjs +186 -29
  73. package/dist/lib/types/check-profiles.js +1 -0
  74. package/dist/lib/types/impact.js +1 -0
  75. package/dist/lib/types/preset.js +1 -0
  76. package/dist/lib/types/task-lifecycle.js +1 -0
  77. package/dist/lib/types/task-scanner.js +1 -0
  78. package/dist/postinstall.mjs +2 -2
  79. package/dist/run-built-tests.mjs +10 -3
  80. package/docs-release/README.md +1 -0
  81. package/docs-release/architecture/document-contract-kernel/README.md +150 -0
  82. package/docs-release/architecture/document-contract-kernel/products/full-skill-overlay.md +29 -0
  83. package/docs-release/architecture/document-contract-kernel/products/lite-forbidden-surfaces.txt +26 -0
  84. package/docs-release/architecture/document-contract-kernel/products/lite-skill-overlay.md +37 -0
  85. package/docs-release/architecture/overview.md +2 -2
  86. package/docs-release/architecture/overview.zh-CN.md +2 -2
  87. package/docs-release/architecture/system-explainer/01-system-overview.md +11 -7
  88. package/docs-release/architecture/system-explainer/02-module-dependency.md +4 -4
  89. package/docs-release/architecture/system-explainer/03-task-lifecycle.md +17 -12
  90. package/docs-release/architecture/system-explainer/05-data-flow.md +6 -6
  91. package/docs-release/architecture/system-explainer/06-preset-and-migration.md +2 -2
  92. package/docs-release/architecture/system-explainer/README.md +1 -1
  93. package/docs-release/architecture/system-explainer/en-US/01-system-overview.md +12 -8
  94. package/docs-release/architecture/system-explainer/en-US/02-module-dependency.md +5 -5
  95. package/docs-release/architecture/system-explainer/en-US/03-task-lifecycle.md +19 -11
  96. package/docs-release/architecture/system-explainer/en-US/05-data-flow.md +5 -5
  97. package/docs-release/architecture/system-explainer/en-US/06-preset-and-migration.md +2 -2
  98. package/docs-release/architecture/system-explainer/en-US/README.md +1 -1
  99. package/docs-release/guides/agent-installation.en-US.md +4 -6
  100. package/docs-release/guides/agent-installation.md +11 -8
  101. package/docs-release/guides/contributing.md +10 -3
  102. package/docs-release/guides/contributing.zh-CN.md +10 -3
  103. package/docs-release/guides/legacy-migration-agent-prompt.md +1 -1
  104. package/docs-release/guides/legacy-migration-agent-prompt.zh-CN.md +1 -1
  105. package/docs-release/guides/migration-playbook.en-US.md +9 -6
  106. package/docs-release/guides/migration-playbook.md +9 -6
  107. package/docs-release/guides/preset-development.md +68 -2
  108. package/docs-release/guides/task-state-machine.en-US.md +8 -8
  109. package/docs-release/guides/task-state-machine.md +7 -7
  110. package/docs-release/guides/typescript-runtime-migration-closeout.md +17 -13
  111. package/package.json +16 -12
  112. package/postinstall.mjs +37 -0
  113. package/presets/legacy-migration/preset.yaml +5 -5
  114. package/presets/legacy-migration/templates/execution_strategy.append.md +1 -1
  115. package/presets/lesson-sedimentation/preset.yaml +3 -3
  116. package/presets/module/preset.yaml +2 -2
  117. package/presets/module/templates/execution_strategy.append.md +1 -1
  118. package/presets/module/templates/task_plan.append.md +3 -3
  119. package/presets/release-closeout/checks/check-release-package.mjs +6 -1
  120. package/presets/release-closeout/preset.yaml +9 -9
  121. package/presets/release-closeout/scripts/generate-release-package.mjs +387 -25
  122. package/presets/release-closeout/templates/task_plan.append.md +5 -5
  123. package/presets/standard-task/preset.yaml +2 -2
  124. package/references/agents-md-pattern.md +23 -17
  125. package/references/lessons-governance.md +2 -2
  126. package/references/module-parallel-standard.md +3 -6
  127. package/references/ssot-governance.md +2 -2
  128. package/references/taskr-gap-analysis.md +3 -3
  129. package/run-dist.mjs +34 -0
  130. package/skills/preset-creator/SKILL.md +40 -8
  131. package/skills/preset-creator/references/complex-task-skeleton/brief.md +32 -8
  132. package/skills/preset-creator/references/preset-package-skeleton.md +15 -5
  133. package/skills/preset-creator/references/structure-aware-paths.md +112 -0
  134. package/templates/AGENTS.md.template +28 -26
  135. package/templates/architecture/README.md +2 -2
  136. package/templates/architecture/service-catalog.md +2 -2
  137. package/templates/architecture/services/service-template.md +1 -1
  138. package/templates/dashboard/assets/app-src/00-state.js +5 -1
  139. package/templates/dashboard/assets/app-src/10-router.js +7 -0
  140. package/templates/dashboard/assets/app-src/20-overview.js +8 -8
  141. package/templates/dashboard/assets/app-src/30-tasks.js +132 -40
  142. package/templates/dashboard/assets/app-src/32-task-swimlane.js +314 -0
  143. package/templates/dashboard/assets/app-src/35-task-detail.js +35 -5
  144. package/templates/dashboard/assets/app-src/40-modules.js +257 -41
  145. package/templates/dashboard/assets/app-src/45-review.js +127 -1
  146. package/templates/dashboard/assets/app-src/90-bindings.js +185 -2
  147. package/templates/dashboard/assets/app.css +928 -53
  148. package/templates/dashboard/assets/app.css.manifest.json +2 -0
  149. package/templates/dashboard/assets/app.js +1071 -98
  150. package/templates/dashboard/assets/app.manifest.json +1 -0
  151. package/templates/dashboard/assets/css-src/00-foundation.css +12 -6
  152. package/templates/dashboard/assets/css-src/10-panels-flow.css +2 -2
  153. package/templates/dashboard/assets/css-src/30-task-index.css +21 -13
  154. package/templates/dashboard/assets/css-src/31-archive.css +94 -0
  155. package/templates/dashboard/assets/css-src/32-task-swimlane.css +487 -0
  156. package/templates/dashboard/assets/css-src/35-review-workspace.css +78 -0
  157. package/templates/dashboard/assets/css-src/40-detail-modules-migration.css +191 -14
  158. package/templates/dashboard/assets/css-src/50-responsive-overrides.css +23 -0
  159. package/templates/dashboard/assets/i18n.js +166 -2
  160. package/templates/development/README.md +9 -9
  161. package/templates/development/cross-repo-debugging.md +3 -3
  162. package/templates/development/external-context/service-template.md +1 -1
  163. package/templates/development/external-source-packs/README.md +2 -2
  164. package/templates/integrations/README.md +4 -4
  165. package/templates/integrations/api-contract.md +1 -1
  166. package/templates/integrations/event-contract.md +1 -1
  167. package/templates/integrations/third-party/vendor-template.md +1 -1
  168. package/templates/integrations/webhook-contract.md +1 -1
  169. package/templates/ledger/Harness-Ledger.md +1 -1
  170. package/templates/modules/module_brief.md +50 -0
  171. package/templates/modules/module_plan.md +49 -0
  172. package/templates/modules/registry_view.md +9 -0
  173. package/templates/modules/session_prompt_pack.md +55 -0
  174. package/templates/planning/brief.md +32 -8
  175. package/templates/planning/module_brief.md +28 -3
  176. package/templates/planning/module_plan.md +26 -11
  177. package/templates/planning/module_session_prompt.md +11 -2
  178. package/templates/planning/optional/slices/_slice-template/brief.md +28 -0
  179. package/templates/planning/review.md +1 -1
  180. package/templates/planning/visual_map.md +1 -1
  181. package/templates/reference/docs-library-standard.md +7 -7
  182. package/templates/reference/execution-workflow-standard.md +13 -0
  183. package/templates/reference/external-source-intake-standard.md +10 -10
  184. package/templates/reference/repo-governance-standard.md +1 -1
  185. package/templates/reference/review-routing-standard.md +4 -0
  186. package/templates/ssot/Module-Registry.md +4 -38
  187. package/templates/walkthrough/walkthrough-template.md +1 -1
  188. package/templates-zh-CN/AGENTS.md.template +27 -25
  189. package/templates-zh-CN/CLAUDE.md.template +1 -1
  190. package/templates-zh-CN/architecture/README.md +2 -2
  191. package/templates-zh-CN/architecture/service-catalog.md +2 -2
  192. package/templates-zh-CN/architecture/services/service-template.md +1 -1
  193. package/templates-zh-CN/development/README.md +9 -9
  194. package/templates-zh-CN/development/cross-repo-debugging.md +3 -3
  195. package/templates-zh-CN/development/external-context/service-template.md +1 -1
  196. package/templates-zh-CN/development/external-source-packs/README.md +2 -2
  197. package/templates-zh-CN/integrations/README.md +4 -4
  198. package/templates-zh-CN/integrations/api-contract.md +1 -1
  199. package/templates-zh-CN/integrations/event-contract.md +1 -1
  200. package/templates-zh-CN/integrations/third-party/vendor-template.md +1 -1
  201. package/templates-zh-CN/integrations/webhook-contract.md +1 -1
  202. package/templates-zh-CN/ledger/Harness-Ledger.md +1 -1
  203. package/templates-zh-CN/lessons/lesson-arch-process-change.md +1 -1
  204. package/templates-zh-CN/lessons/lesson-new-doc.md +3 -3
  205. package/templates-zh-CN/lessons/lesson-ref-change.md +4 -4
  206. package/templates-zh-CN/modules/module_brief.md +47 -0
  207. package/templates-zh-CN/modules/module_plan.md +48 -0
  208. package/templates-zh-CN/modules/registry_view.md +9 -0
  209. package/templates-zh-CN/modules/session_prompt_pack.md +50 -0
  210. package/templates-zh-CN/planning/INDEX.md +1 -0
  211. package/templates-zh-CN/planning/brief.md +26 -7
  212. package/templates-zh-CN/planning/module_brief.md +24 -2
  213. package/templates-zh-CN/planning/module_plan.md +35 -29
  214. package/templates-zh-CN/planning/module_session_prompt.md +15 -11
  215. package/templates-zh-CN/planning/optional/slices/_slice-template/brief.md +28 -11
  216. package/templates-zh-CN/planning/review.md +1 -1
  217. package/templates-zh-CN/reference/adversarial-review-standard.md +1 -1
  218. package/templates-zh-CN/reference/delivery-operating-model-standard.md +3 -3
  219. package/templates-zh-CN/reference/docs-library-standard.md +27 -27
  220. package/templates-zh-CN/reference/execution-workflow-standard.md +12 -2
  221. package/templates-zh-CN/reference/external-source-intake-standard.md +10 -10
  222. package/templates-zh-CN/reference/harness-ledger-standard.md +3 -3
  223. package/templates-zh-CN/reference/regression-ssot-governance.md +2 -2
  224. package/templates-zh-CN/reference/repo-governance-standard.md +1 -1
  225. package/templates-zh-CN/reference/review-routing-standard.md +3 -0
  226. package/templates-zh-CN/reference/walkthrough-standard.md +2 -2
  227. package/templates-zh-CN/reference/worktree-standard.md +1 -1
  228. package/templates-zh-CN/regression/Cadence-Ledger.md +2 -2
  229. package/templates-zh-CN/ssot/Delivery-SSoT.md +2 -2
  230. package/templates-zh-CN/ssot/Module-Registry.md +5 -44
  231. package/templates-zh-CN/ssot/Regression-SSoT.md +2 -2
  232. package/templates-zh-CN/walkthrough/walkthrough-template.md +4 -4
@@ -0,0 +1,487 @@
1
+ /* Read-only runtime swimlane heatmap */
2
+ .task-swimlane {
3
+ background: var(--paper);
4
+ border: 1px solid var(--line);
5
+ border-radius: 12px;
6
+ box-shadow: var(--shadow);
7
+ padding: var(--dashboard-card-padding);
8
+ overflow: hidden;
9
+ }
10
+
11
+ .task-swimlane.empty-state {
12
+ color: var(--muted);
13
+ font-weight: 700;
14
+ }
15
+
16
+ .swimlane-header {
17
+ display: flex;
18
+ justify-content: space-between;
19
+ gap: var(--dashboard-panel-gap);
20
+ align-items: flex-start;
21
+ margin-bottom: 12px;
22
+ }
23
+
24
+ .swimlane-header h2 {
25
+ margin: 2px 0 0;
26
+ font-size: 18px;
27
+ line-height: 1.2;
28
+ }
29
+
30
+ .swimlane-heatmap {
31
+ --swimlane-stage-columns: repeat(7, minmax(76px, 1fr));
32
+ display: flex;
33
+ flex-direction: column;
34
+ gap: 5px;
35
+ overflow-x: auto;
36
+ padding-bottom: 4px;
37
+ }
38
+
39
+ .swimlane-heatmap-row {
40
+ display: grid;
41
+ grid-template-columns: minmax(96px, 136px) var(--swimlane-stage-columns) 42px;
42
+ gap: 5px;
43
+ min-width: 0;
44
+ }
45
+
46
+ .swimlane-heatmap-head {
47
+ align-items: stretch;
48
+ }
49
+
50
+ .swimlane-heatmap-row > * {
51
+ min-width: 0;
52
+ }
53
+
54
+ .swimlane-axis-label,
55
+ .swimlane-total-header,
56
+ .swimlane-stage-header {
57
+ align-items: center;
58
+ background: var(--bg);
59
+ border: 1px solid var(--line);
60
+ border-radius: 8px;
61
+ color: var(--muted);
62
+ display: flex;
63
+ font-size: 10px;
64
+ font-weight: 800;
65
+ gap: 6px;
66
+ justify-content: space-between;
67
+ line-height: 1.2;
68
+ min-height: var(--dashboard-compact-row-height);
69
+ overflow: hidden;
70
+ padding: 6px;
71
+ text-transform: uppercase;
72
+ }
73
+
74
+ .swimlane-stage-header span {
75
+ overflow: hidden;
76
+ text-overflow: ellipsis;
77
+ }
78
+
79
+ .swimlane-stage-header strong,
80
+ .swimlane-row-total strong {
81
+ color: var(--ink);
82
+ font-size: 11px;
83
+ }
84
+
85
+ .swimlane-lane-button,
86
+ .swimlane-heat-cell,
87
+ .swimlane-mobile-module {
88
+ appearance: none;
89
+ border: 1px solid var(--line);
90
+ cursor: pointer;
91
+ font: inherit;
92
+ transition: background 0.18s ease, border-color 0.18s ease, transform 0.18s ease;
93
+ }
94
+
95
+ .swimlane-lane-button {
96
+ align-items: center;
97
+ background: var(--bg);
98
+ border-radius: 8px;
99
+ color: var(--ink);
100
+ display: flex;
101
+ gap: 10px;
102
+ justify-content: space-between;
103
+ min-height: var(--dashboard-compact-row-height);
104
+ padding: 6px 8px;
105
+ text-align: left;
106
+ }
107
+
108
+ .swimlane-lane-button strong {
109
+ font-size: 11px;
110
+ line-height: 1.2;
111
+ overflow-wrap: anywhere;
112
+ }
113
+
114
+ .swimlane-lane-button span {
115
+ color: var(--muted);
116
+ font-size: 11px;
117
+ font-weight: 800;
118
+ }
119
+
120
+ .swimlane-lane-button:hover,
121
+ .swimlane-lane-button.active,
122
+ .swimlane-mobile-module:hover,
123
+ .swimlane-mobile-module.active {
124
+ border-color: var(--accent);
125
+ }
126
+
127
+ .swimlane-heat-cell {
128
+ align-items: center;
129
+ background: transparent;
130
+ border-radius: 8px;
131
+ color: var(--ink);
132
+ display: flex;
133
+ justify-content: center;
134
+ min-height: var(--dashboard-compact-row-height);
135
+ padding: 0;
136
+ }
137
+
138
+ .swimlane-heat-cell span {
139
+ font-size: 14px;
140
+ font-weight: 900;
141
+ line-height: 1;
142
+ }
143
+
144
+ .swimlane-heat-cell.heat-0 {
145
+ color: color-mix(in srgb, var(--muted) 58%, transparent);
146
+ cursor: default;
147
+ opacity: 0.46;
148
+ }
149
+
150
+ .swimlane-heat-cell.heat-1 {
151
+ background: color-mix(in srgb, var(--accent) 12%, var(--paper));
152
+ border-color: color-mix(in srgb, var(--accent) 18%, var(--line));
153
+ }
154
+
155
+ .swimlane-heat-cell.heat-2 {
156
+ background: color-mix(in srgb, var(--accent) 24%, var(--paper));
157
+ border-color: color-mix(in srgb, var(--accent) 32%, var(--line));
158
+ }
159
+
160
+ .swimlane-heat-cell.heat-3 {
161
+ background: color-mix(in srgb, var(--accent) 40%, var(--paper));
162
+ border-color: color-mix(in srgb, var(--accent) 52%, var(--line));
163
+ }
164
+
165
+ .swimlane-heat-cell:not(:disabled):hover,
166
+ .swimlane-heat-cell.active {
167
+ border-color: var(--accent);
168
+ transform: translateY(-1px);
169
+ }
170
+
171
+ .swimlane-row-total {
172
+ align-items: center;
173
+ background: var(--paper);
174
+ border: 1px solid var(--line);
175
+ border-radius: 8px;
176
+ display: flex;
177
+ justify-content: center;
178
+ min-height: var(--dashboard-compact-row-height);
179
+ }
180
+
181
+ .swimlane-drilldown-host {
182
+ display: grid;
183
+ grid-template-rows: 0fr;
184
+ margin-top: 0;
185
+ transition: grid-template-rows 0.22s ease, margin-top 0.22s ease;
186
+ }
187
+
188
+ .swimlane-drilldown-host.open {
189
+ grid-template-rows: 1fr;
190
+ margin-top: 12px;
191
+ }
192
+
193
+ .swimlane-drilldown {
194
+ background: color-mix(in srgb, var(--bg) 70%, var(--paper));
195
+ border: 1px solid var(--line);
196
+ border-radius: 10px;
197
+ min-height: 0;
198
+ overflow: hidden;
199
+ padding: 10px;
200
+ }
201
+
202
+ .swimlane-drilldown-head {
203
+ align-items: flex-start;
204
+ display: flex;
205
+ gap: 10px;
206
+ justify-content: space-between;
207
+ margin-bottom: 8px;
208
+ }
209
+
210
+ .swimlane-drilldown-head h3 {
211
+ color: var(--ink);
212
+ font-size: 15px;
213
+ line-height: 1.25;
214
+ margin: 2px 0 0;
215
+ }
216
+
217
+ .swimlane-drilldown-actions {
218
+ align-items: center;
219
+ display: flex;
220
+ gap: 8px;
221
+ }
222
+
223
+ .swimlane-drilldown-actions span {
224
+ color: var(--muted);
225
+ font-size: 11px;
226
+ font-weight: 800;
227
+ white-space: nowrap;
228
+ }
229
+
230
+ .swimlane-drilldown-actions button {
231
+ background: var(--paper);
232
+ border: 1px solid var(--line);
233
+ border-radius: 7px;
234
+ color: var(--ink);
235
+ cursor: pointer;
236
+ font-size: 11px;
237
+ font-weight: 800;
238
+ padding: 6px 8px;
239
+ }
240
+
241
+ .swimlane-mini-board {
242
+ display: grid;
243
+ gap: 6px;
244
+ grid-template-columns: repeat(7, minmax(0, 1fr));
245
+ overflow-x: visible;
246
+ padding-bottom: 2px;
247
+ }
248
+
249
+ .swimlane-mini-column {
250
+ background: var(--paper);
251
+ border: 1px solid var(--line);
252
+ border-radius: 8px;
253
+ min-width: 0;
254
+ padding: 7px;
255
+ }
256
+
257
+ .swimlane-mini-column-head {
258
+ align-items: center;
259
+ color: var(--muted);
260
+ display: flex;
261
+ font-size: 10px;
262
+ font-weight: 800;
263
+ justify-content: space-between;
264
+ line-height: 1.2;
265
+ margin-bottom: 6px;
266
+ text-transform: uppercase;
267
+ }
268
+
269
+ .swimlane-card-list {
270
+ display: flex;
271
+ flex-direction: column;
272
+ gap: 6px;
273
+ }
274
+
275
+ .swimlane-card {
276
+ align-items: center;
277
+ background: var(--paper);
278
+ border: 1px solid var(--line);
279
+ border-radius: 7px;
280
+ cursor: pointer;
281
+ display: grid;
282
+ gap: 8px;
283
+ grid-template-columns: 8px minmax(0, 1fr) 30px;
284
+ min-height: 30px;
285
+ min-width: 0;
286
+ padding: 6px 7px;
287
+ transition: border-color 0.18s ease, transform 0.18s ease;
288
+ }
289
+
290
+ .swimlane-card:hover {
291
+ border-color: var(--accent);
292
+ transform: translateY(-1px);
293
+ }
294
+
295
+ .swimlane-status-dot {
296
+ background: var(--row-accent, var(--accent));
297
+ border-radius: 999px;
298
+ height: 8px;
299
+ width: 8px;
300
+ }
301
+
302
+ .swimlane-card strong {
303
+ color: var(--ink);
304
+ font-size: 12px;
305
+ line-height: 1.2;
306
+ overflow: hidden;
307
+ text-overflow: ellipsis;
308
+ white-space: nowrap;
309
+ }
310
+
311
+ .swimlane-progress {
312
+ background: var(--bg);
313
+ border-radius: 999px;
314
+ height: 5px;
315
+ overflow: hidden;
316
+ }
317
+
318
+ .swimlane-progress i {
319
+ background: var(--row-accent, var(--accent));
320
+ display: block;
321
+ height: 100%;
322
+ width: var(--task-progress, 0%);
323
+ }
324
+
325
+ .swimlane-mini-empty {
326
+ color: var(--muted);
327
+ display: block;
328
+ font-size: 11px;
329
+ font-weight: 700;
330
+ opacity: 0.72;
331
+ padding: 7px 2px;
332
+ }
333
+
334
+ .swimlane-stage-drilldown {
335
+ align-items: center;
336
+ appearance: none;
337
+ background: color-mix(in srgb, var(--accent) 8%, var(--paper));
338
+ border: 1px solid color-mix(in srgb, var(--accent) 22%, var(--line));
339
+ border-radius: 7px;
340
+ color: var(--ink);
341
+ cursor: pointer;
342
+ display: flex;
343
+ font: inherit;
344
+ gap: 6px;
345
+ justify-content: space-between;
346
+ margin-top: 6px;
347
+ min-height: 28px;
348
+ padding: 5px 7px;
349
+ width: 100%;
350
+ }
351
+
352
+ .swimlane-stage-drilldown span {
353
+ color: var(--accent);
354
+ font-size: 11px;
355
+ font-weight: 900;
356
+ }
357
+
358
+ .swimlane-stage-drilldown strong {
359
+ color: var(--muted);
360
+ font-size: 10px;
361
+ font-weight: 800;
362
+ overflow: hidden;
363
+ text-overflow: ellipsis;
364
+ text-transform: uppercase;
365
+ white-space: nowrap;
366
+ }
367
+
368
+ .swimlane-paged-list {
369
+ display: grid;
370
+ gap: 8px;
371
+ }
372
+
373
+ .swimlane-pager {
374
+ align-items: center;
375
+ display: flex;
376
+ gap: 8px;
377
+ justify-content: flex-end;
378
+ }
379
+
380
+ .swimlane-pager span {
381
+ color: var(--muted);
382
+ font-size: 11px;
383
+ font-weight: 800;
384
+ }
385
+
386
+ .swimlane-pager button {
387
+ appearance: none;
388
+ background: var(--paper);
389
+ border: 1px solid var(--line);
390
+ border-radius: 7px;
391
+ color: var(--ink);
392
+ cursor: pointer;
393
+ font: inherit;
394
+ font-size: 11px;
395
+ font-weight: 800;
396
+ padding: 5px 8px;
397
+ }
398
+
399
+ .swimlane-pager button:disabled {
400
+ color: var(--muted);
401
+ cursor: default;
402
+ opacity: 0.44;
403
+ }
404
+
405
+ .swimlane-mobile-list {
406
+ display: none;
407
+ }
408
+
409
+ @media (max-width: 760px) {
410
+ .task-swimlane {
411
+ padding: 12px;
412
+ }
413
+
414
+ .swimlane-header,
415
+ .swimlane-drilldown-head {
416
+ flex-direction: column;
417
+ gap: 8px;
418
+ }
419
+
420
+ .swimlane-heatmap {
421
+ display: none;
422
+ }
423
+
424
+ .swimlane-mobile-list {
425
+ display: flex;
426
+ flex-direction: column;
427
+ gap: 8px;
428
+ }
429
+
430
+ .swimlane-mobile-module {
431
+ align-items: flex-start;
432
+ background: var(--bg);
433
+ border-radius: 9px;
434
+ color: var(--ink);
435
+ display: flex;
436
+ flex-direction: column;
437
+ gap: 8px;
438
+ padding: 10px;
439
+ text-align: left;
440
+ }
441
+
442
+ .swimlane-mobile-module span:first-child {
443
+ align-items: center;
444
+ display: flex;
445
+ gap: 8px;
446
+ justify-content: space-between;
447
+ width: 100%;
448
+ }
449
+
450
+ .swimlane-mobile-module strong {
451
+ font-size: 13px;
452
+ overflow-wrap: anywhere;
453
+ }
454
+
455
+ .swimlane-mobile-module small {
456
+ color: var(--muted);
457
+ font-size: 11px;
458
+ font-weight: 800;
459
+ white-space: nowrap;
460
+ }
461
+
462
+ .swimlane-mobile-stages {
463
+ display: flex;
464
+ flex-wrap: wrap;
465
+ gap: 6px;
466
+ }
467
+
468
+ .swimlane-mobile-stages em {
469
+ background: var(--paper);
470
+ border: 1px solid var(--line);
471
+ border-radius: 999px;
472
+ color: var(--muted);
473
+ font-size: 10px;
474
+ font-style: normal;
475
+ font-weight: 800;
476
+ padding: 4px 6px;
477
+ }
478
+
479
+ .swimlane-mini-board {
480
+ grid-template-columns: 1fr;
481
+ overflow-x: visible;
482
+ }
483
+
484
+ .swimlane-card {
485
+ grid-template-columns: 8px minmax(0, 1fr) 42px;
486
+ }
487
+ }
@@ -94,6 +94,67 @@
94
94
  border-color: color-mix(in srgb, var(--accent) 54%, var(--line));
95
95
  }
96
96
 
97
+ .bulk-action-bar {
98
+ display: flex;
99
+ align-items: center;
100
+ flex-wrap: wrap;
101
+ gap: 10px;
102
+ margin-top: 12px;
103
+ padding: 10px 12px;
104
+ border: 1px solid var(--line);
105
+ border-radius: 8px;
106
+ background: var(--paper);
107
+ }
108
+
109
+ .bulk-select-all,
110
+ .bulk-card-check {
111
+ display: inline-flex;
112
+ align-items: center;
113
+ gap: 7px;
114
+ min-width: 0;
115
+ color: var(--ink);
116
+ font-size: 12px;
117
+ font-weight: 800;
118
+ }
119
+
120
+ .bulk-select-all input,
121
+ .bulk-card-check input {
122
+ width: 16px;
123
+ height: 16px;
124
+ accent-color: var(--accent);
125
+ }
126
+
127
+ .bulk-selected-count,
128
+ .bulk-action-result {
129
+ color: var(--muted);
130
+ font-size: 12px;
131
+ font-weight: 800;
132
+ }
133
+
134
+ .bulk-action-result.success {
135
+ color: var(--ok);
136
+ }
137
+
138
+ .bulk-action-result.failed {
139
+ color: var(--danger);
140
+ }
141
+
142
+ .bulk-action-bar button {
143
+ border: 1px solid var(--line);
144
+ background: var(--paper-2);
145
+ color: var(--ink);
146
+ border-radius: 8px;
147
+ padding: 8px 12px;
148
+ font-size: 12px;
149
+ font-weight: 800;
150
+ cursor: pointer;
151
+ }
152
+
153
+ .bulk-action-bar button:disabled {
154
+ cursor: not-allowed;
155
+ opacity: 0.55;
156
+ }
157
+
97
158
  .review-queue-list-shell {
98
159
  margin-top: 18px;
99
160
  max-height: clamp(560px, 72vh, 920px);
@@ -134,6 +195,11 @@
134
195
  justify-content: flex-start;
135
196
  }
136
197
 
198
+ .review-queue-card .bulk-card-check {
199
+ margin-left: auto;
200
+ padding: 4px 0;
201
+ }
202
+
137
203
  .review-queue-card .card-id,
138
204
  .review-queue-card .card-title,
139
205
  .review-queue-card .subtle,
@@ -225,6 +291,10 @@
225
291
  background: var(--paper-2);
226
292
  }
227
293
 
294
+ .lesson-candidate-panel.compact .bulk-action-bar {
295
+ display: none;
296
+ }
297
+
228
298
  .lesson-candidate-panel-head {
229
299
  display: flex;
230
300
  justify-content: space-between;
@@ -295,6 +365,14 @@
295
365
  min-width: 0;
296
366
  }
297
367
 
368
+ .lesson-bulk-check {
369
+ min-height: 32px;
370
+ border: 1px solid var(--line);
371
+ border-radius: 8px;
372
+ padding: 6px 9px;
373
+ background: var(--paper);
374
+ }
375
+
298
376
  .lesson-candidate-action a,
299
377
  .lesson-candidate-action button {
300
378
  display: inline-flex;