@ferrflow/doc 7.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (170) hide show
  1. package/docs-en/ci/github-actions.md +120 -0
  2. package/docs-en/ci/gitlab-ci.md +90 -0
  3. package/docs-en/ci/hosted-bot.md +82 -0
  4. package/docs-en/ci/pipeline-triggers.md +287 -0
  5. package/docs-en/configuration/config-file.md +1259 -0
  6. package/docs-en/configuration/formats.md +220 -0
  7. package/docs-en/configuration/monorepo.md +390 -0
  8. package/docs-en/installation.md +56 -0
  9. package/docs-en/introduction.md +56 -0
  10. package/docs-en/quickstart.md +66 -0
  11. package/docs-en/reference/api.md +106 -0
  12. package/docs-en/reference/cli.md +483 -0
  13. package/docs-en/reference/conventional-commits.md +103 -0
  14. package/docs-en/reference/errors.md +508 -0
  15. package/docs-en/verifying-releases.md +97 -0
  16. package/docs-fr/ci/github-actions.md +109 -0
  17. package/docs-fr/ci/gitlab-ci.md +77 -0
  18. package/docs-fr/ci/hosted-bot.md +82 -0
  19. package/docs-fr/ci/pipeline-triggers.md +238 -0
  20. package/docs-fr/configuration/config-file.md +839 -0
  21. package/docs-fr/configuration/formats.md +163 -0
  22. package/docs-fr/configuration/monorepo.md +357 -0
  23. package/docs-fr/installation.md +56 -0
  24. package/docs-fr/introduction.md +54 -0
  25. package/docs-fr/quickstart.md +63 -0
  26. package/docs-fr/reference/api.md +106 -0
  27. package/docs-fr/reference/cli.md +407 -0
  28. package/docs-fr/reference/conventional-commits.md +103 -0
  29. package/docs-fr/reference/errors.md +378 -0
  30. package/docs-fr/verifying-releases.md +97 -0
  31. package/docs-fr-v4/ci/github-actions.md +106 -0
  32. package/docs-fr-v4/ci/gitlab-ci.md +77 -0
  33. package/docs-fr-v4/ci/pipeline-triggers.md +214 -0
  34. package/docs-fr-v4/configuration/config-file.md +769 -0
  35. package/docs-fr-v4/configuration/formats.md +128 -0
  36. package/docs-fr-v4/configuration/monorepo.md +324 -0
  37. package/docs-fr-v4/installation.md +48 -0
  38. package/docs-fr-v4/introduction.md +54 -0
  39. package/docs-fr-v4/legal/telemetry.md +65 -0
  40. package/docs-fr-v4/quickstart.md +63 -0
  41. package/docs-fr-v4/reference/cli.md +130 -0
  42. package/docs-fr-v4/reference/conventional-commits.md +67 -0
  43. package/docs-fr-v4/reference/errors.md +372 -0
  44. package/docs-fr-v5/ci/github-actions.md +109 -0
  45. package/docs-fr-v5/ci/gitlab-ci.md +77 -0
  46. package/docs-fr-v5/ci/hosted-bot.md +82 -0
  47. package/docs-fr-v5/ci/pipeline-triggers.md +238 -0
  48. package/docs-fr-v5/configuration/config-file.md +812 -0
  49. package/docs-fr-v5/configuration/formats.md +150 -0
  50. package/docs-fr-v5/configuration/monorepo.md +357 -0
  51. package/docs-fr-v5/installation.md +56 -0
  52. package/docs-fr-v5/introduction.md +54 -0
  53. package/docs-fr-v5/legal/telemetry.md +26 -0
  54. package/docs-fr-v5/quickstart.md +63 -0
  55. package/docs-fr-v5/reference/api.md +106 -0
  56. package/docs-fr-v5/reference/cli.md +356 -0
  57. package/docs-fr-v5/reference/conventional-commits.md +88 -0
  58. package/docs-fr-v5/reference/errors.md +378 -0
  59. package/docs-fr-v5/verifying-releases.md +97 -0
  60. package/docs-fr-v6/ci/github-actions.md +109 -0
  61. package/docs-fr-v6/ci/gitlab-ci.md +77 -0
  62. package/docs-fr-v6/ci/hosted-bot.md +82 -0
  63. package/docs-fr-v6/ci/pipeline-triggers.md +238 -0
  64. package/docs-fr-v6/configuration/config-file.md +813 -0
  65. package/docs-fr-v6/configuration/formats.md +150 -0
  66. package/docs-fr-v6/configuration/monorepo.md +357 -0
  67. package/docs-fr-v6/installation.md +56 -0
  68. package/docs-fr-v6/introduction.md +54 -0
  69. package/docs-fr-v6/quickstart.md +63 -0
  70. package/docs-fr-v6/reference/api.md +106 -0
  71. package/docs-fr-v6/reference/cli.md +356 -0
  72. package/docs-fr-v6/reference/conventional-commits.md +88 -0
  73. package/docs-fr-v6/reference/errors.md +378 -0
  74. package/docs-fr-v6/verifying-releases.md +97 -0
  75. package/docs-v0/ci/github-actions.md +77 -0
  76. package/docs-v0/ci/gitlab-ci.md +59 -0
  77. package/docs-v0/configuration/config-file.md +97 -0
  78. package/docs-v0/configuration/formats.md +86 -0
  79. package/docs-v0/configuration/monorepo.md +59 -0
  80. package/docs-v0/installation.md +48 -0
  81. package/docs-v0/introduction.md +34 -0
  82. package/docs-v0/legal/telemetry.md +63 -0
  83. package/docs-v0/quickstart.md +58 -0
  84. package/docs-v0/reference/cli.md +95 -0
  85. package/docs-v0/reference/conventional-commits.md +68 -0
  86. package/docs-v1/ci/github-actions.md +76 -0
  87. package/docs-v1/ci/gitlab-ci.md +58 -0
  88. package/docs-v1/configuration/config-file.md +515 -0
  89. package/docs-v1/configuration/formats.md +115 -0
  90. package/docs-v1/configuration/monorepo.md +246 -0
  91. package/docs-v1/installation.md +48 -0
  92. package/docs-v1/introduction.md +39 -0
  93. package/docs-v1/legal/telemetry.md +63 -0
  94. package/docs-v1/quickstart.md +62 -0
  95. package/docs-v1/reference/cli.md +128 -0
  96. package/docs-v1/reference/conventional-commits.md +67 -0
  97. package/docs-v2/ci/github-actions.md +117 -0
  98. package/docs-v2/ci/gitlab-ci.md +90 -0
  99. package/docs-v2/ci/pipeline-triggers.md +263 -0
  100. package/docs-v2/configuration/config-file.md +806 -0
  101. package/docs-v2/configuration/formats.md +98 -0
  102. package/docs-v2/configuration/monorepo.md +324 -0
  103. package/docs-v2/installation.md +48 -0
  104. package/docs-v2/introduction.md +40 -0
  105. package/docs-v2/legal/telemetry.md +66 -0
  106. package/docs-v2/quickstart.md +63 -0
  107. package/docs-v2/reference/cli.md +130 -0
  108. package/docs-v2/reference/conventional-commits.md +67 -0
  109. package/docs-v2/reference/errors.md +500 -0
  110. package/docs-v2/self-hosting.md +101 -0
  111. package/docs-v3/ci/github-actions.md +117 -0
  112. package/docs-v3/ci/gitlab-ci.md +90 -0
  113. package/docs-v3/ci/pipeline-triggers.md +263 -0
  114. package/docs-v3/configuration/config-file.md +806 -0
  115. package/docs-v3/configuration/formats.md +99 -0
  116. package/docs-v3/configuration/monorepo.md +324 -0
  117. package/docs-v3/installation.md +48 -0
  118. package/docs-v3/introduction.md +40 -0
  119. package/docs-v3/legal/telemetry.md +66 -0
  120. package/docs-v3/quickstart.md +66 -0
  121. package/docs-v3/reference/cli.md +161 -0
  122. package/docs-v3/reference/conventional-commits.md +67 -0
  123. package/docs-v3/reference/errors.md +502 -0
  124. package/docs-v3/self-hosting.md +137 -0
  125. package/docs-v4/ci/github-actions.md +117 -0
  126. package/docs-v4/ci/gitlab-ci.md +90 -0
  127. package/docs-v4/ci/pipeline-triggers.md +263 -0
  128. package/docs-v4/configuration/config-file.md +850 -0
  129. package/docs-v4/configuration/formats.md +182 -0
  130. package/docs-v4/configuration/monorepo.md +324 -0
  131. package/docs-v4/installation.md +48 -0
  132. package/docs-v4/introduction.md +56 -0
  133. package/docs-v4/legal/telemetry.md +65 -0
  134. package/docs-v4/quickstart.md +66 -0
  135. package/docs-v4/reference/cli.md +161 -0
  136. package/docs-v4/reference/conventional-commits.md +67 -0
  137. package/docs-v4/reference/errors.md +502 -0
  138. package/docs-v4/self-hosting.md +137 -0
  139. package/docs-v5/ci/github-actions.md +120 -0
  140. package/docs-v5/ci/gitlab-ci.md +90 -0
  141. package/docs-v5/ci/hosted-bot.md +82 -0
  142. package/docs-v5/ci/pipeline-triggers.md +287 -0
  143. package/docs-v5/configuration/config-file.md +1133 -0
  144. package/docs-v5/configuration/formats.md +206 -0
  145. package/docs-v5/configuration/monorepo.md +390 -0
  146. package/docs-v5/installation.md +56 -0
  147. package/docs-v5/introduction.md +56 -0
  148. package/docs-v5/legal/telemetry.md +26 -0
  149. package/docs-v5/quickstart.md +66 -0
  150. package/docs-v5/reference/api.md +106 -0
  151. package/docs-v5/reference/cli.md +431 -0
  152. package/docs-v5/reference/conventional-commits.md +88 -0
  153. package/docs-v5/reference/errors.md +508 -0
  154. package/docs-v5/verifying-releases.md +97 -0
  155. package/docs-v6/ci/github-actions.md +120 -0
  156. package/docs-v6/ci/gitlab-ci.md +90 -0
  157. package/docs-v6/ci/hosted-bot.md +82 -0
  158. package/docs-v6/ci/pipeline-triggers.md +287 -0
  159. package/docs-v6/configuration/config-file.md +1134 -0
  160. package/docs-v6/configuration/formats.md +206 -0
  161. package/docs-v6/configuration/monorepo.md +390 -0
  162. package/docs-v6/installation.md +56 -0
  163. package/docs-v6/introduction.md +56 -0
  164. package/docs-v6/quickstart.md +66 -0
  165. package/docs-v6/reference/api.md +106 -0
  166. package/docs-v6/reference/cli.md +431 -0
  167. package/docs-v6/reference/conventional-commits.md +88 -0
  168. package/docs-v6/reference/errors.md +508 -0
  169. package/docs-v6/verifying-releases.md +97 -0
  170. package/package.json +17 -0
