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

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