v0.1.0 skel
This commit is contained in:
37
.gitignore
vendored
Normal file
37
.gitignore
vendored
Normal file
@@ -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
|
||||||
44
Cargo.toml
Normal file
44
Cargo.toml
Normal file
@@ -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 <sinus@sasedev.net>"]
|
||||||
|
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.
|
||||||
|
|
||||||
83
README.md
Normal file
83
README.md
Normal file
@@ -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
|
||||||
450
TODOLIST.md
Normal file
450
TODOLIST.md
Normal file
@@ -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
|
||||||
34
clippy.toml
Normal file
34
clippy.toml
Normal file
@@ -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",
|
||||||
|
]
|
||||||
16
docs/coding_rules.md
Normal file
16
docs/coding_rules.md
Normal file
@@ -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)),
|
||||||
|
}
|
||||||
38
rustfmt.toml
Normal file
38
rustfmt.toml
Normal file
@@ -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
|
||||||
17
sca-app/Cargo.toml
Normal file
17
sca-app/Cargo.toml
Normal file
@@ -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
|
||||||
2
sca-app/src/api.rs
Normal file
2
sca-app/src/api.rs
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
// file: sca-app/src/api.rs
|
||||||
|
|
||||||
2
sca-app/src/app.rs
Normal file
2
sca-app/src/app.rs
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
// file: sca-app/src/app.rs
|
||||||
|
|
||||||
2
sca-app/src/bootstrap.rs
Normal file
2
sca-app/src/bootstrap.rs
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
// file: sca-app/src/bootstrap.rs
|
||||||
|
|
||||||
2
sca-app/src/cli.rs
Normal file
2
sca-app/src/cli.rs
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
// file: sca-app/src/cli.rs
|
||||||
|
|
||||||
15
sca-app/src/main.rs
Normal file
15
sca-app/src/main.rs
Normal file
@@ -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() {}
|
||||||
15
sca-core/Cargo.toml
Normal file
15
sca-core/Cargo.toml
Normal file
@@ -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
|
||||||
1
sca-core/src/action.rs
Normal file
1
sca-core/src/action.rs
Normal file
@@ -0,0 +1 @@
|
|||||||
|
// file: sca-core/src/action.rs
|
||||||
2
sca-core/src/context.rs
Normal file
2
sca-core/src/context.rs
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
// file: sca-core/src/context.rs
|
||||||
|
|
||||||
0
sca-core/src/error.rs
Normal file
0
sca-core/src/error.rs
Normal file
0
sca-core/src/ids.rs
Normal file
0
sca-core/src/ids.rs
Normal file
2
sca-core/src/iteration.rs
Normal file
2
sca-core/src/iteration.rs
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
// file: sca-core/src/iteration.rs
|
||||||
|
|
||||||
2
sca-core/src/kb.rs
Normal file
2
sca-core/src/kb.rs
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
// file: sca-core/src/kb.rs
|
||||||
|
|
||||||
21
sca-core/src/lib.rs
Normal file
21
sca-core/src/lib.rs
Normal file
@@ -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;
|
||||||
2
sca-core/src/policy.rs
Normal file
2
sca-core/src/policy.rs
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
// file: sca-core/src/policy.rs
|
||||||
|
|
||||||
2
sca-core/src/project.rs
Normal file
2
sca-core/src/project.rs
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
// file: sca-core/src/project.rs
|
||||||
|
|
||||||
2
sca-core/src/provider.rs
Normal file
2
sca-core/src/provider.rs
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
// file: sca-core/src/provider.rs
|
||||||
|
|
||||||
2
sca-core/src/task.rs
Normal file
2
sca-core/src/task.rs
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
// file: sca-core/src/task.rs
|
||||||
|
|
||||||
0
sca-core/src/time.rs
Normal file
0
sca-core/src/time.rs
Normal file
2
sca-core/src/tool.rs
Normal file
2
sca-core/src/tool.rs
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
// file: sca-core/src/tool.rs
|
||||||
|
|
||||||
18
sca-ia/Cargo.toml
Normal file
18
sca-ia/Cargo.toml
Normal file
@@ -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
|
||||||
2
sca-ia/src/context.rs
Normal file
2
sca-ia/src/context.rs
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
// file: sca-ia/src/context.rs
|
||||||
|
|
||||||
2
sca-ia/src/embeddings.rs
Normal file
2
sca-ia/src/embeddings.rs
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
// file: sca-ia/src/embeddings.rs
|
||||||
|
|
||||||
2
sca-ia/src/kb.rs
Normal file
2
sca-ia/src/kb.rs
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
// file: sca-ia/src/kb.rs
|
||||||
|
|
||||||
15
sca-ia/src/lib.rs
Normal file
15
sca-ia/src/lib.rs
Normal file
@@ -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;
|
||||||
2
sca-ia/src/ollama.rs
Normal file
2
sca-ia/src/ollama.rs
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
// file: sca-ia/src/ollama.rs
|
||||||
|
|
||||||
2
sca-ia/src/provider.rs
Normal file
2
sca-ia/src/provider.rs
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
// file: sca-ia/src/provider.rs
|
||||||
|
|
||||||
2
sca-ia/src/routing.rs
Normal file
2
sca-ia/src/routing.rs
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
// file: sca-ia/src/routing.rs
|
||||||
|
|
||||||
2
sca-ia/src/thinking.rs
Normal file
2
sca-ia/src/thinking.rs
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
// file: sca-ia/src/thinking.rs
|
||||||
|
|
||||||
18
sca-infra/Cargo.toml
Normal file
18
sca-infra/Cargo.toml
Normal file
@@ -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
|
||||||
2
sca-infra/src/audit.rs
Normal file
2
sca-infra/src/audit.rs
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
// file: sca-infra/src/audit.rs
|
||||||
|
|
||||||
2
sca-infra/src/config.rs
Normal file
2
sca-infra/src/config.rs
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
// file: sca-infra/src/config.rs
|
||||||
|
|
||||||
2
sca-infra/src/fs.rs
Normal file
2
sca-infra/src/fs.rs
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
// file: sca-infra/src/fs.rs
|
||||||
|
|
||||||
2
sca-infra/src/git.rs
Normal file
2
sca-infra/src/git.rs
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
// file: sca-infra/src/git.rs
|
||||||
|
|
||||||
15
sca-infra/src/lib.rs
Normal file
15
sca-infra/src/lib.rs
Normal file
@@ -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;
|
||||||
2
sca-infra/src/process.rs
Normal file
2
sca-infra/src/process.rs
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
// file: sca-infra/src/process.rs
|
||||||
|
|
||||||
2
sca-infra/src/repository.rs
Normal file
2
sca-infra/src/repository.rs
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
// file: sca-infra/src/repository.rs
|
||||||
|
|
||||||
2
sca-infra/src/sqlite.rs
Normal file
2
sca-infra/src/sqlite.rs
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
// file: sca-infra/src/sqlite.rs
|
||||||
|
|
||||||
16
sca-tests/Cargo.toml
Normal file
16
sca-tests/Cargo.toml
Normal file
@@ -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
|
||||||
9
sca-tests/src/lib.rs
Normal file
9
sca-tests/src/lib.rs
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
// file: sca-tests/src/lib.rs
|
||||||
|
|
||||||
|
//! Sase Coding Agent - Test
|
||||||
|
|
||||||
|
#![deny(unreachable_pub)]
|
||||||
|
#![warn(missing_docs)]
|
||||||
|
// #![deny(missing_docs)]
|
||||||
|
|
||||||
|
|
||||||
2
sca-tests/tests/command_flow.rs
Normal file
2
sca-tests/tests/command_flow.rs
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
// file: sca-tests/tests/command_flow.rs
|
||||||
|
|
||||||
2
sca-tests/tests/iteration_flow.rs
Normal file
2
sca-tests/tests/iteration_flow.rs
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
// file: sca-tests/tests/iteration_flow.rs
|
||||||
|
|
||||||
2
sca-tests/tests/kb_flow.rs
Normal file
2
sca-tests/tests/kb_flow.rs
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
// file: sca-tests/tests/kb_flow.rs
|
||||||
|
|
||||||
2
sca-tests/tests/project_flow.rs
Normal file
2
sca-tests/tests/project_flow.rs
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
// file: sca-tests/tests/project_flow.rs
|
||||||
|
|
||||||
44
scripts/check_banned_crates.sh
Executable file
44
scripts/check_banned_crates.sh
Executable file
@@ -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"
|
||||||
2
scripts/check_no_mod_rs.sh
Executable file
2
scripts/check_no_mod_rs.sh
Executable file
@@ -0,0 +1,2 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
find ./sca* -name mod.rs | grep . && exit 1 || echo ok
|
||||||
2
scripts/check_no_question_mark.sh
Executable file
2
scripts/check_no_question_mark.sh
Executable file
@@ -0,0 +1,2 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
grep -RIn '\?' --include='*.rs' . && exit 1 || echo ok
|
||||||
2
scripts/check_no_unwrap_expect.sh
Executable file
2
scripts/check_no_unwrap_expect.sh
Executable file
@@ -0,0 +1,2 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
grep -RInE '\.(unwrap|expect)\(' --include='*.rs' . && exit 1 || echo ok
|
||||||
2
scripts/check_public_api_exports.sh
Executable file
2
scripts/check_public_api_exports.sh
Executable file
@@ -0,0 +1,2 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
grep -RIn '^pub mod' --include='lib.rs' . && exit 1 || echo ok
|
||||||
7
scripts/run_quality_checks.sh
Executable file
7
scripts/run_quality_checks.sh
Executable file
@@ -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
|
||||||
Reference in New Issue
Block a user