vardrrunner 0.28.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. vardrrunner-0.28.0/LICENSE +21 -0
  2. vardrrunner-0.28.0/PKG-INFO +199 -0
  3. vardrrunner-0.28.0/README.md +141 -0
  4. vardrrunner-0.28.0/pyproject.toml +84 -0
  5. vardrrunner-0.28.0/setup.cfg +4 -0
  6. vardrrunner-0.28.0/tests/test_api.py +278 -0
  7. vardrrunner-0.28.0/tests/test_auth_commands.py +150 -0
  8. vardrrunner-0.28.0/tests/test_cli.py +320 -0
  9. vardrrunner-0.28.0/tests/test_config.py +134 -0
  10. vardrrunner-0.28.0/tests/test_configs.py +173 -0
  11. vardrrunner-0.28.0/tests/test_credentials.py +134 -0
  12. vardrrunner-0.28.0/tests/test_daemon.py +482 -0
  13. vardrrunner-0.28.0/tests/test_doctor.py +164 -0
  14. vardrrunner-0.28.0/tests/test_engagements.py +123 -0
  15. vardrrunner-0.28.0/tests/test_handlers.py +447 -0
  16. vardrrunner-0.28.0/tests/test_heartbeat.py +259 -0
  17. vardrrunner-0.28.0/tests/test_imports.py +82 -0
  18. vardrrunner-0.28.0/tests/test_job_events.py +155 -0
  19. vardrrunner-0.28.0/tests/test_jobs.py +517 -0
  20. vardrrunner-0.28.0/tests/test_keychain.py +96 -0
  21. vardrrunner-0.28.0/tests/test_nmap.py +361 -0
  22. vardrrunner-0.28.0/tests/test_pipeline.py +434 -0
  23. vardrrunner-0.28.0/tests/test_pipelines.py +326 -0
  24. vardrrunner-0.28.0/tests/test_run_commands.py +302 -0
  25. vardrrunner-0.28.0/tests/test_runner.py +367 -0
  26. vardrrunner-0.28.0/tests/test_status.py +172 -0
  27. vardrrunner-0.28.0/vardrrunner/__init__.py +8 -0
  28. vardrrunner-0.28.0/vardrrunner/api.py +173 -0
  29. vardrrunner-0.28.0/vardrrunner/cli.py +440 -0
  30. vardrrunner-0.28.0/vardrrunner/commands/__init__.py +0 -0
  31. vardrrunner-0.28.0/vardrrunner/commands/auth.py +100 -0
  32. vardrrunner-0.28.0/vardrrunner/commands/daemon.py +326 -0
  33. vardrrunner-0.28.0/vardrrunner/commands/doctor.py +315 -0
  34. vardrrunner-0.28.0/vardrrunner/commands/engagements.py +67 -0
  35. vardrrunner-0.28.0/vardrrunner/commands/heartbeat.py +56 -0
  36. vardrrunner-0.28.0/vardrrunner/commands/imports.py +40 -0
  37. vardrrunner-0.28.0/vardrrunner/commands/jobs.py +177 -0
  38. vardrrunner-0.28.0/vardrrunner/commands/pipeline.py +417 -0
  39. vardrrunner-0.28.0/vardrrunner/commands/run.py +293 -0
  40. vardrrunner-0.28.0/vardrrunner/commands/status.py +113 -0
  41. vardrrunner-0.28.0/vardrrunner/config.py +164 -0
  42. vardrrunner-0.28.0/vardrrunner/configs.py +210 -0
  43. vardrrunner-0.28.0/vardrrunner/handlers.py +498 -0
  44. vardrrunner-0.28.0/vardrrunner/keychain.py +83 -0
  45. vardrrunner-0.28.0/vardrrunner/pipelines.py +48 -0
  46. vardrrunner-0.28.0/vardrrunner/runner.py +389 -0
  47. vardrrunner-0.28.0/vardrrunner/targets.py +76 -0
  48. vardrrunner-0.28.0/vardrrunner.egg-info/PKG-INFO +199 -0
  49. vardrrunner-0.28.0/vardrrunner.egg-info/SOURCES.txt +51 -0
  50. vardrrunner-0.28.0/vardrrunner.egg-info/dependency_links.txt +1 -0
  51. vardrrunner-0.28.0/vardrrunner.egg-info/entry_points.txt +2 -0
  52. vardrrunner-0.28.0/vardrrunner.egg-info/requires.txt +12 -0
  53. vardrrunner-0.28.0/vardrrunner.egg-info/top_level.txt +1 -0
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Jorge Aquino
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,199 @@
1
+ Metadata-Version: 2.4
2
+ Name: vardrrunner
3
+ Version: 0.28.0
4
+ Summary: Local automation runner for the VardrSec product family
5
+ Author: Jorge Aquino
6
+ License: MIT License
7
+
8
+ Copyright (c) 2026 Jorge Aquino
9
+
10
+ Permission is hereby granted, free of charge, to any person obtaining a copy
11
+ of this software and associated documentation files (the "Software"), to deal
12
+ in the Software without restriction, including without limitation the rights
13
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
14
+ copies of the Software, and to permit persons to whom the Software is
15
+ furnished to do so, subject to the following conditions:
16
+
17
+ The above copyright notice and this permission notice shall be included in all
18
+ copies or substantial portions of the Software.
19
+
20
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
23
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
26
+ SOFTWARE.
27
+
28
+ Project-URL: Homepage, https://github.com/VardrSec/VardrRunner
29
+ Project-URL: Repository, https://github.com/VardrSec/VardrRunner
30
+ Project-URL: Changelog, https://github.com/VardrSec/VardrRunner/blob/main/CHANGELOG.md
31
+ Project-URL: Issues, https://github.com/VardrSec/VardrRunner/issues
32
+ Keywords: security,bug-bounty,recon,automation,cli,vardrsec
33
+ Classifier: Development Status :: 4 - Beta
34
+ Classifier: Environment :: Console
35
+ Classifier: Intended Audience :: Information Technology
36
+ Classifier: License :: OSI Approved :: MIT License
37
+ Classifier: Operating System :: OS Independent
38
+ Classifier: Programming Language :: Python :: 3 :: Only
39
+ Classifier: Programming Language :: Python :: 3.10
40
+ Classifier: Programming Language :: Python :: 3.11
41
+ Classifier: Programming Language :: Python :: 3.12
42
+ Classifier: Topic :: Security
43
+ Requires-Python: >=3.10
44
+ Description-Content-Type: text/markdown
45
+ License-File: LICENSE
46
+ Requires-Dist: typer>=0.12
47
+ Requires-Dist: rich>=13
48
+ Requires-Dist: requests>=2.31
49
+ Requires-Dist: keyring>=24
50
+ Provides-Extra: dev
51
+ Requires-Dist: pytest>=8; extra == "dev"
52
+ Requires-Dist: pytest-cov>=5; extra == "dev"
53
+ Requires-Dist: ruff>=0.6; extra == "dev"
54
+ Requires-Dist: mypy>=1.11; extra == "dev"
55
+ Requires-Dist: types-requests>=2.31; extra == "dev"
56
+ Requires-Dist: bandit>=1.7; extra == "dev"
57
+ Dynamic: license-file
58
+
59
+ # VardrRunner
60
+
61
+ **The local automation runner for the VardrSec product family.**
62
+
63
+ VardrRunner runs your security tooling on *your* machine and syncs the results to a
64
+ VardrSec backend (today: [VardrMap](https://github.com/VardrSec/VardrMap)) over HTTP.
65
+ It is a thin, fast, dependency-light client: it polls the backend for queued scan jobs,
66
+ claims them atomically, executes the tool locally, streams live progress back, uploads
67
+ results, and heartbeats so the backend always knows which machines are online.
68
+
69
+ > **Why local?** Recon and scanning tools belong on the operator's box — their bandwidth,
70
+ > their IP, their tool versions. The backend orchestrates and stores; the runner does the
71
+ > work. The two are fully decoupled and only ever exchange JSON.
72
+
73
+ ---
74
+
75
+ ## Features
76
+ - **Job queue worker** — poll, atomically claim, execute, and report scan jobs
77
+ - **Daemon mode** — `daemon start` runs a continuous background worker (poll every 5 s,
78
+ heartbeat every 60 s) with detached mode, PID file, and graceful shutdown
79
+ - **Tool runners** — `httpx`, `subfinder`, `nuclei`, `nmap`, `dnsx`, `naabu` (more coming),
80
+ each capturing output into a timestamped run directory, every run bounded by a timeout
81
+ - **Recon pipelines** — chain tools in one command: `recon` (subfinder → httpx → nuclei),
82
+ `deep` (adds dnsx resolution), `ports` (subfinder → dnsx → naabu), `quick`
83
+ - **VardrGate authorization tests** — `vardrgate_api_test` jobs drive the local `vardrgate`
84
+ binary over a CLI/JSON contract and attach the sanitized result to the job. Identity
85
+ credentials may reference a secret (`value_env` / `value_keychain`) that is resolved on
86
+ the runner at execution time, so the secret never reaches the backend
87
+ - **Importers** — pull existing `nuclei` / `httpx` output files into the backend
88
+ - **Real heartbeat** — reports hostname, version, OS, and per-tool availability so the
89
+ backend's Bridge shows live machine status
90
+ - **Live job events** — emits `started → targets_resolved → running → uploaded → done/failed`
91
+ so the backend Terminal shows real-time logs
92
+ - **Preflight (`doctor`)** — one command validates the whole machine (creds, URL, perms,
93
+ auth, daemon, disk, tools, pipelines) and exits non-zero on actionable failures, for
94
+ scripting unattended/VPS provisioning
95
+ - **Safe by default** — missing tools fail the job loudly, targets are normalized before
96
+ use, and the API key is stored locally with restrictive permissions
97
+
98
+ ## Requirements
99
+ - Python **3.10+**
100
+ - The external tools you intend to run, on your `PATH` (e.g. `httpx`, `subfinder`, `nuclei`, `nmap`, `dnsx`, `naabu`) — plus `vardrgate` if you run `vardrgate_api_test` jobs
101
+ - A VardrSec backend URL and an API key (`vmap_…` for VardrMap)
102
+ - VardrMap **≥ v0.22.0** as the backend — the runner calls `/engagements/*` (see [CHANGELOG](CHANGELOG.md) v0.27.0)
103
+
104
+ ## Install
105
+
106
+ **From PyPI** (once published) — recommended via [pipx](https://pipx.pypa.io) for an isolated CLI:
107
+ ```bash
108
+ pipx install vardrrunner # or: pip install vardrrunner
109
+ ```
110
+
111
+ **From a GitHub Release** (works today, before PyPI) — grab the wheel from the
112
+ [latest release](https://github.com/VardrSec/VardrRunner/releases) (each is built in CI
113
+ with a CycloneDX SBOM and a build-provenance attestation):
114
+ ```bash
115
+ pipx install ./vardrrunner-<version>-py3-none-any.whl
116
+ ```
117
+ > Releases are cut per `vX.Y.Z` tag, so the newest release can lag `main`. Compare the
118
+ > release tag against [CHANGELOG.md](CHANGELOG.md) — if you need a version that has not
119
+ > been tagged yet, install from source.
120
+
121
+ **From source** (development):
122
+ ```bash
123
+ git clone https://github.com/VardrSec/VardrRunner.git
124
+ cd VardrRunner
125
+ python -m venv venv
126
+ .\venv\Scripts\Activate.ps1 # Windows (macOS/Linux: source venv/bin/activate)
127
+ pip install -e ".[dev]"
128
+ ```
129
+ All three install the `vardrrunner` command.
130
+
131
+ > Homebrew / Scoop formulae are planned once there's demand; until then use pipx or the release wheel.
132
+
133
+ ## Quick start
134
+ ```bash
135
+ vardrrunner login vardrmap # prompts for backend URL + API key; key goes to your OS keychain
136
+ vardrrunner status # show config, version, and which tools are detected
137
+ vardrrunner heartbeat # confirm the backend can see this machine
138
+ vardrrunner daemon start # run the continuous worker (poll jobs + heartbeat)
139
+ ```
140
+
141
+ ### One-shot usage
142
+ ```bash
143
+ vardrrunner engagements # list your engagements
144
+ vardrrunner scope <engagement-id> # show in/out-of-scope items
145
+ vardrrunner jobs list # show the backend queue
146
+ vardrrunner jobs run # claim + execute all pending jobs once
147
+ vardrrunner run subfinder --engagement <engagement-id> # run a single tool and upload results
148
+ vardrrunner import nuclei --engagement <engagement-id> -f out.jsonl
149
+ ```
150
+ `--engagement` takes the engagement UUID; `--program` and `-p` are accepted as aliases.
151
+
152
+ See **[docs/cli.md](docs/cli.md)** for the full command reference.
153
+
154
+ ## Configuration
155
+
156
+ **Desktop / dev:** `vardrrunner login` stores your API key in the **OS keychain** (macOS
157
+ Keychain, Windows Credential Locker, Linux Secret Service) — no plaintext key on disk. The
158
+ backend URL is kept in `~/.vardrmap/config.json`. Run `vardrrunner logout` to remove it.
159
+
160
+ **CI / servers / containers:** set credentials via environment variables (no keychain
161
+ needed). The key resolves in this order — **`VARDRMAP_API_KEY` env → OS keychain → config
162
+ file**:
163
+
164
+ | Variable | Purpose |
165
+ |----------|---------|
166
+ | `VARDRMAP_URL` | Backend base URL (must be `https://`, except `localhost`) |
167
+ | `VARDRMAP_API_KEY` | Your `vmap_` API key |
168
+ | `VARDRRUNNER_TOOL_TIMEOUT` | Per-tool run timeout in seconds (default 1800); a hung tool is killed and the job marked failed |
169
+ | `VARDRRUNNER_ALLOW_INSECURE` | Set to `1` to permit a plain-HTTP backend URL (not recommended) |
170
+
171
+ The runner refuses to send your API key over plain HTTP to a non-local host, so a mistyped
172
+ `http://` URL can't leak your key.
173
+
174
+ ## Documentation
175
+ - [docs/architecture.md](docs/architecture.md) — how the runner is structured and how it talks to the backend
176
+ - [docs/development.md](docs/development.md) — local setup, testing, and contribution workflow
177
+ - [docs/cli.md](docs/cli.md) — complete command and flag reference
178
+ - [docs/adr/](docs/adr/) — Architecture Decision Records
179
+ - [CHANGELOG.md](CHANGELOG.md) — version history
180
+
181
+ ## Development & testing
182
+ ```bash
183
+ pip install -e ".[dev]" # editable install + dev tools (pytest, ruff, mypy)
184
+ ruff check vardrrunner tests # lint
185
+ ruff format --check vardrrunner tests # formatting
186
+ mypy vardrrunner # type check
187
+ pytest tests # 450 tests; all subprocess + HTTP calls are mocked
188
+ ```
189
+ CI runs ruff (lint + format), mypy, and a bandit security scan, then the test suite at a
190
+ 95% coverage floor on Python 3.10/3.11/3.12 (Linux) plus a 3.12 smoke on Windows and
191
+ macOS, and a `pip-audit` dependency audit — on every push and PR to `main`.
192
+ Contributions follow the **Engineering Charter** in [CLAUDE.md](CLAUDE.md): clean code,
193
+ tests in the same commit, docs updated, and the suite always green.
194
+
195
+ ## License
196
+ [MIT](LICENSE) © 2026 Jorge Aquino.
197
+
198
+ ---
199
+ *Part of the VardrSec product family — [VardrMap](https://github.com/VardrSec/VardrMap) · VardrRunner · VardrVault.*
@@ -0,0 +1,141 @@
1
+ # VardrRunner
2
+
3
+ **The local automation runner for the VardrSec product family.**
4
+
5
+ VardrRunner runs your security tooling on *your* machine and syncs the results to a
6
+ VardrSec backend (today: [VardrMap](https://github.com/VardrSec/VardrMap)) over HTTP.
7
+ It is a thin, fast, dependency-light client: it polls the backend for queued scan jobs,
8
+ claims them atomically, executes the tool locally, streams live progress back, uploads
9
+ results, and heartbeats so the backend always knows which machines are online.
10
+
11
+ > **Why local?** Recon and scanning tools belong on the operator's box — their bandwidth,
12
+ > their IP, their tool versions. The backend orchestrates and stores; the runner does the
13
+ > work. The two are fully decoupled and only ever exchange JSON.
14
+
15
+ ---
16
+
17
+ ## Features
18
+ - **Job queue worker** — poll, atomically claim, execute, and report scan jobs
19
+ - **Daemon mode** — `daemon start` runs a continuous background worker (poll every 5 s,
20
+ heartbeat every 60 s) with detached mode, PID file, and graceful shutdown
21
+ - **Tool runners** — `httpx`, `subfinder`, `nuclei`, `nmap`, `dnsx`, `naabu` (more coming),
22
+ each capturing output into a timestamped run directory, every run bounded by a timeout
23
+ - **Recon pipelines** — chain tools in one command: `recon` (subfinder → httpx → nuclei),
24
+ `deep` (adds dnsx resolution), `ports` (subfinder → dnsx → naabu), `quick`
25
+ - **VardrGate authorization tests** — `vardrgate_api_test` jobs drive the local `vardrgate`
26
+ binary over a CLI/JSON contract and attach the sanitized result to the job. Identity
27
+ credentials may reference a secret (`value_env` / `value_keychain`) that is resolved on
28
+ the runner at execution time, so the secret never reaches the backend
29
+ - **Importers** — pull existing `nuclei` / `httpx` output files into the backend
30
+ - **Real heartbeat** — reports hostname, version, OS, and per-tool availability so the
31
+ backend's Bridge shows live machine status
32
+ - **Live job events** — emits `started → targets_resolved → running → uploaded → done/failed`
33
+ so the backend Terminal shows real-time logs
34
+ - **Preflight (`doctor`)** — one command validates the whole machine (creds, URL, perms,
35
+ auth, daemon, disk, tools, pipelines) and exits non-zero on actionable failures, for
36
+ scripting unattended/VPS provisioning
37
+ - **Safe by default** — missing tools fail the job loudly, targets are normalized before
38
+ use, and the API key is stored locally with restrictive permissions
39
+
40
+ ## Requirements
41
+ - Python **3.10+**
42
+ - The external tools you intend to run, on your `PATH` (e.g. `httpx`, `subfinder`, `nuclei`, `nmap`, `dnsx`, `naabu`) — plus `vardrgate` if you run `vardrgate_api_test` jobs
43
+ - A VardrSec backend URL and an API key (`vmap_…` for VardrMap)
44
+ - VardrMap **≥ v0.22.0** as the backend — the runner calls `/engagements/*` (see [CHANGELOG](CHANGELOG.md) v0.27.0)
45
+
46
+ ## Install
47
+
48
+ **From PyPI** (once published) — recommended via [pipx](https://pipx.pypa.io) for an isolated CLI:
49
+ ```bash
50
+ pipx install vardrrunner # or: pip install vardrrunner
51
+ ```
52
+
53
+ **From a GitHub Release** (works today, before PyPI) — grab the wheel from the
54
+ [latest release](https://github.com/VardrSec/VardrRunner/releases) (each is built in CI
55
+ with a CycloneDX SBOM and a build-provenance attestation):
56
+ ```bash
57
+ pipx install ./vardrrunner-<version>-py3-none-any.whl
58
+ ```
59
+ > Releases are cut per `vX.Y.Z` tag, so the newest release can lag `main`. Compare the
60
+ > release tag against [CHANGELOG.md](CHANGELOG.md) — if you need a version that has not
61
+ > been tagged yet, install from source.
62
+
63
+ **From source** (development):
64
+ ```bash
65
+ git clone https://github.com/VardrSec/VardrRunner.git
66
+ cd VardrRunner
67
+ python -m venv venv
68
+ .\venv\Scripts\Activate.ps1 # Windows (macOS/Linux: source venv/bin/activate)
69
+ pip install -e ".[dev]"
70
+ ```
71
+ All three install the `vardrrunner` command.
72
+
73
+ > Homebrew / Scoop formulae are planned once there's demand; until then use pipx or the release wheel.
74
+
75
+ ## Quick start
76
+ ```bash
77
+ vardrrunner login vardrmap # prompts for backend URL + API key; key goes to your OS keychain
78
+ vardrrunner status # show config, version, and which tools are detected
79
+ vardrrunner heartbeat # confirm the backend can see this machine
80
+ vardrrunner daemon start # run the continuous worker (poll jobs + heartbeat)
81
+ ```
82
+
83
+ ### One-shot usage
84
+ ```bash
85
+ vardrrunner engagements # list your engagements
86
+ vardrrunner scope <engagement-id> # show in/out-of-scope items
87
+ vardrrunner jobs list # show the backend queue
88
+ vardrrunner jobs run # claim + execute all pending jobs once
89
+ vardrrunner run subfinder --engagement <engagement-id> # run a single tool and upload results
90
+ vardrrunner import nuclei --engagement <engagement-id> -f out.jsonl
91
+ ```
92
+ `--engagement` takes the engagement UUID; `--program` and `-p` are accepted as aliases.
93
+
94
+ See **[docs/cli.md](docs/cli.md)** for the full command reference.
95
+
96
+ ## Configuration
97
+
98
+ **Desktop / dev:** `vardrrunner login` stores your API key in the **OS keychain** (macOS
99
+ Keychain, Windows Credential Locker, Linux Secret Service) — no plaintext key on disk. The
100
+ backend URL is kept in `~/.vardrmap/config.json`. Run `vardrrunner logout` to remove it.
101
+
102
+ **CI / servers / containers:** set credentials via environment variables (no keychain
103
+ needed). The key resolves in this order — **`VARDRMAP_API_KEY` env → OS keychain → config
104
+ file**:
105
+
106
+ | Variable | Purpose |
107
+ |----------|---------|
108
+ | `VARDRMAP_URL` | Backend base URL (must be `https://`, except `localhost`) |
109
+ | `VARDRMAP_API_KEY` | Your `vmap_` API key |
110
+ | `VARDRRUNNER_TOOL_TIMEOUT` | Per-tool run timeout in seconds (default 1800); a hung tool is killed and the job marked failed |
111
+ | `VARDRRUNNER_ALLOW_INSECURE` | Set to `1` to permit a plain-HTTP backend URL (not recommended) |
112
+
113
+ The runner refuses to send your API key over plain HTTP to a non-local host, so a mistyped
114
+ `http://` URL can't leak your key.
115
+
116
+ ## Documentation
117
+ - [docs/architecture.md](docs/architecture.md) — how the runner is structured and how it talks to the backend
118
+ - [docs/development.md](docs/development.md) — local setup, testing, and contribution workflow
119
+ - [docs/cli.md](docs/cli.md) — complete command and flag reference
120
+ - [docs/adr/](docs/adr/) — Architecture Decision Records
121
+ - [CHANGELOG.md](CHANGELOG.md) — version history
122
+
123
+ ## Development & testing
124
+ ```bash
125
+ pip install -e ".[dev]" # editable install + dev tools (pytest, ruff, mypy)
126
+ ruff check vardrrunner tests # lint
127
+ ruff format --check vardrrunner tests # formatting
128
+ mypy vardrrunner # type check
129
+ pytest tests # 450 tests; all subprocess + HTTP calls are mocked
130
+ ```
131
+ CI runs ruff (lint + format), mypy, and a bandit security scan, then the test suite at a
132
+ 95% coverage floor on Python 3.10/3.11/3.12 (Linux) plus a 3.12 smoke on Windows and
133
+ macOS, and a `pip-audit` dependency audit — on every push and PR to `main`.
134
+ Contributions follow the **Engineering Charter** in [CLAUDE.md](CLAUDE.md): clean code,
135
+ tests in the same commit, docs updated, and the suite always green.
136
+
137
+ ## License
138
+ [MIT](LICENSE) © 2026 Jorge Aquino.
139
+
140
+ ---
141
+ *Part of the VardrSec product family — [VardrMap](https://github.com/VardrSec/VardrMap) · VardrRunner · VardrVault.*
@@ -0,0 +1,84 @@
1
+ [build-system]
2
+ requires = ["setuptools>=68"]
3
+ build-backend = "setuptools.build_meta"
4
+
5
+ [project]
6
+ name = "vardrrunner"
7
+ dynamic = ["version"]
8
+ description = "Local automation runner for the VardrSec product family"
9
+ readme = "README.md"
10
+ license = { file = "LICENSE" }
11
+ requires-python = ">=3.10"
12
+ authors = [{ name = "Jorge Aquino" }]
13
+ keywords = ["security", "bug-bounty", "recon", "automation", "cli", "vardrsec"]
14
+ classifiers = [
15
+ "Development Status :: 4 - Beta",
16
+ "Environment :: Console",
17
+ "Intended Audience :: Information Technology",
18
+ "License :: OSI Approved :: MIT License",
19
+ "Operating System :: OS Independent",
20
+ "Programming Language :: Python :: 3 :: Only",
21
+ "Programming Language :: Python :: 3.10",
22
+ "Programming Language :: Python :: 3.11",
23
+ "Programming Language :: Python :: 3.12",
24
+ "Topic :: Security",
25
+ ]
26
+ dependencies = [
27
+ "typer>=0.12",
28
+ "rich>=13",
29
+ "requests>=2.31",
30
+ "keyring>=24",
31
+ ]
32
+
33
+ [project.urls]
34
+ Homepage = "https://github.com/VardrSec/VardrRunner"
35
+ Repository = "https://github.com/VardrSec/VardrRunner"
36
+ Changelog = "https://github.com/VardrSec/VardrRunner/blob/main/CHANGELOG.md"
37
+ Issues = "https://github.com/VardrSec/VardrRunner/issues"
38
+
39
+ [project.optional-dependencies]
40
+ dev = [
41
+ "pytest>=8",
42
+ "pytest-cov>=5",
43
+ "ruff>=0.6",
44
+ "mypy>=1.11",
45
+ "types-requests>=2.31",
46
+ "bandit>=1.7",
47
+ ]
48
+
49
+ [project.scripts]
50
+ vardrrunner = "vardrrunner.cli:app"
51
+
52
+ # Single source of truth for the version: read the literal from the package.
53
+ [tool.setuptools.dynamic]
54
+ version = { attr = "vardrrunner.__version__" }
55
+
56
+ [tool.setuptools.packages.find]
57
+ where = ["."]
58
+ include = ["vardrrunner*"]
59
+
60
+ [tool.ruff]
61
+ line-length = 100
62
+ target-version = "py310"
63
+
64
+ [tool.ruff.lint]
65
+ # E/W pycodestyle, F pyflakes, I import-sorting, B bugbear, UP pyupgrade.
66
+ select = ["E", "W", "F", "I", "B", "UP"]
67
+ ignore = [
68
+ # Long lines are left to the formatter; do not fail lint on E501.
69
+ "E501",
70
+ # B008: function call in argument default. This is the required Typer idiom
71
+ # (`typer.Option(...)` / `typer.Argument(...)` as defaults) — not a bug here.
72
+ "B008",
73
+ ]
74
+
75
+ [tool.mypy]
76
+ python_version = "3.10"
77
+ ignore_missing_imports = true
78
+ # warn_unused_ignores is intentionally OFF: Windows-only `# type: ignore`s (ctypes.windll,
79
+ # DETACHED_PROCESS) are needed when CI type-checks on Linux but unused on Windows.
80
+ # Pragmatic baseline — not strict mode. Tighten incrementally over time.
81
+
82
+ [tool.pytest.ini_options]
83
+ addopts = "-q"
84
+ testpaths = ["tests"]
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+