block because tab switching is unavailable; the [code-group adapter](.vitepress/code-groups.ts) and its [focused tests](tests/code-groups.spec.ts) own this behavior.
Long tables with at least ten data rows receive independent text
268k3mo agoReviewMountCreate a free account to mount
CHILD_ENV_MARKER` valued as the fenced Kanban board root, not a bare flag.
## Tests
Loop/phase tests go in `tests/agent/`; patch the binding the phase actually reads (siblings often
`from
No other project uses it yet
259k31d agoReviewMountCreate a free account to mount
refactors; extending before duplicating (3+ PRs in one category → an ABC +
orchestrator); behaviour-contract tests; E2E with real imports against a temp `HERMES_HOME` for
resolution, config, security
Steady3 mentions in 2 weeks
No other project uses it yet
259k31d agoReviewMountCreate a free account to mount
root, so a child working against a scratch `HERMES_HOME` keeps a writable board.
## Tests
`tests/cron/`, `tests/hermes_cli/test_kanban*.py`, `tests/tools/test_kanban*.py`. Schedule parsing
and catch-up windows are pure functions — test
259k31d agoReviewMountCreate a free account to mount
exists. A sealed native stream is a
regular message — `chat.update` works (live-verified).
Contract tests: `tests/gateway/test_stream_final_contract.py` (mutation-checked). Slack ground
truth: `chat.*Stream` speaks STANDARD markdown, not mrkdwn; `stopStream.markdown_text
259k31d agoReviewMountCreate a free account to mount
ROOT_KEYS`). For a new
key: `rg -n '" "' hermes_cli/config_defaults.py` AND `rg -n ' ' --glob '!tests' .` both hit,
and one invariant test sets it in a temp `config.yaml` and asserts
259k31d agoReviewMountCreate a free account to mount
process warning, documented replacement + migration note, ≥ 2 subsequent
minor releases before removal.
- Compat tests load **frozen plugins through the real discovery path** and assert outcomes — never
exact registry/catalog counts, source
259k31d agoReviewMountCreate a free account to mount
plugin
may move a transitive core package within core's declared ranges
(`tests/pm/test_workspace_build_inputs.py::test_plugin_can_move_compatible_transitive_but_not_exact_requirement`).
Plugin `python_dependencies` follow the plugin
Steady3 mentions in 2 weeks
No other project uses it yet
259k31d agoReviewMountCreate a free account to mount
every call — ship a helper script and reference it by skill-relative path.
7. **Tests at `tests/skills/test_ _skill.py`**, stdlib + pytest + `unittest.mock` only, no
live network. Run `scripts/run_tests.sh tests/skills/test_ _skill.py
Steady3 mentions in 2 weeks
No other project uses it yet
259k31d agoReviewMountCreate a free account to mount
tests/ — how Hermes tests are written and run
Applies on top of the root `AGENTS.md`. Read it before adding or changing any test.
## Running tests
**ALWAYS use `scripts/run_tests.sh`**, never bare
No other project uses it yet
259k31d agoReviewMountCreate a free account to mount
skills, terminal, todo,
tts, video, vision, web, yuanbao` (don't assert the list in tests). Per-platform enable/disable via
`hermes tools` (curses) or `tools. .enabled/disabled` in config.yaml. `browser_exec
259k31d agoReviewMountCreate a free account to mount
import; the dispatcher rejects unknown param keys
(`4000` + key path) and, under `HERMES_TEST_ISOLATION=1`, raises `ContractViolation` when a handler's
result or an emitted payload does not match
259k31d agoReviewMountCreate a free account to mount
surface; a new surface is a new `web_routers/ .py`, not a growing
`web_server.py`.
- Tests: Python in `tests/hermes_cli/` (routers, pty bridge); JS in the `web/` vitest suite. Python
tests must
259k31d agoReviewMountCreate a free account to mount
change code and its doctests in the same PR.** If you're only
updating tests, say so and touch nothing else.
## Code conventions (enforced by CI)
- **Formatting & linting:** `ruff
No other project uses it yet
226k3y agoReviewMountCreate a free account to mount
origin/dev`, target PRs at `dev`, and diff against `origin/dev` unless told otherwise.
## Live TUI Testing
- Run `bun run dev:live` from a development worktree to test its TUI against
224k15d agoReviewMountCreate a free account to mount
Essential Commands
For routine pre-commit checks, follow [Verify changes](#verify-changes).
For focused tests, use `pnpm agent:test` or `pnpm agent:playwright`.
Pass test files and worker limits after
209k7d agoReviewMountCreate a free account to mount
here are the general steps you should take:
1. Write some end-to-end tests that assert your win conditions, if they don't already exist
- 1 happy path (more
Steady20 mentions in 2 weeks
No other project uses it yet
198k17mo agoReviewMountCreate a free account to mount