@polymorphism-tech/morph-spec 4.2.0 → 4.3.1

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 (140) hide show
  1. package/CLAUDE.md +108 -946
  2. package/bin/morph-spec.js +284 -9
  3. package/bin/task-manager.cjs +102 -14
  4. package/bin/validate.js +4 -4
  5. package/docs/{v3.0 → next-generation}/AGENTS.md +1 -1
  6. package/docs/next-generation/CONTEXT-OPTIMIZATION.md +267 -0
  7. package/docs/next-generation/EXECUTION-FLOW.md +274 -0
  8. package/docs/next-generation/META-PROMPTS.md +235 -0
  9. package/docs/next-generation/MIGRATION-GUIDE.md +253 -0
  10. package/docs/next-generation/THREAD-MANAGEMENT.md +240 -0
  11. package/package.json +5 -5
  12. package/src/commands/agents/agents-fuse.js +97 -0
  13. package/src/commands/agents/micro-agent.js +112 -0
  14. package/src/commands/agents/spawn-team.js +69 -4
  15. package/src/commands/agents/squad-template.js +146 -0
  16. package/src/commands/analytics/analytics.js +176 -0
  17. package/src/commands/context/context-prime.js +63 -0
  18. package/src/commands/context/core-four.js +54 -0
  19. package/src/commands/mcp/mcp.js +102 -0
  20. package/src/commands/project/detect-agents.js +32 -2
  21. package/src/commands/project/detect.js +11 -1
  22. package/src/commands/project/doctor.js +573 -356
  23. package/src/commands/project/init.js +9 -2
  24. package/src/commands/project/update.js +13 -3
  25. package/src/commands/state/advance-phase.js +448 -416
  26. package/src/commands/state/state.js +14 -12
  27. package/src/commands/tasks/task.js +1 -1
  28. package/src/commands/templates/template-render.js +80 -1
  29. package/src/commands/threads/thread-template.js +103 -0
  30. package/src/commands/threads/threads.js +261 -0
  31. package/src/commands/trust/trust.js +205 -0
  32. package/src/{orchestrator.js → core/orchestrator.js} +8 -8
  33. package/src/core/state/state-manager.js +37 -17
  34. package/src/core/workflows/workflow-detector.js +114 -3
  35. package/src/lib/agents/micro-agent-factory.js +161 -0
  36. package/src/lib/analytics/analytics-engine.js +345 -0
  37. package/src/lib/checkpoints/checkpoint-hooks.js +298 -258
  38. package/src/lib/context/context-bundler.js +240 -0
  39. package/src/lib/context/context-optimizer.js +212 -0
  40. package/src/lib/context/context-tracker.js +273 -0
  41. package/src/lib/context/core-four-tracker.js +201 -0
  42. package/src/lib/context/mcp-optimizer.js +200 -0
  43. package/src/lib/detectors/index.js +1 -1
  44. package/src/lib/detectors/standards-generator.js +77 -17
  45. package/src/lib/detectors/structure-detector.js +67 -39
  46. package/src/lib/execution/fusion-executor.js +304 -0
  47. package/src/lib/execution/parallel-executor.js +270 -0
  48. package/src/lib/generators/context-generator.js +3 -3
  49. package/src/lib/generators/recap-generator.js +32 -12
  50. package/src/lib/hooks/hook-executor.js +169 -0
  51. package/src/lib/hooks/stop-hook-executor.js +286 -0
  52. package/src/lib/hops/hop-composer.js +221 -0
  53. package/src/lib/threads/thread-coordinator.js +238 -0
  54. package/src/lib/threads/thread-manager.js +317 -0
  55. package/src/lib/tracking/artifact-trail.js +202 -0
  56. package/src/lib/trust/trust-manager.js +269 -0
  57. package/src/lib/validators/design-system/design-system-validator.js +2 -2
  58. package/src/lib/validators/validation-runner.js +14 -30
  59. package/src/utils/hooks-installer.js +69 -0
  60. package/stacks/blazor-azure/.morph/config/agents.json +72 -3
  61. package/stacks/nextjs-supabase/.morph/config/agents.json +3 -3
  62. package/docs/llm-interaction-config.md +0 -735
  63. package/docs/v3.0/EXECUTION-FLOW.md +0 -1304
  64. package/src/commands/utils/migrate-state.js +0 -158
  65. package/src/commands/utils/upgrade.js +0 -346
  66. package/src/lib/validators/architecture-validator.js +0 -60
  67. package/src/lib/validators/content-validator.js +0 -164
  68. package/src/lib/validators/package-validator.js +0 -61
  69. package/src/lib/validators/ui-contrast-validator.js +0 -44
  70. package/stacks/blazor-azure/.claude/commands/morph-apply.md +0 -221
  71. package/stacks/blazor-azure/.claude/commands/morph-archive.md +0 -79
  72. package/stacks/blazor-azure/.claude/commands/morph-deploy.md +0 -529
  73. package/stacks/blazor-azure/.claude/commands/morph-infra.md +0 -209
  74. package/stacks/blazor-azure/.claude/commands/morph-preflight.md +0 -227
  75. package/stacks/blazor-azure/.claude/commands/morph-proposal.md +0 -122
  76. package/stacks/blazor-azure/.claude/commands/morph-status.md +0 -86
  77. package/stacks/blazor-azure/.claude/commands/morph-troubleshoot.md +0 -122
  78. package/stacks/blazor-azure/.claude/skills/level-0-meta/README.md +0 -7
  79. package/stacks/blazor-azure/.claude/skills/level-0-meta/code-review.md +0 -226
  80. package/stacks/blazor-azure/.claude/skills/level-0-meta/morph-checklist.md +0 -117
  81. package/stacks/blazor-azure/.claude/skills/level-0-meta/simulation-checklist.md +0 -77
  82. package/stacks/blazor-azure/.claude/skills/level-1-workflows/README.md +0 -7
  83. package/stacks/blazor-azure/.claude/skills/level-1-workflows/morph-replicate.md +0 -213
  84. package/stacks/blazor-azure/.claude/skills/level-1-workflows/phase-clarify.md +0 -131
  85. package/stacks/blazor-azure/.claude/skills/level-1-workflows/phase-design.md +0 -213
  86. package/stacks/blazor-azure/.claude/skills/level-1-workflows/phase-setup.md +0 -106
  87. package/stacks/blazor-azure/.claude/skills/level-1-workflows/phase-tasks.md +0 -164
  88. package/stacks/blazor-azure/.claude/skills/level-1-workflows/phase-uiux.md +0 -169
  89. package/stacks/blazor-azure/.claude/skills/level-2-domains/README.md +0 -14
  90. package/stacks/blazor-azure/.claude/skills/level-2-domains/ai-agents/ai-system-architect.md +0 -192
  91. package/stacks/blazor-azure/.claude/skills/level-2-domains/architecture/po-pm-advisor.md +0 -197
  92. package/stacks/blazor-azure/.claude/skills/level-2-domains/architecture/prompt-engineer.md +0 -189
  93. package/stacks/blazor-azure/.claude/skills/level-2-domains/architecture/seo-growth-hacker.md +0 -320
  94. package/stacks/blazor-azure/.claude/skills/level-2-domains/architecture/standards-architect.md +0 -156
  95. package/stacks/blazor-azure/.claude/skills/level-2-domains/backend/api-designer.md +0 -59
  96. package/stacks/blazor-azure/.claude/skills/level-2-domains/backend/dotnet-senior.md +0 -77
  97. package/stacks/blazor-azure/.claude/skills/level-2-domains/backend/ef-modeler.md +0 -58
  98. package/stacks/blazor-azure/.claude/skills/level-2-domains/backend/hangfire-orchestrator.md +0 -126
  99. package/stacks/blazor-azure/.claude/skills/level-2-domains/backend/ms-agent-expert.md +0 -45
  100. package/stacks/blazor-azure/.claude/skills/level-2-domains/frontend/blazor-builder.md +0 -210
  101. package/stacks/blazor-azure/.claude/skills/level-2-domains/frontend/nextjs-expert.md +0 -154
  102. package/stacks/blazor-azure/.claude/skills/level-2-domains/frontend/ui-ux-designer.md +0 -191
  103. package/stacks/blazor-azure/.claude/skills/level-2-domains/infrastructure/azure-architect.md +0 -142
  104. package/stacks/blazor-azure/.claude/skills/level-2-domains/infrastructure/azure-deploy-specialist.md +0 -699
  105. package/stacks/blazor-azure/.claude/skills/level-2-domains/infrastructure/bicep-architect.md +0 -126
  106. package/stacks/blazor-azure/.claude/skills/level-2-domains/infrastructure/container-specialist.md +0 -131
  107. package/stacks/blazor-azure/.claude/skills/level-2-domains/infrastructure/devops-engineer.md +0 -119
  108. package/stacks/blazor-azure/.claude/skills/level-2-domains/integrations/asaas-financial.md +0 -130
  109. package/stacks/blazor-azure/.claude/skills/level-2-domains/integrations/azure-identity.md +0 -142
  110. package/stacks/blazor-azure/.claude/skills/level-2-domains/integrations/clerk-auth.md +0 -108
  111. package/stacks/blazor-azure/.claude/skills/level-2-domains/integrations/hangfire-orchestrator.md +0 -64
  112. package/stacks/blazor-azure/.claude/skills/level-2-domains/integrations/resend-email.md +0 -119
  113. package/stacks/blazor-azure/.claude/skills/level-2-domains/quality/code-analyzer.md +0 -235
  114. package/stacks/blazor-azure/.claude/skills/level-2-domains/quality/testing-specialist.md +0 -126
  115. package/stacks/blazor-azure/.claude/skills/level-3-technologies/README.md +0 -7
  116. package/stacks/blazor-azure/.claude/skills/level-4-patterns/README.md +0 -7
  117. package/stacks/blazor-azure/.morph/archive/.gitkeep +0 -25
  118. package/stacks/blazor-azure/.morph/features/.gitkeep +0 -25
  119. package/stacks/blazor-azure/.morph/schemas/agent.schema.json +0 -296
  120. package/stacks/blazor-azure/.morph/schemas/tasks.schema.json +0 -220
  121. package/stacks/blazor-azure/.morph/specs/.gitkeep +0 -20
  122. package/stacks/blazor-azure/.morph/test-infra/example.bicep +0 -59
  123. package/stacks/nextjs-supabase/.claude/commands/morph-apply.md +0 -221
  124. package/stacks/nextjs-supabase/.claude/commands/morph-archive.md +0 -79
  125. package/stacks/nextjs-supabase/.claude/commands/morph-deploy.md +0 -529
  126. package/stacks/nextjs-supabase/.claude/commands/morph-infra.md +0 -209
  127. package/stacks/nextjs-supabase/.claude/commands/morph-preflight.md +0 -227
  128. package/stacks/nextjs-supabase/.claude/commands/morph-proposal.md +0 -122
  129. package/stacks/nextjs-supabase/.claude/commands/morph-status.md +0 -86
  130. package/stacks/nextjs-supabase/.claude/commands/morph-troubleshoot.md +0 -122
  131. package/stacks/nextjs-supabase/.claude/settings.local.json +0 -6
  132. package/stacks/nextjs-supabase/.claude/skills/level-2-domains/backend/dotnet-supabase.md +0 -244
  133. package/stacks/nextjs-supabase/.claude/skills/level-2-domains/frontend/nextjs-supabase.md +0 -335
  134. package/stacks/nextjs-supabase/.claude/skills/level-2-domains/infrastructure/easypanel-deployer.md +0 -189
  135. package/stacks/nextjs-supabase/.claude/skills/level-2-domains/integrations/supabase-expert.md +0 -50
  136. /package/docs/{v3.0 → next-generation}/ANALYSIS.md +0 -0
  137. /package/docs/{v3.0 → next-generation}/ARCHITECTURE.md +0 -0
  138. /package/docs/{v3.0 → next-generation}/FEATURES.md +0 -0
  139. /package/docs/{v3.0 → next-generation}/README.md +0 -0
  140. /package/docs/{v3.0 → next-generation}/ROADMAP.md +0 -0
