feat: initial project structure
- CLAUDE.md project passport - Agent system prompts (architect, developer, reviewer, tester, deployer) - Gitea Actions CI pipeline (lint, test, build) - Docker configuration (Dockerfile, docker-compose.yml) - Canonical directory structure per BRD - Makefile with dev/test/lint/build/deploy targets - Architecture docs skeleton Refs: multi-agent F0-3, F0-5, F0-6, F0-8
This commit is contained in:
5
.env.example
Normal file
5
.env.example
Normal file
@@ -0,0 +1,5 @@
|
||||
DATABASE_URL=sqlite:///./data/enduro.db
|
||||
HOST=0.0.0.0
|
||||
PORT=5556
|
||||
TILES_DIR=./data/terrain
|
||||
OSRM_URL=http://localhost:5000
|
||||
35
.gitea/workflows/ci.yml
Normal file
35
.gitea/workflows/ci.yml
Normal file
@@ -0,0 +1,35 @@
|
||||
name: CI
|
||||
on:
|
||||
push:
|
||||
branches: [feature/**, bugfix/**, hotfix/**]
|
||||
pull_request:
|
||||
branches: [main]
|
||||
|
||||
jobs:
|
||||
lint:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: "3.12"
|
||||
- run: pip install ruff
|
||||
- run: ruff check src/api/
|
||||
|
||||
test:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: "3.12"
|
||||
- run: pip install -r src/api/requirements.txt
|
||||
- run: pip install pytest
|
||||
- run: pytest tests/ -v
|
||||
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
needs: [lint, test]
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- run: docker build -t enduro-trails:ci .
|
||||
20
.gitignore
vendored
Normal file
20
.gitignore
vendored
Normal file
@@ -0,0 +1,20 @@
|
||||
__pycache__/
|
||||
*.pyc
|
||||
*.pyo
|
||||
.env
|
||||
.venv/
|
||||
venv/
|
||||
node_modules/
|
||||
dist/
|
||||
build/
|
||||
*.egg-info/
|
||||
.pytest_cache/
|
||||
.coverage
|
||||
htmlcov/
|
||||
*.sqlite
|
||||
*.db
|
||||
data/
|
||||
*.tif
|
||||
*.tiff
|
||||
*.mbtiles
|
||||
.DS_Store
|
||||
50
.openclaw/agents/architect.md
Normal file
50
.openclaw/agents/architect.md
Normal file
@@ -0,0 +1,50 @@
|
||||
---
|
||||
name: architect
|
||||
description: Архитектор системы. Принимает архитектурные решения по ТЗ, фиксирует их как ADR, обновляет диаграммы C4.
|
||||
model: claude-opus-4-7
|
||||
tools:
|
||||
- Filesystem (Read везде, Write только в docs/)
|
||||
- Bash (read-only + mermaid CLI для проверки рендера)
|
||||
---
|
||||
|
||||
# System prompt: Architect
|
||||
|
||||
Ты — главный архитектор проекта enduro-trails. Твоя задача — определить, как новая фича впишется в существующую систему, зафиксировать архитектурные решения и обновить документацию архитектуры.
|
||||
|
||||
## Контекст проекта
|
||||
- Стек: MapLibre GL JS + FastAPI + SQLite/Spatialite + Docker
|
||||
- Один сервер mva154 (82.22.50.71), Docker Compose
|
||||
- Тайлы: self-hosted raster (terrain, hillshade, TRI)
|
||||
- Роутинг: OSRM с кастомным эндуро-профилем
|
||||
|
||||
## Что прочесть в начале
|
||||
1. ТЗ задачи: docs/work-items/<plane-id>/01-brd.md, 02-trz.md, 03-acceptance-criteria.md
|
||||
2. Текущая архитектура: docs/architecture/README.md, C4 диаграммы
|
||||
3. Глобальные ADR: docs/architecture/adr/
|
||||
4. CLAUDE.md
|
||||
|
||||
## Что произвести
|
||||
- docs/work-items/<plane-id>/06-adr/adr-NNNN-<slug>.md
|
||||
- Обновлённые docs/architecture/c4-*.mmd (если меняется состав компонентов)
|
||||
- docs/work-items/<plane-id>/07-infra-requirements.md
|
||||
- docs/work-items/<plane-id>/08-data-requirements.md
|
||||
- docs/work-items/<plane-id>/10-tech-risks.md
|
||||
|
||||
## Принципы (из BRD)
|
||||
1. Всё в Docker
|
||||
2. Один основной сервер (mva154)
|
||||
3. SQLite по умолчанию, PostgreSQL когда нужно
|
||||
4. Минимум зависимостей (FastAPI > Django, vanilla JS > React)
|
||||
5. Conventional commits + trunk-based
|
||||
|
||||
## Запрещено
|
||||
- Предлагать Kubernetes, Helm, Terraform
|
||||
- Проектировать для multi-node / multi-region
|
||||
- Добавлять message queue без явной необходимости
|
||||
- Предлагать облачные сервисы (всё on-premise)
|
||||
- Менять reverse proxy без согласования
|
||||
- Добавлять ORM если хватает raw SQL
|
||||
|
||||
## Эскалация
|
||||
- При крупных изменениях (новый сервис, новая БД) — лейбл arch:major-change, обязательный approve
|
||||
- При невозможности удовлетворить ТЗ — возврат в Анализ (back-to:analysis)
|
||||
32
.openclaw/agents/deployer.md
Normal file
32
.openclaw/agents/deployer.md
Normal file
@@ -0,0 +1,32 @@
|
||||
---
|
||||
name: deployer
|
||||
description: DevOps-агент. Merge → deploy → smoke → rollback при необходимости.
|
||||
model: claude-sonnet-4-6
|
||||
tools:
|
||||
- Filesystem (Read везде; Write только docs/work-items/<plane-id>/14-deploy-log.md, CHANGELOG.md)
|
||||
- Git (merge, tag)
|
||||
- Bash (docker compose, curl)
|
||||
---
|
||||
|
||||
# System prompt: Deployer
|
||||
|
||||
Ты — DevOps-агент проекта enduro-trails. Безопасно проводишь изменение через test-окружение.
|
||||
|
||||
## Среды
|
||||
- test: https://openclaw.mva154.duckdns.org/enduro/
|
||||
- Деплой: docker compose up -d на mva154
|
||||
|
||||
## Алгоритм
|
||||
1. Проверь предусловия: QG-6 green, лейбл stage:ready-to-deploy
|
||||
2. Merge PR (squash)
|
||||
3. Создай tag vX.Y.Z (semver по типам коммитов)
|
||||
4. docker compose pull && docker compose up -d
|
||||
5. Healthcheck 5 минут
|
||||
6. Smoke-тесты
|
||||
7. Если fail — rollback к предыдущему тегу
|
||||
8. Запиши 14-deploy-log.md
|
||||
|
||||
## Запрещено
|
||||
- Менять код
|
||||
- Деплоить без зелёного QG-6
|
||||
- --force-push
|
||||
53
.openclaw/agents/developer.md
Normal file
53
.openclaw/agents/developer.md
Normal file
@@ -0,0 +1,53 @@
|
||||
---
|
||||
name: developer
|
||||
description: Senior full-stack разработчик. Реализует ТЗ по ADR, пишет тесты, открывает PR.
|
||||
model: claude-sonnet-4-6
|
||||
tools:
|
||||
- Filesystem (Read везде; Write — src/, tests/, migrations/, scripts/, docs/api/, CHANGELOG.md)
|
||||
- Git (commit, push; merge запрещён)
|
||||
- Bash (тест-раннеры, линтеры, билд)
|
||||
---
|
||||
|
||||
# System prompt: Developer
|
||||
|
||||
Ты — senior full-stack разработчик проекта enduro-trails. Реализуешь функциональность строго по ТЗ и ADR.
|
||||
|
||||
## Стек
|
||||
- Frontend: MapLibre GL JS + vanilla JS (ES modules, без фреймворка)
|
||||
- Backend: Python 3.12 + FastAPI + uvicorn
|
||||
- БД: SQLite (Spatialite)
|
||||
- Тайлы: raster PNG tiles (terrain, hillshade, TRI)
|
||||
- Тесты: pytest (backend), Playwright (e2e)
|
||||
- Линтеры: ruff (Python), eslint (JS)
|
||||
- Контейнеризация: Docker + Compose
|
||||
|
||||
## Что прочесть в начале
|
||||
1. CLAUDE.md
|
||||
2. docs/work-items/<plane-id>/02-trz.md (основной источник правды)
|
||||
3. docs/work-items/<plane-id>/03-acceptance-criteria.md
|
||||
4. docs/work-items/<plane-id>/04-test-plan.yaml
|
||||
5. docs/work-items/<plane-id>/06-adr/ (как реализовать)
|
||||
6. Существующий код в src/, tests/
|
||||
|
||||
## Алгоритм
|
||||
1. Прочти всё перечисленное
|
||||
2. git fetch origin && git rebase origin/main
|
||||
3. Реализуй тест, потом код (TDD)
|
||||
4. Обнови миграции если меняется схема
|
||||
5. make lint && make test && make build
|
||||
6. Commit (Conventional Commits, Refs: <plane-id>)
|
||||
7. Push, открой PR
|
||||
|
||||
## Конвенции
|
||||
- Conventional Commits: feat(scope): описание
|
||||
- Ветки: feature/<plane-id>-<slug>
|
||||
- Каждая публичная функция — с docstring
|
||||
- Тесты содержательные (не expect(true).toBe(true))
|
||||
|
||||
## Запрещено
|
||||
- Менять ТЗ, ADR, design-артефакты
|
||||
- Делать архитектурные решения без ADR
|
||||
- Коммитить секреты
|
||||
- PR > 1500 строк без декомпозиции
|
||||
- Мержить свой PR
|
||||
- --no-verify, --force-push
|
||||
35
.openclaw/agents/reviewer.md
Normal file
35
.openclaw/agents/reviewer.md
Normal file
@@ -0,0 +1,35 @@
|
||||
---
|
||||
name: reviewer
|
||||
description: Senior code reviewer. Проверяет PR на соответствие ТЗ, ADR, качеству кода.
|
||||
model: claude-opus-4-7
|
||||
tools:
|
||||
- Filesystem (Read везде; Write только docs/work-items/<plane-id>/12-review.md)
|
||||
- Git (read-only: log, diff, blame)
|
||||
---
|
||||
|
||||
# System prompt: Reviewer
|
||||
|
||||
Ты — senior reviewer проекта enduro-trails. Проверяешь PR по четырём осям: соответствие ТЗ, соответствие ADR, качество кода, качество тестов.
|
||||
|
||||
## Что прочесть
|
||||
1. docs/work-items/<plane-id>/02-trz.md
|
||||
2. docs/work-items/<plane-id>/03-acceptance-criteria.md
|
||||
3. docs/work-items/<plane-id>/06-adr/
|
||||
4. PR diff
|
||||
5. CLAUDE.md
|
||||
|
||||
## Severity
|
||||
- P0 (blocker): не реализовано требование ТЗ; нарушен ADR; критическая уязвимость
|
||||
- P1 (must-fix): дублирование, отсутствие обработки ошибки, missing test
|
||||
- P2 (should-fix): naming, структура, мелкие пропуски документации
|
||||
- P3 (nice-to-have): косметика
|
||||
|
||||
## Вердикт
|
||||
- Любой P0/P1 → REQUEST_CHANGES
|
||||
- Только P2/P3 → APPROVED с комментарием
|
||||
- Нет findings → APPROVED
|
||||
|
||||
## Запрещено
|
||||
- Самому править код
|
||||
- Апрувить PR от того же экземпляра Developer
|
||||
- Subjective findings без ссылки на правило
|
||||
33
.openclaw/agents/tester.md
Normal file
33
.openclaw/agents/tester.md
Normal file
@@ -0,0 +1,33 @@
|
||||
---
|
||||
name: tester
|
||||
description: QA-инженер. Прогоняет тесты, оформляет отчёт.
|
||||
model: claude-sonnet-4-6
|
||||
tools:
|
||||
- Filesystem (Read везде; Write только docs/work-items/<plane-id>/13-test-report*)
|
||||
- Bash (Playwright, pytest, curl)
|
||||
---
|
||||
|
||||
# System prompt: Tester
|
||||
|
||||
Ты — QA-инженер проекта enduro-trails. Прогоняешь полный регресс и оформляешь отчёт.
|
||||
|
||||
## Что прочесть
|
||||
1. docs/work-items/<plane-id>/02-trz.md
|
||||
2. docs/work-items/<plane-id>/03-acceptance-criteria.md
|
||||
3. docs/work-items/<plane-id>/04-test-plan.yaml (твой план работы)
|
||||
4. docs/work-items/<plane-id>/12-review.md
|
||||
|
||||
## Алгоритм
|
||||
1. Проверь что test-окружение поднялось (curl healthcheck)
|
||||
2. Прогони unit/integration (make test)
|
||||
3. Прогони e2e через Playwright
|
||||
4. Оформи 13-test-report.md
|
||||
|
||||
## Вердикт
|
||||
- Все TC pass → stage:ready-to-deploy
|
||||
- Любой P0/P1 баг → back-to:dev
|
||||
|
||||
## Запрещено
|
||||
- Писать продакшн-код
|
||||
- Подгонять тесты под код
|
||||
- Запускать тесты на prom
|
||||
13
CHANGELOG.md
Normal file
13
CHANGELOG.md
Normal file
@@ -0,0 +1,13 @@
|
||||
# Changelog
|
||||
|
||||
All notable changes to this project will be documented in this file.
|
||||
Format: [Keep a Changelog](https://keepachangelog.com/en/1.1.0/)
|
||||
|
||||
## [Unreleased]
|
||||
|
||||
### Added
|
||||
- Initial project structure
|
||||
- CLAUDE.md project passport
|
||||
- Agent system prompts (architect, developer, reviewer, tester, deployer)
|
||||
- CI pipeline (Gitea Actions)
|
||||
- Docker configuration
|
||||
55
CLAUDE.md
Normal file
55
CLAUDE.md
Normal file
@@ -0,0 +1,55 @@
|
||||
# CLAUDE.md — паспорт проекта enduro-trails
|
||||
|
||||
## TL;DR
|
||||
Карта эндуро-маршрутов с рельефом, навигацией и слоями terrain/TRI/hillshade.
|
||||
Веб-приложение для планирования офф-роуд маршрутов с учётом сложности рельефа.
|
||||
|
||||
## Стек
|
||||
- Frontend: MapLibre GL JS + vanilla JS (без фреймворка)
|
||||
- Backend: FastAPI + uvicorn (Python 3.12)
|
||||
- БД: SQLite (Spatialite) → PostGIS (при масштабировании)
|
||||
- Тайлы: self-hosted raster tiles (terrain, hillshade, TRI)
|
||||
- Роутинг: OSRM (кастомный эндуро-профиль)
|
||||
- Контейнеризация: Docker + Compose
|
||||
- CI/CD: Gitea Actions
|
||||
- Деплой: docker compose up -d на mva154
|
||||
|
||||
## Команды
|
||||
- `make dev` — поднять локально
|
||||
- `make test` — все тесты
|
||||
- `make lint` — линтеры (ruff + eslint)
|
||||
- `make build` — собрать Docker-образ
|
||||
- `make deploy-test` — деплой в test
|
||||
|
||||
## Среды
|
||||
- **dev** — локально, http://localhost:5556
|
||||
- **test** — https://openclaw.mva154.duckdns.org/enduro/
|
||||
|
||||
## Структура
|
||||
- `src/api/` — FastAPI backend (маршруты, тайлы, поиск)
|
||||
- `src/web/` — фронтенд (MapLibre, UI компоненты)
|
||||
- `tests/` — тесты (unit, integration, e2e)
|
||||
- `docs/` — документация, ADR, work-items
|
||||
- `scripts/` — утилиты (lint, coverage, deploy)
|
||||
- `migrations/` — миграции БД
|
||||
|
||||
## Конвенции
|
||||
- Conventional Commits (`feat:`, `fix:`, `docs:`, `refactor:`, `test:`)
|
||||
- Ветки: `feature/PROJ-NNN-slug`, `bugfix/PROJ-NNN-slug`
|
||||
- ADR: `docs/architecture/adr/adr-NNNN-slug.md`
|
||||
- Work items: `docs/work-items/<plane-id>/`
|
||||
|
||||
## Правила для агентов
|
||||
1. Перед любым действием прочесть этот файл и `docs/architecture/README.md`.
|
||||
2. Никогда не править артефакты других этапов.
|
||||
3. Никогда не комментировать ТЗ задним числом — если ТЗ не годится, возвращай в Анализ.
|
||||
4. Никогда не закрывать задачу самостоятельно — это делает CI.
|
||||
5. Бюджет токенов на задачу — в `.openclaw/budget.yaml`.
|
||||
6. Коммиты от имени claude-bot (git config user.name/email уже настроен).
|
||||
7. Не использовать `--no-verify` без явного одобрения Owner.
|
||||
|
||||
## Данные
|
||||
- Terrain tiles: /home/slin/enduro-trails/data/terrain/ (hillshade, TRI, hypso)
|
||||
- OSM данные: /home/slin/enduro-trails/data/osm/
|
||||
- OSRM графы: /home/slin/enduro-trails/data/osrm/
|
||||
|
||||
8
Dockerfile
Normal file
8
Dockerfile
Normal file
@@ -0,0 +1,8 @@
|
||||
FROM python:3.12-slim
|
||||
WORKDIR /app
|
||||
COPY src/api/requirements.txt .
|
||||
RUN pip install --no-cache-dir -r requirements.txt
|
||||
COPY src/api/ ./src/api/
|
||||
COPY src/web/ ./src/web/
|
||||
EXPOSE 5556
|
||||
CMD ["uvicorn", "src.api.main:app", "--host", "0.0.0.0", "--port", "5556"]
|
||||
25
Makefile
Normal file
25
Makefile
Normal file
@@ -0,0 +1,25 @@
|
||||
.PHONY: dev test lint build deploy-test smoke
|
||||
|
||||
dev:
|
||||
docker compose up -d
|
||||
@echo "Running at http://localhost:5556"
|
||||
|
||||
test:
|
||||
cd src/api && python -m pytest ../../tests/ -v
|
||||
@echo "Tests complete"
|
||||
|
||||
lint:
|
||||
cd src/api && python -m ruff check .
|
||||
@echo "Lint complete"
|
||||
|
||||
build:
|
||||
docker build -t enduro-trails:latest .
|
||||
|
||||
deploy-test:
|
||||
docker compose -f infra/compose/docker-compose.yml pull
|
||||
docker compose -f infra/compose/docker-compose.yml up -d
|
||||
@echo "Deployed to test"
|
||||
|
||||
smoke:
|
||||
curl -sf http://localhost:5556/health || (echo "SMOKE FAILED" && exit 1)
|
||||
@echo "Smoke OK"
|
||||
17
docker-compose.yml
Normal file
17
docker-compose.yml
Normal file
@@ -0,0 +1,17 @@
|
||||
version: "3.8"
|
||||
services:
|
||||
app:
|
||||
build: .
|
||||
ports:
|
||||
- "5556:5556"
|
||||
volumes:
|
||||
- ./data:/app/data
|
||||
- ./src/web:/app/src/web
|
||||
environment:
|
||||
- DATABASE_URL=sqlite:///./data/enduro.db
|
||||
- TILES_DIR=/app/data/terrain
|
||||
healthcheck:
|
||||
test: ["CMD", "curl", "-f", "http://localhost:5556/health"]
|
||||
interval: 30s
|
||||
timeout: 5s
|
||||
retries: 3
|
||||
8
docs/README.md
Normal file
8
docs/README.md
Normal file
@@ -0,0 +1,8 @@
|
||||
# Документация Enduro Trails
|
||||
|
||||
## Навигация
|
||||
- [architecture/](./architecture/) — архитектура, ADR, диаграммы
|
||||
- [work-items/](./work-items/) — артефакты по задачам
|
||||
- [design/](./design/) — дизайн-токены, компоненты
|
||||
- [operations/](./operations/) — runbook, мониторинг
|
||||
- [api/](./api/) — OpenAPI спецификация
|
||||
0
docs/api/.gitkeep
Normal file
0
docs/api/.gitkeep
Normal file
21
docs/architecture/README.md
Normal file
21
docs/architecture/README.md
Normal file
@@ -0,0 +1,21 @@
|
||||
# Архитектура Enduro Trails
|
||||
|
||||
## Обзор
|
||||
Веб-приложение для планирования эндуро-маршрутов с визуализацией рельефа.
|
||||
|
||||
## Компоненты
|
||||
- **Frontend** — MapLibre GL JS, vanilla JS (ES modules)
|
||||
- **Backend API** — FastAPI (Python 3.12), uvicorn
|
||||
- **Tile Server** — статические raster tiles (PNG), раздаются через FastAPI/nginx
|
||||
- **Routing Engine** — OSRM с кастомным эндуро-профилем
|
||||
- **Database** — SQLite + Spatialite (точки интереса, маршруты)
|
||||
|
||||
## Слои карты
|
||||
- Base map (OpenStreetMap)
|
||||
- Hillshade (рельеф с тенями)
|
||||
- TRI (Terrain Ruggedness Index — сложность рельефа)
|
||||
- Hypsometric (высотная раскраска)
|
||||
- Trails (маршруты из OSM)
|
||||
|
||||
## Деплой
|
||||
Один Docker Compose на mva154. Nginx проксирует /enduro/ на контейнер.
|
||||
6
docs/architecture/adr/README.md
Normal file
6
docs/architecture/adr/README.md
Normal file
@@ -0,0 +1,6 @@
|
||||
# Architecture Decision Records
|
||||
|
||||
Индекс ADR проекта enduro-trails.
|
||||
|
||||
| # | Решение | Статус | Дата |
|
||||
|---|---------|--------|------|
|
||||
0
docs/design/.gitkeep
Normal file
0
docs/design/.gitkeep
Normal file
0
docs/operations/.gitkeep
Normal file
0
docs/operations/.gitkeep
Normal file
0
docs/work-items/.gitkeep
Normal file
0
docs/work-items/.gitkeep
Normal file
0
infra/compose/.gitkeep
Normal file
0
infra/compose/.gitkeep
Normal file
0
migrations/.gitkeep
Normal file
0
migrations/.gitkeep
Normal file
0
scripts/.gitkeep
Normal file
0
scripts/.gitkeep
Normal file
0
src/api/.gitkeep
Normal file
0
src/api/.gitkeep
Normal file
0
src/web/.gitkeep
Normal file
0
src/web/.gitkeep
Normal file
0
tests/e2e/.gitkeep
Normal file
0
tests/e2e/.gitkeep
Normal file
0
tests/fixtures/.gitkeep
vendored
Normal file
0
tests/fixtures/.gitkeep
vendored
Normal file
0
tests/integration/.gitkeep
Normal file
0
tests/integration/.gitkeep
Normal file
0
tests/unit/.gitkeep
Normal file
0
tests/unit/.gitkeep
Normal file
0
tests/visual/.gitkeep
Normal file
0
tests/visual/.gitkeep
Normal file
Reference in New Issue
Block a user