Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
222 commits
Select commit Hold shift + click to select a range
a6fdc81
dotbot/cli: scaffold unified dispatcher with lazy subcommand loading
geonnave May 18, 2026
4c7e1d0
pyproject: add dotbot entry point and optional-extras layout
geonnave May 18, 2026
23f147b
tox: drop dead pin_code env, exercise unified dotbot CLI
geonnave May 18, 2026
976567c
readme: document unified dotbot CLI
geonnave May 18, 2026
fcfa99d
dotbot/tests: expand cli dispatcher coverage
geonnave May 18, 2026
a05f894
doc: switch CLI examples to unified dotbot dispatcher
geonnave May 18, 2026
231db3e
agents: refresh CLI entry points for unified dispatcher
geonnave May 18, 2026
bcdbb44
changelog: introduce CHANGELOG.md
geonnave May 18, 2026
c92d64b
Merge pull request #250 from geonnave/cli-scaffold
geonnave May 18, 2026
9da7202
dotbot/calibration: vendor dotbot-lh2-calibration Python side
geonnave May 18, 2026
b215e78
dotbot/tests: carry lighthouse2 regression test
geonnave May 18, 2026
0a10f6e
dotbot/cli/calibrate: replace lazy mount with native subgroup
geonnave May 18, 2026
ca19614
dotbot/provision: vendor dotbot-provision
geonnave May 18, 2026
ef0f95a
dotbot/cli/testbed: mount vendored provision directly
geonnave May 18, 2026
d0c3bb9
pyproject: rework extras for vendored provision and calibration
geonnave May 18, 2026
81a700c
dotbot/tests/test_cli_dispatcher: drop calibrate from cross-package subs
geonnave May 18, 2026
4ffb5c3
changelog: record fold of provision and lh2-calibration
geonnave May 18, 2026
0f387c1
readme: list provision and calibrate extras explicitly
geonnave May 18, 2026
f697607
agents: refresh cross-repo deps for vendored provision and calibration
geonnave May 18, 2026
892542b
dotbot/cli + setup.cfg: fix CI for vendored modules
geonnave May 18, 2026
88dcef6
dotbot/tests: skip lh2 test when cv2 isn't installed
geonnave May 18, 2026
4910f4b
setup.cfg: exclude vendored modules from coverage
geonnave May 18, 2026
d92de4c
dotbot/tests: cover calibrate import-error fallback paths
geonnave May 18, 2026
ccb4b4d
codecov: add config to soften patch coverage and floor project drift
geonnave May 18, 2026
245fbd3
pyproject: drop backwards-compat aliases for vendored modules
geonnave May 19, 2026
728c98f
dotbot/cli/calibrate: add explicit `tui` alias for the TUI subcommand
geonnave May 19, 2026
2b11003
dotbot/calibration/cli: defer serial-port enumeration to invocation
geonnave May 19, 2026
ac06112
dotbot/calibration/lighthouse2: lazy-import cv2 inside compute_homogr…
geonnave May 19, 2026
a77b008
dotbot/provision/cli: surface broken symlinks in missing-firmware error
geonnave May 19, 2026
56882e5
dotbot/cli: rename calibrate → calibrate-lh2, add apply stub
geonnave May 19, 2026
9d70dd4
dotbot/cli/calibrate: collapse export+apply into single `apply <path>`
geonnave May 19, 2026
8384792
dotbot/calibration/lighthouse2: save as timestamped TOML + legacy .out
geonnave May 19, 2026
3e1dd40
dotbot/provision/cli: accept TOML calibration files
geonnave May 19, 2026
a71b8ca
dotbot/calibration/cli: echo saved calibration path after TUI exits
geonnave May 19, 2026
048aa4e
dotbot/tests/test_cli_dispatcher: re-run black on test_calibrate_lh2_…
geonnave May 19, 2026
6a6deeb
dotbot/calibration/lighthouse2: write TOML as explicit UTF-8 for Windows
geonnave May 19, 2026
93343fc
dotbot: drop dangling workspace plans/ references from docstrings
geonnave May 19, 2026
d229772
Merge pull request #251 from geonnave/fold-provision-lh2cal
geonnave May 19, 2026
4b7a053
dotbot/provision/nrf_flash: fix net_id readback offset
geonnave May 26, 2026
8018ef2
dotbot/tests/test_controller: switch simulator tests to asyncio.run()
geonnave May 26, 2026
2b164da
dotbot/provision/cli: hint to press the reset button after flash
geonnave May 26, 2026
fc577e0
Merge pull request #253 from geonnave/fix-provision-net-id-readback
geonnave May 26, 2026
6ea50ea
dotbot/adapter: dispatch and label frames by next_proto
geonnave May 27, 2026
d2a68e8
pyproject: require marilib-pkg >= 0.9.0rc2 for next_proto API
geonnave May 27, 2026
4685e30
Merge pull request #254 from geonnave/dispatch-by-next-proto
geonnave May 27, 2026
62d73f1
dotbot/cli: rename testbed subcommand to swarm
geonnave May 29, 2026
2bc52ea
dotbot/cli/fw: replace mock with real SES+emBuild wrapper
geonnave May 29, 2026
2da597e
dotbot/cli/swarm: add sandbox fw build/clean/targets/artifacts
geonnave May 29, 2026
da0c16b
dotbot/cli: add dotbot make escape hatch for firmware Makefile
geonnave May 29, 2026
2196307
dotbot/cli/fw: gate make-line echo on -v, add timing and preamble
geonnave May 29, 2026
d311ff3
dotbot/tests/test_fw: parity-guard BARE_TARGETS vs make list-targets
geonnave May 29, 2026
bf6818c
dotbot/cli/_fw_helpers: read SEGGER_DIR + firmware_repo from config
geonnave May 29, 2026
b5f7cd0
dotbot/cli: drop testbed deprecated alias
geonnave May 29, 2026
24e17b5
dotbot/cli/fw: --target/-t flag + list every built artifact path
geonnave May 29, 2026
735828d
dotbot/cli/_fw_helpers: fix sandbox artifact path computation
geonnave May 29, 2026
6ccc318
dotbot/cli/fw: artifacts to user CWD; --out flag; BUILD_MODE fix
geonnave May 29, 2026
bc210bb
dotbot/cli/_sandbox_fw: prepend sandbox- to collected artifact filenames
geonnave May 29, 2026
b1ffc4f
dotbot/cli/fw: drop sandbox-path workarounds (SES side now sane)
geonnave May 29, 2026
cff6f8e
dotbot/cli: black reformat (newer black collapses one-line raises)
geonnave May 29, 2026
1c80afd
dotbot/tests/test_fw: make path assertions Windows-portable
geonnave May 29, 2026
f2bee72
pyproject: bump to 0.28.0rc1
geonnave May 29, 2026
003a766
dotbot/tests/test_fw: black reformat
geonnave May 29, 2026
dceabc9
Merge pull request #255 from geonnave/fw-build-and-swarm-rename
geonnave May 29, 2026
27ddb4a
pyproject: bump to 0.29.0rc1
geonnave May 29, 2026
d9f0a8d
Merge pull request #256 from geonnave/bump-0.29.0rc1
geonnave May 29, 2026
2ac2045
dotbot/cli/_fw_helpers: discover DotBot-firmware as a CWD sibling
geonnave May 29, 2026
ec9fb22
dotbot/cli/_fw_helpers: simplify firmware-repo discovery to env or CW…
geonnave May 30, 2026
c4e4db1
Merge pull request #257 from geonnave/fw-discovery-sibling
geonnave May 30, 2026
e56976d
dotbot/cli/_conn: add --conn connection-string parser
geonnave May 30, 2026
c46e41c
dotbot/controller_app: take a single --conn connection string
geonnave May 30, 2026
37ddede
dotbot/cli/sim: route through --conn simulator
geonnave May 30, 2026
3948eed
dotbot/cli/gateway: add host-side Mari gateway bridge subcommand
geonnave May 30, 2026
4c6c75f
dotbot/controller_app: drop -c short from --controller-http-port
geonnave May 30, 2026
3b60089
dotbot/cli/gateway: pass env credentials to MQTTAdapter.from_url
geonnave May 30, 2026
a0be89b
dotbot/adapter: use str | None for MQTT credential hints
geonnave May 30, 2026
4f96bd8
dotbot/cli/gateway: print frames by default, add --no-print flag
geonnave May 30, 2026
7354294
dotbot/cli/_conn: delegate MQTT-URL parse to marilib
geonnave May 30, 2026
930405a
dotbot/controller_app: warn on legacy transport config keys
geonnave May 30, 2026
345b338
dotbot/adapter: mark SerialAdapter deprecated
geonnave May 30, 2026
652213c
pyproject: require marilib-pkg >= 0.9.0rc3 for parse_mqtt_url + auth
geonnave May 30, 2026
0c26c26
dotbot/dotbot_simulator: ship a packaged default simulator world
geonnave May 30, 2026
8239d3f
dotbot/adapter: no-op simulator close() before start()
geonnave May 30, 2026
ebe8bfe
dotbot/controller_app: offer to scaffold a simulator world file
geonnave May 30, 2026
e12c3d5
pyproject: bump to 0.29.0rc2
geonnave May 30, 2026
b4d107b
Merge pull request #258 from geonnave/controller-conn-redesign
geonnave May 30, 2026
f7c0d4d
dotbot/firmware: rename provision package to firmware flash engine
geonnave May 30, 2026
5b7d811
dotbot/cli/device: add device namespace for cabled flash + info
geonnave May 30, 2026
bdc97f0
dotbot/cli/fw: fold sandbox into --sandbox flavor, add fetch and list
geonnave May 30, 2026
eb374c4
dotbot/cli/main: register device group, drop provision from swarm
geonnave May 30, 2026
aa83e40
pyproject: fold intelhex into core, drop the provision extra
geonnave May 30, 2026
257227c
dotbot/tests: cover device namespace and fw --sandbox/fetch/list
geonnave May 30, 2026
e4213fc
readme: drop the removed provision extra from install docs
geonnave May 30, 2026
091a989
dotbot/firmware: make sample-app fetch best-effort (404 not fatal)
geonnave May 30, 2026
138c785
dotbot/cli: fix fw build hints to use -a/-t, not --board
geonnave May 30, 2026
8018234
dotbot/cli: black reformat
geonnave May 30, 2026
7c2ebed
dotbot/firmware: black reformat
geonnave May 30, 2026
9818347
dotbot/tests: black reformat
geonnave May 30, 2026
719ba1f
dotbot/cli: correct firmware artifact-resolution and help docs
geonnave May 30, 2026
f2a7ed9
Merge pull request #259 from geonnave/fw-device-swarm-unify
geonnave May 30, 2026
b9a1724
dotbot/cli: reorganize top level into fw/device/swarm/run namespaces
geonnave May 30, 2026
4e1bf7e
pyproject: drop the legacy dotbot-* console scripts
geonnave May 30, 2026
c4dd1c4
dotbot/tests: lock the four-namespace surface and run group
geonnave May 30, 2026
87946a2
readme: rewrite the CLI section for the four-namespace surface
geonnave May 30, 2026
b339ce3
doc: update command paths under the run namespace
geonnave May 30, 2026
0fd05ca
agents: refresh the CLI surface description
geonnave May 30, 2026
fc0c0c6
changelog: record the four-namespace CLI reorg
geonnave May 30, 2026
06b5d5c
dotbot/firmware: flash per-board chip family/core, not always nRF53
geonnave May 31, 2026
fef5487
dotbot/cli: select the flash chip family/core from --board
geonnave May 31, 2026
04ae7e2
dotbot/tests: cover board→family/core flash routing
geonnave May 31, 2026
00480b9
readme: add one-bot, swarm, and lighthouse-2 quickstart walkthroughs
geonnave May 31, 2026
aa7f565
dotbot/cli/main: reword root help to describe what the tool does
geonnave May 31, 2026
e818bb9
readme: polish quickstarts, prerequisites, and install defaults
geonnave May 31, 2026
6da191f
doc: linkcheck-ignore nordicsemi.com (403s the bot)
geonnave May 31, 2026
e10b97c
Merge pull request #260 from geonnave/cli-run-namespace
geonnave May 31, 2026
e7fb650
doc: restructure into CLI / SDK / hardware / guides / reference with …
geonnave May 31, 2026
c368a07
readme: move controller + command-list detail into the docs
geonnave May 31, 2026
2e67de5
doc: reframe the CLI overview around tasks, not the noun/verb model
geonnave May 31, 2026
1a9e4f0
doc: add a reference troubleshooting page
geonnave May 31, 2026
30ac0b2
doc: linkcheck-ignore the readthedocs self-domain
geonnave May 31, 2026
eaa22b8
readme: cross-link to the docs and trim the quickstarts
geonnave May 31, 2026
797f0b6
doc: route the landing page by task, not by persona
geonnave May 31, 2026
b59a60e
readme: add a high-level diagram and demo video
geonnave May 31, 2026
2549dab
doc: linkcheck-ignore youtube
geonnave May 31, 2026
7ba0ede
readme: make the architecture diagram horizontal
geonnave May 31, 2026
7e2fc6d
readme: lead with a value prop and a zero-hardware quickstart
geonnave May 31, 2026
89c4e66
readme: reword the scale line and mark PyDotBot in the diagram
geonnave May 31, 2026
55bd28e
dotbot/cli: rename `run sim` to `run simulator`
geonnave May 31, 2026
6b69801
doc: use hyphens instead of em dashes
geonnave May 31, 2026
a6f0cda
dotbot/cli: name device flash commands after their firmware
geonnave May 31, 2026
c2147ec
Merge pull request #264 from geonnave/docs-restructure
geonnave May 31, 2026
a26bc89
dotbot/config: add the unified config resolver core
geonnave Jun 1, 2026
ce823a2
dotbot/cli: root config loading + fw/device --build-config rename
geonnave Jun 1, 2026
3ba6807
dotbot/cli: read fw/device option defaults from the config
geonnave Jun 1, 2026
26d24b1
dotbot/cli: add `config` and `testbed` management commands
geonnave Jun 1, 2026
280a5d4
doc: add the configuration reference page
geonnave Jun 1, 2026
cd84614
config: rename the `testbed` concept to `deployment`
geonnave Jun 1, 2026
f2f5e48
dotbot/cli: add `config init` to scaffold a starter config
geonnave Jun 1, 2026
a943db9
dotbot/controller_app: consume conn/swarm_id from the deployment
geonnave Jun 1, 2026
1d73493
dotbot/cli/gateway: fall back to the deployment's mqtt broker
geonnave Jun 1, 2026
6aec7d2
dotbot/cli/device: make flash -n default to deployment swarm_id
geonnave Jun 1, 2026
4af7519
dotbot/cli: add deployment use to switch the default deployment
geonnave Jun 1, 2026
178ea45
dotbot/config: add load_config_text to validate a config string
geonnave Jun 1, 2026
42756d0
pyproject: add tomlkit for comment-preserving config writes
geonnave Jun 1, 2026
f2fa657
dotbot/cli: add deployment fetch to pull published deployments
geonnave Jun 1, 2026
5a725f6
doc: document deployment use and fetch in the config reference
geonnave Jun 1, 2026
da78f3e
dotbot/cli: let config init pre-fill conn and swarm_id
geonnave Jun 1, 2026
e23aca0
dotbot/cli: slim the config init scaffold to keys plus a docs link
geonnave Jun 1, 2026
9dffaee
readme: use config init for the swarm quickstart setup
geonnave Jun 1, 2026
97ec00e
doc: switch the config/swarm guides to config init + dotbot.toml
geonnave Jun 1, 2026
b76c77b
dotbot/cli: make dotbot swarm read the unified config
geonnave Jun 1, 2026
6aec555
readme: drop -c from swarm now that it reads the config
geonnave Jun 1, 2026
089963f
doc: drop -c from swarm examples (config auto-discovered)
geonnave Jun 1, 2026
ae93f19
pyproject: bump swarmit to >= 0.8.0rc2
geonnave Jun 1, 2026
765f817
pyproject: make swarmit a core dependency
geonnave Jun 1, 2026
978c0ec
readme: install pydotbot without the [swarm] extra
geonnave Jun 1, 2026
486ef70
agents: swarmit is a core dep, not an optional extra
geonnave Jun 1, 2026
4d41df2
dotbot/tests: move test payloads off swarmit's 0x81/0x82
geonnave Jun 1, 2026
e72c1c7
dotbot/config: discover dotbot.toml in the cwd only
geonnave Jun 1, 2026
9548db0
doc: config discovery is cwd-only, not cwd-upward
geonnave Jun 1, 2026
1bfebc1
dotbot/config: accept [fw].firmware_repo in the schema
geonnave Jun 1, 2026
39a729b
dotbot/cli: locate DotBot-firmware via [fw].firmware_repo config
geonnave Jun 1, 2026
7eee859
doc: document [fw].firmware_repo
geonnave Jun 1, 2026
4a515f4
dotbot/cli: route [fw] config through the unified resolver
geonnave Jun 1, 2026
8c05eca
doc: document ~/.dotbot as the per-machine config fallback
geonnave Jun 1, 2026
766d7d7
readme: document net-core flashing and fix the move_raw circle
geonnave Jun 1, 2026
11fb85e
doc: ignore badge services in linkcheck
geonnave Jun 1, 2026
62bf653
Merge pull request #266 from geonnave/config-cli-wiring
geonnave Jun 1, 2026
b177107
dotbot/server: skip the web UI mount when the frontend build is absent
geonnave Jun 1, 2026
1ba26b6
doc: add a troubleshooting entry for a missing frontend build
geonnave Jun 1, 2026
ab33570
doc: note the SES nRF and CMSIS_5 packages needed to build firmware
geonnave Jun 1, 2026
c7466ae
doc: document the nrfjprog prerequisite and board-match caution
geonnave Jun 1, 2026
45036c5
doc: surface prerequisites and a cables checklist for new users
geonnave Jun 1, 2026
4231be9
doc: keep firmware_repo per-project, segger_dir per-machine
geonnave Jun 1, 2026
16dc65d
Merge pull request #268 from geonnave/onboarding-docs-feedback
geonnave Jun 2, 2026
81f6438
dotbot/cli: fix stale -c/--config help to match cwd-only discovery
geonnave Jun 1, 2026
45cf671
dotbot/cli: render config output through tomlkit, not hand-rolled emi…
geonnave Jun 1, 2026
5982744
dotbot/cli: rename device flash --network-id to --swarm-id
geonnave Jun 2, 2026
f18fa3d
doc: rename device flash --network-id to --swarm-id
geonnave Jun 2, 2026
ab0d3ac
readme: document the config command
geonnave Jun 2, 2026
f1e3252
doc: add a cli/config page for the config command
geonnave Jun 2, 2026
09a1c33
readme: remove unneeded details
geonnave Jun 2, 2026
78df019
Merge pull request #269 from geonnave/cli-config-followups
geonnave Jun 2, 2026
a0f6849
release: 0.29.0rc3
geonnave Jun 2, 2026
96b7c10
dotbot/calibration: add over-the-air LH2 capture orchestration
geonnave Jun 3, 2026
7f04779
dotbot/calibration: tag saved calibrations with an arena label
geonnave Jun 3, 2026
5d9ef08
dotbot/cli: add swarm lh2-calibration collect/push commands
geonnave Jun 3, 2026
863deff
pyproject: bump swarmit to >= 0.8.0rc3
geonnave Jun 4, 2026
6c8db27
dotbot/calibration: drop redundant forward-ref quotes in ota
geonnave Jun 4, 2026
20421ed
Merge pull request #271 from geonnave/lh2-ota-collect
geonnave Jun 4, 2026
d52c478
doc: add a one-bot guide and route the docs nav to it
geonnave Jun 3, 2026
09ede53
readme: lead with the swarm quickstart, move one-bot and LH2 to guides
geonnave Jun 3, 2026
1f89955
dotbot: fetch and flash default to the latest swarmit release
geonnave Jun 3, 2026
eab6239
doc: fetch defaults to the latest release
geonnave Jun 3, 2026
774dad1
readme: drop the hardcoded firmware version (fetch defaults to latest)
geonnave Jun 3, 2026
2b4ad87
dotbot: clean up fetch output (package-manager style)
geonnave Jun 3, 2026
0a96e95
dotbot: add a bare-REST 'circle' demo (dotbot run demo circle)
geonnave Jun 3, 2026
6e0b93d
doc: add a simulator guide
geonnave Jun 3, 2026
40d6a47
readme: restructure onboarding around install, simulator, and swarm
geonnave Jun 3, 2026
859cd8d
dotbot: multi-source firmware fetch + ~/.dotbot/artifacts cache layout
geonnave Jun 3, 2026
670038d
dotbot/firmware: download fetch assets in parallel
geonnave Jun 3, 2026
1433a37
dotbot/cli: announce the active config file at startup
geonnave Jun 3, 2026
2a51c20
dotbot/firmware: retry transient download failures
geonnave Jun 3, 2026
1f170fc
dotbot/cli: summarize fetched firmware folders at the end
geonnave Jun 3, 2026
32ea774
dotbot/cli: centralize the default artifacts-cache path
geonnave Jun 3, 2026
8211263
dotbot/firmware: pin fetched firmware versions to pydotbot
geonnave Jun 3, 2026
7a2abea
doc: refresh firmware-cache location and pinned fetch
geonnave Jun 3, 2026
0e138eb
readme: point fetch + swarm-flash examples at the firmware cache
geonnave Jun 3, 2026
dd45ef8
dotbot/cli: default device role flash to the pinned swarmit version
geonnave Jun 3, 2026
406654d
dotbot/config: drop the unwired artifacts_dir key
geonnave Jun 3, 2026
6307f55
doc: align fetch/flash docs with the pinned default and drop artifact…
geonnave Jun 3, 2026
29f1e1a
readme: show concrete swarm-flash paths in the quickstart
geonnave Jun 3, 2026
dfb25ad
dotbot/firmware: make _short_path tolerate Windows cross-drive paths
geonnave Jun 3, 2026
4c9f223
dotbot/firmware: split release fetching out of flash.py into fetch.py
geonnave Jun 3, 2026
cdc15ea
doc: skip the 403-ing dotbots.org + segger.com links in linkcheck
geonnave Jun 3, 2026
a215bb1
doc: lead LH2 calibration with the OTA flow, split out the cabled guide
geonnave Jun 4, 2026
f93abc8
readme: add over-the-air LH2 calibration + rework Going further
geonnave Jun 4, 2026
25bd167
Merge pull request #270 from geonnave/fw-fetch-latest-multisource
geonnave Jun 4, 2026
ad9df92
release: 0.29.0
geonnave Jun 5, 2026
702bfe8
pyproject: bump marilib-pkg to >= 0.9.0
geonnave Jun 5, 2026
a788628
pyproject: bump swarmit to >= 0.8.0
geonnave Jun 5, 2026
6f11e9c
dotbot/firmware: bump firmware pin to 1.22.0
geonnave Jun 5, 2026
be1426f
Merge pull request #274 from geonnave/version-bump-0.29.0
geonnave Jun 5, 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
24 changes: 19 additions & 5 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

