| name | Frontend Runtime |
| description | Editable frontend runtime rules for framework pages, stores, shared runtime namespaces, and reusable visual patterns. |
Use this skill when the task changes browser runtime behavior, framework-backed UI, store orchestration, shared helpers, or general frontend composition under app/.
Editable Scope
- You may edit
app/.
- Keep agent logic in the browser when possible.
- Treat
server/ as read-only infrastructure from this skill set.
Where First-Party Frontend Code Lives
- Repo-owned first-party frontend code should normally live under
app/L0/_all/mod/_core/....
- New shared browser-runtime helpers belong in
_core/framework/ only when multiple modules genuinely need them.
- New shared UI primitives belong in
_core/visual/.
- Do not place durable repo-owned first-party features directly into
L1 or L2.
Framework Boot And Runtime
- Framework-backed pages boot through
/mod/_core/framework/js/initFw.js.
- The runtime installs onto
globalThis.space.
initFw.js runs the extensible framework bootstrap step at _core/framework/initializer.js/initialize before Alpine startup.
- Framework bootstrap also creates
_core/framework/head/end in document.head for declarative head-side tags or inline bootstraps.
- Use
_core/framework/head/end when the setup can stay declarative, and use _core/framework/initializer.js/initialize/end when the setup must stay imperative instead of editing page shells.
- Framework-backed pages centrally handle same-origin
/ and /admin opens through normal target="_blank" link clicks and window.open(..., "_blank") by granting the child window the current tab's /enter access marker before navigation; context-menu, middle-click, and modifier-key browser opens stay unmodified and still route through /enter.
- Current shared runtime surface includes:
space.api
space.config
space.chat when the current agent surface publishes the active thread snapshot
space.fw.createStore
space.utils.markdown.render(text, target)
space.utils.markdown.parseDocument
space.utils.yaml.parse and space.utils.yaml.stringify
space.proxy
space.download
space.fetchExternal(...)
space.browser for registered browser-surface control; load the top-level browser-control skill for the detailed method list and browser-frame bridge usage
Use <x-browser src="https://example.com"></x-browser> when frontend UI, pages, or widgets need to embed a live browser surface directly in their DOM. Add controls="true" when that surface should render its own address bar and navigation controls; omit it or set controls="false" for a frameless embedded browser. Authored <x-browser> elements register with space.browser automatically, so agents can discover, inspect, navigate, and interact with them the same way they use stand-alone browser windows.
External browser fetches under the framework should try direct fetch(...) first and only fall back to /api/proxy after a failed cross-origin attempt; when that fallback succeeds, the runtime keeps an in-memory origin cache so later requests to the same origin go through the backend immediately for the rest of the page lifetime.
Do not hardcode third-party CORS proxy services such as allorigins, corsproxy, or codetabs in frontend code or widget renderers. For external HTTP reads, use plain fetch(externalUrl) or space.fetchExternal(externalUrl) and let the runtime handle /api/proxy fallback automatically. Use space.proxy.buildUrl(...) only when you need a same-origin proxied URL string for a non-fetch consumer such as an element attribute or link target.
space.utils.markdown.render(...) is the shared browser markdown wrapper. It inserts a .markdown root so the owning feature can style rendered markdown predictably.
space.api includes attachment-style helpers such as space.api.folderDownloadUrl(pathOrOptions) when a feature needs a same-origin download URL instead of a fetched blob.
Store Pattern
- Create stores with
space.fw.createStore(name, model).
- Use
init() for one-time startup and mount(refs) or unmount() for DOM-bound lifecycle.
- Component HTML owns structure and Alpine bindings.
- Stores own state, persistence, async work, and API orchestration.
- Small utilities own parsing, transforms, and rendering helpers that would make the store too dense.
- Pass DOM refs explicitly with
x-ref; do not scan the document when direct refs will do.
Visual And Composition Rules
- Reuse
_core/visual before inventing feature-local chrome, dialogs, menus, or conversation patterns.
- Keep page shells thin and static; mount real features through modules.
- If a helper or style pattern repeats across features, move it into a clearly shared owner.
- Keep the browser runtime deliberate and readable, not overloaded with one-off patterns.
Promotion Rules
- If a contract is used by only one module, keep it in that module.
- If multiple modules need the same runtime helper, move it into
_core/framework.
- If multiple modules share a presentation pattern, move it into
_core/visual.
Mandatory Doc Follow-Up
- When framework runtime, shared namespaces, bootstrap order, or reusable frontend primitives change, update the owning
AGENTS.md files and the development skill subtree in the same session.