fix(windows): sweep remaining bare read_text/write_text sites + linter rule

AST-driven pass over every Path.read_text()/write_text() without an
explicit encoding= across non-test code: 71 sites in 34 files
(skills_hub, hermes_cli/main+profiles+service_manager+container_boot,
mem0/hindsight/honcho plugins, achievements dashboard, release/CI
scripts, productivity+comfyui skill helpers, agent/*). Verified zero
positional-encoding collisions before insertion; per-file compile()
check after.

Adds a check-windows-footguns rule flagging bare single-line
read_text/write_text (multi-line forms stay covered by the AST guard
test from #38985). Together with the salvaged contributor commits this
retires the ~169-site bare file-I/O class (#37423's long tail).
This commit is contained in:
teknium1 2026-07-24 16:14:22 -07:00 committed by Teknium
parent adecb0d1a9
commit 75e0d52034
36 changed files with 103 additions and 75 deletions

View file

@ -81,7 +81,7 @@ def _is_memory_provider_dir(path: Path) -> bool:
if not init_file.exists():
return False
try:
source = init_file.read_text(errors="replace")[:8192]
source = init_file.read_text(errors="replace", encoding="utf-8")[:8192]
return "register_memory_provider" in source or "MemoryProvider" in source
except Exception:
return False

View file

@ -228,7 +228,7 @@ def _save_mem0_json(hermes_home: str, data: dict) -> None:
except Exception:
pass
existing.update(data)
config_path.write_text(json.dumps(existing, indent=2) + "\n")
config_path.write_text(json.dumps(existing, indent=2) + "\n", encoding="utf-8")
def _setup_platform(hermes_home: str, config: dict, flags: dict[str, str]) -> None:
@ -248,7 +248,7 @@ def _setup_platform(hermes_home: str, config: dict, flags: dict[str, str]) -> No
config_path = Path(hermes_home) / "mem0.json"
if config_path.exists():
try:
existing_config = json.loads(config_path.read_text())
existing_config = json.loads(config_path.read_text(encoding="utf-8"))
except Exception:
pass
@ -369,7 +369,7 @@ def _setup_selfhosted(hermes_home: str, config: dict, flags: dict[str, str]) ->
config_path = Path(hermes_home) / "mem0.json"
if config_path.exists():
try:
existing_config = json.loads(config_path.read_text())
existing_config = json.loads(config_path.read_text(encoding="utf-8"))
except Exception:
pass