Skip to content

fix: use DisplayManager width/height properties instead of matrix object#52

Closed
Olino3 wants to merge 1 commit intoChuckBuilds:mainfrom
Olino3:fix/display-manager-width-height
Closed

fix: use DisplayManager width/height properties instead of matrix object#52
Olino3 wants to merge 1 commit intoChuckBuilds:mainfrom
Olino3:fix/display-manager-width-height

Conversation

@Olino3
Copy link
Copy Markdown

@Olino3 Olino3 commented Mar 19, 2026

Summary

  • Replace direct matrix object access (display_manager.matrix.width/height) with safe DisplayManager properties (display_manager.width/height) across all 20 affected plugins
  • These properties handle fallback logic for real hardware, emulator mode, and mocked test environments

Changes

  • 39 Python files across 20 plugins updated (mechanical find/replace)
  • Patch versions bumped for all affected plugins
  • plugins.json registry regenerated via update_registry.py

Affected Plugins

baseball-scoreboard, basketball-scoreboard, calendar, countdown, f1-scoreboard, football-scoreboard, hockey-scoreboard, ledmatrix-flights, ledmatrix-music, ledmatrix-stocks, ledmatrix-weather, mqtt-notifications, odds-ticker, soccer-scoreboard, static-image, stock-news, text-display, ufc-scoreboard, web-ui-info, youtube-stats

Summary by CodeRabbit

  • Bug Fixes

    • Corrected display dimension handling across multiple plugins to properly reference display manager attributes, improving rendering accuracy and consistency across scoreboard and media display plugins.
  • Chores

    • Updated plugin versions and metadata timestamps to reflect recent maintenance and fixes.

…y_manager.width/height

Mechanical replacement across 20 plugins (39 Python files). Bumped
patch versions for all affected plugins. Regenerated plugins.json.
@coderabbitai
Copy link
Copy Markdown

coderabbitai bot commented Mar 19, 2026

📝 Walkthrough

Walkthrough

This PR systematically updates display dimension sourcing across 30+ plugins and metadata. When a display_manager has a matrix attribute, the code now reads dimensions from display_manager.width/height instead of display_manager.matrix.width/height. All affected plugin manifests receive patch version increments, and the root plugins.json is updated with new timestamps and version numbers.

Changes

Cohort / File(s) Summary
Root Metadata
plugins.json
Updated root last_updated timestamp from 2026-02-26 to 2026-03-19, and bumped latest_version for 30+ plugins (e.g., ledmatrix-weather 2.1.1→2.1.2, static-image 1.0.2→1.0.3, text-display 1.0.1→1.0.2) with corresponding last_updated fields set to 2026-03-19.
Baseball Scoreboard
plugins/baseball-scoreboard/logo_manager.py, plugins/baseball-scoreboard/manager.py, plugins/baseball-scoreboard/scroll_display.py, plugins/baseball-scoreboard/sports.py, plugins/baseball-scoreboard/manifest.json
Changed display dimension sourcing from display_manager.matrix.width/height to display_manager.width/height across initialization and rendering paths. Manifest version bumped 1.5.4→1.5.5.
Basketball Scoreboard
plugins/basketball-scoreboard/manager.py, plugins/basketball-scoreboard/basketball.py, plugins/basketball-scoreboard/scroll_display.py, plugins/basketball-scoreboard/sports.py, plugins/basketball-scoreboard/manifest.json
Updated dimension access from matrix-nested to direct display_manager properties. Manifest version incremented 1.5.4→1.5.5.
Football Scoreboard
plugins/football-scoreboard/manager.py, plugins/football-scoreboard/football.py, plugins/football-scoreboard/scroll_display.py, plugins/football-scoreboard/sports.py, plugins/football-scoreboard/manifest.json
Changed dimension sourcing pattern consistently across manager, rendering, and scroll logic. Manifest version updated 2.3.4→2.3.5.
Hockey Scoreboard
plugins/hockey-scoreboard/manager.py, plugins/hockey-scoreboard/base_classes.py, plugins/hockey-scoreboard/scroll_display.py, plugins/hockey-scoreboard/scoreboard_renderer.py, plugins/hockey-scoreboard/sports.py, plugins/hockey-scoreboard/manifest.json
Refactored display dimension access across manager, rendering, and sports core initialization. Manifest version bumped 1.2.4→1.2.5.
Soccer Scoreboard
plugins/soccer-scoreboard/manager.py, plugins/soccer-scoreboard/scroll_display.py, plugins/soccer-scoreboard/sports.py, plugins/soccer-scoreboard/manifest.json
Updated dimension sourcing in initialization and render paths. Manifest version incremented 1.4.4→1.4.5.
UFC Scoreboard
plugins/ufc-scoreboard/manager.py, plugins/ufc-scoreboard/scroll_display.py, plugins/ufc-scoreboard/sports.py, plugins/ufc-scoreboard/manifest.json
Changed from matrix-nested to direct display_manager dimension properties. Manifest version updated 1.2.3→1.2.4.
F1 Scoreboard
plugins/f1-scoreboard/manager.py, plugins/f1-scoreboard/scroll_display.py, plugins/f1-scoreboard/manifest.json
Updated dimension access pattern. Manifest version bumped 1.2.2→1.2.3.
Calendar Plugin
plugins/calendar/manager.py, plugins/calendar/manifest.json
Changed _get_display_dimensions() to read from display_manager.width/height. Manifest version incremented 1.0.1→1.0.2.
Countdown Plugin
plugins/countdown/manager.py, plugins/countdown/manifest.json
Updated dimension sourcing in display and fallback methods. Manifest version bumped 1.0.0→1.0.1.
LED Matrix Music
plugins/ledmatrix-music/manager.py, plugins/ledmatrix-music/manifest.json
Changed width/height access across album art sizing and text scaling logic. Manifest version updated 1.0.3→1.0.4.
LED Matrix Weather
plugins/ledmatrix-weather/manager.py, plugins/ledmatrix-weather/manifest.json
Updated dimension source for layout and image rendering across all forecast paths. Manifest version incremented 2.1.1→2.1.2.
LED Matrix Flights
plugins/ledmatrix-flights/manager.py, plugins/ledmatrix-flights/manifest.json
Changed display dimension assignments. Manifest version bumped 1.0.0→1.0.1.
LED Matrix Stocks
plugins/ledmatrix-stocks/display_renderer.py, plugins/ledmatrix-stocks/manifest.json
Updated comment reference and dimension usage. Manifest version incremented 2.0.2→2.0.3.
MQTT Notifications
plugins/mqtt-notifications/manager.py, plugins/mqtt-notifications/manifest.json
Changed matrix dimension reads in resize and display methods. Manifest version bumped 1.0.0→1.0.1.
Odds Ticker
plugins/odds-ticker/manager.py, plugins/odds-ticker/odds_renderer.py, plugins/odds-ticker/manifest.json
Updated width/height sourcing across game display, ticker rendering, and fallback message creation. Manifest version updated 1.1.1→1.1.2 with reformatted tags array.
Static Image
plugins/static-image/manager.py, plugins/static-image/manifest.json
Changed dimension source for image and GIF frame sizing. Manifest version incremented 1.0.2→1.0.3.
Stock News
plugins/stock-news/manager.py, plugins/stock-news/manifest.json
Updated matrix dimension access in scrolling and fallback display paths. Manifest version bumped 1.0.2→1.0.3.
Text Display
plugins/text-display/manager.py, plugins/text-display/manifest.json
Changed dimension source across ScrollHelper init, text cache, and scroll/static rendering thresholds. Manifest version updated 1.0.1→1.0.2.
Web UI Info
plugins/web-ui-info/manager.py, plugins/web-ui-info/manifest.json
Updated dimension access for rendered image sizing and text centering. Manifest version incremented 1.0.0→1.0.1.
YouTube Stats
plugins/youtube-stats/manager.py, plugins/youtube-stats/manifest.json
Changed dimension sourcing in display creation. Manifest version bumped 1.0.0→1.0.1.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately describes the main change: replacing matrix object access with DisplayManager properties across multiple plugins.
Docstring Coverage ✅ Passed Docstring coverage is 86.36% which is sufficient. The required threshold is 80.00%.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

Important

Merge conflicts detected (Beta)

  • Resolve merge conflict in branch fix/display-manager-width-height
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
📝 Coding Plan
  • Generate coding plan for human review comments

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 and usage tips.

Tip

You can customize the high-level summary generated by CodeRabbit.

Configure the reviews.high_level_summary_instructions setting to provide custom instructions for generating the high-level summary.

Copy link
Copy Markdown

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 17

Note

Due to the large number of review comments, Critical, Major severity comments were prioritized as inline comments.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
plugins/basketball-scoreboard/manifest.json (1)

4-25: ⚠️ Potential issue | 🟠 Major

Manifest version metadata is inconsistent and missing the new release entry.

Line 4 sets version to 1.5.5, but the top versions item is still 1.5.3. Add 1.5.5 as the first entry in versions and keep both fields synchronized.

🧩 Proposed manifest fix
   "version": "1.5.5",
@@
   "versions": [
+    {
+      "released": "2026-03-19",
+      "version": "1.5.5",
+      "ledmatrix_min": "2.0.0"
+    },
     {
       "released": "2026-02-24",
       "version": "1.5.3",
       "ledmatrix_min": "2.0.0"
     },

As per coding guidelines: “Add the new version FIRST (most recent at top) to the versions array in manifest.json” and “Keep the version field in sync with the top entry in the versions array in manifest.json.”

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@plugins/basketball-scoreboard/manifest.json` around lines 4 - 25, The
manifest's top-level "version" field (currently "1.5.5") is out of sync with the
first entry in the "versions" array (currently "1.5.3"); update the "versions"
array to insert a new first entry for version "1.5.5" with its released date and
ledmatrix_min (matching release metadata style used for "1.5.3"), ensuring the
newest release is the first element and that the "version" field matches that
top "versions" entry.
🟡 Minor comments (12)
plugins/ufc-scoreboard/manifest.json-4-4 (1)

4-4: ⚠️ Potential issue | 🟡 Minor

Missing version entry in versions array.

The version field is 1.2.4, but the versions array top entry is 1.2.2. As per coding guidelines, the new version must be added FIRST to the versions array and kept in sync with the version field.

Proposed fix to add version 1.2.4 entry
   "versions": [
+    {
+      "version": "1.2.4",
+      "ledmatrix_min": "2.0.0",
+      "released": "2026-03-19"
+    },
     {
       "version": "1.2.2",
       "ledmatrix_min": "2.0.0",

Also applies to: 34-39

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@plugins/ufc-scoreboard/manifest.json` at line 4, The manifest's top-level
"version" is 1.2.4 but the "versions" array still begins with 1.2.2; update the
"versions" array by inserting a new first entry that matches the current
"version" value ("1.2.4") and its corresponding metadata (release
notes/date/compatibility) so the array's first element stays in sync with the
"version" field; ensure any other outdated entries referenced elsewhere (the
other entries in the "versions" array) remain unchanged except for reordering so
the newest version is always first.
plugins/calendar/manifest.json-4-4 (1)

4-4: ⚠️ Potential issue | 🟡 Minor

Missing entry in versions array.

The version field was bumped to 1.0.2, but the versions array only contains the 1.0.1 entry. Add the new version FIRST to the versions array and update last_updated.

Proposed fix
   "versions": [
+    {
+      "released": "2026-03-19",
+      "version": "1.0.2",
+      "ledmatrix_min": "2.0.0"
+    },
     {
       "released": "2025-10-19",
       "version": "1.0.1",
       "ledmatrix_min": "2.0.0"
     }
   ],
-  "last_updated": "2025-10-19",
+  "last_updated": "2026-03-19",

As per coding guidelines: "Add the new version FIRST (most recent at top) to the versions array" and "Keep the version field in sync with the top entry".

Also applies to: 35-42

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@plugins/calendar/manifest.json` at line 4, Update the manifest so the
"versions" array includes the new "1.0.2" entry as the first (top) element,
update that new entry's "last_updated" timestamp accordingly, and ensure the top
entry in "versions" matches the "version" field (i.e., "version": "1.0.2"); also
remove or reorder the older "1.0.1" entry so it follows the new entry.
plugins/stock-news/manifest.json-4-4 (1)

4-4: ⚠️ Potential issue | 🟡 Minor

Missing entry in versions array.

The version field was bumped to 1.0.3, but the versions array still only contains the 1.0.2 entry. Per coding guidelines, add the new version FIRST to the versions array with released, version, and ledmatrix_min fields, and update last_updated.

Proposed fix
   "versions": [
+    {
+      "released": "2026-03-19",
+      "version": "1.0.3",
+      "ledmatrix_min": "2.0.0"
+    },
     {
       "released": "2025-10-19",
       "version": "1.0.2",
       "ledmatrix_min": "2.0.0"
     }
   ],
-  "last_updated": "2025-10-19",
+  "last_updated": "2026-03-19",

As per coding guidelines: "Add the new version FIRST (most recent at top) to the versions array in manifest.json" and "Keep the version field in sync with the top entry in the versions array".

Also applies to: 24-30

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@plugins/stock-news/manifest.json` at line 4, Update manifest.json so the top
entry in the "versions" array matches the bumped "version" field ("1.0.3"):
insert a new object as the first element in the "versions" array with keys
"released" (ISO date), "version": "1.0.3", and "ledmatrix_min" (as per previous
entries), then update the manifest's "last_updated" timestamp to reflect this
change; ensure the existing 1.0.2 entry remains but is pushed down so the newest
version is first and the "version" root field equals the top "versions" entry.
plugins/odds-ticker/manifest.json-4-4 (1)

4-4: ⚠️ Potential issue | 🟡 Minor

Missing entry in versions array.

The version field was bumped to 1.1.2, but the versions array top entry is still 1.1.1. Add the new version FIRST and update last_updated.

Proposed fix
   "versions": [
+    {
+      "version": "1.1.2",
+      "ledmatrix_min": "2.0.0",
+      "released": "2026-03-19"
+    },
     {
       "version": "1.1.1",
       "ledmatrix_min": "2.0.0",
       "released": "2026-02-23"
     },
     ...
   ],
   ...
-  "last_updated": "2026-02-23",
+  "last_updated": "2026-03-19",

As per coding guidelines: "Add the new version FIRST (most recent at top) to the versions array" and "Keep the version field in sync with the top entry".

Also applies to: 22-46

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@plugins/odds-ticker/manifest.json` at line 4, Update the manifest so the top
entry in the "versions" array matches the bumped "version" field ("version":
"1.1.2") by inserting a new versions array entry for 1.1.2 at the top (most
recent first), and update its "last_updated" timestamp accordingly; ensure the
"version" field and the first element of "versions" are identical and follow the
existing entry structure used by other items in the array.
plugins/ledmatrix-stocks/manifest.json-4-4 (1)

4-4: ⚠️ Potential issue | 🟡 Minor

Missing entry in versions array.

The version field was bumped to 2.0.3, but the versions array top entry is still 2.0.2. Add the new version FIRST and update last_updated.

Proposed fix
   "versions": [
+    {
+      "version": "2.0.3",
+      "ledmatrix_min": "2.0.0",
+      "released": "2026-03-19"
+    },
     {
       "version": "2.0.2",
       "ledmatrix_min": "2.0.0",
       "released": "2026-02-12"
     },
     ...
   ],
-  "last_updated": "2026-02-12",
+  "last_updated": "2026-03-19",

As per coding guidelines: "Add the new version FIRST (most recent at top) to the versions array" and "Keep the version field in sync with the top entry".

Also applies to: 41-53

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@plugins/ledmatrix-stocks/manifest.json` at line 4, The manifest's top-level
"version" value (2.0.3) is out of sync with the "versions" array — add a new
entry for 2.0.3 as the FIRST (top) element in the "versions" array, set its
"last_updated" to the current date, and ensure the "version" field exactly
matches that new top entry; also update any other "versions" array occurrences
in this file (the secondary block around the later entries) so all lists remain
consistent with the new version.
plugins/youtube-stats/manifest.json-4-4 (1)

4-4: ⚠️ Potential issue | 🟡 Minor

Missing versions array in manifest.

The manifest is missing the versions array entirely. Per coding guidelines, add a versions array with entries containing released, version, and ledmatrix_min fields, with the most recent version first.

Proposed fix - add after line 33
     }
