@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,99 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Supported formats
|
|
3
|
+
description: Version file formats that FerrFlow can read and update.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
<div class="ferr-tabs">
|
|
7
|
+
<div class="ferr-tab" data-label="JSON"><p class="ferr-tab__label">JSON</p><div class="ferr-tab__body"><p>Used by Node.js (<code>package.json</code>).</p>
|
|
8
|
+
<p>FerrFlow updates the top-level <code>version</code> field.</p>
|
|
9
|
+
<pre><code class="language-json">{
|
|
10
|
+
"name": "my-package",
|
|
11
|
+
"version": "1.2.3"
|
|
12
|
+
}
|
|
13
|
+
</code></pre>
|
|
14
|
+
</div></div>
|
|
15
|
+
<div class="ferr-tab" data-label="TOML"><p class="ferr-tab__label">TOML</p><div class="ferr-tab__body"><p>Used by Rust (<code>Cargo.toml</code>) and Python (<code>pyproject.toml</code>).</p>
|
|
16
|
+
<p>FerrFlow updates the <code>version</code> field under <code>[package]</code>, <code>[project]</code>, or <code>[tool.poetry]</code>.</p>
|
|
17
|
+
<pre><code class="language-toml">[package]
|
|
18
|
+
name = "my-crate"
|
|
19
|
+
version = "1.2.3" # ← updated
|
|
20
|
+
</code></pre>
|
|
21
|
+
</div></div>
|
|
22
|
+
<div class="ferr-tab" data-label="XML"><p class="ferr-tab__label">XML</p><div class="ferr-tab__body"><p>Used by Java/Maven (<code>pom.xml</code>).</p>
|
|
23
|
+
<p>FerrFlow updates the first <code><version></code> element it encounters.</p>
|
|
24
|
+
<pre><code class="language-xml"><project>
|
|
25
|
+
<groupId>com.example</groupId>
|
|
26
|
+
<artifactId>my-app</artifactId>
|
|
27
|
+
<version>1.2.3</version> <!-- updated -->
|
|
28
|
+
</project>
|
|
29
|
+
</code></pre>
|
|
30
|
+
</div></div>
|
|
31
|
+
<div class="ferr-tab" data-label="Gradle"><p class="ferr-tab__label">Gradle</p><div class="ferr-tab__body"><p>Used by Java/Kotlin Gradle projects (<code>build.gradle</code>, <code>build.gradle.kts</code>).</p>
|
|
32
|
+
<p>FerrFlow updates the <code>version = "..."</code> assignment.</p>
|
|
33
|
+
<pre><code class="language-groovy">version = "1.2.3" // updated
|
|
34
|
+
</code></pre>
|
|
35
|
+
</div></div>
|
|
36
|
+
<div class="ferr-tab" data-label="Plain text"><p class="ferr-tab__label">Plain text</p><div class="ferr-tab__body"><p>Used for simple version files (<code>VERSION</code>, <code>VERSION.txt</code>).</p>
|
|
37
|
+
<p>FerrFlow replaces the entire file content with the version number.</p>
|
|
38
|
+
<pre><code>1.2.3
|
|
39
|
+
</code></pre>
|
|
40
|
+
</div></div>
|
|
41
|
+
<div class="ferr-tab" data-label="Go"><p class="ferr-tab__label">Go</p><div class="ferr-tab__body"><p>Used by Go projects (<code>go.mod</code>).</p>
|
|
42
|
+
<p>Go modules use git tags directly — FerrFlow does <strong>not</strong> modify <code>go.mod</code>. The version is derived entirely from the git tag (<code>v1.2.3</code> or <code>{name}@v1.2.3</code>).</p>
|
|
43
|
+
<p>On a brand-new repo with no matching tag yet, FerrFlow v3+ bootstraps from the strategy's zero value (<code>0.0.0</code> for <code>semver</code>, <code>0</code> for <code>sequential</code>, …) and creates the first real tag itself — you do not need to run <code>git tag … v0.0.0</code> before the first release. See <a href="/docs/reference/cli#which-version-is-bumped-from">how <code>release</code> picks the baseline</a>.</p>
|
|
44
|
+
</div></div>
|
|
45
|
+
<div class="ferr-tab" data-label="Helm"><p class="ferr-tab__label">Helm</p><div class="ferr-tab__body"><p>Used by Kubernetes Helm charts (<code>Chart.yaml</code>).</p>
|
|
46
|
+
<p>FerrFlow updates the <code>version</code> field and, when present, keeps <code>appVersion</code> in sync.</p>
|
|
47
|
+
<pre><code class="language-yaml">apiVersion: v2
|
|
48
|
+
name: my-app
|
|
49
|
+
version: 1.2.3 # ← updated
|
|
50
|
+
appVersion: "1.2.3" # ← updated when present
|
|
51
|
+
</code></pre>
|
|
52
|
+
</div></div>
|
|
53
|
+
</div>
|
|
54
|
+
|
|
55
|
+
## Multiple files per package
|
|
56
|
+
|
|
57
|
+
A package can have as many versioned file entries as needed:
|
|
58
|
+
|
|
59
|
+
<div class="ferr-tabs">
|
|
60
|
+
<div class="ferr-tab" data-label="JSON"><p class="ferr-tab__label">JSON</p><div class="ferr-tab__body"><pre><code class="language-json">{
|
|
61
|
+
"package": {
|
|
62
|
+
"versionedFiles": [
|
|
63
|
+
{ "path": "Cargo.toml", "format": "toml" },
|
|
64
|
+
{ "path": "npm/package.json", "format": "json" }
|
|
65
|
+
]
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
</code></pre>
|
|
69
|
+
</div></div>
|
|
70
|
+
<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]]
|
|
71
|
+
path = "Cargo.toml"
|
|
72
|
+
format = "toml"
|
|
73
|
+
|
|
74
|
+
[[package.versioned_files]]
|
|
75
|
+
path = "npm/package.json"
|
|
76
|
+
format = "json"
|
|
77
|
+
</code></pre>
|
|
78
|
+
</div></div>
|
|
79
|
+
<div class="ferr-tab" data-label="JSON5"><p class="ferr-tab__label">JSON5</p><div class="ferr-tab__body"><pre><code class="language-json5">{
|
|
80
|
+
package: {
|
|
81
|
+
versionedFiles: [
|
|
82
|
+
{ path: "Cargo.toml", format: "toml" },
|
|
83
|
+
{ path: "npm/package.json", format: "json" },
|
|
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">package:
|
|
90
|
+
versionedFiles:
|
|
91
|
+
- path: Cargo.toml
|
|
92
|
+
format: toml
|
|
93
|
+
- path: npm/package.json
|
|
94
|
+
format: json
|
|
95
|
+
</code></pre>
|
|
96
|
+
</div></div>
|
|
97
|
+
</div>
|
|
98
|
+
|
|
99
|
+
Both files will be updated to the same version before the git commit.
|
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Monorepo
|
|
3
|
+
description: Version multiple packages independently in a single repository.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
FerrFlow treats a repository as a monorepo when the config defines more than one package. Each package is versioned independently based on its own git history.
|
|
7
|
+
|
|
8
|
+
## Package isolation
|
|
9
|
+
|
|
10
|
+
FerrFlow uses path prefixes to determine which commits belong to which package. Only commits that touch files under `path` (or `sharedPaths`) trigger a release for that package.
|
|
11
|
+
|
|
12
|
+
<div class="ferr-tabs">
|
|
13
|
+
<div class="ferr-tab" data-label="JSON"><p class="ferr-tab__label">JSON</p><div class="ferr-tab__body"><pre><code class="language-json">{
|
|
14
|
+
"package": [
|
|
15
|
+
{
|
|
16
|
+
"name": "api",
|
|
17
|
+
"path": "packages/api"
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"name": "site",
|
|
21
|
+
"path": "packages/site"
|
|
22
|
+
}
|
|
23
|
+
]
|
|
24
|
+
}
|
|
25
|
+
</code></pre>
|
|
26
|
+
</div></div>
|
|
27
|
+
<div class="ferr-tab" data-label="TOML"><p class="ferr-tab__label">TOML</p><div class="ferr-tab__body"><pre><code class="language-toml">[[package]]
|
|
28
|
+
name = "api"
|
|
29
|
+
path = "packages/api"
|
|
30
|
+
|
|
31
|
+
[[package]]
|
|
32
|
+
name = "site"
|
|
33
|
+
path = "packages/site"
|
|
34
|
+
</code></pre>
|
|
35
|
+
</div></div>
|
|
36
|
+
<div class="ferr-tab" data-label="JSON5"><p class="ferr-tab__label">JSON5</p><div class="ferr-tab__body"><pre><code class="language-json5">{
|
|
37
|
+
package: [
|
|
38
|
+
{
|
|
39
|
+
name: "api",
|
|
40
|
+
path: "packages/api",
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
name: "site",
|
|
44
|
+
path: "packages/site",
|
|
45
|
+
},
|
|
46
|
+
],
|
|
47
|
+
}
|
|
48
|
+
</code></pre>
|
|
49
|
+
</div></div>
|
|
50
|
+
<div class="ferr-tab" data-label="YAML"><p class="ferr-tab__label">YAML</p><div class="ferr-tab__body"><pre><code class="language-yaml">package:
|
|
51
|
+
- name: api
|
|
52
|
+
path: packages/api
|
|
53
|
+
- name: site
|
|
54
|
+
path: packages/site
|
|
55
|
+
</code></pre>
|
|
56
|
+
</div></div>
|
|
57
|
+
</div>
|
|
58
|
+
|
|
59
|
+
## Shared dependencies
|
|
60
|
+
|
|
61
|
+
If you have code shared between packages (e.g., a `packages/shared/` library), declare it as a `sharedPaths` entry. A change to any shared path triggers a release for every package that lists it:
|
|
62
|
+
|
|
63
|
+
<div class="ferr-tabs">
|
|
64
|
+
<div class="ferr-tab" data-label="JSON"><p class="ferr-tab__label">JSON</p><div class="ferr-tab__body"><pre><code class="language-json">{
|
|
65
|
+
"package": [
|
|
66
|
+
{
|
|
67
|
+
"name": "api",
|
|
68
|
+
"path": "packages/api",
|
|
69
|
+
"sharedPaths": ["packages/shared/"]
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
"name": "site",
|
|
73
|
+
"path": "packages/site",
|
|
74
|
+
"sharedPaths": ["packages/shared/"]
|
|
75
|
+
}
|
|
76
|
+
]
|
|
77
|
+
}
|
|
78
|
+
</code></pre>
|
|
79
|
+
</div></div>
|
|
80
|
+
<div class="ferr-tab" data-label="TOML"><p class="ferr-tab__label">TOML</p><div class="ferr-tab__body"><pre><code class="language-toml">[[package]]
|
|
81
|
+
name = "api"
|
|
82
|
+
path = "packages/api"
|
|
83
|
+
shared_paths = ["packages/shared/"]
|
|
84
|
+
|
|
85
|
+
[[package]]
|
|
86
|
+
name = "site"
|
|
87
|
+
path = "packages/site"
|
|
88
|
+
shared_paths = ["packages/shared/"]
|
|
89
|
+
</code></pre>
|
|
90
|
+
</div></div>
|
|
91
|
+
<div class="ferr-tab" data-label="JSON5"><p class="ferr-tab__label">JSON5</p><div class="ferr-tab__body"><pre><code class="language-json5">{
|
|
92
|
+
package: [
|
|
93
|
+
{
|
|
94
|
+
name: "api",
|
|
95
|
+
path: "packages/api",
|
|
96
|
+
sharedPaths: ["packages/shared/"],
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
name: "site",
|
|
100
|
+
path: "packages/site",
|
|
101
|
+
sharedPaths: ["packages/shared/"],
|
|
102
|
+
},
|
|
103
|
+
],
|
|
104
|
+
}
|
|
105
|
+
</code></pre>
|
|
106
|
+
</div></div>
|
|
107
|
+
<div class="ferr-tab" data-label="YAML"><p class="ferr-tab__label">YAML</p><div class="ferr-tab__body"><pre><code class="language-yaml">package:
|
|
108
|
+
- name: api
|
|
109
|
+
path: packages/api
|
|
110
|
+
sharedPaths:
|
|
111
|
+
- packages/shared/
|
|
112
|
+
- name: site
|
|
113
|
+
path: packages/site
|
|
114
|
+
sharedPaths:
|
|
115
|
+
- packages/shared/
|
|
116
|
+
</code></pre>
|
|
117
|
+
</div></div>
|
|
118
|
+
</div>
|
|
119
|
+
|
|
120
|
+
## Package dependencies
|
|
121
|
+
|
|
122
|
+
Use `dependsOn` to declare that a package depends on another. When a dependency is released, the dependent package automatically receives a patch bump — even if none of its own files changed. This cascades transitively: if `app` depends on `cli` and `cli` depends on `core`, bumping `core` bumps both `cli` and `app`.
|
|
123
|
+
|
|
124
|
+
<div class="ferr-tabs">
|
|
125
|
+
<div class="ferr-tab" data-label="JSON"><p class="ferr-tab__label">JSON</p><div class="ferr-tab__body"><pre><code class="language-json">{
|
|
126
|
+
"package": [
|
|
127
|
+
{
|
|
128
|
+
"name": "core",
|
|
129
|
+
"path": "packages/core"
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
"name": "cli",
|
|
133
|
+
"path": "packages/cli",
|
|
134
|
+
"dependsOn": ["core"]
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
"name": "app",
|
|
138
|
+
"path": "packages/app",
|
|
139
|
+
"dependsOn": ["cli"]
|
|
140
|
+
}
|
|
141
|
+
]
|
|
142
|
+
}
|
|
143
|
+
</code></pre>
|
|
144
|
+
</div></div>
|
|
145
|
+
<div class="ferr-tab" data-label="TOML"><p class="ferr-tab__label">TOML</p><div class="ferr-tab__body"><pre><code class="language-toml">[[package]]
|
|
146
|
+
name = "core"
|
|
147
|
+
path = "packages/core"
|
|
148
|
+
|
|
149
|
+
[[package]]
|
|
150
|
+
name = "cli"
|
|
151
|
+
path = "packages/cli"
|
|
152
|
+
depends_on = ["core"]
|
|
153
|
+
|
|
154
|
+
[[package]]
|
|
155
|
+
name = "app"
|
|
156
|
+
path = "packages/app"
|
|
157
|
+
depends_on = ["cli"]
|
|
158
|
+
</code></pre>
|
|
159
|
+
</div></div>
|
|
160
|
+
<div class="ferr-tab" data-label="JSON5"><p class="ferr-tab__label">JSON5</p><div class="ferr-tab__body"><pre><code class="language-json5">{
|
|
161
|
+
package: [
|
|
162
|
+
{
|
|
163
|
+
name: "core",
|
|
164
|
+
path: "packages/core",
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
name: "cli",
|
|
168
|
+
path: "packages/cli",
|
|
169
|
+
dependsOn: ["core"],
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
name: "app",
|
|
173
|
+
path: "packages/app",
|
|
174
|
+
dependsOn: ["cli"],
|
|
175
|
+
},
|
|
176
|
+
],
|
|
177
|
+
}
|
|
178
|
+
</code></pre>
|
|
179
|
+
</div></div>
|
|
180
|
+
<div class="ferr-tab" data-label="YAML"><p class="ferr-tab__label">YAML</p><div class="ferr-tab__body"><pre><code class="language-yaml">package:
|
|
181
|
+
- name: core
|
|
182
|
+
path: packages/core
|
|
183
|
+
- name: cli
|
|
184
|
+
path: packages/cli
|
|
185
|
+
dependsOn:
|
|
186
|
+
- core
|
|
187
|
+
- name: app
|
|
188
|
+
path: packages/app
|
|
189
|
+
dependsOn:
|
|
190
|
+
- cli
|
|
191
|
+
</code></pre>
|
|
192
|
+
</div></div>
|
|
193
|
+
</div>
|
|
194
|
+
|
|
195
|
+
<aside class="ferr-aside ferr-aside--note"><div class="ferr-aside__body"><p><code>dependsOn</code> differs from <code>sharedPaths</code>. Shared paths trigger a bump when files in the shared directory change. <code>dependsOn</code> triggers a bump when another <strong>package</strong> is released, regardless of which files changed.</p>
|
|
196
|
+
</div></aside>
|
|
197
|
+
|
|
198
|
+
## Git tag format
|
|
199
|
+
|
|
200
|
+
By default, monorepo tags use the `{name}@v{version}` format:
|
|
201
|
+
|
|
202
|
+
```
|
|
203
|
+
api@v1.2.0
|
|
204
|
+
site@v0.4.1
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
Configure this with the `tagTemplate` field:
|
|
208
|
+
|
|
209
|
+
<div class="ferr-tabs">
|
|
210
|
+
<div class="ferr-tab" data-label="JSON"><p class="ferr-tab__label">JSON</p><div class="ferr-tab__body"><pre><code class="language-json">{
|
|
211
|
+
"workspace": {
|
|
212
|
+
"tagTemplate": "{name}@v{version}"
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
</code></pre>
|
|
216
|
+
</div></div>
|
|
217
|
+
<div class="ferr-tab" data-label="TOML"><p class="ferr-tab__label">TOML</p><div class="ferr-tab__body"><pre><code class="language-toml">[workspace]
|
|
218
|
+
tag_template = "{name}@v{version}"
|
|
219
|
+
</code></pre>
|
|
220
|
+
</div></div>
|
|
221
|
+
<div class="ferr-tab" data-label="JSON5"><p class="ferr-tab__label">JSON5</p><div class="ferr-tab__body"><pre><code class="language-json5">{
|
|
222
|
+
workspace: {
|
|
223
|
+
tagTemplate: "{name}@v{version}",
|
|
224
|
+
},
|
|
225
|
+
}
|
|
226
|
+
</code></pre>
|
|
227
|
+
</div></div>
|
|
228
|
+
<div class="ferr-tab" data-label="YAML"><p class="ferr-tab__label">YAML</p><div class="ferr-tab__body"><pre><code class="language-yaml">workspace:
|
|
229
|
+
tagTemplate: "{name}@v{version}"
|
|
230
|
+
</code></pre>
|
|
231
|
+
</div></div>
|
|
232
|
+
</div>
|
|
233
|
+
|
|
234
|
+
For a single-package repo, the default is `v{version}` (no name prefix).
|
|
235
|
+
|
|
236
|
+
FerrFlow looks for the most recent tag matching the template to determine what commits are new.
|
|
237
|
+
|
|
238
|
+
## Independent cadences
|
|
239
|
+
|
|
240
|
+
Packages release independently. In a single `ferrflow release` run:
|
|
241
|
+
|
|
242
|
+
- `api` may bump from `1.2.0` → `1.3.0` (new `feat:` commit)
|
|
243
|
+
- `site` may bump from `0.4.0` → `0.4.1` (only `fix:` commits)
|
|
244
|
+
- `shared` may not release at all (only `chore:` commits)
|
|
245
|
+
|
|
246
|
+
## Per-package overrides
|
|
247
|
+
|
|
248
|
+
Each package can override the workspace-level `versioning` strategy and `tagTemplate`:
|
|
249
|
+
|
|
250
|
+
<div class="ferr-tabs">
|
|
251
|
+
<div class="ferr-tab" data-label="JSON"><p class="ferr-tab__label">JSON</p><div class="ferr-tab__body"><pre><code class="language-json">{
|
|
252
|
+
"workspace": {
|
|
253
|
+
"versioning": "semver",
|
|
254
|
+
"tagTemplate": "{name}@v{version}"
|
|
255
|
+
},
|
|
256
|
+
"package": [
|
|
257
|
+
{
|
|
258
|
+
"name": "api",
|
|
259
|
+
"path": "packages/api",
|
|
260
|
+
"versioning": "calver"
|
|
261
|
+
},
|
|
262
|
+
{
|
|
263
|
+
"name": "site",
|
|
264
|
+
"path": "packages/site",
|
|
265
|
+
"tagTemplate": "site-v{version}"
|
|
266
|
+
}
|
|
267
|
+
]
|
|
268
|
+
}
|
|
269
|
+
</code></pre>
|
|
270
|
+
</div></div>
|
|
271
|
+
<div class="ferr-tab" data-label="TOML"><p class="ferr-tab__label">TOML</p><div class="ferr-tab__body"><pre><code class="language-toml">[workspace]
|
|
272
|
+
versioning = "semver"
|
|
273
|
+
tag_template = "{name}@v{version}"
|
|
274
|
+
|
|
275
|
+
[[package]]
|
|
276
|
+
name = "api"
|
|
277
|
+
path = "packages/api"
|
|
278
|
+
versioning = "calver"
|
|
279
|
+
|
|
280
|
+
[[package]]
|
|
281
|
+
name = "site"
|
|
282
|
+
path = "packages/site"
|
|
283
|
+
tag_template = "site-v{version}"
|
|
284
|
+
</code></pre>
|
|
285
|
+
</div></div>
|
|
286
|
+
<div class="ferr-tab" data-label="JSON5"><p class="ferr-tab__label">JSON5</p><div class="ferr-tab__body"><pre><code class="language-json5">{
|
|
287
|
+
workspace: {
|
|
288
|
+
versioning: "semver",
|
|
289
|
+
tagTemplate: "{name}@v{version}",
|
|
290
|
+
},
|
|
291
|
+
package: [
|
|
292
|
+
{
|
|
293
|
+
name: "api",
|
|
294
|
+
path: "packages/api",
|
|
295
|
+
versioning: "calver",
|
|
296
|
+
},
|
|
297
|
+
{
|
|
298
|
+
name: "site",
|
|
299
|
+
path: "packages/site",
|
|
300
|
+
tagTemplate: "site-v{version}",
|
|
301
|
+
},
|
|
302
|
+
],
|
|
303
|
+
}
|
|
304
|
+
</code></pre>
|
|
305
|
+
</div></div>
|
|
306
|
+
<div class="ferr-tab" data-label="YAML"><p class="ferr-tab__label">YAML</p><div class="ferr-tab__body"><pre><code class="language-yaml">workspace:
|
|
307
|
+
versioning: semver
|
|
308
|
+
tagTemplate: "{name}@v{version}"
|
|
309
|
+
|
|
310
|
+
package:
|
|
311
|
+
|
|
312
|
+
- name: api
|
|
313
|
+
path: packages/api
|
|
314
|
+
versioning: calver
|
|
315
|
+
- name: site
|
|
316
|
+
path: packages/site
|
|
317
|
+
tagTemplate: "site-v{version}"
|
|
318
|
+
</code></pre>
|
|
319
|
+
|
|
320
|
+
</div></div>
|
|
321
|
+
</div>
|
|
322
|
+
|
|
323
|
+
<aside class="ferr-aside ferr-aside--tip"><div class="ferr-aside__body"><p>Use <code>ferrflow check</code> to preview exactly which packages would be released and at what version before committing to a release.</p>
|
|
324
|
+
</div></aside>
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Installation
|
|
3
|
+
description: How to install FerrFlow locally or in CI.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
## Local installation
|
|
7
|
+
|
|
8
|
+
<div class="ferr-tabs">
|
|
9
|
+
<div class="ferr-tab" data-label="Cargo"><p class="ferr-tab__label">Cargo</p><div class="ferr-tab__body"><pre><code class="language-bash">cargo install ferrflow
|
|
10
|
+
</code></pre>
|
|
11
|
+
</div></div>
|
|
12
|
+
<div class="ferr-tab" data-label="npm"><p class="ferr-tab__label">npm</p><div class="ferr-tab__body"><pre><code class="language-bash">npm install -g ferrflow
|
|
13
|
+
# or as a dev dependency
|
|
14
|
+
npm install -D ferrflow
|
|
15
|
+
</code></pre>
|
|
16
|
+
</div></div>
|
|
17
|
+
<div class="ferr-tab" data-label="WASM (browser)"><p class="ferr-tab__label">WASM (browser)</p><div class="ferr-tab__body"><pre><code class="language-bash">npm install @ferrflow/wasm
|
|
18
|
+
</code></pre>
|
|
19
|
+
<p>Use FerrFlow directly in the browser — parse commits, compute version bumps, and generate changelogs client-side without a backend.</p>
|
|
20
|
+
</div></div>
|
|
21
|
+
<div class="ferr-tab" data-label="Binary"><p class="ferr-tab__label">Binary</p><div class="ferr-tab__body"><p>Download a pre-built binary from <a href="https://github.com/FerrLabs/FerrFlow/releases/latest">Releases</a>:</p>
|
|
22
|
+
<pre><code class="language-bash"># Linux x86_64
|
|
23
|
+
curl -L https://github.com/FerrLabs/FerrFlow/releases/latest/download/ferrflow-linux-x64.tar.gz | tar xz
|
|
24
|
+
sudo mv ferrflow /usr/local/bin/
|
|
25
|
+
</code></pre>
|
|
26
|
+
</div></div>
|
|
27
|
+
<div class="ferr-tab" data-label="Docker"><p class="ferr-tab__label">Docker</p><div class="ferr-tab__body"><pre><code class="language-bash">docker run --rm -v $(pwd):/repo ghcr.io/ferrlabs/ferrflow:latest check
|
|
28
|
+
</code></pre>
|
|
29
|
+
</div></div>
|
|
30
|
+
</div>
|
|
31
|
+
|
|
32
|
+
## CI installation
|
|
33
|
+
|
|
34
|
+
The recommended way to use FerrFlow in CI is the GitHub Action — no installation step needed:
|
|
35
|
+
|
|
36
|
+
```yaml title=".github/workflows/release.yml"
|
|
37
|
+
- uses: FerrLabs/ferrflow@v3
|
|
38
|
+
env:
|
|
39
|
+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
See [GitHub Actions](/docs/ci/github-actions) and [GitLab CI](/docs/ci/gitlab-ci) for complete examples.
|
|
43
|
+
|
|
44
|
+
## Verify
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
ferrflow --version
|
|
48
|
+
```
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Introduction
|
|
3
|
+
description: What FerrFlow is and why it exists.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
FerrFlow is a single binary that automates semantic versioning for any repository — monorepo or classic, any language.
|
|
7
|
+
|
|
8
|
+
It reads your commit history, determines the right version bump, updates your version files, writes a changelog, creates a git tag, and publishes a release. Zero runtime dependencies.
|
|
9
|
+
|
|
10
|
+
## Why not semantic-release or changesets?
|
|
11
|
+
|
|
12
|
+
Most versioning tools are coupled to a specific ecosystem or require Node.js to be present in your CI.
|
|
13
|
+
|
|
14
|
+
| Tool | Monorepo | Multi-language | Runtime |
|
|
15
|
+
| ---------------- | ----------- | -------------- | -------- |
|
|
16
|
+
| semantic-release | via plugins | JS/Node only | Node.js |
|
|
17
|
+
| changesets | manual bump | JS only | Node.js |
|
|
18
|
+
| release-please | limited | partial | Node.js |
|
|
19
|
+
| cargo-release | no | Rust only | Rust |
|
|
20
|
+
| **FerrFlow** | **native** | **any** | **none** |
|
|
21
|
+
|
|
22
|
+
FerrFlow ships as a compiled binary. Drop it in any CI environment without installing a runtime. A WASM build (`@ferrflow/wasm`) is also available for browser-side usage.
|
|
23
|
+
|
|
24
|
+
## How it works
|
|
25
|
+
|
|
26
|
+
1. **Reads commits** since the last git tag for each package
|
|
27
|
+
2. **Determines the bump** from [Conventional Commits](/docs/reference/conventional-commits) (`feat` → minor, `fix` → patch, breaking → major)
|
|
28
|
+
3. **Updates version files** — `Cargo.toml`, `package.json`, `pom.xml`, etc.
|
|
29
|
+
4. **Writes the changelog** in Keep a Changelog format
|
|
30
|
+
5. **Creates a git tag** (`api@v1.2.0`) and pushes
|
|
31
|
+
6. **Publishes a GitHub/GitLab release** with the changelog as release notes
|
|
32
|
+
|
|
33
|
+
In a monorepo, FerrFlow only releases packages that have changed, and understands shared dependency paths.
|
|
34
|
+
|
|
35
|
+
## Key features
|
|
36
|
+
|
|
37
|
+
- **Pre/post-release hooks** — run scripts at every lifecycle stage (bump, commit, publish, failure)
|
|
38
|
+
- **Query commands** — `ferrflow version`, `ferrflow tag`, and `ferrflow status` for CI scripting
|
|
39
|
+
- **Any version file** — Cargo.toml, package.json, pom.xml, build.gradle, Chart.yaml, plain text, and more
|
|
40
|
+
- **Browser support** — `@ferrflow/wasm` brings commit parsing, bump computation, and changelog generation to the browser
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Telemetry
|
|
3
|
+
description: What FerrFlow collects, how data is anonymized, and how to opt out.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
FerrFlow collects anonymous usage telemetry to help improve the tool. This page explains exactly what is sent, how it is anonymized, and how to disable it.
|
|
7
|
+
|
|
8
|
+
## What is collected
|
|
9
|
+
|
|
10
|
+
Each time you run a command, FerrFlow may send a single event containing:
|
|
11
|
+
|
|
12
|
+
| Field | Description |
|
|
13
|
+
| --------------- | ------------------------------------------------------------------- |
|
|
14
|
+
| `event_type` | The action performed: `check`, `release`, `version_bump`, or `init` |
|
|
15
|
+
| `commits_count` | Number of commits since the last release |
|
|
16
|
+
| `repo_hash` | A SHA-256 hash of your git remote URL (see below) |
|
|
17
|
+
|
|
18
|
+
Only fields relevant to the command are included. Empty fields are omitted.
|
|
19
|
+
|
|
20
|
+
## How data is anonymized
|
|
21
|
+
|
|
22
|
+
Your repository URL is **never sent in plain text**. FerrFlow computes a SHA-256 hash of the git remote URL and sends only the resulting hex digest. This lets us count unique repositories without knowing which repositories they are.
|
|
23
|
+
|
|
24
|
+
No source code, file names, commit messages, branch names, package names, version numbers, IP addresses, or personal information are ever collected or stored.
|
|
25
|
+
|
|
26
|
+
## Where data is sent
|
|
27
|
+
|
|
28
|
+
Events are sent as a POST request to `https://api.ferrflow.com/events`. The request is asynchronous and non-blocking — it never slows down your workflow. If the request fails, it is silently discarded.
|
|
29
|
+
|
|
30
|
+
## How to opt out
|
|
31
|
+
|
|
32
|
+
You can disable telemetry entirely using either an environment variable or your config file.
|
|
33
|
+
|
|
34
|
+
### Environment variable
|
|
35
|
+
|
|
36
|
+
<div class="ferr-tabs">
|
|
37
|
+
<div class="ferr-tab" data-label="Linux / macOS"><p class="ferr-tab__label">Linux / macOS</p><div class="ferr-tab__body"><pre><code class="language-bash">export FERRFLOW_ANONYMOUS_TELEMETRY=false
|
|
38
|
+
</code></pre>
|
|
39
|
+
</div></div>
|
|
40
|
+
<div class="ferr-tab" data-label="Windows"><p class="ferr-tab__label">Windows</p><div class="ferr-tab__body"><pre><code class="language-powershell">$env:FERRFLOW_ANONYMOUS_TELEMETRY = "false"
|
|
41
|
+
</code></pre>
|
|
42
|
+
</div></div>
|
|
43
|
+
</div>
|
|
44
|
+
|
|
45
|
+
Accepted values to disable: `false`, `0`, `off`, `no` (case-insensitive).
|
|
46
|
+
|
|
47
|
+
<aside class="ferr-aside ferr-aside--tip"><div class="ferr-aside__body"><p><code>FERRFLOW_TELEMETRY=false</code> also works as a fallback.</p>
|
|
48
|
+
</div></aside>
|
|
49
|
+
|
|
50
|
+
### Config file
|
|
51
|
+
|
|
52
|
+
<div class="ferr-tabs">
|
|
53
|
+
<div class="ferr-tab" data-label="JSON"><p class="ferr-tab__label">JSON</p><div class="ferr-tab__body"><pre><code class="language-json">{
|
|
54
|
+
"workspace": {
|
|
55
|
+
"telemetry": false
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
</code></pre>
|
|
59
|
+
</div></div>
|
|
60
|
+
<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]
|
|
61
|
+
telemetry = false
|
|
62
|
+
</code></pre>
|
|
63
|
+
</div></div>
|
|
64
|
+
</div>
|
|
65
|
+
|
|
66
|
+
Either method is sufficient to disable telemetry. If the config file disables it, the environment variable cannot re-enable it, and vice versa.
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Quick start
|
|
3
|
+
description: Go from zero to your first automated release in under 5 minutes.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
<ol>
|
|
7
|
+
<li><p><strong>Scaffold the config</strong></p>
|
|
8
|
+
<p>Run <code>ferrflow init</code> at the root of your repository. It detects your version files and writes a <code>.ferrflow</code> config:</p>
|
|
9
|
+
<pre><code class="language-bash">ferrflow init
|
|
10
|
+
</code></pre>
|
|
11
|
+
<p>For a Rust project this produces:</p>
|
|
12
|
+
<pre><code class="language-json">{
|
|
13
|
+
"$schema": "https://ferrflow.com/schema/ferrflow.json",
|
|
14
|
+
"workspace": {
|
|
15
|
+
"tagTemplate": "v{version}"
|
|
16
|
+
},
|
|
17
|
+
"package": [
|
|
18
|
+
{
|
|
19
|
+
"name": "my-app",
|
|
20
|
+
"path": ".",
|
|
21
|
+
"changelog": "CHANGELOG.md",
|
|
22
|
+
"versionedFiles": [
|
|
23
|
+
{ "path": "Cargo.toml", "format": "toml" }
|
|
24
|
+
]
|
|
25
|
+
}
|
|
26
|
+
]
|
|
27
|
+
}
|
|
28
|
+
</code></pre>
|
|
29
|
+
</li>
|
|
30
|
+
<li><p><strong>Preview what would happen</strong></p>
|
|
31
|
+
<p>Before touching anything, run a dry-run to see what FerrFlow would do:</p>
|
|
32
|
+
<pre><code class="language-bash">ferrflow check
|
|
33
|
+
</code></pre>
|
|
34
|
+
<p>Output:</p>
|
|
35
|
+
<pre><code>Scanning . ...
|
|
36
|
+
→ feat: add user authentication
|
|
37
|
+
→ fix: correct pagination offset
|
|
38
|
+
|
|
39
|
+
Bump my-app 0.1.0 → 0.2.0
|
|
40
|
+
Tag v0.2.0
|
|
41
|
+
</code></pre>
|
|
42
|
+
</li>
|
|
43
|
+
<li><p><strong>Run the release</strong></p>
|
|
44
|
+
<pre><code class="language-bash">ferrflow release
|
|
45
|
+
</code></pre>
|
|
46
|
+
<p>FerrFlow will:</p>
|
|
47
|
+
<ul>
|
|
48
|
+
<li>Update <code>Cargo.toml</code> to <code>0.2.0</code></li>
|
|
49
|
+
<li>Append to <code>CHANGELOG.md</code></li>
|
|
50
|
+
<li>Commit the changes</li>
|
|
51
|
+
<li>Create and push <code>v0.2.0</code></li>
|
|
52
|
+
<li>Create a GitHub release (if <code>GITHUB_TOKEN</code> is set)</li>
|
|
53
|
+
</ul>
|
|
54
|
+
</li>
|
|
55
|
+
</ol>
|
|
56
|
+
|
|
57
|
+
<aside class="ferr-aside ferr-aside--tip"><p class="ferr-aside__title">Starting from scratch</p><div class="ferr-aside__body"><p>No prior tag? FerrFlow v3 bootstraps from the strategy's zero value automatically — the first <code>feat:</code> lands at <code>0.1.0</code>, the first <code>fix:</code> at <code>0.0.1</code>. You don't need to create a <code>v0.0.0</code> tag by hand. See <a href="/docs/reference/cli#which-version-is-bumped-from">how the baseline is chosen</a>.</p>
|
|
58
|
+
</div></aside>
|
|
59
|
+
|
|
60
|
+
## Next steps
|
|
61
|
+
|
|
62
|
+
- Set up [GitHub Actions](/docs/ci/github-actions) to run releases automatically on push to `main`
|
|
63
|
+
- Configure a [monorepo](/docs/configuration/monorepo) if you have multiple packages
|
|
64
|
+
- Add [pre/post-release hooks](/docs/configuration/config-file#hooks) for custom scripts during the release lifecycle
|
|
65
|
+
- Use `ferrflow version` and `ferrflow tag` in CI scripts — see the [CLI reference](/docs/reference/cli)
|
|
66
|
+
- Review the full [config reference](/docs/configuration/config-file)
|