You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
On Windows, hermes update fails its Python dependency step because the repo's pyproject.toml declares license = "MIT" (PEP 639 SPDX string form) while pinning setuptools>=77.0,<83 as the build backend — but every setuptools version in that range rejects the bare-string license = "MIT" form under strict PEP 639 validation. The editable build (uv pip install -e . / pip install -e .) dies with:
configuration error: `project.license` must be valid exactly by one definition (2 matches found):
- keys: 'file': {type: string} required: ['file']
- keys: 'text': {type: string} required: ['text']
GIVEN VALUE: "MIT"
This is a regression: two prior issues addressed the same area and the combined result is broken.
Regression context (please read before closing as duplicate)
fix(packaging): modernize project.license to PEP 639 SPDX string #38353 (closed 2026-06-03) switched license = { text = "MIT" } → license = "MIT" and raised the build-backend floor to setuptools>=77, on the belief that >=77 accepts the SPDX string form. It does not. setuptools 77–82 require either {text: "MIT"} or a PEP 639 SPDX expression config (plus license-files); the bare string "MIT" is rejected.
fix(build): upper-bound setuptools build requirement (#36620) #36661 (closed 2026-06-04) upper-bounded the build requirement to <83, "aligning with the dev dependency pin of setuptools==82.0.1." But 82.0.1 is itself in the rejecting range. So both fixes together land in a state where the declared license form is incompatible with the pinned backend.
Net effect: a clean venv (or the isolated build env uv creates during hermes update) cannot build hermes-agent at all. The build only succeeds when the venv happens to contain an older setuptools (<77) or a specifically-pinned 77.0.x, neither of which the current pyproject.toml guarantees.
Environment
Windows 10/11, git-based install at ~/.hermes/hermes-agent
Observed at commit 6997dc81 (0 commits behind origin/main, pulled 2026-07-14)
Venv Python 3.11.9; setuptools present at 65.5.0, but the isolated build env fetches setuptools 77–82 per build-system.requires
Run hermes update (or uv pip install -e . / pip install -e . in the repo root).
The dependency step fails with the project.license validation error above; hermes update then falls back to the ZIP path, which fails with WinError 5 Access denied because the running Desktop app / gateway workers hold .pyd files locked. The install is left half-updated.
Workaround (what we did to recover)
Pin setuptools to the one version in the range that still accepts the bare string, then build with --no-build-isolation:
This works because 77.0.3 accepts license = "MIT" as a (deprecated-but-valid) string, whereas 77.1+ rejects it. But it is fragile: the next hermes update re-fetches a fresh setuptools into an isolated build env and breaks again.
Suggested permanent fixes (any one resolves it)
Make the license form and the backend version consistent. Either:
Keep license = "MIT"and pin the build backend to setuptools==77.0.3 exactly (the last version accepting the bare string), or
Make hermes update's dependency step robust to this: when the editable build fails on project.license, fall back to a known-good setuptools pin rather than the ZIP path (which then hits the unrelated WinError 5 file-lock on Windows).
Summary
On Windows,
hermes updatefails its Python dependency step because the repo'spyproject.tomldeclareslicense = "MIT"(PEP 639 SPDX string form) while pinningsetuptools>=77.0,<83as the build backend — but every setuptools version in that range rejects the bare-stringlicense = "MIT"form under strict PEP 639 validation. The editable build (uv pip install -e ./pip install -e .) dies with:This is a regression: two prior issues addressed the same area and the combined result is broken.
Regression context (please read before closing as duplicate)
license = { text = "MIT" }→license = "MIT"and raised the build-backend floor tosetuptools>=77, on the belief that>=77accepts the SPDX string form. It does not. setuptools 77–82 require either{text: "MIT"}or a PEP 639 SPDX expression config (pluslicense-files); the bare string"MIT"is rejected.<83, "aligning with the dev dependency pin ofsetuptools==82.0.1." But 82.0.1 is itself in the rejecting range. So both fixes together land in a state where the declared license form is incompatible with the pinned backend.Net effect: a clean venv (or the isolated build env uv creates during
hermes update) cannot buildhermes-agentat all. The build only succeeds when the venv happens to contain an older setuptools (<77) or a specifically-pinned 77.0.x, neither of which the currentpyproject.tomlguarantees.Environment
~/.hermes/hermes-agent6997dc81(0 commits behindorigin/main, pulled 2026-07-14)setuptoolspresent at 65.5.0, but the isolated build env fetches setuptools 77–82 perbuild-system.requirespyproject.tomlrelevant lines:Repro
hermes update(oruv pip install -e ./pip install -e .in the repo root).project.licensevalidation error above;hermes updatethen falls back to the ZIP path, which fails withWinError 5 Access deniedbecause the running Desktop app / gateway workers hold.pydfiles locked. The install is left half-updated.Workaround (what we did to recover)
Pin setuptools to the one version in the range that still accepts the bare string, then build with
--no-build-isolation:venv\Scripts\python.exe -m pip install "setuptools==77.0.3" venv\Scripts\python.exe -m pip install -e . --no-build-isolationThis works because 77.0.3 accepts
license = "MIT"as a (deprecated-but-valid) string, whereas 77.1+ rejects it. But it is fragile: the nexthermes updatere-fetches a fresh setuptools into an isolated build env and breaks again.Suggested permanent fixes (any one resolves it)
license = "MIT"and pin the build backend tosetuptools==77.0.3exactly (the last version accepting the bare string), orlicense = { text = "MIT" }(which fix(packaging): modernize project.license to PEP 639 SPDX string #38353 deliberately moved away from) and keepsetuptools>=77, orlicense-filesand a setuptools that supports it (>=77, but the string form specifically needs care).pip install -e .) on a clean venv with the pinnedbuild-system.requires, so this regression is caught before release. The previous fixes (fix(packaging): modernize project.license to PEP 639 SPDX string #38353, fix(build): upper-bound setuptools build requirement (#36620) #36661) evidently were not validated against a real isolated build.hermes update's dependency step robust to this: when the editable build fails onproject.license, fall back to a known-good setuptools pin rather than the ZIP path (which then hits the unrelatedWinError 5file-lock on Windows).Related
license = "MIT"+setuptools>=77; introduced the incompatibility.<83aligning withsetuptools==82.0.1; 82.x also rejects the string form, so this cemented the break.uv pip install -e .exit 2 #59850 (open) — related but distinct: Windowshermes updatefailsuv pip install -e .with exit 2 atPROJECT_ROOT. That is a cwd/layout issue; this report is the setuptools/license validation issue. They may surface through the same update path but have different roots.Labels (suggested)
type/bugcomp/buildplatform/windowsregressionP2