@@ -0,0 +1,63 @@
1
+ ---
2
+ title: Démarrage rapide
3
+ description: De zéro à votre première release automatisée en moins de 5 minutes.
4
+ ---
5
+
6
+ <ol>
7
+ <li><p><strong>Générer la configuration</strong></p>
8
+ <p>Exécutez <code>ferrflow init</code> à la racine de votre repository. Il détecte vos fichiers de version et génère un fichier <code>.ferrflow</code> :</p>
9
+ <pre><code class="language-bash">ferrflow init
10
+ </code></pre>
11
+ <p>Pour un projet Rust, cela produit :</p>
12
+ <pre><code class="language-json">{
13
+ &quot;$schema&quot;: &quot;https://ferrflow.com/schema/ferrflow.json&quot;,
14
+ &quot;workspace&quot;: {
15
+ &quot;tagTemplate&quot;: &quot;v{version}&quot;
16
+ },
17
+ &quot;package&quot;: [
18
+ {
19
+ &quot;name&quot;: &quot;my-app&quot;,
20
+ &quot;path&quot;: &quot;.&quot;,
21
+ &quot;changelog&quot;: &quot;CHANGELOG.md&quot;,
22
+ &quot;versionedFiles&quot;: [
23
+ { &quot;path&quot;: &quot;Cargo.toml&quot;, &quot;format&quot;: &quot;toml&quot; }
24
+ ]
25
+ }
26
+ ]
27
+ }
28
+ </code></pre>
29
+ </li>
30
+ <li><p><strong>Prévisualiser le résultat</strong></p>
31
+ <p>Avant de toucher à quoi que ce soit, lancez un dry-run pour voir ce que FerrFlow ferait :</p>
32
+ <pre><code class="language-bash">ferrflow check
33
+ </code></pre>
34
+ <p>Sortie :</p>
35
+ <pre><code>Scanning . ...
36
+ → feat: add user authentication
37
+ → fix: correct pagination offset
38
+
39
+ Bump my-app 0.1.0 → 0.2.0
40
+ Tag v0.2.0
41
+ </code></pre>
42
+ </li>
43
+ <li><p><strong>Lancer la release</strong></p>
44
+ <pre><code class="language-bash">ferrflow release
45
+ </code></pre>
46
+ <p>FerrFlow va :</p>
47
+ <ul>
48
+ <li>Mettre à jour <code>Cargo.toml</code> à <code>0.2.0</code></li>
49
+ <li>Compléter <code>CHANGELOG.md</code></li>
50
+ <li>Committer les changements</li>
51
+ <li>Créer et pousser <code>v0.2.0</code></li>
52
+ <li>Créer une release GitHub (si <code>GITHUB_TOKEN</code> est défini)</li>
53
+ </ul>
54
+ </li>
55
+ </ol>
56
+
57
+ ## Étapes suivantes
58
+
59
+ - Configurez [GitHub Actions](/fr/docs/ci/github-actions) pour lancer les releases automatiquement sur push vers `main`
60
+ - Configurez un [monorepo](/fr/docs/configuration/monorepo) si vous avez plusieurs packages
61
+ - Ajoutez des [hooks pre/post-release](/fr/docs/configuration/config-file#hooks) pour des scripts personnalisés pendant le cycle de release
62
+ - Utilisez `ferrflow version` et `ferrflow tag` dans vos scripts CI — voir la [référence CLI](/fr/docs/reference/cli)
63
+ - Consultez la [référence de configuration](/fr/docs/configuration/config-file) complète
@@ -0,0 +1,106 @@
1
+ ---
2
+ title: API FerrFlow
3
+ description: Endpoints HTTP hébergés pour FerrFlow — valider une config, prévisualiser les montées de version, résoudre la dernière release et récupérer le schéma de config.
4
+ ---
5
+
6
+ L'API FerrFlow expose un petit ensemble d'endpoints HTTP hébergés sous `https://api.ferrflow.com/v1/ferrflow/*`. Ils s'appuient sur le même cœur FerrFlow que le CLI : `validate` et `preview` renvoient donc des résultats identiques à `ferrflow validate` et `ferrflow check` — aucune seconde implémentation qui pourrait diverger.
7
+
8
+ Chaque endpoint est public (sans authentification) et sûr à appeler depuis la CI, un éditeur ou un navigateur. Le contrat lisible par machine est servi sur [`/v1/ferrflow/openapi.json`](https://api.ferrflow.com/v1/ferrflow/openapi.json) (OpenAPI 3.1).
9
+
10
+ `https://api.ferrlabs.com/v1/ferrflow/*` atteint les mêmes endpoints et continuera de fonctionner indéfiniment — c'est là que l'API a été publiée en premier, et les versions du CLI déjà diffusées l'appellent toujours. Préférez `api.ferrflow.com` pour tout nouvel usage.
11
+
12
+ ## `GET /v1/ferrflow/health`
13
+
14
+ Sonde de disponibilité et de version. Alimente les tableaux de bord d'état.
15
+
16
+ ```json
17
+ { "status": "ok", "service": "ferrflow-api", "version": "10.17.0", "time": "2026-07-21T15:00:00Z" }
18
+ ```
19
+
20
+ ## `GET /v1/ferrflow/schema`
21
+
22
+ Renvoie le schéma JSON de la config (`Content-Type: application/schema+json`), servi depuis le schéma embarqué dans la release FerrFlow — les octets exacts que le CLI utilise pour valider. Envoie un `ETag` fort et un `Cache-Control`, alors pointez le `$schema` de votre éditeur ici :
23
+
24
+ ```json
25
+ { "$schema": "https://api.ferrflow.com/v1/ferrflow/schema" }
26
+ ```
27
+
28
+ `GET /v1/ferrflow/schema/v{major}` renvoie le schéma figé à un majeur du CLI (par ex. `/schema/v5`). Seul le majeur courant est servi aujourd'hui ; les majeurs plus anciens renvoient `404` jusqu'à l'arrivée des instantanés par majeur.
29
+
30
+ ## `GET /v1/ferrflow/latest`
31
+
32
+ Résout la dernière release FerrFlow depuis GitHub, mise en cache côté serveur. Passez `platform` pour obtenir un seul artefact :
33
+
34
+ ```bash
35
+ curl "https://api.ferrflow.com/v1/ferrflow/latest?platform=linux-x64"
36
+ ```
37
+
38
+ ```json
39
+ {
40
+ "version": "5.48.0",
41
+ "tag": "v5.48.0",
42
+ "platform": "linux-x64",
43
+ "download_url": "https://github.com/FerrLabs/FerrFlow/releases/download/v5.48.0/ferrflow-linux-x64.tar.gz",
44
+ "bundle_url": "https://github.com/FerrLabs/FerrFlow/releases/download/v5.48.0/ferrflow-linux-x64.tar.gz.bundle",
45
+ "published_at": "2026-07-27T19:20:00Z"
46
+ }
47
+ ```
48
+
49
+ Les releases sont signées avec [Sigstore](/fr/verifying-releases/) — vérifiez le `.bundle` plutôt qu'une somme de contrôle (les releases jusqu'à v5.47.4 embarquent une paire `.sig` + `.crt`). Sans `platform`, la réponse liste les `assets` de chaque plateforme. Plateformes valides : `linux-x64`, `linux-arm64`, `linux-arm`, `darwin-x64`, `darwin-arm64`, `win32-x64`, `win32-arm64`.
50
+
51
+ ## `POST /v1/ferrflow/validate`
52
+
53
+ Valide une config sans dépôt — vous envoyez le texte de la config et, en option, le contenu des fichiers versionnés qu'elle référence pour que les vérifications d'existence et de cohérence des versions s'exécutent. Le résultat est identique à `ferrflow validate --json`.
54
+
55
+ ```bash
56
+ curl -X POST https://api.ferrflow.com/v1/ferrflow/validate \
57
+ -H 'content-type: application/json' \
58
+ -d '{
59
+ "config": "{\"package\":[{\"name\":\"app\",\"path\":\".\",\"versionedFiles\":[{\"path\":\"package.json\",\"format\":\"json\"}]}]}",
60
+ "files": { "package.json": "{\"version\":\"1.0.0\"}" }
61
+ }'
62
+ ```
63
+
64
+ ```json
65
+ {
66
+ "valid": true,
67
+ "config_file": null,
68
+ "package_count": 1,
69
+ "errors": [],
70
+ "warnings": [],
71
+ "suggestions": []
72
+ }
73
+ ```
74
+
75
+ Une config invalide reste une validation réussie : la réponse est `200` avec `"valid": false` et les entrées fautives. Seul un corps de requête malformé renvoie `400`. Le champ optionnel `format` (`json` | `json5` | `toml`) court-circuite la détection de format.
76
+
77
+ ## `POST /v1/ferrflow/preview`
78
+
79
+ Calcule les montées de version et le changelog pour une liste explicite de commits — la même logique que `ferrflow check`, sous forme de service. Aucun accès au dépôt ; vous passez les commits.
80
+
81
+ ```bash
82
+ curl -X POST https://api.ferrflow.com/v1/ferrflow/preview \
83
+ -H 'content-type: application/json' \
84
+ -d '{
85
+ "config": "{\"package\":[{\"name\":\"api\",\"path\":\".\"}]}",
86
+ "commits": [{ "message": "feat(api): add endpoint", "hash": "a1b2" }],
87
+ "current_versions": { "api": "1.2.3" }
88
+ }'
89
+ ```
90
+
91
+ ```json
92
+ {
93
+ "packages": [
94
+ {
95
+ "name": "api",
96
+ "current": "1.2.3",
97
+ "next": "1.3.0",
98
+ "bump": "minor",
99
+ "commits": [{ "hash": "a1b2", "type": "feat", "scope": "api", "breaking": false }],
100
+ "changelog": "### Features\n- ..."
101
+ }
102
+ ]
103
+ }
104
+ ```
105
+
106
+ Dans une config monorepo, chaque commit est affecté à un package quand ses `files` se trouvent sous le `path` de ce package. Les packages sans commit publiable sont omis.
@@ -0,0 +1,356 @@
1
+ ---
2
+ title: Commandes CLI
3
+ description: Référence complète de toutes les commandes et options du CLI FerrFlow.
4
+ ---
5
+
6
+ ## `ferrflow release`
7
+
8
+ Lance le pipeline complet de release : bump des versions, mise à jour des changelogs, commit, tag, push et création de la release.
9
+
10
+ ```bash
11
+ ferrflow release [OPTIONS]
12
+ ```
13
+
14
+ | Option | Description |
15
+ | --------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
16
+ | `--force` | Autoriser les floating tags à reculer vers une version inférieure |
17
+ | `--force-version <VERSION>` | Forcer une version spécifique, sans analyser les commits. Format : `VERSION` (repo simple) ou `NAME@VERSION` (monorepo) |
18
+ | `--channel <NAME>` | Canal de pré-release à utiliser (ex. `beta`, `rc`, `dev`) |
19
+ | `--draft` | Créer les releases en brouillon (GitHub uniquement). Un `ferrflow release` ultérieur sans `--draft` détecte et publie automatiquement les brouillons existants |
20
+ | `--force-unlock` | Forcer la levée d'un verrou `.git/ferrflow.lock` existant. À n'utiliser que si aucun autre `ferrflow release` n'est en cours — par exemple après un crash ayant laissé le fichier de verrou |
21
+
22
+ **Ce que ça fait :**
23
+
24
+ 1. Scanne les commits depuis le dernier tag pour chaque package
25
+ 2. Détermine l'incrément de version à partir des Conventional Commits
26
+ 3. Met à jour tous les `versionedFiles` avec la nouvelle version
27
+ 4. Ajoute la nouvelle section au `CHANGELOG.md`
28
+ 5. Crée un commit git, ouvre une PR, ou passe (selon `releaseCommitMode`)
29
+ 6. Crée et pousse le tag git
30
+ 7. Crée une release GitHub/GitLab avec le changelog comme notes
31
+
32
+ ---
33
+
34
+ ## `ferrflow check`
35
+
36
+ Prévisualiser ce que `ferrflow release` ferait sans effectuer de changements.
37
+
38
+ ```bash
39
+ ferrflow check [OPTIONS]
40
+ ```
41
+
42
+ | Option | Description |
43
+ | ------------------ | --------------------------------------------------------------- |
44
+ | `--json` | Sortie au format JSON |
45
+ | `--channel <NAME>` | Canal de pré-release à utiliser (ex. `beta`, `rc`, `dev`) |
46
+ | `--comment` | Poster un commentaire de prévisualisation sur la PR/MR courante |
47
+
48
+ ---
49
+
50
+ ## `ferrflow publish`
51
+
52
+ Exécuter les [publishers](/fr/docs/configuration/config-file/#publishers) configurés pour la version actuellement publiée de chaque package — sans bumper, committer ni tagger. `ferrflow release` exécute déjà vos publishers à la fin d'une release ; `ferrflow publish` sert lorsque vous préférez les exécuter dans un **job CI séparé** disposant de la toolchain de build et de l'authentification registre dont les publishers ont besoin (docker buildx, helm, un `dist/` compilé, …) — ce que votre job de release n'a pas forcément.
53
+
54
+ ```bash
55
+ ferrflow publish [PACKAGES...]
56
+ ```
57
+
58
+ | Argument / option | Description |
59
+ | ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
60
+ | `[PACKAGES...]` | Publier ces packages par leur nom (séparés par des espaces). Omettre pour auto-détecter depuis le tag déclencheur (`GITHUB_REF` / `CI_COMMIT_TAG`), avec repli sur chaque package qui déclare des publishers. |
61
+ | `--all`, `-a` | Publier tous les packages, en ignorant tout scope de tag déclencheur. |
62
+
63
+ Il lit la version actuelle de chaque package depuis ses `versionedFiles` (ou le dernier tag correspondant pour les packages tag-only), donc à exécuter **après** que `ferrflow release` a coupé la version. Les publishers sont idempotents : tout ce qui est déjà sur le registre est ignoré, donc une ré-exécution est sûre. Utilisez l'option globale `--dry-run` pour prévisualiser sans publier.
64
+
65
+ **Résolution du scope.** Sans argument, si le run a été déclenché par un tag de package (ex. `api@v2.2.1`), seul ce package est publié — un seul workflow déclenché par tag publie ainsi chaque package sur son propre tag, sans câblage par package. Sans tag correspondant (par exemple la ref de branche du job de release), tous les packages sont publiés, comme avant. Passez des noms de packages pour cibler un sous-ensemble, ou `--all` pour forcer tous les packages même sous un tag.
66
+
67
+ L'Action GitHub l'expose via `mode: publish` — elle installe le binaire et exécute `ferrflow publish` pour vous, en se scopant automatiquement au tag déclencheur (ou passez l'input `package` pour forcer). Un job déclenché par le tag n'a plus qu'à mettre en place la toolchain dont ses publishers ont besoin :
68
+
69
+ ```yaml title=".github/workflows/publish.yml"
70
+ on:
71
+ push:
72
+ # `v*` pour les repos mono-package ; `*@v*` pour les tags par-package en monorepo
73
+ tags: ['v*', '*@v*']
74
+ jobs:
75
+ publish:
76
+ runs-on: ubuntu-latest
77
+ permissions:
78
+ contents: read
79
+ packages: write
80
+ steps:
81
+ - uses: actions/checkout@v6
82
+ - uses: docker/setup-buildx-action@v4
83
+ - uses: docker/login-action@v4
84
+ with:
85
+ registry: ghcr.io
86
+ username: ${{ github.actor }}
87
+ password: ${{ secrets.GITHUB_TOKEN }}
88
+ - uses: FerrLabs/FerrFlow@v5
89
+ with:
90
+ mode: publish
91
+ ```
92
+
93
+ ---
94
+
95
+ ## `ferrflow changelog`
96
+
97
+ Générer ou mettre à jour `CHANGELOG.md` uniquement, sans bumper les versions ni créer de tags.
98
+
99
+ ```bash
100
+ ferrflow changelog
101
+ ```
102
+
103
+ Ne prend aucune option spécifique. Utilisez l'option globale `--dry-run` pour afficher l'entrée sans l'écrire.
104
+
105
+ ---
106
+
107
+ ## `ferrflow init`
108
+
109
+ Générer un fichier de configuration pour le repository courant. Détecte les fichiers de version existants (`Cargo.toml`, `package.json`, etc.) et génère la configuration appropriée.
110
+
111
+ ```bash
112
+ ferrflow init [OPTIONS]
113
+ ```
114
+
115
+ | Option | Description |
116
+ | ------------------- | -------------------------------------------------------------- |
117
+ | `--format <FORMAT>` | Format du fichier de configuration : `json`, `json5` ou `toml` |
118
+
119
+ ---
120
+
121
+ ## `ferrflow migrate`
122
+
123
+ Générer une configuration FerrFlow à partir de celle d'un autre outil de release. Lancez cette commande dans votre repo et elle écrit le `ferrflow.json` équivalent.
124
+
125
+ ```bash
126
+ ferrflow migrate [OPTIONS]
127
+ ```
128
+
129
+ | Option | Description |
130
+ | ---------------- | ------------------------------------------------------------------------------------------------------ |
131
+ | `--from <OUTIL>` | Source : `semantic-release`, `changesets`, `release-please`, `standard-version`. Auto-détecté si omis. |
132
+
133
+ ### Sources
134
+
135
+ | Outil | Lit | Ce qui est converti (extraits) |
136
+ | ------------------ | ------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
137
+ | `semantic-release` | `.releaserc`, `.releaserc.json` | `tagFormat` → `tagTemplate` ; `branches` → canaux ; `@semantic-release/exec` → `hooks` ; plugins `changelog` / `github` / `gitlab` (voir la table ci-dessous) |
138
+ | `release-please` | `release-please-config.json` | la map `packages` → packages FerrFlow (le `release-type` de chaque package → le bon fichier de version) ; `include-component-in-tag` → `tagTemplate` ; flux PR → `releaseCommitMode: pr` |
139
+ | `standard-version` | `.versionrc`, `.versionrc.json` | `tagPrefix` → `tagTemplate` ; `bumpFiles` / `packageFiles` → `versionedFiles` |
140
+ | `changesets` | `.changeset/config.json` | `baseBranch` → `branch` ; `linked` / `fixed` → groupes de versions (voir la note) |
141
+
142
+ Mapping des plugins semantic-release :
143
+
144
+ | semantic-release | FerrFlow |
145
+ | ------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- |
146
+ | `tagFormat: "v${version}"` | `tagTemplate: "v{{version}}"` |
147
+ | `branches` | `branches` — `main`/`master` deviennent la ligne stable, une branche `prerelease: true` (ou nommée) devient un canal |
148
+ | `@semantic-release/changelog` | le chemin `changelog` du package |
149
+ | `@semantic-release/exec` | `hooks` (`prepareCmd` → `preBump`, `publishCmd` → `postPublish`, `successCmd` → `onSuccess`, `failCmd` → `onError`, `verifyConditionsCmd` → `preRelease`) |
150
+ | `@semantic-release/github` / `gitlab` | `forge` |
151
+
152
+ Tout ce qui n'a pas d'équivalent FerrFlow est **signalé, jamais deviné**. Chaque exécution affiche ce qui a été converti, ignoré, et ce qui demande une revue manuelle — par exemple `@semantic-release/npm` (configurez `publishers` à la main), des règles `commit-analyzer` personnalisées (les règles de bump de FerrFlow sont fixes), et `repositoryUrl` (FerrFlow déduit le remote depuis git). Elle n'écrase pas une configuration FerrFlow existante.
153
+
154
+ <aside class="ferr-aside ferr-aside--note"><div class="ferr-aside__body"><p><strong>changesets.</strong> changesets versionne à partir de fichiers <code>.changeset/*.md</code> écrits à la main, alors que FerrFlow versionne depuis les commits conventionnels — après migration, adoptez les Conventional Commits, vos fichiers changeset existants ne sont pas lus. FerrFlow lit votre déclaration de workspace (<code>workspaces</code> dans <code>package.json</code>, ou <code>pnpm-workspace.yaml</code>) et génère une entrée <code>package</code> par package découvert : vos groupes <code>linked</code>/<code>fixed</code> référencent donc déjà de vrais packages et la config migrée valide telle quelle. Un dépôt sans déclaration de workspace obtient un seul package racine.</p>
155
+ </div></aside>
156
+
157
+ ```bash
158
+ ferrflow migrate # auto-détection
159
+ ferrflow migrate --from release-please
160
+ ```
161
+
162
+ Les configurations source JSON, YAML et JavaScript fonctionnent toutes — une configuration JavaScript (`.releaserc.js`, `release.config.js`, `.versionrc.js`) est évaluée avec `node` (Node.js doit donc être dans le PATH), et une configuration YAML (`.releaserc.yaml`, `.versionrc.yaml`) est parsée directement. Après migration, relisez la configuration générée, puis lancez `ferrflow validate` et `ferrflow check`.
163
+
164
+ ---
165
+
166
+ ## `ferrflow status`
167
+
168
+ Afficher la version actuelle de chaque package et si une release serait déclenchée.
169
+
170
+ ```bash
171
+ ferrflow status [OPTIONS]
172
+ ```
173
+
174
+ | Option | Description |
175
+ | ------------------- | -------------------------------------------- |
176
+ | `--output <FORMAT>` | Format de sortie : `text` (défaut) ou `json` |
177
+
178
+ Exemple de sortie :
179
+
180
+ ```
181
+ api 1.2.3 minor bump pending (1 feat commit)
182
+ site 0.4.1 no release (only chore commits)
183
+ ```
184
+
185
+ ---
186
+
187
+ ## `ferrflow diff`
188
+
189
+ Comparer deux versions d'un package : les commits qui y sont entrés, l'incrément de chaque commit, les fichiers modifiés, et le changelog que FerrFlow générerait pour l'intervalle. Pratique pour auditer une release, comprendre pourquoi une version a bumpé ainsi, ou rédiger des notes de release a posteriori pour un intervalle.
190
+
191
+ ```bash
192
+ ferrflow diff [PACKAGE] <FROM>..<TO> [--json]
193
+ ```
194
+
195
+ | Argument / option | Description |
196
+ | ----------------- | ------------------------------------------------------------------------------------------------------------ |
197
+ | `<FROM>..<TO>` | L'intervalle de versions. Chaque borne est un tag ou une version — `v1.4.0`, ou un tag complet `api@v1.6.0`. |
198
+ | `[PACKAGE]` | Nom du package — requis en monorepo, optionnel (et déduit) dans un repo mono-package. |
199
+ | `--json` | Émettre la comparaison en objet JSON structuré au lieu de la vue humaine. |
200
+
201
+ Chaque borne est résolue en essayant d'abord la chaîne comme tag (un vrai tag, ou `v1.4.0` en mono-package), puis comme le tag du package pour cette version (`api@v1.4.0`).
202
+
203
+ ```bash
204
+ ferrflow diff v1.4.0..v1.6.0 # repo mono-package
205
+ ferrflow diff api v1.4.0..v1.6.0 # monorepo — nommez le package
206
+ ```
207
+
208
+ La sortie liste chaque commit de l'intervalle avec son incrément (`major` / `minor` / `patch` / `none`), met en évidence les breaking changes, résume les fichiers modifiés, et rend la section de changelog pour l'intervalle. En monorepo, l'intervalle couvre pour l'instant tous les commits entre les deux tags (pas encore restreint aux chemins du package nommé).
209
+
210
+ ---
211
+
212
+ ## `ferrflow version`
213
+
214
+ Afficher la version actuelle d'un ou de tous les packages. Utile dans les scripts CI.
215
+
216
+ ```bash
217
+ ferrflow version [PACKAGE] [OPTIONS]
218
+ ```
219
+
220
+ | Option | Description |
221
+ | -------- | --------------------- |
222
+ | `--json` | Sortie au format JSON |
223
+
224
+ Retourne la version depuis le dernier tag git correspondant au modèle de tag du package.
225
+
226
+ ---
227
+
228
+ ## `ferrflow tag`
229
+
230
+ Afficher le dernier tag pour un ou tous les packages.
231
+
232
+ ```bash
233
+ ferrflow tag [PACKAGE] [OPTIONS]
234
+ ```
235
+
236
+ | Option | Description |
237
+ | -------- | --------------------- |
238
+ | `--json` | Sortie au format JSON |
239
+
240
+ ---
241
+
242
+ ## `ferrflow validate`
243
+
244
+ Valider la configuration et les fichiers versionnés qu'elle référence, sans rien bumper. Utilisez `--repo` pour valider un dépôt distant plutôt que l'arbre de travail.
245
+
246
+ ```bash
247
+ ferrflow validate [OPTIONS]
248
+ ```
249
+
250
+ | Option | Description |
251
+ | --------------- | --------------------------------------------------------------------------------- |
252
+ | `--json` | Sortie au format JSON |
253
+ | `--repo <REPO>` | Dépôt distant à valider (ex. `owner/repo` pour GitHub, ou `gitlab:group/project`) |
254
+ | `--ref <REF>` | Ref git pour la validation distante (branche, tag ou commit) |
255
+
256
+ ---
257
+
258
+ ## `ferrflow doctor`
259
+
260
+ Lancer un diagnostic en lecture seule sur le dépôt, la configuration et la forge, puis afficher un rapport par catégories — la commande « est-ce que ma config est saine ? ». Utilisez-la sur un checkout tout neuf pour voir ce qui manque avant la première release, ou quand une exécution se comporte mal et que vous devriez sinon scruter les logs `--verbose`.
261
+
262
+ ```bash
263
+ ferrflow doctor [OPTIONS]
264
+ ```
265
+
266
+ | Option | Description |
267
+ | ---------------- | ------------------------------------------------------------------------------ |
268
+ | `--format <FMT>` | `human` (défaut) ou `json` |
269
+ | `--online` | Sonder aussi l'API de la forge (rate limit / auth GitHub) ; nécessite un token |
270
+
271
+ Le rapport groupe les vérifications en cinq sections — **Repo** (dépôt git, historique de commits, arbre de travail propre, remote, tags), **Config** (quel fichier de config l'emporte, s'il parse, plus toute la suite de vérifications de `ferrflow validate`), **Versioning** (stratégie et version sur disque de chaque package), **Forge** (forge détectée et présence d'un token d'auth dans l'environnement) et **CI** (fichiers de workflow, et si un workflow épingle l'action `FerrLabs/FerrFlow`). Chaque vérification est verte, un avertissement, ou une erreur.
272
+
273
+ Le code de sortie est scriptable : `0` quand tout est vert, `1` s'il n'y a que des avertissements, `2` si une vérification est en erreur. La sortie `--format json` a une forme stable — `{ status, exit_code, sections: [{ title, checks: [{ name, status, detail }] }] }` — pour que la CI puisse s'appuyer dessus.
274
+
275
+ ```bash
276
+ ferrflow doctor # rapport lisible
277
+ ferrflow doctor --format json # lisible par machine, stable pour la CI
278
+ ferrflow doctor --online # vérifie aussi le rate limit de l'API GitHub
279
+ ```
280
+
281
+ ---
282
+
283
+ ## `ferrflow completions`
284
+
285
+ Générer un script de complétion shell et l'afficher sur la sortie standard.
286
+
287
+ ```bash
288
+ ferrflow completions <SHELL>
289
+ ```
290
+
291
+ `<SHELL>` est l'un de `bash`, `elvish`, `fish`, `powershell` ou `zsh`.
292
+
293
+ ---
294
+
295
+ ## `ferrflow schema`
296
+
297
+ Afficher le schéma JSON du fichier de configuration ferrflow. Le schéma est embarqué dans le binaire : la commande fonctionne donc hors ligne, sans appel réseau à `ferrflow.com/schema/ferrflow.json`.
298
+
299
+ ```bash
300
+ ferrflow schema [OPTIONS]
301
+ ```
302
+
303
+ | Option | Description |
304
+ | ----------------- | ---------------------------------------------------------------- |
305
+ | `--pretty` | Formater la sortie au lieu d'un JSON compact sur une seule ligne |
306
+ | `--output <FILE>` | Écrire dans un fichier plutôt que sur la sortie standard |
307
+
308
+ Utilisez-la pour pointer un éditeur vers une copie locale, ou pour valider `.ferrflow.json` dans un hook pre-commit sans accès internet :
309
+
310
+ ```bash
311
+ ferrflow schema --pretty --output ferrflow.schema.json
312
+ ```
313
+
314
+ Puis renseignez `"$schema": "./ferrflow.schema.json"` dans votre configuration. La commande parse le schéma embarqué avant de l'afficher : elle sort donc avec un code non nul si l'artefact de build est corrompu.
315
+
316
+ ---
317
+
318
+ ## Options globales
319
+
320
+ Ces options fonctionnent avec toutes les commandes :
321
+
322
+ | Option | Description |
323
+ | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
324
+ | `--dry-run` | Montrer ce qui se passerait sans effectuer de changements |
325
+ | `--verbose`, `-v` | Sortie détaillée, incluant les hashes de commits et les diffs de fichiers |
326
+ | `--log-format <FORMAT>` | Format de la sortie de diagnostic sur stderr : `human` (défaut, coloré) ou `json` (un événement structuré par ligne). Les **données** des commandes (`--json`, valeurs de `version` / `tag`) restent toujours sur stdout. |
327
+ | `--config <PATH>` | Chemin vers un fichier de configuration personnalisé (défaut : auto-détecté). Accepte aussi la variable d'environnement `FERRFLOW_CONFIG`. |
328
+ | `--jobs <N>` | Nombre max de threads pour le travail CPU-parallèle (planification par paquet). Défaut : tous les cœurs logiques ; `1` force le mono-thread. Accepte aussi la variable d'environnement `FERRFLOW_JOBS`. |
329
+ | `--version` | Afficher la version de FerrFlow et quitter |
330
+ | `--help`, `-h` | Afficher l'aide |
331
+
332
+ ## Logging & sortie
333
+
334
+ FerrFlow sépare les **données** des **logs** sur les deux flux de sortie :
335
+
336
+ - **stdout** porte les données — la sortie `--json` de `check` / `release` / `status` / `validate`, et la valeur affichée par `version` et `tag`. Capturez-la dans vos scripts : `V=$(ferrflow version)`.
337
+ - **stderr** porte le rapport humain et chaque événement de diagnostic.
338
+
339
+ Vous pouvez ainsi capturer le résultat machine et le journal d'exécution indépendamment :
340
+
341
+ ```bash
342
+ ferrflow check --json > result.json 2> run.log
343
+ ```
344
+
345
+ `--log-format json` rend chaque diagnostic sous forme d'un événement JSON structuré par ligne sur stderr, prêt pour Datadog / Loki / CloudWatch :
346
+
347
+ ```json
348
+ {
349
+ "timestamp": "2026-01-01T00:00:00Z",
350
+ "level": "INFO",
351
+ "fields": { "message": "✓ Updated CHANGELOG.md" },
352
+ "target": "ferrflow::changelog"
353
+ }
354
+ ```
355
+
356
+ `--verbose` (ou un filtre `RUST_LOG` comme `RUST_LOG=ferrflow::git=trace`) contrôle les niveaux affichés.
@@ -0,0 +1,88 @@
1
+ ---
2
+ title: Conventional Commits
3
+ description: Comment FerrFlow interprète les messages de commit pour déterminer les incréments de version.
4
+ ---
5
+
6
+ FerrFlow suit la spécification [Conventional Commits](https://www.conventionalcommits.org/) pour déterminer de combien incrémenter la version.
7
+
8
+ ## Règles d'incrément
9
+
10
+ | Type de commit | Incrément de version | Exemple |
11
+ | ----------------------------- | -------------------- | ----------------------------------- |
12
+ | `feat:` | **minor** | `feat: add wallet subscriptions` |
13
+ | `fix:` | patch | `fix: correct pagination offset` |
14
+ | `perf:` | patch | `perf: cache user queries` |
15
+ | `refactor:` | patch | `refactor: extract auth middleware` |
16
+ | `feat!:` ou `BREAKING CHANGE` | **major** | `feat!: remove deprecated endpoint` |
17
+ | `chore:` | aucun | `chore: update dependencies` |
18
+ | `docs:` | aucun | `docs: update README` |
19
+ | `ci:` | aucun | `ci: add linting step` |
20
+ | `style:` | aucun | `style: format code` |
21
+ | `test:` | aucun | `test: add unit tests` |
22
+
23
+ ## Breaking changes
24
+
25
+ Un breaking change peut être indiqué de deux manières :
26
+
27
+ **Suffixe point d'exclamation :**
28
+
29
+ ```
30
+ feat!: remove the /v1/users endpoint
31
+ fix!: change authentication header format
32
+ ```
33
+
34
+ **Footer `BREAKING CHANGE` :**
35
+
36
+ ```
37
+ feat: redesign the API
38
+
39
+ BREAKING CHANGE: The /v1/users endpoint has been removed. Use /v2/users instead.
40
+ ```
41
+
42
+ Les deux produisent un incrément **major**.
43
+
44
+ ### Variantes de footer acceptées
45
+
46
+ FerrFlow reconnaît les orthographes courantes du footer, pas seulement la forme stricte de la spec :
47
+
48
+ | Footer | Détecté |
49
+ | ------------------------------------------- | --------------------------- |
50
+ | `BREAKING CHANGE: …` | oui (spec) |
51
+ | `BREAKING-CHANGE: …` | oui (synonyme de la spec) |
52
+ | `breaking-change: …` / `breaking change: …` | oui (insensible à la casse) |
53
+ | `Breaking Change: …` | oui (insensible à la casse) |
54
+
55
+ Il traite aussi un `!` placé **à l'intérieur** du scope — `feat(api!):`, une faute de frappe courante pour `feat(api)!:` — comme un marqueur breaking. Le footer peut se trouver après n'importe quel nombre de paragraphes de corps.
56
+
57
+ ### Ce qui n'est _pas_ un breaking change
58
+
59
+ La détection reste stricte, pour qu'une mention de passage ne déclenche jamais un incrément major accidentel :
60
+
61
+ - Le footer doit débuter une ligne, utiliser une seule espace ou un tiret (`BREAKING CHANGE` / `BREAKING-CHANGE`), et être suivi d'un deux-points **et d'une espace**. `BREAKING CHANGE:sans-espace` et le pluriel `BREAKING CHANGES:` sont ignorés.
62
+ - Une mention en prose au milieu d'une ligne — « ceci corrige un breaking change dans le parseur » — n'est pas un footer.
63
+ - Un `!` qui n'est pas immédiatement avant la parenthèse fermante — `feat(a!b):` — n'est pas un marqueur.
64
+
65
+ ## Scope
66
+
67
+ Les scopes sont optionnels et ignorés pour le calcul de l'incrément. Ils sont utiles pour la lisibilité :
68
+
69
+ ```
70
+ feat(auth): add OAuth2 support → incrément minor
71
+ fix(db): correct index on user table → incrément patch
72
+ ```
73
+
74
+ ## Pas de release
75
+
76
+ Les commits de type `chore`, `docs`, `ci`, `style` ou `test` ne déclenchent pas de release. Si tous les commits depuis le dernier tag sont de ces types, FerrFlow se termine sans créer de nouvelle version.
77
+
78
+ ## Commits multiples
79
+
80
+ Lorsque plusieurs commits sont présents depuis le dernier tag, FerrFlow prend l'incrément le **plus élevé** parmi tous :
81
+
82
+ ```
83
+ fix: correct typo → patch
84
+ feat: add export button → minor ← gagne
85
+ chore: lint → aucun
86
+ ```
87
+
88
+ Résultat : incrément **minor**.