invar-tools 1.7.1__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/template_helpers.py +32 -0
- 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 +133 -7
- 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 +77 -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 +213 -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 +256 -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 +82 -0
- invar/templates/manifest.toml +8 -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 +98 -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/investigate/SKILL.md.jinja +15 -0
- invar/templates/skills/propose/SKILL.md.jinja +33 -0
- invar/templates/skills/review/SKILL.md.jinja +346 -71
- {invar_tools-1.7.1.dist-info → invar_tools-1.10.0.dist-info}/METADATA +326 -19
- 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.7.1.dist-info/RECORD +0 -112
- /invar/templates/examples/{workflow.md → python/workflow.md} +0 -0
- {invar_tools-1.7.1.dist-info → invar_tools-1.10.0.dist-info}/WHEEL +0 -0
- {invar_tools-1.7.1.dist-info → invar_tools-1.10.0.dist-info}/entry_points.txt +0 -0
- {invar_tools-1.7.1.dist-info → invar_tools-1.10.0.dist-info}/licenses/LICENSE +0 -0
- {invar_tools-1.7.1.dist-info → invar_tools-1.10.0.dist-info}/licenses/LICENSE-GPL +0 -0
- {invar_tools-1.7.1.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
|
```
|
|
@@ -138,8 +175,9 @@ cd your-project
|
|
|
138
175
|
# Interactive mode - choose what to install
|
|
139
176
|
uvx invar-tools init
|
|
140
177
|
|
|
141
|
-
# Or quick setup
|
|
142
|
-
uvx invar-tools init --claude
|
|
178
|
+
# Or quick setup (skip prompts)
|
|
179
|
+
uvx invar-tools init --claude # Claude Code
|
|
180
|
+
uvx invar-tools init --pi # Pi Coding Agent
|
|
143
181
|
|
|
144
182
|
# Add runtime contracts to your project
|
|
145
183
|
pip install invar-runtime
|
|
@@ -203,16 +241,25 @@ Invar addresses each from the ground up.
|
|
|
203
241
|
|
|
204
242
|
### ✅ Solution 1: Contracts as Specification
|
|
205
243
|
|
|
206
|
-
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>
|
|
207
253
|
|
|
208
254
|
```python
|
|
209
|
-
# Without contracts:
|
|
255
|
+
# Without contracts: ambiguous
|
|
210
256
|
def average(items):
|
|
211
|
-
return sum(items) / len(items)
|
|
257
|
+
return sum(items) / len(items)
|
|
258
|
+
# What if empty? Return type?
|
|
212
259
|
|
|
213
|
-
# With contracts:
|
|
214
|
-
@pre(lambda items: len(items) > 0)
|
|
215
|
-
@post(lambda result: result >= 0)
|
|
260
|
+
# With contracts: explicit
|
|
261
|
+
@pre(lambda items: len(items) > 0)
|
|
262
|
+
@post(lambda result: result >= 0)
|
|
216
263
|
def average(items: list[float]) -> float:
|
|
217
264
|
"""
|
|
218
265
|
>>> average([1.0, 2.0, 3.0])
|
|
@@ -221,6 +268,32 @@ def average(items: list[float]) -> float:
|
|
|
221
268
|
return sum(items) / len(items)
|
|
222
269
|
```
|
|
223
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
|
+
|
|
224
297
|
**Benefits:**
|
|
225
298
|
- Agent knows exactly what to implement
|
|
226
299
|
- Edge cases are explicit in the contract
|
|
@@ -282,7 +355,7 @@ Skill routing ensures agents enter through the correct workflow:
|
|
|
282
355
|
| **Core/Shell** | Guard blocks I/O imports in Core | 100% testable business logic |
|
|
283
356
|
| **Result[T, E]** | Guard warns if Shell returns bare values | Explicit error handling |
|
|
284
357
|
|
|
285
|
-
### 🔮 Future: Quality Guidance
|
|
358
|
+
### 🔮 Future: Quality Guidance
|
|
286
359
|
|
|
287
360
|
Beyond "correct or not"—Invar will suggest improvements:
|
|
288
361
|
|
|
@@ -321,6 +394,14 @@ Separate pure logic from I/O for maximum testability:
|
|
|
321
394
|
▼ Result[T, E]
|
|
322
395
|
```
|
|
323
396
|
|
|
397
|
+
<table>
|
|
398
|
+
<tr>
|
|
399
|
+
<th>Python</th>
|
|
400
|
+
<th>TypeScript</th>
|
|
401
|
+
</tr>
|
|
402
|
+
<tr>
|
|
403
|
+
<td>
|
|
404
|
+
|
|
324
405
|
```python
|
|
325
406
|
# Core: Pure, testable, provable
|
|
326
407
|
def parse_config(content: str) -> Config:
|
|
@@ -334,6 +415,28 @@ def load_config(path: Path) -> Result[Config, str]:
|
|
|
334
415
|
return Failure(f"Not found: {path}")
|
|
335
416
|
```
|
|
336
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
|
+
|
|
337
440
|
### Session Protocol
|
|
338
441
|
|
|
339
442
|
Clear boundaries for every AI session:
|
|
@@ -369,10 +472,13 @@ AlphaCodium · Parsel · Reflexion · Clover
|
|
|
369
472
|
|
|
370
473
|
| Agent | Status | Setup |
|
|
371
474
|
|-------|--------|-------|
|
|
372
|
-
| **Claude Code** | ✅ Full | `invar init`
|
|
373
|
-
| **Pi
|
|
475
|
+
| **Claude Code** | ✅ Full | `invar init --claude` |
|
|
476
|
+
| **[Pi](https://shittycodingagent.ai/)** | ✅ Full | `invar init --pi` |
|
|
477
|
+
| **Cursor** | ✅ MCP | `invar init` → select Other, add MCP config |
|
|
374
478
|
| **Other** | 📝 Manual | `invar init` → select Other, include `AGENT.md` in prompt |
|
|
375
479
|
|
|
480
|
+
> **See also:** [Multi-Agent Guide](./docs/guides/multi-agent.md) for detailed integration instructions.
|
|
481
|
+
|
|
376
482
|
### Claude Code (Full Experience)
|
|
377
483
|
|
|
378
484
|
All features auto-configured:
|
|
@@ -381,13 +487,24 @@ All features auto-configured:
|
|
|
381
487
|
- Claude Code hooks (tool guidance, verification reminders)
|
|
382
488
|
- Pre-commit hooks
|
|
383
489
|
|
|
384
|
-
### Pi
|
|
490
|
+
### [Pi](https://shittycodingagent.ai/) (Full Support)
|
|
491
|
+
|
|
492
|
+
Pi reads CLAUDE.md and .claude/skills/ directly, sharing configuration with Claude Code:
|
|
493
|
+
- **Same instruction file** — CLAUDE.md (no separate AGENT.md needed)
|
|
494
|
+
- **Same workflow skills** — .claude/skills/ work in Pi
|
|
495
|
+
- **Pi-specific hooks** — .pi/hooks/invar.ts for pytest blocking and protocol refresh
|
|
496
|
+
- **Protocol injection** — Long conversation support via `pi.send()`
|
|
497
|
+
- Pre-commit hooks
|
|
385
498
|
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
499
|
+
### Cursor (MCP + Rules)
|
|
500
|
+
|
|
501
|
+
Cursor users get full verification via MCP:
|
|
502
|
+
- MCP tools (`invar_guard`, `invar_sig`, `invar_map`)
|
|
503
|
+
- .cursor/rules/ for USBV workflow guidance
|
|
504
|
+
- Hooks (beta) for pytest blocking
|
|
389
505
|
- Pre-commit hooks
|
|
390
|
-
|
|
506
|
+
|
|
507
|
+
> See [Cursor Guide](./docs/guides/cursor.md) for detailed setup.
|
|
391
508
|
|
|
392
509
|
### Other Editors (Manual)
|
|
393
510
|
|
|
@@ -409,7 +526,7 @@ Currently available:
|
|
|
409
526
|
| `.pre-commit-config.yaml` | Verification before commit | Optional |
|
|
410
527
|
| `src/core/`, `src/shell/` | Recommended structure | Optional |
|
|
411
528
|
| `CLAUDE.md` | Agent instructions | Claude Code |
|
|
412
|
-
| `.claude/skills/` | Workflow
|
|
529
|
+
| `.claude/skills/` | Workflow + extension skills | Claude Code |
|
|
413
530
|
| `.claude/commands/` | User commands (/audit, /guard) | Claude Code |
|
|
414
531
|
| `.claude/hooks/` | Tool guidance | Claude Code |
|
|
415
532
|
| `.mcp.json` | MCP server config | Claude Code |
|
|
@@ -427,6 +544,163 @@ src/{project}/
|
|
|
427
544
|
|
|
428
545
|
---
|
|
429
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
|
+
|
|
430
704
|
## ⚙️ Configuration
|
|
431
705
|
|
|
432
706
|
```toml
|
|
@@ -452,8 +726,35 @@ max_function_lines = 50
|
|
|
452
726
|
# Requirements
|
|
453
727
|
require_contracts = true
|
|
454
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"]
|
|
738
|
+
```
|
|
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 = []
|
|
455
754
|
```
|
|
456
755
|
|
|
756
|
+
Available patterns: `NewType`, `Validation`, `NonEmpty`, `Literal`, `ExhaustiveMatch`, `SmartConstructor`, `StructuredError`
|
|
757
|
+
|
|
457
758
|
### 🚪 Escape Hatches
|
|
458
759
|
|
|
459
760
|
For code that intentionally breaks rules:
|
|
@@ -481,15 +782,21 @@ rules = ["missing_contract", "shell_result"]
|
|
|
481
782
|
| `invar guard` | Full verification (static + doctest + property + symbolic) |
|
|
482
783
|
| `invar guard --changed` | Only git-modified files |
|
|
483
784
|
| `invar guard --static` | Static analysis only (~0.5s) |
|
|
785
|
+
| `invar guard --coverage` | Collect branch coverage from tests |
|
|
484
786
|
| `invar init` | Initialize or update project (interactive) |
|
|
485
787
|
| `invar init --claude` | Quick setup for Claude Code |
|
|
486
788
|
| `invar uninstall` | Remove Invar from project (preserves user content) |
|
|
487
789
|
| `invar sig <file>` | Show signatures and contracts |
|
|
488
790
|
| `invar map` | Symbol map with reference counts |
|
|
489
|
-
| `invar rules` | List all rules |
|
|
791
|
+
| `invar rules` | List all rules with severity |
|
|
490
792
|
| `invar test` | Property-based tests (Hypothesis) |
|
|
491
793
|
| `invar verify` | Symbolic verification (CrossHair) |
|
|
794
|
+
| `invar mutate` | Mutation testing (find gaps in tests) |
|
|
492
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 |
|
|
493
800
|
|
|
494
801
|
### MCP Tools
|
|
495
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,,
|