@cat-factory/app 0.20.0 → 0.22.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.
- package/app/components/board/BoardCanvas.vue +21 -3
- package/app/components/board/DependencyConnectOverlay.vue +25 -0
- package/app/components/board/TaskDependencyEdges.vue +45 -0
- package/app/components/board/nodes/EpicNode.vue +51 -0
- package/app/components/board/nodes/TaskCard.vue +14 -0
- package/app/components/humanTest/HumanTestWindow.vue +327 -0
- package/app/components/layout/NotificationsInbox.vue +19 -0
- package/app/components/panels/InspectorPanel.vue +5 -0
- package/app/components/panels/StepResultViewHost.vue +3 -0
- package/app/components/panels/inspector/EpicChildren.vue +83 -0
- package/app/components/panels/inspector/TaskRunSettings.vue +25 -0
- package/app/components/slack/SlackPanel.vue +2 -0
- package/app/components/tasks/TaskImportModal.vue +59 -0
- package/app/composables/api/board.ts +10 -0
- package/app/composables/api/humanTest.ts +37 -0
- package/app/composables/api/tasks.ts +12 -0
- package/app/composables/useApi.ts +2 -0
- package/app/composables/useBlockQueries.ts +16 -0
- package/app/composables/useDependencyConnect.ts +61 -0
- package/app/stores/board.ts +71 -8
- package/app/stores/humanTest.ts +70 -0
- package/app/stores/tasks.ts +25 -0
- package/app/types/domain.ts +18 -1
- package/app/types/execution.ts +53 -0
- package/app/types/notifications.ts +1 -0
- package/app/utils/catalog.spec.ts +1 -0
- package/app/utils/catalog.ts +12 -0
- package/package.json +1 -1
package/app/types/domain.ts
CHANGED
|
@@ -59,8 +59,11 @@ export type BlockType =
|
|
|
59
59
|
* - `module` a sub-frame inside a service; created when a task assigned to a
|
|
60
60
|
* not-yet-existing module is implemented (tasks can also be dragged in)
|
|
61
61
|
* - `task` a draggable unit of work living inside a service or a module
|
|
62
|
+
* - `epic` a NON-structural grouping node: it groups tasks (which keep their own
|
|
63
|
+
* service/module parent) via their `epicId`, and is drawn linked to them.
|
|
64
|
+
* Never a container — nothing is reparented into an epic.
|
|
62
65
|
*/
|
|
63
|
-
export type BlockLevel = 'frame' | 'module' | 'task'
|
|
66
|
+
export type BlockLevel = 'frame' | 'module' | 'task' | 'epic'
|
|
64
67
|
|
|
65
68
|
/**
|
|
66
69
|
* The kind of work a task represents, chosen at creation. Drives the card's badge/icon
|
|
@@ -109,6 +112,16 @@ export interface Block {
|
|
|
109
112
|
level: BlockLevel
|
|
110
113
|
/** parent container: service or module for a task, service for a module. */
|
|
111
114
|
parentId: string | null
|
|
115
|
+
/**
|
|
116
|
+
* task-only: membership link to an `epic`-level block, independent of `parentId`.
|
|
117
|
+
* Set when the task belongs to an epic (drawn linked to it); absent/null otherwise.
|
|
118
|
+
*/
|
|
119
|
+
epicId?: string | null
|
|
120
|
+
/**
|
|
121
|
+
* task-only: when this task merges, automatically start the tasks that depend on it
|
|
122
|
+
* (and whose other dependencies are also done). Off/absent ⇒ dependents wait.
|
|
123
|
+
*/
|
|
124
|
+
autoStartDependents?: boolean
|
|
112
125
|
/** task-only: 0..1 confidence produced when the pipeline finishes. */
|
|
113
126
|
confidence?: number
|
|
114
127
|
/** task-only: the task-estimator's triage (complexity/risk/impact); absent until it runs. */
|
|
@@ -283,6 +296,10 @@ export type AgentKind =
|
|
|
283
296
|
// read-only `bug-investigator` container agent enriches it into a prose report.
|
|
284
297
|
| 'clarity-review'
|
|
285
298
|
| 'bug-investigator'
|
|
299
|
+
// The human-testing gate: spins up an ephemeral environment and PARKS for a person to
|
|
300
|
+
// validate the change in a live URL, dispatching the Tester's `fixer` (from findings) or
|
|
301
|
+
// the `conflict-resolver` (on a conflicting pull-main) on demand. Opens its own window.
|
|
302
|
+
| 'human-test'
|
|
286
303
|
|
|
287
304
|
/** A draggable agent definition shown in the agent palette. */
|
|
288
305
|
/** Palette grouping for the agent archetypes (collapsible sections in the builder). */
|
package/app/types/execution.ts
CHANGED
|
@@ -333,6 +333,12 @@ export interface PipelineStep {
|
|
|
333
333
|
* on non-gate steps. Mirrors `gateStepStateSchema`.
|
|
334
334
|
*/
|
|
335
335
|
gate?: GateStepState | null
|
|
336
|
+
/**
|
|
337
|
+
* Live state of a `human-test` gate (ephemeral env + human validation loop): the phase,
|
|
338
|
+
* the live environment, the fix/pull-main round history, and any degraded-mode reason.
|
|
339
|
+
* Absent on non-human-test steps. Mirrors `humanTestStepStateSchema`.
|
|
340
|
+
*/
|
|
341
|
+
humanTest?: HumanTestStepState | null
|
|
336
342
|
}
|
|
337
343
|
|
|
338
344
|
/** One failing CI check the gate's precheck saw (mirrors `gateFailingCheckSchema`). */
|
|
@@ -387,6 +393,53 @@ export interface TesterStepState {
|
|
|
387
393
|
lastReport?: TestReport | null
|
|
388
394
|
}
|
|
389
395
|
|
|
396
|
+
/** The lifecycle status of an ephemeral environment (mirrors `environmentStatusSchema`). */
|
|
397
|
+
export type HumanTestEnvironmentStatus =
|
|
398
|
+
| 'provisioning'
|
|
399
|
+
| 'ready'
|
|
400
|
+
| 'failed'
|
|
401
|
+
| 'expired'
|
|
402
|
+
| 'tearing_down'
|
|
403
|
+
| 'torn_down'
|
|
404
|
+
|
|
405
|
+
/** The compact env view a `human-test` gate carries (mirrors `humanTestEnvironmentSchema`). */
|
|
406
|
+
export interface HumanTestEnvironment {
|
|
407
|
+
id: string
|
|
408
|
+
url: string | null
|
|
409
|
+
status: HumanTestEnvironmentStatus
|
|
410
|
+
expiresAt?: number | null
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
/** One fix / pull-main round on a `human-test` gate (mirrors `humanTestRoundSchema`). */
|
|
414
|
+
export interface HumanTestRound {
|
|
415
|
+
kind: 'fix' | 'pull-main'
|
|
416
|
+
/** The human's findings (fix), or a one-line note (pull-main). */
|
|
417
|
+
findings: string
|
|
418
|
+
/** The helper container kind this round dispatched (`fixer` / `conflict-resolver`). */
|
|
419
|
+
helperKind: string
|
|
420
|
+
jobId?: string | null
|
|
421
|
+
/** How the helper ended once its job settled; absent while in flight. */
|
|
422
|
+
outcome?: 'completed' | 'failed' | null
|
|
423
|
+
/** epoch ms the round opened */
|
|
424
|
+
at: number
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
/** Live state of a `human-test` gate (mirrors `humanTestStepStateSchema`). */
|
|
428
|
+
export interface HumanTestStepState {
|
|
429
|
+
phase: 'provisioning' | 'awaiting_human' | 'fixing' | 'resolving_conflicts' | 'passed'
|
|
430
|
+
/** the live ephemeral environment (null in degraded manual mode / after destroy) */
|
|
431
|
+
environment?: HumanTestEnvironment | null
|
|
432
|
+
/** why no env was auto-provisioned (degraded manual mode), for the window to explain */
|
|
433
|
+
degradedReason?: string | null
|
|
434
|
+
/** how many helper (fixer / conflict-resolver) attempts have been dispatched so far */
|
|
435
|
+
attempts: number
|
|
436
|
+
/** ceiling on helper attempts (from the task's merge preset) */
|
|
437
|
+
maxAttempts: number
|
|
438
|
+
headSha?: string | null
|
|
439
|
+
/** append-only history of fix / pull-main rounds */
|
|
440
|
+
rounds?: HumanTestRound[]
|
|
441
|
+
}
|
|
442
|
+
|
|
390
443
|
/** A pipeline instance running against one block. */
|
|
391
444
|
export interface ExecutionInstance {
|
|
392
445
|
id: string
|
|
@@ -14,6 +14,7 @@ export type NotificationType =
|
|
|
14
14
|
| 'clarity_review'
|
|
15
15
|
| 'release_regression'
|
|
16
16
|
| 'decision_required'
|
|
17
|
+
| 'human_test_ready'
|
|
17
18
|
export type NotificationStatus = 'open' | 'acted' | 'dismissed'
|
|
18
19
|
|
|
19
20
|
/** The on-call agent's recommendation on a `release_regression`. */
|
package/app/utils/catalog.ts
CHANGED
|
@@ -131,6 +131,18 @@ export const AGENT_ARCHETYPES: AgentArchetype[] = [
|
|
|
131
131
|
description:
|
|
132
132
|
"Turns scenarios into runnable tests — Playwright for frontend, the project's own framework for backend; adds only new ones.",
|
|
133
133
|
},
|
|
134
|
+
{
|
|
135
|
+
kind: 'human-test',
|
|
136
|
+
label: 'Human Testing',
|
|
137
|
+
icon: 'i-lucide-user-check',
|
|
138
|
+
color: '#f59e0b',
|
|
139
|
+
category: 'test',
|
|
140
|
+
description:
|
|
141
|
+
'Spins up an ephemeral environment and pauses for a person to validate the change in a live URL — request a fix from findings, pull main + redeploy, or recreate/destroy the env — before the pipeline continues.',
|
|
142
|
+
// Opens the dedicated human-testing window (env URL + confirm / request-fix / pull-main /
|
|
143
|
+
// recreate / destroy) instead of the generic prose step-detail panel.
|
|
144
|
+
resultView: 'human-test',
|
|
145
|
+
},
|
|
134
146
|
{
|
|
135
147
|
kind: 'documenter',
|
|
136
148
|
label: 'Documenter',
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cat-factory/app",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.22.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",
|