socketsecurity 2.4.5__tar.gz → 2.4.6__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 (143) hide show
  1. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/CHANGELOG.md +15 -0
  2. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/PKG-INFO +1 -1
  3. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/docs/cli-reference.md +18 -7
  4. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/pyproject.toml +1 -1
  5. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/socketsecurity/__init__.py +1 -1
  6. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/uv.lock +64 -50
  7. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/.github/CODEOWNERS +0 -0
  8. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/.github/PULL_REQUEST_TEMPLATE/bug-fix.md +0 -0
  9. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/.github/PULL_REQUEST_TEMPLATE/feature.md +0 -0
  10. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/.github/PULL_REQUEST_TEMPLATE/improvement.md +0 -0
  11. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  12. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/.github/actions/setup-docker/action.yml +0 -0
  13. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/.github/actions/setup-hatch/action.yml +0 -0
  14. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/.github/actions/setup-sfw/action.yml +0 -0
  15. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/.github/dependabot.yml +0 -0
  16. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/.github/workflows/dependency-review.yml +0 -0
  17. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/.github/workflows/docker-stable.yml +0 -0
  18. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/.github/workflows/e2e-test.yml +0 -0
  19. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/.github/workflows/pr-preview.yml +0 -0
  20. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/.github/workflows/python-tests.yml +0 -0
  21. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/.github/workflows/release.yml +0 -0
  22. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/.github/workflows/version-check.yml +0 -0
  23. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/.github/zizmor.yml +0 -0
  24. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/.gitignore +0 -0
  25. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/.hooks/sync_version.py +0 -0
  26. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/.pre-commit-config.yaml +0 -0
  27. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/.python-version +0 -0
  28. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/Dockerfile +0 -0
  29. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/LICENSE +0 -0
  30. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/Makefile +0 -0
  31. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/README.md +0 -0
  32. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/docs/ci-cd.md +0 -0
  33. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/docs/development.md +0 -0
  34. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/docs/troubleshooting.md +0 -0
  35. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/examples/config/sarif-dashboard-parity.json +0 -0
  36. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/examples/config/sarif-dashboard-parity.toml +0 -0
  37. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/examples/config/sarif-diff-ci-cd.json +0 -0
  38. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/examples/config/sarif-diff-ci-cd.toml +0 -0
  39. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/examples/config/sarif-instance-detail.json +0 -0
  40. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/examples/config/sarif-instance-detail.toml +0 -0
  41. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/instructions/gitlab-commit-status/uat.md +0 -0
  42. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/pytest.ini +0 -0
  43. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/scripts/build_container.sh +0 -0
  44. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/scripts/build_container_flexible.sh +0 -0
  45. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/scripts/deploy-test-docker.sh +0 -0
  46. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/scripts/deploy-test-pypi.sh +0 -0
  47. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/scripts/docker-entrypoint.sh +0 -0
  48. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/scripts/run.sh +0 -0
  49. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/session.md +0 -0
  50. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/socket.yml +0 -0
  51. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/socketsecurity/config.py +0 -0
  52. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/socketsecurity/core/__init__.py +0 -0
  53. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/socketsecurity/core/alert_selection.py +0 -0
  54. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/socketsecurity/core/classes.py +0 -0
  55. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/socketsecurity/core/cli_client.py +0 -0
  56. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/socketsecurity/core/exceptions.py +0 -0
  57. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/socketsecurity/core/git_interface.py +0 -0
  58. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/socketsecurity/core/helper/__init__.py +0 -0
  59. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/socketsecurity/core/helper/socket_facts_loader.py +0 -0
  60. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/socketsecurity/core/lazy_file_loader.py +0 -0
  61. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/socketsecurity/core/logging.py +0 -0
  62. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/socketsecurity/core/messages.py +0 -0
  63. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/socketsecurity/core/resource_utils.py +0 -0
  64. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/socketsecurity/core/scm/__init__.py +0 -0
  65. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/socketsecurity/core/scm/base.py +0 -0
  66. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/socketsecurity/core/scm/client.py +0 -0
  67. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/socketsecurity/core/scm/github.py +0 -0
  68. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/socketsecurity/core/scm/gitlab.py +0 -0
  69. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/socketsecurity/core/scm_comments.py +0 -0
  70. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/socketsecurity/core/socket_config.py +0 -0
  71. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/socketsecurity/core/tools/reachability.py +0 -0
  72. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/socketsecurity/core/utils.py +0 -0
  73. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/socketsecurity/fossa_compat.py +0 -0
  74. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/socketsecurity/output.py +0 -0
  75. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/socketsecurity/plugins/__init__.py +0 -0
  76. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/socketsecurity/plugins/base.py +0 -0
  77. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/socketsecurity/plugins/formatters/__init__.py +0 -0
  78. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/socketsecurity/plugins/formatters/slack.py +0 -0
  79. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/socketsecurity/plugins/jira.py +0 -0
  80. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/socketsecurity/plugins/manager.py +0 -0
  81. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/socketsecurity/plugins/slack.py +0 -0
  82. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/socketsecurity/plugins/teams.py +0 -0
  83. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/socketsecurity/plugins/webhook.py +0 -0
  84. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/socketsecurity/socketcli.py +0 -0
  85. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/tests/__init__.py +0 -0
  86. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/tests/core/conftest.py +0 -0
  87. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/tests/core/create_diff_input.json +0 -0
  88. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/tests/core/test_diff_alerts.py +0 -0
  89. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/tests/core/test_diff_generation.py +0 -0
  90. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/tests/core/test_facts_compression.py +0 -0
  91. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/tests/core/test_has_manifest_files.py +0 -0
  92. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/tests/core/test_package_and_alerts.py +0 -0
  93. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/tests/core/test_sdk_methods.py +0 -0
  94. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/tests/core/test_supporting_methods.py +0 -0
  95. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/tests/data/fullscans/create_response.json +0 -0
  96. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/tests/data/fullscans/diff/stream_diff.json +0 -0
  97. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/tests/data/fullscans/diff/stream_diff_full.json +0 -0
  98. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/tests/data/fullscans/head_scan/metadata.json +0 -0
  99. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/tests/data/fullscans/head_scan/stream_scan.json +0 -0
  100. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/tests/data/fullscans/head_scan/stream_scan_full.json +0 -0
  101. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/tests/data/fullscans/new_scan/metadata.json +0 -0
  102. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/tests/data/fullscans/new_scan/stream_scan.json +0 -0
  103. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/tests/data/repos/repo_info_error.json +0 -0
  104. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/tests/data/repos/repo_info_no_head.json +0 -0
  105. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/tests/data/repos/repo_info_success.json +0 -0
  106. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/tests/data/settings/security-policy.json +0 -0
  107. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/tests/e2e/fixtures/simple-npm/index.js +0 -0
  108. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/tests/e2e/fixtures/simple-npm/package.json +0 -0
  109. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/tests/e2e/fixtures/simple-pypi/requirements.txt +0 -0
  110. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/tests/e2e/validate-gitlab.sh +0 -0
  111. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/tests/e2e/validate-json.sh +0 -0
  112. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/tests/e2e/validate-reachability.sh +0 -0
  113. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/tests/e2e/validate-sarif.sh +0 -0
  114. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/tests/e2e/validate-scan.sh +0 -0
  115. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/tests/fixtures/fossa/README.md +0 -0
  116. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/tests/fixtures/fossa/fossa-analyze-empty.json +0 -0
  117. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/tests/fixtures/fossa/fossa-analyze-populated.json +0 -0
  118. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/tests/fixtures/fossa/fossa-sbom-empty-deep.json +0 -0
  119. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/tests/fixtures/fossa/fossa-sbom-populated.json +0 -0
  120. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/tests/unit/__init__.py +0 -0
  121. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/tests/unit/test_alert_selection.py +0 -0
  122. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/tests/unit/test_cli_config.py +0 -0
  123. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/tests/unit/test_client.py +0 -0
  124. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/tests/unit/test_config.py +0 -0
  125. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/tests/unit/test_dependency_overview.py +0 -0
  126. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/tests/unit/test_disable_ignore.py +0 -0
  127. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/tests/unit/test_exclude_paths.py +0 -0
  128. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/tests/unit/test_fossa_compat.py +0 -0
  129. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/tests/unit/test_fossa_parity.py +0 -0
  130. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/tests/unit/test_gitlab_auth.py +0 -0
  131. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/tests/unit/test_gitlab_auth_fallback.py +0 -0
  132. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/tests/unit/test_gitlab_commit_status.py +0 -0
  133. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/tests/unit/test_gitlab_format.py +0 -0
  134. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/tests/unit/test_ignore_telemetry_filtering.py +0 -0
  135. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/tests/unit/test_output.py +0 -0
  136. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/tests/unit/test_reachability.py +0 -0
  137. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/tests/unit/test_slack_plugin.py +0 -0
  138. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/tests/unit/test_socketcli.py +0 -0
  139. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/tests/unit/test_tier1_finalize.py +0 -0
  140. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/workflows/bitbucket-pipelines.yml +0 -0
  141. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/workflows/buildkite.yml +0 -0
  142. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/workflows/github-actions.yml +0 -0
  143. {socketsecurity-2.4.5 → socketsecurity-2.4.6}/workflows/gitlab-ci.yml +0 -0
