coding-agent-harness 1.0.2 → 1.0.5

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 (219) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/CONTRIBUTING.md +98 -0
  3. package/LICENSE +661 -21
  4. package/LICENSE-EXCEPTION.md +37 -0
  5. package/README.md +244 -87
  6. package/README.zh-CN.md +77 -35
  7. package/SKILL.md +32 -24
  8. package/docs-release/README.md +9 -5
  9. package/docs-release/architecture/overview.md +17 -5
  10. package/docs-release/architecture/overview.zh-CN.md +9 -5
  11. package/docs-release/architecture/system-explainer/01-system-overview.md +217 -0
  12. package/docs-release/architecture/system-explainer/02-module-dependency.md +257 -0
  13. package/docs-release/architecture/system-explainer/03-task-lifecycle.md +304 -0
  14. package/docs-release/architecture/system-explainer/04-check-and-governance.md +239 -0
  15. package/docs-release/architecture/system-explainer/05-data-flow.md +276 -0
  16. package/docs-release/architecture/system-explainer/06-preset-and-migration.md +303 -0
  17. package/docs-release/architecture/system-explainer/README.md +67 -0
  18. package/docs-release/architecture/system-explainer/en-US/01-system-overview.md +226 -0
  19. package/docs-release/architecture/system-explainer/en-US/02-module-dependency.md +263 -0
  20. package/docs-release/architecture/system-explainer/en-US/03-task-lifecycle.md +319 -0
  21. package/docs-release/architecture/system-explainer/en-US/04-check-and-governance.md +250 -0
  22. package/docs-release/architecture/system-explainer/en-US/05-data-flow.md +290 -0
  23. package/docs-release/architecture/system-explainer/en-US/06-preset-and-migration.md +323 -0
  24. package/docs-release/architecture/system-explainer/en-US/README.md +70 -0
  25. package/docs-release/assets/dashboard-overview.png +0 -0
  26. package/docs-release/guides/agent-installation.en-US.md +39 -15
  27. package/docs-release/guides/agent-installation.md +43 -16
  28. package/docs-release/guides/contributing.md +100 -0
  29. package/docs-release/guides/contributing.zh-CN.md +99 -0
  30. package/docs-release/guides/document-audience-and-surfaces.en-US.md +3 -2
  31. package/docs-release/guides/document-audience-and-surfaces.md +3 -2
  32. package/docs-release/guides/full-legacy-migration-subagent-strategy.md +2 -2
  33. package/docs-release/guides/full-legacy-migration-subagent-strategy.zh-CN.md +2 -2
  34. package/docs-release/guides/legacy-migration-agent-prompt.md +0 -11
  35. package/docs-release/guides/legacy-migration-agent-prompt.zh-CN.md +0 -11
  36. package/docs-release/guides/migration-playbook.en-US.md +14 -15
  37. package/docs-release/guides/migration-playbook.md +14 -15
  38. package/docs-release/guides/parent-control-repository-pattern.en-US.md +7 -5
  39. package/docs-release/guides/parent-control-repository-pattern.md +7 -5
  40. package/docs-release/guides/preset-development.md +238 -0
  41. package/docs-release/guides/repository-operating-models.en-US.md +5 -4
  42. package/docs-release/guides/repository-operating-models.md +5 -4
  43. package/docs-release/guides/task-state-machine.en-US.md +224 -0
  44. package/docs-release/guides/task-state-machine.md +231 -0
  45. package/docs-release/intl/en-US.md +1 -1
  46. package/docs-release/intl/zh-CN.md +1 -1
  47. package/examples/minimal-project/docs/09-PLANNING/TASKS/demo-task/INDEX.md +60 -0
  48. package/examples/minimal-project/docs/09-PLANNING/TASKS/demo-task/findings.md +7 -0
  49. package/package.json +10 -4
  50. package/presets/legacy-migration/checks/preset-check.mjs +3 -0
  51. package/presets/legacy-migration/preset.yaml +134 -0
  52. package/presets/legacy-migration/scripts/plan-work-queue.mjs +4 -0
  53. package/presets/legacy-migration/scripts/scaffold-task-contracts.mjs +4 -0
  54. package/presets/legacy-migration/templates/execution_strategy.append.md +18 -0
  55. package/presets/legacy-migration/templates/findings.seed.md +17 -0
  56. package/presets/legacy-migration/templates/review.seed.md +12 -0
  57. package/presets/legacy-migration/templates/task_plan.append.md +9 -0
  58. package/presets/legacy-migration/templates/visual_map.append.md +12 -0
  59. package/presets/legacy-migration/workbench/dashboard-panels.yaml +2 -0
  60. package/presets/legacy-migration/workbench/migration-queue.schema.json +23 -0
  61. package/presets/lesson-sedimentation/preset.yaml +23 -0
  62. package/presets/lesson-sedimentation/templates/prompt.md +23 -0
  63. package/presets/module/preset.yaml +25 -0
  64. package/presets/module/templates/execution_strategy.append.md +8 -0
  65. package/presets/module/templates/task_plan.append.md +17 -0
  66. package/presets/standard-task/preset.yaml +31 -0
  67. package/presets/standard-task/templates/task_plan.append.md +7 -0
  68. package/references/adversarial-review-standard.md +2 -2
  69. package/references/agents-md-pattern.md +2 -2
  70. package/references/delivery-operating-model-standard.md +3 -3
  71. package/references/docs-directory-standard.md +6 -7
  72. package/references/harness-ledger.md +53 -96
  73. package/references/lessons-governance.md +88 -93
  74. package/references/module-parallel-standard.md +14 -14
  75. package/references/planning-loop.md +12 -6
  76. package/references/pull-request-standard.md +118 -0
  77. package/references/repo-governance-standard.md +11 -2
  78. package/references/review-routing-standard.md +7 -1
  79. package/references/ssot-governance.md +67 -59
  80. package/references/taskr-gap-analysis.md +600 -0
  81. package/references/walkthrough-closeout.md +7 -7
  82. package/scripts/check-harness.mjs +40 -301
  83. package/scripts/commands/dashboard-command.mjs +67 -0
  84. package/scripts/commands/migration-command.mjs +126 -0
  85. package/scripts/commands/preset-command.mjs +73 -0
  86. package/scripts/commands/task-command.mjs +328 -0
  87. package/scripts/harness.mjs +59 -260
  88. package/scripts/lib/capability-registry.mjs +82 -28
  89. package/scripts/lib/check-module-parallel.mjs +230 -0
  90. package/scripts/lib/check-profiles.mjs +90 -228
  91. package/scripts/lib/check-task-contracts.mjs +55 -0
  92. package/scripts/lib/core-shared.mjs +65 -2
  93. package/scripts/lib/dashboard-data.mjs +155 -24
  94. package/scripts/lib/dashboard-workbench.mjs +131 -12
  95. package/scripts/lib/dashboard-writer.mjs +20 -4
  96. package/scripts/lib/git-status-summary.mjs +46 -0
  97. package/scripts/lib/governance-index-generator.mjs +174 -0
  98. package/scripts/lib/governance-sync.mjs +611 -0
  99. package/scripts/lib/governance-table-boundary.mjs +175 -0
  100. package/scripts/lib/harness-core.mjs +6 -0
  101. package/scripts/lib/lesson-maintenance.mjs +36 -29
  102. package/scripts/lib/markdown-utils.mjs +33 -0
  103. package/scripts/lib/migration-planner.mjs +4 -6
  104. package/scripts/lib/migration-support.mjs +1 -1
  105. package/scripts/lib/phase-kind.mjs +50 -0
  106. package/scripts/lib/preset-audit-contracts.mjs +37 -0
  107. package/scripts/lib/preset-engine.mjs +494 -0
  108. package/scripts/lib/preset-registry.mjs +776 -0
  109. package/scripts/lib/preset-resource-contracts.mjs +83 -0
  110. package/scripts/lib/review-confirm-git-gate.mjs +248 -0
  111. package/scripts/lib/status-builder.mjs +88 -0
  112. package/scripts/lib/status-dashboard-renderer.mjs +105 -0
  113. package/scripts/lib/subagent-authorization-audit.mjs +196 -0
  114. package/scripts/lib/task-audit-metadata.mjs +385 -0
  115. package/scripts/lib/task-audit-migration.mjs +350 -0
  116. package/scripts/lib/task-completion-consistency.mjs +26 -0
  117. package/scripts/lib/task-index.mjs +93 -0
  118. package/scripts/lib/task-lesson-candidates.mjs +242 -0
  119. package/scripts/lib/task-lesson-sedimentation.mjs +326 -0
  120. package/scripts/lib/task-lifecycle/create-task-helpers.mjs +67 -0
  121. package/scripts/lib/task-lifecycle/phase-sync.mjs +88 -0
  122. package/scripts/lib/task-lifecycle/review-confirm.mjs +112 -0
  123. package/scripts/lib/task-lifecycle/review-gates.mjs +73 -0
  124. package/scripts/lib/task-lifecycle/review-submission.mjs +63 -0
  125. package/scripts/lib/task-lifecycle/scaffold-provenance.mjs +49 -0
  126. package/scripts/lib/task-lifecycle/template-files.mjs +53 -0
  127. package/scripts/lib/task-lifecycle/text-utils.mjs +24 -0
  128. package/scripts/lib/task-lifecycle.mjs +338 -477
  129. package/scripts/lib/task-metadata.mjs +118 -0
  130. package/scripts/lib/task-review-model.mjs +455 -0
  131. package/scripts/lib/task-scanner.mjs +193 -372
  132. package/scripts/lib/task-tombstone-commands.mjs +140 -0
  133. package/scripts/postinstall.mjs +14 -0
  134. package/skills/preset-creator/SKILL.md +179 -0
  135. package/skills/preset-creator/references/complex-task-skeleton/README.md +31 -0
  136. package/skills/preset-creator/references/complex-task-skeleton/artifacts/INDEX.md +12 -0
  137. package/skills/preset-creator/references/complex-task-skeleton/brief.md +43 -0
  138. package/skills/preset-creator/references/complex-task-skeleton/execution_strategy.md +71 -0
  139. package/skills/preset-creator/references/complex-task-skeleton/findings.md +24 -0
  140. package/skills/preset-creator/references/complex-task-skeleton/lesson_candidates.md +70 -0
  141. package/skills/preset-creator/references/complex-task-skeleton/long-running-task-contract.md +76 -0
  142. package/skills/preset-creator/references/complex-task-skeleton/progress.md +33 -0
  143. package/skills/preset-creator/references/complex-task-skeleton/references/INDEX.md +13 -0
  144. package/skills/preset-creator/references/complex-task-skeleton/review.md +107 -0
  145. package/skills/preset-creator/references/complex-task-skeleton/task_plan.md +111 -0
  146. package/skills/preset-creator/references/complex-task-skeleton/visual_map.md +50 -0
  147. package/skills/preset-creator/references/preset-package-skeleton.md +296 -0
  148. package/templates/AGENTS.md.template +24 -18
  149. package/templates/dashboard/assets/app-src/00-state.js +13 -0
  150. package/templates/dashboard/assets/app-src/10-router.js +5 -1
  151. package/templates/dashboard/assets/app-src/20-overview.js +18 -8
  152. package/templates/dashboard/assets/app-src/30-tasks.js +92 -246
  153. package/templates/dashboard/assets/app-src/35-task-detail.js +286 -0
  154. package/templates/dashboard/assets/app-src/45-review.js +241 -22
  155. package/templates/dashboard/assets/app-src/50-migration.js +24 -10
  156. package/templates/dashboard/assets/app-src/55-presets.js +375 -0
  157. package/templates/dashboard/assets/app-src/60-shared.js +3 -1
  158. package/templates/dashboard/assets/app-src/90-bindings.js +302 -29
  159. package/templates/dashboard/assets/app.css +1501 -376
  160. package/templates/dashboard/assets/app.css.manifest.json +10 -0
  161. package/templates/dashboard/assets/app.js +1240 -101
  162. package/templates/dashboard/assets/app.manifest.json +2 -0
  163. package/templates/dashboard/assets/css-src/00-foundation.css +346 -0
  164. package/templates/dashboard/assets/css-src/10-panels-flow.css +236 -0
  165. package/templates/dashboard/assets/css-src/20-briefs-controls.css +398 -0
  166. package/templates/dashboard/assets/css-src/30-task-index.css +739 -0
  167. package/templates/dashboard/assets/css-src/35-review-workspace.css +507 -0
  168. package/templates/dashboard/assets/css-src/40-detail-modules-migration.css +489 -0
  169. package/templates/dashboard/assets/css-src/45-presets.css +516 -0
  170. package/templates/dashboard/assets/css-src/50-responsive-overrides.css +551 -0
  171. package/templates/dashboard/assets/i18n.js +263 -23
  172. package/templates/ledger/Harness-Ledger.md +13 -25
  173. package/templates/lessons/lesson-arch-process-change.md +1 -1
  174. package/templates/lessons/lesson-new-doc.md +1 -1
  175. package/templates/lessons/lesson-ref-change.md +1 -1
  176. package/templates/planning/INDEX.md +87 -0
  177. package/templates/planning/brief.md +1 -1
  178. package/templates/planning/execution_strategy.md +31 -0
  179. package/templates/planning/lesson_candidates.md +18 -6
  180. package/templates/planning/module_session_prompt.md +1 -0
  181. package/templates/planning/optional/artifacts/INDEX.md +3 -3
  182. package/templates/planning/optional/references/INDEX.md +3 -3
  183. package/templates/planning/review.md +41 -0
  184. package/templates/planning/task_plan.md +5 -21
  185. package/templates/planning/visual_map.md +13 -9
  186. package/templates/planning/visual_map.simple.md +52 -0
  187. package/templates/reference/execution-workflow-standard.md +31 -3
  188. package/templates/reference/pull-request-standard.md +80 -0
  189. package/templates/reference/repo-governance-standard.md +7 -6
  190. package/templates/reference/review-routing-standard.md +6 -0
  191. package/templates/reference/walkthrough-standard.md +2 -1
  192. package/templates/verifier/verifier-output.md +1 -1
  193. package/templates-zh-CN/AGENTS.md.template +25 -19
  194. package/templates-zh-CN/ledger/Harness-Ledger.md +17 -40
  195. package/templates-zh-CN/planning/INDEX.md +87 -0
  196. package/templates-zh-CN/planning/brief.md +1 -1
  197. package/templates-zh-CN/planning/execution_strategy.md +30 -0
  198. package/templates-zh-CN/planning/lesson_candidates.md +18 -6
  199. package/templates-zh-CN/planning/module_session_prompt.md +1 -0
  200. package/templates-zh-CN/planning/review.md +41 -1
  201. package/templates-zh-CN/planning/task_plan.md +4 -44
  202. package/templates-zh-CN/planning/visual_map.md +14 -7
  203. package/templates-zh-CN/planning/visual_map.simple.md +48 -0
  204. package/templates-zh-CN/reference/adversarial-review-standard.md +1 -1
  205. package/templates-zh-CN/reference/docs-library-standard.md +1 -1
  206. package/templates-zh-CN/reference/execution-workflow-standard.md +33 -7
  207. package/templates-zh-CN/reference/harness-ledger-standard.md +2 -2
  208. package/templates-zh-CN/reference/pull-request-standard.md +106 -0
  209. package/templates-zh-CN/reference/repo-governance-standard.md +4 -3
  210. package/templates-zh-CN/reference/review-routing-standard.md +8 -1
  211. package/templates-zh-CN/reference/walkthrough-standard.md +3 -2
  212. package/templates-zh-CN/walkthrough/Closeout-SSoT.md +1 -1
  213. package/docs-release/assets/dashboard-overview-en.png +0 -0
  214. package/scripts/smoke-dashboard.mjs +0 -92
  215. package/scripts/test-harness.mjs +0 -1395
  216. package/templates/ssot/Feature-SSoT.md +0 -43
  217. package/templates/ssot/Lessons-SSoT.md +0 -44
  218. package/templates-zh-CN/ssot/Feature-SSoT.md +0 -49
  219. package/templates-zh-CN/ssot/Lessons-SSoT.md +0 -49
