Loading skill
Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Use when you need to review Chrome extension manifests, content scripts, background workers, permissions, and store-readiness.
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-04 | ✗→✓ | ▲ Improved | 43% | 0% |
| case-13 | ✓→✗ | ▼ Worse | 100% | 0% |
| case-05 | ✓→✓ | = Same ✓ | -3% | 0% |
| case-07 | ✓→✓ | = Same ✓ | 127% | 0% |
| case-08 | ✓→✓ | = Same ✓ | 124% | 0% |
Review Chrome extensions for Manifest V3 compliance, security (CSP, XSS, privilege escalation), permission minimization, message-passing correctness, content script isolation, and Chrome Web Store policy readiness.
manifest.json, service worker, content scripts, or popup pages.chrome.* API usage."manifest_version": 3 — MV2 extensions are being phased out and will stop working in Chrome.background.service_worker replaces background.scripts / background.page from MV2.declarativeNetRequest replaces webRequest blocking mode — verify rules are defined in _rules.json or fetched via updateDynamicRules.action replaces browser_action / page_action.eval(), no new Function(string), no chrome.tabs.executeScript with a string body loaded from a remote URL.content_scripts must not use document.write().permissions, optional_permissions, and host_permissions.activeTab over broad host_permissions like <all_urls> or *://*/* when the extension only needs the current tab.tabs, history, bookmarks, cookies, webNavigation, downloads, nativeMessaging) require clear justification in the store listing.scripting permission: verify chrome.scripting.executeScript is not used to inject remotely-fetched code strings.storage vs unlimitedStorage: only request unlimitedStorage if the data volume genuinely requires it.https://api.example.com/* is better than https://*/*.https://*.example.com/*) must be justified — ensure the extension does not accidentally run on all subdomains of a large service.chrome.permissions.request() rather than declared statically for permissions not needed at install time.manifest.json under "content_security_policy"."script-src 'self'; object-src 'none';" — no unsafe-inline, no unsafe-eval.unsafeWindow or window.wrappedJSObject without necessity.chrome.runtime.onMessage.addListener: verify the sender is checked before acting on messages — do not trust messages from arbitrary web pages.chrome.runtime.sendMessage from content scripts: the service worker handler must validate the message shape before executing privileged actions.chrome.runtime.onMessageExternal (cross-extension messaging): explicitly whitelist allowed extension IDs if used.postMessage between content script and page: validate event.origin strictly; never use origin === '*'.element.innerHTML = response.data is XSS if response.data is attacker-controlled.textContent for text, createElement + setAttribute for DOM construction.document.location, document.URL, document.referrer fed into eval, innerHTML, or document.write.window object unless strictly necessary.chrome.storage.session or chrome.storage.local.setInterval — use chrome.alarms for periodic tasks.chrome.alarms.create requires the alarms permission..catch() to all async chains.chrome.storage.local is not encrypted — do not store sensitive credentials there; use chrome.storage.session (cleared on browser restart) or the OS credential store via native messaging.matches to restrict which origins can access the resource — avoid "matches": ["<all_urls>"].web_accessible_resources allows malicious pages to fingerprint extension presence and load extension assets."privacy_policy" URL.MV3 compliance:
manifest_version: 3background.service_worker defined (no background.page)eval(), new Function(string), or remote script injectiondeclarativeNetRequest used instead of blocking webRequest where applicablePermissions:
activeTab preferred over <all_urls> where possibletabs, history, cookies) justifiedSecurity:
script-src 'self', no unsafe-inline/unsafe-evalruntime.onMessage validates sender before privileged actionsinnerHTML with external dataweb_accessible_resources has restricted matchesService worker:
chrome.alarms used for periodic tasks, not setInterval.catch()Privacy:
service_worker."host_permissions": ["<all_urls>"]: flags for manual review in the store and is almost always broader than needed.innerHTML with data from fetch(): if the fetched resource can be influenced by a web page (CORS, redirect), this is a stored XSS vector inside the extension context.sender check in onMessage: a malicious web page can send crafted messages to the extension's background and trigger privileged actions.chrome.storage.local: readable by any code with access to the extension context. Prefer chrome.storage.session or prompt re-auth.eval() in content scripts for template rendering: violates MV3 CSP and the store policy.web_accessible_resources: ["*"] with matches: ["<all_urls>"]: allows any web page to detect the extension and load any bundled asset.chrome.tabs.query for all tabs: collecting all open tab URLs is a privacy risk and requires justification; prefer activeTab.Return a structured report with:
Other measured skills in the registry, with their headline benchmark lift.