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.
Files changed (114) hide show
  1. {runmark-0.2.1/src/runmark.egg-info → runmark-0.2.2}/PKG-INFO +1 -1
  2. {runmark-0.2.1 → runmark-0.2.2}/pyproject.toml +4 -1
  3. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/__init__.py +1 -1
  4. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/contracts/validator.py +16 -4
  5. runmark-0.2.2/src/runmark/py.typed +0 -0
  6. runmark-0.2.2/src/runmark/schemas/__init__.py +0 -0
  7. runmark-0.2.2/src/runmark/schemas/contract-v1.json +168 -0
  8. runmark-0.2.2/src/runmark/schemas/runmark-v1.json +167 -0
  9. {runmark-0.2.1 → runmark-0.2.2/src/runmark.egg-info}/PKG-INFO +1 -1
  10. {runmark-0.2.1 → runmark-0.2.2}/src/runmark.egg-info/SOURCES.txt +4 -0
  11. {runmark-0.2.1 → runmark-0.2.2}/LICENSE +0 -0
  12. {runmark-0.2.1 → runmark-0.2.2}/README.md +0 -0
  13. {runmark-0.2.1 → runmark-0.2.2}/setup.cfg +0 -0
  14. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/__main__.py +0 -0
  15. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/cli/__init__.py +0 -0
  16. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/cli/app.py +0 -0
  17. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/cli/commands/__init__.py +0 -0
  18. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/cli/commands/check.py +0 -0
  19. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/cli/commands/contract.py +0 -0
  20. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/cli/commands/diff.py +0 -0
  21. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/cli/commands/doctor.py +0 -0
  22. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/cli/commands/history.py +0 -0
  23. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/cli/commands/init.py +0 -0
  24. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/cli/commands/scan.py +0 -0
  25. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/cli/commands/share.py +0 -0
  26. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/cli/commands/snapshot.py +0 -0
  27. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/cli/commands/verify.py +0 -0
  28. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/cli/commands/version.py +0 -0
  29. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/contracts/__init__.py +0 -0
  30. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/contracts/canonicalizer.py +0 -0
  31. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/contracts/diff.py +0 -0
  32. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/contracts/discovery.py +0 -0
  33. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/contracts/evaluator.py +0 -0
  34. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/contracts/evidence.py +0 -0
  35. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/contracts/generator.py +0 -0
  36. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/contracts/parser.py +0 -0
  37. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/contracts/security.py +0 -0
  38. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/contracts/version_constraints.py +0 -0
  39. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/core/__init__.py +0 -0
  40. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/core/contract_check.py +0 -0
  41. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/core/contract_diff.py +0 -0
  42. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/core/contract_init.py +0 -0
  43. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/core/diff.py +0 -0
  44. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/core/doctor.py +0 -0
  45. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/core/reporter.py +0 -0
  46. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/core/scanner.py +0 -0
  47. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/core/snapshot.py +0 -0
  48. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/core/verifier.py +0 -0
  49. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/detectors/__init__.py +0 -0
  50. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/detectors/base.py +0 -0
  51. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/detectors/containers/__init__.py +0 -0
  52. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/detectors/containers/compose.py +0 -0
  53. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/detectors/dependencies/__init__.py +0 -0
  54. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/detectors/dependencies/node.py +0 -0
  55. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/detectors/dependencies/python.py +0 -0
  56. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/detectors/environment/__init__.py +0 -0
  57. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/detectors/environment/env.py +0 -0
  58. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/detectors/git/__init__.py +0 -0
  59. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/detectors/git/git.py +0 -0
  60. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/detectors/network/__init__.py +0 -0
  61. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/detectors/network/ports.py +0 -0
  62. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/detectors/project/__init__.py +0 -0
  63. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/detectors/project/docker.py +0 -0
  64. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/detectors/project/node.py +0 -0
  65. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/detectors/project/python.py +0 -0
  66. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/detectors/registry.py +0 -0
  67. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/detectors/runtimes/__init__.py +0 -0
  68. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/detectors/runtimes/docker.py +0 -0
  69. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/detectors/runtimes/git.py +0 -0
  70. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/detectors/runtimes/node.py +0 -0
  71. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/detectors/runtimes/python.py +0 -0
  72. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/detectors/services/__init__.py +0 -0
  73. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/detectors/services/postgres.py +0 -0
  74. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/detectors/services/redis.py +0 -0
  75. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/detectors/system/__init__.py +0 -0
  76. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/detectors/system/system.py +0 -0
  77. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/models/__init__.py +0 -0
  78. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/models/common.py +0 -0
  79. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/models/container.py +0 -0
  80. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/models/contract.py +0 -0
  81. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/models/contract_result.py +0 -0
  82. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/models/dependency.py +0 -0
  83. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/models/diagnostic.py +0 -0
  84. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/models/environment.py +0 -0
  85. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/models/git.py +0 -0
  86. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/models/network.py +0 -0
  87. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/models/project.py +0 -0
  88. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/models/runmark.py +0 -0
  89. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/models/runtime.py +0 -0
  90. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/models/service.py +0 -0
  91. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/models/system.py +0 -0
  92. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/output/__init__.py +0 -0
  93. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/output/contract.py +0 -0
  94. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/output/json.py +0 -0
  95. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/output/markdown.py +0 -0
  96. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/output/tables.py +0 -0
  97. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/output/terminal.py +0 -0
  98. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/security/__init__.py +0 -0
  99. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/security/contract_sanitizer.py +0 -0
  100. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/security/export_sanitizer.py +0 -0
  101. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/security/redactor.py +0 -0
  102. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/security/sanitizer.py +0 -0
  103. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/security/secret_patterns.py +0 -0
  104. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/storage/__init__.py +0 -0
  105. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/storage/filesystem.py +0 -0
  106. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/storage/paths.py +0 -0
  107. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/utils/__init__.py +0 -0
  108. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/utils/commands.py +0 -0
  109. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/utils/hashing.py +0 -0
  110. {runmark-0.2.1 → runmark-0.2.2}/src/runmark/utils/platform.py +0 -0
  111. {runmark-0.2.1 → runmark-0.2.2}/src/runmark.egg-info/dependency_links.txt +0 -0
  112. {runmark-0.2.1 → runmark-0.2.2}/src/runmark.egg-info/entry_points.txt +0 -0
  113. {runmark-0.2.1 → runmark-0.2.2}/src/runmark.egg-info/requires.txt +0 -0
  114. {runmark-0.2.1 → runmark-0.2.2}/src/runmark.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: runmark
3
- Version: 0.2.1
3
+ Version: 0.2.2
4
4
  Summary: Know what makes your code run. Local-first development environment observability, fingerprinting, comparison, and verification.
5
5
  Author: Runmark Maintainers
6
6
  License: MIT
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "runmark"
7
- version = "0.2.1"
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"
@@ -3,5 +3,5 @@
3
3
  Local-first development environment observability, fingerprinting, comparison, and verification.
4
4
  """
5
5
 
6
- __version__ = "0.2.1"
6
+ __version__ = "0.2.2"
7
7
  __schema_version__ = "1.0"
@@ -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
- SCHEMA_FILE = Path(__file__).resolve().parent.parent.parent.parent / "schemas" / "contract-v1.json"
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
- if not SCHEMA_FILE.exists():
34
- raise FileNotFoundError(f"Schema file not found at: {SCHEMA_FILE}")
35
- with open(SCHEMA_FILE, encoding="utf-8") as f:
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
+ }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: runmark
3
- Version: 0.2.1
3
+ Version: 0.2.2
4
4
  Summary: Know what makes your code run. Local-first development environment observability, fingerprinting, comparison, and verification.
5
5
  Author: Runmark Maintainers
6
6
  License: MIT
@@ -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