Vite Proxy Folder Name Conflict
divinevideo/divine-mobile
Fix 404 errors for frontend JS files when using Vite proxy. An agent skill from divinevideo/divine-mobile.
A skill your agent uses when creating Gea applications, components, stores, routes, SSR entry points, JSX templates, or working with Gea reactivity and DOM patching.
$ npx skills add dashersw/gea --skill gea-framework -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install dashersw/gea gea-framework --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/dashersw/gea.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.cursor/skills/gea-framework .claude/skills/gea-framework && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "gea-framework" agent skill from https://github.com/dashersw/gea/tree/main/.cursor/skills/gea-framework into .claude/skills/gea-framework/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "gea-framework", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/dashersw/gea/tree/main/.cursor/skills/gea-frameworkType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add dashersw/gea --skill gea-framework -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install dashersw/gea gea-framework --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/dashersw/gea.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.cursor/skills/gea-framework .agents/skills/gea-framework && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "gea-framework" agent skill from https://github.com/dashersw/gea/tree/main/.cursor/skills/gea-framework into .agents/skills/gea-framework/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "gea-framework", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add dashersw/gea --skill gea-framework -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install dashersw/gea gea-framework --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/dashersw/gea.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.cursor/skills/gea-framework .cursor/skills/gea-framework && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "gea-framework" agent skill from https://github.com/dashersw/gea/tree/main/.cursor/skills/gea-framework into .cursor/skills/gea-framework/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "gea-framework", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/dashersw/gea.git --path .cursor/skills/gea-framework--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add dashersw/gea --skill gea-framework -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install dashersw/gea gea-framework --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/dashersw/gea.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.cursor/skills/gea-framework .gemini/skills/gea-framework && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "gea-framework" agent skill from https://github.com/dashersw/gea/tree/main/.cursor/skills/gea-framework into .gemini/skills/gea-framework/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "gea-framework", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install dashersw/gea gea-frameworkInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add dashersw/gea --skill gea-framework -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/dashersw/gea.git skills-src && mkdir -p .github/skills && cp -r skills-src/.cursor/skills/gea-framework .github/skills/gea-framework && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "gea-framework" agent skill from https://github.com/dashersw/gea/tree/main/.cursor/skills/gea-framework into .github/skills/gea-framework/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "gea-framework", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add dashersw/gea --skill gea-framework -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install dashersw/gea gea-framework --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/dashersw/gea.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.cursor/skills/gea-framework .opencode/skills/gea-framework && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "gea-framework" agent skill from https://github.com/dashersw/gea/tree/main/.cursor/skills/gea-framework into .opencode/skills/gea-framework/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "gea-framework", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
gea-frameworkA skill your agent uses when creating Gea applications, components, stores, routes, SSR entry points, JSX templates, or working with Gea reactivity and DOM patching.
Gea Framework is an agent skill from dashersw/gea. Use when creating Gea applications, components, stores, routes, SSR entry points, JSX templates, or working with Gea reactivity and DOM patching.
Its SKILL.md is about 4.8k tokens, which your agent loads only when the skill is triggered. The skill folder holds 1 other file (for example `reference.md`).
It sits in Frontend & Design, covering React components. It works with JavaScript and Vite. The repository describes itself as: A batteries-included, reactive JavaScript UI framework. No virtual DOM. Compile-time JSX transforms. Proxy-based stores. Surgical DOM patching. The licence is MIT.
Read from SKILL.md and the folder at commit 51da237. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
npmFrom the folder's file list and the shell code blocks in SKILL.md.
Links to these hosts (documentation or services it may open):
npmjs.comFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Gea Framework loads about 4.8k tokens when it runs. Until then it costs about 40 tokens; SKILL.md has 1,514 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from dashersw/gea at commit 51da237, republished under its MIT licence (© dashersw). 1,514 words, ~4,835 tokens.
.claude/skills/gea-framework/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.Gea is a lightweight, reactive JavaScript UI framework built on the principle that JS code should be simple and understandable. It compiles JSX into efficient DOM operations at build time via a Vite plugin, uses proxy-based stores for state management, and employs event delegation for all user interactions. There is no virtual DOM — the Vite plugin analyzes your JSX templates and generates surgical DOM patches that update only the elements that depend on changed state.
Gea introduces no new programming concepts. There are no signals, no hooks, no dependency arrays, and no framework-specific primitives. Stores are classes with state and methods. Components are classes with a template() method or plain functions. Computed values are getters. The compile-time Vite plugin is the only "magic" — it analyzes ordinary JavaScript and wires up reactivity invisibly, so you write regular OOP/functional code that is fully reactive under the hood.
Read reference.md in this skill directory for the full API surface and detailed examples.
A Store holds shared application state. Extend the Store class, declare reactive properties as class fields, and add methods that mutate them. The store instance is wrapped in a deep Proxy that tracks every property change and batches notifications via queueMicrotask.
import { Store } from '@geajs/core'
class CounterStore extends Store {
count = 0
increment() {
this.count++
}
decrement() {
this.count--
}
}
export default new CounterStore()Key rules:
export default new MyStore()), not the class.this.count++ triggers reactivity automatically.push, pop, splice, sort, reverse, shift, unshift) are intercepted and produce fine-grained change events.append operation.Gea has two component styles. Both compile to the same internal representation.
Extend Component and implement a template(props) method that returns JSX. Class components can hold their own reactive properties — use them when you need local, transient UI state.
import { Component } from '@geajs/core'
export default class Counter extends Component {
count = 0
increment() { this.count++ }
decrement() { this.count-- }
template() {
return (
<div class="counter">
<span>{this.count}</span>
<button click={this.increment}>+</button>
<button click={this.decrement}>-</button>
</div>
)
}
}Event handlers accept both method references (click={this.increment}) and arrow functions (click={() => this.increment()}). Use method references for simple forwarding; use arrow functions when passing arguments or composing logic.
Use class components when you need local component state or lifecycle hooks.
Export a default function that receives props and returns JSX. The Vite plugin converts it to a class component internally.
export default function Greeting({ name }) {
return <h1>Hello, {name}!</h1>
}Use function components for stateless, presentational UI.
Props follow JavaScript's native value semantics:
No emit, no v-model, no callback props needed for object/array mutations. Deep nesting works the same way — as long as the same reference is passed down, reactivity propagates across the entire tree.
| Concern | Where it lives | When to use |
|---|---|---|
| Shared app data (todos, user, cart) | Store | Data accessed by multiple components or persisted across navigation |
| Derived / computed values | Store getters | Values calculated from store state |
| Local, transient UI state (editing mode, hover) | Component properties | Ephemeral state that no other component needs |
A class component can have both local state and read from external stores:
export default class TodoItem extends Component {
editing = false
editText = ''
template({ todo, onToggle, onRemove }) {
const { editing, editText } = this
return (
<li class={`todo-item ${editing ? 'editing' : ''}`}>
<span dblclick={this.startEditing}>{todo.text}</span>
{/* ... */}
</li>
)
}
}Split state into domain-specific stores. Each store is an independent singleton.
flight-store.ts → step, boardingPass
options-store.ts → luggage, seat, meal
payment-store.ts → passengerName, cardNumber, paymentCompleteStores can import and call each other:
class FlightStore extends Store {
startOver(): void {
this.step = 1
optionsStore.reset()
paymentStore.reset()
}
}A root component reads from all relevant stores and passes data down as props:
export default class App extends Component {
template() {
const { step } = flightStore
const { luggage } = optionsStore
return <div>{step === 1 && <OptionStep selectedId={luggage} onSelect={id => optionsStore.setLuggage(id)} />}</div>
}
}Gea includes a built-in client-side router. The router is a Store that reactively tracks path, params, query, and hash. Define routes with setRoutes or createRouter.
Create a bare Router in router.ts. Keep this file free of view imports to avoid circular dependencies (views import router, so router.ts must not import views).
// src/router.ts
import { Router } from '@geajs/core'
export const router = new Router()Set routes in App.tsx where both the router and view components are available:
// src/App.tsx
import { Component, Outlet } from '@geajs/core'
import { router } from './router'
import AppShell from './views/AppShell'
import Home from './views/Home'
import About from './views/About'
import UserProfile from './views/UserProfile'
import NotFound from './views/NotFound'
router.setRoutes({
'/': {
layout: AppShell,
children: {
'/': Home,
'/about': About,
'/users/:id': UserProfile,
},
},
'*': NotFound,
})
export default class App extends Component {
template() {
return <Outlet />
}
}Layouts receive the resolved child as a page prop:
export default class AppShell extends Component {
template({ page }: any) {
return (
<div class="app">
<nav>
<Link to="/" label="Home" />
<Link to="/about" label="About" />
</nav>
<main>{page}</main>
</div>
)
}
}For simple apps without layouts/guards (no circular dependency risk), you can use createRouter directly in router.ts and render with <RouterView router={router} />:
import { createRouter } from '@geajs/core'
import Home from './views/Home'
import About from './views/About'
export const router = createRouter({
'/': Home,
'/about': About,
} as const)import { Component, RouterView } from '@geajs/core'
import { router } from './router'
export default class App extends Component {
template() {
return <RouterView router={router} />
}
}Guards are synchronous functions on route groups that control access. A guard returns:
true — proceed to the routestring — redirect to that pathComponent — render it instead of the routeimport authStore from './stores/auth-store'
const AuthGuard = () => {
if (authStore.isAuthenticated) return true
return '/login'
}
router.setRoutes({
'/login': Login,
'/': {
layout: AppShell,
guard: AuthGuard,
children: {
'/dashboard': Dashboard,
'/settings': Settings,
},
},
})Guards on nested groups stack parent → child. Guards are intentionally synchronous — they check store state, not async APIs. For async checks, use created() in the component.
/about/users/:id — extracted as { id: '42' }* — matches any unmatched path'/old': '/new' — string values trigger a redirect'/admin': () => import('./views/Admin') — code-split route componentsRenders an <a> tag that navigates with history.pushState. Modifier keys (Cmd/Ctrl+click) open in a new tab. Active links receive data-active and an active class; pass exact to require an exact path match.
<Link to="/about" label="About" class="nav-link" />import { router } from './router'
router.push('/about') // pushState
router.navigate('/about') // alias for push
router.replace('/login') // replaceState
router.back()
router.forward()
router.go(-2)Function components receive matched params as props:
export default function UserProfile({ id }) {
return <h1>User {id}</h1>
}Class components receive them via created(props) and template(props). Route params are also available on router.params.
router.isActive('/dashboard') // true if path starts with /dashboard
router.isExact('/dashboard') // true only for exact matchUse matchRoute for manual route matching:
import { matchRoute } from '@geajs/core'
const result = matchRoute('/users/:id', '/users/42')
// { path: '/users/42', pattern: '/users/:id', params: { id: '42' } }RouterView renders the current route. Use it with a router prop for createRouter setups, or with an inline routes array for quick prototypes:
// With createRouter (recommended)
<RouterView router={router} />
// With inline routes (uses the singleton router)
<RouterView routes={[
{ path: '/', component: Home },
{ path: '/about', component: About },
{ path: '/users/:id', component: UserProfile },
]} />Gea JSX differs from React JSX in several ways:
| Feature | Gea | React |
|---|---|---|
| CSS classes | class="foo" | className="foo" |
| Event handlers | click={fn} or onClick={fn} | onClick={fn}, onInput={fn}, onChange={fn} |
| Checked inputs | checked={bool} + change={fn} | checked={bool} + onChange={fn} |
| Conditional render | {cond && <Child />} | Same |
| Lists with keys | {arr.map(item => <Item key={item.id} />)} | Same |
| Dynamic classes | class={`btn ${active ? 'on' : ''}`} | Same (with className) |
Both native-style (click, change) and React-style (onClick, onChange) event attribute names are supported. Native-style is preferred by convention.
Supported event attributes include mouse, keyboard, form, drag, touch, pointer, wheel, scroll, animation, and transition events: click, dblclick, input, change, submit, keydown, keyup, blur, focus, pointerdown, pointerup, pointermove, touchstart, touchmove, touchend, wheel, scroll, dragstart, dragend, dragover, dragleave, drop, animationstart, animationend, transitionstart, transitionend, and related variants.
With @geajs/mobile: tap, longTap, swipeRight, swipeUp, swipeLeft, swipeDown.
Gea supports React-style inline style objects. The compiler converts static style objects to CSS strings at build time and generates runtime conversion for dynamic values:
// Static — compiled to a CSS string at build time (zero runtime cost)
<div style={{ backgroundColor: 'red', fontSize: '14px', fontWeight: 'bold' }}>
Styled content
</div>
// Dynamic — converted to cssText at runtime
<div style={{ color: this.textColor, opacity: this.isVisible ? 1 : 0 }}>
Dynamic styling
</div>
// String styles still work (passed through as-is)
<div style={`width:${this.width}px`}>Sized content</div>CSS property names use camelCase (like React). The compiler converts them to kebab-case: backgroundColor → background-color, fontSize → font-size.
ref AttributeUse ref to get a direct reference to a DOM element after render:
export default class Canvas extends Component {
canvasEl = null
template() {
return (
<div class="canvas-wrapper">
<canvas ref={this.canvasEl} width="800" height="600"></canvas>
</div>
)
}
onAfterRender() {
const ctx = this.canvasEl.getContext('2d')
ctx.fillRect(0, 0, 100, 100)
}
}The compiler emits a direct assignment that sets the component property to the DOM element after the template is cloned. Multiple refs on different elements are supported.
The Gea compiler throws clear errors for JSX patterns it cannot compile. These are caught at build time, not at runtime:
| Pattern | Error | Fix |
|---|---|---|
<{DynamicTag} /> | Dynamic component tags not supported | Use conditional rendering ({isA ? <A /> : <B />}) |
{() => <div />} | Function-as-child not supported | Use render props with named attributes instead |
export function Foo() { return <div /> } | Named JSX component exports not supported | Use export default function |
<>{items.map(...)}</> | Fragments as .map() item roots not supported | Wrap each item in a single root element |
Spreading onto a component tag (<Comp {...props} />) is not supported yet, and it raises no error: the compiler drops the spread, so the component receives none of those props (#198). Pass the props individually.
import MyApp from './my-app.jsx'
const app = new MyApp()
app.render(document.getElementById('app'))Components are instantiated with new, then .render(parentEl) inserts them into the DOM.
The @geajs/mobile package extends Gea with mobile-oriented UI primitives:
Component that renders to document.body by default.tap, longTap, swipeRight, swipeLeft, swipeUp, swipeDown events.import { View, ViewManager } from '@geajs/mobile'
class HomeView extends View {
template() {
return (
<view>
<h1>Home</h1>
</view>
)
}
onActivation() {
/* called when view enters viewport */
}
}
const vm = new ViewManager()
const home = new HomeView()
vm.setCurrentView(home)npm create gea@latest my-app
cd my-app
npm install
npm run devThe create-gea package scaffolds a Vite project with TypeScript, a sample store, class and function components, and the Vite plugin pre-configured.
// vite.config.js
import { defineConfig } from 'vite'
import { geaPlugin } from '@geajs/vite-plugin'
export default defineConfig({
plugins: [geaPlugin()]
})The @geajs/vite-plugin Vite plugin handles JSX transformation, reactivity wiring, event delegation generation, and HMR.
@geajs/ssr provides server rendering and hydration for Gea apps. Use handleRequest(App, options) for Fetch-style request handlers, hydrate(App, element, { storeRegistry }) on the client, and geaSSR() in Vite for development middleware. SSR can serialize registered stores, resolve route configs on the server, stream HTML, and inject head tags.
// server.ts
import { handleRequest } from '@geajs/ssr'
import App from './src/App'
import store from './src/store'
export default handleRequest(App, {
storeRegistry: { AppStore: store },
})// src/main.ts
import { hydrate } from '@geajs/ssr/client'
import App from './App'
import store from './store'
hydrate(App, document.getElementById('app'), {
storeRegistry: { AppStore: store },
})@geajs/ui is a Tailwind-styled, Zag.js-powered component library for Gea. It provides ~35 ready-to-use components: simple styled primitives (Button, Card, Input) and behavior-rich interactive widgets (Select, Dialog, Tabs, Toast). For full usage instructions, component API, and examples, see the gea-ui-components skill in skills/gea-ui-components/.
| Package | npm | Description |
|---|---|---|
@geajs/core | npm | Core framework — stores, components, reactivity, DOM patching |
@geajs/ui | npm | Tailwind + Zag.js component library — Button, Select, Dialog, Tabs, Toast, etc. |
@geajs/mobile | npm | Mobile UI primitives — views, navigation, gestures, layout |
@geajs/vite-plugin | npm | Vite plugin — JSX transform, reactivity wiring, HMR |
@geajs/ssr | npm | Server-side rendering, hydration, streaming, store serialization, Vite SSR middleware |
create-gea | npm | Project scaffolder (npm create gea@latest) |
gea-tools | — | VS Code / Cursor extension for Gea JSX code intelligence |
The gea-tools extension (in packages/gea-tools) provides:
click, input, change, etc.)Full documentation is in the docs/ directory of the repository, structured for GitBook:
© dashersw, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 1 other file in .cursor/skills/gea-framework of dashersw/gea.
Open the folder on GitHubat commit 51da237
Gea Framework next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Gea Framework this skilldashersw/gea | 1.3k | — | ~4.8k | Automated safety check: Pass | MIT | |
| Vite Proxy Folder Name Conflictdivinevideo/divine-mobile | 265 | — | ~1.3k | Automated safety check: Pass | MPL-2.0 | |
| Web Artifacts Builderanthropics/skills | 180k | 40 repos | ~769 | Automated safety check: Pass | Apache-2.0 | |
| Tailwindcss Developmentanonaddy/anonaddy | 4.9k | 10 repos | ~865 | Automated safety check: Pass | MIT | |
| React Router Developmentremix-run/react-router | 57k | 1 repos | ~1.5k | Automated safety check: Pass | MIT | |
| Chakra UI v3 Builderchakra-ui/chakra-ui | 41k | — | ~3.1k | Automated safety check: Pass | MIT |
divinevideo/divine-mobile
Fix 404 errors for frontend JS files when using Vite proxy. An agent skill from divinevideo/divine-mobile.
anthropics/skills
Builds multi-component claude.ai HTML artifacts as a small React, TypeScript and Tailwind project, then bundles it into one shareable HTML file.
anonaddy/anonaddy
Always invoke when the user's message includes 'tailwind' in any form.
remix-run/react-router
Guides work on React Router apps by first identifying whether the app uses Framework, Data or Declarative mode, then loading the matching reference and the installed package docs.
chakra-ui/chakra-ui
Builds responsive, accessible Chakra UI v3 components and layouts, sets up Chakra in new or existing projects, and designs themes with tokens, semantic tokens and recipes.
creativetimofficial/ui
Helps install, generate and review Creative Tim UI blocks: shadcn/ui-based React and Tailwind sections that follow a restrained, production-minded design philosophy.
dashersw/gea
Guide for using @geajs/ui — a Tailwind-styled, Zag.js-powered component library for the Gea framework.
dashersw/gea
Rebuild the website playground browser bundles after changing @geajs/core or @geajs/vite-plugin source.
dashersw/gea
Step-by-step guide for migrating React applications to Gea — covering project setup, component conversion, state management, routing, styling, and known pitfalls.
Works with
Categories
A skill your agent uses when creating Gea applications, components, stores, routes, SSR entry points, JSX templates, or working with Gea reactivity and DOM patching. Gea Framework is an agent skill from dashersw/gea. Use when creating Gea applications, components, stores, routes, SSR entry points, JSX templates, or working with Gea reactivity and DOM patching.
Gea Framework fits situations like: creating Gea applications; SSR entry points; working with Gea reactivity and DOM patching.
Run `npx skills add dashersw/gea --skill gea-framework -a claude-code`. Or copy the skill folder (.cursor/skills/gea-framework in dashersw/gea) into .claude/skills/gea-framework in your project. Claude Code loads it when a task matches its description.
Run `npx skills add dashersw/gea --skill gea-framework -a codex`. Or copy the skill folder (.cursor/skills/gea-framework in dashersw/gea) into .agents/skills/gea-framework in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add dashersw/gea --skill gea-framework -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/gea-framework, .gemini/skills/gea-framework, .github/skills/gea-framework and .opencode/skills/gea-framework in your project.
Going by SKILL.md and its folder, Gea Framework needs the command-line tools its instructions call (npm).
SKILL.md names 1 domain. As links in the text: npmjs.com. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Gea Framework is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 4.8k tokens (SKILL.md is roughly 19k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Gea Framework: Vite Proxy Folder Name Conflict (divinevideo/divine-mobile, 265 stars), Web Artifacts Builder (anthropics/skills, 180k stars), Tailwindcss Development (anonaddy/anonaddy, 4.9k stars) and React Router Development (remix-run/react-router, 57k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
dashersw (a GitHub user) maintains it in dashersw/gea, which has 1,257 GitHub stars. The repository holds 4 skills in this directory. The repository was last updated on September 30, 2026.
Source: dashersw/gea on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.