Skip to content

feat: wire cut-release.sh cross-repo publish via gh api (#872) - #959

Merged
don-petry merged 2 commits into
mainfrom
feat/cut-release-cross-repo-872
Jun 27, 2026
Merged

feat: wire cut-release.sh cross-repo publish via gh api (#872)#959
don-petry merged 2 commits into
mainfrom
feat/cut-release-cross-repo-872

Conversation

@don-petry

Copy link
Copy Markdown
Collaborator

Summary

Unblocks promotion of the #870 reusables. The six #482 reusables + feature-ideation are hosted in petry-projects/.github, so their release/channel tags belong on that repo — but cut-release.sh resolved refs against local git and refused live cross-repo cuts (the push target was flagged an open question, TODO(#872)). This wires the cross-repo path.

What changed

  • Cross-repo resolve + publish via gh api — for a cross_repo_agent, the ref resolves against petry-projects/.github (commits/<ref>; an origin/ prefix is stripped so origin/main → its main), and --push creates the annotated <name>/vX.Y.Z release object + force-moves the <name>/<channel> tag (git/tags + git/refs).
  • This-repo agents unchangedpr-review/dev-lead keep the local-git tag+push path verbatim.
  • Immutability preserved cross-repo — an existing <name>/vX.Y.Z is never overwritten.
  • --push for a cross-repo agent requires GH_TOKEN with contents:write on petry-projects/.github.

Tests

  • strip_origin pure helper (+4 cases).
  • New gh-mocked integration suite tests/test_cut_release_cross_repo.bats: dry-run resolves + touches nothing; print-only (no --push); --push creates release + moves channel on .github; --push refuses an existing release tag; this-repo agent still uses local git.
  • 46 pass, shellcheck --severity=warning clean.

Docs

versioning.md + runbook.md updated — cross-repo cut is now wired (was "dry-run only"). Note: canary-rollout.sh (the automated promotion driver) does not yet use this cross-repo path, so the six stay out of canary-rings.json until that's taught the same move — manual/scripted cut-release.sh cuts work today.

Refs #872, #870.

🤖 Generated with Claude Code

The six #482 reusables + feature-ideation are hosted in petry-projects/.github,
so their release/channel tags belong on THAT repo. cut-release.sh previously
resolved refs against local git and refused live cross-repo cuts (the push
target was an open question). This wires it:

- For cross_repo_agents, resolve the ref against petry-projects/.github via
  `gh api repos/.../commits/<ref>` (an `origin/` prefix is stripped → its main),
  and publish with `--push`: create the annotated `<name>/vX.Y.Z` release object
  + force-move the `<name>/<channel>` tag via `gh api git/tags` + `git/refs`.
- This-repo agents (pr-review, dev-lead) keep the existing local-git path
  unchanged. Immutability is preserved cross-repo: an existing release tag is
  never overwritten.
- `--push` for a cross-repo agent needs GH_TOKEN with contents:write on .github.

New helpers (strip_origin pure; gh_resolve_sha / gh_tag_exists /
gh_create_annotated_tag / gh_move_tag wrappers). Tests: +4 strip_origin pure
cases and a new gh-mocked integration suite (dry-run / print-only / --push
create+move / immutability refusal / native path untouched) — 46 pass,
shellcheck clean. Docs (versioning.md, runbook.md) updated: cross-repo path is
now wired, not "dry-run only".

Refs #872, #870.
@don-petry
don-petry requested a review from a team as a code owner June 27, 2026 13:43
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.
To continue using code reviews, you can upgrade your account or add credits to your account and enable them for code reviews in your settings.

@coderabbitai

coderabbitai Bot commented Jun 27, 2026

Copy link
Copy Markdown

Warning

Review limit reached

@don-petry, we couldn't start this review because you've reached your PR review rate limit.

More reviews will be available in 7 minutes and 36 seconds. Learn how PR review limits work.

Your organization has used up its prepaid credits, and credit purchases are no longer available. Enable the review add-on in the billing tab to keep reviews running — you're only billed for reviews past your plan's rate limits ($0.25/file).

⌛ How to resolve this issue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based credits.

🚦 How do rate limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please see our Fair Usage Limits Policy for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 58bcaab8-635d-4c50-9f79-70e5a8f2b513

📥 Commits

Reviewing files that changed from the base of the PR and between c863f78 and be749ec.

📒 Files selected for processing (5)
  • docs/release/runbook.md
  • docs/release/versioning.md
  • scripts/cut-release.sh
  • tests/test_cut_release.bats
  • tests/test_cut_release_cross_repo.bats
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/cut-release-cross-repo-872

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@don-petry

Copy link
Copy Markdown
Collaborator Author

@donpetry-bot please review

@donpetry-bot

Copy link
Copy Markdown
Contributor

@don-petry I'm on it — starting a fresh review now. Results will appear in a few minutes.

@don-petry

Copy link
Copy Markdown
Collaborator Author

Dev-Lead — review-changes (no-changes)

No changes were needed for this PR.

@don-petry
don-petry enabled auto-merge (squash) June 27, 2026 13:44

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request implements the cross-repo release publishing path for agents hosted in the petry-projects/.github repository using the GitHub CLI (gh api). It updates the cut-release.sh script to resolve refs and create or move tags remotely, updates the release runbook and versioning documentation, and adds integration tests with a stubbed CLI. The review feedback is highly constructive, suggesting that the script explicitly verify the presence of the gh CLI before executing cross-repo operations and that the test setup include proper error handling when creating temporary directories with mktemp.

Comment thread scripts/cut-release.sh
Comment thread tests/test_cut_release_cross_repo.bats Outdated
@donpetry-bot

Copy link
Copy Markdown
Contributor

Advisory bots were rate-limited; auto-approval is withheld until they recover. pr-review-sweep will re-review this PR after 2026-06-27T14:45:09Z.

@don-petry
don-petry disabled auto-merge June 27, 2026 13:45
coderabbitai[bot]
coderabbitai Bot previously approved these changes Jun 27, 2026
@don-petry

Copy link
Copy Markdown
Collaborator Author

Dev-Lead — fix-reviews (applied)

Changes committed and pushed.

@donpetry-bot

Copy link
Copy Markdown
Contributor

CI checks on this PR are still running. Once they complete, re-mention @donpetry-bot to trigger a fresh review.

Posted by the donpetry-bot PR-review cascade.

@sonarqubecloud

Copy link
Copy Markdown

@donpetry-bot

Copy link
Copy Markdown
Contributor

@donpetry-bot I'm on it — starting a fresh review now. Results will appear in a few minutes.

10 similar comments
@donpetry-bot

Copy link
Copy Markdown
Contributor

@donpetry-bot I'm on it — starting a fresh review now. Results will appear in a few minutes.

@donpetry-bot

Copy link
Copy Markdown
Contributor

@donpetry-bot I'm on it — starting a fresh review now. Results will appear in a few minutes.

@donpetry-bot

Copy link
Copy Markdown
Contributor

@donpetry-bot I'm on it — starting a fresh review now. Results will appear in a few minutes.

@donpetry-bot

Copy link
Copy Markdown
Contributor

@donpetry-bot I'm on it — starting a fresh review now. Results will appear in a few minutes.

@donpetry-bot

Copy link
Copy Markdown
Contributor

@donpetry-bot I'm on it — starting a fresh review now. Results will appear in a few minutes.

@donpetry-bot

Copy link
Copy Markdown
Contributor

@donpetry-bot I'm on it — starting a fresh review now. Results will appear in a few minutes.

@donpetry-bot

Copy link
Copy Markdown
Contributor

@donpetry-bot I'm on it — starting a fresh review now. Results will appear in a few minutes.

@donpetry-bot

Copy link
Copy Markdown
Contributor

@donpetry-bot I'm on it — starting a fresh review now. Results will appear in a few minutes.

@donpetry-bot

Copy link
Copy Markdown
Contributor

@donpetry-bot I'm on it — starting a fresh review now. Results will appear in a few minutes.

@donpetry-bot

Copy link
Copy Markdown
Contributor

@donpetry-bot I'm on it — starting a fresh review now. Results will appear in a few minutes.

@donpetry-bot

Copy link
Copy Markdown
Contributor

@donpetry-bot I'm on it — starting a fresh review now. Results will appear in a few minutes.

1 similar comment
@donpetry-bot

Copy link
Copy Markdown
Contributor

@donpetry-bot I'm on it — starting a fresh review now. Results will appear in a few minutes.

@donpetry-bot donpetry-bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Automated review — APPROVED ✓

Risk: MEDIUM
Reviewed commit: be749ecb7db92707a1976e23401bf73caf94080f
Review mode: triage-approved (single reviewer)

Summary

Wires the cross-repo publish path in cut-release.sh so the #482/#870 reusables (hosted in petry-projects/.github) can have their release/channel tags cut against that repo via gh api, resolving the TODO(#872) open question. This-repo agents keep the local-git path verbatim; cross-repo immutability is preserved (existing vX.Y.Z release tags are never overwritten). Confirms the triage low-risk assessment.

Linked issue analysis

No closes references; PR refs #872, #870. #872 was the open question of the cross-repo push target — this PR substantively resolves it by routing resolve+publish through gh api against petry-projects/.github (requires GH_TOKEN contents:write). #870 promotion is unblocked. Scope is honest: docs note canary-rollout.sh does not yet use this path, so the six stay out of canary-rings.json until that automation is taught the same move.

Findings

No blocking findings.

  • Secret scan: run_secret_scanning MCP tool not exposed in this environment; relied on the gitleaks CI check (SUCCESS).
  • gh api wrappers use -f/-F typed params (no shell-string interpolation) and inputs are gated by valid_agent / validate_version / cross_repo_agent; gh presence is checked via command -v before cross-repo ops. No hardcoded secrets.
  • Advisory bots resolved: SonarCloud quality gate passed (0 new issues); both gemini-code-assist threads (gh CLI presence check, mktemp error handling) are resolved and the suggested code is present.
  • Tests: +4 strip_origin unit cases and a new gh-mocked integration suite (tests/test_cut_release_cross_repo.bats) covering dry-run, print-only, --push create+move, existing-tag refusal, and this-repo path unchanged. ShellCheck clean.

CI status

All required checks green: CodeQL (actions+python), ShellCheck, bats/unit-tests, Lint, Secret scan (gitleaks), SonarCloud, Agent Security Scan, agent-shield, guard/holdout-guard, validate-agent-profiles, gh-aw-compile. Duplicate dev-lead/review runs show CANCELLED (superseded re-runs) with a later SUCCESS; dependency-audit ecosystem jobs SKIPPED (no matching ecosystems). reviewDecision=APPROVED.


Reviewed automatically by the PR-review agent (single-reviewer mode: fable 5). Reply if you need a human review.

don-petry added a commit that referenced this pull request Aug 2, 2026
* feat: wire cut-release.sh cross-repo publish via gh api (#872)

The six #482 reusables + feature-ideation are hosted in petry-projects/.github,
so their release/channel tags belong on THAT repo. cut-release.sh previously
resolved refs against local git and refused live cross-repo cuts (the push
target was an open question). This wires it:

- For cross_repo_agents, resolve the ref against petry-projects/.github via
  `gh api repos/.../commits/<ref>` (an `origin/` prefix is stripped → its main),
  and publish with `--push`: create the annotated `<name>/vX.Y.Z` release object
  + force-move the `<name>/<channel>` tag via `gh api git/tags` + `git/refs`.
- This-repo agents (pr-review, dev-lead) keep the existing local-git path
  unchanged. Immutability is preserved cross-repo: an existing release tag is
  never overwritten.
- `--push` for a cross-repo agent needs GH_TOKEN with contents:write on .github.

New helpers (strip_origin pure; gh_resolve_sha / gh_tag_exists /
gh_create_annotated_tag / gh_move_tag wrappers). Tests: +4 strip_origin pure
cases and a new gh-mocked integration suite (dry-run / print-only / --push
create+move / immutability refusal / native path untouched) — 46 pass,
shellcheck clean. Docs (versioning.md, runbook.md) updated: cross-repo path is
now wired, not "dry-run only".

Refs #872, #870.

* fix(reviews): address review comments [skip ci-relay]

---------

Co-authored-by: Claude Code Bot <bot@petry-projects>
Co-authored-by: donpetry-bot <281750570+donpetry-bot@users.noreply.github.com>
don-petry added a commit that referenced this pull request Aug 3, 2026
* feat: wire cut-release.sh cross-repo publish via gh api (#872)

The six #482 reusables + feature-ideation are hosted in petry-projects/.github,
so their release/channel tags belong on THAT repo. cut-release.sh previously
resolved refs against local git and refused live cross-repo cuts (the push
target was an open question). This wires it:

- For cross_repo_agents, resolve the ref against petry-projects/.github via
  `gh api repos/.../commits/<ref>` (an `origin/` prefix is stripped → its main),
  and publish with `--push`: create the annotated `<name>/vX.Y.Z` release object
  + force-move the `<name>/<channel>` tag via `gh api git/tags` + `git/refs`.
- This-repo agents (pr-review, dev-lead) keep the existing local-git path
  unchanged. Immutability is preserved cross-repo: an existing release tag is
  never overwritten.
- `--push` for a cross-repo agent needs GH_TOKEN with contents:write on .github.

New helpers (strip_origin pure; gh_resolve_sha / gh_tag_exists /
gh_create_annotated_tag / gh_move_tag wrappers). Tests: +4 strip_origin pure
cases and a new gh-mocked integration suite (dry-run / print-only / --push
create+move / immutability refusal / native path untouched) — 46 pass,
shellcheck clean. Docs (versioning.md, runbook.md) updated: cross-repo path is
now wired, not "dry-run only".

Refs #872, #870.

* fix(reviews): address review comments [skip ci-relay]

---------

Co-authored-by: Claude Code Bot <bot@petry-projects>
Co-authored-by: donpetry-bot <281750570+donpetry-bot@users.noreply.github.com>
don-petry added a commit that referenced this pull request Aug 3, 2026
* feat: wire cut-release.sh cross-repo publish via gh api (#872)

The six #482 reusables + feature-ideation are hosted in petry-projects/.github,
so their release/channel tags belong on THAT repo. cut-release.sh previously
resolved refs against local git and refused live cross-repo cuts (the push
target was an open question). This wires it:

- For cross_repo_agents, resolve the ref against petry-projects/.github via
  `gh api repos/.../commits/<ref>` (an `origin/` prefix is stripped → its main),
  and publish with `--push`: create the annotated `<name>/vX.Y.Z` release object
  + force-move the `<name>/<channel>` tag via `gh api git/tags` + `git/refs`.
- This-repo agents (pr-review, dev-lead) keep the existing local-git path
  unchanged. Immutability is preserved cross-repo: an existing release tag is
  never overwritten.
- `--push` for a cross-repo agent needs GH_TOKEN with contents:write on .github.

New helpers (strip_origin pure; gh_resolve_sha / gh_tag_exists /
gh_create_annotated_tag / gh_move_tag wrappers). Tests: +4 strip_origin pure
cases and a new gh-mocked integration suite (dry-run / print-only / --push
create+move / immutability refusal / native path untouched) — 46 pass,
shellcheck clean. Docs (versioning.md, runbook.md) updated: cross-repo path is
now wired, not "dry-run only".

Refs #872, #870.

* fix(reviews): address review comments [skip ci-relay]

---------

Co-authored-by: Claude Code Bot <bot@petry-projects>
Co-authored-by: donpetry-bot <281750570+donpetry-bot@users.noreply.github.com>
don-petry added a commit that referenced this pull request Aug 3, 2026
* feat: wire cut-release.sh cross-repo publish via gh api (#872)

The six #482 reusables + feature-ideation are hosted in petry-projects/.github,
so their release/channel tags belong on THAT repo. cut-release.sh previously
resolved refs against local git and refused live cross-repo cuts (the push
target was an open question). This wires it:

- For cross_repo_agents, resolve the ref against petry-projects/.github via
  `gh api repos/.../commits/<ref>` (an `origin/` prefix is stripped → its main),
  and publish with `--push`: create the annotated `<name>/vX.Y.Z` release object
  + force-move the `<name>/<channel>` tag via `gh api git/tags` + `git/refs`.
- This-repo agents (pr-review, dev-lead) keep the existing local-git path
  unchanged. Immutability is preserved cross-repo: an existing release tag is
  never overwritten.
- `--push` for a cross-repo agent needs GH_TOKEN with contents:write on .github.

New helpers (strip_origin pure; gh_resolve_sha / gh_tag_exists /
gh_create_annotated_tag / gh_move_tag wrappers). Tests: +4 strip_origin pure
cases and a new gh-mocked integration suite (dry-run / print-only / --push
create+move / immutability refusal / native path untouched) — 46 pass,
shellcheck clean. Docs (versioning.md, runbook.md) updated: cross-repo path is
now wired, not "dry-run only".

Refs #872, #870.

* fix(reviews): address review comments [skip ci-relay]

---------

Co-authored-by: Claude Code Bot <bot@petry-projects>
Co-authored-by: donpetry-bot <281750570+donpetry-bot@users.noreply.github.com>
don-petry added a commit that referenced this pull request Aug 7, 2026
* feat: wire cut-release.sh cross-repo publish via gh api (#872)

The six #482 reusables + feature-ideation are hosted in petry-projects/.github,
so their release/channel tags belong on THAT repo. cut-release.sh previously
resolved refs against local git and refused live cross-repo cuts (the push
target was an open question). This wires it:

- For cross_repo_agents, resolve the ref against petry-projects/.github via
  `gh api repos/.../commits/<ref>` (an `origin/` prefix is stripped → its main),
  and publish with `--push`: create the annotated `<name>/vX.Y.Z` release object
  + force-move the `<name>/<channel>` tag via `gh api git/tags` + `git/refs`.
- This-repo agents (pr-review, dev-lead) keep the existing local-git path
  unchanged. Immutability is preserved cross-repo: an existing release tag is
  never overwritten.
- `--push` for a cross-repo agent needs GH_TOKEN with contents:write on .github.

New helpers (strip_origin pure; gh_resolve_sha / gh_tag_exists /
gh_create_annotated_tag / gh_move_tag wrappers). Tests: +4 strip_origin pure
cases and a new gh-mocked integration suite (dry-run / print-only / --push
create+move / immutability refusal / native path untouched) — 46 pass,
shellcheck clean. Docs (versioning.md, runbook.md) updated: cross-repo path is
now wired, not "dry-run only".

Refs #872, #870.

* fix(reviews): address review comments [skip ci-relay]

---------

Co-authored-by: Claude Code Bot <bot@petry-projects>
Co-authored-by: donpetry-bot <281750570+donpetry-bot@users.noreply.github.com>
don-petry added a commit that referenced this pull request Aug 7, 2026
* feat: wire cut-release.sh cross-repo publish via gh api (#872)

The six #482 reusables + feature-ideation are hosted in petry-projects/.github,
so their release/channel tags belong on THAT repo. cut-release.sh previously
resolved refs against local git and refused live cross-repo cuts (the push
target was an open question). This wires it:

- For cross_repo_agents, resolve the ref against petry-projects/.github via
  `gh api repos/.../commits/<ref>` (an `origin/` prefix is stripped → its main),
  and publish with `--push`: create the annotated `<name>/vX.Y.Z` release object
  + force-move the `<name>/<channel>` tag via `gh api git/tags` + `git/refs`.
- This-repo agents (pr-review, dev-lead) keep the existing local-git path
  unchanged. Immutability is preserved cross-repo: an existing release tag is
  never overwritten.
- `--push` for a cross-repo agent needs GH_TOKEN with contents:write on .github.

New helpers (strip_origin pure; gh_resolve_sha / gh_tag_exists /
gh_create_annotated_tag / gh_move_tag wrappers). Tests: +4 strip_origin pure
cases and a new gh-mocked integration suite (dry-run / print-only / --push
create+move / immutability refusal / native path untouched) — 46 pass,
shellcheck clean. Docs (versioning.md, runbook.md) updated: cross-repo path is
now wired, not "dry-run only".

Refs #872, #870.

* fix(reviews): address review comments [skip ci-relay]

---------

Co-authored-by: Claude Code Bot <bot@petry-projects>
Co-authored-by: donpetry-bot <281750570+donpetry-bot@users.noreply.github.com>
don-petry added a commit that referenced this pull request Aug 7, 2026
* feat: wire cut-release.sh cross-repo publish via gh api (#872)

The six #482 reusables + feature-ideation are hosted in petry-projects/.github,
so their release/channel tags belong on THAT repo. cut-release.sh previously
resolved refs against local git and refused live cross-repo cuts (the push
target was an open question). This wires it:

- For cross_repo_agents, resolve the ref against petry-projects/.github via
  `gh api repos/.../commits/<ref>` (an `origin/` prefix is stripped → its main),
  and publish with `--push`: create the annotated `<name>/vX.Y.Z` release object
  + force-move the `<name>/<channel>` tag via `gh api git/tags` + `git/refs`.
- This-repo agents (pr-review, dev-lead) keep the existing local-git path
  unchanged. Immutability is preserved cross-repo: an existing release tag is
  never overwritten.
- `--push` for a cross-repo agent needs GH_TOKEN with contents:write on .github.

New helpers (strip_origin pure; gh_resolve_sha / gh_tag_exists /
gh_create_annotated_tag / gh_move_tag wrappers). Tests: +4 strip_origin pure
cases and a new gh-mocked integration suite (dry-run / print-only / --push
create+move / immutability refusal / native path untouched) — 46 pass,
shellcheck clean. Docs (versioning.md, runbook.md) updated: cross-repo path is
now wired, not "dry-run only".

Refs #872, #870.

* fix(reviews): address review comments [skip ci-relay]

---------

Co-authored-by: Claude Code Bot <bot@petry-projects>
Co-authored-by: donpetry-bot <281750570+donpetry-bot@users.noreply.github.com>
don-petry added a commit that referenced this pull request Aug 7, 2026
* feat: wire cut-release.sh cross-repo publish via gh api (#872)

The six #482 reusables + feature-ideation are hosted in petry-projects/.github,
so their release/channel tags belong on THAT repo. cut-release.sh previously
resolved refs against local git and refused live cross-repo cuts (the push
target was an open question). This wires it:

- For cross_repo_agents, resolve the ref against petry-projects/.github via
  `gh api repos/.../commits/<ref>` (an `origin/` prefix is stripped → its main),
  and publish with `--push`: create the annotated `<name>/vX.Y.Z` release object
  + force-move the `<name>/<channel>` tag via `gh api git/tags` + `git/refs`.
- This-repo agents (pr-review, dev-lead) keep the existing local-git path
  unchanged. Immutability is preserved cross-repo: an existing release tag is
  never overwritten.
- `--push` for a cross-repo agent needs GH_TOKEN with contents:write on .github.

New helpers (strip_origin pure; gh_resolve_sha / gh_tag_exists /
gh_create_annotated_tag / gh_move_tag wrappers). Tests: +4 strip_origin pure
cases and a new gh-mocked integration suite (dry-run / print-only / --push
create+move / immutability refusal / native path untouched) — 46 pass,
shellcheck clean. Docs (versioning.md, runbook.md) updated: cross-repo path is
now wired, not "dry-run only".

Refs #872, #870.

* fix(reviews): address review comments [skip ci-relay]

---------

Co-authored-by: Claude Code Bot <bot@petry-projects>
Co-authored-by: donpetry-bot <281750570+donpetry-bot@users.noreply.github.com>
don-petry added a commit that referenced this pull request Aug 7, 2026
* feat: wire cut-release.sh cross-repo publish via gh api (#872)

The six #482 reusables + feature-ideation are hosted in petry-projects/.github,
so their release/channel tags belong on THAT repo. cut-release.sh previously
resolved refs against local git and refused live cross-repo cuts (the push
target was an open question). This wires it:

- For cross_repo_agents, resolve the ref against petry-projects/.github via
  `gh api repos/.../commits/<ref>` (an `origin/` prefix is stripped → its main),
  and publish with `--push`: create the annotated `<name>/vX.Y.Z` release object
  + force-move the `<name>/<channel>` tag via `gh api git/tags` + `git/refs`.
- This-repo agents (pr-review, dev-lead) keep the existing local-git path
  unchanged. Immutability is preserved cross-repo: an existing release tag is
  never overwritten.
- `--push` for a cross-repo agent needs GH_TOKEN with contents:write on .github.

New helpers (strip_origin pure; gh_resolve_sha / gh_tag_exists /
gh_create_annotated_tag / gh_move_tag wrappers). Tests: +4 strip_origin pure
cases and a new gh-mocked integration suite (dry-run / print-only / --push
create+move / immutability refusal / native path untouched) — 46 pass,
shellcheck clean. Docs (versioning.md, runbook.md) updated: cross-repo path is
now wired, not "dry-run only".

Refs #872, #870.

* fix(reviews): address review comments [skip ci-relay]

---------

Co-authored-by: Claude Code Bot <bot@petry-projects>
Co-authored-by: donpetry-bot <281750570+donpetry-bot@users.noreply.github.com>
don-petry added a commit that referenced this pull request Aug 7, 2026
* feat: wire cut-release.sh cross-repo publish via gh api (#872)

The six #482 reusables + feature-ideation are hosted in petry-projects/.github,
so their release/channel tags belong on THAT repo. cut-release.sh previously
resolved refs against local git and refused live cross-repo cuts (the push
target was an open question). This wires it:

- For cross_repo_agents, resolve the ref against petry-projects/.github via
  `gh api repos/.../commits/<ref>` (an `origin/` prefix is stripped → its main),
  and publish with `--push`: create the annotated `<name>/vX.Y.Z` release object
  + force-move the `<name>/<channel>` tag via `gh api git/tags` + `git/refs`.
- This-repo agents (pr-review, dev-lead) keep the existing local-git path
  unchanged. Immutability is preserved cross-repo: an existing release tag is
  never overwritten.
- `--push` for a cross-repo agent needs GH_TOKEN with contents:write on .github.

New helpers (strip_origin pure; gh_resolve_sha / gh_tag_exists /
gh_create_annotated_tag / gh_move_tag wrappers). Tests: +4 strip_origin pure
cases and a new gh-mocked integration suite (dry-run / print-only / --push
create+move / immutability refusal / native path untouched) — 46 pass,
shellcheck clean. Docs (versioning.md, runbook.md) updated: cross-repo path is
now wired, not "dry-run only".

Refs #872, #870.

* fix(reviews): address review comments [skip ci-relay]

---------

Co-authored-by: Claude Code Bot <bot@petry-projects>
Co-authored-by: donpetry-bot <281750570+donpetry-bot@users.noreply.github.com>
don-petry added a commit that referenced this pull request Aug 7, 2026
* feat: wire cut-release.sh cross-repo publish via gh api (#872)

The six #482 reusables + feature-ideation are hosted in petry-projects/.github,
so their release/channel tags belong on THAT repo. cut-release.sh previously
resolved refs against local git and refused live cross-repo cuts (the push
target was an open question). This wires it:

- For cross_repo_agents, resolve the ref against petry-projects/.github via
  `gh api repos/.../commits/<ref>` (an `origin/` prefix is stripped → its main),
  and publish with `--push`: create the annotated `<name>/vX.Y.Z` release object
  + force-move the `<name>/<channel>` tag via `gh api git/tags` + `git/refs`.
- This-repo agents (pr-review, dev-lead) keep the existing local-git path
  unchanged. Immutability is preserved cross-repo: an existing release tag is
  never overwritten.
- `--push` for a cross-repo agent needs GH_TOKEN with contents:write on .github.

New helpers (strip_origin pure; gh_resolve_sha / gh_tag_exists /
gh_create_annotated_tag / gh_move_tag wrappers). Tests: +4 strip_origin pure
cases and a new gh-mocked integration suite (dry-run / print-only / --push
create+move / immutability refusal / native path untouched) — 46 pass,
shellcheck clean. Docs (versioning.md, runbook.md) updated: cross-repo path is
now wired, not "dry-run only".

Refs #872, #870.

* fix(reviews): address review comments [skip ci-relay]

---------

Co-authored-by: Claude Code Bot <bot@petry-projects>
Co-authored-by: donpetry-bot <281750570+donpetry-bot@users.noreply.github.com>
don-petry added a commit that referenced this pull request Aug 7, 2026
* feat: wire cut-release.sh cross-repo publish via gh api (#872)

The six #482 reusables + feature-ideation are hosted in petry-projects/.github,
so their release/channel tags belong on THAT repo. cut-release.sh previously
resolved refs against local git and refused live cross-repo cuts (the push
target was an open question). This wires it:

- For cross_repo_agents, resolve the ref against petry-projects/.github via
  `gh api repos/.../commits/<ref>` (an `origin/` prefix is stripped → its main),
  and publish with `--push`: create the annotated `<name>/vX.Y.Z` release object
  + force-move the `<name>/<channel>` tag via `gh api git/tags` + `git/refs`.
- This-repo agents (pr-review, dev-lead) keep the existing local-git path
  unchanged. Immutability is preserved cross-repo: an existing release tag is
  never overwritten.
- `--push` for a cross-repo agent needs GH_TOKEN with contents:write on .github.

New helpers (strip_origin pure; gh_resolve_sha / gh_tag_exists /
gh_create_annotated_tag / gh_move_tag wrappers). Tests: +4 strip_origin pure
cases and a new gh-mocked integration suite (dry-run / print-only / --push
create+move / immutability refusal / native path untouched) — 46 pass,
shellcheck clean. Docs (versioning.md, runbook.md) updated: cross-repo path is
now wired, not "dry-run only".

Refs #872, #870.

* fix(reviews): address review comments [skip ci-relay]

---------

Co-authored-by: Claude Code Bot <bot@petry-projects>
Co-authored-by: donpetry-bot <281750570+donpetry-bot@users.noreply.github.com>
don-petry added a commit that referenced this pull request Aug 8, 2026
* feat: wire cut-release.sh cross-repo publish via gh api (#872)

The six #482 reusables + feature-ideation are hosted in petry-projects/.github,
so their release/channel tags belong on THAT repo. cut-release.sh previously
resolved refs against local git and refused live cross-repo cuts (the push
target was an open question). This wires it:

- For cross_repo_agents, resolve the ref against petry-projects/.github via
  `gh api repos/.../commits/<ref>` (an `origin/` prefix is stripped → its main),
  and publish with `--push`: create the annotated `<name>/vX.Y.Z` release object
  + force-move the `<name>/<channel>` tag via `gh api git/tags` + `git/refs`.
- This-repo agents (pr-review, dev-lead) keep the existing local-git path
  unchanged. Immutability is preserved cross-repo: an existing release tag is
  never overwritten.
- `--push` for a cross-repo agent needs GH_TOKEN with contents:write on .github.

New helpers (strip_origin pure; gh_resolve_sha / gh_tag_exists /
gh_create_annotated_tag / gh_move_tag wrappers). Tests: +4 strip_origin pure
cases and a new gh-mocked integration suite (dry-run / print-only / --push
create+move / immutability refusal / native path untouched) — 46 pass,
shellcheck clean. Docs (versioning.md, runbook.md) updated: cross-repo path is
now wired, not "dry-run only".

Refs #872, #870.

* fix(reviews): address review comments [skip ci-relay]

---------

Co-authored-by: Claude Code Bot <bot@petry-projects>
Co-authored-by: donpetry-bot <281750570+donpetry-bot@users.noreply.github.com>
don-petry added a commit that referenced this pull request Aug 8, 2026
* feat: wire cut-release.sh cross-repo publish via gh api (#872)

The six #482 reusables + feature-ideation are hosted in petry-projects/.github,
so their release/channel tags belong on THAT repo. cut-release.sh previously
resolved refs against local git and refused live cross-repo cuts (the push
target was an open question). This wires it:

- For cross_repo_agents, resolve the ref against petry-projects/.github via
  `gh api repos/.../commits/<ref>` (an `origin/` prefix is stripped → its main),
  and publish with `--push`: create the annotated `<name>/vX.Y.Z` release object
  + force-move the `<name>/<channel>` tag via `gh api git/tags` + `git/refs`.
- This-repo agents (pr-review, dev-lead) keep the existing local-git path
  unchanged. Immutability is preserved cross-repo: an existing release tag is
  never overwritten.
- `--push` for a cross-repo agent needs GH_TOKEN with contents:write on .github.

New helpers (strip_origin pure; gh_resolve_sha / gh_tag_exists /
gh_create_annotated_tag / gh_move_tag wrappers). Tests: +4 strip_origin pure
cases and a new gh-mocked integration suite (dry-run / print-only / --push
create+move / immutability refusal / native path untouched) — 46 pass,
shellcheck clean. Docs (versioning.md, runbook.md) updated: cross-repo path is
now wired, not "dry-run only".

Refs #872, #870.

* fix(reviews): address review comments [skip ci-relay]

---------

Co-authored-by: Claude Code Bot <bot@petry-projects>
Co-authored-by: donpetry-bot <281750570+donpetry-bot@users.noreply.github.com>
don-petry added a commit that referenced this pull request Aug 8, 2026
* feat: wire cut-release.sh cross-repo publish via gh api (#872)

The six #482 reusables + feature-ideation are hosted in petry-projects/.github,
so their release/channel tags belong on THAT repo. cut-release.sh previously
resolved refs against local git and refused live cross-repo cuts (the push
target was an open question). This wires it:

- For cross_repo_agents, resolve the ref against petry-projects/.github via
  `gh api repos/.../commits/<ref>` (an `origin/` prefix is stripped → its main),
  and publish with `--push`: create the annotated `<name>/vX.Y.Z` release object
  + force-move the `<name>/<channel>` tag via `gh api git/tags` + `git/refs`.
- This-repo agents (pr-review, dev-lead) keep the existing local-git path
  unchanged. Immutability is preserved cross-repo: an existing release tag is
  never overwritten.
- `--push` for a cross-repo agent needs GH_TOKEN with contents:write on .github.

New helpers (strip_origin pure; gh_resolve_sha / gh_tag_exists /
gh_create_annotated_tag / gh_move_tag wrappers). Tests: +4 strip_origin pure
cases and a new gh-mocked integration suite (dry-run / print-only / --push
create+move / immutability refusal / native path untouched) — 46 pass,
shellcheck clean. Docs (versioning.md, runbook.md) updated: cross-repo path is
now wired, not "dry-run only".

Refs #872, #870.

* fix(reviews): address review comments [skip ci-relay]

---------

Co-authored-by: Claude Code Bot <bot@petry-projects>
Co-authored-by: donpetry-bot <281750570+donpetry-bot@users.noreply.github.com>
don-petry added a commit that referenced this pull request Aug 8, 2026
* feat: wire cut-release.sh cross-repo publish via gh api (#872)

The six #482 reusables + feature-ideation are hosted in petry-projects/.github,
so their release/channel tags belong on THAT repo. cut-release.sh previously
resolved refs against local git and refused live cross-repo cuts (the push
target was an open question). This wires it:

- For cross_repo_agents, resolve the ref against petry-projects/.github via
  `gh api repos/.../commits/<ref>` (an `origin/` prefix is stripped → its main),
  and publish with `--push`: create the annotated `<name>/vX.Y.Z` release object
  + force-move the `<name>/<channel>` tag via `gh api git/tags` + `git/refs`.
- This-repo agents (pr-review, dev-lead) keep the existing local-git path
  unchanged. Immutability is preserved cross-repo: an existing release tag is
  never overwritten.
- `--push` for a cross-repo agent needs GH_TOKEN with contents:write on .github.

New helpers (strip_origin pure; gh_resolve_sha / gh_tag_exists /
gh_create_annotated_tag / gh_move_tag wrappers). Tests: +4 strip_origin pure
cases and a new gh-mocked integration suite (dry-run / print-only / --push
create+move / immutability refusal / native path untouched) — 46 pass,
shellcheck clean. Docs (versioning.md, runbook.md) updated: cross-repo path is
now wired, not "dry-run only".

Refs #872, #870.

* fix(reviews): address review comments [skip ci-relay]

---------

Co-authored-by: Claude Code Bot <bot@petry-projects>
Co-authored-by: donpetry-bot <281750570+donpetry-bot@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants