setupdoctor
brew doctor for any repo. It reads what a project needs from its code and config files, checks your machine, and prints the fix for each gap. It never reads the README.
$ setupdoctor
setupdoctor: 5 checks
✓ Node >=12.0.0 required (package.json engines), found 26.10.0
✗ yarn is this repo's package manager but is not installed
fix: npm install -g yarn
✗ Node dependencies not installed (no node_modules folder)
fix: yarn install
✗ No .env file; .env.example defines 12 variable(s)
fix: cp .env.example .env, then fill in the values
✗ MongoDB (docker-compose.yml) is not reachable on localhost:27017
fix: docker compose up -d
4 failed, 0 warning(s), 1 passed
That is real output from a fresh clone of hagopj13/node-express-boilerplate.
Install
Not on PyPI yet. From a copy of this folder:
pip install .
It is one file with no dependencies, so python setupdoctor.py also works.
Use
setupdoctor # check the current folder
setupdoctor path/to/repo
setupdoctor --ci # for pipelines, see below
The exit code is 1 if any check failed. A check only reports; it never changes anything on your machine.
Run it automatically after every clone
setupdoctor --install-hook
Do this once. From then on, every git clone prints the checklist for the new repo as soon as the clone finishes. It stays silent on repos with nothing to check and when you switch branches.
This is the one command that changes your machine: it adds a post-checkout hook to git's template folder and points init.templateDir in your global git config at it. Repos you cloned earlier are not affected. Undo it with setupdoctor --uninstall-hook.
What it checks
| Check | Read from |
|---|---|
| Node version | .nvmrc, .node-version, package.json engines |
| Python version | .python-version, runtime.txt, pyproject.toml |
| Package manager is installed | lockfile or packageManager (pnpm, yarn, bun, uv, poetry, pipenv) |
| Dependencies are installed | node_modules; .venv or venv |
| Env vars are set | .env.example, plus reads in the source that break when the variable is unset |
| Env vars are documented | every env var the source reads, compared with .env.example |
| Services are running | Postgres, Redis, MongoDB and MySQL ports in the compose file |
It only fails a check when the repo declares the requirement. For environment variables that means one of:
- the variable is in
.env.exampleand you have no.env - Python reads it as
os.environ["X"]outside anyifortry - TypeScript reads it as
process.env.X!
Softer reads such as os.getenv("X") or a bare process.env.X are treated as settings the app can run without. On real projects they nearly always are, and reporting them buried the real problems under dozens of false alarms. Tests, docs, examples and installed packages are not scanned.
CI mode
setupdoctor --ci ignores the machine and fails if the code reads an environment variable that is not in .env.example. Run it on every pull request and the example file cannot fall behind the code.
Limits
- Node and Python only.
- It checks the folder you point it at. In a monorepo, run it in each project folder.
- Env var names built at runtime, or read through a settings library (Joi, pydantic-settings, django-environ), are not seen by the scan. The
.env.examplecheck still covers them. - A JavaScript project with no
.env.examplegets no env var checks, because nothing in plain JavaScript marks a variable as required. - A database is only checked if the compose file publishes its port. One you are expected to install yourself is not detected.
- Compose files are read by pattern, so ports written as
${VAR:-5432}:5432are missed. - A missing Python virtualenv is a warning, because poetry and pipenv keep theirs outside the repo.
- Anything that lives outside the code, such as VPN access or an account someone has to create for you, cannot be detected.
Tests
python test_setupdoctor.py
Metadata
Release files for setupdoctor 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| setupdoctor-0.1.0.tar.gz | 10.7 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| setupdoctor-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 22.3 kB
Release files / setupdoctor-0.1.0.tar.gz
| Download URL | setupdoctor-0.1.0.tar.gz |
|---|---|
| Size | 10.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
532f2e1f349938c4c316a169c5240d1112b69f6ab46148f1f5a276bf479043f0
|
|
BLAKE2b-256 checksum How to use checksums |
a56475033c43eca6bd373eb5b22f199bf40a3aacc1ab5b9865cb3d5b2a76b8ec
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / setupdoctor-0.1.0-py3-none-any.whl
| Download URL | setupdoctor-0.1.0-py3-none-any.whl |
|---|---|
| Size | 11.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
ac4e5bee5b472a95855b31726d2970949e72284338c8221a90a6b08a5ab37170
|
|
BLAKE2b-256 checksum How to use checksums |
9db10d10baaabfb49da1ac958647055ceecebda5506ae215271b2620fd084f53
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|