UNPKG

autosnippet

Version:

Extract code patterns into a knowledge base for AI coding assistants

1,231 lines (1,230 loc) 101 kB
/** * DimensionSop — 维度分析 SOP(Standard Operating Procedure) * * 每个维度定义 3 个自定义分析阶段 + 自动生成的提交阶段。 * Builder 模式消除 Phase 4 重复 & 共享质量检查清单。 */ // ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ // Shared Constants // ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ /** Phase 4 共享质量检查项(与 PRE_SUBMIT_CHECKLIST 互补,非重复) */ const SHARED_SUBMIT_CHECKLIST = [ '**数量由证据决定** — 有几条扎实证据就提交几条,不凑数;若本维度在项目中无实质内容则跳过,提交 0 条', 'content 包含 ✅ 正确写法 和 ❌ 禁止写法(如适用)', 'coreCode 是可复制的完整代码骨架', 'doClause 英文祈使句,以动词开头', '引用具体的文件路径和代码行', ]; // ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ // Builder // ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ /** 从紧凑定义生成消费者兼容的完整 SOP 对象 */ function _sop(def) { const steps = def.phases.map((p, i) => ({ phase: `${i + 1}. ${p.name}`, action: p.action, expectedOutput: p.output, ...(p.tools ? { tools: [...p.tools] } : {}), })); steps.push({ phase: `${steps.length + 1}. 提交`, action: def.submitAction, qualityChecklist: [...SHARED_SUBMIT_CHECKLIST, ...(def.submitExtras ?? [])], }); return { ...(def.keywords ? { focusKeywords: [...def.keywords] } : {}), steps, timeEstimate: '1-5 min', commonMistakes: [...def.mistakes], }; } // ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ // ┌──────────────────────────────────────────────┐ // │ Universal Dimensions (13) │ // └──────────────────────────────────────────────┘ // ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ const COMPACT_SOPS = { // ────────────────────────────────────────────── // 1. coding-standards — 命名/注释/文件组织/代码风格 // ────────────────────────────────────────────── 'coding-standards': { keywords: [ '命名约定', '类名前缀', '方法签名', '注释风格', '文件组织', 'camelCase', 'PascalCase', 'snake_case', 'MARK', 'access control', 'import 排序', '缩进', '代码规范', ], phases: [ { name: '命名体系扫描', action: '搜索项目中类/协议/结构体的定义语句,统计类名前缀后缀模式(如 BD/XY 前缀、ViewModel/Service/Repository 后缀)、方法命名风格(动词开头 vs 名词短语)、变量命名约定(camelCase/snake_case)、常量命名方式', output: '项目命名体系全景:类名模式、方法名惯例、变量/常量命名约定、文件名与类名的对应关系', tools: [ 'grep_search 搜索 class/struct/protocol/interface/enum 定义', '浏览核心目录文件列表观察文件命名规律', ], }, { name: '规范一致性验证', action: '跨模块选取核心文件(覆盖不同功能区域),逐一阅读,验证:命名模式是否全局一致、注释风格(MARK 段落/文档注释格式/行内注释习惯)、文件内代码组织顺序(属性→初始化→公开方法→私有方法)、import 排列规则(系统框架/第三方/项目内 分组情况)、access control 使用惯例(public/internal/private/fileprivate 的选择策略)', output: '每条规范有跨模块证据支撑,含具体 文件名:行号 引用', tools: ['read_file 逐个阅读不同模块的代表性文件'], }, { name: '偏差与例外检测', action: '搜索偏离主流命名体系的代码(不同前缀、不同命名风格、不同文件组织方式),区分"历史遗留"、"第三方适配"和"有意的例外设计"', output: '偏差清单及其成因分类 — 判断哪些是要遵循的规范、哪些是要避免的旧写法', }, ], submitAction: '每种规范独立提交候选(**按实际发现提交,无实质内容则跳过本维度**),每个候选聚焦一种具体代码规范', submitExtras: [ '每个候选聚焦单一规范维度(命名约定、注释风格、文件组织、import 规则、access control 分别独立)', ], mistakes: [ '不要只看一两个文件就归纳规范 — 必须跨模块验证一致性,以偏概全是最常见错误', '不要合并不同层次的规范 — "类名前缀"、"方法命名风格"、"文件内代码组织"各自独立成条', '不要写空泛规范如 "use camelCase" — 必须写明项目特有的前缀/后缀/风格及其适用范围', '不要遗漏 access control 约定和 import 排列规则 — 这些是高频编码动作,对一致性影响大', '【跨维度边界】coding-standards 只关注命名/注释/文件组织/代码风格 — 设计模式归 design-patterns,分层架构归 architecture', ], }, // ────────────────────────────────────────────── // 2. design-patterns — 设计模式的使用与实现 // ────────────────────────────────────────────── 'design-patterns': { keywords: [ 'Singleton', 'Factory', 'Delegate', 'Observer', 'Builder', 'Repository', 'Strategy', 'Coordinator', 'Adapter', '设计模式', '工厂', '单例', '代理', 'Protocol', '接口', 'shared', 'default', 'make', 'create', ], phases: [ { name: '模式发现', action: '搜索项目中设计模式的典型信号:Singleton(shared/default/instance), Factory(create/make/build), Delegate(delegate/dataSource), Observer(listener/subscribe/on), Repository(repository/store/dao), Coordinator(coordinator/router/navigator), Strategy(protocol+多实现), Builder(builder/configure)', output: '项目设计模式全景图:每种模式的使用位置、频率、变体形式', tools: [ 'grep_search 搜索 shared/default/create/make/delegate/subscribe 等信号词', '浏览核心目录结构识别模式集中区域', ], }, { name: '实现规范提取', action: '阅读每种模式的代表性实现文件,提取项目的标准写法:线程安全策略(Singleton 的初始化方式)、创建约束(Factory 的参数校验)、生命周期管理(Delegate 的弱引用)、注册/注销对称性(Observer 的移除时机)', output: '每种模式的规范实现骨架(含线程安全、生命周期、约束规则)+ 多个实现实例的代码引用', tools: ['read_file 阅读模式核心实现文件'], }, { name: '反模式与滥用检测', action: '搜索模式的不规范使用:God Object(单个类包含过多职责)、过度继承(深继承链)、滥用 Singleton(本应局部作用域的实例被全局化)、空 Delegate 方法(实现了协议但方法体为空)', output: '反模式实例清单(含文件位置),或确认项目模式使用健康', }, ], submitAction: '每种设计模式单独提交候选(**按实际发现提交,无实质内容则跳过本维度**),包含标准实现骨架和使用约束', submitExtras: [ '每个候选只聚焦一种设计模式的项目特定实现', 'whenClause 需说明何时应使用此模式,dontClause 说明何时不应使用', ], mistakes: [ '不要将不同模式合并为一个候选(如 "创建型模式")— Singleton 和 Factory 必须分别提交', '不要只列模式名称 — 必须包含项目中的实际实现代码,展示规范写法', '不要把框架内置模式当作项目自定义模式 — 只提取项目团队主动采用和约定的模式', '不要忽略模式的约束面(线程安全、生命周期、弱引用)— 约束才是 Recipe 的核心价值', '【跨维度边界】design-patterns 只关注模式的实现规范 — 架构分层归 architecture,编码命名归 coding-standards', ], }, // ────────────────────────────────────────────── // 3. architecture — 分层架构/模块边界/依赖方向 // ────────────────────────────────────────────── architecture: { keywords: [ '架构', '分层', '模块', '依赖方向', 'import', '目录结构', 'Package', 'module', 'layer', 'feature', 'target', '依赖注入', 'DI', '组装', '启动流程', '路由', ], phases: [ { name: '架构层次映射', action: '浏览项目根目录和核心子目录,识别分层架构类型(MVC/MVVM/Clean Architecture/Feature-based/Monorepo)。阅读构建配置(Package.swift/build.gradle/package.json/Cargo.toml/go.mod/pyproject.toml/CMakeLists.txt)确认模块划分。绘制层次关系:哪些目录属于哪一层、各层的职责边界', output: '架构层次图:层名→目录映射→职责定义→层间依赖方向(上层→下层,禁止反向)', tools: ['list_dir 浏览目录树(至少两层深度)', 'read_file 阅读构建配置文件确认模块划分'], }, { name: '依赖规则提取', action: '跨层选取文件阅读 import 语句,验证依赖方向是否全局一致。重点关注:表现层是否依赖了数据层、模块间是否通过协议/接口解耦、是否存在跨 Feature 的直接引用。提取项目的依赖注入/组装方式(构造器注入/Service Locator/DI Container)', output: '依赖规则矩阵(层A可→层B, 层A禁→层C)+ 依赖注入机制说明 + 违规实例(如有)', tools: [ 'grep_search 搜索 import/include/require/from 语句', 'read_file 阅读 DI/组装/启动入口文件', ], }, { name: '边界违规与通信检测', action: '搜索跨层直接调用、循环依赖信号。分析模块间通信方式:事件总线/NotificationCenter/URL 路由/协议抽象/回调闭包。确认是否存在启动顺序依赖或隐式耦合', output: '模块通信模式清单 + 边界违规实例 + 启动流程依赖图', }, ], submitAction: '分层规则、依赖方向约束、模块通信模式分别提交候选(**按实际发现提交,无实质内容则跳过本维度**)', submitExtras: [ 'dontClause 明确表达禁止的跨层调用方向', 'content 中包含架构层次图(文字描述即可)和依赖方向规则', ], mistakes: [ '不要只罗列目录结构 — 必须分析出层间依赖方向和约束规则,目录本身不是知识', '不要遗漏依赖注入/组装机制 — 这是架构的关键胶水层', '不要把分层架构和模块通信合并 — "禁止 Feature 间直接 import"和"使用 URL 路由跨 Feature 通信"是两条独立规则', '不要忽略启动流程中的隐式依赖和初始化顺序要求', '【跨维度边界】architecture 只关注分层/模块/依赖 — 设计模式归 design-patterns,编码风格归 coding-standards', ], }, // ────────────────────────────────────────────── // 4. error-resilience — 错误处理体系与降级策略 // ────────────────────────────────────────────── 'error-resilience': { keywords: [ 'Error', 'Exception', 'catch', 'throw', 'Result', 'try', 'retry', 'fallback', 'recovery', '错误处理', '异常', '降级', 'ErrorType', 'UserFacingError', 'toast', '错误码', 'error mapping', '错误传播', ], phases: [ { name: '错误类型体系扫描', action: '搜索项目中的 Error/Exception 类型定义,构建错误类型层次树。区分:业务错误(如 APIError/BizError)、系统错误(网络/存储/权限)、用户面向错误(展示给用户的提示文案)。关注错误码体系(如有)和错误枚举的分类方式', output: '错误类型层次图:基类→子类/枚举→使用场景映射。含错误码编排规则(如有)', tools: [ 'grep_search 搜索 Error/Exception/enum.*Error 定义', '浏览 Error/Exception 类型集中目录', ], }, { name: '错误传播链路追踪', action: '选取典型业务流程(如网络请求→解析→展示),阅读完整调用链,追踪错误从底层到表现层的传播路径:底层抛出什么错误→中间层如何转换/包装→表现层如何展示给用户。关注统一错误转换层(如 Error Mapper/Handler)、重试策略(指数退避/有限次数)、降级方案(缓存兜底/默认值)', output: '错误传播全链路图(底层→中间层→表现层)+ 重试策略说明 + 降级机制说明', tools: ['read_file 沿调用链逐层阅读错误处理代码'], }, { name: '薄弱点检测', action: '搜索错误处理的薄弱环节:空 catch 块(静默吞错误)、裸 catch(catch 所有异常不区分类型)、未处理的 Promise/async 错误、缺失的 error 回调、print/NSLog 替代正式错误处理', output: '错误处理薄弱点清单 + 项目整体错误处理健康度评估', }, ], submitAction: '错误类型体系、错误传播规则、重试与降级策略分别提交候选(**按实际发现提交,无实质内容则跳过本维度**)', submitExtras: ['每个候选聚焦单一错误处理维度 — 类型体系、传播规则、重试策略、用户提示各自独立'], mistakes: [ '不要把所有错误处理塞进一个候选 — 错误类型体系、传播规则、重试策略、用户提示应分别提交', '不要只写 "使用 try/catch" — 必须说明项目特定的错误类型层次和转换规则', '不要忽略错误传播链路 — "底层 NetworkError 如何变成用户看到的 toast 文案"才是核心知识', '不要遗漏降级策略 — 缓存兜底、默认值回退、优雅退出等异常恢复路径同样重要', '【跨维度边界】error-resilience 只关注错误处理与恢复 — 日志记录归 observability-logging,线程安全归 concurrency-async', ], }, // ────────────────────────────────────────────── // 5. data-event-flow — 数据流/状态管理/事件传播 // ────────────────────────────────────────────── 'data-event-flow': { keywords: [ '数据流', 'event', '事件', 'state', '状态管理', 'Observable', 'Subject', 'Driver', 'Relay', 'Signal', 'Redux', 'Store', 'Combine', 'Flow', 'Publisher', '响应式', 'binding', 'emit', 'subscribe', 'disposeBag', 'Notification', 'EventBus', 'KVO', ], phases: [ { name: '数据流框架识别', action: '搜索项目中的状态管理和事件框架信号:Rx系列(Observable/Subject/Driver/Relay/Flowable), Combine/Publisher, Redux/Flux(Store/Action/Reducer/dispatch), Vuex/Pinia/Zustand(state/mutations/actions), EventBus/Notification/KVO/LiveData/StateFlow。确认主框架选型及其在项目中的角色分配', output: '数据流技术选型全景:主框架 + 辅助机制 + 各层的角色分配', tools: [ 'grep_search 搜索 Observable/Subject/Publisher/Store/dispatch 等信号词', '浏览状态管理/ViewModel 集中目录', ], }, { name: '数据绑定模式深挖', action: '阅读核心 ViewModel/Store 文件,深入分析:数据绑定方式(单向/双向)、Input→Output 转换模式、事件传播路径(用户操作→ViewModel→Service→Repository 的完整链路)、状态持久化策略(内存/磁盘/远程同步)。特别关注 Output 类型约束(如 Driver 不能 error、Relay 必须有初始值)', output: '数据绑定标准模式:输入→转换→输出→UI 的完整链路图 + Output 类型约束规则', tools: ['read_file 阅读核心 ViewModel/Store/Reducer 文件'], }, { name: '订阅泄漏检测', action: '搜索内存泄漏风险模式:未取消的订阅/观察者(disposeBag/cancellable/removeObserver/取消订阅)、闭包/回调内强引用导致循环引用、未取消的 Timer/定时器、长生命周期对象持有短生命周期对象的订阅', output: '泄漏风险点清单 + 项目已有的防泄漏机制(disposeBag 管理策略、weak self 约定)', }, ], submitAction: '数据绑定模式、事件传播路径、订阅管理规则分别提交候选(**按实际发现提交,无实质内容则跳过本维度**)', submitExtras: ['每个候选聚焦单一数据流模式,说明其适用场景和约束'], mistakes: [ '不要只描述框架 API(如 "使用 Observable")— 必须说明项目如何使用该框架、约定了哪些模式', '不要混淆不同框架的模式 — 如果项目同时使用多种响应式/状态管理框架,应按框架分别提交', '不要忽略订阅的生命周期管理 — 订阅取消/引用管理/防泄漏机制的使用约定是核心知识', '不要遗漏 Output 类型约束 — "Driver 不能 error" 这类约束比 "使用 Driver" 更有价值', '【跨维度边界】data-event-flow 只关注数据流/事件/状态 — UI 组件构建归 ui-interaction,设计模式归 design-patterns', ], }, // ────────────────────────────────────────────── // 6. agent-guidelines — 团队开发指南与隐性约定 // ────────────────────────────────────────────── 'agent-guidelines': { keywords: [ 'Agent', 'AI', 'Copilot', 'prompt', '指南', 'guideline', '约定', 'convention', '规范文档', 'CONTRIBUTING', 'AGENTS', 'PR template', 'commit message', 'code review', 'CI', 'lint', 'pre-commit', 'husky', ], phases: [ { name: '显式规范收集', action: "搜索项目中所有开发指南文档:CONTRIBUTING.md, AGENTS.md, CODE_OF_CONDUCT.md, .github/ 下的 PR template/issue template, docs/ 中的开发文档。逐一阅读,提取可编码的规则(明确的 DO/DON'T 约束)", output: '显式规范清单:每条规范的来源文档、规则内容、约束范围(全局/某模块/某语言)', tools: [ 'file_search 搜索 CONTRIBUTING/AGENTS/GUIDELINES/CONVENTIONS 文件', 'list_dir 浏览 .github/ 和 docs/ 目录', ], }, { name: '规则强度分级', action: '区分硬规则(CI 强制执行、lint 报错、pre-commit 拦截)和软指南(文档建议但无自动化检查)。阅读 CI 配置(.github/workflows/)、lint 配置(biome.json/.eslintrc/swiftlint.yml/rustfmt.toml/.golangci.yml/flake8/mypy.ini)、pre-commit/husky 配置,提取被工具链强制的规则', output: '规则强度矩阵:硬规则(工具强制)vs 软指南(文档建议)+ 每条规则的强制机制', tools: [ 'read_file 阅读 CI 配置和 lint 配置文件', 'grep_search 搜索 lint/format/check 相关命令', ], }, { name: '隐性规范发现', action: '分析 PR template 中的必填项、commit message 格式(Conventional Commits/Semantic)、branch 命名约定、代码 review 的 approve 规则。搜索 .editorconfig、.prettierrc 等格式化配置。寻找文档中没写但团队实际遵循的约定', output: '隐性规范列表 + 发现路径(从配置/模板/历史 commit 中推断)', }, ], submitAction: "每条开发规范独立提交候选(**按实际发现提交,无实质内容则跳过本维度**),含明确的 DO/DON'T", submitExtras: ['每个候选标注规则强度(硬规则/软指南)和强制机制'], mistakes: [ '不要照搬文档原文 — 必须提炼为可执行的规则,冗长的说明段落不是 Recipe', '不要忽略 CI/lint/pre-commit 配置中的隐性规范 — 这些往往比文档更权威', '不要把代码风格和提交规范合并 — "import 排序"和"commit message 格式"是不同主题', '不要遗漏 PR template 和 branch 命名约定 — 这些是团队协作的高频触发规则', '【跨维度边界】agent-guidelines 只关注团队级开发约定 — 代码命名细节归 coding-standards,架构规则归 architecture', ], }, // ────────────────────────────────────────────── // 7. concurrency-async — 并发模型/线程安全/异步策略 // ────────────────────────────────────────────── 'concurrency-async': { keywords: [ 'async', 'await', 'Task', 'Actor', 'Sendable', '@MainActor', 'DispatchQueue', 'GCD', 'Thread', 'Lock', 'NSLock', 'Mutex', 'Promise', 'Future', 'concurrent', 'semaphore', '并发', '异步', '线程安全', '数据竞争', '死锁', ], phases: [ { name: '并发模型全景扫描', action: '搜索项目中的并发原语和异步模式:structured concurrency(async/await/Task/TaskGroup/asyncio), actors/isolates, locks/mutexes(Mutex/synchronized/Lock/RWLock), thread pools/executors/dispatch queues, Promise/Future/Rx/Channel/Flow。统计各种并发模型的使用频率和场景分布', output: '并发模型使用全景:主模型选型 + 各层/各场景的并发策略分布', tools: [ 'grep_search 搜索 async/await/Task/Actor/Lock/Mutex/Thread/coroutine/goroutine 等关键词', ], }, { name: '线程安全策略提取', action: '阅读核心并发文件,提取项目的线程安全约定:共享可变状态的保护方式(Lock/Actor/Mutex/串行队列/synchronized)、UI 线程保障机制(MainActor/main thread dispatch/runOnUiThread)、跨线程数据传递方式(值拷贝/不可变引用/Channel/Queue)、线程安全标注或约束(Sendable/ThreadSafe/@WorkerThread)', output: '线程安全策略矩阵:各场景的标准做法 + 标准代码骨架', tools: ['read_file 阅读包含并发逻辑的核心文件'], }, { name: '竞态与死锁风险检测', action: '搜索并发风险信号:未加锁的共享可变状态、缺少 UI 线程保障的界面更新代码、嵌套锁(潜在死锁)、异步闭包/回调中的资源泄漏(未释放引用/未取消订阅)、回调地狱(多层嵌套的异步回调)', output: '并发风险点清单 + 项目已有的防护机制评估', }, ], submitAction: '并发模型选型、线程安全策略、锁使用模式分别提交候选(**按实际发现提交,无实质内容则跳过本维度**)', submitExtras: ['每个候选聚焦单一并发策略,coreCode 展示标准的线程安全写法'], mistakes: [ '不要把不同并发策略混在一个候选中 — 不同锁/队列/Actor 模式应独立成条', '不要写通用并发理论 — 必须引用项目实际代码,展示项目团队选择的具体方案', '不要忽略 UI 线程保障 — 确保界面更新总是在主线程/UI 线程执行是最常见的并发约束', '不要忽略异步上下文中的资源管理 — 引用捕获/订阅取消/上下文传递策略是关键决策', '【跨维度边界】concurrency-async 只关注并发/线程安全 — 错误处理归 error-resilience,性能优化归 performance-optimization', ], }, // ────────────────────────────────────────────── // 8. networking-api — 网络请求/API 封装/接口规范 // ────────────────────────────────────────────── 'networking-api': { keywords: [ 'API', 'HTTP', 'REST', 'GraphQL', 'WebSocket', 'URLSession', 'Alamofire', 'Moya', 'fetch', 'axios', '网络请求', '接口', 'endpoint', 'request', 'response', 'interceptor', 'middleware', 'token', 'retry', 'timeout', ], phases: [ { name: '网络架构映射', action: '搜索项目的网络请求基础设施:HTTP 客户端选型(URLSession/OkHttp/Retrofit/fetch/axios/requests/net/http)、API 定义方式(枚举/类/装饰器/接口)、请求构建流程(URL+参数+Header+Body 的组装方式)、拦截器/中间件链(认证注入/日志/重试/缓存)', output: '网络架构全景图:技术选型 → 分层结构 → 请求流水线(构建→拦截→发送→响应→解析)', tools: [ 'grep_search 搜索 request/response/API/endpoint/interceptor 关键词', '浏览网络层/API 定义目录', ], }, { name: '请求全链路分析', action: '阅读核心网络封装文件,追踪一个典型 API 请求的完整生命周期:API 定义→请求构建→Header/Token 注入→错误码映射→响应模型解析→结果包装(Result/Observable)。提取认证管理(Token 存储/刷新/过期处理)、超时/重试策略、响应缓存机制', output: '标准 API 请求全链路文档 + 认证流程 + 重试策略 + 缓存策略', tools: ['read_file 沿请求链路逐层阅读网络封装文件'], }, { name: '安全与健壮性检测', action: '搜索网络层风险:硬编码的 URL/API Key、不安全的 HTTP 配置(允许明文传输)、缺失的证书校验、无超时的请求、未处理的网络错误场景(无网络/超时/服务端 5xx)', output: '网络安全检查结果 + 健壮性评估 + API 版本管理策略', }, ], submitAction: '网络架构、请求模式、认证管理、响应解析分别提交候选(**按实际发现提交,无实质内容则跳过本维度**)', submitExtras: ['doClause 强制使用项目的网络封装层,禁止直接调用底层 HTTP API'], mistakes: [ '不要描述底层 HTTP 库的通用 API 用法 — 必须说明项目特定的封装方式和约定', '不要忽略认证/Token 管理 — Token 存储位置、刷新机制、过期处理是网络层核心知识', '不要遗漏错误码映射规则 — 服务端返回的 code/status 如何映射到客户端 Error 类型', '不要忽略超时、重试、缓存策略 — 这些直接影响用户体验和接口健壮性', '【跨维度边界】networking-api 只关注网络请求链路 — 数据持久化归 data-event-flow,认证安全细节归 security-auth', ], }, // ────────────────────────────────────────────── // 9. ui-interaction — UI 构建/布局/交互/样式 // ────────────────────────────────────────────── 'ui-interaction': { keywords: [ 'UI', 'View', 'Layout', 'Animation', 'SnapKit', 'AutoLayout', 'CSS', 'Component', 'Tailwind', 'Styled', '界面', '布局', '动画', '交互', 'gesture', '手势', 'Dark Mode', '主题', 'theme', 'accessibility', '无障碍', ], phases: [ { name: 'UI 技术栈识别', action: '搜索项目的 UI 构建方式:布局技术(代码布局/声明式UI/XML布局/CSS/模板引擎)、布局引擎(AutoLayout/SnapKit/Flexbox/Grid/ConstraintLayout/Compose)、组件库(自定义基础组件/第三方 UI 库)、动画框架。识别是否有统一的 BaseView/BaseComponent', output: 'UI 技术栈全景:布局方式 + 组件库 + 基类继承体系 + 动画技术', tools: ['grep_search 搜索项目使用的布局/UI 框架关键词', '浏览 UI/View/Component 集中目录'], }, { name: '组件规范深挖', action: '阅读核心 UI 组件和 ViewController/Page,提取:布局代码的标准写法(约束创建方式/布局方法命名)、样式管理策略(颜色/字体/间距是否有统一管理)、主题/Dark Mode 适配方式、复用组件的使用约定(Cell/Header/Footer 的标准实现)', output: 'UI 组件标准实现模式:布局写法 + 样式管理 + 主题适配 + 组件复用约定', tools: ['read_file 阅读核心 ViewController/Component/Cell 实现文件'], }, { name: 'UI 一致性检测', action: '搜索 UI 实现的不一致现象:混用不同布局方式(同一项目中多种布局引擎共存)、硬编码样式值(直接写颜色/字体数值而非引用常量/token)、遗漏 Dark Mode 适配(未使用动态颜色/CSS 变量)、缺失无障碍标注(accessibilityLabel/contentDescription/aria-label)', output: 'UI 一致性问题清单 + 项目 UI 规范整体遵守情况评估', }, ], submitAction: 'UI 布局模式、样式管理、组件复用、主题适配分别提交候选(**按实际发现提交,无实质内容则跳过本维度**)', submitExtras: ['每个候选聚焦单一 UI 规范(布局写法 和 样式管理 是独立候选)'], mistakes: [ '不要描述 UI 框架的通用 API — 必须说明项目特定的布局约定和样式管理方式', '不要合并不同层次的 UI 规范 — "布局约束写法"和"主题颜色管理"应独立提交', '不要忽略 Dark Mode/主题适配 — 动态颜色和样式切换是现代 UI 项目的标配', '不要遗漏基类/基组件继承约定 — BaseView/BaseActivity/BaseComponent 的重写点和使用规则是高频知识', '【跨维度边界】ui-interaction 只关注 UI 构建/布局/样式 — 数据绑定归 data-event-flow,设计模式归 design-patterns', ], }, // ────────────────────────────────────────────── // 10. testing-quality — 测试策略/Mock/质量保障 // ────────────────────────────────────────────── 'testing-quality': { keywords: [ 'Test', 'XCTest', 'Jest', 'Vitest', 'pytest', 'JUnit', 'Mock', 'Stub', 'Spy', 'Fixture', 'Factory', '测试', '单元测试', '集成测试', 'snapshot', 'E2E', 'coverage', 'assert', 'expect', 'spec', 'describe', ], phases: [ { name: '测试基础设施扫描', action: '搜索项目的测试配置和目录结构:测试框架(XCTest/Jest/Vitest/pytest/JUnit/go test/RSpec)、测试目录组织(unit/integration/e2e 分离方式)、测试辅助工具(Mock 框架/Fixture 管理/测试 DSL)、CI 中的测试命令和覆盖率配置', output: '测试基础设施全景:框架选型 + 目录结构 + 覆盖率要求 + CI 集成方式', tools: [ 'file_search 搜索 *Test*/*Spec*/*test* 文件', 'read_file 阅读测试配置(jest.config/vitest.config/pytest.ini)', ], }, { name: '测试模式提取', action: '阅读核心测试文件,提取项目的测试约定:测试命名规则(test_功能_场景_预期/describe-it 结构)、Mock 创建方式(手写 Mock/框架 Mock/Protocol Mock)、Fixture/测试数据管理(Factory 模式/JSON 文件/Builder)、arrange-act-assert 结构、异步测试写法', output: '测试模式规范:命名约定 + Mock 策略 + Fixture 管理 + 异步测试写法', tools: ['read_file 阅读不同模块的测试文件(覆盖 Mock/Fixture/异步场景)'], }, { name: '测试覆盖评估', action: '评估关键模块的测试覆盖情况:核心业务逻辑是否有对应测试、边界条件是否覆盖、Error 路径是否测试。识别测试薄弱区域和测试质量问题(过度 Mock 导致测试与实现耦合、测试名称不能描述场景)', output: '测试覆盖评估:强覆盖区域 + 薄弱区域 + 测试质量问题清单', }, ], submitAction: '测试策略、Mock 模式、测试命名约定分别提交候选(**按实际发现提交,无实质内容则跳过本维度**)', submitExtras: ['每个候选聚焦单一测试规范,coreCode 展示标准测试骨架'], mistakes: [ '不要只列出测试框架名称 — 必须说明项目特定的测试约定(命名/Mock/Fixture 管理方式)', '不要忽略 Mock 的创建和管理方式 — 手写 Mock vs Protocol Mock vs 框架 Mock 的选择策略是核心知识', '不要把单元测试和集成测试的约定混在一起 — 它们的 Mock 策略和 Fixture 管理通常不同', '不要遗漏异步测试的写法约定 — async/await 测试、异步等待机制(expectation/waitFor/eventually)、超时控制', '【跨维度边界】testing-quality 只关注测试策略和模式 — CI/CD 流程归 agent-guidelines', ], }, // ────────────────────────────────────────────── // 11. security-auth — 认证/授权/安全存储 // ────────────────────────────────────────────── 'security-auth': { keywords: [ 'Auth', 'Token', 'JWT', 'OAuth', 'KeyChain', 'Credential', 'encrypt', 'hash', 'HTTPS', 'SSL', 'certificate', '安全', '认证', '授权', 'permission', 'CSRF', 'XSS', 'cookie', 'session', 'SSO', 'biometric', ], phases: [ { name: '认证架构映射', action: '搜索项目的认证/授权基础设施:认证方式(JWT/OAuth/Session/Cookie/SSO/生物识别)、Token 存储位置(Keychain/SharedPreferences/EncryptedStorage/HttpOnly Cookie/内存)、用户状态管理(登录/登出/Token 过期/Session 过期)、权限控制粒度(角色/功能/页面级)', output: '认证架构全景:认证方式 + Token 生命周期 + 权限控制体系 + 用户状态机', tools: [ 'grep_search 搜索 Token/Auth/Login/Credential/Session/OAuth 关键词', '浏览认证/安全相关目录', ], }, { name: '安全实现深挖', action: '阅读认证模块核心文件,分析:Token 刷新策略(主动刷新/被动刷新/双 Token 机制)、敏感数据存储方式(加密方式/安全等级)、网络安全配置(HTTPS 强制/证书校验/Certificate Pinning)、输入校验(防 XSS/SQL 注入/CSRF Token)', output: '安全实现详图:Token 刷新流程 + 存储安全策略 + 网络安全配置 + 输入校验规则', tools: ['read_file 阅读认证/Token 管理/安全配置核心文件'], }, { name: '安全漏洞扫描', action: '搜索安全风险信号:硬编码的密钥/Token/URL、明文存储敏感数据(明文写入本地存储/localStorage/UserDefaults/plain text file)、缺失的输入校验、允许 HTTP 明文传输的配置、日志中泄漏敏感信息(打印 Token/密码)', output: '潜在安全漏洞清单 + 严重等级评估 + 修复建议', }, ], submitAction: '认证机制、Token 管理、安全存储、权限控制分别提交候选(**按实际发现提交,无实质内容则跳过本维度**)', submitExtras: [ '严禁在候选的 coreCode/content 中包含实际密钥、Token 或敏感配置值', '每个候选必须引用具体的安全相关类名和文件路径 — 纯理论描述会被拒绝', '如果项目使用第三方 SDK 提供认证,只提交项目自身的集成方式和配置,不要重复 SDK 通用文档', ], mistakes: [ '不要描述通用安全理论 — 必须说明项目特定的认证机制和存储方式', '严禁在候选中暴露实际的密钥、Token、API Secret 或敏感配置 — 用占位符替代', '不要忽略 Token 刷新机制 — "过期后如何自动刷新、刷新失败如何引导重新登录"是核心流程', '不要遗漏登录/登出的状态广播机制 — 其他模块如何感知认证状态变化', '不要将同一个认证流程拆分成过多候选 — "登录 + Token 存储 + Cookie 同步"如果是一个紧密耦合的流程,应合并为一个候选', '不要提交与 networking-api 维度重叠的内容 — HTTPS 配置、证书校验归本维度,但请求拦截、Header 注入归 networking-api', '【跨维度边界】security-auth 只关注认证/授权/安全 — 网络请求封装归 networking-api,错误处理归 error-resilience', ], }, // ────────────────────────────────────────────── // 12. performance-optimization — 性能策略/缓存/资源管理 // ────────────────────────────────────────────── 'performance-optimization': { keywords: [ '性能', 'performance', 'cache', '缓存', 'lazy', '懒加载', 'prefetch', '预加载', 'throttle', 'debounce', 'pagination', 'memory', '内存', 'profiling', 'benchmark', 'image', '列表优化', 'cell reuse', 'virtual scroll', 'CDN', ], phases: [ { name: '性能策略扫描', action: '搜索项目中的性能优化策略:缓存(内存缓存/磁盘缓存/HTTP 缓存/CDN)、懒加载/延迟初始化(lazy init/dynamic import/按需创建)、预加载/预取(prefetch/preload)、列表优化(组件复用/虚拟滚动/分页加载)、图片/资源优化(压缩/缩放/缓存)、节流防抖(throttle/debounce/合并请求)', output: '性能优化策略全景:各场景的优化手段 + 技术选型 + 实现位置', tools: [ 'grep_search 搜索 cache/lazy/prefetch/throttle/debounce/reuse 关键词', '浏览缓存/性能相关目录', ], }, { name: '策略实现深挖', action: '阅读核心性能优化文件,分析各策略的实现细节:缓存策略(淘汰算法/容量限制/过期机制)、列表分页(页码/游标/预加载阈值)、图片管线(下载→解码→缩放→缓存的链路)、启动优化(预热/懒加载/延迟任务)', output: '性能优化实现详图:各策略的标准实现 + 参数配置 + 使用约束', tools: ['read_file 阅读缓存管理器/列表优化/图片管线核心文件'], }, { name: '性能瓶颈检测', action: '搜索可能的性能问题:主线程/UI 线程上的同步 I/O 或重计算、未缓存的重复网络请求、未复用的列表项组件、过大的资源未优化直接加载、内存泄漏点(未释放的缓存/循环引用/未取消的订阅)', output: '潜在性能瓶颈清单 + 优化优先级建议', }, ], submitAction: '缓存策略、列表优化、图片管线、启动优化分别提交候选(**按实际发现提交,无实质内容则跳过本维度**)', submitExtras: [ '每个候选聚焦单一优化策略,说明适用场景和配置参数', '每个候选的 coreCode 必须包含项目实际的类名/方法名/配置值 — 不能是伪代码或通用示例', 'content.markdown 必须包含具体的度量数据或配置参数(如缓存大小、超时时间、阈值等)— 纯文字描述的优化建议会被拒绝', ], mistakes: [ '不要写通用性能理论 — 必须引用项目实际的优化代码和配置参数', '不要合并不同维度的优化策略 — "内存缓存策略"和"列表分页加载"是独立候选', '不要忽略缓存的淘汰和过期机制 — "缓存了什么"不如"何时淘汰、容量多大"有价值', '不要遗漏资源加载优化 — 图片/字体/数据等大资源的压缩/缩放/缓存策略必须覆盖', '不要提交没有具体代码证据的性能建议 — "建议使用懒加载"不是候选,"项目中 XxxManager 使用单例/延迟初始化模式"才是候选', '不要重复框架/三方库的通用用法 — 只有项目对第三方库有自定义配置或封装时才值得提交', '【跨维度边界】performance-optimization 只关注性能优化策略 — 并发模型归 concurrency-async,网络策略归 networking-api', ], }, // ────────────────────────────────────────────── // 13. observability-logging — 日志/监控/埋点/崩溃 // ────────────────────────────────────────────── 'observability-logging': { keywords: [ 'Log', 'Logger', 'os_log', 'print', 'NSLog', 'console', '日志', '监控', 'trace', 'analytics', 'metric', 'event', 'crash', 'Sentry', 'Firebase', 'Crashlytics', 'structured logging', '埋点', 'APM', ], phases: [ { name: '可观测性体系扫描', action: '搜索项目的日志和监控基础设施:日志框架(os_log/Logger/winston/log4j/自定义)、崩溃收集(Sentry/Firebase Crashlytics/Bugsnag)、性能监控APM(Firebase Performance/自建)、业务埋点(自定义事件/第三方 Analytics)、结构化日志(JSON 格式/标签体系)', output: '可观测性体系全景:日志框架 + 崩溃收集 + APM + 埋点 + 数据流向', tools: [ 'grep_search 搜索 Logger/log/analytics/track/Sentry/Crashlytics 关键词', '浏览日志/监控相关文件', ], }, { name: '日志规范提取', action: '阅读日志封装文件,提取项目的日志约定:日志分级规则(verbose/debug/info/warning/error 各自的使用场景)、日志分类系统(Category/Tag/Module 标签)、格式约定(是否使用结构化日志)、Release 构建策略(哪些级别会在 Release 中输出、敏感信息过滤)', output: '日志规范矩阵:各级别的使用场景 + 分类标签体系 + Release 安全策略', tools: ['read_file 阅读 Logger 封装/Category 定义/日志配置文件'], }, { name: '日志合规检测', action: '搜索日志使用的不规范之处:使用 print/NSLog 替代正式 Logger、日志中包含敏感数据(Token/密码/个人信息)、缺失错误场景的日志(catch 块中无日志)、verbose/debug 日志泄漏到 Release 构建、埋点事件命名不一致', output: '日志合规问题清单 + Release 构建日志安全评估 + 埋点规范遵守情况', }, ], submitAction: '日志规范、崩溃收集、埋点约定分别提交候选(**按实际发现提交,无实质内容则跳过本维度**)', submitExtras: ['每个候选聚焦单一可观测性规范,明确 Release vs Debug 的差异处理'], mistakes: [ '不要描述 Logger API 的通用用法 — 必须说明项目特定的日志分级规则和分类标签', '不要忽略 Release 构建的日志安全 — verbose/debug 级别不应出现在 Release 构建中', '不要遗漏 print/NSLog 的禁用规则 — 在有正式 Logger 的项目中使用 print 是常见违规', '不要忽略埋点事件的命名约定 — 事件名/参数名的一致性直接影响数据分析', '【跨维度边界】observability-logging 只关注日志/监控/埋点 — 错误处理逻辑归 error-resilience', ], }, // ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ // ┌──────────────────────────────────────────────┐ // │ Language Dimensions (7) │ // └──────────────────────────────────────────────┘ // ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ // ────────────────────────────────────────────── // 14. swift-objc-idiom — Swift/ObjC 语言惯用法 // ────────────────────────────────────────────── 'swift-objc-idiom': { keywords: [ 'Swift', 'Objective-C', '@objc', 'bridging', 'protocol', 'Protocol-Oriented', 'extension', 'enum', 'generics', 'value type', '值类型', 'struct', 'final class', 'Category', 'Block', 'Closure', 'KVO', 'Swizzling', '#define', '宏', 'macro', 'Foundation', 'UIKit', ], phases: [ { name: '语言特性全景扫描', action: '搜索项目中 Swift/ObjC 语言特性的使用模式:Protocol(protocol 定义、extension 默认实现、Protocol-Oriented 编程风格)、值类型 vs 引用类型(struct vs class 的选择策略)、enum 活用(关联值/RawValue/命名空间枚举)、Generics(泛型约束/where 子句)、Swift/ObjC 混编(Bridging Header/@objc 暴露/@objcMembers)', output: '语言特性使用全景:各特性的使用频率和场景 + Swift/ObjC 混编策略', tools: [ 'grep_search 搜索 protocol/extension/struct/enum/@objc 定义', '浏览 Bridging Header 和协议集中定义的目录', ], }, { name: '惯用法规范提取', action: '阅读核心 Swift/ObjC 文件,提取项目的语言惯用法约定:Protocol-Oriented vs 继承的选择准则、值类型(struct) vs 引用类型(class) 的边界、final class 的强制/可选策略、enum 命名空间的使用模式、Optional 解包策略(guard let/if let/强制解包的场景限制)、闭包简写约定($0 vs 命名参数)', output: '项目 Swift 惯用法矩阵:各场景的标准做法 + 禁止做法', tools: ['read_file 阅读展示多种语言特性的核心文件'], }, { name: '过时模式检测', action: '搜索过时或不推荐的语言使用:不必要的 NSObject 继承(纯 Swift 类继承 NSObject)、@objc 滥用(非必要的 @objc 标注)、过度使用 KVO(Swift 中应优先 Combine/didSet)、force unwrap 在不安全场景的使用、Any/AnyObject 类型擦除的滥用', output: '过时/不推荐模式清单 + 推荐的现代替代方案', }, ], submitAction: '每种 Swift/ObjC 惯用法独立提交候选(**按实际发现提交,无实质内容则跳过本维度**)', submitExtras: [ '每个候选标注适用的 Swift 版本要求(如 Swift 5.9+/6.0+)', 'ObjC 相关候选需说明是否为混编必需', ], mistakes: [ '不要合并不同层面的惯用法 — "Protocol-Oriented 编程"和"Optional 解包策略"是独立候选', '不要写通用 Swift 语法教程 — 必须提取项目特有的选择准则(如"何时用 struct 何时用 class"的项目答案)', '不要忽略 Swift/ObjC 混编的桥接规则 — 哪些类需要 @objc、Bridging Header 的管理约定', '不要遗漏 Optional 处理约定 — guard let vs if let vs 强制解包各自的适用场景是高频决策', '【跨维度边界】swift-objc-idiom 只关注语言惯用法 — 架构模式归 architecture,并发模式归 concurrency-async', ], }, // ────────────────────────────────────────────── // 15. ts-js-module — TypeScript/JavaScript 惯用法 // ────────────────────────────────────────────── 'ts-js-module': { keywords: [ 'TypeScript', 'JavaScript', 'ESM', 'CommonJS', 'import', 'export', 'type', 'interface', 'generic', 'enum', 'union', 'template literal', 'type guard', 'module', 'package.json', 'tsconfig', 'barrel', 'path alias', 'strict', 'any', 'unknown', ], phases: [ { name: '模块与类型体系扫描', action: '搜索项目的模块系统和类型基础设施:模块格式(ESM/CommonJS/UMD)、路径别名(tsconfig paths/#imports)、barrel exports(index.ts 重导出策略)、TypeScript 严格模式配置(strict/noImplicitAny/strictNullChecks)、类型定义文件(.d.ts)分布', output: '模块+类型体系全景:模块格式 + 路径别名 + barrel 策略 + TS 严格度配置', tools: [ 'read_file 阅读 tsconfig.json/package.json 的关键配置', 'grep_search 搜索 import/export/type/interface 模式', ], }, { name: '类型策略深挖', action: '阅读核心类型定义文件和业务代码,提取项目的 TypeScript 约定:泛型使用模式(工具类型/条件类型/映射类型)、类型守卫策略(is/in/typeof/instanceof)、联合类型 vs enum 的选择、模板字面量类型的活用、any/unknown 的使用边界(何时允许 any、何时必须 unknown)、类型断言(as)的使用约束', output: '类型策略矩阵:各场景的推荐方案 + 禁止方案 + 代码骨架示例', tools: ['read_file 阅读核心 .d.ts 文件和展示泛型使用的业务文件'], }, { name: '类型安全薄弱检测', action: '搜索类型安全风险:any 的使用频率和场景(是否有 eslint no-explicit-any 规则)、@ts-ignore/@ts-expect-error 的使用、类型断言 as 的滥用、缺失返回类型的函数、未使用 strict null checks 的模块', output: '类型安全薄弱点清单 + 项目类型严格度评估', }, ], submitAction: '模块组织策略、类型系统约定、TS 配置规范分别提交候选(**按实际发现提交,无实质内容则跳过本维度**)', submitExtras: ['包含 tsconfig/package.json 关键配置引用作为规则依据'], mistakes: [ '不要描述 TypeScript 通用语法 — 必须说明项目特有的类型策略和模块约定', '不要忽略路径别名和 barrel exports — 这些是 TS 项目中最常用且最容易出错的约定', '不要遗漏 any/unknown 的使用边界 — 何时允许 any(如遗留代码适配)何时必须 unknown 是关键规则', '不要忽略 ESM import 的后缀约定 — 部分项目要求 .js 后缀,这是高频出错点', '【跨维度边界】ts-js-module 只关注 TS/JS 语言惯用法 — React/Vue 框架模式归对应框架维度', ], }, // ────────────────────────────────────────────── // 16. python-structure — Python 惯用法与包结构 // ────────────────────────────────────────────── 'python-structure': { keywords: [ 'Python', '__init__', 'class', 'dataclass', 'pydantic', 'typing', 'type hint', 'decorator', 'generator', 'async', 'import', 'virtual env', 'pip', 'poetry', 'uv', 'pyproject.toml', 'setup.py', 'requirements', 'mypy', ], phases: [ { name: '包结构与工具链扫描', action: '搜索项目的 Python 包结构和开发工具链:包管理(pip/poetry/uv/conda)、构建配置(pyproject.toml/setup.py/setup.cfg)、__init__.py 的导出策略(__all__ 定义)、虚拟环境管理、类型检查工具(mypy/pyright/pytype 配置)', output: '包结构+工具链全景:包管理方式 + 目录组织 + 类型检查配置 + 开发工具链', tools: ['list_dir 浏览项目包结构', 'read_file 阅读 pyproject.toml/setup.py/mypy.ini'], }, { name: 'Python 惯用法提取', action: '阅读核心 Python 文件,提取项目的 Python 约定:dataclass vs pydantic vs NamedTuple 的选择策略、类型标注完整度(是否全量标注/关键接口标注)、装饰器使用模式(自定义装饰器/框架装饰器)、上下文管理器(with 语句的使用场景)、生成器/迭代器模式、f-string vs format 的选择', output: 'Python 惯用法矩阵:数据类选型 + 类型标注策略 + 装饰器约定 + 其他惯用法', tools: ['read_file 阅读核心 Python 模块文件'], }, { name: '反模式检测', action: '搜索 Python 反模式和风格违规:可变默认参数(def f(x=[]))、裸 except(except: 不指定类型)、过深继承链(>3 层)、循环 import、全局可变状态、过长函数(>50 行)、缺失 docstring', output: '反模式清单 + 项目 Python 代码质量评估', }, ], submitAction: '包结构约定、类型标注策略、Python 惯用法分别提交候选(**按实际发现提交,无实质内容则跳过本维度**)', submitExtras: ['包含 pyproject.toml 关键配置引用'], mistakes: [ '不要描述 Python 通用语法 — 必须说明项目特有的类型标注策略和数据类选型', '不要忽略包管理工具约定 — pip vs poetry vs uv 的选择以及lock 文件管理', '不要遗漏 __init__.py 的导出策略 — __all__ 的使用约定影响模块的公开接口', '不要忽略 mypy/pyright 配置 — 类型检查的严格度直接决定类型标注的要求', '【跨维度边界】python-structure 只关注 Python 语言惯用法 — Django/FastAPI 框架模式归 django-fastapi', ], }, // ────────────────────────────────────────────── // 17. jvm-annotation — Java/Kotlin 惯用法 // ────────────────────────────────────────────── 'jvm-annotation': { keywords: [ 'Java', 'Kotlin', 'annotation', '@', 'generic', 'gradle', 'maven', 'package', 'interface', 'abstract', 'Stream', 'coroutine', 'suspend', 'sealed', 'data class', 'Lombok', 'Validation', 'reflection', 'null safety', ], phases: [ { name: '注解与语言特性扫描', action: '搜索项目中的自定义注解定义和主要注解使用模式:自定义注解(@interface 定义)、元注解使用(@Target/@Retention)、Lombok 注解(@Data/@Builder/@Slf4j)、Validation 注解(@NotNull/@Size)、Kotlin 特性(sealed class/data class/suspend/coroutine)', output: '注解+语言特性全景:自定义注解清单 + 主要注解使用场景分布 + Kotlin 特性采用情况', tools: ['grep_search 搜索 @interface 定义和高频注解使用', '浏览注解定义和核心包目录'], }, { name: 'JVM 惯用法提取', action: '阅读核心 Java/Kotlin 文件,提取项目约定:泛型使用模式(泛型约束/通配符/类型擦除处理)、Stream API vs 传统循环的选择、Kotlin coroutine 使用约定(Dispatchers 选择/结构化并发/Flow vs Channel)、null 安全策略(Java: @Nullable/@NonNull/Optional; Kotlin: ?/!!的限制)、sealed class/enum 的使用场景', output: 'JVM 惯用法矩阵:各场景的标准做法 + null 安全约定 + 异步策略', tools: ['read_file 阅读核心 Java/Kotlin 业务文件'], }, { name: '反模式检测', action: '搜索 JVM 反模式:注解滥用(过度注解导致声明式代码不可读)、raw type 使用(缺失泛型参数)、Kotlin !! 强制非空的不安全使用、checked exception 的不当处理(空 catch)、过度反射', output: '反模式清单 + JVM 代码质量评估', }, ], submitAction: '注解约定、泛型策略、Kotlin 惯用法分别提交候选(**按实际发现提交,无实质内容则跳过本维度**)', submitExtras: ['包含 build.gradle/pom.xml 关键配置引用'], mistakes: [ '不要描述 Java/Kotlin 通用语法 — 必须说明项目特有的注解约定和惯用法', '不要忽略 null 安全策略 — Java 项目的 @Nullable/@NonNull 约定和 Kotlin 的 !! 限制是核心规则', '不要把 Kotlin 和 Java 的约定混在一起 — 如果项目同时使用两种语言,应区分各自的约定', '不要遗漏 Kotlin coroutine 使用模式 — Dispatchers 选择和结构化并发是高频决策', '【跨维度边界】jvm-annotation 只关注 JVM 语言惯用法 — Spring 框架模式归 spring-patterns', ], }, // ────────────────────────────────────────────── // 18. go-module — Go 语言惯用法 // ────────────────────────────────────────────── 'go-module': { keywords: [ 'Go', 'go.mod', 'goroutine', 'channel', 'interface', 'struct', 'error', 'context', 'package', 'defer', 'select', 'sync', 'WaitGroup', 'errgroup', 'error wrapping', '%w', 'internal', 'cmd', 'pkg', ], phases: [ { name: '模块与包结构扫描', action: '搜索项目的 Go 模块结构:go.mod(模块路径/Go 版本/依赖管理)、标准布局(cmd/pkg/internal/api)、包命名约定(单数 vs 复数/缩写规则)、internal 包的使用(封装边界)、接口定义位置(消费方定义 vs 提供方定义)', output: '模块结构全景:标准布局 + 包组织约定 + internal 封装策略 + 接口定义位置约定', tools: ['read_file 阅读 go.mod', 'list_dir 浏览项目目录结构(cmd/pkg/internal 等)'], }, { name: 'Go 惯用法提取', action: '阅读核心 Go 文件,提取项目的 Go 约定:接口设计(小接口/单方法接口/embed 组合)、错误处理链(error wrapping with %w/sentinel errors/custom error types)、context 传递(首参数 context/超时控制/取消传播)、goroutine 启动约定(errgroup/WaitGroup/context cancel)、defer 使用模式', output: 'Go 惯用法矩阵:错误处理约定 + 接口设计规范 + goroutine 管理策略', tools: ['read_file 阅读核心 Go 业务文件(选取展示多种惯用法的文件)'], }, { name: '反模式检测', action: '搜索 Go 反模式:goroutine 泄漏(启动 goroutine 无退出机制)、缺失 context 传递(函数参数列表中无 context)、过大接口(>5 方法的接口)、init() 函数滥用(隐式初始化副作用)、error 未检查(忽略返回的 error)', output: '反模式清单 + Go 代码质量评估', }, ], submitAction: '模块组织约定、错误处理规范、goroutine 管理分别提交候选(**按实际发现提交,无实质内容则跳过本维度**)', submitExtras: ['包含 go.mod 和标准目录布局引用'], mistakes: [ '不要描述 Go 通用语法 — 必须说明项目特有的错误处理链和接口设计约定', '不要忽略 error wrapping 约定 — fmt.Errorf("%w", err) 的使用规则和 sentinel error 定义方式', '不要遗漏 context 传递规则 — 是否强制所有函数首参为 context 是核心约定', '不要忽略 goroutine 的生命周期管理 — 启动方式、退出机制、panic recovery 策略', '【跨维度边界】go-module 只关注 Go 语言惯用法 — 通用架构分层归 architecture', ], }, // ────────────────────────────────────────────── // 19. rust-ownership — Rust 所有权与惯用法 // ────────────────────────────────────────────── 'rust-ownership': { keywords: [ 'Rust', 'ownership', 'borrow', 'lifetime', 'trait', 'impl', 'derive', 'macro', 'unsafe', 'Cargo', 'crate', 'mod', 'Arc', 'Rc', 'Box', 'Clone', 'Result', 'Option', '?', 'thiserror', 'anyhow', ], phases: [ { name: '所有权与依赖扫描', action: '搜索项目中的所有权模式和 crate 结构:智能指针使用(Arc/Rc/Box/Cow 的选择策略)、生命周期标注(显式 lifetime 的使用场景)、Clone/Copy 的使用频率、Cargo.toml(workspace 结构/依赖管理/feature flags)、mod 组织方式(mod.rs vs 文件名)', output: '所有权策略全景:智能指针选型 + 生命周期管理策略 + crate 组织方式', tools: [ 'grep_search 搜索 Arc/Rc/Box/lifetime/Clone/unsafe 关键词', 'read_file 阅读 Cargo.toml', ], }, { name: 'Rust 惯用法提取', action: '阅读核心 Rust 文件,提取项目约定:trait 设计(small traits/blanket implements/trait objects vs generics)、错误处理(thiserror vs anyhow/? 操作符链/自定义 Error 类型层次)、derive 宏使用约定(哪些 trait 需要 derive)、enum 活用(Option/Result 的自定义扩展)、迭代器链 vs 命令式循环的选择', output: 'Rust 惯用法矩阵:trait 设计规范 + 错误处理链 + derive 约定 + 迭代器使用策略', tools: ['read_file 阅读核心 Rust 业务文件和 lib.rs'], }, { name: 'unsafe 与质量检测', action: '搜索 unsafe 块使用:每处 unsafe 是否有安全注释(// SAFETY: ...)、是否有更安全的替代方案、是否被安全抽象包裹。同时检测:不必要的 Clone(可以用引用替代)、过度的 lifetime 标注(可以省略)、unwrap 在非测试代码中的使用', output: 'unsafe 审计报告 + 所有权健康度评估 + unwrap 使用合规检查', }, ], submitAction: '所有权策略、trait 规范、错误处理约定分别提交候选(**按实际发现提交,无实质内容则跳过本维度**)', submitExtras: ['包含 Cargo.toml 关键配置和 workspace 结构引用'], mistakes: [ '不要描述 Rust 通用语法 — 必须说明项目特有的所有权策略和 trait 设计约定', '不要忽略 unsafe 块的安全注释要求 — // SAFETY: 注释是 Rust 社区的核心约定', '不要遗漏 thiserror vs anyhow 的选择 — 库 crate 和应用 crate 通常有不同的错误策略', '不要忽略 unwrap 的使用限制 — 测试中允许 unwrap,业务代码中应使用 ? 操作符', '【跨维度边界】rust-ownership 只关注 Rust 语言惯用法 — 并发模式归 concurrency-async', ], }, // ────────────────────────────────────────────── // 20. csharp-dotnet — C#/.NET 惯用法 // ────────────────────────────────────────────── 'csharp-dotnet': { keywords: [ 'C#', '.NET', 'LINQ', 'async', 'Task', 'nuget', 'namespace', 'interface', 'attribute', 'record', 'dependency injection', 'Entity Framework', 'Dapper', 'nullable reference', 'pattern matching', 'IHost', ], phases: [ { name: '.NET 项目结构扫描', action: '搜索项目的 .NET 结构:.csproj(SDK/TargetFramework/NuGet 依赖)、项目类型(ASP.NET Core/Console/Worker/MAUI)、namespace 组织约定(与目录对齐/自定义规则)、启动配置(Program.cs/Startup.cs/Host Builder)、Nullable reference types 开启状态', output: '.NET 项目结构全景:SDK 版本 + 项目类型 + namespace 约定 + nullable 启用状态', tools: ['read_file 阅读 .csproj/Program.cs/appsettings.json', 'list_dir 浏览项目结构'], }, { name: 'C# 惯用法提取', action: '阅读核心 C# 文件,提取项目约定:LINQ 使用模式(方法语法 vs 查询语法/延迟执行的理解)、async/await 模式(ConfigureAwait/async void 禁用/ValueTask vs Task)、DI 注册约定(AddScoped/AddTransient/AddSingleton 的选择策略)、record/readonly struct 的使用场景、pattern matching 活用度', output: 'C# 惯用法矩阵:LINQ 约定 + async 策略 + DI 注册模式 + 现代 C# 特性采用情况', tools: ['read_file 阅读核心 C# 业务文件和 DI 注册文件'], }, { name: '反模式检测', action: '搜索 C# 反模式:async void(非事件处理场景)、缺失 ConfigureAwait(库代码)、Service Locator 模式(绕过 DI)、过度使用 static 类、LINQ N+1 查询(Entity Framework 未使用 Include)、IDisposable 未正确释放', output: '反模式清单 + .NET 代码质量评估', }, ], submitAction: '.NET 配置约定、C# 惯用法、DI 策略分别提交候选(**按实际发现提交,无实质内容则跳过本维度**)', submitExtras: ['包含 .csproj 和 DI 注册代码引用'], mistakes: [ '不要描述 C# 通用语法 — 必须说明项目特有的 .NET 版本特性采用和 C# 约定', '不要忽略 async/await 细节约定 — ConfigureAwait/async void 禁用/取消令牌传递', '不要遗漏 DI 生命周期选择规则 — Scoped vs Transient vs Singleton 的项目约定', '不要忽略 Entity Framework/ORM 的使用约定 — 查询优化和连接管理是高频问题', '【跨维度边界】csharp-dotnet 只关注 C#/.NET 惯用法 — ASP.NET 框架模式归更高层维度', ], }, // ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ // ┌──────────────────────────────────────────────┐ // │ Framework Dimensions (5) │ // └──────────────────────────────────────────────┘ // ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ // ────────────────────────────────────────────── // 21. react-patterns — React 框架模式 // ────────────────────────────────────────────── 'react-patterns': { keywords: [ 'React', 'useState', 'useEffect', 'useCallback', 'useMemo', 'hook', 'component', 'JSX', 'TSX', 'props', 'children',