JSON
Used by Node.js (package.json).
FerrFlow updates the top-level version field.
{
"name": "my-package",
"version": "1.2.3"
}
TOML
Used by Rust (Cargo.toml) and Python (pyproject.toml).
FerrFlow updates the version field under [package], [project], or [tool.poetry].
[package]
name = "my-crate"
version = "1.2.3" # ← updated
XML
Used by Java/Maven (pom.xml).
FerrFlow updates the first <version> element it encounters.
<project>
<groupId>com.example</groupId>
<artifactId>my-app</artifactId>
<version>1.2.3</version> <!-- updated -->
</project>
Gradle
Used by Java/Kotlin Gradle projects (build.gradle, build.gradle.kts).
FerrFlow updates the version = "..." assignment.
version = "1.2.3" // updated
Plain text
Used for simple version files (VERSION, VERSION.txt).
FerrFlow replaces the entire file content with the version number.
1.2.3
Go
Used by Go projects (go.mod).
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).
On a brand-new repo with no matching tag yet, FerrFlow v3+ bootstraps from the strategy's zero value (0.0.0 for semver, 0 for sequential, …) and creates the first real tag itself — you do not need to run git tag … v0.0.0 before the first release. See how release picks the baseline.
Helm
Used by Kubernetes Helm charts (Chart.yaml).
FerrFlow updates the version field and, when present, keeps appVersion in sync.
The newer chartyaml alias is functionally equivalent — use whichever reads more naturally in your config.
apiVersion: v2
name: my-app
version: 1.2.3 # ← updated
appVersion: "1.2.3" # ← updated when present
Dart
Used by Dart and Flutter packages (pubspec.yaml).
FerrFlow updates the top-level version: key, leaving dependency versions, anchors, and comments intact. SemVer build suffixes (1.2.3+42) are supported.
name: my_app
version: 1.2.3+42 # ← updated
dependencies:
some_pkg:
version: 2.0.0 # untouched — this is a dep constraint
Config snippet:
[[package.versioned_files]]
path = "pubspec.yaml"
format = "pubspecyaml"
Elixir
Used by Elixir / Mix projects (mix.exs).
FerrFlow updates the first version: "…" literal it finds — the canonical spot is inside def project do [ ..., version: "x.y.z", ... ] end.
def project do
[
app: :my_app,
version: "1.2.3", # ← updated
elixir: "~> 1.15",
deps: deps()
]
end
Config snippet:
[[package.versioned_files]]
path = "mix.exs"
format = "mixexs"
Ruby
Used by Ruby gems (*.gemspec).
FerrFlow updates the .version = "…" assignment. Any receiver name works (s, spec, gem, …). Setting version from a constant (s.version = MyGem::VERSION) isn't covered — version the loaded version.rb file directly in that case.
Gem::Specification.new do |s|
s.name = "my_gem"
s.version = "1.2.3" # ← updated
end
Config snippet:
[[package.versioned_files]]
path = "my_gem.gemspec"
format = "gemspec"
Swift
Used by Swift packages (Package.swift).
Swift PM derives a package's version from git tags, so there's no canonical location inside Package.swift — FerrFlow updates the first let <name>Version = "…" declaration. Constant names must end with Version (e.g. packageVersion, AppVersion) or be literally version. Dependency .package(url:..., from: "…") arguments are not touched.
import PackageDescriptionlet packageVersion = "1.2.3" // ← updated
let package = Package( name: "MyPackage", dependencies: [ .package(url: "…", from: "1.5.0"), // untouched ] )
Config snippet:
[[package.versioned_files]]
path = "Package.swift"
format = "packageswift"
File → format quick reference
| File | format |
Selector / behaviour |
|---|---|---|
Cargo.toml |
toml |
package.version |
pyproject.toml |
toml |
project.version or tool.poetry.version |
package.json |
json |
version |
composer.json |
json |
version |
pom.xml |
xml |
first tag |
*.csproj |
csproj |
in |
build.gradle, build.gradle.kts |
gradle |
version = "…" |
Chart.yaml |
helm or chartyaml |
top-level version: |
pubspec.yaml |
pubspecyaml |
top-level version: |
mix.exs |
mixexs |
version: "…" in project keyword list |
*.gemspec |
gemspec |
|
Package.swift |
packageswift |
top-level let |
go.mod |
gomod |
git tag only — no file write |
VERSION, VERSION.txt |
txt |
entire file content |
Multiple files per package
A package can have as many versioned file entries as needed:
JSON
{
"package": [
{
"versionedFiles": [
{ "path": "Cargo.toml", "format": "toml" },
{ "path": "npm/package.json", "format": "json" }
]
}
]
}
TOML
[[package.versioned_files]] path = "Cargo.toml" format = "toml"
[[package.versioned_files]] path = "npm/package.json" format = "json"
JSON5
{
package: [
{
versionedFiles: [
{ path: "Cargo.toml", format: "toml" },
{ path: "npm/package.json", format: "json" },
],
},
],
}
Both files will be updated to the same version before the git commit.