@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,139 +1,139 @@
|
|
|
1
|
-
// ============================================================
|
|
2
|
-
// SERVICE TEMPLATE
|
|
3
|
-
// Generated by MORPH Framework
|
|
4
|
-
// ============================================================
|
|
5
|
-
|
|
6
|
-
using Microsoft.Extensions.Logging;
|
|
7
|
-
|
|
8
|
-
namespace MyProject.Application.Features.{Feature}.Services;
|
|
9
|
-
|
|
10
|
-
/// <summary>
|
|
11
|
-
/// Service for managing {Feature} operations.
|
|
12
|
-
/// </summary>
|
|
13
|
-
public class {Feature}Service(
|
|
14
|
-
I{Feature}Repository repository,
|
|
15
|
-
ILogger<{Feature}Service> logger) : I{Feature}Service
|
|
16
|
-
{
|
|
17
|
-
/// <inheritdoc />
|
|
18
|
-
public async Task<{Feature}Dto?> GetByIdAsync(int id, CancellationToken cancellationToken = default)
|
|
19
|
-
{
|
|
20
|
-
logger.LogDebug("Getting {Feature} with ID {Id}", id);
|
|
21
|
-
|
|
22
|
-
var entity = await repository.GetByIdAsync(id, cancellationToken);
|
|
23
|
-
if (entity is null)
|
|
24
|
-
{
|
|
25
|
-
logger.LogWarning("{Feature} with ID {Id} not found", id);
|
|
26
|
-
return null;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
return MapToDto(entity);
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
/// <inheritdoc />
|
|
33
|
-
public async Task<List<{Feature}Dto>> GetAllAsync(CancellationToken cancellationToken = default)
|
|
34
|
-
{
|
|
35
|
-
logger.LogDebug("Getting all {Feature}s");
|
|
36
|
-
|
|
37
|
-
var entities = await repository.GetAllAsync(cancellationToken);
|
|
38
|
-
return entities.Select(MapToDto).ToList();
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
/// <inheritdoc />
|
|
42
|
-
public async Task<{Feature}Dto> CreateAsync(
|
|
43
|
-
Create{Feature}Request request,
|
|
44
|
-
CancellationToken cancellationToken = default)
|
|
45
|
-
{
|
|
46
|
-
logger.LogInformation("Creating new {Feature}: {Name}", request.Name);
|
|
47
|
-
|
|
48
|
-
// Validate
|
|
49
|
-
await ValidateCreateAsync(request, cancellationToken);
|
|
50
|
-
|
|
51
|
-
// Create entity
|
|
52
|
-
var entity = Domain.Entities.{Feature}.Create(request.Name);
|
|
53
|
-
|
|
54
|
-
// Save
|
|
55
|
-
await repository.AddAsync(entity, cancellationToken);
|
|
56
|
-
await repository.SaveChangesAsync(cancellationToken);
|
|
57
|
-
|
|
58
|
-
logger.LogInformation("Created {Feature} with ID {Id}", entity.Id);
|
|
59
|
-
|
|
60
|
-
return MapToDto(entity);
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
/// <inheritdoc />
|
|
64
|
-
public async Task UpdateAsync(
|
|
65
|
-
int id,
|
|
66
|
-
Update{Feature}Request request,
|
|
67
|
-
CancellationToken cancellationToken = default)
|
|
68
|
-
{
|
|
69
|
-
logger.LogInformation("Updating {Feature} {Id}", id);
|
|
70
|
-
|
|
71
|
-
var entity = await repository.GetByIdAsync(id, cancellationToken)
|
|
72
|
-
?? throw new {Feature}NotFoundException(id);
|
|
73
|
-
|
|
74
|
-
// Validate
|
|
75
|
-
await ValidateUpdateAsync(entity, request, cancellationToken);
|
|
76
|
-
|
|
77
|
-
// Update entity
|
|
78
|
-
entity.UpdateName(request.Name);
|
|
79
|
-
|
|
80
|
-
// Save
|
|
81
|
-
repository.Update(entity);
|
|
82
|
-
await repository.SaveChangesAsync(cancellationToken);
|
|
83
|
-
|
|
84
|
-
logger.LogInformation("Updated {Feature} {Id}", id);
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
/// <inheritdoc />
|
|
88
|
-
public async Task DeleteAsync(int id, CancellationToken cancellationToken = default)
|
|
89
|
-
{
|
|
90
|
-
logger.LogInformation("Deleting {Feature} {Id}", id);
|
|
91
|
-
|
|
92
|
-
var entity = await repository.GetByIdAsync(id, cancellationToken)
|
|
93
|
-
?? throw new {Feature}NotFoundException(id);
|
|
94
|
-
|
|
95
|
-
// Soft delete or remove
|
|
96
|
-
repository.Remove(entity);
|
|
97
|
-
await repository.SaveChangesAsync(cancellationToken);
|
|
98
|
-
|
|
99
|
-
logger.LogInformation("Deleted {Feature} {Id}", id);
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
#region Private Methods
|
|
103
|
-
|
|
104
|
-
private static {Feature}Dto MapToDto(Domain.Entities.{Feature} entity)
|
|
105
|
-
{
|
|
106
|
-
return new {Feature}Dto(
|
|
107
|
-
entity.Id,
|
|
108
|
-
entity.Name,
|
|
109
|
-
entity.Status,
|
|
110
|
-
entity.CreatedAt,
|
|
111
|
-
entity.UpdatedAt
|
|
112
|
-
);
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
private async Task ValidateCreateAsync(
|
|
116
|
-
Create{Feature}Request request,
|
|
117
|
-
CancellationToken cancellationToken)
|
|
118
|
-
{
|
|
119
|
-
// Add validation logic here
|
|
120
|
-
// Example: Check for duplicates
|
|
121
|
-
// var existing = await repository.FindByNameAsync(request.Name, cancellationToken);
|
|
122
|
-
// if (existing is not null)
|
|
123
|
-
// throw new ValidationException("Name already exists");
|
|
124
|
-
|
|
125
|
-
await Task.CompletedTask;
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
private async Task ValidateUpdateAsync(
|
|
129
|
-
Domain.Entities.{Feature} entity,
|
|
130
|
-
Update{Feature}Request request,
|
|
131
|
-
CancellationToken cancellationToken)
|
|
132
|
-
{
|
|
133
|
-
// Add validation logic here
|
|
134
|
-
|
|
135
|
-
await Task.CompletedTask;
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
#endregion
|
|
139
|
-
}
|
|
1
|
+
// ============================================================
|
|
2
|
+
// SERVICE TEMPLATE
|
|
3
|
+
// Generated by MORPH Framework
|
|
4
|
+
// ============================================================
|
|
5
|
+
|
|
6
|
+
using Microsoft.Extensions.Logging;
|
|
7
|
+
|
|
8
|
+
namespace MyProject.Application.Features.{Feature}.Services;
|
|
9
|
+
|
|
10
|
+
/// <summary>
|
|
11
|
+
/// Service for managing {Feature} operations.
|
|
12
|
+
/// </summary>
|
|
13
|
+
public class {Feature}Service(
|
|
14
|
+
I{Feature}Repository repository,
|
|
15
|
+
ILogger<{Feature}Service> logger) : I{Feature}Service
|
|
16
|
+
{
|
|
17
|
+
/// <inheritdoc />
|
|
18
|
+
public async Task<{Feature}Dto?> GetByIdAsync(int id, CancellationToken cancellationToken = default)
|
|
19
|
+
{
|
|
20
|
+
logger.LogDebug("Getting {Feature} with ID {Id}", id);
|
|
21
|
+
|
|
22
|
+
var entity = await repository.GetByIdAsync(id, cancellationToken);
|
|
23
|
+
if (entity is null)
|
|
24
|
+
{
|
|
25
|
+
logger.LogWarning("{Feature} with ID {Id} not found", id);
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
return MapToDto(entity);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/// <inheritdoc />
|
|
33
|
+
public async Task<List<{Feature}Dto>> GetAllAsync(CancellationToken cancellationToken = default)
|
|
34
|
+
{
|
|
35
|
+
logger.LogDebug("Getting all {Feature}s");
|
|
36
|
+
|
|
37
|
+
var entities = await repository.GetAllAsync(cancellationToken);
|
|
38
|
+
return entities.Select(MapToDto).ToList();
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/// <inheritdoc />
|
|
42
|
+
public async Task<{Feature}Dto> CreateAsync(
|
|
43
|
+
Create{Feature}Request request,
|
|
44
|
+
CancellationToken cancellationToken = default)
|
|
45
|
+
{
|
|
46
|
+
logger.LogInformation("Creating new {Feature}: {Name}", request.Name);
|
|
47
|
+
|
|
48
|
+
// Validate
|
|
49
|
+
await ValidateCreateAsync(request, cancellationToken);
|
|
50
|
+
|
|
51
|
+
// Create entity
|
|
52
|
+
var entity = Domain.Entities.{Feature}.Create(request.Name);
|
|
53
|
+
|
|
54
|
+
// Save
|
|
55
|
+
await repository.AddAsync(entity, cancellationToken);
|
|
56
|
+
await repository.SaveChangesAsync(cancellationToken);
|
|
57
|
+
|
|
58
|
+
logger.LogInformation("Created {Feature} with ID {Id}", entity.Id);
|
|
59
|
+
|
|
60
|
+
return MapToDto(entity);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/// <inheritdoc />
|
|
64
|
+
public async Task UpdateAsync(
|
|
65
|
+
int id,
|
|
66
|
+
Update{Feature}Request request,
|
|
67
|
+
CancellationToken cancellationToken = default)
|
|
68
|
+
{
|
|
69
|
+
logger.LogInformation("Updating {Feature} {Id}", id);
|
|
70
|
+
|
|
71
|
+
var entity = await repository.GetByIdAsync(id, cancellationToken)
|
|
72
|
+
?? throw new {Feature}NotFoundException(id);
|
|
73
|
+
|
|
74
|
+
// Validate
|
|
75
|
+
await ValidateUpdateAsync(entity, request, cancellationToken);
|
|
76
|
+
|
|
77
|
+
// Update entity
|
|
78
|
+
entity.UpdateName(request.Name);
|
|
79
|
+
|
|
80
|
+
// Save
|
|
81
|
+
repository.Update(entity);
|
|
82
|
+
await repository.SaveChangesAsync(cancellationToken);
|
|
83
|
+
|
|
84
|
+
logger.LogInformation("Updated {Feature} {Id}", id);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/// <inheritdoc />
|
|
88
|
+
public async Task DeleteAsync(int id, CancellationToken cancellationToken = default)
|
|
89
|
+
{
|
|
90
|
+
logger.LogInformation("Deleting {Feature} {Id}", id);
|
|
91
|
+
|
|
92
|
+
var entity = await repository.GetByIdAsync(id, cancellationToken)
|
|
93
|
+
?? throw new {Feature}NotFoundException(id);
|
|
94
|
+
|
|
95
|
+
// Soft delete or remove
|
|
96
|
+
repository.Remove(entity);
|
|
97
|
+
await repository.SaveChangesAsync(cancellationToken);
|
|
98
|
+
|
|
99
|
+
logger.LogInformation("Deleted {Feature} {Id}", id);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
#region Private Methods
|
|
103
|
+
|
|
104
|
+
private static {Feature}Dto MapToDto(Domain.Entities.{Feature} entity)
|
|
105
|
+
{
|
|
106
|
+
return new {Feature}Dto(
|
|
107
|
+
entity.Id,
|
|
108
|
+
entity.Name,
|
|
109
|
+
entity.Status,
|
|
110
|
+
entity.CreatedAt,
|
|
111
|
+
entity.UpdatedAt
|
|
112
|
+
);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
private async Task ValidateCreateAsync(
|
|
116
|
+
Create{Feature}Request request,
|
|
117
|
+
CancellationToken cancellationToken)
|
|
118
|
+
{
|
|
119
|
+
// Add validation logic here
|
|
120
|
+
// Example: Check for duplicates
|
|
121
|
+
// var existing = await repository.FindByNameAsync(request.Name, cancellationToken);
|
|
122
|
+
// if (existing is not null)
|
|
123
|
+
// throw new ValidationException("Name already exists");
|
|
124
|
+
|
|
125
|
+
await Task.CompletedTask;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
private async Task ValidateUpdateAsync(
|
|
129
|
+
Domain.Entities.{Feature} entity,
|
|
130
|
+
Update{Feature}Request request,
|
|
131
|
+
CancellationToken cancellationToken)
|
|
132
|
+
{
|
|
133
|
+
// Add validation logic here
|
|
134
|
+
|
|
135
|
+
await Task.CompletedTask;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
#endregion
|
|
139
|
+
}
|
|
@@ -1,68 +1,68 @@
|
|
|
1
|
-
# MORPH-SPEC Sprint Status
|
|
2
|
-
# Auto-updated by create-story.js and update-sprint-status.js
|
|
3
|
-
# Tracks story-level progress within a feature/epic
|
|
4
|
-
|
|
5
|
-
feature: {{FEATURE_NAME}}
|
|
6
|
-
epic: {{EPIC_NAME}}
|
|
7
|
-
sprint: {{SPRINT_NUMBER}}
|
|
8
|
-
created: {{DATE}}
|
|
9
|
-
updated: {{DATE}}
|
|
10
|
-
|
|
11
|
-
# Story progression
|
|
12
|
-
stories:
|
|
13
|
-
- id: {{STORY_ID_1}}
|
|
14
|
-
title: {{STORY_TITLE_1}}
|
|
15
|
-
file: .morph/project/outputs/{{FEATURE_NAME}}/stories/{{STORY_ID_1}}.md
|
|
16
|
-
status: ready # ready | in_progress | ready_for_qa | done
|
|
17
|
-
assigned: {{AGENT}} # sm | dev | qa
|
|
18
|
-
created: {{DATE}}
|
|
19
|
-
started: null
|
|
20
|
-
completed: null
|
|
21
|
-
|
|
22
|
-
- id: {{STORY_ID_2}}
|
|
23
|
-
title: {{STORY_TITLE_2}}
|
|
24
|
-
file: .morph/project/outputs/{{FEATURE_NAME}}/stories/{{STORY_ID_2}}.md
|
|
25
|
-
status: pending
|
|
26
|
-
assigned: sm
|
|
27
|
-
created: {{DATE}}
|
|
28
|
-
started: null
|
|
29
|
-
completed: null
|
|
30
|
-
|
|
31
|
-
# Progress metrics
|
|
32
|
-
metrics:
|
|
33
|
-
total_stories: {{TOTAL_STORIES}}
|
|
34
|
-
ready: {{READY_COUNT}}
|
|
35
|
-
in_progress: {{IN_PROGRESS_COUNT}}
|
|
36
|
-
ready_for_qa: {{QA_COUNT}}
|
|
37
|
-
done: {{DONE_COUNT}}
|
|
38
|
-
completion_percent: {{COMPLETION_PERCENT}}
|
|
39
|
-
|
|
40
|
-
# Current focus
|
|
41
|
-
current:
|
|
42
|
-
story_id: {{CURRENT_STORY_ID}}
|
|
43
|
-
agent: {{CURRENT_AGENT}}
|
|
44
|
-
phase: implementation # planning | implementation | review
|
|
45
|
-
|
|
46
|
-
# Next story to work on
|
|
47
|
-
next:
|
|
48
|
-
story_id: {{NEXT_STORY_ID}}
|
|
49
|
-
recommendation: "Story {{NEXT_STORY_ID}} is ready for development"
|
|
50
|
-
|
|
51
|
-
---
|
|
52
|
-
# Usage Notes:
|
|
53
|
-
#
|
|
54
|
-
# Status Transitions:
|
|
55
|
-
# pending → ready (SM creates story with full context)
|
|
56
|
-
# ready → in_progress (Dev starts implementation)
|
|
57
|
-
# in_progress → ready_for_qa (Dev completes, adds Dev Notes)
|
|
58
|
-
# ready_for_qa → done (QA approves, adds QA Notes)
|
|
59
|
-
#
|
|
60
|
-
# Fresh Chat Pattern (BMAD-inspired):
|
|
61
|
-
# Each story should run in a FRESH Claude session to avoid context pollution
|
|
62
|
-
#
|
|
63
|
-
# Example workflow:
|
|
64
|
-
# 1. SM: node bin/create-story.js scheduled-reports SR-001
|
|
65
|
-
# 2. Dev: Open NEW chat → /dev → Implement SR-001
|
|
66
|
-
# 3. QA: Open NEW chat → /qa → Review SR-001
|
|
67
|
-
#
|
|
68
|
-
# This prevents token bloat and reduces hallucinations
|
|
1
|
+
# MORPH-SPEC Sprint Status
|
|
2
|
+
# Auto-updated by create-story.js and update-sprint-status.js
|
|
3
|
+
# Tracks story-level progress within a feature/epic
|
|
4
|
+
|
|
5
|
+
feature: {{FEATURE_NAME}}
|
|
6
|
+
epic: {{EPIC_NAME}}
|
|
7
|
+
sprint: {{SPRINT_NUMBER}}
|
|
8
|
+
created: {{DATE}}
|
|
9
|
+
updated: {{DATE}}
|
|
10
|
+
|
|
11
|
+
# Story progression
|
|
12
|
+
stories:
|
|
13
|
+
- id: {{STORY_ID_1}}
|
|
14
|
+
title: {{STORY_TITLE_1}}
|
|
15
|
+
file: .morph/project/outputs/{{FEATURE_NAME}}/stories/{{STORY_ID_1}}.md
|
|
16
|
+
status: ready # ready | in_progress | ready_for_qa | done
|
|
17
|
+
assigned: {{AGENT}} # sm | dev | qa
|
|
18
|
+
created: {{DATE}}
|
|
19
|
+
started: null
|
|
20
|
+
completed: null
|
|
21
|
+
|
|
22
|
+
- id: {{STORY_ID_2}}
|
|
23
|
+
title: {{STORY_TITLE_2}}
|
|
24
|
+
file: .morph/project/outputs/{{FEATURE_NAME}}/stories/{{STORY_ID_2}}.md
|
|
25
|
+
status: pending
|
|
26
|
+
assigned: sm
|
|
27
|
+
created: {{DATE}}
|
|
28
|
+
started: null
|
|
29
|
+
completed: null
|
|
30
|
+
|
|
31
|
+
# Progress metrics
|
|
32
|
+
metrics:
|
|
33
|
+
total_stories: {{TOTAL_STORIES}}
|
|
34
|
+
ready: {{READY_COUNT}}
|
|
35
|
+
in_progress: {{IN_PROGRESS_COUNT}}
|
|
36
|
+
ready_for_qa: {{QA_COUNT}}
|
|
37
|
+
done: {{DONE_COUNT}}
|
|
38
|
+
completion_percent: {{COMPLETION_PERCENT}}
|
|
39
|
+
|
|
40
|
+
# Current focus
|
|
41
|
+
current:
|
|
42
|
+
story_id: {{CURRENT_STORY_ID}}
|
|
43
|
+
agent: {{CURRENT_AGENT}}
|
|
44
|
+
phase: implementation # planning | implementation | review
|
|
45
|
+
|
|
46
|
+
# Next story to work on
|
|
47
|
+
next:
|
|
48
|
+
story_id: {{NEXT_STORY_ID}}
|
|
49
|
+
recommendation: "Story {{NEXT_STORY_ID}} is ready for development"
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
# Usage Notes:
|
|
53
|
+
#
|
|
54
|
+
# Status Transitions:
|
|
55
|
+
# pending → ready (SM creates story with full context)
|
|
56
|
+
# ready → in_progress (Dev starts implementation)
|
|
57
|
+
# in_progress → ready_for_qa (Dev completes, adds Dev Notes)
|
|
58
|
+
# ready_for_qa → done (QA approves, adds QA Notes)
|
|
59
|
+
#
|
|
60
|
+
# Fresh Chat Pattern (BMAD-inspired):
|
|
61
|
+
# Each story should run in a FRESH Claude session to avoid context pollution
|
|
62
|
+
#
|
|
63
|
+
# Example workflow:
|
|
64
|
+
# 1. SM: node bin/create-story.js scheduled-reports SR-001
|
|
65
|
+
# 2. Dev: Open NEW chat → /dev → Implement SR-001
|
|
66
|
+
# 3. QA: Open NEW chat → /qa → Review SR-001
|
|
67
|
+
#
|
|
68
|
+
# This prevents token bloat and reduces hallucinations
|