@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.
- package/CLAUDE.md +446 -1730
- package/README.md +515 -516
- package/bin/morph-spec.js +366 -294
- package/bin/task-manager.js +429 -368
- package/bin/validate.js +369 -268
- package/content/.claude/commands/morph-apply.md +221 -158
- package/content/.claude/commands/morph-deploy.md +529 -0
- package/content/.claude/commands/morph-preflight.md +227 -0
- package/content/.claude/commands/morph-proposal.md +122 -101
- package/content/.claude/commands/morph-status.md +86 -86
- package/content/.claude/commands/morph-troubleshoot.md +122 -0
- package/content/.claude/skills/infra/azure-deploy-specialist.md +699 -0
- package/content/.claude/skills/level-0-meta/README.md +7 -0
- package/content/.claude/skills/level-0-meta/code-review.md +226 -0
- package/content/.claude/skills/level-0-meta/morph-checklist.md +117 -0
- package/content/.claude/skills/level-0-meta/simulation-checklist.md +77 -0
- package/content/.claude/skills/level-1-workflows/README.md +7 -0
- package/content/.claude/skills/level-1-workflows/morph-replicate.md +213 -0
- package/content/.claude/{commands/morph-clarify.md → skills/level-1-workflows/phase-clarify.md} +131 -184
- package/content/.claude/{commands/morph-design.md → skills/level-1-workflows/phase-design.md} +213 -275
- package/content/.claude/skills/level-1-workflows/phase-setup.md +106 -0
- package/content/.claude/skills/level-1-workflows/phase-tasks.md +164 -0
- package/content/.claude/{commands/morph-uiux.md → skills/level-1-workflows/phase-uiux.md} +169 -211
- package/content/.claude/skills/level-2-domains/README.md +14 -0
- package/content/.claude/skills/level-2-domains/ai-agents/ai-system-architect.md +192 -0
- package/content/.claude/skills/{specialists → level-2-domains/architecture}/po-pm-advisor.md +197 -197
- package/content/.claude/skills/level-2-domains/architecture/standards-architect.md +156 -0
- package/content/.claude/skills/level-2-domains/backend/dotnet-senior.md +287 -0
- package/content/.claude/skills/level-2-domains/backend/ef-modeler.md +113 -0
- package/content/.claude/skills/level-2-domains/backend/hangfire-orchestrator.md +126 -0
- package/content/.claude/skills/level-2-domains/backend/ms-agent-expert.md +109 -0
- package/content/.claude/skills/level-2-domains/frontend/blazor-builder.md +210 -0
- package/content/.claude/skills/level-2-domains/frontend/nextjs-expert.md +154 -0
- package/content/.claude/skills/level-2-domains/frontend/ui-ux-designer.md +191 -0
- package/content/.claude/skills/{specialists → level-2-domains/infrastructure}/azure-architect.md +142 -142
- package/content/.claude/skills/level-2-domains/infrastructure/bicep-architect.md +126 -0
- package/content/.claude/skills/level-2-domains/infrastructure/container-specialist.md +131 -0
- package/content/.claude/skills/level-2-domains/infrastructure/devops-engineer.md +119 -0
- package/content/.claude/skills/level-2-domains/integrations/asaas-financial.md +130 -0
- package/content/.claude/skills/level-2-domains/integrations/azure-identity.md +142 -0
- package/content/.claude/skills/level-2-domains/integrations/clerk-auth.md +108 -0
- package/content/.claude/skills/level-2-domains/integrations/resend-email.md +119 -0
- package/content/.claude/skills/level-2-domains/quality/code-analyzer.md +235 -0
- package/content/.claude/skills/level-2-domains/quality/testing-specialist.md +126 -0
- package/content/.claude/skills/level-3-technologies/README.md +7 -0
- package/content/.claude/skills/level-4-patterns/README.md +7 -0
- package/content/.claude/skills/specialists/prompt-engineer.md +189 -0
- package/content/.claude/skills/specialists/seo-growth-hacker.md +320 -0
- package/content/.morph/config/agents.json +762 -242
- package/content/.morph/config/config.template.json +122 -108
- package/content/.morph/docs/workflows/design-impl.md +37 -0
- package/content/.morph/docs/workflows/enforcement-pipeline.md +668 -0
- package/content/.morph/docs/workflows/fast-track.md +29 -0
- package/content/.morph/docs/workflows/full-morph.md +76 -0
- package/content/.morph/docs/workflows/standard.md +44 -0
- package/content/.morph/docs/workflows/ui-refresh.md +39 -0
- package/content/.morph/examples/scheduled-reports/decisions.md +158 -0
- package/content/.morph/examples/scheduled-reports/proposal.md +95 -0
- package/content/.morph/examples/scheduled-reports/spec.md +267 -0
- package/content/.morph/hooks/README.md +348 -239
- package/content/.morph/hooks/pre-commit-agents.sh +24 -24
- package/content/.morph/hooks/task-completed.js +73 -0
- package/content/.morph/hooks/teammate-idle.js +68 -0
- package/content/.morph/schemas/tasks.schema.json +220 -0
- package/content/.morph/standards/agent-framework-blazor-ui.md +359 -0
- package/content/.morph/standards/agent-framework-production.md +410 -0
- package/content/.morph/standards/agent-framework-setup.md +413 -453
- package/content/.morph/standards/agent-framework-workflows.md +349 -0
- package/content/.morph/standards/agent-teams-workflow.md +474 -0
- package/content/.morph/standards/architecture.md +325 -325
- package/content/.morph/standards/azure.md +605 -379
- package/content/.morph/standards/dotnet10-migration.md +520 -494
- package/content/.morph/templates/CONTEXT-FEATURE.md +276 -0
- package/content/.morph/templates/CONTEXT.md +170 -0
- package/content/.morph/templates/agent.cs +163 -172
- package/content/.morph/templates/clarify-questions.md +159 -0
- package/content/.morph/templates/contracts/Commands.cs +74 -0
- package/content/.morph/templates/contracts/Entities.cs +25 -0
- package/content/.morph/templates/contracts/Queries.cs +74 -0
- package/content/.morph/templates/contracts/README.md +74 -0
- package/content/.morph/templates/decisions.md +123 -106
- package/content/.morph/templates/infra/azure-pipelines-deploy.yml +480 -0
- package/content/.morph/templates/infra/deploy-checklist.md +426 -0
- package/content/.morph/templates/proposal.md +141 -155
- package/content/.morph/templates/recap.md +94 -105
- package/content/.morph/templates/simulation.md +353 -0
- package/content/.morph/templates/spec.md +149 -148
- package/content/.morph/templates/state.template.json +222 -222
- package/content/.morph/templates/tasks.md +257 -235
- package/content/.morph/templates/ui-components.md +362 -276
- package/content/CLAUDE.md +150 -442
- package/detectors/structure-detector.js +245 -250
- package/docs/README.md +144 -149
- package/docs/getting-started.md +301 -302
- package/docs/installation.md +361 -361
- package/docs/validation-checklist.md +265 -266
- package/package.json +80 -80
- package/src/commands/advance-phase.js +266 -0
- package/src/commands/analyze-blazor-concurrency.js +193 -0
- package/src/commands/deploy.js +780 -0
- package/src/commands/detect-agents.js +167 -0
- package/src/commands/doctor.js +356 -280
- package/src/commands/generate-context.js +40 -0
- package/src/commands/init.js +258 -245
- package/src/commands/lint-fluent.js +352 -0
- package/src/commands/rollback-phase.js +185 -0
- package/src/commands/session-summary.js +291 -0
- package/src/commands/task.js +78 -75
- package/src/commands/troubleshoot.js +222 -0
- package/src/commands/update.js +192 -159
- package/src/commands/validate-blazor-state.js +210 -0
- package/src/commands/validate-blazor.js +156 -0
- package/src/commands/validate-css.js +84 -0
- package/src/commands/validate-phase.js +221 -0
- package/src/lib/blazor-concurrency-analyzer.js +288 -0
- package/src/lib/blazor-state-validator.js +291 -0
- package/src/lib/blazor-validator.js +374 -0
- package/src/lib/complexity-analyzer.js +441 -292
- package/src/lib/context-generator.js +513 -0
- package/src/lib/continuous-validator.js +421 -440
- package/src/lib/css-validator.js +352 -0
- package/src/lib/decision-constraint-loader.js +109 -0
- package/src/lib/design-system-detector.js +187 -0
- package/src/lib/design-system-scaffolder.js +299 -0
- package/src/lib/hook-executor.js +256 -0
- package/src/lib/recap-generator.js +205 -0
- package/src/lib/spec-validator.js +258 -0
- package/src/lib/standards-context-injector.js +287 -0
- package/src/lib/state-manager.js +397 -340
- package/src/lib/team-orchestrator.js +322 -0
- package/src/lib/troubleshoot-grep.js +194 -0
- package/src/lib/troubleshoot-index.js +144 -0
- package/src/lib/validation-runner.js +283 -0
- package/src/lib/validators/contract-compliance-validator.js +273 -0
- package/src/lib/validators/design-system-validator.js +231 -0
- package/src/utils/file-copier.js +187 -139
- package/content/.claude/commands/morph-costs.md +0 -206
- package/content/.claude/commands/morph-setup.md +0 -100
- package/content/.claude/commands/morph-tasks.md +0 -319
- package/content/.claude/skills/infra/bicep-architect.md +0 -419
- package/content/.claude/skills/infra/container-specialist.md +0 -437
- package/content/.claude/skills/infra/devops-engineer.md +0 -405
- package/content/.claude/skills/integrations/asaas-financial.md +0 -333
- package/content/.claude/skills/integrations/azure-identity.md +0 -309
- package/content/.claude/skills/integrations/clerk-auth.md +0 -290
- package/content/.claude/skills/specialists/ai-system-architect.md +0 -604
- package/content/.claude/skills/specialists/cost-guardian.md +0 -110
- package/content/.claude/skills/specialists/ef-modeler.md +0 -211
- package/content/.claude/skills/specialists/hangfire-orchestrator.md +0 -255
- package/content/.claude/skills/specialists/ms-agent-expert.md +0 -263
- package/content/.claude/skills/specialists/standards-architect.md +0 -78
- package/content/.claude/skills/specialists/ui-ux-designer.md +0 -1100
- package/content/.claude/skills/stacks/dotnet-blazor.md +0 -606
- package/content/.claude/skills/stacks/dotnet-nextjs.md +0 -402
- package/content/.claude/skills/stacks/shopify.md +0 -445
- package/content/.morph/config/azure-pricing.json +0 -70
- package/content/.morph/config/azure-pricing.schema.json +0 -50
- package/content/.morph/hooks/pre-commit-costs.sh +0 -91
- package/docs/api/cost-calculator.js.html +0 -513
- package/docs/api/design-system-generator.js.html +0 -382
- package/docs/api/global.html +0 -5263
- package/docs/api/index.html +0 -96
- package/docs/api/state-manager.js.html +0 -423
- package/src/commands/cost.js +0 -181
- package/src/commands/update-pricing.js +0 -206
- package/src/lib/cost-calculator.js +0 -429
|
@@ -1,290 +0,0 @@
|
|
|
1
|
-
# Clerk Auth
|
|
2
|
-
|
|
3
|
-
Especialista em autenticação com Clerk para aplicações .NET/Blazor.
|
|
4
|
-
|
|
5
|
-
## Responsabilidades
|
|
6
|
-
|
|
7
|
-
1. **Configurar Clerk** em projetos .NET
|
|
8
|
-
2. **Implementar autenticação** com SDK oficial
|
|
9
|
-
3. **Gerenciar sessões** e tokens
|
|
10
|
-
4. **Proteger endpoints** e páginas
|
|
11
|
-
|
|
12
|
-
## Triggers
|
|
13
|
-
|
|
14
|
-
Keywords: `clerk`, `auth`, `login`, `signup`, `authentication`, `session`, `jwt`, `user`
|
|
15
|
-
|
|
16
|
-
## Sobre o Clerk
|
|
17
|
-
|
|
18
|
-
- **Plataforma de autenticação** SaaS moderna
|
|
19
|
-
- **SDK oficial C#** lançado em Janeiro/2025
|
|
20
|
-
- **Suporta**: Email/senha, Social login, MFA, Passkeys
|
|
21
|
-
- **Dashboard** para gerenciar usuários
|
|
22
|
-
- **Ideal para**: SaaS B2C, MVPs rápidos
|
|
23
|
-
|
|
24
|
-
## Instalação
|
|
25
|
-
|
|
26
|
-
```bash
|
|
27
|
-
dotnet add package Clerk.Net.AspNetCore.Security
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
## Configuração Básica
|
|
31
|
-
|
|
32
|
-
```csharp
|
|
33
|
-
// appsettings.json
|
|
34
|
-
{
|
|
35
|
-
"Clerk": {
|
|
36
|
-
"SecretKey": "${CLERK_SECRET_KEY}",
|
|
37
|
-
"PublishableKey": "pk_test_xxx" // Para frontend
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
// Program.cs
|
|
42
|
-
builder.Services.AddClerk(builder.Configuration);
|
|
43
|
-
|
|
44
|
-
// Ou manualmente
|
|
45
|
-
builder.Services.AddClerk(options =>
|
|
46
|
-
{
|
|
47
|
-
options.SecretKey = builder.Configuration["Clerk:SecretKey"]!;
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
// Adicionar autenticação
|
|
51
|
-
builder.Services.AddAuthentication(ClerkAuthenticationDefaults.AuthenticationScheme)
|
|
52
|
-
.AddClerk(options =>
|
|
53
|
-
{
|
|
54
|
-
options.Authority = "https://clerk.{your-instance}.com";
|
|
55
|
-
options.ValidAudiences = new[] { "your-app-id" };
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
builder.Services.AddAuthorization();
|
|
59
|
-
|
|
60
|
-
// Pipeline
|
|
61
|
-
app.UseAuthentication();
|
|
62
|
-
app.UseAuthorization();
|
|
63
|
-
```
|
|
64
|
-
|
|
65
|
-
## Proteger Endpoints (Minimal API)
|
|
66
|
-
|
|
67
|
-
```csharp
|
|
68
|
-
// Endpoint protegido
|
|
69
|
-
app.MapGet("/api/profile", async (ClaimsPrincipal user, IClerkClient clerk) =>
|
|
70
|
-
{
|
|
71
|
-
var userId = user.FindFirstValue(ClaimTypes.NameIdentifier);
|
|
72
|
-
|
|
73
|
-
if (userId is null)
|
|
74
|
-
return Results.Unauthorized();
|
|
75
|
-
|
|
76
|
-
var clerkUser = await clerk.Users.GetUserAsync(userId);
|
|
77
|
-
|
|
78
|
-
return Results.Ok(new
|
|
79
|
-
{
|
|
80
|
-
Id = clerkUser.Id,
|
|
81
|
-
Email = clerkUser.EmailAddresses.FirstOrDefault()?.EmailAddress,
|
|
82
|
-
Name = $"{clerkUser.FirstName} {clerkUser.LastName}"
|
|
83
|
-
});
|
|
84
|
-
})
|
|
85
|
-
.RequireAuthorization();
|
|
86
|
-
|
|
87
|
-
// Endpoint público
|
|
88
|
-
app.MapGet("/api/public", () => "Hello World!")
|
|
89
|
-
.AllowAnonymous();
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
## Proteger Endpoints (Controllers)
|
|
93
|
-
|
|
94
|
-
```csharp
|
|
95
|
-
[ApiController]
|
|
96
|
-
[Route("api/[controller]")]
|
|
97
|
-
[Authorize] // Requer autenticação
|
|
98
|
-
public class ProfileController : ControllerBase
|
|
99
|
-
{
|
|
100
|
-
private readonly IClerkClient _clerk;
|
|
101
|
-
|
|
102
|
-
public ProfileController(IClerkClient clerk)
|
|
103
|
-
{
|
|
104
|
-
_clerk = clerk;
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
[HttpGet]
|
|
108
|
-
public async Task<IActionResult> GetProfile()
|
|
109
|
-
{
|
|
110
|
-
var userId = User.FindFirstValue(ClaimTypes.NameIdentifier);
|
|
111
|
-
|
|
112
|
-
if (userId is null)
|
|
113
|
-
return Unauthorized();
|
|
114
|
-
|
|
115
|
-
var user = await _clerk.Users.GetUserAsync(userId);
|
|
116
|
-
|
|
117
|
-
return Ok(new
|
|
118
|
-
{
|
|
119
|
-
user.Id,
|
|
120
|
-
Email = user.EmailAddresses.FirstOrDefault()?.EmailAddress,
|
|
121
|
-
Name = $"{user.FirstName} {user.LastName}"
|
|
122
|
-
});
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
[HttpGet("admin")]
|
|
126
|
-
[Authorize(Roles = "admin")] // Requer role admin
|
|
127
|
-
public IActionResult AdminOnly()
|
|
128
|
-
{
|
|
129
|
-
return Ok("Admin access granted");
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
```
|
|
133
|
-
|
|
134
|
-
## Blazor Server
|
|
135
|
-
|
|
136
|
-
```csharp
|
|
137
|
-
// Program.cs
|
|
138
|
-
builder.Services.AddClerk(builder.Configuration);
|
|
139
|
-
builder.Services.AddAuthentication(ClerkAuthenticationDefaults.AuthenticationScheme)
|
|
140
|
-
.AddClerk();
|
|
141
|
-
|
|
142
|
-
// App.razor
|
|
143
|
-
<CascadingAuthenticationState>
|
|
144
|
-
<Router AppAssembly="@typeof(App).Assembly">
|
|
145
|
-
<Found Context="routeData">
|
|
146
|
-
<AuthorizeRouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)">
|
|
147
|
-
<NotAuthorized>
|
|
148
|
-
<RedirectToLogin />
|
|
149
|
-
</NotAuthorized>
|
|
150
|
-
</AuthorizeRouteView>
|
|
151
|
-
</Found>
|
|
152
|
-
</Router>
|
|
153
|
-
</CascadingAuthenticationState>
|
|
154
|
-
|
|
155
|
-
// Components/RedirectToLogin.razor
|
|
156
|
-
@inject NavigationManager Navigation
|
|
157
|
-
|
|
158
|
-
@code {
|
|
159
|
-
protected override void OnInitialized()
|
|
160
|
-
{
|
|
161
|
-
Navigation.NavigateTo($"/sign-in?redirect_url={Uri.EscapeDataString(Navigation.Uri)}", forceLoad: true);
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
```
|
|
165
|
-
|
|
166
|
-
## Páginas Protegidas
|
|
167
|
-
|
|
168
|
-
```razor
|
|
169
|
-
@* Pages/Dashboard.razor *@
|
|
170
|
-
@page "/dashboard"
|
|
171
|
-
@attribute [Authorize]
|
|
172
|
-
|
|
173
|
-
<h1>Dashboard</h1>
|
|
174
|
-
|
|
175
|
-
<AuthorizeView>
|
|
176
|
-
<Authorized>
|
|
177
|
-
<p>Bem-vindo, @context.User.Identity?.Name!</p>
|
|
178
|
-
</Authorized>
|
|
179
|
-
</AuthorizeView>
|
|
180
|
-
|
|
181
|
-
@* Verificar role específica *@
|
|
182
|
-
<AuthorizeView Roles="admin">
|
|
183
|
-
<Authorized>
|
|
184
|
-
<AdminPanel />
|
|
185
|
-
</Authorized>
|
|
186
|
-
<NotAuthorized>
|
|
187
|
-
<p>Acesso restrito a administradores.</p>
|
|
188
|
-
</NotAuthorized>
|
|
189
|
-
</AuthorizeView>
|
|
190
|
-
```
|
|
191
|
-
|
|
192
|
-
## Clerk Client para Operações
|
|
193
|
-
|
|
194
|
-
```csharp
|
|
195
|
-
// Buscar usuário
|
|
196
|
-
var user = await _clerk.Users.GetUserAsync(userId);
|
|
197
|
-
|
|
198
|
-
// Listar usuários
|
|
199
|
-
var users = await _clerk.Users.GetUserListAsync(new()
|
|
200
|
-
{
|
|
201
|
-
Limit = 10,
|
|
202
|
-
Offset = 0
|
|
203
|
-
});
|
|
204
|
-
|
|
205
|
-
// Atualizar metadata
|
|
206
|
-
await _clerk.Users.UpdateUserMetadataAsync(userId, new()
|
|
207
|
-
{
|
|
208
|
-
PublicMetadata = new Dictionary<string, object>
|
|
209
|
-
{
|
|
210
|
-
["plan"] = "pro",
|
|
211
|
-
["company"] = "Acme Inc"
|
|
212
|
-
}
|
|
213
|
-
});
|
|
214
|
-
|
|
215
|
-
// Deletar usuário
|
|
216
|
-
await _clerk.Users.DeleteUserAsync(userId);
|
|
217
|
-
```
|
|
218
|
-
|
|
219
|
-
## Webhooks
|
|
220
|
-
|
|
221
|
-
```csharp
|
|
222
|
-
// Controllers/ClerkWebhookController.cs
|
|
223
|
-
[ApiController]
|
|
224
|
-
[Route("api/webhooks/clerk")]
|
|
225
|
-
public class ClerkWebhookController : ControllerBase
|
|
226
|
-
{
|
|
227
|
-
private readonly IUserService _userService;
|
|
228
|
-
|
|
229
|
-
public ClerkWebhookController(IUserService userService)
|
|
230
|
-
{
|
|
231
|
-
_userService = userService;
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
[HttpPost]
|
|
235
|
-
public async Task<IActionResult> HandleWebhook([FromBody] ClerkWebhookPayload payload)
|
|
236
|
-
{
|
|
237
|
-
// Verificar signature (importante em produção!)
|
|
238
|
-
|
|
239
|
-
switch (payload.Type)
|
|
240
|
-
{
|
|
241
|
-
case "user.created":
|
|
242
|
-
await _userService.SyncUserAsync(payload.Data);
|
|
243
|
-
break;
|
|
244
|
-
|
|
245
|
-
case "user.updated":
|
|
246
|
-
await _userService.UpdateUserAsync(payload.Data);
|
|
247
|
-
break;
|
|
248
|
-
|
|
249
|
-
case "user.deleted":
|
|
250
|
-
await _userService.DeleteUserAsync(payload.Data.Id);
|
|
251
|
-
break;
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
return Ok();
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
```
|
|
258
|
-
|
|
259
|
-
## Clerk vs Azure Identity
|
|
260
|
-
|
|
261
|
-
| Aspecto | Clerk | Azure Identity |
|
|
262
|
-
|---------|-------|----------------|
|
|
263
|
-
| **Setup** | Mais rápido | Mais complexo |
|
|
264
|
-
| **Custo** | Freemium (5k MAU grátis) | Grátis (Azure AD) |
|
|
265
|
-
| **Multi-tenant** | Built-in | Requer config |
|
|
266
|
-
| **Social login** | 20+ providers | Limitado |
|
|
267
|
-
| **UI components** | Pré-construídos | Precisa criar |
|
|
268
|
-
| **Ideal para** | SaaS B2C | Enterprise/Azure |
|
|
269
|
-
|
|
270
|
-
## Documentação de Referência
|
|
271
|
-
|
|
272
|
-
- [Clerk C# SDK](https://clerk.com/changelog/2025-01-09-csharp-sdk)
|
|
273
|
-
- [Clerk.Net GitHub](https://github.com/Hawxy/Clerk.Net)
|
|
274
|
-
- [Clerk Documentation](https://clerk.com/docs)
|
|
275
|
-
- [Webhooks](https://clerk.com/docs/integrations/webhooks)
|
|
276
|
-
|
|
277
|
-
## Checklist de Integração
|
|
278
|
-
|
|
279
|
-
- [ ] Secret Key no Key Vault (não hardcoded)
|
|
280
|
-
- [ ] Publishable Key para frontend
|
|
281
|
-
- [ ] Authentication scheme configurado
|
|
282
|
-
- [ ] Authorization policies definidas
|
|
283
|
-
- [ ] Webhook endpoint para sync de usuários
|
|
284
|
-
- [ ] Verificação de webhook signature
|
|
285
|
-
- [ ] Redirect após login configurado
|
|
286
|
-
- [ ] Error handling para sessões expiradas
|
|
287
|
-
|
|
288
|
-
---
|
|
289
|
-
|
|
290
|
-
*MORPH-SPEC by Polymorphism Tech*
|