coding-agent-harness 1.0.2 → 1.0.4

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 (177) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/CONTRIBUTING.md +98 -0
  3. package/README.md +211 -86
  4. package/README.zh-CN.md +54 -34
  5. package/SKILL.md +25 -18
  6. package/docs-release/README.md +9 -5
  7. package/docs-release/architecture/overview.md +17 -5
  8. package/docs-release/architecture/overview.zh-CN.md +9 -5
  9. package/docs-release/assets/dashboard-overview.png +0 -0
  10. package/docs-release/guides/agent-installation.en-US.md +31 -8
  11. package/docs-release/guides/agent-installation.md +34 -9
  12. package/docs-release/guides/contributing.md +100 -0
  13. package/docs-release/guides/contributing.zh-CN.md +99 -0
  14. package/docs-release/guides/document-audience-and-surfaces.en-US.md +3 -2
  15. package/docs-release/guides/document-audience-and-surfaces.md +3 -2
  16. package/docs-release/guides/full-legacy-migration-subagent-strategy.md +2 -2
  17. package/docs-release/guides/full-legacy-migration-subagent-strategy.zh-CN.md +2 -2
  18. package/docs-release/guides/legacy-migration-agent-prompt.md +0 -11
  19. package/docs-release/guides/legacy-migration-agent-prompt.zh-CN.md +0 -11
  20. package/docs-release/guides/migration-playbook.en-US.md +14 -15
  21. package/docs-release/guides/migration-playbook.md +14 -15
  22. package/docs-release/guides/parent-control-repository-pattern.en-US.md +7 -5
  23. package/docs-release/guides/parent-control-repository-pattern.md +7 -5
  24. package/docs-release/guides/preset-development.md +214 -0
  25. package/docs-release/guides/repository-operating-models.en-US.md +5 -4
  26. package/docs-release/guides/repository-operating-models.md +5 -4
  27. package/docs-release/guides/task-state-machine.en-US.md +207 -0
  28. package/docs-release/guides/task-state-machine.md +214 -0
  29. package/docs-release/intl/en-US.md +1 -1
  30. package/docs-release/intl/zh-CN.md +1 -1
  31. package/examples/minimal-project/docs/09-PLANNING/TASKS/demo-task/findings.md +7 -0
  32. package/package.json +8 -3
  33. package/presets/legacy-migration/checks/preset-check.mjs +3 -0
  34. package/presets/legacy-migration/preset.yaml +134 -0
  35. package/presets/legacy-migration/scripts/plan-work-queue.mjs +4 -0
  36. package/presets/legacy-migration/scripts/scaffold-task-contracts.mjs +4 -0
  37. package/presets/legacy-migration/templates/execution_strategy.append.md +18 -0
  38. package/presets/legacy-migration/templates/findings.seed.md +17 -0
  39. package/presets/legacy-migration/templates/review.seed.md +12 -0
  40. package/presets/legacy-migration/templates/task_plan.append.md +9 -0
  41. package/presets/legacy-migration/templates/visual_map.append.md +12 -0
  42. package/presets/legacy-migration/workbench/dashboard-panels.yaml +2 -0
  43. package/presets/legacy-migration/workbench/migration-queue.schema.json +23 -0
  44. package/presets/lesson-sedimentation/preset.yaml +23 -0
  45. package/presets/lesson-sedimentation/templates/prompt.md +23 -0
  46. package/presets/module/preset.yaml +25 -0
  47. package/presets/module/templates/execution_strategy.append.md +8 -0
  48. package/presets/module/templates/task_plan.append.md +17 -0
  49. package/presets/standard-task/preset.yaml +31 -0
  50. package/presets/standard-task/templates/task_plan.append.md +7 -0
  51. package/references/adversarial-review-standard.md +2 -2
  52. package/references/agents-md-pattern.md +2 -2
  53. package/references/delivery-operating-model-standard.md +3 -3
  54. package/references/docs-directory-standard.md +6 -7
  55. package/references/harness-ledger.md +53 -96
  56. package/references/lessons-governance.md +88 -93
  57. package/references/module-parallel-standard.md +14 -14
  58. package/references/planning-loop.md +12 -6
  59. package/references/pull-request-standard.md +118 -0
  60. package/references/repo-governance-standard.md +11 -2
  61. package/references/review-routing-standard.md +7 -1
  62. package/references/ssot-governance.md +67 -59
  63. package/references/taskr-gap-analysis.md +600 -0
  64. package/references/walkthrough-closeout.md +7 -7
  65. package/scripts/check-harness.mjs +40 -301
  66. package/scripts/commands/dashboard-command.mjs +67 -0
  67. package/scripts/commands/migration-command.mjs +96 -0
  68. package/scripts/commands/preset-command.mjs +73 -0
  69. package/scripts/commands/task-command.mjs +327 -0
  70. package/scripts/harness.mjs +55 -260
  71. package/scripts/lib/capability-registry.mjs +66 -8
  72. package/scripts/lib/check-module-parallel.mjs +237 -0
  73. package/scripts/lib/check-profiles.mjs +61 -153
  74. package/scripts/lib/check-task-contracts.mjs +47 -0
  75. package/scripts/lib/core-shared.mjs +10 -0
  76. package/scripts/lib/dashboard-data.mjs +29 -6
  77. package/scripts/lib/dashboard-workbench.mjs +52 -12
  78. package/scripts/lib/dashboard-writer.mjs +14 -2
  79. package/scripts/lib/git-status-summary.mjs +46 -0
  80. package/scripts/lib/governance-index-generator.mjs +174 -0
  81. package/scripts/lib/governance-sync.mjs +514 -0
  82. package/scripts/lib/governance-table-boundary.mjs +175 -0
  83. package/scripts/lib/harness-core.mjs +5 -0
  84. package/scripts/lib/lesson-maintenance.mjs +36 -29
  85. package/scripts/lib/migration-support.mjs +1 -1
  86. package/scripts/lib/preset-audit-contracts.mjs +37 -0
  87. package/scripts/lib/preset-engine.mjs +497 -0
  88. package/scripts/lib/preset-registry.mjs +627 -0
  89. package/scripts/lib/preset-resource-contracts.mjs +83 -0
  90. package/scripts/lib/review-confirm-git-gate.mjs +248 -0
  91. package/scripts/lib/status-dashboard-renderer.mjs +102 -0
  92. package/scripts/lib/subagent-authorization-audit.mjs +196 -0
  93. package/scripts/lib/task-completion-consistency.mjs +16 -0
  94. package/scripts/lib/task-index.mjs +93 -0
  95. package/scripts/lib/task-lesson-candidates.mjs +242 -0
  96. package/scripts/lib/task-lesson-sedimentation.mjs +326 -0
  97. package/scripts/lib/task-lifecycle/review-confirm.mjs +101 -0
  98. package/scripts/lib/task-lifecycle/review-gates.mjs +70 -0
  99. package/scripts/lib/task-lifecycle/text-utils.mjs +24 -0
  100. package/scripts/lib/task-lifecycle.mjs +297 -403
  101. package/scripts/lib/task-review-model.mjs +469 -0
  102. package/scripts/lib/task-scanner.mjs +130 -236
  103. package/scripts/lib/task-tombstone-commands.mjs +140 -0
  104. package/scripts/postinstall.mjs +14 -0
  105. package/skills/preset-creator/SKILL.md +179 -0
  106. package/skills/preset-creator/references/complex-task-skeleton/README.md +31 -0
  107. package/skills/preset-creator/references/complex-task-skeleton/artifacts/INDEX.md +12 -0
  108. package/skills/preset-creator/references/complex-task-skeleton/brief.md +32 -0
  109. package/skills/preset-creator/references/complex-task-skeleton/execution_strategy.md +71 -0
  110. package/skills/preset-creator/references/complex-task-skeleton/findings.md +24 -0
  111. package/skills/preset-creator/references/complex-task-skeleton/lesson_candidates.md +70 -0
  112. package/skills/preset-creator/references/complex-task-skeleton/long-running-task-contract.md +76 -0
  113. package/skills/preset-creator/references/complex-task-skeleton/progress.md +33 -0
  114. package/skills/preset-creator/references/complex-task-skeleton/references/INDEX.md +13 -0
  115. package/skills/preset-creator/references/complex-task-skeleton/review.md +107 -0
  116. package/skills/preset-creator/references/complex-task-skeleton/task_plan.md +111 -0
  117. package/skills/preset-creator/references/complex-task-skeleton/visual_map.md +50 -0
  118. package/skills/preset-creator/references/preset-package-skeleton.md +296 -0
  119. package/templates/AGENTS.md.template +19 -15
  120. package/templates/dashboard/assets/app-src/00-state.js +1 -0
  121. package/templates/dashboard/assets/app-src/10-router.js +2 -1
  122. package/templates/dashboard/assets/app-src/20-overview.js +11 -5
  123. package/templates/dashboard/assets/app-src/30-tasks.js +92 -246
  124. package/templates/dashboard/assets/app-src/35-task-detail.js +246 -0
  125. package/templates/dashboard/assets/app-src/45-review.js +241 -22
  126. package/templates/dashboard/assets/app-src/50-migration.js +24 -10
  127. package/templates/dashboard/assets/app-src/90-bindings.js +171 -29
  128. package/templates/dashboard/assets/app.css +698 -156
  129. package/templates/dashboard/assets/app.css.manifest.json +9 -0
  130. package/templates/dashboard/assets/app.js +662 -91
  131. package/templates/dashboard/assets/app.manifest.json +1 -0
  132. package/templates/dashboard/assets/css-src/00-foundation.css +342 -0
  133. package/templates/dashboard/assets/css-src/10-panels-flow.css +236 -0
  134. package/templates/dashboard/assets/css-src/20-briefs-controls.css +398 -0
  135. package/templates/dashboard/assets/css-src/30-task-index.css +739 -0
  136. package/templates/dashboard/assets/css-src/35-review-workspace.css +507 -0
  137. package/templates/dashboard/assets/css-src/40-detail-modules-migration.css +427 -0
  138. package/templates/dashboard/assets/css-src/50-responsive-overrides.css +551 -0
  139. package/templates/dashboard/assets/i18n.js +123 -21
  140. package/templates/ledger/Harness-Ledger.md +13 -25
  141. package/templates/lessons/lesson-arch-process-change.md +1 -1
  142. package/templates/lessons/lesson-new-doc.md +1 -1
  143. package/templates/lessons/lesson-ref-change.md +1 -1
  144. package/templates/planning/execution_strategy.md +31 -0
  145. package/templates/planning/lesson_candidates.md +18 -6
  146. package/templates/planning/optional/artifacts/INDEX.md +3 -3
  147. package/templates/planning/optional/references/INDEX.md +3 -3
  148. package/templates/planning/review.md +59 -0
  149. package/templates/planning/task_plan.md +36 -13
  150. package/templates/reference/execution-workflow-standard.md +4 -3
  151. package/templates/reference/pull-request-standard.md +80 -0
  152. package/templates/reference/repo-governance-standard.md +7 -6
  153. package/templates/reference/review-routing-standard.md +6 -0
  154. package/templates/reference/walkthrough-standard.md +2 -1
  155. package/templates/verifier/verifier-output.md +1 -1
  156. package/templates-zh-CN/AGENTS.md.template +20 -16
  157. package/templates-zh-CN/ledger/Harness-Ledger.md +17 -40
  158. package/templates-zh-CN/planning/execution_strategy.md +30 -0
  159. package/templates-zh-CN/planning/lesson_candidates.md +18 -6
  160. package/templates-zh-CN/planning/review.md +59 -1
  161. package/templates-zh-CN/planning/task_plan.md +30 -10
  162. package/templates-zh-CN/reference/adversarial-review-standard.md +1 -1
  163. package/templates-zh-CN/reference/docs-library-standard.md +1 -1
  164. package/templates-zh-CN/reference/execution-workflow-standard.md +4 -3
  165. package/templates-zh-CN/reference/harness-ledger-standard.md +2 -2
  166. package/templates-zh-CN/reference/pull-request-standard.md +106 -0
  167. package/templates-zh-CN/reference/repo-governance-standard.md +4 -3
  168. package/templates-zh-CN/reference/review-routing-standard.md +8 -1
  169. package/templates-zh-CN/reference/walkthrough-standard.md +3 -2
  170. package/templates-zh-CN/walkthrough/Closeout-SSoT.md +1 -1
  171. package/docs-release/assets/dashboard-overview-en.png +0 -0
  172. package/scripts/smoke-dashboard.mjs +0 -92
  173. package/scripts/test-harness.mjs +0 -1395
  174. package/templates/ssot/Feature-SSoT.md +0 -43
  175. package/templates/ssot/Lessons-SSoT.md +0 -44
  176. package/templates-zh-CN/ssot/Feature-SSoT.md +0 -49
  177. package/templates-zh-CN/ssot/Lessons-SSoT.md +0 -49
