@cat-factory/app 0.144.0 → 0.144.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.
- package/app/components/prReview/PrReviewWindow.vue +87 -5
- package/i18n/locales/de.json +3 -1
- package/i18n/locales/en.json +3 -1
- package/i18n/locales/es.json +3 -1
- package/i18n/locales/fr.json +3 -1
- package/i18n/locales/he.json +3 -1
- package/i18n/locales/it.json +3 -1
- package/i18n/locales/ja.json +3 -1
- package/i18n/locales/pl.json +3 -1
- package/i18n/locales/tr.json +3 -1
- package/i18n/locales/uk.json +3 -1
- package/package.json +1 -1
|
@@ -17,7 +17,9 @@ import type {
|
|
|
17
17
|
PrReviewResolution,
|
|
18
18
|
PrReviewSeverity,
|
|
19
19
|
PrReviewStepState,
|
|
20
|
+
StepSubtasks,
|
|
20
21
|
} from '~/types/execution'
|
|
22
|
+
import { subtaskIconClass } from '~/utils/pipelineRender'
|
|
21
23
|
import ResultWindowShell from '~/components/panels/ResultWindowShell.vue'
|
|
22
24
|
|
|
23
25
|
const execution = useExecutionStore()
|
|
@@ -44,6 +46,18 @@ const step = computed(() => {
|
|
|
44
46
|
const state = computed<PrReviewStepState | null>(() => step.value?.prReview ?? null)
|
|
45
47
|
const status = computed(() => state.value?.status ?? null)
|
|
46
48
|
const awaiting = computed(() => status.value === 'awaiting_selection')
|
|
49
|
+
// The reviewer's live todo list while it works, streamed onto the step. Its entries are the
|
|
50
|
+
// cohesive slices/chunks the agent grouped the diff into (plus a final "aggregate" step), so it
|
|
51
|
+
// surfaces slices-reviewed-so-far progress during the `reviewing` phase — richer than a spinner.
|
|
52
|
+
const subtasks = computed<StepSubtasks | null>(() => step.value?.subtasks ?? null)
|
|
53
|
+
const hasProgress = computed(() => (subtasks.value?.total ?? 0) > 0)
|
|
54
|
+
|
|
55
|
+
/** Icon per todo-item status (matches the pipeline timeline's live subtask breakdown). */
|
|
56
|
+
const ITEM_ICON: Record<string, string> = {
|
|
57
|
+
completed: 'i-lucide-check-circle-2',
|
|
58
|
+
in_progress: 'i-lucide-loader-circle',
|
|
59
|
+
pending: 'i-lucide-circle',
|
|
60
|
+
}
|
|
47
61
|
// A resolution is executing (the Fixer is committing, or comments are being posted) — show a
|
|
48
62
|
// working state between the human's choice and the run advancing/the stream echoing `done`.
|
|
49
63
|
const working = computed(() => status.value === 'fixing' || status.value === 'posting')
|
|
@@ -145,14 +159,82 @@ async function onResolve(action: PrReviewResolution): Promise<void> {
|
|
|
145
159
|
</template>
|
|
146
160
|
|
|
147
161
|
<div class="min-h-0 flex-1 overflow-y-auto px-5 py-4">
|
|
148
|
-
<!-- Reviewing: the read-only reviewer is still working.
|
|
162
|
+
<!-- Reviewing: the read-only reviewer is still working. Once it starts maintaining its
|
|
163
|
+
per-slice todo list, surface the live chunk progress (slices reviewed / total + the
|
|
164
|
+
breakdown) instead of a bare spinner. -->
|
|
149
165
|
<div
|
|
150
166
|
v-if="status === 'reviewing'"
|
|
151
|
-
|
|
167
|
+
data-testid="pr-review-reviewing"
|
|
168
|
+
class="flex h-full flex-col"
|
|
152
169
|
>
|
|
153
|
-
|
|
154
|
-
<
|
|
155
|
-
|
|
170
|
+
<!-- Live chunk progress once the reviewer has planned its slices. -->
|
|
171
|
+
<div v-if="hasProgress" class="py-2">
|
|
172
|
+
<div class="mb-1 flex items-center gap-2 text-sm text-slate-200">
|
|
173
|
+
<UIcon
|
|
174
|
+
name="i-lucide-loader-circle"
|
|
175
|
+
class="h-4 w-4 shrink-0 animate-spin text-indigo-300"
|
|
176
|
+
/>
|
|
177
|
+
<span>{{ t('prReview.reviewing.title') }}</span>
|
|
178
|
+
</div>
|
|
179
|
+
<p class="mb-3 text-[11px] text-slate-500">{{ t('prReview.reviewing.hint') }}</p>
|
|
180
|
+
|
|
181
|
+
<div class="flex items-center justify-between text-[11px] text-slate-400">
|
|
182
|
+
<span data-testid="pr-review-chunk-count">
|
|
183
|
+
{{
|
|
184
|
+
t('prReview.reviewing.chunks', {
|
|
185
|
+
completed: subtasks!.completed,
|
|
186
|
+
total: subtasks!.total,
|
|
187
|
+
})
|
|
188
|
+
}}
|
|
189
|
+
</span>
|
|
190
|
+
<span v-if="subtasks!.inProgress > 0" class="text-indigo-300">
|
|
191
|
+
{{ t('prReview.reviewing.inProgress', { count: subtasks!.inProgress }) }}
|
|
192
|
+
</span>
|
|
193
|
+
</div>
|
|
194
|
+
<div class="mt-1 h-1.5 overflow-hidden rounded-full bg-slate-700/60">
|
|
195
|
+
<div
|
|
196
|
+
class="h-full rounded-full bg-indigo-400 transition-all duration-500"
|
|
197
|
+
:style="{ width: `${(subtasks!.completed / subtasks!.total) * 100}%` }"
|
|
198
|
+
/>
|
|
199
|
+
</div>
|
|
200
|
+
|
|
201
|
+
<!-- The slice/todo breakdown the agent is working through. -->
|
|
202
|
+
<ul
|
|
203
|
+
v-if="subtasks!.items?.length"
|
|
204
|
+
class="mt-3 space-y-1.5"
|
|
205
|
+
data-testid="pr-review-chunks"
|
|
206
|
+
>
|
|
207
|
+
<li
|
|
208
|
+
v-for="(item, i) in subtasks!.items"
|
|
209
|
+
:key="i"
|
|
210
|
+
class="flex items-start gap-1.5 text-[12px]"
|
|
211
|
+
:class="
|
|
212
|
+
item.status === 'completed'
|
|
213
|
+
? 'text-slate-500 line-through'
|
|
214
|
+
: item.status === 'in_progress'
|
|
215
|
+
? 'text-slate-100'
|
|
216
|
+
: 'text-slate-400'
|
|
217
|
+
"
|
|
218
|
+
>
|
|
219
|
+
<UIcon
|
|
220
|
+
:name="ITEM_ICON[item.status]"
|
|
221
|
+
class="mt-0.5 h-3.5 w-3.5 shrink-0"
|
|
222
|
+
:class="subtaskIconClass(item.status, false)"
|
|
223
|
+
/>
|
|
224
|
+
<span>{{ item.label }}</span>
|
|
225
|
+
</li>
|
|
226
|
+
</ul>
|
|
227
|
+
</div>
|
|
228
|
+
|
|
229
|
+
<!-- Before the reviewer has planned its slices: the cold-start spinner. -->
|
|
230
|
+
<div
|
|
231
|
+
v-else
|
|
232
|
+
class="flex h-full flex-col items-center justify-center gap-2 py-10 text-center text-slate-400"
|
|
233
|
+
>
|
|
234
|
+
<UIcon name="i-lucide-loader-circle" class="h-8 w-8 animate-spin opacity-60" />
|
|
235
|
+
<p class="text-sm">{{ t('prReview.reviewing.title') }}</p>
|
|
236
|
+
<p class="max-w-sm text-[11px] text-slate-500">{{ t('prReview.reviewing.hint') }}</p>
|
|
237
|
+
</div>
|
|
156
238
|
</div>
|
|
157
239
|
|
|
158
240
|
<!-- A resolution is executing: the Fixer is committing / comments are being posted. -->
|
package/i18n/locales/de.json
CHANGED
|
@@ -4936,7 +4936,9 @@
|
|
|
4936
4936
|
"line": "Zeile {line}",
|
|
4937
4937
|
"reviewing": {
|
|
4938
4938
|
"title": "Pull Request wird geprüft…",
|
|
4939
|
-
"hint": "Der Diff wird in zusammenhängende Teile zerlegt und einzeln geprüft."
|
|
4939
|
+
"hint": "Der Diff wird in zusammenhängende Teile zerlegt und einzeln geprüft.",
|
|
4940
|
+
"chunks": "{completed} von {total} Abschnitten geprüft",
|
|
4941
|
+
"inProgress": "{count} in Bearbeitung"
|
|
4940
4942
|
},
|
|
4941
4943
|
"fixing": {
|
|
4942
4944
|
"title": "Ausgewählte Befunde werden behoben…",
|
package/i18n/locales/en.json
CHANGED
|
@@ -5065,7 +5065,9 @@
|
|
|
5065
5065
|
"line": "line {line}",
|
|
5066
5066
|
"reviewing": {
|
|
5067
5067
|
"title": "Reviewing the pull request…",
|
|
5068
|
-
"hint": "Slicing the diff into cohesive chunks and reviewing each one."
|
|
5068
|
+
"hint": "Slicing the diff into cohesive chunks and reviewing each one.",
|
|
5069
|
+
"chunks": "{completed} of {total} chunks reviewed",
|
|
5070
|
+
"inProgress": "{count} in progress"
|
|
5069
5071
|
},
|
|
5070
5072
|
"fixing": {
|
|
5071
5073
|
"title": "Fixing the selected findings…",
|
package/i18n/locales/es.json
CHANGED
|
@@ -4924,7 +4924,9 @@
|
|
|
4924
4924
|
"line": "línea {line}",
|
|
4925
4925
|
"reviewing": {
|
|
4926
4926
|
"title": "Revisando el pull request…",
|
|
4927
|
-
"hint": "Dividiendo el diff en bloques coherentes y revisando cada uno."
|
|
4927
|
+
"hint": "Dividiendo el diff en bloques coherentes y revisando cada uno.",
|
|
4928
|
+
"chunks": "{completed} de {total} fragmentos revisados",
|
|
4929
|
+
"inProgress": "{count} en curso"
|
|
4928
4930
|
},
|
|
4929
4931
|
"fixing": {
|
|
4930
4932
|
"title": "Corrigiendo los hallazgos seleccionados…",
|
package/i18n/locales/fr.json
CHANGED
|
@@ -4924,7 +4924,9 @@
|
|
|
4924
4924
|
"line": "ligne {line}",
|
|
4925
4925
|
"reviewing": {
|
|
4926
4926
|
"title": "Revue de la pull request…",
|
|
4927
|
-
"hint": "Découpage du diff en blocs cohérents et revue de chacun."
|
|
4927
|
+
"hint": "Découpage du diff en blocs cohérents et revue de chacun.",
|
|
4928
|
+
"chunks": "{completed} sur {total} sections examinées",
|
|
4929
|
+
"inProgress": "{count} en cours"
|
|
4928
4930
|
},
|
|
4929
4931
|
"fixing": {
|
|
4930
4932
|
"title": "Correction des points sélectionnés…",
|
package/i18n/locales/he.json
CHANGED
|
@@ -4935,7 +4935,9 @@
|
|
|
4935
4935
|
"line": "שורה {line}",
|
|
4936
4936
|
"reviewing": {
|
|
4937
4937
|
"title": "בודק את בקשת המשיכה…",
|
|
4938
|
-
"hint": "מחלק את ההבדלים לקטעים לכידים ובודק כל אחד."
|
|
4938
|
+
"hint": "מחלק את ההבדלים לקטעים לכידים ובודק כל אחד.",
|
|
4939
|
+
"chunks": "{completed} מתוך {total} מקטעים נבדקו",
|
|
4940
|
+
"inProgress": "{count} בתהליך"
|
|
4939
4941
|
},
|
|
4940
4942
|
"fixing": {
|
|
4941
4943
|
"title": "מתקן את הממצאים שנבחרו…",
|
package/i18n/locales/it.json
CHANGED
|
@@ -4936,7 +4936,9 @@
|
|
|
4936
4936
|
"line": "riga {line}",
|
|
4937
4937
|
"reviewing": {
|
|
4938
4938
|
"title": "Revisione della pull request…",
|
|
4939
|
-
"hint": "Suddivisione del diff in blocchi coerenti e revisione di ciascuno."
|
|
4939
|
+
"hint": "Suddivisione del diff in blocchi coerenti e revisione di ciascuno.",
|
|
4940
|
+
"chunks": "{completed} di {total} sezioni esaminate",
|
|
4941
|
+
"inProgress": "{count} in corso"
|
|
4940
4942
|
},
|
|
4941
4943
|
"fixing": {
|
|
4942
4944
|
"title": "Correzione dei rilievi selezionati…",
|
package/i18n/locales/ja.json
CHANGED
|
@@ -4936,7 +4936,9 @@
|
|
|
4936
4936
|
"line": "{line}行目",
|
|
4937
4937
|
"reviewing": {
|
|
4938
4938
|
"title": "プルリクエストをレビュー中…",
|
|
4939
|
-
"hint": "差分をまとまりのある単位に分割し、各単位をレビューしています。"
|
|
4939
|
+
"hint": "差分をまとまりのある単位に分割し、各単位をレビューしています。",
|
|
4940
|
+
"chunks": "{total} 個中 {completed} 個のチャンクをレビュー済み",
|
|
4941
|
+
"inProgress": "{count} 件処理中"
|
|
4940
4942
|
},
|
|
4941
4943
|
"fixing": {
|
|
4942
4944
|
"title": "選択した指摘を修正中…",
|
package/i18n/locales/pl.json
CHANGED
|
@@ -4924,7 +4924,9 @@
|
|
|
4924
4924
|
"line": "wiersz {line}",
|
|
4925
4925
|
"reviewing": {
|
|
4926
4926
|
"title": "Przeglądanie pull requesta…",
|
|
4927
|
-
"hint": "Dzielenie zmian na spójne części i przeglądanie każdej z nich."
|
|
4927
|
+
"hint": "Dzielenie zmian na spójne części i przeglądanie każdej z nich.",
|
|
4928
|
+
"chunks": "Sprawdzono {completed} z {total} fragmentów",
|
|
4929
|
+
"inProgress": "{count} w toku"
|
|
4928
4930
|
},
|
|
4929
4931
|
"fixing": {
|
|
4930
4932
|
"title": "Naprawianie wybranych uwag…",
|
package/i18n/locales/tr.json
CHANGED
|
@@ -4936,7 +4936,9 @@
|
|
|
4936
4936
|
"line": "satır {line}",
|
|
4937
4937
|
"reviewing": {
|
|
4938
4938
|
"title": "Pull request inceleniyor…",
|
|
4939
|
-
"hint": "Fark tutarlı parçalara bölünüp her biri inceleniyor."
|
|
4939
|
+
"hint": "Fark tutarlı parçalara bölünüp her biri inceleniyor.",
|
|
4940
|
+
"chunks": "{total} bölümden {completed} tanesi incelendi",
|
|
4941
|
+
"inProgress": "{count} devam ediyor"
|
|
4940
4942
|
},
|
|
4941
4943
|
"fixing": {
|
|
4942
4944
|
"title": "Seçili bulgular düzeltiliyor…",
|
package/i18n/locales/uk.json
CHANGED
|
@@ -4924,7 +4924,9 @@
|
|
|
4924
4924
|
"line": "рядок {line}",
|
|
4925
4925
|
"reviewing": {
|
|
4926
4926
|
"title": "Перевірка pull request…",
|
|
4927
|
-
"hint": "Поділ змін на цілісні частини та огляд кожної з них."
|
|
4927
|
+
"hint": "Поділ змін на цілісні частини та огляд кожної з них.",
|
|
4928
|
+
"chunks": "Перевірено {completed} з {total} фрагментів",
|
|
4929
|
+
"inProgress": "{count} у процесі"
|
|
4928
4930
|
},
|
|
4929
4931
|
"fixing": {
|
|
4930
4932
|
"title": "Виправлення вибраних зауважень…",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cat-factory/app",
|
|
3
|
-
"version": "0.144.
|
|
3
|
+
"version": "0.144.1",
|
|
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",
|