specdacular 0.7.1 → 0.8.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 (63) hide show
  1. package/README.md +72 -74
  2. package/commands/specd/continue.md +59 -0
  3. package/commands/specd/new.md +65 -0
  4. package/commands/specd/status.md +1 -1
  5. package/commands/specd/toolbox.md +59 -0
  6. package/package.json +1 -1
  7. package/specdacular/HELP.md +19 -16
  8. package/specdacular/agents/feature-researcher.md +4 -4
  9. package/specdacular/references/load-context.md +83 -0
  10. package/specdacular/references/record-decision.md +61 -0
  11. package/specdacular/references/select-feature.md +20 -20
  12. package/specdacular/references/select-phase.md +3 -3
  13. package/specdacular/references/spawn-research-agents.md +180 -0
  14. package/specdacular/references/synthesize-research.md +127 -0
  15. package/specdacular/references/validate-task.md +64 -0
  16. package/specdacular/templates/{features → tasks}/CHANGELOG.md +2 -8
  17. package/specdacular/templates/{features → tasks}/CONTEXT.md +6 -17
  18. package/specdacular/templates/tasks/DECISIONS.md +46 -0
  19. package/specdacular/templates/{features → tasks}/FEATURE.md +3 -3
  20. package/specdacular/templates/tasks/PLAN.md +91 -0
  21. package/specdacular/templates/tasks/RESEARCH.md +121 -0
  22. package/specdacular/templates/{features → tasks}/ROADMAP.md +6 -43
  23. package/specdacular/templates/tasks/STATE.md +93 -0
  24. package/specdacular/templates/tasks/config.json +15 -0
  25. package/specdacular/workflows/continue.md +275 -0
  26. package/specdacular/workflows/discuss.md +184 -0
  27. package/specdacular/workflows/execute.md +174 -0
  28. package/specdacular/workflows/new.md +299 -0
  29. package/specdacular/workflows/orchestrator/new.md +265 -0
  30. package/specdacular/workflows/orchestrator/plan.md +169 -0
  31. package/specdacular/workflows/plan.md +201 -0
  32. package/specdacular/workflows/research.md +166 -0
  33. package/specdacular/workflows/review.md +289 -0
  34. package/specdacular/workflows/status.md +17 -17
  35. package/commands/specd/blueprint.md +0 -64
  36. package/commands/specd/feature/continue.md +0 -84
  37. package/commands/specd/feature/new.md +0 -67
  38. package/commands/specd/feature/toolbox.md +0 -49
  39. package/specdacular/templates/blueprint/index.html +0 -110
  40. package/specdacular/templates/blueprint/scripts.js +0 -71
  41. package/specdacular/templates/blueprint/styles.css +0 -429
  42. package/specdacular/templates/features/DECISIONS.md +0 -109
  43. package/specdacular/templates/features/DEPENDENCIES.md +0 -47
  44. package/specdacular/templates/features/PLAN.md +0 -180
  45. package/specdacular/templates/features/RESEARCH.md +0 -183
  46. package/specdacular/templates/features/STATE.md +0 -110
  47. package/specdacular/templates/features/config.json +0 -20
  48. package/specdacular/workflows/blueprint-diagrams.md +0 -273
  49. package/specdacular/workflows/blueprint-wireframes.md +0 -312
  50. package/specdacular/workflows/blueprint.md +0 -372
  51. package/specdacular/workflows/continue-feature.md +0 -621
  52. package/specdacular/workflows/discuss-feature.md +0 -382
  53. package/specdacular/workflows/execute-plan.md +0 -636
  54. package/specdacular/workflows/insert-phase.md +0 -246
  55. package/specdacular/workflows/new-feature.md +0 -760
  56. package/specdacular/workflows/plan-feature.md +0 -691
  57. package/specdacular/workflows/plan-phase.md +0 -355
  58. package/specdacular/workflows/prepare-phase.md +0 -745
  59. package/specdacular/workflows/renumber-phases.md +0 -273
  60. package/specdacular/workflows/research-feature.md +0 -252
  61. package/specdacular/workflows/research-phase.md +0 -576
  62. package/specdacular/workflows/review-feature.md +0 -316
  63. package/specdacular/workflows/review-phase.md +0 -545
