@polymorphism-tech/morph-spec 3.0.0 → 3.0.1
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 +75 -371
- package/LICENSE +72 -72
- package/bin/detect-agents.js +225 -225
- 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 -529
- 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/{specialists → level-2-domains/architecture}/prompt-engineer.md +189 -189
- package/content/.claude/skills/{specialists → level-2-domains/architecture}/seo-growth-hacker.md +320 -320
- package/content/.claude/skills/{infra → level-2-domains/infrastructure}/azure-deploy-specialist.md +699 -699
- package/content/.morph/.morphversion +5 -5
- package/content/.morph/archive/.gitkeep +25 -25
- package/content/.morph/config/agents.json +7 -5
- package/content/.morph/docs/STORY-DRIVEN-DEVELOPMENT.md +392 -392
- 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/state-v3.json +188 -188
- package/content/.morph/features/.gitkeep +25 -25
- 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/project.md +160 -160
- package/content/.morph/schemas/agent.schema.json +296 -296
- package/content/.morph/specs/.gitkeep +20 -20
- 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/FluentDesignTheme.cs +149 -149
- package/content/.morph/templates/MudTheme.cs +281 -281
- package/content/.morph/templates/component.razor +239 -239
- 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 -480
- 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/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 -2
- package/scripts/postinstall.js +132 -132
- package/scripts/reorganize-skills.cjs +175 -0
- package/scripts/validate-agents-structure.cjs +52 -0
- package/scripts/validate-skills.cjs +180 -0
- package/src/commands/analyze-blazor-concurrency.js +193 -193
- package/src/commands/create-story.js +351 -351
- package/src/commands/deploy.js +780 -780
- package/src/commands/detect-agents.js +9 -0
- package/src/commands/detect.js +104 -104
- 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 +334 -333
- package/src/commands/sync.js +167 -167
- package/src/commands/troubleshoot.js +222 -222
- package/src/commands/update.js +13 -1
- 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/css-validator.js +352 -352
- package/src/lib/design-system-generator.js +298 -298
- package/{detectors → src/lib/detectors}/config-detector.js +223 -223
- package/{detectors → src/lib/detectors}/conversation-analyzer.js +163 -163
- package/{detectors → src/lib/detectors}/index.js +84 -84
- package/{detectors → src/lib/detectors}/standards-generator.js +275 -275
- package/src/lib/learning-system.js +520 -520
- package/src/lib/mockup-generator.js +366 -366
- package/src/lib/state-manager.js +21 -4
- 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/validators/architecture-validator.js +387 -387
- package/src/lib/validators/package-validator.js +360 -360
- package/src/lib/validators/ui-contrast-validator.js +422 -422
- package/src/utils/logger.js +32 -32
- package/src/utils/version-checker.js +175 -175
- /package/{detectors → src/lib/detectors}/structure-detector.js +0 -0
|
@@ -1,141 +1,141 @@
|
|
|
1
|
-
// ============================================================
|
|
2
|
-
// REPOSITORY TEMPLATE
|
|
3
|
-
// Generated by MORPH Framework
|
|
4
|
-
// ============================================================
|
|
5
|
-
|
|
6
|
-
using Microsoft.EntityFrameworkCore;
|
|
7
|
-
using MyProject.Domain.Entities;
|
|
8
|
-
|
|
9
|
-
namespace MyProject.Infrastructure.Data.Repositories;
|
|
10
|
-
|
|
11
|
-
/// <summary>
|
|
12
|
-
/// Repository for {Feature} data access.
|
|
13
|
-
/// </summary>
|
|
14
|
-
public class {Feature}Repository(AppDbContext context) : I{Feature}Repository
|
|
15
|
-
{
|
|
16
|
-
private readonly DbSet<{Feature}> _dbSet = context.Set<{Feature}>();
|
|
17
|
-
|
|
18
|
-
/// <inheritdoc />
|
|
19
|
-
public async Task<{Feature}?> GetByIdAsync(int id, CancellationToken cancellationToken = default)
|
|
20
|
-
{
|
|
21
|
-
return await _dbSet
|
|
22
|
-
.AsNoTracking()
|
|
23
|
-
.FirstOrDefaultAsync(x => x.Id == id, cancellationToken);
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
/// <inheritdoc />
|
|
27
|
-
public async Task<List<{Feature}>> GetAllAsync(CancellationToken cancellationToken = default)
|
|
28
|
-
{
|
|
29
|
-
return await _dbSet
|
|
30
|
-
.AsNoTracking()
|
|
31
|
-
.OrderByDescending(x => x.CreatedAt)
|
|
32
|
-
.ToListAsync(cancellationToken);
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
/// <inheritdoc />
|
|
36
|
-
public async Task AddAsync({Feature} entity, CancellationToken cancellationToken = default)
|
|
37
|
-
{
|
|
38
|
-
await _dbSet.AddAsync(entity, cancellationToken);
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
/// <inheritdoc />
|
|
42
|
-
public void Update({Feature} entity)
|
|
43
|
-
{
|
|
44
|
-
_dbSet.Update(entity);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
/// <inheritdoc />
|
|
48
|
-
public void Remove({Feature} entity)
|
|
49
|
-
{
|
|
50
|
-
_dbSet.Remove(entity);
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
/// <inheritdoc />
|
|
54
|
-
public async Task SaveChangesAsync(CancellationToken cancellationToken = default)
|
|
55
|
-
{
|
|
56
|
-
await context.SaveChangesAsync(cancellationToken);
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
#region Additional Query Methods
|
|
60
|
-
|
|
61
|
-
/// <summary>
|
|
62
|
-
/// Gets {Feature}s by status.
|
|
63
|
-
/// </summary>
|
|
64
|
-
public async Task<List<{Feature}>> GetByStatusAsync(
|
|
65
|
-
{Feature}Status status,
|
|
66
|
-
CancellationToken cancellationToken = default)
|
|
67
|
-
{
|
|
68
|
-
return await _dbSet
|
|
69
|
-
.AsNoTracking()
|
|
70
|
-
.Where(x => x.Status == status)
|
|
71
|
-
.OrderByDescending(x => x.CreatedAt)
|
|
72
|
-
.ToListAsync(cancellationToken);
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
/// <summary>
|
|
76
|
-
/// Checks if a {Feature} with the given name exists.
|
|
77
|
-
/// </summary>
|
|
78
|
-
public async Task<bool> ExistsByNameAsync(
|
|
79
|
-
string name,
|
|
80
|
-
CancellationToken cancellationToken = default)
|
|
81
|
-
{
|
|
82
|
-
return await _dbSet
|
|
83
|
-
.AsNoTracking()
|
|
84
|
-
.AnyAsync(x => x.Name == name, cancellationToken);
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
/// <summary>
|
|
88
|
-
/// Gets {Feature}s with pagination.
|
|
89
|
-
/// </summary>
|
|
90
|
-
public async Task<(List<{Feature}> Items, int TotalCount)> GetPagedAsync(
|
|
91
|
-
int page,
|
|
92
|
-
int pageSize,
|
|
93
|
-
CancellationToken cancellationToken = default)
|
|
94
|
-
{
|
|
95
|
-
var query = _dbSet.AsNoTracking();
|
|
96
|
-
|
|
97
|
-
var totalCount = await query.CountAsync(cancellationToken);
|
|
98
|
-
|
|
99
|
-
var items = await query
|
|
100
|
-
.OrderByDescending(x => x.CreatedAt)
|
|
101
|
-
.Skip((page - 1) * pageSize)
|
|
102
|
-
.Take(pageSize)
|
|
103
|
-
.ToListAsync(cancellationToken);
|
|
104
|
-
|
|
105
|
-
return (items, totalCount);
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
#endregion
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
// ============================================================
|
|
112
|
-
// EF CORE CONFIGURATION
|
|
113
|
-
// ============================================================
|
|
114
|
-
|
|
115
|
-
public class {Feature}Configuration : IEntityTypeConfiguration<{Feature}>
|
|
116
|
-
{
|
|
117
|
-
public void Configure(EntityTypeBuilder<{Feature}> builder)
|
|
118
|
-
{
|
|
119
|
-
builder.ToTable("{Feature}s");
|
|
120
|
-
|
|
121
|
-
builder.HasKey(x => x.Id);
|
|
122
|
-
|
|
123
|
-
builder.Property(x => x.Name)
|
|
124
|
-
.IsRequired()
|
|
125
|
-
.HasMaxLength(200);
|
|
126
|
-
|
|
127
|
-
builder.Property(x => x.Status)
|
|
128
|
-
.IsRequired()
|
|
129
|
-
.HasConversion<string>();
|
|
130
|
-
|
|
131
|
-
builder.Property(x => x.CreatedAt)
|
|
132
|
-
.IsRequired();
|
|
133
|
-
|
|
134
|
-
builder.Property(x => x.UpdatedAt);
|
|
135
|
-
|
|
136
|
-
// Indexes
|
|
137
|
-
builder.HasIndex(x => x.Name);
|
|
138
|
-
builder.HasIndex(x => x.Status);
|
|
139
|
-
builder.HasIndex(x => x.CreatedAt);
|
|
140
|
-
}
|
|
141
|
-
}
|
|
1
|
+
// ============================================================
|
|
2
|
+
// REPOSITORY TEMPLATE
|
|
3
|
+
// Generated by MORPH Framework
|
|
4
|
+
// ============================================================
|
|
5
|
+
|
|
6
|
+
using Microsoft.EntityFrameworkCore;
|
|
7
|
+
using MyProject.Domain.Entities;
|
|
8
|
+
|
|
9
|
+
namespace MyProject.Infrastructure.Data.Repositories;
|
|
10
|
+
|
|
11
|
+
/// <summary>
|
|
12
|
+
/// Repository for {Feature} data access.
|
|
13
|
+
/// </summary>
|
|
14
|
+
public class {Feature}Repository(AppDbContext context) : I{Feature}Repository
|
|
15
|
+
{
|
|
16
|
+
private readonly DbSet<{Feature}> _dbSet = context.Set<{Feature}>();
|
|
17
|
+
|
|
18
|
+
/// <inheritdoc />
|
|
19
|
+
public async Task<{Feature}?> GetByIdAsync(int id, CancellationToken cancellationToken = default)
|
|
20
|
+
{
|
|
21
|
+
return await _dbSet
|
|
22
|
+
.AsNoTracking()
|
|
23
|
+
.FirstOrDefaultAsync(x => x.Id == id, cancellationToken);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/// <inheritdoc />
|
|
27
|
+
public async Task<List<{Feature}>> GetAllAsync(CancellationToken cancellationToken = default)
|
|
28
|
+
{
|
|
29
|
+
return await _dbSet
|
|
30
|
+
.AsNoTracking()
|
|
31
|
+
.OrderByDescending(x => x.CreatedAt)
|
|
32
|
+
.ToListAsync(cancellationToken);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/// <inheritdoc />
|
|
36
|
+
public async Task AddAsync({Feature} entity, CancellationToken cancellationToken = default)
|
|
37
|
+
{
|
|
38
|
+
await _dbSet.AddAsync(entity, cancellationToken);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/// <inheritdoc />
|
|
42
|
+
public void Update({Feature} entity)
|
|
43
|
+
{
|
|
44
|
+
_dbSet.Update(entity);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/// <inheritdoc />
|
|
48
|
+
public void Remove({Feature} entity)
|
|
49
|
+
{
|
|
50
|
+
_dbSet.Remove(entity);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/// <inheritdoc />
|
|
54
|
+
public async Task SaveChangesAsync(CancellationToken cancellationToken = default)
|
|
55
|
+
{
|
|
56
|
+
await context.SaveChangesAsync(cancellationToken);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
#region Additional Query Methods
|
|
60
|
+
|
|
61
|
+
/// <summary>
|
|
62
|
+
/// Gets {Feature}s by status.
|
|
63
|
+
/// </summary>
|
|
64
|
+
public async Task<List<{Feature}>> GetByStatusAsync(
|
|
65
|
+
{Feature}Status status,
|
|
66
|
+
CancellationToken cancellationToken = default)
|
|
67
|
+
{
|
|
68
|
+
return await _dbSet
|
|
69
|
+
.AsNoTracking()
|
|
70
|
+
.Where(x => x.Status == status)
|
|
71
|
+
.OrderByDescending(x => x.CreatedAt)
|
|
72
|
+
.ToListAsync(cancellationToken);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/// <summary>
|
|
76
|
+
/// Checks if a {Feature} with the given name exists.
|
|
77
|
+
/// </summary>
|
|
78
|
+
public async Task<bool> ExistsByNameAsync(
|
|
79
|
+
string name,
|
|
80
|
+
CancellationToken cancellationToken = default)
|
|
81
|
+
{
|
|
82
|
+
return await _dbSet
|
|
83
|
+
.AsNoTracking()
|
|
84
|
+
.AnyAsync(x => x.Name == name, cancellationToken);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/// <summary>
|
|
88
|
+
/// Gets {Feature}s with pagination.
|
|
89
|
+
/// </summary>
|
|
90
|
+
public async Task<(List<{Feature}> Items, int TotalCount)> GetPagedAsync(
|
|
91
|
+
int page,
|
|
92
|
+
int pageSize,
|
|
93
|
+
CancellationToken cancellationToken = default)
|
|
94
|
+
{
|
|
95
|
+
var query = _dbSet.AsNoTracking();
|
|
96
|
+
|
|
97
|
+
var totalCount = await query.CountAsync(cancellationToken);
|
|
98
|
+
|
|
99
|
+
var items = await query
|
|
100
|
+
.OrderByDescending(x => x.CreatedAt)
|
|
101
|
+
.Skip((page - 1) * pageSize)
|
|
102
|
+
.Take(pageSize)
|
|
103
|
+
.ToListAsync(cancellationToken);
|
|
104
|
+
|
|
105
|
+
return (items, totalCount);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
#endregion
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// ============================================================
|
|
112
|
+
// EF CORE CONFIGURATION
|
|
113
|
+
// ============================================================
|
|
114
|
+
|
|
115
|
+
public class {Feature}Configuration : IEntityTypeConfiguration<{Feature}>
|
|
116
|
+
{
|
|
117
|
+
public void Configure(EntityTypeBuilder<{Feature}> builder)
|
|
118
|
+
{
|
|
119
|
+
builder.ToTable("{Feature}s");
|
|
120
|
+
|
|
121
|
+
builder.HasKey(x => x.Id);
|
|
122
|
+
|
|
123
|
+
builder.Property(x => x.Name)
|
|
124
|
+
.IsRequired()
|
|
125
|
+
.HasMaxLength(200);
|
|
126
|
+
|
|
127
|
+
builder.Property(x => x.Status)
|
|
128
|
+
.IsRequired()
|
|
129
|
+
.HasConversion<string>();
|
|
130
|
+
|
|
131
|
+
builder.Property(x => x.CreatedAt)
|
|
132
|
+
.IsRequired();
|
|
133
|
+
|
|
134
|
+
builder.Property(x => x.UpdatedAt);
|
|
135
|
+
|
|
136
|
+
// Indexes
|
|
137
|
+
builder.HasIndex(x => x.Name);
|
|
138
|
+
builder.HasIndex(x => x.Status);
|
|
139
|
+
builder.HasIndex(x => x.CreatedAt);
|
|
140
|
+
}
|
|
141
|
+
}
|