mirror of
https://github.com/agessaman/MeshCore.git
synced 2026-07-10 04:01:38 +00:00
chore(github-actions): improve changelog generation and git history fetch
This commit is contained in:
@@ -8,6 +8,21 @@ on:
|
||||
push:
|
||||
branches:
|
||||
- mqtt-bridge-implementation-flex
|
||||
# Only rebuild firmware when something that affects the binaries changes.
|
||||
# Docs, the changelog, the changelog generator, and CI files do not change
|
||||
# firmware output — those are handled by sync-flasher-content.yml instead,
|
||||
# so editing them no longer produces new firmware hashes.
|
||||
paths-ignore:
|
||||
- '**.md'
|
||||
- 'docs/**'
|
||||
- 'scripts/gen_changelog.py'
|
||||
- '.github/**'
|
||||
|
||||
# Serialize with sync-flasher-content.yml so the two workflows never push to the
|
||||
# flasher repo at the same time (shared group name across both workflows).
|
||||
concurrency:
|
||||
group: flasher-publish
|
||||
cancel-in-progress: false
|
||||
|
||||
env:
|
||||
# Version embedded in firmware filenames; must match the version key in the
|
||||
@@ -94,6 +109,9 @@ jobs:
|
||||
steps:
|
||||
- name: Clone Repo
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
# full history so scripts/gen_changelog.py can read the branch commit log
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Download All Shard Artifacts
|
||||
uses: actions/download-artifact@v4
|
||||
@@ -146,6 +164,16 @@ jobs:
|
||||
"${{ steps.sha.outputs.short }}" \
|
||||
"$GITHUB_WORKSPACE/firmware-notes.html"
|
||||
|
||||
- name: Generate Changelog
|
||||
run: |
|
||||
# Append any new branch commits to the flasher's CHANGELOG.md. This is
|
||||
# append-only and idempotent: the hand-curated history and the hash
|
||||
# manifest already in flasher/CHANGELOG.md are preserved, and only
|
||||
# commits not yet listed are added. The flasher repo is the persistent
|
||||
# store of changelog state across builds; this checkout's git history
|
||||
# (fetch-depth: 0) is the source. changelog.html renders this file.
|
||||
python3 scripts/gen_changelog.py flasher/CHANGELOG.md
|
||||
|
||||
- name: Sync Docs into Flasher
|
||||
run: |
|
||||
# docs.html on the flasher site serves these raw .md files and renders
|
||||
|
||||
@@ -0,0 +1,76 @@
|
||||
name: Sync Flasher Docs & Changelog
|
||||
|
||||
# Pushes the observer docs and the regenerated changelog to the flasher site
|
||||
# WITHOUT rebuilding firmware. Companion to build-observer-firmwares.yml:
|
||||
# - code changes -> build-observer-firmwares.yml (builds + syncs everything)
|
||||
# - doc / markdown edits -> this workflow (fast sync only, no firmware rebuild)
|
||||
# Keep the synced file list and trigger paths in step with the build workflow's
|
||||
# "Sync Docs into Flasher" step and with LOCAL_DOCS in flasher/docs.html.
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
push:
|
||||
branches:
|
||||
- mqtt-bridge-implementation-flex
|
||||
paths:
|
||||
- '**.md'
|
||||
- 'docs/**'
|
||||
- 'scripts/gen_changelog.py'
|
||||
|
||||
# Shared with build-observer-firmwares.yml so the two never push to the flasher
|
||||
# repo concurrently (a mixed code+docs commit can trigger both).
|
||||
concurrency:
|
||||
group: flasher-publish
|
||||
cancel-in-progress: false
|
||||
|
||||
jobs:
|
||||
sync:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Clone Repo
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
# full history so scripts/gen_changelog.py can read the branch commit log
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Checkout Flasher Repo
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
repository: agessaman/flasher.meshcore.io
|
||||
token: ${{ secrets.FLASHER_DISPATCH_TOKEN }}
|
||||
path: flasher
|
||||
|
||||
- name: Sync Docs into Flasher
|
||||
run: |
|
||||
# docs.html on the flasher site serves these raw .md files and renders
|
||||
# them client-side; keep this list in sync with LOCAL_DOCS in
|
||||
# flasher/docs.html and the build workflow's sync step.
|
||||
for f in MQTT_IMPLEMENTATION.md MQTT_SNMP.md ALERTS.md; do
|
||||
if [ -f "$f" ]; then
|
||||
cp -f "$f" "flasher/$f"
|
||||
echo "synced $f"
|
||||
else
|
||||
echo "WARNING: source doc $f not found" >&2
|
||||
fi
|
||||
done
|
||||
|
||||
- name: Generate Changelog
|
||||
run: |
|
||||
# Append-only and idempotent; preserves the hand-curated history and
|
||||
# hash manifest already in flasher/CHANGELOG.md. changelog.html renders it.
|
||||
python3 scripts/gen_changelog.py flasher/CHANGELOG.md
|
||||
|
||||
- name: Commit & Push Flasher Content
|
||||
working-directory: flasher
|
||||
run: |
|
||||
if git diff --quiet; then
|
||||
echo "No flasher changes to commit."
|
||||
exit 0
|
||||
fi
|
||||
git config user.name "meshcore-bot"
|
||||
git config user.email "noreply@gessaman.com"
|
||||
git commit -am "Sync docs & changelog from MeshCore ${GITHUB_SHA::7}"
|
||||
git push
|
||||
@@ -20,3 +20,6 @@ venv/
|
||||
src/certs/x509_crt_bundle.bin
|
||||
ssl_certs/cacert.pem
|
||||
platformio.local.ini
|
||||
.cursor/*
|
||||
.claude/*
|
||||
.cursorrules
|
||||
+255
@@ -0,0 +1,255 @@
|
||||
# MeshCore Observer — Changelog
|
||||
|
||||
Changes to the MQTT observer / bridge work that powers the firmware offered on
|
||||
[flasher.meshcore.io](https://flasher.meshcore.io). Newest changes are at the top.
|
||||
|
||||
**Legend:** **New** = new capability · **Fix** = bug fix · **Improvement** = enhancement to
|
||||
existing behavior · **Internal** = refactor / under-the-hood · **Docs** = documentation ·
|
||||
**Build** / **CI** = build system & automation. **⬆ Upstream sync** marks a merge of the
|
||||
upstream MeshCore `dev` branch, which generally pulls in a new MeshCore software version.
|
||||
|
||||
### June 2026
|
||||
|
||||
- **New** — AlertReporter integration in MyMesh for Room Server <sub>2026-06-17 · `985fda13`</sub>
|
||||
- **Improvement** — Cumulative packet statistics (`packets_sent` / `packets_received`) added to the status message <sub>2026-06-16 · `8bf590b1`</sub>
|
||||
- **Improvement** — Packet path now published as an array of lowercase hex hop tokens <sub>2026-06-16 · `e80a5ded`</sub>
|
||||
- **CI** — Sync documentation files to the flasher site from the build workflow <sub>2026-06-16 · `0844eee1`</sub>
|
||||
- **CI** — Reworked the GitHub Actions workflow for rolling releases <sub>2026-06-08 · `8fa38707`</sub>
|
||||
- **New** — Radio Watchdog feature for the MQTT observer <sub>2026-06-08 · `002e8d4a`</sub>
|
||||
- **Improvement** — Firmware build-date format and UTC timestamps (always emit `+00:00`) <sub>2026-06-06 · `b45373a3`</sub>
|
||||
- **CI** — Build observer firmwares across 14 shards (up from 4) <sub>2026-06-06 · `c29ede05`</sub>
|
||||
- **CI** — Cache PlatformIO toolchains in CI <sub>2026-06-06 · `6723776f`</sub>
|
||||
- **CI** — Automated firmware builds via GitHub Actions <sub>2026-06-06 · `981ed246`</sub>
|
||||
- ⬆ **Upstream sync** — Synced with upstream MeshCore dev (brings MeshCore v1.16.0) <sub>2026-06-06 · `dcc8f826`</sub>
|
||||
|
||||
### May 2026
|
||||
|
||||
- **New** — NZ Analyzer MQTT preset <sub>2026-05-25 · `c0c845f5`</sub>
|
||||
- **Internal** — Region definition helpers; docs refresh <sub>2026-05-21 · `1296aa77`</sub>
|
||||
- **Docs** — Clarified WiFi configuration instructions (password optional for open networks) <sub>2026-05-21 · `38568eb1`</sub>
|
||||
- **Improvement** — Alert PSK access now restricted by sender timestamp <sub>2026-05-17 · `f717d673`</sub>
|
||||
- **Docs** — Trimmed the fault-alert section in the implementation guide <sub>2026-05-17 · `c41805d0`</sub>
|
||||
- **Change** — Renamed CLI command `region bulk` → `region def` <sub>2026-05-16 · `f3c6c348`</sub>
|
||||
- **Internal** — Timestamp handling in MQTTMessageBuilder <sub>2026-05-15 · `5a004f37`</sub>
|
||||
- **New** — T-LoRa V2.1–1.6 observer configurations <sub>2026-05-13 · `3cde9c10`</sub>
|
||||
- **Fix** · `mqtt` — Hardened the T-LoRa MQTT observer and trimmed MQTT task stack usage <sub>2026-05-13 · `daf9ee47`</sub>
|
||||
- **Internal** — Alert PSK handling is now hex-only <sub>2026-05-12 · `a8668840`</sub>
|
||||
- **Improvement** — Alert PSK accepts both base64 and hex <sub>2026-05-12 · `a865d0a3`</sub>
|
||||
- **New** · `cli` — Bulk region hierarchy command <sub>2026-05-12 · `19f95001`</sub>
|
||||
- **Improvement** — Path hash size included in AlertReporter flood messages <sub>2026-05-11 · `6a3ed5d4`</sub>
|
||||
- **New** — T-Beam 1W observer support and partition handling <sub>2026-05-11 · `fc99d6b3`</sub>
|
||||
- **Improvement** — Fault alerts gained region-based scoping and banned channels <sub>2026-05-11 · `16dc49fa`</sub>
|
||||
- **New** — Fault alerts for WiFi and MQTT disconnections <sub>2026-05-10 · `80355f32`</sub>
|
||||
- **New** — ColoradoMesh MQTT preset <sub>2026-05-10 · `08847342`</sub>
|
||||
- **New** — MQTT origin handling and a string utility <sub>2026-05-09 · `b9f478c9`</sub>
|
||||
- **Improvement** — Repeat status included in the MQTT status message <sub>2026-05-09 · `303cf8c2`</sub>
|
||||
- **Internal** — MQTT origin now uses effective-origin logic <sub>2026-05-09 · `ff031f48`</sub>
|
||||
- ⬆ **Upstream sync** — Synced with upstream MeshCore dev <sub>2026-05-09 · `b37db668`</sub>
|
||||
- **New** · `mqtt` — T-LoRa V2.1-1.6 observer environments <sub>2026-05-02 · `78e1500a`</sub>
|
||||
|
||||
### April 2026
|
||||
|
||||
- **Fix** · `mqtt` — Corrected ColoradoMesh preset details <sub>2026-04-30 · `9f8f2d05`</sub>
|
||||
- **New** · `platformio` — PSRAM support for the TBeam Supreme SX1262 variant <sub>2026-04-28 · `0b05aede`</sub>
|
||||
- **New** · `mqtt` — ColoradoMesh preset <sub>2026-04-28 · `457edf69`</sub>
|
||||
- **Fix** · `mqtt` — Added missing MQTTBridge error codes <sub>2026-04-27 · `5a5e5373`</sub>
|
||||
- **New** · `mqtt` — EastIdahoMesh preset and richer CLI preset listing <sub>2026-04-25 · `753eb72f`</sub>
|
||||
- **Fix** · `mqtt` — Removed errant `clearLastWill` from PsychicMqttClient <sub>2026-04-25 · `32449e62`</sub>
|
||||
- **Fix** · `mqtt` — Restored `origin` field position in packet messages <sub>2026-04-25 · `673361b6`</sub>
|
||||
- **Internal** · `mqtt` — Reorganized packet message structure <sub>2026-04-25 · `8be27e4e`</sub>
|
||||
- **Internal** · `mqtt` — Default TX packet settings and documentation <sub>2026-04-25 · `bfcf0176`</sub>
|
||||
- **New** · `platformio` — MQTT observer configs for the Heltec V4 expansion kit <sub>2026-04-24 · `0a4f002f`</sub>
|
||||
- **New** · `cli` — Radio watchdog command <sub>2026-04-24 · `7b21be3e`</sub>
|
||||
- **Internal** · `mqtt` — Standardized MQTT preset formatting <sub>2026-04-24 · `6211885c`</sub>
|
||||
- **Internal** · `heltec_tracker_v2` — Aligned FEM with meshcore-dev KCT8103L <sub>2026-04-24 · `0d280257`</sub>
|
||||
- **New** · `heltec_tracker_v2` — Restored LoRaFEMControl for GC1109 <sub>2026-04-24 · `255fce7f`</sub>
|
||||
- ⬆ **Upstream sync** — Synced with upstream MeshCore dev <sub>2026-04-24 · `c1989d6f`</sub>
|
||||
- **New** · `mqtt` — chimesh and meshat.se presets <sub>2026-04-24 · `ee4e39bc`</sub>
|
||||
- **Fix** · `mqtt` — Restored legacy outbox behavior for QoS0 async publishes <sub>2026-04-23 · `70722a58`</sub>
|
||||
- **Fix** · `mqtt` — Config marked dirty on setter calls; applied on connect/reconnect <sub>2026-04-23 · `bb67b04e`</sub>
|
||||
- **Improvement** · `mqtt` — Better QoS handling and retry logic <sub>2026-04-23 · `7d0c5bce`</sub>
|
||||
- **Internal** · `mqtt` — Removed legacy `mqtt.server`/`port`/`username`/`password` CLI <sub>2026-04-21 · `cfec3a5b`</sub>
|
||||
- **Fix** · `mqtt` — Legacy CLI aligned with slot prefs; restored `isConfigValid` <sub>2026-04-21 · `ac2662c5`</sub>
|
||||
- **Internal** — PsychicMqttClient memory management; fixed-size callback arrays (v0.2.2) <sub>2026-04-21 · `e9ff1ae0`</sub>
|
||||
- **Improvement** — MQTTBridge memory management, deferred logging, and QoS on publish <sub>2026-04-19 · `1ff9437f`</sub>
|
||||
- ⬆ **Upstream sync** — Synced with upstream MeshCore dev <sub>2026-04-19 · `563d9a7d`</sub>
|
||||
- **Build** — Disabled MQTT debug config for heltec_v4 builds <sub>2026-04-17 · `0ed29cb7`</sub>
|
||||
- **Change** — gitignore generated cert files; meshmapper timeout reset to 0 <sub>2026-04-17 · `ab121708`</sub>
|
||||
- **Change** — MeshMapper preset update; removed generated cert files <sub>2026-04-17 · `074ac3e7`</sub>
|
||||
- **Improvement** — Critical heap monitoring and deferred TLS; hard restart on prolonged low memory <sub>2026-04-17 · `f4a4fd7c`</sub>
|
||||
- **Internal** — Inline `StaticJsonDocument` allocations to reduce heap fragmentation <sub>2026-04-16 · `ab6685a1`</sub>
|
||||
- **New** — nashmesh preset <sub>2026-04-14 · `13fbcd91`</sub>
|
||||
- **Internal** — MQTTMessageBuilder takes an external JsonDocument to cut stack usage <sub>2026-04-14 · `ff2df2b7`</sub>
|
||||
- **Internal** — Removed the raw-data mutex in favor of core-specific staging <sub>2026-04-14 · `0c190dac`</sub>
|
||||
- **Improvement** — Radio watchdog avoids false alarms in quiet meshes <sub>2026-04-14 · `961f8293`</sub>
|
||||
- **New** — Radio diagnostics in MyMesh and CommonCLI <sub>2026-04-10 · `7e4f75c9`</sub>
|
||||
- **Improvement** — Internal heap stats in status messages <sub>2026-04-06 · `74e45a79`</sub>
|
||||
- **New** — TennMesh preset (fixed username/password auth) <sub>2026-04-05 · `3b46e9ee`</sub>
|
||||
- **Docs** — Single `set radio` command in the guide <sub>2026-04-04 · `1c524a93`</sub>
|
||||
- **Internal** — RX/TX packet logging controlled by MQTT settings (`mqtt_rx_enabled` pref) <sub>2026-04-04 · `47b632aa`</sub>
|
||||
- **Improvement** — Runtime-configurable MQTT slot limits based on PSRAM <sub>2026-04-04 · `258a0d72`</sub>
|
||||
- **Improvement** — Disconnect count/time diagnostics; per-variant WiFi TX power <sub>2026-04-02 · `f0962eff`</sub>
|
||||
|
||||
### March 2026
|
||||
|
||||
- **Improvement** — Pre-allocated status JSON buffer in PSRAM; non-blocking NTP refresh <sub>2026-03-31 · `cf4ec3f6`</sub>
|
||||
- **New** — WiFi disconnect diagnostics <sub>2026-03-31 · `0e82271e`</sub>
|
||||
- **Fix** — Audience command parsing handles the 9-character prefix <sub>2026-03-30 · `a4324a83`</sub>
|
||||
- **New** — JWT audience configuration for custom slots <sub>2026-03-30 · `1263e71d`</sub>
|
||||
- **Improvement** — Partition-table guidance, merged-firmware flashing, embedded CA bundle <sub>2026-03-30 · `da775bb2`</sub>
|
||||
- **Docs** — Removed obsolete MQTT design docs <sub>2026-03-28 · `384b80fc`</sub>
|
||||
- **Docs** — README links to the MQTT Implementation Guide <sub>2026-03-28 · `ff49d28f`</sub>
|
||||
- **New** — Optional SNMP monitoring; concurrent MQTT slots 3 → 5 <sub>2026-03-28 · `202acacf`</sub>
|
||||
- ⬆ **Upstream sync** — Synced with upstream MeshCore dev <sub>2026-03-28 · `cc17c6b7`</sub>
|
||||
- **New** — meshomatic preset; disable slots with no server configured <sub>2026-03-27 · `3eacf56e`</sub>
|
||||
- **Improvement** — Pre-allocated JSON publish buffer in PSRAM <sub>2026-03-26 · `47dd2182`</sub>
|
||||
- **New** — `reconnect()` added to PsychicMqttClient <sub>2026-03-25 · `1b5884bd`</sub>
|
||||
- **Improvement** — Lightweight JWT reconnect (token refresh without full teardown) <sub>2026-03-25 · `af52a989`</sub>
|
||||
- **Internal** — Full teardown/setup for JWT slots on reconnect <sub>2026-03-24 · `e29c3d96`</sub>
|
||||
- **Internal** — Standardized MQTT slot log format <sub>2026-03-24 · `2bbca206`</sub>
|
||||
- **New** — cascadiamesh preset; keepalive configuration <sub>2026-03-24 · `eaf5fcbc`</sub>
|
||||
- **Improvement** — Re-create JWT tokens when NTP reveals stale time <sub>2026-03-24 · `1c98d1c6`</sub>
|
||||
- **Internal** — Serial-availability checks before logging; circuit-breaker reconnect logic <sub>2026-03-23 · `4a60f166`</sub>
|
||||
- **New** — MeshRank preset (token auth, custom topic templates) <sub>2026-03-22 · `95874f0c`</sub>
|
||||
- **Fix** — Dynamic MQTTBridge allocation to avoid an ESP32 static-init crash <sub>2026-03-21 · `c67fb12b`</sub>
|
||||
- **Build** — Build script: cached project config, artifact handling, ESP32 binary merge <sub>2026-03-21 · `bf8a3a7a`</sub>
|
||||
- **Improvement** — Active connection slots limited by available memory (PSRAM-aware) <sub>2026-03-20 · `542f8a31`</sub>
|
||||
- **New** — Up to 3 configurable connection slots with built-in presets (LetsMesh US/EU, MeshMapper) <sub>2026-03-20 · `b43e9618`</sub>
|
||||
- ⬆ **Upstream sync** — Synced with upstream MeshCore dev <sub>2026-03-20 · `abe6e046`</sub>
|
||||
- **Change** — Stopped enabling MQTT analyzer servers by default in the example sketches <sub>2026-03-07 · `304719e8`</sub>
|
||||
- ⬆ **Upstream sync** — Synced with upstream MeshCore dev <sub>2026-03-06 · `db8b4419`</sub>
|
||||
- ⬆ **Upstream sync** — Synced with upstream MeshCore dev <sub>2026-03-04 · `56ac85fa`</sub>
|
||||
- ⬆ **Upstream sync** — Synced with upstream MeshCore dev <sub>2026-03-03 · `dcbbe5a6`</sub>
|
||||
|
||||
### February 2026
|
||||
|
||||
- ⬆ **Upstream sync** — Synced with upstream MeshCore dev (Packet.cpp fix) <sub>2026-02-26 · `8b359452`</sub>
|
||||
- **Internal** — Multibyte path handling in Packet / MQTTMessageBuilder <sub>2026-02-25 · `c8e220b1`</sub>
|
||||
- ⬆ **Upstream sync** — Synced with upstream MeshCore dev <sub>2026-02-25 · `51e9907f`</sub>
|
||||
- **Change** — Removed an unused preprocessor directive in MyMesh <sub>2026-02-25 · `ee1a9b4a`</sub>
|
||||
- ⬆ **Upstream sync** — Synced with upstream MeshCore dev <sub>2026-02-24 · `397a48fc`</sub>
|
||||
- **Improvement** — Keepalive set to 45s to hold WebSocket connections through Cloudflare <sub>2026-02-16 · `2d4b7a64`</sub>
|
||||
- **Build** — heltec_v4 uses the `heltec_v4_oled` config for observer / room-server <sub>2026-02-16 · `88ce0d33`</sub>
|
||||
- ⬆ **Upstream sync** — Synced with upstream MeshCore dev <sub>2026-02-15 · `e89cbee8`</sub>
|
||||
- **Improvement** — Simplified KISS noise-floor sampling <sub>2026-02-07 · `776131e2`</sub>
|
||||
- **Fix** · `kiss_modem` — Improved RX delivery and noise-floor sampling <sub>2026-02-06 · `f445b5ac`</sub>
|
||||
- **Improvement** — Better NTP synchronization in MQTTBridge <sub>2026-02-06 · `ba4243b5`</sub>
|
||||
- **Improvement** — WiFi management and fragmentation recovery <sub>2026-02-04 · `26aaace9`</sub>
|
||||
- **New** — PSRAM-backed memory management in MQTTBridge <sub>2026-02-04 · `1d0d33f9`</sub>
|
||||
- **New** — PSRAM diagnostics at MQTTBridge init <sub>2026-02-04 · `abcfe609`</sub>
|
||||
- **Build** — mbedTLS configuration tuned across variants <sub>2026-02-04 · `21158e1f`</sub>
|
||||
- **Fix** · `kiss` — Periodic noise-floor calibration and AGC reset <sub>2026-02-03 · `0fb57033`</sub>
|
||||
- **Fix** — Memory use and status reporting in the MQTT bridge <sub>2026-02-02 · `498566e6`</sub>
|
||||
|
||||
### January 2026
|
||||
|
||||
- **Internal** — Clarified packet ownership / memory management in MQTTBridge <sub>2026-01-31 · `f91b715e`</sub>
|
||||
- **New** — `recv_errors` in the `CMD_GET_STATS` packets response <sub>2026-01-29 · `019bbf74`</sub>
|
||||
- **New** — Receive-error tracking in Dispatcher and the message builder <sub>2026-01-29 · `ee577314`</sub>
|
||||
- **Fix** — Display header include for heltec_v4 when `DISPLAY_CLASS` is set directly <sub>2026-01-27 · `bb27cded`</sub>
|
||||
- ⬆ **Upstream sync** — Synced with upstream MeshCore dev <sub>2026-01-27 · `d96c900f`</sub>
|
||||
- ⬆ **Upstream sync** — Synced with upstream MeshCore dev <sub>2026-01-26 · `2a84e58b`</sub>
|
||||
- **Improvement** — MQTTBridge memory usage and NTP handling <sub>2026-01-24 · `9e1ce23e`</sub>
|
||||
- **Improvement** — MQTTBridge status handling and publish logic <sub>2026-01-23 · `c67c3295`</sub>
|
||||
- **Internal** — MQTTBridge connection handling for stability / responsiveness <sub>2026-01-22 · `c055228c`</sub>
|
||||
- ⬆ **Upstream sync** — Synced with upstream MeshCore dev <sub>2026-01-21 · `39ba020f`</sub>
|
||||
- **Internal** — MQTTBridge moved onto a FreeRTOS task for responsiveness <sub>2026-01-21 · `ed27ebd0`</sub>
|
||||
- **New** — Configurable WiFi power-save mode preference <sub>2026-01-18 · `56f98997`</sub>
|
||||
- **Internal** — HeltecTrackerV2 / HeltecV4 init for GC1109 FEM <sub>2026-01-13 · `3eaca31f`</sub>
|
||||
- **Docs** — Owner configuration commands documented <sub>2026-01-12 · `58cdd60c`</sub>
|
||||
- **Internal** — Advert timer type consistency in MyMesh / SensorMesh <sub>2026-01-08 · `ffa2a1ec`</sub>
|
||||
- **New** — Device metadata setup at bridge init / restart <sub>2026-01-03 · `2bd61c13`</sub>
|
||||
- **Internal** — Config validation allows optional username / password <sub>2026-01-03 · `d1093b43`</sub>
|
||||
- **Internal** — JWTHelper / MQTTBridge efficiency cleanup <sub>2026-01-02 · `e754317c`</sub>
|
||||
- **Fix** — MQTT connection stability and CLI responsiveness <sub>2026-01-02 · `98f176c7`</sub>
|
||||
- **New** — Neighbour-info sorting; MQTTBridge memory tuning <sub>2026-01-01 · `2185523d`</sub>
|
||||
|
||||
### December 2025
|
||||
|
||||
- **Docs** — WiFi power-save configuration documented <sub>2025-12-30 · `915f8b8e`</sub>
|
||||
- **Internal** — `loadPrefs` handles fresh installs and upgrades; migrates old prefs <sub>2025-12-30 · `8fa99611`</sub>
|
||||
- **Improvement** — Loop prioritizes radio RX for responsiveness <sub>2025-12-29 · `617e3b17`</sub>
|
||||
- **Internal** — Defer broker connect until WiFi + NTP ready; socket error logging <sub>2025-12-17 · `5d4f1e4c`</sub>
|
||||
- **Improvement** — Event-driven WiFi diagnostics and faster reconnect <sub>2025-12-12 · `f7f1f838`</sub>
|
||||
- **New** — WiFi power-save mode configuration (none / min / max) <sub>2025-12-08 · `34c8bea7`</sub>
|
||||
- **Fix** — LPS22HB pressure now reported in hPa (was kPa) <sub>2025-12-08 · `b91b854a`</sub>
|
||||
- **New** — WiFi TX power configuration (default 11 dBm) <sub>2025-12-07 · `b82d7e43`</sub>
|
||||
- **New** — Default bridge settings for fresh installs; JSON reuse to avoid fragmentation <sub>2025-12-07 · `0b7c0888`</sub>
|
||||
- **Improvement** — MQTT debug macros check Serial to prevent hangs <sub>2025-12-06 · `3589043b`</sub>
|
||||
- **Change** — Removed redundant settings writes in `savePrefs` <sub>2025-12-04 · `03d519f8`</sub>
|
||||
- **Build** — Source filter for the Xiao S3 WIO variant <sub>2025-12-01 · `4f548ffc`</sub>
|
||||
|
||||
### November 2025
|
||||
|
||||
- **New** — `adc_multiplier` added to NodePrefs <sub>2025-11-23 · `8fbdc98a`</sub>
|
||||
- **Change** — IATA codes uppercased for consistency <sub>2025-11-23 · `5cadf3d9`</sub>
|
||||
- **Change** — `CMD_GET_STATS` split into core / radio / packet sub-types <sub>2025-11-17 · `a3c9a073`</sub>
|
||||
- **New** — IP address shown for MQTT bridge devices in UITask <sub>2025-11-16 · `6b0c0e93`</sub>
|
||||
- **New** — T-Beam ESP32 support; error log when source = tx but TX logging is off <sub>2025-11-16 · `3c7ac9d1`</sub>
|
||||
- **Build** — `MQTT_DEBUG` enabled for several build configs <sub>2025-11-16 · `3726c472`</sub>
|
||||
- **New** — MQTT observer support for Room Servers <sub>2025-11-15 · `0cd0c36a`</sub>
|
||||
- **Change** — Switched MQTT configs to observer mode across variants <sub>2025-11-13 · `304a32db`</sub>
|
||||
- **Internal** — Client version string generation <sub>2025-11-13 · `aa242e78`</sub>
|
||||
- **Improvement** — WiFi power-save + reduced TX power to limit LoRa interference; retry fix when no brokers connected <sub>2025-11-10 · `bafa5426`</sub>
|
||||
- **Internal** — Statistics use binary frames instead of JSON <sub>2025-11-09 · `80d6dd43`</sub>
|
||||
- **New** — IATA validation blocks publishing without an IATA code <sub>2025-11-08 · `25d40f02`</sub>
|
||||
- **Fix** — Restored status-publish retry delay to prevent server spam <sub>2025-11-08 · `9e06fffc`</sub>
|
||||
- **New** — Added missing token-expiration / reconnection member variables <sub>2025-11-08 · `453c4184`</sub>
|
||||
- **Change** — Removed WiFi credentials from platformio.ini (use CLI / build flags) <sub>2025-11-08 · `921c6112`</sub>
|
||||
- **Internal** — MQTT preferences handling in CommonCLI <sub>2025-11-08 · `5a816be8`</sub>
|
||||
- **Internal** — `formatStatsReply` uses the new member variables <sub>2025-11-08 · `c9aa536c`</sub>
|
||||
- **Build** — Explicit `paulstoffregen/Time` dependency to fix PIO compile <sub>2025-11-07 · `72ca50b9`</sub>
|
||||
- **Build** — Dropped the CayenneLPP patch script; updated ArduinoJson <sub>2025-11-07 · `fef9225b`</sub>
|
||||
- **Fix** — Timezone command parsing lengths corrected <sub>2025-11-07 · `b89ceeea`</sub>
|
||||
- **New** — Statistics commands and response handling in MyMesh <sub>2025-11-07 · `df4dab85`</sub>
|
||||
- **New** — MQTT email support in CommonCLI / JWTHelper <sub>2025-11-06 · `1ed18f9e`</sub>
|
||||
- **New** — MQTT owner public-key support <sub>2025-11-06 · `e5dbd56b`</sub>
|
||||
- **Improvement** — Status reporting and stats collection <sub>2025-11-01 · `e4ff06cb`</sub>
|
||||
|
||||
### October 2025
|
||||
|
||||
- **Improvement** — MQTTBridge logging and connection handling <sub>2025-10-31 · `7df28557`</sub>
|
||||
- **Improvement** — Packet handling and memory management in MQTTMessageBuilder / MQTTBridge <sub>2025-10-31 · `eee02025`</sub>
|
||||
- **New** — Memory monitoring and queue-size reporting <sub>2025-10-29 · `e77beff0`</sub>
|
||||
- **Internal** — In-place base64url encoding; cleanup frees queued packets / timezone objects <sub>2025-10-27 · `1219668f`</sub>
|
||||
- **Change** — Defer MQTT connect until WiFi credentials are valid (requires reboot) <sub>2025-10-27 · `3851a84b`</sub>
|
||||
- **Improvement** — Dynamic build date and client versioning <sub>2025-10-26 · `c23663da`</sub>
|
||||
- **New** — CLI config for `mqtt.server` / `username` / `password` / `port` <sub>2025-10-26 · `eab70c3c`</sub>
|
||||
- **New** — Let's Mesh Analyzer integration <sub>2025-10-26 · `a6453556`</sub>
|
||||
- **New** — Station G2 repeater bridge build target; docs <sub>2025-10-26 · `f6a77d2f`</sub>
|
||||
- **New** — Timezone handling; raw-data packet output with proper hashes / timestamps <sub>2025-10-25 · `787af7b0`</sub>
|
||||
- **New** — Timezone support in the MQTT Bridge and CLI <sub>2025-10-25 · `26c4b970`</sub>
|
||||
- **New** — Initial MQTT Bridge implementation with WiFi CLI configuration <sub>2025-10-25 · `efc15eb6`</sub>
|
||||
|
||||
<!-- gen_changelog:hashes — auto-maintained list of every processed commit; do not edit by hand
|
||||
985fda13 8bf590b1 e80a5ded 0844eee1 8fa38707 002e8d4a b45373a3 c29ede05
|
||||
6723776f 981ed246 dcc8f826 c0c845f5 1296aa77 38568eb1 c41805d0 f717d673
|
||||
f3c6c348 5a004f37 3cde9c10 daf9ee47 a8668840 a865d0a3 19f95001 6a3ed5d4
|
||||
fc99d6b3 16dc49fa 80355f32 08847342 b9f478c9 303cf8c2 ff031f48 b37db668
|
||||
78e1500a 9f8f2d05 0b05aede 457edf69 5a5e5373 753eb72f 32449e62 673361b6
|
||||
8be27e4e bfcf0176 0a4f002f 7b21be3e 6211885c 0d280257 255fce7f c1989d6f
|
||||
ee4e39bc 70722a58 bb67b04e 7d0c5bce cfec3a5b ac2662c5 d6712c69 e9ff1ae0
|
||||
1ff9437f 563d9a7d 0ed29cb7 ab121708 074ac3e7 f4a4fd7c ab6685a1 13fbcd91
|
||||
ff2df2b7 0c190dac 961f8293 7e4f75c9 74e45a79 3b46e9ee 1c524a93 47b632aa
|
||||
258a0d72 f0962eff cf4ec3f6 0e82271e a4324a83 1263e71d da775bb2 384b80fc
|
||||
ff49d28f 202acacf cc17c6b7 3eacf56e 47dd2182 1b5884bd af52a989 e29c3d96
|
||||
2bbca206 eaf5fcbc 1c98d1c6 4a60f166 95874f0c c67fb12b bf8a3a7a 542f8a31
|
||||
b43e9618 abe6e046 22eb9b87 2b637655 304719e8 db8b4419 56ac85fa dcbbe5a6
|
||||
8b359452 c8e220b1 51e9907f ee1a9b4a 397a48fc 2d4b7a64 88ce0d33 e89cbee8
|
||||
776131e2 f445b5ac ba4243b5 26aaace9 1d0d33f9 abcfe609 21158e1f 0fb57033
|
||||
498566e6 f91b715e 019bbf74 ee577314 bb27cded d96c900f 066df192 2c99967c
|
||||
2a84e58b 9e1ce23e c67c3295 c055228c 39ba020f ed27ebd0 56f98997 3eaca31f
|
||||
58cdd60c ffa2a1ec 2bd61c13 d1093b43 e754317c 98f176c7 2185523d 915f8b8e
|
||||
8fa99611 617e3b17 5d4f1e4c f7f1f838 34c8bea7 b82d7e43 0b7c0888 3589043b
|
||||
03d519f8 4f548ffc 8fbdc98a 5cadf3d9 3726c472 6b0c0e93 3c7ac9d1 158748d4
|
||||
44c24515 304a32db aa242e78 bafa5426 25d40f02 9e06fffc 3feb2cd5 ad68a29f
|
||||
cf3a9c31 453c4184 b04a1a1d 0de7da84 921c6112 c5e2f18d 5a816be8 72ca50b9
|
||||
fef9225b b89ceeea 1ed18f9e e5dbd56b e4ff06cb 7df28557 e77beff0 eee02025
|
||||
2b047599 1219668f 3851a84b eab70c3c c23663da a6453556 f6a77d2f 787af7b0
|
||||
26c4b970 efc15eb6 0cd0c36a bffbbb76 72811df6 a3875d87 dd9edbde a4aace61
|
||||
09bc9cbc 4d7282c3 77169810 c0c56039 c36aac9a b15912fe 76a5caa0 a0e14f4b
|
||||
2876ea6e ca55c9bf 97815834 fbc499e7 39850fa4 a8474c7c 8f34d966 8ca969be
|
||||
9352db1e 08fb3046 ea134e43 46041130 8261633c bba6d896 58b73343 ed70ceb2
|
||||
180c1d49 e9fe66c1 f39d2299 91cc4f50 ee6a7565 b91b854a a3c9a073 39f83efb
|
||||
80d6dd43 c9aa536c df4dab85
|
||||
-->
|
||||
@@ -0,0 +1,171 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Append new branch commits to CHANGELOG.md, newest-first, grouped by month.
|
||||
|
||||
Usage:
|
||||
gen_changelog.py [path/to/CHANGELOG.md] (default: repo-root/CHANGELOG.md)
|
||||
|
||||
Design notes
|
||||
------------
|
||||
The hand-curated history at the top of CHANGELOG.md is never rewritten. This
|
||||
script is **append-only and idempotent**: it reads the set of commit hashes
|
||||
already accounted for (from the ``gen_changelog:hashes`` manifest comment at the
|
||||
bottom of the file, plus any hash cited inline), then inserts only commits not
|
||||
yet present.
|
||||
|
||||
"Branch work" is defined as non-merge commits authored by ``agessaman`` (the
|
||||
deterministic filter that matches how the changelog was framed). Merges of the
|
||||
upstream MeshCore ``dev`` branch are surfaced as "Upstream sync" markers; all
|
||||
other merges and pure rebase artifacts are recorded in the manifest but not
|
||||
shown.
|
||||
|
||||
New entries clean up best when commits follow ``type(scope): subject``
|
||||
(feat/fix/refactor/...); free-form subjects fall back to a trimmed, as-written
|
||||
summary. If nothing new is found the file is left byte-for-byte untouched.
|
||||
"""
|
||||
import re
|
||||
import subprocess
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
AUTHOR = "agessaman"
|
||||
DEFAULT = Path(__file__).resolve().parent.parent / "CHANGELOG.md"
|
||||
|
||||
MONTHS = ["", "January", "February", "March", "April", "May", "June", "July",
|
||||
"August", "September", "October", "November", "December"]
|
||||
|
||||
TYPE_LABEL = {"feat": "New", "fix": "Fix", "enhance": "Improvement",
|
||||
"refactor": "Internal", "perf": "Performance", "docs": "Docs",
|
||||
"chore": "Change", "build": "Build", "ci": "CI", "style": "Internal"}
|
||||
|
||||
VERB_LABEL = [
|
||||
(r"^(add|added|implement|introduce|enable|restore|create|support)\b", "New"),
|
||||
(r"^(fix|fixed|correct|resolve)\b", "Fix"),
|
||||
(r"^(enhance|improve|improved|optimize|increase|simplify|streamline)\b", "Improvement"),
|
||||
(r"^(refactor)\b", "Internal"),
|
||||
(r"^(document|docs)\b", "Docs"),
|
||||
]
|
||||
|
||||
CC = re.compile(r"^(\w+)(?:\(([^)]*)\))?(!)?:\s*(.*)$")
|
||||
UPSTREAM_MERGE = re.compile(r"[Mm]erge.*(?:upstream|origin)/dev")
|
||||
# rebase / merge artifacts that should never appear in the visible log
|
||||
NOISE = re.compile(r"conflict marker|duplicate (?:mqtt )?function|unnecessary comments"
|
||||
r"|from rebase|^revert |whoops|^remove final|^remove remaining", re.I)
|
||||
HASH_TOKEN = re.compile(r"·\s*`([0-9a-f]{7,40})`")
|
||||
MANIFEST_HASH = re.compile(r"\b[0-9a-f]{7,40}\b")
|
||||
|
||||
|
||||
def clean(subj: str) -> str:
|
||||
s = subj.strip().lstrip("* ").strip()
|
||||
s = re.split(r"(?<=[.!?])\s+", s)[0].rstrip(". ")
|
||||
if len(s) > 140:
|
||||
s = s[:137].rstrip() + "…"
|
||||
return s[:1].upper() + s[1:] if s else s
|
||||
|
||||
|
||||
def label_for(typ, summary):
|
||||
if typ and typ.lower() in TYPE_LABEL:
|
||||
return TYPE_LABEL[typ.lower()]
|
||||
for pat, lab in VERB_LABEL:
|
||||
if re.match(pat, summary, re.I):
|
||||
return lab
|
||||
return "Change"
|
||||
|
||||
|
||||
def git_commits():
|
||||
out = subprocess.run(
|
||||
["git", "log", f"--author={AUTHOR}", "--pretty=format:%h%x09%ad%x09%p%x09%s",
|
||||
"--date=short"],
|
||||
capture_output=True, text=True, check=True).stdout.splitlines()
|
||||
rows = []
|
||||
for ln in out:
|
||||
h, date, parents, subj = ln.split("\t", 3)
|
||||
rows.append((h, date, len(parents.split()) > 1, subj))
|
||||
return rows
|
||||
|
||||
|
||||
def render(h, date, is_merge, subj):
|
||||
"""Return a markdown bullet, or None if the commit should be hidden."""
|
||||
if is_merge:
|
||||
if UPSTREAM_MERGE.search(subj):
|
||||
ver = re.search(r"v\d+\.\d+\.\d+", subj)
|
||||
tail = f" ({ver.group()})" if ver else ""
|
||||
return f"- ⬆ **Upstream sync** — Synced with upstream MeshCore dev{tail} <sub>{date} · `{h}`</sub>"
|
||||
return None
|
||||
if NOISE.search(subj):
|
||||
return None
|
||||
m = CC.match(subj)
|
||||
if m:
|
||||
typ, scope, _, rest = m.groups()
|
||||
summary = clean(rest)
|
||||
else:
|
||||
typ = scope = None
|
||||
summary = clean(subj)
|
||||
sc = f" · `{scope}`" if scope else ""
|
||||
return f"- **{label_for(typ, summary)}**{sc} — {summary} <sub>{date} · `{h}`</sub>"
|
||||
|
||||
|
||||
def insert_entry(lines, date, bullet):
|
||||
"""Insert a rendered bullet at the top of its month section (creating it)."""
|
||||
y, mo, _ = date.split("-")
|
||||
heading = f"### {MONTHS[int(mo)]} {y}"
|
||||
# existing section: insert as the first bullet (after heading + blank lines)
|
||||
for i, ln in enumerate(lines):
|
||||
if ln.rstrip() == heading:
|
||||
j = i + 1
|
||||
while j < len(lines) and not lines[j].startswith("- "):
|
||||
j += 1
|
||||
lines.insert(j, bullet)
|
||||
return
|
||||
# new (newer) month: place its section above the first existing section
|
||||
for i, ln in enumerate(lines):
|
||||
if ln.startswith("### "):
|
||||
lines[i:i] = [heading, "", bullet, ""]
|
||||
return
|
||||
raise SystemExit("no '### Month Year' section found; is this a CHANGELOG.md?")
|
||||
|
||||
|
||||
def main():
|
||||
path = Path(sys.argv[1]) if len(sys.argv) > 1 else DEFAULT
|
||||
text = path.read_text()
|
||||
lines = text.split("\n")
|
||||
|
||||
m = re.search(r"<!--\s*gen_changelog:hashes.*?-->", text, re.S)
|
||||
if not m:
|
||||
sys.exit("manifest block '<!-- gen_changelog:hashes ... -->' not found")
|
||||
known = set(MANIFEST_HASH.findall(m.group(0)))
|
||||
known |= set(HASH_TOKEN.findall(text))
|
||||
|
||||
# oldest-first so that inserting each at the top of its section keeps newest on top
|
||||
new = [(h, date, mg, subj) for (h, date, mg, subj) in git_commits()
|
||||
if h not in known]
|
||||
new.reverse()
|
||||
if not new:
|
||||
print("CHANGELOG.md already up to date.")
|
||||
return
|
||||
|
||||
manifest_idx = next(i for i, ln in enumerate(lines) if ln.rstrip() == "-->"
|
||||
and "gen_changelog:hashes" in "\n".join(lines[max(0, i - 40):i]))
|
||||
body = lines[:manifest_idx]
|
||||
tail = lines[manifest_idx:]
|
||||
|
||||
added = []
|
||||
for h, date, is_merge, subj in new:
|
||||
bullet = render(h, date, is_merge, subj)
|
||||
if bullet:
|
||||
insert_entry(body, date, bullet)
|
||||
added.append(h) # record every processed hash, shown or not
|
||||
|
||||
# append newly processed hashes to the manifest (just before the closing -->)
|
||||
tail.insert(len(tail) - 1, " ".join(added))
|
||||
|
||||
out = "\n".join(body + tail)
|
||||
if "### " not in out:
|
||||
sys.exit("refusing to write: output has no month sections")
|
||||
path.write_text(out)
|
||||
shown = sum(1 for h, d, mg, s in new if render(h, d, mg, s))
|
||||
print(f"added {len(added)} commit(s) to {path.name} "
|
||||
f"({shown} shown, {len(added) - shown} recorded silently)")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user