React Dev
davila7/claude-code-templates
This skill should be used when building React components with TypeScript, typing hooks, handling events, or when React TypeScript, React 19, Server Components are mentioned.
Maintain element type comparison safety in remix-forms. An agent skill from seasonedcc/remix-forms.
$ npx skills add seasonedcc/remix-forms --skill safe-element-comparison -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install seasonedcc/remix-forms safe-element-comparison --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/seasonedcc/remix-forms.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/safe-element-comparison .claude/skills/safe-element-comparison && 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 "safe-element-comparison" agent skill from https://github.com/seasonedcc/remix-forms/tree/main/.claude/skills/safe-element-comparison into .claude/skills/safe-element-comparison/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "safe-element-comparison", 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/seasonedcc/remix-forms/tree/main/.claude/skills/safe-element-comparisonType 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 seasonedcc/remix-forms --skill safe-element-comparison -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install seasonedcc/remix-forms safe-element-comparison --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/seasonedcc/remix-forms.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/safe-element-comparison .agents/skills/safe-element-comparison && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "safe-element-comparison" agent skill from https://github.com/seasonedcc/remix-forms/tree/main/.claude/skills/safe-element-comparison into .agents/skills/safe-element-comparison/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "safe-element-comparison", 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 seasonedcc/remix-forms --skill safe-element-comparison -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install seasonedcc/remix-forms safe-element-comparison --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/seasonedcc/remix-forms.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/safe-element-comparison .cursor/skills/safe-element-comparison && 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 "safe-element-comparison" agent skill from https://github.com/seasonedcc/remix-forms/tree/main/.claude/skills/safe-element-comparison into .cursor/skills/safe-element-comparison/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "safe-element-comparison", 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/seasonedcc/remix-forms.git --path .claude/skills/safe-element-comparison--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 seasonedcc/remix-forms --skill safe-element-comparison -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install seasonedcc/remix-forms safe-element-comparison --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/seasonedcc/remix-forms.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/safe-element-comparison .gemini/skills/safe-element-comparison && 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 "safe-element-comparison" agent skill from https://github.com/seasonedcc/remix-forms/tree/main/.claude/skills/safe-element-comparison into .gemini/skills/safe-element-comparison/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "safe-element-comparison", 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 seasonedcc/remix-forms safe-element-comparisonInstalls 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 seasonedcc/remix-forms --skill safe-element-comparison -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/seasonedcc/remix-forms.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/safe-element-comparison .github/skills/safe-element-comparison && 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 "safe-element-comparison" agent skill from https://github.com/seasonedcc/remix-forms/tree/main/.claude/skills/safe-element-comparison into .github/skills/safe-element-comparison/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "safe-element-comparison", 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 seasonedcc/remix-forms --skill safe-element-comparison -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install seasonedcc/remix-forms safe-element-comparison --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/seasonedcc/remix-forms.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/safe-element-comparison .opencode/skills/safe-element-comparison && 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 "safe-element-comparison" agent skill from https://github.com/seasonedcc/remix-forms/tree/main/.claude/skills/safe-element-comparison into .opencode/skills/safe-element-comparison/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "safe-element-comparison", 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.
safe-element-comparisonMaintain element type comparison safety in remix-forms. An agent skill from seasonedcc/remix-forms.
Safe Element Comparison is an agent skill from seasonedcc/remix-forms. Maintain element type comparison safety in remix-forms. Use when modifying component mappings, adding new components to mapChildren, investigating unexpected HTML attributes or prop injection, writing docs about component customization, or responding to user issues about wrong elements receiving props.
Its SKILL.md is about 1.8k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Frontend & Design, covering React components. It works with React, React Router, Remix and TypeScript. The repository describes itself as: Full-stack forms for React Router. The licence is MIT.
4 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 7030d30. 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.
No scripts in the folder and no shell commands in SKILL.md.
From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From 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.
Safe Element Comparison loads about 1.8k tokens when it runs. Until then it costs about 82 tokens; SKILL.md has 863 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 seasonedcc/remix-forms at commit 7030d30, republished under its MIT licence (© seasonedcc). 863 words, ~1,805 tokens.
.claude/skills/safe-element-comparison/SKILL.md (or your agent's skills folder).remix-forms identifies components in JSX trees using child.type === Component. This pattern is central to how mapChildren injects props into the right elements. This skill covers the architecture, the rules for keeping it safe, and guidance for users.
mapChildren in children-traversal.ts recursively walks the React element tree returned by user render functions. Callback functions in create-field.tsx and schema-form.tsx compare child.type against component references to decide which props to inject.
React element types follow these rules:
<div> compiles to React.createElement('div') — type is the string 'div'<MyComponent /> compiles to React.createElement(MyComponent) — type is the function/object referenceReact.forwardRef(fn) returns a unique object — === comparison works reliably when defined at module scopeReact.cloneElement preserves .type exactlyIf a component reference were a string like 'div', then child.type === Component would match every <div> in the tree — not just the intended component. This is why all default components are React.forwardRef wrappers with unique object identity.
All default components are defined at module scope as React.forwardRef wrappers. Each renders its corresponding HTML element and nothing else. Components that render the same HTML tag (e.g. DefaultInput, DefaultCheckbox, DefaultRadio all render <input>) are separate objects with distinct identities.
| Default wrapper | Renders | Used as default for |
|---|---|---|
DefaultField | <div> | fieldComponent |
DefaultLabel | <label> | labelComponent |
DefaultInput | <input> | inputComponent |
DefaultMultiline | <textarea> | multilineComponent |
DefaultSelect | <select> | selectComponent |
DefaultCheckbox | <input> | checkboxComponent |
DefaultRadio | <input> | radioComponent |
DefaultRadioGroup | <fieldset> | radioGroupComponent |
DefaultRadioLabel | <label> | radioLabelComponent |
DefaultCheckboxLabel | <label> | checkboxLabelComponent |
DefaultFieldErrors | <div> | fieldErrorsComponent |
DefaultFieldError | <div> | errorComponent |
| Default wrapper | Renders | Used as default for |
|---|---|---|
DefaultFieldsWrapper | <div> | fieldsComponent |
DefaultGlobalErrors | <div> | globalErrorsComponent |
DefaultButton | <button> | buttonComponent |
DefaultFieldError is imported from create-field.tsx and reused as the default for errorComponent in SchemaForm.
Default* forwardRef wrapper at module scope in the appropriate file.child.type === in any mapChildren callback, write a test verifying plain HTML elements of the same tag are not affected.=== comparisons and causing React remounts.React.memo() — memo creates a new wrapper object; child.type === original silently fails.React.lazy() — lazy also creates a wrapper that doesn't match the inner component.=== and causes full remounts.When communicating with users about component customization:
=== comparison is safe because each component has a unique reference."div". The comparison becomes ambiguous — any element of that tag in the children function will be matched.If a user wraps a custom component in React.memo() before passing it, the comparison will fail silently — memo() creates a wrapper object that doesn't match the inner component. This is an inherent limitation of the child.type === pattern. Advise users to pass the unwrapped component.
SchemaForm (like inputComponent, labelComponent, etc.) are identified by reference equality in the JSX tree.renderField or SchemaForm children), any component received from the helpers object (e.g. Label, Input, Errors) has special identity that the library uses to inject the right props.When a user reports unexpected HTML attributes (e.g. role="alert" on a wrapper div, or name="..." on an unrelated input):
mapChildren runs and where false matches can occur.fieldErrorsComponent="div". This restores the ambiguity the defaults are designed to prevent.React.memo() — this causes false negatives (the component is NOT recognized, so it doesn't receive its intended props).mapChildren callbacks — verify that the child.type === comparison targets the correct variable and that the variable is a unique component reference.child.type === check, verify it follows the rules above.For each component compared in mapChildren, maintain a regression test that:
Existing tests live in create-field.test.tsx (describe block: "element type comparison safety") and schema-form.test.tsx (describe block: "element type comparison safety").
© seasonedcc, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .claude/skills/safe-element-comparison of seasonedcc/remix-forms.
Open the folder on GitHubat commit 7030d30
Safe Element Comparison 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 |
|---|---|---|---|---|---|---|
| Safe Element Comparison this skillseasonedcc/remix-forms | 514 | — | ~1.8k | Automated safety check: Pass | MIT | |
| React Devdavila7/claude-code-templates | 33k | 2 repos | ~2.6k | Automated safety check: Pass | MIT | |
| React Idiomsirahardianto/awesome-agv | 156 | — | ~3.8k | Automated safety check: Pass | MIT | |
| Using Docs Kitlobehub/lobe-ui | 2.2k | — | ~2.8k | Automated safety check: Pass | MIT | |
| React Render Types CompositionHorusGoul/eslint-plugin-react-render-types | 111 | — | ~1.1k | Automated safety check: Pass | MIT | |
| Frontend Typescript Rulesshinpr/ai-coding-project-boilerplate | 234 | — | ~1.7k | Automated safety check: Pass | MIT |
davila7/claude-code-templates
This skill should be used when building React components with TypeScript, typing hooks, handling events, or when React TypeScript, React 19, Server Components are mentioned.
irahardianto/awesome-agv
React 19+ patterns: custom hooks, Suspense boundaries, state management, component composition, and web performance.
lobehub/lobe-ui
Set up and author a documentation site with @lobehub/docs-kit (the lobedocs CLI, React Router + Vite static docs used by ui.lobehub.com).
HorusGoul/eslint-plugin-react-render-types
Composition patterns for building React components with @renders type annotations from eslint-plugin-react-render-types.
shinpr/ai-coding-project-boilerplate
Applies React/TypeScript type safety, component design, and state management rules.
shinpr/claude-code-workflows
React/TypeScript frontend development rules including type safety, component design, state management, and error handling.
seasonedcc/remix-forms
Release a new version of the remix-forms npm package. An agent skill from seasonedcc/remix-forms.
seasonedcc/remix-forms
Create, manage, and debug Claude Code Agent Skills. An agent skill from seasonedcc/remix-forms.
Works with
Categories
Maintain element type comparison safety in remix-forms. An agent skill from seasonedcc/remix-forms. Safe Element Comparison is an agent skill from seasonedcc/remix-forms. Maintain element type comparison safety in remix-forms.
Safe Element Comparison fits situations like: modifying component mappings; adding new components to mapChildren; investigating unexpected HTML attributes; writing docs about component customization.
Run `npx skills add seasonedcc/remix-forms --skill safe-element-comparison -a claude-code`. Or copy the skill folder (.claude/skills/safe-element-comparison in seasonedcc/remix-forms) into .claude/skills/safe-element-comparison in your project. Claude Code loads it when a task matches its description.
Run `npx skills add seasonedcc/remix-forms --skill safe-element-comparison -a codex`. Or copy the skill folder (.claude/skills/safe-element-comparison in seasonedcc/remix-forms) into .agents/skills/safe-element-comparison 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 seasonedcc/remix-forms --skill safe-element-comparison -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/safe-element-comparison, .gemini/skills/safe-element-comparison, .github/skills/safe-element-comparison and .opencode/skills/safe-element-comparison in your project.
SKILL.md names no scripts, command-line tools or credentials: Safe Element Comparison is instructions for the agent only.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. 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.
Safe Element Comparison is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 1.8k tokens (SKILL.md is roughly 7.2k 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 Safe Element Comparison: React Dev (davila7/claude-code-templates, 33k stars), React Idioms (irahardianto/awesome-agv, 156 stars), Using Docs Kit (lobehub/lobe-ui, 2.2k stars) and React Render Types Composition (HorusGoul/eslint-plugin-react-render-types, 111 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
seasonedcc (a GitHub organization) maintains it in seasonedcc/remix-forms, which has 514 GitHub stars. The repository holds 3 skills in this directory. The repository was last updated on April 15, 2026.
Source: seasonedcc/remix-forms on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.