@nklisch/pi-agile-workflow 0.15.3

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 (203) hide show
  1. package/.claude-plugin/plugin.json +10 -0
  2. package/.codex-plugin/plugin.json +28 -0
  3. package/CHANGELOG.md +591 -0
  4. package/README.md +107 -0
  5. package/docs/ARCHITECTURE.md +716 -0
  6. package/docs/MIGRATION.md +419 -0
  7. package/docs/PRINCIPLES.md +464 -0
  8. package/docs/ROADMAP.md +95 -0
  9. package/docs/SPEC.md +855 -0
  10. package/docs/VISION.md +106 -0
  11. package/extensions/agile-workflow.test.ts +419 -0
  12. package/extensions/agile-workflow.ts +467 -0
  13. package/hooks/hooks.json +52 -0
  14. package/hooks/scripts/prompt-context.py +628 -0
  15. package/hooks/scripts/substrate-maintainer.py +359 -0
  16. package/hooks/scripts/test_prompt_context.py +757 -0
  17. package/package.json +30 -0
  18. package/scripts/install-work-view.sh +165 -0
  19. package/scripts/tests/agent-metadata.test.sh +75 -0
  20. package/scripts/tests/bump-version.test.sh +552 -0
  21. package/scripts/tests/channel-parity.test.sh +117 -0
  22. package/scripts/tests/convert-content-integrity.test.sh +246 -0
  23. package/scripts/tests/convert-install-routing.test.sh +159 -0
  24. package/scripts/tests/install-work-view.test.sh +411 -0
  25. package/scripts/tests/pi-package-metadata.test.sh +119 -0
  26. package/scripts/tests/work-board-shim.test.sh +239 -0
  27. package/scripts/tests/work-view-dist-version.test.sh +105 -0
  28. package/scripts/work-board.sh +64 -0
  29. package/scripts/work-view.sh +423 -0
  30. package/skills/autopilot/SKILL.md +330 -0
  31. package/skills/autopilot/agents/openai.yaml +6 -0
  32. package/skills/board/SKILL.md +62 -0
  33. package/skills/board/agents/openai.yaml +6 -0
  34. package/skills/bold-refactor/SKILL.md +244 -0
  35. package/skills/bold-refactor/agents/openai.yaml +6 -0
  36. package/skills/bug-scan/SKILL.md +378 -0
  37. package/skills/bug-scan/agents/openai.yaml +6 -0
  38. package/skills/bug-scan/references/async-promises.md +119 -0
  39. package/skills/bug-scan/references/concurrency-races.md +148 -0
  40. package/skills/bug-scan/references/data-layer.md +167 -0
  41. package/skills/bug-scan/references/error-handling.md +197 -0
  42. package/skills/bug-scan/references/gate-item-template.md +94 -0
  43. package/skills/bug-scan/references/language-footguns.md +219 -0
  44. package/skills/bug-scan/references/parked-item-template.md +103 -0
  45. package/skills/bug-scan/references/report-template.md +115 -0
  46. package/skills/bug-scan/references/resource-leaks.md +199 -0
  47. package/skills/bug-scan/references/state-closures.md +148 -0
  48. package/skills/bug-scan/references/time-numbers.md +158 -0
  49. package/skills/convert/SKILL.md +1463 -0
  50. package/skills/convert/agents/openai.yaml +6 -0
  51. package/skills/convert/references/legacy-overlap-migration.md +179 -0
  52. package/skills/deep-code-scan/SKILL.md +378 -0
  53. package/skills/deep-code-scan/agents/openai.yaml +6 -0
  54. package/skills/deep-code-scan/references/artifact-ledger.md +148 -0
  55. package/skills/deep-code-scan/references/consolidation.md +91 -0
  56. package/skills/deep-code-scan/references/decomposition.md +127 -0
  57. package/skills/deep-code-scan/references/item-templates.md +263 -0
  58. package/skills/deep-code-scan/references/lane-catalog.md +129 -0
  59. package/skills/deep-code-scan/references/review-gauntlet.md +108 -0
  60. package/skills/deep-code-scan/references/scanner-brief.md +152 -0
  61. package/skills/e2e-test-design/SKILL.md +517 -0
  62. package/skills/e2e-test-design/references/anti-tautology.md +261 -0
  63. package/skills/e2e-test-design/references/service-mocks.md +234 -0
  64. package/skills/e2e-test-design/references/test-taxonomy.md +211 -0
  65. package/skills/epic-design/SKILL.md +476 -0
  66. package/skills/epicize/SKILL.md +210 -0
  67. package/skills/epicize/agents/openai.yaml +6 -0
  68. package/skills/feature-design/SKILL.md +472 -0
  69. package/skills/fix/SKILL.md +173 -0
  70. package/skills/gate-cruft/SKILL.md +258 -0
  71. package/skills/gate-docs/SKILL.md +278 -0
  72. package/skills/gate-patterns/SKILL.md +389 -0
  73. package/skills/gate-refactor/SKILL.md +408 -0
  74. package/skills/gate-security/SKILL.md +275 -0
  75. package/skills/gate-tests/SKILL.md +367 -0
  76. package/skills/groom/SKILL.md +162 -0
  77. package/skills/groom/agents/openai.yaml +6 -0
  78. package/skills/ideate/SKILL.md +185 -0
  79. package/skills/ideate/agents/openai.yaml +6 -0
  80. package/skills/implement/SKILL.md +288 -0
  81. package/skills/implement-orchestrator/SKILL.md +604 -0
  82. package/skills/park/SKILL.md +111 -0
  83. package/skills/perf-design/SKILL.md +427 -0
  84. package/skills/perf-scout/SKILL.md +404 -0
  85. package/skills/perf-scout/agents/openai.yaml +6 -0
  86. package/skills/perf-scout/references/algorithmic-and-data-structures.md +126 -0
  87. package/skills/perf-scout/references/approximation-and-precomputation.md +136 -0
  88. package/skills/perf-scout/references/caching-and-memoization.md +123 -0
  89. package/skills/perf-scout/references/compiler-runtime-and-language.md +136 -0
  90. package/skills/perf-scout/references/database-and-storage-internals.md +144 -0
  91. package/skills/perf-scout/references/distributed-systems.md +150 -0
  92. package/skills/perf-scout/references/game-engine-and-realtime.md +136 -0
  93. package/skills/perf-scout/references/gpu-and-accelerators.md +130 -0
  94. package/skills/perf-scout/references/idea-ranking.md +75 -0
  95. package/skills/perf-scout/references/io-and-batching.md +135 -0
  96. package/skills/perf-scout/references/memory-and-data-locality.md +137 -0
  97. package/skills/perf-scout/references/parallelism-and-vectorization.md +126 -0
  98. package/skills/perf-scout/references/parked-item-template.md +117 -0
  99. package/skills/perf-scout/references/peer-review-pass.md +150 -0
  100. package/skills/perf-scout/references/report-template.md +148 -0
  101. package/skills/principles/SKILL.md +678 -0
  102. package/skills/principles/references/models.md +191 -0
  103. package/skills/principles/references/subagents.md +158 -0
  104. package/skills/prose-author/SKILL.md +185 -0
  105. package/skills/refactor-conventions-creator/SKILL.md +359 -0
  106. package/skills/refactor-conventions-creator/agents/openai.yaml +6 -0
  107. package/skills/refactor-conventions-creator/references/common-structures.md +91 -0
  108. package/skills/refactor-conventions-creator/references/common-styles.md +90 -0
  109. package/skills/refactor-design/SKILL.md +384 -0
  110. package/skills/release-deploy/SKILL.md +667 -0
  111. package/skills/release-deploy/agents/openai.yaml +6 -0
  112. package/skills/research/SKILL.md +166 -0
  113. package/skills/research/agents/openai.yaml +6 -0
  114. package/skills/review/SKILL.md +267 -0
  115. package/skills/review/references/deep-review.md +98 -0
  116. package/skills/review/references/review-lenses.md +68 -0
  117. package/skills/review/references/substrate-side-effects.md +161 -0
  118. package/skills/review/references/target-resolution.md +52 -0
  119. package/skills/scope/SKILL.md +486 -0
  120. package/work-view/Cargo.lock +486 -0
  121. package/work-view/Cargo.toml +9 -0
  122. package/work-view/crates/cli/.work-view-version +1 -0
  123. package/work-view/crates/cli/Cargo.toml +18 -0
  124. package/work-view/crates/cli/src/actionable.rs +500 -0
  125. package/work-view/crates/cli/src/args.rs +792 -0
  126. package/work-view/crates/cli/src/board/assets/board.css +855 -0
  127. package/work-view/crates/cli/src/board/assets/board.js +259 -0
  128. package/work-view/crates/cli/src/board/assets/card.js +139 -0
  129. package/work-view/crates/cli/src/board/assets/components.css +290 -0
  130. package/work-view/crates/cli/src/board/assets/dependency.js +1193 -0
  131. package/work-view/crates/cli/src/board/assets/detail.js +256 -0
  132. package/work-view/crates/cli/src/board/assets/filters.js +389 -0
  133. package/work-view/crates/cli/src/board/assets/index.html +77 -0
  134. package/work-view/crates/cli/src/board/assets/kanban.js +231 -0
  135. package/work-view/crates/cli/src/board/assets/markdown.js +260 -0
  136. package/work-view/crates/cli/src/board/assets/motion.css +131 -0
  137. package/work-view/crates/cli/src/board/assets/state.js +245 -0
  138. package/work-view/crates/cli/src/board/assets/table.js +304 -0
  139. package/work-view/crates/cli/src/board/assets/tokens.css +602 -0
  140. package/work-view/crates/cli/src/board/assets/views.js +41 -0
  141. package/work-view/crates/cli/src/board/assets.rs +162 -0
  142. package/work-view/crates/cli/src/board/feed.rs +204 -0
  143. package/work-view/crates/cli/src/board/mod.rs +246 -0
  144. package/work-view/crates/cli/src/board/open.rs +144 -0
  145. package/work-view/crates/cli/src/board/server.rs +407 -0
  146. package/work-view/crates/cli/src/main.rs +195 -0
  147. package/work-view/crates/cli/src/render.rs +354 -0
  148. package/work-view/crates/cli/src/scope.rs +157 -0
  149. package/work-view/crates/cli/src/stale.rs +581 -0
  150. package/work-view/crates/cli/tests/board-js/dependency-table.test.mjs +64 -0
  151. package/work-view/crates/cli/tests/board-js/expanded-browsing.test.mjs +79 -0
  152. package/work-view/crates/cli/tests/board-js/harness-smoke.test.mjs +11 -0
  153. package/work-view/crates/cli/tests/board-js/harness.mjs +437 -0
  154. package/work-view/crates/cli/tests/board-js/kanban-detail.test.mjs +75 -0
  155. package/work-view/crates/cli/tests/board-js/markdown-filter.test.mjs +60 -0
  156. package/work-view/crates/cli/tests/fixtures/golden/.work/CONVENTIONS.md +3 -0
  157. package/work-view/crates/cli/tests/fixtures/golden/.work/active/epics/epic-alpha.md +16 -0
  158. package/work-view/crates/cli/tests/fixtures/golden/.work/active/features/feat-a.md +16 -0
  159. package/work-view/crates/cli/tests/fixtures/golden/.work/active/features/feat-b.md +16 -0
  160. package/work-view/crates/cli/tests/fixtures/golden/.work/active/stories/story-alpha-1.md +16 -0
  161. package/work-view/crates/cli/tests/fixtures/golden/.work/active/stories/story-research-1.md +19 -0
  162. package/work-view/crates/cli/tests/fixtures/golden/.work/archive/feat-done.md +16 -0
  163. package/work-view/crates/cli/tests/fixtures/golden/.work/archive/feat-shipped.md +18 -0
  164. package/work-view/crates/cli/tests/fixtures/golden/.work/backlog/idea-backlog.md +7 -0
  165. package/work-view/crates/cli/tests/fixtures/golden/.work/releases/v1.0/v1.0.md +16 -0
  166. package/work-view/crates/cli/tests/fixtures/ready-drafting/.work/CONVENTIONS.md +6 -0
  167. package/work-view/crates/cli/tests/fixtures/ready-drafting/.work/active/features/feat-dep-done.md +17 -0
  168. package/work-view/crates/cli/tests/fixtures/ready-drafting/.work/active/features/feat-design-ready.md +17 -0
  169. package/work-view/crates/cli/tests/fixtures/ready-drafting/.work/active/features/feat-impl-ready.md +17 -0
  170. package/work-view/crates/cli/tests/fixtures/ready-drafting/.work/active/stories/story-review-ready.md +17 -0
  171. package/work-view/crates/cli/tests/fixtures/with-malformed/.work/CONVENTIONS.md +4 -0
  172. package/work-view/crates/cli/tests/fixtures/with-malformed/.work/active/epics/malformed-no-closing-fence.md +8 -0
  173. package/work-view/crates/cli/tests/fixtures/with-malformed/.work/active/features/good-item.md +16 -0
  174. package/work-view/crates/cli/tests/integration.rs +2833 -0
  175. package/work-view/crates/core/Cargo.toml +13 -0
  176. package/work-view/crates/core/src/error.rs +61 -0
  177. package/work-view/crates/core/src/filter.rs +804 -0
  178. package/work-view/crates/core/src/graph.rs +324 -0
  179. package/work-view/crates/core/src/index.rs +590 -0
  180. package/work-view/crates/core/src/lib.rs +54 -0
  181. package/work-view/crates/core/src/model.rs +202 -0
  182. package/work-view/crates/core/src/parse.rs +494 -0
  183. package/work-view/crates/core/tests/fixtures/golden/.work/CONVENTIONS.md +15 -0
  184. package/work-view/crates/core/tests/fixtures/golden/.work/active/epics/epic-core.md +16 -0
  185. package/work-view/crates/core/tests/fixtures/golden/.work/active/features/feat-parser.md +16 -0
  186. package/work-view/crates/core/tests/fixtures/golden/.work/active/features/feat-query.md +16 -0
  187. package/work-view/crates/core/tests/fixtures/golden/.work/active/stories/malformed-no-id.md +15 -0
  188. package/work-view/crates/core/tests/fixtures/golden/.work/active/stories/story-parse-unit.md +16 -0
  189. package/work-view/crates/core/tests/fixtures/golden/.work/active/stories/story-security-gate.md +16 -0
  190. package/work-view/crates/core/tests/fixtures/golden/.work/archive/feat-old.md +16 -0
  191. package/work-view/crates/core/tests/fixtures/golden/.work/archive/feat-parser.md +17 -0
  192. package/work-view/crates/core/tests/fixtures/golden/.work/backlog/idea-future-board.md +7 -0
  193. package/work-view/crates/core/tests/fixtures/golden/.work/releases/v1.0/v1.0.md +16 -0
  194. package/work-view/crates/core/tests/fixtures/precedence/.work/CONVENTIONS.md +10 -0
  195. package/work-view/crates/core/tests/fixtures/precedence/.work/archive/dup-item.md +18 -0
  196. package/work-view/crates/core/tests/fixtures/precedence/.work/releases/v2.0/dup-item.md +18 -0
  197. package/work-view/crates/core/tests/integration.rs +541 -0
  198. package/work-view/dist/.gitattributes +1 -0
  199. package/work-view/dist/README.md +42 -0
  200. package/work-view/dist/aarch64-apple-darwin/work-view +0 -0
  201. package/work-view/dist/aarch64-unknown-linux-musl/work-view +0 -0
  202. package/work-view/dist/x86_64-apple-darwin/work-view +0 -0
  203. package/work-view/dist/x86_64-unknown-linux-musl/work-view +0 -0
