mcpField
P
pm

pm

github.com/q00文档处理6.3k67 次安装1 天前更新
代码仓库

关于 pm

面向产品规划的 PM 访谈技能,通过结构化提问生成产品需求文档,并可在提问旁呈现证据。

主要功能

  1. 01苏格拉底式 PM 访谈
  2. 02生成 PRD
  3. 03每题配套证据审查
  4. 04答案确认与修订
  5. 05可用时复制到剪贴板

适用场景

  1. 01梳理产品需求
  2. 02记录决策与待定事项

MCP 相关

使用 Ouroboros PM 访谈 MCP 工具管理访谈状态并写入 PRD。

安装

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

$npx skills add https://github.com/q00/ouroboros --skill pm

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

详细介绍

/ouroboros:pm

面向 PM 的苏格拉底式访谈,用于生成产品需求文档(PRD)。

所需技能能力

  • ask_user:通过当前运行时的 ask_user 能力向用户提问。
  • call_mcp:ouroboros_pm_interview 保存访谈状态并编写 PRD。
  • orchestrate_subagents:执行每个问题附带的证据通道。
  • refine_answer:提交结构化答案前先确认(Refine 门控)。
  • run_shell:完成后将 PRD 复制到剪贴板(如可用)。

说明

更新会在后台检查;如果你的上下文中包含 Ouroboros 更新通知,请在第一个问题之后提及一次 ooo update。

步骤 1:加载 MCP 工具(延迟加载架构防护)

Ouroboros 工具可能会延迟加载,而且某一轮加载的架构可能在下一轮卸载。每次调用 ouroboros_* 前,都要立即通过当前运行时的工具发现能力加载相应工具:"+ouroboros pm_interview" 对应 ouroboros_pm_interview。如果工具已可调用,工具发现操作不会执行任何操作,预期会返回空结果。只有在工具确实不存在时才使用后备方案。

后备方案:安全失败。不要检查或编辑 ~/.claude/mcp.json,也不要添加直接调用 Python 的后备方案。告知用户这一点,然后停止:

The PM interview MCP tool is unavailable in this runtime.

Configure a supported CLI-backed host with:
  ouroboros setup --runtime <codex|opencode|kiro|copilot|hermes>

Then restart that host and retry ooo pm. Claude SDK profiles ([claude] and
[claude-sdk]) stay on MCP 1.x; the separate [mcp] server uses [claude-cli]. Do
not combine both MCP majors or add a direct Python fallback.
步骤 2:开始访谈
Tool: ouroboros_pm_interview
Arguments:
  initial_context: <user's topic or idea>
  cwd: <current working directory>

响应中包含第一个问题,因此步骤 3 也适用于该问题,包括证据通道。

步骤 3:循环

对每条包含问题的响应执行以下操作。

批量轮次。 一条响应可能包含 1 到 3 个问题:meta.question_batch 会列出这些问题,meta.question_advisories 则为每个问题提供一个提示封装(包含各自的 question_advisory_subagents、question_advisory_fanout_id 和 question_advisory_result_correlation_key)。按以下要求处理每个问题,此外还要:

  • 在同一轮中派发每个封装中的所有有效负载;不得让任何已展示的问题失去其证据通道。
  • 按封装提交结果:每个封装各调用一次 ouroboros_submit_fanout_results。
  • 在一次 ask_user 提示中询问本轮的所有问题;每个问题都使用其对应 meta.question_batch 条目中的选项。
  • 在一次调用中转达本轮内容,使用 answers: [{question, answer}, ...],每个问题占一项,并使用其准确文本。先收集所有答案;不得代替用户自动回答、自动延后处理或决定稍后再处理任何问题,以凑齐整组答案。遗漏的内容会被放弃;如果调用中缺少本轮的答案,就会规划新一轮,导致用户再次被询问。
  • 跳过标记按问题分别处理,放在对应问题自己的条目中。

A. 提醒(来自 meta):

  • meta.deferred_this_round → 输出 [DEV → deferred] "question"
  • meta.decide_later_this_round → 输出 [DEV → decide-later] "question"
  • meta.pending_reframe → 输出 ℹ️ 已从技术问题重新表述。

