commit ed38e73949ccf034e448838331b6e6281ec98db4 Author: SinuS Von SifriduS Date: Tue Apr 7 12:25:12 2026 +0200 v0.1.0 skel diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..281460e --- /dev/null +++ b/.gitignore @@ -0,0 +1,37 @@ +Cargo.lock +/target/ + +# Logs +logs +*.log +npm-debug.log* + +# mails +*.eml +# Node +node_modules +package-lock.json +dist + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? +.settings +.project + +# PID +*.pid + +# var folder +var/ +# env +.env +!.env.dev +config.json \ No newline at end of file diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..9438c81 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,44 @@ +# file: Cargo.toml + +[workspace] +members = [ + "sca-app", + "sca-core", + "sca-infra", + "sca-ia", + "sca-tests", +] +resolver = "3" + +[workspace.package] +version = "0.1.0" +edition = "2024" +license = "MIT" +repository = "https://git.sasedev.com/Sasedev/sasecodingagent-project" +authors = ["SinuS von SifriduS "] +publish = false + +[workspace.dependencies] +chrono = { version = "0.4", features = ["serde"] } +ignore = { version = "^0.4", features = [] } +regex = { version = "^1", features = [] } +reqwest = { version = "^0.13", default-features = false, features = ["deflate", "gzip", "json", "multipart", "rustls", "stream"] } +serde = { version = "^1.0", features = ["derive"] } +serde_json = { version = "^1.0", features = [] } +sqlx = { version = "0.8", features = ["sqlite", "runtime-tokio-rustls"] } +tokio = { version = "^1.49", features = ["full"] } +tracing = { version = "^0.1", features = ["async-await", "log"] } +tracing-subscriber = { version = "^0.3", features = ["ansi", "env-filter", "chrono", "serde", "json"] } +uuid = { version = "1", features = ["v4", "serde"] } +walkdir = { version = "^2", features = [] } + +[profile.dev] +incremental = true # Compile your binary in smaller steps. + +[profile.release] +codegen-units = 1 # Allows LLVM to perform better optimization. +lto = true # Enables link-time-optimizations. +opt-level = 3 # s Prioritizes small binary size. Use `3` if you prefer speed. +panic = "abort" # Higher performance by disabling panic handlers. +strip = true # Ensures debug symbols are removed. + diff --git a/README.md b/README.md new file mode 100644 index 0000000..5c6d80b --- /dev/null +++ b/README.md @@ -0,0 +1,83 @@ +# sasecodingagent-project + +Workspace Rust initial pour **Sase Coding Agent**. + +## Structure + +```text +sasecodingagent-project/ +├── Cargo.toml +├── README.md +├── TODOLIST.md +├── clippy.toml +├── rustfmt.toml +├── docs/ +│ └── coding_rules.md +├── scripts/ +│ ├── check_banned_crates.sh +│ ├── check_no_question_mark.sh +│ ├── check_no_unwrap_expect.sh +│ ├── check_no_mod_rs.sh +│ ├── check_public_api_exports.sh +│ └── run_quality_checks.sh +├── sca-app/ +├── sca-core/ +├── sca-infra/ +├── sca-ia/ +└── sca-tests/ +``` + +## Crates + +- `sca-app` : binaire principal +- `sca-core` : domaine métier +- `sca-infra` : stockage, fs, process, git, audit +- `sca-ia` : providers, thinking, context, routing, kb +- `sca-tests` : support de tests / scénarios d'intégration + +## État actuel + +Ce dépôt est un **squelette initial** avec : + +- workspace configuré +- crates créées +- fichiers `.rs` présents +- arborescences internes préparées +- `README.md` et `TODOLIST.md` + +Les fichiers Rust internes sont volontairement laissés vides, à l'exception de `sca-app/src/main.rs` qui contient un `fn main() {}` minimal pour fournir un point d'entrée valide. + + +## Coding Rules + +### Hard Constraints (non-negotiable) +- No `?` +- No `unwrap` / `expect` +- Explicit error handling only +- Single error type or minimal error types +- No `mod.rs` (Rust 2024) +- `tracing` mandatory +- `thiserror` and `anyhow` are banned +- Public API exported only via `src/lib.rs` + + +## Quality Checks + +Des scripts simples sont fournis dans scripts/ pour contrôler les règles principales : + +- crates bannies +- usage de `?` +- usage de `unwrap` / `expect` +- présence interdite de `mod.rs` +- vérification basique de l’exposition API via `lib.rs` + +Exécution rapide : +```bash +bash scripts/run_quality_checks.sh +``` + +## Documentation complémentaire + +Règles détaillées : + +docs/coding_rules.md diff --git a/TODOLIST.md b/TODOLIST.md new file mode 100644 index 0000000..2e07fb9 --- /dev/null +++ b/TODOLIST.md @@ -0,0 +1,450 @@ +# 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 \ No newline at end of file diff --git a/clippy.toml b/clippy.toml new file mode 100644 index 0000000..049eeca --- /dev/null +++ b/clippy.toml @@ -0,0 +1,34 @@ +# file: clippy.toml + +msrv = "1.85.0" + +# The project favors explicit control flow and visible intent. +# These settings complement the coding rules already enforced manually +# in code review: no `?`, no `unwrap`, no `expect`, explicit error paths. + +too-many-arguments-threshold = 8 +type-complexity-threshold = 250 +single-char-binding-names-threshold = 3 +trivial-copy-size-limit = 16 +pass-by-value-size-limit = 256 +stack-size-threshold = 512000 +vec-box-size-threshold = 4096 +max-fn-params-bools = 2 +max-include-file-size = 1048576 +cognitive-complexity-threshold = 25 +too-large-for-stack = 2048 +enum-variant-size-threshold = 200 +large-error-threshold = 128 +avoid-breaking-exported-api = true +disallowed-macros = [] +disallowed-methods = [] +disallowed-names = ["foo", "bar", "baz", "tmp"] +disallowed-types = [] +allowed-idents-below-min-chars = [ + "id", + "tx", + "rx", + "ms", + "pcm", + "vad", +] diff --git a/docs/coding_rules.md b/docs/coding_rules.md new file mode 100644 index 0000000..2342fa4 --- /dev/null +++ b/docs/coding_rules.md @@ -0,0 +1,16 @@ +# Coding Rules + +## Hard Constraints +- No `?` +- No `unwrap` / `expect` +- Explicit error handling only +- No `mod.rs` +- tracing obligatoire +- banned: anyhow, thiserror + +## Example + +match do_work() { + Ok(v) => v, + Err(e) => return Err(MyError::from(e)), +} diff --git a/rustfmt.toml b/rustfmt.toml new file mode 100644 index 0000000..09a40c5 --- /dev/null +++ b/rustfmt.toml @@ -0,0 +1,38 @@ +# file: rustfmt.toml + +edition = "2024" +newline_style = "Unix" +use_small_heuristics = "Default" +hard_tabs = false +tab_spaces = 4 +max_width = 100 +chain_width = 80 +fn_call_width = 80 +attr_fn_like_width = 80 +struct_lit_width = 40 +struct_variant_width = 40 +array_width = 80 +single_line_if_else_max_width = 80 +single_line_let_else_max_width = 80 +imports_indent = "Block" +group_imports = "StdExternalCrate" +imports_granularity = "Module" +reorder_imports = true +reorder_modules = true +normalize_comments = false +normalize_doc_attributes = false +format_code_in_doc_comments = false +wrap_comments = false +format_strings = false +hex_literal_case = "Lower" +empty_item_single_line = true +struct_field_align_threshold = 0 +enum_discrim_align_threshold = 0 +match_arm_blocks = true +match_block_trailing_comma = true +trailing_comma = "Vertical" +use_field_init_shorthand = true +use_try_shorthand = false +force_explicit_abi = true +condense_wildcard_suffixes = false +unstable_features = false diff --git a/sca-app/Cargo.toml b/sca-app/Cargo.toml new file mode 100644 index 0000000..ac7748c --- /dev/null +++ b/sca-app/Cargo.toml @@ -0,0 +1,17 @@ +# file: sca-app/Cargo.toml + +[package] +name = "sca-app" +version.workspace = true +edition.workspace = true +authors.workspace = true +license.workspace = true +publish.workspace = true + +[dependencies] +sca-core = { path = "../sca-core" } +sca-infra = { path = "../sca-infra" } +sca-ia = { path = "../sca-ia" } +tokio.workspace = true +tracing.workspace = true +tracing-subscriber.workspace = true diff --git a/sca-app/src/api.rs b/sca-app/src/api.rs new file mode 100644 index 0000000..82c1ed2 --- /dev/null +++ b/sca-app/src/api.rs @@ -0,0 +1,2 @@ +// file: sca-app/src/api.rs + diff --git a/sca-app/src/app.rs b/sca-app/src/app.rs new file mode 100644 index 0000000..055a090 --- /dev/null +++ b/sca-app/src/app.rs @@ -0,0 +1,2 @@ +// file: sca-app/src/app.rs + diff --git a/sca-app/src/bootstrap.rs b/sca-app/src/bootstrap.rs new file mode 100644 index 0000000..78d3892 --- /dev/null +++ b/sca-app/src/bootstrap.rs @@ -0,0 +1,2 @@ +// file: sca-app/src/bootstrap.rs + diff --git a/sca-app/src/cli.rs b/sca-app/src/cli.rs new file mode 100644 index 0000000..22c25a7 --- /dev/null +++ b/sca-app/src/cli.rs @@ -0,0 +1,2 @@ +// file: sca-app/src/cli.rs + diff --git a/sca-app/src/main.rs b/sca-app/src/main.rs new file mode 100644 index 0000000..c6ed8b4 --- /dev/null +++ b/sca-app/src/main.rs @@ -0,0 +1,15 @@ +// file: sca-app/src/main.rs + +//! Sase Coding Agent - Main App + +#![deny(unreachable_pub)] +#![warn(missing_docs)] +// #![deny(missing_docs)] + + +mod api; +mod app; +mod bootstrap; +mod cli; + +fn main() {} diff --git a/sca-core/Cargo.toml b/sca-core/Cargo.toml new file mode 100644 index 0000000..f2ed34f --- /dev/null +++ b/sca-core/Cargo.toml @@ -0,0 +1,15 @@ +# file: sca-core/Cargo.toml + +[package] +name = "sca-core" +version.workspace = true +edition.workspace = true +authors.workspace = true +license.workspace = true +publish.workspace = true + +[dependencies] +serde.workspace = true +serde_json.workspace = true +uuid.workspace = true +chrono.workspace = true diff --git a/sca-core/src/action.rs b/sca-core/src/action.rs new file mode 100644 index 0000000..66fa966 --- /dev/null +++ b/sca-core/src/action.rs @@ -0,0 +1 @@ +// file: sca-core/src/action.rs \ No newline at end of file diff --git a/sca-core/src/context.rs b/sca-core/src/context.rs new file mode 100644 index 0000000..510b5d1 --- /dev/null +++ b/sca-core/src/context.rs @@ -0,0 +1,2 @@ +// file: sca-core/src/context.rs + diff --git a/sca-core/src/error.rs b/sca-core/src/error.rs new file mode 100644 index 0000000..e69de29 diff --git a/sca-core/src/ids.rs b/sca-core/src/ids.rs new file mode 100644 index 0000000..e69de29 diff --git a/sca-core/src/iteration.rs b/sca-core/src/iteration.rs new file mode 100644 index 0000000..87e9c90 --- /dev/null +++ b/sca-core/src/iteration.rs @@ -0,0 +1,2 @@ +// file: sca-core/src/iteration.rs + diff --git a/sca-core/src/kb.rs b/sca-core/src/kb.rs new file mode 100644 index 0000000..6c266e3 --- /dev/null +++ b/sca-core/src/kb.rs @@ -0,0 +1,2 @@ +// file: sca-core/src/kb.rs + diff --git a/sca-core/src/lib.rs b/sca-core/src/lib.rs new file mode 100644 index 0000000..3df70d9 --- /dev/null +++ b/sca-core/src/lib.rs @@ -0,0 +1,21 @@ +// file: sca-core/src/lib.rs + +//! Sase Coding Agent - Core + +#![deny(unreachable_pub)] +#![warn(missing_docs)] +// #![deny(missing_docs)] + + +mod action; +mod context; +mod error; +mod ids; +mod iteration; +mod kb; +mod policy; +mod project; +mod provider; +mod task; +mod time; +mod tool; diff --git a/sca-core/src/policy.rs b/sca-core/src/policy.rs new file mode 100644 index 0000000..2135f86 --- /dev/null +++ b/sca-core/src/policy.rs @@ -0,0 +1,2 @@ +// file: sca-core/src/policy.rs + diff --git a/sca-core/src/project.rs b/sca-core/src/project.rs new file mode 100644 index 0000000..c1b4ccc --- /dev/null +++ b/sca-core/src/project.rs @@ -0,0 +1,2 @@ +// file: sca-core/src/project.rs + diff --git a/sca-core/src/provider.rs b/sca-core/src/provider.rs new file mode 100644 index 0000000..1ee79ce --- /dev/null +++ b/sca-core/src/provider.rs @@ -0,0 +1,2 @@ +// file: sca-core/src/provider.rs + diff --git a/sca-core/src/task.rs b/sca-core/src/task.rs new file mode 100644 index 0000000..7405827 --- /dev/null +++ b/sca-core/src/task.rs @@ -0,0 +1,2 @@ +// file: sca-core/src/task.rs + diff --git a/sca-core/src/time.rs b/sca-core/src/time.rs new file mode 100644 index 0000000..e69de29 diff --git a/sca-core/src/tool.rs b/sca-core/src/tool.rs new file mode 100644 index 0000000..c5d97d4 --- /dev/null +++ b/sca-core/src/tool.rs @@ -0,0 +1,2 @@ +// file: sca-core/src/tool.rs + diff --git a/sca-ia/Cargo.toml b/sca-ia/Cargo.toml new file mode 100644 index 0000000..6520661 --- /dev/null +++ b/sca-ia/Cargo.toml @@ -0,0 +1,18 @@ +# file: sca-ia/Cargo.toml + +[package] +name = "sca-ia" +version.workspace = true +edition.workspace = true +authors.workspace = true +license.workspace = true +publish.workspace = true + +[dependencies] +sca-core = { path = "../sca-core" } +tokio.workspace = true +tracing.workspace = true +serde.workspace = true +serde_json.workspace = true +reqwest.workspace = true +regex.workspace = true diff --git a/sca-ia/src/context.rs b/sca-ia/src/context.rs new file mode 100644 index 0000000..60cd5d3 --- /dev/null +++ b/sca-ia/src/context.rs @@ -0,0 +1,2 @@ +// file: sca-ia/src/context.rs + diff --git a/sca-ia/src/embeddings.rs b/sca-ia/src/embeddings.rs new file mode 100644 index 0000000..8042655 --- /dev/null +++ b/sca-ia/src/embeddings.rs @@ -0,0 +1,2 @@ +// file: sca-ia/src/embeddings.rs + diff --git a/sca-ia/src/kb.rs b/sca-ia/src/kb.rs new file mode 100644 index 0000000..6ae0c3a --- /dev/null +++ b/sca-ia/src/kb.rs @@ -0,0 +1,2 @@ +// file: sca-ia/src/kb.rs + diff --git a/sca-ia/src/lib.rs b/sca-ia/src/lib.rs new file mode 100644 index 0000000..fa66a26 --- /dev/null +++ b/sca-ia/src/lib.rs @@ -0,0 +1,15 @@ +// file: sca-ia/src/lib.rs + +//! Sase Coding Agent - AI + +#![deny(unreachable_pub)] +#![warn(missing_docs)] +// #![deny(missing_docs)] + +mod context; +mod embeddings; +mod kb; +mod ollama; +mod provider; +mod routing; +mod thinking; diff --git a/sca-ia/src/ollama.rs b/sca-ia/src/ollama.rs new file mode 100644 index 0000000..85ed3c0 --- /dev/null +++ b/sca-ia/src/ollama.rs @@ -0,0 +1,2 @@ +// file: sca-ia/src/ollama.rs + diff --git a/sca-ia/src/provider.rs b/sca-ia/src/provider.rs new file mode 100644 index 0000000..f36e373 --- /dev/null +++ b/sca-ia/src/provider.rs @@ -0,0 +1,2 @@ +// file: sca-ia/src/provider.rs + diff --git a/sca-ia/src/routing.rs b/sca-ia/src/routing.rs new file mode 100644 index 0000000..dcccf91 --- /dev/null +++ b/sca-ia/src/routing.rs @@ -0,0 +1,2 @@ +// file: sca-ia/src/routing.rs + diff --git a/sca-ia/src/thinking.rs b/sca-ia/src/thinking.rs new file mode 100644 index 0000000..28dada9 --- /dev/null +++ b/sca-ia/src/thinking.rs @@ -0,0 +1,2 @@ +// file: sca-ia/src/thinking.rs + diff --git a/sca-infra/Cargo.toml b/sca-infra/Cargo.toml new file mode 100644 index 0000000..15c6c2b --- /dev/null +++ b/sca-infra/Cargo.toml @@ -0,0 +1,18 @@ +# file: sca-infra/Cargo.toml + +[package] +name = "sca-infra" +version.workspace = true +edition.workspace = true +authors.workspace = true +license.workspace = true +publish.workspace = true + +[dependencies] +sca-core = { path = "../sca-core" } +tokio.workspace = true +tracing.workspace = true +sqlx.workspace = true +regex.workspace = true +walkdir.workspace = true +ignore.workspace = true diff --git a/sca-infra/src/audit.rs b/sca-infra/src/audit.rs new file mode 100644 index 0000000..7f319d1 --- /dev/null +++ b/sca-infra/src/audit.rs @@ -0,0 +1,2 @@ +// file: sca-infra/src/audit.rs + diff --git a/sca-infra/src/config.rs b/sca-infra/src/config.rs new file mode 100644 index 0000000..18435d1 --- /dev/null +++ b/sca-infra/src/config.rs @@ -0,0 +1,2 @@ +// file: sca-infra/src/config.rs + diff --git a/sca-infra/src/fs.rs b/sca-infra/src/fs.rs new file mode 100644 index 0000000..880d9be --- /dev/null +++ b/sca-infra/src/fs.rs @@ -0,0 +1,2 @@ +// file: sca-infra/src/fs.rs + diff --git a/sca-infra/src/git.rs b/sca-infra/src/git.rs new file mode 100644 index 0000000..3fc8a9a --- /dev/null +++ b/sca-infra/src/git.rs @@ -0,0 +1,2 @@ +// file: sca-infra/src/git.rs + diff --git a/sca-infra/src/lib.rs b/sca-infra/src/lib.rs new file mode 100644 index 0000000..5416ba5 --- /dev/null +++ b/sca-infra/src/lib.rs @@ -0,0 +1,15 @@ +// file: sca-infra/src/lib.rs + +//! Sase Coding Agent - Infra + +#![deny(unreachable_pub)] +#![warn(missing_docs)] +// #![deny(missing_docs)] + +mod audit; +mod config; +mod fs; +mod git; +mod process; +mod repository; +mod sqlite; diff --git a/sca-infra/src/process.rs b/sca-infra/src/process.rs new file mode 100644 index 0000000..cdd1776 --- /dev/null +++ b/sca-infra/src/process.rs @@ -0,0 +1,2 @@ +// file: sca-infra/src/process.rs + diff --git a/sca-infra/src/repository.rs b/sca-infra/src/repository.rs new file mode 100644 index 0000000..640f112 --- /dev/null +++ b/sca-infra/src/repository.rs @@ -0,0 +1,2 @@ +// file: sca-infra/src/repository.rs + diff --git a/sca-infra/src/sqlite.rs b/sca-infra/src/sqlite.rs new file mode 100644 index 0000000..5e59765 --- /dev/null +++ b/sca-infra/src/sqlite.rs @@ -0,0 +1,2 @@ +// file: sca-infra/src/sqlite.rs + diff --git a/sca-tests/Cargo.toml b/sca-tests/Cargo.toml new file mode 100644 index 0000000..a092e80 --- /dev/null +++ b/sca-tests/Cargo.toml @@ -0,0 +1,16 @@ +# file: sca-tests/Cargo.toml + +[package] +name = "sca-tests" +version.workspace = true +edition.workspace = true +authors.workspace = true +license.workspace = true +publish.workspace = true + +[dependencies] +sca-core = { path = "../sca-core" } +sca-infra = { path = "../sca-infra" } +sca-ia = { path = "../sca-ia" } +tokio.workspace = true +tracing.workspace = true diff --git a/sca-tests/src/lib.rs b/sca-tests/src/lib.rs new file mode 100644 index 0000000..e9e3624 --- /dev/null +++ b/sca-tests/src/lib.rs @@ -0,0 +1,9 @@ +// file: sca-tests/src/lib.rs + +//! Sase Coding Agent - Test + +#![deny(unreachable_pub)] +#![warn(missing_docs)] +// #![deny(missing_docs)] + + diff --git a/sca-tests/tests/command_flow.rs b/sca-tests/tests/command_flow.rs new file mode 100644 index 0000000..d0ece71 --- /dev/null +++ b/sca-tests/tests/command_flow.rs @@ -0,0 +1,2 @@ +// file: sca-tests/tests/command_flow.rs + diff --git a/sca-tests/tests/iteration_flow.rs b/sca-tests/tests/iteration_flow.rs new file mode 100644 index 0000000..d035445 --- /dev/null +++ b/sca-tests/tests/iteration_flow.rs @@ -0,0 +1,2 @@ +// file: sca-tests/tests/iteration_flow.rs + diff --git a/sca-tests/tests/kb_flow.rs b/sca-tests/tests/kb_flow.rs new file mode 100644 index 0000000..e5847ec --- /dev/null +++ b/sca-tests/tests/kb_flow.rs @@ -0,0 +1,2 @@ +// file: sca-tests/tests/kb_flow.rs + diff --git a/sca-tests/tests/project_flow.rs b/sca-tests/tests/project_flow.rs new file mode 100644 index 0000000..67cfd77 --- /dev/null +++ b/sca-tests/tests/project_flow.rs @@ -0,0 +1,2 @@ +// file: sca-tests/tests/project_flow.rs + diff --git a/scripts/check_banned_crates.sh b/scripts/check_banned_crates.sh new file mode 100755 index 0000000..e3b8dfc --- /dev/null +++ b/scripts/check_banned_crates.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +# scripts/check_banned_crates.sh + +set -euo pipefail + +ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" + +echo "[check_banned_crates] scanning Cargo.toml files..." + +FAILED=0 + +# Scan uniquement les Cargo.toml +while IFS= read -r file; do + if grep -nE '\b(anyhow|thiserror)\b' "$file"; then + echo "[check_banned_crates] banned crate found in $file" + FAILED=1 + fi +done < <(find "$ROOT_DIR" \ + -type f \ + -name "Cargo.toml" \ + -not -path "*/target/*" \ + -not -path "*/.git/*" \ + -not -path "*/.cargo/*") + +# Optionnel : scan des imports Rust +echo "[check_banned_crates] scanning Rust sources..." + +while IFS= read -r file; do + if grep -nE '\b(anyhow|thiserror)\b' "$file"; then + echo "[check_banned_crates] banned crate reference in $file" + FAILED=1 + fi +done < <(find "$ROOT_DIR" \ + -type f \ + -name "*.rs" \ + -not -path "*/target/*" \ + -not -path "*/.git/*") + +if [ "$FAILED" -ne 0 ]; then + echo "[check_banned_crates] FAILED" + exit 1 +fi + +echo "[check_banned_crates] ok" diff --git a/scripts/check_no_mod_rs.sh b/scripts/check_no_mod_rs.sh new file mode 100755 index 0000000..b03953e --- /dev/null +++ b/scripts/check_no_mod_rs.sh @@ -0,0 +1,2 @@ +#!/usr/bin/env bash +find ./sca* -name mod.rs | grep . && exit 1 || echo ok diff --git a/scripts/check_no_question_mark.sh b/scripts/check_no_question_mark.sh new file mode 100755 index 0000000..680e5b5 --- /dev/null +++ b/scripts/check_no_question_mark.sh @@ -0,0 +1,2 @@ +#!/usr/bin/env bash +grep -RIn '\?' --include='*.rs' . && exit 1 || echo ok diff --git a/scripts/check_no_unwrap_expect.sh b/scripts/check_no_unwrap_expect.sh new file mode 100755 index 0000000..d324a8e --- /dev/null +++ b/scripts/check_no_unwrap_expect.sh @@ -0,0 +1,2 @@ +#!/usr/bin/env bash +grep -RInE '\.(unwrap|expect)\(' --include='*.rs' . && exit 1 || echo ok diff --git a/scripts/check_public_api_exports.sh b/scripts/check_public_api_exports.sh new file mode 100755 index 0000000..135415e --- /dev/null +++ b/scripts/check_public_api_exports.sh @@ -0,0 +1,2 @@ +#!/usr/bin/env bash +grep -RIn '^pub mod' --include='lib.rs' . && exit 1 || echo ok diff --git a/scripts/run_quality_checks.sh b/scripts/run_quality_checks.sh new file mode 100755 index 0000000..b308f91 --- /dev/null +++ b/scripts/run_quality_checks.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash +bash scripts/check_banned_crates.sh +bash scripts/check_no_question_mark.sh +bash scripts/check_no_unwrap_expect.sh +bash scripts/check_no_mod_rs.sh +bash scripts/check_public_api_exports.sh +echo done