Skip to content

Conversation

@supervoidcoder
Copy link
Member

@supervoidcoder supervoidcoder commented Nov 20, 2025

Accidentally merged #159 but a refresh is good because the other pr reached nearly 400 comemnts

Progress:

  • Add our own extension library
  • Add our own designs/thumbnails
  • Add the JavaScript extension entry on gallery
  • Make button on JavaScript extension work
  • Make code on JavaScript extension work
  • Make Ace Editor JavaScript Extension work

@devloai

This comment has been minimized.

@amazon-q-developer
Copy link
Contributor

Code review in progress. Analyzing for code quality issues and best practices. You can monitor the review status in the checks section at the bottom of this pull request. Detailed findings will be posted upon completion.

Using Amazon Q Developer for GitHub

Amazon Q Developer1 is an AI-powered assistant that integrates directly into your GitHub workflow, enhancing your development process with intelligent features for code development, review, and transformation.

Slash Commands

Command Description
/q <message> Chat with the agent to ask questions or request revisions
/q review Requests an Amazon Q powered code review
/q help Displays usage information

Features

Agentic Chat
Enables interactive conversation with Amazon Q to ask questions about the pull request or request specific revisions. Use /q <message> in comment threads or the review body to engage with the agent directly.

Code Review
Analyzes pull requests for code quality, potential issues, and security concerns. Provides feedback and suggested fixes. Automatically triggered on new or reopened PRs (can be disabled for AWS registered installations), or manually with /q review slash command in a comment.

Customization

You can create project-specific rules for Amazon Q Developer to follow:

  1. Create a .amazonq/rules folder in your project root.
  2. Add Markdown files in this folder to define rules (e.g., cdk-rules.md).
  3. Write detailed prompts in these files, such as coding standards or best practices.
  4. Amazon Q Developer will automatically use these rules when generating code or providing assistance.

Example rule:

All Amazon S3 buckets must have encryption enabled, enforce SSL, and block public access.
All Amazon DynamoDB Streams tables must have encryption enabled.
All Amazon SNS topics must have encryption enabled and enforce SSL.
All Amazon SNS queues must enforce SSL.

Feedback

To provide feedback on Amazon Q Developer, create an issue in the Amazon Q Developer public repository.

For more detailed information, visit the Amazon Q for GitHub documentation.

Footnotes

  1. Amazon Q Developer uses generative AI. You may need to verify generated code before using it in your environment. See the AWS Responsible AI Policy.

@github-actions
Copy link
Contributor

github-actions bot commented Nov 20, 2025

🎨 Visual Regression Test Results

Hi @supervoidcoder! Here are the visual comparison results:

✅ No Visual Changes Detected

All screenshots match the base branch! 🎉

📊 All Screenshots Checked

Screenshot Status
editor-initial ⚠️ Skipped
blocks-workspace ⚠️ Skipped
stage-sprites ⚠️ Skipped
code-tab ⚠️ Skipped
costumes-tab ⚠️ Skipped
sounds-tab ⚠️ Skipped
player-view ⚠️ Skipped

📦 Download all screenshots

💡 Tip: Download the artifacts to view detailed before/after comparisons!

@github-actions
Copy link
Contributor

github-actions bot commented Nov 20, 2025

🎉 MEGA PR Test & Analysis Complete!

Hi @supervoidcoder! Your PR has been fully tested and analyzed! 🚀✨


🌍 Test Deployment

Live Preview: https://OmniBlocks.github.io/scratch-gui/supervoidcoder/385/


🧪 Test Results

ESLint: ❌ Found issues

  • Errors: 0
  • Warnings: 0

Unit Tests:

  • Total: 37 tests
  • ✅ Passed: 1
  • ❌ Failed: 0

Integration Tests:

  • Total: 37 tests
  • ✅ Passed: 0
  • ❌ Failed: 15
  • ⏭️ Skipped: 1

📄 Full test outputs available in artifacts


🔦 Performance Audit (Lighthouse)

✅ Audit completed successfully!

📊 Lighthouse Scores:

  • 🔴 Performance: 33/100
  • 🟠 Accessibility: 70/100
  • 🟢 Best Practices: 93/100
  • 🟠 SEO: 88/100

⚡ Core Web Vitals:

  • First Contentful Paint: 43.5 s
  • Largest Contentful Paint: 47.0 s
  • Total Blocking Time: 990 ms
  • Cumulative Layout Shift: 0
  • Speed Index: 43.5 s

🟢 90-100 (Good) | 🟠 50-89 (Needs Improvement) | 🔴 0-49 (Poor)

📄 Full report in artifacts


📦 Bundle Size Analysis

Total Build Size: 136M

📦 Top 5 Largest JavaScript Files:

  • 20M - samples3.js
  • 20M - player/samples3.js
  • 13M - player/drumsamples.js
  • 13M - drumsamples.js
  • 9.5M - samples2.js

🎨 Top 5 Largest CSS Files:

  • No CSS files found (might be inlined in JS)

♿ Accessibility Testing

✅ Accessibility scan completed!


📊 Build Details


💡 Pro Tip: Only one build was needed for all these checks - saving CI/CD minutes! 🎯

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Nov 20, 2025

Note

Other AI code review bot(s) detected

CodeRabbit has detected other AI code review bot(s) in this pull request and will avoid duplicating their findings in the review comments. This may lead to a less comprehensive review.

Walkthrough

Adds a runtime bridge and defensive stub for Blockly/ScratchBlocks FieldCustom, implements dual extension galleries (TurboWarp and OmniBlocks) with per-gallery fetchers and 750ms timeouts, adds OmniBlocks gallery exports plus a JavaScript V2 extension entry, and introduces an Unsandbox modal and canUnsandbox security manager method.

Changes

Cohort / File(s) Summary
Blockly FieldCustom Bridge
src/containers/blocks.jsx
Assigns window.Blockly.FieldCustom to ScratchBlocks.FieldCustom when present; injects a defensive stub exposing registerInput, unregisterInput, and getRegisteredInputs (returns empty Map) and logs a warning if ScratchBlocks.FieldCustom is missing.
Dual-Gallery Loading System
src/containers/extension-library.jsx
Replaces single gallery fetch with fetchLibraryTW and fetchLibraryOB, adds loadGalleryWithTimeout helper, per-gallery state (galleryTW/OB, errors, timed-out flags), and 750ms per-gallery timeouts; updates rendering to show TW then OB with a separator and individual error/loading UI.
Gallery & Extension Registry
src/lib/libraries/extensions/index.jsx
Adds galleryLoadingOB, galleryMoreOB, galleryErrorOB exports (OmniBlocks branding/URLs), adds JavaScript V2 extension (SPjavascriptV2), updates TurboWarp gallery messages to fixed "TurboWarp Extension Gallery", and imports new icon assets.
Unsandbox Modal UI
src/components/tw-security-manager-modal/unsandbox.jsx, src/components/tw-security-manager-modal/security-manager-modal.jsx
New UnsandboxModal component rendering i18n messages; SecurityManagerModalComponent now renders UnsandboxModal when SecurityModals.Unsandbox is selected.
Security Manager API
src/containers/tw-security-manager.jsx, src/lib/tw-security-manager-constants.js
Adds SecurityModals.Unsandbox constant and public canUnsandbox(extensionName) method that acquires a modal lock, shows the Unsandbox modal, and returns the user decision; registers canUnsandbox in SECURITY_MANAGER_METHODS.

Sequence Diagram

sequenceDiagram
    participant UI as Extension Library UI
    participant EL as extension-library.jsx
    participant TWFetch as fetchLibraryTW
    participant OBFetch as fetchLibraryOB
    participant TWApi as TurboWarp API
    participant OBApi as OmniBlocks API
    participant Render as Renderer

    rect rgba(200, 220, 255, 0.5)
    Note over EL: Dual-Gallery Load Initiated
    EL->>EL: Initialize galleryTW & galleryOB state\nStart 750ms timers
    end

    par TurboWarp Gallery Loading
        rect rgba(220, 240, 200, 0.5)
        EL->>TWFetch: fetchLibraryTW()
        TWFetch->>TWApi: Request TurboWarp extensions
        alt TW Success
            TWApi-->>TWFetch: Extension data
            TWFetch-->>EL: populate galleryTW, clear timeout
        else TW Timeout/Error
            Note over EL: set galleryTWTimedOut or galleryTWError
        end
        end
    and OmniBlocks Gallery Loading
        rect rgba(240, 220, 200, 0.5)
        EL->>OBFetch: fetchLibraryOB()
        OBFetch->>OBApi: Request OmniBlocks extensions
        alt OB Success
            OBApi-->>OBFetch: Extension data
            OBFetch-->>EL: populate galleryOB, clear timeout
        else OB Timeout/Error
            Note over EL: set galleryOBTimedOut or galleryOBError
        end
        end
    end

    rect rgba(200, 200, 220, 0.5)
    Note over EL: Rendering Phase
    EL->>Render: Render TW Gallery (or error/loading)
    EL->>Render: Render separator
    EL->>Render: Render OB Gallery (or error/loading)
    Render-->>UI: Display dual galleries with separate error handling
    end
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

Suggested labels

security-sensitive, enhancement

Poem

🐰 Hop-hop, I patched a field and split the store,
Two galleries bloom, one, then one more.
A modal whispers "Unsandbox?" — think twice, friend,
Small fallbacks keep the UI steady to the end. ✨

🚥 Pre-merge checks | ✅ 2 | ❌ 1
❌ Failed checks (1 inconclusive)
Check name Status Explanation Resolution
Title check ❓ Inconclusive The title 'Extensions' is vague and overly broad. While the PR does involve extension-related changes, the single-word title does not convey meaningful information about the specific changeset (dual-gallery loading, FieldCustom bridge, OmniBlocks support, unsandbox modal). Use a more descriptive title that captures the main intent, such as 'Add OmniBlocks gallery and unsandbox modal support' or 'Implement dual extension gallery loading with security manager'
✅ Passed checks (2 passed)
Check name Status Explanation
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Description check ✅ Passed The description mentions merging #159 and provides a checklist of extension-related tasks, which aligns with the changeset's focus on adding OmniBlocks extension gallery, JavaScript extension support, security manager updates, and UI components.

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

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch extensions

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.

@wellcode-ai wellcode-ai bot added review-effort-3 Standard review (30-60 min) needs-careful-testing Requires special attention: needs careful-testing labels Nov 20, 2025
@wellcode-ai
Copy link

wellcode-ai bot commented Nov 20, 2025

🔍 General Code Quality Feedback

🔍 Comprehensive Code Review

Consolidated Feedback

  • 🔍 Code Review Analysis

Overall Assessment: The pull request introduces new functionality and enhancements to the extension library, but it also contains several critical issues related to code quality, security, and maintainability that need to be addressed before merging.

Critical Issues:

  • Issue 1: Missing Error Handling in Fetch Requests → The fetchLibraryTW function does not handle network errors or JSON parsing errors adequately. Implement a try-catch block around the fetch and JSON parsing to ensure that errors are caught and handled gracefully.

    const fetchLibraryTW = async () => {
        try {
            const res = await fetch('https://extensions.turbowarp.org/generated-metadata/extensions-v0.json');
            if (!res.ok) {
                throw new Error(`HTTP status ${res.status}`);
            }
            const data = await res.json();
            return data.extensions.map(extension => ({
                // mapping logic
            }));
        } catch (error) {
            console.error("Failed to fetch library:", error);
            throw error; // or handle it as needed
        }
    };
  • Issue 2: Security Vulnerability with External Links → The <a> tags in the credits section do not have any content, which could lead to confusion and potential security issues if not handled properly. Ensure that the credit.name is displayed as the link text to avoid empty links.

    return (
        <a
            href={credit.link}
            target="_blank"
            rel="noreferrer"
            key={credit.name}
        >
            {credit.name} {/* Display the credit name */}
        </a>
    );

