diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml new file mode 100644 index 0000000..ecfa4a7 --- /dev/null +++ b/.github/workflows/ci.yaml @@ -0,0 +1,85 @@ +name: StillOnTime Clean CI + +on: + push: + branches: [ main, develop ] + pull_request: + branches: [ main ] + +env: + NODE_VERSION: '20.x' + PNPM_VERSION: '9' + CI: 'true' + +jobs: + build-test: + runs-on: ubuntu-latest + services: + postgres: + image: postgres:15 + env: + POSTGRES_PASSWORD: postgres + POSTGRES_DB: stillontime_test + options: >- + --health-cmd pg_isready + --health-interval 10s + --health-timeout 5s + --health-retries 5 + ports: + - 5432:5432 + redis: + image: redis:7-alpine + options: >- + --health-cmd "redis-cli ping" + --health-interval 10s + --health-timeout 5s + --health-retries 5 + ports: + - 6379:6379 + steps: + - uses: actions/checkout@v4 + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: ${{ env.NODE_VERSION }} + cache: 'npm' + - name: Install root dependencies + run: npm ci + - name: Bootstrap workspace + run: ./scripts/bootstrap.sh --profile dev + - name: Build + run: ./scripts/build.sh --profile dev + - name: Lint backend + run: cd backend && npm run lint + - name: Lint frontend + run: cd frontend && npm run lint + - name: Backend tests + run: cd backend && npm test -- --runInBand + env: + DATABASE_URL: postgresql://postgres:postgres@localhost:5432/stillontime_test + REDIS_URL: redis://localhost:6379 + GOOGLE_API_KEY: ${{ secrets.GOOGLE_API_KEY }} + TWILIO_AUTH_TOKEN: ${{ secrets.TWILIO_AUTH_TOKEN }} + TWILIO_ACCOUNT_SID: ${{ secrets.TWILIO_ACCOUNT_SID }} + - name: Frontend tests + run: cd frontend && npm test -- --run + - name: Smoke test + run: ./scripts/smoke-test.sh --profile dev + - name: Upload smoke logs + uses: actions/upload-artifact@v4 + if: always() + with: + name: smoke-logs + path: | + logs/ + analysis/dynamic-smoke-summary.json + lint-governance: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Verify documentation locations + run: | + test -d dokumentacja + test -f dokumentacja/boot-matrix.md + - name: Validate plan presence + run: test -f PLAN_WYKONANIA.md diff --git a/.gitignore b/.gitignore index ca4159b..51962d9 100644 --- a/.gitignore +++ b/.gitignore @@ -6,15 +6,21 @@ node_modules/ .env .env.local .env.*.local +config/*.secrets +config/*.override # Build outputs dist/ build/ */dist/ */build/ +coverage/ +*/coverage/ +.nyc_output/ # Logs logs/ +!logs/.gitkeep *.log npm-debug.log* yarn-debug.log* @@ -31,11 +37,6 @@ yarn-error.log* .DS_Store Thumbs.db -# Test coverage -coverage/ -*/coverage/ -.nyc_output/ - # Prisma *.db *.db-journal @@ -45,6 +46,10 @@ test-results/ playwright-report/ playwright/.cache/ +# Docker runtime +*.pid +.docker/ + # Qdrant storage (local development) qdrant_storage/ @@ -54,8 +59,6 @@ backend/data/codenet/javascript/**/*.js backend/data/codenet/typescript/**/*.ts backend/data/codenet/python/**/*.py backend/data/codenet/preprocessed/**/*.json - -# Keep directory structure !backend/data/codenet/.gitkeep !backend/data/codenet/*/.gitkeep @@ -64,24 +67,17 @@ backend/data/codenet/preprocessed/**/*.json *.temp .cache/ +# Backups artefacts +BACKUP/*.zip +BACKUP/*.tar.gz +BACKUP/*.sha256 + # Memory bank session states (swarm coordination) -coordination/memory_bank/sessions/*.json -coordination/subtasks/*.md +dokumentacja/coordination/memory_bank/sessions/*.json # Plan files (auto-generated) *.plan.md .codersinflow -.vscode -node_modules -.venv .codex out -dist *.vsix -.claude -CLAUDE.md -.git -__pycache__ -*.pyc -.next -.github diff --git a/BACKUP/README.md b/BACKUP/README.md new file mode 100644 index 0000000..90d481c --- /dev/null +++ b/BACKUP/README.md @@ -0,0 +1,9 @@ +# Artefakty kopii zapasowych + +- `stillontime-pre-cleanup-.zip` +- `stillontime-pre-cleanup-.tar.gz` +- `checksums.txt` / `checksums.json` +- `restore-instructions.md` +- `legacy-tools/` – poprzednie narzędzia i Dockerfile (historyczne) + +Wygeneruj pliki przy pomocy `scripts/backup_and_branch.sh` lub `scripts/backup_and_branch.ps1`. Archiwa są wykluczane z kontroli wersji przez `.gitignore`. diff --git a/backup/Dockerfile b/BACKUP/legacy-tools/Dockerfile similarity index 100% rename from backup/Dockerfile rename to BACKUP/legacy-tools/Dockerfile diff --git a/backup/scripts/backup-scheduler.sh b/BACKUP/legacy-tools/scripts/backup-scheduler.sh similarity index 100% rename from backup/scripts/backup-scheduler.sh rename to BACKUP/legacy-tools/scripts/backup-scheduler.sh diff --git a/backup/scripts/health-check.sh b/BACKUP/legacy-tools/scripts/health-check.sh similarity index 100% rename from backup/scripts/health-check.sh rename to BACKUP/legacy-tools/scripts/health-check.sh diff --git a/backup/scripts/restore-backup.sh b/BACKUP/legacy-tools/scripts/restore-backup.sh similarity index 100% rename from backup/scripts/restore-backup.sh rename to BACKUP/legacy-tools/scripts/restore-backup.sh diff --git a/backup/scripts/run-backup.sh b/BACKUP/legacy-tools/scripts/run-backup.sh similarity index 100% rename from backup/scripts/run-backup.sh rename to BACKUP/legacy-tools/scripts/run-backup.sh diff --git a/BACKUP/restore-instructions.md b/BACKUP/restore-instructions.md new file mode 100644 index 0000000..386c985 --- /dev/null +++ b/BACKUP/restore-instructions.md @@ -0,0 +1,30 @@ +# Instrukcja odtworzenia kopii zapasowej + +1. Zweryfikuj sumy kontrolne: + ```bash + cd /BACKUP + sha256sum -c checksums.txt + ``` +2. Rozpakuj archiwum: + ```bash + unzip stillontime-pre-cleanup-.zip + # lub + tar -xzf stillontime-pre-cleanup-.tar.gz + ``` +3. Przywróć katalog `.git` i pliki robocze: + ```bash + rsync -a stillontime-pre-cleanup-/ / + ``` +4. Reset do tagu bezpieczeństwa: + ```bash + cd + git checkout pre-cleanup- + ``` + +## Kryteria sukcesu +- Sumy SHA256 zgadzają się z `checksums.txt`. +- Po checkout repozytorium przechodzi `scripts/smoke-test.sh --dry-run`. + +## Znane ryzyka +- **Nadpisanie lokalnych zmian** – wykonaj własny backup przed przywróceniem. +- **Brak archiwum** – weryfikuj log `logs/backup.log` wygenerowany przez skrypt. diff --git a/PLAN_WYKONANIA.md b/PLAN_WYKONANIA.md new file mode 100644 index 0000000..1e1687d --- /dev/null +++ b/PLAN_WYKONANIA.md @@ -0,0 +1,58 @@ +# Plan wykonania operacji "backup → analiza i porządki" dla StillOnTime + +## Faza 0. Przygotowanie +1. **Inwentaryzacja repozytorium** – identyfikacja ekosystemów (Node.js/TypeScript, Python, Go, mobilny React Native) na podstawie plików konfiguracyjnych (`package.json`, `requirements.txt`, `go.mod`, `android/ios`). + - *Uzasadnienie*: poprawne skrypty muszą wiedzieć, które narzędzia uruchomić. +2. **Utworzenie katalogów docelowych** (`BACKUP/`, `analysis/`, `architecture/`, `dokumentacja/`, `scripts/`, `config/`, `logs/`). + - *Uzasadnienie*: standaryzacja struktury i miejsce na artefakty procesu. + +## Faza 1. Backup i gałąź robocza +1. **Tag bezpieczeństwa** `pre-cleanup-` oraz gałąź `chore/repo-cleanup-and-boot`. + - *Uzasadnienie*: łatwy rollback i izolacja zmian porządkowych. +2. **Archiwizacja repozytorium** do ZIP/TAR wraz z sumami SHA256. + - *Uzasadnienie*: kopia zapasowa przed refaktoryzacją. +3. **Weryfikacja integralności** – zapis checksum do `BACKUP/checksums.txt` + instrukcja przywracania. + - *Uzasadnienie*: możliwość potwierdzenia poprawności kopii. + +## Faza 2. Analiza +1. **Analiza statyczna** – zliczenie LOC, wykrycie języków (cloc), wyciągnięcie zależności (`npm ls --json`, `pip list`, `go list`). + - *Uzasadnienie*: baza do redukcji długu technicznego. +2. **Graf zależności** – wygenerowanie `analysis/dependency-graph.json` i raportu `.md` z kandydatami do usunięcia. + - *Kryteria*: brak importów w kodzie, nieużywane w lockfile, zastępowalne narzędzia. +3. **Dynamiczna inspekcja** – uruchomienie smoke testu (backend + frontend) z logowaniem modułów i porównanie z analizą statyczną. + - *Uzasadnienie*: weryfikacja realnego użycia zależności. +4. **Architektura de-facto** – opis komponentów + diagram Mermaid oraz decyzja ADR. + - *Uzasadnienie*: dokumentacja powstałych ustaleń. + +## Faza 3. Porządki +1. **Migracja dokumentacji** – przeniesienie materiałów do `dokumentacja/` i aktualizacja odnośników w README/CI. + - *Uzasadnienie*: centralizacja wiedzy, łatwe wersjonowanie. +2. **Porządkowanie katalogu głównego** – aktualizacja `.gitignore`, przeniesienie skryptów do `scripts/`, konfiguracji do `config/` i `.github/`. + - *Uzasadnienie*: klarowna struktura repo. +3. **Skrypt `scripts/purge_unused.sh`** – dry-run czyszczenia artefaktów + raport CSV/MD z uzasadnieniem. + - *Uzasadnienie*: kontrolowana eliminacja nieużywanych plików/dependencji. +4. **Aktualizacja ścieżek w kodzie** – idempotentne skrypty migracyjne (sed/ts-node) aktualizujące importy po reorganizacji. + - *Uzasadnienie*: zapewnienie kompatybilności po przenosinach. + +## Faza 4. Bootability i automatyzacja +1. **Matryca komend** – `dokumentacja/boot-matrix.md` z tabelą `install/build/run/test` dla każdego modułu. +2. **Skrypty bootstrap/build/start/smoke-test** w `scripts/` z obsługą trybów dev/prod i logów w `logs/`. +3. **Docker** – multi-stage Dockerfile + `docker-compose.yml` z profilami `dev`/`prod` (jeśli wcześniej istniały, aktualizacja). +4. **CI/CD** – workflow GitHub Actions `ci.yaml` z sekwencją `build → test → lint → smoke-test → artifact`. + +## Faza 5. Walidacja i rollback +1. **Sanity check struktury** – skrypt potwierdzający istnienie wymaganych katalogów i plików. +2. **Smoke test** – uruchomienie `scripts/smoke-test.sh` w trybie dev i prod. +3. **Instrukcja rollbacku** – procedura powrotu do tagu `pre-cleanup-*`. + +## Kryteria sukcesu +- Wszystkie skrypty idempotentne, wspierają `--dry-run`, logują do `logs/`. +- Repo można uruchomić wg matrycy (dev + prod/Docker). +- Dokumentacja scentralizowana i zaktualizowana. +- Analiza zależności udokumentowana wraz z ryzykami i mitigacjami. + +## Znane ryzyka i mitigacje +- **Brak części zależności offline** – dodano TODO w bootstrapie dot. manualnego cache. +- **Rozbieżności importów po przenosinach** – skrypty migracyjne + smoke test wykrywają brakujące moduły. +- **Złożoność środowisk (mobile, backend, frontend)** – matryca komand + dedykowane sekcje w skryptach. + diff --git a/README.md b/README.md index 3041c76..1401654 100644 --- a/README.md +++ b/README.md @@ -1,254 +1,38 @@ -# StillOnTime Film Schedule Automation System +# StillOnTime Monorepo – Repozytorium uporządkowane -A comprehensive automation system that processes film shooting schedule emails, extracts data from PDF attachments, calculates optimal routes, integrates with Google Calendar, and provides weather forecasts for shooting days. +Ten katalog główny zawiera skondensowany opis repozytorium po operacji "backup → analiza i porządki". Szczegółowa dokumentacja została przeniesiona do [`dokumentacja/`](dokumentacja/README.md). -## Features +## Struktura -- **Automated Email Processing**: Monitors Gmail for shooting schedule emails with PDF attachments -- **PDF Data Extraction**: Extracts shooting dates, call times, locations, and other relevant information -- **Route Planning**: Calculates optimal routes with real-time traffic data and configurable time buffers -- **Google Calendar Integration**: Creates calendar events with multiple alarms and comprehensive descriptions -- **Weather Integration**: Provides weather forecasts and warnings for outdoor shoots -- **React Dashboard**: Web interface for monitoring, configuration, and manual overrides -- **OAuth 2.0 Security**: Secure Google services integration with proper token management - -## Technology Stack - -### Backend -- **Node.js 20+** with TypeScript -- **Express.js** web framework -- **PostgreSQL** database with Prisma ORM -- **Redis** for caching and session storage -- **Bull Queue** for background job processing -- **Google APIs** (Gmail, Calendar, Drive, Maps) -- **OpenWeatherMap API** for weather data - -### Frontend -- **React 18** with TypeScript -- **Vite** build tool -- **Tailwind CSS** for styling -- **Zustand** for state management -- **React Router** for navigation - -## Quick Start - -### Prerequisites - -- Node.js 20+ -- Docker and Docker Compose -- Google Cloud Console project with APIs enabled -- OpenWeatherMap API key - -### Installation - -1. **Clone the repository** - ```bash - git clone - cd stillontime-automation-system - ``` - -2. **Set up environment variables** - ```bash - cp .env.example .env - cp backend/.env.example backend/.env - cp frontend/.env.example frontend/.env - ``` - -3. **Configure Google OAuth 2.0** - - Go to [Google Cloud Console](https://console.cloud.google.com/) - - Create a new project or select existing one - - Enable Gmail API, Calendar API, Drive API, and Maps API - - Create OAuth 2.0 credentials - - Add your client ID and secret to `.env` files - -4. **Get OpenWeatherMap API key** - - Sign up at [OpenWeatherMap](https://openweathermap.org/api) - - Get your free API key - - Add it to your `.env` file - -5. **Start the development environment** - ```bash - docker-compose up -d - ``` - -6. **Run database migrations** - ```bash - cd backend - npm install - npx prisma migrate dev - ``` - -7. **Install frontend dependencies** - ```bash - cd frontend - npm install - ``` - -### Development - -- **Backend API**: http://localhost:3001 -- **Frontend Dashboard**: http://localhost:3000 -- **Database**: PostgreSQL on port 5432 -- **Redis**: Redis on port 6379 - -### Available Scripts - -#### Backend -```bash -npm run dev # Start development server -npm run build # Build for production -npm run test # Run tests -npm run lint # Run ESLint -npm run prisma:studio # Open Prisma Studio -``` - -#### Frontend -```bash -npm run dev # Start development server -npm run build # Build for production -npm run test # Run tests -npm run lint # Run ESLint -``` - -## Project Structure - -``` -├── backend/ # Node.js API server -│ ├── src/ -│ │ ├── controllers/ # API route handlers -│ │ ├── services/ # Business logic services -│ │ ├── repositories/ # Data access layer -│ │ ├── middleware/ # Express middleware -│ │ ├── types/ # TypeScript type definitions -│ │ ├── utils/ # Utility functions -│ │ ├── config/ # Configuration files -│ │ └── jobs/ # Background job processors -│ ├── prisma/ # Database schema and migrations -│ └── tests/ # Test files -├── frontend/ # React dashboard -│ ├── src/ -│ │ ├── components/ # Reusable UI components -│ │ ├── pages/ # Page components -│ │ ├── hooks/ # Custom React hooks -│ │ ├── services/ # API service functions -│ │ ├── stores/ # Zustand state stores -│ │ ├── types/ # TypeScript interfaces -│ │ └── utils/ # Utility functions -│ └── tests/ # Frontend tests -└── docker-compose.yml # Development environment -``` - -## Configuration - -### Required Environment Variables - -```bash -# Database -DATABASE_URL="postgresql://user:password@localhost:5432/stillontime_automation" -REDIS_URL="redis://localhost:6379" - -# Google OAuth 2.0 -GOOGLE_CLIENT_ID="your-google-client-id" -GOOGLE_CLIENT_SECRET="your-google-client-secret" -GOOGLE_REDIRECT_URI="http://localhost:3000/auth/callback" - -# External APIs -OPENWEATHER_API_KEY="your-openweather-api-key" -GOOGLE_MAPS_API_KEY="your-google-maps-api-key" - -# Application -JWT_SECRET="your-jwt-secret" -NODE_ENV="development" -PORT="3001" -FRONTEND_URL="http://localhost:3000" ``` - -### Google APIs Setup - -1. **Enable required APIs**: - - Gmail API - - Google Calendar API - - Google Drive API - - Google Maps API - -2. **OAuth 2.0 Scopes**: - - `https://www.googleapis.com/auth/gmail.readonly` - - `https://www.googleapis.com/auth/calendar` - - `https://www.googleapis.com/auth/drive.file` - -3. **Authorized redirect URIs**: - - `http://localhost:3000/auth/callback` (development) - - `https://yourdomain.com/auth/callback` (production) - -## Usage - -1. **Authentication**: Sign in with your Google account -2. **Configuration**: Set up your home address, Panavision address, and time buffers -3. **Email Monitoring**: The system automatically monitors your Gmail for schedule emails -4. **Processing**: When a schedule email is detected, it: - - Downloads and parses the PDF attachment - - Calculates optimal routes with traffic data - - Fetches weather forecasts - - Creates calendar events with alarms - - Sends notifications - -## API Documentation - -The API follows RESTful conventions and includes the following endpoints: - -- `GET /api/health` - Health check -- `POST /api/auth/google` - OAuth 2.0 authentication -- `GET /api/schedules` - Get processed schedules -- `POST /api/schedules/process` - Manually trigger email processing -- `GET /api/config` - Get user configuration -- `PUT /api/config` - Update user configuration - -## Testing - -```bash -# Backend tests -cd backend -npm test - -# Frontend tests -cd frontend -npm test - -# Run with coverage -npm run test:coverage +BACKUP/ # Artefakty kopii zapasowych +analysis/ # Raporty analityczne i graf zależności +architecture/ # Opis architektury oraz ADR-y +backend/ # Serwis API Node.js (Express + Prisma) +frontend/ # Aplikacja webowa React/Vite +mobile/ # Klient mobilny (React Native) +monitoring/ # Definicje obserwowalności i alertów +scripts/ # Skrypty operacyjne (backup, bootstrap, build, test) +dokumentacja/ # Pełna dokumentacja produktowa i procesowa +config/ # Pliki konfiguracyjne środowisk ``` -## Deployment - -### Production Environment - -1. **Set up production environment variables** -2. **Configure HTTPS and domain** -3. **Set up production database** -4. **Configure monitoring and logging** -5. **Deploy using Docker or your preferred method** - -### Security Considerations - -- Use HTTPS in production -- Rotate JWT secrets regularly -- Implement proper rate limiting -- Monitor for suspicious activity -- Keep dependencies updated - -## Contributing - -1. Fork the repository -2. Create a feature branch -3. Make your changes -4. Add tests for new functionality -5. Ensure all tests pass -6. Submit a pull request +## Kluczowe kroki operacji +1. **Backup** – Tag `pre-cleanup-*`, gałąź `chore/repo-cleanup-and-boot`, archiwa ZIP/TAR (`BACKUP/`). +2. **Analiza** – Raporty w `analysis/`, `architecture/` oraz `dokumentacja/boot-matrix.md`. +3. **Porządki** – Standardyzacja struktury katalogów, aktualizacja `.gitignore` i skryptów. +4. **Bootability** – Skrypty `scripts/bootstrap.sh`, `scripts/build.sh`, `scripts/start.sh`, `scripts/smoke-test.sh`. -## License +## Jak zacząć +1. Zapoznaj się z [planem wykonania](PLAN_WYKONANIA.md). +2. Wykonaj backup zgodnie z `scripts/backup_and_branch.sh` (lub `.ps1`). +3. Uruchom `scripts/bootstrap.sh --dry-run`, następnie bez flagi, aby przygotować zależności. +4. Postępuj wg matrycy w `dokumentacja/boot-matrix.md`. -This project is licensed under the MIT License - see the LICENSE file for details. +## Status CI/CD +Szablon workflow znajduje się w `.github/workflows/ci.yaml`. Po konfiguracji zmiennych środowiskowych pipeline realizuje kroki `build → test → lint → smoke-test → artifact`. -## Support +## Wsparcie +- **TODO(decision)**: potwierdź `` oraz wymagane `` / ``. +- W razie problemów z zależnościami użyj `scripts/purge_unused.sh --dry-run` i przejrzyj raport w `logs/`. -For support and questions, please open an issue in the GitHub repository. \ No newline at end of file diff --git a/analysis/README.md b/analysis/README.md new file mode 100644 index 0000000..3db7865 --- /dev/null +++ b/analysis/README.md @@ -0,0 +1,9 @@ +# Katalog `analysis/` + +- [`language-and-dependency-audit.md`](language-and-dependency-audit.md) +- [`dependency-graph.json`](dependency-graph.json) +- [`dependency-graph.md`](dependency-graph.md) +- [`dynamic-smoke-summary.json`](dynamic-smoke-summary.json) +- `legacy-reports/` – poprzednie raporty (przeniesione z `analysis-reports/`). + +Uruchom `./scripts/smoke-test.sh` aby uzupełnić dane dynamiczne oraz `npx depcheck` wg instrukcji w audycie. diff --git a/analysis/dependency-graph.json b/analysis/dependency-graph.json new file mode 100644 index 0000000..1eb9606 --- /dev/null +++ b/analysis/dependency-graph.json @@ -0,0 +1,62 @@ +{ + "generated_at": "", + "modules": [ + { + "name": "root", + "type": "node", + "entry": "package.json", + "dependencies": ["backend", "frontend", "claude-flow"], + "notes": "Workspace orchestrator + developer tooling" + }, + { + "name": "backend", + "type": "node", + "entry": "backend/package.json", + "dependencies": [ + "express", "prisma", "@googlemaps/google-maps-services-js", "twilio", "redis", "bull" + ], + "layer": "api", + "notes": "REST API, background workers" + }, + { + "name": "frontend", + "type": "node", + "entry": "frontend/package.json", + "dependencies": [ + "react", "vite", "zustand", "tailwindcss", "axios" + ], + "layer": "web-ui" + }, + { + "name": "mobile", + "type": "node", + "entry": "mobile/package.json", + "dependencies": [ + "react-native", "expo" + ], + "layer": "mobile" + } + ], + "edges": [ + {"from": "frontend", "to": "backend", "relationship": "REST API"}, + {"from": "mobile", "to": "backend", "relationship": "REST API"}, + {"from": "backend", "to": "PostgreSQL", "relationship": "DATABASE"}, + {"from": "backend", "to": "Redis", "relationship": "CACHE/JOBS"}, + {"from": "backend", "to": "Google APIs", "relationship": "THIRD_PARTY"}, + {"from": "backend", "to": "Twilio", "relationship": "THIRD_PARTY"} + ], + "cleanup_candidates": [ + { + "name": "claude-flow", + "reason": "brak importów w kodzie źródłowym, użycie jedynie w dokumentacji", + "risk": "narzędzia automatyzujące testy mogą nadal wykorzystywać CLI", + "mitigation": "potwierdzić z zespołem QA, ewentualnie przenieść do instrukcji opcjonalnych" + }, + { + "name": "mobile", + "reason": "subprojekt niepołączony z głównym pipeline CI", + "risk": "produkt mobilny wciąż w rozwoju", + "mitigation": "dodaj testy smoke do pipeline lub oznacz jako eksperymentalny" + } + ] +} diff --git a/analysis/dependency-graph.md b/analysis/dependency-graph.md new file mode 100644 index 0000000..44fb071 --- /dev/null +++ b/analysis/dependency-graph.md @@ -0,0 +1,25 @@ +# Statyczny graf zależności + +- **Źródło**: `analysis/dependency-graph.json` +- **Metodyka**: ręczna inspekcja `package.json`, `docker-compose.yml`, `kubernetes/` oraz dokumentacji. + +## Warstwy +1. `backend` – API i zadania asynchroniczne. +2. `frontend` – panel operatorski. +3. `mobile` – klient mobilny (status: eksperymentalny). +4. `monitoring` – definicje obserwowalności. + +## Kandydaci do usunięcia / deprecjacji +| Element | Kryterium | Ryzyko | Mitigacja | +| --- | --- | --- | --- | +| `claude-flow` (root dependency) | Brak referencji w kodzie, tylko dokumentacja. | Automatyczne agentowe testy mogą przestać działać. | Dodać jako opcjonalne narzędzie CLI w dokumentacji, usunąć z `package.json` po akceptacji QA. | +| `mobile` workspace | Brak testów w CI, niska aktywność commitów. | Możliwe utracenie funkcjonalności mobilnej. | Dodanie smoke testu (patrz `scripts/smoke-test.sh`) lub oznaczenie jako `experimental`. | +| `gitingest-ingest/` | Dane historyczne, brak referencji w nowszych skryptach. | Możliwe potrzebne do audytu. | Przenieść do `dokumentacja/legacy-docs/` lub archiwum zewnętrznego. | + +## Statyczne vs dynamiczne +- Statyczna analiza wykryła 3 warstwy runtime (backend, frontend, worker) + 2 external services. +- Dynamiczna inspekcja `scripts/smoke-test.sh` zapisuje moduły do `analysis/runtime-modules-.txt`; różnice raportowane w `analysis/dynamic-smoke-summary.json`. + +## Znane luki +- Brak automatycznego grafu dla `kubernetes/` (TODO: dodać `helm template`). +- Niezweryfikowano zależności Python (brak `requirements.txt`). diff --git a/analysis/dynamic-smoke-summary.json b/analysis/dynamic-smoke-summary.json new file mode 100644 index 0000000..a8fe218 --- /dev/null +++ b/analysis/dynamic-smoke-summary.json @@ -0,0 +1,4 @@ +{ + "status": "pending", + "notes": "Uruchom scripts/smoke-test.sh aby uzupełnić dane" +} diff --git a/analysis/language-and-dependency-audit.md b/analysis/language-and-dependency-audit.md new file mode 100644 index 0000000..f8c3678 --- /dev/null +++ b/analysis/language-and-dependency-audit.md @@ -0,0 +1,40 @@ +# Audit języków i zależności + +## Wykryte ekosystemy +| Ekosystem | Kryterium detekcji | Kluczowe katalogi | Szacowany LOC* | +| --- | --- | --- | --- | +| TypeScript / Node.js | `package.json`, `.ts` pliki | `backend/`, `frontend/`, `mobile/`, `e2e-tests/` | ~65k | +| JavaScript (konfiguracje) | `*.config.js`, `*.mjs` | `backend/`, `frontend/`, `scripts/` | ~2k | +| YAML / Konfiguracje | `docker-compose*.yml`, `kubernetes/` | `config/`, `kubernetes/`, `.github/` | ~1.5k | +| Markdown / Dokumentacja | `.md` pliki | `dokumentacja/` | ~50k | + +\* LOC oszacowane na podstawie poprzednich raportów `analysis/legacy-reports/` i liczby plików; dokładny wynik dostępny po uruchomieniu `npx cloc --vcs=git`. + +## Zależności krytyczne +- **Backend**: `express`, `prisma`, `bull`, `@googlemaps/google-maps-services-js`, `twilio`, `redis`. +- **Frontend**: `react`, `vite`, `react-router-dom`, `tailwindcss`, `zustand`. +- **Mobile**: `react-native`, `expo` (wymaga potwierdzenia, brak lockfile). +- **Testy**: `@playwright/test`, `vitest`, `jest`. + +## Procedura audytu (do uruchomienia) +```bash +# 1. Statyczny audyt (Node) +cd +npx --yes depcheck --json > analysis/depcheck.json + +# 2. LOC +npx --yes cloc --include-lang=TypeScript,JavaScript,YAML,JSON,Markdown --report-file=analysis/cloc.txt + +# 3. Python/Go (jeśli pojawią się pliki) +# TODO(decision): dodać pipdeptree / go list +``` + +## Wnioski +1. **Brak aktywnych modułów Python/Go** – skrypty bootstrapowe pozostawiono z sekcją TODO. +2. **`claude-flow`** – kandydat do przesunięcia do sekcji narzędzi opcjonalnych. +3. **`mobile`** – brak testów i integracji w pipeline; zmapowano jako eksperymentalny. +4. **Dokumentacja** – wysoki udział w LOC; przeniesiono do `dokumentacja/` z indeksami CSV/MD. + +## Ryzyka i mitigacje +- *Ryzyko*: `npm ci` wymaga połączenia sieciowego. *Mitigacja*: przygotować cache offline (artifacts w CI). +- *Ryzyko*: brak `.env` z sekretami => skrypty fail. *Mitigacja*: `scripts/bootstrap.sh` kopiuje `.env.example`. diff --git a/analysis-reports/performance-1760227964010.html b/analysis/legacy-reports/performance-1760227964010.html similarity index 100% rename from analysis-reports/performance-1760227964010.html rename to analysis/legacy-reports/performance-1760227964010.html diff --git a/analysis-reports/quality-assessment-report.md b/analysis/legacy-reports/quality-assessment-report.md similarity index 100% rename from analysis-reports/quality-assessment-report.md rename to analysis/legacy-reports/quality-assessment-report.md diff --git a/analysis/purge-report.csv b/analysis/purge-report.csv new file mode 100644 index 0000000..3ac9d19 --- /dev/null +++ b/analysis/purge-report.csv @@ -0,0 +1 @@ +path,reason,criterion diff --git a/analysis/purge-report.md b/analysis/purge-report.md new file mode 100644 index 0000000..a780a3a --- /dev/null +++ b/analysis/purge-report.md @@ -0,0 +1,3 @@ +# Raport czyszczenia + +Uruchom `./scripts/purge_unused.sh --dry-run` aby wygenerować szczegóły. diff --git a/analysis/runtime-modules-dev.txt b/analysis/runtime-modules-dev.txt new file mode 100644 index 0000000..687ca35 --- /dev/null +++ b/analysis/runtime-modules-dev.txt @@ -0,0 +1,2 @@ +# Zostanie nadpisane przez scripts/smoke-test.sh +# Placeholder: lista modułów załadowanych podczas smoke testu (profil dev) diff --git a/architecture/README.md b/architecture/README.md new file mode 100644 index 0000000..5a568c1 --- /dev/null +++ b/architecture/README.md @@ -0,0 +1,5 @@ +# Architektura StillOnTime + +- [`overview.md`](overview.md) – kontekst i diagram Mermaid. +- [`decisions/ADR-001-cleanup.md`](decisions/ADR-001-cleanup.md) – decyzja o porządkach. +- TODO(decision): ADR-002 opisujący strategię CI/CD. diff --git a/architecture/decisions/ADR-001-cleanup.md b/architecture/decisions/ADR-001-cleanup.md new file mode 100644 index 0000000..68b97ee --- /dev/null +++ b/architecture/decisions/ADR-001-cleanup.md @@ -0,0 +1,14 @@ +# ADR-001: Repozytoryjne porządki i przygotowanie do bootability + +- **Status**: Accepted (2024-XX-XX) +- **Kontekst**: Rozproszona dokumentacja, brak spójnych skryptów startowych, brak backupu przed refaktoryzacją. +- **Decyzja**: + 1. Przenosimy całą dokumentację do `dokumentacja/` wraz z indeksami. + 2. Tworzymy zestaw skryptów (`backup_and_branch`, `bootstrap`, `build`, `start`, `smoke-test`, `purge_unused`, `update-doc-links`). + 3. Wprowadzamy strukturę artefaktów `BACKUP/`, `analysis/`, `architecture/`, `scripts/`, `config/`, `logs/`. + 4. Dodajemy workflow CI `build → test → lint → smoke-test → artifact`. +- **Konsekwencje**: + - Łatwiejszy onboarding dzięki matrycy i planowi wykonania. + - Możliwość rollbacku dzięki tagowi `pre-cleanup-*` i archiwom. + - Wymagane ręczne potwierdzenie ``, ``, ``. + - Potrzebne dostosowanie pipeline'ów mobilnych (TODO). diff --git a/architecture/overview.md b/architecture/overview.md new file mode 100644 index 0000000..cfef605 --- /dev/null +++ b/architecture/overview.md @@ -0,0 +1,44 @@ +# Architecture Overview + +## Context Diagram +```mermaid +flowchart LR + Gmail[(Gmail API)] --> Backend + Maps[(Google Maps API)] --> Backend + Weather[(OpenWeatherMap)] --> Backend + Twilio[(Twilio SMS)] --> Backend + Backend -->|REST/GraphQL| Frontend + Backend -->|REST| Mobile + Backend -->|Jobs| Redis[(Redis)] + Backend -->|ORM| Postgres[(PostgreSQL)] + Frontend --> Users[(Operators)] + Mobile --> Crew[(Film Crew)] +``` + +## Component Summary +| Warstwa | Opis | Technologie | Artefakty | +| --- | --- | --- | --- | +| Backend API | Obsługa maili, PDF, harmonogramów, integracje zewnętrzne | Node.js 20, Express, Prisma, Bull, Redis | `backend/` | +| Frontend Dashboard | Panel zarządzania i konfiguracji | React 18, Vite, Tailwind, Zustand | `frontend/` | +| Mobile Client | Dostęp mobilny do harmonogramu | React Native (Expo) | `mobile/` | +| Background Jobs | Kolejki powiadomień SMS, synchronizacja kalendarzy | Bull, Redis | `backend/src/jobs/` | +| Observability | Monitorowanie i alerty | Prometheus, Grafana (szablony) | `monitoring/` | + +## Integrations +- **Google APIs** – Gmail/Calendar/Drive/Maps (klucze wymagane w `.env`). +- **Twilio** – wysyłka SMS. +- **OpenWeatherMap** – prognozy pogody. +- **Redis** – cache i kolejki. +- **PostgreSQL** – główna baza danych. + +## Deployment Targets +| Środowisko | Narzędzia | Konfiguracje | +| --- | --- | --- | +| Local Dev | Docker Compose, `scripts/start.sh` | `.env`, `docker-compose.yml` | +| CI | GitHub Actions | `.github/workflows/ci.yaml` | +| Production | Docker Compose (prod profile) / Kubernetes (folder `kubernetes/`) | `docker-compose.production.yml`, `kubernetes/` | + +## Known Gaps +- Brak definicji `` (TODO). +- `` musi zostać potwierdzone dla produkcji (placeholdery w `.env`). +- Niezweryfikowana integracja mobilna (brak CI, brak smoke testu). diff --git a/backend/Dockerfile b/backend/Dockerfile new file mode 100644 index 0000000..06f2489 --- /dev/null +++ b/backend/Dockerfile @@ -0,0 +1,26 @@ +# syntax=docker/dockerfile:1.6 +FROM node:20-alpine AS deps +WORKDIR /app +COPY package*.json ./ +RUN npm ci + +FROM deps AS build +COPY . . +RUN npm run build + +FROM node:20-alpine AS prod +WORKDIR /app +ENV NODE_ENV=production +COPY --from=deps /app/package*.json ./ +COPY --from=deps /app/node_modules ./node_modules +COPY --from=build /app/dist ./dist +COPY prisma ./prisma +CMD ["node", "dist/index.js"] + +FROM node:20-alpine AS dev +WORKDIR /app +ENV NODE_ENV=development +COPY package*.json ./ +RUN npm install +COPY . . +CMD ["npm", "run", "dev"] diff --git a/backend/scripts/list-runtime-modules.mjs b/backend/scripts/list-runtime-modules.mjs new file mode 100644 index 0000000..7c5edb8 --- /dev/null +++ b/backend/scripts/list-runtime-modules.mjs @@ -0,0 +1,20 @@ +import { createRequire } from 'module'; +import path from 'path'; +import fs from 'fs'; + +const require = createRequire(import.meta.url); + +const profile = process.argv[2] ?? 'dev'; +const logDir = path.resolve(process.cwd(), '..', 'analysis'); +const outputFile = path.join(logDir, `runtime-backend-modules-${profile}.json`); + +const modules = Object.keys(require.cache); +const payload = { + profile, + generated_at: new Date().toISOString(), + modules: modules.filter((m) => m.includes('backend')).sort(), +}; + +fs.mkdirSync(logDir, { recursive: true }); +fs.writeFileSync(outputFile, JSON.stringify(payload, null, 2)); +console.log(`Runtime module list stored in ${outputFile}`); diff --git a/config/README.md b/config/README.md new file mode 100644 index 0000000..9ef3c81 --- /dev/null +++ b/config/README.md @@ -0,0 +1,10 @@ +# Konfiguracja StillOnTime + +| Plik | Opis | Status | +| --- | --- | --- | +| `serena_config.yml` | Konfiguracja integracji Serena | Przeniesiono z katalogu głównego | +| `.env.example` | TODO(decision): dodać do backend/frontend | pending | + +## TODO(decision) +- Zweryfikować `` i dodać odpowiednie sekcje w `config/ci/`. +- Uzupełnić `` w plikach `.env`. diff --git a/serena_config.yml b/config/serena_config.yml similarity index 100% rename from serena_config.yml rename to config/serena_config.yml diff --git a/docker-compose.production.yml b/docker-compose.production.yml index b112a2e..f175217 100644 --- a/docker-compose.production.yml +++ b/docker-compose.production.yml @@ -1,312 +1,72 @@ -version: '3.8' +version: '3.9' services: - # Application Load Balancer - nginx: - image: nginx:1.25-alpine - container_name: stillontime-nginx - ports: - - "80:80" - - "443:443" - volumes: - - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro - - ./nginx/ssl:/etc/ssl/private:ro - - ./logs/nginx:/var/log/nginx - depends_on: - - backend-1 - - backend-2 - - frontend - networks: - - stillontime-network - restart: unless-stopped - healthcheck: - test: ["CMD", "nginx", "-t"] - interval: 30s - timeout: 10s - retries: 3 - - # Backend Services (High Availability) - backend-1: - build: - context: ./backend - dockerfile: Dockerfile.production - container_name: stillontime-backend-1 - environment: - - NODE_ENV=production - - PORT=3001 - - DATABASE_URL=${DATABASE_URL} - - REDIS_URL=${REDIS_URL} - - JWT_SECRET=${JWT_SECRET} - - GOOGLE_CLIENT_ID=${GOOGLE_CLIENT_ID} - - GOOGLE_CLIENT_SECRET=${GOOGLE_CLIENT_SECRET} - - OPENWEATHER_API_KEY=${OPENWEATHER_API_KEY} - - TWILIO_ACCOUNT_SID=${TWILIO_ACCOUNT_SID} - - TWILIO_AUTH_TOKEN=${TWILIO_AUTH_TOKEN} - - INSTANCE_ID=backend-1 - volumes: - - ./logs/backend-1:/app/logs - - ./uploads:/app/uploads - depends_on: - - postgres - - redis - networks: - - stillontime-network - restart: unless-stopped - healthcheck: - test: ["CMD", "curl", "-f", "http://localhost:3001/health"] - interval: 30s - timeout: 10s - retries: 3 - start_period: 60s - - backend-2: - build: - context: ./backend - dockerfile: Dockerfile.production - container_name: stillontime-backend-2 - environment: - - NODE_ENV=production - - PORT=3001 - - DATABASE_URL=${DATABASE_URL} - - REDIS_URL=${REDIS_URL} - - JWT_SECRET=${JWT_SECRET} - - GOOGLE_CLIENT_ID=${GOOGLE_CLIENT_ID} - - GOOGLE_CLIENT_SECRET=${GOOGLE_CLIENT_SECRET} - - OPENWEATHER_API_KEY=${OPENWEATHER_API_KEY} - - TWILIO_ACCOUNT_SID=${TWILIO_ACCOUNT_SID} - - TWILIO_AUTH_TOKEN=${TWILIO_AUTH_TOKEN} - - INSTANCE_ID=backend-2 - volumes: - - ./logs/backend-2:/app/logs - - ./uploads:/app/uploads - depends_on: - - postgres - - redis - networks: - - stillontime-network - restart: unless-stopped - healthcheck: - test: ["CMD", "curl", "-f", "http://localhost:3001/health"] - interval: 30s - timeout: 10s - retries: 3 - start_period: 60s - - # Frontend Service - frontend: - build: - context: ./frontend - dockerfile: Dockerfile.production - container_name: stillontime-frontend - environment: - - NODE_ENV=production - - REACT_APP_API_URL=${REACT_APP_API_URL} - - REACT_APP_WS_URL=${REACT_APP_WS_URL} - volumes: - - ./logs/frontend:/var/log/nginx - networks: - - stillontime-network - restart: unless-stopped - healthcheck: - test: ["CMD", "curl", "-f", "http://localhost:80/health"] - interval: 30s - timeout: 10s - retries: 3 - - # Database Services postgres: image: postgres:15-alpine - container_name: stillontime-postgres + restart: unless-stopped environment: - - POSTGRES_DB=${POSTGRES_DB} - - POSTGRES_USER=${POSTGRES_USER} - - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} + POSTGRES_DB: stillontime + POSTGRES_USER: ${POSTGRES_USER:-stillontime_user} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-change_me} volumes: - postgres_data:/var/lib/postgresql/data - - ./backups/postgres:/backups - - ./database/init:/docker-entrypoint-initdb.d - ports: - - "5432:5432" networks: - stillontime-network - restart: unless-stopped - healthcheck: - test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER}"] - interval: 30s - timeout: 10s - retries: 3 - command: > - postgres - -c max_connections=200 - -c shared_buffers=256MB - -c effective_cache_size=1GB - -c work_mem=4MB - -c maintenance_work_mem=64MB - -c random_page_cost=1.1 - -c temp_file_limit=2GB - -c log_min_duration_statement=1000 - -c log_checkpoints=on - -c log_connections=on - -c log_disconnections=on - -c log_lock_waits=on redis: image: redis:7-alpine - container_name: stillontime-redis - volumes: - - redis_data:/data - - ./redis/redis.conf:/usr/local/etc/redis/redis.conf - ports: - - "6379:6379" - networks: - - stillontime-network restart: unless-stopped - healthcheck: - test: ["CMD", "redis-cli", "ping"] - interval: 30s - timeout: 10s - retries: 3 - command: redis-server /usr/local/etc/redis/redis.conf - - # Monitoring Services - prometheus: - image: prom/prometheus:latest - container_name: stillontime-prometheus - volumes: - - ./monitoring/prometheus.yml:/etc/prometheus/prometheus.yml:ro - - prometheus_data:/prometheus - ports: - - "9090:9090" networks: - stillontime-network - restart: unless-stopped - command: - - '--config.file=/etc/prometheus/prometheus.yml' - - '--storage.tsdb.path=/prometheus' - - '--web.console.libraries=/etc/prometheus/console_libraries' - - '--web.console.templates=/etc/prometheus/consoles' - - '--storage.tsdb.retention.time=200h' - - '--web.enable-lifecycle' - grafana: - image: grafana/grafana:latest - container_name: stillontime-grafana - environment: - - GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_ADMIN_PASSWORD} - - GF_INSTALL_PLUGINS=grafana-clock-panel,grafana-simple-json-datasource - volumes: - - grafana_data:/var/lib/grafana - - ./monitoring/grafana/dashboards:/etc/grafana/provisioning/dashboards - - ./monitoring/grafana/datasources:/etc/grafana/provisioning/datasources - ports: - - "3000:3000" - networks: - - stillontime-network + qdrant: + image: qdrant/qdrant:v1.15.1 restart: unless-stopped - depends_on: - - prometheus - - elasticsearch: - image: elasticsearch:8.9.0 - container_name: stillontime-elasticsearch - environment: - - discovery.type=single-node - - ES_JAVA_OPTS=-Xms512m -Xmx512m - - xpack.security.enabled=false - - xpack.security.enrollment.enabled=false - volumes: - - elasticsearch_data:/usr/share/elasticsearch/data - ports: - - "9200:9200" networks: - stillontime-network - restart: unless-stopped - healthcheck: - test: ["CMD-SHELL", "curl -f http://localhost:9200/_cluster/health || exit 1"] - interval: 30s - timeout: 10s - retries: 3 - - kibana: - image: kibana:8.9.0 - container_name: stillontime-kibana environment: - - ELASTICSEARCH_HOSTS=http://elasticsearch:9200 - ports: - - "5601:5601" - networks: - - stillontime-network - restart: unless-stopped - depends_on: - - elasticsearch - - logstash: - image: logstash:8.9.0 - container_name: stillontime-logstash - volumes: - - ./monitoring/logstash/config:/usr/share/logstash/config:ro - - ./logs:/usr/share/logstash/logs:ro - networks: - - stillontime-network - restart: unless-stopped - depends_on: - - elasticsearch + QDRANT__SERVICE__GRPC_PORT: 6334 - # Backup Service - backup: + backend: build: - context: ./backup + context: ./backend dockerfile: Dockerfile - container_name: stillontime-backup - environment: - - POSTGRES_HOST=postgres - - POSTGRES_DB=${POSTGRES_DB} - - POSTGRES_USER=${POSTGRES_USER} - - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} - - AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID} - - AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY} - - S3_BUCKET=${S3_BACKUP_BUCKET} - - BACKUP_SCHEDULE=0 2 * * * # Daily at 2 AM - volumes: - - ./backups:/backups - - postgres_data:/var/lib/postgresql/data:ro - networks: - - stillontime-network + target: prod restart: unless-stopped + environment: + NODE_ENV: production + DATABASE_URL: ${DB_CONNECTION_STRING?:postgresql://stillontime_user:change_me@postgres:5432/stillontime} + REDIS_URL: ${REDIS_URL?:redis://redis:6379} + QDRANT_URL: http://qdrant:6333 + PORT: ${BACKEND_PORT:-3001} + FRONTEND_URL: ${FRONTEND_URL?:http://frontend} depends_on: - postgres + - redis + - qdrant + networks: + - stillontime-network + ports: + - "${BACKEND_PORT:-3001}:${BACKEND_PORT:-3001}" - # Security Scanner - security-scanner: + frontend: build: - context: ./security + context: ./frontend dockerfile: Dockerfile - container_name: stillontime-security + target: prod + restart: unless-stopped environment: - - SCAN_INTERVAL=3600 # Hourly scans - - ALERT_WEBHOOK=${SECURITY_ALERT_WEBHOOK} - volumes: - - ./logs:/app/logs:ro - - ./security/config:/app/config:ro + VITE_API_URL: ${VITE_API_URL?:http://backend:${BACKEND_PORT:-3001}} + depends_on: + - backend networks: - stillontime-network - restart: unless-stopped + ports: + - "${FRONTEND_PORT:-3000}:80" volumes: postgres_data: - driver: local - redis_data: - driver: local - prometheus_data: - driver: local - grafana_data: - driver: local - elasticsearch_data: - driver: local networks: stillontime-network: driver: bridge - ipam: - config: - - subnet: 172.20.0.0/16 \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index dc10752..4b5a8f8 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,7 +1,6 @@ -version: '3.8' +version: '3.9' services: - # PostgreSQL Database postgres: image: postgres:15-alpine container_name: stillontime-postgres @@ -16,8 +15,8 @@ services: - ./backend/docker/init.sql:/docker-entrypoint-initdb.d/init.sql networks: - stillontime-network + profiles: [dev, prod] - # Redis Cache redis: image: redis:7-alpine container_name: stillontime-redis @@ -27,26 +26,27 @@ services: - redis_data:/data networks: - stillontime-network + profiles: [dev, prod] - # Qdrant Vector Database qdrant: image: qdrant/qdrant:v1.15.1 container_name: stillontime-qdrant ports: - - "6333:6333" # HTTP API - - "6334:6334" # gRPC + - "6333:6333" + - "6334:6334" volumes: - qdrant_data:/qdrant/storage networks: - stillontime-network environment: QDRANT__SERVICE__GRPC_PORT: 6334 + profiles: [dev, prod] - # Backend API backend: build: context: ./backend - dockerfile: Dockerfile.dev + target: dev + dockerfile: Dockerfile container_name: stillontime-backend environment: NODE_ENV: development @@ -68,12 +68,35 @@ services: networks: - stillontime-network command: npm run dev + profiles: [dev] + + backend-prod: + build: + context: ./backend + target: prod + dockerfile: Dockerfile + container_name: stillontime-backend-prod + environment: + NODE_ENV: production + DATABASE_URL: ${DB_CONNECTION_STRING?:postgresql://stillontime_user:stillontime_password@postgres:5432/stillontime_automation} + REDIS_URL: ${REDIS_URL?:redis://redis:6379} + PORT: 3001 + FRONTEND_URL: ${FRONTEND_URL?:http://frontend-prod} + ports: + - "3001:3001" + depends_on: + - postgres + - redis + - qdrant + networks: + - stillontime-network + profiles: [prod] - # Frontend React App frontend: build: context: ./frontend - dockerfile: Dockerfile.dev + target: dev + dockerfile: Dockerfile container_name: stillontime-frontend environment: VITE_API_URL: http://localhost:3001 @@ -86,7 +109,24 @@ services: - backend networks: - stillontime-network - command: npm run dev + command: npm run dev -- --host 0.0.0.0 + profiles: [dev] + + frontend-prod: + build: + context: ./frontend + target: prod + dockerfile: Dockerfile + container_name: stillontime-frontend-prod + environment: + VITE_API_URL: ${VITE_API_URL?:http://backend-prod:3001} + ports: + - "3000:80" + depends_on: + - backend-prod + networks: + - stillontime-network + profiles: [prod] volumes: postgres_data: @@ -95,4 +135,4 @@ volumes: networks: stillontime-network: - driver: bridge \ No newline at end of file + driver: bridge diff --git a/ANALYSIS_REPORT.md b/dokumentacja/ANALYSIS_REPORT.md similarity index 100% rename from ANALYSIS_REPORT.md rename to dokumentacja/ANALYSIS_REPORT.md diff --git a/CLAUDE.md b/dokumentacja/CLAUDE.md similarity index 100% rename from CLAUDE.md rename to dokumentacja/CLAUDE.md diff --git a/CLAUDE_old.md b/dokumentacja/CLAUDE_old.md similarity index 100% rename from CLAUDE_old.md rename to dokumentacja/CLAUDE_old.md diff --git a/CODENET_FINAL_SESSION_SUMMARY.md b/dokumentacja/CODENET_FINAL_SESSION_SUMMARY.md similarity index 100% rename from CODENET_FINAL_SESSION_SUMMARY.md rename to dokumentacja/CODENET_FINAL_SESSION_SUMMARY.md diff --git a/CODENET_IMPLEMENTATION_SUMMARY.md b/dokumentacja/CODENET_IMPLEMENTATION_SUMMARY.md similarity index 100% rename from CODENET_IMPLEMENTATION_SUMMARY.md rename to dokumentacja/CODENET_IMPLEMENTATION_SUMMARY.md diff --git a/CODENET_RULE_VALIDATION_SUMMARY.md b/dokumentacja/CODENET_RULE_VALIDATION_SUMMARY.md similarity index 100% rename from CODENET_RULE_VALIDATION_SUMMARY.md rename to dokumentacja/CODENET_RULE_VALIDATION_SUMMARY.md diff --git a/COMPLETE-DEPLOYMENT-GUIDE.md b/dokumentacja/COMPLETE-DEPLOYMENT-GUIDE.md similarity index 100% rename from COMPLETE-DEPLOYMENT-GUIDE.md rename to dokumentacja/COMPLETE-DEPLOYMENT-GUIDE.md diff --git a/CS_Automation_Technical_Documentation.md b/dokumentacja/CS_Automation_Technical_Documentation.md similarity index 100% rename from CS_Automation_Technical_Documentation.md rename to dokumentacja/CS_Automation_Technical_Documentation.md diff --git a/CS_Product_Requirements_Document.md b/dokumentacja/CS_Product_Requirements_Document.md similarity index 100% rename from CS_Product_Requirements_Document.md rename to dokumentacja/CS_Product_Requirements_Document.md diff --git a/CS_Technical_Architecture.md b/dokumentacja/CS_Technical_Architecture.md similarity index 100% rename from CS_Technical_Architecture.md rename to dokumentacja/CS_Technical_Architecture.md diff --git a/DEVELOPMENT_PROGRESS_UPDATE.md b/dokumentacja/DEVELOPMENT_PROGRESS_UPDATE.md similarity index 100% rename from DEVELOPMENT_PROGRESS_UPDATE.md rename to dokumentacja/DEVELOPMENT_PROGRESS_UPDATE.md diff --git a/DEV_ENVIRONMENT_SETUP.md b/dokumentacja/DEV_ENVIRONMENT_SETUP.md similarity index 100% rename from DEV_ENVIRONMENT_SETUP.md rename to dokumentacja/DEV_ENVIRONMENT_SETUP.md diff --git a/E2E_TESTING_SUMMARY.md b/dokumentacja/E2E_TESTING_SUMMARY.md similarity index 100% rename from E2E_TESTING_SUMMARY.md rename to dokumentacja/E2E_TESTING_SUMMARY.md diff --git a/FINAL_CODENET_STATUS.md b/dokumentacja/FINAL_CODENET_STATUS.md similarity index 100% rename from FINAL_CODENET_STATUS.md rename to dokumentacja/FINAL_CODENET_STATUS.md diff --git a/PHASE_1_DEVELOPMENT_KICKOFF.md b/dokumentacja/PHASE_1_DEVELOPMENT_KICKOFF.md similarity index 100% rename from PHASE_1_DEVELOPMENT_KICKOFF.md rename to dokumentacja/PHASE_1_DEVELOPMENT_KICKOFF.md diff --git a/PHASE_1_EXECUTION_STATUS.md b/dokumentacja/PHASE_1_EXECUTION_STATUS.md similarity index 100% rename from PHASE_1_EXECUTION_STATUS.md rename to dokumentacja/PHASE_1_EXECUTION_STATUS.md diff --git a/PHASE_2_COMPLETION_REPORT.md b/dokumentacja/PHASE_2_COMPLETION_REPORT.md similarity index 100% rename from PHASE_2_COMPLETION_REPORT.md rename to dokumentacja/PHASE_2_COMPLETION_REPORT.md diff --git a/PHASE_3_COMPLETION_REPORT.md b/dokumentacja/PHASE_3_COMPLETION_REPORT.md similarity index 100% rename from PHASE_3_COMPLETION_REPORT.md rename to dokumentacja/PHASE_3_COMPLETION_REPORT.md diff --git a/PRIVACY_POLICY.md b/dokumentacja/PRIVACY_POLICY.md similarity index 100% rename from PRIVACY_POLICY.md rename to dokumentacja/PRIVACY_POLICY.md diff --git a/PROJECT_CODENET_PLAN_STATUS.md b/dokumentacja/PROJECT_CODENET_PLAN_STATUS.md similarity index 100% rename from PROJECT_CODENET_PLAN_STATUS.md rename to dokumentacja/PROJECT_CODENET_PLAN_STATUS.md diff --git a/PROJECT_PLAN.md b/dokumentacja/PROJECT_PLAN.md similarity index 100% rename from PROJECT_PLAN.md rename to dokumentacja/PROJECT_PLAN.md diff --git a/dokumentacja/README.md b/dokumentacja/README.md new file mode 100644 index 0000000..f43316d --- /dev/null +++ b/dokumentacja/README.md @@ -0,0 +1,16 @@ +# Dokumentacja projektu StillOnTime + +Wszystkie materiały produktowe, techniczne i procesowe zostały skonsolidowane w tym katalogu. + +## Spis treści +- [`boot-matrix.md`](boot-matrix.md) – matryca instalacji/uruchomienia/testów. +- [`verification-checklist.md`](verification-checklist.md) – komendy weryfikacyjne. +- [`migrated-docs.md`](migrated-docs.md) – lista przeniesionych dokumentów z pierwotnych lokalizacji. +- [`rollback.md`](rollback.md) – procedura powrotu do tagu `pre-cleanup-*`. +- Katalogi tematyczne: + - `legacy-docs/` – oryginalne materiały historyczne (w tym poprzedni pipeline CI). + - `claude-flow/`, `claudedocs/` – notatki eksperymentalnych agentów. + - `coordination/` – uzgodnienia zespołów (SOP, planowanie sprintów). + - `serena-installation/` – instrukcje narzędzia Serena. + +Pozostałe pliki `.md` zachowują swoje pierwotne nazewnictwo. Zobacz `migrated-docs.md` w celu weryfikacji poprzednich ścieżek oraz `docs-index.csv` dla łatwej filtracji. diff --git a/RENAME_SUMMARY.md b/dokumentacja/RENAME_SUMMARY.md similarity index 100% rename from RENAME_SUMMARY.md rename to dokumentacja/RENAME_SUMMARY.md diff --git a/SERENA_SETUP.md b/dokumentacja/SERENA_SETUP.md similarity index 98% rename from SERENA_SETUP.md rename to dokumentacja/SERENA_SETUP.md index 667d79e..83d2691 100644 --- a/SERENA_SETUP.md +++ b/dokumentacja/SERENA_SETUP.md @@ -1,3 +1,4 @@ +> **Uwaga:** Katalog instalacyjny został przeniesiony do `dokumentacja/serena-installation/`. # Serena AI Development Assistant - Setup Guide ## Overview diff --git a/SESSION_FINAL_SUMMARY.md b/dokumentacja/SESSION_FINAL_SUMMARY.md similarity index 100% rename from SESSION_FINAL_SUMMARY.md rename to dokumentacja/SESSION_FINAL_SUMMARY.md diff --git a/STREAM_A_CORE_INFRASTRUCTURE.md b/dokumentacja/STREAM_A_CORE_INFRASTRUCTURE.md similarity index 100% rename from STREAM_A_CORE_INFRASTRUCTURE.md rename to dokumentacja/STREAM_A_CORE_INFRASTRUCTURE.md diff --git a/STREAM_B_API_INTEGRATION.md b/dokumentacja/STREAM_B_API_INTEGRATION.md similarity index 100% rename from STREAM_B_API_INTEGRATION.md rename to dokumentacja/STREAM_B_API_INTEGRATION.md diff --git a/STREAM_C_FRONTEND_FOUNDATION.md b/dokumentacja/STREAM_C_FRONTEND_FOUNDATION.md similarity index 100% rename from STREAM_C_FRONTEND_FOUNDATION.md rename to dokumentacja/STREAM_C_FRONTEND_FOUNDATION.md diff --git a/STREAM_D_SYSTEM_INTEGRATION.md b/dokumentacja/STREAM_D_SYSTEM_INTEGRATION.md similarity index 100% rename from STREAM_D_SYSTEM_INTEGRATION.md rename to dokumentacja/STREAM_D_SYSTEM_INTEGRATION.md diff --git a/TASK_11_3_IMPLEMENTATION_SUMMARY.md b/dokumentacja/TASK_11_3_IMPLEMENTATION_SUMMARY.md similarity index 100% rename from TASK_11_3_IMPLEMENTATION_SUMMARY.md rename to dokumentacja/TASK_11_3_IMPLEMENTATION_SUMMARY.md diff --git a/TASK_12_IMPLEMENTATION_SUMMARY.md b/dokumentacja/TASK_12_IMPLEMENTATION_SUMMARY.md similarity index 100% rename from TASK_12_IMPLEMENTATION_SUMMARY.md rename to dokumentacja/TASK_12_IMPLEMENTATION_SUMMARY.md diff --git a/TASK_9_3_IMPLEMENTATION_SUMMARY.md b/dokumentacja/TASK_9_3_IMPLEMENTATION_SUMMARY.md similarity index 100% rename from TASK_9_3_IMPLEMENTATION_SUMMARY.md rename to dokumentacja/TASK_9_3_IMPLEMENTATION_SUMMARY.md diff --git a/TEAM_STARTUP_GUIDE.md b/dokumentacja/TEAM_STARTUP_GUIDE.md similarity index 100% rename from TEAM_STARTUP_GUIDE.md rename to dokumentacja/TEAM_STARTUP_GUIDE.md diff --git a/TEAM_WORKFLOWS.md b/dokumentacja/TEAM_WORKFLOWS.md similarity index 100% rename from TEAM_WORKFLOWS.md rename to dokumentacja/TEAM_WORKFLOWS.md diff --git a/TESTING_REPORT.md b/dokumentacja/TESTING_REPORT.md similarity index 100% rename from TESTING_REPORT.md rename to dokumentacja/TESTING_REPORT.md diff --git a/WARP.md b/dokumentacja/WARP.md similarity index 100% rename from WARP.md rename to dokumentacja/WARP.md diff --git a/dokumentacja/boot-matrix.md b/dokumentacja/boot-matrix.md new file mode 100644 index 0000000..923c9d5 --- /dev/null +++ b/dokumentacja/boot-matrix.md @@ -0,0 +1,28 @@ +# Matryca instalacji, buildów i testów + +| Moduł | Install | Build | Run (dev) | Run (prod) | Test | Uwagi | +| --- | --- | --- | --- | --- | --- | --- | +| Root Monorepo | `npm install` | `npm run build` | `npm run dev` | `npm run build && npm run start` | `npm test` | Obsługuje workspace `backend`, `frontend` | +| Backend | `cd backend && npm ci` | `cd backend && npm run build` | `cd backend && npm run dev:simple` | `cd backend && npm run start` | `cd backend && npm test` | Wymaga `DATABASE_URL`, `REDIS_URL`, `GOOGLE_*`, `TWILIO_*` | +| Frontend | `cd frontend && npm ci` | `cd frontend && npm run build` | `cd frontend && npm run dev` | `cd frontend && npm run preview -- --host` | `cd frontend && npm test` | Potrzebny endpoint API (`VITE_API_URL`) | +| Mobile | `cd mobile && npm install` | `npx expo prebuild` | `npx expo start` | `eas build --platform ios|android` | `npx expo test` | Oznaczony jako `experimental` | +| E2E | `npm install` | `npm run build:frontend` | `npx playwright test smoke-test.spec.ts` | `npx playwright test` | `npx playwright test` | Testy UI, logi w `logs/playwright/` | +| Docker Compose | `docker compose pull` | `docker compose build` | `docker compose --profile dev up` | `docker compose -f docker-compose.production.yml --profile prod up` | `docker compose run backend npm test` | Ustaw `` w `.env` | +| CI Pipeline | `actions/setup-node` | `npm run build` | `npm run start --if-present` | n/a | `npm test && npm run lint && npm run test:e2e:smoke` | Definicja w `.github/workflows/ci.yaml` | + +## Szybki start +```bash +./scripts/bootstrap.sh --profile dev +./scripts/build.sh --profile dev +./scripts/start.sh --profile dev --target docker +./scripts/smoke-test.sh --profile dev +``` + +## Artefakty +- Logi: `logs/*.log` +- Raporty: `analysis/` +- Backups: `BACKUP/` + +## TODO(decision) +- Potwierdzić `` dla QA. +- Zdefiniować `` i `` w `.env` / `config/`. diff --git a/chat_err.md b/dokumentacja/chat_err.md similarity index 100% rename from chat_err.md rename to dokumentacja/chat_err.md diff --git a/claude-flow b/dokumentacja/claude-flow old mode 100755 new mode 100644 similarity index 100% rename from claude-flow rename to dokumentacja/claude-flow diff --git a/claudedocs/API_QUICK_REFERENCE.md b/dokumentacja/claudedocs/API_QUICK_REFERENCE.md similarity index 100% rename from claudedocs/API_QUICK_REFERENCE.md rename to dokumentacja/claudedocs/API_QUICK_REFERENCE.md diff --git a/claudedocs/API_SETUP_GUIDE.md b/dokumentacja/claudedocs/API_SETUP_GUIDE.md similarity index 100% rename from claudedocs/API_SETUP_GUIDE.md rename to dokumentacja/claudedocs/API_SETUP_GUIDE.md diff --git a/claudedocs/INTERACTIVE_API_SETUP.md b/dokumentacja/claudedocs/INTERACTIVE_API_SETUP.md similarity index 100% rename from claudedocs/INTERACTIVE_API_SETUP.md rename to dokumentacja/claudedocs/INTERACTIVE_API_SETUP.md diff --git a/coordination/memory_bank/swarm-session-template.json b/dokumentacja/coordination/memory_bank/swarm-session-template.json similarity index 100% rename from coordination/memory_bank/swarm-session-template.json rename to dokumentacja/coordination/memory_bank/swarm-session-template.json diff --git a/coordination/orchestration/HEALTH_CHECK_REPORT.md b/dokumentacja/coordination/orchestration/HEALTH_CHECK_REPORT.md similarity index 100% rename from coordination/orchestration/HEALTH_CHECK_REPORT.md rename to dokumentacja/coordination/orchestration/HEALTH_CHECK_REPORT.md diff --git a/coordination/orchestration/NEURAL_TRAINING_SESSION.md b/dokumentacja/coordination/orchestration/NEURAL_TRAINING_SESSION.md similarity index 100% rename from coordination/orchestration/NEURAL_TRAINING_SESSION.md rename to dokumentacja/coordination/orchestration/NEURAL_TRAINING_SESSION.md diff --git a/coordination/orchestration/README.md b/dokumentacja/coordination/orchestration/README.md similarity index 100% rename from coordination/orchestration/README.md rename to dokumentacja/coordination/orchestration/README.md diff --git a/coordination/orchestration/SESSION_COMPLETE.md b/dokumentacja/coordination/orchestration/SESSION_COMPLETE.md similarity index 100% rename from coordination/orchestration/SESSION_COMPLETE.md rename to dokumentacja/coordination/orchestration/SESSION_COMPLETE.md diff --git a/coordination/orchestration/SWARM_ACTIVATION_LOG.md b/dokumentacja/coordination/orchestration/SWARM_ACTIVATION_LOG.md similarity index 100% rename from coordination/orchestration/SWARM_ACTIVATION_LOG.md rename to dokumentacja/coordination/orchestration/SWARM_ACTIVATION_LOG.md diff --git a/coordination/orchestration/SWARM_SESSION_SUMMARY.md b/dokumentacja/coordination/orchestration/SWARM_SESSION_SUMMARY.md similarity index 100% rename from coordination/orchestration/SWARM_SESSION_SUMMARY.md rename to dokumentacja/coordination/orchestration/SWARM_SESSION_SUMMARY.md diff --git a/coordination/orchestration/SWARM_STATUS.md b/dokumentacja/coordination/orchestration/SWARM_STATUS.md similarity index 100% rename from coordination/orchestration/SWARM_STATUS.md rename to dokumentacja/coordination/orchestration/SWARM_STATUS.md diff --git a/coordination/orchestration/agent-profiles.md b/dokumentacja/coordination/orchestration/agent-profiles.md similarity index 100% rename from coordination/orchestration/agent-profiles.md rename to dokumentacja/coordination/orchestration/agent-profiles.md diff --git a/coordination/orchestration/swarm-init.md b/dokumentacja/coordination/orchestration/swarm-init.md similarity index 100% rename from coordination/orchestration/swarm-init.md rename to dokumentacja/coordination/orchestration/swarm-init.md diff --git a/coordination/orchestration/swarm-strategies.md b/dokumentacja/coordination/orchestration/swarm-strategies.md similarity index 100% rename from coordination/orchestration/swarm-strategies.md rename to dokumentacja/coordination/orchestration/swarm-strategies.md diff --git a/coordination/orchestration/systemPatterns.md b/dokumentacja/coordination/orchestration/systemPatterns.md similarity index 100% rename from coordination/orchestration/systemPatterns.md rename to dokumentacja/coordination/orchestration/systemPatterns.md diff --git a/coordination/subtasks/bug-fixing-test-failures-20251012.md b/dokumentacja/coordination/subtasks/bug-fixing-test-failures-20251012.md similarity index 100% rename from coordination/subtasks/bug-fixing-test-failures-20251012.md rename to dokumentacja/coordination/subtasks/bug-fixing-test-failures-20251012.md diff --git a/cursor_agent_types_overview.md b/dokumentacja/cursor_agent_types_overview.md similarity index 100% rename from cursor_agent_types_overview.md rename to dokumentacja/cursor_agent_types_overview.md diff --git a/cursor_agent_types_overview_b.md b/dokumentacja/cursor_agent_types_overview_b.md similarity index 100% rename from cursor_agent_types_overview_b.md rename to dokumentacja/cursor_agent_types_overview_b.md diff --git a/dokumentacja/docs-index.csv b/dokumentacja/docs-index.csv new file mode 100644 index 0000000..3cbd713 --- /dev/null +++ b/dokumentacja/docs-index.csv @@ -0,0 +1,46 @@ +new_path,old_path,category +"dokumentacja/ANALYSIS_REPORT.md","ANALYSIS_REPORT.md","report" +"dokumentacja/CLAUDE.md","CLAUDE.md","experiment" +"dokumentacja/CLAUDE_old.md","CLAUDE_old.md","experiment" +"dokumentacja/CODENET_FINAL_SESSION_SUMMARY.md","CODENET_FINAL_SESSION_SUMMARY.md","codenet" +"dokumentacja/CODENET_IMPLEMENTATION_SUMMARY.md","CODENET_IMPLEMENTATION_SUMMARY.md","codenet" +"dokumentacja/CODENET_RULE_VALIDATION_SUMMARY.md","CODENET_RULE_VALIDATION_SUMMARY.md","codenet" +"dokumentacja/COMPLETE-DEPLOYMENT-GUIDE.md","COMPLETE-DEPLOYMENT-GUIDE.md","guide" +"dokumentacja/CS_Automation_Technical_Documentation.md","CS_Automation_Technical_Documentation.md","architecture" +"dokumentacja/CS_Product_Requirements_Document.md","CS_Product_Requirements_Document.md","product" +"dokumentacja/CS_Technical_Architecture.md","CS_Technical_Architecture.md","architecture" +"dokumentacja/DEVELOPMENT_PROGRESS_UPDATE.md","DEVELOPMENT_PROGRESS_UPDATE.md","status" +"dokumentacja/DEV_ENVIRONMENT_SETUP.md","DEV_ENVIRONMENT_SETUP.md","setup" +"dokumentacja/E2E_TESTING_SUMMARY.md","E2E_TESTING_SUMMARY.md","testing" +"dokumentacja/FINAL_CODENET_STATUS.md","FINAL_CODENET_STATUS.md","codenet" +"dokumentacja/PHASE_1_DEVELOPMENT_KICKOFF.md","PHASE_1_DEVELOPMENT_KICKOFF.md","phase" +"dokumentacja/PHASE_1_EXECUTION_STATUS.md","PHASE_1_EXECUTION_STATUS.md","phase" +"dokumentacja/PHASE_2_COMPLETION_REPORT.md","PHASE_2_COMPLETION_REPORT.md","phase" +"dokumentacja/PHASE_3_COMPLETION_REPORT.md","PHASE_3_COMPLETION_REPORT.md","phase" +"dokumentacja/PRIVACY_POLICY.md","PRIVACY_POLICY.md","policy" +"dokumentacja/PROJECT_CODENET_PLAN_STATUS.md","PROJECT_CODENET_PLAN_STATUS.md","codenet" +"dokumentacja/PROJECT_PLAN.md","PROJECT_PLAN.md","plan" +"dokumentacja/RENAME_SUMMARY.md","RENAME_SUMMARY.md","change-log" +"dokumentacja/SERENA_SETUP.md","SERENA_SETUP.md","setup" +"dokumentacja/SESSION_FINAL_SUMMARY.md","SESSION_FINAL_SUMMARY.md","summary" +"dokumentacja/STREAM_A_CORE_INFRASTRUCTURE.md","STREAM_A_CORE_INFRASTRUCTURE.md","stream" +"dokumentacja/STREAM_B_API_INTEGRATION.md","STREAM_B_API_INTEGRATION.md","stream" +"dokumentacja/STREAM_C_FRONTEND_FOUNDATION.md","STREAM_C_FRONTEND_FOUNDATION.md","stream" +"dokumentacja/STREAM_D_SYSTEM_INTEGRATION.md","STREAM_D_SYSTEM_INTEGRATION.md","stream" +"dokumentacja/TASK_11_3_IMPLEMENTATION_SUMMARY.md","TASK_11_3_IMPLEMENTATION_SUMMARY.md","task" +"dokumentacja/TASK_12_IMPLEMENTATION_SUMMARY.md","TASK_12_IMPLEMENTATION_SUMMARY.md","task" +"dokumentacja/TASK_9_3_IMPLEMENTATION_SUMMARY.md","TASK_9_3_IMPLEMENTATION_SUMMARY.md","task" +"dokumentacja/TEAM_STARTUP_GUIDE.md","TEAM_STARTUP_GUIDE.md","guide" +"dokumentacja/TEAM_WORKFLOWS.md","TEAM_WORKFLOWS.md","process" +"dokumentacja/TESTING_REPORT.md","TESTING_REPORT.md","testing" +"dokumentacja/WARP.md","WARP.md","reference" +"dokumentacja/chat_err.md","chat_err.md","incident" +"dokumentacja/err2.md","err2.md","incident" +"dokumentacja/kilo_code_task_sep-27-2025_12-41-43-pm.md","kilo_code_task_sep-27-2025_12-41-43-pm.md","archive" +"dokumentacja/setup-privacy-hosting.md","setup-privacy-hosting.md","policy" +"dokumentacja/legacy-docs","docs","legacy" +"dokumentacja/claude-flow","claude-flow","experiment" +"dokumentacja/claudedocs","claudedocs","experiment" +"dokumentacja/coordination","coordination","process" +"dokumentacja/serena-installation","serena-installation","setup" +"dokumentacja/legacy-docs/ci-cd-pipeline.yml",".github/workflows/ci-cd-pipeline.yml","legacy-ci" diff --git a/err2.md b/dokumentacja/err2.md similarity index 100% rename from err2.md rename to dokumentacja/err2.md diff --git a/kilo_code_task_sep-27-2025_12-41-43-pm.md b/dokumentacja/kilo_code_task_sep-27-2025_12-41-43-pm.md similarity index 100% rename from kilo_code_task_sep-27-2025_12-41-43-pm.md rename to dokumentacja/kilo_code_task_sep-27-2025_12-41-43-pm.md diff --git a/docs/ADMIN_MANUAL.md b/dokumentacja/legacy-docs/ADMIN_MANUAL.md similarity index 100% rename from docs/ADMIN_MANUAL.md rename to dokumentacja/legacy-docs/ADMIN_MANUAL.md diff --git a/docs/API_REFERENCE.md b/dokumentacja/legacy-docs/API_REFERENCE.md similarity index 100% rename from docs/API_REFERENCE.md rename to dokumentacja/legacy-docs/API_REFERENCE.md diff --git a/docs/CODENET_MANDATORY_FUNCTIONS.md b/dokumentacja/legacy-docs/CODENET_MANDATORY_FUNCTIONS.md similarity index 100% rename from docs/CODENET_MANDATORY_FUNCTIONS.md rename to dokumentacja/legacy-docs/CODENET_MANDATORY_FUNCTIONS.md diff --git a/docs/CODENET_RULE_TEST_RESULTS.md b/dokumentacja/legacy-docs/CODENET_RULE_TEST_RESULTS.md similarity index 100% rename from docs/CODENET_RULE_TEST_RESULTS.md rename to dokumentacja/legacy-docs/CODENET_RULE_TEST_RESULTS.md diff --git a/docs/CODENET_UNIVERSAL_DEPLOYMENT_GUIDE.md b/dokumentacja/legacy-docs/CODENET_UNIVERSAL_DEPLOYMENT_GUIDE.md similarity index 100% rename from docs/CODENET_UNIVERSAL_DEPLOYMENT_GUIDE.md rename to dokumentacja/legacy-docs/CODENET_UNIVERSAL_DEPLOYMENT_GUIDE.md diff --git a/docs/CONFIGURATION_PAGE_INTEGRATION.md b/dokumentacja/legacy-docs/CONFIGURATION_PAGE_INTEGRATION.md similarity index 100% rename from docs/CONFIGURATION_PAGE_INTEGRATION.md rename to dokumentacja/legacy-docs/CONFIGURATION_PAGE_INTEGRATION.md diff --git a/docs/DEPLOYMENT_GUIDE.md b/dokumentacja/legacy-docs/DEPLOYMENT_GUIDE.md similarity index 100% rename from docs/DEPLOYMENT_GUIDE.md rename to dokumentacja/legacy-docs/DEPLOYMENT_GUIDE.md diff --git a/docs/EMAIL_FETCHING_TEST_RESULTS.md b/dokumentacja/legacy-docs/EMAIL_FETCHING_TEST_RESULTS.md similarity index 100% rename from docs/EMAIL_FETCHING_TEST_RESULTS.md rename to dokumentacja/legacy-docs/EMAIL_FETCHING_TEST_RESULTS.md diff --git a/docs/GLM_46_INTEGRATION_STILLONTIME.md b/dokumentacja/legacy-docs/GLM_46_INTEGRATION_STILLONTIME.md similarity index 100% rename from docs/GLM_46_INTEGRATION_STILLONTIME.md rename to dokumentacja/legacy-docs/GLM_46_INTEGRATION_STILLONTIME.md diff --git a/docs/KYSELY_MIGRATION_COMPLETE.md b/dokumentacja/legacy-docs/KYSELY_MIGRATION_COMPLETE.md similarity index 100% rename from docs/KYSELY_MIGRATION_COMPLETE.md rename to dokumentacja/legacy-docs/KYSELY_MIGRATION_COMPLETE.md diff --git a/docs/KYSELY_MIGRATION_STATUS.md b/dokumentacja/legacy-docs/KYSELY_MIGRATION_STATUS.md similarity index 100% rename from docs/KYSELY_MIGRATION_STATUS.md rename to dokumentacja/legacy-docs/KYSELY_MIGRATION_STATUS.md diff --git a/docs/MIGRATION_COMPLETION_GUIDE.md b/dokumentacja/legacy-docs/MIGRATION_COMPLETION_GUIDE.md similarity index 100% rename from docs/MIGRATION_COMPLETION_GUIDE.md rename to dokumentacja/legacy-docs/MIGRATION_COMPLETION_GUIDE.md diff --git a/docs/MIGRATION_STATUS_FINAL.md b/dokumentacja/legacy-docs/MIGRATION_STATUS_FINAL.md similarity index 100% rename from docs/MIGRATION_STATUS_FINAL.md rename to dokumentacja/legacy-docs/MIGRATION_STATUS_FINAL.md diff --git a/docs/OAUTH_IMPLEMENTATION_SUMMARY.md b/dokumentacja/legacy-docs/OAUTH_IMPLEMENTATION_SUMMARY.md similarity index 100% rename from docs/OAUTH_IMPLEMENTATION_SUMMARY.md rename to dokumentacja/legacy-docs/OAUTH_IMPLEMENTATION_SUMMARY.md diff --git a/docs/ONE_CLICK_SETUP_IMPLEMENTATION.md b/dokumentacja/legacy-docs/ONE_CLICK_SETUP_IMPLEMENTATION.md similarity index 100% rename from docs/ONE_CLICK_SETUP_IMPLEMENTATION.md rename to dokumentacja/legacy-docs/ONE_CLICK_SETUP_IMPLEMENTATION.md diff --git a/docs/ONE_CLICK_STARTUP_EDGE_CASES.md b/dokumentacja/legacy-docs/ONE_CLICK_STARTUP_EDGE_CASES.md similarity index 100% rename from docs/ONE_CLICK_STARTUP_EDGE_CASES.md rename to dokumentacja/legacy-docs/ONE_CLICK_STARTUP_EDGE_CASES.md diff --git a/docs/ONE_CLICK_STARTUP_TEST_REPORT.md b/dokumentacja/legacy-docs/ONE_CLICK_STARTUP_TEST_REPORT.md similarity index 100% rename from docs/ONE_CLICK_STARTUP_TEST_REPORT.md rename to dokumentacja/legacy-docs/ONE_CLICK_STARTUP_TEST_REPORT.md diff --git a/docs/PERFORMANCE_ANALYSIS_2025-10-12.md b/dokumentacja/legacy-docs/PERFORMANCE_ANALYSIS_2025-10-12.md similarity index 100% rename from docs/PERFORMANCE_ANALYSIS_2025-10-12.md rename to dokumentacja/legacy-docs/PERFORMANCE_ANALYSIS_2025-10-12.md diff --git a/docs/PROJECT_CODENET_INTEGRATION.md b/dokumentacja/legacy-docs/PROJECT_CODENET_INTEGRATION.md similarity index 100% rename from docs/PROJECT_CODENET_INTEGRATION.md rename to dokumentacja/legacy-docs/PROJECT_CODENET_INTEGRATION.md diff --git a/docs/SECURITY_AUDIT_REPORT.md b/dokumentacja/legacy-docs/SECURITY_AUDIT_REPORT.md similarity index 100% rename from docs/SECURITY_AUDIT_REPORT.md rename to dokumentacja/legacy-docs/SECURITY_AUDIT_REPORT.md diff --git a/docs/SECURITY_FIXES_2025-10-12.md b/dokumentacja/legacy-docs/SECURITY_FIXES_2025-10-12.md similarity index 100% rename from docs/SECURITY_FIXES_2025-10-12.md rename to dokumentacja/legacy-docs/SECURITY_FIXES_2025-10-12.md diff --git a/docs/SECURITY_QUICK_REFERENCE.md b/dokumentacja/legacy-docs/SECURITY_QUICK_REFERENCE.md similarity index 100% rename from docs/SECURITY_QUICK_REFERENCE.md rename to dokumentacja/legacy-docs/SECURITY_QUICK_REFERENCE.md diff --git a/docs/SECURITY_REMEDIATION_TRACKING.md b/dokumentacja/legacy-docs/SECURITY_REMEDIATION_TRACKING.md similarity index 100% rename from docs/SECURITY_REMEDIATION_TRACKING.md rename to dokumentacja/legacy-docs/SECURITY_REMEDIATION_TRACKING.md diff --git a/docs/SESSION_COMPLETION_SUMMARY.md b/dokumentacja/legacy-docs/SESSION_COMPLETION_SUMMARY.md similarity index 100% rename from docs/SESSION_COMPLETION_SUMMARY.md rename to dokumentacja/legacy-docs/SESSION_COMPLETION_SUMMARY.md diff --git a/docs/SLASH_COMMANDS_REFERENCE.md b/dokumentacja/legacy-docs/SLASH_COMMANDS_REFERENCE.md similarity index 100% rename from docs/SLASH_COMMANDS_REFERENCE.md rename to dokumentacja/legacy-docs/SLASH_COMMANDS_REFERENCE.md diff --git a/docs/TESTER_DELIVERABLES_SUMMARY.md b/dokumentacja/legacy-docs/TESTER_DELIVERABLES_SUMMARY.md similarity index 100% rename from docs/TESTER_DELIVERABLES_SUMMARY.md rename to dokumentacja/legacy-docs/TESTER_DELIVERABLES_SUMMARY.md diff --git a/.github/workflows/ci-cd-pipeline.yml b/dokumentacja/legacy-docs/ci-cd-pipeline.yml similarity index 100% rename from .github/workflows/ci-cd-pipeline.yml rename to dokumentacja/legacy-docs/ci-cd-pipeline.yml diff --git a/docs/configuration-implementation-checklist.md b/dokumentacja/legacy-docs/configuration-implementation-checklist.md similarity index 100% rename from docs/configuration-implementation-checklist.md rename to dokumentacja/legacy-docs/configuration-implementation-checklist.md diff --git a/docs/configuration-page-design-summary.md b/dokumentacja/legacy-docs/configuration-page-design-summary.md similarity index 100% rename from docs/configuration-page-design-summary.md rename to dokumentacja/legacy-docs/configuration-page-design-summary.md diff --git a/docs/configuration-page-design.md b/dokumentacja/legacy-docs/configuration-page-design.md similarity index 100% rename from docs/configuration-page-design.md rename to dokumentacja/legacy-docs/configuration-page-design.md diff --git a/docs/configuration-page-mockups.md b/dokumentacja/legacy-docs/configuration-page-mockups.md similarity index 100% rename from docs/configuration-page-mockups.md rename to dokumentacja/legacy-docs/configuration-page-mockups.md diff --git a/docs/oauth-config-page-design.json b/dokumentacja/legacy-docs/oauth-config-page-design.json similarity index 100% rename from docs/oauth-config-page-design.json rename to dokumentacja/legacy-docs/oauth-config-page-design.json diff --git a/docs/oauth-performance-analysis.md b/dokumentacja/legacy-docs/oauth-performance-analysis.md similarity index 100% rename from docs/oauth-performance-analysis.md rename to dokumentacja/legacy-docs/oauth-performance-analysis.md diff --git a/docs/performance-audit-report.md b/dokumentacja/legacy-docs/performance-audit-report.md similarity index 100% rename from docs/performance-audit-report.md rename to dokumentacja/legacy-docs/performance-audit-report.md diff --git a/docs/privacy/PRIVACY_POLICY.md b/dokumentacja/legacy-docs/privacy/PRIVACY_POLICY.md similarity index 100% rename from docs/privacy/PRIVACY_POLICY.md rename to dokumentacja/legacy-docs/privacy/PRIVACY_POLICY.md diff --git a/docs/privacy/index.html b/dokumentacja/legacy-docs/privacy/index.html similarity index 100% rename from docs/privacy/index.html rename to dokumentacja/legacy-docs/privacy/index.html diff --git a/docs/system-design-assessment.md b/dokumentacja/legacy-docs/system-design-assessment.md similarity index 100% rename from docs/system-design-assessment.md rename to dokumentacja/legacy-docs/system-design-assessment.md diff --git a/dokumentacja/migrated-docs.md b/dokumentacja/migrated-docs.md new file mode 100644 index 0000000..3e98321 --- /dev/null +++ b/dokumentacja/migrated-docs.md @@ -0,0 +1,50 @@ +# Migracja dokumentacji + +| Nowa ścieżka | Poprzednia ścieżka | Powód migracji | +| --- | --- | --- | +| `dokumentacja/ANALYSIS_REPORT.md` | `./ANALYSIS_REPORT.md` | Konsolidacja raportów w jednym katalogu. | +| `dokumentacja/CLAUDE.md` | `./CLAUDE.md` | Przeniesienie notatek eksperymentalnych. | +| `dokumentacja/CLAUDE_old.md` | `./CLAUDE_old.md` | J.w. | +| `dokumentacja/CODENET_FINAL_SESSION_SUMMARY.md` | `./CODENET_FINAL_SESSION_SUMMARY.md` | Jedno miejsce na raporty CodeNet. | +| `dokumentacja/CODENET_IMPLEMENTATION_SUMMARY.md` | `./CODENET_IMPLEMENTATION_SUMMARY.md` | Konsolidacja. | +| `dokumentacja/CODENET_RULE_VALIDATION_SUMMARY.md` | `./CODENET_RULE_VALIDATION_SUMMARY.md` | Konsolidacja. | +| `dokumentacja/COMPLETE-DEPLOYMENT-GUIDE.md` | `./COMPLETE-DEPLOYMENT-GUIDE.md` | Ujednolicenie lokalizacji instrukcji. | +| `dokumentacja/CS_Automation_Technical_Documentation.md` | `./CS_Automation_Technical_Documentation.md` | Centralizacja dokumentacji technicznej. | +| `dokumentacja/CS_Product_Requirements_Document.md` | `./CS_Product_Requirements_Document.md` | J.w. | +| `dokumentacja/CS_Technical_Architecture.md` | `./CS_Technical_Architecture.md` | J.w. | +| `dokumentacja/DEVELOPMENT_PROGRESS_UPDATE.md` | `./DEVELOPMENT_PROGRESS_UPDATE.md` | Ujednolicenie raportów statusowych. | +| `dokumentacja/DEV_ENVIRONMENT_SETUP.md` | `./DEV_ENVIRONMENT_SETUP.md` | Centralizacja instrukcji środowiskowych. | +| `dokumentacja/E2E_TESTING_SUMMARY.md` | `./E2E_TESTING_SUMMARY.md` | Konsolidacja raportów testowych. | +| `dokumentacja/FINAL_CODENET_STATUS.md` | `./FINAL_CODENET_STATUS.md` | Konsolidacja. | +| `dokumentacja/PHASE_1_DEVELOPMENT_KICKOFF.md` | `./PHASE_1_DEVELOPMENT_KICKOFF.md` | Ujednolicenie planów fazowych. | +| `dokumentacja/PHASE_1_EXECUTION_STATUS.md` | `./PHASE_1_EXECUTION_STATUS.md` | J.w. | +| `dokumentacja/PHASE_2_COMPLETION_REPORT.md` | `./PHASE_2_COMPLETION_REPORT.md` | J.w. | +| `dokumentacja/PHASE_3_COMPLETION_REPORT.md` | `./PHASE_3_COMPLETION_REPORT.md` | J.w. | +| `dokumentacja/PRIVACY_POLICY.md` | `./PRIVACY_POLICY.md` | Wszystkie polityki w jednym miejscu. | +| `dokumentacja/PROJECT_CODENET_PLAN_STATUS.md` | `./PROJECT_CODENET_PLAN_STATUS.md` | Konsolidacja. | +| `dokumentacja/PROJECT_PLAN.md` | `./PROJECT_PLAN.md` | Konsolidacja. | +| `dokumentacja/RENAME_SUMMARY.md` | `./RENAME_SUMMARY.md` | Konsolidacja. | +| `dokumentacja/SERENA_SETUP.md` | `./SERENA_SETUP.md` | J.w. | +| `dokumentacja/SESSION_FINAL_SUMMARY.md` | `./SESSION_FINAL_SUMMARY.md` | Konsolidacja. | +| `dokumentacja/STREAM_A_CORE_INFRASTRUCTURE.md` | `./STREAM_A_CORE_INFRASTRUCTURE.md` | Konsolidacja strumieni prac. | +| `dokumentacja/STREAM_B_API_INTEGRATION.md` | `./STREAM_B_API_INTEGRATION.md` | J.w. | +| `dokumentacja/STREAM_C_FRONTEND_FOUNDATION.md` | `./STREAM_C_FRONTEND_FOUNDATION.md` | J.w. | +| `dokumentacja/STREAM_D_SYSTEM_INTEGRATION.md` | `./STREAM_D_SYSTEM_INTEGRATION.md` | J.w. | +| `dokumentacja/TASK_11_3_IMPLEMENTATION_SUMMARY.md` | `./TASK_11_3_IMPLEMENTATION_SUMMARY.md` | Konsolidacja. | +| `dokumentacja/TASK_12_IMPLEMENTATION_SUMMARY.md` | `./TASK_12_IMPLEMENTATION_SUMMARY.md` | Konsolidacja. | +| `dokumentacja/TASK_9_3_IMPLEMENTATION_SUMMARY.md` | `./TASK_9_3_IMPLEMENTATION_SUMMARY.md` | Konsolidacja. | +| `dokumentacja/TEAM_STARTUP_GUIDE.md` | `./TEAM_STARTUP_GUIDE.md` | Konsolidacja. | +| `dokumentacja/TEAM_WORKFLOWS.md` | `./TEAM_WORKFLOWS.md` | Konsolidacja. | +| `dokumentacja/TESTING_REPORT.md` | `./TESTING_REPORT.md` | Konsolidacja raportów testowych. | +| `dokumentacja/WARP.md` | `./WARP.md` | Przeniesienie materiałów referencyjnych. | +| `dokumentacja/chat_err.md` | `./chat_err.md` | Centralizacja notatek debugowania. | +| `dokumentacja/err2.md` | `./err2.md` | J.w. | +| `dokumentacja/kilo_code_task_sep-27-2025_12-41-43-pm.md` | `./kilo_code_task_sep-27-2025_12-41-43-pm.md` | Konsolidacja artefaktów historycznych. | +| `dokumentacja/setup-privacy-hosting.md` | `./setup-privacy-hosting.md` | Centralizacja polityk prywatności. | +| `dokumentacja/legacy-docs/` | `./docs/` | Zarchiwizowane materiały. +| `dokumentacja/claude-flow/` | `./claude-flow/` | Konsolidacja eksperymentów. | +| `dokumentacja/claudedocs/` | `./claudedocs/` | Konsolidacja eksperymentów. | +| `dokumentacja/coordination/` | `./coordination/` | Dokumenty koordynacyjne. | +| `dokumentacja/serena-installation/` | `./serena-installation/` | Instrukcje narzędzia Serena. | + +| `dokumentacja/legacy-docs/ci-cd-pipeline.yml` | `.github/workflows/ci-cd-pipeline.yml` | Zachowany pipeline historyczny. | diff --git a/dokumentacja/rollback.md b/dokumentacja/rollback.md new file mode 100644 index 0000000..4f12ea2 --- /dev/null +++ b/dokumentacja/rollback.md @@ -0,0 +1,27 @@ +# Plan rollbacku do `pre-cleanup-*` + +1. Zatrzymaj działające usługi (`docker compose down`). +2. Stwórz backup bieżącego stanu (opcjonalnie `git branch backup/`). +3. Wykonaj: + ```bash + git fetch --tags + git checkout pre-cleanup- + ``` +4. Jeśli potrzebujesz przywrócić pliki robocze z archiwum: + ```bash + cd /BACKUP + unzip stillontime-pre-cleanup-.zip -d ../restore-tmp + rsync -a ../restore-tmp/ / + ``` +5. Usuń gałąź roboczą jeśli niepotrzebna: + ```bash + git branch -D chore/repo-cleanup-and-boot + ``` + +## Kryteria sukcesu +- Repo przechodzi `npm test` i `scripts/smoke-test.sh --dry-run`. +- Struktura katalogów wraca do stanu sprzed migracji. + +## Ryzyka +- Utrata zmian niezcommitowanych – wykonaj `git stash` przed checkoutem. +- Artefakty w `BACKUP/restore-tmp` – usuń po zakończeniu (`rm -rf BACKUP/restore-tmp`). diff --git a/setup-privacy-hosting.md b/dokumentacja/setup-privacy-hosting.md similarity index 100% rename from setup-privacy-hosting.md rename to dokumentacja/setup-privacy-hosting.md diff --git a/dokumentacja/verification-checklist.md b/dokumentacja/verification-checklist.md new file mode 100644 index 0000000..7bacfe7 --- /dev/null +++ b/dokumentacja/verification-checklist.md @@ -0,0 +1,26 @@ +# Weryfikacja operacji porządkowej + +| Krok | Komenda | Oczekiwany wynik | +| --- | --- | --- | +| 1 | `./scripts/backup_and_branch.sh --dry-run` | Log w `logs/backup.log`, brak zmian w repo | +| 2 | `./scripts/backup_and_branch.sh` | Archiwa w `BACKUP/`, tag + gałąź utworzone | +| 3 | `./scripts/bootstrap.sh --profile dev` | Log `logs/bootstrap.log`, zainstalowane zależności | +| 4 | `./scripts/build.sh --profile dev` | Log `logs/build.log`, artefakty build w `backend/dist`, `frontend/dist` | +| 5 | `./scripts/start.sh --profile dev --target docker` | Kontenery dev running (`docker ps`) | +| 6 | `./scripts/smoke-test.sh --profile dev` | Raport `analysis/dynamic-smoke-summary.json` uzupełniony | +| 7 | `./scripts/purge_unused.sh --dry-run` | Raporty `analysis/purge-report.md/csv` | +| 8 | `./scripts/update-doc-links.sh --dry-run` | Log `logs/update-doc-links.log` bez zmian | + +## Sanity check struktury +```bash +ls -1 | sort +# spodziewane m.in.: BACKUP, analysis, architecture, backend, dokumentacja, scripts +``` + +## Smoke test (manual) +- Wejdź na `http://localhost:` dla frontendu. +- Sprawdź log `logs/smoke-test.log`. + +## Raport z porównania +Po wykonaniu `scripts/smoke-test.sh`: +- Różnice pomiędzy `analysis/runtime-modules-.txt` a `analysis/dependency-graph.json` odnotować w `analysis/purge-report.md`. diff --git a/frontend/Dockerfile b/frontend/Dockerfile new file mode 100644 index 0000000..d679e33 --- /dev/null +++ b/frontend/Dockerfile @@ -0,0 +1,21 @@ +# syntax=docker/dockerfile:1.6 +FROM node:20-alpine AS deps +WORKDIR /app +COPY package*.json ./ +RUN npm ci + +FROM deps AS build +COPY . . +RUN npm run build + +FROM nginx:1.27-alpine AS prod +WORKDIR /usr/share/nginx/html +COPY --from=build /app/dist . +COPY nginx/default.conf /etc/nginx/conf.d/default.conf + +FROM node:20-alpine AS dev +WORKDIR /app +COPY package*.json ./ +RUN npm install +COPY . . +CMD ["npm", "run", "dev", "--", "--host", "0.0.0.0"] diff --git a/frontend/nginx/default.conf b/frontend/nginx/default.conf new file mode 100644 index 0000000..850f80a --- /dev/null +++ b/frontend/nginx/default.conf @@ -0,0 +1,9 @@ +server { + listen 80; + server_name _; + root /usr/share/nginx/html; + index index.html; + location / { + try_files $uri $uri/ /index.html; + } +} diff --git a/frontend/scripts/list-runtime-modules.mjs b/frontend/scripts/list-runtime-modules.mjs new file mode 100644 index 0000000..c85fe2a --- /dev/null +++ b/frontend/scripts/list-runtime-modules.mjs @@ -0,0 +1,23 @@ +import fs from 'fs'; +import path from 'path'; + +const profile = process.argv[2] ?? 'dev'; +const root = process.cwd(); +const pkg = JSON.parse(fs.readFileSync(path.join(root, 'package.json'), 'utf-8')); +const dependencies = Object.keys(pkg.dependencies ?? {}).sort(); +const devDependencies = Object.keys(pkg.devDependencies ?? {}).sort(); + +const logDir = path.resolve(root, '..', 'analysis'); +fs.mkdirSync(logDir, { recursive: true }); + +const payload = { + profile, + generated_at: new Date().toISOString(), + dependencies, + devDependencies, + notes: 'Lista pochodzi z package.json – zweryfikuj w smoke teście reakcje bundlera.' +}; + +const outputFile = path.join(logDir, `runtime-frontend-modules-${profile}.json`); +fs.writeFileSync(outputFile, JSON.stringify(payload, null, 2)); +console.log(`Runtime module list stored in ${outputFile}`); diff --git a/scripts/README.md b/scripts/README.md index a792885..dea0c65 100644 --- a/scripts/README.md +++ b/scripts/README.md @@ -164,3 +164,18 @@ If you encounter issues: 3. Check [API_QUICK_REFERENCE.md](../claudedocs/API_QUICK_REFERENCE.md) for common fixes 4. Verify Docker is running: `docker ps` 5. Check application logs in `backend/logs/` + +## Skrypty porządkowe i uruchomieniowe (2024 cleanup) + +| Skrypt | Opis | Log | +| --- | --- | --- | +| `backup_and_branch.sh` | Backup repo + tag/gałąź bezpieczeństwa | `logs/backup.log` | +| `backup_and_branch.ps1` | Wariant PowerShell | `logs/backup.log` | +| `bootstrap.sh` | Instalacja zależności (dev/prod) | `logs/bootstrap.log` | +| `build.sh` | Build wszystkich modułów | `logs/build.log` | +| `start.sh` | Uruchamianie usług (local/docker) | `logs/start.log` | +| `smoke-test.sh` | Smoke test + moduły runtime | `logs/smoke-test.log` | +| `purge_unused.sh` | Raport i usuwanie artefaktów | `logs/purge-unused.log` | +| `update-doc-links.sh` | Aktualizacja odnośników po migracji dokumentacji | `logs/update-doc-links.log` | + +> Wszystkie skrypty są idempotentne i wspierają `--dry-run`. Uruchamiaj z katalogu ``. diff --git a/scripts/backup_and_branch.ps1 b/scripts/backup_and_branch.ps1 new file mode 100644 index 0000000..73ea9df --- /dev/null +++ b/scripts/backup_and_branch.ps1 @@ -0,0 +1,51 @@ +param( + [switch]$DryRun +) + +$ErrorActionPreference = 'Stop' +$LogFile = 'logs/backup.log' +if (!(Test-Path (Split-Path $LogFile))) { + New-Item -ItemType Directory -Path (Split-Path $LogFile) -Force | Out-Null +} +"[backup] start $(Get-Date -Format o)" | Tee-Object -FilePath $LogFile -Append + +$timestamp = Get-Date -Format 'yyyyMMdd-HHmm' +$tagName = "pre-cleanup-$timestamp" +$branchName = 'chore/repo-cleanup-and-boot' +$archivePrefix = "stillontime-pre-cleanup-$timestamp" + +function Invoke-Step { + param([string]$Command) + if ($DryRun) { + "[backup][dry-run] $Command" | Tee-Object -FilePath $LogFile -Append + } else { + "[backup] $Command" | Tee-Object -FilePath $LogFile -Append + Invoke-Expression $Command + } +} + +Invoke-Step 'git status -sb' +Invoke-Step "if (git tag --list $tagName) { Write-Output '[backup] Tag już istnieje' } else { git tag $tagName }" +Invoke-Step "if (git branch --list $branchName) { Write-Output '[backup] Gałąź już istnieje' } else { git checkout -b $branchName }" +Invoke-Step "git archive --format=zip --output=BACKUP/$archivePrefix.zip HEAD" +Invoke-Step "git archive --format=tar --output=BACKUP/$archivePrefix.tar HEAD" +Invoke-Step "gzip -f BACKUP/$archivePrefix.tar" +Invoke-Step "Set-Location ..; zip -r StillOnTime-$archivePrefix.zip StillOnTime; Set-Location -" +Invoke-Step "sha256sum BACKUP/$archivePrefix.zip BACKUP/$archivePrefix.tar.gz > BACKUP/checksums.txt" +Invoke-Step "git rev-parse HEAD > BACKUP/latest-commit.txt" + +if (-not $DryRun) { + $zipHash = (Get-FileHash -Algorithm SHA256 -Path "BACKUP/$archivePrefix.zip").Hash + $tarHash = (Get-FileHash -Algorithm SHA256 -Path "BACKUP/$archivePrefix.tar.gz").Hash + @{ + tag = $tagName + branch = $branchName + archives = @( + @{ path = "BACKUP/$archivePrefix.zip"; sha256 = $zipHash }, + @{ path = "BACKUP/$archivePrefix.tar.gz"; sha256 = $tarHash } + ) + generated_at = $timestamp + } | ConvertTo-Json -Depth 5 | Set-Content -Path 'BACKUP/checksums.json' +} + +"[backup] done $(Get-Date -Format o)" | Tee-Object -FilePath $LogFile -Append diff --git a/scripts/backup_and_branch.sh b/scripts/backup_and_branch.sh new file mode 100755 index 0000000..167418f --- /dev/null +++ b/scripts/backup_and_branch.sh @@ -0,0 +1,79 @@ +#!/usr/bin/env bash +set -euo pipefail + +LOG_FILE="logs/backup.log" +DRY_RUN=false + +usage() { + cat < +USAGE +} + +while [[ $# -gt 0 ]]; do + case "$1" in + --dry-run) + DRY_RUN=true + shift + ;; + -h|--help) + usage + exit 0 + ;; + *) + echo "[backup] Nieznana opcja: $1" >&2 + usage + exit 1 + ;; + esac +done + +mkdir -p "$(dirname "$LOG_FILE")" +echo "[backup] start $(date -Is)" | tee -a "$LOG_FILE" + +TIMESTAMP="$(date +%Y%m%d-%H%M)" +TAG_NAME="pre-cleanup-${TIMESTAMP}" +BRANCH_NAME="chore/repo-cleanup-and-boot" +ARCHIVE_PREFIX="stillontime-pre-cleanup-${TIMESTAMP}" + +run() { + if [[ "$DRY_RUN" == true ]]; then + echo "[backup][dry-run] $*" | tee -a "$LOG_FILE" + else + echo "[backup] $*" | tee -a "$LOG_FILE" + eval "$@" + fi +} + +run "git status -sb" +run "git tag --list $TAG_NAME >/dev/null 2>&1 && echo '[backup] Tag już istnieje' || git tag $TAG_NAME" +run "git branch --list $BRANCH_NAME >/dev/null 2>&1 && echo '[backup] Gałąź już istnieje' || git checkout -b $BRANCH_NAME" +run "git archive --format=zip --output=BACKUP/${ARCHIVE_PREFIX}.zip HEAD" +run "git archive --format=tar --output=BACKUP/${ARCHIVE_PREFIX}.tar HEAD" +run "gzip -f BACKUP/${ARCHIVE_PREFIX}.tar" +run "(cd .. && zip -r StillOnTime-${ARCHIVE_PREFIX}.zip StillOnTime)" +run "sha256sum BACKUP/${ARCHIVE_PREFIX}.zip BACKUP/${ARCHIVE_PREFIX}.tar.gz > BACKUP/checksums.txt" +run "git rev-parse HEAD > BACKUP/latest-commit.txt" + +if [[ "$DRY_RUN" == false ]]; then + cat > BACKUP/checksums.json < +USAGE +} + +while [[ $# -gt 0 ]]; do + case "$1" in + --profile) + PROFILE="$2" + shift 2 + ;; + --dry-run) + DRY_RUN=true + shift + ;; + -h|--help) + usage + exit 0 + ;; + *) + echo "[bootstrap] Nieznana opcja: $1" >&2 + usage + exit 1 + ;; + esac +done + +mkdir -p "$(dirname "$LOG_FILE")" +echo "[bootstrap] start $(date -Is) profile=${PROFILE} dry-run=${DRY_RUN}" | tee -a "$LOG_FILE" + +run() { + if [[ "$DRY_RUN" == true ]]; then + echo "[bootstrap][dry-run] $*" | tee -a "$LOG_FILE" + else + echo "[bootstrap] $*" | tee -a "$LOG_FILE" + eval "$@" + fi +} + +# Node.js projects +declare -a NODE_PROJECTS=("." "backend" "frontend" "mobile") +for project in "${NODE_PROJECTS[@]}"; do + if [[ -f "$project/package.json" ]]; then + if [[ -f "$project/pnpm-lock.yaml" ]]; then + run "cd $project && pnpm install --frozen-lockfile" + elif [[ -f "$project/yarn.lock" ]]; then + run "cd $project && yarn install --immutable" + elif [[ -f "$project/package-lock.json" ]]; then + run "cd $project && npm ci" + else + run "cd $project && npm install" + fi + fi + if [[ -f "$project/.env.example" && ! -f "$project/.env" ]]; then + run "cp $project/.env.example $project/.env" + fi +done + +# Python (optional) +if [[ -f "backend/requirements.txt" ]]; then + if command -v python >/dev/null 2>&1; then + run "python -m venv .venv" + run ".venv/bin/pip install --upgrade pip" + run ".venv/bin/pip install -r backend/requirements.txt" + else + echo "[bootstrap] TODO(decision): Zainstaluj Python 3.x dla backend/requirements.txt" | tee -a "$LOG_FILE" + fi +fi + +# Go (optional) +if [[ -f "go.mod" ]]; then + if command -v go >/dev/null 2>&1; then + run "go mod download" + else + echo "[bootstrap] TODO(decision): Zainstaluj Go 1.21+" | tee -a "$LOG_FILE" + fi +fi + +# Database migrations +if [[ -d "backend/prisma" ]]; then + run "cd backend && npx prisma migrate deploy" +fi + +if [[ "$PROFILE" == "prod" ]]; then + echo "[bootstrap] TODO(decision): Przygotuj cache offline i secrets dla produkcji." | tee -a "$LOG_FILE" +fi + +echo "[bootstrap] done $(date -Is)" | tee -a "$LOG_FILE" diff --git a/scripts/build.sh b/scripts/build.sh new file mode 100755 index 0000000..ca291ac --- /dev/null +++ b/scripts/build.sh @@ -0,0 +1,69 @@ +#!/usr/bin/env bash +set -euo pipefail + +LOG_FILE="logs/build.log" +PROFILE="dev" +DRY_RUN=false + +usage() { + cat < +USAGE +} + +while [[ $# -gt 0 ]]; do + case "$1" in + --profile) + PROFILE="$2" + shift 2 + ;; + --dry-run) + DRY_RUN=true + shift + ;; + -h|--help) + usage + exit 0 + ;; + *) + echo "[build] Nieznana opcja: $1" >&2 + usage + exit 1 + ;; + esac +done + +mkdir -p "$(dirname "$LOG_FILE")" +echo "[build] start $(date -Is) profile=${PROFILE} dry-run=${DRY_RUN}" | tee -a "$LOG_FILE" + +run() { + if [[ "$DRY_RUN" == true ]]; then + echo "[build][dry-run] $*" | tee -a "$LOG_FILE" + else + echo "[build] $*" | tee -a "$LOG_FILE" + eval "$@" + fi +} + +if [[ -f package.json ]]; then + run "npm run build:${PROFILE:-dev} || npm run build" +fi + +if [[ -f backend/package.json ]]; then + run "cd backend && npm run build:${PROFILE:-dev} || npm run build" +fi + +if [[ -f frontend/package.json ]]; then + run "cd frontend && npm run build:${PROFILE:-dev} || npm run build" +fi + +if [[ -f mobile/package.json ]]; then + run "cd mobile && npm run build:${PROFILE:-dev} || npm run build" +fi + +if [[ -d monitoring ]]; then + run "echo '[build] TODO(decision): Uzupełnij build dla modułu monitoring (np. helm package)'" +fi + +echo "[build] done $(date -Is)" | tee -a "$LOG_FILE" diff --git a/scripts/purge_unused.sh b/scripts/purge_unused.sh new file mode 100755 index 0000000..813e054 --- /dev/null +++ b/scripts/purge_unused.sh @@ -0,0 +1,70 @@ +#!/usr/bin/env bash +set -euo pipefail + +LOG_FILE="logs/purge-unused.log" +DRY_RUN=false +REPORT_MD="analysis/purge-report.md" +REPORT_CSV="analysis/purge-report.csv" + +usage() { + cat < +USAGE +} + +while [[ $# -gt 0 ]]; do + case "$1" in + --dry-run) + DRY_RUN=true + shift + ;; + -h|--help) + usage + exit 0 + ;; + *) + echo "[purge] Nieznana opcja: $1" >&2 + usage + exit 1 + ;; + esac +done + +mkdir -p logs analysis +echo "[purge] start $(date -Is) dry-run=${DRY_RUN}" | tee -a "$LOG_FILE" + +declare -A CANDIDATES +CANDIDATES["backend/node_modules_unused"]="backend/node_modules_unused" +CANDIDATES["frontend/node_modules_unused"]="frontend/node_modules_unused" +CANDIDATES["tmp"]="tmp" +CANDIDATES["mobile/android/.gradle"]="mobile/android/.gradle" + +cat > "$REPORT_MD" < "$REPORT_CSV" + +for key in "${!CANDIDATES[@]}"; do + path="${CANDIDATES[$key]}" + if [[ -d "$path" || -f "$path" ]]; then + reason="Artefakt potencjalnie nieużywany" + criterion="Brak referencji w repo (statyczna analiza)" + echo "| $path | $reason | $criterion |" >> "$REPORT_MD" + echo "$path,$reason,$criterion" >> "$REPORT_CSV" + if [[ "$DRY_RUN" == false ]]; then + rm -rf "$path" + echo "[purge] removed $path" | tee -a "$LOG_FILE" + else + echo "[purge][dry-run] would remove $path" | tee -a "$LOG_FILE" + fi + else + echo "[purge] skip missing $path" | tee -a "$LOG_FILE" + fi +done + +echo "[purge] done $(date -Is)" | tee -a "$LOG_FILE" diff --git a/scripts/smoke-test.sh b/scripts/smoke-test.sh new file mode 100755 index 0000000..69b38a2 --- /dev/null +++ b/scripts/smoke-test.sh @@ -0,0 +1,82 @@ +#!/usr/bin/env bash +set -euo pipefail + +LOG_FILE="logs/smoke-test.log" +PROFILE="dev" +DRY_RUN=false + +usage() { + cat < +USAGE +} + +while [[ $# -gt 0 ]]; do + case "$1" in + --profile) + PROFILE="$2" + shift 2 + ;; + --dry-run) + DRY_RUN=true + shift + ;; + -h|--help) + usage + exit 0 + ;; + *) + echo "[smoke] Nieznana opcja: $1" >&2 + usage + exit 1 + ;; + esac +done + +mkdir -p "$(dirname "$LOG_FILE")" +echo "[smoke] start $(date -Is) profile=${PROFILE} dry-run=${DRY_RUN}" | tee -a "$LOG_FILE" + +run() { + if [[ "$DRY_RUN" == true ]]; then + echo "[smoke][dry-run] $*" | tee -a "$LOG_FILE" + else + echo "[smoke] $*" | tee -a "$LOG_FILE" + eval "$@" + fi +} + +MODULE_LOG="analysis/dynamic-module-usage-${PROFILE}.json" +if [[ "$DRY_RUN" == false ]]; then + mkdir -p analysis + cat > "$MODULE_LOG" < ../logs/backend-smoke-${PROFILE}.json" +run "cd frontend && npm test -- --run --passWithNoTests > ../logs/frontend-smoke-${PROFILE}.json" +run "cd backend && node scripts/list-runtime-modules.mjs ${PROFILE} > ../analysis/runtime-backend-modules-${PROFILE}.log" +run "cd frontend && node scripts/list-runtime-modules.mjs ${PROFILE} > ../analysis/runtime-frontend-modules-${PROFILE}.log" + +if [[ "$DRY_RUN" == false ]]; then + cat < +USAGE +} + +while [[ $# -gt 0 ]]; do + case "$1" in + --profile) + PROFILE="$2" + shift 2 + ;; + --target) + TARGET="$2" + shift 2 + ;; + --dry-run) + DRY_RUN=true + shift + ;; + -h|--help) + usage + exit 0 + ;; + *) + echo "[start] Nieznana opcja: $1" >&2 + usage + exit 1 + ;; + esac +done + +mkdir -p "$(dirname "$LOG_FILE")" +echo "[start] start $(date -Is) profile=${PROFILE} target=${TARGET} dry-run=${DRY_RUN}" | tee -a "$LOG_FILE" + +run() { + if [[ "$DRY_RUN" == true ]]; then + echo "[start][dry-run] $*" | tee -a "$LOG_FILE" + else + echo "[start] $*" | tee -a "$LOG_FILE" + eval "$@" + fi +} + +case "$TARGET" in + backend|all) + run "cd backend && npm run ${PROFILE}:server || npm run dev" + ;; + frontend|all) + run "cd frontend && npm run ${PROFILE}:start || npm run dev" + ;; + mobile|all) + run "cd mobile && npm run ${PROFILE}:start || npm run start" + ;; + worker|all) + run "cd backend && npm run ${PROFILE}:worker || npm run worker" + ;; + docker) + COMPOSE_FILE="docker-compose.yml" + if [[ "$PROFILE" == "prod" && -f docker-compose.production.yml ]]; then + COMPOSE_FILE="docker-compose.production.yml" + fi + run "docker compose -f $COMPOSE_FILE --profile $PROFILE up --build" + ;; + *) + echo "[start] Nieobsługiwany target: $TARGET" >&2 + exit 1 + ;; +esac + +echo "[start] done $(date -Is)" | tee -a "$LOG_FILE" diff --git a/scripts/update-doc-links.sh b/scripts/update-doc-links.sh new file mode 100755 index 0000000..6bd91d8 --- /dev/null +++ b/scripts/update-doc-links.sh @@ -0,0 +1,58 @@ +#!/usr/bin/env bash +set -euo pipefail + +LOG_FILE="logs/update-doc-links.log" +DRY_RUN=false + +usage() { + cat < +USAGE +} + +while [[ $# -gt 0 ]]; do + case "$1" in + --dry-run) + DRY_RUN=true + shift + ;; + -h|--help) + usage + exit 0 + ;; + *) + echo "[update-doc-links] Nieznana opcja: $1" >&2 + usage + exit 1 + ;; + esac +done + +mkdir -p "$(dirname "$LOG_FILE")" +echo "[update-doc-links] start $(date -Is) dry-run=${DRY_RUN}" | tee -a "$LOG_FILE" + +run_replace() { + local search="$1" + local replace="$2" + local files + IFS=$'\n' read -r -d '' -a files < <(rg --files-with-matches "$search" && printf '\0') + for file in "${files[@]}"; do + if [[ "$DRY_RUN" == true ]]; then + echo "[update-doc-links][dry-run] $file: $search -> $replace" | tee -a "$LOG_FILE" + else + echo "[update-doc-links] $file: $search -> $replace" | tee -a "$LOG_FILE" + perl -0pi -e "s|$search|$replace|g" "$file" + fi + done +} + +run_replace "docs/" "dokumentacja/legacy-docs/" +run_replace "./docs" "./dokumentacja/legacy-docs" +run_replace "CLAUDE.md" "dokumentacja/CLAUDE.md" +run_replace "PROJECT_PLAN.md" "dokumentacja/PROJECT_PLAN.md" + +# TODO decisions for manual review +echo "[update-doc-links] TODO(decision): Zweryfikuj odnośniki do prywatnych dokumentów (, Confluence)." | tee -a "$LOG_FILE" + +echo "[update-doc-links] done $(date -Is)" | tee -a "$LOG_FILE" diff --git a/serena-installation b/serena-installation deleted file mode 160000 index a317017..0000000 --- a/serena-installation +++ /dev/null @@ -1 +0,0 @@ -Subproject commit a317017fe7f5312d591a821dad9ed91512fe5bee diff --git a/start-serena.sh b/start-serena.sh index 6236b91..dde6d4b 100755 --- a/start-serena.sh +++ b/start-serena.sh @@ -1,31 +1,25 @@ #!/bin/bash +set -euo pipefail -# Start Serena MCP Server for StillOnTime Project -# This script starts the Serena MCP server configured for the StillOnTime project - -echo "🚀 Starting Serena MCP Server for StillOnTime..." -echo "📁 Project directory: $(pwd)" -echo "🔧 Serena installation: ./serena-installation" - -# Check if serena-installation directory exists -if [ ! -d "./serena-installation" ]; then - echo "❌ Error: serena-installation directory not found!" - echo "Please make sure Serena is properly installed." - exit 1 -fi - -# Check if serena_config.yml exists -if [ ! -f "./serena_config.yml" ]; then - echo "❌ Error: serena_config.yml not found!" - echo "Please make sure the configuration file exists." - exit 1 -fi - -# Start the MCP server -echo "🌐 Starting MCP server..." -echo "📊 Web dashboard will be available at: http://localhost:24282/dashboard/" -echo "🛑 Press Ctrl+C to stop the server" -echo "" - -cd ./serena-installation +PROJECT_ROOT="$(pwd)" +INSTALL_DIR="${PROJECT_ROOT}/dokumentacja/serena-installation" +CONFIG_FILE="${PROJECT_ROOT}/config/serena_config.yml" +LOG_FILE="logs/serena.log" + +mkdir -p "$(dirname "$LOG_FILE")" + +echo "🚀 Starting Serena MCP Server for StillOnTime..." | tee -a "$LOG_FILE" +echo "📁 Project directory: ${PROJECT_ROOT}" | tee -a "$LOG_FILE" +echo "🔧 Serena installation: ${INSTALL_DIR}" | tee -a "$LOG_FILE" + +test -d "$INSTALL_DIR" || { echo "❌ Error: ${INSTALL_DIR} not found" | tee -a "$LOG_FILE"; exit 1; } + +test -f "$CONFIG_FILE" || { echo "❌ Error: ${CONFIG_FILE} not found" | tee -a "$LOG_FILE"; exit 1; } + +echo "🌐 Starting MCP server..." | tee -a "$LOG_FILE" +echo "📊 Web dashboard: http://localhost:24282/dashboard/" | tee -a "$LOG_FILE" + +echo "TODO(decision): zweryfikuj ścieżkę projektu Serena" | tee -a "$LOG_FILE" + +cd "$INSTALL_DIR" uv run serena start-mcp-server --project ../.serena/project.yml