mcpField
C
consult

consult

github.com/agent-shAgent 工作流1.0k99 次安装2 天前更新
代码仓库

关于 consult

consult 是一项技能,可调用其他 AI 命令行工具征求意见并返回回复,适合需要交叉核验决策或比较不同 AI 回答的场景。它支持选择工具、模型、推理力度和上下文,并可继续受支持的会话。

主要功能

  1. 01调用 Gemini、Codex、Claude、OpenCode 或 Copilot
  2. 02选择推理力度和模型
  3. 03加入 diff 或文件上下文
  4. 04继续受支持的工具会话
  5. 05校验参数和文件路径

适用场景

  1. 01征求其他 AI 对决策的意见
  2. 02比较不同 AI 工具的回答
  3. 03用外部 AI 核验方案

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/agent-sh/agentsys --skill consult

安装后在 Claude Code 中输入/consult确认已加载。

详细介绍

咨询

跨工具 AI 咨询:向另一个 AI 命令行工具提问并返回回答。

使用场景

在以下情况下调用此技能:

  • 用户想从其他 AI 工具获取第二意见
  • 用户要求向 gemini/codex/claude/opencode/copilot 咨询、提问或交叉核对
  • 用户需要比较不同 AI 工具的回答
  • 用户想通过外部 AI 验证某项决定

参数

从 $ARGUMENTS 中解析:

标志值默认值说明
--toolgemini, codex, claude, opencode, copilot(picker)目标工具
--effortlow, medium, high, maxmedium思考力度
--model任意模型名称(from effort)覆盖模型选择
--contextdiff, file=PATH, nonenone自动包含上下文
--continue(flag) or SESSION_IDfalse恢复之前的会话

问题文本是 $ARGUMENTS 中除上述标志外的所有内容。

提供方配置

Claude
Command: env -u CLAUDECODE claude -p "QUESTION" --output-format json --model "MODEL" --max-turns TURNS --allowedTools "Read,Glob,Grep"
Session resume: --resume "SESSION_ID"

模型:claude-haiku-4-5、claude-sonnet-4-6、claude-opus-4-6

努力程度模型最大轮数
lowclaude-haiku-4-51
mediumclaude-sonnet-4-63
highclaude-opus-4-65
maxclaude-opus-4-610

解析输出:JSON.parse(stdout).result 会话 ID:JSON.parse(stdout).session_id 可继续:是 ACP 适配器:npx -y @anthropic-ai/claude-code-acp(参见 ACP Transport 部分)

Gemini
Command: gemini -p "QUESTION" --output-format json -m "MODEL"
Session resume: --resume "SESSION_ID"

模型:gemini-2.5-flash、gemini-2.5-pro、gemini-3-flash-preview、gemini-3-pro-preview、gemini-3.1-pro-preview

努力程度模型
lowgemini-3-flash-preview
mediumgemini-3-flash-preview
highgemini-3.1-pro-preview
maxgemini-3.1-pro-preview

解析输出:JSON.parse(stdout).response 会话 ID:JSON.parse(stdout).session_id 可继续:是(通过 --resume) ACP 适配器:gemini(原生 ACP——Gemini CLI 兼容 ACP)

Codex
Command: codex exec "QUESTION" --json -m "MODEL" {SKIP_GIT_FLAG} -c model_reasoning_effort="LEVEL"
Session resume: codex exec resume "SESSION_ID" "QUESTION" --json -m "MODEL" {SKIP_GIT_FLAG} -c model_reasoning_effort="LEVEL"
Session resume (latest): codex exec resume --last "QUESTION" --json -m "MODEL" {SKIP_GIT_FLAG} -c model_reasoning_effort="LEVEL"

注意:codex exec 是非交互式/无头模式。没有 -q 标志。TUI 模式是 codex(不带子命令)。 {SKIP_GIT_FLAG} 由命令构建步骤 1b 中的信任门控解析:

  • 位于受信任的 git 仓库内:空字符串
  • 在受信任的非仓库环境中执行:--skip-git-repo-check

模型:gpt-5.3-codex

努力程度模型推理
lowgpt-5.3-codexlow
mediumgpt-5.3-codexmedium
highgpt-5.3-codexhigh
maxgpt-5.3-codexhigh

