Metadata-Version: 2.4
Name: mordred-hermes
Version: 0.1.0a1
Summary: Privacy-preserving plugin bundle for the Hermes agent (NousResearch/hermes-agent)
Project-URL: Documentation, https://github.com/InternetMaximalism/mordred-hermes/tree/main/docs
Project-URL: Source, https://github.com/InternetMaximalism/mordred-hermes
Author: InternetMaximalism
License: MIT
Keywords: agent,hermes,keyvault,privacy,tor,vpn
Requires-Python: >=3.11
Requires-Dist: hermes-agent>=0.11.0
Requires-Dist: ruamel-yaml>=0.18
Provides-Extra: dev
Requires-Dist: mypy==2.1.0; extra == 'dev'
Requires-Dist: pytest-cov; extra == 'dev'
Requires-Dist: pytest>=8; extra == 'dev'
Requires-Dist: ruff==0.15.13; extra == 'dev'
Provides-Extra: ethereum
Requires-Dist: argon2-cffi>=23; extra == 'ethereum'
Requires-Dist: blake3>=0.4; extra == 'ethereum'
Requires-Dist: cryptography>=42; extra == 'ethereum'
Requires-Dist: eth-account>=0.13; extra == 'ethereum'
Requires-Dist: eth-hash[pycryptodome]>=0.5; extra == 'ethereum'
Requires-Dist: eth-keys>=0.6; extra == 'ethereum'
Requires-Dist: rlp>=4; extra == 'ethereum'
Provides-Extra: integration
Requires-Dist: aiohttp-socks>=0.10; extra == 'integration'
Requires-Dist: anthropic>=0.40; extra == 'integration'
Requires-Dist: boto3>=1.34; extra == 'integration'
Requires-Dist: google-genai>=1.20; extra == 'integration'
Requires-Dist: httpx[socks]>=0.27; extra == 'integration'
Requires-Dist: openai>=1.40; extra == 'integration'
Requires-Dist: requests[socks]>=2.32; extra == 'integration'
Provides-Extra: keyvault
Requires-Dist: argon2-cffi>=23; extra == 'keyvault'
Requires-Dist: blake3>=0.4; extra == 'keyvault'
Requires-Dist: cryptography>=42; extra == 'keyvault'
Provides-Extra: macos
Requires-Dist: argon2-cffi>=23; extra == 'macos'
Requires-Dist: blake3>=0.4; extra == 'macos'
Requires-Dist: cryptography>=42; extra == 'macos'
Requires-Dist: pyobjc-framework-quartz>=10.0; extra == 'macos'
Requires-Dist: pyobjc-framework-security>=10.0; extra == 'macos'
Requires-Dist: pyobjc-framework-systemconfiguration>=10.0; extra == 'macos'
Provides-Extra: messaging
Requires-Dist: qrcode>=7.4; extra == 'messaging'
Provides-Extra: tor-control
Requires-Dist: stem<2,>=1.8.0; extra == 'tor-control'
Description-Content-Type: text/markdown

# mordred-hermes

Privacy-preserving plugin bundle for the [Hermes agent](https://github.com/NousResearch/hermes-agent).

Five plugins exposed via the `hermes_agent.plugins` entry-point group:

- `mordred_privacy_check` — skill metadata enforcement, audit logging
- `mordred_wizard` — `hermes mordred …` CLI surface
- `mordred_llm_guard` — strict-mode local LLM enforcement
- `mordred_network` — Tor / VPN / Clearnet path management
- `mordred_keyvault` — Secure Enclave-backed key management (macOS, optional)

## Status

Active alpha (`0.1.0a0`). The five entry-point plugins are implemented beyond
the original Phase 0 scaffold; the default unit suite is intended to stay
hermetic, while hardware- and network-mutating checks remain opt-in.

See `docs/dev/` for SPEC, PLAN, TODO, PATHS, MIGRATION, UPSTREAM, CI, and `docs/user/` for QUICKSTART and USAGE.

## Validation

Default local checks:

```sh
UV_CACHE_DIR=/tmp/uv-cache uv run ruff check src tests
HERMES_HOME=/private/tmp/hermes-mordred-test-home UV_CACHE_DIR=/tmp/uv-cache uv run pytest -q
```

Manual live-device validation was reported successful on 2026-05-25 for the
hardware/network-gated suites that are excluded from default PR CI:

```sh
MORDRED_KEYVAULT_LIVE=1 pytest -m integration tests/integration/test_keyvault_macos.py -v
MORDRED_LIVE_VPN_TEST=1 MORDRED_MULLVAD_ACCOUNT=... pytest -m integration tests/integration/test_vpn.py -v
```

The Tor path is covered separately by the hermetic Docker-based
`integration-tor` CI job.

## Install (PyPI)

Published on [PyPI](https://pypi.org/project/mordred-hermes/) since `0.1.0a0`
(2026-07-08). Install into the **same environment as `hermes-agent`** so the
entry-point plugins are visible to its loader:

```sh
~/.hermes/hermes-agent/venv/bin/pip install mordred-hermes==0.1.0a0
```

Pin the version explicitly (or pass `--pre`): every release is currently a
pre-release, so an unpinned `pip install mordred-hermes` resolves the latest
alpha only via pip's all-prereleases fallback.

Platform extras are opt-in, e.g. `mordred-hermes[macos]` for the Secure
Enclave keyvault on Apple Silicon. Then enable the plugins in
`~/.hermes/config.yaml` as shown below.

## Install (development)

```sh
# From this repo's root
uv pip install --python ~/.hermes/hermes-agent/venv/bin/python3 -e .
```

Verify discovery:

```sh
~/.hermes/hermes-agent/venv/bin/hermes plugins list   # Hermes ≥0.18: shows the five mordred_* rows with source `entrypoint`
```

or, on any supported Hermes version (≥0.11.0):

```sh
~/.hermes/hermes-agent/venv/bin/python3 -c "
from hermes_cli.plugins import PluginManager
mgr = PluginManager(); mgr.discover_and_load(force=True)
print(sorted(k for k, p in mgr._plugins.items() if p.manifest.source == 'entrypoint'))
"
# → ['mordred_keyvault', 'mordred_llm_guard', 'mordred_network', 'mordred_privacy_check', 'mordred_wizard']
```

Version notes (verified against hermes-agent 0.18.2, 2026-07-08):

- `hermes plugins list` displays entry-point plugins on 0.18.2. On Hermes 0.11.0 it did **not** (it only scanned `<repo>/plugins/` and `~/.hermes/plugins/` directories) — the Python snippet above is the fallback check for older versions.
- `hermes mordred ...` subcommands are still **not** wired into Hermes's argparse, even on 0.18.2. Use the standalone `hermes-mordred` console script (same subcommand tree) until upstream wires entry-point CLI commands.

To enable, edit `~/.hermes/config.yaml`:

```yaml
plugins:
  enabled:
    - mordred_privacy_check
    - mordred_wizard
    - mordred_llm_guard
    - mordred_network
    - mordred_keyvault
```

For Phase 4 (`mordred_keyvault`) on macOS Apple Silicon:

```sh
uv pip install --python ~/.hermes/hermes-agent/venv/bin/python3 -e ".[macos]"
```
