opencastle 0.27.3 → 0.29.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 (130) hide show
  1. package/README.md +12 -3
  2. package/bin/cli.mjs +13 -5
  3. package/dist/cli/convoy/engine.d.ts.map +1 -1
  4. package/dist/cli/convoy/engine.js +2 -11
  5. package/dist/cli/convoy/engine.js.map +1 -1
  6. package/dist/cli/convoy/engine.test.js +2 -1
  7. package/dist/cli/convoy/engine.test.js.map +1 -1
  8. package/dist/cli/convoy/export.d.ts +1 -3
  9. package/dist/cli/convoy/export.d.ts.map +1 -1
  10. package/dist/cli/convoy/export.js +9 -88
  11. package/dist/cli/convoy/export.js.map +1 -1
  12. package/dist/cli/convoy/export.test.js +7 -186
  13. package/dist/cli/convoy/export.test.js.map +1 -1
  14. package/dist/cli/convoy/issues.js +3 -3
  15. package/dist/cli/convoy/issues.js.map +1 -1
  16. package/dist/cli/convoy/issues.test.js +4 -3
  17. package/dist/cli/convoy/issues.test.js.map +1 -1
  18. package/dist/cli/convoy/pipeline.d.ts.map +1 -1
  19. package/dist/cli/convoy/pipeline.js +0 -21
  20. package/dist/cli/convoy/pipeline.js.map +1 -1
  21. package/dist/cli/convoy/pipeline.test.js +0 -21
  22. package/dist/cli/convoy/pipeline.test.js.map +1 -1
  23. package/dist/cli/dashboard.d.ts.map +1 -1
  24. package/dist/cli/dashboard.js +32 -8
  25. package/dist/cli/dashboard.js.map +1 -1
  26. package/dist/cli/destroy.d.ts.map +1 -1
  27. package/dist/cli/destroy.js +13 -0
  28. package/dist/cli/destroy.js.map +1 -1
  29. package/dist/cli/dispute.d.ts +3 -0
  30. package/dist/cli/dispute.d.ts.map +1 -0
  31. package/dist/cli/dispute.js +25 -0
  32. package/dist/cli/dispute.js.map +1 -0
  33. package/dist/cli/doctor.d.ts +1 -1
  34. package/dist/cli/doctor.d.ts.map +1 -1
  35. package/dist/cli/doctor.js +14 -1
  36. package/dist/cli/doctor.js.map +1 -1
  37. package/dist/cli/eject.d.ts.map +1 -1
  38. package/dist/cli/eject.js +14 -0
  39. package/dist/cli/eject.js.map +1 -1
  40. package/dist/cli/init.d.ts.map +1 -1
  41. package/dist/cli/init.js +14 -0
  42. package/dist/cli/init.js.map +1 -1
  43. package/dist/cli/log.d.ts +0 -11
  44. package/dist/cli/log.d.ts.map +1 -1
  45. package/dist/cli/log.js +2 -114
  46. package/dist/cli/log.js.map +1 -1
  47. package/dist/cli/pipeline.d.ts +3 -0
  48. package/dist/cli/pipeline.d.ts.map +1 -0
  49. package/dist/cli/pipeline.js +321 -0
  50. package/dist/cli/pipeline.js.map +1 -0
  51. package/dist/cli/plan.d.ts +37 -0
  52. package/dist/cli/plan.d.ts.map +1 -1
  53. package/dist/cli/plan.js +321 -161
  54. package/dist/cli/plan.js.map +1 -1
  55. package/dist/cli/run.js +2 -2
  56. package/dist/cli/run.js.map +1 -1
  57. package/dist/cli/update.d.ts.map +1 -1
  58. package/dist/cli/update.js +16 -0
  59. package/dist/cli/update.js.map +1 -1
  60. package/dist/cli/validate.d.ts +3 -0
  61. package/dist/cli/validate.d.ts.map +1 -0
  62. package/dist/cli/validate.js +60 -0
  63. package/dist/cli/validate.js.map +1 -0
  64. package/dist/cli/watch.d.ts.map +1 -1
  65. package/dist/cli/watch.js +1 -3
  66. package/dist/cli/watch.js.map +1 -1
  67. package/package.json +5 -4
  68. package/src/cli/convoy/engine.test.ts +2 -1
  69. package/src/cli/convoy/engine.ts +2 -5
  70. package/src/cli/convoy/export.test.ts +7 -224
  71. package/src/cli/convoy/export.ts +10 -106
  72. package/src/cli/convoy/issues.test.ts +3 -2
  73. package/src/cli/convoy/issues.ts +3 -3
  74. package/src/cli/convoy/pipeline.test.ts +0 -25
  75. package/src/cli/convoy/pipeline.ts +0 -19
  76. package/src/cli/dashboard.ts +33 -8
  77. package/src/cli/destroy.ts +15 -0
  78. package/src/cli/dispute.ts +28 -0
  79. package/src/cli/doctor.ts +16 -1
  80. package/src/cli/eject.ts +16 -0
  81. package/src/cli/init.ts +16 -0
  82. package/src/cli/log.ts +2 -120
  83. package/src/cli/pipeline.ts +362 -0
  84. package/src/cli/plan.ts +357 -153
  85. package/src/cli/run.ts +2 -2
  86. package/src/cli/update.ts +18 -0
  87. package/src/cli/validate.ts +65 -0
  88. package/src/cli/watch.ts +1 -3
  89. package/src/dashboard/dist/_astro/index.Je1YjU_y.css +1 -0
  90. package/src/dashboard/dist/data/convoy-list.json +54 -9
  91. package/src/dashboard/dist/data/convoys/demo-api-v2.json +177 -0
  92. package/src/dashboard/dist/data/convoys/demo-auth-revamp.json +239 -0
  93. package/src/dashboard/dist/data/convoys/demo-dashboard-ui.json +328 -0
  94. package/src/dashboard/dist/data/convoys/demo-data-pipeline.json +187 -0
  95. package/src/dashboard/dist/data/convoys/demo-deploy-ci.json +153 -0
  96. package/src/dashboard/dist/data/convoys/demo-docs-update.json +154 -0
  97. package/src/dashboard/dist/data/convoys/demo-perf-opt.json +227 -0
  98. package/src/dashboard/dist/data/events.ndjson +115 -0
  99. package/src/dashboard/dist/data/overall-stats.json +56 -13
  100. package/src/dashboard/dist/data/pipelines.ndjson +5285 -0
  101. package/src/dashboard/dist/index.html +165 -1392
  102. package/src/dashboard/node_modules/.vite/deps/_metadata.json +6 -6
  103. package/src/dashboard/public/data/convoy-list.json +54 -9
  104. package/src/dashboard/public/data/convoys/demo-api-v2.json +177 -0
  105. package/src/dashboard/public/data/convoys/demo-auth-revamp.json +239 -0
  106. package/src/dashboard/public/data/convoys/demo-dashboard-ui.json +328 -0
  107. package/src/dashboard/public/data/convoys/demo-data-pipeline.json +187 -0
  108. package/src/dashboard/public/data/convoys/demo-deploy-ci.json +153 -0
  109. package/src/dashboard/public/data/convoys/demo-docs-update.json +154 -0
  110. package/src/dashboard/public/data/convoys/demo-perf-opt.json +227 -0
  111. package/src/dashboard/public/data/events.ndjson +115 -0
  112. package/src/dashboard/public/data/overall-stats.json +56 -13
  113. package/src/dashboard/public/data/pipelines.ndjson +5285 -0
  114. package/src/dashboard/scripts/etl.test.ts +4 -62
  115. package/src/dashboard/scripts/etl.ts +11 -10
  116. package/src/dashboard/scripts/generate-demo-db.ts +482 -115
  117. package/src/dashboard/src/pages/index.astro +235 -1638
  118. package/src/dashboard/src/styles/dashboard.css +473 -7
  119. package/src/orchestrator/prompts/brainstorm.prompt.md +1 -0
  120. package/src/orchestrator/prompts/fix-convoy.prompt.md +79 -0
  121. package/src/orchestrator/prompts/generate-convoy.prompt.md +60 -58
  122. package/src/orchestrator/prompts/generate-prd.prompt.md +126 -0
  123. package/src/orchestrator/prompts/validate-convoy.prompt.md +89 -0
  124. package/src/orchestrator/prompts/validate-prd.prompt.md +83 -0
  125. package/dist/cli/convoy/log-merge.test.d.ts +0 -2
  126. package/dist/cli/convoy/log-merge.test.d.ts.map +0 -1
  127. package/dist/cli/convoy/log-merge.test.js +0 -147
  128. package/dist/cli/convoy/log-merge.test.js.map +0 -1
  129. package/src/cli/convoy/log-merge.test.ts +0 -179
  130. package/src/dashboard/dist/_astro/index.6L3_HsPT.css +0 -1
