diff --git a/commitizen/__init__.py b/commitizen/__init__.py
index f16def444..6db9e6e7d 100644
--- a/commitizen/__init__.py
+++ b/commitizen/__init__.py
@@ -1,7 +1,7 @@
 import logging
 import logging.config
 
-from colorama import init  # type: ignore
+from colorama import init
 
 from commitizen.cz.base import BaseCommitizen
 
diff --git a/commitizen/commands/bump.py b/commitizen/commands/bump.py
index ba252fcf2..2a84483c9 100644
--- a/commitizen/commands/bump.py
+++ b/commitizen/commands/bump.py
@@ -331,14 +331,14 @@ def __call__(self) -> None:
                 "dry_run": dry_run,
             }
             if self.changelog_to_stdout:
-                changelog_cmd = Changelog(self.config, {**args, "dry_run": True})  # type: ignore
+                changelog_cmd = Changelog(self.config, {**args, "dry_run": True})  # type: ignore[typeddict-item]
                 try:
                     changelog_cmd()
                 except DryRunExit:
                     pass
 
             args["file_name"] = self.file_name
-            changelog_cmd = Changelog(self.config, args)  # type: ignore
+            changelog_cmd = Changelog(self.config, args)  # type: ignore[arg-type]
             changelog_cmd()
             files.append(changelog_cmd.file_name)
 
