@polymorphism-tech/morph-spec 2.2.0 → 2.4.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 (251) hide show
  1. package/CLAUDE.md +314 -1673
  2. package/LICENSE +72 -72
  3. package/README.md +515 -516
  4. package/bin/detect-agents.js +225 -225
  5. package/bin/morph-spec.js +358 -173
  6. package/bin/render-template.js +302 -302
  7. package/bin/semantic-detect-agents.js +246 -246
  8. package/bin/task-manager.js +429 -0
  9. package/bin/validate-agents-skills.js +251 -251
  10. package/bin/validate-agents.js +69 -69
  11. package/bin/validate-phase.js +263 -263
  12. package/bin/validate.js +369 -0
  13. package/content/.azure/README.md +293 -293
  14. package/content/.azure/docs/azure-devops-setup.md +454 -454
  15. package/content/.azure/docs/branch-strategy.md +398 -398
  16. package/content/.azure/docs/local-development.md +515 -515
  17. package/content/.azure/pipelines/pipeline-variables.yml +34 -34
  18. package/content/.azure/pipelines/prod-pipeline.yml +319 -319
  19. package/content/.azure/pipelines/staging-pipeline.yml +234 -234
  20. package/content/.azure/pipelines/templates/build-dotnet.yml +75 -75
  21. package/content/.azure/pipelines/templates/deploy-app-service.yml +94 -94
  22. package/content/.azure/pipelines/templates/deploy-container-app.yml +120 -120
  23. package/content/.azure/pipelines/templates/infra-deploy.yml +90 -90
  24. package/content/.claude/commands/morph-apply.md +221 -158
  25. package/content/.claude/commands/morph-archive.md +79 -79
  26. package/content/.claude/commands/morph-infra.md +209 -209
  27. package/content/.claude/commands/morph-preflight.md +227 -0
  28. package/content/.claude/commands/morph-proposal.md +122 -101
  29. package/content/.claude/commands/morph-status.md +86 -86
  30. package/content/.claude/commands/morph-troubleshoot.md +122 -0
  31. package/content/.claude/settings.local.json +15 -15
  32. package/content/.claude/skills/checklists/code-review.md +226 -0
  33. package/content/.claude/skills/checklists/morph-checklist.md +117 -0
  34. package/content/.claude/skills/checklists/simulation-checklist.md +77 -0
  35. package/content/.claude/skills/infra/bicep-architect.md +126 -419
  36. package/content/.claude/skills/infra/container-specialist.md +131 -437
  37. package/content/.claude/skills/infra/devops-engineer.md +119 -405
  38. package/content/.claude/skills/integrations/asaas-financial.md +130 -333
  39. package/content/.claude/skills/integrations/azure-identity.md +142 -309
  40. package/content/.claude/skills/integrations/clerk-auth.md +108 -290
  41. package/content/.claude/skills/integrations/resend-email.md +119 -0
  42. package/content/.claude/skills/specialists/ai-system-architect.md +192 -604
  43. package/content/.claude/skills/specialists/azure-architect.md +142 -142
  44. package/content/.claude/skills/specialists/code-analyzer.md +235 -0
  45. package/content/.claude/skills/specialists/dotnet-senior.md +287 -0
  46. package/content/.claude/skills/specialists/ef-modeler.md +113 -200
  47. package/content/.claude/skills/specialists/hangfire-orchestrator.md +126 -245
  48. package/content/.claude/skills/specialists/ms-agent-expert.md +109 -263
  49. package/content/.claude/skills/specialists/po-pm-advisor.md +197 -197
  50. package/content/.claude/skills/specialists/standards-architect.md +156 -78
  51. package/content/.claude/skills/specialists/testing-specialist.md +126 -0
  52. package/content/.claude/skills/specialists/ui-ux-designer.md +191 -1060
  53. package/content/.claude/skills/stacks/dotnet-blazor.md +210 -588
  54. package/content/.claude/skills/stacks/dotnet-nextjs.md +154 -402
  55. package/content/.claude/skills/workflows/morph-replicate.md +213 -0
  56. package/content/.claude/{commands/morph-clarify.md → skills/workflows/phase-clarify.md} +5 -58
  57. package/content/.claude/{commands/morph-design.md → skills/workflows/phase-design.md} +16 -86
  58. package/content/.claude/{commands/morph-setup.md → skills/workflows/phase-setup.md} +9 -17
  59. package/content/.claude/skills/workflows/phase-tasks.md +164 -0
  60. package/content/.claude/{commands/morph-uiux.md → skills/workflows/phase-uiux.md} +15 -88
  61. package/content/.morph/.morphversion +5 -5
  62. package/content/.morph/archive/.gitkeep +25 -25
  63. package/content/.morph/config/agents.json +378 -242
  64. package/content/.morph/config/config.template.json +89 -108
  65. package/content/.morph/docs/STORY-DRIVEN-DEVELOPMENT.md +392 -392
  66. package/content/.morph/docs/workflows/design-impl.md +37 -0
  67. package/content/.morph/docs/workflows/fast-track.md +29 -0
  68. package/content/.morph/docs/workflows/full-morph.md +76 -0
  69. package/content/.morph/docs/workflows/standard.md +44 -0
  70. package/content/.morph/docs/workflows/ui-refresh.md +39 -0
  71. package/content/.morph/examples/api-nextjs/README.md +241 -241
  72. package/content/.morph/examples/api-nextjs/contracts.ts +307 -307
  73. package/content/.morph/examples/api-nextjs/spec.md +399 -399
  74. package/content/.morph/examples/api-nextjs/tasks.md +168 -168
  75. package/content/.morph/examples/micro-saas/README.md +125 -125
  76. package/content/.morph/examples/micro-saas/contracts.cs +358 -358
  77. package/content/.morph/examples/micro-saas/decisions.md +246 -246
  78. package/content/.morph/examples/micro-saas/spec.md +236 -236
  79. package/content/.morph/examples/micro-saas/tasks.md +150 -150
  80. package/content/.morph/examples/multi-agent/README.md +309 -309
  81. package/content/.morph/examples/multi-agent/contracts.cs +433 -433
  82. package/content/.morph/examples/multi-agent/spec.md +479 -479
  83. package/content/.morph/examples/multi-agent/tasks.md +185 -185
  84. package/content/.morph/examples/scheduled-reports/decisions.md +158 -0
  85. package/content/.morph/examples/scheduled-reports/proposal.md +95 -0
  86. package/content/.morph/examples/scheduled-reports/spec.md +267 -0
  87. package/content/.morph/examples/state-v3.json +188 -0
  88. package/content/.morph/features/.gitkeep +25 -25
  89. package/content/.morph/hooks/README.md +190 -239
  90. package/content/.morph/hooks/pre-commit-agents.sh +24 -24
  91. package/content/.morph/hooks/pre-commit-all.sh +48 -48
  92. package/content/.morph/hooks/pre-commit-specs.sh +49 -49
  93. package/content/.morph/hooks/pre-commit-tests.sh +60 -60
  94. package/content/.morph/project.md +160 -160
  95. package/content/.morph/schemas/agent.schema.json +296 -296
  96. package/content/.morph/schemas/tasks.schema.json +220 -0
  97. package/content/.morph/specs/.gitkeep +20 -20
  98. package/content/.morph/standards/agent-framework-blazor-ui.md +359 -0
  99. package/content/.morph/standards/agent-framework-production.md +410 -0
  100. package/content/.morph/standards/agent-framework-setup.md +413 -453
  101. package/content/.morph/standards/agent-framework-workflows.md +349 -0
  102. package/content/.morph/standards/architecture.md +325 -325
  103. package/content/.morph/standards/azure.md +605 -379
  104. package/content/.morph/standards/coding.md +377 -377
  105. package/content/.morph/standards/dotnet10-migration.md +520 -494
  106. package/content/.morph/standards/fluent-ui-setup.md +590 -590
  107. package/content/.morph/standards/migration-guide.md +514 -514
  108. package/content/.morph/standards/passkeys-auth.md +423 -423
  109. package/content/.morph/standards/vector-search-rag.md +536 -536
  110. package/content/.morph/state.json +17 -17
  111. package/content/.morph/templates/FluentDesignTheme.cs +149 -149
  112. package/content/.morph/templates/MudTheme.cs +281 -281
  113. package/content/.morph/templates/agent.cs +163 -172
  114. package/content/.morph/templates/clarify-questions.md +159 -0
  115. package/content/.morph/templates/component.razor +239 -239
  116. package/content/.morph/templates/contracts/Commands.cs +74 -0
  117. package/content/.morph/templates/contracts/Entities.cs +25 -0
  118. package/content/.morph/templates/contracts/Queries.cs +74 -0
  119. package/content/.morph/templates/contracts/README.md +74 -0
  120. package/content/.morph/templates/contracts.cs +217 -217
  121. package/content/.morph/templates/decisions.md +123 -106
  122. package/content/.morph/templates/design-system.css +226 -226
  123. package/content/.morph/templates/infra/.dockerignore.example +89 -89
  124. package/content/.morph/templates/infra/Dockerfile.example +82 -82
  125. package/content/.morph/templates/infra/README.md +286 -286
  126. package/content/.morph/templates/infra/app-insights.bicep +63 -63
  127. package/content/.morph/templates/infra/app-service.bicep +164 -164
  128. package/content/.morph/templates/infra/container-app-env.bicep +49 -49
  129. package/content/.morph/templates/infra/container-app.bicep +156 -156
  130. package/content/.morph/templates/infra/deploy-checklist.md +426 -0
  131. package/content/.morph/templates/infra/deploy.ps1 +229 -229
  132. package/content/.morph/templates/infra/deploy.sh +208 -208
  133. package/content/.morph/templates/infra/key-vault.bicep +91 -91
  134. package/content/.morph/templates/infra/main.bicep +189 -189
  135. package/content/.morph/templates/infra/parameters.dev.json +29 -29
  136. package/content/.morph/templates/infra/parameters.prod.json +29 -29
  137. package/content/.morph/templates/infra/parameters.staging.json +29 -29
  138. package/content/.morph/templates/infra/sql-database.bicep +103 -103
  139. package/content/.morph/templates/infra/storage.bicep +106 -106
  140. package/content/.morph/templates/integrations/asaas-client.cs +387 -387
  141. package/content/.morph/templates/integrations/asaas-webhook.cs +351 -351
  142. package/content/.morph/templates/integrations/azure-identity-config.cs +288 -288
  143. package/content/.morph/templates/integrations/clerk-config.cs +258 -258
  144. package/content/.morph/templates/job.cs +171 -171
  145. package/content/.morph/templates/migration.cs +83 -83
  146. package/content/.morph/templates/proposal.md +141 -155
  147. package/content/.morph/templates/recap.md +94 -105
  148. package/content/.morph/templates/repository.cs +141 -141
  149. package/content/.morph/templates/saas/subscription.cs +347 -347
  150. package/content/.morph/templates/saas/tenant.cs +338 -338
  151. package/content/.morph/templates/service.cs +139 -139
  152. package/content/.morph/templates/simulation.md +353 -0
  153. package/content/.morph/templates/spec.md +149 -148
  154. package/content/.morph/templates/sprint-status.yaml +68 -68
  155. package/content/.morph/templates/state.template.json +222 -222
  156. package/content/.morph/templates/story.md +143 -143
  157. package/content/.morph/templates/tasks.md +257 -235
  158. package/content/.morph/templates/test.cs +239 -239
  159. package/content/.morph/templates/ui-components.md +362 -276
  160. package/content/.morph/templates/ui-design-system.md +286 -286
  161. package/content/.morph/templates/ui-flows.md +336 -336
  162. package/content/.morph/templates/ui-mockups.md +133 -133
  163. package/content/.morph/test-infra/example.bicep +59 -59
  164. package/content/CLAUDE.md +150 -442
  165. package/content/README.md +79 -79
  166. package/detectors/config-detector.js +223 -223
  167. package/detectors/conversation-analyzer.js +163 -163
  168. package/detectors/index.js +84 -84
  169. package/detectors/standards-generator.js +275 -275
  170. package/detectors/structure-detector.js +245 -250
  171. package/docs/README.md +144 -149
  172. package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.svg +977 -977
  173. package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.svg +1048 -1048
  174. package/docs/api/scripts/collapse.js +38 -38
  175. package/docs/api/scripts/commonNav.js +28 -28
  176. package/docs/api/scripts/linenumber.js +25 -25
  177. package/docs/api/scripts/nav.js +12 -12
  178. package/docs/api/scripts/polyfill.js +3 -3
  179. package/docs/api/scripts/prettify/Apache-License-2.0.txt +202 -202
  180. package/docs/api/scripts/prettify/lang-css.js +2 -2
  181. package/docs/api/scripts/prettify/prettify.js +28 -28
  182. package/docs/api/scripts/search.js +98 -98
  183. package/docs/api/styles/jsdoc.css +776 -776
  184. package/docs/api/styles/prettify.css +80 -80
  185. package/docs/examples.md +328 -328
  186. package/docs/getting-started.md +301 -302
  187. package/docs/installation.md +361 -361
  188. package/docs/templates.md +418 -418
  189. package/docs/validation-checklist.md +265 -266
  190. package/package.json +80 -80
  191. package/scripts/postinstall.js +132 -132
  192. package/src/commands/advance-phase.js +183 -0
  193. package/src/commands/analyze-blazor-concurrency.js +193 -0
  194. package/src/commands/create-story.js +351 -351
  195. package/src/commands/detect-agents.js +139 -0
  196. package/src/commands/detect.js +104 -104
  197. package/src/commands/doctor.js +356 -280
  198. package/src/commands/generate.js +149 -149
  199. package/src/commands/init.js +258 -245
  200. package/src/commands/lint-fluent.js +352 -0
  201. package/src/commands/rollback-phase.js +185 -0
  202. package/src/commands/session-summary.js +291 -0
  203. package/src/commands/shard-spec.js +224 -224
  204. package/src/commands/sprint-status.js +250 -250
  205. package/src/commands/state.js +333 -333
  206. package/src/commands/sync.js +167 -167
  207. package/src/commands/task.js +78 -0
  208. package/src/commands/troubleshoot.js +222 -0
  209. package/src/commands/update.js +192 -159
  210. package/src/commands/validate-blazor-state.js +210 -0
  211. package/src/commands/validate-blazor.js +156 -0
  212. package/src/commands/validate-css.js +84 -0
  213. package/src/commands/validate-phase.js +221 -0
  214. package/src/lib/blazor-concurrency-analyzer.js +288 -0
  215. package/src/lib/blazor-state-validator.js +291 -0
  216. package/src/lib/blazor-validator.js +374 -0
  217. package/src/lib/complexity-analyzer.js +441 -292
  218. package/src/lib/continuous-validator.js +421 -0
  219. package/src/lib/css-validator.js +352 -0
  220. package/src/lib/decision-constraint-loader.js +109 -0
  221. package/src/lib/design-system-generator.js +298 -298
  222. package/src/lib/learning-system.js +520 -0
  223. package/src/lib/mockup-generator.js +366 -0
  224. package/src/lib/recap-generator.js +205 -0
  225. package/src/lib/state-manager.js +397 -340
  226. package/src/lib/troubleshoot-grep.js +194 -0
  227. package/src/lib/troubleshoot-index.js +144 -0
  228. package/src/lib/ui-detector.js +350 -0
  229. package/src/lib/validation-runner.js +231 -0
  230. package/src/lib/validators/architecture-validator.js +387 -0
  231. package/src/lib/validators/contract-compliance-validator.js +273 -0
  232. package/src/lib/validators/package-validator.js +360 -0
  233. package/src/lib/validators/ui-contrast-validator.js +422 -0
  234. package/src/utils/file-copier.js +179 -139
  235. package/src/utils/logger.js +32 -32
  236. package/src/utils/version-checker.js +175 -175
  237. package/content/.claude/commands/morph-costs.md +0 -206
  238. package/content/.claude/commands/morph-tasks.md +0 -319
  239. package/content/.claude/skills/specialists/cost-guardian.md +0 -110
  240. package/content/.claude/skills/stacks/shopify.md +0 -445
  241. package/content/.morph/config/azure-pricing.json +0 -70
  242. package/content/.morph/config/azure-pricing.schema.json +0 -50
  243. package/content/.morph/hooks/pre-commit-costs.sh +0 -91
  244. package/docs/api/cost-calculator.js.html +0 -513
  245. package/docs/api/design-system-generator.js.html +0 -382
  246. package/docs/api/global.html +0 -5263
  247. package/docs/api/index.html +0 -96
  248. package/docs/api/state-manager.js.html +0 -423
  249. package/src/commands/cost.js +0 -181
  250. package/src/commands/update-pricing.js +0 -206
  251. 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_