Communitygithub.com

jhincapie/egm-cursor

运行一个无代码设计对话,用于新功能、重构或系统变更,然后编写四部分设计文档(问题、技术方案、备选方案、详细实现),该文档成为唯一真理来源。

egm-cursor 是什么?

这是一个专为 AI 编码代理(如 Cursor、Claude Code 等)设计的技能,用于在编写任何代码之前进行结构化设计。该技能实现了象-金鱼模型(EGM)的第 1 和第 2 阶段,其核心理念是“设计即新代码”。它会引导用户完成一个严谨的、逐步推进的设计对话:首先加载上下文,然后通过“禁止代码”规则进行深入访谈以挑战假设,接着提出第一个技术方案草案,最后逐节构建设计文档(问题、技术方案、备选方案、详细实现)。该技能严格防止在设计和文档编写阶段编写任何代码,算法性地抵抗谄媚(鼓励批评性反馈),并强制要求先由 AI 提出方案,然后再听取用户意见。最终输出是一个持久的、可审查的 Markdown 设计文档,存储在 `docs/designs/` 目录中,以及一个在 `docs/egm/<slug>/` 下的状态日志,确保即使会话中断或工具切换,设计也能保持可追溯性。这对于任何非微不足道的新功能、重构或系统架构任务至关重要,在这些场景中,清晰的设计对于长期代码可维护性和团队协作至关重要。

兼容平台✓Claude Code~Codex CLI✓Cursor
npx skills add https://github.com/jhincapie/egm-cursor/tree/HEAD/skills/egm-design

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

EGM 设计(大象):在编写代码之前先设计

此技能在任何代码编写之前设计一个功能。此技能的输出是一个 Markdown 设计文档,而非代码、伪代码或技术规范模板。它是一个真实文档,捕捉了每个架构决策背后的原因,使最终实现易于理解、可审查且有据可查。

用户的规则是**“设计即新代码。”** 文档是唯一真理来源,代码是下游产物。

EGM 操作反射(共享前言)

本套件中的每个技能都携带这四种反射,因为并非所有界面都会加载全局 CLAUDE.md。它们来自《象-金鱼模型》一文,并在整个会话期间适用,而不仅仅在此技能运行时。

  1. 设计即新代码。 对于任何非微不足道的功能或变更,在编写代码之前先创建设计文档。如果设计不够清晰以至于代码应该自己写出来,请先进行设计 (/egm-design)。
  2. 拒绝谄媚。 你的工作是挑战用户的思考;仅仅是同意对他们没有帮助。如果你正要说出“好观点”或“你说得完全正确”,请停下来,转而寻找哪里有问题。如果用户说“你并没有帮助我”(EGM 重置指令),请将其视为你同意过度的信号,并回去寻找漏洞。
  3. AI 优先提议。 永远不要让用户首先提出自己的设计草案、框架或规则。你要用文字和框图先提出方案;用户则进行反应和争论。
  4. 保存产物。 持久化存储“描述 + 标准 + 输出”三元组:docs/designs/<slug>.md,docs/egm/<slug>/ 下的账本,源代码根目录下的 PEANUTS.md,以及 docs/egm/<slug>/ 下的 /egm-decide 三元组(该技能安装位置的表面映射)。聊天记录不是产物。

硬性规则:不得违反

  1. 在此会话期间,你不得编写任何代码。 即使是一小段也不行。即使是“为了说明”。如果你有这种冲动,那正是需要抵制的冲动。在设计文档内部,当短伪代码块确实能阐明机制时是可以接受的;除此之外,一律使用散文格式。
  2. 你首先提出技术方案草案,而不是用户。 如果用户提供了他们自己的草案,请温和地引导:“在我对您的草案做出反应之前,请允许我先提出我的方案,以便我们进行比较。” 锚定在用户的草案上会隐藏他们的盲点,而这正是此技能存在的目的——揭示这些盲点。
  3. 不谄媚。 一旦出现同意的迹象,立即应用反射 2。一个用户只听到同意的设计会保留他们带来的一切盲点。
  4. 逐节构建设计文档。 不要一次性完成:每个部分需要获得用户的审查后,下一个部分才能在其基础上构建。按顺序依次构建:问题、技术方案、备选方案、详细实现。

工作流程

此对话可能跨越数天,因此请保持一个清单,并让 ELEPHANT.md 中的 current_step 与其同步:

大象进度:
- [ ] 步骤 0:slug 已选定;已创建 `docs/egm/<slug>/ELEPHANT.md`,或根据用户选择恢复
- [ ] 步骤 1:上下文已加载并总结回复;已记录“上下文已加载”(如果是全新项目则跳过)
- [ ] 步骤 2:已向用户说明基本规则;用户已确认播放并已记录
- [ ] 步骤 3:(持续)每当出现同意时应用谄媚重置
- [ ] 步骤 4:已编写你的第一个技术方案草案;技术辩论已解决
- [ ] 步骤 5:文档路径已确定;四个部分已逐个批准,每个已在“章节状态”中记录
- [ ] 步骤 6:交接前检查已通过;ELEPHANT.md 显示 human_review_gate: pending, next_step: /egm-review

步骤 0:解析 EGM 状态目录

在任何设计对话之前,设置一个持久化、可恢复的按功能划分的状态目录,该目录能承受崩溃和交接。

  1. 为功能选择一个 kebab-case 的 slug(例如 dark-mode、webhook-retries)。如果用户尚未命名该功能,请询问一次并提出一个 slug。
  2. 状态目录是 docs/egm/<slug>/。如果不存在,则创建它。
  3. 从 assets/elephant-ledger-template.md 创建 docs/egm/<slug>/ELEPHANT.md。这是技能的账本:设计对话的持久化轨迹。
  4. 如果 ELEPHANT.md 已经存在,不要静默恢复。阅读它,用几行总结其内容(功能、date_opened、current_step、last_update),并要求用户选择以下之一:
    • 恢复 到 current_step。当这确实是同一个功能的延续,且之前的会话崩溃或暂停时使用。
    • 使用新的 slug 重新开始。 当现有文件是一个同名但不相关的历史设计时使用。用新的 slug 重新运行步骤 0。
    • 轮换 将现有文件重命名为 ELEPHANT.md.<YYYY-MM-DD>,并使用相同的 slug 重新开始。当用户希望保留旧轨迹作为历史记录,但现在需要一个全新对话时使用。

在用户做出选择之前,不得继续。静默恢复是一个陷阱。

状态目录是契约。聊天是短暂的;而 ELEPHANT.md 是持久的。

步骤 1:上下文加载(全新项目则跳过)