解析输出:JSON.parse(stdout).message 或原始文本 会话 ID:Codex 会在会话结束时打印恢复提示(例如 codex resume SESSION_ID)。从 stdout 或 JSON.parse(stdout).session_id(如果可用)中提取会话 ID。 可继续:是。会话以 JSONL rollout 文件的形式存储在 ~/.codex/sessions/。非交互式恢复使用 codex exec resume "SESSION_ID" "follow-up prompt" --json -m "MODEL" {SKIP_GIT_FLAG} -c model_reasoning_effort="LEVEL"。使用 --last 代替会话 ID 可恢复最近的会话。 ACP 适配器:npx -y @zed-industries/codex-acp(参见 ACP Transport 部分)

OpenCode
Command: opencode run "QUESTION" --format json --model "MODEL" --variant "VARIANT"
Session resume: opencode run "QUESTION" --format json --model "MODEL" --variant "VARIANT" --continue (most recent) or --session "SESSION_ID"
With thinking: add --thinking flag

模型:通过提供商提供 75+ 个(格式:provider/model)。主要提供商:opencode/(免费)、github-copilot/、amazon-bedrock/、google/。示例:github-copilot/gemini-3.1-pro-preview、opencode/big-pickle、amazon-bedrock/anthropic.claude-opus-4-6-v1。运行 opencode models 可列出所有模型。

免费模型:opencode/big-pickle、opencode/gpt-5-nano、opencode/minimax-m2.5-free、opencode/trinity-large-preview-free

努力程度模型变体
low(用户选择或默认)low
medium(用户选择或默认)medium
high(用户选择或默认)high
max(用户选择或默认)high + --thinking

解析输出:OpenCode 输出以换行符分隔的 JSON 事件。每行都是带有 type 字段的 JSON 对象。从 type === "text" 的事件中提取响应文本——文本位于 part.text 中(不是 part.content)。拼接所有 type: "text" 事件中的 part.text 值。事件类型:step_start、tool_use、text、step_finish。每个事件的顶层 sessionID 字段中都包含 sessionID。

会话 ID:每个事件中都可通过 event.sessionID 获取(例如 ses_xxxxx)。使用 --session SESSION_ID 恢复会话。 可继续:是(通过 --continue 或 --session)。会话存储在 OpenCode 数据目录中的 SQLite 数据库内。使用 --session SESSION_ID 指定会话,或使用 --continue 继续最近的会话。 ACP 适配器:opencode acp(参见 ACP 传输部分)

Copilot
Command: copilot -p "QUESTION"

模型:claude-sonnet-4-6(默认)、claude-opus-4-6、claude-haiku-4-5、gpt-5

努力程度备注
all不支持控制努力程度。可通过 --model 标志选择模型。

解析输出:stdout 中的原始文本 可继续:否 ACP 适配器:copilot --acp --stdio(参见 ACP 传输部分)

Kiro
ACP-only provider. No CLI mode for external consultation.
Command: node acp/run.js --provider="kiro" --question-file="{AI_STATE_DIR}/consult/question.tmp" --timeout=120000

Kiro 只能通过 ACP 传输使用。需要在 PATH 中配置 kiro-cli。

解析输出:通过 ACP runner(JSON.parse(stdout)) 可继续:否 ACP 适配器:kiro-cli acp(原生 ACP)

输入验证

构建命令前,验证所有用户提供的参数:

  • --tool:必须是以下值之一:gemini、codex、claude、opencode、copilot、kiro。拒绝所有其他值。
  • --effort:必须是以下值之一:low、medium、high、max。默认为 medium。
  • --model:允许任何字符串,但必须在命令中加引号。
  • --continue=SESSION_ID:如果提供,SESSION_ID 必须符合 ^(?!-)[A-Za-z0-9._:-]+$。拒绝包含空格、以连字符开头或包含 shell 元字符的值。
  • --context=file=PATH:必须解析为项目目录内的路径。拒绝 cwd 外部的绝对路径。其他检查:
    1. 阻止 UNC 路径(Windows):拒绝以 \\ 或 // 开头的路径(网络共享)
    2. 解析规范路径:使用 Read 工具读取文件(不要使用 shell 命令)。读取前,先解析路径:拼接 cwd + PATH,然后规范化(折叠 .、..,解析符号链接)
    3. 验证路径包含关系:解析后的规范路径必须以当前工作目录开头。如果路径通过 ..、符号链接或连接点逃逸,则拒绝,并返回:[ERROR] Path escapes project directory: {PATH}
    4. 禁止访问 shell:只能使用 Read 工具读取文件内容。绝不要将用户提供的路径传递给 shell 命令(防止通过路径值注入)

构建命令

根据解析后的参数,构建完整的 CLI 命令。所有用户提供的值都必须在 shell 命令中加引号,以防止注入。

步骤 1:解析模型

如果指定了 --model,则直接使用。否则,使用上方提供商表中基于努力程度的模型。