A2. 证据通道:在向用户提问前必须完成。

你不能自行查看代码库。此技能没有通过代码作答的路径:无法追溯至证据通道的证据,均不属于记录中的证据。所需内容都在这里和工具响应中。

如果存在 meta.question_advisory_subagents,则处理其中的每个有效负载:先展示问题,再原样传递每个有效负载的 prompt,包括精简的占位提示(子 Agent 会通过 ouroboros_fetch_artifact 获取自身上下文)。遵循 meta.question_advisory_host_action:spawn_subagents 表示已声明并行支持;dispatch_subagents_if_supported 表示在支持时进行原生并行派发,否则按顺序处理;process_payloads_sequentially 要求按顺序处理。有效负载是工作约定,宿主操作则决定执行策略。 这些通道是 code_context 和 data_context,两者都是必需的。提出问题后,在分隔线下方,用用户使用的语言说明当前有多少个视角正在运行,使用用户的说法,而不是通道 ID,并以“依据”结尾,绝不能以“选项”结尾(此工具不会提供答案选项):

---
While you answer this question, two perspectives are reviewing in parallel
(code context / data measurement). When they return I will put what they found
next to the question as grounds.

通道仍在运行时,不要进入步骤 B。空结果、未遵守约定或无法启动的通道,都视为已返回。用户可随时作答;等待的是你的正式提示词。

提交。 调用 ouroboros_submit_fanout_results,并提供 meta.question_advisory_fanout_id、明确的 session_id,以及通过 meta.question_advisory_result_correlation_key(context.lane_id)关联的结果。提交你持有的所有通道:没有发现内容的通道也要提交其输出;无法启动的通道,或子级回复内容恰好为 UNDISPATCHED 的通道,提交 { "key": <lane id>, "undispatched": true }(字面值 true,不含 content)。绝不要编造未运行通道的输出。

读取回复。 如果有 contract_id,根据你持有的输出进行综合。若没有,则读取 missing_required_keys 和 contract_violations,并在重新提交时补上所有通道。如果仍然没有,则带着现有内容(或空内容)进入步骤 B,并用一行说明调查结果未返回。无论哪种情况,都要省略 contract_violations 中列出的通道,也要省略你提交为 undispatched 的通道:未运行的通道是空缺,不是结果清晰。证据块本应包含该通道内容时,写明该通道未运行。

证据块(synthesis_contract.output_shape = "evidence_beside_question")。将其紧贴在问题上方打印,然后原样提问:

Evidence (examined: billing-api, storefront)

What the system does today
  · [billing-api] access continues to the end of the paid period
  · [storefront]  access is revoked immediately
    ! These two repositories implement this differently.

Measured: active subscriptions by plan, last 90 days
  · standard 12,480 / premium 3,120

这些标签是格式占位符,不是要照抄的文本。规则:

  • 每条代码声明都必须取自通道的 plain_statement(已使用问题的语言),不得取自 policy_claim,也不得改述。界面上不得显示文件路径、类名或标志值;引用保留在已发布的扇出结果中。
  • 每条声明都必须保留其所属仓库。绝不要合并来自两个仓库的声明,也不要将意见分歧表述为带有例外情况的单一政策;应像上文那样标明分歧。
  • 始终打印已检查的范围。每个 examined 条目都是通道读取过的仓库;如果某条目的 policy_claims 为空,表示该仓库已读取但没有发现内容(应明确说明);没有条目的仓库表示从未打开,不得标示为检查无问题。
  • 按报告内容保留测量值(metric、分组、数字);不得重新缩放、合并或四舍五入。
  • 空操作通道最多显示一行。not_a_policy_question / not_a_measurement:不打印任何内容。no_repository_in_roster / roster_repository_not_readable / store_described_but_not_callable:由你自行处理(未注册、路径无法打开或存储库未响应);绝不要将这些情况转述为“你的系统没有此类政策/数据”。
  • 丢弃用户已经回答过的问题的相关发现;不要用这些发现重新提出已确定的决策。
  • 不在名册内的证据(为本次 PM 会话选定的棕地仓库之外的证据)会在提交时被拒绝。不要转述;改为提议注册该仓库。
  • 不提供答案选项、建议、排名或“因此”式结论。PRD 会询问系统应该怎么做;证据块只说明系统实际怎么做。

