From 09dea3b736f2e18f072e59ccdbbb25af190dcecc Mon Sep 17 00:00:00 2001 From: Serge Gatezh <2880401+gatezh@users.noreply.github.com> Date: Tue, 31 Mar 2026 20:48:11 -0600 Subject: [PATCH 01/12] refactor: rename image directories to drop devcontainer- prefix --- .../.devcontainer/Dockerfile | 0 .../.devcontainer/devcontainer.json | 0 {devcontainer-bun => bun}/README.md | 0 .../.devcontainer/Dockerfile | 0 .../.devcontainer/devcontainer.json | 0 .../.devcontainer/init-firewall.sh | 0 .../README.md | 0 .../2026-03-31-repo-naming-unification.md | 1207 +++++++++++++++++ .../.devcontainer/Dockerfile | 0 .../.devcontainer/devcontainer.json | 0 .../README.md | 0 .../.devcontainer/Dockerfile | 0 .../.devcontainer/devcontainer.json | 0 {devcontainer-hugo-bun => hugo-bun}/README.md | 0 14 files changed, 1207 insertions(+) rename {devcontainer-bun => bun}/.devcontainer/Dockerfile (100%) rename {devcontainer-bun => bun}/.devcontainer/devcontainer.json (100%) rename {devcontainer-bun => bun}/README.md (100%) rename {devcontainer-claude-bun => claude-bun}/.devcontainer/Dockerfile (100%) rename {devcontainer-claude-bun => claude-bun}/.devcontainer/devcontainer.json (100%) rename {devcontainer-claude-bun => claude-bun}/.devcontainer/init-firewall.sh (100%) rename {devcontainer-claude-bun => claude-bun}/README.md (100%) create mode 100644 docs/superpowers/plans/2026-03-31-repo-naming-unification.md rename {devcontainer-hugo-bun-node => hugo-bun-node}/.devcontainer/Dockerfile (100%) rename {devcontainer-hugo-bun-node => hugo-bun-node}/.devcontainer/devcontainer.json (100%) rename {devcontainer-hugo-bun-node => hugo-bun-node}/README.md (100%) rename {devcontainer-hugo-bun => hugo-bun}/.devcontainer/Dockerfile (100%) rename {devcontainer-hugo-bun => hugo-bun}/.devcontainer/devcontainer.json (100%) rename {devcontainer-hugo-bun => hugo-bun}/README.md (100%) diff --git a/devcontainer-bun/.devcontainer/Dockerfile b/bun/.devcontainer/Dockerfile similarity index 100% rename from devcontainer-bun/.devcontainer/Dockerfile rename to bun/.devcontainer/Dockerfile diff --git a/devcontainer-bun/.devcontainer/devcontainer.json b/bun/.devcontainer/devcontainer.json similarity index 100% rename from devcontainer-bun/.devcontainer/devcontainer.json rename to bun/.devcontainer/devcontainer.json diff --git a/devcontainer-bun/README.md b/bun/README.md similarity index 100% rename from devcontainer-bun/README.md rename to bun/README.md diff --git a/devcontainer-claude-bun/.devcontainer/Dockerfile b/claude-bun/.devcontainer/Dockerfile similarity index 100% rename from devcontainer-claude-bun/.devcontainer/Dockerfile rename to claude-bun/.devcontainer/Dockerfile diff --git a/devcontainer-claude-bun/.devcontainer/devcontainer.json b/claude-bun/.devcontainer/devcontainer.json similarity index 100% rename from devcontainer-claude-bun/.devcontainer/devcontainer.json rename to claude-bun/.devcontainer/devcontainer.json diff --git a/devcontainer-claude-bun/.devcontainer/init-firewall.sh b/claude-bun/.devcontainer/init-firewall.sh similarity index 100% rename from devcontainer-claude-bun/.devcontainer/init-firewall.sh rename to claude-bun/.devcontainer/init-firewall.sh diff --git a/devcontainer-claude-bun/README.md b/claude-bun/README.md similarity index 100% rename from devcontainer-claude-bun/README.md rename to claude-bun/README.md diff --git a/docs/superpowers/plans/2026-03-31-repo-naming-unification.md b/docs/superpowers/plans/2026-03-31-repo-naming-unification.md new file mode 100644 index 0000000..3b9ba3e --- /dev/null +++ b/docs/superpowers/plans/2026-03-31-repo-naming-unification.md @@ -0,0 +1,1207 @@ +# Repository Naming Unification Plan + +> **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:** Rename the repository from `devcontainer-images` to `devcontainers`, drop the `devcontainer-` prefix from image directories, and unify all image paths under `ghcr.io/gatezh/devcontainers/{name}`. + +**Architecture:** All image directories drop the `devcontainer-` prefix (e.g., `devcontainer-bun/` becomes `bun/`). All published images move to the nested namespace `ghcr.io/gatezh/devcontainers/{name}`. The reusable workflow, build workflows, CI, Dockerfiles, docker-compose files, READMEs, and `.claude/` config are updated to reflect the new naming. The GitHub repository rename is a manual step done via the GitHub UI. + +**Tech Stack:** GitHub Actions YAML, Dockerfiles, JSONC (devcontainer.json), Markdown + +--- + +## File Structure + +### Directories to rename (git mv) + +| Old | New | +|-----|-----| +| `devcontainer-bun/` | `bun/` | +| `devcontainer-claude-bun/` | `claude-bun/` | +| `devcontainer-hugo-bun/` | `hugo-bun/` | +| `devcontainer-hugo-bun-node/` | `hugo-bun-node/` | +| `claude-code/` | `claude-code/` (no change) | +| `ralphex-fe/` | `ralphex-fe/` (no change) | + +### Files to modify + +| File | Change | +|------|--------| +| `.github/workflows/reusable-docker-build.yml` | image-name description update | +| `.github/workflows/build-devcontainer-bun.yml` → `build-bun.yml` | rename + update all paths | +| `.github/workflows/build-devcontainer-claude-bun.yml` → `build-claude-bun.yml` | rename + update all paths | +| `.github/workflows/build-devcontainer-hugo-bun.yml` → `build-hugo-bun.yml` | rename + update all paths | +| `.github/workflows/build-devcontainer-hugo-bun-node.yml` → `build-hugo-bun-node.yml` | rename + update all paths | +| `.github/workflows/build-claude-code.yml` | update image paths from `devcontainer-images/` to `devcontainers/` | +| `.github/workflows/build-ralphex-fe.yml` | update image path to `devcontainers/ralphex-fe` | +| `.github/workflows/update-and-build-ralphex-fe.yml` | update image-name to `devcontainers/ralphex-fe` | +| `.github/workflows/ci.yml` | update all directory paths | +| `bun/.devcontainer/Dockerfile` | update OCI labels | +| `claude-bun/.devcontainer/Dockerfile` | update OCI labels | +| `hugo-bun/.devcontainer/Dockerfile` | update OCI labels | +| `hugo-bun-node/.devcontainer/Dockerfile` | update OCI labels | +| `claude-code/.devcontainer/Dockerfile` | update OCI labels | +| `ralphex-fe/Dockerfile` | update OCI labels | +| `.devcontainer/Dockerfile` | update OCI labels and references | +| `claude-code/.devcontainer/docker-compose.yml` | update image reference | +| `claude-code/.devcontainer/claude-sandbox/docker-compose.yml` | update image reference | +| `.devcontainer/devcontainer.json` | update volume name prefixes | +| `.devcontainer/claude-sandbox/devcontainer.json` | update volume name prefixes | +| `.devcontainer/init-plugins.sh` | update comment | +| `README.md` | full rewrite of image references | +| `bun/README.md` | update image references | +| `claude-bun/README.md` | update image references | +| `hugo-bun/README.md` | update image references | +| `hugo-bun-node/README.md` | update image references | +| `claude-code/README.md` | update image references | +| `ralphex-fe/README.md` | add note about non-devcontainer-spec usage | +| `.claude/CLAUDE.md` | update naming conventions | +| `.claude/rules/dockerfile.md` | update OCI label template | +| `.claude/rules/new-image.md` | update directory conventions | +| `.claude/rules/workflows.md` | update trigger path patterns | + +--- + +### Task 1: Rename image directories + +**Files:** +- Rename: `devcontainer-bun/` → `bun/` +- Rename: `devcontainer-claude-bun/` → `claude-bun/` +- Rename: `devcontainer-hugo-bun/` → `hugo-bun/` +- Rename: `devcontainer-hugo-bun-node/` → `hugo-bun-node/` + +- [ ] **Step 1: Rename directories with git mv** + +```bash +git mv devcontainer-bun bun +git mv devcontainer-claude-bun claude-bun +git mv devcontainer-hugo-bun hugo-bun +git mv devcontainer-hugo-bun-node hugo-bun-node +``` + +- [ ] **Step 2: Verify renames** + +Run: `ls -d bun claude-bun hugo-bun hugo-bun-node` +Expected: all four directories listed + +- [ ] **Step 3: Commit** + +```bash +git add -A +git commit -m "refactor: rename image directories to drop devcontainer- prefix" +``` + +--- + +### Task 2: Rename workflow files + +**Files:** +- Rename: `.github/workflows/build-devcontainer-bun.yml` → `.github/workflows/build-bun.yml` +- Rename: `.github/workflows/build-devcontainer-claude-bun.yml` → `.github/workflows/build-claude-bun.yml` +- Rename: `.github/workflows/build-devcontainer-hugo-bun.yml` → `.github/workflows/build-hugo-bun.yml` +- Rename: `.github/workflows/build-devcontainer-hugo-bun-node.yml` → `.github/workflows/build-hugo-bun-node.yml` + +- [ ] **Step 1: Rename workflow files with git mv** + +```bash +git mv .github/workflows/build-devcontainer-bun.yml .github/workflows/build-bun.yml +git mv .github/workflows/build-devcontainer-claude-bun.yml .github/workflows/build-claude-bun.yml +git mv .github/workflows/build-devcontainer-hugo-bun.yml .github/workflows/build-hugo-bun.yml +git mv .github/workflows/build-devcontainer-hugo-bun-node.yml .github/workflows/build-hugo-bun-node.yml +``` + +- [ ] **Step 2: Verify renames** + +Run: `ls .github/workflows/build-*.yml` +Expected: +``` +.github/workflows/build-bun.yml +.github/workflows/build-claude-bun.yml +.github/workflows/build-claude-code.yml +.github/workflows/build-hugo-bun.yml +.github/workflows/build-hugo-bun-node.yml +.github/workflows/build-ralphex-fe.yml +``` + +- [ ] **Step 3: Commit** + +```bash +git add -A +git commit -m "refactor: rename workflow files to drop devcontainer- prefix" +``` + +--- + +### Task 3: Update reusable workflow + +The reusable workflow constructs `ghcr.io/{namespace}/{image-name}`. Since callers will now pass `devcontainers/bun` as the image-name, the construction logic stays the same. Only the description needs updating. + +**Files:** +- Modify: `.github/workflows/reusable-docker-build.yml` + +- [ ] **Step 1: Update the image-name input description** + +In `.github/workflows/reusable-docker-build.yml`, change line 7: + +```yaml +# Old: + image-name: + description: 'Image name (e.g. devcontainer-bun)' + +# New: + image-name: + description: 'Image name including namespace (e.g. devcontainers/bun)' +``` + +- [ ] **Step 2: Commit** + +```bash +git add .github/workflows/reusable-docker-build.yml +git commit -m "refactor: update reusable workflow description for new naming" +``` + +--- + +### Task 4: Update build-bun.yml + +**Files:** +- Modify: `.github/workflows/build-bun.yml` + +- [ ] **Step 1: Update workflow content** + +Replace the entire content of `.github/workflows/build-bun.yml` with: + +```yaml +name: Build bun + +on: + push: + branches: + - master + paths: + - 'bun/.devcontainer/Dockerfile' + workflow_dispatch: + +concurrency: + group: build-bun-${{ github.ref }} + cancel-in-progress: true + +jobs: + prepare: + runs-on: ubuntu-latest + outputs: + version-tag: ${{ steps.versions.outputs.version-tag }} + steps: + - name: Checkout repository + uses: actions/checkout@v6 + + - name: Extract versions from Dockerfile + id: versions + run: | + DOCKERFILE="bun/.devcontainer/Dockerfile" + BUN_VERSION=$(grep '^ARG BUN_VERSION=' "$DOCKERFILE" | cut -d'=' -f2) + echo "version-tag=bun${BUN_VERSION}-alpine" >> "$GITHUB_OUTPUT" + echo "Bun: $BUN_VERSION" + + build: + needs: prepare + permissions: + contents: read + packages: write + uses: ./.github/workflows/reusable-docker-build.yml + with: + image-name: devcontainers/bun + context: bun/.devcontainer + dockerfile: bun/.devcontainer/Dockerfile + version-tag: ${{ needs.prepare.outputs.version-tag }} + verify-command: 'bun --version' + secrets: inherit +``` + +- [ ] **Step 2: Commit** + +```bash +git add .github/workflows/build-bun.yml +git commit -m "refactor: update build-bun workflow for new paths and naming" +``` + +--- + +### Task 5: Update build-claude-bun.yml + +**Files:** +- Modify: `.github/workflows/build-claude-bun.yml` + +- [ ] **Step 1: Update workflow content** + +Replace the entire content of `.github/workflows/build-claude-bun.yml` with: + +```yaml +name: Build claude-bun + +on: + push: + branches: + - master + paths: + - 'claude-bun/.devcontainer/Dockerfile' + - 'claude-bun/.devcontainer/init-firewall.sh' + workflow_dispatch: + +concurrency: + group: build-claude-bun-${{ github.ref }} + cancel-in-progress: true + +jobs: + prepare: + runs-on: ubuntu-latest + outputs: + version-tag: ${{ steps.versions.outputs.version-tag }} + steps: + - name: Checkout repository + uses: actions/checkout@v6 + + - name: Extract versions from Dockerfile + id: versions + run: | + DOCKERFILE="claude-bun/.devcontainer/Dockerfile" + BUN_VERSION=$(grep '^ARG BUN_VERSION=' "$DOCKERFILE" | cut -d'=' -f2) + echo "version-tag=bun${BUN_VERSION}-slim" >> "$GITHUB_OUTPUT" + echo "Bun: $BUN_VERSION" + + build: + needs: prepare + permissions: + contents: read + packages: write + uses: ./.github/workflows/reusable-docker-build.yml + with: + image-name: devcontainers/claude-bun + context: claude-bun/.devcontainer + dockerfile: claude-bun/.devcontainer/Dockerfile + version-tag: ${{ needs.prepare.outputs.version-tag }} + verify-command: 'bun --version' + secrets: inherit +``` + +- [ ] **Step 2: Commit** + +```bash +git add .github/workflows/build-claude-bun.yml +git commit -m "refactor: update build-claude-bun workflow for new paths and naming" +``` + +--- + +### Task 6: Update build-hugo-bun.yml + +**Files:** +- Modify: `.github/workflows/build-hugo-bun.yml` + +- [ ] **Step 1: Update workflow content** + +Replace the entire content of `.github/workflows/build-hugo-bun.yml` with: + +```yaml +name: Build hugo-bun + +on: + push: + branches: + - master + paths: + - 'hugo-bun/.devcontainer/Dockerfile' + workflow_dispatch: + +concurrency: + group: build-hugo-bun-${{ github.ref }} + cancel-in-progress: true + +jobs: + prepare: + runs-on: ubuntu-latest + outputs: + version-tag: ${{ steps.versions.outputs.version-tag }} + steps: + - name: Checkout repository + uses: actions/checkout@v6 + + - name: Extract versions from Dockerfile + id: versions + run: | + DOCKERFILE="hugo-bun/.devcontainer/Dockerfile" + HUGO_VERSION=$(grep '^ARG HUGO_VERSION=' "$DOCKERFILE" | cut -d'=' -f2) + BUN_VERSION=$(grep '^ARG BUN_VERSION=' "$DOCKERFILE" | cut -d'=' -f2) + echo "version-tag=hugo${HUGO_VERSION}-bun${BUN_VERSION}-alpine" >> "$GITHUB_OUTPUT" + echo "Hugo: $HUGO_VERSION, Bun: $BUN_VERSION" + + build: + needs: prepare + permissions: + contents: read + packages: write + uses: ./.github/workflows/reusable-docker-build.yml + with: + image-name: devcontainers/hugo-bun + context: hugo-bun/.devcontainer + dockerfile: hugo-bun/.devcontainer/Dockerfile + version-tag: ${{ needs.prepare.outputs.version-tag }} + verify-command: 'bun --version && hugo version' + secrets: inherit +``` + +- [ ] **Step 2: Commit** + +```bash +git add .github/workflows/build-hugo-bun.yml +git commit -m "refactor: update build-hugo-bun workflow for new paths and naming" +``` + +--- + +### Task 7: Update build-hugo-bun-node.yml + +**Files:** +- Modify: `.github/workflows/build-hugo-bun-node.yml` + +- [ ] **Step 1: Update workflow content** + +Replace the entire content of `.github/workflows/build-hugo-bun-node.yml` with: + +```yaml +name: Build hugo-bun-node + +on: + push: + branches: + - master + paths: + - 'hugo-bun-node/.devcontainer/Dockerfile' + workflow_dispatch: + +concurrency: + group: build-hugo-bun-node-${{ github.ref }} + cancel-in-progress: true + +jobs: + prepare: + runs-on: ubuntu-latest + outputs: + version-tag: ${{ steps.versions.outputs.version-tag }} + steps: + - name: Checkout repository + uses: actions/checkout@v6 + + - name: Extract versions from Dockerfile + id: versions + run: | + DOCKERFILE="hugo-bun-node/.devcontainer/Dockerfile" + HUGO_VERSION=$(grep '^ARG HUGO_VERSION=' "$DOCKERFILE" | cut -d'=' -f2) + BUN_VERSION=$(grep '^ARG BUN_VERSION=' "$DOCKERFILE" | cut -d'=' -f2) + NODE_VERSION=$(grep '^ARG NODE_VERSION=' "$DOCKERFILE" | cut -d'=' -f2) + echo "version-tag=hugo${HUGO_VERSION}-bun${BUN_VERSION}-node${NODE_VERSION}-alpine" >> "$GITHUB_OUTPUT" + echo "Hugo: $HUGO_VERSION, Bun: $BUN_VERSION, Node: $NODE_VERSION" + + build: + needs: prepare + permissions: + contents: read + packages: write + uses: ./.github/workflows/reusable-docker-build.yml + with: + image-name: devcontainers/hugo-bun-node + context: hugo-bun-node/.devcontainer + dockerfile: hugo-bun-node/.devcontainer/Dockerfile + version-tag: ${{ needs.prepare.outputs.version-tag }} + verify-command: 'bun --version && hugo version && node --version' + secrets: inherit +``` + +- [ ] **Step 2: Commit** + +```bash +git add .github/workflows/build-hugo-bun-node.yml +git commit -m "refactor: update build-hugo-bun-node workflow for new paths and naming" +``` + +--- + +### Task 8: Update build-claude-code.yml + +**Files:** +- Modify: `.github/workflows/build-claude-code.yml` + +- [ ] **Step 1: Update all references** + +In `.github/workflows/build-claude-code.yml`, make these replacements: + +1. Line 7: `'claude-code/.devcontainer/Dockerfile'` — no change needed (directory not renamed) +2. Line 35: `ghcr.io/gatezh/devcontainer-images/claude-code` → `ghcr.io/gatezh/devcontainers/claude-code` +3. Line 59: `ghcr.io/gatezh/devcontainer-images/claude-code-sandbox` → `ghcr.io/gatezh/devcontainers/claude-code-sandbox` +4. Line 104: `ghcr.io/gatezh/devcontainer-images/${{ matrix.image-suffix }}:latest` → `ghcr.io/gatezh/devcontainers/${{ matrix.image-suffix }}:latest` +5. Line 105: `ghcr.io/gatezh/devcontainer-images/${{ matrix.image-suffix }}:latest` → `ghcr.io/gatezh/devcontainers/${{ matrix.image-suffix }}:latest` + +All occurrences: replace `devcontainer-images` with `devcontainers` in the image paths. + +- [ ] **Step 2: Verify the changes** + +Run: `grep 'devcontainer-images' .github/workflows/build-claude-code.yml` +Expected: no output (all replaced) + +Run: `grep 'devcontainers/' .github/workflows/build-claude-code.yml` +Expected: 4 lines with `ghcr.io/gatezh/devcontainers/claude-code` references + +- [ ] **Step 3: Commit** + +```bash +git add .github/workflows/build-claude-code.yml +git commit -m "refactor: update build-claude-code workflow image paths" +``` + +--- + +### Task 9: Update build-ralphex-fe.yml + +**Files:** +- Modify: `.github/workflows/build-ralphex-fe.yml` + +- [ ] **Step 1: Update image references** + +In `.github/workflows/build-ralphex-fe.yml`, make these replacements: + +1. Line 63: `meta-images: ghcr.io/gatezh/ralphex-fe` → `meta-images: ghcr.io/gatezh/devcontainers/ralphex-fe` +2. Line 95: `docker pull ghcr.io/gatezh/ralphex-fe:latest` → `docker pull ghcr.io/gatezh/devcontainers/ralphex-fe:latest` +3. Line 96: `docker run --rm --entrypoint sh ghcr.io/gatezh/ralphex-fe:latest` → `docker run --rm --entrypoint sh ghcr.io/gatezh/devcontainers/ralphex-fe:latest` + +- [ ] **Step 2: Commit** + +```bash +git add .github/workflows/build-ralphex-fe.yml +git commit -m "refactor: update build-ralphex-fe workflow to devcontainers namespace" +``` + +--- + +### Task 10: Update update-and-build-ralphex-fe.yml + +**Files:** +- Modify: `.github/workflows/update-and-build-ralphex-fe.yml` + +- [ ] **Step 1: Update image-name in the reusable workflow call** + +In `.github/workflows/update-and-build-ralphex-fe.yml`, line 152: + +```yaml +# Old: + image-name: ralphex-fe + +# New: + image-name: devcontainers/ralphex-fe +``` + +- [ ] **Step 2: Commit** + +```bash +git add .github/workflows/update-and-build-ralphex-fe.yml +git commit -m "refactor: update update-and-build-ralphex-fe image name" +``` + +--- + +### Task 11: Update CI workflow + +**Files:** +- Modify: `.github/workflows/ci.yml` + +- [ ] **Step 1: Update hadolint matrix paths** + +In `.github/workflows/ci.yml`, replace the hadolint matrix (lines 24-29): + +```yaml +# Old: + dockerfile: + - devcontainer-bun/.devcontainer/Dockerfile + - devcontainer-claude-bun/.devcontainer/Dockerfile + - devcontainer-hugo-bun/.devcontainer/Dockerfile + - devcontainer-hugo-bun-node/.devcontainer/Dockerfile + - ralphex-fe/Dockerfile + +# New: + dockerfile: + - bun/.devcontainer/Dockerfile + - claude-bun/.devcontainer/Dockerfile + - hugo-bun/.devcontainer/Dockerfile + - hugo-bun-node/.devcontainer/Dockerfile + - ralphex-fe/Dockerfile +``` + +- [ ] **Step 2: Update path filters** + +In `.github/workflows/ci.yml`, replace the path filter section (lines 66-75): + +```yaml +# Old: + devcontainer-bun: + - 'devcontainer-bun/**' + devcontainer-claude-bun: + - 'devcontainer-claude-bun/**' + devcontainer-hugo-bun: + - 'devcontainer-hugo-bun/**' + devcontainer-hugo-bun-node: + - 'devcontainer-hugo-bun-node/**' + ralphex-fe: + - 'ralphex-fe/**' + +# New: + bun: + - 'bun/**' + claude-bun: + - 'claude-bun/**' + hugo-bun: + - 'hugo-bun/**' + hugo-bun-node: + - 'hugo-bun-node/**' + ralphex-fe: + - 'ralphex-fe/**' +``` + +- [ ] **Step 3: Update environment variable names and add_image calls** + +In `.github/workflows/ci.yml`, replace the set-matrix step's env block and conditionals (lines 80-131): + +```yaml + env: + CHANGED_BUN: ${{ steps.filter.outputs.bun }} + CHANGED_CLAUDE_BUN: ${{ steps.filter.outputs.claude-bun }} + CHANGED_HUGO_BUN: ${{ steps.filter.outputs.hugo-bun }} + CHANGED_HUGO_BUN_NODE: ${{ steps.filter.outputs.hugo-bun-node }} + CHANGED_RALPHEX: ${{ steps.filter.outputs.ralphex-fe }} + run: | + INCLUDES="[]" + + add_image() { + local image="$1" context="$2" dockerfile="$3" verify="$4" + INCLUDES=$(echo "$INCLUDES" | jq -c \ + --arg img "$image" \ + --arg ctx "$context" \ + --arg df "$dockerfile" \ + --arg v "$verify" \ + '. + [{"image":$img,"context":$ctx,"dockerfile":$df,"verify":$v}]') + } + + if [ "$CHANGED_BUN" = "true" ]; then + add_image "bun" \ + "bun/.devcontainer" \ + "bun/.devcontainer/Dockerfile" \ + "bun --version" + fi + + if [ "$CHANGED_CLAUDE_BUN" = "true" ]; then + add_image "claude-bun" \ + "claude-bun/.devcontainer" \ + "claude-bun/.devcontainer/Dockerfile" \ + "bun --version" + fi + + if [ "$CHANGED_HUGO_BUN" = "true" ]; then + add_image "hugo-bun" \ + "hugo-bun/.devcontainer" \ + "hugo-bun/.devcontainer/Dockerfile" \ + "bun --version && hugo version" + fi + + if [ "$CHANGED_HUGO_BUN_NODE" = "true" ]; then + add_image "hugo-bun-node" \ + "hugo-bun-node/.devcontainer" \ + "hugo-bun-node/.devcontainer/Dockerfile" \ + "bun --version && hugo version && node --version" + fi + + if [ "$CHANGED_RALPHEX" = "true" ]; then + add_image "ralphex-fe" \ + "ralphex-fe" \ + "ralphex-fe/Dockerfile" \ + "bun --version && hugo version && /srv/ralphex --version" + fi + + if [ "$INCLUDES" = "[]" ]; then + { + echo "has-changes=false" + echo "matrix={\"include\":[]}" + } >> "$GITHUB_OUTPUT" + else + { + echo "has-changes=true" + echo "matrix=$(echo "$INCLUDES" | jq -c '{include:.}')" + } >> "$GITHUB_OUTPUT" + fi +``` + +- [ ] **Step 4: Verify no old references remain** + +Run: `grep 'devcontainer-bun\|devcontainer-claude-bun\|devcontainer-hugo-bun' .github/workflows/ci.yml` +Expected: no output + +- [ ] **Step 5: Commit** + +```bash +git add .github/workflows/ci.yml +git commit -m "refactor: update CI workflow for renamed directories" +``` + +--- + +### Task 12: Update OCI labels in all Dockerfiles + +All Dockerfiles need `org.opencontainers.image.source` and `org.opencontainers.image.url` changed from `devcontainer-images` to `devcontainers`, and `org.opencontainers.image.title` updated to drop the `devcontainer-` prefix. + +**Files:** +- Modify: `bun/.devcontainer/Dockerfile` (lines 15-19) +- Modify: `claude-bun/.devcontainer/Dockerfile` (lines 92-96) +- Modify: `hugo-bun/.devcontainer/Dockerfile` (lines 33-37) +- Modify: `hugo-bun-node/.devcontainer/Dockerfile` (lines 49-53) +- Modify: `claude-code/.devcontainer/Dockerfile` (lines 198-202, 230-234) +- Modify: `ralphex-fe/Dockerfile` (lines 177-181) +- Modify: `.devcontainer/Dockerfile` (lines 139-143, 168-172) + +- [ ] **Step 1: Update bun/.devcontainer/Dockerfile** + +Replace the OCI labels (lines 15-19): + +```dockerfile +# Old: +LABEL org.opencontainers.image.source="https://github.com/gatezh/devcontainer-images" +LABEL org.opencontainers.image.description="Bun development container - multiplatform image for modern JavaScript/TypeScript development" +LABEL org.opencontainers.image.licenses="MIT" +LABEL org.opencontainers.image.title="devcontainer-bun" +LABEL org.opencontainers.image.url="https://github.com/gatezh/devcontainer-images" + +# New: +LABEL org.opencontainers.image.source="https://github.com/gatezh/devcontainers" +LABEL org.opencontainers.image.description="Bun development container - multiplatform image for modern JavaScript/TypeScript development" +LABEL org.opencontainers.image.licenses="MIT" +LABEL org.opencontainers.image.title="bun" +LABEL org.opencontainers.image.url="https://github.com/gatezh/devcontainers" +``` + +- [ ] **Step 2: Update claude-bun/.devcontainer/Dockerfile** + +Replace the OCI labels (lines 92-96): + +```dockerfile +# Old: +LABEL org.opencontainers.image.source="https://github.com/gatezh/devcontainer-images" \ + org.opencontainers.image.description="Claude Code development container — Bun environment with Claude Code CLI, firewall sandbox, and zsh" \ + org.opencontainers.image.licenses="MIT" \ + org.opencontainers.image.title="devcontainer-claude-bun" \ + org.opencontainers.image.url="https://github.com/gatezh/devcontainer-images" + +# New: +LABEL org.opencontainers.image.source="https://github.com/gatezh/devcontainers" \ + org.opencontainers.image.description="Claude Code development container — Bun environment with Claude Code CLI, firewall sandbox, and zsh" \ + org.opencontainers.image.licenses="MIT" \ + org.opencontainers.image.title="claude-bun" \ + org.opencontainers.image.url="https://github.com/gatezh/devcontainers" +``` + +- [ ] **Step 3: Update hugo-bun/.devcontainer/Dockerfile** + +Replace the OCI labels (lines 33-37): + +```dockerfile +# Old: +LABEL org.opencontainers.image.source="https://github.com/gatezh/devcontainer-images" +LABEL org.opencontainers.image.description="Hugo Extended + Bun development container - multiplatform image for modern static site development" +LABEL org.opencontainers.image.licenses="MIT" +LABEL org.opencontainers.image.title="devcontainer-hugo-bun" +LABEL org.opencontainers.image.url="https://github.com/gatezh/devcontainer-images" + +# New: +LABEL org.opencontainers.image.source="https://github.com/gatezh/devcontainers" +LABEL org.opencontainers.image.description="Hugo Extended + Bun development container - multiplatform image for modern static site development" +LABEL org.opencontainers.image.licenses="MIT" +LABEL org.opencontainers.image.title="hugo-bun" +LABEL org.opencontainers.image.url="https://github.com/gatezh/devcontainers" +``` + +- [ ] **Step 4: Update hugo-bun-node/.devcontainer/Dockerfile** + +Replace the OCI labels (lines 49-53): + +```dockerfile +# Old: +LABEL org.opencontainers.image.source="https://github.com/gatezh/devcontainer-images" +LABEL org.opencontainers.image.description="Hugo Extended + Bun + Node.js development container - multiplatform image for modern static site development with Cloudflare Workers support" +LABEL org.opencontainers.image.licenses="MIT" +LABEL org.opencontainers.image.title="devcontainer-hugo-bun-node" +LABEL org.opencontainers.image.url="https://github.com/gatezh/devcontainer-images" + +# New: +LABEL org.opencontainers.image.source="https://github.com/gatezh/devcontainers" +LABEL org.opencontainers.image.description="Hugo Extended + Bun + Node.js development container - multiplatform image for modern static site development with Cloudflare Workers support" +LABEL org.opencontainers.image.licenses="MIT" +LABEL org.opencontainers.image.title="hugo-bun-node" +LABEL org.opencontainers.image.url="https://github.com/gatezh/devcontainers" +``` + +- [ ] **Step 5: Update claude-code/.devcontainer/Dockerfile (default target)** + +Replace the OCI labels at lines 198-202: + +```dockerfile +# Old: +LABEL org.opencontainers.image.source="https://github.com/gatezh/devcontainer-images" \ + org.opencontainers.image.description="Claude Code devcontainer — full dev environment with agent-browser, Playwright, and passwordless sudo" \ + org.opencontainers.image.licenses="MIT" \ + org.opencontainers.image.title="claude-code" \ + org.opencontainers.image.url="https://github.com/gatezh/devcontainer-images" + +# New: +LABEL org.opencontainers.image.source="https://github.com/gatezh/devcontainers" \ + org.opencontainers.image.description="Claude Code devcontainer — full dev environment with agent-browser, Playwright, and passwordless sudo" \ + org.opencontainers.image.licenses="MIT" \ + org.opencontainers.image.title="claude-code" \ + org.opencontainers.image.url="https://github.com/gatezh/devcontainers" +``` + +- [ ] **Step 6: Update claude-code/.devcontainer/Dockerfile (sandbox target)** + +Replace the OCI labels at lines 230-234: + +```dockerfile +# Old: +LABEL org.opencontainers.image.source="https://github.com/gatezh/devcontainer-images" \ + org.opencontainers.image.description="Claude Code devcontainer — network-restricted sandbox with firewall packages" \ + org.opencontainers.image.licenses="MIT" \ + org.opencontainers.image.title="claude-code-sandbox" \ + org.opencontainers.image.url="https://github.com/gatezh/devcontainer-images" + +# New: +LABEL org.opencontainers.image.source="https://github.com/gatezh/devcontainers" \ + org.opencontainers.image.description="Claude Code devcontainer — network-restricted sandbox with firewall packages" \ + org.opencontainers.image.licenses="MIT" \ + org.opencontainers.image.title="claude-code-sandbox" \ + org.opencontainers.image.url="https://github.com/gatezh/devcontainers" +``` + +- [ ] **Step 7: Update ralphex-fe/Dockerfile** + +Replace the OCI labels at lines 177-181: + +```dockerfile +# Old: +LABEL org.opencontainers.image.source="https://github.com/gatezh/devcontainer-images" \ + org.opencontainers.image.description="Ralphex-fe: Frontend development image with Bun, Hugo Extended, Playwright, and Claude Code on Debian" \ + org.opencontainers.image.licenses="MIT" \ + org.opencontainers.image.title="ralphex-fe" \ + org.opencontainers.image.url="https://github.com/gatezh/devcontainer-images" + +# New: +LABEL org.opencontainers.image.source="https://github.com/gatezh/devcontainers" \ + org.opencontainers.image.description="Ralphex-fe: Frontend development image with Bun, Hugo Extended, Playwright, and Claude Code on Debian" \ + org.opencontainers.image.licenses="MIT" \ + org.opencontainers.image.title="ralphex-fe" \ + org.opencontainers.image.url="https://github.com/gatezh/devcontainers" +``` + +- [ ] **Step 8: Update .devcontainer/Dockerfile (repo's own devcontainer)** + +Replace `devcontainer-images` with `devcontainers` in all references. This file has: +- Line 2 comment: `devcontainer-images repo` → `devcontainers repo` +- Lines 12-13: build tag examples: `devcontainer-images:default` → `devcontainers:default` +- Lines 139-143: default target OCI labels +- Lines 168-172: sandbox target OCI labels + +Replace all occurrences of `devcontainer-images` with `devcontainers` in this file. + +- [ ] **Step 9: Verify no old references remain in Dockerfiles** + +Run: `grep -r 'devcontainer-images' bun/ claude-bun/ hugo-bun/ hugo-bun-node/ claude-code/ ralphex-fe/ .devcontainer/Dockerfile` +Expected: no output + +Run: `grep -r 'title="devcontainer-' bun/ claude-bun/ hugo-bun/ hugo-bun-node/` +Expected: no output + +- [ ] **Step 10: Commit** + +```bash +git add bun/.devcontainer/Dockerfile claude-bun/.devcontainer/Dockerfile hugo-bun/.devcontainer/Dockerfile hugo-bun-node/.devcontainer/Dockerfile claude-code/.devcontainer/Dockerfile ralphex-fe/Dockerfile .devcontainer/Dockerfile +git commit -m "refactor: update OCI labels in all Dockerfiles for new repo name" +``` + +--- + +### Task 13: Update docker-compose files + +**Files:** +- Modify: `claude-code/.devcontainer/docker-compose.yml` +- Modify: `claude-code/.devcontainer/claude-sandbox/docker-compose.yml` + +- [ ] **Step 1: Update default docker-compose.yml** + +In `claude-code/.devcontainer/docker-compose.yml`, line 5: + +```yaml +# Old: + image: ghcr.io/gatezh/devcontainer-images/claude-code:latest + +# New: + image: ghcr.io/gatezh/devcontainers/claude-code:latest +``` + +- [ ] **Step 2: Update sandbox docker-compose.yml** + +In `claude-code/.devcontainer/claude-sandbox/docker-compose.yml`, line 5: + +```yaml +# Old: + image: ghcr.io/gatezh/devcontainer-images/claude-code-sandbox:latest + +# New: + image: ghcr.io/gatezh/devcontainers/claude-code-sandbox:latest +``` + +- [ ] **Step 3: Commit** + +```bash +git add claude-code/.devcontainer/docker-compose.yml claude-code/.devcontainer/claude-sandbox/docker-compose.yml +git commit -m "refactor: update docker-compose image references" +``` + +--- + +### Task 14: Update repo's own .devcontainer config + +**Files:** +- Modify: `.devcontainer/devcontainer.json` (volume name prefixes) +- Modify: `.devcontainer/claude-sandbox/devcontainer.json` (volume name prefixes) +- Modify: `.devcontainer/init-plugins.sh` (comment) + +- [ ] **Step 1: Update .devcontainer/devcontainer.json volume names** + +Replace `devcontainer-images` with `devcontainers` in volume source names: + +```jsonc +// Old: +"source=devcontainer-images-claude-config-${devcontainerId},target=/home/node/.claude,type=volume", +... +"source=devcontainer-images-fish-data-${devcontainerId},target=/home/node/.local/share/fish,type=volume" + +// New: +"source=devcontainers-claude-config-${devcontainerId},target=/home/node/.claude,type=volume", +... +"source=devcontainers-fish-data-${devcontainerId},target=/home/node/.local/share/fish,type=volume" +``` + +- [ ] **Step 2: Update .devcontainer/claude-sandbox/devcontainer.json volume names** + +Replace `devcontainer-images` with `devcontainers` in volume source names: + +```jsonc +// Old: +"source=devcontainer-images-sandbox-config-${devcontainerId},target=/home/node/.claude,type=volume", +"source=devcontainer-images-sandbox-fish-${devcontainerId},target=/home/node/.local/share/fish,type=volume", + +// New: +"source=devcontainers-sandbox-config-${devcontainerId},target=/home/node/.claude,type=volume", +"source=devcontainers-sandbox-fish-${devcontainerId},target=/home/node/.local/share/fish,type=volume", +``` + +- [ ] **Step 3: Update .devcontainer/init-plugins.sh comment** + +```bash +# Old: +# Initialize Claude Code plugins for the devcontainer-images repo + +# New: +# Initialize Claude Code plugins for the devcontainers repo +``` + +- [ ] **Step 4: Commit** + +```bash +git add .devcontainer/devcontainer.json .devcontainer/claude-sandbox/devcontainer.json .devcontainer/init-plugins.sh +git commit -m "refactor: update repo devcontainer config for new repo name" +``` + +--- + +### Task 15: Update all README files + +**Files:** +- Modify: `README.md` +- Modify: `bun/README.md` +- Modify: `claude-bun/README.md` +- Modify: `hugo-bun/README.md` +- Modify: `hugo-bun-node/README.md` +- Modify: `claude-code/README.md` +- Modify: `ralphex-fe/README.md` + +- [ ] **Step 1: Update root README.md** + +Replace all occurrences using these rules: +- `devcontainer-images` (repo name) → `devcontainers` +- `./devcontainer-bun/` → `./bun/` +- `./devcontainer-claude-bun/` → `./claude-bun/` +- `./devcontainer-hugo-bun/` → `./hugo-bun/` +- `./devcontainer-hugo-bun-node/` → `./hugo-bun-node/` +- `devcontainer-name/` → `image-name/` (in the structure example) +- `ghcr.io/gatezh/devcontainer-images/claude-code` → `ghcr.io/gatezh/devcontainers/claude-code` +- `ghcr.io/gatezh/devcontainer-images/claude-code-sandbox` → `ghcr.io/gatezh/devcontainers/claude-code-sandbox` +- `ghcr.io//devcontainer-bun` → `ghcr.io//devcontainers/bun` +- `ghcr.io//devcontainer-claude-bun` → `ghcr.io//devcontainers/claude-bun` +- `ghcr.io//devcontainer-hugo-bun` → `ghcr.io//devcontainers/hugo-bun` +- `ghcr.io//ralphex-fe` → `ghcr.io//devcontainers/ralphex-fe` +- Section headers: `### devcontainer-bun` → `### bun`, etc. +- Title: `# Devcontainer Images` → `# Devcontainers` +- Directory structure example: update `devcontainer-name/` → `image-name/` +- Adding new image instructions: `devcontainer-myimage/` → `myimage/` +- `build-devcontainer-{name}.yml` → `build-{name}.yml` (in "Adding a New Image") + +- [ ] **Step 2: Update bun/README.md** + +Replace all occurrences: +- `# devcontainer-bun` → `# bun` +- `devcontainer-bun:` → `devcontainers/bun:` (in image references like `ghcr.io//devcontainer-bun:`) +- `ghcr.io/myusername/devcontainer-bun:` → `ghcr.io/myusername/devcontainers/bun:` +- `devcontainer-images repository` → `devcontainers repository` (in License section) + +- [ ] **Step 3: Update claude-bun/README.md** + +Replace all occurrences: +- `# devcontainer-claude-bun` → `# claude-bun` +- `ghcr.io/gatezh/devcontainer-claude-bun:` → `ghcr.io/gatezh/devcontainers/claude-bun:` +- `devcontainer-images repository` → `devcontainers repository` (if present) + +- [ ] **Step 4: Update hugo-bun/README.md** + +Replace all occurrences: +- `# devcontainer-hugo-bun` → `# hugo-bun` +- `devcontainer-hugo-bun:` → `devcontainers/hugo-bun:` (in image references) +- `ghcr.io/myusername/devcontainer-hugo-bun:` → `ghcr.io/myusername/devcontainers/hugo-bun:` +- `devcontainer-images repository` → `devcontainers repository` + +- [ ] **Step 5: Update hugo-bun-node/README.md** + +Replace all occurrences: +- `# devcontainer-hugo-bun-node` → `# hugo-bun-node` +- `devcontainer-hugo-bun-node:` → `devcontainers/hugo-bun-node:` (in image references) +- `ghcr.io/myusername/devcontainer-hugo-bun-node:` → `ghcr.io/myusername/devcontainers/hugo-bun-node:` +- `devcontainer-images repository` → `devcontainers repository` + +- [ ] **Step 6: Update claude-code/README.md** + +Replace all occurrences: +- `ghcr.io/gatezh/devcontainer-images/claude-code` → `ghcr.io/gatezh/devcontainers/claude-code` +- `ghcr.io/gatezh/devcontainer-images/claude-code-sandbox` → `ghcr.io/gatezh/devcontainers/claude-code-sandbox` +- `devcontainer-images` (repo name references) → `devcontainers` +- `git clone https://github.com/gatezh/devcontainer-images.git` → `git clone https://github.com/gatezh/devcontainers.git` +- `cd devcontainer-images/claude-code` → `cd devcontainers/claude-code` + +- [ ] **Step 7: Update ralphex-fe/README.md** + +Replace: +- `ghcr.io/gatezh/ralphex-fe:` → `ghcr.io/gatezh/devcontainers/ralphex-fe:` + +Add a note near the top (after the first paragraph): + +```markdown +> **Note:** This is not a devcontainer in the VS Code Dev Container spec sense (no `devcontainer.json`). It is a standalone Docker image used as a development environment for ralphex projects. +``` + +- [ ] **Step 8: Verify no old references remain** + +Run: `grep -r 'devcontainer-images' README.md bun/README.md claude-bun/README.md hugo-bun/README.md hugo-bun-node/README.md claude-code/README.md ralphex-fe/README.md` +Expected: no output (except possibly the old plan file in docs/) + +Run: `grep -r 'ghcr.io/gatezh/devcontainer-bun\|ghcr.io/gatezh/devcontainer-claude-bun\|ghcr.io/gatezh/devcontainer-hugo-bun\|ghcr.io/gatezh/ralphex-fe' README.md bun/ claude-bun/ hugo-bun/ hugo-bun-node/ claude-code/ ralphex-fe/` +Expected: no output + +- [ ] **Step 9: Commit** + +```bash +git add README.md bun/README.md claude-bun/README.md hugo-bun/README.md hugo-bun-node/README.md claude-code/README.md ralphex-fe/README.md +git commit -m "docs: update all READMEs for new repo name and image paths" +``` + +--- + +### Task 16: Update .claude/ configuration files + +**Files:** +- Modify: `.claude/CLAUDE.md` +- Modify: `.claude/rules/dockerfile.md` +- Modify: `.claude/rules/new-image.md` +- Modify: `.claude/rules/workflows.md` + +- [ ] **Step 1: Update .claude/CLAUDE.md** + +Replace the naming conventions section: + +```markdown +# Old: +## Naming Conventions + +### Image names +- Devcontainer: `devcontainer-{tool}` or `devcontainer-{tool}-{secondary}` +- Standalone: `{base}-{variant}` (e.g., `ralphex-fe`) + +# New: +## Naming Conventions + +### Directory names +- Named after the primary tool(s): `{tool}` or `{tool}-{secondary}` (e.g., `bun`, `hugo-bun`, `claude-code`) +- No `devcontainer-` prefix — the repo name `devcontainers` provides that context + +### Image paths +- All images: `ghcr.io/gatezh/devcontainers/{directory-name}` (e.g., `ghcr.io/gatezh/devcontainers/bun`) +``` + +Also update the Project Overview line: +```markdown +# Old: +Dockerfiles for custom devcontainer images on GitHub Container Registry (ghcr.io). Each image provides a VS Code Dev Container for a specific development environment. + +# New: +Dockerfiles for custom devcontainer images on GitHub Container Registry (ghcr.io). Each image provides a development container for a specific environment. Published under `ghcr.io/gatezh/devcontainers/`. +``` + +- [ ] **Step 2: Update .claude/rules/dockerfile.md** + +Replace the OCI label template: + +```markdown +# Old: +LABEL org.opencontainers.image.source="https://github.com/{owner}/devcontainer-images" \ + org.opencontainers.image.description="{Brief description}" \ + org.opencontainers.image.licenses="MIT" \ + org.opencontainers.image.title="{image-name}" \ + org.opencontainers.image.url="https://github.com/{owner}/devcontainer-images" + +# New: +LABEL org.opencontainers.image.source="https://github.com/{owner}/devcontainers" \ + org.opencontainers.image.description="{Brief description}" \ + org.opencontainers.image.licenses="MIT" \ + org.opencontainers.image.title="{image-name}" \ + org.opencontainers.image.url="https://github.com/{owner}/devcontainers" +``` + +- [ ] **Step 3: Update .claude/rules/new-image.md** + +Replace entire content: + +```markdown +# Adding a New Image + +## Devcontainer Image + +1. Create `{name}/.devcontainer/Dockerfile` +2. Create `{name}/.devcontainer/devcontainer.json` +3. Create `{name}/README.md` +4. Create `.github/workflows/build-{name}.yml` +5. Update root `README.md` with new image entry + +## Standalone Docker Image + +1. Create `{name}/Dockerfile` (no `.devcontainer/` subdirectory) +2. Create `{name}/README.md` +3. Create `.github/workflows/build-{name}.yml` +4. Update root `README.md` with new image entry +``` + +- [ ] **Step 4: Update .claude/rules/workflows.md** + +Update the trigger path patterns: + +```markdown +# Old: + - '{image-name}/.devcontainer/Dockerfile' + - '{image-name}/.devcontainer/*.sh' +... + - '{image-name}/Dockerfile' + - '{image-name}/files/**' + +# New: + - '{name}/.devcontainer/Dockerfile' + - '{name}/.devcontainer/*.sh' +... + - '{name}/Dockerfile' + - '{name}/files/**' +``` + +- [ ] **Step 5: Commit** + +```bash +git add .claude/CLAUDE.md .claude/rules/dockerfile.md .claude/rules/new-image.md .claude/rules/workflows.md +git commit -m "docs: update .claude/ config for new naming conventions" +``` + +--- + +### Task 17: Lint verification + +- [ ] **Step 1: Run hadolint on all Dockerfiles** + +```bash +hadolint bun/.devcontainer/Dockerfile +hadolint claude-bun/.devcontainer/Dockerfile +hadolint hugo-bun/.devcontainer/Dockerfile +hadolint hugo-bun-node/.devcontainer/Dockerfile +hadolint claude-code/.devcontainer/Dockerfile +hadolint ralphex-fe/Dockerfile +hadolint .devcontainer/Dockerfile +``` + +Expected: all pass (OCI labels don't affect lint) + +- [ ] **Step 2: Run actionlint on workflows** + +```bash +actionlint .github/workflows/build-bun.yml +actionlint .github/workflows/build-claude-bun.yml +actionlint .github/workflows/build-hugo-bun.yml +actionlint .github/workflows/build-hugo-bun-node.yml +actionlint .github/workflows/build-claude-code.yml +actionlint .github/workflows/build-ralphex-fe.yml +actionlint .github/workflows/update-and-build-ralphex-fe.yml +actionlint .github/workflows/ci.yml +actionlint .github/workflows/reusable-docker-build.yml +``` + +Expected: all pass + +- [ ] **Step 3: Final grep for any missed old references** + +```bash +grep -r 'devcontainer-images' --include='*.yml' --include='*.yaml' --include='*.md' --include='*.json' --include='*.jsonc' --include='Dockerfile' --include='*.sh' . | grep -v 'docs/superpowers/plans/' | grep -v '.git/' +``` + +Expected: no output (the old plan file in docs/ is excluded) + +```bash +grep -r 'ghcr.io/gatezh/devcontainer-' --include='*.yml' --include='*.yaml' --include='*.md' --include='*.json' --include='*.jsonc' --include='Dockerfile' --include='*.sh' . | grep -v 'docs/superpowers/plans/' | grep -v '.git/' +``` + +Expected: no output + +--- + +### Task 18: GitHub repository rename (manual) + +This task is done by the user via the GitHub UI, NOT via code. + +- [ ] **Step 1: Rename repository on GitHub** + +Go to `https://github.com/gatezh/devcontainer-images/settings` → Repository name → change to `devcontainers` → click "Rename". + +GitHub will automatically set up a redirect from the old URL. All existing git remotes using the old URL will continue to work, but should be updated. + +- [ ] **Step 2: Update local git remote** + +```bash +git remote set-url github git@github.com:gatezh/devcontainers.git +``` + +- [ ] **Step 3: Delete old GHCR packages (optional)** + +Old packages at `ghcr.io/gatezh/devcontainer-bun`, `ghcr.io/gatezh/devcontainer-claude-bun`, etc. can be deleted from the GitHub Packages settings page once all consumers have migrated to the new paths. diff --git a/devcontainer-hugo-bun-node/.devcontainer/Dockerfile b/hugo-bun-node/.devcontainer/Dockerfile similarity index 100% rename from devcontainer-hugo-bun-node/.devcontainer/Dockerfile rename to hugo-bun-node/.devcontainer/Dockerfile diff --git a/devcontainer-hugo-bun-node/.devcontainer/devcontainer.json b/hugo-bun-node/.devcontainer/devcontainer.json similarity index 100% rename from devcontainer-hugo-bun-node/.devcontainer/devcontainer.json rename to hugo-bun-node/.devcontainer/devcontainer.json diff --git a/devcontainer-hugo-bun-node/README.md b/hugo-bun-node/README.md similarity index 100% rename from devcontainer-hugo-bun-node/README.md rename to hugo-bun-node/README.md diff --git a/devcontainer-hugo-bun/.devcontainer/Dockerfile b/hugo-bun/.devcontainer/Dockerfile similarity index 100% rename from devcontainer-hugo-bun/.devcontainer/Dockerfile rename to hugo-bun/.devcontainer/Dockerfile diff --git a/devcontainer-hugo-bun/.devcontainer/devcontainer.json b/hugo-bun/.devcontainer/devcontainer.json similarity index 100% rename from devcontainer-hugo-bun/.devcontainer/devcontainer.json rename to hugo-bun/.devcontainer/devcontainer.json diff --git a/devcontainer-hugo-bun/README.md b/hugo-bun/README.md similarity index 100% rename from devcontainer-hugo-bun/README.md rename to hugo-bun/README.md From 918cb46d462b3b6feb52573c38247837265c005f Mon Sep 17 00:00:00 2001 From: Serge Gatezh <2880401+gatezh@users.noreply.github.com> Date: Tue, 31 Mar 2026 20:48:24 -0600 Subject: [PATCH 02/12] refactor: rename workflow files to drop devcontainer- prefix --- .github/workflows/{build-devcontainer-bun.yml => build-bun.yml} | 0 .../{build-devcontainer-claude-bun.yml => build-claude-bun.yml} | 0 ...ild-devcontainer-hugo-bun-node.yml => build-hugo-bun-node.yml} | 0 .../{build-devcontainer-hugo-bun.yml => build-hugo-bun.yml} | 0 4 files changed, 0 insertions(+), 0 deletions(-) rename .github/workflows/{build-devcontainer-bun.yml => build-bun.yml} (100%) rename .github/workflows/{build-devcontainer-claude-bun.yml => build-claude-bun.yml} (100%) rename .github/workflows/{build-devcontainer-hugo-bun-node.yml => build-hugo-bun-node.yml} (100%) rename .github/workflows/{build-devcontainer-hugo-bun.yml => build-hugo-bun.yml} (100%) diff --git a/.github/workflows/build-devcontainer-bun.yml b/.github/workflows/build-bun.yml similarity index 100% rename from .github/workflows/build-devcontainer-bun.yml rename to .github/workflows/build-bun.yml diff --git a/.github/workflows/build-devcontainer-claude-bun.yml b/.github/workflows/build-claude-bun.yml similarity index 100% rename from .github/workflows/build-devcontainer-claude-bun.yml rename to .github/workflows/build-claude-bun.yml diff --git a/.github/workflows/build-devcontainer-hugo-bun-node.yml b/.github/workflows/build-hugo-bun-node.yml similarity index 100% rename from .github/workflows/build-devcontainer-hugo-bun-node.yml rename to .github/workflows/build-hugo-bun-node.yml diff --git a/.github/workflows/build-devcontainer-hugo-bun.yml b/.github/workflows/build-hugo-bun.yml similarity index 100% rename from .github/workflows/build-devcontainer-hugo-bun.yml rename to .github/workflows/build-hugo-bun.yml From 2dc8b06c457011b8b2f0688cd3120232be33bdc0 Mon Sep 17 00:00:00 2001 From: Serge Gatezh <2880401+gatezh@users.noreply.github.com> Date: Tue, 31 Mar 2026 20:53:28 -0600 Subject: [PATCH 03/12] refactor: update reusable and build workflows for new naming --- .github/workflows/build-bun.yml | 16 ++++++++-------- .github/workflows/build-claude-bun.yml | 18 +++++++++--------- .github/workflows/build-hugo-bun-node.yml | 16 ++++++++-------- .github/workflows/build-hugo-bun.yml | 16 ++++++++-------- .github/workflows/reusable-docker-build.yml | 2 +- 5 files changed, 34 insertions(+), 34 deletions(-) diff --git a/.github/workflows/build-bun.yml b/.github/workflows/build-bun.yml index 9554ad8..680cb62 100644 --- a/.github/workflows/build-bun.yml +++ b/.github/workflows/build-bun.yml @@ -1,15 +1,15 @@ -name: Build devcontainer-bun +name: Build bun on: push: branches: - master paths: - - 'devcontainer-bun/.devcontainer/Dockerfile' + - 'bun/.devcontainer/Dockerfile' workflow_dispatch: concurrency: - group: build-devcontainer-bun-${{ github.ref }} + group: build-bun-${{ github.ref }} cancel-in-progress: true jobs: @@ -19,12 +19,12 @@ jobs: version-tag: ${{ steps.versions.outputs.version-tag }} steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Extract versions from Dockerfile id: versions run: | - DOCKERFILE="devcontainer-bun/.devcontainer/Dockerfile" + DOCKERFILE="bun/.devcontainer/Dockerfile" BUN_VERSION=$(grep '^ARG BUN_VERSION=' "$DOCKERFILE" | cut -d'=' -f2) echo "version-tag=bun${BUN_VERSION}-alpine" >> "$GITHUB_OUTPUT" echo "Bun: $BUN_VERSION" @@ -36,9 +36,9 @@ jobs: packages: write uses: ./.github/workflows/reusable-docker-build.yml with: - image-name: devcontainer-bun - context: devcontainer-bun/.devcontainer - dockerfile: devcontainer-bun/.devcontainer/Dockerfile + image-name: devcontainers/bun + context: bun/.devcontainer + dockerfile: bun/.devcontainer/Dockerfile version-tag: ${{ needs.prepare.outputs.version-tag }} verify-command: 'bun --version' secrets: inherit diff --git a/.github/workflows/build-claude-bun.yml b/.github/workflows/build-claude-bun.yml index 8d7f56a..7001914 100644 --- a/.github/workflows/build-claude-bun.yml +++ b/.github/workflows/build-claude-bun.yml @@ -1,16 +1,16 @@ -name: Build devcontainer-claude-bun +name: Build claude-bun on: push: branches: - master paths: - - 'devcontainer-claude-bun/.devcontainer/Dockerfile' - - 'devcontainer-claude-bun/.devcontainer/init-firewall.sh' + - 'claude-bun/.devcontainer/Dockerfile' + - 'claude-bun/.devcontainer/init-firewall.sh' workflow_dispatch: concurrency: - group: build-devcontainer-claude-bun-${{ github.ref }} + group: build-claude-bun-${{ github.ref }} cancel-in-progress: true jobs: @@ -20,12 +20,12 @@ jobs: version-tag: ${{ steps.versions.outputs.version-tag }} steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Extract versions from Dockerfile id: versions run: | - DOCKERFILE="devcontainer-claude-bun/.devcontainer/Dockerfile" + DOCKERFILE="claude-bun/.devcontainer/Dockerfile" BUN_VERSION=$(grep '^ARG BUN_VERSION=' "$DOCKERFILE" | cut -d'=' -f2) echo "version-tag=bun${BUN_VERSION}-slim" >> "$GITHUB_OUTPUT" echo "Bun: $BUN_VERSION" @@ -37,9 +37,9 @@ jobs: packages: write uses: ./.github/workflows/reusable-docker-build.yml with: - image-name: devcontainer-claude-bun - context: devcontainer-claude-bun/.devcontainer - dockerfile: devcontainer-claude-bun/.devcontainer/Dockerfile + image-name: devcontainers/claude-bun + context: claude-bun/.devcontainer + dockerfile: claude-bun/.devcontainer/Dockerfile version-tag: ${{ needs.prepare.outputs.version-tag }} verify-command: 'bun --version' secrets: inherit diff --git a/.github/workflows/build-hugo-bun-node.yml b/.github/workflows/build-hugo-bun-node.yml index 10a4692..bf2c54e 100644 --- a/.github/workflows/build-hugo-bun-node.yml +++ b/.github/workflows/build-hugo-bun-node.yml @@ -1,15 +1,15 @@ -name: Build devcontainer-hugo-bun-node +name: Build hugo-bun-node on: push: branches: - master paths: - - 'devcontainer-hugo-bun-node/.devcontainer/Dockerfile' + - 'hugo-bun-node/.devcontainer/Dockerfile' workflow_dispatch: concurrency: - group: build-devcontainer-hugo-bun-node-${{ github.ref }} + group: build-hugo-bun-node-${{ github.ref }} cancel-in-progress: true jobs: @@ -19,12 +19,12 @@ jobs: version-tag: ${{ steps.versions.outputs.version-tag }} steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Extract versions from Dockerfile id: versions run: | - DOCKERFILE="devcontainer-hugo-bun-node/.devcontainer/Dockerfile" + DOCKERFILE="hugo-bun-node/.devcontainer/Dockerfile" HUGO_VERSION=$(grep '^ARG HUGO_VERSION=' "$DOCKERFILE" | cut -d'=' -f2) BUN_VERSION=$(grep '^ARG BUN_VERSION=' "$DOCKERFILE" | cut -d'=' -f2) NODE_VERSION=$(grep '^ARG NODE_VERSION=' "$DOCKERFILE" | cut -d'=' -f2) @@ -38,9 +38,9 @@ jobs: packages: write uses: ./.github/workflows/reusable-docker-build.yml with: - image-name: devcontainer-hugo-bun-node - context: devcontainer-hugo-bun-node/.devcontainer - dockerfile: devcontainer-hugo-bun-node/.devcontainer/Dockerfile + image-name: devcontainers/hugo-bun-node + context: hugo-bun-node/.devcontainer + dockerfile: hugo-bun-node/.devcontainer/Dockerfile version-tag: ${{ needs.prepare.outputs.version-tag }} verify-command: 'bun --version && hugo version && node --version' secrets: inherit diff --git a/.github/workflows/build-hugo-bun.yml b/.github/workflows/build-hugo-bun.yml index 31b6930..38fef7b 100644 --- a/.github/workflows/build-hugo-bun.yml +++ b/.github/workflows/build-hugo-bun.yml @@ -1,15 +1,15 @@ -name: Build devcontainer-hugo-bun +name: Build hugo-bun on: push: branches: - master paths: - - 'devcontainer-hugo-bun/.devcontainer/Dockerfile' + - 'hugo-bun/.devcontainer/Dockerfile' workflow_dispatch: concurrency: - group: build-devcontainer-hugo-bun-${{ github.ref }} + group: build-hugo-bun-${{ github.ref }} cancel-in-progress: true jobs: @@ -19,12 +19,12 @@ jobs: version-tag: ${{ steps.versions.outputs.version-tag }} steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Extract versions from Dockerfile id: versions run: | - DOCKERFILE="devcontainer-hugo-bun/.devcontainer/Dockerfile" + DOCKERFILE="hugo-bun/.devcontainer/Dockerfile" HUGO_VERSION=$(grep '^ARG HUGO_VERSION=' "$DOCKERFILE" | cut -d'=' -f2) BUN_VERSION=$(grep '^ARG BUN_VERSION=' "$DOCKERFILE" | cut -d'=' -f2) echo "version-tag=hugo${HUGO_VERSION}-bun${BUN_VERSION}-alpine" >> "$GITHUB_OUTPUT" @@ -37,9 +37,9 @@ jobs: packages: write uses: ./.github/workflows/reusable-docker-build.yml with: - image-name: devcontainer-hugo-bun - context: devcontainer-hugo-bun/.devcontainer - dockerfile: devcontainer-hugo-bun/.devcontainer/Dockerfile + image-name: devcontainers/hugo-bun + context: hugo-bun/.devcontainer + dockerfile: hugo-bun/.devcontainer/Dockerfile version-tag: ${{ needs.prepare.outputs.version-tag }} verify-command: 'bun --version && hugo version' secrets: inherit diff --git a/.github/workflows/reusable-docker-build.yml b/.github/workflows/reusable-docker-build.yml index 24eeecf..6386e21 100644 --- a/.github/workflows/reusable-docker-build.yml +++ b/.github/workflows/reusable-docker-build.yml @@ -4,7 +4,7 @@ on: workflow_call: inputs: image-name: - description: 'Image name (e.g. devcontainer-bun)' + description: 'Image name including namespace (e.g. devcontainers/bun)' required: true type: string context: From 083b77fa55bd923f10cd01e88cf31fefd7f3d9ef Mon Sep 17 00:00:00 2001 From: Serge Gatezh <2880401+gatezh@users.noreply.github.com> Date: Tue, 31 Mar 2026 20:54:32 -0600 Subject: [PATCH 04/12] refactor: update claude-code and ralphex-fe workflows for new naming --- .github/workflows/build-claude-code.yml | 8 ++++---- .github/workflows/build-ralphex-fe.yml | 6 +++--- .github/workflows/update-and-build-ralphex-fe.yml | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/build-claude-code.yml b/.github/workflows/build-claude-code.yml index 8b129dc..cd2c860 100644 --- a/.github/workflows/build-claude-code.yml +++ b/.github/workflows/build-claude-code.yml @@ -32,7 +32,7 @@ jobs: context: claude-code/.devcontainer platforms: linux/amd64,linux/arm64 - meta-images: ghcr.io/gatezh/devcontainer-images/claude-code + meta-images: ghcr.io/gatezh/devcontainers/claude-code meta-tags: | type=raw,value=latest type=sha,prefix= @@ -56,7 +56,7 @@ jobs: context: claude-code/.devcontainer platforms: linux/amd64,linux/arm64 - meta-images: ghcr.io/gatezh/devcontainer-images/claude-code-sandbox + meta-images: ghcr.io/gatezh/devcontainers/claude-code-sandbox meta-tags: | type=raw,value=latest type=sha,prefix= @@ -101,5 +101,5 @@ jobs: - name: Verify image run: | - docker pull ghcr.io/gatezh/devcontainer-images/${{ matrix.image-suffix }}:latest - docker run --rm ghcr.io/gatezh/devcontainer-images/${{ matrix.image-suffix }}:latest bash -c "${{ matrix.verify-command }}" + docker pull ghcr.io/gatezh/devcontainers/${{ matrix.image-suffix }}:latest + docker run --rm ghcr.io/gatezh/devcontainers/${{ matrix.image-suffix }}:latest bash -c "${{ matrix.verify-command }}" diff --git a/.github/workflows/build-ralphex-fe.yml b/.github/workflows/build-ralphex-fe.yml index 62bedc8..343aa0a 100644 --- a/.github/workflows/build-ralphex-fe.yml +++ b/.github/workflows/build-ralphex-fe.yml @@ -60,7 +60,7 @@ jobs: push: true context: ralphex-fe platforms: linux/amd64,linux/arm64 - meta-images: ghcr.io/gatezh/ralphex-fe + meta-images: ghcr.io/gatezh/devcontainers/ralphex-fe meta-tags: | type=raw,value=latest type=raw,value=${{ needs.prepare.outputs.version-tag }} @@ -92,8 +92,8 @@ jobs: - name: Verify tools run: | - docker pull ghcr.io/gatezh/ralphex-fe:latest - docker run --rm --entrypoint sh ghcr.io/gatezh/ralphex-fe:latest -c " + docker pull ghcr.io/gatezh/devcontainers/ralphex-fe:latest + docker run --rm --entrypoint sh ghcr.io/gatezh/devcontainers/ralphex-fe:latest -c " bun --version && hugo version && python3 --version && diff --git a/.github/workflows/update-and-build-ralphex-fe.yml b/.github/workflows/update-and-build-ralphex-fe.yml index ce07904..86dc0b5 100644 --- a/.github/workflows/update-and-build-ralphex-fe.yml +++ b/.github/workflows/update-and-build-ralphex-fe.yml @@ -149,7 +149,7 @@ jobs: if: ${{ needs.update-dockerfile.outputs.versions_updated == 'true' && inputs.update_only == false }} uses: ./.github/workflows/reusable-docker-build.yml with: - image-name: ralphex-fe + image-name: devcontainers/ralphex-fe context: ralphex-fe dockerfile: ralphex-fe/Dockerfile version-tag: bun${{ needs.update-dockerfile.outputs.bun_version }}-hugo${{ needs.update-dockerfile.outputs.hugo_version }}-ralphex${{ needs.update-dockerfile.outputs.ralphex_version }} From 795e4cef6a8070eb95bbc8b6ffeefe4fa0a89e10 Mon Sep 17 00:00:00 2001 From: Serge Gatezh <2880401+gatezh@users.noreply.github.com> Date: Tue, 31 Mar 2026 21:05:41 -0600 Subject: [PATCH 05/12] refactor: update CI workflow for renamed directories --- .github/workflows/ci.yml | 56 ++++++++++++++++++++-------------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8967281..cef2a00 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -22,10 +22,10 @@ jobs: fail-fast: false matrix: dockerfile: - - devcontainer-bun/.devcontainer/Dockerfile - - devcontainer-claude-bun/.devcontainer/Dockerfile - - devcontainer-hugo-bun/.devcontainer/Dockerfile - - devcontainer-hugo-bun-node/.devcontainer/Dockerfile + - bun/.devcontainer/Dockerfile + - claude-bun/.devcontainer/Dockerfile + - hugo-bun/.devcontainer/Dockerfile + - hugo-bun-node/.devcontainer/Dockerfile - ralphex-fe/Dockerfile steps: - name: Checkout repository @@ -63,24 +63,24 @@ jobs: id: filter with: filters: | - devcontainer-bun: - - 'devcontainer-bun/**' - devcontainer-claude-bun: - - 'devcontainer-claude-bun/**' - devcontainer-hugo-bun: - - 'devcontainer-hugo-bun/**' - devcontainer-hugo-bun-node: - - 'devcontainer-hugo-bun-node/**' + bun: + - 'bun/**' + claude-bun: + - 'claude-bun/**' + hugo-bun: + - 'hugo-bun/**' + hugo-bun-node: + - 'hugo-bun-node/**' ralphex-fe: - 'ralphex-fe/**' - name: Build matrix from changes id: set-matrix env: - CHANGED_BUN: ${{ steps.filter.outputs.devcontainer-bun }} - CHANGED_CLAUDE_BUN: ${{ steps.filter.outputs.devcontainer-claude-bun }} - CHANGED_HUGO_BUN: ${{ steps.filter.outputs.devcontainer-hugo-bun }} - CHANGED_HUGO_BUN_NODE: ${{ steps.filter.outputs.devcontainer-hugo-bun-node }} + CHANGED_BUN: ${{ steps.filter.outputs.bun }} + CHANGED_CLAUDE_BUN: ${{ steps.filter.outputs.claude-bun }} + CHANGED_HUGO_BUN: ${{ steps.filter.outputs.hugo-bun }} + CHANGED_HUGO_BUN_NODE: ${{ steps.filter.outputs.hugo-bun-node }} CHANGED_RALPHEX: ${{ steps.filter.outputs.ralphex-fe }} run: | INCLUDES="[]" @@ -96,30 +96,30 @@ jobs: } if [ "$CHANGED_BUN" = "true" ]; then - add_image "devcontainer-bun" \ - "devcontainer-bun/.devcontainer" \ - "devcontainer-bun/.devcontainer/Dockerfile" \ + add_image "bun" \ + "bun/.devcontainer" \ + "bun/.devcontainer/Dockerfile" \ "bun --version" fi if [ "$CHANGED_CLAUDE_BUN" = "true" ]; then - add_image "devcontainer-claude-bun" \ - "devcontainer-claude-bun/.devcontainer" \ - "devcontainer-claude-bun/.devcontainer/Dockerfile" \ + add_image "claude-bun" \ + "claude-bun/.devcontainer" \ + "claude-bun/.devcontainer/Dockerfile" \ "bun --version" fi if [ "$CHANGED_HUGO_BUN" = "true" ]; then - add_image "devcontainer-hugo-bun" \ - "devcontainer-hugo-bun/.devcontainer" \ - "devcontainer-hugo-bun/.devcontainer/Dockerfile" \ + add_image "hugo-bun" \ + "hugo-bun/.devcontainer" \ + "hugo-bun/.devcontainer/Dockerfile" \ "bun --version && hugo version" fi if [ "$CHANGED_HUGO_BUN_NODE" = "true" ]; then - add_image "devcontainer-hugo-bun-node" \ - "devcontainer-hugo-bun-node/.devcontainer" \ - "devcontainer-hugo-bun-node/.devcontainer/Dockerfile" \ + add_image "hugo-bun-node" \ + "hugo-bun-node/.devcontainer" \ + "hugo-bun-node/.devcontainer/Dockerfile" \ "bun --version && hugo version && node --version" fi From c21d2af072508170b3922f3eb6ff8f3ede1f06a0 Mon Sep 17 00:00:00 2001 From: Serge Gatezh <2880401+gatezh@users.noreply.github.com> Date: Tue, 31 Mar 2026 21:08:49 -0600 Subject: [PATCH 06/12] refactor: update OCI labels in all Dockerfiles for new repo name --- .devcontainer/Dockerfile | 22 +++++++++++----------- bun/.devcontainer/Dockerfile | 6 +++--- claude-bun/.devcontainer/Dockerfile | 6 +++--- claude-code/.devcontainer/Dockerfile | 8 ++++---- hugo-bun-node/.devcontainer/Dockerfile | 6 +++--- hugo-bun/.devcontainer/Dockerfile | 6 +++--- ralphex-fe/Dockerfile | 4 ++-- 7 files changed, 29 insertions(+), 29 deletions(-) diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index 455e0ba..b67b75b 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -1,5 +1,5 @@ # ═══════════════════════════════════════════════════════════════════════════════ -# Devcontainer for the devcontainer-images repo — two build targets: +# Devcontainer for the devcontainers repo — two build targets: # default — full dev environment with passwordless sudo # sandbox — network-restricted environment with firewall packages # @@ -9,8 +9,8 @@ # - npm-global directory with proper permissions # # Build: -# docker build --target default -t devcontainer-images:default . -# docker build --target sandbox -t devcontainer-images:sandbox . +# docker build --target default -t devcontainers:default . +# docker build --target sandbox -t devcontainers:sandbox . # ═══════════════════════════════════════════════════════════════════════════════ # ═════════════════════════════════════════════════════════════════════════════ @@ -136,11 +136,11 @@ RUN echo "node ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/node-nopasswd \ && chmod 0440 /etc/sudoers.d/node-nopasswd USER node -LABEL org.opencontainers.image.source="https://github.com/gatezh/devcontainer-images" \ - org.opencontainers.image.description="Devcontainer for the devcontainer-images repo — full dev environment" \ +LABEL org.opencontainers.image.source="https://github.com/gatezh/devcontainers" \ + org.opencontainers.image.description="Devcontainer for the devcontainers repo — full dev environment" \ org.opencontainers.image.licenses="MIT" \ - org.opencontainers.image.title="devcontainer-images" \ - org.opencontainers.image.url="https://github.com/gatezh/devcontainer-images" + org.opencontainers.image.title="devcontainers" \ + org.opencontainers.image.url="https://github.com/gatezh/devcontainers" CMD ["sleep", "infinity"] @@ -165,10 +165,10 @@ RUN echo "node ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/node-nopasswd \ && chmod 0440 /etc/sudoers.d/node-nopasswd USER node -LABEL org.opencontainers.image.source="https://github.com/gatezh/devcontainer-images" \ - org.opencontainers.image.description="Devcontainer for the devcontainer-images repo — network-restricted sandbox" \ +LABEL org.opencontainers.image.source="https://github.com/gatezh/devcontainers" \ + org.opencontainers.image.description="Devcontainer for the devcontainers repo — network-restricted sandbox" \ org.opencontainers.image.licenses="MIT" \ - org.opencontainers.image.title="devcontainer-images-sandbox" \ - org.opencontainers.image.url="https://github.com/gatezh/devcontainer-images" + org.opencontainers.image.title="devcontainers-sandbox" \ + org.opencontainers.image.url="https://github.com/gatezh/devcontainers" CMD ["sleep", "infinity"] diff --git a/bun/.devcontainer/Dockerfile b/bun/.devcontainer/Dockerfile index b7ac0e1..7bddae1 100644 --- a/bun/.devcontainer/Dockerfile +++ b/bun/.devcontainer/Dockerfile @@ -12,8 +12,8 @@ RUN apk add --no-cache \ zsh # OCI labels for container metadata and GitHub Package integration -LABEL org.opencontainers.image.source="https://github.com/gatezh/devcontainer-images" +LABEL org.opencontainers.image.source="https://github.com/gatezh/devcontainers" LABEL org.opencontainers.image.description="Bun development container - multiplatform image for modern JavaScript/TypeScript development" LABEL org.opencontainers.image.licenses="MIT" -LABEL org.opencontainers.image.title="devcontainer-bun" -LABEL org.opencontainers.image.url="https://github.com/gatezh/devcontainer-images" +LABEL org.opencontainers.image.title="bun" +LABEL org.opencontainers.image.url="https://github.com/gatezh/devcontainers" diff --git a/claude-bun/.devcontainer/Dockerfile b/claude-bun/.devcontainer/Dockerfile index c027898..cc34081 100644 --- a/claude-bun/.devcontainer/Dockerfile +++ b/claude-bun/.devcontainer/Dockerfile @@ -89,8 +89,8 @@ RUN chmod +x /usr/local/bin/init-firewall.sh && \ chmod 0440 /etc/sudoers.d/bun-firewall USER bun -LABEL org.opencontainers.image.source="https://github.com/gatezh/devcontainer-images" \ +LABEL org.opencontainers.image.source="https://github.com/gatezh/devcontainers" \ org.opencontainers.image.description="Claude Code development container — Bun environment with Claude Code CLI, firewall sandbox, and zsh" \ org.opencontainers.image.licenses="MIT" \ - org.opencontainers.image.title="devcontainer-claude-bun" \ - org.opencontainers.image.url="https://github.com/gatezh/devcontainer-images" + org.opencontainers.image.title="claude-bun" \ + org.opencontainers.image.url="https://github.com/gatezh/devcontainers" diff --git a/claude-code/.devcontainer/Dockerfile b/claude-code/.devcontainer/Dockerfile index fba3503..95b1acc 100644 --- a/claude-code/.devcontainer/Dockerfile +++ b/claude-code/.devcontainer/Dockerfile @@ -195,11 +195,11 @@ RUN --mount=type=cache,target=/root/.npm \ && chown -R node:node /usr/local/share/npm-global USER node -LABEL org.opencontainers.image.source="https://github.com/gatezh/devcontainer-images" \ +LABEL org.opencontainers.image.source="https://github.com/gatezh/devcontainers" \ org.opencontainers.image.description="Claude Code devcontainer — full dev environment with agent-browser, Playwright, and passwordless sudo" \ org.opencontainers.image.licenses="MIT" \ org.opencontainers.image.title="claude-code" \ - org.opencontainers.image.url="https://github.com/gatezh/devcontainer-images" + org.opencontainers.image.url="https://github.com/gatezh/devcontainers" CMD ["sleep", "infinity"] @@ -227,10 +227,10 @@ RUN echo "node ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/node-nopasswd \ && chmod 0440 /etc/sudoers.d/node-nopasswd USER node -LABEL org.opencontainers.image.source="https://github.com/gatezh/devcontainer-images" \ +LABEL org.opencontainers.image.source="https://github.com/gatezh/devcontainers" \ org.opencontainers.image.description="Claude Code devcontainer — network-restricted sandbox with firewall packages" \ org.opencontainers.image.licenses="MIT" \ org.opencontainers.image.title="claude-code-sandbox" \ - org.opencontainers.image.url="https://github.com/gatezh/devcontainer-images" + org.opencontainers.image.url="https://github.com/gatezh/devcontainers" CMD ["sleep", "infinity"] diff --git a/hugo-bun-node/.devcontainer/Dockerfile b/hugo-bun-node/.devcontainer/Dockerfile index d330419..8092800 100644 --- a/hugo-bun-node/.devcontainer/Dockerfile +++ b/hugo-bun-node/.devcontainer/Dockerfile @@ -46,8 +46,8 @@ RUN set -eux; \ npm --version # OCI labels for container metadata and GitHub Package integration -LABEL org.opencontainers.image.source="https://github.com/gatezh/devcontainer-images" +LABEL org.opencontainers.image.source="https://github.com/gatezh/devcontainers" LABEL org.opencontainers.image.description="Hugo Extended + Bun + Node.js development container - multiplatform image for modern static site development with Cloudflare Workers support" LABEL org.opencontainers.image.licenses="MIT" -LABEL org.opencontainers.image.title="devcontainer-hugo-bun-node" -LABEL org.opencontainers.image.url="https://github.com/gatezh/devcontainer-images" +LABEL org.opencontainers.image.title="hugo-bun-node" +LABEL org.opencontainers.image.url="https://github.com/gatezh/devcontainers" diff --git a/hugo-bun/.devcontainer/Dockerfile b/hugo-bun/.devcontainer/Dockerfile index 3ff32e1..2893cc9 100644 --- a/hugo-bun/.devcontainer/Dockerfile +++ b/hugo-bun/.devcontainer/Dockerfile @@ -30,8 +30,8 @@ RUN set -eux; \ hugo version # OCI labels for container metadata and GitHub Package integration -LABEL org.opencontainers.image.source="https://github.com/gatezh/devcontainer-images" +LABEL org.opencontainers.image.source="https://github.com/gatezh/devcontainers" LABEL org.opencontainers.image.description="Hugo Extended + Bun development container - multiplatform image for modern static site development" LABEL org.opencontainers.image.licenses="MIT" -LABEL org.opencontainers.image.title="devcontainer-hugo-bun" -LABEL org.opencontainers.image.url="https://github.com/gatezh/devcontainer-images" +LABEL org.opencontainers.image.title="hugo-bun" +LABEL org.opencontainers.image.url="https://github.com/gatezh/devcontainers" diff --git a/ralphex-fe/Dockerfile b/ralphex-fe/Dockerfile index 83d1e77..3b7157e 100644 --- a/ralphex-fe/Dockerfile +++ b/ralphex-fe/Dockerfile @@ -174,8 +174,8 @@ ENTRYPOINT ["/init.sh"] CMD ["/srv/ralphex"] # ── OCI labels ─────────────────────────────────────────────────────────────── -LABEL org.opencontainers.image.source="https://github.com/gatezh/devcontainer-images" \ +LABEL org.opencontainers.image.source="https://github.com/gatezh/devcontainers" \ org.opencontainers.image.description="Ralphex-fe: Frontend development image with Bun, Hugo Extended, Playwright, and Claude Code on Debian" \ org.opencontainers.image.licenses="MIT" \ org.opencontainers.image.title="ralphex-fe" \ - org.opencontainers.image.url="https://github.com/gatezh/devcontainer-images" + org.opencontainers.image.url="https://github.com/gatezh/devcontainers" From ea64201e595c7f1162007bdfd5913eb83ac3a3ba Mon Sep 17 00:00:00 2001 From: Serge Gatezh <2880401+gatezh@users.noreply.github.com> Date: Tue, 31 Mar 2026 21:09:47 -0600 Subject: [PATCH 07/12] refactor: update docker-compose and devcontainer config for new repo name --- .devcontainer/claude-sandbox/devcontainer.json | 4 ++-- .devcontainer/devcontainer.json | 4 ++-- .devcontainer/init-plugins.sh | 2 +- claude-code/.devcontainer/claude-sandbox/docker-compose.yml | 2 +- claude-code/.devcontainer/docker-compose.yml | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.devcontainer/claude-sandbox/devcontainer.json b/.devcontainer/claude-sandbox/devcontainer.json index d22e5d2..8d7d9a2 100644 --- a/.devcontainer/claude-sandbox/devcontainer.json +++ b/.devcontainer/claude-sandbox/devcontainer.json @@ -56,8 +56,8 @@ } }, "mounts": [ - "source=devcontainer-images-sandbox-config-${devcontainerId},target=/home/node/.claude,type=volume", - "source=devcontainer-images-sandbox-fish-${devcontainerId},target=/home/node/.local/share/fish,type=volume", + "source=devcontainers-sandbox-config-${devcontainerId},target=/home/node/.claude,type=volume", + "source=devcontainers-sandbox-fish-${devcontainerId},target=/home/node/.local/share/fish,type=volume", // Mount firewall script into the expected path "source=${localWorkspaceFolder}/.devcontainer/claude-sandbox/init-firewall.sh,target=/usr/local/bin/init-firewall.sh,type=bind" ], diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 361b98a..fa4b858 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -57,9 +57,9 @@ }, "mounts": [ // Persist Claude Code configuration between container rebuilds - "source=devcontainer-images-claude-config-${devcontainerId},target=/home/node/.claude,type=volume", + "source=devcontainers-claude-config-${devcontainerId},target=/home/node/.claude,type=volume", // Persist fish shell history between container rebuilds - "source=devcontainer-images-fish-data-${devcontainerId},target=/home/node/.local/share/fish,type=volume" + "source=devcontainers-fish-data-${devcontainerId},target=/home/node/.local/share/fish,type=volume" ], "containerEnv": { "TZ": "${localEnv:TZ:America/Edmonton}", diff --git a/.devcontainer/init-plugins.sh b/.devcontainer/init-plugins.sh index 0ce051d..d643293 100755 --- a/.devcontainer/init-plugins.sh +++ b/.devcontainer/init-plugins.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Initialize Claude Code plugins for the devcontainer-images repo +# Initialize Claude Code plugins for the devcontainers repo # This script is idempotent - safe to run multiple times set -euo pipefail diff --git a/claude-code/.devcontainer/claude-sandbox/docker-compose.yml b/claude-code/.devcontainer/claude-sandbox/docker-compose.yml index 5a06278..29ed958 100644 --- a/claude-code/.devcontainer/claude-sandbox/docker-compose.yml +++ b/claude-code/.devcontainer/claude-sandbox/docker-compose.yml @@ -2,7 +2,7 @@ name: myproject-sandbox services: devcontainer: - image: ghcr.io/gatezh/devcontainer-images/claude-code-sandbox:latest + image: ghcr.io/gatezh/devcontainers/claude-code-sandbox:latest pull_policy: always volumes: - ../..:/workspace:cached diff --git a/claude-code/.devcontainer/docker-compose.yml b/claude-code/.devcontainer/docker-compose.yml index bcab1d7..bfca1bb 100644 --- a/claude-code/.devcontainer/docker-compose.yml +++ b/claude-code/.devcontainer/docker-compose.yml @@ -2,7 +2,7 @@ name: myproject services: devcontainer: - image: ghcr.io/gatezh/devcontainer-images/claude-code:latest + image: ghcr.io/gatezh/devcontainers/claude-code:latest pull_policy: always volumes: - ..:/workspace:cached From f77f4325262bc0ce76f76f95fdae8674536891d7 Mon Sep 17 00:00:00 2001 From: Serge Gatezh <2880401+gatezh@users.noreply.github.com> Date: Tue, 31 Mar 2026 21:14:55 -0600 Subject: [PATCH 08/12] docs: update all READMEs for new repo name and image paths --- README.md | 36 ++++++++++++++++++------------------ bun/README.md | 20 ++++++++++---------- claude-bun/README.md | 8 ++++---- claude-code/README.md | 16 ++++++++-------- hugo-bun-node/README.md | 20 ++++++++++---------- hugo-bun/README.md | 20 ++++++++++---------- ralphex-fe/README.md | 6 ++++-- 7 files changed, 64 insertions(+), 62 deletions(-) diff --git a/README.md b/README.md index 9bc6dea..2466c75 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Devcontainer Images +# Devcontainers This repository contains Dockerfiles for custom Docker images hosted on GitHub Container Registry (ghcr.io). @@ -7,9 +7,9 @@ This repository contains Dockerfiles for custom Docker images hosted on GitHub C ### Devcontainer Images - **[claude-code](./claude-code/README.md)** - Shared Claude Code devcontainer image (default + sandbox variants) -- **[devcontainer-bun](./devcontainer-bun/README.md)** - Bun development container -- **[devcontainer-claude-bun](./devcontainer-claude-bun/README.md)** - Claude Code development container with firewall sandbox -- **[devcontainer-hugo-bun](./devcontainer-hugo-bun/README.md)** - Hugo Extended + Bun development container +- **[bun](./bun/README.md)** - Bun development container +- **[claude-bun](./claude-bun/README.md)** - Claude Code development container with firewall sandbox +- **[hugo-bun](./hugo-bun/README.md)** - Hugo Extended + Bun development container ### Standalone Docker Images @@ -20,7 +20,7 @@ This repository contains Dockerfiles for custom Docker images hosted on GitHub C Each subdirectory represents a Docker image project. Devcontainer images use the following structure: ``` -devcontainer-name/ +image-name/ ├── .devcontainer/ │ ├── Dockerfile # Source of truth for the image │ └── devcontainer.json # Dev container configuration (uses "build") @@ -46,19 +46,19 @@ Shared devcontainer base image for Claude Code projects. Two variants from a sin ```jsonc // Default variant { - "image": "ghcr.io/gatezh/devcontainer-images/claude-code:latest" + "image": "ghcr.io/gatezh/devcontainers/claude-code:latest" } // Sandbox variant { - "image": "ghcr.io/gatezh/devcontainer-images/claude-code-sandbox:latest", + "image": "ghcr.io/gatezh/devcontainers/claude-code-sandbox:latest", "capAdd": ["NET_ADMIN", "NET_RAW"] } ``` See the [claude-code README](./claude-code/README.md) for full setup guide. -### devcontainer-bun +### bun Bun development container for modern JavaScript/TypeScript development. @@ -66,11 +66,11 @@ Bun development container for modern JavaScript/TypeScript development. ```json { - "image": "ghcr.io//devcontainer-bun:latest" + "image": "ghcr.io//devcontainers/bun:latest" } ``` -### devcontainer-claude-bun +### claude-bun Claude Code development container with Bun runtime, Claude Code CLI, and a restrictive firewall sandbox. @@ -78,13 +78,13 @@ Claude Code development container with Bun runtime, Claude Code CLI, and a restr ```json { - "image": "ghcr.io//devcontainer-claude-bun:latest", + "image": "ghcr.io//devcontainers/claude-bun:latest", "runArgs": ["--cap-add=NET_ADMIN", "--cap-add=NET_RAW"], "postStartCommand": "sudo /usr/local/bin/init-firewall.sh" } ``` -### devcontainer-hugo-bun +### hugo-bun Hugo development container with Bun runtime. @@ -92,7 +92,7 @@ Hugo development container with Bun runtime. ```json { - "image": "ghcr.io//devcontainer-hugo-bun:latest" + "image": "ghcr.io//devcontainers/hugo-bun:latest" } ``` @@ -104,14 +104,14 @@ Standalone Docker image based on ralphex with Bun 1.3.9, Hugo Extended 0.155.3, ```bash # Pull and run interactively -docker pull ghcr.io//ralphex-fe:latest -docker run -it --rm -v $(pwd):/workspace -w /workspace ghcr.io//ralphex-fe:latest +docker pull ghcr.io//devcontainers/ralphex-fe:latest +docker run -it --rm -v $(pwd):/workspace -w /workspace ghcr.io//devcontainers/ralphex-fe:latest # Run Bun commands -docker run --rm -v $(pwd):/workspace -w /workspace ghcr.io//ralphex-fe:latest bun run index.ts +docker run --rm -v $(pwd):/workspace -w /workspace ghcr.io//devcontainers/ralphex-fe:latest bun run index.ts # Run Hugo commands -docker run --rm -v $(pwd):/workspace -w /workspace -p 1313:1313 ghcr.io//ralphex-fe:latest hugo server --bind 0.0.0.0 +docker run --rm -v $(pwd):/workspace -w /workspace -p 1313:1313 ghcr.io//devcontainers/ralphex-fe:latest hugo server --bind 0.0.0.0 ``` @@ -119,7 +119,7 @@ docker run --rm -v $(pwd):/workspace -w /workspace -p 1313:1313 ghcr.io//devcontainer-bun:bun-alpine \ - -t ghcr.io//devcontainer-bun:latest \ + -t ghcr.io//devcontainers/bun:bun-alpine \ + -t ghcr.io//devcontainers/bun:latest \ --push \ .devcontainer ``` @@ -33,8 +33,8 @@ docker buildx build \ ```bash docker buildx build \ --platform linux/amd64,linux/arm64 \ - -t ghcr.io/myusername/devcontainer-bun:bun1.3.5-alpine \ - -t ghcr.io/myusername/devcontainer-bun:latest \ + -t ghcr.io/myusername/devcontainers/bun:bun1.3.5-alpine \ + -t ghcr.io/myusername/devcontainers/bun:latest \ --push \ .devcontainer ``` @@ -57,7 +57,7 @@ When using this pre-built image, replace the `dockerFile` property with the `ima ```json { "name": "My Bun Project", - "image": "ghcr.io//devcontainer-bun:latest" + "image": "ghcr.io//devcontainers/bun:latest" } ``` @@ -70,7 +70,7 @@ When using this pre-built image, replace the `dockerFile` property with the `ima to: ```json { - "image": "ghcr.io//devcontainer-bun:latest" + "image": "ghcr.io//devcontainers/bun:latest" } ``` @@ -79,7 +79,7 @@ to: ```json { "name": "My Bun Project", - "image": "ghcr.io//devcontainer-bun:bun1.3.5-alpine" + "image": "ghcr.io//devcontainers/bun:bun1.3.5-alpine" } ``` @@ -111,7 +111,7 @@ To build with a different version, use build arguments: docker buildx build \ --build-arg BUN_VERSION=1.4.0 \ --platform linux/amd64,linux/arm64 \ - -t ghcr.io//devcontainer-bun:bun1.4.0-alpine \ + -t ghcr.io//devcontainers/bun:bun1.4.0-alpine \ --push \ .devcontainer ``` @@ -142,7 +142,7 @@ bun run dev ## License -This image configuration is part of the devcontainer-images repository. +This image configuration is part of the devcontainers repository. ## Contributing diff --git a/claude-bun/README.md b/claude-bun/README.md index 3c42829..ed97f80 100644 --- a/claude-bun/README.md +++ b/claude-bun/README.md @@ -1,4 +1,4 @@ -# devcontainer-claude-bun +# claude-bun Claude Code development container based on the [official Anthropic devcontainer configuration](https://github.com/anthropics/claude-code/tree/main/.devcontainer), using Bun as the JavaScript runtime. @@ -20,7 +20,7 @@ Add to your project's `.devcontainer/devcontainer.json`: ```json { - "image": "ghcr.io/gatezh/devcontainer-claude-bun:latest", + "image": "ghcr.io/gatezh/devcontainers/claude-bun:latest", "runArgs": [ "--cap-add=NET_ADMIN", "--cap-add=NET_RAW" @@ -74,8 +74,8 @@ When executed with `--dangerously-skip-permissions`, devcontainers do **not prev ## Image Tags -- `ghcr.io/gatezh/devcontainer-claude-bun:latest` - Latest build -- `ghcr.io/gatezh/devcontainer-claude-bun:bun1.3.5-slim` - Bun version specific tag +- `ghcr.io/gatezh/devcontainers/claude-bun:latest` - Latest build +- `ghcr.io/gatezh/devcontainers/claude-bun:bun1.3.5-slim` - Bun version specific tag ## Customization diff --git a/claude-code/README.md b/claude-code/README.md index 4aac3b4..c914544 100644 --- a/claude-code/README.md +++ b/claude-code/README.md @@ -8,8 +8,8 @@ Projects consume these pre-built images and control their own tool versions via | Variant | Image | Use Case | |---------|-------|----------| -| **default** | `ghcr.io/gatezh/devcontainer-images/claude-code:latest` | Full dev environment with agent-browser and passwordless sudo | -| **sandbox** | `ghcr.io/gatezh/devcontainer-images/claude-code-sandbox:latest` | Network-restricted environment with iptables firewall packages | +| **default** | `ghcr.io/gatezh/devcontainers/claude-code:latest` | Full dev environment with agent-browser and passwordless sudo | +| **sandbox** | `ghcr.io/gatezh/devcontainers/claude-code-sandbox:latest` | Network-restricted environment with iptables firewall packages | ## What's Included @@ -251,12 +251,12 @@ The baked version is available at runtime via the `PLAYWRIGHT_VERSION` environme ## Building Locally / Local Fallback -If the pre-built image is unavailable (GHCR outage, rate limits, or you need to test image changes), build from the [devcontainer-images](https://github.com/gatezh/devcontainer-images) source: +If the pre-built image is unavailable (GHCR outage, rate limits, or you need to test image changes), build from the [devcontainers](https://github.com/gatezh/devcontainers) source: ```bash # Clone the image source (one-time) -git clone https://github.com/gatezh/devcontainer-images.git -cd devcontainer-images/claude-code +git clone https://github.com/gatezh/devcontainers.git +cd devcontainers/claude-code # Default variant docker build --target default -t claude-code:local .devcontainer @@ -271,7 +271,7 @@ Then update your project's `docker-compose.yml` to use the local tag: services: devcontainer: # Replace the GHCR reference: - # image: ghcr.io/gatezh/devcontainer-images/claude-code:latest + # image: ghcr.io/gatezh/devcontainers/claude-code:latest # With the local build: image: claude-code:local # pull_policy no longer needed for local images @@ -285,7 +285,7 @@ If you need to layer project-specific tools on top, create a thin Dockerfile and ```dockerfile # .devcontainer/Dockerfile -FROM ghcr.io/gatezh/devcontainer-images/claude-code:latest +FROM ghcr.io/gatezh/devcontainers/claude-code:latest # Project-specific additions RUN npm install -g your-tool ``` @@ -308,7 +308,7 @@ This pulls the pre-built image as a base layer (cached after first pull) and add docker buildx build \ --platform linux/amd64,linux/arm64 \ --target default \ - -t ghcr.io/gatezh/devcontainer-images/claude-code:latest \ + -t ghcr.io/gatezh/devcontainers/claude-code:latest \ --push \ claude-code/.devcontainer ``` diff --git a/hugo-bun-node/README.md b/hugo-bun-node/README.md index 5a8e6eb..5b2b2a1 100644 --- a/hugo-bun-node/README.md +++ b/hugo-bun-node/README.md @@ -1,4 +1,4 @@ -# devcontainer-hugo-bun-node +# hugo-bun-node A multiplatform development container image combining Hugo Extended, Bun runtime, and Node.js LTS, optimized for modern static site development workflows with Cloudflare Workers support. @@ -25,8 +25,8 @@ To build this multiplatform image, use Docker Buildx: ```bash docker buildx build \ --platform linux/amd64,linux/arm64 \ - -t ghcr.io//devcontainer-hugo-bun-node:hugo-bun-node-alpine \ - -t ghcr.io//devcontainer-hugo-bun-node:latest \ + -t ghcr.io//devcontainers/hugo-bun-node:hugo-bun-node-alpine \ + -t ghcr.io//devcontainers/hugo-bun-node:latest \ --push \ .devcontainer ``` @@ -36,8 +36,8 @@ docker buildx build \ ```bash docker buildx build \ --platform linux/amd64,linux/arm64 \ - -t ghcr.io/myusername/devcontainer-hugo-bun-node:hugo0.155.1-bun1.3.8-node24.13.0-alpine \ - -t ghcr.io/myusername/devcontainer-hugo-bun-node:latest \ + -t ghcr.io/myusername/devcontainers/hugo-bun-node:hugo0.155.1-bun1.3.8-node24.13.0-alpine \ + -t ghcr.io/myusername/devcontainers/hugo-bun-node:latest \ --push \ .devcontainer ``` @@ -62,7 +62,7 @@ When using this pre-built image, replace the `dockerFile` property with the `ima ```json { "name": "My Hugo Project", - "image": "ghcr.io//devcontainer-hugo-bun-node:latest" + "image": "ghcr.io//devcontainers/hugo-bun-node:latest" } ``` @@ -75,7 +75,7 @@ When using this pre-built image, replace the `dockerFile` property with the `ima to: ```json { - "image": "ghcr.io//devcontainer-hugo-bun-node:latest" + "image": "ghcr.io//devcontainers/hugo-bun-node:latest" } ``` @@ -84,7 +84,7 @@ to: ```json { "name": "My Hugo Project", - "image": "ghcr.io//devcontainer-hugo-bun-node:hugo0.155.1-bun1.3.8-node24.13.0-alpine" + "image": "ghcr.io//devcontainers/hugo-bun-node:hugo0.155.1-bun1.3.8-node24.13.0-alpine" } ``` @@ -125,7 +125,7 @@ docker buildx build \ --build-arg BUN_VERSION=1.4.0 \ --build-arg NODE_VERSION=24.12.0 \ --platform linux/amd64,linux/arm64 \ - -t ghcr.io//devcontainer-hugo-bun-node:hugo0.156.0-bun1.4.0-node24.12.0-alpine \ + -t ghcr.io//devcontainers/hugo-bun-node:hugo0.156.0-bun1.4.0-node24.12.0-alpine \ --push \ .devcontainer ``` @@ -211,7 +211,7 @@ wrangler deploy ## 📄 License -This image configuration is part of the devcontainer-images repository. +This image configuration is part of the devcontainers repository. ## 🤝 Contributing diff --git a/hugo-bun/README.md b/hugo-bun/README.md index 6393260..47459ff 100644 --- a/hugo-bun/README.md +++ b/hugo-bun/README.md @@ -1,4 +1,4 @@ -# devcontainer-hugo-bun +# hugo-bun A multiplatform development container image combining Hugo Extended and Bun runtime, optimized for modern static site development workflows. @@ -24,8 +24,8 @@ To build this multiplatform image, use Docker Buildx: ```bash docker buildx build \ --platform linux/amd64,linux/arm64 \ - -t ghcr.io//devcontainer-hugo-bun:hugo-bun-alpine \ - -t ghcr.io//devcontainer-hugo-bun:latest \ + -t ghcr.io//devcontainers/hugo-bun:hugo-bun-alpine \ + -t ghcr.io//devcontainers/hugo-bun:latest \ --push \ .devcontainer ``` @@ -35,8 +35,8 @@ docker buildx build \ ```bash docker buildx build \ --platform linux/amd64,linux/arm64 \ - -t ghcr.io/myusername/devcontainer-hugo-bun:hugo0.152.2-bun1.3.2-alpine \ - -t ghcr.io/myusername/devcontainer-hugo-bun:latest \ + -t ghcr.io/myusername/devcontainers/hugo-bun:hugo0.152.2-bun1.3.2-alpine \ + -t ghcr.io/myusername/devcontainers/hugo-bun:latest \ --push \ .devcontainer ``` @@ -60,7 +60,7 @@ When using this pre-built image, replace the `dockerFile` property with the `ima ```json { "name": "My Hugo Project", - "image": "ghcr.io//devcontainer-hugo-bun:latest" + "image": "ghcr.io//devcontainers/hugo-bun:latest" } ``` @@ -73,7 +73,7 @@ When using this pre-built image, replace the `dockerFile` property with the `ima to: ```json { - "image": "ghcr.io//devcontainer-hugo-bun:latest" + "image": "ghcr.io//devcontainers/hugo-bun:latest" } ``` @@ -82,7 +82,7 @@ to: ```json { "name": "My Hugo Project", - "image": "ghcr.io//devcontainer-hugo-bun:hugo0.152.2-bun1.3.2-alpine" + "image": "ghcr.io//devcontainers/hugo-bun:hugo0.152.2-bun1.3.2-alpine" } ``` @@ -121,7 +121,7 @@ docker buildx build \ --build-arg HUGO_VERSION=0.153.0 \ --build-arg BUN_VERSION=1.4.0 \ --platform linux/amd64,linux/arm64 \ - -t ghcr.io//devcontainer-hugo-bun:hugo0.153.0-bun1.4.0-alpine \ + -t ghcr.io//devcontainers/hugo-bun:hugo0.153.0-bun1.4.0-alpine \ --push \ .devcontainer ``` @@ -186,7 +186,7 @@ bun run index.ts ## 📄 License -This image configuration is part of the devcontainer-images repository. +This image configuration is part of the devcontainers repository. ## 🤝 Contributing diff --git a/ralphex-fe/README.md b/ralphex-fe/README.md index 8451e18..ab558a1 100644 --- a/ralphex-fe/README.md +++ b/ralphex-fe/README.md @@ -2,6 +2,8 @@ Standalone Docker image for running [ralphex](https://github.com/umputun/ralphex) via its docker-wrapper script. Bundles the full frontend development toolchain needed for ralphex-powered projects. +> **Note:** This is not a devcontainer in the VS Code Dev Container spec sense (no `devcontainer.json`). It is a standalone Docker image used as a development environment for ralphex projects. + This is a standalone image, not a devcontainer. ## Tools @@ -23,7 +25,7 @@ This is a standalone image, not a devcontainer. ### Via ralphex docker-wrapper ```bash -export RALPHEX_IMAGE=ghcr.io/gatezh/ralphex-fe:latest +export RALPHEX_IMAGE=ghcr.io/gatezh/devcontainers/ralphex-fe:latest ralphex docs/plans/feature.md ``` @@ -34,7 +36,7 @@ docker run --rm \ -e APP_UID=$(id -u) \ -v ~/.claude:/mnt/claude:ro \ -v $(pwd):/workspace \ - ghcr.io/gatezh/ralphex-fe:latest + ghcr.io/gatezh/devcontainers/ralphex-fe:latest ``` ## Building Locally From d05ceff3edcc1d00a6822d16f1a8ecb19a6e3ddb Mon Sep 17 00:00:00 2001 From: Serge Gatezh <2880401+gatezh@users.noreply.github.com> Date: Tue, 31 Mar 2026 21:17:19 -0600 Subject: [PATCH 09/12] docs: update .claude/ config for new naming conventions --- .claude/CLAUDE.md | 11 +++++++---- .claude/rules/dockerfile.md | 4 ++-- .claude/rules/new-image.md | 14 +++++++------- .claude/rules/workflows.md | 8 ++++---- 4 files changed, 20 insertions(+), 17 deletions(-) diff --git a/.claude/CLAUDE.md b/.claude/CLAUDE.md index 612f5b0..1b81825 100644 --- a/.claude/CLAUDE.md +++ b/.claude/CLAUDE.md @@ -1,6 +1,6 @@ # Project Overview -Dockerfiles for custom devcontainer images on GitHub Container Registry (ghcr.io). Each image provides a VS Code Dev Container for a specific development environment. +Dockerfiles for custom devcontainer images on GitHub Container Registry (ghcr.io). Each image provides a development container for a specific environment. Published under `ghcr.io/gatezh/devcontainers/`. ## Platform Constraints @@ -12,9 +12,12 @@ Dockerfiles for custom devcontainer images on GitHub Container Registry (ghcr.io ## Naming Conventions -### Image names -- Devcontainer: `devcontainer-{tool}` or `devcontainer-{tool}-{secondary}` -- Standalone: `{base}-{variant}` (e.g., `ralphex-fe`) +### Directory names +- Named after the primary tool(s): `{tool}` or `{tool}-{secondary}` (e.g., `bun`, `hugo-bun`, `claude-code`) +- No `devcontainer-` prefix — the repo name `devcontainers` provides that context + +### Image paths +- All images: `ghcr.io/gatezh/devcontainers/{directory-name}` (e.g., `ghcr.io/gatezh/devcontainers/bun`) ### Version ARGs in Dockerfile - Place at top of file: `ARG {TOOL}_VERSION={version}` diff --git a/.claude/rules/dockerfile.md b/.claude/rules/dockerfile.md index 8fe6277..c8c92c7 100644 --- a/.claude/rules/dockerfile.md +++ b/.claude/rules/dockerfile.md @@ -10,11 +10,11 @@ paths: All Dockerfiles must end with a single combined `LABEL` instruction: ```dockerfile -LABEL org.opencontainers.image.source="https://github.com/{owner}/devcontainer-images" \ +LABEL org.opencontainers.image.source="https://github.com/{owner}/devcontainers" \ org.opencontainers.image.description="{Brief description}" \ org.opencontainers.image.licenses="MIT" \ org.opencontainers.image.title="{image-name}" \ - org.opencontainers.image.url="https://github.com/{owner}/devcontainer-images" + org.opencontainers.image.url="https://github.com/{owner}/devcontainers" ``` ## Base Images diff --git a/.claude/rules/new-image.md b/.claude/rules/new-image.md index e4d1a94..fc8a032 100644 --- a/.claude/rules/new-image.md +++ b/.claude/rules/new-image.md @@ -2,15 +2,15 @@ ## Devcontainer Image -1. Create `devcontainer-{name}/.devcontainer/Dockerfile` -2. Create `devcontainer-{name}/.devcontainer/devcontainer.json` -3. Create `devcontainer-{name}/README.md` -4. Create `.github/workflows/build-devcontainer-{name}.yml` +1. Create `{name}/.devcontainer/Dockerfile` +2. Create `{name}/.devcontainer/devcontainer.json` +3. Create `{name}/README.md` +4. Create `.github/workflows/build-{name}.yml` 5. Update root `README.md` with new image entry ## Standalone Docker Image -1. Create `{image-name}/Dockerfile` (no `.devcontainer/` subdirectory) -2. Create `{image-name}/README.md` -3. Create `.github/workflows/build-{image-name}.yml` +1. Create `{name}/Dockerfile` (no `.devcontainer/` subdirectory) +2. Create `{name}/README.md` +3. Create `.github/workflows/build-{name}.yml` 4. Update root `README.md` with new image entry diff --git a/.claude/rules/workflows.md b/.claude/rules/workflows.md index eb423d3..ad6759f 100644 --- a/.claude/rules/workflows.md +++ b/.claude/rules/workflows.md @@ -31,8 +31,8 @@ on: push: branches: [master] paths: - - '{image-name}/.devcontainer/Dockerfile' - - '{image-name}/.devcontainer/*.sh' + - '{name}/.devcontainer/Dockerfile' + - '{name}/.devcontainer/*.sh' workflow_dispatch: ``` @@ -43,8 +43,8 @@ on: push: branches: [master] paths: - - '{image-name}/Dockerfile' - - '{image-name}/files/**' + - '{name}/Dockerfile' + - '{name}/files/**' workflow_dispatch: ``` From e26977eb7b95da5d3d9096bfc990d868d25ee422 Mon Sep 17 00:00:00 2001 From: Serge Gatezh <2880401+gatezh@users.noreply.github.com> Date: Tue, 31 Mar 2026 21:28:41 -0600 Subject: [PATCH 10/12] feat: add hadolint and actionlint to repo devcontainer Enables running the same CI linters locally: - hadolint: Dockerfile linting - actionlint: GitHub Actions workflow linting Both use parallel download stages (zero additional build time). --- .devcontainer/Dockerfile | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index b67b75b..fab0315 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -32,6 +32,28 @@ RUN set -eux; \ "https://github.com/rtk-ai/rtk/releases/download/v${RTK_VERSION}/rtk-${RTK_TARGET}.tar.gz"; \ tar -xzf /tmp/rtk.tar.gz -C /usr/local/bin rtk +# ── hadolint (Dockerfile linter) ──────────────────────────────────────── +FROM alpine:3.21 AS hadolint-download +RUN apk add --no-cache curl jq +RUN set -eux; \ + ARCH="$(uname -m)"; \ + HADOLINT_VERSION=$(curl -fsSL https://api.github.com/repos/hadolint/hadolint/releases/latest \ + | jq -r '.tag_name'); \ + curl -fsSL -o /usr/local/bin/hadolint \ + "https://github.com/hadolint/hadolint/releases/download/${HADOLINT_VERSION}/hadolint-Linux-${ARCH}"; \ + chmod +x /usr/local/bin/hadolint + +# ── actionlint (GitHub Actions workflow linter) ──────────────────────── +FROM alpine:3.21 AS actionlint-download +RUN apk add --no-cache curl jq +RUN set -eux; \ + ARCH="$(uname -m | sed 's/x86_64/amd64/;s/aarch64/arm64/')"; \ + ACTIONLINT_VERSION=$(curl -fsSL https://api.github.com/repos/rhysd/actionlint/releases/latest \ + | jq -r '.tag_name' | sed 's/^v//'); \ + curl -fsSL -o /tmp/actionlint.tar.gz \ + "https://github.com/rhysd/actionlint/releases/download/v${ACTIONLINT_VERSION}/actionlint_${ACTIONLINT_VERSION}_linux_${ARCH}.tar.gz"; \ + tar -xzf /tmp/actionlint.tar.gz -C /usr/local/bin actionlint + # ── ralphex (autonomous plan execution) ────────────────────────────────── FROM alpine:3.21 AS ralphex-download RUN apk add --no-cache curl jq @@ -117,6 +139,12 @@ RUN mkdir -p /home/node/.config/fish \ COPY --from=rtk-download /usr/local/bin/rtk /usr/local/bin/rtk COPY --from=ralphex-download /usr/local/bin/ralphex /usr/local/bin/ralphex +# ── CI linting tools ──────────────────────────────────────────────────────── +# hadolint (Dockerfile linter) and actionlint (GitHub Actions workflow linter). +# Enables running the same checks locally that CI runs on PRs. +COPY --from=hadolint-download /usr/local/bin/hadolint /usr/local/bin/hadolint +COPY --from=actionlint-download /usr/local/bin/actionlint /usr/local/bin/actionlint + # ── Claude Code CLI ────────────────────────────────────────────────────────── # npm install (not native installer) to avoid rate-limiting in parallel builds. # See: claude-code/.devcontainer/Dockerfile for rationale. From f24305b09560f06afbe67645b319da49424e2084 Mon Sep 17 00:00:00 2001 From: Serge Gatezh <2880401+gatezh@users.noreply.github.com> Date: Tue, 31 Mar 2026 21:39:59 -0600 Subject: [PATCH 11/12] docs: add missing hugo-bun-node to root README --- README.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/README.md b/README.md index 2466c75..2614a34 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,7 @@ This repository contains Dockerfiles for custom Docker images hosted on GitHub C - **[bun](./bun/README.md)** - Bun development container - **[claude-bun](./claude-bun/README.md)** - Claude Code development container with firewall sandbox - **[hugo-bun](./hugo-bun/README.md)** - Hugo Extended + Bun development container +- **[hugo-bun-node](./hugo-bun-node/README.md)** - Hugo Extended + Bun + Node.js development container (Cloudflare Workers) ### Standalone Docker Images @@ -96,6 +97,18 @@ Hugo development container with Bun runtime. } ``` +### hugo-bun-node + +Hugo development container with Bun runtime and Node.js LTS for Cloudflare Workers support. + +**Usage in other projects:** + +```json +{ + "image": "ghcr.io//devcontainers/hugo-bun-node:latest" +} +``` + ### ralphex-fe Standalone Docker image based on ralphex with Bun 1.3.9, Hugo Extended 0.155.3, and Chromium for modern JavaScript/TypeScript development, static site generation, and end-to-end testing. From 05f00deb44832e35cd934bd6e58fc2d2c68f1fe2 Mon Sep 17 00:00:00 2001 From: Serge Gatezh <2880401+gatezh@users.noreply.github.com> Date: Tue, 31 Mar 2026 21:48:18 -0600 Subject: [PATCH 12/12] chore: move completed plans to completed/ directory --- .../2026-03-23-ralphex-fe-debian-rebuild.md | 0 .../2026-03-31-repo-naming-unification.md | 132 +++++++++--------- 2 files changed, 66 insertions(+), 66 deletions(-) rename docs/superpowers/plans/{ => completed}/2026-03-23-ralphex-fe-debian-rebuild.md (100%) rename docs/superpowers/plans/{ => completed}/2026-03-31-repo-naming-unification.md (93%) diff --git a/docs/superpowers/plans/2026-03-23-ralphex-fe-debian-rebuild.md b/docs/superpowers/plans/completed/2026-03-23-ralphex-fe-debian-rebuild.md similarity index 100% rename from docs/superpowers/plans/2026-03-23-ralphex-fe-debian-rebuild.md rename to docs/superpowers/plans/completed/2026-03-23-ralphex-fe-debian-rebuild.md diff --git a/docs/superpowers/plans/2026-03-31-repo-naming-unification.md b/docs/superpowers/plans/completed/2026-03-31-repo-naming-unification.md similarity index 93% rename from docs/superpowers/plans/2026-03-31-repo-naming-unification.md rename to docs/superpowers/plans/completed/2026-03-31-repo-naming-unification.md index 3b9ba3e..88cbefb 100644 --- a/docs/superpowers/plans/2026-03-31-repo-naming-unification.md +++ b/docs/superpowers/plans/completed/2026-03-31-repo-naming-unification.md @@ -1,6 +1,6 @@ # Repository Naming Unification Plan -> **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. +> **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 (`- [x]`) syntax for tracking. **Goal:** Rename the repository from `devcontainer-images` to `devcontainers`, drop the `devcontainer-` prefix from image directories, and unify all image paths under `ghcr.io/gatezh/devcontainers/{name}`. @@ -70,7 +70,7 @@ - Rename: `devcontainer-hugo-bun/` → `hugo-bun/` - Rename: `devcontainer-hugo-bun-node/` → `hugo-bun-node/` -- [ ] **Step 1: Rename directories with git mv** +- [x] **Step 1: Rename directories with git mv** ```bash git mv devcontainer-bun bun @@ -79,12 +79,12 @@ git mv devcontainer-hugo-bun hugo-bun git mv devcontainer-hugo-bun-node hugo-bun-node ``` -- [ ] **Step 2: Verify renames** +- [x] **Step 2: Verify renames** Run: `ls -d bun claude-bun hugo-bun hugo-bun-node` Expected: all four directories listed -- [ ] **Step 3: Commit** +- [x] **Step 3: Commit** ```bash git add -A @@ -101,7 +101,7 @@ git commit -m "refactor: rename image directories to drop devcontainer- prefix" - Rename: `.github/workflows/build-devcontainer-hugo-bun.yml` → `.github/workflows/build-hugo-bun.yml` - Rename: `.github/workflows/build-devcontainer-hugo-bun-node.yml` → `.github/workflows/build-hugo-bun-node.yml` -- [ ] **Step 1: Rename workflow files with git mv** +- [x] **Step 1: Rename workflow files with git mv** ```bash git mv .github/workflows/build-devcontainer-bun.yml .github/workflows/build-bun.yml @@ -110,7 +110,7 @@ git mv .github/workflows/build-devcontainer-hugo-bun.yml .github/workflows/build git mv .github/workflows/build-devcontainer-hugo-bun-node.yml .github/workflows/build-hugo-bun-node.yml ``` -- [ ] **Step 2: Verify renames** +- [x] **Step 2: Verify renames** Run: `ls .github/workflows/build-*.yml` Expected: @@ -123,7 +123,7 @@ Expected: .github/workflows/build-ralphex-fe.yml ``` -- [ ] **Step 3: Commit** +- [x] **Step 3: Commit** ```bash git add -A @@ -139,7 +139,7 @@ The reusable workflow constructs `ghcr.io/{namespace}/{image-name}`. Since calle **Files:** - Modify: `.github/workflows/reusable-docker-build.yml` -- [ ] **Step 1: Update the image-name input description** +- [x] **Step 1: Update the image-name input description** In `.github/workflows/reusable-docker-build.yml`, change line 7: @@ -153,7 +153,7 @@ In `.github/workflows/reusable-docker-build.yml`, change line 7: description: 'Image name including namespace (e.g. devcontainers/bun)' ``` -- [ ] **Step 2: Commit** +- [x] **Step 2: Commit** ```bash git add .github/workflows/reusable-docker-build.yml @@ -167,7 +167,7 @@ git commit -m "refactor: update reusable workflow description for new naming" **Files:** - Modify: `.github/workflows/build-bun.yml` -- [ ] **Step 1: Update workflow content** +- [x] **Step 1: Update workflow content** Replace the entire content of `.github/workflows/build-bun.yml` with: @@ -218,7 +218,7 @@ jobs: secrets: inherit ``` -- [ ] **Step 2: Commit** +- [x] **Step 2: Commit** ```bash git add .github/workflows/build-bun.yml @@ -232,7 +232,7 @@ git commit -m "refactor: update build-bun workflow for new paths and naming" **Files:** - Modify: `.github/workflows/build-claude-bun.yml` -- [ ] **Step 1: Update workflow content** +- [x] **Step 1: Update workflow content** Replace the entire content of `.github/workflows/build-claude-bun.yml` with: @@ -284,7 +284,7 @@ jobs: secrets: inherit ``` -- [ ] **Step 2: Commit** +- [x] **Step 2: Commit** ```bash git add .github/workflows/build-claude-bun.yml @@ -298,7 +298,7 @@ git commit -m "refactor: update build-claude-bun workflow for new paths and nami **Files:** - Modify: `.github/workflows/build-hugo-bun.yml` -- [ ] **Step 1: Update workflow content** +- [x] **Step 1: Update workflow content** Replace the entire content of `.github/workflows/build-hugo-bun.yml` with: @@ -350,7 +350,7 @@ jobs: secrets: inherit ``` -- [ ] **Step 2: Commit** +- [x] **Step 2: Commit** ```bash git add .github/workflows/build-hugo-bun.yml @@ -364,7 +364,7 @@ git commit -m "refactor: update build-hugo-bun workflow for new paths and naming **Files:** - Modify: `.github/workflows/build-hugo-bun-node.yml` -- [ ] **Step 1: Update workflow content** +- [x] **Step 1: Update workflow content** Replace the entire content of `.github/workflows/build-hugo-bun-node.yml` with: @@ -417,7 +417,7 @@ jobs: secrets: inherit ``` -- [ ] **Step 2: Commit** +- [x] **Step 2: Commit** ```bash git add .github/workflows/build-hugo-bun-node.yml @@ -431,7 +431,7 @@ git commit -m "refactor: update build-hugo-bun-node workflow for new paths and n **Files:** - Modify: `.github/workflows/build-claude-code.yml` -- [ ] **Step 1: Update all references** +- [x] **Step 1: Update all references** In `.github/workflows/build-claude-code.yml`, make these replacements: @@ -443,7 +443,7 @@ In `.github/workflows/build-claude-code.yml`, make these replacements: All occurrences: replace `devcontainer-images` with `devcontainers` in the image paths. -- [ ] **Step 2: Verify the changes** +- [x] **Step 2: Verify the changes** Run: `grep 'devcontainer-images' .github/workflows/build-claude-code.yml` Expected: no output (all replaced) @@ -451,7 +451,7 @@ Expected: no output (all replaced) Run: `grep 'devcontainers/' .github/workflows/build-claude-code.yml` Expected: 4 lines with `ghcr.io/gatezh/devcontainers/claude-code` references -- [ ] **Step 3: Commit** +- [x] **Step 3: Commit** ```bash git add .github/workflows/build-claude-code.yml @@ -465,7 +465,7 @@ git commit -m "refactor: update build-claude-code workflow image paths" **Files:** - Modify: `.github/workflows/build-ralphex-fe.yml` -- [ ] **Step 1: Update image references** +- [x] **Step 1: Update image references** In `.github/workflows/build-ralphex-fe.yml`, make these replacements: @@ -473,7 +473,7 @@ In `.github/workflows/build-ralphex-fe.yml`, make these replacements: 2. Line 95: `docker pull ghcr.io/gatezh/ralphex-fe:latest` → `docker pull ghcr.io/gatezh/devcontainers/ralphex-fe:latest` 3. Line 96: `docker run --rm --entrypoint sh ghcr.io/gatezh/ralphex-fe:latest` → `docker run --rm --entrypoint sh ghcr.io/gatezh/devcontainers/ralphex-fe:latest` -- [ ] **Step 2: Commit** +- [x] **Step 2: Commit** ```bash git add .github/workflows/build-ralphex-fe.yml @@ -487,7 +487,7 @@ git commit -m "refactor: update build-ralphex-fe workflow to devcontainers names **Files:** - Modify: `.github/workflows/update-and-build-ralphex-fe.yml` -- [ ] **Step 1: Update image-name in the reusable workflow call** +- [x] **Step 1: Update image-name in the reusable workflow call** In `.github/workflows/update-and-build-ralphex-fe.yml`, line 152: @@ -499,7 +499,7 @@ In `.github/workflows/update-and-build-ralphex-fe.yml`, line 152: image-name: devcontainers/ralphex-fe ``` -- [ ] **Step 2: Commit** +- [x] **Step 2: Commit** ```bash git add .github/workflows/update-and-build-ralphex-fe.yml @@ -513,7 +513,7 @@ git commit -m "refactor: update update-and-build-ralphex-fe image name" **Files:** - Modify: `.github/workflows/ci.yml` -- [ ] **Step 1: Update hadolint matrix paths** +- [x] **Step 1: Update hadolint matrix paths** In `.github/workflows/ci.yml`, replace the hadolint matrix (lines 24-29): @@ -535,7 +535,7 @@ In `.github/workflows/ci.yml`, replace the hadolint matrix (lines 24-29): - ralphex-fe/Dockerfile ``` -- [ ] **Step 2: Update path filters** +- [x] **Step 2: Update path filters** In `.github/workflows/ci.yml`, replace the path filter section (lines 66-75): @@ -565,7 +565,7 @@ In `.github/workflows/ci.yml`, replace the path filter section (lines 66-75): - 'ralphex-fe/**' ``` -- [ ] **Step 3: Update environment variable names and add_image calls** +- [x] **Step 3: Update environment variable names and add_image calls** In `.github/workflows/ci.yml`, replace the set-matrix step's env block and conditionals (lines 80-131): @@ -637,12 +637,12 @@ In `.github/workflows/ci.yml`, replace the set-matrix step's env block and condi fi ``` -- [ ] **Step 4: Verify no old references remain** +- [x] **Step 4: Verify no old references remain** Run: `grep 'devcontainer-bun\|devcontainer-claude-bun\|devcontainer-hugo-bun' .github/workflows/ci.yml` Expected: no output -- [ ] **Step 5: Commit** +- [x] **Step 5: Commit** ```bash git add .github/workflows/ci.yml @@ -664,7 +664,7 @@ All Dockerfiles need `org.opencontainers.image.source` and `org.opencontainers.i - Modify: `ralphex-fe/Dockerfile` (lines 177-181) - Modify: `.devcontainer/Dockerfile` (lines 139-143, 168-172) -- [ ] **Step 1: Update bun/.devcontainer/Dockerfile** +- [x] **Step 1: Update bun/.devcontainer/Dockerfile** Replace the OCI labels (lines 15-19): @@ -684,7 +684,7 @@ LABEL org.opencontainers.image.title="bun" LABEL org.opencontainers.image.url="https://github.com/gatezh/devcontainers" ``` -- [ ] **Step 2: Update claude-bun/.devcontainer/Dockerfile** +- [x] **Step 2: Update claude-bun/.devcontainer/Dockerfile** Replace the OCI labels (lines 92-96): @@ -704,7 +704,7 @@ LABEL org.opencontainers.image.source="https://github.com/gatezh/devcontainers" org.opencontainers.image.url="https://github.com/gatezh/devcontainers" ``` -- [ ] **Step 3: Update hugo-bun/.devcontainer/Dockerfile** +- [x] **Step 3: Update hugo-bun/.devcontainer/Dockerfile** Replace the OCI labels (lines 33-37): @@ -724,7 +724,7 @@ LABEL org.opencontainers.image.title="hugo-bun" LABEL org.opencontainers.image.url="https://github.com/gatezh/devcontainers" ``` -- [ ] **Step 4: Update hugo-bun-node/.devcontainer/Dockerfile** +- [x] **Step 4: Update hugo-bun-node/.devcontainer/Dockerfile** Replace the OCI labels (lines 49-53): @@ -744,7 +744,7 @@ LABEL org.opencontainers.image.title="hugo-bun-node" LABEL org.opencontainers.image.url="https://github.com/gatezh/devcontainers" ``` -- [ ] **Step 5: Update claude-code/.devcontainer/Dockerfile (default target)** +- [x] **Step 5: Update claude-code/.devcontainer/Dockerfile (default target)** Replace the OCI labels at lines 198-202: @@ -764,7 +764,7 @@ LABEL org.opencontainers.image.source="https://github.com/gatezh/devcontainers" org.opencontainers.image.url="https://github.com/gatezh/devcontainers" ``` -- [ ] **Step 6: Update claude-code/.devcontainer/Dockerfile (sandbox target)** +- [x] **Step 6: Update claude-code/.devcontainer/Dockerfile (sandbox target)** Replace the OCI labels at lines 230-234: @@ -784,7 +784,7 @@ LABEL org.opencontainers.image.source="https://github.com/gatezh/devcontainers" org.opencontainers.image.url="https://github.com/gatezh/devcontainers" ``` -- [ ] **Step 7: Update ralphex-fe/Dockerfile** +- [x] **Step 7: Update ralphex-fe/Dockerfile** Replace the OCI labels at lines 177-181: @@ -804,7 +804,7 @@ LABEL org.opencontainers.image.source="https://github.com/gatezh/devcontainers" org.opencontainers.image.url="https://github.com/gatezh/devcontainers" ``` -- [ ] **Step 8: Update .devcontainer/Dockerfile (repo's own devcontainer)** +- [x] **Step 8: Update .devcontainer/Dockerfile (repo's own devcontainer)** Replace `devcontainer-images` with `devcontainers` in all references. This file has: - Line 2 comment: `devcontainer-images repo` → `devcontainers repo` @@ -814,7 +814,7 @@ Replace `devcontainer-images` with `devcontainers` in all references. This file Replace all occurrences of `devcontainer-images` with `devcontainers` in this file. -- [ ] **Step 9: Verify no old references remain in Dockerfiles** +- [x] **Step 9: Verify no old references remain in Dockerfiles** Run: `grep -r 'devcontainer-images' bun/ claude-bun/ hugo-bun/ hugo-bun-node/ claude-code/ ralphex-fe/ .devcontainer/Dockerfile` Expected: no output @@ -822,7 +822,7 @@ Expected: no output Run: `grep -r 'title="devcontainer-' bun/ claude-bun/ hugo-bun/ hugo-bun-node/` Expected: no output -- [ ] **Step 10: Commit** +- [x] **Step 10: Commit** ```bash git add bun/.devcontainer/Dockerfile claude-bun/.devcontainer/Dockerfile hugo-bun/.devcontainer/Dockerfile hugo-bun-node/.devcontainer/Dockerfile claude-code/.devcontainer/Dockerfile ralphex-fe/Dockerfile .devcontainer/Dockerfile @@ -837,7 +837,7 @@ git commit -m "refactor: update OCI labels in all Dockerfiles for new repo name" - Modify: `claude-code/.devcontainer/docker-compose.yml` - Modify: `claude-code/.devcontainer/claude-sandbox/docker-compose.yml` -- [ ] **Step 1: Update default docker-compose.yml** +- [x] **Step 1: Update default docker-compose.yml** In `claude-code/.devcontainer/docker-compose.yml`, line 5: @@ -849,7 +849,7 @@ In `claude-code/.devcontainer/docker-compose.yml`, line 5: image: ghcr.io/gatezh/devcontainers/claude-code:latest ``` -- [ ] **Step 2: Update sandbox docker-compose.yml** +- [x] **Step 2: Update sandbox docker-compose.yml** In `claude-code/.devcontainer/claude-sandbox/docker-compose.yml`, line 5: @@ -861,7 +861,7 @@ In `claude-code/.devcontainer/claude-sandbox/docker-compose.yml`, line 5: image: ghcr.io/gatezh/devcontainers/claude-code-sandbox:latest ``` -- [ ] **Step 3: Commit** +- [x] **Step 3: Commit** ```bash git add claude-code/.devcontainer/docker-compose.yml claude-code/.devcontainer/claude-sandbox/docker-compose.yml @@ -877,7 +877,7 @@ git commit -m "refactor: update docker-compose image references" - Modify: `.devcontainer/claude-sandbox/devcontainer.json` (volume name prefixes) - Modify: `.devcontainer/init-plugins.sh` (comment) -- [ ] **Step 1: Update .devcontainer/devcontainer.json volume names** +- [x] **Step 1: Update .devcontainer/devcontainer.json volume names** Replace `devcontainer-images` with `devcontainers` in volume source names: @@ -893,7 +893,7 @@ Replace `devcontainer-images` with `devcontainers` in volume source names: "source=devcontainers-fish-data-${devcontainerId},target=/home/node/.local/share/fish,type=volume" ``` -- [ ] **Step 2: Update .devcontainer/claude-sandbox/devcontainer.json volume names** +- [x] **Step 2: Update .devcontainer/claude-sandbox/devcontainer.json volume names** Replace `devcontainer-images` with `devcontainers` in volume source names: @@ -907,7 +907,7 @@ Replace `devcontainer-images` with `devcontainers` in volume source names: "source=devcontainers-sandbox-fish-${devcontainerId},target=/home/node/.local/share/fish,type=volume", ``` -- [ ] **Step 3: Update .devcontainer/init-plugins.sh comment** +- [x] **Step 3: Update .devcontainer/init-plugins.sh comment** ```bash # Old: @@ -917,7 +917,7 @@ Replace `devcontainer-images` with `devcontainers` in volume source names: # Initialize Claude Code plugins for the devcontainers repo ``` -- [ ] **Step 4: Commit** +- [x] **Step 4: Commit** ```bash git add .devcontainer/devcontainer.json .devcontainer/claude-sandbox/devcontainer.json .devcontainer/init-plugins.sh @@ -937,7 +937,7 @@ git commit -m "refactor: update repo devcontainer config for new repo name" - Modify: `claude-code/README.md` - Modify: `ralphex-fe/README.md` -- [ ] **Step 1: Update root README.md** +- [x] **Step 1: Update root README.md** Replace all occurrences using these rules: - `devcontainer-images` (repo name) → `devcontainers` @@ -958,7 +958,7 @@ Replace all occurrences using these rules: - Adding new image instructions: `devcontainer-myimage/` → `myimage/` - `build-devcontainer-{name}.yml` → `build-{name}.yml` (in "Adding a New Image") -- [ ] **Step 2: Update bun/README.md** +- [x] **Step 2: Update bun/README.md** Replace all occurrences: - `# devcontainer-bun` → `# bun` @@ -966,14 +966,14 @@ Replace all occurrences: - `ghcr.io/myusername/devcontainer-bun:` → `ghcr.io/myusername/devcontainers/bun:` - `devcontainer-images repository` → `devcontainers repository` (in License section) -- [ ] **Step 3: Update claude-bun/README.md** +- [x] **Step 3: Update claude-bun/README.md** Replace all occurrences: - `# devcontainer-claude-bun` → `# claude-bun` - `ghcr.io/gatezh/devcontainer-claude-bun:` → `ghcr.io/gatezh/devcontainers/claude-bun:` - `devcontainer-images repository` → `devcontainers repository` (if present) -- [ ] **Step 4: Update hugo-bun/README.md** +- [x] **Step 4: Update hugo-bun/README.md** Replace all occurrences: - `# devcontainer-hugo-bun` → `# hugo-bun` @@ -981,7 +981,7 @@ Replace all occurrences: - `ghcr.io/myusername/devcontainer-hugo-bun:` → `ghcr.io/myusername/devcontainers/hugo-bun:` - `devcontainer-images repository` → `devcontainers repository` -- [ ] **Step 5: Update hugo-bun-node/README.md** +- [x] **Step 5: Update hugo-bun-node/README.md** Replace all occurrences: - `# devcontainer-hugo-bun-node` → `# hugo-bun-node` @@ -989,7 +989,7 @@ Replace all occurrences: - `ghcr.io/myusername/devcontainer-hugo-bun-node:` → `ghcr.io/myusername/devcontainers/hugo-bun-node:` - `devcontainer-images repository` → `devcontainers repository` -- [ ] **Step 6: Update claude-code/README.md** +- [x] **Step 6: Update claude-code/README.md** Replace all occurrences: - `ghcr.io/gatezh/devcontainer-images/claude-code` → `ghcr.io/gatezh/devcontainers/claude-code` @@ -998,7 +998,7 @@ Replace all occurrences: - `git clone https://github.com/gatezh/devcontainer-images.git` → `git clone https://github.com/gatezh/devcontainers.git` - `cd devcontainer-images/claude-code` → `cd devcontainers/claude-code` -- [ ] **Step 7: Update ralphex-fe/README.md** +- [x] **Step 7: Update ralphex-fe/README.md** Replace: - `ghcr.io/gatezh/ralphex-fe:` → `ghcr.io/gatezh/devcontainers/ralphex-fe:` @@ -1009,7 +1009,7 @@ Add a note near the top (after the first paragraph): > **Note:** This is not a devcontainer in the VS Code Dev Container spec sense (no `devcontainer.json`). It is a standalone Docker image used as a development environment for ralphex projects. ``` -- [ ] **Step 8: Verify no old references remain** +- [x] **Step 8: Verify no old references remain** Run: `grep -r 'devcontainer-images' README.md bun/README.md claude-bun/README.md hugo-bun/README.md hugo-bun-node/README.md claude-code/README.md ralphex-fe/README.md` Expected: no output (except possibly the old plan file in docs/) @@ -1017,7 +1017,7 @@ Expected: no output (except possibly the old plan file in docs/) Run: `grep -r 'ghcr.io/gatezh/devcontainer-bun\|ghcr.io/gatezh/devcontainer-claude-bun\|ghcr.io/gatezh/devcontainer-hugo-bun\|ghcr.io/gatezh/ralphex-fe' README.md bun/ claude-bun/ hugo-bun/ hugo-bun-node/ claude-code/ ralphex-fe/` Expected: no output -- [ ] **Step 9: Commit** +- [x] **Step 9: Commit** ```bash git add README.md bun/README.md claude-bun/README.md hugo-bun/README.md hugo-bun-node/README.md claude-code/README.md ralphex-fe/README.md @@ -1034,7 +1034,7 @@ git commit -m "docs: update all READMEs for new repo name and image paths" - Modify: `.claude/rules/new-image.md` - Modify: `.claude/rules/workflows.md` -- [ ] **Step 1: Update .claude/CLAUDE.md** +- [x] **Step 1: Update .claude/CLAUDE.md** Replace the naming conventions section: @@ -1066,7 +1066,7 @@ Dockerfiles for custom devcontainer images on GitHub Container Registry (ghcr.io Dockerfiles for custom devcontainer images on GitHub Container Registry (ghcr.io). Each image provides a development container for a specific environment. Published under `ghcr.io/gatezh/devcontainers/`. ``` -- [ ] **Step 2: Update .claude/rules/dockerfile.md** +- [x] **Step 2: Update .claude/rules/dockerfile.md** Replace the OCI label template: @@ -1086,7 +1086,7 @@ LABEL org.opencontainers.image.source="https://github.com/{owner}/devcontainers" org.opencontainers.image.url="https://github.com/{owner}/devcontainers" ``` -- [ ] **Step 3: Update .claude/rules/new-image.md** +- [x] **Step 3: Update .claude/rules/new-image.md** Replace entire content: @@ -1109,7 +1109,7 @@ Replace entire content: 4. Update root `README.md` with new image entry ``` -- [ ] **Step 4: Update .claude/rules/workflows.md** +- [x] **Step 4: Update .claude/rules/workflows.md** Update the trigger path patterns: @@ -1129,7 +1129,7 @@ Update the trigger path patterns: - '{name}/files/**' ``` -- [ ] **Step 5: Commit** +- [x] **Step 5: Commit** ```bash git add .claude/CLAUDE.md .claude/rules/dockerfile.md .claude/rules/new-image.md .claude/rules/workflows.md @@ -1140,7 +1140,7 @@ git commit -m "docs: update .claude/ config for new naming conventions" ### Task 17: Lint verification -- [ ] **Step 1: Run hadolint on all Dockerfiles** +- [x] **Step 1: Run hadolint on all Dockerfiles** ```bash hadolint bun/.devcontainer/Dockerfile @@ -1154,7 +1154,7 @@ hadolint .devcontainer/Dockerfile Expected: all pass (OCI labels don't affect lint) -- [ ] **Step 2: Run actionlint on workflows** +- [x] **Step 2: Run actionlint on workflows** ```bash actionlint .github/workflows/build-bun.yml @@ -1170,7 +1170,7 @@ actionlint .github/workflows/reusable-docker-build.yml Expected: all pass -- [ ] **Step 3: Final grep for any missed old references** +- [x] **Step 3: Final grep for any missed old references** ```bash grep -r 'devcontainer-images' --include='*.yml' --include='*.yaml' --include='*.md' --include='*.json' --include='*.jsonc' --include='Dockerfile' --include='*.sh' . | grep -v 'docs/superpowers/plans/' | grep -v '.git/' @@ -1190,18 +1190,18 @@ Expected: no output This task is done by the user via the GitHub UI, NOT via code. -- [ ] **Step 1: Rename repository on GitHub** +- [x] **Step 1: Rename repository on GitHub** Go to `https://github.com/gatezh/devcontainer-images/settings` → Repository name → change to `devcontainers` → click "Rename". GitHub will automatically set up a redirect from the old URL. All existing git remotes using the old URL will continue to work, but should be updated. -- [ ] **Step 2: Update local git remote** +- [x] **Step 2: Update local git remote** ```bash git remote set-url github git@github.com:gatezh/devcontainers.git ``` -- [ ] **Step 3: Delete old GHCR packages (optional)** +- [x] **Step 3: Delete old GHCR packages (optional)** Old packages at `ghcr.io/gatezh/devcontainer-bun`, `ghcr.io/gatezh/devcontainer-claude-bun`, etc. can be deleted from the GitHub Packages settings page once all consumers have migrated to the new paths.