vps-dependency-overview
Dependency Overview (Docker-compose monorepo)
Inventory script that walks a services/ directory of Docker-compose stacks and produces a Markdown or JSON report of:
- Compose images —
image:references with tag/digest, classified by pinning quality (floating,implicit-latest,major,minor,semver,digest,custom) - Build services —
FROMlines from Dockerfiles, useful for spotting outdated base images - Runtime hints — Node/Python versions inferred from
.nvmrc,.node-version,.python-version,package.jsonengines,pyproject.toml - Dependency manager signals — which lockfiles exist (
pnpm-lock.yaml,package-lock.json,poetry.lock,uv.lock, …) - Per-service update-check skills —
<service>/.agents/skills/*-update-check/if you've put deeper version-checking skills next to each service
It does not hit the network. It answers "what am I using?", not "what's the latest?".
Quick Start
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
Flags
| 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) |
Expected layout
<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.
Requirements
- Python 3.11+ (uses
tomllib) dockerwith Compose v2 (the script invokesdocker compose -f … config --format jsonto resolve compose files; no images are pulled or built)
Optional: live container versions on a remote host
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.
How to read the report
| 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 DockerfileFROMlines (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 frompackage.json/pyproject.toml
A common red flag: node_container=18 while node_repo=22 means your dev environment and your container are on different majors.
More from jwa91/agentskills
interactive-learner
Personal AI tutoring skill that deeply researches any topic, then creates rich, interactive HTML courses with quizzes, simulators, debug challenges, explain-back exercises, real-world missions, and more. Tracks per-concept mastery across sessions with spaced repetition. Use when: (1) the user wants to learn a new topic, (2) the user says 'teach me X' or 'I want to learn X', (3) the user asks for an interactive lesson or course, (4) the user wants to study or review a subject. Works for any topic: technical, conceptual, creative, math, languages.
15mac-cleanup
Interactive macOS system cleanup for any dev machine. Frees disk space by pruning caches, package managers, unused apps, stale dev artifacts, and more. Discovers what's installed rather than assuming a specific setup. Always consults the user before deleting anything. Use when the user asks to: clean up their Mac, free disk space, remove unused apps, prune caches, clean developer artifacts, or any disk space maintenance task.
8spec
Interviews the user about a product idea or feature using structured questions, then generates a detailed spec document (SPEC.md). Use when the user wants to flesh out an idea, plan a feature, or create a buildable specification.
5personal-commit-review
Create a personal GitHub coding retrospective from a date range and turn it into a short Markdown review. Research commit activity across accessible public and private repositories through the authenticated gh CLI, understand what the relevant repositories and subsystems are for, and write a prose retrospective with stats and highlights. Use when the user asks for a commit review, coding recap, engineering retrospective, GitHub activity story, weekly/monthly/yearly highlights, or a written summary of what their commits achieved.
3env-inspector
Safely inspect .env files by showing key names and clearly non-sensitive values while redacting anything that looks like a secret. Best-effort heuristic redaction (keyword block + token-pattern blocklist + Shannon-entropy check + value allowlist) — not a cryptographic guarantee. Use when you need to understand a project's environment configuration without exposing credentials.
2vps-service-status
Quick health checks for a Dockerized VPS. Use to verify services are running, check container status, view logs, or get a system overview (disk, memory, CPU). Read-only by design — anything that would change state is routed through the clipboard for the user to paste.
2