docs: CHANGELOG, README, WORKLOAD updated for v2.1.0 — complete
- CHANGELOG: all 9 versions documented (v1.3 → v2.1) - README: version 2.1.0, full feature list, 73/73 tests - WORKLOAD: rewritten, 52/52 features (100%), architecture summary
This commit is contained in:
+68
-67
@@ -1,85 +1,86 @@
|
||||
# Changelog — FlowDeck
|
||||
|
||||
## v2.1.0 (2026-07-10) — Intégrations Avancées
|
||||
|
||||
### Added
|
||||
- **API publique**: `/api/v1` (collections, pages, my-tasks) avec token auth
|
||||
- **Token generation**: `POST /api/v1/token`
|
||||
- **Webhooks sortants**: `GET/POST/DELETE /workspace/webhooks` + dispatcher
|
||||
- **PWA**: `GET /manifest.json`
|
||||
- **CSRF**: `/api/v1` exempté
|
||||
|
||||
### Tests
|
||||
- 73/73 passent (+6 tests v2.1)
|
||||
|
||||
## v2.0.0 (2026-07-10) — Multi-User Workspaces & Editor Complete
|
||||
|
||||
### Added
|
||||
- **Workspaces**: tables `workspaces` + `workspace_members`, CRUD API, roles admin/editor/commenter/viewer
|
||||
- **Comments**: table `comments` avec thread (parent_id), resolved
|
||||
- **Page History**: table `page_history`, snapshot JSON
|
||||
- **Favorites**: table `favorites`, add/remove/list
|
||||
- **Templates**: `database_templates` + `page_templates`, apply API
|
||||
- **CSV Import/Export**: `POST .../import/csv`, `GET .../export/csv`
|
||||
- **Public Sharing**: `GET /workspace/public/{id}` (read-only, no auth)
|
||||
|
||||
### Tests
|
||||
- 67/67 passent (+7 tests v2.0)
|
||||
|
||||
## v1.9.0 (2026-07-10) — My Tasks Dashboard
|
||||
|
||||
### Added
|
||||
- **My Tasks**: `GET /my-tasks` (HTML), `GET /my-tasks/api` (JSON)
|
||||
- Agrégation cross-collection, vues All/Today/Overdue/Next 7 days
|
||||
|
||||
## v1.8.0 (2026-07-10) — Sub-items & Dependencies
|
||||
|
||||
### Added
|
||||
- **Sub-items**: parent_id auto-référence, GET/POST sub-items
|
||||
- **Status aggregate**: `GET .../status-aggregate`
|
||||
- **Dependencies**: `POST .../dependencies`, `POST .../check-deps`
|
||||
|
||||
## v1.7.0 (2026-07-10) — Vues Améliorées
|
||||
|
||||
### Added
|
||||
- **View config**: `PUT /db/views/{id}/config` (group_by, card_size, cover, visible)
|
||||
- **Save view as**: `POST /db/{id}/views/save-as`
|
||||
- **List views**: `GET /db/{id}/views/api`
|
||||
|
||||
## v1.6.0 (2026-07-10) — Vues Manquantes
|
||||
|
||||
### Added
|
||||
- **Calendar**: grid mensuel, navigation mois
|
||||
- **Gallery**: cartes visuelles, card_size configurable
|
||||
- **List**: vue compacte avec preview
|
||||
- **Timeline**: barres horizontales Gantt
|
||||
- **Table**: rendu SSR avec colonnes properties
|
||||
- **View tabs**: navigation Table/Board/Calendar/Gallery/List/Timeline
|
||||
|
||||
## v1.5.0 (2026-07-10) — Relations & Rollups
|
||||
|
||||
### Added
|
||||
- **Type `relation`**: lien bidirectionnel entre collections avec reverse_name auto
|
||||
- API: `POST /db/{id}/properties/relation`, `POST /db/{id}/properties/relation/link`
|
||||
- **FormulaEngine**: 19 fonctions (prop, if, concat, round, now, today, dateAdd, replace, ...)
|
||||
- API: `POST /db/formula/evaluate`
|
||||
- **RollupEngine**: 12 fonctions (count, sum, avg, min, max, range, unique, percent_checked, ...)
|
||||
- API: `POST /db/rollup/compute`
|
||||
- **Tests**: 5 nouveaux tests (43/43 passent, +13%)
|
||||
|
||||
### Fixed
|
||||
- FKs `related_collection_id`, `relation_property_id`, `target_property_id` → `ON DELETE SET NULL`
|
||||
|
||||
### Changed
|
||||
- Version 1.4.0 → 1.5.0
|
||||
- **RollupEngine**: 12 agrégations (count, sum, avg, min, max, range, unique, percent_checked)
|
||||
- **Relation**: lien bidirectionnel, API create/link
|
||||
|
||||
## v1.4.0 (2026-07-10) — Propriétés Avancées
|
||||
|
||||
### Added
|
||||
- **Table `collection_properties`**: remplace `project_properties`, liée aux collections
|
||||
- Types: title, text, number, select, multi_select, status, date, person, checkbox, url, email, phone, files, unique_id
|
||||
- Auto-propriétés: created_time, created_by, last_edited_time, last_edited_by
|
||||
- Relations/Rollups/Formulas: schéma prêt (colonnes dispo, implémentation v1.5)
|
||||
- **Service `property_types.py`**: 21 types définis, validation, formatage, auto-values
|
||||
- **API propriétés**: `GET /db/property-types/api`, CRUD `/{id}/properties/api`, `PUT/DELETE /properties/{id}/api`
|
||||
- **Tests**: 4 nouveaux tests (38/38 passent, +12%)
|
||||
|
||||
### Changed
|
||||
- Version 1.3.0 → 1.4.0
|
||||
- **Table `collection_properties`**: 21 types Notion
|
||||
- **Service `property_types.py`**: validation, formatage, auto-values
|
||||
|
||||
## v1.3.0 (2026-07-10) — Database Concept
|
||||
|
||||
### Added
|
||||
- **Nouvelles tables**: `collections`, `collection_pages`, `collection_views` — fondation Database Notion
|
||||
- **Router `/db`**: API CRUD complète pour collections et pages
|
||||
- `GET/POST /db/api` — lister/créer collections
|
||||
- `GET/PUT/DELETE /db/api/{id}` — lire/modifier/supprimer collection
|
||||
- `GET/POST /db/{id}/pages/api` — lister/créer pages
|
||||
- `GET/PUT/DELETE /db/pages/{id}/api` — CRUD page standalone
|
||||
- `GET /db/{id}` — vue HTML basique par collection
|
||||
- **GiteaBoardCompat**: adaptateur boards Gitea legacy → Collections
|
||||
- `GET /db/boards/api` — liste boards comme pseudo-collections
|
||||
- `GET /db/board/{owner}/{repo}/api` — board spécifique comme collection
|
||||
- `POST /db/board/{owner}/{repo}/sync` — sync board → vraie collection
|
||||
- **Tests**: 6 nouveaux tests (34/34 passent, +21%)
|
||||
- **CSRF**: `/db/` exempté (API interne)
|
||||
|
||||
### Changed
|
||||
- Version 1.0.0 → 1.3.0 (main.py, api.py, health)
|
||||
- `db.py` init: 3 nouvelles tables + index
|
||||
- Architecture DB: `collection_pages` utilise `property_values_json` (JSON flexible)
|
||||
- **Tables**: `collections`, `collection_pages`, `collection_views`
|
||||
- **Router `/db`**: CRUD collections + pages (16 endpoints)
|
||||
- **GiteaBoardCompat**: adaptateur boards legacy → Collections
|
||||
|
||||
## v1.0.0 (2026-07-08) — Production
|
||||
|
||||
### Added
|
||||
- **UI Notion-complete**: sidebar 240px, topbar 44px, dark mode (#191919/#222/#333)
|
||||
- **5 vues**: Kanban, Detailed Board, Table, Status Overview (SVG donut), Team Load (stacked bars)
|
||||
- **Filtres cumulables AND** avec status dropdown checkboxes, filtres par assignee/tag
|
||||
- **Tri multi-critères** hiérarchique (N niveaux, asc/desc)
|
||||
- **Card detail modal**: titre éditable, propriétés, checklists, commentaires Gitea
|
||||
- **Création d'issues inline** depuis le board
|
||||
- **Propriétés custom** par projet: select, multi_select, date, person, text
|
||||
- **AI keywords**: extraction automatique depuis labels + body, table `ai_keywords`
|
||||
- **Sync API**: `POST /board/api/sync/{owner}/{repo}` — bidirectionnelle complète
|
||||
- **CI/CD**: Gitea Actions workflow
|
||||
- **Tests**: 25 tests, couvrant toutes les vues, APIs, filtres, tris
|
||||
|
||||
### Changed
|
||||
- FastAPI `on_event` → `lifespan` handler (deprecation fix)
|
||||
- Version bump 0.3.0 → 1.0.0
|
||||
- CSS: 31 KB design system Notion (700+ lignes)
|
||||
- 10 templates Jinja2 (base, board, card, detail, table, status, team, detailed, fragment, dashboard)
|
||||
|
||||
### Fixed
|
||||
- Team Load bug: status key mismatch (done → complete)
|
||||
- CSRF: 403 protection vérifiée sur toutes les routes POST
|
||||
|
||||
## v0.3.0 (2026-06-??)
|
||||
- OAuth2 Gitea, CSRF, rate limiting, webhooks
|
||||
|
||||
## v0.2.0 (2026-05-??)
|
||||
- Dashboard + Board Kanban + Gitea sync + Notes + Docker
|
||||
- FastAPI lifespan, 28 tests, CI/CD Gitea Actions, CSS 31KB, 10 templates
|
||||
- 5 vues: Kanban, Table, Status Overview, Team Load, Detailed Board
|
||||
- Filtres cumulables AND, tri multi-critères
|
||||
- Card detail modal, checklists, commentaires Gitea
|
||||
- Propriétés custom, AI keywords, sync API
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
# FlowDeck
|
||||
|
||||
Clone de l'interface **Notion** intégré nativement à **Gitea** — Databases, Pages, Kanban, Table, multi-vues.
|
||||
Clone complet de **Notion** intégré nativement à **Gitea** — Databases, Pages, Kanban, Calendar, Gallery, Timeline, List, Multi-Users.
|
||||
|
||||
> **v1.3.0** — Database Concept (collections, pages, vues, GiteaBoardCompat)
|
||||
> **v2.1.0** — API publique, Webhooks sortants, PWA
|
||||
|
||||
## Quick Start
|
||||
|
||||
@@ -15,45 +15,62 @@ docker compose up -d
|
||||
|
||||
## Features
|
||||
|
||||
### Database Concept (v1.3.0)
|
||||
- **Collections**: databases indépendantes de Gitea, schéma JSON, icon, description
|
||||
- **Pages**: propriétés JSON, position, parent_id (sub-items ready), lien Gitea optionnel
|
||||
- **Vues**: configurables (type, filters, sorts, visible_properties)
|
||||
### Database & Properties (v1.3–v1.5)
|
||||
- **Collections**: databases indépendantes de Gitea, schéma JSON
|
||||
- **21 types de propriétés**: title, text, number, select, status, date, person, checkbox, url, email, phone, files, unique_id, relation, rollup, formula + auto-props
|
||||
- **Relations bidirectionnelles** + **Rollups** (12 agrégations) + **Formulas** (19 fonctions)
|
||||
- **GiteaBoardCompat**: adaptateur boards Gitea legacy → Collections
|
||||
- **API REST**: CRUD complet collections + pages (12 endpoints)
|
||||
|
||||
### Vues Multiples (v1.6–v1.7)
|
||||
- **Table**: colonnes SSR, triables
|
||||
- **Board (Kanban)**: colonnes, groupes, drag & drop
|
||||
- **Calendar**: grid mensuel, navigation, événements
|
||||
- **Gallery**: cartes visuelles, card_size configurable
|
||||
- **List**: vue compacte avec preview
|
||||
- **Timeline**: barres Gantt horizontales
|
||||
- **Status Overview**: Donut chart SVG
|
||||
- **Team Load**: Barres empilées
|
||||
|
||||
### Sub-items & Dépendances (v1.8)
|
||||
- **Sub-items**: parent_id auto-référence, hiérarchie illimitée
|
||||
- **Status aggregate**: parent = Done si tous enfants Done
|
||||
- **Dependencies**: Blocking/Blocked by, contrainte de transition
|
||||
|
||||
### My Tasks (v1.9)
|
||||
- Dashboard cross-collection agrégeant toutes les tâches assignées
|
||||
- Vues: All, Today, Overdue, Next 7 days
|
||||
|
||||
### Multi-User & Collaboratif (v2.0)
|
||||
- **Workspaces**: espaces partagés avec rôles (admin, editor, commenter, viewer)
|
||||
- **Comments**: commentaires threadés sur les pages
|
||||
- **Page History**: historique des modifications avec snapshots
|
||||
- **Favorites**: favoris par utilisateur
|
||||
- **Templates**: database + page templates
|
||||
- **CSV Import/Export**
|
||||
- **Public Sharing**: lien de partage lecture seule
|
||||
|
||||
### API & Intégrations (v2.1)
|
||||
- **API publique REST**: `/api/v1` avec token auth
|
||||
- **Webhooks sortants**: gestion + dispatcher d'événements
|
||||
- **PWA**: manifest.json, prêt pour installation mobile
|
||||
|
||||
### UI Notion-Style (v1.1–v1.2)
|
||||
- **Sidebar gauche** avec sections hiérarchiques (Recents, Private, Library, Trash)
|
||||
- **Topbar** avec breadcrumbs (workspace > projet > page)
|
||||
- **Dark mode** Notion: `#191919` fond, `#222222` sidebar, `#333333` actif
|
||||
- **Éditeur de blocs** Notion-style: slash menu (/), navigation clavier, placeholders
|
||||
- **Drag & drop** pages dans la sidebar (SortableJS)
|
||||
|
||||
### Vues Multiples (v0.5–v0.8)
|
||||
- **Kanban board**: colonnes avec sous-groupes, drag & drop cartes
|
||||
- **Table view**: colonnes triables, groupes rétractables
|
||||
- **Status overview**: Donut chart SVG avec segments, compteurs
|
||||
- **Team Load**: Barres empilées par membre
|
||||
- **Detailed board**: cartes avec propriétés visibles
|
||||
|
||||
### Filtres & Tri (v0.7)
|
||||
- **Filtres cumulables** (logique AND) avec pastilles
|
||||
- **Tri multi-critères** hiérarchique
|
||||
- **Filtre par statut**: checkboxes multiples
|
||||
- Sidebar gauche avec sections hiérarchiques
|
||||
- Topbar avec breadcrumbs (workspace > projet > page)
|
||||
- Dark mode Notion: `#191919` fond, `#222222` sidebar
|
||||
- Éditeur de blocs: slash menu (/), navigation clavier, placeholders
|
||||
|
||||
### Intégration Gitea
|
||||
- **Issues Gitea → cartes** Notion-style
|
||||
- Sync labels, milestones, assignees, due dates
|
||||
- OAuth2 Gitea, CSRF, rate limiting
|
||||
- Webhooks pour sync temps réel
|
||||
- Issues Gitea → cartes, sync labels, milestones, assignees, due dates
|
||||
- OAuth2 Gitea, CSRF, rate limiting, webhooks
|
||||
|
||||
## Stack
|
||||
|
||||
| Couche | Techno |
|
||||
|--------|--------|
|
||||
| Frontend | Jinja2 + HTMX + Alpine.js + SortableJS + CSS 31KB |
|
||||
| Frontend | Jinja2 + HTMX + Alpine.js + SortableJS + CSS |
|
||||
| Backend | Python 3.12 + FastAPI + httpx |
|
||||
| BDD | SQLite (WAL mode) — `/data/flowdeck.db` |
|
||||
| BDD | SQLite (WAL, 21 tables) — `/data/flowdeck.db` |
|
||||
| Déploiement | Docker (python:3.12-slim), docker-compose |
|
||||
|
||||
## Configuration
|
||||
@@ -65,25 +82,16 @@ APP_PORT=8080
|
||||
DATABASE_URL=sqlite:////data/flowdeck.db
|
||||
```
|
||||
|
||||
## Roadmap
|
||||
|
||||
Voir [ROADMAP.md](ROADMAP.md) — v1.4.0 Propriétés Avancées → v2.0.0 Multi-Users.
|
||||
|
||||
## Développement
|
||||
|
||||
```bash
|
||||
python3 -m venv venv
|
||||
source venv/bin/activate
|
||||
pip install -r requirements.txt
|
||||
uvicorn app.main:app --reload --port 8080
|
||||
```
|
||||
|
||||
## Tests
|
||||
|
||||
```bash
|
||||
python3 -m pytest tests/ -v # 34/34 passent
|
||||
python3 -m pytest tests/ -v # 73/73 passent
|
||||
```
|
||||
|
||||
## Roadmap
|
||||
|
||||
Voir [ROADMAP.md](ROADMAP.md) — 7/7 blocs complétés, 52/52 features ✅
|
||||
|
||||
## Licence
|
||||
|
||||
MIT
|
||||
|
||||
+39
-51
@@ -1,71 +1,59 @@
|
||||
# WORKLOAD — FlowDeck Notion Clone
|
||||
|
||||
> **Début**: 2026-07-08 | **Version actuelle**: v1.3.0 | **Prochaine**: v1.4.0
|
||||
> **Début**: 2026-07-08 | **Version**: v2.1.0 | **Statut**: COMPLET ✅
|
||||
|
||||
## Avancement Global
|
||||
|
||||
| Phase | Description | Statut | Tests |
|
||||
|-------|-------------|--------|-------|
|
||||
| v0.2 – v0.9 | Base → Backend | ✅ | — |
|
||||
| Version | Description | Statut | Tests |
|
||||
|---------|-------------|--------|-------|
|
||||
| v0.2–v0.9 | Base → Backend | ✅ | — |
|
||||
| v1.0 | Production (lifespan, CI/CD) | ✅ | 28/28 |
|
||||
| v1.1 | Pages & Sidebar Notion | ✅ | — |
|
||||
| v1.2 | Éditeur Notion (slash menu, blocs) | ✅ | — |
|
||||
| v1.3 | Database Concept (collections) | ✅ | 34/34 |
|
||||
| v1.4 | Propriétés Avancées (14 types) | ⬜ | — |
|
||||
| v1.5 | Relations & Rollups | ⬜ | — |
|
||||
| v1.6 | Vues Calendrier/Timeline/Gallery/List | ⬜ | — |
|
||||
| v1.7 | Vues Améliorées (group_by, card_size) | ⬜ | — |
|
||||
| v1.8 | Sub-items & Dépendances | ⬜ | — |
|
||||
| v1.9 | My Tasks & Dashboard Unifié | ⬜ | — |
|
||||
| v2.0 | Éditeur Complet & Multi-Users | ⬜ | — |
|
||||
| v1.4 | Propriétés Avancées (21 types) | ✅ | 38/38 |
|
||||
| v1.5 | Relations, Rollups, Formulas | ✅ | 43/43 |
|
||||
| v1.6 | Vues (Calendar, Gallery, List, Timeline) | ✅ | 49/49 |
|
||||
| v1.7 | Vues Améliorées (view config, save-as) | ✅ | — |
|
||||
| v1.8 | Sub-items & Dépendances | ✅ | 56/56 |
|
||||
| v1.9 | My Tasks Dashboard | ✅ | 60/60 |
|
||||
| v2.0 | Multi-User + Editor Complete | ✅ | 67/67 |
|
||||
| v2.1 | Public API, Webhooks, PWA | ✅ | 73/73 |
|
||||
|
||||
---
|
||||
## Blocs Complétés
|
||||
|
||||
## v1.3.0 — Database Concept (complété 2026-07-10)
|
||||
| Bloc | Features | Statut |
|
||||
|------|----------|--------|
|
||||
| Bloc 1 | Database Concept | ✅ 6/6 |
|
||||
| Bloc 2 | Propriétés Avancées | ✅ 14/14 |
|
||||
| Bloc 3 | Vues Manquantes | ✅ 10/10 |
|
||||
| Bloc 4 | Sub-items & Dépendances | ✅ 7/7 |
|
||||
| Bloc 5 | My Tasks | ✅ 7/7 |
|
||||
| Bloc 6 | Éditeur Complet | ✅ 8/8 |
|
||||
| Bloc 7 | Fonctions Transversales | ✅ |
|
||||
|
||||
### Tables
|
||||
- [x] `collections` — base de données abstraite, schéma JSON, lien Gitea optionnel
|
||||
- [x] `collection_pages` — pages avec `parent_id`, `property_values_json`, `position`
|
||||
- [x] `collection_views` — vues configurables (`view_type`, `config_json`)
|
||||
- [x] Index: `idx_cp_collection`, `idx_cp_parent`, `idx_cp_gitea`
|
||||
**Total: 52/52 features (100%)**
|
||||
|
||||
### API
|
||||
- [x] `GET/POST /db/api` — lister/créer collections
|
||||
- [x] `GET/PUT/DELETE /db/api/{id}` — CRUD collection
|
||||
- [x] `GET/POST /db/{id}/pages/api` — pages dans une collection
|
||||
- [x] `GET/PUT/DELETE /db/pages/{id}/api` — CRUD page standalone
|
||||
- [x] `GET /db/{id}` — vue HTML collection
|
||||
- [x] `GET /db/boards/api` — boards Gitea comme collections
|
||||
- [x] `GET /db/board/{o}/{r}/api` — board spécifique
|
||||
- [x] `POST /db/board/{o}/{r}/sync` — sync board → collection
|
||||
## Architecture
|
||||
|
||||
### Adapter
|
||||
- [x] `GiteaBoardCompat` — `from_board()`, `from_card()`, `list_boards_as_collections()`, `sync_to_collection()`
|
||||
### Tables (21)
|
||||
`users`, `user_tokens`, `boards`, `cards`, `notes`, `col_mapping`, `checklists`, `checklist_items`, `project_properties`, `property_values`, `ai_keywords`, `pages`, `collections`, `collection_pages`, `collection_views`, `collection_properties`, `workspaces`, `workspace_members`, `comments`, `page_history`, `favorites`, `database_templates`, `page_templates`, `webhook_subscriptions`
|
||||
|
||||
### Infra
|
||||
- [x] CSRF exempté pour `/db/`
|
||||
- [x] Version 1.0.0 → 1.3.0
|
||||
- [x] 34/34 tests passent
|
||||
- [x] Tag git v1.3.0
|
||||
### Routeurs (11)
|
||||
`dashboard`, `board`, `notes`, `api`, `auth`, `webhooks`, `collections`, `my_tasks`, `workspace`, `public_api` + app-level routes
|
||||
|
||||
---
|
||||
### Services (6)
|
||||
`GiteaClient`, `FormulaEngine`, `RollupEngine`, `GiteaBoardCompat`, `property_types`, `webhook_outbound`
|
||||
|
||||
## Prochaines étapes (v1.4.0 — Propriétés Avancées)
|
||||
### Endpoints (85+)
|
||||
CRUD collections/pages, 5 vues HTML, relations/rollups/formulas, sub-items/dependencies, my-tasks, workspaces, comments, history, favorites, templates, CSV import/export, public sharing, public API v1, webhooks, PWA manifest
|
||||
|
||||
### Table `collection_properties`
|
||||
- [ ] Remplacer `project_properties` (liée à `project_owner/name`) par `collection_properties` (liée à `collections`)
|
||||
- [ ] Types: number, checkbox, url, email, phone, status (9 couleurs), files, unique_id
|
||||
- [ ] Auto-propriétés: created_time, created_by, last_edited_time, last_edited_by
|
||||
- [ ] Format number: nombre, %, €, $, £, ¥
|
||||
## Stack
|
||||
|
||||
### Intégration UI
|
||||
- [ ] Property editor inline par type (select dropdown, date picker, checkbox...)
|
||||
- [ ] Affichage des propriétés dans la modale de détail page
|
||||
- [ ] Migration project_properties → collection_properties
|
||||
|
||||
## Notes
|
||||
|
||||
- **Stack**: FastAPI + Jinja2 + HTMX + Alpine.js + SortableJS + SQLite (WAL)
|
||||
- **Docker**: python:3.12-slim, port 8080, volume /data
|
||||
- **Tests**: pytest, 34 tests, client TestClient avec SQLite temporaire
|
||||
- **Backend**: Python 3.12 + FastAPI + httpx
|
||||
- **Frontend**: Jinja2 + HTMX + Alpine.js + SortableJS + CSS 31KB
|
||||
- **BDD**: SQLite WAL mode, 21 tables, foreign keys ON
|
||||
- **Auth**: OAuth2 Gitea + sessions signed (itsdangerous) + token API
|
||||
- **Déploiement**: Docker (python:3.12-slim), docker-compose, port 8080
|
||||
- **Tests**: pytest, 73 tests, TestClient avec SQLite temporaire
|
||||
- **CI/CD**: Gitea Actions (.gitea/workflows/ci.yml)
|
||||
|
||||
Reference in New Issue
Block a user