@@ -1,108 +0,0 @@
1
- # Clerk Auth
2
-
3
- > **Layer:** 2 | **Load:** on-keyword | **Keywords:** clerk, auth, login, signup, authentication, session, jwt, user
4
-
5
- Autenticação SaaS com Clerk para .NET/Blazor. SDK: `Clerk.Net.AspNetCore.Security`.
6
-
7
- ## Setup
8
-
9
- ```csharp
10
- // appsettings.json
11
- { "Clerk": { "SecretKey": "${CLERK_SECRET_KEY}", "PublishableKey": "pk_test_xxx" } }
12
-
13
- // Program.cs
14
- builder.Services.AddClerk(builder.Configuration);
15
- builder.Services.AddAuthentication(ClerkAuthenticationDefaults.AuthenticationScheme)
16
- .AddClerk(o => { o.Authority = "https://clerk.{instance}.com"; o.ValidAudiences = ["your-app-id"]; });
17
- builder.Services.AddAuthorization();
18
- app.UseAuthentication();
19
- app.UseAuthorization();
20
- ```
21
-
22
- ## Protected Endpoints
23
-
24
- ```csharp
25
- // Minimal API
26
- app.MapGet("/api/profile", async (ClaimsPrincipal user, IClerkClient clerk) =>
27
- {
28
- var userId = user.FindFirstValue(ClaimTypes.NameIdentifier);
29
- if (userId is null) return Results.Unauthorized();
30
- var u = await clerk.Users.GetUserAsync(userId);
31
- return Results.Ok(new { u.Id, Email = u.EmailAddresses.FirstOrDefault()?.EmailAddress });
32
- }).RequireAuthorization();
33
-
34
- // Controller: same pattern with [Authorize] + User.FindFirstValue()
35
- // Role-based: [Authorize(Roles = "admin")]
36
- ```
37
-
38
- ## Blazor Server
39
-
40
- > **Ref:** Same `CascadingAuthenticationState` + `AuthorizeRouteView` pattern as `azure-identity.md`
41
-
42
- ```razor
43
- @* RedirectToLogin.razor *@
44
- @inject NavigationManager Nav
45
- @code {
46
- protected override void OnInitialized() =>
47
- Nav.NavigateTo($"/sign-in?redirect_url={Uri.EscapeDataString(Nav.Uri)}", forceLoad: true);
48
- }
49
-
50
- @* Protected page *@
51
- @page "/dashboard"
52
- @attribute [Authorize]
53
- <AuthorizeView><Authorized>Welcome, @context.User.Identity?.Name!</Authorized></AuthorizeView>
54
- <AuthorizeView Roles="admin"><Authorized><AdminPanel /></Authorized></AuthorizeView>
55
- ```
56
-
57
- ## Client Operations
58
-
59
- ```csharp
60
- var user = await _clerk.Users.GetUserAsync(userId); // Get
61
- var users = await _clerk.Users.GetUserListAsync(new() { Limit = 10 }); // List
62
- await _clerk.Users.UpdateUserMetadataAsync(userId, new() // Update metadata
63
- { PublicMetadata = new Dictionary<string, object> { ["plan"] = "pro" } });
64
- await _clerk.Users.DeleteUserAsync(userId); // Delete
65
- ```
66
-
67
- ## Webhooks
68
-
69
- ```csharp
70
- [ApiController, Route("api/webhooks/clerk")]
71
- public class ClerkWebhookController(IUserService users) : ControllerBase
72
- {
73
- [HttpPost]
74
- public async Task<IActionResult> Handle([FromBody] ClerkWebhookPayload payload)
75
- {
76
- switch (payload.Type)
77
- {
78
- case "user.created": await users.SyncUserAsync(payload.Data); break;
79
- case "user.updated": await users.UpdateUserAsync(payload.Data); break;
80
- case "user.deleted": await users.DeleteUserAsync(payload.Data.Id); break;
81
- }
82
- return Ok();
83
- }
84
- }
85
- ```
86
-
87
- ## Clerk vs Azure Identity
88
-
89
- | Aspecto | Clerk | Azure Identity |
90
- |---------|-------|----------------|
91
- | Setup | Faster | More complex |
92
- | Cost | Freemium (5k MAU free) | Free (Azure AD) |
93
- | Social login | 20+ providers | Limited |
94
- | UI components | Pre-built | Build your own |
95
- | Best for | SaaS B2C, MVPs | Enterprise/Azure |
96
-
97
- ## Checklist
98
-
99
- - [ ] Secret Key in Key Vault (not hardcoded)
100
- - [ ] Authentication scheme configured
101
- - [ ] Authorization policies defined
102
- - [ ] Webhook endpoint + signature validation
103
- - [ ] Redirect after login configured
104
- - [ ] Error handling for expired sessions
105
-
106
- ---
107
-
108
- *MORPH-SPEC by Polymorphism Tech*
@@ -1,64 +0,0 @@
1
- # Hangfire Orchestrator
2
-
3
- **Tier:** 3 (Specialist)
4
- **Always Active:** No
5
- **Keywords:** scheduled, job, background, cron, recurring, batch, queue, hangfire
6
- **Reports to:** dotnet-senior
7
-
8
- ---
9
-
10
- ## Role
11
-
12
- Hangfire specialist for background jobs, scheduled tasks, and asynchronous processing.
13
-
14
- ---
15
-
16
- ## Standards Applied
17
-
18
- ```
19
- framework/standards/core/coding.md
20
- framework/standards/backend/dotnet/async.md
21
- framework/standards/backend/database/repository-patterns.md (Factory pattern for scoped repos)
22
- framework/standards/backend/integrations/hangfire/setup.md
23
- framework/standards/backend/integrations/hangfire/jobs.md
24
- ```
25
-
26
- ---
27
-
28
- ## Responsibilities
29
-
30
- - Configure Hangfire with SQL Server storage
31
- - Create fire-and-forget jobs
32
- - Schedule recurring jobs with cron expressions
33
- - Implement delayed and continuation jobs
34
- - Use IRepositoryFactory for DbContext in jobs (NOT direct injection)
35
- - Configure Hangfire Dashboard with authentication
36
- - Handle job failures and retries
37
-
38
- ---
39
-
40
- ## When to Use
41
-
42
- - Background processing (emails, reports, cleanup)
43
- - Scheduled tasks (daily/hourly jobs)
44
- - Delayed operations (abandoned cart after 24h)
45
- - Long-running operations outside HTTP request
46
-
47
- ---
48
-
49
- ## Critical Pattern
50
-
51
- **ALWAYS use IRepositoryFactory in Hangfire jobs** - DbContext is scoped to HTTP request and won't exist in background jobs.
52
-
53
- ---
54
-
55
- ## Collaborates With
56
-
57
- - **dotnet-senior** - Service layer triggering jobs
58
- - **ef-modeler** - Repository factory implementation
59
- - **azure-architect** - Hangfire dashboard security
60
- - **resend-email** - Email jobs coordination
61
-
62
- ---
63
-
64
- *MORPH-SPEC by Polymorphism Tech*
@@ -1,119 +0,0 @@
1
- # Resend Email
2
-
3
- > **Layer:** 2 | **Load:** on-keyword | **Keywords:** resend, email, envio, transactional, notification, send email, template
4
-
5
- Transactional email via Resend for .NET. REST API, no official SDK. Simple, developer-friendly.
6
-
7
- ## Setup
8
-
9
- ```csharp
10
- // appsettings.json
11
- { "Resend": { "BaseUrl": "https://api.resend.com", "ApiKey": "${RESEND_API_KEY}", "FromEmail": "noreply@yourdomain.com" } }
12
-
13
- // Program.cs
14
- builder.Services.Configure<ResendOptions>(builder.Configuration.GetSection("Resend"));
15
- builder.Services.AddHttpClient<IResendClient, ResendClient>((sp, client) =>
16
- {
17
- var options = sp.GetRequiredService<IOptions<ResendOptions>>().Value;
18
- client.BaseAddress = new Uri(options.BaseUrl);
19
- client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", options.ApiKey);
20
- });
21
- ```
22
-
23
- ## Client Interface
24
-
25
- ```csharp
26
- public interface IResendClient
27
- {
28
- Task<EmailResponse> SendAsync(SendEmailRequest request, CancellationToken ct = default);
29
- Task<EmailResponse> SendBatchAsync(IEnumerable<SendEmailRequest> requests, CancellationToken ct = default);
30
- Task<EmailDetails> GetEmailAsync(string emailId, CancellationToken ct = default);
31
- }
32
- ```
33
-
34
- Implementation: `HttpClient.PostAsJsonAsync("/emails")` + `ReadFromJsonAsync<EmailResponse>`. Log errors, throw `ResendException` on failure.
35
-
36
- ## DTOs
37
-
38
- ```csharp
39
- public record SendEmailRequest
40
- {
41
- [JsonPropertyName("from")] public required string From { get; init; }
42
- [JsonPropertyName("to")] public required string[] To { get; init; }
43
- [JsonPropertyName("subject")] public required string Subject { get; init; }
44
- [JsonPropertyName("html")] public string? Html { get; init; }
45
- [JsonPropertyName("text")] public string? Text { get; init; }
46
- [JsonPropertyName("reply_to")] public string? ReplyTo { get; init; }
47
- [JsonPropertyName("tags")] public Tag[]? Tags { get; init; }
48
- }
49
-
50
- public record EmailResponse
51
- {
52
- [JsonPropertyName("id")] public string Id { get; init; } = "";
53
- }
54
-
55
- public record Tag
56
- {
57
- [JsonPropertyName("name")] public required string Name { get; init; }
58
- [JsonPropertyName("value")] public required string Value { get; init; }
59
- }
60
- ```
61
-
62
- ## Webhooks
63
-
64
- ```csharp
65
- [ApiController, Route("api/webhooks/resend")]
66
- public class ResendWebhookController(IEmailTrackingService tracking, ILogger<ResendWebhookController> logger) : ControllerBase
67
- {
68
- [HttpPost]
69
- public async Task<IActionResult> Handle([FromBody] ResendWebhookPayload payload)
70
- {
71
- logger.LogInformation("Resend webhook: {Type} for {EmailId}", payload.Type, payload.Data?.EmailId);
72
- switch (payload.Type)
73
- {
74
- case "email.delivered": await tracking.MarkDeliveredAsync(payload.Data!.EmailId); break;
75
- case "email.bounced": await tracking.MarkBouncedAsync(payload.Data!.EmailId); break;
76
- case "email.complained": await tracking.MarkComplainedAsync(payload.Data!.EmailId); break;
77
- }
78
- return Ok();
79
- }
80
- }
81
- ```
82
-
83
- ## Abstraction Pattern
84
-
85
- ```csharp
86
- // Use IEmailService abstraction over IResendClient for testability
87
- public interface IEmailService
88
- {
89
- Task<string> SendTransactionalAsync(string to, string subject, string htmlBody, CancellationToken ct = default);
90
- }
91
-
92
- // ResendEmailService implements IEmailService using IResendClient
93
- // FakeEmailClient implements IEmailService for simulation mode
94
- ```
95
-
96
- ## Gotchas
97
-
98
- | Issue | Fix |
99
- |-------|-----|
100
- | Rate limit: 100 req/sec (free), 1000 (pro) | Queue emails via Hangfire for bulk sends |
101
- | Domain verification required for production | Verify in Resend dashboard, add DNS records |
102
- | `from` must match verified domain | Use `noreply@yourdomain.com` |
103
- | HTML email rendering varies | Test with Litmus/Email on Acid, use MJML |
104
- | Webhook signature validation | Verify `svix-signature` header in production |
105
-
106
- ## Checklist
107
-
108
- - [ ] API Key in Key Vault (not hardcoded)
109
- - [ ] HttpClient with `Authorization: Bearer` header
110
- - [ ] Domain verified in Resend dashboard
111
- - [ ] `IEmailService` abstraction for testability
112
- - [ ] Webhook endpoint + signature validation
113
- - [ ] Rate limiting handled (queue for bulk)
114
- - [ ] Tags used for tracking/analytics
115
- - [ ] Simulation mode (`FakeEmailClient`) for dev
116
-
117
- ---
118
-
119
- *MORPH-SPEC by Polymorphism Tech*
@@ -1,235 +0,0 @@
1
- # Code Analyzer
2
-
3
- > **Layer:** 2 | **Load:** on-keyword | **Keywords:** analyze, review, refactor, clean, smell, duplicate, architecture, quality, debt, unused, dead code, code review, code quality
4
-
5
- Deep code analysis specialist. Automates architecture review, clean code checks, and duplication detection.
6
-
7
- > **Ref:** `framework/standards/coding.md` for naming conventions.
8
- > **Ref:** `framework/standards/architecture.md` for architectural patterns.
9
- > **Ref:** `.claude/skills/checklists/code-review.md` for runtime pattern checks.
10
-
11
- ---
12
-
13
- ## When to Run
14
-
15
- | Trigger | Automatic? | Scope |
16
- |---------|-----------|-------|
17
- | FASE 5 completion (`/morph-apply` done) | Yes | Full feature code |
18
- | Checkpoint (every 3 tasks) | Yes | Code since last checkpoint |
19
- | Manual: `analyze`, `review code`, `code quality` | No | Specified scope |
20
- | Pre-merge review | Recommended | All changed files |
21
-
22
- ---
23
-
24
- ## 3 Analysis Modes
25
-
26
- Run all 3 modes by default. Use `--mode architecture`, `--mode clean`, or `--mode duplication` for targeted analysis.
27
-
28
- ---
29
-
30
- ### Mode 1: Architecture Analysis
31
-
32
- Analyze the codebase for structural and architectural issues.
33
-
34
- #### Checklist
35
-
36
- **Layer Integrity:**
37
- - [ ] `[CRITICAL]` Domain project has zero references to Infrastructure or Web
38
- - [ ] `[CRITICAL]` Application does NOT reference Web project
39
- - [ ] `[HIGH]` No circular dependencies between projects
40
- - [ ] `[HIGH]` Infrastructure details don't leak into Application (no EF types in DTOs)
41
-
42
- **Responsibility Separation:**
43
- - [ ] `[HIGH]` Each class has a single, clear responsibility (< 300 lines)
44
- - [ ] `[HIGH]` Controllers/pages are thin (< 50 lines logic, delegate to services)
45
- - [ ] `[MEDIUM]` Interfaces are focused (< 7 methods per interface)
46
- - [ ] `[MEDIUM]` No "God classes" (classes with 10+ dependencies)
47
-
48
- **Abstractions:**
49
- - [ ] `[MEDIUM]` External services accessed through interfaces (testable)
50
- - [ ] `[LOW]` No over-abstraction (interfaces with exactly 1 implementation that's never mocked)
51
- - [ ] `[MEDIUM]` Missing abstractions: direct HTTP calls, file I/O, or DB access without interface
52
-
53
- **File Organization:**
54
- - [ ] `[MEDIUM]` One class per file (file name matches class name)
55
- - [ ] `[MEDIUM]` Files in correct project/folder per architecture.md
56
- - [ ] `[LOW]` Consistent folder structure across all layers
57
-
58
- **Configuration:**
59
- - [ ] `[HIGH]` No hardcoded connection strings, URLs, or secrets
60
- - [ ] `[MEDIUM]` Configuration via Options pattern (`IOptions<T>`)
61
- - [ ] `[LOW]` No duplicate configuration across projects
62
-
63
- **Unused Code:**
64
- - [ ] `[MEDIUM]` No unused classes or interfaces (search for zero references)
65
- - [ ] `[MEDIUM]` No dead code paths (unreachable branches)
66
- - [ ] `[LOW]` No commented-out code blocks (> 3 lines)
67
- - [ ] `[LOW]` No empty or near-empty files (< 10 lines of actual code)
68
-
69
- ---
70
-
71
- ### Mode 2: Clean Code Analysis
72
-
73
- Analyze for code smells, style violations, and improvement opportunities.
74
-
75
- #### Checklist
76
-
77
- **Naming (ref: coding.md):**
78
- - [ ] `[HIGH]` All naming follows coding.md conventions (PascalCase constants, _camelCase fields, etc.)
79
- - [ ] `[HIGH]` No Hungarian notation (`strName`, `iCount`, `btnSubmit`)
80
- - [ ] `[HIGH]` No ALL_CAPS constants (`MAX_RETRY` -> `MaxRetry`)
81
- - [ ] `[MEDIUM]` Descriptive names (no `data`, `info`, `item`, `result` without context)
82
- - [ ] `[MEDIUM]` No abbreviations in public APIs (`repo` -> `repository`)
83
-
84
- **Method Quality:**
85
- - [ ] `[HIGH]` No methods > 30 lines (extract sub-methods)
86
- - [ ] `[HIGH]` No methods with > 4 parameters (use request object)
87
- - [ ] `[MEDIUM]` No nested conditionals > 3 levels (extract or use early return)
88
- - [ ] `[MEDIUM]` No complex conditionals (> 3 conditions in one `if` — extract to named bool or method)
89
-
90
- **Class Quality:**
91
- - [ ] `[HIGH]` No classes > 300 lines (SRP violation — split)
92
- - [ ] `[HIGH]` No classes with > 7 constructor dependencies (God class — split)
93
- - [ ] `[MEDIUM]` Classes are `sealed` unless designed for inheritance
94
-
95
- **Magic Values:**
96
- - [ ] `[HIGH]` No magic strings in comparisons (`if (status == "active")` -> use enum or constant)
97
- - [ ] `[HIGH]` No magic numbers (`if (items.Count > 50)` -> extract `const int MaxItemsPerPage = 50`)
98
- - [ ] `[MEDIUM]` No hardcoded URLs, file paths, or configuration values
99
-
100
- **Dead Code:**
101
- - [ ] `[MEDIUM]` No unused private methods (zero callers)
102
- - [ ] `[MEDIUM]` No unused parameters in methods
103
- - [ ] `[LOW]` No TODO/FIXME/HACK comments older than 2 sprints
104
- - [ ] `[LOW]` No `#if DEBUG` blocks with substantial logic
105
-
106
- **Error Handling:**
107
- - [ ] `[CRITICAL]` No empty catch blocks
108
- - [ ] `[HIGH]` No generic `catch (Exception)` without re-throw
109
- - [ ] `[HIGH]` Result pattern used for business errors (not exceptions)
110
- - [ ] `[MEDIUM]` Consistent error handling pattern across all services
111
-
112
- **Logging:**
113
- - [ ] `[HIGH]` No `$""` string interpolation in log methods (use message templates)
114
- - [ ] `[HIGH]` Critical operations have entry/exit/error logging
115
- - [ ] `[MEDIUM]` Log messages include correlation IDs (OrderId, UserId)
116
- - [ ] `[MEDIUM]` Consistent log levels across similar operations
117
-
118
- ---
119
-
120
- ### Mode 3: Duplication Detection
121
-
122
- Find redundant, duplicate, and unnecessary code.
123
-
124
- #### Targets
125
-
126
- **Exact/Near-Exact Duplicates:**
127
- - [ ] `[HIGH]` Methods with identical or near-identical logic in different classes
128
- - Same method body, different class -> extract to shared service or extension
129
- - Same logic with different types -> extract to generic method
130
- - [ ] `[HIGH]` Repeated code blocks (> 5 lines identical in 2+ locations)
131
-
132
- **Thin Wrappers:**
133
- - [ ] `[MEDIUM]` Methods that only delegate to another method with same parameters
134
- ```csharp
135
- // SMELL: Thin wrapper with no added value
136
- public Task<Order> GetOrderAsync(int id, CancellationToken ct)
137
- => _innerService.GetOrderAsync(id, ct);
138
- ```
139
- - [ ] `[MEDIUM]` Service methods that only call a repository method (no logic added)
140
-
141
- **Interface Redundancy:**
142
- - [ ] `[MEDIUM]` Same method signature appearing in multiple interfaces (extract base interface)
143
- - [ ] `[LOW]` Interface that exactly mirrors another interface (merge or inherit)
144
-
145
- **Passthrough Delegates:**
146
- - [ ] `[MEDIUM]` Controller/page methods that only call one service method and return result
147
- - If no validation, auth, or mapping: consider simplifying the layer
148
-
149
- **DTO/Model Duplication:**
150
- - [ ] `[HIGH]` Duplicate model definitions (same properties in different classes)
151
- - [ ] `[MEDIUM]` Request/Response DTOs that are identical (merge or use shared base)
152
- - [ ] `[MEDIUM]` Enums defined in multiple projects (centralize in Domain)
153
-
154
- ---
155
-
156
- ## Output Format
157
-
158
- For each finding, report:
159
-
160
- ```
161
- ### [{SEVERITY}] {Category}: {Short Description}
162
-
163
- **File:** `path/to/file.cs:42`
164
- **Rule:** {rule reference from checklist above}
165
-
166
- **Current code:**
167
- ```csharp
168
- // problematic code snippet
169
- ```
170
-
171
- **Suggested fix:**
172
- ```csharp
173
- // corrected code snippet
174
- ```
175
-
176
- **Why:** {brief explanation of the problem and impact}
177
- ```
178
-
179
- ---
180
-
181
- ## Summary Template
182
-
183
- After analysis, generate a summary:
184
-
185
- ```markdown
186
- ## Code Analysis Summary
187
-
188
- **Scope:** {files/feature analyzed}
189
- **Date:** {date}
190
- **Modes:** Architecture | Clean Code | Duplication
191
-
192
- ### Findings by Severity
193
-
194
- | Severity | Count |
195
- |----------|-------|
196
- | CRITICAL | {n} |
197
- | HIGH | {n} |
198
- | MEDIUM | {n} |
199
- | LOW | {n} |
200
-
201
- ### Top 5 Priorities
202
-
203
- 1. {Most critical finding with file:line}
204
- 2. {Second most critical}
205
- 3. ...
206
-
207
- ### Estimated Effort
208
-
209
- | Category | Findings | Effort |
210
- |----------|----------|--------|
211
- | Quick fixes (naming, style) | {n} | ~{h}h |
212
- | Refactoring (extraction, splitting) | {n} | ~{h}h |
213
- | Architecture (layer changes) | {n} | ~{h}h |
214
-
215
- ### Recommendations
216
-
217
- - {Key recommendation 1}
218
- - {Key recommendation 2}
219
- - {Key recommendation 3}
220
- ```
221
-
222
- ---
223
-
224
- ## Integration with Other Specialists
225
-
226
- | Specialist | Handoff |
227
- |------------|---------|
228
- | **Standards Architect** | Code Analyzer validates naming rules defined by Standards Architect |
229
- | **.NET Senior Engineer** | Code Analyzer reviews code produced by dotnet-senior |
230
- | **Code Review Checklist** | Code Analyzer runs architecture/clean code checks; code-review.md covers runtime patterns |
231
- | **Testing Specialist** | Findings may generate new test requirements |
232
-
233
- ---
234
-
235
- *MORPH-SPEC by Polymorphism Tech*
@@ -1,126 +0,0 @@
1
- # Testing Specialist
2
-
3
- > **Layer:** 2 | **Load:** on-keyword | **Keywords:** test, testing, mock, fake, simulation, unit test, integration test
4
-
5
- Especialista em testes, mocking e simulação para projetos .NET.
6
-
7
- ## Strategy
8
-
9
- | Level | What | Tools |
10
- |-------|------|-------|
11
- | **Unit** | Business logic, domain, handlers | xUnit + Moq + FluentAssertions |
12
- | **Integration** | API flows, DB operations | WebApplicationFactory + TestContainers |
13
- | **Component** | Blazor rendering, events | bUnit |
14
- | **E2E** | Critical user journeys | Playwright (if needed) |
15
-
16
- **Focus:** Critical/complex code. Don't aim for 100%, aim for value. Cover edge cases and error paths.
17
-
18
- ---
19
-
20
- ## Core Patterns
21
-
22
- ### AAA (Arrange-Act-Assert)
23
-
24
- ```csharp
25
- [Fact]
26
- public async Task CreateOrder_Should_ReturnSuccess_When_ValidInput()
27
- {
28
- // Arrange
29
- var command = new CreateOrderCommand { CustomerId = 1, Items = [...] };
30
- var handler = new CreateOrderHandler(_mockRepo.Object);
31
- // Act
32
- var result = await handler.Handle(command, CancellationToken.None);
33
- // Assert
34
- result.IsSuccess.Should().BeTrue();
35
- }
36
- ```
37
-
38
- ### Naming Convention
39
- ```
40
- [Method]_Should_[ExpectedResult]_When_[Condition]
41
- ```
42
-
43
- ### Test Data Builders
44
- Use builder pattern for complex test entities: `new OrderBuilder().WithCustomer(123).WithStatus(Completed).Build()`
45
-
46
- ### Mocking (Moq)
47
- ```csharp
48
- var mockRepo = new Mock<IOrderRepository>();
49
- mockRepo.Setup(r => r.GetByIdAsync(It.IsAny<int>())).ReturnsAsync(new Order { Id = 1 });
50
- mockRepo.Verify(r => r.SaveAsync(It.IsAny<Order>()), Times.Once);
51
- ```
52
-
53
- ### Integration Tests (WebApplicationFactory)
54
- Replace real DB with in-memory in `ConfigureServices`, use `CreateClient()` for HTTP calls.
55
-
56
- ### bUnit (Blazor)
57
- `RenderComponent<Counter>()` → `Find("button").Click()` → assert `TextContent`.
58
-
59
- ---
60
-
61
- ## Libraries
62
-
63
- | Library | Purpose | NuGet |
64
- |---------|---------|-------|
65
- | xUnit | Test framework | `xunit` |
66
- | Moq | Mocking | `Moq` |
67
- | FluentAssertions | Readable assertions | `FluentAssertions` |
68
- | Bogus | Fake data | `Bogus` |
69
- | TestContainers | DB containers | `Testcontainers` |
70
- | Respawn | DB reset | `Respawn` |
71
- | WireMock | HTTP mocking | `WireMock.Net` |
72
- | bUnit | Blazor testing | `bunit` |
73
-
74
- ## Folder Structure
75
-
76
- ```
77
- tests/
78
- ├── Unit/{Domain,Application,Builders}/
79
- ├── Integration/{Api,Fixtures}/
80
- └── E2E/
81
- ```
82
-
83
- ## Anti-Patterns
84
- 1. **Fragile tests** — test behavior, not implementation
85
- 2. **Slow tests** — use mocks, not real DB for unit tests
86
- 3. **Coupled tests** — each test independent
87
- 4. **Vague assertions** — use specific FluentAssertions
88
- 5. **Giant setup** — extract to builders/fixtures
89
-
90
- ---
91
-
92
- ## Simulation of External Services
93
-
94
- > **Ref:** `.claude/skills/checklists/simulation-checklist.md` for complete checklist
95
-
96
- ### Key Rules
97
-
98
- | Mock Type | Characteristic | DI Lifetime |
99
- |-----------|---------------|-------------|
100
- | **Stateful** (Dictionary, List) | Keeps data between calls | `Singleton` |
101
- | **Stateless** | No state | `Scoped` |
102
-
103
- ```csharp
104
- // ❌ Stateful with Scoped = loses state between requests
105
- services.AddScoped<IReplicateClient, FakeReplicateClient>();
106
- // ✅ Stateful with Singleton
107
- services.AddSingleton<IReplicateClient, FakeReplicateClient>();
108
- ```
109
-
110
- **Before implementing mocks:** Map ALL dependencies (interfaces, transitive deps, lifetimes).
111
-
112
- ---
113
-
114
- ## Checklists
115
-
116
- ### Per Test Type
117
- | Target | Test |
118
- |--------|------|
119
- | Entity/Domain | Creation validation, state transitions (valid + invalid), invariants |
120
- | Handler/Service | Happy path, invalid input, not found (404), auth error, timeout |
121
- | API | Status codes, response body, request validation, auth |
122
- | Blazor Component | Initial render, user events, states (loading/error/empty), form validation |
123
-
124
- ---
125
-
126
- *MORPH-SPEC by Polymorphism Tech*
@@ -1,7 +0,0 @@
1
- # Level 3: Technologies
2
-
3
- Technology-specific implementation patterns.
4
-
5
- **Purpose:** Skills for specific technologies (EF Core, Blazor, Hangfire, SignalR, etc.).
6
-
7
- **To be populated in Phase 8/9.**
@@ -1,7 +0,0 @@
1
- # Level 4: Patterns
2
-
3
- Architectural and design patterns.
4
-
5
- **Purpose:** Skills for specific patterns (CQRS, Event Sourcing, DDD, Repository, etc.).
6
-
7
- **To be populated later.**
@@ -1,25 +0,0 @@
1
- # Features Arquivadas
2
-
3
- Esta pasta contém o histórico de features CONCLUÍDAS.
4
-
5
- ## Estrutura
6
-
7
- ```
8
- archive/
9
- └── {feature-name}/
10
- ├── proposal.md # Proposta original
11
- ├── spec.md # Especificação final
12
- ├── tasks.md # Tasks completadas
13
- ├── contracts.cs # Contracts finais
14
- ├── decisions.md # ADRs
15
- └── recap.md # Resumo e métricas
16
- ```
17
-
18
- ## Por que arquivar?
19
-
20
- 1. Manter histórico de decisões
21
- 2. Referência para features similares
22
- 3. Métricas de produtividade
23
- 4. Lições aprendidas
24
-
25
- *Gerado pelo MORPH Framework*