Skip to content

Archflow 2.5.0

Latest

Choose a tag to compare

@github-actions github-actions released this 12 Oct 22:20
· 21 commits to main since this release
303507c

Added

  • Anonymous usage telemetry, on by default (opt-out), on every host. Archflow previously sent
    nothing; SECURITY.md now documents what is sent and how to turn it off, and ADR 005 records the
    decision. Sessions send session_start and
    Archflow commands send command_run with the command name only; npx archflow install sends
    cli_install. Session and command events carry host, entrypoint, Studio, project type,
    version, phase and mode; cli_install carries the version, the installed hosts and the install
    source. None carries
    project names, paths, contents, prompts or arguments (full list in SECURITY.md). A one-time notice announces it.
  • How commands are detected: Claude Code's UserPromptExpansion hook and OpenCode's
    command.executed event name the command directly. Codex, Copilot, Cursor and Gemini read the
    prompt locally and count it only when it starts with an Archflow command. The generic
    AGENTS.md package reports session starts only, when the agent runs the script AGENTS.md names.
  • /archflow:telemetry [on|off|status] and npx archflow telemetry [on|off|status] to opt out, on every host.
    Opting out sends one final telemetry_opted_out event and nothing after; opting back in sends
    telemetry_opted_in. DO_NOT_TRACK, CI and ARCHFLOW_TELEMETRY_DISABLED also turn it off,
    and send nothing. The choice is stored in ~/.archflow/config.json and applies to every project
    on the machine. With no argument it shows the setting and since when: the last time it was
    turned on or off, else when the notice was shown. If the choice cannot be saved, nothing is
    changed or sent and the command says so.
  • scripts/build-adapters.mjs copies the hook runtime through one helper, so a new hook is one
    entry in HOOK_SCRIPTS rather than an edit per host.
  • Archflow Studio on every host. /archflow:studio now ships in every adapter: OpenAI Codex
    ($archflow-studio), GitHub Copilot CLI, Cursor, OpenCode (/archflow-studio), Gemini CLI
    (enterprise/API, /archflow:studio) and the generic AGENTS.md package. This supersedes 2.4.0's "/archflow:studio
    stays Claude Code only". Off Claude Code, Studio runs in forward mode: the board, releases,
    stories and files work as they do on Claude Code, and its chat panel runs no agent. You compose
    there, Studio spells the command the way your host expects, and Send copies it for you to paste
    into your own terminal session. On Claude Code nothing changes: full mode by default, companion
    opt-in. The command reports which host Studio resolved and what its chat does
    (host codex, chat forward), and Studio's host picker changes the host per project.
  • Studio's bundle (server and web UI, about 6.5 MB) ships once. The npm package carries the
    plugin's copy, not one per adapter, and npx archflow install places it in each host's own
    install: .codex/archflow/, .github/archflow/, .cursor/archflow/, .opencode/archflow/,
    .agents/archflow/ or ~/.gemini/extensions/archflow/. In a project it adds a .gitignore
    there so the bundle stays out of your commits; a teammate gets it by running
    npx archflow@latest install (@latest, since an installer npx cached before 2.5.0 brings the
    adapters but not the bundle). A re-run replaces it whole, so old builds do not pile up. The package grows by about 1.7 MB
    compressed, where six copies would have added about 10 MB.
  • On Gemini CLI, npx archflow install runs gemini extensions install in your terminal, so you
    answer Gemini's own trust and confirm prompts; it then checks the extension really landed before
    saying so. A declined upgrade keeps the extension you had. With no terminal (CI, piped) it prints
    the command to run instead and exits 1.
  • /archflow:help: every command with a one-line usage note, and a short primer on how Archflow
    works (phases, releases, the story pipeline, gates, modes and a typical flow). /archflow:help <command> prints just that command's line. Generated for every host adapter. A test checks that
    it lists exactly the files in plugin/commands/, so the reference cannot drift.

Changed

  • /archflow:status no longer prints the command list. It reports where the project stands, ends
    with the command or two to run next, and points at /archflow:help for everything else. Status
    answers "where am I"; help answers "what can I do".

Fixed

  • Parked stories left by a finished autopilot run had no way back. The end-of-run report and
    /archflow:status said to answer them and run /archflow:autopilot resume, but resume only
    continued a run still planned or running. resume now asks the questions of the stories parked
    on the branch you are on, whether the run that parked them finished or was aborted, and builds
    the ones you answer. It names any other run branch that may hold parked work, never restarts a
    finished run or continues an aborted one, and asks which to pick up if a planned run is also
    waiting.
  • /archflow:autopilot abort printed the end-of-run report, whose last step set the run
    finished, so an aborted run did not stay aborted. abort and report now skip that write.
  • /archflow:autopilot resume on a run planned with --plan stopped because the run branch did
    not exist yet. It now creates the branch and starts the planned run, and refuses if that branch
    already exists locally or on origin.
  • Autopilot left its ledger writes uncommitted (the --plan ledger, the closing finished,
    abort's aborted), so resume, which needs a clean tree, stopped on the run's own change.
    Every ledger and release-file write is now committed, on the run branch (or, for a --plan
    ledger, the base branch), never on main, and a parked story's state is carried onto the run
    branch.
  • Gemini commands that quote the plugin path, such as /archflow:doctor, pointed at
    "~/.gemini/...", which the shell does not expand. They now use $HOME.
  • Gemini commands, agents and skills that tell the model to follow another command, such as
    /archflow:init handing off to onboard, pointed at commands/<name>.md, which the Gemini
    extension does not ship. They now point at commands/archflow/<name>.toml.
  • The same pointers were dead on Codex, Copilot, Cursor, OpenCode and the generic package too:
    they named <host>/archflow/commands/<name>.md, which no adapter generates. They now point at
    the file each host really ships the command as, such as .agents/skills/archflow-groom/SKILL.md
    on Codex or .cursor/commands/archflow-groom.md on Cursor. A test checks that every path built
    from the plugin root, in every adapter, exists.
  • Each host's /archflow:help lists exactly the commands that host ships, and a test holds it
    there. (With Studio now on every host, that list is the same everywhere.)
  • The Cursor hook bridge found the project from cwd, which Cursor sends only with some events,
    such as before a shell command, and then as the shell's directory. So session start, prompt and
    stop hooks fell back to whatever directory the hook ran in, and a shell in a subdirectory of the
    project, as in a monorepo, skipped the git guard, letting a force push to main through. The
    bridge now uses the nearest directory at or above cwd, up to its workspace root, that is an
    Archflow project. A shell in a workspace root that is not an Archflow project is left alone,
    even when that root sits inside an Archflow project. A cwd outside every workspace root is
    walked up without that limit. Without a cwd, or when that finds no project, it uses the first
    workspace root that is an Archflow project, else the first workspace root.
  • On Cursor, the stop hook's warning about .archflow/ files that no longer match their schemas
    was never shown, because the bridge relayed only stdout and the warning is written to stderr.
    The bridge now relays both.
  • /archflow:migrate ran python3 <plugin path>/scripts/migrate.py without quotes, so it failed
    when that path contains a space, as it does on Gemini CLI with a home directory such as
    /Users/Jane Doe. The path is now quoted on every host.