@sienklogic/plan-build-run 2.28.0 → 2.30.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 (41) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/dashboard/public/css/command-center.css +382 -0
  3. package/dashboard/public/css/explorer.css +458 -0
  4. package/dashboard/public/css/layout.css +11 -2
  5. package/dashboard/public/css/tokens.css +6 -3
  6. package/dashboard/src/components/Layout.tsx +7 -0
  7. package/dashboard/src/components/explorer/ExplorerPage.tsx +57 -0
  8. package/dashboard/src/components/explorer/tabs/AuditsTab.tsx +29 -0
  9. package/dashboard/src/components/explorer/tabs/MilestonesTab.tsx +84 -0
  10. package/dashboard/src/components/explorer/tabs/NotesTab.tsx +32 -0
  11. package/dashboard/src/components/explorer/tabs/PhasesTab.tsx +204 -0
  12. package/dashboard/src/components/explorer/tabs/QuickTab.tsx +40 -0
  13. package/dashboard/src/components/explorer/tabs/RequirementsTab.tsx +45 -0
  14. package/dashboard/src/components/explorer/tabs/ResearchTab.tsx +47 -0
  15. package/dashboard/src/components/explorer/tabs/TodosTab.tsx +161 -0
  16. package/dashboard/src/components/partials/ActivityStream.tsx +58 -0
  17. package/dashboard/src/components/partials/AttentionPanel.tsx +48 -0
  18. package/dashboard/src/components/partials/CurrentPhaseCard.tsx +50 -0
  19. package/dashboard/src/components/partials/PhaseTimeline.tsx +38 -0
  20. package/dashboard/src/components/partials/ProgressRing.tsx +51 -0
  21. package/dashboard/src/components/partials/QuickActions.tsx +30 -0
  22. package/dashboard/src/components/partials/StatusHeader.tsx +45 -0
  23. package/dashboard/src/index.tsx +4 -0
  24. package/dashboard/src/middleware/current-phase.ts +0 -2
  25. package/dashboard/src/routes/command-center.routes.tsx +69 -0
  26. package/dashboard/src/routes/explorer.routes.tsx +226 -0
  27. package/dashboard/src/routes/index.routes.tsx +79 -9
  28. package/dashboard/src/services/audit.service.d.ts +14 -0
  29. package/dashboard/src/services/dashboard.service.d.ts +39 -0
  30. package/dashboard/src/services/milestone.service.d.ts +35 -0
  31. package/dashboard/src/services/notes.service.d.ts +14 -0
  32. package/dashboard/src/services/phase.service.d.ts +59 -0
  33. package/dashboard/src/services/quick.service.d.ts +15 -0
  34. package/dashboard/src/services/requirements.service.d.ts +19 -0
  35. package/dashboard/src/services/research.service.d.ts +27 -0
  36. package/dashboard/src/services/roadmap.service.d.ts +23 -0
  37. package/dashboard/src/services/todo.service.d.ts +21 -0
  38. package/package.json +1 -1
  39. package/plugins/copilot-pbr/plugin.json +1 -1
  40. package/plugins/cursor-pbr/.cursor-plugin/plugin.json +1 -1
  41. package/plugins/pbr/.claude-plugin/plugin.json +1 -1
