Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
5f1891f
password support (#12)
JarbasAl Jun 15, 2023
a8dbbd2
fix entrypoint
JarbasAl Jun 16, 2023
4d00946
automations
JarbasAl Aug 3, 2023
09eab2f
Increment Version
JarbasAl Aug 3, 2023
e2c8d35
Add renovate.json (#16)
renovate[bot] Dec 19, 2025
010d737
feat: modernize CI to gh-automations@dev and add ACL e2e tests (#24)
JarbasAl Jun 5, 2026
8a237bd
Increment Version to 0.5.0a3
JarbasAl Jun 5, 2026
1d24129
Update Changelog
JarbasAl Jun 5, 2026
84bb0dc
Update dependency hivescope to v0.3.0a3 (#26)
renovate[bot] Jun 5, 2026
0dc6029
Increment Version to 0.5.0a4
JarbasAl Jun 5, 2026
555d37b
Update Changelog
JarbasAl Jun 5, 2026
aaab60a
fix(deps): require ovos-bus-client>=2.0.0a3 (avoid the bundled hivemi…
JarbasAl Jun 6, 2026
7aaac6e
Increment Version to 0.5.1a1
JarbasAl Jun 6, 2026
919499a
Update Changelog
JarbasAl Jun 6, 2026
e5ba54e
feat!: modernize onto the HiveMind bus-client 2.x stack (#30)
JarbasAl Jun 25, 2026
0245ffb
Increment Version to 1.0.0a1
JarbasAl Jun 25, 2026
d319ae9
Update Changelog
JarbasAl Jun 25, 2026
f28a11c
docs: rewrite README in Simplified Technical English (#32)
JarbasAl Jul 30, 2026
bb0def1
Increment Version to 1.0.0a2
JarbasAl Jul 30, 2026
b05c35a
Update Changelog
JarbasAl Jul 30, 2026
d9a317b
docs: correct claims that no longer match the code (#34)
JarbasAl Aug 10, 2026
4442996
Increment Version to 1.0.0a3
JarbasAl Aug 10, 2026
eda08bd
Update Changelog
JarbasAl Aug 10, 2026
3b91503
docs: add AGENTS.md with per-repo agent conventions (#36)
JarbasAl Aug 15, 2026
fd9220b
Increment Version to 1.0.0a4
JarbasAl Aug 15, 2026
0549c60
Update Changelog
JarbasAl Aug 15, 2026
b659aa5
fix(deps): raise floor pins to the proven-working HiveMind stack; dro…
JarbasAl Sep 1, 2026
331c6da
Increment Version to 1.0.1a1
JarbasAl Sep 1, 2026
3f75e1a
Update Changelog
JarbasAl Sep 1, 2026
80c413b
docs: curses-unavailable fallback prints a warning, is not silent (#40)
JarbasAl Sep 7, 2026
384e21d
Increment Version to 1.0.1a2
JarbasAl Sep 7, 2026
0a712e3
Update Changelog
JarbasAl Sep 7, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/FUNDING.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
liberapay: jarbasAI
33 changes: 12 additions & 21 deletions .github/workflows/build_tests.yml
Original file line number Diff line number Diff line change
@@ -1,25 +1,16 @@
name: Run Build Tests
name: Build Tests

on:
push:
pull_request:
branches: [dev, master]
workflow_dispatch:

jobs:
build_tests:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
with:
ref: ${{ github.head_ref }}
- name: Setup Python
uses: actions/setup-python@v1
with:
python-version: 3.8
- name: Install Build Tools
run: |
python -m pip install build wheel
- name: Build Distribution Packages
run: |
python setup.py bdist_wheel
- name: Install package
run: |
pip install .
build:
uses: OpenVoiceOS/gh-automations/.github/workflows/build-tests.yml@dev
with:
python_versions: '["3.10", "3.11", "3.12", "3.13"]'
# the [e2e] extra pins the full bus-client 2.x stack (hivescope, hivemind-core,
# policy plugins) as prerelease floors — no pre_install_pip / --pre needed
install_extras: 'e2e'
test_path: 'tests/'
10 changes: 10 additions & 0 deletions .github/workflows/conventional-label.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# auto add labels to PRs
on:
pull_request_target:
types: [ opened, edited ]
name: conventional-release-labels
jobs:
label:
runs-on: ubuntu-latest
steps:
- uses: bcoe/conventional-release-labels@v1
16 changes: 16 additions & 0 deletions .github/workflows/coverage.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
name: Code Coverage

on:
pull_request:
branches: [dev]
workflow_dispatch:

jobs:
coverage:
uses: OpenVoiceOS/gh-automations/.github/workflows/coverage.yml@dev
with:
python_version: '3.11'
coverage_source: 'hivemind_cli_terminal'
test_path: 'tests/'
test_extras: 'e2e'
min_coverage: 0
42 changes: 11 additions & 31 deletions .github/workflows/license_tests.yml
Original file line number Diff line number Diff line change
@@ -1,35 +1,15 @@
name: Run License Tests
name: License Check

on:
push:
pull_request:
branches: [dev]
workflow_dispatch:

jobs:
license_tests:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
with:
ref: ${{ github.head_ref }}
- name: Setup Python
uses: actions/setup-python@v1
with:
python-version: 3.8
- name: Install Build Tools
run: |
python -m pip install build wheel
- name: Install System Dependencies
run: |
sudo apt-get update
sudo apt install python3-dev swig libssl-dev
- name: Install core repo
run: |
pip install .
- name: Install licheck
run: |
pip install git+https://github.com/NeonJarbas/lichecker
- name: Install test dependencies
run: |
pip install pytest pytest-timeout pytest-cov
- name: Test Licenses
run: |
pytest test/license_tests.py
license_check:
uses: OpenVoiceOS/gh-automations/.github/workflows/license-check.yml@dev
with:
# orjson (Apache+MIT+MPL-2.0) is a transitive dep flagged WeakCopyleft because
# the action checks categories before the MPL exclude-license pattern fires.
# MPL-2.0 is file-level copyleft and safe to use as a library.
warn_only: true
13 changes: 13 additions & 0 deletions .github/workflows/lint.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
name: Lint

on:
pull_request:
branches: [dev, master]
workflow_dispatch:

jobs:
lint:
uses: OpenVoiceOS/gh-automations/.github/workflows/lint.yml@dev
with:
ruff: true
pre_commit: false
10 changes: 10 additions & 0 deletions .github/workflows/pip_audit.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
name: PIP Audit

on:
pull_request:
branches: [dev]
workflow_dispatch:

jobs:
pip_audit:
uses: OpenVoiceOS/gh-automations/.github/workflows/pip-audit.yml@dev
23 changes: 23 additions & 0 deletions .github/workflows/publish_stable.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
name: Publish Stable Release

on:
workflow_dispatch:
push:
branches: [master]

permissions:
contents: write

jobs:
publish_stable:
if: github.actor != 'github-actions[bot]'
uses: OpenVoiceOS/gh-automations/.github/workflows/publish-stable.yml@dev
secrets:
PYPI_TOKEN: ${{ secrets.PYPI_TOKEN }}
MATRIX_TOKEN: ${{ secrets.MATRIX_TOKEN }}
with:
version_file: 'hivemind_cli_terminal/version.py'
publish_pypi: true
publish_release: true
sync_dev: true
notify_matrix: true
13 changes: 13 additions & 0 deletions .github/workflows/release_preview.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
name: Release Preview

on:
pull_request:
branches: [dev]
workflow_dispatch:

jobs:
release_preview:
uses: OpenVoiceOS/gh-automations/.github/workflows/release-preview.yml@dev
with:
package_name: 'HiveMind-cli'
version_file: 'hivemind_cli_terminal/version.py'
28 changes: 28 additions & 0 deletions .github/workflows/release_workflow.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
name: Release Alpha and Propose Stable

on:
workflow_dispatch:
pull_request:
types: [closed]
branches: [dev]

permissions:
contents: write
pull-requests: write

jobs:
publish_alpha:
if: github.event.pull_request.merged == true || github.event_name == 'workflow_dispatch'
uses: OpenVoiceOS/gh-automations/.github/workflows/publish-alpha.yml@dev
secrets:
PYPI_TOKEN: ${{ secrets.PYPI_TOKEN }}
MATRIX_TOKEN: ${{ secrets.MATRIX_TOKEN }}
with:
branch: 'dev'
version_file: 'hivemind_cli_terminal/version.py'
update_changelog: true
publish_prerelease: true
propose_release: true
changelog_max_issues: 50
publish_pypi: true
notify_matrix: true
12 changes: 12 additions & 0 deletions .github/workflows/repo_health.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
name: Repo Health

on:
pull_request:
branches: [dev, master]
workflow_dispatch:

jobs:
repo_health:
uses: OpenVoiceOS/gh-automations/.github/workflows/repo-health.yml@dev
with:
version_file: 'hivemind_cli_terminal/version.py'
9 changes: 9 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
__pycache__/
*.py[cod]
*.egg-info/
build/
dist/
.pytest_cache/
.coverage
htmlcov/
.venv/
100 changes: 100 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
# AGENTS.md — `HiveMind-cli`

Guidance for AI coding agents (and humans) working in this repository. Read it
fully before making changes. It encodes conventions that are not obvious from the
code and that, if ignored, produce work that will be rejected.

## Repo

HiveMind-cli is a terminal client for HiveMind: type an utterance, watch the
response on the bus, with a curses split-pane UI (`--no-curses` for plain
stdin/stdout). It is the thinnest satellite in the HiveMind spectrum — no
microphone, no speaker, no wake word, no local processing at all. Part of the
[HiveMind](https://github.com/JarbasHiveMind) ecosystem — a protocol for
connecting satellite devices to a hub running
[OpenVoiceOS](https://github.com/OpenVoiceOS). The hub is
[HiveMind-core](https://github.com/JarbasHiveMind/HiveMind-core); the wire
client library it builds on is
[hivemind-bus-client](https://github.com/JarbasHiveMind/HiveMind-bus-client).
Siblings on the same spectrum: hivemind-mic-satellite, HiveMind-voice-relay,
HiveMind-voice-sat.

## Layout / build / test

- Package module: `hivemind_cli_terminal/`. Tests live in `tests/` (only
`tests/e2e/` exists — do not create a second test directory).
- Set up a throwaway environment inside your clone; never touch a shared venv:
`python3 -m venv .venv && VIRTUAL_ENV=$PWD/.venv uv pip install -e ".[e2e]" --prerelease=allow`
- Run the suite in the foreground: `python3 -m pytest tests/ -q`. The e2e suite
boots a real `hivemind-core` master in-process via `hivescope` (loopback
WebSocket) and drives the real terminal client over a real bus client; only
stdin/stdout is mocked. `conftest.py` warns loudly on any XPASS — treat that
as a signal to flip the corresponding `xfail` marker, not to ignore.
- `uv`, never `pip`. If latest prereleases fail to install or resolve, that is a
bug to FIX at the source, not to work around with a pin downgrade.

## Working agreement (org-wide law)

- **Git identity is always** `JarbasAi <jarbasai@mailfence.com>`. Never set a
per-repo override.
- **Never push `dev` or `master`.** Work on a feature branch and open a
**draft** PR into `dev`. A human merges. You do not merge your own PRs.
- **Never merge or modify `Release X → master` PRs.** They are the maintainer's
stable-release mechanism, generated by automation.
- **One commit per PR** (squash before pushing). Conventional commits; `feat:`
only for a user-visible new capability. `fix:`, `docs:`, `chore:`, `ci:`
otherwise.
- **Disclose AI authorship.** Every PR/issue/comment an agent writes carries, at
the top: `> 🤖 Auto-generated by <model> via Claude Code — NOT human-reviewed.
Verify before acting.` PR bodies are plain human prose (3–6 short paragraphs),
no tables or section-symbol spray.
- **Never edit someone else's** issue, PR description, or comment. Add a comment
instead; on your own PRs, edit the body rather than piling on comments.
- Keep durable text (README, docs, PR bodies, comments) timeless and standalone:
no dates, no "currently/now/new", no meta-commentary about the edit itself.
- No scratch files, committed virtualenvs, `__pycache__`, `.pyc`, `.egg-info`,
or build artifacts in a PR. `git show --stat` shows only intended files.

## Dependencies

- **Floor pins only** (`>=X.Y.Za1`), bumped when a feature or fix is actually
needed — with a one-line comment saying why. No upper caps unless a specific
released version is genuinely broken (say which and why).
- **No lockfiles, ever.** Target the latest alphas (`--prerelease=allow`).
- Everything in `pyproject.toml` (deps, metadata, version). Never install from
git — depend on a published PyPI alpha. There is no `requirements.txt`; do not
add one.
- Apache-2.0. Do not add GPL/AGPL dependencies.

## Tests

- Adversarial by default. A regression test must **fail before the fix and pass
after** — prove it by reverting only the source (`git apply -R`, never
`git stash` across worktrees) and watching the test flip.
- Tests must be mutation-proof: gutting the feature must fail the test. A test
that only asserts a mock was called, without asserting the real behaviour, is
weak — note it.
- Never skip a test because an optional dependency is missing.
- CI green is permission to review, not to merge. A non-trivial change gets an
adversarial review before it lands.

## Repo-specific rules

- This is an end-user satellite app, not a wire-protocol implementation: it
speaks HiveMind over `hivemind-bus-client`, it does not define the protocol.
Keep it on the bus-client 2.x stack (`ovos-bus-client>=2.0`).
- Bad credentials must fail fast. Do not add silent retry/reconnect-forever
loops around a rejected access key; a refused key is a terminal condition the
user must be told about, not something to paper over.
- Named-session semantics belong to the server (`hivemind-core add-client`);
this client only ever holds a key and password it was given at invocation —
do not add local credential caching or persistence beyond what the user
passes on the command line, and never hardcode a secret in source, tests, or
docs.
- The two UI modes (curses and `--no-curses` plain) must stay behaviourally
equivalent for utterance send/receive; changes to one need the equivalent
check in the other, and the curses-unavailable-at-import fallback to plain
mode must keep working.
- The README quickstart (`hivemind-core add-client` → `hivemind-cli
--access-key ... --host wss://...`) must stay accurate — if a flag or default
changes, update the README and `docs/` in the same PR, not as a follow-up.
Loading