feat: add mosquitto + zigbee2mqtt dependency pair #3

Open
daniel wants to merge 1 commit from feat/mqtt-dependency-pair into main
Owner

First catalog apps to exercise core 26.17's app-to-app dependency feature — until now every catalog app was standalone.

Apps

  • mosquitto — MQTT broker, first dependency provider. Mandatory auth; per-consumer accounts created by on_install/on_start hooks (scripts/provision-client.sh, scripts/ensure-client.sh) that run inside the broker container via docker compose exec. Provider-side password stash so on_start can restore an account after a volume wipe; ensure-client.sh prefers the FURTKA_CONSUMER_ENV_MQTT_PASS that post-26.17 core injects and falls back to the stash on 26.17.
  • zigbee2mqtt — first dependency consumer. requires mosquitto; MQTT creds wired in from the provisioning hook via ZIGBEE2MQTT_CONFIG_* env. Serial coordinator path as a text setting + devices mapping.

Supporting changes

  • Bump vendored furtka_manifest.py (26.10-era -> 26.17) so the validator actually validates the requires schema instead of silently ignoring it.
  • Document requires/hooks in apps/README.md (was undocumented), including the three framework gaps building this pair surfaced.
  • CI now shellchecks app hook scripts (apps/*/scripts/*.sh), not just repo-root scripts/.

Validation

Local: JSON, validate-catalog.py (7/7), YAML parse, requires parsing, sh -n on hooks. docker compose config + shellcheck run in CI (no Docker/shellcheck on the dev box). Real on-VM end-to-end pending; zigbee2mqtt needs a physical Zigbee coordinator to fully start, but the MQTT-credential handshake is observable without one.

Depends on (but does not require, thanks to the stash fallback) daniel/furtka#13.

First catalog apps to exercise core 26.17's app-to-app dependency feature — until now every catalog app was standalone. ## Apps - **mosquitto** — MQTT broker, first dependency *provider*. Mandatory auth; per-consumer accounts created by `on_install`/`on_start` hooks (`scripts/provision-client.sh`, `scripts/ensure-client.sh`) that run inside the broker container via `docker compose exec`. Provider-side password stash so `on_start` can restore an account after a volume wipe; `ensure-client.sh` prefers the `FURTKA_CONSUMER_ENV_MQTT_PASS` that post-26.17 core injects and falls back to the stash on 26.17. - **zigbee2mqtt** — first dependency *consumer*. `requires` mosquitto; MQTT creds wired in from the provisioning hook via `ZIGBEE2MQTT_CONFIG_*` env. Serial coordinator path as a `text` setting + `devices` mapping. ## Supporting changes - Bump vendored `furtka_manifest.py` (26.10-era -> 26.17) so the validator actually validates the `requires` schema instead of silently ignoring it. - Document `requires`/hooks in `apps/README.md` (was undocumented), including the three framework gaps building this pair surfaced. - CI now shellchecks app hook scripts (`apps/*/scripts/*.sh`), not just repo-root `scripts/`. ## Validation Local: JSON, `validate-catalog.py` (7/7), YAML parse, `requires` parsing, `sh -n` on hooks. `docker compose config` + shellcheck run in CI (no Docker/shellcheck on the dev box). Real on-VM end-to-end pending; zigbee2mqtt needs a physical Zigbee coordinator to fully start, but the MQTT-credential handshake is observable without one. Depends on (but does not require, thanks to the stash fallback) daniel/furtka#13.
daniel added 1 commit 2026-05-28 23:47:22 +02:00
feat: add mosquitto + zigbee2mqtt dependency pair
All checks were successful
CI / validate (pull_request) Successful in 6s
CI / shellcheck (pull_request) Successful in 13s
3408e1aad8
First catalog apps to exercise core 26.17's app-to-app dependency
feature — until now every app was standalone.

- mosquitto: MQTT broker, first dependency *provider*. Mandatory auth;
  per-consumer accounts created by on_install/on_start hooks
  (scripts/provision-client.sh, scripts/ensure-client.sh) that run inside
  the broker container via `docker compose exec`. Provider-side password
  stash so on_start can restore an account after a volume wipe.
- zigbee2mqtt: first dependency *consumer*. `requires` mosquitto; MQTT
  creds wired in from the provisioning hook via ZIGBEE2MQTT_CONFIG_* env.
  Serial coordinator path as a text setting + devices mapping.

Supporting changes:
- Bump vendored furtka_manifest.py (26.10-era -> 26.17) so the validator
  actually validates the `requires` schema instead of ignoring it.
- Document `requires`/hooks in apps/README.md (was undocumented), including
  the three framework gaps building this pair surfaced.
- CI now shellchecks app hook scripts (apps/*/scripts/*.sh), not just
  repo-root scripts/.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
All checks were successful
CI / validate (pull_request) Successful in 6s
CI / shellcheck (pull_request) Successful in 13s
This pull request can be merged automatically.
You are not authorized to merge this pull request.
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin feat/mqtt-dependency-pair:feat/mqtt-dependency-pair
git checkout feat/mqtt-dependency-pair

Merge

Merge the changes and update on Forgejo.

Warning: The "Autodetect manual merge" setting is not enabled for this repository, you will have to mark this pull request as manually merged afterwards.

git checkout main
git merge --no-ff feat/mqtt-dependency-pair
git checkout feat/mqtt-dependency-pair
git rebase main
git checkout main
git merge --ff-only feat/mqtt-dependency-pair
git checkout feat/mqtt-dependency-pair
git rebase main
git checkout main
git merge --no-ff feat/mqtt-dependency-pair
git checkout main
git merge --squash feat/mqtt-dependency-pair
git checkout main
git merge --ff-only feat/mqtt-dependency-pair
git checkout main
git merge feat/mqtt-dependency-pair
git push origin main
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: daniel/furtka-apps#3
No description provided.