specdacular 0.2.5 → 0.5.1

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 (34) hide show
  1. package/README.md +186 -68
  2. package/commands/specd/blueprint.md +64 -0
  3. package/commands/specd/{discuss-feature.md → feature/discuss.md} +1 -1
  4. package/commands/specd/{new-feature.md → feature/new.md} +3 -3
  5. package/commands/specd/{plan-feature.md → feature/plan.md} +15 -18
  6. package/commands/specd/{research-feature.md → feature/research.md} +5 -5
  7. package/commands/specd/help.md +51 -29
  8. package/commands/specd/{execute-plan.md → phase/execute.md} +4 -4
  9. package/commands/specd/phase/insert.md +62 -0
  10. package/commands/specd/phase/plan.md +73 -0
  11. package/commands/specd/{discuss-phase.md → phase/prepare.md} +21 -9
  12. package/commands/specd/phase/renumber.md +66 -0
  13. package/commands/specd/{research-phase.md → phase/research.md} +3 -1
  14. package/commands/specd/status.md +20 -0
  15. package/package.json +1 -1
  16. package/specdacular/agents/feature-researcher.md +4 -2
  17. package/specdacular/templates/blueprint/index.html +110 -0
  18. package/specdacular/templates/blueprint/scripts.js +71 -0
  19. package/specdacular/templates/blueprint/styles.css +429 -0
  20. package/specdacular/templates/features/STATE.md +6 -4
  21. package/specdacular/workflows/blueprint-diagrams.md +273 -0
  22. package/specdacular/workflows/blueprint-wireframes.md +312 -0
  23. package/specdacular/workflows/blueprint.md +372 -0
  24. package/specdacular/workflows/discuss-feature.md +4 -4
  25. package/specdacular/workflows/execute-plan.md +4 -4
  26. package/specdacular/workflows/insert-phase.md +222 -0
  27. package/specdacular/workflows/new-feature.md +5 -5
  28. package/specdacular/workflows/plan-feature.md +60 -233
  29. package/specdacular/workflows/plan-phase.md +363 -0
  30. package/specdacular/workflows/prepare-phase.md +759 -0
  31. package/specdacular/workflows/renumber-phases.md +273 -0
  32. package/specdacular/workflows/research-phase.md +5 -3
  33. package/specdacular/workflows/status.md +85 -0
  34. package/specdacular/workflows/discuss-phase.md +0 -389
