diff --git a/.claude/skills/cleanup-tags/API.md b/.claude/skills/cleanup-tags/API.md new file mode 100644 index 0000000..db37120 --- /dev/null +++ b/.claude/skills/cleanup-tags/API.md @@ -0,0 +1,31 @@ +# Docker Hub API Reference + +## Repository + +- **Owner:** stellars +- **Repository:** stellars-jupyterlab-ds +- **Base URL:** `https://hub.docker.com/v2/repositories/stellars/stellars-jupyterlab-ds` + +## List Tags + +```bash +curl -s "https://hub.docker.com/v2/repositories/stellars/stellars-jupyterlab-ds/tags?page_size=100" \ + | jq -r '.results[].name' +``` + +## Delete Tag + +```bash +curl -s -o /dev/null -w "%{http_code}" -X DELETE \ + -H "Authorization: Bearer $TOKEN" \ + "https://hub.docker.com/v2/repositories/stellars/stellars-jupyterlab-ds/tags/{TAG}/" +``` + +## Response Codes + +| Code | Meaning | +|------|---------| +| 204 | Success - tag deleted | +| 401 | Unauthorized - token invalid | +| 404 | Tag not found | +| 403 | Forbidden - insufficient permissions | diff --git a/.claude/skills/cleanup-tags/AUTH.md b/.claude/skills/cleanup-tags/AUTH.md new file mode 100644 index 0000000..d2ef1e9 --- /dev/null +++ b/.claude/skills/cleanup-tags/AUTH.md @@ -0,0 +1,23 @@ +# Authentication + +## Docker Desktop Credential Helper + +Get username and PAT from Docker Desktop: + +```bash +CREDS=$(echo "https://index.docker.io/v1/" | docker-credential-desktop.exe get) +USERNAME=$(echo "$CREDS" | jq -r '.Username') +PASSWORD=$(echo "$CREDS" | jq -r '.Secret') +``` + +## JWT Token + +Exchange credentials for Docker Hub JWT token: + +```bash +TOKEN=$(curl -s -H "Content-Type: application/json" -X POST \ + -d "{\"username\": \"$USERNAME\", \"password\": \"$PASSWORD\"}" \ + https://hub.docker.com/v2/users/login/ | jq -r .token) +``` + +The token is used in the Authorization header for subsequent API calls. diff --git a/.claude/skills/cleanup-tags/SKILL.md b/.claude/skills/cleanup-tags/SKILL.md new file mode 100644 index 0000000..3e3c1c3 --- /dev/null +++ b/.claude/skills/cleanup-tags/SKILL.md @@ -0,0 +1,24 @@ +--- +description: Clean up Docker Hub tags for stellars-jupyterlab-ds +allowed-tools: Bash, AskUserQuestion +--- + +# Clean Up Docker Hub Tags + +Manage and remove old or unwanted tags from Docker Hub for the `stellars/stellars-jupyterlab-ds` repository. + +## Current Tags + +!`curl -s "https://hub.docker.com/v2/repositories/stellars/stellars-jupyterlab-ds/tags?page_size=100" | jq -r '.results[].name' | sort -V` + +## Workflow + +1. Show the user the current tags listed above +2. Ask which tags to delete using AskUserQuestion with options: + - Delete all tags below version X.Y (e.g., "Delete all 3.4.x and lower") + - Delete specific version range (e.g., "Delete 3.3.x only") + - Delete tags matching a pattern + - Custom selection +3. Authenticate using Docker credential helper (see AUTH.md) +4. Delete selected tags via Docker Hub API (see API.md) +5. Report results showing which tags were deleted successfully diff --git a/project.env b/project.env index a4c4fd6..ef831d5 100644 --- a/project.env +++ b/project.env @@ -3,7 +3,7 @@ PROJECT_NAME="stellars-jupyterhub-ds" PROJECT_DESCRIPTION="Multi-user JupyterHub 4 deployment platform with data science stack, GPU auto-detection, NativeAuthenticator, and isolated per-user environments spawned via DockerSpawner" # Version -VERSION="3.7.17_cuda-13.0.2_jh-5.4.2" +VERSION="3.7.10_cuda-13.0.2_jh-5.4.2" VERSION_COMMENT="Activity Monitor: admin page with 3-state status, activity scoring, reset functionality" RELEASE_TAG="RELEASE_3.2.11" RELEASE_DATE="2025-11-09"