@@ -0,0 +1,855 @@
1
+ * {
2
+ box-sizing: border-box;
3
+ }
4
+
5
+ :root {
6
+ color-scheme: light dark;
7
+ }
8
+
9
+ body {
10
+ margin: 0;
11
+ min-width: 320px;
12
+ min-height: 100vh;
13
+ background: var(--color-bg-primary);
14
+ color: var(--color-text-primary);
15
+ font: var(--font-size-base)/var(--line-height-base) var(--font-sans);
16
+ }
17
+
18
+ button,
19
+ input,
20
+ select {
21
+ font: inherit;
22
+ }
23
+
24
+ .app-shell {
25
+ min-height: 100vh;
26
+ display: grid;
27
+ grid-template-rows: auto 1fr;
28
+ }
29
+
30
+ .appbar {
31
+ position: sticky;
32
+ top: 0;
33
+ z-index: 20;
34
+ display: grid;
35
+ grid-template-columns: minmax(180px, 1fr) auto minmax(260px, 1fr);
36
+ gap: var(--space-4);
37
+ align-items: center;
38
+ min-height: 58px;
39
+ padding: 10px 18px;
40
+ border-bottom: 1px solid var(--color-border);
41
+ background: var(--color-bg-secondary);
42
+ }
43
+
44
+ .brand {
45
+ display: inline-flex;
46
+ align-items: baseline;
47
+ min-width: 0;
48
+ color: var(--color-text-primary);
49
+ font-weight: var(--font-weight-bold);
50
+ letter-spacing: 0;
51
+ white-space: nowrap;
52
+ }
53
+
54
+ .brand .mark {
55
+ color: var(--color-accent);
56
+ }
57
+
58
+ .view-tabs {
59
+ justify-self: center;
60
+ min-height: 36px;
61
+ }
62
+
63
+ .appbar-actions {
64
+ display: flex;
65
+ justify-content: flex-end;
66
+ align-items: center;
67
+ gap: var(--space-3);
68
+ min-width: 0;
69
+ }
70
+
71
+ .status-line {
72
+ display: inline-flex;
73
+ align-items: center;
74
+ gap: var(--space-2);
75
+ min-width: 0;
76
+ color: var(--color-text-secondary);
77
+ font: var(--font-weight-medium) var(--font-size-xs)/1.3 var(--font-mono);
78
+ }
79
+
80
+ .status-line .status-text {
81
+ overflow: hidden;
82
+ max-width: 34ch;
83
+ text-overflow: ellipsis;
84
+ white-space: nowrap;
85
+ }
86
+
87
+ .status-line .spinner[hidden] {
88
+ display: none;
89
+ }
90
+
91
+ .shell-grid {
92
+ display: grid;
93
+ grid-template-columns: 276px minmax(0, 1fr);
94
+ min-height: calc(100vh - 58px);
95
+ }
96
+
97
+ .filter-panel {
98
+ display: grid;
99
+ align-content: start;
100
+ gap: var(--space-4);
101
+ padding: var(--space-4);
102
+ border-right: 1px solid var(--color-border);
103
+ background: var(--color-bg-secondary);
104
+ }
105
+
106
+ #global-filter-container {
107
+ display: grid;
108
+ gap: var(--space-4);
109
+ }
110
+
111
+ .filter-group {
112
+ display: grid;
113
+ gap: var(--space-2);
114
+ }
115
+
116
+ .filter-group__header {
117
+ display: flex;
118
+ align-items: center;
119
+ justify-content: space-between;
120
+ gap: var(--space-2);
121
+ min-width: 0;
122
+ }
123
+
124
+ .filter-group h2 {
125
+ margin: 0;
126
+ color: var(--color-text-tertiary);
127
+ font: var(--font-weight-semibold) 11px/1 var(--font-mono);
128
+ letter-spacing: .08em;
129
+ text-transform: uppercase;
130
+ }
131
+
132
+ .filter-expand-toggle {
133
+ min-width: 42px;
134
+ min-height: 22px;
135
+ padding: 0 6px;
136
+ border: 1px solid var(--color-border);
137
+ border-radius: var(--radius-sm);
138
+ background: var(--color-bg-primary);
139
+ color: var(--color-text-secondary);
140
+ font: var(--font-weight-semibold) 10px/1 var(--font-mono);
141
+ cursor: pointer;
142
+ }
143
+
144
+ .filter-expand-toggle[hidden] {
145
+ display: none;
146
+ }
147
+
148
+ .filter-expand-toggle[aria-expanded="true"] {
149
+ border-color: var(--color-accent);
150
+ color: var(--color-accent);
151
+ }
152
+
153
+ .filter-options {
154
+ display: flex;
155
+ flex-wrap: wrap;
156
+ gap: 6px;
157
+ }
158
+
159
+ .filter-options--compact {
160
+ max-height: 116px;
161
+ overflow-y: auto;
162
+ }
163
+
164
+ .filter-options[data-expanded="true"] {
165
+ display: grid;
166
+ grid-template-columns: repeat(auto-fit, minmax(92px, 1fr));
167
+ max-height: min(46vh, 360px);
168
+ overflow-y: auto;
169
+ }
170
+
171
+ .filter-options--scroll {
172
+ max-height: 116px;
173
+ overflow-y: auto;
174
+ }
175
+
176
+ .filter-options--scroll[data-expanded="true"] {
177
+ max-height: min(46vh, 360px);
178
+ }
179
+
180
+ .filter-empty {
181
+ color: var(--color-text-tertiary);
182
+ font: var(--font-weight-medium) var(--font-size-xs)/1.4 var(--font-mono);
183
+ }
184
+
185
+ .content-wrap {
186
+ min-width: 0;
187
+ padding: 14px 18px 40px;
188
+ overflow-x: auto;
189
+ }
190
+
191
+ .toolbar-row {
192
+ display: flex;
193
+ align-items: center;
194
+ gap: var(--space-3);
195
+ min-height: 36px;
196
+ margin-bottom: var(--space-3);
197
+ }
198
+
199
+ .toolbar-row .crumb {
200
+ color: var(--color-text-tertiary);
201
+ font: var(--font-weight-medium) var(--font-size-xs)/1 var(--font-mono);
202
+ }
203
+
204
+ .toolbar-row .diagnostics {
205
+ margin-left: auto;
206
+ display: inline-flex;
207
+ align-items: center;
208
+ gap: var(--space-2);
209
+ color: var(--color-text-secondary);
210
+ font: var(--font-weight-semibold) var(--font-size-xs)/1 var(--font-mono);
211
+ }
212
+
213
+ #diagnostics-region {
214
+ display: grid;
215
+ gap: var(--space-2);
216
+ margin-bottom: var(--space-3);
217
+ }
218
+
219
+ #diagnostics-region:empty {
220
+ display: none;
221
+ }
222
+
223
+ #view-root {
224
+ min-height: min(680px, calc(100vh - 146px));
225
+ border: 1px solid var(--color-border);
226
+ border-radius: var(--radius-md);
227
+ background: var(--color-bg-secondary);
228
+ }
229
+
230
+ .view-placeholder {
231
+ display: grid;
232
+ align-content: center;
233
+ justify-items: center;
234
+ gap: var(--space-3);
235
+ min-height: inherit;
236
+ padding: var(--space-8);
237
+ text-align: center;
238
+ color: var(--color-text-secondary);
239
+ }
240
+
241
+ .view-placeholder h1 {
242
+ margin: 0;
243
+ color: var(--color-text-primary);
244
+ font: var(--font-weight-semibold) var(--font-size-xl)/var(--line-height-tight) var(--font-sans);
245
+ letter-spacing: 0;
246
+ }
247
+
248
+ .view-placeholder p {
249
+ margin: 0;
250
+ max-width: 54ch;
251
+ }
252
+
253
+ .view-digest {
254
+ color: var(--color-text-tertiary);
255
+ font: var(--font-weight-medium) var(--font-size-xs)/1.5 var(--font-mono);
256
+ }
257
+
258
+ .kanban-view {
259
+ display: grid;
260
+ gap: var(--space-4);
261
+ min-height: inherit;
262
+ padding: var(--space-4);
263
+ overflow: hidden;
264
+ }
265
+
266
+ .kanban-view__header {
267
+ display: flex;
268
+ align-items: baseline;
269
+ justify-content: space-between;
270
+ gap: var(--space-3);
271
+ min-width: 0;
272
+ }
273
+
274
+ .kanban-view__header h1 {
275
+ margin: 0;
276
+ color: var(--color-text-primary);
277
+ font: var(--font-weight-semibold) var(--font-size-lg)/var(--line-height-tight) var(--font-sans);
278
+ letter-spacing: 0;
279
+ }
280
+
281
+ .kanban-lane-strip {
282
+ display: flex;
283
+ gap: var(--space-2);
284
+ min-width: 0;
285
+ overflow-x: auto;
286
+ padding-bottom: 2px;
287
+ }
288
+
289
+ .kanban-lane-chip {
290
+ white-space: nowrap;
291
+ }
292
+
293
+ .kanban-lane-chip[aria-pressed="true"] {
294
+ border-color: var(--color-accent);
295
+ color: var(--color-accent);
296
+ }
297
+
298
+ .kanban-lanes {
299
+ display: grid;
300
+ gap: var(--space-4);
301
+ min-width: 0;
302
+ }
303
+
304
+ .kanban-lane {
305
+ display: grid;
306
+ gap: var(--space-3);
307
+ min-width: 0;
308
+ padding-bottom: var(--space-2);
309
+ }
310
+
311
+ .kanban-lane__header {
312
+ display: grid;
313
+ grid-template-columns: minmax(0, 1fr) auto minmax(120px, 180px);
314
+ gap: var(--space-3);
315
+ align-items: center;
316
+ min-height: 34px;
317
+ }
318
+
319
+ .kanban-lane__header h2 {
320
+ margin: 0;
321
+ overflow: hidden;
322
+ color: var(--color-text-primary);
323
+ text-overflow: ellipsis;
324
+ white-space: nowrap;
325
+ font: var(--font-weight-semibold) var(--font-size-base)/1.2 var(--font-sans);
326
+ letter-spacing: 0;
327
+ }
328
+
329
+ .kanban-progress {
330
+ color: var(--color-text-secondary);
331
+ font: var(--font-weight-semibold) var(--font-size-xs)/1 var(--font-mono);
332
+ }
333
+
334
+ .kanban-progressbar {
335
+ position: relative;
336
+ height: 8px;
337
+ overflow: hidden;
338
+ border-radius: var(--radius-full);
339
+ background: var(--color-bg-tertiary);
340
+ }
341
+
342
+ .kanban-progressbar::after {
343
+ position: absolute;
344
+ inset: 0 auto 0 0;
345
+ width: var(--lane-progress);
346
+ border-radius: inherit;
347
+ background: var(--color-accent);
348
+ content: "";
349
+ }
350
+
351
+ .kanban-board {
352
+ display: grid;
353
+ grid-auto-flow: column;
354
+ grid-auto-columns: minmax(240px, 300px);
355
+ gap: var(--space-3);
356
+ min-width: 0;
357
+ overflow-x: auto;
358
+ padding-bottom: var(--space-2);
359
+ scroll-snap-type: x proximity;
360
+ }
361
+
362
+ .kanban-column {
363
+ display: grid;
364
+ grid-template-rows: auto 1fr;
365
+ min-width: 0;
366
+ min-height: 320px;
367
+ max-height: min(680px, calc(100vh - 260px));
368
+ overflow: hidden;
369
+ border: 1px solid var(--color-border);
370
+ border-radius: var(--radius-sm);
371
+ background: var(--color-bg-primary);
372
+ scroll-snap-align: start;
373
+ }
374
+
375
+ .kanban-column__header {
376
+ display: flex;
377
+ align-items: center;
378
+ justify-content: space-between;
379
+ gap: var(--space-2);
380
+ min-height: 40px;
381
+ padding: 0 var(--space-3);
382
+ border-bottom: 1px solid var(--color-border);
383
+ }
384
+
385
+ .kanban-column__header h2 {
386
+ margin: 0;
387
+ color: var(--color-text-primary);
388
+ font: var(--font-weight-semibold) var(--font-size-sm)/1.2 var(--font-sans);
389
+ letter-spacing: 0;
390
+ }
391
+
392
+ .kanban-count {
393
+ display: inline-grid;
394
+ place-items: center;
395
+ min-width: 24px;
396
+ min-height: 24px;
397
+ border-radius: 999px;
398
+ background: var(--color-bg-tertiary);
399
+ color: var(--color-text-secondary);
400
+ font: var(--font-weight-semibold) var(--font-size-xs)/1 var(--font-mono);
401
+ }
402
+
403
+ .kanban-column__cards {
404
+ display: grid;
405
+ align-content: start;
406
+ gap: var(--space-2);
407
+ min-height: 0;
408
+ overflow-y: auto;
409
+ padding: var(--space-2);
410
+ }
411
+
412
+ .kanban-column__cards > .item-card {
413
+ min-width: 0;
414
+ }
415
+
416
+ .kanban-empty {
417
+ margin: 0;
418
+ min-height: 74px;
419
+ padding: var(--space-3);
420
+ border: 1px dashed var(--color-border);
421
+ border-radius: var(--radius-sm);
422
+ color: var(--color-text-tertiary);
423
+ text-align: center;
424
+ font: var(--font-weight-medium) var(--font-size-xs)/1.4 var(--font-mono);
425
+ }
426
+
427
+ .dependency-view {
428
+ display: grid;
429
+ grid-template-rows: auto auto minmax(0, 1fr);
430
+ gap: var(--space-4);
431
+ min-width: 0;
432
+ min-height: inherit;
433
+ height: calc(100vh - 146px);
434
+ overflow: hidden;
435
+ padding: var(--space-4);
436
+ }
437
+
438
+ .dependency-view__header {
439
+ display: flex;
440
+ align-items: baseline;
441
+ justify-content: space-between;
442
+ gap: var(--space-3);
443
+ }
444
+
445
+ .dependency-view__header h1 {
446
+ margin: 0;
447
+ color: var(--color-text-primary);
448
+ font: var(--font-weight-semibold) var(--font-size-lg)/var(--line-height-tight) var(--font-sans);
449
+ letter-spacing: 0;
450
+ }
451
+
452
+ .dependency-layers {
453
+ display: grid;
454
+ gap: var(--space-4);
455
+ }
456
+
457
+ .dependency-toolbar {
458
+ display: flex;
459
+ flex-wrap: wrap;
460
+ gap: var(--space-2);
461
+ }
462
+
463
+ .dependency-layout-buttons {
464
+ display: inline-flex;
465
+ flex-wrap: wrap;
466
+ gap: var(--space-2);
467
+ }
468
+
469
+ .dependency-interaction-controls,
470
+ .dependency-tool-buttons,
471
+ .dependency-zoom-buttons {
472
+ display: inline-flex;
473
+ flex-wrap: wrap;
474
+ gap: var(--space-2);
475
+ }
476
+
477
+ .dependency-toolbar__button:disabled {
478
+ cursor: not-allowed;
479
+ opacity: .45;
480
+ }
481
+
482
+ .dependency-toolbar__zoom-label {
483
+ min-width: 54px;
484
+ text-align: center;
485
+ }
486
+
487
+ .dependency-tool-buttons .dependency-toolbar__button {
488
+ display: inline-flex;
489
+ align-items: center;
490
+ gap: 5px;
491
+ }
492
+
493
+ .dependency-toolbar__icon {
494
+ width: 14px;
495
+ height: 14px;
496
+ flex: 0 0 auto;
497
+ }
498
+
499
+ .dependency-tool-label {
500
+ line-height: 1;
501
+ }
502
+
503
+ .dependency-edge-legend {
504
+ display: inline-flex;
505
+ align-items: center;
506
+ flex-wrap: wrap;
507
+ gap: var(--space-2);
508
+ color: var(--color-text-tertiary);
509
+ font: var(--font-weight-semibold) 11px/1 var(--font-mono);
510
+ }
511
+
512
+ .dependency-edge-legend__item {
513
+ display: inline-flex;
514
+ align-items: center;
515
+ gap: 5px;
516
+ min-height: 24px;
517
+ }
518
+
519
+ .dependency-edge-legend__line {
520
+ width: 22px;
521
+ border-top: 2px solid currentColor;
522
+ }
523
+
524
+ .dependency-edge-legend__line--met {
525
+ border-top-color: var(--status-ready);
526
+ }
527
+
528
+ .dependency-edge-legend__line--unmet {
529
+ border-top-style: dashed;
530
+ border-top-color: var(--status-blocked);
531
+ }
532
+
533
+ .dependency-layer {
534
+ display: grid;
535
+ gap: var(--space-2);
536
+ min-width: 0;
537
+ }
538
+
539
+ .dependency-layer h2 {
540
+ margin: 0;
541
+ color: var(--color-text-tertiary);
542
+ font: var(--font-weight-semibold) 11px/1 var(--font-mono);
543
+ letter-spacing: .08em;
544
+ text-transform: uppercase;
545
+ }
546
+
547
+ .dependency-layer__nodes {
548
+ display: grid;
549
+ grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
550
+ gap: var(--space-3);
551
+ }
552
+
553
+ .dependency-layer__nodes .dep-node {
554
+ width: 100%;
555
+ min-width: 0;
556
+ color: inherit;
557
+ text-align: left;
558
+ }
559
+
560
+ button.dep-node {
561
+ cursor: pointer;
562
+ }
563
+
564
+ button.dep-node:focus-visible {
565
+ outline: 2px solid var(--color-accent);
566
+ outline-offset: 2px;
567
+ }
568
+
569
+ .dep-node--external {
570
+ border-style: dashed;
571
+ color: var(--color-text-secondary);
572
+ }
573
+
574
+ .dependency-canvas-viewport {
575
+ min-width: 0;
576
+ max-width: 100%;
577
+ height: auto;
578
+ min-height: 0;
579
+ overflow: auto;
580
+ border: 1px solid var(--color-border);
581
+ border-radius: var(--radius-md);
582
+ background: var(--color-bg-primary);
583
+ }
584
+
585
+ .dependency-canvas-viewport[data-tool="pan"] {
586
+ cursor: grab;
587
+ touch-action: none;
588
+ user-select: none;
589
+ }
590
+
591
+ .dependency-canvas-viewport.is-panning {
592
+ cursor: grabbing;
593
+ }
594
+
595
+ .dependency-canvas-surface {
596
+ position: relative;
597
+ min-width: 100%;
598
+ min-height: 100%;
599
+ overflow: hidden;
600
+ }
601
+
602
+ .dependency-canvas {
603
+ position: relative;
604
+ transform-origin: top left;
605
+ }
606
+
607
+ .dependency-edges {
608
+ position: absolute;
609
+ inset: 0;
610
+ width: 100%;
611
+ height: 100%;
612
+ overflow: visible;
613
+ pointer-events: none;
614
+ }
615
+
616
+ .dependency-edge {
617
+ fill: none;
618
+ stroke: var(--status-ready);
619
+ stroke-linecap: round;
620
+ stroke-width: 2;
621
+ }
622
+
623
+ .dependency-edge--unmet {
624
+ stroke: var(--status-blocked);
625
+ stroke-dasharray: 7 6;
626
+ }
627
+
628
+ .dependency-edge.is-traced {
629
+ stroke-width: 3;
630
+ }
631
+
632
+ .dependency-edge.is-dimmed {
633
+ opacity: .2;
634
+ }
635
+
636
+ .dependency-layout-label {
637
+ position: absolute;
638
+ z-index: 1;
639
+ width: 280px;
640
+ overflow: hidden;
641
+ color: var(--color-text-tertiary);
642
+ text-overflow: ellipsis;
643
+ white-space: nowrap;
644
+ font: var(--font-weight-semibold) 11px/1 var(--font-mono);
645
+ letter-spacing: .08em;
646
+ text-transform: uppercase;
647
+ pointer-events: none;
648
+ }
649
+
650
+ .dependency-graph-node {
651
+ position: absolute;
652
+ touch-action: none;
653
+ width: 280px;
654
+ }
655
+
656
+ .dependency-graph-node > .dep-node {
657
+ cursor: grab;
658
+ user-select: none;
659
+ }
660
+
661
+ .dep-node--web {
662
+ --node-kind-color: var(--kind-backlog);
663
+ width: 100%;
664
+ min-height: 76px;
665
+ align-content: center;
666
+ justify-items: center;
667
+ gap: 4px;
668
+ padding: 8px 13px;
669
+ border-color: color-mix(in srgb, var(--node-kind-color) 70%, var(--color-border));
670
+ border-radius: 999px;
671
+ background: color-mix(in srgb, var(--node-kind-color) 8%, var(--color-bg-secondary));
672
+ box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--node-kind-color) 20%, transparent);
673
+ }
674
+
675
+ .dep-node--web.dep-node--epic { --node-kind-color: var(--kind-epic); }
676
+ .dep-node--web.dep-node--feature { --node-kind-color: var(--kind-feature); }
677
+ .dep-node--web.dep-node--story { --node-kind-color: var(--kind-story); }
678
+ .dep-node--web.dep-node--release { --node-kind-color: var(--kind-release); }
679
+ .dep-node--web.dep-node--backlog { --node-kind-color: var(--kind-backlog); }
680
+
681
+ .dep-node--web .dn-head {
682
+ justify-content: center;
683
+ gap: 5px;
684
+ }
685
+
686
+ .dep-node--web .chip,
687
+ .dep-node--web .badge {
688
+ font-size: 9px;
689
+ }
690
+
691
+ .dep-node--web .ic-id {
692
+ display: block;
693
+ max-width: 100%;
694
+ overflow: hidden;
695
+ color: var(--color-text-primary);
696
+ text-align: center;
697
+ text-overflow: ellipsis;
698
+ white-space: nowrap;
699
+ font: var(--font-weight-semibold) 11.5px/1.25 var(--font-mono);
700
+ }
701
+
702
+ .dn-web-meta {
703
+ max-width: 100%;
704
+ overflow: hidden;
705
+ color: var(--color-text-tertiary);
706
+ text-align: center;
707
+ text-overflow: ellipsis;
708
+ white-space: nowrap;
709
+ font: var(--font-weight-medium) 10.5px/1.2 var(--font-mono);
710
+ }
711
+
712
+ .dependency-graph-node.is-dragging,
713
+ .dependency-graph-node.is-dragging > .dep-node {
714
+ z-index: 3;
715
+ cursor: grabbing;
716
+ }
717
+
718
+ .dependency-graph-node.is-dimmed {
719
+ opacity: .34;
720
+ }
721
+
722
+ .table-view {
723
+ display: grid;
724
+ gap: var(--space-4);
725
+ min-height: inherit;
726
+ padding: var(--space-4);
727
+ }
728
+
729
+ .table-view__header {
730
+ display: flex;
731
+ align-items: baseline;
732
+ justify-content: space-between;
733
+ gap: var(--space-3);
734
+ }
735
+
736
+ .table-view__header h1 {
737
+ margin: 0;
738
+ color: var(--color-text-primary);
739
+ font: var(--font-weight-semibold) var(--font-size-lg)/var(--line-height-tight) var(--font-sans);
740
+ letter-spacing: 0;
741
+ }
742
+
743
+ .table-wrap {
744
+ overflow-x: auto;
745
+ max-width: 100%;
746
+ border: 1px solid var(--color-border);
747
+ border-radius: var(--radius-md);
748
+ background: var(--color-bg-primary);
749
+ }
750
+
751
+ .board-table {
752
+ min-width: 820px;
753
+ }
754
+
755
+ .board-table thead {
756
+ position: sticky;
757
+ top: 0;
758
+ z-index: 2;
759
+ background: var(--color-bg-primary);
760
+ }
761
+
762
+ .table-filter-row input {
763
+ width: 100%;
764
+ min-width: 72px;
765
+ padding: 5px 7px;
766
+ border: 1px solid var(--color-border);
767
+ border-radius: var(--radius-sm);
768
+ background: var(--color-bg-secondary);
769
+ color: var(--color-text-primary);
770
+ font: var(--font-weight-regular) var(--font-size-xs)/1.2 var(--font-mono);
771
+ }
772
+
773
+ .board-table tbody tr {
774
+ cursor: pointer;
775
+ }
776
+
777
+ .board-table tbody tr:focus-visible {
778
+ outline: 2px solid var(--color-accent);
779
+ outline-offset: -2px;
780
+ }
781
+
782
+ .table-sort-button {
783
+ padding: 0;
784
+ border: 0;
785
+ background: transparent;
786
+ color: inherit;
787
+ font: inherit;
788
+ text-transform: inherit;
789
+ letter-spacing: inherit;
790
+ cursor: pointer;
791
+ }
792
+
793
+ .table-sort-button:focus-visible {
794
+ outline: 2px solid var(--color-accent);
795
+ outline-offset: 2px;
796
+ }
797
+
798
+ @media (max-width: 980px) {
799
+ .appbar {
800
+ grid-template-columns: 1fr;
801
+ align-items: stretch;
802
+ }
803
+
804
+ .view-tabs,
805
+ .appbar-actions {
806
+ justify-self: start;
807
+ }
808
+
809
+ .shell-grid {
810
+ grid-template-columns: 1fr;
811
+ }
812
+
813
+ .filter-panel {
814
+ border-right: 0;
815
+ border-bottom: 1px solid var(--color-border);
816
+ }
817
+ }
818
+
819
+ @media (max-width: 620px) {
820
+ .appbar,
821
+ .filter-panel,
822
+ .content-wrap {
823
+ padding-right: 12px;
824
+ padding-left: 12px;
825
+ }
826
+
827
+ .kanban-board {
828
+ grid-auto-flow: row;
829
+ grid-auto-columns: unset;
830
+ grid-template-columns: 1fr;
831
+ overflow-x: visible;
832
+ scroll-snap-type: none;
833
+ }
834
+
835
+ .kanban-column {
836
+ min-height: 220px;
837
+ max-height: none;
838
+ }
839
+
840
+ .kanban-lane__header {
841
+ grid-template-columns: 1fr;
842
+ gap: var(--space-2);
843
+ }
844
+
845
+ .appbar-actions,
846
+ .theme-picker,
847
+ .toolbar-row {
848
+ align-items: flex-start;
849
+ flex-direction: column;
850
+ }
851
+
852
+ .toolbar-row .diagnostics {
853
+ margin-left: 0;
854
+ }
855
+ }