Improvements:

  • Suggestion 1: Code Duplication in Fetch Logic → The fetch logic for cachedGalleryTW and cachedGalleryOB appears to be similar. Consider creating a generic fetch function that accepts the URL and returns the processed data to reduce duplication.

    const fetchLibrary = async (url) => {
        const res = await fetch(url);
        if (!res.ok) throw new Error(`HTTP status ${res.status}`);
        const data = await res.json();
        return data.extensions.map(extension => ({
            // mapping logic
        }));
    };
    
    const fetchLibraryTW = () => fetchLibrary('https://extensions.turbowarp.org/generated-metadata/extensions-v0.json');
  • Suggestion 2: Documentation and Comments → While there are some comments, additional documentation for the new JavaScript extension and its purpose would improve maintainability. Consider adding JSDoc comments for the new components and functions.

    /**
     * Fetches the extension library from the specified URL.
     * @returns {Promise<Array>} A promise that resolves to an array of extensions.
     */
    const fetchLibrary = async (url) => {
        // implementation
    };

Positive Notes:

  • The use of FormattedMessage for internationalization is a good practice, ensuring that the application can support multiple languages effectively.
  • The introduction of constants like GALLERY_TIMEOUT_MS enhances code readability and maintainability.

Next Steps:

  1. Implement error handling in the fetch functions to ensure robustness against network issues.
  2. Update the <a> tags to include link text for better user experience and security.
  3. Refactor the fetch logic to eliminate duplication and improve maintainability.
  4. Add documentation for new functions and components to enhance clarity for future developers.
  5. Write unit tests for the new JavaScript extension functionality to ensure it behaves as expected and to cover any edge cases.

By addressing these issues and suggestions, the code quality, security, and maintainability of the project will be significantly improved.

🤖 Generated by Wellcode.ai

Copy link
Contributor

@amazon-q-developer amazon-q-developer bot left a comment

Choose a reason for hiding this comment

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

Summary

This PR adds support for dual extension galleries (TurboWarp and OmniBlocks) and includes a JavaScript V2 extension. While the functionality appears to work, there are several critical issues that need to be addressed before merging:

Critical Issues Found:

  1. Security Vulnerability: The JavaScript V2 extension allows arbitrary code execution without proper sandboxing or security warnings
  2. Logic Errors: Race condition in gallery loading timeout handling and inconsistent return types in fallback implementations
  3. Performance Issues: Complex SVG file that may impact rendering performance

Changes Overview:

  • ✅ Adds dual gallery support for TurboWarp and OmniBlocks extensions
  • ✅ Implements proper error handling and loading states for both galleries
  • ✅ Adds FieldCustom bridging for JavaScript extensions
  • ⚠️ Includes JavaScript V2 extension with security concerns
  • ⚠️ Contains race conditions and type inconsistencies

Recommendation:

Request Changes - The security vulnerability and logic errors need to be resolved before this can be safely merged. Please address the identified issues, particularly the JavaScript execution security concerns and race condition handling.


You can now have the agent implement changes and create commits directly on your pull request's source branch. Simply comment with /q followed by your request in natural language to ask the agent to make changes.

width="600"
height="300"
viewBox="0 200 590 200">
<defs><linearGradient x1="415.18966" y1="237.23724" x2="415.18966" y2="375.40225" gradientUnits="userSpaceOnUse" id="color-1"><stop offset="0" stop-color="#3b3500"/><stop offset="1" stop-color="#005f7b"/></linearGradient><linearGradient x1="415.18966" y1="237.23724" x2="415.18966" y2="375.40225" gradientUnits="userSpaceOnUse" id="color-2"><stop offset="0" stop-color="#ecff00" stop-opacity="0"/><stop offset="1" stop-color="#ecff00"/></linearGradient><linearGradient x1="415.18967" y1="237.23724" x2="415.18967" y2="375.40225" gradientUnits="userSpaceOnUse" id="color-3"><stop offset="0" stop-color="#3b3500"/><stop offset="1" stop-color="#005f7b"/></linearGradient><linearGradient x1="415.18966" y1="375.40225" x2="415.18966" y2="237.23724" gradientUnits="userSpaceOnUse" id="color-4"><stop offset="0" stop-color="#ecff00" stop-opacity="0"/><stop offset="1" stop-color="#ecff00"/></linearGradient><linearGradient x1="458.43293" y1="143.49311" x2="458.43293" y2="184.88996" gradientUnits="userSpaceOnUse" id="color-5"><stop offset="0" stop-color="#00caff" stop-opacity="0"/><stop offset="1" stop-color="#00caff"/></linearGradient><linearGradient x1="458.43293" y1="184.88996" x2="458.43293" y2="143.49311" gradientUnits="userSpaceOnUse" id="color-6"><stop offset="0" stop-color="#00caff" stop-opacity="0"/><stop offset="1" stop-color="#00caff"/></linearGradient><linearGradient x1="530.46404" y1="223.00649" x2="530.34442" y2="362.1403" gradientUnits="userSpaceOnUse" id="color-7"><stop offset="0" stop-color="#32ff00" stop-opacity="0"/><stop offset="1" stop-color="#32ff00" stop-opacity="0.72003"/></linearGradient><linearGradient x1="530.34442" y1="362.1403" x2="530.46404" y2="223.00649" gradientUnits="userSpaceOnUse" id="color-8"><stop offset="0" stop-color="#32ff00" stop-opacity="0"/><stop offset="1" stop-color="#32ff00" stop-opacity="0.72003"/></linearGradient><linearGradient x1="441.32559" y1="203.35782" x2="428.97627" y2="210.96925" gradientUnits="userSpaceOnUse" id="color-9"><stop offset="0" stop-color="#0067bb"/><stop offset="1" stop-color="#00ba87"/></linearGradient><linearGradient x1="518.60459" y1="203.71223" x2="506.25527" y2="211.32366" gradientUnits="userSpaceOnUse" id="color-10"><stop offset="0" stop-color="#0067bb"/><stop offset="1" stop-color="#00ba87"/></linearGradient><linearGradient x1="469.77156" y1="210.76632" x2="448.58355" y2="223.82539" gradientUnits="userSpaceOnUse" id="color-11"><stop offset="0" stop-color="#0067bb"/><stop offset="1" stop-color="#00ba87"/></linearGradient><linearGradient x1="448.64946" y1="223.53183" x2="439.54807" y2="229.1414" gradientUnits="userSpaceOnUse" id="color-12"><stop offset="0" stop-color="#0067bb"/><stop offset="1" stop-color="#00ba87"/></linearGradient><linearGradient x1="367.66935" y1="326.48509" x2="417.45011" y2="314.56574" gradientUnits="userSpaceOnUse" id="color-13"><stop offset="0" stop-color="#0004ff"/><stop offset="1" stop-color="#ff00e8"/></linearGradient><linearGradient x1="375.05764" y1="255.81627" x2="417.30897" y2="274.22279" gradientUnits="userSpaceOnUse" id="color-14"><stop offset="0" stop-color="#a5ff00"/><stop offset="1" stop-color="#33ff00"/></linearGradient><linearGradient x1="368.61393" y1="283.41896" x2="382.323" y2="293.1381" gradientUnits="userSpaceOnUse" id="color-15"><stop offset="0" stop-color="#a5ff00"/><stop offset="1" stop-color="#33ff00"/></linearGradient><linearGradient x1="425.30383" y1="297.77355" x2="445.7234" y2="311.22262" gradientUnits="userSpaceOnUse" id="color-16"><stop offset="0" stop-color="#00ffc5"/><stop offset="1" stop-color="#ff4200"/></linearGradient><radialGradient cx="446.82633" cy="273.28045" r="19.52122" gradientUnits="userSpaceOnUse" id="color-17"><stop offset="0" stop-color="#00ff2b"/><stop offset="1" stop-color="#00ff2b" stop-opacity="0"/></radialGradient><linearGradient x1="452.95362" y1="259.63717" x2="447.03752" y2="285.14669" gradientUnits="userSpaceOnUse" id="color-18"><stop offset="0" stop-color="#00ff1a" stop-opacity="0.81961"/><stop offset="1" stop-color="#00bbff" stop-opacity="0.88235"/></linearGradient></defs><g transform="translate(-160.72072,9.59956)"><g stroke-miterlimit="10"><path d="M160.72072,439.60959v-300h600v300z" fill="#59c0c0" fill-rule="nonzero" stroke="none" stroke-width="0.89803" stroke-linecap="butt"/><path d="M161.51153,289.60963c0,-165.24867 133.96051,-299.20919 299.20919,-299.20919c165.24865,0 299.2092,133.96053 299.2092,299.20919c0,165.24864 -133.96055,299.2092 -299.2092,299.2092c-165.24868,0 -299.20919,-133.96057 -299.20919,-299.2092z" fill="#94ffff" fill-rule="nonzero" stroke="none" stroke-width="0.93695" stroke-linecap="butt"/><path d="M198.52101,289.60963c0,-144.80889 117.3908,-262.1997 262.19971,-262.1997c144.80889,0 262.1997,117.39081 262.1997,262.1997c0,144.80886 -117.3908,262.19969 -262.1997,262.19969c-144.80889,0 -262.19969,-117.39083 -262.19969,-262.19968z" fill="#59c0c0" fill-rule="nonzero" stroke="none" stroke-width="0.93695" stroke-linecap="butt"/><path d="M235.99902,289.60963c0,-124.11039 100.61135,-224.72174 224.72174,-224.72174c124.11039,0 224.72172,100.61135 224.72172,224.72174c0,124.11036 -100.61136,224.72174 -224.72172,224.72174c-124.11038,0 -224.72173,-100.61138 -224.72174,-224.72174z" fill="#94ffff" fill-rule="nonzero" stroke="none" stroke-width="0.93695" stroke-linecap="butt"/><path d="M273.94546,289.60963c0,-103.15314 83.62214,-186.77528 186.77529,-186.77528c103.15314,0 186.7753,83.62215 186.7753,186.77528c0,103.15314 -83.62216,186.7753 -186.7753,186.7753c-103.15313,0 -186.77527,-83.62216 -186.77527,-186.7753z" fill="#59c0c0" fill-rule="nonzero" stroke="none" stroke-width="0.93695" stroke-linecap="butt"/><path d="M310.7207,289.60963c0,-82.84272 67.1573,-150.00001 150.00002,-150.00001c82.84271,0 150.00004,67.15729 150.00004,150.00001c0,82.84272 -67.15733,150.00002 -150,150.00002c-82.84274,0 -150.00003,-67.15729 -150.00003,-150.00001z" fill="#94ffff" fill-rule="nonzero" stroke="none" stroke-width="0.93695" stroke-linecap="butt"/><path d="M348.90139,289.60963c0,-61.7561 50.06322,-111.81933 111.81933,-111.81933c61.7561,0 111.81936,50.06323 111.81936,111.81933c0,61.75611 -50.06323,111.81933 -111.81933,111.81933c-61.75612,0 -111.81935,-50.06322 -111.81935,-111.81933z" fill="#59c0c0" fill-rule="nonzero" stroke="none" stroke-width="0.93695" stroke-linecap="butt"/><g><path d="M362.71556,289.60963c0,-54.12679 43.87841,-98.0052 98.00516,-98.0052c54.12679,0 98.0052,43.8784 98.0052,98.0052c0,54.12675 -43.87841,98.00515 -98.00515,98.00515c-54.12679,0 -98.00518,-43.8784 -98.00518,-98.00515z" fill="#94ffff" fill-rule="nonzero" stroke="none" stroke-width="0.93695" stroke-linecap="butt"/><path d="M411.86448,289.60963c0,-26.98255 21.87367,-48.85621 48.85617,-48.85621c26.98251,0 48.85623,21.87367 48.85623,48.85621c0,26.98251 -21.87371,48.85617 -48.85623,48.85617c-26.9825,0 -48.85617,-21.87366 -48.85617,-48.85617z" fill="#59c0c0" fill-rule="nonzero" stroke="none" stroke-width="0.93695" stroke-linecap="butt"/><g fill-rule="nonzero" stroke-width="10.5" stroke-linecap="butt"><path d="M349.87116,375.40225v-138.16501h130.637v138.16501z" fill="url(#color-1)" stroke="url(#color-2)"/><path d="M480.50817,237.23724v138.16501h-130.637v-138.16501z" fill="url(#color-3)" stroke="url(#color-4)"/></g><g fill="#00395c" fill-rule="nonzero" stroke-width="5" stroke-linecap="butt"><path d="M351.68555,232.66923l78.76697,-28.85224l137.60223,1.36582l-83.9178,28.69604z" stroke="url(#color-5)"/><path d="M566.24037,205.7876l-82.1034,28.09123l-132.4514,-1.2096c0,0 4.1397,-1.51636 8.22896,-3.01425c11.97248,-4.38551 70.53801,-25.83799 70.53801,-25.83799z" stroke="url(#color-6)"/></g><g fill="#0e3b11" fill-rule="nonzero" stroke-width="10.5" stroke-linecap="butt"><path d="M489.2382,374.46547l0.11959,-139.13381l82.21248,-24.65032l-0.11959,139.13381z" stroke="url(#color-7)"/><path d="M571.57028,210.68132l-0.11959,139.13381l-82.21248,24.65032l0.11959,-139.13381z" stroke="url(#color-8)"/></g><path d="M501.62181,252.25014l3.8189,-1.0696c0.31207,-0.08741 0.62056,0.06079 0.85786,0.41216l2.24454,3.32345c0.35846,0.53077 0.82469,0.75476 1.2964,0.62265l4.68391,-1.31188c0.4717,-0.13211 0.90991,-0.60942 1.21846,-1.32699l1.93202,-4.49324c0.20427,-0.47505 0.49419,-0.79084 0.80627,-0.87825l37.78743,-10.58358c0.64961,-0.18195 1.21579,0.65638 1.26445,1.87302l1.1051,27.64188c0.04863,1.21663 -0.43871,2.35004 -1.08834,2.532l-37.78743,10.58358c-0.4717,0.13211 -0.90991,0.60942 -1.21846,1.32699l-1.93202,4.49324c-0.20427,0.47505 -0.49419,0.79084 -0.80627,0.87825l-4.68391,1.31188c-0.31207,0.08741 -0.62056,-0.06079 -0.85786,-0.41216l-2.24454,-3.32345c-0.35846,-0.53077 -0.82469,-0.75476 -1.2964,-0.62265l-3.8189,1.0696c-0.64961,0.18195 -1.21579,-0.65638 -1.26445,-1.87302l-1.1051,-27.64188c-0.04863,-1.21663 0.43871,-2.35004 1.08834,-2.53198z" fill-opacity="0.44973" fill="#82ff00" fill-rule="evenodd" stroke="#9bff5a" stroke-width="1" stroke-linecap="butt"/><path d="M502.34161,284.17793l4.15538,-1.12209c0.33956,-0.09169 0.67306,0.05129 0.92741,0.39767l2.40576,3.27623c0.3842,0.52322 0.88824,0.73935 1.40151,0.60075l5.09661,-1.37626c0.51326,-0.13859 0.99335,-0.62047 1.33493,-1.33968l2.13881,-4.50341c0.22613,-0.47613 0.54377,-0.79493 0.88333,-0.88663l22.80263,-6.15747c0.70687,-0.19088 1.3137,0.63555 1.35526,1.84642l0.94399,27.51091c0.04154,1.21088 -0.49795,2.34685 -1.20482,2.53772l-22.80263,6.15747c-0.51326,0.13859 -0.99335,0.62047 -1.33493,1.33968l-2.13881,4.50341c-0.22613,0.47613 -0.54377,0.79493 -0.88333,0.88663l-5.09661,1.37626c-0.33956,0.09169 -0.67306,-0.05129 -0.92741,-0.39767l-2.40576,-3.27623c-0.3842,-0.52322 -0.88824,-0.73935 -1.40151,-0.60075l-4.15538,1.12209c-0.70687,0.19088 -1.3137,-0.63555 -1.35526,-1.84642l-0.94399,-27.51091c-0.04154,-1.21088 0.49795,-2.34685 1.20482,-2.53772z" fill-opacity="0.66747" fill="#0100ff" fill-rule="evenodd" stroke="#00d6ff" stroke-width="1" stroke-linecap="butt"/><path d="M502.51738,315.85871l4.33349,-1.18453c0.35411,-0.0968 0.70712,0.04214 0.98164,0.38642l2.59666,3.25629c0.4147,0.52004 0.94822,0.73004 1.48348,0.58373l5.31505,-1.45282c0.53526,-0.14631 1.02804,-0.63684 1.37025,-1.36377l2.14269,-4.55176c0.22653,-0.48124 0.55258,-0.80578 0.90671,-0.90258l35.37592,-9.66973c0.73715,-0.2015 1.39216,0.6199 1.46281,1.8352l1.60541,27.61135c0.07065,1.21529 -0.46982,2.36346 -1.20698,2.56496l-35.37592,9.66973c-0.53526,0.14631 -1.02804,0.63684 -1.37025,1.36377l-2.14269,4.55176c-0.22653,0.48124 -0.55258,0.80578 -0.90671,0.90258l-5.31505,1.45282c-0.35411,0.0968 -0.70712,-0.04214 -0.98164,-0.38642l-2.59666,-3.25629c-0.4147,-0.52004 -0.94822,-0.73004 -1.48348,-0.58373l-4.33349,1.18453c-0.73715,0.2015 -1.39216,-0.6199 -1.46281,-1.8352l-1.60541,-27.61135c-0.07065,-1.21529 0.46982,-2.36346 1.20698,-2.56496z" fill-opacity="0.60296" fill="#ffdb00" fill-rule="evenodd" stroke="#f7ff00" stroke-width="1" stroke-linecap="butt"/><g fill-rule="nonzero"><path d="M425.80219,204.66688l25.1113,6.40297" fill="none" stroke="url(#color-9)" stroke-width="3" stroke-linecap="round"/><path d="M529.68223,205.1433l-45.36418,6.07975" fill="none" stroke="url(#color-10)" stroke-width="3" stroke-linecap="round"/><path d="M403.97624,223.62082l21.18801,-13.05909l89.21462,0.40915l-21.18801,13.05909z" fill="#032500" stroke="url(#color-11)" stroke-width="3" stroke-linecap="butt"/><path d="M426.04255,215.52205l2.6212,-1.61556l9.33099,0.0428l-2.6212,1.61555z" fill="#ffcd00" stroke="none" stroke-width="10.5" stroke-linecap="butt"/><path d="M466.50332,215.75283l2.6212,-1.61556l9.33097,0.0428l-2.6212,1.61555z" fill="#ffcd00" stroke="none" stroke-width="10.5" stroke-linecap="butt"/><path d="M450.07765,219.02308l-2.6212,1.61555l-9.33099,-0.0428l2.6212,-1.61555z" fill="#00ff2a" stroke="none" stroke-width="10.5" stroke-linecap="butt"/><path d="M436.79895,214.26028l2.6212,-1.61555l9.33097,0.0428l-2.6212,1.61555z" fill="#ffcd00" stroke="none" stroke-width="10.5" stroke-linecap="butt"/><path d="M477.25972,214.49104l2.6212,-1.61556l9.33097,0.0428l-2.6212,1.61556z" fill="#ffcd00" stroke="none" stroke-width="10.5" stroke-linecap="butt"/><path d="M456.61101,220.36414l-2.6212,1.61556l-9.33099,-0.0428l2.6212,-1.61556z" fill="#00ff2a" stroke="none" stroke-width="10.5" stroke-linecap="butt"/><path d="M442.78342,215.59883l2.6212,-1.61556l9.33097,0.04278l-2.6212,1.61556z" fill="#ffcd00" stroke="none" stroke-width="10.5" stroke-linecap="butt"/><path d="M483.2442,215.82961l2.6212,-1.61556l9.33099,0.0428l-2.6212,1.61555z" fill="#ffcd00" stroke="none" stroke-width="10.5" stroke-linecap="butt"/><path d="M466.81853,219.09984l-2.6212,1.61555l-9.33099,-0.0428l2.6212,-1.61555z" fill="#00ff2a" stroke="none" stroke-width="10.5" stroke-linecap="butt"/><path d="M386.89514,228.89993l9.10138,-5.60958l105.30585,0.48295l-9.10138,5.60958z" fill="#000000" stroke="url(#color-12)" stroke-width="3" stroke-linecap="butt"/><path d="M401.98388,225.16499l0.93614,-0.57699l8.14745,0.03736l-0.93614,0.57699z" fill="#ffcf00" stroke="none" stroke-width="11" stroke-linecap="butt"/><path d="M473.99036,224.61684l2.61882,0.01201l-2.91244,1.79507l-2.61882,-0.01201z" fill="#00fff0" stroke="none" stroke-width="11" stroke-linecap="butt"/><path d="M478.67516,224.63833l2.61882,0.01201l-5.02397,3.09649l-2.61883,-0.01201z" fill="#00fff0" stroke="none" stroke-width="11" stroke-linecap="butt"/><path d="M483.56362,224.66074l2.61883,0.01201l-1.89309,1.16679l-2.61882,-0.01201z" fill="#00fff0" stroke="none" stroke-width="11" stroke-linecap="butt"/><path d="M400.30922,226.19715l0.93614,-0.57699l8.14745,0.03736l-0.93614,0.57699z" fill="#ffcf00" stroke="none" stroke-width="11" stroke-linecap="butt"/><path d="M398.63457,227.22931l0.93614,-0.57699l8.14745,0.03736l-0.93614,0.57699z" fill="#ffcf00" stroke="none" stroke-width="11" stroke-linecap="butt"/><path d="M419.30755,225.99687c-0.66351,0.40894 -2.56928,0.73419 -4.25667,0.72644c-1.68739,-0.00774 -2.51742,-0.34552 -1.85391,-0.75447c0.66351,-0.40895 2.56928,-0.7342 4.25667,-0.72644c1.68739,0.00774 2.51742,0.34552 1.85391,0.75447z" fill="#00ff05" stroke="none" stroke-width="0" stroke-linecap="butt"/></g><path d="M364.68399,314.0168c-0.27479,-1.14767 0.41351,-2.29619 1.53739,-2.56529l4.06989,-0.97447c1.01748,-0.24362 1.6506,0.15409 2.28372,0.55178l2.53251,1.5908c0.63313,0.39771 1.26625,0.7954 2.28372,0.55178l6.10484,-1.46172c1.01748,-0.24362 1.40181,-0.88495 1.78617,-1.52626l1.53739,-2.56529c0.38435,-0.64132 0.76869,-1.28264 1.78617,-1.52626l23.32648,-5.58522c1.12386,-0.26909 2.25772,0.44313 2.53251,1.5908l4.97561,20.78047c0.27479,1.14767 -0.41351,2.29619 -1.53739,2.56529l-23.32648,5.58522c-1.01748,0.24362 -1.40181,0.88495 -1.78617,1.52626l-1.53739,2.56529c-0.38435,0.64132 -0.76869,1.28264 -1.78617,1.52626l-6.10484,1.46172c-1.01748,0.24362 -1.6506,-0.15409 -2.28372,-0.55178l-2.53251,-1.5908c-0.63313,-0.39771 -1.26625,-0.7954 -2.28372,-0.55178l-4.06989,0.97447c-1.12386,0.26909 -2.25772,-0.44313 -2.53251,-1.5908z" fill="#00ddff" fill-rule="nonzero" stroke="url(#color-13)" stroke-width="5" stroke-linecap="butt"/><path d="M377.74065,249.65753c13.97293,-5.02893 25.96984,5.50244 27.87871,12.14519l13.32831,5.80639c0.47447,0.15154 0.7014,0.58135 0.6808,1.28945l-5.75425,13.20861c-0.32182,0.57687 -0.74667,0.85089 -1.27461,0.82207l-28.01202,-12.20325c-1.29615,0.21406 -2.61127,1.42245 -3.88909,1.37193l-3.96626,-1.72789c-0.95885,-0.91416 -0.88408,-2.64341 -1.73297,-3.71894l-2.96636,-1.29227c-0.37105,-0.5575 -0.51983,-1.05547 -0.44633,-1.49392z" fill="#f1ff00" fill-rule="nonzero" stroke="url(#color-14)" stroke-width="5" stroke-linecap="butt"/><path d="M401.84461,354.11574c-0.20688,-0.59981 0.1674,-1.1882 1.12283,-1.76515l7.09538,-2.30823c2.9535,-0.152 5.26585,0.92597 8.32177,0.49696l9.05087,-2.92364c2.66526,-1.30776 2.35355,-3.25432 4.99717,-4.85056l17.94054,-5.83635c1.41556,-0.24965 2.46624,-0.11447 3.15206,0.40557l9.28464,13.32701c0.25948,0.77625 -0.22733,1.48075 -1.4604,2.11346l-46.83807,15.23716c-1.33945,0.32859 -2.40696,0.2248 -3.20248,-0.3114z" fill="#f1ff00" fill-rule="nonzero" stroke="#ff7300" stroke-width="5" stroke-linecap="butt"/><path d="M373.17533,286.62189l-1.38571,-7.68232l3.84417,-0.81478l1.39805,7.66371l7.78875,-1.27759l0.6712,3.89436l-7.74912,1.41116l1.42226,7.77619l-3.87235,0.70031l-1.42104,-7.71514l-7.69247,1.51283l-0.77439,-3.93736z" fill="#f1ff00" fill-rule="nonzero" stroke="url(#color-15)" stroke-width="5" stroke-linecap="butt"/><path d="M433.08574,294.93428l12.19456,7.99091l0.44193,8.29923l-7.79689,2.86772l-12.15935,-8.04436l-0.46334,-8.27243z" fill="#c0ff00" fill-rule="nonzero" stroke="url(#color-16)" stroke-width="5" stroke-linecap="butt"/><path d="M466.34755,273.28045c0,10.59538 -8.73994,19.18464 -19.52122,19.18464c-10.78128,0 -19.52122,-8.58926 -19.52122,-19.18464c0,-10.59538 8.73994,-19.18464 19.52122,-19.18464c10.78128,0 19.52122,8.58926 19.52122,19.18464z" fill="url(#color-17)" fill-rule="nonzero" stroke="none" stroke-width="10" stroke-linecap="butt"/><path d="M462.85549,275.33886l-10.73869,1.52665l-4.52859,8.40891l-2.08153,-10.19793l-9.67473,-5.96934l10.75372,0.35279l6.91864,-9.69504l-0.24264,11.84104z" fill="none" fill-rule="nonzero" stroke="url(#color-18)" stroke-width="10" stroke-linecap="butt"/><path d="M369.84662,350.88559l12.40651,3.42585c6.73447,2.84941 3.83238,12.63585 -3.19279,11.64427l-12.41776,-3.38481c-6.25002,-2.22316 -4.38552,-12.69528 3.20404,-11.68532z" fill="#00ffa6" fill-rule="nonzero" stroke="#ff42ff" stroke-width="5" stroke-linecap="butt"/></g></g></g></svg><!--rotationCenter:79.27927927927925:189.59955539039024--> No newline at end of file
Copy link
Contributor

