@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,602 @@
1
+ /*
2
+ * Design tokens for Substrate Board (epic-substrate-board)
3
+ * Generated by /ux-ui-design:palette on 2026-05-31
4
+ * Style: Data-dense terminal. Multi-theme: 6 swappable accent themes
5
+ * (teal default, amber, violet, azure, lime, candy) x {light, dark}.
6
+ * Typography: system sans + system monospace. The mockup's Google Fonts import
7
+ * is intentionally omitted from shipped assets so the board has no remote
8
+ * dependency.
9
+ * Mode: follows system preference by default; explicit override via
10
+ * [data-theme="light"|"dark"] on <html> (wins over the media query).
11
+ * Accent: [data-accent="teal"|"amber"|"violet"|"azure"|"lime"|"candy"] on
12
+ * <html>; absence = teal. The board's theme selector sets both attributes
13
+ * and persists them (localStorage / board config).
14
+ * All accent x mode pairings are WCAG AA verified (text, muted, on-accent,
15
+ * link). The accent token is a FILL color (text-inverse on it); links use
16
+ * --color-text-link.
17
+ *
18
+ * Edit by re-running /ux-ui-design:palette (it preserves this header).
19
+ */
20
+
21
+ :root {
22
+ /* ---- Typography ---- */
23
+ --font-sans: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
24
+ --font-mono: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
25
+ --font-size-xs: 12px; --font-size-sm: 14px; --font-size-base: 16px;
26
+ --font-size-lg: 18px; --font-size-xl: 20px; --font-size-2xl: 24px; --font-size-3xl: 32px;
27
+ --font-weight-regular: 400; --font-weight-medium: 500; --font-weight-semibold: 600; --font-weight-bold: 700;
28
+ --line-height-tight: 1.25; --line-height-base: 1.5; --line-height-loose: 1.75;
29
+ /* ---- Spacing (8pt) ---- */
30
+ --space-1: 4px; --space-2: 8px; --space-3: 12px; --space-4: 16px;
31
+ --space-6: 24px; --space-8: 32px; --space-12: 48px; --space-16: 64px;
32
+ /* ---- Radius (terminal stays tight) ---- */
33
+ --radius-sm: 3px; --radius-md: 6px; --radius-lg: 10px; --radius-full: 9999px;
34
+ }
35
+
36
+
37
+ /* ===== mode-driven kind / status / semantic (accent-independent) ===== */
38
+ :root {
39
+ --color-success: #15803D;
40
+ --color-warning: #B45309;
41
+ --color-danger: #DC2626;
42
+ --color-info: #0284C7;
43
+ --kind-epic: #7C3AED;
44
+ --kind-feature: #0284C7;
45
+ --kind-story: #15803D;
46
+ --kind-release: #C2410C;
47
+ --kind-backlog: #64748B;
48
+ --status-ready: #15803D;
49
+ --status-blocked: #DC2626;
50
+ }
51
+
52
+ @media (prefers-color-scheme: dark) {
53
+ :root {
54
+ --color-success: #22C55E;
55
+ --color-warning: #EAB308;
56
+ --color-danger: #F2495C;
57
+ --color-info: #38BDF8;
58
+ --kind-epic: #A78BFA;
59
+ --kind-feature: #56C7F5;
60
+ --kind-story: #34D399;
61
+ --kind-release: #FB923C;
62
+ --kind-backlog: #94A3B8;
63
+ --status-ready: #34D399;
64
+ --status-blocked: #F2495C;
65
+ }
66
+ }
67
+ :root[data-theme="light"] {
68
+ --color-success: #15803D;
69
+ --color-warning: #B45309;
70
+ --color-danger: #DC2626;
71
+ --color-info: #0284C7;
72
+ --kind-epic: #7C3AED;
73
+ --kind-feature: #0284C7;
74
+ --kind-story: #15803D;
75
+ --kind-release: #C2410C;
76
+ --kind-backlog: #64748B;
77
+ --status-ready: #15803D;
78
+ --status-blocked: #DC2626;
79
+ }
80
+
81
+ :root[data-theme="dark"] {
82
+ --color-success: #22C55E;
83
+ --color-warning: #EAB308;
84
+ --color-danger: #F2495C;
85
+ --color-info: #38BDF8;
86
+ --kind-epic: #A78BFA;
87
+ --kind-feature: #56C7F5;
88
+ --kind-story: #34D399;
89
+ --kind-release: #FB923C;
90
+ --kind-backlog: #94A3B8;
91
+ --status-ready: #34D399;
92
+ --status-blocked: #F2495C;
93
+ }
94
+
95
+
96
+ /* ===== accent: teal ===== */
97
+ :root, [data-accent="teal"] {
98
+ --color-bg-primary: #F5F7FA;
99
+ --color-bg-secondary: #FFFFFF;
100
+ --color-bg-tertiary: #EAEEF3;
101
+ --color-bg-inverse: #0B0E14;
102
+ --color-text-primary: #0E1726;
103
+ --color-text-secondary: #475569;
104
+ --color-text-tertiary: #7A8699;
105
+ --color-text-inverse: #FFFFFF;
106
+ --color-text-link: #0E7490;
107
+ --color-text-link-hover: #0F766E;
108
+ --color-border: #D5DCE5;
109
+ --color-border-strong: #B4BFCC;
110
+ --color-accent: #0F766E;
111
+ --color-accent-hover: #0E7490;
112
+ --color-accent-muted: #D5F0EC;
113
+ }
114
+
115
+ @media (prefers-color-scheme: dark) {
116
+ :root, [data-accent="teal"] {
117
+ --color-bg-primary: #0B0E14;
118
+ --color-bg-secondary: #121826;
119
+ --color-bg-tertiary: #0E1422;
120
+ --color-bg-inverse: #E6EDF5;
121
+ --color-text-primary: #C8D3E0;
122
+ --color-text-secondary: #8A97A8;
123
+ --color-text-tertiary: #5C6675;
124
+ --color-text-inverse: #06201C;
125
+ --color-text-link: #5EEAD4;
126
+ --color-text-link-hover: #99F6E4;
127
+ --color-border: #1E2A3C;
128
+ --color-border-strong: #2E3D52;
129
+ --color-accent: #2DD4BF;
130
+ --color-accent-hover: #5EEAD4;
131
+ --color-accent-muted: #0F2E2A;
132
+ }
133
+ }
134
+ :root[data-theme="dark"] {
135
+ --color-bg-primary: #0B0E14;
136
+ --color-bg-secondary: #121826;
137
+ --color-bg-tertiary: #0E1422;
138
+ --color-bg-inverse: #E6EDF5;
139
+ --color-text-primary: #C8D3E0;
140
+ --color-text-secondary: #8A97A8;
141
+ --color-text-tertiary: #5C6675;
142
+ --color-text-inverse: #06201C;
143
+ --color-text-link: #5EEAD4;
144
+ --color-text-link-hover: #99F6E4;
145
+ --color-border: #1E2A3C;
146
+ --color-border-strong: #2E3D52;
147
+ --color-accent: #2DD4BF;
148
+ --color-accent-hover: #5EEAD4;
149
+ --color-accent-muted: #0F2E2A;
150
+ }
151
+
152
+ :root[data-theme="light"] {
153
+ --color-bg-primary: #F5F7FA;
154
+ --color-bg-secondary: #FFFFFF;
155
+ --color-bg-tertiary: #EAEEF3;
156
+ --color-bg-inverse: #0B0E14;
157
+ --color-text-primary: #0E1726;
158
+ --color-text-secondary: #475569;
159
+ --color-text-tertiary: #7A8699;
160
+ --color-text-inverse: #FFFFFF;
161
+ --color-text-link: #0E7490;
162
+ --color-text-link-hover: #0F766E;
163
+ --color-border: #D5DCE5;
164
+ --color-border-strong: #B4BFCC;
165
+ --color-accent: #0F766E;
166
+ --color-accent-hover: #0E7490;
167
+ --color-accent-muted: #D5F0EC;
168
+ }
169
+
170
+
171
+ /* ===== accent: amber ===== */
172
+ [data-accent="amber"] {
173
+ --color-bg-primary: #FAF6EE;
174
+ --color-bg-secondary: #FFFFFF;
175
+ --color-bg-tertiary: #F0E9DA;
176
+ --color-bg-inverse: #14110B;
177
+ --color-text-primary: #1F1A12;
178
+ --color-text-secondary: #5C5446;
179
+ --color-text-tertiary: #8A7F6A;
180
+ --color-text-inverse: #FFFFFF;
181
+ --color-text-link: #7A4E00;
182
+ --color-text-link-hover: #8A5A00;
183
+ --color-border: #E5DCC8;
184
+ --color-border-strong: #C9BCA0;
185
+ --color-accent: #8A5A00;
186
+ --color-accent-hover: #7A4E00;
187
+ --color-accent-muted: #F0E2C8;
188
+ }
189
+
190
+ @media (prefers-color-scheme: dark) {
191
+ [data-accent="amber"] {
192
+ --color-bg-primary: #14110B;
193
+ --color-bg-secondary: #1E1A12;
194
+ --color-bg-tertiary: #0F0D08;
195
+ --color-bg-inverse: #F2EAD6;
196
+ --color-text-primary: #E3D9C4;
197
+ --color-text-secondary: #A7997C;
198
+ --color-text-tertiary: #6E6450;
199
+ --color-text-inverse: #211603;
200
+ --color-text-link: #FBBF5C;
201
+ --color-text-link-hover: #FFD08A;
202
+ --color-border: #332B1C;
203
+ --color-border-strong: #4A4030;
204
+ --color-accent: #F2A83B;
205
+ --color-accent-hover: #FBBF5C;
206
+ --color-accent-muted: #33260F;
207
+ }
208
+ }
209
+ [data-accent="amber"][data-theme="dark"] {
210
+ --color-bg-primary: #14110B;
211
+ --color-bg-secondary: #1E1A12;
212
+ --color-bg-tertiary: #0F0D08;
213
+ --color-bg-inverse: #F2EAD6;
214
+ --color-text-primary: #E3D9C4;
215
+ --color-text-secondary: #A7997C;
216
+ --color-text-tertiary: #6E6450;
217
+ --color-text-inverse: #211603;
218
+ --color-text-link: #FBBF5C;
219
+ --color-text-link-hover: #FFD08A;
220
+ --color-border: #332B1C;
221
+ --color-border-strong: #4A4030;
222
+ --color-accent: #F2A83B;
223
+ --color-accent-hover: #FBBF5C;
224
+ --color-accent-muted: #33260F;
225
+ }
226
+
227
+ [data-accent="amber"][data-theme="light"] {
228
+ --color-bg-primary: #FAF6EE;
229
+ --color-bg-secondary: #FFFFFF;
230
+ --color-bg-tertiary: #F0E9DA;
231
+ --color-bg-inverse: #14110B;
232
+ --color-text-primary: #1F1A12;
233
+ --color-text-secondary: #5C5446;
234
+ --color-text-tertiary: #8A7F6A;
235
+ --color-text-inverse: #FFFFFF;
236
+ --color-text-link: #7A4E00;
237
+ --color-text-link-hover: #8A5A00;
238
+ --color-border: #E5DCC8;
239
+ --color-border-strong: #C9BCA0;
240
+ --color-accent: #8A5A00;
241
+ --color-accent-hover: #7A4E00;
242
+ --color-accent-muted: #F0E2C8;
243
+ }
244
+
245
+
246
+ /* ===== accent: violet ===== */
247
+ [data-accent="violet"] {
248
+ --color-bg-primary: #F8F5FD;
249
+ --color-bg-secondary: #FFFFFF;
250
+ --color-bg-tertiary: #EFEAF7;
251
+ --color-bg-inverse: #100B1A;
252
+ --color-text-primary: #1A1326;
253
+ --color-text-secondary: #564B66;
254
+ --color-text-tertiary: #8479A0;
255
+ --color-text-inverse: #FFFFFF;
256
+ --color-text-link: #6D28D9;
257
+ --color-text-link-hover: #5B21B6;
258
+ --color-border: #E4DCF2;
259
+ --color-border-strong: #C9BCE0;
260
+ --color-accent: #6D28D9;
261
+ --color-accent-hover: #5B21B6;
262
+ --color-accent-muted: #EDE4FF;
263
+ }
264
+
265
+ @media (prefers-color-scheme: dark) {
266
+ [data-accent="violet"] {
267
+ --color-bg-primary: #100B1A;
268
+ --color-bg-secondary: #181226;
269
+ --color-bg-tertiary: #0C0814;
270
+ --color-bg-inverse: #EDE7F7;
271
+ --color-text-primary: #D6CCE8;
272
+ --color-text-secondary: #9D90B5;
273
+ --color-text-tertiary: #6E6485;
274
+ --color-text-inverse: #1A0B2E;
275
+ --color-text-link: #C99BFF;
276
+ --color-text-link-hover: #DCBEFF;
277
+ --color-border: #2A2040;
278
+ --color-border-strong: #3D3058;
279
+ --color-accent: #B26BFF;
280
+ --color-accent-hover: #C99BFF;
281
+ --color-accent-muted: #241634;
282
+ }
283
+ }
284
+ [data-accent="violet"][data-theme="dark"] {
285
+ --color-bg-primary: #100B1A;
286
+ --color-bg-secondary: #181226;
287
+ --color-bg-tertiary: #0C0814;
288
+ --color-bg-inverse: #EDE7F7;
289
+ --color-text-primary: #D6CCE8;
290
+ --color-text-secondary: #9D90B5;
291
+ --color-text-tertiary: #6E6485;
292
+ --color-text-inverse: #1A0B2E;
293
+ --color-text-link: #C99BFF;
294
+ --color-text-link-hover: #DCBEFF;
295
+ --color-border: #2A2040;
296
+ --color-border-strong: #3D3058;
297
+ --color-accent: #B26BFF;
298
+ --color-accent-hover: #C99BFF;
299
+ --color-accent-muted: #241634;
300
+ }
301
+
302
+ [data-accent="violet"][data-theme="light"] {
303
+ --color-bg-primary: #F8F5FD;
304
+ --color-bg-secondary: #FFFFFF;
305
+ --color-bg-tertiary: #EFEAF7;
306
+ --color-bg-inverse: #100B1A;
307
+ --color-text-primary: #1A1326;
308
+ --color-text-secondary: #564B66;
309
+ --color-text-tertiary: #8479A0;
310
+ --color-text-inverse: #FFFFFF;
311
+ --color-text-link: #6D28D9;
312
+ --color-text-link-hover: #5B21B6;
313
+ --color-border: #E4DCF2;
314
+ --color-border-strong: #C9BCE0;
315
+ --color-accent: #6D28D9;
316
+ --color-accent-hover: #5B21B6;
317
+ --color-accent-muted: #EDE4FF;
318
+ }
319
+
320
+
321
+ /* ===== accent: azure ===== */
322
+ [data-accent="azure"] {
323
+ --color-bg-primary: #F2F6FC;
324
+ --color-bg-secondary: #FFFFFF;
325
+ --color-bg-tertiary: #E7EEF7;
326
+ --color-bg-inverse: #0A0F1A;
327
+ --color-text-primary: #0E1726;
328
+ --color-text-secondary: #475569;
329
+ --color-text-tertiary: #7A8699;
330
+ --color-text-inverse: #FFFFFF;
331
+ --color-text-link: #1A5FC0;
332
+ --color-text-link-hover: #1D6FE0;
333
+ --color-border: #D5DEEC;
334
+ --color-border-strong: #B4C2D8;
335
+ --color-accent: #1D6FE0;
336
+ --color-accent-hover: #1A5FC0;
337
+ --color-accent-muted: #D7E6FB;
338
+ }
339
+
340
+ @media (prefers-color-scheme: dark) {
341
+ [data-accent="azure"] {
342
+ --color-bg-primary: #0A0F1A;
343
+ --color-bg-secondary: #121B2E;
344
+ --color-bg-tertiary: #0A111E;
345
+ --color-bg-inverse: #E6EEF8;
346
+ --color-text-primary: #C5D4E8;
347
+ --color-text-secondary: #8595AD;
348
+ --color-text-tertiary: #5C6880;
349
+ --color-text-inverse: #04162E;
350
+ --color-text-link: #8AC2FF;
351
+ --color-text-link-hover: #B3D7FF;
352
+ --color-border: #1E2A40;
353
+ --color-border-strong: #2E3D58;
354
+ --color-accent: #4DA6FF;
355
+ --color-accent-hover: #8AC2FF;
356
+ --color-accent-muted: #0E2742;
357
+ }
358
+ }
359
+ [data-accent="azure"][data-theme="dark"] {
360
+ --color-bg-primary: #0A0F1A;
361
+ --color-bg-secondary: #121B2E;
362
+ --color-bg-tertiary: #0A111E;
363
+ --color-bg-inverse: #E6EEF8;
364
+ --color-text-primary: #C5D4E8;
365
+ --color-text-secondary: #8595AD;
366
+ --color-text-tertiary: #5C6880;
367
+ --color-text-inverse: #04162E;
368
+ --color-text-link: #8AC2FF;
369
+ --color-text-link-hover: #B3D7FF;
370
+ --color-border: #1E2A40;
371
+ --color-border-strong: #2E3D58;
372
+ --color-accent: #4DA6FF;
373
+ --color-accent-hover: #8AC2FF;
374
+ --color-accent-muted: #0E2742;
375
+ }
376
+
377
+ [data-accent="azure"][data-theme="light"] {
378
+ --color-bg-primary: #F2F6FC;
379
+ --color-bg-secondary: #FFFFFF;
380
+ --color-bg-tertiary: #E7EEF7;
381
+ --color-bg-inverse: #0A0F1A;
382
+ --color-text-primary: #0E1726;
383
+ --color-text-secondary: #475569;
384
+ --color-text-tertiary: #7A8699;
385
+ --color-text-inverse: #FFFFFF;
386
+ --color-text-link: #1A5FC0;
387
+ --color-text-link-hover: #1D6FE0;
388
+ --color-border: #D5DEEC;
389
+ --color-border-strong: #B4C2D8;
390
+ --color-accent: #1D6FE0;
391
+ --color-accent-hover: #1A5FC0;
392
+ --color-accent-muted: #D7E6FB;
393
+ }
394
+
395
+
396
+ /* ===== accent: lime ===== */
397
+ [data-accent="lime"] {
398
+ --color-bg-primary: #F6F8F0;
399
+ --color-bg-secondary: #FFFFFF;
400
+ --color-bg-tertiary: #ECEFE0;
401
+ --color-bg-inverse: #0C0F0A;
402
+ --color-text-primary: #14180E;
403
+ --color-text-secondary: #4A5240;
404
+ --color-text-tertiary: #79836A;
405
+ --color-text-inverse: #FFFFFF;
406
+ --color-text-link: #3F6B0A;
407
+ --color-text-link-hover: #4D7C0F;
408
+ --color-border: #DDE4CC;
409
+ --color-border-strong: #C0CAA8;
410
+ --color-accent: #4D7C0F;
411
+ --color-accent-hover: #3F6B0A;
412
+ --color-accent-muted: #E4EFC8;
413
+ }
414
+
415
+ @media (prefers-color-scheme: dark) {
416
+ [data-accent="lime"] {
417
+ --color-bg-primary: #0C0F0A;
418
+ --color-bg-secondary: #141A12;
419
+ --color-bg-tertiary: #0A0D08;
420
+ --color-bg-inverse: #EAF0E0;
421
+ --color-text-primary: #D2DCC4;
422
+ --color-text-secondary: #97A285;
423
+ --color-text-tertiary: #646E55;
424
+ --color-text-inverse: #14210A;
425
+ --color-text-link: #CDF26B;
426
+ --color-text-link-hover: #DEF59A;
427
+ --color-border: #222C1A;
428
+ --color-border-strong: #34402A;
429
+ --color-accent: #B6F23B;
430
+ --color-accent-hover: #CDF26B;
431
+ --color-accent-muted: #1E2A12;
432
+ }
433
+ }
434
+ [data-accent="lime"][data-theme="dark"] {
435
+ --color-bg-primary: #0C0F0A;
436
+ --color-bg-secondary: #141A12;
437
+ --color-bg-tertiary: #0A0D08;
438
+ --color-bg-inverse: #EAF0E0;
439
+ --color-text-primary: #D2DCC4;
440
+ --color-text-secondary: #97A285;
441
+ --color-text-tertiary: #646E55;
442
+ --color-text-inverse: #14210A;
443
+ --color-text-link: #CDF26B;
444
+ --color-text-link-hover: #DEF59A;
445
+ --color-border: #222C1A;
446
+ --color-border-strong: #34402A;
447
+ --color-accent: #B6F23B;
448
+ --color-accent-hover: #CDF26B;
449
+ --color-accent-muted: #1E2A12;
450
+ }
451
+
452
+ [data-accent="lime"][data-theme="light"] {
453
+ --color-bg-primary: #F6F8F0;
454
+ --color-bg-secondary: #FFFFFF;
455
+ --color-bg-tertiary: #ECEFE0;
456
+ --color-bg-inverse: #0C0F0A;
457
+ --color-text-primary: #14180E;
458
+ --color-text-secondary: #4A5240;
459
+ --color-text-tertiary: #79836A;
460
+ --color-text-inverse: #FFFFFF;
461
+ --color-text-link: #3F6B0A;
462
+ --color-text-link-hover: #4D7C0F;
463
+ --color-border: #DDE4CC;
464
+ --color-border-strong: #C0CAA8;
465
+ --color-accent: #4D7C0F;
466
+ --color-accent-hover: #3F6B0A;
467
+ --color-accent-muted: #E4EFC8;
468
+ }
469
+
470
+
471
+ /* ===== accent: candy ===== */
472
+ [data-accent="candy"] {
473
+ --color-bg-primary: #FFF7FB;
474
+ --color-bg-secondary: #FFFFFF;
475
+ --color-bg-tertiary: #FBEEF5;
476
+ --color-bg-inverse: #121016;
477
+ --color-text-primary: #1A1326;
478
+ --color-text-secondary: #6E4A6A;
479
+ --color-text-tertiary: #9E7A98;
480
+ --color-text-inverse: #FFFFFF;
481
+ --color-text-link: #BE185D;
482
+ --color-text-link-hover: #9D1450;
483
+ --color-border: #F2DEEA;
484
+ --color-border-strong: #E0BCD2;
485
+ --color-accent: #DB2777;
486
+ --color-accent-hover: #BE185D;
487
+ --color-accent-muted: #FCE0EE;
488
+ }
489
+
490
+ @media (prefers-color-scheme: dark) {
491
+ [data-accent="candy"] {
492
+ --color-bg-primary: #121016;
493
+ --color-bg-secondary: #1C1922;
494
+ --color-bg-tertiary: #0D0B11;
495
+ --color-bg-inverse: #F0EAF5;
496
+ --color-text-primary: #ECE6F0;
497
+ --color-text-secondary: #A89CB5;
498
+ --color-text-tertiary: #6E6480;
499
+ --color-text-inverse: #2A0A14;
500
+ --color-text-link: #5EEAD4;
501
+ --color-text-link-hover: #99F6E4;
502
+ --color-border: #2A2533;
503
+ --color-border-strong: #3D3650;
504
+ --color-accent: #FF5FA2;
505
+ --color-accent-hover: #FF85BC;
506
+ --color-accent-muted: #33172A;
507
+ }
508
+ }
509
+ [data-accent="candy"][data-theme="dark"] {
510
+ --color-bg-primary: #121016;
511
+ --color-bg-secondary: #1C1922;
512
+ --color-bg-tertiary: #0D0B11;
513
+ --color-bg-inverse: #F0EAF5;
514
+ --color-text-primary: #ECE6F0;
515
+ --color-text-secondary: #A89CB5;
516
+ --color-text-tertiary: #6E6480;
517
+ --color-text-inverse: #2A0A14;
518
+ --color-text-link: #5EEAD4;
519
+ --color-text-link-hover: #99F6E4;
520
+ --color-border: #2A2533;
521
+ --color-border-strong: #3D3650;
522
+ --color-accent: #FF5FA2;
523
+ --color-accent-hover: #FF85BC;
524
+ --color-accent-muted: #33172A;
525
+ }
526
+
527
+ [data-accent="candy"][data-theme="light"] {
528
+ --color-bg-primary: #FFF7FB;
529
+ --color-bg-secondary: #FFFFFF;
530
+ --color-bg-tertiary: #FBEEF5;
531
+ --color-bg-inverse: #121016;
532
+ --color-text-primary: #1A1326;
533
+ --color-text-secondary: #6E4A6A;
534
+ --color-text-tertiary: #9E7A98;
535
+ --color-text-inverse: #FFFFFF;
536
+ --color-text-link: #BE185D;
537
+ --color-text-link-hover: #9D1450;
538
+ --color-border: #F2DEEA;
539
+ --color-border-strong: #E0BCD2;
540
+ --color-accent: #DB2777;
541
+ --color-accent-hover: #BE185D;
542
+ --color-accent-muted: #FCE0EE;
543
+ }
544
+
545
+
546
+ /* ===== candy: rainbow kind/status overrides ===== */
547
+ [data-accent="candy"] {
548
+ --color-success: #15803D;
549
+ --color-warning: #B45309;
550
+ --color-danger: #BE185D;
551
+ --color-info: #0E7490;
552
+ --kind-epic: #9333EA;
553
+ --kind-feature: #0E7490;
554
+ --kind-story: #4D7C0F;
555
+ --kind-release: #C2410C;
556
+ --kind-backlog: #6E4A6A;
557
+ --status-ready: #15803D;
558
+ --status-blocked: #BE185D;
559
+ }
560
+
561
+ @media (prefers-color-scheme: dark) {
562
+ [data-accent="candy"] {
563
+ --color-success: #34D399;
564
+ --color-warning: #FBBF24;
565
+ --color-danger: #FF5C7A;
566
+ --color-info: #38D6F8;
567
+ --kind-epic: #C77DFF;
568
+ --kind-feature: #38D6F8;
569
+ --kind-story: #A3E635;
570
+ --kind-release: #FF9E64;
571
+ --kind-backlog: #9A8FB0;
572
+ --status-ready: #34D399;
573
+ --status-blocked: #FF5C7A;
574
+ }
575
+ }
576
+ [data-accent="candy"][data-theme="dark"] {
577
+ --color-success: #34D399;
578
+ --color-warning: #FBBF24;
579
+ --color-danger: #FF5C7A;
580
+ --color-info: #38D6F8;
581
+ --kind-epic: #C77DFF;
582
+ --kind-feature: #38D6F8;
583
+ --kind-story: #A3E635;
584
+ --kind-release: #FF9E64;
585
+ --kind-backlog: #9A8FB0;
586
+ --status-ready: #34D399;
587
+ --status-blocked: #FF5C7A;
588
+ }
589
+
590
+ [data-accent="candy"][data-theme="light"] {
591
+ --color-success: #15803D;
592
+ --color-warning: #B45309;
593
+ --color-danger: #BE185D;
594
+ --color-info: #0E7490;
595
+ --kind-epic: #9333EA;
596
+ --kind-feature: #0E7490;
597
+ --kind-story: #4D7C0F;
598
+ --kind-release: #C2410C;
599
+ --kind-backlog: #6E4A6A;
600
+ --status-ready: #15803D;
601
+ --status-blocked: #BE185D;
602
+ }
@@ -0,0 +1,41 @@
1
+ import { kanbanView } from "/assets/kanban.js";
2
+ import { dependencyView } from "/assets/dependency.js";
3
+ import { tableView } from "/assets/table.js";
4
+
5
+ const registry = new Map();
6
+
7
+ function textElement(tag, className, text) {
8
+ const element = document.createElement(tag);
9
+ if (className) {
10
+ element.className = className;
11
+ }
12
+ element.textContent = text;
13
+ return element;
14
+ }
15
+
16
+ export function registerView(view) {
17
+ if (!view || typeof view.id !== "string" || typeof view.mount !== "function") {
18
+ throw new Error("Board views must provide string id and mount(root, ctx)");
19
+ }
20
+ registry.set(view.id, view);
21
+ return view;
22
+ }
23
+
24
+ export function mountCurrentView(root, ctx) {
25
+ if (!root) {
26
+ return;
27
+ }
28
+ const state = ctx.getState();
29
+ const view = registry.get(state.view);
30
+ if (!view) {
31
+ root.replaceChildren(textElement("div", "view-placeholder empty", `No registered view: ${state.view}`));
32
+ return;
33
+ }
34
+ view.mount(root, ctx);
35
+ }
36
+
37
+ registerView(kanbanView);
38
+
39
+ registerView(dependencyView);
40
+
41
+ registerView(tableView);