invar-tools 1.8.0__py3-none-any.whl → 1.11.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 +8 -0
- invar/core/doc_edit.py +187 -0
- invar/core/doc_parser.py +563 -0
- invar/core/language.py +88 -0
- invar/core/models.py +106 -0
- invar/core/patterns/detector.py +6 -1
- invar/core/patterns/p0_exhaustive.py +15 -3
- invar/core/patterns/p0_literal.py +15 -3
- invar/core/patterns/p0_newtype.py +15 -3
- invar/core/patterns/p0_nonempty.py +15 -3
- invar/core/patterns/p0_validation.py +15 -3
- invar/core/patterns/registry.py +5 -1
- invar/core/patterns/types.py +5 -1
- invar/core/property_gen.py +4 -0
- invar/core/rules.py +84 -18
- invar/core/sync_helpers.py +27 -1
- invar/core/ts_parsers.py +286 -0
- invar/core/ts_sig_parser.py +310 -0
- invar/mcp/handlers.py +408 -0
- invar/mcp/server.py +288 -143
- invar/node_tools/MANIFEST +7 -0
- invar/node_tools/__init__.py +51 -0
- invar/node_tools/fc-runner/cli.js +77 -0
- invar/node_tools/quick-check/cli.js +28 -0
- invar/node_tools/ts-analyzer/cli.js +480 -0
- invar/shell/claude_hooks.py +35 -12
- invar/shell/commands/doc.py +409 -0
- invar/shell/commands/guard.py +41 -1
- invar/shell/commands/init.py +154 -16
- invar/shell/commands/perception.py +157 -33
- invar/shell/commands/skill.py +187 -0
- invar/shell/commands/template_sync.py +65 -13
- invar/shell/commands/uninstall.py +60 -12
- invar/shell/commands/update.py +6 -14
- invar/shell/contract_coverage.py +1 -0
- invar/shell/doc_tools.py +459 -0
- invar/shell/fs.py +67 -13
- invar/shell/pi_hooks.py +6 -0
- invar/shell/prove/crosshair.py +3 -0
- invar/shell/prove/guard_ts.py +902 -0
- invar/shell/skill_manager.py +355 -0
- invar/shell/template_engine.py +28 -4
- invar/shell/templates.py +4 -4
- invar/templates/claude-md/python/critical-rules.md +33 -0
- invar/templates/claude-md/python/quick-reference.md +24 -0
- invar/templates/claude-md/typescript/critical-rules.md +40 -0
- invar/templates/claude-md/typescript/quick-reference.md +24 -0
- invar/templates/claude-md/universal/check-in.md +25 -0
- invar/templates/claude-md/universal/skills.md +73 -0
- invar/templates/claude-md/universal/workflow.md +55 -0
- invar/templates/commands/{audit.md → audit.md.jinja} +18 -1
- invar/templates/config/AGENT.md.jinja +58 -0
- invar/templates/config/CLAUDE.md.jinja +16 -209
- invar/templates/config/context.md.jinja +19 -0
- invar/templates/examples/{README.md → python/README.md} +2 -0
- invar/templates/examples/{conftest.py → python/conftest.py} +1 -1
- invar/templates/examples/{contracts.py → python/contracts.py} +81 -4
- invar/templates/examples/python/core_shell.py +227 -0
- invar/templates/examples/python/functional.py +613 -0
- invar/templates/examples/typescript/README.md +31 -0
- invar/templates/examples/typescript/contracts.ts +163 -0
- invar/templates/examples/typescript/core_shell.ts +374 -0
- invar/templates/examples/typescript/functional.ts +601 -0
- invar/templates/examples/typescript/workflow.md +95 -0
- invar/templates/hooks/PostToolUse.sh.jinja +10 -1
- invar/templates/hooks/PreToolUse.sh.jinja +38 -0
- invar/templates/hooks/Stop.sh.jinja +1 -1
- invar/templates/hooks/UserPromptSubmit.sh.jinja +7 -0
- invar/templates/hooks/pi/invar.ts.jinja +9 -0
- invar/templates/manifest.toml +7 -6
- invar/templates/onboard/assessment.md.jinja +214 -0
- invar/templates/onboard/patterns/python.md +347 -0
- invar/templates/onboard/patterns/typescript.md +452 -0
- invar/templates/onboard/roadmap.md.jinja +168 -0
- invar/templates/protocol/INVAR.md.jinja +51 -0
- invar/templates/protocol/python/architecture-examples.md +41 -0
- invar/templates/protocol/python/contracts-syntax.md +56 -0
- invar/templates/protocol/python/markers.md +44 -0
- invar/templates/protocol/python/tools.md +24 -0
- invar/templates/protocol/python/troubleshooting.md +38 -0
- invar/templates/protocol/typescript/architecture-examples.md +52 -0
- invar/templates/protocol/typescript/contracts-syntax.md +73 -0
- invar/templates/protocol/typescript/markers.md +48 -0
- invar/templates/protocol/typescript/tools.md +65 -0
- invar/templates/protocol/typescript/troubleshooting.md +104 -0
- invar/templates/protocol/universal/architecture.md +36 -0
- invar/templates/protocol/universal/completion.md +14 -0
- invar/templates/protocol/universal/contracts-concept.md +37 -0
- invar/templates/protocol/universal/header.md +17 -0
- invar/templates/protocol/universal/session.md +17 -0
- invar/templates/protocol/universal/six-laws.md +10 -0
- invar/templates/protocol/universal/usbv.md +14 -0
- invar/templates/protocol/universal/visible-workflow.md +25 -0
- invar/templates/skills/develop/SKILL.md.jinja +85 -3
- invar/templates/skills/extensions/_registry.yaml +93 -0
- invar/templates/skills/extensions/acceptance/SKILL.md +383 -0
- invar/templates/skills/extensions/invar-onboard/SKILL.md +448 -0
- invar/templates/skills/extensions/invar-onboard/patterns/python.md +347 -0
- invar/templates/skills/extensions/invar-onboard/patterns/typescript.md +452 -0
- invar/templates/skills/extensions/invar-onboard/templates/assessment.md.jinja +214 -0
- invar/templates/skills/extensions/invar-onboard/templates/roadmap.md.jinja +168 -0
- invar/templates/skills/extensions/security/SKILL.md +382 -0
- invar/templates/skills/extensions/security/patterns/_common.yaml +126 -0
- invar/templates/skills/extensions/security/patterns/python.yaml +155 -0
- invar/templates/skills/extensions/security/patterns/typescript.yaml +194 -0
- invar/templates/skills/review/SKILL.md.jinja +220 -248
- {invar_tools-1.8.0.dist-info → invar_tools-1.11.0.dist-info}/METADATA +336 -12
- invar_tools-1.11.0.dist-info/RECORD +178 -0
- invar/templates/examples/core_shell.py +0 -127
- invar/templates/protocol/INVAR.md +0 -310
- invar_tools-1.8.0.dist-info/RECORD +0 -116
- /invar/templates/examples/{workflow.md → python/workflow.md} +0 -0
- {invar_tools-1.8.0.dist-info → invar_tools-1.11.0.dist-info}/WHEEL +0 -0
- {invar_tools-1.8.0.dist-info → invar_tools-1.11.0.dist-info}/entry_points.txt +0 -0
- {invar_tools-1.8.0.dist-info → invar_tools-1.11.0.dist-info}/licenses/LICENSE +0 -0
- {invar_tools-1.8.0.dist-info → invar_tools-1.11.0.dist-info}/licenses/LICENSE-GPL +0 -0
- {invar_tools-1.8.0.dist-info → invar_tools-1.11.0.dist-info}/licenses/NOTICE +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: invar-tools
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.11.0
|
|
4
4
|
Summary: AI-native software engineering tools with design-by-contract verification
|
|
5
5
|
Project-URL: Homepage, https://github.com/tefx/invar
|
|
6
6
|
Project-URL: Documentation, https://github.com/tefx/invar#readme
|
|
@@ -25,6 +25,7 @@ Requires-Dist: crosshair-tool>=0.0.60
|
|
|
25
25
|
Requires-Dist: hypothesis>=6.0
|
|
26
26
|
Requires-Dist: invar-runtime>=1.0
|
|
27
27
|
Requires-Dist: jinja2>=3.0
|
|
28
|
+
Requires-Dist: markdown-it-py>=3.0
|
|
28
29
|
Requires-Dist: mcp>=1.0
|
|
29
30
|
Requires-Dist: pre-commit>=3.0
|
|
30
31
|
Requires-Dist: pydantic>=2.0
|
|
@@ -70,6 +71,14 @@ agents write code that's correct by construction—not by accident.
|
|
|
70
71
|
|
|
71
72
|
An AI agent, guided by Invar, writes code with formal contracts and built-in tests:
|
|
72
73
|
|
|
74
|
+
<table>
|
|
75
|
+
<tr>
|
|
76
|
+
<th>Python</th>
|
|
77
|
+
<th>TypeScript</th>
|
|
78
|
+
</tr>
|
|
79
|
+
<tr>
|
|
80
|
+
<td>
|
|
81
|
+
|
|
73
82
|
```python
|
|
74
83
|
from invar_runtime import pre, post
|
|
75
84
|
|
|
@@ -87,6 +96,33 @@ def average(items: list[float]) -> float:
|
|
|
87
96
|
return sum(items) / len(items)
|
|
88
97
|
```
|
|
89
98
|
|
|
99
|
+
</td>
|
|
100
|
+
<td>
|
|
101
|
+
|
|
102
|
+
```typescript
|
|
103
|
+
import { z } from 'zod';
|
|
104
|
+
|
|
105
|
+
const ItemsSchema = z.array(z.number()).min(1);
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Calculate the average of a non-empty list.
|
|
109
|
+
* @pre items.length > 0
|
|
110
|
+
* @post result >= 0
|
|
111
|
+
*
|
|
112
|
+
* @example
|
|
113
|
+
* average([1.0, 2.0, 3.0]) // => 2.0
|
|
114
|
+
* average([10.0]) // => 10.0
|
|
115
|
+
*/
|
|
116
|
+
function average(items: number[]): number {
|
|
117
|
+
ItemsSchema.parse(items); // Runtime validation
|
|
118
|
+
return items.reduce((a, b) => a + b) / items.length;
|
|
119
|
+
}
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
</td>
|
|
123
|
+
</tr>
|
|
124
|
+
</table>
|
|
125
|
+
|
|
90
126
|
Invar's Guard automatically verifies the code—the agent sees results and fixes issues without human intervention:
|
|
91
127
|
|
|
92
128
|
```
|
|
@@ -110,6 +146,8 @@ Guard passed.
|
|
|
110
146
|
|
|
111
147
|
## 🚀 Quick Start
|
|
112
148
|
|
|
149
|
+
> **Language Support:** Python (full), TypeScript (verification via Zod contracts).
|
|
150
|
+
|
|
113
151
|
### 📦 Two Packages, Different Purposes
|
|
114
152
|
|
|
115
153
|
```
|
|
@@ -141,6 +179,7 @@ uvx invar-tools init
|
|
|
141
179
|
# Or quick setup (skip prompts)
|
|
142
180
|
uvx invar-tools init --claude # Claude Code
|
|
143
181
|
uvx invar-tools init --pi # Pi Coding Agent
|
|
182
|
+
uvx invar-tools init --mcp-only # MCP tools only (legacy projects)
|
|
144
183
|
|
|
145
184
|
# Add runtime contracts to your project
|
|
146
185
|
pip install invar-runtime
|
|
@@ -204,16 +243,25 @@ Invar addresses each from the ground up.
|
|
|
204
243
|
|
|
205
244
|
### ✅ Solution 1: Contracts as Specification
|
|
206
245
|
|
|
207
|
-
Contracts (`@pre`/`@post`) turn vague intent into verifiable specifications:
|
|
246
|
+
Contracts (`@pre`/`@post` in Python, Zod schemas in TypeScript) turn vague intent into verifiable specifications:
|
|
247
|
+
|
|
248
|
+
<table>
|
|
249
|
+
<tr>
|
|
250
|
+
<th>Python</th>
|
|
251
|
+
<th>TypeScript</th>
|
|
252
|
+
</tr>
|
|
253
|
+
<tr>
|
|
254
|
+
<td>
|
|
208
255
|
|
|
209
256
|
```python
|
|
210
|
-
# Without contracts:
|
|
257
|
+
# Without contracts: ambiguous
|
|
211
258
|
def average(items):
|
|
212
|
-
return sum(items) / len(items)
|
|
259
|
+
return sum(items) / len(items)
|
|
260
|
+
# What if empty? Return type?
|
|
213
261
|
|
|
214
|
-
# With contracts:
|
|
215
|
-
@pre(lambda items: len(items) > 0)
|
|
216
|
-
@post(lambda result: result >= 0)
|
|
262
|
+
# With contracts: explicit
|
|
263
|
+
@pre(lambda items: len(items) > 0)
|
|
264
|
+
@post(lambda result: result >= 0)
|
|
217
265
|
def average(items: list[float]) -> float:
|
|
218
266
|
"""
|
|
219
267
|
>>> average([1.0, 2.0, 3.0])
|
|
@@ -222,6 +270,32 @@ def average(items: list[float]) -> float:
|
|
|
222
270
|
return sum(items) / len(items)
|
|
223
271
|
```
|
|
224
272
|
|
|
273
|
+
</td>
|
|
274
|
+
<td>
|
|
275
|
+
|
|
276
|
+
```typescript
|
|
277
|
+
// Without contracts: ambiguous
|
|
278
|
+
function average(items) {
|
|
279
|
+
return items.reduce((a,b) => a+b) / items.length;
|
|
280
|
+
// What if empty? Return type?
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
// With contracts: explicit
|
|
284
|
+
const ItemsSchema = z.array(z.number()).min(1);
|
|
285
|
+
|
|
286
|
+
/** @post result >= 0 */
|
|
287
|
+
function average(items: number[]): number {
|
|
288
|
+
ItemsSchema.parse(items); // Precondition
|
|
289
|
+
const result = items.reduce((a,b) => a+b) / items.length;
|
|
290
|
+
console.assert(result >= 0); // Postcondition
|
|
291
|
+
return result;
|
|
292
|
+
}
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
</td>
|
|
296
|
+
</tr>
|
|
297
|
+
</table>
|
|
298
|
+
|
|
225
299
|
**Benefits:**
|
|
226
300
|
- Agent knows exactly what to implement
|
|
227
301
|
- Edge cases are explicit in the contract
|
|
@@ -283,7 +357,7 @@ Skill routing ensures agents enter through the correct workflow:
|
|
|
283
357
|
| **Core/Shell** | Guard blocks I/O imports in Core | 100% testable business logic |
|
|
284
358
|
| **Result[T, E]** | Guard warns if Shell returns bare values | Explicit error handling |
|
|
285
359
|
|
|
286
|
-
### 🔮 Future: Quality Guidance
|
|
360
|
+
### 🔮 Future: Quality Guidance
|
|
287
361
|
|
|
288
362
|
Beyond "correct or not"—Invar will suggest improvements:
|
|
289
363
|
|
|
@@ -322,6 +396,14 @@ Separate pure logic from I/O for maximum testability:
|
|
|
322
396
|
▼ Result[T, E]
|
|
323
397
|
```
|
|
324
398
|
|
|
399
|
+
<table>
|
|
400
|
+
<tr>
|
|
401
|
+
<th>Python</th>
|
|
402
|
+
<th>TypeScript</th>
|
|
403
|
+
</tr>
|
|
404
|
+
<tr>
|
|
405
|
+
<td>
|
|
406
|
+
|
|
325
407
|
```python
|
|
326
408
|
# Core: Pure, testable, provable
|
|
327
409
|
def parse_config(content: str) -> Config:
|
|
@@ -335,6 +417,28 @@ def load_config(path: Path) -> Result[Config, str]:
|
|
|
335
417
|
return Failure(f"Not found: {path}")
|
|
336
418
|
```
|
|
337
419
|
|
|
420
|
+
</td>
|
|
421
|
+
<td>
|
|
422
|
+
|
|
423
|
+
```typescript
|
|
424
|
+
// Core: Pure, testable, provable
|
|
425
|
+
function parseConfig(content: string): Config {
|
|
426
|
+
return ConfigSchema.parse(JSON.parse(content));
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
// Shell: Handles I/O, returns ResultAsync
|
|
430
|
+
function loadConfig(path: string): ResultAsync<Config, ConfigError> {
|
|
431
|
+
return ResultAsync.fromPromise(
|
|
432
|
+
fs.readFile(path, 'utf-8'),
|
|
433
|
+
() => ({ type: 'NOT_FOUND', path })
|
|
434
|
+
).map(parseConfig);
|
|
435
|
+
}
|
|
436
|
+
```
|
|
437
|
+
|
|
438
|
+
</td>
|
|
439
|
+
</tr>
|
|
440
|
+
</table>
|
|
441
|
+
|
|
338
442
|
### Session Protocol
|
|
339
443
|
|
|
340
444
|
Clear boundaries for every AI session:
|
|
@@ -371,7 +475,7 @@ AlphaCodium · Parsel · Reflexion · Clover
|
|
|
371
475
|
| Agent | Status | Setup |
|
|
372
476
|
|-------|--------|-------|
|
|
373
477
|
| **Claude Code** | ✅ Full | `invar init --claude` |
|
|
374
|
-
| **Pi** | ✅ Full | `invar init --pi` |
|
|
478
|
+
| **[Pi](https://shittycodingagent.ai/)** | ✅ Full | `invar init --pi` |
|
|
375
479
|
| **Cursor** | ✅ MCP | `invar init` → select Other, add MCP config |
|
|
376
480
|
| **Other** | 📝 Manual | `invar init` → select Other, include `AGENT.md` in prompt |
|
|
377
481
|
|
|
@@ -385,7 +489,7 @@ All features auto-configured:
|
|
|
385
489
|
- Claude Code hooks (tool guidance, verification reminders)
|
|
386
490
|
- Pre-commit hooks
|
|
387
491
|
|
|
388
|
-
### Pi (Full Support)
|
|
492
|
+
### [Pi](https://shittycodingagent.ai/) (Full Support)
|
|
389
493
|
|
|
390
494
|
Pi reads CLAUDE.md and .claude/skills/ directly, sharing configuration with Claude Code:
|
|
391
495
|
- **Same instruction file** — CLAUDE.md (no separate AGENT.md needed)
|
|
@@ -424,7 +528,7 @@ Cursor users get full verification via MCP:
|
|
|
424
528
|
| `.pre-commit-config.yaml` | Verification before commit | Optional |
|
|
425
529
|
| `src/core/`, `src/shell/` | Recommended structure | Optional |
|
|
426
530
|
| `CLAUDE.md` | Agent instructions | Claude Code |
|
|
427
|
-
| `.claude/skills/` | Workflow
|
|
531
|
+
| `.claude/skills/` | Workflow + extension skills | Claude Code |
|
|
428
532
|
| `.claude/commands/` | User commands (/audit, /guard) | Claude Code |
|
|
429
533
|
| `.claude/hooks/` | Tool guidance | Claude Code |
|
|
430
534
|
| `.mcp.json` | MCP server config | Claude Code |
|
|
@@ -442,6 +546,178 @@ src/{project}/
|
|
|
442
546
|
|
|
443
547
|
---
|
|
444
548
|
|
|
549
|
+
## 🧩 Extension Skills
|
|
550
|
+
|
|
551
|
+
Beyond the core workflow skills (`/develop`, `/review`, `/investigate`, `/propose`), Invar provides optional extension skills for specialized tasks:
|
|
552
|
+
|
|
553
|
+
| Skill | Purpose | Install |
|
|
554
|
+
|-------|---------|---------|
|
|
555
|
+
| `/security` | OWASP Top 10 security audit | `invar skill add security` |
|
|
556
|
+
| `/acceptance` | Requirements acceptance review | `invar skill add acceptance` |
|
|
557
|
+
| `/invar-onboard` | Legacy project migration | `invar skill add invar-onboard` |
|
|
558
|
+
|
|
559
|
+
### Managing Skills
|
|
560
|
+
|
|
561
|
+
```bash
|
|
562
|
+
invar skill list # List available/installed skills
|
|
563
|
+
invar skill add security # Install (or update) a skill
|
|
564
|
+
invar skill remove security # Remove a skill
|
|
565
|
+
invar skill remove security --force # Force remove (even with custom extensions)
|
|
566
|
+
```
|
|
567
|
+
|
|
568
|
+
**Idempotent:** `invar skill add` works for both install and update. User customizations in the `<!--invar:extensions-->` region are preserved on update.
|
|
569
|
+
|
|
570
|
+
### Custom Extensions
|
|
571
|
+
|
|
572
|
+
Each skill has an extensions region where you can add project-specific customizations:
|
|
573
|
+
|
|
574
|
+
```markdown
|
|
575
|
+
<!--invar:extensions-->
|
|
576
|
+
## Project-Specific Security Checks
|
|
577
|
+
|
|
578
|
+
- [ ] Check for hardcoded AWS credentials in config/
|
|
579
|
+
- [ ] Verify JWT secret rotation policy
|
|
580
|
+
<!--/invar:extensions-->
|
|
581
|
+
```
|
|
582
|
+
|
|
583
|
+
These customizations are preserved when updating skills via `invar skill add`.
|
|
584
|
+
|
|
585
|
+
---
|
|
586
|
+
|
|
587
|
+
## 🔄 Legacy Project Migration
|
|
588
|
+
|
|
589
|
+
### Quick Start: MCP Tools Only
|
|
590
|
+
|
|
591
|
+
For projects that want Invar's MCP tools **without adopting the framework**:
|
|
592
|
+
|
|
593
|
+
```bash
|
|
594
|
+
uvx invar-tools init --mcp-only
|
|
595
|
+
```
|
|
596
|
+
|
|
597
|
+
This creates only `.mcp.json` — no INVAR.md, CLAUDE.md, or Core/Shell structure. Your AI agent gets access to:
|
|
598
|
+
- **Document tools** (`invar_doc_toc`, `invar_doc_read`, etc.)
|
|
599
|
+
- **Code navigation** (`invar_sig`, `invar_map`)
|
|
600
|
+
- **Basic verification** (`invar_guard` with minimal rules)
|
|
601
|
+
|
|
602
|
+
### Full Adoption: `/invar-onboard`
|
|
603
|
+
|
|
604
|
+
For projects that want to fully adopt Invar's patterns, use the `/invar-onboard` skill:
|
|
605
|
+
|
|
606
|
+
```bash
|
|
607
|
+
# Install the onboarding skill
|
|
608
|
+
invar skill add invar-onboard
|
|
609
|
+
|
|
610
|
+
# Run assessment on your project
|
|
611
|
+
# (in Claude Code or Pi)
|
|
612
|
+
> /invar-onboard
|
|
613
|
+
```
|
|
614
|
+
|
|
615
|
+
### Migration Workflow
|
|
616
|
+
|
|
617
|
+
```
|
|
618
|
+
/invar-onboard
|
|
619
|
+
│
|
|
620
|
+
▼
|
|
621
|
+
┌─────────────────────────────────────────┐
|
|
622
|
+
│ Phase 1: ASSESS (Automatic) │
|
|
623
|
+
│ • Code metrics and architecture │
|
|
624
|
+
│ • Pattern detection (error handling) │
|
|
625
|
+
│ • Core/Shell separation assessment │
|
|
626
|
+
│ • Risk and effort estimation │
|
|
627
|
+
│ │
|
|
628
|
+
│ Output: docs/invar-onboard-assessment.md
|
|
629
|
+
└─────────────────────────────────────────┘
|
|
630
|
+
│
|
|
631
|
+
▼
|
|
632
|
+
┌─────────────────────────────────────────┐
|
|
633
|
+
│ Phase 2: DISCUSS (With User) │
|
|
634
|
+
│ • Present findings │
|
|
635
|
+
│ • Discuss risk mitigation │
|
|
636
|
+
│ • Confirm scope and priorities │
|
|
637
|
+
└─────────────────────────────────────────┘
|
|
638
|
+
│
|
|
639
|
+
▼ (user confirms)
|
|
640
|
+
┌─────────────────────────────────────────┐
|
|
641
|
+
│ Phase 3: PLAN (Automatic) │
|
|
642
|
+
│ • Dependency analysis │
|
|
643
|
+
│ • Phase decomposition │
|
|
644
|
+
│ • Session planning │
|
|
645
|
+
│ │
|
|
646
|
+
│ Output: docs/invar-onboard-roadmap.md │
|
|
647
|
+
└─────────────────────────────────────────┘
|
|
648
|
+
```
|
|
649
|
+
|
|
650
|
+
### Language Support
|
|
651
|
+
|
|
652
|
+
The onboarding skill includes language-specific pattern guides:
|
|
653
|
+
|
|
654
|
+
<table>
|
|
655
|
+
<tr>
|
|
656
|
+
<th>Python</th>
|
|
657
|
+
<th>TypeScript</th>
|
|
658
|
+
</tr>
|
|
659
|
+
<tr>
|
|
660
|
+
<td>
|
|
661
|
+
|
|
662
|
+
```python
|
|
663
|
+
# Error handling: returns library
|
|
664
|
+
from returns.result import Result, Success, Failure
|
|
665
|
+
|
|
666
|
+
def get_user(id: str) -> Result[User, NotFoundError]:
|
|
667
|
+
user = db.find(id)
|
|
668
|
+
if not user:
|
|
669
|
+
return Failure(NotFoundError(f"User {id}"))
|
|
670
|
+
return Success(user)
|
|
671
|
+
|
|
672
|
+
# Contracts: invar_runtime
|
|
673
|
+
from invar_runtime import pre, post
|
|
674
|
+
|
|
675
|
+
@pre(lambda amount: amount > 0)
|
|
676
|
+
@post(lambda result: result >= 0)
|
|
677
|
+
def calculate_tax(amount: float) -> float:
|
|
678
|
+
return amount * 0.1
|
|
679
|
+
```
|
|
680
|
+
|
|
681
|
+
</td>
|
|
682
|
+
<td>
|
|
683
|
+
|
|
684
|
+
```typescript
|
|
685
|
+
// Error handling: neverthrow
|
|
686
|
+
import { Result, ResultAsync, ok, err } from 'neverthrow';
|
|
687
|
+
|
|
688
|
+
function getUser(id: string): ResultAsync<User, NotFoundError> {
|
|
689
|
+
return ResultAsync.fromPromise(
|
|
690
|
+
db.user.findUnique({ where: { id } }),
|
|
691
|
+
() => new DbError('query_failed')
|
|
692
|
+
).andThen(user =>
|
|
693
|
+
user ? ok(user) : err(new NotFoundError(`User ${id}`))
|
|
694
|
+
);
|
|
695
|
+
}
|
|
696
|
+
|
|
697
|
+
// Contracts: Zod schemas
|
|
698
|
+
import { z } from 'zod';
|
|
699
|
+
|
|
700
|
+
const AmountSchema = z.number().positive();
|
|
701
|
+
|
|
702
|
+
function calculateTax(amount: number): number {
|
|
703
|
+
AmountSchema.parse(amount);
|
|
704
|
+
return amount * 0.1;
|
|
705
|
+
}
|
|
706
|
+
```
|
|
707
|
+
|
|
708
|
+
</td>
|
|
709
|
+
</tr>
|
|
710
|
+
</table>
|
|
711
|
+
|
|
712
|
+
### When to Use `/invar-onboard` vs `/refactor`
|
|
713
|
+
|
|
714
|
+
| Scenario | Skill | Purpose |
|
|
715
|
+
|----------|-------|---------|
|
|
716
|
+
| Existing project → Invar | `/invar-onboard` | One-time framework migration |
|
|
717
|
+
| Already Invar project | `/refactor` (coming soon) | Continuous code improvement |
|
|
718
|
+
|
|
719
|
+
---
|
|
720
|
+
|
|
445
721
|
## ⚙️ Configuration
|
|
446
722
|
|
|
447
723
|
```toml
|
|
@@ -467,8 +743,35 @@ max_function_lines = 50
|
|
|
467
743
|
# Requirements
|
|
468
744
|
require_contracts = true
|
|
469
745
|
require_doctests = true
|
|
746
|
+
|
|
747
|
+
# Timeouts (seconds)
|
|
748
|
+
timeout_doctest = 60 # Doctest execution timeout
|
|
749
|
+
timeout_crosshair = 300 # CrossHair total timeout
|
|
750
|
+
timeout_crosshair_per_condition = 30 # Per-function timeout
|
|
751
|
+
timeout_hypothesis = 300 # Hypothesis total timeout
|
|
752
|
+
|
|
753
|
+
# Excluded paths (not checked by guard)
|
|
754
|
+
exclude_paths = ["tests", "scripts", ".venv", "node_modules", "dist", "build"]
|
|
755
|
+
```
|
|
756
|
+
|
|
757
|
+
### Pattern Detection (DX-61)
|
|
758
|
+
|
|
759
|
+
Guard can suggest functional programming patterns to improve code quality:
|
|
760
|
+
|
|
761
|
+
```toml
|
|
762
|
+
[tool.invar.guard]
|
|
763
|
+
# Minimum confidence for suggestions (low | medium | high)
|
|
764
|
+
pattern_min_confidence = "medium"
|
|
765
|
+
|
|
766
|
+
# Priority levels to include (P0 = core, P1 = extended)
|
|
767
|
+
pattern_priorities = ["P0"]
|
|
768
|
+
|
|
769
|
+
# Patterns to exclude from suggestions
|
|
770
|
+
pattern_exclude = []
|
|
470
771
|
```
|
|
471
772
|
|
|
773
|
+
Available patterns: `NewType`, `Validation`, `NonEmpty`, `Literal`, `ExhaustiveMatch`, `SmartConstructor`, `StructuredError`
|
|
774
|
+
|
|
472
775
|
### 🚪 Escape Hatches
|
|
473
776
|
|
|
474
777
|
For code that intentionally breaks rules:
|
|
@@ -496,15 +799,29 @@ rules = ["missing_contract", "shell_result"]
|
|
|
496
799
|
| `invar guard` | Full verification (static + doctest + property + symbolic) |
|
|
497
800
|
| `invar guard --changed` | Only git-modified files |
|
|
498
801
|
| `invar guard --static` | Static analysis only (~0.5s) |
|
|
802
|
+
| `invar guard --coverage` | Collect branch coverage from tests |
|
|
499
803
|
| `invar init` | Initialize or update project (interactive) |
|
|
500
804
|
| `invar init --claude` | Quick setup for Claude Code |
|
|
805
|
+
| `invar init --pi` | Quick setup for Pi agent |
|
|
806
|
+
| `invar init --mcp-only` | MCP tools only (no framework files) |
|
|
501
807
|
| `invar uninstall` | Remove Invar from project (preserves user content) |
|
|
502
808
|
| `invar sig <file>` | Show signatures and contracts |
|
|
503
809
|
| `invar map` | Symbol map with reference counts |
|
|
504
|
-
| `invar
|
|
810
|
+
| `invar doc toc <file>` | View document structure (headings) |
|
|
811
|
+
| `invar doc read <file> <section>` | Read specific section by slug/fuzzy/index |
|
|
812
|
+
| `invar doc find <pattern> <files>` | Search sections by title pattern |
|
|
813
|
+
| `invar doc replace <file> <section>` | Replace section content |
|
|
814
|
+
| `invar doc insert <file> <anchor>` | Insert content relative to section |
|
|
815
|
+
| `invar doc delete <file> <section>` | Delete section |
|
|
816
|
+
| `invar rules` | List all rules with severity |
|
|
505
817
|
| `invar test` | Property-based tests (Hypothesis) |
|
|
506
818
|
| `invar verify` | Symbolic verification (CrossHair) |
|
|
819
|
+
| `invar mutate` | Mutation testing (find gaps in tests) |
|
|
507
820
|
| `invar hooks` | Manage Claude Code hooks |
|
|
821
|
+
| `invar skill` | Manage extension skills |
|
|
822
|
+
| `invar mcp` | Start MCP server for Claude Code |
|
|
823
|
+
| `invar dev sync` | Sync Invar protocol updates |
|
|
824
|
+
| `invar version` | Show version info |
|
|
508
825
|
|
|
509
826
|
### MCP Tools
|
|
510
827
|
|
|
@@ -513,6 +830,13 @@ rules = ["missing_contract", "shell_result"]
|
|
|
513
830
|
| `invar_guard` | Smart multi-layer verification |
|
|
514
831
|
| `invar_sig` | Extract signatures and contracts |
|
|
515
832
|
| `invar_map` | Symbol map with reference counts |
|
|
833
|
+
| `invar_doc_toc` | Extract document structure (TOC) |
|
|
834
|
+
| `invar_doc_read` | Read specific section |
|
|
835
|
+
| `invar_doc_read_many` | Read multiple sections (batch) |
|
|
836
|
+
| `invar_doc_find` | Search sections by title pattern |
|
|
837
|
+
| `invar_doc_replace` | Replace section content |
|
|
838
|
+
| `invar_doc_insert` | Insert content relative to section |
|
|
839
|
+
| `invar_doc_delete` | Delete section |
|
|
516
840
|
|
|
517
841
|
---
|
|
518
842
|
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
invar/__init__.py,sha256=E-Mg9DG6qFzjP8D5TEkmy2ponvR99Yfn96RVJggAr64,1682
|
|
2
|
+
invar/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
3
|
+
invar/core/__init__.py,sha256=01TgQ2bqTFV4VFdksfqXYPa2WUqo-DpUWUkEcIUXFb4,218
|
|
4
|
+
invar/core/contracts.py,sha256=SOyF1KeJ6hrEwfQ09UzMt881OJKDXRbPTslKA6HzdKg,19085
|
|
5
|
+
invar/core/doc_edit.py,sha256=kLBkSQMFiXKdZMlQYAy-pzld1f1p2UFKGpKVVJo8Nes,6690
|
|
6
|
+
invar/core/doc_parser.py,sha256=yzZKzgr9myUiiRGtRidT2tubrs4-omtGlTwbUkSKhoM,18197
|
|
7
|
+
invar/core/entry_points.py,sha256=1p6GRGTp9kA9spNkGKidFLlzLPheh6JO2XFb68Cr0sE,12209
|
|
8
|
+
invar/core/extraction.py,sha256=mScqEMEEQdsd-Z0jx9g3scK6Z1vI9l-ESjggXPIWHZ4,6112
|
|
9
|
+
invar/core/format_specs.py,sha256=P299aRHFMXyow8STwsvaT6Bg2ALPs2wSy7SByiRZZ-A,5610
|
|
10
|
+
invar/core/format_strategies.py,sha256=LifL97JbsF8WEkVNmQpq2htyFUC3pW21myAjtRGpSxU,5774
|
|
11
|
+
invar/core/formatter.py,sha256=rCGZhMpl4dPLrztgKDkNtAvnv2vKfomyIHl_6fThuno,11293
|
|
12
|
+
invar/core/hypothesis_strategies.py,sha256=_MfjG7KxkmJvuPsczr_1JayR_YmiDzU2jJ8fQPoKGgs,16517
|
|
13
|
+
invar/core/inspect.py,sha256=l1knohwpLRHSNySPUjyeBHJusnU0vYiQGj4dMVgQZIo,4381
|
|
14
|
+
invar/core/lambda_helpers.py,sha256=Ap1y7N0wpgCgPHwrs2pd7zD9Qq4Ptfd2iTliprXIkME,6457
|
|
15
|
+
invar/core/language.py,sha256=aGUcrq--eQtAjb5bYE40eFmDhRs_EbBNGQ1sBYgTdt0,2637
|
|
16
|
+
invar/core/models.py,sha256=DP4nfQ5O58eg1NCsBdw9OsQrVY1nSvo9GIlRdV2QjkU,16758
|
|
17
|
+
invar/core/must_use.py,sha256=7HnnbT53lb4dOT-1mL64pz0JbQYytuw4eejNVe7iWKY,5496
|
|
18
|
+
invar/core/parser.py,sha256=ucVpGziVzUvbkXT1n_SgOrYdStDEcNBqLuRGqK3_M5g,9205
|
|
19
|
+
invar/core/postcondition_scope.py,sha256=ykjVNqZZ1zItBmI7ebgmLW5vFGE-vpaLRTvSgWaJMgM,5245
|
|
20
|
+
invar/core/property_gen.py,sha256=Pf9VpVdJFJmEkIx78HlW_Gn70cC8_sxEmW9gv-2Cifc,14342
|
|
21
|
+
invar/core/purity.py,sha256=dt5dFy5V8Ch93iBJF5OuKUr1jjfimfY3oHLQD8KmLHw,12036
|
|
22
|
+
invar/core/purity_heuristics.py,sha256=vsgphC1XPIFtsoLB0xvp--AyaJHqlh83LyKXYda4pWc,4546
|
|
23
|
+
invar/core/references.py,sha256=64yGIdj9vL72Y4uUhJsi9pztZkuMnLN-7OcOziyxYMo,6339
|
|
24
|
+
invar/core/review_trigger.py,sha256=4GGHUmgbVsQJAob4OO6A8G7KrLcNMwNOuqHiT6Jc7cs,14085
|
|
25
|
+
invar/core/rule_meta.py,sha256=il_KUTjSlW1MOVgLguuLDS9wEdyqUe3CDvUx4gQjACo,10180
|
|
26
|
+
invar/core/rules.py,sha256=XnFEDm4PSblGiCG14bfnhl-OcMmNsy7Slx7DAUbfaF4,22226
|
|
27
|
+
invar/core/shell_analysis.py,sha256=i2A9SMqBI3Rb4Ai0QNTM7awIkSJIY6yZJVWS72lv0bY,6457
|
|
28
|
+
invar/core/shell_architecture.py,sha256=98EVdBFIs8tO-i9jKuzdmv7fLB4PKnyI-vKh5lxnB98,6538
|
|
29
|
+
invar/core/strategies.py,sha256=2DPl0z2p_CBNd4RlSbZzTeAy6Dq6cpCiBCB2p5qHHkk,8798
|
|
30
|
+
invar/core/suggestions.py,sha256=LCg2Dy9EHh_n1t9jATRZ0gTkgJkAEZk3vp2nuuCyr-s,15129
|
|
31
|
+
invar/core/sync_helpers.py,sha256=rVfRFECO16Ntc9b9A7LxIV_0XfRJbRXaagVT-jJBYqI,8635
|
|
32
|
+
invar/core/tautology.py,sha256=Pmn__a0Bt55W0lAQo1G5q8Ory9KuE23dRknKw45xxbs,9221
|
|
33
|
+
invar/core/template_helpers.py,sha256=E1UT7ct0DaUFlfHr9oTBvW4xfxAiS81rbmZHSucPw4c,881
|
|
34
|
+
invar/core/template_parser.py,sha256=vH3H8OX55scZ1hWh3xoA8oJMhgleKufCOhkTvsSuu_4,14730
|
|
35
|
+
invar/core/timeout_inference.py,sha256=BS2fJGmwOrLpYZUku4qrizgNDSIXVLFBslW-6sRAvpc,3451
|
|
36
|
+
invar/core/trivial_detection.py,sha256=KYP8jJb7QDeusAxFdX5NAML_H0NL5wLgMeBWDQmNqfU,6086
|
|
37
|
+
invar/core/ts_parsers.py,sha256=gXvLgb141gD8VAtiW4T1aaRnaSv10BEm0XYqArYIN00,8743
|
|
38
|
+
invar/core/ts_sig_parser.py,sha256=_lUNfArFPILpENo-1dqmPY1qoVmcfAehv2Tva3r6dzw,9931
|
|
39
|
+
invar/core/utils.py,sha256=PyW8dcTLUEFD81xcvkz-LNnCwjIQefn08OUh23fM_Po,14266
|
|
40
|
+
invar/core/verification_routing.py,sha256=_jXi1txFCcUdnB3-Yavtuyk8N-XhEO_Vu_051Vuz27Y,5020
|
|
41
|
+
invar/core/patterns/__init__.py,sha256=79a3ucN0BI54RnIOe49lngKASpADygs1hll9ROCrP6s,1429
|
|
42
|
+
invar/core/patterns/detector.py,sha256=lUfED7qk2VWOAjHoGWgSqll5ynhhdzd6CjCiol-7kV8,8690
|
|
43
|
+
invar/core/patterns/p0_exhaustive.py,sha256=66FNRRFAsOQh1LyxWULgkuM52CLtBWTVXlExpAVHMpo,7176
|
|
44
|
+
invar/core/patterns/p0_literal.py,sha256=WkQNs4605PtBhLb5DKLXc1Nqlpezx5HjktC7JX6ltaM,10946
|
|
45
|
+
invar/core/patterns/p0_newtype.py,sha256=DWI6zXRsV9YHSemEuCVFSTqWrB-ROl3xP86cPu9UC2w,7803
|
|
46
|
+
invar/core/patterns/p0_nonempty.py,sha256=bJ97NqdFClYM9LaSiyViRt2qJrnT6kO9-ykBVbV20aE,10927
|
|
47
|
+
invar/core/patterns/p0_validation.py,sha256=u_pQ1vskhIDLpu_xFlQfgsswZvi27s-cO8A7DTseAc0,9819
|
|
48
|
+
invar/core/patterns/registry.py,sha256=2rz0wWDRarMkuHN-qM_ZrT3qeGFDSKMABvRvPNZxQNw,7495
|
|
49
|
+
invar/core/patterns/types.py,sha256=ULAlWuAdmO6CFcEDjTrWBfzNTBsnomAl2d25tR11ihU,5506
|
|
50
|
+
invar/mcp/__init__.py,sha256=n3S7QwMjSMqOMT8cI2jf9E0yZPjKmBOJyIYhq4WZ8TQ,226
|
|
51
|
+
invar/mcp/__main__.py,sha256=ZcIT2U6xUyGOWucl4jq422BDE3lRLjqyxb9pFylRBdk,219
|
|
52
|
+
invar/mcp/handlers.py,sha256=usPgYvNLB3nE1G8gkA3LtKKNQ4k_eXQEr4GueA-8NSw,14939
|
|
53
|
+
invar/mcp/server.py,sha256=nDEHhF-eDkyNOX-y-wsZDa6Ed2nvjk5HtIC9SIbi7z0,18491
|
|
54
|
+
invar/node_tools/MANIFEST,sha256=UwtO2AsQ-0UwskG6ZkE2kXqz_hdp-gzRTyp32-X22Mc,131
|
|
55
|
+
invar/node_tools/__init__.py,sha256=HzILh3jtP28Lm2jZwss1SY65ECxbtw2J2uFpXQA6Y94,1740
|
|
56
|
+
invar/node_tools/fc-runner/cli.js,sha256=72_gIhvnx2peKITdzdnFWI5fzGaNTS3BcEqyS628cI0,243277
|
|
57
|
+
invar/node_tools/quick-check/cli.js,sha256=dwV3hdJleFQga2cKUn3PPfQDvvujhzKdjQcIvWsKgM0,66196
|
|
58
|
+
invar/node_tools/ts-analyzer/cli.js,sha256=SvZ6HyjmobpP8NAZqXFiy8BwH_t5Hb17Ytar_18udaQ,4092887
|
|
59
|
+
invar/shell/__init__.py,sha256=FFw1mNbh_97PeKPcHIqQpQ7mw-JoIvyLM1yOdxLw5uk,204
|
|
60
|
+
invar/shell/claude_hooks.py,sha256=I_2VEepwS0kW55lW7U--FPwpuJq5hAXECcyYCd9D-jM,17360
|
|
61
|
+
invar/shell/config.py,sha256=6-kbo6--SxfROXoyU-v7InSLR8f_U1Mar_xEOdCXFkY,17633
|
|
62
|
+
invar/shell/contract_coverage.py,sha256=81OQkQqUVYUKytG5aiJyRK62gwh9UzbSG926vkvFTc8,12088
|
|
63
|
+
invar/shell/coverage.py,sha256=m01o898IFIdBztEBQLwwL1Vt5PWrpUntO4lv4nWEkls,11344
|
|
64
|
+
invar/shell/doc_tools.py,sha256=16gvo_ay9-_EK6lX16WkiRGg4OfTAKK_i0ucQkE7lbI,15149
|
|
65
|
+
invar/shell/fs.py,sha256=ctqU-EX0NnKC4txudRCRpbWxWSgBZTInXMeOUnl3IM0,6196
|
|
66
|
+
invar/shell/git.py,sha256=s6RQxEDQuLrmK3mru88EoYP8__4hiFW8AozlcxmY47E,2784
|
|
67
|
+
invar/shell/guard_helpers.py,sha256=QeYgbW0lgUa9Z_RCjAMG7UJdiMzz5cW48Lb2u-qgQi8,15114
|
|
68
|
+
invar/shell/guard_output.py,sha256=v3gG5P-_47nIFo8eAMKwdA_hLf2KZ0cQ-45Z6JjKp4w,12520
|
|
69
|
+
invar/shell/mcp_config.py,sha256=-hC7Y5BGuVs285b6gBARk7ZyzVxHwPgXSyt_GoN0jfs,4580
|
|
70
|
+
invar/shell/mutation.py,sha256=Lfyk2b8j8-hxAq-iwAgQeOhr7Ci6c5tRF1TXe3CxQCs,8914
|
|
71
|
+
invar/shell/pattern_integration.py,sha256=pRcjfq3NvMW_tvQCnaXZnD1k5AVEWK8CYOE2jN6VTro,7842
|
|
72
|
+
invar/shell/pi_hooks.py,sha256=ulZc1sP8mTRJTBsjwFHQzUgg-h8ajRIMp7iF1Y4UUtw,6885
|
|
73
|
+
invar/shell/property_tests.py,sha256=N9JreyH5PqR89oF5yLcX7ZAV-Koyg5BKo-J05-GUPsA,9109
|
|
74
|
+
invar/shell/skill_manager.py,sha256=Mr7Mh9rxPSKSAOTJCAM5ZHiG5nfUf6KQVCuD4LBNHSI,12440
|
|
75
|
+
invar/shell/subprocess_env.py,sha256=9oXl3eMEbzLsFEgMHqobEw6oW_wV0qMEP7pklwm58Pw,11453
|
|
76
|
+
invar/shell/template_engine.py,sha256=eNKMz7R8g9Xp3_1TGx-QH137jf52E0u3KaVcnotu1Tg,12056
|
|
77
|
+
invar/shell/templates.py,sha256=31f5ieoGeWU0qqfLJUMWnz0yyLa1FBc_sOz6UGzToqk,13884
|
|
78
|
+
invar/shell/testing.py,sha256=rTNBH0Okh2qtG9ohSXOz487baQ2gXrWT3s_WECW3HJs,11143
|
|
79
|
+
invar/shell/commands/__init__.py,sha256=MEkKwVyjI9DmkvBpJcuumXo2Pg_FFkfEr-Rr3nrAt7A,284
|
|
80
|
+
invar/shell/commands/doc.py,sha256=SOLDoCXXGxx_JU0PKXlAIGEF36PzconHmmAtL-rM6D4,13819
|
|
81
|
+
invar/shell/commands/guard.py,sha256=-QYR2wc-KjD6VL9tb9Ih6gr5LFX-H7_H843TX5qR5wk,23686
|
|
82
|
+
invar/shell/commands/hooks.py,sha256=W-SOnT4VQyUvXwipozkJwgEYfiOJGz7wksrbcdWegUg,2356
|
|
83
|
+
invar/shell/commands/init.py,sha256=-FZTYTwJr_NRoluAM4YwcseNju56GSxtnKVkqsXREPg,20461
|
|
84
|
+
invar/shell/commands/merge.py,sha256=nuvKo8m32-OL-SCQlS4SLKmOZxQ3qj-1nGCx1Pgzifw,8183
|
|
85
|
+
invar/shell/commands/mutate.py,sha256=GwemiO6LlbGCBEQsBFnzZuKhF-wIMEl79GAMnKUWc8U,5765
|
|
86
|
+
invar/shell/commands/perception.py,sha256=MDJvjLcrT7ZjhT4L1zjaMoQpjQaHe9qNWHdy-7yECrQ,8524
|
|
87
|
+
invar/shell/commands/skill.py,sha256=oKVyaxQ_LK28FpJhRpBDpXcpRdUBK3n6rC0qD77ax1M,5803
|
|
88
|
+
invar/shell/commands/sync_self.py,sha256=nmqBry7V2_enKwy2zzHg8UoedZNicLe3yKDhjmBeZ68,3880
|
|
89
|
+
invar/shell/commands/template_sync.py,sha256=aNWyFPMFT7pSwHrvwGCqcKAwb4dp7S9tvZzy9H4gAnw,16094
|
|
90
|
+
invar/shell/commands/test.py,sha256=goMf-ovvzEyWQMheq4YlJ-mwK5-w3lDj0cq0IA_1-_c,4205
|
|
91
|
+
invar/shell/commands/uninstall.py,sha256=X5wWT41RFCdXkZ2aZEwLWy9oF1ajp9UyiO1O2iR6DrQ,20188
|
|
92
|
+
invar/shell/commands/update.py,sha256=-NNQQScEb_0bV1B8YFxTjpUECk9c8dGAiNVRc64nWhY,1008
|
|
93
|
+
invar/shell/prove/__init__.py,sha256=ZqlbmyMFJf6yAle8634jFuPRv8wNvHps8loMlOJyf8A,240
|
|
94
|
+
invar/shell/prove/accept.py,sha256=cnY_6jzU1EBnpLF8-zWUWcXiSXtCwxPsXEYXsSVPG38,3717
|
|
95
|
+
invar/shell/prove/cache.py,sha256=jbNdrvfLjvK7S0iqugErqeabb4YIbQuwIlcSRyCKbcg,4105
|
|
96
|
+
invar/shell/prove/crosshair.py,sha256=XhJDsQWIriX9SuqeflUYvJgp9gJTDH7I7Uka6zjNzZ0,16734
|
|
97
|
+
invar/shell/prove/guard_ts.py,sha256=M285vnaKGC3Dokyu7PrjlNk-sT1TP8H821fz5K4CL8c,31717
|
|
98
|
+
invar/shell/prove/hypothesis.py,sha256=QUclOOUg_VB6wbmHw8O2EPiL5qBOeBRqQeM04AVuLw0,9880
|
|
99
|
+
invar/templates/CLAUDE.md.template,sha256=eaGU3SyRO_NEifw5b26k3srgQH4jyeujjCJ-HbM36_w,4913
|
|
100
|
+
invar/templates/__init__.py,sha256=cb3ht8KPK5oBn5oG6HsTznujmo9WriJ_P--fVxJwycc,45
|
|
101
|
+
invar/templates/context.md.template,sha256=FKyI1ghpqcf4wftyv9-auIFHor8Nm8lETN45Ja-L8Og,2386
|
|
102
|
+
invar/templates/manifest.toml,sha256=UzLXcLPrRq9-99wdEMEGAHo_YWMordyDLjLhgkJPeZE,4500
|
|
103
|
+
invar/templates/proposal.md.template,sha256=UP7SpQ7gk8jVlHGLQCSQ5c-kCj1DBQEz8M-vEStK77I,1573
|
|
104
|
+
invar/templates/claude-md/python/critical-rules.md,sha256=Pkw6ZXFtAN2WGOeTD0CwkB_T73fd66NGzdOFM0wn-80,895
|
|
105
|
+
invar/templates/claude-md/python/quick-reference.md,sha256=ttd0TwgyIY0qt6qbeaCn4GO0e2OKedFLQE3yG32SlrA,672
|
|
106
|
+
invar/templates/claude-md/typescript/critical-rules.md,sha256=wC8EsPMR6R5sEAi6a3vc0xsmMzslmxOv5irp4m31Cxc,1111
|
|
107
|
+
invar/templates/claude-md/typescript/quick-reference.md,sha256=JtuUOrExY3TURZwc8vZA0t83etYL6ci1d7AqjUkUM3U,695
|
|
108
|
+
invar/templates/claude-md/universal/check-in.md,sha256=EUlpig5Cp0MRctlx7U49Ia7lEHkZriFXWj4-qHkDmTU,616
|
|
109
|
+
invar/templates/claude-md/universal/skills.md,sha256=O0JgCQNzUTEGAsGYTZg0HoBTffn-pRxQV6iso4MTUuc,2584
|
|
110
|
+
invar/templates/claude-md/universal/workflow.md,sha256=MatlbihubRg9zAjjuR331PSJ9xwMCusUVfbc86YEVoE,1966
|
|
111
|
+
invar/templates/commands/audit.md.jinja,sha256=Gwh3LNNcNWHzsOC7chYYg5ym8BxWTjySain3qPOs8pM,4817
|
|
112
|
+
invar/templates/commands/guard.md,sha256=N_C_AXd9kI85W1B0aTEycjiDp_jdaP8eeq8O0FQ_WQ8,1227
|
|
113
|
+
invar/templates/config/AGENT.md.jinja,sha256=tBIK5kZ7hjWgABU96Yq5_w3gNw_F31gQ19h4u1MLY4o,7037
|
|
114
|
+
invar/templates/config/CLAUDE.md.jinja,sha256=-cnl2yU3n4xP3nACEvmk2DK7ptniymQrS3eBUnGAj34,1737
|
|
115
|
+
invar/templates/config/context.md.jinja,sha256=BZnqBg_CXz3QFiCc8rfG8Kav_BGaGmSqxATKMliMA7k,3911
|
|
116
|
+
invar/templates/config/pre-commit.yaml.jinja,sha256=nUPxLxkTHAgZwhFAuOMDbZ8v0NQV9FlQPbr2MDEOsoA,1778
|
|
117
|
+
invar/templates/examples/python/README.md,sha256=mBsWKgQOF_PMQ_rf91TTjAEHpwfnb8Bb3x80D82bNZE,703
|
|
118
|
+
invar/templates/examples/python/conftest.py,sha256=oqC-9m0sqLUBQHz693mbuj-TN72psJqcSyObOoe4-pM,169
|
|
119
|
+
invar/templates/examples/python/contracts.py,sha256=OYj50SMBBekuffIh6oR9Ebq3UtTnIf3ElDTFc5iQvSA,5545
|
|
120
|
+
invar/templates/examples/python/core_shell.py,sha256=XCRiebDuoiSucm-3KJ0r9h4_9fJ7o4Ed5_yMZIcP16k,7944
|
|
121
|
+
invar/templates/examples/python/functional.py,sha256=ArH75nFID5-BsOb8gzZy65IT299PjTo6YhsOXL1gI0s,17847
|
|
122
|
+
invar/templates/examples/python/workflow.md,sha256=jAopzQH1xE9_leJFdav4oj1AkI46-a2q4L8RQCkDknw,2334
|
|
123
|
+
invar/templates/examples/typescript/README.md,sha256=I6kVTJAk6wqb21eC09hyOZXRP74SxE6BG2SlkrncAIM,785
|
|
124
|
+
invar/templates/examples/typescript/contracts.ts,sha256=X6EeNUAurw9MHJlHPDos_JtnScMu2aDMSkveIaA4wHs,4597
|
|
125
|
+
invar/templates/examples/typescript/core_shell.ts,sha256=VuPl0xmn_s6pA7ZJtq0zNjXzK_DRmq3LexwTS8MEqnQ,11267
|
|
126
|
+
invar/templates/examples/typescript/functional.ts,sha256=bQHfl0EYDC_RziRQLJBgPNBGhWBBO7SVSVchqBJUetM,17347
|
|
127
|
+
invar/templates/examples/typescript/workflow.md,sha256=5byADjA3WgOgiDbkEtVRKKGvlhvu3EbFCzqEg9lEV7k,2764
|
|
128
|
+
invar/templates/hooks/PostToolUse.sh.jinja,sha256=JHJGMdF3xp2qEqkPC9GaLp0NCa5gdRzqAmgRy4IldBg,3428
|
|
129
|
+
invar/templates/hooks/PreToolUse.sh.jinja,sha256=tZb-FGFxOBtTprUfeChau7rZOMPII69_5HSF-i_WD4Q,3558
|
|
130
|
+
invar/templates/hooks/Stop.sh.jinja,sha256=SD0PhBPeun7DTvn8Erbz11PBGAwGby4tMTd97yOJuTQ,981
|
|
131
|
+
invar/templates/hooks/UserPromptSubmit.sh.jinja,sha256=sUsqBiXzIEM3C8NdN4s4C7KqPlamyVhk5_-3zd5TC9Y,2621
|
|
132
|
+
invar/templates/hooks/__init__.py,sha256=RnnMoQA-8eqbr8Y_1Vu9B8h5vAz4C-vmo8wgdcGYrz0,43
|
|
133
|
+
invar/templates/hooks/pi/invar.ts.jinja,sha256=0V7kBxPfXx18wGbZRT4F1CcuaK09oHh2IJll62N4XVM,2620
|
|
134
|
+
invar/templates/onboard/assessment.md.jinja,sha256=EzqF0VUcxJZG2bVJLxTOyQlAERRbh9v9hXKVt6vcbxY,5850
|
|
135
|
+
invar/templates/onboard/roadmap.md.jinja,sha256=gmvZk4Hdwe0l3qSFV15QGcsr-OPMhsc6-1K9F2SFSIQ,3939
|
|
136
|
+
invar/templates/onboard/patterns/python.md,sha256=3wwucAcQz0DlggtpqYo-ZCnmrXgBQ0aBgUHN_EZ1VW0,8681
|
|
137
|
+
invar/templates/onboard/patterns/typescript.md,sha256=yOVfHtdAdjKkWNh66_dR7z2xEA4sggbIcCKthW-fqac,11983
|
|
138
|
+
invar/templates/protocol/INVAR.md.jinja,sha256=t2ZIQZJvzDTJMrRw_ijUo6ScZmeNK0-nV-H7ztTIyQQ,1464
|
|
139
|
+
invar/templates/protocol/python/architecture-examples.md,sha256=O96LH9WFpk7G9MrhSbifLS5pyibTIDG-_EGFF7g3V4M,1175
|
|
140
|
+
invar/templates/protocol/python/contracts-syntax.md,sha256=Q6supTQ3tChVrlN7xhcdb3Q8VGIESxQLA-mQvrNIZmo,1162
|
|
141
|
+
invar/templates/protocol/python/markers.md,sha256=fzltCKbdPVz_vCuJFiQ9pbRPztvpMJpSf_4aFHcXFLM,1223
|
|
142
|
+
invar/templates/protocol/python/tools.md,sha256=LBFh-6vW-MMbyxU3qYr9m7edqKELUKsfPcICZ5S76yU,896
|
|
143
|
+
invar/templates/protocol/python/troubleshooting.md,sha256=-JHLUOxvfQeSrLpqKrxUXQ5UrkW44AHFr3LGHwxnw7w,1081
|
|
144
|
+
invar/templates/protocol/typescript/architecture-examples.md,sha256=Dej-DI6OqRVsbzjukjOqdO8WEz0aT-1iwYqrah2B_xk,1454
|
|
145
|
+
invar/templates/protocol/typescript/contracts-syntax.md,sha256=yKyM6WhyF5p-bt-RqD5SI4ZZudE7bLLFTAMzVSa74QE,1610
|
|
146
|
+
invar/templates/protocol/typescript/markers.md,sha256=8mHzYfBlQ2baeQSV2e7uY2p6_EW1rwKVjToTLiQwUrQ,1536
|
|
147
|
+
invar/templates/protocol/typescript/tools.md,sha256=S_LG-o2X8fAudAcWYV41doIMYoFXUKyFvcff0keF_CI,1537
|
|
148
|
+
invar/templates/protocol/typescript/troubleshooting.md,sha256=kHx4Ykfgv6S1OXMmLZ3jMft6aqy60c9ODEhfs5kcybo,2588
|
|
149
|
+
invar/templates/protocol/universal/architecture.md,sha256=WT6wL0VDPD4n8yXBQEOXXnzh2IkK18oOt76lZelN3As,1379
|
|
150
|
+
invar/templates/protocol/universal/completion.md,sha256=bFo8-Npa7vb1efQLgOdGDSWnho45f0BBxvaD8awFLus,425
|
|
151
|
+
invar/templates/protocol/universal/contracts-concept.md,sha256=7XDdzz_obI8JbkZfKDD4yJIpo5DmaL4xyjmxRjwSq4Q,780
|
|
152
|
+
invar/templates/protocol/universal/header.md,sha256=ttg9wtbqw3jWUocwMn2AUbqPXT_hOk15VwWosWYnAUQ,965
|
|
153
|
+
invar/templates/protocol/universal/session.md,sha256=bOaHfu-1QsCXaNyL-412W6b0YFuk0-L4sd0VItrf0V0,418
|
|
154
|
+
invar/templates/protocol/universal/six-laws.md,sha256=15NHyDJhOlTU22FH9xhuEtrMGI3N5SyUCUnjq_0HCco,530
|
|
155
|
+
invar/templates/protocol/universal/usbv.md,sha256=WlAxDQ27dlNDale_HeusIjEiCdYSXXaFeO4ed_BiL0Q,659
|
|
156
|
+
invar/templates/protocol/universal/visible-workflow.md,sha256=nw3_Z3ZbEv4fjpgOMAZX2DNpYPvSJshLQ6aZfIfrrvA,726
|
|
157
|
+
invar/templates/skills/develop/SKILL.md.jinja,sha256=gTS3jTalTV6tnvKqiS4wUJzq4MLNO9VC_m50iVSJj70,17072
|
|
158
|
+
invar/templates/skills/extensions/_registry.yaml,sha256=T0Fkqg8ZKzlyQeoOcGtUsZRNnIyisxcZr_l6woKWBzY,2030
|
|
159
|
+
invar/templates/skills/extensions/acceptance/SKILL.md,sha256=-0pRJTBm6Jyo__KpN32ixNhNbuWUZDSMCDA6RXGnNiE,11719
|
|
160
|
+
invar/templates/skills/extensions/invar-onboard/SKILL.md,sha256=wFXlicF6JJUSLSB0YYP1cKO1cuseuAdOcqLsyJX0bes,11575
|
|
161
|
+
invar/templates/skills/extensions/invar-onboard/patterns/python.md,sha256=3wwucAcQz0DlggtpqYo-ZCnmrXgBQ0aBgUHN_EZ1VW0,8681
|
|
162
|
+
invar/templates/skills/extensions/invar-onboard/patterns/typescript.md,sha256=yOVfHtdAdjKkWNh66_dR7z2xEA4sggbIcCKthW-fqac,11983
|
|
163
|
+
invar/templates/skills/extensions/invar-onboard/templates/assessment.md.jinja,sha256=EzqF0VUcxJZG2bVJLxTOyQlAERRbh9v9hXKVt6vcbxY,5850
|
|
164
|
+
invar/templates/skills/extensions/invar-onboard/templates/roadmap.md.jinja,sha256=gmvZk4Hdwe0l3qSFV15QGcsr-OPMhsc6-1K9F2SFSIQ,3939
|
|
165
|
+
invar/templates/skills/extensions/security/SKILL.md,sha256=5mLwf4JP82Wq1vKkDIJwi8KhsmrP6Q6SIsw9By3hBrA,10851
|
|
166
|
+
invar/templates/skills/extensions/security/patterns/_common.yaml,sha256=75BvSABWUtO1VXFvdsMgqi86J1759T4ROhYYcizSygQ,3680
|
|
167
|
+
invar/templates/skills/extensions/security/patterns/python.yaml,sha256=osyR8mWiyjW6tWjZA7QZfBIiim7XqgBYnrE45ktDx50,4658
|
|
168
|
+
invar/templates/skills/extensions/security/patterns/typescript.yaml,sha256=qDEg-sxSE63Bis2IZG1y4L8m8g2ZYkC29o6t-J_LmUo,5508
|
|
169
|
+
invar/templates/skills/investigate/SKILL.md.jinja,sha256=cp6TBEixBYh1rLeeHOR1yqEnFqv1NZYePORMnavLkQI,3231
|
|
170
|
+
invar/templates/skills/propose/SKILL.md.jinja,sha256=6BuKiCqO1AEu3VtzMHy1QWGqr_xqG9eJlhbsKT4jev4,3463
|
|
171
|
+
invar/templates/skills/review/SKILL.md.jinja,sha256=ET5mbdSe_eKgJbi2LbgFC-z1aviKcHOBw7J5Q28fr4U,14105
|
|
172
|
+
invar_tools-1.11.0.dist-info/METADATA,sha256=ZqSNbqNPK1MeTHJ-dEOEqR1HCJfJeDrMIkalsjef59w,27504
|
|
173
|
+
invar_tools-1.11.0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
|
|
174
|
+
invar_tools-1.11.0.dist-info/entry_points.txt,sha256=RwH_EhqgtFPsnO6RcrwrAb70Zyfb8Mh6uUtztWnUxGk,102
|
|
175
|
+
invar_tools-1.11.0.dist-info/licenses/LICENSE,sha256=qeFksp4H4kfTgQxPCIu3OdagXyiZcgBlVfsQ6M5oFyk,10767
|
|
176
|
+
invar_tools-1.11.0.dist-info/licenses/LICENSE-GPL,sha256=IvZfC6ZbP7CLjytoHVzvpDZpD-Z3R_qa1GdMdWlWQ6Q,35157
|
|
177
|
+
invar_tools-1.11.0.dist-info/licenses/NOTICE,sha256=joEyMyFhFY8Vd8tTJ-a3SirI0m2Sd0WjzqYt3sdcglc,2561
|
|
178
|
+
invar_tools-1.11.0.dist-info/RECORD,,
|