Adds scripts/check_ci_images.sh: extracts every From("...") image reference from ci/main.go and runs skopeo inspect --no-creds on each one (manifest-only, no layer pull, no daemon required)
Adds task check-ci-images task in Taskfile.yml that runs the script
Adds ci-image-exists hook to .pre-commit-config.yaml that fires only when ci/main.go is staged (using files: ^ci/main\.go$ rather than always_run, to avoid a network round-trip on every unrelated commit)
Adds skopeo to the Nix devShell so the tool is on PATH when the hook runs via nix develop --command
This catches a bad image tag (like ghcr.io/cirruslabs/flutter:3.44.1 not yet published) at commit time, before the push reaches CI.
Test plan
Stage a change to ci/main.go bumping a From("...") tag to a non-existent version → hook rejects commit with NOT FOUND
Stage a change with valid image tags → hook prints OK for each image and allows the commit
Stage a change to any other file → ci-image-exists hook is skipped entirely
## Summary
- Adds `scripts/check_ci_images.sh`: extracts every `From("...")` image reference from `ci/main.go` and runs `skopeo inspect --no-creds` on each one (manifest-only, no layer pull, no daemon required)
- Adds `task check-ci-images` task in `Taskfile.yml` that runs the script
- Adds `ci-image-exists` hook to `.pre-commit-config.yaml` that fires only when `ci/main.go` is staged (using `files: ^ci/main\.go$` rather than `always_run`, to avoid a network round-trip on every unrelated commit)
- Adds `skopeo` to the Nix devShell so the tool is on PATH when the hook runs via `nix develop --command`
This catches a bad image tag (like `ghcr.io/cirruslabs/flutter:3.44.1` not yet published) at commit time, before the push reaches CI.
## Test plan
- Stage a change to `ci/main.go` bumping a `From("...")` tag to a non-existent version → hook rejects commit with NOT FOUND
- Stage a change with valid image tags → hook prints OK for each image and allows the commit
- Stage a change to any other file → `ci-image-exists` hook is skipped entirely
Closes #407
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Summary
scripts/check_ci_images.sh: extracts everyFrom("...")image reference fromci/main.goand runsskopeo inspect --no-credson each one (manifest-only, no layer pull, no daemon required)task check-ci-imagestask inTaskfile.ymlthat runs the scriptci-image-existshook to.pre-commit-config.yamlthat fires only whenci/main.gois staged (usingfiles: ^ci/main\.go$rather thanalways_run, to avoid a network round-trip on every unrelated commit)skopeoto the Nix devShell so the tool is on PATH when the hook runs vianix develop --commandThis catches a bad image tag (like
ghcr.io/cirruslabs/flutter:3.44.1not yet published) at commit time, before the push reaches CI.Test plan
ci/main.gobumping aFrom("...")tag to a non-existent version → hook rejects commit with NOT FOUNDci-image-existshook is skipped entirelyCloses #407