invar-tools 1.0.0__py3-none-any.whl
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.
- invar/__init__.py +68 -0
- invar/contracts.py +152 -0
- invar/core/__init__.py +8 -0
- invar/core/contracts.py +375 -0
- invar/core/extraction.py +172 -0
- invar/core/formatter.py +281 -0
- invar/core/hypothesis_strategies.py +454 -0
- invar/core/inspect.py +154 -0
- invar/core/lambda_helpers.py +190 -0
- invar/core/models.py +289 -0
- invar/core/must_use.py +172 -0
- invar/core/parser.py +276 -0
- invar/core/property_gen.py +383 -0
- invar/core/purity.py +369 -0
- invar/core/purity_heuristics.py +184 -0
- invar/core/references.py +180 -0
- invar/core/rule_meta.py +203 -0
- invar/core/rules.py +435 -0
- invar/core/strategies.py +267 -0
- invar/core/suggestions.py +324 -0
- invar/core/tautology.py +137 -0
- invar/core/timeout_inference.py +114 -0
- invar/core/utils.py +364 -0
- invar/decorators.py +94 -0
- invar/invariant.py +57 -0
- invar/mcp/__init__.py +10 -0
- invar/mcp/__main__.py +13 -0
- invar/mcp/server.py +251 -0
- invar/py.typed +0 -0
- invar/resource.py +99 -0
- invar/shell/__init__.py +8 -0
- invar/shell/cli.py +358 -0
- invar/shell/config.py +248 -0
- invar/shell/fs.py +112 -0
- invar/shell/git.py +85 -0
- invar/shell/guard_helpers.py +324 -0
- invar/shell/guard_output.py +235 -0
- invar/shell/init_cmd.py +289 -0
- invar/shell/mcp_config.py +171 -0
- invar/shell/perception.py +125 -0
- invar/shell/property_tests.py +227 -0
- invar/shell/prove.py +460 -0
- invar/shell/prove_cache.py +133 -0
- invar/shell/prove_fallback.py +183 -0
- invar/shell/templates.py +443 -0
- invar/shell/test_cmd.py +117 -0
- invar/shell/testing.py +297 -0
- invar/shell/update_cmd.py +191 -0
- invar/templates/CLAUDE.md.template +58 -0
- invar/templates/INVAR.md +134 -0
- invar/templates/__init__.py +1 -0
- invar/templates/aider.conf.yml.template +29 -0
- invar/templates/context.md.template +51 -0
- invar/templates/cursorrules.template +28 -0
- invar/templates/examples/README.md +21 -0
- invar/templates/examples/contracts.py +111 -0
- invar/templates/examples/core_shell.py +121 -0
- invar/templates/pre-commit-config.yaml.template +44 -0
- invar/templates/proposal.md.template +93 -0
- invar_tools-1.0.0.dist-info/METADATA +321 -0
- invar_tools-1.0.0.dist-info/RECORD +64 -0
- invar_tools-1.0.0.dist-info/WHEEL +4 -0
- invar_tools-1.0.0.dist-info/entry_points.txt +2 -0
- invar_tools-1.0.0.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,321 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: invar-tools
|
|
3
|
+
Version: 1.0.0
|
|
4
|
+
Summary: AI-native software engineering tools with design-by-contract verification
|
|
5
|
+
Project-URL: Homepage, https://github.com/tefx/invar
|
|
6
|
+
Project-URL: Documentation, https://github.com/tefx/invar#readme
|
|
7
|
+
Project-URL: Repository, https://github.com/tefx/invar
|
|
8
|
+
Project-URL: Issues, https://github.com/tefx/invar/issues
|
|
9
|
+
Author: Invar Team
|
|
10
|
+
License-Expression: MIT
|
|
11
|
+
License-File: LICENSE
|
|
12
|
+
Keywords: ai,code-quality,contracts,design-by-contract,static-analysis
|
|
13
|
+
Classifier: Development Status :: 3 - Alpha
|
|
14
|
+
Classifier: Intended Audience :: Developers
|
|
15
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
16
|
+
Classifier: Programming Language :: Python :: 3
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
19
|
+
Classifier: Topic :: Software Development :: Quality Assurance
|
|
20
|
+
Classifier: Typing :: Typed
|
|
21
|
+
Requires-Python: >=3.11
|
|
22
|
+
Requires-Dist: crosshair-tool>=0.0.60
|
|
23
|
+
Requires-Dist: hypothesis>=6.0
|
|
24
|
+
Requires-Dist: invar-runtime>=1.0
|
|
25
|
+
Requires-Dist: mcp>=1.0
|
|
26
|
+
Requires-Dist: pre-commit>=3.0
|
|
27
|
+
Requires-Dist: pydantic>=2.0
|
|
28
|
+
Requires-Dist: returns>=0.20
|
|
29
|
+
Requires-Dist: rich>=13.0
|
|
30
|
+
Requires-Dist: typer>=0.9
|
|
31
|
+
Provides-Extra: dev
|
|
32
|
+
Requires-Dist: mypy>=1.0; extra == 'dev'
|
|
33
|
+
Requires-Dist: pytest-cov>=4.0; extra == 'dev'
|
|
34
|
+
Requires-Dist: pytest>=7.0; extra == 'dev'
|
|
35
|
+
Requires-Dist: ruff>=0.1; extra == 'dev'
|
|
36
|
+
Description-Content-Type: text/markdown
|
|
37
|
+
|
|
38
|
+
# Invar
|
|
39
|
+
|
|
40
|
+
[](https://badge.fury.io/py/invar-tools)
|
|
41
|
+
[](https://www.python.org/downloads/)
|
|
42
|
+
[](https://opensource.org/licenses/MIT)
|
|
43
|
+
|
|
44
|
+
**Don't hope AI code is correct. Know it.**
|
|
45
|
+
|
|
46
|
+
Invar is a framework that helps developers ensure AI-generated code is reliable through contracts, verification, and mechanical checks.
|
|
47
|
+
|
|
48
|
+
```python
|
|
49
|
+
from invar_runtime import pre, post
|
|
50
|
+
|
|
51
|
+
@pre(lambda items: len(items) > 0)
|
|
52
|
+
@post(lambda result: result >= 0)
|
|
53
|
+
def average(items: list[float]) -> float:
|
|
54
|
+
"""
|
|
55
|
+
>>> average([1, 2, 3])
|
|
56
|
+
2.0
|
|
57
|
+
"""
|
|
58
|
+
return sum(items) / len(items)
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
## Installation
|
|
64
|
+
|
|
65
|
+
### Development Tools
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
# Recommended: use without installing
|
|
69
|
+
uvx invar-tools guard
|
|
70
|
+
|
|
71
|
+
# Or install globally
|
|
72
|
+
pip install invar-tools
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### Runtime Contracts (for your project)
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
pip install invar-runtime
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
**Packages:**
|
|
82
|
+
|
|
83
|
+
| Package | Size | Purpose |
|
|
84
|
+
|---------|------|---------|
|
|
85
|
+
| `invar-runtime` | ~3MB | Runtime contracts (`@pre`, `@post`, etc.) |
|
|
86
|
+
| `invar-tools` | ~100MB | Development tools (`guard`, `map`, `sig`, MCP) |
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
## Quick Start
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
cd your-project
|
|
94
|
+
invar init # Creates INVAR.md, CLAUDE.md, .invar/
|
|
95
|
+
invar guard # Verify code quality
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
**Multi-Agent Support:** `invar init` auto-detects and configures:
|
|
99
|
+
|
|
100
|
+
| AI Tool | Configuration |
|
|
101
|
+
|---------|---------------|
|
|
102
|
+
| Claude Code | Creates CLAUDE.md + MCP server |
|
|
103
|
+
| Cursor | Adds to .cursorrules |
|
|
104
|
+
| Aider | Adds to .aider.conf.yml |
|
|
105
|
+
| Others | Add "Follow INVAR.md" to system prompt |
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
## Core/Shell Architecture
|
|
110
|
+
|
|
111
|
+
Invar enforces separation between pure logic and I/O:
|
|
112
|
+
|
|
113
|
+
| Zone | Requirements | Forbidden |
|
|
114
|
+
|------|--------------|-----------|
|
|
115
|
+
| **Core** | `@pre`/`@post` contracts, doctests | I/O imports (os, pathlib, requests...) |
|
|
116
|
+
| **Shell** | `Result[T, E]` returns | - |
|
|
117
|
+
|
|
118
|
+
```python
|
|
119
|
+
# Core: Pure logic, receives data
|
|
120
|
+
def parse_config(content: str) -> Config:
|
|
121
|
+
return Config.parse(content)
|
|
122
|
+
|
|
123
|
+
# Shell: Handles I/O, returns Result
|
|
124
|
+
def load_config(path: Path) -> Result[Config, str]:
|
|
125
|
+
content = path.read_text()
|
|
126
|
+
return Success(parse_config(content))
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
## Commands
|
|
132
|
+
|
|
133
|
+
### Guard (Primary)
|
|
134
|
+
|
|
135
|
+
```bash
|
|
136
|
+
invar guard # Full verification (default)
|
|
137
|
+
invar guard --changed # Only git-modified files
|
|
138
|
+
invar guard --static # Static only (~0.5s)
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
**Flags:**
|
|
142
|
+
|
|
143
|
+
| Flag | Purpose |
|
|
144
|
+
|------|---------|
|
|
145
|
+
| `--strict` | Treat warnings as errors |
|
|
146
|
+
| `--explain` | Show rule limitations |
|
|
147
|
+
| `--agent` | JSON output for AI tools |
|
|
148
|
+
| `--pedantic` | Show all rules including off-by-default |
|
|
149
|
+
|
|
150
|
+
### Other Commands
|
|
151
|
+
|
|
152
|
+
```bash
|
|
153
|
+
invar sig <file> # Show signatures + contracts
|
|
154
|
+
invar map --top 10 # Most-referenced symbols
|
|
155
|
+
invar rules # List all rules
|
|
156
|
+
invar update # Update managed files
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
---
|
|
160
|
+
|
|
161
|
+
## Verification Levels (DX-19)
|
|
162
|
+
|
|
163
|
+
| Level | Command | Checks | When to Use |
|
|
164
|
+
|-------|---------|--------|-------------|
|
|
165
|
+
| STATIC | `--static` | Rules only (~0.5s) | Debugging static analysis |
|
|
166
|
+
| STANDARD | (default) | Rules + doctests + CrossHair + Hypothesis (~5s) | Everything else |
|
|
167
|
+
|
|
168
|
+
**Zero decisions:** Default runs full verification. Incremental mode makes it fast (~5s first, ~2s cached).
|
|
169
|
+
|
|
170
|
+
---
|
|
171
|
+
|
|
172
|
+
## Configuration
|
|
173
|
+
|
|
174
|
+
### pyproject.toml
|
|
175
|
+
|
|
176
|
+
```toml
|
|
177
|
+
[tool.invar.guard]
|
|
178
|
+
# Directory classification
|
|
179
|
+
core_paths = ["src/myapp/core"]
|
|
180
|
+
shell_paths = ["src/myapp/shell"]
|
|
181
|
+
|
|
182
|
+
# Or use patterns for existing projects
|
|
183
|
+
core_patterns = ["**/domain/**", "**/models/**"]
|
|
184
|
+
shell_patterns = ["**/api/**", "**/cli/**"]
|
|
185
|
+
|
|
186
|
+
# Size limits
|
|
187
|
+
max_file_lines = 500
|
|
188
|
+
max_function_lines = 50
|
|
189
|
+
|
|
190
|
+
# Contract requirements
|
|
191
|
+
require_contracts = true
|
|
192
|
+
require_doctests = true
|
|
193
|
+
|
|
194
|
+
# Doctest-heavy code
|
|
195
|
+
exclude_doctest_lines = true
|
|
196
|
+
|
|
197
|
+
# Purity overrides
|
|
198
|
+
purity_pure = ["pandas.DataFrame.groupby"]
|
|
199
|
+
purity_impure = ["my_module.cached_lookup"]
|
|
200
|
+
|
|
201
|
+
# Rule exclusions
|
|
202
|
+
[[tool.invar.guard.rule_exclusions]]
|
|
203
|
+
pattern = "**/generated/**"
|
|
204
|
+
rules = ["*"]
|
|
205
|
+
|
|
206
|
+
# Severity overrides
|
|
207
|
+
[tool.invar.guard.severity_overrides]
|
|
208
|
+
redundant_type_contract = "off"
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
---
|
|
212
|
+
|
|
213
|
+
## Rules Reference
|
|
214
|
+
|
|
215
|
+
| Rule | Severity | What It Checks |
|
|
216
|
+
|------|----------|----------------|
|
|
217
|
+
| `file_size` | ERROR | File > max lines |
|
|
218
|
+
| `function_size` | WARN | Function > max lines |
|
|
219
|
+
| `missing_contract` | ERROR | Core function lacks @pre/@post |
|
|
220
|
+
| `missing_doctest` | WARN | Contracted function lacks doctest |
|
|
221
|
+
| `forbidden_import` | ERROR | I/O import in Core |
|
|
222
|
+
| `shell_result` | WARN | Shell function not returning Result |
|
|
223
|
+
| `empty_contract` | ERROR | Contract is `lambda: True` |
|
|
224
|
+
| `param_mismatch` | ERROR | Lambda params ≠ function params |
|
|
225
|
+
|
|
226
|
+
Full list: `invar rules --explain`
|
|
227
|
+
|
|
228
|
+
---
|
|
229
|
+
|
|
230
|
+
## MCP Integration (Claude Code)
|
|
231
|
+
|
|
232
|
+
`invar init` automatically creates `.mcp.json` with smart detection of available methods:
|
|
233
|
+
|
|
234
|
+
```json
|
|
235
|
+
{
|
|
236
|
+
"mcpServers": {
|
|
237
|
+
"invar": {
|
|
238
|
+
"command": "uvx",
|
|
239
|
+
"args": ["invar-tools", "mcp"]
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
**Claude Code Integration:**
|
|
246
|
+
|
|
247
|
+
```bash
|
|
248
|
+
# Full integration (recommended)
|
|
249
|
+
invar init --claude
|
|
250
|
+
|
|
251
|
+
# Specify MCP method
|
|
252
|
+
invar init --claude --mcp-method uvx # Recommended
|
|
253
|
+
invar init --claude --mcp-method command # Use PATH invar
|
|
254
|
+
invar init --claude --mcp-method python # Use current Python
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
**MCP Tools:**
|
|
258
|
+
|
|
259
|
+
| Tool | Replaces | Purpose |
|
|
260
|
+
|------|----------|---------|
|
|
261
|
+
| `invar_guard` | `pytest`, `crosshair` | Smart Guard verification |
|
|
262
|
+
| `invar_sig` | Reading entire file | Show contracts and signatures |
|
|
263
|
+
| `invar_map` | `grep` for functions | Symbol map with reference counts |
|
|
264
|
+
|
|
265
|
+
Manual setup: See `.invar/mcp-setup.md` after running `invar init`.
|
|
266
|
+
|
|
267
|
+
---
|
|
268
|
+
|
|
269
|
+
## File Ownership
|
|
270
|
+
|
|
271
|
+
| File | Owner | Edit? |
|
|
272
|
+
|------|-------|-------|
|
|
273
|
+
| `INVAR.md` | Invar | No (`invar update` manages) |
|
|
274
|
+
| `CLAUDE.md` | You | Yes (project config) |
|
|
275
|
+
| `.invar/examples/` | Invar | No (reference only) |
|
|
276
|
+
|
|
277
|
+
---
|
|
278
|
+
|
|
279
|
+
## Runtime Behavior
|
|
280
|
+
|
|
281
|
+
Contracts are checked at runtime via [deal](https://github.com/life4/deal).
|
|
282
|
+
|
|
283
|
+
```bash
|
|
284
|
+
# Disable in production
|
|
285
|
+
DEAL_DISABLE=1 python app.py
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
---
|
|
289
|
+
|
|
290
|
+
## Troubleshooting
|
|
291
|
+
|
|
292
|
+
**Guard is slow:**
|
|
293
|
+
- Use `--changed` for incremental checks
|
|
294
|
+
- Use `--static` to skip doctests during debugging
|
|
295
|
+
|
|
296
|
+
**Too many warnings:**
|
|
297
|
+
- Add exclusions for generated code
|
|
298
|
+
- Override severity for noisy rules
|
|
299
|
+
|
|
300
|
+
**CrossHair timeout:**
|
|
301
|
+
- Some code patterns don't work well with symbolic execution
|
|
302
|
+
- Hypothesis fallback runs automatically
|
|
303
|
+
|
|
304
|
+
---
|
|
305
|
+
|
|
306
|
+
## Learn More
|
|
307
|
+
|
|
308
|
+
**In your project** (created by `invar init`):
|
|
309
|
+
- `INVAR.md` — Protocol for AI agents
|
|
310
|
+
- `CLAUDE.md` — Project configuration
|
|
311
|
+
- `.invar/examples/` — Reference patterns
|
|
312
|
+
|
|
313
|
+
**Documentation:**
|
|
314
|
+
- [docs/INVAR-GUIDE.md](./docs/INVAR-GUIDE.md) — Detailed guide
|
|
315
|
+
- [docs/VISION.md](./docs/VISION.md) — Design philosophy
|
|
316
|
+
|
|
317
|
+
---
|
|
318
|
+
|
|
319
|
+
## License
|
|
320
|
+
|
|
321
|
+
MIT
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
invar/__init__.py,sha256=gvCf_VzCH3gMfq6dvsvncxicAEv7_FhgBoQTBdbqcFM,1256
|
|
2
|
+
invar/contracts.py,sha256=xAqk901hd3ep7ItxCln7Q0fID3rm47OROgEugmFnRY4,4631
|
|
3
|
+
invar/decorators.py,sha256=EaZUgt4JzlhSgRTeRmKIEb-KgU8L5Npn8-oJuMuygRU,2677
|
|
4
|
+
invar/invariant.py,sha256=PJ4vBET0uSxZmjr7flgrfPACyefXTCw3EM6_aREcnys,1609
|
|
5
|
+
invar/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
6
|
+
invar/resource.py,sha256=uX3V8R8_e5uFRO6ksOt_RN62g6nmf_wzpjyr9JXNhoc,2680
|
|
7
|
+
invar/core/__init__.py,sha256=01TgQ2bqTFV4VFdksfqXYPa2WUqo-DpUWUkEcIUXFb4,218
|
|
8
|
+
invar/core/contracts.py,sha256=9v2fD1EoNbWDTUHLXdv3WvYFwk0FQwAu1jTlptnq93w,16008
|
|
9
|
+
invar/core/extraction.py,sha256=NEGtpmPLIg0O_EnXGEDQcTRXudwJneysYCM3rpy0a2g,6058
|
|
10
|
+
invar/core/formatter.py,sha256=M4Y6BlZuxRNFkGzng6ysPcCsB5cKHpuSVEZlUJIs4OY,9542
|
|
11
|
+
invar/core/hypothesis_strategies.py,sha256=eOQAUjm5JCjzdMhPSfFtNytols5iQKTh6O7i4PhaqLY,15139
|
|
12
|
+
invar/core/inspect.py,sha256=5OX-c3BJ7GEiJWqIY77GYoP0Ox15cTcrmlNfjh9Hvfg,4380
|
|
13
|
+
invar/core/lambda_helpers.py,sha256=c4kX5ATsAiNu9nMayLWWWOD68ft0iN0Z6Lkfj4JuuPo,6326
|
|
14
|
+
invar/core/models.py,sha256=2pws44NN4eaihbTPy6k-P9oZfFQABf_PSwGvXH18TzE,8902
|
|
15
|
+
invar/core/must_use.py,sha256=R8VsIIWqLXtVov1kf5RqiKfkvqI1o2Bn4rKKNo5KFSw,5376
|
|
16
|
+
invar/core/parser.py,sha256=I_FE2Rum1NxdqIr_qajxc8lp0vaBYTWkn3EEP480iUE,8862
|
|
17
|
+
invar/core/property_gen.py,sha256=VBxEyfJmAqqteNpP8DM_kmZd0F3bf5oiYXpIE-WNFQY,11866
|
|
18
|
+
invar/core/purity.py,sha256=gqhS3ZvJFPSol17CEwYarK7XPEl9eL6sz2B_b-dzKIo,11582
|
|
19
|
+
invar/core/purity_heuristics.py,sha256=dcdYqJJh-RLZHZR_G1j1gViH3Cqe37RfE3leaA2MU34,4748
|
|
20
|
+
invar/core/references.py,sha256=iOIivmQ3Qcp38XiFpzaa7EZa01Ab75Q-G7KR2PRn-tI,6107
|
|
21
|
+
invar/core/rule_meta.py,sha256=nhicVNhbw_Tw5dxd9SEQBZLuuBtiEEsFlm0zq3QInb0,6702
|
|
22
|
+
invar/core/rules.py,sha256=7WY_NJF0PM-w1Adkm2EL9ysgZsbxeVcRlhwzg2E4PWc,17174
|
|
23
|
+
invar/core/strategies.py,sha256=AhiEJl-5SxXKSmprpeT4OdCmEk7dS3Di7Eb90I7QENQ,8797
|
|
24
|
+
invar/core/suggestions.py,sha256=H5_cupuWHu2nFiTVS91iFxW8U-E4i6cIWdD9ggoQLB8,11167
|
|
25
|
+
invar/core/tautology.py,sha256=btrcFMQElLPr-BM5LZO0YzUqQwvkLUYLFtAhho4K9_s,5564
|
|
26
|
+
invar/core/timeout_inference.py,sha256=NOLwNuadLAKvGTtAnd3qppZikVfKlo2ZPxHFVg4Vupk,3544
|
|
27
|
+
invar/core/utils.py,sha256=xMynNQPRsjtslg0SEzabYJ05hutDCzDOR5v9nzLwiis,12986
|
|
28
|
+
invar/mcp/__init__.py,sha256=n3S7QwMjSMqOMT8cI2jf9E0yZPjKmBOJyIYhq4WZ8TQ,226
|
|
29
|
+
invar/mcp/__main__.py,sha256=ZcIT2U6xUyGOWucl4jq422BDE3lRLjqyxb9pFylRBdk,219
|
|
30
|
+
invar/mcp/server.py,sha256=bfCqLpfQxYQAP2Z3Ig2be8ZJnSKTQXGVBSfzV-5NwWE,7645
|
|
31
|
+
invar/shell/__init__.py,sha256=FFw1mNbh_97PeKPcHIqQpQ7mw-JoIvyLM1yOdxLw5uk,204
|
|
32
|
+
invar/shell/cli.py,sha256=Amg08r_vVY4nKCjDzABrA_VSm_e19va7VV-reb2JlKE,12154
|
|
33
|
+
invar/shell/config.py,sha256=yutQPCOw9YfN-m9v3IDV80m3RttJlXS70UDA1ceS_8M,7396
|
|
34
|
+
invar/shell/fs.py,sha256=HQaZmOWkfWvqjkDTwt8kyxP9xvDMudG-4rFy9DWVc4s,3437
|
|
35
|
+
invar/shell/git.py,sha256=DOQhG6pfyxmZRrMLuqf4oVGpOlVLlnX5EUfU354JHVA,2614
|
|
36
|
+
invar/shell/guard_helpers.py,sha256=kZmfmc1e2pimzPcHfbJpWm_P3nhR8Cg1da8FxVNmHpw,10749
|
|
37
|
+
invar/shell/guard_output.py,sha256=nE-yncGuMwUxbak_nd59bMGQBnDHi2O3fn23w9TJ-eY,8347
|
|
38
|
+
invar/shell/init_cmd.py,sha256=EGZNngBH_04WXJYsBzJHB478sajnNHNluEqYMul1KNE,10165
|
|
39
|
+
invar/shell/mcp_config.py,sha256=Gxpmw3UN-xLas_8qU0miIBrVRSOscCt7Wb5LobJO8tw,4427
|
|
40
|
+
invar/shell/perception.py,sha256=HwH2MSQC8IkeWqFm4Bcm0iylaqX6H2ZbqG5xdIlQXO0,3700
|
|
41
|
+
invar/shell/property_tests.py,sha256=NKDWH7iRC6Vpdl9kkzzxSkTKPa8mb8VBqot339zAmUc,6493
|
|
42
|
+
invar/shell/prove.py,sha256=Eb-dhSrDN6b1Pv9F6nnpCz35kevXrPgdvMIPl0uvjHY,13978
|
|
43
|
+
invar/shell/prove_cache.py,sha256=jbNdrvfLjvK7S0iqugErqeabb4YIbQuwIlcSRyCKbcg,4105
|
|
44
|
+
invar/shell/prove_fallback.py,sha256=PmJqhV0aYLYZ5qW4nnOGZOKVgWjpCpsvZrCNvilcuJE,5719
|
|
45
|
+
invar/shell/templates.py,sha256=PYlkjowvJonZljwXlYD-K2Q6i6Km4xMP60AlGRhyNFQ,13642
|
|
46
|
+
invar/shell/test_cmd.py,sha256=I651IJN_bxnxXk2W47RQhUpT5F6UtgfS1YDoJ5-f9WY,4068
|
|
47
|
+
invar/shell/testing.py,sha256=qQKaG6i2pdO8SlT7ymRD6B7vDkQ_sSLqN5oHrEaIGgE,8991
|
|
48
|
+
invar/shell/update_cmd.py,sha256=dzuF_Fu4m32lvGYCLdHfQEQpZzGRL3hJSzwpqytMwmw,6190
|
|
49
|
+
invar/templates/__init__.py,sha256=cb3ht8KPK5oBn5oG6HsTznujmo9WriJ_P--fVxJwycc,45
|
|
50
|
+
invar/templates/aider.conf.yml.template,sha256=MKtBZT-Mz6YkoF46vlA85Nr8OuYQVlsAPzhaQp6Xhko,831
|
|
51
|
+
invar/templates/cursorrules.template,sha256=J663VycDV0MsM04hDK9aIRejgVbA8OrRM-kn9rN3w4I,878
|
|
52
|
+
invar/templates/examples/README.md,sha256=dkS5QI1mzDsQp23dJGCoTZzM_1SQg1vos37sZAS-Wsc,485
|
|
53
|
+
invar/templates/examples/contracts.py,sha256=46KpdotDgaospIO1cy1B9AQ-G8Oqu3b8uYcFYRAG8_4,3062
|
|
54
|
+
invar/templates/examples/core_shell.py,sha256=mA1luz4aeurYIb_Uy0Fte-0qb2n5dYqdSU70Ga9MneM,3678
|
|
55
|
+
invar/templates/CLAUDE.md.template,sha256=WGPNMjV2C7Lp68snYWYFpXONSqGAPmmudobNb0KoNyI,1594
|
|
56
|
+
invar/templates/INVAR.md,sha256=c1ezOVuGF8uhLGWjrdHtcPgWpgOuIzXQoPqGme916xU,4533
|
|
57
|
+
invar/templates/context.md.template,sha256=D4mIAbj33io5_xe0uTcZh5JuSfpzXpv_t5h6k0B6UIA,1168
|
|
58
|
+
invar/templates/pre-commit-config.yaml.template,sha256=2qWY3E8iDUqi85jE_X7y0atE88YOlL5IZ93wkjCgQGo,1737
|
|
59
|
+
invar/templates/proposal.md.template,sha256=UP7SpQ7gk8jVlHGLQCSQ5c-kCj1DBQEz8M-vEStK77I,1573
|
|
60
|
+
invar_tools-1.0.0.dist-info/METADATA,sha256=GiNpK5taOqOuIPRyPP5hDnmI0Zyw_DWDlg27CTx0iYg,8123
|
|
61
|
+
invar_tools-1.0.0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
|
|
62
|
+
invar_tools-1.0.0.dist-info/entry_points.txt,sha256=C7R-M4tvNd6UHDOcG98RQVS9plLyJ-c939z8qLLzTj8,46
|
|
63
|
+
invar_tools-1.0.0.dist-info/licenses/LICENSE,sha256=c9ClTzwDoKiyVo3hGAtPa7F9QpMagpluUWAnbD5BP0w,1075
|
|
64
|
+
invar_tools-1.0.0.dist-info/RECORD,,
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Invar Contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|