ROOT CAUSE (corrected): `frontend/node_modules` is a SYMLINK that got COMMITTED to dev ind0e3220— `git add -A frontend` swept it in while it was being used to run TypeScript/ESLint against a worktree, and .gitignore's rule is `node_modules/` (trailing slash = directory only), which does not match a symlink. Every deploy therefore gets the symlink back from `git reset --hard origin/dev`, and the frontend image build — whose context is the frontend/ directory, so the repo-root .dockerignore does not apply — died on it: #11 [build 5/6] COPY . . #11 ERROR: cannot replace to directory .../merged/app/node_modules with file ERROR: failed to build: failed to solve: ... The dev deploy failed twice in a row on the #957 merge (run #3053, attempts 1 and 2); smoke-test-dev and the release-notes job were skipped and dev stayed on the previous image. Three changes, in order of what actually fixes it: 1. `git rm --cached frontend/node_modules` — the tracked symlink goes away, so the checkout no longer plants it. 2. `.gitignore` gains `node_modules` (no trailing slash) so a symlink of that name can never be staged again. 3. `frontend/.dockerignore` keeps node_modules out of the image build context either way — `npm ci` installs the dependencies inside the image. (cherry picked from commitced2c2db4d)
102 lines
3.5 KiB
Plaintext
102 lines
3.5 KiB
Plaintext
# ──────────────────────────────────────────────
|
|
# Python Backend
|
|
# ──────────────────────────────────────────────
|
|
__pycache__/
|
|
*.py[cod]
|
|
*.pyo
|
|
*.egg-info/
|
|
dist/
|
|
build/
|
|
*.egg
|
|
.pytest_cache/
|
|
*.db
|
|
*.sqlite
|
|
*.sqlite3
|
|
sapl_garment_intel.db
|
|
|
|
# Virtual environment
|
|
.venv/
|
|
venv/
|
|
env/
|
|
ENV/
|
|
|
|
# Environment variables / secrets
|
|
.env
|
|
.env.*
|
|
!.env.example
|
|
!.env.sample
|
|
!.env.local.sample
|
|
|
|
# ──────────────────────────────────────────────
|
|
# Frontend (React / Vite / TypeScript)
|
|
# ──────────────────────────────────────────────
|
|
node_modules/
|
|
# A symlink named node_modules is NOT matched by 'node_modules/' (the trailing
|
|
# slash means directory only), which let one be committed and then break the
|
|
# frontend image build with "cannot replace to directory .../app/node_modules
|
|
# with file" (2026-09-28, dev deploy). Match the name, whatever it is.
|
|
node_modules
|
|
frontend/dist/
|
|
frontend/dev-dist/
|
|
dist/
|
|
*.tsbuildinfo
|
|
.next/
|
|
|
|
# ──────────────────────────────────────────────
|
|
# IDE / Editor
|
|
# ──────────────────────────────────────────────
|
|
.vscode/
|
|
.idea/
|
|
*.swp
|
|
*.swo
|
|
*~
|
|
.DS_Store
|
|
Thumbs.db
|
|
|
|
# ──────────────────────────────────────────────
|
|
# OS & System
|
|
# ──────────────────────────────────────────────
|
|
.DS_Store
|
|
Thumbs.db
|
|
desktop.ini
|
|
|
|
# ──────────────────────────────────────────────
|
|
# Logs / Temp
|
|
# ──────────────────────────────────────────────
|
|
*.log
|
|
*.tmp
|
|
*.temp
|
|
*.cache
|
|
tmp/
|
|
temp/
|
|
|
|
# ──────────────────────────────────────────────
|
|
# Docker
|
|
# ──────────────────────────────────────────────
|
|
.docker/
|
|
docker-compose.override.yml
|
|
|
|
# ──────────────────────────────────────────────
|
|
# Runtime data (uploads, vector DB)
|
|
# ──────────────────────────────────────────────
|
|
backend/data/
|
|
|
|
# ──────────────────────────────────────────────
|
|
# Docs (Python caches inside docs/scripts)
|
|
# ──────────────────────────────────────────────
|
|
docs/scripts/__pycache__/
|
|
|
|
# Local runtime artifacts
|
|
logs.txt
|
|
*.empty-bak
|
|
.env.uat
|
|
# But NOT .env.uat.example — that's a template we want in the repo
|
|
!.env.uat.example
|
|
# Dev env template (branch dev → dev.ai-automation-hub.tech)
|
|
!.env.dev.example
|
|
.scannerwork/
|
|
backend/.coverage
|
|
|
|
# QA screenshots (pre-merge evidence, not committed)
|
|
.qa-screens/
|