chore(release): prepare v1.1.0

This commit is contained in:
agessaman
2026-09-14 20:47:09 -07:00
parent 7425fd262a
commit 98893a4e4f
11 changed files with 93 additions and 24 deletions
+1 -1
View File
@@ -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
+25 -6
View File
@@ -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
+5 -5
View File
@@ -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._
+1 -1
View File
@@ -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)
+1 -1
View File
@@ -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`:
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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"`.
+1 -1
View File
@@ -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
+55 -5
View File
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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