feat: v6.3.0 API publique complete v2 (REST /api/v2, scopes, OpenAPI)
FlowDeck CI / lint (push) Successful in 1m13s
FlowDeck CI / test (push) Successful in 9m20s
FlowDeck CI / docker (push) Successful in 1m10s

- Router api_v2.py (~100 endpoints) : tokens, users, workspaces/members,
  collections, pages, proprietes, vues/dashboards, commentaires/mentions,
  notifications, favoris/tags/recents, partage/publish, historique, sprints,
  templates, export/import, forges, recherche FTS, admin, webhooks CRUD
- Helpers api_v2_helpers.py : Bearer unifie (sha256/expires_at/extension_devices),
  scopes hierarchiques read<write<admin, pagination + X-Total-Count, ISO-8601,
  RFC 7807, idempotence, audit, rate-limit par token
- Migration 20 : api_tokens.scopes/expires_at, webhook_deliveries,
  api_audit_log, idempotency_keys
- main.py : handler d'erreurs unifie StarletteHTTPException, /docs + /redoc
- config : PUBLIC_API_INSECURE_OK (dev only), API_V2_RATE_LIMIT_PER_TOKEN
- OpenAPI docs/openapi-v2.json (402 chemins), tests/test_public_api_v2.py (24)
- Docs : CHANGELOG (v6.2.0/6.2.1 clipper + v6.3.0), ROADMAP, API_GUIDE_V6,
  V6_Web_Clipper, README, ARCHITECTURE, /help
- Suite complete 668 verte, ruff OK
This commit is contained in:
2026-09-20 13:19:29 -04:00
parent ea19d1d050
commit 95bc861cdb
25 changed files with 25078 additions and 66 deletions
+5 -3
View File
@@ -166,9 +166,11 @@ def test_e2e_pwa_offline_spec_present():
# ── phase 8: release docs + version ────────────────────────────────────────
def test_version_bumped_to_6_0_0():
assert (ROOT / "VERSION").read_text(encoding="utf-8").strip() == "6.0.0"
assert 'version="6.0.0"' in (ROOT / "app" / "main.py").read_text(encoding="utf-8")
def test_version_at_least_6_0_0():
"""VERSION and app/main.py agree and are >= 6.0.0 (PWA release baseline)."""
version = (ROOT / "VERSION").read_text(encoding="utf-8").strip()
assert tuple(int(x) for x in version.split(".")) >= (6, 0, 0)
assert f'version="{version}"' in (ROOT / "app" / "main.py").read_text(encoding="utf-8")
def test_help_documents_offline_mode(client):