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,34 @@
1
+ # 设计模式指南
2
+
3
+ > 核心理念:**设计服务于约束,不服务于教科书**。复杂度必须有回报——如果简单代码能解决,不引入模式。
4
+
5
+ ## 模式选型总表
6
+
7
+ | 信号 | 推荐模式 | 避免 |
8
+ |------|---------|------|
9
+ | 多个 `if/else` 选择不同行为 | 策略模式 / 多态 | 平铺 switch-case |
10
+ | 创建逻辑复杂或需要灵活切换 | 工厂模式 | 每处重复 new |
11
+ | 多步骤构造,参数 > 5 个 | 建造者模式 | 超长构造函数 |
12
+ | 多对象响应同一事件 | 观察者 / Event Bus | 直接调用紧耦合 |
13
+ | 接口不兼容需要适配 | 适配器模式 | 修改第三方源码 |
14
+ | 不修改原类增加功能 | 装饰器 / HOC | 继承链加深 |
15
+ | 控制创建数量(连接池) | 对象池 / DI 容器 | 手动全局单例 |
16
+ | 树形结构统一操作 | 组合模式 | 每层特殊处理 |
17
+ | 状态转换有明确规则 | 状态机 | 散落 if-else |
18
+ | 操作需要撤销/重做 | 命令模式 | 手动逆向 |
19
+ | 深层嵌套条件 | Guard Clause 提前返回 | 多层 if-else |
20
+ | 线性数据变换流程 | Pipe/Compose | 临时变量链 |
21
+ | 外部调用可能失败 | 断路器 + 指数退避 | 无限重试 |
22
+
23
+ ## 按尺度查阅
24
+
25
+ | 尺度 | 文件 | 内容 |
26
+ |------|------|------|
27
+ | 函数级 | `patterns-small-scale.md` | Guard Clause、Pipe/Compose、表驱动、Null Object、惰性求值、闭包 |
28
+ | 类/对象级 | `patterns-classic.md` | GoF 创建型(Factory/Builder/Singleton)、结构型(Decorator/Composite/Facade/Adapter/Proxy)、行为型(Strategy/Observer/State Machine/Command/责任链) |
29
+ | 模块级 | `patterns-module.md` | Pipeline/Middleware、Worker Pool、Circuit Breaker、Repository、FSM |
30
+ | 前端 | `patterns-frontend.md` | React/Vue 模式选型、样式/路由/错误边界 |
31
+ | 后端 | `patterns-backend.md` | CQRS、Saga、Event Sourcing、Specification、RBAC/ABAC |
32
+ | 跨域 | `patterns-crosscut.md` | 插件系统、指数退避重试、缓存策略、结构化日志、DI |
33
+ | 系统级 | `patterns-architecture.md` | 分层/六边形/Clean Architecture/微内核/模块化单体/微服务/事件驱动/Serverless |
34
+ | 代码质量 | `anti-patterns.md` | 10 种反模式识别信号 + 改进策略 + 重构优先级 |
@@ -0,0 +1,301 @@
1
+ # 架构模式(系统级)
2
+
3
+ 系统或应用级别的架构决策。选择架构前先回答:**团队规模、部署约束、业务复杂度、变化频率**。
4
+
5
+ ## 架构选型决策表
6
+
7
+ | 场景 | 推荐架构 | 不推荐 |
8
+ |------|---------|--------|
9
+ | 小团队,业务简单,快速上线 | **模块化单体** | 微服务(运维成本高) |
10
+ | 业务逻辑复杂,领域边界清晰 | **六边形 / Clean Architecture** | 传统分层(领域逻辑泄漏) |
11
+ | 需要第三方扩展,核心稳定 | **微内核(插件架构)** | 硬编码扩展点 |
12
+ | 团队 > 30 人,独立部署需求 | **微服务** | 单体(团队协作瓶颈) |
13
+ | 高吞吐,异步处理为主 | **事件驱动架构** | 同步 RPC 链 |
14
+ | 流量波动大,按需计费 | **Serverless** | 长连接/有状态服务 |
15
+ | 遗留系统渐进重构 | **模块化单体 → 渐进拆分** | 全量重写 |
16
+
17
+ ---
18
+
19
+ ## 分层架构 (Layered / N-Tier)
20
+
21
+ 最基础的架构,适合大多数中小项目。
22
+
23
+ ```mermaid
24
+ graph TB
25
+ P["Presentation\nController / API Route"] --> A["Application\nUse Case / Service"]
26
+ A --> D["Domain\nEntity / Value Object"]
27
+ D --> I["Infrastructure\nDB / External API / File"]
28
+ style P fill:#e3f2fd,stroke:#1565c0
29
+ style A fill:#e8eaf6,stroke:#283593
30
+ style D fill:#e8f5e9,stroke:#2e7d32
31
+ style I fill:#fff3e0,stroke:#e65100
32
+ ```
33
+
34
+ **核心规则**: 依赖只能向下,不能跨层或向上依赖。
35
+
36
+ **适用**: 业务逻辑不复杂、团队对 DDD 不熟悉的项目。
37
+
38
+ **注意**: 容易退化为"所有逻辑都写在 Service 层"的贫血架构。
39
+
40
+ ---
41
+
42
+ ## 六边形架构 / 端口与适配器 (Hexagonal / Ports & Adapters)
43
+
44
+ 领域逻辑在中心,外部依赖通过端口/适配器接入。
45
+
46
+ ```mermaid
47
+ graph LR
48
+ REST["Adapter\n(REST API)"] --> Domain
49
+ CLI["Adapter\n(CLI)"] --> Domain
50
+ Mock["Adapter\n(Test Mock)"] --> Domain
51
+ Domain["Domain\n(Ports)"] --> DB["Adapter\n(DB)"]
52
+ Domain --> MQ["Adapter\n(Message Queue)"]
53
+ style Domain fill:#e8f5e9,stroke:#2e7d32,stroke-width:3px
54
+ ```
55
+
56
+ **核心概念**:
57
+ - **Port**: 领域定义的接口(如 `UserRepository`、`PaymentGateway`)
58
+ - **Adapter**: 外部实现(如 `PostgresUserRepository`、`StripePaymentAdapter`)
59
+ - 领域层不依赖任何框架或基础设施
60
+
61
+ ```typescript
62
+ // Port(领域定义)
63
+ interface OrderRepository {
64
+ save(order: Order): Promise<void>
65
+ findById(id: OrderId): Promise<Order | null>
66
+ }
67
+
68
+ // Adapter(基础设施实现)
69
+ class TypeORMOrderRepository implements OrderRepository {
70
+ async save(order: Order) { /* TypeORM 实现 */ }
71
+ async findById(id: OrderId) { /* TypeORM 实现 */ }
72
+ }
73
+
74
+ // 领域服务只依赖 Port,不知道具体实现
75
+ class PlaceOrderUseCase {
76
+ constructor(
77
+ private orderRepo: OrderRepository, // Port
78
+ private payment: PaymentGateway, // Port
79
+ ) {}
80
+ }
81
+ ```
82
+
83
+ **适用**: 业务逻辑复杂、需要高可测试性、可能更换基础设施(换数据库、换消息队列)。
84
+
85
+ ---
86
+
87
+ ## Clean Architecture(整洁架构)
88
+
89
+ 同心圆依赖规则:内层不知道外层的存在。
90
+
91
+ ```mermaid
92
+ graph TB
93
+ subgraph FW["Frameworks & Drivers (Web, DB, UI)"]
94
+ subgraph IA["Interface Adapters (Controllers, Gateways, Presenters)"]
95
+ subgraph APP["Application (Use Cases)"]
96
+ ENT["Entities (Domain)"]
97
+ end
98
+ end
99
+ end
100
+ style ENT fill:#e8f5e9,stroke:#2e7d32,stroke-width:3px
101
+ style APP fill:#c8e6c9,stroke:#388e3c
102
+ style IA fill:#e3f2fd,stroke:#1565c0
103
+ style FW fill:#fff3e0,stroke:#e65100
104
+ ```
105
+
106
+ **依赖规则**: 依赖方向只能从外向内。内层定义接口,外层实现。
107
+
108
+ **与六边形的区别**: Clean Architecture 更强调 Use Case 层的独立性,明确区分 Entity(领域规则)和 Use Case(应用规则)。
109
+
110
+ **适用**: 大型项目、长期维护、多团队协作。引入成本较高,小项目慎用。
111
+
112
+ ---
113
+
114
+ ## 微内核 / 插件架构 (Microkernel / Plugin)
115
+
116
+ 稳定核心 + 可插拔扩展。
117
+
118
+ ```mermaid
119
+ graph TB
120
+ subgraph Core["Core System"]
121
+ direction LR
122
+ PA["Plugin A"] ~~~ PB["Plugin B"] ~~~ PC["Plugin C"]
123
+ end
124
+ REG["Plugin Registry + Lifecycle"] --> Core
125
+ style Core fill:#e8f5e9,stroke:#2e7d32,stroke-width:2px
126
+ ```
127
+
128
+ **核心结构**:
129
+
130
+ ```typescript
131
+ // 插件契约
132
+ interface Plugin {
133
+ name: string
134
+ version: string
135
+ install(core: CoreAPI): void
136
+ destroy?(): void
137
+ }
138
+
139
+ // 核心系统
140
+ class PluginManager {
141
+ private plugins = new Map<string, Plugin>()
142
+
143
+ register(plugin: Plugin) {
144
+ plugin.install(this.coreAPI)
145
+ this.plugins.set(plugin.name, plugin)
146
+ }
147
+
148
+ unregister(name: string) {
149
+ this.plugins.get(name)?.destroy?.()
150
+ this.plugins.delete(name)
151
+ }
152
+ }
153
+
154
+ // 核心 API(暴露给插件的受控接口)
155
+ interface CoreAPI {
156
+ registerRoute(path: string, handler: Handler): void
157
+ registerHook(event: string, callback: Function): void
158
+ getConfig(key: string): unknown
159
+ }
160
+ ```
161
+
162
+ **适用场景**:
163
+ - IDE / 编辑器(VS Code 就是微内核)
164
+ - 低代码平台(组件即插件)
165
+ - 工具链(Webpack/Vite 的 Plugin 系统)
166
+ - 需要第三方扩展但核心保持稳定
167
+
168
+ **关键决策**: 核心 API 的粒度——太粗则插件无法做有用的事,太细则核心变动会破坏所有插件。
169
+
170
+ ---
171
+
172
+ ## 模块化单体 (Modular Monolith)
173
+
174
+ 单部署单元,但内部模块边界清晰。微服务的前序架构。
175
+
176
+ ```mermaid
177
+ graph TB
178
+ subgraph Deploy["单一部署单元"]
179
+ subgraph OM["Order Module"]
180
+ O1["api/"] ~~~ O2["domain/"] ~~~ O3["infra/"]
181
+ end
182
+ subgraph PM["Payment Module"]
183
+ P1["api/"] ~~~ P2["domain/"] ~~~ P3["infra/"]
184
+ end
185
+ subgraph UM["User Module"]
186
+ U1["api/"] ~~~ U2["domain/"] ~~~ U3["infra/"]
187
+ end
188
+ OM <--->|"公开 API 通信"| PM
189
+ PM <--->|"公开 API 通信"| UM
190
+ end
191
+ style Deploy fill:#f3e5f5,stroke:#6a1b9a,stroke-width:2px
192
+ ```
193
+
194
+ **核心规则**:
195
+ - 每个模块有独立的 `api/`(对外接口)、`domain/`、`infra/`
196
+ - 模块间只通过公开 API 或事件通信,**禁止直接 import 另一个模块的内部类**
197
+ - 可共享数据库,但表归属明确(或每个模块独立 schema)
198
+
199
+ ```typescript
200
+ // 模块公开 API
201
+ // modules/order/api/order.facade.ts
202
+ export class OrderFacade {
203
+ async createOrder(dto: CreateOrderDto): Promise<OrderId> { ... }
204
+ async getOrderStatus(id: OrderId): Promise<OrderStatus> { ... }
205
+ }
206
+
207
+ // 其他模块通过 Facade 调用,不直接访问 Order 的 domain/infra
208
+ // modules/payment/domain/payment.service.ts
209
+ class PaymentService {
210
+ constructor(private orderFacade: OrderFacade) {} // 通过 API 而非内部类
211
+ }
212
+ ```
213
+
214
+ **适用**: 大多数项目的最佳起点。比单体有更好的边界,比微服务少运维负担。未来可按模块拆分为微服务。
215
+
216
+ ---
217
+
218
+ ## 微服务 (Microservices)
219
+
220
+ 独立部署、独立数据存储、通过网络通信。
221
+
222
+ **引入条件**(全部满足才考虑):
223
+ - 团队 > 30 人,需要独立发布节奏
224
+ - 不同服务有显著不同的扩展需求(如搜索需要弹性扩容)
225
+ - 已验证过模块化单体,边界足够清晰
226
+
227
+ **关键决策**:
228
+
229
+ | 决策点 | 选项 |
230
+ |-------|------|
231
+ | 通信 | 同步 REST/gRPC vs 异步消息队列 |
232
+ | 数据 | 每服务独立数据库 vs 共享数据库(不推荐) |
233
+ | 事务 | Saga vs 最终一致性 |
234
+ | 发现 | 服务注册 vs DNS vs API Gateway |
235
+ | 观测 | 分布式追踪 + 集中日志 + 健康检查 |
236
+
237
+ **常见陷阱**:
238
+ - 分布式单体:服务间强依赖,改一个要发多个
239
+ - 过度拆分:每个 CRUD 一个服务
240
+ - 忽略运维成本:CI/CD、监控、日志、链路追踪的复杂度
241
+
242
+ ---
243
+
244
+ ## 事件驱动架构 (Event-Driven Architecture)
245
+
246
+ 以事件为核心的异步通信模式。
247
+
248
+ ```mermaid
249
+ graph LR
250
+ P["Producer"] --> EB["Event Broker"]
251
+ EB --> C["Consumer"]
252
+ EB --> ES["Event Store (可选)"]
253
+ ```
254
+
255
+ **两种模式**:
256
+
257
+ | 模式 | 描述 | 适用 |
258
+ |------|------|------|
259
+ | **Event Notification** | 事件只携带 ID,消费者回查详情 | 简单通知,不关心历史 |
260
+ | **Event-Carried State Transfer** | 事件携带完整数据 | 消费者需要自治,减少回查 |
261
+
262
+ **适用**: 高吞吐异步处理、服务间解耦、审计日志、实时数据管道。
263
+
264
+ **注意**: 事件顺序、幂等性、最终一致性是必须解决的问题。
265
+
266
+ ---
267
+
268
+ ## Serverless / FaaS
269
+
270
+ 函数即服务,按调用计费。
271
+
272
+ **适用场景**:
273
+ - Webhook 处理、定时任务、文件处理
274
+ - 流量极不均匀(高峰/低谷差异大)
275
+ - 无状态计算
276
+
277
+ **不适用**:
278
+ - 长时间运行的任务(超时限制)
279
+ - 需要 WebSocket/长连接
280
+ - 冷启动敏感的低延迟场景
281
+
282
+ ---
283
+
284
+ ## 架构演进路径
285
+
286
+ ```mermaid
287
+ graph LR
288
+ A["单体"] --> B["模块化单体"]
289
+ B --> C{"需要独立部署?"}
290
+ C -->|是| D["微服务"]
291
+ C -->|否| B
292
+
293
+ A --> E{"需要扩展性?"}
294
+ E -->|插件式| F["微内核"]
295
+ E -->|领域驱动| G["六边形/Clean"]
296
+
297
+ style B fill:#e8f5e9,stroke:#388e3c
298
+ style D fill:#fff3e0,stroke:#f57c00
299
+ ```
300
+
301
+ > **默认推荐路径**: 单体 → 模块化单体 → 按需拆微服务。不要跳过模块化单体直接上微服务。
@@ -0,0 +1,77 @@
1
+ # 后端特定模式
2
+
3
+ ## 选型速查
4
+
5
+ | 场景 | 方案 | 引入条件 |
6
+ |------|------|---------|
7
+ | 读写模型差异大 | **CQRS** | 读写比 > 10:1 或查询/写入模型显著不同 |
8
+ | 多步骤异步事务 | **Saga** | 步骤 ≥ 3 且含补偿逻辑 |
9
+ | 完整变更历史 | **Event Sourcing** | 需要审计/回放/时间旅行 |
10
+ | 业务规则复用 | **Specification** | 规则可组合(and/or/not) |
11
+ | API 版本管理 | 路径版本 / Header 版本 | 公共 API 有外部消费者 |
12
+ | 权限控制 | **RBAC / ABAC** | 角色 > 3 种 或 需要属性级权限 |
13
+
14
+ ## CQRS(命令与查询分离)
15
+
16
+ ```typescript
17
+ // 读写分离:写入走命令服务,读取走查询服务
18
+ class OrderCommandService {
19
+ async createOrder(cmd: CreateOrderCommand) { /* 写入主库 */ }
20
+ }
21
+ class OrderQueryService {
22
+ async getOrderDetail(id: string) { /* 读取,可走缓存/读库 */ }
23
+ }
24
+ ```
25
+
26
+ ## Saga(多步骤异步事务)
27
+
28
+ ```typescript
29
+ // 每个步骤有执行和补偿
30
+ interface SagaStep {
31
+ execute(): Promise<void>
32
+ compensate(): Promise<void>
33
+ }
34
+
35
+ // 执行链:成功则继续 → 失败则反向补偿
36
+ async function runSaga(steps: SagaStep[]) {
37
+ const completed: SagaStep[] = []
38
+ for (const step of steps) {
39
+ try {
40
+ await step.execute()
41
+ completed.push(step)
42
+ } catch (e) {
43
+ for (const s of completed.reverse()) await s.compensate()
44
+ throw e
45
+ }
46
+ }
47
+ }
48
+ ```
49
+
50
+ ## Specification(规约模式)
51
+
52
+ ```typescript
53
+ // 业务规则可组合
54
+ interface Specification<T> {
55
+ isSatisfiedBy(candidate: T): boolean
56
+ and(other: Specification<T>): Specification<T>
57
+ or(other: Specification<T>): Specification<T>
58
+ not(): Specification<T>
59
+ }
60
+
61
+ // 使用:
62
+ const eligible = new AgeSpec(18).and(new RegionSpec('CN')).and(new VipSpec())
63
+ const users = await userRepo.findAll(eligible)
64
+ ```
65
+
66
+ ## Domain Service
67
+
68
+ ```typescript
69
+ // 业务逻辑不属于单个实体时,放入领域服务
70
+ class TransferService {
71
+ transfer(from: Account, to: Account, amount: Money) {
72
+ if (!from.canWithdraw(amount)) throw new InsufficientFundsError()
73
+ from.withdraw(amount)
74
+ to.deposit(amount)
75
+ }
76
+ }
77
+ ```
@@ -0,0 +1,200 @@
1
+ # 经典模式(GoF)
2
+
3
+ ## 创建型
4
+
5
+ ### 工厂模式 (Factory)
6
+
7
+ ```typescript
8
+ // DO: 封装复杂创建逻辑
9
+ class NotificationFactory {
10
+ static create(channel: Channel): Notification {
11
+ const map: Record<Channel, () => Notification> = {
12
+ email: () => new EmailNotification(config.smtp),
13
+ sms: () => new SmsNotification(config.smsGateway),
14
+ push: () => new PushNotification(config.firebase),
15
+ }
16
+ const creator = map[channel]
17
+ if (!creator) throw new Error(`Unknown channel: ${channel}`)
18
+ return creator()
19
+ }
20
+ }
21
+ ```
22
+
23
+ ### 建造者模式 (Builder)
24
+
25
+ ```typescript
26
+ // DO: 多步骤构造,可选参数多
27
+ const query = new QueryBuilder('users')
28
+ .where('age', '>', 18)
29
+ .orderBy('name')
30
+ .limit(10)
31
+ .build()
32
+
33
+ // DON'T: 超长构造函数
34
+ new Query('users', null, [['age', '>', 18]], null, 'name', 'asc', 10)
35
+ ```
36
+
37
+ ### 单例 / DI 容器
38
+
39
+ ```typescript
40
+ // DO: 通过 DI 容器管理生命周期(NestJS 示例)
41
+ @Injectable({ scope: Scope.DEFAULT }) // 默认单例
42
+ class DatabaseService { ... }
43
+
44
+ // DON'T: 手动全局单例
45
+ let instance: DatabaseService | null = null
46
+ export function getDatabase() {
47
+ if (!instance) instance = new DatabaseService()
48
+ return instance // 测试无法替换
49
+ }
50
+ ```
51
+
52
+ ## 结构型
53
+
54
+ ### 装饰器 (Decorator / HOC / Composable)
55
+
56
+ ```typescript
57
+ // DO: 不修改原对象,透明增加功能
58
+ function withLogging<T extends (...args: any[]) => any>(fn: T): T {
59
+ return ((...args: Parameters<T>) => {
60
+ console.log(`Calling ${fn.name}`, args)
61
+ return fn(...args)
62
+ }) as T
63
+ }
64
+
65
+ // React HOC
66
+ const withAuth = (Component: FC) => (props: any) => {
67
+ const { user } = useAuth()
68
+ if (!user) return <Redirect to="/login" />
69
+ return <Component {...props} user={user} />
70
+ }
71
+ ```
72
+
73
+ ### 组合模式 (Composite)
74
+
75
+ ```typescript
76
+ // DO: 统一接口处理树形结构
77
+ interface MenuItem {
78
+ render(): string
79
+ getPermissions(): string[]
80
+ }
81
+ class MenuGroup implements MenuItem {
82
+ constructor(private children: MenuItem[]) {}
83
+ render() { return this.children.map(c => c.render()).join('\n') }
84
+ getPermissions() { return this.children.flatMap(c => c.getPermissions()) }
85
+ }
86
+ ```
87
+
88
+ ### 门面模式 (Facade)
89
+
90
+ ```typescript
91
+ // DO: 简化复杂子系统交互
92
+ class OrderFacade {
93
+ async placeOrder(dto: CreateOrderDto) {
94
+ const inventory = await this.inventoryService.check(dto.items)
95
+ const payment = await this.paymentService.charge(dto.payment)
96
+ const order = await this.orderService.create(dto, payment.id)
97
+ await this.notificationService.sendConfirmation(order)
98
+ return order
99
+ }
100
+ }
101
+ ```
102
+
103
+ ### 适配器 (Adapter) & 代理 (Proxy)
104
+
105
+ ```typescript
106
+ // 适配器: 统一不同三方接口
107
+ interface StorageAdapter {
108
+ upload(file: Buffer, key: string): Promise<string>
109
+ }
110
+ class S3Adapter implements StorageAdapter { ... }
111
+ class OSSAdapter implements StorageAdapter { ... }
112
+
113
+ // 代理: 控制访问(缓存/延迟/权限)
114
+ class CachedUserService implements UserService {
115
+ constructor(private real: UserService, private cache: Cache) {}
116
+ async getById(id: string) {
117
+ return this.cache.get(id) ?? this.cache.set(id, await this.real.getById(id))
118
+ }
119
+ }
120
+ ```
121
+
122
+ ## 行为型
123
+
124
+ ### 策略模式 (Strategy)
125
+
126
+ ```typescript
127
+ // DO: 算法家族可互换
128
+ interface PaymentStrategy {
129
+ pay(amount: number): Promise<PaymentResult>
130
+ }
131
+ class AlipayStrategy implements PaymentStrategy { ... }
132
+ class WechatPayStrategy implements PaymentStrategy { ... }
133
+
134
+ // 运行时选择
135
+ const strategy = paymentStrategies.get(order.paymentMethod)
136
+ await strategy.pay(order.totalAmount)
137
+ ```
138
+
139
+ ### 观察者 / Event Bus
140
+
141
+ ```typescript
142
+ // DO: 事件驱动解耦
143
+ orderService.on('orderCreated', (order) => {
144
+ inventoryService.decrease(order.items)
145
+ notificationService.notify(order.userId)
146
+ })
147
+
148
+ // DON'T: 创建订单函数里直接调用库存和通知
149
+ function createOrder() {
150
+ // ...创建订单...
151
+ inventoryService.decrease(items) // 紧耦合
152
+ notificationService.notify(userId) // 紧耦合
153
+ }
154
+ ```
155
+
156
+ ### 状态机 (State Machine)
157
+
158
+ ```typescript
159
+ // DO: 状态+转换规则明确、可预测
160
+ const orderFSM = {
161
+ initial: 'draft',
162
+ states: {
163
+ draft: { on: { SUBMIT: 'pending' } },
164
+ pending: { on: { APPROVE: 'confirmed', REJECT: 'draft' } },
165
+ confirmed: { on: { SHIP: 'shipped', CANCEL: 'cancelled' } },
166
+ shipped: { on: { DELIVER: 'completed' } },
167
+ completed: { type: 'final' },
168
+ cancelled: { type: 'final' },
169
+ }
170
+ }
171
+ ```
172
+
173
+ ### 命令模式 (Command)
174
+
175
+ ```typescript
176
+ // DO: 操作对象化,支持撤销/重做/队列
177
+ interface Command { execute(): void; undo(): void }
178
+ class MoveCommand implements Command {
179
+ constructor(private element: Element, private dx: number, private dy: number) {}
180
+ execute() { this.element.move(this.dx, this.dy) }
181
+ undo() { this.element.move(-this.dx, -this.dy) }
182
+ }
183
+ ```
184
+
185
+ ### 责任链 (Chain of Responsibility)
186
+
187
+ ```typescript
188
+ // DO: 请求沿链条传递直到被处理
189
+ abstract class Handler<T> {
190
+ private next?: Handler<T>
191
+ setNext(handler: Handler<T>) { this.next = handler; return handler }
192
+ handle(request: T): T {
193
+ if (this.canHandle(request)) return this.process(request)
194
+ if (this.next) return this.next.handle(request)
195
+ return request
196
+ }
197
+ abstract canHandle(request: T): boolean
198
+ abstract process(request: T): T
199
+ }
200
+ ```
@@ -0,0 +1,67 @@
1
+ # 跨域模式
2
+
3
+ 前后端都会遇到的通用场景。
4
+
5
+ ## 选型速查
6
+
7
+ | 场景 | 推荐方案 | 要点 |
8
+ |------|---------|------|
9
+ | 插件系统 | 注册 + 生命周期钩子 | 第三方需扩展行为时使用 |
10
+ | 重试与容错 | 指数退避 + 熔断器 | `delay = base * 2^attempt`,最大 3-5 次 |
11
+ | 缓存策略 | Cache-aside / Write-through | 读多写少用 Cache-aside |
12
+ | 日志与可观测 | 结构化日志 + 链路追踪 | 生产环境必须有 |
13
+ | 依赖注入 | 构造函数注入 / DI 容器 | 需可测试性的场景 |
14
+ | 并发控制 | 锁 / 信号量 / 队列 | 识别临界资源再选方案 |
15
+
16
+ ## 指数退避重试
17
+
18
+ ```typescript
19
+ async function withRetry<T>(fn: () => Promise<T>, maxRetries = 3): Promise<T> {
20
+ for (let i = 0; i <= maxRetries; i++) {
21
+ try { return await fn() }
22
+ catch (e) {
23
+ if (i === maxRetries) throw e
24
+ await sleep(Math.min(1000 * Math.pow(2, i), 30000))
25
+ }
26
+ }
27
+ throw new Error('unreachable')
28
+ }
29
+ ```
30
+
31
+ ## 插件系统
32
+
33
+ ```typescript
34
+ interface Plugin {
35
+ name: string
36
+ install(app: App): void
37
+ destroy?(): void
38
+ }
39
+
40
+ class PluginManager {
41
+ private plugins: Plugin[] = []
42
+
43
+ register(plugin: Plugin) {
44
+ plugin.install(this.app)
45
+ this.plugins.push(plugin)
46
+ }
47
+
48
+ destroyAll() {
49
+ this.plugins.reverse().forEach(p => p.destroy?.())
50
+ }
51
+ }
52
+ ```
53
+
54
+ ## 结构化日志
55
+
56
+ ```typescript
57
+ // DO: 结构化字段,便于检索
58
+ logger.info('Order created', {
59
+ orderId: order.id,
60
+ userId: order.userId,
61
+ total: order.total,
62
+ traceId: ctx.traceId,
63
+ })
64
+
65
+ // DON'T: 拼接字符串
66
+ logger.info(`Order ${order.id} created by ${order.userId} total ${order.total}`)
67
+ ```
@@ -0,0 +1,27 @@
1
+ # 前端特定模式
2
+
3
+ ## React
4
+
5
+ | 场景 | 推荐 | 避免 |
6
+ |------|------|------|
7
+ | 跨组件状态 | Context + useReducer / Zustand | props drilling > 3 层 |
8
+ | 逻辑复用 | Custom Hooks | HOC 链 / render props 嵌套 |
9
+ | 异步数据 | React Query / SWR | 手写 loading/error/data |
10
+ | 复杂表单 | react-hook-form / FSM | 散落 useState |
11
+ | 大列表 | 虚拟化 (react-window) | 全量渲染 |
12
+ | 跨页通信 | URL 状态 / 路由参数 | 全局 store 存页面状态 |
13
+
14
+ ## Vue
15
+
16
+ | 场景 | 推荐 | 避免 |
17
+ |------|------|------|
18
+ | 逻辑复用 | Composables | Mixins |
19
+ | 跨组件状态 | Pinia | Vuex(已过时) |
20
+ | 响应式转换 | computed / watchEffect | 能推导的存 state |
21
+ | 组件通信 | props + emit / provide-inject | 超 2 层用 provide-inject |
22
+
23
+ ## 通用前端
24
+
25
+ - **样式组织**: CSS Modules / SCSS + BEM / Tailwind — 按团队统一
26
+ - **路由**: 按功能域分组,懒加载路由组件
27
+ - **错误边界**: React ErrorBoundary / Vue onErrorCaptured