enhance_swarm 2.0.0 → 2.1.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 (106) hide show
  1. checksums.yaml +4 -4
  2. data/.claude/CLAUDE.md +164 -0
  3. data/.claude/MCP.md +117 -0
  4. data/.claude/PERSONAS.md +114 -0
  5. data/.claude/RULES.md +221 -0
  6. data/.enhance_swarm/logs/general_output.log +0 -404
  7. data/.enhance_swarm.yml +33 -0
  8. data/CHANGELOG.md +71 -0
  9. data/PRODUCTION_INSTALL_TEST.md +117 -0
  10. data/README.md +129 -3
  11. data/lib/enhance_swarm/agent_spawner.rb +218 -12
  12. data/lib/enhance_swarm/cli.rb +130 -1
  13. data/lib/enhance_swarm/task_coordinator.rb +363 -86
  14. data/lib/enhance_swarm/version.rb +1 -1
  15. metadata +14 -97
  16. data/PRODUCTION_TEST_LOG.md +0 -502
  17. data/debug_agent_spawner.rb +0 -99
  18. data/debug_cli_spawn.rb +0 -95
  19. data/debug_fixes.rb +0 -209
  20. data/debug_script_execution.rb +0 -124
  21. data/debug_session_issue.rb +0 -87
  22. data/debug_spawn.rb +0 -113
  23. data/debug_spawn_step_by_step.rb +0 -190
  24. data/debug_worktree.rb +0 -77
  25. data/enhance_swarm-0.1.1.gem +0 -0
  26. data/enhance_swarm-1.0.0.gem +0 -0
  27. data/final_validation_test.rb +0 -199
  28. data/setup.sh +0 -86
  29. data/test_blog_app/.enhance_swarm/archives/session_1751187575_e119ea73_20250629_105935.json +0 -16
  30. data/test_blog_app/.enhance_swarm/archives/session_1751187637_7fda97dd_20250629_110037.json +0 -32
  31. data/test_blog_app/.enhance_swarm/archives/session_1751190527_4c99147e_20250629_114847.json +0 -32
  32. data/test_blog_app/.enhance_swarm/archives/session_1751190541_8dc83406_20250629_114901.json +0 -16
  33. data/test_blog_app/.ruby-version +0 -1
  34. data/test_blog_app/Gemfile +0 -18
  35. data/test_blog_app/Gemfile.lock +0 -206
  36. data/test_blog_app/README.md +0 -24
  37. data/test_blog_app/Rakefile +0 -6
  38. data/test_blog_app/app/assets/images/.keep +0 -0
  39. data/test_blog_app/app/assets/stylesheets/application.css +0 -10
  40. data/test_blog_app/app/controllers/application_controller.rb +0 -4
  41. data/test_blog_app/app/controllers/concerns/.keep +0 -0
  42. data/test_blog_app/app/helpers/application_helper.rb +0 -2
  43. data/test_blog_app/app/models/application_record.rb +0 -3
  44. data/test_blog_app/app/models/concerns/.keep +0 -0
  45. data/test_blog_app/app/views/layouts/application.html.erb +0 -27
  46. data/test_blog_app/app/views/pwa/manifest.json.erb +0 -22
  47. data/test_blog_app/app/views/pwa/service-worker.js +0 -26
  48. data/test_blog_app/bin/dev +0 -2
  49. data/test_blog_app/bin/rails +0 -4
  50. data/test_blog_app/bin/rake +0 -4
  51. data/test_blog_app/bin/setup +0 -34
  52. data/test_blog_app/config/application.rb +0 -42
  53. data/test_blog_app/config/boot.rb +0 -3
  54. data/test_blog_app/config/credentials.yml.enc +0 -1
  55. data/test_blog_app/config/database.yml +0 -32
  56. data/test_blog_app/config/environment.rb +0 -5
  57. data/test_blog_app/config/environments/development.rb +0 -51
  58. data/test_blog_app/config/environments/production.rb +0 -67
  59. data/test_blog_app/config/environments/test.rb +0 -42
  60. data/test_blog_app/config/initializers/assets.rb +0 -7
  61. data/test_blog_app/config/initializers/content_security_policy.rb +0 -25
  62. data/test_blog_app/config/initializers/filter_parameter_logging.rb +0 -8
  63. data/test_blog_app/config/initializers/inflections.rb +0 -16
  64. data/test_blog_app/config/locales/en.yml +0 -31
  65. data/test_blog_app/config/master.key +0 -1
  66. data/test_blog_app/config/puma.rb +0 -38
  67. data/test_blog_app/config/routes.rb +0 -14
  68. data/test_blog_app/config.ru +0 -6
  69. data/test_blog_app/db/seeds.rb +0 -9
  70. data/test_blog_app/lib/tasks/.keep +0 -0
  71. data/test_blog_app/log/.keep +0 -0
  72. data/test_blog_app/public/400.html +0 -114
  73. data/test_blog_app/public/404.html +0 -114
  74. data/test_blog_app/public/406-unsupported-browser.html +0 -114
  75. data/test_blog_app/public/422.html +0 -114
  76. data/test_blog_app/public/500.html +0 -114
  77. data/test_blog_app/public/icon.png +0 -0
  78. data/test_blog_app/public/icon.svg +0 -3
  79. data/test_blog_app/public/robots.txt +0 -1
  80. data/test_blog_app/script/.keep +0 -0
  81. data/test_blog_app/storage/.keep +0 -0
  82. data/test_blog_app/test/controllers/.keep +0 -0
  83. data/test_blog_app/test/fixtures/files/.keep +0 -0
  84. data/test_blog_app/test/helpers/.keep +0 -0
  85. data/test_blog_app/test/integration/.keep +0 -0
  86. data/test_blog_app/test/models/.keep +0 -0
  87. data/test_blog_app/test/test_helper.rb +0 -15
  88. data/test_blog_app/test_enhance_swarm_e2e.rb +0 -244
  89. data/test_blog_app/test_realistic_workflow.rb +0 -292
  90. data/test_blog_app/tmp/.keep +0 -0
  91. data/test_blog_app/tmp/pids/.keep +0 -0
  92. data/test_blog_app/tmp/storage/.keep +0 -0
  93. data/test_blog_app/vendor/.keep +0 -0
  94. data/test_builtin_functionality.rb +0 -121
  95. data/test_complete_system.rb +0 -267
  96. data/test_core_components.rb +0 -156
  97. data/test_real_claude_integration.rb +0 -285
  98. data/test_security.rb +0 -150
  99. data/test_smart_defaults.rb +0 -155
  100. data/test_task_integration.rb +0 -173
  101. data/test_web_ui.rb +0 -245
  102. data/web/assets/css/main.css +0 -645
  103. data/web/assets/js/kanban.js +0 -499
  104. data/web/assets/js/main.js +0 -525
  105. data/web/templates/dashboard.html.erb +0 -226
  106. data/web/templates/kanban.html.erb +0 -193
@@ -1,645 +0,0 @@
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; }