# NousResearch/hermes-agent · Missing hermes_cli subpackage in wheel/packaging

## Open now

- Nothing open on GitHub.

Multiple bug reports and fix attempts center on hermes_cli subpackages (particularly dashboard_auth) being absent or misplaced in distributed wheels, causing ModuleNotFoundError when running the dashboard. Proposed fixes include packaging corrections, lazy imports, and pre-publish wheel verification.

## TL;DR

- 12 member(s): 0 open issue(s), 7 closed issue(s), 0 open PR(s), 1 merged PR(s), 4 PR(s) closed without merging.
- A fix was merged to main in PR #34811. Verify it addresses your case.
- **Recommended:** read PR #34811 (and any competing PRs below) before filing. Confirm the merged change covers your symptom.

## Maintainer resolution verdict

- Internal-tracker verdict over this cluster's issue members: `partially_resolved` · deciding PR(s): `pr-34811`. This is distinct from the fix status above. Weigh it yourself.

## How this cluster was grouped

- Link evidence (`STRUCTURAL_PARTIAL`): some members are connected by structural evidence (shared changed files, or a closing/superseded reference); the rest are joined by an automated relevance judgement over their text.
- Members outside that structural core may belong to a different underlying problem.
- Pairwise link density `0.16`: the share of member pairs that carry a link, counting a structural link in full and a relevance-only link at 0.36. `1.00` means every pair is linked.

## Closed / duplicate issues

- #33712: \[Bug\]: Hermes dashboard not working on NixOS (container)
- #34346: v0.15.1 wheel installs hermes_cli/dashboard_auth/ to wrong path → dashboard ModuleNotFoundError
- #34701: \[Bug\]: Dashboard fails after updating to 0.15.2: missing hermes_cli.dashboard_auth module
- #34857: \[Bug\]: Nix package missing hermes_cli.dashboard_auth, causing \`hermes dashboard\` to fail
- #36743: \[Bug\]: v0.15.2 wheel missing hermes_cli/dashboard_auth — dashboard crashes on startup
- #39631: Dashboard fails to start on v0.15.2: ModuleNotFoundError: No module named 'hermes_cli.dashboard_auth'
- #39674: bug: ModuleNotFoundError 'hermes_cli.dashboard_auth' when running  (PyPI install)

## Prior & competing PRs

- **#34505: fix(wheel): include hermes_cli subpackages in wheel build**. closed without merge · fix tier `suggested`
  - maintainer direction: category `superseded_by_pr`; implication `superseded`; refs `#27728`
  - _suggested-tier fix detail withheld; re-request with `?tier=all` to include it._
- **#34811: fix(packaging): ship hermes_cli subpackages in wheel**. merged to main · fix tier `verified`
  - maintainer direction: category `merged`; implication `superseded`
  - files: `pyproject.toml`, `tests/test_packaging_metadata.py`
  - fix hunks:
  - `pyproject.toml`

    ```diff
    @@ -237,7 +237,7 @@ plugins = [
     ]
     
     [tool.setuptools.packages.find]
    -include = ["agent", "agent.*", "tools", "tools.*", "hermes_cli", "gateway", "gateway.*", "tui_gateway", "tui_gateway.*", "cron", "acp_adapter", "plugins", "plugins.*", "providers", "providers.*"]
    +include = ["agent", "agent.*", "tools", "tools.*", "hermes_cli", "hermes_cli.*", "gateway", "gateway.*", "tui_gateway", "tui_gateway.*", "cron", "acp_adapter", "plugins", "plugins.*", "providers", "providers.*"]
     
     [tool.pytest.ini_options]
     testpaths = ["tests"]
    ```
  - `tests/test_packaging_metadata.py`

    ```diff
    @@ -1,10 +1,59 @@
     from pathlib import Path
     import tomllib
     
    +from setuptools import find_packages
    +
     
     REPO_ROOT = Path(__file__).resolve().parents[1]
     
     
    +def _packages_find_include():
    +    data = tomllib.loads((REPO_ROOT / "pyproject.toml").read_text(encoding="utf-8"))
    +    return data["tool"]["setuptools"]["packages"]["find"]["include"]
    +
    +
    +def test_every_on_disk_subpackage_is_covered_by_packages_find():
    +    """Regression test for #34701 (and the bug class behind #34034 / #28149).
    +
    +    ``[tool.setuptools.packages.find]`` ``include`` is hand-maintained. Every
    +    top-level package is listed twice — bare (``hermes_cli``) for the package
    +    itself and ``hermes_cli.*`` for its subpackages — EXCEPT when someone
    +    forgets the wildcard. v0.15.x listed ``hermes_cli`` without ``hermes_cli.*``,
    +    so the wheel shipped ``hermes_cli/*.py`` but dropped the ``dashboard_auth``
    +    and ``proxy`` subpackages. The dashboard then died on every install with
    +    ``ModuleNotFoundError: No module named 'hermes_cli.dashboard_auth'``.
    +
    +    This drives setuptools' own discovery against the live tree: every package
    +    that exists on disk and would be found by a permissive ``<name>.*`` scan
    +    must also be found by the actual ``include`` list. A subpackage added under
    +    any listed package without the matching wildcard fails here instead of in a
    +    user's container.
    +    """
    +    include = _packages_find_include()
    +
    +    # What the real include list actually selects.
    +    selected = set(find_packages(where=str(REPO_ROOT), include=include))
    +
    +    # Top-level packages we ship (bare names in the include list, no wildcard).
    +    top_level = sorted({name for name in include if "." not in name})
    +
    +    # For each shipped top-level package, every on-disk subpackage must be
    +    # covered by the include list.
    +    expected = set(
    +        find_packages(
    +            where=str(REPO_ROOT),
    +            include=[pattern for name in top_level for pattern in (name, f"{name}.*")],
    +        )
    +    )
    +
    +    missing = sorted(expected - selected)
    +    assert not missing, (
    +        "These packages exist on disk but are dropped from the wheel because "
    +        "[tool.setuptools.packages.find] include is missing a wildcard. Add the "
    +        f"matching '<name>.*' entry in pyproject.toml: {missing}"
    +    )
    +
    +
     def test_faster_whisper_is_not_a_base_dependency():
         data = tomllib.loads((REPO_ROOT / "pyproject.toml").read_text(encoding="utf-8"))
         deps = data["project"]["dependencies"]
    ```
- **#34717: fix(packaging): include hermes_cli subpackages in wheel build**. closed without merge
  - maintainer direction: category `duplicate_of`; implication `duplicate`; refs `#27728`
- **#37334: fix(packaging): verify wheel contents before PyPI publish to catch missing subpackages**. closed without merge
  - maintainer direction: category `uncategorized`; implication `needs_llm`; refs `#36743`
- **#39873: fix(dashboard): lazy-import dashboard_auth so PyPI install doesn't crash**. closed without merge
  - maintainer direction: category `silent_close`; implication `active`

## Fix status

- Merged to main in PR #34811 (cited above). No release data is tracked. Verify downstream.
- Fix last verified (merged) `2026-05-29`.
- Subsystem: `dashboard`
