Repository: trunk-io/plugins
Pull request #1028: (Feat): Add linter: ty
Author: login: TylerJang27
Created: 2025-05-14T08:19:46Z | Merged: 2025-05-15T16:55:36Z

Fixes https://github.com/trunk-io/plugins/issues/1024. https://github.com/astral-sh/ty#readme


Diff:
diff --git a/README.md b/README.md
index d0545e841..6b2c978c3 100644
--- a/README.md
+++ b/README.md
@@ -38,59 +38,59 @@ Enable the following tools via:
 trunk check enable {linter}
 ```
 
-| Technology      | Linters                                                                                                                  |
-| --------------- | ------------------------------------------------------------------------------------------------------------------------ |
-| All             | [codespell], [cspell], [gitleaks], [git-diff-check], [pre-commit-hooks], [trunk-toolbox], [vale]                         |
-| Ansible         | [ansible-lint]                                                                                                           |
-| Apex            | [pmd]                                                                                                                    |
-| Bash            | [shellcheck], [shfmt]                                                                                                    |
-| Bazel, Starlark | [buildifier]                                                                                                             |
-| C, C++          | [clang-format], [clang-tidy], [include-what-you-use], [pragma-once]                                                      |
-| C#              | [dotnet-format]                                                                                                          |
-| CircleCI Config | [circleci]                                                                                                               |
-| Cloudformation  | [cfnlint], [checkov]                                                                                                     |
-| CMake           | [cmake-format]                                                                                                           |
-| CSS, SCSS       | [stylelint], [prettier]                                                                                                  |
-| Cue             | [cue-fmt]                                                                                                                |
-| Dart            | [dart]                                                                                                                   |
-| Docker          | [hadolint], [checkov]                                                                                                    |
-| Dotenv          | [dotenv-linter]                                                                                                          |
-| GitHub          | [actionlint]                                                                                                             |
-| Go              | [gofmt], [gofumpt], [goimports], [gokart], [golangci-lint], [golines], [semgrep]                                         |
-| GraphQL         | [graphql-schema-linter], [prettier]                                                                                      |
-| HAML            | [haml-lint]                                                                                                              |
-| HTML Templates  | [djlint]                                                                                                                 |
-| Java            | [google-java-format], [pmd], [semgrep]                                                                                   |
-| Javascript      | [biome], [deno], [eslint], [prettier], [rome], [semgrep]                                                                 |
-| JSON            | [biome], [deno], [eslint], [prettier], [semgrep]                                                                         |
-| Kotlin          | [detekt], [ktlint]                                                                                                       |
-| Kubernetes      | [kube-linter]                                                                                                            |
-| Lua             | [stylua]                                                                                                                 |
-| Markdown        | [deno], [markdownlint], [markdownlint-cli2], [markdown-link-check], [markdown-table-prettify], [prettier], [remark-lint] |
-| Nix             | [nixpkgs-fmt]                                                                                                            |
-| package.json    | [sort-package-json]                                                                                                      |
-| Perl            | [perlcritic], [perltidy]                                                                                                 |
-| PHP             | [php-cs-fixer], [phpstan]                                                                                                |
-| PNG             | [oxipng]                                                                                                                 |
-| PowerShell      | [psscriptanalyzer]                                                                                                       |
-| Prisma          | [prisma]                                                                                                                 |
-| Protobuf        | [buf] (breaking, lint, and format), [clang-format], [clang-tidy]                                                         |
-| Python          | [autopep8], [bandit], [black], [flake8], [isort], [mypy], [pylint], [pyright], [semgrep], [yapf], [ruff], [sourcery]     |
-| Rego            | [regal], [opa]                                                                                                           |
-| Renovate        | [renovate]                                                                                                               |
-| Ruby            | [brakeman], [rubocop], [rufo], [semgrep], [standardrb]                                                                   |
-| Rust            | [clippy], [rustfmt]                                                                                                      |
-| Scala           | [scalafmt]                                                                                                               |
-| Security        | [checkov], [dustilock], [nancy], [osv-scanner], [snyk], [tfsec], [trivy], [trufflehog], [terrascan]                      |
-| SQL             | [sqlfluff], [sqlfmt], [sql-formatter], [squawk]                                                                          |
-| SVG             | [svgo]                                                                                                                   |
-| Swift           | [stringslint], [swiftlint], [swiftformat]                                                                                |
-| Terraform       | [terraform] (validate and fmt), [checkov], [tflint], [tfsec], [terrascan], [tofu]                                        |
-| Terragrunt      | [terragrunt]                                                                                                             |
-| Textproto       | [txtpbfmt]                                                                                                               |
-| TOML            | [taplo]                                                                                                                  |
-| Typescript      | [deno], [eslint], [prettier], [rome], [semgrep]                                                                          |
-| YAML            | [prettier], [semgrep], [yamllint]                                                                                        |
+| Technology      | Linters                                                                                                                    |
+| --------------- | -------------------------------------------------------------------------------------------------------------------------- |
+| All             | [codespell], [cspell], [gitleaks], [git-diff-check], [pre-commit-hooks], [trunk-toolbox], [vale]                           |
+| Ansible         | [ansible-lint]                                                                                                             |
+| Apex            | [pmd]                                                                                                                      |
+| Bash            | [shellcheck], [shfmt]                                                                                                      |
+| Bazel, Starlark | [buildifier]                                                                                                               |
+| C, C++          | [clang-format], [clang-tidy], [include-what-you-use], [pragma-once]                                                        |
+| C#              | [dotnet-format]                                                                                                            |
+| CircleCI Config | [circleci]                                                                                                                 |
+| Cloudformation  | [cfnlint], [checkov]                                                                                                       |
+| CMake           | [cmake-format]                                                                                                             |
+| CSS, SCSS       | [stylelint], [prettier]                                                                                                    |
+| Cue             | [cue-fmt]                                                                                                                  |
+| Dart            | [dart]                                                                                                                     |
+| Docker          | [hadolint], [checkov]                                                                                                      |
+| Dotenv          | [dotenv-linter]                                                                                                            |
+| GitHub          | [actionlint]                                                                                                               |
+| Go              | [gofmt], [gofumpt], [goimports], [gokart], [golangci-lint], [golines], [semgrep]                                           |
+| GraphQL         | [graphql-schema-linter], [prettier]                                                                                        |
+| HAML            | [haml-lint]                                                                                                                |
+| HTML Templates  | [djlint]                                                                                                                   |
+| Java            | [google-java-format], [pmd], [semgrep]                                                                                     |
+| Javascript      | [biome], [deno], [eslint], [prettier], [rome], [semgrep]                                                                   |
+| JSON            | [biome], [deno], [eslint], [prettier], [semgrep]                                                                           |
+| Kotlin          | [detekt], [ktlint]                                                                                                         |
+| Kubernetes      | [kube-linter]                                                                                                              |
+| Lua             | [stylua]                                                                                                                   |
+| Markdown        | [deno], [markdownlint], [markdownlint-cli2], [markdown-link-check], [markdown-table-prettify], [prettier], [remark-lint]   |
+| Nix             | [nixpkgs-fmt]                                                                                                              |
+| package.json    | [sort-package-json]                                                                                                        |
+| Perl            | [perlcritic], [perltidy]                                                                                                   |
+| PHP             | [php-cs-fixer], [phpstan]                                                                                                  |
+| PNG             | [oxipng]                                                                                                                   |
+| PowerShell      | [psscriptanalyzer]                                                                                                         |
+| Prisma          | [prisma]                                                                                                                   |
+| Protobuf        | [buf] (breaking, lint, and format), [clang-format], [clang-tidy]                                                           |
+| Python          | [autopep8], [bandit], [black], [flake8], [isort], [mypy], [pylint], [pyright], [semgrep], [yapf], [ruff], [sourcery], [ty] |
+| Rego            | [regal], [opa]                                                                                                             |
+| Renovate        | [renovate]                                                                                                                 |
+| Ruby            | [brakeman], [rubocop], [rufo], [semgrep], [standardrb]                                                                     |
+| Rust            | [clippy], [rustfmt]                                                                                                        |
+| Scala           | [scalafmt]                                                                                                                 |
+| Security        | [checkov], [dustilock], [nancy], [osv-scanner], [snyk], [tfsec], [trivy], [trufflehog], [terrascan]                        |
+| SQL             | [sqlfluff], [sqlfmt], [sql-formatter], [squawk]                                                                            |
+| SVG             | [svgo]                                                                                                                     |
+| Swift           | [stringslint], [swiftlint], [swiftformat]                                                                                  |
+| Terraform       | [terraform] (validate and fmt), [checkov], [tflint], [tfsec], [terrascan], [tofu]                                          |
+| Terragrunt      | [terragrunt]                                                                                                               |
+| Textproto       | [txtpbfmt]                                                                                                                 |
+| TOML            | [taplo]                                                                                                                    |
+| Typescript      | [deno], [eslint], [prettier], [rome], [semgrep]                                                                            |
+| YAML            | [prettier], [semgrep], [yamllint]                                                                                          |
 
 [actionlint]: https://trunk.io/linters/infra/actionlint
 [ansible-lint]: https://github.com/ansible/ansible-lint#readme
@@ -195,6 +195,7 @@ trunk check enable {linter}
 [trufflehog]: https://trunk.io/linters/security/trufflehog
 [trunk-toolbox]: https://github.com/trunk-io/toolbox#readme
 [txtpbfmt]: https://github.com/protocolbuffers/txtpbfmt#readme
+[ty]: https://github.com/astral-sh/ty#readme
 [vale]: https://vale.sh/docs/
 [yamllint]: https://trunk.io/linters/yaml/yamllint
 [yapf]: https://github.com/google/yapf#readme
diff --git a/linters/ty/plugin.yaml b/linters/ty/plugin.yaml
new file mode 100644
index 000000000..264421a14
--- /dev/null
+++ b/linters/ty/plugin.yaml
@@ -0,0 +1,45 @@
+version: 0.1
+downloads:
+  - name: ty
+    version: 0.0.1-alpha.1
+    downloads:
+      - os:
+          linux: unknown-linux-gnu
+          macos: apple-darwin
+        cpu:
+          x86_64: x86_64
+          arm_64: aarch64
+        url: https://github.com/astral-sh/ty/releases/download/${version}/ty-${cpu}-${os}.tar.gz
+        strip_components: 1
+      - os:
+          windows: windows
+        cpu:
+          x86_64: x86_64
+        url: https://github.com/astral-sh/ty/releases/download/${version}/ty-x86_64-pc-windows-msvc.zip
+        strip_components: 1
+tools:
+  definitions:
+    - name: ty
+      download: ty
+      known_good_version: 0.0.1-alpha.1
+      shims: [ty]
+      health_checks:
+        - command: ty --version
+          parse_regex: ${semver}
+lint:
+  definitions:
+    - name: ty
+      description: A Python type checker
+      files: [python, python-interface]
+      tools: [ty]
+      known_good_version: 0.0.1-alpha.1
+      suggest_if: never
+      commands:
+        - name: check
+          output: regex
+          parse_regex:
+            ((?P<severity>.+)\[(?P<code>.+)\]
+            (?P<path>.+):(?P<line>\d+):(?P<column>\d+):\s*(?P<message>.*))
+          run: ty check --output-format=concise ${target}
+          success_codes: [0, 1]
+          batch: true
diff --git a/linters/ty/test_data/basic.in.py b/linters/ty/test_data/basic.in.py
new file mode 100644
index 000000000..65d12645d
--- /dev/null
+++ b/linters/ty/test_data/basic.in.py
@@ -0,0 +1,56 @@
+from typing import Callable, Iterator, Union, Optional, Enum
+
+
+def wrong_type(x: int) -> str:
+    return x  # error: Incompatible return value type (got "int", expected "str")
+
+class A:
+    def method1(self) -> None:
+        self.x = 1
+
+    def method2(self) -> None:
+        self.x = ""
+
+a = A()
+reveal_type(a.x)
+
+a.x = ""
+a.x = 3.0
+
+
+
+class A:
+    x: int = 0 # Regular class variable
+    y: ClassVar[int] = 0 # Pure class variable
+
+    def __init__(self):
+        self.z = 0 # Pure instance variable
+
+print(A.x)
+print(A.y)
+print(A.z)
+
+
+
+class Color(Enum):
+    RED = 1
+    BLUE = 2
+
+def is_red(color: Color) -> bool:
+    if color == Color.RED:
+        return True
+    elif color == Color.BLUE:
+        return False
+
+
+def func(val: int | None):
+    if val is not None:
+
+        def inner_1() -> None:
+            reveal_type(val)
+            print(val + 1)
+
+        inner_2 = lambda: reveal_type(val) + 1
+
+        inner_1()
+        inner_2()
diff --git a/linters/ty/test_data/interface.in.pyi b/linters/ty/test_data/interface.in.pyi
new file mode 100644
index 000000000..ac27d5d56
--- /dev/null
+++ b/linters/ty/test_data/interface.in.pyi
@@ -0,0 +1,51 @@
+# Based on test file input from astral-sh/ruff
+import json
+
+from typing import Any, Sequence
+
+class MissingCommand(TypeError): ...
+class AnoherClass: ...
+
+def a(): ...
+
+@overload
+def a(arg: int): ...
+
+@overload
+def a(arg: int, name: str): ...
+
+
+def grouped1(): ...
+def grouped2(): ...
+def grouped3( ): ...
+
+
+class BackendProxy:
+    backend_module: str
+    backend_object: str | None
+    backend: Any
+
+    def grouped1(): ...
+    def grouped2(): ...
+    def grouped3( ): ...
+    @decorated
+
+    def with_blank_line(): ...
+
+
+    def ungrouped(): ...
+a = "test"
+
+def function_def():
+    pass
+b = "test"
+
+
+def outer():
+     def inner():
+         pass
+     def inner2():
+         pass
+
+class Foo: ...
+class Bar: ...
diff --git a/linters/ty/test_data/ty_v0.0.1-alpha.1_basic.check.shot b/linters/ty/test_data/ty_v0.0.1-alpha.1_basic.check.shot
new file mode 100644
index 000000000..3cab03982
--- /dev/null
+++ b/linters/ty/test_data/ty_v0.0.1-alpha.1_basic.check.shot
@@ -0,0 +1,174 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`Testing linter ty test basic 1`] = `
+{
+  "issues": [
+    {
+      "code": "unresolved-import",
+      "column": "1",
+      "file": "test_data/basic.in.py",
+      "issueClass": "ISSUE_CLASS_EXISTING",
+      "level": "LEVEL_HIGH",
+      "line": "1",
+      "linter": "ty",
+      "message": "Module \`typing\` has no member \`Enum\`",
+      "targetType": "python",
+    },
+    {
+      "code": "revealed-type",
+      "column": "1",
+      "file": "test_data/basic.in.py",
+      "issueClass": "ISSUE_CLASS_EXISTING",
+      "level": "LEVEL_LOW",
+      "line": "15",
+      "linter": "ty",
+      "message": "Revealed type: \`Unknown | Literal[1, ""]\`",
+      "targetType": "python",
+    },
+    {
+      "code": "undefined-reveal",
+      "column": "1",
+      "file": "test_data/basic.in.py",
+      "issueClass": "ISSUE_CLASS_EXISTING",
+      "level": "LEVEL_MEDIUM",
+      "line": "15",
+      "linter": "ty",
+      "message": "\`reveal_type\` used without importing it",
+      "targetType": "python",
+    },
+    {
+      "code": "unresolved-reference",
+      "column": "1",
+      "file": "test_data/basic.in.py",
+      "issueClass": "ISSUE_CLASS_EXISTING",
+      "level": "LEVEL_HIGH",
+      "line": "24",
+      "linter": "ty",
+      "message": "Name \`ClassVar\` used when not defined",
+      "targetType": "python",
+    },
+    {
+      "code": "unresolved-attribute",
+      "column": "1",
+      "file": "test_data/basic.in.py",
+      "issueClass": "ISSUE_CLASS_EXISTING",
+      "level": "LEVEL_HIGH",
+      "line": "31",
+      "linter": "ty",
+      "message": "Attribute \`z\` can only be accessed on instances, not on the class object \`<class 'A'>\` itself.",
+      "targetType": "python",
+    },
+    {
+      "code": "invalid-return-type",
+      "column": "1",
+      "file": "test_data/basic.in.py",
+      "issueClass": "ISSUE_CLASS_EXISTING",
+      "level": "LEVEL_HIGH",
+      "line": "39",
+      "linter": "ty",
+      "message": "Function can implicitly return \`None\`, which is not assignable to return type \`bool\`",
+      "targetType": "python",
+    },
+    {
+      "code": "invalid-return-type",
+      "column": "1",
+      "file": "test_data/basic.in.py",
+      "issueClass": "ISSUE_CLASS_EXISTING",
+      "level": "LEVEL_HIGH",
+      "line": "5",
+      "linter": "ty",
+      "message": "Return type does not match returned value: Expected \`str\`, found \`int\`",
+      "targetType": "python",
+    },
+    {
+      "code": "revealed-type",
+      "column": "1",
+      "file": "test_data/basic.in.py",
+      "issueClass": "ISSUE_CLASS_EXISTING",
+      "level": "LEVEL_LOW",
+      "line": "50",
+      "linter": "ty",
+      "message": "Revealed type: \`int | None\`",
+      "targetType": "python",
+    },
+    {
+      "code": "undefined-reveal",
+      "column": "1",
+      "file": "test_data/basic.in.py",
+      "issueClass": "ISSUE_CLASS_EXISTING",
+      "level": "LEVEL_MEDIUM",
+      "line": "50",
+      "linter": "ty",
+      "message": "\`reveal_type\` used without importing it",
+      "targetType": "python",
+    },
+    {
+      "code": "unsupported-operator",
+      "column": "1",
+      "file": "test_data/basic.in.py",
+      "issueClass": "ISSUE_CLASS_EXISTING",
+      "level": "LEVEL_HIGH",
+      "line": "51",
+      "linter": "ty",
+      "message": "Operator \`+\` is unsupported between objects of type \`int | None\` and \`Literal[1]\`",
+      "targetType": "python",
+    },
+    {
+      "code": "revealed-type",
+      "column": "1",
+      "file": "test_data/basic.in.py",
+      "issueClass": "ISSUE_CLASS_EXISTING",
+      "level": "LEVEL_LOW",
+      "line": "53",
+      "linter": "ty",
+      "message": "Revealed type: \`int | None\`",
+      "targetType": "python",
+    },
+    {
+      "code": "undefined-reveal",
+      "column": "1",
+      "file": "test_data/basic.in.py",
+      "issueClass": "ISSUE_CLASS_EXISTING",
+      "level": "LEVEL_MEDIUM",
+      "line": "53",
+      "linter": "ty",
+      "message": "\`reveal_type\` used without importing it",
+      "targetType": "python",
+    },
+    {
+      "code": "unsupported-operator",
+      "column": "1",
+      "file": "test_data/basic.in.py",
+      "issueClass": "ISSUE_CLASS_EXISTING",
+      "level": "LEVEL_HIGH",
+      "line": "53",
+      "linter": "ty",
+      "message": "Operator \`+\` is unsupported between objects of type \`int | None\` and \`Literal[1]\`",
+      "targetType": "python",
+    },
+  ],
+  "lintActions": [
+    {
+      "command": "check",
+      "fileGroupName": "python",
+      "linter": "ty",
+      "paths": [
+        "test_data/basic.in.py",
+      ],
+      "verb": "TRUNK_VERB_CHECK",
+    },
+    {
+      "command": "check",
+      "fileGroupName": "python",
+      "linter": "ty",
+      "paths": [
+        "test_data/basic.in.py",
+      ],
+      "upstream": true,
+      "verb": "TRUNK_VERB_CHECK",
+    },
+  ],
+  "taskFailures": [],
+  "unformattedFiles": [],
+}
+`;
diff --git a/linters/ty/test_data/ty_v0.0.1-alpha.1_interface.check.shot b/linters/ty/test_data/ty_v0.0.1-alpha.1_interface.check.shot
new file mode 100644
index 000000000..8a10c0ddf
--- /dev/null
+++ b/linters/ty/test_data/ty_v0.0.1-alpha.1_interface.check.shot
@@ -0,0 +1,64 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`Testing linter ty test interface 1`] = `
+{
+  "issues": [
+    {
+      "code": "unresolved-reference",
+      "column": "1",
+      "file": "test_data/interface.in.pyi",
+      "issueClass": "ISSUE_CLASS_EXISTING",
+      "level": "LEVEL_HIGH",
+      "line": "11",
+      "linter": "ty",
+      "message": "Name \`overload\` used when not defined",
+      "targetType": "python-interface",
+    },
+    {
+      "code": "unresolved-reference",
+      "column": "1",
+      "file": "test_data/interface.in.pyi",
+      "issueClass": "ISSUE_CLASS_EXISTING",
+      "level": "LEVEL_HIGH",
+      "line": "14",
+      "linter": "ty",
+      "message": "Name \`overload\` used when not defined",
+      "targetType": "python-interface",
+    },
+    {
+      "code": "unresolved-reference",
+      "column": "1",
+      "file": "test_data/interface.in.pyi",
+      "issueClass": "ISSUE_CLASS_EXISTING",
+      "level": "LEVEL_HIGH",
+      "line": "31",
+      "linter": "ty",
+      "message": "Name \`decorated\` used when not defined",
+      "targetType": "python-interface",
+    },
+  ],
+  "lintActions": [
+    {
+      "command": "check",
+      "fileGroupName": "python-interface",
+      "linter": "ty",
+      "paths": [
+        "test_data/interface.in.pyi",
+      ],
+      "verb": "TRUNK_VERB_CHECK",
+    },
+    {
+      "command": "check",
+      "fileGroupName": "python-interface",
+      "linter": "ty",
+      "paths": [
+        "test_data/interface.in.pyi",
+      ],
+      "upstream": true,
+      "verb": "TRUNK_VERB_CHECK",
+    },
+  ],
+  "taskFailures": [],
+  "unformattedFiles": [],
+}
+`;
diff --git a/linters/ty/ty.test.ts b/linters/ty/ty.test.ts
new file mode 100644
index 000000000..2c45bb5e7
--- /dev/null
+++ b/linters/ty/ty.test.ts
@@ -0,0 +1,3 @@
+import { linterCheckTest } from "tests";
+
+linterCheckTest({ linterName: "ty" });


Reviews:
user: login: gemini-code-assist[bot]
body: Hello @TylerJang27, I'm Gemini Code Assist[^1]! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

## Summary of Changes
This pull request introduces the `ty` linter to the Trunk toolset. According to the description, `ty` is a static type checker for Python. The changes include adding `ty` to the list of supported linters in the `README.md` file and creating a new plugin configuration file (`plugin.yaml`) for `ty`. Additionally, test data and snapshot files are added to ensure the linter functions as expected.

### Highlights
* **Linter Integration**: The primary focus is the integration of the `ty` linter into the Trunk ecosystem, enabling static type checking for Python code.
* **Configuration File**: A `plugin.yaml` file is created to define the linter's version, download location, and execution commands.
* **Test Cases**: Test cases and snapshot files are added to verify the linter's functionality and ensure consistent output.

### Changelog
<details>
<summary>Click here to see the changelog</summary>

* **README.md**
  * Added `ty` to the list of supported Python linters in the table.
  * Added a link to the `ty` linter's repository in the references section.
* **linters/ty/plugin.yaml**
  * Created a new plugin configuration file for the `ty` linter.
  * Configured the linter's download location, version, and execution commands.
  * Defined health checks to ensure the linter is functioning correctly.
  * Configured the linter to run on Python and Python interface files.
* **linters/ty/test_data/basic.in.py**
  * Added a basic Python test file for the `ty` linter.
  * The test file includes type annotations and code that should trigger type checking errors.
* **linters/ty/test_data/interface.in.pyi**
  * Added a Python interface test file for the `ty` linter.
  * This file tests the linter's ability to check Python interface files (.pyi).
* **linters/ty/test_data/ty_v0.0.1-alpha.1_basic.check.shot**
  * Created a snapshot file for the basic Python test case.
  * This file contains the expected output of the `ty` linter when run on the basic test file.
* **linters/ty/test_data/ty_v0.0.1-alpha.1_interface.check.shot**
  * Created a snapshot file for the Python interface test case.
  * This file contains the expected output of the `ty` linter when run on the interface test file.
* **linters/ty/ty.test.ts**
  * Added a test file to run the `ty` linter and compare its output to the snapshot files.

</details>


<details>

<summary><b>Using Gemini Code Assist</b></summary>
<br>

The full guide for Gemini Code Assist can be found on our [documentation page](https://developers.google.com/gemini-code-assist/docs/review-github-code), here are some quick tips.

<b>Invoking Gemini</b>

You can request assistance from Gemini at any point in your pull request via creating an issue comment (i.e. comment on the pull request page) using either `/gemini <command>` or `@gemini-code-assist <command>`. Below is a summary of the supported commands.

Feature | Command | Description
--- | --- | ---
Code Review | `/gemini review` | Performs a code review for the current pull request in its current state.
Pull Request Summary | `/gemini summary` | Provides a summary of the current pull request in its current state.
Comment | @gemini-code-assist | Responds in comments when explicitly tagged, both in issue comments and review comments.
Help | `/gemini help` | Displays a list of available commands.

<b>Customization</b>

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a `.gemini/` folder in the base of the repository. Detailed instructions can be found [here](https://developers.google.com/gemini-code-assist/docs/customize-gemini-behavior-github).

<b>Limitations & Feedback</b>

Gemini Code Assist is currently in preview and may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with :thumbsup: and :thumbsdown: on @gemini-code-assist comments to provide feedback.

</details>

<b>You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the [Gemini Code Assist IDE Extension](https://cloud.google.com/products/gemini/code-assist).</b>


[^1]: Review the [Privacy Notices](https://policies.google.com/privacy), [Generative AI Prohibited Use Policy](https://policies.google.com/terms/generative-ai/use-policy), [Terms of Service](https://policies.google.com/terms), and learn how to configure Gemini Code Assist in GitHub [here](https://developers.google.com/gemini-code-assist/docs/review-github-code). Gemini can make mistakes, so double check it and [use code with caution](https://support.google.com/legal/answer/13505487).

---

> A new linter arrives,
> `ty` checks types with zeal,
> Code's safety thrives.


state: COMMENTED
author_association: NONE
submitted_at: 2025-05-14T08:19:58Z
user: login: gemini-code-assist[bot]
body: ## Code Review
This pull request introduces the `ty` linter to the Trunk toolset, which enhances Python code analysis. The changes include modifications to the README to reflect the addition of `ty` and the creation of necessary configuration and test files for the linter. Overall, the integration seems well-structured, but there are a few points that could be improved.

### Summary of Findings
* **README.md Linter Alphabetization**: The `ty` linter was added to the README.md file, but it was not alphabetized with the other linters.
* **plugin.yaml Download Source Descriptions**: The download sources in the plugin.yaml file lack descriptions, which can reduce readability and maintainability.
* **plugin.yaml Suggest If Field**: The `suggest_if: never` field in plugin.yaml lacks a comment explaining why Trunk should never suggest enabling this linter.
* **Test File Descriptions**: The test files lack descriptions, which can make it difficult to understand their purpose and what aspects of the linter they are designed to test.
* **Snapshot Issues**: The snapshots contain several issues related to missing imports and definitions, which can reduce the accuracy of the tests.

### Merge Readiness
The pull request introduces the `ty` linter to the Trunk toolset. While the integration appears well-structured, there are several issues that need to be addressed before merging. Specifically, the linter alphabetization in the README.md file, the download source descriptions in the plugin.yaml file, the `suggest_if` field in the plugin.yaml file, the test file descriptions, and the snapshot issues. I am unable to approve this pull request, and recommend that it not be merged until these issues are addressed.
state: CHANGES_REQUESTED
author_association: NONE
submitted_at: 2025-05-14T08:20:27Z
user: login: puzzler7
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-05-15T04:57:41Z

Review comments:
diff_hunk: @@ -38,59 +38,59 @@ Enable the following tools via:
 trunk check enable {linter}
 ```
 
