erniker/understudy

GitHub: erniker/understudy

一个为 GitHub Copilot CLI、VS Code Copilot、Claude Code 和 Cursor 自动生成专业化 AI Agent 团队配置的系统,让 AI 工具以角色分工协作的方式参与软件开发全流程。

Stars: 1 | Forks: 0

# 🎭 Understudy — 一个 AI,扮演所有角色 ## 安装说明 **单行命令** (Linux, macOS, Windows Git Bash / WSL): ``` curl -fsSL https://raw.githubusercontent.com/erniker/understudy/main/install.sh | bash ``` 这会下载最新版本,将其安装到 `~/.understudy/` 目录下,并将 `understudy` 命令添加到你的 PATH 中。 **特定版本:** ``` curl -fsSL https://raw.githubusercontent.com/erniker/understudy/main/install.sh | bash -s -- --version v1.0.0 ``` **手动安装(克隆):** ``` git clone https://github.com/erniker/understudy.git cd understudy chmod +x wizard.sh ``` ## 快速入门 ``` # 在任何项目中部署 Understudy cd /path/to/your/project understudy # → 选择平台:Copilot, Claude Code, Cursor # 然后打开你的 AI 工具 claude # Claude Code copilot # GitHub Copilot CLI cursor . # Cursor ``` ### 零问题部署 (`--here`) 已经在现有 repo 中,不想回答向导的 问题?使用 `--here` — Understudy 会根据你工作目录中的文件推断项目名称、描述、 技术栈、repository URL 和 PM: ``` cd /path/to/your/project understudy --here # shows inferred values, asks one confirmation understudy --here --yes # fully unattended, no prompts ``` 推断的内容: - **Project name (项目名称)** — 来自文件夹名称或根目录的 `package.json` - **Description (描述)** — 来自 `package.json` 或 `README.md` 的第一段 - **Stack (技术栈)** — Node.js / React / Vue / Angular / .NET / Python / Terraform / Docker / Shell - **Repository URL (仓库 URL)** — 来自 `git remote get-url origin` - **PM (项目经理)** — 来自 `git config user.name` 向导会打印所有 9 项设置的编号摘要(与 交互式向导询问的问题相同),并在确认 提示处提供三个选项: - **`Y`** — 使用推断出的设置进行部署(默认)。 - **`n`** — 取消。 - **`e`** — 交互式编辑任何字段。你输入字段编号 (`1`-`9`),提供新值,重复操作直到满意。然后输入 `d` 进行 部署或输入 `q` 退出。 无法推断的选项会应用默认值:`split` guardrails,启用所有三个 平台,将文件提交到 repo。如果你需要自定义这些设置,请在不使用 `--here` 的情况下运行以使用 完整的交互式向导。 ### 安装选项 | 标志 | 描述 | |---|---| | `--version ` | 安装特定版本(例如 `v1.2.0`) | | `--dir ` | 自定义安装目录(默认:`~/.understudy`) | | `--no-path` | 跳过 PATH 设置 | | `--uninstall` | 从系统中移除 Understudy | ### 自动更新检查 当你运行 `understudy` 时,它会检查 GitHub 上是否有新版本。 如果存在较新的版本,它会询问你是否要立即更新。 要禁用此检查(适用于 CI 或离线环境): ``` export UNDERSTUDY_SKIP_UPDATE_CHECK=1 ``` ## 这是什么? 一个能够自动生成 **GitHub Copilot CLI**、**VS Code**、**Claude Code** 和 **Cursor** 作为完整开发团队工作所需的 所有配置的系统: | 成员 | 角色 | 专长 | |---|---|---| | 🏛️ **Architect** | 解决方案架构师 | 系统设计、API、数据库、云 | | ⚙️ **Backend** | 后端开发者 | .NET, Node.js, C#, TypeScript, Python, Bash | | 🎨 **Frontend** | 前端开发者 | React, TypeScript, UX/UI, 可访问性 | | 🚀 **DevOps** | DevOps 工程师 | Azure, AWS, Docker, K8s, Terraform, CI/CD | | 🔒 **Security** | 安全专家 | OWASP, 威胁建模, 合规性, IAM | | 🧪 **QA** | QA 工程师 | 测试 .NET, Node.js, Python, E2E, 契约测试 | ## 核心概念 ### 1. AGENTS.md — "团队成员是谁" 位于项目根目录的文件,定义了可以在 Copilot CLI 中使用 `/agent` 选择的代理。 每个代理都有名称、角色、专长和行为规则。 ### 2. .github/copilot-instructions.md — "项目规则" Copilot 在每次会话中**自动**加载的全局指令。 定义了项目上下文、约定和工作流。 ### 3. .github/instructions/*.instructions.md — "每位成员的工作方式" 每个角色的模块化指令文件。使用 `/instructions` 激活 或与相应的代理一起加载。它们包含每个成员的详细个性、 代码标准和检查清单。 ### 4. 并行子代理 — "分而治之" Copilot CLI 可以启动并行工作的子代理(task tool)。 非常适合后端和前端同时实现,同时 DevOps 准备基础设施。 ### 5. 上下文文件 — "会话间的记忆" 文件 `docs/session-log.md`、`docs/spec.md` 和 `docs/decisions.md` 充当持久记忆。在每次会话开始时代理会读取它们; 在结束时,代理会更新它们。这能节省 token 并避免重复信息。 ### 6. 🛡️ Guardrails — "我们绝不做什么" 所有代理都遵守的安全和行为限制。 它们涵盖 8 个类别:安全、范围、流程、破坏性操作、 数据/PII、质量、环境和文档。它们是**不可协商的**,并且 随向导自动部署。 ### 7. 🔒 仅限本地模式 — "将 AI 配置排除在 git 之外" 可选。向导可以将生成的 AI 配置(`AGENTS.md`、 `CLAUDE.md`、`.github/instructions/`、`.claude/`、`.cursor/`…)和/或 会话记忆文件(`docs/spec.md`、`docs/decisions.md`、 `docs/session-log.md`)追加到项目的 `.gitignore` 中,使其保留在本地。 适用于 AI 工具配置需要保密的企业 repo,或者不想暴露内部工作流的开源 项目。通过 `understudy.yaml` 中的 `git.local_config` / `git.local_memory` 进行切换 — 请参阅 [docs/09-configuration.md](docs/09-configuration.md#local-only-mode)。 ## Guardrails Guardrails 保护团队免受以下情况的影响: - 泄露秘密或敏感数据 - 未经确认的破坏性操作 - 未经变更控制的生产环境更改 - 没有规范、没有测试或没有审查的代码 - 代理之间的范围违规 ### 部署模式 | 模式 | 描述 | |---|---| | 🔀 **split** (推荐) | 关键 guardrails 始终在 `copilot-instructions.md` 中处于活动状态 + 完整细节文件在 `guardrails.instructions.md` 中 | | 📦 **embedded** | 仅关键 guardrails 嵌入在 `copilot-instructions.md` 中(更轻量,无单独文件) | ### Split 与 Embedded 的实际区别 | 方面 | 🔀 split | 📦 embedded | |---|---|---| | **执行级别** | 关键 guardrails 始终处于活动状态 **并且** 完整的 guardrails 可在专用文件中使用 | 仅关键 guardrails 始终处于活动状态 | | **可见性** | 更高:团队可以在 `guardrails.instructions.md` 中审查完整的 guardrails | 较低:全局指令中仅可见缩减后的集合 | | **维护** | 更容易在不臃肿全局指令的情况下演进完整的 guardrails | 更简单的文件结构,但详细策略的空间较少 | | **最适用于** | 受监管的团队、大型 repo、多代理工作流、更严格的治理 | 小型/快速项目、轻量级设置、希望开销最少的团队 | | **权衡** | 更多文件和稍多的结构 | 对非关键规则的显式覆盖较少 | **经验法则:** - 当你想要更强的治理、更好的可审计性和更清晰的团队一致性时,选择 **split**。 - 当速度和简单性比策略深度更重要时,选择 **embedded**。 该模式在向导期间选择,可以通过编辑 `understudy.yaml` 来更改: ``` guardrails: mode: "split" # "split" or "embedded" ``` ### 类别 | # | 类别 | 保护内容 | |---|---|---| | 1 | 🛡️ 安全 | 无秘密,无绕过,强制输入验证 | | 2 | 🎯 范围 | 每个代理的文件所有权,跨越边界需要提供理由 | | 3 | 📋 流程 | 规范优先(bug 修复/紧急情况除外),记录决策 | | 4 | 💥 破坏性 | 删除、清除或撤销前需 PM 确认 | | 5 | 🔒 数据/PII | 无真实数据,测试中使用合成数据,GDPR | | 6 | 🏗️ 质量 | 自我审查,适当的测试,命名,错误处理 | | 7 | ⚠️ 环境 | 提升 (Promotion) 顺序 dev→prd,强制 IaC,禁止手动更改 | | 8 | 📝 文档 | ADRs,session-log,更新规范 | ## 系统结构 ``` understudy/ ├── wizard.sh # 🧙 The wizard — deploys Understudy ├── install.sh # 📦 One-liner curl installer ├── run_tests.sh # 🧪 Local test runner ├── understudy.yaml # ⚙️ Global configuration ├── templates/ # 📋 Base templates │ ├── AGENTS.md # Copilot: team definition │ ├── CLAUDE.md # Claude: global instructions │ ├── .github/ # Copilot / VS Code │ │ ├── copilot-instructions.md │ │ ├── instructions/ │ │ │ ├── architect.instructions.md │ │ │ ├── backend.instructions.md │ │ │ ├── frontend.instructions.md │ │ │ ├── devops.instructions.md │ │ │ ├── security.instructions.md │ │ │ ├── qa-engineer.instructions.md │ │ │ └── guardrails.instructions.md │ │ └── prompts/ │ │ ├── start-session.prompt.md │ │ ├── end-session.prompt.md │ │ ├── design-feature.prompt.md │ │ └── security-review.prompt.md │ ├── .claude/ # Claude Code │ │ ├── agents/ │ │ │ ├── architect.md, backend.md, frontend.md │ │ │ ├── devops.md, security.md, qa.md │ │ ├── commands/ │ │ │ ├── start-session.md, end-session.md │ │ │ ├── design-feature.md, security-review.md │ │ ├── hooks/ │ │ │ └── guardrails-check.sh │ │ └── settings.json │ ├── .cursor/ # Cursor │ │ ├── agents/ │ │ │ ├── architect.md, backend.md, frontend.md │ │ │ ├── devops.md, security.md, qa-engineer.md │ │ └── rules/ │ │ ├── understudy-global.mdc │ │ └── guardrails.mdc │ └── docs/ │ ├── spec.md │ ├── decisions.md │ ├── session-log.md │ └── team-roster.md ├── roles/ # 🎭 Optional roles catalog │ ├── data-engineer.instructions.md │ ├── git-specialist.instructions.md │ ├── mobile-engineer.instructions.md │ ├── ml-engineer.instructions.md │ ├── repo-documenter.instructions.md │ ├── shell-scripting.instructions.md │ ├── tech-writer.instructions.md │ └── sre.instructions.md ├── tests/ # 🧪 bats test suite │ ├── unit/ # config_read, detect, deploy_file, guardrails │ ├── hooks/ # guardrails-check.sh tests │ ├── integration/ # end-to-end wizard deployment │ ├── fixtures/ # fake project structures │ └── lib/helpers.bash # shared test helpers └── docs/ # 📚 Documentation ├── README.md # Index ├── 01-introduction.md ├── 02-quick-start.md ├── 03-platform-comparison.md ├── platforms/ │ ├── copilot-cli.md │ ├── vscode-copilot.md │ ├── claude-code.md │ └── cursor.md ├── 08-cross-platform-workflows.md ├── 09-configuration.md └── 10-troubleshooting.md ``` ## 文档 完整文档位于 [`docs/`](docs/README.md) 目录下,其组织方式允许在作为静态站点发布时无需重构。 | 部分 | 内容 | |---|---| | [简介与核心概念](docs/01-introduction.md) | 心智模型、代理、规范驱动开发、持久记忆、guardrails、角色目录、生成的文件 | | [快速入门](docs/02-quick-start.md) | 安装、首次会话、扩展团队 | | [平台功能矩阵](docs/03-platform-comparison.md) | 每个工具开箱即用的支持内容 | | [GitHub Copilot CLI](docs/platforms/copilot-cli.md) | 设置、命令、完整功能流程、子代理、提示 | | [VS Code Copilot](docs/platforms/vscode-copilot.md) | `applyTo` globs、提示文件、开始 → 工作 → 结束流程 | | [Claude Code](docs/platforms/claude-code.md) | 代理、斜杠命令、拒绝列表、PreToolUse hook、添加命令 | | [Cursor](docs/platforms/cursor.md) | 规则 (MDC)、代理面板、创建你自己的规则 | | [跨平台工作流](docs/08-cross-platform-workflows.md) | 混合设置与共享会话协议 | | [配置参考](docs/09-configuration.md) | 完整的 `understudy.yaml` 参考 | | [故障排除与常见问题](docs/10-troubleshooting.md) | 常见问题、模型选择、报告 Bug | ## 向导命令 | 命令 | 描述 | |---|---| | `understudy` | 完整的交互式部署 | | `understudy --here` | 使用从 repo 推断的值在当前目录中部署(编号摘要,可通过 `e` 编辑) | | `understudy --here --yes` | 与 `--here` 相同,但跳过确认提示(完全无人值守) | | `understudy --add-member` | 添加团队成员(数据工程师、QA 等) | | `understudy --create-role` | 从头创建自定义角色 | | `understudy --help` | 显示帮助 | ## 集成到现有项目与 Monorepo 中 向导会自动检测现有项目并进行适配: | 场景 | 行为 | |---|---| | 🆕 文件夹不存在 | 创建具有完整结构的新项目 | | 🔄 现有项目 | 集成 Understudy 而不触碰现有文件 | | ⚠️ 已包含 Understudy | 重新部署:仅添加缺失的文件 | ### 自动技术栈检测 向导会扫描最多 3 层深度以检测技术: | 技术 | 标记 | 示例 | |---|---|---| | .NET | `*.csproj`, `*.sln` | `.NET: services/api-customers (ApiCustomers)` | | Node.js | `package.json` (不包含 React/Vue/Angular) | `Node.js: services/api-notifications` | | React | 包含 `"react"` 的 `package.json` | `React: frontend/web-app` | | Vue | 包含 `"vue"` 的 `package.json` | `Vue: frontend/admin` | | Angular | 包含 `"@angular/core"` 的 `package.json` | `Angular: frontend/portal` | | Python | `requirements.txt`, `pyproject.toml`, `setup.py`, `Pipfile` | `Python: services/ml-scoring` | | Terraform | `*.tf` | `Terraform: infra/terraform` | | Docker | `Dockerfile`, `docker-compose.yml` | `Docker: 4 Dockerfiles` | | Shell | `*.sh`, `*.bash`, `*.zsh` | `Shell` (自动添加 shell-scripting 角色) | ### Monorepo 支持 当检测到 2 个或更多独立项目时,技术栈会被标记为 **Monorepo**: ``` Monorepo: .NET(2) + Node.js + React(2) + Python + Terraform + Docker Components found: • .NET: services/api-customers (ApiCustomers) • .NET: services/api-policies (ApiPolicies) • React: frontend/web-app • Node.js: services/api-notifications • Python: services/ml-scoring • Terraform: infra/terraform • Docker: 4 Dockerfiles • Docker Compose: ./ ``` 检测到的技术栈会作为默认值预填充,从而在设置过程中为你节省时间。 ## 推荐工作流 ``` PM writes spec.md │ ▼ /agent Architect ──── designs solution ──── docs/decisions.md │ ▼ /agent Security ───── threat model │ ├──────────────────────┐ ▼ ▼ /agent Backend /agent Frontend (implements APIs) (implements UI) │ │ └──────────┬───────────┘ ▼ /agent QA (test plan + tests) │ ▼ /agent DevOps (infra + CI/CD + deploy) │ ▼ /agent Security (final review) │ ▼ session-log.md updated ``` ## 如何添加新角色 `roles/` 文件夹是系统的**官方可选角色目录**。6 个核心角色(Architect, Backend, Frontend, DevOps, Security, QA)始终从 `templates/` 部署;`roles/` 中的角色是附加的,由你自行选择。 **包含的可选角色:** | 角色 | 使用 | |---|---| | 🐉 **caveman** | 节省 token 的文本。去除冗余修饰;保留代码/路径/URL。通过 `--caveman` 选择启用。请参阅 [Caveman 模式](docs/11-caveman-mode.md)。 | | 📊 **data-engineer** | ETL/ELT pipelines,数据仓库,流处理,数据治理 | | 🌿 **git-specialist** | Git 工作流,分支策略,PR 规范,发布纪律 | | 📱 **mobile-engineer** | iOS/Android 应用,React Native, Flutter | | 🤖 **ml-engineer** | ML 模型,MLOps,LLMs,RAG,负责任的 AI | | 📖 **repo-documenter** | 代码库理解,架构文档,入职指南 | | 🐚 **shell-scripting** | Bash/sh 自动化,跨平台脚本,ShellCheck 最佳实践 | | 📝 **tech-writer** | 技术文档,API 文档,教程,Diataxis | | 🧭 **sre** | SLOs,可观测性,事件响应,混沌工程 | **自动部署:** 向导始终包含 `git-specialist` 和 `repo-documenter`。如果在你的项目中检测到 shell 脚本(`*.sh`、`*.bash`、`*.zsh`), `shell-scripting` 将被自动添加。所有的角色都会部署到 你选择的每个平台(Copilot、Claude、Cursor)。 **如何添加更多:** 1. **从现有目录中**:`understudy --add-member` → 从菜单中选择(适用于 Copilot、Claude 和 Cursor 项目) 2. **创建新角色**:`understudy --create-role` → 保存在 `roles/` 中以便复用 3. **手动方式**:在 `roles/` 中创建一个 `name.instructions.md` 文件,遵循现有格式 ## 给项目经理的提示 - 为 Architect 使用 **Claude Opus** (`/model`) — 更好的设计推理能力 - 为 Backend/Frontend 使用 **Claude Sonnet** — 速度/质量的良好平衡 - 为快速的 DevOps 任务使用 **Claude Haiku** — 经济高效 - 在每次会话结束时始终要求更新 `session-log.md` - 规范是神圣的:如果范围发生变化,请先更新规范 ## 配置与覆盖 系统使用具有优先级层次的 `understudy.yaml` 配置文件: ``` 1. Wizard defaults (built-in) ← lowest priority 2. ~/.understudy/understudy.yaml (installed) ← global defaults OR understudy.yaml next to wizard.sh (cloned) ← if installed manually 3. understudy.yaml in the project ← per-project override (highest) ``` 覆盖示例:你的项目需要为 Security 使用 Opus,因为它是金融科技: ``` # my-project/understudy.yaml models: security: "claude-opus-4.6" # override: more reasoning for fintech platforms: copilot: true claude: true # or false if you only use one platform cursor: true guardrails: mode: "embedded" # override: only critical guardrails for lighter project ``` ## 兼容性:Copilot CLI + VS Code + Claude Code + Cursor Understudy 适用于**所有四个平台** — 在部署期间选择一个或多个: | 特性 | Copilot CLI | VS Code | Claude Code | Cursor | |---|---|---|---|---| | 全局指令 | ✅ 自动加载 | ✅ 自动加载 | ✅ CLAUDE.md | ✅ `.cursor/rules/` | | 角色指令 | ✅ `/instructions` | ✅ 根据 `applyTo` 自动应用 | ✅ `.claude/agents/` | ✅ `.cursor/agents/` | | Guardrails | ✅ 自动 + `/instructions` | ✅ 自动应用 (`**`) | ✅ CLAUDE.md + hooks | ✅ `guardrails.mdc` | | 代理选择 | `/agent` | 结合上下文对话 | 按名称调用 | 代理面板 | | 可复用提示 | N/A | ✅ `.github/prompts/` | ✅ `/project:command` | N/A | | 团队定义 | ✅ AGENTS.md | ✅ AGENTS.md | ✅ `.claude/agents/` | ✅ `.cursor/agents/` | | 文件保护 | N/A | N/A | ✅ `settings.json` 拒绝 | N/A | | 安全 hooks | N/A | N/A | ✅ `.claude/hooks/` | N/A | ### 在 VS Code 中 - 指令根据你正在编辑的文件**自动**应用 (得益于每个 `.instructions.md` 文件中的 `applyTo` frontmatter) - `.github/prompts/` 中的提示可作为可复用提示使用 - 使用 "Start Session" 和 "End Session" 提示进行上下文流控制 ### 在 Claude Code 中 - 打开项目时会自动加载 `CLAUDE.md` - 代理位于 `.claude/agents/` — 按名称调用它们 - 命令位于 `.claude/commands/` — 通过 `/project:name` 使用它们 - guardrails hook 会自动阻止破坏性操作 - `settings.json` 保护敏感文件 (.env, keys, secrets) ### 在 Cursor 中 - 全局规则 (`.cursor/rules/`) 会在每次会话中**自动**应用 - 代理位于 `.cursor/agents/` — 从 Agent 面板调用它们 - guardrails 位于 `.cursor/rules/guardrails.mdc` — 始终处于活动状态 - 每个代理都在 frontmatter 中配置了其模型(`auto`、`fast` 或特定模型) ### 各平台对应的文件 **Copilot / VS Code:** ``` .github/copilot-instructions.md → Always active (includes critical guardrails) .github/instructions/*.instructions.md → By file type (applyTo) .github/instructions/guardrails.instructions.md → Always active (applyTo: "**") .github/prompts/*.prompt.md → Invocable from Copilot Chat AGENTS.md → Read as context ``` **Claude Code:** ``` CLAUDE.md → Always active (includes critical guardrails) .claude/agents/*.md → Agents by role (with frontmatter) .claude/commands/*.md → Commands (/project:name) .claude/settings.json → Permissions and hooks .claude/hooks/guardrails-check.sh → Hook PreToolUse ``` **Cursor:** ``` .cursor/agents/*.md → Agents by role (with frontmatter) .cursor/rules/understudy-global.mdc → Global rules (always active) .cursor/rules/guardrails.mdc → Guardrails (always active) ``` ## 贡献 欢迎贡献。在发起 PR 之前请阅读[贡献指南](CONTRIBUTING.md) — 它包含提交约定、版本控制、CHANGELOG 维护和审查流程。 要报告错误或提出改进建议,请使用[议题模板](https://github.com/erniker/understudy/issues/new/choose)。 要报告安全漏洞,请参阅[安全策略](SECURITY.md)。 本项目遵循[贡献者公约](CODE_OF_CONDUCT.md)作为其行为准则。 ## 致谢 - **Caveman 模式**(`caveman` 角色和 `understudy-compress` 脚本) 的灵感来源于 [JuliusBrussee/caveman](https://github.com/JuliusBrussee/caveman) — 感谢其作者关于节省 token 的 AI 文本的最初构想, 以及为我们的移植提供信息的开源 prompt 模式。请参阅 [docs/11-caveman-mode.md](docs/11-caveman-mode.md) 了解我们改编了哪些内容, 以及我们有意未包含哪些功能。
标签:AI开发助手, AI智能体, AI角色扮演, Claude Code, Cursor IDE, GitHub Copilot, LLM开发工具, PyRIT, QA测试, Shell脚本, Subfinder, 代码助手, 代码安全, 后端开发, 多智能体系统, 大语言模型应用, 威胁情报, 开发效能提升, 开发者工具, 批量测试, 漏洞枚举, 特权提升, 自动化代码生成, 自动化部署, 跨平台工具, 软件架构, 软件研发自动化, 防御加固, 项目初始化