步骤 1b:Codex --skip-git-repo-check 信任关卡

使用任何 Codex 模板之前,先通过以下关卡确定 {SKIP_GIT_FLAG}:

  1. 确认咨询是在当前项目工作目录(即调用 /consult 的同一工作区)中运行,而不是任意外部路径。
  2. 确认解析出的活动工具是 Codex(通过标志、NLP、选择器或恢复的 --continue 会话)。
  3. 在当前工作目录中运行 git rev-parse --is-inside-work-tree:
    • 如果为 true:将 {SKIP_GIT_FLAG} 设为空字符串
    • 如果为 false,且检查 1-2 均已通过:将 {SKIP_GIT_FLAG} 设为 --skip-git-repo-check
  4. 如果检查 1-2 未通过,则拒绝执行并显示 [ERROR] Refusing Codex --skip-git-repo-check outside trusted working directory。

此技能中的 Codex 模板假定此信任关卡已通过。

步骤 2:构建命令字符串

使用提供方配置部分中的命令模板。将 QUESTION、MODEL、TURNS、LEVEL、VARIANT 和 SKIP_GIT_FLAG 替换为已解析的字面值。 {SKIP_GIT_FLAG} 必须仅由步骤 1b 设置。不要从继承的 shell 环境中读取 SKIP_GIT_FLAG。

如果要继续会话:

  • Claude 或 Gemini:在命令后追加 --resume "SESSION_ID"。
  • Codex:使用 codex exec resume "SESSION_ID" "QUESTION" --json -m "MODEL" {SKIP_GIT_FLAG} -c model_reasoning_effort="LEVEL",而不是标准命令。对于最近的会话,使用 --last 替代会话 ID。
  • OpenCode:在命令后追加 --session SESSION_ID。如果未保存 session_id,则改用 --continue(恢复最近的会话)。 如果 OpenCode 处于最高 effort:追加 --thinking。
步骤 3:上下文打包

如果 --context=diff:运行 git diff 2>/dev/null,并将输出置于问题之前。 如果 --context=file=PATH:使用 Read 工具读取文件,并将其内容置于问题之前。

第 4 步:安全传递问题

绝不能将用户提供的问题文本插入 shell 命令字符串中。仅进行 shell 转义并不足够——即使在双引号内,$()、反引号和其他展开序列也可能执行任意命令。

必需方法——通过 stdin 或临时文件传递问题:

  1. 将问题写入临时文件,使用 Write 工具(例如 {AI_STATE_DIR}/consult/question.tmp)

    平台状态目录:

    • Claude Code:.claude/
    • OpenCode:.opencode/
    • Codex CLI:.codex/
  2. 构建命令,使用临时文件作为输入,而非内联文本:

Provider安全命令模式
Claudeenv -u CLAUDECODE claude -p - --output-format json --model "MODEL" --max-turns TURNS --allowedTools "Read,Glob,Grep" < "{AI_STATE_DIR}/consult/question.tmp"
Claude(恢复会话)env -u CLAUDECODE claude -p - --output-format json --model "MODEL" --max-turns TURNS --allowedTools "Read,Glob,Grep" --resume "SESSION_ID" < "{AI_STATE_DIR}/consult/question.tmp"
Geminigemini -p - --output-format json -m "MODEL" < "{AI_STATE_DIR}/consult/question.tmp"
Gemini(恢复会话)gemini -p - --output-format json -m "MODEL" --resume "SESSION_ID" < "{AI_STATE_DIR}/consult/question.tmp"
Codexcodex exec "$(cat "{AI_STATE_DIR}/consult/question.tmp")" --json -m "MODEL" {SKIP_GIT_FLAG} -c model_reasoning_effort="LEVEL"(Codex exec 不支持 stdin 模式——cat 从平台控制的路径读取,而非用户输入)
Codex(恢复会话)codex exec resume "SESSION_ID" "$(cat "{AI_STATE_DIR}/consult/question.tmp")" --json -m "MODEL" {SKIP_GIT_FLAG} -c model_reasoning_effort="LEVEL"
Codex(恢复最近会话)codex exec resume --last "$(cat "{AI_STATE_DIR}/consult/question.tmp")" --json -m "MODEL" {SKIP_GIT_FLAG} -c model_reasoning_effort="LEVEL"
OpenCodeopencode run - --format json --model "MODEL" --variant "VARIANT" < "{AI_STATE_DIR}/consult/question.tmp"
OpenCode(按 ID 恢复会话)opencode run - --format json --model "MODEL" --variant "VARIANT" --session "SESSION_ID" < "{AI_STATE_DIR}/consult/question.tmp"
OpenCode(恢复最近会话)opencode run - --format json --model "MODEL" --variant "VARIANT" --continue < "{AI_STATE_DIR}/consult/question.tmp"
Copilotcopilot -p - < "{AI_STATE_DIR}/consult/question.tmp"
  1. 命令完成后删除临时文件(无论成功还是失败)。始终清理,避免文件累积。

