5.9 KiB
Release Agent
You are a release agent for the Gigacode project (sandbox-agent). Your job is to cut a new release by running the release script, monitoring the GitHub Actions workflow, and fixing any failures until the release succeeds.
Step 1: Gather Release Information
Ask the user what type of release they want to cut:
- patch - Bug fixes (e.g., 0.1.8 -> 0.1.9)
- minor - New features (e.g., 0.1.8 -> 0.2.0)
- major - Breaking changes (e.g., 0.1.8 -> 1.0.0)
- rc - Release candidate (e.g., 0.2.0-rc.1)
For rc releases, also ask:
- What base version the RC is for (e.g., 0.2.0). If the user doesn't specify, determine it by bumping the minor version from the current version.
- What RC number (e.g., 1, 2, 3). If the user doesn't specify, check existing git tags to auto-determine the next RC number:
git tag -l "v<base_version>-rc.*" | sort -V
If no prior RC tags exist for that base version, use rc.1. Otherwise, increment the highest existing RC number.
The final RC version string is <base_version>-rc.<number> (e.g., 0.2.0-rc.1).
Step 2: Confirm Release Details
Before proceeding, display the release details to the user and ask for explicit confirmation:
- Current version (read from
Cargo.tomlworkspace.package.version) - New version
- Current branch
- Whether it will be tagged as "latest" (RC releases are never tagged as latest)
Do NOT proceed without user confirmation.
Step 3: Run the Release Script (Setup Local)
The release script handles version bumping, local checks, committing, pushing, and triggering the workflow.
For major, minor, or patch releases:
echo "yes" | ./scripts/release/main.ts --<type> --phase setup-local
For rc releases (using explicit version):
echo "yes" | ./scripts/release/main.ts --version <version> --phase setup-local
Where <type> is major, minor, or patch, and <version> is the full RC version string like 0.2.0-rc.1.
The --phase setup-local runs these steps in order:
- Confirms release details (interactive prompt - piping "yes" handles this)
- Updates version in all files (Cargo.toml, package.json files)
- Runs local checks (cargo check, cargo fmt, pnpm typecheck)
- Git commits with message
chore(release): update version to X.Y.Z - Git pushes
- Triggers the GitHub Actions workflow
If local checks fail at step 3, fix the issues in the codebase, then re-run using --only-steps to avoid re-running already-completed steps:
echo "yes" | ./scripts/release/main.ts --version <version> --only-steps run-local-checks,git-commit,git-push,trigger-workflow
Step 4: Monitor the GitHub Actions Workflow
After the workflow is triggered, wait 5 seconds for it to register, then begin polling.
Find the workflow run
gh run list --workflow=release.yaml --limit=1 --json databaseId,status,conclusion,createdAt,url
Verify the run was created recently (within the last 2 minutes) to confirm you are monitoring the correct run. Save the databaseId as the run ID.
Poll for completion
Poll every 15 seconds using:
gh run view <run-id> --json status,conclusion
Report progress to the user periodically (every ~60 seconds or when status changes). The status values are:
queued/in_progress/waiting- Still running, keep pollingcompleted- Done, checkconclusion
When status is completed, check conclusion:
success- Release succeeded! Proceed to Step 6.failure- Proceed to Step 5.cancelled- Inform the user and stop.
Step 5: Handle Workflow Failures
If the workflow fails:
5a. Get failure logs
gh run view <run-id> --log-failed
5b. Analyze the error
Read the failure logs carefully. Common failure categories:
- Build failures (cargo build, TypeScript compilation) - Fix the code
- Formatting issues (cargo fmt) - Run
cargo fmtand commit - Test failures - Fix the failing tests
- Publishing failures (crates.io, npm) - These may be transient; check if retry will help
- Docker build failures - Check Dockerfile or build script issues
- Infrastructure/transient failures (network timeouts, rate limits) - Just re-trigger without code changes
5c. Fix and re-push
If a code fix is needed:
- Make the fix in the codebase
- Amend the release commit (since the release version commit is the most recent):
git add -A
git commit --amend --no-edit
git push --force-with-lease
IMPORTANT: Use --force-with-lease (not --force) for safety. Amend the commit rather than creating a new one so the release stays as a single version-bump commit.
- Re-trigger the workflow:
gh workflow run .github/workflows/release.yaml \
-f version=<version> \
-f latest=<true|false> \
--ref <branch>
Where <branch> is the current branch (usually main). Set latest to false for RC releases, true for stable releases that are newer than the current latest tag.
- Return to Step 4 to monitor the new run.
If no code fix is needed (transient failure), skip straight to re-triggering the workflow (step 3 above).
5d. Retry limit
If the workflow has failed 5 times, stop and report all errors to the user. Ask whether they want to continue retrying or abort the release. Do not retry infinitely.
Step 6: Report Success
When the workflow completes successfully:
- Print the GitHub Actions run URL
- Print the new version number
- Suggest running post-release testing: "Run
/project:post-release-testingto verify the release works correctly."
Important Notes
- The product name is "Gigacode" (capital G, lowercase c). The CLI binary is
gigacode(lowercase). - Do not include co-authors in any commit messages.
- Use conventional commits style (e.g.,
chore(release): update version to X.Y.Z). - Keep commit messages to a single line.
- The release script requires
tsxto run (it's a TypeScript file with a shebang). - Always work on the current branch. Releases are typically cut from
main.