feat(PBI-63): meerdere sprints per product + EXCLUDED + sprint-switcher (#161)
- Sprint lifecycle: ACTIVE→OPEN, COMPLETED→CLOSED, +ARCHIVED (FAILED behouden) - TaskStatus: +EXCLUDED (overgeslagen door agent-loop via bestaande TO_DO filter) - Cookie-gebaseerde actieve sprint per product (lib/active-sprint.ts) - Route splitsen: /products/[id]/sprint/[sprintId] + /sprint redirect-page - NavBar: gestapelde product/sprint dropdowns + BUILDING-badge derivatie - Backlog selectie-modus + nieuwe-sprint-dialog (createSprintWithPbisAction) - Migratie 20260507210000_sprint_lifecycle: ALTER TYPE RENAME (geen data-rewrite) - Version bump 1.0.0 → 1.2.0 Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
d68aa1e5e6
commit
4a9db57e94
43 changed files with 966 additions and 290 deletions
|
|
@ -25,7 +25,7 @@ const mockPrisma = prisma as unknown as {
|
|||
}
|
||||
const mockAuth = authenticateApiRequest as ReturnType<typeof vi.fn>
|
||||
|
||||
const SPRINT = { id: 'sprint-1', product_id: 'prod-1', status: 'ACTIVE' }
|
||||
const SPRINT = { id: 'sprint-1', product_id: 'prod-1', status: 'OPEN' }
|
||||
const STORY = {
|
||||
id: 'story-1',
|
||||
title: 'Account aanmaken',
|
||||
|
|
|
|||
|
|
@ -197,7 +197,7 @@ describe('GET /api/products/:id/next-story', () => {
|
|||
expect.objectContaining({
|
||||
where: expect.objectContaining({
|
||||
product_id: 'prod-other',
|
||||
status: 'ACTIVE',
|
||||
status: 'OPEN',
|
||||
product: expect.objectContaining({
|
||||
OR: expect.arrayContaining([{ user_id: 'user-1' }]),
|
||||
}),
|
||||
|
|
|
|||
|
|
@ -25,7 +25,7 @@ const mockPrisma = prisma as unknown as {
|
|||
}
|
||||
const mockAuth = authenticateApiRequest as ReturnType<typeof vi.fn>
|
||||
|
||||
const SPRINT = { id: 'sprint-1', product_id: 'prod-1', status: 'ACTIVE' }
|
||||
const SPRINT = { id: 'sprint-1', product_id: 'prod-1', status: 'OPEN' }
|
||||
|
||||
function makeTask(n: number) {
|
||||
return {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue