kin: KIN-FIX-002 Унифицировать localStorage значения execution_mode с 'auto_complete'

Заменены все вхождения 'auto' на 'auto_complete' как значение execution_mode в localStorage-операциях:

web/frontend/src/views/TaskDetail.vue:
- Line 46: localStorage.getItem сравнение
- Line 53: localStorage.setItem значение
- Line 55: API patch значение (уже было 'auto_complete', добавлено для полноты)

web/frontend/src/views/ProjectView.vue:
- Line 171: execution_mode === 'auto' → 'auto_complete'
- Line 173: localStorage.getItem сравнение
- Line 179: localStorage.setItem значение
- Line 181: API patch значение
- Line 182: state update значение
- Line 643: template v-if condition

web/frontend/src/__tests__/filter-persistence.test.ts:
- Line 377: Type definition обновлена
- Lines 415, 433, 449: makeTaskWith параметры обновлены
- Line 479: localStorage mock значение
- Line 478: Комментарий обновлён

Все 37 тестов в filter-persistence.test.ts пройдены.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
This commit is contained in:
Gros Frumos 2026-03-16 10:14:24 +02:00
parent cb099030ce
commit 7f8e0e2238
3 changed files with 14 additions and 14 deletions

View file

@ -374,7 +374,7 @@ describe('KIN-011: TaskDetail — возврат с сохранением URL',
// ─────────────────────────────────────────────────────────────
describe('KIN-047: TaskDetail — Approve/Reject в статусе review', () => {
function makeTaskWith(status: string, executionMode: 'auto' | 'review' | null = null) {
function makeTaskWith(status: string, executionMode: 'auto_complete' | 'review' | null = null) {
return {
id: 'KIN-047',
project_id: 'KIN',
@ -412,7 +412,7 @@ describe('KIN-047: TaskDetail — Approve/Reject в статусе review', () =
})
it('Approve и Reject скрыты при autoMode в статусе review', async () => {
vi.mocked(api.taskFull).mockResolvedValue(makeTaskWith('review', 'auto') as any)
vi.mocked(api.taskFull).mockResolvedValue(makeTaskWith('review', 'auto_complete') as any)
const router = makeRouter()
await router.push('/task/KIN-047')
@ -430,7 +430,7 @@ describe('KIN-047: TaskDetail — Approve/Reject в статусе review', () =
})
it('Тоггл Auto/Review виден в статусе review при autoMode (позволяет выйти из автопилота)', async () => {
vi.mocked(api.taskFull).mockResolvedValue(makeTaskWith('review', 'auto') as any)
vi.mocked(api.taskFull).mockResolvedValue(makeTaskWith('review', 'auto_complete') as any)
const router = makeRouter()
await router.push('/task/KIN-047')
@ -446,7 +446,7 @@ describe('KIN-047: TaskDetail — Approve/Reject в статусе review', () =
})
it('После клика тоггла в review+autoMode появляются Approve и Reject', async () => {
const task = makeTaskWith('review', 'auto')
const task = makeTaskWith('review', 'auto_complete')
vi.mocked(api.taskFull).mockResolvedValue(task as any)
vi.mocked(api.patchTask).mockResolvedValue({ execution_mode: 'review' } as any)
@ -475,8 +475,8 @@ describe('KIN-047: TaskDetail — Approve/Reject в статусе review', () =
it('KIN-051: Approve и Reject видны при статусе review и execution_mode=null (фикс баги)', async () => {
// Воспроизводит баг: задача в review без явного execution_mode зависала
// без кнопок, потому что localStorage мог содержать 'auto'
localStorageMock.setItem('kin-mode-KIN', 'auto') // имитируем "плохой" localStorage
// без кнопок, потому что localStorage мог содержать 'auto_complete'
localStorageMock.setItem('kin-mode-KIN', 'auto_complete') // имитируем "плохой" localStorage
vi.mocked(api.taskFull).mockResolvedValue(makeTaskWith('review', null) as any)
const router = makeRouter()
await router.push('/task/KIN-047')

View file

@ -168,18 +168,18 @@ const autoMode = ref(false)
function loadMode() {
if (project.value?.execution_mode) {
autoMode.value = project.value.execution_mode === 'auto'
autoMode.value = project.value.execution_mode === 'auto_complete'
} else {
autoMode.value = localStorage.getItem(`kin-mode-${props.id}`) === 'auto'
autoMode.value = localStorage.getItem(`kin-mode-${props.id}`) === 'auto_complete'
}
}
async function toggleMode() {
autoMode.value = !autoMode.value
localStorage.setItem(`kin-mode-${props.id}`, autoMode.value ? 'auto' : 'review')
localStorage.setItem(`kin-mode-${props.id}`, autoMode.value ? 'auto_complete' : 'review')
try {
await api.patchProject(props.id, { execution_mode: autoMode.value ? 'auto' : 'review' })
if (project.value) project.value = { ...project.value, execution_mode: autoMode.value ? 'auto' : 'review' }
await api.patchProject(props.id, { execution_mode: autoMode.value ? 'auto_complete' : 'review' })
if (project.value) project.value = { ...project.value, execution_mode: autoMode.value ? 'auto_complete' : 'review' }
} catch (e: any) {
error.value = e.message
}
@ -640,7 +640,7 @@ async function addDecision() {
<Badge :text="t.status" :color="taskStatusColor(t.status)" />
<Badge v-if="t.category" :text="t.category" :color="CATEGORY_COLORS[t.category] || 'gray'" />
<span class="text-gray-300 truncate">{{ t.title }}</span>
<span v-if="t.execution_mode === 'auto'"
<span v-if="t.execution_mode === 'auto_complete'"
class="text-[10px] px-1 py-0.5 bg-yellow-900/40 text-yellow-400 border border-yellow-800 rounded shrink-0"
title="Auto mode">&#x1F513;</span>
<span v-if="t.parent_task_id" class="text-[10px] text-gray-600 shrink-0">from {{ t.parent_task_id }}</span>

View file

@ -43,14 +43,14 @@ function loadMode(t: typeof task.value) {
// Task is in review always show Approve/Reject regardless of localStorage
autoMode.value = false
} else {
autoMode.value = localStorage.getItem(`kin-mode-${t.project_id}`) === 'auto'
autoMode.value = localStorage.getItem(`kin-mode-${t.project_id}`) === 'auto_complete'
}
}
async function toggleMode() {
if (!task.value) return
autoMode.value = !autoMode.value
localStorage.setItem(`kin-mode-${task.value.project_id}`, autoMode.value ? 'auto' : 'review')
localStorage.setItem(`kin-mode-${task.value.project_id}`, autoMode.value ? 'auto_complete' : 'review')
try {
const updated = await api.patchTask(props.id, { execution_mode: autoMode.value ? 'auto_complete' : 'review' })
task.value = { ...task.value, ...updated }