feat(ST-1102): add 4 question-channel MCP tools (M11)
Vier nieuwe tools voor het Claude vraag-antwoord-kanaal: - ask_user_question (write): post een gestructureerde vraag aan de actieve Scrum4Me-gebruiker over een story; default async (returnt direct met question_id + status='open'); optionele wait_seconds (max 600) polt elke 2s tot het antwoord er is of timeout — daarna status='pending' zodat Claude met get_question_answer later kan ophalen - get_question_answer (read): huidige status + antwoord van een eerder gestelde vraag - list_open_questions (read): eigen vragen met status open/answered, max 50, meest recente eerst - cancel_question (write, asker-only): atomic UPDATE WHERE asked_by + status= 'open' zodat alleen eigen open vragen geannuleerd worden Allemaal achter access-check via userCanAccessStory/Product en demo-blok via requireWriteAccess (volgt patroon van create-todo en bestaande log-tools). Submodule vendor/scrum4me bumpt naar Scrum4Me commit 79367dd (M11 ST-1101) — bevat het ClaudeQuestion-model en notify_question_change-trigger waar deze tools tegen werken. scripts/smoke-test.ts: 13 tools verwacht (was 9); list_open_questions toegevoegd als read-tool-coverage. Build + tools/list groen — verdere e2e via MCP Inspector na PR-merge omdat de seed een nieuwe API-token heeft gegenereerd en .env een nieuwe waarde nodig heeft. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
2f82241696
commit
7b955d31ac
9 changed files with 361 additions and 2 deletions
|
|
@ -62,6 +62,8 @@ model User {
|
|||
product_members ProductMember[]
|
||||
assigned_stories Story[] @relation("StoryAssignee")
|
||||
login_pairings LoginPairing[]
|
||||
asked_questions ClaudeQuestion[] @relation("ClaudeQuestionAsker")
|
||||
answered_questions ClaudeQuestion[] @relation("ClaudeQuestionAnswerer")
|
||||
|
||||
@@index([active_product_id])
|
||||
@@map("users")
|
||||
|
|
@ -108,6 +110,7 @@ model Product {
|
|||
todos Todo[]
|
||||
members ProductMember[]
|
||||
active_for_users User[] @relation("UserActiveProduct")
|
||||
claude_questions ClaudeQuestion[]
|
||||
|
||||
@@unique([user_id, name])
|
||||
@@unique([user_id, code])
|
||||
|
|
@ -154,6 +157,7 @@ model Story {
|
|||
updated_at DateTime @updatedAt
|
||||
logs StoryLog[]
|
||||
tasks Task[]
|
||||
claude_questions ClaudeQuestion[]
|
||||
|
||||
@@unique([product_id, code])
|
||||
@@index([pbi_id, priority, sort_order])
|
||||
|
|
@ -208,6 +212,7 @@ model Task {
|
|||
status TaskStatus @default(TO_DO)
|
||||
created_at DateTime @default(now())
|
||||
updated_at DateTime @updatedAt
|
||||
claude_questions ClaudeQuestion[]
|
||||
|
||||
@@index([story_id, priority, sort_order])
|
||||
@@index([sprint_id, status])
|
||||
|
|
@ -263,3 +268,29 @@ model LoginPairing {
|
|||
@@index([status, expires_at])
|
||||
@@map("login_pairings")
|
||||
}
|
||||
|
||||
model ClaudeQuestion {
|
||||
id String @id @default(cuid())
|
||||
story Story @relation(fields: [story_id], references: [id], onDelete: Cascade)
|
||||
story_id String
|
||||
task Task? @relation(fields: [task_id], references: [id], onDelete: SetNull)
|
||||
task_id String?
|
||||
product Product @relation(fields: [product_id], references: [id], onDelete: Cascade)
|
||||
product_id String // gedenormaliseerd uit story.product_id voor SSE-filter
|
||||
asker User @relation("ClaudeQuestionAsker", fields: [asked_by], references: [id])
|
||||
asked_by String // user_id van token-houder (= Claude-token)
|
||||
question String @db.Text
|
||||
options Json? // string[] voor multi-choice; null voor free-text
|
||||
status String // 'open' | 'answered' | 'cancelled' | 'expired'
|
||||
answer String? @db.Text
|
||||
answerer User? @relation("ClaudeQuestionAnswerer", fields: [answered_by], references: [id])
|
||||
answered_by String?
|
||||
answered_at DateTime?
|
||||
created_at DateTime @default(now())
|
||||
expires_at DateTime // ingesteld door MCP-tool, default now() + 24h
|
||||
|
||||
@@index([story_id, status])
|
||||
@@index([product_id, status])
|
||||
@@index([status, expires_at])
|
||||
@@map("claude_questions")
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue