@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,88 @@
1
+ ---
2
+ title: Conventional Commits
3
+ description: How FerrFlow interprets commit messages to determine version bumps.
4
+ ---
5
+
6
+ FerrFlow follows the [Conventional Commits](https://www.conventionalcommits.org/) specification to determine how much to bump the version.
7
+
8
+ ## Bump rules
9
+
10
+ | Commit type | Version bump | Example |
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!:` or `BREAKING CHANGE` | **major** | `feat!: remove deprecated endpoint` |
17
+ | `chore:` | none | `chore: update dependencies` |
18
+ | `docs:` | none | `docs: update README` |
19
+ | `ci:` | none | `ci: add linting step` |
20
+ | `style:` | none | `style: format code` |
21
+ | `test:` | none | `test: add unit tests` |
22
+
23
+ ## Breaking changes
24
+
25
+ A breaking change can be indicated in two ways:
26
+
27
+ **Exclamation mark suffix:**
28
+
29
+ ```
30
+ feat!: remove the /v1/users endpoint
31
+ fix!: change authentication header format
32
+ ```
33
+
34
+ **`BREAKING CHANGE` footer:**
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
+ Both produce a **major** version bump.
43
+
44
+ ### Accepted footer variants
45
+
46
+ FerrFlow recognises the common real-world spellings of the footer, not just the strict spec form:
47
+
48
+ | Footer | Detected |
49
+ | ------------------------------------------- | ---------------------- |
50
+ | `BREAKING CHANGE: …` | yes (spec) |
51
+ | `BREAKING-CHANGE: …` | yes (spec synonym) |
52
+ | `breaking-change: …` / `breaking change: …` | yes (case-insensitive) |
53
+ | `Breaking Change: …` | yes (case-insensitive) |
54
+
55
+ It also treats a `!` placed **inside** the scope — `feat(api!):`, a common typo for `feat(api)!:` — as a breaking marker. The footer may sit after any number of body paragraphs.
56
+
57
+ ### What is _not_ a breaking change
58
+
59
+ Detection stays strict, so a stray mention never triggers an accidental major bump:
60
+
61
+ - The footer must start a line, use a single space or hyphen (`BREAKING CHANGE` / `BREAKING-CHANGE`), and be followed by a colon **and a space**. `BREAKING CHANGE:no-space` and the plural `BREAKING CHANGES:` are ignored.
62
+ - A prose mention mid-line — "this fixes a breaking change in the parser" — is not a footer.
63
+ - A `!` that is not immediately before the closing paren — `feat(a!b):` — is not a marker.
64
+
65
+ ## Scope
66
+
67
+ Scopes are optional and ignored for bump calculation. They're useful for readability:
68
+
69
+ ```
70
+ feat(auth): add OAuth2 support → minor bump
71
+ fix(db): correct index on user table → patch bump
72
+ ```
73
+
74
+ ## No release
75
+
76
+ Commits with types `chore`, `docs`, `ci`, `style`, or `test` do not trigger a release. If all commits since the last tag are of these types, FerrFlow exits without creating a new version.
77
+
78
+ ## Multiple commits
79
+
80
+ When multiple commits are present since the last tag, FerrFlow takes the **highest** bump across all of them:
81
+
82
+ ```
83
+ fix: correct typo → patch
84
+ feat: add export button → minor ← wins
85
+ chore: lint → none
86
+ ```
87
+
88
+ Result: **minor** bump.
@@ -0,0 +1,508 @@
1
+ ---
2
+ title: Error codes
3
+ description: Reference for all FerrFlow error codes with causes and fixes.
4
+ ---
5
+
6
+ When FerrFlow encounters an error, it displays a code like `error[E2001]` with a link to this page. Use the code to find the cause and fix.
7
+
8
+ ## Configuration Errors
9
+
10
+ ### E1001: Config file not found
11
+
12
+ <span id="e1001"></span>
13
+
14
+ The config file specified via `--config` does not exist.
15
+
16
+ <aside class="ferr-aside ferr-aside--tip"><div class="ferr-aside__body"><p>Run <code>ferrflow init</code> to create a config file, or check the path.</p>
17
+ </div></aside>
18
+
19
+ ### E1002: Failed to parse ferrflow.json
20
+
21
+ <span id="e1002"></span>
22
+
23
+ The `ferrflow.json` file contains invalid JSON (missing commas, trailing commas, unquoted keys).
24
+
25
+ ### E1003: Failed to parse ferrflow.json5
26
+
27
+ <span id="e1003"></span>
28
+
29
+ The `ferrflow.json5` file contains invalid JSON5.
30
+
31
+ ### E1004: Failed to parse ferrflow.toml
32
+
33
+ <span id="e1004"></span>
34
+
35
+ The `ferrflow.toml` file contains invalid TOML.
36
+
37
+ ### E1005: Failed to serialize to TOML
38
+
39
+ <span id="e1005"></span>
40
+
41
+ Internal error when writing TOML output.
42
+
43
+ ### E1006: Failed to parse .ferrflow
44
+
45
+ <span id="e1006"></span>
46
+
47
+ The `.ferrflow` dotfile contains invalid JSON.
48
+
49
+ ### E1007: Failed to serialize .ferrflow
50
+
51
+ <span id="e1007"></span>
52
+
53
+ Internal error when writing the dotfile.
54
+
55
+ ### E1008: Failed to resolve path
56
+
57
+ <span id="e1008"></span>
58
+
59
+ A path in the config could not be resolved to an absolute path.
60
+
61
+ ### E1009: Failed to write temporary loader file
62
+
63
+ <span id="e1009"></span>
64
+
65
+ Could not write the temporary JS/TS loader during config evaluation.
66
+
67
+ ### E1010: Failed to execute tsx
68
+
69
+ <span id="e1010"></span>
70
+
71
+ The `tsx` runtime could not be found or executed for `.ts` config files.
72
+
73
+ <aside class="ferr-aside ferr-aside--tip"><div class="ferr-aside__body"><p>Install tsx: <code>npm install -g tsx</code>, or use a JSON/TOML config instead.</p>
74
+ </div></aside>
75
+
76
+ ### E1011: Failed to execute node
77
+
78
+ <span id="e1011"></span>
79
+
80
+ The `node` runtime could not be found or executed for `.js` config files.
81
+
82
+ <aside class="ferr-aside ferr-aside--tip"><div class="ferr-aside__body"><p>Install Node.js or use a JSON/TOML config instead.</p>
83
+ </div></aside>
84
+
85
+ ### E1012: Config evaluation failed
86
+
87
+ <span id="e1012"></span>
88
+
89
+ The JS/TS config file threw an error during evaluation.
90
+
91
+ ### E1013: Invalid config output
92
+
93
+ <span id="e1013"></span>
94
+
95
+ The JS/TS config file produced non-UTF-8 output.
96
+
97
+ ### E1014: Invalid JSON from config
98
+
99
+ <span id="e1014"></span>
100
+
101
+ The JS/TS config file did not produce valid JSON output.
102
+
103
+ ### E1015: Failed to read config file
104
+
105
+ <span id="e1015"></span>
106
+
107
+ The config file exists but could not be read (permissions, encoding).
108
+
109
+ ### E1016: Multiple config files found
110
+
111
+ <span id="e1016"></span>
112
+
113
+ More than one config file was found in the project root (e.g. both `ferrflow.json` and `ferrflow.toml`).
114
+
115
+ <aside class="ferr-aside ferr-aside--tip"><div class="ferr-aside__body"><p>Keep only one config file and delete the others.</p>
116
+ </div></aside>
117
+
118
+ ### E1017: Config file already exists
119
+
120
+ <span id="e1017"></span>
121
+
122
+ Running `ferrflow init` when a config file already exists.
123
+
124
+ ## Validation Errors
125
+
126
+ ### E1100: Invalid repo spec
127
+
128
+ <span id="e1100"></span>
129
+
130
+ The `--repo` argument does not match the expected format `owner/repo` or `host/owner/repo`.
131
+
132
+ ### E1101: GitHub API error
133
+
134
+ <span id="e1101"></span>
135
+
136
+ The GitHub API returned an error during remote config validation.
137
+
138
+ ### E1102: GitLab API error
139
+
140
+ <span id="e1102"></span>
141
+
142
+ The GitLab API returned an error during remote config validation.
143
+
144
+ ### E1103: Invalid UTF-8 in config
145
+
146
+ <span id="e1103"></span>
147
+
148
+ The remote config file contains invalid UTF-8 encoding.
149
+
150
+ ### E1104: Failed to parse remote config
151
+
152
+ <span id="e1104"></span>
153
+
154
+ The remote config file could not be parsed.
155
+
156
+ ### E1105: Remote config file not found
157
+
158
+ <span id="e1105"></span>
159
+
160
+ The specified config file path does not exist in the remote repository.
161
+
162
+ ### E1106: No config file found
163
+
164
+ <span id="e1106"></span>
165
+
166
+ No FerrFlow config file was found in the remote repository.
167
+
168
+ ### E1107: --ref requires --repo
169
+
170
+ <span id="e1107"></span>
171
+
172
+ The `--ref` flag was used without specifying `--repo`.
173
+
174
+ ## Git Operation Errors
175
+
176
+ ### E2001: Not a git repository
177
+
178
+ <span id="e2001"></span>
179
+
180
+ The current directory is not inside a git repository.
181
+
182
+ <aside class="ferr-aside ferr-aside--tip"><div class="ferr-aside__body"><p>Run FerrFlow from within a git repository, or check the <code>--config</code> path.</p>
183
+ </div></aside>
184
+
185
+ ### E2002: Bare repository not supported
186
+
187
+ <span id="e2002"></span>
188
+
189
+ FerrFlow does not support bare git repositories.
190
+
191
+ ### E2003: Tag already exists
192
+
193
+ <span id="e2003"></span>
194
+
195
+ The tag that FerrFlow wants to create already exists.
196
+
197
+ <aside class="ferr-aside ferr-aside--tip"><div class="ferr-aside__body"><p>Delete the existing tag or use <code>--force</code> to overwrite.</p>
198
+ </div></aside>
199
+
200
+ ### E2004: Failed to push branch
201
+
202
+ <span id="e2004"></span>
203
+
204
+ Could not push the release branch to the remote.
205
+
206
+ <aside class="ferr-aside ferr-aside--tip"><div class="ferr-aside__body"><p>Check that you have push access and the branch is not protected.</p>
207
+ </div></aside>
208
+
209
+ ### E2005: Push rejected by remote
210
+
211
+ <span id="e2005"></span>
212
+
213
+ The remote rejected the push (non-fast-forward, branch protection, hooks).
214
+
215
+ <aside class="ferr-aside ferr-aside--tip"><div class="ferr-aside__body"><p>Pull the latest changes and retry, or check branch protection rules.</p>
216
+ </div></aside>
217
+
218
+ ### E2006: Failed to push tags
219
+
220
+ <span id="e2006"></span>
221
+
222
+ Could not push tags to the remote.
223
+
224
+ ### E2007: Failed to push floating tags
225
+
226
+ <span id="e2007"></span>
227
+
228
+ Could not force-push floating tags (e.g. `v1`, `v1.2`).
229
+
230
+ ### E2008: Remote not found
231
+
232
+ <span id="e2008"></span>
233
+
234
+ The configured git remote (default: `origin`) does not exist.
235
+
236
+ <aside class="ferr-aside ferr-aside--tip"><div class="ferr-aside__body"><p>Check <code>git remote -v</code> and update the <code>remote</code> field in your config.</p>
237
+ </div></aside>
238
+
239
+ ### E2009: Post-push verification failed
240
+
241
+ <span id="e2009"></span>
242
+
243
+ After pushing, the release commit could not be verified on the remote branch.
244
+
245
+ ### E2010: Remote branch not found
246
+
247
+ <span id="e2010"></span>
248
+
249
+ The remote branch was not found after a push operation.
250
+
251
+ ## GitHub API Errors
252
+
253
+ ### E3001: Failed to create release
254
+
255
+ <span id="e3001"></span>
256
+
257
+ The GitHub Releases API returned an error when creating a release.
258
+
259
+ <aside class="ferr-aside ferr-aside--tip"><div class="ferr-aside__body"><p>Check that <code>GITHUB_TOKEN</code> or <code>FERRFLOW_TOKEN</code> has <code>contents: write</code> permission.</p>
260
+ </div></aside>
261
+
262
+ ### E3002: Failed to list releases
263
+
264
+ <span id="e3002"></span>
265
+
266
+ Could not fetch existing releases from the GitHub API.
267
+
268
+ ### E3003: Failed to parse releases response
269
+
270
+ <span id="e3003"></span>
271
+
272
+ The GitHub API returned an unexpected response format.
273
+
274
+ ### E3004: Failed to publish release
275
+
276
+ <span id="e3004"></span>
277
+
278
+ Could not publish (un-draft) a GitHub release.
279
+
280
+ ### E3005: Failed to create pull request
281
+
282
+ <span id="e3005"></span>
283
+
284
+ The GitHub API returned an error when creating a PR.
285
+
286
+ ### E3006: Failed to parse PR response
287
+
288
+ <span id="e3006"></span>
289
+
290
+ The GitHub API returned an unexpected PR response format.
291
+
292
+ ### E3007: PR response missing required field
293
+
294
+ <span id="e3007"></span>
295
+
296
+ The GitHub API PR response was missing the `number` or `node_id` field.
297
+
298
+ ### E3008: Failed to enable auto-merge
299
+
300
+ <span id="e3008"></span>
301
+
302
+ Could not enable auto-merge on the release PR via the GraphQL API.
303
+
304
+ ### E3009: Failed to parse GraphQL response
305
+
306
+ <span id="e3009"></span>
307
+
308
+ The GitHub GraphQL API returned an unexpected response.
309
+
310
+ ### E3010: Auto-merge failed
311
+
312
+ <span id="e3010"></span>
313
+
314
+ The GraphQL mutation to enable auto-merge returned an error.
315
+
316
+ ## GitLab API Errors
317
+
318
+ ### E3101: Failed to create release
319
+
320
+ <span id="e3101"></span>
321
+
322
+ The GitLab Releases API returned an error.
323
+
324
+ <aside class="ferr-aside ferr-aside--tip"><div class="ferr-aside__body"><p>Check that the CI token has API access and the project allows release creation.</p>
325
+ </div></aside>
326
+
327
+ ### E3102: Failed to create merge request
328
+
329
+ <span id="e3102"></span>
330
+
331
+ The GitLab API returned an error when creating an MR.
332
+
333
+ ### E3103: Failed to parse MR response
334
+
335
+ <span id="e3103"></span>
336
+
337
+ The GitLab API returned an unexpected MR response format.
338
+
339
+ ### E3104: MR response missing iid field
340
+
341
+ <span id="e3104"></span>
342
+
343
+ The GitLab MR response was missing the `iid` field.
344
+
345
+ ### E3105: Failed to merge MR
346
+
347
+ <span id="e3105"></span>
348
+
349
+ Could not merge the release MR via the GitLab API.
350
+
351
+ ## Version File Errors
352
+
353
+ ### TOML (E4101 to E4105)
354
+
355
+ | Code | Error |
356
+ | --------- | --------------------------------- |
357
+ | **E4101** | Cannot read TOML version file |
358
+ | **E4102** | Invalid TOML syntax |
359
+ | **E4103** | No `version` field found |
360
+ | **E4104** | Failed to write TOML version file |
361
+ | **E4105** | Invalid UTF-8 in TOML file |
362
+
363
+ ### JSON (E4201 to E4205)
364
+
365
+ | Code | Error |
366
+ | --------- | --------------------------------- |
367
+ | **E4201** | Cannot read JSON version file |
368
+ | **E4202** | Invalid JSON syntax |
369
+ | **E4203** | No `version` field found |
370
+ | **E4204** | Failed to write JSON version file |
371
+ | **E4205** | Invalid UTF-8 in JSON file |
372
+
373
+ ### Helm / YAML (E4301 to E4304)
374
+
375
+ | Code | Error |
376
+ | --------- | --------------------------- |
377
+ | **E4301** | Cannot read Chart.yaml |
378
+ | **E4302** | No `version` field found |
379
+ | **E4303** | Failed to write Chart.yaml |
380
+ | **E4304** | Invalid UTF-8 in Chart.yaml |
381
+
382
+ ### XML (E4401 to E4404)
383
+
384
+ | Code | Error |
385
+ | --------- | ---------------------------- |
386
+ | **E4401** | Cannot read XML version file |
387
+ | **E4402** | No `<version>` tag found |
388
+ | **E4403** | Failed to write XML file |
389
+ | **E4404** | Invalid UTF-8 in XML file |
390
+
391
+ ### CSProj (E4410 to E4413)
392
+
393
+ | Code | Error |
394
+ | --------- | ----------------------------- |
395
+ | **E4410** | Cannot read .csproj file |
396
+ | **E4411** | No `<Version>` tag found |
397
+ | **E4412** | Failed to write .csproj file |
398
+ | **E4413** | Invalid UTF-8 in .csproj file |
399
+
400
+ ### Gradle (E4501 to E4504)
401
+
402
+ | Code | Error |
403
+ | --------- | ----------------------------- |
404
+ | **E4501** | Cannot read build.gradle |
405
+ | **E4502** | No `version` field found |
406
+ | **E4503** | Failed to write build.gradle |
407
+ | **E4504** | Invalid UTF-8 in build.gradle |
408
+
409
+ ### Go mod (E4601 to E4603)
410
+
411
+ | Code | Error |
412
+ | --------- | -------------------------------------------------- |
413
+ | **E4601** | Failed to run `git describe` |
414
+ | **E4602** | No version tag found — handled internally since v3 |
415
+ | **E4603** | Go modules do not support write |
416
+
417
+ **On `E4602`**: starting with FerrFlow v3 the release flow catches this case and falls back to the strategy's bootstrap baseline (`0.0.0` / `0` / …), so the first release on a brand-new repo succeeds without a pre-seeded tag. The error code still exists for programs that import `GoModVersionFile` directly, but end users running `ferrflow release` should not see it anymore.
418
+
419
+ ### Text (E4701 to E4704)
420
+
421
+ | Code | Error |
422
+ | --------- | ----------------------------- |
423
+ | **E4701** | Cannot read text version file |
424
+ | **E4702** | No version found |
425
+ | **E4703** | Failed to write text file |
426
+ | **E4704** | Invalid UTF-8 in text file |
427
+
428
+ ## Pre-release Errors
429
+
430
+ ### E5001: Empty channel name
431
+
432
+ <span id="e5001"></span>
433
+
434
+ The pre-release channel name is empty.
435
+
436
+ <aside class="ferr-aside ferr-aside--tip"><div class="ferr-aside__body"><p>Provide a non-empty channel name: <code>--channel beta</code></p>
437
+ </div></aside>
438
+
439
+ ### E5002: Invalid channel name
440
+
441
+ <span id="e5002"></span>
442
+
443
+ The channel name contains invalid characters. Only alphanumeric characters and hyphens are allowed.
444
+
445
+ ## Versioning Errors
446
+
447
+ ### E5010: Invalid semver
448
+
449
+ <span id="e5010"></span>
450
+
451
+ The current version string is not valid semantic versioning.
452
+
453
+ <aside class="ferr-aside ferr-aside--tip"><div class="ferr-aside__body"><p>Ensure the version in your versioned file follows <code>MAJOR.MINOR.PATCH</code> format.</p>
454
+ </div></aside>
455
+
456
+ ## Hook Errors
457
+
458
+ ### E6001: Hook execution failed
459
+
460
+ <span id="e6001"></span>
461
+
462
+ A lifecycle hook exited with a non-zero status code and `on_failure` is set to `abort`.
463
+
464
+ <aside class="ferr-aside ferr-aside--tip"><div class="ferr-aside__body"><p>Check the hook command output, or set <code>on_failure: &quot;continue&quot;</code> to ignore failures.</p>
465
+ </div></aside>
466
+
467
+ ## Query Errors
468
+
469
+ ### E7001: No packages configured
470
+
471
+ <span id="e7001"></span>
472
+
473
+ No packages are defined in the config file.
474
+
475
+ <aside class="ferr-aside ferr-aside--tip"><div class="ferr-aside__body"><p>Run <code>ferrflow init</code> to create a config, or add packages manually.</p>
476
+ </div></aside>
477
+
478
+ ### E7002: Package not found
479
+
480
+ <span id="e7002"></span>
481
+
482
+ The specified package name does not exist in the config.
483
+
484
+ <aside class="ferr-aside ferr-aside--tip"><div class="ferr-aside__body"><p>Run <code>ferrflow version</code> to list all configured packages.</p>
485
+ </div></aside>
486
+
487
+ ## Monorepo Errors
488
+
489
+ ### E8001: Package not found in config
490
+
491
+ <span id="e8001"></span>
492
+
493
+ A package referenced during release was not found in the configuration.
494
+
495
+ ### E8002: Floating tag backward move
496
+
497
+ <span id="e8002"></span>
498
+
499
+ A floating tag would move to an older version.
500
+
501
+ <aside class="ferr-aside ferr-aside--tip"><div class="ferr-aside__body"><p>Use <code>--force</code> to override the safety check.</p>
502
+ </div></aside>
503
+
504
+ ### E8003: Dependency cycle
505
+
506
+ <span id="e8003"></span>
507
+
508
+ Two or more packages depend on each other through `dependsOn`, directly or transitively, so there is no order in which to release them. The message names the loop, e.g. `cycle detected: api → web → api`. Remove one of the `dependsOn` edges to break it. The check runs before any version is written, so a cyclic configuration never leaves a partial release behind.
@@ -0,0 +1,97 @@
1
+ ---
2
+ title: Verifying releases
3
+ description: Every FerrFlow release ships Sigstore signatures, a CycloneDX SBOM, and a SLSA provenance attestation. Here's how to verify them.
4
+ ---
5
+
6
+ Every release tarball, the Docker image, the binary completions archive, and the SBOM that ships alongside them are signed via [Sigstore](https://www.sigstore.dev/) keyless signing. There are no public keys to track — the signing identity is the GitHub Actions workload identity running in `FerrLabs/FerrFlow`, anchored in the public [Rekor](https://docs.sigstore.dev/logging/overview/) transparency log.
7
+
8
+ Available since v5.2.
9
+
10
+ ## What ships per release
11
+
12
+ | Artifact | Sidecar |
13
+ | ---------------------------------- | -------------------------------- |
14
+ | `ferrflow-linux-x64.tar.gz` | `.bundle` |
15
+ | `ferrflow-linux-arm64.tar.gz` | `.bundle` |
16
+ | `ferrflow-linux-armv7.tar.gz` | `.bundle` |
17
+ | `ferrflow-darwin-x64.tar.gz` | `.bundle` |
18
+ | `ferrflow-darwin-arm64.tar.gz` | `.bundle` |
19
+ | `ferrflow-windows-x64.zip` | `.bundle` |
20
+ | `ferrflow-windows-arm64.zip` | `.bundle` |
21
+ | `ferrflow-completions.tar.gz` | `.bundle` |
22
+ | `sbom.cdx.json` | `.bundle` |
23
+ | `ghcr.io/ferrlabs/ferrflow:vX.Y.Z` | Cosign signature in GHCR + Rekor |
24
+
25
+ All sidecars are downloadable from the GitHub Release page next to the binary.
26
+
27
+ > Releases up to **v5.47.4** ship a `.sig` + `.crt` pair instead of a single `.bundle`. Verify those with `--certificate <file>.crt --signature <file>.sig` in place of `--bundle`. The switch came with cosign v3, which replaced the separate signature and certificate outputs with one bundle.
28
+
29
+ ## Verifying a tarball
30
+
31
+ ```bash
32
+ # install cosign (one-time)
33
+ curl -L https://github.com/sigstore/cosign/releases/latest/download/cosign-linux-amd64 \
34
+ -o /usr/local/bin/cosign && chmod +x /usr/local/bin/cosign
35
+
36
+ # download the artifact + sidecars from the release page
37
+ TAG=v5.2.3
38
+ gh release download "$TAG" --repo FerrLabs/FerrFlow \
39
+ -p 'ferrflow-linux-x64.tar.gz*'
40
+
41
+ # verify
42
+ cosign verify-blob \
43
+ --bundle ferrflow-linux-x64.tar.gz.bundle \
44
+ --certificate-identity-regexp "https://github.com/FerrLabs/FerrFlow/.*" \
45
+ --certificate-oidc-issuer https://token.actions.githubusercontent.com \
46
+ ferrflow-linux-x64.tar.gz
47
+ # → Verified OK
48
+ ```
49
+
50
+ A passing verification means:
51
+
52
+ - The tarball bytes haven't been tampered with since the release workflow signed them.
53
+ - The signing identity was a workflow running in `FerrLabs/FerrFlow` triggered by GitHub Actions' OIDC issuer.
54
+ - The signature is recorded in the public Rekor log — search [search.sigstore.dev](https://search.sigstore.dev/) for the `.sig` value.
55
+
56
+ ## Verifying the Docker image
57
+
58
+ ```bash
59
+ cosign verify ghcr.io/ferrlabs/ferrflow:v5.2.3 \
60
+ --certificate-identity-regexp "https://github.com/FerrLabs/FerrFlow/.*" \
61
+ --certificate-oidc-issuer https://token.actions.githubusercontent.com
62
+ ```
63
+
64
+ ## Verifying the SBOM
65
+
66
+ The SBOM (`sbom.cdx.json`) is a [CycloneDX](https://cyclonedx.org/) document listing every transitive dependency of the published binary. It's signed the same way as the tarballs:
67
+
68
+ ```bash
69
+ cosign verify-blob \
70
+ --bundle sbom.cdx.json.bundle \
71
+ --certificate-identity-regexp "https://github.com/FerrLabs/FerrFlow/.*" \
72
+ --certificate-oidc-issuer https://token.actions.githubusercontent.com \
73
+ sbom.cdx.json
74
+ ```
75
+
76
+ Feed the verified SBOM into your scanner of choice — Grype, Trivy, Snyk, JFrog Xray, Anchore, anything CycloneDX-aware.
77
+
78
+ ## SLSA build provenance
79
+
80
+ In addition to Sigstore signatures, every release also ships a [SLSA build provenance attestation](https://slsa.dev/) generated via [`actions/attest-build-provenance`](https://github.com/actions/attest-build-provenance). It records the workflow run, the source commit SHA, and the build inputs.
81
+
82
+ ```bash
83
+ gh attestation verify ferrflow-linux-x64.tar.gz --repo FerrLabs/FerrFlow
84
+ ```
85
+
86
+ ## What's not signed
87
+
88
+ Source tarballs from `git archive` (the auto-generated "Source code (zip)" and "Source code (tar.gz)" assets on the GitHub Release page) come from GitHub, not from the release workflow, and have no signature sidecar. If you need an attestation for source, use `gh attestation verify` against the build provenance bundle instead.
89
+
90
+ ## Why this matters
91
+
92
+ - **Supply-chain attacks.** An attacker who compromises a CDN, a mirror, or pushes a typosquat package can't forge the signature — the signing identity is anchored to the GitHub Actions OIDC flow.
93
+ - **Compliance.** SOC 2 / ISO 27001 customers can attest that the binary they pulled is what their auditor approved.
94
+ - **No key management.** Nobody at FerrLabs has a private signing key to lose or rotate. The workflow proves its identity at the moment of signing.
95
+
96
+ <aside class="ferr-aside ferr-aside--tip"><div class="ferr-aside__body"><p>If you&#39;re shipping FerrFlow into a regulated environment, pin both the version <strong>and</strong> the <code>.sig</code>/<code>.crt</code> pair into your provisioning step. A future workflow compromise can&#39;t backdate a signature that already exists in Rekor.</p>
97
+ </div></aside>