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.
Package isolation
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.
[[package]]
name = "api"
path = "packages/api" # only commits touching packages/api/ trigger api releases
[[package]]
name = "site"
path = "packages/site" # only commits touching packages/site/ trigger site releases
Shared dependencies
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:
[[package]]
name = "api"
path = "packages/api"
shared_paths = ["packages/shared/"] # changing shared/ also releases api
[[package]]
name = "site"
path = "packages/site"
shared_paths = ["packages/shared/"] # and also releases site
Git tag format
Each package gets its own tag namespace: {name}@v{version}.
api@v1.2.0
site@v0.4.1
FerrFlow looks for the most recent tag matching {name}@v* to determine what commits are new.
Independent cadences
Packages release independently. In a single ferrflow release run:
apimay bump from1.2.0→1.3.0(newfeat:commit)sitemay bump from0.4.0→0.4.1(onlyfix:commits)sharedmay not release at all (onlychore:commits)