@cat-factory/app 0.67.0 → 0.68.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.
@@ -66,6 +66,30 @@ const infraSetup = computed(() => testState.value?.infraSetup ?? null)
66
66
  // The captured stand-up logs are shown on demand (they can be long).
67
67
  const showInfraSetupLogs = ref(false)
68
68
 
69
+ // Once ALL of a tester's infrastructure is up (its container is running, the ephemeral
70
+ // environment (when it tests against one) is ready, and any in-container dependency stand-up
71
+ // succeeded) the agent can actually begin exercising the change. Surface an explicit line
72
+ // saying so, so a run's details don't jump silently from "provisioning" straight into a blank
73
+ // "working" state. This only fills the gap BEFORE the first working signal, so it is scoped
74
+ // to a still-running step that hasn't produced a report yet: a finished step (state 'done'),
75
+ // a failed run, or one that already has a report is past "starting", so the banner clears.
76
+ // (The backend keeps the raw container status at 'up' after the step ends; 'destroyed' is a
77
+ // display-only derivation in StepContainerStatus, so gating on the step state is what stops
78
+ // the banner lingering.) Requires the container to actually report 'up' (a not-yet-created
79
+ // container is not "up"), and requires the tester to genuinely depend on a test environment
80
+ // (an ephemeral env or an in-container stand-up); an infraless tester has nothing to announce.
81
+ const infraReady = computed(() => {
82
+ const s = step.value
83
+ if (!s || runFailed.value || s.state === 'done' || report.value) return false
84
+ if (s.container?.status !== 'up') return false
85
+ const env = stepEnvironment.value
86
+ const infra = infraSetup.value
87
+ if (!env && !infra) return false
88
+ const envReady = !env || env.status === 'ready'
89
+ const standupReady = !infra || infra.started
90
+ return envReady && standupReady
91
+ })
92
+
69
93
  const screenshots = computed<TestScreenshot[]>(() => report.value?.screenshots ?? [])
70
94
  // Resolve each capture into an object URL for the gallery + lightbox. The shared cache
71
95
  // dedupes, so the lightbox reuses what the thumbnails fetched. (The reference design is not
@@ -424,6 +448,19 @@ const GROUP_STATUS_META: Record<ScenarioGroup['status'], { icon: string; text: s
424
448
  </template>
425
449
  </div>
426
450
 
451
+ <!-- Explicit confirmation that every piece of the tester's infrastructure is up
452
+ (container running, the ephemeral environment ready, any in-container
453
+ dependency stand-up done) and the agent is now starting its work — so the
454
+ details don't jump silently from "provisioning" into a blank working state. -->
455
+ <div
456
+ v-if="infraReady"
457
+ data-testid="tester-env-ready"
458
+ class="flex items-center gap-2 rounded-lg border border-emerald-500/30 bg-emerald-500/10 px-3 py-2 text-[13px] text-emerald-200"
459
+ >
460
+ <UIcon name="i-lucide-rocket" class="h-4 w-4 shrink-0 text-emerald-400" />
461
+ <span>{{ t('testing.readyBanner') }}</span>
462
+ </div>
463
+
427
464
  <div v-if="executionId">
428
465
  <UButton
429
466
  :icon="showProvisioning ? 'i-lucide-chevron-up' : 'i-lucide-scroll-text'"
@@ -3180,6 +3180,7 @@
3180
3180
  "showLogs": "Show stand-up logs",
3181
3181
  "hideLogs": "Hide stand-up logs"
3182
3182
  },
3183
+ "readyBanner": "Test environment is up. The tester is starting its work.",
3183
3184
  "footer": "Scenarios are the areas the Tester chose to exercise (its spec acceptance scenarios). Outcomes and concerns are grouped under them by name.",
3184
3185
  "@screenshotAlt": {
3185
3186
  "description": "Alt text for a captured screenshot thumbnail; {view} is the screen/view name. The literal word 'screenshot' should be localized."
@@ -3052,6 +3052,7 @@
3052
3052
  "blocking": "({count} bloqueante) | ({count} bloqueantes)"
3053
3053
  },
3054
3054
  "environment": "Entorno",
