name: case description: "Opens a browser UI for the user to answer multiple-choice design/policy decisions with recommended defaults, per-question free-text override, and shared notes; returns structured JSON. TRIGGER when about to enumerate '1. X? 2. Y? 3. Z?' style questions in chat, or when presenting 2+ decisions at once, or when a single decision has a clear recommendation worth an explicit ack. トリガー: 「いくつか方針を決めて」「選択肢を整理して」「推奨つきで意思決定したい」「〜にするか〜にするか」。SKIP: a single yes/no confirmation, or a question whose answer is derivable from code/conversation." allowed-tools: Bash(python3:*), Read, Write
case
When you need the user to make one or more multiple-choice decisions, use this skill instead of asking via plain-text enumerated prompts. A local web UI opens in the user's browser with:
- A card per option (the recommended one carries a small
recommendedbadge) - A one-line reason shown under each question title
- An optional "Free word" input per question (caveats, counter-proposals)
- A shared "Notes" field for overall context
- Keyboard shortcuts:
↑↓/j kto move,1–9to pick,Ato accept all recommendations,⌘↩to submit
The process mirrors crit: launch in the background, the user submits, control returns to you with a JSON result path.
When to use
- You are about to enumerate 2+ decisions in chat (
"1. Should we X? 2. Should we Y? ..."). - You have a single decision with a clear recommendation, and an explicit ack from the user is worth the round-trip.
- A decision benefits from the user adding a caveat ("yes, but only if …") that is easier to type than to squeeze into a chat reply.
Do not use for:
- Simple yes/no confirmations mid-task.
- Questions whose answer you can derive from the code or recent conversation.
Step 1: Build the input JSON
Write a JSON file at a temp path (e.g. /tmp/decide-input.json) matching this schema:
{
"title": "short header shown in the browser tab and page heading",
"tag": "optional category label (e.g. 'design review')",
"intro": "optional multi-line preamble shown above the questions",
"questions": [
{
"id": "stable-id",
"title": "The actual question",
"reason": "One-line recommendation rationale, shown under the title",
"options": [
{ "label": "Short choice label", "note": "sub-line detail", "recommended": true },
{ "label": "Alternative", "note": "tradeoff" }
],
"allowFreeText": true
}
]
}
Authoring rules:
- Keep
titleterse. Put rationale intoreason, nottitle. - Mark exactly one option per question as
recommended: true(your best guess). options[].noteis optional but strongly recommended — it is what makes the cards scannable.- Set
allowFreeText: falseonly for strictly binary, non-qualifiable choices. - The UI is English-chrome only. Question text may be in any language; the user will see it verbatim.
Step 2: Launch the decide server in the background
Run the bundled decide.py in the background via run_in_background: true:
python3 ~/.claude/skills/case/decide.py /tmp/decide-input.json --output /tmp/decide-result.json
This:
- Starts a local HTTP server on a random free port.
- Opens the user's default browser to the UI.
- Blocks until the user clicks Submit.
Tell the user: "Opened decide in your browser. Pick options, optionally add free-word notes per question, and click Submit."
Do NOT proceed until the background task completes. Do not ask the user to type answers into chat as a fallback. Waiting for the background process to exit is how you know the user is done.
Step 3: Read the result file
When the background task completes, stdout contains Decision result saved to <path>. Read that file:
{
"version": 1,
"answers": [
{
"id": "stable-id",
"title": "The question",
"selectedIndex": 0,
"selectedLabel": "Short choice label",
"wasRecommended": true,
"freeText": "optional per-question caveat or null"
}
],
"notes": "optional shared notes or null",
"submittedAt": "ISO timestamp"
}
Interpret:
selectedLabelis the user's choice. It may benullwhen the user answered with free text only.wasRecommended: truemeans they accepted your recommendation (often a green light to proceed).freeText(when non-null) is a layered instruction — it refines or overrides the selected choice. When there is no selected choice, treatfreeTextas the complete answer for that question.- Top-level
notes(when non-null) applies to the whole decision set and may include scope changes or side-topics.
Step 4: Act on the decisions
Apply the selected choices. When freeText or notes is present, fold them into your plan before executing. If the user's free-text materially changes the scope (e.g. "hold off until X"), confirm with them rather than forging ahead.