@uniqbit/mate-core 0.18.4 → 1.0.0-canary.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (231) hide show
  1. package/claude-plugin/hooks/companion-instructions.mjs +9 -0
  2. package/claude-plugin/hooks/hooks.json +12 -2
  3. package/opencode-plugin/src/add-dir.ts +76 -10
  4. package/opencode-plugin/src/companion.ts +1 -8
  5. package/opencode-plugin/src/server.ts +2 -15
  6. package/package.json +10 -2
  7. package/src/brand/art.generated.ts +69 -0
  8. package/src/brand/index.ts +12 -0
  9. package/src/brand/palette.ts +19 -0
  10. package/src/brand/svg.generated.ts +8 -0
  11. package/src/brand/terminal.ts +83 -0
  12. package/src/brand/types.ts +33 -0
  13. package/src/cli/commands/artifact/artifact.ts +8 -0
  14. package/src/cli/commands/artifact/delivery/archive.ts +117 -0
  15. package/src/cli/commands/artifact/delivery/branch-flags.ts +55 -0
  16. package/src/cli/commands/artifact/delivery/environment.ts +104 -0
  17. package/src/cli/commands/artifact/delivery/link.ts +154 -0
  18. package/src/cli/commands/artifact/delivery/output.ts +58 -0
  19. package/src/cli/commands/artifact/finish/command.ts +33 -3
  20. package/src/cli/commands/artifact/finish/engine.ts +47 -3
  21. package/src/cli/commands/artifact/finish/finisher.ts +10 -0
  22. package/src/cli/commands/artifact/finish/openspec.ts +200 -129
  23. package/src/cli/commands/artifact/finish/secret-scan.ts +43 -0
  24. package/src/cli/commands/artifact/pending/command.ts +31 -3
  25. package/src/cli/commands/artifact/pending/discovery.ts +21 -57
  26. package/src/cli/commands/cap/graphify.ts +52 -3
  27. package/src/cli/commands/cap/index-cmd.ts +8 -1
  28. package/src/cli/commands/cap/openspec.ts +13 -25
  29. package/src/cli/commands/companion/open.ts +56 -39
  30. package/src/cli/commands/companion/update.ts +75 -42
  31. package/src/cli/commands/doctor.ts +257 -78
  32. package/src/cli/commands/install.ts +0 -8
  33. package/src/cli/commands/plugin/install.ts +9 -4
  34. package/src/cli/commands/plugin/plugin.ts +3 -2
  35. package/src/cli/commands/report/adapter.ts +11 -2
  36. package/src/cli/commands/report/contract.ts +21 -0
  37. package/src/cli/commands/report/highlight.ts +34 -4
  38. package/src/cli/commands/report/markdown.ts +110 -0
  39. package/src/cli/commands/report/palette.ts +118 -0
  40. package/src/cli/commands/report/renderer.ts +456 -153
  41. package/src/cli/commands/report/types.ts +16 -0
  42. package/src/cli/commands/setup.ts +7 -15
  43. package/src/cli/commands/studio/client-asset.ts +16 -0
  44. package/src/cli/commands/studio/openspec-cli.ts +10 -58
  45. package/src/cli/commands/studio/routes.ts +2 -0
  46. package/src/cli/commands/studio/selection.ts +19 -1
  47. package/src/cli/commands/studio/server.ts +42 -1
  48. package/src/cli/commands/studio/terminal-launch.ts +7 -16
  49. package/src/cli/commands/studio/views/client.ts +6 -616
  50. package/src/cli/commands/studio/views/dashboard/changes.tsx +5 -10
  51. package/src/cli/commands/studio/views/document.tsx +137 -69
  52. package/src/cli/commands/studio/views/markdown.tsx +250 -0
  53. package/src/cli/commands/studio/views/palette.ts +134 -0
  54. package/src/cli/commands/studio/views/reports/index.tsx +2 -7
  55. package/src/cli/commands/studio/views/skills/index.tsx +43 -62
  56. package/src/cli/commands/studio/views/specs/index.tsx +7 -15
  57. package/src/cli/commands/studio/views/studio-client/actions.ts +51 -0
  58. package/src/cli/commands/studio/views/studio-client/companion.ts +13 -0
  59. package/src/cli/commands/studio/views/studio-client/index.ts +32 -0
  60. package/src/cli/commands/studio/views/studio-client/keys.ts +3 -0
  61. package/src/cli/commands/studio/views/studio-client/main.ts +3 -0
  62. package/src/cli/commands/studio/views/studio-client/page.ts +146 -0
  63. package/src/cli/commands/studio/views/studio-client/panels.ts +57 -0
  64. package/src/cli/commands/studio/views/studio-client/reports.ts +122 -0
  65. package/src/cli/commands/studio/views/studio-client/theme.ts +63 -0
  66. package/src/cli/commands/studio/views/studio-client/vault-editor.ts +166 -0
  67. package/src/cli/commands/studio/views/studio-client/vault-pane.ts +202 -0
  68. package/src/cli/commands/studio/views/studio-client/vault-tree.ts +258 -0
  69. package/src/cli/commands/studio/views/studio-client.generated.ts +2 -0
  70. package/src/cli/commands/studio/views/styles.ts +217 -206
  71. package/src/cli/commands/studio/views/vault/state.ts +3 -5
  72. package/src/cli/commands/studio/views/workflow/delivery-path.tsx +370 -0
  73. package/src/cli/commands/studio/views/workflow/graph.ts +220 -0
  74. package/src/cli/commands/studio/views/workflow/index.tsx +2 -3
  75. package/src/cli/commands/studio/views/workflow/steps.ts +228 -287
  76. package/src/cli/commands/wrap.ts +9 -42
  77. package/src/cli/main.ts +4 -1
  78. package/src/cli/parse-flags.ts +25 -7
  79. package/src/cli/setup-selector.tsx +38 -162
  80. package/src/cli/usage.ts +5 -2
  81. package/src/hooks/companion-instructions.ts +190 -0
  82. package/src/hooks/hook-io.ts +63 -0
  83. package/src/hooks/session-banner.ts +21 -29
  84. package/src/hooks/session-guidance.ts +10 -36
  85. package/src/hooks/session-prepare.ts +115 -28
  86. package/src/hooks/validate-artifact-path.ts +82 -24
  87. package/src/index.ts +4 -0
  88. package/src/lib/change-layout.ts +154 -0
  89. package/src/lib/components/wizard-header.tsx +3 -1
  90. package/src/lib/context-mode-package.ts +24 -11
  91. package/src/lib/delivery/archive-change.ts +154 -0
  92. package/src/lib/delivery/branches.ts +108 -0
  93. package/src/lib/delivery/environment.ts +29 -0
  94. package/src/lib/delivery/forge.ts +279 -0
  95. package/src/lib/delivery/overlap.ts +202 -0
  96. package/src/lib/delivery/record-delivery.ts +196 -0
  97. package/src/lib/delivery/record.ts +343 -0
  98. package/src/lib/delivery/refresh.ts +174 -0
  99. package/src/lib/delivery/repository-access.ts +97 -0
  100. package/src/lib/delivery/stages.ts +111 -0
  101. package/src/lib/delivery/token.ts +58 -0
  102. package/src/lib/frontmatter.ts +18 -0
  103. package/src/lib/opencode-plugin-package.ts +5 -5
  104. package/src/lib/openspec-cli.ts +116 -0
  105. package/src/lib/openspec-scopes.ts +86 -0
  106. package/src/lib/orchestrator/adapters/claude-args.ts +50 -0
  107. package/src/lib/orchestrator/adapters/claude.ts +60 -162
  108. package/src/lib/orchestrator/adapters/opencode.ts +9 -24
  109. package/src/lib/orchestrator/config-store.ts +2 -70
  110. package/src/lib/orchestrator/editor.ts +9 -9
  111. package/src/lib/orchestrator/openspec-store.ts +14 -54
  112. package/src/lib/orchestrator/projection-claude-commands.ts +36 -0
  113. package/src/lib/orchestrator/projection-claude-links.ts +159 -0
  114. package/src/lib/orchestrator/projection-claude-skills.ts +19 -190
  115. package/src/lib/orchestrator/projection-entries.ts +45 -15
  116. package/src/lib/orchestrator/projection-runtime-documents.ts +15 -6
  117. package/src/lib/orchestrator/projection-types.ts +3 -2
  118. package/src/lib/orchestrator/refresh-working-claude-links.ts +87 -0
  119. package/src/lib/orchestrator/session-prepare.ts +49 -87
  120. package/src/lib/orchestrator/setup-compatibilities.ts +18 -75
  121. package/src/lib/orchestrator/types.ts +2 -2
  122. package/src/lib/orchestrator/wrap-pass.ts +22 -88
  123. package/src/lib/package-paths.ts +8 -0
  124. package/src/opencode/companion-hooks.ts +64 -5
  125. package/src/opencode/companion-policy.ts +37 -18
  126. package/src/opencode/projected-guidance.ts +4 -1
  127. package/src/opencode/session-prepare.ts +2 -1
  128. package/src/opencode/tui.tsx +4 -2
  129. package/src/runtime/artifact-refusal.ts +63 -0
  130. package/src/runtime/claude-delivery-plan.ts +89 -7
  131. package/src/runtime/commit-attribution-guard.ts +181 -0
  132. package/src/runtime/companion-guidance.ts +15 -3
  133. package/src/runtime/companion-instructions.ts +340 -0
  134. package/src/runtime/error-message.ts +4 -0
  135. package/src/runtime/guidance.ts +0 -17
  136. package/src/runtime/index.ts +5 -0
  137. package/src/runtime/managed-block.ts +117 -0
  138. package/src/runtime/markdown-scan.ts +266 -0
  139. package/src/runtime/policy.ts +16 -15
  140. package/src/runtime/projected-flag.ts +7 -0
  141. package/src/runtime/projected-guidance.ts +1 -0
  142. package/src/runtime/runtime-document-manifest.ts +62 -28
  143. package/src/runtime/secret-guard.ts +148 -0
  144. package/src/runtime/secret-patterns.ts +164 -0
  145. package/src/runtime/secret-scan.ts +90 -0
  146. package/src/runtime/session-kind.ts +13 -0
  147. package/src/runtime/shell-heredoc.ts +81 -0
  148. package/src/runtime/wrap-state.ts +36 -6
  149. package/src/runtime/write-atomic.ts +64 -0
  150. package/src/templates/capabilities/openspec-cap/mate-minimal/schema.yaml +8 -6
  151. package/src/templates/capabilities/openspec-cap/mate-minimal/templates/spec.md +3 -5
  152. package/src/templates/capabilities/openspec-cap/mate-v1/schema.yaml +7 -9
  153. package/src/templates/capabilities/openspec-cap/mate-v1/templates/spec.md +3 -5
  154. package/src/templates/capabilities/openspec-cap/openspec-conventions.yaml +10 -12
  155. package/src/templates/mate-skills/THIRD-PARTY-NOTICES.md +40 -0
  156. package/src/templates/mate-skills/agents/mate-apply-change/SKILL.md +76 -0
  157. package/src/templates/mate-skills/agents/mate-apply-change/references/openspec-apply-change.md +198 -0
  158. package/src/templates/mate-skills/agents/mate-archive-change/SKILL.md +59 -0
  159. package/src/templates/mate-skills/{claude/mate-openspec-backfill → agents/mate-backfill-spec}/SKILL.md +4 -4
  160. package/src/templates/mate-skills/agents/mate-clarify-intent/SKILL.md +95 -0
  161. package/src/templates/mate-skills/agents/mate-explore-change/SKILL.md +50 -0
  162. package/src/templates/mate-skills/agents/mate-explore-change/references/openspec-explore.md +348 -0
  163. package/src/templates/mate-skills/agents/mate-grill-me/SKILL.md +3 -3
  164. package/src/templates/mate-skills/agents/mate-interview-me/SKILL.md +5 -5
  165. package/src/templates/mate-skills/agents/mate-propose-change/SKILL.md +103 -0
  166. package/src/templates/mate-skills/agents/mate-propose-change/references/openspec-propose.md +167 -0
  167. package/src/templates/mate-skills/agents/mate-propose-change/references/openspec-update-change.md +101 -0
  168. package/src/templates/mate-skills/agents/{mate-artifact-publish → mate-publish-artifact}/SKILL.md +91 -23
  169. package/src/templates/mate-skills/agents/{mate-artifact-publish → mate-publish-artifact}/references/openspec.md +4 -3
  170. package/src/templates/mate-skills/agents/mate-show-me/SKILL.md +74 -16
  171. package/src/templates/mate-skills/agents/mate-simplify-code/SKILL.md +74 -68
  172. package/src/templates/mate-skills/claude/mate-apply-change/SKILL.md +76 -0
  173. package/src/templates/mate-skills/claude/mate-apply-change/references/openspec-apply-change.md +198 -0
  174. package/src/templates/mate-skills/claude/mate-archive-change/SKILL.md +59 -0
  175. package/src/templates/mate-skills/{agents/mate-openspec-backfill → claude/mate-backfill-spec}/SKILL.md +4 -4
  176. package/src/templates/mate-skills/claude/mate-clarify-intent/SKILL.md +95 -0
  177. package/src/templates/mate-skills/claude/mate-explore-change/SKILL.md +50 -0
  178. package/src/templates/mate-skills/claude/mate-explore-change/references/openspec-explore.md +348 -0
  179. package/src/templates/mate-skills/claude/mate-grill-me/SKILL.md +3 -3
  180. package/src/templates/mate-skills/claude/mate-interview-me/SKILL.md +5 -5
  181. package/src/templates/mate-skills/claude/mate-propose-change/SKILL.md +103 -0
  182. package/src/templates/mate-skills/claude/mate-propose-change/references/openspec-propose.md +167 -0
  183. package/src/templates/mate-skills/claude/mate-propose-change/references/openspec-update-change.md +101 -0
  184. package/src/templates/mate-skills/claude/{mate-artifact-publish → mate-publish-artifact}/SKILL.md +91 -23
  185. package/src/templates/mate-skills/claude/{mate-artifact-publish → mate-publish-artifact}/references/openspec.md +4 -3
  186. package/src/templates/mate-skills/claude/mate-show-me/SKILL.md +74 -16
  187. package/src/templates/mate-skills/claude/mate-simplify-code/SKILL.md +74 -68
  188. package/src/templates/mate-skills/openspec-references.ts +140 -0
  189. package/src/templates/root/TEMPLATE_AGENTS.md +2 -2
  190. package/src/tools/setup/__snapshots__/runtime-surface-golden.test.ts.snap +3727 -320
  191. package/src/tools/setup/capabilities/context-mode.ts +25 -5
  192. package/src/tools/setup/capabilities/graphify-gate.ts +31 -0
  193. package/src/tools/setup/capabilities/graphify-secrets.ts +255 -0
  194. package/src/tools/setup/capabilities/graphify.ts +12 -0
  195. package/src/tools/setup/capabilities/openspec.ts +273 -270
  196. package/src/tools/setup/capabilities/tokensave.ts +36 -3
  197. package/src/tools/setup/context-services.ts +9 -17
  198. package/src/tools/setup/dynamic-plugins/audiences.ts +7 -39
  199. package/src/tools/setup/dynamic-plugins/declarations.ts +1 -1
  200. package/src/tools/setup/dynamic-plugins/hydrate.ts +4 -7
  201. package/src/tools/setup/dynamic-plugins/install.ts +24 -28
  202. package/src/tools/setup/engine.ts +93 -148
  203. package/src/tools/setup/managed-output.ts +51 -0
  204. package/src/tools/setup/mate.ts +86 -11
  205. package/src/tools/setup/plugin.ts +37 -17
  206. package/src/tools/setup/plugins/gitignore.ts +1 -7
  207. package/src/tools/setup/plugins/guidance.ts +7 -4
  208. package/src/tools/setup/providers/agent-file-sections.ts +4 -2
  209. package/src/tools/setup/providers/claude-attribution.ts +65 -0
  210. package/src/tools/setup/providers/claude-plugin-folders.ts +625 -0
  211. package/src/tools/setup/providers/claude-plugin-hooks.ts +39 -19
  212. package/src/tools/setup/providers/claude.ts +285 -34
  213. package/src/tools/setup/providers/opencode.ts +180 -11
  214. package/src/tools/setup/registry.ts +2 -24
  215. package/src/tools/setup/surface-target.ts +4 -13
  216. package/src/tools/setup/utils.ts +14 -4
  217. package/src/tools/setup.ts +131 -18
  218. package/wrappers/bin/graphify +52 -4
  219. package/wrappers/bin/openspec +33 -9
  220. package/wrappers/lib/graphify-gate.mjs +8 -0
  221. package/opencode-plugin/src/audience-layer.ts +0 -91
  222. package/src/cli/commands/studio/views/workflow/transcript.tsx +0 -190
  223. package/src/runtime/audience-layer.ts +0 -84
  224. package/src/runtime/opencode-audience-layer.ts +0 -176
  225. package/src/tools/setup/audience-isolation.fixture.ts +0 -325
  226. package/src/tools/setup/audience-layer.ts +0 -207
  227. package/src/tools/setup/audience-registrations.ts +0 -52
  228. package/src/tools/setup/contribution-ledger.ts +0 -207
  229. package/src/tools/setup/isolation-diagnostics.ts +0 -139
  230. package/src/tools/setup/runtime-documents.ts +0 -291
  231. package/src/tools/setup/upgrade-sweep.ts +0 -153
