ironweave 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) hide show
  1. package/.claude-plugin/plugin.json +16 -0
  2. package/.clinerules +7 -0
  3. package/.codex/INSTALL.md +45 -0
  4. package/.cursor-plugin/plugin.json +19 -0
  5. package/.cursorrules +7 -0
  6. package/.github/copilot-instructions.md +7 -0
  7. package/.opencode/INSTALL.md +42 -0
  8. package/.windsurfrules +7 -0
  9. package/AGENTS.md +1 -0
  10. package/CLAUDE.md +22 -0
  11. package/CONTRIBUTING.md +81 -0
  12. package/GEMINI.md +1 -0
  13. package/LICENSE +21 -0
  14. package/README.md +250 -0
  15. package/README_CN.md +248 -0
  16. package/package.json +48 -0
  17. package/skills/api-contract-design/SKILL.md +227 -0
  18. package/skills/api-contract-design/references/api-design-rules.md +106 -0
  19. package/skills/brainstorm/SKILL.md +271 -0
  20. package/skills/brainstorm/agents/architect.md +34 -0
  21. package/skills/brainstorm/agents/challenger.md +34 -0
  22. package/skills/brainstorm/agents/domain-expert.md +34 -0
  23. package/skills/brainstorm/agents/pragmatist.md +34 -0
  24. package/skills/brainstorm/agents/product-manager.md +34 -0
  25. package/skills/brainstorm/agents/ux-designer.md +34 -0
  26. package/skills/brainstorm/references/synthesis-rules.md +51 -0
  27. package/skills/code-scaffold/SKILL.md +313 -0
  28. package/skills/code-scaffold/references/scaffold-rules.md +131 -0
  29. package/skills/docs-output/SKILL.md +149 -0
  30. package/skills/docs-output/references/naming-rules.md +52 -0
  31. package/skills/docs-output/scripts/docs_manager.py +353 -0
  32. package/skills/engineering-principles/SKILL.md +133 -0
  33. package/skills/engineering-principles/references/anti-patterns.md +144 -0
  34. package/skills/engineering-principles/references/ddd-patterns.md +66 -0
  35. package/skills/engineering-principles/references/design-patterns.md +34 -0
  36. package/skills/engineering-principles/references/patterns-architecture.md +301 -0
  37. package/skills/engineering-principles/references/patterns-backend.md +77 -0
  38. package/skills/engineering-principles/references/patterns-classic.md +200 -0
  39. package/skills/engineering-principles/references/patterns-crosscut.md +67 -0
  40. package/skills/engineering-principles/references/patterns-frontend.md +27 -0
  41. package/skills/engineering-principles/references/patterns-module.md +95 -0
  42. package/skills/engineering-principles/references/patterns-small-scale.md +79 -0
  43. package/skills/engineering-principles/references/quality-checklist.md +76 -0
  44. package/skills/engineering-principles/references/solid-principles.md +46 -0
  45. package/skills/engineering-principles/references/tdd-workflow.md +60 -0
  46. package/skills/engineering-principles/scripts/principles_matcher.py +433 -0
  47. package/skills/error-handling-strategy/SKILL.md +347 -0
  48. package/skills/error-handling-strategy/references/error-handling-rules.md +91 -0
  49. package/skills/implementation-complexity-analysis/SKILL.md +193 -0
  50. package/skills/implementation-complexity-analysis/references/complexity-rules.md +126 -0
  51. package/skills/integration-test-design/SKILL.md +296 -0
  52. package/skills/integration-test-design/references/test-strategy-rules.md +90 -0
  53. package/skills/observability-design/SKILL.md +327 -0
  54. package/skills/observability-design/references/observability-rules.md +129 -0
  55. package/skills/orchestrator/SKILL.md +260 -0
  56. package/skills/orchestrator/references/deliver.md +112 -0
  57. package/skills/orchestrator/references/execute.md +313 -0
  58. package/skills/orchestrator/references/gates.md +252 -0
  59. package/skills/orchestrator/references/parallel.md +70 -0
  60. package/skills/orchestrator/references/route-a.md +135 -0
  61. package/skills/orchestrator/references/route-b.md +91 -0
  62. package/skills/orchestrator/references/route-c.md +65 -0
  63. package/skills/orchestrator/references/route-d.md +75 -0
  64. package/skills/orchestrator/references/scope-sizer.md +219 -0
  65. package/skills/performance-arch-design/SKILL.md +208 -0
  66. package/skills/performance-arch-design/references/performance-rules.md +95 -0
  67. package/skills/project-context/SKILL.md +104 -0
  68. package/skills/project-context/references/schema.md +97 -0
  69. package/skills/project-context/scripts/context_db.py +358 -0
  70. package/skills/requirement-qa/SKILL.md +287 -0
  71. package/skills/requirement-qa/references/completion-signals.md +42 -0
  72. package/skills/requirement-qa/references/option-rules.md +57 -0
  73. package/skills/requirement-qa/scripts/qa_session.py +223 -0
  74. package/skills/skill-creator/LICENSE.txt +202 -0
  75. package/skills/skill-creator/SKILL.md +485 -0
  76. package/skills/skill-creator/agents/analyzer.md +274 -0
  77. package/skills/skill-creator/agents/comparator.md +202 -0
  78. package/skills/skill-creator/agents/grader.md +223 -0
  79. package/skills/skill-creator/assets/eval_review.html +146 -0
  80. package/skills/skill-creator/eval-viewer/generate_review.py +471 -0
  81. package/skills/skill-creator/eval-viewer/viewer.html +1325 -0
  82. package/skills/skill-creator/references/schemas.md +430 -0
  83. package/skills/skill-creator/scripts/__init__.py +0 -0
  84. package/skills/skill-creator/scripts/aggregate_benchmark.py +401 -0
  85. package/skills/skill-creator/scripts/generate_report.py +326 -0
  86. package/skills/skill-creator/scripts/improve_description.py +247 -0
  87. package/skills/skill-creator/scripts/package_skill.py +136 -0
  88. package/skills/skill-creator/scripts/quick_validate.py +103 -0
  89. package/skills/skill-creator/scripts/run_eval.py +310 -0
  90. package/skills/skill-creator/scripts/run_loop.py +328 -0
  91. package/skills/skill-creator/scripts/utils.py +47 -0
  92. package/skills/spec-writing/SKILL.md +96 -0
  93. package/skills/spec-writing/references/mermaid-guide.md +66 -0
  94. package/skills/spec-writing/references/test-matrix.md +73 -0
  95. package/skills/task-difficulty/SKILL.md +162 -0
  96. package/skills/task-difficulty/references/scoring-guide.md +123 -0
  97. package/skills/task-difficulty/scripts/difficulty_scorer.py +328 -0
  98. package/skills/tech-stack/SKILL.md +67 -0
  99. package/skills/tech-stack/references/tech-reference-tables.md +130 -0
