diff --git a/.pql/changelog/ticket_history/2026-05.sql b/.pql/changelog/ticket_history/2026-05.sql index 6cec1d7d..cb35fe99 100644 --- a/.pql/changelog/ticket_history/2026-05.sql +++ b/.pql/changelog/ticket_history/2026-05.sql @@ -2227,3 +2227,9 @@ INSERT INTO ticket_history (ticket_id, field, old_value, new_value, changed_by, INSERT INTO ticket_history (ticket_id, field, old_value, new_value, changed_by, changed_at, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('T-166', 'status', 'backlog', 'in_progress', NULL, '2026-05-25 06:23:55', '2026-05-25 06:23:55', '2026-05-25 06:23:55', NULL, '36cc84f2de6519355a55014b107ecea8', 1) ON CONFLICT(hash) DO NOTHING; INSERT INTO ticket_history (ticket_id, field, old_value, new_value, changed_by, changed_at, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('T-165', 'status', 'in_progress', 'done', NULL, '2026-05-25 06:29:25', '2026-05-25 06:29:25', '2026-05-25 06:29:25', NULL, '34961afff4d3384bced64de93c977460', 1) ON CONFLICT(hash) DO NOTHING; INSERT INTO ticket_history (ticket_id, field, old_value, new_value, changed_by, changed_at, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('T-166', 'status', 'in_progress', 'done', NULL, '2026-05-25 06:31:08', '2026-05-25 06:31:08', '2026-05-25 06:31:08', NULL, '3d6b8f30317a82d0aa810b6da47896be', 1) ON CONFLICT(hash) DO NOTHING; +INSERT INTO ticket_history (ticket_id, field, old_value, new_value, changed_by, changed_at, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('T-176', 'status', 'backlog', 'in_progress', NULL, '2026-05-25 07:11:44', '2026-05-25 07:11:44', '2026-05-25 07:11:44', NULL, '7be78982c929ee18d8665a8e662c380d', 1) ON CONFLICT(hash) DO NOTHING; +INSERT INTO ticket_history (ticket_id, field, old_value, new_value, changed_by, changed_at, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('T-177', 'status', 'backlog', 'in_progress', NULL, '2026-05-25 07:11:44', '2026-05-25 07:11:44', '2026-05-25 07:11:44', NULL, '855a73a398eb53240d12729ac47e0051', 1) ON CONFLICT(hash) DO NOTHING; +INSERT INTO ticket_history (ticket_id, field, old_value, new_value, changed_by, changed_at, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('T-175', 'status', 'backlog', 'in_progress', NULL, '2026-05-25 07:11:44', '2026-05-25 07:11:44', '2026-05-25 07:11:44', NULL, '8e9a19896103139fe8e43aa4b7212768', 1) ON CONFLICT(hash) DO NOTHING; +INSERT INTO ticket_history (ticket_id, field, old_value, new_value, changed_by, changed_at, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('T-175', 'status', 'in_progress', 'done', NULL, '2026-05-25 07:25:02', '2026-05-25 07:25:02', '2026-05-25 07:25:02', NULL, '3e63273af832240b9f782fc41ca0047d', 1) ON CONFLICT(hash) DO NOTHING; +INSERT INTO ticket_history (ticket_id, field, old_value, new_value, changed_by, changed_at, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('T-177', 'status', 'in_progress', 'done', NULL, '2026-05-25 07:25:02', '2026-05-25 07:25:02', '2026-05-25 07:25:02', NULL, '73982bc82e335f2d0fd80633aef0c082', 1) ON CONFLICT(hash) DO NOTHING; +INSERT INTO ticket_history (ticket_id, field, old_value, new_value, changed_by, changed_at, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('T-176', 'status', 'in_progress', 'done', NULL, '2026-05-25 07:27:57', '2026-05-25 07:27:57', '2026-05-25 07:27:57', NULL, '926d5d2694207c65d0f620b2834962aa', 1) ON CONFLICT(hash) DO NOTHING; diff --git a/.pql/changelog/tickets/2026-05.sql b/.pql/changelog/tickets/2026-05.sql index ac8a4330..0bce71f3 100644 --- a/.pql/changelog/tickets/2026-05.sql +++ b/.pql/changelog/tickets/2026-05.sql @@ -2746,3 +2746,6 @@ Make the actions always reachable per T-173''s acceptance: keep them in the tree Acceptance: copy + custom actions are reachable and activatable by keyboard alone (Tab to focus, Enter/Space to invoke) with no mouse; Semantics button labels present; widget test drives a copy via focus+activation (no hover); a11y gate green.', 'backlog', 'medium', NULL, NULL, 'D-77', '2026-05-24 17:11:17', '2026-05-24 17:11:17', NULL, '314da812ab94cd8467d14310d8ceaedf', 1) ON CONFLICT(id) DO UPDATE SET type=excluded.type, parent_id=excluded.parent_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash); INSERT INTO tickets (id, type, parent_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('T-165', 'task', 'T-164', 'P1: stream-json transport — drive the Claude pane via the control protocol', 'Spawn the Claude pane as ''claude --input-format stream-json --output-format stream-json --verbose'' (+ --include-partial-messages later) instead of an interactive TUI in tmux. Multiplex its stdin/stdout; parse the event stream (system/init, assistant, tool_use, tool_result, result, rate_limit_event); feed the existing ConversationController/MessageBus from events rather than tailing the transcript JSONL. Isolate the protocol behind one module (the drift-containment point, like the transcript reader). Acceptance: a Claude pane converses end-to-end over stream-json (send a prompt, stream the reply) with no tmux session; events drive the native conversation view; unit tests against canned event fixtures. Blocks the rest of phase 1. Evolves D-75 (rendering now sourced from events).', 'done', 'high', NULL, NULL, 'D-77', '2026-05-24 16:26:15', '2026-05-25 06:29:25', NULL, '7412d6cc50f12cf6744b233a693fe0d7', 1) ON CONFLICT(id) DO UPDATE SET type=excluded.type, parent_id=excluded.parent_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash); INSERT INTO tickets (id, type, parent_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('T-166', 'task', 'T-164', 'P1: native permission + AskUserQuestion prompts via canUseTool', 'Handle interactive prompts that the TUI model couldn''t surface. Wire Claude''s permission requests and the AskUserQuestion tool through the control mechanism (--permission-prompt-tool / SDK-style canUseTool: toolName + input, return allow/deny or the chosen answers). Render NATIVE prompt cards in the Claude pane — allow/deny for permissions, an option picker (matching AskUserQuestion''s questions/options) for AskUserQuestion — and return the user''s choice over the protocol. Acceptance: asking Claude for an AskUserQuestion shows selectable options inline and the selection is delivered; a tool needing permission shows allow/deny and the decision flows back; widget tests for the prompt cards + a fake control channel. Closes the prompt gap that motivated D-77. Blocked by T-165.', 'done', 'high', NULL, NULL, 'D-77', '2026-05-24 16:26:23', '2026-05-25 06:31:08', NULL, 'f977efccacc49cfbf0c83a465c137479', 1) ON CONFLICT(id) DO UPDATE SET type=excluded.type, parent_id=excluded.parent_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash); +INSERT INTO tickets (id, type, parent_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('T-175', 'task', 'T-164', 'Permission prompt: Allow / Allow-and-remember / Deny+note', 'Bottom-zone permission card (prompt_card.dart): replace binary Allow/Deny with three options. (1) Allow -> allow{updatedInput}. (2) Allow and do not ask again -> shown only when the can_use_tool request carries a permission_suggestions entry (session/localSettings destination); returns allow{updatedInput, updatedPermissions:[suggestion]}. AllowTool gains an optional updatedPermissions field; ToolPrompt + StreamJsonSession carry the request permission_suggestions through. (3) Deny -> reveals an optional note field -> deny{message}. Plus allow-with-note: clide sends the typed note as a follow-up user message right after allowing (protocol has no allow-with-message per D-78; closest faithful approximation). Acceptance: three options render (option 2 only when a suggestion exists); allow / deny / updatedPermissions / deny-note all flow over the control channel; allow+note sends a follow-up; widget + transport tests. Wireframe: docs/design/wireframes/claude-prompts/04-permission.png', 'done', 'high', NULL, NULL, 'D-78', '2026-05-25 07:11:09', '2026-05-25 07:25:02', NULL, 'ae547748304f0b6b388338ed501dfb60', 1) ON CONFLICT(id) DO UPDATE SET type=excluded.type, parent_id=excluded.parent_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash); +INSERT INTO tickets (id, type, parent_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('T-177', 'task', 'T-164', 'Conversation cards: collapse tool_use/tool_result only when multi-line', 'tool_use and tool_result conversation cards start collapsed ONLY when their body is multi-line; single-line bodies render inline (collapse bulk, not chrome - if it fits on one line, just show it). Collapsed header shows a one-line summary (tool_use: tool + key arg, e.g. Write /tmp/x; tool_result: first line or byte size). thinking already collapses; user/assistant text stay expanded. Acceptance: a one-line result renders inline with no caret; a multi-line result starts collapsed with a summary header; widget tests. Relates to T-173 (ConversationCard primitive).', 'done', 'medium', NULL, NULL, 'D-78', '2026-05-25 07:11:22', '2026-05-25 07:25:02', NULL, 'f4a0e3207adf3134901fbee447e2824b', 1) ON CONFLICT(id) DO UPDATE SET type=excluded.type, parent_id=excluded.parent_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash); +INSERT INTO tickets (id, type, parent_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('T-176', 'task', 'T-164', 'AskUserQuestion native picker: stepper + review, Other, per-choice note', 'Overhaul the AskUserQuestion bottom-zone card (prompt_card.dart). Single question -> no stepper, bare question + options. Multiple (2-4) -> stepper: top nav showing "N - Header" per step (check on answered, box on current) + prev/next arrows, one question at a time with Back/Next, then a Review screen (question -> answer, Back / Submit answers). Each question: numbered option buttons (1-4) + an Other choice that reveals a free-text field (typed text becomes the answer value, not the word Other) + a +note affordance on a picked option (answer becomes Label - note). multiSelect toggles and comma-joins labels. A chat-instead escape denies the prompt (message: user chose to chat instead) and refocuses the composer. On submit -> allow{updatedInput:{questions, answers}} -> card closes -> clide appends a compact answered echo item to the conversation log. Acceptance: single vs multi layouts; Other + note produce correct answer strings; review step; chat-instead denies + refocuses; widget tests. Wireframes: docs/design/wireframes/claude-prompts/ (01 single, 02 stepper, 03 review).', 'done', 'high', NULL, NULL, 'D-78', '2026-05-25 07:11:16', '2026-05-25 07:27:57', NULL, 'c63148c0b3d03a97b5ccc7e75133916d', 1) ON CONFLICT(id) DO UPDATE SET type=excluded.type, parent_id=excluded.parent_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash); diff --git a/docs/design/wireframes/claude-prompts/01-askuserquestion-single.json b/docs/design/wireframes/claude-prompts/01-askuserquestion-single.json new file mode 100644 index 00000000..7f7e369c --- /dev/null +++ b/docs/design/wireframes/claude-prompts/01-askuserquestion-single.json @@ -0,0 +1,83 @@ +{ + "name": "Clide — AskUserQuestion (single)", + "shapes": { + "panel": { + "type": "Rectangle", + "left": 40, "top": 40, "width": 840, "height": 330, + "fillColor": "#1a1e24", "strokeColor": "#333340", "corners": [8, 8, 8, 8] + }, + "accent": { + "type": "Rectangle", + "left": 40, "top": 40, "width": 840, "height": 4, + "fillColor": "#5aa0e0", "strokeColor": "#5aa0e0", "corners": [8, 8, 0, 0] + }, + "label": { + "type": "Text", "parent": "panel", "left": 64, "top": 60, + "text": "question", "fontColor": "#5aa0e0", "fontSize": 13 + }, + "qtext": { + "type": "Text", "parent": "panel", "left": 64, "top": 86, + "text": "Which fruit is your favorite?", "fontColor": "#c8d0e0", "fontSize": 17 + }, + "opt-banana": { + "type": "Rectangle", "parent": "panel", "left": 64, "top": 126, "width": 150, "height": 34, + "fillColor": "#27406a", "strokeColor": "#5aa0e0", "corners": [4, 4, 4, 4] + }, + "opt-banana-t": { + "type": "Text", "parent": "panel", "left": 78, "top": 134, + "text": "① Banana", "fontColor": "#dbe6f5", "fontSize": 14 + }, + "opt-apple": { + "type": "Rectangle", "parent": "panel", "left": 224, "top": 126, "width": 130, "height": 34, + "fillColor": "#2a3040", "strokeColor": "#333340", "corners": [4, 4, 4, 4] + }, + "opt-apple-t": { + "type": "Text", "parent": "panel", "left": 238, "top": 134, + "text": "② Apple", "fontColor": "#c8d0e0", "fontSize": 14 + }, + "opt-mango": { + "type": "Rectangle", "parent": "panel", "left": 364, "top": 126, "width": 130, "height": 34, + "fillColor": "#2a3040", "strokeColor": "#333340", "corners": [4, 4, 4, 4] + }, + "opt-mango-t": { + "type": "Text", "parent": "panel", "left": 378, "top": 134, + "text": "③ Mango", "fontColor": "#c8d0e0", "fontSize": 14 + }, + "opt-other": { + "type": "Rectangle", "parent": "panel", "left": 504, "top": 126, "width": 130, "height": 34, + "fillColor": "#1f242c", "strokeColor": "#3a4250", "corners": [4, 4, 4, 4] + }, + "opt-other-t": { + "type": "Text", "parent": "panel", "left": 518, "top": 134, + "text": "Other…", "fontColor": "#9aa4b2", "fontSize": 14 + }, + "note-hint": { + "type": "Text", "parent": "panel", "left": 64, "top": 176, + "text": "✎ add a note to your choice (optional)", "fontColor": "#7a8290", "fontSize": 12 + }, + "note-field": { + "type": "Rectangle", "parent": "panel", "left": 64, "top": 198, "width": 752, "height": 32, + "fillColor": "#14181d", "strokeColor": "#333340", "corners": [4, 4, 4, 4] + }, + "note-field-t": { + "type": "Text", "parent": "panel", "left": 78, "top": 206, + "text": "optional note…", "fontColor": "#5b6470", "fontSize": 13 + }, + "divider": { + "type": "Line", "parent": "panel", "left": 64, "top": 256, "width": 752, "height": 1, + "strokeColor": "#2a3038" + }, + "submit": { + "type": "Rectangle", "parent": "panel", "left": 64, "top": 276, "width": 120, "height": 34, + "fillColor": "#3b5bdb", "strokeColor": "#3b5bdb", "corners": [4, 4, 4, 4] + }, + "submit-t": { + "type": "Text", "parent": "panel", "left": 96, "top": 284, + "text": "Submit", "fontColor": "#ffffff", "fontSize": 14 + }, + "chat": { + "type": "Text", "parent": "panel", "left": 700, "top": 284, + "text": "› chat instead", "fontColor": "#7a8290", "fontSize": 13 + } + } +} diff --git a/docs/design/wireframes/claude-prompts/01-askuserquestion-single.png b/docs/design/wireframes/claude-prompts/01-askuserquestion-single.png new file mode 100644 index 00000000..cd05f6d4 Binary files /dev/null and b/docs/design/wireframes/claude-prompts/01-askuserquestion-single.png differ diff --git a/docs/design/wireframes/claude-prompts/02-askuserquestion-stepper.json b/docs/design/wireframes/claude-prompts/02-askuserquestion-stepper.json new file mode 100644 index 00000000..981159c7 --- /dev/null +++ b/docs/design/wireframes/claude-prompts/02-askuserquestion-stepper.json @@ -0,0 +1,100 @@ +{ + "name": "Clide — AskUserQuestion (stepper)", + "shapes": { + "panel": { + "type": "Rectangle", + "left": 40, "top": 40, "width": 840, "height": 330, + "fillColor": "#1a1e24", "strokeColor": "#333340", "corners": [8, 8, 8, 8] + }, + "accent": { + "type": "Rectangle", "left": 40, "top": 40, "width": 840, "height": 4, + "fillColor": "#5aa0e0", "strokeColor": "#5aa0e0", "corners": [8, 8, 0, 0] + }, + "nav-left": { + "type": "Text", "parent": "panel", "left": 64, "top": 62, "text": "‹", "fontColor": "#7a8290", "fontSize": 16 + }, + "chip-pet-t": { + "type": "Text", "parent": "panel", "left": 88, "top": 64, "text": "1 · Pet ✓", "fontColor": "#5cb87a", "fontSize": 13 + }, + "chip-eaten": { + "type": "Rectangle", "parent": "panel", "left": 188, "top": 58, "width": 120, "height": 26, + "fillColor": "#27406a", "strokeColor": "#5aa0e0", "corners": [4, 4, 4, 4] + }, + "chip-eaten-t": { + "type": "Text", "parent": "panel", "left": 200, "top": 64, "text": "2 · Eaten", "fontColor": "#dbe6f5", "fontSize": 13 + }, + "chip-review-t": { + "type": "Text", "parent": "panel", "left": 326, "top": 64, "text": "Review", "fontColor": "#7a8290", "fontSize": 13 + }, + "nav-right": { + "type": "Text", "parent": "panel", "left": 404, "top": 62, "text": "›", "fontColor": "#7a8290", "fontSize": 16 + }, + "step-count": { + "type": "Text", "parent": "panel", "left": 770, "top": 64, "text": "2 of 2", "fontColor": "#5b6470", "fontSize": 12 + }, + "divider-top": { + "type": "Line", "parent": "panel", "left": 64, "top": 94, "width": 752, "height": 1, "strokeColor": "#2a3038" + }, + "header": { + "type": "Text", "parent": "panel", "left": 64, "top": 106, "text": "EATEN", "fontColor": "#7a8290", "fontSize": 12 + }, + "qtext": { + "type": "Text", "parent": "panel", "left": 64, "top": 126, "text": "How do you most often eat your fruit?", "fontColor": "#c8d0e0", "fontSize": 16 + }, + "opt-fresh": { + "type": "Rectangle", "parent": "panel", "left": 64, "top": 162, "width": 160, "height": 34, + "fillColor": "#27406a", "strokeColor": "#5aa0e0", "corners": [4, 4, 4, 4] + }, + "opt-fresh-t": { + "type": "Text", "parent": "panel", "left": 78, "top": 170, "text": "① Fresh / whole", "fontColor": "#dbe6f5", "fontSize": 14 + }, + "opt-smoothie": { + "type": "Rectangle", "parent": "panel", "left": 234, "top": 162, "width": 140, "height": 34, + "fillColor": "#2a3040", "strokeColor": "#333340", "corners": [4, 4, 4, 4] + }, + "opt-smoothie-t": { + "type": "Text", "parent": "panel", "left": 248, "top": 170, "text": "② Smoothie", "fontColor": "#c8d0e0", "fontSize": 14 + }, + "opt-salad": { + "type": "Rectangle", "parent": "panel", "left": 384, "top": 162, "width": 120, "height": 34, + "fillColor": "#2a3040", "strokeColor": "#333340", "corners": [4, 4, 4, 4] + }, + "opt-salad-t": { + "type": "Text", "parent": "panel", "left": 398, "top": 170, "text": "③ Salad", "fontColor": "#c8d0e0", "fontSize": 14 + }, + "opt-other": { + "type": "Rectangle", "parent": "panel", "left": 514, "top": 162, "width": 120, "height": 34, + "fillColor": "#1f242c", "strokeColor": "#3a4250", "corners": [4, 4, 4, 4] + }, + "opt-other-t": { + "type": "Text", "parent": "panel", "left": 528, "top": 170, "text": "Other…", "fontColor": "#9aa4b2", "fontSize": 14 + }, + "note-field": { + "type": "Rectangle", "parent": "panel", "left": 64, "top": 212, "width": 752, "height": 30, + "fillColor": "#14181d", "strokeColor": "#333340", "corners": [4, 4, 4, 4] + }, + "note-field-t": { + "type": "Text", "parent": "panel", "left": 78, "top": 219, "text": "✎ add a note (optional)", "fontColor": "#5b6470", "fontSize": 12 + }, + "divider-bot": { + "type": "Line", "parent": "panel", "left": 64, "top": 262, "width": 752, "height": 1, "strokeColor": "#2a3038" + }, + "back": { + "type": "Rectangle", "parent": "panel", "left": 64, "top": 278, "width": 86, "height": 34, + "fillColor": "#1f242c", "strokeColor": "#3a4250", "corners": [4, 4, 4, 4] + }, + "back-t": { + "type": "Text", "parent": "panel", "left": 84, "top": 286, "text": "‹ Back", "fontColor": "#9aa4b2", "fontSize": 14 + }, + "next": { + "type": "Rectangle", "parent": "panel", "left": 160, "top": 278, "width": 110, "height": 34, + "fillColor": "#3b5bdb", "strokeColor": "#3b5bdb", "corners": [4, 4, 4, 4] + }, + "next-t": { + "type": "Text", "parent": "panel", "left": 188, "top": 286, "text": "Next ›", "fontColor": "#ffffff", "fontSize": 14 + }, + "chat": { + "type": "Text", "parent": "panel", "left": 700, "top": 286, "text": "› chat instead", "fontColor": "#7a8290", "fontSize": 13 + } + } +} diff --git a/docs/design/wireframes/claude-prompts/02-askuserquestion-stepper.png b/docs/design/wireframes/claude-prompts/02-askuserquestion-stepper.png new file mode 100644 index 00000000..931853cf Binary files /dev/null and b/docs/design/wireframes/claude-prompts/02-askuserquestion-stepper.png differ diff --git a/docs/design/wireframes/claude-prompts/03-askuserquestion-review.json b/docs/design/wireframes/claude-prompts/03-askuserquestion-review.json new file mode 100644 index 00000000..94e58922 --- /dev/null +++ b/docs/design/wireframes/claude-prompts/03-askuserquestion-review.json @@ -0,0 +1,48 @@ +{ + "name": "Clide — AskUserQuestion (review)", + "shapes": { + "panel": { + "type": "Rectangle", "left": 40, "top": 40, "width": 840, "height": 270, + "fillColor": "#1a1e24", "strokeColor": "#333340", "corners": [8, 8, 8, 8] + }, + "accent": { + "type": "Rectangle", "left": 40, "top": 40, "width": 840, "height": 4, + "fillColor": "#5cb87a", "strokeColor": "#5cb87a", "corners": [8, 8, 0, 0] + }, + "label": { + "type": "Text", "parent": "panel", "left": 64, "top": 60, "text": "review", "fontColor": "#5cb87a", "fontSize": 13 + }, + "header": { + "type": "Text", "parent": "panel", "left": 64, "top": 84, "text": "Review your answers", "fontColor": "#c8d0e0", "fontSize": 16 + }, + "row1-q": { + "type": "Text", "parent": "panel", "left": 64, "top": 124, "text": "Pet", "fontColor": "#7a8290", "fontSize": 13 + }, + "row1-a": { + "type": "Text", "parent": "panel", "left": 180, "top": 124, "text": "→ Banana — only the big ripe ones", "fontColor": "#c8d0e0", "fontSize": 14 + }, + "row2-q": { + "type": "Text", "parent": "panel", "left": 64, "top": 152, "text": "Eaten", "fontColor": "#7a8290", "fontSize": 13 + }, + "row2-a": { + "type": "Text", "parent": "panel", "left": 180, "top": 152, "text": "→ Fresh / whole", "fontColor": "#c8d0e0", "fontSize": 14 + }, + "divider": { + "type": "Line", "parent": "panel", "left": 64, "top": 196, "width": 752, "height": 1, "strokeColor": "#2a3038" + }, + "back": { + "type": "Rectangle", "parent": "panel", "left": 64, "top": 214, "width": 86, "height": 34, + "fillColor": "#1f242c", "strokeColor": "#3a4250", "corners": [4, 4, 4, 4] + }, + "back-t": { + "type": "Text", "parent": "panel", "left": 84, "top": 222, "text": "‹ Back", "fontColor": "#9aa4b2", "fontSize": 14 + }, + "submit": { + "type": "Rectangle", "parent": "panel", "left": 160, "top": 214, "width": 160, "height": 34, + "fillColor": "#2f9e44", "strokeColor": "#2f9e44", "corners": [4, 4, 4, 4] + }, + "submit-t": { + "type": "Text", "parent": "panel", "left": 188, "top": 222, "text": "Submit answers", "fontColor": "#ffffff", "fontSize": 14 + } + } +} diff --git a/docs/design/wireframes/claude-prompts/03-askuserquestion-review.png b/docs/design/wireframes/claude-prompts/03-askuserquestion-review.png new file mode 100644 index 00000000..f4b147fc Binary files /dev/null and b/docs/design/wireframes/claude-prompts/03-askuserquestion-review.png differ diff --git a/docs/design/wireframes/claude-prompts/04-permission.json b/docs/design/wireframes/claude-prompts/04-permission.json new file mode 100644 index 00000000..d92b2b06 --- /dev/null +++ b/docs/design/wireframes/claude-prompts/04-permission.json @@ -0,0 +1,60 @@ +{ + "name": "Clide — permission prompt", + "shapes": { + "panel": { + "type": "Rectangle", "left": 40, "top": 40, "width": 840, "height": 300, + "fillColor": "#1a1e24", "strokeColor": "#333340", "corners": [8, 8, 8, 8] + }, + "accent": { + "type": "Rectangle", "left": 40, "top": 40, "width": 840, "height": 4, + "fillColor": "#d9a441", "strokeColor": "#d9a441", "corners": [8, 8, 0, 0] + }, + "label": { + "type": "Text", "parent": "panel", "left": 64, "top": 60, "text": "permission · Write", "fontColor": "#d9a441", "fontSize": 14 + }, + "desc": { + "type": "Text", "parent": "panel", "left": 64, "top": 86, "text": "/tmp/banana.txt", "fontColor": "#9aa4b2", "fontSize": 13 + }, + "opt-allow": { + "type": "Rectangle", "parent": "panel", "left": 64, "top": 118, "width": 120, "height": 34, + "fillColor": "#2f9e44", "strokeColor": "#2f9e44", "corners": [4, 4, 4, 4] + }, + "opt-allow-t": { + "type": "Text", "parent": "panel", "left": 86, "top": 126, "text": "① Allow", "fontColor": "#ffffff", "fontSize": 14 + }, + "opt-always": { + "type": "Rectangle", "parent": "panel", "left": 194, "top": 118, "width": 230, "height": 34, + "fillColor": "#2a3040", "strokeColor": "#333340", "corners": [4, 4, 4, 4] + }, + "opt-always-t": { + "type": "Text", "parent": "panel", "left": 208, "top": 126, "text": "② Allow & don't ask again", "fontColor": "#c8d0e0", "fontSize": 14 + }, + "opt-deny": { + "type": "Rectangle", "parent": "panel", "left": 434, "top": 118, "width": 110, "height": 34, + "fillColor": "#3a2630", "strokeColor": "#c0506a", "corners": [4, 4, 4, 4] + }, + "opt-deny-t": { + "type": "Text", "parent": "panel", "left": 456, "top": 126, "text": "③ Deny", "fontColor": "#e58ba0", "fontSize": 14 + }, + "deny-hint": { + "type": "Text", "parent": "panel", "left": 64, "top": 174, "text": "tell Claude what to do differently (optional)", "fontColor": "#7a8290", "fontSize": 12 + }, + "deny-field": { + "type": "Rectangle", "parent": "panel", "left": 64, "top": 196, "width": 752, "height": 32, + "fillColor": "#14181d", "strokeColor": "#333340", "corners": [4, 4, 4, 4] + }, + "deny-field-t": { + "type": "Text", "parent": "panel", "left": 78, "top": 204, "text": "tell Claude what to do differently…", "fontColor": "#5b6470", "fontSize": 13 + }, + "divider": { + "type": "Line", "parent": "panel", "left": 64, "top": 252, "width": 752, "height": 1, "strokeColor": "#2a3038" + }, + "send-deny": { + "type": "Rectangle", "parent": "panel", "left": 64, "top": 266, "width": 130, "height": 34, + "fillColor": "#c0392b", "strokeColor": "#c0392b", "corners": [4, 4, 4, 4] + }, + "send-deny-t": { + "type": "Text", "parent": "panel", "left": 86, "top": 274, "text": "Deny + note", "fontColor": "#ffffff", "fontSize": 14 + } + } +} diff --git a/docs/design/wireframes/claude-prompts/04-permission.png b/docs/design/wireframes/claude-prompts/04-permission.png new file mode 100644 index 00000000..2acc47d1 Binary files /dev/null and b/docs/design/wireframes/claude-prompts/04-permission.png differ