Use this skill when the task needs ext/html/, ext/js/, x-extension, x-component, x-context, or layered override behavior.
HTML Extension Rules
- Declare structural seams with
<x-extension id="some/path">. - Matching HTML files live at
mod/<author>/<repo>/ext/html/some/path/*.html. - HTML callers name only the seam; the runtime resolves
ext/html/automatically. - Keep extension files thin. They should usually mount a real component with
<x-component path="/mod/...">. _core/frameworkalso creates_core/framework/head/endindocument.headduring bootstrap when a layer needs head-side HTML or inline bootstrap code without editing page shells.- Use framework
x-inject="selector"instead of raw Alpinex-teleportwhen route-owned markup targets a shell seam that may mount later; it mirrors teleport semantics for<template>roots, waits for the selector, and disconnects its observer when the source template unmounts. - Dynamic discovery watches the whole document tree, so
headseams and thex-componentnodes they insert are loaded the same way as body content. - The routed shell header owns Home itself and points it at the empty route
#/;_core/onscreen_menu/bar_startand_core/onscreen_menu/bar_endare the left and right shell-control seams, and feature modules add non-Home dropdown menu-action buttons under_core/onscreen_menu/itemswith numericdata-ordervalues such as100,200,300, and400;_core/onscreen_menusorts contributed controls or items automatically and keeps only the auth exit action after the dropdown seam.
Example:
html<x-extension id="page/router/overlay/end"></x-extension>
html<x-component path="/mod/_core/onscreen_agent/panel.html"></x-component>
JS Hook Rules
- Use
space.extend(import.meta, async function name(...) { ... })for behavioral seams. - JS hook files live at
mod/<author>/<repo>/ext/js/<extension-point>/*.jsor*.mjs. - The runtime resolves
/startand/endhooks around the wrapped function automatically. space.extend()requires a valid module ref and a standalone named function or explicit extension point name.- Framework-backed pages expose
_core/framework/initializer.js/initialize; use_core/framework/head/endwhen the work can stay declarative, and keep the initializer/endhook for once-per-page shell setup that must stay imperative. - If a feature needs onscreen-agent-specific prompt shaping or execution validation for its own helpers, add an
ext/js/_core/onscreen_agent/...hook from that feature instead of editing_core/onscreen_agentdirectly.
Extension Metadata Rules
- Modules may also store lightweight metadata assets under other
ext/folders when those files should follow the same readable-layer permissions and same-path override rules as HTML and JS extensions. - The current first-party example is
ext/panels/*.yaml, which the dashboard panel index discovers throughfile_paths, batch-reads throughfileRead(...), and collapses to one effective manifest permodulePath + manifestName. - Keep those metadata files display-oriented. They are extension-resolved module assets, not general writable storage.
Component Loader Rules
<x-component>may load a full HTML document or a fragment.- The loader mounts styles, module scripts, and body nodes, then recursively resolves nested
<x-component>tags. - Concurrent scans of the same
<x-component>target reuse the in-flight load; they must not bail out in a way that leaves late-mounted components partially hydrated. - Mutation-driven
x-componentdiscovery watchesdocument.documentElement, not onlybody, so head-side components hydrate too. - Keep component HTML declarative and bind behavior through stores.
- Import the owning store module in the component that owns the feature, not in an unrelated parent shell.
Context Helper Rules
- Framework bootstrap also injects one hidden runtime
<x-context>withdata-runtime="browser"on normal web sessions ordata-runtime="app"in the packaged desktop runtime; packaged app routes derive that from the desktop bridge before falling back to launcher runtime info or frontend config, and that same element also exposesruntime-browserorruntime-appthroughdata-tags. - Modules may export additional live skill-filter tags with hidden
<x-context>elements anywhere in mounted DOM. - Set one or more tags with
data-tags="a, b, c". - Alpine-bound attributes on
<x-context>are the normal way to keep tags synced with route or store state. - Import
/mod/_core/framework/js/context.jswhen code needs to inspect current<x-context>elements directly; the stable helpers aregetContexts(...),getAttributeValues(...),getTags(...), andgetContents(...). - Shared skill discovery reads those tags through that framework helper each time it builds the catalog, auto-loaded skill context, or an explicit skill load.
Layered Override Behavior
- Module and extension resolution follow the readable
L0 -> L1 -> L2inheritance chain. - Identical module-relative extension file paths override lower-ranked entries.
- Different filenames under the same extension point compose together.
- Prefer additive composition before exact-path replacement.
maxLayerconstrains module and extension resolution but not logical app-file paths.- Uncached HTML
<x-extension>lookups batch before they call/api/extensions_load; the default flush is the next animation frame, and frontend constantHTML_EXTENSIONS_LOAD_BATCH_WAIT_MSinapp/L0/_all/mod/_core/framework/js/extensions.jsadds an extra wait window in milliseconds before that frame-aligned flush. extensions_loadkeepsmaxLayerat the call level; grouped lookups send orderedpatternsarrays and receive ordered results with matchingpatternsplus resolvedextensions.- JS hook lookups do not use that wait window; they resolve immediately because hook callers await them directly.
Practical Guidance
- Add a new seam in the owner when downstream customization is realistic.
- Do not bypass an existing seam by reaching into another module's private DOM or internals.
- After adding a new
ext/html/...orext/js/...file, the running page often needs a refresh before discovery catches up.
Mandatory Doc Follow-Up
- If extension lookup, component loading, hook behavior, or override semantics change, update the framework docs and the
developmentskill subtree in the same session.

