@cat-factory/app 0.269.1 → 0.270.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/settings/RiskPolicyCreateForm.vue +13 -0
- package/app/components/settings/RiskPolicyEditorRow.vue +12 -0
- package/app/composables/useRunStart.spec.ts +1 -0
- package/app/utils/riskPolicy.spec.ts +1 -0
- package/app/utils/riskPolicyDraft.spec.ts +111 -0
- package/app/utils/riskPolicyDraft.ts +13 -1
- package/i18n/locales/de.json +2 -0
- package/i18n/locales/en.json +2 -0
- package/i18n/locales/es.json +2 -0
- package/i18n/locales/fr.json +2 -0
- package/i18n/locales/he.json +2 -0
- package/i18n/locales/it.json +2 -0
- package/i18n/locales/ja.json +2 -0
- package/i18n/locales/pl.json +2 -0
- package/i18n/locales/tr.json +2 -0
- package/i18n/locales/uk.json +2 -0
- package/package.json +2 -2
|
@@ -43,6 +43,7 @@ function submit() {
|
|
|
43
43
|
ciMaxAttempts: draft.ciMaxAttempts,
|
|
44
44
|
maxRequirementIterations: draft.maxRequirementIterations,
|
|
45
45
|
maxRequirementConcernAllowed: draft.maxRequirementConcernAllowed,
|
|
46
|
+
companionMaxReworks: draft.companionMaxReworks,
|
|
46
47
|
autoMergeEnabled: draft.autoMergeEnabled,
|
|
47
48
|
autonomy: draft.unattended ? 'unattended' : 'attended',
|
|
48
49
|
minAutoAnswerConfidence: draft.minAutoAnswerConfidence / 100,
|
|
@@ -127,6 +128,18 @@ function submit() {
|
|
|
127
128
|
size="sm"
|
|
128
129
|
/>
|
|
129
130
|
</label>
|
|
131
|
+
<label class="block w-20">
|
|
132
|
+
<span class="mb-1 block text-[10px] uppercase tracking-wide text-slate-500">
|
|
133
|
+
{{ t('settings.riskPolicy.create.companionRework') }}
|
|
134
|
+
</span>
|
|
135
|
+
<UInput
|
|
136
|
+
v-model.number="draft.companionMaxReworks"
|
|
137
|
+
type="number"
|
|
138
|
+
:min="0"
|
|
139
|
+
:max="10"
|
|
140
|
+
size="sm"
|
|
141
|
+
/>
|
|
142
|
+
</label>
|
|
130
143
|
<label class="block w-32">
|
|
131
144
|
<span class="mb-1 block text-[10px] uppercase tracking-wide text-slate-500">
|
|
132
145
|
{{ t('settings.riskPolicy.create.autoPass') }}
|
|
@@ -185,6 +185,18 @@ const deleteBlocked = computed(
|
|
|
185
185
|
size="sm"
|
|
186
186
|
/>
|
|
187
187
|
</label>
|
|
188
|
+
<label class="block">
|
|
189
|
+
<span class="mb-1 block text-[10px] uppercase tracking-wide text-slate-500">
|
|
190
|
+
{{ t('settings.riskPolicy.field.companionMaxReworks') }}
|
|
191
|
+
</span>
|
|
192
|
+
<UInput
|
|
193
|
+
v-model.number="draft.companionMaxReworks"
|
|
194
|
+
type="number"
|
|
195
|
+
:min="0"
|
|
196
|
+
:max="10"
|
|
197
|
+
size="sm"
|
|
198
|
+
/>
|
|
199
|
+
</label>
|
|
188
200
|
<label class="block">
|
|
189
201
|
<span class="mb-1 block text-[10px] uppercase tracking-wide text-slate-500">
|
|
190
202
|
{{ t('settings.riskPolicy.field.maxRequirementConcernAllowed') }}
|
|
@@ -25,6 +25,7 @@ const preset = (over: Partial<RiskPolicyLibraryEntry> = {}): RiskPolicyLibraryEn
|
|
|
25
25
|
maxRequirementIterations: 6,
|
|
26
26
|
maxRequirementConcernAllowed: 'none',
|
|
27
27
|
maxTesterQualityIterations: 3,
|
|
28
|
+
companionMaxReworks: 3,
|
|
28
29
|
releaseWatchWindowMinutes: 30,
|
|
29
30
|
releaseMaxAttempts: 1,
|
|
30
31
|
humanReviewGraceMinutes: 10,
|
|
@@ -20,6 +20,7 @@ const policy = (over: Partial<RiskPolicy> = {}): RiskPolicy =>
|
|
|
20
20
|
maxRequirementIterations: 6,
|
|
21
21
|
maxRequirementConcernAllowed: 'none',
|
|
22
22
|
maxTesterQualityIterations: 3,
|
|
23
|
+
companionMaxReworks: 3,
|
|
23
24
|
releaseWatchWindowMinutes: 30,
|
|
24
25
|
releaseMaxAttempts: 1,
|
|
25
26
|
humanReviewGraceMinutes: 10,
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest'
|
|
2
|
+
import * as v from 'valibot'
|
|
3
|
+
import { createRiskPolicySchema } from '@cat-factory/contracts'
|
|
4
|
+
import type { RiskPolicy } from '~/types/merge'
|
|
5
|
+
import {
|
|
6
|
+
blankRiskPolicyDraft,
|
|
7
|
+
riskPolicyPatchFromDraft,
|
|
8
|
+
toRiskPolicyDraft,
|
|
9
|
+
type RiskPolicyDraft,
|
|
10
|
+
} from '~/utils/riskPolicyDraft'
|
|
11
|
+
|
|
12
|
+
// The conversions either side of the policy editor's form state. They are worth their own spec
|
|
13
|
+
// because the way they break is SILENT: a field the draft carries but nothing maps into the patch
|
|
14
|
+
// renders a control that accepts an operator's edit, PATCHes without it, and re-renders the old
|
|
15
|
+
// value with no error anywhere to say the save dropped something.
|
|
16
|
+
|
|
17
|
+
const policy = (over: Partial<RiskPolicy> = {}): RiskPolicy =>
|
|
18
|
+
({
|
|
19
|
+
id: 'mp_balanced',
|
|
20
|
+
name: 'Balanced',
|
|
21
|
+
maxComplexity: 0.6,
|
|
22
|
+
maxRisk: 0.4,
|
|
23
|
+
maxImpact: 0.5,
|
|
24
|
+
ciMaxAttempts: 10,
|
|
25
|
+
maxRequirementIterations: 6,
|
|
26
|
+
maxRequirementConcernAllowed: 'none',
|
|
27
|
+
maxTesterQualityIterations: 3,
|
|
28
|
+
companionMaxReworks: 3,
|
|
29
|
+
releaseWatchWindowMinutes: 30,
|
|
30
|
+
releaseMaxAttempts: 1,
|
|
31
|
+
humanReviewGraceMinutes: 10,
|
|
32
|
+
judgeMinScore: 0.7,
|
|
33
|
+
judgeMaxBounces: 2,
|
|
34
|
+
autoMergeEnabled: true,
|
|
35
|
+
autonomy: 'attended',
|
|
36
|
+
minAutoAnswerConfidence: 0.8,
|
|
37
|
+
classRules: {},
|
|
38
|
+
classRulesByRole: {},
|
|
39
|
+
dryRunRoles: [],
|
|
40
|
+
submissionClassesByRole: {},
|
|
41
|
+
isDefault: true,
|
|
42
|
+
isUnattendedDefault: false,
|
|
43
|
+
version: 1,
|
|
44
|
+
createdAt: 0,
|
|
45
|
+
updatedAt: 0,
|
|
46
|
+
...over,
|
|
47
|
+
}) as RiskPolicy
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* A different value of the same type, whatever the field holds. Generic on purpose: the assertion
|
|
51
|
+
* below iterates the draft's own keys, so it must not know which of them are numbers.
|
|
52
|
+
*/
|
|
53
|
+
function nudge(value: unknown): unknown {
|
|
54
|
+
if (typeof value === 'number') return value + 1
|
|
55
|
+
if (typeof value === 'boolean') return !value
|
|
56
|
+
if (typeof value === 'string') {
|
|
57
|
+
if (value === 'run') return 'skip'
|
|
58
|
+
if (value === 'none') return 'high'
|
|
59
|
+
return `${value} (edited)`
|
|
60
|
+
}
|
|
61
|
+
if (Array.isArray(value)) return ['admin']
|
|
62
|
+
return { feature: { maxRisk: 0.1 } }
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
describe('the risk-policy draft conversions', () => {
|
|
66
|
+
it('carries every field the draft holds into the patch body', () => {
|
|
67
|
+
// Iterating the draft's OWN keys is what makes this hold for a field added later: the interface
|
|
68
|
+
// is what a new control is added to, and anything on it that `riskPolicyPatchFromDraft` forgets
|
|
69
|
+
// fails here rather than in production.
|
|
70
|
+
const base = toRiskPolicyDraft(policy())
|
|
71
|
+
const unchanged = riskPolicyPatchFromDraft(base, 'Balanced')
|
|
72
|
+
for (const key of Object.keys(base) as (keyof RiskPolicyDraft)[]) {
|
|
73
|
+
const edited = { ...base, [key]: nudge(base[key]) } as RiskPolicyDraft
|
|
74
|
+
expect(
|
|
75
|
+
riskPolicyPatchFromDraft(edited, 'Balanced'),
|
|
76
|
+
`draft field '${key}' never reaches the patch body`,
|
|
77
|
+
).not.toEqual(unchanged)
|
|
78
|
+
}
|
|
79
|
+
})
|
|
80
|
+
|
|
81
|
+
it('round-trips a stored policy unchanged when nothing is edited', () => {
|
|
82
|
+
const stored = policy({ companionMaxReworks: 7, maxRisk: 0.45, autonomy: 'unattended' })
|
|
83
|
+
const patch = riskPolicyPatchFromDraft(toRiskPolicyDraft(stored), 'fallback')
|
|
84
|
+
|
|
85
|
+
// The percentages went up by a hundred for editing and came back down; the counts and the
|
|
86
|
+
// posture are stored as typed.
|
|
87
|
+
expect(patch.maxRisk).toBe(0.45)
|
|
88
|
+
expect(patch.minAutoAnswerConfidence).toBe(0.8)
|
|
89
|
+
expect(patch.companionMaxReworks).toBe(7)
|
|
90
|
+
expect(patch.autonomy).toBe('unattended')
|
|
91
|
+
})
|
|
92
|
+
|
|
93
|
+
it('keeps a blanked name from saving over the stored one', () => {
|
|
94
|
+
const draft = { ...toRiskPolicyDraft(policy()), name: ' ' }
|
|
95
|
+
expect(riskPolicyPatchFromDraft(draft, 'Balanced').name).toBe('Balanced')
|
|
96
|
+
})
|
|
97
|
+
|
|
98
|
+
it('opens the create form on the value the API would have defaulted to', () => {
|
|
99
|
+
// Read off the create schema rather than restated, so a shipped default that moves takes the
|
|
100
|
+
// blank form with it instead of leaving it pre-filling a number nothing else states.
|
|
101
|
+
expect(blankRiskPolicyDraft().companionMaxReworks).toBe(
|
|
102
|
+
v.getDefault(createRiskPolicySchema.entries.companionMaxReworks),
|
|
103
|
+
)
|
|
104
|
+
})
|
|
105
|
+
|
|
106
|
+
it('never opens the create form on a granted licence', () => {
|
|
107
|
+
// The one default the blank form may NOT inherit from anywhere: an unattended posture is
|
|
108
|
+
// something a person grants, so a new policy parks on its own caps.
|
|
109
|
+
expect(blankRiskPolicyDraft().unattended).toBe(false)
|
|
110
|
+
})
|
|
111
|
+
})
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { DEFAULT_COMPANION_MAX_ATTEMPTS, type StepGating } from '@cat-factory/contracts'
|
|
2
2
|
import type {
|
|
3
3
|
ClassRulesByRole,
|
|
4
4
|
DryRunRoles,
|
|
@@ -25,6 +25,12 @@ export interface RiskPolicyDraft {
|
|
|
25
25
|
ciMaxAttempts: number
|
|
26
26
|
maxRequirementIterations: number
|
|
27
27
|
maxRequirementConcernAllowed: RequirementConcernLevel
|
|
28
|
+
/**
|
|
29
|
+
* How many automatic rework rounds a companion (reviewer / architect-companion /
|
|
30
|
+
* spec-companion) may drive before the run parks for a person. `0` sends the first verdict below
|
|
31
|
+
* the bar straight to that park, which is a posture rather than a disabled loop.
|
|
32
|
+
*/
|
|
33
|
+
companionMaxReworks: number
|
|
28
34
|
autoMergeEnabled: boolean
|
|
29
35
|
/**
|
|
30
36
|
* Whether a run under this policy answers the parks its own automatic loops raise when they give
|
|
@@ -87,6 +93,7 @@ export function toRiskPolicyDraft(p: RiskPolicy): RiskPolicyDraft {
|
|
|
87
93
|
ciMaxAttempts: p.ciMaxAttempts,
|
|
88
94
|
maxRequirementIterations: p.maxRequirementIterations,
|
|
89
95
|
maxRequirementConcernAllowed: p.maxRequirementConcernAllowed,
|
|
96
|
+
companionMaxReworks: p.companionMaxReworks,
|
|
90
97
|
autoMergeEnabled: p.autoMergeEnabled,
|
|
91
98
|
unattended: p.autonomy === 'unattended',
|
|
92
99
|
minAutoAnswerConfidence: Math.round(p.minAutoAnswerConfidence * 100),
|
|
@@ -112,6 +119,10 @@ export function blankRiskPolicyDraft(): RiskPolicyDraft {
|
|
|
112
119
|
ciMaxAttempts: 10,
|
|
113
120
|
maxRequirementIterations: 6,
|
|
114
121
|
maxRequirementConcernAllowed: 'none',
|
|
122
|
+
// Off the constant the create schema itself defaults to, so the form cannot pre-fill a number
|
|
123
|
+
// the platform has stopped shipping. The percentages above are literals because they are the
|
|
124
|
+
// EDITING scale (0..100) rather than the stored value; this one is stored as typed.
|
|
125
|
+
companionMaxReworks: DEFAULT_COMPANION_MAX_ATTEMPTS,
|
|
115
126
|
autoMergeEnabled: true,
|
|
116
127
|
// A new policy parks on its own caps, matching every built-in but the unattended default: a
|
|
117
128
|
// licence to answer them is a posture somebody grants, never one a blank form assumes.
|
|
@@ -162,6 +173,7 @@ export function riskPolicyPatchFromDraft(
|
|
|
162
173
|
ciMaxAttempts: d.ciMaxAttempts,
|
|
163
174
|
maxRequirementIterations: d.maxRequirementIterations,
|
|
164
175
|
maxRequirementConcernAllowed: d.maxRequirementConcernAllowed,
|
|
176
|
+
companionMaxReworks: d.companionMaxReworks,
|
|
165
177
|
autoMergeEnabled: d.autoMergeEnabled,
|
|
166
178
|
autonomy: d.unattended ? 'unattended' : 'attended',
|
|
167
179
|
minAutoAnswerConfidence: d.minAutoAnswerConfidence / 100,
|
package/i18n/locales/de.json
CHANGED
|
@@ -538,6 +538,7 @@
|
|
|
538
538
|
"ciMaxAttempts": "CI-Fix-Versuche",
|
|
539
539
|
"maxRequirementIterations": "Anforderungs-Iterationen",
|
|
540
540
|
"maxRequirementConcernAllowed": "Auto-Pass bei Bedenken auf oder unter",
|
|
541
|
+
"companionMaxReworks": "Begleiter-Überarbeitungsrunden",
|
|
541
542
|
"autoMerge": "Auto-Merge"
|
|
542
543
|
},
|
|
543
544
|
"autoMergeOnHint": "Automatisch mergen, wenn innerhalb der Richtliniengrenzen.",
|
|
@@ -551,6 +552,7 @@
|
|
|
551
552
|
"impact": "Ausw.%",
|
|
552
553
|
"ciFix": "CI-Fix",
|
|
553
554
|
"reqIter": "Anf.-Iter.",
|
|
555
|
+
"companionRework": "Überarb.",
|
|
554
556
|
"autoPass": "Auto-Pass auf oder unter"
|
|
555
557
|
},
|
|
556
558
|
"add": "Hinzufügen",
|
package/i18n/locales/en.json
CHANGED
|
@@ -3275,6 +3275,7 @@
|
|
|
3275
3275
|
"ciMaxAttempts": "CI-fix attempts",
|
|
3276
3276
|
"maxRequirementIterations": "Requirement iterations",
|
|
3277
3277
|
"maxRequirementConcernAllowed": "Auto-pass concerns at or below",
|
|
3278
|
+
"companionMaxReworks": "Companion rework rounds",
|
|
3278
3279
|
"autoMerge": "Auto-merge"
|
|
3279
3280
|
},
|
|
3280
3281
|
"autoMergeOnHint": "Merge automatically when within the policy limits.",
|
|
@@ -3288,6 +3289,7 @@
|
|
|
3288
3289
|
"impact": "Impact%",
|
|
3289
3290
|
"ciFix": "CI-fix",
|
|
3290
3291
|
"reqIter": "Req iter",
|
|
3292
|
+
"companionRework": "Rework",
|
|
3291
3293
|
"autoPass": "Auto-pass at or below"
|
|
3292
3294
|
},
|
|
3293
3295
|
"add": "Add",
|
package/i18n/locales/es.json
CHANGED
|
@@ -3001,6 +3001,7 @@
|
|
|
3001
3001
|
"ciMaxAttempts": "Intentos de corrección de CI",
|
|
3002
3002
|
"maxRequirementIterations": "Iteraciones de requisitos",
|
|
3003
3003
|
"maxRequirementConcernAllowed": "Aprobación automática de inquietudes hasta",
|
|
3004
|
+
"companionMaxReworks": "Rondas de reelaboración del acompañante",
|
|
3004
3005
|
"autoMerge": "Fusión automática"
|
|
3005
3006
|
},
|
|
3006
3007
|
"newPreset": "Nueva política",
|
|
@@ -3012,6 +3013,7 @@
|
|
|
3012
3013
|
"impact": "Impacto%",
|
|
3013
3014
|
"ciFix": "Corr. CI",
|
|
3014
3015
|
"reqIter": "Iter. req.",
|
|
3016
|
+
"companionRework": "Reelab.",
|
|
3015
3017
|
"autoPass": "Aprob. auto. hasta"
|
|
3016
3018
|
},
|
|
3017
3019
|
"add": "Añadir",
|
package/i18n/locales/fr.json
CHANGED
|
@@ -3001,6 +3001,7 @@
|
|
|
3001
3001
|
"ciMaxAttempts": "Tentatives de correction CI",
|
|
3002
3002
|
"maxRequirementIterations": "Itérations d'exigences",
|
|
3003
3003
|
"maxRequirementConcernAllowed": "Validation auto. des préoccupations jusqu'à",
|
|
3004
|
+
"companionMaxReworks": "Cycles de retravail du compagnon",
|
|
3004
3005
|
"autoMerge": "Fusion automatique"
|
|
3005
3006
|
},
|
|
3006
3007
|
"newPreset": "Nouvelle politique",
|
|
@@ -3012,6 +3013,7 @@
|
|
|
3012
3013
|
"impact": "Impact%",
|
|
3013
3014
|
"ciFix": "Corr. CI",
|
|
3014
3015
|
"reqIter": "Itér. exig.",
|
|
3016
|
+
"companionRework": "Retrav.",
|
|
3015
3017
|
"autoPass": "Valid. auto. jusqu'à"
|
|
3016
3018
|
},
|
|
3017
3019
|
"add": "Ajouter",
|
package/i18n/locales/he.json
CHANGED
|
@@ -3143,6 +3143,7 @@
|
|
|
3143
3143
|
"ciMaxAttempts": "ניסיונות תיקון CI",
|
|
3144
3144
|
"maxRequirementIterations": "איטרציות דרישות",
|
|
3145
3145
|
"maxRequirementConcernAllowed": "מעבר אוטומטי בחששות ברף או מתחתיו",
|
|
3146
|
+
"companionMaxReworks": "סבבי עיבוד מחדש של המלווה",
|
|
3146
3147
|
"autoMerge": "מיזוג אוטומטי"
|
|
3147
3148
|
},
|
|
3148
3149
|
"newPreset": "מדיניות חדשה",
|
|
@@ -3154,6 +3155,7 @@
|
|
|
3154
3155
|
"impact": "השפעה%",
|
|
3155
3156
|
"ciFix": "תיקון CI",
|
|
3156
3157
|
"reqIter": "איטרציות דרישות",
|
|
3158
|
+
"companionRework": "עיבוד מחדש",
|
|
3157
3159
|
"autoPass": "מעבר אוטומטי ברף או מתחתיו"
|
|
3158
3160
|
},
|
|
3159
3161
|
"add": "הוסף",
|
package/i18n/locales/it.json
CHANGED
|
@@ -538,6 +538,7 @@
|
|
|
538
538
|
"ciMaxAttempts": "Tentativi di correzione CI",
|
|
539
539
|
"maxRequirementIterations": "Iterazioni sui requisiti",
|
|
540
540
|
"maxRequirementConcernAllowed": "Auto-pass per criticita pari o inferiori a",
|
|
541
|
+
"companionMaxReworks": "Cicli di rielaborazione del companion",
|
|
541
542
|
"autoMerge": "Auto-merge"
|
|
542
543
|
},
|
|
543
544
|
"autoMergeOnHint": "Mergia automaticamente quando rientra nei limiti del criterio.",
|
|
@@ -551,6 +552,7 @@
|
|
|
551
552
|
"impact": "Impatto%",
|
|
552
553
|
"ciFix": "Corr. CI",
|
|
553
554
|
"reqIter": "Iter req",
|
|
555
|
+
"companionRework": "Rielab.",
|
|
554
556
|
"autoPass": "Auto-pass pari o inferiore a"
|
|
555
557
|
},
|
|
556
558
|
"add": "Aggiungi",
|
package/i18n/locales/ja.json
CHANGED
|
@@ -3143,6 +3143,7 @@
|
|
|
3143
3143
|
"ciMaxAttempts": "CI 修正の試行回数",
|
|
3144
3144
|
"maxRequirementIterations": "要件のイテレーション回数",
|
|
3145
3145
|
"maxRequirementConcernAllowed": "この水準以下の懸念を自動承認",
|
|
3146
|
+
"companionMaxReworks": "コンパニオンの再作業回数",
|
|
3146
3147
|
"autoMerge": "自動マージ"
|
|
3147
3148
|
},
|
|
3148
3149
|
"newPreset": "新しいポリシー",
|
|
@@ -3154,6 +3155,7 @@
|
|
|
3154
3155
|
"impact": "影響度%",
|
|
3155
3156
|
"ciFix": "CI 修正",
|
|
3156
3157
|
"reqIter": "要件イテレ",
|
|
3158
|
+
"companionRework": "再作業",
|
|
3157
3159
|
"autoPass": "この水準以下を自動承認"
|
|
3158
3160
|
},
|
|
3159
3161
|
"add": "追加",
|
package/i18n/locales/pl.json
CHANGED
|
@@ -3001,6 +3001,7 @@
|
|
|
3001
3001
|
"ciMaxAttempts": "Próby naprawy CI",
|
|
3002
3002
|
"maxRequirementIterations": "Iteracje wymagań",
|
|
3003
3003
|
"maxRequirementConcernAllowed": "Automatyczne zaliczenie zastrzeżeń do",
|
|
3004
|
+
"companionMaxReworks": "Rundy przeróbek towarzysza",
|
|
3004
3005
|
"autoMerge": "Auto-scalanie"
|
|
3005
3006
|
},
|
|
3006
3007
|
"newPreset": "Nowa zasada",
|
|
@@ -3012,6 +3013,7 @@
|
|
|
3012
3013
|
"impact": "Wpływ%",
|
|
3013
3014
|
"ciFix": "Napr. CI",
|
|
3014
3015
|
"reqIter": "Iter. wym.",
|
|
3016
|
+
"companionRework": "Przeróbki",
|
|
3015
3017
|
"autoPass": "Auto-zalicz do"
|
|
3016
3018
|
},
|
|
3017
3019
|
"add": "Dodaj",
|
package/i18n/locales/tr.json
CHANGED
|
@@ -3143,6 +3143,7 @@
|
|
|
3143
3143
|
"ciMaxAttempts": "CI düzeltme denemeleri",
|
|
3144
3144
|
"maxRequirementIterations": "Gereksinim yinelemeleri",
|
|
3145
3145
|
"maxRequirementConcernAllowed": "Şu düzeyde veya altında otomatik geç",
|
|
3146
|
+
"companionMaxReworks": "Yardımcı yeniden çalışma turları",
|
|
3146
3147
|
"autoMerge": "Otomatik birleştirme"
|
|
3147
3148
|
},
|
|
3148
3149
|
"newPreset": "Yeni ilke",
|
|
@@ -3154,6 +3155,7 @@
|
|
|
3154
3155
|
"impact": "Etki%",
|
|
3155
3156
|
"ciFix": "CI düzeltme",
|
|
3156
3157
|
"reqIter": "Grks. yin.",
|
|
3158
|
+
"companionRework": "Yen. çalışma",
|
|
3157
3159
|
"autoPass": "Şu düzeyde veya altında otomatik geç"
|
|
3158
3160
|
},
|
|
3159
3161
|
"add": "Ekle",
|
package/i18n/locales/uk.json
CHANGED
|
@@ -3001,6 +3001,7 @@
|
|
|
3001
3001
|
"ciMaxAttempts": "Спроби виправлення CI",
|
|
3002
3002
|
"maxRequirementIterations": "Ітерації вимог",
|
|
3003
3003
|
"maxRequirementConcernAllowed": "Авто-пропуск зауважень до",
|
|
3004
|
+
"companionMaxReworks": "Цикли переробки компаньйона",
|
|
3004
3005
|
"autoMerge": "Автозлиття"
|
|
3005
3006
|
},
|
|
3006
3007
|
"newPreset": "Нова політика",
|
|
@@ -3012,6 +3013,7 @@
|
|
|
3012
3013
|
"impact": "Вплив%",
|
|
3013
3014
|
"ciFix": "Випр. CI",
|
|
3014
3015
|
"reqIter": "Ітер. вим.",
|
|
3016
|
+
"companionRework": "Переробка",
|
|
3015
3017
|
"autoPass": "Авто-пропуск до"
|
|
3016
3018
|
},
|
|
3017
3019
|
"add": "Додати",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cat-factory/app",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.270.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",
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
"valibot": "^1.4.2",
|
|
41
41
|
"vue": "3.5.41",
|
|
42
42
|
"wretch": "^3.0.9",
|
|
43
|
-
"@cat-factory/contracts": "0.
|
|
43
|
+
"@cat-factory/contracts": "0.308.0"
|
|
44
44
|
},
|
|
45
45
|
"devDependencies": {
|
|
46
46
|
"@toad-contracts/testing": "0.3.2",
|