invar-tools 1.8.0__py3-none-any.whl → 1.11.0__py3-none-any.whl

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