Choose a reason for hiding this comment

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

Performance issue: This SVG contains extremely complex path data and numerous gradients on a single line, making it difficult to maintain and potentially causing rendering performance issues. Consider optimizing the SVG by simplifying paths, reducing gradient complexity, or using a more efficient format.

Copy link
Contributor

@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: 1

🧹 Nitpick comments (3)
src/containers/extension-library.jsx (2)

45-51: Consider guarding async callbacks against unmount and tightening timeout semantics

loadGalleryWithTimeout schedules a timeout and always runs successCallback/errorCallback when the fetch settles, even if the component has unmounted, which can trigger React “setState on unmounted component” warnings, and also runs both the timeout callback and the eventual error callback on slow failures.

A small guard would make this more robust:

class ExtensionLibrary extends React.PureComponent {
+    _isMounted = false;
     componentDidMount () {
-        // Fetch TurboWarp gallery if not cached
+        this._isMounted = true;
+        // Fetch TurboWarp gallery if not cached
         if (!this.state.galleryTW) {
             loadGalleryWithTimeout(
                 fetchLibraryTW,
-                () => this.setState({ galleryTWTimedOut: true }),
-                gallery => {
-                    cachedGalleryTW = gallery;
-                    this.setState({ galleryTW: gallery });
-                },
-                error => this.setState({ galleryTWError: error })
+                () => this._isMounted && this.setState({ galleryTWTimedOut: true }),
+                gallery => {
+                    if (!this._isMounted) return;
+                    cachedGalleryTW = gallery;
+                    this.setState({ galleryTW: gallery });
+                },
+                error => this._isMounted && this.setState({ galleryTWError: error })
             );
         }
@@
+    componentWillUnmount () {
+        this._isMounted = false;
+    }

and similarly for the OB gallery branch.

Also applies to: 138-155, 171-197


163-169: Separator placement and initial loading UX could be refined

Right now library.push('---') is called twice unconditionally (once before TW, once between TW and OB), even when neither gallery has loaded nor timed out yet, which can yield multiple adjacent separators with no content and no “loading” item until the 750 ms timeout elapses.

You could tighten this by only inserting separators when there is real content or a placeholder to show, e.g.:

-        let library = extensionLibraryContent.map(toLibraryItem);
-        library.push('---');
+        let library = extensionLibraryContent.map(toLibraryItem);
+        const locale = this.props.intl.locale;
+
+        const twItems = [];
+        if (this.state.galleryTW) {
+            twItems.push(toLibraryItem(galleryMore));
+            twItems.push(
+                ...this.state.galleryTW
+                    .map(i => translateGalleryItem(i, locale))
+                    .map(toLibraryItem)
+            );
+        } else if (this.state.galleryTWError) {
+            twItems.push(toLibraryItem(galleryError));
+        } else if (this.state.galleryTWTimedOut) {
+            twItems.push(toLibraryItem(galleryLoading));
+        }
+
+        const obItems = [];
+        if (this.state.galleryOB) {
+            obItems.push(toLibraryItem(galleryMoreOB));
+            obItems.push(
+                ...this.state.galleryOB
+                    .map(i => translateGalleryItem(i, locale))
+                    .map(toLibraryItem)
+            );
+        } else if (this.state.galleryOBError) {
+            obItems.push(toLibraryItem(galleryErrorOB));
+        } else if (this.state.galleryOBTimedOut) {
+            obItems.push(toLibraryItem(galleryLoadingOB));
+        }
+
+        if (twItems.length) {
+            library.push('---', ...twItems);
+        }
+        if (obItems.length) {
+            library.push('---', ...obItems);
+        }

This avoids empty separators and ensures users always see either actual gallery items, a loading placeholder (after timeout), or nothing at all.

Also applies to: 234-268

src/lib/libraries/extensions/index.jsx (1)

364-372: Minor: values prop no longer used in TurboWarp Blocks message

The defaultMessage for the TurboWarp Blocks name is now the literal "TurboWarp Blocks", but the FormattedMessage still passes values={{ APP_NAME: "TurboWarp" }} even though APP_NAME isn’t interpolated in that string anymore.

You can simplify by dropping the values prop (and, if not used elsewhere below, the APP_NAME import) to make the intent clearer.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 3e28278 and 518e3f0.

⛔ Files ignored due to path filters (2)
  • src/lib/libraries/extensions/gallery/obgallery.svg is excluded by !**/*.svg
  • src/lib/libraries/extensions/javascript/javascript.png is excluded by !**/*.png
📒 Files selected for processing (3)
  • src/containers/blocks.jsx (1 hunks)
  • src/containers/extension-library.jsx (5 hunks)
  • src/lib/libraries/extensions/index.jsx (7 hunks)
🧰 Additional context used
📓 Path-based instructions (1)
src/lib/libraries/extensions/**

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

Place extensions under src/lib/libraries/extensions/

Files:

  • src/lib/libraries/extensions/index.jsx
🧠 Learnings (15)
📓 Common learnings
Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-11-18T22:18:13.164Z
Learning: For OmniBlocks/scratch-gui small features, supervoidcoder prefers GUI-only changes that avoid modifying scratch-blocks; deliver as a single, self-contained PR.
Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-10-22T21:20:08.837Z
Learning: In the OmniBlocks/scratch-gui repository, supervoidcoder (“void”) prefers single, complete PRs over multi-part (“Part 1/2”) submissions. If a split is unavoidable, they want explicit linkage and gating before approval.
Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-11-05T01:48:23.435Z
Learning: OmniBlocks/scratch-gui workflow preference: Open tracking issues for CI/automation behavior changes; assign to supervoidcoder; include backlinks to the PR and the exact comment requesting the change.
Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-11-05T01:48:23.435Z
Learning: OmniBlocks/scratch-gui: For CI comment hygiene, prefer not mentioning bot/app requesters in the Mega PR Test & Analysis sticky comment; only mention humans. Track such behavior changes via a GitHub issue assigned to supervoidcoder with backlinks to the initiating PR and comment.
Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-11-05T01:40:39.943Z
Learning: In OmniBlocks/scratch-gui, supervoidcoder (“void”) prefers a collaboration model where CodeRabbit authors the code PRs and Amazon Q performs the review; follow-ups should be submitted as single, self-contained PRs when possible.
Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-10-22T19:01:57.123Z
Learning: When reviewing pull requests in the OmniBlocks/scratch-gui repository, take into consideration whether the pull request was made by team members of OmniBlocks/coders.
Learnt from: github-actions[bot]
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-11-05T01:49:51.378Z
Learning: OmniBlocks/scratch-gui: Update Mega PR Test & Analysis so the sticky PR comment only mentions the requester when github.event.sender.type == 'User' (i.e., human). Purpose: avoid bot loops and comment noise.
Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-10-22T20:16:15.537Z
Learning: OmniBlocks/scratch-gui has an existing workflow at .github/workflows/prtest.yml named "Mega PR Test & Analysis".
Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-11-09T18:19:24.693Z
Learning: OmniBlocks/scratch-gui: The Blocks component now bridges FieldCustom in componentDidMount by assigning this.ScratchBlocks.FieldCustom = window.Blockly.FieldCustom immediately after ScratchMsgs.setLocale (added Nov 9, 2025 via PR #159). This enables SPjavascriptV2’s registerInput usage at runtime.
Learnt from: github-actions[bot]
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-11-05T01:50:28.065Z
Learning: OmniBlocks/scratch-gui: When cleaning PR noise, prefer minimizing CodeRabbit auto-generated comments matching headers like "This is an auto-generated reply by CodeRabbit", "Rate Limit Exceeded", and "automated status update", while preserving human-directed conversation.
Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-10-20T00:38:31.706Z
Learning: When integrating PenguinMod’s JS editor blocks, the FieldCustom plugin must run before opening the extension library. If using scratch-blocks develop-builds, either import 'scratch-blocks/core/field_customInput.js' early in scratch-gui (e.g., src/playground/import-first.js) and bridge Blockly.FieldCustom → ScratchBlocks.FieldCustom in Blocks.componentDidMount, or include the plugin in scratch-blocks’ bundle entry so the develop-builds dist executes it.
Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-10-22T19:01:57.123Z
Learning: In the OmniBlocks/scratch-gui repository, team member supervoidcoder can be called "void" in reviews and conversations.
Learnt from: github-actions[bot]
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-11-05T02:00:40.666Z
Learning: In OmniBlocks/scratch-gui, when cleanup is requested, supervoidcoder prefers deletion of CodeRabbit’s spam comments (not just minimizing) on the PR; for non-CodeRabbit bot comments, minimize unless a maintainer explicitly asks for hard deletion.
Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-10-22T19:01:57.123Z
Learning: The team members in OmniBlocks/coders include: supervoidcoder, Graison-P (gvyt), ampelectrecuted (amp), NotTheBaton (TheBaton), and kRxZykRxZy.
Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-10-28T03:09:05.973Z
Learning: In the OmniBlocks/scratch-gui repository, supervoidcoder (void) is planning to add a 3D mode and is excited about using PlayCanvas as a full 3D game engine for OmniBlocks.
📚 Learning: 2025-10-06T23:37:51.374Z
Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-10-06T23:37:51.374Z
Learning: In OmniBlocks scratch-gui, custom extension library items must include `extensionURL`; otherwise the loader tries to load `extensionId` as a URL/built-in id and fails.

Applied to files:

  • src/containers/extension-library.jsx
  • src/lib/libraries/extensions/index.jsx
📚 Learning: 2025-11-09T18:19:24.693Z
Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-11-09T18:19:24.693Z
Learning: OmniBlocks/scratch-gui: The Blocks component now bridges FieldCustom in componentDidMount by assigning this.ScratchBlocks.FieldCustom = window.Blockly.FieldCustom immediately after ScratchMsgs.setLocale (added Nov 9, 2025 via PR #159). This enables SPjavascriptV2’s registerInput usage at runtime.

Applied to files:

  • src/containers/blocks.jsx
  • src/lib/libraries/extensions/index.jsx
📚 Learning: 2025-10-20T00:38:31.706Z
Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-10-20T00:38:31.706Z
Learning: When integrating PenguinMod’s JS editor blocks, the FieldCustom plugin must run before opening the extension library. If using scratch-blocks develop-builds, either import 'scratch-blocks/core/field_customInput.js' early in scratch-gui (e.g., src/playground/import-first.js) and bridge Blockly.FieldCustom → ScratchBlocks.FieldCustom in Blocks.componentDidMount, or include the plugin in scratch-blocks’ bundle entry so the develop-builds dist executes it.

Applied to files:

  • src/containers/blocks.jsx
📚 Learning: 2025-11-06T21:34:01.602Z
Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-11-06T21:34:01.602Z
Learning: In OmniBlocks scratch-blocks, field_customInput.js wasn't being compiled into develop-builds bundles because it was missing required goog.require() statements. The Closure compiler needs goog.require('Blockly.Field') and other dependencies declared at the top of the file for proper dependency resolution, even though goog.inherits() is used later in the file.

Applied to files:

  • src/containers/blocks.jsx
📚 Learning: 2025-10-20T01:34:10.747Z
Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-10-20T01:34:10.747Z
Learning: Importing Closure source files from scratch-gui (e.g., 'scratch-blocks/core/field_customInput.js') causes 'goog is not defined'. FieldCustom must be compiled into scratch-blocks’ develop-builds bundle and then bridged in GUI; GUI should not import Closure sources directly.

Applied to files:

  • src/containers/blocks.jsx
📚 Learning: 2025-11-09T19:10:33.207Z
Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-11-09T19:10:33.207Z
Learning: In OmniBlocks: FieldCustom (base class and registry) lives in scratch-blocks, but each extension must register its own editor via ScratchBlocks.FieldCustom.registerInput(key, html, onInit, onClick, onUpdate), and the block JSON must use type "custom" with the matching "custom" key and string defaultValue.

Applied to files:

  • src/containers/blocks.jsx
📚 Learning: 2025-10-21T11:30:02.766Z
Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-10-21T11:30:02.766Z
Learning: In the OmniBlocks/TurboWarp Scratch GUI fork, custom addons must be manually registered in three files: src/addons/addons.js (add to both default and newAddons arrays), src/addons/generated/addon-manifests.js (add import and export), and src/addons/generated/addon-entries.js (add dynamic import entry). Running pull.js would overwrite custom addons.

Applied to files:

  • src/containers/blocks.jsx
  • src/lib/libraries/extensions/index.jsx
📚 Learning: 2025-10-09T13:04:39.893Z
Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-10-09T13:04:39.893Z
Learning: In OmniBlocks scratch-vm, initialize `this.runtime.extensionRuntimeOptions = {}` in the VM constructor (before loading extensions) to match PM/TW; otherwise SPjavascriptV2 crashes when reading `.javascriptUnsandboxed` during normal (non-packager) runs.

Applied to files:

  • src/containers/blocks.jsx
  • src/lib/libraries/extensions/index.jsx
📚 Learning: 2025-10-06T23:37:51.374Z
Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-10-06T23:37:51.374Z
Learning: The public SPjavascriptV2 (SharkPool) code found online uses CommonJS `require`, which won’t load via TurboWarp’s `loadExtensionURL`. It must be converted to a browser/TurboWarp extension that registers via `Scratch.extensions.register`.

Applied to files:

  • src/lib/libraries/extensions/index.jsx
📚 Learning: 2025-10-09T22:53:52.699Z
Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-10-09T22:53:52.699Z
Learning: PenguinMod VM registers the current JavaScript extension as jg_javascript (src/extension-support/extension-manager.js) and the extension folder is src/extensions/jg_javascript with getInfo().id = 'jg_javascript'.

Applied to files:

  • src/lib/libraries/extensions/index.jsx
📚 Learning: 2025-10-07T19:27:27.244Z
Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-10-07T19:27:27.244Z
Learning: In OmniBlocks scratch-vm SPjavascriptV2 (src/extensions/sp_javascriptV2/index.js), accessing `this.runtime.extensionRuntimeOptions.javascriptUnsandboxed` without a guard crashes in non-Packager runs; fix by using `this.runtime.extensionRuntimeOptions?.javascriptUnsandboxed === true`.

Applied to files:

  • src/lib/libraries/extensions/index.jsx
📚 Learning: 2025-10-09T21:20:10.083Z
Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-10-09T21:20:10.083Z
Learning: OmniBlocks scratch-vm must initialize runtime.extensionRuntimeOptions before loading extensions (e.g., in VM constructor or Runtime constructor) to avoid crashes when the extension reads .javascriptUnsandboxed, matching PenguinMod/TurboWarp behavior.

Applied to files:

  • src/lib/libraries/extensions/index.jsx
📚 Learning: 2025-11-20T01:45:53.675Z
Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-11-20T01:45:53.675Z
Learning: In OmniBlocks/scratch-gui, supervoidcoder is planning to expand OmniBlocks from a Scratch mod into a full IDE, requiring support for multiple file types beyond just block-based projects. The primary project format will use the `.omb` extension, with potential for additional extensions in the `omb` namespace (e.g., `.ombc`, `.ombs`) as IDE features are added.

Applied to files:

  • src/lib/libraries/extensions/index.jsx
📚 Learning: 2025-11-20T01:50:09.301Z
Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-11-20T01:50:09.301Z
Learning: In OmniBlocks/scratch-gui, for the IDE expansion supporting multiple programming languages (Python, JavaScript, C, etc.), the project will use a single `.omb` format for full project bundles that contains metadata specifying languages, project structure, and assets. Individual code files will use standard language extensions (.py, .js, .c) rather than custom extensions like `.pyboxy`. The `.omb` format is a zip archive containing code/, assets/, blocks/ directories plus project.json metadata.

Applied to files:

  • src/lib/libraries/extensions/index.jsx
🧬 Code graph analysis (1)
src/containers/extension-library.jsx (1)
src/lib/libraries/extensions/index.jsx (12)
  • galleryMore (454-475)
  • galleryMore (454-475)
  • galleryError (477-498)
  • galleryError (477-498)
  • galleryLoading (431-452)
  • galleryLoading (431-452)
  • galleryMoreOB (523-543)
  • galleryMoreOB (523-543)
  • galleryErrorOB (545-565)
  • galleryErrorOB (545-565)
  • galleryLoadingOB (501-521)
  • galleryLoadingOB (501-521)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (3)
  • GitHub Check: visual-regression
  • GitHub Check: mega-test
  • GitHub Check: Analyze (javascript-typescript)
🔇 Additional comments (4)
src/containers/blocks.jsx (1)

147-152: LGTM! FieldCustom bridge correctly implemented.

The conditional bridging of window.Blockly.FieldCustom to this.ScratchBlocks.FieldCustom properly wires the Closure-compiled Blockly implementation to the ScratchBlocks API that extensions expect, enabling the JavaScript V2 extension's registerInput usage at runtime.

Based on learnings

src/containers/extension-library.jsx (1)

8-15: Remote gallery mapping and extensionURL usage look correct

The TW/OB fetchers normalize metadata into library items with extensionId, extensionURL, iconURL, tags, docs, samples, and credits, and then the library uses these via handleItemSelect. This aligns with the requirement that custom/remote items always provide extensionURL so the loader doesn’t treat extensionId as a URL/built‑in id, and the credits/docs/samples data flow is consistent with the existing gallery patterns.

Also applies to: 52-93, 95-136

src/lib/libraries/extensions/index.jsx (2)

49-56: JS V2 extension entry: confirm VM registration matches extensionId

Adding the JavaScript V2 entry with extensionId: 'SPjavascriptV2', incompatibleWithScratch: true, and the custom icon looks consistent and tagged correctly as ['ob'].

Please just double‑check that:

  • getInfo().id in src/extensions/sp_javascriptV2/index.js is exactly 'SPjavascriptV2', and
  • the VM’s extensionManager (or equivalent registration table) knows how to load this id, so loadExtensionURL('SPjavascriptV2') works without needing an explicit extensionURL here.

If either of those isn’t true, adding an extensionURL pointing at the built/bundled JS file would be safer.

Also applies to: 387-407


431-498: TurboWarp and OmniBlocks gallery metadata wiring looks consistent

The updated TurboWarp gallery exports now explicitly say “TurboWarp Extension Gallery”, and the new OmniBlocks gallery exports (galleryLoadingOB, galleryMoreOB, galleryErrorOB) use:

  • a consistent name id (ob.extensionGallery.name),
  • href: 'https://omniblocks.github.io/extensions',
  • extensionId: 'galleryOB', and
  • the obgalleryIcon plus tags: ['ob'].

This matches how ExtensionLibrary is consuming them (checking item.href to avoid loading, using tags for filtering, and inserting them around the OB gallery items), so the metadata wiring looks correct.

Also applies to: 500-565

@supervoidcoder
Copy link
Member Author

/q i get your point about the svg being a one liner BUT YOU AREN'T GONNA MANUALLY EDIT THE SVG BRUH I MADE IT IN OMNIBLOCKS PAINT EDITOR (peak dogfooding)
right @coderabbitai

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Nov 20, 2025

Tip

For best results, initiate chat on the files or code changes.

@supervoidcoder Absolutely right! 🎨

You make a great point - SVGs generated from a paint editor (especially your own OmniBlocks Paint Editor) are meant to be machine-generated and shouldn't be manually edited. The one-liner format is just the output of the tool, and trying to manually format or edit it would break that workflow.

And yes, peak dogfooding indeed! Using OmniBlocks Paint Editor to create assets for OmniBlocks itself is exactly the kind of real-world testing and validation that makes the product better. Keep it up! 🚀


🧠 Learnings used
Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-11-05T01:40:39.943Z
Learning: In OmniBlocks/scratch-gui, supervoidcoder (“void”) prefers a collaboration model where CodeRabbit authors the code PRs and Amazon Q performs the review; follow-ups should be submitted as single, self-contained PRs when possible.

Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-10-22T19:01:57.123Z
Learning: In the OmniBlocks/scratch-gui repository, team member supervoidcoder can be called "void" in reviews and conversations.

Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-11-18T22:18:13.164Z
Learning: For OmniBlocks/scratch-gui small features, supervoidcoder prefers GUI-only changes that avoid modifying scratch-blocks; deliver as a single, self-contained PR.

Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-10-22T21:20:08.837Z
Learning: In the OmniBlocks/scratch-gui repository, supervoidcoder (“void”) prefers single, complete PRs over multi-part (“Part 1/2”) submissions. If a split is unavoidable, they want explicit linkage and gating before approval.

Learnt from: github-actions[bot]
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-11-05T02:00:40.666Z
Learning: In OmniBlocks/scratch-gui, when cleanup is requested, supervoidcoder prefers deletion of CodeRabbit’s spam comments (not just minimizing) on the PR; for non-CodeRabbit bot comments, minimize unless a maintainer explicitly asks for hard deletion.

Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-10-22T19:01:57.123Z
Learning: The team members in OmniBlocks/coders include: supervoidcoder, Graison-P (gvyt), ampelectrecuted (amp), NotTheBaton (TheBaton), and kRxZykRxZy.

Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-10-28T03:09:05.973Z
Learning: In the OmniBlocks/scratch-gui repository, supervoidcoder (void) is planning to add a 3D mode and is excited about using PlayCanvas as a full 3D game engine for OmniBlocks.

Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-11-05T01:48:23.435Z
Learning: OmniBlocks/scratch-gui workflow preference: Open tracking issues for CI/automation behavior changes; assign to supervoidcoder; include backlinks to the PR and the exact comment requesting the change.

Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-11-05T01:48:23.435Z
Learning: OmniBlocks/scratch-gui: For CI comment hygiene, prefer not mentioning bot/app requesters in the Mega PR Test & Analysis sticky comment; only mention humans. Track such behavior changes via a GitHub issue assigned to supervoidcoder with backlinks to the initiating PR and comment.

Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-10-22T19:01:57.123Z
Learning: When reviewing pull requests in the OmniBlocks/scratch-gui repository, take into consideration whether the pull request was made by team members of OmniBlocks/coders.

Learnt from: github-actions[bot]
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-11-05T01:49:51.378Z
Learning: OmniBlocks/scratch-gui: Update Mega PR Test & Analysis so the sticky PR comment only mentions the requester when github.event.sender.type == 'User' (i.e., human). Purpose: avoid bot loops and comment noise.

Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-10-22T20:16:15.537Z
Learning: OmniBlocks/scratch-gui has an existing workflow at .github/workflows/prtest.yml named "Mega PR Test & Analysis".

Learnt from: supervoidcoder
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-11-09T18:19:24.693Z
Learning: OmniBlocks/scratch-gui: The Blocks component now bridges FieldCustom in componentDidMount by assigning this.ScratchBlocks.FieldCustom = window.Blockly.FieldCustom immediately after ScratchMsgs.setLocale (added Nov 9, 2025 via PR #159). This enables SPjavascriptV2’s registerInput usage at runtime.

Learnt from: github-actions[bot]
Repo: OmniBlocks/scratch-gui PR: 0
File: :0-0
Timestamp: 2025-11-05T01:50:28.065Z
Learning: OmniBlocks/scratch-gui: When cleaning PR noise, prefer minimizing CodeRabbit auto-generated comments matching headers like "This is an auto-generated reply by CodeRabbit", "Rate Limit Exceeded", and "automated status update", while preserving human-directed conversation.

@amazon-q-developer
Copy link
Contributor

I understand your point about the SVG being generated by OmniBlocks Paint Editor! You're absolutely right that tool-generated SVGs don't need to be manually readable since they're not intended for hand-editing.

However, for maintainability and version control, consider formatting the SVG with proper line breaks. This makes diffs more meaningful when the file changes and helps with debugging if needed. Most SVG minifiers can be reversed, and the file size difference is minimal for a single icon.

That said, if this is purely a generated asset that won't be modified, the current format is acceptable. Great work on the dogfooding with OmniBlocks Paint Editor!

@coderabbitai coderabbitai bot mentioned this pull request Nov 21, 2025
9 tasks
Co-authored-by: amazon-q-developer[bot] <208079219+amazon-q-developer[bot]@users.noreply.github.com>
@github-actions
Copy link
Contributor

github-actions bot commented Nov 23, 2025

🎨 Visual Regression Test Results

Hi @supervoidcoder! Here are the visual comparison results:

✅ No Visual Changes Detected

All screenshots match the base branch! 🎉

📊 All Screenshots Checked

Screenshot Status
editor-initial ⚠️ Skipped
blocks-workspace ⚠️ Skipped
stage-sprites ⚠️ Skipped
code-tab ⚠️ Skipped
costumes-tab ⚠️ Skipped
sounds-tab ⚠️ Skipped
player-view ⚠️ Skipped

📦 Download all screenshots

💡 Tip: Download the artifacts to view detailed before/after comparisons!

@github-actions
Copy link
Contributor

github-actions bot commented Nov 23, 2025

🎉 MEGA PR Test & Analysis Complete!

Hi @supervoidcoder! Your PR has been fully tested and analyzed! 🚀✨


🌍 Test Deployment

Live Preview: https://OmniBlocks.github.io/scratch-gui/ampelectrecuted/385/


🧪 Test Results

ESLint: ❌ Found issues

  • Errors: 0
  • Warnings: 0

Unit Tests:

  • Total: 37 tests
  • ✅ Passed: 1
  • ❌ Failed: 0

Integration Tests:

  • Total: 37 tests
  • ✅ Passed: 0
  • ❌ Failed: 15
  • ⏭️ Skipped: 1

📄 Full test outputs available in artifacts


🔦 Performance Audit (Lighthouse)

✅ Audit completed successfully!

📊 Lighthouse Scores:

  • 🔴 Performance: 33/100
  • 🟠 Accessibility: 70/100
  • 🟢 Best Practices: 93/100
  • 🟠 SEO: 88/100

⚡ Core Web Vitals:

  • First Contentful Paint: 44.3 s
  • Largest Contentful Paint: 47.6 s
  • Total Blocking Time: 1,060 ms
  • Cumulative Layout Shift: 0
  • Speed Index: 44.3 s

🟢 90-100 (Good) | 🟠 50-89 (Needs Improvement) | 🔴 0-49 (Poor)

📄 Full report in artifacts


📦 Bundle Size Analysis

Total Build Size: 136M

📦 Top 5 Largest JavaScript Files:

  • 20M - samples3.js
  • 20M - player/samples3.js
  • 13M - player/drumsamples.js
  • 13M - drumsamples.js
  • 9.5M - samples2.js

🎨 Top 5 Largest CSS Files:

  • No CSS files found (might be inlined in JS)

♿ Accessibility Testing

✅ Accessibility scan completed!


📊 Build Details


💡 Pro Tip: Only one build was needed for all these checks - saving CI/CD minutes! 🎯

Co-authored-by: amazon-q-developer[bot] <208079219+amazon-q-developer[bot]@users.noreply.github.com>
@wellcode-ai wellcode-ai bot added review-effort-3 Standard review (30-60 min) and removed review-effort-3 Standard review (30-60 min) labels Nov 23, 2025
@github-actions
Copy link
Contributor

github-actions bot commented Nov 23, 2025

🎨 Visual Regression Test Results

Hi @supervoidcoder! Here are the visual comparison results:

✅ No Visual Changes Detected

All screenshots match the base branch! 🎉

📊 All Screenshots Checked

Screenshot Status
editor-initial ⚠️ Skipped
blocks-workspace ⚠️ Skipped
stage-sprites ⚠️ Skipped
code-tab ⚠️ Skipped
costumes-tab ⚠️ Skipped
sounds-tab ⚠️ Skipped
player-view ⚠️ Skipped

📦 Download all screenshots

💡 Tip: Download the artifacts to view detailed before/after comparisons!

@github-actions
Copy link
Contributor

github-actions bot commented Nov 23, 2025

🎉 MEGA PR Test & Analysis Complete!

Hi @supervoidcoder! Your PR has been fully tested and analyzed! 🚀✨


🌍 Test Deployment

Live Preview: https://OmniBlocks.github.io/scratch-gui/ampelectrecuted/385/


🧪 Test Results

ESLint: ❌ Found issues

  • Errors: 0
  • Warnings: 0

Unit Tests:

  • Total: 37 tests
  • ✅ Passed: 1
  • ❌ Failed: 0

Integration Tests:

  • Total: 37 tests
  • ✅ Passed: 0
  • ❌ Failed: 15
  • ⏭️ Skipped: 1

📄 Full test outputs available in artifacts


🔦 Performance Audit (Lighthouse)

✅ Audit completed successfully!

📊 Lighthouse Scores:

  • 🔴 Performance: 31/100
  • 🟠 Accessibility: 70/100
  • 🟢 Best Practices: 93/100
  • 🟠 SEO: 88/100

⚡ Core Web Vitals:

  • First Contentful Paint: 48.6 s
  • Largest Contentful Paint: 52.3 s
  • Total Blocking Time: 1,260 ms
  • Cumulative Layout Shift: 0
  • Speed Index: 48.6 s

🟢 90-100 (Good) | 🟠 50-89 (Needs Improvement) | 🔴 0-49 (Poor)

📄 Full report in artifacts


📦 Bundle Size Analysis

Total Build Size: 136M

📦 Top 5 Largest JavaScript Files:

  • 20M - samples3.js
  • 20M - player/samples3.js
  • 13M - player/drumsamples.js
  • 13M - drumsamples.js
  • 9.5M - samples2.js

🎨 Top 5 Largest CSS Files:

  • No CSS files found (might be inlined in JS)

♿ Accessibility Testing

✅ Accessibility scan completed!


📊 Build Details


💡 Pro Tip: Only one build was needed for all these checks - saving CI/CD minutes! 🎯

@wellcode-ai wellcode-ai bot added review-effort-3 Standard review (30-60 min) and removed review-effort-3 Standard review (30-60 min) labels Nov 23, 2025
@github-actions
Copy link
Contributor

github-actions bot commented Jan 17, 2026

🎉 MEGA PR Test & Analysis Complete!

Hi @supervoidcoder! Your PR has been fully tested and analyzed! 🚀✨


🌍 Test Deployment

Live Preview: https://OmniBlocks.github.io/scratch-gui/supervoidcoder/385/


🧪 Test Results

ESLint: ❌ Found issues

  • Errors: 2
  • Warnings: 0

To fix, click the checkbox below or type /fix lint:

  • 🎨 Auto-fix ESLint issues

Unit Tests:

  • Total: 0 tests
  • ✅ Passed: 1
  • ❌ Failed: 0

Integration Tests:

  • Total: 4 tests
  • ✅ Passed: 0
  • ❌ Failed: 15
  • ⏭️ Skipped: 1

💡 Pro Tip: Check the Files Changed tab for inline annotations showing exactly where errors occurred! 🎯

📄 Full test outputs available in artifacts


🔦 Performance Audit (Lighthouse)

✅ Audit completed successfully!

📊 Lighthouse Scores:

  • 🔴 Performance: 35/100
  • 🟠 Accessibility: 70/100
  • 🟢 Best Practices: 96/100
  • 🟠 SEO: 88/100

⚡ Core Web Vitals:

  • First Contentful Paint: 44.8 s
  • Largest Contentful Paint: 47.7 s
  • Total Blocking Time: 890 ms
  • Cumulative Layout Shift: 0
  • Speed Index: 44.8 s

🟢 90-100 (Good) | 🟠 50-89 (Needs Improvement) | 🔴 0-49 (Poor)

📄 Full report in artifacts


📦 Bundle Size Analysis

Total Build Size: 185M

📦 Top 5 Largest JavaScript Files:

  • 20M - samples3.js
  • 20M - player/samples3.js
  • 13M - player/drumsamples.js
  • 13M - drumsamples.js
  • 9.5M - samples2.js

🎨 Top 5 Largest CSS Files:

  • No CSS files found (might be inlined in JS)

♿ Accessibility Testing

✅ Accessibility scan completed!


📊 Build Details


💡 Pro Tip: Only one build was needed for all these checks - saving CI/CD minutes! 🎯

@github-actions
Copy link
Contributor

github-actions bot commented Jan 17, 2026

🎬 ULTRA Visual Regression Test Results

Hi @supervoidcoder! Tested across 9 combinations (3 platforms × 3 browsers). 8/9 completed.

⚠️ Visual changes detected! Expand sections below for details.

📊 Test Matrix Summary

Platform Browser Changes Details
Ubuntu Logo Ubuntu Chrome ✅ No changes View
Ubuntu Logo Ubuntu WebKit ⚠️ Changes View
Windows Logo Windows Chrome ⚠️ Changes View
Windows Logo Windows Firefox ⚠️ Changes View
Windows Logo Windows WebKit ⚠️ Changes View
Apple Logo Apple Chrome ⚠️ Changes View
Apple Logo Apple Firefox ⚠️ Changes View
Apple Logo Apple WebKit ⚠️ Changes View

Ubuntu Logo Ubuntu + Chrome

Editor Initial

No pixel difference detected.

Blocks Workspace

No pixel difference detected.

Stage Sprites

No pixel difference detected.

Code Tab

No pixel difference detected.

Costumes Tab

No pixel difference detected.

Sounds Tab

No pixel difference detected.

Songs Tab

No pixel difference detected.

Player View

No pixel difference detected.

Extension Library

No pixel difference detected.

Advanced Settings

No pixel difference detected.

Ubuntu Logo Ubuntu + WebKit

Editor Initial

No pixel difference detected.

Blocks Workspace

No pixel difference detected.

Stage Sprites

No pixel difference detected.

Code Tab

No pixel difference detected.

Costumes Tab

No pixel difference detected.

Sounds Tab

No pixel difference detected.

Songs Tab

BasePRDiff

Diff: 0.42% (15424 pixels)

Player View

No pixel difference detected.

Extension Library

No pixel difference detected.

Advanced Settings

No pixel difference detected.

Windows Logo Windows + Chrome

Editor Initial

No pixel difference detected.

Blocks Workspace

No pixel difference detected.

Stage Sprites

No pixel difference detected.

Code Tab

No pixel difference detected.

Costumes Tab

No pixel difference detected.

Sounds Tab

No pixel difference detected.

Songs Tab

BasePRDiff

Diff: 41.48% (382304 pixels)

Player View

No pixel difference detected.

Extension Library

No pixel difference detected.

Advanced Settings

No pixel difference detected.

Windows Logo Windows + Firefox

Editor Initial

No pixel difference detected.

Blocks Workspace

No pixel difference detected.

Stage Sprites

No pixel difference detected.

Code Tab

No pixel difference detected.

Costumes Tab

No pixel difference detected.

Sounds Tab

No pixel difference detected.

Songs Tab

BasePRDiff

Diff: 0.01% (78 pixels)

Player View

BasePRDiff

Diff: 0.00% (13 pixels)

Extension Library

No pixel difference detected.

Advanced Settings

No pixel difference detected.

Windows Logo Windows + WebKit

Editor Initial

No pixel difference detected.

Blocks Workspace

No pixel difference detected.

Stage Sprites

No pixel difference detected.

Code Tab

No pixel difference detected.

Costumes Tab

No pixel difference detected.

Sounds Tab

No pixel difference detected.

Songs Tab

BasePRDiff

Diff: 1.46% (53705 pixels)

Player View

No pixel difference detected.

Extension Library

No pixel difference detected.

Advanced Settings

No pixel difference detected.

Apple Logo Apple + Chrome

Editor Initial

No pixel difference detected.

Blocks Workspace

No pixel difference detected.

Stage Sprites

No pixel difference detected.

Code Tab

No pixel difference detected.

Costumes Tab

No pixel difference detected.

Sounds Tab

No pixel difference detected.

Songs Tab

BasePRDiff

Diff: 3.58% (32959 pixels)

Player View

No pixel difference detected.

Extension Library

No pixel difference detected.

Advanced Settings

No pixel difference detected.

Apple Logo Apple + Firefox

Editor Initial

No pixel difference detected.

Blocks Workspace

No pixel difference detected.

Stage Sprites

No pixel difference detected.

Code Tab

No pixel difference detected.

Costumes Tab

No pixel difference detected.

Sounds Tab

No pixel difference detected.

Songs Tab

BasePRDiff

Diff: 2.38% (21970 pixels)

Player View

No pixel difference detected.

Extension Library

No pixel difference detected.

Advanced Settings

No pixel difference detected.

Apple Logo Apple + WebKit

Editor Initial

No pixel difference detected.

Blocks Workspace

No pixel difference detected.

Stage Sprites

No pixel difference detected.

Code Tab

No pixel difference detected.

Costumes Tab

No pixel difference detected.

Sounds Tab

No pixel difference detected.

Songs Tab

BasePRDiff

Diff: 1.18% (43466 pixels)

Player View

No pixel difference detected.

Extension Library

No pixel difference detected.

Advanced Settings

No pixel difference detected.


📦 Resources

github-actions bot added a commit that referenced this pull request Jan 17, 2026
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 7 out of 9 changed files in this pull request and generated 2 comments.

Comment on lines +154 to +162
if (this.ScratchBlocks && !this.ScratchBlocks.FieldCustom) {
this.ScratchBlocks.FieldCustom = {
registerInput: () => {},
unregisterInput: () => {},
getRegisteredInputs: () => new Map()
};
log.warn('ScratchBlocks.FieldCustom is not available; using stub implementation. ' +
'This usually means the Blockly → ScratchBlocks FieldCustom bridge is not configured correctly.');
}
Copy link

Copilot AI Jan 17, 2026

Choose a reason for hiding this comment

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

The conditional logic on line 154 creates a stub implementation only when ScratchBlocks exists but FieldCustom doesn't. However, if ScratchBlocks itself doesn't exist, this code won't run at all, which could lead to runtime errors later. Consider adding a check for when ScratchBlocks is undefined: if (!this.ScratchBlocks) { /* handle missing ScratchBlocks */ } else if (!this.ScratchBlocks.FieldCustom) { /* current stub logic */ }

Copilot uses AI. Check for mistakes.
github-actions bot added a commit that referenced this pull request Jan 17, 2026
github-actions bot added a commit that referenced this pull request Jan 17, 2026
@github-actions
Copy link
Contributor

github-actions bot commented Jan 19, 2026

🤖 Auto-Component Test Results

✅ Detected 2 interactive components!

📋 Components Found:

