From 9e03c34bf4f4f53fd0b1ff9ea4a356677760985d Mon Sep 17 00:00:00 2001 From: BryanFRD Date: Sat, 10 Oct 2026 13:18:12 +0200 Subject: [PATCH] docs: repair changelog sentences broken by the dash removal --- .../changelog/2026-06-07-ferrflow-bot-release-rulesets.md | 2 +- .../changelog/2026-06-16-ferrflow-declarative-publishers.md | 4 ++-- docs/site/changelog/2026-06-25-ferrflow-jobs-flag.md | 4 ++-- .../site/changelog/2026-06-25-ferrflow-publish-tag-scope.md | 4 ++-- docs/site/changelog/2026-06-26-ferrflow-arm-targets.md | 4 ++-- .../2026-07-16-ferrflow-migrate-semantic-release.md | 4 ++-- .../site/changelog/2026-07-17-ferrflow-telemetry-removed.md | 2 +- .../2026-07-18-ferrflow-breaking-change-variants.md | 4 ++-- docs/site/changelog/2026-07-18-ferrflow-commit-graph.md | 2 +- docs/site/changelog/2026-07-18-ferrflow-doctor.md | 6 +++--- .../site/changelog/2026-07-18-ferrflow-schema-subcommand.md | 2 +- .../2026-07-18-ferrflow-selfhosted-forge-autodetect.md | 2 +- .../site/changelog/2026-07-20-ferrflow-hook-all-packages.md | 2 +- .../site/changelog/2026-07-20-ferrflow-rich-hook-context.md | 4 ++-- docs/site/changelog/2026-07-21-ferrflow-hook-release-url.md | 2 +- docs/site/changelog/2026-07-21-ferrflow-hosted-api.md | 2 +- docs/site/changelog/2026-07-21-ferrflow-migrate-js-yaml.md | 4 ++-- .../changelog/2026-07-21-ferrflow-migrate-more-tools.md | 2 +- .../changelog/2026-07-21-ferrflow-persistent-release-pr.md | 6 +++--- .../2026-07-25-ferrflow-concurrent-release-replan.md | 2 +- .../changelog/2026-07-27-ferrflow-cabal-cmake-formats.md | 2 +- docs/site/changelog/2026-07-27-ferrflow-cosign-bundles.md | 2 +- .../changelog/2026-07-27-ferrflow-tags-before-releases.md | 6 +++--- .../2026-07-28-ferrflow-changesets-workspace-discovery.md | 2 +- .../changelog/2026-08-04-ferrflow-diff-package-scope.md | 4 ++-- docs/site/changelog/2026-08-05-ferrflow-api-own-domain.md | 2 +- .../changelog/2026-08-07-ferrflow-action-input-hardening.md | 4 ++-- docs/site/changelog/2026-08-07-ferrflow-mit-license.md | 4 ++-- .../site/changelog/2026-08-07-ferrflow-verified-installs.md | 4 ++-- docs/site/changelog/2026-08-10-ferrflow-commit-formats.md | 4 ++-- 30 files changed, 49 insertions(+), 49 deletions(-) diff --git a/docs/site/changelog/2026-06-07-ferrflow-bot-release-rulesets.md b/docs/site/changelog/2026-06-07-ferrflow-bot-release-rulesets.md index 8905002b..26d68d67 100644 --- a/docs/site/changelog/2026-06-07-ferrflow-bot-release-rulesets.md +++ b/docs/site/changelog/2026-06-07-ferrflow-bot-release-rulesets.md @@ -11,7 +11,7 @@ Releases run with `bot: true` now push correctly even when your release branch i ### Why it happened -`actions/checkout` persists your workflow's `GITHUB_TOKEN` as an `http..extraheader` git config entry. An HTTP extra-header outranks a credential helper, so even though FerrFlow swaps in its OIDC-minted bot token, git kept sending the original `GITHUB_TOKEN` on every push. The release commit therefore landed as `github-actions[bot]`. Which is not a bypass actor: and the ruleset rejected it. +`actions/checkout` persists your workflow's `GITHUB_TOKEN` as an `http..extraheader` git config entry. An HTTP extra-header outranks a credential helper, so even though FerrFlow swaps in its OIDC-minted bot token, git kept sending the original `GITHUB_TOKEN` on every push. The release commit therefore landed as `github-actions[bot]`, which is not a bypass actor, and the ruleset rejected it. ### What changes diff --git a/docs/site/changelog/2026-06-16-ferrflow-declarative-publishers.md b/docs/site/changelog/2026-06-16-ferrflow-declarative-publishers.md index a337f092..807d8dfe 100644 --- a/docs/site/changelog/2026-06-16-ferrflow-declarative-publishers.md +++ b/docs/site/changelog/2026-06-16-ferrflow-declarative-publishers.md @@ -1,6 +1,6 @@ --- -title: 'FerrFlow: declarative publishers: publish to cargo, npm, docker, helm & more on release' -summary: 'FerrFlow can now publish your packages to registries declaratively from ferrflow.json: cargo, npm, docker (multi-arch + Sigstore), helm, GitHub release assets and webhooks: replacing hand-rolled postPublish shell hooks. Shipped across FerrFlow v5.4–v5.7.' +title: 'FerrFlow: declarative publishers (publish to cargo, npm, docker, helm & more on release)' +summary: 'FerrFlow can now publish your packages to registries declaratively from ferrflow.json (cargo, npm, docker with multi-arch + Sigstore, helm, GitHub release assets and webhooks), replacing hand-rolled postPublish shell hooks. Shipped across FerrFlow v5.4 to v5.7.' date: 2026-06-16T10:00:00Z product: ferrflow type: new diff --git a/docs/site/changelog/2026-06-25-ferrflow-jobs-flag.md b/docs/site/changelog/2026-06-25-ferrflow-jobs-flag.md index f413ea4e..b94ce230 100644 --- a/docs/site/changelog/2026-06-25-ferrflow-jobs-flag.md +++ b/docs/site/changelog/2026-06-25-ferrflow-jobs-flag.md @@ -8,10 +8,10 @@ prLink: https://github.com/FerrLabs/FerrFlow/pull/598 docsLink: https://ferrflow.com/docs/reference/cli/#global-flags --- -Since FerrFlow started planning packages and creating releases in parallel, two needs emerged: capping CPU use on small CI runners, and keeping benchmark numbers reproducible regardless of a machine's core count. The new global `--jobs ` flag: or the `FERRFLOW_JOBS` env var, with the flag taking precedence: covers both. +Since FerrFlow started planning packages and creating releases in parallel, two needs emerged: capping CPU use on small CI runners, and keeping benchmark numbers reproducible regardless of a machine's core count. The new global `--jobs ` flag (or the `FERRFLOW_JOBS` env var, with the flag taking precedence) covers both. - **Default (unset):** all logical cores, exactly as before. -- **`--jobs N`:** caps per-package planning to N threads, and bounds the release-creation HTTP pool by N too: so `--jobs 1` makes the whole run single-threaded. +- **`--jobs N`:** caps per-package planning to N threads, and bounds the release-creation HTTP pool by N too, so `--jobs 1` makes the whole run single-threaded. ```bash # Pin to one thread: deterministic, light on a 2-core runner diff --git a/docs/site/changelog/2026-06-25-ferrflow-publish-tag-scope.md b/docs/site/changelog/2026-06-25-ferrflow-publish-tag-scope.md index f8dde28e..10be3a51 100644 --- a/docs/site/changelog/2026-06-25-ferrflow-publish-tag-scope.md +++ b/docs/site/changelog/2026-06-25-ferrflow-publish-tag-scope.md @@ -1,6 +1,6 @@ --- title: 'FerrFlow: ferrflow publish auto-scopes to the triggering tag' -summary: 'ferrflow publish now figures out which package to publish from the tag that triggered the run: so one workflow publishes each package on its own tag, no per-package wiring. It also takes multiple package names, and a --all flag to force everything.' +summary: 'ferrflow publish now figures out which package to publish from the tag that triggered the run, so one workflow publishes each package on its own tag, no per-package wiring. It also takes multiple package names, and a --all flag to force everything.' date: 2026-06-25T11:00:00Z product: ferrflow type: new @@ -8,7 +8,7 @@ prLink: https://github.com/FerrLabs/FerrFlow/pull/602 docsLink: https://ferrflow.com/docs/reference/cli/#ferrflow-publish --- -`ferrflow publish` runs your declarative publishers in a separate CI job. Until now it published one named package or all of them: which meant a tag-triggered job had to parse `api@v2.2.1` and pass `api` itself. No more: `ferrflow publish` reads the triggering tag (`GITHUB_REF` / `CI_COMMIT_TAG`) and publishes just that package. +`ferrflow publish` runs your declarative publishers in a separate CI job. Until now it published one named package or all of them, which meant a tag-triggered job had to parse `api@v2.2.1` and pass `api` itself. No more: `ferrflow publish` reads the triggering tag (`GITHUB_REF` / `CI_COMMIT_TAG`) and publishes just that package. So a single workflow handles a whole monorepo. Every package publishes on its own tag, with zero per-package wiring: diff --git a/docs/site/changelog/2026-06-26-ferrflow-arm-targets.md b/docs/site/changelog/2026-06-26-ferrflow-arm-targets.md index b7cebfa4..6c81db81 100644 --- a/docs/site/changelog/2026-06-26-ferrflow-arm-targets.md +++ b/docs/site/changelog/2026-06-26-ferrflow-arm-targets.md @@ -1,6 +1,6 @@ --- title: 'FerrFlow: Windows arm64 and Linux armv7 prebuilt binaries' -summary: 'FerrFlow now ships prebuilt, signed binaries: and matching npm packages: for Windows on ARM (aarch64) and 32-bit ARM Linux (armv7). The release matrix grows from 5 targets to 7, so `npm i ferrflow` and direct downloads now work on Surface/Snapdragon Windows laptops and 32-bit Raspberry Pi / SBCs.' +summary: 'FerrFlow now ships prebuilt, signed binaries (and matching npm packages) for Windows on ARM (aarch64) and 32-bit ARM Linux (armv7). The release matrix grows from 5 targets to 7, so `npm i ferrflow` and direct downloads now work on Surface/Snapdragon Windows laptops and 32-bit Raspberry Pi / SBCs.' date: 2026-06-26T10:00:00Z product: ferrflow type: new @@ -8,7 +8,7 @@ prLink: https://github.com/FerrLabs/FerrFlow/pull/607 docsLink: https://ferrflow.com/docs/verifying-releases/ --- -ARM64 was already covered on Linux and macOS, but not Windows: and 32-bit ARM Linux had no build at all. This release closes both gaps, taking the target matrix to seven. +ARM64 was already covered on Linux and macOS, but not Windows, and 32-bit ARM Linux had no build at all. This release closes both gaps, taking the target matrix to seven. Two new targets ship with every release, signed with Sigstore and listed in the SBOM exactly like the existing five: diff --git a/docs/site/changelog/2026-07-16-ferrflow-migrate-semantic-release.md b/docs/site/changelog/2026-07-16-ferrflow-migrate-semantic-release.md index e2e713bc..983f217f 100644 --- a/docs/site/changelog/2026-07-16-ferrflow-migrate-semantic-release.md +++ b/docs/site/changelog/2026-07-16-ferrflow-migrate-semantic-release.md @@ -1,6 +1,6 @@ --- title: 'FerrFlow: Migrate from semantic-release in one command' -summary: 'A new `ferrflow migrate` command reads your existing `.releaserc` and generates the equivalent FerrFlow config: mapping tag format, branches, and the common plugins, and surfacing anything without an equivalent instead of guessing.' +summary: 'A new `ferrflow migrate` command reads your existing `.releaserc` and generates the equivalent FerrFlow config, mapping tag format, branches, and the common plugins, and surfacing anything without an equivalent instead of guessing.' date: 2026-07-16T09:00:00Z product: ferrflow type: new @@ -23,7 +23,7 @@ It maps what has a FerrFlow equivalent: - `@semantic-release/exec` → hooks (`prepareCmd` → `preBump`, `publishCmd` → `postPublish`, and the rest) - `@semantic-release/github` / `gitlab` → `forge` -The point is what it does with the rest. Anything without a FerrFlow equivalent is **surfaced, never guessed**: `@semantic-release/npm`, custom `commit-analyzer` release rules, and `repositoryUrl` are each reported with a note on what to do, not silently dropped. The command prints a summary of what mapped, what it ignored, and what needs a manual look: and it won't overwrite a config you already have. +The point is what it does with the rest. Anything without a FerrFlow equivalent is **surfaced, never guessed**: `@semantic-release/npm`, custom `commit-analyzer` release rules, and `repositoryUrl` are each reported with a note on what to do, not silently dropped. The command prints a summary of what mapped, what it ignored, and what needs a manual look, and it won't overwrite a config you already have. ``` Migrated semantic-release config from .releaserc → ferrflow.json diff --git a/docs/site/changelog/2026-07-17-ferrflow-telemetry-removed.md b/docs/site/changelog/2026-07-17-ferrflow-telemetry-removed.md index fb70a9d0..5e0ad3b7 100644 --- a/docs/site/changelog/2026-07-17-ferrflow-telemetry-removed.md +++ b/docs/site/changelog/2026-07-17-ferrflow-telemetry-removed.md @@ -1,6 +1,6 @@ --- title: 'FerrFlow: Telemetry removed. The CLI no longer phones home' -summary: 'FerrFlow no longer collects any usage telemetry. The module is gone from the binary entirely, along with the network calls it made on every command: which also makes monorepo commands dramatically faster.' +summary: 'FerrFlow no longer collects any usage telemetry. The module is gone from the binary entirely, along with the network calls it made on every command, which also makes monorepo commands dramatically faster.' date: 2026-07-17T15:00:00Z product: ferrflow type: new diff --git a/docs/site/changelog/2026-07-18-ferrflow-breaking-change-variants.md b/docs/site/changelog/2026-07-18-ferrflow-breaking-change-variants.md index 7cd8800a..e973673c 100644 --- a/docs/site/changelog/2026-07-18-ferrflow-breaking-change-variants.md +++ b/docs/site/changelog/2026-07-18-ferrflow-breaking-change-variants.md @@ -1,6 +1,6 @@ --- title: 'FerrFlow: Robust BREAKING CHANGE detection' -summary: 'FerrFlow now recognises mixed-case, hyphenated, and lowercase `BREAKING CHANGE` footers: and a `!` typed inside the scope (`feat(api!):`): so a real breaking change no longer slips through and skips the major bump.' +summary: 'FerrFlow now recognises mixed-case, hyphenated, and lowercase `BREAKING CHANGE` footers, and a `!` typed inside the scope (`feat(api!):`), so a real breaking change no longer slips through and skips the major bump.' date: 2026-07-18T11:00:00Z product: ferrflow type: fix @@ -12,7 +12,7 @@ A breaking change that FerrFlow doesn't recognise is quietly misclassified: it s Newly detected as breaking: -- **Case-insensitive footers**: `breaking-change:`, `breaking change:`, `Breaking Change:`: alongside the spec's `BREAKING CHANGE:` and `BREAKING-CHANGE:`. +- **Case-insensitive footers**: `breaking-change:`, `breaking change:`, `Breaking Change:`, alongside the spec's `BREAKING CHANGE:` and `BREAKING-CHANGE:`. - **`!` inside the scope**: `feat(api!):`, the common typo for `feat(api)!:`. Detection stays strict where it matters, so a stray mention never triggers an accidental major bump: the footer still has to start a line and be followed by a colon **and a space**, the plural `BREAKING CHANGES:` and prose mentions are ignored, and a `!` that isn't right before the closing paren (`feat(a!b):`) is not a marker. diff --git a/docs/site/changelog/2026-07-18-ferrflow-commit-graph.md b/docs/site/changelog/2026-07-18-ferrflow-commit-graph.md index cbe145f8..aef4b3fa 100644 --- a/docs/site/changelog/2026-07-18-ferrflow-commit-graph.md +++ b/docs/site/changelog/2026-07-18-ferrflow-commit-graph.md @@ -7,7 +7,7 @@ type: perf prLink: https://github.com/FerrLabs/FerrFlow/pull/728 --- -FerrFlow's tag scans and commit walks already read a git commit-graph when one exists, but a fresh clone. Every CI checkout: has a pack and no graph, so the speedup never kicked in where FerrFlow runs most. +FerrFlow's tag scans and commit walks already read a git commit-graph when one exists, but a fresh clone (every CI checkout) has a pack and no graph, so the speedup never kicked in where FerrFlow runs most. Now, on a cold `check` (cache miss) or a real `release`, if the repository has no commit-graph and a history larger than ~1000 commits, FerrFlow writes one with `git commit-graph write --reachable`. On a 200-package, 10k-commit monorepo that trims the walk-heavy portion of a run by roughly 30% on every subsequent invocation. diff --git a/docs/site/changelog/2026-07-18-ferrflow-doctor.md b/docs/site/changelog/2026-07-18-ferrflow-doctor.md index 903ebff5..986baa46 100644 --- a/docs/site/changelog/2026-07-18-ferrflow-doctor.md +++ b/docs/site/changelog/2026-07-18-ferrflow-doctor.md @@ -1,6 +1,6 @@ --- title: 'FerrFlow: ferrflow doctor' -summary: 'A new `ferrflow doctor` subcommand runs read-only diagnostics on your repo, config, and forge setup and prints a categorised report: so "is my setup sane?" has a first-class answer instead of grepping `--verbose` logs.' +summary: 'A new `ferrflow doctor` subcommand runs read-only diagnostics on your repo, config, and forge setup and prints a categorised report, so "is my setup sane?" has a first-class answer instead of grepping `--verbose` logs.' date: 2026-07-18T09:00:00Z product: ferrflow type: new @@ -8,7 +8,7 @@ prLink: https://github.com/FerrLabs/FerrFlow/pull/725 docsLink: https://ferrflow.com/docs/reference/cli#ferrflow-doctor --- -When a release behaved unexpectedly: a wrong bump, a tag that didn't move, no commits detected: the only recourse was `--verbose` and staring at logs. `ferrflow doctor` gives you a first-class health check instead. +When a release behaved unexpectedly (a wrong bump, a tag that didn't move, no commits detected), the only recourse was `--verbose` and staring at logs. `ferrflow doctor` gives you a first-class health check instead. ```bash ferrflow doctor # human report @@ -18,4 +18,4 @@ ferrflow doctor --online # also check the GitHub API rate limit It runs a series of read-only checks and groups them into five sections: **Repo** (git repository, commit history, clean working tree, remote, tags), **Config** (which config file wins, whether it parses, plus the full `ferrflow validate` suite), **Versioning** (strategy and each package's version), **Forge** (detected forge and whether an auth token is present), and **CI** (workflow files, and whether a workflow pins the FerrFlow action). Every check is green, a warning, or an error. -Run it on a fresh checkout and it explains exactly what's missing before your first release; run it on a misconfigured repo and it pinpoints the file or value at fault. The exit code is scriptable: `0` all green, `1` warnings, `2` errors: and `--format json` has a stable shape you can assert on in CI. +Run it on a fresh checkout and it explains exactly what's missing before your first release; run it on a misconfigured repo and it pinpoints the file or value at fault. The exit code is scriptable (`0` all green, `1` warnings, `2` errors), and `--format json` has a stable shape you can assert on in CI. diff --git a/docs/site/changelog/2026-07-18-ferrflow-schema-subcommand.md b/docs/site/changelog/2026-07-18-ferrflow-schema-subcommand.md index 5796c60d..f1ad53f1 100644 --- a/docs/site/changelog/2026-07-18-ferrflow-schema-subcommand.md +++ b/docs/site/changelog/2026-07-18-ferrflow-schema-subcommand.md @@ -1,6 +1,6 @@ --- title: 'FerrFlow: ferrflow schema' -summary: 'A new `ferrflow schema` subcommand prints the config JSON schema that is now bundled into the binary: so editor tooling and pre-commit hooks can validate `.ferrflow.json` completely offline.' +summary: 'A new `ferrflow schema` subcommand prints the config JSON schema that is now bundled into the binary, so editor tooling and pre-commit hooks can validate `.ferrflow.json` completely offline.' date: 2026-07-18T10:00:00Z product: ferrflow type: new diff --git a/docs/site/changelog/2026-07-18-ferrflow-selfhosted-forge-autodetect.md b/docs/site/changelog/2026-07-18-ferrflow-selfhosted-forge-autodetect.md index 0e7c3bf1..c873759a 100644 --- a/docs/site/changelog/2026-07-18-ferrflow-selfhosted-forge-autodetect.md +++ b/docs/site/changelog/2026-07-18-ferrflow-selfhosted-forge-autodetect.md @@ -16,4 +16,4 @@ Now, when FerrFlow doesn't recognise the remote's hostname, it probes the host's - a GitHub Enterprise instance, - or a Gitea / Forgejo instance. -The probe is unauthenticated, short (a ~2s timeout), best-effort, and cached: so a run checks a given host at most once, and a hostname FerrFlow already knows never touches the network. You only need to set `forge` explicitly now if your host isn't reachable over HTTPS or you'd rather skip the probe. +The probe is unauthenticated, short (a ~2s timeout), best-effort, and cached, so a run checks a given host at most once, and a hostname FerrFlow already knows never touches the network. You only need to set `forge` explicitly now if your host isn't reachable over HTTPS or you'd rather skip the probe. diff --git a/docs/site/changelog/2026-07-20-ferrflow-hook-all-packages.md b/docs/site/changelog/2026-07-20-ferrflow-hook-all-packages.md index 84ca6af8..a04bbfa3 100644 --- a/docs/site/changelog/2026-07-20-ferrflow-hook-all-packages.md +++ b/docs/site/changelog/2026-07-20-ferrflow-hook-all-packages.md @@ -1,6 +1,6 @@ --- title: 'FerrFlow: Hooks see the whole release batch' -summary: 'Release hooks now receive `allPackages`. Every package the run bumps, with its new version and bump type: so a monorepo hook can act on the batch, not just its own package.' +summary: 'Release hooks now receive `allPackages` (every package the run bumps, with its new version and bump type), so a monorepo hook can act on the batch, not just its own package.' date: 2026-07-20T16:00:00Z product: ferrflow type: new diff --git a/docs/site/changelog/2026-07-20-ferrflow-rich-hook-context.md b/docs/site/changelog/2026-07-20-ferrflow-rich-hook-context.md index 2e059454..698185c9 100644 --- a/docs/site/changelog/2026-07-20-ferrflow-rich-hook-context.md +++ b/docs/site/changelog/2026-07-20-ferrflow-rich-hook-context.md @@ -1,6 +1,6 @@ --- title: 'FerrFlow: Richer context for release hooks' -summary: Release hooks now receive the rendered changelog, the parsed commits, the list of bumped files, and whether the run is a monorepo or pre-release. Both as `FERRFLOW_*` env vars and on the JS/TS `ctx` object. +summary: Release hooks now receive the rendered changelog, the parsed commits, the list of bumped files, and whether the run is a monorepo or pre-release, both as `FERRFLOW_*` env vars and on the JS/TS `ctx` object. date: 2026-07-20T12:00:00Z product: ferrflow type: new @@ -14,7 +14,7 @@ Every hook now gets the full picture. Shell hooks read new `FERRFLOW_*` environm - `changelog`: the rendered changelog section for this bump, in markdown. - `commits`: the commits in the bump as structured objects (`hash`, `message`, `type`, `scope`, `breaking`), so you can branch on a breaking change instead of grepping a string. -- `bumpedFiles`. Every file the release actually modified, with its format. +- `bumpedFiles`: every file the release actually modified, with its format. - `monorepo` and `isPrerelease`: flags to tell a workspace release apart from a single-package one, and a channel pre-release from a stable one. `commits` and `bumpedFiles` arrive as real arrays in function hooks (`FERRFLOW_COMMITS_JSON` / `FERRFLOW_BUMPED_FILES_JSON` as JSON for shell hooks, ready to pipe through `jq`): diff --git a/docs/site/changelog/2026-07-21-ferrflow-hook-release-url.md b/docs/site/changelog/2026-07-21-ferrflow-hook-release-url.md index 80cebef4..bdb514b0 100644 --- a/docs/site/changelog/2026-07-21-ferrflow-hook-release-url.md +++ b/docs/site/changelog/2026-07-21-ferrflow-hook-release-url.md @@ -1,6 +1,6 @@ --- title: 'FerrFlow: Post-publish hooks get the release URL' -summary: '`postPublish` hooks now receive `releaseUrl`: the URL of the GitHub/GitLab release FerrFlow just created: so you can link to it from a Slack notification, a dashboard, or a downstream job.' +summary: '`postPublish` hooks now receive `releaseUrl` (the URL of the GitHub/GitLab release FerrFlow just created), so you can link to it from a Slack notification, a dashboard, or a downstream job.' date: 2026-07-21T08:00:00Z product: ferrflow type: new diff --git a/docs/site/changelog/2026-07-21-ferrflow-hosted-api.md b/docs/site/changelog/2026-07-21-ferrflow-hosted-api.md index a64f8dce..94636463 100644 --- a/docs/site/changelog/2026-07-21-ferrflow-hosted-api.md +++ b/docs/site/changelog/2026-07-21-ferrflow-hosted-api.md @@ -1,6 +1,6 @@ --- title: 'FerrFlow: Hosted API for validate, preview, schema and releases' -summary: 'A new hosted API at api.ferrlabs.com/v1/ferrflow/* lets you validate a config, preview version bumps and changelog, fetch the config JSON Schema, and resolve the latest release: over HTTP, with results identical to the CLI.' +summary: 'A new hosted API at api.ferrlabs.com/v1/ferrflow/* lets you validate a config, preview version bumps and changelog, fetch the config JSON Schema, and resolve the latest release, over HTTP, with results identical to the CLI.' date: 2026-07-21T16:00:00Z product: ferrflow type: new diff --git a/docs/site/changelog/2026-07-21-ferrflow-migrate-js-yaml.md b/docs/site/changelog/2026-07-21-ferrflow-migrate-js-yaml.md index 619cfe8a..12f58f17 100644 --- a/docs/site/changelog/2026-07-21-ferrflow-migrate-js-yaml.md +++ b/docs/site/changelog/2026-07-21-ferrflow-migrate-js-yaml.md @@ -1,6 +1,6 @@ --- title: 'FerrFlow: Migrate reads JS and YAML configs' -summary: '`ferrflow migrate` now imports JavaScript and YAML release configs directly: `.releaserc.js`, `release.config.js`, `.releaserc.yaml`, `.versionrc.js`, and friends: not just JSON, so you no longer have to hand-convert your config before migrating.' +summary: '`ferrflow migrate` now imports JavaScript and YAML release configs directly (`.releaserc.js`, `release.config.js`, `.releaserc.yaml`, `.versionrc.js`, and friends), not just JSON, so you no longer have to hand-convert your config before migrating.' date: 2026-07-21T14:00:00Z product: ferrflow type: new @@ -10,7 +10,7 @@ docsLink: https://ferrflow.com/docs/reference/cli Plenty of semantic-release and standard-version setups keep their config in JavaScript (`release.config.js`) or YAML (`.releaserc.yaml`) rather than JSON. `ferrflow migrate` used to read JSON only and told you to convert the rest by hand first. -Now it reads them directly. A JavaScript config is evaluated with `node`. It imports the config, resolves it if it's a function, and reads the result: the same way FerrFlow already runs your `ferrflow.js` config, run locally against your own repo. A YAML config is parsed straight through. Both then feed the existing converters, so the mapping and the mapped/ignored/review report are identical to the JSON path. +Now it reads them directly. A JavaScript config is evaluated with `node`, which imports the config, resolves it if it's a function, and reads the result, the same way FerrFlow already runs your `ferrflow.js` config, locally against your own repo. A YAML config is parsed straight through. Both then feed the existing converters, so the mapping and the mapped/ignored/review report are identical to the JSON path. ```bash ferrflow migrate # auto-detects .releaserc.js, .releaserc.yaml, release.config.js, … diff --git a/docs/site/changelog/2026-07-21-ferrflow-migrate-more-tools.md b/docs/site/changelog/2026-07-21-ferrflow-migrate-more-tools.md index bb20236f..d1fee5af 100644 --- a/docs/site/changelog/2026-07-21-ferrflow-migrate-more-tools.md +++ b/docs/site/changelog/2026-07-21-ferrflow-migrate-more-tools.md @@ -1,6 +1,6 @@ --- title: 'FerrFlow: Migrate from changesets, release-please & standard-version' -summary: '`ferrflow migrate` now imports configs from changesets, release-please, and standard-version too: not just semantic-release: generating an equivalent `ferrflow.json` and a report of what mapped, what was ignored, and what needs a look.' +summary: '`ferrflow migrate` now imports configs from changesets, release-please, and standard-version too (not just semantic-release), generating an equivalent `ferrflow.json` and a report of what mapped, what was ignored, and what needs a look.' date: 2026-07-21T13:00:00Z product: ferrflow type: new diff --git a/docs/site/changelog/2026-07-21-ferrflow-persistent-release-pr.md b/docs/site/changelog/2026-07-21-ferrflow-persistent-release-pr.md index 8a5f8160..7b82dad7 100644 --- a/docs/site/changelog/2026-07-21-ferrflow-persistent-release-pr.md +++ b/docs/site/changelog/2026-07-21-ferrflow-persistent-release-pr.md @@ -1,6 +1,6 @@ --- title: 'FerrFlow: One persistent release PR' -summary: 'In `releaseCommitMode: pr`, FerrFlow now keeps a single long-lived release pull request and updates it on each new commit, instead of opening a fresh PR: and leaving a stale one. Every time the version changes.' +summary: 'In `releaseCommitMode: pr`, FerrFlow now keeps a single long-lived release pull request and updates it on each new commit, instead of opening a fresh PR (and leaving a stale one) every time the version changes.' date: 2026-07-21T10:00:00Z product: ferrflow type: new @@ -10,8 +10,8 @@ docsLink: https://ferrflow.com/docs/configuration/config-file `releaseCommitMode: pr` opens your version bump and changelog as a pull request instead of committing straight to the branch. Until now that PR was tied to the version it was opened for, so a second `feat:` landing before you merged spawned a _new_ PR and left the first one stale. You'd end up with a pile of `v1.3.0`, `v1.4.0`, … release PRs to clean up. -Now it's one PR. FerrFlow keeps a single release branch per target: `ferrflow/release-`: and on every new commit it recomputes the version and changelog and force-pushes that same branch, so the open PR's title and body update in place. This is the release-please / Changesets model. +Now it's one PR. FerrFlow keeps a single release branch per target (`ferrflow/release-`), and on every new commit it recomputes the version and changelog and force-pushes that same branch, so the open PR's title and body update in place. This is the release-please / Changesets model. `autoMergeReleases` (default `true`) re-enables auto-merge on each update, and is a no-op when off: the PR just waits for a human. PR mode works on GitHub and GitLab. -It also won't stomp on your work: if you push a commit onto the release branch yourself: a review fix, say: FerrFlow notices it isn't a `chore(release):` commit, warns, and leaves the branch and PR untouched for that run rather than force-pushing over it. +It also won't stomp on your work: if you push a commit onto the release branch yourself (a review fix, say), FerrFlow notices it isn't a `chore(release):` commit, warns, and leaves the branch and PR untouched for that run rather than force-pushing over it. diff --git a/docs/site/changelog/2026-07-25-ferrflow-concurrent-release-replan.md b/docs/site/changelog/2026-07-25-ferrflow-concurrent-release-replan.md index 5d8c1c3b..17d43cd0 100644 --- a/docs/site/changelog/2026-07-25-ferrflow-concurrent-release-replan.md +++ b/docs/site/changelog/2026-07-25-ferrflow-concurrent-release-replan.md @@ -1,6 +1,6 @@ --- title: 'FerrFlow: Concurrent releases no longer fail with E2006' -summary: 'When two release runs race, the losing run now replans against the version the winner published instead of aborting with E2006. And no longer silently drops the other packages it was about to release.' +summary: 'When two release runs race, the losing run now replans against the version the winner published instead of aborting with E2006, and no longer silently drops the other packages it was about to release.' date: 2026-07-25T10:00:00Z product: ferrflow type: fix diff --git a/docs/site/changelog/2026-07-27-ferrflow-cabal-cmake-formats.md b/docs/site/changelog/2026-07-27-ferrflow-cabal-cmake-formats.md index 80e12a9a..40937c87 100644 --- a/docs/site/changelog/2026-07-27-ferrflow-cabal-cmake-formats.md +++ b/docs/site/changelog/2026-07-27-ferrflow-cabal-cmake-formats.md @@ -20,4 +20,4 @@ path = "CMakeLists.txt" format = "cmake" ``` -Both formats are careful about the version-shaped things sitting next to the one you actually want. In a `.cabal` file, `cabal-version:` declares which Cabal feature set the file uses: bumping it would change how the file is parsed: so only the top-level `version:` field is touched, and indented `version:` fields inside stanzas are left alone. In CMake, FerrFlow updates the `VERSION` argument of `project()`, including the multi-line form, while `cmake_minimum_required(VERSION …)` and any `set(_VERSION …)` variable stay untouched. +Both formats are careful about the version-shaped things sitting next to the one you actually want. In a `.cabal` file, `cabal-version:` declares which Cabal feature set the file uses (bumping it would change how the file is parsed), so only the top-level `version:` field is touched, and indented `version:` fields inside stanzas are left alone. In CMake, FerrFlow updates the `VERSION` argument of `project()`, including the multi-line form, while `cmake_minimum_required(VERSION …)` and any `set(_VERSION …)` variable stay untouched. diff --git a/docs/site/changelog/2026-07-27-ferrflow-cosign-bundles.md b/docs/site/changelog/2026-07-27-ferrflow-cosign-bundles.md index 68a911b6..a47c7444 100644 --- a/docs/site/changelog/2026-07-27-ferrflow-cosign-bundles.md +++ b/docs/site/changelog/2026-07-27-ferrflow-cosign-bundles.md @@ -8,7 +8,7 @@ prLink: https://github.com/FerrLabs/FerrFlow/pull/774 docsLink: https://ferrflow.com/docs/verifying-releases --- -Sigstore's tooling moved on: cosign v3 replaced the separate signature and certificate outputs with a single bundle that carries both. FerrFlow releases follow suit. Every artifact: the platform tarballs and zips, the completions archive, the SBOM: now ships one `.bundle` sidecar instead of a `.sig` + `.crt` pair. +Sigstore's tooling moved on: cosign v3 replaced the separate signature and certificate outputs with a single bundle that carries both. FerrFlow releases follow suit. Every artifact (the platform tarballs and zips, the completions archive, the SBOM) now ships one `.bundle` sidecar instead of a `.sig` + `.crt` pair. Verification loses a flag: diff --git a/docs/site/changelog/2026-07-27-ferrflow-tags-before-releases.md b/docs/site/changelog/2026-07-27-ferrflow-tags-before-releases.md index 8e6ac44e..219d7152 100644 --- a/docs/site/changelog/2026-07-27-ferrflow-tags-before-releases.md +++ b/docs/site/changelog/2026-07-27-ferrflow-tags-before-releases.md @@ -1,14 +1,14 @@ --- title: 'FerrFlow: Tags are pushed before releases are published' -summary: 'A release run now pushes its tags to the remote before creating the GitHub or Gitea release, so a failure in between can no longer leave a published release pointing at a tag that never landed: and annotated tag messages are no longer silently replaced.' +summary: 'A release run now pushes its tags to the remote before creating the GitHub or Gitea release, so a failure in between can no longer leave a published release pointing at a tag that never landed, and annotated tag messages are no longer silently replaced.' date: 2026-07-27T10:00:00Z product: ferrflow type: fix prLink: https://github.com/FerrLabs/FerrFlow/pull/771 --- -A release run used to create the forge releases first and push the annotated tags afterwards. Any failure in between: a network blip, branch protection, a tag a concurrent run had just taken: left the forge ahead of git: releases published against a ref the remote did not have. +A release run used to create the forge releases first and push the annotated tags afterwards. Any failure in between (a network blip, branch protection, a tag a concurrent run had just taken) left the forge ahead of git: releases published against a ref the remote did not have. -On GitHub and Gitea it also cost you the tag message. FerrFlow sent the release with a target commit, so for a tag that did not exist yet those APIs created it themselves, as a *lightweight* tag. The annotated tag FerrFlow had built: the one carrying the changelog body: was pushed a moment later, pointed at the same commit, and was therefore treated as already synced and skipped. The lightweight tag was what survived. +On GitHub and Gitea it also cost you the tag message. FerrFlow sent the release with a target commit, so for a tag that did not exist yet those APIs created it themselves, as a *lightweight* tag. The annotated tag FerrFlow had built (the one carrying the changelog body) was pushed a moment later, pointed at the same commit, and was therefore treated as already synced and skipped. The lightweight tag was what survived. Tags now land first, and the release is created against a ref that provably exists. FerrFlow no longer sends a target commit at all, so the forge can't invent tags behind git's back, and `git show ` returns the release notes as intended. Pushing and publishing are also separate resume points now: if release creation fails, re-running retries only that step instead of replaying the push. diff --git a/docs/site/changelog/2026-07-28-ferrflow-changesets-workspace-discovery.md b/docs/site/changelog/2026-07-28-ferrflow-changesets-workspace-discovery.md index 63d45f64..9a17ee25 100644 --- a/docs/site/changelog/2026-07-28-ferrflow-changesets-workspace-discovery.md +++ b/docs/site/changelog/2026-07-28-ferrflow-changesets-workspace-discovery.md @@ -10,7 +10,7 @@ docsLink: https://ferrflow.com/docs/reference/cli changesets is a monorepo tool, so migrating from it used to end with the least useful part done by hand: FerrFlow scaffolded a single root package and asked you to list every workspace package yourself. On a repo with thirty packages that's thirty entries to write before anything runs. -The migration now reads the same workspace declaration changesets does: `workspaces` in `package.json` (both the array and the yarn-berry `{ packages: [...] }` form) and `packages:` in `pnpm-workspace.yaml`: expands the globs, and writes one `package` entry per discovered package, each pointing at its own `package.json` and `CHANGELOG.md`. +The migration now reads the same workspace declaration changesets does (`workspaces` in `package.json`, both the array and the yarn-berry `{ packages: [...] }` form, and `packages:` in `pnpm-workspace.yaml`), expands the globs, and writes one `package` entry per discovered package, each pointing at its own `package.json` and `CHANGELOG.md`. The practical win is in the version groups. `linked` and `fixed` name packages by npm name, and those names now match packages that actually exist in the generated config, so it passes `ferrflow validate` straight out of the migration. If a group names something outside the workspace, the migration report says which one rather than leaving you to find out at validation time. diff --git a/docs/site/changelog/2026-08-04-ferrflow-diff-package-scope.md b/docs/site/changelog/2026-08-04-ferrflow-diff-package-scope.md index 7c8d0e51..2c3dfd5f 100644 --- a/docs/site/changelog/2026-08-04-ferrflow-diff-package-scope.md +++ b/docs/site/changelog/2026-08-04-ferrflow-diff-package-scope.md @@ -8,9 +8,9 @@ prLink: https://github.com/FerrLabs/FerrFlow/pull/781 docsLink: https://ferrflow.com/docs/reference/cli --- -`ferrflow diff` compares two tags and shows you what changed between them. In a monorepo it was showing the raw git range. Every commit between the two tags, including the ones that only touched other packages. Asking about your API and being told it shipped a frontend redesign is worse than not asking. +`ferrflow diff` compares two tags and shows you what changed between them. In a monorepo it was showing the raw git range: every commit between the two tags, including the ones that only touched other packages. Asking about your API and being told it shipped a frontend redesign is worse than not asking. -The range is now scoped by path: a commit counts if it touched the package's `path` or one of its `sharedPaths`. That is what the commit list, the breaking-change list and the generated changelog are built from. Which is the whole point of previewing it. +The range is now scoped by path: a commit counts if it touched the package's `path` or one of its `sharedPaths`. That is what the commit list, the breaking-change list and the generated changelog are built from, which is the whole point of previewing it. This entry first said the scoping matched what `ferrflow release` produced. It did not. `release` went on collecting every commit since the package's last tag until that was fixed on 2026-08-29. Between the two dates the preview and the release disagreed, and the preview was the accurate one. diff --git a/docs/site/changelog/2026-08-05-ferrflow-api-own-domain.md b/docs/site/changelog/2026-08-05-ferrflow-api-own-domain.md index da99c14c..a92ef68c 100644 --- a/docs/site/changelog/2026-08-05-ferrflow-api-own-domain.md +++ b/docs/site/changelog/2026-08-05-ferrflow-api-own-domain.md @@ -8,7 +8,7 @@ prLink: https://github.com/FerrLabs/FerrFlow-Cloud/pull/772 docsLink: https://ferrflow.com/docs/reference/api --- -The hosted FerrFlow API: `validate`, `preview`, `latest`, the config schema, and the bot token exchange: was published under the holding company's hostname, `api.ferrlabs.com`. Pointing a `$schema` at a *ferrlabs* URL to validate a *ferrflow* config never read right, and every other product already serves its API from its own domain. It now answers on `api.ferrflow.com`, which is the host the documentation uses from here on. +The hosted FerrFlow API (`validate`, `preview`, `latest`, the config schema, and the bot token exchange) was published under the holding company's hostname, `api.ferrlabs.com`. Pointing a `$schema` at a *ferrlabs* URL to validate a *ferrflow* config never read right, and every other product already serves its API from its own domain. It now answers on `api.ferrflow.com`, which is the host the documentation uses from here on. Paths are unchanged, so moving over is a hostname swap and nothing else: diff --git a/docs/site/changelog/2026-08-07-ferrflow-action-input-hardening.md b/docs/site/changelog/2026-08-07-ferrflow-action-input-hardening.md index 0130196d..244b5d69 100644 --- a/docs/site/changelog/2026-08-07-ferrflow-action-input-hardening.md +++ b/docs/site/changelog/2026-08-07-ferrflow-action-input-hardening.md @@ -7,12 +7,12 @@ type: security prLink: https://github.com/FerrLabs/FerrFlow/pull/810 --- -The FerrFlow GitHub Action built three of its shell steps with `${{ }}` interpolation, which substitutes a value into the script *before* the shell parses it. Any workflow that wired `force_version`, `package` or `version` from data it did not control: an issue title, a `workflow_dispatch` input, a matrix value derived from a pull request: could therefore have had that data executed as shell, in a job that by design holds a repository write token. +The FerrFlow GitHub Action built three of its shell steps with `${{ }}` interpolation, which substitutes a value into the script *before* the shell parses it. Any workflow that wired `force_version`, `package` or `version` from data it did not control (an issue title, a `workflow_dispatch` input, a matrix value derived from a pull request) could therefore have had that data executed as shell, in a job that by design holds a repository write token. All three inputs now reach the step as environment variables, are quoted at every use, and are checked before they are passed on: `version` must be `latest` or a semver triple, `force_version` must be `VERSION` or `NAME@VERSION`, and each entry in `package` must look like a package name. Anything else fails the step with a clear message instead of running. Arguments are assembled into an array and passed as `ferrflow "${args[@]}"`, so a value containing spaces or shell metacharacters is one inert argument rather than parsed source. -**What you need to do:** nothing beyond moving to a current version of the Action. No input changed name, shape or meaning. If you were passing a value that does not match the formats above: a version string with unusual characters, for instance. The step will now tell you rather than silently doing something else. +**What you need to do:** nothing beyond moving to a current version of the Action. No input changed name, shape or meaning. If you were passing a value that does not match the formats above (a version string with unusual characters, for instance), the step will now tell you rather than silently doing something else. Also fixed in the same change: `mode: publish` did not forward the `bot` inputs, so `bot: true` combined with `mode: publish` silently ran without the hosted bot token. diff --git a/docs/site/changelog/2026-08-07-ferrflow-mit-license.md b/docs/site/changelog/2026-08-07-ferrflow-mit-license.md index fad7352a..9b601ca5 100644 --- a/docs/site/changelog/2026-08-07-ferrflow-mit-license.md +++ b/docs/site/changelog/2026-08-07-ferrflow-mit-license.md @@ -9,7 +9,7 @@ prLink: https://github.com/FerrLabs/FerrFlow/pull/813 FerrFlow is now distributed under the MIT licence instead of MPL-2.0. This applies to the CLI, the Rust library published on crates.io, the `ferrflow` npm package and its platform binaries, and the WASM build. -MPL-2.0 is weak copyleft: modify a FerrFlow source file and you had to publish that file. In practice that obligation almost never applied. FerrFlow is invoked, not linked: but it was enough to route the tool into legal review at organisations whose dependency policy allowlists MIT, BSD and Apache and flags everything else. That review always ended in approval, and always cost weeks. MIT removes the question. +MPL-2.0 is weak copyleft: modify a FerrFlow source file and you had to publish that file. In practice that obligation almost never applied (FerrFlow is invoked, not linked), but it was enough to route the tool into legal review at organisations whose dependency policy allowlists MIT, BSD and Apache and flags everything else. That review always ended in approval, and always cost weeks. MIT removes the question. **Nothing is taken away.** Every right you had under MPL-2.0 you still have under MIT, plus the file-level reciprocity obligation is gone. Releases up to 5.52.x remain available under MPL-2.0 in perpetuity if you have a reason to prefer them. @@ -21,6 +21,6 @@ MPL-2.0 is weak copyleft: modify a FerrFlow source file and you had to publish t bot: true ``` -`v5` stays where it is and will not receive further releases. Nothing else changes. No flags, no config fields, no output formats. The major bump exists so that "which licence?" has a clean answer per major line: v5 and earlier are MPL-2.0, v6 onward is MIT. Pinning a full version (`@v6.0.0`) or a commit SHA is unaffected. +`v5` stays where it is and will not receive further releases. Nothing else changes: no flags, no config fields, no output formats. The major bump exists so that "which licence?" has a clean answer per major line: v5 and earlier are MPL-2.0, v6 onward is MIT. Pinning a full version (`@v6.0.0`) or a commit SHA is unaffected. If you consume FerrFlow as a Rust library, `cargo update` picks the new licence up with the version; if your build enforces a licence allowlist, MIT should already be on it. diff --git a/docs/site/changelog/2026-08-07-ferrflow-verified-installs.md b/docs/site/changelog/2026-08-07-ferrflow-verified-installs.md index 29ce72da..0e00eff8 100644 --- a/docs/site/changelog/2026-08-07-ferrflow-verified-installs.md +++ b/docs/site/changelog/2026-08-07-ferrflow-verified-installs.md @@ -1,13 +1,13 @@ --- title: 'FerrFlow: the Action verifies the binary it downloads' -summary: 'Releases now ship a signed SHA256SUMS, and the GitHub Action checks the archive against it: and its build provenance: before extracting anything.' +summary: 'Releases now ship a signed SHA256SUMS, and the GitHub Action checks the archive against it (and its build provenance) before extracting anything.' date: 2026-08-07T09:30:00Z product: ferrflow type: security prLink: https://github.com/FerrLabs/FerrFlow/pull/811 --- -The FerrFlow Action installed the CLI by piping a release asset straight into `tar`. Nothing checked what came back before it was extracted and run: and it runs holding a repository write token. The release pipeline had been producing cosign signatures and build provenance attestations for a while, but nothing consumed them, and no checksum manifest was published at all. +The FerrFlow Action installed the CLI by piping a release asset straight into `tar`. Nothing checked what came back before it was extracted and run, and it runs holding a repository write token. The release pipeline had been producing cosign signatures and build provenance attestations for a while, but nothing consumed them, and no checksum manifest was published at all. Releases now include a `SHA256SUMS` covering every platform archive. It is generated before the signing steps, so it is itself attested and cosign-signed, and it ships alongside `SHA256SUMS.bundle`. diff --git a/docs/site/changelog/2026-08-10-ferrflow-commit-formats.md b/docs/site/changelog/2026-08-10-ferrflow-commit-formats.md index df784f53..c6eec75f 100644 --- a/docs/site/changelog/2026-08-10-ferrflow-commit-formats.md +++ b/docs/site/changelog/2026-08-10-ferrflow-commit-formats.md @@ -1,6 +1,6 @@ --- title: 'FerrFlow: commit formats are configurable, and the defaults are more permissive' -summary: 'workspace.commitFormats lets you declare which commit subjects map to which bump level. The defaults now also recognise Feat:, Fix/, feature: and friends. Which is why this ships as v7.' +summary: 'workspace.commitFormats lets you declare which commit subjects map to which bump level. The defaults now also recognise Feat:, Fix/, feature: and friends, which is why this ships as v7.' date: 2026-08-10T18:00:00Z product: ferrflow type: breaking @@ -8,7 +8,7 @@ prLink: https://github.com/FerrLabs/FerrFlow/pull/824 docsLink: https://ferrflow.com/docs/configuration/config-file --- -FerrFlow only ever recognised strict lowercase conventional prefixes. Teams whose history uses `Feat/add-login`, `Fix: resolve crash` or `feature:`: the shapes that come out of branch-named squash merges: got no releases at all, with nothing in the output explaining why. +FerrFlow only ever recognised strict lowercase conventional prefixes. Teams whose history uses `Feat/add-login`, `Fix: resolve crash` or `feature:` (the shapes that come out of branch-named squash merges) got no releases at all, with nothing in the output explaining why. `workspace.commitFormats` now declares the mapping. Each of `major`, `minor` and `patch` takes a pattern, a list of patterns, or `"all"`: