# SaseAgent v1 - TODO ## 0. Décisions fondatrices - [x] Choisir SQLite pour la v1 - [x] Valider la structure en workspace Rust - [x] Valider le découpage initial des crates - [x] Définir les contraintes de code globales - [x] Ajouter les règles de code au `README.md` racine - [x] Ajouter `docs/coding_rules.md` - [ ] Définir les rôles providers v1 - [ ] Définir les outils v1 autorisés - [ ] Définir les policies minimales de sécurité --- ## 1. Workspace et structure Rust - [x] Créer le workspace `sasecodingagent-project` - [x] Ajouter la crate binaire `sca-app` - [x] Ajouter la crate lib `sca-core` - [x] Ajouter la crate lib `sca-infra` - [x] Ajouter la crate lib `sca-ia` - [x] Ajouter la crate `sca-tests` - [ ] Définir proprement les dépendances entre crates - [x] Mettre en place un `Cargo.toml` workspace propre - [x] Ajouter une configuration de build commune - [x] Ajouter les dépendances de base (`tokio`, `tracing`, `serde`, etc.) - [x] Ajouter `clippy.toml` - [x] Ajouter `rustfmt.toml` - [x] Ajouter les scripts de contrôle qualité - [x] Formaliser la politique d’export public via `src/lib.rs` - [x] Vérifier que chaque crate exporte son API publique via `mod` + `pub use` - [x] Interdire les fuites d’API publiques accidentelles - [x] Nettoyer les dépendances bannies si encore présentes dans les `Cargo.toml` --- ## 2. Règles de code et qualité ### 2.1 Contraintes globales - [x] Interdire `?` - [x] Interdire `unwrap` / `expect` - [x] Imposer l’error handling explicite - [x] Bannir `thiserror` - [x] Bannir `anyhow` - [x] Interdire `mod.rs` - [x] Rendre `tracing` obligatoire - [x] Activer `#![deny(unreachable_pub)]` - [x] Activer `#![warn(missing_docs)]` - [x] Documenter les hard constraints dans le `README.md` - [x] Documenter les règles détaillées dans `docs/coding_rules.md` - [x] Définir la stratégie “single error type or minimal error types” - [x] Définir la convention de spans `tracing` - [x] Définir la convention de structured fields `tracing` - [x] Définir la convention de logs d’erreurs - [x] Définir la convention de nommage des erreurs par crate ### 2.2 Contrôles automatiques - [x] Ajouter un script pour détecter `?` - [x] Ajouter un script pour détecter `unwrap` / `expect` - [x] Ajouter un script pour détecter `thiserror` / `anyhow` - [x] Ajouter un script pour détecter `mod.rs` - [x] Ajouter un script pour contrôler les exports publics basiques - [x] Ajouter un script global `run_quality_checks.sh` - [x] Rendre tous les scripts exécutables dans le dépôt - [ ] Vérifier les scripts sur Linux - [ ] Ajouter `cargo fmt --all --check` au flux qualité - [ ] Ajouter `cargo clippy --workspace --all-targets --all-features -- -D warnings` - [ ] Ajouter `cargo check --workspace` - [ ] Ajouter plus tard une CI pour exécuter les checks automatiquement --- ## 3. Core domain ### 3.1 Types métier - [ ] Définir `Project` - [ ] Définir `Task` - [ ] Définir `TaskDependency` - [ ] Définir `Iteration` - [ ] Définir `ActionLog` - [ ] Définir `KnowledgeEntry` - [ ] Définir `KnowledgeChunk` - [ ] Définir `Provider` - [ ] Définir `ProviderBinding` - [ ] Définir `PolicyProfile` - [ ] Définir `ContextProfile` ### 3.2 Enums métier - [ ] Définir `TaskStatus` - [ ] Définir `IterationStatus` - [ ] Définir `ActionKind` - [ ] Définir `KnowledgeKind` - [ ] Définir `ProviderKind` - [ ] Définir `ProviderRole` - [ ] Définir `ToolKind` ### 3.3 Payloads structurés - [ ] Définir `ThinkingRequest` - [ ] Définir `ThinkingResult` - [ ] Définir `ToolCall` - [ ] Définir `ToolResult` - [ ] Définir `ProviderRequest` - [ ] Définir `ProviderResponse` - [ ] Définir `ContextAssembly` - [ ] Définir `CommandSpec` - [ ] Définir `CommandResult` ### 3.4 Erreurs - [ ] Définir les erreurs métier globales ou par domaine - [ ] Définir une stratégie d’erreurs cohérente entre crates - [ ] Définir les erreurs publiques minimales par crate - [ ] Définir la convention de conversion / propagation manuelle des erreurs --- ## 4. Stockage SQLite ### 4.1 Schéma - [ ] Définir les tables SQLite - [ ] Définir les index nécessaires - [ ] Définir la stratégie d’évolution du schéma ### 4.2 Migrations - [ ] Créer les migrations initiales - [ ] Ajouter la table `projects` - [ ] Ajouter la table `tasks` - [ ] Ajouter la table `task_dependencies` - [ ] Ajouter la table `iterations` - [ ] Ajouter la table `action_logs` - [ ] Ajouter la table `knowledge_entries` - [ ] Ajouter la table `knowledge_chunks` - [ ] Ajouter la table `providers` - [ ] Ajouter la table `provider_bindings` - [ ] Ajouter la table `policy_profiles` - [ ] Ajouter la table `context_profiles` ### 4.3 Repositories - [ ] Implémenter le repository `projects` - [ ] Implémenter le repository `tasks` - [ ] Implémenter le repository `iterations` - [ ] Implémenter le repository `action_logs` - [ ] Implémenter le repository `knowledge_entries` - [ ] Implémenter le repository `knowledge_chunks` - [ ] Implémenter le repository `providers` - [ ] Implémenter le repository `provider_bindings` - [ ] Implémenter le repository `policy_profiles` - [ ] Implémenter le repository `context_profiles` --- ## 5. Policies et sécurité ### 5.1 Fichiers - [ ] Implémenter la résolution sécurisée des chemins - [ ] Interdire les sorties hors workspace - [ ] Gérer les chemins relatifs - [ ] Définir la policy symlink ### 5.2 Outils - [ ] Définir `ToolPolicy` - [ ] Définir quels outils sont autorisés par défaut - [ ] Définir les restrictions par projet ### 5.3 Commandes - [ ] Définir `CommandPolicy` - [ ] Définir la whitelist initiale des programmes - [ ] Définir les timeouts - [ ] Définir les limites stdout/stderr - [ ] Définir les variables d’environnement autorisées ### 5.4 Providers - [ ] Définir `ProviderPolicy` - [ ] Définir quels providers sont autorisés par rôle - [ ] Définir les contraintes de routage minimales --- ## 6. Tools v1 ### 6.1 Navigation - [ ] Implémenter `ls` - [ ] Implémenter `tree` - [ ] Implémenter `pwd_workspace` - [ ] Implémenter `stat_path` ### 6.2 Lecture - [ ] Implémenter `read_file` - [ ] Implémenter `read_file_range` - [ ] Implémenter `read_multiple_files` ### 6.3 Création / écriture - [ ] Implémenter `create_dir` - [ ] Implémenter `create_file` - [ ] Implémenter `write_file` - [ ] Implémenter `append_file` ### 6.4 Recherche - [ ] Implémenter `search_text` - [ ] Implémenter `search_regex` - [ ] Implémenter `search_glob` ### 6.5 Modification - [ ] Implémenter `search_and_replace` - [ ] Implémenter `replace_range` - [ ] Implémenter `insert_before` - [ ] Implémenter `insert_after` ### 6.6 Diff - [ ] Implémenter `diff_view` - [ ] Implémenter `compare_text_versions` ### 6.7 Git - [ ] Implémenter `git_status` - [ ] Implémenter `git_branch` - [ ] Implémenter `git_log` - [ ] Implémenter `git_show` - [ ] Implémenter `git_diff` ### 6.8 Commandes - [ ] Implémenter `run_command` - [ ] Ajouter timeout et capture de sortie - [ ] Ajouter audit des commandes ### 6.9 Interaction - [ ] Implémenter `chat_with_user` - [ ] Implémenter `add_user_note` --- ## 7. Providers et routing ### 7.1 Abstraction provider - [ ] Définir l’interface provider - [ ] Définir les capacités supportées - [ ] Définir les types de requêtes/réponses unifiés ### 7.2 Providers v1 - [ ] Implémenter `ollama_chat` - [ ] Implémenter `ollama_embed` - [ ] Implémenter `local_regex_search` - [ ] Implémenter `local_lexical_search` ### 7.3 Registre - [ ] Implémenter le registre providers - [ ] Ajouter le chargement depuis le stockage - [ ] Ajouter la résolution par id - [ ] Ajouter la résolution par rôle - [ ] Ajouter un fallback simple ### 7.4 Bindings - [ ] Ajouter les bindings par projet - [ ] Ajouter les overrides par tâche - [ ] Ajouter les overrides par itération ### 7.5 Routing - [ ] Implémenter le routeur de providers - [ ] Définir la stratégie de sélection v1 - [ ] Définir la stratégie de fallback v1 --- ## 8. Knowledge base / RAG ### 8.1 Modèle - [ ] Définir `KnowledgeSource` - [ ] Définir les types de sources - [ ] Définir les métadonnées de chunking ### 8.2 Ingestion - [ ] Implémenter l’ingestion depuis un répertoire local - [ ] Implémenter l’ingestion depuis un dépôt git local - [ ] Filtrer les fichiers non pertinents - [ ] Gérer les fichiers binaires - [ ] Gérer les tailles limites ### 8.3 Chunking - [ ] Implémenter le chunking v1 - [ ] Ajouter overlap simple - [ ] Stocker les offsets / lignes si possible ### 8.4 Embeddings - [ ] Générer les embeddings via Ollama - [ ] Stocker les embeddings - [ ] Définir un pipeline de réindexation ### 8.5 Recherche - [ ] Implémenter la recherche lexicale - [ ] Implémenter la recherche vectorielle - [ ] Implémenter `kb_search` - [ ] Définir le format des résultats - [ ] Ajouter un merge lexical + vectoriel simple ### 8.6 Édition - [ ] Implémenter `kb_add_entry` - [ ] Implémenter `kb_update_entry` - [ ] Implémenter `kb_disable_entry` - [ ] Implémenter `kb_reindex_source` --- ## 9. Thinking et construction du contexte ### 9.1 Thinking - [ ] Implémenter `ThinkingRequest` - [ ] Implémenter `ThinkingResult` - [ ] Définir les intentions v1 - [ ] Implémenter le premier `thinking_stage` ### 9.2 Context builder - [ ] Définir `ContextProfile` - [ ] Construire le contexte système - [ ] Construire le contexte projet - [ ] Construire le contexte tâche / itération - [ ] Construire la mémoire de travail - [ ] Ajouter les résultats KB - [ ] Ajouter les dernières actions - [ ] Ajouter un budget / compaction ### 9.3 Liens tâches / actions / providers - [ ] Lier une tâche à des rôles providers - [ ] Lier une itération à des overrides providers - [ ] Lier une action à un provider effectivement utilisé - [ ] Historiser quel provider a servi à quelle action --- ## 10. Orchestrateur ### 10.1 Iteration manager - [ ] Ouvrir une itération - [ ] Reprendre une itération - [ ] Clôturer une itération - [ ] Marquer une itération en échec - [ ] Résumer une itération ### 10.2 Action dispatcher - [ ] Dispatcher les actions outils - [ ] Dispatcher les actions providers - [ ] Persister toutes les actions - [ ] Normaliser les résultats ### 10.3 Task progression - [ ] Calculer l’état de progression d’une tâche - [ ] Gérer les dépendances - [ ] Marquer une tâche `Done` - [ ] Marquer une tâche `Blocked` - [ ] Déterminer la prochaine tâche exécutable ### 10.4 Boucle d’exécution - [ ] Implémenter la boucle d’itération - [ ] Définir les conditions d’arrêt - [ ] Ajouter les limites de sécurité - [ ] Gérer les erreurs et reprises partielles --- ## 11. API / chat ### 11.1 Projets - [ ] Créer un projet - [ ] Lister les projets - [ ] Lire un projet - [ ] Mettre à jour un projet ### 11.2 Tâches - [ ] Créer une tâche - [ ] Lister les tâches - [ ] Lire une tâche - [ ] Mettre à jour le statut - [ ] Définir les dépendances - [ ] Définir les provider bindings ### 11.3 Itérations - [ ] Démarrer une itération - [ ] Reprendre une itération - [ ] Arrêter une itération - [ ] Afficher l’historique d’itération ### 11.4 Chat - [ ] Envoyer un message utilisateur - [ ] Recevoir une réponse agent - [ ] Déclencher une itération depuis le chat ### 11.5 KB - [ ] Ajouter une entrée KB - [ ] Modifier une entrée KB - [ ] Rechercher dans la KB - [ ] Lancer une ingestion - [ ] Lancer une réindexation ### 11.6 Providers - [ ] Ajouter un provider - [ ] Lister les providers - [ ] Vérifier la santé d’un provider - [ ] Associer un provider à un rôle ### 11.7 Logs / diagnostics - [ ] Lister les actions récentes - [ ] Lister les erreurs récentes - [ ] Lire la sortie de la dernière commande - [ ] Lire les derniers diffs --- ## 12. Reprise et stabilisation ### 12.1 Résumés - [ ] Générer un résumé de fin d’itération - [ ] Générer un résumé de tâche - [ ] Conserver les décisions d’architecture ### 12.2 Reprise - [ ] Recharger la mémoire de travail - [ ] Réinjecter le bon contexte - [ ] Reprendre une tâche sur plusieurs sessions ### 12.3 Audit - [ ] Journaliser tous les appels outils - [ ] Journaliser toutes les commandes - [ ] Journaliser tous les providers appelés - [ ] Journaliser les échecs ### 12.4 Tests - [ ] Ajouter des tests unitaires domaine - [ ] Ajouter des tests de stockage SQLite - [ ] Ajouter des tests tools fichiers - [ ] Ajouter des tests commandes - [ ] Ajouter des tests providers - [ ] Ajouter des tests KB - [ ] Ajouter des tests d’itération - [ ] Ajouter des tests de reprise --- ## 13. V1 Definition of Done - [ ] Un projet peut être créé avec un workspace - [ ] Une tâche peut être créée et liée à un projet - [ ] Une itération peut être lancée sur une tâche - [ ] Le thinking stage produit un plan structuré - [ ] Le routeur choisit un provider adapté - [ ] Le contexte est construit dynamiquement - [ ] Les tools fichiers/recherche/diff fonctionnent - [ ] `run_command` fonctionne avec policy - [ ] La KB est éditable et interrogeable - [ ] Toutes les actions sont persistées - [ ] Une tâche peut être reprise plus tard - [ ] Les actions, erreurs et diffs sont consultables