  • 🔘 button in src/components/tw-security-manager-modal/security-manager-modal.jsx:68 - "Deny"
  • 🔘 button in src/components/tw-security-manager-modal/security-manager-modal.jsx:79 - "Allow"

📸 Component Screenshots:

ComponentScreenshot (with highlighting)
Deny
src/components/tw-security-manager-modal/security-manager-modal.jsx:68
Screenshot of DenyScreenshot not available
Allow
src/components/tw-security-manager-modal/security-manager-modal.jsx:79
Screenshot of AllowScreenshot not available

💡 Note: If screenshots appear broken, they may still be processing. Check the screenshots branch for the latest images.

🧪 Test Status: success

Auto-generated tests have been created and executed!

📦 Check the workflow artifacts for:

  • Generated test code
  • Full test results
  • All screenshots

Triggered by @supervoidcoder • Commit 6581a94

💡 Tip: These are basic smoke tests. Consider expanding them for better coverage!

@github-actions
Copy link
Contributor

github-actions bot commented Jan 19, 2026

🎉 MEGA PR Test & Analysis Complete!

Hi @supervoidcoder! Your PR has been fully tested and analyzed! 🚀✨


🌍 Test Deployment

Live Preview: https://OmniBlocks.github.io/scratch-gui/supervoidcoder/385/


🧪 Test Results

ESLint: ❌ Found issues

