@polymorphism-tech/morph-spec 7.7.3 → 7.8.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.
Files changed (187) hide show
  1. package/README.md +2 -2
  2. package/bin/validate.js +379 -379
  3. package/claude-plugin.json +1 -1
  4. package/docs/CHEATSHEET.md +1 -1
  5. package/docs/QUICKSTART.md +1 -1
  6. package/framework/CLAUDE.md +1 -1
  7. package/framework/MORPH.md +3 -2
  8. package/framework/agents.json +1 -1
  9. package/framework/commands/commit.md +166 -166
  10. package/framework/commands/morph-infra.md +215 -215
  11. package/framework/commands/morph-preflight.md +205 -205
  12. package/framework/commands/morph-troubleshoot.md +124 -124
  13. package/framework/evals/scenarios/dotnet-crud.yaml +1 -1
  14. package/framework/hooks/claude-code/statusline.py +679 -679
  15. package/framework/hooks/claude-code/statusline.sh +11 -11
  16. package/framework/hooks/git/commit-msg/conventional-commits.sh +33 -33
  17. package/framework/hooks/git/pre-commit/agents.sh +25 -25
  18. package/framework/hooks/git/pre-commit/orchestrator.sh +64 -64
  19. package/framework/hooks/git/pre-commit/specs.sh +50 -50
  20. package/framework/hooks/git/pre-push/run-tests.sh +44 -44
  21. package/framework/hooks/shared/activity-logger.js +160 -160
  22. package/framework/hooks/shared/hook-response.js +45 -45
  23. package/framework/hooks/shared/payload-utils.js +78 -78
  24. package/framework/hooks/shared/stdin-reader.js +26 -26
  25. package/framework/rubrics/backend.json +41 -41
  26. package/framework/rules/ai-agents-standards.md +45 -45
  27. package/framework/rules/dotnet-templates.md +86 -87
  28. package/framework/rules/frontend-standards.md +13 -13
  29. package/framework/rules/infrastructure-standards.md +27 -27
  30. package/framework/rules/neon-standards.md +25 -25
  31. package/framework/rules/nextjs-standards.md +20 -20
  32. package/framework/rules/nextjs-templates.md +40 -40
  33. package/framework/skills/core/create-umbraco-lp/SKILL.md +1 -1
  34. package/framework/skills/core/migrate-lp-to-umbraco/SKILL.md +1 -1
  35. package/framework/skills/core/morph-apply/SKILL.md +1 -1
  36. package/framework/skills/core/morph-brainstorming/SKILL.md +9 -5
  37. package/framework/skills/core/morph-eval/SKILL.md +1 -1
  38. package/framework/skills/core/morph-implement/SKILL.md +1 -1
  39. package/framework/skills/core/morph-plan/SKILL.md +11 -6
  40. package/framework/skills/core/morph-proposal/SKILL.md +1 -1
  41. package/framework/skills/core/morph-review/SKILL.md +13 -7
  42. package/framework/skills/core/morph-stack-scan/SKILL.md +5 -5
  43. package/framework/skills/core/morph-standards/SKILL.md +1 -1
  44. package/framework/standards/STANDARDS.json +1 -1
  45. package/framework/standards/ai-agents/agent-session.md +160 -160
  46. package/framework/standards/ai-agents/batching.md +193 -193
  47. package/framework/standards/ai-agents/context-providers.md +188 -188
  48. package/framework/standards/ai-agents/mcp-server.md +250 -250
  49. package/framework/standards/ai-agents/mcp-tools.md +197 -197
  50. package/framework/standards/ai-agents/middleware-patterns.md +207 -207
  51. package/framework/standards/ai-agents/modalities-image-gen.md +173 -173
  52. package/framework/standards/ai-agents/modalities-speech-to-text.md +171 -171
  53. package/framework/standards/ai-agents/modalities-text-to-speech.md +181 -181
  54. package/framework/standards/ai-agents/modalities-vision.md +201 -201
  55. package/framework/standards/ai-agents/multi-agent-patterns.md +155 -155
  56. package/framework/standards/ai-agents/production.md +275 -275
  57. package/framework/standards/ai-agents/prompts-in-db.md +214 -214
  58. package/framework/standards/ai-agents/providers/model-registry.md +158 -158
  59. package/framework/standards/ai-agents/service-tier-flex.md +135 -135
  60. package/framework/standards/ai-agents/structured-output.md +249 -249
  61. package/framework/standards/ai-agents/sweet-spot.md +109 -109
  62. package/framework/standards/architecture/vertical-slice/vertical-slice.md +34 -35
  63. package/framework/standards/backend/api/validation.md +2 -2
  64. package/framework/standards/backend/dotnet/scrutor.md +1 -3
  65. package/framework/standards/backend/dotnet/vsa-handler-patterns.md +42 -37
  66. package/framework/standards/data/nosql/cache/redis.md +2 -2
  67. package/framework/templates/CLAUDE.md.core.template +1 -1
  68. package/framework/templates/IDE-SNIPPETS.md +262 -262
  69. package/framework/templates/README.md +0 -1
  70. package/framework/templates/REGISTRY.json +0 -21
  71. package/framework/templates/code/dotnet/abstractions/api-endpoint.cs +7 -7
  72. package/framework/templates/code/dotnet/abstractions/handler.cs +0 -3
  73. package/framework/templates/code/dotnet/ai-agents/AgentBootstrap.cs.template +39 -39
  74. package/framework/templates/code/dotnet/ai-agents/EmbeddingService.cs.template +68 -68
  75. package/framework/templates/code/dotnet/ai-agents/ModelRegistry.cs.template +117 -117
  76. package/framework/templates/code/dotnet/ai-agents/PromptRepository.cs.template +95 -95
  77. package/framework/templates/code/dotnet/ai-agents/ResilientToolMiddleware.cs.template +61 -61
  78. package/framework/templates/code/dotnet/ai-agents/VectorSearchTool.cs.template +107 -107
  79. package/framework/templates/code/dotnet/ai-agents/model-registry.json.template +58 -58
  80. package/framework/templates/code/dotnet/constants/api-tags.cs +1 -1
  81. package/framework/templates/code/dotnet/contracts/contracts-vsa.cs +281 -282
  82. package/framework/templates/code/dotnet/database/migration.cs +83 -83
  83. package/framework/templates/code/dotnet/feature/endpoint.cs.hbs +21 -21
  84. package/framework/templates/code/dotnet/feature/handler.cs.hbs +23 -24
  85. package/framework/templates/code/dotnet/feature/request.cs.hbs +4 -4
  86. package/framework/templates/code/dotnet/feature/response.cs.hbs +4 -4
  87. package/framework/templates/code/dotnet/feature/validator.cs.hbs +15 -15
  88. package/framework/templates/code/dotnet/jobs/job.cs +15 -15
  89. package/framework/templates/code/dotnet/test.cs +72 -101
  90. package/framework/templates/code/sql/ai-agents/agent-prompts-migration.sql.template +58 -58
  91. package/framework/templates/code/sql/ai-agents/pgvector-embeddings-migration.sql.template +91 -91
  92. package/framework/templates/code/typescript/contracts.ts +167 -167
  93. package/framework/templates/docs/clarifications.md +253 -253
  94. package/framework/templates/docs/schema-analysis.md +119 -119
  95. package/framework/templates/docs/ui-components.md +52 -52
  96. package/framework/templates/docs/ui-design-system.md +76 -76
  97. package/framework/templates/docs/ui-flows.md +167 -167
  98. package/framework/templates/docs/ui-mockups.md +98 -98
  99. package/framework/templates/feature/decisions.md +122 -122
  100. package/framework/templates/frontend/nextjs/Dockerfile.nextjs.hbs +43 -43
  101. package/framework/templates/frontend/nextjs/client-component.tsx.hbs +26 -26
  102. package/framework/templates/frontend/nextjs/env.mjs.hbs +32 -32
  103. package/framework/templates/frontend/nextjs/feature-form.tsx.hbs +56 -56
  104. package/framework/templates/frontend/nextjs/page.tsx.hbs +22 -22
  105. package/framework/templates/frontend/nextjs/tsconfig.json.hbs +26 -26
  106. package/framework/templates/frontend/nextjs/use-feature.ts.hbs +54 -54
  107. package/framework/templates/infrastructure/docker/Dockerfile.template +58 -58
  108. package/framework/templates/infrastructure/docker/docker-compose.template.yml +50 -50
  109. package/framework/templates/infrastructure/docker/dockerfile-api.dockerfile +38 -38
  110. package/framework/templates/infrastructure/docker/dockerfile-web.dockerfile +48 -48
  111. package/framework/templates/infrastructure/github/README.md +56 -56
  112. package/framework/templates/infrastructure/github/actions/docker-build-push/action.yml.hbs +45 -45
  113. package/framework/templates/infrastructure/github/actions/health-check/action.yml.hbs +27 -27
  114. package/framework/templates/infrastructure/github/workflows/docker-build-push.yml.hbs +59 -59
  115. package/framework/templates/infrastructure/github/workflows/dotnet-build.yml.hbs +39 -39
  116. package/framework/templates/integrations/asaas-client.cs +387 -387
  117. package/framework/templates/integrations/asaas-webhook.cs +351 -351
  118. package/framework/templates/meta-prompts/fusion/fusion-agent.md +76 -76
  119. package/framework/templates/meta-prompts/fusion/fusion-aggregator.md +100 -100
  120. package/framework/templates/meta-prompts/parallel-workers/parallel-coordinator.md +113 -113
  121. package/framework/templates/meta-prompts/validators/pre-commit-validator.md +95 -95
  122. package/framework/templates/project/validate.js +120 -120
  123. package/framework/templates/state.template.json +17 -17
  124. package/framework/templates/ui/design-system.css +226 -226
  125. package/package.json +1 -1
  126. package/src/commands/dashboard/dashboard.js +53 -53
  127. package/src/commands/index.js +13 -13
  128. package/src/commands/mcp/mcp-setup.js +519 -519
  129. package/src/commands/project/checkpoint.js +209 -209
  130. package/src/commands/project/update.js +7 -4
  131. package/src/core/state/phase-state-machine.js +197 -197
  132. package/src/core/templates/template-renderer.js +477 -477
  133. package/src/dashboard/app/components/DetailPanel.jsx +11 -11
  134. package/src/dashboard/app/components/FlowGraph.jsx +17 -17
  135. package/src/dashboard/app/components/SearchFilter.jsx +22 -22
  136. package/src/dashboard/app/hooks/useDetailPanel.js +15 -15
  137. package/src/dashboard/app/main.jsx +13 -13
  138. package/src/dashboard/app/pages/AgentMap.jsx +370 -370
  139. package/src/dashboard/app/pages/HookInspector.jsx +418 -418
  140. package/src/dashboard/app/pages/LiveState.jsx +239 -239
  141. package/src/dashboard/app/pages/PhasePipeline.jsx +408 -408
  142. package/src/dashboard/app/pages/RulesMap.jsx +273 -273
  143. package/src/dashboard/app/pages/SkillsLibrary.jsx +366 -366
  144. package/src/dashboard/app/pages/Standards.jsx +332 -332
  145. package/src/dashboard/app/styles/index.css +47 -47
  146. package/src/dashboard/index.html +12 -12
  147. package/src/dashboard/package.json +24 -24
  148. package/src/dashboard/scanner/hooks-scanner.js +41 -41
  149. package/src/dashboard/scanner/phases-scanner.js +15 -15
  150. package/src/dashboard/scanner/rubrics-scanner.js +12 -12
  151. package/src/dashboard/scanner/rules-scanner.js +37 -37
  152. package/src/dashboard/scanner/skills-scanner.js +43 -43
  153. package/src/dashboard/scanner/squads-scanner.js +13 -13
  154. package/src/dashboard/scanner/standards-scanner.js +26 -26
  155. package/src/dashboard/vite-plugin-morph-data.js +17 -17
  156. package/src/dashboard/vite.config.js +24 -24
  157. package/src/lib/agents/metrics-aggregator.js +56 -56
  158. package/src/lib/agents/metrics-calculator.js +125 -125
  159. package/src/lib/agents/output-collector.js +73 -73
  160. package/src/lib/detectors/claude-config-detector.js +152 -152
  161. package/src/lib/detectors/design-system-detector.js +231 -231
  162. package/src/lib/detectors/index.js +217 -217
  163. package/src/lib/generators/architecture-scanner.js +639 -639
  164. package/src/lib/generators/design-system-generator.js +508 -508
  165. package/src/lib/generators/index.js +13 -13
  166. package/src/lib/generators/settings-generator.js +209 -209
  167. package/src/lib/hooks/hook-executor.js +167 -167
  168. package/src/lib/installers/mcp-installer.js +719 -719
  169. package/src/lib/tasks/task-classifier.js +30 -30
  170. package/src/lib/tasks/task-parser.js +209 -209
  171. package/src/lib/tasks/test-runner.js +81 -81
  172. package/src/lib/validators/architecture/architecture-validator.js +259 -259
  173. package/src/lib/validators/checkpoint-persistence.js +39 -39
  174. package/src/lib/validators/contracts/contract-compliance-validator.js +274 -274
  175. package/src/lib/validators/css/css-validator.js +340 -340
  176. package/src/lib/validators/packages/package-validator.js +347 -347
  177. package/src/lib/validators/shared/emit-validator-dispatch.js +14 -14
  178. package/src/lib/validators/shared/issue-counter.js +14 -14
  179. package/src/lib/validators/validation-runner.js +349 -349
  180. package/src/scripts/setup-infra.js +383 -383
  181. package/src/utils/agent-id-mapper.js +11 -11
  182. package/src/utils/banner.js +52 -43
  183. package/src/utils/claude-settings-manager.js +300 -300
  184. package/src/utils/skills-installer.js +172 -172
  185. package/framework/templates/.idea/morph-templates.xml +0 -92
  186. package/framework/templates/.vscode/morph-templates.code-snippets +0 -186
  187. package/framework/templates/code/dotnet/backend/repository.cs +0 -141
@@ -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*