@polymorphism-tech/morph-spec 7.9.0 → 7.9.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (171) hide show
  1. package/README.md +4 -4
  2. package/bin/validate.js +379 -379
  3. package/claude-plugin.json +1 -1
  4. package/docs/CHEATSHEET.md +6 -2
  5. package/docs/QUICKSTART.md +4 -4
  6. package/framework/CLAUDE.md +1 -1
  7. package/framework/MORPH.md +2 -2
  8. package/framework/commands/commit.md +166 -166
  9. package/framework/commands/morph-infra.md +215 -215
  10. package/framework/commands/morph-preflight.md +205 -205
  11. package/framework/commands/morph-troubleshoot.md +124 -124
  12. package/framework/hooks/claude-code/statusline.py +679 -679
  13. package/framework/hooks/claude-code/statusline.sh +11 -11
  14. package/framework/hooks/git/commit-msg/conventional-commits.sh +33 -33
  15. package/framework/hooks/git/pre-commit/agents.sh +25 -25
  16. package/framework/hooks/git/pre-commit/orchestrator.sh +64 -64
  17. package/framework/hooks/git/pre-commit/specs.sh +50 -50
  18. package/framework/hooks/git/pre-push/run-tests.sh +44 -44
  19. package/framework/hooks/shared/activity-logger.js +160 -160
  20. package/framework/hooks/shared/hook-response.js +45 -45
  21. package/framework/hooks/shared/payload-utils.js +78 -78
  22. package/framework/hooks/shared/stdin-reader.js +26 -26
  23. package/framework/rubrics/backend.json +41 -41
  24. package/framework/rules/ai-agents-standards.md +45 -45
  25. package/framework/rules/dotnet-templates.md +86 -86
  26. package/framework/rules/frontend-standards.md +13 -13
  27. package/framework/rules/infrastructure-standards.md +27 -27
  28. package/framework/rules/neon-standards.md +25 -25
  29. package/framework/rules/nextjs-standards.md +20 -20
  30. package/framework/rules/nextjs-templates.md +40 -40
  31. package/framework/skills/core/create-umbraco-lp/SKILL.md +1 -1
  32. package/framework/skills/core/migrate-lp-to-umbraco/SKILL.md +1 -1
  33. package/framework/skills/core/morph-apply/SKILL.md +13 -8
  34. package/framework/skills/core/morph-brainstorming/SKILL.md +1 -1
  35. package/framework/skills/core/morph-eval/SKILL.md +1 -1
  36. package/framework/skills/core/morph-implement/SKILL.md +13 -8
  37. package/framework/skills/core/morph-plan/SKILL.md +1 -1
  38. package/framework/skills/core/morph-proposal/SKILL.md +1 -1
  39. package/framework/skills/core/morph-review/SKILL.md +10 -7
  40. package/framework/skills/core/morph-stack-scan/SKILL.md +1 -1
  41. package/framework/skills/core/morph-standards/SKILL.md +1 -1
  42. package/framework/standards/ai-agents/agent-session.md +160 -160
  43. package/framework/standards/ai-agents/batching.md +193 -193
  44. package/framework/standards/ai-agents/context-providers.md +188 -188
  45. package/framework/standards/ai-agents/mcp-server.md +250 -250
  46. package/framework/standards/ai-agents/mcp-tools.md +197 -197
  47. package/framework/standards/ai-agents/middleware-patterns.md +207 -207
  48. package/framework/standards/ai-agents/modalities-image-gen.md +173 -173
  49. package/framework/standards/ai-agents/modalities-speech-to-text.md +171 -171
  50. package/framework/standards/ai-agents/modalities-text-to-speech.md +181 -181
  51. package/framework/standards/ai-agents/modalities-vision.md +201 -201
  52. package/framework/standards/ai-agents/multi-agent-patterns.md +155 -155
  53. package/framework/standards/ai-agents/production.md +275 -275
  54. package/framework/standards/ai-agents/prompts-in-db.md +214 -214
  55. package/framework/standards/ai-agents/providers/model-registry.md +158 -158
  56. package/framework/standards/ai-agents/service-tier-flex.md +135 -135
  57. package/framework/standards/ai-agents/structured-output.md +249 -249
  58. package/framework/standards/ai-agents/sweet-spot.md +109 -109
  59. package/framework/templates/IDE-SNIPPETS.md +262 -262
  60. package/framework/templates/code/dotnet/abstractions/api-endpoint.cs +7 -7
  61. package/framework/templates/code/dotnet/ai-agents/AgentBootstrap.cs.template +39 -39
  62. package/framework/templates/code/dotnet/ai-agents/EmbeddingService.cs.template +68 -68
  63. package/framework/templates/code/dotnet/ai-agents/ModelRegistry.cs.template +117 -117
  64. package/framework/templates/code/dotnet/ai-agents/PromptRepository.cs.template +95 -95
  65. package/framework/templates/code/dotnet/ai-agents/ResilientToolMiddleware.cs.template +61 -61
  66. package/framework/templates/code/dotnet/ai-agents/VectorSearchTool.cs.template +107 -107
  67. package/framework/templates/code/dotnet/ai-agents/model-registry.json.template +58 -58
  68. package/framework/templates/code/dotnet/contracts/contracts-vsa.cs +281 -281
  69. package/framework/templates/code/dotnet/database/migration.cs +83 -83
  70. package/framework/templates/code/dotnet/feature/endpoint.cs.hbs +21 -21
  71. package/framework/templates/code/dotnet/feature/request.cs.hbs +4 -4
  72. package/framework/templates/code/dotnet/feature/response.cs.hbs +4 -4
  73. package/framework/templates/code/dotnet/feature/validator.cs.hbs +15 -15
  74. package/framework/templates/code/sql/ai-agents/agent-prompts-migration.sql.template +58 -58
  75. package/framework/templates/code/sql/ai-agents/pgvector-embeddings-migration.sql.template +91 -91
  76. package/framework/templates/code/typescript/contracts.ts +167 -167
  77. package/framework/templates/docs/clarifications.md +253 -253
  78. package/framework/templates/docs/schema-analysis.md +119 -119
  79. package/framework/templates/docs/ui-components.md +52 -52
  80. package/framework/templates/docs/ui-design-system.md +76 -76
  81. package/framework/templates/docs/ui-flows.md +167 -167
  82. package/framework/templates/docs/ui-mockups.md +98 -98
  83. package/framework/templates/feature/decisions.md +122 -122
  84. package/framework/templates/frontend/nextjs/Dockerfile.nextjs.hbs +43 -43
  85. package/framework/templates/frontend/nextjs/client-component.tsx.hbs +26 -26
  86. package/framework/templates/frontend/nextjs/env.mjs.hbs +32 -32
  87. package/framework/templates/frontend/nextjs/feature-form.tsx.hbs +56 -56
  88. package/framework/templates/frontend/nextjs/page.tsx.hbs +22 -22
  89. package/framework/templates/frontend/nextjs/tsconfig.json.hbs +26 -26
  90. package/framework/templates/frontend/nextjs/use-feature.ts.hbs +54 -54
  91. package/framework/templates/infrastructure/docker/Dockerfile.template +58 -58
  92. package/framework/templates/infrastructure/docker/docker-compose.template.yml +50 -50
  93. package/framework/templates/infrastructure/docker/dockerfile-api.dockerfile +38 -38
  94. package/framework/templates/infrastructure/docker/dockerfile-web.dockerfile +48 -48
  95. package/framework/templates/infrastructure/github/README.md +56 -56
  96. package/framework/templates/infrastructure/github/actions/docker-build-push/action.yml.hbs +45 -45
  97. package/framework/templates/infrastructure/github/actions/health-check/action.yml.hbs +27 -27
  98. package/framework/templates/infrastructure/github/workflows/docker-build-push.yml.hbs +59 -59
  99. package/framework/templates/infrastructure/github/workflows/dotnet-build.yml.hbs +39 -39
  100. package/framework/templates/integrations/asaas-client.cs +387 -387
  101. package/framework/templates/integrations/asaas-webhook.cs +351 -351
  102. package/framework/templates/meta-prompts/fusion/fusion-agent.md +76 -76
  103. package/framework/templates/meta-prompts/fusion/fusion-aggregator.md +100 -100
  104. package/framework/templates/meta-prompts/parallel-workers/parallel-coordinator.md +113 -113
  105. package/framework/templates/meta-prompts/validators/pre-commit-validator.md +95 -95
  106. package/framework/templates/project/validate.js +120 -120
  107. package/framework/templates/state.template.json +17 -17
  108. package/framework/templates/ui/design-system.css +226 -226
  109. package/package.json +2 -1
  110. package/src/commands/dashboard/dashboard.js +53 -53
  111. package/src/commands/index.js +13 -13
  112. package/src/commands/mcp/mcp-setup.js +519 -519
  113. package/src/commands/project/checkpoint.js +209 -209
  114. package/src/commands/project/doctor.js +1 -1
  115. package/src/commands/project/update.js +4 -1
  116. package/src/core/state/phase-state-machine.js +197 -197
  117. package/src/core/templates/template-renderer.js +477 -477
  118. package/src/dashboard/app/components/DetailPanel.jsx +11 -11
  119. package/src/dashboard/app/components/FlowGraph.jsx +17 -17
  120. package/src/dashboard/app/components/SearchFilter.jsx +22 -22
  121. package/src/dashboard/app/hooks/useDetailPanel.js +15 -15
  122. package/src/dashboard/app/main.jsx +13 -13
  123. package/src/dashboard/app/pages/AgentMap.jsx +370 -370
  124. package/src/dashboard/app/pages/HookInspector.jsx +418 -418
  125. package/src/dashboard/app/pages/LiveState.jsx +239 -239
  126. package/src/dashboard/app/pages/PhasePipeline.jsx +408 -408
  127. package/src/dashboard/app/pages/RulesMap.jsx +273 -273
  128. package/src/dashboard/app/pages/SkillsLibrary.jsx +366 -366
  129. package/src/dashboard/app/pages/Standards.jsx +332 -332
  130. package/src/dashboard/app/styles/index.css +47 -47
  131. package/src/dashboard/index.html +12 -12
  132. package/src/dashboard/package.json +24 -24
  133. package/src/dashboard/scanner/hooks-scanner.js +41 -41
  134. package/src/dashboard/scanner/phases-scanner.js +15 -15
  135. package/src/dashboard/scanner/rubrics-scanner.js +12 -12
  136. package/src/dashboard/scanner/rules-scanner.js +37 -37
  137. package/src/dashboard/scanner/skills-scanner.js +43 -43
  138. package/src/dashboard/scanner/squads-scanner.js +13 -13
  139. package/src/dashboard/scanner/standards-scanner.js +26 -26
  140. package/src/dashboard/vite-plugin-morph-data.js +17 -17
  141. package/src/dashboard/vite.config.js +24 -24
  142. package/src/lib/agents/metrics-aggregator.js +56 -56
  143. package/src/lib/agents/metrics-calculator.js +125 -125
  144. package/src/lib/agents/output-collector.js +73 -73
  145. package/src/lib/detectors/claude-config-detector.js +152 -152
  146. package/src/lib/detectors/design-system-detector.js +231 -231
  147. package/src/lib/detectors/index.js +217 -217
  148. package/src/lib/generators/architecture-scanner.js +639 -639
  149. package/src/lib/generators/design-system-generator.js +508 -508
  150. package/src/lib/generators/index.js +13 -13
  151. package/src/lib/generators/settings-generator.js +209 -209
  152. package/src/lib/hooks/hook-executor.js +167 -167
  153. package/src/lib/installers/mcp-installer.js +719 -719
  154. package/src/lib/tasks/task-classifier.js +30 -30
  155. package/src/lib/tasks/task-parser.js +209 -209
  156. package/src/lib/tasks/test-runner.js +81 -81
  157. package/src/lib/validators/architecture/architecture-validator.js +259 -259
  158. package/src/lib/validators/checkpoint-persistence.js +39 -39
  159. package/src/lib/validators/contracts/contract-compliance-validator.js +274 -274
  160. package/src/lib/validators/css/css-validator.js +340 -340
  161. package/src/lib/validators/packages/package-validator.js +347 -347
  162. package/src/lib/validators/shared/emit-validator-dispatch.js +14 -14
  163. package/src/lib/validators/shared/issue-counter.js +14 -14
  164. package/src/lib/validators/validation-runner.js +349 -349
  165. package/src/scripts/setup-infra.js +385 -385
  166. package/src/utils/agent-id-mapper.js +11 -11
  167. package/src/utils/claude-settings-manager.js +300 -300
  168. package/src/utils/skills-installer.js +174 -174
  169. package/src/utils/version-checker.js +2 -2
  170. package/framework/templates/.idea/morph-templates.xml +0 -92
  171. package/framework/templates/.vscode/morph-templates.code-snippets +0 -186