@@ -176,6 +176,7 @@ button, input, select {
176
176
  letter-spacing: 0.08em;
177
177
  margin: 0 0 6px;
178
178
  text-transform: uppercase;
179
+ overflow-wrap: anywhere;
179
180
  }
180
181
 
181
182
  .hero-actions {
@@ -232,9 +233,15 @@ button, input, select {
232
233
  margin-top: 16px;
233
234
  }
234
235
 
235
- @media (min-width: 1024px) {
236
+ .dashboard-main,
237
+ .dashboard-sidebar,
238
+ .status-card-group {
239
+ min-width: 0;
240
+ }
241
+
242
+ @media (min-width: 1280px) {
236
243
  .dashboard-grid {
237
- grid-template-columns: minmax(0, 2fr) minmax(320px, 1fr);
244
+ grid-template-columns: minmax(0, 1fr) minmax(300px, 360px);
238
245
  align-items: start;
239
246
  }
240
247
  }
@@ -287,6 +294,10 @@ button, input, select {
287
294
  animation: pulse-warn 4s infinite;
288
295
  }
289
296
 
297
+ .status-primary.snapshot {
298
+ border-color: rgba(71, 85, 105, 0.3);
299
+ }
300
+
290
301
  .status-primary.fail {
291
302
  border-color: rgba(225, 29, 72, 0.3);
292
303
  animation: pulse-fail 4s infinite;
@@ -341,6 +352,20 @@ button, input, select {
341
352
  gap: 18px;
342
353
  align-items: center;
343
354
  margin-bottom: 16px;
355
+ min-width: 0;
356
+ }
357
+
358
+ .section-head > div {
359
+ min-width: 0;
360
+ }
361
+
362
+ .section-actions {
363
+ display: flex;
364
+ flex-wrap: wrap;
365
+ justify-content: flex-end;
366
+ align-items: center;
367
+ gap: 10px;
368
+ min-width: 0;
344
369
  }
345
370
 
346
371
  .section-head h2,
@@ -351,6 +376,7 @@ button, input, select {
351
376
  font-size: 18px;
352
377
  font-weight: 800;
353
378
  letter-spacing: -0.015em;
379
+ overflow-wrap: anywhere;
354
380
  }
355
381
 
356
382
  .flow-panel,
@@ -568,6 +594,13 @@ button, input, select {
568
594
  gap: 16px;
569
595
  }
570
596
 
597
+ .brief-scroll {
598
+ max-height: min(58vh, 620px);
599
+ overflow-y: auto;
600
+ padding: 2px 8px 2px 2px;
601
+ scrollbar-gutter: stable;
602
+ }
603
+
571
604
  .brief-card {
572
605
  background: var(--paper);
573
606
  border: 1px solid var(--line);
@@ -597,6 +630,38 @@ button, input, select {
597
630
  border-color: var(--line);
598
631
  }
599
632
 
633
+ .copy-task-name {
634
+ border: 1px solid var(--line);
635
+ background: var(--paper-2);
636
+ color: var(--muted);
637
+ border-radius: 6px;
638
+ padding: 5px 8px;
639
+ font-size: 11px;
640
+ font-weight: 800;
641
+ line-height: 1.2;
642
+ cursor: pointer;
643
+ white-space: nowrap;
644
+ }
645
+
646
+ .copy-task-name:hover {
647
+ color: var(--accent);
648
+ border-color: color-mix(in srgb, var(--accent) 38%, var(--line));
649
+ }
650
+
651
+ .copy-task-name.compact,
652
+ .copy-task-name.row-copy {
653
+ padding: 4px 7px;
654
+ }
655
+
656
+ .copy-task-name.row-copy {
657
+ margin-top: 8px;
658
+ width: fit-content;
659
+ }
660
+
661
+ .copy-task-name.detail-copy {
662
+ margin-top: 10px;
663
+ }
664
+
600
665
  .card-head {
601
666
  display: flex;
602
667
  justify-content: space-between;
@@ -676,6 +741,8 @@ button, input, select {
676
741
 
677
742
  /* Premium Typography & Markdown Rendering */
678
743
  .markdown {
744
+ min-width: 0;
745
+ max-width: 100%;
679
746
  line-height: 1.6;
680
747
  overflow-wrap: anywhere;
681
748
  font-size: 14px;
@@ -710,6 +777,7 @@ button, input, select {
710
777
  }
711
778
 
712
779
  .markdown pre {
780
+ max-width: 100%;
713
781
  overflow: auto;
714
782
  background: var(--paper-2);
715
783
  border: 1px solid var(--line);
@@ -738,6 +806,7 @@ button, input, select {
738
806
  }
739
807
 
740
808
  .rendered-table-wrap {
809
+ max-width: 100%;
741
810
  overflow: auto;
742
811
  border: 1px solid var(--line);
743
812
  border-radius: 8px;
@@ -1153,6 +1222,12 @@ button, input, select {
1153
1222
  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
1154
1223
  }
1155
1224
 
1225
+ .sort-toggle-group .layout-btn {
1226
+ min-width: 0;
1227
+ white-space: normal;
1228
+ line-height: 1.25;
1229
+ }
1230
+
1156
1231
  /* Beautiful taskstatsbar metrics strip */
1157
1232
  .task-stats-bar {
1158
1233
  display: flex;
@@ -1296,6 +1371,7 @@ button, input, select {
1296
1371
  background: var(--paper);
1297
1372
  transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
1298
1373
  position: relative;
1374
+ cursor: pointer;
1299
1375
  }
1300
1376
 
1301
1377
  .task-row-card:hover {
@@ -1555,109 +1631,6 @@ button, input, select {
1555
1631
  border: 1px solid var(--line);
1556
1632
  }
1557
1633
 
1558
- .review-queue-stats {
1559
- display: grid;
1560
- grid-template-columns: 1fr;
1561
- gap: 10px;
1562
- }
1563
-
1564
- .review-queue-stats .metric {
1565
- min-height: 82px;
1566
- padding: 14px;
1567
- }
1568
-
1569
- .review-queue-summary {
1570
- display: grid;
1571
- gap: 14px;
1572
- }
1573
-
1574
- .review-queue-card {
1575
- gap: 14px;
1576
- }
1577
-
1578
- .review-queue-card .side-panel {
1579
- box-shadow: none;
1580
- background: var(--bg);
1581
- padding: 14px;
1582
- }
1583
-
1584
- .review-queue-actions {
1585
- display: flex;
1586
- gap: 10px;
1587
- flex-wrap: wrap;
1588
- align-items: center;
1589
- }
1590
-
1591
- .review-queue-actions a,
1592
- .review-queue-actions button {
1593
- border: 1px solid var(--line);
1594
- background: var(--paper-2);
1595
- color: var(--ink);
1596
- border-radius: 8px;
1597
- padding: 8px 12px;
1598
- font-size: 12px;
1599
- font-weight: 800;
1600
- text-decoration: none;
1601
- cursor: pointer;
1602
- }
1603
-
1604
- .review-queue-actions a:hover,
1605
- .review-queue-actions button:hover {
1606
- border-color: var(--accent);
1607
- }
1608
-
1609
- .runtime-banner {
1610
- display: flex;
1611
- flex-wrap: wrap;
1612
- gap: 10px;
1613
- align-items: center;
1614
- margin: 14px 0;
1615
- padding: 12px 16px;
1616
- border: 1px solid rgba(217, 119, 6, 0.22);
1617
- border-radius: 10px;
1618
- background: rgba(217, 119, 6, 0.08);
1619
- color: var(--ink);
1620
- }
1621
-
1622
- .runtime-banner span {
1623
- color: var(--muted);
1624
- }
1625
-
1626
- .runtime-banner code {
1627
- font-family: var(--font-mono);
1628
- font-size: 12px;
1629
- }
1630
-
1631
- .review-workspace {
1632
- display: grid;
1633
- gap: 20px;
1634
- }
1635
-
1636
- .review-workspace-grid {
1637
- display: grid;
1638
- grid-template-columns: minmax(0, 1fr);
1639
- gap: 20px;
1640
- }
1641
-
1642
- @media (min-width: 1180px) {
1643
- .review-workspace-grid {
1644
- grid-template-columns: minmax(0, 2fr) minmax(320px, 420px);
1645
- align-items: start;
1646
- }
1647
- }
1648
-
1649
- .review-workspace-side {
1650
- position: sticky;
1651
- top: 16px;
1652
- }
1653
-
1654
- .review-hero-tags {
1655
- display: flex;
1656
- flex-wrap: wrap;
1657
- justify-content: flex-end;
1658
- gap: 8px;
1659
- }
1660
-
1661
1634
  /* Beautiful Group Header styling */
1662
1635
  .task-group {
1663
1636
  background: var(--paper);
@@ -1748,419 +1721,1519 @@ button, input, select {
1748
1721
  color: var(--accent);
1749
1722
  }
1750
1723
 
1751
- /* Detail view panels */
1752
- .detail-hero {
1753
- display: flex;
1754
- justify-content: space-between;
1755
- gap: 18px;
1756
- padding: 24px;
1757
- margin-bottom: 20px;
1724
+ .review-queue-stats {
1725
+ display: grid;
1726
+ grid-template-columns: 1fr;
1727
+ gap: 10px;
1758
1728
  }
1759
1729
 
1760
- .detail-hero > div {
1761
- min-width: 0;
1730
+ .review-queue-stats .metric {
1731
+ min-height: 82px;
1732
+ padding: 14px;
1762
1733
  }
1763
1734
 
1764
- .crumbs,
1765
- .eyebrow {
1766
- overflow-wrap: anywhere;
1735
+ .review-queue-summary {
1736
+ display: grid;
1737
+ gap: 14px;
1767
1738
  }
1768
1739
 
1769
- .detail-score {
1770
- font-size: 42px;
1740
+ .review-queue-tabs {
1741
+ display: grid;
1742
+ grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
1743
+ gap: 8px;
1744
+ margin-top: 18px;
1745
+ }
1746
+
1747
+ .review-queue-tab {
1748
+ display: flex;
1749
+ justify-content: space-between;
1750
+ align-items: center;
1751
+ gap: 10px;
1752
+ min-height: 44px;
1753
+ border: 1px solid var(--line);
1754
+ border-radius: 8px;
1755
+ background: var(--paper-2);
1756
+ color: var(--ink);
1757
+ padding: 10px 12px;
1771
1758
  font-weight: 800;
1772
- color: var(--accent);
1773
- line-height: 1;
1759
+ text-align: left;
1760
+ cursor: pointer;
1774
1761
  }
1775
1762
 
1776
- .phase-timeline {
1777
- display: grid;
1778
- grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
1779
- gap: 12px;
1780
- margin-bottom: 24px;
1763
+ .review-queue-tab strong {
1764
+ font-family: var(--font-mono);
1765
+ color: var(--muted);
1781
1766
  }
1782
1767
 
1783
- .phase-timeline h2 {
1784
- grid-column: 1 / -1;
1785
- margin: 0 0 4px;
1786
- font-size: 16px;
1768
+ .review-queue-tab.active {
1769
+ border-color: var(--accent);
1770
+ background: color-mix(in srgb, var(--accent) 10%, var(--paper));
1787
1771
  }
1788
1772
 
1789
- .phase-step {
1790
- background: var(--paper);
1773
+ .review-queue-toolbar {
1774
+ display: grid;
1775
+ grid-template-columns: minmax(240px, 1fr) minmax(180px, 240px) minmax(160px, 220px);
1776
+ gap: 12px;
1777
+ align-items: end;
1778
+ margin-top: 18px;
1779
+ padding: 12px;
1791
1780
  border: 1px solid var(--line);
1792
- border-radius: 12px;
1793
- padding: 16px;
1794
- box-shadow: var(--shadow);
1795
- transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);
1781
+ border-radius: 8px;
1782
+ background: var(--paper-2);
1796
1783
  }
1797
1784
 
1798
- .phase-step:hover {
1799
- transform: translateY(-2px);
1800
- box-shadow: var(--shadow-hover);
1785
+ .review-queue-toolbar .input-group,
1786
+ .review-queue-toolbar .select-group {
1787
+ display: grid;
1788
+ gap: 6px;
1789
+ min-width: 0;
1801
1790
  }
1802
1791
 
1803
- .phase-step strong {
1804
- font-size: 14px;
1792
+ .review-queue-toolbar label {
1793
+ font-size: 11px;
1805
1794
  font-weight: 800;
1806
- }
1807
-
1808
- .phase-step p {
1809
1795
  color: var(--muted);
1810
- min-height: 42px;
1811
- font-size: 12px;
1812
- margin: 8px 0;
1813
- line-height: 1.4;
1796
+ text-transform: uppercase;
1814
1797
  }
1815
1798
 
1816
- .detail-grid {
1817
- display: grid;
1818
- grid-template-columns: minmax(0, 1.8fr) minmax(280px, 360px);
1819
- gap: 20px;
1820
- align-items: start;
1799
+ .review-queue-toolbar input,
1800
+ .review-queue-toolbar select {
1801
+ width: 100%;
1802
+ min-width: 0;
1803
+ border: 1px solid var(--line);
1804
+ background: var(--paper);
1805
+ color: var(--ink);
1806
+ border-radius: 8px;
1807
+ padding: 9px 12px;
1808
+ font-size: 13px;
1809
+ font-weight: 650;
1810
+ line-height: 1.25;
1821
1811
  }
1822
1812
 
1823
- .detail-main {
1824
- display: grid;
1825
- gap: 20px;
1813
+ .review-queue-toolbar input:focus,
1814
+ .review-queue-toolbar select:focus {
1815
+ outline: 2px solid color-mix(in srgb, var(--accent) 28%, transparent);
1816
+ outline-offset: 1px;
1817
+ border-color: color-mix(in srgb, var(--accent) 54%, var(--line));
1826
1818
  }
1827
1819
 
1828
- .doc-section {
1829
- padding: 24px;
1820
+ .review-queue-list-shell {
1821
+ margin-top: 18px;
1822
+ max-height: clamp(560px, 72vh, 920px);
1823
+ overflow: auto;
1824
+ overscroll-behavior: contain;
1825
+ padding: 2px 8px 2px 2px;
1826
+ border-radius: 10px;
1827
+ scrollbar-gutter: stable;
1830
1828
  }
1831
1829
 
1832
- .doc-library {
1833
- padding: 22px;
1830
+ .review-queue-list-shell:focus {
1831
+ outline: 2px solid color-mix(in srgb, var(--accent) 45%, transparent);
1832
+ outline-offset: 3px;
1834
1833
  }
1835
1834
 
1836
- .doc-accordion-list {
1835
+ .review-queue-list {
1837
1836
  display: grid;
1837
+ grid-template-columns: repeat(auto-fit, minmax(min(100%, 360px), 1fr));
1838
+ gap: 14px;
1839
+ align-items: start;
1840
+ }
1841
+
1842
+ .review-queue-list > .empty-state {
1843
+ grid-column: 1 / -1;
1844
+ }
1845
+
1846
+ .review-queue-card {
1847
+ gap: 12px;
1848
+ min-width: 0;
1849
+ max-height: clamp(520px, 68vh, 680px);
1850
+ overflow: auto;
1851
+ scrollbar-gutter: stable;
1852
+ }
1853
+
1854
+ .review-queue-card .card-header {
1855
+ flex-wrap: wrap;
1856
+ align-items: flex-start;
1857
+ justify-content: flex-start;
1858
+ }
1859
+
1860
+ .review-queue-card .card-id,
1861
+ .review-queue-card .card-title,
1862
+ .review-queue-card .subtle,
1863
+ .review-reason span {
1864
+ overflow-wrap: anywhere;
1865
+ }
1866
+
1867
+ .review-queue-card .subtle,
1868
+ .review-reason span {
1869
+ display: -webkit-box;
1870
+ -webkit-box-orient: vertical;
1871
+ -webkit-line-clamp: 2;
1872
+ overflow: hidden;
1873
+ }
1874
+
1875
+ .review-queue-card .side-panel {
1876
+ box-shadow: none;
1877
+ background: var(--bg);
1878
+ padding: 14px;
1879
+ }
1880
+
1881
+ .review-queue-actions {
1882
+ display: flex;
1838
1883
  gap: 10px;
1884
+ flex-wrap: wrap;
1885
+ align-items: center;
1839
1886
  }
1840
1887
 
1841
- .doc-accordion {
1888
+ .review-queue-actions a,
1889
+ .review-queue-actions button {
1842
1890
  border: 1px solid var(--line);
1843
- border-radius: 10px;
1844
1891
  background: var(--paper-2);
1845
- overflow: clip;
1892
+ color: var(--ink);
1893
+ border-radius: 8px;
1894
+ padding: 8px 12px;
1895
+ font-size: 12px;
1896
+ font-weight: 800;
1897
+ text-decoration: none;
1898
+ cursor: pointer;
1846
1899
  }
1847
1900
 
1848
- .doc-accordion[open] {
1849
- background: var(--paper);
1850
- box-shadow: 0 10px 28px rgba(15, 23, 42, 0.08);
1901
+ .review-queue-actions a:hover,
1902
+ .review-queue-actions button:hover {
1903
+ border-color: var(--accent);
1851
1904
  }
1852
1905
 
1853
- .doc-accordion summary {
1854
- cursor: pointer;
1855
- display: grid;
1856
- grid-template-columns: minmax(120px, max-content) minmax(0, 1fr);
1857
- gap: 12px;
1858
- align-items: center;
1859
- padding: 14px 16px;
1860
- list-style: none;
1906
+ .review-queue-actions button:disabled {
1907
+ cursor: not-allowed;
1908
+ opacity: 0.55;
1861
1909
  }
1862
1910
 
1863
- .doc-accordion summary::-webkit-details-marker {
1864
- display: none;
1911
+ .review-reasons {
1912
+ display: grid;
1913
+ gap: 8px;
1865
1914
  }
1866
1915
 
1867
- .doc-accordion summary::before {
1868
- content: "›";
1869
- width: 20px;
1870
- height: 20px;
1871
- display: inline-grid;
1872
- place-items: center;
1873
- grid-column: 1;
1874
- grid-row: 1;
1875
- margin-right: 8px;
1876
- color: var(--accent);
1877
- transform: rotate(0deg);
1878
- transition: transform 0.2s ease;
1916
+ .review-reason {
1917
+ display: grid;
1918
+ gap: 3px;
1919
+ padding: 10px 12px;
1920
+ border: 1px solid var(--line);
1921
+ border-radius: 8px;
1922
+ background: var(--paper-2);
1879
1923
  }
1880
1924
 
1881
- .doc-accordion[open] summary::before {
1882
- transform: rotate(90deg);
1925
+ .review-reason strong {
1926
+ font-size: 12px;
1927
+ color: var(--ink);
1883
1928
  }
1884
1929
 
1885
- .doc-accordion summary span {
1886
- grid-column: 1;
1887
- grid-row: 1;
1888
- padding-left: 28px;
1889
- font-weight: 850;
1890
- color: var(--ink);
1930
+ .review-reason span {
1931
+ color: var(--muted);
1932
+ font-size: 12px;
1933
+ line-height: 1.45;
1891
1934
  }
1892
1935
 
1893
- .doc-accordion summary small {
1936
+ .lesson-candidate-panel {
1937
+ display: grid;
1938
+ gap: 10px;
1894
1939
  min-width: 0;
1940
+ padding: 12px;
1941
+ border: 1px solid var(--line);
1942
+ border-radius: 8px;
1943
+ background: var(--paper);
1895
1944
  overflow: hidden;
1896
- text-overflow: ellipsis;
1897
- white-space: nowrap;
1945
+ }
1946
+
1947
+ .lesson-candidate-panel.compact {
1948
+ background: var(--paper-2);
1949
+ }
1950
+
1951
+ .lesson-candidate-panel-head {
1952
+ display: flex;
1953
+ justify-content: space-between;
1954
+ align-items: start;
1955
+ gap: 10px;
1956
+ min-width: 0;
1957
+ }
1958
+
1959
+ .lesson-candidate-panel-head h3 {
1960
+ margin: 2px 0 0;
1961
+ font-size: 14px;
1962
+ line-height: 1.25;
1963
+ }
1964
+
1965
+ .lesson-action-note {
1966
+ margin: 0;
1898
1967
  color: var(--muted);
1899
- font-family: var(--font-mono);
1900
- font-size: 11px;
1968
+ font-size: 12px;
1969
+ line-height: 1.45;
1901
1970
  }
1902
1971
 
1903
- .doc-accordion .markdown {
1904
- border-top: 1px solid var(--line);
1905
- padding: 18px 22px 22px;
1972
+ .lesson-candidate-actions {
1973
+ display: grid;
1974
+ gap: 8px;
1975
+ max-height: clamp(190px, 32vh, 320px);
1976
+ overflow: auto;
1977
+ min-width: 0;
1978
+ scrollbar-gutter: stable;
1906
1979
  }
1907
1980
 
1908
- .detail-side {
1981
+ .lesson-candidate-action {
1909
1982
  display: grid;
1910
- gap: 16px;
1911
- position: sticky;
1912
- top: 16px;
1983
+ grid-template-columns: minmax(0, 1fr);
1984
+ gap: 6px;
1985
+ padding: 10px 12px;
1986
+ border: 1px solid var(--line);
1987
+ border-radius: 8px;
1988
+ background: var(--paper-2);
1913
1989
  }
1914
1990
 
1915
- .side-panel {
1916
- padding: 20px;
1991
+ .lesson-candidate-panel.compact .lesson-candidate-action {
1992
+ background: var(--paper);
1917
1993
  }
1918
1994
 
1919
- .side-panel a {
1995
+ .lesson-candidate-main {
1996
+ display: grid;
1997
+ gap: 4px;
1998
+ min-width: 0;
1999
+ }
2000
+
2001
+ .lesson-candidate-action strong,
2002
+ .lesson-candidate-action span,
2003
+ .lesson-candidate-action small {
2004
+ min-width: 0;
2005
+ overflow-wrap: anywhere;
2006
+ }
2007
+
2008
+ .lesson-candidate-action small {
2009
+ color: var(--muted);
2010
+ font-size: 12px;
2011
+ }
2012
+
2013
+ .lesson-candidate-command-row {
2014
+ display: flex;
2015
+ flex-wrap: wrap;
2016
+ gap: 8px;
2017
+ align-items: center;
2018
+ min-width: 0;
2019
+ }
2020
+
2021
+ .lesson-candidate-action a,
2022
+ .lesson-candidate-action button {
1920
2023
  display: inline-flex;
1921
- margin: 6px 6px 0 0;
1922
- padding: 6px 12px;
1923
- border-radius: 999px; /* Pill */
1924
- background: var(--paper-2);
2024
+ justify-content: center;
2025
+ align-items: center;
1925
2026
  border: 1px solid var(--line);
2027
+ background: var(--paper);
2028
+ color: var(--ink);
2029
+ border-radius: 8px;
2030
+ padding: 7px 10px;
2031
+ font-size: 12px;
2032
+ font-weight: 800;
2033
+ text-decoration: none;
2034
+ }
2035
+
2036
+ .lesson-candidate-action button:disabled {
2037
+ cursor: not-allowed;
2038
+ opacity: 0.55;
2039
+ }
2040
+
2041
+ .lesson-candidate-action .review-result {
2042
+ display: block;
2043
+ min-width: 0;
2044
+ }
2045
+
2046
+ .lesson-candidate-action .review-result:empty {
2047
+ display: none;
2048
+ }
2049
+
2050
+ .lesson-candidate-more {
2051
+ display: block;
2052
+ border: 1px dashed var(--line);
2053
+ border-radius: 8px;
2054
+ padding: 8px 10px;
2055
+ color: var(--muted);
1926
2056
  font-size: 12px;
1927
2057
  font-weight: 700;
1928
- transition: all 0.2s ease;
2058
+ background: var(--paper);
2059
+ text-decoration: none;
1929
2060
  }
1930
2061
 
1931
- .side-panel a:hover {
1932
- background: var(--accent);
1933
- color: var(--paper);
1934
- border-color: var(--accent);
1935
- transform: scale(1.03);
2062
+ .task-queue-reasons {
2063
+ grid-column: 1 / -1;
1936
2064
  }
1937
2065
 
1938
- .finding {
2066
+ .task-queue-reasons .review-reasons {
2067
+ margin-top: 8px;
2068
+ max-height: 220px;
2069
+ overflow: auto;
2070
+ }
2071
+
2072
+ .review-queue-pager {
2073
+ display: flex;
2074
+ justify-content: flex-end;
2075
+ margin-top: 16px;
2076
+ }
2077
+
2078
+ .review-queue-contract {
1939
2079
  display: grid;
1940
- gap: 4px;
1941
- padding: 10px 0;
1942
- border-bottom: 1px solid var(--line);
2080
+ gap: 8px;
2081
+ margin: 0;
1943
2082
  }
1944
2083
 
1945
- .finding:last-child {
1946
- border-bottom: none;
2084
+ .review-queue-contract div {
2085
+ display: flex;
2086
+ justify-content: space-between;
2087
+ gap: 12px;
2088
+ border-top: 1px solid var(--line);
2089
+ padding-top: 8px;
1947
2090
  }
1948
2091
 
1949
- .finding.open {
1950
- color: var(--danger);
1951
- border-left: 2px solid var(--danger);
1952
- padding-left: 8px;
2092
+ .review-queue-contract dt,
2093
+ .review-queue-contract dd {
2094
+ margin: 0;
1953
2095
  }
1954
2096
 
1955
- .finding strong {
1956
- font-size: 12px;
1957
- text-transform: uppercase;
1958
- letter-spacing: 0.05em;
2097
+ .review-queue-contract dt {
2098
+ color: var(--muted);
1959
2099
  }
1960
2100
 
1961
- .finding span {
1962
- font-size: 13px;
1963
- font-weight: 500;
2101
+ .review-queue-contract dd {
2102
+ font-family: var(--font-mono);
2103
+ color: var(--ink);
2104
+ }
2105
+
2106
+ .runtime-banner {
2107
+ display: flex;
2108
+ flex-wrap: wrap;
2109
+ gap: 10px;
2110
+ align-items: center;
2111
+ margin: 14px 0;
2112
+ padding: 12px 16px;
2113
+ border: 1px solid rgba(217, 119, 6, 0.22);
2114
+ border-radius: 10px;
2115
+ background: rgba(217, 119, 6, 0.08);
2116
+ color: var(--ink);
2117
+ }
2118
+
2119
+ .runtime-banner span {
2120
+ color: var(--muted);
2121
+ }
2122
+
2123
+ .runtime-banner code {
2124
+ font-family: var(--font-mono);
2125
+ font-size: 12px;
2126
+ }
2127
+
2128
+ .review-workspace {
2129
+ display: grid;
2130
+ gap: 20px;
2131
+ min-width: 0;
2132
+ max-width: 100%;
2133
+ }
2134
+
2135
+ .review-workspace-grid {
2136
+ display: grid;
2137
+ grid-template-columns: minmax(0, 1fr);
2138
+ gap: 20px;
2139
+ min-width: 0;
2140
+ max-width: 100%;
2141
+ }
2142
+
2143
+ .review-workspace-main,
2144
+ .review-workspace-side,
2145
+ .review-doc-panel {
2146
+ min-width: 0;
2147
+ max-width: 100%;
2148
+ }
2149
+
2150
+ .review-doc-scroll {
2151
+ max-height: min(58vh, 560px);
2152
+ overflow: auto;
2153
+ overscroll-behavior: contain;
2154
+ scrollbar-gutter: stable;
2155
+ border-radius: 8px;
2156
+ }
2157
+
2158
+ .workbench-action-result {
2159
+ display: flex;
2160
+ flex-wrap: wrap;
2161
+ align-items: center;
2162
+ gap: 7px;
2163
+ margin-top: 2px;
2164
+ padding: 9px 10px;
2165
+ border: 1px solid var(--line);
2166
+ border-radius: 8px;
2167
+ background: var(--paper);
2168
+ font-size: 12px;
2169
+ line-height: 1.45;
2170
+ }
2171
+
2172
+ .workbench-action-result strong,
2173
+ .workbench-action-result span,
2174
+ .workbench-action-result ul {
2175
+ flex: 1 0 100%;
2176
+ }
2177
+
2178
+ .workbench-action-result.success {
2179
+ border-color: color-mix(in srgb, var(--ok) 45%, var(--line));
2180
+ }
2181
+
2182
+ .workbench-action-result.failed {
2183
+ border-color: color-mix(in srgb, var(--danger) 42%, var(--line));
2184
+ }
2185
+
2186
+ .workbench-action-result a,
2187
+ .workbench-action-result button {
2188
+ margin: 0;
2189
+ }
2190
+
2191
+ .workbench-action-result ul {
2192
+ margin: 0;
2193
+ padding-left: 18px;
2194
+ color: var(--muted);
2195
+ }
2196
+
2197
+ @media (min-width: 1280px) {
2198
+ .review-workspace-grid {
2199
+ grid-template-columns: minmax(0, 1fr) minmax(300px, 380px);
2200
+ align-items: start;
2201
+ }
2202
+ }
2203
+
2204
+ .review-workspace-side {
2205
+ position: sticky;
2206
+ top: 16px;
2207
+ }
2208
+
2209
+ .review-hero-tags {
2210
+ display: flex;
2211
+ flex-wrap: wrap;
2212
+ justify-content: flex-end;
2213
+ gap: 8px;
2214
+ }
2215
+
2216
+ @media (max-width: 900px) {
2217
+ .review-queue-toolbar {
2218
+ grid-template-columns: 1fr;
2219
+ }
2220
+
2221
+ .review-queue-list {
2222
+ grid-template-columns: 1fr;
2223
+ }
2224
+ }
2225
+
2226
+ @media (min-width: 901px) and (max-width: 1279px) {
2227
+ .review-queue-list {
2228
+ grid-template-columns: repeat(auto-fit, minmax(min(100%, 360px), 1fr));
2229
+ }
2230
+ }
2231
+
2232
+ /* Detail view panels */
2233
+ .detail-hero {
2234
+ display: flex;
2235
+ justify-content: space-between;
2236
+ gap: 18px;
2237
+ padding: 24px;
2238
+ margin-bottom: 20px;
2239
+ }
2240
+
2241
+ .detail-hero > div {
2242
+ min-width: 0;
2243
+ }
2244
+
2245
+ .crumbs,
2246
+ .eyebrow {
2247
+ overflow-wrap: anywhere;
2248
+ }
2249
+
2250
+ .detail-score {
2251
+ font-size: 42px;
2252
+ font-weight: 800;
2253
+ color: var(--accent);
2254
+ line-height: 1;
2255
+ }
2256
+
2257
+ .phase-timeline {
2258
+ display: grid;
2259
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
2260
+ gap: 12px;
2261
+ margin-bottom: 24px;
2262
+ }
2263
+
2264
+ .phase-timeline h2 {
2265
+ grid-column: 1 / -1;
2266
+ margin: 0 0 4px;
2267
+ font-size: 16px;
2268
+ }
2269
+
2270
+ .phase-kind-group {
2271
+ display: grid;
2272
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
2273
+ grid-column: 1 / -1;
2274
+ gap: 12px;
2275
+ }
2276
+
2277
+ .phase-kind-group h3 {
2278
+ grid-column: 1 / -1;
2279
+ margin: 4px 0 0;
2280
+ color: var(--muted);
2281
+ font-size: 12px;
2282
+ font-weight: 800;
2283
+ text-transform: uppercase;
2284
+ letter-spacing: 0;
2285
+ }
2286
+
2287
+ .phase-step {
2288
+ background: var(--paper);
2289
+ border: 1px solid var(--line);
2290
+ border-radius: 12px;
2291
+ padding: 16px;
2292
+ box-shadow: var(--shadow);
2293
+ transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);
2294
+ cursor: pointer;
2295
+ }
2296
+
2297
+ .phase-step.init {
2298
+ border-left: 4px solid #64748b;
2299
+ }
2300
+
2301
+ .phase-step.execution {
2302
+ border-left: 4px solid var(--accent);
2303
+ }
2304
+
2305
+ .phase-step.gate {
2306
+ border-left: 4px solid #9f7aea;
2307
+ }
2308
+
2309
+ .phase-step.other {
2310
+ border-left: 4px solid var(--warn);
2311
+ }
2312
+
2313
+ .card-header-actions {
2314
+ display: flex;
2315
+ align-items: center;
2316
+ justify-content: flex-end;
2317
+ gap: 8px;
2318
+ min-width: 0;
2319
+ }
2320
+
2321
+ .phase-step:hover {
2322
+ transform: translateY(-2px);
2323
+ box-shadow: var(--shadow-hover);
2324
+ }
2325
+
2326
+ .phase-step strong {
2327
+ font-size: 14px;
2328
+ font-weight: 800;
2329
+ }
2330
+
2331
+ .phase-step-head {
2332
+ display: flex;
2333
+ align-items: center;
2334
+ justify-content: space-between;
2335
+ gap: 8px;
2336
+ }
2337
+
2338
+ .phase-step-head span {
2339
+ color: var(--muted);
2340
+ font-size: 12px;
2341
+ white-space: nowrap;
2342
+ }
2343
+
2344
+ .phase-step p {
2345
+ color: var(--muted);
2346
+ min-height: 42px;
2347
+ font-size: 12px;
2348
+ margin: 8px 0;
2349
+ line-height: 1.4;
2350
+ }
2351
+
2352
+ .phase-meta {
2353
+ display: flex;
2354
+ flex-wrap: wrap;
2355
+ gap: 6px;
2356
+ margin-top: 8px;
2357
+ }
2358
+
2359
+ .phase-exit-command {
2360
+ display: block;
2361
+ margin-top: 10px;
2362
+ overflow-wrap: anywhere;
2363
+ color: var(--ink);
2364
+ font-size: 11px;
2365
+ line-height: 1.4;
2366
+ }
2367
+
2368
+ .detail-grid {
2369
+ display: grid;
2370
+ grid-template-columns: minmax(0, 1.8fr) minmax(280px, 360px);
2371
+ gap: 20px;
2372
+ align-items: start;
2373
+ }
2374
+
2375
+ .detail-main {
2376
+ display: grid;
2377
+ gap: 20px;
2378
+ }
2379
+
2380
+ .doc-section {
2381
+ padding: 24px;
2382
+ min-width: 0;
2383
+ max-width: 100%;
2384
+ overflow: hidden;
2385
+ }
2386
+
2387
+ .doc-library {
2388
+ padding: 22px;
2389
+ }
2390
+
2391
+ .doc-accordion-list {
2392
+ display: grid;
2393
+ gap: 10px;
2394
+ }
2395
+
2396
+ .doc-accordion {
2397
+ border: 1px solid var(--line);
2398
+ border-radius: 10px;
2399
+ background: var(--paper-2);
2400
+ overflow: clip;
2401
+ }
2402
+
2403
+ .doc-accordion[open] {
2404
+ background: var(--paper);
2405
+ box-shadow: 0 10px 28px rgba(15, 23, 42, 0.08);
2406
+ }
2407
+
2408
+ .doc-accordion summary {
2409
+ cursor: pointer;
2410
+ display: grid;
2411
+ grid-template-columns: minmax(120px, max-content) minmax(0, 1fr);
2412
+ gap: 12px;
2413
+ align-items: center;
2414
+ padding: 14px 16px;
2415
+ list-style: none;
2416
+ }
2417
+
2418
+ .doc-accordion summary::-webkit-details-marker {
2419
+ display: none;
2420
+ }
2421
+
2422
+ .doc-accordion summary::before {
2423
+ content: "›";
2424
+ width: 20px;
2425
+ height: 20px;
2426
+ display: inline-grid;
2427
+ place-items: center;
2428
+ grid-column: 1;
2429
+ grid-row: 1;
2430
+ margin-right: 8px;
2431
+ color: var(--accent);
2432
+ transform: rotate(0deg);
2433
+ transition: transform 0.2s ease;
2434
+ }
2435
+
2436
+ .doc-accordion[open] summary::before {
2437
+ transform: rotate(90deg);
2438
+ }
2439
+
2440
+ .doc-accordion summary span {
2441
+ grid-column: 1;
2442
+ grid-row: 1;
2443
+ padding-left: 28px;
2444
+ font-weight: 850;
2445
+ color: var(--ink);
2446
+ }
2447
+
2448
+ .doc-accordion summary small {
2449
+ min-width: 0;
2450
+ overflow: hidden;
2451
+ text-overflow: ellipsis;
2452
+ white-space: nowrap;
2453
+ color: var(--muted);
2454
+ font-family: var(--font-mono);
2455
+ font-size: 11px;
2456
+ }
2457
+
2458
+ .doc-accordion .markdown {
2459
+ border-top: 1px solid var(--line);
2460
+ padding: 18px 22px 22px;
2461
+ }
2462
+
2463
+ .detail-side {
2464
+ display: grid;
2465
+ gap: 16px;
2466
+ position: sticky;
2467
+ top: 16px;
2468
+ }
2469
+
2470
+ .side-panel {
2471
+ padding: 20px;
2472
+ min-width: 0;
2473
+ max-width: 100%;
2474
+ }
2475
+
2476
+ .side-panel a {
2477
+ display: inline-flex;
2478
+ margin: 6px 6px 0 0;
2479
+ padding: 6px 12px;
2480
+ border-radius: 8px;
2481
+ background: var(--paper-2);
2482
+ border: 1px solid var(--line);
2483
+ font-size: 12px;
2484
+ font-weight: 700;
2485
+ transition: all 0.2s ease;
2486
+ }
2487
+
2488
+ .side-panel a:hover {
2489
+ background: var(--accent);
2490
+ color: var(--paper);
2491
+ border-color: var(--accent);
2492
+ }
2493
+
2494
+ .finding {
2495
+ display: grid;
2496
+ gap: 4px;
2497
+ padding: 10px 0;
2498
+ border-bottom: 1px solid var(--line);
2499
+ }
2500
+
2501
+ .finding:last-child {
2502
+ border-bottom: none;
2503
+ }
2504
+
2505
+ .finding.open {
2506
+ color: var(--danger);
2507
+ border-left: 2px solid var(--danger);
2508
+ padding-left: 8px;
2509
+ }
2510
+
2511
+ .finding strong {
2512
+ font-size: 12px;
2513
+ text-transform: uppercase;
2514
+ letter-spacing: 0.05em;
2515
+ }
2516
+
2517
+ .finding span {
2518
+ font-size: 13px;
2519
+ font-weight: 500;
2520
+ }
2521
+
2522
+ /* Module Grid */
2523
+ .module-grid {
2524
+ display: grid;
2525
+ grid-template-columns: repeat(auto-fit, minmax(min(100%, 400px), 1fr));
2526
+ gap: 16px;
2527
+ }
2528
+
2529
+ .module-card {
2530
+ padding: 24px;
2531
+ }
2532
+
2533
+ .module-more {
2534
+ display: inline-flex;
2535
+ margin-top: 14px;
2536
+ padding: 8px 16px;
2537
+ border-radius: 999px;
2538
+ background: var(--paper-2);
2539
+ border: 1px solid var(--line);
2540
+ font-size: 12px;
2541
+ font-weight: 700;
2542
+ transition: all 0.2s ease;
2543
+ }
2544
+
2545
+ .module-more:hover {
2546
+ background: var(--accent);
2547
+ color: var(--paper);
2548
+ border-color: var(--accent);
2549
+ }
2550
+
2551
+ /* Migration workbench */
2552
+ .migration-grid {
2553
+ display: grid;
2554
+ grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
2555
+ gap: 12px;
2556
+ margin-bottom: 16px;
2557
+ }
2558
+
2559
+ .migration-grid > div,
2560
+ .migration-grid > button,
2561
+ .lesson {
2562
+ background: var(--paper-2);
2563
+ color: var(--ink);
2564
+ border: 1px solid var(--line);
2565
+ border-radius: 10px;
2566
+ padding: 16px;
2567
+ text-align: left;
2568
+ transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);
2569
+ }
2570
+
2571
+ .migration-grid > button {
2572
+ cursor: pointer;
2573
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.01);
2574
+ }
2575
+
2576
+ .migration-grid > button.active,
2577
+ .migration-grid > button:hover {
2578
+ border-color: var(--accent);
2579
+ background: var(--paper);
2580
+ transform: translateY(-2px);
2581
+ box-shadow: var(--shadow);
2582
+ }
2583
+
2584
+ .migration-grid p {
2585
+ margin: 6px 0 0;
2586
+ color: var(--muted);
2587
+ font-size: 12px;
2588
+ }
2589
+
2590
+ .warning-workbench {
2591
+ border-top: 1px solid var(--line);
2592
+ padding-top: 20px;
2593
+ }
2594
+
2595
+ .warning-toolbar,
2596
+ .pager {
2597
+ display: flex;
2598
+ align-items: center;
2599
+ gap: 10px;
2600
+ flex-wrap: wrap;
2601
+ }
2602
+
2603
+ .warning-toolbar {
2604
+ justify-content: space-between;
2605
+ margin-bottom: 14px;
2606
+ color: var(--muted);
2607
+ font-size: 13px;
2608
+ font-weight: 500;
2609
+ }
2610
+
2611
+ .pager button {
2612
+ border: 1px solid var(--line);
2613
+ background: var(--paper);
2614
+ color: var(--ink);
2615
+ border-radius: 999px;
2616
+ padding: 6px 14px;
2617
+ font-size: 12px;
2618
+ font-weight: 700;
2619
+ cursor: pointer;
2620
+ transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
2621
+ }
2622
+
2623
+ .pager button:disabled {
2624
+ opacity: 0.3;
2625
+ cursor: not-allowed;
2626
+ }
2627
+
2628
+ .pager button:hover:not(:disabled) {
2629
+ background: var(--paper-2);
2630
+ border-color: var(--muted);
2631
+ }
2632
+
2633
+ .warning-list {
2634
+ display: grid;
2635
+ border: 1px solid var(--line);
2636
+ border-radius: 12px;
2637
+ overflow: hidden;
2638
+ box-shadow: var(--shadow);
2639
+ }
2640
+
2641
+ .warning-row {
2642
+ display: grid;
2643
+ grid-template-columns: minmax(220px, 1.2fr) auto 80px 120px 140px minmax(220px, 1.5fr);
2644
+ gap: 12px;
2645
+ align-items: center;
2646
+ padding: 14px 18px;
2647
+ background: var(--paper);
2648
+ border-bottom: 1px solid var(--line);
2649
+ transition: all 0.2s ease;
2650
+ }
2651
+
2652
+ .warning-row:last-child {
2653
+ border-bottom: 0;
2654
+ }
2655
+
2656
+ .warning-row:hover {
2657
+ background: var(--paper-2);
2658
+ }
2659
+
2660
+ .warning-row p {
2661
+ margin: 0;
2662
+ color: var(--muted);
2663
+ font-size: 12px;
2664
+ font-weight: 500;
2665
+ line-height: 1.4;
2666
+ }
2667
+
2668
+ .warning-row strong {
2669
+ font-size: 13px;
2670
+ font-weight: 800;
2671
+ }
2672
+
2673
+ .lesson + .lesson {
2674
+ margin-top: 10px;
2675
+ }
2676
+
2677
+ .lesson:hover {
2678
+ transform: translateY(-1px);
2679
+ box-shadow: var(--shadow);
2680
+ }
2681
+
2682
+ .health-panel {
2683
+ display: grid;
2684
+ grid-template-columns: 280px minmax(0, 1fr);
2685
+ gap: 24px;
2686
+ }
2687
+
2688
+ .health-lists {
2689
+ display: grid;
2690
+ gap: 10px;
2691
+ }
2692
+
2693
+ details {
2694
+ background: var(--paper-2);
2695
+ border: 1px solid var(--line);
2696
+ border-radius: 8px;
2697
+ padding: 12px 16px;
2698
+ transition: all 0.2s ease;
2699
+ }
2700
+
2701
+ details[open] {
2702
+ background: var(--paper);
2703
+ border-color: var(--accent);
2704
+ }
2705
+
2706
+ details summary {
2707
+ font-weight: 700;
2708
+ cursor: pointer;
2709
+ font-size: 13px;
2710
+ }
2711
+
2712
+ .empty {
2713
+ color: var(--muted);
2714
+ border: 2px dashed var(--line);
2715
+ border-radius: 8px;
2716
+ padding: 24px;
2717
+ text-align: center;
2718
+ font-weight: 500;
2719
+ font-size: 13px;
2720
+ }
2721
+
2722
+ /* Preset Workbench */
2723
+ .presets-page {
2724
+ min-width: 0;
2725
+ }
2726
+
2727
+ .preset-command-center,
2728
+ .preset-collection-panel,
2729
+ .preset-detail-panel,
2730
+ .preset-layer-panel,
2731
+ .preset-context-actions,
2732
+ .preset-context-actions .side-panel {
2733
+ min-width: 0;
2734
+ }
2735
+
2736
+ .preset-count-pill {
2737
+ border: 1px solid var(--line);
2738
+ border-radius: 999px;
2739
+ background: var(--paper-2);
2740
+ color: var(--muted);
2741
+ font-size: 12px;
2742
+ font-weight: 800;
2743
+ padding: 7px 11px;
2744
+ }
2745
+
2746
+ .preset-priority-strip {
2747
+ display: grid;
2748
+ grid-template-columns: repeat(3, minmax(0, 1fr));
2749
+ gap: 10px;
2750
+ margin: 18px 0;
2751
+ }
2752
+
2753
+ .preset-priority-step {
2754
+ display: flex;
2755
+ align-items: center;
2756
+ gap: 10px;
2757
+ border: 1px solid var(--line);
2758
+ border-radius: 8px;
2759
+ background: var(--paper-2);
2760
+ padding: 10px 12px;
2761
+ min-width: 0;
2762
+ }
2763
+
2764
+ .preset-priority-step span {
2765
+ display: inline-grid;
2766
+ place-items: center;
2767
+ width: 22px;
2768
+ height: 22px;
2769
+ border-radius: 999px;
2770
+ background: var(--accent);
2771
+ color: white;
2772
+ font-size: 12px;
2773
+ font-weight: 900;
2774
+ flex: 0 0 auto;
2775
+ }
2776
+
2777
+ .preset-priority-step strong {
2778
+ font-size: 13px;
2779
+ overflow-wrap: anywhere;
2780
+ }
2781
+
2782
+ .preset-toolbar {
2783
+ display: grid;
2784
+ grid-template-columns: minmax(220px, 1fr) auto;
2785
+ gap: 14px;
2786
+ align-items: center;
2787
+ }
2788
+
2789
+ .preset-source-tabs {
2790
+ display: flex;
2791
+ flex-wrap: wrap;
2792
+ gap: 8px;
2793
+ justify-content: flex-end;
2794
+ }
2795
+
2796
+ .preset-source-tabs button {
2797
+ display: inline-flex;
2798
+ align-items: center;
2799
+ gap: 8px;
2800
+ border: 1px solid var(--line);
2801
+ background: var(--paper);
2802
+ color: var(--ink);
2803
+ border-radius: 8px;
2804
+ padding: 9px 12px;
2805
+ font-size: 12px;
2806
+ font-weight: 800;
2807
+ }
2808
+
2809
+ .preset-source-tabs button.active {
2810
+ border-color: var(--accent);
2811
+ background: var(--paper-2);
2812
+ box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--accent) 20%, transparent);
2813
+ }
2814
+
2815
+ .preset-workspace {
2816
+ display: grid;
2817
+ grid-template-columns: minmax(300px, 0.82fr) minmax(420px, 1.25fr) minmax(300px, 0.86fr);
2818
+ gap: 18px;
2819
+ align-items: start;
2820
+ }
2821
+
2822
+ .preset-panel-heading {
2823
+ display: flex;
2824
+ justify-content: space-between;
2825
+ gap: 12px;
2826
+ align-items: flex-start;
2827
+ margin-bottom: 14px;
2828
+ }
2829
+
2830
+ .preset-panel-heading h3 {
2831
+ margin: 0;
2832
+ font-size: 16px;
2833
+ line-height: 1.2;
2834
+ }
2835
+
2836
+ .preset-panel-heading p,
2837
+ .preset-helper,
2838
+ .preset-action-group p {
2839
+ margin: 4px 0 0;
2840
+ color: var(--muted);
2841
+ font-size: 12px;
2842
+ line-height: 1.45;
2843
+ }
2844
+
2845
+ .preset-catalog-list {
2846
+ display: grid;
2847
+ gap: 12px;
2848
+ }
2849
+
2850
+ .preset-card {
2851
+ border: 1px solid var(--line);
2852
+ border-radius: 8px;
2853
+ background: var(--paper);
2854
+ padding: 14px;
2855
+ display: grid;
2856
+ gap: 10px;
2857
+ min-width: 0;
2858
+ }
2859
+
2860
+ .preset-card.active {
2861
+ border-color: var(--accent);
2862
+ background: var(--paper-2);
2863
+ box-shadow: inset 3px 0 0 var(--accent);
2864
+ }
2865
+
2866
+ .preset-card.shadowed {
2867
+ opacity: 0.78;
2868
+ }
2869
+
2870
+ .preset-card-topline {
2871
+ display: flex;
2872
+ justify-content: space-between;
2873
+ gap: 10px;
2874
+ align-items: flex-start;
2875
+ min-width: 0;
2876
+ }
2877
+
2878
+ .preset-card-tools,
2879
+ .preset-detail-badges {
2880
+ display: flex;
2881
+ flex-wrap: wrap;
2882
+ gap: 6px;
2883
+ justify-content: flex-end;
2884
+ flex: 0 1 auto;
2885
+ }
2886
+
2887
+ .preset-card-select,
2888
+ .preset-card-body,
2889
+ .preset-layer-row {
2890
+ appearance: none;
2891
+ border: 0;
2892
+ background: transparent;
2893
+ color: inherit;
2894
+ padding: 0;
2895
+ text-align: left;
2896
+ cursor: pointer;
2897
+ min-width: 0;
2898
+ }
2899
+
2900
+ .preset-card-select {
2901
+ flex: 1 1 auto;
2902
+ }
2903
+
2904
+ .card-id {
2905
+ display: block;
2906
+ font-size: 15px;
2907
+ font-weight: 850;
2908
+ line-height: 1.25;
2909
+ overflow-wrap: anywhere;
2910
+ }
2911
+
2912
+ .preset-card-body {
2913
+ display: block;
2914
+ width: 100%;
2915
+ }
2916
+
2917
+ .preset-card-body span,
2918
+ .preset-detail-panel p {
2919
+ display: block;
2920
+ margin: 0;
2921
+ color: var(--muted);
2922
+ font-size: 13px;
2923
+ line-height: 1.55;
2924
+ overflow-wrap: anywhere;
2925
+ }
2926
+
2927
+ .preset-card-meta {
2928
+ display: flex;
2929
+ flex-wrap: wrap;
2930
+ gap: 8px;
2931
+ color: var(--muted);
2932
+ font-size: 11px;
2933
+ font-weight: 800;
2934
+ }
2935
+
2936
+ .preset-source-badge.project {
2937
+ border-color: color-mix(in srgb, var(--accent) 45%, var(--line));
2938
+ }
2939
+
2940
+ .copy-inline {
2941
+ appearance: none;
2942
+ border: 1px solid var(--line);
2943
+ background: var(--paper);
2944
+ color: var(--ink);
2945
+ border-radius: 7px;
2946
+ padding: 5px 8px;
2947
+ font-size: 11px;
2948
+ font-weight: 800;
2949
+ line-height: 1.1;
2950
+ cursor: pointer;
2951
+ white-space: nowrap;
2952
+ }
2953
+
2954
+ .copy-inline:hover,
2955
+ .preset-card-select:hover .card-id,
2956
+ .preset-card-body:hover span,
2957
+ .preset-layer-row:hover strong {
2958
+ color: var(--accent);
2959
+ }
2960
+
2961
+ .preset-detail-hero {
2962
+ display: grid;
2963
+ grid-template-columns: minmax(0, 1fr) auto;
2964
+ gap: 18px;
2965
+ align-items: start;
2966
+ padding-bottom: 16px;
2967
+ border-bottom: 1px solid var(--line);
2968
+ }
2969
+
2970
+ .preset-detail-title-row {
2971
+ display: flex;
2972
+ flex-wrap: wrap;
2973
+ gap: 10px;
2974
+ align-items: center;
2975
+ }
2976
+
2977
+ .preset-detail-title-row h3 {
2978
+ margin: 0;
2979
+ font-size: 22px;
2980
+ line-height: 1.15;
2981
+ overflow-wrap: anywhere;
2982
+ }
2983
+
2984
+ .preset-detail-list {
2985
+ display: grid;
2986
+ grid-template-columns: repeat(2, minmax(0, 1fr));
2987
+ gap: 0;
2988
+ margin: 16px 0;
2989
+ border: 1px solid var(--line);
2990
+ border-radius: 8px;
2991
+ overflow: hidden;
2992
+ }
2993
+
2994
+ .preset-detail-list div {
2995
+ display: grid;
2996
+ gap: 4px;
2997
+ padding: 11px 12px;
2998
+ border-right: 1px solid var(--line);
2999
+ border-bottom: 1px solid var(--line);
3000
+ min-width: 0;
3001
+ }
3002
+
3003
+ .preset-detail-list div:nth-child(2n) {
3004
+ border-right: 0;
3005
+ }
3006
+
3007
+ .preset-detail-list dt {
3008
+ color: var(--muted);
3009
+ font-size: 11px;
3010
+ font-weight: 800;
3011
+ }
3012
+
3013
+ .preset-detail-list dd {
3014
+ margin: 0;
3015
+ font-size: 14px;
3016
+ font-weight: 850;
3017
+ line-height: 1.3;
3018
+ overflow-wrap: anywhere;
1964
3019
  }
1965
3020
 
1966
- /* Module Grid */
1967
- .module-grid {
3021
+ .preset-path-block {
1968
3022
  display: grid;
1969
- grid-template-columns: repeat(auto-fit, minmax(min(100%, 400px), 1fr));
1970
- gap: 16px;
3023
+ gap: 8px;
3024
+ margin-top: 14px;
1971
3025
  }
1972
3026
 
1973
- .module-card {
1974
- padding: 24px;
3027
+ .preset-path-block > span {
3028
+ color: var(--muted);
3029
+ font-size: 11px;
3030
+ font-weight: 800;
1975
3031
  }
1976
3032
 
1977
- .module-more {
1978
- display: inline-flex;
1979
- margin-top: 14px;
1980
- padding: 8px 16px;
1981
- border-radius: 999px;
1982
- background: var(--paper-2);
3033
+ .preset-manifest-path {
3034
+ display: block;
3035
+ max-width: 100%;
3036
+ white-space: normal;
3037
+ overflow-wrap: anywhere;
3038
+ word-break: break-word;
1983
3039
  border: 1px solid var(--line);
1984
- font-size: 12px;
1985
- font-weight: 700;
1986
- transition: all 0.2s ease;
1987
- }
1988
-
1989
- .module-more:hover {
1990
- background: var(--accent);
1991
- color: var(--paper);
1992
- border-color: var(--accent);
3040
+ background: var(--paper-2);
3041
+ border-radius: 8px;
3042
+ padding: 8px;
3043
+ color: var(--muted);
3044
+ font-size: 11px;
3045
+ line-height: 1.45;
1993
3046
  }
1994
3047
 
1995
- /* Migration workbench */
1996
- .migration-grid {
3048
+ .preset-command-list {
1997
3049
  display: grid;
1998
- grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
1999
- gap: 12px;
2000
- margin-bottom: 16px;
3050
+ gap: 8px;
3051
+ margin-top: 14px;
2001
3052
  }
2002
3053
 
2003
- .migration-grid > div,
2004
- .migration-grid > button,
2005
- .lesson {
2006
- background: var(--paper-2);
2007
- color: var(--ink);
3054
+ .preset-command-row {
3055
+ display: grid;
3056
+ grid-template-columns: minmax(0, 1fr) auto;
3057
+ gap: 8px;
3058
+ align-items: center;
2008
3059
  border: 1px solid var(--line);
2009
- border-radius: 10px;
2010
- padding: 16px;
2011
- text-align: left;
2012
- transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);
2013
- }
2014
-
2015
- .migration-grid > button {
2016
- cursor: pointer;
2017
- box-shadow: 0 1px 2px rgba(0, 0, 0, 0.01);
3060
+ background: var(--paper-2);
3061
+ border-radius: 8px;
3062
+ padding: 8px;
3063
+ min-width: 0;
2018
3064
  }
2019
3065
 
2020
- .migration-grid > button.active,
2021
- .migration-grid > button:hover {
2022
- border-color: var(--accent);
2023
- background: var(--paper);
2024
- transform: translateY(-2px);
2025
- box-shadow: var(--shadow);
3066
+ .preset-command-row code {
3067
+ white-space: normal;
3068
+ overflow-wrap: anywhere;
2026
3069
  }
2027
3070
 
2028
- .migration-grid p {
2029
- margin: 6px 0 0;
3071
+ .preset-command-warning,
3072
+ .preset-confirm-warning {
3073
+ border: 1px solid var(--line);
3074
+ border-radius: 8px;
3075
+ background: var(--paper-2);
2030
3076
  color: var(--muted);
2031
3077
  font-size: 12px;
3078
+ line-height: 1.45;
3079
+ padding: 10px;
2032
3080
  }
2033
3081
 
2034
- .warning-workbench {
2035
- border-top: 1px solid var(--line);
2036
- padding-top: 20px;
3082
+ .preset-confirm-warning {
3083
+ color: #b91c1c;
2037
3084
  }
2038
3085
 
2039
- .warning-toolbar,
2040
- .pager {
2041
- display: flex;
2042
- align-items: center;
3086
+ .preset-layer-list {
3087
+ display: grid;
3088
+ gap: 8px;
3089
+ }
3090
+
3091
+ .preset-layer-row {
3092
+ display: grid;
3093
+ grid-template-columns: auto minmax(0, 1fr) auto;
2043
3094
  gap: 10px;
2044
- flex-wrap: wrap;
3095
+ align-items: center;
3096
+ border: 1px solid var(--line);
3097
+ border-radius: 8px;
3098
+ background: var(--paper);
3099
+ padding: 10px;
2045
3100
  }
2046
3101
 
2047
- .warning-toolbar {
2048
- justify-content: space-between;
2049
- margin-bottom: 14px;
2050
- color: var(--muted);
2051
- font-size: 13px;
2052
- font-weight: 500;
3102
+ .preset-layer-row.active {
3103
+ border-color: var(--accent);
3104
+ background: var(--paper-2);
2053
3105
  }
2054
3106
 
2055
- .pager button {
2056
- border: 1px solid var(--line);
2057
- background: var(--paper);
2058
- color: var(--ink);
3107
+ .preset-layer-rank {
3108
+ display: inline-grid;
3109
+ place-items: center;
3110
+ width: 24px;
3111
+ height: 24px;
2059
3112
  border-radius: 999px;
2060
- padding: 6px 14px;
3113
+ background: var(--paper-2);
3114
+ color: var(--muted);
2061
3115
  font-size: 12px;
2062
- font-weight: 700;
2063
- cursor: pointer;
2064
- transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
3116
+ font-weight: 900;
2065
3117
  }
2066
3118
 
2067
- .pager button:disabled {
2068
- opacity: 0.3;
2069
- cursor: not-allowed;
3119
+ .preset-layer-row strong,
3120
+ .preset-layer-row small {
3121
+ display: block;
3122
+ overflow-wrap: anywhere;
2070
3123
  }
2071
3124
 
2072
- .pager button:hover:not(:disabled) {
2073
- background: var(--paper-2);
2074
- border-color: var(--muted);
3125
+ .preset-layer-row small {
3126
+ color: var(--muted);
3127
+ font-size: 11px;
3128
+ margin-top: 2px;
2075
3129
  }
2076
3130
 
2077
- .warning-list {
3131
+ .preset-roots {
2078
3132
  display: grid;
2079
- border: 1px solid var(--line);
2080
- border-radius: 12px;
2081
- overflow: hidden;
2082
- box-shadow: var(--shadow);
3133
+ gap: 10px;
3134
+ margin-top: 14px;
2083
3135
  }
2084
3136
 
2085
- .warning-row {
3137
+ .preset-roots div {
2086
3138
  display: grid;
2087
- grid-template-columns: minmax(220px, 1.2fr) auto 80px 120px 140px minmax(220px, 1.5fr);
2088
- gap: 12px;
2089
- align-items: center;
2090
- padding: 14px 18px;
2091
- background: var(--paper);
2092
- border-bottom: 1px solid var(--line);
2093
- transition: all 0.2s ease;
3139
+ gap: 6px;
3140
+ min-width: 0;
2094
3141
  }
2095
3142
 
2096
- .warning-row:last-child {
2097
- border-bottom: 0;
3143
+ .preset-roots strong {
3144
+ font-size: 12px;
2098
3145
  }
2099
3146
 
2100
- .warning-row:hover {
2101
- background: var(--paper-2);
3147
+ .preset-action-panel {
3148
+ display: grid;
3149
+ gap: 12px;
2102
3150
  }
2103
3151
 
2104
- .warning-row p {
2105
- margin: 0;
2106
- color: var(--muted);
2107
- font-size: 12px;
2108
- font-weight: 500;
2109
- line-height: 1.4;
3152
+ .preset-action-group {
3153
+ display: grid;
3154
+ gap: 10px;
3155
+ border-top: 1px solid var(--line);
3156
+ padding-top: 14px;
3157
+ min-width: 0;
2110
3158
  }
2111
3159
 
2112
- .warning-row strong {
3160
+ .preset-action-group h4 {
3161
+ margin: 0;
2113
3162
  font-size: 13px;
3163
+ font-weight: 850;
3164
+ }
3165
+
3166
+ .preset-action-group label {
3167
+ display: grid;
3168
+ gap: 6px;
3169
+ font-size: 12px;
2114
3170
  font-weight: 800;
3171
+ color: var(--muted);
2115
3172
  }
2116
3173
 
2117
- .lesson + .lesson {
2118
- margin-top: 10px;
3174
+ .preset-action-group input,
3175
+ .preset-action-group select {
3176
+ width: 100%;
3177
+ min-width: 0;
2119
3178
  }
2120
3179
 
2121
- .lesson:hover {
2122
- transform: translateY(-1px);
2123
- box-shadow: var(--shadow);
3180
+ .preset-action-group .check-row {
3181
+ display: flex;
3182
+ align-items: center;
3183
+ gap: 8px;
2124
3184
  }
2125
3185
 
2126
- .health-panel {
2127
- display: grid;
2128
- grid-template-columns: 280px minmax(0, 1fr);
2129
- gap: 24px;
3186
+ .preset-action-group .check-row input {
3187
+ width: auto;
2130
3188
  }
2131
3189
 
2132
- .health-lists {
3190
+ .preset-confirm-row {
2133
3191
  display: grid;
2134
- gap: 10px;
3192
+ grid-template-columns: minmax(0, 1fr) auto;
3193
+ gap: 8px;
3194
+ align-items: end;
2135
3195
  }
2136
3196
 
2137
- details {
2138
- background: var(--paper-2);
2139
- border: 1px solid var(--line);
2140
- border-radius: 8px;
2141
- padding: 12px 16px;
2142
- transition: all 0.2s ease;
3197
+ .preset-action-group.danger button:not(:disabled):last-child {
3198
+ border-color: #b91c1c;
3199
+ color: #b91c1c;
2143
3200
  }
2144
3201
 
2145
- details[open] {
2146
- background: var(--paper);
2147
- border-color: var(--accent);
2148
- }
3202
+ @media (max-width: 1400px) {
3203
+ .preset-workspace {
3204
+ grid-template-columns: minmax(280px, 0.9fr) minmax(0, 1.1fr);
3205
+ }
2149
3206
 
2150
- details summary {
2151
- font-weight: 700;
2152
- cursor: pointer;
2153
- font-size: 13px;
3207
+ .preset-context-actions {
3208
+ grid-column: 1 / -1;
3209
+ display: grid;
3210
+ grid-template-columns: repeat(2, minmax(0, 1fr));
3211
+ gap: 14px;
3212
+ }
2154
3213
  }
2155
3214
 
2156
- .empty {
2157
- color: var(--muted);
2158
- border: 2px dashed var(--line);
2159
- border-radius: 8px;
2160
- padding: 24px;
2161
- text-align: center;
2162
- font-weight: 500;
2163
- font-size: 13px;
3215
+ @media (max-width: 760px) {
3216
+ .preset-toolbar,
3217
+ .preset-priority-strip,
3218
+ .preset-workspace,
3219
+ .preset-context-actions,
3220
+ .preset-detail-hero,
3221
+ .preset-detail-list,
3222
+ .preset-command-row,
3223
+ .preset-confirm-row {
3224
+ grid-template-columns: 1fr;
3225
+ }
3226
+
3227
+ .preset-source-tabs,
3228
+ .preset-card-tools,
3229
+ .preset-detail-badges {
3230
+ justify-content: flex-start;
3231
+ }
3232
+
3233
+ .preset-detail-list div,
3234
+ .preset-detail-list div:nth-child(2n) {
3235
+ border-right: 0;
3236
+ }
2164
3237
  }
2165
3238
 
2166
3239
  /* Mobile Responsiveness Rules */
@@ -2264,7 +3337,7 @@ details summary {
2264
3337
  .task-drawer {
2265
3338
  position: fixed;
2266
3339
  top: 0;
2267
- right: -67vw;
3340
+ right: 0;
2268
3341
  width: 65vw;
2269
3342
  max-width: 100%;
2270
3343
  height: 100%;
@@ -2274,15 +3347,15 @@ details summary {
2274
3347
  z-index: 1001;
2275
3348
  display: flex;
2276
3349
  flex-direction: column;
2277
- transition: right 0.35s cubic-bezier(0.16, 1, 0.3, 1);
3350
+ transform: translateX(105%);
3351
+ transition: transform 0.35s cubic-bezier(0.16, 1, 0.3, 1);
2278
3352
  }
2279
3353
  .task-drawer.active {
2280
- right: 0;
3354
+ transform: translateX(0);
2281
3355
  }
2282
3356
  @media (max-width: 768px) {
2283
3357
  .task-drawer {
2284
3358
  width: 100%;
2285
- right: -102%;
2286
3359
  }
2287
3360
  }
2288
3361
 
@@ -2322,6 +3395,35 @@ details summary {
2322
3395
  padding: 24px;
2323
3396
  }
2324
3397
 
3398
+ .drawer-task-summary {
3399
+ display: flex;
3400
+ justify-content: space-between;
3401
+ align-items: center;
3402
+ gap: 12px;
3403
+ margin-bottom: 18px;
3404
+ background: var(--paper-2);
3405
+ border: 1px solid var(--line);
3406
+ padding: 12px 14px;
3407
+ border-radius: 8px;
3408
+ }
3409
+
3410
+ .drawer-task-summary span {
3411
+ display: block;
3412
+ margin-bottom: 3px;
3413
+ color: var(--muted);
3414
+ font-size: 11px;
3415
+ font-weight: 800;
3416
+ text-transform: uppercase;
3417
+ }
3418
+
3419
+ .drawer-task-summary strong {
3420
+ display: block;
3421
+ font-size: 22px;
3422
+ font-weight: 850;
3423
+ color: var(--accent);
3424
+ line-height: 1;
3425
+ }
3426
+
2325
3427
  /* Compact brief card teaser styles */
2326
3428
  .brief-teaser {
2327
3429
  font-size: 13px;
@@ -2336,6 +3438,8 @@ details summary {
2336
3438
  }
2337
3439
  .card-actions {
2338
3440
  display: flex;
3441
+ flex-wrap: wrap;
3442
+ align-items: center;
2339
3443
  gap: 10px;
2340
3444
  margin-top: auto;
2341
3445
  }
@@ -2579,6 +3683,7 @@ details summary {
2579
3683
  border: 1px solid var(--line);
2580
3684
  border-radius: 8px;
2581
3685
  padding: 10px;
3686
+ min-width: 0;
2582
3687
  }
2583
3688
  .task-state-summary span:first-child {
2584
3689
  display: block;
@@ -2588,6 +3693,15 @@ details summary {
2588
3693
  margin-bottom: 6px;
2589
3694
  text-transform: uppercase;
2590
3695
  }
3696
+ .task-state-summary .tag {
3697
+ display: flex;
3698
+ width: 100%;
3699
+ min-width: 0;
3700
+ max-width: 100%;
3701
+ white-space: normal;
3702
+ text-align: center;
3703
+ overflow-wrap: anywhere;
3704
+ }
2591
3705
  .review-actions {
2592
3706
  display: grid;
2593
3707
  gap: 10px;
@@ -2617,6 +3731,17 @@ details summary {
2617
3731
  padding: 9px 10px;
2618
3732
  font: inherit;
2619
3733
  }
3734
+ .review-confirm-copy {
3735
+ display: flex;
3736
+ justify-content: flex-start;
3737
+ }
3738
+ .review-actions .copy-task-name.review-copy-task-name {
3739
+ width: fit-content;
3740
+ background: var(--paper-2);
3741
+ color: var(--ink);
3742
+ border: 1px solid var(--line);
3743
+ padding: 6px 10px;
3744
+ }
2620
3745
  .review-actions button {
2621
3746
  width: 100%;
2622
3747
  border: 0;