fix: use DisplayManager width/height properties instead of matrix object#52
fix: use DisplayManager width/height properties instead of matrix object#52Olino3 wants to merge 1 commit intoChuckBuilds:mainfrom
Conversation
…y_manager.width/height Mechanical replacement across 20 plugins (39 Python files). Bumped patch versions for all affected plugins. Regenerated plugins.json.
📝 WalkthroughWalkthroughThis 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 Changes
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~20 minutes Possibly related PRs
🚥 Pre-merge checks | ✅ 3✅ Passed checks (3 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. Important Merge conflicts detected (Beta)
✨ Finishing Touches🧪 Generate unit tests (beta)
📝 Coding Plan
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. Comment Tip You can customize the high-level summary generated by CodeRabbit.Configure the |
There was a problem hiding this comment.
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 | 🟠 MajorManifest version metadata is inconsistent and missing the new release entry.
Line 4 sets
versionto1.5.5, but the topversionsitem is still1.5.3. Add1.5.5as the first entry inversionsand 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
versionsarray inmanifest.json” and “Keep theversionfield in sync with the top entry in theversionsarray inmanifest.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 | 🟡 MinorMissing version entry in
versionsarray.The
versionfield is1.2.4, but theversionsarray top entry is1.2.2. As per coding guidelines, the new version must be added FIRST to theversionsarray and kept in sync with theversionfield.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 | 🟡 MinorMissing entry in
versionsarray.The
versionfield was bumped to1.0.2, but theversionsarray only contains the1.0.1entry. Add the new version FIRST to theversionsarray and updatelast_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
versionsarray" and "Keep theversionfield 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 | 🟡 MinorMissing entry in
versionsarray.The
versionfield was bumped to1.0.3, but theversionsarray still only contains the1.0.2entry. Per coding guidelines, add the new version FIRST to theversionsarray withreleased,version, andledmatrix_minfields, and updatelast_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
versionsarray inmanifest.json" and "Keep theversionfield in sync with the top entry in theversionsarray".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 | 🟡 MinorMissing entry in
versionsarray.The
versionfield was bumped to1.1.2, but theversionsarray top entry is still1.1.1. Add the new version FIRST and updatelast_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
versionsarray" and "Keep theversionfield 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 | 🟡 MinorMissing entry in
versionsarray.The
versionfield was bumped to2.0.3, but theversionsarray top entry is still2.0.2. Add the new version FIRST and updatelast_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
versionsarray" and "Keep theversionfield 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 | 🟡 MinorMissing
versionsarray in manifest.The manifest is missing the
versionsarray entirely. Per coding guidelines, add aversionsarray with entries containingreleased,version, andledmatrix_minfields, 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
versionsarray inmanifest.json, with fields:released(date),version(semver), andledmatrix_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 | 🟡 MinorThe 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 | 🟡 MinorMissing version entries in
versionsarray.The
versionfield is1.4.5, but theversionsarray top entry is1.4.3. There appear to be missing entries for versions1.4.4and1.4.5. As per coding guidelines, new versions must be added FIRST to theversionsarray.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 | 🟡 MinorMissing version entry in
versionsarray.The
versionfield is1.0.2, but theversionsarray only contains1.0.1. As per coding guidelines, the new version must be added FIRST to theversionsarray, and theversionfield 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 | 🟡 MinorMissing version entries in
versionsarray.The
versionfield is1.2.3, but theversionsarray top entry is1.2.1. There appear to be missing entries for versions1.2.2and1.2.3. As per coding guidelines, new versions must be added FIRST to theversionsarray.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 | 🟡 MinorMissing version entry in
versionsarray.The
versionfield is1.0.3, but theversionsarray top entry is1.0.2. As per coding guidelines, the new version must be added FIRST to theversionsarray, and theversionfield 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 | 🟡 MinorMissing version entries in
versionsarray.The
versionfield is1.2.5, but theversionsarray top entry is1.2.3. There appear to be missing entries for versions1.2.4and1.2.5. As per coding guidelines, new versions must be added FIRST to theversionsarray.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 usesself.display_heightinstead of the localdisplay_heightvariable.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_heightvariables but lines 1316, 1318, and 1384 still useself.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
📒 Files selected for processing (60)
plugins.jsonplugins/baseball-scoreboard/logo_manager.pyplugins/baseball-scoreboard/manager.pyplugins/baseball-scoreboard/manifest.jsonplugins/baseball-scoreboard/scroll_display.pyplugins/baseball-scoreboard/sports.pyplugins/basketball-scoreboard/basketball.pyplugins/basketball-scoreboard/manager.pyplugins/basketball-scoreboard/manifest.jsonplugins/basketball-scoreboard/scroll_display.pyplugins/basketball-scoreboard/sports.pyplugins/calendar/manager.pyplugins/calendar/manifest.jsonplugins/countdown/manager.pyplugins/countdown/manifest.jsonplugins/f1-scoreboard/manager.pyplugins/f1-scoreboard/manifest.jsonplugins/f1-scoreboard/scroll_display.pyplugins/football-scoreboard/football.pyplugins/football-scoreboard/manager.pyplugins/football-scoreboard/manifest.jsonplugins/football-scoreboard/scroll_display.pyplugins/football-scoreboard/sports.pyplugins/hockey-scoreboard/base_classes.pyplugins/hockey-scoreboard/manager.pyplugins/hockey-scoreboard/manifest.jsonplugins/hockey-scoreboard/scoreboard_renderer.pyplugins/hockey-scoreboard/scroll_display.pyplugins/hockey-scoreboard/sports.pyplugins/ledmatrix-flights/manager.pyplugins/ledmatrix-flights/manifest.jsonplugins/ledmatrix-music/manager.pyplugins/ledmatrix-music/manifest.jsonplugins/ledmatrix-stocks/display_renderer.pyplugins/ledmatrix-stocks/manifest.jsonplugins/ledmatrix-weather/manager.pyplugins/ledmatrix-weather/manifest.jsonplugins/mqtt-notifications/manager.pyplugins/mqtt-notifications/manifest.jsonplugins/odds-ticker/manager.pyplugins/odds-ticker/manifest.jsonplugins/odds-ticker/odds_renderer.pyplugins/soccer-scoreboard/manager.pyplugins/soccer-scoreboard/manifest.jsonplugins/soccer-scoreboard/scroll_display.pyplugins/soccer-scoreboard/sports.pyplugins/static-image/manager.pyplugins/static-image/manifest.jsonplugins/stock-news/manager.pyplugins/stock-news/manifest.jsonplugins/text-display/manager.pyplugins/text-display/manifest.jsonplugins/ufc-scoreboard/manager.pyplugins/ufc-scoreboard/manifest.jsonplugins/ufc-scoreboard/scroll_display.pyplugins/ufc-scoreboard/sports.pyplugins/web-ui-info/manager.pyplugins/web-ui-info/manifest.jsonplugins/youtube-stats/manager.pyplugins/youtube-stats/manifest.json
| { | ||
| "version": "1.0.0", | ||
| "last_updated": "2026-02-26", | ||
| "last_updated": "2026-03-19", |
There was a problem hiding this comment.
🧩 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."
fiRepository: 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", |
There was a problem hiding this comment.
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.
| 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 |
There was a problem hiding this comment.
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).
| self.display_width = display_manager.width | ||
| self.display_height = display_manager.height |
There was a problem hiding this comment.
🧩 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", |
There was a problem hiding this comment.
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", |
There was a problem hiding this comment.
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.
| 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 |
There was a problem hiding this comment.
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.
| 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).
| 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 |
There was a problem hiding this comment.
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.
| matrix_width = self.display_manager.width | ||
| matrix_height = self.display_manager.height |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
# First, let's check the file exists and its size
wc -l plugins/stock-news/manager.pyRepository: ChuckBuilds/ledmatrix-plugins
Length of output: 106
🏁 Script executed:
# Check import statements at the top
head -20 plugins/stock-news/manager.pyRepository: ChuckBuilds/ledmatrix-plugins
Length of output: 567
🏁 Script executed:
# Check around line 323-324 for context
sed -n '320,330p' plugins/stock-news/manager.pyRepository: ChuckBuilds/ledmatrix-plugins
Length of output: 539
🏁 Script executed:
# Check around line 371-372
sed -n '368,376p' plugins/stock-news/manager.pyRepository: ChuckBuilds/ledmatrix-plugins
Length of output: 419
🏁 Script executed:
# Check around line 382-383
sed -n '379,388p' plugins/stock-news/manager.pyRepository: 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 -nRepository: 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.pyRepository: 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", |
There was a problem hiding this comment.
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.
Summary
display_manager.matrix.width/height) with safe DisplayManager properties (display_manager.width/height) across all 20 affected pluginsChanges
plugins.jsonregistry regenerated viaupdate_registry.pyAffected 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
Chores