.agents/skills/container-images/SKILL.md
Extracts all container image references (registry, image, tag) from the microsoft/aspire source code and produces a JSON data file for the aspire.dev Astro site. USE FOR: update container images JSON, refresh container image data, list all aspire container images, sync container image versions, generate container-images.json. DO NOT USE FOR: updating the container image versions in aspire source code itself (that's a product repo change), NuGet package data (use the integrations skill), or Dockerfile-based images for dev containers. INVOKES: bash, file read/write. FOR SINGLE OPERATIONS: Use grep/find to quickly check a single image tag.
npx skillsauth add microsoft/aspire.dev container-imagesInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
This skill extracts every container image reference from the microsoft/aspire product repository and writes a structured JSON file to microsoft/aspire.dev at:
src/frontend/src/data/container-images.json
This JSON is consumed by Astro components on the aspire.dev site to render a browsable catalog of all container images used by .NET Aspire hosting integrations.
All container image metadata in microsoft/aspire lives in static classes named *ContainerImageTags (or *ContainerImageTags.cs). Each file follows a strict, consistent pattern:
internal static class <Name>ContainerImageTags
{
public const string Registry = "<registry-host>";
public const string Image = "<image-path>";
public const string Tag = "<tag>";
// Some files have additional companion images, e.g.:
public const string <Companion>Registry = "<registry-host>";
public const string <Companion>Image = "<image-path>";
public const string <Companion>Tag = "<tag>";
}
All files matching the glob pattern:
src/**/ContainerImageTags.cs
src/**/*ContainerImageTags.cs
These span across many projects including (but not limited to):
| Project | File |
|---|---|
| Aspire.Hosting.Redis | RedisContainerImageTags.cs |
| Aspire.Hosting.PostgreSQL | PostgresContainerImageTags.cs |
| Aspire.Hosting.SqlServer | SqlServerContainerImageTags.cs |
| Aspire.Hosting.MongoDB | MongoDBContainerImageTags.cs |
| Aspire.Hosting.MySql | MySqlContainerImageTags.cs |
| Aspire.Hosting.Kafka | KafkaContainerImageTags.cs |
| Aspire.Hosting.RabbitMQ | RabbitMQContainerImageTags.cs |
| Aspire.Hosting.Nats | NatsContainerImageTags.cs |
| Aspire.Hosting.Garnet | GarnetContainerImageTags.cs |
| Aspire.Hosting.Valkey | ValkeyContainerImageTags.cs |
| Aspire.Hosting.Seq | SeqContainerImageTags.cs |
| Aspire.Hosting.Qdrant | QdrantContainerImageTags.cs |
| Aspire.Hosting.Keycloak | KeycloakContainerImageTags.cs |
| Aspire.Hosting.Oracle | OracleContainerImageTags.cs |
| Aspire.Hosting.Milvus | MilvusContainerImageTags.cs |
| Aspire.Hosting.Elasticsearch | ElasticsearchContainerImageTags.cs |
| Aspire.Hosting.Yarp | YarpContainerImageTags.cs |
| Aspire.Hosting.Azure.Storage | StorageEmulatorContainerImageTags.cs |
| Aspire.Hosting.Azure.CosmosDB | CosmosDBEmulatorContainerImageTags.cs |
| Aspire.Hosting.Azure.ServiceBus | ServiceBusEmulatorContainerImageTags.cs |
| Aspire.Hosting.Azure.EventHubs | EventHubsEmulatorContainerImageTags.cs |
| Aspire.Hosting.Azure.SignalR | SignalREmulatorContainerImageTags.cs |
| Aspire.Hosting.Azure.AppConfiguration | AppConfigurationEmulatorContainerImageTags.cs |
| Aspire.Hosting.Azure.Functions | DurableTaskSchedulerEmulatorContainerImageTags.cs |
| Aspire.Hosting.Azure.Kusto | AzureKustoEmulatorContainerImageTags.cs |
Important: New hosting packages may be added at any time. Always discover files dynamically — never rely on a hardcoded list.
# If working locally:
git clone --depth 1 https://github.com/microsoft/aspire.git /tmp/aspire
find /tmp/aspire/src -name '*ContainerImageTags.cs' -type f
For each file, extract all image groups. A single file can define multiple images (primary + companions). The parsing rules are:
Registry, Image, Tag.PgAdminRegistry, PgAdminImage, PgAdminTag — group them by the shared prefix.TagVNextPreview, ManagementTag — include these as additional tag variants on the same image.public const string, but some (e.g. Kusto) use public static string { get; }. Handle both.public const string ManagementTag = $"{Tag}-management"; — resolve these to their literal value.aspirePackage from the project directory name (e.g. src/Aspire.Hosting.Redis/ → Aspire.Hosting.Redis).sourceFile as the path relative to the repo root.Each entry in the output array represents one distinct container image:
[
{
"aspirePackage": "Aspire.Hosting.Redis",
"name": "Redis",
"registry": "docker.io",
"image": "library/redis",
"tag": "8.6",
"fullImage": "docker.io/library/redis:8.6",
"sourceFile": "src/Aspire.Hosting.Redis/RedisContainerImageTags.cs",
"sourceUrl": "https://github.com/microsoft/aspire/blob/main/src/Aspire.Hosting.Redis/RedisContainerImageTags.cs",
"isCompanion": false,
"companionOf": null,
"alternateTags": []
},
{
"aspirePackage": "Aspire.Hosting.Redis",
"name": "Redis Commander",
"registry": "docker.io",
"image": "rediscommander/redis-commander",
"tag": "latest",
"fullImage": "docker.io/rediscommander/redis-commander:latest",
"sourceFile": "src/Aspire.Hosting.Redis/RedisContainerImageTags.cs",
"sourceUrl": "https://github.com/microsoft/aspire/blob/main/src/Aspire.Hosting.Redis/RedisContainerImageTags.cs",
"isCompanion": true,
"companionOf": "Redis",
"alternateTags": []
},
{
"aspirePackage": "Aspire.Hosting.Azure.CosmosDB",
"name": "CosmosDB Emulator",
"registry": "mcr.microsoft.com",
"image": "cosmosdb/linux/azure-cosmos-emulator",
"tag": "stable",
"fullImage": "mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:stable",
"sourceFile": "src/Aspire.Hosting.Azure.CosmosDB/CosmosDBEmulatorContainerImageTags.cs",
"sourceUrl": "https://github.com/microsoft/aspire/blob/main/src/Aspire.Hosting.Azure.CosmosDB/CosmosDBEmulatorContainerImageTags.cs",
"isCompanion": false,
"companionOf": null,
"alternateTags": ["vnext-preview"]
}
]
| Field | Type | Description |
|---|---|---|
| aspirePackage | string | The NuGet package / project name (directory name under src/) |
| name | string | Human-friendly name. For primary images, derive this from the class name (strip ContainerImageTags / EmulatorContainerImageTags suffix, split PascalCase). For companion images, derive this from the companion prefix/type (e.g. PgAdmin*, RedisCommander*) rather than only from the class name. |
| registry | string | Container registry host (e.g. docker.io, mcr.microsoft.com, ghcr.io, quay.io, container-registry.oracle.com) |
| image | string | Image path within the registry |
| tag | string | Primary tag |
| fullImage | string | Fully qualified image reference: {registry}/{image}:{tag} |
| sourceFile | string | Relative path to the source file in microsoft/aspire |
| sourceUrl | string | GitHub permalink to the source file on the main branch |
| isCompanion | boolean | true if this is a companion/tooling image (e.g. pgAdmin, Kafka UI, phpMyAdmin) |
| companionOf | string? | Name of the primary image this accompanies, or null |
| alternateTags | string[] | Any additional tag constants defined for this image (e.g. vnext-preview, management) |
Sort the array by aspirePackage (ascending), then by isCompanion (primary first), then by name (ascending).
Write to: src/frontend/src/data/container-images.json
After generating the file, verify:
*ContainerImageTags.cs file in src/ is representedregistry + image + tag + aspirePackage)fullImage values are well-formed (registry/image:tag)The JSON file at src/frontend/src/data/container-images.json can be imported directly in Astro components:
import containerImages from '../data/container-images.json';
This follows the same pattern as existing data files like aspire-integrations.json, samples.json, and github-stats.json in the same directory.
Each container image entry can be cross-referenced with:
src/frontend/src/data/integration-docs.json (match on aspirePackage)src/frontend/src/data/aspire-integrations.json (match on title ≈ aspirePackage)microsoft/aspire for contributorsconst and static property patterns — they both exist in the codebase.$"""{Tag}-management""").playground/ directory.src/ directory files matching *ContainerImageTags.cs.development
Maintainer-only workflow for handling GitHub Secret Scanning alerts on OpenClaw. Use when Codex needs to triage, redact, clean up, and resolve secret leakage found in issue comments, issue bodies, PR comments, or other GitHub content.
development
Maintainer workflow for OpenClaw releases, prereleases, changelog release notes, and publish validation. Use when Codex needs to prepare or verify stable or beta release steps, align version naming, assemble release notes, check release auth requirements, or validate publish-time commands and artifacts.
development
Run, watch, debug, and extend OpenClaw QA testing with qa-lab and qa-channel. Use when Codex needs to execute the repo-backed QA suite, inspect live QA artifacts, debug failing scenarios, add new QA scenarios, or explain the OpenClaw QA workflow. Prefer the live OpenAI lane with regular openai/gpt-5.4 in fast mode; do not use gpt-5.4-pro or gpt-5.4-mini unless the user explicitly overrides that policy.
development
End-to-end Parallels smoke, upgrade, and rerun workflow for OpenClaw across macOS, Windows, and Linux guests. Use when Codex needs to run, rerun, debug, or interpret VM-based install, onboarding, gateway smoke tests, latest-release-to-main upgrade checks, fresh snapshot retests, or optional Discord roundtrip verification under Parallels.