@@ -0,0 +1,71 @@
1
+ // Initialize Mermaid for diagrams
2
+ mermaid.initialize({
3
+ startOnLoad: true,
4
+ theme: 'default',
5
+ securityLevel: 'loose'
6
+ });
7
+
8
+ // Tab switching
9
+ document.addEventListener('DOMContentLoaded', function() {
10
+ const tabLinks = document.querySelectorAll('.tab-link:not(.disabled)');
11
+
12
+ tabLinks.forEach(link => {
13
+ link.addEventListener('click', function(e) {
14
+ e.preventDefault();
15
+
16
+ // Remove active class from all tabs and content
17
+ document.querySelectorAll('.tab-link').forEach(l => l.classList.remove('active'));
18
+ document.querySelectorAll('.tab-content').forEach(c => c.classList.remove('active'));
19
+
20
+ // Add active class to clicked tab and corresponding content
21
+ this.classList.add('active');
22
+ const tabId = this.getAttribute('data-tab');
23
+ document.getElementById(tabId).classList.add('active');
24
+
25
+ // Re-render Mermaid diagrams in newly visible tab
26
+ const section = document.getElementById(tabId);
27
+ const diagrams = section.querySelectorAll('.mermaid');
28
+ if (diagrams.length > 0) {
29
+ mermaid.init(undefined, diagrams);
30
+ }
31
+ });
32
+ });
33
+
34
+ // Phase tab switching (within sections)
35
+ document.querySelectorAll('.phase-tabs').forEach(tabContainer => {
36
+ const tabs = tabContainer.querySelectorAll('.phase-tab');
37
+ const section = tabContainer.closest('.tab-content');
38
+
39
+ tabs.forEach(tab => {
40
+ tab.addEventListener('click', function() {
41
+ // Remove active from all phase tabs in this section
42
+ tabs.forEach(t => t.classList.remove('active'));
43
+
44
+ // Add active to clicked tab
45
+ this.classList.add('active');
46
+
47
+ // Get phase to show
48
+ const phase = this.getAttribute('data-phase');
49
+
50
+ // Hide all phase content in this section
51
+ section.querySelectorAll('.phase-content').forEach(content => {
52
+ content.classList.remove('active');
53
+ });
54
+
55
+ // Show selected phase content
56
+ if (phase === 'all') {
57
+ // Show all phase content
58
+ section.querySelectorAll('.phase-content').forEach(content => {
59
+ content.classList.add('active');
60
+ });
61
+ } else {
62
+ // Show only matching phase
63
+ const targetContent = section.querySelector('.phase-content[data-phase="' + phase + '"]');
64
+ if (targetContent) {
65
+ targetContent.classList.add('active');
66
+ }
67
+ }
68
+ });
69
+ });
70
+ });
71
+ });
@@ -0,0 +1,429 @@
1
+ * {
2
+ margin: 0;
3
+ padding: 0;
4
+ box-sizing: border-box;
5
+ }
6
+
7
+ body {
8
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
9
+ height: 100vh;
10
+ overflow: hidden;
11
+ background: #f5f5f5;
12
+ }
13
+
14
+ .blueprint-container {
15
+ display: flex;
16
+ height: 100vh;
17
+ }
18
+
19
+ /* Sidebar */
20
+ .blueprint-sidebar {
21
+ width: 250px;
22
+ min-width: 250px;
23
+ background: #2c3e50;
24
+ color: white;
25
+ display: flex;
26
+ flex-direction: column;
27
+ overflow-y: auto;
28
+ }
29
+
30
+ .sidebar-header {
31
+ padding: 1.5rem;
32
+ background: #1a252f;
33
+ border-bottom: 1px solid #34495e;
34
+ }
35
+
36
+ .sidebar-header h2 {
37
+ font-size: 1.25rem;
38
+ margin-bottom: 0.25rem;
39
+ }
40
+
41
+ .sidebar-header .subtitle {
42
+ font-size: 0.875rem;
43
+ opacity: 0.7;
44
+ }
45
+
46
+ .nav-tabs {
47
+ list-style: none;
48
+ flex: 1;
49
+ padding: 1rem 0;
50
+ }
51
+
52
+ .tab-link {
53
+ display: block;
54
+ padding: 0.875rem 1.5rem;
55
+ color: white;
56
+ text-decoration: none;
57
+ transition: background 0.2s, border-left 0.2s;
58
+ border-left: 4px solid transparent;
59
+ }
60
+
61
+ .tab-link:hover {
62
+ background: #34495e;
63
+ }
64
+
65
+ .tab-link.active {
66
+ background: #34495e;
67
+ border-left-color: #3498db;
68
+ }
69
+
70
+ .tab-link.disabled {
71
+ opacity: 0.4;
72
+ pointer-events: none;
73
+ }
74
+
75
+ .sidebar-footer {
76
+ padding: 1rem 1.5rem;
77
+ font-size: 0.75rem;
78
+ opacity: 0.6;
79
+ border-top: 1px solid #34495e;
80
+ }
81
+
82
+ /* Main Content */
83
+ .blueprint-content {
84
+ flex: 1;
85
+ overflow-y: auto;
86
+ padding: 2rem;
87
+ }
88
+
89
+ .tab-content {
90
+ display: none;
91
+ }
92
+
93
+ .tab-content.active {
94
+ display: block;
95
+ }
96
+
97
+ .tab-content h1 {
98
+ margin-bottom: 1rem;
99
+ color: #2c3e50;
100
+ }
101
+
102
+ .section-intro {
103
+ color: #666;
104
+ margin-bottom: 1.5rem;
105
+ }
106
+
107
+ /* Overview Stats */
108
+ .overview-description {
109
+ background: white;
110
+ padding: 1.5rem;
111
+ border-radius: 8px;
112
+ margin-bottom: 1.5rem;
113
+ line-height: 1.6;
114
+ }
115
+
116
+ .overview-stats {
117
+ display: grid;
118
+ grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
119
+ gap: 1rem;
120
+ margin-bottom: 2rem;
121
+ }
122
+
123
+ .stat {
124
+ background: white;
125
+ padding: 1.5rem;
126
+ border-radius: 8px;
127
+ text-align: center;
128
+ }
129
+
130
+ .stat-value {
131
+ display: block;
132
+ font-size: 2rem;
133
+ font-weight: bold;
134
+ color: #3498db;
135
+ }
136
+
137
+ .stat-label {
138
+ font-size: 0.875rem;
139
+ color: #666;
140
+ }
141
+
142
+ /* Timeline */
143
+ .overview-timeline {
144
+ background: white;
145
+ padding: 1.5rem;
146
+ border-radius: 8px;
147
+ }
148
+
149
+ .overview-timeline h2 {
150
+ margin-bottom: 1rem;
151
+ font-size: 1.125rem;
152
+ }
153
+
154
+ .timeline-item {
155
+ padding: 0.75rem 0;
156
+ border-bottom: 1px solid #eee;
157
+ display: flex;
158
+ gap: 1rem;
159
+ }
160
+
161
+ .timeline-item:last-child {
162
+ border-bottom: none;
163
+ }
164
+
165
+ .timeline-date {
166
+ color: #666;
167
+ font-size: 0.875rem;
168
+ min-width: 100px;
169
+ }
170
+
171
+ .timeline-event {
172
+ flex: 1;
173
+ }
174
+
175
+ /* Decisions (Accordion) */
176
+ .decisions-list {
177
+ display: flex;
178
+ flex-direction: column;
179
+ gap: 0.5rem;
180
+ }
181
+
182
+ .decision-item {
183
+ background: white;
184
+ border-radius: 8px;
185
+ overflow: hidden;
186
+ }
187
+
188
+ .decision-item summary {
189
+ padding: 1rem 1.5rem;
190
+ cursor: pointer;
191
+ display: flex;
192
+ align-items: center;
193
+ gap: 1rem;
194
+ list-style: none;
195
+ user-select: none;
196
+ }
197
+
198
+ .decision-item summary::-webkit-details-marker {
199
+ display: none;
200
+ }
201
+
202
+ .decision-item summary:hover {
203
+ background: #f9f9f9;
204
+ }
205
+
206
+ .decision-id {
207
+ font-family: monospace;
208
+ background: #e8e8e8;
209
+ padding: 0.25rem 0.5rem;
210
+ border-radius: 4px;
211
+ font-size: 0.875rem;
212
+ }
213
+
214
+ .decision-title {
215
+ flex: 1;
216
+ font-weight: 500;
217
+ }
218
+
219
+ .decision-status {
220
+ font-size: 0.75rem;
221
+ padding: 0.25rem 0.5rem;
222
+ border-radius: 4px;
223
+ text-transform: uppercase;
224
+ }
225
+
226
+ .status-active {
227
+ background: #d4edda;
228
+ color: #155724;
229
+ }
230
+
231
+ .status-superseded {
232
+ background: #fff3cd;
233
+ color: #856404;
234
+ }
235
+
236
+ .status-revoked {
237
+ background: #f8d7da;
238
+ color: #721c24;
239
+ }
240
+
241
+ .decision-date {
242
+ font-size: 0.875rem;
243
+ color: #666;
244
+ }
245
+
246
+ .decision-content {
247
+ padding: 1rem 1.5rem;
248
+ border-top: 1px solid #eee;
249
+ background: #fafafa;
250
+ }
251
+
252
+ .decision-content p {
253
+ margin-bottom: 0.75rem;
254
+ line-height: 1.6;
255
+ }
256
+
257
+ .decision-content ul {
258
+ margin-left: 1.5rem;
259
+ margin-bottom: 0.75rem;
260
+ }
261
+
262
+ .decision-content li {
263
+ margin-bottom: 0.25rem;
264
+ }
265
+
266
+ /* Expand indicator */
267
+ .decision-item summary::after {
268
+ content: '\25b6';
269
+ font-size: 0.75rem;
270
+ transition: transform 0.2s;
271
+ }
272
+
273
+ .decision-item[open] summary::after {
274
+ transform: rotate(90deg);
275
+ }
276
+
277
+ /* Context */
278
+ .context-content {
279
+ background: white;
280
+ padding: 1.5rem;
281
+ border-radius: 8px;
282
+ }
283
+
284
+ .context-section {
285
+ margin-bottom: 2rem;
286
+ }
287
+
288
+ .context-section h3 {
289
+ margin-bottom: 1rem;
290
+ padding-bottom: 0.5rem;
291
+ border-bottom: 2px solid #3498db;
292
+ }
293
+
294
+ .resolved-question {
295
+ margin-bottom: 1.5rem;
296
+ padding: 1rem;
297
+ background: #f9f9f9;
298
+ border-radius: 4px;
299
+ }
300
+
301
+ .resolved-question h4 {
302
+ margin-bottom: 0.5rem;
303
+ color: #2c3e50;
304
+ }
305
+
306
+ /* Plans */
307
+ .plans-content {
308
+ display: flex;
309
+ flex-direction: column;
310
+ gap: 1rem;
311
+ }
312
+
313
+ .phase-group {
314
+ background: white;
315
+ border-radius: 8px;
316
+ overflow: hidden;
317
+ }
318
+
319
+ .phase-header {
320
+ padding: 1rem 1.5rem;
321
+ background: #3498db;
322
+ color: white;
323
+ font-weight: 600;
324
+ }
325
+
326
+ .plan-item {
327
+ padding: 1rem 1.5rem;
328
+ border-bottom: 1px solid #eee;
329
+ }
330
+
331
+ .plan-item:last-child {
332
+ border-bottom: none;
333
+ }
334
+
335
+ .plan-title {
336
+ font-weight: 500;
337
+ margin-bottom: 0.5rem;
338
+ }
339
+
340
+ .plan-summary {
341
+ font-size: 0.875rem;
342
+ color: #666;
343
+ }
344
+
345
+ /* Wireframes */
346
+ .wireframes-content {
347
+ background: white;
348
+ padding: 1.5rem;
349
+ border-radius: 8px;
350
+ }
351
+
352
+ .wireframe-placeholder {
353
+ padding: 3rem;
354
+ text-align: center;
355
+ color: #999;
356
+ border: 2px dashed #ddd;
357
+ border-radius: 8px;
358
+ }
359
+
360
+ /* Diagrams */
361
+ .diagrams-content {
362
+ background: white;
363
+ padding: 1.5rem;
364
+ border-radius: 8px;
365
+ }
366
+
367
+ .diagram-container {
368
+ margin-bottom: 2rem;
369
+ }
370
+
371
+ .diagram-container h3 {
372
+ margin-bottom: 1rem;
373
+ }
374
+
375
+ .mermaid {
376
+ background: #fafafa;
377
+ padding: 1rem;
378
+ border-radius: 4px;
379
+ }
380
+
381
+ /* Phase Tabs (sub-navigation within sections) */
382
+ .phase-tabs {
383
+ display: flex;
384
+ gap: 0.5rem;
385
+ margin-bottom: 1.5rem;
386
+ border-bottom: 2px solid #eee;
387
+ padding-bottom: 0.5rem;
388
+ }
389
+
390
+ .phase-tab {
391
+ padding: 0.5rem 1rem;
392
+ background: #f5f5f5;
393
+ border: 1px solid #ddd;
394
+ border-radius: 4px 4px 0 0;
395
+ cursor: pointer;
396
+ font-size: 0.875rem;
397
+ color: #666;
398
+ transition: all 0.2s;
399
+ }
400
+
401
+ .phase-tab:hover {
402
+ background: #e8e8e8;
403
+ }
404
+
405
+ .phase-tab.active {
406
+ background: #3498db;
407
+ color: white;
408
+ border-color: #3498db;
409
+ }
410
+
411
+ .phase-tab.all-tab {
412
+ font-weight: 500;
413
+ }
414
+
415
+ /* Phase content visibility */
416
+ .phase-content {
417
+ display: none;
418
+ }
419
+
420
+ .phase-content.active {
421
+ display: block;
422
+ }
423
+
424
+ /* No content placeholders */
425
+ .no-content {
426
+ padding: 3rem;
427
+ text-align: center;
428
+ color: #999;
429
+ }
@@ -75,10 +75,12 @@
75
75
  {What the user should do next based on current state.}
76
76
 
77
77
  **Options:**
78
- - `/specd:discuss-feature {feature-name}` — Continue refining understanding
79
- - `/specd:research-feature {feature-name}` — Research implementation approach
80
- - `/specd:plan-feature {feature-name}` — Create executable plans (when ready)
81
- - `/specd:execute-plan {feature-name}` — Execute plans with progress tracking
78
+ - `/specd:feature:discuss {feature-name}` — Continue refining understanding
79
+ - `/specd:feature:research {feature-name}` — Research implementation approach
80
+ - `/specd:feature:plan {feature-name}` — Create roadmap with phase overview (when ready)
81
+ - `/specd:phase:prepare {feature-name} {N}` — Prepare a specific phase
82
+ - `/specd:phase:plan {feature-name} {N}` — Create detailed plans for a phase
83
+ - `/specd:phase:execute {feature-name}` — Execute plans with progress tracking
82
84
 
83
85
  ---
84
86