- v6.8.0 Sites & Forms publics (migrations 24)
- v6.9.0 Recherche sémantique hybride + Ask AI (migration 25)
- v7.0.0 Automations v2 multi-étapes + Workers sandboxés (migration 26)
- v7.1.0 Calendar sync Google/CalDAV + Meeting Notes (migration 27)
- v7.2.0 Enterprise : SCIM 2.0, 2FA TOTP/passkeys, audit UI, agent approvals (migration 28)
- v7.3.0 Wiki/Teamspaces, verified pages, collab polish, charts, unfurl (migration 29)
- docs V68→V73, ROADMAP/CHANGELOG/WORKLOAD à jour, VERSION 7.3.0
- A9 : flowdeck.db, flowdeck_dev.db, test-commit.md, upload_test.txt et e2e/{node_modules,shots,test-results} désindexés + ignorés (.gitignore/.dockerignore)
5.1 KiB
V7.3.0 — Wiki / Teamspaces + Polish
Statut : ✅ Implémenté (2026-09-29) — 72 tests · suite complète 1016 verts · Roadmap :
ROADMAP.md § v7.3.0Référence Notion : Wikis + Teamspaces + Verified pages + Charts/Number + réactions/follow/guests + page analytics. Existant : workspaces + rôles, backlinks, wiki-links[[,collection_dashboards, Chart.js, comments,site_views.
1. Teamspaces + Verified
CREATE TABLE teamspaces (
id INTEGER PRIMARY KEY AUTOINCREMENT, workspace_id INTEGER NOT NULL REFERENCES workspaces(id) ON DELETE CASCADE,
name TEXT NOT NULL, private BOOLEAN NOT NULL DEFAULT 0, UNIQUE(workspace_id, name));
CREATE TABLE teamspace_members (teamspace_id INTEGER NOT NULL REFERENCES teamspaces(id) ON DELETE CASCADE,
user_id INTEGER NOT NULL REFERENCES users(id), role TEXT NOT NULL DEFAULT 'editor', UNIQUE(teamspace_id, user_id));
ALTER TABLE pages ADD COLUMN teamspace_id INTEGER REFERENCES teamspaces(id);
ALTER TABLE collections ADD COLUMN teamspace_id INTEGER REFERENCES teamspaces(id);
CREATE TABLE page_verifications (
page_id INTEGER PRIMARY KEY REFERENCES pages(id) ON DELETE CASCADE,
verified_by INTEGER REFERENCES users(id), note TEXT DEFAULT '',
verified_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, expires_at TIMESTAMP);
private=1sans membership → 404 (comme collections restricted) ;PermissionManager.get_teamspace_role().- Badge ✅ (owner/editor vérifie, expiry 90j défaut, job notif owner à J-7) ; filtre
verified:1en search + palette ; page/wikiauto (verified + recents + teamspaces).
2. Blocs & charts
- Bloc
mermaid: code → SVG serveur simmdcprésent, sinon fallback bloc code + rendu client (déjà Prism) ; export HTML/PDF embarque le SVG. equation_inline: KaTeX inline (lib déjà self-hostéestatic/js/katex.min.js).- Bloc
progress:{rollup_ref}→ barre % (réutiliseRollupEngine). - Charts : type
number(big KPI), dashboards multi-DB en page (grillecollection_dashboards+ sourceany, limite 200 groupes documentée), « ouvrir la ligne » depuis chart.- Livré (follow-up) :
number= KPIcount|sum|avg|min|max(_chart_aggregate/_fmt_number) ; rendu grilleGET /db/{collection_id}/dashboards/{dashboard_id}— widgets àcollection_id(= sourceany), ≤ 40 widgets, ≤ 200 lignes/chart (CHART_MAX_GROUPS) ; la config de vue est choisie selon leview_typedemandé (bug corrigé : la première vue était toujours utilisée) ; un widget pointant sur une DB restreinte est sauté (pas de leak).
- Livré (follow-up) :
3. Collab polish
comment_reactions (comment_id, user_id, emoji, UNIQUE)+ picker emoji.page_follows (page_id, user_id)→ notifpage.updatedaux followers (preffollows, défaut ON si commenté).- Livré (follow-up) :
wiki.notify_followers_of_page_update(throttle 10 min,actor_idexclu) branché dansautomations.fire_event;actor_iddans les payloadsboard.update_page/save_page_blocks; auto-follow à la création d'un commentaire (wiki.ensure_follow).
- Livré (follow-up) :
- Guests :
guest_shares (page_id, email, token, role viewer|commenter, expires_at)— accès sans compte via/g/<token>(session guest limitée, auditée). page_views (page_id, day, views PK)— même patternsite_views, exposéGET /board/api/pages/{id}/views(owner only).
4. Tests (tests/test_v73_wiki_polish.py, 72 ✅)
Teamspace private 404/grant, verify badge/expiry/notif, /wiki home, blocs
mermaid/equation/progress + export, réactions, follow, guest token/expiry,
page views. Follow-ups : sidebar cross-workspace (sans workspace_id),
page HTML /wiki/teamspaces/{id} (owner 200 / outsider 404 API + non-leak
HTML), auto-follow par commentaire, notif page.updated throttlée + acteur
exclu, ensure_follow idempotent, regex + unfurl gitea/github (tokens
mockés) + endpoint /board/api/og/metadata, KPI number + _chart_values
(0 conservé) + dashboards multi-DB + 404.
5. Implémentation réelle vs. design initial
- Livré : schema §1 à l'identique ; routes sous
/api/v2/wiki/*(le design parlait de/wikicomme page HTML : l'agrégat est exposé en JSON, le front Tri-state reste à faire) ; blocs §2 (mermaid,equation_inline,progress) rendus côté serveur parapp/services/wiki_blocks.pyet branchés surexport.blocks_to_html; collab §3 complet. - Follow-ups livrés : sidebar par teamspace (section
base.html+ listing cross-workspace + page HTML), chartsnumber+ dashboards multi-DB, notifpage.updateddéclenchée à l'édition + auto-follow, unfurlgitea:/github:dansPOST /board/api/og/metadata(champs bookmark persistés), UI Settings → Audit branchée sur/api/v2/audit/logs. Les 21 casses SSO (test_v67_sso.py) sont corrigées (installpython3-saml==1.16.0+authlib==1.8.0). - Écart assumé :
progressagrège directement surcollection_pages.property_values_jsonplutôt que viaRollupEngine, dont la signature exige une chaîne de relations + une page source — ce qu'un bloc de progression embarqué dans une page n'a pas.