@@ -0,0 +1,75 @@
1
+ # D:重构
2
+
3
+ ## Plan
4
+
5
+ > **注意**:如果 CLARIFY 阶段已执行架构讨论,Plan 中的 brainstorm 默认**跳过**,除非重构过程中发现新的策略争议。
6
+
7
+ ```mermaid
8
+ graph TB
9
+ START["D 启动"] --> CTX["project-context<br>读取架构全貌"]
10
+ CTX --> ASSESS["现状评估<br>问题识别 + 影响范围"]
11
+
12
+ ASSESS --> BRAIN_CHK{"L4+ 且<br>CLARIFY 未做?"}
13
+ BRAIN_CHK -->|"是"| BRAIN["brainstorm<br>评估重构策略"]
14
+ BRAIN_CHK -->|"否"| PLAN_REF
15
+ BRAIN --> PLAN_REF["重构方案<br>目标架构 + 迁移路径"]
16
+
17
+ PLAN_REF --> ENG{"L3+?"}
18
+ ENG -->|"是"| ENG_DO["engineering-principles<br>验证方案合规性"]
19
+ ENG -->|"否"| RISK
20
+ ENG_DO --> PERF_CHK{"L4+?"}
21
+ PERF_CHK -->|"是"| PERF["performance-arch-design<br>性能重设计"]
22
+ PERF_CHK -->|"否"| RISK
23
+ PERF --> RISK["风险评估<br>回归风险 + 回滚能力"]
24
+
25
+ RISK --> DOCS_CHK{"L3+?"}
26
+ DOCS_CHK -->|"是"| DOCS["docs-output<br>增量同步"]
27
+ DOCS_CHK -->|"否"| GATE
28
+ DOCS --> GATE["Plan 卡点"]
29
+
30
+ style CTX fill:#e3f2fd,stroke:#1565c0,color:#0d47a1
31
+ style ASSESS fill:#fff3e0,stroke:#e65100,color:#bf360c
32
+ style BRAIN fill:#f3e5f5,stroke:#6a1b9a,color:#4a148c
33
+ style PLAN_REF fill:#e8f5e9,stroke:#2e7d32,color:#1b5e20
34
+ style ENG_DO fill:#e3f2fd,stroke:#1565c0,color:#0d47a1
35
+ style PERF fill:#f3e5f5,stroke:#6a1b9a,color:#4a148c
36
+ style RISK fill:#ffcdd2,stroke:#c62828,color:#b71c1c
37
+ style DOCS fill:#e3f2fd,stroke:#1565c0,color:#0d47a1
38
+ style GATE fill:#fff3e0,stroke:#e65100,color:#bf360c,stroke-width:2px
39
+ ```
40
+
41
+ ### 变体差异
42
+
43
+ | Skill | D-lite | D | D+ |
44
+ |-------|--------|---|-----|
45
+ | project-context | 读取架构 | 读取架构 | 读取架构 |
46
+ | 现状评估 | 快速 | 标准 | 深度 |
47
+ | brainstorm | 跳过 | 跳过 | CLARIFY 未做则必做;CLARIFY 已做则跳过 |
48
+ | 重构方案 | 简要 | 标准 | 详细 + 迁移计划 |
49
+ | engineering-principles | 跳过 | 标准验证 | 深度验证 |
50
+ | performance-arch-design | 跳过 | 跳过 | 性能重设计 |
51
+ | 风险评估 | 跳过 | 标准 | 详细 + 回滚方案 |
52
+ | docs-output | 跳过 | 增量同步 | 增量同步 |
53
+
54
+ ---
55
+
56
+ ## Execute
57
+
58
+ 通用执行流程(任务分解 → TDD 循环 → 审查 → 汇合)→ 读取 `references/execute.md`。Route D 的**特化规则**:
59
+
60
+ - **无 scaffold** — 重构不新建项目/模块骨架
61
+ - **核心原则**:每个 task 完成后**原有测试必须全部通过**(行为等价)
62
+ - `integration-test-design` **仅在跨层重构时触发**
63
+ - **不允许积累**:不允许多个 task 完成后再统一测试,每个 task 后立即验证等价性
64
+
65
+ ```mermaid
66
+ graph TB
67
+ E1["Task 1..N: 按重构方案分步编码<br>TDD + 每步行为等价验证"] --> E2{"跨层变更?"}
68
+ E2 -->|"是"| E3["Task N+1: integration-test-design<br>迁移验证测试"]
69
+ E2 -->|"否"| E4["汇合: 全量测试<br>确认行为等价"]
70
+ E3 --> E4
71
+
72
+ style E1 fill:#e8eaf6,stroke:#283593,color:#1a237e
73
+ style E3 fill:#e8eaf6,stroke:#283593,color:#1a237e
74
+ style E4 fill:#e3f2fd,stroke:#1565c0,color:#0d47a1
75
+ ```
@@ -0,0 +1,219 @@
1
+ # 范围切片(Scope Sizer)
2
+
3
+ 在 CLARIFY 之后(或 CLARIFY 跳过后)、路径选择之前执行。评估任务的**广度**而非深度,决定是否将一个大需求拆分为多个可管理的 slice。
4
+
5
+ ## 前置输入
6
+
7
+ scope-sizer 需要**已澄清的需求信息**作为输入,而非原始模糊的用户输入:
8
+
9
+ | 来源 | 内容 | 何时可用 |
10
+ |------|------|---------|
11
+ | CLARIFY 产出 | 模块清单、核心功能、架构方向 | CLARIFY 被触发时 |
12
+ | 用户输入本身 | 已经足够具体(如"给 user 模块加修改密码") | CLARIFY 跳过时 |
13
+ | project-context | 已有项目的模块结构(B/C/D 路径) | 有代码仓库时 |
14
+
15
+ ---
16
+
17
+ ## 为什么需要切片
18
+
19
+ - **上下文窗口有限**:一次对话无法完成 8 个模块的 Plan + Execute
20
+ - **风险分散**:每个 slice 独立验证,问题早暴露早修复
21
+ - **可中断恢复**:用户可在任意 slice 后暂停,下次会话从 progress 恢复
22
+ - **增量交付**:每完成一个 slice 就有可部署的增量产出
23
+
24
+ ---
25
+
26
+ ## 评估维度
27
+
28
+ ```mermaid
29
+ graph TB
30
+ INPUT["已澄清的需求信息<br>(来自 CLARIFY 或具体的用户输入)"] --> DIM1["D1: 模块数<br>识别独立业务模块"]
31
+ INPUT --> DIM2["D2: 功能点数<br>Must 级功能点计数"]
32
+ INPUT --> DIM3["D3: 跨模块依赖<br>模块间耦合度"]
33
+ DIM1 --> DECIDE{"切片决策"}
34
+ DIM2 --> DECIDE
35
+ DIM3 --> DECIDE
36
+
37
+ style INPUT fill:#e3f2fd,stroke:#1565c0,color:#0d47a1
38
+ style DECIDE fill:#f3e5f5,stroke:#6a1b9a,color:#4a148c,stroke-width:2px
39
+ ```
40
+
41
+ | 维度 | 单 slice 标准 | 需拆分标准 |
42
+ |------|-------------|-----------|
43
+ | **模块数** | <= 2 个独立模块 | > 2 个独立模块 |
44
+ | **功能点数** | <= 3 个 Must 功能 | > 3 个 Must 功能 |
45
+ | **跨模块依赖** | 无依赖或线性依赖 | 存在循环依赖或复杂编织 |
46
+
47
+ **触发条件**:任意一个维度达到"需拆分标准"即触发切片。
48
+
49
+ 用户可覆盖:"不拆,一次做完" → 跳过切片,但需在 Plan 中标注风险。
50
+
51
+ ---
52
+
53
+ ## 切片策略
54
+
55
+ 切片策略因路径不同而异。核心思想相同:**按风险和依赖排序,每个 slice 可独立验证**。
56
+
57
+ ### Route A(新项目)— 按依赖层分组
58
+
59
+ ```mermaid
60
+ graph LR
61
+ MODULES["所有模块"] --> GROUP["按依赖层分组"]
62
+ GROUP --> L1["Layer 1: 基础设施<br>认证 · 权限 · 通用配置"]
63
+ GROUP --> L2["Layer 2: 核心域<br>核心业务模块"]
64
+ GROUP --> L3["Layer 3: 支撑域<br>辅助功能模块"]
65
+ GROUP --> L4["Layer 4: 集成层<br>跨模块联动 · 聚合页面"]
66
+
67
+ style L1 fill:#e8eaf6,stroke:#283593,color:#1a237e
68
+ style L2 fill:#c8e6c9,stroke:#2e7d32,color:#1b5e20
69
+ style L3 fill:#fff9c4,stroke:#f9a825,color:#e65100
70
+ style L4 fill:#f3e5f5,stroke:#6a1b9a,color:#4a148c
71
+ ```
72
+
73
+ 1. **基础设施优先**:认证、权限、数据库初始化、项目骨架等放在 Slice 1
74
+ 2. **核心域其次**:系统最核心的业务模块(如小说系统的"小说管理 + 阅读")放在 Slice 2
75
+ 3. **支撑域跟随**:锦上添花但非 MVP 核心的模块(如评论、书架、推荐)后续 slice
76
+ 4. **集成层最后**:需要多模块协作的聚合功能(如首页仪表盘、搜索聚合)放最后
77
+
78
+ ### 每个 slice 的粒度控制
79
+
80
+ | 约束 | 目标 |
81
+ |------|------|
82
+ | 最大模块数 | 单个 slice 不超过 2-3 个模块 |
83
+ | 最大功能点 | 单个 slice 不超过 5 个 Must 功能 |
84
+ | 最大预估文件 | 单个 slice 新增/修改不超过 ~30 个文件 |
85
+ | 可独立运行 | 每个 slice 完成后项目应可编译运行 |
86
+
87
+ ### 全局 vs Slice 级 Skill
88
+
89
+ | Skill | 首个 Slice | 后续 Slice |
90
+ |-------|-----------|-----------|
91
+ | requirement-qa | 全局 + Slice 1 细节 | 仅 Slice N 细节 |
92
+ | brainstorm | 全局架构方案 | **默认跳过**(CLARIFY 已做);仅新架构争议时触发 |
93
+ | spec-writing | 全局概览 + Slice 1 六段式 | 仅 Slice N 六段式 |
94
+ | tech-stack | **完整输出**(全局性) | **跳过**(复用 Slice 1 产出) |
95
+ | engineering-principles | **完整匹配**(全局性) | **跳过**(复用) |
96
+ | api-contract-design | Slice 1 涉及的端点 | Slice N 增量端点 |
97
+ | error-handling-strategy | **完整设计**(全局性) | **跳过**(复用) |
98
+ | code-scaffold | **完整骨架**(仅 Slice 1) | **跳过**(骨架已存在) |
99
+ | docs-output | 初始化 + Slice 1 同步 | **Slice N 增量同步** |
100
+ | project-context | 初始化 + Slice 1 回写 | **Slice N 增量回写** |
101
+
102
+ ### Route B(新功能)— 按实现阶段分组
103
+
104
+ 已有项目上添加新功能时,切片维度从"模块数"转变为"实现阶段"和"影响范围":
105
+
106
+ | 维度 | 单 slice 标准 | 需拆分标准 |
107
+ |------|-------------|-----------|
108
+ | **影响模块数** | 仅 1 个模块内部 | 跨 2+ 模块 |
109
+ | **实现层次** | 单层(仅后端 / 仅前端) | 前后端 + 数据迁移 |
110
+ | **数据变更** | 无 schema 变更 | 需要数据迁移 |
111
+
112
+ **分组原则**:
113
+
114
+ 1. **数据层优先**:如需 schema 变更或数据迁移,单独一个 slice
115
+ 2. **后端 API 其次**:新增/修改后端接口
116
+ 3. **前端 UI 跟随**:依赖后端 API 的前端页面/组件
117
+ 4. **集成联调最后**:端到端集成测试 + 回归
118
+
119
+ 示例:"给小说系统加搜索功能"
120
+ | Slice | 范围 | 内容 |
121
+ |-------|------|------|
122
+ | S1 | 数据层 | ES 索引设计 · 数据同步管道 · schema 迁移 |
123
+ | S2 | 后端 | SearchService · 搜索 API · 分页/排序 |
124
+ | S3 | 前端 + 集成 | 搜索 UI · 联调 · 回归测试 |
125
+
126
+ ### Route C(Bug 修复)— 通常单 slice
127
+
128
+ Bug 修复天然范围窄,**默认不切片**。仅当以下条件满足时才触发:
129
+
130
+ | 信号 | 判定 |
131
+ |------|------|
132
+ | 系统性 bug 影响 3+ 模块 | 需按模块逐个修复验证 |
133
+ | 修复需要数据修正 + 代码修复 | 分为"数据修正 slice"+"代码修复 slice" |
134
+ | 其他情况 | **单 slice,跳过切片** |
135
+
136
+ ### Route D(重构)— 按安全边界分步
137
+
138
+ 重构的切片原则是**每步可回滚、行为等价**:
139
+
140
+ | 维度 | 单 slice 标准 | 需拆分标准 |
141
+ |------|-------------|-----------|
142
+ | **受影响模块** | 仅 1 个模块内部重构 | 跨 2+ 模块或公共层 |
143
+ | **API 变更** | 内部实现变更,API 不变 | API 签名/协议变更 |
144
+ | **数据模型变更** | 无 schema 变更 | 需要数据迁移 |
145
+
146
+ **分组原则**:
147
+
148
+ 1. **内部重构优先**:不改变外部 API 的模块内部重构(最安全)
149
+ 2. **接口重构其次**:API 签名变更 + 调用方适配
150
+ 3. **数据迁移最后**:schema 变更 + 数据转换(风险最高)
151
+
152
+ 示例:"把认证模块重构为微服务"
153
+ | Slice | 范围 | 内容 |
154
+ |-------|------|------|
155
+ | S1 | 内部抽象 | 提取 AuthService 接口 · 解耦直接调用 |
156
+ | S2 | 服务拆分 | 独立服务部署 · gRPC/HTTP 通信 |
157
+ | S3 | 数据迁移 | 用户表迁移 · 双写过渡 · 旧代码清理 |
158
+
159
+ ---
160
+
161
+ ## 切片清单输出格式
162
+
163
+ 评估完成后,输出切片清单供用户确认:
164
+
165
+ ```markdown
166
+ ### Slice 切片计划
167
+
168
+ **需求**: [需求名称]
169
+ **评估结果**: [模块数] 个模块 · [功能点] 个 Must 功能 → 拆分为 [N] 个 slice
170
+
171
+ | Slice | 范围 | 包含模块 | 关键功能 | 依赖 |
172
+ |-------|------|---------|---------|------|
173
+ | S1 | 基础设施 + 核心骨架 | auth, common | 项目初始化 · 认证 · 权限 | 无 |
174
+ | S2 | 核心域 | novel, chapter | 小说 CRUD · 章节管理 · 阅读器 | S1 |
175
+ | S3 | 支撑域 | user, bookshelf | 用户档案 · 书架 · 收藏 | S1, S2 |
176
+ | S4 | 集成 | search, dashboard | 全文搜索 · 首页推荐 | S1-S3 |
177
+
178
+ **预计每个 Slice 独立走完 Plan→Execute→Validate→Deliver。**
179
+ **每个 Slice 完成后同步 docs/ 和 .cache/context.db。**
180
+
181
+ 确认此切片计划?(可调整顺序、合并或拆分 slice)
182
+ ```
183
+
184
+ ---
185
+
186
+ ## Slice 迭代器行为
187
+
188
+ ```mermaid
189
+ graph TB
190
+ START["Slice 清单已确认"] --> READ["读取当前 Slice 定义"]
191
+ READ --> CTX_CHECK["检查前置 Slice 产出<br>docs/ + .cache/context.db"]
192
+ CTX_CHECK --> ROUTE["路径选择<br>(通常仍为 A)"]
193
+ ROUTE --> PLAN["Plan<br>(仅 Slice 级 Skill)"]
194
+ PLAN --> GATE_P{"Plan 卡点"}
195
+ GATE_P -->|"通过"| EXEC["Execute"]
196
+ GATE_P -->|"不通过"| PLAN
197
+ EXEC --> GATE_V{"Validate 卡点"}
198
+ GATE_V -->|"通过"| DELIVER["Deliver<br>docs-output + project-context"]
199
+ GATE_V -->|"代码/设计/需求级"| REFLOW["回流"]
200
+ DELIVER --> NEXT{"还有 Slice?"}
201
+ NEXT -->|"是"| PAUSE{"用户选择"}
202
+ NEXT -->|"否"| DONE["全部完成<br>输出最终交付摘要"]
203
+ PAUSE -->|"继续"| READ
204
+ PAUSE -->|"暂停"| SAVE["保存进度<br>下次从此恢复"]
205
+
206
+ style START fill:#e3f2fd,stroke:#1565c0,color:#0d47a1
207
+ style DELIVER fill:#e8f5e9,stroke:#2e7d32,color:#1b5e20,stroke-width:2px
208
+ style PAUSE fill:#fff3e0,stroke:#e65100,color:#bf360c,stroke-width:2px
209
+ style DONE fill:#e8f5e9,stroke:#2e7d32,color:#1b5e20,stroke-width:2px
210
+ style SAVE fill:#f3e5f5,stroke:#6a1b9a,color:#4a148c
211
+ ```
212
+
213
+ ### 暂停与恢复
214
+
215
+ - 每个 Slice 的 Deliver 阶段强制同步 docs/ 和 .cache/context.db
216
+ - 如果用户暂停(或会话中断),下次启动 Orchestrator 时:
217
+ 1. project-context 读取 .cache/context.db → 发现项目已有代码和文档
218
+ 2. 读取 docs/progress/ → 发现上次完成到 Slice N
219
+ 3. 自动从 Slice N+1 继续,无需重新评估全局上下文
@@ -0,0 +1,208 @@
1
+ ---
2
+ name: performance-arch-design
3
+ description: >-
4
+ 性能前置设计——在编码前从架构层面识别性能瓶颈并设计缓存分层、异步处理、数据库索引、限流和分区策略。将性能思维融入系统架构设计阶段,避免事后优化的高成本。
5
+ 务必在以下场景使用本 skill:用户提到性能优化、缓存设计、缓存策略、Redis、异步处理、消息队列、数据库索引、索引设计、限流、熔断、分库分表、分区、N+1 查询、慢查询、高并发、性能瓶颈、QPS、TPS、响应时间、吞吐量、性能基线、压测目标、热点数据、读写分离,或涉及 steps/06 系统架构中的性能相关决策。
6
+ ---
7
+
8
+ # 性能前置设计
9
+
10
+ 在编码前从架构层面识别性能瓶颈,设计缓存分层、异步处理、索引策略和限流方案。
11
+
12
+ ---
13
+
14
+ ## 设计流程
15
+
16
+ ```mermaid
17
+ graph TB
18
+ INPUT["系统架构 + 业务场景"] --> BASELINE["性能基线<br>目标 QPS / 响应时间"]
19
+ BASELINE --> HOTSPOT["热点识别<br>高频读 / 高频写 / 大数据量"]
20
+ HOTSPOT --> CACHE["缓存分层<br>本地 / 分布式 / CDN"]
21
+ HOTSPOT --> ASYNC["异步处理<br>消息队列 / 事件驱动"]
22
+ HOTSPOT --> INDEX["索引策略<br>数据库索引 / 全文检索"]
23
+ CACHE --> PROTECT["保护机制<br>限流 / 熔断 / 降级"]
24
+ ASYNC --> PROTECT
25
+ INDEX --> PROTECT
26
+ PROTECT --> OUTPUT["输出性能方案"]
27
+
28
+ style INPUT fill:#e3f2fd,stroke:#1565c0,color:#0d47a1
29
+ style BASELINE fill:#fff3e0,stroke:#e65100,color:#bf360c
30
+ style HOTSPOT fill:#ffcdd2,stroke:#c62828,color:#b71c1c
31
+ style CACHE fill:#e8eaf6,stroke:#283593,color:#1a237e
32
+ style ASYNC fill:#e8eaf6,stroke:#283593,color:#1a237e
33
+ style INDEX fill:#e8eaf6,stroke:#283593,color:#1a237e
34
+ style PROTECT fill:#f3e5f5,stroke:#6a1b9a,color:#4a148c
35
+ style OUTPUT fill:#e8f5e9,stroke:#2e7d32,color:#1b5e20
36
+ ```
37
+
38
+ ---
39
+
40
+ ## 1. 性能基线定义
41
+
42
+ ### 目标模板
43
+
44
+ | 指标 | 目标 | 测量方式 |
45
+ |--|--|--|
46
+ | P99 响应时间 | < 200ms (读) / < 500ms (写) | APM 工具 |
47
+ | QPS | 根据业务估算 | 压测工具 |
48
+ | 错误率 | < 0.1% | 监控告警 |
49
+ | 数据库查询 | < 50ms (单表) / < 200ms (联表) | 慢查询日志 |
50
+
51
+ ### 估算公式
52
+
53
+ ```
54
+ 预估 QPS = 日活用户 × 人均请求数 / 有效时长(秒)
55
+ 峰值 QPS = 预估 QPS × 3(峰值系数)
56
+ ```
57
+
58
+ ---
59
+
60
+ ## 2. 热点识别
61
+
62
+ ### 读热点
63
+
64
+ | 特征 | 示例 | 优化策略 |
65
+ |--|--|--|
66
+ | 同一数据被大量请求 | 商品详情、配置信息 | 缓存 |
67
+ | 列表查询频繁 | 首页数据、排行榜 | 预计算 + 缓存 |
68
+ | 大数据量全表扫描 | 搜索、报表 | 索引 / 全文检索 / 物化视图 |
69
+
70
+ ### 写热点
71
+
72
+ | 特征 | 示例 | 优化策略 |
73
+ |--|--|--|
74
+ | 高并发写同一行 | 库存扣减、计数器 | 乐观锁 / 分桶计数 |
75
+ | 批量数据写入 | 日志写入、数据导入 | 异步 + 批量 |
76
+ | 大事务 | 多表级联操作 | 拆分事务 / Saga |
77
+
78
+ ---
79
+
80
+ ## 3. 缓存分层
81
+
82
+ ```mermaid
83
+ graph LR
84
+ REQ["请求"] --> L1["L1: 本地缓存<br>Caffeine / LRU<br>< 1ms"]
85
+ L1 -->|"未命中"| L2["L2: 分布式缓存<br>Redis<br>1-5ms"]
86
+ L2 -->|"未命中"| DB["数据库<br>10-100ms"]
87
+ DB -->|"回填"| L2
88
+ L2 -->|"回填"| L1
89
+
90
+ style REQ fill:#f5f5f5,stroke:#616161,color:#212121
91
+ style L1 fill:#c8e6c9,stroke:#2e7d32,color:#1b5e20
92
+ style L2 fill:#e3f2fd,stroke:#1565c0,color:#0d47a1
93
+ style DB fill:#ffe0b2,stroke:#e65100,color:#bf360c
94
+ ```
95
+
96
+ ### 缓存策略选择
97
+
98
+ | 场景 | 策略 | TTL | 说明 |
99
+ |--|--|--|--|
100
+ | 基本不变的数据 | Cache-Aside | 24h | 配置、字典表 |
101
+ | 频繁读少量写 | Cache-Aside + 写失效 | 1h | 用户信息、商品详情 |
102
+ | 读写均衡 | Write-Through | 30min | 会话数据 |
103
+ | 写多读少 | Write-Behind | N/A | 日志、统计 |
104
+ | 排行榜/计数 | Redis 原生结构 | 持久化 | SortedSet / HyperLogLog |
105
+
106
+ ### 缓存问题防护
107
+
108
+ | 问题 | 原因 | 解决方案 |
109
+ |--|--|--|
110
+ | 缓存穿透 | 查询不存在的数据 | 布隆过滤器 / 缓存空值(短 TTL) |
111
+ | 缓存击穿 | 热点 Key 过期 | 互斥锁加载 / 永不过期+异步刷新 |
112
+ | 缓存雪崩 | 大量 Key 同时过期 | TTL 加随机偏移 / 多级缓存 |
113
+
114
+ ---
115
+
116
+ ## 4. 异步处理
117
+
118
+ ### 适用场景判定
119
+
120
+ ```mermaid
121
+ graph TB
122
+ DECIDE{"该操作是否?"} -->|"用户需要即时结果"| SYNC["同步处理"]
123
+ DECIDE -->|"耗时 > 2s"| ASYNC_YES["异步 + 轮询/推送"]
124
+ DECIDE -->|"不影响主流程"| ASYNC_FIRE["异步 Fire-and-Forget"]
125
+ DECIDE -->|"需要多步编排"| SAGA["Saga / 工作流"]
126
+
127
+ style SYNC fill:#c8e6c9,stroke:#2e7d32,color:#1b5e20
128
+ style ASYNC_YES fill:#e3f2fd,stroke:#1565c0,color:#0d47a1
129
+ style ASYNC_FIRE fill:#fff9c4,stroke:#f9a825,color:#e65100
130
+ style SAGA fill:#f3e5f5,stroke:#6a1b9a,color:#4a148c
131
+ ```
132
+
133
+ ### 消息队列选型
134
+
135
+ | 队列 | 适用 | 特点 |
136
+ |--|--|--|
137
+ | Redis Stream | 轻量级、单机 | 简单、不持久化 |
138
+ | RabbitMQ | 中小型、需要路由 | 灵活路由、可靠投递 |
139
+ | Kafka | 大数据量、日志流 | 高吞吐、持久化、分区 |
140
+
141
+ ---
142
+
143
+ ## 5. 数据库索引策略
144
+
145
+ ### 索引设计原则
146
+
147
+ | 原则 | 说明 |
148
+ |--|--|
149
+ | 高选择性字段优先 | 唯一值多的列效果好 |
150
+ | 查询条件即索引 | WHERE / ORDER BY / JOIN 的列 |
151
+ | 复合索引最左前缀 | 遵循查询模式排列列顺序 |
152
+ | 覆盖索引 | 索引包含查询所有列,避免回表 |
153
+ | 避免过度索引 | 每增加一个索引,写入性能下降 |
154
+
155
+ ### N+1 查询防护
156
+
157
+ | 场景 | ORM 解法 | SQL 解法 |
158
+ |--|--|--|
159
+ | 关联查询 | Eager Loading / Join Fetch | LEFT JOIN |
160
+ | 批量查询 | `findAllById(ids)` | `WHERE id IN (...)` |
161
+ | 分页+关联 | 先查 ID 再批量加载 | 子查询分页 |
162
+
163
+ ### 慢查询预防清单
164
+ - [ ] 所有 WHERE 条件都有索引覆盖
165
+ - [ ] 无全表 COUNT(*)(用近似计数或缓存)
166
+ - [ ] 无 `SELECT *`(只查需要的列)
167
+ - [ ] 分页用游标/Keyset 而非 OFFSET
168
+ - [ ] 大 IN 列表拆分为批次(< 1000 条)
169
+
170
+ ---
171
+
172
+ ## 6. 限流策略
173
+
174
+ | 算法 | 适用 | 特点 |
175
+ |--|--|--|
176
+ | 固定窗口 | 简单限流 | 有边界突刺问题 |
177
+ | 滑动窗口 | 一般 API | 平滑、内存稍多 |
178
+ | 令牌桶 | 允许突发 | 可积累令牌应对突发 |
179
+ | 漏桶 | 严格匀速 | 流量平滑 |
180
+
181
+ ### 限流维度
182
+
183
+ | 维度 | 示例 |
184
+ |--|--|
185
+ | 用户级 | 每用户 100 次/分 |
186
+ | IP 级 | 每 IP 200 次/分 |
187
+ | API 级 | 某接口全局 1000 次/秒 |
188
+ | 服务级 | 上游调用方配额 |
189
+
190
+ ---
191
+
192
+ ## 7. 输出清单
193
+
194
+ | 制品 | 说明 |
195
+ |--|--|
196
+ | 性能基线文档 | 目标 QPS、响应时间、错误率 |
197
+ | 热点分析表 | 读热点 + 写热点 + 优化策略 |
198
+ | 缓存设计方案 | 分层策略、TTL、防护措施 |
199
+ | 异步处理方案 | 场景列表 + 队列选型 |
200
+ | 索引设计清单 | 每张表的索引定义 |
201
+ | 限流配置 | 维度 + 算法 + 阈值 |
202
+
203
+ ---
204
+
205
+ ## 参考
206
+
207
+ 详细规则参见 `references/` 目录:
208
+ - `performance-rules.md` — 性能设计详细规则与反模式
@@ -0,0 +1,95 @@
1
+ # 性能设计规则与反模式
2
+
3
+ ## 性能反模式
4
+
5
+ | 反模式 | 问题 | 解决方案 |
6
+ |--|--|--|
7
+ | N+1 查询 | 循环中逐条查询 | 批量查询 / JOIN |
8
+ | SELECT * | 返回不需要的列 | 显式列出字段 |
9
+ | 大事务 | 长时间持锁 | 拆分事务、减小范围 |
10
+ | OFFSET 分页 | 深分页性能差 | Keyset 游标分页 |
11
+ | 无索引全表扫描 | 查询 O(n) | 添加合适索引 |
12
+ | 缓存 key 无 TTL | 内存持续增长 | 所有 key 设置 TTL |
13
+ | 同步调用链过长 | 延迟累加 | 异步化非关键路径 |
14
+ | 数据库当队列用 | 轮询开销大 | 使用消息队列 |
15
+ | 日志中序列化大对象 | 影响吞吐 | 只记关键字段 |
16
+ | 无连接池 | 连接创建开销 | 配置连接池(HikariCP) |
17
+
18
+ ## 缓存 Key 设计规范
19
+
20
+ ### 命名格式
21
+ ```
22
+ {app}:{module}:{entity}:{id}[:suffix]
23
+ ```
24
+
25
+ 示例:
26
+ - `myapp:user:profile:12345`
27
+ - `myapp:order:list:user:12345:page:1`
28
+ - `myapp:config:system:global`
29
+
30
+ ### 规则
31
+ - Key 长度 < 128 字节
32
+ - 不包含空格和特殊字符
33
+ - 使用 `:` 分隔层级
34
+ - 批量操作用 `{hash_tag}` 保证同槽
35
+
36
+ ## Redis 数据结构选型
37
+
38
+ | 场景 | 数据结构 | 示例 |
39
+ |--|--|--|
40
+ | 对象缓存 | String (JSON) | 用户信息 |
41
+ | 计数器 | String (INCR) | API 调用次数 |
42
+ | 集合去重 | Set | 用户在线列表 |
43
+ | 排行榜 | Sorted Set | 积分排行 |
44
+ | 近似计数 | HyperLogLog | UV 统计 |
45
+ | 布隆过滤 | Bloom Filter (module) | 缓存穿透防护 |
46
+ | 限流 | String + Lua 脚本 | 滑动窗口计数 |
47
+ | 分布式锁 | String + NX + PX | Redisson |
48
+
49
+ ## 连接池配置参考
50
+
51
+ ### HikariCP (Java)
52
+
53
+ | 参数 | 推荐值 | 说明 |
54
+ |--|--|--|
55
+ | maximumPoolSize | CPU 核心数 * 2 + 1 | 数据库连接上限 |
56
+ | minimumIdle | 与 maximumPoolSize 相同 | 固定连接数性能最优 |
57
+ | connectionTimeout | 30000ms | 获取连接超时 |
58
+ | idleTimeout | 600000ms (10min) | 空闲连接存活时间 |
59
+ | maxLifetime | 1800000ms (30min) | 连接最大存活时间 |
60
+
61
+ ## Keyset 分页 vs OFFSET 分页
62
+
63
+ ### OFFSET 分页(不推荐深分页)
64
+ ```sql
65
+ SELECT * FROM orders ORDER BY id LIMIT 20 OFFSET 10000;
66
+ -- 数据库需要扫描 10020 行再丢弃前 10000 行
67
+ ```
68
+
69
+ ### Keyset 分页(推荐)
70
+ ```sql
71
+ SELECT * FROM orders WHERE id > :lastId ORDER BY id LIMIT 20;
72
+ -- 直接从索引定位,性能恒定
73
+ ```
74
+
75
+ ### 前端配合
76
+ ```json
77
+ {
78
+ "data": [...],
79
+ "pagination": {
80
+ "nextCursor": "eyJpZCI6MTAyMH0=",
81
+ "hasMore": true
82
+ }
83
+ }
84
+ ```
85
+
86
+ ## 压测检查清单
87
+
88
+ - [ ] 已确定目标 QPS 和 P99 响应时间
89
+ - [ ] 压测数据量与生产一致(或同量级)
90
+ - [ ] 压测覆盖热点接口(读 + 写)
91
+ - [ ] 观察数据库连接池使用率
92
+ - [ ] 观察 CPU / 内存 / 网络 IO
93
+ - [ ] 观察慢查询和慢日志
94
+ - [ ] 压测期间无 OOM 或连接泄漏
95
+ - [ ] 压测后数据一致性验证