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:

on:
  push:
    tags: ['v*', '*@v*'] # single-repo and monorepo per-package tags
jobs:
  publish:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
      - uses: FerrLabs/FerrFlow@v5
        with:
          mode: publish # self-scopes to the tag that fired

The selection rules:

  • ferrflow publish — triggering tag → that package; otherwise every package (unchanged, so the existing release→publish job is unaffected).
  • ferrflow publish api web — explicit packages (now more than one).
  • ferrflow publish --all — every package, ignoring any tag scope.

Scope is by package name / tag, not conventional-commit scope, and the version is still read from package state — the tag's version suffix is just informational.