How the Release Workflow Builds and Attaches the Claude Video Skill Bundle
The GitHub Actions release workflow automatically packages the skills/watch directory into a .skill zip archive and attaches it to a GitHub release whenever a version tag is pushed.
The bradautomates/claude-video repository automates its distribution pipeline through a dedicated release workflow. This article explains exactly how the release workflow builds and attaches the skill bundle for Claude Video, covering the trigger conditions, validation logic, and artifact publication process.
Release Trigger and Checkout Configuration
The workflow defined in .github/workflows/release.yml initiates only on specific version tags.
- Trigger pattern: The
on.push.tagsfilter set to"v*"ensures the pipeline runs exclusively when tags likev1.0.0orv2.1.0are pushed【/cache/repos/github.com/bradautomates/claude-video/main/.github/workflows/release.yml#L4-L6】. - Repository history: The checkout step uses
fetch-depth: 0to retrieve the complete git history, which is required for thegit archivecommand to access theskills/watchsubtree【/cache/repos/github.com/bradautomates/claude-video/main/.github/workflows/release.yml#L15-L18】.
Building the Skill Bundle
The core build logic resides in skills/watch/scripts/build-skill.sh, which the workflow invokes during the "Build .skill artifact" step【/cache/repos/github.com/bradautomates/claude-video/main/.github/workflows/release.yml#L20-L23】.
Archive Creation
The script constructs the bundle by archiving the entire skills/watch subtree into a zip file with a specific prefix:
git archive --format=zip --prefix=watch/ --output=dist/watch.skill HEAD:skills/watch
This command generates dist/watch.skill containing all runtime scripts and the mandatory SKILL.md file, prefixed with a watch/ directory for proper namespacing【/cache/repos/github.com/bradautomates/claude-video/main/skills/watch/scripts/build-skill.sh#L11-L22】.
Validation Checks
Before completing, the script enforces two critical constraints required by the Claude AI platform:
- File count limit: The bundle must contain ≤ 200 files to comply with claude.ai upload restrictions.
- Single manifest requirement: Exactly one
SKILL.mdmust be present in the archive.
If either check fails, the script aborts with exit code 1 and prevents the workflow from proceeding【/cache/repos/github.com/bradautomates/claude-video/main/skills/watch/scripts/build-skill.sh#L23-L36】.
Upon successful validation, the script outputs the final bundle statistics:
echo "Built skill bundle: $OUTPUT"
echo "Files: $file_count"
echo "Size: $(du -h "$OUTPUT" | cut -f1)"
Publishing to GitHub Releases
The final step uses softprops/action-gh-release@v2 to create a non-draft, non-prerelease GitHub release with auto-generated notes. It specifically attaches the validated artifact from the build stage:
- name: Create GitHub release
uses: softprops/action-gh-release@v2
with:
files: dist/watch.skill
generate_release_notes: true
draft: false
prerelease: false
This configuration publishes the watch.skill file as a downloadable release asset, making it available for direct upload through the Claude AI skill UI【/cache/repos/github.com/bradautomates/claude-video/main/.github/workflows/release.yml#L25-L30】.
Summary
- Trigger: The workflow activates on tags matching
v*to ensure versioned releases only. - Build: The
build-skill.shscript usesgit archiveto createdist/watch.skillfrom theskills/watchsubtree. - Validation: Enforces a 200-file limit and verifies exactly one
SKILL.mdexists before allowing completion. - Distribution: The
softprops/action-gh-releaseaction automatically attaches the bundle to the GitHub release page.
Frequently Asked Questions
What file format does the Claude Video skill bundle use?
The bundle is a standard ZIP archive with the .skill extension. It is generated using git archive --format=zip and contains the skills/watch directory contents prefixed with a watch/ folder.
Can I build the skill bundle locally without using GitHub Actions?
Yes. Run bash skills/watch/scripts/build-skill.sh from any location inside the repository. The script creates dist/watch.skill and performs the same file count and manifest validation as the CI pipeline.
Why does the checkout step use fetch-depth: 0?
The workflow must fetch the complete git history because the build script relies on git archive to extract the skills/watch subtree. A shallow clone would prevent the archive command from accessing historical file data required for the bundle.
What happens if the skill bundle exceeds 200 files?
The build-skill.sh script detects the violation during validation and exits with an error code, causing the GitHub Actions workflow to fail. This prevents publishing bundles that would be rejected by the claude.ai upload interface.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →