by edlsh
Interactive decision-gating extension for pi — lets AI agents ask users questions with multiple-choice and freeform answers
# Add to your Claude Code skills
git clone https://github.com/edlsh/pi-ask-userLast scanned: 6/21/2026
{
"issues": [
{
"type": "npm-audit",
"message": "@earendil-works/pi-coding-agent: Pi Agent: Potential XSS in HTML session exports via Markdown URL sanitization bypass",
"severity": "high"
}
],
"status": "WARNING",
"scannedAt": "2026-06-21T08:34:19.329Z",
"npmAuditRan": true,
"pipAuditRan": true,
"promptInjectionRan": true
}pi-ask-user is an open-source ai agents skill for AI coding assistants such as Claude Code, Codex CLI, and ChatGPT, built by edlsh. Interactive decision-gating extension for pi — lets AI agents ask users questions with multiple-choice and freeform answers. It has 115 GitHub stars.
pi-ask-user returned warnings in SkillsLLM's automated security scan. It has no critical vulnerabilities, but review the flagged issues in the Security Report section before adding it to your workflow.
Clone the repository with "git clone https://github.com/edlsh/pi-ask-user" and add it to your Claude Code skills directory (see the Installation section above).
pi-ask-user is primarily written in TypeScript. It is open-source under edlsh on GitHub, so you can review or fork the full source.
Yes. SkillsLLM lists many other AI Agents skills you can browse and compare side by side. Open the AI Agents category from the badge at the top of this page, or use the Related Skills and comparison links further down to weigh pi-ask-user against similar tools.
No comments yet. Be the first to share your thoughts!
Requires a passing catalog security scan. Resolve the flagged issues and resubmit to enable featuring.
A Pi package that adds an interactive ask_user tool for collecting user decisions during an agent run.

High-quality video: ask-user-demo.mp4
overlay (modal, default) or inline (rendered directly in the flow)alt+o by default, configurable per call or via env var) while the prompt is open to temporarily hide/show the popup so you can read prior agent output, then press it again to bring it backpromptSnippet and promptGuidelinesdetails on all results for session state reconstructionask-user skill for mandatory decision-gating in high-stakes or ambiguous tasksask-userThis package now ships a skill at skills/ask-user/SKILL.md that nudges/mandates the agent to use ask_user when:
The skill follows a "decision handshake" flow:
ask_userSee: skills/ask-user/references/ask-user-skill-extension-spec.md.
pi install npm:pi-ask-user
The registered tool name is:
ask_user| Parameter | Type | Default | Description |
|---|---|---|---|
question |
string |
required | The question to ask the user |
context |
string? |
— | Relevant context summary shown before the question |
options |
{title, description?}[]? |
[] |
Multiple-choice options. The schema is a flat object shape (no anyOf, which some provider proxies strip or reject); plain strings and common alias keys (label, text, value, name, option) are still accepted at runtime |
allowMultiple |
boolean? |
false |
Enable multi-select mode |
allowFreeform |
boolean? |
true |
Add a "Type something" freeform option |
allowComment |
boolean? |
env var or false |
Expose a user-toggleable extra-context option in the custom UI (ctrl+g or the toggle row) and collect an optional comment in fallback dialogs |
displayMode |
"overlay" | "inline"? |
env var or "overlay" |
Controls custom UI rendering: overlay shows the centered modal (current behavior), inline renders without overlay framing |
overlayToggleKey |
string? |
env var or "alt+o" |
Shortcut for hiding/showing the overlay popup (overlay mode only). Pi-TUI key spec, e.g. "alt+o", "ctrl+shift+h". Pass "off" to disable. |
commentToggleKey |
string? |
env var or "ctrl+g" |
Shortcut for toggling the optional comment/extra-context row when allowComment: true. Pass "off" to disable. |
timeout |
number? |
— | Auto-dismiss after N ms and return null if the prompt times out |
{
"question": "Which option should we use?",
"context": "We are choosing a deploy target.",
"options": [
{ "title": "staging" },
{ "title": "production", "description": "Customer-facing" }
],
"allowMultiple": false,
"allowFreeform": true,
"allowComment": true,
"displayMode": "inline"
}
displayMode: "inline" uses the same interaction logic but skips overlay mode when calling ctx.ui.custom(...). RPC/headless fallback behavior is unchanged.
Configure your defaults globally by setting these in your shell profile (~/.zshrc, ~/.bash_profile, etc.):
export PI_ASK_USER_DISPLAY_MODE=inline
export PI_ASK_USER_ALLOW_COMMENT=true
export PI_ASK_USER_OVERLAY_TOGGLE_KEY=alt+h
export PI_ASK_USER_COMMENT_TOGGLE_KEY=alt+c
Environment variables must be present in the process that launches Pi. If Pi is launched from a desktop app or a different shell, changes in ~/.zshrc may not be inherited; launch Pi from a terminal where echo $PI_ASK_USER_DISPLAY_MODE shows the expected value.
Effective order:
displayMode parameter (if provided)PI_ASK_USER_DISPLAY_MODE (if set to "overlay" or "inline")"overlay"Unrecognised values are silently ignored and fall back to "overlay".
Effective order:
allowComment parameter (if provided)PI_ASK_USER_ALLOW_COMMENT (true, 1, yes, or on; corresponding false values are also accepted)falseEffective order for both overlayToggleKey and commentToggleKey:
PI_ASK_USER_OVERLAY_TOGGLE_KEY / PI_ASK_USER_COMMENT_TOGGLE_KEY)alt+o and ctrl+gPass "off", "none", or "disabled" (at any level) to disable the shortcut entirely. Invalid specs are silently dropped and the next source is used. Specs follow the Pi-TUI KeyId format: [mod+]...key where modifiers are ctrl, shift, alt, super, in any order, joined by + (e.g. ctrl+g, alt+shift+x, escape, tab).
While an ask_user prompt is open:
| Key | Action |
|---|---|
alt+o (configurable via overlayToggleKey) |
Hide/show the overlay popup so you can read the agent's prior output. Available in overlay mode only. The first time you hide it, a notification reminds you which key brings it back. |
ctrl+g (configurable via commentToggleKey) |
Toggle the optional comment/extra-context row (when allowComment: true). |
enter |
Confirm the focused option, submit a freeform response, or submit/skip an optional comment. |
esc |
Clear the search filter, exit freeform/comment mode, or cancel the prompt. |
↑ / ↓, ctrl+k / ctrl+j |
Navigate options. ctrl+k / ctrl+j (vim-style) work while typing in searchable prompts without disturbing the filter. |
If you prefer never to see the overlay, set displayMode: "inline" per call or PI_ASK_USER_DISPLAY_MODE=inline globally.
ask_user overlay that intersects an image is partially or fully invisible. This must be fixed upstream in pi-tui (compositeLineAt returns image rows unchanged). Until then, displayMode: "inline" (or PI_ASK_USER_DISPLAY_MODE=inline) sidesteps the overlay compositor entirely and should keep the prompt visible.All tool results include a structured details object for rendering and session state reconstruction:
type AskResponse =
| { kind: "selection"; selections: string[]; comment?: string }
| { kind: "freeform"; text: string };
interface AskToolDetails {
question: string;
context?: string;
options: QuestionOption[];
response: AskResponse | null;
cancelled: boolean;
}
See CHANGELOG.md.