-| Technology      | Linters                                                                                                                  |
-| --------------- | ------------------------------------------------------------------------------------------------------------------------ |
-| All             | [codespell], [cspell], [gitleaks], [git-diff-check], [pre-commit-hooks], [trunk-toolbox], [vale]                         |
-| Ansible         | [ansible-lint]                                                                                                           |
-| Apex            | [pmd]                                                                                                                    |
-| Bash            | [shellcheck], [shfmt]                                                                                                    |
-| Bazel, Starlark | [buildifier]                                                                                                             |
-| C, C++          | [clang-format], [clang-tidy], [include-what-you-use], [pragma-once]                                                      |
-| C#              | [dotnet-format]                                                                                                          |
-| CircleCI Config | [circleci]                                                                                                               |
-| Cloudformation  | [cfnlint], [checkov]                                                                                                     |
-| CMake           | [cmake-format]                                                                                                           |
-| CSS, SCSS       | [stylelint], [prettier]                                                                                                  |
-| Cue             | [cue-fmt]                                                                                                                |
-| Dart            | [dart]                                                                                                                   |
-| Docker          | [hadolint], [checkov]                                                                                                    |
-| Dotenv          | [dotenv-linter]                                                                                                          |
-| GitHub          | [actionlint]                                                                                                             |
-| Go              | [gofmt], [gofumpt], [goimports], [gokart], [golangci-lint], [golines], [semgrep]                                         |
-| GraphQL         | [graphql-schema-linter], [prettier]                                                                                      |
-| HAML            | [haml-lint]                                                                                                              |
-| HTML Templates  | [djlint]                                                                                                                 |
-| Java            | [google-java-format], [pmd], [semgrep]                                                                                   |
-| Javascript      | [biome], [deno], [eslint], [prettier], [rome], [semgrep]                                                                 |
-| JSON            | [biome], [deno], [eslint], [prettier], [semgrep]                                                                         |
-| Kotlin          | [detekt], [ktlint]                                                                                                       |
-| Kubernetes      | [kube-linter]                                                                                                            |
-| Lua             | [stylua]                                                                                                                 |
-| Markdown        | [deno], [markdownlint], [markdownlint-cli2], [markdown-link-check], [markdown-table-prettify], [prettier], [remark-lint] |
-| Nix             | [nixpkgs-fmt]                                                                                                            |
-| package.json    | [sort-package-json]                                                                                                      |
-| Perl            | [perlcritic], [perltidy]                                                                                                 |
-| PHP             | [php-cs-fixer], [phpstan]                                                                                                |
-| PNG             | [oxipng]                                                                                                                 |
-| PowerShell      | [psscriptanalyzer]                                                                                                       |
-| Prisma          | [prisma]                                                                                                                 |
-| Protobuf        | [buf] (breaking, lint, and format), [clang-format], [clang-tidy]                                                         |
-| Python          | [autopep8], [bandit], [black], [flake8], [isort], [mypy], [pylint], [pyright], [semgrep], [yapf], [ruff], [sourcery]     |
-| Rego            | [regal], [opa]                                                                                                           |
-| Renovate        | [renovate]                                                                                                               |
-| Ruby            | [brakeman], [rubocop], [rufo], [semgrep], [standardrb]                                                                   |
-| Rust            | [clippy], [rustfmt]                                                                                                      |
-| Scala           | [scalafmt]                                                                                                               |
-| Security        | [checkov], [dustilock], [nancy], [osv-scanner], [snyk], [tfsec], [trivy], [trufflehog], [terrascan]                      |
-| SQL             | [sqlfluff], [sqlfmt], [sql-formatter], [squawk]                                                                          |
-| SVG             | [svgo]                                                                                                                   |
-| Swift           | [stringslint], [swiftlint], [swiftformat]                                                                                |
-| Terraform       | [terraform] (validate and fmt), [checkov], [tflint], [tfsec], [terrascan], [tofu]                                        |
-| Terragrunt      | [terragrunt]                                                                                                             |
-| Textproto       | [txtpbfmt]                                                                                                               |
-| TOML            | [taplo]                                                                                                                  |
-| Typescript      | [deno], [eslint], [prettier], [rome], [semgrep]                                                                          |
-| YAML            | [prettier], [semgrep], [yamllint]                                                                                        |
+| Technology      | Linters                                                                                                                    |
+| --------------- | -------------------------------------------------------------------------------------------------------------------------- |
+| All             | [codespell], [cspell], [gitleaks], [git-diff-check], [pre-commit-hooks], [trunk-toolbox], [vale]                           |
+| Ansible         | [ansible-lint]                                                                                                             |
+| Apex            | [pmd]                                                                                                                      |
+| Bash            | [shellcheck], [shfmt]                                                                                                      |
+| Bazel, Starlark | [buildifier]                                                                                                               |
+| C, C++          | [clang-format], [clang-tidy], [include-what-you-use], [pragma-once]                                                        |
+| C#              | [dotnet-format]                                                                                                            |
+| CircleCI Config | [circleci]                                                                                                                 |
+| Cloudformation  | [cfnlint], [checkov]                                                                                                       |
+| CMake           | [cmake-format]                                                                                                             |
+| CSS, SCSS       | [stylelint], [prettier]                                                                                                    |
+| Cue             | [cue-fmt]                                                                                                                  |
+| Dart            | [dart]                                                                                                                     |
+| Docker          | [hadolint], [checkov]                                                                                                      |
+| Dotenv          | [dotenv-linter]                                                                                                            |
+| GitHub          | [actionlint]                                                                                                               |
+| Go              | [gofmt], [gofumpt], [goimports], [gokart], [golangci-lint], [golines], [semgrep]                                           |
+| GraphQL         | [graphql-schema-linter], [prettier]                                                                                        |
+| HAML            | [haml-lint]                                                                                                                |
+| HTML Templates  | [djlint]                                                                                                                   |
+| Java            | [google-java-format], [pmd], [semgrep]                                                                                     |
+| Javascript      | [biome], [deno], [eslint], [prettier], [rome], [semgrep]                                                                   |
+| JSON            | [biome], [deno], [eslint], [prettier], [semgrep]                                                                           |
+| Kotlin          | [detekt], [ktlint]                                                                                                         |
+| Kubernetes      | [kube-linter]                                                                                                              |
+| Lua             | [stylua]                                                                                                                   |
+| Markdown        | [deno], [markdownlint], [markdownlint-cli2], [markdown-link-check], [markdown-table-prettify], [prettier], [remark-lint]   |
+| Nix             | [nixpkgs-fmt]                                                                                                              |
+| package.json    | [sort-package-json]                                                                                                        |
+| Perl            | [perlcritic], [perltidy]                                                                                                   |
+| PHP             | [php-cs-fixer], [phpstan]                                                                                                  |
+| PNG             | [oxipng]                                                                                                                   |
+| PowerShell      | [psscriptanalyzer]                                                                                                         |
+| Prisma          | [prisma]                                                                                                                   |
+| Protobuf        | [buf] (breaking, lint, and format), [clang-format], [clang-tidy]                                                           |
+| Python          | [autopep8], [bandit], [black], [flake8], [isort], [mypy], [pylint], [pyright], [semgrep], [yapf], [ruff], [sourcery], [ty] |
path: README.md
user: login: gemini-code-assist[bot]
body: ![medium](https://img.shields.io/badge/priority-medium-yellow)

It appears that `sourcery` is also a linter, so it should be alphabetized with the other linters. Can you please move `ty` to the correct alphabetical position?
created_at: 2025-05-14T08:20:26Z
author_association: NONE
diff_hunk: @@ -0,0 +1,44 @@
+version: 0.1
+downloads:
+  - name: ty
+    version: 0.0.1-alpha.1
+    downloads:
+      - os:
+          linux: unknown-linux-gnu
+          macos: apple-darwin
+        cpu:
+          x86_64: x86_64
+          arm_64: aarch64
+        url: https://github.com/astral-sh/ty/releases/download/${version}/ty-${cpu}-${os}.tar.gz
+        strip_components: 1
+      - os:
+          windows: windows
+        cpu:
+          x86_64: x86_64
+        url: https://github.com/astral-sh/ty/releases/download/${version}/ty-x86_64-pc-windows-msvc.zip
+        strip_components: 1
+tools:
+  definitions:
+    - name: ty
+      download: ty
+      known_good_version: 0.0.1-alpha.1
+      shims: [ty]
+      health_checks:
+        - command: ty --version
+          parse_regex: ${semver}
+lint:
+  definitions:
+    - name: ty
+      files: [python, python-interface]
+      tools: [ty]
+      known_good_version: 0.0.1-alpha.1
+      suggest_if: never
path: linters/ty/plugin.yaml
user: login: gemini-code-assist[bot]
body: ![medium](https://img.shields.io/badge/priority-medium-yellow)

The `suggest_if: never` field indicates that Trunk should never suggest enabling this linter. Is this intentional? If so, please add a comment explaining why.
created_at: 2025-05-14T08:20:26Z
author_association: NONE
diff_hunk: @@ -0,0 +1,174 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`Testing linter ty test basic 1`] = `
+{
+  "issues": [
+    {
+      "code": "unresolved-import",
+      "column": "1",
+      "file": "test_data/basic.in.py",
+      "issueClass": "ISSUE_CLASS_EXISTING",
+      "level": "LEVEL_HIGH",
+      "line": "1",
+      "linter": "ty",
+      "message": "Module \`typing\` has no member \`Enum\`",
+      "targetType": "python",
+    },
+    {
+      "code": "revealed-type",
+      "column": "1",
+      "file": "test_data/basic.in.py",
+      "issueClass": "ISSUE_CLASS_EXISTING",
+      "level": "LEVEL_LOW",
+      "line": "15",
+      "linter": "ty",
+      "message": "Revealed type: \`Unknown | Literal[1, ""]\`",
+      "targetType": "python",
+    },
+    {
+      "code": "undefined-reveal",
+      "column": "1",
+      "file": "test_data/basic.in.py",
+      "issueClass": "ISSUE_CLASS_EXISTING",
+      "level": "LEVEL_MEDIUM",
+      "line": "15",
+      "linter": "ty",
+      "message": "\`reveal_type\` used without importing it",
+      "targetType": "python",
+    },
+    {
+      "code": "unresolved-reference",
+      "column": "1",
+      "file": "test_data/basic.in.py",
+      "issueClass": "ISSUE_CLASS_EXISTING",
+      "level": "LEVEL_HIGH",
+      "line": "24",
+      "linter": "ty",
+      "message": "Name \`ClassVar\` used when not defined",
+      "targetType": "python",
+    },
+    {
+      "code": "unresolved-attribute",
+      "column": "1",
+      "file": "test_data/basic.in.py",
+      "issueClass": "ISSUE_CLASS_EXISTING",
+      "level": "LEVEL_HIGH",
+      "line": "31",
+      "linter": "ty",
+      "message": "Attribute \`z\` can only be accessed on instances, not on the class object \`<class 'A'>\` itself.",
+      "targetType": "python",
+    },
+    {
+      "code": "invalid-return-type",
+      "column": "1",
+      "file": "test_data/basic.in.py",
+      "issueClass": "ISSUE_CLASS_EXISTING",
+      "level": "LEVEL_HIGH",
+      "line": "39",
+      "linter": "ty",
+      "message": "Function can implicitly return \`None\`, which is not assignable to return type \`bool\`",
+      "targetType": "python",
+    },
+    {
+      "code": "invalid-return-type",
+      "column": "1",
+      "file": "test_data/basic.in.py",
+      "issueClass": "ISSUE_CLASS_EXISTING",
+      "level": "LEVEL_HIGH",
+      "line": "5",
+      "linter": "ty",
+      "message": "Return type does not match returned value: Expected \`str\`, found \`int\`",
+      "targetType": "python",
+    },
+    {
+      "code": "revealed-type",
+      "column": "1",
+      "file": "test_data/basic.in.py",
+      "issueClass": "ISSUE_CLASS_EXISTING",
+      "level": "LEVEL_LOW",
+      "line": "50",
+      "linter": "ty",
+      "message": "Revealed type: \`int | None\`",
+      "targetType": "python",
+    },
+    {
+      "code": "undefined-reveal",
+      "column": "1",
+      "file": "test_data/basic.in.py",
+      "issueClass": "ISSUE_CLASS_EXISTING",
+      "level": "LEVEL_MEDIUM",
+      "line": "50",
+      "linter": "ty",
+      "message": "\`reveal_type\` used without importing it",
+      "targetType": "python",
+    },
+    {
+      "code": "unsupported-operator",
+      "column": "1",
+      "file": "test_data/basic.in.py",
+      "issueClass": "ISSUE_CLASS_EXISTING",
+      "level": "LEVEL_HIGH",
+      "line": "51",
+      "linter": "ty",
+      "message": "Operator \`+\` is unsupported between objects of type \`int | None\` and \`Literal[1]\`",
+      "targetType": "python",
+    },
+    {
+      "code": "revealed-type",
+      "column": "1",
+      "file": "test_data/basic.in.py",
+      "issueClass": "ISSUE_CLASS_EXISTING",
+      "level": "LEVEL_LOW",
+      "line": "53",
+      "linter": "ty",
+      "message": "Revealed type: \`int | None\`",
+      "targetType": "python",
+    },
+    {
+      "code": "undefined-reveal",
+      "column": "1",
+      "file": "test_data/basic.in.py",
+      "issueClass": "ISSUE_CLASS_EXISTING",
+      "level": "LEVEL_MEDIUM",
+      "line": "53",
+      "linter": "ty",
+      "message": "\`reveal_type\` used without importing it",
+      "targetType": "python",
+    },
+    {
+      "code": "unsupported-operator",
+      "column": "1",
+      "file": "test_data/basic.in.py",
+      "issueClass": "ISSUE_CLASS_EXISTING",
+      "level": "LEVEL_HIGH",
+      "line": "53",
+      "linter": "ty",
+      "message": "Operator \`+\` is unsupported between objects of type \`int | None\` and \`Literal[1]\`",
+      "targetType": "python",
+    },
+  ],
+  "lintActions": [
+    {
+      "command": "check",
+      "fileGroupName": "python",
+      "linter": "ty",
+      "paths": [
+        "test_data/basic.in.py",
+      ],
+      "verb": "TRUNK_VERB_CHECK",
+    },
+    {
+      "command": "check",
+      "fileGroupName": "python",
+      "linter": "ty",
+      "paths": [
+        "test_data/basic.in.py",
+      ],
+      "upstream": true,
+      "verb": "TRUNK_VERB_CHECK",
+    },
+  ],
+  "taskFailures": [],
+  "unformattedFiles": [],
+}
+`;
path: linters/ty/test_data/ty_v0.0.1-alpha.1_basic.check.shot
user: login: gemini-code-assist[bot]
body: ![medium](https://img.shields.io/badge/priority-medium-yellow)

The snapshot contains several issues related to `reveal_type` not being imported. Consider adding the necessary import statement to the test file to resolve these issues and improve the accuracy of the test.
created_at: 2025-05-14T08:20:26Z
author_association: NONE
diff_hunk: @@ -0,0 +1,64 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`Testing linter ty test interface 1`] = `
+{
+  "issues": [
+    {
+      "code": "unresolved-reference",
+      "column": "1",
+      "file": "test_data/interface.in.pyi",
+      "issueClass": "ISSUE_CLASS_EXISTING",
+      "level": "LEVEL_HIGH",
+      "line": "11",
+      "linter": "ty",
+      "message": "Name \`overload\` used when not defined",
+      "targetType": "python-interface",
+    },
+    {
+      "code": "unresolved-reference",
+      "column": "1",
+      "file": "test_data/interface.in.pyi",
+      "issueClass": "ISSUE_CLASS_EXISTING",
+      "level": "LEVEL_HIGH",
+      "line": "14",
+      "linter": "ty",
+      "message": "Name \`overload\` used when not defined",
+      "targetType": "python-interface",
+    },
+    {
+      "code": "unresolved-reference",
+      "column": "1",
+      "file": "test_data/interface.in.pyi",
+      "issueClass": "ISSUE_CLASS_EXISTING",
+      "level": "LEVEL_HIGH",
+      "line": "31",
+      "linter": "ty",
+      "message": "Name \`decorated\` used when not defined",
+      "targetType": "python-interface",
+    },
+  ],
+  "lintActions": [
+    {
+      "command": "check",
+      "fileGroupName": "python-interface",
+      "linter": "ty",
+      "paths": [
+        "test_data/interface.in.pyi",
+      ],
+      "verb": "TRUNK_VERB_CHECK",
+    },
+    {
+      "command": "check",
+      "fileGroupName": "python-interface",
+      "linter": "ty",
+      "paths": [
+        "test_data/interface.in.pyi",
+      ],
+      "upstream": true,
+      "verb": "TRUNK_VERB_CHECK",
+    },
+  ],
+  "taskFailures": [],
+  "unformattedFiles": [],
+}
+`;
path: linters/ty/test_data/ty_v0.0.1-alpha.1_interface.check.shot
user: login: gemini-code-assist[bot]
body: ![medium](https://img.shields.io/badge/priority-medium-yellow)

The snapshot contains several `unresolved-reference` issues. Consider adding the necessary definitions or imports to the test file to resolve these issues and improve the accuracy of the test.
created_at: 2025-05-14T08:20:26Z
author_association: NONE

PR comments:
user: login: trunk-staging-io[bot]
created_at: 2025-05-14T08:20:21Z
body: Code-Quality-on-PRs is deprecated and will soon be removed. Please see the [migration guide](https://docs.trunk.io/code-quality/setup-and-installation/prevent-new-issues/migration-guide) for more information.
author_association: NONE
user: login: trunk-staging-io[bot]
created_at: 2025-05-14T08:39:12Z
body: <!-- Trunk Test Analytics -->


[![Static Badge](https://raster.shields.io/badge/4_tests-ce1f8611-purple)](https://app.trunk-staging.io/trunk-staging-org/flaky-tests/pr/1028?repo=trunk-io/plugins&commitHash=ce1f8611b71b962f2a97f87ed3cf72f417307914&utm_source=gh-comment) &ensp; [![Static Badge](https://raster.shields.io/badge/0-failed-crimson)](https://app.trunk-staging.io/trunk-staging-org/flaky-tests/pr/1028?repo=trunk-io/plugins&commitHash=ce1f8611b71b962f2a97f87ed3cf72f417307914&utm_source=gh-comment&runConclusion=FAILURE) &ensp; [![Static Badge](https://raster.shields.io/badge/0-flaky-red)](https://app.trunk-staging.io/trunk-staging-org/flaky-tests/pr/1028?repo=trunk-io/plugins&commitHash=ce1f8611b71b962f2a97f87ed3cf72f417307914&utm_source=gh-comment&runConclusion=FAILURE) &ensp; [![Static Badge](https://raster.shields.io/badge/0-quarantined-yellow)](https://app.trunk-staging.io/trunk-staging-org/flaky-tests/pr/1028?repo=trunk-io/plugins&commitHash=ce1f8611b71b962f2a97f87ed3cf72f417307914&utm_source=gh-comment&runConclusion=QUARANTINED)


<sub>

[View Full Report ↗︎](https://app.trunk-staging.io/trunk-staging-org/flaky-tests/pr/1028?repo=trunk-io/plugins&commitHash=ce1f8611b71b962f2a97f87ed3cf72f417307914&utm_source=gh-comment) ⋅ [Docs](https://docs.trunk.io/flaky-tests?utm_source=gh-comment)

</sub>
author_association: NONE
user: login: trunk-io[bot]
created_at: 2025-05-14T08:48:27Z
body: <!-- Trunk Test Analytics -->


[![Static Badge](https://raster.shields.io/badge/4_tests-ce1f8611-purple)](https://app.trunk.io/trunk/flaky-tests/pr/1028?repo=trunk-io/plugins&commitHash=ce1f8611b71b962f2a97f87ed3cf72f417307914&utm_source=gh-comment) &ensp; [![Static Badge](https://raster.shields.io/badge/0-failed-crimson)](https://app.trunk.io/trunk/flaky-tests/pr/1028?repo=trunk-io/plugins&commitHash=ce1f8611b71b962f2a97f87ed3cf72f417307914&utm_source=gh-comment&runConclusion=FAILURE) &ensp; [![Static Badge](https://raster.shields.io/badge/0-flaky-red)](https://app.trunk.io/trunk/flaky-tests/pr/1028?repo=trunk-io/plugins&commitHash=ce1f8611b71b962f2a97f87ed3cf72f417307914&utm_source=gh-comment&runConclusion=FAILURE) &ensp; [![Static Badge](https://raster.shields.io/badge/0-quarantined-yellow)](https://app.trunk.io/trunk/flaky-tests/pr/1028?repo=trunk-io/plugins&commitHash=ce1f8611b71b962f2a97f87ed3cf72f417307914&utm_source=gh-comment&runConclusion=QUARANTINED)


<sub>

[View Full Report ↗︎](https://app.trunk.io/trunk/flaky-tests/pr/1028?repo=trunk-io/plugins&commitHash=ce1f8611b71b962f2a97f87ed3cf72f417307914&utm_source=gh-comment) ⋅ [Docs](https://docs.trunk.io/flaky-tests?utm_source=gh-comment)

</sub>
author_association: NONE
user: login: TylerJang27
created_at: 2025-05-14T19:44:29Z
body: It's possible this may need some pyright-like configuration
author_association: COLLABORATOR