@polymorphism-tech/morph-spec 2.4.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 +158 -26
- package/LICENSE +72 -72
- package/bin/detect-agents.js +225 -225
- package/bin/morph-spec.js +8 -0
- package/bin/render-template.js +302 -302
- package/bin/semantic-detect-agents.js +246 -246
- package/bin/validate-agents-skills.js +251 -251
- package/bin/validate-agents.js +69 -69
- package/bin/validate-phase.js +263 -263
- package/content/.azure/README.md +293 -293
- package/content/.azure/docs/azure-devops-setup.md +454 -454
- package/content/.azure/docs/branch-strategy.md +398 -398
- package/content/.azure/docs/local-development.md +515 -515
- package/content/.azure/pipelines/pipeline-variables.yml +34 -34
- package/content/.azure/pipelines/prod-pipeline.yml +319 -319
- package/content/.azure/pipelines/staging-pipeline.yml +234 -234
- package/content/.azure/pipelines/templates/build-dotnet.yml +75 -75
- package/content/.azure/pipelines/templates/deploy-app-service.yml +94 -94
- package/content/.azure/pipelines/templates/deploy-container-app.yml +120 -120
- package/content/.azure/pipelines/templates/infra-deploy.yml +90 -90
- package/content/.claude/commands/morph-archive.md +79 -79
- package/content/.claude/commands/morph-deploy.md +529 -0
- package/content/.claude/commands/morph-infra.md +209 -209
- package/content/.claude/commands/morph-preflight.md +227 -227
- package/content/.claude/commands/morph-troubleshoot.md +122 -122
- package/content/.claude/settings.local.json +15 -15
- 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/{checklists → level-0-meta}/morph-checklist.md +117 -117
- package/content/.claude/skills/level-1-workflows/README.md +7 -0
- package/content/.claude/skills/{workflows → level-1-workflows}/morph-replicate.md +213 -213
- package/content/.claude/skills/{workflows → level-1-workflows}/phase-clarify.md +131 -131
- package/content/.claude/skills/{workflows → level-1-workflows}/phase-design.md +213 -205
- package/content/.claude/skills/{workflows → level-1-workflows}/phase-setup.md +106 -92
- package/content/.claude/skills/{workflows → level-1-workflows}/phase-tasks.md +164 -164
- package/content/.claude/skills/{workflows → level-1-workflows}/phase-uiux.md +169 -138
- package/content/.claude/skills/level-2-domains/README.md +14 -0
- package/content/.claude/skills/{specialists → level-2-domains/quality}/testing-specialist.md +126 -126
- 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/.morphversion +5 -5
- package/content/.morph/archive/.gitkeep +25 -25
- package/content/.morph/config/agents.json +742 -358
- package/content/.morph/config/config.template.json +33 -0
- package/content/.morph/docs/STORY-DRIVEN-DEVELOPMENT.md +392 -392
- package/content/.morph/docs/workflows/enforcement-pipeline.md +668 -0
- package/content/.morph/examples/api-nextjs/README.md +241 -241
- package/content/.morph/examples/api-nextjs/contracts.ts +307 -307
- package/content/.morph/examples/api-nextjs/spec.md +399 -399
- package/content/.morph/examples/api-nextjs/tasks.md +168 -168
- package/content/.morph/examples/micro-saas/README.md +125 -125
- package/content/.morph/examples/micro-saas/contracts.cs +358 -358
- package/content/.morph/examples/micro-saas/decisions.md +246 -246
- package/content/.morph/examples/micro-saas/spec.md +236 -236
- package/content/.morph/examples/micro-saas/tasks.md +150 -150
- package/content/.morph/examples/multi-agent/README.md +309 -309
- package/content/.morph/examples/multi-agent/contracts.cs +433 -433
- package/content/.morph/examples/multi-agent/spec.md +479 -479
- package/content/.morph/examples/multi-agent/tasks.md +185 -185
- package/content/.morph/examples/scheduled-reports/decisions.md +158 -158
- package/content/.morph/examples/scheduled-reports/proposal.md +95 -95
- package/content/.morph/examples/scheduled-reports/spec.md +267 -267
- package/content/.morph/examples/state-v3.json +188 -188
- package/content/.morph/features/.gitkeep +25 -25
- package/content/.morph/hooks/README.md +158 -0
- package/content/.morph/hooks/pre-commit-all.sh +48 -48
- package/content/.morph/hooks/pre-commit-specs.sh +49 -49
- package/content/.morph/hooks/pre-commit-tests.sh +60 -60
- package/content/.morph/hooks/task-completed.js +73 -0
- package/content/.morph/hooks/teammate-idle.js +68 -0
- package/content/.morph/project.md +160 -160
- package/content/.morph/schemas/agent.schema.json +296 -296
- package/content/.morph/schemas/tasks.schema.json +220 -220
- package/content/.morph/specs/.gitkeep +20 -20
- package/content/.morph/standards/agent-teams-workflow.md +474 -0
- package/content/.morph/standards/coding.md +377 -377
- package/content/.morph/standards/fluent-ui-setup.md +590 -590
- package/content/.morph/standards/migration-guide.md +514 -514
- package/content/.morph/standards/passkeys-auth.md +423 -423
- package/content/.morph/standards/vector-search-rag.md +536 -536
- package/content/.morph/state.json +17 -17
- package/content/.morph/templates/CONTEXT-FEATURE.md +276 -0
- package/content/.morph/templates/CONTEXT.md +170 -0
- package/content/.morph/templates/FluentDesignTheme.cs +149 -149
- package/content/.morph/templates/MudTheme.cs +281 -281
- package/content/.morph/templates/clarify-questions.md +159 -159
- package/content/.morph/templates/component.razor +239 -239
- package/content/.morph/templates/contracts/Commands.cs +74 -74
- package/content/.morph/templates/contracts/Entities.cs +25 -25
- package/content/.morph/templates/contracts/Queries.cs +74 -74
- package/content/.morph/templates/contracts/README.md +74 -74
- package/content/.morph/templates/contracts.cs +217 -217
- package/content/.morph/templates/design-system.css +226 -226
- package/content/.morph/templates/infra/.dockerignore.example +89 -89
- package/content/.morph/templates/infra/Dockerfile.example +82 -82
- package/content/.morph/templates/infra/README.md +286 -286
- package/content/.morph/templates/infra/app-insights.bicep +63 -63
- package/content/.morph/templates/infra/app-service.bicep +164 -164
- package/content/.morph/templates/infra/azure-pipelines-deploy.yml +480 -0
- package/content/.morph/templates/infra/container-app-env.bicep +49 -49
- package/content/.morph/templates/infra/container-app.bicep +156 -156
- package/content/.morph/templates/infra/deploy-checklist.md +426 -426
- package/content/.morph/templates/infra/deploy.ps1 +229 -229
- package/content/.morph/templates/infra/deploy.sh +208 -208
- package/content/.morph/templates/infra/key-vault.bicep +91 -91
- package/content/.morph/templates/infra/main.bicep +189 -189
- package/content/.morph/templates/infra/parameters.dev.json +29 -29
- package/content/.morph/templates/infra/parameters.prod.json +29 -29
- package/content/.morph/templates/infra/parameters.staging.json +29 -29
- package/content/.morph/templates/infra/sql-database.bicep +103 -103
- package/content/.morph/templates/infra/storage.bicep +106 -106
- package/content/.morph/templates/integrations/asaas-client.cs +387 -387
- package/content/.morph/templates/integrations/asaas-webhook.cs +351 -351
- package/content/.morph/templates/integrations/azure-identity-config.cs +288 -288
- package/content/.morph/templates/integrations/clerk-config.cs +258 -258
- package/content/.morph/templates/job.cs +171 -171
- package/content/.morph/templates/migration.cs +83 -83
- package/content/.morph/templates/repository.cs +141 -141
- package/content/.morph/templates/saas/subscription.cs +347 -347
- package/content/.morph/templates/saas/tenant.cs +338 -338
- package/content/.morph/templates/service.cs +139 -139
- package/content/.morph/templates/sprint-status.yaml +68 -68
- package/content/.morph/templates/story.md +143 -143
- package/content/.morph/templates/test.cs +239 -239
- package/content/.morph/templates/ui-design-system.md +286 -286
- package/content/.morph/templates/ui-flows.md +336 -336
- package/content/.morph/templates/ui-mockups.md +133 -133
- package/content/.morph/test-infra/example.bicep +59 -59
- package/content/README.md +79 -79
- package/detectors/config-detector.js +223 -223
- package/detectors/conversation-analyzer.js +163 -163
- package/detectors/index.js +84 -84
- package/detectors/standards-generator.js +275 -275
- package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.svg +977 -977
- package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.svg +1048 -1048
- package/docs/api/scripts/collapse.js +38 -38
- package/docs/api/scripts/commonNav.js +28 -28
- package/docs/api/scripts/linenumber.js +25 -25
- package/docs/api/scripts/nav.js +12 -12
- package/docs/api/scripts/polyfill.js +3 -3
- package/docs/api/scripts/prettify/Apache-License-2.0.txt +202 -202
- package/docs/api/scripts/prettify/lang-css.js +2 -2
- package/docs/api/scripts/prettify/prettify.js +28 -28
- package/docs/api/scripts/search.js +98 -98
- package/docs/api/styles/jsdoc.css +776 -776
- package/docs/api/styles/prettify.css +80 -80
- package/docs/examples.md +328 -328
- package/docs/templates.md +418 -418
- package/package.json +1 -1
- package/scripts/postinstall.js +132 -132
- package/src/commands/advance-phase.js +83 -0
- package/src/commands/analyze-blazor-concurrency.js +193 -193
- package/src/commands/create-story.js +351 -351
- package/src/commands/deploy.js +780 -0
- package/src/commands/detect-agents.js +34 -6
- package/src/commands/detect.js +104 -104
- package/src/commands/generate-context.js +40 -0
- package/src/commands/generate.js +149 -149
- package/src/commands/lint-fluent.js +352 -352
- package/src/commands/rollback-phase.js +185 -185
- package/src/commands/session-summary.js +291 -291
- package/src/commands/shard-spec.js +224 -224
- package/src/commands/sprint-status.js +250 -250
- package/src/commands/state.js +333 -333
- package/src/commands/sync.js +167 -167
- package/src/commands/troubleshoot.js +222 -222
- package/src/commands/validate-blazor-state.js +210 -210
- package/src/commands/validate-blazor.js +156 -156
- package/src/commands/validate-css.js +84 -84
- package/src/commands/validate-phase.js +221 -221
- package/src/lib/blazor-concurrency-analyzer.js +288 -288
- package/src/lib/blazor-state-validator.js +291 -291
- package/src/lib/blazor-validator.js +374 -374
- package/src/lib/context-generator.js +513 -0
- package/src/lib/css-validator.js +352 -352
- package/src/lib/design-system-detector.js +187 -0
- package/src/lib/design-system-generator.js +298 -298
- package/src/lib/design-system-scaffolder.js +299 -0
- package/src/lib/hook-executor.js +256 -0
- package/src/lib/learning-system.js +520 -520
- package/src/lib/mockup-generator.js +366 -366
- package/src/lib/spec-validator.js +258 -0
- package/src/lib/standards-context-injector.js +287 -0
- package/src/lib/team-orchestrator.js +322 -0
- package/src/lib/troubleshoot-grep.js +194 -194
- package/src/lib/troubleshoot-index.js +144 -144
- package/src/lib/ui-detector.js +350 -350
- package/src/lib/validation-runner.js +65 -13
- package/src/lib/validators/architecture-validator.js +387 -387
- package/src/lib/validators/design-system-validator.js +231 -0
- package/src/lib/validators/package-validator.js +360 -360
- package/src/lib/validators/ui-contrast-validator.js +422 -422
- package/src/utils/file-copier.js +9 -1
- package/src/utils/logger.js +32 -32
- package/src/utils/version-checker.js +175 -175
- /package/content/.claude/skills/{checklists → level-0-meta}/code-review.md +0 -0
- /package/content/.claude/skills/{checklists → level-0-meta}/simulation-checklist.md +0 -0
- /package/content/.claude/skills/{specialists → level-2-domains/ai-agents}/ai-system-architect.md +0 -0
- /package/content/.claude/skills/{specialists → level-2-domains/architecture}/po-pm-advisor.md +0 -0
- /package/content/.claude/skills/{specialists → level-2-domains/architecture}/standards-architect.md +0 -0
- /package/content/.claude/skills/{specialists → level-2-domains/backend}/dotnet-senior.md +0 -0
- /package/content/.claude/skills/{specialists → level-2-domains/backend}/ef-modeler.md +0 -0
- /package/content/.claude/skills/{specialists → level-2-domains/backend}/hangfire-orchestrator.md +0 -0
- /package/content/.claude/skills/{specialists → level-2-domains/backend}/ms-agent-expert.md +0 -0
- /package/content/.claude/skills/{stacks/dotnet-blazor.md → level-2-domains/frontend/blazor-builder.md} +0 -0
- /package/content/.claude/skills/{stacks/dotnet-nextjs.md → level-2-domains/frontend/nextjs-expert.md} +0 -0
- /package/content/.claude/skills/{specialists → level-2-domains/frontend}/ui-ux-designer.md +0 -0
- /package/content/.claude/skills/{specialists → level-2-domains/infrastructure}/azure-architect.md +0 -0
- /package/content/.claude/skills/{infra → level-2-domains/infrastructure}/bicep-architect.md +0 -0
- /package/content/.claude/skills/{infra → level-2-domains/infrastructure}/container-specialist.md +0 -0
- /package/content/.claude/skills/{infra → level-2-domains/infrastructure}/devops-engineer.md +0 -0
- /package/content/.claude/skills/{integrations → level-2-domains/integrations}/asaas-financial.md +0 -0
- /package/content/.claude/skills/{integrations → level-2-domains/integrations}/azure-identity.md +0 -0
- /package/content/.claude/skills/{integrations → level-2-domains/integrations}/clerk-auth.md +0 -0
- /package/content/.claude/skills/{integrations → level-2-domains/integrations}/resend-email.md +0 -0
- /package/content/.claude/skills/{specialists → level-2-domains/quality}/code-analyzer.md +0 -0
|
@@ -1,217 +1,217 @@
|
|
|
1
|
-
// ============================================================
|
|
2
|
-
// CONTRACTS: {{FEATURE_NAME_TITLE}}
|
|
3
|
-
// Generated by MORPH Framework
|
|
4
|
-
// Date: {{DATE}}
|
|
5
|
-
// ============================================================
|
|
6
|
-
|
|
7
|
-
#region Usings
|
|
8
|
-
|
|
9
|
-
using System;
|
|
10
|
-
using System.Collections.Generic;
|
|
11
|
-
using System.Threading;
|
|
12
|
-
using System.Threading.Tasks;
|
|
13
|
-
|
|
14
|
-
#endregion
|
|
15
|
-
|
|
16
|
-
namespace {{NAMESPACE}}.Application.Features.{{FEATURE_NAME_PASCAL}};
|
|
17
|
-
|
|
18
|
-
#region Service Interfaces
|
|
19
|
-
|
|
20
|
-
/// <summary>
|
|
21
|
-
/// Service for managing {{FEATURE_NAME_PASCAL}} operations.
|
|
22
|
-
/// </summary>
|
|
23
|
-
public interface I{{FEATURE_NAME_PASCAL}}Service
|
|
24
|
-
{
|
|
25
|
-
/// <summary>
|
|
26
|
-
/// Gets a {{FEATURE_NAME_LOWER_SNAKE}} by its identifier.
|
|
27
|
-
/// </summary>
|
|
28
|
-
Task<{{FEATURE_NAME_PASCAL}}Dto?> GetByIdAsync(int id, CancellationToken cancellationToken = default);
|
|
29
|
-
|
|
30
|
-
/// <summary>
|
|
31
|
-
/// Gets all {{FEATURE_NAME_LOWER_SNAKE}}s.
|
|
32
|
-
/// </summary>
|
|
33
|
-
Task<List<{{FEATURE_NAME_PASCAL}}Dto>> GetAllAsync(CancellationToken cancellationToken = default);
|
|
34
|
-
|
|
35
|
-
/// <summary>
|
|
36
|
-
/// Creates a new {{FEATURE_NAME_LOWER_SNAKE}}.
|
|
37
|
-
/// </summary>
|
|
38
|
-
Task<{{FEATURE_NAME_PASCAL}}Dto> CreateAsync(Create{{FEATURE_NAME_PASCAL}}Request request, CancellationToken cancellationToken = default);
|
|
39
|
-
|
|
40
|
-
/// <summary>
|
|
41
|
-
/// Updates an existing {{FEATURE_NAME_LOWER_SNAKE}}.
|
|
42
|
-
/// </summary>
|
|
43
|
-
Task UpdateAsync(int id, Update{{FEATURE_NAME_PASCAL}}Request request, CancellationToken cancellationToken = default);
|
|
44
|
-
|
|
45
|
-
/// <summary>
|
|
46
|
-
/// Deletes a {{FEATURE_NAME_LOWER_SNAKE}}.
|
|
47
|
-
/// </summary>
|
|
48
|
-
Task DeleteAsync(int id, CancellationToken cancellationToken = default);
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
#endregion
|
|
52
|
-
|
|
53
|
-
#region DTOs
|
|
54
|
-
|
|
55
|
-
/// <summary>
|
|
56
|
-
/// Data transfer object for {{FEATURE_NAME_PASCAL}}.
|
|
57
|
-
/// </summary>
|
|
58
|
-
public record {{FEATURE_NAME_PASCAL}}Dto(
|
|
59
|
-
int Id,
|
|
60
|
-
string Name,
|
|
61
|
-
{{FEATURE_NAME_PASCAL}}Status Status,
|
|
62
|
-
DateTime CreatedAt,
|
|
63
|
-
DateTime? UpdatedAt
|
|
64
|
-
);
|
|
65
|
-
|
|
66
|
-
/// <summary>
|
|
67
|
-
/// Request to create a new {{FEATURE_NAME_PASCAL}}.
|
|
68
|
-
/// </summary>
|
|
69
|
-
public record Create{{FEATURE_NAME_PASCAL}}Request(
|
|
70
|
-
string Name
|
|
71
|
-
// Add other required fields
|
|
72
|
-
);
|
|
73
|
-
|
|
74
|
-
/// <summary>
|
|
75
|
-
/// Request to update an existing {{FEATURE_NAME_PASCAL}}.
|
|
76
|
-
/// </summary>
|
|
77
|
-
public record Update{{FEATURE_NAME_PASCAL}}Request(
|
|
78
|
-
string Name
|
|
79
|
-
// Add other updatable fields
|
|
80
|
-
);
|
|
81
|
-
|
|
82
|
-
#endregion
|
|
83
|
-
|
|
84
|
-
#region Enums
|
|
85
|
-
|
|
86
|
-
/// <summary>
|
|
87
|
-
/// Status of a {{FEATURE_NAME_PASCAL}}.
|
|
88
|
-
/// </summary>
|
|
89
|
-
public enum {{FEATURE_NAME_PASCAL}}Status
|
|
90
|
-
{
|
|
91
|
-
Pending = 0,
|
|
92
|
-
Active = 1,
|
|
93
|
-
Completed = 2,
|
|
94
|
-
Failed = 3
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
#endregion
|
|
98
|
-
|
|
99
|
-
#region Repository Interfaces
|
|
100
|
-
|
|
101
|
-
/// <summary>
|
|
102
|
-
/// Repository for {{FEATURE_NAME_PASCAL}} data access.
|
|
103
|
-
/// </summary>
|
|
104
|
-
public interface I{{FEATURE_NAME_PASCAL}}Repository
|
|
105
|
-
{
|
|
106
|
-
Task<{{FEATURE_NAME_PASCAL}}?> GetByIdAsync(int id, CancellationToken cancellationToken = default);
|
|
107
|
-
Task<List<{{FEATURE_NAME_PASCAL}}>> GetAllAsync(CancellationToken cancellationToken = default);
|
|
108
|
-
Task AddAsync({{FEATURE_NAME_PASCAL}} entity, CancellationToken cancellationToken = default);
|
|
109
|
-
void Update({{FEATURE_NAME_PASCAL}} entity);
|
|
110
|
-
void Remove({{FEATURE_NAME_PASCAL}} entity);
|
|
111
|
-
Task SaveChangesAsync(CancellationToken cancellationToken = default);
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
#endregion
|
|
115
|
-
|
|
116
|
-
#region Domain Entity Reference
|
|
117
|
-
|
|
118
|
-
/*
|
|
119
|
-
/// <summary>
|
|
120
|
-
/// {{FEATURE_NAME_PASCAL}} domain entity.
|
|
121
|
-
/// Implement in Domain/Entities/{{FEATURE_NAME_PASCAL}}.cs
|
|
122
|
-
/// </summary>
|
|
123
|
-
public class {{FEATURE_NAME_PASCAL}}
|
|
124
|
-
{
|
|
125
|
-
public int Id { get; private set; }
|
|
126
|
-
public string Name { get; private set; } = string.Empty;
|
|
127
|
-
public {{FEATURE_NAME_PASCAL}}Status Status { get; private set; }
|
|
128
|
-
public DateTime CreatedAt { get; private set; }
|
|
129
|
-
public DateTime? UpdatedAt { get; private set; }
|
|
130
|
-
|
|
131
|
-
private {{FEATURE_NAME_PASCAL}}() { } // EF Constructor
|
|
132
|
-
|
|
133
|
-
public static {{FEATURE_NAME_PASCAL}} Create(string name)
|
|
134
|
-
{
|
|
135
|
-
return new {{FEATURE_NAME_PASCAL}}
|
|
136
|
-
{
|
|
137
|
-
Name = name,
|
|
138
|
-
Status = {{FEATURE_NAME_PASCAL}}Status.Pending,
|
|
139
|
-
CreatedAt = DateTime.UtcNow
|
|
140
|
-
};
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
public void Activate()
|
|
144
|
-
{
|
|
145
|
-
Status = {{FEATURE_NAME_PASCAL}}Status.Active;
|
|
146
|
-
UpdatedAt = DateTime.UtcNow;
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
public void Complete()
|
|
150
|
-
{
|
|
151
|
-
Status = {{FEATURE_NAME_PASCAL}}Status.Completed;
|
|
152
|
-
UpdatedAt = DateTime.UtcNow;
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
*/
|
|
156
|
-
|
|
157
|
-
#endregion
|
|
158
|
-
|
|
159
|
-
#region AI Agent Interfaces (if applicable)
|
|
160
|
-
|
|
161
|
-
/// <summary>
|
|
162
|
-
/// AI Agent for {{FEATURE_NAME_PASCAL}} analysis.
|
|
163
|
-
/// </summary>
|
|
164
|
-
public interface I{{FEATURE_NAME_PASCAL}}AnalyzerAgent
|
|
165
|
-
{
|
|
166
|
-
/// <summary>
|
|
167
|
-
/// Analyzes {{FEATURE_NAME_LOWER_SNAKE}} data using AI.
|
|
168
|
-
/// </summary>
|
|
169
|
-
Task<{{FEATURE_NAME_PASCAL}}AnalysisResult> AnalyzeAsync(
|
|
170
|
-
{{FEATURE_NAME_PASCAL}}Data data,
|
|
171
|
-
CancellationToken cancellationToken = default);
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
public record {{FEATURE_NAME_PASCAL}}Data(
|
|
175
|
-
// Input data for analysis
|
|
176
|
-
string Content
|
|
177
|
-
);
|
|
178
|
-
|
|
179
|
-
public record {{FEATURE_NAME_PASCAL}}AnalysisResult(
|
|
180
|
-
string Summary,
|
|
181
|
-
List<string> Insights,
|
|
182
|
-
List<string> Recommendations,
|
|
183
|
-
double ConfidenceScore
|
|
184
|
-
);
|
|
185
|
-
|
|
186
|
-
#endregion
|
|
187
|
-
|
|
188
|
-
#region Hangfire Job Interfaces (if applicable)
|
|
189
|
-
|
|
190
|
-
/// <summary>
|
|
191
|
-
/// Background job for processing {{FEATURE_NAME_PASCAL}}.
|
|
192
|
-
/// </summary>
|
|
193
|
-
public interface I{{FEATURE_NAME_PASCAL}}ProcessorJob
|
|
194
|
-
{
|
|
195
|
-
/// <summary>
|
|
196
|
-
/// Executes the {{FEATURE_NAME_LOWER_SNAKE}} processing job.
|
|
197
|
-
/// </summary>
|
|
198
|
-
Task ExecuteAsync(int id, CancellationToken cancellationToken = default);
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
#endregion
|
|
202
|
-
|
|
203
|
-
#region Exceptions
|
|
204
|
-
|
|
205
|
-
public class {{FEATURE_NAME_PASCAL}}NotFoundException : Exception
|
|
206
|
-
{
|
|
207
|
-
public {{FEATURE_NAME_PASCAL}}NotFoundException(int id)
|
|
208
|
-
: base($"{{FEATURE_NAME_PASCAL}} with ID {id} was not found.") { }
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
public class {{FEATURE_NAME_PASCAL}}ProcessingException : Exception
|
|
212
|
-
{
|
|
213
|
-
public {{FEATURE_NAME_PASCAL}}ProcessingException(string message, Exception? innerException = null)
|
|
214
|
-
: base(message, innerException) { }
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
#endregion
|
|
1
|
+
// ============================================================
|
|
2
|
+
// CONTRACTS: {{FEATURE_NAME_TITLE}}
|
|
3
|
+
// Generated by MORPH Framework
|
|
4
|
+
// Date: {{DATE}}
|
|
5
|
+
// ============================================================
|
|
6
|
+
|
|
7
|
+
#region Usings
|
|
8
|
+
|
|
9
|
+
using System;
|
|
10
|
+
using System.Collections.Generic;
|
|
11
|
+
using System.Threading;
|
|
12
|
+
using System.Threading.Tasks;
|
|
13
|
+
|
|
14
|
+
#endregion
|
|
15
|
+
|
|
16
|
+
namespace {{NAMESPACE}}.Application.Features.{{FEATURE_NAME_PASCAL}};
|
|
17
|
+
|
|
18
|
+
#region Service Interfaces
|
|
19
|
+
|
|
20
|
+
/// <summary>
|
|
21
|
+
/// Service for managing {{FEATURE_NAME_PASCAL}} operations.
|
|
22
|
+
/// </summary>
|
|
23
|
+
public interface I{{FEATURE_NAME_PASCAL}}Service
|
|
24
|
+
{
|
|
25
|
+
/// <summary>
|
|
26
|
+
/// Gets a {{FEATURE_NAME_LOWER_SNAKE}} by its identifier.
|
|
27
|
+
/// </summary>
|
|
28
|
+
Task<{{FEATURE_NAME_PASCAL}}Dto?> GetByIdAsync(int id, CancellationToken cancellationToken = default);
|
|
29
|
+
|
|
30
|
+
/// <summary>
|
|
31
|
+
/// Gets all {{FEATURE_NAME_LOWER_SNAKE}}s.
|
|
32
|
+
/// </summary>
|
|
33
|
+
Task<List<{{FEATURE_NAME_PASCAL}}Dto>> GetAllAsync(CancellationToken cancellationToken = default);
|
|
34
|
+
|
|
35
|
+
/// <summary>
|
|
36
|
+
/// Creates a new {{FEATURE_NAME_LOWER_SNAKE}}.
|
|
37
|
+
/// </summary>
|
|
38
|
+
Task<{{FEATURE_NAME_PASCAL}}Dto> CreateAsync(Create{{FEATURE_NAME_PASCAL}}Request request, CancellationToken cancellationToken = default);
|
|
39
|
+
|
|
40
|
+
/// <summary>
|
|
41
|
+
/// Updates an existing {{FEATURE_NAME_LOWER_SNAKE}}.
|
|
42
|
+
/// </summary>
|
|
43
|
+
Task UpdateAsync(int id, Update{{FEATURE_NAME_PASCAL}}Request request, CancellationToken cancellationToken = default);
|
|
44
|
+
|
|
45
|
+
/// <summary>
|
|
46
|
+
/// Deletes a {{FEATURE_NAME_LOWER_SNAKE}}.
|
|
47
|
+
/// </summary>
|
|
48
|
+
Task DeleteAsync(int id, CancellationToken cancellationToken = default);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
#endregion
|
|
52
|
+
|
|
53
|
+
#region DTOs
|
|
54
|
+
|
|
55
|
+
/// <summary>
|
|
56
|
+
/// Data transfer object for {{FEATURE_NAME_PASCAL}}.
|
|
57
|
+
/// </summary>
|
|
58
|
+
public record {{FEATURE_NAME_PASCAL}}Dto(
|
|
59
|
+
int Id,
|
|
60
|
+
string Name,
|
|
61
|
+
{{FEATURE_NAME_PASCAL}}Status Status,
|
|
62
|
+
DateTime CreatedAt,
|
|
63
|
+
DateTime? UpdatedAt
|
|
64
|
+
);
|
|
65
|
+
|
|
66
|
+
/// <summary>
|
|
67
|
+
/// Request to create a new {{FEATURE_NAME_PASCAL}}.
|
|
68
|
+
/// </summary>
|
|
69
|
+
public record Create{{FEATURE_NAME_PASCAL}}Request(
|
|
70
|
+
string Name
|
|
71
|
+
// Add other required fields
|
|
72
|
+
);
|
|
73
|
+
|
|
74
|
+
/// <summary>
|
|
75
|
+
/// Request to update an existing {{FEATURE_NAME_PASCAL}}.
|
|
76
|
+
/// </summary>
|
|
77
|
+
public record Update{{FEATURE_NAME_PASCAL}}Request(
|
|
78
|
+
string Name
|
|
79
|
+
// Add other updatable fields
|
|
80
|
+
);
|
|
81
|
+
|
|
82
|
+
#endregion
|
|
83
|
+
|
|
84
|
+
#region Enums
|
|
85
|
+
|
|
86
|
+
/// <summary>
|
|
87
|
+
/// Status of a {{FEATURE_NAME_PASCAL}}.
|
|
88
|
+
/// </summary>
|
|
89
|
+
public enum {{FEATURE_NAME_PASCAL}}Status
|
|
90
|
+
{
|
|
91
|
+
Pending = 0,
|
|
92
|
+
Active = 1,
|
|
93
|
+
Completed = 2,
|
|
94
|
+
Failed = 3
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
#endregion
|
|
98
|
+
|
|
99
|
+
#region Repository Interfaces
|
|
100
|
+
|
|
101
|
+
/// <summary>
|
|
102
|
+
/// Repository for {{FEATURE_NAME_PASCAL}} data access.
|
|
103
|
+
/// </summary>
|
|
104
|
+
public interface I{{FEATURE_NAME_PASCAL}}Repository
|
|
105
|
+
{
|
|
106
|
+
Task<{{FEATURE_NAME_PASCAL}}?> GetByIdAsync(int id, CancellationToken cancellationToken = default);
|
|
107
|
+
Task<List<{{FEATURE_NAME_PASCAL}}>> GetAllAsync(CancellationToken cancellationToken = default);
|
|
108
|
+
Task AddAsync({{FEATURE_NAME_PASCAL}} entity, CancellationToken cancellationToken = default);
|
|
109
|
+
void Update({{FEATURE_NAME_PASCAL}} entity);
|
|
110
|
+
void Remove({{FEATURE_NAME_PASCAL}} entity);
|
|
111
|
+
Task SaveChangesAsync(CancellationToken cancellationToken = default);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
#endregion
|
|
115
|
+
|
|
116
|
+
#region Domain Entity Reference
|
|
117
|
+
|
|
118
|
+
/*
|
|
119
|
+
/// <summary>
|
|
120
|
+
/// {{FEATURE_NAME_PASCAL}} domain entity.
|
|
121
|
+
/// Implement in Domain/Entities/{{FEATURE_NAME_PASCAL}}.cs
|
|
122
|
+
/// </summary>
|
|
123
|
+
public class {{FEATURE_NAME_PASCAL}}
|
|
124
|
+
{
|
|
125
|
+
public int Id { get; private set; }
|
|
126
|
+
public string Name { get; private set; } = string.Empty;
|
|
127
|
+
public {{FEATURE_NAME_PASCAL}}Status Status { get; private set; }
|
|
128
|
+
public DateTime CreatedAt { get; private set; }
|
|
129
|
+
public DateTime? UpdatedAt { get; private set; }
|
|
130
|
+
|
|
131
|
+
private {{FEATURE_NAME_PASCAL}}() { } // EF Constructor
|
|
132
|
+
|
|
133
|
+
public static {{FEATURE_NAME_PASCAL}} Create(string name)
|
|
134
|
+
{
|
|
135
|
+
return new {{FEATURE_NAME_PASCAL}}
|
|
136
|
+
{
|
|
137
|
+
Name = name,
|
|
138
|
+
Status = {{FEATURE_NAME_PASCAL}}Status.Pending,
|
|
139
|
+
CreatedAt = DateTime.UtcNow
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
public void Activate()
|
|
144
|
+
{
|
|
145
|
+
Status = {{FEATURE_NAME_PASCAL}}Status.Active;
|
|
146
|
+
UpdatedAt = DateTime.UtcNow;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
public void Complete()
|
|
150
|
+
{
|
|
151
|
+
Status = {{FEATURE_NAME_PASCAL}}Status.Completed;
|
|
152
|
+
UpdatedAt = DateTime.UtcNow;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
*/
|
|
156
|
+
|
|
157
|
+
#endregion
|
|
158
|
+
|
|
159
|
+
#region AI Agent Interfaces (if applicable)
|
|
160
|
+
|
|
161
|
+
/// <summary>
|
|
162
|
+
/// AI Agent for {{FEATURE_NAME_PASCAL}} analysis.
|
|
163
|
+
/// </summary>
|
|
164
|
+
public interface I{{FEATURE_NAME_PASCAL}}AnalyzerAgent
|
|
165
|
+
{
|
|
166
|
+
/// <summary>
|
|
167
|
+
/// Analyzes {{FEATURE_NAME_LOWER_SNAKE}} data using AI.
|
|
168
|
+
/// </summary>
|
|
169
|
+
Task<{{FEATURE_NAME_PASCAL}}AnalysisResult> AnalyzeAsync(
|
|
170
|
+
{{FEATURE_NAME_PASCAL}}Data data,
|
|
171
|
+
CancellationToken cancellationToken = default);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
public record {{FEATURE_NAME_PASCAL}}Data(
|
|
175
|
+
// Input data for analysis
|
|
176
|
+
string Content
|
|
177
|
+
);
|
|
178
|
+
|
|
179
|
+
public record {{FEATURE_NAME_PASCAL}}AnalysisResult(
|
|
180
|
+
string Summary,
|
|
181
|
+
List<string> Insights,
|
|
182
|
+
List<string> Recommendations,
|
|
183
|
+
double ConfidenceScore
|
|
184
|
+
);
|
|
185
|
+
|
|
186
|
+
#endregion
|
|
187
|
+
|
|
188
|
+
#region Hangfire Job Interfaces (if applicable)
|
|
189
|
+
|
|
190
|
+
/// <summary>
|
|
191
|
+
/// Background job for processing {{FEATURE_NAME_PASCAL}}.
|
|
192
|
+
/// </summary>
|
|
193
|
+
public interface I{{FEATURE_NAME_PASCAL}}ProcessorJob
|
|
194
|
+
{
|
|
195
|
+
/// <summary>
|
|
196
|
+
/// Executes the {{FEATURE_NAME_LOWER_SNAKE}} processing job.
|
|
197
|
+
/// </summary>
|
|
198
|
+
Task ExecuteAsync(int id, CancellationToken cancellationToken = default);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
#endregion
|
|
202
|
+
|
|
203
|
+
#region Exceptions
|
|
204
|
+
|
|
205
|
+
public class {{FEATURE_NAME_PASCAL}}NotFoundException : Exception
|
|
206
|
+
{
|
|
207
|
+
public {{FEATURE_NAME_PASCAL}}NotFoundException(int id)
|
|
208
|
+
: base($"{{FEATURE_NAME_PASCAL}} with ID {id} was not found.") { }
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
public class {{FEATURE_NAME_PASCAL}}ProcessingException : Exception
|
|
212
|
+
{
|
|
213
|
+
public {{FEATURE_NAME_PASCAL}}ProcessingException(string message, Exception? innerException = null)
|
|
214
|
+
: base(message, innerException) { }
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
#endregion
|