@@ -1,5 +1,20 @@
1
1
  # Changelog
2
2
 
3
+ ## 2.4.6
4
+
5
+ ### Docs: reachability reference corrections
6
+
7
+ - Documented the `uv` and Enterprise-plan prerequisites the CLI enforces **before** running
8
+ reachability (exit code 3 if unmet), and clarified that per-ecosystem build toolchains
9
+ (JDK / .NET / Go / a compatible Python interpreter) are checked by the analysis engine at
10
+ runtime, not pre-checked by the CLI.
11
+ - Corrected the `--reach-min-severity` values to `info, low, moderate, high, critical`.
12
+ - Documented the previously-undocumented reachability flags: `--reach-enable-analysis-splitting`,
13
+ `--reach-detailed-analysis-log-file`, `--reach-lazy-mode`, and `--reach-use-only-pregenerated-sboms`.
14
+ - Clarified that `--only-facts-file` submits only the facts file when **creating** the full scan
15
+ (it does not require a pre-existing scan).
16
+ - Documentation-only; no functional code changes.
17
+
3
18
  ## 2.4.5
4
19
 
5
20
  ### Changed: Bump required SDK version to `>=3.2.1`
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: socketsecurity
3
- Version: 2.4.5
3
+ Version: 2.4.6
4
4
  Summary: Socket Security CLI for CI/CD
5
5
  Project-URL: Homepage, https://socket.dev
6
6
  Author-email: Douglas Coburn <douglas@socket.dev>
@@ -154,7 +154,8 @@ socketcli [-h] [--api-token API_TOKEN] [--repo REPO] [--workspace WORKSPACE] [--
154
154
  [--ignore-commit-files] [--disable-blocking] [--disable-ignore] [--enable-diff] [--scm SCM] [--timeout TIMEOUT] [--include-module-folders]
155
155
  [--reach] [--reach-version REACH_VERSION] [--reach-analysis-timeout REACH_ANALYSIS_TIMEOUT]
156
156
  [--reach-analysis-memory-limit REACH_ANALYSIS_MEMORY_LIMIT] [--reach-concurrency REACH_CONCURRENCY] [--reach-ecosystems REACH_ECOSYSTEMS]
157
- [--reach-min-severity {low,medium,high,critical}] [--reach-skip-cache] [--reach-disable-analytics] [--reach-debug] [--reach-disable-external-tool-checks]
157
+ [--reach-min-severity <level>] [--reach-skip-cache] [--reach-disable-analytics] [--reach-enable-analysis-splitting] [--reach-detailed-analysis-log-file]
158
+ [--reach-lazy-mode] [--reach-use-only-pregenerated-sboms] [--reach-debug] [--reach-disable-external-tool-checks]
158
159
  [--reach-output-file REACH_OUTPUT_FILE] [--only-facts-file] [--version]
159
160
  ````
160
161
 
@@ -238,25 +239,35 @@ If you don't want to provide the Socket API Token every time then you can use th
238
239
  #### Reachability Analysis
239
240
  | Parameter | Required | Default | Description |
240
241
  |:---------------------------------|:---------|:--------|:---------------------------------------------------------------------------------------------------------------------------|
241
- | `--reach` | False | False | Enable reachability analysis to identify which vulnerable functions are actually called by your code |
242
+ | `--reach` | False | False | Enable reachability analysis to identify which vulnerable functions are actually called by your code. Creates a tier-1 full-application reachability scan (`scan_type=socket_tier1`). |
242
243
  | `--reach-version` | False | latest | Version of @coana-tech/cli to use for analysis |
243
244
  | `--reach-analysis-timeout` | False | *coana* | Timeout in seconds for the reachability analysis. Omitted by default, so coana applies its own (currently 600s). Alias: `--reach-timeout` |
244
245
  | `--reach-analysis-memory-limit` | False | *coana* | Memory limit in MB for the reachability analysis. Omitted by default, so coana applies its own (currently 8192). Alias: `--reach-memory-limit` |
245
246
  | `--reach-concurrency` | False | *coana* | Control parallel analysis execution (must be >= 1). Omitted by default, so coana applies its own (currently 1) |
246
247
  | `--reach-additional-params` | False | | Pass custom parameters to the coana CLI tool |
247
248
  | `--reach-ecosystems` | False | | Comma-separated list of ecosystems to analyze (e.g., "npm,pypi"). If not specified, all supported ecosystems are analyzed |
248
- | `--reach-min-severity` | False | | Minimum severity level for reporting reachability results (low, medium, high, critical) |
249
+ | `--reach-min-severity` | False | | Minimum severity level for reporting reachability results (info, low, moderate, high, critical) |
249
250
  | `--reach-skip-cache` | False | False | Skip cache and force fresh reachability analysis |
250
251
  | `--reach-disable-analytics` | False | False | Disable analytics collection during reachability analysis |
252
+ | `--reach-enable-analysis-splitting` | False | False | Enable analysis splitting/bucketing (a legacy performance feature). Splitting is disabled by default. |
253
+ | `--reach-detailed-analysis-log-file` | False | False | Write a detailed analysis log file; its path is printed to stdout |
254
+ | `--reach-lazy-mode` | False | False | Enable lazy mode (experimental performance feature) |
255
+ | `--reach-use-only-pregenerated-sboms` | False | False | Build the scan only from pre-generated CycloneDX (CDX) and SPDX files in your project (requires --reach) |
251
256
  | `--reach-debug` | False | False | Enable coana debug output (`--debug`) for the analysis, independent of the global `--enable-debug` |
252
257
  | `--reach-disable-external-tool-checks` | False | False | Disable coana's external tool availability checks (passes `--disable-external-tool-checks`) |
253
258
  | `--reach-output-file` | False | .socket.facts.json | Path where reachability analysis results should be saved |
254
259
  | `--reach-exclude-paths` | False | | **[DEPRECATED — use `--exclude-paths`]** Comma-separated paths to exclude from reachability analysis. Still honored (unioned with `--exclude-paths`) but will be hidden in a future release |
255
- | `--only-facts-file` | False | False | Submit only the .socket.facts.json file to an existing scan (requires --reach and a prior scan) |
260
+ | `--only-facts-file` | False | False | Submit only the .socket.facts.json file when creating the full scan (requires --reach) |
256
261
 
257
262
  **Reachability Analysis Requirements:**
258
- - `npm` - Required to install and run @coana-tech/cli
259
- - `npx` - Required to execute @coana-tech/cli
263
+
264
+ The Python CLI verifies the following **up front** (before invoking the analysis engine) and exits with code **3** if any are unmet:
265
+ - `npm` - Required to install and run `@coana-tech/cli` (the analysis engine)
266
+ - `npx` - Required to execute `@coana-tech/cli`
267
+ - `uv` - Required by the analysis engine
268
+ - An **Enterprise** Socket organization plan (any `enterprise*` plan, including Enterprise trials)
269
+
270
+ Separately, the analysis engine (coana) needs the **per-ecosystem build toolchain** for whatever languages your project uses — e.g. a compatible Python interpreter (3.11+, or PyPy) for Python, a JDK for Java/Kotlin/Scala, .NET 6+ for C#, the matching Go toolchain for Go, etc. These are validated by the engine **at analysis time** (the CLI does not pre-check them) and that validation can be skipped with `--reach-disable-external-tool-checks`.
260
271
 
261
272
  ## Config file support
262
273
 
@@ -302,7 +313,7 @@ Sample config files:
302
313
 
303
314
  For CI-specific examples and guidance, see [`ci-cd.md`](ci-cd.md).
304
315
 
305
- The CLI will automatically install `@coana-tech/cli` if not present. Use `--reach` to enable reachability analysis during a full scan, or use `--only-facts-file` with `--reach` to submit reachability results to an existing scan.
316
+ The CLI will automatically install `@coana-tech/cli` if not present. Use `--reach` to enable reachability analysis during a full scan, or add `--only-facts-file` (with `--reach`) to submit only the reachability facts file (`.socket.facts.json`) when creating the full scan.
306
317
 
307
318
  #### Advanced Configuration
308
319
  | Parameter | Required | Default | Description |
@@ -6,7 +6,7 @@ build-backend = "hatchling.build"
6
6
 
7
7
  [project]
8
8
  name = "socketsecurity"
9
- version = "2.4.5"
9
+ version = "2.4.6"
10
10
  requires-python = ">= 3.11"
11
11
  license = {"file" = "LICENSE"}
12
12
  dependencies = [
@@ -1,3 +1,3 @@
1
1
  __author__ = 'socket.dev'
2
- __version__ = '2.4.5'
2
+ __version__ = '2.4.6'
3
3
  USER_AGENT = f'SocketPythonCLI/{__version__}'
@@ -556,11 +556,11 @@ wheels = [
556
556
 
557
557
  [[package]]
558
558
  name = "filelock"
559
- version = "3.20.3"
559
+ version = "3.29.1"
560
560
  source = { registry = "https://pypi.org/simple" }
561
- sdist = { url = "https://files.pythonhosted.org/packages/1d/65/ce7f1b70157833bf3cb851b556a37d4547ceafc158aa9b34b36782f23696/filelock-3.20.3.tar.gz", hash = "sha256:18c57ee915c7ec61cff0ecf7f0f869936c7c30191bb0cf406f1341778d0834e1", size = 19485, upload-time = "2026-01-09T17:55:05.421Z" }
561
+ sdist = { url = "https://files.pythonhosted.org/packages/1f/f9/f38573ed5844586db374d085911740a501ccfa373b455fc9413f09f85237/filelock-3.29.1.tar.gz", hash = "sha256:d97e6b1b9757569626c58caa07dc4beb1613f4a2938b1e8cc81afca398906c9e", size = 59335, upload-time = "2026-06-03T15:19:04.053Z" }
562
562
  wheels = [
563
- { url = "https://files.pythonhosted.org/packages/b5/36/7fb70f04bf00bc646cd5bb45aa9eddb15e19437a28b8fb2b4a5249fac770/filelock-3.20.3-py3-none-any.whl", hash = "sha256:4b0dda527ee31078689fc205ec4f1c1bf7d56cf88b6dc9426c4f230e46c2dce1", size = 16701, upload-time = "2026-01-09T17:55:04.334Z" },
563
+ { url = "https://files.pythonhosted.org/packages/4c/a0/614c5fe402fd88951df45f4dda2fa3b4e17a99ecd92340771929169b3b95/filelock-3.29.1-py3-none-any.whl", hash = "sha256:85199dfd706869641b72b2e8955d5416a4b2b7dc4b0e8e6d97b4cc1299a6983b", size = 40750, upload-time = "2026-06-03T15:19:02.959Z" },
564
564
  ]
565
565
 
566
566
  [[package]]
@@ -598,7 +598,7 @@ wheels = [
598
598
 
599
599
  [[package]]
600
600
  name = "hatch"
601
- version = "1.16.2"
601
+ version = "1.16.5"
602
602
  source = { registry = "https://pypi.org/simple" }
603
603
  dependencies = [
604
604
  { name = "backports-zstd", marker = "python_full_version < '3.14'" },
@@ -611,6 +611,7 @@ dependencies = [
611
611
  { name = "pexpect" },
612
612
  { name = "platformdirs" },
613
613
  { name = "pyproject-hooks" },
614
+ { name = "python-discovery" },
614
615
  { name = "rich" },
615
616
  { name = "shellingham" },
616
617
  { name = "tomli-w" },
@@ -619,9 +620,9 @@ dependencies = [
619
620
  { name = "uv" },
620
621
  { name = "virtualenv" },
621
622
  ]
622
- sdist = { url = "https://files.pythonhosted.org/packages/b9/c1/8598996a6f264d430c530799dc65fb13942fb29092e35505039a5f2fb5dc/hatch-1.16.2.tar.gz", hash = "sha256:f288938da85b4b90e47d94788e19e9976dcd6fd53b48343ea251a2a37256a980", size = 5216569, upload-time = "2025-12-06T19:18:12.596Z" }
623
+ sdist = { url = "https://files.pythonhosted.org/packages/d2/02/ce9c4c439fa3f195b21b4b5bb18b44d1076297c86477ef7e3d2de6064ec3/hatch-1.16.5.tar.gz", hash = "sha256:57bdeeaa72577859ce37091a5449583875331c06f9cb6af9077947ad40b3a1de", size = 5220741, upload-time = "2026-02-27T18:45:31.21Z" }
623
624
  wheels = [
624
- { url = "https://files.pythonhosted.org/packages/d4/7c/bbed5611b1cd7b0b42b2dadb0721d9ccfa4fa9d03abc05e0f57c85a319c6/hatch-1.16.2-py3-none-any.whl", hash = "sha256:827eaf9813c63119f172b85975c5c27110a2306b07e5304c9d38527b0239052a", size = 140658, upload-time = "2025-12-06T19:18:10.573Z" },
625
+ { url = "https://files.pythonhosted.org/packages/e4/8a/11ae7e271870f0ad8fa0012e4265982bebe0fdc21766b161fb8b8fc3aefc/hatch-1.16.5-py3-none-any.whl", hash = "sha256:d9b8047f2cd10d3349eb6e8f278ad728a04f91495aace305c257d5c2747188fb", size = 141269, upload-time = "2026-02-27T18:45:29.573Z" },
625
626
  ]
626
627
 
627
628
  [[package]]
@@ -795,11 +796,11 @@ wheels = [
795
796
 
796
797
  [[package]]
797
798
  name = "markdown"
798
- version = "3.10"
799
+ version = "3.10.2"
799
800
  source = { registry = "https://pypi.org/simple" }
800
- sdist = { url = "https://files.pythonhosted.org/packages/7d/ab/7dd27d9d863b3376fcf23a5a13cb5d024aed1db46f963f1b5735ae43b3be/markdown-3.10.tar.gz", hash = "sha256:37062d4f2aa4b2b6b32aefb80faa300f82cc790cb949a35b8caede34f2b68c0e", size = 364931, upload-time = "2025-11-03T19:51:15.007Z" }
801
+ sdist = { url = "https://files.pythonhosted.org/packages/2b/f4/69fa6ed85ae003c2378ffa8f6d2e3234662abd02c10d216c0ba96081a238/markdown-3.10.2.tar.gz", hash = "sha256:994d51325d25ad8aa7ce4ebaec003febcce822c3f8c911e3b17c52f7f589f950", size = 368805, upload-time = "2026-02-09T14:57:26.942Z" }
801
802
  wheels = [
802
- { url = "https://files.pythonhosted.org/packages/70/81/54e3ce63502cd085a0c556652a4e1b919c45a446bd1e5300e10c44c8c521/markdown-3.10-py3-none-any.whl", hash = "sha256:b5b99d6951e2e4948d939255596523444c0e677c669700b1d17aa4a8a464cb7c", size = 107678, upload-time = "2025-11-03T19:51:13.887Z" },
803
+ { url = "https://files.pythonhosted.org/packages/de/1f/77fa3081e4f66ca3576c896ae5d31c3002ac6607f9747d2e3aa49227e464/markdown-3.10.2-py3-none-any.whl", hash = "sha256:e91464b71ae3ee7afd3017d9f358ef0baf158fd9a298db92f1d4761133824c36", size = 108180, upload-time = "2026-02-09T14:57:25.787Z" },
803
804
  ]
804
805
 
805
806
  [[package]]
@@ -885,11 +886,11 @@ wheels = [
885
886
 
886
887
  [[package]]
887
888
  name = "packaging"
888
- version = "25.0"
889
+ version = "26.2"
889
890
  source = { registry = "https://pypi.org/simple" }
890
- sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload-time = "2025-04-19T11:48:59.673Z" }
891
+ sdist = { url = "https://files.pythonhosted.org/packages/d7/f1/e7a6dd94a8d4a5626c03e4e99c87f241ba9e350cd9e6d75123f992427270/packaging-26.2.tar.gz", hash = "sha256:ff452ff5a3e828ce110190feff1178bb1f2ea2281fa2075aadb987c2fb221661", size = 228134, upload-time = "2026-04-24T20:15:23.917Z" }
891
892
  wheels = [
892
- { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" },
893
+ { url = "https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl", hash = "sha256:5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e", size = 100195, upload-time = "2026-04-24T20:15:22.081Z" },
893
894
  ]
894
895
 
895
896
  [[package]]
@@ -933,7 +934,7 @@ wheels = [
933
934
 
934
935
  [[package]]
935
936
  name = "pre-commit"
936
- version = "4.5.1"
937
+ version = "4.6.0"
937
938
  source = { registry = "https://pypi.org/simple" }
938
939
  dependencies = [
939
940
  { name = "cfgv" },
@@ -942,9 +943,9 @@ dependencies = [
942
943
  { name = "pyyaml" },
943
944
  { name = "virtualenv" },
944
945
  ]
945
- sdist = { url = "https://files.pythonhosted.org/packages/40/f1/6d86a29246dfd2e9b6237f0b5823717f60cad94d47ddc26afa916d21f525/pre_commit-4.5.1.tar.gz", hash = "sha256:eb545fcff725875197837263e977ea257a402056661f09dae08e4b149b030a61", size = 198232, upload-time = "2025-12-16T21:14:33.552Z" }
946
+ sdist = { url = "https://files.pythonhosted.org/packages/8e/22/2de9408ac81acbb8a7d05d4cc064a152ccf33b3d480ebe0cd292153db239/pre_commit-4.6.0.tar.gz", hash = "sha256:718d2208cef53fdc38206e40524a6d4d9576d103eb16f0fec11c875e7716e9d9", size = 198525, upload-time = "2026-04-21T20:31:41.613Z" }
946
947
  wheels = [
947
- { url = "https://files.pythonhosted.org/packages/5d/19/fd3ef348460c80af7bb4669ea7926651d1f95c23ff2df18b9d24bab4f3fa/pre_commit-4.5.1-py2.py3-none-any.whl", hash = "sha256:3b3afd891e97337708c1674210f8eba659b52a38ea5f822ff142d10786221f77", size = 226437, upload-time = "2025-12-16T21:14:32.409Z" },
948
+ { url = "https://files.pythonhosted.org/packages/80/6e/4b28b62ecb6aae56769c34a8ff1d661473ec1e9519e2d5f8b2c150086b26/pre_commit-4.6.0-py2.py3-none-any.whl", hash = "sha256:e2cf246f7299edcabcf15f9b0571fdce06058527f0a06535068a86d38089f29b", size = 226472, upload-time = "2026-04-21T20:31:40.092Z" },
948
949
  ]
949
950
 
950
951
  [[package]]
@@ -1013,29 +1014,29 @@ wheels = [
1013
1014
 
1014
1015
  [[package]]
1015
1016
  name = "pytest-asyncio"
1016
- version = "1.3.0"
1017
+ version = "1.4.0"
1017
1018
  source = { registry = "https://pypi.org/simple" }
1018
1019
  dependencies = [
1019
1020
  { name = "pytest" },
1020
1021
  { name = "typing-extensions", marker = "python_full_version < '3.13'" },
1021
1022
  ]
1022
- sdist = { url = "https://files.pythonhosted.org/packages/90/2c/8af215c0f776415f3590cac4f9086ccefd6fd463befeae41cd4d3f193e5a/pytest_asyncio-1.3.0.tar.gz", hash = "sha256:d7f52f36d231b80ee124cd216ffb19369aa168fc10095013c6b014a34d3ee9e5", size = 50087, upload-time = "2025-11-10T16:07:47.256Z" }
1023
+ sdist = { url = "https://files.pythonhosted.org/packages/43/7c/d36d04db312ecf4298932ef77e6e4a9e8ad017906e24e34f0b0c361a2473/pytest_asyncio-1.4.0.tar.gz", hash = "sha256:c6c0d2259945122819f171a32ecea2c349ead889ee28176caaf492143424be42", size = 58514, upload-time = "2026-05-26T09:56:04.083Z" }
1023
1024
  wheels = [
1024
- { url = "https://files.pythonhosted.org/packages/e5/35/f8b19922b6a25bc0880171a2f1a003eaeb93657475193ab516fd87cac9da/pytest_asyncio-1.3.0-py3-none-any.whl", hash = "sha256:611e26147c7f77640e6d0a92a38ed17c3e9848063698d5c93d5aa7aa11cebff5", size = 15075, upload-time = "2025-11-10T16:07:45.537Z" },
1025
+ { url = "https://files.pythonhosted.org/packages/03/e2/08a497ef684b88559c9cc5f4ad53a37e7b99e727094a86d6ea32536d5d3c/pytest_asyncio-1.4.0-py3-none-any.whl", hash = "sha256:933ca923a23075a87fb7070c0ec272a6848489824d887c85c812670932835aa1", size = 16930, upload-time = "2026-05-26T09:56:02.576Z" },
1025
1026
  ]
1026
1027
 
1027
1028
  [[package]]
1028
1029
  name = "pytest-cov"
1029
- version = "7.0.0"
1030
+ version = "7.1.0"
1030
1031
  source = { registry = "https://pypi.org/simple" }
1031
1032
  dependencies = [
1032
1033
  { name = "coverage", extra = ["toml"] },
1033
1034
  { name = "pluggy" },
1034
1035
  { name = "pytest" },
1035
1036
  ]
1036
- sdist = { url = "https://files.pythonhosted.org/packages/5e/f7/c933acc76f5208b3b00089573cf6a2bc26dc80a8aece8f52bb7d6b1855ca/pytest_cov-7.0.0.tar.gz", hash = "sha256:33c97eda2e049a0c5298e91f519302a1334c26ac65c1a483d6206fd458361af1", size = 54328, upload-time = "2025-09-09T10:57:02.113Z" }
1037
+ sdist = { url = "https://files.pythonhosted.org/packages/b1/51/a849f96e117386044471c8ec2bd6cfebacda285da9525c9106aeb28da671/pytest_cov-7.1.0.tar.gz", hash = "sha256:30674f2b5f6351aa09702a9c8c364f6a01c27aae0c1366ae8016160d1efc56b2", size = 55592, upload-time = "2026-03-21T20:11:16.284Z" }
1037
1038
  wheels = [
1038
- { url = "https://files.pythonhosted.org/packages/ee/49/1377b49de7d0c1ce41292161ea0f721913fa8722c19fb9c1e3aa0367eecb/pytest_cov-7.0.0-py3-none-any.whl", hash = "sha256:3b8e9558b16cc1479da72058bdecf8073661c7f57f7d3c5f22a1c23507f2d861", size = 22424, upload-time = "2025-09-09T10:57:00.695Z" },
1039
+ { url = "https://files.pythonhosted.org/packages/9d/7a/d968e294073affff457b041c2be9868a40c1c71f4a35fcc1e45e5493067b/pytest_cov-7.1.0-py3-none-any.whl", hash = "sha256:a0461110b7865f9a271aa1b51e516c9a95de9d696734a2f71e3e78f46e1d4678", size = 22876, upload-time = "2026-03-21T20:11:14.438Z" },
1039
1040
  ]
1040
1041
 
1041
1042
  [[package]]
@@ -1062,6 +1063,19 @@ dependencies = [
1062
1063
  ]
1063
1064
  sdist = { url = "https://files.pythonhosted.org/packages/36/47/ab65fc1d682befc318c439940f81a0de1026048479f732e84fe714cd69c0/pytest-watch-4.2.0.tar.gz", hash = "sha256:06136f03d5b361718b8d0d234042f7b2f203910d8568f63df2f866b547b3d4b9", size = 16340, upload-time = "2018-05-20T19:52:16.194Z" }
1064
1065
 
1066
+ [[package]]
1067
+ name = "python-discovery"
1068
+ version = "1.4.0"
1069
+ source = { registry = "https://pypi.org/simple" }
1070
+ dependencies = [
1071
+ { name = "filelock" },
1072
+ { name = "platformdirs" },
1073
+ ]
1074
+ sdist = { url = "https://files.pythonhosted.org/packages/a6/12/38c1a0b1e64806780c9563e3fc9f6e472251839662587cfbe9bfaf2ae10a/python_discovery-1.4.0.tar.gz", hash = "sha256:eb8bc7daad3c226c147e45bb4e970a1feb1bf4048ee178e6db59e197b8010ce3", size = 68455, upload-time = "2026-05-28T01:15:37.639Z" }
1075
+ wheels = [
1076
+ { url = "https://files.pythonhosted.org/packages/c8/8d/3d316429f65029532bb1e28ff77b797d86b5ac3915bb44ca4e19aa283d43/python_discovery-1.4.0-py3-none-any.whl", hash = "sha256:26ed78d703e234879a66244c7d4114563fb13ec5cd30a2d1357e5fb4850782da", size = 33217, upload-time = "2026-05-28T01:15:36.573Z" },
1077
+ ]
1078
+
1065
1079
  [[package]]
1066
1080
  name = "python-dotenv"
1067
1081
  version = "1.2.2"
@@ -1151,7 +1165,7 @@ wheels = [
1151
1165
 
1152
1166
  [[package]]
1153
1167
  name = "requests"
1154
- version = "2.33.0"
1168
+ version = "2.34.2"
1155
1169
  source = { registry = "https://pypi.org/simple" }
1156
1170
  dependencies = [
1157
1171
  { name = "certifi" },
@@ -1159,9 +1173,9 @@ dependencies = [
1159
1173
  { name = "idna" },
1160
1174
  { name = "urllib3" },
1161
1175
  ]
1162
- sdist = { url = "https://files.pythonhosted.org/packages/34/64/8860370b167a9721e8956ae116825caff829224fbca0ca6e7bf8ddef8430/requests-2.33.0.tar.gz", hash = "sha256:c7ebc5e8b0f21837386ad0e1c8fe8b829fa5f544d8df3b2253bff14ef29d7652", size = 134232, upload-time = "2026-03-25T15:10:41.586Z" }
1176
+ sdist = { url = "https://files.pythonhosted.org/packages/ac/c3/e2a2b89f2d3e2179abd6d00ebd70bff6273f37fb3e0cc209f48b39d00cbf/requests-2.34.2.tar.gz", hash = "sha256:f288924cae4e29463698d6d60bc6a4da69c89185ad1e0bcc4104f584e960b9ed", size = 142856, upload-time = "2026-05-14T19:25:27.735Z" }
1163
1177
  wheels = [
1164
- { url = "https://files.pythonhosted.org/packages/56/5d/c814546c2333ceea4ba42262d8c4d55763003e767fa169adc693bd524478/requests-2.33.0-py3-none-any.whl", hash = "sha256:3324635456fa185245e24865e810cecec7b4caf933d7eb133dcde67d48cee69b", size = 65017, upload-time = "2026-03-25T15:10:40.382Z" },
1178
+ { url = "https://files.pythonhosted.org/packages/a0/f4/c67b0b3f1b9245e8d266f0f112c500d50e5b4e83cb6f3b71b6528104182a/requests-2.34.2-py3-none-any.whl", hash = "sha256:2a0d60c172f83ac6ab31e4554906c0f3b3588d37b5cb939b1c061f4907e278e0", size = 73075, upload-time = "2026-05-14T19:25:26.443Z" },
1165
1179
  ]
1166
1180
 
1167
1181
  [[package]]
@@ -1200,28 +1214,27 @@ wheels = [
1200
1214
 
1201
1215
  [[package]]
1202
1216
  name = "ruff"
1203
- version = "0.14.10"
1204
- source = { registry = "https://pypi.org/simple" }
1205
- sdist = { url = "https://files.pythonhosted.org/packages/57/08/52232a877978dd8f9cf2aeddce3e611b40a63287dfca29b6b8da791f5e8d/ruff-0.14.10.tar.gz", hash = "sha256:9a2e830f075d1a42cd28420d7809ace390832a490ed0966fe373ba288e77aaf4", size = 5859763, upload-time = "2025-12-18T19:28:57.98Z" }
1206
- wheels = [
1207
- { url = "https://files.pythonhosted.org/packages/60/01/933704d69f3f05ee16ef11406b78881733c186fe14b6a46b05cfcaf6d3b2/ruff-0.14.10-py3-none-linux_armv6l.whl", hash = "sha256:7a3ce585f2ade3e1f29ec1b92df13e3da262178df8c8bdf876f48fa0e8316c49", size = 13527080, upload-time = "2025-12-18T19:29:25.642Z" },
1208
- { url = "https://files.pythonhosted.org/packages/df/58/a0349197a7dfa603ffb7f5b0470391efa79ddc327c1e29c4851e85b09cc5/ruff-0.14.10-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:674f9be9372907f7257c51f1d4fc902cb7cf014b9980152b802794317941f08f", size = 13797320, upload-time = "2025-12-18T19:29:02.571Z" },
1209
- { url = "https://files.pythonhosted.org/packages/7b/82/36be59f00a6082e38c23536df4e71cdbc6af8d7c707eade97fcad5c98235/ruff-0.14.10-py3-none-macosx_11_0_arm64.whl", hash = "sha256:d85713d522348837ef9df8efca33ccb8bd6fcfc86a2cde3ccb4bc9d28a18003d", size = 12918434, upload-time = "2025-12-18T19:28:51.202Z" },
1210
- { url = "https://files.pythonhosted.org/packages/a6/00/45c62a7f7e34da92a25804f813ebe05c88aa9e0c25e5cb5a7d23dd7450e3/ruff-0.14.10-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6987ebe0501ae4f4308d7d24e2d0fe3d7a98430f5adfd0f1fead050a740a3a77", size = 13371961, upload-time = "2025-12-18T19:29:04.991Z" },
1211
- { url = "https://files.pythonhosted.org/packages/40/31/a5906d60f0405f7e57045a70f2d57084a93ca7425f22e1d66904769d1628/ruff-0.14.10-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:16a01dfb7b9e4eee556fbfd5392806b1b8550c9b4a9f6acd3dbe6812b193c70a", size = 13275629, upload-time = "2025-12-18T19:29:21.381Z" },
1212
- { url = "https://files.pythonhosted.org/packages/3e/60/61c0087df21894cf9d928dc04bcd4fb10e8b2e8dca7b1a276ba2155b2002/ruff-0.14.10-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7165d31a925b7a294465fa81be8c12a0e9b60fb02bf177e79067c867e71f8b1f", size = 14029234, upload-time = "2025-12-18T19:29:00.132Z" },
1213
- { url = "https://files.pythonhosted.org/packages/44/84/77d911bee3b92348b6e5dab5a0c898d87084ea03ac5dc708f46d88407def/ruff-0.14.10-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:c561695675b972effb0c0a45db233f2c816ff3da8dcfbe7dfc7eed625f218935", size = 15449890, upload-time = "2025-12-18T19:28:53.573Z" },
1214
- { url = "https://files.pythonhosted.org/packages/e9/36/480206eaefa24a7ec321582dda580443a8f0671fdbf6b1c80e9c3e93a16a/ruff-0.14.10-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4bb98fcbbc61725968893682fd4df8966a34611239c9fd07a1f6a07e7103d08e", size = 15123172, upload-time = "2025-12-18T19:29:23.453Z" },
1215
- { url = "https://files.pythonhosted.org/packages/5c/38/68e414156015ba80cef5473d57919d27dfb62ec804b96180bafdeaf0e090/ruff-0.14.10-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f24b47993a9d8cb858429e97bdf8544c78029f09b520af615c1d261bf827001d", size = 14460260, upload-time = "2025-12-18T19:29:27.808Z" },
1216
- { url = "https://files.pythonhosted.org/packages/b3/19/9e050c0dca8aba824d67cc0db69fb459c28d8cd3f6855b1405b3f29cc91d/ruff-0.14.10-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:59aabd2e2c4fd614d2862e7939c34a532c04f1084476d6833dddef4afab87e9f", size = 14229978, upload-time = "2025-12-18T19:29:11.32Z" },
1217
- { url = "https://files.pythonhosted.org/packages/51/eb/e8dd1dd6e05b9e695aa9dd420f4577debdd0f87a5ff2fedda33c09e9be8c/ruff-0.14.10-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:213db2b2e44be8625002dbea33bb9c60c66ea2c07c084a00d55732689d697a7f", size = 14338036, upload-time = "2025-12-18T19:29:09.184Z" },
1218
- { url = "https://files.pythonhosted.org/packages/6a/12/f3e3a505db7c19303b70af370d137795fcfec136d670d5de5391e295c134/ruff-0.14.10-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:b914c40ab64865a17a9a5b67911d14df72346a634527240039eb3bd650e5979d", size = 13264051, upload-time = "2025-12-18T19:29:13.431Z" },
1219
- { url = "https://files.pythonhosted.org/packages/08/64/8c3a47eaccfef8ac20e0484e68e0772013eb85802f8a9f7603ca751eb166/ruff-0.14.10-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:1484983559f026788e3a5c07c81ef7d1e97c1c78ed03041a18f75df104c45405", size = 13283998, upload-time = "2025-12-18T19:29:06.994Z" },
1220
- { url = "https://files.pythonhosted.org/packages/12/84/534a5506f4074e5cc0529e5cd96cfc01bb480e460c7edf5af70d2bcae55e/ruff-0.14.10-py3-none-musllinux_1_2_i686.whl", hash = "sha256:c70427132db492d25f982fffc8d6c7535cc2fd2c83fc8888f05caaa248521e60", size = 13601891, upload-time = "2025-12-18T19:28:55.811Z" },
1221
- { url = "https://files.pythonhosted.org/packages/0d/1e/14c916087d8598917dbad9b2921d340f7884824ad6e9c55de948a93b106d/ruff-0.14.10-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:5bcf45b681e9f1ee6445d317ce1fa9d6cba9a6049542d1c3d5b5958986be8830", size = 14336660, upload-time = "2025-12-18T19:29:16.531Z" },
1222
- { url = "https://files.pythonhosted.org/packages/f2/1c/d7b67ab43f30013b47c12b42d1acd354c195351a3f7a1d67f59e54227ede/ruff-0.14.10-py3-none-win32.whl", hash = "sha256:104c49fc7ab73f3f3a758039adea978869a918f31b73280db175b43a2d9b51d6", size = 13196187, upload-time = "2025-12-18T19:29:19.006Z" },
1223
- { url = "https://files.pythonhosted.org/packages/fb/9c/896c862e13886fae2af961bef3e6312db9ebc6adc2b156fe95e615dee8c1/ruff-0.14.10-py3-none-win_amd64.whl", hash = "sha256:466297bd73638c6bdf06485683e812db1c00c7ac96d4ddd0294a338c62fdc154", size = 14661283, upload-time = "2025-12-18T19:29:30.16Z" },
1224
- { url = "https://files.pythonhosted.org/packages/74/31/b0e29d572670dca3674eeee78e418f20bdf97fa8aa9ea71380885e175ca0/ruff-0.14.10-py3-none-win_arm64.whl", hash = "sha256:e51d046cf6dda98a4633b8a8a771451107413b0f07183b2bef03f075599e44e6", size = 13729839, upload-time = "2025-12-18T19:28:48.636Z" },
1217
+ version = "0.15.14"
1218
+ source = { registry = "https://pypi.org/simple" }
1219
+ sdist = { url = "https://files.pythonhosted.org/packages/dc/8a/8bce2894573e9dae6ff4d77fe34ad727d79b9e6238ad288c5638990d90f6/ruff-0.15.14.tar.gz", hash = "sha256:48e866b165be4a9bdbf310f7d3c9a07edef2fe8cd63ffeb4e00bb590506ebf9f", size = 4700910, upload-time = "2026-05-21T14:34:55.177Z" }
1220
+ wheels = [
1221
+ { url = "https://files.pythonhosted.org/packages/b9/c8/74a92c6ff9fcfb4f1f947126d3ebee8389276e161ecc85de5bda7cda51bd/ruff-0.15.14-py3-none-linux_armv6l.whl", hash = "sha256:8dd2db9416e487c8d4b01fa7056bb02c4d05969d4f8d17a08c229c2f4ff3c108", size = 10739177, upload-time = "2026-05-21T14:34:37.332Z" },
1222
+ { url = "https://files.pythonhosted.org/packages/45/91/254a35c20acc38a7223c9d2d594af12e794432464f2cdeb52af1dc4a892d/ruff-0.15.14-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:be4ff55af755bd71a00ab3dc6bd7ffc467bd76e0df6881e286c2e3d23e8fb43b", size = 11144969, upload-time = "2026-05-21T14:34:43.978Z" },
1223
+ { url = "https://files.pythonhosted.org/packages/56/9e/d13e40f83b8d0a94430e6778ce1d94a43b38cf2efe63278bdd2b4c65abbf/ruff-0.15.14-py3-none-macosx_11_0_arm64.whl", hash = "sha256:48d5909d7d06276ce7dde6d32bfa4b0d4cb2651145cd8ee4b440722cbc77832f", size = 10478207, upload-time = "2026-05-21T14:34:48.378Z" },
1224
+ { url = "https://files.pythonhosted.org/packages/8d/f1/b15a7839fa4f332f8acec78e20564f26bb2d866e3d21710b877fd0263000/ruff-0.15.14-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca8cbfa94c4f90984a67561978602746d4cd27103568f745fa90eee3f0d4107d", size = 10818459, upload-time = "2026-05-21T14:34:22.318Z" },
1225
+ { url = "https://files.pythonhosted.org/packages/45/33/53d651177f84f94b400a0e27f8824eeada3dddc9d5ee8aeb048f4352a520/ruff-0.15.14-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9a6bbc0333f1ab053423bcbf6226477d266ca7cec7738c4c8e3f55647803f3c4", size = 10541800, upload-time = "2026-05-21T14:34:20.209Z" },
1226
+ { url = "https://files.pythonhosted.org/packages/b8/a6/868f87e0bf9786ed24b5d0d0ad8676b8a94fd1912f42cddf9cfc7857818a/ruff-0.15.14-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8a24a4f7605d7003a6674d4387651effd939dead3fddd0f36561eb77a9a2e542", size = 11342149, upload-time = "2026-05-21T14:34:46.365Z" },
1227
+ { url = "https://files.pythonhosted.org/packages/a7/8b/38cd5c19faffdcc05a408d2b78edccc69492ab9720eadb49ea15ef80d768/ruff-0.15.14-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:049b5326e53ed80978f2fc041a280603f69dd6b0c95464342a2bb4572d9d9e2f", size = 12212563, upload-time = "2026-05-21T14:34:28.579Z" },
1228
+ { url = "https://files.pythonhosted.org/packages/3e/4d/a3c5b874a556d5731e3e657aaf04311bb76f0a5c3ec220ed43051be6b64b/ruff-0.15.14-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d4ed42e6696c8dfa5f06728e6441993901f548eb92d73bc472cb5a38d1395fbf", size = 11493299, upload-time = "2026-05-21T14:34:41.836Z" },
1229
+ { url = "https://files.pythonhosted.org/packages/1e/c0/56472c251d09858a53e51efbd485b09e1995d8731668b76d52e5dd6ee0f1/ruff-0.15.14-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:715c543cf450c4888251f91c52f1942a800541d9bddd7ac060aa4e6b77ae7cba", size = 11455931, upload-time = "2026-05-21T14:34:57.276Z" },
1230
+ { url = "https://files.pythonhosted.org/packages/2c/4a/e2e7b4d8dbf233d4eace59c75bc3435fa6d8bd3bae82d351d4e4300c0fd1/ruff-0.15.14-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:72ebab6013ec887d439d8b7593737a0a4ffb06d45d209d4e4bf2e92813082d3f", size = 11400794, upload-time = "2026-05-21T14:34:39.773Z" },
1231
+ { url = "https://files.pythonhosted.org/packages/97/c7/83c0539fe34c3e09136204d1e75d6052492364e0b3cb05e9465423f567d7/ruff-0.15.14-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:49072d36abdbe97a8dd7f480afe9c675699c0c495d4c84076e2c1203c4550581", size = 10804759, upload-time = "2026-05-21T14:34:31.045Z" },
1232
+ { url = "https://files.pythonhosted.org/packages/86/a6/18f2bfc095a2ab4a78745644e428205532ce6653a5d0fa8501572891534d/ruff-0.15.14-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:958522aee105068640c2c2ceae08f413ae44d922f52a1374ac13d6a96032fc93", size = 10539517, upload-time = "2026-05-21T14:34:53.064Z" },
1233
+ { url = "https://files.pythonhosted.org/packages/54/3a/5a8b3b69c654d4e4bf1d246ac5b49cbcdac6eaab6905925f8915f31e3b80/ruff-0.15.14-py3-none-musllinux_1_2_i686.whl", hash = "sha256:f3707da619a143a2e8830e2abab8224478d69ace2d28cb6c20543ae97c36bf61", size = 11065169, upload-time = "2026-05-21T14:34:24.484Z" },
1234
+ { url = "https://files.pythonhosted.org/packages/ed/c5/8864e4e7925b836ea354b31d57641ec03830564e281a8b6f061f8c3e0ec1/ruff-0.15.14-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:bb01d645694e3ec0102105d07ef2d53703970407d59c04e59d3ba0b7a1d53553", size = 11560214, upload-time = "2026-05-21T14:34:50.975Z" },
1235
+ { url = "https://files.pythonhosted.org/packages/36/38/012bf76752e1f89ed50b77b99532d90f3a3e287bc7918e1fc0948ac866ac/ruff-0.15.14-py3-none-win32.whl", hash = "sha256:6d0c1ad2a0ab718d39b6d8fd2217981ce4d625cd96a720095f798fb47d8b13e6", size = 10805548, upload-time = "2026-05-21T14:34:33.453Z" },
1236
+ { url = "https://files.pythonhosted.org/packages/d1/b7/4ea2c170f10ad760fff2a5250beb18897719dc8b52b53a24cddbb9dd3f19/ruff-0.15.14-py3-none-win_amd64.whl", hash = "sha256:802342981e056db3851a7836e5b070f8f15f67d4a685ae2a6160939d364b2902", size = 11939523, upload-time = "2026-05-21T14:34:18.077Z" },
1237
+ { url = "https://files.pythonhosted.org/packages/62/d5/bc97ff895ec35cf3925d4bd60f3b39d822f377a446906ec9bcc87405e59b/ruff-0.15.14-py3-none-win_arm64.whl", hash = "sha256:ff47b90a9ef6a40c9e2f3b479c1fb78531adf055b94c1eba0a7ba04b31951826", size = 11208607, upload-time = "2026-05-21T14:34:26.525Z" },
1225
1238
  ]
1226
1239
 
1227
1240
  [[package]]
@@ -1270,7 +1283,7 @@ wheels = [
1270
1283
 
1271
1284
  [[package]]
1272
1285
  name = "socketsecurity"
1273
- version = "2.4.5"
1286
+ version = "2.4.6"
1274
1287
  source = { editable = "." }
1275
1288
  dependencies = [
1276
1289
  { name = "brotli", marker = "platform_python_implementation == 'CPython'" },
@@ -1499,16 +1512,17 @@ wheels = [
1499
1512
 
1500
1513
  [[package]]
1501
1514
  name = "virtualenv"
1502
- version = "20.36.1"
1515
+ version = "21.4.2"
1503
1516
  source = { registry = "https://pypi.org/simple" }
1504
1517
  dependencies = [
1505
1518
  { name = "distlib" },
1506
1519
  { name = "filelock" },
1507
1520
  { name = "platformdirs" },
1521
+ { name = "python-discovery" },
1508
1522
  ]
1509
- sdist = { url = "https://files.pythonhosted.org/packages/aa/a3/4d310fa5f00863544e1d0f4de93bddec248499ccf97d4791bc3122c9d4f3/virtualenv-20.36.1.tar.gz", hash = "sha256:8befb5c81842c641f8ee658481e42641c68b5eab3521d8e092d18320902466ba", size = 6032239, upload-time = "2026-01-09T18:21:01.296Z" }
1523
+ sdist = { url = "https://files.pythonhosted.org/packages/e1/0d/4e93c8e6d1001a75763f87d8f5ecda8ebc7f4aa2153dddfaf4ae8892821a/virtualenv-21.4.2.tar.gz", hash = "sha256:38e6ee0a555615c0ea9da2ac7e9998fe8dc3b911dd33ad8eaad2020957653b0c", size = 7613326, upload-time = "2026-05-31T17:01:22.827Z" }
1510
1524
  wheels = [
1511
- { url = "https://files.pythonhosted.org/packages/6a/2a/dc2228b2888f51192c7dc766106cd475f1b768c10caaf9727659726f7391/virtualenv-20.36.1-py3-none-any.whl", hash = "sha256:575a8d6b124ef88f6f51d56d656132389f961062a9177016a50e4f507bbcc19f", size = 6008258, upload-time = "2026-01-09T18:20:59.425Z" },
1525
+ { url = "https://files.pythonhosted.org/packages/bf/c4/557dc082be035381b85fdb2b74e21d3d21b57750b74f2b47a32f3a639ff9/virtualenv-21.4.2-py3-none-any.whl", hash = "sha256:854210ca524a1a4d0d744734f4acbc721c3ffe163b85bbf5d56d14d5ae2f0fae", size = 7594079, upload-time = "2026-05-31T17:01:20.735Z" },
1512
1526
  ]
1513
1527
 
1514
1528
  [[package]]
File without changes
File without changes
File without changes