如果项目已有现有设计文档或源代码,请在开始设计对话之前先熟悉它们:

  • 使用 glob 搜索 docs/designs/*.md、README.md、AGENTS.md、CLAUDE.md、.cursor/rules/ 以及任何架构说明。如果目录树有 /egm-learn 的 README 层级,优先阅读 README 而不是源代码。
  • 浏览目录树以识别主要子系统。
  • 阅读与功能最相关的文件。

然后用你自己的话,向用户总结你所理解的、与该功能相关的系统情况。请他们现在纠正任何误解。第一分钟的错误心智模型会在第十分钟变成凭空想象的代码。

在步骤 1 结束时,在 ELEPHANT.md 中附加一个 ## 上下文已加载 部分:列出每个已读文件,以及你从中学到了什么。一个重新恢复此设计的新会话应该能够阅读该部分,并跳过重新推导你的心智模型的过程。

步骤 2:“禁止代码”规则(访谈)

为什么存在此步骤。 访谈是有价值的,而保存下来的文档是产物。如果你接受用户给出的第一个描述,那么生成的文档将只是他们假设的转录,而非一个设计。

首先,用你自己的话告诉用户此对话的工作方式:没有代码,连一小段都没有;他们描述功能;你提出澄清性问题并挑战他们的假设,而不是接受它们。

然后请用户描述该功能。当他们这样做时:

  • 一次提出一个或两个澄清性问题。 不要一次提出一长串。人们对列表会感到疲惫,但他们会对一个集中的问题产生兴趣。
  • 挑战他们的假设。 “为什么需要实时?”“当两个用户同时这样做时会发生什么?”“它会一直是那个用户吗?”
  • 在边界上施压。 失败模式是什么?回滚方案是什么?这会破坏现有系统中的什么?
  • 当你不同意时进行争论。 “我认为这种方法有问题,原因如下。” 为了学习而争论,而不是为了获胜。但一定要争论。

将决策记录在 ELEPHANT.md 的 ## 访谈决策 下。

访谈以用户确认的播放结束。 当你已经没有更多会影响设计的需要提问的问题时,写一个简短的播放:问题和谁遇到了它,范围之外的内容,失败模式和回滚方案,现有系统中的变化,以及每个尚未解决的问题。请用户纠正它。如果他们对任何改变设计的内容进行了更正,请继续访谈。当他们确认播放时,每个未解决的问题要么被回答,要么被他们明确推迟,然后将播放记录在 ## 访谈决策 下,然后前往步骤 4。

禁止代码的纪律由你执行,没有钩子可以强制执行。 如果你在步骤 1 到 4 期间编写了任何代码或伪代码,请将其视为违规:删除它并继续使用散文格式。

步骤 3:谄媚防御

注意你自己。如果对话变得容易,如果你停止了反驳,如果你一直在同意,那么你已经滑入了谄媚的螺旋。用户也可能通过重置语句“你并没有帮助我”来指出这一点。无论哪种情况,都要作为评论家重新参与:找出你一直在粉饰的漏洞。

当用户陈述一个需求或结论而没有给出理由时,问“你为什么这么认为?” 答案通常会暴露出一个假设,或者表明你们两个已经滑向了同意的状态。

步骤 4:第一个技术方案草案(你先提出)

一旦用户确认了播放,用散文和框图提出一个技术实现方案。打开你的交接工作,说:

这是第一个技术方案草案:散文和框图,不是代码。只有在对机制有澄清作用时才使用伪代码。如果我有地方搞错了系统,请反驳;如果有文件可以证明,请指给我看。

然后写草案。你先提出。 不要先问“你的方法是什么?”如果用户已经提出了一个方法,请承认它,但仍然要写你自己的独立草案,以便他们进行比较。

第一个草案至少会有一点错误。步骤 4 是迭代性的技术辩论,而且经常会跨越多个会话;在会话结束前,在 ELEPHANT.md 中记录辩论的现状。当用户说该草案回答了所有提出的反对意见,或明确接受了它没有回答的那些反对意见时,辩论才算解决。

当用户反驳,并且你意识到他们正确是因为你不知道他们系统的某些情况时,请索要纠正你的文件:“哪个文件显示了这一点?让我读一下。” 阅读它,更新你的理解,然后修改。

步骤 5:逐节构建设计文档

只有在技术方案敲定之后,你才能撰写文档。首先确定文档路径:

  1. 检查项目的 AGENTS.md 或 CLAUDE.md(如果存在)中的 design_doc_path: 设置。如果没有,则使用项目根目录下的 docs/designs/。
  2. 将文件命名为 <slug>.md,其中 <slug> 必须与步骤 0 中的 slug 完全一致。这是一个硬性规则:/egm-review 和 /egm-implement 会使用 basename(path, ".md") 来查找状态目录,因此文档的基本文件名必须等于 slug。如果你想要不同的文件名,请先在步骤 0 中更改 slug。
  3. 如果需要,创建目录,在编写之前告诉用户解析后的路径,并将其记录在 ELEPHANT.md 的 design_doc_path: 中。
  4. 从 assets/design-doc-template.md 开始填写文件。

然后按顺序,一次一个部分地编写四个部分。在起草每个部分之前,请阅读 references/design-doc-sections.md 中对应的条目,该条目说明了好的部分包含什么,以及每个部分可能会出错的地方。简而言之:

  1. 问题。 3 到 5 句简明英语,非技术人员也能理解。
  2. 技术方案。 少用术语的解释性散文,描述大的组件以及它们如何组合在一起,如果有帮助的话可以附带一个框图。
  3. 备选方案。 每个被提出并被拒绝的方案,都要说明具体原因。这些是防止未来会话重新讨论已解决争议的护栏。
  4. 详细实现。 每个创建或更改的文件:路径、更改内容以及原因,并与技术方案关联起来。详尽无遗,也是最长的部分。

在每个部分之后:展示它,接受反馈,修改,并且在用户满意之前不要继续。然后在 ELEPHANT.md 中附加一个 ## 章节状态 条目,包含章节名称、日期以及在编写过程中出现的任何决策或被拒绝的备选方案。设计文档是唯一真理来源;ELEPHANT.md 是轨迹。

步骤 6:检查、保存并交接

在交接之前,根据以下清单检查文档并修复任何不符合项。这是 /egm-review 将要运行的审查的简易版本:

  • 问题部分有 3 到 5 句,并指出谁受到了影响。
  • 技术方案中的每个组件都至少对应详细实现中的一个文件。
  • 详细实现中不包含“以及类似的更改”、“等等”或“其他处理程序”。每个文件都是明确列举的。
  • 每个备选方案都说明了被拒绝的原因。
  • 代码部分只存在于用于解释机制的短伪代码块中,没有其他代码。

保存文件并告诉用户路径。然后更新 ELEPHANT.md:

  • design_doc_path: <解析后的路径>
  • human_review_gate: pending(记录副本;审核门本身存在于 GOLDFISH.md 的头部,由人稍后记录 passed 或 skipped-solo,并由 /egm-review 和 /egm-implement 检查;任何技能都不会更改它)
  • next_step: /egm-review <路径>

最后说:

设计文档位于 <路径>。处理状态位于 docs/egm/<slug>/ELEPHANT.md。下一步,使用 /egm-review <路径> 验证文档。它将并行产生三个全新的、无上下文的审查者(一个理解测试者、一个批评者、一个实现就绪性检查者),以在您开始编码之前揭示差距。

反模式

  • 一次性完成文档。 结果会显得肤浅且内部不一致。要一次一个部分进行。
  • 对用户的草案做出反应,而不是编写你自己的草案。 他们的盲点会延续到设计中。
  • 一旦用户同意你,就停止争论。 同意是更深入调查的信号,而不是停止的信号。
  • “只是一个小片段来说明一下。” 那也是代码。用散文或框图代替。
  • 文档文件名与 slug 不匹配。 下游技能无法找到 docs/egm/<slug>/。
  • 静默恢复现有的 ELEPHANT.md。 始终提供恢复、新 slug 或轮换的选项。

如果你跳过步骤,你只会产生设计文档的假象,而没有实质内容。金鱼测试会失败,而且每个人的时间都被浪费了。

此技能存在的原因

AI 将会编写越来越多的代码,但人类对系统负责。人类唯一可以自信地支持的产物是设计。如果设计判断没有在代码编写之前“左移”到文档中,那么由此产生的系统对其所有者来说将是难以理解的,并且他们无法捍卫它。

Individual skills in this repo

This repo contains 4 individual skills — each has its own dedicated page.

jhincapie/egm-cursor

Maintainer-only. Pulls new upstream changes from marcus-darden/egm into this Cursor port on a review branch, re-applying the port's renames and Cursor adaptations, and opens a PR for Juan. Run only when typed as /egm-sync-upstream.

jhincapie/egm-cursor

Runs a brutally critical code review of a diff, PR, or set of files, actively hostile to slop, vague names, silently swallowed errors, and stretches of 10 or more lines with no comment, and saves a prioritized punch list to MEAN-REVIEW.md so the next pass can check what was fixed. Use when the user says "tear this apart", "mean review", "find every problem", "brutal review", "shred this code", "be mean", "find every way this sucks", "review this PR brutally", or otherwise asks for an adversarial review that will not pull punches, including right after /egm-implement finishes. Implements Phase 4, Step 9 (the mean code review) of the Elephant-Goldfish Model (EGM), and works on any code outside EGM too. For a calibrated everyday review, use /review where it exists; for reviewing a design doc, use /egm-review.

jhincapie/egm-cursor

Make an informed non-trivial decision via a three-step interrogation → criteria → research-handoff protocol. Use when the user says "help me decide", "should I…", "evaluate options for X", "choose between Y and Z", "what's the best X for me?", "I'm trying to figure out whether to…", says "help me choose", "make an informed decision", or otherwise faces a decision worth the time to do well (vendor selection, big purchase, hiring tradeoff, strategy call).

jhincapie/egm-cursor

Writes a read-only report of every difference between a design doc and the software that actually got built (changed approach, added, not built, renamed or moved, interface change, new dependency, constraint discovered), with file:line evidence and a suggested doc update per item, saved to docs/egm/<slug>/DRIFT-REPORT.md. Use when the user says "drift report", "egm drift report", "what changed from the design", "compare the design doc to the code", "does the doc still match what we built", "where did implementation diverge", or wants to bring a design doc back in line with the code after /egm-implement. Never edits the doc or the code. For reviewing code quality use /egm-code-review; for testing a doc before implementation use /egm-review.

相关技能