@hybridlabor-api/aos 4.7.2 → 4.9.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 (166) hide show
  1. package/.agents/agents.md +1 -1
  2. package/.agents/nodes.json +1 -1
  3. package/.agents/vendor-manifest.json +23 -1
  4. package/.claude/agents/godmode-media-eventtech.md +1 -1
  5. package/.claude/hooks/conventional-commits.mjs +125 -0
  6. package/.claude/hooks/env-file-protection.mjs +105 -0
  7. package/.claude/hooks/go-gate.mjs +101 -81
  8. package/.claude/settings.json +13 -0
  9. package/.opencode/agents/godmode-media-eventtech.md +1 -1
  10. package/.opencode/plugins/bdb-aos.js +31 -4
  11. package/README.de.md +1 -1
  12. package/README.md +1 -1
  13. package/README.pt.md +1 -1
  14. package/THIRD_PARTY_NOTICES.md +88 -0
  15. package/docs/skills_table.md +1 -1
  16. package/installer.js +309 -101
  17. package/package.json +6 -2
  18. package/packages/aos-cli/README.md +80 -0
  19. package/packages/aos-cli/bin/aos-cli.mjs +134 -0
  20. package/packages/aos-cli/core-skills.json +12 -0
  21. package/packages/aos-cli/extensions/aos.ts +321 -0
  22. package/packages/aos-cli/package-lock.json +1923 -0
  23. package/packages/aos-cli/package.json +29 -0
  24. package/packages/aos-cli/scripts/check-theme.mjs +63 -0
  25. package/packages/aos-cli/themes/aos.json +97 -0
  26. package/scripts/build-plugin-manifest.mjs +131 -0
  27. package/scripts/validate-skills.mjs +81 -6
  28. package/skills/basic/ao-orchestrator/SKILL.md +116 -0
  29. package/skills/global_config/agenttrail/SKILL.md +6 -1
  30. package/skills/global_config/ask-tim/SKILL.md +4 -4
  31. package/skills/global_config/bash-script-generator/SKILL.md +201 -0
  32. package/skills/global_config/bash-script-generator/assets/templates/standard-template.sh +96 -0
  33. package/skills/global_config/bash-script-generator/docs/bash-scripting-guide.md +729 -0
  34. package/skills/global_config/bash-script-generator/docs/generation-best-practices.md +193 -0
  35. package/skills/global_config/bash-script-generator/docs/script-patterns.md +566 -0
  36. package/skills/global_config/bash-script-generator/docs/text-processing-guide.md +437 -0
  37. package/skills/global_config/bash-script-generator/examples/log-analyzer.sh +92 -0
  38. package/skills/global_config/bash-script-generator/scripts/generate_script_template.sh +123 -0
  39. package/skills/global_config/bash-script-generator/scripts/run_ci_checks.sh +172 -0
  40. package/skills/global_config/bash-script-generator/scripts/test_generator.sh +413 -0
  41. package/skills/global_config/bash-script-validator/SKILL.md +249 -0
  42. package/skills/global_config/bash-script-validator/docs/awk-reference.md +449 -0
  43. package/skills/global_config/bash-script-validator/docs/bash-reference.md +468 -0
  44. package/skills/global_config/bash-script-validator/docs/common-mistakes.md +623 -0
  45. package/skills/global_config/bash-script-validator/docs/grep-reference.md +395 -0
  46. package/skills/global_config/bash-script-validator/docs/regex-reference.md +391 -0
  47. package/skills/global_config/bash-script-validator/docs/sed-reference.md +454 -0
  48. package/skills/global_config/bash-script-validator/docs/shell-reference.md +463 -0
  49. package/skills/global_config/bash-script-validator/docs/shellcheck-reference.md +399 -0
  50. package/skills/global_config/bash-script-validator/examples/bad-bash.sh +55 -0
  51. package/skills/global_config/bash-script-validator/examples/bad-shell.sh +54 -0
  52. package/skills/global_config/bash-script-validator/examples/good-bash.sh +71 -0
  53. package/skills/global_config/bash-script-validator/examples/good-shell.sh +69 -0
  54. package/skills/global_config/bash-script-validator/scripts/run_ci_checks.sh +23 -0
  55. package/skills/global_config/bash-script-validator/scripts/shellcheck_wrapper.sh +174 -0
  56. package/skills/global_config/bash-script-validator/scripts/test_validate.sh +446 -0
  57. package/skills/global_config/bash-script-validator/scripts/validate.sh +512 -0
  58. package/skills/global_config/ci-pipeline/SKILL.md +135 -0
  59. package/skills/global_config/dispatching-parallel-agents/SKILL.md +170 -0
  60. package/skills/global_config/dockerfile-generator/SKILL.md +1038 -0
  61. package/skills/global_config/dockerfile-generator/examples/example.dockerignore +95 -0
  62. package/skills/global_config/dockerfile-generator/examples/golang-distroless.Dockerfile +34 -0
  63. package/skills/global_config/dockerfile-generator/examples/java-springboot.Dockerfile +45 -0
  64. package/skills/global_config/dockerfile-generator/examples/nextjs-production.Dockerfile +49 -0
  65. package/skills/global_config/dockerfile-generator/examples/nodejs-multistage.Dockerfile +55 -0
  66. package/skills/global_config/dockerfile-generator/examples/python-fastapi.Dockerfile +48 -0
  67. package/skills/global_config/dockerfile-generator/references/language_specific_guides.md +510 -0
  68. package/skills/global_config/dockerfile-generator/references/multistage_builds.md +570 -0
  69. package/skills/global_config/dockerfile-generator/references/optimization_patterns.md +492 -0
  70. package/skills/global_config/dockerfile-generator/references/security_best_practices.md +375 -0
  71. package/skills/global_config/dockerfile-generator/scripts/generate_dockerignore.sh +199 -0
  72. package/skills/global_config/dockerfile-generator/scripts/generate_golang.sh +172 -0
  73. package/skills/global_config/dockerfile-generator/scripts/generate_java.sh +185 -0
  74. package/skills/global_config/dockerfile-generator/scripts/generate_nodejs.sh +279 -0
  75. package/skills/global_config/dockerfile-generator/scripts/generate_python.sh +218 -0
  76. package/skills/global_config/dockerfile-generator/scripts/test_generator.sh +210 -0
  77. package/skills/global_config/dockerfile-validator/SKILL.md +300 -0
  78. package/skills/global_config/dockerfile-validator/examples/.dockerignore.example +34 -0
  79. package/skills/global_config/dockerfile-validator/examples/bad-example.Dockerfile +37 -0
  80. package/skills/global_config/dockerfile-validator/examples/golang-distroless.Dockerfile +50 -0
  81. package/skills/global_config/dockerfile-validator/examples/good-example.Dockerfile +52 -0
  82. package/skills/global_config/dockerfile-validator/examples/python-optimized.Dockerfile +53 -0
  83. package/skills/global_config/dockerfile-validator/examples/security-issues.Dockerfile +42 -0
  84. package/skills/global_config/dockerfile-validator/references/docker_best_practices.md +348 -0
  85. package/skills/global_config/dockerfile-validator/references/optimization_guide.md +473 -0
  86. package/skills/global_config/dockerfile-validator/references/security_checklist.md +208 -0
  87. package/skills/global_config/dockerfile-validator/scripts/dockerfile-validate.sh +699 -0
  88. package/skills/global_config/dockerfile-validator/scripts/test_validate.sh +35 -0
  89. package/skills/global_config/dockerfile-validator/tests/fixtures/copy-before-yarn-lock-read.Dockerfile +6 -0
  90. package/skills/global_config/dockerfile-validator/tests/fixtures/copy-before-yarn.Dockerfile +6 -0
  91. package/skills/global_config/dockerfile-validator/tests/fixtures/from-platform-nonroot.Dockerfile +7 -0
  92. package/skills/global_config/dockerfile-validator/tests/test_regression.sh +164 -0
  93. package/skills/global_config/finishing-a-development-branch/SKILL.md +228 -0
  94. package/skills/global_config/github-actions-generator/SKILL.md +353 -0
  95. package/skills/global_config/github-actions-generator/assets/templates/action/composite/action.yml +82 -0
  96. package/skills/global_config/github-actions-generator/assets/templates/action/docker/Dockerfile +25 -0
  97. package/skills/global_config/github-actions-generator/assets/templates/action/docker/action.yml +42 -0
  98. package/skills/global_config/github-actions-generator/assets/templates/action/docker/entrypoint.sh +27 -0
  99. package/skills/global_config/github-actions-generator/assets/templates/action/javascript/action.yml +33 -0
  100. package/skills/global_config/github-actions-generator/assets/templates/action/javascript/index.js +50 -0
  101. package/skills/global_config/github-actions-generator/assets/templates/action/javascript/package.json +27 -0
  102. package/skills/global_config/github-actions-generator/assets/templates/workflow/basic_workflow.yml +242 -0
  103. package/skills/global_config/github-actions-generator/assets/templates/workflow/reusable_workflow.yml +106 -0
  104. package/skills/global_config/github-actions-generator/examples/README.md +147 -0
  105. package/skills/global_config/github-actions-generator/examples/actions/setup-node-cached/action.yml +93 -0
  106. package/skills/global_config/github-actions-generator/examples/caching/docker-buildkit.yml +256 -0
  107. package/skills/global_config/github-actions-generator/examples/security/dependency-review.yml +62 -0
  108. package/skills/global_config/github-actions-generator/examples/security/sbom-attestation.yml +119 -0
  109. package/skills/global_config/github-actions-generator/examples/triggers/chatops-commands.yml +475 -0
  110. package/skills/global_config/github-actions-generator/examples/triggers/repository-dispatch.yml +418 -0
  111. package/skills/global_config/github-actions-generator/examples/triggers/workflow-orchestration.yml +404 -0
  112. package/skills/global_config/github-actions-generator/examples/workflows/docker-build-push.yml +68 -0
  113. package/skills/global_config/github-actions-generator/examples/workflows/go-ci.yml +161 -0
  114. package/skills/global_config/github-actions-generator/examples/workflows/monorepo-ci.yml +340 -0
  115. package/skills/global_config/github-actions-generator/examples/workflows/multi-environment-deploy.yml +406 -0
  116. package/skills/global_config/github-actions-generator/examples/workflows/nodejs-ci.yml +122 -0
  117. package/skills/global_config/github-actions-generator/examples/workflows/python-ci.yml +157 -0
  118. package/skills/global_config/github-actions-generator/examples/workflows/scheduled-tasks.yml +376 -0
  119. package/skills/global_config/github-actions-generator/references/advanced-triggers.md +917 -0
  120. package/skills/global_config/github-actions-generator/references/best-practices.md +755 -0
  121. package/skills/global_config/github-actions-generator/references/common-actions.md +715 -0
  122. package/skills/global_config/github-actions-generator/references/custom-actions.md +320 -0
  123. package/skills/global_config/github-actions-generator/references/expressions-and-contexts.md +688 -0
  124. package/skills/global_config/github-actions-generator/references/modern-features.md +421 -0
  125. package/skills/global_config/github-actions-generator/scripts/test_generator.sh +344 -0
  126. package/skills/global_config/github-actions-templates/SKILL.md +7 -0
  127. package/skills/global_config/github-actions-validator/SKILL.md +576 -0
  128. package/skills/global_config/github-actions-validator/examples/README.md +88 -0
  129. package/skills/global_config/github-actions-validator/examples/outdated-versions.yml +76 -0
  130. package/skills/global_config/github-actions-validator/examples/valid-ci.yml +79 -0
  131. package/skills/global_config/github-actions-validator/examples/with-errors.yml +47 -0
  132. package/skills/global_config/github-actions-validator/references/act_usage.md +233 -0
  133. package/skills/global_config/github-actions-validator/references/action_versions.md +122 -0
  134. package/skills/global_config/github-actions-validator/references/actionlint_usage.md +343 -0
  135. package/skills/global_config/github-actions-validator/references/common_errors.md +512 -0
  136. package/skills/global_config/github-actions-validator/references/modern_features.md +384 -0
  137. package/skills/global_config/github-actions-validator/references/runners.md +317 -0
  138. package/skills/global_config/github-actions-validator/scripts/install_tools.sh +113 -0
  139. package/skills/global_config/github-actions-validator/scripts/validate_workflow.sh +910 -0
  140. package/skills/global_config/github-actions-validator/tests/test_validate_workflow.sh +237 -0
  141. package/skills/global_config/makefile-generator/SKILL.md +614 -0
  142. package/skills/global_config/makefile-generator/assets/templates/.gitkeep +1 -0
  143. package/skills/global_config/makefile-generator/docs/makefile-structure.md +530 -0
  144. package/skills/global_config/makefile-generator/docs/optimization-guide.md +784 -0
  145. package/skills/global_config/makefile-generator/docs/patterns-guide.md +642 -0
  146. package/skills/global_config/makefile-generator/docs/security-guide.md +361 -0
  147. package/skills/global_config/makefile-generator/docs/targets-guide.md +642 -0
  148. package/skills/global_config/makefile-generator/docs/variables-guide.md +596 -0
  149. package/skills/global_config/makefile-generator/scripts/add_standard_targets.sh +539 -0
  150. package/skills/global_config/makefile-generator/scripts/generate_makefile_template.sh +690 -0
  151. package/skills/global_config/makefile-generator/test/test_helper_scripts.sh +190 -0
  152. package/skills/global_config/makefile-validator/SKILL.md +244 -0
  153. package/skills/global_config/makefile-validator/docs/bake-tool.md +1000 -0
  154. package/skills/global_config/makefile-validator/docs/best-practices.md +858 -0
  155. package/skills/global_config/makefile-validator/docs/common-mistakes.md +944 -0
  156. package/skills/global_config/makefile-validator/examples/bad-makefile.mk +77 -0
  157. package/skills/global_config/makefile-validator/examples/good-makefile.mk +103 -0
  158. package/skills/global_config/makefile-validator/scripts/test_validate.sh +382 -0
  159. package/skills/global_config/makefile-validator/scripts/validate_makefile.sh +712 -0
  160. package/skills/global_config/{MCP_Manage → mcp-manage}/SKILL.md +3 -3
  161. package/skills/global_config/requesting-code-review/SKILL.md +98 -0
  162. package/skills/global_config/requesting-code-review/code-reviewer.md +198 -0
  163. package/skills/global_config/using-git-worktrees/SKILL.md +170 -0
  164. package/skills/global_config/verification-before-completion/SKILL.md +123 -0
  165. package/skills/global_config/writing-plans/SKILL.md +126 -46
  166. package/skills/global_config/writing-plans-legacy/SKILL.md +139 -0