@@ -1,96 +1,14 @@
1
+ import { studioPaletteCss } from "./palette";
2
+
1
3
  /**
2
- * Theme-aware by tokens: the Workflow palette is the default, light mode is
3
- * applied through the system preference or the inline toggle, and explicit
4
- * theme attributes win over media queries.
4
+ * Theme-aware by tokens: the colour tokens come from the brand palette shared with
5
+ * reports (see `./palette`), dark is the default, light mode is applied through the
6
+ * system preference or the inline toggle, and explicit theme attributes win over
7
+ * media queries.
5
8
  */
6
9
  export const STUDIO_STYLES = `
7
- :root {
8
- color-scheme: dark;
9
- --bg: #0e1116;
10
- --bg-rail: #12171e;
11
- --panel: #171d26;
12
- --panel-soft: #1e2631;
13
- --border: #303b4a;
14
- --border-soft: #25303c;
15
- --text: #f3f6fa;
16
- --muted: #9aa8b8;
17
- --accent: #8cc7ff;
18
- --accent-soft: rgb(140 199 255 / 11%);
19
- --done: #9ee493;
20
- --done-soft: rgb(158 228 147 / 12%);
21
- --warn: #f6c56e;
22
- --warn-soft: rgb(246 197 110 / 12%);
23
- --bad: #ff8d87;
24
- --bad-soft: rgb(255 141 135 / 12%);
25
- --what: #74d3d8;
26
- --what-soft: rgb(116 211 216 / 12%);
27
- --why: #caa8ff;
28
- --why-soft: rgb(202 168 255 / 14%);
29
- --prompt-bg: #0a0d12;
30
- --prompt-text: #dce5f0;
31
- --shadow: 0 14px 36px rgb(0 0 0 / 22%);
32
- --mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, monospace;
33
- }
34
- @media (prefers-color-scheme: light) {
35
- :root:not([data-theme="dark"]) {
36
- color-scheme: light;
37
- --bg: #f3f6fa;
38
- --bg-rail: #f8fafc;
39
- --panel: #ffffff;
40
- --panel-soft: #eef4fa;
41
- --border: #cbd5e1;
42
- --border-soft: #e3eaf2;
43
- --text: #18212b;
44
- --muted: #637083;
45
- --accent: #1f66a6;
46
- --accent-soft: #e8f3fd;
47
- --done: #287b3b;
48
- --done-soft: #e7f5e9;
49
- --warn: #946300;
50
- --warn-soft: #fff4d9;
51
- --bad: #b42318;
52
- --bad-soft: #ffebe9;
53
- --what: #176b75;
54
- --what-soft: #e2f5f6;
55
- --why: #6346a5;
56
- --why-soft: #f0ebff;
57
- --prompt-bg: #17212b;
58
- --prompt-text: #edf4fb;
59
- --shadow: 0 12px 32px rgb(30 55 80 / 10%);
60
- }
61
- }
62
- @media (prefers-color-scheme: dark) {
63
- :root:not([data-theme="light"]) { color-scheme: dark; }
64
- }
65
- :root[data-theme="light"] {
66
- color-scheme: light;
67
- --bg: #f3f6fa;
68
- --bg-rail: #f8fafc;
69
- --panel: #ffffff;
70
- --panel-soft: #eef4fa;
71
- --border: #cbd5e1;
72
- --border-soft: #e3eaf2;
73
- --text: #18212b;
74
- --muted: #637083;
75
- --accent: #1f66a6;
76
- --accent-soft: #e8f3fd;
77
- --done: #287b3b;
78
- --done-soft: #e7f5e9;
79
- --warn: #946300;
80
- --warn-soft: #fff4d9;
81
- --bad: #b42318;
82
- --bad-soft: #ffebe9;
83
- --what: #176b75;
84
- --what-soft: #e2f5f6;
85
- --why: #6346a5;
86
- --why-soft: #f0ebff;
87
- --prompt-bg: #17212b;
88
- --prompt-text: #edf4fb;
89
- --shadow: 0 12px 32px rgb(30 55 80 / 10%);
90
- }
91
- :root[data-theme="dark"] {
92
- color-scheme: dark;
93
- }
10
+ ${studioPaletteCss()}
11
+ :root { --mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, monospace; }
94
12
 
95
13
  * { box-sizing: border-box; }
96
14
  body {
@@ -101,7 +19,7 @@ body {
101
19
  font-size: 14px;
102
20
  line-height: 1.5;
103
21
  }
104
- .shell { display: grid; grid-template-columns: 260px minmax(0, 1fr); min-height: 100vh; }
22
+ .shell { display: grid; grid-template-columns: 224px minmax(0, 1fr); min-height: 100vh; }
105
23
  @media (max-width: 900px) { .shell { grid-template-columns: 1fr; } }
106
24
 
107
25
  .rail {
@@ -112,6 +30,7 @@ body {
112
30
  flex-direction: column;
113
31
  gap: 24px;
114
32
  }
33
+ a { color: var(--accent); }
115
34
  select, button {
116
35
  font: inherit;
117
36
  color: inherit;
@@ -121,21 +40,33 @@ select, button {
121
40
  padding: 9px 11px;
122
41
  max-width: 100%;
123
42
  }
124
- select { width: 100%; }
43
+ /** Own chevron: the native one ignores padding and sits on the right border. */
44
+ select {
45
+ width: 100%;
46
+ appearance: none;
47
+ padding-right: 32px;
48
+ background-image: linear-gradient(45deg, transparent 50%, var(--muted) 50%), linear-gradient(135deg, var(--muted) 50%, transparent 50%);
49
+ background-position: calc(100% - 16px) 50%, calc(100% - 11px) 50%;
50
+ background-size: 5px 5px;
51
+ background-repeat: no-repeat;
52
+ }
125
53
  button { cursor: pointer; text-align: left; transition: border-color .15s, background .15s, color .15s; }
126
54
  button:hover { border-color: var(--accent); background: var(--accent-soft); }
127
55
  button:focus-visible, select:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
128
56
  .main { padding: 40px clamp(22px, 4vw, 64px) 72px; min-width: 0; background: var(--bg); }
129
57
  .main > * { width: min(100%, 1180px); margin-right: auto; margin-left: auto; }
58
+ /** A view's content sits on the page; only items and details are cards. */
59
+ .view-section { display: grid; gap: 18px; min-width: 0; }
60
+ .view-summary { margin: 0; color: var(--muted); font-size: .8rem; }
61
+ .view-intro { display: flex; flex-wrap: wrap; align-items: center; gap: 10px 24px; }
130
62
  .panel {
131
63
  background: var(--panel);
132
64
  border: 1px solid var(--border);
133
- border-radius: 12px;
65
+ border-radius: 8px;
134
66
  padding: 24px;
135
67
  margin-bottom: 16px;
136
- box-shadow: var(--shadow);
137
68
  }
138
- h1 { margin: 0; font-size: clamp(1.75rem, 3vw, 2.25rem); line-height: 1.1; letter-spacing: -.04em; }
69
+ h1 { margin: 0; font-size: 1.6rem; font-weight: 650; line-height: 1.2; letter-spacing: -.01em; }
139
70
  h3 { color: var(--text); font-size: 1.05rem; font-weight: 700; margin: 0; letter-spacing: -.02em; }
140
71
  h4 { font-size: .86rem; margin: 0 0 6px; font-family: var(--mono); }
141
72
  .note { color: var(--muted); font-size: .82rem; margin: 5px 0 14px; }
@@ -150,7 +81,6 @@ option.placeholder { color: var(--muted); font-style: italic; }
150
81
 
151
82
  .page-header { display: flex; align-items: stretch; justify-content: space-between; gap: 32px; padding-bottom: 24px; margin-bottom: 18px; border-bottom: 1px solid var(--border-soft); }
152
83
  .page-heading { min-width: 0; }
153
- .page-eyebrow { margin: 0 0 8px; color: var(--accent); font-family: var(--mono); font-size: .68rem; font-weight: 700; letter-spacing: .08em; text-transform: uppercase; }
154
84
  .page-context { display: grid; align-content: start; gap: 6px; min-width: min(100%, 300px); max-width: 380px; padding: 0; border: 0; border-radius: 0; background: transparent; }
155
85
  .page-context-label { color: var(--muted); font-size: .64rem; font-weight: 700; letter-spacing: .08em; text-transform: uppercase; }
156
86
  .page-context code { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
@@ -158,14 +88,14 @@ option.placeholder { color: var(--muted); font-style: italic; }
158
88
  .snapshot-dot { width: 6px; height: 6px; border-radius: 50%; background: var(--done); }
159
89
  .section-header { display: flex; align-items: flex-start; justify-content: space-between; gap: 20px; margin-bottom: 18px; }
160
90
  .section-note { margin: 4px 0 0; color: var(--muted); font-size: .8rem; }
161
- .section-count { flex: none; color: var(--muted); font-family: var(--mono); font-size: .72rem; }
91
+ .section-header h3 { color: var(--muted); font-family: inherit; font-size: .75rem; font-weight: 650; letter-spacing: .08em; text-transform: uppercase; }
162
92
 
163
93
  table { border-collapse: collapse; width: 100%; font-size: .88rem; }
164
94
  th, td { text-align: left; padding: 12px 10px; border-bottom: 1px solid var(--border-soft); vertical-align: top; }
165
95
  th:first-child, td:first-child { padding-left: 0; }
166
96
  th:last-child, td:last-child { padding-right: 0; }
167
97
  th { font-size: .7rem; text-transform: uppercase; letter-spacing: .06em; color: var(--muted); }
168
- tbody tr:hover td { background: var(--accent-soft); }
98
+ tbody tr:hover td { background: var(--panel-soft); }
169
99
  td.numeric { font-variant-numeric: tabular-nums; white-space: nowrap; }
170
100
  .lookup-table td:first-child { min-width: 180px; }
171
101
  .change-cell { display: flex; align-items: baseline; flex-wrap: wrap; gap: 6px 8px; }
@@ -175,9 +105,24 @@ td.numeric { font-variant-numeric: tabular-nums; white-space: nowrap; }
175
105
  .bar-fill { display: block; height: 100%; background: var(--done); }
176
106
  .artifact-list { display: flex; flex-wrap: wrap; gap: 5px 6px; }
177
107
  .lookup-table .chip { margin: 0; padding: 2px 7px; font-size: .68rem; }
178
- .status-chip { display: inline-block; padding: 3px 8px; border: 1px solid var(--border); border-radius: 999px; background: var(--panel-soft); color: var(--muted); font-family: var(--mono); font-size: .68rem; white-space: nowrap; }
179
- .status-chip[data-status="complete"] { border-color: var(--done); background: var(--done-soft); color: var(--done); }
180
- .status-chip[data-status="active"] { border-color: var(--accent); background: var(--accent-soft); color: var(--accent); }
108
+ .status-chip { display: inline-flex; align-items: center; gap: 6px; color: var(--muted); font-family: var(--mono); font-size: .68rem; white-space: nowrap; }
109
+ .status-chip[data-status="complete"] { color: var(--done); }
110
+ .status-chip:is([data-status="active"], [data-status="in-progress"]) { color: var(--info); }
111
+
112
+ /** Status markers use the report's tone shapes: dot complete, diamond active, square invalid, triangle warning. */
113
+ .status-chip::before, .chip-done::before, .chip-invalid::before, .spec-status::before, .picker-card[data-unready="true"] .picker-card-name::before {
114
+ content: "";
115
+ display: inline-block;
116
+ flex: none;
117
+ width: 8px;
118
+ height: 8px;
119
+ background: currentColor;
120
+ }
121
+ .status-chip::before { background: transparent; border: 1.5px solid currentColor; border-radius: 50%; box-sizing: border-box; }
122
+ .status-chip[data-status="complete"]::before, .chip-done::before, .spec-status::before { background: currentColor; border: 0; border-radius: 50%; }
123
+ .status-chip:is([data-status="active"], [data-status="in-progress"])::before { background: currentColor; border: 0; border-radius: 0; transform: rotate(45deg) scale(.85); }
124
+ .chip-invalid::before, .spec-status-invalid::before { border-radius: 0; }
125
+ .picker-card[data-unready="true"] .picker-card-name::before { margin-right: 7px; background: var(--warn); clip-path: polygon(50% 0, 100% 100%, 0 100%); }
181
126
 
182
127
  ul.plain { margin: 0; padding: 0; list-style: none; }
183
128
  ul.plain li { padding: 3px 0; border-bottom: 1px solid var(--border-soft); }
@@ -192,11 +137,12 @@ ul.plain li:last-child { border-bottom: 0; }
192
137
  border: 1px solid var(--border);
193
138
  background: var(--panel-soft);
194
139
  }
195
- .chip-done { background: var(--done-soft); border-color: var(--done); color: var(--done); }
196
- .chip-invalid { background: var(--bad-soft); border-color: var(--bad); color: var(--bad); }
140
+ .chip-done, .chip-invalid { display: inline-flex; align-items: center; gap: 5px; }
141
+ .chip-done { color: var(--done); }
142
+ .chip-invalid { color: var(--bad); }
197
143
  .toast {
198
144
  position: fixed; left: 50%; bottom: 24px; transform: translateX(-50%);
199
- background: var(--done); color: #0e1116; border-radius: 8px;
145
+ background: var(--done); color: var(--on-accent); border-radius: 8px;
200
146
  padding: 6px 14px; font-size: .8rem;
201
147
  opacity: 0; transition: opacity .16s; pointer-events: none; z-index: 20;
202
148
  }
@@ -204,27 +150,26 @@ ul.plain li:last-child { border-bottom: 0; }
204
150
  .toast-report { display: flex; gap: 10px; align-items: center; bottom: 64px; }
205
151
  .toast-report[data-shown="true"] { pointer-events: auto; }
206
152
  .toast-report a { color: inherit; font-weight: 700; text-decoration: underline; }
207
- .nav-badge { padding: 1px 6px; border-radius: 999px; background: var(--accent); color: #0e1116; font-size: .6rem; font-weight: 750; text-transform: uppercase; }
153
+ .nav-badge { padding: 1px 6px; border-radius: 999px; background: var(--accent); color: var(--on-accent); font-size: .6rem; font-weight: 750; text-transform: uppercase; }
208
154
  .reports-layout { display: grid; grid-template-columns: minmax(200px, 280px) 1fr; gap: 12px; min-height: 60vh; }
209
155
  .reports-list { display: grid; gap: 4px; margin: 0; padding: 0; list-style: none; }
210
156
  .reports-list button { width: 100%; padding: 8px 10px; text-align: left; font-size: .78rem; }
211
157
  .reports-list button[aria-pressed="true"] { border-color: var(--accent); background: var(--accent-soft); }
212
158
  .reports-list .report-time { display: block; color: var(--muted); font-size: .66rem; }
213
159
  .reports-main { display: grid; grid-template-rows: auto 1fr; gap: 8px; }
214
- .reports-frame { width: 100%; height: 100%; min-height: 60vh; border: 1px solid var(--border); border-radius: 8px; background: #fff; }
160
+ .reports-frame { width: 100%; height: 100%; min-height: 60vh; border: 1px solid var(--border); border-radius: 8px; }
215
161
 
216
162
  .warnings { border-color: var(--warn); }
217
163
  .error { border-color: var(--bad); }
218
164
 
219
- .runway-step-badge { padding: 1px 5px; border: 1px solid var(--badge); background: var(--badge-soft); color: var(--badge); font-size: .62rem; font-style: normal; font-weight: 750; letter-spacing: .08em; text-transform: uppercase; }
220
- .runway-step-badge-optional { --badge: var(--warn); --badge-soft: var(--warn-soft); }
221
- .runway-step-badge-skill { --badge: var(--what); --badge-soft: var(--what-soft); }
222
- .runway-step-badge-openspec { --badge: var(--accent); --badge-soft: var(--accent-soft); }
223
- .runway-step-badge-human-in-loop { --badge: var(--why); --badge-soft: var(--why-soft); }
165
+ .runway-step-badge { padding: 1px 5px; border: 1px solid var(--badge); background: var(--badge-soft); color: var(--badge-text); font-size: .62rem; font-style: normal; font-weight: 750; letter-spacing: .08em; text-transform: uppercase; }
166
+ .runway-step-badge-optional { --badge: var(--warn); --badge-soft: var(--warn-soft); --badge-text: var(--warn); }
167
+ .runway-step-badge-skill { --badge: var(--what); --badge-soft: var(--what-soft); --badge-text: var(--what); }
168
+ .runway-step-badge-openspec { --badge: var(--accent); --badge-soft: var(--accent-soft); --badge-text: var(--text); }
169
+ .runway-step-badge-human-in-loop { --badge: var(--why); --badge-soft: var(--why-soft); --badge-text: var(--why); }
170
+ .runway-step-badge-human-review { --badge: var(--why); --badge-soft: var(--why-soft); --badge-text: var(--why); }
224
171
  .runway-step-copy { align-self: start; padding: 5px 8px; border-color: var(--border); background: transparent; color: var(--muted); font-size: .68rem; white-space: nowrap; }
225
172
  .runway-step-copy:hover { background: var(--accent-soft); color: var(--text); }
226
- .workflow-session-break { display: grid; grid-template-columns: minmax(20px, 1fr) auto minmax(20px, 1fr); align-items: center; gap: 10px; padding: 9px 0; color: var(--muted); font-family: var(--mono); font-size: .63rem; letter-spacing: .04em; text-align: center; }
227
- .workflow-session-break::before, .workflow-session-break::after { height: 1px; background: var(--border); content: ""; }
228
173
 
229
174
  /** The compact navigation rail keeps scope, navigation, and status visible together. */
230
175
  .studio-sidebar {
@@ -232,41 +177,47 @@ ul.plain li:last-child { border-bottom: 0; }
232
177
  top: 0;
233
178
  height: 100vh;
234
179
  min-width: 0;
235
- padding: 22px 18px 24px;
236
- gap: 26px;
180
+ padding: 18px 14px 16px;
181
+ gap: 18px;
237
182
  overflow-y: auto;
238
183
  }
239
184
  .sidebar-brand { display: flex; align-items: center; gap: 10px; min-width: 0; }
240
- .sidebar-brand-mark { display: grid; place-items: center; width: 30px; height: 30px; border-radius: 8px; background: var(--accent); color: var(--bg-rail); font-size: .72rem; font-weight: 800; }
185
+ .sidebar-brand-mark { display: block; flex: none; width: 30px; height: 30px; }
186
+ .brand-symbol-color { display: none; }
187
+ @media (prefers-color-scheme: light) {
188
+ :root:not([data-theme="dark"]) .brand-symbol-color { display: block; }
189
+ :root:not([data-theme="dark"]) .brand-symbol-on-dark { display: none; }
190
+ }
191
+ :root[data-theme="light"] .brand-symbol-color { display: block; }
192
+ :root[data-theme="light"] .brand-symbol-on-dark { display: none; }
241
193
  .sidebar-brand-copy { display: grid; gap: 1px; min-width: 0; }
242
194
  .sidebar-brand-copy strong { font-size: .9rem; letter-spacing: -.02em; }
243
- .sidebar-brand-copy span { color: var(--muted); font-size: .68rem; }
244
195
  .sidebar-label { color: var(--muted); font-size: .62rem; font-weight: 750; letter-spacing: .1em; text-transform: uppercase; }
245
196
  .sidebar-scope { display: grid; gap: 7px; }
246
- .sidebar-scope select { padding: 8px 9px; font-family: var(--mono); font-size: .72rem; }
197
+ .sidebar-scope select { padding: 8px 32px 8px 9px; font-family: var(--mono); font-size: .72rem; }
247
198
  .sidebar-nav { display: grid; gap: 3px; }
248
199
  .sidebar-nav-list { display: grid; gap: 2px; margin: 0; padding: 0; list-style: none; }
249
- .sidebar-nav button { display: flex; align-items: center; justify-content: space-between; width: 100%; padding: 8px 10px; border-color: transparent; border-radius: 7px; background: transparent; font-size: .8rem; }
200
+ .sidebar-nav button { display: flex; align-items: center; justify-content: space-between; width: 100%; padding: 6px 10px; border-color: transparent; border-radius: 7px; background: transparent; font-size: .8rem; }
250
201
  .sidebar-nav button:hover, .sidebar-nav button[aria-pressed="true"] { border-color: var(--border); background: var(--accent-soft); }
251
- .sidebar-nav button[aria-pressed="true"] { color: var(--accent); font-weight: 700; }
252
- .sidebar-metrics { display: grid; grid-template-columns: repeat(3, 1fr); gap: 5px; }
253
- .sidebar-metric { display: grid; gap: 1px; padding: 8px 6px; border: 1px solid var(--border-soft); border-radius: 7px; background: var(--panel-soft); }
254
- .sidebar-metric strong { font-size: .9rem; font-variant-numeric: tabular-nums; }
255
- .sidebar-metric span { color: var(--muted); font-size: .58rem; letter-spacing: .06em; text-transform: uppercase; }
202
+ .sidebar-nav button[aria-pressed="true"] { color: var(--text); font-weight: 700; }
203
+ /** The stats stack as one column: label left, number right, like the report's key-value rows. */
204
+ .sidebar-metrics { display: grid; }
205
+ .sidebar-metric { display: flex; align-items: baseline; justify-content: space-between; gap: 8px; padding: 5px 2px; border-top: 1px solid var(--border); }
206
+ .sidebar-metric:last-child { border-bottom: 1px solid var(--border); }
207
+ .sidebar-metric strong { order: 1; font-size: .95rem; font-variant-numeric: tabular-nums; font-weight: 650; line-height: 1.2; }
208
+ .sidebar-metric span { color: var(--muted); font-size: .75rem; }
256
209
  .sidebar-footer { display: grid; gap: 6px; margin-top: auto; }
257
210
  .sidebar-footer-row { display: flex; align-items: center; justify-content: space-between; gap: 8px; }
258
211
  .sidebar-footer button { width: 100%; padding: 7px 8px; font-size: .72rem; }
259
212
 
260
213
  /** Specs uses the same full-bleed content treatment as Workflow. */
261
- .specs-eyebrow { color: var(--accent); font-size: .68rem; font-weight: 800; letter-spacing: .14em; text-transform: uppercase; }
262
214
  .specs-intro { display: flex; align-items: flex-end; justify-content: space-between; gap: 28px; margin-bottom: 26px; }
263
215
  .specs-intro-copy { max-width: 54ch; }
264
216
  .specs-intro-copy p { margin: 0; color: var(--muted); }
265
- .specs-summary { display: grid; grid-template-columns: repeat(3, minmax(84px, 1fr)); min-width: 290px; border-top: 1px solid var(--border); border-bottom: 1px solid var(--border); }
266
- .specs-summary-item { display: grid; gap: 1px; padding: 12px 10px; border-right: 1px solid var(--border); }
267
- .specs-summary-item:last-child { border-right: 0; }
268
- .specs-summary-item strong { font-size: 1.25rem; font-variant-numeric: tabular-nums; }
269
- .specs-summary-item span { color: var(--muted); font-size: .62rem; text-transform: uppercase; letter-spacing: .08em; }
217
+ .specs-summary { display: grid; grid-template-columns: repeat(3, minmax(84px, 1fr)); gap: 20px; min-width: 290px; }
218
+ .specs-summary-item { display: grid; gap: 2px; padding-top: 10px; border-top: 1px solid var(--border); }
219
+ .specs-summary-item strong { font-size: 1.6rem; font-variant-numeric: tabular-nums; font-weight: 650; line-height: 1.2; }
220
+ .specs-summary-item span { color: var(--muted); font-size: .8rem; }
270
221
  .picker-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(252px, 1fr)); gap: 12px; }
271
222
  .picker-card { display: grid; align-content: start; gap: 5px; padding: 16px; }
272
223
  .picker-card[data-unready="true"] { border-color: var(--warn); }
@@ -275,33 +226,26 @@ ul.plain li:last-child { border-bottom: 0; }
275
226
  .picker-card-meta { display: flex; flex-wrap: wrap; margin-top: 5px; }
276
227
 
277
228
  .specs-area-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(290px, 1fr)); gap: 14px; }
278
- .specs-area-card { padding: 18px; border: 1px solid var(--border); border-radius: 10px; background: var(--panel); }
279
- .specs-area-card-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 14px; min-height: 58px; padding-bottom: 16px; border-bottom: 1px solid var(--border-soft); }
280
- .specs-area-number { color: var(--muted); font-family: var(--mono); font-size: .68rem; }
281
- .specs-area-name { display: flex; align-items: baseline; gap: 9px; min-width: 0; }
282
- .specs-area-name h4 { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
229
+ .specs-area-card { padding: 18px; border: 1px solid var(--border); border-radius: 8px; background: var(--panel); }
230
+ .specs-area-card-head { display: flex; align-items: baseline; justify-content: space-between; gap: 14px; padding-bottom: 12px; border-bottom: 1px solid var(--border-soft); }
231
+ .specs-area-name { min-width: 0; margin: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
283
232
  .specs-area-count { color: var(--muted); font-family: var(--mono); font-size: .7rem; white-space: nowrap; }
284
233
  .specs-card-list { display: grid; gap: 7px; margin-top: 14px; }
285
234
  .spec-card-row { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 12px; align-items: center; padding: 10px 0; border-bottom: 1px solid var(--border-soft); }
286
235
  .spec-card-row:last-child { border-bottom: 0; padding-bottom: 0; }
287
236
  .spec-card-row:first-child { padding-top: 0; }
288
- .spec-card-row strong { overflow: hidden; font-family: var(--mono); font-size: .78rem; text-overflow: ellipsis; white-space: nowrap; }
237
+ .spec-card-row > div { min-width: 0; }
238
+ /** Long capability names wrap at their hyphens instead of running under the actions. */
239
+ .spec-card-row strong { display: block; font-family: var(--mono); font-size: .78rem; line-height: 1.35; overflow-wrap: anywhere; }
289
240
  .spec-card-meta { display: flex; align-items: center; gap: 7px; color: var(--muted); font-size: .7rem; }
290
241
  .spec-card-end { display: inline-flex; flex-wrap: wrap; align-items: center; justify-content: flex-end; gap: 8px; }
291
242
  .spec-copy { display: inline-flex; align-items: center; align-self: center; padding: 4px 6px; }
292
243
  .spec-actions { display: inline-flex; gap: 6px; }
293
244
  .spec-action { padding: 3px 7px; font-size: .68rem; }
294
245
  html[data-agent-viewed] [data-studio-action] { display: none; }
295
- .spec-status { padding: 2px 5px; border: 1px solid var(--done); background: var(--done-soft); color: var(--done); font-family: var(--mono); font-size: .61rem; text-transform: uppercase; }
296
- .spec-status-invalid { border-color: var(--bad); background: var(--bad-soft); color: var(--bad); }
246
+ .spec-status { display: inline-flex; align-items: center; gap: 6px; color: var(--done); font-family: var(--mono); font-size: .61rem; text-transform: uppercase; }
247
+ .spec-status-invalid { color: var(--bad); }
297
248
 
298
- .skills-tab-list { display: flex; gap: 5px; border-bottom: 1px solid var(--border); }
299
- .skills-tab-list button { display: grid; gap: 3px; min-width: 150px; padding: 10px 12px; border: 0; border-bottom: 2px solid transparent; border-radius: 0; background: transparent; color: var(--muted); }
300
- .skills-tab-list button:hover { background: var(--accent-soft); }
301
- .skills-tab-list button[aria-selected="true"] { border-bottom-color: var(--accent); background: var(--panel-soft); color: var(--text); }
302
- .skills-tab-list button strong { font-family: var(--mono); font-size: .74rem; text-align: left; }
303
- .skills-tab-list button span { font-size: .68rem; text-align: left; }
304
- .skills-panels { padding-top: 18px; }
305
249
  .skills-panels > [data-active="false"] { display: none; }
306
250
  .skills-panel-description { margin: 0 0 16px; color: var(--muted); font-size: .8rem; }
307
251
  .skills-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 10px; }
@@ -314,63 +258,110 @@ html[data-agent-viewed] [data-studio-action] { display: none; }
314
258
  .page-header { display: grid; gap: 18px; }
315
259
  .page-context { min-width: 0; max-width: none; }
316
260
  .section-header { gap: 10px; }
317
- .skills-tab-list button { min-width: 0; flex: 1; }
318
261
  }
319
262
 
320
263
  @media (min-width: 901px) {
321
- .shell:has(.studio-sidebar) { grid-template-columns: 260px minmax(0, 1fr); }
264
+ .shell:has(.studio-sidebar) { grid-template-columns: 224px minmax(0, 1fr); }
322
265
  }
323
266
  @media (max-width: 900px) {
324
267
  .studio-sidebar { position: relative; height: auto; max-height: none; }
325
268
  }
326
269
 
327
- /** Production Workflow transcript. */
270
+ /** Production Workflow Delivery Path. */
328
271
  .workflow-view { margin: 0 auto; }
329
- .workflow-eyebrow { margin: 0 0 10px; color: var(--muted); font-family: var(--mono); font-size: .68rem; font-weight: 700; letter-spacing: .08em; text-transform: uppercase; }
330
- .workflow-console { width: 100%; overflow: hidden; border: 1px solid var(--border); border-radius: 12px; background: var(--panel); color: var(--text); box-shadow: none; }
331
- .workflow-console-header { display: grid; grid-template-columns: 1fr auto; gap: 16px; align-items: center; padding: 14px 18px; border-bottom: 1px solid var(--border); background: var(--panel-soft); color: var(--muted); font-family: system-ui, sans-serif; font-size: .68rem; }
332
- .workflow-console-header-title { display: grid; gap: 2px; }
333
- .workflow-console-header-title > span { color: var(--accent); font-family: var(--mono); font-size: .62rem; font-weight: 700; letter-spacing: .08em; text-transform: uppercase; }
334
- .workflow-console-header-title strong { color: var(--text); font-size: .84rem; }
335
- .workflow-console-header > span:last-child { text-align: right; }
336
- .workflow-console-body { padding: 22px clamp(14px, 3vw, 34px) 26px; }
337
- .workflow-console-context { display: grid; grid-template-columns: auto minmax(0, 1fr); gap: 10px 18px; align-items: start; margin: 4px 0 18px 55px; padding: 11px 0 15px; border-bottom: 1px solid var(--border); }
338
- .workflow-console-context > span { color: var(--why); font-family: var(--mono); font-size: .62rem; text-transform: uppercase; }
339
- .workflow-console-context > div { display: grid; gap: 3px; }
340
- .workflow-console-context p { margin: 0; color: var(--text); font-family: system-ui, sans-serif; font-size: .72rem; line-height: 1.35; }
341
- .workflow-console-context small { color: var(--muted); font-family: system-ui, sans-serif; font-size: .68rem; line-height: 1.35; }
342
- .workflow-console-tabs { display: flex; gap: 5px; margin-left: 55px; border-bottom: 1px solid var(--border); }
343
- .workflow-console-tabs button { display: grid; gap: 3px; min-width: 150px; padding: 10px 12px; border: 0; border-bottom: 2px solid transparent; background: transparent; color: var(--muted); }
344
- .workflow-console-tabs button:hover { background: var(--panel); }
345
- .workflow-console-tabs button[aria-selected="true"] { border-bottom-color: var(--accent); background: var(--panel); color: var(--text); }
346
- .workflow-console-tabs button strong { font-family: var(--mono); font-size: .72rem; text-align: left; }
347
- .workflow-console-tabs button small { font-size: .65rem; text-align: left; }
348
- .workflow-console-panels { margin-left: 20px; padding-left: 35px; border-left: 1px dashed var(--border); }
349
- .workflow-console-panels > [data-active="false"] { display: none; }
350
- .workflow-console-branch-rule { display: grid; gap: 4px; padding: 16px 0 6px; }
351
- .workflow-console-branch-rule-description { max-width: 70ch; margin: 0; color: var(--muted); font-family: system-ui, sans-serif; font-size: .73rem; line-height: 1.4; }
352
- .workflow-console-line { display: grid; grid-template-columns: 42px minmax(0, 1fr); gap: 13px; padding: 12px 0; }
353
- .workflow-console-gutter { color: var(--muted); font-family: var(--mono); font-size: .66rem; opacity: .7; }
354
- .workflow-console-line-body { min-width: 0; }
355
- .workflow-console-step-title { display: flex; align-items: center; flex-wrap: wrap; gap: 7px; margin-bottom: 7px; }
356
- .workflow-console-step-title strong { color: var(--text); font-family: var(--mono); font-size: .71rem; }
357
- .workflow-console-command { display: grid; grid-template-columns: auto minmax(0, 1fr) auto; gap: 9px; align-items: center; padding: 9px 10px; border: 1px solid var(--border-soft); border-radius: 7px; background: var(--panel-soft); }
358
- .workflow-console-command-label { color: var(--accent); font-family: var(--mono); font-size: .62rem; font-weight: 700; letter-spacing: .04em; text-transform: uppercase; }
359
- .workflow-console-command code { color: var(--text); font-family: var(--mono); font-size: .78rem; overflow-wrap: anywhere; }
360
- .workflow-console-command .runway-step-copy { border-color: var(--border); }
361
- .workflow-console-explanation { display: grid; gap: 6px; margin-top: 10px; }
362
- .workflow-console-detail { display: grid; grid-template-columns: 32px minmax(0, 1fr); gap: 10px; align-items: baseline; }
363
- .workflow-console-detail > span { color: var(--muted); font-family: var(--mono); font-size: .6rem; font-weight: 700; letter-spacing: .04em; text-transform: uppercase; }
272
+ .workflow-delivery-path { width: 100%; color: var(--text); }
273
+ .workflow-schema-panels > [data-active="false"] { display: none; }
274
+ .view-choice { display: flex; flex-wrap: wrap; align-items: center; gap: 10px; margin: 0; color: var(--muted); font-family: var(--mono); font-size: .66rem; }
275
+ .view-choice select { width: auto; max-width: 100%; padding: 6px 32px 6px 10px; border: 1px solid var(--border); border-radius: 6px; background-color: var(--panel-soft); color: var(--text); font: inherit; font-size: .74rem; }
276
+ .view-choice select:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
277
+ .view-choice code { color: var(--text); font-size: .74rem; }
278
+ .workflow-description { max-width: 70ch; margin: 0; color: var(--muted); font-family: system-ui, sans-serif; font-size: .73rem; line-height: 1.4; }
279
+ .workflow-command { display: grid; grid-template-columns: auto minmax(0, 1fr) auto; gap: 10px; align-items: center; padding: 6px 6px 6px 10px; border-radius: 6px; background: var(--panel-soft); }
280
+ .workflow-command-label { color: var(--muted); font-family: var(--mono); font-size: .6rem; font-weight: 700; letter-spacing: .06em; text-transform: uppercase; }
281
+ .workflow-command code { color: var(--text); font-family: var(--mono); font-size: .78rem; overflow-wrap: anywhere; }
282
+ .workflow-command .runway-step-copy { align-self: center; border-color: var(--border-soft); }
364
283
  .workflow-badges { display: inline-flex; flex-wrap: wrap; gap: 4px; }
365
284
  .workflow-badges .runway-step-badge { font-size: .56rem; }
366
- .workflow-console-explanation p, .workflow-console-explanation small { margin: 0; color: var(--muted); font-family: system-ui, sans-serif; font-size: .73rem; line-height: 1.4; }
367
- .workflow-console-explanation p { color: var(--text); }
368
- .workflow-console-divider { display: flex; align-items: center; gap: 12px; padding: 16px 0 4px 55px; color: var(--accent); font-family: var(--mono); font-size: .63rem; text-transform: uppercase; }
369
- .workflow-console-divider::after { flex: 1; height: 1px; background: var(--border); content: ""; }
370
- .workflow-option-list { display: grid; gap: 3px; margin: 8px 0 0 18px; }
371
- .workflow-option { display: grid; gap: 1px; padding-left: 8px; }
372
- .workflow-option small { color: var(--muted); font-size: .65rem; line-height: 1.35; }
285
+ .workflow-graph-openspec { display: inline-block; flex: none; width: 6px; height: 6px; margin-right: 6px; border-radius: 50%; background: var(--accent); vertical-align: middle; }
286
+ .workflow-graph-legend { display: flex; flex-wrap: wrap; justify-content: center; gap: 6px 18px; margin: 0; padding: 0; color: var(--muted); font-family: var(--mono); font-size: .62rem; list-style: none; }
287
+ .workflow-graph-legend li { display: inline-flex; align-items: center; gap: 6px; }
288
+ .workflow-graph-legend .workflow-graph-openspec { margin-right: 0; }
289
+ .workflow-legend-optional { width: 14px; height: 9px; border: 1px dashed var(--muted); border-radius: 3px; }
290
+ .workflow-legend-session { width: 7px; height: 7px; border: 1.5px solid var(--accent); border-radius: 50%; }
291
+ .workflow-legend-skip { width: 16px; border-top: 1.5px dotted var(--muted); }
292
+ /** The graph is centred with the stage panel beside it when wide enough, above it otherwise. */
293
+ .workflow-schema { container-type: inline-size; }
294
+ .workflow-path { display: grid; gap: 24px; padding-top: 56px; }
295
+ /** Room outside the graph for its workset frame. */
296
+ .workflow-path-graph { display: grid; justify-items: center; gap: 36px; min-width: 0; }
297
+ .workflow-path-graph > .workflow-graph { width: min(100% - 64px, 440px); }
298
+ /** The one card on the view: the selected stage, or the path overview. */
299
+ .workflow-detail { min-width: 0; padding: 18px 20px 20px; border: 1px solid var(--border); border-radius: 8px; background: var(--panel); }
300
+ @container (min-width: 760px) {
301
+ /* Graph and card sit together at the left; 504px holds the graph and its workset frame. */
302
+ .workflow-path { grid-template-columns: minmax(0, 504px) minmax(300px, 420px); justify-content: start; gap: 40px; align-items: start; }
303
+ /* Top-aligned with the workset frame, which rises 34px above the graph. */
304
+ .workflow-detail { position: sticky; top: 16px; margin-top: -34px; }
305
+ }
306
+ /** Only the targeted card shows; with none targeted the overview does. */
307
+ .workflow-detail .workflow-card { display: none; }
308
+ .workflow-detail:has(.workflow-card:target) .workflow-detail-overview { display: none; }
309
+ /** Rows are equal and lanes 2fr with a 1fr bypass lane, matching the SVG drawing units. */
310
+ .workflow-graph { --graph-gutter: 3.75rem; position: relative; padding-left: var(--graph-gutter); }
311
+ .workflow-graph-bands { position: absolute; inset: 0; }
312
+ .workflow-graph-band { position: absolute; right: 0; left: 0; padding-top: 7px; color: var(--muted); font-family: var(--mono); font-size: .56rem; font-weight: 700; letter-spacing: .08em; text-transform: uppercase; }
313
+ /** The workset: the changes published together, framed around the per-change cycle and Publish. */
314
+ .workflow-graph-workset { position: absolute; inset: -34px -30px -16px; border: 1px solid var(--muted); border-radius: 16px; }
315
+ .workflow-graph-workset span { position: absolute; top: -8px; left: 16px; padding: 0 6px; background: var(--bg); color: var(--text); font-family: var(--mono); font-size: .56rem; font-weight: 700; letter-spacing: .06em; }
316
+ /** The stages each change repeats, framed like a fieldset; Publish stays outside. */
317
+ .workflow-graph-cycle { position: absolute; right: -14px; left: -14px; box-sizing: content-box; margin-top: -14px; padding-top: 14px; border: 1px dashed var(--why); border-radius: 12px; }
318
+ .workflow-graph-cycle span { position: absolute; top: -8px; right: 14px; padding: 0 6px; background: var(--bg); color: var(--why); font-family: var(--mono); font-size: .56rem; font-weight: 700; letter-spacing: .06em; }
319
+ .workflow-graph-layer { position: absolute; top: 0; left: var(--graph-gutter); width: calc(100% - var(--graph-gutter)); height: 100%; overflow: visible; pointer-events: none; }
320
+ .workflow-graph-edge { fill: none; stroke: var(--muted); stroke-width: 1.25; vector-effect: non-scaling-stroke; }
321
+ .workflow-graph-edge[data-edge-kind="bypass"] { stroke-dasharray: 3 4; }
322
+ .workflow-graph-edge[data-new-session="true"] { stroke: var(--accent); }
323
+ .workflow-graph-start { fill: var(--muted); }
324
+ .workflow-graph-session { fill: var(--bg); stroke: var(--accent); stroke-width: 1.5; }
325
+ .workflow-graph-nodes { position: relative; display: grid; grid-template-columns: repeat(var(--graph-rows), minmax(0, 2fr)) minmax(0, 1fr); grid-template-rows: repeat(var(--graph-columns), minmax(3.5rem, 1fr)); margin: 0; padding: 0; list-style: none; }
326
+ .workflow-graph-node { display: flex; align-items: center; justify-content: center; min-width: 0; padding: 8px 4px; grid-row: var(--graph-row); grid-column: var(--graph-lane) / span var(--graph-span); }
327
+ .workflow-graph-box { max-width: 100%; padding: 5px 10px; border: 1px solid var(--border); border-radius: 6px; background: var(--panel); }
328
+ .workflow-graph-link { display: block; color: var(--text); font-family: var(--mono); font-size: .7rem; line-height: 1.3; text-align: center; text-decoration: none; overflow-wrap: anywhere; transition: border-color .15s, background .15s; }
329
+ .workflow-graph-box[data-optional="true"] { border-style: dashed; border-color: var(--muted); }
330
+ .workflow-graph-group { display: grid; gap: 3px; padding: 6px 8px; border-color: var(--why); }
331
+ .workflow-graph-group-label { color: var(--why); font-family: var(--mono); font-size: .52rem; font-weight: 700; letter-spacing: .08em; text-align: center; text-transform: uppercase; }
332
+ .workflow-graph-group ol { display: flex; flex-wrap: wrap; justify-content: center; gap: 2px 4px; margin: 0; padding: 0; list-style: none; }
333
+ .workflow-graph-group .workflow-graph-link { padding: 1px 4px; border-radius: 4px; color: var(--why); }
334
+ .workflow-graph-link:hover, .workflow-graph-link:focus-visible { border-color: var(--accent); background: var(--accent-soft); }
335
+ .workflow-graph-link:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
336
+ .workflow-graph-link[aria-current="true"] { border-color: var(--accent); background: var(--accent-soft); color: var(--text); }
337
+ /** Flat stage block: the badges carry optional and human review; the graph carries the shape. */
338
+ .workflow-missing-skill { margin: 8px 0 0; color: var(--warn); font-family: system-ui, sans-serif; font-size: .7rem; }
339
+ .workflow-detail-overview { display: grid; gap: 8px; }
340
+ .workflow-detail-hint { margin: 0; color: var(--text); font-family: system-ui, sans-serif; font-size: .78rem; line-height: 1.5; }
341
+ /** Selected stage: header, action, purpose, footer, on one 16px rhythm. */
342
+ .workflow-card { min-width: 0; scroll-margin-top: 16px; }
343
+ .workflow-detail .workflow-card:target { display: grid; gap: 16px; }
344
+ .workflow-card-header { display: grid; gap: 6px; }
345
+ .workflow-card-heading { display: flex; flex-wrap: wrap; align-items: center; gap: 6px 10px; }
346
+ .workflow-card-heading h3 { margin: 0; color: var(--text); font-family: var(--mono); font-size: .9rem; font-weight: 700; }
347
+ .workflow-card-meta { display: flex; flex-wrap: wrap; gap: 2px 14px; margin: 0; color: var(--muted); font-family: var(--mono); font-size: .66rem; }
348
+ .workflow-card-meta code { font-family: inherit; font-size: inherit; }
349
+ /** In the panel a prompt gets its own line under its label and copy control. */
350
+ .workflow-detail .workflow-command { grid-template-columns: minmax(0, 1fr) auto; row-gap: 6px; padding: 8px 8px 10px 10px; }
351
+ .workflow-detail .workflow-command code { grid-column: 1 / -1; grid-row: 2; font-size: .76rem; line-height: 1.45; overflow-wrap: break-word; }
352
+ .workflow-card-session { color: var(--accent); }
353
+ .workflow-card-human { margin: 0; padding: 9px 10px; border-radius: 6px; background: var(--panel-soft); color: var(--muted); font-family: system-ui, sans-serif; font-size: .74rem; line-height: 1.45; }
354
+ .workflow-card-explanation { display: grid; gap: 12px; margin: 0; }
355
+ .workflow-card-explanation dt { margin-bottom: 3px; color: var(--muted); font-family: var(--mono); font-size: .58rem; font-weight: 700; letter-spacing: .08em; text-transform: uppercase; }
356
+ .workflow-card-explanation dd { margin: 0; color: var(--text); font-family: system-ui, sans-serif; font-size: .78rem; line-height: 1.5; }
357
+ .workflow-card-explanation div + div dd { color: var(--muted); }
358
+ .workflow-card-footer { padding-top: 12px; border-top: 1px solid var(--border-soft); }
359
+ .workflow-card-footer a { color: var(--muted); font-size: .72rem; text-underline-offset: 3px; }
360
+ .workflow-card-footer a:hover { color: var(--text); }
361
+ .workflow-option-list { display: grid; gap: 12px; }
362
+ .workflow-option { display: grid; }
373
363
  .workflow-option .runway-step-copy { justify-self: start; }
364
+ .workflow-option small { margin-top: 5px; padding: 0 2px; color: var(--muted); font-size: .7rem; line-height: 1.45; }
374
365
 
375
366
  .vault-layout { display: grid; grid-template-columns: minmax(220px, 300px) minmax(0, 1fr); gap: 16px; align-items: start; }
376
367
  :root[data-vault-tree="hidden"] .vault-layout { grid-template-columns: minmax(0, 1fr); }
@@ -397,7 +388,7 @@ html[data-agent-viewed] [data-studio-action] { display: none; }
397
388
  .vault-file { display: flex; text-decoration: none; align-items: center; gap: 6px; width: 100%; overflow: hidden; padding: 4px 6px 4px 24px; border: 0; border-radius: 6px; background: transparent; color: var(--text); font-size: .8rem; text-align: left; white-space: nowrap; }
398
389
  .vault-file span, .vault-directory > summary span { overflow: hidden; text-overflow: ellipsis; }
399
390
  .vault-file:hover { background: var(--accent-soft); }
400
- .vault-file[aria-current="page"] { background: var(--accent-soft); color: var(--accent); font-weight: 600; }
391
+ .vault-file[aria-current="page"] { background: var(--accent-soft); color: var(--text); font-weight: 600; }
401
392
  .vault-bar { display: flex; align-items: center; gap: 12px; min-height: 36px; margin-bottom: 12px; }
402
393
  .vault-tree-toggle { flex: none; padding: 5px 10px; font-size: .78rem; }
403
394
  .vault-breadcrumb ol { display: flex; flex-wrap: wrap; align-items: center; margin: 0; padding: 0; list-style: none; font-size: .95rem; }
@@ -419,24 +410,44 @@ html[data-agent-viewed] [data-studio-action] { display: none; }
419
410
  #vault-editor { display: block; width: 100%; min-height: 62vh; resize: vertical; padding: 16px; border: 1px solid var(--border); border-radius: 8px; background: var(--prompt-bg); color: var(--prompt-text); font-family: var(--mono); font-size: .86rem; line-height: 1.6; }
420
411
  #vault-editor:focus { outline: 2px solid var(--accent); outline-offset: 2px; }
421
412
  #vault-editor[readonly] { cursor: default; opacity: .85; }
413
+ .vault-actions { display: flex; align-items: center; gap: 8px; }
414
+ .vault-mode-link { display: inline-block; padding: 9px 11px; border: 1px solid var(--border); border-radius: 8px; background: var(--panel); color: inherit; font: inherit; text-decoration: none; }
415
+ .vault-mode-link:hover { background: var(--panel-soft); color: var(--accent); }
416
+ .markdown-body { padding: 4px 2px; line-height: 1.65; overflow-wrap: anywhere; }
417
+ .markdown-body > :first-child { margin-top: 0; }
418
+ .markdown-body h1, .markdown-body h2 { padding-bottom: .3em; border-bottom: 1px solid var(--border); }
419
+ .markdown-body h1, .markdown-body h2, .markdown-body h3, .markdown-body h4, .markdown-body h5, .markdown-body h6 { margin: 1.4em 0 .6em; line-height: 1.25; }
420
+ .markdown-body p, .markdown-body ul, .markdown-body ol, .markdown-body blockquote, .markdown-body pre, .markdown-body .md-table { margin: 0 0 1em; }
421
+ .markdown-body ul, .markdown-body ol { padding-left: 2em; }
422
+ .markdown-body li > ul, .markdown-body li > ol { margin: .25em 0 0; }
423
+ .markdown-body li.md-task { list-style: none; margin-left: -1.4em; }
424
+ .markdown-body li.md-task input { margin: 0 .5em 0 0; vertical-align: middle; }
425
+ .markdown-body blockquote { padding: 0 1em; border-left: .25em solid var(--border); color: var(--muted); }
426
+ .markdown-body code { padding: .15em .35em; border-radius: 6px; background: var(--panel-soft); font-family: var(--mono); font-size: .86em; }
427
+ .markdown-body pre { overflow: auto; padding: 14px 16px; border: 1px solid var(--border); border-radius: 8px; line-height: 1.5; }
428
+ .markdown-body pre code { padding: 0; background: transparent; font-size: .84rem; }
429
+ .markdown-body hr { height: 1px; margin: 1.5em 0; border: 0; background: var(--border); }
430
+ .markdown-body .md-table { overflow-x: auto; }
431
+ .markdown-body table { border-collapse: collapse; }
432
+ .markdown-body th, .markdown-body td { padding: 6px 13px; border: 1px solid var(--border); }
433
+ .markdown-body th { background: var(--panel-soft); }
434
+ .markdown-body .md-raw { color: var(--muted); font-family: var(--mono); font-size: .86rem; white-space: pre-wrap; }
435
+ .markdown-body pre.md-fence { background: var(--panel-soft); color: var(--text); }
436
+ .md-fence .th-comment, .md-fence .th-meta { color: var(--muted); }
437
+ .md-fence .th-keyword, .md-fence .th-operator, .md-fence .th-command { color: var(--info); }
438
+ .md-fence .th-string, .md-fence .th-inserted { color: var(--done); }
439
+ .md-fence .th-number, .md-fence .th-literal, .md-fence .th-attr { color: var(--warn); }
440
+ .md-fence .th-function, .md-fence .th-type, .md-fence .th-tag, .md-fence .th-property, .md-fence .th-selector, .md-fence .th-heading { color: var(--accent); }
441
+ .md-fence .th-deleted { color: var(--bad); }
422
442
  .vault-incoming { display: grid; gap: 8px; margin-top: 16px; padding: 12px; border: 1px solid var(--warn); border-radius: 8px; background: var(--warn-soft); }
423
443
  .vault-incoming pre { max-height: 220px; overflow: auto; margin: 0; white-space: pre-wrap; font-family: var(--mono); font-size: .78rem; }
424
444
  @media (max-width: 800px) { .vault-layout { grid-template-columns: 1fr; } .vault-tree-panel { position: static; max-height: 50vh; } }
425
445
 
426
446
  @media (max-width: 650px) {
427
- .workflow-console-header { grid-template-columns: 1fr auto; }
428
- .workflow-console-context, .workflow-console-tabs { margin-left: 0; }
429
- .workflow-console-context { grid-template-columns: minmax(0, 1fr); }
430
- .workflow-console-context > span { margin-bottom: 2px; }
431
- .workflow-console-tabs button { min-width: 0; flex: 1; padding-right: 8px; padding-left: 8px; }
432
- .workflow-console-panels { margin-left: 0; padding-left: 10px; }
433
- .workflow-console-command { grid-template-columns: auto minmax(0, 1fr); }
434
- .workflow-console-command .runway-step-copy { grid-column: 2; justify-self: start; }
435
- .workflow-console-divider, .workflow-console .workflow-session-break { padding-left: 0; margin-left: 0; }
436
- }
447
+ }
437
448
 
438
449
  @media (max-width: 760px) {
439
- .lookup-panel .scroll { overflow: visible; }
450
+ .lookup-view .scroll { overflow: visible; }
440
451
  .lookup-table { display: block; }
441
452
  .lookup-table thead { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }
442
453
  .lookup-table tbody { display: grid; gap: 0; }
@@ -490,8 +501,8 @@ html[data-agent-viewed] [data-studio-action] { display: none; }
490
501
  .terminal-drawer-open { display: none; }
491
502
 
492
503
  @media (min-width: 1201px) {
493
- .shell[data-terminal] { grid-template-columns: 260px minmax(0, 1fr) clamp(360px, var(--terminal-width, min(560px, 40vw)), 70vw); }
494
- :root[data-terminal-collapsed] .shell[data-terminal] { grid-template-columns: 260px minmax(0, 1fr) var(--terminal-strip, 44px); }
504
+ .shell[data-terminal] { grid-template-columns: 224px minmax(0, 1fr) clamp(360px, var(--terminal-width, min(560px, 40vw)), 70vw); }
505
+ :root[data-terminal-collapsed] .shell[data-terminal] { grid-template-columns: 224px minmax(0, 1fr) var(--terminal-strip, 44px); }
495
506
  :root[data-terminal-collapsed] .shell[data-terminal] .terminal-body,
496
507
  :root[data-terminal-collapsed] .shell[data-terminal] .terminal-resize { display: none; }
497
508
  :root[data-terminal-collapsed] .shell[data-terminal] .terminal-strip { display: flex; }
@@ -506,7 +517,7 @@ html[data-agent-viewed] [data-studio-action] { display: none; }
506
517
  width: min(92vw, clamp(360px, var(--terminal-width, min(560px, 40vw)), 70vw));
507
518
  height: 100vh;
508
519
  z-index: 30;
509
- box-shadow: var(--shadow);
520
+ box-shadow: var(--drawer-shadow);
510
521
  transform: translateX(100%);
511
522
  visibility: hidden;
512
523
  transition: transform .2s, visibility .2s;
@@ -514,6 +525,6 @@ html[data-agent-viewed] [data-studio-action] { display: none; }
514
525
  .shell[data-terminal] .terminal-sidebar[data-drawer-open] { transform: none; visibility: visible; }
515
526
  .shell[data-terminal] #terminal-collapse { display: none; }
516
527
  .shell[data-terminal] #terminal-drawer-close { display: grid; }
517
- .terminal-drawer-open { display: block; position: fixed; right: 18px; bottom: 18px; z-index: 25; box-shadow: var(--shadow); }
528
+ .terminal-drawer-open { display: block; position: fixed; right: 18px; bottom: 18px; z-index: 25; box-shadow: var(--drawer-shadow); }
518
529
  }
519
530
  `;