.claude/skills/youtube-uploader/SKILL.md
Autonomously uploads CCW HeyGen demo videos to YouTube as Unlisted, collects video IDs, and patches DemoVideoBanner.tsx + video-registry.json. One-time OAuth setup required. Handles resume, retries, and ID propagation.
npx skillsauth add CleanExpo/CCW-CRM youtube-uploaderInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Upload all 24 CCW ERP demo videos from data/heygen/downloads/ to YouTube as Unlisted,
then automatically update DemoVideoBanner.tsx and video-registry.json with the YouTube IDs.
CCW YouTube Uploaderscripts/youtube_oauth_client.jsoncd "C:\Users\PhillMcGurk\CCW COWORK\CCW-CRM"
python scripts/youtube_upload.py --auth
(Opens browser once — sign in as [email protected] or whichever account owns the channel — approve. Token cached at scripts/.youtube_token.json.)| File | Description |
| --------------------------------------------------- | ---------------------------------- |
| data/heygen/downloads/*.mp4 | 24 downloaded HeyGen videos |
| scripts/youtube_oauth_client.json | Google OAuth credentials |
| data/heygen/video-registry.json | Registry to patch with YouTube IDs |
| apps/web/components/dashboard/DemoVideoBanner.tsx | Banner component to patch |
python scripts/youtube_upload.py --status
python scripts/youtube_upload.py --upload
data/heygen/youtube-upload-log.json after each videovideo-registry.json + DemoVideoBanner.tsxpython scripts/youtube_upload.py --patch-only
cd "C:\Users\PhillMcGurk\CCW COWORK\CCW-CRM"
git add data/heygen/youtube-upload-log.json data/heygen/video-registry.json apps/web/components/dashboard/DemoVideoBanner.tsx
git commit -m "feat(youtube): add YouTube IDs for all 24 CCW demo videos"
git push origin fix/railway-cache-auth-500
data/heygen/video-registry.jsonEach video entry gets:
{
"youtubeId": "dQw4w9WgXcQ",
"youtubeUrl": "https://youtu.be/dQw4w9WgXcQ",
"status": "published"
}
apps/web/components/dashboard/DemoVideoBanner.tsxEach youtubeId: null entry gets patched to:
youtubeId: "dQw4w9WgXcQ",
data/heygen/youtube-upload-log.jsonFull upload audit log with timestamps:
{
"dashboard": {
"youtubeId": "dQw4w9WgXcQ",
"youtubeUrl": "https://youtu.be/dQw4w9WgXcQ",
"title": "CCW ERP — Dashboard Overview",
"uploadedAt": "2026-04-01T10:00:00Z"
}
}
# Step 1: Verify downloads exist
python -c "
import os
d = r'C:\Users\PhillMcGurk\CCW COWORK\CCW-CRM\data\heygen\downloads'
files = os.listdir(d)
print(f'{len(files)} MP4 files ready')
"
# Step 2: Check upload status
python scripts/youtube_upload.py --status
# Step 3: If oauth token exists, upload
python scripts/youtube_upload.py --upload
# Step 4: Run TypeScript check
cd apps/web && npx tsc --noEmit
# Step 5: Commit everything
git add data/heygen/youtube-upload-log.json data/heygen/video-registry.json \
apps/web/components/dashboard/DemoVideoBanner.tsx
git commit -m "feat(youtube): add YouTube IDs for all 24 CCW demo videos"
git push origin fix/railway-cache-auth-500
All videos uploaded with:
scripts/youtube_upload.pyscripts/youtube_oauth_client.json (you provide)scripts/.youtube_token.json (auto-generated)data/heygen/youtube-upload-log.json (auto-generated)| Error | Fix |
| ------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- |
| File not found: youtube_oauth_client.json | Download OAuth creds from Google Cloud Console |
| Token expired | Re-run --auth to refresh |
| quotaExceeded | YouTube API quota = 10,000 units/day. Each upload = ~1,600 units. 6 uploads/day max. Resume next day with --upload. |
| Upload failed at X% | Re-run --upload — resumes from where it left off |
| youtubeId: null still in banner | Run --patch-only after log is populated |
data-ai
Clear the freeze boundary set by /freeze, allowing edits to all directories again. Use when you want to widen edit scope without ending the session. Use when asked to "unfreeze", "unlock edits", "remove freeze", or "allow all edits". (gstack)
tools
# Spec Interview Skill **Name:** spec-interview **Triggers:** `/spec-interview`, when requirements unclear **Version:** 1.0.0 --- ## Purpose Interviews user to gather complete requirements before planning. --- ## Interview Questions When requirements are unclear, ask: ### 1. Feature Clarity **Question:** "What is this feature supposed to do?" **Why:** Need clear objective ### 2. User Impact **Question:** "Who will use this and why?" **Why:** Understand user needs ### 3. Success Criteri
development
Ship workflow: detect + merge base branch, run tests, review diff, bump VERSION, update CHANGELOG, commit, push, create PR. Use when asked to "ship", "deploy", "push to main", "create a PR", "merge and push", or "get it deployed". Proactively invoke this skill (do NOT push/PR directly) when the user says code is ready, asks about deploying, wants to push code up, or asks to create a PR. (gstack)
testing
Configure deployment settings for /land-and-deploy. Detects your deploy platform (Fly.io, Render, Vercel, Netlify, Heroku, GitHub Actions, custom), production URL, health check endpoints, and deploy status commands. Writes the configuration to CLAUDE.md so all future deploys are automatic. Use when: "setup deploy", "configure deployment", "set up land-and-deploy", "how do I deploy with gstack", "add deploy config".