模型和会话 ID 值是受控字符串(来自选择器或已保存状态),可安全地直接加引号后放入命令。只有问题包含任意用户文本,因此需要使用临时文件。临时文件路径({AI_STATE_DIR}/consult/question.tmp)使用平台控制的目录和固定文件名,路径中不含用户输入。

Provider 检测

跨平台工具检测:

  • Windows:where.exe TOOL 2>nul——找到时返回 0
  • Unix:which TOOL 2>/dev/null——找到时返回 0

检查每个工具(claude、gemini、codex、opencode、copilot、kiro),并仅返回可用的工具。

ACP 传输

ACP(Agent Client Protocol)是 CLI 子进程调用的另一种传输方式。可用时,ACP 会通过所有主流 AI 编码工具都支持的通用协议,提供结构化的 JSON-RPC 2.0 通信、会话持久化和流式响应。

ACP Provider 适配器
ProviderACP 命令类型检测方式
Claudenpx -y @anthropic-ai/claude-code-acp适配器npx 可用
Geminigemini(原生 ACP)原生gemini 可用
Codexnpx -y @zed-industries/codex-acp适配器npx 可用
Copilotcopilot --acp --stdio原生copilot 可用
Kirokiro-cli acp原生kiro-cli 可用
OpenCodeopencode acp原生opencode 可用
传输方式选择
  1. 检查目标提供商是否支持 ACP(参见下文的 ACP 检测)
  2. 如果支持 ACP:使用 ACP 传输(优先选择——标准化协议,可持久化会话)
  3. 如果不支持 ACP:回退到 CLI 传输(沿用上述现有行为)

无论使用哪种传输方式,输出封装都相同。下游使用方(会话管理、辩论编排器、输出解析)无需关注传输方式。

ACP 命令模板

所有 ACP 提供商都通过 ACP runner 脚本使用相同的命令模式:

node acp/run.js --provider="PROVIDER" --question-file="{AI_STATE_DIR}/consult/question.tmp" --timeout=TIMEOUT_MS [--model="MODEL"] [--session-id="SESSION_ID"]
提供商ACP 安全命令模式
Claudenode acp/run.js --provider="claude" --question-file="{AI_STATE_DIR}/consult/question.tmp" --timeout=120000 --model="MODEL"
Gemininode acp/run.js --provider="gemini" --question-file="{AI_STATE_DIR}/consult/question.tmp" --timeout=120000 --model="MODEL"
Codexnode acp/run.js --provider="codex" --question-file="{AI_STATE_DIR}/consult/question.tmp" --timeout=120000 --model="MODEL"
OpenCodenode acp/run.js --provider="opencode" --question-file="{AI_STATE_DIR}/consult/question.tmp" --timeout=120000 --model="MODEL"
Copilotnode acp/run.js --provider="copilot" --question-file="{AI_STATE_DIR}/consult/question.tmp" --timeout=120000
Kironode acp/run.js --provider="kiro" --question-file="{AI_STATE_DIR}/consult/question.tmp" --timeout=120000

解析输出:与 CLI 传输相同——JSON.parse(stdout)。ACP runner 输出相同的封装格式。 会话 ID:来自 JSON.parse(stdout).session_id(ACP 会话 ID) 恢复会话:在 ACP 命令中传入 --session-id="SESSION_ID" 标志 可继续:Claude、Gemini、Codex、OpenCode(是)。Copilot、Kiro(否)。

ACP 检测

与 CLI 检测同时运行 ACP 检测。对于每个提供商:

node acp/run.js --detect --provider="PROVIDER"

成功时返回(退出码为 0):

{"provider": "claude", "acp_available": true, "name": "Claude"}

失败时返回(退出码为 1):

{"provider": "claude", "acp_available": false, "name": "Claude", "reason": "npx not found on PATH"}

Kiro 注意事项:Kiro 仅支持 ACP——它没有用于外部咨询的 CLI 模式。只有当 kiro-cli 位于 PATH 中且 ACP 检测成功时,才会显示为可用。

会话管理

保存会话

成功完成咨询后,保存到 {AI_STATE_DIR}/consult/last-session.json:

