@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,806 @@
1
+ ---
2
+ title: Configuration
3
+ description: Complete reference for the FerrFlow configuration file.
4
+ ---
5
+
6
+ FerrFlow supports six config file formats, searched in this order:
7
+
8
+ 1. `ferrflow.json`
9
+ 2. `ferrflow.json5`
10
+ 3. `ferrflow.toml`
11
+ 4. `ferrflow.ts` (requires `tsx`)
12
+ 5. `ferrflow.js` (requires `node`)
13
+ 6. `.ferrflow` (JSON)
14
+
15
+ If no config file is found, FerrFlow auto-detects common version files in the current directory.
16
+
17
+ <aside class="ferr-aside ferr-aside--tip"><div class="ferr-aside__body"><p>Add <code>&quot;$schema&quot;: &quot;https://ferrflow.com/schema/ferrflow.json&quot;</code> to your JSON config for editor autocompletion and validation.</p>
18
+ </div></aside>
19
+
20
+ ## Config formats
21
+
22
+ <div class="ferr-tabs">
23
+ <div class="ferr-tab" data-label="TypeScript"><p class="ferr-tab__label">TypeScript</p><div class="ferr-tab__body"><pre><code class="language-ts">export default {
24
+ workspace: {
25
+ tagTemplate: &quot;v{version}&quot;,
26
+ },
27
+ package: [
28
+ {
29
+ name: &quot;my-app&quot;,
30
+ path: &quot;.&quot;,
31
+ changelog: &quot;CHANGELOG.md&quot;,
32
+ versionedFiles: [
33
+ { path: &quot;Cargo.toml&quot;, format: &quot;toml&quot; },
34
+ ],
35
+ },
36
+ ],
37
+ };
38
+ </code></pre>
39
+ </div></div>
40
+ <div class="ferr-tab" data-label="JSON"><p class="ferr-tab__label">JSON</p><div class="ferr-tab__body"><pre><code class="language-json">{
41
+ &quot;$schema&quot;: &quot;https://ferrflow.com/schema/ferrflow.json&quot;,
42
+ &quot;workspace&quot;: {
43
+ &quot;tagTemplate&quot;: &quot;v{version}&quot;
44
+ },
45
+ &quot;package&quot;: [
46
+ {
47
+ &quot;name&quot;: &quot;my-app&quot;,
48
+ &quot;path&quot;: &quot;.&quot;,
49
+ &quot;changelog&quot;: &quot;CHANGELOG.md&quot;,
50
+ &quot;versionedFiles&quot;: [
51
+ { &quot;path&quot;: &quot;Cargo.toml&quot;, &quot;format&quot;: &quot;toml&quot; }
52
+ ]
53
+ }
54
+ ]
55
+ }
56
+ </code></pre>
57
+ </div></div>
58
+ <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]
59
+ tag_template = &quot;v{version}&quot;
60
+
61
+ [[package]]
62
+ name = &quot;my-app&quot;
63
+ path = &quot;.&quot;
64
+ changelog = &quot;CHANGELOG.md&quot;
65
+
66
+ [[package.versioned_files]]
67
+ path = &quot;Cargo.toml&quot;
68
+ format = &quot;toml&quot;
69
+ </code></pre>
70
+ </div></div>
71
+ <div class="ferr-tab" data-label="JSON5"><p class="ferr-tab__label">JSON5</p><div class="ferr-tab__body"><pre><code class="language-json5">{
72
+ $schema: &quot;https://ferrflow.com/schema/ferrflow.json&quot;,
73
+ workspace: {
74
+ tagTemplate: &quot;v{version}&quot;,
75
+ },
76
+ package: [
77
+ {
78
+ name: &quot;my-app&quot;,
79
+ path: &quot;.&quot;,
80
+ changelog: &quot;CHANGELOG.md&quot;,
81
+ versionedFiles: [
82
+ { path: &quot;Cargo.toml&quot;, format: &quot;toml&quot; },
83
+ ],
84
+ },
85
+ ],
86
+ }
87
+ </code></pre>
88
+ </div></div>
89
+ <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:
90
+ tagTemplate: &quot;v{version}&quot;
91
+
92
+ package:
93
+
94
+ - name: my-app
95
+ path: &quot;.&quot;
96
+ changelog: CHANGELOG.md
97
+ versionedFiles:
98
+ - path: Cargo.toml
99
+ format: toml
100
+ </code></pre>
101
+
102
+ </div></div>
103
+ </div>
104
+
105
+ <aside class="ferr-aside ferr-aside--note"><div class="ferr-aside__body"><p>JSON, JSON5, and TypeScript/JavaScript configs use <strong>camelCase</strong> keys (<code>tagTemplate</code>, <code>versionedFiles</code>).
106
+ TOML configs use <strong>snake_case</strong> keys (<code>tag_template</code>, <code>versioned_files</code>).
107
+ YAML configs support both, but <strong>camelCase</strong> is recommended for consistency with JSON.
108
+ All forms are equivalent.</p>
109
+ </div></aside>
110
+
111
+ ### TypeScript and JavaScript configs
112
+
113
+ TypeScript (`.ts`) and JavaScript (`.js`) config files use a default ESM export. The export can be a plain object or an async function.
114
+
115
+ <aside class="ferr-aside ferr-aside--warning"><div class="ferr-aside__body"><p>TypeScript configs require <code>tsx</code> (<code>npm install -g tsx</code>). JavaScript configs require <code>node</code> (v18+).</p>
116
+ </div></aside>
117
+
118
+ The main advantage of TS/JS configs is **function hooks**. Instead of shell command strings, you can write hooks as native functions with full access to the hook context:
119
+
120
+ ```ts title="ferrflow.ts"
121
+ export default {
122
+ workspace: {
123
+ tagTemplate: 'v{version}',
124
+ hooks: {
125
+ postPublish: async (ctx) => {
126
+ await fetch('https://hooks.slack.com/services/...', {
127
+ method: 'POST',
128
+ body: JSON.stringify({
129
+ text: `Released ${ctx.package}@${ctx.newVersion}`,
130
+ }),
131
+ });
132
+ },
133
+ },
134
+ },
135
+ package: [
136
+ {
137
+ name: 'my-app',
138
+ path: '.',
139
+ versionedFiles: [{ path: 'package.json', format: 'json' }],
140
+ },
141
+ ],
142
+ };
143
+ ```
144
+
145
+ #### Hook context object
146
+
147
+ Function hooks receive a context object with these fields:
148
+
149
+ | Field | Type | Description |
150
+ | -------------- | -------------- | -------------------------------------------- |
151
+ | `package` | string | Package name |
152
+ | `oldVersion` | string | Version before bump (empty on first release) |
153
+ | `newVersion` | string | Version after bump |
154
+ | `bumpType` | string | `major`, `minor`, `patch`, or `none` |
155
+ | `tag` | string | Full git tag name |
156
+ | `dryRun` | boolean | Whether `--dry-run` is set |
157
+ | `packagePath` | string | Absolute path to package root |
158
+ | `channel` | string or null | Pre-release channel name |
159
+ | `isPrerelease` | boolean | Whether this is a pre-release |
160
+
161
+ Shell string hooks and function hooks can be mixed in the same config. Shell strings still work in TS/JS configs.
162
+
163
+ ## `workspace`
164
+
165
+ Global settings that apply to all packages.
166
+
167
+ | Field | Type | Default | Description |
168
+ | ----------------------- | ------- | --------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
169
+ | `remote` | string | `"origin"` | Git remote to push to |
170
+ | `branch` | string | auto-detected | Branch to push to (detected from remote HEAD) |
171
+ | `tagTemplate` | string | `"v{version}"` or `"{name}@v{version}"` | Tag naming pattern. Uses `{version}` and `{name}` placeholders. Defaults to `v{version}` for single-package repos and `{name}@v{version}` for monorepos. |
172
+ | `versioning` | string | `"semver"` | Default versioning strategy for all packages |
173
+ | `releaseCommitMode` | string | `"commit"` | How to handle the release commit: `"commit"`, `"pr"`, or `"none"` |
174
+ | `skipCi` | boolean | depends on mode | Add `[skip ci]` to release commits. Defaults to `true` when mode is `"commit"`, `false` otherwise. |
175
+ | `autoMergeReleases` | boolean | `true` | Enable auto-merge on release PRs (only applies when mode is `"pr"`) |
176
+ | `recoverMissedReleases` | boolean | `false` | When enabled, if FerrFlow finds unreleased commits spanning multiple version bumps, it creates all intermediate releases instead of jumping to the latest version |
177
+ | `floatingTags` | array | `[]` | Floating tag levels to create on each release: `"major"`, `"minor"`. For example, `["major"]` creates a `v1` tag that always points to the latest `v1.x.y` release. |
178
+ | `telemetry` | boolean | `true` | Send anonymous usage telemetry ([details](/v2/docs/legal/telemetry)) |
179
+
180
+ ### Tag template
181
+
182
+ The `tagTemplate` field controls how git tags are named. Available placeholders:
183
+
184
+ | Placeholder | Description |
185
+ | ----------- | --------------------------------- |
186
+ | `{version}` | The version number (e.g. `1.2.3`) |
187
+ | `{name}` | The package name |
188
+
189
+ <div class="ferr-tabs">
190
+ <div class="ferr-tab" data-label="JSON"><p class="ferr-tab__label">JSON</p><div class="ferr-tab__body"><pre><code class="language-json">{
191
+ &quot;workspace&quot;: {
192
+ &quot;tagTemplate&quot;: &quot;v{version}&quot;
193
+ }
194
+ }
195
+ </code></pre>
196
+ </div></div>
197
+ <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]
198
+ tag_template = &quot;v{version}&quot;
199
+ </code></pre>
200
+ </div></div>
201
+ <div class="ferr-tab" data-label="JSON5"><p class="ferr-tab__label">JSON5</p><div class="ferr-tab__body"><pre><code class="language-json5">{
202
+ workspace: {
203
+ tagTemplate: &quot;v{version}&quot;,
204
+ },
205
+ }
206
+ </code></pre>
207
+ </div></div>
208
+ <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:
209
+ tagTemplate: &quot;v{version}&quot;
210
+ </code></pre>
211
+ </div></div>
212
+ </div>
213
+
214
+ For monorepos, use `{name}` to namespace tags per package:
215
+
216
+ <div class="ferr-tabs">
217
+ <div class="ferr-tab" data-label="JSON"><p class="ferr-tab__label">JSON</p><div class="ferr-tab__body"><pre><code class="language-json">{
218
+ &quot;workspace&quot;: {
219
+ &quot;tagTemplate&quot;: &quot;{name}@v{version}&quot;
220
+ }
221
+ }
222
+ </code></pre>
223
+ </div></div>
224
+ <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]
225
+ tag_template = &quot;{name}@v{version}&quot;
226
+ </code></pre>
227
+ </div></div>
228
+ <div class="ferr-tab" data-label="JSON5"><p class="ferr-tab__label">JSON5</p><div class="ferr-tab__body"><pre><code class="language-json5">{
229
+ workspace: {
230
+ tagTemplate: &quot;{name}@v{version}&quot;,
231
+ },
232
+ }
233
+ </code></pre>
234
+ </div></div>
235
+ <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:
236
+ tagTemplate: &quot;{name}@v{version}&quot;
237
+ </code></pre>
238
+ </div></div>
239
+ </div>
240
+
241
+ ### Floating tags
242
+
243
+ Floating tags are version aliases that always point to the latest release matching a given level. This is useful for GitHub Actions or Docker images where users reference `v1` instead of `v1.2.3`.
244
+
245
+ <div class="ferr-tabs">
246
+ <div class="ferr-tab" data-label="JSON"><p class="ferr-tab__label">JSON</p><div class="ferr-tab__body"><pre><code class="language-json">{
247
+ &quot;workspace&quot;: {
248
+ &quot;floatingTags&quot;: [&quot;major&quot;]
249
+ }
250
+ }
251
+ </code></pre>
252
+ </div></div>
253
+ <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]
254
+ floating_tags = [&quot;major&quot;]
255
+ </code></pre>
256
+ </div></div>
257
+ <div class="ferr-tab" data-label="JSON5"><p class="ferr-tab__label">JSON5</p><div class="ferr-tab__body"><pre><code class="language-json5">{
258
+ workspace: {
259
+ floatingTags: [&quot;major&quot;],
260
+ },
261
+ }
262
+ </code></pre>
263
+ </div></div>
264
+ <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:
265
+ floatingTags:
266
+ - major
267
+ </code></pre>
268
+ </div></div>
269
+ </div>
270
+
271
+ When releasing `v1.2.3`, FerrFlow creates or moves a `v1` tag pointing to the same commit. With `["major", "minor"]`, both `v1` and `v1.2` tags are maintained.
272
+
273
+ If a floating tag would move backward (e.g. releasing a `v1.1.0` hotfix when `v1.2.0` already exists), FerrFlow blocks the release. Use `--force` to override this check.
274
+
275
+ ### Release commit mode
276
+
277
+ Controls how FerrFlow handles the commit that updates version files and changelogs.
278
+
279
+ | Mode | Behavior |
280
+ | ---------- | ------------------------------------------------------------ |
281
+ | `"commit"` | Commits directly to the current branch and pushes (default) |
282
+ | `"pr"` | Creates a `release/` branch and opens a pull request |
283
+ | `"none"` | Only creates tags and releases, does not commit file changes |
284
+
285
+ <div class="ferr-tabs">
286
+ <div class="ferr-tab" data-label="JSON"><p class="ferr-tab__label">JSON</p><div class="ferr-tab__body"><pre><code class="language-json">{
287
+ &quot;workspace&quot;: {
288
+ &quot;releaseCommitMode&quot;: &quot;pr&quot;,
289
+ &quot;autoMergeReleases&quot;: true
290
+ }
291
+ }
292
+ </code></pre>
293
+ </div></div>
294
+ <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]
295
+ release_commit_mode = &quot;pr&quot;
296
+ auto_merge_releases = true
297
+ </code></pre>
298
+ </div></div>
299
+ <div class="ferr-tab" data-label="JSON5"><p class="ferr-tab__label">JSON5</p><div class="ferr-tab__body"><pre><code class="language-json5">{
300
+ workspace: {
301
+ releaseCommitMode: &quot;pr&quot;,
302
+ autoMergeReleases: true,
303
+ },
304
+ }
305
+ </code></pre>
306
+ </div></div>
307
+ <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:
308
+ releaseCommitMode: pr
309
+ autoMergeReleases: true
310
+ </code></pre>
311
+ </div></div>
312
+ </div>
313
+
314
+ ### Versioning strategies
315
+
316
+ FerrFlow supports multiple versioning strategies, configurable at workspace or package level.
317
+
318
+ | Strategy | Format | Example progression |
319
+ | -------------- | ------------------- | --------------------------------------- |
320
+ | `semver` | `MAJOR.MINOR.PATCH` | `1.2.3` → `1.3.0` → `2.0.0` |
321
+ | `calver` | `YYYY.MM.PATCH` | `2026.03.0` → `2026.03.1` → `2026.04.0` |
322
+ | `calver-short` | `YY.MM.PATCH` | `26.03.0` → `26.03.1` |
323
+ | `calver-seq` | `YYYY.MM.SEQ` | `2026.03.1` → `2026.03.2` |
324
+ | `sequential` | `N` | `1` → `2` → `3` |
325
+ | `zerover` | `0.MINOR.PATCH` | `0.1.0` → `0.2.0` (never reaches 1.0) |
326
+
327
+ <div class="ferr-tabs">
328
+ <div class="ferr-tab" data-label="JSON"><p class="ferr-tab__label">JSON</p><div class="ferr-tab__body"><pre><code class="language-json">{
329
+ &quot;workspace&quot;: {
330
+ &quot;versioning&quot;: &quot;calver&quot;
331
+ }
332
+ }
333
+ </code></pre>
334
+ </div></div>
335
+ <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]
336
+ versioning = &quot;calver&quot;
337
+ </code></pre>
338
+ </div></div>
339
+ <div class="ferr-tab" data-label="JSON5"><p class="ferr-tab__label">JSON5</p><div class="ferr-tab__body"><pre><code class="language-json5">{
340
+ workspace: {
341
+ versioning: &quot;calver&quot;,
342
+ },
343
+ }
344
+ </code></pre>
345
+ </div></div>
346
+ <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:
347
+ versioning: calver
348
+ </code></pre>
349
+ </div></div>
350
+ </div>
351
+
352
+ ## `package`
353
+
354
+ Defines a package to version. You can have one or many.
355
+
356
+ | Field | Required | Default | Description |
357
+ | -------------- | -------- | ------------------------ | ----------------------------------------------------------------------------------------------------------------- |
358
+ | `name` | yes | — | Package identifier, used in git tag prefix |
359
+ | `path` | yes | — | Relative path to the package directory |
360
+ | `changelog` | no | `{path}/CHANGELOG.md` | Path to the changelog file |
361
+ | `sharedPaths` | no | `[]` | Paths that trigger this package when changed |
362
+ | `dependsOn` | no | `[]` | Package names this package depends on. When a dependency is bumped, this package gets a patch bump automatically. |
363
+ | `versioning` | no | inherited from workspace | Override versioning strategy for this package |
364
+ | `tagTemplate` | no | inherited from workspace | Override tag template for this package |
365
+ | `floatingTags` | no | inherited from workspace | Override floating tags for this package |
366
+
367
+ ### `versionedFiles`
368
+
369
+ Files where the version number should be updated.
370
+
371
+ <div class="ferr-tabs">
372
+ <div class="ferr-tab" data-label="JSON"><p class="ferr-tab__label">JSON</p><div class="ferr-tab__body"><pre><code class="language-json">{
373
+ &quot;package&quot;: [
374
+ {
375
+ &quot;name&quot;: &quot;my-app&quot;,
376
+ &quot;path&quot;: &quot;.&quot;,
377
+ &quot;versionedFiles&quot;: [
378
+ { &quot;path&quot;: &quot;Cargo.toml&quot;, &quot;format&quot;: &quot;toml&quot; },
379
+ { &quot;path&quot;: &quot;npm/package.json&quot;, &quot;format&quot;: &quot;json&quot; }
380
+ ]
381
+ }
382
+ ]
383
+ }
384
+ </code></pre>
385
+ </div></div>
386
+ <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]]
387
+ name = &quot;my-app&quot;
388
+ path = &quot;.&quot;
389
+
390
+ [[package.versioned_files]]
391
+ path = &quot;Cargo.toml&quot;
392
+ format = &quot;toml&quot;
393
+
394
+ [[package.versioned_files]]
395
+ path = &quot;npm/package.json&quot;
396
+ format = &quot;json&quot;
397
+ </code></pre>
398
+ </div></div>
399
+ <div class="ferr-tab" data-label="JSON5"><p class="ferr-tab__label">JSON5</p><div class="ferr-tab__body"><pre><code class="language-json5">{
400
+ package: [
401
+ {
402
+ name: &quot;my-app&quot;,
403
+ path: &quot;.&quot;,
404
+ versionedFiles: [
405
+ { path: &quot;Cargo.toml&quot;, format: &quot;toml&quot; },
406
+ { path: &quot;npm/package.json&quot;, format: &quot;json&quot; },
407
+ ],
408
+ },
409
+ ],
410
+ }
411
+ </code></pre>
412
+ </div></div>
413
+ <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:
414
+ - name: my-app
415
+ path: &quot;.&quot;
416
+ versionedFiles:
417
+ - path: Cargo.toml
418
+ format: toml
419
+ - path: npm/package.json
420
+ format: json
421
+ </code></pre>
422
+ </div></div>
423
+ </div>
424
+
425
+ | `format` | File | Field updated |
426
+ | -------- | ---------------------------------- | ------------------------------------------------- |
427
+ | `toml` | `Cargo.toml`, `pyproject.toml` | `[package].version` or `[project].version` |
428
+ | `json` | `package.json` | `version` |
429
+ | `xml` | `pom.xml` | First `<version>` element |
430
+ | `gradle` | `build.gradle`, `build.gradle.kts` | `version = "..."` |
431
+ | `helm` | `Chart.yaml` | `version` and `appVersion` (when present) |
432
+ | `gomod` | `go.mod` | No file update — version comes from git tags only |
433
+ | `txt` | `VERSION`, `VERSION.txt` | Entire file content replaced |
434
+
435
+ ## `hooks`
436
+
437
+ Run shell commands at key points in the release lifecycle. Hooks can be defined at workspace level (defaults for all packages) or per package (overrides workspace hooks for that package).
438
+
439
+ ### Lifecycle
440
+
441
+ ```
442
+ calculate bump
443
+
444
+ pre_bump ← validate state, check prerequisites
445
+
446
+ write version files
447
+
448
+ post_bump ← modify additional files based on new version
449
+
450
+ generate changelog
451
+
452
+ pre_commit ← review staged changes, run linters
453
+
454
+ git commit + tag
455
+
456
+ pre_publish ← run tests against tagged commit, build artifacts
457
+
458
+ git push + create release
459
+
460
+ post_publish ← push Docker images, notify Slack, publish packages
461
+ ```
462
+
463
+ ### Configuration
464
+
465
+ <div class="ferr-tabs">
466
+ <div class="ferr-tab" data-label="JSON"><p class="ferr-tab__label">JSON</p><div class="ferr-tab__body"><pre><code class="language-json">{
467
+ &quot;workspace&quot;: {
468
+ &quot;hooks&quot;: {
469
+ &quot;preBump&quot;: &quot;cargo test&quot;,
470
+ &quot;postBump&quot;: &quot;node scripts/sync-deps.js&quot;,
471
+ &quot;preCommit&quot;: &quot;cargo fmt --check&quot;,
472
+ &quot;prePublish&quot;: &quot;cargo build --release&quot;,
473
+ &quot;postPublish&quot;: &quot;make docker-push &amp;&amp; ./scripts/notify.sh&quot;,
474
+ &quot;onFailure&quot;: &quot;abort&quot;
475
+ }
476
+ }
477
+ }
478
+ </code></pre>
479
+ </div></div>
480
+ <div class="ferr-tab" data-label="TOML"><p class="ferr-tab__label">TOML</p><div class="ferr-tab__body"><pre><code class="language-toml">[hooks]
481
+ pre_bump = &quot;cargo test&quot;
482
+ post_bump = &quot;node scripts/sync-deps.js&quot;
483
+ pre_commit = &quot;cargo fmt --check&quot;
484
+ pre_publish = &quot;cargo build --release&quot;
485
+ post_publish = &quot;make docker-push &amp;&amp; ./scripts/notify.sh&quot;
486
+ on_failure = &quot;abort&quot;
487
+ </code></pre>
488
+ </div></div>
489
+ <div class="ferr-tab" data-label="JSON5"><p class="ferr-tab__label">JSON5</p><div class="ferr-tab__body"><pre><code class="language-json5">{
490
+ workspace: {
491
+ hooks: {
492
+ preBump: &quot;cargo test&quot;,
493
+ postBump: &quot;node scripts/sync-deps.js&quot;,
494
+ preCommit: &quot;cargo fmt --check&quot;,
495
+ prePublish: &quot;cargo build --release&quot;,
496
+ postPublish: &quot;make docker-push &amp;&amp; ./scripts/notify.sh&quot;,
497
+ onFailure: &quot;abort&quot;,
498
+ },
499
+ },
500
+ }
501
+ </code></pre>
502
+ </div></div>
503
+ <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:
504
+ hooks:
505
+ preBump: cargo test
506
+ postBump: node scripts/sync-deps.js
507
+ preCommit: cargo fmt --check
508
+ prePublish: cargo build --release
509
+ postPublish: &quot;make docker-push &amp;&amp; ./scripts/notify.sh&quot;
510
+ onFailure: abort
511
+ </code></pre>
512
+ </div></div>
513
+ </div>
514
+
515
+ | Field | Type | Default | Description |
516
+ | ------------- | ------ | --------- | ----------------------------------------------------------------------- |
517
+ | `preBump` | string | — | Run after bump calculation, before writing version files |
518
+ | `postBump` | string | — | Run after version files are written |
519
+ | `preCommit` | string | — | Run after changelog, before git commit |
520
+ | `prePublish` | string | — | Run after commit+tag, before push |
521
+ | `postPublish` | string | — | Run after push and release creation |
522
+ | `onFailure` | string | `"abort"` | `"abort"` cancels the release on failure, `"continue"` prints a warning |
523
+
524
+ ### Environment variables
525
+
526
+ Every hook receives these variables:
527
+
528
+ | Variable | Description | Example |
529
+ | ----------------------- | -------------------------------------------- | ------------------------------ |
530
+ | `FERRFLOW_PACKAGE` | Package name | `api` |
531
+ | `FERRFLOW_OLD_VERSION` | Version before bump (empty on first release) | `1.2.3` |
532
+ | `FERRFLOW_NEW_VERSION` | Version after bump | `1.3.0` |
533
+ | `FERRFLOW_BUMP_TYPE` | `major`, `minor`, `patch`, or `none` | `minor` |
534
+ | `FERRFLOW_TAG` | Full git tag name | `api@v1.3.0` |
535
+ | `FERRFLOW_DRY_RUN` | `true` if `--dry-run` is set | `false` |
536
+ | `FERRFLOW_PACKAGE_PATH` | Absolute path to package root | `/home/user/repo/packages/api` |
537
+
538
+ ### Per-package hooks
539
+
540
+ Package-level hooks **replace** workspace-level hooks for that package (they are not merged).
541
+
542
+ <div class="ferr-tabs">
543
+ <div class="ferr-tab" data-label="JSON"><p class="ferr-tab__label">JSON</p><div class="ferr-tab__body"><pre><code class="language-json">{
544
+ &quot;workspace&quot;: {
545
+ &quot;hooks&quot;: {
546
+ &quot;preBump&quot;: &quot;echo releasing $FERRFLOW_PACKAGE&quot;,
547
+ &quot;postPublish&quot;: &quot;make notify&quot;
548
+ }
549
+ },
550
+ &quot;package&quot;: [
551
+ {
552
+ &quot;name&quot;: &quot;api&quot;,
553
+ &quot;path&quot;: &quot;packages/api&quot;,
554
+ &quot;hooks&quot;: {
555
+ &quot;preBump&quot;: &quot;cargo test&quot;
556
+ }
557
+ }
558
+ ]
559
+ }
560
+ </code></pre>
561
+ </div></div>
562
+ <div class="ferr-tab" data-label="TOML"><p class="ferr-tab__label">TOML</p><div class="ferr-tab__body"><pre><code class="language-toml">[hooks]
563
+ pre_bump = &quot;echo releasing $FERRFLOW_PACKAGE&quot;
564
+ post_publish = &quot;make notify&quot;
565
+
566
+ [[package]]
567
+ name = &quot;api&quot;
568
+ path = &quot;packages/api&quot;
569
+
570
+ [package.hooks]
571
+ pre_bump = &quot;cargo test&quot;
572
+ </code></pre>
573
+ </div></div>
574
+ <div class="ferr-tab" data-label="JSON5"><p class="ferr-tab__label">JSON5</p><div class="ferr-tab__body"><pre><code class="language-json5">{
575
+ workspace: {
576
+ hooks: {
577
+ preBump: &quot;echo releasing $FERRFLOW_PACKAGE&quot;,
578
+ postPublish: &quot;make notify&quot;,
579
+ },
580
+ },
581
+ package: [
582
+ {
583
+ name: &quot;api&quot;,
584
+ path: &quot;packages/api&quot;,
585
+ hooks: {
586
+ preBump: &quot;cargo test&quot;,
587
+ },
588
+ },
589
+ ],
590
+ }
591
+ </code></pre>
592
+ </div></div>
593
+ <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:
594
+ hooks:
595
+ preBump: &quot;echo releasing $FERRFLOW_PACKAGE&quot;
596
+ postPublish: make notify
597
+
598
+ package:
599
+
600
+ - name: api
601
+ path: packages/api
602
+ hooks:
603
+ preBump: cargo test
604
+ </code></pre>
605
+
606
+ </div></div>
607
+ </div>
608
+
609
+ In this example, the `api` package runs `cargo test` for `preBump` (overriding the workspace echo) but inherits the workspace `postPublish` hook.
610
+
611
+ ### Behavior
612
+
613
+ - **`--dry-run`**: hooks are printed but not executed.
614
+ - **`--verbose`**: hook stdout/stderr is streamed live. Otherwise output is only shown on failure.
615
+ - Files modified by `postBump` or `preCommit` hooks are automatically included in the release commit.
616
+
617
+ ## Complete examples
618
+
619
+ ### Single repo
620
+
621
+ <div class="ferr-tabs">
622
+ <div class="ferr-tab" data-label="JSON"><p class="ferr-tab__label">JSON</p><div class="ferr-tab__body"><pre><code class="language-json">{
623
+ &quot;$schema&quot;: &quot;https://ferrflow.com/schema/ferrflow.json&quot;,
624
+ &quot;workspace&quot;: {
625
+ &quot;tagTemplate&quot;: &quot;v{version}&quot;
626
+ },
627
+ &quot;package&quot;: [
628
+ {
629
+ &quot;name&quot;: &quot;ferrflow&quot;,
630
+ &quot;path&quot;: &quot;.&quot;,
631
+ &quot;changelog&quot;: &quot;CHANGELOG.md&quot;,
632
+ &quot;versionedFiles&quot;: [
633
+ { &quot;path&quot;: &quot;Cargo.toml&quot;, &quot;format&quot;: &quot;toml&quot; },
634
+ { &quot;path&quot;: &quot;npm/package.json&quot;, &quot;format&quot;: &quot;json&quot; }
635
+ ]
636
+ }
637
+ ]
638
+ }
639
+ </code></pre>
640
+ </div></div>
641
+ <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]
642
+ tag_template = &quot;v{version}&quot;
643
+
644
+ [[package]]
645
+ name = &quot;ferrflow&quot;
646
+ path = &quot;.&quot;
647
+ changelog = &quot;CHANGELOG.md&quot;
648
+
649
+ [[package.versioned_files]]
650
+ path = &quot;Cargo.toml&quot;
651
+ format = &quot;toml&quot;
652
+
653
+ [[package.versioned_files]]
654
+ path = &quot;npm/package.json&quot;
655
+ format = &quot;json&quot;
656
+ </code></pre>
657
+ </div></div>
658
+ <div class="ferr-tab" data-label="JSON5"><p class="ferr-tab__label">JSON5</p><div class="ferr-tab__body"><pre><code class="language-json5">{
659
+ $schema: &quot;https://ferrflow.com/schema/ferrflow.json&quot;,
660
+ workspace: {
661
+ tagTemplate: &quot;v{version}&quot;,
662
+ },
663
+ package: [
664
+ {
665
+ name: &quot;ferrflow&quot;,
666
+ path: &quot;.&quot;,
667
+ changelog: &quot;CHANGELOG.md&quot;,
668
+ versionedFiles: [
669
+ { path: &quot;Cargo.toml&quot;, format: &quot;toml&quot; },
670
+ { path: &quot;npm/package.json&quot;, format: &quot;json&quot; },
671
+ ],
672
+ },
673
+ ],
674
+ }
675
+ </code></pre>
676
+ </div></div>
677
+ <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:
678
+ tagTemplate: &quot;v{version}&quot;
679
+
680
+ package:
681
+
682
+ - name: ferrflow
683
+ path: &quot;.&quot;
684
+ changelog: CHANGELOG.md
685
+ versionedFiles:
686
+ - path: Cargo.toml
687
+ format: toml
688
+ - path: npm/package.json
689
+ format: json
690
+ </code></pre>
691
+
692
+ </div></div>
693
+ </div>
694
+
695
+ ### Monorepo
696
+
697
+ <div class="ferr-tabs">
698
+ <div class="ferr-tab" data-label="JSON"><p class="ferr-tab__label">JSON</p><div class="ferr-tab__body"><pre><code class="language-json">{
699
+ &quot;$schema&quot;: &quot;https://ferrflow.com/schema/ferrflow.json&quot;,
700
+ &quot;workspace&quot;: {
701
+ &quot;tagTemplate&quot;: &quot;{name}@v{version}&quot;
702
+ },
703
+ &quot;package&quot;: [
704
+ {
705
+ &quot;name&quot;: &quot;api&quot;,
706
+ &quot;path&quot;: &quot;packages/api&quot;,
707
+ &quot;changelog&quot;: &quot;packages/api/CHANGELOG.md&quot;,
708
+ &quot;sharedPaths&quot;: [&quot;packages/shared/&quot;],
709
+ &quot;versionedFiles&quot;: [
710
+ { &quot;path&quot;: &quot;packages/api/Cargo.toml&quot;, &quot;format&quot;: &quot;toml&quot; }
711
+ ]
712
+ },
713
+ {
714
+ &quot;name&quot;: &quot;site&quot;,
715
+ &quot;path&quot;: &quot;packages/site&quot;,
716
+ &quot;changelog&quot;: &quot;packages/site/CHANGELOG.md&quot;,
717
+ &quot;sharedPaths&quot;: [&quot;packages/shared/&quot;],
718
+ &quot;versionedFiles&quot;: [
719
+ { &quot;path&quot;: &quot;packages/site/package.json&quot;, &quot;format&quot;: &quot;json&quot; }
720
+ ]
721
+ }
722
+ ]
723
+ }
724
+ </code></pre>
725
+ </div></div>
726
+ <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]
727
+ tag_template = &quot;{name}@v{version}&quot;
728
+
729
+ [[package]]
730
+ name = &quot;api&quot;
731
+ path = &quot;packages/api&quot;
732
+ changelog = &quot;packages/api/CHANGELOG.md&quot;
733
+ shared_paths = [&quot;packages/shared/&quot;]
734
+
735
+ [[package.versioned_files]]
736
+ path = &quot;packages/api/Cargo.toml&quot;
737
+ format = &quot;toml&quot;
738
+
739
+ [[package]]
740
+ name = &quot;site&quot;
741
+ path = &quot;packages/site&quot;
742
+ changelog = &quot;packages/site/CHANGELOG.md&quot;
743
+ shared_paths = [&quot;packages/shared/&quot;]
744
+
745
+ [[package.versioned_files]]
746
+ path = &quot;packages/site/package.json&quot;
747
+ format = &quot;json&quot;
748
+ </code></pre>
749
+ </div></div>
750
+ <div class="ferr-tab" data-label="JSON5"><p class="ferr-tab__label">JSON5</p><div class="ferr-tab__body"><pre><code class="language-json5">{
751
+ $schema: &quot;https://ferrflow.com/schema/ferrflow.json&quot;,
752
+ workspace: {
753
+ tagTemplate: &quot;{name}@v{version}&quot;,
754
+ },
755
+ package: [
756
+ {
757
+ name: &quot;api&quot;,
758
+ path: &quot;packages/api&quot;,
759
+ changelog: &quot;packages/api/CHANGELOG.md&quot;,
760
+ sharedPaths: [&quot;packages/shared/&quot;],
761
+ versionedFiles: [
762
+ { path: &quot;packages/api/Cargo.toml&quot;, format: &quot;toml&quot; },
763
+ ],
764
+ },
765
+ {
766
+ name: &quot;site&quot;,
767
+ path: &quot;packages/site&quot;,
768
+ changelog: &quot;packages/site/CHANGELOG.md&quot;,
769
+ sharedPaths: [&quot;packages/shared/&quot;],
770
+ versionedFiles: [
771
+ { path: &quot;packages/site/package.json&quot;, format: &quot;json&quot; },
772
+ ],
773
+ },
774
+ ],
775
+ }
776
+ </code></pre>
777
+ </div></div>
778
+ <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:
779
+ tagTemplate: &quot;{name}@v{version}&quot;
780
+
781
+ package:
782
+
783
+ - name: api
784
+ path: packages/api
785
+ changelog: packages/api/CHANGELOG.md
786
+ sharedPaths:
787
+ - packages/shared/
788
+ versionedFiles:
789
+ - path: packages/api/Cargo.toml
790
+ format: toml
791
+
792
+ - name: site
793
+ path: packages/site
794
+ changelog: packages/site/CHANGELOG.md
795
+ sharedPaths:
796
+ - packages/shared/
797
+ versionedFiles:
798
+ - path: packages/site/package.json
799
+ format: json
800
+ </code></pre>
801
+
802
+ </div></div>
803
+ </div>
804
+
805
+ <aside class="ferr-aside ferr-aside--tip"><div class="ferr-aside__body"><p>Run <code>ferrflow init</code> to generate a config file automatically based on what FerrFlow detects in your repo.</p>
806
+ </div></aside>