skills/vps-dependency-overview/SKILL.md
Generate an offline-first dependency overview across services in a Docker-compose monorepo. Reports image tags & pinning quality, Dockerfile base images, runtime hints (Node/Python via .nvmrc, .python-version, package.json engines, pyproject.toml), and lockfile presence. Use when you want a single report of "what am I running and where are my update surfaces?" — no network calls, no pulls.
npx skillsauth add jwa91/agentskills vps-dependency-overviewInstall 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.
Inventory script that walks a services/ directory of Docker-compose stacks and produces a Markdown or JSON report of:
image: references with tag/digest, classified by pinning quality (floating, implicit-latest, major, minor, semver, digest, custom)FROM lines from Dockerfiles, useful for spotting outdated base images.nvmrc, .node-version, .python-version, package.json engines, pyproject.tomlpnpm-lock.yaml, package-lock.json, poetry.lock, uv.lock, …)<service>/.agents/skills/*-update-check/ if you've put deeper version-checking skills next to each serviceIt does not hit the network. It answers "what am I using?", not "what's the latest?".
From the repo root, with docker compose (v2) available locally:
python3 .agents/skills/vps-dependency-overview/scripts/vps_dependency_overview.py \
--format markdown \
--output /tmp/dependency-overview.md
Print to stdout instead:
python3 .agents/skills/vps-dependency-overview/scripts/vps_dependency_overview.py --format markdown
Focus on specific service folders:
python3 .agents/skills/vps-dependency-overview/scripts/vps_dependency_overview.py --only n8n --only postgres
JSON output for downstream tooling:
python3 .agents/skills/vps-dependency-overview/scripts/vps_dependency_overview.py --format json
| Flag | Default | Description |
| ---------------- | ---------- | ------------------------------------------------------ |
| --root | . | Workspace root |
| --services-dir | services | Subdirectory containing per-service folders |
| --format | markdown | markdown or json |
| --output | stdout | Write to a file instead of stdout |
| --only NAME | all | Restrict to specific service folder names (repeatable) |
<root>/
<services-dir>/ # default: services/
<service-a>/
docker-compose.yml # required for the service to be inventoried
Dockerfile # optional, parsed if present
.nvmrc / .python-version / package.json / pyproject.toml # optional, parsed for runtime hints
.agents/skills/<svc>-update-check/SKILL.md # optional, surfaced in the report
<service-b>/
...
A service folder without docker-compose.yml is skipped silently.
tomllib)docker with Compose v2 (the script invokes docker compose -f … config --format json to resolve compose files; no images are pulled or built)The script reports desired versions (what the compose files say). To compare against actually running versions on a remote VPS, run separately:
ssh <vps-host> "docker ps --format 'table {{.Names}}\t{{.Image}}\t{{.Status}}'"
Replace <vps-host> with your SSH alias from ~/.ssh/config.
| Pinning class | What it means | Reproducibility |
| ----------------- | -------------------------------------------- | ------------------------------------------ |
| digest | image@sha256:… | Best — content-addressed |
| semver | 1.2.3, v1.2.3, 1.2.3-alpine | Good — explicit version |
| minor | 1.2, 1.2-alpine | Major+minor pinned, patches float |
| major | 22, 3-slim | Major pinned, minor+patch float on rebuild |
| floating | latest, main, master, edge, stable | Bad — non-reproducible |
| implicit-latest | no tag at all | Bad — equivalent to :latest |
| custom | anything else | Worth a manual look |
Runtime fields:
node_container / python_container — inferred from Dockerfile FROM lines (the runtime your container actually runs)node_repo / python_repo — inferred from .nvmrc/.python-version (what dev tooling expects)node_engine / python_requires — explicit constraints from package.json/pyproject.tomlA common red flag: node_container=18 while node_repo=22 means your dev environment and your container are on different majors.
data-ai
Release the current project to the personal Homebrew tap from repo-local release config. Use when the user says "release", "ship", "cut a version", "publish", "make a new tag", or asks how to make a new version available via jwa91/tap.
tools
Use the `jwa-harden` CLI for secret-safe command execution, env-template discovery, and signing/notarization preflight checks. Trigger when a command needs secrets, when `.env.template` or 1Password references are involved, or before signed release flows.
documentation
Modify or extend the `jwa-tobrew` scaffolding system — the templates that `init` writes into target projects. Trigger when the user says "add a new scaffold kind", "change what init writes", "update the templates", or asks how the embedded templates are wired.
development
Detect and fix drift between a project and the conventions encoded in `jwa-tobrew`, prek, and the tap ADRs. Trigger when the user says "align", "any drift", "verify conventions", or asks why a particular file/symlink/script is required.