Conversation
updazte branch
revert revert extensions
This comment has been minimized.
This comment has been minimized.
|
⏳ 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 GitHubAmazon 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
FeaturesAgentic Chat Code Review CustomizationYou can create project-specific rules for Amazon Q Developer to follow:
Example rule: FeedbackTo 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
|
🎨 Visual Regression Test ResultsHi @supervoidcoder! Here are the visual comparison results: ✅ No Visual Changes DetectedAll screenshots match the base branch! 🎉 📊 All Screenshots Checked
💡 Tip: Download the artifacts to view detailed before/after comparisons! |
🎉 MEGA PR Test & Analysis Complete!Hi @supervoidcoder! Your PR has been fully tested and analyzed! 🚀✨ 🌍 Test DeploymentLive Preview: https://OmniBlocks.github.io/scratch-gui/supervoidcoder/385/ 🧪 Test ResultsESLint: ❌ Found issues
Unit Tests: ✅
Integration Tests: ❌
📄 Full test outputs available in artifacts 🔦 Performance Audit (Lighthouse)✅ Audit completed successfully! 📊 Lighthouse Scores:
⚡ Core Web Vitals:
🟢 90-100 (Good) | 🟠 50-89 (Needs Improvement) | 🔴 0-49 (Poor) 📄 Full report in artifacts 📦 Bundle Size AnalysisTotal Build Size: 136M 📦 Top 5 Largest JavaScript Files:
🎨 Top 5 Largest CSS Files:
♿ Accessibility Testing✅ Accessibility scan completed!
📊 Build Details
💡 Pro Tip: Only one build was needed for all these checks - saving CI/CD minutes! 🎯 |
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
Summary by CodeRabbitRelease Notes
WalkthroughAdds 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
Sequence DiagramsequenceDiagram
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
Estimated code review effort🎯 4 (Complex) | ⏱️ ~45 minutes Possibly related issues
Possibly related PRs
Suggested labels
Poem
🚥 Pre-merge checks | ✅ 2 | ❌ 1❌ Failed checks (1 inconclusive)
✅ Passed checks (2 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches
🧪 Generate unit tests (beta)
Tip Try Coding Plans. Let us write the prompt for your AI agent so you can ship faster (with fewer bugs). 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 |
🔍 General Code Quality Feedback🔍 Comprehensive Code ReviewConsolidated Feedback
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:
Improvements:
Positive Notes:
Next Steps:
By addressing these issues and suggestions, the code quality, security, and maintainability of the project will be significantly improved. 🤖 Generated by Wellcode.ai |
There was a problem hiding this comment.
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:
- Security Vulnerability: The JavaScript V2 extension allows arbitrary code execution without proper sandboxing or security warnings
- Logic Errors: Race condition in gallery loading timeout handling and inconsistent return types in fallback implementations
- 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 |
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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
loadGalleryWithTimeoutschedules a timeout and always runssuccessCallback/errorCallbackwhen 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 refinedRight 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:valuesprop no longer used in TurboWarp Blocks messageThe
defaultMessagefor the TurboWarp Blocks name is now the literal"TurboWarp Blocks", but theFormattedMessagestill passesvalues={{ APP_NAME: "TurboWarp" }}even thoughAPP_NAMEisn’t interpolated in that string anymore.You can simplify by dropping the
valuesprop (and, if not used elsewhere below, theAPP_NAMEimport) to make the intent clearer.
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
⛔ Files ignored due to path filters (2)
src/lib/libraries/extensions/gallery/obgallery.svgis excluded by!**/*.svgsrc/lib/libraries/extensions/javascript/javascript.pngis 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.jsxsrc/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.jsxsrc/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.jsxsrc/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.jsxsrc/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.FieldCustomtothis.ScratchBlocks.FieldCustomproperly wires the Closure-compiled Blockly implementation to the ScratchBlocks API that extensions expect, enabling the JavaScript V2 extension'sregisterInputusage at runtime.Based on learnings
src/containers/extension-library.jsx (1)
8-15: Remote gallery mapping and extensionURL usage look correctThe TW/OB fetchers normalize metadata into library items with
extensionId,extensionURL,iconURL, tags, docs, samples, and credits, and then the library uses these viahandleItemSelect. This aligns with the requirement that custom/remote items always provideextensionURLso the loader doesn’t treatextensionIdas 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 matchesextensionIdAdding 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().idinsrc/extensions/sp_javascriptV2/index.jsis exactly'SPjavascriptV2', and- the VM’s
extensionManager(or equivalent registration table) knows how to load this id, soloadExtensionURL('SPjavascriptV2')works without needing an explicitextensionURLhere.If either of those isn’t true, adding an
extensionURLpointing at the built/bundled JS file would be safer.Also applies to: 387-407
431-498: TurboWarp and OmniBlocks gallery metadata wiring looks consistentThe updated TurboWarp gallery exports now explicitly say “TurboWarp Extension Gallery”, and the new OmniBlocks gallery exports (
galleryLoadingOB,galleryMoreOB,galleryErrorOB) use:
- a consistent
nameid (ob.extensionGallery.name),href: 'https://omniblocks.github.io/extensions',extensionId: 'galleryOB', and- the
obgalleryIconplustags: ['ob'].This matches how
ExtensionLibraryis consuming them (checkingitem.hrefto 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
|
/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) |
|
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 |
|
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! |
Co-authored-by: amazon-q-developer[bot] <208079219+amazon-q-developer[bot]@users.noreply.github.com>
🎨 Visual Regression Test ResultsHi @supervoidcoder! Here are the visual comparison results: ✅ No Visual Changes DetectedAll screenshots match the base branch! 🎉 📊 All Screenshots Checked
💡 Tip: Download the artifacts to view detailed before/after comparisons! |
🎉 MEGA PR Test & Analysis Complete!Hi @supervoidcoder! Your PR has been fully tested and analyzed! 🚀✨ 🌍 Test DeploymentLive Preview: https://OmniBlocks.github.io/scratch-gui/ampelectrecuted/385/ 🧪 Test ResultsESLint: ❌ Found issues
Unit Tests: ✅
Integration Tests: ❌
📄 Full test outputs available in artifacts 🔦 Performance Audit (Lighthouse)✅ Audit completed successfully! 📊 Lighthouse Scores:
⚡ Core Web Vitals:
🟢 90-100 (Good) | 🟠 50-89 (Needs Improvement) | 🔴 0-49 (Poor) 📄 Full report in artifacts 📦 Bundle Size AnalysisTotal Build Size: 136M 📦 Top 5 Largest JavaScript Files:
🎨 Top 5 Largest CSS Files:
♿ 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>
🎨 Visual Regression Test ResultsHi @supervoidcoder! Here are the visual comparison results: ✅ No Visual Changes DetectedAll screenshots match the base branch! 🎉 📊 All Screenshots Checked
💡 Tip: Download the artifacts to view detailed before/after comparisons! |
🎉 MEGA PR Test & Analysis Complete!Hi @supervoidcoder! Your PR has been fully tested and analyzed! 🚀✨ 🌍 Test DeploymentLive Preview: https://OmniBlocks.github.io/scratch-gui/ampelectrecuted/385/ 🧪 Test ResultsESLint: ❌ Found issues
Unit Tests: ✅
Integration Tests: ❌
📄 Full test outputs available in artifacts 🔦 Performance Audit (Lighthouse)✅ Audit completed successfully! 📊 Lighthouse Scores:
⚡ Core Web Vitals:
🟢 90-100 (Good) | 🟠 50-89 (Needs Improvement) | 🔴 0-49 (Poor) 📄 Full report in artifacts 📦 Bundle Size AnalysisTotal Build Size: 136M 📦 Top 5 Largest JavaScript Files:
🎨 Top 5 Largest CSS Files:
♿ Accessibility Testing✅ Accessibility scan completed!
📊 Build Details
💡 Pro Tip: Only one build was needed for all these checks - saving CI/CD minutes! 🎯 |
🤖 Auto-Component Test Results✅ Detected 2 interactive components!📋 Components Found:
📸 Component Screenshots:💡 Note: If screenshots appear broken, they may still be processing. Check the screenshots branch for the latest images. 🧪 Test Status:
|
🎉 MEGA PR Test & Analysis Complete!Hi @supervoidcoder! Your PR has been fully tested and analyzed! 🚀✨ 🌍 Test DeploymentLive Preview: https://OmniBlocks.github.io/scratch-gui/supervoidcoder/385/ 🧪 Test ResultsESLint: ❌ Found issues
To fix, click the checkbox below or type
Unit Tests: ✅
Integration Tests: ❌
📄 Full test outputs available in artifacts 🔦 Performance Audit (Lighthouse)✅ Audit completed successfully! 📊 Lighthouse Scores:
⚡ Core Web Vitals:
🟢 90-100 (Good) | 🟠 50-89 (Needs Improvement) | 🔴 0-49 (Poor) 📄 Full report in artifacts 📦 Bundle Size AnalysisTotal Build Size: 185M 📦 Top 5 Largest JavaScript Files:
🎨 Top 5 Largest CSS Files:
♿ Accessibility Testing✅ Accessibility scan completed!
📊 Build Details
💡 Pro Tip: Only one build was needed for all these checks - saving CI/CD minutes! 🎯 |
🎬 ULTRA Visual Regression Test ResultsHi @supervoidcoder! Tested across 9 combinations (3 platforms × 3 browsers). 8/9 completed. 📊 Test Matrix Summary
|
| Base | PR | Diff |
|---|---|---|
![]() | ![]() | ![]() |
Diff: 5.84% (53792 pixels)
Player View
✅ No pixel difference detected.
Extension Library
| Base | PR | Diff |
|---|---|---|
![]() | ![]() | ![]() |
Diff: 0.28% (2538 pixels)
Advanced Settings
✅ No pixel difference detected.
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
| Base | PR | Diff |
|---|---|---|
![]() | ![]() | ![]() |
Diff: 1.99% (73308 pixels)
Player View
✅ No pixel difference detected.
Extension Library
✅ No pixel difference detected.
Advanced Settings
✅ No pixel difference detected.
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
| Base | PR | Diff |
|---|---|---|
![]() | ![]() | ![]() |
Diff: 41.40% (381533 pixels)
Player View
✅ No pixel difference detected.
Extension Library
✅ No pixel difference detected.
Advanced Settings
✅ No pixel difference detected.
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
| Base | PR | Diff |
|---|---|---|
![]() | ![]() | ![]() |
Diff: 0.49% (4503 pixels)
Player View
| Base | PR | Diff |
|---|---|---|
![]() | ![]() | ![]() |
Diff: 2.89% (48208 pixels)
Extension Library
✅ No pixel difference detected.
Advanced Settings
✅ No pixel difference detected.
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
| Base | PR | Diff |
|---|---|---|
![]() | ![]() | ![]() |
Diff: 1.55% (57204 pixels)
Player View
✅ No pixel difference detected.
Extension Library
✅ No pixel difference detected.
Advanced Settings
✅ No pixel difference detected.
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
| Base | PR | Diff |
|---|---|---|
![]() | ![]() | ![]() |
Diff: 24.78% (228375 pixels)
Player View
✅ No pixel difference detected.
Extension Library
✅ No pixel difference detected.
Advanced Settings
✅ No pixel difference detected.
Apple + Firefox
Editor Initial
✅ No pixel difference detected.
Blocks Workspace
| Base | PR | Diff |
|---|---|---|
![]() | ![]() | ![]() |
Diff: 0.21% (1094 pixels)
Stage Sprites
✅ No pixel difference detected.
Code Tab
| Base | PR | Diff |
|---|---|---|
![]() | ![]() | ![]() |
Diff: 0.12% (1094 pixels)
Costumes Tab
✅ No pixel difference detected.
Sounds Tab
✅ No pixel difference detected.
Songs Tab
| Base | PR | Diff |
|---|---|---|
![]() | ![]() | ![]() |
Diff: 0.00% (27 pixels)
Player View
✅ No pixel difference detected.
Extension Library
| Base | PR | Diff |
|---|---|---|
![]() | ![]() | ![]() |
Diff: 0.28% (2584 pixels)
Advanced Settings
| Base | PR | Diff |
|---|---|---|
![]() | ![]() | ![]() |
Diff: 0.12% (1094 pixels)
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
| Base | PR | Diff |
|---|---|---|
![]() | ![]() | ![]() |
Diff: 0.28% (10287 pixels)
Player View
✅ No pixel difference detected.
Extension Library
✅ No pixel difference detected.
Advanced Settings
✅ No pixel difference detected.
📦 Resources
🤖 Auto-Component Test Results✅ Detected 2 interactive components!📋 Components Found:
📸 Component Screenshots:💡 Note: If screenshots appear broken, they may still be processing. Check the screenshots branch for the latest images. 🧪 Test Status:
|
🎉 MEGA PR Test & Analysis Complete!Hi @supervoidcoder! Your PR has been fully tested and analyzed! 🚀✨ 🌍 Test DeploymentLive Preview: https://OmniBlocks.github.io/scratch-gui/supervoidcoder/385/ 🧪 Test ResultsESLint: ❌ Found issues
To fix, click the checkbox below or type
Unit Tests: ✅
Integration Tests: ❌
📄 Full test outputs available in artifacts 🔦 Performance Audit (Lighthouse)✅ Audit completed successfully! 📊 Lighthouse Scores:
⚡ Core Web Vitals:
🟢 90-100 (Good) | 🟠 50-89 (Needs Improvement) | 🔴 0-49 (Poor) 📄 Full report in artifacts 📦 Bundle Size AnalysisTotal Build Size: 185M 📦 Top 5 Largest JavaScript Files:
🎨 Top 5 Largest CSS Files:
♿ Accessibility Testing✅ Accessibility scan completed!
📊 Build Details
💡 Pro Tip: Only one build was needed for all these checks - saving CI/CD minutes! 🎯 |
🎬 ULTRA Visual Regression Test ResultsHi @supervoidcoder! Tested across 9 combinations (3 platforms × 3 browsers). 8/9 completed. 📊 Test Matrix Summary
|
| Base | PR | Diff |
|---|---|---|
![]() | ![]() | ![]() |
Diff: 0.37% (3402 pixels)
Player View
✅ No pixel difference detected.
Extension Library
| Base | PR | Diff |
|---|---|---|
![]() | ![]() | ![]() |
Diff: 0.28% (2538 pixels)
Advanced Settings
| Base | PR | Diff |
|---|---|---|
![]() | ![]() | ![]() |
Diff: 0.00% (1 pixels)
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
| Base | PR | Diff |
|---|---|---|
![]() | ![]() | ![]() |
Diff: 0.36% (13447 pixels)
Player View
✅ No pixel difference detected.
Extension Library
✅ No pixel difference detected.
Advanced Settings
✅ No pixel difference detected.
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
| Base | PR | Diff |
|---|---|---|
![]() | ![]() | ![]() |
Diff: 41.25% (380160 pixels)
Player View
✅ No pixel difference detected.
Extension Library
✅ No pixel difference detected.
Advanced Settings
✅ No pixel difference detected.
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
| Base | PR | Diff |
|---|---|---|
![]() | ![]() | ![]() |
Diff: 0.12% (1114 pixels)
Player View
| Base | PR | Diff |
|---|---|---|
![]() | ![]() | ![]() |
Diff: 2.89% (48206 pixels)
Extension Library
✅ No pixel difference detected.
Advanced Settings
✅ No pixel difference detected.
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
| Base | PR | Diff |
|---|---|---|
![]() | ![]() | ![]() |
Diff: 0.29% (10756 pixels)
Player View
✅ No pixel difference detected.
Extension Library
✅ No pixel difference detected.
Advanced Settings
✅ No pixel difference detected.
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 + 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
| Base | PR | Diff |
|---|---|---|
![]() | ![]() | ![]() |
Diff: 3.80% (34997 pixels)
Player View
✅ No pixel difference detected.
Extension Library
✅ No pixel difference detected.
Advanced Settings
✅ No pixel difference detected.
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
| Base | PR | Diff |
|---|---|---|
![]() | ![]() | ![]() |
Diff: 0.16% (5889 pixels)
Player View
✅ No pixel difference detected.
Extension Library
✅ No pixel difference detected.
Advanced Settings
✅ No pixel difference detected.
📦 Resources
| const GALLERY_TIMEOUT_MS = 750; | ||
|
|
||
| const fetchLibrary = async () => { | ||
| // Common gallery fetcher function to reduce code duplication |
There was a problem hiding this comment.
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.
| // Common gallery fetcher function to reduce code duplication | |
| // Gallery fetcher helpers and caches |
🕐 Stale PR ReminderHey @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! 💙 |
|
@coderabbitai generate docstrings |
✅ Actions performedInitiated docstring generation; will generate only if new commits exist. |
|
Caution Docstrings generation - FAILED No docstrings were generated. |
🕐 Stale PR ReminderHey @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! 💙 |
🎉 MEGA PR Test & Analysis Complete!Hi @supervoidcoder! Your PR has been fully tested and analyzed! 🚀✨ 🌍 Test DeploymentLive Preview: https://OmniBlocks.github.io/scratch-gui/supervoidcoder/385/ 🧪 Test ResultsESLint: ❌ Found issues
To fix, click the checkbox below or type
Unit Tests: ✅
Integration Tests: ❌
📄 Full test outputs available in artifacts 🔦 Performance Audit (Lighthouse)✅ Audit completed successfully! 📊 Lighthouse Scores:
⚡ Core Web Vitals:
🟢 90-100 (Good) | 🟠 50-89 (Needs Improvement) | 🔴 0-49 (Poor) 📄 Full report in artifacts 📦 Bundle Size AnalysisTotal Build Size: 172M 📦 Top 5 Largest JavaScript Files:
🎨 Top 5 Largest CSS Files:
♿ Accessibility Testing✅ Accessibility scan completed!
📊 Build Details
💡 Pro Tip: Only one build was needed for all these checks - saving CI/CD minutes! 🎯 |
🔍 AI Visual Regression ReportPR: #385 — Extensions
|
| File | Type | Visual Area |
|---|---|---|
src/components/tw-security-manager-modal/security-manager-modal.jsx |
Modified | Security modal dialog |
src/components/tw-security-manager-modal/unsandbox.jsx |
New | Unsandbox warning modal |
src/containers/extension-library.jsx |
Modified | Extension library dialog |
src/lib/libraries/extensions/index.jsx |
Modified | Extension library entries |
src/lib/libraries/extensions/javascript/javascript.png |
New | JS extension icon |
src/lib/libraries/extensions/gallery/obgallery.svg |
New | OmniBlocks gallery icon |
src/containers/blocks.jsx |
Modified | Blocks workspace (functional only) |
src/containers/tw-security-manager.jsx |
Modified | Security manager logic |
src/lib/tw-security-manager-constants.js |
Modified | Constants (non-visual) |
Visual Changes Identified
1. 🆕 New Unsandbox Security Warning Modal
A new modal dialog is now shown when an extension requests to run without a sandbox. It displays two paragraphs:
"The extension {extensionName} wants to run without the sandbox."- A detailed warning about dangers (credential theft, malware, etc.) with the app name
This modal only appears in specific runtime scenarios (when an extension calls canUnsandbox), not on initial load.
2. 🆕 JavaScript V2 Extension Entry in Extension Library
A new "JavaScript V2" extension (by SharkPool) has been added to the extension library with:
- Icon:
javascript.png(new PNG icon) - Description: "Run your own custom code written in JavaScript! Made by SharkPool."
- Tags:
['ob'](OmniBlocks-only) - Marked
incompatibleWithScratch: true
3. 🆕 OmniBlocks Extension Gallery Entry
A new gallery entry for (omniblocks.github.io/redacted) has been added alongside the TurboWarp gallery. It uses a new obgallery.svg` icon and shows loading/more/error states.
4. ✏️ "TurboWarp Blocks" Name Hardcoded
The extension previously displayed as {APP_NAME} Blocks (which would show as "OmniBlocks Blocks") is now hardcoded to "TurboWarp Blocks". Similarly, the TurboWarp gallery entry name is hardcoded to "TurboWarp Extension Gallery".
5. 🔧 Blocks Workspace: FieldCustom Bridge (Functional, Not Visual)
A window.Blockly.FieldCustom → ScratchBlocks.FieldCustom bridge is added in blocks.jsx for the JS extension. This does not change any visible UI directly, but adds a stub fallback that logs a warning if FieldCustom isn't available.
Summary
This PR introduces 3 new visual UI areas (unsandbox modal, JavaScript V2 extension tile, OmniBlocks gallery entry) and 1 text change (TurboWarp Blocks name hardcoding). The changes are additive — no existing UI elements were removed or repositioned. The security modal changes are modal-only and won't affect the baseline editor layout.
⚠️ Recommendation: Manually verify the extension library dialog in a local build to confirm the new JavaScript V2 tile and OmniBlocks gallery entries render correctly with their new icons, and trigger the unsandbox permission prompt to verify the new modal's layout and styling.
Generated by AI Visual Regression Tester for issue #385
There was a problem hiding this comment.
Actionable comments posted: 2
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@src/lib/libraries/extensions/index.jsx`:
- Around line 407-408: Update the translator note string for the extension with
id "ob.jsv2": fix the typo by changing description from "JavaScriptv2 made by
SharkPool" to a properly spaced/capitalized form such as "JavaScript V2 made by
SharkPool" so the product name is readable and consistent; locate the object or
export that contains the properties description and id ("id: 'ob.jsv2'") in
src/lib/libraries/extensions/index.jsx and update only the description value.
- Around line 411-412: The SPjavascriptV2 extension entry lacks an extensionURL
and has a nonstandard description; update the extension registration for symbol
SPjavascriptV2 in the extensions list by adding an extensionURL that points to
the extension bundle (e.g., the hosted JS/CSS bundle used by the loader) or, if
you intend it to be built-in, confirm VM-side registration instead of treating
it as a custom extension; also change the description field from "JavaScriptv2"
to the localized/consistent label "JavaScript V2" (and ensure the entry still
references jgJavascriptExtensionIcon for iconURL).
| description="JavaScriptv2 made by SharkPool" | ||
| id="ob.jsv2" |
There was a problem hiding this comment.
Fix translator note text for JavaScript V2.
There’s a minor typo/style issue in the description string (JavaScriptv2).
✏️ Proposed fix
- description="JavaScriptv2 made by SharkPool"
+ description="JavaScript V2 made by SharkPool"📝 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.
| description="JavaScriptv2 made by SharkPool" | |
| id="ob.jsv2" | |
| description="JavaScript V2 made by SharkPool" | |
| id="ob.jsv2" |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@src/lib/libraries/extensions/index.jsx` around lines 407 - 408, Update the
translator note string for the extension with id "ob.jsv2": fix the typo by
changing description from "JavaScriptv2 made by SharkPool" to a properly
spaced/capitalized form such as "JavaScript V2 made by SharkPool" so the product
name is readable and consistent; locate the object or export that contains the
properties description and id ("id: 'ob.jsv2'") in
src/lib/libraries/extensions/index.jsx and update only the description value.
| extensionId: 'SPjavascriptV2', | ||
| iconURL: jgJavascriptExtensionIcon, |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -euo pipefail
# 1) Find JavaScript extension implementations and getInfo().id values in VM
echo "=== Checking VM extension registrations ==="
rg -nP --type=js "getInfo\s*\(" src/extensions --color=never -A5 | grep -E "(getInfo|id\s*:)" | head -30
# 2) Check extension-manager for SPjavascriptV2 and jg_javascript references
echo -e "\n=== Checking extension-manager registration ==="
rg -nP --type=js "(SPjavascriptV2|jg_javascript|sp_javascriptV2)" src/extension-support --color=never -B2 -A2
# 3) Check full extension entry for SPjavascriptV2 in GUI
echo -e "\n=== Full SPjavascriptV2 entry in GUI (lines 403-423) ==="
sed -n '403,425p' src/lib/libraries/extensions/index.jsxRepository: OmniBlocks/scratch-gui
Length of output: 181
🏁 Script executed:
#!/bin/bash
set -euo pipefail
# 1) Read the full SPjavascriptV2 entry in GUI
echo "=== Full SPjavascriptV2 entry (lines 400-425) ==="
sed -n '400,425p' src/lib/libraries/extensions/index.jsx
# 2) Compare with nearby extension entries to see extensionURL pattern
echo -e "\n=== Previous extension entry for context (lines 370-395) ==="
sed -n '370,395p' src/lib/libraries/extensions/index.jsx
# 3) Show a few other extension entries to understand extensionURL presence pattern
echo -e "\n=== Check line count and general structure around line 411 ==="
wc -l src/lib/libraries/extensions/index.jsxRepository: OmniBlocks/scratch-gui
Length of output: 1966
Add extensionURL to SPjavascriptV2 entry or ensure VM-side registration.
The entry has only extensionId without extensionURL. Custom extensions require an explicit URL to load reliably; without it, the loader fails. Either add extensionURL pointing to the extension bundle, or confirm the VM registers SPjavascriptV2 as a built-in (not a custom loader case). Also, the description attribute reads "JavaScriptv2"—update to match the localized message "JavaScript V2" for consistency.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@src/lib/libraries/extensions/index.jsx` around lines 411 - 412, The
SPjavascriptV2 extension entry lacks an extensionURL and has a nonstandard
description; update the extension registration for symbol SPjavascriptV2 in the
extensions list by adding an extensionURL that points to the extension bundle
(e.g., the hosted JS/CSS bundle used by the loader) or, if you intend it to be
built-in, confirm VM-side registration instead of treating it as a custom
extension; also change the description field from "JavaScriptv2" to the
localized/consistent label "JavaScript V2" (and ensure the entry still
references jgJavascriptExtensionIcon for iconURL).










































































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