Webapp had Prisma-schema migrated: SprintStatus.ACTIVE→OPEN,
SprintStatus.COMPLETED→CLOSED, plus new SprintStatus.ARCHIVED. Also new
TaskStatus.EXCLUDED. scrum4me-mcp Prisma client was 110 commits behind,
causing runtime errors when reading sprint.status from the live DB:
Value 'OPEN' not found in enum 'SprintStatus'
Symptom: TASK_IMPLEMENTATION jobs in QUEUED status were claimed by
tryClaimJob (raw SQL succeeds), then getFullJobContext crashed on the
findUnique with the enum error → rollbackClaim → loop forever until
UNHEALTHY (5 consecutive failures).
Fix:
- Updated vendor/scrum4me submodule to current main (3c77342).
- Re-ran sync-schema.sh → prisma/schema.prisma now has
SprintStatus { OPEN, CLOSED, ARCHIVED, FAILED } and
TaskStatus including EXCLUDED.
- src/lib/tasks-status-update.ts: ACTIVE→OPEN, COMPLETED→CLOSED.
- src/status.ts: TASK_DB_TO_API + TASK_API_TO_DB krijgen EXCLUDED entry.
- src/tools/get-claude-context.ts: status: 'ACTIVE' → status: 'OPEN'.
Tests: 340 passed (38 files). Typecheck OK.
Na merge + docker rebuild met cache-bust pakt de runner sprint-tasks weer
op zonder enum-error.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
55 lines
1.4 KiB
TypeScript
55 lines
1.4 KiB
TypeScript
import type { TaskStatus, StoryStatus } from '@prisma/client'
|
|
|
|
const TASK_DB_TO_API = {
|
|
TO_DO: 'todo',
|
|
IN_PROGRESS: 'in_progress',
|
|
REVIEW: 'review',
|
|
DONE: 'done',
|
|
FAILED: 'failed',
|
|
EXCLUDED: 'excluded',
|
|
} as const satisfies Record<TaskStatus, string>
|
|
|
|
const TASK_API_TO_DB: Record<string, TaskStatus> = {
|
|
todo: 'TO_DO',
|
|
in_progress: 'IN_PROGRESS',
|
|
review: 'REVIEW',
|
|
done: 'DONE',
|
|
failed: 'FAILED',
|
|
excluded: 'EXCLUDED',
|
|
}
|
|
|
|
const STORY_DB_TO_API = {
|
|
OPEN: 'open',
|
|
IN_SPRINT: 'in_sprint',
|
|
DONE: 'done',
|
|
FAILED: 'failed',
|
|
} as const satisfies Record<StoryStatus, string>
|
|
|
|
const STORY_API_TO_DB: Record<string, StoryStatus> = {
|
|
open: 'OPEN',
|
|
in_sprint: 'IN_SPRINT',
|
|
done: 'DONE',
|
|
failed: 'FAILED',
|
|
}
|
|
|
|
export type TaskStatusApi = (typeof TASK_DB_TO_API)[TaskStatus]
|
|
export type StoryStatusApi = (typeof STORY_DB_TO_API)[StoryStatus]
|
|
|
|
export function taskStatusToApi(s: TaskStatus): TaskStatusApi {
|
|
return TASK_DB_TO_API[s]
|
|
}
|
|
|
|
export function taskStatusFromApi(s: string): TaskStatus | null {
|
|
return TASK_API_TO_DB[s.toLowerCase()] ?? null
|
|
}
|
|
|
|
export function storyStatusToApi(s: StoryStatus): StoryStatusApi {
|
|
return STORY_DB_TO_API[s]
|
|
}
|
|
|
|
export function storyStatusFromApi(s: string): StoryStatus | null {
|
|
return STORY_API_TO_DB[s.toLowerCase()] ?? null
|
|
}
|
|
|
|
export const TASK_STATUS_API_VALUES = Object.values(TASK_DB_TO_API)
|
|
export const STORY_STATUS_API_VALUES = Object.values(STORY_DB_TO_API)
|