Files
IdeaSDK/.ideai/tickets/64/issue.md
Blomios e1b1c1e103 restore .ideai/tickets/ store versionnέ + corrige .gitignore
- Restaure .ideai/tickets/ depuis 851f1f8^ (167 tickets + index.json + counter.json)
- Enlève les ignore rules .ideai/tickets/ dans .gitignore (ligne 51 et 75)
- Permet le suivi durable du store tickets futur
- Ne touche pas sdk/ (reste untracked)
2026-07-28 20:18:00 +02:00

2.2 KiB

id, number, title, status, priority, sprint, links, agentRefs, createdBy, updatedBy, createdAt, updatedAt, version
id number title status priority sprint links agentRefs createdBy updatedBy createdAt updatedAt version
c8f1c5b3-7674-4c6c-bba5-bb2c5faf201b 64 Web : créer/ajouter un projet depuis le navigateur (folder browser serveur) closed medium 028179b1-eaf4-41e9-9c1f-7c37125117e6
target kind
#13 dependsOn
kind agent_id
agent a6ced819-b893-4213-b003-9e9dc79b9641
kind
user
1784183727404 1784718418070 6

Issu de la validation live de #13 (mode client/serveur web). En web, le bouton « Browse » (choisir un dossier de projet) est inopérant : pickFolder() renvoie UNSUPPORTED_ON_WEB car il s'appuie sur le dialogue natif OS de Tauri, absent du navigateur. Sélectionner un projet EXISTANT est déjà couvert par la liste (list_projects/open_project). Il manque CRÉER/AJOUTER un projet = choisir un dossier côté SERVEUR.

Cadrage Architect (post-#13) : nouvelle surface backend exposant le filesystem serveur au navigateur, à sandboxer.

Backend :

  • Commande read list_server_dir (racine parcourable explicite via --server-browse-root PATH / IDEA_SERVER_BROWSE_ROOT ; défaut prudent : aucun browsing ou $HOME en loopback ; jamais / implicite).
  • create_project sur l'allowlist WRITE, avec sa propre validation de racine (ne fait pas confiance au folder browser).
  • Invariants sécurité (mêmes gardes que serve_static) : canonicalisation browse_root + cible, refus si hors racine, refus ../segments vides/backslash/%2e/%2f/%5c, dossiers seulement, pas de symlink escape, dotdirs masqués (hidden:true), réponse bornée + tri stable.

DTO :

  • ListServerDirRequest { path?: string } → ListServerDirResponse { root, current, parent|null, entries: [{name,path,kind:'directory',hidden}], canCreateProjectHere }
  • CreateProjectRequest { name, root(absolu serveur validé) }

Découpage : B1 list_server_dir + tests traversal/symlink/bounds ; B2 allowlist write create_project + validation racine ; F1 nouveau port UI ServerFolderGateway (ne pas surcharger SystemGateway.pickFolder()) ; F2 composant folder browser web (desktop garde le picker natif) ; F3 tests adapter HTTP + vue projet.

Dépend de #13 (mode web) et du garde-fou lock inter-process app-data-dir (à créer) avant d'activer les écritures web.