Agent skill

Add Sheet

by ecency in ecency/vision-mobile

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.

MITAuto-check passedDevelopment

Install Add Sheet

skills CLI
$ npx skills add ecency/vision-mobile --skill add-sheet -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install ecency/vision-mobile add-sheet --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ 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-src

Use ~/.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/

Facts

Skill name
add-sheet
GitHub stars
262
Token cost
~2.4k tokens
SKILL.md length
780 words
Files
1
Skills in repo
6
Repo updated
First seen
Licence
MIT

At a glance

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.

  • Works in 6 steps: Component → Folder index → Components barrel → …
  • Debugging a bottom sheet (action sheet) in the mobile app
  • SKILL.md covers Resolve with an object, gate…, Step 1: Component, Step 2: Folder index and Step 3: Components barrel, plus 4 more sections
  • Calls yarn

What it does

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.

When your agent uses it

  • Debugging a bottom sheet (action sheet) in the mobile app
  • Including when a sheets cancel
  • Dismissal reaches the caller as the wrong result

Example prompts

  • “/add-sheet”

Workflow steps

6 steps, taken from the step headings in SKILL.md.

  1. Component
  2. Folder index
  3. Components barrel
  4. Register in src/navigation/sheets.tsx
  5. Show it and read the result
  6. i18n strings

What it can do on your machine

Read from SKILL.md and the folder at commit feef7d1. It shows what the files ask for, not the result of running them.

  • Tool permissions

    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.

  • Runs code

    Shell commands in SKILL.md call:

    • yarn

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    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.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

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.

Always · name and description, kept in context so the agent knows when to use it
~47
When it runs · the whole SKILL.md, loaded when a task matches
~2.4k

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.

Safety

Auto-check passed

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.

SKILL.md

The full file from ecency/vision-mobile at commit feef7d1, republished under its MIT licence (© ecency). 780 words, ~2,419 tokens.

Download SKILL.mdSave it as .claude/skills/add-sheet/SKILL.md (or your agent's skills folder).
name
add-sheet
description
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.
argument-hint
sheet-name

Add Sheet

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.

Resolve with an object, gate on a named field

react-native-actions-sheet 0.9.7, node_modules/react-native-actions-sheet/dist/src/index.js:408:

js
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:

  • A backdrop tap, swipe down or hardware back closes with data === undefined, so show() resolves undefined. Truthiness cannot separate that dismissal from a sheet that deliberately answered false, 0 or ''. A named field can.
  • The substitution is one prop away from going live. Adding 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.

Step 1: Component

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:

typescript
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.

Step 2: Folder index

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:

typescript
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.

Show full SKILL.md (337 more words)Show less

Step 3: Components barrel

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.

Step 4: Register in src/navigation/sheets.tsx

Add 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.

typescript
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.

Step 5: Show it and read the result

typescript
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)).

Step 6: i18n strings

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:

json
  "my_sheet": { "title": "Sheet Title", "confirm": "Confirm", "cancel": "Cancel" },

Lifecycle

  • Sheets mount on a fresh show and unmount on hide: the library renders the registered component only while that sheet is visible. 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.
  • Sheets render outside the ErrorBoundary: 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.
  • The payload is captured at show time: it is stored in state at that show, so a callback passed inside a payload keeps the closure it had then. Route anything that changes through a ref, as 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

Files

Just SKILL.md in .claude/skills/add-sheet of ecency/vision-mobile.

Open the folder on GitHubat commit feef7d1

Compare with similar skills

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.

Add Sheet compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Add Sheet this skillecency/vision-mobile262—~2.4kAutomated safety check: PassMIT
Code Guidelinesgetsentry/sentry-react-native1.8k—~3.2kAutomated safety check: PassMIT
React DevTools Profile Analyzerkeybase/client9.3k—~978Automated safety check: PassBSD-3-Clause
Jazz UI Developmentgarden-co/classic-jazz2.5k—~1.7kAutomated safety check: PassMIT
Generate Dochyochan/react-native-nitro-sound961—~824Automated safety check: PassMIT
Fix CIgronxb/hot-updater1.8k—~572Automated safety check: PassCustom licence

Similar skills

  • Code Guidelines

    getsentry/sentry-react-native

    Official

    Enforce Sentry React Native SDK code guidelines for implementation, refactoring, and review.

    1.8k GitHub stars~3.2k tokensUpdated today
    DevelopmentAuto-check passed
  • 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.

    9.3k GitHub stars~978 tokensUpdated yesterday
    DevelopmentAuto-check passed
  • Jazz UI Development

    garden-co/classic-jazz

    A skill your agent uses when building, debugging, or optimizing Jazz applications.

    2.5k GitHub stars~1.7k tokensUpdated 1 mo ago
    DevelopmentAuto-check passed
  • Generate Doc

    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.

    961 GitHub stars~824 tokensUpdated 8 days ago
    DevelopmentAuto-check passed
  • Fix CI

    gronxb/hot-updater

    Run a local pnpm monorepo CI loop, fix failures, and stop only when the full sequence is green.

    1.8k GitHub stars~572 tokensUpdated today
    DevelopmentAuto-check passed
  • Review PR

    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…

    961 GitHub stars~1.9k tokensUpdated 8 days ago
    DevelopmentAuto-check passed

More from ecency/vision-mobile

  • Add Feature

    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.

    262 GitHub stars~1.9k tokensUpdated 2 days ago
    Auto-check passed
  • Add Mutation

    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)

    262 GitHub stars~1.9k tokensUpdated 2 days ago
    Auto-check passed
  • Add Query

    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…

    262 GitHub stars~1.8k tokensUpdated 2 days ago
    Auto-check passed
  • Code Review

    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…

    262 GitHub stars~2k tokensUpdated 2 days ago
    Auto-check passed
  • Debug

    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…

    262 GitHub stars~2.7k tokensUpdated 2 days ago
    Auto-check passed

Works with

Questions about Add Sheet

What does Add Sheet do?

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.

When should I use Add Sheet?

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.

How do I install Add Sheet in Claude Code?

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.

How do I install Add Sheet in Codex?

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.

Can I use Add Sheet in Cursor, Gemini CLI or GitHub Copilot?

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.

What does Add Sheet need to run?

Going by SKILL.md and its folder, Add Sheet needs the command-line tools its instructions call (yarn).

Does Add Sheet access the network?

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.

Is Add Sheet safe to install?

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.

What licence does Add Sheet use?

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.

How many tokens does Add Sheet use?

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.

What are the alternatives to Add Sheet?

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.

Who maintains Add Sheet?

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.