Node.js is already installed on the host runner.
actions/checkout@v4 auto-resolves from GitHub.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace .gitlab-ci.yml with .gitea/workflows/ci.yml.
Same pipeline: lint → build → deploy (local, runner on prod server).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The GitLab Runner runs on the same VPS as the production app,
so SSH-ing from the server to itself is unnecessary. This removes
the SSH key dependency and simplifies the deploy stage.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Use InlineKeyboardMarkup from grammy/types for proper typing
- Add QuestEvent interface for event processor
- Accept Promise<unknown> in wrapHandler for flexible return types
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Replace `any` types with proper interfaces (QuestDetailResponse, etc.)
- Remove unused imports (createUser, findUserByTelegramId, updatePointContent)
- Use `unknown` in catch blocks with instanceof narrowing
- Type Express handlers with Request/Response/NextFunction
- Add argsIgnorePattern for underscore-prefixed params in ESLint config
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Remove Docker image references since runner uses shell executor
with Node.js installed directly on VPS.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Telegram Bot + Mini App for city walking quests.
- React 19 + TypeScript + Vite 6 frontend
- Express 5 + PostgreSQL backend
- grammY Telegram bot with DeepSeek AI
- GitLab CI/CD: lint, build, deploy to production
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>