@polymorphism-tech/morph-spec 2.3.0 → 3.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 (166) hide show
  1. package/CLAUDE.md +446 -1730
  2. package/README.md +515 -516
  3. package/bin/morph-spec.js +366 -294
  4. package/bin/task-manager.js +429 -368
  5. package/bin/validate.js +369 -268
  6. package/content/.claude/commands/morph-apply.md +221 -158
  7. package/content/.claude/commands/morph-deploy.md +529 -0
  8. package/content/.claude/commands/morph-preflight.md +227 -0
  9. package/content/.claude/commands/morph-proposal.md +122 -101
  10. package/content/.claude/commands/morph-status.md +86 -86
  11. package/content/.claude/commands/morph-troubleshoot.md +122 -0
  12. package/content/.claude/skills/infra/azure-deploy-specialist.md +699 -0
  13. package/content/.claude/skills/level-0-meta/README.md +7 -0
  14. package/content/.claude/skills/level-0-meta/code-review.md +226 -0
  15. package/content/.claude/skills/level-0-meta/morph-checklist.md +117 -0
  16. package/content/.claude/skills/level-0-meta/simulation-checklist.md +77 -0
  17. package/content/.claude/skills/level-1-workflows/README.md +7 -0
  18. package/content/.claude/skills/level-1-workflows/morph-replicate.md +213 -0
  19. package/content/.claude/{commands/morph-clarify.md → skills/level-1-workflows/phase-clarify.md} +131 -184
  20. package/content/.claude/{commands/morph-design.md → skills/level-1-workflows/phase-design.md} +213 -275
  21. package/content/.claude/skills/level-1-workflows/phase-setup.md +106 -0
  22. package/content/.claude/skills/level-1-workflows/phase-tasks.md +164 -0
  23. package/content/.claude/{commands/morph-uiux.md → skills/level-1-workflows/phase-uiux.md} +169 -211
  24. package/content/.claude/skills/level-2-domains/README.md +14 -0
  25. package/content/.claude/skills/level-2-domains/ai-agents/ai-system-architect.md +192 -0
  26. package/content/.claude/skills/{specialists → level-2-domains/architecture}/po-pm-advisor.md +197 -197
  27. package/content/.claude/skills/level-2-domains/architecture/standards-architect.md +156 -0
  28. package/content/.claude/skills/level-2-domains/backend/dotnet-senior.md +287 -0
  29. package/content/.claude/skills/level-2-domains/backend/ef-modeler.md +113 -0
  30. package/content/.claude/skills/level-2-domains/backend/hangfire-orchestrator.md +126 -0
  31. package/content/.claude/skills/level-2-domains/backend/ms-agent-expert.md +109 -0
  32. package/content/.claude/skills/level-2-domains/frontend/blazor-builder.md +210 -0
  33. package/content/.claude/skills/level-2-domains/frontend/nextjs-expert.md +154 -0
  34. package/content/.claude/skills/level-2-domains/frontend/ui-ux-designer.md +191 -0
  35. package/content/.claude/skills/{specialists → level-2-domains/infrastructure}/azure-architect.md +142 -142
  36. package/content/.claude/skills/level-2-domains/infrastructure/bicep-architect.md +126 -0
  37. package/content/.claude/skills/level-2-domains/infrastructure/container-specialist.md +131 -0
  38. package/content/.claude/skills/level-2-domains/infrastructure/devops-engineer.md +119 -0
  39. package/content/.claude/skills/level-2-domains/integrations/asaas-financial.md +130 -0
  40. package/content/.claude/skills/level-2-domains/integrations/azure-identity.md +142 -0
  41. package/content/.claude/skills/level-2-domains/integrations/clerk-auth.md +108 -0
  42. package/content/.claude/skills/level-2-domains/integrations/resend-email.md +119 -0
  43. package/content/.claude/skills/level-2-domains/quality/code-analyzer.md +235 -0
  44. package/content/.claude/skills/level-2-domains/quality/testing-specialist.md +126 -0
  45. package/content/.claude/skills/level-3-technologies/README.md +7 -0
  46. package/content/.claude/skills/level-4-patterns/README.md +7 -0
  47. package/content/.claude/skills/specialists/prompt-engineer.md +189 -0
  48. package/content/.claude/skills/specialists/seo-growth-hacker.md +320 -0
  49. package/content/.morph/config/agents.json +762 -242
  50. package/content/.morph/config/config.template.json +122 -108
  51. package/content/.morph/docs/workflows/design-impl.md +37 -0
  52. package/content/.morph/docs/workflows/enforcement-pipeline.md +668 -0
  53. package/content/.morph/docs/workflows/fast-track.md +29 -0
  54. package/content/.morph/docs/workflows/full-morph.md +76 -0
  55. package/content/.morph/docs/workflows/standard.md +44 -0
  56. package/content/.morph/docs/workflows/ui-refresh.md +39 -0
  57. package/content/.morph/examples/scheduled-reports/decisions.md +158 -0
  58. package/content/.morph/examples/scheduled-reports/proposal.md +95 -0
  59. package/content/.morph/examples/scheduled-reports/spec.md +267 -0
  60. package/content/.morph/hooks/README.md +348 -239
  61. package/content/.morph/hooks/pre-commit-agents.sh +24 -24
  62. package/content/.morph/hooks/task-completed.js +73 -0
  63. package/content/.morph/hooks/teammate-idle.js +68 -0
  64. package/content/.morph/schemas/tasks.schema.json +220 -0
  65. package/content/.morph/standards/agent-framework-blazor-ui.md +359 -0
  66. package/content/.morph/standards/agent-framework-production.md +410 -0
  67. package/content/.morph/standards/agent-framework-setup.md +413 -453
  68. package/content/.morph/standards/agent-framework-workflows.md +349 -0
  69. package/content/.morph/standards/agent-teams-workflow.md +474 -0
  70. package/content/.morph/standards/architecture.md +325 -325
  71. package/content/.morph/standards/azure.md +605 -379
  72. package/content/.morph/standards/dotnet10-migration.md +520 -494
  73. package/content/.morph/templates/CONTEXT-FEATURE.md +276 -0
  74. package/content/.morph/templates/CONTEXT.md +170 -0
  75. package/content/.morph/templates/agent.cs +163 -172
  76. package/content/.morph/templates/clarify-questions.md +159 -0
  77. package/content/.morph/templates/contracts/Commands.cs +74 -0
  78. package/content/.morph/templates/contracts/Entities.cs +25 -0
  79. package/content/.morph/templates/contracts/Queries.cs +74 -0
  80. package/content/.morph/templates/contracts/README.md +74 -0
  81. package/content/.morph/templates/decisions.md +123 -106
  82. package/content/.morph/templates/infra/azure-pipelines-deploy.yml +480 -0
  83. package/content/.morph/templates/infra/deploy-checklist.md +426 -0
  84. package/content/.morph/templates/proposal.md +141 -155
  85. package/content/.morph/templates/recap.md +94 -105
  86. package/content/.morph/templates/simulation.md +353 -0
  87. package/content/.morph/templates/spec.md +149 -148
  88. package/content/.morph/templates/state.template.json +222 -222
  89. package/content/.morph/templates/tasks.md +257 -235
  90. package/content/.morph/templates/ui-components.md +362 -276
  91. package/content/CLAUDE.md +150 -442
  92. package/detectors/structure-detector.js +245 -250
  93. package/docs/README.md +144 -149
  94. package/docs/getting-started.md +301 -302
  95. package/docs/installation.md +361 -361
  96. package/docs/validation-checklist.md +265 -266
  97. package/package.json +80 -80
  98. package/src/commands/advance-phase.js +266 -0
  99. package/src/commands/analyze-blazor-concurrency.js +193 -0
  100. package/src/commands/deploy.js +780 -0
  101. package/src/commands/detect-agents.js +167 -0
  102. package/src/commands/doctor.js +356 -280
  103. package/src/commands/generate-context.js +40 -0
  104. package/src/commands/init.js +258 -245
  105. package/src/commands/lint-fluent.js +352 -0
  106. package/src/commands/rollback-phase.js +185 -0
  107. package/src/commands/session-summary.js +291 -0
  108. package/src/commands/task.js +78 -75
  109. package/src/commands/troubleshoot.js +222 -0
  110. package/src/commands/update.js +192 -159
  111. package/src/commands/validate-blazor-state.js +210 -0
  112. package/src/commands/validate-blazor.js +156 -0
  113. package/src/commands/validate-css.js +84 -0
  114. package/src/commands/validate-phase.js +221 -0
  115. package/src/lib/blazor-concurrency-analyzer.js +288 -0
  116. package/src/lib/blazor-state-validator.js +291 -0
  117. package/src/lib/blazor-validator.js +374 -0
  118. package/src/lib/complexity-analyzer.js +441 -292
  119. package/src/lib/context-generator.js +513 -0
  120. package/src/lib/continuous-validator.js +421 -440
  121. package/src/lib/css-validator.js +352 -0
  122. package/src/lib/decision-constraint-loader.js +109 -0
  123. package/src/lib/design-system-detector.js +187 -0
  124. package/src/lib/design-system-scaffolder.js +299 -0
  125. package/src/lib/hook-executor.js +256 -0
  126. package/src/lib/recap-generator.js +205 -0
  127. package/src/lib/spec-validator.js +258 -0
  128. package/src/lib/standards-context-injector.js +287 -0
  129. package/src/lib/state-manager.js +397 -340
  130. package/src/lib/team-orchestrator.js +322 -0
  131. package/src/lib/troubleshoot-grep.js +194 -0
  132. package/src/lib/troubleshoot-index.js +144 -0
  133. package/src/lib/validation-runner.js +283 -0
  134. package/src/lib/validators/contract-compliance-validator.js +273 -0
  135. package/src/lib/validators/design-system-validator.js +231 -0
  136. package/src/utils/file-copier.js +187 -139
  137. package/content/.claude/commands/morph-costs.md +0 -206
  138. package/content/.claude/commands/morph-setup.md +0 -100
  139. package/content/.claude/commands/morph-tasks.md +0 -319
  140. package/content/.claude/skills/infra/bicep-architect.md +0 -419
  141. package/content/.claude/skills/infra/container-specialist.md +0 -437
  142. package/content/.claude/skills/infra/devops-engineer.md +0 -405
  143. package/content/.claude/skills/integrations/asaas-financial.md +0 -333
  144. package/content/.claude/skills/integrations/azure-identity.md +0 -309
  145. package/content/.claude/skills/integrations/clerk-auth.md +0 -290
  146. package/content/.claude/skills/specialists/ai-system-architect.md +0 -604
  147. package/content/.claude/skills/specialists/cost-guardian.md +0 -110
  148. package/content/.claude/skills/specialists/ef-modeler.md +0 -211
  149. package/content/.claude/skills/specialists/hangfire-orchestrator.md +0 -255
  150. package/content/.claude/skills/specialists/ms-agent-expert.md +0 -263
  151. package/content/.claude/skills/specialists/standards-architect.md +0 -78
  152. package/content/.claude/skills/specialists/ui-ux-designer.md +0 -1100
  153. package/content/.claude/skills/stacks/dotnet-blazor.md +0 -606
  154. package/content/.claude/skills/stacks/dotnet-nextjs.md +0 -402
  155. package/content/.claude/skills/stacks/shopify.md +0 -445
  156. package/content/.morph/config/azure-pricing.json +0 -70
  157. package/content/.morph/config/azure-pricing.schema.json +0 -50
  158. package/content/.morph/hooks/pre-commit-costs.sh +0 -91
  159. package/docs/api/cost-calculator.js.html +0 -513
  160. package/docs/api/design-system-generator.js.html +0 -382
  161. package/docs/api/global.html +0 -5263
  162. package/docs/api/index.html +0 -96
  163. package/docs/api/state-manager.js.html +0 -423
  164. package/src/commands/cost.js +0 -181
  165. package/src/commands/update-pricing.js +0 -206
  166. package/src/lib/cost-calculator.js +0 -429
