diff --git a/BUGS.md b/BUGS.md index 039e1eb..925c95f 100644 --- a/BUGS.md +++ b/BUGS.md @@ -8,7 +8,7 @@ file is kept only for historical reference. ## Outstanding known issues -As of **v1.0.0**. +As of the **v1.1.0 release candidate**. ### High priority diff --git a/CHANGELOG.md b/CHANGELOG.md index 8a7ff51..f637b66 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ semantic versioning. ## [Unreleased] +## [1.1.0] - 2026-09-13 + ### Added - Local commands and local services (dropped into `local/commands` and @@ -66,6 +68,27 @@ semantic versioning. ### Fixed +- Service installers no longer leave `venv/bin/pip` and other console scripts + pointing at the temporary build environment after an atomic virtualenv swap. + `--update-venv` also repairs already-broken shebangs before replacing the old + environment (#229). + +- Direct messages from newly advertised companions resolve through + `pending_contacts` until the next contact snapshot, so a successful command ACK + is no longer followed by a failed keyword reply. + +- Command matching preserves the original on-air message body while using a + cleaned copy for mention and trigger matching. Commands and web-viewer events no + longer receive content altered as a side effect of dispatch (#267). + +- The dark mesh map uses OpenFreeMap instead of Carto's retired unauthenticated + raster tiles. Browsers without the required WebGL support fall back to an + inverted OpenStreetMap layer instead of displaying a blank map. + +- ARMv7 service and Debian-package installs use the piwheels index and the shipped + compatibility constraints consistently, avoiding source builds and incompatible + dependency selections on 32-bit Raspberry Pi systems (#269). + - Published packet payloads carry UTC in every time field, not just `timestamp` (#278). `time` and `date` came from a local `datetime.now()` while the `timestamp` beside them was UTC, so a consumer reading the pair off a bot in a @@ -619,12 +642,6 @@ considered stable; breaking changes to them will come with a major version bump. ### Fixed -- Service installers no longer leave `venv/bin/pip` (and other console scripts) - with shebangs pointing at the temporary `.venv-build-$$` path after the atomic - virtualenv swap. Optional package prompts and documented pip invocations now - use `venv/bin/python -m pip`. `--update-venv` rewrites shebangs in place so - already-broken installs heal without a full rebuild, and the previous venv is - kept until rewrite succeeds (issue #229). - Data retention now runs shortly after startup and then daily. It no longer requires 24 hours of uninterrupted uptime before the first cleanup, and its timer remains independent from the nightly maintenance email. @@ -922,6 +939,8 @@ hardening fixes. v0.9.0. - Discord integration, kg7qin integration notes (`f2936be`, `de6279c`). +[Unreleased]: https://github.com/agessaman/meshcore-bot/compare/v1.1.0...HEAD +[1.1.0]: https://github.com/agessaman/meshcore-bot/compare/v1.0.0...v1.1.0 [1.0.0]: https://github.com/agessaman/meshcore-bot/compare/v0.9.3...v1.0.0 [0.9.3]: https://github.com/agessaman/meshcore-bot/compare/v0.9.2...v0.9.3 [0.9.2]: https://github.com/agessaman/meshcore-bot/compare/v0.9.1...v0.9.2 diff --git a/TODO.md b/TODO.md index 55c48d5..e9ff537 100644 --- a/TODO.md +++ b/TODO.md @@ -7,17 +7,18 @@ tracked here — see [CHANGELOG.md](CHANGELOG.md) for shipped changes and The Inline TODOs section at the bottom is auto-generated by `python scripts/update_todos.py` (see [Auto-Update](#auto-update)). -**Last updated:** 2026-08-07 — v1.0.0 release prep. Coverage 53% (3,981 passed / 11 skipped), `fail_under = 35`. +**Last updated:** 2026-09-13. The v1.1.0 release-candidate suite reports 55% +coverage, and `fail_under = 50`. --- ## Test coverage -Coverage reached **53%** at v1.0.0, past the old 40% target. `fail_under` is -still 35 — worth raising now that there is headroom. +Coverage is **55%** at the v1.1.0 release candidate. The enforced floor is 50%. Hardware- and API-dependent modules cap the realistic ceiling, so the list below -is ordered by value rather than by percentage. Figures are from the v1.0.0 run. +is ordered by value rather than by percentage. Per-module figures below are from +the v1.0.0 run and should be refreshed in a separate coverage review. **Pure logic — best value:** @@ -132,4 +133,3 @@ Or run it as part of a pre-commit hook by adding to `.pre-commit-config.yaml`: > _Last scanned: 2026-08-07. No `# TODO`, `# FIXME`, or `# HACK` markers > found in `modules/` or `tests/`. Run `python scripts/update_todos.py` to refresh._ - diff --git a/docs/config-validation.md b/docs/config-validation.md index dd7df8c..2911f5b 100644 --- a/docs/config-validation.md +++ b/docs/config-validation.md @@ -47,7 +47,7 @@ The bot will not start without these sections. The validator reports them as **e - `[WebViewer]` → use `[Web_Viewer]` - `[FeedManager]` → use `[Feed_Manager]` - `[Jokes]` → use `[Joke_Command]` / `[DadJoke_Command]` (see [Configuration](configuration.md) and [Upgrade](upgrade.md) for legacy support). - - **`[Aliases]`** — Deprecated in v0.9. Move entries to per-command `aliases =` under each `*_Command` section. The validator may report this as **info**; see [Upgrade guide](upgrade.md#upgrading-from-v08--v09). + - **`[Aliases]`** — Deprecated in v0.9. Move entries to per-command `aliases =` under each `*_Command` section. The validator may report this as **info**; see [Upgrade guide](upgrade.md#upgrading-from-v08-v09). - **Unknown sections** (not in the canonical list and not a `*_Command` section) are reported as **info**; the validator may suggest a similar section name if it looks like a command. ### Optional sections (info only) diff --git a/docs/docker.md b/docs/docker.md index 2a39890..80ed4cc 100644 --- a/docs/docker.md +++ b/docs/docker.md @@ -418,7 +418,7 @@ For production deployments: 1. **Use specific image tags** instead of `latest`: ```yaml - image: ghcr.io/your-username/meshcore-bot:v1.0.0 + image: ghcr.io/your-username/meshcore-bot:v1.1.0 ``` 2. **Set resource limits** in `docker-compose.yml`: diff --git a/docs/getting-started.md b/docs/getting-started.md index 8762376..8bfd2ac 100644 --- a/docs/getting-started.md +++ b/docs/getting-started.md @@ -91,7 +91,7 @@ meshcore-bot.url = "github:agessaman/meshcore-bot/"; ## Next steps - **[Command Reference](command-reference.md)** — Full command reference (wx, aqi, sun, path, prefix, etc.) -- **[Upgrade guide](upgrade.md)** — Migrating to v0.9 from older releases +- **[Upgrade guide](upgrade.md)** - Release-specific upgrade notes - **[Config validation](config-validation.md)** — Validate `config.ini` before first run - **[Data retention](data-retention.md)** — Database cleanup defaults - **[README](https://github.com/agessaman/meshcore-bot/blob/main/README.md)** — Features, keywords, configuration overview diff --git a/docs/installation.md b/docs/installation.md index 5002e34..b9998b2 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -21,7 +21,7 @@ isolated environment, which sidesteps PEP 668 (`externally-managed-environment`) Debian 12+, Ubuntu 23.04+, Fedora and Arch without you managing a virtualenv: ```bash -pipx install "git+https://github.com/agessaman/meshcore-bot@v1.0.0" +pipx install "git+https://github.com/agessaman/meshcore-bot@v1.1.0" ``` Upgrade to a newer tag with `pipx install --force "git+https://github.com/agessaman/meshcore-bot@vX.Y.Z"`. diff --git a/docs/packet-capture.md b/docs/packet-capture.md index 8c01ae1..bc794a3 100644 --- a/docs/packet-capture.md +++ b/docs/packet-capture.md @@ -263,7 +263,7 @@ independent of this setting. "model": "Heltec V3", "firmware_version": "v3.1.2", "radio": "915000000,250,9,8", - "client_version": "meshcore-bot/v1.0.0", + "client_version": "meshcore-bot/v1.1.0", "stats": { "rx_packets": 1234, "tx_packets": 567 diff --git a/docs/upgrade.md b/docs/upgrade.md index 57aab6c..6166e33 100644 --- a/docs/upgrade.md +++ b/docs/upgrade.md @@ -2,7 +2,57 @@ This document describes changes that may affect users upgrading from previous versions. Read the section that matches the version you are upgrading **from** (not the version you are installing). -For a full list of v0.9 changes, see [CHANGELOG.md](https://github.com/agessaman/meshcore-bot/blob/main/CHANGELOG.md). +For the full release history, see [CHANGELOG.md](https://github.com/agessaman/meshcore-bot/blob/main/CHANGELOG.md). + +## Upgrading from v1.0.0 to v1.1.0 + +v1.1.0 adds features without removing or renaming the stable configuration, +command, service-plugin, or web-viewer interfaces introduced in v1.0.0. Existing +configuration files continue to work. Back up `config.ini`, `local/`, and the bot +database before upgrading, then use the normal installer or container update path. + +### Database + +Migration 23 adds nullable `snr` and `rssi` columns to `observed_paths`. The bot +applies it automatically and records it in `schema_version`; existing path rows and +rows without a direct RF measurement retain `NULL` values. The migration is +transactional and safe to run more than once. + +### Configuration and local extensions + +- `[Test_Command] distance_unit` controls printed path distances. Its default, + `auto`, uses miles for `en` and `en-US` replies and kilometres for other locales. +- `[PacketCapture] observer_name` can give MQTT payloads an observer identity that + differs from the connected MeshCore node name. Leaving it unset preserves the + v1.0.0 behavior. +- `[Localization] local_translation_path` loads operator-owned catalog overrides + from the configured local directory. Existing installations need no new file. +- `mqttN_keepalive` and `mqttN_jwt_reconnect_on_renew` control broker keepalive and + renewed-token reconnect behavior. Their defaults preserve ordinary brokers while + making expiring-token sessions reconnect before the broker rejects them. +- The Plugins page now discovers local commands and services and saves their new + sections to `local/config.ini`. A section already present in the base config keeps + its existing owner. + +### Behavior changes + +- Packet-capture `timestamp`, `date`, and `time` fields now describe the same UTC + instant. Consumers that interpreted `date` or `time` as host-local values must + switch to UTC. +- Airplanes uses `adsb.lol` by default because the former public endpoint rejects + unauthenticated clients. Existing `airplanes.live` defaults are remapped; custom + and local readsb URLs are unchanged. +- The web viewer's former Disconnect action is labelled Stop Bot and asks for + confirmation because the action terminates the process rather than only closing + the radio connection. +- Response templates support nested placeholders, quoted filter arguments, + `hops_min`, `shorten`, and `if_nonempty`. Existing templates retain their prior + syntax, and substituted values are not reparsed as template source. +- Scheduled messages can be edited in the web viewer and can include bounded + `{cmd:...}` output. Schedules using command output must leave at least 15 minutes + between runs. +- Proactive weather output, `!wx`, and `!gwx` share localized alert formatting. + Russian is included, and local catalogs can override individual strings. ## Upgrading from v0.8 → v0.9 @@ -15,11 +65,11 @@ v0.9 is a large release focused on operational reliability, observability, and d ### Config changes -- **Command aliases** — The global **`[Aliases]`** section is removed. Move each alias list to the corresponding command section as `aliases = stem1, stem2` (stems only; no command prefix). See [Configuration](configuration.md#per-command-aliases-v09). +- **Command aliases** — The global **`[Aliases]`** section is removed. Move each alias list to the corresponding command section as `aliases = stem1, stem2` (stems only; no command prefix). See [Configuration](configuration.md#command-specific-sections). - **`max_response_hops`** — Shipped config templates now default to **7** (was 10). The code fallback when unset is still 64. Review this if you relied on the old template default. - **New optional sections** (safe to omit): - - **`[Rate_Limits]`** — Per-channel minimum seconds between bot messages. See [Configuration](configuration.md#rate-limiting). - - **`[Webhook]`** — Inbound HTTP POST relay to channels or DMs. See [Configuration](configuration.md#inbound-webhook). + - **`[Rate_Limits]`** — Per-channel minimum seconds between bot messages. See [README](https://github.com/agessaman/meshcore-bot#per-channel-rate-limiting). + - **`[Webhook]`** — Inbound HTTP POST relay to channels or DMs. See [README](https://github.com/agessaman/meshcore-bot#inbound-webhook). - Radio reliability options under **`[Bot]`** (zombie-radio detection, send suppression during outages, etc.) — see `config.ini.example`. ### Database @@ -63,7 +113,7 @@ v0.9 is a large release focused on operational reliability, observability, and d ## Upgrading from v0.7 → v0.8 -If you are coming from v0.7 and skipping v0.8, also read [Upgrading from v0.8 → v0.9](#upgrading-from-v08--v09) above. +If you are coming from v0.7 and skipping v0.8, also read [Upgrading from v0.8 → v0.9](#upgrading-from-v08-v09) above. ### Path command and mesh graph diff --git a/pyproject.toml b/pyproject.toml index 48bb486..ef5db8e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -5,7 +5,7 @@ build-backend = "setuptools.build_meta" [project] name = "meshcore-bot" -version = "1.0.0" +version = "1.1.0" description = "MeshCore Bot with commands for mesh testing, utilities, and service integration." readme = "README.md" # Table form rather than the SPDX string form: the string form needs diff --git a/scripts/build-deb.sh b/scripts/build-deb.sh index b25b4d1..22d7b91 100755 --- a/scripts/build-deb.sh +++ b/scripts/build-deb.sh @@ -22,7 +22,7 @@ fi if [[ -z "${VERSION}" ]]; then echo "ERROR: Could not read the version from pyproject.toml" >&2 echo " Install tomli (Python 3.10) or pass the version explicitly:" >&2 - echo " ./scripts/build-deb.sh 1.0.0" >&2 + echo " ./scripts/build-deb.sh 1.1.0" >&2 exit 1 fi