@polymorphism-tech/morph-spec 7.0.0 → 7.1.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/README.md +367 -367
- package/framework/agents.json +132 -127
- package/framework/rubrics/backend.json +41 -36
- package/framework/rules/ai-agents-standards.md +45 -15
- package/framework/rules/neon-standards.md +25 -26
- package/framework/standards/STANDARDS.json +1729 -1133
- package/framework/standards/ai-agents/agent-session.md +160 -0
- package/framework/standards/ai-agents/batching.md +193 -0
- package/framework/standards/ai-agents/context-providers.md +188 -0
- package/framework/standards/ai-agents/mcp-server.md +250 -0
- package/framework/standards/ai-agents/mcp-tools.md +197 -0
- package/framework/standards/ai-agents/middleware-patterns.md +207 -0
- package/framework/standards/ai-agents/modalities-image-gen.md +173 -0
- package/framework/standards/ai-agents/modalities-speech-to-text.md +171 -0
- package/framework/standards/ai-agents/modalities-text-to-speech.md +181 -0
- package/framework/standards/ai-agents/modalities-vision.md +201 -0
- package/framework/standards/ai-agents/multi-agent-patterns.md +155 -0
- package/framework/standards/ai-agents/production.md +114 -258
- package/framework/standards/ai-agents/prompts-in-db.md +214 -0
- package/framework/standards/ai-agents/providers/model-registry.md +158 -0
- package/framework/standards/ai-agents/rag-custom-pgvector.md +243 -0
- package/framework/standards/ai-agents/service-tier-flex.md +135 -0
- package/framework/standards/ai-agents/setup.md +142 -316
- package/framework/standards/ai-agents/structured-output.md +249 -0
- package/framework/standards/ai-agents/sweet-spot.md +109 -0
- package/framework/standards/ai-agents/workflows.md +114 -284
- package/framework/standards/architecture/vertical-slice/vertical-slice.md +433 -429
- package/framework/standards/backend/api/validation.md +92 -88
- package/framework/standards/backend/database/postgresql/database.md +336 -332
- package/framework/standards/backend/database/vector-search-rag.md +599 -541
- package/framework/standards/backend/dotnet/fluent-validation-vsa.md +4 -0
- package/framework/standards/backend/dotnet/result-pattern.md +4 -0
- package/framework/standards/backend/dotnet/scalar-ui.md +176 -172
- package/framework/standards/backend/dotnet/scrutor.md +4 -0
- package/framework/standards/backend/dotnet/vsa-handler-patterns.md +278 -274
- package/framework/standards/backend/integrations/asaas/asaas-api.md +260 -216
- package/framework/standards/backend/integrations/hangfire/hangfire-jobs.md +354 -350
- package/framework/standards/backend/integrations/neon-auth/neon-auth.md +30 -19
- package/framework/standards/backend/integrations/resend/resend-email.md +400 -385
- package/framework/standards/data/nosql/cache/redis.md +106 -97
- package/framework/standards/data/nosql/cosmos-db.md +127 -118
- package/framework/standards/data/vector-search/rag-chunking.md +113 -104
- package/framework/standards/frontend/design-system/ai-image-generation.md +4 -0
- package/framework/standards/frontend/design-system/animations.md +164 -160
- package/framework/standards/frontend/design-system/naming.md +68 -64
- package/framework/standards/frontend/gsap/gsap-core.md +14 -8
- package/framework/standards/frontend/gsap/gsap-plugins.md +26 -21
- package/framework/standards/frontend/gsap/gsap-scrolltrigger.md +9 -7
- package/framework/standards/frontend/nextjs/app-router.md +127 -123
- package/framework/standards/frontend/nextjs/components.md +136 -132
- package/framework/standards/frontend/nextjs/data-fetching.md +130 -126
- package/framework/standards/frontend/nextjs/forms.md +134 -128
- package/framework/standards/frontend/nextjs/motion-patterns.md +328 -322
- package/framework/standards/frontend/nextjs/naming-conventions.md +71 -67
- package/framework/standards/frontend/nextjs/nextjs-patterns.md +229 -225
- package/framework/standards/frontend/nextjs/project-structure.md +106 -102
- package/framework/standards/frontend/nextjs/state-management.md +76 -72
- package/framework/standards/frontend/nextjs/testing.md +115 -111
- package/framework/standards/infrastructure/docker/easypanel-deploy.md +196 -192
- package/framework/standards/infrastructure/neon/neon-pgrag.md +6 -2
- package/framework/standards/infrastructure/neon/neon-pgvector.md +4 -0
- package/framework/standards/infrastructure/neon/neon-setup.md +5 -1
- package/framework/standards/integration/mcp/mcp-tools.md +471 -462
- package/framework/templates/REGISTRY.json +1745 -1239
- package/framework/templates/code/dotnet/ai-agents/AgentBootstrap.cs.template +39 -0
- package/framework/templates/code/dotnet/ai-agents/EmbeddingService.cs.template +68 -0
- package/framework/templates/code/dotnet/ai-agents/ModelRegistry.cs.template +117 -0
- package/framework/templates/code/dotnet/ai-agents/PromptRepository.cs.template +95 -0
- package/framework/templates/code/dotnet/ai-agents/ResilientToolMiddleware.cs.template +61 -0
- package/framework/templates/code/dotnet/ai-agents/VectorSearchTool.cs.template +107 -0
- package/framework/templates/code/dotnet/ai-agents/model-registry.json.template +58 -0
- package/framework/templates/code/sql/ai-agents/agent-prompts-migration.sql.template +58 -0
- package/framework/templates/code/sql/ai-agents/pgvector-embeddings-migration.sql.template +91 -0
- package/package.json +89 -83
- package/src/core/templates/template-registry.js +289 -256
- package/src/lib/generators/context-generator.js +516 -518
- package/src/lib/generators/scaffold-generator.js +23 -26
- package/framework/standards/infrastructure/neon/neon-semantic-kernel.md +0 -310
- package/framework/templates/integrations/semantic-kernel-neon.cs +0 -125
|
@@ -1,88 +1,92 @@
|
|
|
1
|
-
# Status Validation Pattern
|
|
2
|
-
|
|
3
|
-
> **Scope:** universal
|
|
4
|
-
> **Layer:** 0 (always load)
|
|
5
|
-
> **Keywords:** validation, fluent, dto, modelstate, fluentvalidation
|
|
6
|
-
> **Load When:** always
|
|
7
|
-
|
|
8
|
-
**
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
//
|
|
25
|
-
if (order.Status
|
|
26
|
-
throw new InvalidOperationException("
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
if (order
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
if (order.
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
return Result.
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
- [ ]
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
1
|
+
# Status Validation Pattern
|
|
2
|
+
|
|
3
|
+
> **Scope:** universal
|
|
4
|
+
> **Layer:** 0 (always load)
|
|
5
|
+
> **Keywords:** validation, fluent, dto, modelstate, fluentvalidation
|
|
6
|
+
> **Load When:** always
|
|
7
|
+
|
|
8
|
+
**Verified against:** .NET 10 (pure state-validation pattern — no external package). Last-verified: 2026-05-20.
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
**MORPH-SPEC Standard** — Validate what is INVALID, not what is valid.
|
|
13
|
+
|
|
14
|
+
## Problem
|
|
15
|
+
|
|
16
|
+
Validations assuming a single flow break when new flows are added.
|
|
17
|
+
|
|
18
|
+
```
|
|
19
|
+
Original: Created → PendingPayment → Processing → Completed → EmailSent
|
|
20
|
+
Free: Created → Processing → Completed → EmailSent (skips payment)
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
```csharp
|
|
24
|
+
// ❌ Assumes single flow — breaks free flow
|
|
25
|
+
if (order.Status != OrderStatus.PendingPayment)
|
|
26
|
+
throw new InvalidOperationException("Must be pending payment");
|
|
27
|
+
|
|
28
|
+
// ✅ Validates invalid states — works for all flows
|
|
29
|
+
if (order.Status >= OrderStatus.Completed || order.Status == OrderStatus.Failed)
|
|
30
|
+
throw new InvalidOperationException("Order already completed or failed");
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## Enum Design
|
|
34
|
+
|
|
35
|
+
```csharp
|
|
36
|
+
public enum OrderStatus
|
|
37
|
+
{
|
|
38
|
+
Created = 0, PendingPayment = 1, Processing = 2, Completed = 3, EmailSent = 4,
|
|
39
|
+
// Error states (separated range)
|
|
40
|
+
Failed = 100, Cancelled = 101, Refunded = 102
|
|
41
|
+
}
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## Validation Patterns
|
|
45
|
+
|
|
46
|
+
| Pattern | When | Example |
|
|
47
|
+
|---------|------|---------|
|
|
48
|
+
| Final state check | Block after completion | `if (status >= OrderStatus.Completed)` |
|
|
49
|
+
| Error state list | Block specific errors | `if (new[] { Failed, Cancelled, Refunded }.Contains(status))` |
|
|
50
|
+
| Range comparison | Block finalized + errors | `if (status >= Completed \|\| status >= Failed)` |
|
|
51
|
+
|
|
52
|
+
## Anti-Patterns
|
|
53
|
+
|
|
54
|
+
| Anti-Pattern | Problem | Fix |
|
|
55
|
+
|-------------|---------|-----|
|
|
56
|
+
| `if (status != Expected)` | Assumes single flow | Validate invalid states instead |
|
|
57
|
+
| Exhaustive switch on valid states | Must modify for each new status | Validate only invalid states |
|
|
58
|
+
| Business logic in state validator | Mixed concerns | Separate state validation from business rules |
|
|
59
|
+
|
|
60
|
+
## Complete Example
|
|
61
|
+
|
|
62
|
+
```csharp
|
|
63
|
+
public async Task<Result> ProcessOrderAsync(Guid orderId, CancellationToken ct)
|
|
64
|
+
{
|
|
65
|
+
var order = await _repository.GetByIdAsync(orderId, ct);
|
|
66
|
+
if (order == null) return Result.Failure("Order not found");
|
|
67
|
+
|
|
68
|
+
// State validation (invalid states)
|
|
69
|
+
if (order.Status >= OrderStatus.Completed) return Result.Failure("Already completed");
|
|
70
|
+
if (order.Status == OrderStatus.Failed) return Result.Failure("Cannot process failed order");
|
|
71
|
+
if (order.Status == OrderStatus.Cancelled) return Result.Failure("Cannot process cancelled order");
|
|
72
|
+
|
|
73
|
+
// Business validation (separate)
|
|
74
|
+
if (order.RequiresPayment && !order.IsPaid) return Result.Failure("Payment required");
|
|
75
|
+
|
|
76
|
+
order.MarkAsProcessing();
|
|
77
|
+
await _repository.UpdateAsync(order, ct);
|
|
78
|
+
return Result.Success();
|
|
79
|
+
}
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
## Checklist
|
|
83
|
+
|
|
84
|
+
- [ ] Validates INVALID states (not valid)?
|
|
85
|
+
- [ ] Uses ordered enum comparison where possible?
|
|
86
|
+
- [ ] Error states treated separately (100+ range)?
|
|
87
|
+
- [ ] All flows documented in decisions.md?
|
|
88
|
+
- [ ] Tested with all possible flows?
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
*MORPH-SPEC by Polymorphism Tech*
|