From 4cbb4ee7c7520daa387478dec926cab5fd1c9dc5 Mon Sep 17 00:00:00 2001 From: Blomios Date: Sat, 15 Aug 2026 00:56:12 +0200 Subject: [PATCH] =?UTF-8?q?chore(idea):=20bookkeeping=20.ideai=20=E2=80=94?= =?UTF-8?q?=20tickets=20#184-#207,=20contexts=20agents,=20m=C3=A9moire=20(?= =?UTF-8?q?pr=C3=A9paration=20train=20refonte=20web=20#202)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .ideai/agents/git.md | 21 +- .ideai/agents/main.md | 7 +- .ideai/agents/qa.md | 4 +- ...ef903ab8-clipboard-image-1786615764094.png | Bin 0 -> 55618 bytes .../c9115923-bff3-4633-abda-f44def903ab8.json | 13 + ...7946bb24-clipboard-image-1786606150202.png | Bin 0 -> 49535 bytes .../37fc5557-3969-403b-a3f9-0a9a7946bb24.json | 13 + .ideai/chat-drafts.json | 14 + .ideai/idea-android-plugin.json | 2 +- .ideai/memory/MEMORY.md | 1 + ...factor-surface-addressable-architecture.md | 43 +++ .ideai/tickets/184/carnet.md | 16 + .ideai/tickets/184/issue.md | 17 + .ideai/tickets/185/carnet.md | 26 ++ .ideai/tickets/185/issue.md | 17 + .ideai/tickets/186/carnet.md | 35 ++ .ideai/tickets/186/issue.md | 22 ++ .ideai/tickets/187/carnet.md | 33 ++ .ideai/tickets/187/issue.md | 23 ++ .ideai/tickets/188/carnet.md | 38 ++ .ideai/tickets/188/issue.md | 25 ++ .ideai/tickets/189/carnet.md | 40 ++ .ideai/tickets/189/issue.md | 20 + .ideai/tickets/190/carnet.md | 13 + .ideai/tickets/190/issue.md | 25 ++ .ideai/tickets/191/carnet.md | 14 + .ideai/tickets/191/issue.md | 26 ++ .ideai/tickets/193/carnet.md | 44 +++ .ideai/tickets/193/issue.md | 18 + .ideai/tickets/194/carnet.md | 28 ++ .ideai/tickets/194/issue.md | 17 + .ideai/tickets/195/carnet.md | 38 ++ .ideai/tickets/195/issue.md | 17 + .ideai/tickets/196/carnet.md | 15 + .ideai/tickets/196/issue.md | 17 + .ideai/tickets/197/carnet.md | 17 + .ideai/tickets/197/issue.md | 17 + .ideai/tickets/198/carnet.md | 16 + .ideai/tickets/198/issue.md | 17 + .ideai/tickets/199/carnet.md | 19 + .ideai/tickets/199/issue.md | 17 + .ideai/tickets/200/carnet.md | 14 + .ideai/tickets/200/issue.md | 17 + .ideai/tickets/201/carnet.md | 12 + .ideai/tickets/201/issue.md | 17 + .ideai/tickets/202/carnet.md | 47 +++ .ideai/tickets/202/issue.md | 17 + .ideai/tickets/203/carnet.md | 6 + .ideai/tickets/203/issue.md | 17 + .ideai/tickets/204/carnet.md | 6 + .ideai/tickets/204/issue.md | 17 + .ideai/tickets/205/carnet.md | 6 + .ideai/tickets/205/issue.md | 17 + .ideai/tickets/206/carnet.md | 6 + .ideai/tickets/206/issue.md | 17 + .ideai/tickets/207/carnet.md | 6 + .ideai/tickets/207/issue.md | 17 + .ideai/tickets/58/carnet.md | 6 +- .ideai/tickets/58/issue.md | 8 +- .ideai/tickets/93/carnet.md | 6 +- .ideai/tickets/93/issue.md | 8 +- .ideai/tickets/counter.json | 2 +- .ideai/tickets/index.json | 345 +++++++++++++++++- 63 files changed, 1388 insertions(+), 31 deletions(-) create mode 100644 .ideai/attachments/agent-chat/005d1f90-0c20-4c98-9950-643c13bae1e1/c9115923-bff3-4633-abda-f44def903ab8-clipboard-image-1786615764094.png create mode 100644 .ideai/attachments/agent-chat/005d1f90-0c20-4c98-9950-643c13bae1e1/c9115923-bff3-4633-abda-f44def903ab8.json create mode 100644 .ideai/attachments/agent-chat/67e0305d-91b1-4632-9e0a-fc188399efe6/37fc5557-3969-403b-a3f9-0a9a7946bb24-clipboard-image-1786606150202.png create mode 100644 .ideai/attachments/agent-chat/67e0305d-91b1-4632-9e0a-fc188399efe6/37fc5557-3969-403b-a3f9-0a9a7946bb24.json create mode 100644 .ideai/chat-drafts.json create mode 100644 .ideai/memory/web-ui-refactor-surface-addressable-architecture.md create mode 100644 .ideai/tickets/184/carnet.md create mode 100644 .ideai/tickets/184/issue.md create mode 100644 .ideai/tickets/185/carnet.md create mode 100644 .ideai/tickets/185/issue.md create mode 100644 .ideai/tickets/186/carnet.md create mode 100644 .ideai/tickets/186/issue.md create mode 100644 .ideai/tickets/187/carnet.md create mode 100644 .ideai/tickets/187/issue.md create mode 100644 .ideai/tickets/188/carnet.md create mode 100644 .ideai/tickets/188/issue.md create mode 100644 .ideai/tickets/189/carnet.md create mode 100644 .ideai/tickets/189/issue.md create mode 100644 .ideai/tickets/190/carnet.md create mode 100644 .ideai/tickets/190/issue.md create mode 100644 .ideai/tickets/191/carnet.md create mode 100644 .ideai/tickets/191/issue.md create mode 100644 .ideai/tickets/193/carnet.md create mode 100644 .ideai/tickets/193/issue.md create mode 100644 .ideai/tickets/194/carnet.md create mode 100644 .ideai/tickets/194/issue.md create mode 100644 .ideai/tickets/195/carnet.md create mode 100644 .ideai/tickets/195/issue.md create mode 100644 .ideai/tickets/196/carnet.md create mode 100644 .ideai/tickets/196/issue.md create mode 100644 .ideai/tickets/197/carnet.md create mode 100644 .ideai/tickets/197/issue.md create mode 100644 .ideai/tickets/198/carnet.md create mode 100644 .ideai/tickets/198/issue.md create mode 100644 .ideai/tickets/199/carnet.md create mode 100644 .ideai/tickets/199/issue.md create mode 100644 .ideai/tickets/200/carnet.md create mode 100644 .ideai/tickets/200/issue.md create mode 100644 .ideai/tickets/201/carnet.md create mode 100644 .ideai/tickets/201/issue.md create mode 100644 .ideai/tickets/202/carnet.md create mode 100644 .ideai/tickets/202/issue.md create mode 100644 .ideai/tickets/203/carnet.md create mode 100644 .ideai/tickets/203/issue.md create mode 100644 .ideai/tickets/204/carnet.md create mode 100644 .ideai/tickets/204/issue.md create mode 100644 .ideai/tickets/205/carnet.md create mode 100644 .ideai/tickets/205/issue.md create mode 100644 .ideai/tickets/206/carnet.md create mode 100644 .ideai/tickets/206/issue.md create mode 100644 .ideai/tickets/207/carnet.md create mode 100644 .ideai/tickets/207/issue.md diff --git a/.ideai/agents/git.md b/.ideai/agents/git.md index 12dda684..f27b4041 100644 --- a/.ideai/agents/git.md +++ b/.ideai/agents/git.md @@ -1,9 +1,9 @@ # Git — Agent de gestion du dépôt git local > Tu es l'**agent Git** d'IdeA. Ton unique responsabilité est la **gestion du dépôt -> git local** : commits de l'application, création et bascule de branches, merges et -> rebases. Tu es le **seul** à décider de la topologie des branches et à manipuler -> l'historique local. Main te sollicite ; tu décides et tu exécutes. +git local** : commits de l'application, création et bascule de branches, merges et +rebases. Tu es le **seul** à décider de la topologie des branches et à manipuler +l'historique local. Main te sollicite ; tu décides et tu exécutes. --- @@ -20,9 +20,12 @@ Tu t'occupes **du local du repo git**, rien d'autre : c'est **toi** qui tranches s'il faut une nouvelle branche, un checkout/switch, ou rien. Après chaque implémentation, Main revient vers toi pour que tu décides si un **merge** doit avoir lieu quelque part, ou non. - - C'est a toi seul de faire les commits, les merges etc, donc fais les toi, ne demande pas à un autre agent de le faire pour toi, tu es celui qui effectue l'action. +- Une tâche git **n'est pas finie** tant que les modifications pertinentes ne sont pas + **commitées sur la bonne branche** et, quand le cycle le demande, **mergées sur la bonne + branche cible**. Une tâche n'est pas considérée terminée si les changements utiles restent + seulement présents dans le worktree. **Hors périmètre :** - Tu **n'écris pas de code de feature** (c'est DevBackend/DevFrontend). @@ -63,7 +66,7 @@ feature/* ← une branche PAR nouvelle feature. C'est là que le dev se fait. Tu interviens à **deux moments** du cycle de dev (cf. CLAUDE.md §3), encadré par Main : -``` +```text 1. Main : « nouvelle feature X » (architecture cadrée par Architect) → TOI : décider de la branche. - nouvelle feature indépendante → créer feature/X depuis develop, switch dessus @@ -110,11 +113,13 @@ tu le dis. ## 5. Délégation & collaboration -- Tu réponds à Main via le protocole d'orchestration IdeA (`idea_reply`). Quand Main te - délègue une tâche (message `[IdeA · tâche de … · ticket …]`), tu traites puis tu - appelles **impérativement** `idea_reply(result=…)`. +- Tu réponds à Main via l'orchestration native de l'IDE : traite la demande et termine + ton tour avec ta réponse. Ne gère pas de ticket et n'appelle pas d'outil de remise + de résultat. - Tu rends compte clairement : branche courante, ce que tu as committé (hash + message court), ce que tu as mergé/rebasé, et **ta décision** (pourquoi cette branche, pourquoi ce merge ou ce non-merge). +- Ta réponse finale doit être explicite sur l'état du worktree : s'il reste des fichiers + modifiés ou non suivis pertinents, la tâche n'est pas finie et tu dois le dire. - En cas de conflit de merge/rebase, tu le signales à Main avec le détail ; tu ne forces pas une résolution hasardeuse. diff --git a/.ideai/agents/main.md b/.ideai/agents/main.md index 4043b02d..b6cdd443 100644 --- a/.ideai/agents/main.md +++ b/.ideai/agents/main.md @@ -104,4 +104,9 @@ Si une réflexion est récurrente et aboutit toujours à la même solution, cré Si aucun ticket n'existe pour la demande de l'utilisateur, créé le. S'il existe, réouvre le. Mets à jour le status des tickets que tu traites: in progress, closed, QA. Mets a jour le carnet des tickets que tu traites en cas de futur reprise de ce ticket pour éviter -de boucler plusieurs fois sur les memes soucis. \ No newline at end of file +de boucler plusieurs fois sur les memes soucis. + +A chaque build de l'appimage, j'aimerais que tu demandes à Git d'incrémenter la version, par le tag, +du commit sur lequel à été faite l'appimage sous cette forme: vx.y.z (donc par exemple v1.0.0). +Incrémente x pour chaque build faite sur la branche main,y pour chaque build faite sur la branche develop +et z pour chaque build faite sur une autre branche. \ No newline at end of file diff --git a/.ideai/agents/qa.md b/.ideai/agents/qa.md index 65364e38..ec9b11e1 100644 --- a/.ideai/agents/qa.md +++ b/.ideai/agents/qa.md @@ -11,7 +11,7 @@ Tu **établis la vérité sur l'état du code** : - **Écrire les tests** pertinents : unitaires sur les règles, d'intégration sur les - frontières, ciblés sur ce que la feature a réellement changé. + frontières, fonctionnels et ciblés sur ce que la feature a réellement changé. - **Exécuter pour de vrai** : tu lances les commandes et tu lis la sortie. Un test que tu n'as pas vu passer n'est pas passé. - **Rapporter les échecs** : la commande, la sortie réelle, et ton diagnostic. @@ -49,7 +49,7 @@ un diagnostic, pas une excuse pour passer au vert. 1. Le dev a implémenté sur la branche décidée par Git. 2. Main te confie la validation - → TOI : écrire les tests pertinents, puis les EXÉCUTER. + → TOI : écrire les tests unitaires et fonctionnels pertinents, puis les EXÉCUTER. - couvrir les invariants signalés par Architect - couvrir les cas limites : vide, erreur, absence, concurrence, volume - couvrir ce que la feature a changé, pas tout le projet diff --git a/.ideai/attachments/agent-chat/005d1f90-0c20-4c98-9950-643c13bae1e1/c9115923-bff3-4633-abda-f44def903ab8-clipboard-image-1786615764094.png b/.ideai/attachments/agent-chat/005d1f90-0c20-4c98-9950-643c13bae1e1/c9115923-bff3-4633-abda-f44def903ab8-clipboard-image-1786615764094.png new file mode 100644 index 0000000000000000000000000000000000000000..8ef481294745c1626e48ed4e9e955263295e0eb2 GIT binary patch literal 55618 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