diff --git a/commitizen/commands/changelog.py b/commitizen/commands/changelog.py
index 8ca36bdb9..dc50eb3ad 100644
--- a/commitizen/commands/changelog.py
+++ b/commitizen/commands/changelog.py
@@ -177,8 +177,8 @@ def _write_changelog(
     def _export_template(self) -> None:
         tpl = changelog.get_changelog_template(self.cz.template_loader, self.template)
         # TODO: fix the following type ignores
-        src = Path(tpl.filename)  # type: ignore
-        Path(self.export_template_to).write_text(src.read_text())  # type: ignore
+        src = Path(tpl.filename)  # type: ignore[arg-type]
+        Path(self.export_template_to).write_text(src.read_text())  # type: ignore[arg-type]
 
     def __call__(self) -> None:
         commit_parser = self.cz.commit_parser
diff --git a/commitizen/config/base_config.py b/commitizen/config/base_config.py
index 59c0d16a0..4b8f5f05f 100644
--- a/commitizen/config/base_config.py
+++ b/commitizen/config/base_config.py
@@ -27,7 +27,7 @@ def settings(self) -> Settings:
 
     @property
     def path(self) -> Path:
-        return self._path  # type: ignore
+        return self._path  # type: ignore[return-value]
 
     @path.setter
     def path(self, path: str | Path) -> None:
diff --git a/commitizen/config/toml_config.py b/commitizen/config/toml_config.py
index 3571c9c88..2164d3f99 100644
--- a/commitizen/config/toml_config.py
+++ b/commitizen/config/toml_config.py
@@ -37,7 +37,7 @@ def init_empty_config_content(self) -> None:
         with open(self.path, "wb") as output_toml_file:
             if parser.get("tool") is None:
                 parser["tool"] = table()
-            parser["tool"]["commitizen"] = table()  # type: ignore
+            parser["tool"]["commitizen"] = table()  # type: ignore[index]
             output_toml_file.write(parser.as_string().encode(self.encoding))
 
     def set_key(self, key: str, value: Any) -> Self:
@@ -49,7 +49,7 @@ def set_key(self, key: str, value: Any) -> Self:
         with open(self.path, "rb") as f:
             parser = parse(f.read())
 
-        parser["tool"]["commitizen"][key] = value  # type: ignore
+        parser["tool"]["commitizen"][key] = value  # type: ignore[index]
         with open(self.path, "wb") as f:
             f.write(parser.as_string().encode(self.encoding))
         return self
@@ -68,6 +68,6 @@ def _parse_setting(self, data: bytes | str) -> None:
             raise InvalidConfigurationError(f"Failed to parse {self.path}: {e}")
 
         try:
-            self.settings.update(doc["tool"]["commitizen"])  # type: ignore
+            self.settings.update(doc["tool"]["commitizen"])  # type: ignore[index,typeddict-item] # TODO: fix this
         except exceptions.NonExistentKey:
             self.is_empty_config = True
diff --git a/commitizen/cz/customize/__init__.py b/commitizen/cz/customize/__init__.py
index c5af001a7..0aedb9337 100644
--- a/commitizen/cz/customize/__init__.py
+++ b/commitizen/cz/customize/__init__.py
@@ -1 +1 @@
-from .customize import CustomizeCommitsCz  # noqa
+from .customize import CustomizeCommitsCz  # noqa: F401
diff --git a/commitizen/cz/customize/customize.py b/commitizen/cz/customize/customize.py
index d6e9f9a5c..dde268549 100644
--- a/commitizen/cz/customize/customize.py
+++ b/commitizen/cz/customize/customize.py
@@ -48,12 +48,12 @@ def __init__(self, config: BaseConfig) -> None:
                 setattr(self, attr_name, value)
 
     def questions(self) -> list[CzQuestion]:
-        return self.custom_settings.get("questions", [{}])  # type: ignore
+        return self.custom_settings.get("questions", [{}])  # type: ignore[return-value]
 
     def message(self, answers: Mapping[str, Any]) -> str:
         message_template = Template(self.custom_settings.get("message_template", ""))
         if getattr(Template, "substitute", None):
-            return message_template.substitute(**answers)  # type: ignore
+            return message_template.substitute(**answers)  # type: ignore[attr-defined,no-any-return] # pragma: no cover # TODO: check if we can fix this
         return message_template.render(**answers)
 
     def example(self) -> str:
diff --git a/commitizen/providers/base_provider.py b/commitizen/providers/base_provider.py
index 27c312341..c91bfdae2 100644
--- a/commitizen/providers/base_provider.py
+++ b/commitizen/providers/base_provider.py
@@ -86,7 +86,7 @@ def set_version(self, version: str) -> None:
         self.file.write_text(tomlkit.dumps(document))
 
     def get(self, document: tomlkit.TOMLDocument) -> str:
-        return document["project"]["version"]  # type: ignore
+        return document["project"]["version"]  # type: ignore[index,return-value]
 
     def set(self, document: tomlkit.TOMLDocument, version: str) -> None:
-        document["project"]["version"] = version  # type: ignore
+        document["project"]["version"] = version  # type: ignore[index]
diff --git a/commitizen/providers/cargo_provider.py b/commitizen/providers/cargo_provider.py
index 87e45cd71..d453a4aa5 100644
--- a/commitizen/providers/cargo_provider.py
+++ b/commitizen/providers/cargo_provider.py
@@ -23,18 +23,18 @@ def lock_file(self) -> Path:
 
     def get(self, document: tomlkit.TOMLDocument) -> str:
         try:
-            return document["package"]["version"]  # type: ignore
+            return document["package"]["version"]  # type: ignore[index,return-value]
         except tomlkit.exceptions.NonExistentKey:
             ...
-        return document["workspace"]["package"]["version"]  # type: ignore
+        return document["workspace"]["package"]["version"]  # type: ignore[index,return-value]
 
     def set(self, document: tomlkit.TOMLDocument, version: str) -> None:
         try:
-            document["workspace"]["package"]["version"] = version  # type: ignore
+            document["workspace"]["package"]["version"] = version  # type: ignore[index]
             return
         except tomlkit.exceptions.NonExistentKey:
             ...
-        document["package"]["version"] = version  # type: ignore
+        document["package"]["version"] = version  # type: ignore[index]
 
     def set_version(self, version: str) -> None:
         super().set_version(version)
@@ -44,9 +44,9 @@ def set_version(self, version: str) -> None:
     def set_lock_version(self, version: str) -> None:
         cargo_toml_content = tomlkit.parse(self.file.read_text())
         try:
-            package_name = cargo_toml_content["package"]["name"]  # type: ignore
+            package_name = cargo_toml_content["package"]["name"]  # type: ignore[index]
         except tomlkit.exceptions.NonExistentKey:
-            package_name = cargo_toml_content["workspace"]["package"]["name"]  # type: ignore
+            package_name = cargo_toml_content["workspace"]["package"]["name"]  # type: ignore[index]
 
         cargo_lock_content = tomlkit.parse(self.lock_file.read_text())
         packages: tomlkit.items.AoT = cargo_lock_content["package"]  # type: ignore[assignment]
diff --git a/commitizen/providers/commitizen_provider.py b/commitizen/providers/commitizen_provider.py
index 7ce177a60..d9207b19f 100644
--- a/commitizen/providers/commitizen_provider.py
+++ b/commitizen/providers/commitizen_provider.py
@@ -9,7 +9,7 @@ class CommitizenProvider(VersionProvider):
     """
 
     def get_version(self) -> str:
-        return self.config.settings["version"]  # type: ignore
+        return self.config.settings["version"]  # type: ignore[return-value] # TODO: check if we can fix this by tweaking the `Settings` type
 
     def set_version(self, version: str) -> None:
         self.config.set_key("version", version)
diff --git a/commitizen/providers/poetry_provider.py b/commitizen/providers/poetry_provider.py
index 1dd33f053..f63b13b79 100644
--- a/commitizen/providers/poetry_provider.py
+++ b/commitizen/providers/poetry_provider.py
@@ -13,7 +13,7 @@ class PoetryProvider(TomlProvider):
     filename = "pyproject.toml"
 
     def get(self, pyproject: tomlkit.TOMLDocument) -> str:
-        return pyproject["tool"]["poetry"]["version"]  # type: ignore
+        return pyproject["tool"]["poetry"]["version"]  # type: ignore[index,return-value]
 
     def set(self, pyproject: tomlkit.TOMLDocument, version: str) -> None:
-        pyproject["tool"]["poetry"]["version"] = version  # type: ignore
+        pyproject["tool"]["poetry"]["version"] = version  # type: ignore[index]
diff --git a/commitizen/version_schemes.py b/commitizen/version_schemes.py
index a59d3c0aa..e9f99c551 100644
--- a/commitizen/version_schemes.py
+++ b/commitizen/version_schemes.py
@@ -266,7 +266,7 @@ def bump(
 
         if self.local and is_local_version:
             local_version = self.scheme(self.local).bump(increment)
-            return self.scheme(f"{self.public}+{local_version}")  # type: ignore
+            return self.scheme(f"{self.public}+{local_version}")  # type: ignore[return-value]
 
         base = self._get_increment_base(increment, exact_increment)
         dev_version = self.generate_devrelease(devrelease)
@@ -283,7 +283,7 @@ def bump(
         # TODO: post version
         return self.scheme(
             f"{base}{pre_version}{dev_version}{self.generate_build_metadata(build_metadata)}"
-        )  # type: ignore
+        )  # type: ignore[return-value]
 
     def _get_increment_base(
         self, increment: Increment | None, exact_increment: bool
diff --git a/poetry.lock b/poetry.lock
index f9f74513a..c5c893931 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -1746,6 +1746,18 @@ files = [
 docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"]
 test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<8.2)", "pytest-mock", "pytest-mypy-testing"]
 
+[[package]]
+name = "types-colorama"
+version = "0.4.15.20240311"
+description = "Typing stubs for colorama"
+optional = false
+python-versions = ">=3.8"
+groups = ["linters"]
+files = [
+    {file = "types-colorama-0.4.15.20240311.tar.gz", hash = "sha256:a28e7f98d17d2b14fb9565d32388e419f4108f557a7d939a66319969b2b99c7a"},
+    {file = "types_colorama-0.4.15.20240311-py3-none-any.whl", hash = "sha256:6391de60ddc0db3f147e31ecb230006a6823e81e380862ffca1e4695c13a0b8e"},
+]
+
 [[package]]
 name = "types-deprecated"
 version = "1.2.15.20250304"
@@ -2014,4 +2026,4 @@ type = ["pytest-mypy"]
 [metadata]
 lock-version = "2.1"
 python-versions = ">=3.9,<4.0"
-content-hash = "10e298e9b4d2f2d81a82b43649a68d557ed3e9824b3b210b5b6a607935f9fe9d"
+content-hash = "f35cf57718e28836cf1e70b33edab9ce623b01a7f2d31d712585554721f6d403"
diff --git a/pyproject.toml b/pyproject.toml
index ee0ecc9ce..a2c9b505d 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -126,6 +126,7 @@ types-deprecated = "^1.2.9.2"
 types-python-dateutil = "^2.8.19.13"
 types-PyYAML = ">=5.4.3,<7.0.0"
 types-termcolor = "^0.1.1"
+types-colorama = "^0.4.15.20240311"
 
 [tool.poetry.group.documentation.dependencies]
 mkdocs = "^1.4.2"
@@ -198,6 +199,9 @@ select = [
     "UP",
     # isort
     "I",
+    # pygrep-hooks
+    "PGH003",
+    "PGH004",
     # unsorted-dunder-all
     "RUF022",
     # unused-noqa
@@ -238,16 +242,10 @@ poetry_command = ""
 
 [tool.poe.tasks]
 format.help = "Format the code"
-format.sequence = [
-    { cmd = "ruff check --fix" },
-    { cmd = "ruff format" },
-]
+format.sequence = [{ cmd = "ruff check --fix" }, { cmd = "ruff format" }]
 
 lint.help = "Lint the code"
-lint.sequence = [
-    { cmd = "ruff check" },
-    { cmd = "mypy" },
-]
+lint.sequence = [{ cmd = "ruff check" }, { cmd = "mypy" }]
 
 check-commit.help = "Check the commit message"
 check-commit.cmd = "cz -nr 3 check --rev-range origin/master.."
diff --git a/tests/commands/test_bump_command.py b/tests/commands/test_bump_command.py
index 64b810e4d..59297b172 100644
--- a/tests/commands/test_bump_command.py
+++ b/tests/commands/test_bump_command.py
@@ -1721,7 +1721,7 @@ def test_is_initial_tag(mocker: MockFixture, tmp_commitizen_project):
         "extras": None,
     }
 
-    bump_cmd = bump.Bump(config, arguments)  # type: ignore
+    bump_cmd = bump.Bump(config, arguments)  # type: ignore[arg-type]
 
     # Test case 1: No current tag, not yes mode
     mocker.patch("questionary.confirm", return_value=mocker.Mock(ask=lambda: True))