@@ -275,7 +275,6 @@ body {
275
275
  background: var(--bg-secondary);
276
276
  border: 1px solid var(--border-color);
277
277
  border-radius: 12px;
278
- overflow: hidden;
279
278
  transition: border-color var(--transition-fast);
280
279
  }
281
280
 
@@ -1880,15 +1879,18 @@ body {
1880
1879
  bottom: 100%;
1881
1880
  left: 50%;
1882
1881
  transform: translateX(-50%);
1883
- padding: 0.375rem 0.625rem;
1882
+ padding: 0.5rem 0.875rem;
1884
1883
  background: var(--bg-primary);
1885
1884
  border: 1px solid rgba(255, 255, 255, 0.12);
1886
1885
  border-radius: 6px;
1887
- font-size: 0.75rem;
1886
+ font-size: 0.8125rem;
1888
1887
  color: var(--text-primary);
1889
- max-width: 280px;
1888
+ max-width: 420px;
1889
+ min-width: 180px;
1890
1890
  white-space: normal;
1891
1891
  text-align: left;
1892
+ line-height: 1.5;
1893
+ word-break: break-word;
1892
1894
  z-index: 100;
1893
1895
  pointer-events: none;
1894
1896
  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.4);
@@ -1906,15 +1908,18 @@ body {
1906
1908
  bottom: 100%;
1907
1909
  left: 50%;
1908
1910
  transform: translateX(-50%);
1909
- padding: 0.375rem 0.625rem;
1911
+ padding: 0.5rem 0.875rem;
1910
1912
  background: var(--bg-primary);
1911
1913
  border: 1px solid rgba(255, 255, 255, 0.12);
1912
1914
  border-radius: 6px;
1913
- font-size: 0.75rem;
1915
+ font-size: 0.8125rem;
1914
1916
  color: var(--text-primary);
1915
- max-width: 280px;
1917
+ max-width: 420px;
1918
+ min-width: 180px;
1916
1919
  white-space: normal;
1917
1920
  text-align: left;
1921
+ line-height: 1.5;
1922
+ word-break: break-word;
1918
1923
  z-index: 100;
1919
1924
  pointer-events: none;
1920
1925
  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.4);