@@ -3,6 +3,7 @@
3
3
  "app-src/10-router.js",
4
4
  "app-src/20-overview.js",
5
5
  "app-src/30-tasks.js",
6
+ "app-src/35-task-detail.js",
6
7
  "app-src/40-modules.js",
7
8
  "app-src/45-review.js",
8
9
  "app-src/50-migration.js",
@@ -0,0 +1,342 @@
1
+ @import url('https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@300;400;500;600;700;800&family=JetBrains+Mono:ital,wght@0,400;0,500;1,400&display=swap');
2
+
3
+ :root {
4
+ color-scheme: light;
5
+
6
+ /* Backgrounds & Surfaces */
7
+ --bg: #f3f4f6; /* Slate 100: Elegant silver-gray background base */
8
+ --paper: #ffffff; /* Pure White: Card surface */
9
+ --paper-2: #e5e7eb; /* Slate 200: Soft tab & hover tint */
10
+
11
+ /* Typography */
12
+ --ink: #111827; /* Slate 900: Deep obsidian text */
13
+ --muted: #4b5563; /* Slate 600: Secondary text */
14
+
15
+ /* Borders & Dividers */
16
+ --line: #d1d5db; /* Slate 300: High-contrast thin border line */
17
+
18
+ /* Branding Accents */
19
+ --accent: #d97706; /* Amber 600: Rich golden amber for primary actions */
20
+ --accent-2: #ca8a04; /* Yellow 600: Deep warm gold for gradients */
21
+
22
+ /* Semantic Statuses */
23
+ --danger: #e11d48; /* Rose 600: Blockers, failures, and errors */
24
+ --warn: #ea580c; /* Orange 600: Warnings and advice */
25
+ --ok: #16a34a; /* Green 600: Complete and verified */
26
+
27
+ /* Dimensions, Shadows, & Glows */
28
+ --shadow: 0 10px 15px -3px rgba(17, 24, 39, 0.03), 0 4px 6px -4px rgba(17, 24, 39, 0.03), 0 1px 3px rgba(0, 0, 0, 0.01);
29
+ --shadow-hover: 0 20px 25px -5px rgba(17, 24, 39, 0.06), 0 10px 10px -5px rgba(17, 24, 39, 0.03);
30
+ --glow: 0 0 20px rgba(217, 119, 6, 0.08);
31
+
32
+ /* Typography Scale */
33
+ --font-sans: "Plus Jakarta Sans", ui-sans-serif, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
34
+ --font-mono: "JetBrains Mono", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
35
+ }
36
+
37
+ [data-theme="dark"] {
38
+ color-scheme: dark;
39
+
40
+ /* Backgrounds & Surfaces */
41
+ --bg: #121214; /* Dark Charcoal: Obsidian dark grey */
42
+ --paper: #1a1a1c; /* Elevated dark gray zinc surface */
43
+ --paper-2: #27272a; /* Zinc 800: Hover tint and active tab */
44
+
45
+ /* Typography */
46
+ --ink: #f4f4f5; /* Zinc 100: Soft white contrast text */
47
+ --muted: #9ca3af; /* Slate 400: Mid-tone tech gray */
48
+
49
+ /* Borders & Dividers */
50
+ --line: #2b2b2e; /* Subdued dark border line */
51
+
52
+ /* Branding Accents */
53
+ --accent: #fbbf24; /* Amber 400: Radiant warm amber */
54
+ --accent-2: #f59e0b; /* Amber 500: Deep glowing amber */
55
+
56
+ /* Semantic Statuses */
57
+ --danger: #fb7185; /* Rose 400: High-visibility error rose */
58
+ --warn: #fbbf24; /* Amber 400: Warm warning amber */
59
+ --ok: #34d399; /* Green 400: Success mint green */
60
+
61
+ /* Shadows & Glows */
62
+ --shadow: 0 20px 30px rgba(0, 0, 0, 0.3);
63
+ --shadow-hover: 0 25px 40px rgba(0, 0, 0, 0.45);
64
+ --glow: 0 0 25px rgba(251, 191, 36, 0.12);
65
+ }
66
+
67
+ /* Animations & Keyframes */
68
+ @keyframes shimmer-flow {
69
+ 0% { background-position: 100% 0%; }
70
+ 100% { background-position: -100% 0%; }
71
+ }
72
+
73
+ @keyframes pulse-ok {
74
+ 0%, 100% { box-shadow: 0 0 0 0 rgba(22, 163, 74, 0.15), var(--shadow); }
75
+ 50% { box-shadow: 0 0 0 6px rgba(22, 163, 74, 0), var(--shadow); }
76
+ }
77
+
78
+ @keyframes pulse-warn {
79
+ 0%, 100% { box-shadow: 0 0 0 0 rgba(217, 119, 6, 0.15), var(--shadow); }
80
+ 50% { box-shadow: 0 0 0 6px rgba(217, 119, 6, 0), var(--shadow); }
81
+ }
82
+
83
+ @keyframes pulse-fail {
84
+ 0%, 100% { box-shadow: 0 0 0 0 rgba(225, 29, 72, 0.15), var(--shadow); }
85
+ 50% { box-shadow: 0 0 0 6px rgba(225, 29, 72, 0), var(--shadow); }
86
+ }
87
+
88
+ /* Reset & Scrollbars */
89
+ * {
90
+ box-sizing: border-box;
91
+ outline-color: var(--accent);
92
+ }
93
+
94
+ body {
95
+ margin: 0;
96
+ background: var(--bg);
97
+ background-image: radial-gradient(ellipse at top, var(--paper-2), var(--bg));
98
+ color: var(--ink);
99
+ font-family: var(--font-sans);
100
+ -webkit-font-smoothing: antialiased;
101
+ -moz-osx-font-smoothing: grayscale;
102
+ }
103
+
104
+ a {
105
+ color: inherit;
106
+ text-decoration: none;
107
+ transition: color 0.2s ease;
108
+ }
109
+
110
+ a:hover {
111
+ color: var(--accent);
112
+ }
113
+
114
+ button, input, select {
115
+ font-family: inherit;
116
+ }
117
+
118
+ ::-webkit-scrollbar {
119
+ width: 8px;
120
+ height: 8px;
121
+ }
122
+
123
+ ::-webkit-scrollbar-track {
124
+ background: transparent;
125
+ }
126
+
127
+ ::-webkit-scrollbar-thumb {
128
+ background: var(--line);
129
+ border-radius: 999px;
130
+ }
131
+
132
+ ::-webkit-scrollbar-thumb:hover {
133
+ background: var(--muted);
134
+ }
135
+
136
+ /* Base Layout Container — full-width fluid */
137
+ .visibility-shell {
138
+ width: 100%;
139
+ max-width: 100%;
140
+ padding: 40px clamp(16px, 3vw, 48px) 80px;
141
+ box-sizing: border-box;
142
+ }
143
+
144
+ /* Page Header / Hero */
145
+ .hero {
146
+ display: flex;
147
+ justify-content: space-between;
148
+ align-items: center;
149
+ gap: 24px;
150
+ margin-bottom: 32px;
151
+ }
152
+
153
+ .hero-copy h1 {
154
+ margin: 0;
155
+ font-size: clamp(24px, 4.5vw, 36px);
156
+ font-weight: 800;
157
+ letter-spacing: -0.025em;
158
+ background: linear-gradient(135deg, var(--accent) 0%, var(--accent-2) 100%);
159
+ -webkit-background-clip: text;
160
+ -webkit-text-fill-color: transparent;
161
+ }
162
+
163
+ .hero-sub {
164
+ max-width: 800px;
165
+ color: var(--muted);
166
+ font-size: 14px;
167
+ line-height: 1.5;
168
+ margin: 6px 0 0;
169
+ font-weight: 500;
170
+ }
171
+
172
+ .eyebrow {
173
+ color: var(--accent);
174
+ font-weight: 800;
175
+ font-size: 11px;
176
+ letter-spacing: 0.08em;
177
+ margin: 0 0 6px;
178
+ text-transform: uppercase;
179
+ overflow-wrap: anywhere;
180
+ }
181
+
182
+ .hero-actions {
183
+ display: flex;
184
+ flex-wrap: wrap;
185
+ align-items: center;
186
+ gap: 8px;
187
+ }
188
+
189
+ .hero-actions a,
190
+ .hero-actions button,
191
+ .section-head a,
192
+ .section-head button {
193
+ display: inline-flex;
194
+ align-items: center;
195
+ justify-content: center;
196
+ border: 1px solid var(--line);
197
+ background: var(--paper);
198
+ color: var(--ink);
199
+ border-radius: 999px; /* Capsules */
200
+ padding: 8px 16px;
201
+ font-size: 13px;
202
+ font-weight: 600;
203
+ cursor: pointer;
204
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.02);
205
+ transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);
206
+ }
207
+
208
+ .hero-actions a.active {
209
+ background: var(--accent);
210
+ color: var(--paper);
211
+ border-color: var(--accent);
212
+ }
213
+
214
+ .hero-actions a:hover:not(.active),
215
+ .hero-actions button:hover,
216
+ .section-head a:hover,
217
+ .section-head button:hover {
218
+ background: var(--paper-2);
219
+ border-color: var(--muted);
220
+ transform: translateY(-1px);
221
+ }
222
+
223
+ .stack {
224
+ display: grid;
225
+ gap: 24px;
226
+ }
227
+
228
+ /* Cockpit Two-Column Layout Grid */
229
+ .dashboard-grid {
230
+ display: grid;
231
+ grid-template-columns: 1fr;
232
+ gap: 24px;
233
+ margin-top: 16px;
234
+ }
235
+
236
+ .dashboard-main,
237
+ .dashboard-sidebar,
238
+ .status-card-group {
239
+ min-width: 0;
240
+ }
241
+
242
+ @media (min-width: 1280px) {
243
+ .dashboard-grid {
244
+ grid-template-columns: minmax(0, 1fr) minmax(300px, 360px);
245
+ align-items: start;
246
+ }
247
+ }
248
+
249
+ .status-card-group {
250
+ display: flex;
251
+ flex-direction: column;
252
+ gap: 16px;
253
+ }
254
+
255
+ .metrics-grid {
256
+ display: grid;
257
+ grid-template-columns: repeat(2, 1fr);
258
+ gap: 16px;
259
+ }
260
+
261
+ .status-primary,
262
+ .metric,
263
+ .flow-panel,
264
+ .migration-panel,
265
+ .lesson-panel,
266
+ .health-panel,
267
+ .task-group,
268
+ .detail-hero,
269
+ .doc-section,
270
+ .doc-library,
271
+ .side-panel,
272
+ .module-card,
273
+ .index-toolbar {
274
+ background: var(--paper);
275
+ border: 1px solid var(--line);
276
+ border-radius: 12px; /* Smoother rounding */
277
+ box-shadow: var(--shadow);
278
+ backdrop-filter: blur(12px);
279
+ transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);
280
+ }
281
+
282
+ .status-primary {
283
+ padding: 20px;
284
+ border-width: 1.5px;
285
+ }
286
+
287
+ .status-primary.pass {
288
+ border-color: rgba(22, 163, 74, 0.3);
289
+ animation: pulse-ok 4s infinite;
290
+ }
291
+
292
+ .status-primary.warn {
293
+ border-color: rgba(217, 119, 6, 0.3);
294
+ animation: pulse-warn 4s infinite;
295
+ }
296
+
297
+ .status-primary.fail {
298
+ border-color: rgba(225, 29, 72, 0.3);
299
+ animation: pulse-fail 4s infinite;
300
+ }
301
+
302
+ .status-primary span,
303
+ .metric span,
304
+ .subtle,
305
+ .task-row small,
306
+ .card-head p,
307
+ .detail-hero p,
308
+ .health-panel p {
309
+ color: var(--muted);
310
+ font-size: 13px;
311
+ font-weight: 500;
312
+ }
313
+
314
+ .status-primary strong {
315
+ display: block;
316
+ font-size: 24px;
317
+ font-weight: 800;
318
+ line-height: 1.2;
319
+ margin: 6px 0;
320
+ }
321
+
322
+ .status-primary p {
323
+ margin: 0;
324
+ font-size: 13px;
325
+ font-weight: 600;
326
+ }
327
+
328
+ .metric {
329
+ min-height: 104px;
330
+ padding: 18px;
331
+ display: flex;
332
+ flex-direction: column;
333
+ justify-content: space-between;
334
+ }
335
+
336
+ .metric strong {
337
+ display: block;
338
+ font-size: 32px;
339
+ font-weight: 800;
340
+ line-height: 1;
341
+ color: var(--accent);
342
+ }
@@ -0,0 +1,236 @@
1
+ /* Sections & Panel Layouts */
2
+ .section-head {
3
+ display: flex;
4
+ justify-content: space-between;
5
+ gap: 18px;
6
+ align-items: center;
7
+ margin-bottom: 16px;
8
+ min-width: 0;
9
+ }
10
+
11
+ .section-head > div {
12
+ min-width: 0;
13
+ }
14
+
15
+ .section-actions {
16
+ display: flex;
17
+ flex-wrap: wrap;
18
+ justify-content: flex-end;
19
+ align-items: center;
20
+ gap: 10px;
21
+ min-width: 0;
22
+ }
23
+
24
+ .section-head h2,
25
+ .detail-hero h2,
26
+ .side-panel h3,
27
+ .module-card h2 {
28
+ margin: 0;
29
+ font-size: 18px;
30
+ font-weight: 800;
31
+ letter-spacing: -0.015em;
32
+ overflow-wrap: anywhere;
33
+ }
34
+
35
+ .flow-panel,
36
+ .migration-panel,
37
+ .lesson-panel,
38
+ .health-panel {
39
+ padding: 24px;
40
+ }
41
+
42
+ .flow-canvas {
43
+ min-height: 220px;
44
+ overflow: auto;
45
+ background: var(--paper-2);
46
+ border: 1px solid var(--line);
47
+ border-radius: 8px;
48
+ padding: 20px;
49
+ }
50
+
51
+ .progress-bar-container {
52
+ margin-top: 8px;
53
+ }
54
+
55
+ .progress-bar {
56
+ display: flex;
57
+ height: 28px;
58
+ border-radius: 8px;
59
+ overflow: hidden;
60
+ background: var(--paper-2);
61
+ border: 1px solid var(--line);
62
+ }
63
+
64
+ .progress-segment {
65
+ transition: width 0.4s ease;
66
+ min-width: 2px;
67
+ }
68
+
69
+ .progress-segment.done {
70
+ background: #16a34a;
71
+ }
72
+
73
+ .progress-segment.active {
74
+ background: var(--accent);
75
+ }
76
+
77
+ .progress-segment.planned {
78
+ background: var(--paper-2);
79
+ border-right: 1px solid var(--line);
80
+ }
81
+
82
+ .progress-legend {
83
+ display: flex;
84
+ gap: 20px;
85
+ margin-top: 12px;
86
+ font-size: 13px;
87
+ font-weight: 500;
88
+ color: var(--muted);
89
+ }
90
+
91
+ .legend-item {
92
+ display: inline-flex;
93
+ align-items: center;
94
+ gap: 6px;
95
+ }
96
+
97
+ .legend-dot {
98
+ width: 10px;
99
+ height: 10px;
100
+ border-radius: 3px;
101
+ display: inline-block;
102
+ }
103
+
104
+ .legend-dot.done { background: #16a34a; }
105
+ .legend-dot.active { background: var(--accent); }
106
+ .legend-dot.planned { background: var(--paper-2); border: 1px solid var(--line); }
107
+
108
+ .runway-breakdown,
109
+ .group-pager {
110
+ display: flex;
111
+ flex-wrap: wrap;
112
+ align-items: center;
113
+ justify-content: space-between;
114
+ gap: 12px;
115
+ margin-top: 16px;
116
+ }
117
+
118
+ .runway-breakdown a,
119
+ .group-pager {
120
+ border: 1px solid var(--line);
121
+ background: var(--paper);
122
+ border-radius: 8px;
123
+ padding: 12px 16px;
124
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.01);
125
+ transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);
126
+ }
127
+
128
+ .runway-breakdown a {
129
+ display: grid;
130
+ gap: 4px;
131
+ min-width: 190px;
132
+ }
133
+
134
+ .runway-breakdown a:hover {
135
+ border-color: var(--accent);
136
+ background: var(--paper-2);
137
+ transform: translateY(-2px);
138
+ box-shadow: var(--shadow);
139
+ }
140
+
141
+ .runway-breakdown a strong {
142
+ font-size: 13px;
143
+ font-weight: 700;
144
+ }
145
+
146
+ .runway-breakdown span,
147
+ .group-pager span {
148
+ color: var(--muted);
149
+ font-size: 12px;
150
+ font-weight: 500;
151
+ }
152
+
153
+ .mermaid-rendered {
154
+ margin: 0;
155
+ max-width: 100%;
156
+ max-height: min(68vh, 620px);
157
+ overflow: auto;
158
+ border: 1px solid var(--line);
159
+ border-radius: 10px;
160
+ background: var(--paper-2);
161
+ padding: 12px;
162
+ }
163
+
164
+ .mermaid-fallback {
165
+ margin: 0;
166
+ max-width: 100%;
167
+ max-height: min(68vh, 620px);
168
+ overflow: auto;
169
+ border: 1px dashed var(--line);
170
+ border-radius: 10px;
171
+ background: var(--paper-2);
172
+ padding: 12px;
173
+ }
174
+
175
+ .task-drawer .mermaid-rendered,
176
+ .task-drawer .mermaid-fallback,
177
+ .review-workspace .mermaid-rendered,
178
+ .review-workspace .mermaid-fallback {
179
+ max-height: 420px;
180
+ }
181
+
182
+ .mermaid-fallback pre {
183
+ margin: 0;
184
+ white-space: pre;
185
+ }
186
+
187
+ .mermaid-rendered figcaption,
188
+ .mermaid-fallback figcaption {
189
+ color: var(--muted);
190
+ font-size: 12px;
191
+ margin-bottom: 12px;
192
+ font-weight: 500;
193
+ }
194
+
195
+ .mermaid-rendered svg {
196
+ min-width: min(100%, 720px);
197
+ max-width: none;
198
+ height: auto;
199
+ }
200
+
201
+ .mermaid-node rect {
202
+ fill: var(--paper);
203
+ stroke: var(--line);
204
+ stroke-width: 1.5px;
205
+ transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);
206
+ }
207
+
208
+ .mermaid-node:hover rect {
209
+ stroke: var(--accent);
210
+ filter: drop-shadow(0 4px 6px rgba(0, 0, 0, 0.05));
211
+ }
212
+
213
+ .mermaid-node text {
214
+ fill: var(--ink);
215
+ font-family: var(--font-sans);
216
+ font-size: 13px;
217
+ font-weight: 600;
218
+ pointer-events: none;
219
+ }
220
+
221
+ .mermaid-edge {
222
+ stroke: var(--line);
223
+ stroke-width: 2px;
224
+ fill: none;
225
+ transition: stroke 0.25s ease;
226
+ }
227
+
228
+ .mermaid-node:hover ~ .mermaid-edge,
229
+ .mermaid-edge:hover {
230
+ stroke: var(--accent);
231
+ }
232
+
233
+ .mermaid-arrow {
234
+ fill: var(--line);
235
+ transition: fill 0.25s ease;
236
+ }