libs is the docker-library automation interface. Run it from the repository root or any subdirectory inside the repository.
make installContentful commands require the contentful_management Python SDK, which make install installs as a base dependency.
Windows PowerShell:
.\make.ps1 installmake cli # enter an activated shell
libs scan --selection due --json
libs app-check --app wordpress --jsonWindows PowerShell:
.\make.ps1 libs scan --selection due --json
.\make.ps1 libs app-check --app wordpress --jsonOr without activating:
make libs ARGS="check --app wordpress --json"One-off without install:
python3 -m venv .venv
.venv/bin/pip install -e cli/
.venv/bin/python -m libs scan --selection due --jsonWindows one-off:
py -m venv .venv
.\.venv\Scripts\python.exe -m pip install -e cli/
.\.venv\Scripts\python.exe -m libs scan --selection due --jsonlibs list- list active appslibs image-stats- summarize image usage across all apps by registry: docker.io total with the Docker official vs docker.io third-party split (official % of docker.io), plus other registries;--app <name>for one app,--include-archivedadds archived appslibs app-info --app <name>- show one applibs scan- scan upstream versionslibs app-check --app <name>- run structure + policy gateslibs app-check --app <name> --gate structurelibs app-check --app <name> --gate policylibs app-report --app <name>- generate a short readiness reportlibs app-archive --app <name> --dry-run- preview archive actionslibs app-restore --app <name> --dry-run- preview restore actionslibs app-drift --app <name>- list dependency images and compare upstream compose driftlibs db-refresh- refresh the DB lifecycle snapshot from endoflife.datelibs maintenance-check- validate maintenance/archive metadata against the app treelibs app-new --name <name> --trademark <brand> --dry-run- preview a new app scaffoldlibs app-new --name <name> --trademark <brand> --upstream-releases <url> --upstream-compose <url> --upstream-env <url>- prefill optional upstream sources used by scan, drift, and README generationlibs app-gen-readme --app <name>- regenerate one app's README from variables.jsonlibs catalog-push --app <name>- preview pushing repo catalog + machine fields to Contentful (use--applyto write)libs catalog-update --app <name> --fields '<json>'- preview updating fields on an existing Contentful product entry (use--applyto write); e.g.--fields '{"appStore": false, "production": false}'- Direct
libsinvocation: single-quote the JSON and use real double quotes inside, e.g.--fields '{"appStore": false}' make libs ARGS="..."wrapper: the outer double quotes need escapes, e.g.make libs ARGS="catalog-update --app <name> --fields '{\"appStore\": false}'"
- Direct
libs app-deploy --app <name> [--ssh-host <ip>] [--progress] [--verbose]- deploy one app locally or remotely;--progressprints step headers to stderr and--verbosealso prints raw command outputlibs app-deploy --app <name> --version <tag>- deploy a specific image tag by overridingW9_VERSIONwithout modifying the repo.envlibs app-down --app <name> [--ssh-host <ip>] [--progress] [--json]- tear one app down withdocker compose down -vlibs appstore-sync --app <name> --ssh-host <ip> [--progress] [--verbose]- sync one app directory into the remote websoft9 container library and syncmetadata/catalog/<app>.jsoninto the container catalog directory for appstore testinglibs appstore-deploy --app <name> --ssh-host <ip> [--progress] [--verbose]- deploy one app into a websoft9 container appstore (not implemented yet; pending the websoft9 container CLI)libs websoft9-upgrade [--container <name>] [--tag <tag>] [--tag-var <var>] [--compose-dir <dir>] [--target local|remote] [--ssh-host <ip>] [--progress] [--verbose]- upgrade the Websoft9 platform container: set the image tag (defaultdev), rundocker compose pull, thendocker compose up -d; the compose project is discovered from the container labels unless--compose-diris given- remote-aware commands suppress the routine
known hostsadd warning from ephemeral SSH targets; real stderr still passes through libs proxy- show, save, or clear the saved proxylibs help- show help, same aslibs --help
Options: --json, --progress, --verbose, --plan-only, --selection, --date, --include-archived, --scope, --major-ahead, --proxy, -h / --help.
Shared execution options:
--jsonkeeps the final payload onstdout--progresswrites step-level progress tostderr--verbosewrites step-level progress and raw subprocess output tostderr- only long-running or execution-style commands expose
--progressand--verbose
Network behavior:
- default request timeout is 15s, override with
LIBS_HTTP_TIMEOUT - resolution order:
--proxy> environment variables >cli/proxy.conf - a wildcard
no_proxy=*is ignored when a proxy is present make cliandmake installsnapshot the host proxy intocli/proxy.confmake.ps1 installsnapshots the host proxy intocli/proxy.conf- manage the saved proxy with
libs proxy,libs proxy --set <url>,libs proxy --clear cli/proxy.confis machine-local and gitignored
Credentials:
- provider-specific token files live under
.secrets/, for example.secrets/contentful.envand.secrets/cloudflare.env(gitignored) - each provider file stores the token directly as a standard env var, e.g.
CONTENTFUL_ACCESS_TOKEN=...orCLOUDFLARE_API_TOKEN=... - a command may accept a per-invocation token flag (e.g.
--token) and an explicit provider env file path (e.g.--env-file) as overrides - resolution order: command flag > explicit
--env-file> environment variable > default provider file - CI keeps passing secrets as environment variables from GitHub Actions secrets; it does not use
.secrets/
Run from the repository root or a subdirectory inside it. The CLI now refuses to run outside the repository so it cannot read or write the wrong apps/ or metadata/ tree by accident. CLI does not depend on build/.