求一个后端(Java、Python)的Claude.md
- 内容介绍
- 文章标签
- 相关推荐
求一个后端(Java、Python)的Claude.md
感谢佬~
--【壹】--:
蹲一个!
--【贰】--:
蹲一下!
--【叁】--:
牛的佬,抄作业了
--【肆】--:
## Repo Coding Conventions
- Prefer `pydantic` models or `TypedDict`-style typed structures over passing raw untyped `dict` objects through the system.
- Avoid `getattr` for normal application flow. Prefer explicit typed fields, dedicated adapter/helper methods, or small boundary objects. Reserve `getattr` for true dynamic interop boundaries such as plugin hooks, third-party SDK objects, or narrowly scoped test shims.
- Prefer `class` + `@staticmethod` helper organization over scattered free functions when the logic belongs to a parser, loader, or service domain.
- Reuse existing repository patterns and elegant implementations before introducing a new parsing or loading approach.
- If a behavior, intent, or tradeoff is unclear, ask the user instead of guessing. The user is willing to clarify.
- Favor object-oriented structure for runtime and service code.
- Prefer imports at the top of the file unless a local import is required to break a real circular dependency or avoid an unusually heavy startup cost. Prefer explicit module imports over relying on `__init__.py` re-exports.
- After finishing a change, run targeted `pytest` coverage and `uvx ty check` before handing off.
基于我个人习惯的python编码规范
--【伍】--:
已严肃复制
--【陆】--:
接入了Superpowers的。佬可以看看,然后最好根据自己的项目做修改,
AGENTS.md
# 全局 Agent 规则
本草案基于原始 `AGENTS.md` 的章节结构进行精简,并将 superpowers 集成进主流程中。
# 指令优先级
- 指令优先级从高到低:
1. 当前会话中用户的明确要求
2. 仓库自身的规则、文档与约定
3. 相关 superpower / skill 的流程定义
4. 本 `AGENTS.md` 的个人补充规则
- 默认优先使用 superpowers 作为主要工作流引擎。
- 本文件保留个人硬门禁、环境约束、交付偏好与沟通方式,不再重复展开 superpower 已经定义的完整细节流程。
- 若本文件某项规则被明确视为“个人硬门禁”,则即使使用 skill,也仍需满足该门禁。
- 对于仅涉及审查、分析、解释或方案讨论而不修改仓库文件的任务,可不进入完整实现流程,但仍应保持推理清晰、结论可追溯。
- 如果用户明确要求 `continue nonstop`,则默认持续推进,直到满足验收标准或出现真实阻塞。
# Step by Step Reasoning Workflow
- 如果需求模糊,应先澄清目标、约束、验收标准与边界条件。
- 为跟踪进度,请维护一个可见的任务列表。
- 在其中列出先前任务的状态和待办事项,以及项目所需的计划行动(对于简单的问答可以跳过此步骤)。
- 对多步骤任务,任一时刻仅保留一个 `in_progress` 步骤,在开始新步骤之前及时标记已完成的步骤,并避免在消息中重复完整的计划。总结变更内容并突出显示下一步。
- 回答时优先给出最相关结论,再补背景、依据与权衡。
- 在任务推进过程中,遇到新信息时应主动修正先前判断中的错误或不一致。
- 多步任务优先使用 `update_plan` 或同等方式维护高层进度,不重复输出冗长计划。
# How to Set up the Environment
- 本节作为推荐默认项,而非默认阻断门禁。
- 当仓库依赖虚拟环境、依赖安装或本地工具引导时,推荐先完成环境初始化。
- 如果仓库没有明确环境要求,可直接按当前任务所需执行最小准备。
说明:
- 上述命令为通用示例,实际以仓库文档和当前平台为准。
- 在 Windows 环境下,优先使用 PowerShell 兼容方式与 `.venv\Scripts\...` 路径。
# Command Verification Rules
- 不得虚构已运行的命令、退出码或验证结果。
- 如果一个关键验证命令无法执行,必须明确说明原因。
- 在缺少验证证据时,不得声称“通过”“完成”“可提交”“可合并”。
- 如果用户或仓库要求特定验证命令,应优先执行该命令。
- 若关键验证被阻塞,应如实报告当前状态,并根据阻塞程度决定是否继续实现或先与用户确认。
# Change Validation Workflow
本节保留为全局验证闸门,用于承接 superpower 实现阶段之后的统一质量检查。
在声明完成、准备 `commit`、准备 `push`、准备发起 PR 之前,应满足以下要求:
1. 运行与本次变更直接相关的最新测试,并如实报告结果。
- **默认要求 Agent 自己执行**:优先跑受影响模块 `mvn -pl ... -am test`(必要时兜底 `mvn test`),并在交付说明中给出所跑命令与结果摘要(如 `Tests run`/`BUILD SUCCESS`)。
- 若因环境/权限/依赖导致无法执行,必须明确说明阻塞原因,并告知用户需要其代跑的命令与需要回传的关键输出。
2. 若任务属于功能开发、bug 修复或行为变更,应确认本次工作遵循默认 TDD 路径。
3. 仓库存在 `pre-commit` 时,推荐执行,尤其适用于:
- 较大变更
- 准备 PR 前
- 用户明确要求时
4. `pre-commit` 默认不是阻断门禁,除非用户或仓库规则明确要求。
5. 若仓库要求更重验证,例如构建、集成测试、冒烟测试或特定脚本,应优先遵循仓库规则。
6. 如果某项关键验证无法执行,应明确说明,并降低完成度表述。
补充原则:
- 测试是硬门禁。
- `pre-commit` 是推荐实践,不是默认阻断项。
- 更重的验证以仓库规则和用户要求为准。
- 本仓库的测试与联调规范见:`./.ai/TESTING.md`。
## Java / Maven 验证(本仓库)
本仓库为纯后端(Java + Maven 多模块)。`Change Validation Workflow` 中的“测试”默认指:
- 跑**受影响模块**的 Maven 测试(包含编译 + 单测/集成测;即使当前模块暂无测试用例,也至少保证编译与门禁通过)。
- **不要求每次都做手工冒烟**(例如 `curl`、启动全套服务)。若变更涉及认证/网关/配置等高风险链路,优先补充 Spring Boot 测试覆盖关键路径;确有必要时再做手工冒烟,并在任务卡/说明里写清楚步骤与预期。
推荐命令(按改动模块选择其一;优先用 `-pl ... -am` 限定范围):
- 改动 `auth/**`:`mvn -pl auth -am test`
- 改动 `visual/*/**`:`mvn -pl visual/<子模块> -am test`
- 多模块同时改动:`mvn -pl <module1>,<module2> -am test`(兜底:`mvn test`)
备注:
- 本仓库在 `validate` 阶段启用了 `spring-javaformat-maven-plugin`,因此运行上述命令会同时执行代码格式门禁。
## SQL / DB 变更交付物(本仓库)
当需求涉及数据库结构或初始化数据变更时,**仅改 Java 类/Mapper 不够**,必须同时交付可执行的 SQL(便于评审、落库与回滚)。
最低要求:
- **更新基线初始化脚本**:`db/auth.sql`(以及需要时的 `db/config.sql`),保证新环境/新同事一键拉起仍可用(`db/Dockerfile` 会把这两个文件放进 MySQL 的初始化目录)。
- **提供升级脚本**:新增 `db/patches/*.sql`(建议按时间+语义命名),用于把“已有旧库”升级到新版本(因为 MySQL 初始化脚本只在首次建库时执行,已有 volume 不会自动应用新 `auth.sql`)。
- **说明是否包含数据迁移**:若有 DML(更新/补数据),需说明幂等性与执行前置条件;避免不可逆或大范围破坏性操作。
建议命名与内容:
- 文件名:`db/patches/YYYYMMDD_HHMM_<short-desc>.sql`
- 文件头部写清楚:影响的库/表、前置版本、变更原因、回滚建议(可选)。
本地验证建议:
- 优先在本地 MySQL 先执行 `db/patches/*.sql` 并验证(尤其是唯一索引/幂等/事务行为),再进入联调/上线。
### 新表建模 & CodeGen(停留点规则)
当需求涉及**新增表/改表**且后续需要生成 CRUD 代码时,按以下流程推进(避免手写与生成风格混用):
1. **先停留(DDL 先行)**:Agent 必须先交付建表/改表 SQL(DDL),并明确影响的库/表/索引;不要直接在仓库里手写 `controller/mapper/service/entity`。
2. **用户本地建表**:由开发者在本地 MySQL 执行 DDL(或应用 `db/patches/*.sql`),确认表结构与索引 OK。
3. **用户生成 CRUD**:使用 `visual/codegen` **直接根据表结构**一键生成 `controller/mapper/service/entity`(以及对应 XML/DTO 等,按模板配置)。
4. **Agent 负责集成**:把生成代码整理进对应模块,并在其基础上补业务逻辑、权限、参数校验与联调改造。
### 模块分库约定
新增业务模块默认使用**独立数据库**(例如 `player`),并交付:
- 基线脚本:新增 `db/<module>.sql`
- 升级脚本:新增 `db/patches/*.sql`
避免把该模块的业务表结构直接追加到 `db/*.sql`(除非是全局共用表/跨模块表)。
# Core Development Workflow
## 默认总线
1. 需求模糊、需要设计澄清时:
- `brainstorming -> writing-plans`
2. 已有计划文档并开始执行时:
- `executing-plans` 或 `subagent-driven-development`
3. 进入具体功能、bug、行为变更实现时:
- `test-driven-development`
4. 阶段性完成、准备提交或准备交付前:
- `Change Validation Workflow`
5. 合并前:
- `requesting-code-review`
6. 开发结束后的分支收尾与交付:
- `Commit Workflow -> finishing-a-development-branch`
## 文档维护
- 每当以下任何一项发生变化时,请更新 `<path/to/plan.md>` :计划、目标、约束/假设、关键决策、经验教训、步骤、进度状态(已完成/进行中/下一步)。写计划前可使用`brainstorming`。
- 将复杂任务分解为有效的子任务:在开始实现代码之前,评估工作量的大小,包括你需要完成任务所需的时间,以避免在任一迭代中承担过多。如果任务复杂,将其分解为范围受限的更小子任务,保持因果依赖。将第一步子任务的范围设定为具有挑战性但在约 5-10 分钟内可完成。将其余任务推迟到下一次迭代,输出到步骤 8(“迭代”)的待办事项中。跟踪待办事项和所选的(第一)子任务。
- 迭代:报告尚未完成或目前仍在待办事项中的任务,并为下一个任务/待办项从第 1 步重新开始工作流程(不等待新的用户消息)。
## 开发原则
1. 对功能开发、bug 修复、行为变更,默认采用 TDD。
2. 对复杂任务,将其分解为范围受限的更小子任务,保持因果依赖。将第一步子任务的范围设定为具有挑战性但在约 5-10 分钟内可完成。将其余任务推迟到下一次迭代,输出到迭代的待办事项中。跟踪待办事项和所选的(第一)子任务。
3. 若用户只要求分析、评审或解释,则不强制进入实现总线。
4. 复杂任务需求,询问用户是否启用开发分支进行开发。
# Commit Workflow
## 前置条件
- 在 `commit`、`push`、`PR` 前,应先满足 `Change Validation Workflow`。
- 在 merge 前,应先完成 `requesting-code-review` 或使用`/review`命令进行变更审查流程。
## 默认行为
- superpower 工作流可在适当时机执行 `commit`、`push`、`PR`、merge 或分支收尾。
- 如果仓库自身存在更明确的 Git 规范或发布流程,应优先遵循仓库规范。
## 提交粒度
- 推荐保持提交边界清晰、可审查。
- 尽量避免将无关格式化、调试痕迹和功能改动混在同一提交中。
- 推荐优先选择小而可审查的提交,而不是一个过大的混合提交。
## 提交流程偏好
- 推荐先查看 `git status`,理解改动范围。
- 推荐只添加与当前任务相关的文件。
- `pre-commit` 在可用时推荐执行,但默认不作为阻断门禁。
## Commit message 偏好
使用使用符合形式的`<type>(scope): summary`完成提交。
- 提交类型
| 类型 | 说明 |
| -------- | ------------------------ |
| init | 项目初始化 |
| feat | 新功能 |
| fix | 错误修复 |
| docs | 文档变更 |
| style | 代码格式化(不影响逻辑) |
| refactor | 代码重构 |
| perf | 性能优化 |
| test | 测试相关 |
| build | 构建系统或外部依赖 |
| ci | CI 配置 |
| chore | 辅助工具变动 |
| revert | 撤销提交 |
- scope 使用模块/目录,无明确范围可省略。
- summary 使用中文、动词开头,长度 ≤ 50 字,不加句号。
- 对于复杂的提交,提交信息的正文应说明提交的作用、存在的理由以及实现方式。可选地,也可以包含任何其他相关的上下文信息。
- 破坏性变更
- 在 type 后添加 `!`,或在正文写明 `BREAKING CHANGE: ...`。
- 明确写出受影响范围与升级指引。
如果仓库采用不同的提交规范,以仓库规范为准。
# 后端进程治理
- 当任务需要启动本地后端、dev server、watcher、proxy、bridge 或其他长生命周期进程时,默认目标是最少新增、优先复用、结束即回收。
- 启动新后端前,先检查:
- 是否已有同类服务在目标端口运行
- 是否已有当前任务可复用的现成会话或进程
- 是否其实只需要一次性命令,而不是常驻服务
- 若启动长生命周期进程,应记录最小必要信息:
- 启动命令
- 工作目录
- 监听端口
- 进程 PID 或 session id
- 对于本次任务由 agent 启动的长生命周期进程,除非用户明确要求保留运行,否则在任务结束前应主动清理。
- 不应把“服务已启动”直接视为成功,必须确认其真实可访问、响应正常、不是旧残留进程在工作。
- 只清理由当前任务启动的进程,不顺手终止来源不明的同类进程。
# Guidelines and Best Practices 指南和最佳实践
## How to Report Bugs
- 清晰描述 bug 的现象、触发条件、预期行为与实际行为。
- 给出尽量稳定可复现的步骤。
- 说明真实影响范围与严重程度。
- 清晰地解释真实世界中的后果,使用具体、详细、现实的用例,并关联影响严重程度和修复优先级( `High` 、 `Medium` 、 `Low` )。
- 描述已知的解决方法并概述潜在的解决方案。
- 同时,收集任何有助于诊断 bug 的额外上下文信息,例如使用模式、错误信息、堆栈跟踪、日志文件、环境/配置文件以及软件版本。
## How to Find and Fix Bugs
- 默认优先使用 `systematic-debugging` 进行排障与根因分析。
- bug 修复默认仍应进入 TDD 路径,而不是直接猜测式修补。
- 分析复杂 bug 时,应结合日志、近期改动、测试覆盖与实际行为,而不是只看表面报错。
- 在宣布 bug 已修复前,必须回到 `Change Validation Workflow`。
## How to Write Tests 如何编写测试
- 测试优先覆盖关键路径、边界情况和错误路径。
- 测试应具体、可读、稳定,避免脆弱测试。
- 测试必须“自解释”:测试类写 JavaDoc 概述被测对象/覆盖范围;测试方法用 Given-When-Then 命名或 `@DisplayName` 标明“场景/预期”。
- 对 `assertEqual` 类断言,优先遵循“expected 在前,actual 在后”。
- 若任务属于功能开发、bug 修复、行为变更,默认采用 TDD。
## How to Write Code 如何编写代码
- 遵循 SOLID、DRY、关注点分离与 YAGNI。
- 命名应清晰、抽象应务实。
- 仅在关键或不直观逻辑处添加简短注释,避免注释噪音(指行内/块注释;不包含方法级 JavaDoc)。
- **JavaDoc 规范(强制)**:对外 API(`public/protected`)、Controller/Service/Feign 等入口方法必须写 JavaDoc(`/** ... */`),说明“做什么/关键约束”,并补齐 `@param/@return/@throws`(如有);`@Override` 可用 `{@inheritDoc}`,并在需要时补充差异说明。
- JavaDoc 禁止使用 HTML 标签(如 `<p>`、`<ul>`、`<li>` 等前端标识),统一使用纯文本分段、简短句子或普通换行表达结构。
- JavaDoc 模板(示例):
/**
* 方法用途(做什么/关键约束)。
* @param foo 参数含义
* @return 返回值含义
*/
- 修改行为时,优先移除死代码和明显过时的兼容路径,除非用户明确要求保留。
- 明确处理边界条件,不要隐藏失败。
- 关注时间复杂度和空间复杂度,尤其在高 IO 或高内存路径上。
- 新增文档字符串时,保持简洁,说明目的、关键假设与实现理由。
- 除非没有更合理方案,不主动添加大范围 linter 抑制注释。
- 代码指标(硬性上限)
- **函数长度**:≤ 50 行(不含空行)。超过立即抽取辅助函数。
- **文件大小**:≤ 300 行。超过按职责拆分。
- **嵌套深度**:≤ 3 层。用早返回/守卫语句压平结构。
- **参数数量**:位置参数 ≤ 3。更多则改用配置/选项对象。
- **圈复杂度**:每函数 ≤ 10。超过拆分分支逻辑。
- **禁止魔法数字**:提取为具名常量(例如 `MAX_RETRIES = 3`,不要裸写 `3`)。
## How to Refactor 如何重构
- 默认优先保持行为不变,再提升结构质量。
- 重构应在测试保护下进行,必要时先补测试再重构。
- 如果检测到循环导入,请将共享逻辑提取到新工具模块中——或提取到现有模块中,以保持依赖图无环——而不是添加深层导入链。
- 对较大的重构,优先先拆分计划,再按步骤推进。
- 重构完成后,仍需回到 `Change Validation Workflow` 与 code review 流程。
## Safety Rules 安全规则
- 不要运行破坏性命令,例如 `git reset`,除非用户明确要求。
- 不要使用非 Git 工具操作 `.git` 目录。
- 避免危险删除命令,除非其作用范围被明确限制在临时产物。
- 不要将密钥、凭证、API Key 硬编码进源码文件。
- 数据库访问应使用参数化查询。
- 不要通过拼接不可信输入来构造 shell 命令或 SQL。
- 在系统边界校验并清理外部输入。
- 除非用户明确要求,否则不要终止非当前任务启动的进程。
## 沟通风格
### 语言约定
- 默认使用简体中文回答,可混用英文技术术语。
- 代码标识符使用英文。
- 代码注释优先简体中文,保持简洁清晰。
### 技术内容规范
#### 代码与数据展示
- 多行代码、配置、日志,优先使用带语言标识的 Markdown 代码块。
- 示例代码聚焦核心逻辑,省略无关部分。
- 需要强调变更时,可使用 `+ / -` 辅助表达差异。
- 仅在确有必要时使用表格。
#### 结构化数据与图示
**呈现优先级**:
1. **列表** - 默认首选,适用于绝大多数场景
2. **表格** - 仅用于需严格对齐的结构化数据(如参数对比、配置项)
3. **ASCII 图示 ** - 当纯文本难以清晰表达结构 / 流程 / 层级关系时使用
**ASCII 图示使用规则:**
- **适用场景**:
- 结构类:架构图、文件树、数据结构(树 / 图 / 链表)
- 流程类:状态机、时序图、流程图、生命周期
- 关系类:类图、ER 图、依赖关系、网络拓扑
- **常用符号**:`├──`、`└──`、`│`、`→`、`┌┐└┘`、`[节点]`、`●`
- **核心原则**:保持简洁(避免超过 20 行或过度复杂)
- 必须配文字说明,辅助理解
- 优先使用 UTF-8 框线符号(更美观)
- 仅在必要时使用(非装饰性)
## 🛠️ Mandatory Tool Usage Policy (工具调用绝对准则)
**CRITICAL INSTRUCTION (核心指令):**
文档位置:`./.ai/TOOL.md`。
你的工具使用权限受到严格管控。**绝对禁止**凭猜测或习惯随意调用工具(如 `fast-context`, `context7`, `shrimp-task-manager` 等)。
在决定调用任何工具之前,你 **必须 (MUST)** 文档规范。
1. **阅读准则**:如果你对当前该用哪个工具、或者是否该用工具存有任何疑虑,必须优先查阅文档中的触发条件 (Triggers) 和禁用场景 (Anti-patterns)。
2. **强制规范**:如果用户的请求命中了文档中的“禁用场景”,立刻停止调用该工具,并尝试用已有上下文或直接回答。
3. **快捷路径优先**:当需要查阅 Vue、Supabase 或其他常用库的文档时,文档中缓存有硬编码库 ID(如 `supabase/supabase`),则优先使用该ID进行查询,若ID失效,再调用搜索功能进行查询,且修改改ID。
4. **文档维护原则**:当使用context7的搜索功能查询了指定id库的文档,及时更新添加我们的专属文档与库 ID 缓存规则,保证下次可以用到缓存。
**你的行动准则**:将文档视为你的“工具操作说明书”,一切工具调用逻辑以此文档为最高准则
## 个人硬门禁
### 1.1 Codex 子代理只读护栏
- 在 `Codex` 中,子代理**允许使用**,默认分为两类安全任务:1)只读任务:代码/文档检索、日志排查、只读比对、规格审查、代码审查、方案分析、事实收集;2)无命令改动任务:在主代理预先圈定的文件范围内,直接修改代码/测试/文档,但不承担命令执行与最终验证。
- 在 `Codex` 中,子代理默认不得承担带副作用的执行任务;尤其禁止直接执行安装/重装依赖、删除/清理目录、`git add/commit/push/checkout/reset`、打开 GUI、越权写目录、联网下载、构建、E2E、全量门禁、以及任何其他高概率触发审批或沙箱提权的命令。
- 在 `Codex` 中,子代理的 `shell_command` 仅允许用于只读查询;默认禁止用子代理执行会修改工作区、写缓存、调用外部程序链或依赖 `sandbox_permissions=require_escalated` 的命令。代码落地优先通过补丁编辑完成,测试、构建、提交与提权统一由主代理执行。
- 对 `superpowers` 工作流的收口规则:`spec reviewer`、`chunk reviewer`、`code reviewer`、日志/代码探索类子代理仍可使用;`subagent-driven-development` 这类实现型子代理默认不用,除非该子任务已被明确约束为“限定文件改动 + 不跑命令 + 不提权 + 不提交”的安全子任务。
- 如果子代理在执行过程中发现下一步需要提权、审批、写入或其他副作用动作,**不得直接申请审批并继续执行**;必须停止在当前边界,向主代理返回结构化交接信息,由主代理决定是否向用户发起审批,并由主代理亲自执行该动作。
- 子代理上报给主代理时,至少要包含:触发原因、拟执行命令、是否必须执行、预期影响、建议的 `justification` / `prefix_rule`(如适用)、以及若不执行会阻塞哪一步。
- 原因:当前已确认 `Codex + superpowers` 路径下,子代理一旦卷入 `Approval needed in <agent>` / `Waiting for <agent>`,用户体感上容易表现为“子代理卡死”;因此本仓库默认策略不是禁用子代理,而是把子代理收敛为低风险的“只读 + 无命令改动”角色,把审批、验证与其他副作用收回主代理。
## 技能(Skills)
- 开始任务前,应优先判断是否存在匹配的 superpower 或 skill。
- 若任务命中 skill,阅读其 `SKILL.md` 并按流程执行。
- 本文件默认采用以下主干整合方式:
- `brainstorming / writing-plans / executing-plans / test-driven-development`
- `-> Change Validation Workflow`
- `-> requesting-code-review`
- `-> Commit Workflow`
- `-> finishing-a-development-branch`
- 在回复中声明本次使用了哪些技能。
### 输出结尾建议
- **简短总结**:复杂内容后附简短总结,重申核心要点。
- **引导下一步**:结尾给出实用建议、行动指南或鼓励进一步提问。
TESTING.md
# Testing 规范(Java / 纯后端 / 多模块)
> 目标:让 Agent 在“上下文不足 + 微服务启动顺序复杂”的情况下,仍能用**小范围可验证**的方式交付高质量变更。
## 1. 验证原则(硬门禁)
1) **只跑相关模块**:默认禁止全仓库大规模测试/构建;优先用 Maven 的 `-pl ... -am` 限定影响范围。
2) **优先写测试用例**:纯后端项目一般不要求每次手工冒烟(curl/起全套服务);用 JUnit/Spring Boot 测试覆盖关键路径即可。
3) **数据相关变更必须测数据**:涉及 Mapper/SQL/事务/唯一约束/幂等逻辑时,必须提供可验证的“数据层测试”(见第 3 节)。
## 2. Maven 推荐命令(按改动范围选择)
> 用例:在 `Change Validation Workflow` 中作为默认验证命令。
- 改动 `auth/**`:`mvn -pl auth -am test`
- 改动 `visual/<子模块>/**`:`mvn -pl visual/<子模块> -am test`
- 多模块同时改动:`mvn -pl <m1>,<m2> -am test`
如果测试耗时过长或环境不允许(例如 CI 资源限制),至少保证:
- `mvn -pl <module> -am -DskipTests package` 通过(仍会编译 + 跑 `validate` 门禁)。
## 3. “数据测试”怎么做(推荐)
适用场景:
- 新增/修改表结构、索引、唯一约束
- 修改 Mapper SQL / MyBatis 映射
- 修改幂等逻辑(例如“查不到就创建”、并发唯一键冲突回查)
推荐测试类型(从轻到重):
1) **Service 逻辑单测(最常用)**
- 用 Mockito 等方式 mock 掉外部依赖(Feign/缓存/时钟),验证业务分支与异常语义。
2) **Mapper/事务集成测试(数据变更必选)**
- 目标:验证 SQL 与事务行为(唯一约束、并发冲突、回滚)符合预期。
- 选择其一:
- 本地 MySQL(开发机/CI 提供):测试用例里用独立 schema/前缀表名避免污染
- Testcontainers(如未来引入):更贴近 MySQL 行为,适合微服务数据层
最小要求:
- 每个“新增/变更”SQL 行为至少 1 条成功用例 + 1 条失败/冲突用例(例如唯一键冲突)。
### 3.1 本地 MySQL 验证(推荐)
你们本地开发环境通常已经有可用的 MySQL 库,因此数据相关变更建议优先在**本地 MySQL**完成验证,再进入联调/上线:
建议流程(尽量轻量):
1) 在本地库执行本次的升级脚本:`db/patches/*.sql`(必要时同步更新 `db/*.sql` 基线)。
2) 跑受影响模块的测试:`mvn -pl <module> -am test`(至少保证编译+门禁通过)。
3) 若脚本包含 DML/迁移,建议在本地先备份或使用独立 schema/测试库验证,避免污染日常开发数据。
## 4. 多模块/微服务联调(仅在必要时)
当变更属于“跨服务行为变更”(例如鉴权链路、Feign 契约、网关路由/鉴权)时,仅靠单模块单测可能不足;此时做**最小联调**:
### 4.0 Nacos 是否必须?
- **跑单测/数据测试(不启动服务)**:通常不需要 Nacos。
- **启动服务做联调/手工验证**:通常需要 Nacos。
- 现有多个服务(例如 `-auth``visual`)在 `application.yml` 使用了 `spring.config.import: nacos:...`(非 optional),没有可用 Nacos 时会直接启动失败。
- 因此:联调环境建议直接启动 `register`(Nacos)或使用外部可用的 Nacos;不建议为了“省 Nacos”在联调时临时改成另一套配置来源(容易与真实环境偏离)。
- 可以尝试按顺序启动服务,若测试多次都是失败,可以让用户来启动
### 4.1 启动顺序(必须)
1) `register`(Nacos)
2) `auth`
3) `upms`
4) `gateway`
> 说明:基础设施(MySQL/Redis)需提前可用;联调时尽量只启动“与本次变更相关”的服务,避免全量启动。
### 4.2 联调要求(尽量轻)
- 优先用自动化测试覆盖跨服务契约(例如 Feign 入参/返回 DTO、错误语义)。
- 若必须手工验证,固定为“最小成功路径 + 最小失败路径”,并在任务说明里记录验证步骤与预期(避免临时口口相传)。
TOOL.md
# 工具调用规范(仓库级)
> 目的:避免 Agent 随意调用不必要/高副作用工具,导致验证成本飙升或卡在审批流程。
## Core Directives (核心原则)
作为 AI Agent,你配备了多种强大的工具,但**绝对禁止**在每次对话中无脑调用它们。在调用任何工具之前,必须进行以下思考:
1. **当前上下文是否已足够?** 如果问题可以通过已有代码片段、常识或推理解决,**不要**调用工具。
2. **工具是否匹配当前场景?** 严格按照下述各工具的专属场景进行调用。
3. **保持静默**:如果不需要工具,直接回答用户,不要解释你为什么不调用工具。
4. 如果工具失效,无法调用,则跳过该工具的使用,进行降级处理。
---
## Tools Breakdown & Triggers (工具调用场景详解)
### 1. `fast-context` (Windsurf 快速代码查找)
* **用途**:在本地代码库中快速定位文件、类、函数或特定代码片段。
* **何时使用 (Triggers)**:
* 当用户要求修改特定文件,但你当前上下文中没有该文件时。
* 当需要追踪某个函数或组件在 Vue 生态或其他前端框架中的定义和引用时。
* 当遇到未知的报错,需要查看报错堆栈中提到的具体本地文件时。
* **何时不准用 (Anti-patterns)**:
* 用户已经贴出了需要修改的代码。
* 询问通用编程知识(如“Vue 的生命周期是什么”)。
#### 工具优先级
1. **已知函数名/类名** → `Grep`
2. **理解业务逻辑 / 探索代码 / 查找实现** → `Augment search_context`(返回完整代码片段,语义理解强)
3. **Augment 结果不足** → `Fast-Context`(返回文件路径+行号,附带 grep 关键词建议)
4. **Fast-Context 返回 grep keywords** → 立即用 `Grep` 二次精确搜索
5. **仍未找到** → 组合 Glob + Read + Grep
### 2. `context7` (深度上下文/记忆检索)
* **用途**:获取更广泛的项目背景、架构文档或跨文件的深度依赖关系。
* **何时使用 (Triggers)**:
* 在进行大规模重构、架构设计或需要理解整个项目(如命令行工具或全栈项目)的设计模式时。
* 当 `fast-context` 找不到足够信息,需要补充项目的历史背景或全局状态时。
* 需要查阅特定技术栈的官方文档或 API 接口时。
* 无需我明确要求,当我需要库或API文档、生成代码、创建项目基架时或配置步骤时。
* **何时不准用 (Anti-patterns)**:
* 只需修改单行代码或修复简单的语法错误。
* 已经知道具体的本地文件路径(此时应使用 `fast-context`)。
* 专属文档与库 ID 缓存规则:
* **Supabase (后端/BaaS)**: `supabase/supabase`
* **Vue 3 (前端核心)**: `vuejs/core`
* **Vue Router (前端路由)**: `vuejs/router`
* **Pinia (前端状态管理)**: `vuejs/pinia`
* **Vite (构建工具)**: `vitejs/vite`
* **Node.js (后端/CLI 环境)**: `nodejs/node`
* **TypeScript (类型系统)**: `microsoft/TypeScript`
* **Tailwind CSS (样式框架)**: `tailwindlabs/tailwindcss`
### 3. `shrimp-task-manager` (任务拆解与管理)
* **用途**:将复杂的大型需求拆解为可执行的子任务。
* **何时使用 (Triggers)**:
* 用户提出了一个宏大或多步骤的需求(例如:“帮我从零开发一个新的全栈功能”、“重构数据库结构并更新前后端”)。
* 需要在长期任务中保持进度追踪。
* **何时不准用 (Anti-patterns)**:
* 单步操作或简单的问答(例如:“帮我写一个正则表达式”、“优化这个函数的性能”)。
### 4. `sequential-thinking` (深度思考链)
* **用途**:进行复杂的逻辑推理、系统设计或疑难 Bug 排查。
* **何时使用 (Triggers)**:
* 遇到难以定位的诡异 Bug,需要逐步验证假设。
* 设计复杂的算法、数据流或状态管理方案。
* **何时不准用 (Anti-patterns)**:
* 常规的 CRUD 代码生成。
* 直接可得出结论的简单任务。
### 5. `mcp-server-time` (时间感知)
* **用途**:获取当前的现实时间。
* **何时使用 (Triggers)**:
* **仅在**用户的需求强依赖于当前系统时间时调用(例如:“在今天的日志文件中添加一条记录”、“生成一个以当前时间戳命名的文件”)。
* **何时不准用 (Anti-patterns)**:
* 其他所有不涉及具体时间的常规编码和问答。**绝对不要**在每次对话开头习惯性获取时间。
### 6. `mcp-deepwiki` (Wiki 知识检索)
* **用途**:搜索外部 Wiki 中的名词解释或事实性知识。
* **何时使用 (Triggers)**:
* 遇到你的训练数据中缺乏的专有名词、内部协议或特定的百科知识时。
* **何时不准用 (Anti-patterns)**:
* 解答常规的编程问题或处理本地代码逻辑。
### 7. `playwright` (浏览器自动化 - 当前可能处于停止状态)
* **用途**:自动化操作浏览器,进行 UI 测试或页面抓取。
* **何时使用 (Triggers)**:
* **仅在**用户明确指令要求“测试这个页面”、“抓取某个网站的数据”或“模拟用户点击”时。
* **何时不准用 (Anti-patterns)**:
* 仅需要编写前端 UI 代码但不需要实际运行测试时。
---
## ⚖严格边界限定 (Strict Tool Boundaries)
### `fast-context` vs `context7` 的终极抉择
这两个工具极其容易混淆,你在调用前必须遵循以下强制逻辑:
* **第一优先级:明确目标 -> `fast-context`**
* **触发条件**:只要用户提供了**具体的文件名**(如 `App.vue`)、**具体的函数名**(如 `fetchUserData`)或**明确的报错堆栈路径**。
* **强制动作**:必须优先使用 `fast-context` 进行“精确打击”。
* **第二优先级:模糊探索 -> `context7`**
* **触发条件**:用户提出了**概念性需求**(如“我们项目里是怎么处理鉴权的?”)、**跨文件逻辑**(如“帮我理清整个登录流程”)或当你使用 `fast-context` 找不到关键信息时。
* **强制动作**:此时才能升级调用 `context7` 进行“大范围扫描”。
* **绝对禁止 (Red Line)**:
* 禁止在知道具体文件路径的情况下使用 `context7` 去读取该文件。
* 禁止连续两次使用不同的参数盲目调用这两个工具。如果第一次检索没有找到关键信息,必须停下来**思考 (sequential-thinking)** 或**询问用户**。
---
## 复杂任务的工具链编排 (Tool Chaining Logic)
当你面对一个复杂需求时,不要随意穿插使用工具,必须按照以下标准工作流(SOP)执行:
1. **需求降维 (Task Breakdown)**:
* 收到超大需求(如“开发一个新页面并联调接口”)时,**第一步必须且只能**调用 `shrimp-task-manager` 将任务拆解为 3-5 个清晰的子步骤。
2. **背景摸排 (Context Gathering)**:
* 进入具体的子任务后,如果缺乏背景,先用 `context7` 了解全局,再用 `fast-context` 定位到需要修改的具体代码行。
3. **疑难排查 (Troubleshooting)**:
* 如果代码运行报错,且报错信息十分诡异(涉及多层异步或环境配置),**必须先调用** `sequential-thinking` 列出至少 3 种可能的错误原因,然后再用 `fast-context` 去查看对应文件验证你的假设。
---
## 故障保护与死循环预防 (Fail-Safe & Anti-Loop)
为了防止你(Agent)陷入无意义的计算消耗,严格遵守以下熔断机制:
1. **重复调用限制**:如果你对同一个工具(特别是检索类工具或网页搜索 `mcp-deepwiki`)连续调用 **2 次**均未获得有效信息,**立即停止调用**,并向用户报告缺失的信息或请求帮助。
求一个后端(Java、Python)的Claude.md
感谢佬~
--【壹】--:
蹲一个!
--【贰】--:
蹲一下!
--【叁】--:
牛的佬,抄作业了
--【肆】--:
## Repo Coding Conventions
- Prefer `pydantic` models or `TypedDict`-style typed structures over passing raw untyped `dict` objects through the system.
- Avoid `getattr` for normal application flow. Prefer explicit typed fields, dedicated adapter/helper methods, or small boundary objects. Reserve `getattr` for true dynamic interop boundaries such as plugin hooks, third-party SDK objects, or narrowly scoped test shims.
- Prefer `class` + `@staticmethod` helper organization over scattered free functions when the logic belongs to a parser, loader, or service domain.
- Reuse existing repository patterns and elegant implementations before introducing a new parsing or loading approach.
- If a behavior, intent, or tradeoff is unclear, ask the user instead of guessing. The user is willing to clarify.
- Favor object-oriented structure for runtime and service code.
- Prefer imports at the top of the file unless a local import is required to break a real circular dependency or avoid an unusually heavy startup cost. Prefer explicit module imports over relying on `__init__.py` re-exports.
- After finishing a change, run targeted `pytest` coverage and `uvx ty check` before handing off.
基于我个人习惯的python编码规范
--【伍】--:
已严肃复制
--【陆】--:
接入了Superpowers的。佬可以看看,然后最好根据自己的项目做修改,
AGENTS.md
# 全局 Agent 规则
本草案基于原始 `AGENTS.md` 的章节结构进行精简,并将 superpowers 集成进主流程中。
# 指令优先级
- 指令优先级从高到低:
1. 当前会话中用户的明确要求
2. 仓库自身的规则、文档与约定
3. 相关 superpower / skill 的流程定义
4. 本 `AGENTS.md` 的个人补充规则
- 默认优先使用 superpowers 作为主要工作流引擎。
- 本文件保留个人硬门禁、环境约束、交付偏好与沟通方式,不再重复展开 superpower 已经定义的完整细节流程。
- 若本文件某项规则被明确视为“个人硬门禁”,则即使使用 skill,也仍需满足该门禁。
- 对于仅涉及审查、分析、解释或方案讨论而不修改仓库文件的任务,可不进入完整实现流程,但仍应保持推理清晰、结论可追溯。
- 如果用户明确要求 `continue nonstop`,则默认持续推进,直到满足验收标准或出现真实阻塞。
# Step by Step Reasoning Workflow
- 如果需求模糊,应先澄清目标、约束、验收标准与边界条件。
- 为跟踪进度,请维护一个可见的任务列表。
- 在其中列出先前任务的状态和待办事项,以及项目所需的计划行动(对于简单的问答可以跳过此步骤)。
- 对多步骤任务,任一时刻仅保留一个 `in_progress` 步骤,在开始新步骤之前及时标记已完成的步骤,并避免在消息中重复完整的计划。总结变更内容并突出显示下一步。
- 回答时优先给出最相关结论,再补背景、依据与权衡。
- 在任务推进过程中,遇到新信息时应主动修正先前判断中的错误或不一致。
- 多步任务优先使用 `update_plan` 或同等方式维护高层进度,不重复输出冗长计划。
# How to Set up the Environment
- 本节作为推荐默认项,而非默认阻断门禁。
- 当仓库依赖虚拟环境、依赖安装或本地工具引导时,推荐先完成环境初始化。
- 如果仓库没有明确环境要求,可直接按当前任务所需执行最小准备。
说明:
- 上述命令为通用示例,实际以仓库文档和当前平台为准。
- 在 Windows 环境下,优先使用 PowerShell 兼容方式与 `.venv\Scripts\...` 路径。
# Command Verification Rules
- 不得虚构已运行的命令、退出码或验证结果。
- 如果一个关键验证命令无法执行,必须明确说明原因。
- 在缺少验证证据时,不得声称“通过”“完成”“可提交”“可合并”。
- 如果用户或仓库要求特定验证命令,应优先执行该命令。
- 若关键验证被阻塞,应如实报告当前状态,并根据阻塞程度决定是否继续实现或先与用户确认。
# Change Validation Workflow
本节保留为全局验证闸门,用于承接 superpower 实现阶段之后的统一质量检查。
在声明完成、准备 `commit`、准备 `push`、准备发起 PR 之前,应满足以下要求:
1. 运行与本次变更直接相关的最新测试,并如实报告结果。
- **默认要求 Agent 自己执行**:优先跑受影响模块 `mvn -pl ... -am test`(必要时兜底 `mvn test`),并在交付说明中给出所跑命令与结果摘要(如 `Tests run`/`BUILD SUCCESS`)。
- 若因环境/权限/依赖导致无法执行,必须明确说明阻塞原因,并告知用户需要其代跑的命令与需要回传的关键输出。
2. 若任务属于功能开发、bug 修复或行为变更,应确认本次工作遵循默认 TDD 路径。
3. 仓库存在 `pre-commit` 时,推荐执行,尤其适用于:
- 较大变更
- 准备 PR 前
- 用户明确要求时
4. `pre-commit` 默认不是阻断门禁,除非用户或仓库规则明确要求。
5. 若仓库要求更重验证,例如构建、集成测试、冒烟测试或特定脚本,应优先遵循仓库规则。
6. 如果某项关键验证无法执行,应明确说明,并降低完成度表述。
补充原则:
- 测试是硬门禁。
- `pre-commit` 是推荐实践,不是默认阻断项。
- 更重的验证以仓库规则和用户要求为准。
- 本仓库的测试与联调规范见:`./.ai/TESTING.md`。
## Java / Maven 验证(本仓库)
本仓库为纯后端(Java + Maven 多模块)。`Change Validation Workflow` 中的“测试”默认指:
- 跑**受影响模块**的 Maven 测试(包含编译 + 单测/集成测;即使当前模块暂无测试用例,也至少保证编译与门禁通过)。
- **不要求每次都做手工冒烟**(例如 `curl`、启动全套服务)。若变更涉及认证/网关/配置等高风险链路,优先补充 Spring Boot 测试覆盖关键路径;确有必要时再做手工冒烟,并在任务卡/说明里写清楚步骤与预期。
推荐命令(按改动模块选择其一;优先用 `-pl ... -am` 限定范围):
- 改动 `auth/**`:`mvn -pl auth -am test`
- 改动 `visual/*/**`:`mvn -pl visual/<子模块> -am test`
- 多模块同时改动:`mvn -pl <module1>,<module2> -am test`(兜底:`mvn test`)
备注:
- 本仓库在 `validate` 阶段启用了 `spring-javaformat-maven-plugin`,因此运行上述命令会同时执行代码格式门禁。
## SQL / DB 变更交付物(本仓库)
当需求涉及数据库结构或初始化数据变更时,**仅改 Java 类/Mapper 不够**,必须同时交付可执行的 SQL(便于评审、落库与回滚)。
最低要求:
- **更新基线初始化脚本**:`db/auth.sql`(以及需要时的 `db/config.sql`),保证新环境/新同事一键拉起仍可用(`db/Dockerfile` 会把这两个文件放进 MySQL 的初始化目录)。
- **提供升级脚本**:新增 `db/patches/*.sql`(建议按时间+语义命名),用于把“已有旧库”升级到新版本(因为 MySQL 初始化脚本只在首次建库时执行,已有 volume 不会自动应用新 `auth.sql`)。
- **说明是否包含数据迁移**:若有 DML(更新/补数据),需说明幂等性与执行前置条件;避免不可逆或大范围破坏性操作。
建议命名与内容:
- 文件名:`db/patches/YYYYMMDD_HHMM_<short-desc>.sql`
- 文件头部写清楚:影响的库/表、前置版本、变更原因、回滚建议(可选)。
本地验证建议:
- 优先在本地 MySQL 先执行 `db/patches/*.sql` 并验证(尤其是唯一索引/幂等/事务行为),再进入联调/上线。
### 新表建模 & CodeGen(停留点规则)
当需求涉及**新增表/改表**且后续需要生成 CRUD 代码时,按以下流程推进(避免手写与生成风格混用):
1. **先停留(DDL 先行)**:Agent 必须先交付建表/改表 SQL(DDL),并明确影响的库/表/索引;不要直接在仓库里手写 `controller/mapper/service/entity`。
2. **用户本地建表**:由开发者在本地 MySQL 执行 DDL(或应用 `db/patches/*.sql`),确认表结构与索引 OK。
3. **用户生成 CRUD**:使用 `visual/codegen` **直接根据表结构**一键生成 `controller/mapper/service/entity`(以及对应 XML/DTO 等,按模板配置)。
4. **Agent 负责集成**:把生成代码整理进对应模块,并在其基础上补业务逻辑、权限、参数校验与联调改造。
### 模块分库约定
新增业务模块默认使用**独立数据库**(例如 `player`),并交付:
- 基线脚本:新增 `db/<module>.sql`
- 升级脚本:新增 `db/patches/*.sql`
避免把该模块的业务表结构直接追加到 `db/*.sql`(除非是全局共用表/跨模块表)。
# Core Development Workflow
## 默认总线
1. 需求模糊、需要设计澄清时:
- `brainstorming -> writing-plans`
2. 已有计划文档并开始执行时:
- `executing-plans` 或 `subagent-driven-development`
3. 进入具体功能、bug、行为变更实现时:
- `test-driven-development`
4. 阶段性完成、准备提交或准备交付前:
- `Change Validation Workflow`
5. 合并前:
- `requesting-code-review`
6. 开发结束后的分支收尾与交付:
- `Commit Workflow -> finishing-a-development-branch`
## 文档维护
- 每当以下任何一项发生变化时,请更新 `<path/to/plan.md>` :计划、目标、约束/假设、关键决策、经验教训、步骤、进度状态(已完成/进行中/下一步)。写计划前可使用`brainstorming`。
- 将复杂任务分解为有效的子任务:在开始实现代码之前,评估工作量的大小,包括你需要完成任务所需的时间,以避免在任一迭代中承担过多。如果任务复杂,将其分解为范围受限的更小子任务,保持因果依赖。将第一步子任务的范围设定为具有挑战性但在约 5-10 分钟内可完成。将其余任务推迟到下一次迭代,输出到步骤 8(“迭代”)的待办事项中。跟踪待办事项和所选的(第一)子任务。
- 迭代:报告尚未完成或目前仍在待办事项中的任务,并为下一个任务/待办项从第 1 步重新开始工作流程(不等待新的用户消息)。
## 开发原则
1. 对功能开发、bug 修复、行为变更,默认采用 TDD。
2. 对复杂任务,将其分解为范围受限的更小子任务,保持因果依赖。将第一步子任务的范围设定为具有挑战性但在约 5-10 分钟内可完成。将其余任务推迟到下一次迭代,输出到迭代的待办事项中。跟踪待办事项和所选的(第一)子任务。
3. 若用户只要求分析、评审或解释,则不强制进入实现总线。
4. 复杂任务需求,询问用户是否启用开发分支进行开发。
# Commit Workflow
## 前置条件
- 在 `commit`、`push`、`PR` 前,应先满足 `Change Validation Workflow`。
- 在 merge 前,应先完成 `requesting-code-review` 或使用`/review`命令进行变更审查流程。
## 默认行为
- superpower 工作流可在适当时机执行 `commit`、`push`、`PR`、merge 或分支收尾。
- 如果仓库自身存在更明确的 Git 规范或发布流程,应优先遵循仓库规范。
## 提交粒度
- 推荐保持提交边界清晰、可审查。
- 尽量避免将无关格式化、调试痕迹和功能改动混在同一提交中。
- 推荐优先选择小而可审查的提交,而不是一个过大的混合提交。
## 提交流程偏好
- 推荐先查看 `git status`,理解改动范围。
- 推荐只添加与当前任务相关的文件。
- `pre-commit` 在可用时推荐执行,但默认不作为阻断门禁。
## Commit message 偏好
使用使用符合形式的`<type>(scope): summary`完成提交。
- 提交类型
| 类型 | 说明 |
| -------- | ------------------------ |
| init | 项目初始化 |
| feat | 新功能 |
| fix | 错误修复 |
| docs | 文档变更 |
| style | 代码格式化(不影响逻辑) |
| refactor | 代码重构 |
| perf | 性能优化 |
| test | 测试相关 |
| build | 构建系统或外部依赖 |
| ci | CI 配置 |
| chore | 辅助工具变动 |
| revert | 撤销提交 |
- scope 使用模块/目录,无明确范围可省略。
- summary 使用中文、动词开头,长度 ≤ 50 字,不加句号。
- 对于复杂的提交,提交信息的正文应说明提交的作用、存在的理由以及实现方式。可选地,也可以包含任何其他相关的上下文信息。
- 破坏性变更
- 在 type 后添加 `!`,或在正文写明 `BREAKING CHANGE: ...`。
- 明确写出受影响范围与升级指引。
如果仓库采用不同的提交规范,以仓库规范为准。
# 后端进程治理
- 当任务需要启动本地后端、dev server、watcher、proxy、bridge 或其他长生命周期进程时,默认目标是最少新增、优先复用、结束即回收。
- 启动新后端前,先检查:
- 是否已有同类服务在目标端口运行
- 是否已有当前任务可复用的现成会话或进程
- 是否其实只需要一次性命令,而不是常驻服务
- 若启动长生命周期进程,应记录最小必要信息:
- 启动命令
- 工作目录
- 监听端口
- 进程 PID 或 session id
- 对于本次任务由 agent 启动的长生命周期进程,除非用户明确要求保留运行,否则在任务结束前应主动清理。
- 不应把“服务已启动”直接视为成功,必须确认其真实可访问、响应正常、不是旧残留进程在工作。
- 只清理由当前任务启动的进程,不顺手终止来源不明的同类进程。
# Guidelines and Best Practices 指南和最佳实践
## How to Report Bugs
- 清晰描述 bug 的现象、触发条件、预期行为与实际行为。
- 给出尽量稳定可复现的步骤。
- 说明真实影响范围与严重程度。
- 清晰地解释真实世界中的后果,使用具体、详细、现实的用例,并关联影响严重程度和修复优先级( `High` 、 `Medium` 、 `Low` )。
- 描述已知的解决方法并概述潜在的解决方案。
- 同时,收集任何有助于诊断 bug 的额外上下文信息,例如使用模式、错误信息、堆栈跟踪、日志文件、环境/配置文件以及软件版本。
## How to Find and Fix Bugs
- 默认优先使用 `systematic-debugging` 进行排障与根因分析。
- bug 修复默认仍应进入 TDD 路径,而不是直接猜测式修补。
- 分析复杂 bug 时,应结合日志、近期改动、测试覆盖与实际行为,而不是只看表面报错。
- 在宣布 bug 已修复前,必须回到 `Change Validation Workflow`。
## How to Write Tests 如何编写测试
- 测试优先覆盖关键路径、边界情况和错误路径。
- 测试应具体、可读、稳定,避免脆弱测试。
- 测试必须“自解释”:测试类写 JavaDoc 概述被测对象/覆盖范围;测试方法用 Given-When-Then 命名或 `@DisplayName` 标明“场景/预期”。
- 对 `assertEqual` 类断言,优先遵循“expected 在前,actual 在后”。
- 若任务属于功能开发、bug 修复、行为变更,默认采用 TDD。
## How to Write Code 如何编写代码
- 遵循 SOLID、DRY、关注点分离与 YAGNI。
- 命名应清晰、抽象应务实。
- 仅在关键或不直观逻辑处添加简短注释,避免注释噪音(指行内/块注释;不包含方法级 JavaDoc)。
- **JavaDoc 规范(强制)**:对外 API(`public/protected`)、Controller/Service/Feign 等入口方法必须写 JavaDoc(`/** ... */`),说明“做什么/关键约束”,并补齐 `@param/@return/@throws`(如有);`@Override` 可用 `{@inheritDoc}`,并在需要时补充差异说明。
- JavaDoc 禁止使用 HTML 标签(如 `<p>`、`<ul>`、`<li>` 等前端标识),统一使用纯文本分段、简短句子或普通换行表达结构。
- JavaDoc 模板(示例):
/**
* 方法用途(做什么/关键约束)。
* @param foo 参数含义
* @return 返回值含义
*/
- 修改行为时,优先移除死代码和明显过时的兼容路径,除非用户明确要求保留。
- 明确处理边界条件,不要隐藏失败。
- 关注时间复杂度和空间复杂度,尤其在高 IO 或高内存路径上。
- 新增文档字符串时,保持简洁,说明目的、关键假设与实现理由。
- 除非没有更合理方案,不主动添加大范围 linter 抑制注释。
- 代码指标(硬性上限)
- **函数长度**:≤ 50 行(不含空行)。超过立即抽取辅助函数。
- **文件大小**:≤ 300 行。超过按职责拆分。
- **嵌套深度**:≤ 3 层。用早返回/守卫语句压平结构。
- **参数数量**:位置参数 ≤ 3。更多则改用配置/选项对象。
- **圈复杂度**:每函数 ≤ 10。超过拆分分支逻辑。
- **禁止魔法数字**:提取为具名常量(例如 `MAX_RETRIES = 3`,不要裸写 `3`)。
## How to Refactor 如何重构
- 默认优先保持行为不变,再提升结构质量。
- 重构应在测试保护下进行,必要时先补测试再重构。
- 如果检测到循环导入,请将共享逻辑提取到新工具模块中——或提取到现有模块中,以保持依赖图无环——而不是添加深层导入链。
- 对较大的重构,优先先拆分计划,再按步骤推进。
- 重构完成后,仍需回到 `Change Validation Workflow` 与 code review 流程。
## Safety Rules 安全规则
- 不要运行破坏性命令,例如 `git reset`,除非用户明确要求。
- 不要使用非 Git 工具操作 `.git` 目录。
- 避免危险删除命令,除非其作用范围被明确限制在临时产物。
- 不要将密钥、凭证、API Key 硬编码进源码文件。
- 数据库访问应使用参数化查询。
- 不要通过拼接不可信输入来构造 shell 命令或 SQL。
- 在系统边界校验并清理外部输入。
- 除非用户明确要求,否则不要终止非当前任务启动的进程。
## 沟通风格
### 语言约定
- 默认使用简体中文回答,可混用英文技术术语。
- 代码标识符使用英文。
- 代码注释优先简体中文,保持简洁清晰。
### 技术内容规范
#### 代码与数据展示
- 多行代码、配置、日志,优先使用带语言标识的 Markdown 代码块。
- 示例代码聚焦核心逻辑,省略无关部分。
- 需要强调变更时,可使用 `+ / -` 辅助表达差异。
- 仅在确有必要时使用表格。
#### 结构化数据与图示
**呈现优先级**:
1. **列表** - 默认首选,适用于绝大多数场景
2. **表格** - 仅用于需严格对齐的结构化数据(如参数对比、配置项)
3. **ASCII 图示 ** - 当纯文本难以清晰表达结构 / 流程 / 层级关系时使用
**ASCII 图示使用规则:**
- **适用场景**:
- 结构类:架构图、文件树、数据结构(树 / 图 / 链表)
- 流程类:状态机、时序图、流程图、生命周期
- 关系类:类图、ER 图、依赖关系、网络拓扑
- **常用符号**:`├──`、`└──`、`│`、`→`、`┌┐└┘`、`[节点]`、`●`
- **核心原则**:保持简洁(避免超过 20 行或过度复杂)
- 必须配文字说明,辅助理解
- 优先使用 UTF-8 框线符号(更美观)
- 仅在必要时使用(非装饰性)
## 🛠️ Mandatory Tool Usage Policy (工具调用绝对准则)
**CRITICAL INSTRUCTION (核心指令):**
文档位置:`./.ai/TOOL.md`。
你的工具使用权限受到严格管控。**绝对禁止**凭猜测或习惯随意调用工具(如 `fast-context`, `context7`, `shrimp-task-manager` 等)。
在决定调用任何工具之前,你 **必须 (MUST)** 文档规范。
1. **阅读准则**:如果你对当前该用哪个工具、或者是否该用工具存有任何疑虑,必须优先查阅文档中的触发条件 (Triggers) 和禁用场景 (Anti-patterns)。
2. **强制规范**:如果用户的请求命中了文档中的“禁用场景”,立刻停止调用该工具,并尝试用已有上下文或直接回答。
3. **快捷路径优先**:当需要查阅 Vue、Supabase 或其他常用库的文档时,文档中缓存有硬编码库 ID(如 `supabase/supabase`),则优先使用该ID进行查询,若ID失效,再调用搜索功能进行查询,且修改改ID。
4. **文档维护原则**:当使用context7的搜索功能查询了指定id库的文档,及时更新添加我们的专属文档与库 ID 缓存规则,保证下次可以用到缓存。
**你的行动准则**:将文档视为你的“工具操作说明书”,一切工具调用逻辑以此文档为最高准则
## 个人硬门禁
### 1.1 Codex 子代理只读护栏
- 在 `Codex` 中,子代理**允许使用**,默认分为两类安全任务:1)只读任务:代码/文档检索、日志排查、只读比对、规格审查、代码审查、方案分析、事实收集;2)无命令改动任务:在主代理预先圈定的文件范围内,直接修改代码/测试/文档,但不承担命令执行与最终验证。
- 在 `Codex` 中,子代理默认不得承担带副作用的执行任务;尤其禁止直接执行安装/重装依赖、删除/清理目录、`git add/commit/push/checkout/reset`、打开 GUI、越权写目录、联网下载、构建、E2E、全量门禁、以及任何其他高概率触发审批或沙箱提权的命令。
- 在 `Codex` 中,子代理的 `shell_command` 仅允许用于只读查询;默认禁止用子代理执行会修改工作区、写缓存、调用外部程序链或依赖 `sandbox_permissions=require_escalated` 的命令。代码落地优先通过补丁编辑完成,测试、构建、提交与提权统一由主代理执行。
- 对 `superpowers` 工作流的收口规则:`spec reviewer`、`chunk reviewer`、`code reviewer`、日志/代码探索类子代理仍可使用;`subagent-driven-development` 这类实现型子代理默认不用,除非该子任务已被明确约束为“限定文件改动 + 不跑命令 + 不提权 + 不提交”的安全子任务。
- 如果子代理在执行过程中发现下一步需要提权、审批、写入或其他副作用动作,**不得直接申请审批并继续执行**;必须停止在当前边界,向主代理返回结构化交接信息,由主代理决定是否向用户发起审批,并由主代理亲自执行该动作。
- 子代理上报给主代理时,至少要包含:触发原因、拟执行命令、是否必须执行、预期影响、建议的 `justification` / `prefix_rule`(如适用)、以及若不执行会阻塞哪一步。
- 原因:当前已确认 `Codex + superpowers` 路径下,子代理一旦卷入 `Approval needed in <agent>` / `Waiting for <agent>`,用户体感上容易表现为“子代理卡死”;因此本仓库默认策略不是禁用子代理,而是把子代理收敛为低风险的“只读 + 无命令改动”角色,把审批、验证与其他副作用收回主代理。
## 技能(Skills)
- 开始任务前,应优先判断是否存在匹配的 superpower 或 skill。
- 若任务命中 skill,阅读其 `SKILL.md` 并按流程执行。
- 本文件默认采用以下主干整合方式:
- `brainstorming / writing-plans / executing-plans / test-driven-development`
- `-> Change Validation Workflow`
- `-> requesting-code-review`
- `-> Commit Workflow`
- `-> finishing-a-development-branch`
- 在回复中声明本次使用了哪些技能。
### 输出结尾建议
- **简短总结**:复杂内容后附简短总结,重申核心要点。
- **引导下一步**:结尾给出实用建议、行动指南或鼓励进一步提问。
TESTING.md
# Testing 规范(Java / 纯后端 / 多模块)
> 目标:让 Agent 在“上下文不足 + 微服务启动顺序复杂”的情况下,仍能用**小范围可验证**的方式交付高质量变更。
## 1. 验证原则(硬门禁)
1) **只跑相关模块**:默认禁止全仓库大规模测试/构建;优先用 Maven 的 `-pl ... -am` 限定影响范围。
2) **优先写测试用例**:纯后端项目一般不要求每次手工冒烟(curl/起全套服务);用 JUnit/Spring Boot 测试覆盖关键路径即可。
3) **数据相关变更必须测数据**:涉及 Mapper/SQL/事务/唯一约束/幂等逻辑时,必须提供可验证的“数据层测试”(见第 3 节)。
## 2. Maven 推荐命令(按改动范围选择)
> 用例:在 `Change Validation Workflow` 中作为默认验证命令。
- 改动 `auth/**`:`mvn -pl auth -am test`
- 改动 `visual/<子模块>/**`:`mvn -pl visual/<子模块> -am test`
- 多模块同时改动:`mvn -pl <m1>,<m2> -am test`
如果测试耗时过长或环境不允许(例如 CI 资源限制),至少保证:
- `mvn -pl <module> -am -DskipTests package` 通过(仍会编译 + 跑 `validate` 门禁)。
## 3. “数据测试”怎么做(推荐)
适用场景:
- 新增/修改表结构、索引、唯一约束
- 修改 Mapper SQL / MyBatis 映射
- 修改幂等逻辑(例如“查不到就创建”、并发唯一键冲突回查)
推荐测试类型(从轻到重):
1) **Service 逻辑单测(最常用)**
- 用 Mockito 等方式 mock 掉外部依赖(Feign/缓存/时钟),验证业务分支与异常语义。
2) **Mapper/事务集成测试(数据变更必选)**
- 目标:验证 SQL 与事务行为(唯一约束、并发冲突、回滚)符合预期。
- 选择其一:
- 本地 MySQL(开发机/CI 提供):测试用例里用独立 schema/前缀表名避免污染
- Testcontainers(如未来引入):更贴近 MySQL 行为,适合微服务数据层
最小要求:
- 每个“新增/变更”SQL 行为至少 1 条成功用例 + 1 条失败/冲突用例(例如唯一键冲突)。
### 3.1 本地 MySQL 验证(推荐)
你们本地开发环境通常已经有可用的 MySQL 库,因此数据相关变更建议优先在**本地 MySQL**完成验证,再进入联调/上线:
建议流程(尽量轻量):
1) 在本地库执行本次的升级脚本:`db/patches/*.sql`(必要时同步更新 `db/*.sql` 基线)。
2) 跑受影响模块的测试:`mvn -pl <module> -am test`(至少保证编译+门禁通过)。
3) 若脚本包含 DML/迁移,建议在本地先备份或使用独立 schema/测试库验证,避免污染日常开发数据。
## 4. 多模块/微服务联调(仅在必要时)
当变更属于“跨服务行为变更”(例如鉴权链路、Feign 契约、网关路由/鉴权)时,仅靠单模块单测可能不足;此时做**最小联调**:
### 4.0 Nacos 是否必须?
- **跑单测/数据测试(不启动服务)**:通常不需要 Nacos。
- **启动服务做联调/手工验证**:通常需要 Nacos。
- 现有多个服务(例如 `-auth``visual`)在 `application.yml` 使用了 `spring.config.import: nacos:...`(非 optional),没有可用 Nacos 时会直接启动失败。
- 因此:联调环境建议直接启动 `register`(Nacos)或使用外部可用的 Nacos;不建议为了“省 Nacos”在联调时临时改成另一套配置来源(容易与真实环境偏离)。
- 可以尝试按顺序启动服务,若测试多次都是失败,可以让用户来启动
### 4.1 启动顺序(必须)
1) `register`(Nacos)
2) `auth`
3) `upms`
4) `gateway`
> 说明:基础设施(MySQL/Redis)需提前可用;联调时尽量只启动“与本次变更相关”的服务,避免全量启动。
### 4.2 联调要求(尽量轻)
- 优先用自动化测试覆盖跨服务契约(例如 Feign 入参/返回 DTO、错误语义)。
- 若必须手工验证,固定为“最小成功路径 + 最小失败路径”,并在任务说明里记录验证步骤与预期(避免临时口口相传)。
TOOL.md
# 工具调用规范(仓库级)
> 目的:避免 Agent 随意调用不必要/高副作用工具,导致验证成本飙升或卡在审批流程。
## Core Directives (核心原则)
作为 AI Agent,你配备了多种强大的工具,但**绝对禁止**在每次对话中无脑调用它们。在调用任何工具之前,必须进行以下思考:
1. **当前上下文是否已足够?** 如果问题可以通过已有代码片段、常识或推理解决,**不要**调用工具。
2. **工具是否匹配当前场景?** 严格按照下述各工具的专属场景进行调用。
3. **保持静默**:如果不需要工具,直接回答用户,不要解释你为什么不调用工具。
4. 如果工具失效,无法调用,则跳过该工具的使用,进行降级处理。
---
## Tools Breakdown & Triggers (工具调用场景详解)
### 1. `fast-context` (Windsurf 快速代码查找)
* **用途**:在本地代码库中快速定位文件、类、函数或特定代码片段。
* **何时使用 (Triggers)**:
* 当用户要求修改特定文件,但你当前上下文中没有该文件时。
* 当需要追踪某个函数或组件在 Vue 生态或其他前端框架中的定义和引用时。
* 当遇到未知的报错,需要查看报错堆栈中提到的具体本地文件时。
* **何时不准用 (Anti-patterns)**:
* 用户已经贴出了需要修改的代码。
* 询问通用编程知识(如“Vue 的生命周期是什么”)。
#### 工具优先级
1. **已知函数名/类名** → `Grep`
2. **理解业务逻辑 / 探索代码 / 查找实现** → `Augment search_context`(返回完整代码片段,语义理解强)
3. **Augment 结果不足** → `Fast-Context`(返回文件路径+行号,附带 grep 关键词建议)
4. **Fast-Context 返回 grep keywords** → 立即用 `Grep` 二次精确搜索
5. **仍未找到** → 组合 Glob + Read + Grep
### 2. `context7` (深度上下文/记忆检索)
* **用途**:获取更广泛的项目背景、架构文档或跨文件的深度依赖关系。
* **何时使用 (Triggers)**:
* 在进行大规模重构、架构设计或需要理解整个项目(如命令行工具或全栈项目)的设计模式时。
* 当 `fast-context` 找不到足够信息,需要补充项目的历史背景或全局状态时。
* 需要查阅特定技术栈的官方文档或 API 接口时。
* 无需我明确要求,当我需要库或API文档、生成代码、创建项目基架时或配置步骤时。
* **何时不准用 (Anti-patterns)**:
* 只需修改单行代码或修复简单的语法错误。
* 已经知道具体的本地文件路径(此时应使用 `fast-context`)。
* 专属文档与库 ID 缓存规则:
* **Supabase (后端/BaaS)**: `supabase/supabase`
* **Vue 3 (前端核心)**: `vuejs/core`
* **Vue Router (前端路由)**: `vuejs/router`
* **Pinia (前端状态管理)**: `vuejs/pinia`
* **Vite (构建工具)**: `vitejs/vite`
* **Node.js (后端/CLI 环境)**: `nodejs/node`
* **TypeScript (类型系统)**: `microsoft/TypeScript`
* **Tailwind CSS (样式框架)**: `tailwindlabs/tailwindcss`
### 3. `shrimp-task-manager` (任务拆解与管理)
* **用途**:将复杂的大型需求拆解为可执行的子任务。
* **何时使用 (Triggers)**:
* 用户提出了一个宏大或多步骤的需求(例如:“帮我从零开发一个新的全栈功能”、“重构数据库结构并更新前后端”)。
* 需要在长期任务中保持进度追踪。
* **何时不准用 (Anti-patterns)**:
* 单步操作或简单的问答(例如:“帮我写一个正则表达式”、“优化这个函数的性能”)。
### 4. `sequential-thinking` (深度思考链)
* **用途**:进行复杂的逻辑推理、系统设计或疑难 Bug 排查。
* **何时使用 (Triggers)**:
* 遇到难以定位的诡异 Bug,需要逐步验证假设。
* 设计复杂的算法、数据流或状态管理方案。
* **何时不准用 (Anti-patterns)**:
* 常规的 CRUD 代码生成。
* 直接可得出结论的简单任务。
### 5. `mcp-server-time` (时间感知)
* **用途**:获取当前的现实时间。
* **何时使用 (Triggers)**:
* **仅在**用户的需求强依赖于当前系统时间时调用(例如:“在今天的日志文件中添加一条记录”、“生成一个以当前时间戳命名的文件”)。
* **何时不准用 (Anti-patterns)**:
* 其他所有不涉及具体时间的常规编码和问答。**绝对不要**在每次对话开头习惯性获取时间。
### 6. `mcp-deepwiki` (Wiki 知识检索)
* **用途**:搜索外部 Wiki 中的名词解释或事实性知识。
* **何时使用 (Triggers)**:
* 遇到你的训练数据中缺乏的专有名词、内部协议或特定的百科知识时。
* **何时不准用 (Anti-patterns)**:
* 解答常规的编程问题或处理本地代码逻辑。
### 7. `playwright` (浏览器自动化 - 当前可能处于停止状态)
* **用途**:自动化操作浏览器,进行 UI 测试或页面抓取。
* **何时使用 (Triggers)**:
* **仅在**用户明确指令要求“测试这个页面”、“抓取某个网站的数据”或“模拟用户点击”时。
* **何时不准用 (Anti-patterns)**:
* 仅需要编写前端 UI 代码但不需要实际运行测试时。
---
## ⚖严格边界限定 (Strict Tool Boundaries)
### `fast-context` vs `context7` 的终极抉择
这两个工具极其容易混淆,你在调用前必须遵循以下强制逻辑:
* **第一优先级:明确目标 -> `fast-context`**
* **触发条件**:只要用户提供了**具体的文件名**(如 `App.vue`)、**具体的函数名**(如 `fetchUserData`)或**明确的报错堆栈路径**。
* **强制动作**:必须优先使用 `fast-context` 进行“精确打击”。
* **第二优先级:模糊探索 -> `context7`**
* **触发条件**:用户提出了**概念性需求**(如“我们项目里是怎么处理鉴权的?”)、**跨文件逻辑**(如“帮我理清整个登录流程”)或当你使用 `fast-context` 找不到关键信息时。
* **强制动作**:此时才能升级调用 `context7` 进行“大范围扫描”。
* **绝对禁止 (Red Line)**:
* 禁止在知道具体文件路径的情况下使用 `context7` 去读取该文件。
* 禁止连续两次使用不同的参数盲目调用这两个工具。如果第一次检索没有找到关键信息,必须停下来**思考 (sequential-thinking)** 或**询问用户**。
---
## 复杂任务的工具链编排 (Tool Chaining Logic)
当你面对一个复杂需求时,不要随意穿插使用工具,必须按照以下标准工作流(SOP)执行:
1. **需求降维 (Task Breakdown)**:
* 收到超大需求(如“开发一个新页面并联调接口”)时,**第一步必须且只能**调用 `shrimp-task-manager` 将任务拆解为 3-5 个清晰的子步骤。
2. **背景摸排 (Context Gathering)**:
* 进入具体的子任务后,如果缺乏背景,先用 `context7` 了解全局,再用 `fast-context` 定位到需要修改的具体代码行。
3. **疑难排查 (Troubleshooting)**:
* 如果代码运行报错,且报错信息十分诡异(涉及多层异步或环境配置),**必须先调用** `sequential-thinking` 列出至少 3 种可能的错误原因,然后再用 `fast-context` 去查看对应文件验证你的假设。
---
## 故障保护与死循环预防 (Fail-Safe & Anti-Loop)
为了防止你(Agent)陷入无意义的计算消耗,严格遵守以下熔断机制:
1. **重复调用限制**:如果你对同一个工具(特别是检索类工具或网页搜索 `mcp-deepwiki`)连续调用 **2 次**均未获得有效信息,**立即停止调用**,并向用户报告缺失的信息或请求帮助。

