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.
Files changed (64) hide show
  1. invar/__init__.py +68 -0
  2. invar/contracts.py +152 -0
  3. invar/core/__init__.py +8 -0
  4. invar/core/contracts.py +375 -0
  5. invar/core/extraction.py +172 -0
  6. invar/core/formatter.py +281 -0
  7. invar/core/hypothesis_strategies.py +454 -0
  8. invar/core/inspect.py +154 -0
  9. invar/core/lambda_helpers.py +190 -0
  10. invar/core/models.py +289 -0
  11. invar/core/must_use.py +172 -0
  12. invar/core/parser.py +276 -0
  13. invar/core/property_gen.py +383 -0
  14. invar/core/purity.py +369 -0
  15. invar/core/purity_heuristics.py +184 -0
  16. invar/core/references.py +180 -0
  17. invar/core/rule_meta.py +203 -0
  18. invar/core/rules.py +435 -0
  19. invar/core/strategies.py +267 -0
  20. invar/core/suggestions.py +324 -0
  21. invar/core/tautology.py +137 -0
  22. invar/core/timeout_inference.py +114 -0
  23. invar/core/utils.py +364 -0
  24. invar/decorators.py +94 -0
  25. invar/invariant.py +57 -0
  26. invar/mcp/__init__.py +10 -0
  27. invar/mcp/__main__.py +13 -0
  28. invar/mcp/server.py +251 -0
  29. invar/py.typed +0 -0
  30. invar/resource.py +99 -0
  31. invar/shell/__init__.py +8 -0
  32. invar/shell/cli.py +358 -0
  33. invar/shell/config.py +248 -0
  34. invar/shell/fs.py +112 -0
  35. invar/shell/git.py +85 -0
  36. invar/shell/guard_helpers.py +324 -0
  37. invar/shell/guard_output.py +235 -0
  38. invar/shell/init_cmd.py +289 -0
  39. invar/shell/mcp_config.py +171 -0
  40. invar/shell/perception.py +125 -0
  41. invar/shell/property_tests.py +227 -0
  42. invar/shell/prove.py +460 -0
  43. invar/shell/prove_cache.py +133 -0
  44. invar/shell/prove_fallback.py +183 -0
  45. invar/shell/templates.py +443 -0
  46. invar/shell/test_cmd.py +117 -0
  47. invar/shell/testing.py +297 -0
  48. invar/shell/update_cmd.py +191 -0
  49. invar/templates/CLAUDE.md.template +58 -0
  50. invar/templates/INVAR.md +134 -0
  51. invar/templates/__init__.py +1 -0
  52. invar/templates/aider.conf.yml.template +29 -0
  53. invar/templates/context.md.template +51 -0
  54. invar/templates/cursorrules.template +28 -0
  55. invar/templates/examples/README.md +21 -0
  56. invar/templates/examples/contracts.py +111 -0
  57. invar/templates/examples/core_shell.py +121 -0
  58. invar/templates/pre-commit-config.yaml.template +44 -0
  59. invar/templates/proposal.md.template +93 -0
  60. invar_tools-1.0.0.dist-info/METADATA +321 -0
  61. invar_tools-1.0.0.dist-info/RECORD +64 -0
  62. invar_tools-1.0.0.dist-info/WHEEL +4 -0
  63. invar_tools-1.0.0.dist-info/entry_points.txt +2 -0
  64. 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
+ [![PyPI version](https://badge.fury.io/py/invar-tools.svg)](https://badge.fury.io/py/invar-tools)
41
+ [![Python 3.11+](https://img.shields.io/badge/python-3.11+-blue.svg)](https://www.python.org/downloads/)
42
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](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,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: hatchling 1.28.0
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ invar = invar.shell.cli:app
@@ -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.