Skip to content

[Handoff] Quiz Widget intelligent (pomodoro + QCM) — phase brainstorming #1

Description

@titoo-dev

🎯 Objectif (goal de la session)

Créer un widget flottant intelligent pour DankMaterialShell. But : garder le cap face à l'IA — l'humain doit continuer à apprendre activement. Le widget apparaît selon des cycles pomodoro et pose des quiz à choix unique (QCM) sur les sujets préférés de l'utilisateur (configurés au premier setup). On commence par les QCM à choix unique.

Texte original : « j'aimerai creer un widget intelligent, le but est de garder le cap par rapport à l'IA en ce moment, l'humain n'arrive plus à apprendre des choses, on va creer un widget flottant qui va apparaitre pendant des temps suivant des cycle (pomodoro) pour selon les sujets de ma preference (premier setup) me pose des quiz , d'abord on va commencer par des quizz à choix unique »

📍 État de la session : phase BRAINSTORMING (design pas encore écrit)

On suit le process superpowers:brainstorming. Aucun code écrit. On a fini l'exploration du codebase et verrouillé 3 décisions d'architecture. Reste : finir l'exploration de 2 fichiers, présenter le design, l'écrire dans un spec doc, le faire valider, puis passer à writing-plans.

✅ Décisions verrouillées (via AskUserQuestion)

  1. Source des questions : HYBRIDE — banque locale JSON par défaut + toggle « Générer via IA » dans les réglages. Marche offline ET extensible.
  2. Présentation : CARTE FLOTTANTE EN COIN (bas-droit), interactive, persistante jusqu'à réponse (pas un toast éphémère). Moins intrusive qu'un modal centré.
  3. Hébergement : PLUGIN AUTONOME de type daemon, dans quickshell/PLUGINS/QuizWidget/ (versionné) → déployé vers ~/.config/DankMaterialShell/plugins/. Isolé, n'altère pas le code cœur du shell, facilite les rebases avec upstream.

🧠 Compréhension de l'architecture (déjà explorée)

DankMaterialShell = shell Wayland en Quickshell (QML) + backend Go. Système de plugins complet documenté dans quickshell/PLUGINS/README.md.

Points clés pour ce projet :

  • Plugin type daemon : un PluginComponent chargé en arrière-plan (via Instantiator/Loader dans DMSShell.qml). Peut tenir des Timer, lancer des Process, réagir à des signaux. Exemple : quickshell/PLUGINS/WallpaperWatcherDaemon/.
  • Fenêtre flottante : les plugins ont un accès QML complet → le daemon peut instancier sa propre PanelWindow/overlay (pattern LazyLoader). Référence à étudier : module OSD (quickshell/Modules/OSD/) pour une overlay transitoire en coin/bord.
  • PopoutService (injecté auto via property var popoutService: null) : contrôle les popouts/modals natifs. Doc : quickshell/PLUGINS/POPOUT_SERVICE.md. (Utile mais ne fournit pas de « fenêtre custom » générique — on créera la nôtre.)
  • Persistance des réglages : PluginSettings + composants StringSetting/ToggleSetting/SelectionSetting/ListSettingWithInput, et API pluginService.savePluginData/loadPluginData. Parfait pour le « premier setup » des sujets. Nécessite permission settings_write.
  • Appels externes / API : Proc.runCommand(id, cmd[], cb(stdout, exitCode), debounceMs) depuis qs.Common — pour appeler l'API LLM (curl) sur le chemin IA.
  • Thème : singleton Theme (quickshell/Common/Theme.qml) ; widgets réutilisables dans quickshell/Widgets/ (StyledRect, StyledText, DankIcon, etc.). THEME_REFERENCE.md dans PLUGINS.
  • Schéma plugin : quickshell/PLUGINS/plugin-schema.json (à valider — PAS encore lu en détail).

📐 Esquisse de structure cible

quickshell/PLUGINS/QuizWidget/
├── plugin.json          # type: daemon, permissions: [settings_read, settings_write]
├── QuizDaemon.qml        # cycle pomodoro (Timer) + déclenche l'overlay
├── QuizOverlay.qml       # PanelWindow flottante coin bas-droit + carte QCM
├── QuizSettings.qml      # premier setup : sujets, durées pomodoro, toggle IA + clé API
├── QuizEngine.js         # sélection question (banque locale) + parsing réponse IA
└── banks/                # banques JSON par sujet (ex: algorithmes.json)

⚙️ Defaults proposés (NON confirmés — à valider au design)

  • Cadence pomodoro : travail 25 min → quiz à la fin du cycle (configurable : durée travail, on/off, pause).
  • Provider IA : Anthropic Claude (l'utilisateur est un power-user Claude Code). Modèle rapide/éco par défaut (ex. Haiku). Clé API stockée dans les réglages du plugin. ⚠️ Au moment d'implémenter le chemin IA : consulter la skill claude-api pour les IDs de modèles / pricing à jour.
  • Flux QCM : question + N choix (radio) → sélection → submit → feedback correct/incorrect + explication → fermeture. Stats légères de session (répondu/correct) en option (YAGNI).
  • Sujets : free-text ajoutés par l'utilisateur ; mappés vers fichiers de banque locale + prompts IA. Quelques sujets seed livrés.

▶️ Prochaines étapes (reprendre ici)

  1. Finir l'exploration : lire quickshell/PLUGINS/plugin-schema.json (valider le manifest daemon) + module quickshell/Modules/OSD/ (modèle d'overlay flottante transitoire).
  2. Présenter le design (sections : archi, composants, flux de données, gestion d'erreurs, test) et le valider.
  3. Écrire le spec : docs/superpowers/specs/2026-06-19-quiz-widget-design.md + commit.
  4. Self-review du spec, puis validation utilisateur.
  5. Passer à superpowers:writing-plans pour le plan d'implémentation.

🔁 Comment reprendre sur le nouveau PC

  • Repo : titoo-dev/DankMaterialShell (fork). Upstream : AvengeMedia/DankMaterialShell.
  • Branche de travail : feat/dynamic-island (cette session y est ; à confirmer si on veut une branche dédiée feat/quiz-widget).
  • Le goal hook est session-scoped : il ne suivra pas. Re-set avec /goal <texte ci-dessus> si tu veux la même contrainte, ou continue simplement depuis ce ticket.
  • Démarre la nouvelle session par : « Reprends le handoff de l'issue # » et pointe Claude vers ce ticket.

🤖 Handoff généré avec Claude Code

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions