@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,182 @@
1
+ ---
2
+ title: Supported formats
3
+ description: Version file formats that FerrFlow can read and update.
4
+ ---
5
+
6
+ <div class="ferr-tabs">
7
+ <div class="ferr-tab" data-label="JSON"><p class="ferr-tab__label">JSON</p><div class="ferr-tab__body"><p>Used by Node.js (<code>package.json</code>).</p>
8
+ <p>FerrFlow updates the top-level <code>version</code> field.</p>
9
+ <pre><code class="language-json">{
10
+ &quot;name&quot;: &quot;my-package&quot;,
11
+ &quot;version&quot;: &quot;1.2.3&quot;
12
+ }
13
+ </code></pre>
14
+ </div></div>
15
+ <div class="ferr-tab" data-label="TOML"><p class="ferr-tab__label">TOML</p><div class="ferr-tab__body"><p>Used by Rust (<code>Cargo.toml</code>) and Python (<code>pyproject.toml</code>).</p>
16
+ <p>FerrFlow updates the <code>version</code> field under <code>[package]</code>, <code>[project]</code>, or <code>[tool.poetry]</code>.</p>
17
+ <pre><code class="language-toml">[package]
18
+ name = &quot;my-crate&quot;
19
+ version = &quot;1.2.3&quot; # ← updated
20
+ </code></pre>
21
+ </div></div>
22
+ <div class="ferr-tab" data-label="XML"><p class="ferr-tab__label">XML</p><div class="ferr-tab__body"><p>Used by Java/Maven (<code>pom.xml</code>).</p>
23
+ <p>FerrFlow updates the first <code>&lt;version&gt;</code> element it encounters.</p>
24
+ <pre><code class="language-xml">&lt;project&gt;
25
+ &lt;groupId&gt;com.example&lt;/groupId&gt;
26
+ &lt;artifactId&gt;my-app&lt;/artifactId&gt;
27
+ &lt;version&gt;1.2.3&lt;/version&gt; &lt;!-- updated --&gt;
28
+ &lt;/project&gt;
29
+ </code></pre>
30
+ </div></div>
31
+ <div class="ferr-tab" data-label="Gradle"><p class="ferr-tab__label">Gradle</p><div class="ferr-tab__body"><p>Used by Java/Kotlin Gradle projects (<code>build.gradle</code>, <code>build.gradle.kts</code>).</p>
32
+ <p>FerrFlow updates the <code>version = &quot;...&quot;</code> assignment.</p>
33
+ <pre><code class="language-groovy">version = &quot;1.2.3&quot; // updated
34
+ </code></pre>
35
+ </div></div>
36
+ <div class="ferr-tab" data-label="Plain text"><p class="ferr-tab__label">Plain text</p><div class="ferr-tab__body"><p>Used for simple version files (<code>VERSION</code>, <code>VERSION.txt</code>).</p>
37
+ <p>FerrFlow replaces the entire file content with the version number.</p>
38
+ <pre><code>1.2.3
39
+ </code></pre>
40
+ </div></div>
41
+ <div class="ferr-tab" data-label="Go"><p class="ferr-tab__label">Go</p><div class="ferr-tab__body"><p>Used by Go projects (<code>go.mod</code>).</p>
42
+ <p>Go modules use git tags directly — FerrFlow does <strong>not</strong> modify <code>go.mod</code>. The version is derived entirely from the git tag (<code>v1.2.3</code> or <code>{name}@v1.2.3</code>).</p>
43
+ <p>On a brand-new repo with no matching tag yet, FerrFlow v3+ bootstraps from the strategy&#39;s zero value (<code>0.0.0</code> for <code>semver</code>, <code>0</code> for <code>sequential</code>, …) and creates the first real tag itself — you do not need to run <code>git tag … v0.0.0</code> before the first release. See <a href="/docs/reference/cli#which-version-is-bumped-from">how <code>release</code> picks the baseline</a>.</p>
44
+ </div></div>
45
+ <div class="ferr-tab" data-label="Helm"><p class="ferr-tab__label">Helm</p><div class="ferr-tab__body"><p>Used by Kubernetes Helm charts (<code>Chart.yaml</code>).</p>
46
+ <p>FerrFlow updates the <code>version</code> field and, when present, keeps <code>appVersion</code> in sync.</p>
47
+ <p>The newer <code>chartyaml</code> alias is functionally equivalent — use whichever reads more naturally in your config.</p>
48
+ <pre><code class="language-yaml">apiVersion: v2
49
+ name: my-app
50
+ version: 1.2.3 # ← updated
51
+ appVersion: &quot;1.2.3&quot; # ← updated when present
52
+ </code></pre>
53
+ </div></div>
54
+ <div class="ferr-tab" data-label="Dart"><p class="ferr-tab__label">Dart</p><div class="ferr-tab__body"><p>Used by Dart and Flutter packages (<code>pubspec.yaml</code>).</p>
55
+ <p>FerrFlow updates the top-level <code>version:</code> key, leaving dependency versions, anchors, and comments intact. SemVer build suffixes (<code>1.2.3+42</code>) are supported.</p>
56
+ <pre><code class="language-yaml">name: my_app
57
+ version: 1.2.3+42 # ← updated
58
+ dependencies:
59
+ some_pkg:
60
+ version: 2.0.0 # untouched — this is a dep constraint
61
+ </code></pre>
62
+ <p>Config snippet:</p>
63
+ <pre><code class="language-toml">[[package.versioned_files]]
64
+ path = &quot;pubspec.yaml&quot;
65
+ format = &quot;pubspecyaml&quot;
66
+ </code></pre>
67
+ </div></div>
68
+ <div class="ferr-tab" data-label="Elixir"><p class="ferr-tab__label">Elixir</p><div class="ferr-tab__body"><p>Used by Elixir / Mix projects (<code>mix.exs</code>).</p>
69
+ <p>FerrFlow updates the first <code>version: &quot;…&quot;</code> literal it finds — the canonical spot is inside <code>def project do [ ..., version: &quot;x.y.z&quot;, ... ] end</code>.</p>
70
+ <pre><code class="language-elixir">def project do
71
+ [
72
+ app: :my_app,
73
+ version: &quot;1.2.3&quot;, # ← updated
74
+ elixir: &quot;~&gt; 1.15&quot;,
75
+ deps: deps()
76
+ ]
77
+ end
78
+ </code></pre>
79
+ <p>Config snippet:</p>
80
+ <pre><code class="language-toml">[[package.versioned_files]]
81
+ path = &quot;mix.exs&quot;
82
+ format = &quot;mixexs&quot;
83
+ </code></pre>
84
+ </div></div>
85
+ <div class="ferr-tab" data-label="Ruby"><p class="ferr-tab__label">Ruby</p><div class="ferr-tab__body"><p>Used by Ruby gems (<code>*.gemspec</code>).</p>
86
+ <p>FerrFlow updates the <code>.version = &quot;…&quot;</code> assignment. Any receiver name works (<code>s</code>, <code>spec</code>, <code>gem</code>, …). Setting <code>version</code> from a constant (<code>s.version = MyGem::VERSION</code>) isn&#39;t covered — version the loaded <code>version.rb</code> file directly in that case.</p>
87
+ <pre><code class="language-ruby">Gem::Specification.new do |s|
88
+ s.name = &quot;my_gem&quot;
89
+ s.version = &quot;1.2.3&quot; # ← updated
90
+ end
91
+ </code></pre>
92
+ <p>Config snippet:</p>
93
+ <pre><code class="language-toml">[[package.versioned_files]]
94
+ path = &quot;my_gem.gemspec&quot;
95
+ format = &quot;gemspec&quot;
96
+ </code></pre>
97
+ </div></div>
98
+ <div class="ferr-tab" data-label="Swift"><p class="ferr-tab__label">Swift</p><div class="ferr-tab__body"><p>Used by Swift packages (<code>Package.swift</code>).</p>
99
+ <p>Swift PM derives a package&#39;s version from git tags, so there&#39;s no canonical location inside <code>Package.swift</code> — FerrFlow updates the first <code>let &lt;name&gt;Version = &quot;…&quot;</code> declaration. Constant names must end with <code>Version</code> (e.g. <code>packageVersion</code>, <code>AppVersion</code>) or be literally <code>version</code>. Dependency <code>.package(url:..., from: &quot;…&quot;)</code> arguments are <strong>not</strong> touched.</p>
100
+ <pre><code class="language-swift">import PackageDescription
101
+
102
+ let packageVersion = &quot;1.2.3&quot; // ← updated
103
+
104
+ let package = Package(
105
+ name: &quot;MyPackage&quot;,
106
+ dependencies: [
107
+ .package(url: &quot;…&quot;, from: &quot;1.5.0&quot;), // untouched
108
+ ]
109
+ )
110
+ </code></pre>
111
+ <p>Config snippet:</p>
112
+ <pre><code class="language-toml">[[package.versioned_files]]
113
+ path = &quot;Package.swift&quot;
114
+ format = &quot;packageswift&quot;
115
+ </code></pre>
116
+ </div></div>
117
+ </div>
118
+
119
+ ## File → format quick reference
120
+
121
+ | File | `format` | Selector / behaviour |
122
+ | ---------------------------------- | --------------------- | ------------------------------------------ |
123
+ | `Cargo.toml` | `toml` | `package.version` |
124
+ | `pyproject.toml` | `toml` | `project.version` or `tool.poetry.version` |
125
+ | `package.json` | `json` | `version` |
126
+ | `composer.json` | `json` | `version` |
127
+ | `pom.xml` | `xml` | first `<version>` tag |
128
+ | `*.csproj` | `csproj` | `<Version>` in `<PropertyGroup>` |
129
+ | `build.gradle`, `build.gradle.kts` | `gradle` | `version = "…"` |
130
+ | `Chart.yaml` | `helm` or `chartyaml` | top-level `version:` |
131
+ | `pubspec.yaml` | `pubspecyaml` | top-level `version:` |
132
+ | `mix.exs` | `mixexs` | `version: "…"` in project keyword list |
133
+ | `*.gemspec` | `gemspec` | `<ident>.version = "…"` |
134
+ | `Package.swift` | `packageswift` | top-level `let <name>Version = "…"` |
135
+ | `go.mod` | `gomod` | git tag only — no file write |
136
+ | `VERSION`, `VERSION.txt` | `txt` | entire file content |
137
+
138
+ ## Multiple files per package
139
+
140
+ A package can have as many versioned file entries as needed:
141
+
142
+ <div class="ferr-tabs">
143
+ <div class="ferr-tab" data-label="JSON"><p class="ferr-tab__label">JSON</p><div class="ferr-tab__body"><pre><code class="language-json">{
144
+ &quot;package&quot;: {
145
+ &quot;versionedFiles&quot;: [
146
+ { &quot;path&quot;: &quot;Cargo.toml&quot;, &quot;format&quot;: &quot;toml&quot; },
147
+ { &quot;path&quot;: &quot;npm/package.json&quot;, &quot;format&quot;: &quot;json&quot; }
148
+ ]
149
+ }
150
+ }
151
+ </code></pre>
152
+ </div></div>
153
+ <div class="ferr-tab" data-label="TOML"><p class="ferr-tab__label">TOML</p><div class="ferr-tab__body"><pre><code class="language-toml">[[package.versioned_files]]
154
+ path = &quot;Cargo.toml&quot;
155
+ format = &quot;toml&quot;
156
+
157
+ [[package.versioned_files]]
158
+ path = &quot;npm/package.json&quot;
159
+ format = &quot;json&quot;
160
+ </code></pre>
161
+ </div></div>
162
+ <div class="ferr-tab" data-label="JSON5"><p class="ferr-tab__label">JSON5</p><div class="ferr-tab__body"><pre><code class="language-json5">{
163
+ package: {
164
+ versionedFiles: [
165
+ { path: &quot;Cargo.toml&quot;, format: &quot;toml&quot; },
166
+ { path: &quot;npm/package.json&quot;, format: &quot;json&quot; },
167
+ ],
168
+ },
169
+ }
170
+ </code></pre>
171
+ </div></div>
172
+ <div class="ferr-tab" data-label="YAML"><p class="ferr-tab__label">YAML</p><div class="ferr-tab__body"><pre><code class="language-yaml">package:
173
+ versionedFiles:
174
+ - path: Cargo.toml
175
+ format: toml
176
+ - path: npm/package.json
177
+ format: json
178
+ </code></pre>
179
+ </div></div>
180
+ </div>
181
+
182
+ Both files will be updated to the same version before the git commit.
@@ -0,0 +1,324 @@
1
+ ---
2
+ title: Monorepo
3
+ description: Version multiple packages independently in a single repository.
4
+ ---
5
+
6
+ FerrFlow treats a repository as a monorepo when the config defines more than one package. Each package is versioned independently based on its own git history.
7
+
8
+ ## Package isolation
9
+
10
+ FerrFlow uses path prefixes to determine which commits belong to which package. Only commits that touch files under `path` (or `sharedPaths`) trigger a release for that package.
11
+
12
+ <div class="ferr-tabs">
13
+ <div class="ferr-tab" data-label="JSON"><p class="ferr-tab__label">JSON</p><div class="ferr-tab__body"><pre><code class="language-json">{
14
+ &quot;package&quot;: [
15
+ {
16
+ &quot;name&quot;: &quot;api&quot;,
17
+ &quot;path&quot;: &quot;packages/api&quot;
18
+ },
19
+ {
20
+ &quot;name&quot;: &quot;site&quot;,
21
+ &quot;path&quot;: &quot;packages/site&quot;
22
+ }
23
+ ]
24
+ }
25
+ </code></pre>
26
+ </div></div>
27
+ <div class="ferr-tab" data-label="TOML"><p class="ferr-tab__label">TOML</p><div class="ferr-tab__body"><pre><code class="language-toml">[[package]]
28
+ name = &quot;api&quot;
29
+ path = &quot;packages/api&quot;
30
+
31
+ [[package]]
32
+ name = &quot;site&quot;
33
+ path = &quot;packages/site&quot;
34
+ </code></pre>
35
+ </div></div>
36
+ <div class="ferr-tab" data-label="JSON5"><p class="ferr-tab__label">JSON5</p><div class="ferr-tab__body"><pre><code class="language-json5">{
37
+ package: [
38
+ {
39
+ name: &quot;api&quot;,
40
+ path: &quot;packages/api&quot;,
41
+ },
42
+ {
43
+ name: &quot;site&quot;,
44
+ path: &quot;packages/site&quot;,
45
+ },
46
+ ],
47
+ }
48
+ </code></pre>
49
+ </div></div>
50
+ <div class="ferr-tab" data-label="YAML"><p class="ferr-tab__label">YAML</p><div class="ferr-tab__body"><pre><code class="language-yaml">package:
51
+ - name: api
52
+ path: packages/api
53
+ - name: site
54
+ path: packages/site
55
+ </code></pre>
56
+ </div></div>
57
+ </div>
58
+
59
+ ## Shared dependencies
60
+
61
+ If you have code shared between packages (e.g., a `packages/shared/` library), declare it as a `sharedPaths` entry. A change to any shared path triggers a release for every package that lists it:
62
+
63
+ <div class="ferr-tabs">
64
+ <div class="ferr-tab" data-label="JSON"><p class="ferr-tab__label">JSON</p><div class="ferr-tab__body"><pre><code class="language-json">{
65
+ &quot;package&quot;: [
66
+ {
67
+ &quot;name&quot;: &quot;api&quot;,
68
+ &quot;path&quot;: &quot;packages/api&quot;,
69
+ &quot;sharedPaths&quot;: [&quot;packages/shared/&quot;]
70
+ },
71
+ {
72
+ &quot;name&quot;: &quot;site&quot;,
73
+ &quot;path&quot;: &quot;packages/site&quot;,
74
+ &quot;sharedPaths&quot;: [&quot;packages/shared/&quot;]
75
+ }
76
+ ]
77
+ }
78
+ </code></pre>
79
+ </div></div>
80
+ <div class="ferr-tab" data-label="TOML"><p class="ferr-tab__label">TOML</p><div class="ferr-tab__body"><pre><code class="language-toml">[[package]]
81
+ name = &quot;api&quot;
82
+ path = &quot;packages/api&quot;
83
+ shared_paths = [&quot;packages/shared/&quot;]
84
+
85
+ [[package]]
86
+ name = &quot;site&quot;
87
+ path = &quot;packages/site&quot;
88
+ shared_paths = [&quot;packages/shared/&quot;]
89
+ </code></pre>
90
+ </div></div>
91
+ <div class="ferr-tab" data-label="JSON5"><p class="ferr-tab__label">JSON5</p><div class="ferr-tab__body"><pre><code class="language-json5">{
92
+ package: [
93
+ {
94
+ name: &quot;api&quot;,
95
+ path: &quot;packages/api&quot;,
96
+ sharedPaths: [&quot;packages/shared/&quot;],
97
+ },
98
+ {
99
+ name: &quot;site&quot;,
100
+ path: &quot;packages/site&quot;,
101
+ sharedPaths: [&quot;packages/shared/&quot;],
102
+ },
103
+ ],
104
+ }
105
+ </code></pre>
106
+ </div></div>
107
+ <div class="ferr-tab" data-label="YAML"><p class="ferr-tab__label">YAML</p><div class="ferr-tab__body"><pre><code class="language-yaml">package:
108
+ - name: api
109
+ path: packages/api
110
+ sharedPaths:
111
+ - packages/shared/
112
+ - name: site
113
+ path: packages/site
114
+ sharedPaths:
115
+ - packages/shared/
116
+ </code></pre>
117
+ </div></div>
118
+ </div>
119
+
120
+ ## Package dependencies
121
+
122
+ Use `dependsOn` to declare that a package depends on another. When a dependency is released, the dependent package automatically receives a patch bump — even if none of its own files changed. This cascades transitively: if `app` depends on `cli` and `cli` depends on `core`, bumping `core` bumps both `cli` and `app`.
123
+
124
+ <div class="ferr-tabs">
125
+ <div class="ferr-tab" data-label="JSON"><p class="ferr-tab__label">JSON</p><div class="ferr-tab__body"><pre><code class="language-json">{
126
+ &quot;package&quot;: [
127
+ {
128
+ &quot;name&quot;: &quot;core&quot;,
129
+ &quot;path&quot;: &quot;packages/core&quot;
130
+ },
131
+ {
132
+ &quot;name&quot;: &quot;cli&quot;,
133
+ &quot;path&quot;: &quot;packages/cli&quot;,
134
+ &quot;dependsOn&quot;: [&quot;core&quot;]
135
+ },
136
+ {
137
+ &quot;name&quot;: &quot;app&quot;,
138
+ &quot;path&quot;: &quot;packages/app&quot;,
139
+ &quot;dependsOn&quot;: [&quot;cli&quot;]
140
+ }
141
+ ]
142
+ }
143
+ </code></pre>
144
+ </div></div>
145
+ <div class="ferr-tab" data-label="TOML"><p class="ferr-tab__label">TOML</p><div class="ferr-tab__body"><pre><code class="language-toml">[[package]]
146
+ name = &quot;core&quot;
147
+ path = &quot;packages/core&quot;
148
+
149
+ [[package]]
150
+ name = &quot;cli&quot;
151
+ path = &quot;packages/cli&quot;
152
+ depends_on = [&quot;core&quot;]
153
+
154
+ [[package]]
155
+ name = &quot;app&quot;
156
+ path = &quot;packages/app&quot;
157
+ depends_on = [&quot;cli&quot;]
158
+ </code></pre>
159
+ </div></div>
160
+ <div class="ferr-tab" data-label="JSON5"><p class="ferr-tab__label">JSON5</p><div class="ferr-tab__body"><pre><code class="language-json5">{
161
+ package: [
162
+ {
163
+ name: &quot;core&quot;,
164
+ path: &quot;packages/core&quot;,
165
+ },
166
+ {
167
+ name: &quot;cli&quot;,
168
+ path: &quot;packages/cli&quot;,
169
+ dependsOn: [&quot;core&quot;],
170
+ },
171
+ {
172
+ name: &quot;app&quot;,
173
+ path: &quot;packages/app&quot;,
174
+ dependsOn: [&quot;cli&quot;],
175
+ },
176
+ ],
177
+ }
178
+ </code></pre>
179
+ </div></div>
180
+ <div class="ferr-tab" data-label="YAML"><p class="ferr-tab__label">YAML</p><div class="ferr-tab__body"><pre><code class="language-yaml">package:
181
+ - name: core
182
+ path: packages/core
183
+ - name: cli
184
+ path: packages/cli
185
+ dependsOn:
186
+ - core
187
+ - name: app
188
+ path: packages/app
189
+ dependsOn:
190
+ - cli
191
+ </code></pre>
192
+ </div></div>
193
+ </div>
194
+
195
+ <aside class="ferr-aside ferr-aside--note"><div class="ferr-aside__body"><p><code>dependsOn</code> differs from <code>sharedPaths</code>. Shared paths trigger a bump when files in the shared directory change. <code>dependsOn</code> triggers a bump when another <strong>package</strong> is released, regardless of which files changed.</p>
196
+ </div></aside>
197
+
198
+ ## Git tag format
199
+
200
+ By default, monorepo tags use the `{name}@v{version}` format:
201
+
202
+ ```
203
+ api@v1.2.0
204
+ site@v0.4.1
205
+ ```
206
+
207
+ Configure this with the `tagTemplate` field:
208
+
209
+ <div class="ferr-tabs">
210
+ <div class="ferr-tab" data-label="JSON"><p class="ferr-tab__label">JSON</p><div class="ferr-tab__body"><pre><code class="language-json">{
211
+ &quot;workspace&quot;: {
212
+ &quot;tagTemplate&quot;: &quot;{name}@v{version}&quot;
213
+ }
214
+ }
215
+ </code></pre>
216
+ </div></div>
217
+ <div class="ferr-tab" data-label="TOML"><p class="ferr-tab__label">TOML</p><div class="ferr-tab__body"><pre><code class="language-toml">[workspace]
218
+ tag_template = &quot;{name}@v{version}&quot;
219
+ </code></pre>
220
+ </div></div>
221
+ <div class="ferr-tab" data-label="JSON5"><p class="ferr-tab__label">JSON5</p><div class="ferr-tab__body"><pre><code class="language-json5">{
222
+ workspace: {
223
+ tagTemplate: &quot;{name}@v{version}&quot;,
224
+ },
225
+ }
226
+ </code></pre>
227
+ </div></div>
228
+ <div class="ferr-tab" data-label="YAML"><p class="ferr-tab__label">YAML</p><div class="ferr-tab__body"><pre><code class="language-yaml">workspace:
229
+ tagTemplate: &quot;{name}@v{version}&quot;
230
+ </code></pre>
231
+ </div></div>
232
+ </div>
233
+
234
+ For a single-package repo, the default is `v{version}` (no name prefix).
235
+
236
+ FerrFlow looks for the most recent tag matching the template to determine what commits are new.
237
+
238
+ ## Independent cadences
239
+
240
+ Packages release independently. In a single `ferrflow release` run:
241
+
242
+ - `api` may bump from `1.2.0` → `1.3.0` (new `feat:` commit)
243
+ - `site` may bump from `0.4.0` → `0.4.1` (only `fix:` commits)
244
+ - `shared` may not release at all (only `chore:` commits)
245
+
246
+ ## Per-package overrides
247
+
248
+ Each package can override the workspace-level `versioning` strategy and `tagTemplate`:
249
+
250
+ <div class="ferr-tabs">
251
+ <div class="ferr-tab" data-label="JSON"><p class="ferr-tab__label">JSON</p><div class="ferr-tab__body"><pre><code class="language-json">{
252
+ &quot;workspace&quot;: {
253
+ &quot;versioning&quot;: &quot;semver&quot;,
254
+ &quot;tagTemplate&quot;: &quot;{name}@v{version}&quot;
255
+ },
256
+ &quot;package&quot;: [
257
+ {
258
+ &quot;name&quot;: &quot;api&quot;,
259
+ &quot;path&quot;: &quot;packages/api&quot;,
260
+ &quot;versioning&quot;: &quot;calver&quot;
261
+ },
262
+ {
263
+ &quot;name&quot;: &quot;site&quot;,
264
+ &quot;path&quot;: &quot;packages/site&quot;,
265
+ &quot;tagTemplate&quot;: &quot;site-v{version}&quot;
266
+ }
267
+ ]
268
+ }
269
+ </code></pre>
270
+ </div></div>
271
+ <div class="ferr-tab" data-label="TOML"><p class="ferr-tab__label">TOML</p><div class="ferr-tab__body"><pre><code class="language-toml">[workspace]
272
+ versioning = &quot;semver&quot;
273
+ tag_template = &quot;{name}@v{version}&quot;
274
+
275
+ [[package]]
276
+ name = &quot;api&quot;
277
+ path = &quot;packages/api&quot;
278
+ versioning = &quot;calver&quot;
279
+
280
+ [[package]]
281
+ name = &quot;site&quot;
282
+ path = &quot;packages/site&quot;
283
+ tag_template = &quot;site-v{version}&quot;
284
+ </code></pre>
285
+ </div></div>
286
+ <div class="ferr-tab" data-label="JSON5"><p class="ferr-tab__label">JSON5</p><div class="ferr-tab__body"><pre><code class="language-json5">{
287
+ workspace: {
288
+ versioning: &quot;semver&quot;,
289
+ tagTemplate: &quot;{name}@v{version}&quot;,
290
+ },
291
+ package: [
292
+ {
293
+ name: &quot;api&quot;,
294
+ path: &quot;packages/api&quot;,
295
+ versioning: &quot;calver&quot;,
296
+ },
297
+ {
298
+ name: &quot;site&quot;,
299
+ path: &quot;packages/site&quot;,
300
+ tagTemplate: &quot;site-v{version}&quot;,
301
+ },
302
+ ],
303
+ }
304
+ </code></pre>
305
+ </div></div>
306
+ <div class="ferr-tab" data-label="YAML"><p class="ferr-tab__label">YAML</p><div class="ferr-tab__body"><pre><code class="language-yaml">workspace:
307
+ versioning: semver
308
+ tagTemplate: &quot;{name}@v{version}&quot;
309
+
310
+ package:
311
+
312
+ - name: api
313
+ path: packages/api
314
+ versioning: calver
315
+ - name: site
316
+ path: packages/site
317
+ tagTemplate: &quot;site-v{version}&quot;
318
+ </code></pre>
319
+
320
+ </div></div>
321
+ </div>
322
+
323
+ <aside class="ferr-aside ferr-aside--tip"><div class="ferr-aside__body"><p>Use <code>ferrflow check</code> to preview exactly which packages would be released and at what version before committing to a release.</p>
324
+ </div></aside>
@@ -0,0 +1,48 @@
1
+ ---
2
+ title: Installation
3
+ description: How to install FerrFlow locally or in CI.
4
+ ---
5
+
6
+ ## Local installation
7
+
8
+ <div class="ferr-tabs">
9
+ <div class="ferr-tab" data-label="Cargo"><p class="ferr-tab__label">Cargo</p><div class="ferr-tab__body"><pre><code class="language-bash">cargo install ferrflow
10
+ </code></pre>
11
+ </div></div>
12
+ <div class="ferr-tab" data-label="npm"><p class="ferr-tab__label">npm</p><div class="ferr-tab__body"><pre><code class="language-bash">npm install -g ferrflow
13
+ # or as a dev dependency
14
+ npm install -D ferrflow
15
+ </code></pre>
16
+ </div></div>
17
+ <div class="ferr-tab" data-label="WASM (browser)"><p class="ferr-tab__label">WASM (browser)</p><div class="ferr-tab__body"><pre><code class="language-bash">npm install @ferrflow/wasm
18
+ </code></pre>
19
+ <p>Use FerrFlow directly in the browser — parse commits, compute version bumps, and generate changelogs client-side without a backend.</p>
20
+ </div></div>
21
+ <div class="ferr-tab" data-label="Binary"><p class="ferr-tab__label">Binary</p><div class="ferr-tab__body"><p>Download a pre-built binary from <a href="https://github.com/FerrLabs/FerrFlow/releases/latest">Releases</a>:</p>
22
+ <pre><code class="language-bash"># Linux x86_64
23
+ curl -L https://github.com/FerrLabs/FerrFlow/releases/latest/download/ferrflow-linux-x64.tar.gz | tar xz
24
+ sudo mv ferrflow /usr/local/bin/
25
+ </code></pre>
26
+ </div></div>
27
+ <div class="ferr-tab" data-label="Docker"><p class="ferr-tab__label">Docker</p><div class="ferr-tab__body"><pre><code class="language-bash">docker run --rm -v $(pwd):/repo ghcr.io/ferrlabs/ferrflow:latest check
28
+ </code></pre>
29
+ </div></div>
30
+ </div>
31
+
32
+ ## CI installation
33
+
34
+ The recommended way to use FerrFlow in CI is the GitHub Action — no installation step needed:
35
+
36
+ ```yaml title=".github/workflows/release.yml"
37
+ - uses: FerrLabs/ferrflow@v4
38
+ env:
39
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
40
+ ```
41
+
42
+ See [GitHub Actions](/docs/ci/github-actions) and [GitLab CI](/docs/ci/gitlab-ci) for complete examples.
43
+
44
+ ## Verify
45
+
46
+ ```bash
47
+ ferrflow --version
48
+ ```
@@ -0,0 +1,56 @@
1
+ ---
2
+ title: Introduction
3
+ description: What FerrFlow is and why it exists.
4
+ ---
5
+
6
+ FerrFlow is a single binary that automates semantic versioning for any repository — monorepo or classic, any language.
7
+
8
+ It reads your commit history, determines the right version bump, updates your version files, writes a changelog, creates a git tag, and publishes a release. Zero runtime dependencies.
9
+
10
+ <div class="ferr-card-group" data-cols="2">
11
+ <div class="ferr-card"><p class="ferr-card__title">CLI-first</p><div class="ferr-card__body"><p>Everything happens from your terminal or your CI. No UI to click, no config server to babysit.</p>
12
+ </div></div>
13
+ <div class="ferr-card"><p class="ferr-card__title">Multi-forge</p><div class="ferr-card__body"><p>GitHub, GitLab, self-hosted — FerrFlow adapts to your forge. One tool, any platform.</p>
14
+ </div></div>
15
+ <div class="ferr-card"><p class="ferr-card__title">Conventional commits</p><div class="ferr-card__body"><p>Reads commit history to determine version bumps automatically. No manual changelog maintenance.</p>
16
+ </div></div>
17
+ <div class="ferr-card"><p class="ferr-card__title">Zero infra</p><div class="ferr-card__body"><p>A single binary with no daemon, no server, no database. Runs wherever your CI runs.</p>
18
+ </div></div>
19
+ </div>
20
+
21
+ ## Why not semantic-release or changesets?
22
+
23
+ Most versioning tools are coupled to a specific ecosystem or require Node.js to be present in your CI.
24
+
25
+ | Tool | Monorepo | Multi-language | Runtime |
26
+ | ---------------- | ----------- | -------------- | -------- |
27
+ | semantic-release | via plugins | JS/Node only | Node.js |
28
+ | changesets | manual bump | JS only | Node.js |
29
+ | release-please | limited | partial | Node.js |
30
+ | cargo-release | no | Rust only | Rust |
31
+ | **FerrFlow** | **native** | **any** | **none** |
32
+
33
+ FerrFlow ships as a compiled binary. Drop it in any CI environment without installing a runtime. A WASM build (`@ferrflow/wasm`) is also available for browser-side usage.
34
+
35
+ For side-by-side latency, peak memory and install size against the JS ecosystem release tools, see [Performance](/performance) — numbers refresh on every FerrFlow release.
36
+
37
+ <aside class="ferr-aside ferr-aside--note"><p class="ferr-aside__title">Heads up</p><div class="ferr-aside__body"><p>FerrFlow is versioning only. Issue tracking, secrets, and AI agents live in separate FerrLabs products.</p>
38
+ </div></aside>
39
+
40
+ ## How it works
41
+
42
+ 1. **Reads commits** since the last git tag for each package
43
+ 2. **Determines the bump** from [Conventional Commits](/docs/reference/conventional-commits) (`feat` → minor, `fix` → patch, breaking → major)
44
+ 3. **Updates version files** — `Cargo.toml`, `package.json`, `pom.xml`, etc.
45
+ 4. **Writes the changelog** in Keep a Changelog format
46
+ 5. **Creates a git tag** (`api@v1.2.0`) and pushes
47
+ 6. **Publishes a GitHub/GitLab release** with the changelog as release notes
48
+
49
+ In a monorepo, FerrFlow only releases packages that have changed, and understands shared dependency paths.
50
+
51
+ ## Key features
52
+
53
+ - **Pre/post-release hooks** — run scripts at every lifecycle stage (bump, commit, publish, failure)
54
+ - **Query commands** — `ferrflow version`, `ferrflow tag`, and `ferrflow status` for CI scripting
55
+ - **Any version file** — Cargo.toml, package.json, pom.xml, build.gradle, Chart.yaml, plain text, and more
56
+ - **Browser support** — `@ferrflow/wasm` brings commit parsing, bump computation, and changelog generation to the browser