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