| name | release_updates |
| description | Run weekly release docs updates with standalone scripts for changelog, licenses, and telemetry, plus Linux/Oz Warp artifact preparation. Defaults to running all tasks in order, and supports running only selected tasks. |
Release updates
Use this skill to update docs for weekly releases.
The scripts are designed for Oz cloud runs (Linux) and local testing.
They support the following:
- docs repo checkouts in different locations
(
/docs, sibling repo, current repo)
- optional channel-versions repo checkouts
(
/channel-versions, sibling repo)
- running one task or all tasks in the required order
Environment requirements (Oz cloud)
Required
- Repo: docs repo (this repo) containing the
release_updates skill.
- Runtime: glibc-based Linux image (Debian/Ubuntu-style image recommended).
- Commands:
python3, git.
- Network access:
releases.warp.dev (channel versions fallback) and
app.warp.dev (Warp AppImage download).
Required for PR mode
- Command:
gh CLI
- Auth:
gh auth status must be healthy in the run environment.
- GitHub repo write access for branch push + PR create/update.
Required for Slack PR notification
DOCS_SLACK_BOT_TOKEN environment variable (Oz team secret — add to the docs agent environment).
Recommended
- Local checkout of
warpdotdev/channel-versions so changelog updates read local
channel_versions.json instead of URL fallback.
Bootstrap/check the environment
Use this helper script before running release updates:
python3 .agents/skills/release_updates/scripts/setup_environment.py \
--docs-repo /docs \
--clone-channel-versions-if-missing \
--require-pr-flow
If you also want automatic reviewer assignment checks:
python3 .agents/skills/release_updates/scripts/setup_environment.py \
--docs-repo /docs \
--clone-channel-versions-if-missing \
--require-pr-flow \
--require-oncall-reviewer
Scripts
All scripts are in .agents/skills/release_updates/scripts/:
setup_environment.py - Validate/prepare repos, CLI auth, and reviewer
assignment prerequisites before release runs
resolve_oncall_reviewers.py - Resolve primary/secondary Grafana on-call
users to GitHub reviewers
update_warp_app.py - Download latest stable + preview Linux AppImages and
build a manifest for downstream tasks. On Linux, it preflights
libasound.so.2 before telemetry usage.
update_changelog.py - Incrementally update
src/content/docs/changelog/{year}.mdx from channel versions
update_licenses.py - Regenerate
src/content/docs/support-and-community/community/open-source-licenses.mdx
update_telemetry.py - Regenerate
src/content/docs/support-and-community/privacy-and-security/privacy.mdx
telemetry table
run_release_updates.py - Orchestrates selected tasks (defaults to all, in
order)
Default workflow (all tasks, ordered)
python3 .agents/skills/release_updates/scripts/run_release_updates.py
Default order:
warp_app_update
changelog
licenses
telemetry
Run only selected tasks
Changelog-only (useful while rolling out incrementally):
python3 .agents/skills/release_updates/scripts/run_release_updates.py \
--tasks changelog
Specific subset:
python3 .agents/skills/release_updates/scripts/run_release_updates.py \
--tasks warp_app_update changelog
Useful options
Local testing
On non-Linux machines, skip AppImage extraction:
python3 .agents/skills/release_updates/scripts/run_release_updates.py \
--skip-warp-app-extract \
--tasks changelog
On Linux/Oz, let warp_app_update auto-install a missing ALSA runtime package:
python3 .agents/skills/release_updates/scripts/run_release_updates.py \
--tasks warp_app_update \
--auto-install-missing-dependency
If your environment already guarantees dependencies, you can skip the check:
python3 .agents/skills/release_updates/scripts/run_release_updates.py \
--tasks warp_app_update \
--skip-dependency-preflight
Dry run:
python3 .agents/skills/release_updates/scripts/run_release_updates.py --dry-run
Create or update a PR at the end
run_release_updates.py can commit generated changes, push the branch, and
create/update a PR automatically:
python3 .agents/skills/release_updates/scripts/run_release_updates.py \
--create-pr \
--pr-base main
You can customize commit/PR metadata:
python3 .agents/skills/release_updates/scripts/run_release_updates.py \
--create-pr \
--commit-message "docs: weekly release updates" \
--pr-title "docs: weekly release updates" \
--pr-body-file /tmp/release-pr-body.md
Post Slack notification after creating a PR
After the PR is created, post a notification to the #oncall-client Slack channel (C06MT1NRBFV):
import json, os, sys, urllib.request
token = os.environ.get('DOCS_SLACK_BOT_TOKEN')
channel = 'C06MT1NRBFV'
if not token:
print('DOCS_SLACK_BOT_TOKEN not set — skipping Slack notification')
else:
req = urllib.request.Request(
'https://slack.com/api/usergroups.list',
headers={'Authorization': f'Bearer {token}'}
)
with urllib.request.urlopen(req) as resp:
groups = json.loads(resp.read()).get('usergroups', [])
primary_id = next((g['id'] for g in groups if g.get('handle') == 'oncall-client-primary'), None)
secondary_id = next((g['id'] for g in groups if g.get('handle') == 'oncall-client-secondary'), None)
primary = f'<!subteam^{primary_id}|oncall-client-primary>' if primary_id else '@oncall-client-primary'
secondary = f'<!subteam^{secondary_id}|oncall-client-secondary>' if secondary_id else '@oncall-client-secondary'
message = f':books: New release docs PR ready for review\n{pr_url}\n{primary} {secondary} please take a look when you get a chance.'
body = json.dumps({'channel': channel, 'text': message, 'mrkdwn': True}).encode()
req = urllib.request.Request(
'https://slack.com/api/chat.postMessage',
data=body,
headers={'Authorization': f'Bearer {token}', 'Content-Type': 'application/json'}
)
with urllib.request.urlopen(req) as resp:
result = json.loads(resp.read())
if not result.get('ok'):
print(f'Slack error: {result.get("error")}', file=sys.stderr)
else:
print(f'Slack notification sent to {channel}')
The GitHub Actions workflow handles assigning the last human reviewer from recent docs PRs — the agent does not need to assign reviewers.
Explicit repo paths
If auto-detection is not enough:
python3 .agents/skills/release_updates/scripts/run_release_updates.py \
--docs-repo /docs \
--channel-versions-repo /channel-versions
Or point directly to a specific channel versions file:
python3 .agents/skills/release_updates/scripts/run_release_updates.py \
--channel-versions-file /channel-versions/channel_versions.json
Artifact handoff between scripts
update_warp_app.py writes a manifest at:
/tmp/release-updates/warp_artifacts.json (by default)
update_licenses.py and update_telemetry.py read that manifest unless
explicit input paths are provided.