@polymorphism-tech/morph-spec 8.44.0 → 8.46.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (199) hide show
  1. package/CLAUDE.md +11 -9
  2. package/README.md +10 -10
  3. package/bin/morph-spec.js +11 -13
  4. package/bin/validate.js +379 -379
  5. package/claude-plugin.json +1 -1
  6. package/docs/CHEATSHEET.md +2 -4
  7. package/docs/QUICKSTART.md +6 -6
  8. package/framework/CLAUDE.md +6 -8
  9. package/framework/MORPH.md +39 -45
  10. package/framework/agents.json +8 -9
  11. package/framework/commands/morph-apply.md +1 -3
  12. package/framework/commands/morph-hotfix.md +1 -1
  13. package/framework/commands/morph-proposal.md +2 -2
  14. package/framework/docs/CLI.md +15 -14
  15. package/framework/evals/review-checklist.md +90 -0
  16. package/framework/evals/trace-schema.md +2 -12
  17. package/framework/hooks/README.md +2 -3
  18. package/framework/hooks/claude-code/core/heavy-gate.js +1 -1
  19. package/framework/hooks/claude-code/core/protect-spec-files.js +2 -2
  20. package/framework/hooks/claude-code/core/telemetry-log.js +2 -2
  21. package/framework/hooks/claude-code/core/trace-autogen.js +1 -22
  22. package/framework/hooks/claude-code/core/validate-completion.js +3 -56
  23. package/framework/hooks/claude-code/statusline.sh +11 -11
  24. package/framework/hooks/git/commit-msg/conventional-commits.sh +33 -33
  25. package/framework/hooks/git/pre-commit/agents.sh +25 -25
  26. package/framework/hooks/git/pre-commit/orchestrator.sh +64 -64
  27. package/framework/hooks/git/pre-commit/specs.sh +50 -50
  28. package/framework/hooks/git/pre-push/run-tests.sh +44 -44
  29. package/framework/hooks/shared/build-check.js +1 -1
  30. package/framework/hooks/shared/comment-scanner.js +1 -1
  31. package/framework/hooks/shared/phase-utils.js +0 -5
  32. package/framework/hooks/shared/stdin-reader.js +26 -26
  33. package/framework/phases.json +4 -6
  34. package/framework/rubrics/backend.json +1 -1
  35. package/framework/rubrics/default.json +1 -1
  36. package/framework/rubrics/frontend.json +1 -1
  37. package/framework/rules/morph-workflow.md +6 -6
  38. package/framework/schemas/config.schema.json +4 -0
  39. package/framework/schemas/feature.schema.json +5 -29
  40. package/framework/schemas/tasks.schema.json +6 -2
  41. package/framework/skills/README.md +1 -2
  42. package/framework/skills/core/create-umbraco-lp/SKILL.md +1 -1
  43. package/framework/skills/core/migrate-lp-to-umbraco/SKILL.md +1 -1
  44. package/framework/skills/core/morph-apply/SKILL.md +145 -246
  45. package/framework/skills/core/morph-brainstorming/SKILL.md +1 -1
  46. package/framework/skills/core/morph-hotfix/SKILL.md +5 -3
  47. package/framework/skills/core/morph-implement/SKILL.md +101 -201
  48. package/framework/skills/core/morph-machine/SKILL.md +3 -3
  49. package/framework/skills/core/morph-media/SKILL.md +1 -1
  50. package/framework/skills/core/morph-plan/SKILL.md +171 -287
  51. package/framework/skills/core/morph-proposal/SKILL.md +4 -5
  52. package/framework/skills/core/morph-review/SKILL.md +122 -430
  53. package/framework/skills/core/morph-stack-scan/SKILL.md +1 -1
  54. package/framework/skills/core/morph-standards/SKILL.md +2 -2
  55. package/framework/skills/core/morph-uiux/SKILL.md +2 -3
  56. package/framework/standards/STANDARDS.json +10 -10
  57. package/framework/standards/ai-agents/agent-archetypes.md +1 -1
  58. package/framework/standards/ai-agents/agent-session.md +1 -1
  59. package/framework/standards/ai-agents/agent-spec.md +1 -1
  60. package/framework/standards/ai-agents/batching.md +1 -1
  61. package/framework/standards/ai-agents/context-providers.md +1 -1
  62. package/framework/standards/ai-agents/conversational-agent-with-phases.md +1 -1
  63. package/framework/standards/ai-agents/cost-and-budget.md +1 -1
  64. package/framework/standards/ai-agents/durable-workflows-hitl.md +1 -1
  65. package/framework/standards/ai-agents/guardrails.md +1 -1
  66. package/framework/standards/ai-agents/llm-runtime-defaults.md +1 -1
  67. package/framework/standards/ai-agents/mcp-server.md +1 -1
  68. package/framework/standards/ai-agents/mcp-tools.md +1 -1
  69. package/framework/standards/ai-agents/media-pipeline.md +1 -1
  70. package/framework/standards/ai-agents/media-video.md +1 -1
  71. package/framework/standards/ai-agents/middleware-patterns.md +1 -1
  72. package/framework/standards/ai-agents/modalities-image-gen.md +1 -1
  73. package/framework/standards/ai-agents/modalities-speech-to-text.md +1 -1
  74. package/framework/standards/ai-agents/modalities-text-to-speech.md +1 -1
  75. package/framework/standards/ai-agents/modalities-vision.md +1 -1
  76. package/framework/standards/ai-agents/multi-agent-patterns.md +1 -1
  77. package/framework/standards/ai-agents/observability-patterns.md +3 -3
  78. package/framework/standards/ai-agents/production.md +2 -2
  79. package/framework/standards/ai-agents/prompt-sources.md +1 -1
  80. package/framework/standards/ai-agents/providers/model-registry.md +1 -1
  81. package/framework/standards/ai-agents/rag-custom-pgvector.md +1 -1
  82. package/framework/standards/ai-agents/service-tier-flex.md +1 -1
  83. package/framework/standards/ai-agents/setup.md +1 -1
  84. package/framework/standards/ai-agents/structured-output.md +1 -1
  85. package/framework/standards/ai-agents/sweet-spot.md +1 -1
  86. package/framework/standards/ai-agents/testing-ai.md +1 -1
  87. package/framework/standards/ai-agents/tool-adapters.md +1 -1
  88. package/framework/standards/ai-agents/vector-data-extensions.md +1 -1
  89. package/framework/standards/ai-agents/workflows.md +1 -1
  90. package/framework/templates/CLAUDE.md.core.template +1 -1
  91. package/framework/templates/IDE-SNIPPETS.md +262 -262
  92. package/framework/templates/README.md +1 -1
  93. package/framework/templates/REGISTRY.json +0 -81
  94. package/framework/templates/code/dotnet/abstractions/api-endpoint.cs +7 -7
  95. package/framework/templates/code/dotnet/feature/endpoint.cs.hbs +21 -21
  96. package/framework/templates/code/dotnet/feature/request.cs.hbs +4 -4
  97. package/framework/templates/code/dotnet/feature/response.cs.hbs +4 -4
  98. package/framework/templates/code/sql/ai-agents/pgvector-embeddings-migration.sql.template +91 -91
  99. package/framework/templates/docs/spec.md +19 -205
  100. package/framework/templates/docs/ui-components.md +52 -52
  101. package/framework/templates/docs/ui-design-system.md +76 -76
  102. package/framework/templates/docs/ui-flows.md +167 -167
  103. package/framework/templates/frontend/nextjs/client-component.tsx.hbs +26 -26
  104. package/framework/templates/frontend/nextjs/feature-form.tsx.hbs +56 -56
  105. package/framework/templates/frontend/nextjs/tsconfig.json.hbs +26 -26
  106. package/framework/templates/infrastructure/docker/Dockerfile.template +58 -58
  107. package/framework/templates/infrastructure/docker/dockerfile-api.dockerfile +38 -38
  108. package/framework/templates/infrastructure/docker/dockerfile-web.dockerfile +48 -48
  109. package/framework/templates/infrastructure/github/README.md +56 -56
  110. package/framework/templates/infrastructure/github/actions/docker-build-push/action.yml.hbs +45 -45
  111. package/framework/templates/infrastructure/github/actions/health-check/action.yml.hbs +27 -27
  112. package/framework/templates/infrastructure/github/workflows/docker-build-push.yml.hbs +59 -59
  113. package/framework/templates/infrastructure/github/workflows/dotnet-build.yml.hbs +39 -39
  114. package/framework/templates/meta-prompts/fusion/fusion-agent.md +76 -76
  115. package/framework/templates/meta-prompts/fusion/fusion-aggregator.md +100 -100
  116. package/framework/templates/meta-prompts/validators/pre-commit-validator.md +95 -95
  117. package/framework/templates/state.template.json +17 -17
  118. package/framework/templates/ui/design-system.css +226 -226
  119. package/package.json +2 -2
  120. package/src/commands/e2e/e2e.js +1 -1
  121. package/src/commands/project/heavy.js +1 -1
  122. package/src/commands/project/status.js +3 -3
  123. package/src/commands/state/approve.js +7 -49
  124. package/src/commands/state/gate-check.js +16 -106
  125. package/src/commands/state/gate-decision.js +1 -1
  126. package/src/commands/state/report-check.js +42 -17
  127. package/src/commands/validation/mutate.js +1 -1
  128. package/src/commands/validation/scout-check.js +28 -0
  129. package/src/commands/validation/validate-feature.js +5 -32
  130. package/src/commands/validation/verify.js +98 -48
  131. package/src/core/paths/output-schema.js +0 -2
  132. package/src/core/state/state-manager.js +1 -2
  133. package/src/core/templates/template-renderer.js +477 -477
  134. package/src/dashboard/app/lib/format.js +5 -0
  135. package/src/dashboard/app/main.jsx +13 -13
  136. package/src/dashboard/app/pages/FeatureDetail.jsx +16 -22
  137. package/src/dashboard/app/pages/Features.jsx +7 -7
  138. package/src/dashboard/app/pages/PhasePipeline.jsx +1 -1
  139. package/src/dashboard/app/pages/Rubrics.jsx +7 -11
  140. package/src/dashboard/scanner/docs-scanner.js +1 -2
  141. package/src/dashboard/scanner/features-scanner.js +3 -4
  142. package/src/dashboard/scanner/rubrics-scanner.js +12 -12
  143. package/src/dashboard/vite.config.js +24 -24
  144. package/src/lib/agents/output-collector.js +0 -1
  145. package/src/lib/ci/ci-verify.js +118 -0
  146. package/src/lib/ci/github-ci.js +192 -0
  147. package/src/lib/ci/workflow-scaffold.js +122 -0
  148. package/src/lib/detectors/design-system-detector.js +188 -188
  149. package/src/lib/evaluator-report.js +52 -334
  150. package/src/lib/generators/design-system-generator.js +508 -508
  151. package/src/lib/generators/handoff-generator.js +4 -5
  152. package/src/lib/installers/memory-installer.js +2 -2
  153. package/src/lib/mutation/manifest.js +8 -2
  154. package/src/lib/mutation/report.js +5 -3
  155. package/src/lib/mutation/runner.js +9 -7
  156. package/src/lib/risk-detector.js +60 -122
  157. package/src/lib/scout/scout-check.js +293 -0
  158. package/src/lib/tasks/task-classifier.js +30 -30
  159. package/src/lib/tasks/task-parser.js +209 -209
  160. package/src/lib/tasks/tasks-json-parser.js +7 -5
  161. package/src/lib/tasks/test-nodes.js +1 -1
  162. package/src/lib/tasks/test-runner.js +1 -1
  163. package/src/lib/telemetry/verify-event.js +3 -2
  164. package/src/lib/validators/css/css-validator.js +340 -340
  165. package/src/lib/validators/reuse/reuse-validator.js +6 -8
  166. package/src/lib/validators/verify-runner.js +1 -1
  167. package/src/scripts/setup-infra.js +1 -1
  168. package/src/utils/agent-id-mapper.js +11 -11
  169. package/src/utils/agents-installer.js +5 -9
  170. package/src/utils/claude-settings-manager.js +300 -300
  171. package/src/utils/hooks-installer.js +3 -10
  172. package/src/utils/skills-installer.js +1 -1
  173. package/framework/evals/proof-rubrics/README.md +0 -76
  174. package/framework/evals/proof-rubrics/eval-de-modelo.md +0 -80
  175. package/framework/evals/proof-rubrics/fiacao.md +0 -54
  176. package/framework/evals/proof-rubrics/guard-cego.md +0 -52
  177. package/framework/evals/proof-rubrics/media-claims.md +0 -109
  178. package/framework/evals/proof-rubrics/mutation-proof.md +0 -107
  179. package/framework/evals/proof-rubrics/observabilidade-genai.md +0 -119
  180. package/framework/evals/proof-rubrics/verde-nao-e-coberto.md +0 -48
  181. package/framework/evals/rubrics/README.md +0 -45
  182. package/framework/evals/rubrics/architecture.md +0 -103
  183. package/framework/evals/rubrics/code-quality.md +0 -98
  184. package/framework/evals/rubrics/condensed.md +0 -57
  185. package/framework/evals/rubrics/contracts.md +0 -67
  186. package/framework/evals/rubrics/test-coverage.md +0 -99
  187. package/framework/evals/scenarios/dotnet-crud.yaml +0 -42
  188. package/framework/evals/scenarios/nextjs-auth.yaml +0 -38
  189. package/framework/evals/suites/standard.yaml +0 -5
  190. package/framework/hooks/claude-code/__pycache__/statusline.cpython-313.pyc +0 -0
  191. package/framework/hooks/claude-code/core/post-edit-typecheck.js +0 -127
  192. package/framework/skills/core/morph-eval/SKILL.md +0 -64
  193. package/framework/templates/.idea/morph-templates.xml +0 -92
  194. package/framework/templates/.vscode/morph-templates.code-snippets +0 -186
  195. package/framework/templates/docs/clarifications.md +0 -253
  196. package/framework/templates/docs/onboarding.md +0 -122
  197. package/framework/templates/docs/schema-analysis.md +0 -119
  198. package/framework/templates/docs/user-stories.md +0 -34
  199. package/src/commands/state/score.js +0 -147
