contextos-agents 1.5.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.
- package/.agents/AGENTS.md +421 -0
- package/.agents/adapters/aider/export.js +137 -0
- package/.agents/adapters/claude/export.js +55 -0
- package/.agents/adapters/copilot/export.js +107 -0
- package/.agents/adapters/cursor/export.js +210 -0
- package/.agents/adapters/gemini/export.js +115 -0
- package/.agents/adapters/shared.js +119 -0
- package/.agents/adapters/zed/export.js +111 -0
- package/.agents/core/profiles/backend.yaml +47 -0
- package/.agents/core/profiles/enterprise.yaml +46 -0
- package/.agents/core/profiles/frontend.yaml +46 -0
- package/.agents/core/profiles/hackathon.yaml +45 -0
- package/.agents/core/profiles/mvp.yaml +43 -0
- package/.agents/core/profiles/startup.yaml +48 -0
- package/.agents/core/skills/adapters/EXAMPLES.md +19 -0
- package/.agents/core/skills/adapters/SKILL.md +105 -0
- package/.agents/core/skills/adapters/TROUBLESHOOTING.md +7 -0
- package/.agents/core/skills/adapters/VALIDATION.json +12 -0
- package/.agents/core/skills/adapters/skill.yaml +10 -0
- package/.agents/core/skills/architecture-diagrams/SKILL.md +108 -0
- package/.agents/core/skills/architecture-diagrams/VALIDATION.json +12 -0
- package/.agents/core/skills/architecture-diagrams/skill.yaml +8 -0
- package/.agents/core/skills/brutalist-design/SKILL.md +150 -0
- package/.agents/core/skills/brutalist-design/VALIDATION.json +12 -0
- package/.agents/core/skills/brutalist-design/skill.yaml +8 -0
- package/.agents/core/skills/context-manager/EXAMPLES.md +19 -0
- package/.agents/core/skills/context-manager/SKILL.md +126 -0
- package/.agents/core/skills/context-manager/TROUBLESHOOTING.md +7 -0
- package/.agents/core/skills/context-manager/VALIDATION.json +12 -0
- package/.agents/core/skills/context-manager/skill.yaml +10 -0
- package/.agents/core/skills/context-os/EXAMPLES.md +21 -0
- package/.agents/core/skills/context-os/SKILL.md +169 -0
- package/.agents/core/skills/context-os/TROUBLESHOOTING.md +7 -0
- package/.agents/core/skills/context-os/VALIDATION.json +12 -0
- package/.agents/core/skills/context-os/packs.yaml +59 -0
- package/.agents/core/skills/context-os/references/context-rules.md +68 -0
- package/.agents/core/skills/context-os/references/pipeline.md +119 -0
- package/.agents/core/skills/context-os/references/project-graph.md +103 -0
- package/.agents/core/skills/context-os/rules.yaml +135 -0
- package/.agents/core/skills/context-os/skill.yaml +10 -0
- package/.agents/core/skills/database/EXAMPLES.md +74 -0
- package/.agents/core/skills/database/SKILL.md +101 -0
- package/.agents/core/skills/database/TROUBLESHOOTING.md +18 -0
- package/.agents/core/skills/database/VALIDATION.json +11 -0
- package/.agents/core/skills/database/skill.yaml +25 -0
- package/.agents/core/skills/ddd/EXAMPLES.md +42 -0
- package/.agents/core/skills/ddd/SKILL.md +247 -0
- package/.agents/core/skills/ddd/TROUBLESHOOTING.md +19 -0
- package/.agents/core/skills/ddd/VALIDATION.json +12 -0
- package/.agents/core/skills/ddd/ddd.md +178 -0
- package/.agents/core/skills/ddd/skill.yaml +10 -0
- package/.agents/core/skills/decisions/EXAMPLES.md +35 -0
- package/.agents/core/skills/decisions/SKILL.md +90 -0
- package/.agents/core/skills/decisions/TROUBLESHOOTING.md +13 -0
- package/.agents/core/skills/decisions/VALIDATION.json +12 -0
- package/.agents/core/skills/decisions/skill.yaml +10 -0
- package/.agents/core/skills/docker/EXAMPLES.md +56 -0
- package/.agents/core/skills/docker/SKILL.md +63 -0
- package/.agents/core/skills/docker/TROUBLESHOOTING.md +18 -0
- package/.agents/core/skills/docker/VALIDATION.json +11 -0
- package/.agents/core/skills/docker/skill.yaml +23 -0
- package/.agents/core/skills/engineering-workflow/EXAMPLES.md +57 -0
- package/.agents/core/skills/engineering-workflow/SKILL.md +343 -0
- package/.agents/core/skills/engineering-workflow/TROUBLESHOOTING.md +19 -0
- package/.agents/core/skills/engineering-workflow/VALIDATION.json +12 -0
- package/.agents/core/skills/engineering-workflow/skill.yaml +13 -0
- package/.agents/core/skills/fastapi/EXAMPLES.md +36 -0
- package/.agents/core/skills/fastapi/SKILL.md +148 -0
- package/.agents/core/skills/fastapi/TROUBLESHOOTING.md +19 -0
- package/.agents/core/skills/fastapi/VALIDATION.json +12 -0
- package/.agents/core/skills/fastapi/fastapi.md +112 -0
- package/.agents/core/skills/fastapi/skill.yaml +10 -0
- package/.agents/core/skills/gemini-precision/SKILL.md +169 -0
- package/.agents/core/skills/gemini-precision/VALIDATION.json +12 -0
- package/.agents/core/skills/gemini-precision/skill.yaml +9 -0
- package/.agents/core/skills/generators/EXAMPLES.md +19 -0
- package/.agents/core/skills/generators/SKILL.md +112 -0
- package/.agents/core/skills/generators/TROUBLESHOOTING.md +7 -0
- package/.agents/core/skills/generators/VALIDATION.json +12 -0
- package/.agents/core/skills/generators/skill.yaml +10 -0
- package/.agents/core/skills/generators/templates/API.md +77 -0
- package/.agents/core/skills/generators/templates/ARCHITECTURE.md +70 -0
- package/.agents/core/skills/generators/templates/DATABASE.md +42 -0
- package/.agents/core/skills/generators/templates/DECISION.md +46 -0
- package/.agents/core/skills/generators/templates/PRD.md +67 -0
- package/.agents/core/skills/generators/templates/PROJECT_GRAPH.md +56 -0
- package/.agents/core/skills/generators/templates/ROADMAP.md +51 -0
- package/.agents/core/skills/generators/templates/TASKS.md +43 -0
- package/.agents/core/skills/generators/templates/UI.md +73 -0
- package/.agents/core/skills/graphify/EXAMPLES.md +73 -0
- package/.agents/core/skills/graphify/SKILL.md +130 -0
- package/.agents/core/skills/graphify/VALIDATION.json +12 -0
- package/.agents/core/skills/graphify/skill.yaml +13 -0
- package/.agents/core/skills/gstack-roles/EXAMPLES.md +23 -0
- package/.agents/core/skills/gstack-roles/SKILL.md +152 -0
- package/.agents/core/skills/gstack-roles/TROUBLESHOOTING.md +13 -0
- package/.agents/core/skills/gstack-roles/VALIDATION.json +12 -0
- package/.agents/core/skills/gstack-roles/skill.yaml +12 -0
- package/.agents/core/skills/impeccable-design/EXAMPLES.md +26 -0
- package/.agents/core/skills/impeccable-design/SKILL.md +201 -0
- package/.agents/core/skills/impeccable-design/TROUBLESHOOTING.md +19 -0
- package/.agents/core/skills/impeccable-design/VALIDATION.json +12 -0
- package/.agents/core/skills/impeccable-design/skill.yaml +14 -0
- package/.agents/core/skills/interview-me/SKILL.md +97 -0
- package/.agents/core/skills/interview-me/VALIDATION.json +12 -0
- package/.agents/core/skills/interview-me/skill.yaml +8 -0
- package/.agents/core/skills/microservices/EXAMPLES.md +38 -0
- package/.agents/core/skills/microservices/SKILL.md +164 -0
- package/.agents/core/skills/microservices/TROUBLESHOOTING.md +19 -0
- package/.agents/core/skills/microservices/VALIDATION.json +12 -0
- package/.agents/core/skills/microservices/microservices.md +119 -0
- package/.agents/core/skills/microservices/skill.yaml +10 -0
- package/.agents/core/skills/minimalist-design/SKILL.md +113 -0
- package/.agents/core/skills/minimalist-design/VALIDATION.json +12 -0
- package/.agents/core/skills/minimalist-design/skill.yaml +8 -0
- package/.agents/core/skills/nestjs/EXAMPLES.md +40 -0
- package/.agents/core/skills/nestjs/SKILL.md +139 -0
- package/.agents/core/skills/nestjs/TROUBLESHOOTING.md +19 -0
- package/.agents/core/skills/nestjs/VALIDATION.json +12 -0
- package/.agents/core/skills/nestjs/nestjs.md +103 -0
- package/.agents/core/skills/nestjs/skill.yaml +10 -0
- package/.agents/core/skills/nextjs/EXAMPLES.md +40 -0
- package/.agents/core/skills/nextjs/SKILL.md +163 -0
- package/.agents/core/skills/nextjs/TROUBLESHOOTING.md +19 -0
- package/.agents/core/skills/nextjs/VALIDATION.json +12 -0
- package/.agents/core/skills/nextjs/nextjs.md +67 -0
- package/.agents/core/skills/nextjs/skill.yaml +10 -0
- package/.agents/core/skills/node/EXAMPLES.md +80 -0
- package/.agents/core/skills/node/SKILL.md +128 -0
- package/.agents/core/skills/node/TROUBLESHOOTING.md +19 -0
- package/.agents/core/skills/node/VALIDATION.json +12 -0
- package/.agents/core/skills/node/node.md +87 -0
- package/.agents/core/skills/node/skill.yaml +10 -0
- package/.agents/core/skills/performance/EXAMPLES.md +30 -0
- package/.agents/core/skills/performance/SKILL.md +75 -0
- package/.agents/core/skills/performance/TROUBLESHOOTING.md +19 -0
- package/.agents/core/skills/performance/VALIDATION.json +12 -0
- package/.agents/core/skills/performance/performance.md +52 -0
- package/.agents/core/skills/performance/skill.yaml +10 -0
- package/.agents/core/skills/ponytail-mindset/EXAMPLES.md +45 -0
- package/.agents/core/skills/ponytail-mindset/SKILL.md +193 -0
- package/.agents/core/skills/ponytail-mindset/TROUBLESHOOTING.md +19 -0
- package/.agents/core/skills/ponytail-mindset/VALIDATION.json +12 -0
- package/.agents/core/skills/ponytail-mindset/skill.yaml +14 -0
- package/.agents/core/skills/react/EXAMPLES.md +79 -0
- package/.agents/core/skills/react/SKILL.md +132 -0
- package/.agents/core/skills/react/TROUBLESHOOTING.md +19 -0
- package/.agents/core/skills/react/VALIDATION.json +12 -0
- package/.agents/core/skills/react/react.md +93 -0
- package/.agents/core/skills/react/skill.yaml +10 -0
- package/.agents/core/skills/react-best-practices/SKILL.md +155 -0
- package/.agents/core/skills/react-best-practices/VALIDATION.json +12 -0
- package/.agents/core/skills/react-best-practices/skill.yaml +10 -0
- package/.agents/core/skills/redesign-audit/SKILL.md +117 -0
- package/.agents/core/skills/redesign-audit/VALIDATION.json +12 -0
- package/.agents/core/skills/redesign-audit/skill.yaml +8 -0
- package/.agents/core/skills/security/EXAMPLES.md +64 -0
- package/.agents/core/skills/security/SKILL.md +158 -0
- package/.agents/core/skills/security/TROUBLESHOOTING.md +19 -0
- package/.agents/core/skills/security/VALIDATION.json +12 -0
- package/.agents/core/skills/security/security.md +106 -0
- package/.agents/core/skills/security/skill.yaml +10 -0
- package/.agents/core/skills/soft-design/SKILL.md +108 -0
- package/.agents/core/skills/soft-design/VALIDATION.json +12 -0
- package/.agents/core/skills/soft-design/skill.yaml +8 -0
- package/.agents/core/skills/state-management/EXAMPLES.md +56 -0
- package/.agents/core/skills/state-management/SKILL.md +48 -0
- package/.agents/core/skills/state-management/TROUBLESHOOTING.md +18 -0
- package/.agents/core/skills/state-management/VALIDATION.json +11 -0
- package/.agents/core/skills/state-management/skill.yaml +22 -0
- package/.agents/core/skills/subagent-orchestrator/SKILL.md +100 -0
- package/.agents/core/skills/subagent-orchestrator/VALIDATION.json +12 -0
- package/.agents/core/skills/subagent-orchestrator/skill.yaml +8 -0
- package/.agents/core/skills/system-design/EXAMPLES.md +75 -0
- package/.agents/core/skills/system-design/SKILL.md +419 -0
- package/.agents/core/skills/system-design/TROUBLESHOOTING.md +19 -0
- package/.agents/core/skills/system-design/VALIDATION.json +12 -0
- package/.agents/core/skills/system-design/skill.yaml +13 -0
- package/.agents/core/skills/system-design/system-design.md +112 -0
- package/.agents/core/skills/testing/EXAMPLES.md +71 -0
- package/.agents/core/skills/testing/SKILL.md +70 -0
- package/.agents/core/skills/testing/TROUBLESHOOTING.md +18 -0
- package/.agents/core/skills/testing/VALIDATION.json +11 -0
- package/.agents/core/skills/testing/skill.yaml +26 -0
- package/.agents/core/skills/typescript/EXAMPLES.md +64 -0
- package/.agents/core/skills/typescript/SKILL.md +112 -0
- package/.agents/core/skills/typescript/TROUBLESHOOTING.md +19 -0
- package/.agents/core/skills/typescript/VALIDATION.json +12 -0
- package/.agents/core/skills/typescript/skill.yaml +10 -0
- package/.agents/core/skills/typescript/typescript.md +71 -0
- package/.agents/core/skills/ui-design/EXAMPLES.md +21 -0
- package/.agents/core/skills/ui-design/SKILL.md +124 -0
- package/.agents/core/skills/ui-design/TROUBLESHOOTING.md +19 -0
- package/.agents/core/skills/ui-design/VALIDATION.json +12 -0
- package/.agents/core/skills/ui-design/skill.yaml +10 -0
- package/.agents/core/skills/ui-design/ui.md +88 -0
- package/.agents/core/skills/ui-ux-pro/EXAMPLES.md +62 -0
- package/.agents/core/skills/ui-ux-pro/SKILL.md +375 -0
- package/.agents/core/skills/ui-ux-pro/TROUBLESHOOTING.md +19 -0
- package/.agents/core/skills/ui-ux-pro/VALIDATION.json +12 -0
- package/.agents/core/skills/ui-ux-pro/skill.yaml +13 -0
- package/.agents/core/skills/ux-design/EXAMPLES.md +36 -0
- package/.agents/core/skills/ux-design/SKILL.md +116 -0
- package/.agents/core/skills/ux-design/TROUBLESHOOTING.md +19 -0
- package/.agents/core/skills/ux-design/VALIDATION.json +12 -0
- package/.agents/core/skills/ux-design/skill.yaml +10 -0
- package/.agents/core/skills/ux-design/ux.md +80 -0
- package/.agents/core/skills/vercel-optimize/SKILL.md +83 -0
- package/.agents/core/skills/vercel-optimize/VALIDATION.json +12 -0
- package/.agents/core/skills/vercel-optimize/skill.yaml +10 -0
- package/.agents/core/skills/web-accessibility/EXAMPLES.md +39 -0
- package/.agents/core/skills/web-accessibility/SKILL.md +170 -0
- package/.agents/core/skills/web-accessibility/TROUBLESHOOTING.md +19 -0
- package/.agents/core/skills/web-accessibility/VALIDATION.json +12 -0
- package/.agents/core/skills/web-accessibility/accessibility.md +63 -0
- package/.agents/core/skills/web-accessibility/skill.yaml +10 -0
- package/.agents/ctx.js +370 -0
- package/.agents/generated/claude/skills/adapters/SKILL.md +126 -0
- package/.agents/generated/claude/skills/architecture-diagrams/SKILL.md +101 -0
- package/.agents/generated/claude/skills/brutalist-design/SKILL.md +145 -0
- package/.agents/generated/claude/skills/context-manager/SKILL.md +147 -0
- package/.agents/generated/claude/skills/context-os/SKILL.md +191 -0
- package/.agents/generated/claude/skills/database/SKILL.md +191 -0
- package/.agents/generated/claude/skills/ddd/SKILL.md +305 -0
- package/.agents/generated/claude/skills/decisions/SKILL.md +134 -0
- package/.agents/generated/claude/skills/docker/SKILL.md +135 -0
- package/.agents/generated/claude/skills/engineering-workflow/SKILL.md +414 -0
- package/.agents/generated/claude/skills/fastapi/SKILL.md +200 -0
- package/.agents/generated/claude/skills/gemini-precision/SKILL.md +161 -0
- package/.agents/generated/claude/skills/generators/SKILL.md +133 -0
- package/.agents/generated/claude/skills/graphify/SKILL.md +198 -0
- package/.agents/generated/claude/skills/gstack-roles/SKILL.md +184 -0
- package/.agents/generated/claude/skills/impeccable-design/SKILL.md +241 -0
- package/.agents/generated/claude/skills/interview-me/SKILL.md +90 -0
- package/.agents/generated/claude/skills/microservices/SKILL.md +218 -0
- package/.agents/generated/claude/skills/minimalist-design/SKILL.md +108 -0
- package/.agents/generated/claude/skills/nestjs/SKILL.md +195 -0
- package/.agents/generated/claude/skills/nextjs/SKILL.md +219 -0
- package/.agents/generated/claude/skills/node/SKILL.md +224 -0
- package/.agents/generated/claude/skills/performance/SKILL.md +121 -0
- package/.agents/generated/claude/skills/ponytail-mindset/SKILL.md +252 -0
- package/.agents/generated/claude/skills/react/SKILL.md +227 -0
- package/.agents/generated/claude/skills/react-best-practices/SKILL.md +146 -0
- package/.agents/generated/claude/skills/redesign-audit/SKILL.md +112 -0
- package/.agents/generated/claude/skills/security/SKILL.md +237 -0
- package/.agents/generated/claude/skills/soft-design/SKILL.md +103 -0
- package/.agents/generated/claude/skills/state-management/SKILL.md +120 -0
- package/.agents/generated/claude/skills/subagent-orchestrator/SKILL.md +93 -0
- package/.agents/generated/claude/skills/system-design/SKILL.md +507 -0
- package/.agents/generated/claude/skills/testing/SKILL.md +157 -0
- package/.agents/generated/claude/skills/typescript/SKILL.md +192 -0
- package/.agents/generated/claude/skills/ui-design/SKILL.md +161 -0
- package/.agents/generated/claude/skills/ui-ux-pro/SKILL.md +451 -0
- package/.agents/generated/claude/skills/ux-design/SKILL.md +168 -0
- package/.agents/generated/claude/skills/vercel-optimize/SKILL.md +76 -0
- package/.agents/generated/claude/skills/web-accessibility/SKILL.md +225 -0
- package/.agents/generated/gemini/skills/adapters/SKILL.md +135 -0
- package/.agents/generated/gemini/skills/architecture-diagrams/SKILL.md +107 -0
- package/.agents/generated/gemini/skills/brutalist-design/SKILL.md +151 -0
- package/.agents/generated/gemini/skills/context-manager/SKILL.md +156 -0
- package/.agents/generated/gemini/skills/context-os/SKILL.md +200 -0
- package/.agents/generated/gemini/skills/database/SKILL.md +200 -0
- package/.agents/generated/gemini/skills/ddd/SKILL.md +314 -0
- package/.agents/generated/gemini/skills/decisions/SKILL.md +143 -0
- package/.agents/generated/gemini/skills/docker/SKILL.md +144 -0
- package/.agents/generated/gemini/skills/engineering-workflow/SKILL.md +423 -0
- package/.agents/generated/gemini/skills/fastapi/SKILL.md +209 -0
- package/.agents/generated/gemini/skills/gemini-precision/SKILL.md +167 -0
- package/.agents/generated/gemini/skills/generators/SKILL.md +142 -0
- package/.agents/generated/gemini/skills/graphify/SKILL.md +205 -0
- package/.agents/generated/gemini/skills/gstack-roles/SKILL.md +193 -0
- package/.agents/generated/gemini/skills/impeccable-design/SKILL.md +250 -0
- package/.agents/generated/gemini/skills/interview-me/SKILL.md +96 -0
- package/.agents/generated/gemini/skills/microservices/SKILL.md +227 -0
- package/.agents/generated/gemini/skills/minimalist-design/SKILL.md +114 -0
- package/.agents/generated/gemini/skills/nestjs/SKILL.md +204 -0
- package/.agents/generated/gemini/skills/nextjs/SKILL.md +298 -0
- package/.agents/generated/gemini/skills/node/SKILL.md +323 -0
- package/.agents/generated/gemini/skills/performance/SKILL.md +185 -0
- package/.agents/generated/gemini/skills/ponytail-mindset/SKILL.md +261 -0
- package/.agents/generated/gemini/skills/react/SKILL.md +332 -0
- package/.agents/generated/gemini/skills/react-best-practices/SKILL.md +152 -0
- package/.agents/generated/gemini/skills/redesign-audit/SKILL.md +118 -0
- package/.agents/generated/gemini/skills/security/SKILL.md +355 -0
- package/.agents/generated/gemini/skills/soft-design/SKILL.md +109 -0
- package/.agents/generated/gemini/skills/state-management/SKILL.md +129 -0
- package/.agents/generated/gemini/skills/subagent-orchestrator/SKILL.md +99 -0
- package/.agents/generated/gemini/skills/system-design/SKILL.md +631 -0
- package/.agents/generated/gemini/skills/testing/SKILL.md +166 -0
- package/.agents/generated/gemini/skills/typescript/SKILL.md +275 -0
- package/.agents/generated/gemini/skills/ui-design/SKILL.md +170 -0
- package/.agents/generated/gemini/skills/ui-ux-pro/SKILL.md +460 -0
- package/.agents/generated/gemini/skills/ux-design/SKILL.md +177 -0
- package/.agents/generated/gemini/skills/vercel-optimize/SKILL.md +82 -0
- package/.agents/generated/gemini/skills/web-accessibility/SKILL.md +300 -0
- package/.agents/mcp/runtime.py +454 -0
- package/.agents/mcp/server.mjs +189373 -0
- package/.agents/plugins.js +574 -0
- package/.agents/profiles.js +267 -0
- package/.agents/resolver.js +336 -0
- package/.agents/skills-index.json +200 -0
- package/.agents/skills.json +6 -0
- package/.agents/validate.js +500 -0
- package/LICENSE +21 -0
- package/README.md +415 -0
- package/benchmarks/gemini-issues.js +533 -0
- package/bin/index.js +458 -0
- package/package.json +70 -0
- package/registry.json +53 -0
- package/registry.schema.json +32 -0
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# ddd Examples — Anti-patterns vs ContextOS Standard
|
|
2
|
+
|
|
3
|
+
## Example 1: Domain Entities vs Anemic Models
|
|
4
|
+
|
|
5
|
+
### Anti-pattern: Anemic Domain Model with Leaky Setters
|
|
6
|
+
|
|
7
|
+
```typescript
|
|
8
|
+
// BAD: Zero business invariants; any caller can corrupt state
|
|
9
|
+
class BankAccount {
|
|
10
|
+
public balance: number = 0;
|
|
11
|
+
public isFrozen: boolean = false;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
// Logic leaked into controller or service
|
|
15
|
+
account.balance -= 500; // Overdraft not checked!
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
### Best practice: ContextOS Standard (Rich Domain Model with Guarded Invariants)
|
|
19
|
+
|
|
20
|
+
```typescript
|
|
21
|
+
// GOOD: Invariants strictly enforced inside Aggregate Root
|
|
22
|
+
class BankAccount {
|
|
23
|
+
private _balance: number;
|
|
24
|
+
private _isFrozen: boolean;
|
|
25
|
+
|
|
26
|
+
constructor(id: string, initialDeposit: Money) {
|
|
27
|
+
this._balance = initialDeposit.amount;
|
|
28
|
+
this._isFrozen = false;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
public withdraw(amount: Money): void {
|
|
32
|
+
if (this._isFrozen) {
|
|
33
|
+
throw new AccountFrozenException('Cannot withdraw from a frozen account');
|
|
34
|
+
}
|
|
35
|
+
if (this._balance < amount.amount) {
|
|
36
|
+
throw new InsufficientFundsException('Insufficient funds for withdrawal');
|
|
37
|
+
}
|
|
38
|
+
this._balance -= amount.amount;
|
|
39
|
+
this.addDomainEvent(new MoneyWithdrawnEvent(this.id, amount));
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
```
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Domain-Driven Design
|
|
3
|
+
description: >
|
|
4
|
+
ContextOS skill for Domain-Driven Design
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Domain-Driven Design
|
|
8
|
+
|
|
9
|
+
## Overview
|
|
10
|
+
|
|
11
|
+
Domain-Driven Design standard for robust business software. Enforces separation between domain logic (Entities, Value Objects, Aggregates, Domain Events) and infrastructure frameworks, preventing leaky abstractions.
|
|
12
|
+
|
|
13
|
+
## When to Use
|
|
14
|
+
|
|
15
|
+
Activate when designing core business domain models, transactional consistency boundaries, enterprise APIs, or complex aggregate hierarchies.
|
|
16
|
+
|
|
17
|
+
## Rules & Patterns
|
|
18
|
+
<!-- Source: ddd.md -->
|
|
19
|
+
|
|
20
|
+
## Domain-Driven Design — Patterns & Practices
|
|
21
|
+
|
|
22
|
+
## When to Use DDD
|
|
23
|
+
|
|
24
|
+
**Use when:**
|
|
25
|
+
|
|
26
|
+
- Complex business logic that goes beyond CRUD
|
|
27
|
+
- Multiple domain experts with different vocabularies
|
|
28
|
+
- The domain model is the competitive advantage
|
|
29
|
+
- Enterprise-grade applications
|
|
30
|
+
|
|
31
|
+
**Don't use when:**
|
|
32
|
+
|
|
33
|
+
- Simple CRUD applications
|
|
34
|
+
- Hackathon/MVP (overkill)
|
|
35
|
+
- No domain expert available
|
|
36
|
+
|
|
37
|
+
## Strategic Design
|
|
38
|
+
|
|
39
|
+
### Bounded Contexts
|
|
40
|
+
|
|
41
|
+
The single most important DDD concept. A Bounded Context is a boundary within which a particular model is defined and applicable.
|
|
42
|
+
|
|
43
|
+
**Example — E-Commerce:**
|
|
44
|
+
|
|
45
|
+
```
|
|
46
|
+
[Order Context] [Payment Context] [Shipping Context]
|
|
47
|
+
- Order - Payment - Shipment
|
|
48
|
+
- OrderItem - Transaction - TrackingNumber
|
|
49
|
+
- Customer (ref) - Refund - Address
|
|
50
|
+
- Address (value) - Invoice - Carrier
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
`Customer` means different things in each context:
|
|
54
|
+
|
|
55
|
+
- Order Context: name, email, shipping preference
|
|
56
|
+
- Payment Context: billing info, payment methods
|
|
57
|
+
- Support Context: ticket history, satisfaction score
|
|
58
|
+
|
|
59
|
+
### Context Map
|
|
60
|
+
|
|
61
|
+
```
|
|
62
|
+
[Order] ←→ [Payment] # Partnership
|
|
63
|
+
[Order] → [Shipping] # Customer-Supplier
|
|
64
|
+
[Order] → [Legacy CRM] # Anti-Corruption Layer
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Tactical Design
|
|
68
|
+
|
|
69
|
+
### Entities
|
|
70
|
+
|
|
71
|
+
Objects with identity. Two entities with the same attributes but different IDs are different.
|
|
72
|
+
|
|
73
|
+
```typescript
|
|
74
|
+
class User {
|
|
75
|
+
readonly id: UserId;
|
|
76
|
+
name: string;
|
|
77
|
+
email: Email; // Value Object
|
|
78
|
+
}
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### Value Objects
|
|
82
|
+
|
|
83
|
+
Objects defined by their attributes, not identity. Immutable.
|
|
84
|
+
|
|
85
|
+
```typescript
|
|
86
|
+
class Email {
|
|
87
|
+
constructor(readonly value: string) {
|
|
88
|
+
if (!isValidEmail(value)) throw new InvalidEmailError(value);
|
|
89
|
+
}
|
|
90
|
+
equals(other: Email): boolean {
|
|
91
|
+
return this.value === other.value;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### Aggregates
|
|
97
|
+
|
|
98
|
+
A cluster of entities and value objects with a single root entity (Aggregate Root). All access goes through the root.
|
|
99
|
+
|
|
100
|
+
```typescript
|
|
101
|
+
class Order { // Aggregate Root
|
|
102
|
+
private items: OrderItem[] = [];
|
|
103
|
+
|
|
104
|
+
addItem(product: ProductRef, quantity: number): void {
|
|
105
|
+
// Business logic HERE, not in a service
|
|
106
|
+
if (quantity <= 0) throw new InvalidQuantityError();
|
|
107
|
+
this.items.push(new OrderItem(product, quantity));
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
get total(): Money {
|
|
111
|
+
return this.items.reduce((sum, item) => sum.add(item.subtotal), Money.zero());
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
**Aggregate Rules:**
|
|
117
|
+
|
|
118
|
+
1. Reference other aggregates by ID only
|
|
119
|
+
2. One aggregate per transaction
|
|
120
|
+
3. Eventual consistency between aggregates
|
|
121
|
+
|
|
122
|
+
### Domain Events
|
|
123
|
+
|
|
124
|
+
Something that happened in the domain that domain experts care about.
|
|
125
|
+
|
|
126
|
+
```typescript
|
|
127
|
+
class OrderPlaced implements DomainEvent {
|
|
128
|
+
constructor(
|
|
129
|
+
readonly orderId: OrderId,
|
|
130
|
+
readonly customerId: CustomerId,
|
|
131
|
+
readonly total: Money,
|
|
132
|
+
readonly occurredAt: Date
|
|
133
|
+
) {}
|
|
134
|
+
}
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
### Domain Services
|
|
138
|
+
|
|
139
|
+
Business logic that doesn't naturally belong to an entity or value object.
|
|
140
|
+
|
|
141
|
+
```typescript
|
|
142
|
+
class PricingService {
|
|
143
|
+
calculatePrice(order: Order, customer: Customer, promotions: Promotion[]): Money {
|
|
144
|
+
// Complex pricing logic involving multiple aggregates
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
### Repositories
|
|
150
|
+
|
|
151
|
+
Abstraction over data access. One repository per aggregate root.
|
|
152
|
+
|
|
153
|
+
```typescript
|
|
154
|
+
interface OrderRepository {
|
|
155
|
+
findById(id: OrderId): Promise<Order | null>;
|
|
156
|
+
save(order: Order): Promise<void>;
|
|
157
|
+
delete(id: OrderId): Promise<void>;
|
|
158
|
+
}
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
## Directory Structure (DDD)
|
|
162
|
+
|
|
163
|
+
```
|
|
164
|
+
src/
|
|
165
|
+
├── modules/
|
|
166
|
+
│ └── orders/ # Bounded Context
|
|
167
|
+
│ ├── domain/
|
|
168
|
+
│ │ ├── entities/
|
|
169
|
+
│ │ │ └── order.ts # Aggregate Root
|
|
170
|
+
│ │ ├── value-objects/
|
|
171
|
+
│ │ │ └── money.ts
|
|
172
|
+
│ │ ├── events/
|
|
173
|
+
│ │ │ └── order-placed.ts
|
|
174
|
+
│ │ ├── services/
|
|
175
|
+
│ │ │ └── pricing.ts
|
|
176
|
+
│ │ └── repositories/
|
|
177
|
+
│ │ └── order.repository.ts # Interface
|
|
178
|
+
│ ├── application/
|
|
179
|
+
│ │ ├── commands/
|
|
180
|
+
│ │ │ └── place-order.ts
|
|
181
|
+
│ │ ├── queries/
|
|
182
|
+
│ │ │ └── get-order.ts
|
|
183
|
+
│ │ └── handlers/
|
|
184
|
+
│ │ └── place-order.handler.ts
|
|
185
|
+
│ └── infrastructure/
|
|
186
|
+
│ ├── persistence/
|
|
187
|
+
│ │ └── order.repository.impl.ts # Implementation
|
|
188
|
+
│ └── api/
|
|
189
|
+
│ └── orders.controller.ts
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
### The Clean Architecture Dependency Rule
|
|
193
|
+
|
|
194
|
+
In DDD, dependencies **MUST strictly point inward**:
|
|
195
|
+
|
|
196
|
+
```
|
|
197
|
+
[ Frameworks & Drivers (Web, DB, UI) ]
|
|
198
|
+
└──▶ [ Interface Adapters (Controllers, Gateways) ]
|
|
199
|
+
└──▶ [ Application (Use Cases, CQRS Handlers) ]
|
|
200
|
+
└──▶ [ Domain (Entities, Value Objects) ]
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
- The **Domain layer** has ZERO dependencies on ORMs (Prisma, TypeORM), HTTP frameworks (Express, NestJS), or external SDKs.
|
|
204
|
+
- Repositories are defined as interfaces in the domain/application layer and implemented in the infrastructure layer.
|
|
205
|
+
|
|
206
|
+
### Domain Events vs Integration Events
|
|
207
|
+
|
|
208
|
+
1. **Domain Events**: Represent state changes inside a single Bounded Context.
|
|
209
|
+
- Raised directly inside the Aggregate Root (`order.addItem(...)` raises `OrderItemAdded`).
|
|
210
|
+
- Dispatched in-process before transaction commit.
|
|
211
|
+
2. **Integration Events**: Published across Bounded Context boundaries to communicate with other services.
|
|
212
|
+
- Dispatched via Transactional Outbox pattern to message brokers.
|
|
213
|
+
- Must use backward-compatible schemas with versioning.
|
|
214
|
+
|
|
215
|
+
### Anti-Corruption Layer (ACL)
|
|
216
|
+
|
|
217
|
+
When consuming data from an external bounded context or 3rd-party vendor API (e.g. Stripe, Salesforce):
|
|
218
|
+
|
|
219
|
+
- NEVER import external domain models directly into your domain.
|
|
220
|
+
- Create an **ACL Translator / Adapter** in the infrastructure layer to convert external DTOs into your own Value Objects and Entities.
|
|
221
|
+
|
|
222
|
+
---
|
|
223
|
+
|
|
224
|
+
## Anti-Patterns
|
|
225
|
+
|
|
226
|
+
- [FAIL] Anemic domain model — entities with only getters/setters, all logic in services
|
|
227
|
+
- [FAIL] Big aggregate — aggregates should be small, focused on invariants
|
|
228
|
+
- [FAIL] Cross-aggregate transactions — use eventual consistency
|
|
229
|
+
- [FAIL] DDD everywhere — use DDD only where complexity justifies it
|
|
230
|
+
- [FAIL] ORM entities leaking into Domain — domain entities must not depend on `@Entity()` or ORM decorators
|
|
231
|
+
|
|
232
|
+
|
|
233
|
+
## Code Examples
|
|
234
|
+
|
|
235
|
+
See `EXAMPLES.md` for detailed code examples.
|
|
236
|
+
|
|
237
|
+
## Validation Checklist
|
|
238
|
+
|
|
239
|
+
What to verify during the review phase before completing the task.
|
|
240
|
+
|
|
241
|
+
## Common Mistakes
|
|
242
|
+
|
|
243
|
+
Anti-patterns and things to explicitly avoid. See `TROUBLESHOOTING.md`.
|
|
244
|
+
|
|
245
|
+
## Integration Notes
|
|
246
|
+
|
|
247
|
+
How this skill interacts with other skills.
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# ddd Troubleshooting & Common Mistakes
|
|
2
|
+
|
|
3
|
+
## 1. God Aggregates
|
|
4
|
+
|
|
5
|
+
- **Symptom**: Aggregate Root contains 20 child entities and loading it requires joining dozens of tables.
|
|
6
|
+
- **Root Cause**: Treating ERD tables as aggregate boundaries rather than transactional consistency units.
|
|
7
|
+
- **Fix**: Design small aggregates. Reference other aggregates by ID only, not by object reference.
|
|
8
|
+
|
|
9
|
+
## 2. Leaking Infrastructure into Domain Layer
|
|
10
|
+
|
|
11
|
+
- **Symptom**: Domain entities import Prisma, TypeORM decorators, or Express Request objects.
|
|
12
|
+
- **Root Cause**: Inverting Clean Architecture boundaries.
|
|
13
|
+
- **Fix**: The Domain layer must be pure TypeScript with zero external framework dependencies.
|
|
14
|
+
|
|
15
|
+
## 3. Transaction Spanning Multiple Aggregates
|
|
16
|
+
|
|
17
|
+
- **Symptom**: High database lock contention and deadlocks under concurrent transactions.
|
|
18
|
+
- **Root Cause**: Modifying multiple aggregate roots within the same database transaction.
|
|
19
|
+
- **Fix**: Rule of thumb: Exactly one Aggregate Root modified per transaction. Use Domain Events for eventual consistency across other aggregates.
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
# Domain-Driven Design — Patterns & Practices
|
|
2
|
+
|
|
3
|
+
## When to Use DDD
|
|
4
|
+
|
|
5
|
+
**Use when:**
|
|
6
|
+
|
|
7
|
+
- Complex business logic that goes beyond CRUD
|
|
8
|
+
- Multiple domain experts with different vocabularies
|
|
9
|
+
- The domain model is the competitive advantage
|
|
10
|
+
- Enterprise-grade applications
|
|
11
|
+
|
|
12
|
+
**Don't use when:**
|
|
13
|
+
|
|
14
|
+
- Simple CRUD applications
|
|
15
|
+
- Hackathon/MVP (overkill)
|
|
16
|
+
- No domain expert available
|
|
17
|
+
|
|
18
|
+
## Strategic Design
|
|
19
|
+
|
|
20
|
+
### Bounded Contexts
|
|
21
|
+
|
|
22
|
+
The single most important DDD concept. A Bounded Context is a boundary within which a particular model is defined and applicable.
|
|
23
|
+
|
|
24
|
+
**Example — E-Commerce:**
|
|
25
|
+
|
|
26
|
+
```
|
|
27
|
+
[Order Context] [Payment Context] [Shipping Context]
|
|
28
|
+
- Order - Payment - Shipment
|
|
29
|
+
- OrderItem - Transaction - TrackingNumber
|
|
30
|
+
- Customer (ref) - Refund - Address
|
|
31
|
+
- Address (value) - Invoice - Carrier
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
`Customer` means different things in each context:
|
|
35
|
+
|
|
36
|
+
- Order Context: name, email, shipping preference
|
|
37
|
+
- Payment Context: billing info, payment methods
|
|
38
|
+
- Support Context: ticket history, satisfaction score
|
|
39
|
+
|
|
40
|
+
### Context Map
|
|
41
|
+
|
|
42
|
+
```
|
|
43
|
+
[Order] ←→ [Payment] # Partnership
|
|
44
|
+
[Order] → [Shipping] # Customer-Supplier
|
|
45
|
+
[Order] → [Legacy CRM] # Anti-Corruption Layer
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## Tactical Design
|
|
49
|
+
|
|
50
|
+
### Entities
|
|
51
|
+
|
|
52
|
+
Objects with identity. Two entities with the same attributes but different IDs are different.
|
|
53
|
+
|
|
54
|
+
```typescript
|
|
55
|
+
class User {
|
|
56
|
+
readonly id: UserId;
|
|
57
|
+
name: string;
|
|
58
|
+
email: Email; // Value Object
|
|
59
|
+
}
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### Value Objects
|
|
63
|
+
|
|
64
|
+
Objects defined by their attributes, not identity. Immutable.
|
|
65
|
+
|
|
66
|
+
```typescript
|
|
67
|
+
class Email {
|
|
68
|
+
constructor(readonly value: string) {
|
|
69
|
+
if (!isValidEmail(value)) throw new InvalidEmailError(value);
|
|
70
|
+
}
|
|
71
|
+
equals(other: Email): boolean {
|
|
72
|
+
return this.value === other.value;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### Aggregates
|
|
78
|
+
|
|
79
|
+
A cluster of entities and value objects with a single root entity (Aggregate Root). All access goes through the root.
|
|
80
|
+
|
|
81
|
+
```typescript
|
|
82
|
+
class Order { // Aggregate Root
|
|
83
|
+
private items: OrderItem[] = [];
|
|
84
|
+
|
|
85
|
+
addItem(product: ProductRef, quantity: number): void {
|
|
86
|
+
// Business logic HERE, not in a service
|
|
87
|
+
if (quantity <= 0) throw new InvalidQuantityError();
|
|
88
|
+
this.items.push(new OrderItem(product, quantity));
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
get total(): Money {
|
|
92
|
+
return this.items.reduce((sum, item) => sum.add(item.subtotal), Money.zero());
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
**Aggregate Rules:**
|
|
98
|
+
|
|
99
|
+
1. Reference other aggregates by ID only
|
|
100
|
+
2. One aggregate per transaction
|
|
101
|
+
3. Eventual consistency between aggregates
|
|
102
|
+
|
|
103
|
+
### Domain Events
|
|
104
|
+
|
|
105
|
+
Something that happened in the domain that domain experts care about.
|
|
106
|
+
|
|
107
|
+
```typescript
|
|
108
|
+
class OrderPlaced implements DomainEvent {
|
|
109
|
+
constructor(
|
|
110
|
+
readonly orderId: OrderId,
|
|
111
|
+
readonly customerId: CustomerId,
|
|
112
|
+
readonly total: Money,
|
|
113
|
+
readonly occurredAt: Date
|
|
114
|
+
) {}
|
|
115
|
+
}
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
### Domain Services
|
|
119
|
+
|
|
120
|
+
Business logic that doesn't naturally belong to an entity or value object.
|
|
121
|
+
|
|
122
|
+
```typescript
|
|
123
|
+
class PricingService {
|
|
124
|
+
calculatePrice(order: Order, customer: Customer, promotions: Promotion[]): Money {
|
|
125
|
+
// Complex pricing logic involving multiple aggregates
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
### Repositories
|
|
131
|
+
|
|
132
|
+
Abstraction over data access. One repository per aggregate root.
|
|
133
|
+
|
|
134
|
+
```typescript
|
|
135
|
+
interface OrderRepository {
|
|
136
|
+
findById(id: OrderId): Promise<Order | null>;
|
|
137
|
+
save(order: Order): Promise<void>;
|
|
138
|
+
delete(id: OrderId): Promise<void>;
|
|
139
|
+
}
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
## Directory Structure (DDD)
|
|
143
|
+
|
|
144
|
+
```
|
|
145
|
+
src/
|
|
146
|
+
├── modules/
|
|
147
|
+
│ └── orders/ # Bounded Context
|
|
148
|
+
│ ├── domain/
|
|
149
|
+
│ │ ├── entities/
|
|
150
|
+
│ │ │ └── order.ts # Aggregate Root
|
|
151
|
+
│ │ ├── value-objects/
|
|
152
|
+
│ │ │ └── money.ts
|
|
153
|
+
│ │ ├── events/
|
|
154
|
+
│ │ │ └── order-placed.ts
|
|
155
|
+
│ │ ├── services/
|
|
156
|
+
│ │ │ └── pricing.ts
|
|
157
|
+
│ │ └── repositories/
|
|
158
|
+
│ │ └── order.repository.ts # Interface
|
|
159
|
+
│ ├── application/
|
|
160
|
+
│ │ ├── commands/
|
|
161
|
+
│ │ │ └── place-order.ts
|
|
162
|
+
│ │ ├── queries/
|
|
163
|
+
│ │ │ └── get-order.ts
|
|
164
|
+
│ │ └── handlers/
|
|
165
|
+
│ │ └── place-order.handler.ts
|
|
166
|
+
│ └── infrastructure/
|
|
167
|
+
│ ├── persistence/
|
|
168
|
+
│ │ └── order.repository.impl.ts # Implementation
|
|
169
|
+
│ └── api/
|
|
170
|
+
│ └── orders.controller.ts
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
## Anti-Patterns
|
|
174
|
+
|
|
175
|
+
- [FAIL] Anemic domain model — entities with only getters/setters, all logic in services
|
|
176
|
+
- [FAIL] Big aggregate — aggregates should be small, focused on invariants
|
|
177
|
+
- [FAIL] Cross-aggregate transactions — use eventual consistency
|
|
178
|
+
- [FAIL] DDD everywhere — use DDD only where complexity justifies it
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# decisions Examples — Anti-patterns vs ContextOS Standard
|
|
2
|
+
|
|
3
|
+
## Example 1: Documenting Tech Choices
|
|
4
|
+
|
|
5
|
+
### Anti-pattern: Tribal Knowledge & Undocumented Decisions
|
|
6
|
+
|
|
7
|
+
```text
|
|
8
|
+
"We switched to Redis for session storage last month because Dan said so on Slack."
|
|
9
|
+
Three months later, Dan leaves and nobody knows why the config is set up this way.
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
### Best practice: ContextOS Standard (MADR Architecture Decision Record)
|
|
13
|
+
|
|
14
|
+
```markdown
|
|
15
|
+
# ADR 0003: Use Redis for Distributed Session Storage
|
|
16
|
+
|
|
17
|
+
## Context and Problem Statement
|
|
18
|
+
Our application is transitioning from a single server to horizontally auto-scaled instances.
|
|
19
|
+
Sticky sessions on load balancer cause uneven distribution and drop sessions on node recycling.
|
|
20
|
+
|
|
21
|
+
## Considered Options
|
|
22
|
+
1. PostgreSQL session table
|
|
23
|
+
2. Redis cluster
|
|
24
|
+
3. JWT stateless tokens in cookies
|
|
25
|
+
|
|
26
|
+
## Decision Outcome
|
|
27
|
+
Chosen option: "Redis cluster", because:
|
|
28
|
+
- Sub-millisecond read/write latency compared to relational DB queries.
|
|
29
|
+
- Built-in TTL automatically handles session expiration without cron cleanup.
|
|
30
|
+
- Avoids security risks of client-stored JWT revocation.
|
|
31
|
+
|
|
32
|
+
## Consequences
|
|
33
|
+
- Positive: Stateless web tier, zero session drops on deployment.
|
|
34
|
+
- Negative: Adds operational dependency on Redis cluster infrastructure.
|
|
35
|
+
```
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: decision-engine
|
|
3
|
+
description: >
|
|
4
|
+
Architecture Decision Records (ADR) management. Creates, tracks, and queries
|
|
5
|
+
decisions so the AI agent understands WHY choices were made, not just WHAT was chosen.
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# decision-engine
|
|
9
|
+
|
|
10
|
+
## Overview
|
|
11
|
+
|
|
12
|
+
Architecture Decision Record (ADR) system following Michael Nygard format. Captures context, options considered, tradeoffs, and consequences to prevent architectural regression and knowledge loss across AI sessions.
|
|
13
|
+
|
|
14
|
+
## When to Use
|
|
15
|
+
|
|
16
|
+
Activate when choosing or switching database engines, authentication strategies, state libraries, or significant architectural patterns.
|
|
17
|
+
|
|
18
|
+
## Rules & Patterns
|
|
19
|
+
|
|
20
|
+
You manage **Architecture Decision Records** (ADRs).
|
|
21
|
+
|
|
22
|
+
## Why Decisions Matter
|
|
23
|
+
|
|
24
|
+
Without ADRs, the AI agent sees:
|
|
25
|
+
|
|
26
|
+
- "Database: PostgreSQL" — but doesn't know WHY
|
|
27
|
+
- "Auth: JWT" — but doesn't know what alternatives were considered
|
|
28
|
+
- "Framework: Next.js" — but doesn't know the tradeoffs
|
|
29
|
+
|
|
30
|
+
With ADRs, the agent understands the reasoning and won't accidentally contradict prior decisions.
|
|
31
|
+
|
|
32
|
+
## Commands
|
|
33
|
+
|
|
34
|
+
### Create a Decision
|
|
35
|
+
|
|
36
|
+
When an architectural choice is made during any pipeline stage:
|
|
37
|
+
|
|
38
|
+
1. Auto-increment the decision number
|
|
39
|
+
2. Use the template from `generators/templates/DECISION.md`
|
|
40
|
+
3. Save to `docs/decisions/NNNN-decision-name.md`
|
|
41
|
+
4. Update the Project Graph if the decision affects modules
|
|
42
|
+
|
|
43
|
+
**Naming convention:** `docs/decisions/0001-use-postgresql.md`
|
|
44
|
+
|
|
45
|
+
### Query Decisions
|
|
46
|
+
|
|
47
|
+
Before making changes that touch architecture:
|
|
48
|
+
|
|
49
|
+
1. Check `docs/decisions/` for related decisions
|
|
50
|
+
2. If a decision exists, follow it
|
|
51
|
+
3. If a decision needs to change, create a new ADR that **supersedes** the old one
|
|
52
|
+
|
|
53
|
+
### Decision Lifecycle
|
|
54
|
+
|
|
55
|
+
```
|
|
56
|
+
proposed → accepted → [deprecated | superseded]
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
- **proposed**: Under discussion, not yet committed
|
|
60
|
+
- **accepted**: The team agreed, this is the standard
|
|
61
|
+
- **deprecated**: No longer relevant (project evolved)
|
|
62
|
+
- **superseded**: Replaced by a newer decision (link to it)
|
|
63
|
+
|
|
64
|
+
## Auto-Detection
|
|
65
|
+
|
|
66
|
+
The Decision Engine should suggest creating an ADR when it detects:
|
|
67
|
+
|
|
68
|
+
- A new database/ORM is introduced
|
|
69
|
+
- A new framework is added
|
|
70
|
+
- Authentication strategy changes
|
|
71
|
+
- API versioning approach is chosen
|
|
72
|
+
- Deployment strategy is decided
|
|
73
|
+
- A significant library is added (state management, testing framework, etc.)
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
## Code Examples
|
|
77
|
+
|
|
78
|
+
See `EXAMPLES.md` for detailed code examples.
|
|
79
|
+
|
|
80
|
+
## Validation Checklist
|
|
81
|
+
|
|
82
|
+
What to verify during the review phase before completing the task.
|
|
83
|
+
|
|
84
|
+
## Common Mistakes
|
|
85
|
+
|
|
86
|
+
Anti-patterns and things to explicitly avoid. See `TROUBLESHOOTING.md`.
|
|
87
|
+
|
|
88
|
+
## Integration Notes
|
|
89
|
+
|
|
90
|
+
How this skill interacts with other skills.
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# decisions Troubleshooting & Common Mistakes
|
|
2
|
+
|
|
3
|
+
## 1. Post-Hoc Justifications
|
|
4
|
+
|
|
5
|
+
- **Symptom**: ADR written weeks after code is merged, omitting all rejected options.
|
|
6
|
+
- **Root Cause**: Treating ADRs as paperwork rather than decision-making tools.
|
|
7
|
+
- **Fix**: Write the ADR during the PLAN phase _before_ implementing the decision.
|
|
8
|
+
|
|
9
|
+
## 2. Omitting Trade-offs
|
|
10
|
+
|
|
11
|
+
- **Symptom**: ADR lists only benefits, claiming the chosen tech has zero downsides.
|
|
12
|
+
- **Root Cause**: Confirmation bias.
|
|
13
|
+
- **Fix**: Every architecture decision has costs. Explicitly document negative trade-offs and operational overhead.
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
name: decisions
|
|
2
|
+
description: >
|
|
3
|
+
Architecture Decision Records (ADR) management. Creates, tracks, and queries
|
|
4
|
+
architectural decisions so AI assistants understand why choices were made.
|
|
5
|
+
tags:
|
|
6
|
+
- architecture
|
|
7
|
+
- adr
|
|
8
|
+
- decisions
|
|
9
|
+
- documentation
|
|
10
|
+
version: 1.0.0
|