@@ -0,0 +1,95 @@
1
+ # Git
2
+ .git
3
+ .gitignore
4
+ .gitattributes
5
+
6
+ # CI/CD
7
+ .github
8
+ .gitlab-ci.yml
9
+ .travis.yml
10
+ .circleci
11
+ Jenkinsfile
12
+
13
+ # Documentation
14
+ README.md
15
+ CHANGELOG.md
16
+ CONTRIBUTING.md
17
+ LICENSE
18
+ *.md
19
+ docs/
20
+
21
+ # Docker
22
+ Dockerfile*
23
+ docker-compose*.yml
24
+ .dockerignore
25
+
26
+ # Environment
27
+ .env
28
+ .env.*
29
+ *.local
30
+ .envrc
31
+
32
+ # Logs
33
+ logs/
34
+ *.log
35
+ npm-debug.log*
36
+ yarn-debug.log*
37
+ yarn-error.log*
38
+
39
+ # IDE
40
+ .vscode/
41
+ .idea/
42
+ *.swp
43
+ *.swo
44
+ *~
45
+ .DS_Store
46
+ *.iml
47
+
48
+ # Testing
49
+ coverage/
50
+ .coverage
51
+ test-results/
52
+ *.test
53
+ .pytest_cache/
54
+ .tox/
55
+
56
+ # Node.js
57
+ node_modules/
58
+ .npm
59
+ .yarn
60
+ .pnp.*
61
+
62
+ # Python
63
+ __pycache__/
64
+ *.py[cod]
65
+ *$py.class
66
+ *.so
67
+ .Python
68
+ venv/
69
+ .venv/
70
+ env/
71
+ ENV/
72
+ pip-log.txt
73
+ *.egg-info/
74
+
75
+ # Go
76
+ vendor/
77
+ *.exe
78
+ *.out
79
+ go.work
80
+ go.work.sum
81
+
82
+ # Java
83
+ *.class
84
+ *.jar
85
+ *.war
86
+ *.ear
87
+ .gradle/
88
+ .mvn/
89
+ !.mvn/wrapper/maven-wrapper.jar
90
+
91
+ # Build artifacts (covers all languages)
92
+ dist/
93
+ build/
94
+ target/
95
+ out/
@@ -0,0 +1,34 @@
1
+ # syntax=docker/dockerfile:1
2
+
3
+ # Build stage
4
+ FROM golang:1.21-alpine AS builder
5
+ WORKDIR /app
6
+
7
+ # Copy go mod files
8
+ COPY go.mod go.sum ./
9
+ RUN go mod download
10
+
11
+ # Copy source code
12
+ COPY . .
13
+
14
+ # Build the application with optimizations
15
+ RUN CGO_ENABLED=0 GOOS=linux go build -a -ldflags="-s -w" -o /app/main .
16
+
17
+ # Production stage (using distroless for minimal image)
18
+ # gcr.io/distroless/static-debian12 IS a specific tag; hadolint DL3006 is a
19
+ # false positive for non-Docker-Hub registries.
20
+ # hadolint ignore=DL3006
21
+ FROM gcr.io/distroless/static-debian12 AS production
22
+ WORKDIR /
23
+
24
+ # Copy binary from builder
25
+ COPY --from=builder /app/main /main
26
+
27
+ # Expose port
28
+ EXPOSE 8080
29
+
30
+ # Switch to non-root user (distroless runs as nonroot by default)
31
+ USER nonroot:nonroot
32
+
33
+ # Start application
34
+ ENTRYPOINT ["/main"]
@@ -0,0 +1,45 @@
1
+ # syntax=docker/dockerfile:1
2
+
3
+ # Build stage
4
+ FROM eclipse-temurin:21-jdk-jammy AS builder
5
+ WORKDIR /app
6
+
7
+ # Copy Maven wrapper and pom.xml
8
+ COPY mvnw pom.xml ./
9
+ COPY .mvn .mvn
10
+
11
+ # Download dependencies (cached layer)
12
+ RUN ./mvnw dependency:go-offline
13
+
14
+ # Copy source code
15
+ COPY src ./src
16
+
17
+ # Build application
18
+ RUN ./mvnw clean package -DskipTests && \
19
+ mv target/*.jar target/app.jar
20
+
21
+ # Production stage (using JRE instead of JDK)
22
+ FROM eclipse-temurin:21-jre-jammy AS production
23
+ WORKDIR /app
24
+
25
+ # Install healthcheck dependency and create non-root user
26
+ # hadolint ignore=DL3008
27
+ RUN apt-get update && apt-get install -y --no-install-recommends curl && \
28
+ rm -rf /var/lib/apt/lists/* && \
29
+ useradd -m -u 1001 app
30
+
31
+ # Copy JAR from builder
32
+ COPY --from=builder --chown=app:app /app/target/app.jar ./app.jar
33
+
34
+ # Switch to non-root user
35
+ USER app
36
+
37
+ # Expose port
38
+ EXPOSE 8080
39
+
40
+ # Health check (Spring Boot Actuator)
41
+ HEALTHCHECK --interval=30s --timeout=3s --start-period=40s --retries=3 \
42
+ CMD curl -f http://localhost:8080/actuator/health || exit 1
43
+
44
+ # Start application
45
+ ENTRYPOINT ["java", "-jar", "app.jar"]
@@ -0,0 +1,49 @@
1
+ # syntax=docker/dockerfile:1
2
+
3
+ # Dependencies stage
4
+ FROM node:20-alpine AS deps
5
+ WORKDIR /app
6
+
7
+ # Copy dependency files
8
+ COPY package*.json ./
9
+ RUN npm ci
10
+
11
+ # Builder stage
12
+ FROM node:20-alpine AS builder
13
+ WORKDIR /app
14
+
15
+ # Copy dependencies and application code
16
+ COPY --from=deps /app/node_modules ./node_modules
17
+ COPY . .
18
+
19
+ # Build Next.js application
20
+ RUN npm run build
21
+
22
+ # Production stage
23
+ FROM node:20-alpine AS runner
24
+ WORKDIR /app
25
+
26
+ ENV NODE_ENV=production
27
+
28
+ # Create non-root user
29
+ RUN addgroup -g 1001 -S nodejs && \
30
+ adduser -S nextjs -u 1001
31
+
32
+ # Copy built application
33
+ COPY --from=builder --chown=nextjs:nodejs /app/.next ./.next
34
+ COPY --from=builder --chown=nextjs:nodejs /app/public ./public
35
+ COPY --from=builder /app/node_modules ./node_modules
36
+ COPY --from=builder /app/package.json ./package.json
37
+
38
+ # Switch to non-root user
39
+ USER nextjs
40
+
41
+ # Expose port
42
+ EXPOSE 3000
43
+
44
+ # Health check
45
+ HEALTHCHECK --interval=30s --timeout=3s --start-period=10s --retries=3 \
46
+ CMD node -e "require('http').get('http://localhost:3000', (r) => {process.exit(r.statusCode === 200 ? 0 : 1)})"
47
+
48
+ # Start application
49
+ CMD ["npm", "start"]
@@ -0,0 +1,55 @@
1
+ # syntax=docker/dockerfile:1
2
+
3
+ # Build stage (for apps that compile assets, e.g. TypeScript/Vite/Webpack)
4
+ FROM node:20-alpine AS builder
5
+ WORKDIR /app
6
+
7
+ # Copy dependency files for caching
8
+ COPY package*.json ./
9
+
10
+ # Install full dependency tree so build tooling is available
11
+ RUN npm ci && \
12
+ npm cache clean --force
13
+
14
+ # Copy application code
15
+ COPY . .
16
+
17
+ # Build application and prune devDependencies afterward
18
+ RUN npm run build && \
19
+ npm prune --omit=dev
20
+
21
+ # Production stage
22
+ FROM node:20-alpine AS production
23
+ WORKDIR /app
24
+
25
+ # Set production environment
26
+ ENV NODE_ENV=production
27
+
28
+ # Create non-root user
29
+ RUN addgroup -g 1001 -S nodejs && \
30
+ adduser -S nodejs -u 1001
31
+
32
+ # Copy runtime dependencies and built output
33
+ COPY --from=builder --chown=nodejs:nodejs /app/node_modules ./node_modules
34
+ COPY --from=builder --chown=nodejs:nodejs /app/dist ./dist
35
+ COPY --from=builder --chown=nodejs:nodejs /app/package*.json ./
36
+
37
+ # Switch to non-root user
38
+ USER nodejs
39
+
40
+ # Expose port
41
+ EXPOSE 3000
42
+
43
+ # Health check
44
+ HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
45
+ CMD node -e "require('http').get('http://localhost:3000/health', (r) => {process.exit(r.statusCode === 200 ? 0 : 1)})" || exit 1
46
+
47
+ # Start application
48
+ CMD ["node", "dist/index.js"]
49
+
50
+ # No-build variant (apps that run source directly):
51
+ # 1) In builder stage, replace install/build lines with:
52
+ # RUN npm ci --omit=dev && npm cache clean --force
53
+ # 2) In production stage, replace COPY/CMD with:
54
+ # COPY --from=builder --chown=nodejs:nodejs /app ./
55
+ # CMD ["node", "src/index.js"]
@@ -0,0 +1,48 @@
1
+ # syntax=docker/dockerfile:1
2
+
3
+ # Build stage
4
+ FROM python:3.12-slim AS builder
5
+ WORKDIR /app
6
+
7
+ # Install build dependencies
8
+ # hadolint ignore=DL3008
9
+ RUN apt-get update && apt-get install -y --no-install-recommends \
10
+ gcc \
11
+ && rm -rf /var/lib/apt/lists/*
12
+
13
+ # Copy dependency files
14
+ COPY requirements.txt .
15
+
16
+ # Install Python dependencies
17
+ RUN pip install --no-cache-dir --user -r requirements.txt
18
+
19
+ # Production stage
20
+ FROM python:3.12-slim AS production
21
+ WORKDIR /app
22
+
23
+ # Create non-root user
24
+ RUN useradd -m -u 1001 app
25
+
26
+ # Copy dependencies from builder
27
+ COPY --from=builder /root/.local /home/app/.local
28
+
29
+ # Copy application code
30
+ COPY --chown=app:app . .
31
+
32
+ # Update PATH and set Python production env vars
33
+ ENV PATH=/home/app/.local/bin:$PATH \
34
+ PYTHONUNBUFFERED=1 \
35
+ PYTHONDONTWRITEBYTECODE=1
36
+
37
+ # Switch to non-root user
38
+ USER app
39
+
40
+ # Expose port
41
+ EXPOSE 8000
42
+
43
+ # Health check
44
+ HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
45
+ CMD python -c "import urllib.request; urllib.request.urlopen('http://localhost:8000/health').read()" || exit 1
46
+
47
+ # Start application with uvicorn
48
+ CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]