3055
+ "readyBanner": "El entorno de pruebas está listo. El Tester está comenzando su trabajo.",
3055
3056
  "footer": "Los escenarios son las áreas que el Tester decidió ejercitar (sus escenarios de aceptación de la especificación). Los resultados y las incidencias se agrupan bajo ellos por nombre.",
3056
3057
  "infrastructure": "Infraestructura",
3057
3058
  "standup": {
@@ -3052,6 +3052,7 @@
3052
3052
  "blocking": "({count} bloquante) | ({count} bloquantes)"
3053
3053
  },
3054
3054
  "environment": "Environnement",
3055
+ "readyBanner": "L'environnement de test est prêt. Le Testeur commence son travail.",
3055
3056
  "footer": "Les scénarios sont les domaines que le Testeur a choisi d'éprouver (ses scénarios d'acceptation de la spécification). Les résultats et les réserves y sont regroupés par nom.",
3056
3057
  "infrastructure": "Infrastructure",
3057
3058
  "standup": {
@@ -3071,6 +3071,7 @@
3071
3071
  "showLogs": "הצג יומני הקמה",
3072
3072
  "hideLogs": "הסתר יומני הקמה"
3073
3073
  },
3074
+ "readyBanner": "סביבת הבדיקה פעילה. הבודק מתחיל בעבודתו.",
3074
3075
  "footer": "תרחישים הם התחומים שהבודק בחר לבחון (תרחישי קבלת המפרט שלו). תוצאות וחששות מקובצים תחתם לפי שם."
3075
3076
  },
3076
3077
  "visualConfirm": {
@@ -3073,6 +3073,7 @@
3073
3073
  "showLogs": "スタンドアップログを表示",
3074
3074
  "hideLogs": "スタンドアップログを非表示"
3075
3075
  },
3076
+ "readyBanner": "テスト環境が起動しました。テスターが作業を開始します。",
3076
3077
  "footer": "シナリオはTesterが検証対象に選んだ領域(スペックの受け入れシナリオ)です。結果と懸念は名前ごとにその下にグループ化されます。"
3077
3078
  },
3078
3079
  "visualConfirm": {
@@ -3052,6 +3052,7 @@
3052
3052
  "blocking": "({count} blokujące) | ({count} blokujące) | ({count} blokujących)"
3053
3053
  },
3054
3054
  "environment": "Środowisko",
3055
+ "readyBanner": "Środowisko testowe jest gotowe. Tester rozpoczyna pracę.",
3055
3056
  "footer": "Scenariusze to obszary, które Tester postanowił sprawdzić (jego scenariusze akceptacyjne ze specyfikacji). Wyniki i zastrzeżenia są pod nimi grupowane według nazwy.",
3056
3057
  "infrastructure": "Infrastruktura",
3057
3058
  "standup": {
@@ -3073,6 +3073,7 @@
3073
3073
  "showLogs": "Başlatma günlüklerini göster",
3074
3074
  "hideLogs": "Başlatma günlüklerini gizle"
3075
3075
  },
3076
+ "readyBanner": "Test ortamı hazır. Test aracı çalışmaya başlıyor.",
3076
3077
  "footer": "Senaryolar, Tester'ın test etmek için seçtiği alanlardır (spesifikasyon kabul senaryoları). Sonuçlar ve endişeler ada göre bunların altında gruplanır."
3077
3078
  },
3078
3079
  "visualConfirm": {
@@ -3052,6 +3052,7 @@
3052
3052
  "blocking": "({count} блокувальне) | ({count} блокувальні) | ({count} блокувальних)"
3053
3053
  },
3054
3054
  "environment": "Середовище",
3055
+ "readyBanner": "Тестове середовище готове. Тестувальник починає роботу.",
3055
3056
  "footer": "Сценарії — це області, які Тестувальник вирішив перевірити (його сценарії приймання зі специфікації). Результати та зауваження групуються під ними за назвою.",
3056
3057
  "infrastructure": "Інфраструктура",
3057
3058
  "standup": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cat-factory/app",
3
- "version": "0.67.0",
3
+ "version": "0.68.0",
4
4
  "description": "Reusable Nuxt layer for the Agent Architecture Board SPA (components, stores, composables, pages). Consume it from a thin deployment app via `extends: ['@cat-factory/app']` and point it at your backend with NUXT_PUBLIC_API_BASE. See deploy/frontend for an example.",
5
5
  "repository": {
6
6
  "type": "git",