@@ -2269,3 +2274,464 @@ body {
2269
2274
  margin-bottom: 0.5rem;
2270
2275
  font-style: italic;
2271
2276
  }
2277
+
2278
+ /* ── View Management ───────────────────────────────────── */
2279
+ .view-home,
2280
+ .view-convoy-detail {
2281
+ display: flex;
2282
+ flex-direction: column;
2283
+ gap: 20px;
2284
+ }
2285
+
2286
+ [data-view-hidden] {
2287
+ display: none !important;
2288
+ }
2289
+
2290
+ /* ── Breadcrumbs ───────────────────────────────────────── */
2291
+ .breadcrumbs {
2292
+ display: flex;
2293
+ align-items: center;
2294
+ gap: 6px;
2295
+ font-size: 0.8125rem;
2296
+ color: var(--text-tertiary);
2297
+ flex-wrap: wrap;
2298
+ padding: 0;
2299
+ margin-bottom: -8px;
2300
+ }
2301
+
2302
+ .breadcrumbs__link {
2303
+ color: var(--text-secondary);
2304
+ text-decoration: none;
2305
+ transition: color var(--transition-fast);
2306
+ border-bottom: 1px solid transparent;
2307
+ }
2308
+
2309
+ .breadcrumbs__link:hover {
2310
+ color: var(--text-accent);
2311
+ border-bottom-color: rgba(167, 139, 250, 0.4);
2312
+ }
2313
+
2314
+ .breadcrumbs__link:focus-visible {
2315
+ outline: 2px solid var(--accent-blue);
2316
+ outline-offset: 2px;
2317
+ border-radius: 2px;
2318
+ }
2319
+
2320
+ .breadcrumbs__separator {
2321
+ color: var(--text-tertiary);
2322
+ opacity: 0.5;
2323
+ user-select: none;
2324
+ font-size: 0.75rem;
2325
+ }
2326
+
2327
+ .breadcrumbs__current {
2328
+ color: var(--text-accent);
2329
+ font-weight: 500;
2330
+ max-width: 320px;
2331
+ overflow: hidden;
2332
+ text-overflow: ellipsis;
2333
+ white-space: nowrap;
2334
+ }
2335
+
2336
+ /* ── Convoy List Section ───────────────────────────────── */
2337
+ .convoy-list-section {
2338
+ background: var(--bg-secondary);
2339
+ border: 1px solid var(--border-color);
2340
+ border-radius: 12px;
2341
+ transition: border-color var(--transition-fast);
2342
+ }
2343
+
2344
+ .convoy-list-section:hover {
2345
+ border-color: rgba(255, 255, 255, 0.1);
2346
+ }
2347
+
2348
+ .convoy-list-section__header {
2349
+ padding: 20px 24px 12px;
2350
+ border-bottom: 1px solid var(--border-color);
2351
+ }
2352
+
2353
+ .convoy-list-section__header h2,
2354
+ .convoy-list-section__header .convoy-list-section__title {
2355
+ font-size: 0.9375rem;
2356
+ font-weight: 600;
2357
+ color: var(--text-primary);
2358
+ margin: 0;
2359
+ }
2360
+
2361
+ .convoy-list-section__desc {
2362
+ font-size: 0.75rem;
2363
+ color: var(--text-tertiary);
2364
+ margin-top: 2px;
2365
+ }
2366
+
2367
+ /* ── Convoy List Filters ─────────────────────────────── */
2368
+ .convoy-list-filters {
2369
+ display: flex;
2370
+ flex-wrap: wrap;
2371
+ gap: 10px;
2372
+ align-items: flex-end;
2373
+ padding: 14px 24px;
2374
+ background: rgba(255, 255, 255, 0.01);
2375
+ border-bottom: 1px solid var(--border-color);
2376
+ }
2377
+
2378
+ .convoy-list-filters__group {
2379
+ display: flex;
2380
+ flex-direction: column;
2381
+ gap: 4px;
2382
+ }
2383
+
2384
+ .convoy-list-filters__group label {
2385
+ font-size: 0.6875rem;
2386
+ font-weight: 500;
2387
+ color: var(--text-tertiary);
2388
+ text-transform: uppercase;
2389
+ letter-spacing: 0.05em;
2390
+ }
2391
+
2392
+ .convoy-list-filters__input,
2393
+ .convoy-list-filters__select,
2394
+ .convoy-list-filters__date {
2395
+ height: 34px;
2396
+ padding: 0 10px;
2397
+ font-size: 0.8125rem;
2398
+ color: var(--text-primary);
2399
+ background: var(--bg-tertiary);
2400
+ border: 1px solid var(--border-color);
2401
+ border-radius: 8px;
2402
+ outline: none;
2403
+ font-family: inherit;
2404
+ transition: border-color var(--transition-fast);
2405
+ color-scheme: dark;
2406
+ }
2407
+
2408
+ .convoy-list-filters__input:focus,
2409
+ .convoy-list-filters__select:focus,
2410
+ .convoy-list-filters__date:focus {
2411
+ border-color: var(--border-accent);
2412
+ }
2413
+
2414
+ .convoy-list-filters__input {
2415
+ width: 180px;
2416
+ }
2417
+
2418
+ .convoy-list-filters__date {
2419
+ width: 150px;
2420
+ }
2421
+
2422
+ .convoy-list-filters__select {
2423
+ min-width: 140px;
2424
+ cursor: pointer;
2425
+ appearance: none;
2426
+ -webkit-appearance: none;
2427
+ background-image: url("data:image/svg+xml,%3Csvg width='10' height='6' viewBox='0 0 10 6' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M1 1l4 4 4-4' stroke='%235a5a6e' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
2428
+ background-repeat: no-repeat;
2429
+ background-position: right 10px center;
2430
+ padding-right: 28px;
2431
+ }
2432
+
2433
+ .convoy-list-filters__reset {
2434
+ height: 34px;
2435
+ padding: 0 14px;
2436
+ font-size: 0.75rem;
2437
+ font-weight: 500;
2438
+ font-family: inherit;
2439
+ color: var(--text-secondary);
2440
+ background: rgba(255, 255, 255, 0.06);
2441
+ border: none;
2442
+ border-radius: 8px;
2443
+ cursor: pointer;
2444
+ transition: background var(--transition-fast), color var(--transition-fast);
2445
+ align-self: flex-end;
2446
+ white-space: nowrap;
2447
+ }
2448
+
2449
+ .convoy-list-filters__reset:hover {
2450
+ background: rgba(255, 255, 255, 0.10);
2451
+ color: var(--text-primary);
2452
+ }
2453
+
2454
+ .convoy-list-filters__reset:focus-visible {
2455
+ outline: 2px solid var(--accent-blue);
2456
+ outline-offset: 2px;
2457
+ }
2458
+
2459
+ /* ── Convoy List Table ───────────────────────────────── */
2460
+ .convoy-list-table {
2461
+ width: 100%;
2462
+ border-collapse: collapse;
2463
+ font-size: 0.8125rem;
2464
+ }
2465
+
2466
+ .convoy-list-table thead {
2467
+ position: sticky;
2468
+ top: 0;
2469
+ }
2470
+
2471
+ .convoy-list-table th {
2472
+ padding: 10px 16px;
2473
+ font-size: 0.6875rem;
2474
+ font-weight: 600;
2475
+ color: var(--text-tertiary);
2476
+ text-align: left;
2477
+ text-transform: uppercase;
2478
+ letter-spacing: 0.06em;
2479
+ background: var(--bg-tertiary);
2480
+ border-bottom: 1px solid var(--border-color);
2481
+ white-space: nowrap;
2482
+ }
2483
+
2484
+ .convoy-list-table td {
2485
+ padding: 10px 16px;
2486
+ color: var(--text-secondary);
2487
+ border-bottom: 1px solid rgba(255, 255, 255, 0.03);
2488
+ white-space: nowrap;
2489
+ }
2490
+
2491
+ .convoy-list-table tr {
2492
+ cursor: pointer;
2493
+ transition: background var(--transition-fast);
2494
+ }
2495
+
2496
+ .convoy-list-table tbody tr:hover td {
2497
+ background: rgba(167, 139, 250, 0.05);
2498
+ color: var(--text-primary);
2499
+ }
2500
+
2501
+ .convoy-list-table tbody tr:hover td:first-child {
2502
+ color: var(--text-accent);
2503
+ }
2504
+
2505
+ .convoy-list-table .td-convoy-name {
2506
+ font-weight: 600;
2507
+ color: var(--text-primary);
2508
+ max-width: 240px;
2509
+ overflow: hidden;
2510
+ text-overflow: ellipsis;
2511
+ }
2512
+
2513
+ /* ── Convoy List Empty ───────────────────────────────── */
2514
+ .convoy-list-empty {
2515
+ display: flex;
2516
+ flex-direction: column;
2517
+ align-items: center;
2518
+ justify-content: center;
2519
+ gap: 10px;
2520
+ padding: 48px 24px;
2521
+ text-align: center;
2522
+ color: var(--text-tertiary);
2523
+ }
2524
+
2525
+ .convoy-list-empty__icon {
2526
+ font-size: 2rem;
2527
+ opacity: 0.35;
2528
+ }
2529
+
2530
+ .convoy-list-empty__text {
2531
+ font-size: 0.875rem;
2532
+ color: var(--text-tertiary);
2533
+ max-width: 300px;
2534
+ line-height: 1.5;
2535
+ }
2536
+
2537
+ /* ── Convoy Detail Hero ──────────────────────────────── */
2538
+ .convoy-detail-hero {
2539
+ display: flex;
2540
+ flex-direction: column;
2541
+ gap: 12px;
2542
+ padding: 24px;
2543
+ background: var(--bg-secondary);
2544
+ border: 1px solid var(--border-color);
2545
+ border-radius: 12px;
2546
+ position: relative;
2547
+ }
2548
+
2549
+ .convoy-detail-hero::before {
2550
+ content: '';
2551
+ position: absolute;
2552
+ top: 0;
2553
+ left: 0;
2554
+ right: 0;
2555
+ height: 2px;
2556
+ background: var(--gradient-accent);
2557
+ opacity: 0.6;
2558
+ pointer-events: none;
2559
+ }
2560
+
2561
+ .convoy-detail-hero__top {
2562
+ display: flex;
2563
+ align-items: center;
2564
+ gap: 14px;
2565
+ flex-wrap: wrap;
2566
+ }
2567
+
2568
+ .convoy-detail-hero__title {
2569
+ font-size: 1.5rem;
2570
+ font-weight: 700;
2571
+ color: var(--text-primary);
2572
+ letter-spacing: -0.02em;
2573
+ line-height: 1.25;
2574
+ margin: 0;
2575
+ }
2576
+
2577
+ .convoy-detail-hero__status {
2578
+ flex-shrink: 0;
2579
+ }
2580
+
2581
+ .convoy-detail-hero__status .status-badge {
2582
+ padding: 0.25rem 0.875rem;
2583
+ font-size: 0.75rem;
2584
+ border-radius: 8px;
2585
+ }
2586
+
2587
+ .convoy-detail-hero__meta {
2588
+ display: flex;
2589
+ flex-wrap: wrap;
2590
+ gap: 20px;
2591
+ padding-top: 4px;
2592
+ border-top: 1px solid var(--border-color);
2593
+ }
2594
+
2595
+ .convoy-detail-hero__meta-item {
2596
+ display: flex;
2597
+ flex-direction: column;
2598
+ gap: 2px;
2599
+ }
2600
+
2601
+ .convoy-detail-hero__meta-label {
2602
+ font-size: 0.6875rem;
2603
+ font-weight: 500;
2604
+ color: var(--text-tertiary);
2605
+ text-transform: uppercase;
2606
+ letter-spacing: 0.05em;
2607
+ }
2608
+
2609
+ .convoy-detail-hero__meta-value {
2610
+ font-size: 0.875rem;
2611
+ color: var(--text-secondary);
2612
+ font-variant-numeric: tabular-nums;
2613
+ }
2614
+
2615
+ /* ── Task Row Enhancement ────────────────────────────── */
2616
+ .task-row--clickable {
2617
+ cursor: pointer;
2618
+ transition: background var(--transition-fast);
2619
+ }
2620
+
2621
+ .task-row--clickable:hover td {
2622
+ background: rgba(167, 139, 250, 0.04);
2623
+ }
2624
+
2625
+ .task-row--clickable td:first-child {
2626
+ position: relative;
2627
+ }
2628
+
2629
+ .task-row--clickable td:first-child::before {
2630
+ content: '';
2631
+ position: absolute;
2632
+ left: 0;
2633
+ top: 0;
2634
+ bottom: 0;
2635
+ width: 2px;
2636
+ background: transparent;
2637
+ transition: background var(--transition-fast);
2638
+ }
2639
+
2640
+ .task-row--clickable:hover td:first-child::before {
2641
+ background: var(--border-accent);
2642
+ }
2643
+
2644
+ .task-detail-expand {
2645
+ background: var(--bg-tertiary);
2646
+ border-bottom: 1px solid var(--border-color);
2647
+ }
2648
+
2649
+ .task-detail-expand__inner {
2650
+ padding: 16px 20px;
2651
+ }
2652
+
2653
+ .task-detail-expand__grid {
2654
+ display: grid;
2655
+ grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
2656
+ gap: 12px 24px;
2657
+ }
2658
+
2659
+ .task-detail-expand__field {
2660
+ display: flex;
2661
+ flex-direction: column;
2662
+ gap: 3px;
2663
+ }
2664
+
2665
+ .task-detail-expand__label {
2666
+ font-size: 0.6875rem;
2667
+ font-weight: 600;
2668
+ text-transform: uppercase;
2669
+ letter-spacing: 0.05em;
2670
+ color: var(--text-tertiary);
2671
+ }
2672
+
2673
+ .task-detail-expand__value {
2674
+ font-size: 0.8125rem;
2675
+ color: var(--text-secondary);
2676
+ word-break: break-word;
2677
+ font-variant-numeric: tabular-nums;
2678
+ }
2679
+
2680
+ .task-detail-expand__value code {
2681
+ font-family: 'SF Mono', 'Fira Code', 'Cascadia Code', monospace;
2682
+ font-size: 0.75rem;
2683
+ background: rgba(255, 255, 255, 0.06);
2684
+ padding: 1px 6px;
2685
+ border-radius: 4px;
2686
+ color: var(--text-accent);
2687
+ }
2688
+
2689
+ /* ── Responsive: Convoy List Filters ────────────────── */
2690
+ @media (max-width: 768px) {
2691
+ .convoy-list-filters {
2692
+ padding: 12px 16px;
2693
+ gap: 8px;
2694
+ }
2695
+
2696
+ .convoy-list-filters__input,
2697
+ .convoy-list-filters__select,
2698
+ .convoy-list-filters__date {
2699
+ width: 100%;
2700
+ min-width: unset;
2701
+ }
2702
+
2703
+ .convoy-list-filters__group {
2704
+ flex: 1 1 calc(50% - 4px);
2705
+ }
2706
+
2707
+ .convoy-list-filters__reset {
2708
+ flex: 1 1 100%;
2709
+ width: 100%;
2710
+ }
2711
+
2712
+ .convoy-list-section__header {
2713
+ padding: 16px 16px 12px;
2714
+ }
2715
+ }
2716
+
2717
+ @media (max-width: 480px) {
2718
+ .convoy-list-filters__group {
2719
+ flex: 1 1 100%;
2720
+ }
2721
+
2722
+ .convoy-detail-hero__title {
2723
+ font-size: 1.25rem;
2724
+ }
2725
+
2726
+ .convoy-detail-hero {
2727
+ padding: 16px;
2728
+ }
2729
+
2730
+ .task-detail-expand__grid {
2731
+ grid-template-columns: 1fr;
2732
+ }
2733
+
2734
+ .breadcrumbs__current {
2735
+ max-width: 180px;
2736
+ }
2737
+ }
@@ -38,6 +38,7 @@ Research before proposing. Gather data, don't guess:
38
38
  2. **Check documentation** — read `.opencastle/project.instructions.md`, `.opencastle/project/decisions.md`, `.opencastle/KNOWN-ISSUES.md` for constraints
39
39
  3. **Check lessons learned** — read `.opencastle/LESSONS-LEARNED.md` for pitfalls in this area
40
40
  4. **Identify affected layers** — which apps, libs, data stores, and third-party services are involved?
41
+ 5. **Research unknown topics** — if the request involves a real-world person, place, organization, or topic you don't have confident knowledge about, **search the internet** using any available web search or fetch tools (e.g. `fetch_webpage`, web search MCP, or similar) to gather accurate facts. Never fabricate content about real-world subjects.
41
42
 
42
43
  ### 3. Generate Alternatives
43
44
 
@@ -0,0 +1,79 @@
1
+ ---
2
+ description: 'Fix schema validation errors in a convoy YAML spec. Goal is the broken spec YAML; context is the error list from the validation step.'
3
+ agent: 'Team Lead (OpenCastle)'
4
+ output: convoy-spec
5
+ ---
6
+
7
+ <!-- ⚠️ This file is managed by OpenCastle. Edits will be overwritten on update. Customize in the .opencastle/ directory instead. -->
8
+
9
+ # Fix Convoy Spec
10
+
11
+ You are the Team Lead. The convoy spec below failed validation. Fix **every reported error** and output a complete, corrected spec.
12
+
13
+ ## Failing Spec
14
+
15
+ ```yaml
16
+ {{goal}}
17
+ ```
18
+
19
+ ## Validation Errors
20
+
21
+ {{context}}
22
+
23
+ ---
24
+
25
+ ## Fix Instructions
26
+
27
+ 1. Read every error before touching the YAML.
28
+ 2. Fix **all** reported errors — do not partially fix.
29
+ 3. Do not change the intent, agent assignments, or task scope of any task. Only fix what is broken.
30
+ 4. Preserve all `id`, `prompt`, `agent`, `review`, and `files` values that are not part of the reported errors.
31
+
32
+ ### Common Fix Patterns
33
+
34
+ **Glob patterns in `files`**
35
+ - `src/**/*.ts` → `src/` (use the directory, not a glob)
36
+ - `app/api/**` → `app/api/`
37
+ - `components/*.tsx` → `components/`
38
+
39
+ **Missing required fields**
40
+ - Add `name:` at the top level if missing
41
+ - Add `version: 2` at the top level if missing
42
+ - Add `id:` to any task that lacks one (use kebab-case derived from the task purpose)
43
+ - Add `prompt:` to any task that lacks one — write a 2-sentence self-contained description
44
+
45
+ **Dependency cycles**
46
+ - If A depends on B and B depends on A: remove the weaker edge (the one that can be inferred from ordering)
47
+ - If the cycle is A → B → C → A: introduce a new intermediate task or reorder so earlier tasks do not depend on later ones
48
+
49
+ **Partition conflicts (two parallel tasks sharing files)**
50
+ - Option 1: Add a `depends_on` edge to serialize the conflicting tasks
51
+ - Option 2: Split one task's `files` list to use a more specific path that does not overlap
52
+
53
+ **Invalid `agent` value**
54
+ Replace with the closest valid agent from:
55
+ `api-designer`, `architect`, `content-engineer`, `copywriter`, `data-expert`,
56
+ `database-engineer`, `developer`, `devops-expert`, `documentation-writer`,
57
+ `performance-expert`, `release-manager`, `researcher`, `security-expert`,
58
+ `seo-specialist`, `team-lead`, `testing-expert`, `ui-ux-expert`
59
+
60
+ **Invalid `timeout` format**
61
+ - `"30 minutes"` → `30m`
62
+ - `"1 hour"` → `1h`
63
+ - `"120"` → `120s`
64
+
65
+ ---
66
+
67
+ ## Output
68
+
69
+ Return the **complete corrected YAML** inside a fenced code block (not just the changed lines):
70
+
71
+ ```yaml
72
+ # .opencastle/convoys/<same-filename-as-original>
73
+ name: ...
74
+ version: 2
75
+ tasks:
76
+ ...
77
+ ```
78
+
79
+ Do not add explanatory prose before or after the YAML block.