package/CHANGELOG.md CHANGED
@@ -5,6 +5,31 @@ All notable changes to Plan-Build-Run will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [2.30.0](https://github.com/SienkLogic/plan-build-run/compare/plan-build-run-v2.29.0...plan-build-run-v2.30.0) (2026-02-24)
9
+
10
+
11
+ ### Features
12
+
13
+ * **40-01:** add Explorer view shell with phases tab and Alpine.js tabs ([f6d4fb3](https://github.com/SienkLogic/plan-build-run/commit/f6d4fb391cbd6eebe13ee6c381556404f4ad1faf))
14
+ * **40-02:** add MilestonesTab component and milestone.service type declarations ([420572b](https://github.com/SienkLogic/plan-build-run/commit/420572bb0009b52e0e761baf66097980758b981e))
15
+ * **40-02:** add TodosTab component with TodoListFragment and TodoCreateForm ([0cca669](https://github.com/SienkLogic/plan-build-run/commit/0cca669f39079a69fe5376d7460135a0fd496f07))
16
+ * **40-02:** wire todos and milestones routes into explorer.routes.tsx ([83e2963](https://github.com/SienkLogic/plan-build-run/commit/83e2963fc1d7bbc061df23c3f5c80c326bd2f16e))
17
+ * **40-03:** add NotesTab, AuditsTab, and QuickTab components ([e3edd64](https://github.com/SienkLogic/plan-build-run/commit/e3edd647a9db251527f50ed2264540acbc1974ff))
18
+ * **40-03:** add ResearchTab and RequirementsTab components with requirements CSS ([3102ff7](https://github.com/SienkLogic/plan-build-run/commit/3102ff735a0be217f013fa01199c1823cf2cfae5))
19
+ * **40-03:** wire research, requirements, notes, audits, quick routes; add service .d.ts files ([a45fcd9](https://github.com/SienkLogic/plan-build-run/commit/a45fcd906d06fc0da866ed6492c116bc9e80ab76))
20
+
21
+
22
+ ### Bug Fixes
23
+
24
+ * **40-02:** use JSX-compatible hx-on attribute syntax in TodoCreateForm ([70e6822](https://github.com/SienkLogic/plan-build-run/commit/70e6822c5ec72ef25ee290ba7453065637f3c828))
25
+
26
+ ## [2.29.0](https://github.com/SienkLogic/plan-build-run/compare/plan-build-run-v2.28.0...plan-build-run-v2.29.0) (2026-02-24)
27
+
28
+
29
+ ### Features
30
+
31
+ * **39-01:** add Command Center view with live-updating dashboard components ([7520c7f](https://github.com/SienkLogic/plan-build-run/commit/7520c7fd592beae5739cfd96aa73fd354047896d))
32
+
8
33
  ## [2.28.0](https://github.com/SienkLogic/plan-build-run/compare/plan-build-run-v2.27.2...plan-build-run-v2.28.0) (2026-02-24)
9
34
 
10
35
 
@@ -0,0 +1,382 @@
1
+ /* ============================================
2
+ PBR Dashboard — Command Center View
3
+ Styles for progress ring, phase timeline,
4
+ attention panel, activity stream.
5
+ All values use tokens from tokens.css.
6
+ ============================================ */
7
+
8
+ /* --- Command Center Layout --- */
9
+ .command-center {
10
+ display: flex;
11
+ flex-direction: column;
12
+ gap: var(--space-lg);
13
+ padding: var(--space-lg);
14
+ max-width: 1200px;
15
+ }
16
+
17
+ .command-center__grid {
18
+ display: grid;
19
+ grid-template-columns: 1fr 1fr;
20
+ gap: var(--space-md);
21
+ }
22
+
23
+ @media (max-width: 768px) {
24
+ .command-center__grid {
25
+ grid-template-columns: 1fr;
26
+ }
27
+ }
28
+
29
+ /* --- Status Header --- */
30
+ .status-header {
31
+ display: flex;
32
+ align-items: center;
33
+ gap: var(--space-md);
34
+ flex-wrap: wrap;
35
+ }
36
+
37
+ .status-header__project {
38
+ font-size: 1.5rem;
39
+ font-weight: 700;
40
+ letter-spacing: -0.02em;
41
+ color: var(--color-text);
42
+ }
43
+
44
+ .status-header__phase {
45
+ font-size: 1rem;
46
+ color: var(--color-text-dim);
47
+ }
48
+
49
+ /* --- Milestone Progress Bar --- */
50
+ .milestone-bar {
51
+ width: 100%;
52
+ margin-top: var(--space-sm);
53
+ }
54
+
55
+ .milestone-bar__track {
56
+ height: 8px;
57
+ border-radius: var(--radius-sm);
58
+ background: var(--color-border);
59
+ overflow: hidden;
60
+ }
61
+
62
+ .milestone-bar__fill {
63
+ height: 100%;
64
+ border-radius: var(--radius-sm);
65
+ background: var(--color-accent);
66
+ transition: width var(--transition-base);
67
+ }
68
+
69
+ .milestone-bar__label {
70
+ font-size: 0.8rem;
71
+ color: var(--color-text-muted);
72
+ margin-top: var(--space-xs);
73
+ }
74
+
75
+ /* --- Progress Ring --- */
76
+ .progress-ring-wrapper {
77
+ display: flex;
78
+ align-items: center;
79
+ justify-content: center;
80
+ padding: var(--space-sm);
81
+ }
82
+
83
+ .progress-ring__svg {
84
+ transform: rotate(-90deg);
85
+ }
86
+
87
+ .progress-ring__bg {
88
+ stroke: var(--color-border);
89
+ fill: none;
90
+ }
91
+
92
+ .progress-ring__fg {
93
+ stroke: var(--color-accent);
94
+ fill: none;
95
+ stroke-linecap: round;
96
+ transition: stroke-dashoffset var(--transition-base);
97
+ }
98
+
99
+ .progress-ring__text {
100
+ transform: rotate(90deg);
101
+ font-size: 1.25rem;
102
+ font-weight: 700;
103
+ fill: var(--color-text);
104
+ text-anchor: middle;
105
+ dominant-baseline: middle;
106
+ }
107
+
108
+ /* --- Current Phase Card --- */
109
+ .current-phase-card {
110
+ grid-column: 1 / -1;
111
+ }
112
+
113
+ .card {
114
+ background: var(--card-bg);
115
+ border: 1px solid var(--card-border);
116
+ border-radius: var(--card-radius);
117
+ box-shadow: var(--card-shadow);
118
+ padding: var(--card-padding);
119
+ }
120
+
121
+ .card__header {
122
+ font-size: 0.75rem;
123
+ font-weight: 600;
124
+ text-transform: uppercase;
125
+ letter-spacing: 0.08em;
126
+ color: var(--color-text-muted);
127
+ padding-bottom: var(--space-sm);
128
+ border-bottom: 1px solid var(--color-border);
129
+ margin-bottom: var(--space-md);
130
+ }
131
+
132
+ .card__title {
133
+ font-size: 1.25rem;
134
+ font-weight: 600;
135
+ margin: 0 0 var(--space-sm) 0;
136
+ }
137
+
138
+ .card__meta {
139
+ font-size: 0.85rem;
140
+ color: var(--color-text-dim);
141
+ margin: var(--space-xs) 0;
142
+ }
143
+
144
+ /* --- Next Action --- */
145
+ .next-action {
146
+ display: flex;
147
+ align-items: center;
148
+ gap: var(--space-sm);
149
+ margin-top: var(--space-md);
150
+ padding: var(--space-sm) var(--space-md);
151
+ background: var(--color-surface);
152
+ border: 1px solid var(--color-border);
153
+ border-radius: var(--radius-sm);
154
+ }
155
+
156
+ .next-action__label {
157
+ font-size: 0.75rem;
158
+ color: var(--color-text-muted);
159
+ text-transform: uppercase;
160
+ letter-spacing: 0.06em;
161
+ }
162
+
163
+ .next-action__cmd {
164
+ font-family: var(--font-mono);
165
+ font-size: 0.9rem;
166
+ color: var(--color-accent);
167
+ flex: 1;
168
+ }
169
+
170
+ /* --- Attention Panel --- */
171
+ .attention-panel__header {
172
+ color: var(--orange-7, #c2510f);
173
+ }
174
+
175
+ .attention-panel__list {
176
+ list-style: none;
177
+ padding: 0;
178
+ margin: 0;
179
+ display: flex;
180
+ flex-direction: column;
181
+ gap: var(--space-xs);
182
+ }
183
+
184
+ .attention-panel__list li {
185
+ font-size: 0.9rem;
186
+ padding: var(--space-xs) 0;
187
+ border-bottom: 1px solid var(--color-border);
188
+ }
189
+
190
+ .attention-panel__list li:last-child {
191
+ border-bottom: none;
192
+ }
193
+
194
+ .attention-panel__clear {
195
+ font-size: 0.9rem;
196
+ color: var(--color-text-muted);
197
+ font-style: italic;
198
+ }
199
+
200
+ /* --- Phase Timeline --- */
201
+ .phase-timeline {
202
+ grid-column: 1 / -1;
203
+ }
204
+
205
+ .phase-timeline__label {
206
+ font-size: 0.75rem;
207
+ font-weight: 600;
208
+ text-transform: uppercase;
209
+ letter-spacing: 0.08em;
210
+ color: var(--color-text-muted);
211
+ margin-bottom: var(--space-sm);
212
+ }
213
+
214
+ .phase-timeline__strip {
215
+ display: flex;
216
+ flex-wrap: wrap;
217
+ gap: 4px;
218
+ }
219
+
220
+ .phase-block {
221
+ display: inline-flex;
222
+ align-items: center;
223
+ justify-content: center;
224
+ width: 32px;
225
+ height: 32px;
226
+ border-radius: var(--radius-sm);
227
+ font-size: 0.7rem;
228
+ font-weight: 600;
229
+ text-decoration: none;
230
+ cursor: pointer;
231
+ transition: transform var(--transition-fast), box-shadow var(--transition-fast);
232
+ }
233
+
234
+ .phase-block:hover {
235
+ transform: translateY(-2px);
236
+ box-shadow: var(--shadow-md);
237
+ }
238
+
239
+ .phase-block--complete {
240
+ background: var(--green-6, #2da44e);
241
+ color: #fff;
242
+ }
243
+
244
+ .phase-block--in-progress {
245
+ background: var(--blue-6, #0969da);
246
+ color: #fff;
247
+ }
248
+
249
+ .phase-block--not-started {
250
+ background: var(--color-border);
251
+ color: var(--color-text-dim);
252
+ }
253
+
254
+ .phase-block--current {
255
+ outline: 3px solid var(--color-accent);
256
+ outline-offset: 2px;
257
+ }
258
+
259
+ /* --- Activity Stream --- */
260
+ .activity-stream__list {
261
+ list-style: none;
262
+ padding: 0;
263
+ margin: 0;
264
+ display: flex;
265
+ flex-direction: column;
266
+ gap: 0;
267
+ }
268
+
269
+ .activity-item {
270
+ display: flex;
271
+ align-items: baseline;
272
+ gap: var(--space-sm);
273
+ padding: var(--space-xs) 0;
274
+ border-bottom: 1px solid var(--color-border);
275
+ font-size: 0.85rem;
276
+ }
277
+
278
+ .activity-item:last-child {
279
+ border-bottom: none;
280
+ }
281
+
282
+ .activity-item__icon {
283
+ color: var(--color-text-muted);
284
+ flex-shrink: 0;
285
+ }
286
+
287
+ .activity-item__path {
288
+ font-family: var(--font-mono);
289
+ font-size: 0.8rem;
290
+ color: var(--color-text-dim);
291
+ flex: 1;
292
+ overflow: hidden;
293
+ text-overflow: ellipsis;
294
+ white-space: nowrap;
295
+ }
296
+
297
+ .activity-item__time {
298
+ font-size: 0.75rem;
299
+ color: var(--color-text-muted);
300
+ flex-shrink: 0;
301
+ }
302
+
303
+ .activity-stream__empty {
304
+ font-size: 0.9rem;
305
+ color: var(--color-text-muted);
306
+ font-style: italic;
307
+ }
308
+
309
+ /* --- Quick Actions --- */
310
+ .quick-actions {
311
+ display: flex;
312
+ flex-direction: column;
313
+ gap: var(--space-sm);
314
+ }
315
+
316
+ .quick-actions__label {
317
+ font-size: 0.75rem;
318
+ font-weight: 600;
319
+ text-transform: uppercase;
320
+ letter-spacing: 0.08em;
321
+ color: var(--color-text-muted);
322
+ }
323
+
324
+ .quick-actions__buttons {
325
+ display: flex;
326
+ flex-wrap: wrap;
327
+ gap: var(--space-sm);
328
+ }
329
+
330
+ /* --- Buttons --- */
331
+ .btn {
332
+ display: inline-flex;
333
+ align-items: center;
334
+ justify-content: center;
335
+ padding: var(--space-xs) var(--space-md);
336
+ border-radius: var(--radius-sm);
337
+ font-size: 0.875rem;
338
+ font-weight: 500;
339
+ text-decoration: none;
340
+ cursor: pointer;
341
+ border: 1px solid transparent;
342
+ transition: background var(--transition-fast), color var(--transition-fast), border-color var(--transition-fast);
343
+ }
344
+
345
+ .btn--primary {
346
+ background: var(--color-accent);
347
+ color: #fff;
348
+ border-color: var(--color-accent);
349
+ }
350
+
351
+ .btn--primary:hover {
352
+ background: var(--color-accent-hover);
353
+ border-color: var(--color-accent-hover);
354
+ color: #fff;
355
+ text-decoration: none;
356
+ }
357
+
358
+ .btn--secondary {
359
+ background: transparent;
360
+ color: var(--color-text);
361
+ border-color: var(--color-border);
362
+ }
363
+
364
+ .btn--secondary:hover {
365
+ background: var(--color-surface-hover);
366
+ text-decoration: none;
367
+ }
368
+
369
+ .btn--ghost {
370
+ background: transparent;
371
+ color: var(--color-text-dim);
372
+ border-color: transparent;
373
+ }
374
+
375
+ .btn--ghost:hover {
376
+ background: var(--color-surface-hover);
377
+ }
378
+
379
+ .btn--sm {
380
+ padding: 2px var(--space-sm);
381
+ font-size: 0.75rem;
382
+ }