@@ -1,172 +1,163 @@
1
- // ============================================================
2
- // MS AGENT FRAMEWORK TEMPLATE
3
- // Generated by MORPH Framework
4
- // ============================================================
5
-
6
- using Microsoft.Extensions.Logging;
7
- using Microsoft.SemanticKernel;
8
- using System.Text.Json;
9
-
10
- namespace MyProject.Agents.{Feature}Analyzer;
11
-
12
- /// <summary>
13
- /// AI Agent for analyzing {Feature} data.
14
- /// Uses Semantic Kernel with Azure OpenAI (gpt-4o-mini by default).
15
- /// </summary>
16
- public class {Feature}AnalyzerAgent(
17
- Kernel kernel,
18
- ILogger<{Feature}AnalyzerAgent> logger) : I{Feature}AnalyzerAgent
19
- {
20
- private const int MaxRetries = 3;
21
- private static readonly TimeSpan[] RetryDelays =
22
- {
23
- TimeSpan.FromSeconds(1),
24
- TimeSpan.FromSeconds(2),
25
- TimeSpan.FromSeconds(4)
26
- };
27
-
28
- /// <inheritdoc />
29
- public async Task<{Feature}AnalysisResult> AnalyzeAsync(
30
- {Feature}Data data,
31
- CancellationToken cancellationToken = default)
32
- {
33
- logger.LogInformation("Starting {Feature} analysis for: {Content}",
34
- data.Content.Length > 100 ? data.Content[..100] + "..." : data.Content);
35
-
36
- var prompt = BuildPrompt(data);
37
-
38
- for (int attempt = 0; attempt < MaxRetries; attempt++)
39
- {
40
- try
41
- {
42
- var response = await kernel.InvokePromptAsync(
43
- prompt,
44
- cancellationToken: cancellationToken);
45
-
46
- var result = ParseResponse(response.ToString());
47
-
48
- logger.LogInformation(
49
- "Analysis completed. Confidence: {Confidence:P0}",
50
- result.ConfidenceScore);
51
-
52
- return result;
53
- }
54
- catch (Exception ex) when (attempt < MaxRetries - 1)
55
- {
56
- logger.LogWarning(ex,
57
- "Analysis attempt {Attempt} failed, retrying...",
58
- attempt + 1);
59
-
60
- await Task.Delay(RetryDelays[attempt], cancellationToken);
61
- }
62
- }
63
-
64
- throw new {Feature}ProcessingException("Analysis failed after all retries");
65
- }
66
-
67
- #region Private Methods
68
-
69
- private static string BuildPrompt({Feature}Data data)
70
- {
71
- return $"""
72
- You are an expert analyst for {Feature} data.
73
-
74
- Analyze the following data and provide insights:
75
-
76
- <data>
77
- {data.Content}
78
- </data>
79
-
80
- Provide your analysis in the following JSON format:
81
- {{
82
- "summary": "Brief summary of the analysis (1-2 sentences)",
83
- "insights": ["insight 1", "insight 2", "insight 3"],
84
- "recommendations": ["recommendation 1", "recommendation 2"],
85
- "confidenceScore": 0.85
86
- }}
87
-
88
- Guidelines:
89
- - Be concise and actionable
90
- - Confidence score should be between 0 and 1
91
- - Provide at least 2 insights
92
- - Provide at least 1 recommendation
93
- - Focus on practical, business-relevant observations
94
-
95
- Respond ONLY with the JSON object, no additional text.
96
- """;
97
- }
98
-
99
- private {Feature}AnalysisResult ParseResponse(string response)
100
- {
101
- try
102
- {
103
- // Clean up response (remove markdown code blocks if present)
104
- var json = response
105
- .Replace("```json", "")
106
- .Replace("```", "")
107
- .Trim();
108
-
109
- var parsed = JsonSerializer.Deserialize<AnalysisResponse>(json,
110
- new JsonSerializerOptions { PropertyNameCaseInsensitive = true });
111
-
112
- if (parsed is null)
113
- {
114
- throw new {Feature}ProcessingException("Failed to parse analysis response");
115
- }
116
-
117
- return new {Feature}AnalysisResult(
118
- parsed.Summary ?? "Analysis completed",
119
- parsed.Insights ?? new List<string>(),
120
- parsed.Recommendations ?? new List<string>(),
121
- parsed.ConfidenceScore
122
- );
123
- }
124
- catch (JsonException ex)
125
- {
126
- logger.LogError(ex, "Failed to parse AI response: {Response}", response);
127
- throw new {Feature}ProcessingException("Failed to parse analysis response", ex);
128
- }
129
- }
130
-
131
- private class AnalysisResponse
132
- {
133
- public string? Summary { get; set; }
134
- public List<string>? Insights { get; set; }
135
- public List<string>? Recommendations { get; set; }
136
- public double ConfidenceScore { get; set; }
137
- }
138
-
139
- #endregion
140
- }
141
-
142
- // ============================================================
143
- // DEPENDENCY INJECTION SETUP
144
- // ============================================================
145
- //
146
- // In Program.cs or a DI extension:
147
- //
148
- // public static IServiceCollection AddAgents(
149
- // this IServiceCollection services,
150
- // IConfiguration configuration)
151
- // {
152
- // // Configure Semantic Kernel with Azure OpenAI
153
- // var builder = Kernel.CreateBuilder();
154
- //
155
- // builder.AddAzureOpenAIChatCompletion(
156
- // deploymentName: "gpt-4o-mini",
157
- // endpoint: configuration["AzureOpenAI:Endpoint"]!,
158
- // apiKey: configuration["AzureOpenAI:ApiKey"]!);
159
- //
160
- // // Or with Managed Identity (preferred):
161
- // // builder.AddAzureOpenAIChatCompletion(
162
- // // deploymentName: "gpt-4o-mini",
163
- // // endpoint: configuration["AzureOpenAI:Endpoint"]!,
164
- // // credentials: new DefaultAzureCredential());
165
- //
166
- // services.AddSingleton(builder.Build());
167
- // services.AddScoped<I{Feature}AnalyzerAgent, {Feature}AnalyzerAgent>();
168
- //
169
- // return services;
170
- // }
171
- //
172
- // ============================================================
1
+ // ============================================================
2
+ // MICROSOFT AGENT FRAMEWORK TEMPLATE
3
+ // Generated by MORPH Framework
4
+ // ============================================================
5
+
6
+ using System.ComponentModel;
7
+ using System.Text.Json;
8
+ using Microsoft.Agents.AI;
9
+ using Microsoft.Extensions.AI;
10
+ using Microsoft.Extensions.Logging;
11
+
12
+ namespace MyProject.Agents.{Feature};
13
+
14
+ /// <summary>
15
+ /// AI Agent for analyzing {Feature} data.
16
+ /// Uses Microsoft Agent Framework with IChatClient (gpt-4o-mini by default).
17
+ /// </summary>
18
+ public class {Feature}AnalyzerAgent(
19
+ IChatClient chatClient,
20
+ ILogger<{Feature}AnalyzerAgent> logger) : I{Feature}AnalyzerAgent
21
+ {
22
+ /// <inheritdoc />
23
+ public async Task<{Feature}AnalysisResult> AnalyzeAsync(
24
+ {Feature}Data data,
25
+ CancellationToken cancellationToken = default)
26
+ {
27
+ logger.LogInformation("Starting {Feature} analysis for: {Content}",
28
+ data.Content.Length > 100 ? data.Content[..100] + "..." : data.Content);
29
+
30
+ var agent = new ChatClientAgent(
31
+ chatClient,
32
+ new ChatClientAgentOptions
33
+ {
34
+ Name = "{Feature}Analyzer",
35
+ Instructions = """
36
+ You are an expert analyst for {Feature} data.
37
+
38
+ Analyze the provided data and return a JSON object with:
39
+ - summary: Brief summary (1-2 sentences)
40
+ - insights: Array of at least 2 insights
41
+ - recommendations: Array of at least 1 recommendation
42
+ - confidenceScore: Number between 0 and 1
43
+
44
+ Respond ONLY with valid JSON, no additional text.
45
+ """,
46
+ ChatOptions = new ChatOptions
47
+ {
48
+ Tools =
49
+ [
50
+ AIFunctionFactory.Create(GetContextAsync),
51
+ AIFunctionFactory.Create(GetMetricsAsync)
52
+ ]
53
+ }
54
+ });
55
+
56
+ var response = await agent.RunAsync(
57
+ $"Analyze this data:\n{data.Content}",
58
+ cancellationToken: cancellationToken);
59
+
60
+ var result = ParseResponse(response.Text);
61
+
62
+ logger.LogInformation(
63
+ "Analysis completed. Confidence: {Confidence:P0}",
64
+ result.ConfidenceScore);
65
+
66
+ return result;
67
+ }
68
+
69
+ #region Tools
70
+
71
+ [Description("Gets additional context for the analysis")]
72
+ private async Task<string> GetContextAsync(
73
+ [Description("What context is needed")] string query,
74
+ CancellationToken ct = default)
75
+ {
76
+ // TODO: Implement context retrieval (e.g., from database or search)
77
+ await Task.CompletedTask;
78
+ return $"Context for: {query}";
79
+ }
80
+
81
+ [Description("Gets relevant metrics for the analysis")]
82
+ private async Task<string> GetMetricsAsync(
83
+ [Description("Metric type to retrieve")] string metricType,
84
+ CancellationToken ct = default)
85
+ {
86
+ // TODO: Implement metrics retrieval
87
+ await Task.CompletedTask;
88
+ return $"Metrics for: {metricType}";
89
+ }
90
+
91
+ #endregion
92
+
93
+ #region Response Parsing
94
+
95
+ private {Feature}AnalysisResult ParseResponse(string response)
96
+ {
97
+ try
98
+ {
99
+ var json = response
100
+ .Replace("```json", "")
101
+ .Replace("```", "")
102
+ .Trim();
103
+
104
+ var parsed = JsonSerializer.Deserialize<AnalysisResponse>(json,
105
+ new JsonSerializerOptions { PropertyNameCaseInsensitive = true });
106
+
107
+ if (parsed is null)
108
+ throw new {Feature}ProcessingException("Failed to parse analysis response");
109
+
110
+ return new {Feature}AnalysisResult(
111
+ parsed.Summary ?? "Analysis completed",
112
+ parsed.Insights ?? [],
113
+ parsed.Recommendations ?? [],
114
+ parsed.ConfidenceScore);
115
+ }
116
+ catch (JsonException ex)
117
+ {
118
+ logger.LogError(ex, "Failed to parse AI response: {Response}", response);
119
+ throw new {Feature}ProcessingException("Failed to parse analysis response", ex);
120
+ }
121
+ }
122
+
123
+ private class AnalysisResponse
124
+ {
125
+ public string? Summary { get; set; }
126
+ public List<string>? Insights { get; set; }
127
+ public List<string>? Recommendations { get; set; }
128
+ public double ConfidenceScore { get; set; }
129
+ }
130
+
131
+ #endregion
132
+ }
133
+
134
+ // ============================================================
135
+ // DEPENDENCY INJECTION SETUP
136
+ // ============================================================
137
+ //
138
+ // In Program.cs:
139
+ //
140
+ // // Register IChatClient (Azure OpenAI with Managed Identity)
141
+ // builder.Services.AddSingleton<IChatClient>(sp =>
142
+ // {
143
+ // var cfg = sp.GetRequiredService<IConfiguration>();
144
+ // return new AzureOpenAIClient(
145
+ // new Uri(cfg["AzureOpenAI:Endpoint"]!),
146
+ // new DefaultAzureCredential())
147
+ // .GetChatClient(cfg["AzureOpenAI:DeploymentName"] ?? "gpt-4o-mini")
148
+ // .AsIChatClient();
149
+ // });
150
+ //
151
+ // // Option A: Register as scoped service
152
+ // builder.Services.AddScoped<I{Feature}AnalyzerAgent, {Feature}AnalyzerAgent>();
153
+ //
154
+ // // Option B: Register as keyed agent (recommended for multiple agents)
155
+ // builder.AddAIAgent("{Feature}Analyzer", (sp, key) =>
156
+ // {
157
+ // var chatClient = sp.GetRequiredService<IChatClient>();
158
+ // return new ChatClientAgent(chatClient,
159
+ // name: key,
160
+ // instructions: "You are an expert {Feature} analyst.");
161
+ // });
162
+ //
163
+ // ============================================================
@@ -0,0 +1,159 @@
1
+ # Checklist de Clarificação - {{FEATURE_NAME_TITLE}}
2
+
3
+ > Template para FASE 3: CLARIFY
4
+ > Use este checklist para identificar ambiguidades e fazer perguntas estruturadas
5
+
6
+ ---
7
+
8
+ ## 🎯 Contexto da Feature
9
+
10
+ **Feature:** {{FEATURE_NAME}}
11
+ **Fase atual:** CLARIFY
12
+ **Data:** {{DATE}}
13
+
14
+ ---
15
+
16
+ ## 📋 Checklist de Clarificação Padrão
17
+
18
+ ### 1. Fluxo de Usuário
19
+
20
+ - [ ] Existe fluxo gratuito vs pago?
21
+ - [ ] O que acontece em edge cases (erro, timeout, dados inválidos)?
22
+ - [ ] Qual o fluxo de primeiro acesso (onboarding)?
23
+ - [ ] Existem diferentes tipos de usuário com permissões diferentes?
24
+ - [ ] O que acontece se o usuário cancelar no meio do processo?
25
+
26
+ **Perguntas específicas:**
27
+ 1. _[Adicionar pergunta específica da feature]_
28
+ 2. _[Adicionar pergunta específica da feature]_
29
+
30
+ ---
31
+
32
+ ### 2. Integrações Externas
33
+
34
+ - [ ] Quais campos são obrigatórios para cada API externa?
35
+ - [ ] Há fallbacks se a API externa falhar?
36
+ - [ ] Qual o timeout aceitável para chamadas externas?
37
+ - [ ] Como tratar rate limiting?
38
+ - [ ] Precisa de webhook para eventos da API?
39
+
40
+ **Perguntas específicas:**
41
+ 1. _[Adicionar pergunta sobre integração]_
42
+ 2. _[Adicionar pergunta sobre integração]_
43
+
44
+ ---
45
+
46
+ ### 3. Dados e Persistência
47
+
48
+ - [ ] Qual a política de retenção de dados?
49
+ - [ ] Precisa de soft delete ou hard delete?
50
+ - [ ] Quais dados são sensíveis e precisam de criptografia?
51
+ - [ ] Precisa de histórico/auditoria de alterações?
52
+ - [ ] Qual o volume esperado de dados?
53
+
54
+ **Perguntas específicas:**
55
+ 1. _[Adicionar pergunta sobre dados]_
56
+ 2. _[Adicionar pergunta sobre dados]_
57
+
58
+ ---
59
+
60
+ ### 4. Performance e Escalabilidade
61
+
62
+ - [ ] Qual o SLA esperado (tempo de resposta)?
63
+ - [ ] Precisa de cache? Se sim, qual estratégia?
64
+ - [ ] Quantos usuários simultâneos são esperados?
65
+ - [ ] Existem operações que podem ser assíncronas?
66
+ - [ ] Precisa de paginação para listas grandes?
67
+
68
+ **Perguntas específicas:**
69
+ 1. _[Adicionar pergunta sobre performance]_
70
+ 2. _[Adicionar pergunta sobre performance]_
71
+
72
+ ---
73
+
74
+ ### 5. Segurança e Autorização
75
+
76
+ - [ ] Quem pode acessar esta funcionalidade?
77
+ - [ ] Existem diferentes níveis de permissão?
78
+ - [ ] Precisa de validação de ownership (usuário só vê seus dados)?
79
+ - [ ] Existem dados que não devem ser expostos em logs?
80
+ - [ ] Precisa de CAPTCHA ou proteção contra bots?
81
+
82
+ **Perguntas específicas:**
83
+ 1. _[Adicionar pergunta sobre segurança]_
84
+ 2. _[Adicionar pergunta sobre segurança]_
85
+
86
+ ---
87
+
88
+ ### 6. UI/UX (se aplicável)
89
+
90
+ - [ ] Qual o estado inicial da tela (vazia, loading, dados)?
91
+ - [ ] O que mostrar quando não há dados?
92
+ - [ ] Quais mensagens de erro/sucesso exibir?
93
+ - [ ] Precisa de confirmação antes de ações destrutivas?
94
+ - [ ] Como tratar formulários muito longos (wizard, seções)?
95
+
96
+ **Perguntas específicas:**
97
+ 1. _[Adicionar pergunta sobre UI]_
98
+ 2. _[Adicionar pergunta sobre UI]_
99
+
100
+ ---
101
+
102
+ ### 7. Notificações e Comunicação
103
+
104
+ - [ ] Precisa enviar email/SMS/push em algum momento?
105
+ - [ ] Quais eventos disparam notificações?
106
+ - [ ] O usuário pode configurar preferências de notificação?
107
+ - [ ] Precisa de notificações em tempo real (SignalR)?
108
+
109
+ **Perguntas específicas:**
110
+ 1. _[Adicionar pergunta sobre notificações]_
111
+
112
+ ---
113
+
114
+ ### 8. Regras de Negócio
115
+
116
+ - [ ] Existem validações específicas do domínio?
117
+ - [ ] Existem limites (máximo de itens, tamanho de arquivo, etc)?
118
+ - [ ] Existem estados/transições de status?
119
+ - [ ] Existem cálculos ou fórmulas específicas?
120
+ - [ ] Existem regras de agendamento (cron, jobs)?
121
+
122
+ **Perguntas específicas:**
123
+ 1. _[Adicionar pergunta sobre regras de negócio]_
124
+ 2. _[Adicionar pergunta sobre regras de negócio]_
125
+
126
+ ---
127
+
128
+ ## 📝 Respostas Coletadas
129
+
130
+ > Preencher com as respostas do usuário
131
+
132
+ | # | Pergunta | Resposta | Impacto no Spec |
133
+ |---|----------|----------|-----------------|
134
+ | 1 | | | |
135
+ | 2 | | | |
136
+ | 3 | | | |
137
+
138
+ ---
139
+
140
+ ## ✅ Ações Resultantes
141
+
142
+ - [ ] Atualizar spec.md com clarificações
143
+ - [ ] Adicionar edge cases identificados
144
+ - [ ] Atualizar contracts.cs se necessário
145
+ - [ ] Documentar decisões em decisions.md
146
+
147
+ ---
148
+
149
+ ## 🎯 Status
150
+
151
+ - **Total de perguntas:** _X_
152
+ - **Perguntas respondidas:** _Y_
153
+ - **Pendentes:** _Z_
154
+
155
+ **Pronto para avançar para FASE 4: TASKS?** [ ] Sim [ ] Não
156
+
157
+ ---
158
+
159
+ _Gerado por MORPH-SPEC Framework_
@@ -0,0 +1,74 @@
1
+ // ============================================================================
2
+ // {{FEATURE_NAME_TITLE}} - Commands (CQRS)
3
+ // Generated by MORPH-SPEC Framework
4
+ // ============================================================================
5
+
6
+ using MediatR;
7
+
8
+ namespace {{NAMESPACE}}.Application.Features.{{FEATURE_NAME_PASCAL}}.Commands;
9
+
10
+ // ============================================================================
11
+ // Create Command
12
+ // ============================================================================
13
+
14
+ /// <summary>
15
+ /// Command to create a new {{FEATURE_NAME_TITLE}}
16
+ /// </summary>
17
+ public record Create{{FEATURE_NAME_PASCAL}}Command : IRequest<Create{{FEATURE_NAME_PASCAL}}Result>
18
+ {
19
+ // TODO: Add required properties
20
+ // public required string Name { get; init; }
21
+ }
22
+
23
+ public record Create{{FEATURE_NAME_PASCAL}}Result
24
+ {
25
+ public bool IsSuccess { get; init; }
26
+ public int? Id { get; init; }
27
+ public string? Error { get; init; }
28
+
29
+ public static Create{{FEATURE_NAME_PASCAL}}Result Success(int id) => new() { IsSuccess = true, Id = id };
30
+ public static Create{{FEATURE_NAME_PASCAL}}Result Failure(string error) => new() { IsSuccess = false, Error = error };
31
+ }
32
+
33
+ // ============================================================================
34
+ // Update Command
35
+ // ============================================================================
36
+
37
+ /// <summary>
38
+ /// Command to update an existing {{FEATURE_NAME_TITLE}}
39
+ /// </summary>
40
+ public record Update{{FEATURE_NAME_PASCAL}}Command : IRequest<Update{{FEATURE_NAME_PASCAL}}Result>
41
+ {
42
+ public required int Id { get; init; }
43
+ // TODO: Add updatable properties
44
+ }
45
+
46
+ public record Update{{FEATURE_NAME_PASCAL}}Result
47
+ {
48
+ public bool IsSuccess { get; init; }
49
+ public string? Error { get; init; }
50
+
51
+ public static Update{{FEATURE_NAME_PASCAL}}Result Success() => new() { IsSuccess = true };
52
+ public static Update{{FEATURE_NAME_PASCAL}}Result Failure(string error) => new() { IsSuccess = false, Error = error };
53
+ }
54
+
55
+ // ============================================================================
56
+ // Delete Command
57
+ // ============================================================================
58
+
59
+ /// <summary>
60
+ /// Command to delete a {{FEATURE_NAME_TITLE}}
61
+ /// </summary>
62
+ public record Delete{{FEATURE_NAME_PASCAL}}Command : IRequest<Delete{{FEATURE_NAME_PASCAL}}Result>
63
+ {
64
+ public required int Id { get; init; }
65
+ }
66
+
67
+ public record Delete{{FEATURE_NAME_PASCAL}}Result
68
+ {
69
+ public bool IsSuccess { get; init; }
70
+ public string? Error { get; init; }
71
+
72
+ public static Delete{{FEATURE_NAME_PASCAL}}Result Success() => new() { IsSuccess = true };
73
+ public static Delete{{FEATURE_NAME_PASCAL}}Result Failure(string error) => new() { IsSuccess = false, Error = error };
74
+ }
@@ -0,0 +1,25 @@
1
+ // ============================================================================
2
+ // {{FEATURE_NAME_TITLE}} - Entity Interfaces
3
+ // Generated by MORPH-SPEC Framework
4
+ // ============================================================================
5
+
6
+ namespace {{NAMESPACE}}.Domain.Entities;
7
+
8
+ /// <summary>
9
+ /// Base interface for {{FEATURE_NAME_TITLE}} entity
10
+ /// </summary>
11
+ public interface I{{FEATURE_NAME_PASCAL}}Entity
12
+ {
13
+ int Id { get; }
14
+ DateTime CreatedAt { get; }
15
+ DateTime? UpdatedAt { get; }
16
+ }
17
+
18
+ // TODO: Add specific entity interfaces below
19
+ // Example:
20
+ // public interface IScheduledReport : I{{FEATURE_NAME_PASCAL}}Entity
21
+ // {
22
+ // string Name { get; }
23
+ // ReportType Type { get; }
24
+ // string CronExpression { get; }
25
+ // }
@@ -0,0 +1,74 @@
1
+ // ============================================================================
2
+ // {{FEATURE_NAME_TITLE}} - Queries (CQRS)
3
+ // Generated by MORPH-SPEC Framework
4
+ // ============================================================================
5
+
6
+ using MediatR;
7
+
8
+ namespace {{NAMESPACE}}.Application.Features.{{FEATURE_NAME_PASCAL}}.Queries;
9
+
10
+ // ============================================================================
11
+ // Get By Id Query
12
+ // ============================================================================
13
+
14
+ /// <summary>
15
+ /// Query to get a {{FEATURE_NAME_TITLE}} by ID
16
+ /// </summary>
17
+ public record Get{{FEATURE_NAME_PASCAL}}ByIdQuery : IRequest<{{FEATURE_NAME_PASCAL}}Dto?>
18
+ {
19
+ public required int Id { get; init; }
20
+ }
21
+
22
+ // ============================================================================
23
+ // Get All Query (with pagination)
24
+ // ============================================================================
25
+
26
+ /// <summary>
27
+ /// Query to get all {{FEATURE_NAME_TITLE}} with pagination
28
+ /// </summary>
29
+ public record Get{{FEATURE_NAME_PASCAL}}ListQuery : IRequest<{{FEATURE_NAME_PASCAL}}ListResult>
30
+ {
31
+ public int Page { get; init; } = 1;
32
+ public int PageSize { get; init; } = 10;
33
+ public string? SearchTerm { get; init; }
34
+ public string? SortBy { get; init; }
35
+ public bool SortDescending { get; init; }
36
+ }
37
+
38
+ public record {{FEATURE_NAME_PASCAL}}ListResult
39
+ {
40
+ public required IReadOnlyList<{{FEATURE_NAME_PASCAL}}Dto> Items { get; init; }
41
+ public int TotalCount { get; init; }
42
+ public int Page { get; init; }
43
+ public int PageSize { get; init; }
44
+ public int TotalPages => (int)Math.Ceiling(TotalCount / (double)PageSize);
45
+ public bool HasNextPage => Page < TotalPages;
46
+ public bool HasPreviousPage => Page > 1;
47
+ }
48
+
49
+ // ============================================================================
50
+ // DTOs
51
+ // ============================================================================
52
+
53
+ /// <summary>
54
+ /// DTO for {{FEATURE_NAME_TITLE}}
55
+ /// </summary>
56
+ public record {{FEATURE_NAME_PASCAL}}Dto
57
+ {
58
+ public int Id { get; init; }
59
+ public DateTime CreatedAt { get; init; }
60
+ public DateTime? UpdatedAt { get; init; }
61
+
62
+ // TODO: Add mapped properties from entity
63
+ // public string Name { get; init; } = string.Empty;
64
+ }
65
+
66
+ /// <summary>
67
+ /// Summary DTO for lists (less data)
68
+ /// </summary>
69
+ public record {{FEATURE_NAME_PASCAL}}SummaryDto
70
+ {
71
+ public int Id { get; init; }
72
+ // TODO: Add only essential properties for list display
73
+ // public string Name { get; init; } = string.Empty;
74
+ }