create-win-project 1.4.0 → 2.0.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 (99) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +54 -147
  3. package/checks/check-compatibility.js +37 -8
  4. package/checks/check-generated-project.js +27 -3
  5. package/checks/check-library.js +13 -3
  6. package/checks/check-package.js +15 -0
  7. package/checks/classify-changes.js +5 -15
  8. package/checks/run-compatibility-shard.js +21 -0
  9. package/docs/README.md +20 -0
  10. package/docs/capabilities.md +13 -0
  11. package/docs/compatibility.md +13 -0
  12. package/docs/generated-project.md +12 -0
  13. package/docs/getting-started.md +26 -0
  14. package/docs/{ARCHITECTURE.md → maintainers/architecture.md} +3 -3
  15. package/docs/maintainers/ci-strategy.md +46 -0
  16. package/docs/{CONTRIBUTING.md → maintainers/contributing.md} +7 -7
  17. package/docs/migration-v2.md +13 -0
  18. package/docs/production-contract.md +24 -0
  19. package/library/INDEX.md +1 -1
  20. package/library/compatibility-impact.json +14 -0
  21. package/library/development-tools/devops/makefile/commands.md +11 -0
  22. package/library/development-tools/devops/makefile/definition.json +2 -2
  23. package/library/development-tools/devops/makefile/docker.md +9 -0
  24. package/library/development-tools/devops/makefile/validation.md +5 -0
  25. package/library/features/sqlalchemy-alembic.md +17 -0
  26. package/library/optional-features/concerns/zod/errors.md +5 -0
  27. package/library/optional-features/concerns/zod/testing.md +5 -0
  28. package/library/optional-features/concerns/zod/validation.md +21 -0
  29. package/library/optional-features/styling/css-modules/definition.json +3 -2
  30. package/library/optional-features/styling/css-modules/responsive.md +5 -0
  31. package/library/optional-features/styling/css-modules/theme.md +7 -0
  32. package/library/stacks/expo/definition.json +2 -2
  33. package/library/stacks/fastapi/architecture.md +40 -0
  34. package/library/stacks/fastapi/definition.json +39 -0
  35. package/library/stacks/fastapi/runtime.md +25 -0
  36. package/library/stacks/fastapi/security.md +26 -0
  37. package/library/stacks/fastapi/structure.md +27 -0
  38. package/library/stacks/fastapi/testing.md +23 -0
  39. package/library/stacks/nextjs/definition.json +2 -2
  40. package/library/stacks/no-frontend/definition.json +1 -1
  41. package/library/stacks/react-vite/definition.json +2 -2
  42. package/library/tested-versions.json +42 -2
  43. package/library/universal/coding-rules/definition.json +3 -3
  44. package/library/universal/coding-rules/hygiene.md +9 -0
  45. package/library/universal/coding-rules/naming.md +17 -0
  46. package/library/universal/git-conventions/branches.md +5 -0
  47. package/library/universal/git-conventions/commits.md +7 -0
  48. package/library/universal/git-conventions/definition.json +4 -2
  49. package/library/universal/git-conventions/workflow.md +5 -0
  50. package/library/universal/typescript/boundaries.md +13 -0
  51. package/library/universal/typescript/definition.json +3 -3
  52. package/library/universal/typescript/errors.md +5 -0
  53. package/library/universal/typescript/patterns.md +7 -0
  54. package/package.json +4 -6
  55. package/src/cli/arguments.js +11 -0
  56. package/src/cli/main.js +18 -0
  57. package/src/cli/questions.js +16 -15
  58. package/src/cli/system-check.js +22 -2
  59. package/src/engine/load-library.js +3 -2
  60. package/src/engine/project-files.js +10 -1
  61. package/src/engine/project-guidance.js +2 -1
  62. package/src/engine/project-shapes.js +4 -4
  63. package/src/engine/render-templates.js +3 -0
  64. package/src/engine/tested-versions.js +21 -2
  65. package/src/engine/upgrade-report.js +20 -0
  66. package/src/stacks/available-stacks.js +2 -0
  67. package/src/stacks/backends/fastapi/ci.js +3 -0
  68. package/src/stacks/backends/fastapi/create-files.js +874 -0
  69. package/src/stacks/backends/fastapi/docker.js +75 -0
  70. package/src/stacks/backends/fastapi/environment.js +3 -0
  71. package/src/stacks/backends/fastapi/index.js +32 -0
  72. package/src/stacks/compose-files.js +19 -1
  73. package/src/stacks/create-project.js +128 -7
  74. package/src/stacks/frontends/nextjs/index.js +1 -1
  75. package/src/stacks/frontends/react-native/create-files.js +4 -1
  76. package/src/stacks/frontends/react-native/environment.js +1 -1
  77. package/src/stacks/frontends/react-native/index.js +1 -1
  78. package/src/stacks/frontends/react-vite/environment.js +1 -1
  79. package/src/stacks/frontends/react-vite/index.js +1 -1
  80. package/src/stacks/shared/capability-packs.js +31 -0
  81. package/src/stacks/shared/environment.js +12 -4
  82. package/src/stacks/shared/javascript-package.js +6 -0
  83. package/templates/ci/fastapi.yml +62 -0
  84. package/templates/docker/compose-prod/fastapi.yml +52 -0
  85. package/templates/docker/compose-prod/springboot.yml +19 -1
  86. package/templates/docker/dockerfile/fastapi.dev.dockerfile +9 -0
  87. package/templates/docker/dockerfile/fastapi.prod.dockerfile +11 -0
  88. package/templates/docker/dockerfile/nextjs.prod.dockerfile +1 -0
  89. package/templates/docker/dockerfile/springboot.prod.dockerfile +4 -1
  90. package/templates/docker/dockerfile/vite.prod.dockerfile +2 -1
  91. package/templates/makefile/fastapi.mk +97 -0
  92. package/library/development-tools/devops/makefile/makefile.md +0 -556
  93. package/library/optional-features/concerns/zod.md +0 -174
  94. package/library/optional-features/styling/css-modules/css-modules-extensions.md +0 -267
  95. package/library/universal/coding-rules/coding-rules.md +0 -281
  96. package/library/universal/git-conventions/git-conventions.md +0 -186
  97. package/library/universal/typescript/typescript.md +0 -272
  98. /package/docs/{CONTENT_MODEL.md → maintainers/content-model.md} +0 -0
  99. /package/docs/{DEPENDENCY_MAINTENANCE.md → maintainers/dependencies.md} +0 -0
