@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,97 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: ferrflow.toml
|
|
3
|
+
description: Complete reference for the ferrflow.toml configuration file.
|
|
4
|
+
slug: v0/docs/configuration/config-file
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
FerrFlow reads `ferrflow.toml` from the root of your repository. If no config file is found, it auto-detects common version files in the current directory.
|
|
8
|
+
|
|
9
|
+
## `[workspace]`
|
|
10
|
+
|
|
11
|
+
Global settings that apply to all packages.
|
|
12
|
+
|
|
13
|
+
```toml
|
|
14
|
+
[workspace]
|
|
15
|
+
remote = "origin" # Git remote to push to (default: "origin")
|
|
16
|
+
branch = "main" # Branch to push to (default: auto-detected from remote HEAD)
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## `[[package]]`
|
|
20
|
+
|
|
21
|
+
Defines a package to version. You can have one or many.
|
|
22
|
+
|
|
23
|
+
```toml
|
|
24
|
+
[[package]]
|
|
25
|
+
name = "api" # Used in git tags: api@v1.2.0
|
|
26
|
+
path = "packages/api" # Path to the package root
|
|
27
|
+
changelog = "packages/api/CHANGELOG.md" # Where to write the changelog
|
|
28
|
+
shared_paths = ["packages/shared/"] # Changes here also trigger this package
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
| Field | Required | Description |
|
|
32
|
+
| -------------- | -------- | -------------------------------------------------------------- |
|
|
33
|
+
| `name` | yes | Package identifier, used in git tag prefix |
|
|
34
|
+
| `path` | yes | Relative path to the package directory |
|
|
35
|
+
| `changelog` | no | Path to the changelog file (defaults to `{path}/CHANGELOG.md`) |
|
|
36
|
+
| `shared_paths` | no | List of paths — changes in any of them trigger this package |
|
|
37
|
+
|
|
38
|
+
## `[[package.versioned_files]]`
|
|
39
|
+
|
|
40
|
+
Files where the version number should be updated.
|
|
41
|
+
|
|
42
|
+
```toml
|
|
43
|
+
[[package.versioned_files]]
|
|
44
|
+
path = "packages/api/Cargo.toml"
|
|
45
|
+
format = "toml"
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
| `format` | File | Field updated |
|
|
49
|
+
| -------- | ---------------------------------- | ------------------------------------------------- |
|
|
50
|
+
| `toml` | `Cargo.toml`, `pyproject.toml` | `[package].version` |
|
|
51
|
+
| `json` | `package.json` | `version` |
|
|
52
|
+
| `xml` | `pom.xml` | First `<version>` element |
|
|
53
|
+
| `gradle` | `build.gradle`, `build.gradle.kts` | `version = "..."` |
|
|
54
|
+
| `gomod` | `go.mod` | No file update — version comes from git tags only |
|
|
55
|
+
|
|
56
|
+
A package can have multiple versioned files:
|
|
57
|
+
|
|
58
|
+
```toml
|
|
59
|
+
[[package.versioned_files]]
|
|
60
|
+
path = "Cargo.toml"
|
|
61
|
+
format = "toml"
|
|
62
|
+
|
|
63
|
+
[[package.versioned_files]]
|
|
64
|
+
path = "npm/package.json"
|
|
65
|
+
format = "json"
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## Complete example
|
|
69
|
+
|
|
70
|
+
```toml
|
|
71
|
+
[workspace]
|
|
72
|
+
remote = "origin"
|
|
73
|
+
branch = "main"
|
|
74
|
+
|
|
75
|
+
[[package]]
|
|
76
|
+
name = "api"
|
|
77
|
+
path = "packages/api"
|
|
78
|
+
changelog = "packages/api/CHANGELOG.md"
|
|
79
|
+
shared_paths = ["packages/shared/"]
|
|
80
|
+
|
|
81
|
+
[[package.versioned_files]]
|
|
82
|
+
path = "packages/api/Cargo.toml"
|
|
83
|
+
format = "toml"
|
|
84
|
+
|
|
85
|
+
[[package]]
|
|
86
|
+
name = "site"
|
|
87
|
+
path = "packages/site"
|
|
88
|
+
changelog = "packages/site/CHANGELOG.md"
|
|
89
|
+
shared_paths = ["packages/shared/"]
|
|
90
|
+
|
|
91
|
+
[[package.versioned_files]]
|
|
92
|
+
path = "packages/site/package.json"
|
|
93
|
+
format = "json"
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
<aside class="ferr-aside ferr-aside--tip"><div class="ferr-aside__body"><p>Run <code>ferrflow init</code> to generate this file automatically based on what FerrFlow detects in your repo.</p>
|
|
97
|
+
</div></aside>
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Supported formats
|
|
3
|
+
description: Version file formats that FerrFlow can read and update.
|
|
4
|
+
slug: v0/docs/configuration/formats
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## TOML
|
|
8
|
+
|
|
9
|
+
Used by Rust (`Cargo.toml`) and Python (`pyproject.toml`).
|
|
10
|
+
|
|
11
|
+
FerrFlow updates the `version` field under `[package]`, `[project]`, or `[tool.poetry]`.
|
|
12
|
+
|
|
13
|
+
```toml
|
|
14
|
+
[package]
|
|
15
|
+
name = "my-crate"
|
|
16
|
+
version = "1.2.3" # ← updated
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## JSON
|
|
20
|
+
|
|
21
|
+
Used by Node.js (`package.json`).
|
|
22
|
+
|
|
23
|
+
FerrFlow updates the top-level `version` field.
|
|
24
|
+
|
|
25
|
+
```json
|
|
26
|
+
{
|
|
27
|
+
"name": "my-package",
|
|
28
|
+
"version": "1.2.3"
|
|
29
|
+
}
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## XML
|
|
33
|
+
|
|
34
|
+
Used by Java/Maven (`pom.xml`).
|
|
35
|
+
|
|
36
|
+
FerrFlow updates the first `<version>` element it encounters.
|
|
37
|
+
|
|
38
|
+
```xml
|
|
39
|
+
<project>
|
|
40
|
+
<groupId>com.example</groupId>
|
|
41
|
+
<artifactId>my-app</artifactId>
|
|
42
|
+
<version>1.2.3</version> <!-- updated -->
|
|
43
|
+
</project>
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Gradle
|
|
47
|
+
|
|
48
|
+
Used by Java/Kotlin Gradle projects (`build.gradle`, `build.gradle.kts`).
|
|
49
|
+
|
|
50
|
+
FerrFlow updates the `version = "..."` assignment.
|
|
51
|
+
|
|
52
|
+
```groovy
|
|
53
|
+
version = "1.2.3" // updated
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## Plain text
|
|
57
|
+
|
|
58
|
+
Used for simple version files (`VERSION`, `VERSION.txt`).
|
|
59
|
+
|
|
60
|
+
FerrFlow replaces the entire file content with the version number.
|
|
61
|
+
|
|
62
|
+
```
|
|
63
|
+
1.2.3
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## Go modules
|
|
67
|
+
|
|
68
|
+
Used by Go projects (`go.mod`).
|
|
69
|
+
|
|
70
|
+
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`).
|
|
71
|
+
|
|
72
|
+
## Multiple files per package
|
|
73
|
+
|
|
74
|
+
A package can have as many `[[package.versioned_files]]` entries as needed:
|
|
75
|
+
|
|
76
|
+
```toml
|
|
77
|
+
[[package.versioned_files]]
|
|
78
|
+
path = "Cargo.toml"
|
|
79
|
+
format = "toml"
|
|
80
|
+
|
|
81
|
+
[[package.versioned_files]]
|
|
82
|
+
path = "npm/package.json"
|
|
83
|
+
format = "json"
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
Both files will be updated to the same version before the git commit.
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Monorepo
|
|
3
|
+
description: Version multiple packages independently in a single repository.
|
|
4
|
+
slug: v0/docs/configuration/monorepo
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
FerrFlow treats a repository as a monorepo when `ferrflow.toml` defines more than one `[[package]]`. Each package is versioned independently based on its own git history.
|
|
8
|
+
|
|
9
|
+
## Package isolation
|
|
10
|
+
|
|
11
|
+
FerrFlow uses path prefixes to determine which commits belong to which package. Only commits that touch files under `path` (or `shared_paths`) trigger a release for that package.
|
|
12
|
+
|
|
13
|
+
```toml
|
|
14
|
+
[[package]]
|
|
15
|
+
name = "api"
|
|
16
|
+
path = "packages/api" # only commits touching packages/api/ trigger api releases
|
|
17
|
+
|
|
18
|
+
[[package]]
|
|
19
|
+
name = "site"
|
|
20
|
+
path = "packages/site" # only commits touching packages/site/ trigger site releases
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Shared dependencies
|
|
24
|
+
|
|
25
|
+
If you have code shared between packages (e.g., a `packages/shared/` library), you can declare it as a `shared_paths` entry. A change to any shared path triggers a release for every package that lists it:
|
|
26
|
+
|
|
27
|
+
```toml
|
|
28
|
+
[[package]]
|
|
29
|
+
name = "api"
|
|
30
|
+
path = "packages/api"
|
|
31
|
+
shared_paths = ["packages/shared/"] # changing shared/ also releases api
|
|
32
|
+
|
|
33
|
+
[[package]]
|
|
34
|
+
name = "site"
|
|
35
|
+
path = "packages/site"
|
|
36
|
+
shared_paths = ["packages/shared/"] # and also releases site
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## Git tag format
|
|
40
|
+
|
|
41
|
+
Each package gets its own tag namespace: `{name}@v{version}`.
|
|
42
|
+
|
|
43
|
+
```
|
|
44
|
+
api@v1.2.0
|
|
45
|
+
site@v0.4.1
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
FerrFlow looks for the most recent tag matching `{name}@v*` to determine what commits are new.
|
|
49
|
+
|
|
50
|
+
## Independent cadences
|
|
51
|
+
|
|
52
|
+
Packages release independently. In a single `ferrflow release` run:
|
|
53
|
+
|
|
54
|
+
- `api` may bump from `1.2.0` → `1.3.0` (new `feat:` commit)
|
|
55
|
+
- `site` may bump from `0.4.0` → `0.4.1` (only `fix:` commits)
|
|
56
|
+
- `shared` may not release at all (only `chore:` commits)
|
|
57
|
+
|
|
58
|
+
<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>
|
|
59
|
+
</div></aside>
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Installation
|
|
3
|
+
description: How to install FerrFlow locally or in CI.
|
|
4
|
+
slug: v0/docs/installation
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Local installation
|
|
8
|
+
|
|
9
|
+
<div class="ferr-tabs">
|
|
10
|
+
<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
|
|
11
|
+
</code></pre>
|
|
12
|
+
</div></div>
|
|
13
|
+
|
|
14
|
+
<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
|
|
15
|
+
# or as a dev dependency
|
|
16
|
+
npm install -D ferrflow
|
|
17
|
+
</code></pre>
|
|
18
|
+
</div></div>
|
|
19
|
+
|
|
20
|
+
<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>
|
|
21
|
+
<pre><code class="language-bash"># Linux x86_64
|
|
22
|
+
curl -L https://github.com/FerrLabs/FerrFlow/releases/latest/download/ferrflow-x86_64-unknown-linux-gnu.tar.gz | tar xz
|
|
23
|
+
sudo mv ferrflow /usr/local/bin/
|
|
24
|
+
</code></pre>
|
|
25
|
+
</div></div>
|
|
26
|
+
|
|
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
|
|
37
|
+
- uses: FerrLabs/ferrflow@v0
|
|
38
|
+
env:
|
|
39
|
+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
See [GitHub Actions](/v0/docs/ci/github-actions) and [GitLab CI](/v0/docs/ci/gitlab-ci) for complete examples.
|
|
43
|
+
|
|
44
|
+
## Verify
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
ferrflow --version
|
|
48
|
+
```
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Introduction
|
|
3
|
+
description: What FerrFlow is and why it exists.
|
|
4
|
+
slug: v0/docs/introduction
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
FerrFlow is a single binary that automates semantic versioning for any repository — monorepo or classic, any language.
|
|
8
|
+
|
|
9
|
+
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.
|
|
10
|
+
|
|
11
|
+
## Why not semantic-release or changesets?
|
|
12
|
+
|
|
13
|
+
Most versioning tools are coupled to a specific ecosystem or require Node.js to be present in your CI.
|
|
14
|
+
|
|
15
|
+
| Tool | Monorepo | Multi-language | Runtime |
|
|
16
|
+
| ---------------- | ----------- | -------------- | -------- |
|
|
17
|
+
| semantic-release | via plugins | JS/Node only | Node.js |
|
|
18
|
+
| changesets | manual bump | JS only | Node.js |
|
|
19
|
+
| release-please | limited | partial | Node.js |
|
|
20
|
+
| cargo-release | no | Rust only | Rust |
|
|
21
|
+
| **FerrFlow** | **native** | **any** | **none** |
|
|
22
|
+
|
|
23
|
+
FerrFlow ships as a compiled binary. Drop it in any CI environment without installing a runtime.
|
|
24
|
+
|
|
25
|
+
## How it works
|
|
26
|
+
|
|
27
|
+
1. **Reads commits** since the last git tag for each package
|
|
28
|
+
2. **Determines the bump** from [Conventional Commits](/v0/docs/reference/conventional-commits) (`feat` → minor, `fix` → patch, breaking → major)
|
|
29
|
+
3. **Updates version files** — `Cargo.toml`, `package.json`, `pom.xml`, etc.
|
|
30
|
+
4. **Writes the changelog** in Keep a Changelog format
|
|
31
|
+
5. **Creates a git tag** (`api@v1.2.0`) and pushes
|
|
32
|
+
6. **Publishes a GitHub/GitLab release** with the changelog as release notes
|
|
33
|
+
|
|
34
|
+
In a monorepo, FerrFlow only releases packages that have changed, and understands shared dependency paths.
|
|
@@ -0,0 +1,63 @@
|
|
|
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_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_TELEMETRY = "false"
|
|
41
|
+
</code></pre>
|
|
42
|
+
</div></div>
|
|
43
|
+
</div>
|
|
44
|
+
|
|
45
|
+
Accepted values to disable: `false`, `0`, `off`, `no` (case-insensitive).
|
|
46
|
+
|
|
47
|
+
### Config file
|
|
48
|
+
|
|
49
|
+
<div class="ferr-tabs">
|
|
50
|
+
<div class="ferr-tab" data-label="JSON"><p class="ferr-tab__label">JSON</p><div class="ferr-tab__body"><pre><code class="language-json">{
|
|
51
|
+
"workspace": {
|
|
52
|
+
"telemetry": false
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
</code></pre>
|
|
56
|
+
</div></div>
|
|
57
|
+
<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]
|
|
58
|
+
telemetry = false
|
|
59
|
+
</code></pre>
|
|
60
|
+
</div></div>
|
|
61
|
+
</div>
|
|
62
|
+
|
|
63
|
+
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,58 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Quick start
|
|
3
|
+
description: Go from zero to your first automated release in under 5 minutes.
|
|
4
|
+
slug: v0/docs/quickstart
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
<ol>
|
|
8
|
+
<li><p><strong>Scaffold the config</strong></p>
|
|
9
|
+
<p>Run <code>ferrflow init</code> at the root of your repository. It detects your version files and writes a <code>ferrflow.toml</code>:</p>
|
|
10
|
+
<pre><code class="language-bash">ferrflow init
|
|
11
|
+
</code></pre>
|
|
12
|
+
<p>For a Rust project this produces:</p>
|
|
13
|
+
<pre><code class="language-toml">[workspace]
|
|
14
|
+
remote = "origin"
|
|
15
|
+
branch = "main"
|
|
16
|
+
|
|
17
|
+
[[package]]
|
|
18
|
+
name = "my-app"
|
|
19
|
+
path = "."
|
|
20
|
+
changelog = "CHANGELOG.md"
|
|
21
|
+
|
|
22
|
+
[[package.versioned_files]]
|
|
23
|
+
path = "Cargo.toml"
|
|
24
|
+
format = "toml"
|
|
25
|
+
</code></pre>
|
|
26
|
+
</li>
|
|
27
|
+
<li><p><strong>Preview what would happen</strong></p>
|
|
28
|
+
<p>Before touching anything, run a dry-run to see what FerrFlow would do:</p>
|
|
29
|
+
<pre><code class="language-bash">ferrflow check
|
|
30
|
+
</code></pre>
|
|
31
|
+
<p>Output:</p>
|
|
32
|
+
<pre><code>Scanning . ...
|
|
33
|
+
→ feat: add user authentication
|
|
34
|
+
→ fix: correct pagination offset
|
|
35
|
+
|
|
36
|
+
Bump my-app 0.1.0 → 0.2.0
|
|
37
|
+
Tag my-app@v0.2.0
|
|
38
|
+
</code></pre>
|
|
39
|
+
</li>
|
|
40
|
+
<li><p><strong>Run the release</strong></p>
|
|
41
|
+
<pre><code class="language-bash">ferrflow release
|
|
42
|
+
</code></pre>
|
|
43
|
+
<p>FerrFlow will:</p>
|
|
44
|
+
<ul>
|
|
45
|
+
<li>Update <code>Cargo.toml</code> to <code>0.2.0</code></li>
|
|
46
|
+
<li>Append to <code>CHANGELOG.md</code></li>
|
|
47
|
+
<li>Commit the changes</li>
|
|
48
|
+
<li>Create and push <code>my-app@v0.2.0</code></li>
|
|
49
|
+
<li>Create a GitHub release (if <code>GITHUB_TOKEN</code> is set)</li>
|
|
50
|
+
</ul>
|
|
51
|
+
</li>
|
|
52
|
+
</ol>
|
|
53
|
+
|
|
54
|
+
## Next steps
|
|
55
|
+
|
|
56
|
+
- Set up [GitHub Actions](/v0/docs/ci/github-actions) to run releases automatically on push to `main`
|
|
57
|
+
- Configure a [monorepo](/v0/docs/configuration/monorepo) if you have multiple packages
|
|
58
|
+
- Review the full [config reference](/v0/docs/configuration/config-file)
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: CLI commands
|
|
3
|
+
description: Full reference for all FerrFlow CLI commands and flags.
|
|
4
|
+
slug: v0/docs/reference/cli
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## `ferrflow release`
|
|
8
|
+
|
|
9
|
+
Run the full release pipeline: bump versions, update changelogs, commit, tag, push, and create a release.
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
ferrflow release [OPTIONS]
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
| Flag | Description |
|
|
16
|
+
| ----------------- | ----------------------------------------------------------- |
|
|
17
|
+
| `--dry-run` | Preview all changes without writing, committing, or pushing |
|
|
18
|
+
| `--verbose`, `-v` | Show detailed output including commit hashes and file diffs |
|
|
19
|
+
|
|
20
|
+
**What it does:**
|
|
21
|
+
|
|
22
|
+
1. Scans commits since the last tag for each package
|
|
23
|
+
2. Determines the version bump from Conventional Commits
|
|
24
|
+
3. Updates all `versioned_files` with the new version
|
|
25
|
+
4. Appends the new section to `CHANGELOG.md`
|
|
26
|
+
5. Creates a git commit with the version bump changes
|
|
27
|
+
6. Creates and pushes the git tag (`{name}@v{version}`)
|
|
28
|
+
7. Creates a GitHub/GitLab release with the changelog as notes
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## `ferrflow check`
|
|
33
|
+
|
|
34
|
+
Preview what `ferrflow release` would do without making any changes. Equivalent to `ferrflow release --dry-run`.
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
ferrflow check
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## `ferrflow changelog`
|
|
43
|
+
|
|
44
|
+
Generate or update `CHANGELOG.md` only, without bumping versions or creating tags.
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
ferrflow changelog [OPTIONS]
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
| Flag | Description |
|
|
51
|
+
| ----------- | ------------------------------------------------- |
|
|
52
|
+
| `--dry-run` | Print the changelog entry without writing to disk |
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## `ferrflow init`
|
|
57
|
+
|
|
58
|
+
Scaffold a `ferrflow.toml` config file for the current repository. Detects existing version files (`Cargo.toml`, `package.json`, etc.) and generates the appropriate config.
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
ferrflow init
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## `ferrflow status`
|
|
67
|
+
|
|
68
|
+
Show the current version of each package and whether a release would be triggered.
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
ferrflow status [OPTIONS]
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
| Flag | Description |
|
|
75
|
+
| -------- | ----------------------------------- |
|
|
76
|
+
| `--json` | Output in JSON format for scripting |
|
|
77
|
+
|
|
78
|
+
Example output:
|
|
79
|
+
|
|
80
|
+
```
|
|
81
|
+
api 1.2.3 minor bump pending (1 feat commit)
|
|
82
|
+
site 0.4.1 no release (only chore commits)
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
## Global flags
|
|
88
|
+
|
|
89
|
+
These flags work with all commands:
|
|
90
|
+
|
|
91
|
+
| Flag | Description |
|
|
92
|
+
| ----------------- | ------------------------------------------------------- |
|
|
93
|
+
| `--config <PATH>` | Path to a custom config file (default: `ferrflow.toml`) |
|
|
94
|
+
| `--version` | Print the FerrFlow version and exit |
|
|
95
|
+
| `--help`, `-h` | Print help |
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Conventional Commits
|
|
3
|
+
description: How FerrFlow interprets commit messages to determine version bumps.
|
|
4
|
+
slug: v0/docs/reference/conventional-commits
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
FerrFlow follows the [Conventional Commits](https://www.conventionalcommits.org/) specification to determine how much to bump the version.
|
|
8
|
+
|
|
9
|
+
## Bump rules
|
|
10
|
+
|
|
11
|
+
| Commit type | Version bump | Example |
|
|
12
|
+
| ----------------------------- | ------------ | ----------------------------------- |
|
|
13
|
+
| `feat:` | **minor** | `feat: add wallet subscriptions` |
|
|
14
|
+
| `fix:` | patch | `fix: correct pagination offset` |
|
|
15
|
+
| `perf:` | patch | `perf: cache user queries` |
|
|
16
|
+
| `refactor:` | patch | `refactor: extract auth middleware` |
|
|
17
|
+
| `feat!:` or `BREAKING CHANGE` | **major** | `feat!: remove deprecated endpoint` |
|
|
18
|
+
| `chore:` | none | `chore: update dependencies` |
|
|
19
|
+
| `docs:` | none | `docs: update README` |
|
|
20
|
+
| `ci:` | none | `ci: add linting step` |
|
|
21
|
+
| `style:` | none | `style: format code` |
|
|
22
|
+
| `test:` | none | `test: add unit tests` |
|
|
23
|
+
|
|
24
|
+
## Breaking changes
|
|
25
|
+
|
|
26
|
+
A breaking change can be indicated in two ways:
|
|
27
|
+
|
|
28
|
+
**Exclamation mark suffix:**
|
|
29
|
+
|
|
30
|
+
```
|
|
31
|
+
feat!: remove the /v1/users endpoint
|
|
32
|
+
fix!: change authentication header format
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
**`BREAKING CHANGE` footer:**
|
|
36
|
+
|
|
37
|
+
```
|
|
38
|
+
feat: redesign the API
|
|
39
|
+
|
|
40
|
+
BREAKING CHANGE: The /v1/users endpoint has been removed. Use /v2/users instead.
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Both produce a **major** version bump.
|
|
44
|
+
|
|
45
|
+
## Scope
|
|
46
|
+
|
|
47
|
+
Scopes are optional and ignored for bump calculation. They're useful for readability:
|
|
48
|
+
|
|
49
|
+
```
|
|
50
|
+
feat(auth): add OAuth2 support → minor bump
|
|
51
|
+
fix(db): correct index on user table → patch bump
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## No release
|
|
55
|
+
|
|
56
|
+
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.
|
|
57
|
+
|
|
58
|
+
## Multiple commits
|
|
59
|
+
|
|
60
|
+
When multiple commits are present since the last tag, FerrFlow takes the **highest** bump across all of them:
|
|
61
|
+
|
|
62
|
+
```
|
|
63
|
+
fix: correct typo → patch
|
|
64
|
+
feat: add export button → minor ← wins
|
|
65
|
+
chore: lint → none
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
Result: **minor** bump.
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: GitHub Actions
|
|
3
|
+
description: Run FerrFlow releases automatically in GitHub Actions.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
## Using the official action
|
|
7
|
+
|
|
8
|
+
The easiest way to use FerrFlow in GitHub Actions is the `FerrLabs/ferrflow@v1` action. It installs the binary and runs `ferrflow release` automatically.
|
|
9
|
+
|
|
10
|
+
```yaml
|
|
11
|
+
name: Release
|
|
12
|
+
|
|
13
|
+
on:
|
|
14
|
+
push:
|
|
15
|
+
branches: [main]
|
|
16
|
+
|
|
17
|
+
jobs:
|
|
18
|
+
release:
|
|
19
|
+
runs-on: ubuntu-latest
|
|
20
|
+
permissions:
|
|
21
|
+
contents: write # required to push tags and create releases
|
|
22
|
+
steps:
|
|
23
|
+
- uses: actions/checkout@v6
|
|
24
|
+
with:
|
|
25
|
+
fetch-depth: 0 # full history needed for commit scanning
|
|
26
|
+
token: ${{ secrets.GITHUB_TOKEN }}
|
|
27
|
+
|
|
28
|
+
- uses: FerrLabs/ferrflow@v1
|
|
29
|
+
env:
|
|
30
|
+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
<aside class="ferr-aside ferr-aside--warning"><div class="ferr-aside__body"><p><code>fetch-depth: 0</code> is required. Without it, FerrFlow cannot find previous tags and will treat every commit as new.</p>
|
|
34
|
+
</div></aside>
|
|
35
|
+
|
|
36
|
+
## Permissions
|
|
37
|
+
|
|
38
|
+
FerrFlow needs `contents: write` to:
|
|
39
|
+
|
|
40
|
+
- Push version bump commits
|
|
41
|
+
- Create and push git tags
|
|
42
|
+
- Create GitHub Releases
|
|
43
|
+
|
|
44
|
+
If your repository has branch protection rules, create a dedicated token with the necessary permissions and pass it as `FERRFLOW_TOKEN` or configure the action's `token` input.
|
|
45
|
+
|
|
46
|
+
## Accessing the release output
|
|
47
|
+
|
|
48
|
+
The action exposes the new version as an output you can use in downstream steps:
|
|
49
|
+
|
|
50
|
+
```yaml
|
|
51
|
+
- uses: FerrLabs/ferrflow@v1
|
|
52
|
+
id: ferrflow
|
|
53
|
+
env:
|
|
54
|
+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
55
|
+
|
|
56
|
+
- name: Build Docker image
|
|
57
|
+
if: steps.ferrflow.outputs.version != ''
|
|
58
|
+
run: |
|
|
59
|
+
docker build -t myimage:${{ steps.ferrflow.outputs.version }} .
|
|
60
|
+
docker push myimage:${{ steps.ferrflow.outputs.version }}
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## Skip CI on release commits
|
|
64
|
+
|
|
65
|
+
FerrFlow commits version bumps with `[skip ci]` in the message by default to prevent infinite loops. No extra configuration needed.
|
|
66
|
+
|
|
67
|
+
## Monorepo example
|
|
68
|
+
|
|
69
|
+
In a monorepo, FerrFlow releases each changed package in a single run:
|
|
70
|
+
|
|
71
|
+
```yaml
|
|
72
|
+
- uses: FerrLabs/ferrflow@v1
|
|
73
|
+
env:
|
|
74
|
+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
75
|
+
# Creates api@v1.3.0 and site@v0.5.1 in one step if both changed
|
|
76
|
+
```
|