  • Errors: 2
  • Warnings: 0

To fix, click the checkbox below or type /fix lint:

  • 🎨 Auto-fix ESLint issues

Unit Tests:

  • Total: 0 tests
  • ✅ Passed: 1
  • ❌ Failed: 0

Integration Tests:

  • Total: 4 tests
  • ✅ Passed: 0
  • ❌ Failed: 15
  • ⏭️ Skipped: 1

💡 Pro Tip: Check the Files Changed tab for inline annotations showing exactly where errors occurred! 🎯

📄 Full test outputs available in artifacts


🔦 Performance Audit (Lighthouse)

✅ Audit completed successfully!

📊 Lighthouse Scores:

  • 🔴 Performance: 34/100
  • 🟠 Accessibility: 70/100
  • 🟢 Best Practices: 96/100
  • 🟠 SEO: 88/100

⚡ Core Web Vitals:

  • First Contentful Paint: 43.6 s
  • Largest Contentful Paint: 47.1 s
  • Total Blocking Time: 920 ms
  • Cumulative Layout Shift: 0
  • Speed Index: 43.6 s

🟢 90-100 (Good) | 🟠 50-89 (Needs Improvement) | 🔴 0-49 (Poor)

📄 Full report in artifacts


📦 Bundle Size Analysis

Total Build Size: 185M

📦 Top 5 Largest JavaScript Files:

  • 20M - samples3.js
  • 20M - player/samples3.js
  • 13M - player/drumsamples.js
  • 13M - drumsamples.js
  • 9.5M - samples2.js

🎨 Top 5 Largest CSS Files:

  • No CSS files found (might be inlined in JS)

♿ Accessibility Testing

✅ Accessibility scan completed!


📊 Build Details


💡 Pro Tip: Only one build was needed for all these checks - saving CI/CD minutes! 🎯

@github-actions
Copy link
Contributor

github-actions bot commented Jan 19, 2026

🎬 ULTRA Visual Regression Test Results

Hi @supervoidcoder! Tested across 9 combinations (3 platforms × 3 browsers). 8/9 completed.

⚠️ Visual changes detected! Expand sections below for details.

📊 Test Matrix Summary

Platform Browser Changes Details
Ubuntu Logo Ubuntu Chrome ⚠️ Changes View
Ubuntu Logo Ubuntu WebKit ⚠️ Changes View
Windows Logo Windows Chrome ⚠️ Changes View
Windows Logo Windows Firefox ⚠️ Changes View
Windows Logo Windows WebKit ⚠️ Changes View
Apple Logo Apple Chrome ⚠️ Changes View
Apple Logo Apple Firefox ⚠️ Changes View
Apple Logo Apple WebKit ⚠️ Changes View

Ubuntu Logo Ubuntu + Chrome

Editor Initial

No pixel difference detected.

Blocks Workspace

No pixel difference detected.

Stage Sprites

No pixel difference detected.

Code Tab

No pixel difference detected.

Costumes Tab

No pixel difference detected.

Sounds Tab

No pixel difference detected.

Songs Tab

BasePRDiff

Diff: 5.84% (53792 pixels)

Player View

No pixel difference detected.

Extension Library

BasePRDiff

Diff: 0.28% (2538 pixels)

Advanced Settings

No pixel difference detected.

Ubuntu Logo Ubuntu + WebKit

Editor Initial

No pixel difference detected.

Blocks Workspace

No pixel difference detected.

Stage Sprites

No pixel difference detected.

Code Tab

No pixel difference detected.

Costumes Tab

No pixel difference detected.

Sounds Tab

No pixel difference detected.

Songs Tab

BasePRDiff

Diff: 1.99% (73308 pixels)

Player View

No pixel difference detected.

Extension Library

No pixel difference detected.

Advanced Settings

No pixel difference detected.

Windows Logo Windows + Chrome

Editor Initial

No pixel difference detected.

Blocks Workspace

No pixel difference detected.

Stage Sprites

No pixel difference detected.

Code Tab

No pixel difference detected.

Costumes Tab

No pixel difference detected.

Sounds Tab

No pixel difference detected.

Songs Tab

BasePRDiff

Diff: 41.40% (381533 pixels)

Player View

No pixel difference detected.

Extension Library

No pixel difference detected.

Advanced Settings

No pixel difference detected.

Windows Logo Windows + Firefox

Editor Initial

No pixel difference detected.

Blocks Workspace

No pixel difference detected.

Stage Sprites

No pixel difference detected.

Code Tab

No pixel difference detected.

Costumes Tab

No pixel difference detected.

Sounds Tab

No pixel difference detected.

Songs Tab

BasePRDiff

Diff: 0.49% (4503 pixels)

Player View

BasePRDiff

Diff: 2.89% (48208 pixels)

Extension Library

No pixel difference detected.

Advanced Settings

No pixel difference detected.

Windows Logo Windows + WebKit

Editor Initial

No pixel difference detected.

Blocks Workspace

No pixel difference detected.

Stage Sprites

No pixel difference detected.

Code Tab

No pixel difference detected.

Costumes Tab

No pixel difference detected.

Sounds Tab

No pixel difference detected.

Songs Tab

BasePRDiff

Diff: 1.55% (57204 pixels)

Player View

No pixel difference detected.

Extension Library

No pixel difference detected.

Advanced Settings

No pixel difference detected.

Apple Logo Apple + Chrome

Editor Initial

No pixel difference detected.

Blocks Workspace

No pixel difference detected.

Stage Sprites

No pixel difference detected.

Code Tab

No pixel difference detected.

Costumes Tab

No pixel difference detected.

Sounds Tab

No pixel difference detected.

Songs Tab

BasePRDiff

Diff: 24.78% (228375 pixels)

Player View

No pixel difference detected.

Extension Library

No pixel difference detected.

Advanced Settings

No pixel difference detected.

Apple Logo Apple + Firefox

Editor Initial

No pixel difference detected.

Blocks Workspace

BasePRDiff

Diff: 0.21% (1094 pixels)

Stage Sprites

No pixel difference detected.

Code Tab

BasePRDiff

Diff: 0.12% (1094 pixels)

Costumes Tab

No pixel difference detected.

Sounds Tab

No pixel difference detected.

Songs Tab

BasePRDiff

Diff: 0.00% (27 pixels)

Player View

No pixel difference detected.

Extension Library

BasePRDiff

Diff: 0.28% (2584 pixels)

Advanced Settings

BasePRDiff

Diff: 0.12% (1094 pixels)

Apple Logo Apple + WebKit

Editor Initial

No pixel difference detected.

Blocks Workspace

No pixel difference detected.

Stage Sprites

No pixel difference detected.

Code Tab

No pixel difference detected.

Costumes Tab

No pixel difference detected.

Sounds Tab

No pixel difference detected.

Songs Tab

BasePRDiff

Diff: 0.28% (10287 pixels)

Player View

No pixel difference detected.

Extension Library

No pixel difference detected.

Advanced Settings

No pixel difference detected.


📦 Resources

github-actions bot added a commit that referenced this pull request Jan 19, 2026
github-actions bot added a commit that referenced this pull request Jan 19, 2026
github-actions bot added a commit that referenced this pull request Jan 19, 2026
Copilot AI review requested due to automatic review settings January 19, 2026 13:42
@github-actions
Copy link
Contributor

github-actions bot commented Jan 19, 2026

🤖 Auto-Component Test Results

✅ Detected 2 interactive components!

📋 Components Found:

