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.
Files changed (113) hide show
  1. invar/__init__.py +8 -0
  2. invar/core/language.py +88 -0
  3. invar/core/models.py +106 -0
  4. invar/core/patterns/detector.py +6 -1
  5. invar/core/patterns/p0_exhaustive.py +15 -3
  6. invar/core/patterns/p0_literal.py +15 -3
  7. invar/core/patterns/p0_newtype.py +15 -3
  8. invar/core/patterns/p0_nonempty.py +15 -3
  9. invar/core/patterns/p0_validation.py +15 -3
  10. invar/core/patterns/registry.py +5 -1
  11. invar/core/patterns/types.py +5 -1
  12. invar/core/property_gen.py +4 -0
  13. invar/core/rules.py +84 -18
  14. invar/core/sync_helpers.py +27 -1
  15. invar/core/template_helpers.py +32 -0
  16. invar/core/ts_parsers.py +286 -0
  17. invar/core/ts_sig_parser.py +307 -0
  18. invar/node_tools/MANIFEST +7 -0
  19. invar/node_tools/__init__.py +51 -0
  20. invar/node_tools/fc-runner/cli.js +77 -0
  21. invar/node_tools/quick-check/cli.js +28 -0
  22. invar/node_tools/ts-analyzer/cli.js +480 -0
  23. invar/shell/claude_hooks.py +35 -12
  24. invar/shell/commands/guard.py +36 -1
  25. invar/shell/commands/init.py +133 -7
  26. invar/shell/commands/perception.py +157 -33
  27. invar/shell/commands/skill.py +187 -0
  28. invar/shell/commands/template_sync.py +65 -13
  29. invar/shell/commands/uninstall.py +77 -12
  30. invar/shell/commands/update.py +6 -14
  31. invar/shell/contract_coverage.py +1 -0
  32. invar/shell/fs.py +66 -13
  33. invar/shell/pi_hooks.py +213 -0
  34. invar/shell/prove/guard_ts.py +899 -0
  35. invar/shell/skill_manager.py +353 -0
  36. invar/shell/template_engine.py +28 -4
  37. invar/shell/templates.py +4 -4
  38. invar/templates/claude-md/python/critical-rules.md +33 -0
  39. invar/templates/claude-md/python/quick-reference.md +24 -0
  40. invar/templates/claude-md/typescript/critical-rules.md +40 -0
  41. invar/templates/claude-md/typescript/quick-reference.md +24 -0
  42. invar/templates/claude-md/universal/check-in.md +25 -0
  43. invar/templates/claude-md/universal/skills.md +73 -0
  44. invar/templates/claude-md/universal/workflow.md +55 -0
  45. invar/templates/commands/{audit.md → audit.md.jinja} +18 -1
  46. invar/templates/config/AGENT.md.jinja +256 -0
  47. invar/templates/config/CLAUDE.md.jinja +16 -209
  48. invar/templates/config/context.md.jinja +19 -0
  49. invar/templates/examples/{README.md → python/README.md} +2 -0
  50. invar/templates/examples/{conftest.py → python/conftest.py} +1 -1
  51. invar/templates/examples/{contracts.py → python/contracts.py} +81 -4
  52. invar/templates/examples/python/core_shell.py +227 -0
  53. invar/templates/examples/python/functional.py +613 -0
  54. invar/templates/examples/typescript/README.md +31 -0
  55. invar/templates/examples/typescript/contracts.ts +163 -0
  56. invar/templates/examples/typescript/core_shell.ts +374 -0
  57. invar/templates/examples/typescript/functional.ts +601 -0
  58. invar/templates/examples/typescript/workflow.md +95 -0
  59. invar/templates/hooks/PostToolUse.sh.jinja +10 -1
  60. invar/templates/hooks/PreToolUse.sh.jinja +38 -0
  61. invar/templates/hooks/Stop.sh.jinja +1 -1
  62. invar/templates/hooks/UserPromptSubmit.sh.jinja +7 -0
  63. invar/templates/hooks/pi/invar.ts.jinja +82 -0
  64. invar/templates/manifest.toml +8 -6
  65. invar/templates/onboard/assessment.md.jinja +214 -0
  66. invar/templates/onboard/patterns/python.md +347 -0
  67. invar/templates/onboard/patterns/typescript.md +452 -0
  68. invar/templates/onboard/roadmap.md.jinja +168 -0
  69. invar/templates/protocol/INVAR.md.jinja +51 -0
  70. invar/templates/protocol/python/architecture-examples.md +41 -0
  71. invar/templates/protocol/python/contracts-syntax.md +56 -0
  72. invar/templates/protocol/python/markers.md +44 -0
  73. invar/templates/protocol/python/tools.md +24 -0
  74. invar/templates/protocol/python/troubleshooting.md +38 -0
  75. invar/templates/protocol/typescript/architecture-examples.md +52 -0
  76. invar/templates/protocol/typescript/contracts-syntax.md +73 -0
  77. invar/templates/protocol/typescript/markers.md +48 -0
  78. invar/templates/protocol/typescript/tools.md +65 -0
  79. invar/templates/protocol/typescript/troubleshooting.md +104 -0
  80. invar/templates/protocol/universal/architecture.md +36 -0
  81. invar/templates/protocol/universal/completion.md +14 -0
  82. invar/templates/protocol/universal/contracts-concept.md +37 -0
  83. invar/templates/protocol/universal/header.md +17 -0
  84. invar/templates/protocol/universal/session.md +17 -0
  85. invar/templates/protocol/universal/six-laws.md +10 -0
  86. invar/templates/protocol/universal/usbv.md +14 -0
  87. invar/templates/protocol/universal/visible-workflow.md +25 -0
  88. invar/templates/skills/develop/SKILL.md.jinja +98 -3
  89. invar/templates/skills/extensions/_registry.yaml +93 -0
  90. invar/templates/skills/extensions/acceptance/SKILL.md +383 -0
  91. invar/templates/skills/extensions/invar-onboard/SKILL.md +448 -0
  92. invar/templates/skills/extensions/invar-onboard/patterns/python.md +347 -0
  93. invar/templates/skills/extensions/invar-onboard/patterns/typescript.md +452 -0
  94. invar/templates/skills/extensions/invar-onboard/templates/assessment.md.jinja +214 -0
  95. invar/templates/skills/extensions/invar-onboard/templates/roadmap.md.jinja +168 -0
  96. invar/templates/skills/extensions/security/SKILL.md +382 -0
  97. invar/templates/skills/extensions/security/patterns/_common.yaml +126 -0
  98. invar/templates/skills/extensions/security/patterns/python.yaml +155 -0
  99. invar/templates/skills/extensions/security/patterns/typescript.yaml +194 -0
  100. invar/templates/skills/investigate/SKILL.md.jinja +15 -0
  101. invar/templates/skills/propose/SKILL.md.jinja +33 -0
  102. invar/templates/skills/review/SKILL.md.jinja +346 -71
  103. {invar_tools-1.7.1.dist-info → invar_tools-1.10.0.dist-info}/METADATA +326 -19
  104. invar_tools-1.10.0.dist-info/RECORD +173 -0
  105. invar/templates/examples/core_shell.py +0 -127
  106. invar/templates/protocol/INVAR.md +0 -310
  107. invar_tools-1.7.1.dist-info/RECORD +0 -112
  108. /invar/templates/examples/{workflow.md → python/workflow.md} +0 -0
  109. {invar_tools-1.7.1.dist-info → invar_tools-1.10.0.dist-info}/WHEEL +0 -0
  110. {invar_tools-1.7.1.dist-info → invar_tools-1.10.0.dist-info}/entry_points.txt +0 -0
  111. {invar_tools-1.7.1.dist-info → invar_tools-1.10.0.dist-info}/licenses/LICENSE +0 -0
  112. {invar_tools-1.7.1.dist-info → invar_tools-1.10.0.dist-info}/licenses/LICENSE-GPL +0 -0
  113. {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.7.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 for Claude Code (skip prompts)
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: "calculate average" is ambiguous
255
+ # Without contracts: ambiguous
210
256
  def average(items):
211
- return sum(items) / len(items) # What if empty? What's the return type?
257
+ return sum(items) / len(items)
258
+ # What if empty? Return type?
212
259
 
213
- # With contracts: specification is explicit and verifiable
214
- @pre(lambda items: len(items) > 0) # Precondition: non-empty input
215
- @post(lambda result: result >= 0) # Postcondition: non-negative output
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 (DX-61)
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` → select Claude Code |
373
- | **Pi / Cursor** | 🚧 In progress | `invar init` → select Other, include `AGENT.md` in prompt |
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 / Cursor (In Progress)
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
- Currently available:
387
- - Protocol document (INVAR.md)
388
- - CLI verification (`invar guard`)
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
- - MCP server (manual configuration)
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 automation | Claude Code |
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,,