@@ -1,26 +1,26 @@
1
- {
2
- "compilerOptions": {
3
- "target": "ES2022",
4
- "lib": ["dom", "dom.iterable", "esnext"],
5
- "allowJs": false,
6
- "skipLibCheck": true,
7
- "strict": true,
8
- "noUncheckedIndexedAccess": true,
9
- "noImplicitOverride": true,
10
- "forceConsistentCasingInFileNames": true,
11
- "noEmit": true,
12
- "esModuleInterop": true,
13
- "module": "esnext",
14
- "moduleResolution": "bundler",
15
- "resolveJsonModule": true,
16
- "isolatedModules": true,
17
- "jsx": "preserve",
18
- "incremental": true,
19
- "plugins": [{ "name": "next" }],
20
- "paths": {
21
- "@/*": ["./src/*"]
22
- }
23
- },
24
- "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
25
- "exclude": ["node_modules"]
26
- }
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "lib": ["dom", "dom.iterable", "esnext"],
5
+ "allowJs": false,
6
+ "skipLibCheck": true,
7
+ "strict": true,
8
+ "noUncheckedIndexedAccess": true,
9
+ "noImplicitOverride": true,
10
+ "forceConsistentCasingInFileNames": true,
11
+ "noEmit": true,
12
+ "esModuleInterop": true,
13
+ "module": "esnext",
14
+ "moduleResolution": "bundler",
15
+ "resolveJsonModule": true,
16
+ "isolatedModules": true,
17
+ "jsx": "preserve",
18
+ "incremental": true,
19
+ "plugins": [{ "name": "next" }],
20
+ "paths": {
21
+ "@/*": ["./src/*"]
22
+ }
23
+ },
24
+ "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
25
+ "exclude": ["node_modules"]
26
+ }
@@ -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,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*
@@ -1,45 +1,45 @@
1
- name: 'Build & Push Docker Image'
2
- description: 'Build multi-stage Docker image and push to registry'
3
- inputs:
4
- registry:
5
- description: 'Docker registry URL'
6
- required: true
7
- image-name:
8
- description: 'Docker image name'
9
- required: true
10
- dockerfile-path:
11
- description: 'Path to Dockerfile'
12
- required: false
13
- default: 'Dockerfile'
14
- build-context:
15
- description: 'Docker build context'
16
- required: false
17
- default: '.'
18
- outputs:
19
- image-tag:
20
- description: 'Full image tag with registry'
21
- value: ${{{{ steps.build.outputs.tags }}}}
22
-
23
- runs:
24
- using: 'composite'
25
- steps:
26
- - name: Set up Docker Buildx
27
- uses: docker/setup-buildx-action@v3
28
-
29
- - name: Login to Registry
30
- uses: docker/login-action@v3
31
- with:
32
- registry: ${{{{ inputs.registry }}}}
33
- username: ${{{{ secrets.REGISTRY_USERNAME }}}}
34
- password: ${{{{ secrets.REGISTRY_PASSWORD }}}}
35
-
36
- - name: Build and push
37
- id: build
38
- uses: docker/build-push-action@v5
39
- with:
40
- context: ${{{{ inputs.build-context }}}}
41
- file: ${{{{ inputs.dockerfile-path }}}}
42
- push: true
43
- tags: ${{{{ inputs.registry }}}}/${{{{ inputs.image-name }}}}:${{{{ github.sha }}}}
44
- cache-from: type=gha
45
- cache-to: type=gha,mode=max
1
+ name: 'Build & Push Docker Image'
2
+ description: 'Build multi-stage Docker image and push to registry'
3
+ inputs:
4
+ registry:
5
+ description: 'Docker registry URL'
6
+ required: true
7
+ image-name:
8
+ description: 'Docker image name'
9
+ required: true
10
+ dockerfile-path:
11
+ description: 'Path to Dockerfile'
12
+ required: false
13
+ default: 'Dockerfile'
14
+ build-context:
15
+ description: 'Docker build context'
16
+ required: false
17
+ default: '.'
18
+ outputs:
19
+ image-tag:
20
+ description: 'Full image tag with registry'
21
+ value: ${{{{ steps.build.outputs.tags }}}}
22
+
23
+ runs:
24
+ using: 'composite'
25
+ steps:
26
+ - name: Set up Docker Buildx
27
+ uses: docker/setup-buildx-action@v3
28
+
29
+ - name: Login to Registry
30
+ uses: docker/login-action@v3
31
+ with:
32
+ registry: ${{{{ inputs.registry }}}}
33
+ username: ${{{{ secrets.REGISTRY_USERNAME }}}}
34
+ password: ${{{{ secrets.REGISTRY_PASSWORD }}}}
35
+
36
+ - name: Build and push
37
+ id: build
38
+ uses: docker/build-push-action@v5
39
+ with:
40
+ context: ${{{{ inputs.build-context }}}}
41
+ file: ${{{{ inputs.dockerfile-path }}}}
42
+ push: true
43
+ tags: ${{{{ inputs.registry }}}}/${{{{ inputs.image-name }}}}:${{{{ github.sha }}}}
44
+ cache-from: type=gha
45
+ cache-to: type=gha,mode=max
@@ -1,27 +1,27 @@
1
- name: 'Health Check'
2
- description: 'Poll health endpoint until ready'
3
- inputs:
4
- url:
5
- description: 'Health check URL'
6
- required: true
7
- timeout:
8
- description: 'Timeout in seconds'
9
- required: false
10
- default: '300'
11
- interval:
12
- description: 'Polling interval in seconds'
13
- required: false
14
- default: '5'
15
-
16
- runs:
17
- using: 'composite'
18
- steps:
19
- - name: Wait for health
20
- shell: bash
21
- run: |
22
- RETRIES=$(($${{{{ inputs.timeout }}}} / ${{{{ inputs.interval }}}}))
23
- curl --retry $RETRIES \
24
- --retry-delay ${{{{ inputs.interval }}}} \
25
- --retry-connrefused \
26
- --fail \
27
- ${{{{ inputs.url }}}}
1
+ name: 'Health Check'
2
+ description: 'Poll health endpoint until ready'
3
+ inputs:
4
+ url:
5
+ description: 'Health check URL'
6
+ required: true
7
+ timeout:
8
+ description: 'Timeout in seconds'
9
+ required: false
10
+ default: '300'
11
+ interval:
12
+ description: 'Polling interval in seconds'
13
+ required: false
14
+ default: '5'
15
+
16
+ runs:
17
+ using: 'composite'
18
+ steps:
19
+ - name: Wait for health
20
+ shell: bash
21
+ run: |
22
+ RETRIES=$(($${{{{ inputs.timeout }}}} / ${{{{ inputs.interval }}}}))
23
+ curl --retry $RETRIES \
24
+ --retry-delay ${{{{ inputs.interval }}}} \
25
+ --retry-connrefused \
26
+ --fail \
27
+ ${{{{ inputs.url }}}}