From f6fc9f4929188da44d9cca704ef801aa9feb777b Mon Sep 17 00:00:00 2001 From: Codevena Date: Sat, 13 Jun 2026 01:02:24 +0100 Subject: [PATCH 1/3] docs: design spec for notify-cmd action input (v0.7.1) --- .../2026-06-13-action-notify-cmd-design.md | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 docs/superpowers/specs/2026-06-13-action-notify-cmd-design.md diff --git a/docs/superpowers/specs/2026-06-13-action-notify-cmd-design.md b/docs/superpowers/specs/2026-06-13-action-notify-cmd-design.md new file mode 100644 index 0000000..3cb513b --- /dev/null +++ b/docs/superpowers/specs/2026-06-13-action-notify-cmd-design.md @@ -0,0 +1,52 @@ +# Design: `notify-cmd` input for the GitHub Action — v0.7.1 + +Date: 2026-06-13. Status: approved (user picked this backlog item explicitly). + +## Problem + +v0.7.0 added `--notify-cmd`, but the composite action (`action.yml`) does not +expose it — CI users can only reach it via a committed `.fixbuddy.conf`. The +action's input set is otherwise complete. + +## Decision + +New optional action input `notify-cmd`, **newline-separated** (one command per +line), each non-empty trimmed line becoming one repeated `--notify-cmd` flag. + +Newlines, NOT commas: the existing `label` input is comma-separated, but shell +commands may legitimately contain commas (`curl -d 'a,b' ...`), so comma +splitting would corrupt them. YAML block scalars make multi-line inputs +natural: + +```yaml +with: + notify-cmd: | + curl -s -d @- ntfy.sh/my-topic + ./scripts/post-to-slack.sh +``` + +## Changes + +- `action.yml`: + - input `notify-cmd` (description documents one-command-per-line, default `""`), + - passed via `FIXBUDDY_NOTIFY_CMD` env (same injection-safe pattern as the + other inputs), + - parsing loop mirroring the `label` loop but splitting on newlines via + `while IFS= read -r` over a herestring, trimming whitespace, skipping + empty lines. +- `.github/workflows/action-smoke.yml`: pass `notify-cmd: "echo smoke-notify"` + so the wiring is exercised on every PR (dry-run never *fires* notify by + design, but argument construction and fixbuddy's flag parsing run). +- README: row in the action Inputs table. +- Release housekeeping: patch release **v0.7.1** (version bumps everywhere, + CHANGELOG, fresh SHA256SUMS — scripts change only by their version string, + but the floating `v1` tag must move for action consumers to get the input). + +## Testing + +- Local: YAML validation; an extracted-snippet test of the parsing loop + (multi-line input incl. blank line and surrounding whitespace → exact + expected argv); `bash -n`/`shellcheck`/full integration suite unchanged. +- CI: the extended action-smoke dry-run exercises the new input end-to-end on + the PR. +- DoD review gate (Codex + Claude) before merge. From fc4c9f2c3a02ebcad450cafcd0d97a8f8122ffae Mon Sep 17 00:00:00 2001 From: Codevena Date: Sat, 13 Jun 2026 01:04:20 +0100 Subject: [PATCH 2/3] feat(action): notify-cmd input (newline-separated), v0.7.1 bumps --- .github/workflows/action-smoke.yml | 4 ++++ CHANGELOG.md | 9 +++++++++ NEXT_SESSION.md | 1 - README.md | 7 ++++--- SHA256SUMS | 4 ++-- action.yml | 16 ++++++++++++++++ fixbuddy-wizard.sh | 4 ++-- fixbuddy.sh | 4 ++-- install.sh | 10 +++++----- 9 files changed, 44 insertions(+), 15 deletions(-) diff --git a/.github/workflows/action-smoke.yml b/.github/workflows/action-smoke.yml index ac9b8f3..cea6ae4 100644 --- a/.github/workflows/action-smoke.yml +++ b/.github/workflows/action-smoke.yml @@ -26,6 +26,10 @@ jobs: with: dry-run: "true" max: "1" + # Exercises the notify-cmd input wiring (argument construction and + # fixbuddy's flag parsing). Dry-run never FIRES notifications, so + # this cannot have side effects. + notify-cmd: "echo smoke-notify" # No agent CLI is installed here on purpose: --dry-run only lists target # issues and never invokes an agent, so this exercises the wrapper's input # parsing, command construction, and exit codes without real API keys. diff --git a/CHANGELOG.md b/CHANGELOG.md index 682c1b0..0dee12a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,14 @@ All notable changes to fixbuddy are documented here. The format is based on [Keep a Changelog](https://keepachangelog.com/), and this project aims to follow [Semantic Versioning](https://semver.org/). +## [0.7.1] - 2026-06-13 + +### Added +- **GitHub Action input `notify-cmd`** — exposes `--notify-cmd` to workflows. + One command per line (newline-separated, NOT comma-separated: shell commands + may legitimately contain commas; use a YAML block scalar for multiple). The + action-smoke workflow exercises the wiring on every PR. + ## [0.7.0] - 2026-06-12 ### Added @@ -97,6 +105,7 @@ to existing flags. Predate this changelog. See the git history and the `v0.4.0` / `v0.3.2` tags. +[0.7.1]: https://github.com/Codevena/fixbuddy/compare/v0.7.0...v0.7.1 [0.7.0]: https://github.com/Codevena/fixbuddy/compare/v0.6.0...v0.7.0 [0.6.0]: https://github.com/Codevena/fixbuddy/compare/v0.5.0...v0.6.0 [0.5.0]: https://github.com/Codevena/fixbuddy/compare/v0.4.0...v0.5.0 diff --git a/NEXT_SESSION.md b/NEXT_SESSION.md index e020dae..1055875 100644 --- a/NEXT_SESSION.md +++ b/NEXT_SESSION.md @@ -28,7 +28,6 @@ read-only-stage guards. ## Idea backlog (not committed) -- `notify-cmd` input for the GitHub Action wrapper - Log retention/pruning for `~/.fixbuddy/runs` - New agents as they appear (validation list + run_agent case + wizard + docs) - The `--help` sed range (`2,51p`) must be adjusted whenever header lines are diff --git a/README.md b/README.md index bb07601..8e094dd 100644 --- a/README.md +++ b/README.md @@ -57,15 +57,15 @@ VERIFY -> FIX -> REVIEW -> PUSH/PR -> optional auto-merge Install with the one-liner (macOS and Linux, including WSL2): ```bash -curl -fsSL https://raw.githubusercontent.com/Codevena/fixbuddy/v0.7.0/install.sh | bash +curl -fsSL https://raw.githubusercontent.com/Codevena/fixbuddy/v0.7.1/install.sh | bash ``` -This downloads the pinned `v0.7.0` scripts into `~/.local/bin` (or `/usr/local/bin`), makes them executable, and prints a PATH hint if needed. Override the location with `| bash -s -- --prefix /custom/bin` or track the latest commit with `--ref main`. +This downloads the pinned `v0.7.1` scripts into `~/.local/bin` (or `/usr/local/bin`), makes them executable, and prints a PATH hint if needed. Override the location with `| bash -s -- --prefix /custom/bin` or track the latest commit with `--ref main`. **Prefer to read before you run?** The installer is short — inspect it first, then run it: ```bash -curl -fsSL https://raw.githubusercontent.com/Codevena/fixbuddy/v0.7.0/install.sh -o install.sh +curl -fsSL https://raw.githubusercontent.com/Codevena/fixbuddy/v0.7.1/install.sh -o install.sh less install.sh # read it bash install.sh # then run it ``` @@ -381,6 +381,7 @@ The action copies each run's logs into `fixbuddy-logs/` in the workspace. Add an | `base-branch` | `--base` | auto-detect | | `auto-merge` | `--no-auto-merge` when `false`; `--auto-merge` when `true` | `true` | | `dry-run` | `--dry-run` when `true` — lists targets, makes no changes | `false` | +| `notify-cmd` | `--notify-cmd` (one command **per line** — newline-separated because shell commands may contain commas; use a YAML block scalar for multiple) | none | | `github-token` | `GH_TOKEN` for `gh` | `${{ github.token }}` | Running fixbuddy in CI gives AI agents repository write access through whatever token you hand them. Read [SECURITY.md](SECURITY.md) before enabling this on a repository that matters. diff --git a/SHA256SUMS b/SHA256SUMS index 7d09e6f..8db4901 100644 --- a/SHA256SUMS +++ b/SHA256SUMS @@ -1,2 +1,2 @@ -a83f4930628e30d51ad2def2ff06f76f6fa777e45cefc208b3995b35bfba9f38 fixbuddy.sh -fd2f5b80a8e42d289f922716820c1df7e7ce4c739d505a3a96ddd5dbe7139551 fixbuddy-wizard.sh +6e982121febcdd855060591257e124816e1c6f74eb6471ca5c6ea11dd39ad48b fixbuddy.sh +2c29a25de377d9f5b8d02228c691677f93bc98fc3ab34f40fedb80daa0a65fe1 fixbuddy-wizard.sh diff --git a/action.yml b/action.yml index 6790704..ac2fda0 100644 --- a/action.yml +++ b/action.yml @@ -46,6 +46,10 @@ inputs: description: "List target issues only, make no changes" required: false default: "false" + notify-cmd: + description: "Run-summary notification command(s), ONE PER LINE (use a YAML block scalar). Each non-empty line becomes a repeated --notify-cmd flag. Newline-separated on purpose: shell commands may contain commas. Not fired in dry-run." + required: false + default: "" github-token: description: "Token with contents:write, pull-requests:write, issues:write" required: false @@ -71,6 +75,7 @@ runs: FIXBUDDY_BASE: ${{ inputs.base-branch }} FIXBUDDY_AUTO_MERGE: ${{ inputs.auto-merge }} FIXBUDDY_DRY_RUN: ${{ inputs.dry-run }} + FIXBUDDY_NOTIFY_CMD: ${{ inputs.notify-cmd }} FIXBUDDY_ACTION_PATH: ${{ github.action_path }} run: | set -euo pipefail @@ -109,6 +114,17 @@ runs: done fi + # NEWLINE-separated notify commands become repeated --notify-cmd flags. + # Newlines instead of commas on purpose: shell commands may legitimately + # contain commas, and a YAML block scalar makes one-per-line natural. + if [ -n "$FIXBUDDY_NOTIFY_CMD" ]; then + while IFS= read -r _n; do + _n="${_n#"${_n%%[![:space:]]*}"}" + _n="${_n%"${_n##*[![:space:]]}"}" + if [ -n "$_n" ]; then cmd+=(--notify-cmd "$_n"); fi + done <<< "$FIXBUDDY_NOTIFY_CMD" + fi + "${cmd[@]}" - name: Collect logs diff --git a/fixbuddy-wizard.sh b/fixbuddy-wizard.sh index 7874f09..2d76e6f 100755 --- a/fixbuddy-wizard.sh +++ b/fixbuddy-wizard.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# fixbuddy-wizard.sh v0.7.0 — beginner-friendly launcher for fixbuddy.sh +# fixbuddy-wizard.sh v0.7.1 — beginner-friendly launcher for fixbuddy.sh # # Walks a user through the required flags via interactive prompts, validates # prerequisites, shows a preview of the exact command, and then exec's fixbuddy.sh. @@ -32,7 +32,7 @@ printf "%s" "${MAG}${BOLD}" cat <<'EOF' ╔═══════════════════════════════════════════════════╗ - ║ fixbuddy wizard v0.7.0 ║ + ║ fixbuddy wizard v0.7.1 ║ ║ Turn GitHub issues into reviewed PRs ║ ╚═══════════════════════════════════════════════════╝ EOF diff --git a/fixbuddy.sh b/fixbuddy.sh index 2d42665..bc9e383 100755 --- a/fixbuddy.sh +++ b/fixbuddy.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# fixbuddy v0.7.0 — two-agent pipeline for autonomous issue fixing +# fixbuddy v0.7.1 — two-agent pipeline for autonomous issue fixing # # Pipeline per issue: # 1. VERIFY (fix-agent) — is this real? → PROCEED / FALSE-POSITIVE / BLOCKED @@ -51,7 +51,7 @@ # filter), and a config-provided label/check/notify cannot be removed from the CLI. set -uo pipefail -VERSION="0.7.0" +VERSION="0.7.1" # -------- Defaults -------- REPO="" diff --git a/install.sh b/install.sh index 5a7526c..a191e08 100755 --- a/install.sh +++ b/install.sh @@ -2,12 +2,12 @@ # install.sh — installer for fixbuddy (https://github.com/Codevena/fixbuddy) # # Quick install: -# curl -fsSL https://raw.githubusercontent.com/Codevena/fixbuddy/v0.7.0/install.sh | bash +# curl -fsSL https://raw.githubusercontent.com/Codevena/fixbuddy/v0.7.1/install.sh | bash # # Options (pass after the URL as: | bash -s -- ): # --prefix PATH Install into PATH instead of the auto-detected location # --ref TAG Install the fixbuddy scripts from a specific git ref. -# Default: v0.7.0. Use --ref main for the latest commit. +# Default: v0.7.1. Use --ref main for the latest commit. # -y, --yes Skip the sudo confirmation prompt # -h, --help Show this help and exit # @@ -16,7 +16,7 @@ set -euo pipefail REPO_SLUG="Codevena/fixbuddy" -DEFAULT_REF="v0.7.0" +DEFAULT_REF="v0.7.1" RAW_BASE="https://raw.githubusercontent.com/${REPO_SLUG}" SCRIPTS=(fixbuddy.sh fixbuddy-wizard.sh) @@ -40,11 +40,11 @@ usage() { cat >&2 <<'EOF' install.sh — installer for fixbuddy - curl -fsSL https://raw.githubusercontent.com/Codevena/fixbuddy/v0.7.0/install.sh | bash + curl -fsSL https://raw.githubusercontent.com/Codevena/fixbuddy/v0.7.1/install.sh | bash Options (pass as: | bash -s -- ): --prefix PATH Install into PATH instead of the auto-detected location - --ref TAG Install fixbuddy scripts from a specific git ref (default: v0.7.0; + --ref TAG Install fixbuddy scripts from a specific git ref (default: v0.7.1; use --ref main for the latest commit) -y, --yes Skip the sudo confirmation prompt -h, --help Show this help and exit From 8915218f4cb9bb00355927a48917607e23811f13 Mon Sep 17 00:00:00 2001 From: Codevena Date: Sat, 13 Jun 2026 01:09:26 +0100 Subject: [PATCH 3/3] docs: NEXT_SESSION reflects v0.7.1 branch state --- NEXT_SESSION.md | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/NEXT_SESSION.md b/NEXT_SESSION.md index 1055875..e11a173 100644 --- a/NEXT_SESSION.md +++ b/NEXT_SESSION.md @@ -1,15 +1,14 @@ # Next session -**v0.7.0 is released** (2026-06-12): `--notify-cmd` run-summary notification -hook (additive config key `notify_cmd`). PR #10, merged to `main`. Earlier the -same day, v0.6.0 shipped the agy migration (Gemini CLI successor) and the -read-only-stage guards. +**v0.7.1 is on branch `feat/action-notify-cmd-v0.7.1`** (2026-06-13), awaiting +merge/tag: the GitHub Action gains a `notify-cmd` input (newline-separated — +shell commands may contain commas). Released earlier: v0.7.0 (`--notify-cmd` +hook, 2026-06-12) and v0.6.0 (agy migration + read-only-stage guards). ## Status snapshot -- `main` is at the v0.7.0 merge; tags `v0.7.0` and floating `v1` point at it. - GitHub release published; CI green; install one-liner smoke-tested against - the fresh tag (checksums OK, `--version` → 0.7.0, `--help` shows notify-cmd). +- DoD gate passed (Codex PASS + Claude PASS); 20/20 integration tests; the + action-smoke workflow exercises the new input on the PR. - Specs/plans: `docs/superpowers/specs/` + `docs/superpowers/plans/` (2026-06-12 agy + notify-cmd documents). - Tests: `tests/integration.sh` — 20 offline scenarios, runs in CI.