Skip to content

[no-release] feat(menu): group Plugins ▸ Matter into five sections (#134) - #144

Merged
simons-plugins merged 4 commits into
mainfrom
feat/134-menu-sections
Aug 6, 2026
Merged

[no-release] feat(menu): group Plugins ▸ Matter into five sections (#134)#144
simons-plugins merged 4 commits into
mainfrom
feat/134-menu-sections

Conversation

@simons-plugins

@simons-plugins simons-plugins commented Aug 6, 2026

Copy link
Copy Markdown
Owner

Closes #134.

The problem

Sixteen flat menu items in creation order. Install/update matter-server was
first, Install/update the Matter export bridge twelfth — and on 2026-08-06 the
wrong one was clicked live, reinstalling the inbound controller and bouncing it
when the outbound bridge was meant. They are separately versioned, separately
installed npm packages.

Separators exist — the docs just don't say so

The canonical MenuItems.xml reference lists <Name> as required and
documents neither separators nor submenus. It is incomplete: an empty,
self-closing <MenuItem id="…"/> renders as a separator
.

This is not a hack of ours. Perceptive Automation's own bundled plugins use it
(Timers and Pesters, Timed Devices, Virtual Devices, Alexa),
Actions.xml takes the same form (<Action id="sep1" uiPath="DeviceActions"/>),
and 15 of the plugins installed on jarvis rely on it.

The layout

Everyday work first, destructive things fenced off last:

Commission device by setup code (advanced)…      1 · devices Indigo controls
Decommission Matter device…
─────────────────────────
Manage Matter Exports…                           2 · devices Indigo publishes
Pair Matter Bridge…
Unpair an Ecosystem…
─────────────────────────
Install/update matter-server                     3 · matter-server plumbing
Restart matter-server
Reinstall matter-server (clean)…
Open matter-server log…
─────────────────────────
Install/update the Matter export bridge          4 · export-bridge plumbing
Reinstall the Matter export bridge (clean)…
Stop the Matter export bridge…
─────────────────────────
Back up the Matter fabric…                       5 · backup and recovery
Restore a fabric backup…
Rebuild Matter Endpoint Map…
Reset Matter Export Pairings…

The two Install/update items are now in different sections, not merely
adjacent.

Renames

Only one pair, because "Export" meant save-to-disk in a menu where it means the
outbound bridge everywhere else:

Before After
Export fabric backup… Back up the Matter fabric…
Restore fabric backup… Restore a fabric backup…

Menu ids and callback methods are unchanged, so no Python moved.
spec.install_menu_name still resolves to a real <Name>test_bridge_agent.py
already pinned that and still passes.

Nothing else changed

Every ConfigUI was compared field-by-field against HEAD — attributes, labels,
descriptions, titles, list methods, callbacks. Byte-identical. The only
content edits are the two names above.

Tests

2256 Python (from 2252), pylint 9.42 unchanged. The four new tests assert
the order and the separator positions, not membership — a set-based check
would pass with all sixteen items back in one flat list, which is the state they
exist to prevent.

Mutation-verified: deleting the four separators, and deleting only
sepServerFromBridge so the two install sections merge, each fail exactly three
layout tests and nothing else.

Docs

INSTALL.md gains a five-section menu table under Overview (plus a Contents
entry); the renamed items are updated there and in MATTER.md / matter.html.

Deliberately out of scope

Version bumped 2026.8.42026.8.5 (patch: user-visible, but not a feature).

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features
    • Reorganized the Matter menu into five clearly separated sections.
    • Added controls for bridge cleanup, endpoint-map rebuilding, and export-pairing reset.
    • Clarified fabric backup and restore actions, including backup coverage and restore limitations.
    • Updated deployment documentation, including simultaneous Apple Home and Alexa support and export v1 availability.
  • Bug Fixes
    • Improved menu labeling and ordering for easier navigation.
  • Documentation
    • Updated installation, Matter, troubleshooting, and project handover documentation.
  • Chores
    • Updated the plugin version to 2026.8.5.

simons-plugins and others added 3 commits August 6, 2026 14:53
Carries over the uncommitted working-tree state from the 2026-08-06 #143
session: the Alexa stale-state investigation (both defects, the withdrawn
born-vs-changed verdict, the three blind alleys) and the post-#142 header.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The menu was sixteen flat items in creation order. "Install/update
matter-server" sat first and "Install/update the Matter export bridge"
twelfth, and the wrong one was clicked live on 2026-08-06 — reinstalling
the inbound controller and bouncing it when the outbound bridge was
meant. They are separately versioned, separately installed npm packages.

Separators ARE available, contrary to the canonical MenuItems.xml
reference, which lists <Name> as required and documents neither
separators nor submenus: an EMPTY, self-closing <MenuItem id="…"/>
renders as one. That is not a hack of ours — Perceptive Automation's own
bundled plugins do it (Timers and Pesters, Timed Devices, Virtual
Devices, Alexa), Actions.xml uses the same form, and fifteen of the
plugins installed on jarvis rely on it.

Five sections, everyday work first and the destructive things fenced off
last: devices Indigo controls · devices Indigo publishes · matter-server
plumbing · export-bridge plumbing · backup and recovery. The two
Install/update items now sit in different sections.

Renamed, because "Export" meant save-to-disk in a menu where it means the
outbound bridge everywhere else:

    Export fabric backup…   →  Back up the Matter fabric…
    Restore fabric backup…  →  Restore a fabric backup…

Callback methods, menu ids and every ConfigUI are unchanged — verified
field-by-field against HEAD, dialogs byte-identical.

The ordering IS the change, so the tests assert the order and the
separator positions, not membership: a set-based check would pass with
all sixteen items back in one flat list. Mutation-verified — deleting the
separators, and merging the two install sections, each fail three tests.

2256 Python tests pass (from 2252), pylint 9.42 unchanged.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Records the finding that outlives the change: the canonical MenuItems.xml
reference is the authority on what is supported, not on what works — an
empty self-closing <MenuItem/> is a separator, evidenced by four bundled
Perceptive Automation plugins and 15 installs on jarvis.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Aug 6, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

The plugin menu is reorganized into five sections with new recovery actions and ordering tests. Documentation uses updated backup terminology. The handover and plugin version records reflect current project status.

Changes

Matter menu and documentation

Layer / File(s) Summary
Five-section menu structure and validation
indigo-matter.indigoPlugin/Contents/Server Plugin/MenuItems.xml, tests/test_plugin_module.py, docs/HANDOVER.md
The menu now has five ordered sections, separators, recovery actions, confirmation controls, and updated backup labels. Tests validate section order and unique IDs.
Menu reference and backup terminology
docs/INSTALL.md, docs/MATTER.md, docs/matter.html
Documentation describes the five menu sections and uses the updated backup and restore labels.
Project status and plugin version records
indigo-matter.indigoPlugin/Contents/Info.plist, docs/HANDOVER.md
The plugin version changes to 2026.8.5. The handover records release status and the current issue investigation.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Out of Scope Changes check ⚠️ Warning The handover adds unrelated investigations for issues #143 and #140, which are outside the scope of #134. Remove the unrelated #143 and #140 investigation details from this pull request or move them to a separate documentation change.
✅ Passed checks (4 passed)
Check name Status Explanation
Linked Issues check ✅ Passed The changes satisfy #134 by separating the matter-server and export-bridge installation actions into distinct, clearly labeled menu sections.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and specifically summarizes the main change: reorganizing menu items into five sections to address issue #134, which is directly supported by the PR objectives and file changes.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/134-menu-sections

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@docs/HANDOVER.md`:
- Around line 3-12: Update the top status block in HANDOVER.md to reconcile it
with the 2026.8.5 entry: revise the current branch/release status and
plugin/deployed-version fields so they consistently identify 2026.8.5 as the
current menu-work release, while preserving the existing bridge-node version and
test/deployment details unless they are affected.

In `@docs/INSTALL.md`:
- Around line 99-112: Update the obsolete package-status statements near the
document introduction and the Matter menu description to remove claims that the
Matter export bridge is unpublished or cannot be installed. Replace them with
the current installation flow, referencing the “Install/update the Matter export
bridge” menu item and its supported installation behavior.

In `@indigo-matter.indigoPlugin/Contents/Server` Plugin/MenuItems.xml:
- Around line 13-14: Update the referenced test path in the menu-order
documentation from tests/test_export_menu.py to tests/test_plugin_module.py,
which contains the order and separator-position contract tests.

In `@tests/test_plugin_module.py`:
- Around line 138-139: Update _menu_items to add a targeted Ruff S314
suppression on the ET.parse call, with an inline comment documenting that
MenuItems.xml is a repository-controlled trusted test fixture. Keep the
suppression scoped only to this parsing statement.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 7199c0ed-8bee-4ed2-9fa2-12bcd7baab30

📥 Commits

Reviewing files that changed from the base of the PR and between 3e1229d and 768007a.

📒 Files selected for processing (7)
  • docs/HANDOVER.md
  • docs/INSTALL.md
  • docs/MATTER.md
  • docs/matter.html
  • indigo-matter.indigoPlugin/Contents/Info.plist
  • indigo-matter.indigoPlugin/Contents/Server Plugin/MenuItems.xml
  • tests/test_plugin_module.py

Comment thread docs/HANDOVER.md Outdated
Comment thread docs/INSTALL.md
Comment thread indigo-matter.indigoPlugin/Contents/Server Plugin/MenuItems.xml Outdated
Comment on lines +138 to +139
def _menu_items():
return ET.parse(SERVER_PLUGIN / "MenuItems.xml").getroot().findall("MenuItem")

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Suppress the false-positive XML security finding.

Line 139 parses a repository-controlled test fixture. Ruff reports S314 on this line, which can fail linting even though no untrusted XML enters this test. Add a targeted suppression and document the trust boundary.

Proposed fix
 def _menu_items():
-    return ET.parse(SERVER_PLUGIN / "MenuItems.xml").getroot().findall("MenuItem")
+    # MenuItems.xml is a repository-controlled test fixture.
+    return ET.parse(SERVER_PLUGIN / "MenuItems.xml").getroot().findall("MenuItem")  # noqa: S314
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
def _menu_items():
return ET.parse(SERVER_PLUGIN / "MenuItems.xml").getroot().findall("MenuItem")
def _menu_items():
# MenuItems.xml is a repository-controlled test fixture.
return ET.parse(SERVER_PLUGIN / "MenuItems.xml").getroot().findall("MenuItem") # noqa: S314
🧰 Tools
🪛 Ruff (0.16.1)

[error] 139-139: Using xml to parse untrusted data is known to be vulnerable to XML attacks; use defusedxml equivalents

(S314)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@tests/test_plugin_module.py` around lines 138 - 139, Update _menu_items to
add a targeted Ruff S314 suppression on the ET.parse call, with an inline
comment documenting that MenuItems.xml is a repository-controlled trusted test
fixture. Keep the suppression scoped only to this parsing statement.

Source: Linters/SAST tools

Three of CodeRabbit's four findings, verified before acting:

* The comment in MenuItems.xml pointed at tests/test_export_menu.py for
  the ordering contract; those tests live in tests/test_plugin_module.py
  (test_export_menu.py owns the Manage Matter Exports dialog's shape).

* INSTALL.md ×2 and README.md ×1 still said indigo-matter-bridge "is not
  on the npm registry yet, so this half cannot be installed today".
  `npm view indigo-matter-bridge` reports 0.7.0 as `latest`, and Step E1
  is already written as an install you perform — so the claim was false
  and, after this PR, sat ten lines above a menu table naming the very
  install item it denied. Called out-of-scope in the PR body; reversed
  because it is three sentences and provably wrong.

* HANDOVER's header described a clean tree on `main` at 2026.8.4 while
  its own new section described 2026.8.5 on an open branch.

Not done: a `noqa: S314` on the new ET.parse. No ruff or bandit config
exists in pyproject.toml, and this file already has six unsuppressed
ET.parse calls (zero S314 suppressions across tests/) — suppressing a
rule nothing runs, on one call out of six, is noise.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@simons-plugins simons-plugins changed the title feat(menu): group Plugins ▸ Matter into five sections (#134) [no-release] feat(menu): group Plugins ▸ Matter into five sections (#134) Aug 6, 2026
@simons-plugins
simons-plugins merged commit 08d64dc into main Aug 6, 2026
3 checks passed
@simons-plugins
simons-plugins deleted the feat/134-menu-sections branch August 6, 2026 14:30
simons-plugins added a commit that referenced this pull request Aug 6, 2026
[no-release] docs(handover): #144 merged, jarvis on 2026.8.5, next up #132
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Group the two Install/update menu items — they are 11 apart and easily confused

1 participant