Dependency management
Skill richfrem/agent-plugins-skills/plugins/dependency-management/skills/dependency-management
Python dependency and environment management for multi-service or monorepo python backends. Use when: (1) adding, upgrading, or removing a Python package, (2) responding to Dependabot or security vulnerability alerts (GHSA/CVE), (3) creating a new service that needs its own requirements files, (4) debugging pip install failures or Docker build issues related to dependencies, (5) reviewing or auditing the dependency tree, (6) running pip-compile. Enforces the pip-compile locked-file workflow and tiered dependency hierarchy.From its SKILL.md
npx -y skills add richfrem/agent-plugins-skills --skill dependency-managementAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 5 stars5 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
6.9 KB, ~1.5k tokens by cl100k_base, as published. Nobody here has run it
Dependencies
This skill requires Python 3.8+ and standard library only. No external packages needed.
To install this skill's dependencies:
pip-compile ./requirements.in
pip install -r ./requirements.txt
See ./requirements.txt for the dependency lockfile (currently empty — standard library only).
Dependency Management
- One runtime per service. Each isolated service owns its own
./requirements.txtlockfile.
Script Architecture & Packaging
For plugin packaging, DRY script distribution, and Windows symlink/junction compatibility rules, see the authoritative shared plugin packaging guidelines.
Repository Layout (Example)
src/
├── requirements-core.in # Tier 1: shared baseline (fastapi, pydantic…)
├── requirements-core.txt # Lockfile for core
├── services/
│ ├── auth_service/
│ │ ├── requirements.in # Tier 2: inherits core + auth deps
│ │ └── requirements.txt
│ ├── payments_service/
│ │ ├── requirements.in
│ │ └── requirements.txt
│ └── database_service/
│ ├── requirements.in
│ └── requirements.txt
Tiered Hierarchy
| Tier | Scope | File | Examples |
|---|---|---|---|
| 1 – Core | Shared by >80% of services | requirements-core.in | fastapi, pydantic, httpx |
| 2 – Specialized | Service-specific heavyweights | <service>/requirements.in | stripe, redis, asyncpg |
| 3 – Dev tools | Never in production containers | requirements-dev.in | pytest, black, ruff |
Each service .in file usually begins with -r ../../requirements-core.in to inherit the core dependencies.
Workflow: Adding or Upgrading a Package
-
Declare — Add or update the version constraint in the correct
.infile.- If the package is needed by most services →
requirements-core.in - If only one service → that service's
.in - Security floor pins use
>=syntax:cryptography>=46.0.5
- If the package is needed by most services →
-
Lock — Compile the lockfile:
# Core pip-compile src/requirements-core.in \ --output-file src/requirements-core.txt # Individual service (example: auth) pip-compile src/services/auth_service/requirements.in \ --output-file src/services/auth_service/requirements.txtBecause services inherit core via
-r, recompiling a service also picks up core changes. -
Sync — Install locally to verify: Preferred (if available):
pip-sync src/services/<service>/requirements.txtFallback:
pip install -r src/services/<service>/requirements.txt -
Verify — Rebuild the affected Docker/Podman container to confirm stable builds.
-
Commit — Stage and commit both
.inand.txtfiles together.
Workflow: Responding to Dependabot / Security Alerts
-
Identify the affected package and fixed version from the advisory (GHSA/CVE).
-
Determine tier placement:
- Check if the package is a direct dependency (appears in an
.infile). - If it only appears in
.txtfiles, it's transitive — pinned by something upstream.
- Check if the package is a direct dependency (appears in an
-
For direct dependencies: Bump the version floor in the relevant
.infile.# SECURITY PATCHES (Mon YYYY) package-name>=X.Y.Z -
For transitive dependencies: Add a version floor pin in the appropriate
.infile to force the resolver to pull the patched version, even though it's not a direct dependency. -
Recompile all affected lockfiles. Since services inherit core, a core change means recompiling every service lockfile. Use this compilation order:
# 1. Core first pip-compile src/requirements-core.in \ --output-file src/requirements-core.txt # 2. Then each service for svc in auth_service payments_service database_service; do pip-compile "src/services/${svc}/requirements.in" \ --output-file "src/services/${svc}/requirements.txt" done -
Verify the patched version appears in all affected
.txtfiles:grep -i "package-name" src/requirements-core.txt \ src/services/*/requirements.txt -
If no newer version exists (e.g., inherent design risk like pickle deserialization), document the advisory acknowledgement as a comment in the
.infile and note mitigations.
Container / Dockerfile Constraints
- Dockerfiles only use
COPY requirements.txt+RUN pip install -r requirements.txt. - No
RUN pip install <pkg>commands. No manual installs. - Copy
requirements.txtbefore source code to preserve Docker layer caching.
Non-Negotiable Execution Rules
The agent MUST NOT:
- Run
pip install <pkg>directly to resolve dependency issues. - Modify
.txtlockfiles manually. - Bypass
pip-compilefailures. - Ignore missing tools (e.g.,
pip-compilenot installed). - Continue after dependency conflicts without resolution.
If any of the above occurs:
- HALT execution immediately.
- Classify using the self-evolution profile.
- Either:
- Fix within allowed directories, OR
- Log to
map-debt.md.
- Report explicitly to the user.
Workarounds are considered Tier 0 Friction and must be logged.
Self-Evolution Requirements
When this skill encounters friction, failure, ambiguity, or a workaround:
- Do not silently bypass the issue.
- Classify the issue using
references/self-evolution-profile.md. - If fixed within allowed directories, update the relevant skill/reference file.
- Add an entry to
references/evolution-log.md. - If not fixed, add an entry to
references/map-debt.mdwith severity, repeat risk, and recommended fix.
When to Record Map Debt
Log to map-debt.md when:
- Tooling is missing (e.g.
pip-compileis absent). - Conflicts require human resolution.
- The dependency graph is ambiguous.
- Instructions in this plugin are unclear or contradictory.
Do not silently proceed.
Common Pitfalls
- Forgetting to recompile downstream services after a core
.inchange. - Pinning
==instead of>=for security floors — use>=sopip-compilecan resolve freely. - Adding dev tools to production
.infiles — keeppytest,ruff, etc. inrequirements-dev.in. - Committing
.txtwithout.in— always commit them as a pair.
What ships with it: 13 files
6.7 KB alongside SKILL.md
evals/
- evals.json1.6 KB
- results.tsv301 B
references/
- acceptance-criteria.md3.1 KB
- fallback-tree.md1.4 KB
- requirements.in22 B
- requirements.txt22 B