.agents/skills/solidjs-patterns/SKILL.md
SolidJS and SolidStart performance and correctness guidelines for AI agents. This skill should be used when writing, reviewing, or refactoring SolidJS/SolidStart code to ensure correct reactivity patterns and optimal performance. Triggers on tasks involving SolidJS components, signals, stores, Solid Query, SolidStart server functions, routing, or fine-grained reactivity.
npx skillsauth add omniaura/omniclaw solidjs-patternsInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Comprehensive correctness and performance guide for SolidJS and SolidStart applications, maintained by OmniAura. Contains 49 rules across 9 categories, prioritized by impact to guide automated refactoring and code generation. Built from production experience migrating from React to SolidJS.
Reference these guidelines when:
| Priority | Category | Impact | Prefix |
| -------- | ------------------------ | ----------- | ------------- |
| 1 | Reactivity Correctness | CRITICAL | reactivity- |
| 2 | Data Fetching & Server | CRITICAL | data- |
| 3 | Component Patterns | HIGH | component- |
| 4 | State Management | HIGH | state- |
| 5 | Rendering & Control Flow | MEDIUM-HIGH | rendering- |
| 6 | SolidStart Patterns | MEDIUM-HIGH | start- |
| 7 | Performance Optimization | MEDIUM | perf- |
| 8 | Testing | LOW-MEDIUM | testing- |
| 9 | External Interop | LOW | interop- |
reactivity-no-destructure-props - Never destructure props — breaks reactivityreactivity-no-helper-access - Access signals/stores directly in JSX, not via helpersreactivity-no-set-map-signal - Use store instead of Set/Map with signal for collectionsreactivity-no-rest-spread - Use splitProps instead of rest spreadreactivity-signals-not-refs - Use signals for timing-sensitive state, not plain refsreactivity-no-direct-mutation - Never mutate store values directlyreactivity-no-effect-order - Don't assume effect execution orderreactivity-cleanup-effects - Always clean up effects with onCleanupreactivity-on-explicit-tracking - Use on() to break circular dependenciesreactivity-create-deferred - Use createDeferred for expensive computations on rapid inputreactivity-create-reaction - Use createReaction to separate tracking from side effectsreactivity-no-signal-capture - Don't capture signals in closures outside reactive contextdata-no-destructure-query - Never destructure Solid Query resultsdata-parallel-queries - Don't create query waterfallsdata-guard-suspense - Guard .data access to prevent unwanted Suspensedata-include-all-query-keys - Include all dependencies in query keysdata-query-options-function - Wrap query options in arrow functiondata-mutation-invalidation - Invalidate queries after mutationscomponent-no-early-return - Don't return early before reactive primitivescomponent-merge-props - Use mergeProps for reactive default valuescomponent-split-props - Use splitProps to separate and forward propsstate-signal-vs-store - Choose signal vs store based on update granularitystate-context-pattern - Use typed context with store for global statestate-reconcile-async - Use reconcile for fine-grained async updatesstate-produce-complex-mutations - Use produce() for complex store mutationsstate-form-store - Use createStore for multi-field form staterendering-use-for-not-map - Use <For> instead of .map() for listsrendering-use-show-not-ternary - Use <Show> instead of JSX conditionalsrendering-suspense-inside-show - Place Suspense inside conditionals (LazyShow pattern)rendering-use-switch-match - Use Switch/Match for multi-branch conditionalsrendering-error-boundary - Wrap risky components in ErrorBoundaryrendering-index-vs-for - Choose between For and Index based on what changesstart-use-server-validation - Always validate "use server" function inputsstart-createasync-not-resource - Use createAsync + query() for data loadingstart-route-preloading - Always define route preload functionsperf-lazy-load-heavy-components - Lazy load heavy componentsperf-create-selector - Use createSelector for single-selection in large listsperf-memo-expensive - Use createMemo for expensive derived computationsperf-route-code-splitting - Use lazy() for route-level code splittingperf-skeleton-suspense - Use skeleton components for Suspense fallbacksperf-use-transition - Use useTransition for non-blocking async updatesperf-render-effect - Use createRenderEffect for synchronous DOM measurementstesting-createroot - Wrap reactive test code in createRoottesting-render-components - Use render() and Testing Library for component teststesting-render-hook - Use renderHook for testing custom hookstesting-async-waitfor - Use waitFor for async component testingtesting-mock-hoisted - Use vi.hoisted with vi.mock for proper mock hoistinginterop-from-browser-apis - Use from() to bridge browser APIs into reactive signalsinterop-observable-export - Use observable() to expose signals to external librariesRead individual rule files for detailed explanations and code examples:
rules/reactivity-no-destructure-props.md
rules/data-parallel-queries.md
rules/start-use-server-validation.md
Each rule file contains:
For the complete guide with all rules expanded: AGENTS.md
The following files contain additional detailed patterns and are being migrated into individual rules:
reactivity.md - Reactivity fundamentalsexplicit-tracking.md - on() and untrack() patternsstate-patterns.md - State management patternsanti-patterns.md - Common anti-patternsadvanced-primitives.md - Secondary primitivesexternal-interop.md - from() and observable() patternssolid-query.md - Solid Query patternsperformance.md - Performance optimizationtesting.md - Testing patternstools
Manage stacked pull requests using Graphite CLI. Create, submit, and restack PR chains.
tools
Full GitHub operations via `gh` CLI — pull requests, issues, code review, CI/CD, search, and GraphQL API. Use for any GitHub interaction beyond basic git.
development
Browse the web for any task — research topics, read articles, interact with web apps, fill forms, take screenshots, extract data, and test web pages. Use whenever a browser would be useful, not just when the user explicitly asks.
testing
X (Twitter) integration for OmniClaw. Post tweets, like, reply, retweet, and quote. Use for setup, testing, or troubleshooting X functionality. Triggers on "setup x", "x integration", "twitter", "post tweet", "tweet".