Voorbereidende wijzigingen voor de queue-loop-refactor (zie
docs/plans/queue-loop-extraction.md in Scrum4Me-repo). Maakt scrum4me-mcp
geschikt als gedeelde library voor de nieuwe scrum4me-docker runner.
- T-13: export getFullJobContext uit src/tools/wait-for-job.ts
- T-14: mapBudgetToEffort(budget) → --effort {medium,high,xhigh,max} mapping
voor Claude CLI 2.1.x (heeft geen --thinking-budget). Comment in header
documenteert dat max_turns audit-only is en de CLI-flag-mapping.
- T-15: KIND_DEFAULTS.allowed_tools van null → expliciete lijsten zonder
wait_for_job/check_queue_empty/get_idea_context. Vangrail tegen recursieve
claims. SPRINT_IMPLEMENTATION mist bewust job_heartbeat (runner doet
lease-renewal).
- T-16: src/lib/idea-prompts.ts → src/lib/kind-prompts.ts. Nieuwe export
getKindPromptText voor alle 5 kinds. Back-compat re-export
getIdeaPromptText behouden zodat wait-for-job.ts:508 ongewijzigd werkt.
- T-17: nieuwe prompts src/prompts/task/implementation.md,
sprint/implementation.md, plan-chat/chat.md. Idea-prompts (M12) ongewijzigd.
Tests: 334 passed (38 files). 27 nieuwe asserts: mapBudgetToEffort
grenswaarden (14), KIND_DEFAULTS.allowed_tools structurele checks (6),
kind-prompts loading + verboden-tool-mentions (13).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
48 lines
1.5 KiB
TypeScript
48 lines
1.5 KiB
TypeScript
import { describe, it, expect } from 'vitest'
|
|
import type { ClaudeJobKind } from '@prisma/client'
|
|
import { getKindPromptText, getIdeaPromptText } from '../src/lib/kind-prompts.js'
|
|
|
|
const KINDS: ClaudeJobKind[] = [
|
|
'IDEA_GRILL',
|
|
'IDEA_MAKE_PLAN',
|
|
'TASK_IMPLEMENTATION',
|
|
'SPRINT_IMPLEMENTATION',
|
|
'PLAN_CHAT',
|
|
]
|
|
|
|
describe('getKindPromptText', () => {
|
|
it.each(KINDS)('returnt non-empty content voor %s', (kind) => {
|
|
const text = getKindPromptText(kind)
|
|
expect(text.length).toBeGreaterThan(0)
|
|
})
|
|
|
|
it('TASK_IMPLEMENTATION-prompt verbiedt wait_for_job', () => {
|
|
const text = getKindPromptText('TASK_IMPLEMENTATION')
|
|
expect(text).toMatch(/GEEN.*wait_for_job/)
|
|
})
|
|
|
|
it('SPRINT_IMPLEMENTATION-prompt verbiedt job_heartbeat', () => {
|
|
const text = getKindPromptText('SPRINT_IMPLEMENTATION')
|
|
expect(text).toMatch(/GEEN.*job_heartbeat/)
|
|
})
|
|
|
|
it.each(['TASK_IMPLEMENTATION', 'SPRINT_IMPLEMENTATION', 'PLAN_CHAT'] as const)(
|
|
'%s-prompt noemt $PAYLOAD_PATH als variabele',
|
|
(kind) => {
|
|
const text = getKindPromptText(kind)
|
|
expect(text).toContain('$PAYLOAD_PATH')
|
|
},
|
|
)
|
|
})
|
|
|
|
describe('getIdeaPromptText (back-compat)', () => {
|
|
it('returnt content voor IDEA_GRILL', () => {
|
|
expect(getIdeaPromptText('IDEA_GRILL').length).toBeGreaterThan(0)
|
|
})
|
|
it('returnt content voor IDEA_MAKE_PLAN', () => {
|
|
expect(getIdeaPromptText('IDEA_MAKE_PLAN').length).toBeGreaterThan(0)
|
|
})
|
|
it('returnt empty string voor non-idea kind', () => {
|
|
expect(getIdeaPromptText('TASK_IMPLEMENTATION')).toBe('')
|
|
})
|
|
})
|