@@ -0,0 +1,62 @@
1
+ name: CI — Backend
2
+
3
+ on:
4
+ push:
5
+ branches: [dev, main]
6
+ paths:
7
+ - backend/**
8
+ pull_request:
9
+ branches: [dev, main]
10
+ paths:
11
+ - backend/**
12
+
13
+ permissions:
14
+ contents: read
15
+
16
+ jobs:
17
+ ci-backend:
18
+ name: Test, Build
19
+ runs-on: ubuntu-latest
20
+ defaults:
21
+ run:
22
+ working-directory: backend
23
+ services:
24
+ postgres:
25
+ image: {{POSTGRES_IMAGE}}
26
+ env:
27
+ POSTGRES_DB: app_test
28
+ POSTGRES_USER: postgres
29
+ POSTGRES_PASSWORD: postgres
30
+ ports:
31
+ - 5432:5432
32
+ options: >-
33
+ --health-cmd "pg_isready -U postgres -d app_test"
34
+ --health-interval 5s
35
+ --health-timeout 5s
36
+ --health-retries 10
37
+ env:
38
+ DATABASE_URL: postgresql+asyncpg://postgres:postgres@127.0.0.1:5432/app_test
39
+ steps:
40
+ - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
41
+ - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5
42
+ with:
43
+ python-version: "{{PYTHON_VERSION}}"
44
+ - uses: astral-sh/setup-uv@38f3f104447c67c051c4a08e39b64a148898af3a # v6
45
+ with:
46
+ version: "{{UV_VERSION}}"
47
+ - name: Install dependencies
48
+ run: uv sync --frozen
49
+ - name: Apply migrations
50
+ run: uv run alembic upgrade head
51
+ - name: Check migrations are current
52
+ run: uv run alembic check
53
+ - name: Run Ruff
54
+ run: uv run ruff check .
55
+ - name: Check formatting
56
+ run: uv run ruff format --check .
57
+ - name: Run mypy
58
+ run: uv run mypy .
59
+ - name: Run tests
60
+ run: uv run pytest
61
+ - name: Build image
62
+ run: docker build -f Dockerfile .
@@ -0,0 +1,52 @@
1
+ # docker-compose.prod.yml — {{PROJECT_NAME}} ({{STACK}}) — Prod
2
+ services:
3
+
4
+ backend:
5
+ container_name: {{PROJECT_NAME}}-backend
6
+ build:
7
+ context: ./backend
8
+ dockerfile: Dockerfile
9
+ ports:
10
+ - "${BACKEND_HOST_PORT:-8000}:8000"
11
+ environment:
12
+ - DATABASE_URL=${DATABASE_URL}
13
+ - OIDC_ISSUER=${OIDC_ISSUER}
14
+ - OIDC_AUDIENCE=${OIDC_AUDIENCE}
15
+ - OIDC_ALGORITHMS=${OIDC_ALGORITHMS}
16
+ - OIDC_JWKS_URL=${OIDC_JWKS_URL}
17
+ - CORS_ALLOWED_ORIGINS=${CORS_ALLOWED_ORIGINS}
18
+ depends_on:
19
+ db:
20
+ condition: service_healthy
21
+ networks:
22
+ - app-network
23
+ healthcheck:
24
+ test: ["CMD-SHELL", "python -c \"import urllib.request; urllib.request.urlopen('http://localhost:8000/health')\""]
25
+ interval: 30s
26
+ timeout: 5s
27
+ retries: 3
28
+
29
+ db:
30
+ container_name: {{PROJECT_NAME}}-db
31
+ image: {{POSTGRES_IMAGE}}
32
+ environment:
33
+ - POSTGRES_USER=${POSTGRES_USER}
34
+ - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
35
+ - POSTGRES_DB=${POSTGRES_DB}
36
+ volumes:
37
+ - postgres-data:/var/lib/postgresql/data
38
+ networks:
39
+ - app-network
40
+ healthcheck:
41
+ test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
42
+ interval: 10s
43
+ timeout: 5s
44
+ retries: 5
45
+
46
+ volumes:
47
+ postgres-data:
48
+ name: {{PROJECT_NAME}}-postgres-data
49
+
50
+ networks:
51
+ app-network:
52
+ name: {{PROJECT_NAME}}-network
@@ -16,6 +16,11 @@ services:
16
16
  networks:
17
17
  - app-network
18
18
  restart: always
19
+ read_only: true
20
+ tmpfs: [/tmp]
21
+ deploy:
22
+ resources:
23
+ limits: { cpus: "1.0", memory: 512M }
19
24
 
20
25
  backend:
21
26
  container_name: {{PROJECT_NAME}}-backend-prod
@@ -35,7 +40,17 @@ services:
35
40
  condition: service_healthy
36
41
  networks:
37
42
  - app-network
43
+ - data-network
38
44
  restart: always
45
+ stop_grace_period: 30s
46
+ healthcheck:
47
+ test: ["CMD", "wget", "-qO-", "http://localhost:8080/api/health"]
48
+ interval: 10s
49
+ timeout: 3s
50
+ retries: 5
51
+ deploy:
52
+ resources:
53
+ limits: { cpus: "1.0", memory: 768M }
39
54
 
40
55
  db:
41
56
  container_name: {{PROJECT_NAME}}-db-prod
@@ -47,7 +62,7 @@ services:
47
62
  volumes:
48
63
  - postgres-data-prod:/var/lib/postgresql/data
49
64
  networks:
50
- - app-network
65
+ - data-network
51
66
  restart: always
52
67
  healthcheck:
53
68
  test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
@@ -62,3 +77,6 @@ volumes:
62
77
  networks:
63
78
  app-network:
64
79
  name: {{PROJECT_NAME}}-network-prod
80
+ data-network:
81
+ name: {{PROJECT_NAME}}-data-network-prod
82
+ internal: true
@@ -0,0 +1,9 @@
1
+ FROM {{PYTHON_IMAGE}}
2
+ WORKDIR /app
3
+ COPY --from=ghcr.io/astral-sh/uv:{{UV_VERSION}} /uv /usr/local/bin/uv
4
+ COPY pyproject.toml uv.lock .python-version README.md ./
5
+ RUN uv sync --frozen --no-install-project
6
+ COPY . .
7
+ RUN uv sync --frozen
8
+ EXPOSE 8000
9
+ CMD ["uv", "run", "uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000", "--reload"]
@@ -0,0 +1,11 @@
1
+ FROM {{PYTHON_IMAGE}}
2
+ WORKDIR /app
3
+ COPY --from=ghcr.io/astral-sh/uv:{{UV_VERSION}} /uv /usr/local/bin/uv
4
+ COPY pyproject.toml uv.lock .python-version README.md ./
5
+ RUN uv sync --frozen --no-install-project
6
+ COPY . .
7
+ RUN uv sync --frozen
8
+ RUN useradd --create-home --no-log-init appuser && chown -R appuser:appuser /app
9
+ EXPOSE 8000
10
+ USER appuser
11
+ CMD ["/app/.venv/bin/uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]
@@ -11,6 +11,7 @@ RUN npm run build
11
11
  FROM {{NODE_IMAGE}} AS production
12
12
  WORKDIR /app
13
13
  ENV NODE_ENV=production
14
+ USER node
14
15
  COPY --from=builder /app/.next/standalone ./
15
16
  COPY --from=builder /app/.next/static ./.next/static
16
17
  COPY --from=builder /app/public ./public
@@ -5,6 +5,9 @@ RUN mvn --batch-mode package -DskipTests
5
5
 
6
6
  FROM {{JAVA_IMAGE}} AS production
7
7
  WORKDIR /app
8
+ RUN addgroup -S app && adduser -S -G app app
8
9
  COPY --from=builder /app/target/*.jar app.jar
10
+ RUN chown app:app app.jar
11
+ USER app
9
12
  EXPOSE 8080
10
- CMD ["java", "-jar", "app.jar"]
13
+ CMD ["java", "-XX:MaxRAMPercentage=75", "-jar", "app.jar"]
@@ -8,5 +8,6 @@ RUN npm run build
8
8
  FROM {{NGINX_IMAGE}} AS production
9
9
  COPY --from=builder /app/dist /usr/share/nginx/html
10
10
  COPY nginx.conf /etc/nginx/conf.d/default.conf
11
- EXPOSE 80
11
+ USER nginx
12
+ EXPOSE 8080
12
13
  CMD ["nginx", "-g", "daemon off;"]
@@ -0,0 +1,97 @@
1
+ # =============================================================================
2
+ # Makefile — {{PROJECT_NAME}}
3
+ # =============================================================================
4
+
5
+ # Variables
6
+ COMPOSE := docker compose
7
+ BACKEND := $(COMPOSE) exec backend
8
+ DB := $(COMPOSE) exec db
9
+ WORKDIR := $(PWD)
10
+
11
+ # =============================================================================
12
+ # Default
13
+ # =============================================================================
14
+
15
+ .DEFAULT_GOAL := help
16
+
17
+ .PHONY: help
18
+ help: ## Show all available commands
19
+ @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) \
20
+ | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-20s\033[0m %s\n", $$1, $$2}'
21
+
22
+ # =============================================================================
23
+ # Project Lifecycle
24
+ # =============================================================================
25
+
26
+ .PHONY: dev up down restart logs logs-back clean
27
+
28
+ dev: ## Start all containers and follow logs
29
+ $(COMPOSE) up --build
30
+
31
+ up: ## Start all containers in background
32
+ $(COMPOSE) up -d --build
33
+
34
+ down: ## Stop and remove all containers
35
+ $(COMPOSE) down
36
+
37
+ restart: down up ## Stop then start all containers
38
+
39
+ logs: ## Follow logs from all containers
40
+ $(COMPOSE) logs -f
41
+
42
+ logs-back: ## Follow backend logs only
43
+ $(COMPOSE) logs -f backend
44
+
45
+ clean: ## Remove containers, volumes, orphans (full reset)
46
+ $(COMPOSE) down -v --remove-orphans
47
+
48
+ # =============================================================================
49
+ # Database
50
+ # =============================================================================
51
+
52
+ .PHONY: migrate db-shell
53
+
54
+ migrate: ## Run pending Alembic migrations
55
+ $(BACKEND) uv run alembic upgrade head
56
+
57
+ db-shell: ## Open psql shell inside DB container
58
+ $(DB) psql -U $${POSTGRES_USER} -d $${POSTGRES_DB}
59
+
60
+ # =============================================================================
61
+ # Shells
62
+ # =============================================================================
63
+
64
+ .PHONY: shell-back
65
+
66
+ shell-back: ## Open shell inside backend container
67
+ $(BACKEND) sh
68
+
69
+ # =============================================================================
70
+ # Quality
71
+ # =============================================================================
72
+
73
+ .PHONY: lint test test-back
74
+
75
+ lint: ## Run Ruff check and format check (backend)
76
+ $(BACKEND) uv run ruff check .
77
+ $(BACKEND) uv run ruff format --check .
78
+
79
+ test: test-back ## Run all tests
80
+
81
+ test-back: ## Run pytest (backend)
82
+ $(BACKEND) uv run pytest
83
+
84
+ # =============================================================================
85
+ # Production
86
+ # =============================================================================
87
+
88
+ .PHONY: build prod-up prod-down
89
+
90
+ build: ## Build production Docker images
91
+ $(COMPOSE) -f docker-compose.prod.yml build
92
+
93
+ prod-up: ## Start production stack
94
+ $(COMPOSE) -f docker-compose.prod.yml up -d --build
95
+
96
+ prod-down: ## Stop production stack
97
+ $(COMPOSE) -f docker-compose.prod.yml down