@polymorphism-tech/morph-spec 1.0.2 → 2.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.
- package/CLAUDE.md +1381 -0
- package/LICENSE +72 -0
- package/README.md +114 -12
- package/bin/detect-agents.js +225 -0
- package/bin/morph-spec.js +120 -0
- package/bin/render-template.js +302 -0
- package/bin/semantic-detect-agents.js +246 -0
- package/bin/validate-agents-skills.js +239 -0
- package/bin/validate-agents.js +69 -0
- package/bin/validate-phase.js +263 -0
- package/content/.azure/README.md +293 -0
- package/content/.azure/docs/azure-devops-setup.md +454 -0
- package/content/.azure/docs/branch-strategy.md +398 -0
- package/content/.azure/docs/local-development.md +515 -0
- package/content/.azure/pipelines/pipeline-variables.yml +34 -0
- package/content/.azure/pipelines/prod-pipeline.yml +319 -0
- package/content/.azure/pipelines/staging-pipeline.yml +234 -0
- package/content/.azure/pipelines/templates/build-dotnet.yml +75 -0
- package/content/.azure/pipelines/templates/deploy-app-service.yml +94 -0
- package/content/.azure/pipelines/templates/deploy-container-app.yml +120 -0
- package/content/.azure/pipelines/templates/infra-deploy.yml +90 -0
- package/content/.claude/commands/morph-apply.md +118 -26
- package/content/.claude/commands/morph-archive.md +9 -9
- package/content/.claude/commands/morph-clarify.md +184 -0
- package/content/.claude/commands/morph-design.md +275 -0
- package/content/.claude/commands/morph-proposal.md +56 -15
- package/content/.claude/commands/morph-setup.md +100 -0
- package/content/.claude/commands/morph-status.md +47 -32
- package/content/.claude/commands/morph-tasks.md +319 -0
- package/content/.claude/commands/morph-uiux.md +211 -0
- package/content/.claude/skills/specialists/ai-system-architect.md +604 -0
- package/content/.claude/skills/specialists/ms-agent-expert.md +143 -89
- package/content/.claude/skills/specialists/ui-ux-designer.md +744 -9
- package/content/.claude/skills/stacks/dotnet-blazor.md +244 -8
- package/content/.claude/skills/stacks/dotnet-nextjs.md +2 -2
- package/content/.morph/.morphversion +5 -0
- package/content/.morph/config/agents.json +101 -8
- package/content/.morph/config/azure-pricing.json +70 -0
- package/content/.morph/config/azure-pricing.schema.json +50 -0
- package/content/.morph/config/config.template.json +15 -3
- package/content/.morph/docs/STORY-DRIVEN-DEVELOPMENT.md +392 -0
- package/content/.morph/hooks/README.md +239 -0
- package/content/.morph/hooks/pre-commit-agents.sh +24 -0
- package/content/.morph/hooks/pre-commit-all.sh +48 -0
- package/content/.morph/hooks/pre-commit-costs.sh +91 -0
- package/content/.morph/hooks/pre-commit-specs.sh +49 -0
- package/content/.morph/hooks/pre-commit-tests.sh +60 -0
- package/content/.morph/project.md +5 -4
- package/content/.morph/schemas/agent.schema.json +296 -0
- package/content/.morph/standards/agent-framework-setup.md +453 -0
- package/content/.morph/standards/architecture.md +142 -7
- package/content/.morph/standards/azure.md +218 -23
- package/content/.morph/standards/coding.md +47 -12
- package/content/.morph/standards/dotnet10-migration.md +494 -0
- package/content/.morph/standards/fluent-ui-setup.md +590 -0
- package/content/.morph/standards/migration-guide.md +514 -0
- package/content/.morph/standards/passkeys-auth.md +423 -0
- package/content/.morph/standards/vector-search-rag.md +536 -0
- package/content/.morph/state.json +18 -0
- package/content/.morph/templates/FluentDesignTheme.cs +149 -0
- package/content/.morph/templates/MudTheme.cs +281 -0
- package/content/.morph/templates/contracts.cs +55 -55
- package/content/.morph/templates/decisions.md +4 -4
- package/content/.morph/templates/design-system.css +226 -0
- package/content/.morph/templates/infra/.dockerignore.example +89 -0
- package/content/.morph/templates/infra/Dockerfile.example +82 -0
- package/content/.morph/templates/infra/README.md +286 -0
- package/content/.morph/templates/infra/app-service.bicep +164 -0
- package/content/.morph/templates/infra/deploy.ps1 +229 -0
- package/content/.morph/templates/infra/deploy.sh +208 -0
- package/content/.morph/templates/infra/main.bicep +41 -7
- package/content/.morph/templates/infra/parameters.dev.json +6 -0
- package/content/.morph/templates/infra/parameters.prod.json +6 -0
- package/content/.morph/templates/infra/parameters.staging.json +29 -0
- package/content/.morph/templates/proposal.md +3 -3
- package/content/.morph/templates/recap.md +3 -3
- package/content/.morph/templates/spec.md +9 -8
- package/content/.morph/templates/sprint-status.yaml +68 -0
- package/content/.morph/templates/state.template.json +222 -0
- package/content/.morph/templates/story.md +143 -0
- package/content/.morph/templates/tasks.md +1 -1
- package/content/.morph/templates/ui-components.md +276 -0
- package/content/.morph/templates/ui-design-system.md +286 -0
- package/content/.morph/templates/ui-flows.md +336 -0
- package/content/.morph/templates/ui-mockups.md +133 -0
- package/content/.morph/test-infra/example.bicep +59 -0
- package/content/CLAUDE.md +124 -0
- package/content/README.md +79 -0
- package/detectors/config-detector.js +223 -0
- package/detectors/conversation-analyzer.js +163 -0
- package/detectors/index.js +84 -0
- package/detectors/standards-generator.js +275 -0
- package/detectors/structure-detector.js +221 -0
- package/docs/README.md +149 -0
- package/docs/api/cost-calculator.js.html +513 -0
- package/docs/api/design-system-generator.js.html +382 -0
- package/docs/api/fonts/Montserrat/Montserrat-Bold.eot +0 -0
- package/docs/api/fonts/Montserrat/Montserrat-Bold.ttf +0 -0
- package/docs/api/fonts/Montserrat/Montserrat-Bold.woff +0 -0
- package/docs/api/fonts/Montserrat/Montserrat-Bold.woff2 +0 -0
- package/docs/api/fonts/Montserrat/Montserrat-Regular.eot +0 -0
- package/docs/api/fonts/Montserrat/Montserrat-Regular.ttf +0 -0
- package/docs/api/fonts/Montserrat/Montserrat-Regular.woff +0 -0
- package/docs/api/fonts/Montserrat/Montserrat-Regular.woff2 +0 -0
- package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.eot +0 -0
- package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.svg +978 -0
- package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.ttf +0 -0
- package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.woff +0 -0
- package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.woff2 +0 -0
- package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.eot +0 -0
- package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.svg +1049 -0
- package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.ttf +0 -0
- package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.woff +0 -0
- package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.woff2 +0 -0
- package/docs/api/global.html +5263 -0
- package/docs/api/index.html +96 -0
- package/docs/api/scripts/collapse.js +39 -0
- package/docs/api/scripts/commonNav.js +28 -0
- package/docs/api/scripts/linenumber.js +25 -0
- package/docs/api/scripts/nav.js +12 -0
- package/docs/api/scripts/polyfill.js +4 -0
- package/docs/api/scripts/prettify/Apache-License-2.0.txt +202 -0
- package/docs/api/scripts/prettify/lang-css.js +2 -0
- package/docs/api/scripts/prettify/prettify.js +28 -0
- package/docs/api/scripts/search.js +99 -0
- package/docs/api/state-manager.js.html +423 -0
- package/docs/api/styles/jsdoc.css +776 -0
- package/docs/api/styles/prettify.css +80 -0
- package/docs/examples.md +328 -0
- package/docs/getting-started.md +302 -0
- package/docs/installation.md +361 -0
- package/docs/templates.md +418 -0
- package/docs/validation-checklist.md +266 -0
- package/package.json +39 -12
- package/src/commands/cost.js +181 -0
- package/src/commands/create-story.js +283 -0
- package/src/commands/detect.js +104 -0
- package/src/commands/doctor.js +67 -0
- package/src/commands/generate.js +149 -0
- package/src/commands/init.js +71 -46
- package/src/commands/shard-spec.js +224 -0
- package/src/commands/sprint-status.js +250 -0
- package/src/commands/state.js +333 -0
- package/src/commands/sync.js +167 -0
- package/src/commands/update-pricing.js +206 -0
- package/src/commands/update.js +88 -13
- package/src/lib/complexity-analyzer.js +292 -0
- package/src/lib/cost-calculator.js +429 -0
- package/src/lib/design-system-generator.js +298 -0
- package/src/lib/state-manager.js +340 -0
- package/src/utils/file-copier.js +63 -0
- package/src/utils/version-checker.js +175 -0
|
@@ -0,0 +1,494 @@
|
|
|
1
|
+
# Guia de Migração .NET 9 → .NET 10
|
|
2
|
+
|
|
3
|
+
> Atualização completa do MORPH-SPEC para .NET 10 com foco em produtividade e AI.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 📋 Checklist Rápido
|
|
8
|
+
|
|
9
|
+
### 1. Atualizar TargetFramework
|
|
10
|
+
|
|
11
|
+
```xml
|
|
12
|
+
<!-- Antes (.csproj) -->
|
|
13
|
+
<TargetFramework>net9.0</TargetFramework>
|
|
14
|
+
|
|
15
|
+
<!-- Depois -->
|
|
16
|
+
<TargetFramework>net10.0</TargetFramework>
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
### 2. Atualizar Packages
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
dotnet list package --outdated
|
|
23
|
+
dotnet add package Microsoft.EntityFrameworkCore.SqlServer --version 10.0.0
|
|
24
|
+
dotnet add package Microsoft.AspNetCore.Components.WebAssembly --version 10.0.0
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
### 3. Atualizar SDK
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
dotnet --version # Verificar
|
|
31
|
+
# Instalar .NET 10 SDK de https://dot.net
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### 4. Build e Testes
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
dotnet clean
|
|
38
|
+
dotnet build
|
|
39
|
+
dotnet test
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## 🚀 Breaking Changes Críticos
|
|
45
|
+
|
|
46
|
+
### 1. Semantic Kernel → Agent Framework
|
|
47
|
+
|
|
48
|
+
**ANTES (.NET 9 com Semantic Kernel):**
|
|
49
|
+
```csharp
|
|
50
|
+
using Microsoft.SemanticKernel;
|
|
51
|
+
|
|
52
|
+
var builder = Kernel.CreateBuilder();
|
|
53
|
+
builder.AddAzureOpenAIChatCompletion(...);
|
|
54
|
+
var kernel = builder.Build();
|
|
55
|
+
|
|
56
|
+
var prompt = kernel.CreateFunctionFromPrompt("Analyze this data...");
|
|
57
|
+
var result = await kernel.InvokeAsync(prompt, new() { ["data"] = data });
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
**DEPOIS (.NET 10 com Agent Framework):**
|
|
61
|
+
```csharp
|
|
62
|
+
using Microsoft.Agents.AI;
|
|
63
|
+
using Microsoft.Extensions.AI;
|
|
64
|
+
|
|
65
|
+
var chatClient = new ChatClient(
|
|
66
|
+
model: "gpt-4o-mini",
|
|
67
|
+
credential: new ApiKeyCredential(apiKey),
|
|
68
|
+
endpoint: new Uri(endpoint)
|
|
69
|
+
);
|
|
70
|
+
|
|
71
|
+
var agent = chatClient.CreateAgent(
|
|
72
|
+
instructions: "Analyze the provided data...",
|
|
73
|
+
name: "DataAnalyzer"
|
|
74
|
+
);
|
|
75
|
+
|
|
76
|
+
var response = await agent.RunAsync($"Analyze this data: {data}");
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
**Ação obrigatória:** Reescrever todo código de AI para usar Agent Framework.
|
|
80
|
+
|
|
81
|
+
### 2. ChatHistory → Threads
|
|
82
|
+
|
|
83
|
+
**ANTES:**
|
|
84
|
+
```csharp
|
|
85
|
+
var history = new ChatHistory();
|
|
86
|
+
history.AddUserMessage("Hello");
|
|
87
|
+
var response = await kernel.InvokeAsync(function, new() { ["history"] = history });
|
|
88
|
+
history.AddAssistantMessage(response.GetValue<string>());
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
**DEPOIS:**
|
|
92
|
+
```csharp
|
|
93
|
+
var agent = chatClient.CreateAgent(...);
|
|
94
|
+
var thread = await agent.CreateThreadAsync();
|
|
95
|
+
|
|
96
|
+
await thread.AddMessageAsync("Hello");
|
|
97
|
+
var response = await agent.RunAsync(thread);
|
|
98
|
+
// Histórico mantido automaticamente no thread
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### 3. Plugins → Tools (Manual Registration)
|
|
102
|
+
|
|
103
|
+
**ANTES (automático):**
|
|
104
|
+
```csharp
|
|
105
|
+
kernel.Plugins.AddFromObject(new OrderPlugin());
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
**DEPOIS (manual):**
|
|
109
|
+
```csharp
|
|
110
|
+
var agent = chatClient.CreateAgent(
|
|
111
|
+
instructions: "...",
|
|
112
|
+
tools: new[]
|
|
113
|
+
{
|
|
114
|
+
AgentTool.FromMethod(nameof(GetOrder), this),
|
|
115
|
+
AgentTool.FromMethod(nameof(CalculateDiscount), this)
|
|
116
|
+
}
|
|
117
|
+
);
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
## ✨ Novas Features para Aproveitar
|
|
123
|
+
|
|
124
|
+
### 1. State Persistence (Blazor)
|
|
125
|
+
|
|
126
|
+
**Como usar:**
|
|
127
|
+
```csharp
|
|
128
|
+
@page "/counter"
|
|
129
|
+
|
|
130
|
+
<button @onclick="Increment">Count: @Count</button>
|
|
131
|
+
|
|
132
|
+
@code {
|
|
133
|
+
// ANTES
|
|
134
|
+
// private int _count = 0;
|
|
135
|
+
|
|
136
|
+
// AGORA - persiste automaticamente em pre-rendering
|
|
137
|
+
[PersistentState]
|
|
138
|
+
private int Count { get; set; } = 0;
|
|
139
|
+
|
|
140
|
+
private void Increment() => Count++;
|
|
141
|
+
}
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
**Quando usar:** Componentes com estado que precisam sobreviver a pre-rendering ou circuit disconnections.
|
|
145
|
+
|
|
146
|
+
### 2. Circuit Pause/Resume
|
|
147
|
+
|
|
148
|
+
**Como usar:**
|
|
149
|
+
```razor
|
|
150
|
+
@inject IJSRuntime JS
|
|
151
|
+
|
|
152
|
+
@code {
|
|
153
|
+
protected override async Task OnAfterRenderAsync(bool firstRender)
|
|
154
|
+
{
|
|
155
|
+
if (firstRender)
|
|
156
|
+
{
|
|
157
|
+
await JS.InvokeVoidAsync("setupCircuitPause");
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
```javascript
|
|
164
|
+
// wwwroot/app.js
|
|
165
|
+
function setupCircuitPause() {
|
|
166
|
+
document.addEventListener('visibilitychange', () => {
|
|
167
|
+
if (document.hidden) {
|
|
168
|
+
Blazor.pauseCircuit(); // Libera recursos do servidor
|
|
169
|
+
} else {
|
|
170
|
+
Blazor.resumeCircuit(); // Restaura estado
|
|
171
|
+
}
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
**Quando usar:** Aplicações com muitos usuários simultâneos para otimizar recursos.
|
|
177
|
+
|
|
178
|
+
### 3. Passkeys/WebAuthn
|
|
179
|
+
|
|
180
|
+
**Como usar:**
|
|
181
|
+
```bash
|
|
182
|
+
# Novo projeto
|
|
183
|
+
dotnet new blazor --auth Individual -o MyApp
|
|
184
|
+
|
|
185
|
+
# Projeto existente
|
|
186
|
+
dotnet aspnet-codegenerator identity --useDefaultUI --files "Account.Manage.Passkeys;Account.Login"
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
**Quando usar:** Sempre que possível para melhor segurança.
|
|
190
|
+
|
|
191
|
+
### 4. Vector Search
|
|
192
|
+
|
|
193
|
+
**Como usar:**
|
|
194
|
+
```csharp
|
|
195
|
+
// Entidade
|
|
196
|
+
public class Document
|
|
197
|
+
{
|
|
198
|
+
public int Id { get; set; }
|
|
199
|
+
public string Content { get; set; } = null!;
|
|
200
|
+
public ReadOnlyMemory<float> Embedding { get; set; }
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
// DbContext
|
|
204
|
+
modelBuilder.Entity<Document>()
|
|
205
|
+
.Property(d => d.Embedding)
|
|
206
|
+
.HasColumnType("vector(1536)");
|
|
207
|
+
|
|
208
|
+
// Query
|
|
209
|
+
var results = await _context.Documents
|
|
210
|
+
.Select(d => new {
|
|
211
|
+
Document = d,
|
|
212
|
+
Distance = EF.Functions.VectorDistance(d.Embedding, queryVector, DistanceFunction.Cosine)
|
|
213
|
+
})
|
|
214
|
+
.OrderBy(r => r.Distance)
|
|
215
|
+
.Take(5)
|
|
216
|
+
.ToListAsync();
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
**Quando usar:** RAG, busca semântica, recomendações.
|
|
220
|
+
|
|
221
|
+
---
|
|
222
|
+
|
|
223
|
+
## 🎯 C# 14 Features
|
|
224
|
+
|
|
225
|
+
### 1. Field-Backed Properties
|
|
226
|
+
|
|
227
|
+
**ANTES:**
|
|
228
|
+
```csharp
|
|
229
|
+
private string _name = "";
|
|
230
|
+
public string Name
|
|
231
|
+
{
|
|
232
|
+
get => _name;
|
|
233
|
+
set => _name = value?.Trim() ?? "";
|
|
234
|
+
}
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
**AGORA:**
|
|
238
|
+
```csharp
|
|
239
|
+
public string Name
|
|
240
|
+
{
|
|
241
|
+
get => field;
|
|
242
|
+
set => field = value?.Trim() ?? "";
|
|
243
|
+
}
|
|
244
|
+
// 'field' é keyword contextual para o backing field
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
### 2. Null-Conditional Assignment
|
|
248
|
+
|
|
249
|
+
**ANTES:**
|
|
250
|
+
```csharp
|
|
251
|
+
if (customer != null)
|
|
252
|
+
{
|
|
253
|
+
customer.Name = "New Name";
|
|
254
|
+
}
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
**AGORA:**
|
|
258
|
+
```csharp
|
|
259
|
+
customer?.Name = "New Name";
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
### 3. Partial Constructors
|
|
263
|
+
|
|
264
|
+
```csharp
|
|
265
|
+
public partial class Order
|
|
266
|
+
{
|
|
267
|
+
public partial Order(int customerId); // Declaração
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
// Outra parte do partial
|
|
271
|
+
public partial class Order
|
|
272
|
+
{
|
|
273
|
+
public partial Order(int customerId) // Implementação
|
|
274
|
+
{
|
|
275
|
+
CustomerId = customerId;
|
|
276
|
+
CreatedAt = DateTime.UtcNow;
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
---
|
|
282
|
+
|
|
283
|
+
## ⚡ Performance Wins Automáticos
|
|
284
|
+
|
|
285
|
+
### Apenas fazer upgrade gera melhorias:
|
|
286
|
+
|
|
287
|
+
| Área | Melhoria | Sem código |
|
|
288
|
+
|------|----------|------------|
|
|
289
|
+
| **Blazor WebAssembly rendering** | 20% mais rápido | ✅ |
|
|
290
|
+
| **Hot reload** | 10x mais rápido | ✅ |
|
|
291
|
+
| **Response times** | 49% mais rápido (vs .NET 8) | ✅ |
|
|
292
|
+
| **GC overhead** | Reduzido (stack allocation) | ✅ |
|
|
293
|
+
|
|
294
|
+
**Ação:** Apenas compile em .NET 10 e rode benchmarks.
|
|
295
|
+
|
|
296
|
+
---
|
|
297
|
+
|
|
298
|
+
## 🔧 Migração Passo a Passo
|
|
299
|
+
|
|
300
|
+
### Passo 1: Preparação (1 dia)
|
|
301
|
+
|
|
302
|
+
```bash
|
|
303
|
+
# 1. Criar branch
|
|
304
|
+
git checkout -b upgrade-dotnet10
|
|
305
|
+
|
|
306
|
+
# 2. Backup do banco
|
|
307
|
+
# (Azure SQL: export bacpac)
|
|
308
|
+
|
|
309
|
+
# 3. Atualizar SDK global
|
|
310
|
+
dotnet --version
|
|
311
|
+
|
|
312
|
+
# 4. Atualizar ferramentas
|
|
313
|
+
dotnet tool update --global dotnet-ef
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
### Passo 2: Atualizar Projetos (2-3 dias)
|
|
317
|
+
|
|
318
|
+
```bash
|
|
319
|
+
# Para cada .csproj:
|
|
320
|
+
# 1. Mudar TargetFramework
|
|
321
|
+
# 2. Atualizar packages
|
|
322
|
+
dotnet add package Microsoft.EntityFrameworkCore.SqlServer --version 10.0.0
|
|
323
|
+
dotnet add package Microsoft.AspNetCore.Components.WebAssembly --version 10.0.0
|
|
324
|
+
|
|
325
|
+
# 3. Build incremental
|
|
326
|
+
dotnet build --no-incremental
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
### Passo 3: Migrar AI (3-5 dias)
|
|
330
|
+
|
|
331
|
+
**Priorizar:**
|
|
332
|
+
1. Listar todos os usos de Semantic Kernel
|
|
333
|
+
2. Reescrever um agent de cada vez
|
|
334
|
+
3. Testar isoladamente
|
|
335
|
+
4. Deployar incrementalmente
|
|
336
|
+
|
|
337
|
+
**Template de migração:**
|
|
338
|
+
```csharp
|
|
339
|
+
// ANTES
|
|
340
|
+
var kernel = ...;
|
|
341
|
+
var function = kernel.CreateFunctionFromPrompt(...);
|
|
342
|
+
var result = await kernel.InvokeAsync(function, args);
|
|
343
|
+
|
|
344
|
+
// DEPOIS
|
|
345
|
+
var agent = chatClient.CreateAgent(instructions: ..., name: ...);
|
|
346
|
+
var response = await agent.RunAsync(prompt);
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
### Passo 4: Adicionar Features (1-2 dias)
|
|
350
|
+
|
|
351
|
+
```bash
|
|
352
|
+
# Passkeys
|
|
353
|
+
dotnet aspnet-codegenerator identity --files "Account.Manage.Passkeys"
|
|
354
|
+
|
|
355
|
+
# Vector Search (se aplicável)
|
|
356
|
+
dotnet ef migrations add AddVectorSearch
|
|
357
|
+
dotnet ef database update
|
|
358
|
+
```
|
|
359
|
+
|
|
360
|
+
### Passo 5: Testes (2-3 dias)
|
|
361
|
+
|
|
362
|
+
```bash
|
|
363
|
+
# Unit tests
|
|
364
|
+
dotnet test
|
|
365
|
+
|
|
366
|
+
# Integration tests
|
|
367
|
+
dotnet test --filter Category=Integration
|
|
368
|
+
|
|
369
|
+
# E2E tests (Playwright)
|
|
370
|
+
# ...
|
|
371
|
+
|
|
372
|
+
# Performance tests
|
|
373
|
+
dotnet run --configuration Release
|
|
374
|
+
# Comparar com baseline .NET 9
|
|
375
|
+
```
|
|
376
|
+
|
|
377
|
+
### Passo 6: Deploy (1 dia)
|
|
378
|
+
|
|
379
|
+
```bash
|
|
380
|
+
# 1. Deploy staging
|
|
381
|
+
az containerapp update --name ca-myapp-staging --image myapp:net10
|
|
382
|
+
|
|
383
|
+
# 2. Smoke tests
|
|
384
|
+
curl https://myapp-staging.azurecontainerapps.io/health
|
|
385
|
+
|
|
386
|
+
# 3. Deploy produção
|
|
387
|
+
az containerapp update --name ca-myapp-prod --image myapp:net10
|
|
388
|
+
|
|
389
|
+
# 4. Monitorar Application Insights
|
|
390
|
+
```
|
|
391
|
+
|
|
392
|
+
---
|
|
393
|
+
|
|
394
|
+
## 🐛 Problemas Comuns
|
|
395
|
+
|
|
396
|
+
### Erro: "Microsoft.Agents.AI not found"
|
|
397
|
+
|
|
398
|
+
**Solução:**
|
|
399
|
+
```bash
|
|
400
|
+
dotnet add package Microsoft.Agents.AI --version 1.0.0
|
|
401
|
+
```
|
|
402
|
+
|
|
403
|
+
### Erro: "vector type not supported"
|
|
404
|
+
|
|
405
|
+
**Causa:** SQL Server antigo.
|
|
406
|
+
|
|
407
|
+
**Solução:** Use Azure SQL Database ou SQL Server 2022+.
|
|
408
|
+
|
|
409
|
+
### Erro: "Hot reload not working"
|
|
410
|
+
|
|
411
|
+
**Solução:**
|
|
412
|
+
1. Atualize Visual Studio 2026 Preview
|
|
413
|
+
2. Ou use `dotnet watch` no CLI
|
|
414
|
+
|
|
415
|
+
### Performance não melhorou
|
|
416
|
+
|
|
417
|
+
**Verificar:**
|
|
418
|
+
1. Compilou em Release? `dotnet build -c Release`
|
|
419
|
+
2. Rodando em produção (não dev server)?
|
|
420
|
+
3. Habilitou ReadyToRun? `<PublishReadyToRun>true</PublishReadyToRun>`
|
|
421
|
+
|
|
422
|
+
---
|
|
423
|
+
|
|
424
|
+
## 📊 Estimativa de Esforço
|
|
425
|
+
|
|
426
|
+
| Projeto | Dias | Complexidade |
|
|
427
|
+
|---------|------|--------------|
|
|
428
|
+
| Simples (sem AI) | 2-3 | Baixa |
|
|
429
|
+
| Médio (1-2 agents) | 5-7 | Média |
|
|
430
|
+
| Complexo (5+ agents, vector search) | 10-15 | Alta |
|
|
431
|
+
|
|
432
|
+
**Fatores:**
|
|
433
|
+
- Quantidade de código Semantic Kernel
|
|
434
|
+
- Testes existentes
|
|
435
|
+
- Complexidade de agents
|
|
436
|
+
- Features novas adotadas
|
|
437
|
+
|
|
438
|
+
---
|
|
439
|
+
|
|
440
|
+
## ✅ Definition of Done
|
|
441
|
+
|
|
442
|
+
- [ ] Todos .csproj com `net10.0`
|
|
443
|
+
- [ ] Todos packages atualizados
|
|
444
|
+
- [ ] Zero warnings de build
|
|
445
|
+
- [ ] Semantic Kernel removido
|
|
446
|
+
- [ ] Agent Framework funcionando
|
|
447
|
+
- [ ] Testes passando (>95% coverage mantido)
|
|
448
|
+
- [ ] Deploy em staging OK
|
|
449
|
+
- [ ] Performance igual ou melhor
|
|
450
|
+
- [ ] Documentação atualizada
|
|
451
|
+
- [ ] Equipe treinada
|
|
452
|
+
|
|
453
|
+
---
|
|
454
|
+
|
|
455
|
+
## 📚 Recursos
|
|
456
|
+
|
|
457
|
+
| Recurso | URL |
|
|
458
|
+
|---------|-----|
|
|
459
|
+
| .NET 10 Release Notes | [aka.ms/dotnet10](https://learn.microsoft.com/dotnet/core/whats-new/dotnet-10) |
|
|
460
|
+
| Agent Framework Docs | [learn.microsoft.com/agent-framework](https://learn.microsoft.com/agent-framework/) |
|
|
461
|
+
| Breaking Changes | [aka.ms/dotnet10-breaking](https://learn.microsoft.com/dotnet/core/compatibility/10.0) |
|
|
462
|
+
| Migration Guide (oficial) | [aka.ms/migrate-to-dotnet10](https://learn.microsoft.com/dotnet/core/porting/) |
|
|
463
|
+
|
|
464
|
+
---
|
|
465
|
+
|
|
466
|
+
## 🎓 Treinamento da Equipe
|
|
467
|
+
|
|
468
|
+
### Sessões Recomendadas
|
|
469
|
+
|
|
470
|
+
1. **.NET 10 Overview** (1h)
|
|
471
|
+
- Performance improvements
|
|
472
|
+
- Breaking changes
|
|
473
|
+
- New features
|
|
474
|
+
|
|
475
|
+
2. **Agent Framework Deep Dive** (2h)
|
|
476
|
+
- Migração de Semantic Kernel
|
|
477
|
+
- Hands-on: criar agent do zero
|
|
478
|
+
- Tools e function calling
|
|
479
|
+
|
|
480
|
+
3. **Blazor .NET 10** (1h)
|
|
481
|
+
- State persistence
|
|
482
|
+
- Circuit management
|
|
483
|
+
- Performance tips
|
|
484
|
+
|
|
485
|
+
4. **Vector Search + RAG** (2h)
|
|
486
|
+
- EF Core 10 vectors
|
|
487
|
+
- Embedding generation
|
|
488
|
+
- RAG pattern completo
|
|
489
|
+
|
|
490
|
+
**Total:** 6h de treinamento
|
|
491
|
+
|
|
492
|
+
---
|
|
493
|
+
|
|
494
|
+
*MORPH-SPEC by Polymorphism Tech*
|