@polymorphism-tech/morph-spec 4.10.8 → 4.10.10
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 +3 -3
- package/LICENSE +71 -71
- package/README.md +2 -2
- package/bin/morph-spec.js +22 -0
- package/claude-plugin.json +1 -1
- package/docs/CHEATSHEET.md +1 -1
- package/docs/QUICKSTART.md +1 -1
- package/framework/agents/README.md +14 -14
- package/framework/agents/architecture/standards-architect.md +159 -159
- package/framework/agents/infrastructure/azure-architect.md +149 -149
- package/framework/agents/infrastructure/infra-architect.md +48 -48
- package/framework/hooks/README.md +204 -204
- package/framework/hooks/shared/phase-utils.js +139 -139
- package/framework/rules/csharp-standards.md +13 -13
- package/framework/rules/frontend-standards.md +13 -13
- package/framework/rules/infrastructure-standards.md +16 -16
- package/framework/rules/testing-standards.md +14 -14
- package/framework/skills/level-0-meta/morph-code-review-nextjs/references/review-example-nextjs.md +254 -254
- package/framework/skills/level-0-meta/morph-init/SKILL.md +57 -9
- package/framework/skills/level-1-workflows/morph-phase-clarify/SKILL.md +1 -1
- package/framework/skills/level-1-workflows/morph-phase-codebase-analysis/SKILL.md +1 -1
- package/framework/skills/level-1-workflows/morph-phase-design/SKILL.md +1 -1
- package/framework/skills/level-1-workflows/morph-phase-implement/.morph/logs/activity.json +38 -0
- package/framework/skills/level-1-workflows/morph-phase-implement/SKILL.md +1 -1
- package/framework/skills/level-1-workflows/morph-phase-plan/SKILL.md +1 -1
- package/framework/skills/level-1-workflows/morph-phase-setup/SKILL.md +1 -1
- package/framework/skills/level-1-workflows/morph-phase-tasks/.morph/logs/activity.json +14 -0
- package/framework/skills/level-1-workflows/morph-phase-tasks/SKILL.md +1 -1
- package/framework/skills/level-1-workflows/morph-phase-uiux/SKILL.md +49 -16
- package/framework/skills/level-1-workflows/morph-scope-escalation/SKILL.md +1 -1
- package/framework/standards/STANDARDS.json +2338 -2041
- package/framework/standards/frontend/nextjs/nextjs-patterns.md +17 -17
- package/framework/standards/infrastructure/supabase/supabase-custom-jwt.md +206 -0
- package/framework/templates/.idea/morph-templates.xml +92 -0
- package/framework/templates/.vscode/morph-templates.code-snippets +186 -0
- package/framework/templates/README.md +814 -814
- package/framework/templates/code/dotnet/contracts/Commands.cs +74 -74
- package/framework/templates/code/dotnet/contracts/Entities.cs +25 -25
- package/framework/templates/code/dotnet/contracts/Queries.cs +74 -74
- package/framework/templates/code/dotnet/contracts/README.md +74 -74
- package/framework/templates/code/dotnet/contracts/api-contracts.cs +173 -173
- package/framework/templates/code/dotnet/frontend/component.razor +239 -239
- package/framework/templates/code/dotnet/jobs/agent.cs +163 -163
- package/framework/templates/code/dotnet/jobs/job.cs +171 -171
- package/framework/templates/code/dotnet/test.cs +239 -239
- package/framework/templates/code/sql/rls-policy.sql +57 -57
- package/framework/templates/code/sql/supabase-migration.sql +100 -100
- package/framework/templates/code/sql/supabase-migration.template.sql +113 -113
- package/framework/templates/code/typescript/contracts.ts +168 -168
- package/framework/templates/context/CONTEXT.md +181 -181
- package/framework/templates/docs/proposal.md +182 -182
- package/framework/templates/docs/user-stories.md +34 -34
- package/framework/templates/examples/design-system-examples.md +357 -357
- package/framework/templates/examples/spec-examples.md +90 -90
- package/framework/templates/feature/decisions.md +187 -187
- package/framework/templates/feature/recap.md +146 -146
- package/framework/templates/feature/tasks.md +199 -199
- package/framework/templates/infrastructure/azure/README.md +286 -286
- package/framework/templates/infrastructure/azure/deploy-checklist.md +426 -426
- package/framework/templates/infrastructure/azure/parameters.dev.json +29 -29
- package/framework/templates/infrastructure/azure/parameters.prod.json +29 -29
- package/framework/templates/infrastructure/azure/parameters.staging.json +29 -29
- package/framework/templates/infrastructure/docker/docker-compose.template.yml +67 -67
- package/framework/templates/infrastructure/docker/dockerfile-api.dockerfile +38 -38
- package/framework/templates/infrastructure/docker/dockerfile-web.dockerfile +48 -48
- package/framework/templates/infrastructure/docker/easypanel.template.json +54 -54
- package/package.json +1 -1
- package/src/commands/agents/dispatch-agents.js +17 -0
- package/src/commands/agents/index.js +13 -13
- package/src/commands/agents/project-metrics.js +74 -0
- package/src/commands/project/install-plugin-cmd.js +28 -28
- package/src/commands/project/setup-infra-cmd.js +12 -12
- package/src/commands/standards/context-budget.js +89 -0
- package/src/commands/tasks/index.js +4 -4
- package/src/commands/templates/index.js +5 -5
- package/src/commands/utils/index.js +3 -3
- package/src/commands/validation/index.js +4 -4
- package/src/core/state/phase-state-machine.js +217 -217
- package/src/lib/agents/metrics-aggregator.js +56 -0
- package/src/lib/detectors/design-system-detector.js +73 -31
- package/src/lib/generators/design-system-generator.js +298 -298
- package/src/lib/generators/index.js +10 -10
- package/src/lib/generators/metadata-extractor.js +387 -387
- package/src/lib/stack-filter.js +65 -65
- package/src/lib/standards/digest-builder.js +57 -3
- package/src/lib/standards/index.js +7 -7
- package/src/lib/standards/standards-context-injector.js +302 -302
- package/src/lib/validators/architecture/architecture-validator.js +387 -387
- package/src/lib/validators/architecture/index.js +7 -7
- package/src/lib/validators/blazor/blazor-concurrency-analyzer.js +316 -316
- package/src/lib/validators/blazor/blazor-state-validator.js +279 -279
- package/src/lib/validators/blazor/blazor-validator.js +369 -369
- package/src/lib/validators/blazor/index.js +9 -9
- package/src/lib/validators/content/content-validator.js +287 -287
- package/src/lib/validators/content/index.js +7 -7
- package/src/lib/validators/contracts/index.js +7 -7
- package/src/lib/validators/css/css-validator.js +352 -352
- package/src/lib/validators/css/index.js +7 -7
- package/src/lib/validators/design-system/design-system-validator.js +231 -231
- package/src/lib/validators/design-system/index.js +7 -7
- package/src/lib/validators/nextjs/index.js +6 -6
- package/src/lib/validators/nextjs/next-component-validator.js +183 -183
- package/src/lib/validators/packages/index.js +7 -7
- package/src/lib/validators/packages/package-validator.js +360 -360
- package/src/lib/validators/shared/index.js +12 -12
- package/src/lib/validators/shared/issue-counter.js +18 -18
- package/src/lib/validators/shared/result-formatter.js +124 -124
- package/src/lib/validators/ui/index.js +7 -7
- package/src/lib/validators/ui/ui-contrast-validator.js +422 -422
- package/src/scripts/global-install.js +58 -58
- package/src/scripts/install-plugin.js +126 -126
- package/src/utils/claude-md-injector.js +90 -90
- package/src/utils/file-copier.js +200 -200
- package/src/utils/logger.js +32 -32
- package/src/utils/skills-installer.js +178 -178
- package/src/utils/version-checker.js +175 -175
|
@@ -1,29 +1,29 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
|
|
3
|
-
"contentVersion": "1.0.0.0",
|
|
4
|
-
"parameters": {
|
|
5
|
-
"environment": {
|
|
6
|
-
"value": "dev"
|
|
7
|
-
},
|
|
8
|
-
"appName": {
|
|
9
|
-
"value": "{{APP_NAME}}"
|
|
10
|
-
},
|
|
11
|
-
"sqlAdminPassword": {
|
|
12
|
-
"reference": {
|
|
13
|
-
"keyVault": {
|
|
14
|
-
"id": "/subscriptions/{{SUBSCRIPTION_ID}}/resourceGroups/{{RESOURCE_GROUP}}/providers/Microsoft.KeyVault/vaults/{{KEY_VAULT_NAME}}"
|
|
15
|
-
},
|
|
16
|
-
"secretName": "sql-admin-password"
|
|
17
|
-
}
|
|
18
|
-
},
|
|
19
|
-
"hostingType": {
|
|
20
|
-
"value": "appservice"
|
|
21
|
-
},
|
|
22
|
-
"appServiceSku": {
|
|
23
|
-
"value": "F1"
|
|
24
|
-
},
|
|
25
|
-
"containerImage": {
|
|
26
|
-
"value": "{{ACR_NAME}}.azurecr.io/{{APP_NAME}}:latest"
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
|
|
3
|
+
"contentVersion": "1.0.0.0",
|
|
4
|
+
"parameters": {
|
|
5
|
+
"environment": {
|
|
6
|
+
"value": "dev"
|
|
7
|
+
},
|
|
8
|
+
"appName": {
|
|
9
|
+
"value": "{{APP_NAME}}"
|
|
10
|
+
},
|
|
11
|
+
"sqlAdminPassword": {
|
|
12
|
+
"reference": {
|
|
13
|
+
"keyVault": {
|
|
14
|
+
"id": "/subscriptions/{{SUBSCRIPTION_ID}}/resourceGroups/{{RESOURCE_GROUP}}/providers/Microsoft.KeyVault/vaults/{{KEY_VAULT_NAME}}"
|
|
15
|
+
},
|
|
16
|
+
"secretName": "sql-admin-password"
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
"hostingType": {
|
|
20
|
+
"value": "appservice"
|
|
21
|
+
},
|
|
22
|
+
"appServiceSku": {
|
|
23
|
+
"value": "F1"
|
|
24
|
+
},
|
|
25
|
+
"containerImage": {
|
|
26
|
+
"value": "{{ACR_NAME}}.azurecr.io/{{APP_NAME}}:latest"
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -1,29 +1,29 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
|
|
3
|
-
"contentVersion": "1.0.0.0",
|
|
4
|
-
"parameters": {
|
|
5
|
-
"environment": {
|
|
6
|
-
"value": "prod"
|
|
7
|
-
},
|
|
8
|
-
"appName": {
|
|
9
|
-
"value": "{{APP_NAME}}"
|
|
10
|
-
},
|
|
11
|
-
"sqlAdminPassword": {
|
|
12
|
-
"reference": {
|
|
13
|
-
"keyVault": {
|
|
14
|
-
"id": "/subscriptions/{{SUBSCRIPTION_ID}}/resourceGroups/{{RESOURCE_GROUP}}/providers/Microsoft.KeyVault/vaults/{{KEY_VAULT_NAME}}"
|
|
15
|
-
},
|
|
16
|
-
"secretName": "sql-admin-password"
|
|
17
|
-
}
|
|
18
|
-
},
|
|
19
|
-
"hostingType": {
|
|
20
|
-
"value": "containerapp"
|
|
21
|
-
},
|
|
22
|
-
"appServiceSku": {
|
|
23
|
-
"value": "P1v2"
|
|
24
|
-
},
|
|
25
|
-
"containerImage": {
|
|
26
|
-
"value": "{{ACR_NAME}}.azurecr.io/{{APP_NAME}}:{{VERSION}}"
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
|
|
3
|
+
"contentVersion": "1.0.0.0",
|
|
4
|
+
"parameters": {
|
|
5
|
+
"environment": {
|
|
6
|
+
"value": "prod"
|
|
7
|
+
},
|
|
8
|
+
"appName": {
|
|
9
|
+
"value": "{{APP_NAME}}"
|
|
10
|
+
},
|
|
11
|
+
"sqlAdminPassword": {
|
|
12
|
+
"reference": {
|
|
13
|
+
"keyVault": {
|
|
14
|
+
"id": "/subscriptions/{{SUBSCRIPTION_ID}}/resourceGroups/{{RESOURCE_GROUP}}/providers/Microsoft.KeyVault/vaults/{{KEY_VAULT_NAME}}"
|
|
15
|
+
},
|
|
16
|
+
"secretName": "sql-admin-password"
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
"hostingType": {
|
|
20
|
+
"value": "containerapp"
|
|
21
|
+
},
|
|
22
|
+
"appServiceSku": {
|
|
23
|
+
"value": "P1v2"
|
|
24
|
+
},
|
|
25
|
+
"containerImage": {
|
|
26
|
+
"value": "{{ACR_NAME}}.azurecr.io/{{APP_NAME}}:{{VERSION}}"
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -1,29 +1,29 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
|
|
3
|
-
"contentVersion": "1.0.0.0",
|
|
4
|
-
"parameters": {
|
|
5
|
-
"environment": {
|
|
6
|
-
"value": "staging"
|
|
7
|
-
},
|
|
8
|
-
"appName": {
|
|
9
|
-
"value": "{{APP_NAME}}"
|
|
10
|
-
},
|
|
11
|
-
"sqlAdminPassword": {
|
|
12
|
-
"reference": {
|
|
13
|
-
"keyVault": {
|
|
14
|
-
"id": "/subscriptions/{{SUBSCRIPTION_ID}}/resourceGroups/{{RESOURCE_GROUP}}/providers/Microsoft.KeyVault/vaults/{{KEY_VAULT_NAME}}"
|
|
15
|
-
},
|
|
16
|
-
"secretName": "sql-admin-password"
|
|
17
|
-
}
|
|
18
|
-
},
|
|
19
|
-
"hostingType": {
|
|
20
|
-
"value": "containerapp"
|
|
21
|
-
},
|
|
22
|
-
"appServiceSku": {
|
|
23
|
-
"value": "B1"
|
|
24
|
-
},
|
|
25
|
-
"containerImage": {
|
|
26
|
-
"value": "{{ACR_NAME}}.azurecr.io/{{APP_NAME}}:latest"
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
|
|
3
|
+
"contentVersion": "1.0.0.0",
|
|
4
|
+
"parameters": {
|
|
5
|
+
"environment": {
|
|
6
|
+
"value": "staging"
|
|
7
|
+
},
|
|
8
|
+
"appName": {
|
|
9
|
+
"value": "{{APP_NAME}}"
|
|
10
|
+
},
|
|
11
|
+
"sqlAdminPassword": {
|
|
12
|
+
"reference": {
|
|
13
|
+
"keyVault": {
|
|
14
|
+
"id": "/subscriptions/{{SUBSCRIPTION_ID}}/resourceGroups/{{RESOURCE_GROUP}}/providers/Microsoft.KeyVault/vaults/{{KEY_VAULT_NAME}}"
|
|
15
|
+
},
|
|
16
|
+
"secretName": "sql-admin-password"
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
"hostingType": {
|
|
20
|
+
"value": "containerapp"
|
|
21
|
+
},
|
|
22
|
+
"appServiceSku": {
|
|
23
|
+
"value": "B1"
|
|
24
|
+
},
|
|
25
|
+
"containerImage": {
|
|
26
|
+
"value": "{{ACR_NAME}}.azurecr.io/{{APP_NAME}}:latest"
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -1,67 +1,67 @@
|
|
|
1
|
-
# Docker Compose for Local Development
|
|
2
|
-
# Next.js + Supabase Stack
|
|
3
|
-
|
|
4
|
-
version: '3.8'
|
|
5
|
-
|
|
6
|
-
services:
|
|
7
|
-
# Next.js Application
|
|
8
|
-
app:
|
|
9
|
-
build:
|
|
10
|
-
context: .
|
|
11
|
-
dockerfile: Dockerfile.dev
|
|
12
|
-
container_name: {{kebabCase FEATURE_NAME}}-app
|
|
13
|
-
ports:
|
|
14
|
-
- "3000:3000"
|
|
15
|
-
environment:
|
|
16
|
-
- NODE_ENV=development
|
|
17
|
-
- NEXT_PUBLIC_SUPABASE_URL=${NEXT_PUBLIC_SUPABASE_URL}
|
|
18
|
-
- NEXT_PUBLIC_SUPABASE_ANON_KEY=${NEXT_PUBLIC_SUPABASE_ANON_KEY}
|
|
19
|
-
- SUPABASE_SERVICE_ROLE_KEY=${SUPABASE_SERVICE_ROLE_KEY}
|
|
20
|
-
volumes:
|
|
21
|
-
- .:/app
|
|
22
|
-
- /app/node_modules
|
|
23
|
-
- /app/.next
|
|
24
|
-
depends_on:
|
|
25
|
-
- postgres
|
|
26
|
-
networks:
|
|
27
|
-
- app-network
|
|
28
|
-
|
|
29
|
-
# PostgreSQL Database (Local Supabase alternative)
|
|
30
|
-
postgres:
|
|
31
|
-
image: postgres:15-alpine
|
|
32
|
-
container_name: {{kebabCase FEATURE_NAME}}-postgres
|
|
33
|
-
restart: unless-stopped
|
|
34
|
-
ports:
|
|
35
|
-
- "5432:5432"
|
|
36
|
-
environment:
|
|
37
|
-
POSTGRES_USER: postgres
|
|
38
|
-
POSTGRES_PASSWORD: postgres
|
|
39
|
-
POSTGRES_DB: {{snakeCase FEATURE_NAME}}
|
|
40
|
-
volumes:
|
|
41
|
-
- postgres-data:/var/lib/postgresql/data
|
|
42
|
-
- ./supabase/migrations:/docker-entrypoint-initdb.d
|
|
43
|
-
networks:
|
|
44
|
-
- app-network
|
|
45
|
-
|
|
46
|
-
# Supabase Studio (Database UI - optional)
|
|
47
|
-
studio:
|
|
48
|
-
image: supabase/studio:latest
|
|
49
|
-
container_name: {{kebabCase FEATURE_NAME}}-studio
|
|
50
|
-
restart: unless-stopped
|
|
51
|
-
ports:
|
|
52
|
-
- "3001:3000"
|
|
53
|
-
environment:
|
|
54
|
-
SUPABASE_URL: http://kong:8000
|
|
55
|
-
STUDIO_PG_META_URL: http://meta:8080
|
|
56
|
-
SUPABASE_ANON_KEY: ${SUPABASE_ANON_KEY}
|
|
57
|
-
SUPABASE_SERVICE_KEY: ${SUPABASE_SERVICE_ROLE_KEY}
|
|
58
|
-
networks:
|
|
59
|
-
- app-network
|
|
60
|
-
|
|
61
|
-
volumes:
|
|
62
|
-
postgres-data:
|
|
63
|
-
driver: local
|
|
64
|
-
|
|
65
|
-
networks:
|
|
66
|
-
app-network:
|
|
67
|
-
driver: bridge
|
|
1
|
+
# Docker Compose for Local Development
|
|
2
|
+
# Next.js + Supabase Stack
|
|
3
|
+
|
|
4
|
+
version: '3.8'
|
|
5
|
+
|
|
6
|
+
services:
|
|
7
|
+
# Next.js Application
|
|
8
|
+
app:
|
|
9
|
+
build:
|
|
10
|
+
context: .
|
|
11
|
+
dockerfile: Dockerfile.dev
|
|
12
|
+
container_name: {{kebabCase FEATURE_NAME}}-app
|
|
13
|
+
ports:
|
|
14
|
+
- "3000:3000"
|
|
15
|
+
environment:
|
|
16
|
+
- NODE_ENV=development
|
|
17
|
+
- NEXT_PUBLIC_SUPABASE_URL=${NEXT_PUBLIC_SUPABASE_URL}
|
|
18
|
+
- NEXT_PUBLIC_SUPABASE_ANON_KEY=${NEXT_PUBLIC_SUPABASE_ANON_KEY}
|
|
19
|
+
- SUPABASE_SERVICE_ROLE_KEY=${SUPABASE_SERVICE_ROLE_KEY}
|
|
20
|
+
volumes:
|
|
21
|
+
- .:/app
|
|
22
|
+
- /app/node_modules
|
|
23
|
+
- /app/.next
|
|
24
|
+
depends_on:
|
|
25
|
+
- postgres
|
|
26
|
+
networks:
|
|
27
|
+
- app-network
|
|
28
|
+
|
|
29
|
+
# PostgreSQL Database (Local Supabase alternative)
|
|
30
|
+
postgres:
|
|
31
|
+
image: postgres:15-alpine
|
|
32
|
+
container_name: {{kebabCase FEATURE_NAME}}-postgres
|
|
33
|
+
restart: unless-stopped
|
|
34
|
+
ports:
|
|
35
|
+
- "5432:5432"
|
|
36
|
+
environment:
|
|
37
|
+
POSTGRES_USER: postgres
|
|
38
|
+
POSTGRES_PASSWORD: postgres
|
|
39
|
+
POSTGRES_DB: {{snakeCase FEATURE_NAME}}
|
|
40
|
+
volumes:
|
|
41
|
+
- postgres-data:/var/lib/postgresql/data
|
|
42
|
+
- ./supabase/migrations:/docker-entrypoint-initdb.d
|
|
43
|
+
networks:
|
|
44
|
+
- app-network
|
|
45
|
+
|
|
46
|
+
# Supabase Studio (Database UI - optional)
|
|
47
|
+
studio:
|
|
48
|
+
image: supabase/studio:latest
|
|
49
|
+
container_name: {{kebabCase FEATURE_NAME}}-studio
|
|
50
|
+
restart: unless-stopped
|
|
51
|
+
ports:
|
|
52
|
+
- "3001:3000"
|
|
53
|
+
environment:
|
|
54
|
+
SUPABASE_URL: http://kong:8000
|
|
55
|
+
STUDIO_PG_META_URL: http://meta:8080
|
|
56
|
+
SUPABASE_ANON_KEY: ${SUPABASE_ANON_KEY}
|
|
57
|
+
SUPABASE_SERVICE_KEY: ${SUPABASE_SERVICE_ROLE_KEY}
|
|
58
|
+
networks:
|
|
59
|
+
- app-network
|
|
60
|
+
|
|
61
|
+
volumes:
|
|
62
|
+
postgres-data:
|
|
63
|
+
driver: local
|
|
64
|
+
|
|
65
|
+
networks:
|
|
66
|
+
app-network:
|
|
67
|
+
driver: bridge
|
|
@@ -1,38 +1,38 @@
|
|
|
1
|
-
# ============================================================
|
|
2
|
-
# Dockerfile: .NET 10 API ({{titleCase FEATURE_NAME}})
|
|
3
|
-
# Stack: Next.js + Supabase + .NET API
|
|
4
|
-
# Generated by MORPH Framework
|
|
5
|
-
# ============================================================
|
|
6
|
-
|
|
7
|
-
# Stage 1: Build
|
|
8
|
-
FROM mcr.microsoft.com/dotnet/sdk:10.0 AS build
|
|
9
|
-
WORKDIR /src
|
|
10
|
-
|
|
11
|
-
# Copy project file and restore dependencies
|
|
12
|
-
COPY *.csproj .
|
|
13
|
-
RUN dotnet restore
|
|
14
|
-
|
|
15
|
-
# Copy source code and publish
|
|
16
|
-
COPY . .
|
|
17
|
-
RUN dotnet publish -c Release -o /app/publish --no-restore
|
|
18
|
-
|
|
19
|
-
# Stage 2: Runtime
|
|
20
|
-
FROM mcr.microsoft.com/dotnet/aspnet:10.0 AS runtime
|
|
21
|
-
WORKDIR /app
|
|
22
|
-
|
|
23
|
-
# Copy published output
|
|
24
|
-
COPY --from=build /app/publish .
|
|
25
|
-
|
|
26
|
-
# Configuration
|
|
27
|
-
ENV ASPNETCORE_URLS=http://+:8080
|
|
28
|
-
ENV ASPNETCORE_ENVIRONMENT=Production
|
|
29
|
-
|
|
30
|
-
# Expose port
|
|
31
|
-
EXPOSE 8080
|
|
32
|
-
|
|
33
|
-
# Health check
|
|
34
|
-
HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \
|
|
35
|
-
CMD curl -f http://localhost:8080/health || exit 1
|
|
36
|
-
|
|
37
|
-
# Entrypoint
|
|
38
|
-
ENTRYPOINT ["dotnet", "Api.dll"]
|
|
1
|
+
# ============================================================
|
|
2
|
+
# Dockerfile: .NET 10 API ({{titleCase FEATURE_NAME}})
|
|
3
|
+
# Stack: Next.js + Supabase + .NET API
|
|
4
|
+
# Generated by MORPH Framework
|
|
5
|
+
# ============================================================
|
|
6
|
+
|
|
7
|
+
# Stage 1: Build
|
|
8
|
+
FROM mcr.microsoft.com/dotnet/sdk:10.0 AS build
|
|
9
|
+
WORKDIR /src
|
|
10
|
+
|
|
11
|
+
# Copy project file and restore dependencies
|
|
12
|
+
COPY *.csproj .
|
|
13
|
+
RUN dotnet restore
|
|
14
|
+
|
|
15
|
+
# Copy source code and publish
|
|
16
|
+
COPY . .
|
|
17
|
+
RUN dotnet publish -c Release -o /app/publish --no-restore
|
|
18
|
+
|
|
19
|
+
# Stage 2: Runtime
|
|
20
|
+
FROM mcr.microsoft.com/dotnet/aspnet:10.0 AS runtime
|
|
21
|
+
WORKDIR /app
|
|
22
|
+
|
|
23
|
+
# Copy published output
|
|
24
|
+
COPY --from=build /app/publish .
|
|
25
|
+
|
|
26
|
+
# Configuration
|
|
27
|
+
ENV ASPNETCORE_URLS=http://+:8080
|
|
28
|
+
ENV ASPNETCORE_ENVIRONMENT=Production
|
|
29
|
+
|
|
30
|
+
# Expose port
|
|
31
|
+
EXPOSE 8080
|
|
32
|
+
|
|
33
|
+
# Health check
|
|
34
|
+
HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \
|
|
35
|
+
CMD curl -f http://localhost:8080/health || exit 1
|
|
36
|
+
|
|
37
|
+
# Entrypoint
|
|
38
|
+
ENTRYPOINT ["dotnet", "Api.dll"]
|
|
@@ -1,48 +1,48 @@
|
|
|
1
|
-
# ============================================================
|
|
2
|
-
# Dockerfile: Next.js Frontend ({{titleCase FEATURE_NAME}})
|
|
3
|
-
# Stack: Next.js + Supabase
|
|
4
|
-
# Generated by MORPH Framework
|
|
5
|
-
# Requires: output: "standalone" in next.config.ts
|
|
6
|
-
# ============================================================
|
|
7
|
-
|
|
8
|
-
# Stage 1: Install dependencies
|
|
9
|
-
FROM node:22-alpine AS deps
|
|
10
|
-
WORKDIR /app
|
|
11
|
-
COPY package.json package-lock.json ./
|
|
12
|
-
RUN npm ci --omit=dev
|
|
13
|
-
|
|
14
|
-
# Stage 2: Build application
|
|
15
|
-
FROM node:22-alpine AS builder
|
|
16
|
-
WORKDIR /app
|
|
17
|
-
COPY --from=deps /app/node_modules ./node_modules
|
|
18
|
-
COPY . .
|
|
19
|
-
ENV NEXT_TELEMETRY_DISABLED=1
|
|
20
|
-
RUN npm run build
|
|
21
|
-
|
|
22
|
-
# Stage 3: Production runtime
|
|
23
|
-
FROM node:22-alpine AS runner
|
|
24
|
-
WORKDIR /app
|
|
25
|
-
|
|
26
|
-
ENV NODE_ENV=production
|
|
27
|
-
ENV NEXT_TELEMETRY_DISABLED=1
|
|
28
|
-
|
|
29
|
-
# Create non-root user
|
|
30
|
-
RUN addgroup --system --gid 1001 nodejs && \
|
|
31
|
-
adduser --system --uid 1001 nextjs
|
|
32
|
-
|
|
33
|
-
# Copy build output
|
|
34
|
-
COPY --from=builder /app/public ./public
|
|
35
|
-
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
|
|
36
|
-
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
|
|
37
|
-
|
|
38
|
-
# Switch to non-root user
|
|
39
|
-
USER nextjs
|
|
40
|
-
|
|
41
|
-
# Expose port
|
|
42
|
-
EXPOSE 3000
|
|
43
|
-
|
|
44
|
-
ENV PORT=3000
|
|
45
|
-
ENV HOSTNAME="0.0.0.0"
|
|
46
|
-
|
|
47
|
-
# Start server
|
|
48
|
-
CMD ["node", "server.js"]
|
|
1
|
+
# ============================================================
|
|
2
|
+
# Dockerfile: Next.js Frontend ({{titleCase FEATURE_NAME}})
|
|
3
|
+
# Stack: Next.js + Supabase
|
|
4
|
+
# Generated by MORPH Framework
|
|
5
|
+
# Requires: output: "standalone" in next.config.ts
|
|
6
|
+
# ============================================================
|
|
7
|
+
|
|
8
|
+
# Stage 1: Install dependencies
|
|
9
|
+
FROM node:22-alpine AS deps
|
|
10
|
+
WORKDIR /app
|
|
11
|
+
COPY package.json package-lock.json ./
|
|
12
|
+
RUN npm ci --omit=dev
|
|
13
|
+
|
|
14
|
+
# Stage 2: Build application
|
|
15
|
+
FROM node:22-alpine AS builder
|
|
16
|
+
WORKDIR /app
|
|
17
|
+
COPY --from=deps /app/node_modules ./node_modules
|
|
18
|
+
COPY . .
|
|
19
|
+
ENV NEXT_TELEMETRY_DISABLED=1
|
|
20
|
+
RUN npm run build
|
|
21
|
+
|
|
22
|
+
# Stage 3: Production runtime
|
|
23
|
+
FROM node:22-alpine AS runner
|
|
24
|
+
WORKDIR /app
|
|
25
|
+
|
|
26
|
+
ENV NODE_ENV=production
|
|
27
|
+
ENV NEXT_TELEMETRY_DISABLED=1
|
|
28
|
+
|
|
29
|
+
# Create non-root user
|
|
30
|
+
RUN addgroup --system --gid 1001 nodejs && \
|
|
31
|
+
adduser --system --uid 1001 nextjs
|
|
32
|
+
|
|
33
|
+
# Copy build output
|
|
34
|
+
COPY --from=builder /app/public ./public
|
|
35
|
+
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
|
|
36
|
+
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
|
|
37
|
+
|
|
38
|
+
# Switch to non-root user
|
|
39
|
+
USER nextjs
|
|
40
|
+
|
|
41
|
+
# Expose port
|
|
42
|
+
EXPOSE 3000
|
|
43
|
+
|
|
44
|
+
ENV PORT=3000
|
|
45
|
+
ENV HOSTNAME="0.0.0.0"
|
|
46
|
+
|
|
47
|
+
# Start server
|
|
48
|
+
CMD ["node", "server.js"]
|
|
@@ -1,54 +1,54 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "{{kebabCase FEATURE_NAME}}",
|
|
3
|
-
"services": [
|
|
4
|
-
{
|
|
5
|
-
"type": "app",
|
|
6
|
-
"data": {
|
|
7
|
-
"projectName": "{{kebabCase FEATURE_NAME}}",
|
|
8
|
-
"serviceName": "{{kebabCase FEATURE_NAME}}-app",
|
|
9
|
-
"source": {
|
|
10
|
-
"type": "github",
|
|
11
|
-
"owner": "{{GITHUB_OWNER}}",
|
|
12
|
-
"repo": "{{GITHUB_REPO}}",
|
|
13
|
-
"ref": "main",
|
|
14
|
-
"autoDeploy": true
|
|
15
|
-
},
|
|
16
|
-
"build": {
|
|
17
|
-
"type": "dockerfile",
|
|
18
|
-
"dockerfile": "Dockerfile"
|
|
19
|
-
},
|
|
20
|
-
"deploy": {
|
|
21
|
-
"replicas": 1,
|
|
22
|
-
"command": null,
|
|
23
|
-
"zeroDowntime": true
|
|
24
|
-
},
|
|
25
|
-
"env": [
|
|
26
|
-
{
|
|
27
|
-
"key": "NODE_ENV",
|
|
28
|
-
"value": "production"
|
|
29
|
-
},
|
|
30
|
-
{
|
|
31
|
-
"key": "NEXT_PUBLIC_SUPABASE_URL",
|
|
32
|
-
"value": "${NEXT_PUBLIC_SUPABASE_URL}"
|
|
33
|
-
},
|
|
34
|
-
{
|
|
35
|
-
"key": "NEXT_PUBLIC_SUPABASE_ANON_KEY",
|
|
36
|
-
"value": "${NEXT_PUBLIC_SUPABASE_ANON_KEY}"
|
|
37
|
-
},
|
|
38
|
-
{
|
|
39
|
-
"key": "SUPABASE_SERVICE_ROLE_KEY",
|
|
40
|
-
"value": "${SUPABASE_SERVICE_ROLE_KEY}"
|
|
41
|
-
}
|
|
42
|
-
],
|
|
43
|
-
"domains": [
|
|
44
|
-
{
|
|
45
|
-
"host": "{{kebabCase FEATURE_NAME}}.easypanel.host",
|
|
46
|
-
"port": 3000,
|
|
47
|
-
"https": true
|
|
48
|
-
}
|
|
49
|
-
],
|
|
50
|
-
"mounts": []
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
]
|
|
54
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "{{kebabCase FEATURE_NAME}}",
|
|
3
|
+
"services": [
|
|
4
|
+
{
|
|
5
|
+
"type": "app",
|
|
6
|
+
"data": {
|
|
7
|
+
"projectName": "{{kebabCase FEATURE_NAME}}",
|
|
8
|
+
"serviceName": "{{kebabCase FEATURE_NAME}}-app",
|
|
9
|
+
"source": {
|
|
10
|
+
"type": "github",
|
|
11
|
+
"owner": "{{GITHUB_OWNER}}",
|
|
12
|
+
"repo": "{{GITHUB_REPO}}",
|
|
13
|
+
"ref": "main",
|
|
14
|
+
"autoDeploy": true
|
|
15
|
+
},
|
|
16
|
+
"build": {
|
|
17
|
+
"type": "dockerfile",
|
|
18
|
+
"dockerfile": "Dockerfile"
|
|
19
|
+
},
|
|
20
|
+
"deploy": {
|
|
21
|
+
"replicas": 1,
|
|
22
|
+
"command": null,
|
|
23
|
+
"zeroDowntime": true
|
|
24
|
+
},
|
|
25
|
+
"env": [
|
|
26
|
+
{
|
|
27
|
+
"key": "NODE_ENV",
|
|
28
|
+
"value": "production"
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"key": "NEXT_PUBLIC_SUPABASE_URL",
|
|
32
|
+
"value": "${NEXT_PUBLIC_SUPABASE_URL}"
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"key": "NEXT_PUBLIC_SUPABASE_ANON_KEY",
|
|
36
|
+
"value": "${NEXT_PUBLIC_SUPABASE_ANON_KEY}"
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"key": "SUPABASE_SERVICE_ROLE_KEY",
|
|
40
|
+
"value": "${SUPABASE_SERVICE_ROLE_KEY}"
|
|
41
|
+
}
|
|
42
|
+
],
|
|
43
|
+
"domains": [
|
|
44
|
+
{
|
|
45
|
+
"host": "{{kebabCase FEATURE_NAME}}.easypanel.host",
|
|
46
|
+
"port": 3000,
|
|
47
|
+
"https": true
|
|
48
|
+
}
|
|
49
|
+
],
|
|
50
|
+
"mounts": []
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
]
|
|
54
|
+
}
|
package/package.json
CHANGED
|
@@ -22,6 +22,7 @@ import { fileURLToPath } from 'url';
|
|
|
22
22
|
import { loadState, stateExists } from '../../core/state/state-manager.js';
|
|
23
23
|
import { buildAgentBriefing, buildValidatorPrompt } from '../../lib/standards/digest-builder.js';
|
|
24
24
|
import { agentIdToSubagentType } from '../../utils/agent-id-mapper.js';
|
|
25
|
+
import { shouldInstall, getProjectTags } from '../../lib/stack-filter.js';
|
|
25
26
|
import { parseAndGroupTasks } from '../../lib/tasks/task-parser.js';
|
|
26
27
|
export { parseAndGroupTasks } from '../../lib/tasks/task-parser.js';
|
|
27
28
|
import chalk from 'chalk';
|
|
@@ -222,6 +223,16 @@ export async function buildDispatchConfig(projectPath, featureName, phase, opts
|
|
|
222
223
|
// Non-blocking — fail silent, skills block will be omitted
|
|
223
224
|
}
|
|
224
225
|
|
|
226
|
+
// Load project config for stack filtering
|
|
227
|
+
const configPath = join(projectPath, '.morph', 'config.json');
|
|
228
|
+
let projectTags = [];
|
|
229
|
+
try {
|
|
230
|
+
if (existsSync(configPath)) {
|
|
231
|
+
const config = JSON.parse(readFileSync(configPath, 'utf8'));
|
|
232
|
+
projectTags = getProjectTags(config);
|
|
233
|
+
}
|
|
234
|
+
} catch { /* non-blocking */ }
|
|
235
|
+
|
|
225
236
|
// Active agents from state (keyword-detected during setup phase)
|
|
226
237
|
const activeAgentIds = new Set(feature.activeAgents || []);
|
|
227
238
|
|
|
@@ -259,6 +270,12 @@ export async function buildDispatchConfig(projectPath, featureName, phase, opts
|
|
|
259
270
|
// Phase relevance check (tier-4 bypass in validate mode)
|
|
260
271
|
if (!isRelevantForPhase(agentId, agentData, phase) && !(isValidateMode && isTier4)) continue;
|
|
261
272
|
|
|
273
|
+
// Stack filtering (Tier 1/2 exempt — always dispatched)
|
|
274
|
+
if (agentData.tier >= 3 && projectTags.length > 0) {
|
|
275
|
+
const agentStacks = agentData.stacks || [];
|
|
276
|
+
if (!shouldInstall(agentStacks, projectTags)) continue;
|
|
277
|
+
}
|
|
278
|
+
|
|
262
279
|
const group = getAgentGroup(agentId, agentData);
|
|
263
280
|
|
|
264
281
|
// Build task prompt: validator prompt for tier-4 in validate mode, else spawn_prompt
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Agent Commands
|
|
3
|
-
*/
|
|
4
|
-
export { dispatchAgentsCommand, buildDispatchConfig } from './dispatch-agents.js';
|
|
5
|
-
export { auditDispatchCommand } from './audit-dispatch.js';
|
|
6
|
-
export { detectAgentsCommand, detectAgents } from './detect-agents.js';
|
|
7
|
-
export {
|
|
8
|
-
agentListCommand,
|
|
9
|
-
agentShowCommand,
|
|
10
|
-
agentAddCommand,
|
|
11
|
-
agentEditCommand,
|
|
12
|
-
agentRemoveCommand,
|
|
13
|
-
} from './manage-agents.js';
|
|
1
|
+
/**
|
|
2
|
+
* Agent Commands
|
|
3
|
+
*/
|
|
4
|
+
export { dispatchAgentsCommand, buildDispatchConfig } from './dispatch-agents.js';
|
|
5
|
+
export { auditDispatchCommand } from './audit-dispatch.js';
|
|
6
|
+
export { detectAgentsCommand, detectAgents } from './detect-agents.js';
|
|
7
|
+
export {
|
|
8
|
+
agentListCommand,
|
|
9
|
+
agentShowCommand,
|
|
10
|
+
agentAddCommand,
|
|
11
|
+
agentEditCommand,
|
|
12
|
+
agentRemoveCommand,
|
|
13
|
+
} from './manage-agents.js';
|