enhance_swarm 1.0.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 (64) hide show
  1. checksums.yaml +7 -0
  2. data/.enhance_swarm/agent_scripts/frontend_agent.md +39 -0
  3. data/.enhance_swarm/user_patterns.json +37 -0
  4. data/CHANGELOG.md +184 -0
  5. data/LICENSE +21 -0
  6. data/PRODUCTION_TEST_LOG.md +502 -0
  7. data/README.md +905 -0
  8. data/Rakefile +28 -0
  9. data/USAGE_EXAMPLES.md +477 -0
  10. data/examples/enhance_workflow.md +346 -0
  11. data/examples/rails_project.md +253 -0
  12. data/exe/enhance-swarm +30 -0
  13. data/lib/enhance_swarm/additional_commands.rb +299 -0
  14. data/lib/enhance_swarm/agent_communicator.rb +460 -0
  15. data/lib/enhance_swarm/agent_reviewer.rb +283 -0
  16. data/lib/enhance_swarm/agent_spawner.rb +462 -0
  17. data/lib/enhance_swarm/cleanup_manager.rb +245 -0
  18. data/lib/enhance_swarm/cli.rb +1592 -0
  19. data/lib/enhance_swarm/command_executor.rb +78 -0
  20. data/lib/enhance_swarm/configuration.rb +324 -0
  21. data/lib/enhance_swarm/control_agent.rb +307 -0
  22. data/lib/enhance_swarm/dependency_validator.rb +195 -0
  23. data/lib/enhance_swarm/error_recovery.rb +785 -0
  24. data/lib/enhance_swarm/generator.rb +194 -0
  25. data/lib/enhance_swarm/interrupt_handler.rb +512 -0
  26. data/lib/enhance_swarm/logger.rb +106 -0
  27. data/lib/enhance_swarm/mcp_integration.rb +85 -0
  28. data/lib/enhance_swarm/monitor.rb +28 -0
  29. data/lib/enhance_swarm/notification_manager.rb +444 -0
  30. data/lib/enhance_swarm/orchestrator.rb +313 -0
  31. data/lib/enhance_swarm/output_streamer.rb +281 -0
  32. data/lib/enhance_swarm/process_monitor.rb +266 -0
  33. data/lib/enhance_swarm/progress_tracker.rb +215 -0
  34. data/lib/enhance_swarm/project_analyzer.rb +612 -0
  35. data/lib/enhance_swarm/resource_manager.rb +177 -0
  36. data/lib/enhance_swarm/retry_handler.rb +40 -0
  37. data/lib/enhance_swarm/session_manager.rb +247 -0
  38. data/lib/enhance_swarm/signal_handler.rb +95 -0
  39. data/lib/enhance_swarm/smart_defaults.rb +708 -0
  40. data/lib/enhance_swarm/task_integration.rb +150 -0
  41. data/lib/enhance_swarm/task_manager.rb +174 -0
  42. data/lib/enhance_swarm/version.rb +5 -0
  43. data/lib/enhance_swarm/visual_dashboard.rb +555 -0
  44. data/lib/enhance_swarm/web_ui.rb +211 -0
  45. data/lib/enhance_swarm.rb +69 -0
  46. data/setup.sh +86 -0
  47. data/sig/enhance_swarm.rbs +4 -0
  48. data/templates/claude/CLAUDE.md +160 -0
  49. data/templates/claude/MCP.md +117 -0
  50. data/templates/claude/PERSONAS.md +114 -0
  51. data/templates/claude/RULES.md +221 -0
  52. data/test_builtin_functionality.rb +121 -0
  53. data/test_core_components.rb +156 -0
  54. data/test_real_claude_integration.rb +285 -0
  55. data/test_security.rb +150 -0
  56. data/test_smart_defaults.rb +155 -0
  57. data/test_task_integration.rb +173 -0
  58. data/test_web_ui.rb +245 -0
  59. data/web/assets/css/main.css +645 -0
  60. data/web/assets/js/kanban.js +499 -0
  61. data/web/assets/js/main.js +525 -0
  62. data/web/templates/dashboard.html.erb +226 -0
  63. data/web/templates/kanban.html.erb +193 -0
  64. metadata +293 -0
