@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.
- package/docs-en/ci/github-actions.md +120 -0
- package/docs-en/ci/gitlab-ci.md +90 -0
- package/docs-en/ci/hosted-bot.md +82 -0
- package/docs-en/ci/pipeline-triggers.md +287 -0
- package/docs-en/configuration/config-file.md +1259 -0
- package/docs-en/configuration/formats.md +220 -0
- package/docs-en/configuration/monorepo.md +390 -0
- package/docs-en/installation.md +56 -0
- package/docs-en/introduction.md +56 -0
- package/docs-en/quickstart.md +66 -0
- package/docs-en/reference/api.md +106 -0
- package/docs-en/reference/cli.md +483 -0
- package/docs-en/reference/conventional-commits.md +103 -0
- package/docs-en/reference/errors.md +508 -0
- package/docs-en/verifying-releases.md +97 -0
- package/docs-fr/ci/github-actions.md +109 -0
- package/docs-fr/ci/gitlab-ci.md +77 -0
- package/docs-fr/ci/hosted-bot.md +82 -0
- package/docs-fr/ci/pipeline-triggers.md +238 -0
- package/docs-fr/configuration/config-file.md +839 -0
- package/docs-fr/configuration/formats.md +163 -0
- package/docs-fr/configuration/monorepo.md +357 -0
- package/docs-fr/installation.md +56 -0
- package/docs-fr/introduction.md +54 -0
- package/docs-fr/quickstart.md +63 -0
- package/docs-fr/reference/api.md +106 -0
- package/docs-fr/reference/cli.md +407 -0
- package/docs-fr/reference/conventional-commits.md +103 -0
- package/docs-fr/reference/errors.md +378 -0
- package/docs-fr/verifying-releases.md +97 -0
- package/docs-fr-v4/ci/github-actions.md +106 -0
- package/docs-fr-v4/ci/gitlab-ci.md +77 -0
- package/docs-fr-v4/ci/pipeline-triggers.md +214 -0
- package/docs-fr-v4/configuration/config-file.md +769 -0
- package/docs-fr-v4/configuration/formats.md +128 -0
- package/docs-fr-v4/configuration/monorepo.md +324 -0
- package/docs-fr-v4/installation.md +48 -0
- package/docs-fr-v4/introduction.md +54 -0
- package/docs-fr-v4/legal/telemetry.md +65 -0
- package/docs-fr-v4/quickstart.md +63 -0
- package/docs-fr-v4/reference/cli.md +130 -0
- package/docs-fr-v4/reference/conventional-commits.md +67 -0
- package/docs-fr-v4/reference/errors.md +372 -0
- package/docs-fr-v5/ci/github-actions.md +109 -0
- package/docs-fr-v5/ci/gitlab-ci.md +77 -0
- package/docs-fr-v5/ci/hosted-bot.md +82 -0
- package/docs-fr-v5/ci/pipeline-triggers.md +238 -0
- package/docs-fr-v5/configuration/config-file.md +812 -0
- package/docs-fr-v5/configuration/formats.md +150 -0
- package/docs-fr-v5/configuration/monorepo.md +357 -0
- package/docs-fr-v5/installation.md +56 -0
- package/docs-fr-v5/introduction.md +54 -0
- package/docs-fr-v5/legal/telemetry.md +26 -0
- package/docs-fr-v5/quickstart.md +63 -0
- package/docs-fr-v5/reference/api.md +106 -0
- package/docs-fr-v5/reference/cli.md +356 -0
- package/docs-fr-v5/reference/conventional-commits.md +88 -0
- package/docs-fr-v5/reference/errors.md +378 -0
- package/docs-fr-v5/verifying-releases.md +97 -0
- package/docs-fr-v6/ci/github-actions.md +109 -0
- package/docs-fr-v6/ci/gitlab-ci.md +77 -0
- package/docs-fr-v6/ci/hosted-bot.md +82 -0
- package/docs-fr-v6/ci/pipeline-triggers.md +238 -0
- package/docs-fr-v6/configuration/config-file.md +813 -0
- package/docs-fr-v6/configuration/formats.md +150 -0
- package/docs-fr-v6/configuration/monorepo.md +357 -0
- package/docs-fr-v6/installation.md +56 -0
- package/docs-fr-v6/introduction.md +54 -0
- package/docs-fr-v6/quickstart.md +63 -0
- package/docs-fr-v6/reference/api.md +106 -0
- package/docs-fr-v6/reference/cli.md +356 -0
- package/docs-fr-v6/reference/conventional-commits.md +88 -0
- package/docs-fr-v6/reference/errors.md +378 -0
- package/docs-fr-v6/verifying-releases.md +97 -0
- package/docs-v0/ci/github-actions.md +77 -0
- package/docs-v0/ci/gitlab-ci.md +59 -0
- package/docs-v0/configuration/config-file.md +97 -0
- package/docs-v0/configuration/formats.md +86 -0
- package/docs-v0/configuration/monorepo.md +59 -0
- package/docs-v0/installation.md +48 -0
- package/docs-v0/introduction.md +34 -0
- package/docs-v0/legal/telemetry.md +63 -0
- package/docs-v0/quickstart.md +58 -0
- package/docs-v0/reference/cli.md +95 -0
- package/docs-v0/reference/conventional-commits.md +68 -0
- package/docs-v1/ci/github-actions.md +76 -0
- package/docs-v1/ci/gitlab-ci.md +58 -0
- package/docs-v1/configuration/config-file.md +515 -0
- package/docs-v1/configuration/formats.md +115 -0
- package/docs-v1/configuration/monorepo.md +246 -0
- package/docs-v1/installation.md +48 -0
- package/docs-v1/introduction.md +39 -0
- package/docs-v1/legal/telemetry.md +63 -0
- package/docs-v1/quickstart.md +62 -0
- package/docs-v1/reference/cli.md +128 -0
- package/docs-v1/reference/conventional-commits.md +67 -0
- package/docs-v2/ci/github-actions.md +117 -0
- package/docs-v2/ci/gitlab-ci.md +90 -0
- package/docs-v2/ci/pipeline-triggers.md +263 -0
- package/docs-v2/configuration/config-file.md +806 -0
- package/docs-v2/configuration/formats.md +98 -0
- package/docs-v2/configuration/monorepo.md +324 -0
- package/docs-v2/installation.md +48 -0
- package/docs-v2/introduction.md +40 -0
- package/docs-v2/legal/telemetry.md +66 -0
- package/docs-v2/quickstart.md +63 -0
- package/docs-v2/reference/cli.md +130 -0
- package/docs-v2/reference/conventional-commits.md +67 -0
- package/docs-v2/reference/errors.md +500 -0
- package/docs-v2/self-hosting.md +101 -0
- package/docs-v3/ci/github-actions.md +117 -0
- package/docs-v3/ci/gitlab-ci.md +90 -0
- package/docs-v3/ci/pipeline-triggers.md +263 -0
- package/docs-v3/configuration/config-file.md +806 -0
- package/docs-v3/configuration/formats.md +99 -0
- package/docs-v3/configuration/monorepo.md +324 -0
- package/docs-v3/installation.md +48 -0
- package/docs-v3/introduction.md +40 -0
- package/docs-v3/legal/telemetry.md +66 -0
- package/docs-v3/quickstart.md +66 -0
- package/docs-v3/reference/cli.md +161 -0
- package/docs-v3/reference/conventional-commits.md +67 -0
- package/docs-v3/reference/errors.md +502 -0
- package/docs-v3/self-hosting.md +137 -0
- package/docs-v4/ci/github-actions.md +117 -0
- package/docs-v4/ci/gitlab-ci.md +90 -0
- package/docs-v4/ci/pipeline-triggers.md +263 -0
- package/docs-v4/configuration/config-file.md +850 -0
- package/docs-v4/configuration/formats.md +182 -0
- package/docs-v4/configuration/monorepo.md +324 -0
- package/docs-v4/installation.md +48 -0
- package/docs-v4/introduction.md +56 -0
- package/docs-v4/legal/telemetry.md +65 -0
- package/docs-v4/quickstart.md +66 -0
- package/docs-v4/reference/cli.md +161 -0
- package/docs-v4/reference/conventional-commits.md +67 -0
- package/docs-v4/reference/errors.md +502 -0
- package/docs-v4/self-hosting.md +137 -0
- package/docs-v5/ci/github-actions.md +120 -0
- package/docs-v5/ci/gitlab-ci.md +90 -0
- package/docs-v5/ci/hosted-bot.md +82 -0
- package/docs-v5/ci/pipeline-triggers.md +287 -0
- package/docs-v5/configuration/config-file.md +1133 -0
- package/docs-v5/configuration/formats.md +206 -0
- package/docs-v5/configuration/monorepo.md +390 -0
- package/docs-v5/installation.md +56 -0
- package/docs-v5/introduction.md +56 -0
- package/docs-v5/legal/telemetry.md +26 -0
- package/docs-v5/quickstart.md +66 -0
- package/docs-v5/reference/api.md +106 -0
- package/docs-v5/reference/cli.md +431 -0
- package/docs-v5/reference/conventional-commits.md +88 -0
- package/docs-v5/reference/errors.md +508 -0
- package/docs-v5/verifying-releases.md +97 -0
- package/docs-v6/ci/github-actions.md +120 -0
- package/docs-v6/ci/gitlab-ci.md +90 -0
- package/docs-v6/ci/hosted-bot.md +82 -0
- package/docs-v6/ci/pipeline-triggers.md +287 -0
- package/docs-v6/configuration/config-file.md +1134 -0
- package/docs-v6/configuration/formats.md +206 -0
- package/docs-v6/configuration/monorepo.md +390 -0
- package/docs-v6/installation.md +56 -0
- package/docs-v6/introduction.md +56 -0
- package/docs-v6/quickstart.md +66 -0
- package/docs-v6/reference/api.md +106 -0
- package/docs-v6/reference/cli.md +431 -0
- package/docs-v6/reference/conventional-commits.md +88 -0
- package/docs-v6/reference/errors.md +508 -0
- package/docs-v6/verifying-releases.md +97 -0
- package/package.json +17 -0
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: GitLab CI
|
|
3
|
+
description: Run FerrFlow releases automatically in GitLab CI.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
## Using the Docker image
|
|
7
|
+
|
|
8
|
+
The official FerrFlow Docker image ships the binary and can be used directly as a GitLab CI job image.
|
|
9
|
+
|
|
10
|
+
```yaml
|
|
11
|
+
release:
|
|
12
|
+
image: ghcr.io/ferrlabs/ferrflow:latest
|
|
13
|
+
stage: release
|
|
14
|
+
script:
|
|
15
|
+
- ferrflow release
|
|
16
|
+
variables:
|
|
17
|
+
GITLAB_TOKEN: $CI_JOB_TOKEN
|
|
18
|
+
rules:
|
|
19
|
+
- if: $CI_COMMIT_BRANCH == "main"
|
|
20
|
+
when: on_success
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
<aside class="ferr-aside ferr-aside--warning"><div class="ferr-aside__body"><p>Make sure your CI runner clones with full history. Add <code>GIT_DEPTH: 0</code> to the job variables to disable shallow cloning.</p>
|
|
24
|
+
</div></aside>
|
|
25
|
+
|
|
26
|
+
## Full history
|
|
27
|
+
|
|
28
|
+
```yaml
|
|
29
|
+
release:
|
|
30
|
+
image: ghcr.io/ferrlabs/ferrflow:latest
|
|
31
|
+
variables:
|
|
32
|
+
GIT_DEPTH: 0 # full history — required for tag scanning
|
|
33
|
+
GITLAB_TOKEN: $CI_JOB_TOKEN
|
|
34
|
+
script:
|
|
35
|
+
- ferrflow release
|
|
36
|
+
rules:
|
|
37
|
+
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Using a deploy token
|
|
41
|
+
|
|
42
|
+
If `CI_JOB_TOKEN` doesn't have permission to push tags, create a project deploy token with `write_repository` access and store it as a CI variable:
|
|
43
|
+
|
|
44
|
+
```yaml
|
|
45
|
+
release:
|
|
46
|
+
image: ghcr.io/ferrlabs/ferrflow:latest
|
|
47
|
+
variables:
|
|
48
|
+
GIT_DEPTH: 0
|
|
49
|
+
GITLAB_TOKEN: $FERRFLOW_DEPLOY_TOKEN # CI variable with write_repository access
|
|
50
|
+
script:
|
|
51
|
+
- ferrflow release
|
|
52
|
+
rules:
|
|
53
|
+
- if: $CI_COMMIT_BRANCH == "main"
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## GitLab Releases
|
|
57
|
+
|
|
58
|
+
When `GITLAB_TOKEN` is set, FerrFlow creates a GitLab Release with the generated changelog as release notes, matching the behaviour of the GitHub integration.
|
|
@@ -0,0 +1,515 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Configuration
|
|
3
|
+
description: Complete reference for the FerrFlow configuration file.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
FerrFlow supports four config file formats, searched in this order:
|
|
7
|
+
|
|
8
|
+
1. `ferrflow.json`
|
|
9
|
+
2. `ferrflow.json5`
|
|
10
|
+
3. `ferrflow.toml`
|
|
11
|
+
4. `.ferrflow` (JSON)
|
|
12
|
+
|
|
13
|
+
If no config file is found, FerrFlow auto-detects common version files in the current directory.
|
|
14
|
+
|
|
15
|
+
<aside class="ferr-aside ferr-aside--tip"><div class="ferr-aside__body"><p>Add <code>"$schema": "https://ferrflow.com/schema/ferrflow.json"</code> to your JSON config for editor autocompletion and validation.</p>
|
|
16
|
+
</div></aside>
|
|
17
|
+
|
|
18
|
+
## Config formats
|
|
19
|
+
|
|
20
|
+
<div class="ferr-tabs">
|
|
21
|
+
<div class="ferr-tab" data-label="JSON"><p class="ferr-tab__label">JSON</p><div class="ferr-tab__body"><pre><code class="language-json">{
|
|
22
|
+
"$schema": "https://ferrflow.com/schema/ferrflow.json",
|
|
23
|
+
"workspace": {
|
|
24
|
+
"tagTemplate": "v{version}"
|
|
25
|
+
},
|
|
26
|
+
"package": [
|
|
27
|
+
{
|
|
28
|
+
"name": "my-app",
|
|
29
|
+
"path": ".",
|
|
30
|
+
"changelog": "CHANGELOG.md",
|
|
31
|
+
"versionedFiles": [
|
|
32
|
+
{ "path": "Cargo.toml", "format": "toml" }
|
|
33
|
+
]
|
|
34
|
+
}
|
|
35
|
+
]
|
|
36
|
+
}
|
|
37
|
+
</code></pre>
|
|
38
|
+
</div></div>
|
|
39
|
+
<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]
|
|
40
|
+
tag_template = "v{version}"
|
|
41
|
+
|
|
42
|
+
[[package]]
|
|
43
|
+
name = "my-app"
|
|
44
|
+
path = "."
|
|
45
|
+
changelog = "CHANGELOG.md"
|
|
46
|
+
|
|
47
|
+
[[package.versioned_files]]
|
|
48
|
+
path = "Cargo.toml"
|
|
49
|
+
format = "toml"
|
|
50
|
+
</code></pre>
|
|
51
|
+
</div></div>
|
|
52
|
+
<div class="ferr-tab" data-label="JSON5"><p class="ferr-tab__label">JSON5</p><div class="ferr-tab__body"><pre><code class="language-json5">{
|
|
53
|
+
$schema: "https://ferrflow.com/schema/ferrflow.json",
|
|
54
|
+
workspace: {
|
|
55
|
+
tagTemplate: "v{version}",
|
|
56
|
+
},
|
|
57
|
+
package: [
|
|
58
|
+
{
|
|
59
|
+
name: "my-app",
|
|
60
|
+
path: ".",
|
|
61
|
+
changelog: "CHANGELOG.md",
|
|
62
|
+
versionedFiles: [
|
|
63
|
+
{ path: "Cargo.toml", format: "toml" },
|
|
64
|
+
],
|
|
65
|
+
},
|
|
66
|
+
],
|
|
67
|
+
}
|
|
68
|
+
</code></pre>
|
|
69
|
+
</div></div>
|
|
70
|
+
<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:
|
|
71
|
+
tagTemplate: "v{version}"
|
|
72
|
+
|
|
73
|
+
package:
|
|
74
|
+
|
|
75
|
+
- name: my-app
|
|
76
|
+
path: "."
|
|
77
|
+
changelog: CHANGELOG.md
|
|
78
|
+
versionedFiles:
|
|
79
|
+
- path: Cargo.toml
|
|
80
|
+
format: toml
|
|
81
|
+
</code></pre>
|
|
82
|
+
|
|
83
|
+
</div></div>
|
|
84
|
+
</div>
|
|
85
|
+
|
|
86
|
+
<aside class="ferr-aside ferr-aside--note"><div class="ferr-aside__body"><p>JSON and JSON5 configs use <strong>camelCase</strong> keys (<code>tagTemplate</code>, <code>versionedFiles</code>).
|
|
87
|
+
TOML configs use <strong>snake_case</strong> keys (<code>tag_template</code>, <code>versioned_files</code>).
|
|
88
|
+
YAML configs support both, but <strong>camelCase</strong> is recommended for consistency with JSON.
|
|
89
|
+
All forms are equivalent.</p>
|
|
90
|
+
</div></aside>
|
|
91
|
+
|
|
92
|
+
## `workspace`
|
|
93
|
+
|
|
94
|
+
Global settings that apply to all packages.
|
|
95
|
+
|
|
96
|
+
| Field | Type | Default | Description |
|
|
97
|
+
| ----------------------- | ------- | --------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
98
|
+
| `remote` | string | `"origin"` | Git remote to push to |
|
|
99
|
+
| `branch` | string | auto-detected | Branch to push to (detected from remote HEAD) |
|
|
100
|
+
| `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. |
|
|
101
|
+
| `versioning` | string | `"semver"` | Default versioning strategy for all packages |
|
|
102
|
+
| `releaseCommitMode` | string | `"commit"` | How to handle the release commit: `"commit"`, `"pr"`, or `"none"` |
|
|
103
|
+
| `skipCi` | boolean | depends on mode | Add `[skip ci]` to release commits. Defaults to `true` when mode is `"commit"`, `false` otherwise. |
|
|
104
|
+
| `autoMergeReleases` | boolean | `true` | Enable auto-merge on release PRs (only applies when mode is `"pr"`) |
|
|
105
|
+
| `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 |
|
|
106
|
+
| `telemetry` | boolean | `true` | Send anonymous usage telemetry |
|
|
107
|
+
|
|
108
|
+
### Tag template
|
|
109
|
+
|
|
110
|
+
The `tagTemplate` field controls how git tags are named. Available placeholders:
|
|
111
|
+
|
|
112
|
+
| Placeholder | Description |
|
|
113
|
+
| ----------- | --------------------------------- |
|
|
114
|
+
| `{version}` | The version number (e.g. `1.2.3`) |
|
|
115
|
+
| `{name}` | The package name |
|
|
116
|
+
|
|
117
|
+
<div class="ferr-tabs">
|
|
118
|
+
<div class="ferr-tab" data-label="JSON"><p class="ferr-tab__label">JSON</p><div class="ferr-tab__body"><pre><code class="language-json">{
|
|
119
|
+
"workspace": {
|
|
120
|
+
"tagTemplate": "v{version}"
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
</code></pre>
|
|
124
|
+
</div></div>
|
|
125
|
+
<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]
|
|
126
|
+
tag_template = "v{version}"
|
|
127
|
+
</code></pre>
|
|
128
|
+
</div></div>
|
|
129
|
+
<div class="ferr-tab" data-label="JSON5"><p class="ferr-tab__label">JSON5</p><div class="ferr-tab__body"><pre><code class="language-json5">{
|
|
130
|
+
workspace: {
|
|
131
|
+
tagTemplate: "v{version}",
|
|
132
|
+
},
|
|
133
|
+
}
|
|
134
|
+
</code></pre>
|
|
135
|
+
</div></div>
|
|
136
|
+
<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:
|
|
137
|
+
tagTemplate: "v{version}"
|
|
138
|
+
</code></pre>
|
|
139
|
+
</div></div>
|
|
140
|
+
</div>
|
|
141
|
+
|
|
142
|
+
For monorepos, use `{name}` to namespace tags per package:
|
|
143
|
+
|
|
144
|
+
<div class="ferr-tabs">
|
|
145
|
+
<div class="ferr-tab" data-label="JSON"><p class="ferr-tab__label">JSON</p><div class="ferr-tab__body"><pre><code class="language-json">{
|
|
146
|
+
"workspace": {
|
|
147
|
+
"tagTemplate": "{name}@v{version}"
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
</code></pre>
|
|
151
|
+
</div></div>
|
|
152
|
+
<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]
|
|
153
|
+
tag_template = "{name}@v{version}"
|
|
154
|
+
</code></pre>
|
|
155
|
+
</div></div>
|
|
156
|
+
<div class="ferr-tab" data-label="JSON5"><p class="ferr-tab__label">JSON5</p><div class="ferr-tab__body"><pre><code class="language-json5">{
|
|
157
|
+
workspace: {
|
|
158
|
+
tagTemplate: "{name}@v{version}",
|
|
159
|
+
},
|
|
160
|
+
}
|
|
161
|
+
</code></pre>
|
|
162
|
+
</div></div>
|
|
163
|
+
<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:
|
|
164
|
+
tagTemplate: "{name}@v{version}"
|
|
165
|
+
</code></pre>
|
|
166
|
+
</div></div>
|
|
167
|
+
</div>
|
|
168
|
+
|
|
169
|
+
### Release commit mode
|
|
170
|
+
|
|
171
|
+
Controls how FerrFlow handles the commit that updates version files and changelogs.
|
|
172
|
+
|
|
173
|
+
| Mode | Behavior |
|
|
174
|
+
| ---------- | ------------------------------------------------------------ |
|
|
175
|
+
| `"commit"` | Commits directly to the current branch and pushes (default) |
|
|
176
|
+
| `"pr"` | Creates a `release/` branch and opens a pull request |
|
|
177
|
+
| `"none"` | Only creates tags and releases, does not commit file changes |
|
|
178
|
+
|
|
179
|
+
<div class="ferr-tabs">
|
|
180
|
+
<div class="ferr-tab" data-label="JSON"><p class="ferr-tab__label">JSON</p><div class="ferr-tab__body"><pre><code class="language-json">{
|
|
181
|
+
"workspace": {
|
|
182
|
+
"releaseCommitMode": "pr",
|
|
183
|
+
"autoMergeReleases": true
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
</code></pre>
|
|
187
|
+
</div></div>
|
|
188
|
+
<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]
|
|
189
|
+
release_commit_mode = "pr"
|
|
190
|
+
auto_merge_releases = true
|
|
191
|
+
</code></pre>
|
|
192
|
+
</div></div>
|
|
193
|
+
<div class="ferr-tab" data-label="JSON5"><p class="ferr-tab__label">JSON5</p><div class="ferr-tab__body"><pre><code class="language-json5">{
|
|
194
|
+
workspace: {
|
|
195
|
+
releaseCommitMode: "pr",
|
|
196
|
+
autoMergeReleases: true,
|
|
197
|
+
},
|
|
198
|
+
}
|
|
199
|
+
</code></pre>
|
|
200
|
+
</div></div>
|
|
201
|
+
<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:
|
|
202
|
+
releaseCommitMode: pr
|
|
203
|
+
autoMergeReleases: true
|
|
204
|
+
</code></pre>
|
|
205
|
+
</div></div>
|
|
206
|
+
</div>
|
|
207
|
+
|
|
208
|
+
### Versioning strategies
|
|
209
|
+
|
|
210
|
+
FerrFlow supports multiple versioning strategies, configurable at workspace or package level.
|
|
211
|
+
|
|
212
|
+
| Strategy | Format | Example progression |
|
|
213
|
+
| -------------- | ------------------- | --------------------------------------- |
|
|
214
|
+
| `semver` | `MAJOR.MINOR.PATCH` | `1.2.3` → `1.3.0` → `2.0.0` |
|
|
215
|
+
| `calver` | `YYYY.MM.PATCH` | `2026.03.0` → `2026.03.1` → `2026.04.0` |
|
|
216
|
+
| `calver-short` | `YY.MM.PATCH` | `26.03.0` → `26.03.1` |
|
|
217
|
+
| `calver-seq` | `YYYY.MM.SEQ` | `2026.03.1` → `2026.03.2` |
|
|
218
|
+
| `sequential` | `N` | `1` → `2` → `3` |
|
|
219
|
+
| `zerover` | `0.MINOR.PATCH` | `0.1.0` → `0.2.0` (never reaches 1.0) |
|
|
220
|
+
|
|
221
|
+
<div class="ferr-tabs">
|
|
222
|
+
<div class="ferr-tab" data-label="JSON"><p class="ferr-tab__label">JSON</p><div class="ferr-tab__body"><pre><code class="language-json">{
|
|
223
|
+
"workspace": {
|
|
224
|
+
"versioning": "calver"
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
</code></pre>
|
|
228
|
+
</div></div>
|
|
229
|
+
<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]
|
|
230
|
+
versioning = "calver"
|
|
231
|
+
</code></pre>
|
|
232
|
+
</div></div>
|
|
233
|
+
<div class="ferr-tab" data-label="JSON5"><p class="ferr-tab__label">JSON5</p><div class="ferr-tab__body"><pre><code class="language-json5">{
|
|
234
|
+
workspace: {
|
|
235
|
+
versioning: "calver",
|
|
236
|
+
},
|
|
237
|
+
}
|
|
238
|
+
</code></pre>
|
|
239
|
+
</div></div>
|
|
240
|
+
<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:
|
|
241
|
+
versioning: calver
|
|
242
|
+
</code></pre>
|
|
243
|
+
</div></div>
|
|
244
|
+
</div>
|
|
245
|
+
|
|
246
|
+
## `package`
|
|
247
|
+
|
|
248
|
+
Defines a package to version. You can have one or many.
|
|
249
|
+
|
|
250
|
+
| Field | Required | Default | Description |
|
|
251
|
+
| ------------- | -------- | ------------------------ | --------------------------------------------- |
|
|
252
|
+
| `name` | yes | — | Package identifier, used in git tag prefix |
|
|
253
|
+
| `path` | yes | — | Relative path to the package directory |
|
|
254
|
+
| `changelog` | no | `{path}/CHANGELOG.md` | Path to the changelog file |
|
|
255
|
+
| `sharedPaths` | no | `[]` | Paths that trigger this package when changed |
|
|
256
|
+
| `versioning` | no | inherited from workspace | Override versioning strategy for this package |
|
|
257
|
+
| `tagTemplate` | no | inherited from workspace | Override tag template for this package |
|
|
258
|
+
|
|
259
|
+
### `versionedFiles`
|
|
260
|
+
|
|
261
|
+
Files where the version number should be updated.
|
|
262
|
+
|
|
263
|
+
<div class="ferr-tabs">
|
|
264
|
+
<div class="ferr-tab" data-label="JSON"><p class="ferr-tab__label">JSON</p><div class="ferr-tab__body"><pre><code class="language-json">{
|
|
265
|
+
"package": [
|
|
266
|
+
{
|
|
267
|
+
"name": "my-app",
|
|
268
|
+
"path": ".",
|
|
269
|
+
"versionedFiles": [
|
|
270
|
+
{ "path": "Cargo.toml", "format": "toml" },
|
|
271
|
+
{ "path": "npm/package.json", "format": "json" }
|
|
272
|
+
]
|
|
273
|
+
}
|
|
274
|
+
]
|
|
275
|
+
}
|
|
276
|
+
</code></pre>
|
|
277
|
+
</div></div>
|
|
278
|
+
<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]]
|
|
279
|
+
name = "my-app"
|
|
280
|
+
path = "."
|
|
281
|
+
|
|
282
|
+
[[package.versioned_files]]
|
|
283
|
+
path = "Cargo.toml"
|
|
284
|
+
format = "toml"
|
|
285
|
+
|
|
286
|
+
[[package.versioned_files]]
|
|
287
|
+
path = "npm/package.json"
|
|
288
|
+
format = "json"
|
|
289
|
+
</code></pre>
|
|
290
|
+
</div></div>
|
|
291
|
+
<div class="ferr-tab" data-label="JSON5"><p class="ferr-tab__label">JSON5</p><div class="ferr-tab__body"><pre><code class="language-json5">{
|
|
292
|
+
package: [
|
|
293
|
+
{
|
|
294
|
+
name: "my-app",
|
|
295
|
+
path: ".",
|
|
296
|
+
versionedFiles: [
|
|
297
|
+
{ path: "Cargo.toml", format: "toml" },
|
|
298
|
+
{ path: "npm/package.json", format: "json" },
|
|
299
|
+
],
|
|
300
|
+
},
|
|
301
|
+
],
|
|
302
|
+
}
|
|
303
|
+
</code></pre>
|
|
304
|
+
</div></div>
|
|
305
|
+
<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:
|
|
306
|
+
- name: my-app
|
|
307
|
+
path: "."
|
|
308
|
+
versionedFiles:
|
|
309
|
+
- path: Cargo.toml
|
|
310
|
+
format: toml
|
|
311
|
+
- path: npm/package.json
|
|
312
|
+
format: json
|
|
313
|
+
</code></pre>
|
|
314
|
+
</div></div>
|
|
315
|
+
</div>
|
|
316
|
+
|
|
317
|
+
| `format` | File | Field updated |
|
|
318
|
+
| -------- | ---------------------------------- | ------------------------------------------------- |
|
|
319
|
+
| `toml` | `Cargo.toml`, `pyproject.toml` | `[package].version` or `[project].version` |
|
|
320
|
+
| `json` | `package.json` | `version` |
|
|
321
|
+
| `xml` | `pom.xml` | First `<version>` element |
|
|
322
|
+
| `gradle` | `build.gradle`, `build.gradle.kts` | `version = "..."` |
|
|
323
|
+
| `gomod` | `go.mod` | No file update — version comes from git tags only |
|
|
324
|
+
| `txt` | `VERSION`, `VERSION.txt` | Entire file content replaced |
|
|
325
|
+
|
|
326
|
+
## Complete examples
|
|
327
|
+
|
|
328
|
+
### Single repo
|
|
329
|
+
|
|
330
|
+
<div class="ferr-tabs">
|
|
331
|
+
<div class="ferr-tab" data-label="JSON"><p class="ferr-tab__label">JSON</p><div class="ferr-tab__body"><pre><code class="language-json">{
|
|
332
|
+
"$schema": "https://ferrflow.com/schema/ferrflow.json",
|
|
333
|
+
"workspace": {
|
|
334
|
+
"tagTemplate": "v{version}"
|
|
335
|
+
},
|
|
336
|
+
"package": [
|
|
337
|
+
{
|
|
338
|
+
"name": "ferrflow",
|
|
339
|
+
"path": ".",
|
|
340
|
+
"changelog": "CHANGELOG.md",
|
|
341
|
+
"versionedFiles": [
|
|
342
|
+
{ "path": "Cargo.toml", "format": "toml" },
|
|
343
|
+
{ "path": "npm/package.json", "format": "json" }
|
|
344
|
+
]
|
|
345
|
+
}
|
|
346
|
+
]
|
|
347
|
+
}
|
|
348
|
+
</code></pre>
|
|
349
|
+
</div></div>
|
|
350
|
+
<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]
|
|
351
|
+
tag_template = "v{version}"
|
|
352
|
+
|
|
353
|
+
[[package]]
|
|
354
|
+
name = "ferrflow"
|
|
355
|
+
path = "."
|
|
356
|
+
changelog = "CHANGELOG.md"
|
|
357
|
+
|
|
358
|
+
[[package.versioned_files]]
|
|
359
|
+
path = "Cargo.toml"
|
|
360
|
+
format = "toml"
|
|
361
|
+
|
|
362
|
+
[[package.versioned_files]]
|
|
363
|
+
path = "npm/package.json"
|
|
364
|
+
format = "json"
|
|
365
|
+
</code></pre>
|
|
366
|
+
</div></div>
|
|
367
|
+
<div class="ferr-tab" data-label="JSON5"><p class="ferr-tab__label">JSON5</p><div class="ferr-tab__body"><pre><code class="language-json5">{
|
|
368
|
+
$schema: "https://ferrflow.com/schema/ferrflow.json",
|
|
369
|
+
workspace: {
|
|
370
|
+
tagTemplate: "v{version}",
|
|
371
|
+
},
|
|
372
|
+
package: [
|
|
373
|
+
{
|
|
374
|
+
name: "ferrflow",
|
|
375
|
+
path: ".",
|
|
376
|
+
changelog: "CHANGELOG.md",
|
|
377
|
+
versionedFiles: [
|
|
378
|
+
{ path: "Cargo.toml", format: "toml" },
|
|
379
|
+
{ path: "npm/package.json", format: "json" },
|
|
380
|
+
],
|
|
381
|
+
},
|
|
382
|
+
],
|
|
383
|
+
}
|
|
384
|
+
</code></pre>
|
|
385
|
+
</div></div>
|
|
386
|
+
<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:
|
|
387
|
+
tagTemplate: "v{version}"
|
|
388
|
+
|
|
389
|
+
package:
|
|
390
|
+
|
|
391
|
+
- name: ferrflow
|
|
392
|
+
path: "."
|
|
393
|
+
changelog: CHANGELOG.md
|
|
394
|
+
versionedFiles:
|
|
395
|
+
- path: Cargo.toml
|
|
396
|
+
format: toml
|
|
397
|
+
- path: npm/package.json
|
|
398
|
+
format: json
|
|
399
|
+
</code></pre>
|
|
400
|
+
|
|
401
|
+
</div></div>
|
|
402
|
+
</div>
|
|
403
|
+
|
|
404
|
+
### Monorepo
|
|
405
|
+
|
|
406
|
+
<div class="ferr-tabs">
|
|
407
|
+
<div class="ferr-tab" data-label="JSON"><p class="ferr-tab__label">JSON</p><div class="ferr-tab__body"><pre><code class="language-json">{
|
|
408
|
+
"$schema": "https://ferrflow.com/schema/ferrflow.json",
|
|
409
|
+
"workspace": {
|
|
410
|
+
"tagTemplate": "{name}@v{version}"
|
|
411
|
+
},
|
|
412
|
+
"package": [
|
|
413
|
+
{
|
|
414
|
+
"name": "api",
|
|
415
|
+
"path": "packages/api",
|
|
416
|
+
"changelog": "packages/api/CHANGELOG.md",
|
|
417
|
+
"sharedPaths": ["packages/shared/"],
|
|
418
|
+
"versionedFiles": [
|
|
419
|
+
{ "path": "packages/api/Cargo.toml", "format": "toml" }
|
|
420
|
+
]
|
|
421
|
+
},
|
|
422
|
+
{
|
|
423
|
+
"name": "site",
|
|
424
|
+
"path": "packages/site",
|
|
425
|
+
"changelog": "packages/site/CHANGELOG.md",
|
|
426
|
+
"sharedPaths": ["packages/shared/"],
|
|
427
|
+
"versionedFiles": [
|
|
428
|
+
{ "path": "packages/site/package.json", "format": "json" }
|
|
429
|
+
]
|
|
430
|
+
}
|
|
431
|
+
]
|
|
432
|
+
}
|
|
433
|
+
</code></pre>
|
|
434
|
+
</div></div>
|
|
435
|
+
<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]
|
|
436
|
+
tag_template = "{name}@v{version}"
|
|
437
|
+
|
|
438
|
+
[[package]]
|
|
439
|
+
name = "api"
|
|
440
|
+
path = "packages/api"
|
|
441
|
+
changelog = "packages/api/CHANGELOG.md"
|
|
442
|
+
shared_paths = ["packages/shared/"]
|
|
443
|
+
|
|
444
|
+
[[package.versioned_files]]
|
|
445
|
+
path = "packages/api/Cargo.toml"
|
|
446
|
+
format = "toml"
|
|
447
|
+
|
|
448
|
+
[[package]]
|
|
449
|
+
name = "site"
|
|
450
|
+
path = "packages/site"
|
|
451
|
+
changelog = "packages/site/CHANGELOG.md"
|
|
452
|
+
shared_paths = ["packages/shared/"]
|
|
453
|
+
|
|
454
|
+
[[package.versioned_files]]
|
|
455
|
+
path = "packages/site/package.json"
|
|
456
|
+
format = "json"
|
|
457
|
+
</code></pre>
|
|
458
|
+
</div></div>
|
|
459
|
+
<div class="ferr-tab" data-label="JSON5"><p class="ferr-tab__label">JSON5</p><div class="ferr-tab__body"><pre><code class="language-json5">{
|
|
460
|
+
$schema: "https://ferrflow.com/schema/ferrflow.json",
|
|
461
|
+
workspace: {
|
|
462
|
+
tagTemplate: "{name}@v{version}",
|
|
463
|
+
},
|
|
464
|
+
package: [
|
|
465
|
+
{
|
|
466
|
+
name: "api",
|
|
467
|
+
path: "packages/api",
|
|
468
|
+
changelog: "packages/api/CHANGELOG.md",
|
|
469
|
+
sharedPaths: ["packages/shared/"],
|
|
470
|
+
versionedFiles: [
|
|
471
|
+
{ path: "packages/api/Cargo.toml", format: "toml" },
|
|
472
|
+
],
|
|
473
|
+
},
|
|
474
|
+
{
|
|
475
|
+
name: "site",
|
|
476
|
+
path: "packages/site",
|
|
477
|
+
changelog: "packages/site/CHANGELOG.md",
|
|
478
|
+
sharedPaths: ["packages/shared/"],
|
|
479
|
+
versionedFiles: [
|
|
480
|
+
{ path: "packages/site/package.json", format: "json" },
|
|
481
|
+
],
|
|
482
|
+
},
|
|
483
|
+
],
|
|
484
|
+
}
|
|
485
|
+
</code></pre>
|
|
486
|
+
</div></div>
|
|
487
|
+
<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:
|
|
488
|
+
tagTemplate: "{name}@v{version}"
|
|
489
|
+
|
|
490
|
+
package:
|
|
491
|
+
|
|
492
|
+
- name: api
|
|
493
|
+
path: packages/api
|
|
494
|
+
changelog: packages/api/CHANGELOG.md
|
|
495
|
+
sharedPaths:
|
|
496
|
+
- packages/shared/
|
|
497
|
+
versionedFiles:
|
|
498
|
+
- path: packages/api/Cargo.toml
|
|
499
|
+
format: toml
|
|
500
|
+
|
|
501
|
+
- name: site
|
|
502
|
+
path: packages/site
|
|
503
|
+
changelog: packages/site/CHANGELOG.md
|
|
504
|
+
sharedPaths:
|
|
505
|
+
- packages/shared/
|
|
506
|
+
versionedFiles:
|
|
507
|
+
- path: packages/site/package.json
|
|
508
|
+
format: json
|
|
509
|
+
</code></pre>
|
|
510
|
+
|
|
511
|
+
</div></div>
|
|
512
|
+
</div>
|
|
513
|
+
|
|
514
|
+
<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>
|
|
515
|
+
</div></aside>
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Supported formats
|
|
3
|
+
description: Version file formats that FerrFlow can read and update.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
## TOML
|
|
7
|
+
|
|
8
|
+
Used by Rust (`Cargo.toml`) and Python (`pyproject.toml`).
|
|
9
|
+
|
|
10
|
+
FerrFlow updates the `version` field under `[package]`, `[project]`, or `[tool.poetry]`.
|
|
11
|
+
|
|
12
|
+
```toml
|
|
13
|
+
[package]
|
|
14
|
+
name = "my-crate"
|
|
15
|
+
version = "1.2.3" # ← updated
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## JSON
|
|
19
|
+
|
|
20
|
+
Used by Node.js (`package.json`).
|
|
21
|
+
|
|
22
|
+
FerrFlow updates the top-level `version` field.
|
|
23
|
+
|
|
24
|
+
```json
|
|
25
|
+
{
|
|
26
|
+
"name": "my-package",
|
|
27
|
+
"version": "1.2.3"
|
|
28
|
+
}
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## XML
|
|
32
|
+
|
|
33
|
+
Used by Java/Maven (`pom.xml`).
|
|
34
|
+
|
|
35
|
+
FerrFlow updates the first `<version>` element it encounters.
|
|
36
|
+
|
|
37
|
+
```xml
|
|
38
|
+
<project>
|
|
39
|
+
<groupId>com.example</groupId>
|
|
40
|
+
<artifactId>my-app</artifactId>
|
|
41
|
+
<version>1.2.3</version> <!-- updated -->
|
|
42
|
+
</project>
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## Gradle
|
|
46
|
+
|
|
47
|
+
Used by Java/Kotlin Gradle projects (`build.gradle`, `build.gradle.kts`).
|
|
48
|
+
|
|
49
|
+
FerrFlow updates the `version = "..."` assignment.
|
|
50
|
+
|
|
51
|
+
```groovy
|
|
52
|
+
version = "1.2.3" // updated
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## Plain text
|
|
56
|
+
|
|
57
|
+
Used for simple version files (`VERSION`, `VERSION.txt`).
|
|
58
|
+
|
|
59
|
+
FerrFlow replaces the entire file content with the version number.
|
|
60
|
+
|
|
61
|
+
```
|
|
62
|
+
1.2.3
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## Go modules
|
|
66
|
+
|
|
67
|
+
Used by Go projects (`go.mod`).
|
|
68
|
+
|
|
69
|
+
Go modules use git tags directly — FerrFlow does **not** modify `go.mod`. The version is derived entirely from the git tag (`v1.2.3` or `{name}@v1.2.3`).
|
|
70
|
+
|
|
71
|
+
## Multiple files per package
|
|
72
|
+
|
|
73
|
+
A package can have as many versioned file entries as needed:
|
|
74
|
+
|
|
75
|
+
<div class="ferr-tabs">
|
|
76
|
+
<div class="ferr-tab" data-label="JSON"><p class="ferr-tab__label">JSON</p><div class="ferr-tab__body"><pre><code class="language-json">{
|
|
77
|
+
"package": {
|
|
78
|
+
"versionedFiles": [
|
|
79
|
+
{ "path": "Cargo.toml", "format": "toml" },
|
|
80
|
+
{ "path": "npm/package.json", "format": "json" }
|
|
81
|
+
]
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
</code></pre>
|
|
85
|
+
</div></div>
|
|
86
|
+
<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]]
|
|
87
|
+
path = "Cargo.toml"
|
|
88
|
+
format = "toml"
|
|
89
|
+
|
|
90
|
+
[[package.versioned_files]]
|
|
91
|
+
path = "npm/package.json"
|
|
92
|
+
format = "json"
|
|
93
|
+
</code></pre>
|
|
94
|
+
</div></div>
|
|
95
|
+
<div class="ferr-tab" data-label="JSON5"><p class="ferr-tab__label">JSON5</p><div class="ferr-tab__body"><pre><code class="language-json5">{
|
|
96
|
+
package: {
|
|
97
|
+
versionedFiles: [
|
|
98
|
+
{ path: "Cargo.toml", format: "toml" },
|
|
99
|
+
{ path: "npm/package.json", format: "json" },
|
|
100
|
+
],
|
|
101
|
+
},
|
|
102
|
+
}
|
|
103
|
+
</code></pre>
|
|
104
|
+
</div></div>
|
|
105
|
+
<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:
|
|
106
|
+
versionedFiles:
|
|
107
|
+
- path: Cargo.toml
|
|
108
|
+
format: toml
|
|
109
|
+
- path: npm/package.json
|
|
110
|
+
format: json
|
|
111
|
+
</code></pre>
|
|
112
|
+
</div></div>
|
|
113
|
+
</div>
|
|
114
|
+
|
|
115
|
+
Both files will be updated to the same version before the git commit.
|