skilltotal 0.78.0__tar.gz → 0.78.1__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 (76) hide show
  1. {skilltotal-0.78.0/skilltotal.egg-info → skilltotal-0.78.1}/PKG-INFO +5 -5
  2. {skilltotal-0.78.0 → skilltotal-0.78.1}/README.md +4 -4
  3. {skilltotal-0.78.0 → skilltotal-0.78.1}/skilltotal/__init__.py +1 -1
  4. {skilltotal-0.78.0 → skilltotal-0.78.1}/skilltotal/collector.py +11 -1
  5. {skilltotal-0.78.0 → skilltotal-0.78.1/skilltotal.egg-info}/PKG-INFO +5 -5
  6. {skilltotal-0.78.0 → skilltotal-0.78.1}/LICENSE +0 -0
  7. {skilltotal-0.78.0 → skilltotal-0.78.1}/MANIFEST.in +0 -0
  8. {skilltotal-0.78.0 → skilltotal-0.78.1}/pyproject.toml +0 -0
  9. {skilltotal-0.78.0 → skilltotal-0.78.1}/setup.cfg +0 -0
  10. {skilltotal-0.78.0 → skilltotal-0.78.1}/skilltotal/__main__.py +0 -0
  11. {skilltotal-0.78.0 → skilltotal-0.78.1}/skilltotal/agent_hook.py +0 -0
  12. {skilltotal-0.78.0 → skilltotal-0.78.1}/skilltotal/agent_skill.py +0 -0
  13. {skilltotal-0.78.0 → skilltotal-0.78.1}/skilltotal/autorun.py +0 -0
  14. {skilltotal-0.78.0 → skilltotal-0.78.1}/skilltotal/baseline.py +0 -0
  15. {skilltotal-0.78.0 → skilltotal-0.78.1}/skilltotal/bounded_json.py +0 -0
  16. {skilltotal-0.78.0 → skilltotal-0.78.1}/skilltotal/capabilities.py +0 -0
  17. {skilltotal-0.78.0 → skilltotal-0.78.1}/skilltotal/cli.py +0 -0
  18. {skilltotal-0.78.0 → skilltotal-0.78.1}/skilltotal/combinations.py +0 -0
  19. {skilltotal-0.78.0 → skilltotal-0.78.1}/skilltotal/concat_normalize.py +0 -0
  20. {skilltotal-0.78.0 → skilltotal-0.78.1}/skilltotal/config.py +0 -0
  21. {skilltotal-0.78.0 → skilltotal-0.78.1}/skilltotal/diff.py +0 -0
  22. {skilltotal-0.78.0 → skilltotal-0.78.1}/skilltotal/engine.py +0 -0
  23. {skilltotal-0.78.0 → skilltotal-0.78.1}/skilltotal/file_index.py +0 -0
  24. {skilltotal-0.78.0 → skilltotal-0.78.1}/skilltotal/guard.py +0 -0
  25. {skilltotal-0.78.0 → skilltotal-0.78.1}/skilltotal/hook_scan.py +0 -0
  26. {skilltotal-0.78.0 → skilltotal-0.78.1}/skilltotal/inventory.py +0 -0
  27. {skilltotal-0.78.0 → skilltotal-0.78.1}/skilltotal/loaded_code.py +0 -0
  28. {skilltotal-0.78.0 → skilltotal-0.78.1}/skilltotal/mcp_server.py +0 -0
  29. {skilltotal-0.78.0 → skilltotal-0.78.1}/skilltotal/models.py +0 -0
  30. {skilltotal-0.78.0 → skilltotal-0.78.1}/skilltotal/owasp.py +0 -0
  31. {skilltotal-0.78.0 → skilltotal-0.78.1}/skilltotal/parallel.py +0 -0
  32. {skilltotal-0.78.0 → skilltotal-0.78.1}/skilltotal/provenance.py +0 -0
  33. {skilltotal-0.78.0 → skilltotal-0.78.1}/skilltotal/report.py +0 -0
  34. {skilltotal-0.78.0 → skilltotal-0.78.1}/skilltotal/rules.py +0 -0
  35. {skilltotal-0.78.0 → skilltotal-0.78.1}/skilltotal/sarif.py +0 -0
  36. {skilltotal-0.78.0 → skilltotal-0.78.1}/skilltotal/sbom.py +0 -0
  37. {skilltotal-0.78.0 → skilltotal-0.78.1}/skilltotal/scanners/__init__.py +0 -0
  38. {skilltotal-0.78.0 → skilltotal-0.78.1}/skilltotal/scanners/agent_approval.py +0 -0
  39. {skilltotal-0.78.0 → skilltotal-0.78.1}/skilltotal/scanners/agent_config.py +0 -0
  40. {skilltotal-0.78.0 → skilltotal-0.78.1}/skilltotal/scanners/base.py +0 -0
  41. {skilltotal-0.78.0 → skilltotal-0.78.1}/skilltotal/scanners/clipper.py +0 -0
  42. {skilltotal-0.78.0 → skilltotal-0.78.1}/skilltotal/scanners/dependency_redirect.py +0 -0
  43. {skilltotal-0.78.0 → skilltotal-0.78.1}/skilltotal/scanners/dynamic_code.py +0 -0
  44. {skilltotal-0.78.0 → skilltotal-0.78.1}/skilltotal/scanners/email_exfil.py +0 -0
  45. {skilltotal-0.78.0 → skilltotal-0.78.1}/skilltotal/scanners/encrypted_archive.py +0 -0
  46. {skilltotal-0.78.0 → skilltotal-0.78.1}/skilltotal/scanners/exposure.py +0 -0
  47. {skilltotal-0.78.0 → skilltotal-0.78.1}/skilltotal/scanners/filesystem.py +0 -0
  48. {skilltotal-0.78.0 → skilltotal-0.78.1}/skilltotal/scanners/install_scripts.py +0 -0
  49. {skilltotal-0.78.0 → skilltotal-0.78.1}/skilltotal/scanners/invisible_unicode.py +0 -0
  50. {skilltotal-0.78.0 → skilltotal-0.78.1}/skilltotal/scanners/mcp.py +0 -0
  51. {skilltotal-0.78.0 → skilltotal-0.78.1}/skilltotal/scanners/mcp_elicitation.py +0 -0
  52. {skilltotal-0.78.0 → skilltotal-0.78.1}/skilltotal/scanners/mcp_pinning.py +0 -0
  53. {skilltotal-0.78.0 → skilltotal-0.78.1}/skilltotal/scanners/network.py +0 -0
  54. {skilltotal-0.78.0 → skilltotal-0.78.1}/skilltotal/scanners/npm_supply.py +0 -0
  55. {skilltotal-0.78.0 → skilltotal-0.78.1}/skilltotal/scanners/oauth_auth.py +0 -0
  56. {skilltotal-0.78.0 → skilltotal-0.78.1}/skilltotal/scanners/obfuscation.py +0 -0
  57. {skilltotal-0.78.0 → skilltotal-0.78.1}/skilltotal/scanners/prompt_surface.py +0 -0
  58. {skilltotal-0.78.0 → skilltotal-0.78.1}/skilltotal/scanners/pth_exec.py +0 -0
  59. {skilltotal-0.78.0 → skilltotal-0.78.1}/skilltotal/scanners/python_ast.py +0 -0
  60. {skilltotal-0.78.0 → skilltotal-0.78.1}/skilltotal/scanners/scoped_identity.py +0 -0
  61. {skilltotal-0.78.0 → skilltotal-0.78.1}/skilltotal/scanners/secret_exfil.py +0 -0
  62. {skilltotal-0.78.0 → skilltotal-0.78.1}/skilltotal/scanners/secrets.py +0 -0
  63. {skilltotal-0.78.0 → skilltotal-0.78.1}/skilltotal/scanners/sensitive_paths.py +0 -0
  64. {skilltotal-0.78.0 → skilltotal-0.78.1}/skilltotal/scanners/shell_evasion.py +0 -0
  65. {skilltotal-0.78.0 → skilltotal-0.78.1}/skilltotal/scanners/shell_exec.py +0 -0
  66. {skilltotal-0.78.0 → skilltotal-0.78.1}/skilltotal/scanners/shell_script.py +0 -0
  67. {skilltotal-0.78.0 → skilltotal-0.78.1}/skilltotal/scanners/skill_fetch_exec.py +0 -0
  68. {skilltotal-0.78.0 → skilltotal-0.78.1}/skilltotal/scoring.py +0 -0
  69. {skilltotal-0.78.0 → skilltotal-0.78.1}/skilltotal/text_normalize.py +0 -0
  70. {skilltotal-0.78.0 → skilltotal-0.78.1}/skilltotal/traits.py +0 -0
  71. {skilltotal-0.78.0 → skilltotal-0.78.1}/skilltotal/typosquatting.py +0 -0
  72. {skilltotal-0.78.0 → skilltotal-0.78.1}/skilltotal.egg-info/SOURCES.txt +0 -0
  73. {skilltotal-0.78.0 → skilltotal-0.78.1}/skilltotal.egg-info/dependency_links.txt +0 -0
  74. {skilltotal-0.78.0 → skilltotal-0.78.1}/skilltotal.egg-info/entry_points.txt +0 -0
  75. {skilltotal-0.78.0 → skilltotal-0.78.1}/skilltotal.egg-info/requires.txt +0 -0
  76. {skilltotal-0.78.0 → skilltotal-0.78.1}/skilltotal.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: skilltotal
3
- Version: 0.78.0
3
+ Version: 0.78.1
4
4
  Summary: Static security scanner for npm and PyPI packages, MCP servers and agent skills. Runs locally, never runs the code, no LLM.
5
5
  Author: SkillTotal
6
6
  License-Expression: Apache-2.0
@@ -102,7 +102,7 @@ skilltotal scan npm:express # or pypi:name, a git URL, a folder, an archive
102
102
  ([full example with permissions](https://github.com/pezhik/skilltotal/blob/main/docs/ci.md)):
103
103
 
104
104
  ```yaml
105
- - uses: pezhik/skilltotal@v0.78.0
105
+ - uses: pezhik/skilltotal@v0.78.1
106
106
  with: { source: ., fail-on: high }
107
107
  ```
108
108
 
@@ -241,7 +241,7 @@ jobs:
241
241
  runs-on: ubuntu-latest
242
242
  steps:
243
243
  - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
244
- - uses: pezhik/skilltotal@v0.78.0
244
+ - uses: pezhik/skilltotal@v0.78.1
245
245
  with:
246
246
  source: . # a path, a git URL, or an npm:/pypi:<name> spec
247
247
  fail-on: high # fail on a high/critical risk finding (or 'none')
@@ -259,7 +259,7 @@ out on an existing repository. Anywhere else Python 3.10+ runs, install a pinned
259
259
  on the exit code (0 passed, 2 a gate tripped, 1 the scan could not run):
260
260
 
261
261
  ```bash
262
- pip install skilltotal==0.78.0 # in a virtual environment outside the checkout
262
+ pip install skilltotal==0.78.1 # in a virtual environment outside the checkout
263
263
  skilltotal scan . --fail-on high
264
264
  ```
265
265
 
@@ -317,7 +317,7 @@ With npx (it needs uv, pipx, or Python 3.11+ with `skilltotal` installed), name
317
317
  `--package` so npx does not run a `skilltotal` from the scanned repository's `node_modules/.bin`:
318
318
 
319
319
  ```bash
320
- npx -y --package=skilltotal@0.78.0 -- skilltotal scan https://github.com/owner/repo
320
+ npx -y --package=skilltotal@0.78.1 -- skilltotal scan https://github.com/owner/repo
321
321
  ```
322
322
 
323
323
  ## Measured, not asserted
@@ -61,7 +61,7 @@ skilltotal scan npm:express # or pypi:name, a git URL, a folder, an archive
61
61
  ([full example with permissions](https://github.com/pezhik/skilltotal/blob/main/docs/ci.md)):
62
62
 
63
63
  ```yaml
64
- - uses: pezhik/skilltotal@v0.78.0
64
+ - uses: pezhik/skilltotal@v0.78.1
65
65
  with: { source: ., fail-on: high }
66
66
  ```
67
67
 
@@ -200,7 +200,7 @@ jobs:
200
200
  runs-on: ubuntu-latest
201
201
  steps:
202
202
  - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
203
- - uses: pezhik/skilltotal@v0.78.0
203
+ - uses: pezhik/skilltotal@v0.78.1
204
204
  with:
205
205
  source: . # a path, a git URL, or an npm:/pypi:<name> spec
206
206
  fail-on: high # fail on a high/critical risk finding (or 'none')
@@ -218,7 +218,7 @@ out on an existing repository. Anywhere else Python 3.10+ runs, install a pinned
218
218
  on the exit code (0 passed, 2 a gate tripped, 1 the scan could not run):
219
219
 
220
220
  ```bash
221
- pip install skilltotal==0.78.0 # in a virtual environment outside the checkout
221
+ pip install skilltotal==0.78.1 # in a virtual environment outside the checkout
222
222
  skilltotal scan . --fail-on high
223
223
  ```
224
224
 
@@ -276,7 +276,7 @@ With npx (it needs uv, pipx, or Python 3.11+ with `skilltotal` installed), name
276
276
  `--package` so npx does not run a `skilltotal` from the scanned repository's `node_modules/.bin`:
277
277
 
278
278
  ```bash
279
- npx -y --package=skilltotal@0.78.0 -- skilltotal scan https://github.com/owner/repo
279
+ npx -y --package=skilltotal@0.78.1 -- skilltotal scan https://github.com/owner/repo
280
280
  ```
281
281
 
282
282
  ## Measured, not asserted
@@ -22,7 +22,7 @@ from skilltotal.models import (
22
22
  # REPORT_SCHEMA_VERSION: shape of Report.to_dict(); bumps only on schema changes.
23
23
  # RULESET_VERSION: integer counter of the detection ruleset; bumps when rules change, so a
24
24
  # consumer knows when re-scanning old reports may surface new findings.
25
- __version__ = "0.78.0"
25
+ __version__ = "0.78.1"
26
26
  ENGINE_VERSION = __version__
27
27
  REPORT_SCHEMA_VERSION = "1.9"
28
28
  RULESET_VERSION = 79
@@ -841,10 +841,20 @@ def _collect_remote(
841
841
  raise CollectionError(f"path '{subpath}' not found in repository {clone_url}")
842
842
  root = candidate
843
843
 
844
- component = detect_component(root, source=url)
844
+ # A whole repository is checked out into a temp folder named "repo": with no manifest to
845
+ # name it, the repository's own name stands in for that folder name.
846
+ default_name = None if subpath else _repo_name(clone_url)
847
+ component = detect_component(root, source=url, default_name=default_name)
845
848
  return SourceContext(root=root, component=component, _tempdir=tmp, note=note)
846
849
 
847
850
 
851
+ def _repo_name(clone_url: str) -> str | None:
852
+ """The repository name a clone URL ends in (``owner/name.git`` -> ``name``), if any."""
853
+ tail = re.split(r"[/:]", clone_url.strip().rstrip("/"))[-1]
854
+ tail = tail[:-4] if tail.lower().endswith(".git") else tail
855
+ return tail or None
856
+
857
+
848
858
  # --------------------------------------------------------------- package registries
849
859
 
850
860
  # A company registry mirror (Artifactory, Nexus, Verdaccio, devpi) to fetch `npm:` / `pypi:`
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: skilltotal
3
- Version: 0.78.0
3
+ Version: 0.78.1
4
4
  Summary: Static security scanner for npm and PyPI packages, MCP servers and agent skills. Runs locally, never runs the code, no LLM.
5
5
  Author: SkillTotal
6
6
  License-Expression: Apache-2.0
@@ -102,7 +102,7 @@ skilltotal scan npm:express # or pypi:name, a git URL, a folder, an archive
102
102
  ([full example with permissions](https://github.com/pezhik/skilltotal/blob/main/docs/ci.md)):
103
103
 
104
104
  ```yaml
105
- - uses: pezhik/skilltotal@v0.78.0
105
+ - uses: pezhik/skilltotal@v0.78.1
106
106
  with: { source: ., fail-on: high }
107
107
  ```
108
108
 
@@ -241,7 +241,7 @@ jobs:
241
241
  runs-on: ubuntu-latest
242
242
  steps:
243
243
  - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
244
- - uses: pezhik/skilltotal@v0.78.0
244
+ - uses: pezhik/skilltotal@v0.78.1
245
245
  with:
246
246
  source: . # a path, a git URL, or an npm:/pypi:<name> spec
247
247
  fail-on: high # fail on a high/critical risk finding (or 'none')
@@ -259,7 +259,7 @@ out on an existing repository. Anywhere else Python 3.10+ runs, install a pinned
259
259
  on the exit code (0 passed, 2 a gate tripped, 1 the scan could not run):
260
260
 
261
261
  ```bash
262
- pip install skilltotal==0.78.0 # in a virtual environment outside the checkout
262
+ pip install skilltotal==0.78.1 # in a virtual environment outside the checkout
263
263
  skilltotal scan . --fail-on high
264
264
  ```
265
265
 
@@ -317,7 +317,7 @@ With npx (it needs uv, pipx, or Python 3.11+ with `skilltotal` installed), name
317
317
  `--package` so npx does not run a `skilltotal` from the scanned repository's `node_modules/.bin`:
318
318
 
319
319
  ```bash
320
- npx -y --package=skilltotal@0.78.0 -- skilltotal scan https://github.com/owner/repo
320
+ npx -y --package=skilltotal@0.78.1 -- skilltotal scan https://github.com/owner/repo
321
321
  ```
322
322
 
323
323
  ## Measured, not asserted
File without changes
File without changes
File without changes
File without changes