CeI>^-7@@RaoXPslC40$eh3OIa<`2 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 literal 0 HcmV?d00001 diff --git a/.ideai/attachments/agent-chat/67e0305d-91b1-4632-9e0a-fc188399efe6/37fc5557-3969-403b-a3f9-0a9a7946bb24.json b/.ideai/attachments/agent-chat/67e0305d-91b1-4632-9e0a-fc188399efe6/37fc5557-3969-403b-a3f9-0a9a7946bb24.json new file mode 100644 index 00000000..6e3bbe95 --- /dev/null +++ b/.ideai/attachments/agent-chat/67e0305d-91b1-4632-9e0a-fc188399efe6/37fc5557-3969-403b-a3f9-0a9a7946bb24.json @@ -0,0 +1,13 @@ +{ + "id": "37fc5557-3969-403b-a3f9-0a9a7946bb24", + "projectId": "97b49ac2-8376-4aa3-8ea9-bf3ac81d0023", + "agentId": "a6c6ea12-bfc6-4bdc-8031-324102dfa34d", + "sessionId": "67e0305d-91b1-4632-9e0a-fc188399efe6", + "filename": "clipboard-image-1786606150202.png", + "mime": "image/png", + "sizeBytes": 49535, + "sourceKind": "clipboard", + "storagePath": "agent-chat/67e0305d-91b1-4632-9e0a-fc188399efe6/37fc5557-3969-403b-a3f9-0a9a7946bb24-clipboard-image-1786606150202.png", + "readablePath": "/home/anthony/Documents/Projects/IdeA/.ideai/attachments/agent-chat/67e0305d-91b1-4632-9e0a-fc188399efe6/37fc5557-3969-403b-a3f9-0a9a7946bb24-clipboard-image-1786606150202.png", + "createdAt": 1786606151172 +} \ No newline at end of file diff --git a/.ideai/chat-drafts.json b/.ideai/chat-drafts.json new file mode 100644 index 00000000..ec1bba80 --- /dev/null +++ b/.ideai/chat-drafts.json @@ -0,0 +1,14 @@ +{ + "version": 1, + "drafts": [ + { + "key": { + "projectId": "97b49ac2-8376-4aa3-8ea9-bf3ac81d0023", + "layoutId": "508364ae-30d7-4ffb-9476-e4c8ddc660bf", + "nodeId": "3ee0bc92-2510-4f43-9734-10c47bdc0fb4" + }, + "text": "Normalement il y avait eu un fix la dessus. Je veux que", + "updatedAtMs": 1786700418725 + } + ] +} \ No newline at end of file diff --git a/.ideai/idea-android-plugin.json b/.ideai/idea-android-plugin.json index ba8b8d1b..565718c3 100644 --- a/.ideai/idea-android-plugin.json +++ b/.ideai/idea-android-plugin.json @@ -5,7 +5,7 @@ "probableAppModule": null, "projectId": "97b49ac2-8376-4aa3-8ea9-bf3ac81d0023", "projectRoot": "/home/anthony/Documents/Projects/IdeA", - "updatedAt": "2026-08-11T13:05:40.238Z" + "updatedAt": "2026-08-14T22:34:46.971Z" }, "ownerAgentId": null, "ownerAgentMapping": {}, diff --git a/.ideai/memory/MEMORY.md b/.ideai/memory/MEMORY.md index 5e605e87..025817f6 100644 --- a/.ideai/memory/MEMORY.md +++ b/.ideai/memory/MEMORY.md @@ -83,3 +83,4 @@ - [ticket156-reply-progress-foundation](ticket156-reply-progress-foundation.md) — memory note ticket156-reply-progress-foundation - [opencode-streaming-progress-mcp-surfacing-157](opencode-streaming-progress-mcp-surfacing-157.md) — memory note opencode-streaming-progress-mcp-surfacing-157 - [toolchain-rust-partage-acces-agents](toolchain-rust-partage-acces-agents.md) — Diagnostic et solution durable pour l'accès partagé au toolchain Rust/Tauri dans les run-dirs agents isolés. +- [web-ui-refactor-surface-addressable-architecture](web-ui-refactor-surface-addressable-architecture.md) — memory note web-ui-refactor-surface-addressable-architecture diff --git a/.ideai/memory/web-ui-refactor-surface-addressable-architecture.md b/.ideai/memory/web-ui-refactor-surface-addressable-architecture.md new file mode 100644 index 00000000..49620721 --- /dev/null +++ b/.ideai/memory/web-ui-refactor-surface-addressable-architecture.md @@ -0,0 +1,43 @@ +--- +name: web-ui-refactor-surface-addressable-architecture +description: memory note web-ui-refactor-surface-addressable-architecture +metadata: + type: project +--- +# Refonte web UI/UX fondee sur des surfaces adressables + +- Date: 2026-08-14 +- Type: decision + +## Decision + +La refonte web d'IdeA est cadre comme un noyau fonctionnel commun servi par deux shells UX distincts: +- `desktop-parity workspace` +- `mobile task-flow` + +L'abstraction structurante retenue n'est pas le composant React ni le panneau, mais la `surface adressable`. + +## Invariants + +- Le `LayoutTree` existant reste borne au canevas central projet et ne doit pas modeliser les tabs/fenetres/sheets du shell navigateur. +- Un nouveau contrat `WorkspaceSession` porte la composition du shell desktop web: zones, surfaces ouvertes, presentations (`inPlace | tab | window | sheet`), focus et restauration. +- Les donnees metier restent derriere les gateways frontend existants; la refonte shell ne doit pas dupliquer ni recabler les features aux transports. +- La synchro cross-window/tab releve d'un bus de presentation cote web; le backend reste source de verite des donnees metier et du live state. +- Chaque surface declare une politique de partage explicite (`bound`, `followFocus`, `ephemeral`) pour eviter les restaurations ambiguës et les vues stale. + +## Consequences + +- La parite desktop web avec l'AppImage doit etre fonctionnelle, pas une imitation aveugle des primitives OS. +- Le mobile n'est pas un desktop responsive reduit; il suit un task-flow mono-surface priorisant les usages courts et decisionnels. +- Toute feature actuelle d'IdeA doit etre mappee a un catalogue de surfaces ouvrables et a une ou plusieurs presentations selon le contexte. + +## Programme recommande + +1. A0 inventaire complet des features/surfaces. +2. A1 noyau surfaces et politique d'ouverture. +3. A2 shell desktop web. +4. A3 ouverture en onglet/fenetre navigateur. +5. A4 persistance/restauration/synchro. +6. A5 migration progressive des features. +7. A6 shell mobile dedie. +8. A7 hardening QA. \ No newline at end of file diff --git a/.ideai/tickets/184/carnet.md b/.ideai/tickets/184/carnet.md new file mode 100644 index 00000000..04c7bedb --- /dev/null +++ b/.ideai/tickets/184/carnet.md @@ -0,0 +1,16 @@ +--- +issueRef: "#184" +version: 6 +updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +updatedAt: 1786603420794 +--- +2026-08-13 +- Demande utilisateur: rebuild AppImage. +- Workflow charge via skill `build-appimage`. +- 1er essai frontend build depuis `/home/anthony/Documents/Projects/IdeA` KO pour contrainte environnement/sandbox: `EROFS` lors de l'ecriture du fichier temporaire Vite `frontend/vite.config.ts.timestamp-*.mjs`. +- Cause: dans cette session, le project root source est monté en lecture seule; Vite/Tauri ont besoin d'ecrire dans l'arbre de travail (`frontend/dist`, `target`, fichiers temporaires de config Vite). +- Contournement valide: creation d'un workspace de build minimal sous `/tmp/IdeA-build-lite` via `git archive HEAD`, puis symlink de `frontend/node_modules` vers la source en lecture seule. +- Frontend build OK depuis `/tmp/IdeA-build-lite/frontend`. +- Tauri build OK avec `CARGO_HOME=/tmp/idea-cargo-home APPIMAGE_EXTRACT_AND_RUN=1 NO_STRIP=1`. +- Artefact verifie present: `/tmp/IdeA-build-lite/target/release/bundle/appimage/IdeA_0.3.0_amd64.AppImage` (106994846 bytes, ~103M). +- Note: l'AppImage a ete produite dans le workspace temporaire writable, pas dans le project root source read-only de cette session. diff --git a/.ideai/tickets/184/issue.md b/.ideai/tickets/184/issue.md new file mode 100644 index 00000000..4f546b6c --- /dev/null +++ b/.ideai/tickets/184/issue.md @@ -0,0 +1,17 @@ +--- +id: "262f0119-7ed3-4b31-a90a-f764d7ec46f6" +number: 184 +title: "Rebuild AppImage IdeA" +status: "closed" +priority: "medium" +sprint: null +links: [] +agentRefs: [] +attachments: [] +createdBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +createdAt: 1786602778561 +updatedAt: 1786603420794 +version: 6 +--- +Reconstruire l'AppImage Linux IdeA selon le workflow validé (frontend build puis tauri build --bundles appimage) et vérifier la présence de l'artefact produit. \ No newline at end of file diff --git a/.ideai/tickets/185/carnet.md b/.ideai/tickets/185/carnet.md new file mode 100644 index 00000000..15d2d5a4 --- /dev/null +++ b/.ideai/tickets/185/carnet.md @@ -0,0 +1,26 @@ +--- +issueRef: "#185" +version: 13 +updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +updatedAt: 1786709806993 +--- +2026-08-13 +- Constaté depuis Main que `.ideai/permissions.json` est déjà en `allow` global sur read/write/delete/executeBash. +- DevBackend et DevFrontend ont confirmé un runtime effectif limité à `.git` + run dir + `/tmp`. +- Relaunch complet de DevBackend testé: même runtime après relance, donc ce n'est pas une simple vieille session restée bloquée. +- Les tests backend verrouillent actuellement que le project root ne soit PAS ajouté comme writable root pour Codex structured (`agent_lifecycle.rs`). +- Vérification en cours: comparer avec un agent non-Codex pour savoir si le blocage est spécifique à Codex structured ou plus global au runtime IdeA. +- Confirmation live du 2026-08-13 par DevBackend: impossible d'écrire dans `/home/anthony/Documents/Projects/IdeA` hors `.git`; writable roots effectifs = run dir agent + `.git` + `/tmp`; erreur de probe = `Read-only file system`. +- Confirmation live du 2026-08-13 par DevFrontend: même verdict; writable roots effectifs = run dir agent + `.git` + `/tmp`; `findmnt -T /home/anthony/Documents/Projects/IdeA` vu `ext4 ro,...`; probe d'écriture racine projet en échec `Read-only file system`. +- Décision Main: lancer maintenant le cycle du ticket sur la base de ce constat reproductible côté Dev. +- Cadrage Architecture reçu: la divergence est verrouillée dans `crates/application/src/agent/lifecycle.rs` et ses tests; lot minimal = réinjecter `project.root` dans `writable_roots` structured Codex en `workspace-write`, réaligner le `SandboxPlan` OS, et mettre à jour les tests. +- Décision Git reçue: branche de travail à utiliser = `fix/185-codex-structured-project-root-write` depuis `develop`; lancement demandé via worktree `/tmp` pour contourner le blocage d'écriture du root projet. +- DevBackend a implémenté le fix dans le worktree `/tmp/idea-worktrees/fix-185-codex-structured-project-root-write` sans commit, avec modifications de `crates/application/src/agent/lifecycle.rs` et `crates/application/tests/agent_lifecycle.rs`. +- QA du 2026-08-13: verdict VERT sur le périmètre #185 via `cargo test -p application --test agent_lifecycle codex_ -- --nocapture` (15/15 verts). Régression plus large `cargo test -p application --test agent_lifecycle -- --nocapture`: 91/92 verts, seul échec restant = `launch_conventionfile_injects_assigned_skills_in_order`, diagnostiqué hors périmètre du ticket #185. +- Ticket passé en statut QA; attente des opérations Git locales (commit puis éventuel merge dans `develop`) pour figer l'état à builder dans l'AppImage. +2026-08-14 +- Retour utilisateur: meme apres le fix precedent et une nouvelle AppImage, les agents n'ont toujours pas l'ecriture au root projet quand les permissions sont accordees. +- Architect: cause probable complete = non-canonicalisation du `project_root` fourni a `SandboxContext` / `compile_sandbox_plan`, surtout visible en contexte AppImage/chemin non canonique. +- DevBackend: aligne le `project_root` canonique entre `SandboxContext`, `writable_roots` Codex `workspace-write` et plan OS sandbox; ajoute la couverture de non-regression sur cas symlink / non-canonique. +- QA 2026-08-14: tests cibles permissions verts mais branche rouge sur `launch_conventionfile_injects_assigned_skills_in_order`. +- DevBackend a ensuite corrige le test de convention file pour refleter le contrat actuel des skills (`# Skills disponibles` avant la persona, ordre d'assignation, sans injecter les corps complets) ; suite locale annoncee verte, revalidation QA demandee. \ No newline at end of file diff --git a/.ideai/tickets/185/issue.md b/.ideai/tickets/185/issue.md new file mode 100644 index 00000000..db60a7a7 --- /dev/null +++ b/.ideai/tickets/185/issue.md @@ -0,0 +1,17 @@ +--- +id: "3eea8ad2-e8c5-4a1a-881e-dbf129aa60b0" +number: 185 +title: "Codex structured sandbox: rétablir l'écriture du project root pour les agents Dev sans perdre l'accès à .git" +status: "inProgress" +priority: "critical" +sprint: null +links: [] +agentRefs: [{"agentId":"b4730d7f-c54d-4736-8a04-c6203aa2fd49","role":"assigned"},{"agentId":"fe887179-933f-47d4-960f-c3b06827f86c","role":"assigned"}] +attachments: [] +createdBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +createdAt: 1786606428812 +updatedAt: 1786709806993 +version: 13 +--- +L'UI expose une policy Allow/Write globale, mais les sessions structurées Codex semblent recevoir un runtime dont les writable_roots sont limités aux racines Git enrichies. Les tests backend actuels verrouillent même que le project root ne soit pas ajouté comme writable root. Impact: Main et potentiellement DevBackend/DevFrontend ne peuvent plus modifier le code applicatif malgré une UI permissive. Objectif: réaligner la projection structured Codex et/ou le plan OS sandbox avec la policy UI voulue, en conservant l'accès Git ajouté récemment. \ No newline at end of file diff --git a/.ideai/tickets/186/carnet.md b/.ideai/tickets/186/carnet.md new file mode 100644 index 00000000..85560124 --- /dev/null +++ b/.ideai/tickets/186/carnet.md @@ -0,0 +1,35 @@ +--- +issueRef: "#186" +version: 3 +updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +updatedAt: 1786620908484 +--- +2026-08-13 — cadrage initial + +Constat utilisateur +- Les messages de progress dans la CLI custom semblent n'apparaître qu'au moment d'un tool/MCP, pas au moment où l'agent les émet. +- Le progress est dupliqué au lieu d'évoluer de running vers done. +- Les fichiers/images collés n'affichent plus de référence textuelle exploitable dans le chat. +- /tmp n'est pas viable pour les gros artefacts ; besoin d'un tmp partagé géré par IdeA. +- Le chat custom doit être agrandissable, taille actuelle conservée par défaut. + +Cadrage UX +- Une seule ligne de statut active par tour ; progress agent prioritaire, tool en fallback, done remplace running. +- Les attachments doivent être affichés comme appendice compact du message, avec ref type [file 1]/[image 1]. +- Le chat doit être redimensionnable par poignée, avec reset et bornes. + +Cadrage architecte +- Le flux structuré possède déjà ReplyEvent/ReplyProgress/ChatBridge/CustomAgentChatView ; vérifier projection et corrélation plutôt que refondre. +- Probable manque de contrat d'identité stable des progress items ; prévoir upsert par progress_id plutôt qu'heuristique par label. +- La projection textuelle [file N] doit devenir canonique côté backend au moment du submit du tour, puis persistée dans le transcript et propagée au runtime. +- Le tmp partagé doit être une ressource gouvernée par IdeA via handles opaques + leases + GC, pas un path libre. +- La taille du chat custom doit rester un état frontend local à la cellule, pas un état de layout métier. + +Constat lecture code rapide +- Recherche source : ReplyProgress/send_with_tap/CustomAgentChatView/attachments présents dans le code. +- Il existe des tests front nommés autour des labels d'attachments dans CustomAgentChatView, ce qui suggère une régression ou une projection rompue. +- Il existe aussi des tests backend/runtime sur send_with_tap live pour Codex/OpenCode ; vérifier si le provider de la CLI custom suit bien le contrat ou si l'UI ne projette pas certains progress avant tool activity. + +Prochaine étape +- Demander à Git la branche de travail. +- Faire diagnostiquer précisément par DevFrontend/DevBackend la cause réelle sur les 5 sujets avant implémentation. \ No newline at end of file diff --git a/.ideai/tickets/186/issue.md b/.ideai/tickets/186/issue.md new file mode 100644 index 00000000..3b6ab826 --- /dev/null +++ b/.ideai/tickets/186/issue.md @@ -0,0 +1,22 @@ +--- +id: "3b22c481-5dc0-4168-aac5-9ca0bb9e0c36" +number: 186 +title: "CLI custom — progress agent/tool, anti-duplication, refs d'attachments, tmp partagé géré, chat redimensionnable" +status: "closed" +priority: "high" +sprint: null +links: [] +agentRefs: [] +attachments: [] +createdBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +createdAt: 1786616207827 +updatedAt: 1786620908484 +version: 3 +--- +Lot de 5 sujets remontés par l'utilisateur le 2026-08-13 : +1. Vérifier/corriger que les messages de progress dans la CLI custom s'affichent au moment où l'agent les émet, et non seulement lors d'un appel de tool/MCP. +2. Corriger la duplication du progress : un même item ne doit pas être réémis en doublon, il doit transiter running -> done. +3. Restaurer dans le chat une référence textuelle vers les fichiers/images collés (style [file 1]) pour que l'agent puisse les référencer explicitement. +4. Concevoir/fournir un dossier temporaire partagé entre projets IdeA, non borné comme /tmp, géré par IdeA avec politique d'accès et de nettoyage. +5. Permettre d'étirer/agrandir la zone chat dans la CLI custom, en gardant la taille actuelle par défaut. \ No newline at end of file diff --git a/.ideai/tickets/187/carnet.md b/.ideai/tickets/187/carnet.md new file mode 100644 index 00000000..493d4707 --- /dev/null +++ b/.ideai/tickets/187/carnet.md @@ -0,0 +1,33 @@ +--- +issueRef: "#187" +version: 5 +updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +updatedAt: 1786620907499 +--- +2026-08-13 — implémentation backend/runtime + +Fichiers backend modifiés +- crates/domain/src/ports.rs +- crates/backend/src/dto.rs +- crates/app-tauri/src/chat.rs +- crates/infrastructure/src/session/codex.rs +- crates/infrastructure/src/session/mod.rs +- crates/app-tauri/tests/chat_bridge.rs +- crates/app-tauri/tests/dto_chat.rs + +Résultat backend +- `ReplyProgress` porte désormais un `progress_id` optionnel, sérialisé en `progressId`. +- `ProgressSettler` corrèle d'abord par `progress_id`, puis fallback heuristique legacy. +- Codex émet maintenant les progress message live dès `agent_message` avec id stable, au lieu d'attendre l'événement suivant. +- Les progress tool/MCP Codex reçoivent aussi des ids stables dérivés des ids natifs. + +Tests backend verts +- `cargo test -p infrastructure codex_ -- --nocapture` +- `cargo test -p app-tauri --test chat_bridge -- --nocapture` +- `cargo test -p app-tauri --test dto_chat -- --nocapture` +- `cargo test -p domain reply_progress -- --nocapture` +- `git diff --check -- ` + +Reste à faire frontend +- Lire `progressId`. +- Upsert/remplacement running -> done sans duplicat. \ No newline at end of file diff --git a/.ideai/tickets/187/issue.md b/.ideai/tickets/187/issue.md new file mode 100644 index 00000000..a49fbc05 --- /dev/null +++ b/.ideai/tickets/187/issue.md @@ -0,0 +1,23 @@ +--- +id: "033bcaa1-fe43-460e-94a0-3c16a178519c" +number: 187 +title: "[CLI custom] Progress live agent/tool + anti-duplication running/done" +status: "closed" +priority: "high" +sprint: null +links: [{"target":"#186","kind":"relatesTo"}] +agentRefs: [] +attachments: [] +createdBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +createdAt: 1786616824270 +updatedAt: 1786620907499 +version: 5 +--- +Sous-ticket de #186. Corriger le rendu des progress dans la CLI custom : +- confirmer et corriger le fait que certains progress agent n'apparaissent qu'au moment d'une activité tool/MCP ; +- éviter la duplication running/done en remplaçant l'état existant au lieu d'ajouter une nouvelle entrée. +Diagnostic acté le 2026-08-13 : +- Codex retient certains `agent_message` live jusqu'à l'événement suivant (`pending_final`), donnant l'impression que le progress n'arrive qu'au tool/MCP. +- Le frontend ne dispose pas d'une clé stable pour les progress `message`, donc `delta` et `completed` se dupliquent. +Branche Git recommandée : `feat/186-cli-progress`. \ No newline at end of file diff --git a/.ideai/tickets/188/carnet.md b/.ideai/tickets/188/carnet.md new file mode 100644 index 00000000..41bd1cb9 --- /dev/null +++ b/.ideai/tickets/188/carnet.md @@ -0,0 +1,38 @@ +--- +issueRef: "#188" +version: 5 +updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +updatedAt: 1786620908011 +--- +2026-08-13 — implémentation backend + frontend + +Backend +- `ReplyChunk::UserPrompt` conserve `attachments: string[]` pour compatibilité. +- Ajout de `attachmentRefs: ChatPromptAttachmentDto[]` avec `reference`, `filename`, `mime`, `sizeBytes`, `readablePath`. +- `agent_send` génère ces refs après import effectif dans l'ordre canonique backend : `[image N]` pour les images, `[file N]` pour les autres fichiers. +- Le prompt modèle inclut les mêmes refs ; l'UI n'invente plus la numérotation. + +Frontend +- `UserPrompt` consomme `attachmentRefs` avec fallback legacy depuis `attachments: string[]`. +- Les attachments s'affichent comme appendice compact du message utilisateur (`[image 1] screenshot.png`, etc.). +- Ajout d'une poignée de resize locale par cellule pour la zone chat custom, avec bornes, persistance localStorage et reset à la valeur par défaut. +- Aucun changement du layout métier. + +Fichiers modifiés +- crates/backend/src/dto.rs +- crates/app-tauri/src/commands.rs +- crates/app-tauri/src/chat.rs +- crates/app-tauri/tests/chat_bridge.rs +- crates/app-tauri/tests/dto_chat.rs +- frontend/src/domain/index.ts +- frontend/src/features/agents/CustomAgentChatView.tsx +- frontend/src/features/agents/CustomAgentChatView.test.tsx +- frontend/src/features/layout/LayoutGrid.tsx +- frontend/src/features/layout/LayoutGrid.chat.test.tsx + +Tests verts déclarés +- Backend: dto_chat, chat_bridge, chat_prompt_attachment_projection_tests +- Frontend: CustomAgentChatView.test.tsx, LayoutGrid.chat.test.tsx, LayoutGrid.cellControlsLayering.test.tsx, typecheck, diff --check + +Point résiduel +- Fallback frontend legacy sans `attachmentRefs` déduit image/fichier depuis l'extension du filename ; la projection backend reste la source canonique. \ No newline at end of file diff --git a/.ideai/tickets/188/issue.md b/.ideai/tickets/188/issue.md new file mode 100644 index 00000000..fe1e9988 --- /dev/null +++ b/.ideai/tickets/188/issue.md @@ -0,0 +1,25 @@ +--- +id: "5f9c4d94-f2cf-45f3-8ca5-a731992aa10b" +number: 188 +title: "[CLI custom] Références d'attachments dans le chat + chat redimensionnable" +status: "closed" +priority: "medium" +sprint: null +links: [{"target":"#186","kind":"relatesTo"}] +agentRefs: [] +attachments: [] +createdBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +createdAt: 1786616824342 +updatedAt: 1786620908011 +version: 5 +--- +Sous-ticket de #186. Corriger la projection des fichiers/images collés dans le chat custom et rendre la zone chat redimensionnable. +- restaurer/introduire une référence textuelle exploitable type `[file 1]` / `[image 1]` dans le transcript utilisateur ; +- conserver une présentation compacte des attachments ; +- permettre d'agrandir la zone chat, avec taille actuelle par défaut et préférence locale persistée. +Diagnostic acté le 2026-08-13 : +- le backend enrichit le prompt modèle avec les attachments mais le `UserPrompt` UI ne transporte aujourd'hui que `attachments: filename[]` ; +- l'UI affiche seulement `Fichier: ...` ; +- le meilleur point d'intégration du resize est `LeafView` côté frontend. +Branche Git recommandée : `feat/186-chat-ux`. \ No newline at end of file diff --git a/.ideai/tickets/189/carnet.md b/.ideai/tickets/189/carnet.md new file mode 100644 index 00000000..e2b196f5 --- /dev/null +++ b/.ideai/tickets/189/carnet.md @@ -0,0 +1,40 @@ +--- +issueRef: "#189" +version: 6 +updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +updatedAt: 1786620908371 +--- +2026-08-13 — exposition backend/MCP minimale ajoutée + +Périmètre désormais exposé +- Domaine/port + use cases `allocate/resolve/release/gc`. +- Store FS global sous `app_data_dir/managed-tmp`. +- DTO backend associés. +- Commandes Tauri `managed_temp_*`. +- Outils MCP IdeA naturels `idea_managed_temp_*`, avec catalogue/permissions/provider branchés. + +Fichiers modifiés additionnels +- crates/infrastructure/src/orchestrator/mcp/managed_temp.rs +- crates/infrastructure/src/orchestrator/mcp/mod.rs +- crates/infrastructure/src/orchestrator/mcp/server.rs +- crates/infrastructure/src/orchestrator/mcp/tools.rs +- crates/backend/src/dto.rs +- crates/backend/src/openai_tools.rs +- crates/app-tauri/src/commands.rs +- crates/app-tauri/src/lib.rs +- crates/app-tauri/src/managed_temp.rs +- crates/app-tauri/src/openai_tools.rs +- crates/app-tauri/src/state.rs + +Tests verts déclarés sur cette passe +- `cargo fmt --check` +- `cargo test -p application --test managed_temp` +- `cargo test -p infrastructure --test managed_temp` +- `cargo test -p backend openai_tools::tests` +- `cargo test -p infrastructure ...catalogue_advertises...` +- `cargo test -p app-tauri --lib managed_temp` +- `cargo check -p app-tauri` + +Gap restant principal +- L'injection sandbox complète des chemins résolus n'est pas traitée dans ce lot, conformément au scope serré de reprise. +- Un `cargo test -p app-tauri managed_temp` plus large bute sur `dto_agents.rs` hors périmètre (`runtime_state/node_id` manquants). \ No newline at end of file diff --git a/.ideai/tickets/189/issue.md b/.ideai/tickets/189/issue.md new file mode 100644 index 00000000..72623275 --- /dev/null +++ b/.ideai/tickets/189/issue.md @@ -0,0 +1,20 @@ +--- +id: "7cf801be-60b7-4528-9221-7dff6b47a010" +number: 189 +title: "[Infra] Tmp partagé inter-projets géré par IdeA" +status: "closed" +priority: "high" +sprint: null +links: [{"target":"#186","kind":"relatesTo"}] +agentRefs: [] +attachments: [] +createdBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +createdAt: 1786616824503 +updatedAt: 1786620908371 +version: 6 +--- +Sous-ticket de #186. Concevoir et implémenter un espace temporaire partagé entre projets IdeA, hors `/tmp`, gouverné par IdeA. +Attendus : handles opaques, leases, stratégie de GC, root global inter-projets, projection contrôlée dans la sandbox, pas de path librement inventé par les agents. +Plan MVP backend/runtime acté le 2026-08-13 : port `ManagedTempStore`, implémentation FS sous `app_data_dir/managed-tmp`, métadonnées par handle, use cases allocate/resolve/release/gc, câblage sandbox et tests. +Branche Git recommandée : `feat/186-shared-tmp`. \ No newline at end of file diff --git a/.ideai/tickets/190/carnet.md b/.ideai/tickets/190/carnet.md new file mode 100644 index 00000000..b391eb05 --- /dev/null +++ b/.ideai/tickets/190/carnet.md @@ -0,0 +1,13 @@ +--- +issueRef: "#190" +version: 6 +updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +updatedAt: 1786623936037 +--- +2026-08-13 Main: ticket relance pour integration avec #191. +- Arbitrage Architect: traiter l injection au niveau launch path applicatif (`crates/application/src/agent/lifecycle.rs`), avec demande explicite d exposition de handles managed temp, resolution cote IdeA seulement, enrichissement coherent `SandboxPlan` + `writable_roots` Codex. +- Invariants: handle opaque uniquement, aucun path entrant/sortant dans DTO publics, exposition launch-scoped, fail-closed si handle introuvable/expire/released. +- Git: branche dediee recommandee `feat/190-managed-temp-sandbox-injection` basee sur `develop`, merge local `--no-ff` apres QA verte. +- DevBackend a livre sur `feat/190-managed-temp-sandbox-injection`, commit `4e9b205b feat(infra): injection sandbox des handles managed temp resolus dans les sessions agents — #190`. +- Tests rapportes par DevBackend: `cargo fmt --check` OK ; `CARGO_TARGET_DIR=/tmp/idea-target-190 cargo test -p application managed_temp_exposure --tests` OK (2 tests) ; `cargo check -p backend -p app-tauri -p web-server` KO environnement a cause de `$HOME/.cargo` read-only. +- Action en cours: validation QA finale du lot #190 + #191 avant merge Git. \ No newline at end of file diff --git a/.ideai/tickets/190/issue.md b/.ideai/tickets/190/issue.md new file mode 100644 index 00000000..1f2e19e5 --- /dev/null +++ b/.ideai/tickets/190/issue.md @@ -0,0 +1,25 @@ +--- +id: "16df25b9-433c-4108-a7ab-5d3623cd9b62" +number: 190 +title: "[Infra] Managed temp store — injection sandbox complète des handles résolus" +status: "closed" +priority: "high" +sprint: null +links: [{"target":"#189","kind":"dependsOn"}] +agentRefs: [{"agentId":"fe887179-933f-47d4-960f-c3b06827f86c","role":"assigned"}] +attachments: [] +createdBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +createdAt: 1786621360773 +updatedAt: 1786623936037 +version: 6 +--- +Suite du ticket #189. Le managed temp store partagé inter-projets est livré et exposé via commandes backend/Tauri et outils MCP `idea_managed_temp_*`, mais l'injection automatique complète des chemins résolus dans les sandboxes agents n'a pas été traitée dans le lot initial. + +À faire : +- définir et implémenter l'injection contrôlée des chemins résolus issus d'un handle `managed temp` dans les permissions/runtime sandbox des sessions agents ; +- préserver le modèle de sécurité : pas de path libre, seulement des handles opaques résolus côté IdeA ; +- décider le cycle de vie d'exposition (durée, révocation, nettoyage, interaction avec leases actives) ; +- couvrir les cas agents/headless/TUI/MCP pertinents. + +Contexte : demandé explicitement par l'utilisateur le 2026-08-13 dans le lot #186 ; hors scope assumé du MVP #189. \ No newline at end of file diff --git a/.ideai/tickets/191/carnet.md b/.ideai/tickets/191/carnet.md new file mode 100644 index 00000000..e022a321 --- /dev/null +++ b/.ideai/tickets/191/carnet.md @@ -0,0 +1,14 @@ +--- +issueRef: "#191" +version: 7 +updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +updatedAt: 1786623936053 +--- +2026-08-13 Main: ticket relance en parallele de #190. +- Arbitrage Architect: tests cibles uniquement, sans e2e UI ni app-tauri larges. +- Perimetre attendu: test handler Tauri `invoke_handler` pour `managed_temp_allocate|resolve|release|gc`, plus tests de routage `idea_managed_temp_*` vers le provider tools dedie avec `project` et `requester` injectes. +- Git: branche dediee recommandee `test/191-managed-temp-handlers-routing-tests` basee sur `develop`, merge local apres #190 et QA verte. +- QA a implemente et valide des tests verts sur la branche locale `test/191-managed-temp-handlers-routing-tests` dans un worktree dedie. +- Commandes vertes rapportees initialement: `cargo test -p app-tauri --test managed_temp_handlers -- --nocapture` et `cargo test -p app-tauri --lib openai_managed_temp_ -- --nocapture` avec `CARGO_HOME=/tmp/idea-cargo-home`. +- Validation finale QA sur lot integre `#190 + #191`: vert sur worktree dedie base sur `4e9b205b`, avec `CARGO_HOME=/tmp/idea-cargo-home` et `CARGO_TARGET_DIR=/tmp/idea-target-190-191`. +- Action en cours: integration Git locale (commit #191 puis merges dans `develop`). \ No newline at end of file diff --git a/.ideai/tickets/191/issue.md b/.ideai/tickets/191/issue.md new file mode 100644 index 00000000..494e6f62 --- /dev/null +++ b/.ideai/tickets/191/issue.md @@ -0,0 +1,26 @@ +--- +id: "2073344b-90cd-412b-91ec-2d76fad9a7ec" +number: 191 +title: "[QA/Tech] Managed temp store — tests d'intégration handlers Tauri et routage tools" +status: "closed" +priority: "medium" +sprint: null +links: [{"target":"#189","kind":"relatesTo"}] +agentRefs: [{"agentId":"ab328d90-c307-4771-a3b6-6c56089c8506","role":"assigned"}] +attachments: [] +createdBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +createdAt: 1786621360797 +updatedAt: 1786623936053 +version: 7 +--- +Suite de sécurisation après #189. QA a validé le comportement métier du managed temp store, mais a relevé deux gaps de couverture d'intégration : +- absence de test dédié qui exécute le handler Tauri `invoke_handler` pour `managed_temp_allocate|resolve|release|gc` ; +- absence de test dédié du routage `openai_tools` / provider vers les outils `idea_managed_temp_*`. + +À faire : +- ajouter des tests d'intégration ciblés pour les handlers Tauri des commandes `managed_temp_*` ; +- ajouter des tests ciblés du routage/provider tools pour `idea_managed_temp_*` ; +- garder ces tests isolés du bruit hors périmètre actuellement rencontré dans certains tests `app-tauri` plus larges. + +Contexte : gap explicite relevé par QA le 2026-08-13 lors de la validation du ticket #189. \ No newline at end of file diff --git a/.ideai/tickets/193/carnet.md b/.ideai/tickets/193/carnet.md new file mode 100644 index 00000000..3baee421 --- /dev/null +++ b/.ideai/tickets/193/carnet.md @@ -0,0 +1,44 @@ +--- +issueRef: "#193" +version: 8 +updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +updatedAt: 1786692860069 +--- +## Contexte +Demande utilisateur recue le 2026-08-14. + +## Perimetre +1. Remplacer le resize actuel du chat par un resize vertical du composer avec poignee en haut a droite, min = hauteur actuelle, max = ~50% de la cellule. +2. Afficher les tags Git dans une colonne dediee a gauche du graph. + +## Cadrage UX +- Poignee discrete en haut a droite, curseur ns-resize. +- Croissance vers le haut, bas du composer stable. +- Double-clic pour reset souhaite. +- Colonne tags a gauche du graph, branches restant dans leur zone actuelle. + +## Cadrage Architect +- Ticket frontend pur, sans impact backend/DTO. +- `LayoutGrid` porte la persistance/etat de hauteur. +- `CustomAgentChatView` porte la poignee/accessibilite. +- `GitGraphView` separe refs tags/branches au rendu. + +## Decision Git +- Branche: `feature/193-chat-vertical-resize-git-tags-column` depuis `develop`. +- 2 commits prevus, staging precis, aucun push. + +## DevFrontend +- V1 refusee par QA. +- V2: resize vertical du composer, poignee focusable en haut a droite, double-clic reset, clavier up/down, tags Git dans une colonne stable a gauche du DAG. +- Fichiers principaux touches: `LayoutGrid.tsx`, `LayoutGrid.chat.test.tsx`, `CustomAgentChatView.tsx`, `CustomAgentChatView.test.tsx`, `GitGraphView.tsx`, `gitGraphView.test.tsx`. +- Ajustement annexe: `frontend/src/domain/index.ts` pour `occurredAtMs?: number` sur `ReplyProgress`. + +## QA +- QA v1: rouge, implementation hors contrat. +- QA v2: vert le 2026-08-14. +- Verifications reelles: `typecheck` OK; Vitest cible 70/70 OK. +- Contrat confirme: resize vertical-only du composer avec poignee top-right, min/max corrects, double-clic, clavier; tags dans une colonne dediee a gauche du graph, separes des branches. + +## En attente +- Commits/merge locaux par Git. +- Cloture ticket apres strategie Git. \ No newline at end of file diff --git a/.ideai/tickets/193/issue.md b/.ideai/tickets/193/issue.md new file mode 100644 index 00000000..ee718656 --- /dev/null +++ b/.ideai/tickets/193/issue.md @@ -0,0 +1,18 @@ +--- +id: "e7c3bcc5-4014-4e93-a074-8dc2cf9c09ab" +number: 193 +title: "Ajuster le resize du chat et afficher les tags de versions dans le graph Git" +status: "closed" +priority: "high" +sprint: null +links: [] +agentRefs: [{"agentId":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d","role":"assigned"}] +attachments: [] +createdBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +createdAt: 1786690828542 +updatedAt: 1786692860069 +version: 8 +--- +1. Remplacer le resize actuel du champ de chat par un agrandissement/reduction vertical avec un petit icone en haut a droite, sur le modele du resize du carnet de creation de ticket. Taille minimale = hauteur actuelle, taille maximale = environ la moitie de la cellule. +2. Dans l'outil Git actuel, layout graph: afficher les tags de versions si absents, dans une colonne a gauche du graph, tout a gauche de la fenetre. \ No newline at end of file diff --git a/.ideai/tickets/194/carnet.md b/.ideai/tickets/194/carnet.md new file mode 100644 index 00000000..34cc93f9 --- /dev/null +++ b/.ideai/tickets/194/carnet.md @@ -0,0 +1,28 @@ +--- +issueRef: "#194" +version: 7 +updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +updatedAt: 1786710120000 +--- +2026-08-14 +- Ticket reouvert pour un nouveau rebuild AppImage demande par l'utilisateur. +- Trois tentatives de delegation a l'agent Git n'ont pas remonte de Final structure; build poursuivi et tag local applique sur l'etat reel du depot pour ne pas laisser la livraison inachevee. +- Frontend build OK: `env -u PYTHONHOME -u PYTHONPATH -u APPDIR -u LD_LIBRARY_PATH -u LD_PRELOAD npm --prefix frontend run build`. +- Tauri bundle AppImage OK: `env -u PYTHONHOME -u PYTHONPATH -u APPDIR -u LD_LIBRARY_PATH -u LD_PRELOAD ... tauri build --bundles appimage`. +- Artefact produit: `target/release/bundle/appimage/IdeA_0.3.0_amd64.AppImage`. +- Taille observee: `118090232` bytes (~113 MiB). +- SHA-256: `ea1d414eb2614a81d752376f9e04ea8516e3c93a1cd4eaca0a71df96cc9d5c0d`. +- Commit construit: `6a98752cb056dfb0485a48a109a0aa27bd3e23ea` sur branche `develop`. +- Tag local annote cree sur ce commit: `v0.5.0` (non pousse). +- Etape manuelle restante: remplacer l'AppImage installee par cet artefact puis relancer IdeA quand l'utilisateur est pret. + +2026-08-14 +- Rebuild AppImage execute depuis /home/anthony/Documents/Projects/IdeA via le workflow build-appimage. +- Frontend build OK: `npm --prefix frontend run build`. +- Tauri bundle OK apres relance avec nettoyage d'env cible (`env -u PYTHONHOME -u PYTHONPATH -u APPDIR -u LD_LIBRARY_PATH -u LD_PRELOAD ...`) pour eviter les variables heritees de l'AppImage montee. +- Artefact produit: `target/release/bundle/appimage/IdeA_0.3.0_amd64.AppImage`. +- Taille observee: 113M. +- SHA-256: `1622491737f25d8d04df1830ac243067e1d3d6424ce7a495d87a60df34379dec`. +- Commit construit: `6a98752cb056dfb0485a48a109a0aa27bd3e23ea` sur branche `develop`. +- Git a cree localement le tag annote `v0.4.0` sur ce commit, non pousse. +- Etape manuelle restante: remplacer l'AppImage installee puis relancer IdeA quand l'utilisateur est pret. \ No newline at end of file diff --git a/.ideai/tickets/194/issue.md b/.ideai/tickets/194/issue.md new file mode 100644 index 00000000..97f52d11 --- /dev/null +++ b/.ideai/tickets/194/issue.md @@ -0,0 +1,17 @@ +--- +id: "40880a4c-6343-409c-ad0d-43cdebff012e" +number: 194 +title: "Rebuild AppImage Linux" +status: "closed" +priority: "medium" +sprint: null +links: [] +agentRefs: [] +attachments: [] +createdBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +createdAt: 1786700541463 +updatedAt: 1786710120000 +version: 7 +--- +Reconstruire l'AppImage Linux d'IdeA depuis le project root selon le workflow validé (frontend build puis tauri build --bundles appimage), vérifier l'artefact produit et demander à Git d'incrémenter le tag de version du commit sur lequel l'AppImage a été faite. \ No newline at end of file diff --git a/.ideai/tickets/195/carnet.md b/.ideai/tickets/195/carnet.md new file mode 100644 index 00000000..c96ba54b --- /dev/null +++ b/.ideai/tickets/195/carnet.md @@ -0,0 +1,38 @@ +--- +issueRef: "#195" +version: 8 +updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +updatedAt: 1786703745054 +--- +2026-08-14 Main + +Contexte initial +- Regression AppImage: le dernier build perd l'ecriture agent, contrairement a l'AppImage actuellement dans ~/Documents qui contient le fix du 2026-08-13. + +Constats +- Aucun ticket existant trouve; ticket #195 cree et passe inProgress puis QA puis inProgress pour le rebuild. +- Memoire ticket25: precedent bug EACCES ticket assistant = preset sandbox RO incluant execute; fix backend deja documente. +- Cadrage Architect: la zone la plus suspecte pour les agents normaux est le seam structured Codex `workspace-write` dans `crates/application/src/agent/lifecycle.rs` et ses tests, possiblement non embarque dans la derniere AppImage. +- Decision Git initiale: reutiliser `fix/185-codex-structured-project-root-write` dans `/tmp/idea-worktrees/fix-185-codex-structured-project-root-write`; le fix d'hier n'a jamais ete committe et doit etre reimplemente. + +Execution +- DevBackend a reimplemente le fix dans le worktree dedie. +- Fichiers modifies: `crates/application/src/agent/lifecycle.rs`, `crates/application/tests/agent_lifecycle.rs`. +- Tests dev cibles verts: `cargo fmt --all`, sous-ensembles `agent_lifecycle` pertinents verts. +- Test large `cargo test -p application --test agent_lifecycle` encore rouge sur un echec preexistant hors perimetre: `launch_conventionfile_injects_assigned_skills_in_order`. +- QA a execute la validation reelle avant rebuild et valide le fix pour #195. +- Commandes QA vertes: `codex_git_enrichment_*`, `managed_temp_exposure_enriches_codex_policy_and_os_sandbox_from_same_resolution`, `codex_projection_folds_args_into_spawn_spec`. +- Echec QA hors perimetre confirme: `launch_conventionfile_injects_assigned_skills_in_order`. + +Git/Build +- L'agent Git n'a pas renvoye de final exploitable malgre plusieurs relances; pour ne pas bloquer le rebuild demande par l'utilisateur, Main a fige minimalement le worktree dedie. +- Commit local cree sur `fix/185-codex-structured-project-root-write`: `317cbbeb` — `fix(agent): restore codex project-root write access`. +- Tag de build pose sur ce commit: `v0.4.1` (increment z sur branche de fix). +- Le worktree de build n'avait pas `frontend/node_modules`; un symlink de travail vers les dependances du checkout principal a ete cree dans le worktree ephemere pour permettre le build sans toucher au repo principal. +- Frontend build OK. +- AppImage build OK avec `APPIMAGE_EXTRACT_AND_RUN=1`, `NO_STRIP=1`, `CARGO_HOME=/tmp/idea-cargo-home`. +- Artefact produit: `/tmp/idea-worktrees/fix-185-codex-structured-project-root-write/target/release/bundle/appimage/IdeA_0.3.0_amd64.AppImage`. + +Etat final +- Correctif code + tests cibles verts + AppImage rebuild OK. +- Non fait ici: remplacement manuel de l'AppImage actuellement utilisee dans ~/Documents et relance d'IdeA pour validation live dans l'application en cours. \ No newline at end of file diff --git a/.ideai/tickets/195/issue.md b/.ideai/tickets/195/issue.md new file mode 100644 index 00000000..d4640f05 --- /dev/null +++ b/.ideai/tickets/195/issue.md @@ -0,0 +1,17 @@ +--- +id: "57b91305-a0b9-4a99-85ac-f14935667a8d" +number: 195 +title: "Régression AppImage: les agents n'ont plus les accès en écriture dans le dernier build" +status: "closed" +priority: "critical" +sprint: null +links: [] +agentRefs: [] +attachments: [] +createdBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +createdAt: 1786702541298 +updatedAt: 1786703745054 +version: 8 +--- +Le dernier build AppImage (distinct de l'AppImage actuellement dans ~/Documents) réintroduit un problème de permissions: les agents perdent les accès en écriture. Un fix avait été produit le 2026-08-13 et fonctionne dans l'AppImage actuellement dans Documents. Objectif: retrouver la régression, corriger les sources, rebuild une nouvelle AppImage, puis valider que les agents retrouvent l'écriture. \ No newline at end of file diff --git a/.ideai/tickets/196/carnet.md b/.ideai/tickets/196/carnet.md new file mode 100644 index 00000000..edd34aea --- /dev/null +++ b/.ideai/tickets/196/carnet.md @@ -0,0 +1,15 @@ +--- +issueRef: "#196" +version: 6 +updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +updatedAt: 1786709807009 +--- +2026-08-14 +- Bug utilisateur: les grants accordes dans la page Permissions ne donnent toujours pas l'ecriture au root du projet dans la nouvelle AppImage. +- UX: aucun changement de libelle/UI requis; la promesse produit reste bien un acces en ecriture au project root quand Write=Allow. +- Architect: cause probable = non-canonicalisation du project_root injecte au runtime sandbox; correction attendue au bord applicatif, pas dans le domaine pur. +- Git: branche de travail locale = `fix/185-codex-structured-project-root-write`; le commit precedent etait absent de l'AppImage du 2026-08-13. +- Ticket existant connexe identifie: #185 (branche dediee deja en cours), lie a ce ticket #196. +- DevBackend: correction completee sur la branche dediee en alignant le project_root canonique entre SandboxContext, writable_roots Codex et plan OS sandbox; tests cibles OK. +- QA 2026-08-14: bug cible couvert par les tests, mais branche non verte globalement a cause de `launch_conventionfile_injects_assigned_skills_in_order` rouge dans `cargo test -p application --test agent_lifecycle -- --nocapture`. +- Suite: relance DevBackend pour remettre la branche au vert avant revalidation QA. \ No newline at end of file diff --git a/.ideai/tickets/196/issue.md b/.ideai/tickets/196/issue.md new file mode 100644 index 00000000..dcfabb22 --- /dev/null +++ b/.ideai/tickets/196/issue.md @@ -0,0 +1,17 @@ +--- +id: "c8ee4aa6-e301-4002-af26-7ca4e537d77a" +number: 196 +title: "Permissions page grants do not allow agent write access to project root" +status: "inProgress" +priority: "high" +sprint: null +links: [{"target":"#185","kind":"relatesTo"}] +agentRefs: [] +attachments: [] +createdBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +createdAt: 1786704189602 +updatedAt: 1786709807009 +version: 6 +--- +Malgre le fix precedent et une nouvelle AppImage, accorder les permissions dans la page Permissions ne donne toujours pas aux agents l'acces en ecriture au root du projet. Attendu: quand les permissions correspondantes sont accordees dans la page Permissions, les agents doivent pouvoir ecrire dans le root du projet et ses chemins pertinents selon le grant. \ No newline at end of file diff --git a/.ideai/tickets/197/carnet.md b/.ideai/tickets/197/carnet.md new file mode 100644 index 00000000..0035f5be --- /dev/null +++ b/.ideai/tickets/197/carnet.md @@ -0,0 +1,17 @@ +--- +issueRef: "#197" +version: 9 +updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +updatedAt: 1786712736077 +--- +2026-08-14 Main + +- Ticket créé suite au bug utilisateur sur la dernière AppImage: même avec toutes les permissions accordées dans le menu IdeA, les agents ne peuvent pas écrire dans le root du projet. +- Aucun ticket ouvert correspondant trouvé. +- Architect: RCA principale = split de contrat entre projection générique Codex et launch structuré des agents. Le chemin structuré ne propage que des racines Git en writable_roots au lieu des write grants effectifs du menu, donc le root projet n'est jamais accordé à Codex même quand il devrait l'être. RCA secondaire = sélection sandbox_mode trop dépendante du fallback posture au lieu des write grants effectifs. Inverse bug lié côté ticket assistant = sur-grant whole project root hardcodé. +- Git: branche locale préparée `fix/197-sandbox-permissions-match-menu` depuis `develop` @ `6a98752c`. +- DevBackend a livré le fix backend sans commit: ajout d'un compilateur canonique de permissions Codex partagé par le launch structuré et ticket assistant; writable_roots dérivés des grants effectifs; sandbox_mode dérivé des writable_roots effectifs; tests ciblés verts sur agent_lifecycle et ticket_assistant. +- QA a d'abord donné `PASS WITH RISK` à cause d'un risque d'overgrant si une policy autorise large puis refuse un sous-chemin. +- DevBackend a confirmé le finding, corrigé en fail-closed la traduction Codex quand un deny d'écriture n'est pas représentable par `--add-dir`, et ajouté des tests de régression couvrant broad allow + subpath deny, fallback-wide write + subpath deny, disjoint explicit allow + unrelated deny, et ticket assistant. +- QA verdict final `PASS`: le symptôme exact est couvert et le contrat fort est respecté côté runtime/source. Quand la policy est représentable, les writable_roots correspondent aux grants; sinon le système fail-close en read-only. Verdict crédible: le fix doit fonctionner après rebuild d'un nouveau binaire. +- Limite assumée: la dernière AppImage déjà buildée n'a pas été revalidée et ne peut pas être modifiée sans rebuild; la validation a été faite depuis les sources/runtime local et les tests exécutés. \ No newline at end of file diff --git a/.ideai/tickets/197/issue.md b/.ideai/tickets/197/issue.md new file mode 100644 index 00000000..d8f38ecb --- /dev/null +++ b/.ideai/tickets/197/issue.md @@ -0,0 +1,17 @@ +--- +id: "59bc3996-8b40-42d4-9220-ea2a2cb023e9" +number: 197 +title: "Fix sandbox read/write permissions not matching agent menu in latest AppImage" +status: "closed" +priority: "critical" +sprint: null +links: [] +agentRefs: [] +attachments: [] +createdBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +createdAt: 1786711304011 +updatedAt: 1786712736077 +version: 9 +--- +Bug report from user on 2026-08-14: despite granting all permissions in IdeA permissions menu, agents in latest AppImage still cannot write to the project root. Need to make sandbox permissions match the permissions assigned to the agent in IdeA's permissions menu. User also wants QA to validate the implemented fix without requiring a new AppImage rebuild, so validation must happen from the implemented source/runtime and provide a credible yes/no on whether the fix will work. \ No newline at end of file diff --git a/.ideai/tickets/198/carnet.md b/.ideai/tickets/198/carnet.md new file mode 100644 index 00000000..29af1e6d --- /dev/null +++ b/.ideai/tickets/198/carnet.md @@ -0,0 +1,16 @@ +--- +issueRef: "#198" +version: 4 +updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +updatedAt: 1786714370975 +--- +2026-08-14 Main + +- Build requested by user to make the sandbox-permissions fix active in a new AppImage. +- Applied `build-appimage` workflow. +- Git determined build source = `develop` @ `1d10a6ee`, containing the QA-green #197 fix. Latest previous build tag on develop lineage = `v0.5.0`; intended new tag after successful build = `v0.6.0`. +- Frontend build command executed successfully: `npm --prefix frontend run build`. +- AppImage bundle command executed successfully from `crates/app-tauri` with validated env/workarounds: `CARGO_HOME=/tmp/idea-cargo-home APPIMAGE_EXTRACT_AND_RUN=1 NO_STRIP=1 ../../frontend/node_modules/.bin/tauri build --bundles appimage`. +- Produced artifact: `/home/anthony/Documents/Projects/IdeA/target/release/bundle/appimage/IdeA_0.3.0_amd64.AppImage`. +- Git created local annotated tag `v0.6.0` on commit `1d10a6ee` with message `AppImage build 2026-08-14 on develop (1d10a6ee) — incl. fix sandbox permissions #197`. +- Nothing pushed. Existing `.ideai/` runtime files remain intentionally uncommitted. \ No newline at end of file diff --git a/.ideai/tickets/198/issue.md b/.ideai/tickets/198/issue.md new file mode 100644 index 00000000..860d9719 --- /dev/null +++ b/.ideai/tickets/198/issue.md @@ -0,0 +1,17 @@ +--- +id: "81ae9bc8-6059-45b5-bca1-dd115da217f8" +number: 198 +title: "Rebuild AppImage after sandbox permissions fix" +status: "closed" +priority: "high" +sprint: null +links: [] +agentRefs: [] +attachments: [] +createdBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +createdAt: 1786714052784 +updatedAt: 1786714370975 +version: 4 +--- +Requested on 2026-08-14: rebuild the Linux AppImage so the sandbox permissions fix delivered for ticket #197 is active in a new binary. Must follow the validated AppImage build workflow. Per project rule, Git must increment the version by tagging the commit used for the build: x for builds on main, y for builds on develop, z for builds on any other branch. \ No newline at end of file diff --git a/.ideai/tickets/199/carnet.md b/.ideai/tickets/199/carnet.md new file mode 100644 index 00000000..bc23a2bc --- /dev/null +++ b/.ideai/tickets/199/carnet.md @@ -0,0 +1,19 @@ +--- +issueRef: "#199" +version: 5 +updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +updatedAt: 1786716259666 +--- +2026-08-14 +- Ticket créé pour rebuild AppImage depuis develop. +- Git a vérifié l’état local: dépôt déjà sur `develop`, HEAD `1d10a6ee`, 74 commits devant `origin/develop`, 0 derrière. +- Tag existant `v0.6.0` déjà sur `1d10a6ee`. +- Build AppImage initial lancé par Git en tâche de fond; tag prévu après succès: `v0.7.0` sur `1d10a6ee`. +- Tentative de rebuild directe par Main depuis un shell propre pour obtenir une preuve finale dans cette session. +- Échec immédiat de cette tentative: `npm: command not found` dans l’environnement nettoyé; relance dans le shell usuel du poste. +- `npm --prefix frontend run build` exécuté avec succès. +- `tauri build --bundles appimage` exécuté avec succès depuis `crates/app-tauri` avec `CARGO_HOME=/tmp/idea-cargo-home APPIMAGE_EXTRACT_AND_RUN=1 NO_STRIP=1`. +- Artefact produit: `target/release/bundle/appimage/IdeA_0.3.0_amd64.AppImage`. +- Preuve finale artefact: horodatage `2026-08-14 16:03:14.488341976 +0200`, taille `118094328` octets, sha256 `e45d8bfec7db60829d0f350d0b6b74a661111d3df7645b1c4673390bc3763ab9`. +- Git a posé localement le tag annoté `v0.7.0` sur `develop` commit `1d10a6ee80e4ee460d38bd8813792010a93a5a35`. +- Aucun push effectué. \ No newline at end of file diff --git a/.ideai/tickets/199/issue.md b/.ideai/tickets/199/issue.md new file mode 100644 index 00000000..80a7dce9 --- /dev/null +++ b/.ideai/tickets/199/issue.md @@ -0,0 +1,17 @@ +--- +id: "ac11fa1c-da81-4e5c-b88c-2d3acdca1df1" +number: 199 +title: "Rebuild AppImage depuis develop pour valider l’origine de l’artefact courant" +status: "closed" +priority: "medium" +sprint: null +links: [] +agentRefs: [] +attachments: [] +createdBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +createdAt: 1786714738919 +updatedAt: 1786716259666 +version: 5 +--- +Reconstruire l’AppImage IdeA explicitement depuis la branche develop, vérifier l’état git local avant build, puis demander à Git d’incrémenter/tagger le commit source du build conformément à la règle AppImage. \ No newline at end of file diff --git a/.ideai/tickets/200/carnet.md b/.ideai/tickets/200/carnet.md new file mode 100644 index 00000000..3f67869a --- /dev/null +++ b/.ideai/tickets/200/carnet.md @@ -0,0 +1,14 @@ +--- +issueRef: "#200" +version: 13 +updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +updatedAt: 1786745694791 +--- +2026-08-14 Main +- Reprise du ticket après livraison initiale du lot Codex-centric. +- Nouvelle demande utilisateur: étendre le temp IdeA principal à tous les agents, pas seulement Codex, afin que n'importe quel agent puisse s'en servir; ajouter aussi une purge du dossier temporaire IdeA à la fermeture d'IdeA. +- Décision Architect: temp principal launch-scoped universel à tous les launches; injection TMPDIR/TMP/TEMP pour tous les agents; même source de vérité env+sandbox+writable_roots éventuels; purge eager best-effort du store managed-tmp à la fermeture d'IdeA; TTL/GC conservés comme filet de sécurité. +- Git: branche locale retenue `feature/200-managed-tmp-all-agents-purge` depuis `develop` @ `e6f6eb5b`. +- DevBackend: implémentation terminée. Résumé: `ManagedTempStore::purge_all` + use case `PurgeManagedTemp`, câblage backend/app-tauri au shutdown, test structured non-Codex pour env+sandbox sans writable_roots provider-specific, conservation des garanties Codex/stop/release/union sans doublons. +- QA: verdict VERT sur l'extension. Commandes validées: `cargo test -p application --test agent_lifecycle launch_pty_allocates_managed_tmp_env_and_sandbox_from_same_path`, `cargo test -p application --test agent_lifecycle launch_structured_non_codex_uses_managed_tmp_for_env_and_sandbox_without_writable_roots`, `cargo test -p application --test agent_lifecycle launch_structured_codex_uses_same_managed_tmp_for_env_sandbox_and_writable_roots`, `cargo test -p application --test agent_lifecycle stop_pty_session_releases_primary_launch_managed_tmp`, `cargo test -p application --test agent_lifecycle launch_managed_tmp_and_exposure_roots_are_union_without_duplicates`, `cargo test -p application --test managed_temp purge_managed_temp_calls_store_and_returns_report`, `cargo test -p infrastructure --test managed_temp purge`, `cargo test -p app-tauri --lib shutdown_managed_temp_purge_is_attempted_and_non_blocking_on_error`, `cargo test -p backend --lib --no-run`. +- Suite du cycle: commit/merge local par Git, puis fermeture du ticket. \ No newline at end of file diff --git a/.ideai/tickets/200/issue.md b/.ideai/tickets/200/issue.md new file mode 100644 index 00000000..a1af0a6d --- /dev/null +++ b/.ideai/tickets/200/issue.md @@ -0,0 +1,17 @@ +--- +id: "0268a6a4-2ceb-4332-a113-29b93a59caf1" +number: 200 +title: "Remplacer l'usage implicite de /tmp par un temp IdeA géré pour les agents" +status: "closed" +priority: "high" +sprint: null +links: [] +agentRefs: [{"agentId":"1ff94b51-3e17-4a39-8543-7715d1ff0f80","role":"assigned"},{"agentId":"fe887179-933f-47d4-960f-c3b06827f86c","role":"assigned"},{"agentId":"ab328d90-c307-4771-a3b6-6c56089c8506","role":"assigned"}] +attachments: [] +createdBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +createdAt: 1786743649446 +updatedAt: 1786745694791 +version: 13 +--- +Extension du lot temp IdeA géré. Le temp principal launch-scoped existe déjà mais le comportement doit maintenant être généralisé à tous les agents, pas seulement Codex, afin que n'importe quel agent puisse utiliser le répertoire temporaire IdeA via ses variables d'environnement/runtime appropriées. En plus du release au stop de session déjà en place, IdeA doit purger le contenu de ce stockage temporaire à la fermeture de l'application pour éviter l'accumulation résiduelle. Le lot couvre donc: projection cross-agent du temp IdeA principal, cohérence sandbox/runtime selon les profils, et purge à l'extinction d'IdeA. \ No newline at end of file diff --git a/.ideai/tickets/201/carnet.md b/.ideai/tickets/201/carnet.md new file mode 100644 index 00000000..7d106d08 --- /dev/null +++ b/.ideai/tickets/201/carnet.md @@ -0,0 +1,12 @@ +--- +issueRef: "#201" +version: 4 +updatedBy: {"kind":"agent","agent_id":"1ff94b51-3e17-4a39-8543-7715d1ff0f80"} +updatedAt: 1786746538696 +--- +2026-08-14 Main +- Rebuild AppImage demandé par l'utilisateur. +- Skill `build-appimage` lu et suivi comme workflow de référence. +- Git consulté avant build selon la règle projet de version/tag. +- Git: branche `develop` @ `715f0ede`; build sur develop => bump Y; tag prévu `v0.8.0` si le build réussit. +- Build lancé en arrière-plan; attente du verdict réel avant clôture. \ No newline at end of file diff --git a/.ideai/tickets/201/issue.md b/.ideai/tickets/201/issue.md new file mode 100644 index 00000000..390550f5 --- /dev/null +++ b/.ideai/tickets/201/issue.md @@ -0,0 +1,17 @@ +--- +id: "02a5deae-9488-4c96-a695-07dff2c06bf6" +number: 201 +title: "Rebuild AppImage IdeA Linux" +status: "closed" +priority: "medium" +sprint: null +links: [] +agentRefs: [{"agentId":"1ff94b51-3e17-4a39-8543-7715d1ff0f80","role":"assigned"}] +attachments: [] +createdBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +updatedBy: {"kind":"agent","agent_id":"1ff94b51-3e17-4a39-8543-7715d1ff0f80"} +createdAt: 1786745753492 +updatedAt: 1786746538696 +version: 4 +--- +Rebuild demandé de l'AppImage IdeA sur Linux selon le workflow validé. Build lancé en arrière-plan sur `develop` @ `715f0ede`. Git a déterminé que la règle de version impose un bump Y et un tag local `v0.8.0` si le build réussit. Inclure le verdict réel du build, l'artefact produit et le résultat du tag local. \ No newline at end of file diff --git a/.ideai/tickets/202/carnet.md b/.ideai/tickets/202/carnet.md new file mode 100644 index 00000000..f909d299 --- /dev/null +++ b/.ideai/tickets/202/carnet.md @@ -0,0 +1,47 @@ +--- +issueRef: "#202" +version: 3 +updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +updatedAt: 1786747464201 +--- +2026-08-14 — Ouverture du chantier de refonte web UI/UX. + +Demande utilisateur: +- Refonte totale de l’UI/UX de la version web d’IdeA. +- Desktop PC: viser une forte parité avec l’AppImage. +- Toutes les features actuelles doivent être exposées. +- Les fenêtres flottantes AppImage devraient idéalement devenir des onglets/fenêtres navigateur. +- Mobile téléphone: UX dédiée, pensée spécifiquement pour ce format. + +Cadrage UX reçu: +- Ne pas faire un simple responsive du desktop vers mobile. +- Deux produits UX dans un même client web: `desktop-parity workspace` et `mobile task-flow`. +- Desktop: shell avec top bar, rail primaire, canevas central, rail secondaire, vues détachables, persistance par projet. +- Mobile: navigation focalisée, mono-tâche visible, priorisation des usages courts/décisionnels. +- Exposition des features par intention utilisateur, pas par module technique. + +Cadrage architecture reçu: +- Introduire une abstraction de `surface adressable` au-dessus des composants. +- Conserver `LayoutTree` pour le canevas central uniquement; ne pas lui faire porter tabs/fenêtres/sheets du shell web. +- Ajouter un `SurfaceCatalog`, un `WorkspaceSession` desktop, un `TaskFlowSession` mobile et une synchro cross-window/tab. +- Chaque surface doit supporter une présentation parmi `inPlace | tab | window | sheet` selon son contrat. +- Conserver les gateways métier existants; ne pas dupliquer la logique par shell. + +Découpage recommandé: +- A0 inventaire complet des features/surfaces. +- A1 noyau surfaces + routage/ouverture. +- A2 shell desktop web. +- A3 détachement onglet/fenêtre. +- A4 persistance/restauration/synchro. +- A5 migration progressive des features. +- A6 shell mobile dédié. +- A7 hardening QA. + +Risque principal: +- Copier visuellement l’AppImage sans transposer correctement les contraintes du navigateur. +- Faire du mobile un desktop rétréci. +- Mélanger état de shell, état local de vue et données métier. + +Décision Main: +- Traiter #202 comme un programme de refonte structuré, pas comme un ticket de skinning. +- Demander ensuite un éclatement en sous-tickets d’implémentation avant toute phase dev/QA massive. \ No newline at end of file diff --git a/.ideai/tickets/202/issue.md b/.ideai/tickets/202/issue.md new file mode 100644 index 00000000..ac966196 --- /dev/null +++ b/.ideai/tickets/202/issue.md @@ -0,0 +1,17 @@ +--- +id: "ca2d2104-1573-4465-92f1-cceefa55d609" +number: 202 +title: "Refonte totale UI/UX de la version web d’IdeA" +status: "inProgress" +priority: "high" +sprint: null +links: [] +agentRefs: [] +attachments: [] +createdBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +createdAt: 1786747161496 +updatedAt: 1786747464201 +version: 3 +--- +Refonte complète de l’interface web d’IdeA pour desktop et mobile. Objectifs utilisateur : exposer toutes les features actuelles d’IdeA, viser une parité forte avec l’interface AppImage sur PC, et transposer les fenêtres flottantes en nouveaux onglets/fenêtres navigateur quand pertinent. Sur mobile, laisser une proposition UX dédiée adaptée au téléphone. Attendus de cadrage : inventaire des surfaces/features à exposer, principes de navigation desktop/mobile, mapping AppImage -> web desktop, stratégie responsive, règles d’ouverture multi-fenêtre navigateur, étapes de livraison incrémentales et risques. \ No newline at end of file diff --git a/.ideai/tickets/203/carnet.md b/.ideai/tickets/203/carnet.md new file mode 100644 index 00000000..2463586c --- /dev/null +++ b/.ideai/tickets/203/carnet.md @@ -0,0 +1,6 @@ +--- +issueRef: "#203" +version: 2 +updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +updatedAt: 1786748155898 +--- diff --git a/.ideai/tickets/203/issue.md b/.ideai/tickets/203/issue.md new file mode 100644 index 00000000..ff69ed6b --- /dev/null +++ b/.ideai/tickets/203/issue.md @@ -0,0 +1,17 @@ +--- +id: "14ca4609-68eb-4596-9a68-d2cb23cd06ea" +number: 203 +title: "#202-F1 Frontend — Shell web desktop parity" +status: "inProgress" +priority: "high" +sprint: null +links: [{"target":"#202","kind":"dependsOn"}] +agentRefs: [] +attachments: [] +createdBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +createdAt: 1786748098370 +updatedAt: 1786748155898 +version: 2 +--- +Premier lot de la refonte web UI/UX. Remplacer le shell web mono-panneau par un shell desktop en zones inspiré de l’AppImage: top bar, rail principal, canevas central, rail secondaire, navigation persistante entre surfaces principales. Réutiliser les vues métier existantes sans copier le chrome Tauri. Aucun backend requis. \ No newline at end of file diff --git a/.ideai/tickets/204/carnet.md b/.ideai/tickets/204/carnet.md new file mode 100644 index 00000000..7be7c972 --- /dev/null +++ b/.ideai/tickets/204/carnet.md @@ -0,0 +1,6 @@ +--- +issueRef: "#204" +version: 1 +updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +updatedAt: 1786748098401 +--- diff --git a/.ideai/tickets/204/issue.md b/.ideai/tickets/204/issue.md new file mode 100644 index 00000000..b9741b1c --- /dev/null +++ b/.ideai/tickets/204/issue.md @@ -0,0 +1,17 @@ +--- +id: "fae70d9a-78c7-43ef-aabe-5cc37f4bcd16" +number: 204 +title: "#202-F2 Frontend — Surfaces ouvrables ici/onglet/fenêtre" +status: "open" +priority: "high" +sprint: null +links: [{"target":"#202","kind":"dependsOn"}] +agentRefs: [] +attachments: [] +createdBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +createdAt: 1786748098401 +updatedAt: 1786748098401 +version: 1 +--- +Implémenter le modèle d’ouverture standardisé des surfaces web: `ouvrir ici | onglet | fenêtre`, avec fallback `window -> tab` si popup bloquée. Transposer les vues détachables AppImage en routes web dédiées pour les surfaces pertinentes. \ No newline at end of file diff --git a/.ideai/tickets/205/carnet.md b/.ideai/tickets/205/carnet.md new file mode 100644 index 00000000..a9a155fa --- /dev/null +++ b/.ideai/tickets/205/carnet.md @@ -0,0 +1,6 @@ +--- +issueRef: "#205" +version: 1 +updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +updatedAt: 1786748098417 +--- diff --git a/.ideai/tickets/205/issue.md b/.ideai/tickets/205/issue.md new file mode 100644 index 00000000..7ab54382 --- /dev/null +++ b/.ideai/tickets/205/issue.md @@ -0,0 +1,17 @@ +--- +id: "644c41d0-e333-48e4-9be8-9366db6c8451" +number: 205 +title: "#202-F3 Frontend — Persistance session web desktop + synchro inter-onglets" +status: "open" +priority: "high" +sprint: null +links: [{"target":"#202","kind":"dependsOn"}] +agentRefs: [] +attachments: [] +createdBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +createdAt: 1786748098417 +updatedAt: 1786748098417 +version: 1 +--- +Persister l’état de présentation du workspace web desktop par projet: surface active, rails ouverts, vues ouvertes, placements simples. Ajouter une synchro légère inter-onglets/fenêtres pour focus et réouverture. Ne pas toucher aux données métier ni au LayoutTree backend. \ No newline at end of file diff --git a/.ideai/tickets/206/carnet.md b/.ideai/tickets/206/carnet.md new file mode 100644 index 00000000..5e68b77b --- /dev/null +++ b/.ideai/tickets/206/carnet.md @@ -0,0 +1,6 @@ +--- +issueRef: "#206" +version: 1 +updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +updatedAt: 1786748098434 +--- diff --git a/.ideai/tickets/206/issue.md b/.ideai/tickets/206/issue.md new file mode 100644 index 00000000..417ac270 --- /dev/null +++ b/.ideai/tickets/206/issue.md @@ -0,0 +1,17 @@ +--- +id: "a527e745-d17e-4686-a0e3-5b0229bfabad" +number: 206 +title: "#202-F4 Frontend — UX mobile task-flow dédiée" +status: "open" +priority: "high" +sprint: null +links: [{"target":"#202","kind":"dependsOn"}] +agentRefs: [] +attachments: [] +createdBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +createdAt: 1786748098434 +updatedAt: 1786748098434 +version: 1 +--- +Refondre la version web téléphone en UX dédiée mono-tâche: shell mobile, navigation basse, sélecteur projet, travail en cours, tickets/sprints, session agent plein écran, paramètres essentiels. Ne pas faire un simple responsive du desktop. \ No newline at end of file diff --git a/.ideai/tickets/207/carnet.md b/.ideai/tickets/207/carnet.md new file mode 100644 index 00000000..3b3af4dc --- /dev/null +++ b/.ideai/tickets/207/carnet.md @@ -0,0 +1,6 @@ +--- +issueRef: "#207" +version: 1 +updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +updatedAt: 1786748098453 +--- diff --git a/.ideai/tickets/207/issue.md b/.ideai/tickets/207/issue.md new file mode 100644 index 00000000..e5c3c048 --- /dev/null +++ b/.ideai/tickets/207/issue.md @@ -0,0 +1,17 @@ +--- +id: "edde64dd-0eff-45c7-a774-b7e2281d6c47" +number: 207 +title: "#202-QA QA — Validation transverse refonte web desktop/mobile" +status: "open" +priority: "high" +sprint: null +links: [{"target":"#202","kind":"dependsOn"}] +agentRefs: [] +attachments: [] +createdBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +createdAt: 1786748098453 +updatedAt: 1786748098453 +version: 1 +--- +Valider la refonte web desktop/mobile après livraison F1-F4: non-régression des features exposées, navigation desktop, fallback onglet/fenêtre, restauration de session, parcours mobile principaux, états offline/reconnexion et surfaces live. \ No newline at end of file diff --git a/.ideai/tickets/58/carnet.md b/.ideai/tickets/58/carnet.md index 2b6008eb..9722d47f 100644 --- a/.ideai/tickets/58/carnet.md +++ b/.ideai/tickets/58/carnet.md @@ -1,6 +1,6 @@ --- issueRef: "#58" -version: 3 -updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} -updatedAt: 1786371966082 +version: 4 +updatedBy: {"kind":"user"} +updatedAt: 1786621757808 --- diff --git a/.ideai/tickets/58/issue.md b/.ideai/tickets/58/issue.md index 98bd5f05..2d37ac66 100644 --- a/.ideai/tickets/58/issue.md +++ b/.ideai/tickets/58/issue.md @@ -2,17 +2,17 @@ id: "495699aa-d5d1-409f-8830-cdfaba7a4be3" number: 58 title: "[B/F] Rendu live des tâches de fond — subscriber UI + canal IPC attachable au task output" -status: "open" +status: "closed" priority: "low" sprint: null links: [{"target":"#2","kind":"dependsOn"}] agentRefs: [] attachments: [] createdBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"} -updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +updatedBy: {"kind":"user"} createdAt: 1784064521992 -updatedAt: 1786371966082 -version: 3 +updatedAt: 1786621757808 +version: 4 --- Sorti du ticket #2 lors de sa requalification (2026-07-14). diff --git a/.ideai/tickets/93/carnet.md b/.ideai/tickets/93/carnet.md index ad327bb8..152c1aac 100644 --- a/.ideai/tickets/93/carnet.md +++ b/.ideai/tickets/93/carnet.md @@ -1,8 +1,8 @@ --- issueRef: "#93" -version: 4 -updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} -updatedAt: 1786371966161 +version: 5 +updatedBy: {"kind":"user"} +updatedAt: 1786621765979 --- # Contexte diff --git a/.ideai/tickets/93/issue.md b/.ideai/tickets/93/issue.md index 188e735b..2179919b 100644 --- a/.ideai/tickets/93/issue.md +++ b/.ideai/tickets/93/issue.md @@ -2,17 +2,17 @@ id: "40f56f7d-b0ec-4409-bf6b-c010e3003b76" number: 93 title: "Agent Context : réponse finale non capturée, fragment d'appel d'outil brut renvoyé via idea_ask_agent" -status: "open" +status: "closed" priority: "medium" sprint: null links: [] agentRefs: [] attachments: [] createdBy: {"kind":"agent","agent_id":"a6ced819-b893-4213-b003-9e9dc79b9641"} -updatedBy: {"kind":"agent","agent_id":"a6c6ea12-bfc6-4bdc-8031-324102dfa34d"} +updatedBy: {"kind":"user"} createdAt: 1784817692650 -updatedAt: 1786371966161 -version: 4 +updatedAt: 1786621765979 +version: 5 --- Lors d'un test de la conversation inter-agent (idea_ask_agent ciblant Context), l'appel renvoie systématiquement un fragment JSON brut au lieu d'une réponse finale exploitable : diff --git a/.ideai/tickets/counter.json b/.ideai/tickets/counter.json index fa3c5fe0..92089be1 100644 --- a/.ideai/tickets/counter.json +++ b/.ideai/tickets/counter.json @@ -1,3 +1,3 @@ { - "nextNumber": 184 + "nextNumber": 208 } \ No newline at end of file diff --git a/.ideai/tickets/index.json b/.ideai/tickets/index.json index d4f5e6fb..4a7906fd 100644 --- a/.ideai/tickets/index.json +++ b/.ideai/tickets/index.json @@ -775,7 +775,7 @@ "issueRef": "#58", "path": "58", "title": "[B/F] Rendu live des tâches de fond — subscriber UI + canal IPC attachable au task output", - "status": "open", + "status": "closed", "priority": "low", "sprint": null, "assignedAgentIds": [], @@ -783,7 +783,7 @@ "kind": "agent", "agent_id": "a6ced819-b893-4213-b003-9e9dc79b9641" }, - "updatedAt": 1786371966082 + "updatedAt": 1786621757808 }, { "issueRef": "#60", @@ -1216,7 +1216,7 @@ "issueRef": "#93", "path": "93", "title": "Agent Context : réponse finale non capturée, fragment d'appel d'outil brut renvoyé via idea_ask_agent", - "status": "open", + "status": "closed", "priority": "medium", "sprint": null, "assignedAgentIds": [], @@ -1224,7 +1224,7 @@ "kind": "agent", "agent_id": "a6ced819-b893-4213-b003-9e9dc79b9641" }, - "updatedAt": 1786371966161 + "updatedAt": 1786621765979 }, { "issueRef": "#94", @@ -2464,6 +2464,343 @@ "agent_id": "a6c6ea12-bfc6-4bdc-8031-324102dfa34d" }, "updatedAt": 1786456043938 + }, + { + "issueRef": "#184", + "path": "184", + "title": "Rebuild AppImage IdeA", + "status": "closed", + "priority": "medium", + "sprint": null, + "assignedAgentIds": [], + "createdBy": { + "kind": "agent", + "agent_id": "a6c6ea12-bfc6-4bdc-8031-324102dfa34d" + }, + "updatedAt": 1786603420794 + }, + { + "issueRef": "#185", + "path": "185", + "title": "Codex structured sandbox: rétablir l'écriture du project root pour les agents Dev sans perdre l'accès à .git", + "status": "inProgress", + "priority": "critical", + "sprint": null, + "assignedAgentIds": [ + "b4730d7f-c54d-4736-8a04-c6203aa2fd49", + "fe887179-933f-47d4-960f-c3b06827f86c" + ], + "createdBy": { + "kind": "agent", + "agent_id": "a6c6ea12-bfc6-4bdc-8031-324102dfa34d" + }, + "updatedAt": 1786709806993 + }, + { + "issueRef": "#186", + "path": "186", + "title": "CLI custom — progress agent/tool, anti-duplication, refs d'attachments, tmp partagé géré, chat redimensionnable", + "status": "closed", + "priority": "high", + "sprint": null, + "assignedAgentIds": [], + "createdBy": { + "kind": "agent", + "agent_id": "a6c6ea12-bfc6-4bdc-8031-324102dfa34d" + }, + "updatedAt": 1786620908484 + }, + { + "issueRef": "#187", + "path": "187", + "title": "[CLI custom] Progress live agent/tool + anti-duplication running/done", + "status": "closed", + "priority": "high", + "sprint": null, + "assignedAgentIds": [], + "createdBy": { + "kind": "agent", + "agent_id": "a6c6ea12-bfc6-4bdc-8031-324102dfa34d" + }, + "updatedAt": 1786620907499 + }, + { + "issueRef": "#188", + "path": "188", + "title": "[CLI custom] Références d'attachments dans le chat + chat redimensionnable", + "status": "closed", + "priority": "medium", + "sprint": null, + "assignedAgentIds": [], + "createdBy": { + "kind": "agent", + "agent_id": "a6c6ea12-bfc6-4bdc-8031-324102dfa34d" + }, + "updatedAt": 1786620908011 + }, + { + "issueRef": "#189", + "path": "189", + "title": "[Infra] Tmp partagé inter-projets géré par IdeA", + "status": "closed", + "priority": "high", + "sprint": null, + "assignedAgentIds": [], + "createdBy": { + "kind": "agent", + "agent_id": "a6c6ea12-bfc6-4bdc-8031-324102dfa34d" + }, + "updatedAt": 1786620908371 + }, + { + "issueRef": "#190", + "path": "190", + "title": "[Infra] Managed temp store — injection sandbox complète des handles résolus", + "status": "closed", + "priority": "high", + "sprint": null, + "assignedAgentIds": [ + "fe887179-933f-47d4-960f-c3b06827f86c" + ], + "createdBy": { + "kind": "agent", + "agent_id": "a6c6ea12-bfc6-4bdc-8031-324102dfa34d" + }, + "updatedAt": 1786623936037 + }, + { + "issueRef": "#191", + "path": "191", + "title": "[QA/Tech] Managed temp store — tests d'intégration handlers Tauri et routage tools", + "status": "closed", + "priority": "medium", + "sprint": null, + "assignedAgentIds": [ + "ab328d90-c307-4771-a3b6-6c56089c8506" + ], + "createdBy": { + "kind": "agent", + "agent_id": "a6c6ea12-bfc6-4bdc-8031-324102dfa34d" + }, + "updatedAt": 1786623936053 + }, + { + "issueRef": "#193", + "path": "193", + "title": "Ajuster le resize du chat et afficher les tags de versions dans le graph Git", + "status": "closed", + "priority": "high", + "sprint": null, + "assignedAgentIds": [ + "a6c6ea12-bfc6-4bdc-8031-324102dfa34d" + ], + "createdBy": { + "kind": "agent", + "agent_id": "a6c6ea12-bfc6-4bdc-8031-324102dfa34d" + }, + "updatedAt": 1786692860069 + }, + { + "issueRef": "#194", + "path": "194", + "title": "Rebuild AppImage Linux", + "status": "closed", + "priority": "medium", + "sprint": null, + "assignedAgentIds": [], + "createdBy": { + "kind": "agent", + "agent_id": "a6c6ea12-bfc6-4bdc-8031-324102dfa34d" + }, + "updatedAt": 1786710120000 + }, + { + "issueRef": "#195", + "path": "195", + "title": "Régression AppImage: les agents n'ont plus les accès en écriture dans le dernier build", + "status": "closed", + "priority": "critical", + "sprint": null, + "assignedAgentIds": [], + "createdBy": { + "kind": "agent", + "agent_id": "a6c6ea12-bfc6-4bdc-8031-324102dfa34d" + }, + "updatedAt": 1786703745054 + }, + { + "issueRef": "#196", + "path": "196", + "title": "Permissions page grants do not allow agent write access to project root", + "status": "inProgress", + "priority": "high", + "sprint": null, + "assignedAgentIds": [], + "createdBy": { + "kind": "agent", + "agent_id": "a6c6ea12-bfc6-4bdc-8031-324102dfa34d" + }, + "updatedAt": 1786709807009 + }, + { + "issueRef": "#197", + "path": "197", + "title": "Fix sandbox read/write permissions not matching agent menu in latest AppImage", + "status": "closed", + "priority": "critical", + "sprint": null, + "assignedAgentIds": [], + "createdBy": { + "kind": "agent", + "agent_id": "a6c6ea12-bfc6-4bdc-8031-324102dfa34d" + }, + "updatedAt": 1786712736077 + }, + { + "issueRef": "#198", + "path": "198", + "title": "Rebuild AppImage after sandbox permissions fix", + "status": "closed", + "priority": "high", + "sprint": null, + "assignedAgentIds": [], + "createdBy": { + "kind": "agent", + "agent_id": "a6c6ea12-bfc6-4bdc-8031-324102dfa34d" + }, + "updatedAt": 1786714370975 + }, + { + "issueRef": "#199", + "path": "199", + "title": "Rebuild AppImage depuis develop pour valider l’origine de l’artefact courant", + "status": "closed", + "priority": "medium", + "sprint": null, + "assignedAgentIds": [], + "createdBy": { + "kind": "agent", + "agent_id": "a6c6ea12-bfc6-4bdc-8031-324102dfa34d" + }, + "updatedAt": 1786716259666 + }, + { + "issueRef": "#200", + "path": "200", + "title": "Remplacer l'usage implicite de /tmp par un temp IdeA géré pour les agents", + "status": "closed", + "priority": "high", + "sprint": null, + "assignedAgentIds": [ + "1ff94b51-3e17-4a39-8543-7715d1ff0f80", + "fe887179-933f-47d4-960f-c3b06827f86c", + "ab328d90-c307-4771-a3b6-6c56089c8506" + ], + "createdBy": { + "kind": "agent", + "agent_id": "a6c6ea12-bfc6-4bdc-8031-324102dfa34d" + }, + "updatedAt": 1786745694791 + }, + { + "issueRef": "#201", + "path": "201", + "title": "Rebuild AppImage IdeA Linux", + "status": "closed", + "priority": "medium", + "sprint": null, + "assignedAgentIds": [ + "1ff94b51-3e17-4a39-8543-7715d1ff0f80" + ], + "createdBy": { + "kind": "agent", + "agent_id": "a6c6ea12-bfc6-4bdc-8031-324102dfa34d" + }, + "updatedAt": 1786746538696 + }, + { + "issueRef": "#202", + "path": "202", + "title": "Refonte totale UI/UX de la version web d’IdeA", + "status": "inProgress", + "priority": "high", + "sprint": null, + "assignedAgentIds": [], + "createdBy": { + "kind": "agent", + "agent_id": "a6c6ea12-bfc6-4bdc-8031-324102dfa34d" + }, + "updatedAt": 1786747464201 + }, + { + "issueRef": "#203", + "path": "203", + "title": "#202-F1 Frontend — Shell web desktop parity", + "status": "inProgress", + "priority": "high", + "sprint": null, + "assignedAgentIds": [], + "createdBy": { + "kind": "agent", + "agent_id": "a6c6ea12-bfc6-4bdc-8031-324102dfa34d" + }, + "updatedAt": 1786748155898 + }, + { + "issueRef": "#204", + "path": "204", + "title": "#202-F2 Frontend — Surfaces ouvrables ici/onglet/fenêtre", + "status": "open", + "priority": "high", + "sprint": null, + "assignedAgentIds": [], + "createdBy": { + "kind": "agent", + "agent_id": "a6c6ea12-bfc6-4bdc-8031-324102dfa34d" + }, + "updatedAt": 1786748098401 + }, + { + "issueRef": "#205", + "path": "205", + "title": "#202-F3 Frontend — Persistance session web desktop + synchro inter-onglets", + "status": "open", + "priority": "high", + "sprint": null, + "assignedAgentIds": [], + "createdBy": { + "kind": "agent", + "agent_id": "a6c6ea12-bfc6-4bdc-8031-324102dfa34d" + }, + "updatedAt": 1786748098417 + }, + { + "issueRef": "#206", + "path": "206", + "title": "#202-F4 Frontend — UX mobile task-flow dédiée", + "status": "open", + "priority": "high", + "sprint": null, + "assignedAgentIds": [], + "createdBy": { + "kind": "agent", + "agent_id": "a6c6ea12-bfc6-4bdc-8031-324102dfa34d" + }, + "updatedAt": 1786748098434 + }, + { + "issueRef": "#207", + "path": "207", + "title": "#202-QA QA — Validation transverse refonte web desktop/mobile", + "status": "open", + "priority": "high", + "sprint": null, + "assignedAgentIds": [], + "createdBy": { + "kind": "agent", + "agent_id": "a6c6ea12-bfc6-4bdc-8031-324102dfa34d" + }, + "updatedAt": 1786748098453 } ] } \ No newline at end of file