feat: use Claude Code's native AskUserQuestion for /clarify and /checklist#2191
Open
0xrafasec wants to merge 1 commit intogithub:mainfrom
Open
feat: use Claude Code's native AskUserQuestion for /clarify and /checklist#21910xrafasec wants to merge 1 commit intogithub:mainfrom
0xrafasec 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>
Open
11 tasks
Contributor
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 |
Comment on lines
136
to
139
| 4. Sequential questioning loop (interactive): | ||
| - Present EXACTLY ONE question at a time. | ||
| <!-- speckit:question-render:begin --> | ||
| - For multiple‑choice questions: |
Comment on lines
+96
to
+102
| <!-- 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() | ||
| ] |
Comment on lines
+562
to
+563
| # The fence is invisible HTML comments — just verify no | ||
| # AskUserQuestion was injected |
Comment on lines
+490
to
+491
| assert "5" in content | ||
| assert "maximum" in content.lower() or "Maximum" in content |
Comment on lines
+507
to
+508
| assert "THREE" in content or "three" in content.lower() | ||
| assert "Q1" in content or "Q4" in content or "Q5" in content |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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