@polymorphism-tech/morph-spec 4.7.0 → 4.7.2
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/.morph/.morphversion +5 -0
- package/.morph/analytics/threads-log.jsonl +5 -0
- package/.morph/config/config.json +8 -0
- package/.morph/framework/agents.json +1815 -0
- package/.morph/framework/hooks/README.md +205 -0
- package/.morph/framework/hooks/claude-code/notification/approval-reminder.js +54 -0
- package/.morph/framework/hooks/claude-code/post-tool-use/dispatch.js +83 -0
- package/.morph/framework/hooks/claude-code/post-tool-use/handle-tool-failure.js +42 -0
- package/.morph/framework/hooks/claude-code/pre-compact/save-morph-context.js +61 -0
- package/.morph/framework/hooks/claude-code/pre-tool-use/enforce-phase-writes.js +71 -0
- package/.morph/framework/hooks/claude-code/pre-tool-use/protect-readonly-files.js +58 -0
- package/.morph/framework/hooks/claude-code/pre-tool-use/protect-spec-files.js +64 -0
- package/.morph/framework/hooks/claude-code/session-start/inject-morph-context.js +94 -0
- package/.morph/framework/hooks/claude-code/statusline.py +538 -0
- package/.morph/framework/hooks/claude-code/statusline.sh +7 -0
- package/.morph/framework/hooks/claude-code/stop/validate-completion.js +88 -0
- package/.morph/framework/hooks/claude-code/user-prompt/enrich-prompt.js +91 -0
- package/.morph/framework/hooks/git/commit-msg/conventional-commits.sh +33 -0
- package/.morph/framework/hooks/git/pre-commit/agents.sh +25 -0
- package/.morph/framework/hooks/git/pre-commit/orchestrator.sh +64 -0
- package/.morph/framework/hooks/git/pre-commit/specs.sh +50 -0
- package/.morph/framework/hooks/git/pre-push/run-tests.sh +44 -0
- package/.morph/framework/hooks/shared/hook-response.js +45 -0
- package/.morph/framework/hooks/shared/phase-utils.js +129 -0
- package/.morph/framework/hooks/shared/state-reader.js +138 -0
- package/.morph/framework/hooks/shared/stdin-reader.js +26 -0
- package/.morph/framework/standards/STANDARDS.json +933 -0
- package/.morph/framework/standards/ai-agents/blazor-ui.md +364 -0
- package/.morph/framework/standards/ai-agents/production.md +415 -0
- package/.morph/framework/standards/ai-agents/setup.md +418 -0
- package/.morph/framework/standards/ai-agents/team-orchestration.md +479 -0
- package/.morph/framework/standards/ai-agents/workflows.md +354 -0
- package/.morph/framework/standards/architecture/ddd/aggregates.md +120 -0
- package/.morph/framework/standards/architecture/ddd/bounded-contexts.md +105 -0
- package/.morph/framework/standards/architecture/ddd/complexity-levels.md +108 -0
- package/.morph/framework/standards/architecture/ddd/entities.md +99 -0
- package/.morph/framework/standards/architecture/ddd/ubiquitous-language.md +58 -0
- package/.morph/framework/standards/architecture/ddd/value-objects.md +124 -0
- package/.morph/framework/standards/backend/api/minimal-api.md +494 -0
- package/.morph/framework/standards/backend/api/rest.md +492 -0
- package/.morph/framework/standards/backend/api/validation.md +88 -0
- package/.morph/framework/standards/backend/authentication/passkeys.md +428 -0
- package/.morph/framework/standards/backend/database/ef-core.md +199 -0
- package/.morph/framework/standards/backend/database/migrations.md +393 -0
- package/.morph/framework/standards/backend/database/postgresql/database.md +352 -0
- package/.morph/framework/standards/backend/database/repository-patterns.md +528 -0
- package/.morph/framework/standards/backend/database/vector-search-rag.md +541 -0
- package/.morph/framework/standards/backend/dotnet/async.md +366 -0
- package/.morph/framework/standards/backend/dotnet/core.md +117 -0
- package/.morph/framework/standards/backend/dotnet/di.md +439 -0
- package/.morph/framework/standards/backend/dotnet/program-cs-checklist.md +92 -0
- package/.morph/framework/standards/backend/integrations/asaas/asaas-api.md +216 -0
- package/.morph/framework/standards/backend/integrations/clerk/clerk-auth.md +290 -0
- package/.morph/framework/standards/backend/integrations/hangfire/hangfire-jobs.md +350 -0
- package/.morph/framework/standards/backend/integrations/resend/resend-email.md +385 -0
- package/.morph/framework/standards/context/analytics.md +96 -0
- package/.morph/framework/standards/context/bundles.md +110 -0
- package/.morph/framework/standards/context/priming.md +78 -0
- package/.morph/framework/standards/core/architecture.md +185 -0
- package/.morph/framework/standards/core/coding.md +214 -0
- package/.morph/framework/standards/core/git-branching-strategy.md +403 -0
- package/.morph/framework/standards/core/git.md +185 -0
- package/.morph/framework/standards/core/testing.md +295 -0
- package/.morph/framework/standards/data/nosql/blob-storage.md +102 -0
- package/.morph/framework/standards/data/nosql/cache/redis.md +97 -0
- package/.morph/framework/standards/data/nosql/cosmos-db.md +118 -0
- package/.morph/framework/standards/data/vector-search/azure-ai-search.md +121 -0
- package/.morph/framework/standards/data/vector-search/rag-chunking.md +104 -0
- package/.morph/framework/standards/frontend/blazor/design-checklist.md +222 -0
- package/.morph/framework/standards/frontend/blazor/fluent-ui-setup.md +595 -0
- package/.morph/framework/standards/frontend/blazor/fluent-ui.md +137 -0
- package/.morph/framework/standards/frontend/blazor/html-conversion.md +184 -0
- package/.morph/framework/standards/frontend/blazor/lifecycle.md +195 -0
- package/.morph/framework/standards/frontend/blazor/pitfalls.md +198 -0
- package/.morph/framework/standards/frontend/blazor/state.md +191 -0
- package/.morph/framework/standards/frontend/design-system/animations.md +151 -0
- package/.morph/framework/standards/frontend/design-system/naming.md +64 -0
- package/.morph/framework/standards/frontend/nextjs/app-router.md +123 -0
- package/.morph/framework/standards/frontend/nextjs/components.md +132 -0
- package/.morph/framework/standards/frontend/nextjs/data-fetching.md +126 -0
- package/.morph/framework/standards/frontend/nextjs/forms.md +128 -0
- package/.morph/framework/standards/frontend/nextjs/naming-conventions.md +67 -0
- package/.morph/framework/standards/frontend/nextjs/nextjs-patterns.md +215 -0
- package/.morph/framework/standards/frontend/nextjs/project-structure.md +102 -0
- package/.morph/framework/standards/frontend/nextjs/state-management.md +72 -0
- package/.morph/framework/standards/frontend/nextjs/testing.md +111 -0
- package/.morph/framework/standards/infrastructure/azure/azure.md +624 -0
- package/.morph/framework/standards/infrastructure/azure/bicep/bicep-patterns.md +422 -0
- package/.morph/framework/standards/infrastructure/azure/devops/azure-devops-setup.md +516 -0
- package/.morph/framework/standards/infrastructure/azure/devops/local-development.md +520 -0
- package/.morph/framework/standards/infrastructure/azure/services/functions.md +486 -0
- package/.morph/framework/standards/infrastructure/azure/services/service-bus.md +459 -0
- package/.morph/framework/standards/infrastructure/azure/services/storage.md +407 -0
- package/.morph/framework/standards/infrastructure/docker/easypanel-deploy.md +196 -0
- package/.morph/framework/standards/infrastructure/supabase/mcp-setup.md +252 -0
- package/.morph/framework/standards/infrastructure/supabase/supabase-auth.md +176 -0
- package/.morph/framework/standards/infrastructure/supabase/supabase-pgvector.md +169 -0
- package/.morph/framework/standards/infrastructure/supabase/supabase-rls.md +184 -0
- package/.morph/framework/standards/infrastructure/supabase/supabase-storage.md +153 -0
- package/.morph/framework/standards/integration/api/graphql.md +91 -0
- package/.morph/framework/standards/integration/api/grpc.md +114 -0
- package/.morph/framework/standards/integration/api/rest-design.md +95 -0
- package/.morph/framework/standards/integration/event-driven/cqrs.md +101 -0
- package/.morph/framework/standards/integration/event-driven/event-sourcing.md +124 -0
- package/.morph/framework/standards/integration/event-driven/service-bus.md +95 -0
- package/.morph/framework/standards/integration/mcp/mcp-tools.md +384 -0
- package/.morph/framework/standards/observability/logging.md +131 -0
- package/.morph/framework/standards/observability/metrics.md +121 -0
- package/.morph/framework/standards/observability/monitoring.md +114 -0
- package/.morph/framework/standards/observability/tracing.md +132 -0
- package/.morph/framework/standards/workflows/parallel-execution.md +112 -0
- package/.morph/framework/standards/workflows/thread-management.md +113 -0
- package/.morph/framework/templates/.idea/morph-templates.xml +92 -0
- package/.morph/framework/templates/.vscode/morph-templates.code-snippets +186 -0
- package/.morph/framework/templates/IDE-SNIPPETS.md +266 -0
- package/.morph/framework/templates/README.md +814 -0
- package/.morph/framework/templates/REGISTRY.json +1888 -0
- package/.morph/framework/templates/code/dotnet/backend/repository.cs +141 -0
- package/.morph/framework/templates/code/dotnet/backend/service.cs +139 -0
- package/.morph/framework/templates/code/dotnet/contracts/Commands.cs +74 -0
- package/.morph/framework/templates/code/dotnet/contracts/Entities.cs +25 -0
- package/.morph/framework/templates/code/dotnet/contracts/Queries.cs +74 -0
- package/.morph/framework/templates/code/dotnet/contracts/README.md +74 -0
- package/.morph/framework/templates/code/dotnet/contracts/api-contracts.cs +173 -0
- package/.morph/framework/templates/code/dotnet/contracts/contracts-level1.cs +69 -0
- package/.morph/framework/templates/code/dotnet/contracts/contracts-level2.cs +86 -0
- package/.morph/framework/templates/code/dotnet/contracts/contracts-level3.cs +41 -0
- package/.morph/framework/templates/code/dotnet/database/migration.cs +83 -0
- package/.morph/framework/templates/code/dotnet/frontend/component.razor +239 -0
- package/.morph/framework/templates/code/dotnet/jobs/agent.cs +163 -0
- package/.morph/framework/templates/code/dotnet/jobs/job.cs +171 -0
- package/.morph/framework/templates/code/dotnet/test.cs +239 -0
- package/.morph/framework/templates/code/sql/rls-policy.sql +57 -0
- package/.morph/framework/templates/code/sql/supabase-migration.sql +100 -0
- package/.morph/framework/templates/code/sql/supabase-migration.template.sql +113 -0
- package/.morph/framework/templates/code/typescript/contracts.ts +168 -0
- package/.morph/framework/templates/context/CONTEXT-FEATURE.md +276 -0
- package/.morph/framework/templates/context/CONTEXT.md +181 -0
- package/.morph/framework/templates/docs/clarifications.md +253 -0
- package/.morph/framework/templates/docs/onboarding.md +123 -0
- package/.morph/framework/templates/docs/proposal.md +182 -0
- package/.morph/framework/templates/docs/schema-analysis.md +119 -0
- package/.morph/framework/templates/docs/spec.md +198 -0
- package/.morph/framework/templates/docs/ui-components.md +124 -0
- package/.morph/framework/templates/docs/ui-design-system.md +76 -0
- package/.morph/framework/templates/docs/ui-flows.md +167 -0
- package/.morph/framework/templates/docs/ui-mockups.md +98 -0
- package/.morph/framework/templates/docs/user-stories.md +34 -0
- package/.morph/framework/templates/examples/design-system-examples.md +357 -0
- package/.morph/framework/templates/examples/spec-examples.md +90 -0
- package/.morph/framework/templates/feature/decisions.md +187 -0
- package/.morph/framework/templates/feature/recap.md +146 -0
- package/.morph/framework/templates/feature/tasks.md +199 -0
- package/.morph/framework/templates/frontend/nextjs/Dockerfile.nextjs.hbs +43 -0
- package/.morph/framework/templates/frontend/nextjs/client-component.tsx.hbs +26 -0
- package/.morph/framework/templates/frontend/nextjs/env.mjs.hbs +32 -0
- package/.morph/framework/templates/frontend/nextjs/feature-form.tsx.hbs +56 -0
- package/.morph/framework/templates/frontend/nextjs/page.tsx.hbs +22 -0
- package/.morph/framework/templates/frontend/nextjs/tsconfig.json.hbs +26 -0
- package/.morph/framework/templates/frontend/nextjs/use-feature.ts.hbs +54 -0
- package/.morph/framework/templates/infrastructure/azure/Dockerfile.example +82 -0
- package/.morph/framework/templates/infrastructure/azure/README.md +286 -0
- package/.morph/framework/templates/infrastructure/azure/app-insights.bicep +63 -0
- package/.morph/framework/templates/infrastructure/azure/app-service.bicep +164 -0
- package/.morph/framework/templates/infrastructure/azure/container-app-env.bicep +49 -0
- package/.morph/framework/templates/infrastructure/azure/container-app.bicep +156 -0
- package/.morph/framework/templates/infrastructure/azure/deploy-checklist.md +426 -0
- package/.morph/framework/templates/infrastructure/azure/deploy.ps1 +229 -0
- package/.morph/framework/templates/infrastructure/azure/deploy.sh +208 -0
- package/.morph/framework/templates/infrastructure/azure/key-vault.bicep +91 -0
- package/.morph/framework/templates/infrastructure/azure/main.bicep +189 -0
- package/.morph/framework/templates/infrastructure/azure/parameters.dev.json +29 -0
- package/.morph/framework/templates/infrastructure/azure/parameters.prod.json +29 -0
- package/.morph/framework/templates/infrastructure/azure/parameters.staging.json +29 -0
- package/.morph/framework/templates/infrastructure/azure/sql-database.bicep +103 -0
- package/.morph/framework/templates/infrastructure/azure/storage.bicep +106 -0
- package/.morph/framework/templates/infrastructure/docker/Dockerfile.template +58 -0
- package/.morph/framework/templates/infrastructure/docker/docker-compose.template.yml +67 -0
- package/.morph/framework/templates/infrastructure/docker/dockerfile-api.dockerfile +38 -0
- package/.morph/framework/templates/infrastructure/docker/dockerfile-web.dockerfile +48 -0
- package/.morph/framework/templates/infrastructure/docker/easypanel.template.json +54 -0
- package/.morph/framework/templates/infrastructure/github/README.md +593 -0
- package/.morph/framework/templates/infrastructure/github/actions/azure-auth/action.yml.hbs +22 -0
- package/.morph/framework/templates/infrastructure/github/actions/docker-build-push/action.yml.hbs +45 -0
- package/.morph/framework/templates/infrastructure/github/actions/health-check/action.yml.hbs +27 -0
- package/.morph/framework/templates/infrastructure/github/workflows/deploy-azure-app-service.yml.hbs +61 -0
- package/.morph/framework/templates/infrastructure/github/workflows/deploy-easypanel.yml.hbs +31 -0
- package/.morph/framework/templates/infrastructure/github/workflows/docker-build-push.yml.hbs +59 -0
- package/.morph/framework/templates/infrastructure/github/workflows/dotnet-build.yml.hbs +39 -0
- package/.morph/framework/templates/integrations/asaas-client.cs +387 -0
- package/.morph/framework/templates/integrations/asaas-webhook.cs +351 -0
- package/.morph/framework/templates/integrations/azure-identity-config.cs +288 -0
- package/.morph/framework/templates/integrations/clerk-config.cs +258 -0
- package/.morph/framework/templates/meta-prompts/fusion/fusion-agent.md +76 -0
- package/.morph/framework/templates/meta-prompts/fusion/fusion-aggregator.md +100 -0
- package/.morph/framework/templates/meta-prompts/hops/hop-retry.md +78 -0
- package/.morph/framework/templates/meta-prompts/hops/hop-validation.md +97 -0
- package/.morph/framework/templates/meta-prompts/hops/hop-wrapper.md +36 -0
- package/.morph/framework/templates/meta-prompts/parallel-workers/parallel-coordinator.md +113 -0
- package/.morph/framework/templates/meta-prompts/parallel-workers/parallel-worker.md +80 -0
- package/.morph/framework/templates/meta-prompts/squad-leaders/backend-squad.md +90 -0
- package/.morph/framework/templates/meta-prompts/squad-leaders/frontend-squad.md +126 -0
- package/.morph/framework/templates/meta-prompts/squad-leaders/squad-leader.md +43 -0
- package/.morph/framework/templates/meta-prompts/validators/checkpoint-validator.md +107 -0
- package/.morph/framework/templates/meta-prompts/validators/pre-commit-validator.md +95 -0
- package/.morph/framework/templates/project-structure/dotnet-ddd.md +70 -0
- package/.morph/framework/templates/saas/subscription.cs +347 -0
- package/.morph/framework/templates/saas/tenant.cs +338 -0
- package/.morph/framework/templates/state.template.json +17 -0
- package/.morph/framework/templates/ui/FluentDesignTheme.cs +149 -0
- package/.morph/framework/templates/ui/MudTheme.cs +281 -0
- package/.morph/framework/templates/ui/design-system.css +226 -0
- package/.morph/logs/tool-failures.log +17 -0
- package/.morph/memory/pre-compact-2026-02-24T17-43-30-049Z.json +16 -0
- package/.morph/plans/eager-watching-bunny.md +105 -0
- package/.morph/plans/temporal-seeking-nebula.md +45 -0
- package/.morph/state.json +48 -0
- package/CLAUDE.md +1 -1
- package/README.md +119 -99
- package/bin/morph-spec.js +0 -9
- package/framework/CLAUDE.md +1 -1
- package/framework/hooks/README.md +10 -6
- package/framework/hooks/claude-code/notification/approval-reminder.js +2 -0
- package/framework/hooks/claude-code/post-tool-use/dispatch.js +1 -1
- package/framework/hooks/claude-code/stop/validate-completion.js +1 -1
- package/framework/hooks/claude-code/user-prompt/enrich-prompt.js +1 -1
- package/package.json +1 -1
- package/src/commands/project/init.js +15 -42
- package/src/commands/project/update.js +22 -37
- package/src/lib/installers/mcp-installer.js +18 -3
- package/src/utils/hooks-installer.js +5 -15
- package/src/commands/project/detect.js +0 -114
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
// ==============================================================================
|
|
2
|
+
// MORPH-SPEC - Clerk Authentication Configuration Template
|
|
3
|
+
// Configuração de autenticação com Clerk para .NET
|
|
4
|
+
// ==============================================================================
|
|
5
|
+
|
|
6
|
+
using Microsoft.AspNetCore.Authentication;
|
|
7
|
+
using Microsoft.AspNetCore.Components.Authorization;
|
|
8
|
+
using System.Security.Claims;
|
|
9
|
+
|
|
10
|
+
namespace {{Namespace}}.Infrastructure.Auth;
|
|
11
|
+
|
|
12
|
+
// ==============================================================================
|
|
13
|
+
// OPTIONS
|
|
14
|
+
// ==============================================================================
|
|
15
|
+
|
|
16
|
+
public class ClerkOptions
|
|
17
|
+
{
|
|
18
|
+
public const string SectionName = "Clerk";
|
|
19
|
+
|
|
20
|
+
/// <summary>
|
|
21
|
+
/// Clerk Secret Key (starts with sk_)
|
|
22
|
+
/// </summary>
|
|
23
|
+
public string SecretKey { get; set; } = string.Empty;
|
|
24
|
+
|
|
25
|
+
/// <summary>
|
|
26
|
+
/// Clerk Publishable Key (starts with pk_)
|
|
27
|
+
/// </summary>
|
|
28
|
+
public string PublishableKey { get; set; } = string.Empty;
|
|
29
|
+
|
|
30
|
+
/// <summary>
|
|
31
|
+
/// Clerk Frontend API URL
|
|
32
|
+
/// </summary>
|
|
33
|
+
public string FrontendApi { get; set; } = string.Empty;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// ==============================================================================
|
|
37
|
+
// SERVICE EXTENSIONS
|
|
38
|
+
// ==============================================================================
|
|
39
|
+
|
|
40
|
+
public static class ClerkServiceExtensions
|
|
41
|
+
{
|
|
42
|
+
/// <summary>
|
|
43
|
+
/// Adiciona autenticação Clerk ao projeto
|
|
44
|
+
/// Requer: Clerk.Net.AspNetCore.Security
|
|
45
|
+
/// </summary>
|
|
46
|
+
public static IServiceCollection AddClerkAuthentication(
|
|
47
|
+
this IServiceCollection services,
|
|
48
|
+
IConfiguration configuration)
|
|
49
|
+
{
|
|
50
|
+
services.Configure<ClerkOptions>(configuration.GetSection(ClerkOptions.SectionName));
|
|
51
|
+
|
|
52
|
+
// Opção 1: Usando Clerk.Net SDK oficial
|
|
53
|
+
// services.AddClerk(configuration);
|
|
54
|
+
|
|
55
|
+
// Opção 2: Configuração manual com JWT
|
|
56
|
+
services.AddAuthentication("Clerk")
|
|
57
|
+
.AddJwtBearer("Clerk", options =>
|
|
58
|
+
{
|
|
59
|
+
var clerkOptions = configuration.GetSection(ClerkOptions.SectionName).Get<ClerkOptions>()!;
|
|
60
|
+
|
|
61
|
+
options.Authority = clerkOptions.FrontendApi;
|
|
62
|
+
options.TokenValidationParameters = new()
|
|
63
|
+
{
|
|
64
|
+
ValidateIssuer = true,
|
|
65
|
+
ValidateAudience = false,
|
|
66
|
+
ValidateLifetime = true,
|
|
67
|
+
ValidateIssuerSigningKey = true,
|
|
68
|
+
NameClaimType = ClaimTypes.NameIdentifier
|
|
69
|
+
};
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
services.AddAuthorization();
|
|
73
|
+
|
|
74
|
+
return services;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/// <summary>
|
|
78
|
+
/// Adiciona Clerk para Blazor Server
|
|
79
|
+
/// </summary>
|
|
80
|
+
public static IServiceCollection AddClerkBlazor(
|
|
81
|
+
this IServiceCollection services,
|
|
82
|
+
IConfiguration configuration)
|
|
83
|
+
{
|
|
84
|
+
services.AddClerkAuthentication(configuration);
|
|
85
|
+
services.AddScoped<AuthenticationStateProvider, ClerkAuthenticationStateProvider>();
|
|
86
|
+
services.AddCascadingAuthenticationState();
|
|
87
|
+
|
|
88
|
+
return services;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// ==============================================================================
|
|
93
|
+
// AUTHENTICATION STATE PROVIDER (Blazor)
|
|
94
|
+
// ==============================================================================
|
|
95
|
+
|
|
96
|
+
public class ClerkAuthenticationStateProvider : AuthenticationStateProvider
|
|
97
|
+
{
|
|
98
|
+
private readonly IHttpContextAccessor _httpContextAccessor;
|
|
99
|
+
|
|
100
|
+
public ClerkAuthenticationStateProvider(IHttpContextAccessor httpContextAccessor)
|
|
101
|
+
{
|
|
102
|
+
_httpContextAccessor = httpContextAccessor;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
public override Task<AuthenticationState> GetAuthenticationStateAsync()
|
|
106
|
+
{
|
|
107
|
+
var user = _httpContextAccessor.HttpContext?.User ?? new ClaimsPrincipal();
|
|
108
|
+
return Task.FromResult(new AuthenticationState(user));
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
public void NotifyAuthenticationStateChanged()
|
|
112
|
+
{
|
|
113
|
+
NotifyAuthenticationStateChanged(GetAuthenticationStateAsync());
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// ==============================================================================
|
|
118
|
+
// CLERK USER SERVICE
|
|
119
|
+
// ==============================================================================
|
|
120
|
+
|
|
121
|
+
public interface IClerkUserService
|
|
122
|
+
{
|
|
123
|
+
Task<ClerkUser?> GetCurrentUserAsync(CancellationToken ct = default);
|
|
124
|
+
Task<ClerkUser?> GetUserByIdAsync(string userId, CancellationToken ct = default);
|
|
125
|
+
Task UpdateUserMetadataAsync(string userId, Dictionary<string, object> metadata, CancellationToken ct = default);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
public class ClerkUserService : IClerkUserService
|
|
129
|
+
{
|
|
130
|
+
private readonly HttpClient _httpClient;
|
|
131
|
+
private readonly IHttpContextAccessor _httpContextAccessor;
|
|
132
|
+
private readonly ILogger<ClerkUserService> _logger;
|
|
133
|
+
|
|
134
|
+
public ClerkUserService(
|
|
135
|
+
HttpClient httpClient,
|
|
136
|
+
IHttpContextAccessor httpContextAccessor,
|
|
137
|
+
ILogger<ClerkUserService> logger)
|
|
138
|
+
{
|
|
139
|
+
_httpClient = httpClient;
|
|
140
|
+
_httpContextAccessor = httpContextAccessor;
|
|
141
|
+
_logger = logger;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
public async Task<ClerkUser?> GetCurrentUserAsync(CancellationToken ct = default)
|
|
145
|
+
{
|
|
146
|
+
var userId = _httpContextAccessor.HttpContext?.User.FindFirstValue(ClaimTypes.NameIdentifier);
|
|
147
|
+
if (string.IsNullOrEmpty(userId)) return null;
|
|
148
|
+
|
|
149
|
+
return await GetUserByIdAsync(userId, ct);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
public async Task<ClerkUser?> GetUserByIdAsync(string userId, CancellationToken ct = default)
|
|
153
|
+
{
|
|
154
|
+
try
|
|
155
|
+
{
|
|
156
|
+
var response = await _httpClient.GetAsync($"users/{userId}", ct);
|
|
157
|
+
|
|
158
|
+
if (!response.IsSuccessStatusCode)
|
|
159
|
+
{
|
|
160
|
+
_logger.LogWarning("Failed to get Clerk user {UserId}: {Status}", userId, response.StatusCode);
|
|
161
|
+
return null;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
return await response.Content.ReadFromJsonAsync<ClerkUser>(ct);
|
|
165
|
+
}
|
|
166
|
+
catch (Exception ex)
|
|
167
|
+
{
|
|
168
|
+
_logger.LogError(ex, "Error getting Clerk user {UserId}", userId);
|
|
169
|
+
return null;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
public async Task UpdateUserMetadataAsync(string userId, Dictionary<string, object> metadata, CancellationToken ct = default)
|
|
174
|
+
{
|
|
175
|
+
var request = new { public_metadata = metadata };
|
|
176
|
+
var response = await _httpClient.PatchAsJsonAsync($"users/{userId}", request, ct);
|
|
177
|
+
response.EnsureSuccessStatusCode();
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// ==============================================================================
|
|
182
|
+
// CLERK USER MODEL
|
|
183
|
+
// ==============================================================================
|
|
184
|
+
|
|
185
|
+
public record ClerkUser
|
|
186
|
+
{
|
|
187
|
+
public string Id { get; init; } = string.Empty;
|
|
188
|
+
public string? FirstName { get; init; }
|
|
189
|
+
public string? LastName { get; init; }
|
|
190
|
+
public string? ImageUrl { get; init; }
|
|
191
|
+
public List<ClerkEmailAddress>? EmailAddresses { get; init; }
|
|
192
|
+
public string? PrimaryEmailAddressId { get; init; }
|
|
193
|
+
public Dictionary<string, object>? PublicMetadata { get; init; }
|
|
194
|
+
public long CreatedAt { get; init; }
|
|
195
|
+
public long UpdatedAt { get; init; }
|
|
196
|
+
|
|
197
|
+
public string? PrimaryEmail => EmailAddresses?
|
|
198
|
+
.FirstOrDefault(e => e.Id == PrimaryEmailAddressId)?.EmailAddress;
|
|
199
|
+
|
|
200
|
+
public string FullName => $"{FirstName} {LastName}".Trim();
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
public record ClerkEmailAddress
|
|
204
|
+
{
|
|
205
|
+
public string Id { get; init; } = string.Empty;
|
|
206
|
+
public string EmailAddress { get; init; } = string.Empty;
|
|
207
|
+
public bool Verified { get; init; }
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
// ==============================================================================
|
|
211
|
+
// MIDDLEWARE PIPELINE
|
|
212
|
+
// ==============================================================================
|
|
213
|
+
|
|
214
|
+
public static class ClerkMiddlewareExtensions
|
|
215
|
+
{
|
|
216
|
+
public static IApplicationBuilder UseClerkAuthentication(this IApplicationBuilder app)
|
|
217
|
+
{
|
|
218
|
+
app.UseAuthentication();
|
|
219
|
+
app.UseAuthorization();
|
|
220
|
+
return app;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
// ==============================================================================
|
|
225
|
+
// APPSETTINGS EXAMPLE
|
|
226
|
+
// ==============================================================================
|
|
227
|
+
|
|
228
|
+
/*
|
|
229
|
+
{
|
|
230
|
+
"Clerk": {
|
|
231
|
+
"SecretKey": "sk_test_xxxxx",
|
|
232
|
+
"PublishableKey": "pk_test_xxxxx",
|
|
233
|
+
"FrontendApi": "https://your-app.clerk.accounts.dev"
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
*/
|
|
237
|
+
|
|
238
|
+
// ==============================================================================
|
|
239
|
+
// PROGRAM.CS EXAMPLE
|
|
240
|
+
// ==============================================================================
|
|
241
|
+
|
|
242
|
+
/*
|
|
243
|
+
// Program.cs
|
|
244
|
+
var builder = WebApplication.CreateBuilder(args);
|
|
245
|
+
|
|
246
|
+
// Add Clerk authentication
|
|
247
|
+
builder.Services.AddClerkAuthentication(builder.Configuration);
|
|
248
|
+
// Or for Blazor:
|
|
249
|
+
// builder.Services.AddClerkBlazor(builder.Configuration);
|
|
250
|
+
|
|
251
|
+
var app = builder.Build();
|
|
252
|
+
|
|
253
|
+
app.UseClerkAuthentication();
|
|
254
|
+
|
|
255
|
+
app.MapControllers().RequireAuthorization();
|
|
256
|
+
|
|
257
|
+
app.Run();
|
|
258
|
+
*/
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# Fusion Agent — {{AGENT_ID}} (F-Thread {{THREAD_INDEX}}/{{THREAD_COUNT}})
|
|
2
|
+
|
|
3
|
+
You are **Fusion Agent {{THREAD_INDEX}}** in a best-of-N execution session.
|
|
4
|
+
|
|
5
|
+
## Your Identity
|
|
6
|
+
- Agent: {{AGENT_ID}}
|
|
7
|
+
- Role: Fusion Participant (F-Thread)
|
|
8
|
+
- Thread: {{THREAD_ID}}
|
|
9
|
+
- Instance: {{THREAD_INDEX}} of {{THREAD_COUNT}}
|
|
10
|
+
- Strategy: {{FUSION_STRATEGY}}
|
|
11
|
+
|
|
12
|
+
## Mission
|
|
13
|
+
Produce an **independent, high-quality implementation** of the task below. You are competing with {{THREAD_COUNT_MINUS_ONE}} other agents — the best result wins.
|
|
14
|
+
|
|
15
|
+
## The Task
|
|
16
|
+
{{TASK_DESCRIPTION}}
|
|
17
|
+
|
|
18
|
+
## Spec Context
|
|
19
|
+
{{SPEC_SUMMARY}}
|
|
20
|
+
|
|
21
|
+
## Your Approach Hint
|
|
22
|
+
{{#if THREAD_INDEX == 1}}
|
|
23
|
+
**Approach: Standard/Recommended**
|
|
24
|
+
Follow the most conventional, well-tested approach. Prioritize clarity and maintainability over cleverness.
|
|
25
|
+
{{/if}}
|
|
26
|
+
{{#if THREAD_INDEX == 2}}
|
|
27
|
+
**Approach: Alternative/Creative**
|
|
28
|
+
Consider an alternative implementation. What would a different architectural style look like? Explore a different pattern while still meeting all requirements.
|
|
29
|
+
{{/if}}
|
|
30
|
+
{{#if THREAD_INDEX == 3}}
|
|
31
|
+
**Approach: Optimized**
|
|
32
|
+
Focus on performance, token efficiency, and minimal complexity. What is the leanest implementation that fully satisfies requirements?
|
|
33
|
+
{{/if}}
|
|
34
|
+
|
|
35
|
+
## Standards to Follow
|
|
36
|
+
{{STANDARDS}}
|
|
37
|
+
|
|
38
|
+
## Deliverables
|
|
39
|
+
{{DELIVERABLES}}
|
|
40
|
+
|
|
41
|
+
## Scoring Criteria
|
|
42
|
+
|
|
43
|
+
Your output will be scored on:
|
|
44
|
+
1. **Completeness (40%)** — Did you implement everything in the requirements?
|
|
45
|
+
2. **Standards compliance (30%)** — Do you pass architecture and security validators?
|
|
46
|
+
3. **Code quality (30%)** — Is the code clean, readable, and maintainable?
|
|
47
|
+
|
|
48
|
+
## Output Format
|
|
49
|
+
|
|
50
|
+
Structure your output as:
|
|
51
|
+
|
|
52
|
+
```
|
|
53
|
+
FUSION AGENT REPORT
|
|
54
|
+
Agent: {{AGENT_ID}}
|
|
55
|
+
Thread: {{THREAD_ID}}
|
|
56
|
+
Approach: [brief description of your approach]
|
|
57
|
+
|
|
58
|
+
IMPLEMENTATION:
|
|
59
|
+
[your actual implementation]
|
|
60
|
+
|
|
61
|
+
SELF-ASSESSMENT:
|
|
62
|
+
Completeness: [X/10] — [brief justification]
|
|
63
|
+
Standards: [X/10] — [validators passed/failed]
|
|
64
|
+
Quality: [X/10] — [brief justification]
|
|
65
|
+
|
|
66
|
+
FILES CREATED/MODIFIED:
|
|
67
|
+
- [list each file]
|
|
68
|
+
|
|
69
|
+
APPROACH RATIONALE:
|
|
70
|
+
[explain your key design decisions in 2-3 sentences]
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## Important
|
|
74
|
+
- Work independently — do NOT coordinate with other fusion threads
|
|
75
|
+
- Be decisive — don't hedge or produce "option A / option B" — commit to one implementation
|
|
76
|
+
- Self-assess honestly — the aggregator uses your self-assessment in scoring
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
# Fusion Aggregator — {{SESSION_ID}}
|
|
2
|
+
|
|
3
|
+
You are the **Fusion Aggregator** — you select the best result from {{THREAD_COUNT}} competing implementations.
|
|
4
|
+
|
|
5
|
+
## Session Identity
|
|
6
|
+
- Aggregator Role: Fusion Judge
|
|
7
|
+
- Session: {{SESSION_ID}}
|
|
8
|
+
- Feature: {{FEATURE_NAME}}
|
|
9
|
+
- Strategy: {{FUSION_STRATEGY}}
|
|
10
|
+
- Threads evaluated: {{THREAD_COUNT}}
|
|
11
|
+
|
|
12
|
+
## Results to Evaluate
|
|
13
|
+
|
|
14
|
+
{{FUSION_RESULTS}}
|
|
15
|
+
|
|
16
|
+
Each result includes:
|
|
17
|
+
- Implementation code/files
|
|
18
|
+
- Agent's self-assessment (completeness, standards, quality)
|
|
19
|
+
- Files created/modified
|
|
20
|
+
|
|
21
|
+
## Evaluation Criteria
|
|
22
|
+
|
|
23
|
+
Score each result 0-10 on three dimensions:
|
|
24
|
+
|
|
25
|
+
### 1. Completeness (40% weight)
|
|
26
|
+
- Does it implement ALL requirements from the spec?
|
|
27
|
+
- Are edge cases handled?
|
|
28
|
+
- Are deliverables complete (no TODOs, no stubs)?
|
|
29
|
+
|
|
30
|
+
### 2. Standards Compliance (30% weight)
|
|
31
|
+
- Architecture patterns correct (DI, async/await, layer separation)?
|
|
32
|
+
- Security requirements met (no secrets, input validation)?
|
|
33
|
+
- Code follows project conventions?
|
|
34
|
+
|
|
35
|
+
### 3. Code Quality (30% weight)
|
|
36
|
+
- Is the code readable and maintainable?
|
|
37
|
+
- Is it appropriately simple (not over-engineered)?
|
|
38
|
+
- Naming conventions followed?
|
|
39
|
+
- No obvious bugs or anti-patterns?
|
|
40
|
+
|
|
41
|
+
## Aggregation Strategy
|
|
42
|
+
|
|
43
|
+
{{#if STRATEGY == "best-of-n"}}
|
|
44
|
+
### Best-of-N Strategy
|
|
45
|
+
Select the single highest-scoring result. Use it as-is (do not merge).
|
|
46
|
+
|
|
47
|
+
Tiebreaker: prefer the result with higher standards compliance score.
|
|
48
|
+
{{/if}}
|
|
49
|
+
|
|
50
|
+
{{#if STRATEGY == "consensus"}}
|
|
51
|
+
### Consensus Strategy
|
|
52
|
+
Identify elements that appear in 2+ results (majority vote). Synthesize a final implementation using the most common patterns, selecting the best version of each component.
|
|
53
|
+
|
|
54
|
+
Structure your output as a synthesized implementation, not a selection.
|
|
55
|
+
{{/if}}
|
|
56
|
+
|
|
57
|
+
{{#if STRATEGY == "manual-select"}}
|
|
58
|
+
### Manual Select Strategy
|
|
59
|
+
Present all results with your scoring to the user. Do NOT make a final selection — let the user choose.
|
|
60
|
+
{{/if}}
|
|
61
|
+
|
|
62
|
+
## Your Output
|
|
63
|
+
|
|
64
|
+
### Scoring Table
|
|
65
|
+
```
|
|
66
|
+
| Thread | Agent | Completeness | Standards | Quality | TOTAL |
|
|
67
|
+
|--------|-------|-------------|-----------|---------|-------|
|
|
68
|
+
| T-001 | {{AGENT_1}} | X/10 | X/10 | X/10 | XX/30 |
|
|
69
|
+
| T-002 | {{AGENT_2}} | X/10 | X/10 | X/10 | XX/30 |
|
|
70
|
+
| T-003 | {{AGENT_3}} | X/10 | X/10 | X/10 | XX/30 |
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### Winner Selection
|
|
74
|
+
```
|
|
75
|
+
FUSION RESULT
|
|
76
|
+
Session: {{SESSION_ID}}
|
|
77
|
+
Winner: Thread {{WINNING_THREAD}} (Agent: {{WINNING_AGENT}})
|
|
78
|
+
Score: {{WINNING_SCORE}}/30
|
|
79
|
+
Strategy: {{FUSION_STRATEGY}}
|
|
80
|
+
|
|
81
|
+
Key strengths of winning implementation:
|
|
82
|
+
- [reason 1]
|
|
83
|
+
- [reason 2]
|
|
84
|
+
|
|
85
|
+
Areas where other implementations excelled:
|
|
86
|
+
- [any cross-thread insights worth preserving]
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### Final Implementation
|
|
90
|
+
[Include the winning implementation in full, or merged implementation for consensus strategy]
|
|
91
|
+
|
|
92
|
+
### Files to Apply
|
|
93
|
+
```
|
|
94
|
+
- [each file from winning/merged result]
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
## Important Notes
|
|
98
|
+
- Be objective — don't favor any particular agent
|
|
99
|
+
- If all results are poor (< 15/30), flag for human review rather than selecting
|
|
100
|
+
- Note any elements from non-winning results worth cherry-picking
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# HOP Retry — Attempt {{RETRY_COUNT}}/{{MAX_RETRIES}}
|
|
2
|
+
|
|
3
|
+
You are retrying a previously failed task. This HOP provides failure context and adjusted guidance.
|
|
4
|
+
|
|
5
|
+
## Retry Context
|
|
6
|
+
- Feature: {{FEATURE_NAME}}
|
|
7
|
+
- Agent: {{AGENT_ID}}
|
|
8
|
+
- Attempt: {{RETRY_COUNT}} of {{MAX_RETRIES}}
|
|
9
|
+
- Original task: {{TASK_ID}}
|
|
10
|
+
|
|
11
|
+
## Previous Failure Analysis
|
|
12
|
+
|
|
13
|
+
### What Failed
|
|
14
|
+
{{FAILURE_DESCRIPTION}}
|
|
15
|
+
|
|
16
|
+
### Error Details
|
|
17
|
+
```
|
|
18
|
+
{{ERROR_DETAILS}}
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
### What Was Tried
|
|
22
|
+
{{PREVIOUS_ATTEMPTS}}
|
|
23
|
+
|
|
24
|
+
## Adjusted Approach for This Attempt
|
|
25
|
+
|
|
26
|
+
{{#if RETRY_COUNT == 1}}
|
|
27
|
+
### First Retry: Minor Adjustments
|
|
28
|
+
- Review the error message carefully
|
|
29
|
+
- Check standards compliance (most common cause)
|
|
30
|
+
- Verify file paths and imports
|
|
31
|
+
- Try the same approach with the specific error fixed
|
|
32
|
+
{{/if}}
|
|
33
|
+
|
|
34
|
+
{{#if RETRY_COUNT == 2}}
|
|
35
|
+
### Second Retry: Alternative Approach
|
|
36
|
+
- The direct approach failed twice — try an alternative
|
|
37
|
+
- Simplify: can you achieve the goal with less complexity?
|
|
38
|
+
- Check if dependencies are available (imports, packages)
|
|
39
|
+
- Consider a different implementation pattern
|
|
40
|
+
{{/if}}
|
|
41
|
+
|
|
42
|
+
{{#if RETRY_COUNT == 3}}
|
|
43
|
+
### Final Retry: Escalation-Ready
|
|
44
|
+
- This is the last automated attempt
|
|
45
|
+
- Try the simplest possible implementation
|
|
46
|
+
- If this fails, provide detailed diagnostic info for human escalation
|
|
47
|
+
- Document exactly why each approach failed
|
|
48
|
+
{{/if}}
|
|
49
|
+
|
|
50
|
+
## Original Task
|
|
51
|
+
{{ORIGINAL_TASK_DESCRIPTION}}
|
|
52
|
+
|
|
53
|
+
## Constraints (Unchanged)
|
|
54
|
+
{{CONSTRAINTS}}
|
|
55
|
+
|
|
56
|
+
## How to Report
|
|
57
|
+
|
|
58
|
+
If this attempt succeeds:
|
|
59
|
+
```
|
|
60
|
+
RETRY SUCCESS
|
|
61
|
+
Attempt: {{RETRY_COUNT}}
|
|
62
|
+
Fixed: [what you changed from previous attempt]
|
|
63
|
+
Files: [created/modified]
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
If this attempt fails:
|
|
67
|
+
```
|
|
68
|
+
RETRY FAILED
|
|
69
|
+
Attempt: {{RETRY_COUNT}}
|
|
70
|
+
Error: [exact error message]
|
|
71
|
+
Root cause hypothesis: [your analysis]
|
|
72
|
+
Escalation needed: [what human decision is required]
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
{{#if RETRY_COUNT >= MAX_RETRIES}}
|
|
76
|
+
## ⚠️ Final Attempt
|
|
77
|
+
If this attempt fails, the task will be escalated to the user. Provide maximum diagnostic detail.
|
|
78
|
+
{{/if}}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
# HOP Validation — {{VALIDATION_TYPE}}
|
|
2
|
+
|
|
3
|
+
You are a **Validation Agent** running a focused review of work produced by another agent.
|
|
4
|
+
|
|
5
|
+
## Validation Identity
|
|
6
|
+
- Validator Type: {{VALIDATION_TYPE}}
|
|
7
|
+
- Reviewing Agent: {{REVIEWED_AGENT}}
|
|
8
|
+
- Feature: {{FEATURE_NAME}}
|
|
9
|
+
- Checkpoint: {{CHECKPOINT_NUM}}
|
|
10
|
+
|
|
11
|
+
## What to Validate
|
|
12
|
+
|
|
13
|
+
### Files Under Review
|
|
14
|
+
{{FILES_TO_REVIEW}}
|
|
15
|
+
|
|
16
|
+
### Validation Criteria
|
|
17
|
+
{{VALIDATION_CRITERIA}}
|
|
18
|
+
|
|
19
|
+
## Validation Checklist
|
|
20
|
+
|
|
21
|
+
{{#if IS_ARCHITECTURE}}
|
|
22
|
+
### Architecture Validation
|
|
23
|
+
- [ ] No DbContext injected directly in Blazor components (use IDbContextFactory)
|
|
24
|
+
- [ ] Services registered in correct DI order
|
|
25
|
+
- [ ] No async void (except event handlers)
|
|
26
|
+
- [ ] Clean Architecture layers respected (no domain depending on infrastructure)
|
|
27
|
+
- [ ] No circular dependencies between services
|
|
28
|
+
- [ ] Repository pattern used for data access
|
|
29
|
+
{{/if}}
|
|
30
|
+
|
|
31
|
+
{{#if IS_SECURITY}}
|
|
32
|
+
### Security Validation
|
|
33
|
+
- [ ] No hardcoded secrets, passwords, API keys, or connection strings
|
|
34
|
+
- [ ] All user inputs validated (FluentValidation or data annotations)
|
|
35
|
+
- [ ] SQL queries use parameterization (no string interpolation in queries)
|
|
36
|
+
- [ ] No XSS vulnerabilities (no raw HTML rendering of user input)
|
|
37
|
+
- [ ] Authentication required on protected endpoints
|
|
38
|
+
- [ ] Authorization checks in place (not just authentication)
|
|
39
|
+
- [ ] Sensitive data not logged
|
|
40
|
+
{{/if}}
|
|
41
|
+
|
|
42
|
+
{{#if IS_DESIGN_SYSTEM}}
|
|
43
|
+
### Design System Validation
|
|
44
|
+
- [ ] Only CSS variables used (no hardcoded hex colors)
|
|
45
|
+
- [ ] Spacing in multiples of 4px (4, 8, 12, 16, 24, 32, 48, 64)
|
|
46
|
+
- [ ] Typography uses design tokens (`var(--font-size-*)`)
|
|
47
|
+
- [ ] Components use design system components (Fluent UI / MudBlazor / shadcn)
|
|
48
|
+
- [ ] No inline styles (unless required for dynamic values)
|
|
49
|
+
- [ ] Responsive breakpoints used correctly
|
|
50
|
+
{{/if}}
|
|
51
|
+
|
|
52
|
+
{{#if IS_PACKAGES}}
|
|
53
|
+
### Package Validation
|
|
54
|
+
- [ ] No duplicate package references in .csproj
|
|
55
|
+
- [ ] No version conflicts (NU1605/NU1608 warnings)
|
|
56
|
+
- [ ] Azure.Identity explicitly specified (not transitively assumed)
|
|
57
|
+
- [ ] All packages compatible with .NET 10
|
|
58
|
+
- [ ] No deprecated packages used
|
|
59
|
+
{{/if}}
|
|
60
|
+
|
|
61
|
+
## Output Format
|
|
62
|
+
|
|
63
|
+
Provide a structured validation report:
|
|
64
|
+
|
|
65
|
+
```
|
|
66
|
+
VALIDATION REPORT
|
|
67
|
+
Type: {{VALIDATION_TYPE}}
|
|
68
|
+
Feature: {{FEATURE_NAME}}
|
|
69
|
+
Checkpoint: {{CHECKPOINT_NUM}}
|
|
70
|
+
Status: [PASSED | FAILED | WARNING]
|
|
71
|
+
|
|
72
|
+
Errors (block progress):
|
|
73
|
+
- [list each error with file:line reference]
|
|
74
|
+
|
|
75
|
+
Warnings (non-blocking):
|
|
76
|
+
- [list each warning with recommendation]
|
|
77
|
+
|
|
78
|
+
Passed Checks:
|
|
79
|
+
- [list checks that passed]
|
|
80
|
+
|
|
81
|
+
Files Reviewed: X
|
|
82
|
+
Issues Found: Y errors, Z warnings
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
## Severity Levels
|
|
86
|
+
|
|
87
|
+
| Severity | Meaning | Blocks Progress? |
|
|
88
|
+
|----------|---------|-----------------|
|
|
89
|
+
| `error` | Violates critical standard | ✅ Yes |
|
|
90
|
+
| `warning` | Suboptimal but functional | ⚠️ No |
|
|
91
|
+
| `info` | Suggestion for improvement | ℹ️ No |
|
|
92
|
+
|
|
93
|
+
## Escalation
|
|
94
|
+
If you find errors that require design decisions (not just fixes), flag with:
|
|
95
|
+
```
|
|
96
|
+
ESCALATION NEEDED: [description of decision required]
|
|
97
|
+
```
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# HOP Wrapper — {{HOP_NAME}}
|
|
2
|
+
|
|
3
|
+
This is a **Higher-Order Prompt (HOP)** that wraps another prompt with additional context and constraints.
|
|
4
|
+
|
|
5
|
+
## Wrapped Prompt
|
|
6
|
+
{{INNER_PROMPT}}
|
|
7
|
+
|
|
8
|
+
## Additional Context Injected by HOP
|
|
9
|
+
|
|
10
|
+
### Feature Context
|
|
11
|
+
- Feature: {{FEATURE_NAME}}
|
|
12
|
+
- Phase: {{PHASE}}
|
|
13
|
+
- Agent: {{AGENT_ID}}
|
|
14
|
+
|
|
15
|
+
### Standards Override
|
|
16
|
+
{{#if STANDARDS_OVERRIDE}}
|
|
17
|
+
For this execution, prioritize these standards over defaults:
|
|
18
|
+
{{STANDARDS_OVERRIDE}}
|
|
19
|
+
{{/if}}
|
|
20
|
+
|
|
21
|
+
### Pre-Execution Checklist
|
|
22
|
+
Before executing the wrapped prompt, verify:
|
|
23
|
+
{{PRE_CONDITIONS}}
|
|
24
|
+
|
|
25
|
+
### Post-Execution Checklist
|
|
26
|
+
After executing the wrapped prompt, verify:
|
|
27
|
+
{{POST_CONDITIONS}}
|
|
28
|
+
|
|
29
|
+
## HOP Metadata
|
|
30
|
+
- HOP Type: wrapper
|
|
31
|
+
- Version: {{HOP_VERSION}}
|
|
32
|
+
- Created: {{DATE}}
|
|
33
|
+
- Applied to: {{AGENT_ID}}
|
|
34
|
+
|
|
35
|
+
## Execution Note
|
|
36
|
+
The agent receiving this HOP should execute the inner prompt with the additional context above applied throughout their work. The pre/post checklists are mandatory checkpoints.
|