-  ]
+  ],
+  "versions": [
+    {
+      "released": "2026-03-19",
+      "version": "1.0.1",
+      "ledmatrix_min": "2.0.0"
+    },
+    {
+      "released": "2025-10-19",
+      "version": "1.0.0",
+      "ledmatrix_min": "2.0.0"
+    }
+  ],
+  "last_updated": "2026-03-19",
+  "stars": 0,
+  "downloads": 0,
+  "verified": true,
+  "screenshot": ""
 }

As per coding guidelines: "Add the new version FIRST (most recent at top) to the versions array in manifest.json, with fields: released (date), version (semver), and ledmatrix_min (minimum LEDMatrix version)".

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@plugins/youtube-stats/manifest.json` at line 4, The manifest.json is missing
the required "versions" array; add a "versions" array in the manifest with the
newest entry first containing the keys "released" (ISO date string), "version"
(semver, e.g., "1.0.1"), and "ledmatrix_min" (minimum LEDMatrix version); ensure
the array is present at the top-level of manifest.json and that the new version
object for version "1.0.1" is the first element (most recent) and follows the
exact field names "released", "version", and "ledmatrix_min".
plugins/text-display/manager.py-101-102 (1)

101-102: ⚠️ Potential issue | 🟡 Minor

The matrix condition should verify both existence and truthiness.

Lines 101-102 check only hasattr(self.display_manager, 'matrix'), but should also verify the attribute is truthy like the rest of the codebase does. If matrix exists but is None/False, the condition passes and accesses width/height anyway—which works by accident in practice, but is logically inconsistent and fragile compared to the pattern used across other plugins.

🔧 Correct pattern
-        display_width = self.display_manager.width if hasattr(self.display_manager, 'matrix') else 128
-        display_height = self.display_manager.height if hasattr(self.display_manager, 'matrix') else 32
+        display_width = self.display_manager.width if (hasattr(self.display_manager, 'matrix') and self.display_manager.matrix) else 128
+        display_height = self.display_manager.height if (hasattr(self.display_manager, 'matrix') and self.display_manager.matrix) else 32
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@plugins/text-display/manager.py` around lines 101 - 102, Change the
conditional that selects display dimensions to verify the matrix attribute both
exists and is truthy (not just present). In the two places setting display_width
and display_height in plugins/text-display/manager.py (the lines referencing
self.display_manager.matrix), replace the current hasattr(self.display_manager,
'matrix') check with a combined existence-and-truthiness check (e.g.,
hasattr(...) and self.display_manager.matrix or using getattr(..., None) and
testing truthiness) so width/height are taken from display_manager only when
matrix is present and truthy.
plugins/soccer-scoreboard/manifest.json-4-4 (1)

4-4: ⚠️ Potential issue | 🟡 Minor

Missing version entries in versions array.

The version field is 1.4.5, but the versions array top entry is 1.4.3. There appear to be missing entries for versions 1.4.4 and 1.4.5. As per coding guidelines, new versions must be added FIRST to the versions array.