@@ -1,54 +1,54 @@
1
- // features/{{kebabCase featureName}}/hooks/use-{{kebabCase featureName}}s.ts
2
- import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
3
- import { z } from 'zod';
4
- import { {{camelCase featureName}}Schema } from '@/features/{{kebabCase featureName}}/types/{{kebabCase featureName}}.schemas';
5
- import type { Create{{pascalCase featureName}}Input } from '@/features/{{kebabCase featureName}}/types/{{kebabCase featureName}}.types';
6
-
7
- // ============================================
8
- // Query Key Factory
9
- // ============================================
10
-
11
- export const {{camelCase featureName}}Keys = {
12
- all: ['{{kebabCase featureName}}'] as const,
13
- lists: () => [...{{camelCase featureName}}Keys.all, 'list'] as const,
14
- detail: (id: string) => [...{{camelCase featureName}}Keys.all, 'detail', id] as const,
15
- };
16
-
17
- // ============================================
18
- // List Hook (TanStack Query v5 syntax)
19
- // ============================================
20
-
21
- const {{camelCase featureName}}ListSchema = z.array({{camelCase featureName}}Schema);
22
-
23
- export function use{{pascalCase featureName}}s() {
24
- return useQuery({
25
- queryKey: {{camelCase featureName}}Keys.lists(),
26
- queryFn: async () => {
27
- const res = await fetch('/api/{{kebabCase featureName}}');
28
- if (!res.ok) throw new Error('Failed to fetch {{featureName}}');
29
- return {{camelCase featureName}}ListSchema.parse(await res.json());
30
- },
31
- });
32
- }
33
-
34
- // ============================================
35
- // Create Mutation
36
- // ============================================
37
-
38
- export function useCreate{{pascalCase featureName}}() {
39
- const queryClient = useQueryClient();
40
- return useMutation({
41
- mutationFn: async (input: Create{{pascalCase featureName}}Input) => {
42
- const res = await fetch('/api/{{kebabCase featureName}}', {
43
- method: 'POST',
44
- headers: { 'Content-Type': 'application/json' },
45
- body: JSON.stringify(input),
46
- });
47
- if (!res.ok) throw new Error('Failed to create {{featureName}}');
48
- return res.json();
49
- },
50
- onSuccess: () => {
51
- queryClient.invalidateQueries({ queryKey: {{camelCase featureName}}Keys.lists() });
52
- },
53
- });
54
- }
1
+ // features/{{kebabCase featureName}}/hooks/use-{{kebabCase featureName}}s.ts
2
+ import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
3
+ import { z } from 'zod';
4
+ import { {{camelCase featureName}}Schema } from '@/features/{{kebabCase featureName}}/types/{{kebabCase featureName}}.schemas';
5
+ import type { Create{{pascalCase featureName}}Input } from '@/features/{{kebabCase featureName}}/types/{{kebabCase featureName}}.types';
6
+
7
+ // ============================================
8
+ // Query Key Factory
9
+ // ============================================
10
+
11
+ export const {{camelCase featureName}}Keys = {
12
+ all: ['{{kebabCase featureName}}'] as const,
13
+ lists: () => [...{{camelCase featureName}}Keys.all, 'list'] as const,
14
+ detail: (id: string) => [...{{camelCase featureName}}Keys.all, 'detail', id] as const,
15
+ };
16
+
17
+ // ============================================
18
+ // List Hook (TanStack Query v5 syntax)
19
+ // ============================================
20
+
21
+ const {{camelCase featureName}}ListSchema = z.array({{camelCase featureName}}Schema);
22
+
23
+ export function use{{pascalCase featureName}}s() {
24
+ return useQuery({
25
+ queryKey: {{camelCase featureName}}Keys.lists(),
26
+ queryFn: async () => {
27
+ const res = await fetch('/api/{{kebabCase featureName}}');
28
+ if (!res.ok) throw new Error('Failed to fetch {{featureName}}');
29
+ return {{camelCase featureName}}ListSchema.parse(await res.json());
30
+ },
31
+ });
32
+ }
33
+
34
+ // ============================================
35
+ // Create Mutation
36
+ // ============================================
37
+
38
+ export function useCreate{{pascalCase featureName}}() {
39
+ const queryClient = useQueryClient();
40
+ return useMutation({
41
+ mutationFn: async (input: Create{{pascalCase featureName}}Input) => {
42
+ const res = await fetch('/api/{{kebabCase featureName}}', {
43
+ method: 'POST',
44
+ headers: { 'Content-Type': 'application/json' },
45
+ body: JSON.stringify(input),
46
+ });
47
+ if (!res.ok) throw new Error('Failed to create {{featureName}}');
48
+ return res.json();
49
+ },
50
+ onSuccess: () => {
51
+ queryClient.invalidateQueries({ queryKey: {{camelCase featureName}}Keys.lists() });
52
+ },
53
+ });
54
+ }
@@ -1,58 +1,58 @@
1
- # Multi-stage Dockerfile for Next.js Production Build
2
- # Optimized for Next.js 15 with App Router
3
-
4
- FROM node:20-alpine AS base
5
-
6
- # Install dependencies only when needed
7
- FROM base AS deps
8
- RUN apk add --no-cache libc6-compat
9
- WORKDIR /app
10
-
11
- # Copy package files
12
- COPY package.json package-lock.json* ./
13
- RUN npm ci
14
-
15
- # Rebuild the source code only when needed
16
- FROM base AS builder
17
- WORKDIR /app
18
- COPY --from=deps /app/node_modules ./node_modules
19
- COPY . .
20
-
21
- # Set build-time environment variables
22
- ENV NEXT_TELEMETRY_DISABLED 1
23
-
24
- # Build Next.js application
25
- RUN npm run build
26
-
27
- # Production image, copy all the files and run next
28
- FROM base AS runner
29
- WORKDIR /app
30
-
31
- ENV NODE_ENV production
32
- ENV NEXT_TELEMETRY_DISABLED 1
33
-
34
- # Create nextjs user
35
- RUN addgroup --system --gid 1001 nodejs
36
- RUN adduser --system --uid 1001 nextjs
37
-
38
- # Copy built application
39
- COPY --from=builder /app/public ./public
40
-
41
- # Set the correct permission for prerender cache
42
- RUN mkdir .next
43
- RUN chown nextjs:nodejs .next
44
-
45
- # Automatically leverage output traces to reduce image size
46
- # https://nextjs.org/docs/advanced-features/output-file-tracing
47
- COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
48
- COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
49
-
50
- USER nextjs
51
-
52
- EXPOSE 3000
53
-
54
- ENV PORT 3000
55
- ENV HOSTNAME "0.0.0.0"
56
-
57
- # Run Next.js server
58
- CMD ["node", "server.js"]
1
+ # Multi-stage Dockerfile for Next.js Production Build
2
+ # Optimized for Next.js 15 with App Router
3
+
4
+ FROM node:20-alpine AS base
5
+
6
+ # Install dependencies only when needed
7
+ FROM base AS deps
8
+ RUN apk add --no-cache libc6-compat
9
+ WORKDIR /app
10
+
11
+ # Copy package files
12
+ COPY package.json package-lock.json* ./
13
+ RUN npm ci
14
+
15
+ # Rebuild the source code only when needed
16
+ FROM base AS builder
17
+ WORKDIR /app
18
+ COPY --from=deps /app/node_modules ./node_modules
19
+ COPY . .
20
+
21
+ # Set build-time environment variables
22
+ ENV NEXT_TELEMETRY_DISABLED 1
23
+
24
+ # Build Next.js application
25
+ RUN npm run build
26
+
27
+ # Production image, copy all the files and run next
28
+ FROM base AS runner
29
+ WORKDIR /app
30
+
31
+ ENV NODE_ENV production
32
+ ENV NEXT_TELEMETRY_DISABLED 1
33
+
34
+ # Create nextjs user
35
+ RUN addgroup --system --gid 1001 nodejs
36
+ RUN adduser --system --uid 1001 nextjs
37
+
38
+ # Copy built application
39
+ COPY --from=builder /app/public ./public
40
+
41
+ # Set the correct permission for prerender cache
42
+ RUN mkdir .next
43
+ RUN chown nextjs:nodejs .next
44
+
45
+ # Automatically leverage output traces to reduce image size
46
+ # https://nextjs.org/docs/advanced-features/output-file-tracing
47
+ COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
48
+ COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
49
+
50
+ USER nextjs
51
+
52
+ EXPOSE 3000
53
+
54
+ ENV PORT 3000
55
+ ENV HOSTNAME "0.0.0.0"
56
+
57
+ # Run Next.js server
58
+ CMD ["node", "server.js"]
@@ -1,50 +1,50 @@
1
- # Docker Compose for Local Development
2
- # Next.js + Neon 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
- - DATABASE_URL=${DATABASE_URL}
18
- volumes:
19
- - .:/app
20
- - /app/node_modules
21
- - /app/.next
22
- depends_on:
23
- - postgres
24
- networks:
25
- - app-network
26
-
27
- # PostgreSQL Database (Local development)
28
- postgres:
29
- image: postgres:15-alpine
30
- container_name: {{kebabCase FEATURE_NAME}}-postgres
31
- restart: unless-stopped
32
- ports:
33
- - "5432:5432"
34
- environment:
35
- POSTGRES_USER: postgres
36
- POSTGRES_PASSWORD: postgres
37
- POSTGRES_DB: {{snakeCase FEATURE_NAME}}
38
- volumes:
39
- - postgres-data:/var/lib/postgresql/data
40
- - ./migrations:/docker-entrypoint-initdb.d
41
- networks:
42
- - app-network
43
-
44
- volumes:
45
- postgres-data:
46
- driver: local
47
-
48
- networks:
49
- app-network:
50
- driver: bridge
1
+ # Docker Compose for Local Development
2
+ # Next.js + Neon 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
+ - DATABASE_URL=${DATABASE_URL}
18
+ volumes:
19
+ - .:/app
20
+ - /app/node_modules
21
+ - /app/.next
22
+ depends_on:
23
+ - postgres
24
+ networks:
25
+ - app-network
26
+
27
+ # PostgreSQL Database (Local development)
28
+ postgres:
29
+ image: postgres:15-alpine
30
+ container_name: {{kebabCase FEATURE_NAME}}-postgres
31
+ restart: unless-stopped
32
+ ports:
33
+ - "5432:5432"
34
+ environment:
35
+ POSTGRES_USER: postgres
36
+ POSTGRES_PASSWORD: postgres
37
+ POSTGRES_DB: {{snakeCase FEATURE_NAME}}
38
+ volumes:
39
+ - postgres-data:/var/lib/postgresql/data
40
+ - ./migrations:/docker-entrypoint-initdb.d
41
+ networks:
42
+ - app-network
43
+
44
+ volumes:
45
+ postgres-data:
46
+ driver: local
47
+
48
+ networks:
49
+ app-network:
50
+ driver: bridge
@@ -1,38 +1,38 @@
1
- # ============================================================
2
- # Dockerfile: .NET 10 API ({{titleCase FEATURE_NAME}})
3
- # Stack: Next.js + Neon + .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 + Neon + .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 + Neon
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 + Neon
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,56 +1,56 @@
1
- # GitHub Actions Templates for MORPH-SPEC
2
-
3
- > **Framework-Level CI/CD Templates for Coolify/Docker Deployments**
4
-
5
- ## Overview
6
-
7
- Reusable GitHub Actions workflows and composite actions for the **nextjs-neon** stack (Coolify/Docker deployment).
8
-
9
- **Key Features:**
10
- - Handlebars v2.0 templating with helpers
11
- - Composite actions for shared logic
12
- - Docker multi-stage builds (.NET API + Next.js Web)
13
- - Coolify deployment via SSH (no MCP/CLI exists — the Coolify API is not publicly exposed, so the runner SSHes into the VPS to trigger it)
14
-
15
- ---
16
-
17
- ## Structure
18
-
19
- ```
20
- infrastructure/github/
21
- ├── workflows/
22
- │ ├── dotnet-build.yml.hbs # .NET restore, build, test, coverage
23
- │ ├── docker-build-push.yml.hbs # Docker build & push to registry
24
- │ └── deploy-coolify.yml.hbs # Coolify deployment via SSH
25
- │
26
- └── actions/
27
- ├── docker-build-push/action.yml.hbs # Build & push Docker image
28
- └── health-check/action.yml.hbs # Poll health endpoint
29
- ```
30
-
31
- ## Workflows
32
-
33
- ### .NET Build (`dotnet-build.yml.hbs`)
34
- - Restore, build, test with coverage
35
- - Uploads test results and coverage artifacts
36
-
37
- ### Docker Build & Push (`docker-build-push.yml.hbs`)
38
- - Multi-stage Docker build
39
- - Push to container registry (GHCR or Docker Hub)
40
-
41
- ### Deploy Coolify (`deploy-coolify.yml.hbs`)
42
- - SSHes into the VPS and calls the local Coolify API (`localhost:8000/api/v1/deploy?uuid=...`) after Docker push
43
- - Runs health check after deployment
44
- - Supports staging + production environments
45
-
46
- ## Usage
47
-
48
- Templates are rendered during `morph-spec init` based on project stack configuration.
49
-
50
- ```bash
51
- morph-spec init --stack nextjs-neon
52
- ```
53
-
54
- ---
55
-
56
- *MORPH-SPEC by Polymorphism Tech*
1
+ # GitHub Actions Templates for MORPH-SPEC
2
+
3
+ > **Framework-Level CI/CD Templates for Coolify/Docker Deployments**
4
+
5
+ ## Overview
6
+
7
+ Reusable GitHub Actions workflows and composite actions for the **nextjs-neon** stack (Coolify/Docker deployment).
8
+
9
+ **Key Features:**
10
+ - Handlebars v2.0 templating with helpers
11
+ - Composite actions for shared logic
12
+ - Docker multi-stage builds (.NET API + Next.js Web)
13
+ - Coolify deployment via SSH (no MCP/CLI exists — the Coolify API is not publicly exposed, so the runner SSHes into the VPS to trigger it)
14
+
15
+ ---
16
+
17
+ ## Structure
18
+
19
+ ```
20
+ infrastructure/github/
21
+ ├── workflows/
22
+ │ ├── dotnet-build.yml.hbs # .NET restore, build, test, coverage
23
+ │ ├── docker-build-push.yml.hbs # Docker build & push to registry
24
+ │ └── deploy-coolify.yml.hbs # Coolify deployment via SSH
25
+ │
26
+ └── actions/
27
+ ├── docker-build-push/action.yml.hbs # Build & push Docker image
28
+ └── health-check/action.yml.hbs # Poll health endpoint
29
+ ```
30
+
31
+ ## Workflows
32
+
33
+ ### .NET Build (`dotnet-build.yml.hbs`)
34
+ - Restore, build, test with coverage
35
+ - Uploads test results and coverage artifacts
36
+
37
+ ### Docker Build & Push (`docker-build-push.yml.hbs`)
38
+ - Multi-stage Docker build
39
+ - Push to container registry (GHCR or Docker Hub)
40
+
41
+ ### Deploy Coolify (`deploy-coolify.yml.hbs`)
42
+ - SSHes into the VPS and calls the local Coolify API (`localhost:8000/api/v1/deploy?uuid=...`) after Docker push
43
+ - Runs health check after deployment
44
+ - Supports staging + production environments
45
+
46
+ ## Usage
47
+
48
+ Templates are rendered during `morph-spec init` based on project stack configuration.
49
+
50
+ ```bash
51
+ morph-spec init --stack nextjs-neon
52
+ ```
53
+
54
+ ---
55
+
56
+ *MORPH-SPEC by Polymorphism Tech*