@@ -0,0 +1,645 @@
1
+ /* EnhanceSwarm Web UI Styles */
2
+
3
+ :root {
4
+ --primary-color: #3498db;
5
+ --secondary-color: #2c3e50;
6
+ --success-color: #27ae60;
7
+ --warning-color: #f39c12;
8
+ --danger-color: #e74c3c;
9
+ --light-bg: #f8f9fa;
10
+ --card-bg: #ffffff;
11
+ --border-color: #e0e6ed;
12
+ --text-primary: #2c3e50;
13
+ --text-secondary: #7f8c8d;
14
+ --shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
15
+ --radius: 8px;
16
+ --font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
17
+ }
18
+
19
+ * {
20
+ margin: 0;
21
+ padding: 0;
22
+ box-sizing: border-box;
23
+ }
24
+
25
+ body {
26
+ font-family: var(--font-family);
27
+ background-color: var(--light-bg);
28
+ color: var(--text-primary);
29
+ line-height: 1.6;
30
+ }
31
+
32
+ /* Navigation */
33
+ .navbar {
34
+ background: var(--card-bg);
35
+ border-bottom: 1px solid var(--border-color);
36
+ padding: 1rem 2rem;
37
+ display: flex;
38
+ justify-content: space-between;
39
+ align-items: center;
40
+ position: sticky;
41
+ top: 0;
42
+ z-index: 100;
43
+ box-shadow: var(--shadow);
44
+ }
45
+
46
+ .nav-brand {
47
+ display: flex;
48
+ align-items: center;
49
+ font-size: 1.25rem;
50
+ font-weight: bold;
51
+ color: var(--primary-color);
52
+ }
53
+
54
+ .nav-brand i {
55
+ margin-right: 0.5rem;
56
+ }
57
+
58
+ .nav-links {
59
+ display: flex;
60
+ gap: 1rem;
61
+ }
62
+
63
+ .nav-link {
64
+ display: flex;
65
+ align-items: center;
66
+ padding: 0.5rem 1rem;
67
+ text-decoration: none;
68
+ color: var(--text-secondary);
69
+ border-radius: var(--radius);
70
+ transition: all 0.2s ease;
71
+ }
72
+
73
+ .nav-link:hover {
74
+ background-color: var(--light-bg);
75
+ color: var(--primary-color);
76
+ }
77
+
78
+ .nav-link.active {
79
+ background-color: var(--primary-color);
80
+ color: white;
81
+ }
82
+
83
+ .nav-link i {
84
+ margin-right: 0.5rem;
85
+ }
86
+
87
+ /* Main Content */
88
+ .main-content {
89
+ padding: 2rem;
90
+ max-width: 1400px;
91
+ margin: 0 auto;
92
+ }
93
+
94
+ /* Dashboard */
95
+ .dashboard-header {
96
+ display: flex;
97
+ justify-content: space-between;
98
+ align-items: center;
99
+ margin-bottom: 2rem;
100
+ }
101
+
102
+ .dashboard-header h1 {
103
+ color: var(--secondary-color);
104
+ display: flex;
105
+ align-items: center;
106
+ }
107
+
108
+ .dashboard-header h1 i {
109
+ margin-right: 0.5rem;
110
+ }
111
+
112
+ .dashboard-actions {
113
+ display: flex;
114
+ gap: 1rem;
115
+ }
116
+
117
+ .dashboard-grid {
118
+ display: grid;
119
+ grid-template-columns: repeat(auto-fit, minmax(400px, 1fr));
120
+ gap: 1.5rem;
121
+ }
122
+
123
+ /* Cards */
124
+ .card {
125
+ background: var(--card-bg);
126
+ border-radius: var(--radius);
127
+ box-shadow: var(--shadow);
128
+ overflow: hidden;
129
+ }
130
+
131
+ .card-header {
132
+ padding: 1.5rem;
133
+ border-bottom: 1px solid var(--border-color);
134
+ display: flex;
135
+ justify-content: space-between;
136
+ align-items: center;
137
+ }
138
+
139
+ .card-header h3 {
140
+ color: var(--secondary-color);
141
+ display: flex;
142
+ align-items: center;
143
+ }
144
+
145
+ .card-header h3 i {
146
+ margin-right: 0.5rem;
147
+ }
148
+
149
+ .card-body {
150
+ padding: 1.5rem;
151
+ }
152
+
153
+ /* Status Grid */
154
+ .status-grid {
155
+ display: grid;
156
+ grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
157
+ gap: 1rem;
158
+ }
159
+
160
+ .status-item {
161
+ display: flex;
162
+ align-items: center;
163
+ padding: 1rem;
164
+ background: var(--light-bg);
165
+ border-radius: var(--radius);
166
+ }
167
+
168
+ .status-icon {
169
+ margin-right: 0.75rem;
170
+ font-size: 1.5rem;
171
+ }
172
+
173
+ .status-icon.active {
174
+ color: var(--success-color);
175
+ }
176
+
177
+ .status-icon.inactive {
178
+ color: var(--text-secondary);
179
+ }
180
+
181
+ .status-info {
182
+ display: flex;
183
+ flex-direction: column;
184
+ }
185
+
186
+ .status-label {
187
+ font-size: 0.875rem;
188
+ color: var(--text-secondary);
189
+ }
190
+
191
+ .status-value {
192
+ font-size: 1.25rem;
193
+ font-weight: bold;
194
+ color: var(--text-primary);
195
+ }
196
+
197
+ /* Quick Actions */
198
+ .quick-actions {
199
+ display: grid;
200
+ grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
201
+ gap: 1rem;
202
+ }
203
+
204
+ .quick-action-btn {
205
+ display: flex;
206
+ flex-direction: column;
207
+ align-items: center;
208
+ padding: 1.5rem;
209
+ background: var(--light-bg);
210
+ border: 1px solid var(--border-color);
211
+ border-radius: var(--radius);
212
+ cursor: pointer;
213
+ transition: all 0.2s ease;
214
+ }
215
+
216
+ .quick-action-btn:hover {
217
+ background: var(--primary-color);
218
+ color: white;
219
+ transform: translateY(-2px);
220
+ }
221
+
222
+ .quick-action-btn i {
223
+ font-size: 2rem;
224
+ margin-bottom: 0.5rem;
225
+ }
226
+
227
+ /* Buttons */
228
+ .btn {
229
+ display: inline-flex;
230
+ align-items: center;
231
+ padding: 0.5rem 1rem;
232
+ border: none;
233
+ border-radius: var(--radius);
234
+ cursor: pointer;
235
+ text-decoration: none;
236
+ font-family: inherit;
237
+ font-size: 0.875rem;
238
+ font-weight: 500;
239
+ transition: all 0.2s ease;
240
+ }
241
+
242
+ .btn i {
243
+ margin-right: 0.5rem;
244
+ }
245
+
246
+ .btn-primary {
247
+ background: var(--primary-color);
248
+ color: white;
249
+ }
250
+
251
+ .btn-primary:hover {
252
+ background: #2980b9;
253
+ }
254
+
255
+ .btn-secondary {
256
+ background: var(--text-secondary);
257
+ color: white;
258
+ }
259
+
260
+ .btn-secondary:hover {
261
+ background: #6c757d;
262
+ }
263
+
264
+ .btn-outline {
265
+ background: transparent;
266
+ color: var(--primary-color);
267
+ border: 1px solid var(--primary-color);
268
+ }
269
+
270
+ .btn-outline:hover {
271
+ background: var(--primary-color);
272
+ color: white;
273
+ }
274
+
275
+ .btn-small {
276
+ padding: 0.25rem 0.5rem;
277
+ font-size: 0.75rem;
278
+ }
279
+
280
+ /* Loading */
281
+ .loading {
282
+ text-align: center;
283
+ color: var(--text-secondary);
284
+ padding: 2rem;
285
+ }
286
+
287
+ /* Kanban Board */
288
+ .kanban-container {
289
+ width: 100%;
290
+ max-width: none;
291
+ }
292
+
293
+ .kanban-header {
294
+ display: flex;
295
+ justify-content: space-between;
296
+ align-items: center;
297
+ margin-bottom: 2rem;
298
+ }
299
+
300
+ .kanban-actions {
301
+ display: flex;
302
+ gap: 1rem;
303
+ }
304
+
305
+ .kanban-stats {
306
+ display: flex;
307
+ gap: 2rem;
308
+ margin-bottom: 2rem;
309
+ padding: 1.5rem;
310
+ background: var(--card-bg);
311
+ border-radius: var(--radius);
312
+ box-shadow: var(--shadow);
313
+ }
314
+
315
+ .stat-item {
316
+ text-align: center;
317
+ }
318
+
319
+ .stat-value {
320
+ display: block;
321
+ font-size: 2rem;
322
+ font-weight: bold;
323
+ color: var(--primary-color);
324
+ }
325
+
326
+ .stat-label {
327
+ font-size: 0.875rem;
328
+ color: var(--text-secondary);
329
+ }
330
+
331
+ .kanban-board {
332
+ display: flex;
333
+ gap: 1.5rem;
334
+ overflow-x: auto;
335
+ padding-bottom: 1rem;
336
+ min-height: 500px;
337
+ }
338
+
339
+ .kanban-column {
340
+ min-width: 300px;
341
+ background: var(--card-bg);
342
+ border-radius: var(--radius);
343
+ box-shadow: var(--shadow);
344
+ display: flex;
345
+ flex-direction: column;
346
+ }
347
+
348
+ .kanban-column-header {
349
+ padding: 1rem;
350
+ border-bottom: 1px solid var(--border-color);
351
+ display: flex;
352
+ justify-content: space-between;
353
+ align-items: center;
354
+ }
355
+
356
+ .kanban-column-title {
357
+ font-weight: bold;
358
+ color: var(--secondary-color);
359
+ }
360
+
361
+ .kanban-column-count {
362
+ background: var(--light-bg);
363
+ padding: 0.25rem 0.5rem;
364
+ border-radius: 12px;
365
+ font-size: 0.75rem;
366
+ color: var(--text-secondary);
367
+ }
368
+
369
+ .kanban-column-body {
370
+ flex: 1;
371
+ padding: 1rem;
372
+ min-height: 400px;
373
+ }
374
+
375
+ .task-card {
376
+ background: var(--light-bg);
377
+ border-radius: var(--radius);
378
+ padding: 1rem;
379
+ margin-bottom: 1rem;
380
+ cursor: pointer;
381
+ border-left: 4px solid var(--primary-color);
382
+ transition: all 0.2s ease;
383
+ }
384
+
385
+ .task-card:hover {
386
+ transform: translateY(-2px);
387
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
388
+ }
389
+
390
+ .task-title {
391
+ font-weight: bold;
392
+ margin-bottom: 0.5rem;
393
+ color: var(--text-primary);
394
+ }
395
+
396
+ .task-description {
397
+ font-size: 0.875rem;
398
+ color: var(--text-secondary);
399
+ margin-bottom: 0.75rem;
400
+ }
401
+
402
+ .task-meta {
403
+ display: flex;
404
+ justify-content: space-between;
405
+ align-items: center;
406
+ font-size: 0.75rem;
407
+ }
408
+
409
+ .task-priority {
410
+ padding: 0.25rem 0.5rem;
411
+ border-radius: 12px;
412
+ font-weight: bold;
413
+ }
414
+
415
+ .task-priority.high {
416
+ background: var(--danger-color);
417
+ color: white;
418
+ }
419
+
420
+ .task-priority.medium {
421
+ background: var(--warning-color);
422
+ color: white;
423
+ }
424
+
425
+ .task-priority.low {
426
+ background: var(--success-color);
427
+ color: white;
428
+ }
429
+
430
+ .loading-kanban {
431
+ display: flex;
432
+ flex-direction: column;
433
+ align-items: center;
434
+ justify-content: center;
435
+ height: 300px;
436
+ color: var(--text-secondary);
437
+ }
438
+
439
+ .loading-kanban i {
440
+ font-size: 3rem;
441
+ margin-bottom: 1rem;
442
+ }
443
+
444
+ /* Modals */
445
+ .modal {
446
+ display: none;
447
+ position: fixed;
448
+ top: 0;
449
+ left: 0;
450
+ width: 100%;
451
+ height: 100%;
452
+ background: rgba(0, 0, 0, 0.5);
453
+ z-index: 1000;
454
+ animation: fadeIn 0.2s ease;
455
+ }
456
+
457
+ .modal.show {
458
+ display: flex;
459
+ align-items: center;
460
+ justify-content: center;
461
+ }
462
+
463
+ .modal-content {
464
+ background: var(--card-bg);
465
+ border-radius: var(--radius);
466
+ max-width: 500px;
467
+ width: 90%;
468
+ max-height: 90vh;
469
+ overflow-y: auto;
470
+ animation: slideIn 0.3s ease;
471
+ }
472
+
473
+ .modal-header {
474
+ padding: 1.5rem;
475
+ border-bottom: 1px solid var(--border-color);
476
+ display: flex;
477
+ justify-content: space-between;
478
+ align-items: center;
479
+ }
480
+
481
+ .modal-header h3 {
482
+ color: var(--secondary-color);
483
+ display: flex;
484
+ align-items: center;
485
+ }
486
+
487
+ .modal-header h3 i {
488
+ margin-right: 0.5rem;
489
+ }
490
+
491
+ .modal-close {
492
+ background: none;
493
+ border: none;
494
+ font-size: 1.5rem;
495
+ cursor: pointer;
496
+ color: var(--text-secondary);
497
+ }
498
+
499
+ .modal-close:hover {
500
+ color: var(--text-primary);
501
+ }
502
+
503
+ .modal-body {
504
+ padding: 1.5rem;
505
+ }
506
+
507
+ .modal-footer {
508
+ padding: 1.5rem;
509
+ border-top: 1px solid var(--border-color);
510
+ display: flex;
511
+ justify-content: flex-end;
512
+ gap: 1rem;
513
+ }
514
+
515
+ /* Forms */
516
+ .form-group {
517
+ margin-bottom: 1rem;
518
+ }
519
+
520
+ .form-row {
521
+ display: grid;
522
+ grid-template-columns: 1fr 1fr;
523
+ gap: 1rem;
524
+ }
525
+
526
+ .form-group label {
527
+ display: block;
528
+ margin-bottom: 0.5rem;
529
+ font-weight: 500;
530
+ color: var(--text-primary);
531
+ }
532
+
533
+ .form-group input,
534
+ .form-group textarea,
535
+ .form-group select {
536
+ width: 100%;
537
+ padding: 0.75rem;
538
+ border: 1px solid var(--border-color);
539
+ border-radius: var(--radius);
540
+ font-family: inherit;
541
+ font-size: 0.875rem;
542
+ }
543
+
544
+ .form-group input:focus,
545
+ .form-group textarea:focus,
546
+ .form-group select:focus {
547
+ outline: none;
548
+ border-color: var(--primary-color);
549
+ }
550
+
551
+ .checkbox-group {
552
+ display: grid;
553
+ grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
554
+ gap: 0.5rem;
555
+ }
556
+
557
+ .checkbox-label {
558
+ display: flex;
559
+ align-items: center;
560
+ cursor: pointer;
561
+ font-weight: normal;
562
+ }
563
+
564
+ .checkbox-label input[type="checkbox"] {
565
+ display: none;
566
+ }
567
+
568
+ .checkmark {
569
+ width: 20px;
570
+ height: 20px;
571
+ border: 2px solid var(--border-color);
572
+ border-radius: 4px;
573
+ margin-right: 0.5rem;
574
+ position: relative;
575
+ transition: all 0.2s ease;
576
+ }
577
+
578
+ .checkbox-label input[type="checkbox"]:checked + .checkmark {
579
+ background: var(--primary-color);
580
+ border-color: var(--primary-color);
581
+ }
582
+
583
+ .checkbox-label input[type="checkbox"]:checked + .checkmark::after {
584
+ content: '✓';
585
+ position: absolute;
586
+ top: 50%;
587
+ left: 50%;
588
+ transform: translate(-50%, -50%);
589
+ color: white;
590
+ font-weight: bold;
591
+ }
592
+
593
+ /* Animations */
594
+ @keyframes fadeIn {
595
+ from { opacity: 0; }
596
+ to { opacity: 1; }
597
+ }
598
+
599
+ @keyframes slideIn {
600
+ from {
601
+ opacity: 0;
602
+ transform: scale(0.9) translateY(-20px);
603
+ }
604
+ to {
605
+ opacity: 1;
606
+ transform: scale(1) translateY(0);
607
+ }
608
+ }
609
+
610
+ /* Responsive */
611
+ @media (max-width: 768px) {
612
+ .main-content {
613
+ padding: 1rem;
614
+ }
615
+
616
+ .navbar {
617
+ padding: 1rem;
618
+ }
619
+
620
+ .nav-links {
621
+ display: none;
622
+ }
623
+
624
+ .dashboard-grid {
625
+ grid-template-columns: 1fr;
626
+ }
627
+
628
+ .kanban-board {
629
+ flex-direction: column;
630
+ }
631
+
632
+ .kanban-column {
633
+ min-width: auto;
634
+ }
635
+ }
636
+
637
+ /* Additional utility classes */
638
+ .text-center { text-align: center; }
639
+ .text-right { text-align: right; }
640
+ .mt-1 { margin-top: 0.5rem; }
641
+ .mt-2 { margin-top: 1rem; }
642
+ .mb-1 { margin-bottom: 0.5rem; }
643
+ .mb-2 { margin-bottom: 1rem; }
644
+ .p-1 { padding: 0.5rem; }
645
+ .p-2 { padding: 1rem; }