Lot en un seul commit: les deux features partagent les mêmes contrats
(domain/settings.rs, DTO, commandes Tauri/HTTP, web-server) et les mêmes
surfaces UI — la séparation par fichiers était impossible sans chirurgie
de hunks risquant des états intermédiaires non compilables (convention
lot des batches #310-#313 et #315).
#325 — icône configurable par projet, watermark CLI custom:
- domaine: ProjectIconSet (devicon, simple-icons, lucide, idea),
ProjectIconRef validé (nom ASCII 1..=64, -_. internes), champ icon
optionnel sur ProjectSettings; sérialisation camelCase et try_from
strict
- application: UpdateProjectSettings.execute accepte un patch
theme_color OU icon (absent = inchangé, null = défaut produit), tests
in-dependants avec store mémoire
- backend/app-tauri/web-server: ProjectIconRefDto, UpdateProjectSettingsRequestDto
avec icon optionnel (désérialisation additive), commandes
update_project_settings alignées Tauri/HTTP, tests DTO et HTTP
(défaut null, set, clear, nom invalide rejeté)
- frontend: catalogue projectIcons (recherche EN), ProjectIconPicker en
grille multi-lignes dans Paramètres projet, affichage de l'icône dans
ProjectTabs et watermark grand format à faible opacité en fond de CLI
custom; ports ProjectSettings.icon, Partial<ProjectSettings>,
adapters tauri/mock/http et tests alignés
#326 — localisation FR/EN et traduction des textes IdeA:
- domaine: IdeaLanguage (fr | en), champ language optionnel sur
IdeaUserSettings (absence = défaut produit, série additive validée)
- backend/web-server: UserSettingsDto.language, update_user_settings
accepte language, tests HTTP alignés; fixtures structured_launch_d3
mises à jour
- frontend: i18n/ (catalogue FR/EN, I18nProvider, scan anti-régression
des sources visibles), GeneralSettings avec sélecteur de langue dans
les paramètres, setupI18n dans vitest; migration de l'ensemble des
textes hardcodés vers le catalogue sur toutes les surfaces (agents,
layout, projets, tickets, sprints, web, plugins, permissions, git,
templates, skills, mémoire, model servers, embedder, first-run,
devices, scheduled tasks, workstate, dialogs), FR conservé par défaut;
recherche d'icônes #325 en anglais conformément au ticket
QA verte sur feature/batch-325-326-project-icons-localisation. Aucun push.
- #310: horodatage de tous les messages et événements de conversation visibles — composant partagé EntryTimestamp, timestamps propagés dans le transcript chat, les annonces inter-agent et le viewer de conversation, normalisation côté domain/adapters (conversation_log, paginate).
- #311: stop d'agent robuste pour PTY non monté, sessions headless et CLI custom — lifecycle/orchestrator durcis, ponts chat app-tauri/web-server alignés, arrêt fiable sans session orpheline.
- #312: préférence globale d'interface terminal par défaut — nouveau store settings (domain/application/infrastructure + tests), DTO et commandes backend, adapter frontend userSettings, panneau TerminalSettings dans les paramètres globaux.
- #313: Paramètres du projet — contexte de projet éditable et couleur de thème par projet (ProjectSettingsPanel + projectTheme), teinte des onglets projet, persistance via DTO projet.
QA verte (GO QA sur feature/batch-310-311-312-313-chat-stop-prefs-theme) — vérifications Git: git diff --cached --check OK; staging borné à crates/ et frontend/ (74 fichiers, +2105/-531), commit unique de lot conforme à la convention des lots (précédents batch-151/158/159, batch-210/211/212) car les fichiers partagés (dto.rs, commands.rs, CustomAgentChatView) entrelacent les 4 tickets.
fichiers .ideai/* (agents/test.md, chat-drafts.json, system-permissions.json, tickets/counter.json, tickets/index.json, tickets/308-313/), attachments/ et scripts/ hors périmètre et préservés en worktree ; aucun push.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
ConversationViewer remplace « Aucun tour pour le moment » par un diagnostic
differentié (agent actif sans tour affichable, transcript non synchronisé,
activité sur un autre fil) avec action « Ouvrir le fil actif ». Le panneau
Work state affiche le résumé du fil du ticket actif et ProjectsView/WebWorkspace
câblent onOpenConversation.