Proposed fix to add version entry
   "versions": [
+    {
+      "released": "2026-03-19",
+      "version": "1.4.5",
+      "ledmatrix_min": "2.0.0"
+    },
     {
       "released": "2026-02-24",
       "version": "1.4.3",
       "ledmatrix_min": "2.0.0"
     },

Also applies to: 26-31

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@plugins/soccer-scoreboard/manifest.json` at line 4, Update the manifest.json
so the "versions" array includes entries for 1.4.5 and 1.4.4 and that the newest
version appears first; specifically, add a top entry for "1.4.5" (and "1.4.4" if
missing) into the "versions" array before the existing "1.4.3" entry and ensure
the top-level "version" field remains "1.4.5" to match the array order.
plugins/text-display/manifest.json-4-4 (1)

4-4: ⚠️ Potential issue | 🟡 Minor

Missing version entry in versions array.

The version field is 1.0.2, but the versions array only contains 1.0.1. As per coding guidelines, the new version must be added FIRST to the versions array, and the version field must be in sync with the top entry.

Proposed fix to add version entry
   "versions": [
+    {
+      "released": "2026-03-19",
+      "version": "1.0.2",
+      "ledmatrix_min": "2.0.0"
+    },
     {
       "released": "2025-10-19",
       "version": "1.0.1",
       "ledmatrix_min": "2.0.0"
     }
   ],
-  "last_updated": "2025-10-19",
+  "last_updated": "2026-03-19",

Also applies to: 20-26

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@plugins/text-display/manifest.json` at line 4, The manifest's top-level
"version" ("1.0.2") and the "versions" array are out of sync; add a new entry
"1.0.2" as the first element of the "versions" array and ensure the array order
puts the latest release first (update any related metadata in that new entry if
present), so the "version" field and the first item in "versions" match (also
apply the same fix for the other occurrences referenced in lines 20-26).
plugins/f1-scoreboard/manifest.json-4-4 (1)

4-4: ⚠️ Potential issue | 🟡 Minor

Missing version entries in versions array.

The version field is 1.2.3, but the versions array top entry is 1.2.1. There appear to be missing entries for versions 1.2.2 and 1.2.3. As per coding guidelines, new versions must be added FIRST to the versions array.

Proposed fix to add version entries
   "versions": [
+    {
+      "version": "1.2.3",
+      "ledmatrix_min": "2.0.0",
+      "released": "2026-03-19"
+    },
     {
       "version": "1.2.1",
       "ledmatrix_min": "2.0.0",
       "released": "2026-02-24"
     },

Also update last_updated:

-  "last_updated": "2026-02-18",
+  "last_updated": "2026-03-19",

Also applies to: 31-47

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@plugins/f1-scoreboard/manifest.json` at line 4, The manifest's "version"
(1.2.3) does not match the top entry of the "versions" array (currently 1.2.1);
add missing entries for 1.2.2 and 1.2.3 to the top of the "versions" array in
descending order (newest first) so the array begins with 1.2.3, then 1.2.2, then
1.2.1, and update the corresponding "last_updated" timestamps for the new
version entries (and the top-level "last_updated" if used) to the correct
values; modify the manifest.json "version", "versions" array, and "last_updated"
fields accordingly.
plugins/static-image/manifest.json-4-4 (1)

4-4: ⚠️ Potential issue | 🟡 Minor

Missing version entry in versions array.

The version field is 1.0.3, but the versions array top entry is 1.0.2. As per coding guidelines, the new version must be added FIRST to the versions array, and the version field must be in sync with the top entry.

Proposed fix to add version entry
   "versions": [
+    {
+      "version": "1.0.3",
+      "ledmatrix_min": "2.0.0",
+      "released": "2026-03-19"
+    },
     {
       "version": "1.0.2",
       "ledmatrix_min": "2.0.0",
       "released": "2025-11-05"
     },

Also update last_updated:

-  "last_updated": "2025-11-05",
+  "last_updated": "2026-03-19",

Also applies to: 20-31

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@plugins/static-image/manifest.json` at line 4, The manifest.json has
"version": "1.0.3" but the top entry of the "versions" array is still "1.0.2";
update the file by inserting a new versions array entry for 1.0.3 as the first
element (mirroring the existing version object shape), ensure its "version"
value equals the top-level "version" field, and update the new entry's
"last_updated" timestamp appropriately so the top-level "version" and the first
object in "versions" are in sync.
plugins/hockey-scoreboard/manifest.json-4-4 (1)

4-4: ⚠️ Potential issue | 🟡 Minor

Missing version entries in versions array.

The version field is 1.2.5, but the versions array top entry is 1.2.3. There appear to be missing entries for versions 1.2.4 and 1.2.5. As per coding guidelines, new versions must be added FIRST to the versions array.

Proposed fix to add version entry
   "versions": [
+    {
+      "released": "2026-03-19",
+      "version": "1.2.5",
+      "ledmatrix_min": "2.0.0"
+    },
     {
       "released": "2026-02-24",
       "version": "1.2.3",
       "ledmatrix_min": "2.0.0"
     },

Also applies to: 57-62

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@plugins/hockey-scoreboard/manifest.json` at line 4, The manifest's "version"
field (1.2.5) is newer than the top entry in the "versions" array (currently
1.2.3); add missing version entries (1.2.4 and 1.2.5) to the start of the
"versions" array so the newest release appears first and matches the "version"
field, updating any release notes/changelog text for those entries as needed;
look for the "version" key and the "versions" array in manifest.json to insert
the new objects.
🧹 Nitpick comments (2)
plugins/football-scoreboard/sports.py (2)

1770-1772: Same stale comment issue as above.

Line 1770 comment says "Use display_manager.matrix dimensions directly" but the code uses display_manager.width/display_manager.height. Also, line 1879 uses self.display_height instead of the local display_height variable.

Suggested comment fix
-            # Use display_manager.matrix dimensions directly to ensure full display coverage
+            # Use display_manager width/height properties to ensure full display coverage
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@plugins/football-scoreboard/sports.py` around lines 1770 - 1772, The comment
and code disagree: instead of using display_manager.width/height or falling back
to self.display_width/self.display_height, read the actual matrix dimensions
from self.display_manager.matrix (e.g., width =
self.display_manager.matrix.width and height =
self.display_manager.matrix.height) and assign them to the local variables
display_width and display_height; also replace any later uses of
self.display_height (and self.display_width) with the local
display_height/display_width variables (for example where the code currently
references self.display_height around the display rendering logic) so the
display uses the matrix-derived dimensions consistently.

1210-1212: Stale comment: update to reflect the actual change.

Line 1210 comment says "Use display_manager.matrix dimensions directly" but the code now uses display_manager.width/display_manager.height (not .matrix). Update the comment to match the new behavior.

Additionally, note that this method defines local display_width/display_height variables but lines 1316, 1318, and 1384 still use self.display_width/self.display_height. If these values ever diverge, it could cause layout inconsistencies.

Suggested comment fix
-            # Use display_manager.matrix dimensions directly to ensure full display coverage
+            # Use display_manager width/height properties to ensure full display coverage
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@plugins/football-scoreboard/sports.py` around lines 1210 - 1212, Update the
stale inline comment to reflect that the code now reads dimensions from
display_manager.width and display_manager.height (not .matrix), and make the
method consistent by either (A) using the local variables
display_width/display_height everywhere in this method instead of
self.display_width/self.display_height, or (B) remove the local variables and
always use self.display_width/self.display_height; adjust all references
(including the occurrences that currently read
self.display_width/self.display_height) to the chosen source so layout
calculations remain consistent; ensure you update the comment text to describe
the actual behavior (reading display_manager.width/height) and keep variable
usage uniform within the method involving display_manager,
display_width/display_height, and self.display_width/self.display_height.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@plugins.json`:
- Line 3: Multiple plugin manifests have inconsistent versioning: ensure
manifest.version equals versions[0].version for each plugin and that the first
entry in the versions array contains non-empty version, released, and
ledmatrix_min fields; for the four plugins with empty top entries (countdown,
ledmatrix-flights, web-ui-info, youtube-stats) replace the empty versions[0]
with a new top entry containing the correct version string matching
manifest.version, a proper released date, and ledmatrix_min; for mismatched
plugins (e.g., baseball-scoreboard, calendar) update either manifest.version or
versions[0].version so they match, and when adding a new release always prepend
an entry to versions with keys version, released, and ledmatrix_min to keep
manifest.version synchronized with versions[0].version.

In `@plugins/baseball-scoreboard/manifest.json`:
- Line 4: The manifest's top-level "version" value (currently "1.5.5") is out of
sync with the "versions" array (which still begins at "1.5.3"); add a new
release object for 1.5.5 as the FIRST element in the "versions" array, update
that new object's "last_updated" to the correct timestamp, and ensure the
top-level "version" field matches this new first entry; update any other stale
entries mentioned (lines referenced) so "version", the first element of
"versions", and its "last_updated" are all consistent.

In `@plugins/baseball-scoreboard/sports.py`:
- Around line 1211-1212: Replace the conditional matrix guard when choosing
display sizes with unconditional getattr lookups so draw code always uses
current manager properties: use display_width = getattr(self.display_manager,
"width", self.display_width) and display_height = getattr(self.display_manager,
"height", self.display_height) in the draw paths that currently use the
matrix-based ternary; then make sure those local display_width/display_height
locals are used for subsequent X/Y math and layout calculations (the same change
must be applied at the other occurrence noted in the review).

In `@plugins/basketball-scoreboard/sports.py`:
- Around line 55-56: Update the manifest so the top of the versions array
matches the manifest's version field: insert a new versions[0] entry with
"version": "1.5.5", "date": "2026-03-19" (today's release date), and include the
release notes; ensure the manifest's top-level version field remains "1.5.5".
Also verify and set "ledmatrix_min": "2.0.0" in the new entry (and across the
manifest if present) because the code now accesses DisplayManager.width and
DisplayManager.height (see usages at DisplayManager.width/height references
around the self.display_width/self.display_height accessors), so confirm that
API requirement is accurate for those accessors.

In `@plugins/countdown/manifest.json`:
- Line 4: The manifest's top-level "version" was bumped to "1.0.1" but the
"versions" array was not updated; add a new entry as the first element of the
"versions" array with the keys "released" (ISO date for this release),
"version": "1.0.1", and "ledmatrix_min" (appropriate minimum LED matrix version)
so the history matches the current "version" field and follows the required
ordering; update the "versions" array near the existing entries (ensure the new
object is inserted before older entries).

In `@plugins/football-scoreboard/manifest.json`:
- Line 4: Update the manifest.json so the top entry of the versions array
matches the "version" field: add missing entries for 2.3.5 and 2.3.4 at the very
top of the "versions" array (each entry must include the keys released, version,
and ledmatrix_min), ensure the newest entry is first, and then set the top-level
"version" field to the same value as that top versions array entry.

In `@plugins/hockey-scoreboard/manager.py`:
- Around line 81-86: The code assumes display_manager.width and
display_manager.height exist when display_manager.matrix is present, which can
raise AttributeError for mocks; update the logic in the block that sets
self.display_width and self.display_height (where display_manager, matrix,
width, height, display_width, display_height are referenced) to use safe
attribute access (e.g., getattr with defaults) even when matrix is present — or
explicitly check hasattr(display_manager, "width")/hasattr(display_manager,
"height") before using them — falling back to the existing defaults (128 and 32)
when those attributes are missing.

In `@plugins/ledmatrix-flights/manager.py`:
- Around line 132-133: The plugin assumes display_manager.width/height exist
when setting self.display_width and self.display_height which breaks tests/mocks
where only display_manager.matrix.width/height are provided; update the
initialization in the constructor (where self.display_width and
self.display_height are set) to resolve dimensions with a fallback: first try
display_manager.width and display_manager.height, then fall back to
getattr(display_manager, "matrix").width/height (or use getattr with default) so
mocks that only define display_manager.matrix.width/height won't raise
AttributeError.

In `@plugins/ledmatrix-flights/manifest.json`:
- Line 4: Add a new release-history entry for "1.0.1" to the top of the versions
array in manifest.json and ensure the top entry matches the manifest "version"
field; specifically, update the "versions" array (add a new object for version
"1.0.1" with date and notes per repo convention) so the "version" property stays
in sync with the first element of "versions" and keep any existing entries below
it unchanged.

In `@plugins/ledmatrix-music/manifest.json`:
- Line 4: The manifest's "version" field (currently 1.0.4) is not reflected in
the top entry of the "versions" array and "last_updated" does not match the new
release; update the manifest so the new release is added as the first element in
the "versions" array (insert a 1.0.4 entry at the top with appropriate
metadata), ensure the top "versions" entry exactly matches the "version" field,
and update "last_updated" timestamps to the correct date for 1.0.4; verify any
other version-related blocks (the existing entries around the versions array and
the last_updated fields) are consistent and remove any duplicate/mismatched
entries for 1.0.3 if it’s being superseded.

In `@plugins/ledmatrix-weather/manifest.json`:
- Line 4: The manifest's "version" field (currently 2.1.2) is not reflected in
the top "versions" array and its timestamp; update the "versions" array by
inserting a new entry for "2.1.2" at the beginning (prepend) and set its
"last_updated" to match the manifest "version" timestamp, ensuring the topmost
versions[0] matches the "version" field; adjust any other duplicate version
spots (lines noted around 25-30 and 57) so every "version" occurrence and its
corresponding "last_updated" stay in sync.

In `@plugins/mqtt-notifications/manager.py`:
- Around line 425-426: The code accesses self.display_manager.matrix directly
which can raise AttributeError for mock/emulator display managers; replace those
checks in the three occurrences where matrix_width and matrix_height are set
(currently around the lines that assign matrix_width =
self.display_manager.width if self.display_manager.matrix else 128 and
matrix_height = self.display_manager.height if self.display_manager.matrix else
32) with hasattr(self.display_manager, "matrix") checks (e.g., use
hasattr(self.display_manager, "matrix") and then, if True, read width/height
from self.display_manager, otherwise fall back to the default 128/32); apply the
same change to the other two similar blocks (the ones around the later
assignments for matrix width/height) so all three use hasattr to guard access.

In `@plugins/mqtt-notifications/manifest.json`:
- Line 4: Update the manifest so the top-level "version" value matches the first
entry in the "versions" array: add a new first entry in "versions" with
"version": "1.0.1" and include the corresponding "released" and "ledmatrix_min"
metadata for this 1.0.1 release, or alternatively bump the existing first
"versions" entry to 1.0.1; ensure the "version" field and the first element of
the "versions" array are identical to keep the manifest internally consistent.

In `@plugins/odds-ticker/manager.py`:
- Around line 314-315: The code determines display_width/height by checking for
self.display_manager.matrix, which causes mock/emulator displays that expose
width/height but not matrix to fall back to 128x32 and desynchronize
ScrollHelper; instead read width and height directly from self.display_manager
(e.g., use getattr(self.display_manager, 'width', 128) and
getattr(self.display_manager, 'height', 32)) and pass those values into
ScrollHelper so the helper reflects the actual canvas size (refer to
display_width/display_height, self.display_manager, and ScrollHelper when making
the change).

In `@plugins/soccer-scoreboard/sports.py`:
- Around line 1356-1357: The draw paths currently conditionally read
display_manager.width/height with a matrix guard which can leave constructors'
cached dimensions in use; replace the guarded lookup with unconditional
fallbacks using getattr (e.g., set local display_width =
getattr(self.display_manager, "width", self.display_width) and display_height =
getattr(self.display_manager, "height", self.display_height)) and propagate
those locals through the downstream X/Y math used for positioning (the same
change should be applied at the other occurrence around the same draw logic).
Ensure you update both places where the matrix-guarded lookups occur so all
sizing uses the getattr fallbacks.

In `@plugins/stock-news/manager.py`:
- Around line 323-324: The render methods _display_scrolling_stock_news,
_display_no_news, and _display_error use PIL classes but fail at runtime because
Image and ImageDraw are not imported; fix by adding the missing imports from PIL
(import Image and ImageDraw) at the top of plugins/stock-news/manager.py so
those functions can reference Image and ImageDraw (ensure you import the exact
symbols used in those methods).

In `@plugins/web-ui-info/manifest.json`:
- Line 4: The manifest bump updated the top-level "version": "1.0.1" but did not
add a corresponding entry to the "versions" array; add a new object at the start
of the "versions" array (before existing entries) with fields "version":
"1.0.1", "released": "<release-date>", and "ledmatrix_min":
"<minimum-core-version>" (set ledmatrix_min to the core release that introduces
DisplayManager.width/height) so the manifest correctly declares the minimum core
version for this change.

---

Outside diff comments:
In `@plugins/basketball-scoreboard/manifest.json`:
- Around line 4-25: The manifest's top-level "version" field (currently "1.5.5")
is out of sync with the first entry in the "versions" array (currently "1.5.3");
update the "versions" array to insert a new first entry for version "1.5.5" with
its released date and ledmatrix_min (matching release metadata style used for
"1.5.3"), ensuring the newest release is the first element and that the
"version" field matches that top "versions" entry.

---

Minor comments:
In `@plugins/calendar/manifest.json`:
- Line 4: Update the manifest so the "versions" array includes the new "1.0.2"
entry as the first (top) element, update that new entry's "last_updated"
timestamp accordingly, and ensure the top entry in "versions" matches the
"version" field (i.e., "version": "1.0.2"); also remove or reorder the older
"1.0.1" entry so it follows the new entry.

In `@plugins/f1-scoreboard/manifest.json`:
- Line 4: The manifest's "version" (1.2.3) does not match the top entry of the
"versions" array (currently 1.2.1); add missing entries for 1.2.2 and 1.2.3 to
the top of the "versions" array in descending order (newest first) so the array
begins with 1.2.3, then 1.2.2, then 1.2.1, and update the corresponding
"last_updated" timestamps for the new version entries (and the top-level
"last_updated" if used) to the correct values; modify the manifest.json
"version", "versions" array, and "last_updated" fields accordingly.

In `@plugins/hockey-scoreboard/manifest.json`:
- Line 4: The manifest's "version" field (1.2.5) is newer than the top entry in
the "versions" array (currently 1.2.3); add missing version entries (1.2.4 and
1.2.5) to the start of the "versions" array so the newest release appears first
and matches the "version" field, updating any release notes/changelog text for
those entries as needed; look for the "version" key and the "versions" array in
manifest.json to insert the new objects.

In `@plugins/ledmatrix-stocks/manifest.json`:
- Line 4: The manifest's top-level "version" value (2.0.3) is out of sync with
the "versions" array — add a new entry for 2.0.3 as the FIRST (top) element in
the "versions" array, set its "last_updated" to the current date, and ensure the
"version" field exactly matches that new top entry; also update any other
"versions" array occurrences in this file (the secondary block around the later
entries) so all lists remain consistent with the new version.

In `@plugins/odds-ticker/manifest.json`:
- Line 4: Update the manifest so the top entry in the "versions" array matches
the bumped "version" field ("version": "1.1.2") by inserting a new versions
array entry for 1.1.2 at the top (most recent first), and update its
"last_updated" timestamp accordingly; ensure the "version" field and the first
element of "versions" are identical and follow the existing entry structure used
by other items in the array.

In `@plugins/soccer-scoreboard/manifest.json`:
- Line 4: Update the manifest.json so the "versions" array includes entries for
1.4.5 and 1.4.4 and that the newest version appears first; specifically, add a
top entry for "1.4.5" (and "1.4.4" if missing) into the "versions" array before
the existing "1.4.3" entry and ensure the top-level "version" field remains
"1.4.5" to match the array order.

In `@plugins/static-image/manifest.json`:
- Line 4: The manifest.json has "version": "1.0.3" but the top entry of the
"versions" array is still "1.0.2"; update the file by inserting a new versions
array entry for 1.0.3 as the first element (mirroring the existing version
object shape), ensure its "version" value equals the top-level "version" field,
and update the new entry's "last_updated" timestamp appropriately so the
top-level "version" and the first object in "versions" are in sync.

In `@plugins/stock-news/manifest.json`:
- Line 4: Update manifest.json so the top entry in the "versions" array matches
the bumped "version" field ("1.0.3"): insert a new object as the first element
in the "versions" array with keys "released" (ISO date), "version": "1.0.3", and
"ledmatrix_min" (as per previous entries), then update the manifest's
"last_updated" timestamp to reflect this change; ensure the existing 1.0.2 entry
remains but is pushed down so the newest version is first and the "version" root
field equals the top "versions" entry.

In `@plugins/text-display/manager.py`:
- Around line 101-102: Change the conditional that selects display dimensions to
verify the matrix attribute both exists and is truthy (not just present). In the
two places setting display_width and display_height in
plugins/text-display/manager.py (the lines referencing
self.display_manager.matrix), replace the current hasattr(self.display_manager,
'matrix') check with a combined existence-and-truthiness check (e.g.,
hasattr(...) and self.display_manager.matrix or using getattr(..., None) and
testing truthiness) so width/height are taken from display_manager only when
matrix is present and truthy.

In `@plugins/text-display/manifest.json`:
- Line 4: The manifest's top-level "version" ("1.0.2") and the "versions" array
are out of sync; add a new entry "1.0.2" as the first element of the "versions"
array and ensure the array order puts the latest release first (update any
related metadata in that new entry if present), so the "version" field and the
first item in "versions" match (also apply the same fix for the other
occurrences referenced in lines 20-26).

In `@plugins/ufc-scoreboard/manifest.json`:
- Line 4: The manifest's top-level "version" is 1.2.4 but the "versions" array
still begins with 1.2.2; update the "versions" array by inserting a new first
entry that matches the current "version" value ("1.2.4") and its corresponding
metadata (release notes/date/compatibility) so the array's first element stays
in sync with the "version" field; ensure any other outdated entries referenced
elsewhere (the other entries in the "versions" array) remain unchanged except
for reordering so the newest version is always first.

In `@plugins/youtube-stats/manifest.json`:
- Line 4: The manifest.json is missing the required "versions" array; add a
"versions" array in the manifest with the newest entry first containing the keys
"released" (ISO date string), "version" (semver, e.g., "1.0.1"), and
"ledmatrix_min" (minimum LEDMatrix version); ensure the array is present at the
top-level of manifest.json and that the new version object for version "1.0.1"
is the first element (most recent) and follows the exact field names "released",
"version", and "ledmatrix_min".

---

Nitpick comments:
In `@plugins/football-scoreboard/sports.py`:
- Around line 1770-1772: The comment and code disagree: instead of using
display_manager.width/height or falling back to
self.display_width/self.display_height, read the actual matrix dimensions from
self.display_manager.matrix (e.g., width = self.display_manager.matrix.width and
height = self.display_manager.matrix.height) and assign them to the local
variables display_width and display_height; also replace any later uses of
self.display_height (and self.display_width) with the local
display_height/display_width variables (for example where the code currently
references self.display_height around the display rendering logic) so the
display uses the matrix-derived dimensions consistently.
- Around line 1210-1212: Update the stale inline comment to reflect that the
code now reads dimensions from display_manager.width and display_manager.height
(not .matrix), and make the method consistent by either (A) using the local
variables display_width/display_height everywhere in this method instead of
self.display_width/self.display_height, or (B) remove the local variables and
always use self.display_width/self.display_height; adjust all references
(including the occurrences that currently read
self.display_width/self.display_height) to the chosen source so layout
calculations remain consistent; ensure you update the comment text to describe
the actual behavior (reading display_manager.width/height) and keep variable
usage uniform within the method involving display_manager,
display_width/display_height, and self.display_width/self.display_height.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 7d4bdfed-caf0-4b39-9908-07896c9d8bef

📥 Commits

Reviewing files that changed from the base of the PR and between 7c143a2 and 7c1fb54.

📒 Files selected for processing (60)
  • plugins.json
  • plugins/baseball-scoreboard/logo_manager.py
  • plugins/baseball-scoreboard/manager.py
  • plugins/baseball-scoreboard/manifest.json
  • plugins/baseball-scoreboard/scroll_display.py
  • plugins/baseball-scoreboard/sports.py
  • plugins/basketball-scoreboard/basketball.py
  • plugins/basketball-scoreboard/manager.py
  • plugins/basketball-scoreboard/manifest.json
  • plugins/basketball-scoreboard/scroll_display.py
  • plugins/basketball-scoreboard/sports.py
  • plugins/calendar/manager.py
  • plugins/calendar/manifest.json
  • plugins/countdown/manager.py
  • plugins/countdown/manifest.json
  • plugins/f1-scoreboard/manager.py
  • plugins/f1-scoreboard/manifest.json
  • plugins/f1-scoreboard/scroll_display.py
  • plugins/football-scoreboard/football.py
  • plugins/football-scoreboard/manager.py
  • plugins/football-scoreboard/manifest.json
  • plugins/football-scoreboard/scroll_display.py
  • plugins/football-scoreboard/sports.py
  • plugins/hockey-scoreboard/base_classes.py
  • plugins/hockey-scoreboard/manager.py
  • plugins/hockey-scoreboard/manifest.json
  • plugins/hockey-scoreboard/scoreboard_renderer.py
  • plugins/hockey-scoreboard/scroll_display.py
  • plugins/hockey-scoreboard/sports.py
  • plugins/ledmatrix-flights/manager.py
  • plugins/ledmatrix-flights/manifest.json
  • plugins/ledmatrix-music/manager.py
  • plugins/ledmatrix-music/manifest.json
  • plugins/ledmatrix-stocks/display_renderer.py
  • plugins/ledmatrix-stocks/manifest.json
  • plugins/ledmatrix-weather/manager.py
  • plugins/ledmatrix-weather/manifest.json
  • plugins/mqtt-notifications/manager.py
  • plugins/mqtt-notifications/manifest.json
  • plugins/odds-ticker/manager.py
  • plugins/odds-ticker/manifest.json
  • plugins/odds-ticker/odds_renderer.py
  • plugins/soccer-scoreboard/manager.py
  • plugins/soccer-scoreboard/manifest.json
  • plugins/soccer-scoreboard/scroll_display.py
  • plugins/soccer-scoreboard/sports.py
  • plugins/static-image/manager.py
  • plugins/static-image/manifest.json
  • plugins/stock-news/manager.py
  • plugins/stock-news/manifest.json
  • plugins/text-display/manager.py
  • plugins/text-display/manifest.json
  • plugins/ufc-scoreboard/manager.py
  • plugins/ufc-scoreboard/manifest.json
  • plugins/ufc-scoreboard/scroll_display.py
  • plugins/ufc-scoreboard/sports.py
  • plugins/web-ui-info/manager.py
  • plugins/web-ui-info/manifest.json
  • plugins/youtube-stats/manager.py
  • plugins/youtube-stats/manifest.json

{
"version": "1.0.0",
"last_updated": "2026-02-26",
"last_updated": "2026-03-19",
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

plugins=(
  baseball-scoreboard basketball-scoreboard calendar countdown f1-scoreboard
  football-scoreboard hockey-scoreboard ledmatrix-flights ledmatrix-music
  ledmatrix-stocks ledmatrix-weather mqtt-notifications odds-ticker
  soccer-scoreboard static-image stock-news text-display ufc-scoreboard
  web-ui-info youtube-stats
)

python - <<'PY'
import json
from pathlib import Path

affected = [
    "baseball-scoreboard", "basketball-scoreboard", "calendar", "countdown", "f1-scoreboard",
    "football-scoreboard", "hockey-scoreboard", "ledmatrix-flights", "ledmatrix-music",
    "ledmatrix-stocks", "ledmatrix-weather", "mqtt-notifications", "odds-ticker",
    "soccer-scoreboard", "static-image", "stock-news", "text-display", "ufc-scoreboard",
    "web-ui-info", "youtube-stats",
]

registry = json.loads(Path("plugins.json").read_text())
registry_by_path = {entry["plugin_path"]: entry for entry in registry["plugins"]}

problems = []
for plugin in affected:
    manifest = json.loads((Path("plugins") / plugin / "manifest.json").read_text())
    top = (manifest.get("versions") or [{}])[0]
    registry_entry = registry_by_path.get(f"plugins/{plugin}")

    print(
        f"{plugin}: manifest.version={manifest.get('version')} "
        f"versions[0].version={top.get('version')} "
        f"versions[0].ledmatrix_min={top.get('ledmatrix_min')} "
        f"registry.latest_version={None if registry_entry is None else registry_entry.get('latest_version')}"
    )

    if registry_entry is None:
        problems.append(f"{plugin}: missing from plugins.json")
        continue
    if manifest.get("version") != top.get("version"):
        problems.append(f"{plugin}: manifest.version != versions[0].version")
    if manifest.get("version") != registry_entry.get("latest_version"):
        problems.append(f"{plugin}: manifest.version != plugins.json.latest_version")

if problems:
    print("\nMISMATCHES:")
    for problem in problems:
        print(f" - {problem}")
PY

base_ref=""
if git rev-parse --verify origin/main >/dev/null 2>&1; then
  base_ref="origin/main"
elif git rev-parse --verify main >/dev/null 2>&1; then
  base_ref="main"
fi

if [[ -n "$base_ref" ]]; then
  for plugin in "${plugins[@]}"; do
    echo "=== plugins/$plugin/manifest.json ==="
    git diff --unified=0 "$base_ref...HEAD" -- "plugins/$plugin/manifest.json" \
      | sed -n '/^@@/p;/ledmatrix_min/p;/^[+-][[:space:]]*"version"/p'
  done
else
  echo "No base ref available; inspect the printed ledmatrix_min values manually."
fi

Repository: ChuckBuilds/ledmatrix-plugins

Length of output: 3925


Fix manifest.json structural issues across all 20 affected plugins before publishing.

The version synchronization requirement from your guidelines is violated: all 20 affected plugins have manifest.version that does not match versions[0].version. Additionally, 4 plugins (countdown, ledmatrix-flights, web-ui-info, youtube-stats) have empty entries in the versions array with no version or ledmatrix_min recorded at all.

Examples of the mismatch:

  • baseball-scoreboard: manifest.version=1.5.5 but versions[0].version=1.5.3
  • calendar: manifest.version=1.0.2 but versions[0].version=1.0.1
  • countdown: manifest.version=1.0.1 but versions[0] is empty (missing both version and ledmatrix_min)

Per your guidelines, the version field in manifest.json must be kept in sync with the top entry in the versions array, and new versions must be added as the first entry with version, released, and ledmatrix_min fields. These manifests need to be corrected before the registry is updated.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@plugins.json` at line 3, Multiple plugin manifests have inconsistent
versioning: ensure manifest.version equals versions[0].version for each plugin
and that the first entry in the versions array contains non-empty version,
released, and ledmatrix_min fields; for the four plugins with empty top entries
(countdown, ledmatrix-flights, web-ui-info, youtube-stats) replace the empty
versions[0] with a new top entry containing the correct version string matching
manifest.version, a proper released date, and ledmatrix_min; for mismatched
plugins (e.g., baseball-scoreboard, calendar) update either manifest.version or
versions[0].version so they match, and when adding a new release always prepend
an entry to versions with keys version, released, and ledmatrix_min to keep
manifest.version synchronized with versions[0].version.

"id": "baseball-scoreboard",
"name": "Baseball Scoreboard",
"version": "1.5.4",
"version": "1.5.5",
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

Manifest release history is not aligned with version 1.5.5.

Line 4 was bumped to 1.5.5, but the versions array still starts at 1.5.3. Please add the new release entry first and update last_updated.

🛠️ Suggested fix
   "versions": [
+    {
+      "released": "2026-03-19",
+      "version": "1.5.5",
+      "ledmatrix_min": "2.0.0"
+    },
     {
       "released": "2026-02-24",
       "version": "1.5.3",
       "ledmatrix_min": "2.0.0"
     },
@@
-  "last_updated": "2026-02-24",
+  "last_updated": "2026-03-19",

As per coding guidelines: “Add the new version FIRST … in the versions array” and “Keep the version field in sync with the top entry in the versions array in manifest.json.”

Also applies to: 32-37, 99-99

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@plugins/baseball-scoreboard/manifest.json` at line 4, The manifest's
top-level "version" value (currently "1.5.5") is out of sync with the "versions"
array (which still begins at "1.5.3"); add a new release object for 1.5.5 as the
FIRST element in the "versions" array, update that new object's "last_updated"
to the correct timestamp, and ensure the top-level "version" field matches this
new first entry; update any other stale entries mentioned (lines referenced) so
"version", the first element of "versions", and its "last_updated" are all
consistent.

Comment on lines +1211 to +1212
display_width = self.display_manager.width if hasattr(self.display_manager, 'matrix') and self.display_manager.matrix else self.display_width
display_height = self.display_manager.height if hasattr(self.display_manager, 'matrix') and self.display_manager.matrix else self.display_height
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

Read display_manager.width/height unconditionally in these draw paths.

The matrix guard still skips the new property fallback in emulator/mock flows and can leave these layouts using constructor-time dimensions. That also leaves later positioning on Line 1316, Line 1384, and Line 1879 tied to stale cached sizes. Prefer getattr(self.display_manager, "width", self.display_width) / height here and carry those locals through the downstream X/Y math.

💡 Minimal fix for the size lookup
-            display_width = self.display_manager.width if hasattr(self.display_manager, 'matrix') and self.display_manager.matrix else self.display_width
-            display_height = self.display_manager.height if hasattr(self.display_manager, 'matrix') and self.display_manager.matrix else self.display_height
+            display_width = getattr(self.display_manager, "width", self.display_width)
+            display_height = getattr(self.display_manager, "height", self.display_height)

Also applies to: 1771-1772

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@plugins/baseball-scoreboard/sports.py` around lines 1211 - 1212, Replace the
conditional matrix guard when choosing display sizes with unconditional getattr
lookups so draw code always uses current manager properties: use display_width =
getattr(self.display_manager, "width", self.display_width) and display_height =
getattr(self.display_manager, "height", self.display_height) in the draw paths
that currently use the matrix-based ternary; then make sure those local
display_width/display_height locals are used for subsequent X/Y math and layout
calculations (the same change must be applied at the other occurrence noted in
the review).

Comment on lines +55 to +56
self.display_width = display_manager.width
self.display_height = display_manager.height
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

manifest=$(fd '^manifest\.json$' plugins/basketball-scoreboard | head -n1)
echo "Inspecting: ${manifest}"
jq '{
  id,
  version,
  latest_version_entry: (.versions[0] // null),
  all_ledmatrix_min_values: ([.versions[]?.ledmatrix_min] | unique)
}' "${manifest}"

Repository: ChuckBuilds/ledmatrix-plugins

Length of output: 351


Add version 1.5.5 entry to manifest versions array and align with version field.

The manifest shows version: "1.5.5" but the latest entry in versions array is "1.5.3" (released 2026-02-24). Per learnings, the version field must be kept in sync with the top entry in the versions array. Add a new entry at the top of versions with version "1.5.5", today's release date, and confirm ledmatrix_min: "2.0.0" is correct for the DisplayManager.width/height accessors now used at lines 55-56, 1553-1554, and 2081-2082.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@plugins/basketball-scoreboard/sports.py` around lines 55 - 56, Update the
manifest so the top of the versions array matches the manifest's version field:
insert a new versions[0] entry with "version": "1.5.5", "date": "2026-03-19"
(today's release date), and include the release notes; ensure the manifest's
top-level version field remains "1.5.5". Also verify and set "ledmatrix_min":
"2.0.0" in the new entry (and across the manifest if present) because the code
now accesses DisplayManager.width and DisplayManager.height (see usages at
DisplayManager.width/height references around the
self.display_width/self.display_height accessors), so confirm that API
requirement is accurate for those accessors.

"id": "countdown",
"name": "Countdown Display",
"version": "1.0.0",
"version": "1.0.1",
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

Finish the manifest version history update.

version is 1.0.1 now, but there is still no corresponding versions entry to record the release date and ledmatrix_min for this plugin update. As per coding guidelines, add the new version FIRST to the versions array with released, version, and ledmatrix_min.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@plugins/countdown/manifest.json` at line 4, The manifest's top-level
"version" was bumped to "1.0.1" but the "versions" array was not updated; add a
new entry as the first element of the "versions" array with the keys "released"
(ISO date for this release), "version": "1.0.1", and "ledmatrix_min"
(appropriate minimum LED matrix version) so the history matches the current
"version" field and follows the required ordering; update the "versions" array
near the existing entries (ensure the new object is inserted before older
entries).

"id": "mqtt-notifications",
"name": "MQTT Notifications",
"version": "1.0.0",
"version": "1.0.1",
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

Synchronize version with versions.

The top-level version is 1.0.1, but the first versions entry is still 1.0.0. That leaves the manifest internally inconsistent and omits the 1.0.1 released/ledmatrix_min metadata for this API switch. As per coding guidelines, keep version in sync with the top versions entry and add new releases there first.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@plugins/mqtt-notifications/manifest.json` at line 4, Update the manifest so
the top-level "version" value matches the first entry in the "versions" array:
add a new first entry in "versions" with "version": "1.0.1" and include the
corresponding "released" and "ledmatrix_min" metadata for this 1.0.1 release, or
alternatively bump the existing first "versions" entry to 1.0.1; ensure the
"version" field and the first element of the "versions" array are identical to
keep the manifest internally consistent.

Comment on lines +314 to +315
display_width = self.display_manager.width if hasattr(self.display_manager, 'matrix') else 128
display_height = self.display_manager.height if hasattr(self.display_manager, 'matrix') else 32
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

Initialize ScrollHelper from width/height, not matrix presence.

This guard still keys off hasattr(self.display_manager, 'matrix'), so emulator/mock display managers that only expose width/height fall back to 128x32. That leaves ScrollHelper out of sync with the real canvas and breaks scrolling/cropping on any non-default size.

Suggested fix
-        display_width = self.display_manager.width if hasattr(self.display_manager, 'matrix') else 128
-        display_height = self.display_manager.height if hasattr(self.display_manager, 'matrix') else 32
+        display_width = getattr(self.display_manager, 'width', 128)
+        display_height = getattr(self.display_manager, 'height', 32)
📝 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
display_width = self.display_manager.width if hasattr(self.display_manager, 'matrix') else 128
display_height = self.display_manager.height if hasattr(self.display_manager, 'matrix') else 32
display_width = getattr(self.display_manager, 'width', 128)
display_height = getattr(self.display_manager, 'height', 32)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@plugins/odds-ticker/manager.py` around lines 314 - 315, The code determines
display_width/height by checking for self.display_manager.matrix, which causes
mock/emulator displays that expose width/height but not matrix to fall back to
128x32 and desynchronize ScrollHelper; instead read width and height directly
from self.display_manager (e.g., use getattr(self.display_manager, 'width', 128)
and getattr(self.display_manager, 'height', 32)) and pass those values into
ScrollHelper so the helper reflects the actual canvas size (refer to
display_width/display_height, self.display_manager, and ScrollHelper when making
the change).

Comment on lines +1356 to +1357
display_width = self.display_manager.width if hasattr(self.display_manager, 'matrix') and self.display_manager.matrix else self.display_width
display_height = self.display_manager.height if hasattr(self.display_manager, 'matrix') and self.display_manager.matrix else self.display_height
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

Read display_manager.width/height unconditionally in these draw paths.

The matrix guard still bypasses the new property fallback in emulator/mock flows and can leave the canvas using constructor-time dimensions. That also keeps later positioning on Line 1471, Line 1539, and Line 2006 tied to stale cached sizes. Prefer getattr(self.display_manager, "width", self.display_width) / height here and carry those locals through the downstream X/Y math.

💡 Minimal fix for the size lookup
-            display_width = self.display_manager.width if hasattr(self.display_manager, 'matrix') and self.display_manager.matrix else self.display_width
-            display_height = self.display_manager.height if hasattr(self.display_manager, 'matrix') and self.display_manager.matrix else self.display_height
+            display_width = getattr(self.display_manager, "width", self.display_width)
+            display_height = getattr(self.display_manager, "height", self.display_height)

Also applies to: 1872-1873

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@plugins/soccer-scoreboard/sports.py` around lines 1356 - 1357, The draw paths
currently conditionally read display_manager.width/height with a matrix guard
which can leave constructors' cached dimensions in use; replace the guarded
lookup with unconditional fallbacks using getattr (e.g., set local display_width
= getattr(self.display_manager, "width", self.display_width) and display_height
= getattr(self.display_manager, "height", self.display_height)) and propagate
those locals through the downstream X/Y math used for positioning (the same
change should be applied at the other occurrence around the same draw logic).
Ensure you update both places where the matrix-guarded lookups occur so all
sizing uses the getattr fallbacks.

Comment on lines +323 to +324
matrix_width = self.display_manager.width
matrix_height = self.display_manager.height
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

🏁 Script executed:

# First, let's check the file exists and its size
wc -l plugins/stock-news/manager.py

Repository: ChuckBuilds/ledmatrix-plugins

Length of output: 106


🏁 Script executed:

# Check import statements at the top
head -20 plugins/stock-news/manager.py

Repository: ChuckBuilds/ledmatrix-plugins

Length of output: 567


🏁 Script executed:

# Check around line 323-324 for context
sed -n '320,330p' plugins/stock-news/manager.py

Repository: ChuckBuilds/ledmatrix-plugins

Length of output: 539


🏁 Script executed:

# Check around line 371-372
sed -n '368,376p' plugins/stock-news/manager.py

Repository: ChuckBuilds/ledmatrix-plugins

Length of output: 419


🏁 Script executed:

# Check around line 382-383
sed -n '379,388p' plugins/stock-news/manager.py

Repository: ChuckBuilds/ledmatrix-plugins

Length of output: 447


🏁 Script executed:

# Search for all uses of Image and ImageDraw in the file
rg '(Image|ImageDraw)' plugins/stock-news/manager.py -n

Repository: ChuckBuilds/ledmatrix-plugins

Length of output: 402


🏁 Script executed:

# Let's check the full import section (usually imports are at the top)
head -50 plugins/stock-news/manager.py | grep -E "^(import|from)"

Repository: ChuckBuilds/ledmatrix-plugins

Length of output: 335


🏁 Script executed:

# Also verify if PIL is imported anywhere in the file
rg "^(from|import).*PIL|^(from|import).*Image|^(from|import).*ImageDraw" plugins/stock-news/manager.py

Repository: ChuckBuilds/ledmatrix-plugins

Length of output: 55


Add missing PIL imports to fix runtime errors in render functions.

Image and ImageDraw are used in _display_scrolling_stock_news(), _display_no_news(), and _display_error() but are never imported, causing NameError when these methods execute.

🔧 Minimal fix
 from datetime import datetime, timezone
 from typing import Dict, Any, Optional, List
 from pathlib import Path
+from PIL import Image, ImageDraw
 
 from src.plugin_system.base_plugin import BasePlugin
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@plugins/stock-news/manager.py` around lines 323 - 324, The render methods
_display_scrolling_stock_news, _display_no_news, and _display_error use PIL
classes but fail at runtime because Image and ImageDraw are not imported; fix by
adding the missing imports from PIL (import Image and ImageDraw) at the top of
plugins/stock-news/manager.py so those functions can reference Image and
ImageDraw (ensure you import the exact symbols used in those methods).

"id": "web-ui-info",
"name": "Web UI Info",
"version": "1.0.0",
"version": "1.0.1",
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

Complete the 1.0.1 release metadata.

This bump only updates the top-level version. There is still no 1.0.1 entry recording the release metadata for the switch to DisplayManager.width/height, so the manifest cannot declare the correct minimum core version for this change. As per coding guidelines, add the new version FIRST to the versions array with released, version, and ledmatrix_min.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@plugins/web-ui-info/manifest.json` at line 4, The manifest bump updated the
top-level "version": "1.0.1" but did not add a corresponding entry to the
"versions" array; add a new object at the start of the "versions" array (before
existing entries) with fields "version": "1.0.1", "released": "<release-date>",
and "ledmatrix_min": "<minimum-core-version>" (set ledmatrix_min to the core
release that introduces DisplayManager.width/height) so the manifest correctly
declares the minimum core version for this change.

@Olino3 Olino3 closed this Mar 19, 2026
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.

2 participants