diff --git a/CHANGELOG.md b/CHANGELOG.md index 437f032..8c797ae 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,7 @@ Contributors add user-facing entries under `[Unreleased]` in the same PR. Mainta ### Changed - **Skill (`finance/wallet_screening` v2.0.0):** Report schema v2 with `verdict` (`ALLOW` / `REVIEW` / `DENY`), deterministic `risk_level`, `risk_factors[]`, and hop-1 `indirect_exposures` / `risky_counterparties`. Dual-emits `summary.risk_flag` and `summary.total_transactions` for v1 hosts ([#439](https://github.com/ARPAHLS/skillware/issues/439) slice 2). +- **Typing:** `skillware/core/config.py` and `skillware/core/mail_config.py` are now type-clean and removed from the `[[tool.mypy.overrides]]` list, so `mypy skillware` checks them in CI (#415, Phase 2). ## [0.5.9] - 2026-10-20 diff --git a/pyproject.toml b/pyproject.toml index bb5c81a..0c0ec1f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -274,8 +274,6 @@ warn_unused_configs = true module = [ "skillware.cli", "skillware.core.loader", - "skillware.core.config", - "skillware.core.mail_config", ] ignore_errors = true diff --git a/skillware/core/config.py b/skillware/core/config.py index 8637a9c..3c0a2f9 100644 --- a/skillware/core/config.py +++ b/skillware/core/config.py @@ -249,7 +249,7 @@ def _merge_layers(layers: Sequence[ConfigLayer]) -> SkillwareConfig: mail = merge_mail_settings(mail_layers) evm = merge_evm_settings(evm_layers) - chains, chains_legacy = merge_chain_layers(layer.data for layer in layers) + chains, chains_legacy = merge_chain_layers([layer.data for layer in layers]) if chains_legacy: extra = {**extra, "chains": chains_legacy} diff --git a/skillware/core/mail_config.py b/skillware/core/mail_config.py index 9300f64..75297f4 100644 --- a/skillware/core/mail_config.py +++ b/skillware/core/mail_config.py @@ -857,7 +857,7 @@ def validate_addressbook_data(data: Mapping[str, Any]) -> List[str]: ) continue - if has_email: + if has_email and isinstance(emails, list): valid_email = False for entry in emails: if not isinstance(entry, str) or not _EMAIL_RE.match(entry.strip()): @@ -1087,7 +1087,7 @@ def clear_mail_signature_settings() -> List[Path]: for target in (project_config_write_path(), global_config_path()): if not target.is_file(): continue - document = _read_yaml(target) + document = dict(_read_yaml(target)) mail_block = document.get("mail") if not isinstance(mail_block, dict): continue