runmark 0.2.1__tar.gz → 0.2.2__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.
- {runmark-0.2.1/src/runmark.egg-info → runmark-0.2.2}/PKG-INFO +1 -1
- {runmark-0.2.1 → runmark-0.2.2}/pyproject.toml +4 -1
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/__init__.py +1 -1
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/contracts/validator.py +16 -4
- runmark-0.2.2/src/runmark/py.typed +0 -0
- runmark-0.2.2/src/runmark/schemas/__init__.py +0 -0
- runmark-0.2.2/src/runmark/schemas/contract-v1.json +168 -0
- runmark-0.2.2/src/runmark/schemas/runmark-v1.json +167 -0
- {runmark-0.2.1 → runmark-0.2.2/src/runmark.egg-info}/PKG-INFO +1 -1
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark.egg-info/SOURCES.txt +4 -0
- {runmark-0.2.1 → runmark-0.2.2}/LICENSE +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/README.md +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/setup.cfg +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/__main__.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/cli/__init__.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/cli/app.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/cli/commands/__init__.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/cli/commands/check.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/cli/commands/contract.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/cli/commands/diff.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/cli/commands/doctor.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/cli/commands/history.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/cli/commands/init.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/cli/commands/scan.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/cli/commands/share.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/cli/commands/snapshot.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/cli/commands/verify.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/cli/commands/version.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/contracts/__init__.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/contracts/canonicalizer.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/contracts/diff.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/contracts/discovery.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/contracts/evaluator.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/contracts/evidence.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/contracts/generator.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/contracts/parser.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/contracts/security.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/contracts/version_constraints.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/core/__init__.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/core/contract_check.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/core/contract_diff.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/core/contract_init.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/core/diff.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/core/doctor.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/core/reporter.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/core/scanner.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/core/snapshot.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/core/verifier.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/detectors/__init__.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/detectors/base.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/detectors/containers/__init__.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/detectors/containers/compose.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/detectors/dependencies/__init__.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/detectors/dependencies/node.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/detectors/dependencies/python.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/detectors/environment/__init__.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/detectors/environment/env.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/detectors/git/__init__.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/detectors/git/git.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/detectors/network/__init__.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/detectors/network/ports.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/detectors/project/__init__.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/detectors/project/docker.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/detectors/project/node.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/detectors/project/python.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/detectors/registry.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/detectors/runtimes/__init__.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/detectors/runtimes/docker.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/detectors/runtimes/git.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/detectors/runtimes/node.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/detectors/runtimes/python.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/detectors/services/__init__.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/detectors/services/postgres.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/detectors/services/redis.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/detectors/system/__init__.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/detectors/system/system.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/models/__init__.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/models/common.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/models/container.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/models/contract.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/models/contract_result.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/models/dependency.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/models/diagnostic.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/models/environment.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/models/git.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/models/network.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/models/project.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/models/runmark.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/models/runtime.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/models/service.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/models/system.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/output/__init__.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/output/contract.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/output/json.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/output/markdown.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/output/tables.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/output/terminal.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/security/__init__.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/security/contract_sanitizer.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/security/export_sanitizer.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/security/redactor.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/security/sanitizer.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/security/secret_patterns.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/storage/__init__.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/storage/filesystem.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/storage/paths.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/utils/__init__.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/utils/commands.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/utils/hashing.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark/utils/platform.py +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark.egg-info/dependency_links.txt +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark.egg-info/entry_points.txt +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark.egg-info/requires.txt +0 -0
- {runmark-0.2.1 → runmark-0.2.2}/src/runmark.egg-info/top_level.txt +0 -0
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "runmark"
|
|
7
|
-
version = "0.2.
|
|
7
|
+
version = "0.2.2"
|
|
8
8
|
description = "Know what makes your code run. Local-first development environment observability, fingerprinting, comparison, and verification."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.10"
|
|
@@ -48,6 +48,9 @@ runmark = "runmark.cli.app:main"
|
|
|
48
48
|
[tool.setuptools.packages.find]
|
|
49
49
|
where = ["src"]
|
|
50
50
|
|
|
51
|
+
[tool.setuptools.package-data]
|
|
52
|
+
runmark = ["schemas/*.json", "py.typed"]
|
|
53
|
+
|
|
51
54
|
[tool.ruff]
|
|
52
55
|
line-length = 100
|
|
53
56
|
target-version = "py310"
|
|
@@ -10,7 +10,18 @@ import jsonschema # type: ignore[import-untyped]
|
|
|
10
10
|
from runmark.contracts.version_constraints import VersionConstraint
|
|
11
11
|
from runmark.models.contract import RunmarkContract
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
def _get_schema_file(filename: str = "contract-v1.json") -> Path:
|
|
14
|
+
"""Resolve schema file from package data or repository root."""
|
|
15
|
+
pkg_schema = Path(__file__).resolve().parent.parent / "schemas" / filename
|
|
16
|
+
if pkg_schema.exists():
|
|
17
|
+
return pkg_schema
|
|
18
|
+
repo_schema = Path(__file__).resolve().parent.parent.parent.parent / "schemas" / filename
|
|
19
|
+
if repo_schema.exists():
|
|
20
|
+
return repo_schema
|
|
21
|
+
return pkg_schema
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
SCHEMA_FILE = _get_schema_file("contract-v1.json")
|
|
14
25
|
|
|
15
26
|
VALID_OS_NAMES = {"windows", "linux", "darwin", "macos", "freebsd", "openbsd"}
|
|
16
27
|
VALID_ARCHITECTURES = {"amd64", "x86_64", "arm64", "aarch64", "x86", "i386", "i686"}
|
|
@@ -30,9 +41,10 @@ class ContractValidator:
|
|
|
30
41
|
def get_schema(cls) -> dict[str, Any]:
|
|
31
42
|
"""Load and cache contract-v1.json schema."""
|
|
32
43
|
if cls._cached_schema is None:
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
44
|
+
schema_file = _get_schema_file("contract-v1.json")
|
|
45
|
+
if not schema_file.exists():
|
|
46
|
+
raise FileNotFoundError(f"Schema file not found at: {schema_file}")
|
|
47
|
+
with open(schema_file, encoding="utf-8") as f:
|
|
36
48
|
cls._cached_schema = json.load(f)
|
|
37
49
|
return cls._cached_schema
|
|
38
50
|
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://runmark.dev/schemas/contract-v1.json",
|
|
4
|
+
"title": "RunmarkContract",
|
|
5
|
+
"description": "Formal schema for defining development environment requirements in runmark.json.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"required": ["version"],
|
|
8
|
+
"additionalProperties": false,
|
|
9
|
+
"properties": {
|
|
10
|
+
"$schema": {
|
|
11
|
+
"type": "string",
|
|
12
|
+
"description": "Informational URI/path pointing to the contract schema."
|
|
13
|
+
},
|
|
14
|
+
"version": {
|
|
15
|
+
"type": "integer",
|
|
16
|
+
"enum": [1],
|
|
17
|
+
"description": "Contract format version (must be 1 for contract-v1)."
|
|
18
|
+
},
|
|
19
|
+
"project": {
|
|
20
|
+
"type": "object",
|
|
21
|
+
"additionalProperties": false,
|
|
22
|
+
"properties": {
|
|
23
|
+
"name": {
|
|
24
|
+
"type": "string",
|
|
25
|
+
"description": "Expected project name."
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
"platform": {
|
|
30
|
+
"type": "object",
|
|
31
|
+
"additionalProperties": false,
|
|
32
|
+
"properties": {
|
|
33
|
+
"os": {
|
|
34
|
+
"type": "array",
|
|
35
|
+
"items": { "type": "string" },
|
|
36
|
+
"description": "Supported operating systems (e.g. ['windows', 'linux', 'darwin'])."
|
|
37
|
+
},
|
|
38
|
+
"architecture": {
|
|
39
|
+
"type": "array",
|
|
40
|
+
"items": { "type": "string" },
|
|
41
|
+
"description": "Supported hardware architectures (e.g. ['amd64', 'arm64', 'x86_64'])."
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
"runtime": {
|
|
46
|
+
"type": "object",
|
|
47
|
+
"description": "Required runtimes mapped to version constraint expressions (e.g. 'python': '3.12.x').",
|
|
48
|
+
"additionalProperties": {
|
|
49
|
+
"type": "string"
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
"dependencies": {
|
|
53
|
+
"type": "object",
|
|
54
|
+
"description": "Required package dependencies categorized by ecosystem.",
|
|
55
|
+
"additionalProperties": false,
|
|
56
|
+
"properties": {
|
|
57
|
+
"python": {
|
|
58
|
+
"type": "object",
|
|
59
|
+
"additionalProperties": { "type": "string" }
|
|
60
|
+
},
|
|
61
|
+
"node": {
|
|
62
|
+
"type": "object",
|
|
63
|
+
"additionalProperties": { "type": "string" }
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
},
|
|
67
|
+
"services": {
|
|
68
|
+
"type": "object",
|
|
69
|
+
"description": "Required or optional backing services (e.g. postgresql, redis).",
|
|
70
|
+
"additionalProperties": {
|
|
71
|
+
"oneOf": [
|
|
72
|
+
{
|
|
73
|
+
"type": "string",
|
|
74
|
+
"description": "Version constraint string (defaults to required: true)."
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
"type": "object",
|
|
78
|
+
"required": ["version"],
|
|
79
|
+
"additionalProperties": false,
|
|
80
|
+
"properties": {
|
|
81
|
+
"version": {
|
|
82
|
+
"type": "string",
|
|
83
|
+
"description": "Expected version constraint for the service."
|
|
84
|
+
},
|
|
85
|
+
"required": {
|
|
86
|
+
"type": "boolean",
|
|
87
|
+
"default": true,
|
|
88
|
+
"description": "Whether the service is mandatory (true) or optional (false)."
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
]
|
|
93
|
+
}
|
|
94
|
+
},
|
|
95
|
+
"environment": {
|
|
96
|
+
"type": "object",
|
|
97
|
+
"description": "Declared environment variable requirements (names only).",
|
|
98
|
+
"additionalProperties": false,
|
|
99
|
+
"properties": {
|
|
100
|
+
"required": {
|
|
101
|
+
"type": "array",
|
|
102
|
+
"items": { "type": "string" },
|
|
103
|
+
"description": "List of variable names that must be present."
|
|
104
|
+
},
|
|
105
|
+
"optional": {
|
|
106
|
+
"type": "array",
|
|
107
|
+
"items": { "type": "string" },
|
|
108
|
+
"description": "List of optional variable names."
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
},
|
|
112
|
+
"network": {
|
|
113
|
+
"type": "object",
|
|
114
|
+
"description": "Network and port requirements.",
|
|
115
|
+
"additionalProperties": false,
|
|
116
|
+
"properties": {
|
|
117
|
+
"ports": {
|
|
118
|
+
"type": "object",
|
|
119
|
+
"description": "Mapping of port numbers to network requirement specifications.",
|
|
120
|
+
"additionalProperties": {
|
|
121
|
+
"type": "object",
|
|
122
|
+
"additionalProperties": false,
|
|
123
|
+
"properties": {
|
|
124
|
+
"protocol": {
|
|
125
|
+
"type": "string",
|
|
126
|
+
"enum": ["tcp", "udp"],
|
|
127
|
+
"default": "tcp",
|
|
128
|
+
"description": "Port transport protocol."
|
|
129
|
+
},
|
|
130
|
+
"required": {
|
|
131
|
+
"type": "boolean",
|
|
132
|
+
"default": true,
|
|
133
|
+
"description": "Whether this port availability is required."
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
},
|
|
140
|
+
"containers": {
|
|
141
|
+
"type": "object",
|
|
142
|
+
"description": "Container runtime requirements.",
|
|
143
|
+
"additionalProperties": false,
|
|
144
|
+
"properties": {
|
|
145
|
+
"docker": {
|
|
146
|
+
"type": "object",
|
|
147
|
+
"additionalProperties": false,
|
|
148
|
+
"properties": {
|
|
149
|
+
"required": {
|
|
150
|
+
"type": "boolean",
|
|
151
|
+
"default": true
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
},
|
|
155
|
+
"compose": {
|
|
156
|
+
"type": "object",
|
|
157
|
+
"additionalProperties": false,
|
|
158
|
+
"properties": {
|
|
159
|
+
"required": {
|
|
160
|
+
"type": "boolean",
|
|
161
|
+
"default": true
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://runmark.dev/schemas/runmark-v1.json",
|
|
4
|
+
"title": "RunmarkState",
|
|
5
|
+
"description": "Canonical schema representing the captured state of a software project development environment.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"required": [
|
|
8
|
+
"runmark",
|
|
9
|
+
"project",
|
|
10
|
+
"git",
|
|
11
|
+
"system",
|
|
12
|
+
"runtimes",
|
|
13
|
+
"dependencies",
|
|
14
|
+
"services",
|
|
15
|
+
"environment",
|
|
16
|
+
"network",
|
|
17
|
+
"containers"
|
|
18
|
+
],
|
|
19
|
+
"additionalProperties": false,
|
|
20
|
+
"properties": {
|
|
21
|
+
"runmark": {
|
|
22
|
+
"type": "object",
|
|
23
|
+
"required": ["id", "created_at", "tool_version", "schema_version", "environment_fingerprint"],
|
|
24
|
+
"additionalProperties": false,
|
|
25
|
+
"properties": {
|
|
26
|
+
"id": { "type": "string" },
|
|
27
|
+
"created_at": { "type": "string", "format": "date-time" },
|
|
28
|
+
"tool_version": { "type": "string" },
|
|
29
|
+
"schema_version": { "type": "string" },
|
|
30
|
+
"environment_fingerprint": { "type": "string" },
|
|
31
|
+
"message": { "type": ["string", "null"] }
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
"project": {
|
|
35
|
+
"type": "object",
|
|
36
|
+
"required": ["name", "root", "languages", "frameworks", "package_managers", "containerization"],
|
|
37
|
+
"additionalProperties": false,
|
|
38
|
+
"properties": {
|
|
39
|
+
"name": { "type": "string" },
|
|
40
|
+
"root": { "type": "string" },
|
|
41
|
+
"languages": { "type": "array", "items": { "type": "string" } },
|
|
42
|
+
"frameworks": { "type": "array", "items": { "type": "string" } },
|
|
43
|
+
"package_managers": { "type": "array", "items": { "type": "string" } },
|
|
44
|
+
"containerization": { "type": "array", "items": { "type": "string" } }
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
"git": {
|
|
48
|
+
"type": "object",
|
|
49
|
+
"required": ["is_repository", "branch", "commit", "dirty"],
|
|
50
|
+
"additionalProperties": false,
|
|
51
|
+
"properties": {
|
|
52
|
+
"is_repository": { "type": "boolean" },
|
|
53
|
+
"branch": { "type": ["string", "null"] },
|
|
54
|
+
"commit": { "type": ["string", "null"] },
|
|
55
|
+
"dirty": { "type": "boolean" }
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
"system": {
|
|
59
|
+
"type": "object",
|
|
60
|
+
"required": ["os_name", "os_version", "architecture"],
|
|
61
|
+
"additionalProperties": false,
|
|
62
|
+
"properties": {
|
|
63
|
+
"os_name": { "type": "string" },
|
|
64
|
+
"os_version": { "type": "string" },
|
|
65
|
+
"architecture": { "type": "string" }
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
"runtimes": {
|
|
69
|
+
"type": "object",
|
|
70
|
+
"additionalProperties": {
|
|
71
|
+
"type": "object",
|
|
72
|
+
"required": ["name", "installed", "version", "status"],
|
|
73
|
+
"additionalProperties": false,
|
|
74
|
+
"properties": {
|
|
75
|
+
"name": { "type": "string" },
|
|
76
|
+
"installed": { "type": "boolean" },
|
|
77
|
+
"version": { "type": ["string", "null"] },
|
|
78
|
+
"status": { "type": "string", "enum": ["detected", "not_found", "not_applicable", "unsupported", "error"] },
|
|
79
|
+
"executable_path": { "type": ["string", "null"] }
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
},
|
|
83
|
+
"dependencies": {
|
|
84
|
+
"type": "array",
|
|
85
|
+
"items": {
|
|
86
|
+
"type": "object",
|
|
87
|
+
"required": ["name", "manager", "declared", "resolved", "kind"],
|
|
88
|
+
"additionalProperties": false,
|
|
89
|
+
"properties": {
|
|
90
|
+
"name": { "type": "string" },
|
|
91
|
+
"manager": { "type": "string" },
|
|
92
|
+
"declared": { "type": ["string", "null"] },
|
|
93
|
+
"resolved": { "type": ["string", "null"] },
|
|
94
|
+
"kind": { "type": "string", "enum": ["direct", "transitive", "dev", "peer", "unknown"] }
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
},
|
|
98
|
+
"services": {
|
|
99
|
+
"type": "array",
|
|
100
|
+
"items": {
|
|
101
|
+
"type": "object",
|
|
102
|
+
"required": ["name", "installed", "running", "detected_version", "expected_version", "status", "port"],
|
|
103
|
+
"additionalProperties": false,
|
|
104
|
+
"properties": {
|
|
105
|
+
"name": { "type": "string" },
|
|
106
|
+
"installed": { "type": "boolean" },
|
|
107
|
+
"running": { "type": "boolean" },
|
|
108
|
+
"detected_version": { "type": ["string", "null"] },
|
|
109
|
+
"expected_version": { "type": ["string", "null"] },
|
|
110
|
+
"status": { "type": "string", "enum": ["detected", "not_found", "not_applicable", "unsupported", "error"] },
|
|
111
|
+
"port": { "type": ["integer", "null"] }
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
},
|
|
115
|
+
"environment": {
|
|
116
|
+
"type": "object",
|
|
117
|
+
"required": ["variables"],
|
|
118
|
+
"additionalProperties": false,
|
|
119
|
+
"properties": {
|
|
120
|
+
"variables": {
|
|
121
|
+
"type": "object",
|
|
122
|
+
"additionalProperties": {
|
|
123
|
+
"type": "object",
|
|
124
|
+
"required": ["name", "required", "present", "secret", "source"],
|
|
125
|
+
"additionalProperties": false,
|
|
126
|
+
"properties": {
|
|
127
|
+
"name": { "type": "string" },
|
|
128
|
+
"required": { "type": "boolean" },
|
|
129
|
+
"present": { "type": "boolean" },
|
|
130
|
+
"secret": { "type": "boolean" },
|
|
131
|
+
"source": { "type": "string" }
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
},
|
|
137
|
+
"network": {
|
|
138
|
+
"type": "array",
|
|
139
|
+
"items": {
|
|
140
|
+
"type": "object",
|
|
141
|
+
"required": ["port", "service", "expected", "occupied", "status"],
|
|
142
|
+
"additionalProperties": false,
|
|
143
|
+
"properties": {
|
|
144
|
+
"port": { "type": "integer" },
|
|
145
|
+
"service": { "type": "string" },
|
|
146
|
+
"expected": { "type": "boolean" },
|
|
147
|
+
"occupied": { "type": "boolean" },
|
|
148
|
+
"status": { "type": "string" }
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
},
|
|
152
|
+
"containers": {
|
|
153
|
+
"type": "array",
|
|
154
|
+
"items": {
|
|
155
|
+
"type": "object",
|
|
156
|
+
"required": ["service_name", "image", "tag", "running_status"],
|
|
157
|
+
"additionalProperties": false,
|
|
158
|
+
"properties": {
|
|
159
|
+
"service_name": { "type": "string" },
|
|
160
|
+
"image": { "type": "string" },
|
|
161
|
+
"tag": { "type": ["string", "null"] },
|
|
162
|
+
"running_status": { "type": "string" }
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
@@ -3,6 +3,7 @@ README.md
|
|
|
3
3
|
pyproject.toml
|
|
4
4
|
src/runmark/__init__.py
|
|
5
5
|
src/runmark/__main__.py
|
|
6
|
+
src/runmark/py.typed
|
|
6
7
|
src/runmark.egg-info/PKG-INFO
|
|
7
8
|
src/runmark.egg-info/SOURCES.txt
|
|
8
9
|
src/runmark.egg-info/dependency_links.txt
|
|
@@ -93,6 +94,9 @@ src/runmark/output/json.py
|
|
|
93
94
|
src/runmark/output/markdown.py
|
|
94
95
|
src/runmark/output/tables.py
|
|
95
96
|
src/runmark/output/terminal.py
|
|
97
|
+
src/runmark/schemas/__init__.py
|
|
98
|
+
src/runmark/schemas/contract-v1.json
|
|
99
|
+
src/runmark/schemas/runmark-v1.json
|
|
96
100
|
src/runmark/security/__init__.py
|
|
97
101
|
src/runmark/security/contract_sanitizer.py
|
|
98
102
|
src/runmark/security/export_sanitizer.py
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|