Code Guidelines
getsentry/sentry-react-native
Enforce Sentry React Native SDK code guidelines for implementation, refactoring, and review.
A skill your agent uses when adding, registering, or debugging a bottom sheet (action sheet) in the mobile app, including when a sheet's cancel or dismissal reaches the caller as the wrong result.
$ npx skills add ecency/vision-mobile --skill add-sheet -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install ecency/vision-mobile add-sheet --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/ecency/vision-mobile.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/add-sheet .claude/skills/add-sheet && 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 "add-sheet" agent skill from https://github.com/ecency/vision-mobile/tree/development/.claude/skills/add-sheet into .claude/skills/add-sheet/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "add-sheet", 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/ecency/vision-mobile/tree/development/.claude/skills/add-sheetType 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 ecency/vision-mobile --skill add-sheet -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install ecency/vision-mobile add-sheet --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ecency/vision-mobile.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/add-sheet .agents/skills/add-sheet && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "add-sheet" agent skill from https://github.com/ecency/vision-mobile/tree/development/.claude/skills/add-sheet into .agents/skills/add-sheet/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "add-sheet", 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 ecency/vision-mobile --skill add-sheet -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install ecency/vision-mobile add-sheet --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ecency/vision-mobile.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/add-sheet .cursor/skills/add-sheet && 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 "add-sheet" agent skill from https://github.com/ecency/vision-mobile/tree/development/.claude/skills/add-sheet into .cursor/skills/add-sheet/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "add-sheet", 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/ecency/vision-mobile.git --path .claude/skills/add-sheet--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 ecency/vision-mobile --skill add-sheet -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install ecency/vision-mobile add-sheet --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ecency/vision-mobile.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/add-sheet .gemini/skills/add-sheet && 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 "add-sheet" agent skill from https://github.com/ecency/vision-mobile/tree/development/.claude/skills/add-sheet into .gemini/skills/add-sheet/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "add-sheet", 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 ecency/vision-mobile add-sheetInstalls 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 ecency/vision-mobile --skill add-sheet -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/ecency/vision-mobile.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/add-sheet .github/skills/add-sheet && 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 "add-sheet" agent skill from https://github.com/ecency/vision-mobile/tree/development/.claude/skills/add-sheet into .github/skills/add-sheet/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "add-sheet", 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 ecency/vision-mobile --skill add-sheet -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install ecency/vision-mobile add-sheet --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ecency/vision-mobile.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/add-sheet .opencode/skills/add-sheet && 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 "add-sheet" agent skill from https://github.com/ecency/vision-mobile/tree/development/.claude/skills/add-sheet into .opencode/skills/add-sheet/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "add-sheet", 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.
add-sheetA skill your agent uses when adding, registering, or debugging a bottom sheet (action sheet) in the mobile app, including when a sheet's cancel or dismissal reaches the caller as the wrong result.
Add Sheet is an agent skill from ecency/vision-mobile. Use when adding, registering, or debugging a bottom sheet (action sheet) in the mobile app, including when a sheet's cancel or dismissal reaches the caller as the wrong result.
Its SKILL.md is about 2.4k 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 Development. It works with React Native. The repository describes itself as: Ecency Mobile - reimagined social blogging, contribute and get rewarded (for Android and iOS). The licence is MIT.
6 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit feef7d1. 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:
yarnFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use yarn, which can reach the network depending on how they are called.
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.
Add Sheet loads about 2.4k tokens when it runs. Until then it costs about 47 tokens; SKILL.md has 780 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 ecency/vision-mobile at commit feef7d1, republished under its MIT licence (© ecency). 780 words, ~2,419 tokens.
.claude/skills/add-sheet/SKILL.md (or your agent's skills folder).Registry, show call and mount lifecycle: CLAUDE.md "Sheets (Bottom Sheets)". This file adds the procedure plus the result convention new sheets here should follow.
react-native-actions-sheet 0.9.7, node_modules/react-native-actions-sheet/dist/src/index.js:408:
actionSheetEventManager.publish("onclose_".concat(sheetId), data || payloadRef.current || data, currentContext);data is what you passed to SheetManager.hide(id, { payload: data }). payloadRef.current is
NOT the show payload: it tracks <ActionSheet>'s own payload prop (payload = _a.payload at
index.js:53, useRef(payload) at 87, payloadRef.current = payload at 139). The
SheetManager.show payload goes somewhere else entirely, to the registered component as a prop
from the provider (<Sheet sheetId={id} payload={payload}/>, dist/src/provider.js:160).
Sheets in src/ do not forward that prop down into <ActionSheet>: grep -rn "payload=" src/
returns zero hits. So payloadRef.current is undefined for the sheets here.
data || payloadRef.current || data collapses to data, so a falsy return does reach the caller
intact today. Same expression on onBeforeClose (line 385) and onClose (line 401).
Still resolve with an object and gate on a named field. Two reasons:
data === undefined, so show()
resolves undefined. Truthiness cannot separate that dismissal from a sheet that deliberately
answered false, 0 or ''. A named field can.payload={payload} to an
<ActionSheet> would silently turn every falsy cancel in that sheet into the truthy show
payload, with no type error and no crash.Copy modNotesSheet, communityRoleEditSheet, walletHistoryFiltersSheet or
newsletterDigestSheet. All four resolve { cancelled: true } on cancel.
searchFiltersSheet is apply-only, with no cancel control, so it is not a model here.
src/components/authUpgradeSheet/authUpgradeSheet.tsx is one counter-example: it cancels with
_close(false) while src/providers/sdk/mobilePlatformAdapter.ts:317 gates on
if (!result) return false;. That reads correctly right now, since cancel and dismissal are both
falsy there and both mean the same thing, but it is one of the sheets that breaks first if anyone
gives it a payload prop.
Comments across src/ (in sheets.tsx, in several sheet components, in several screens) justify
this convention by claiming a dismissal resolves the payload object. The convention is right; that
reason is not.
src/components/<sheetName>/<sheetName>.tsx is the usual path for a component typed with
SheetProps<'...'>. Other sheets use the enum form SheetProps<SheetNames.X>, which is equally
accepted. Trimmed from src/components/modNotesSheet/modNotesSheet.tsx:
import React, { useCallback, useEffect, useRef, useState } from 'react';
import { useIntl } from 'react-intl';
import ActionSheet, { SheetManager, SheetProps } from 'react-native-actions-sheet';
import EStyleSheet from 'react-native-extended-stylesheet';
import { MainButton } from '../mainButton';
// Matches the SheetNames value. Sheets keep this so `hide` has an id even when the
// sheet is rendered outside the registry.
const FALLBACK_SHEET_ID = 'my_sheet';
/** `{ value }` on confirm, `{ cancelled: true }` on cancel. A backdrop, swipe or back
* dismissal resolves `undefined`, so callers gate on a string `value`, never on
* truthiness. */
export interface MySheetResult {
value?: string;
cancelled?: boolean;
}
const MySheet: React.FC<SheetProps<'my_sheet'>> = ({ sheetId, payload }) => {
const intl = useIntl();
const [value, setValue] = useState('');
const closedRef = useRef(false);
const _reset = useCallback(() => {
closedRef.current = false;
setValue('');
}, []);
// onBeforeShow fires the same reset on every fresh presentation, which a registered
// sheet also gets from its fresh mount. This effect covers the one case both miss, a
// payload swap while the sheet is already open, because use-sheet-manager.js drops the
// re-show with `if (visible) return;` before onBeforeShow can run. Do not delete it as
// redundant.
useEffect(() => {
_reset();
}, [payload, _reset]);
// closedRef stops a double tap firing two hides, which would resolve twice.
const _close = (result: MySheetResult) => {
if (closedRef.current) return;
closedRef.current = true;
SheetManager.hide(sheetId || FALLBACK_SHEET_ID, { payload: result });
};
return (
<ActionSheet id={sheetId || FALLBACK_SHEET_ID} gestureEnabled closeOnTouchBackdrop
onBeforeShow={_reset} containerStyle={styles.sheetContainer}>
<MainButton text={intl.formatMessage({ id: 'my_sheet.confirm' })}
onPress={() => _close({ value: value.trim() })} />
<MainButton text={intl.formatMessage({ id: 'my_sheet.cancel' })}
onPress={() => _close({ cancelled: true })} />
</ActionSheet>
);
};
const styles = EStyleSheet.create({
sheetContainer: { paddingHorizontal: 0, backgroundColor: '$primaryBackgroundColor' },
});
export default MySheet;Colors come from EStyleSheet theme variables in src/themes/ ($primaryBackgroundColor,
$primaryBlack, $primaryDarkGray, $iconColor) rather than a hex literal. For a color a prop
needs as a plain string rather than a style, resolve it with EStyleSheet.value('$primaryDarkGray'), as
modNotesSheet does for placeholderTextColor.
src/components/<sheetName>/index.ts. Sheet folders re-export their sheet with the first line;
those that also publish a result type add the second:
export { default as MySheet } from './<sheetName>';
export type { MySheetResult } from './<sheetName>';A sheet that sheets.tsx imports by path can skip this file entirely. walletHistoryFiltersSheet
has no index.ts.
src/components/index.tsx is an import list plus one export { ... } block at line 164. Add
import { MySheet } from './<sheetName>'; plus a MySheet, entry inside that block. There is no
export ... from line to add. A sheet nothing else imports can skip this step and be imported
in sheets.tsx by path, as some registrations are.
src/navigation/sheets.tsxAdd the SheetNames member (MY_SHEET = 'my_sheet',), the
registerSheet(SheetNames.MY_SHEET, MySheet); call, then extend Sheets. The key must be a
string literal, not [SheetNames.MY_SHEET]: string enum member types are nominal, so with a
computed key keyof Sheets carries the enum member rather than the string literal and
SheetProps<'my_sheet'> stops resolving.
declare module 'react-native-actions-sheet' {
interface Sheets {
my_sheet: SheetDefinition<{
payload: { someParam: string };
// `{ value }` on confirm, `{ cancelled: true }` on cancel, `undefined` on a
// backdrop, swipe or back dismissal. Gate on `value`, not on truthiness.
returnValue: MySheetResult | undefined;
}>;
}
}Skipping this fails yarn typecheck: the everySheetHasDefinition assertion at the bottom of
the file names any SheetNames member missing from the augmentation.
const result = await SheetManager.show(SheetNames.MY_SHEET, { payload: { someParam: 'x' } });
// Only a confirmation carries a string `value`. Cancel yields { cancelled: true }; a
// backdrop, swipe or back dismissal yields undefined. Both are rejected here.
const confirmed = typeof result?.value === 'string' ? result.value : '';
if (!confirmed) return;Real callers: src/components/postOptionsModal/container/postOptionsModal.tsx:742
(typeof result?.notes === 'string') and
src/screens/assetDetails/screen/assetDetailsScreen.tsx:265 (!Array.isArray(result?.operations)).
Edit src/config/locales/en-US.json only; Crowdin owns the other locales. The file is nested
objects, not dotted keys, while formatMessage ids stay dotted:
"my_sheet": { "title": "Sheet Title", "confirm": "Confirm", "cancel": "Cancel" },useState initials are fresh on that open, so
nothing stale needs clearing on mount; unmount cleanups run on close. The exception is a
show() against a sheet that is already open: the stored payload is replaced with no remount,
so reset on the payload prop as well, as Step 1 does. The CLAUDE.md bullet states the mount
rule without that exception.SheetProvider returns <>{children}{sheets}</>,
so sheets are siblings of <Application/> while the boundary sits inside it
(src/screens/application/index.tsx:17). A throw in a sheet render or effect cleanup is fatal.
Be careful with native or Expo shared objects in cleanups.src/components/quickPostModal/quickPostModalContent.tsx:565-575 does.© ecency, 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/add-sheet of ecency/vision-mobile.
Open the folder on GitHubat commit feef7d1
Add Sheet 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 |
|---|---|---|---|---|---|---|
| Add Sheet this skillecency/vision-mobile | 262 | — | ~2.4k | Automated safety check: Pass | MIT | |
| Code Guidelinesgetsentry/sentry-react-native | 1.8k | — | ~3.2k | Automated safety check: Pass | MIT | |
| React DevTools Profile Analyzerkeybase/client | 9.3k | — | ~978 | Automated safety check: Pass | BSD-3-Clause | |
| Jazz UI Developmentgarden-co/classic-jazz | 2.5k | — | ~1.7k | Automated safety check: Pass | MIT | |
| Generate Dochyochan/react-native-nitro-sound | 961 | — | ~824 | Automated safety check: Pass | MIT | |
| Fix CIgronxb/hot-updater | 1.8k | — | ~572 | Automated safety check: Pass | Custom licence |
getsentry/sentry-react-native
Enforce Sentry React Native SDK code guidelines for implementation, refactoring, and review.
keybase/client
Parses a React DevTools Profiler JSON export with Python scripts to find re-render storms, commit fan-out and why a component rendered, without opening the DevTools UI.
garden-co/classic-jazz
A skill your agent uses when building, debugging, or optimizing Jazz applications.
hyochan/react-native-nitro-sound
Create or update react-native-nitro-sound API documentation, examples, migration notes, FAQ entries, changelog or release notes, and compiled AI context.
gronxb/hot-updater
Run a local pnpm monorepo CI loop, fix failures, and stop only when the full sequence is green.
hyochan/react-native-nitro-sound
Inspect and finish react-native-nitro-sound pull requests by classifying review threads and CI failures, fixing valid findings, replying and resolving threads, using review-self when automated…
ecency/vision-mobile
A skill your agent uses when adding a new screen, route, or user-facing feature to the Ecency mobile React Native app, covering navigator registration, route params, i18n strings and styling.
ecency/vision-mobile
A skill your agent uses when adding, wrapping, or calling an @ecency/sdk mutation hook in the mobile app (Hive broadcasts like transfer, follow, vote, delegate, community, engine token, or points)
ecency/vision-mobile
A skill your agent uses when reading server data in the mobile app - wiring an @ecency/sdk query option into a screen, adding or editing a hook under src/providers/queries/, paginating a feed or…
ecency/vision-mobile
Review a vision-mobile React Native change (diff, branch, PR or file) against this repo's own traps and conventions: action sheet return values, setNativeProps caret, safe-area edges, editor…
ecency/vision-mobile
Diagnose a bug in the Ecency mobile app when a broadcast or login fails, a wallet or transfer amount is wrong, a screen or deep link does not open, a bottom sheet misbehaves, dark mode colors are…
Works with
Categories
A skill your agent uses when adding, registering, or debugging a bottom sheet (action sheet) in the mobile app, including when a sheet's cancel or dismissal reaches the caller as the wrong result. Add Sheet is an agent skill from ecency/vision-mobile. Use when adding, registering, or debugging a bottom sheet (action sheet) in the mobile app, including when a sheet's cancel or dismissal reaches the caller as the wrong result.
Add Sheet fits situations like: debugging a bottom sheet (action sheet) in the mobile app; including when a sheets cancel; dismissal reaches the caller as the wrong result.
Run `npx skills add ecency/vision-mobile --skill add-sheet -a claude-code`. Or copy the skill folder (.claude/skills/add-sheet in ecency/vision-mobile) into .claude/skills/add-sheet in your project. Claude Code loads it when a task matches its description.
Run `npx skills add ecency/vision-mobile --skill add-sheet -a codex`. Or copy the skill folder (.claude/skills/add-sheet in ecency/vision-mobile) into .agents/skills/add-sheet 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 ecency/vision-mobile --skill add-sheet -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/add-sheet, .gemini/skills/add-sheet, .github/skills/add-sheet and .opencode/skills/add-sheet in your project.
Going by SKILL.md and its folder, Add Sheet needs the command-line tools its instructions call (yarn).
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.
Add Sheet is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 2.4k tokens (SKILL.md is roughly 9.7k 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 Add Sheet: Code Guidelines (getsentry/sentry-react-native, 1.8k stars), React DevTools Profile Analyzer (keybase/client, 9.3k stars), Jazz UI Development (garden-co/classic-jazz, 2.5k stars) and Generate Doc (hyochan/react-native-nitro-sound, 961 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
ecency (a GitHub organization) maintains it in ecency/vision-mobile, which has 262 GitHub stars. The repository holds 6 skills in this directory. The repository was last updated on October 5, 2026.
Source: ecency/vision-mobile on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.