atomadic 0.1.0__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.
- atomadic-0.1.0/LICENSE +11 -0
- atomadic-0.1.0/PKG-INFO +244 -0
- atomadic-0.1.0/README.md +226 -0
- atomadic-0.1.0/atomadic/__init__.py +7 -0
- atomadic-0.1.0/atomadic/client.py +31 -0
- atomadic-0.1.0/atomadic/fuse.py +59 -0
- atomadic-0.1.0/atomadic/healer.py +43 -0
- atomadic-0.1.0/atomadic/nexus.py +126 -0
- atomadic-0.1.0/atomadic/proving.py +59 -0
- atomadic-0.1.0/atomadic/release.py +124 -0
- atomadic-0.1.0/atomadic/security.py +105 -0
- atomadic-0.1.0/atomadic.egg-info/PKG-INFO +244 -0
- atomadic-0.1.0/atomadic.egg-info/SOURCES.txt +15 -0
- atomadic-0.1.0/atomadic.egg-info/dependency_links.txt +1 -0
- atomadic-0.1.0/atomadic.egg-info/top_level.txt +1 -0
- atomadic-0.1.0/pyproject.toml +22 -0
- atomadic-0.1.0/setup.cfg +4 -0
atomadic-0.1.0/LICENSE
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
Apache License
|
|
2
|
+
Version 2.0, January 2004
|
|
3
|
+
http://www.apache.org/licenses/
|
|
4
|
+
|
|
5
|
+
Copyright 2026 Atomadic.
|
|
6
|
+
|
|
7
|
+
Licensed under the Apache License, Version 2.0 (the 'License');
|
|
8
|
+
you may not use this file except in compliance with the License.
|
|
9
|
+
You may obtain a copy of the License at
|
|
10
|
+
|
|
11
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
atomadic-0.1.0/PKG-INFO
ADDED
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: atomadic
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Atomadic Python SDK -- one MCP, entitlement-gated tool-sets
|
|
5
|
+
Author-email: Atomadic <support@atomadic.tech>
|
|
6
|
+
License: Apache-2.0
|
|
7
|
+
Project-URL: Homepage, https://atomadic.tech
|
|
8
|
+
Project-URL: Docs, https://atomadic.tech/docs.html
|
|
9
|
+
Project-URL: Issues, https://github.com/atomadictech/atomadic-sdk/issues
|
|
10
|
+
Keywords: atomadic,mcp,agents,sdk,trust,verification
|
|
11
|
+
Classifier: License :: OSI Approved :: Apache Software License
|
|
12
|
+
Classifier: Programming Language :: Python :: 3
|
|
13
|
+
Classifier: Topic :: Software Development :: Libraries
|
|
14
|
+
Requires-Python: >=3.9
|
|
15
|
+
Description-Content-Type: text/markdown
|
|
16
|
+
License-File: LICENSE
|
|
17
|
+
Dynamic: license-file
|
|
18
|
+
|
|
19
|
+
# Atomadic Python SDK
|
|
20
|
+
|
|
21
|
+
[](https://pypi.org/project/atomadic/) [](LICENSE)
|
|
22
|
+
|
|
23
|
+
**One MCP. One key. Every tool-set you are entitled to.**
|
|
24
|
+
|
|
25
|
+
Atomadic is sovereign infrastructure for the agent economy. Mount one MCP at
|
|
26
|
+
`mcp.atomadic.tech`; your **entitlement key** decides which product tool-sets you
|
|
27
|
+
can call. Every call passes Gate-1 (entitlement) then Gate-2 (trust).
|
|
28
|
+
|
|
29
|
+
- **Docs:** https://atomadic.tech/docs.html
|
|
30
|
+
- **Architecture:** https://atomadic.tech/docs.html?d=architecture
|
|
31
|
+
- **Support:** support@atomadic.tech
|
|
32
|
+
|
|
33
|
+
## Install
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
pip install atomadic
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## Quickstart
|
|
40
|
+
|
|
41
|
+
```python
|
|
42
|
+
from atomadic import Atomadic, fuse
|
|
43
|
+
|
|
44
|
+
ato = Atomadic(api_key='ato_...') # or set ATOMADIC_KEY env var
|
|
45
|
+
|
|
46
|
+
# Call any tool your plan unlocks:
|
|
47
|
+
result = fuse.assess_architecture_pure(
|
|
48
|
+
ato,
|
|
49
|
+
source_text='def f(x):\n return x + 1',
|
|
50
|
+
module_name='f_pure',
|
|
51
|
+
)
|
|
52
|
+
print(result['verdict'], result['density'])
|
|
53
|
+
|
|
54
|
+
# Or browse the surface your key unlocks:
|
|
55
|
+
for t in ato.list_tools():
|
|
56
|
+
print(t['name'])
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## Authentication
|
|
60
|
+
|
|
61
|
+
Get an entitlement key from [atomadic.tech](https://atomadic.tech). The key is decoded
|
|
62
|
+
and verified at the edge on every call; minting is internal-only. Keep keys
|
|
63
|
+
server-side -- the gate refuses out-of-plan calls, but secrets belong in your env.
|
|
64
|
+
|
|
65
|
+
```python
|
|
66
|
+
ato = Atomadic(api_key='ato_<blob>_<sig>')
|
|
67
|
+
# or: export ATOMADIC_KEY=ato_<blob>_<sig>
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## Products & tool-sets
|
|
71
|
+
|
|
72
|
+
Each product is an entitlement-gated tool-set; hold the entitlement, call the tool.
|
|
73
|
+
Reserved products (Vanguard, Aegis, Catalyst) and roadmap (Evolve, Research, Mind-Lab)
|
|
74
|
+
are not yet in the SDK.
|
|
75
|
+
|
|
76
|
+
### Fuse [live]
|
|
77
|
+
|
|
78
|
+
`entitlement: fuse` · `from atomadic import fuse`
|
|
79
|
+
|
|
80
|
+
> _Architecture compiler -- AI writes code, we give it architecture._
|
|
81
|
+
|
|
82
|
+
Analyze your code against the 5-tier, single-callable discipline.
|
|
83
|
+
|
|
84
|
+
| Tool | Required args |
|
|
85
|
+
|---|---|
|
|
86
|
+
| **`assess_architecture_pure`** | `source_text`, `module_name` |
|
|
87
|
+
| **`assess_import_direction_pure`** | `source_text`, `tier` |
|
|
88
|
+
| **`scan_code_stubs_pure`** | `source_text` |
|
|
89
|
+
|
|
90
|
+
```python
|
|
91
|
+
from atomadic import Atomadic, fuse
|
|
92
|
+
ato = Atomadic(api_key='ato_...')
|
|
93
|
+
fuse.assess_architecture_pure(ato, source_text=..., module_name=...)
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
See per-tool docstrings for full arg schemas: `help(fuse.assess_architecture_pure)`
|
|
97
|
+
|
|
98
|
+
### Nexus [live]
|
|
99
|
+
|
|
100
|
+
`entitlement: nexus` · `from atomadic import nexus`
|
|
101
|
+
|
|
102
|
+
> _The trust gate every action passes._
|
|
103
|
+
|
|
104
|
+
Gate-2 sovereign trust: trust phases, hallucination bound, signed attestations.
|
|
105
|
+
|
|
106
|
+
| Tool | Required args |
|
|
107
|
+
|---|---|
|
|
108
|
+
| **`assess_nexus_trust_phase_stateful`** | `ledger_path` |
|
|
109
|
+
| **`define_nexus_constants_pure`** | (none) |
|
|
110
|
+
| **`enforce_nexus_gate_stateful`** | `action_kind`, `severity` |
|
|
111
|
+
| **`record_nexus_attestation_stateful`** | `action_kind`, `severity`, `ledger_path` |
|
|
112
|
+
| **`record_nexus_escalation_stateful`** | `action_kind`, `escalation_path` |
|
|
113
|
+
| **`scan_nexus_attestation_history_stateful`** | `ledger_path` |
|
|
114
|
+
|
|
115
|
+
```python
|
|
116
|
+
from atomadic import Atomadic, nexus
|
|
117
|
+
ato = Atomadic(api_key='ato_...')
|
|
118
|
+
nexus.assess_nexus_trust_phase_stateful(ato, ledger_path=...)
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
See per-tool docstrings for full arg schemas: `help(nexus.assess_nexus_trust_phase_stateful)`
|
|
122
|
+
|
|
123
|
+
### Security [live]
|
|
124
|
+
|
|
125
|
+
`entitlement: security` · `from atomadic import security`
|
|
126
|
+
|
|
127
|
+
> _A bubble of protection around every agent._
|
|
128
|
+
|
|
129
|
+
Bubble check, redaction, error-fold, hardening posture (PQC/FIPS-203).
|
|
130
|
+
|
|
131
|
+
| Tool | Required args |
|
|
132
|
+
|---|---|
|
|
133
|
+
| **`assess_security_bubble_pure`** | `content` |
|
|
134
|
+
| **`classify_error_fold_pure`** | `error_message` |
|
|
135
|
+
| **`compute_hardening_posture_pure`** | `target_product_id`, `hardening_level` |
|
|
136
|
+
| **`compute_redacted_args_pure`** | `args` |
|
|
137
|
+
| **`compute_redacted_text_pure`** | `text` |
|
|
138
|
+
| **`define_security_constants_pure`** | (none) |
|
|
139
|
+
|
|
140
|
+
```python
|
|
141
|
+
from atomadic import Atomadic, security
|
|
142
|
+
ato = Atomadic(api_key='ato_...')
|
|
143
|
+
security.assess_security_bubble_pure(ato, content=...)
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
See per-tool docstrings for full arg schemas: `help(security.assess_security_bubble_pure)`
|
|
147
|
+
|
|
148
|
+
### Proving Ground [live]
|
|
149
|
+
|
|
150
|
+
`entitlement: proving` · `from atomadic import proving`
|
|
151
|
+
|
|
152
|
+
> _Nothing ships unproven._
|
|
153
|
+
|
|
154
|
+
Ship-gate, proof-readiness signals, and test-coverage estimation.
|
|
155
|
+
|
|
156
|
+
| Tool | Required args |
|
|
157
|
+
|---|---|
|
|
158
|
+
| **`assess_proof_readiness_pure`** | `source_text` |
|
|
159
|
+
| **`score_test_coverage_pure`** | `source_text`, `test_source` |
|
|
160
|
+
| **`validate_logic_block_composite`** | `source_text`, `module_name` |
|
|
161
|
+
|
|
162
|
+
```python
|
|
163
|
+
from atomadic import Atomadic, proving
|
|
164
|
+
ato = Atomadic(api_key='ato_...')
|
|
165
|
+
proving.assess_proof_readiness_pure(ato, source_text=...)
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
See per-tool docstrings for full arg schemas: `help(proving.assess_proof_readiness_pure)`
|
|
169
|
+
|
|
170
|
+
### Release [live]
|
|
171
|
+
|
|
172
|
+
`entitlement: release` · `from atomadic import release`
|
|
173
|
+
|
|
174
|
+
> _Template -> render -> deploy._
|
|
175
|
+
|
|
176
|
+
Template registry, website render, Cloudflare deploy. Dry-run by default.
|
|
177
|
+
|
|
178
|
+
| Tool | Required args |
|
|
179
|
+
|---|---|
|
|
180
|
+
| **`record_release_template_stateful`** | `template_id`, `kind`, `source_kind`, `source_ref`, `registry_path` |
|
|
181
|
+
| **`render_from_template_pure`** | `template`, `context` |
|
|
182
|
+
| **`render_website_stateful`** | `template_dir`, `context`, `output_dir` |
|
|
183
|
+
| **`scan_release_templates_stateful`** | `registry_path` |
|
|
184
|
+
| **`serve_cloudflare_pages_stateful`** | `directory`, `project_name` |
|
|
185
|
+
| **`serve_cloudflare_worker_stateful`** | `worker_dir` |
|
|
186
|
+
|
|
187
|
+
```python
|
|
188
|
+
from atomadic import Atomadic, release
|
|
189
|
+
ato = Atomadic(api_key='ato_...')
|
|
190
|
+
release.record_release_template_stateful(ato, template_id=..., kind=..., source_kind=...)
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
See per-tool docstrings for full arg schemas: `help(release.record_release_template_stateful)`
|
|
194
|
+
|
|
195
|
+
### Healer [beta]
|
|
196
|
+
|
|
197
|
+
`entitlement: healer` · `from atomadic import healer`
|
|
198
|
+
|
|
199
|
+
> _Diagnose, grade, and plan the repair._
|
|
200
|
+
|
|
201
|
+
Read-only diagnosis: code-health grade + advisory repair plan.
|
|
202
|
+
|
|
203
|
+
| Tool | Required args |
|
|
204
|
+
|---|---|
|
|
205
|
+
| **`assess_artifact_health_pure`** | `source_text` |
|
|
206
|
+
| **`compute_repair_plan_pure`** | `error_message` |
|
|
207
|
+
|
|
208
|
+
```python
|
|
209
|
+
from atomadic import Atomadic, healer
|
|
210
|
+
ato = Atomadic(api_key='ato_...')
|
|
211
|
+
healer.assess_artifact_health_pure(ato, source_text=...)
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
See per-tool docstrings for full arg schemas: `help(healer.assess_artifact_health_pure)`
|
|
215
|
+
|
|
216
|
+
## Two-gate dispatch
|
|
217
|
+
|
|
218
|
+
Every call is filtered then verified:
|
|
219
|
+
|
|
220
|
+
1. **Gate-1 (entitlement):** `tools/list` shows only the tools your plan unlocks; out-of-plan `tools/call` is refused.
|
|
221
|
+
2. **Gate-2 (trust, Nexus):** trust phase + severity ceiling + hallucination bound. Governed actions return a signed `attest:<id>` receipt.
|
|
222
|
+
|
|
223
|
+
See [the architecture docs](https://atomadic.tech/docs.html?d=two-gate) for the full model.
|
|
224
|
+
|
|
225
|
+
## Plans
|
|
226
|
+
|
|
227
|
+
Free / Basic / Dev / Pro / Teams / Enterprise -- per product, or whole-line via
|
|
228
|
+
Murmuration Complete. Subscription is the product; x402 meters only overage + agent-
|
|
229
|
+
to-agent calls. Pricing: https://atomadic.tech/docs.html?d=pricing.
|
|
230
|
+
|
|
231
|
+
## Determinism
|
|
232
|
+
|
|
233
|
+
Pure-tier tools have no side effects and no hidden state: same inputs, same output,
|
|
234
|
+
same content hash, every time. Re-running a pure tool is a verification.
|
|
235
|
+
|
|
236
|
+
## Contributing
|
|
237
|
+
|
|
238
|
+
This SDK is **auto-emitted from the live Atomadic MCP registry** -- changes here
|
|
239
|
+
should flow through the engine, not be hand-patched. For issues, requests, or
|
|
240
|
+
feedback: support@atomadic.tech.
|
|
241
|
+
|
|
242
|
+
## License
|
|
243
|
+
|
|
244
|
+
Apache-2.0 -- see [LICENSE](LICENSE).
|
atomadic-0.1.0/README.md
ADDED
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
# Atomadic Python SDK
|
|
2
|
+
|
|
3
|
+
[](https://pypi.org/project/atomadic/) [](LICENSE)
|
|
4
|
+
|
|
5
|
+
**One MCP. One key. Every tool-set you are entitled to.**
|
|
6
|
+
|
|
7
|
+
Atomadic is sovereign infrastructure for the agent economy. Mount one MCP at
|
|
8
|
+
`mcp.atomadic.tech`; your **entitlement key** decides which product tool-sets you
|
|
9
|
+
can call. Every call passes Gate-1 (entitlement) then Gate-2 (trust).
|
|
10
|
+
|
|
11
|
+
- **Docs:** https://atomadic.tech/docs.html
|
|
12
|
+
- **Architecture:** https://atomadic.tech/docs.html?d=architecture
|
|
13
|
+
- **Support:** support@atomadic.tech
|
|
14
|
+
|
|
15
|
+
## Install
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
pip install atomadic
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Quickstart
|
|
22
|
+
|
|
23
|
+
```python
|
|
24
|
+
from atomadic import Atomadic, fuse
|
|
25
|
+
|
|
26
|
+
ato = Atomadic(api_key='ato_...') # or set ATOMADIC_KEY env var
|
|
27
|
+
|
|
28
|
+
# Call any tool your plan unlocks:
|
|
29
|
+
result = fuse.assess_architecture_pure(
|
|
30
|
+
ato,
|
|
31
|
+
source_text='def f(x):\n return x + 1',
|
|
32
|
+
module_name='f_pure',
|
|
33
|
+
)
|
|
34
|
+
print(result['verdict'], result['density'])
|
|
35
|
+
|
|
36
|
+
# Or browse the surface your key unlocks:
|
|
37
|
+
for t in ato.list_tools():
|
|
38
|
+
print(t['name'])
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Authentication
|
|
42
|
+
|
|
43
|
+
Get an entitlement key from [atomadic.tech](https://atomadic.tech). The key is decoded
|
|
44
|
+
and verified at the edge on every call; minting is internal-only. Keep keys
|
|
45
|
+
server-side -- the gate refuses out-of-plan calls, but secrets belong in your env.
|
|
46
|
+
|
|
47
|
+
```python
|
|
48
|
+
ato = Atomadic(api_key='ato_<blob>_<sig>')
|
|
49
|
+
# or: export ATOMADIC_KEY=ato_<blob>_<sig>
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## Products & tool-sets
|
|
53
|
+
|
|
54
|
+
Each product is an entitlement-gated tool-set; hold the entitlement, call the tool.
|
|
55
|
+
Reserved products (Vanguard, Aegis, Catalyst) and roadmap (Evolve, Research, Mind-Lab)
|
|
56
|
+
are not yet in the SDK.
|
|
57
|
+
|
|
58
|
+
### Fuse [live]
|
|
59
|
+
|
|
60
|
+
`entitlement: fuse` · `from atomadic import fuse`
|
|
61
|
+
|
|
62
|
+
> _Architecture compiler -- AI writes code, we give it architecture._
|
|
63
|
+
|
|
64
|
+
Analyze your code against the 5-tier, single-callable discipline.
|
|
65
|
+
|
|
66
|
+
| Tool | Required args |
|
|
67
|
+
|---|---|
|
|
68
|
+
| **`assess_architecture_pure`** | `source_text`, `module_name` |
|
|
69
|
+
| **`assess_import_direction_pure`** | `source_text`, `tier` |
|
|
70
|
+
| **`scan_code_stubs_pure`** | `source_text` |
|
|
71
|
+
|
|
72
|
+
```python
|
|
73
|
+
from atomadic import Atomadic, fuse
|
|
74
|
+
ato = Atomadic(api_key='ato_...')
|
|
75
|
+
fuse.assess_architecture_pure(ato, source_text=..., module_name=...)
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
See per-tool docstrings for full arg schemas: `help(fuse.assess_architecture_pure)`
|
|
79
|
+
|
|
80
|
+
### Nexus [live]
|
|
81
|
+
|
|
82
|
+
`entitlement: nexus` · `from atomadic import nexus`
|
|
83
|
+
|
|
84
|
+
> _The trust gate every action passes._
|
|
85
|
+
|
|
86
|
+
Gate-2 sovereign trust: trust phases, hallucination bound, signed attestations.
|
|
87
|
+
|
|
88
|
+
| Tool | Required args |
|
|
89
|
+
|---|---|
|
|
90
|
+
| **`assess_nexus_trust_phase_stateful`** | `ledger_path` |
|
|
91
|
+
| **`define_nexus_constants_pure`** | (none) |
|
|
92
|
+
| **`enforce_nexus_gate_stateful`** | `action_kind`, `severity` |
|
|
93
|
+
| **`record_nexus_attestation_stateful`** | `action_kind`, `severity`, `ledger_path` |
|
|
94
|
+
| **`record_nexus_escalation_stateful`** | `action_kind`, `escalation_path` |
|
|
95
|
+
| **`scan_nexus_attestation_history_stateful`** | `ledger_path` |
|
|
96
|
+
|
|
97
|
+
```python
|
|
98
|
+
from atomadic import Atomadic, nexus
|
|
99
|
+
ato = Atomadic(api_key='ato_...')
|
|
100
|
+
nexus.assess_nexus_trust_phase_stateful(ato, ledger_path=...)
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
See per-tool docstrings for full arg schemas: `help(nexus.assess_nexus_trust_phase_stateful)`
|
|
104
|
+
|
|
105
|
+
### Security [live]
|
|
106
|
+
|
|
107
|
+
`entitlement: security` · `from atomadic import security`
|
|
108
|
+
|
|
109
|
+
> _A bubble of protection around every agent._
|
|
110
|
+
|
|
111
|
+
Bubble check, redaction, error-fold, hardening posture (PQC/FIPS-203).
|
|
112
|
+
|
|
113
|
+
| Tool | Required args |
|
|
114
|
+
|---|---|
|
|
115
|
+
| **`assess_security_bubble_pure`** | `content` |
|
|
116
|
+
| **`classify_error_fold_pure`** | `error_message` |
|
|
117
|
+
| **`compute_hardening_posture_pure`** | `target_product_id`, `hardening_level` |
|
|
118
|
+
| **`compute_redacted_args_pure`** | `args` |
|
|
119
|
+
| **`compute_redacted_text_pure`** | `text` |
|
|
120
|
+
| **`define_security_constants_pure`** | (none) |
|
|
121
|
+
|
|
122
|
+
```python
|
|
123
|
+
from atomadic import Atomadic, security
|
|
124
|
+
ato = Atomadic(api_key='ato_...')
|
|
125
|
+
security.assess_security_bubble_pure(ato, content=...)
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
See per-tool docstrings for full arg schemas: `help(security.assess_security_bubble_pure)`
|
|
129
|
+
|
|
130
|
+
### Proving Ground [live]
|
|
131
|
+
|
|
132
|
+
`entitlement: proving` · `from atomadic import proving`
|
|
133
|
+
|
|
134
|
+
> _Nothing ships unproven._
|
|
135
|
+
|
|
136
|
+
Ship-gate, proof-readiness signals, and test-coverage estimation.
|
|
137
|
+
|
|
138
|
+
| Tool | Required args |
|
|
139
|
+
|---|---|
|
|
140
|
+
| **`assess_proof_readiness_pure`** | `source_text` |
|
|
141
|
+
| **`score_test_coverage_pure`** | `source_text`, `test_source` |
|
|
142
|
+
| **`validate_logic_block_composite`** | `source_text`, `module_name` |
|
|
143
|
+
|
|
144
|
+
```python
|
|
145
|
+
from atomadic import Atomadic, proving
|
|
146
|
+
ato = Atomadic(api_key='ato_...')
|
|
147
|
+
proving.assess_proof_readiness_pure(ato, source_text=...)
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
See per-tool docstrings for full arg schemas: `help(proving.assess_proof_readiness_pure)`
|
|
151
|
+
|
|
152
|
+
### Release [live]
|
|
153
|
+
|
|
154
|
+
`entitlement: release` · `from atomadic import release`
|
|
155
|
+
|
|
156
|
+
> _Template -> render -> deploy._
|
|
157
|
+
|
|
158
|
+
Template registry, website render, Cloudflare deploy. Dry-run by default.
|
|
159
|
+
|
|
160
|
+
| Tool | Required args |
|
|
161
|
+
|---|---|
|
|
162
|
+
| **`record_release_template_stateful`** | `template_id`, `kind`, `source_kind`, `source_ref`, `registry_path` |
|
|
163
|
+
| **`render_from_template_pure`** | `template`, `context` |
|
|
164
|
+
| **`render_website_stateful`** | `template_dir`, `context`, `output_dir` |
|
|
165
|
+
| **`scan_release_templates_stateful`** | `registry_path` |
|
|
166
|
+
| **`serve_cloudflare_pages_stateful`** | `directory`, `project_name` |
|
|
167
|
+
| **`serve_cloudflare_worker_stateful`** | `worker_dir` |
|
|
168
|
+
|
|
169
|
+
```python
|
|
170
|
+
from atomadic import Atomadic, release
|
|
171
|
+
ato = Atomadic(api_key='ato_...')
|
|
172
|
+
release.record_release_template_stateful(ato, template_id=..., kind=..., source_kind=...)
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
See per-tool docstrings for full arg schemas: `help(release.record_release_template_stateful)`
|
|
176
|
+
|
|
177
|
+
### Healer [beta]
|
|
178
|
+
|
|
179
|
+
`entitlement: healer` · `from atomadic import healer`
|
|
180
|
+
|
|
181
|
+
> _Diagnose, grade, and plan the repair._
|
|
182
|
+
|
|
183
|
+
Read-only diagnosis: code-health grade + advisory repair plan.
|
|
184
|
+
|
|
185
|
+
| Tool | Required args |
|
|
186
|
+
|---|---|
|
|
187
|
+
| **`assess_artifact_health_pure`** | `source_text` |
|
|
188
|
+
| **`compute_repair_plan_pure`** | `error_message` |
|
|
189
|
+
|
|
190
|
+
```python
|
|
191
|
+
from atomadic import Atomadic, healer
|
|
192
|
+
ato = Atomadic(api_key='ato_...')
|
|
193
|
+
healer.assess_artifact_health_pure(ato, source_text=...)
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
See per-tool docstrings for full arg schemas: `help(healer.assess_artifact_health_pure)`
|
|
197
|
+
|
|
198
|
+
## Two-gate dispatch
|
|
199
|
+
|
|
200
|
+
Every call is filtered then verified:
|
|
201
|
+
|
|
202
|
+
1. **Gate-1 (entitlement):** `tools/list` shows only the tools your plan unlocks; out-of-plan `tools/call` is refused.
|
|
203
|
+
2. **Gate-2 (trust, Nexus):** trust phase + severity ceiling + hallucination bound. Governed actions return a signed `attest:<id>` receipt.
|
|
204
|
+
|
|
205
|
+
See [the architecture docs](https://atomadic.tech/docs.html?d=two-gate) for the full model.
|
|
206
|
+
|
|
207
|
+
## Plans
|
|
208
|
+
|
|
209
|
+
Free / Basic / Dev / Pro / Teams / Enterprise -- per product, or whole-line via
|
|
210
|
+
Murmuration Complete. Subscription is the product; x402 meters only overage + agent-
|
|
211
|
+
to-agent calls. Pricing: https://atomadic.tech/docs.html?d=pricing.
|
|
212
|
+
|
|
213
|
+
## Determinism
|
|
214
|
+
|
|
215
|
+
Pure-tier tools have no side effects and no hidden state: same inputs, same output,
|
|
216
|
+
same content hash, every time. Re-running a pure tool is a verification.
|
|
217
|
+
|
|
218
|
+
## Contributing
|
|
219
|
+
|
|
220
|
+
This SDK is **auto-emitted from the live Atomadic MCP registry** -- changes here
|
|
221
|
+
should flow through the engine, not be hand-patched. For issues, requests, or
|
|
222
|
+
feedback: support@atomadic.tech.
|
|
223
|
+
|
|
224
|
+
## License
|
|
225
|
+
|
|
226
|
+
Apache-2.0 -- see [LICENSE](LICENSE).
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"""Atomadic MCP client -- thin JSON-RPC wrapper over mcp.atomadic.tech."""
|
|
2
|
+
import os, json, urllib.request
|
|
3
|
+
|
|
4
|
+
DEFAULT_URL = 'https://mcp.atomadic.tech'
|
|
5
|
+
|
|
6
|
+
class Atomadic:
|
|
7
|
+
'''Thin MCP client. Set api_key explicitly or via ATOMADIC_KEY env var.'''
|
|
8
|
+
def __init__(self, api_key=None, url=None):
|
|
9
|
+
self.api_key = api_key or os.environ.get('ATOMADIC_KEY', '')
|
|
10
|
+
self.url = url or os.environ.get('ATOMADIC_MCP_URL', DEFAULT_URL)
|
|
11
|
+
self._id = 0
|
|
12
|
+
def _rpc(self, method, params):
|
|
13
|
+
self._id += 1
|
|
14
|
+
body = json.dumps({'jsonrpc': '2.0', 'id': self._id, 'method': method, 'params': params}).encode('utf-8')
|
|
15
|
+
req = urllib.request.Request(self.url, data=body, headers={'Content-Type': 'application/json', 'Authorization': 'Bearer ' + (self.api_key or '')})
|
|
16
|
+
with urllib.request.urlopen(req, timeout=60) as r:
|
|
17
|
+
return json.loads(r.read().decode('utf-8'))
|
|
18
|
+
def call(self, tool, arguments=None):
|
|
19
|
+
resp = self._rpc('tools/call', {'name': tool, 'arguments': arguments or {}})
|
|
20
|
+
if 'error' in resp:
|
|
21
|
+
raise RuntimeError('MCP error: ' + json.dumps(resp['error']))
|
|
22
|
+
content = (resp.get('result') or {}).get('content') or []
|
|
23
|
+
if content and content[0].get('type') == 'text':
|
|
24
|
+
text = content[0].get('text', '')
|
|
25
|
+
try:
|
|
26
|
+
return json.loads(text)
|
|
27
|
+
except (ValueError, TypeError):
|
|
28
|
+
return text
|
|
29
|
+
return resp.get('result')
|
|
30
|
+
def list_tools(self):
|
|
31
|
+
return (self._rpc('tools/list', {}).get('result') or {}).get('tools', [])
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"""atomadic.fuse -- Fuse.
|
|
2
|
+
|
|
3
|
+
Architecture compiler -- AI writes code, we give it architecture.
|
|
4
|
+
Analyze your code against the 5-tier, single-callable discipline.
|
|
5
|
+
|
|
6
|
+
Entitlement: fuse (Gate-1 unlocks these tools).
|
|
7
|
+
Status: live.
|
|
8
|
+
Auto-emitted from the live MCP registry.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
def assess_architecture_pure(client, source_text, module_name, **kwargs):
|
|
12
|
+
"""[Fuse product · entitlement: fuse] Analyze a provided Python source's architecture vs the Atomadic 5-tier / single-callable discipline: callables, single-callable, imports + tier directions, logic density, tier hint, findings, verdict. Operates only on the provided source.
|
|
13
|
+
|
|
14
|
+
Args:
|
|
15
|
+
source_text (string, required): see MCP schema
|
|
16
|
+
module_name (string, required): see MCP schema
|
|
17
|
+
|
|
18
|
+
Example:
|
|
19
|
+
from atomadic import Atomadic, fuse
|
|
20
|
+
ato = Atomadic(api_key='ato_...')
|
|
21
|
+
result = fuse.assess_architecture_pure(ato, source_text=..., module_name=...)
|
|
22
|
+
"""
|
|
23
|
+
args = {'source_text': source_text, 'module_name': module_name}
|
|
24
|
+
args = {k: v for k, v in args.items() if v is not None}
|
|
25
|
+
args.update(kwargs)
|
|
26
|
+
return client.call('assess_architecture_pure', args)
|
|
27
|
+
|
|
28
|
+
def assess_import_direction_pure(client, source_text, tier, **kwargs):
|
|
29
|
+
"""[Fuse product · entitlement: fuse] Tier-law check: verify a source's atomadic imports respect the 5-tier downward-only law (tier-N imports tier-<N only); reports same-tier and upward violations.
|
|
30
|
+
|
|
31
|
+
Args:
|
|
32
|
+
source_text (string, required): see MCP schema
|
|
33
|
+
tier (integer, required): see MCP schema
|
|
34
|
+
|
|
35
|
+
Example:
|
|
36
|
+
from atomadic import Atomadic, fuse
|
|
37
|
+
ato = Atomadic(api_key='ato_...')
|
|
38
|
+
result = fuse.assess_import_direction_pure(ato, source_text=..., tier=...)
|
|
39
|
+
"""
|
|
40
|
+
args = {'source_text': source_text, 'tier': tier}
|
|
41
|
+
args = {k: v for k, v in args.items() if v is not None}
|
|
42
|
+
args.update(kwargs)
|
|
43
|
+
return client.call('assess_import_direction_pure', args)
|
|
44
|
+
|
|
45
|
+
def scan_code_stubs_pure(client, source_text, **kwargs):
|
|
46
|
+
"""[Fuse product · entitlement: fuse] Stub-hunter: scan provided source for stub/scaffold/placeholder patterns (NotImplementedError, TODO/FIXME, ellipsis/pass-only bodies, empty-shell returns). Returns REAL or STUB + findings.
|
|
47
|
+
|
|
48
|
+
Args:
|
|
49
|
+
source_text (string, required): see MCP schema
|
|
50
|
+
|
|
51
|
+
Example:
|
|
52
|
+
from atomadic import Atomadic, fuse
|
|
53
|
+
ato = Atomadic(api_key='ato_...')
|
|
54
|
+
result = fuse.scan_code_stubs_pure(ato, source_text=...)
|
|
55
|
+
"""
|
|
56
|
+
args = {'source_text': source_text}
|
|
57
|
+
args = {k: v for k, v in args.items() if v is not None}
|
|
58
|
+
args.update(kwargs)
|
|
59
|
+
return client.call('scan_code_stubs_pure', args)
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"""atomadic.healer -- Healer.
|
|
2
|
+
|
|
3
|
+
Diagnose, grade, and plan the repair.
|
|
4
|
+
Read-only diagnosis: code-health grade + advisory repair plan.
|
|
5
|
+
|
|
6
|
+
Entitlement: healer (Gate-1 unlocks these tools).
|
|
7
|
+
Status: beta.
|
|
8
|
+
Auto-emitted from the live MCP registry.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
def assess_artifact_health_pure(client, source_text, module_name=None, **kwargs):
|
|
12
|
+
"""[Healer product · entitlement: healer] Composite code-health diagnosis of a provided artifact: parses + logic density + single-callable + stub signals, graded A-F with issues. Read-only.
|
|
13
|
+
|
|
14
|
+
Args:
|
|
15
|
+
source_text (string, required): see MCP schema
|
|
16
|
+
module_name (string, optional): see MCP schema
|
|
17
|
+
|
|
18
|
+
Example:
|
|
19
|
+
from atomadic import Atomadic, healer
|
|
20
|
+
ato = Atomadic(api_key='ato_...')
|
|
21
|
+
result = healer.assess_artifact_health_pure(ato, source_text=...)
|
|
22
|
+
"""
|
|
23
|
+
args = {'source_text': source_text, 'module_name': module_name}
|
|
24
|
+
args = {k: v for k, v in args.items() if v is not None}
|
|
25
|
+
args.update(kwargs)
|
|
26
|
+
return client.call('assess_artifact_health_pure', args)
|
|
27
|
+
|
|
28
|
+
def compute_repair_plan_pure(client, error_message, source_text=None, **kwargs):
|
|
29
|
+
"""[Healer product · entitlement: healer] Compute an advisory repair plan for a provided broken artifact + its error: category, severity, concrete steps, confidence. Read-only — application stays with the customer/operator.
|
|
30
|
+
|
|
31
|
+
Args:
|
|
32
|
+
error_message (string, required): see MCP schema
|
|
33
|
+
source_text (string, optional): see MCP schema
|
|
34
|
+
|
|
35
|
+
Example:
|
|
36
|
+
from atomadic import Atomadic, healer
|
|
37
|
+
ato = Atomadic(api_key='ato_...')
|
|
38
|
+
result = healer.compute_repair_plan_pure(ato, error_message=...)
|
|
39
|
+
"""
|
|
40
|
+
args = {'error_message': error_message, 'source_text': source_text}
|
|
41
|
+
args = {k: v for k, v in args.items() if v is not None}
|
|
42
|
+
args.update(kwargs)
|
|
43
|
+
return client.call('compute_repair_plan_pure', args)
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
"""atomadic.nexus -- Nexus.
|
|
2
|
+
|
|
3
|
+
The trust gate every action passes.
|
|
4
|
+
Gate-2 sovereign trust: trust phases, hallucination bound, signed attestations.
|
|
5
|
+
|
|
6
|
+
Entitlement: nexus (Gate-1 unlocks these tools).
|
|
7
|
+
Status: live.
|
|
8
|
+
Auto-emitted from the live MCP registry.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
def assess_nexus_trust_phase_stateful(client, ledger_path, actor=None, has_federated_key=None, **kwargs):
|
|
12
|
+
"""[Nexus product · entitlement: nexus] Compute an actor's current trust phase (genesis/building/attested/sovereign/escalated) by reading their attestation history from the ledger.
|
|
13
|
+
|
|
14
|
+
Args:
|
|
15
|
+
ledger_path (string, required): see MCP schema
|
|
16
|
+
actor (string, optional): see MCP schema
|
|
17
|
+
has_federated_key (boolean, optional): see MCP schema
|
|
18
|
+
|
|
19
|
+
Example:
|
|
20
|
+
from atomadic import Atomadic, nexus
|
|
21
|
+
ato = Atomadic(api_key='ato_...')
|
|
22
|
+
result = nexus.assess_nexus_trust_phase_stateful(ato, ledger_path=...)
|
|
23
|
+
"""
|
|
24
|
+
args = {'ledger_path': ledger_path, 'actor': actor, 'has_federated_key': has_federated_key}
|
|
25
|
+
args = {k: v for k, v in args.items() if v is not None}
|
|
26
|
+
args.update(kwargs)
|
|
27
|
+
return client.call('assess_nexus_trust_phase_stateful', args)
|
|
28
|
+
|
|
29
|
+
def define_nexus_constants_pure(client, **kwargs):
|
|
30
|
+
"""[Nexus product · entitlement: nexus] The canonical Nexus trust constants: 5 trust phases + thresholds, 4 severities with phase floor + co-signers, signer modes, the 0.95 hallucination-bound floor, attestation schema, and 5 refusal codes.
|
|
31
|
+
|
|
32
|
+
Example:
|
|
33
|
+
from atomadic import Atomadic, nexus
|
|
34
|
+
ato = Atomadic(api_key='ato_...')
|
|
35
|
+
result = nexus.define_nexus_constants_pure(ato)
|
|
36
|
+
"""
|
|
37
|
+
args = {}
|
|
38
|
+
args = {k: v for k, v in args.items() if v is not None}
|
|
39
|
+
args.update(kwargs)
|
|
40
|
+
return client.call('define_nexus_constants_pure', args)
|
|
41
|
+
|
|
42
|
+
def enforce_nexus_gate_stateful(client, action_kind, severity, attestation_count=None, bound_score=None, entitlement_ok=None, has_federated_key=None, ledger_path=None, payload=None, recent_escalations=None, **kwargs):
|
|
43
|
+
"""[Nexus product · entitlement: nexus] Gate-2 two-gate enforcement: resolve trust phase, check severity ceiling, enforce the 0.95 hallucination bound for high/critical, require Gate-1 entitlement; on PASS issue + ledger an attestation. Returns PASS/BLOCKED/ESCALATE + refusal code.
|
|
44
|
+
|
|
45
|
+
Args:
|
|
46
|
+
action_kind (string, required): see MCP schema
|
|
47
|
+
severity (string, required): see MCP schema
|
|
48
|
+
attestation_count (integer, optional): see MCP schema
|
|
49
|
+
bound_score (number/null, optional): see MCP schema
|
|
50
|
+
entitlement_ok (boolean, optional): see MCP schema
|
|
51
|
+
has_federated_key (boolean, optional): see MCP schema
|
|
52
|
+
ledger_path (string, optional): see MCP schema
|
|
53
|
+
payload (object, optional): see MCP schema
|
|
54
|
+
recent_escalations (integer, optional): see MCP schema
|
|
55
|
+
|
|
56
|
+
Example:
|
|
57
|
+
from atomadic import Atomadic, nexus
|
|
58
|
+
ato = Atomadic(api_key='ato_...')
|
|
59
|
+
result = nexus.enforce_nexus_gate_stateful(ato, action_kind=..., severity=...)
|
|
60
|
+
"""
|
|
61
|
+
args = {'action_kind': action_kind, 'severity': severity, 'attestation_count': attestation_count, 'bound_score': bound_score, 'entitlement_ok': entitlement_ok, 'has_federated_key': has_federated_key, 'ledger_path': ledger_path, 'payload': payload, 'recent_escalations': recent_escalations}
|
|
62
|
+
args = {k: v for k, v in args.items() if v is not None}
|
|
63
|
+
args.update(kwargs)
|
|
64
|
+
return client.call('enforce_nexus_gate_stateful', args)
|
|
65
|
+
|
|
66
|
+
def record_nexus_attestation_stateful(client, action_kind, severity, ledger_path, bound_score=None, payload=None, signer_mode=None, trust_phase=None, **kwargs):
|
|
67
|
+
"""[Nexus product · entitlement: nexus] Issue a Nexus attestation envelope (atomadic.nexus_attestation.v1) and append it to the hash-chained attestation ledger. Deterministic envelope + attest:<12-hex> id.
|
|
68
|
+
|
|
69
|
+
Args:
|
|
70
|
+
action_kind (string, required): see MCP schema
|
|
71
|
+
severity (string, required): see MCP schema
|
|
72
|
+
ledger_path (string, required): see MCP schema
|
|
73
|
+
bound_score (number/null, optional): see MCP schema
|
|
74
|
+
payload (object, optional): see MCP schema
|
|
75
|
+
signer_mode (string, optional): see MCP schema
|
|
76
|
+
trust_phase (string, optional): see MCP schema
|
|
77
|
+
|
|
78
|
+
Example:
|
|
79
|
+
from atomadic import Atomadic, nexus
|
|
80
|
+
ato = Atomadic(api_key='ato_...')
|
|
81
|
+
result = nexus.record_nexus_attestation_stateful(ato, action_kind=..., severity=..., ledger_path=...)
|
|
82
|
+
"""
|
|
83
|
+
args = {'action_kind': action_kind, 'severity': severity, 'ledger_path': ledger_path, 'bound_score': bound_score, 'payload': payload, 'signer_mode': signer_mode, 'trust_phase': trust_phase}
|
|
84
|
+
args = {k: v for k, v in args.items() if v is not None}
|
|
85
|
+
args.update(kwargs)
|
|
86
|
+
return client.call('record_nexus_attestation_stateful', args)
|
|
87
|
+
|
|
88
|
+
def record_nexus_escalation_stateful(client, action_kind, escalation_path, actor=None, reason=None, severity=None, **kwargs):
|
|
89
|
+
"""[Nexus product · entitlement: nexus] Emit a Nexus escalation envelope to the Operator surface when an action is at the trust-phase boundary (ESCALATION_REQUIRED).
|
|
90
|
+
|
|
91
|
+
Args:
|
|
92
|
+
action_kind (string, required): see MCP schema
|
|
93
|
+
escalation_path (string, required): see MCP schema
|
|
94
|
+
actor (string, optional): see MCP schema
|
|
95
|
+
reason (string, optional): see MCP schema
|
|
96
|
+
severity (string, optional): see MCP schema
|
|
97
|
+
|
|
98
|
+
Example:
|
|
99
|
+
from atomadic import Atomadic, nexus
|
|
100
|
+
ato = Atomadic(api_key='ato_...')
|
|
101
|
+
result = nexus.record_nexus_escalation_stateful(ato, action_kind=..., escalation_path=...)
|
|
102
|
+
"""
|
|
103
|
+
args = {'action_kind': action_kind, 'escalation_path': escalation_path, 'actor': actor, 'reason': reason, 'severity': severity}
|
|
104
|
+
args = {k: v for k, v in args.items() if v is not None}
|
|
105
|
+
args.update(kwargs)
|
|
106
|
+
return client.call('record_nexus_escalation_stateful', args)
|
|
107
|
+
|
|
108
|
+
def scan_nexus_attestation_history_stateful(client, ledger_path, action_kind=None, limit=None, phase=None, signer_mode=None, **kwargs):
|
|
109
|
+
"""[Nexus product · entitlement: nexus] Query the attestation ledger by action kind, signer mode, and/or trust phase; returns recent matching attestations.
|
|
110
|
+
|
|
111
|
+
Args:
|
|
112
|
+
ledger_path (string, required): see MCP schema
|
|
113
|
+
action_kind (string, optional): see MCP schema
|
|
114
|
+
limit (integer, optional): see MCP schema
|
|
115
|
+
phase (string, optional): see MCP schema
|
|
116
|
+
signer_mode (string, optional): see MCP schema
|
|
117
|
+
|
|
118
|
+
Example:
|
|
119
|
+
from atomadic import Atomadic, nexus
|
|
120
|
+
ato = Atomadic(api_key='ato_...')
|
|
121
|
+
result = nexus.scan_nexus_attestation_history_stateful(ato, ledger_path=...)
|
|
122
|
+
"""
|
|
123
|
+
args = {'ledger_path': ledger_path, 'action_kind': action_kind, 'limit': limit, 'phase': phase, 'signer_mode': signer_mode}
|
|
124
|
+
args = {k: v for k, v in args.items() if v is not None}
|
|
125
|
+
args.update(kwargs)
|
|
126
|
+
return client.call('scan_nexus_attestation_history_stateful', args)
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"""atomadic.proving -- Proving Ground.
|
|
2
|
+
|
|
3
|
+
Nothing ships unproven.
|
|
4
|
+
Ship-gate, proof-readiness signals, and test-coverage estimation.
|
|
5
|
+
|
|
6
|
+
Entitlement: proving (Gate-1 unlocks these tools).
|
|
7
|
+
Status: live.
|
|
8
|
+
Auto-emitted from the live MCP registry.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
def assess_proof_readiness_pure(client, source_text, **kwargs):
|
|
12
|
+
"""[Proving product · entitlement: proving] Assess ship/proof-readiness of provided source: docstring, returns-value, guards/asserts, type-hints, stub-free → score + ready verdict.
|
|
13
|
+
|
|
14
|
+
Args:
|
|
15
|
+
source_text (string, required): see MCP schema
|
|
16
|
+
|
|
17
|
+
Example:
|
|
18
|
+
from atomadic import Atomadic, proving
|
|
19
|
+
ato = Atomadic(api_key='ato_...')
|
|
20
|
+
result = proving.assess_proof_readiness_pure(ato, source_text=...)
|
|
21
|
+
"""
|
|
22
|
+
args = {'source_text': source_text}
|
|
23
|
+
args = {k: v for k, v in args.items() if v is not None}
|
|
24
|
+
args.update(kwargs)
|
|
25
|
+
return client.call('assess_proof_readiness_pure', args)
|
|
26
|
+
|
|
27
|
+
def score_test_coverage_pure(client, source_text, test_source, **kwargs):
|
|
28
|
+
"""[Proving product · entitlement: proving] Estimate test coverage: which top-level functions in the source are referenced by the test source; returns covered/uncovered + coverage ratio.
|
|
29
|
+
|
|
30
|
+
Args:
|
|
31
|
+
source_text (string, required): see MCP schema
|
|
32
|
+
test_source (string, required): see MCP schema
|
|
33
|
+
|
|
34
|
+
Example:
|
|
35
|
+
from atomadic import Atomadic, proving
|
|
36
|
+
ato = Atomadic(api_key='ato_...')
|
|
37
|
+
result = proving.score_test_coverage_pure(ato, source_text=..., test_source=...)
|
|
38
|
+
"""
|
|
39
|
+
args = {'source_text': source_text, 'test_source': test_source}
|
|
40
|
+
args = {k: v for k, v in args.items() if v is not None}
|
|
41
|
+
args.update(kwargs)
|
|
42
|
+
return client.call('score_test_coverage_pure', args)
|
|
43
|
+
|
|
44
|
+
def validate_logic_block_composite(client, source_text, module_name, **kwargs):
|
|
45
|
+
"""[Proving product · entitlement: proving] The ship gate: judge a provided Python source against the Atomadic standards (logic density, single-callable, echo, import isolation, skeleton-clone, stub-emitter, sovereign imports). Returns {passed, violations}.
|
|
46
|
+
|
|
47
|
+
Args:
|
|
48
|
+
source_text (string, required): see MCP schema
|
|
49
|
+
module_name (string, required): see MCP schema
|
|
50
|
+
|
|
51
|
+
Example:
|
|
52
|
+
from atomadic import Atomadic, proving
|
|
53
|
+
ato = Atomadic(api_key='ato_...')
|
|
54
|
+
result = proving.validate_logic_block_composite(ato, source_text=..., module_name=...)
|
|
55
|
+
"""
|
|
56
|
+
args = {'source_text': source_text, 'module_name': module_name}
|
|
57
|
+
args = {k: v for k, v in args.items() if v is not None}
|
|
58
|
+
args.update(kwargs)
|
|
59
|
+
return client.call('validate_logic_block_composite', args)
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
"""atomadic.release -- Release.
|
|
2
|
+
|
|
3
|
+
Template -> render -> deploy.
|
|
4
|
+
Template registry, website render, Cloudflare deploy. Dry-run by default.
|
|
5
|
+
|
|
6
|
+
Entitlement: release (Gate-1 unlocks these tools).
|
|
7
|
+
Status: live.
|
|
8
|
+
Auto-emitted from the live MCP registry.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
def record_release_template_stateful(client, template_id, kind, source_kind, source_ref, registry_path, brand=None, tokens=None, **kwargs):
|
|
12
|
+
"""[Release product · entitlement: release] Register a release template (ours or customer BYO) into the template registry ledger.
|
|
13
|
+
|
|
14
|
+
Args:
|
|
15
|
+
template_id (string, required): see MCP schema
|
|
16
|
+
kind (string, required): see MCP schema
|
|
17
|
+
source_kind (string, required): see MCP schema
|
|
18
|
+
source_ref (string, required): see MCP schema
|
|
19
|
+
registry_path (string, required): see MCP schema
|
|
20
|
+
brand (object, optional): see MCP schema
|
|
21
|
+
tokens (array, optional): see MCP schema
|
|
22
|
+
|
|
23
|
+
Example:
|
|
24
|
+
from atomadic import Atomadic, release
|
|
25
|
+
ato = Atomadic(api_key='ato_...')
|
|
26
|
+
result = release.record_release_template_stateful(ato, template_id=..., kind=..., source_kind=...)
|
|
27
|
+
"""
|
|
28
|
+
args = {'template_id': template_id, 'kind': kind, 'source_kind': source_kind, 'source_ref': source_ref, 'registry_path': registry_path, 'brand': brand, 'tokens': tokens}
|
|
29
|
+
args = {k: v for k, v in args.items() if v is not None}
|
|
30
|
+
args.update(kwargs)
|
|
31
|
+
return client.call('record_release_template_stateful', args)
|
|
32
|
+
|
|
33
|
+
def render_from_template_pure(client, template, context, missing=None, **kwargs):
|
|
34
|
+
"""[Release product · entitlement: release] Deterministically render a {{token}} text template from a context mapping. Ours or customer templates, one code path.
|
|
35
|
+
|
|
36
|
+
Args:
|
|
37
|
+
template (string, required): see MCP schema
|
|
38
|
+
context (object, required): see MCP schema
|
|
39
|
+
missing (string, optional): see MCP schema
|
|
40
|
+
|
|
41
|
+
Example:
|
|
42
|
+
from atomadic import Atomadic, release
|
|
43
|
+
ato = Atomadic(api_key='ato_...')
|
|
44
|
+
result = release.render_from_template_pure(ato, template=..., context=...)
|
|
45
|
+
"""
|
|
46
|
+
args = {'template': template, 'context': context, 'missing': missing}
|
|
47
|
+
args = {k: v for k, v in args.items() if v is not None}
|
|
48
|
+
args.update(kwargs)
|
|
49
|
+
return client.call('render_from_template_pure', args)
|
|
50
|
+
|
|
51
|
+
def render_website_stateful(client, template_dir, context, output_dir, include_ext=None, **kwargs):
|
|
52
|
+
"""[Release product · entitlement: release] Render a static website from a template directory (ours or customer's) into an output dir; {{token}} substitution + assets. Ready for Cloudflare Pages.
|
|
53
|
+
|
|
54
|
+
Args:
|
|
55
|
+
template_dir (string, required): see MCP schema
|
|
56
|
+
context (object, required): see MCP schema
|
|
57
|
+
output_dir (string, required): see MCP schema
|
|
58
|
+
include_ext (array, optional): see MCP schema
|
|
59
|
+
|
|
60
|
+
Example:
|
|
61
|
+
from atomadic import Atomadic, release
|
|
62
|
+
ato = Atomadic(api_key='ato_...')
|
|
63
|
+
result = release.render_website_stateful(ato, template_dir=..., context=..., output_dir=...)
|
|
64
|
+
"""
|
|
65
|
+
args = {'template_dir': template_dir, 'context': context, 'output_dir': output_dir, 'include_ext': include_ext}
|
|
66
|
+
args = {k: v for k, v in args.items() if v is not None}
|
|
67
|
+
args.update(kwargs)
|
|
68
|
+
return client.call('render_website_stateful', args)
|
|
69
|
+
|
|
70
|
+
def scan_release_templates_stateful(client, registry_path, kind=None, **kwargs):
|
|
71
|
+
"""[Release product · entitlement: release] List registered release templates (latest per id), optional kind filter.
|
|
72
|
+
|
|
73
|
+
Args:
|
|
74
|
+
registry_path (string, required): see MCP schema
|
|
75
|
+
kind (string, optional): see MCP schema
|
|
76
|
+
|
|
77
|
+
Example:
|
|
78
|
+
from atomadic import Atomadic, release
|
|
79
|
+
ato = Atomadic(api_key='ato_...')
|
|
80
|
+
result = release.scan_release_templates_stateful(ato, registry_path=...)
|
|
81
|
+
"""
|
|
82
|
+
args = {'registry_path': registry_path, 'kind': kind}
|
|
83
|
+
args = {k: v for k, v in args.items() if v is not None}
|
|
84
|
+
args.update(kwargs)
|
|
85
|
+
return client.call('scan_release_templates_stateful', args)
|
|
86
|
+
|
|
87
|
+
def serve_cloudflare_pages_stateful(client, directory, project_name, branch=None, operator_authorized=None, vault_path=None, **kwargs):
|
|
88
|
+
"""[Release product · entitlement: release] Deploy a built site to Cloudflare Pages via wrangler. Dry-run by default; live ONLY with operator_authorized=true.
|
|
89
|
+
|
|
90
|
+
Args:
|
|
91
|
+
directory (string, required): see MCP schema
|
|
92
|
+
project_name (string, required): see MCP schema
|
|
93
|
+
branch (string, optional): see MCP schema
|
|
94
|
+
operator_authorized (boolean, optional): see MCP schema
|
|
95
|
+
vault_path (string, optional): see MCP schema
|
|
96
|
+
|
|
97
|
+
Example:
|
|
98
|
+
from atomadic import Atomadic, release
|
|
99
|
+
ato = Atomadic(api_key='ato_...')
|
|
100
|
+
result = release.serve_cloudflare_pages_stateful(ato, directory=..., project_name=...)
|
|
101
|
+
"""
|
|
102
|
+
args = {'directory': directory, 'project_name': project_name, 'branch': branch, 'operator_authorized': operator_authorized, 'vault_path': vault_path}
|
|
103
|
+
args = {k: v for k, v in args.items() if v is not None}
|
|
104
|
+
args.update(kwargs)
|
|
105
|
+
return client.call('serve_cloudflare_pages_stateful', args)
|
|
106
|
+
|
|
107
|
+
def serve_cloudflare_worker_stateful(client, worker_dir, operator_authorized=None, vault_path=None, worker_name=None, **kwargs):
|
|
108
|
+
"""[Release product · entitlement: release] Deploy a Cloudflare Worker (e.g. the MCP edge) via wrangler. Dry-run by default; live ONLY with operator_authorized=true.
|
|
109
|
+
|
|
110
|
+
Args:
|
|
111
|
+
worker_dir (string, required): see MCP schema
|
|
112
|
+
operator_authorized (boolean, optional): see MCP schema
|
|
113
|
+
vault_path (string, optional): see MCP schema
|
|
114
|
+
worker_name (string, optional): see MCP schema
|
|
115
|
+
|
|
116
|
+
Example:
|
|
117
|
+
from atomadic import Atomadic, release
|
|
118
|
+
ato = Atomadic(api_key='ato_...')
|
|
119
|
+
result = release.serve_cloudflare_worker_stateful(ato, worker_dir=...)
|
|
120
|
+
"""
|
|
121
|
+
args = {'worker_dir': worker_dir, 'operator_authorized': operator_authorized, 'vault_path': vault_path, 'worker_name': worker_name}
|
|
122
|
+
args = {k: v for k, v in args.items() if v is not None}
|
|
123
|
+
args.update(kwargs)
|
|
124
|
+
return client.call('serve_cloudflare_worker_stateful', args)
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
"""atomadic.security -- Security.
|
|
2
|
+
|
|
3
|
+
A bubble of protection around every agent.
|
|
4
|
+
Bubble check, redaction, error-fold, hardening posture (PQC/FIPS-203).
|
|
5
|
+
|
|
6
|
+
Entitlement: security (Gate-1 unlocks these tools).
|
|
7
|
+
Status: live.
|
|
8
|
+
Auto-emitted from the live MCP registry.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
def assess_security_bubble_pure(client, content, strict=None, **kwargs):
|
|
12
|
+
"""[Security product · entitlement: security] Bubble check: sandbox-scan a content snippet for adversarial / prompt-injection / exfiltration / jailbreak patterns; returns PROCEED / REVIEW / BLOCK with the threats detected.
|
|
13
|
+
|
|
14
|
+
Args:
|
|
15
|
+
content (string, required): see MCP schema
|
|
16
|
+
strict (boolean, optional): see MCP schema
|
|
17
|
+
|
|
18
|
+
Example:
|
|
19
|
+
from atomadic import Atomadic, security
|
|
20
|
+
ato = Atomadic(api_key='ato_...')
|
|
21
|
+
result = security.assess_security_bubble_pure(ato, content=...)
|
|
22
|
+
"""
|
|
23
|
+
args = {'content': content, 'strict': strict}
|
|
24
|
+
args = {k: v for k, v in args.items() if v is not None}
|
|
25
|
+
args.update(kwargs)
|
|
26
|
+
return client.call('assess_security_bubble_pure', args)
|
|
27
|
+
|
|
28
|
+
def classify_error_fold_pure(client, error_message, action_kind=None, **kwargs):
|
|
29
|
+
"""[Security product · entitlement: security] Classify an error-fold entry with severity, category, and a suggested repair path before Healer ingests it.
|
|
30
|
+
|
|
31
|
+
Args:
|
|
32
|
+
error_message (string, required): see MCP schema
|
|
33
|
+
action_kind (string, optional): see MCP schema
|
|
34
|
+
|
|
35
|
+
Example:
|
|
36
|
+
from atomadic import Atomadic, security
|
|
37
|
+
ato = Atomadic(api_key='ato_...')
|
|
38
|
+
result = security.classify_error_fold_pure(ato, error_message=...)
|
|
39
|
+
"""
|
|
40
|
+
args = {'error_message': error_message, 'action_kind': action_kind}
|
|
41
|
+
args = {k: v for k, v in args.items() if v is not None}
|
|
42
|
+
args.update(kwargs)
|
|
43
|
+
return client.call('classify_error_fold_pure', args)
|
|
44
|
+
|
|
45
|
+
def compute_hardening_posture_pure(client, target_product_id, hardening_level, **kwargs):
|
|
46
|
+
"""[Security product · entitlement: security] Compute the recommended hardening posture (cumulative directives) for a target product at a level (info/low/medium/high/critical); critical requires operator co-sign.
|
|
47
|
+
|
|
48
|
+
Args:
|
|
49
|
+
target_product_id (string, required): see MCP schema
|
|
50
|
+
hardening_level (string, required): see MCP schema
|
|
51
|
+
|
|
52
|
+
Example:
|
|
53
|
+
from atomadic import Atomadic, security
|
|
54
|
+
ato = Atomadic(api_key='ato_...')
|
|
55
|
+
result = security.compute_hardening_posture_pure(ato, target_product_id=..., hardening_level=...)
|
|
56
|
+
"""
|
|
57
|
+
args = {'target_product_id': target_product_id, 'hardening_level': hardening_level}
|
|
58
|
+
args = {k: v for k, v in args.items() if v is not None}
|
|
59
|
+
args.update(kwargs)
|
|
60
|
+
return client.call('compute_hardening_posture_pure', args)
|
|
61
|
+
|
|
62
|
+
def compute_redacted_args_pure(client, args, **kwargs):
|
|
63
|
+
"""[Security product · entitlement: security] Redact a tool-args object: replaces secret-pattern values and secret-named fields with safe placeholders (nested-aware).
|
|
64
|
+
|
|
65
|
+
Args:
|
|
66
|
+
args (object, required): see MCP schema
|
|
67
|
+
|
|
68
|
+
Example:
|
|
69
|
+
from atomadic import Atomadic, security
|
|
70
|
+
ato = Atomadic(api_key='ato_...')
|
|
71
|
+
result = security.compute_redacted_args_pure(ato, args=...)
|
|
72
|
+
"""
|
|
73
|
+
args = {'args': args}
|
|
74
|
+
args = {k: v for k, v in args.items() if v is not None}
|
|
75
|
+
args.update(kwargs)
|
|
76
|
+
return client.call('compute_redacted_args_pure', args)
|
|
77
|
+
|
|
78
|
+
def compute_redacted_text_pure(client, text, **kwargs):
|
|
79
|
+
"""[Security product · entitlement: security] Redact secrets from free-form text; replaces each match with a verify-without-reveal placeholder [REDACTED:kind:sha8].
|
|
80
|
+
|
|
81
|
+
Args:
|
|
82
|
+
text (string, required): see MCP schema
|
|
83
|
+
|
|
84
|
+
Example:
|
|
85
|
+
from atomadic import Atomadic, security
|
|
86
|
+
ato = Atomadic(api_key='ato_...')
|
|
87
|
+
result = security.compute_redacted_text_pure(ato, text=...)
|
|
88
|
+
"""
|
|
89
|
+
args = {'text': text}
|
|
90
|
+
args = {k: v for k, v in args.items() if v is not None}
|
|
91
|
+
args.update(kwargs)
|
|
92
|
+
return client.call('compute_redacted_text_pure', args)
|
|
93
|
+
|
|
94
|
+
def define_security_constants_pure(client, **kwargs):
|
|
95
|
+
"""[Security product · entitlement: security] Canonical Security constants: bubble verdicts, hardening levels + cumulative directives, error-fold categories, redaction kinds, PQC standard (FIPS-203).
|
|
96
|
+
|
|
97
|
+
Example:
|
|
98
|
+
from atomadic import Atomadic, security
|
|
99
|
+
ato = Atomadic(api_key='ato_...')
|
|
100
|
+
result = security.define_security_constants_pure(ato)
|
|
101
|
+
"""
|
|
102
|
+
args = {}
|
|
103
|
+
args = {k: v for k, v in args.items() if v is not None}
|
|
104
|
+
args.update(kwargs)
|
|
105
|
+
return client.call('define_security_constants_pure', args)
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: atomadic
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Atomadic Python SDK -- one MCP, entitlement-gated tool-sets
|
|
5
|
+
Author-email: Atomadic <support@atomadic.tech>
|
|
6
|
+
License: Apache-2.0
|
|
7
|
+
Project-URL: Homepage, https://atomadic.tech
|
|
8
|
+
Project-URL: Docs, https://atomadic.tech/docs.html
|
|
9
|
+
Project-URL: Issues, https://github.com/atomadictech/atomadic-sdk/issues
|
|
10
|
+
Keywords: atomadic,mcp,agents,sdk,trust,verification
|
|
11
|
+
Classifier: License :: OSI Approved :: Apache Software License
|
|
12
|
+
Classifier: Programming Language :: Python :: 3
|
|
13
|
+
Classifier: Topic :: Software Development :: Libraries
|
|
14
|
+
Requires-Python: >=3.9
|
|
15
|
+
Description-Content-Type: text/markdown
|
|
16
|
+
License-File: LICENSE
|
|
17
|
+
Dynamic: license-file
|
|
18
|
+
|
|
19
|
+
# Atomadic Python SDK
|
|
20
|
+
|
|
21
|
+
[](https://pypi.org/project/atomadic/) [](LICENSE)
|
|
22
|
+
|
|
23
|
+
**One MCP. One key. Every tool-set you are entitled to.**
|
|
24
|
+
|
|
25
|
+
Atomadic is sovereign infrastructure for the agent economy. Mount one MCP at
|
|
26
|
+
`mcp.atomadic.tech`; your **entitlement key** decides which product tool-sets you
|
|
27
|
+
can call. Every call passes Gate-1 (entitlement) then Gate-2 (trust).
|
|
28
|
+
|
|
29
|
+
- **Docs:** https://atomadic.tech/docs.html
|
|
30
|
+
- **Architecture:** https://atomadic.tech/docs.html?d=architecture
|
|
31
|
+
- **Support:** support@atomadic.tech
|
|
32
|
+
|
|
33
|
+
## Install
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
pip install atomadic
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## Quickstart
|
|
40
|
+
|
|
41
|
+
```python
|
|
42
|
+
from atomadic import Atomadic, fuse
|
|
43
|
+
|
|
44
|
+
ato = Atomadic(api_key='ato_...') # or set ATOMADIC_KEY env var
|
|
45
|
+
|
|
46
|
+
# Call any tool your plan unlocks:
|
|
47
|
+
result = fuse.assess_architecture_pure(
|
|
48
|
+
ato,
|
|
49
|
+
source_text='def f(x):\n return x + 1',
|
|
50
|
+
module_name='f_pure',
|
|
51
|
+
)
|
|
52
|
+
print(result['verdict'], result['density'])
|
|
53
|
+
|
|
54
|
+
# Or browse the surface your key unlocks:
|
|
55
|
+
for t in ato.list_tools():
|
|
56
|
+
print(t['name'])
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## Authentication
|
|
60
|
+
|
|
61
|
+
Get an entitlement key from [atomadic.tech](https://atomadic.tech). The key is decoded
|
|
62
|
+
and verified at the edge on every call; minting is internal-only. Keep keys
|
|
63
|
+
server-side -- the gate refuses out-of-plan calls, but secrets belong in your env.
|
|
64
|
+
|
|
65
|
+
```python
|
|
66
|
+
ato = Atomadic(api_key='ato_<blob>_<sig>')
|
|
67
|
+
# or: export ATOMADIC_KEY=ato_<blob>_<sig>
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## Products & tool-sets
|
|
71
|
+
|
|
72
|
+
Each product is an entitlement-gated tool-set; hold the entitlement, call the tool.
|
|
73
|
+
Reserved products (Vanguard, Aegis, Catalyst) and roadmap (Evolve, Research, Mind-Lab)
|
|
74
|
+
are not yet in the SDK.
|
|
75
|
+
|
|
76
|
+
### Fuse [live]
|
|
77
|
+
|
|
78
|
+
`entitlement: fuse` · `from atomadic import fuse`
|
|
79
|
+
|
|
80
|
+
> _Architecture compiler -- AI writes code, we give it architecture._
|
|
81
|
+
|
|
82
|
+
Analyze your code against the 5-tier, single-callable discipline.
|
|
83
|
+
|
|
84
|
+
| Tool | Required args |
|
|
85
|
+
|---|---|
|
|
86
|
+
| **`assess_architecture_pure`** | `source_text`, `module_name` |
|
|
87
|
+
| **`assess_import_direction_pure`** | `source_text`, `tier` |
|
|
88
|
+
| **`scan_code_stubs_pure`** | `source_text` |
|
|
89
|
+
|
|
90
|
+
```python
|
|
91
|
+
from atomadic import Atomadic, fuse
|
|
92
|
+
ato = Atomadic(api_key='ato_...')
|
|
93
|
+
fuse.assess_architecture_pure(ato, source_text=..., module_name=...)
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
See per-tool docstrings for full arg schemas: `help(fuse.assess_architecture_pure)`
|
|
97
|
+
|
|
98
|
+
### Nexus [live]
|
|
99
|
+
|
|
100
|
+
`entitlement: nexus` · `from atomadic import nexus`
|
|
101
|
+
|
|
102
|
+
> _The trust gate every action passes._
|
|
103
|
+
|
|
104
|
+
Gate-2 sovereign trust: trust phases, hallucination bound, signed attestations.
|
|
105
|
+
|
|
106
|
+
| Tool | Required args |
|
|
107
|
+
|---|---|
|
|
108
|
+
| **`assess_nexus_trust_phase_stateful`** | `ledger_path` |
|
|
109
|
+
| **`define_nexus_constants_pure`** | (none) |
|
|
110
|
+
| **`enforce_nexus_gate_stateful`** | `action_kind`, `severity` |
|
|
111
|
+
| **`record_nexus_attestation_stateful`** | `action_kind`, `severity`, `ledger_path` |
|
|
112
|
+
| **`record_nexus_escalation_stateful`** | `action_kind`, `escalation_path` |
|
|
113
|
+
| **`scan_nexus_attestation_history_stateful`** | `ledger_path` |
|
|
114
|
+
|
|
115
|
+
```python
|
|
116
|
+
from atomadic import Atomadic, nexus
|
|
117
|
+
ato = Atomadic(api_key='ato_...')
|
|
118
|
+
nexus.assess_nexus_trust_phase_stateful(ato, ledger_path=...)
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
See per-tool docstrings for full arg schemas: `help(nexus.assess_nexus_trust_phase_stateful)`
|
|
122
|
+
|
|
123
|
+
### Security [live]
|
|
124
|
+
|
|
125
|
+
`entitlement: security` · `from atomadic import security`
|
|
126
|
+
|
|
127
|
+
> _A bubble of protection around every agent._
|
|
128
|
+
|
|
129
|
+
Bubble check, redaction, error-fold, hardening posture (PQC/FIPS-203).
|
|
130
|
+
|
|
131
|
+
| Tool | Required args |
|
|
132
|
+
|---|---|
|
|
133
|
+
| **`assess_security_bubble_pure`** | `content` |
|
|
134
|
+
| **`classify_error_fold_pure`** | `error_message` |
|
|
135
|
+
| **`compute_hardening_posture_pure`** | `target_product_id`, `hardening_level` |
|
|
136
|
+
| **`compute_redacted_args_pure`** | `args` |
|
|
137
|
+
| **`compute_redacted_text_pure`** | `text` |
|
|
138
|
+
| **`define_security_constants_pure`** | (none) |
|
|
139
|
+
|
|
140
|
+
```python
|
|
141
|
+
from atomadic import Atomadic, security
|
|
142
|
+
ato = Atomadic(api_key='ato_...')
|
|
143
|
+
security.assess_security_bubble_pure(ato, content=...)
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
See per-tool docstrings for full arg schemas: `help(security.assess_security_bubble_pure)`
|
|
147
|
+
|
|
148
|
+
### Proving Ground [live]
|
|
149
|
+
|
|
150
|
+
`entitlement: proving` · `from atomadic import proving`
|
|
151
|
+
|
|
152
|
+
> _Nothing ships unproven._
|
|
153
|
+
|
|
154
|
+
Ship-gate, proof-readiness signals, and test-coverage estimation.
|
|
155
|
+
|
|
156
|
+
| Tool | Required args |
|
|
157
|
+
|---|---|
|
|
158
|
+
| **`assess_proof_readiness_pure`** | `source_text` |
|
|
159
|
+
| **`score_test_coverage_pure`** | `source_text`, `test_source` |
|
|
160
|
+
| **`validate_logic_block_composite`** | `source_text`, `module_name` |
|
|
161
|
+
|
|
162
|
+
```python
|
|
163
|
+
from atomadic import Atomadic, proving
|
|
164
|
+
ato = Atomadic(api_key='ato_...')
|
|
165
|
+
proving.assess_proof_readiness_pure(ato, source_text=...)
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
See per-tool docstrings for full arg schemas: `help(proving.assess_proof_readiness_pure)`
|
|
169
|
+
|
|
170
|
+
### Release [live]
|
|
171
|
+
|
|
172
|
+
`entitlement: release` · `from atomadic import release`
|
|
173
|
+
|
|
174
|
+
> _Template -> render -> deploy._
|
|
175
|
+
|
|
176
|
+
Template registry, website render, Cloudflare deploy. Dry-run by default.
|
|
177
|
+
|
|
178
|
+
| Tool | Required args |
|
|
179
|
+
|---|---|
|
|
180
|
+
| **`record_release_template_stateful`** | `template_id`, `kind`, `source_kind`, `source_ref`, `registry_path` |
|
|
181
|
+
| **`render_from_template_pure`** | `template`, `context` |
|
|
182
|
+
| **`render_website_stateful`** | `template_dir`, `context`, `output_dir` |
|
|
183
|
+
| **`scan_release_templates_stateful`** | `registry_path` |
|
|
184
|
+
| **`serve_cloudflare_pages_stateful`** | `directory`, `project_name` |
|
|
185
|
+
| **`serve_cloudflare_worker_stateful`** | `worker_dir` |
|
|
186
|
+
|
|
187
|
+
```python
|
|
188
|
+
from atomadic import Atomadic, release
|
|
189
|
+
ato = Atomadic(api_key='ato_...')
|
|
190
|
+
release.record_release_template_stateful(ato, template_id=..., kind=..., source_kind=...)
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
See per-tool docstrings for full arg schemas: `help(release.record_release_template_stateful)`
|
|
194
|
+
|
|
195
|
+
### Healer [beta]
|
|
196
|
+
|
|
197
|
+
`entitlement: healer` · `from atomadic import healer`
|
|
198
|
+
|
|
199
|
+
> _Diagnose, grade, and plan the repair._
|
|
200
|
+
|
|
201
|
+
Read-only diagnosis: code-health grade + advisory repair plan.
|
|
202
|
+
|
|
203
|
+
| Tool | Required args |
|
|
204
|
+
|---|---|
|
|
205
|
+
| **`assess_artifact_health_pure`** | `source_text` |
|
|
206
|
+
| **`compute_repair_plan_pure`** | `error_message` |
|
|
207
|
+
|
|
208
|
+
```python
|
|
209
|
+
from atomadic import Atomadic, healer
|
|
210
|
+
ato = Atomadic(api_key='ato_...')
|
|
211
|
+
healer.assess_artifact_health_pure(ato, source_text=...)
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
See per-tool docstrings for full arg schemas: `help(healer.assess_artifact_health_pure)`
|
|
215
|
+
|
|
216
|
+
## Two-gate dispatch
|
|
217
|
+
|
|
218
|
+
Every call is filtered then verified:
|
|
219
|
+
|
|
220
|
+
1. **Gate-1 (entitlement):** `tools/list` shows only the tools your plan unlocks; out-of-plan `tools/call` is refused.
|
|
221
|
+
2. **Gate-2 (trust, Nexus):** trust phase + severity ceiling + hallucination bound. Governed actions return a signed `attest:<id>` receipt.
|
|
222
|
+
|
|
223
|
+
See [the architecture docs](https://atomadic.tech/docs.html?d=two-gate) for the full model.
|
|
224
|
+
|
|
225
|
+
## Plans
|
|
226
|
+
|
|
227
|
+
Free / Basic / Dev / Pro / Teams / Enterprise -- per product, or whole-line via
|
|
228
|
+
Murmuration Complete. Subscription is the product; x402 meters only overage + agent-
|
|
229
|
+
to-agent calls. Pricing: https://atomadic.tech/docs.html?d=pricing.
|
|
230
|
+
|
|
231
|
+
## Determinism
|
|
232
|
+
|
|
233
|
+
Pure-tier tools have no side effects and no hidden state: same inputs, same output,
|
|
234
|
+
same content hash, every time. Re-running a pure tool is a verification.
|
|
235
|
+
|
|
236
|
+
## Contributing
|
|
237
|
+
|
|
238
|
+
This SDK is **auto-emitted from the live Atomadic MCP registry** -- changes here
|
|
239
|
+
should flow through the engine, not be hand-patched. For issues, requests, or
|
|
240
|
+
feedback: support@atomadic.tech.
|
|
241
|
+
|
|
242
|
+
## License
|
|
243
|
+
|
|
244
|
+
Apache-2.0 -- see [LICENSE](LICENSE).
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
LICENSE
|
|
2
|
+
README.md
|
|
3
|
+
pyproject.toml
|
|
4
|
+
atomadic/__init__.py
|
|
5
|
+
atomadic/client.py
|
|
6
|
+
atomadic/fuse.py
|
|
7
|
+
atomadic/healer.py
|
|
8
|
+
atomadic/nexus.py
|
|
9
|
+
atomadic/proving.py
|
|
10
|
+
atomadic/release.py
|
|
11
|
+
atomadic/security.py
|
|
12
|
+
atomadic.egg-info/PKG-INFO
|
|
13
|
+
atomadic.egg-info/SOURCES.txt
|
|
14
|
+
atomadic.egg-info/dependency_links.txt
|
|
15
|
+
atomadic.egg-info/top_level.txt
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
atomadic
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ['setuptools>=68']
|
|
3
|
+
build-backend = 'setuptools.build_meta'
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = 'atomadic'
|
|
7
|
+
version = '0.1.0'
|
|
8
|
+
description = 'Atomadic Python SDK -- one MCP, entitlement-gated tool-sets'
|
|
9
|
+
readme = 'README.md'
|
|
10
|
+
requires-python = '>=3.9'
|
|
11
|
+
license = { text = 'Apache-2.0' }
|
|
12
|
+
authors = [{ name = 'Atomadic', email = 'support@atomadic.tech' }]
|
|
13
|
+
keywords = ['atomadic', 'mcp', 'agents', 'sdk', 'trust', 'verification']
|
|
14
|
+
classifiers = ['License :: OSI Approved :: Apache Software License', 'Programming Language :: Python :: 3', 'Topic :: Software Development :: Libraries']
|
|
15
|
+
|
|
16
|
+
[project.urls]
|
|
17
|
+
Homepage = 'https://atomadic.tech'
|
|
18
|
+
Docs = 'https://atomadic.tech/docs.html'
|
|
19
|
+
Issues = 'https://github.com/atomadictech/atomadic-sdk/issues'
|
|
20
|
+
|
|
21
|
+
[tool.setuptools.packages.find]
|
|
22
|
+
include = ['atomadic*']
|
atomadic-0.1.0/setup.cfg
ADDED