@@ -1,110 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="UTF-8">
5
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
7
- <title>{feature-name} Blueprint</title>
8
- <style>
9
- {styles}
10
- </style>
11
- </head>
12
- <body>
13
- <div class="blueprint-container">
14
- <nav class="blueprint-sidebar">
15
- <div class="sidebar-header">
16
- <h2>{feature-name}</h2>
17
- <span class="subtitle">Blueprint</span>
18
- </div>
19
- <ul class="nav-tabs">
20
- <li><a href="#overview" class="tab-link active" data-tab="overview">Overview</a></li>
21
- <li><a href="#decisions" class="tab-link" data-tab="decisions">Decisions</a></li>
22
- <li><a href="#context" class="tab-link" data-tab="context">Context</a></li>
23
- <li><a href="#plans" class="tab-link" data-tab="plans">Plans</a></li>
24
- <li><a href="#wireframes" class="tab-link {wireframes-disabled}" data-tab="wireframes">Wireframes</a></li>
25
- <li><a href="#diagrams" class="tab-link {diagrams-disabled}" data-tab="diagrams">Diagrams</a></li>
26
- </ul>
27
- <div class="sidebar-footer">
28
- <span class="generated">Generated: {date}</span>
29
- </div>
30
- </nav>
31
-
32
- <main class="blueprint-content">
33
- <section id="overview" class="tab-content active">
34
- <h1>Overview</h1>
35
- <div class="overview-description">
36
- {feature-description}
37
- </div>
38
- <div class="overview-stats">
39
- <div class="stat">
40
- <span class="stat-value">{decisions-count}</span>
41
- <span class="stat-label">Decisions</span>
42
- </div>
43
- <div class="stat">
44
- <span class="stat-value">{sessions-count}</span>
45
- <span class="stat-label">Discussion Sessions</span>
46
- </div>
47
- <div class="stat">
48
- <span class="stat-value">{plans-count}</span>
49
- <span class="stat-label">Plans</span>
50
- </div>
51
- </div>
52
- <div class="overview-timeline">
53
- <h2>Activity Timeline</h2>
54
- {timeline-content}
55
- </div>
56
- </section>
57
-
58
- <section id="decisions" class="tab-content">
59
- <h1>Decisions</h1>
60
- <p class="section-intro">Click any decision to expand details.</p>
61
- <div class="phase-tabs">
62
- {decisions-phase-tabs}
63
- </div>
64
- <div class="decisions-list">
65
- {decisions-content}
66
- </div>
67
- </section>
68
-
69
- <section id="context" class="tab-content">
70
- <h1>Discussion Context</h1>
71
- <div class="phase-tabs">
72
- {context-phase-tabs}
73
- </div>
74
- <div class="context-content">
75
- {context-content}
76
- </div>
77
- </section>
78
-
79
- <section id="plans" class="tab-content">
80
- <h1>Plans</h1>
81
- <div class="phase-tabs">
82
- {plans-phase-tabs}
83
- </div>
84
- <div class="plans-content">
85
- {plans-content}
86
- </div>
87
- </section>
88
-
89
- <section id="wireframes" class="tab-content">
90
- <h1>Wireframes</h1>
91
- <div class="wireframes-content">
92
- {wireframes-content}
93
- </div>
94
- </section>
95
-
96
- <section id="diagrams" class="tab-content">
97
- <h1>Diagrams</h1>
98
- <div class="diagrams-content">
99
- {diagrams-content}
100
- </div>
101
- </section>
102
- </main>
103
- </div>
104
-
105
- <script src="https://cdn.jsdelivr.net/npm/mermaid@10.6.1/dist/mermaid.min.js"></script>
106
- <script>
107
- {scripts}
108
- </script>
109
- </body>
110
- </html>
@@ -1,71 +0,0 @@
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
- });
@@ -1,429 +0,0 @@
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
- }
@@ -1,109 +0,0 @@
1
- # Decisions: {feature-name}
2
-
3
- **Feature:** {feature-name}
4
- **Created:** {YYYY-MM-DD}
5
- **Last Updated:** {YYYY-MM-DD}
6
-
7
- ---
8
-
9
- ## Active Decisions
10
-
11
- {Decisions currently in effect. These guide implementation.}
12
-
13
- ### DEC-001: {Decision Title}
14
-
15
- **Date:** {YYYY-MM-DD}
16
- **Status:** Active
17
- **Context:** {What situation required this decision}
18
- **Decision:** {What was decided}
19
- **Rationale:**
20
- - {Reason 1}
21
- - {Reason 2}
22
- - {Reason 3}
23
- **Implications:**
24
- - {What this means for implementation}
25
- - {Files or patterns affected}
26
- **References:**
27
- - `@{path/to/relevant/code}` (if applicable)
28
- - {Link to docs or external resource} (if applicable)
29
-
30
- ---
31
-
32
- ### DEC-002: {Decision Title}
33
-
34
- **Date:** {YYYY-MM-DD}
35
- **Status:** Active
36
- **Context:** {What situation required this decision}
37
- **Decision:** {What was decided}
38
- **Rationale:**
39
- - {Reason}
40
- **Implications:**
41
- - {What this means}
42
- **References:**
43
- - {References}
44
-
45
- ---
46
-
47
- ## Superseded Decisions
48
-
49
- {Decisions that were replaced by newer decisions. Kept for history.}
50
-
51
- ### DEC-000: {Old Decision Title}
52
-
53
- **Date:** {YYYY-MM-DD}
54
- **Status:** Superseded by DEC-XXX
55
- **Original Decision:** {What was originally decided}
56
- **Why Changed:** {What new information or context led to change}
57
-
58
- ---
59
-
60
- ## Revoked Decisions
61
-
62
- {Decisions that were explicitly cancelled without replacement.}
63
-
64
- ---
65
-
66
- ## Decision Log
67
-
68
- | ID | Date | Title | Status |
69
- |----|------|-------|--------|
70
- | DEC-001 | {date} | {title} | Active |
71
- | DEC-002 | {date} | {title} | Active |
72
-
73
- ---
74
-
75
- ## Decision Template
76
-
77
- Use this format when adding new decisions:
78
-
79
- ```markdown
80
- ### DEC-XXX: {Title}
81
-
82
- **Date:** YYYY-MM-DD
83
- **Status:** Active | Superseded | Revoked
84
- **Context:** {What situation required a decision}
85
- **Decision:** {What was decided}
86
- **Rationale:**
87
- - {Why - the reasoning}
88
- **Implications:**
89
- - {What this means for implementation}
90
- **References:**
91
- - {Code paths, docs, etc.}
92
- ```
93
-
94
- ---
95
-
96
- ## Guidelines
97
-
98
- **When to create a decision:**
99
- - Technology or library choice
100
- - Architecture pattern choice
101
- - Scope inclusion/exclusion
102
- - Approach when multiple valid options exist
103
- - Constraints discovered during discussion/research
104
-
105
- **Decision ID format:** DEC-{NNN} (three-digit, zero-padded)
106
-
107
- **Status transitions:**
108
- - Active → Superseded (when replaced by new decision)
109
- - Active → Revoked (when cancelled without replacement)