- plugin.json contained duplicate "version" keys ("0.1.0" then "0.2.0"); JSON parsers take the last value so it appeared to work, but this is invalid per spec and a maintenance hazard.
- findActiveExitNode used legacy for-in + hasOwnProperty guard; replaced with Object.keys() for modern, safe iteration (now consistent with parsePeers and the rest of lib.js).
- All 36 unit tests pass after the change.
Written by AI agent working for @jtmorris. Model: grok-build-0.1.
- plugin.json: added capabilities + requires; bumped to 0.2.0
- README: corrected "auto-refresh" claim (now documents the intentional on-demand + defensive poll-act-poll); added Implementation notes section covering Proc + I18n + best practices
- test/lib.test.js: updated the manual verification comment (now references Proc + preserved behavior)
- Minor version references in README example + caption
- All changes keep exact toggle semantics and follow repo style
Written by AI agent working for @jtmorris. Model: grok-build-0.1.
Minimal loadable DMS widget skeleton with plugin.json manifest
and TailscaleWidget.qml component. Symlinked, enabled, and loaded
cleanly in Dank Material Shell.
References #1, #2