A3. 发现是证据,不是答案。 已发布的扇出结果是某项发现的完整记录。不要发送 [from-code] 答案,不要让用户在单独一轮中确认某项发现,不要在任何答案载荷中放入发现,也绝不要因为某个通道给出了明确答案就跳过提问。用户会在看到证据的情况下,用自己的话作答。 B. 询问用户(等 A2 的各条线返回后)。打印 MCP 内容文本及证据块。告诉用户无需编造推测性答案:对于未知、取决于利益相关方、范围过广或最好稍后再决定的问题,应通过假设、稍后决定或暂缓机制处理,而不是列为已确认需求。通过 ask_user 提问,将问题文本作为 meta.question,并提供 2-3 个建议答案;适当时包括 Not sure yet: record as an assumption or decide-later item。当 meta.skip_eligible == true 时,根据该问题自身的 classification 添加一个跳过选项:

  • decide_later → Decide later(作为开放事项记录在 PRD 中)
  • deferred → Defer to dev(将技术决策推迟到开发阶段)

C. 转达答案。 Decide later → answer="[decide_later]";Defer to dev → answer="[deferred]";其他任何答案都必须先经过 Refine gate。对于批量轮次,先精炼每个答案,再在一次 answers 调用中发送所有答案,并附上每个问题的原文;该调用会返回下一轮。

Refine gate(pm)。 与访谈技能不同,即使用户只选择了一个选项,也始终要对答案进行结构化:这是 MCP 唯一拥有的上下文,也是 PRD 记录为已决定的内容。使用用户自己的措辞标注各部分 (user-stated),你自己的解读部分不加标记。没有内容的部分应省略,不要用看似合理的内容填充。不要添加代码库上下文部分或各条线的调查结果(A3)。

[from-user][refined]
Decision: <what they decided, in their words>

Reasoning:
- <your reading of why, drawn from what they said in this session>

Constraints (user-stated):
- <constraints they stated>

Out of scope (user-stated):
- <what they put out of scope>

然后通过 ask_user 确认:“发送前,我将你的答案结构化如下:。是否有任何遗漏或表述不准确之处?”选项:Send as-is、Fix the reasoning(未标记的部分是你撰写的)、Add to Constraints、Let me rewrite it。仅在确认后追加 [refined]。

Tool: ouroboros_pm_interview
Arguments:
  session_id: <meta.session_id>
  last_question: <meta.question>
  answer: <the refined answer, or "[decide_later]" / "[deferred]">

last_question 必须始终与 answer 一同提供:服务器会将每个答案与对应问题配对,并拒绝不带 last_question 的 answer。每个答案都必须是用户自己的措辞。

D. 检查是否完成。 是否完成仅由 meta.is_complete 决定,绝不能根据响应文本判断。如果 meta.is_complete == true:

  • meta.generation_failed == true → 重试生成:
    Tool: ouroboros_pm_interview
    Arguments:
      session_id: <session_id>
      action: "generate"
      cwd: <current working directory>
    
  • 否则,PRD 已生成:转到步骤 4(meta.pm_path、meta.seed_path)。

否则重复步骤 3。

步骤 4:复制到剪贴板

如果 run_shell 可用,将 meta.pm_path 的内容复制到剪贴板(例如,在 macOS 上使用 pbcopy < <meta.pm_path>)。

步骤 5:显示结果和下一步
PM document saved: <meta.pm_path>
(copied to clipboard)

PM seed handoff artifact: <meta.pm_seed_path or meta.seed_path>
This is not the runnable Seed yet.

Next step:
  ooo interview <meta.pm_seed_path or meta.seed_path>
  ooo seed

如果没有复制任何内容,则省略 (copied to clipboard)。

RFC #1392 状态提示页脚

最终响应以且仅以一行 ◆ <current state> → next: <recommended action> 结尾。如果 ouroboros_session_status 可用,则根据实时会话状态确定状态;否则,根据此技能的实际结果确定。绝不要使用线性的 Step N of M 页脚;如果下一步需要实际选择,则列出 2-3 个选项。

评论

支持 Markdown