Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 0 additions & 3 deletions .coveragerc
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,6 @@ branch = True
omit =
*/tests/*
*/__main__.py
# Deprecated Tkinter frontend: tests are skipped (tests/gui/conftest.py)
# pending deletion in phase 2 — exclude it from the coverage gate too.
*/profiles/gui/*

[report]
exclude_lines =
Expand Down
26 changes: 8 additions & 18 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ Ce document définit les standards d'architecture, les principes de conception e
## 📁 Structure de l'Application

> **⚠️ Keep in sync with the code** : cet arbre reflète `src/profiles/` au
> 31/10/2026. Toute création, suppression ou déplacement de module doit mettre
> 04/11/2026. Toute création, suppression ou déplacement de module doit mettre
> à jour cette section dans le même commit — ainsi que `tests/AGENTS.md`,
> qui reflète l'arbre de tests 1:1. Avant d'utiliser un chemin d'import des
> extraits ci-dessous, vérifiez-le contre `src/profiles/core/__init__.py`
Expand Down Expand Up @@ -96,12 +96,6 @@ src/profiles/
│ ├── lifecycle.py # Cycle de vie de l'application
│ └── instance.py, handoff.py # Instances multiples, handoff de port
│
├── gui/ # ⚠️ DÉPRÉCIÉ (Tkinter) — suppression prévue (phase 2)
│ │ # Ne pas y ajouter de fonctionnalités ; le
│ │ # front-end par défaut est web/. Tests skippés.
│ ├── main_window.py # Orchestration des widgets
│ └── ui.py, styles.py, theme.py, i18n.py, controllers/, presentation/
│
├── utils/ # Fonctions utilitaires pures & stateless
│ ├── file_utils.py # scan_directory, launch_file, open_with_default_app
│ ├── network.py # hostname, IP, username
Expand All @@ -125,7 +119,7 @@ src/profiles/
**Responsabilité** : Logique métier pure, indépendante de tout framework

**Règles** :
- ✅ Zéro dépendance vers les couches UI (React/web, desktop, Tkinter, CLI)
- ✅ Zéro dépendance vers les couches UI (React/web, desktop, CLI)
- ✅ Fonctions pures où c'est possible
- ✅ Retourner des structures de données typées (jamais `None` pour les collections)
- ✅ Documenter toutes les fonctions publiques avec des docstrings
Expand Down Expand Up @@ -159,18 +153,14 @@ def merge(base, override):
### Couche Présentation

**Couche par défaut** : `profiles.web` (React PWA) + `profiles.server`
(FastAPI) + `profiles.desktop` (shell PyWebView). Le Tkinter
`profiles.gui` est **déprécié** (suppression prévue, phase 2) — ne pas y
ajouter de fonctionnalités ; les extraits ci-dessous ne valent que pour la
maintenance de la couche legacy.
(FastAPI) + `profiles.desktop` (shell PyWebView).

**Responsabilité** : Gestion exclusive des objets d'interface et de l'expérience utilisateur

**Règles** :
- ✅ Tous les objets d'UI sont créés et gérés dans la couche présentation
- ✅ Déléguer la logique métier à `profiles.core.*`
- ✅ Gérer uniquement le code de liaison spécifique aux widgets/composants
- ✅ Utiliser les widgets `ttk` pour un theming cohérent (legacy Tkinter)
- ✅ Implémenter une gestion d'erreur robuste pour les actions utilisateur
- ✅ Ne jamais contenir de logique métier directe

Expand Down Expand Up @@ -212,7 +202,7 @@ def on_scan_button_click(self) -> None:
- ✅ Fonctions helpers stateless uniquement
- ✅ Aucune connaissance du domaine applicatif
- ✅ Aucun effet de bord (fonctions pures)
- ✅ Agnostiques au framework (pas de Tkinter, pas de CLI libs)
- ✅ Agnostiques au framework (aucune dépendance UI ou CLI)
- ✅ Documenter les formats d'entrée/sortie attendus

**Exemple** :
Expand Down Expand Up @@ -367,7 +357,7 @@ class LoggerFactory:
...


# gui/main_window.py - UI only
# couche présentation - UI only
class MainWindow:
"""Main application window."""

Expand Down Expand Up @@ -686,8 +676,8 @@ def test_file_processor():

### Conformité Architecture

- [ ] **Core layer** n'a pas d'imports UI (Tkinter, FastAPI, React)
- [ ] **Couche présentation** (web/server/desktop, ou gui legacy) délègue la logique métier à `profiles.core.*`
- [ ] **Core layer** n'a pas d'imports UI (FastAPI, React)
- [ ] **Couche présentation** (web/server/desktop) délègue la logique métier à `profiles.core.*`
- [ ] **Utils layer** est stateless et agnostique au framework
- [ ] **Imports** suivent les boundaries des couches
- [ ] **Aucune dépendance circulaire** entre modules
Expand Down Expand Up @@ -818,7 +808,7 @@ jobs:

5. **Présenter les résultats** dans le format du front-end (table terminal, panel curses, etc.)

6. **Zéro import d'UI** nécessaire (pas de Tkinter, pas de React)
6. **Zéro import d'UI** nécessaire (aucun framework d'interface importé)

---

Expand Down
12 changes: 1 addition & 11 deletions README.fr.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,6 @@
- [💻 Utilisation](#-utilisation)
- [Mode Web (par défaut)](#mode-web-par-défaut)
- [Mode Navigateur / PWA (serveurs partagés)](#mode-navigateur--pwa-serveurs-partagés)
- [Mode Tkinter historique (déprécié)](#mode-tkinter-historique-déprécié)
- [Mode CLI / Headless (en cours de développement)](#mode-cli--headless-en-cours-de-développement)
- [🛠 Configuration](#-configuration)
- [🏗 Architecture](#-architecture)
Expand Down Expand Up @@ -202,14 +201,6 @@ ProFiles --server-only

Lance le serveur FastAPI **sans** la fenêtre de bureau. Pointez n'importe quel navigateur du réseau vers `http://<hôte>:8088` (port par défaut). Voir le [Guide Serveur Réseau](./docs/network-server-guide.fr.md) pour la configuration firewall, hostname et multi-clients.

### Mode Tkinter historique (déprécié)

```bash
ProFiles --tkinter
```

L'interface de bureau Tkinter d'origine est conservée pour compatibilité uniquement et est **dépréciée** — les nouvelles fonctionnalités arrivent exclusivement sur le frontend web.

### Mode CLI / Headless (en cours de développement)

```bash
Expand Down Expand Up @@ -334,9 +325,8 @@ ProFiles/
│ ├── web/ # Frontend PWA React + TypeScript + Vite (src/, dist/, build.py)
│ ├── desktop/ # Shell de bureau PyWebView & cycle de vie du serveur en fond
│ ├── launch/ # Résolution au lancement : handoff *.profiles & sélection de config
│ ├── gui/ # Couche de présentation Tkinter historique (dépréciée)
│ ├── utils/ # Helpers stateless (file ops, network, search parser, shortcut)
│ ├── app.py # Cycle de vie applicatif (web desktop, server-only, Tk, headless)
│ ├── app.py # Cycle de vie applicatif (web desktop, server-only, headless)
│ └── config.py # Ré-exports pratiques pour l'API de configuration
├── docs/ # Documentation utilisateur (EN/FR)
└── tests/ # Suite Pytest
Expand Down
12 changes: 1 addition & 11 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,6 @@
- [💻 Usage](#-usage)
- [Web Mode (default)](#web-mode-default)
- [Browser / PWA Mode (shared servers)](#browser--pwa-mode-shared-servers)
- [Legacy Tkinter Mode (deprecated)](#legacy-tkinter-mode-deprecated)
- [CLI / Headless Mode (work in progress)](#cli--headless-mode-work-in-progress)
- [🛠 Configuration](#-configuration)
- [🏗 Architecture](#-architecture)
Expand Down Expand Up @@ -201,14 +200,6 @@ ProFiles --server-only

Runs the FastAPI server **without** the desktop window. Point any browser on the network at `http://<host>:8088` (default port). See the [Network Server Guide](./docs/network-server-guide.en.md) for firewall, hostname and multi-client setup.

### Legacy Tkinter Mode (deprecated)

```bash
ProFiles --tkinter
```

The original Tkinter desktop interface is kept for compatibility only and is **deprecated** — new features land exclusively on the web frontend.

### CLI / Headless Mode (work in progress)

```bash
Expand Down Expand Up @@ -333,9 +324,8 @@ ProFiles/
│ ├── web/ # React + TypeScript + Vite PWA frontend (src/, dist/, build.py)
│ ├── desktop/ # PyWebView desktop shell & background server lifecycle
│ ├── launch/ # Launch-time resolution: *.profiles handoff & config selection
│ ├── gui/ # Legacy Tkinter presentation layer (deprecated)
│ ├── utils/ # Stateless helpers (file ops, network, search parser, shortcut)
│ ├── app.py # Application lifecycle (web desktop, server-only, Tk, headless)
│ ├── app.py # Application lifecycle (web desktop, server-only, headless)
│ └── config.py # Convenience re-exports for config API
├── docs/ # User documentation (EN/FR)
└── tests/ # Pytest suite
Expand Down
8 changes: 2 additions & 6 deletions docs/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -137,9 +137,7 @@ python -m profiles --init
| Command | Description |
| -------------------------------------- | ---------------------------------------------- |
| `python -m profiles` | Launch the web UI in a PyWebView desktop shell (default) |
| `python -m profiles --web` | Same as above (explicit) |
| `python -m profiles --server-only` | Run the FastAPI server only (browser/PWA use) |
| `python -m profiles --tkinter` | Legacy Tkinter interface (deprecated) |
| `python -m profiles --headless` | Run in CLI mode |
| `python -m profiles --headless FILE` | Launch specific file (no GUI) |
| `python -m profiles --init` | Generate configuration file |
Expand All @@ -158,9 +156,8 @@ ProFiles/
│ ├── web/ # React + TypeScript + Vite PWA frontend (src/, dist/, build.py)
│ ├── desktop/ # PyWebView desktop shell & background server lifecycle
│ ├── launch/ # Launch-time resolution: *.profiles handoff & config selection
│ ├── gui/ # Legacy Tkinter presentation layer (deprecated)
│ ├── utils/ # Stateless utility functions
│ ├── app.py # Application lifecycle (web desktop, server-only, Tk, headless)
│ ├── app.py # Application lifecycle (web desktop, server-only, headless)
│ └── config.py # Convenience re-exports for config API
├── tests/ # Unit tests
├── docs/ # This documentation
Expand Down Expand Up @@ -200,9 +197,8 @@ For additional support:

- **Python**: 3.11+
- **Interface**: Web UI (React + TypeScript + Vite PWA) served by FastAPI, desktop shell via PyWebView
- **Legacy GUI (deprecated)**: Tkinter + [Sun Valley ttk theme](https://github.com/rbdende/Sun-Valley-ttk-theme) (`sv-ttk`) + `darkdetect` — use `--tkinter`, kept for compatibility only
- **License**: See `LICENCE` file

---

*Last updated: 2026-10-23*
*Last updated: 2026-11-04*
2 changes: 1 addition & 1 deletion docs/configuration-profile.en.md
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ This section defines default parameters applicable to all machines.
| `title` | string | `""` | Custom title appended to main window |
| `gui_auto_launch` | bool | `true` | Show GUI on `python -m profiles` |
| `close_after_execute` | bool | `false` | Close window after successful launch |
| `theme` | enum | `"auto"` | UI theme: `"light"`, `"dark"`, or `"auto"` (Material Design 3; `"auto"` detects system theme via `darkdetect`) |
| `theme` | enum | `"auto"` | UI theme: `"light"`, `"dark"`, or `"auto"` (Material Design 3; the web UI resolves `"auto"` and unknown values to dark) |
| `language` | enum | `"en"` | GUI language: `"en"` (English) or `"fr"` (French); toggled from the status-bar language button (cycles en → fr → en) |
| `search_dir` | string | `""` | Default search directory for Directory field |
| `recursive_search` | bool | `false` | Initial state of Recursive checkbox |
Expand Down
7 changes: 0 additions & 7 deletions docs/hooks-guide.en.md
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,6 @@ Displays a message to the user with Markdown support.

- **Web mode (default)**: The notification appears as a workflow modal in the web frontend (the dialog opens in the desktop shell / browser; blocking steps wait for user confirmation in the UI)
- **Headless mode**: Prints formatted message to standard output
- **Legacy Tkinter backend**: Displays a Tkinter window with formatted text
- **Always succeeds**: Cannot fail, so `on_failure` is ignored
- **Markdown support**: GitHub-flavored Markdown (see [Rich Notifications](#rich-notifications-markdown))

Expand Down Expand Up @@ -422,10 +421,6 @@ and multi-line YAML block scalars behave the same.
quotes) stay as literal text lines
- See `render_text()` in `src/profiles/core/environment/render.py`

**Legacy Tkinter backend**: renders the historical subset only (`#`/`##`/`###`
headings, bold, italic, inline code, `\\n`); richer constructs degrade to
plain text.

---

## Error Handling and Failmode
Expand Down Expand Up @@ -1008,13 +1003,11 @@ outcome = run_workflow(

- In web mode: The notification opens as a workflow modal in the frontend (check the desktop window / browser tab)
- In headless mode: Message printed to standard output
- Legacy Tkinter backend missing Tkinter: automatic fallback to headless

**Solutions**:

1. In web mode, look at the workflow modal in the frontend (it may be awaiting your confirmation)
2. In headless mode, check console for messages
3. With `--tkinter`, verify Tkinter is installed (`python -m tkinter`)

### Problem: Frequent Timeout

Expand Down
7 changes: 0 additions & 7 deletions docs/hooks-guide.fr.md
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,6 @@ Affiche un message à l'utilisateur avec support du Markdown.

- **Mode web (par défaut)** : La notification s'affiche dans une modale de workflow du frontend web (la fenêtre de bureau / le navigateur attend la confirmation utilisateur pour les étapes bloquantes)
- **Mode headless** : Imprime le message formaté sur la sortie standard
- **Backend Tkinter historique** : Affiche une fenêtre Tkinter avec le texte formaté
- **Toujours réussi** : Ne peut pas échouer, donc `on_failure` est ignoré
- **Support Markdown** : Markdown GitHub-flavored (voir [Notifications Riches](#notifications-riches-markdown))

Expand Down Expand Up @@ -425,10 +424,6 @@ se comportent identiquement.
bloc (listes, tableaux, citations) restent en lignes littérales
- Voir `render_text()` dans `src/profiles/core/environment/render.py`

**Backend Tkinter historique** : rend le sous-ensemble historique uniquement
(titres `#`/`##`/`###`, gras, italique, code en ligne, `\\n`) ; les
constructions plus riches dégradent en texte plat.

---

## Gestion des Erreurs et Failmode
Expand Down Expand Up @@ -946,13 +941,11 @@ outcome = run_workflow(

- En mode web : La notification s'ouvre dans une modale de workflow du frontend (vérifiez la fenêtre de bureau / l'onglet navigateur)
- En mode headless : Le message est imprimé sur la sortie standard
- Backend Tkinter sans Tkinter : fallback automatique vers headless

**Solutions** :

1. En mode web, regardez la modale de workflow dans le frontend (elle attend peut-être votre confirmation)
2. En mode headless, vérifiez la console pour les messages
3. Avec `--tkinter`, vérifiez que Tkinter est installé (`python -m tkinter`)

### Problème : Timeout Fréquent

Expand Down
Loading
Loading