dockerhub-api 1.3.7__tar.gz → 1.3.9__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.
- {dockerhub_api-1.3.7 → dockerhub_api-1.3.9}/PKG-INFO +9 -9
- {dockerhub_api-1.3.7 → dockerhub_api-1.3.9}/README.md +7 -7
- {dockerhub_api-1.3.7 → dockerhub_api-1.3.9}/dockerhub_api/__init__.py +1 -1
- {dockerhub_api-1.3.7 → dockerhub_api-1.3.9}/dockerhub_api/__main__.py +1 -1
- {dockerhub_api-1.3.7 → dockerhub_api-1.3.9}/dockerhub_api/api/api_client_auth.py +1 -1
- {dockerhub_api-1.3.7 → dockerhub_api-1.3.9}/dockerhub_api/api/api_client_base.py +3 -3
- {dockerhub_api-1.3.7 → dockerhub_api-1.3.9}/dockerhub_api/api/api_client_registry_base.py +2 -2
- {dockerhub_api-1.3.7 → dockerhub_api-1.3.9}/dockerhub_api/auth.py +7 -7
- {dockerhub_api-1.3.7 → dockerhub_api-1.3.9}/dockerhub_api/connector_sources.py +1 -1
- {dockerhub_api-1.3.7 → dockerhub_api-1.3.9}/dockerhub_api/kg_ingest.py +2 -2
- {dockerhub_api-1.3.7 → dockerhub_api-1.3.9}/dockerhub_api/mcp/__init__.py +1 -1
- {dockerhub_api-1.3.7 → dockerhub_api-1.3.9}/dockerhub_api/mcp_server.py +1 -1
- {dockerhub_api-1.3.7 → dockerhub_api-1.3.9}/dockerhub_api/ontology/__init__.py +2 -2
- {dockerhub_api-1.3.7 → dockerhub_api-1.3.9}/dockerhub_api/ontology/certification.json +2 -2
- {dockerhub_api-1.3.7 → dockerhub_api-1.3.9}/dockerhub_api/ontology/dockerhub.ttl +1 -1
- {dockerhub_api-1.3.7 → dockerhub_api-1.3.9}/dockerhub_api/skills/dockerhub-api-development/SKILL.md +1 -1
- {dockerhub_api-1.3.7 → dockerhub_api-1.3.9}/dockerhub_api/skills/dockerhub-image-registry-scout/SKILL.md +1 -1
- {dockerhub_api-1.3.7 → dockerhub_api-1.3.9}/dockerhub_api/skills/dockerhub-org-administration/SKILL.md +1 -1
- {dockerhub_api-1.3.7 → dockerhub_api-1.3.9}/dockerhub_api/skills/dockerhub-repository-management/SKILL.md +1 -1
- {dockerhub_api-1.3.7 → dockerhub_api-1.3.9}/dockerhub_api.egg-info/PKG-INFO +9 -9
- dockerhub_api-1.3.9/dockerhub_api.egg-info/entry_points.txt +5 -0
- {dockerhub_api-1.3.7 → dockerhub_api-1.3.9}/dockerhub_api.egg-info/requires.txt +1 -1
- {dockerhub_api-1.3.7 → dockerhub_api-1.3.9}/pyproject.toml +5 -5
- {dockerhub_api-1.3.7 → dockerhub_api-1.3.9}/tests/test_api_repositories.py +1 -1
- {dockerhub_api-1.3.7 → dockerhub_api-1.3.9}/tests/test_auth.py +1 -1
- {dockerhub_api-1.3.7 → dockerhub_api-1.3.9}/tests/test_dockerhub_mcp_validation.py +1 -1
- {dockerhub_api-1.3.7 → dockerhub_api-1.3.9}/tests/test_fleet_name.py +2 -2
- {dockerhub_api-1.3.7 → dockerhub_api-1.3.9}/tests/test_identity_namespace_scoping.py +2 -2
- {dockerhub_api-1.3.7 → dockerhub_api-1.3.9}/tests/test_kg_ingest.py +9 -5
- {dockerhub_api-1.3.7 → dockerhub_api-1.3.9}/tests/test_rate_limit.py +1 -1
- dockerhub_api-1.3.7/dockerhub_api.egg-info/entry_points.txt +0 -5
- {dockerhub_api-1.3.7 → dockerhub_api-1.3.9}/LICENSE +0 -0
- {dockerhub_api-1.3.7 → dockerhub_api-1.3.9}/dockerhub_api/api/__init__.py +0 -0
- {dockerhub_api-1.3.7 → dockerhub_api-1.3.9}/dockerhub_api/api/api_client_access_tokens.py +0 -0
- {dockerhub_api-1.3.7 → dockerhub_api-1.3.9}/dockerhub_api/api/api_client_audit_logs.py +0 -0
- {dockerhub_api-1.3.7 → dockerhub_api-1.3.9}/dockerhub_api/api/api_client_groups.py +0 -0
- {dockerhub_api-1.3.7 → dockerhub_api-1.3.9}/dockerhub_api/api/api_client_org_access_tokens.py +0 -0
- {dockerhub_api-1.3.7 → dockerhub_api-1.3.9}/dockerhub_api/api/api_client_orgs.py +0 -0
- {dockerhub_api-1.3.7 → dockerhub_api-1.3.9}/dockerhub_api/api/api_client_registry.py +0 -0
- {dockerhub_api-1.3.7 → dockerhub_api-1.3.9}/dockerhub_api/api/api_client_repositories.py +0 -0
- {dockerhub_api-1.3.7 → dockerhub_api-1.3.9}/dockerhub_api/api/api_client_scim.py +0 -0
- {dockerhub_api-1.3.7 → dockerhub_api-1.3.9}/dockerhub_api/api/api_client_scout.py +0 -0
- {dockerhub_api-1.3.7 → dockerhub_api-1.3.9}/dockerhub_api/api_client.py +0 -0
- {dockerhub_api-1.3.7 → dockerhub_api-1.3.9}/dockerhub_api/dockerhub_input_models.py +0 -0
- {dockerhub_api-1.3.7 → dockerhub_api-1.3.9}/dockerhub_api/dockerhub_response_models.py +0 -0
- {dockerhub_api-1.3.7 → dockerhub_api-1.3.9}/dockerhub_api/mcp/mcp_admin.py +0 -0
- {dockerhub_api-1.3.7 → dockerhub_api-1.3.9}/dockerhub_api/mcp/mcp_audit.py +0 -0
- {dockerhub_api-1.3.7 → dockerhub_api-1.3.9}/dockerhub_api/mcp/mcp_auth.py +0 -0
- {dockerhub_api-1.3.7 → dockerhub_api-1.3.9}/dockerhub_api/mcp/mcp_kg.py +0 -0
- {dockerhub_api-1.3.7 → dockerhub_api-1.3.9}/dockerhub_api/mcp/mcp_org.py +0 -0
- {dockerhub_api-1.3.7 → dockerhub_api-1.3.9}/dockerhub_api/mcp/mcp_registry.py +0 -0
- {dockerhub_api-1.3.7 → dockerhub_api-1.3.9}/dockerhub_api/mcp/mcp_repos.py +0 -0
- {dockerhub_api-1.3.7 → dockerhub_api-1.3.9}/dockerhub_api/mcp/mcp_scim.py +0 -0
- {dockerhub_api-1.3.7 → dockerhub_api-1.3.9}/dockerhub_api/mcp/mcp_scout.py +0 -0
- {dockerhub_api-1.3.7 → dockerhub_api-1.3.9}/dockerhub_api/mcp/mcp_teams.py +0 -0
- {dockerhub_api-1.3.7 → dockerhub_api-1.3.9}/dockerhub_api/mcp_config.json +0 -0
- {dockerhub_api-1.3.7 → dockerhub_api-1.3.9}/dockerhub_api/ontology/fixtures/records.json +0 -0
- {dockerhub_api-1.3.7 → dockerhub_api-1.3.9}/dockerhub_api/ontology/mappings/source.yaml +0 -0
- {dockerhub_api-1.3.7 → dockerhub_api-1.3.9}/dockerhub_api/ontology/migrations/manifest.json +0 -0
- {dockerhub_api-1.3.7 → dockerhub_api-1.3.9}/dockerhub_api/ontology/shapes/connector.shacl.ttl +0 -0
- {dockerhub_api-1.3.7 → dockerhub_api-1.3.9}/dockerhub_api/skills/dockerhub-api-operations/SKILL.md +0 -0
- {dockerhub_api-1.3.7 → dockerhub_api-1.3.9}/dockerhub_api/skills/dockerhub-api-operations/agents/openai.yaml +0 -0
- {dockerhub_api-1.3.7 → dockerhub_api-1.3.9}/dockerhub_api/skills/dockerhub-api-operations/references/catalog.md +0 -0
- {dockerhub_api-1.3.7 → dockerhub_api-1.3.9}/dockerhub_api/skills/dockerhub-image-registry-scout/WORKFLOW.md +0 -0
- {dockerhub_api-1.3.7 → dockerhub_api-1.3.9}/dockerhub_api/skills/dockerhub-org-administration/WORKFLOW.md +0 -0
- {dockerhub_api-1.3.7 → dockerhub_api-1.3.9}/dockerhub_api/skills/dockerhub-repository-management/WORKFLOW.md +0 -0
- {dockerhub_api-1.3.7 → dockerhub_api-1.3.9}/dockerhub_api.egg-info/SOURCES.txt +0 -0
- {dockerhub_api-1.3.7 → dockerhub_api-1.3.9}/dockerhub_api.egg-info/dependency_links.txt +0 -0
- {dockerhub_api-1.3.7 → dockerhub_api-1.3.9}/dockerhub_api.egg-info/top_level.txt +0 -0
- {dockerhub_api-1.3.7 → dockerhub_api-1.3.9}/setup.cfg +0 -0
- {dockerhub_api-1.3.7 → dockerhub_api-1.3.9}/tests/test_api_audit.py +0 -0
- {dockerhub_api-1.3.7 → dockerhub_api-1.3.9}/tests/test_api_org.py +0 -0
- {dockerhub_api-1.3.7 → dockerhub_api-1.3.9}/tests/test_api_registry.py +0 -0
- {dockerhub_api-1.3.7 → dockerhub_api-1.3.9}/tests/test_api_scim.py +0 -0
- {dockerhub_api-1.3.7 → dockerhub_api-1.3.9}/tests/test_api_scout.py +0 -0
- {dockerhub_api-1.3.7 → dockerhub_api-1.3.9}/tests/test_api_teams.py +0 -0
- {dockerhub_api-1.3.7 → dockerhub_api-1.3.9}/tests/test_api_tokens.py +0 -0
- {dockerhub_api-1.3.7 → dockerhub_api-1.3.9}/tests/test_api_wrapper.py +0 -0
- {dockerhub_api-1.3.7 → dockerhub_api-1.3.9}/tests/test_dockerhub_a2a_validation.py +0 -0
- {dockerhub_api-1.3.7 → dockerhub_api-1.3.9}/tests/test_init_dynamics.py +0 -0
- {dockerhub_api-1.3.7 → dockerhub_api-1.3.9}/tests/test_models.py +0 -0
- {dockerhub_api-1.3.7 → dockerhub_api-1.3.9}/tests/test_startup.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: dockerhub-api
|
|
3
|
-
Version: 1.3.
|
|
3
|
+
Version: 1.3.9
|
|
4
4
|
Summary: Docker Hub API + MCP Server
|
|
5
5
|
Author-email: Repository Maintainers <maintainers@knuckles.team>
|
|
6
6
|
License: MIT
|
|
@@ -12,7 +12,7 @@ Classifier: Programming Language :: Python :: 3
|
|
|
12
12
|
Requires-Python: <3.15,>=3.12
|
|
13
13
|
Description-Content-Type: text/markdown
|
|
14
14
|
License-File: LICENSE
|
|
15
|
-
Requires-Dist:
|
|
15
|
+
Requires-Dist: scion-sdk[mcp]<0.7.0,>=0.6.4
|
|
16
16
|
Requires-Dist: httpx>=0.28.1
|
|
17
17
|
Requires-Dist: python-dotenv>=1.2.4
|
|
18
18
|
Provides-Extra: test
|
|
@@ -91,7 +91,7 @@ multi-arch inspection, OCI referrers, and gated push/remove) and **Docker Scout*
|
|
|
91
91
|
- **Integrated Graph Agent:** Built-in Pydantic AI agent (`dockerhub-agent`) with
|
|
92
92
|
A2A and AG-UI web interfaces.
|
|
93
93
|
- **Native Telemetry & Tracing:** Out-of-the-box OpenTelemetry exports and Langfuse
|
|
94
|
-
tracing via
|
|
94
|
+
tracing via scion-sdk.
|
|
95
95
|
|
|
96
96
|
---
|
|
97
97
|
|
|
@@ -105,8 +105,8 @@ pip install "dockerhub-api[all]" # everything
|
|
|
105
105
|
|
|
106
106
|
| Extra | Adds |
|
|
107
107
|
|---|---|
|
|
108
|
-
| `mcp` | FastMCP server (`dockerhub-mcp`) via `
|
|
109
|
-
| `agent` | Pydantic-AI A2A agent (`dockerhub-agent`) + Logfire via `
|
|
108
|
+
| `mcp` | FastMCP server (`dockerhub-mcp`) via `scion-sdk` |
|
|
109
|
+
| `agent` | Pydantic-AI A2A agent (`dockerhub-agent`) + Logfire via `scion-sdk` |
|
|
110
110
|
| `all` | `mcp` + `agent` |
|
|
111
111
|
| `test` | pytest toolchain for development |
|
|
112
112
|
|
|
@@ -136,7 +136,7 @@ agent (`immutable agent digest`) with a co-located `:mcp` sidecar.
|
|
|
136
136
|
|
|
137
137
|
### Knowledge-graph database (`epistemic-graph`)
|
|
138
138
|
|
|
139
|
-
|
|
139
|
+
Scion SDK core dependency (`epistemic-graph[full]`). The `[mcp]` extra keeps
|
|
140
140
|
deployments can use the bundled engine. For production or shared state, run
|
|
141
141
|
**epistemic-graph as a dedicated database service** and configure the runtime to use it.
|
|
142
142
|
Deployment recipes (single-node + Raft HA), connection configuration, and architecture
|
|
@@ -258,7 +258,7 @@ _9 action-routed tool(s) (default) · 54 verbose 1:1 tool(s). Each is enabled un
|
|
|
258
258
|
<!-- MCP-CONFIG-EXAMPLES:START -->
|
|
259
259
|
|
|
260
260
|
> **Install the connector-focused `[mcp]` extra.** Examples use `dockerhub-api[mcp]` to add
|
|
261
|
-
> FastMCP / FastAPI through `
|
|
261
|
+
> FastMCP / FastAPI through `scion-sdk`; the required Scion SDK core
|
|
262
262
|
> still carries `epistemic-graph[full]`. The `[agent-runtime]` extra additionally
|
|
263
263
|
> enables model orchestration.
|
|
264
264
|
|
|
@@ -500,7 +500,7 @@ network transport, connector ingestion, Arbora delegation, or trace export.
|
|
|
500
500
|
| `SCOUTTOOL` | `True` | |
|
|
501
501
|
| `KGTOOL` | `True` | |
|
|
502
502
|
|
|
503
|
-
#### Inherited
|
|
503
|
+
#### Inherited scion-sdk variables (apply to every connector)
|
|
504
504
|
|
|
505
505
|
| Variable | Example | Description |
|
|
506
506
|
|----------|---------|-------------|
|
|
@@ -521,5 +521,5 @@ network transport, connector ingestion, Arbora delegation, or trace export.
|
|
|
521
521
|
| `MODEL_ID` | `gpt-4o` | Model id for the agent |
|
|
522
522
|
| `ENABLE_WEB_UI` | `True` | Serve the AG-UI web interface |
|
|
523
523
|
|
|
524
|
-
_36 package + 16 inherited variable(s). Auto-generated from `.env.example` + the shared
|
|
524
|
+
_36 package + 16 inherited variable(s). Auto-generated from `.env.example` + the shared scion-sdk set — do not edit._
|
|
525
525
|
<!-- ENV-VARS-TABLE:END -->
|
|
@@ -67,7 +67,7 @@ multi-arch inspection, OCI referrers, and gated push/remove) and **Docker Scout*
|
|
|
67
67
|
- **Integrated Graph Agent:** Built-in Pydantic AI agent (`dockerhub-agent`) with
|
|
68
68
|
A2A and AG-UI web interfaces.
|
|
69
69
|
- **Native Telemetry & Tracing:** Out-of-the-box OpenTelemetry exports and Langfuse
|
|
70
|
-
tracing via
|
|
70
|
+
tracing via scion-sdk.
|
|
71
71
|
|
|
72
72
|
---
|
|
73
73
|
|
|
@@ -81,8 +81,8 @@ pip install "dockerhub-api[all]" # everything
|
|
|
81
81
|
|
|
82
82
|
| Extra | Adds |
|
|
83
83
|
|---|---|
|
|
84
|
-
| `mcp` | FastMCP server (`dockerhub-mcp`) via `
|
|
85
|
-
| `agent` | Pydantic-AI A2A agent (`dockerhub-agent`) + Logfire via `
|
|
84
|
+
| `mcp` | FastMCP server (`dockerhub-mcp`) via `scion-sdk` |
|
|
85
|
+
| `agent` | Pydantic-AI A2A agent (`dockerhub-agent`) + Logfire via `scion-sdk` |
|
|
86
86
|
| `all` | `mcp` + `agent` |
|
|
87
87
|
| `test` | pytest toolchain for development |
|
|
88
88
|
|
|
@@ -112,7 +112,7 @@ agent (`immutable agent digest`) with a co-located `:mcp` sidecar.
|
|
|
112
112
|
|
|
113
113
|
### Knowledge-graph database (`epistemic-graph`)
|
|
114
114
|
|
|
115
|
-
|
|
115
|
+
Scion SDK core dependency (`epistemic-graph[full]`). The `[mcp]` extra keeps
|
|
116
116
|
deployments can use the bundled engine. For production or shared state, run
|
|
117
117
|
**epistemic-graph as a dedicated database service** and configure the runtime to use it.
|
|
118
118
|
Deployment recipes (single-node + Raft HA), connection configuration, and architecture
|
|
@@ -234,7 +234,7 @@ _9 action-routed tool(s) (default) · 54 verbose 1:1 tool(s). Each is enabled un
|
|
|
234
234
|
<!-- MCP-CONFIG-EXAMPLES:START -->
|
|
235
235
|
|
|
236
236
|
> **Install the connector-focused `[mcp]` extra.** Examples use `dockerhub-api[mcp]` to add
|
|
237
|
-
> FastMCP / FastAPI through `
|
|
237
|
+
> FastMCP / FastAPI through `scion-sdk`; the required Scion SDK core
|
|
238
238
|
> still carries `epistemic-graph[full]`. The `[agent-runtime]` extra additionally
|
|
239
239
|
> enables model orchestration.
|
|
240
240
|
|
|
@@ -476,7 +476,7 @@ network transport, connector ingestion, Arbora delegation, or trace export.
|
|
|
476
476
|
| `SCOUTTOOL` | `True` | |
|
|
477
477
|
| `KGTOOL` | `True` | |
|
|
478
478
|
|
|
479
|
-
#### Inherited
|
|
479
|
+
#### Inherited scion-sdk variables (apply to every connector)
|
|
480
480
|
|
|
481
481
|
| Variable | Example | Description |
|
|
482
482
|
|----------|---------|-------------|
|
|
@@ -497,5 +497,5 @@ network transport, connector ingestion, Arbora delegation, or trace export.
|
|
|
497
497
|
| `MODEL_ID` | `gpt-4o` | Model id for the agent |
|
|
498
498
|
| `ENABLE_WEB_UI` | `True` | Serve the AG-UI web interface |
|
|
499
499
|
|
|
500
|
-
_36 package + 16 inherited variable(s). Auto-generated from `.env.example` + the shared
|
|
500
|
+
_36 package + 16 inherited variable(s). Auto-generated from `.env.example` + the shared scion-sdk set — do not edit._
|
|
501
501
|
<!-- ENV-VARS-TABLE:END -->
|
|
@@ -100,7 +100,7 @@ def __dir__() -> list[str]:
|
|
|
100
100
|
return sorted(list(globals().keys()) + __all__)
|
|
101
101
|
|
|
102
102
|
|
|
103
|
-
from
|
|
103
|
+
from scion_sdk.connector import Connector
|
|
104
104
|
|
|
105
105
|
from dockerhub_api.api.api_client_registry import RegistryApi
|
|
106
106
|
from dockerhub_api.api.api_client_scout import ScoutApi
|
|
@@ -69,7 +69,7 @@ class DockerHubApiAuth(DockerHubApiBase):
|
|
|
69
69
|
return envelope
|
|
70
70
|
|
|
71
71
|
def _raise_for_status_envelope(self, envelope: dict[str, Any]) -> None:
|
|
72
|
-
from
|
|
72
|
+
from scion_sdk.exceptions import ApiError, AuthError
|
|
73
73
|
|
|
74
74
|
status_code = envelope["status_code"]
|
|
75
75
|
detail = ""
|
|
@@ -19,14 +19,14 @@ import time
|
|
|
19
19
|
from typing import Any
|
|
20
20
|
|
|
21
21
|
import httpx
|
|
22
|
-
from
|
|
22
|
+
from scion_sdk.exceptions import (
|
|
23
23
|
ApiError,
|
|
24
24
|
AuthError,
|
|
25
25
|
ParameterError,
|
|
26
26
|
UnauthorizedError,
|
|
27
27
|
)
|
|
28
|
-
from
|
|
29
|
-
from
|
|
28
|
+
from scion_sdk.tls.profile import ResolvedTLSProfile
|
|
29
|
+
from scion_sdk.tls.resolve import resolve_tls_profile
|
|
30
30
|
|
|
31
31
|
logger = logging.getLogger(__name__)
|
|
32
32
|
|
|
@@ -14,7 +14,7 @@ from dataclasses import dataclass
|
|
|
14
14
|
from typing import Any
|
|
15
15
|
|
|
16
16
|
import httpx
|
|
17
|
-
from
|
|
17
|
+
from scion_sdk.tls.profile import ResolvedTLSProfile
|
|
18
18
|
|
|
19
19
|
from dockerhub_api.api.api_client_base import (
|
|
20
20
|
JSON_CONTENT_TYPE,
|
|
@@ -299,7 +299,7 @@ class RegistryApiBase(DockerHubApiBase):
|
|
|
299
299
|
return envelope
|
|
300
300
|
|
|
301
301
|
def _raise_for_status_only(self, repo: str, suffix: str, status_code: int) -> None:
|
|
302
|
-
from
|
|
302
|
+
from scion_sdk.exceptions import (
|
|
303
303
|
ApiError,
|
|
304
304
|
AuthError,
|
|
305
305
|
UnauthorizedError,
|
|
@@ -26,10 +26,10 @@ from dataclasses import dataclass
|
|
|
26
26
|
from typing import Any
|
|
27
27
|
|
|
28
28
|
import httpx
|
|
29
|
-
from
|
|
30
|
-
from
|
|
31
|
-
from
|
|
32
|
-
from
|
|
29
|
+
from scion_sdk.config import setting
|
|
30
|
+
from scion_sdk.exceptions import AuthError
|
|
31
|
+
from scion_sdk.tls.profile import ResolvedTLSProfile
|
|
32
|
+
from scion_sdk.tls.resolve import resolve_tls_profile
|
|
33
33
|
|
|
34
34
|
logger = logging.getLogger(__name__)
|
|
35
35
|
|
|
@@ -59,15 +59,15 @@ _token_managers: dict[tuple, "TokenManager"] = {}
|
|
|
59
59
|
def _entitled(namespace: str, names: list[str]) -> list[str]:
|
|
60
60
|
"""Filter ``names`` to the subset the calling identity's Okta/Keycloak groups
|
|
61
61
|
entitle (CONCEPT:AU-OS.identity.identity-scoped-resource-autoload). Degrades
|
|
62
|
-
to the full list if
|
|
62
|
+
to the full list if scion-sdk predates the resolver, or if no caller
|
|
63
63
|
identity is bound at all (SYSTEM_ACTOR / unauthenticated-local sees all —
|
|
64
64
|
unchanged from pre-feature behavior, same as every other fleet caller of
|
|
65
65
|
``identity_scoped_resources``). A *bound-but-unauthorized* actor still
|
|
66
66
|
fails closed — only the "nothing to check" case degrades.
|
|
67
67
|
"""
|
|
68
68
|
try:
|
|
69
|
-
from
|
|
70
|
-
from
|
|
69
|
+
from scion_sdk.entitlements import identity_scoped_resources
|
|
70
|
+
from scion_sdk.identity import IdentityRequiredError
|
|
71
71
|
except Exception:
|
|
72
72
|
return list(names)
|
|
73
73
|
try:
|
|
@@ -6,7 +6,7 @@ Served live as ``connector://resources``. Regenerate by editing the declarations
|
|
|
6
6
|
# ruff: noqa: E501
|
|
7
7
|
from __future__ import annotations
|
|
8
8
|
|
|
9
|
-
from
|
|
9
|
+
from scion_sdk.ingest.live_declaration import source_meta
|
|
10
10
|
|
|
11
11
|
SOURCES = (
|
|
12
12
|
source_meta(
|
|
@@ -5,7 +5,7 @@ pushes its data into the ONE epistemic-graph knowledge graph as **typed OWL node
|
|
|
5
5
|
(``:Repository``, ``:ContainerImage``, ``:Namespace``, …) + links, matching the classes
|
|
6
6
|
federated by ``dockerhub_api.ontology``.
|
|
7
7
|
|
|
8
|
-
This is a thin mapper over ``
|
|
8
|
+
This is a thin mapper over ``scion_sdk.ingest`` -- the generated ``SourceIngest``
|
|
9
9
|
client, not a local ingestion helper. Node ids follow ``dockerhub:<class>:<externalId>``;
|
|
10
10
|
``node_type`` on each entity matches a class in ``dockerhub.ttl``.
|
|
11
11
|
"""
|
|
@@ -14,7 +14,7 @@ from __future__ import annotations
|
|
|
14
14
|
|
|
15
15
|
from typing import Any
|
|
16
16
|
|
|
17
|
-
from
|
|
17
|
+
from scion_sdk.ingest import (
|
|
18
18
|
ChangeSet,
|
|
19
19
|
Document,
|
|
20
20
|
Entity,
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
|
|
4
4
|
CONCEPT:DH-OS.audit.action-routed-mcp-surface — action-routed MCP surface. Registers the consolidated,
|
|
5
5
|
togglable tool modules (hub_auth, hub_repos, hub_org, hub_teams, hub_audit,
|
|
6
|
-
hub_scim, hub_admin, hub_registry, hub_scout) on an
|
|
6
|
+
hub_scim, hub_admin, hub_registry, hub_scout) on an scion-sdk FastMCP
|
|
7
7
|
server.
|
|
8
8
|
"""
|
|
9
9
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"""Dockerhub ontology contribution (CONCEPT:AU-KG.ontology.federation-provider-leg).
|
|
2
2
|
|
|
3
3
|
Data-only subpackage: it carries ``dockerhub.ttl`` (the ``owl:Ontology``
|
|
4
|
-
``http://knuckles.team/kg/dockerhub`` module) which the
|
|
5
|
-
the ``
|
|
4
|
+
``http://knuckles.team/kg/dockerhub`` module) which the scion-sdk hub federates in via
|
|
5
|
+
the ``scion_sdk.ontology_providers`` entry-point. It holds no business logic
|
|
6
6
|
and no heavy imports so the hub can resolve it cheaply.
|
|
7
7
|
"""
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"api_version": "graphos.io/v1",
|
|
3
3
|
"artifacts": {
|
|
4
|
-
"dockerhub_api/ontology/dockerhub.ttl": "
|
|
4
|
+
"dockerhub_api/ontology/dockerhub.ttl": "50ec37c493d8f6f39daff410ef8843ef750db178198c8c68e323a05f9640b10d",
|
|
5
5
|
"dockerhub_api/ontology/fixtures/records.json": "cdf24bdcd53b75daef789c05f93d55ced4ce4a138360a2ff9f1e34c55f8f6da8",
|
|
6
6
|
"dockerhub_api/ontology/mappings/source.yaml": "84985121b0fe97a045b04a5c40183d434d3d7ca1bca29202080cb390955545a6",
|
|
7
7
|
"dockerhub_api/ontology/migrations/manifest.json": "81a24f182615e83dc844c6e7f3a211d47705d2bfce4ee45b5c4b24134e64909f",
|
|
@@ -29,5 +29,5 @@
|
|
|
29
29
|
"signer": "UNSIGNED-PREVIEW",
|
|
30
30
|
"signing_public_key": "",
|
|
31
31
|
"status": "source-validated",
|
|
32
|
-
"validated_at": "2026-10-
|
|
32
|
+
"validated_at": "2026-10-31T03:00:02Z"
|
|
33
33
|
}
|
|
@@ -133,7 +133,7 @@
|
|
|
133
133
|
rdfs:comment """Docker Hub container-registry model — namespaces and organizations,
|
|
134
134
|
image repositories, tags and the concrete container images they resolve to (digest,
|
|
135
135
|
architecture, size), teams and their repository permissions, access tokens, and Docker
|
|
136
|
-
Scout vulnerabilities — federated into the
|
|
136
|
+
Scout vulnerabilities — federated into the scion-sdk knowledge-graph hub.""" .
|
|
137
137
|
|
|
138
138
|
# ontology-codemod R3
|
|
139
139
|
<http://knuckles.team/kg#ContainerImage> rdfs:subClassOf <http://knuckles.team/kg/infrastructure#ContainerImage> .
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: dockerhub-api
|
|
3
|
-
Version: 1.3.
|
|
3
|
+
Version: 1.3.9
|
|
4
4
|
Summary: Docker Hub API + MCP Server
|
|
5
5
|
Author-email: Repository Maintainers <maintainers@knuckles.team>
|
|
6
6
|
License: MIT
|
|
@@ -12,7 +12,7 @@ Classifier: Programming Language :: Python :: 3
|
|
|
12
12
|
Requires-Python: <3.15,>=3.12
|
|
13
13
|
Description-Content-Type: text/markdown
|
|
14
14
|
License-File: LICENSE
|
|
15
|
-
Requires-Dist:
|
|
15
|
+
Requires-Dist: scion-sdk[mcp]<0.7.0,>=0.6.4
|
|
16
16
|
Requires-Dist: httpx>=0.28.1
|
|
17
17
|
Requires-Dist: python-dotenv>=1.2.4
|
|
18
18
|
Provides-Extra: test
|
|
@@ -91,7 +91,7 @@ multi-arch inspection, OCI referrers, and gated push/remove) and **Docker Scout*
|
|
|
91
91
|
- **Integrated Graph Agent:** Built-in Pydantic AI agent (`dockerhub-agent`) with
|
|
92
92
|
A2A and AG-UI web interfaces.
|
|
93
93
|
- **Native Telemetry & Tracing:** Out-of-the-box OpenTelemetry exports and Langfuse
|
|
94
|
-
tracing via
|
|
94
|
+
tracing via scion-sdk.
|
|
95
95
|
|
|
96
96
|
---
|
|
97
97
|
|
|
@@ -105,8 +105,8 @@ pip install "dockerhub-api[all]" # everything
|
|
|
105
105
|
|
|
106
106
|
| Extra | Adds |
|
|
107
107
|
|---|---|
|
|
108
|
-
| `mcp` | FastMCP server (`dockerhub-mcp`) via `
|
|
109
|
-
| `agent` | Pydantic-AI A2A agent (`dockerhub-agent`) + Logfire via `
|
|
108
|
+
| `mcp` | FastMCP server (`dockerhub-mcp`) via `scion-sdk` |
|
|
109
|
+
| `agent` | Pydantic-AI A2A agent (`dockerhub-agent`) + Logfire via `scion-sdk` |
|
|
110
110
|
| `all` | `mcp` + `agent` |
|
|
111
111
|
| `test` | pytest toolchain for development |
|
|
112
112
|
|
|
@@ -136,7 +136,7 @@ agent (`immutable agent digest`) with a co-located `:mcp` sidecar.
|
|
|
136
136
|
|
|
137
137
|
### Knowledge-graph database (`epistemic-graph`)
|
|
138
138
|
|
|
139
|
-
|
|
139
|
+
Scion SDK core dependency (`epistemic-graph[full]`). The `[mcp]` extra keeps
|
|
140
140
|
deployments can use the bundled engine. For production or shared state, run
|
|
141
141
|
**epistemic-graph as a dedicated database service** and configure the runtime to use it.
|
|
142
142
|
Deployment recipes (single-node + Raft HA), connection configuration, and architecture
|
|
@@ -258,7 +258,7 @@ _9 action-routed tool(s) (default) · 54 verbose 1:1 tool(s). Each is enabled un
|
|
|
258
258
|
<!-- MCP-CONFIG-EXAMPLES:START -->
|
|
259
259
|
|
|
260
260
|
> **Install the connector-focused `[mcp]` extra.** Examples use `dockerhub-api[mcp]` to add
|
|
261
|
-
> FastMCP / FastAPI through `
|
|
261
|
+
> FastMCP / FastAPI through `scion-sdk`; the required Scion SDK core
|
|
262
262
|
> still carries `epistemic-graph[full]`. The `[agent-runtime]` extra additionally
|
|
263
263
|
> enables model orchestration.
|
|
264
264
|
|
|
@@ -500,7 +500,7 @@ network transport, connector ingestion, Arbora delegation, or trace export.
|
|
|
500
500
|
| `SCOUTTOOL` | `True` | |
|
|
501
501
|
| `KGTOOL` | `True` | |
|
|
502
502
|
|
|
503
|
-
#### Inherited
|
|
503
|
+
#### Inherited scion-sdk variables (apply to every connector)
|
|
504
504
|
|
|
505
505
|
| Variable | Example | Description |
|
|
506
506
|
|----------|---------|-------------|
|
|
@@ -521,5 +521,5 @@ network transport, connector ingestion, Arbora delegation, or trace export.
|
|
|
521
521
|
| `MODEL_ID` | `gpt-4o` | Model id for the agent |
|
|
522
522
|
| `ENABLE_WEB_UI` | `True` | Serve the AG-UI web interface |
|
|
523
523
|
|
|
524
|
-
_36 package + 16 inherited variable(s). Auto-generated from `.env.example` + the shared
|
|
524
|
+
_36 package + 16 inherited variable(s). Auto-generated from `.env.example` + the shared scion-sdk set — do not edit._
|
|
525
525
|
<!-- ENV-VARS-TABLE:END -->
|
|
@@ -4,12 +4,12 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "dockerhub-api"
|
|
7
|
-
version = "1.3.
|
|
7
|
+
version = "1.3.9"
|
|
8
8
|
description = "Docker Hub API + MCP Server"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
classifiers = [ "Development Status :: 5 - Production/Stable", "License :: OSI Approved :: MIT License", "Environment :: Console", "Operating System :: POSIX :: Linux", "Programming Language :: Python :: 3",]
|
|
11
11
|
requires-python = ">=3.12, <3.15"
|
|
12
|
-
dependencies = [ "
|
|
12
|
+
dependencies = [ "scion-sdk[mcp]>=0.6.4,<0.7.0", "httpx>=0.28.1", "python-dotenv>=1.2.4",]
|
|
13
13
|
[[project.authors]]
|
|
14
14
|
name = "Repository Maintainers"
|
|
15
15
|
email = "maintainers@knuckles.team"
|
|
@@ -22,10 +22,10 @@ test = [
|
|
|
22
22
|
"pytest-xdist>=3.8.0", "pytest>=9.1.1", "pytest-asyncio>=1.4.0", "pytest-cov>=7.1.0",]
|
|
23
23
|
|
|
24
24
|
[project.scripts]
|
|
25
|
-
dockerhub-mcp = "
|
|
25
|
+
dockerhub-mcp = "scion_sdk.cli:serve"
|
|
26
26
|
|
|
27
|
-
# The one declared connector identity: the fleet name (
|
|
28
|
-
[project.entry-points."
|
|
27
|
+
# The one declared connector identity: the fleet name (SCION-CONNECTOR-CONTROL-R071).
|
|
28
|
+
[project.entry-points."scion_sdk.connector"]
|
|
29
29
|
dockerhub-mcp = "dockerhub_api:connector"
|
|
30
30
|
|
|
31
31
|
[tool.uv.workspace]
|
|
@@ -4,7 +4,7 @@ import time
|
|
|
4
4
|
|
|
5
5
|
import httpx
|
|
6
6
|
import pytest
|
|
7
|
-
from
|
|
7
|
+
from scion_sdk.exceptions import AuthError
|
|
8
8
|
|
|
9
9
|
from dockerhub_api.auth import TokenManager, decode_jwt_claims, get_client
|
|
10
10
|
from tests.conftest import BASE_URL, MockHub, make_api, make_jwt
|
|
@@ -50,7 +50,7 @@ def mcp_instance(hub, registry, scout, monkeypatch):
|
|
|
50
50
|
hub_auth_module, "get_scout_client", lambda **_k: make_scout_api(scout)
|
|
51
51
|
)
|
|
52
52
|
monkeypatch.setattr(sys, "argv", ["dockerhub-mcp"])
|
|
53
|
-
from
|
|
53
|
+
from scion_sdk.connector import build_server
|
|
54
54
|
|
|
55
55
|
_, mcp = build_server("dockerhub_api", command_args=[])
|
|
56
56
|
return mcp
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
-
from
|
|
5
|
+
from scion_sdk.connector_identity import connector_name
|
|
6
6
|
import ast
|
|
7
7
|
import tomllib
|
|
8
8
|
from pathlib import Path
|
|
@@ -34,7 +34,7 @@ def _call_connectors(path: Path) -> list[str]:
|
|
|
34
34
|
@pytest.mark.spec("CONN-DOCKERHUB-API-CONNECTOR-IDENTITY-R001")
|
|
35
35
|
def test_connector_name_is_the_fleet_name() -> None:
|
|
36
36
|
pyproject = tomllib.loads((ROOT / "pyproject.toml").read_text(encoding="utf-8"))
|
|
37
|
-
assert pyproject["project"]["entry-points"]["
|
|
37
|
+
assert pyproject["project"]["entry-points"]["scion_sdk.connector"] == {
|
|
38
38
|
FLEET: "dockerhub_api:connector"
|
|
39
39
|
}
|
|
40
40
|
assert connector_name("dockerhub_api") == FLEET
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
A resolved Docker Hub ``username`` (personal account or org) the caller's
|
|
5
5
|
identity is not entitled to is denied before ``get_client``/``get_registry_client``
|
|
6
6
|
mint any token. Tests the enforcement logic with the entitlement source
|
|
7
|
-
mocked (the resolver itself is tested in
|
|
7
|
+
mocked (the resolver itself is tested in scion-sdk).
|
|
8
8
|
"""
|
|
9
9
|
|
|
10
10
|
import pytest
|
|
@@ -70,7 +70,7 @@ def test_missing_resolver_degrades_to_allow(monkeypatch):
|
|
|
70
70
|
real_import = builtins.__import__
|
|
71
71
|
|
|
72
72
|
def _blocked_import(name, *args, **kwargs):
|
|
73
|
-
if name == "
|
|
73
|
+
if name == "scion_sdk.entitlements":
|
|
74
74
|
raise ImportError("simulated: resolver not available")
|
|
75
75
|
return real_import(name, *args, **kwargs)
|
|
76
76
|
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"""Native epistemic-graph typed-node ingestion -- Wire-First coverage for dockerhub-api.
|
|
2
2
|
|
|
3
3
|
Exercises the real ``ingest_entities`` / ``ingest_repositories`` / ``ingest_tags`` seam
|
|
4
|
-
against a fake ``
|
|
5
|
-
SDK request builder (``
|
|
4
|
+
against a fake ``scion_sdk.ingest`` transport (no engine required). The real
|
|
5
|
+
SDK request builder (``scion_sdk.ingest.request.build_request``) still runs,
|
|
6
6
|
so a malformed change set is still caught by the SDK's own contract, not re-derived
|
|
7
7
|
here; only the final network commit is faked.
|
|
8
8
|
CONCEPT:AU-KG.ingest.enterprise-source-extractor.
|
|
@@ -14,7 +14,7 @@ from types import SimpleNamespace
|
|
|
14
14
|
from typing import Any
|
|
15
15
|
|
|
16
16
|
import pytest
|
|
17
|
-
from
|
|
17
|
+
from scion_sdk.ingest import IngestError, KnowledgeIngest
|
|
18
18
|
from epistemic_graph.generated.source_ingestion import SourceIngestionRequest
|
|
19
19
|
|
|
20
20
|
from dockerhub_api.kg_ingest import (
|
|
@@ -31,7 +31,9 @@ class _FakeTransport:
|
|
|
31
31
|
self.requests: list[SourceIngestionRequest] = []
|
|
32
32
|
|
|
33
33
|
async def source_status(self, _connector: str, _stream: str) -> Any:
|
|
34
|
-
return SimpleNamespace(
|
|
34
|
+
return SimpleNamespace(
|
|
35
|
+
connector=_connector, stream=_stream, accepted_checkpoint=None
|
|
36
|
+
)
|
|
35
37
|
|
|
36
38
|
async def submit(self, request: SourceIngestionRequest) -> Any:
|
|
37
39
|
self.requests.append(request)
|
|
@@ -117,7 +119,9 @@ async def test_ingest_repositories_maps_repo_namespace_and_images(ingest):
|
|
|
117
119
|
img_record = next(r for r in request.records if r.record_id == img_id)
|
|
118
120
|
assert img_record.payload["digest"] == "sha256:abc"
|
|
119
121
|
assert img_record.payload["architecture"] == "amd64"
|
|
120
|
-
relation_refs = {
|
|
122
|
+
relation_refs = {
|
|
123
|
+
rel.relation_reference.rsplit("/", 1)[-1] for rel in request.relationships
|
|
124
|
+
}
|
|
121
125
|
assert relation_refs == {"inNamespace", "imageOf", "hasImage"}
|
|
122
126
|
|
|
123
127
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dockerhub_api-1.3.7 → dockerhub_api-1.3.9}/dockerhub_api/api/api_client_org_access_tokens.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dockerhub_api-1.3.7 → dockerhub_api-1.3.9}/dockerhub_api/ontology/shapes/connector.shacl.ttl
RENAMED
|
File without changes
|
{dockerhub_api-1.3.7 → dockerhub_api-1.3.9}/dockerhub_api/skills/dockerhub-api-operations/SKILL.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|