## Purpose

Python control plane for DotBots. Serial / cloud / edge adapters talk to a DotBot gateway (often via Mari → marilib); a FastAPI REST + WebSocket server exposes state; a React web UI provides joystick/map/lighthouse-position visualization. Also ships CLI tools (`dotbot-controller`, `dotbot-edge-gateway`, `dotbot-keyboard`, `dotbot-joystick`, `dotbot-qrkey`) and DotBot/SailBot simulators.
Python control plane for DotBots. Serial / cloud / edge adapters talk to a DotBot gateway (often via Mari → marilib); a FastAPI REST + WebSocket server exposes state; a React web UI provides joystick/map/lighthouse-position visualization. Ships a unified `dotbot` CLI whose top level is four object-namespaces: `fw` (firmware artifacts: build/fetch/list/make), `device` (one cabled device: flash/info), `swarm` (the fleet over the air), and `run` (host-side processes you launch — `dotbot run controller`, `run gateway`, `run simulator`, `run lh2-calibration`, `run demo`, `run keyboard`, `run joystick`), plus DotBot/SailBot simulators. The `dotbot` dispatcher is the only console script — there are no per-command `dotbot-*` binaries.

This is the most active repo in the ecosystem (187 commits in last 90 days as of 2026-05-05).

Expand All @@ -15,16 +15,23 @@ This is the most active repo in the ecosystem (187 commits in last 90 days as of

## Entry points

- `dotbot/controller_app.py` — main CLI (`dotbot-controller`); wires adapters and settings
- `dotbot/cli/main.py` — unified `dotbot` Click group (lazy subcommand loader)
- `dotbot/controller_app.py` — `dotbot run controller` subcommand backend; wires adapters and settings
- `dotbot/controller.py:1` — 737-line `Controller` class; central object
- `dotbot/frontend/src/App.tsx` — React UI root

## Build / run / test

```bash
pip install pydotbot # or `pip install -e .`
dotbot-controller --help
# Other entry points: dotbot-edge-gateway, dotbot-keyboard, dotbot-joystick, dotbot-qrkey
dotbot --help # unified dispatcher: fw / device / swarm / run
dotbot fw --help # firmware artifacts: build / fetch / list / make
dotbot device --help # one cabled device: flash an app/role, read info
dotbot swarm --help # the fleet over the air (swarmit; in the base install)
dotbot run --help # host-side processes (controller, gateway, simulator, ...)
dotbot run controller --help # start the controller
dotbot run lh2-calibration --help # LH2 calibration (optional: pip install pydotbot[calibrate])
dotbot run demo --list # built-in research demos

# Tests / lint / build
tox # envs: tests, check, cli, web=npm run lint, doc
Expand All @@ -45,7 +52,14 @@ CI: `.github/workflows/continuous-integration.yml` — `tox` on Linux/macOS/Wind
- **`PyDotBot-utils`** — `pyproject.toml:49`; used by `utils/hooks/sdist.py:build_frontend`
- **`DotBot-libs`** — checked out in CI to build `utils/control_loop` C library
- **`DotBot-firmware`** — referenced only in README (flashing instructions); no code dep
- No references to: `swarmit`, `dotbot-lh2-calibration`, `dotbot-provision`
- **`swarmit`** — sibling package, a core dependency (`pyproject.toml`);
imported lazily inside `dotbot/cli/swarm.py`, which bridges the unified
config's `conn`/`swarm_id` into swarmit's flags at the mount boundary.
- **`dotbot-provision`** — vendored into `dotbot/provision/` (Phase 2,
2026-05). Standalone PyPI package scheduled for deprecation.
- **`dotbot-lh2-calibration` (Python)** — vendored into
`dotbot/calibration/` (Phase 2, 2026-05). The C firmware stays in
its own repo.

## State of repo (snapshot 2026-05-05)

Expand Down
100 changes: 100 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
# Changelog

All notable changes to PyDotBot are recorded here.

Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [Unreleased]

### Added

- Unified `dotbot` CLI dispatcher that mounts every workflow (controller,
simulator, testbed ops, calibration, demos, keyboard/joystick) under one
command. Subcommand modules are loaded lazily so `dotbot --help` stays
cheap.
- `dotbot run demo` discoverable launcher; `dotbot run demo qr` runs the
qrkey phone-bridge demo.
- `dotbot fw` mock surface (scaffold/build/flash subcommands; placeholder
for the firmware-developer workflow).
- **Vendored `dotbot-provision`** into `dotbot/provision/`. All five
subcommands available as `dotbot testbed provision <fetch|flash|
flash-hex|read-config|flash-bringup>`.
- **Vendored `dotbot-lh2-calibration` (Python side)** into
`dotbot/calibration/`. Surfaced as `dotbot run lh2-calibration` with
two subcommands:
- `collect` — runs the Textual TUI (default — bare
`dotbot run lh2-calibration` invokes this for muscle memory)
- `apply <path>` — write the saved calibration as a C header to
`<path>` (replaces the previous `dotbot-calibration-exporter`;
today the only consumer is the swarmit secure bootloader which
`#include`s the file at compile time)
The C firmware in the `dotbot-lh2-calibration` repo is unchanged.
Future OTA / swarm-wide counterparts (`collect` over MQTT,
`apply` as OTA push) will live under `dotbot swarm
calibrate-lh2`.
- Calibration records are now saved as timestamped, schema-versioned
TOML files (`~/.dotbot/calibration-<UTC timestamp>.toml`) carrying
metadata (number of LH stations, calibration distance, creation
time) alongside the homography bytes (hex-encoded under
`[calibration].data_hex`). The legacy `~/.dotbot/calibration.out`
binary is still written as a back-compat byproduct so external
consumers (swarmit OTA, `dotbot testbed provision flash`) keep
working unchanged; once they learn to read TOML the legacy write
will be dropped. `load_calibration()` prefers the newest TOML and
falls back to `calibration.out` if no TOML files exist.
- `dotbot testbed provision flash --calibration <path>` accepts a
`.toml` calibration file in addition to the legacy binary format
(the file extension drives the parsing path).
- Optional dependency groups (revised):
- `pip install dotbot[testbed]` adds `swarmit` (still external)
- `pip install dotbot[provision]` adds `intelhex` (provision runtime)
- `pip install dotbot[calibrate]` adds `opencv-python` + `textual`
- `pip install dotbot[all]` pulls all three

### Changed

- **Breaking — CLI reorganized into four object-namespaces.** The top
level is now exactly `fw` (firmware artifacts), `device` (one cabled
device), `swarm` (the fleet), and `run` (host-side processes). The flat
process verbs moved under `run`: `dotbot controller` → `dotbot run
controller`, and likewise `gateway` / `simulator` / `demo` / `keyboard` /
`joystick`; `dotbot calibrate-lh2` → `dotbot run lh2-calibration`. The
Makefile escape hatch moved from `dotbot make` to `dotbot fw make`.
`run` subcommands are still loaded lazily, so `dotbot run --help` stays
cheap.
- The qrkey integration moved from `dotbot/qrkey.py` to
`dotbot/examples/qrkey_demo/`. The demo is now a separate process that
consumes the controller's REST API — the controller stays agnostic to
qrkey.
- `dotbot/examples/qrkey_demo/` is a thin client of the upstream `qrkey`
package (now pinned `>= 0.12.2`); none of its code is vendored.
- Frontend polls qrkey count every 1 s for faster Show QR button
feedback.

### Removed

- `dotbot-qrkey` console script — use `python -m dotbot.examples.qrkey_demo`
or `dotbot run demo qr` instead.
- `dotbot-edge-gateway` console script — the referenced module
`dotbot.edge_gateway_app` never existed; the entry was silently broken.
- `pin_code` tox env — referenced `dotbot/pin_code_ui/` which never
existed.
- `dotbot-provision` and `dotbot-lh2-calibration` PyPI dependencies
(folded into the `dotbot` package). The standalone PyPI packages are
scheduled for deprecation releases that point users at `pip install
dotbot[provision]` / `pip install dotbot[calibrate]`.
- `dotbot-controller`, `dotbot-keyboard`, and `dotbot-joystick` console
scripts — removed outright (no longer aliased). Use `dotbot run
controller` / `dotbot run keyboard` / `dotbot run joystick`.

### Deprecated

- The standalone `dotbot-provision` and `dotbot-lh2-calibration` PyPI
packages will issue `DeprecationWarning` on their next release and
point users at `pip install dotbot[provision]` /
`pip install dotbot[calibrate]`. Their console scripts
(`dotbot-provision`, `dotbot-calibration`,
`dotbot-calibration-exporter`) are not re-exported by `dotbot`
because they never shipped from this package; use the unified
subcommands instead.
Loading
Loading