Hooks used to see only the basics: package name, old and new version, bump type, tag. That was enough to echo a message, but not enough to post a real release note or gate on what actually changed.

Every hook now gets the full picture. Shell hooks read new FERRFLOW_* environment variables; JS/TS function hooks get the same data as properties on the ctx object (both are built from one source, so they never drift):

  • 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.
  • 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):

export default {
  workspace: {
    hooks: {
      postBump(ctx) {
        const breaking = ctx.commits.filter((c) => c.breaking);
        if (breaking.length) notify(`${breaking.length} breaking change(s) in ${ctx.newVersion}`);
      },
    },
  },
};

The enrichment reaches every hook point: pre/post bump, commit, tag, publish, release, plus onSuccess / onError.