feat: use Claude Code's native AskUserQuestion for /clarify and /checklist#2191
feat: use Claude Code's native AskUserQuestion for /clarify and /checklist#21910xrafasec wants to merge 1 commit intogithub:mainfrom
Conversation
…klist
Replace Markdown-table question rendering with Claude Code's native
AskUserQuestion structured picker in speckit-clarify and speckit-checklist
skills, while preserving the original table behavior for all other agents.
- Add HTML-comment fence markers (speckit:question-render:begin/end) around
the question-rendering blocks in clarify.md and checklist.md templates
- Extend ClaudeIntegration.setup() to post-process fenced blocks at skill
generation time, replacing them with AskUserQuestion instructions
- Map Option|Description (clarify) and Option|Candidate|Why It Matters
(checklist) to AskUserQuestion's {label, description} shape
- Place recommended option first with "Recommended — <reasoning>" prefix
- Preserve free-form escape hatch as a final synthetic option
- All downstream behavior unchanged: question caps, validation, spec writes
- Non-Claude integrations output is completely unaffected
Closes github#2181
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
There was a problem hiding this comment.
Pull request overview
This PR updates the /clarify and /checklist command templates to support Claude Code’s native AskUserQuestion structured picker by fencing the question-rendering blocks in the templates and post-processing them during Claude skill generation, while leaving non-Claude integrations functionally unchanged.
Changes:
- Added HTML comment fence markers around question-rendering sections in
clarify.mdandchecklist.md. - Extended
ClaudeIntegration.setup()to replace fenced blocks withAskUserQuestion-based instructions for the Claude-generated skills. - Added Claude integration tests covering replacement behavior, parity expectations, and basic downstream behavior preservation checks.
Reviewed changes
Copilot reviewed 4 out of 4 changed files in this pull request and generated 8 comments.
| File | Description |
|---|---|
templates/commands/clarify.md |
Adds begin/end fence markers around the clarify question-rendering rules block. |
templates/commands/checklist.md |
Adds begin/end fence markers around the checklist question-formatting rules block. |
src/specify_cli/integrations/claude/__init__.py |
Adds fenced-block replacement logic and AskUserQuestion replacement instructions for clarify/checklist at skill generation time. |
tests/integrations/test_integration_claude.py |
Adds tests ensuring Claude output uses AskUserQuestion, and that non-Claude outputs do not. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| re.escape(_QUESTION_FENCE_BEGIN) + r".*?" + re.escape(_QUESTION_FENCE_END), | ||
| re.DOTALL, | ||
| ) | ||
| return pattern.sub(replacement, content, count=1) |
| _CHECKLIST_ASK_USER = """\ | ||
| Question formatting rules: | ||
| - If presenting options, use the `AskUserQuestion` tool to present a native structured picker: | ||
| - `question`: the clarification question text |
| 4. Sequential questioning loop (interactive): | ||
| - Present EXACTLY ONE question at a time. | ||
| <!-- speckit:question-render:begin --> | ||
| - For multiple‑choice questions: |
| <!-- speckit:question-render:begin --> | ||
| Question formatting rules: | ||
| - If presenting options, generate a compact table with columns: Option | Candidate | Why It Matters | ||
| - Limit to A–E options maximum; omit table if a free-form answer is clearer | ||
| - Never ask the user to restate what they already said | ||
| - Avoid speculative categories (no hallucination). If uncertain, ask explicitly: "Confirm whether X belongs in scope." | ||
| <!-- speckit:question-render:end --> |
| clarify_files = [ | ||
| f for f in created | ||
| if "clarify" in f.name.lower() or "clarify" in str(f.parent).lower() | ||
| ] |
| # The fence is invisible HTML comments — just verify no | ||
| # AskUserQuestion was injected |
| assert "5" in content | ||
| assert "maximum" in content.lower() or "Maximum" in content |
| assert "THREE" in content or "three" in content.lower() | ||
| assert "Q1" in content or "Q4" in content or "Q5" in content |
mnriem
left a comment
There was a problem hiding this comment.
Please deliver this as a preset similar to how it was done for VSCode (see https://github.com/github/spec-kit/tree/main/presets and foto see how it was done for VSCode see https://github.com/fdcastel/spec-kit-presets/tree/main/vscode-ask-questions)
Summary
Replaces the Markdown-table question rendering in
/clarifyand/checklistwith Claude Code's nativeAskUserQuestionstructured picker, while preserving the original table behavior for all other agents.Closes #2181
What changed
<!-- speckit:question-render:begin/end -->) around the question-rendering blocks inclarify.mdandchecklist.md. The markers are invisible to non-Claude agents — zero behavior change for them.setup()to post-process the fenced blocks at skill-generation time, following the same pattern used forargument-hint,user-invocable, anddisable-model-invocationinjection./clarify'sOption | Description→AskUserQuestion's{label, description}/checklist'sOption | Candidate | Why It Matters→{label: Candidate, description: Why It Matters}options[]withRecommended — <reasoning>prefix."Provide my own short answer (≤5 words)").Files changed
templates/commands/clarify.mdtemplates/commands/checklist.mdsrc/specify_cli/integrations/claude/__init__.pytests/integrations/test_integration_claude.pyTest results
main)AI assistance disclosure
This PR was developed with assistance from Claude Code (Claude Opus 4.6). I reviewed, tested, and verified all changes manually. The implementation strategy follows the approach proposed in #2181 and matches the existing
ClaudeIntegrationpost-processing patterns.Test plan
uv run python -m pytest tests/ -q)AskUserQuestionand not the original tablesAskUserQuestionreplace_question_render_block()(no-fence passthrough, basic replacement)/speckit.clarifyand/speckit.checklistinside Claude Code🤖 Generated with Claude Code