Build a plain JavaScript extension module for the WebToApp Module Market
59
68%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Passed
No findings from the security scan
Fix and improve this skill with Tessl
tessl review fix ./app/src/main/assets/skills/module-js/SKILL.mdYou produce a community module for the WebToApp Module Market. The runtime wraps your main.js in an IIFE before injection.
module.json ← manifest (id, name, version, runAt, urlMatches, permissions, configItems)
main.js ← code that runs inside the page
style.css ← optional, auto-injected when hasCss=true in registrymodule.json schema (minimal){
"id": "kebab-globally-unique-id",
"name": "Display Name",
"description": "One paragraph",
"icon": "auto_awesome",
"category": "FUNCTION_ENHANCE",
"tags": ["dark-mode", "reading"],
"version": { "code": 1, "name": "1.0.0", "changelog": "Initial release" },
"author": { "name": "<user>", "url": "https://github.com/<user>" },
"runAt": "DOCUMENT_END",
"urlMatches": [ { "pattern": "*", "isRegex": false, "exclude": false } ],
"permissions": ["DOM_ACCESS", "CSS_INJECT"],
"configItems": []
}main.js contractreturn at top level.__MODULE_INFO__, __MODULE_CONFIG__, __MODULE_UI_CONFIG__, __MODULE_RUN_MODE__, __MODULE_PANEL_HTML__, getConfig(key, defaultValue).If your module shows a panel UI when the user taps its FAB button:
style.css using wta- prefixed class names. Use var(--wta-*) CSS variables for colors (e.g. var(--wta-on-surface, #1f2937)) to support both light and dark themes.panelHtml in module.json to a static HTML string with CSS classes and data-wta-action attributes. No inline style="" attributes.window.__wta_module_action_<name> = function(arg) { ... }; in main.js.data-wta-action="<name>" clicks to your action functions automatically via event delegation.module.json additions for interactive modules{
"panelHtml": "<div class=\"wta-mod-panel\"><button class=\"wta-mod-btn\" data-wta-action=\"doThing\">Do it</button></div>",
"cssCode": ".wta-mod-panel { padding: 16px; } .wta-mod-btn { ... }"
}style="..." in panelHtml — use CSS classes in cssCode instead.onclick="..." or other inline event handlers (CSP may block them). Use data-wta-action attributes.onAction unless your UI depends on runtime page analysis (e.g. detecting videos on the current page). For static UIs, panelHtml + cssCode is sufficient.id distinct from any existing module (use Glob to check).module.json first with sane defaults.main.js and keep it small — most modules are 30-150 lines.urlMatches carefully. * (= every URL) is invasive — use site-specific patterns when possible.style.css AND set hasCss: true in the registry entry.document.cookie or auth tokens unless declared in permissions and absolutely needed.==UserScript==); for that, use module-userscript instead.chrome.* APIs; for that, use module-chrome-mv3.You are a long-running coding partner, not a one-shot generator. Do not try to deliver a finished module in one turn — the user keeps steering. After each Write / Edit / round of changes, summarise in one short line what just happened (e.g. "Added the dark-mode toggle") and stop. Wait for the user to say what is next.
If the user wants to install or share the module, tell them to tap the save icon in the workspace top bar — the host parses your module.json / manifest.json / .user.js and adds the result to the Extension Modules list. Do not try to install it yourself, and do not write extra files to fake it.
User request: ${ARGUMENTS}
fc7af6a
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.