release: rework plugin-artifact publishing to vendor into claude-plugins (v0.15.0 fan-out lessons) #44
Labels
No labels
breaking
bug
documentation
enhancement
epic
good first issue
help wanted
refactoring
resolution/duplicate
resolution/invalid
resolution/wontfix
security
severity/critical
severity/high
severity/low
severity/medium
status/abandoned
status/blocked
status/needs-decision
status/needs-info
status/needs-verification
testing
upstream
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
sixfold-space/madtea#44
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
The v0.15.0 release (first from Codeberg) surfaced three fan-out problems; the release itself published fine (tag, signed artifacts, release page) but
goreleaserand the satellite steps needed manual recovery. The decisions below are the spec.1. Plugin artifact home: vendor INTO
claude-plugins, no separate artifact repo.scripts/assemble-plugin-artifact.shcurrently creates/pushes${PLUGIN_ARTIFACT_ORG}/${PLUGIN_ARTIFACT_REPO_NAME}— which requires thewrite:organizationtoken scope on first run (403 on v0.15.0) and a repo that doesn't exist. The marketplace entry already uses the relative source./plugins/madtea. Rework: assemble stage unchanged, but publish = branch+PR insixfold_space/claude-pluginsupdatingplugins/madtea/and bumping the entry'sversionin the same commit (v0.15.0 was landed exactly this way, claude-plugins PR #1). Drop release.sh's separate marketplace-bump step and itssource.urlretarget (the relative source makes it meaningless — its regex would also abort today since the entry has nourlfield).2. Empty satellite repos break goreleaser's Gitea client.
homebrew-tapandscoop-bucketwere commit-less shells; Gitea's contents API returns an empty ARRAY for paths in an empty repo, which goreleaser reads as "expect file, got directory" and fails AFTER publishing the release — aborting the remaining steps. Both are now seeded (v0.15.0 cask/manifest), so this is documentation: the runbook should note that a fresh satellite must carry at least one commit before its first goreleaser release, and ideally release.sh preflight should check the satellites and fail BEFORE tagging, not after publishing.3. Failure ordering. goreleaser's satellite failure exits release.sh between publish and the plugin-artifact/marketplace steps, leaving a half-fanned-out release with no resume path. Consider: run the artifact/marketplace steps even when goreleaser exits nonzero after a confirmed-published release, or make the script's steps individually re-runnable.
Acceptance:
scripts/release.sh vX.Y.Zend-to-end green against the current (seeded) satellites, including the claude-plugins vendored-artifact PR.write:organizationrequirement anywhere in the flow.docs/contributing/releasing.mdupdated (satellite table: homebrew-tap, scoop-bucket, claude-plugins vendored artifact; no madtea-plugin repo).Audit result (2026-07-15): every code-level acceptance criterion of this issue is already implemented on main - commit
818f3e3acarries the vendor-into-claude-plugins publish (branch + PR updating plugins/madtea/ with the version bump in the same commit, no separate artifact repo, no write:organization anywhere), the satellite non-empty preflight before tagging, and the re-runnable post-publish steps that survive a post-publish goreleaser failure;a59588bbadded the tag-version stamping of the artifact plugin.json. docs/contributing/releasing.md documents the satellite table, preflight, and resume semantics, and the hooks/tests script harness covers the paths. A fresh audit branch produced zero commits - there is nothing left to build.The full gate is green on this state. What remains is exactly what status/needs-live-check means here: the claude-plugins PR step and the preflight get their live exercise at the next release (release.sh vX.Y.Z end-to-end). This issue stays open until that release confirms the flow; no further code work is queued.
Live-verified by the v0.15.2 release (2026-07-16), end-to-end green in one run: satellite readiness preflight passed before tagging (homebrew-tap and scoop-bucket both reachable and non-empty), goreleaser published the release with signed checksums and bumped the cask + scoop manifests, and the plugin artifact was vendored into sixfold_space/claude-plugins as a single branch + PR (#7 there) that updated plugins/madtea/ and bumped the marketplace entry to 0.15.2 in the same commit - opened, merged, and synced by release.sh itself. No separate artifact repo, no write:organization scope anywhere, and the post-publish steps ran to completion. Every acceptance criterion is now both code-verified (commit
818f3e3a, audit 2026-07-15) and exercised against the live forge.