For agentic workers: REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (
- [ ]) syntax for tracking.
Goal: Add a weekly workflow that updates npm packages and Ruby Gems,
validates the rendered site, and commits successful updates directly to
main.
Architecture: A single GitHub Actions workflow owns dependency discovery, lockfile regeneration, asset generation, site rendering, HTML validation, and conditional commit. Sequential steps ensure no repository write occurs until all validation gates pass.
Tech Stack: GitHub Actions, Node.js 20, npm, Ruby 3.4.3, Bundler, Jekyll, HTMLProofer
Global Constraints
- Run every Monday on a UTC schedule and support manual dispatch.
- Include major npm and Jekyll updates.
- Disable external URL validation while checking generated HTML.
- Push only when files changed and only after every validation step succeeds.
- Use the existing
COMMIT_NAMEandCOMMIT_EMAILsecrets. - Do not create a Git commit during implementation unless explicitly requested.
Task 1: Add And Validate The Weekly Update Workflow
Files:
- Create:
.github/workflows/update-dependencies.yml
Interfaces:
- Consumes:
package.json,package-lock.json,Gemfile,Gemfile.lock,COMMIT_NAME, andCOMMIT_EMAIL -
Produces: updated dependency files and generated assets committed to
mainafter a successful production build and HTMLProofer run - Step 1: Establish the failing structural check
Run:
ruby -e 'require "yaml"; YAML.load_file(".github/workflows/update-dependencies.yml")'
Expected: FAIL because .github/workflows/update-dependencies.yml does not
exist.
- Step 2: Create the workflow
Create .github/workflows/update-dependencies.yml with:
scheduleset to Monday in UTC and aworkflow_dispatchtrigger.contents: writeas the only permission.- a concurrency group that does not allow overlapping update jobs.
- checkout of
mainusing full history. - Node.js 20 and Ruby 3.4.3 setup with npm and Bundler caching.
npx npm-check-updates@latest -ufollowed bynpm install.- a Ruby command that queries the latest stable Jekyll version from RubyGems
and replaces the existing
gem "jekyll"constraint inGemfile. bundle update,npm run build, and a production Jekyll build.- installation and execution of HTMLProofer against representative generated
pages, using
_siteas the serving root and disabling external URL checks. -
a final conditional commit and push using the configured automation identity.
- Step 3: Validate workflow syntax and required controls
Run:
ruby -e 'require "yaml"; workflow = YAML.load_file(".github/workflows/update-dependencies.yml"); abort "missing schedule" unless workflow.dig(true, "schedule"); abort "missing dispatch" unless workflow.dig(true, "workflow_dispatch"); abort "wrong permissions" unless workflow["permissions"] == {"contents" => "write"}; puts "workflow structure OK"'
Expected: workflow structure OK.
- Step 4: Exercise the rendering validation path
Run:
npm ci
npm run build
bundle install
JEKYLL_ENV=production bundle exec jekyll build
gem install html-proofer --no-document
pages=(
./_site/index.html
./_site/posts/index.html
./_site/about/index.html
./_site/projects/index.html
./_site/archive/index.html
)
for page in "${pages[@]}"; do
htmlproofer "$page" \
--root-dir "$PWD/_site" \
--disable-external \
--no-enforce-https
done
Expected: every command exits with status 0 and HTMLProofer reports no invalid local links, images, scripts, or generated HTML.
- Step 5: Review the final changes
Run:
git diff --check
git status --short
git diff -- .github/workflows/update-dependencies.yml
Expected: no whitespace errors; the new workflow and planning documents are the only intentional changes.