{"id":45856823,"url":"https://github.com/muchiny/spec-forge","last_synced_at":"2026-02-27T04:18:41.276Z","repository":{"id":340048909,"uuid":"1164308923","full_name":"muchiny/spec-forge","owner":"muchiny","description":"CLI Rust: User Stories → Specifications ISO 29148 + Tests Gherkin/BDD via LLM local (Ollama)","archived":false,"fork":false,"pushed_at":"2026-02-23T00:34:03.000Z","size":550654,"stargazers_count":0,"open_issues_count":6,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-02-23T04:24:21.313Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/muchiny.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-02-22T23:32:54.000Z","updated_at":"2026-02-23T00:33:04.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/muchiny/spec-forge","commit_stats":null,"previous_names":["muchiny/spec-forge"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/muchiny/spec-forge","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/muchiny%2Fspec-forge","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/muchiny%2Fspec-forge/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/muchiny%2Fspec-forge/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/muchiny%2Fspec-forge/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/muchiny","download_url":"https://codeload.github.com/muchiny/spec-forge/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/muchiny%2Fspec-forge/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29884526,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-26T23:51:21.483Z","status":"online","status_checked_at":"2026-02-27T02:00:06.759Z","response_time":57,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-02-27T04:18:39.939Z","updated_at":"2026-02-27T04:18:41.267Z","avatar_url":"https://github.com/muchiny.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 🔨 spec-forge\n\n\u003e **Transforme tes User Stories en Spécifications et Tests Gherkin/BDD automatiquement, grâce à l'IA locale.**\n\n[![Rust](https://img.shields.io/badge/Rust-1.93+-orange?logo=rust)](https://www.rust-lang.org/)\n[![Ollama](https://img.shields.io/badge/LLM-Ollama-blue?logo=ollama)](https://ollama.com/)\n[![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE)\n[![Tests](https://img.shields.io/badge/Tests-125%2B-brightgreen)]()\n[![ISO](https://img.shields.io/badge/ISO-29148%20%7C%2025010%20%7C%2029119-blueviolet)]()\n\n---\n\n## 🎯 C'est quoi spec-forge ?\n\n**spec-forge** est un outil CLI en Rust qui automatise le passage des **User Stories** aux **tests BDD/Gherkin**, en passant par des **spécifications raffinées** — le tout piloté par un LLM local (Ollama).\n\n💡 **L'idée** : reproduire le workflow décrit dans l'article [*\"De la User Story à l'exécution automatique des tests\"*](https://latavernedutesteur.fr/2026/02/18/de-la-user-story-a-lexecution-automatique-des-tests-jai-teste-un-workflow-ia-dans-jira-rovo-xray-lynqa/) — mais **gratuitement, en interne, sans dépendance SaaS** (Jira, Rovo, Xray, Lynqa).\n\n| Workflow SaaS (article) | spec-forge (local \u0026 gratuit) |\n|---|---|\n| 🏢 Jira (User Stories) | 📄 Fichiers Markdown / YAML |\n| 🤖 Rovo (améliore les US) | `spec-forge refine` + Ollama |\n| 🧪 Xray (génère les tests) | `spec-forge generate-tests` + Ollama |\n| 📊 Jira (traçabilité) | Matrice de traçabilité auto-générée |\n\n---\n\n## 🚀 Pipeline en un coup d'œil\n\n```mermaid\ngraph LR\n    A[\"📝 User Stories\u003cbr/\u003e\u003ci\u003e.md / .yaml\u003c/i\u003e\"] --\u003e|spec-forge refine| B[\"📋 Spécifications\u003cbr/\u003e\u003ci\u003eraffinées .md\u003c/i\u003e\"]\n    B --\u003e|spec-forge generate-tests| C[\"🧪 Tests Gherkin\u003cbr/\u003e\u003ci\u003e.feature\u003c/i\u003e\"]\n    C --\u003e D[\"📊 Matrice de\u003cbr/\u003etraçabilité\"]\n\n    style A fill:#4CAF50,stroke:#333,color:#fff\n    style B fill:#2196F3,stroke:#333,color:#fff\n    style C fill:#FF9800,stroke:#333,color:#fff\n    style D fill:#9C27B0,stroke:#333,color:#fff\n```\n\n### 🔍 Détail du pipeline\n\n```mermaid\nflowchart TD\n    subgraph \"📥 Entrée\"\n        US[\"📝 User Stories\u003cbr/\u003eMarkdown ou YAML\"]\n    end\n\n    subgraph \"🔧 Étape 1 — Raffinement\"\n        R1[\"📖 Lecture \u0026 parsing\u003cbr/\u003edes User Stories\"]\n        R2[\"🧠 LLM (Ollama)\u003cbr/\u003e+ template refine_system\"]\n        R3[\"✅ Validation\u003cbr/\u003ecomplétude \u0026 clarté\"]\n        R4[\"📋 Spécification raffinée\u003cbr/\u003eformat spec-kit\"]\n        R1 --\u003e R2 --\u003e R3 --\u003e R4\n    end\n\n    subgraph \"🧪 Étape 2 — Génération de tests\"\n        G1[\"📖 Lecture de la\u003cbr/\u003espécification\"]\n        G2[\"🧠 LLM (Ollama)\u003cbr/\u003e+ template generate_tests_system\"]\n        G3[\"✅ Validation\u003cbr/\u003esyntaxe Gherkin\"]\n        G4[\"📄 Fichiers .feature\u003cbr/\u003e+ traçabilité\"]\n        G1 --\u003e G2 --\u003e G3 --\u003e G4\n    end\n\n    US --\u003e R1\n    R4 --\u003e G1\n\n    style US fill:#4CAF50,stroke:#333,color:#fff\n    style R2 fill:#2196F3,stroke:#333,color:#fff\n    style G2 fill:#2196F3,stroke:#333,color:#fff\n    style R4 fill:#FF9800,stroke:#333,color:#fff\n    style G4 fill:#9C27B0,stroke:#333,color:#fff\n```\n\n---\n\n## 📦 Installation\n\n### Prérequis\n\n| Outil | Version | Rôle |\n|---|---|---|\n| 🦀 **Rust** | ≥ 1.85 | Compilation du projet |\n| 🤖 **Ollama** | latest | LLM local (gratuit) |\n| 🧠 **qwen2.5:7b** | — | Modèle IA recommandé |\n\n### Étapes\n\n```bash\n# 1. Cloner le projet\ngit clone https://github.com/votre-org/spec-forge.git\ncd spec-forge\n\n# 2. Compiler\ncargo build --release\n\n# 3. Installer Ollama (si pas déjà fait)\ncurl -fsSL https://ollama.com/install.sh | sh\n\n# 4. Télécharger le modèle recommandé\nollama pull qwen2.5:7b\n\n# 5. Vérifier que tout fonctionne\ncargo run -- check\n```\n\n✅ Si tout est OK, vous devriez voir :\n\n```\n\u003e\u003e Verification de la connexion LLM...\n   Provider: ollama, Modele: qwen2.5:7b, URL: http://localhost:11434\nOK Ollama est accessible\nOK Modele 'qwen2.5:7b' disponible\n```\n\n---\n\n## 🎮 Utilisation\n\n### ⚡ Pipeline complet (recommandé)\n\n```bash\n# User Stories → Spécifications → Tests Gherkin en une seule commande\nspec-forge pipeline --input mes_user_stories.md --output output/\n```\n\n### 🔧 Étapes individuelles\n\n```bash\n# Étape 1 : Raffiner les User Stories en spécification\nspec-forge refine --input user_stories.md --output output/specs/\n\n# Étape 2 : Générer les tests Gherkin depuis une spec\nspec-forge generate-tests --spec output/specs/spec.md --output output/features/\n\n# Vérifier la connexion au LLM\nspec-forge check\n```\n\n### 🖥️ Interface TUI (Terminal UI)\n\n```bash\n# Lancer l'interface interactive\nspec-forge tui\n```\n\nL'interface TUI offre **8 écrans** interactifs :\n\n| Touche | Écran | Description |\n|--------|-------|-------------|\n| `1` | 🏠 Accueil | Dashboard avec statut LLM et résumé |\n| `2` | 📂 Fichier | Sélecteur de fichiers d'entrée |\n| `3` | ⚙️ Pipeline | Exécution et suivi en temps réel |\n| `4` | 📋 Spec | Visualisation de la spécification |\n| `5` | 🧪 Gherkin | Visualisation des tests générés |\n| `6` | 📊 Traçabilité | Matrice de traçabilité |\n| `7` | 🔧 Config | Configuration actuelle |\n| `8` | 📜 Journaux | Logs en temps réel |\n\n### 📥 Formats d'entrée supportés\n\n| Format | Extension | Exemple |\n|--------|-----------|---------|\n| 📝 Markdown | `.md` | `user_stories.md` |\n| 📄 YAML | `.yaml` / `.yml` | `mobile_banking.yaml` |\n| 📑 PDF | `.pdf` | `requirements.pdf` |\n| 📃 DOCX | `.docx` | `specifications.docx` |\n\n\u003e 📏 **Limite** : fichiers de 10 Mo maximum\n\n### 📝 Format d'entrée : User Stories en Markdown\n\n```markdown\n# User Stories - Mon Projet\n\n## Recherche par ISBN\n\nEn tant que bibliothécaire, je veux rechercher un livre par ISBN\nafin de trouver rapidement un ouvrage spécifique.\n\n- Le champ de saisie accepte les formats ISBN-10 et ISBN-13\n- Les résultats s'affichent en moins de 2 secondes\n- Si l'ISBN n'existe pas, un message clair est affiché\n\n## Inscription en ligne\n\nEn tant que futur adhérent, je veux m'inscrire en ligne\nafin de pouvoir emprunter des livres sans me déplacer.\n\n- Le formulaire demande nom, prénom, email et adresse\n- Un email de confirmation est envoyé automatiquement\n```\n\n### 📤 Résultat généré\n\nÀ partir de 3 User Stories, spec-forge produit automatiquement :\n\n| Sortie | Description |\n|---|---|\n| 📋 `output/specs/spec-*.md` | Spécification raffinée (scénarios, exigences, entités, cas limites) |\n| 🧪 `output/features/*.feature` | Fichiers Gherkin/BDD avec tags de traçabilité |\n| 📊 `output/traceability.md` | Matrice de traçabilité (FR → US → Scénarios) |\n\n**Exemple de sortie Gherkin :**\n\n```gherkin\n# language: fr\n\n@US-002 @P1\nFonctionnalite: Recherche d'un livre par ISBN pour le bibliothecaire\n\n  @happy_path @FR-002\n  Plan du Scenario: Recherche d'un livre par ISBN valide\n    Soit Un utilisateur est sur l'interface de recherche\n    Quand il saisit un ISBN valide (ISBN-10 ou ISBN-13)\n    Alors les résultats s'affichent en moins de 2 secondes\n\n    Exemples:\n      | isbn |\n      | 978-3-16-148410-0 |\n      | 0-521-63285-6 |\n```\n\n---\n\n## 🏗️ Architecture\n\nspec-forge suit une **architecture hexagonale** (ports \u0026 adapters) pour garantir modularité et testabilité.\n\n```mermaid\ngraph TB\n    subgraph \"🎯 Domaine\"\n        US[\"UserStory\"]\n        SP[\"Specification\"]\n        TC[\"Feature / Scenario\"]\n        VA[\"Validation\"]\n    end\n\n    subgraph \"🔌 Ports (interfaces)\"\n        P1[\"LlmService\"]\n        P2[\"InputReader\"]\n        P3[\"OutputWriter\"]\n        P4[\"TemplateEngine\"]\n    end\n\n    subgraph \"🔧 Adapters (implémentations)\"\n        A1[\"OllamaAdapter\"]\n        A2[\"MarkdownReader\u003cbr/\u003eYamlReader\u003cbr/\u003ePdfReader\u003cbr/\u003eDocxReader\"]\n        A3[\"MarkdownWriter\u003cbr/\u003eGherkinWriter\u003cbr/\u003eTraceabilityWriter\"]\n        A4[\"FileTemplateEngine\u003cbr/\u003e(Handlebars)\"]\n    end\n\n    subgraph \"⚙️ Application\"\n        SVC1[\"RefineService\"]\n        SVC2[\"GenerateTestsService\"]\n        PIP[\"Pipeline\"]\n    end\n\n    subgraph \"🖥️ Infrastructure\"\n        CFG[\"Config (YAML)\"]\n        LOG[\"Logging (tracing)\"]\n        CLI[\"CLI (clap)\"]\n    end\n\n    P1 -.-\u003e A1\n    P2 -.-\u003e A2\n    P3 -.-\u003e A3\n    P4 -.-\u003e A4\n\n    PIP --\u003e SVC1\n    PIP --\u003e SVC2\n    SVC1 --\u003e P1\n    SVC1 --\u003e P4\n    SVC2 --\u003e P1\n    SVC2 --\u003e P4\n    PIP --\u003e P2\n    PIP --\u003e P3\n\n    CLI --\u003e PIP\n    CFG --\u003e CLI\n\n    style US fill:#4CAF50,stroke:#333,color:#fff\n    style SP fill:#4CAF50,stroke:#333,color:#fff\n    style TC fill:#4CAF50,stroke:#333,color:#fff\n    style VA fill:#4CAF50,stroke:#333,color:#fff\n    style PIP fill:#FF9800,stroke:#333,color:#fff\n```\n\n---\n\n## 📁 Structure du projet\n\n```\nspec-forge/\n├── 📄 Cargo.toml                        # Dépendances Rust\n├── ⚙️ config.yaml                       # Configuration par défaut\n├── 📝 templates/                         # Prompts LLM (Handlebars)\n│   ├── refine_system.md                  # System prompt : raffinement\n│   ├── refine_user.md                    # User prompt : raffinement\n│   ├── generate_tests_system.md          # System prompt : génération tests\n│   └── generate_tests_user.md            # User prompt : génération tests\n├── 📚 examples/\n│   └── user_stories/\n│       └── sample_us.md                  # Exemple de User Stories\n├── 🦀 src/\n│   ├── main.rs                           # Point d'entrée CLI\n│   ├── lib.rs                            # Ré-exports modules\n│   ├── domain/                           # 🎯 Modèles métier\n│   │   ├── user_story.rs                 # UserStory, Priority, Language\n│   │   ├── specification.rs              # Specification, FunctionalRequirement\n│   │   ├── test_case.rs                  # Feature, Scenario, Step (Gherkin)\n│   │   ├── errors.rs                     # Erreurs domaine (thiserror)\n│   │   └── validation.rs                 # Règles de validation\n│   ├── ports/                            # 🔌 Interfaces (traits)\n│   │   ├── llm_service.rs                # Trait LlmService\n│   │   ├── input_reader.rs               # Trait InputReader\n│   │   ├── output_writer.rs              # Trait OutputWriter\n│   │   └── template_engine.rs            # Trait TemplateEngine\n│   ├── adapters/                         # 🔧 Implémentations\n│   │   ├── llm/\n│   │   │   ├── ollama_adapter.rs         # Adapter Ollama (HTTP/JSON)\n│   │   │   └── mock_adapter.rs           # Mock pour tests\n│   │   ├── input/\n│   │   │   ├── markdown_reader.rs        # Parse US depuis Markdown\n│   │   │   ├── yaml_reader.rs            # Parse US depuis YAML\n│   │   │   ├── pdf_reader.rs             # Parse US depuis PDF\n│   │   │   ├── docx_reader.rs            # Parse US depuis DOCX\n│   │   │   └── story_parser.rs           # Parseur commun US\n│   │   ├── output/\n│   │   │   ├── markdown_writer.rs        # Écrit specs Markdown\n│   │   │   ├── gherkin_writer.rs         # Écrit fichiers .feature\n│   │   │   └── traceability_writer.rs    # Matrice de traçabilité\n│   │   └── templates/\n│   │       └── file_template_engine.rs   # Charge templates Handlebars\n│   ├── application/                      # ⚙️ Services applicatifs\n│   │   ├── pipeline.rs                   # Orchestrateur du pipeline\n│   │   ├── refine_service.rs             # US → Spec (via LLM)\n│   │   ├── generate_tests_service.rs     # Spec → Gherkin (via LLM)\n│   │   ├── llm_retry.rs                  # Stratégie de retry LLM\n│   │   ├── json_utils.rs                 # Utilitaires parsing JSON\n│   │   └── pipeline_events.rs            # Événements du pipeline\n│   ├── infrastructure/                   # 🖥️ Configuration \u0026 logging\n│   │   ├── config.rs                     # Chargement config YAML\n│   │   └── logging.rs                    # Setup tracing\n│   └── tui/                              # 🖥️ Interface TUI\n│       ├── app.rs                        # État applicatif\n│       ├── screens/                      # 8 écrans (dashboard, pipeline, ...)\n│       └── widgets/                      # Composants (header, help, ...)\n├── 🧪 tests/\n│   ├── integration/                      # Tests d'intégration\n│   └── fixtures/                         # Données de test\n├── 🔒 fuzz/                              # Fuzzing (cargo-fuzz)\n│   └── fuzz_targets/                     # 6 cibles de fuzzing\n└── 📤 output/                            # Résultats générés\n    ├── specs/                            # Spécifications raffinées\n    ├── features/                         # Fichiers .feature\n    └── traceability.md                   # Matrice de traçabilité\n```\n\n---\n\n## ⚙️ Configuration\n\nLe fichier `config.yaml` permet de personnaliser le comportement :\n\n```yaml\n# 🤖 LLM\nllm:\n  provider: \"ollama\"              # Provider IA\n  model_name: \"qwen2.5:7b\"       # Modèle (gratuit, local)\n  api_base_url: \"http://localhost:11434\"\n  temperature: 0.1                # Basse = plus déterministe\n\n# 🌍 Langue\npipeline:\n  default_language: \"fr\"          # fr ou en\noutput:\n  gherkin_language: \"fr\"          # Mots-clés Gherkin en français\n\n# ✅ Validation\nvalidation:\n  min_coverage_percent: 80        # Couverture minimale exigée\n  validate_gherkin_syntax: true   # Valider la syntaxe .feature\n  max_clarifications: 3           # Max ambiguïtés signalées\n```\n\n---\n\n## 🛠️ Stack technique\n\n| Composant | Technologie | Rôle |\n|---|---|---|\n| 🦀 Langage | **Rust** (edition 2024) | Performance, sécurité mémoire |\n| 🤖 LLM | **Ollama** + **Qwen2.5:7b** | IA locale, gratuite |\n| 📡 HTTP | **reqwest** | Communication avec l'API Ollama |\n| 🖥️ CLI | **clap** | Interface ligne de commande |\n| 📝 Templates | **Handlebars** | Prompts LLM dynamiques |\n| 🧪 Gherkin | **gherkin** (crate) | Validation syntaxe BDD |\n| 📄 Markdown | **pulldown-cmark** | Parsing des entrées Markdown |\n| ⚙️ Config | **config** + **serde_yaml** | Configuration YAML layered |\n| 🔍 Logging | **tracing** | Logs structurés |\n| 🎨 Terminal | **console** + **indicatif** | Couleurs et barres de progression |\n\n---\n\n## 🌍 Support multi-langue\n\nspec-forge supporte le **français** 🇫🇷 et l'**anglais** 🇬🇧 pour :\n\n- 📝 **L'entrée** : User Stories en `\"En tant que...\"` ou `\"As a...\"`\n- 📋 **Les spécifications** : Sortie dans la langue détectée\n- 🧪 **Le Gherkin** : Mots-clés français (`Soit`/`Quand`/`Alors`) ou anglais (`Given`/`When`/`Then`)\n\n---\n\n## 📊 Traçabilité\n\nChaque artefact généré conserve la **traçabilité complète** via des tags :\n\n```mermaid\ngraph LR\n    US[\"🏷️ @US-002\u003cbr/\u003eUser Story\"] --\u003e FR[\"🏷️ @FR-002\u003cbr/\u003eExigence fonctionnelle\"]\n    FR --\u003e SC[\"🏷️ @happy_path\u003cbr/\u003eScénario Gherkin\"]\n\n    style US fill:#4CAF50,stroke:#333,color:#fff\n    style FR fill:#2196F3,stroke:#333,color:#fff\n    style SC fill:#FF9800,stroke:#333,color:#fff\n```\n\nLa **matrice de traçabilité** auto-générée identifie :\n- ✅ Les exigences **couvertes** par des scénarios\n- ⚠️ Les **GAPs** (exigences sans test correspondant)\n- 📈 Le **taux de couverture** global\n\n---\n\n## 📐 Conformité ISO\n\nspec-forge s'appuie sur **4 normes ISO** pour garantir la qualité des artefacts générés :\n\n```mermaid\ngraph TB\n    subgraph \"📐 Normes ISO intégrées\"\n        ISO1[\"📋 ISO/IEC/IEEE 29148:2018\u003cbr/\u003e\u003ci\u003eIngénierie des exigences\u003c/i\u003e\u003cbr/\u003e9 critères de bien-formation\"]\n        ISO2[\"⭐ ISO/IEC 25010:2023\u003cbr/\u003e\u003ci\u003eQualité produit\u003c/i\u003e\u003cbr/\u003e9 caractéristiques qualité\"]\n        ISO3[\"📏 ISO/IEC 25023:2016\u003cbr/\u003e\u003ci\u003eMétriques qualité\u003c/i\u003e\u003cbr/\u003eComplétude, stabilité, adéquation\"]\n        ISO4[\"🧪 ISO/IEC/IEEE 29119\u003cbr/\u003e\u003ci\u003eTests logiciel\u003c/i\u003e\u003cbr/\u003eNiveaux + techniques\"]\n    end\n\n    ISO1 --\u003e |\"validation.rs\"| V[\"✅ Validation des exigences\"]\n    ISO2 --\u003e |\"specification.rs\"| S[\"📋 Caractéristiques qualité\"]\n    ISO3 --\u003e |\"traceability.rs\"| T[\"📊 Métriques de couverture\"]\n    ISO4 --\u003e |\"test_case.rs\"| TC[\"🧪 Génération de tests\"]\n\n    style ISO1 fill:#2196F3,stroke:#333,color:#fff\n    style ISO2 fill:#4CAF50,stroke:#333,color:#fff\n    style ISO3 fill:#FF9800,stroke:#333,color:#fff\n    style ISO4 fill:#9C27B0,stroke:#333,color:#fff\n```\n\n### 📋 9 critères de bien-formation (ISO 29148)\n\n| # | Critère | Description |\n|---|---------|-------------|\n| 1 | 🔍 Necessary | Pas de doublon, chaque exigence est nécessaire |\n| 2 | 🎯 Unambiguous | Pas de mots ambigus (environ, parfois, ...) |\n| 3 | ✅ Complete | Tous les champs obligatoires remplis |\n| 4 | 1️⃣ Singular | Une seule exigence par statement |\n| 5 | 🏗️ Feasible | L'exigence est réalisable |\n| 6 | 🔬 Verifiable | L'exigence est testable |\n| 7 | ✏️ Correct | Syntaxe normative (MUST/SHALL/SHOULD/COULD) |\n| 8 | 📏 Conforming | Conforme au format attendu |\n| 9 | 🔗 Traceable | Source identifiable |\n\n### 🏭 Profils de conformité réglementaire\n\n| Profil | Norme | Niveaux | Domaine |\n|--------|-------|---------|---------|\n| `General` | ISO 29148 | — | 🌐 Tout domaine |\n| `Aviation(DalLevel)` | DO-178C | A / B / C / D / E | ✈️ Aéronautique |\n| `Medical(SwClass)` | IEC 62304 | A / B / C | 🏥 Médical |\n| `Automotive(AsilLevel)` | ISO 26262 | A / B / C / D | 🚗 Automobile |\n| `Railway(SsilLevel)` | EN 50716 | 1 / 2 / 3 / 4 | 🚄 Ferroviaire |\n| `Safety(SilLevel)` | IEC 61508 | 1 / 2 / 3 / 4 | 🔒 Sécurité fonctionnelle |\n\n---\n\n## 🧪 Tests \u0026 Qualité\n\n### 🔬 Stratégie de tests\n\n```mermaid\ngraph LR\n    subgraph \"🧪 Pyramide de tests\"\n        UT[\"🔹 Tests unitaires\u003cbr/\u003e\u003ci\u003e114+ tests inline\u003c/i\u003e\"]\n        IT[\"🔸 Tests d'intégration\u003cbr/\u003e\u003ci\u003e11+ tests pipeline\u003c/i\u003e\"]\n        PT[\"🟣 Property-based\u003cbr/\u003e\u003ci\u003eproptest\u003c/i\u003e\"]\n        ST[\"📸 Snapshot tests\u003cbr/\u003e\u003ci\u003einsta\u003c/i\u003e\"]\n        FZ[\"🔒 Fuzzing\u003cbr/\u003e\u003ci\u003ecargo-fuzz (6 cibles)\u003c/i\u003e\"]\n        MK[\"🌐 Mock HTTP\u003cbr/\u003e\u003ci\u003ewiremock\u003c/i\u003e\"]\n    end\n\n    UT --\u003e IT --\u003e PT\n    ST --\u003e FZ --\u003e MK\n\n    style UT fill:#4CAF50,stroke:#333,color:#fff\n    style IT fill:#FF9800,stroke:#333,color:#fff\n    style FZ fill:#F44336,stroke:#333,color:#fff\n```\n\n### 🛠️ Commandes de développement\n\n```bash\n# 🔨 Compilation\ncargo build --release\n\n# 🧪 Tous les tests (125+)\ncargo test\n\n# 🔍 Lint (0 warnings)\ncargo clippy\n\n# 🎨 Formatage\ncargo fmt\n\n# 🔒 Fuzzing (6 cibles disponibles)\ncargo fuzz run fuzz_story_parser\ncargo fuzz run fuzz_validation\ncargo fuzz run fuzz_clean_json\ncargo fuzz run fuzz_config_yaml\ncargo fuzz run fuzz_docx_xml\ncargo fuzz run fuzz_docx_zip\n```\n\n---\n\n## 🤝 Inspirations\n\n- 📘 [**spec-kit**](https://github.com/github/spec-kit) — Méthodologie Spec-Driven Development (SDD) par GitHub\n- 📰 [**La Taverne du Testeur**](https://latavernedutesteur.fr/2026/02/18/de-la-user-story-a-lexecution-automatique-des-tests-jai-teste-un-workflow-ia-dans-jira-rovo-xray-lynqa/) — Article sur le workflow IA (Rovo + Xray + Lynqa)\n- 🏗️ **mcp-doc-rag** — Architecture hexagonale Rust et OllamaAdapter réutilisés\n\n---\n\n## 📜 Licence\n\nMIT — Libre d'utilisation, modification et distribution.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmuchiny%2Fspec-forge","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmuchiny%2Fspec-forge","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmuchiny%2Fspec-forge/lists"}