{
  "tool": "claude",
  "model": "opus",
  "effort": "high",
  "session_id": "abc-123-def-456",
  "timestamp": "2026-02-10T12:00:00Z",
  "question": "original question text",
  "continuable": true,
  "transport": "acp"
}

transport 字段的值为 "acp" 或 "cli"。使用 --continue 恢复会话时,应使用创建该会话时相同的传输方式。如果缺少此字段,则假定为 "cli"(向后兼容)。

AI_STATE_DIR 使用平台状态目录:

  • Claude Code:.claude/
  • OpenCode:.opencode/
  • Codex CLI:.codex/
加载会话

对于 --continue,读取会话文件并恢复:

  • 工具(来自已保存的状态)
  • session_id(用于 --resume 标志)
  • 模型(复用相同的模型)

使用恢复的值之前,需重新验证:

  • 工具必须仍在允许列表中:gemini、codex、claude、opencode、copilot、kiro
  • session_id 必须匹配 ^(?!-)[A-Za-z0-9._:-]+$
  • 模型必须匹配 ^[A-Za-z0-9._:/-]+$(拒绝空格和 shell 元字符)
  • 如果任一检查失败,则以 [ERROR] Invalid restored session data 拒绝,并且不要构建命令

如果未找到会话文件,则发出警告并作为新咨询继续。

输出清理

在将任何已咨询工具的响应纳入输出之前,扫描响应文本,并对匹配以下模式的内容进行脱敏:

模式描述替换内容
sk-[a-zA-Z0-9_-]{20,}Anthropic API 密钥[REDACTED_API_KEY]
sk-proj-[a-zA-Z0-9_-]{20,}OpenAI 项目密钥[REDACTED_API_KEY]
sk-ant-[a-zA-Z0-9_-]{20,}Anthropic API 密钥(ant 前缀)[REDACTED_API_KEY]
AIza[a-zA-Z0-9_-]{30,}Google API 密钥[REDACTED_API_KEY]
ghp_[a-zA-Z0-9]{36,}GitHub 个人访问令牌[REDACTED_TOKEN]
gho_[a-zA-Z0-9]{36,}GitHub OAuth 令牌[REDACTED_TOKEN]
github_pat_[a-zA-Z0-9_]{20,}GitHub 细粒度个人访问令牌[REDACTED_TOKEN]
ANTHROPIC_API_KEY=[^\s]+环境输出中的密钥赋值ANTHROPIC_API_KEY=[REDACTED]
OPENAI_API_KEY=[^\s]+环境输出中的密钥赋值OPENAI_API_KEY=[REDACTED]
GOOGLE_API_KEY=[^\s]+环境输出中的密钥赋值GOOGLE_API_KEY=[REDACTED]
GEMINI_API_KEY=[^\s]+环境输出中的密钥赋值GEMINI_API_KEY=[REDACTED]
AKIA[A-Z0-9]{16}AWS 访问密钥[REDACTED_AWS_KEY]
ASIA[A-Z0-9]{16}AWS 会话令牌[REDACTED_AWS_KEY]
Bearer [a-zA-Z0-9_-]{20,}授权标头Bearer [REDACTED]

在将完整响应文本插入结果 JSON 之前应用脱敏。如果发生任何脱敏,请附加说明:[WARN] Sensitive tokens were redacted from the response.

输出格式

向 stdout 返回一个纯 JSON 对象(不带标记或包装):

{
  "tool": "gemini",
  "model": "gemini-3.1-pro-preview",
  "effort": "high",
  "duration_ms": 12300,
  "response": "The AI's response text here...",
  "session_id": "abc-123",
  "continuable": true
}

安装说明

找不到工具时,返回以下安装命令:

工具安装
Claudenpm install -g @anthropic-ai/claude-code
Gemini有关安装说明,请参阅 https://gemini.google.com/cli
Codexnpm install -g @openai/codex
OpenCodenpm install -g opencode-ai 或 brew install anomalyco/tap/opencode
Copilotgh extension install github/copilot-cli

错误处理

错误响应
未安装工具返回上表中的安装说明
工具执行超时返回 "response": "Timeout after 120s"
JSON 解析错误将原始文本作为响应返回
输出为空返回 "response": "No output received"
会话文件缺失继续执行,不恢复会话
缺少 API 密钥返回该工具专用的环境变量说明

集成

此技能由以下方式调用:

  • consult-agent 用于 /consult 命令
  • 直接调用:Skill('consult', '"question" --tool=gemini --effort=high')

示例:Skill('consult', '"Is this approach correct?" --tool=gemini --effort=high --model=gemini-3.1-pro-preview')

评论

支持 Markdown