  • 🔘 button in src/components/tw-security-manager-modal/security-manager-modal.jsx:68 - "Deny"
  • 🔘 button in src/components/tw-security-manager-modal/security-manager-modal.jsx:79 - "Allow"

📸 Component Screenshots:

ComponentScreenshot (with highlighting)
Deny
src/components/tw-security-manager-modal/security-manager-modal.jsx:68
Screenshot of DenyScreenshot not available
Allow
src/components/tw-security-manager-modal/security-manager-modal.jsx:79
Screenshot of AllowScreenshot not available

💡 Note: If screenshots appear broken, they may still be processing. Check the screenshots branch for the latest images.

🧪 Test Status: success

Auto-generated tests have been created and executed!

📦 Check the workflow artifacts for:

  • Generated test code
  • Full test results
  • All screenshots

Triggered by @supervoidcoder • Commit 187779f

💡 Tip: These are basic smoke tests. Consider expanding them for better coverage!

@github-actions
Copy link
Contributor

github-actions bot commented Jan 19, 2026

🎉 MEGA PR Test & Analysis Complete!

Hi @supervoidcoder! Your PR has been fully tested and analyzed! 🚀✨


🌍 Test Deployment

Live Preview: https://OmniBlocks.github.io/scratch-gui/supervoidcoder/385/


🧪 Test Results

ESLint: ❌ Found issues

  • Errors: 2
  • Warnings: 0

To fix, click the checkbox below or type /fix lint:

  • 🎨 Auto-fix ESLint issues

Unit Tests:

  • Total: 0 tests
  • ✅ Passed: 1
  • ❌ Failed: 0

Integration Tests:

  • Total: 4 tests
  • ✅ Passed: 0
  • ❌ Failed: 15
  • ⏭️ Skipped: 1

💡 Pro Tip: Check the Files Changed tab for inline annotations showing exactly where errors occurred! 🎯

📄 Full test outputs available in artifacts


🔦 Performance Audit (Lighthouse)

✅ Audit completed successfully!

📊 Lighthouse Scores:

  • 🔴 Performance: 33/100
  • 🟠 Accessibility: 70/100
  • 🟢 Best Practices: 96/100
  • 🟠 SEO: 88/100

⚡ Core Web Vitals:

  • First Contentful Paint: 42.8 s
  • Largest Contentful Paint: 46.3 s
  • Total Blocking Time: 960 ms
  • Cumulative Layout Shift: 0
  • Speed Index: 42.8 s

🟢 90-100 (Good) | 🟠 50-89 (Needs Improvement) | 🔴 0-49 (Poor)

📄 Full report in artifacts


📦 Bundle Size Analysis

Total Build Size: 185M

📦 Top 5 Largest JavaScript Files:

  • 20M - samples3.js
  • 20M - player/samples3.js
  • 13M - player/drumsamples.js
  • 13M - drumsamples.js
  • 9.5M - samples2.js

🎨 Top 5 Largest CSS Files:

  • No CSS files found (might be inlined in JS)

♿ Accessibility Testing

✅ Accessibility scan completed!


📊 Build Details


💡 Pro Tip: Only one build was needed for all these checks - saving CI/CD minutes! 🎯

@github-actions
Copy link
Contributor

github-actions bot commented Jan 19, 2026

🎬 ULTRA Visual Regression Test Results

Hi @supervoidcoder! Tested across 9 combinations (3 platforms × 3 browsers). 8/9 completed.

⚠️ Visual changes detected! Expand sections below for details.

📊 Test Matrix Summary

Platform Browser Changes Details
Ubuntu Logo Ubuntu Chrome ⚠️ Changes View
Ubuntu Logo Ubuntu WebKit ⚠️ Changes View
Windows Logo Windows Chrome ⚠️ Changes View
Windows Logo Windows Firefox ⚠️ Changes View
Windows Logo Windows WebKit ⚠️ Changes View
Apple Logo Apple Chrome ✅ No changes View
Apple Logo Apple Firefox ⚠️ Changes View
Apple Logo Apple WebKit ⚠️ Changes View

Ubuntu Logo Ubuntu + Chrome

Editor Initial

No pixel difference detected.

Blocks Workspace

No pixel difference detected.

Stage Sprites

No pixel difference detected.

Code Tab

No pixel difference detected.

Costumes Tab

No pixel difference detected.

Sounds Tab

No pixel difference detected.

Songs Tab

BasePRDiff

Diff: 0.37% (3402 pixels)

Player View

No pixel difference detected.

Extension Library

BasePRDiff

Diff: 0.28% (2538 pixels)

Advanced Settings

BasePRDiff

Diff: 0.00% (1 pixels)

Ubuntu Logo Ubuntu + WebKit

Editor Initial

No pixel difference detected.

Blocks Workspace

No pixel difference detected.

Stage Sprites

No pixel difference detected.

Code Tab

No pixel difference detected.

Costumes Tab

No pixel difference detected.

Sounds Tab

No pixel difference detected.

Songs Tab

BasePRDiff

Diff: 0.36% (13447 pixels)

Player View

No pixel difference detected.

Extension Library

No pixel difference detected.

Advanced Settings

No pixel difference detected.

Windows Logo Windows + Chrome

Editor Initial

No pixel difference detected.

Blocks Workspace

No pixel difference detected.

Stage Sprites

No pixel difference detected.

Code Tab

No pixel difference detected.

Costumes Tab

No pixel difference detected.

Sounds Tab

No pixel difference detected.

Songs Tab

BasePRDiff

Diff: 41.25% (380160 pixels)

Player View

No pixel difference detected.

Extension Library

No pixel difference detected.

Advanced Settings

No pixel difference detected.

Windows Logo Windows + Firefox

Editor Initial

No pixel difference detected.

Blocks Workspace

No pixel difference detected.

Stage Sprites

No pixel difference detected.

Code Tab

No pixel difference detected.

Costumes Tab

No pixel difference detected.

Sounds Tab

No pixel difference detected.

Songs Tab

BasePRDiff

Diff: 0.12% (1114 pixels)

Player View

BasePRDiff

Diff: 2.89% (48206 pixels)

Extension Library

No pixel difference detected.

Advanced Settings

No pixel difference detected.

Windows Logo Windows + WebKit

Editor Initial

No pixel difference detected.

Blocks Workspace

No pixel difference detected.

Stage Sprites

No pixel difference detected.

Code Tab

No pixel difference detected.

Costumes Tab

No pixel difference detected.

Sounds Tab

No pixel difference detected.

Songs Tab

BasePRDiff

Diff: 0.29% (10756 pixels)

Player View

No pixel difference detected.

Extension Library

No pixel difference detected.

Advanced Settings

No pixel difference detected.

Apple Logo Apple + Chrome

Editor Initial

No pixel difference detected.

Blocks Workspace

No pixel difference detected.

Stage Sprites

No pixel difference detected.

Code Tab

No pixel difference detected.

Costumes Tab

No pixel difference detected.

Sounds Tab

No pixel difference detected.

Songs Tab

No pixel difference detected.

Player View

No pixel difference detected.

Extension Library

No pixel difference detected.

Advanced Settings

No pixel difference detected.

Apple Logo Apple + Firefox

Editor Initial

No pixel difference detected.

Blocks Workspace

No pixel difference detected.

Stage Sprites

No pixel difference detected.

Code Tab

No pixel difference detected.

Costumes Tab

No pixel difference detected.

Sounds Tab

No pixel difference detected.

Songs Tab

BasePRDiff

Diff: 3.80% (34997 pixels)

Player View

No pixel difference detected.

Extension Library

No pixel difference detected.

Advanced Settings

No pixel difference detected.

Apple Logo Apple + WebKit

Editor Initial

No pixel difference detected.

Blocks Workspace

No pixel difference detected.

Stage Sprites

No pixel difference detected.

Code Tab

No pixel difference detected.

Costumes Tab

No pixel difference detected.

Sounds Tab

No pixel difference detected.

Songs Tab

BasePRDiff

Diff: 0.16% (5889 pixels)

Player View

No pixel difference detected.

Extension Library

No pixel difference detected.

Advanced Settings

No pixel difference detected.


📦 Resources

github-actions bot added a commit that referenced this pull request Jan 19, 2026
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 7 out of 9 changed files in this pull request and generated 1 comment.

const GALLERY_TIMEOUT_MS = 750;

const fetchLibrary = async () => {
// Common gallery fetcher function to reduce code duplication
Copy link

Copilot AI Jan 19, 2026

Choose a reason for hiding this comment

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

The comment "Common gallery fetcher function to reduce code duplication" on line 48 is misleading because two separate functions fetchLibraryTW and fetchLibraryOB are implemented below, not a single common function. The actual common function is loadGalleryWithTimeout introduced later. Either update this comment to accurately describe the refactoring, or move it to line 138 where the truly common helper is defined.

Suggested change
// Common gallery fetcher function to reduce code duplication
// Gallery fetcher helpers and caches

Copilot uses AI. Check for mistakes.
github-actions bot added a commit that referenced this pull request Jan 19, 2026
github-actions bot added a commit that referenced this pull request Jan 19, 2026
@github-actions
Copy link
Contributor

🕐 Stale PR Reminder

Hey @supervoidcoder! 👋 This PR has been quiet for a while. Need any help getting it across the finish line? Feel free to ask! 🚀


This is an automated friendly reminder. No pressure! 💙

@supervoidcoder supervoidcoder mentioned this pull request Jan 28, 2026
9 tasks
@ampelectrecuted
Copy link
Contributor

@coderabbitai generate docstrings

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Jan 29, 2026

✅ Actions performed

Initiated docstring generation; will generate only if new commits exist.

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Jan 29, 2026

Caution

Docstrings generation - FAILED

No docstrings were generated.

@github-actions
Copy link
Contributor

github-actions bot commented Feb 6, 2026

🕐 Stale PR Reminder

Hey @supervoidcoder! 👋 This PR has been quiet for a while. Need any help getting it across the finish line? Feel free to ask! 🚀


This is an automated friendly reminder. No pressure! 💙

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working enhancement New feature or request needs-careful-testing Requires special attention: needs careful-testing review-effort-3 Standard review (30-60 min) security-sensitive Requires special attention: security sensitive size/L

Projects

Status: No status

Development

Successfully merging this pull request may close these issues.

2 participants