К основному содержанию
скилл CX Codex

mobile-offline-support — скилл для Claude Code: офлайн-режим

Скилл для офлайн-первого подхода в мобильных приложениях: локальное хранилище, очередь синхронизации, разрешение конфликтов.

Установить в Claude Code · Через Skills CLI (Vercel) Все способы и платформы ↓
npx skills add secondsky/claude-skills --skill mobile-offline-support -a claude-code
Открыть на GitHub

Что делает mobile-offline-support

Скилл задаёт агенту схему работы с данными, когда сеть пропадает. Внутри — класс OfflineManager на React Native: чтение из AsyncStorage, запись, постановка изменений в очередь и отправка на сервер, когда соединение вернулось. Состояние сети отслеживает NetInfo.

Очередь ограничена константой MAX_SYNC_QUEUE_LENGTH со значением 1000: при переполнении самые старые элементы отбрасываются с предупреждением в консоль. Конфликты решаются функцией resolveConflict по принципу last-write-wins, есть закомментированный вариант слияния полей. Для интерфейса приложен компонент OfflineIndicator — баннер, который показывается, пока связи нет.

Методы fetchFromServer и syncToServer помечены TODO: это примеры, а не готовый клиент. Подставьте свои эндпоинты и API_BASE_URL, иначе запросы уйдут в никуда. В references/native-implementations.md лежат варианты для iOS Core Data и Android Room с WorkManager.

Какие задачи решает

  • сохранить данные формы, пока связи нет
  • отправить накопленные изменения после возврата в сеть
  • разрешить конфликт между локальной и серверной версией записи
  • показать пользователю, что приложение работает офлайн
  • ограничить рост очереди синхронизации

Примеры запросов агенту

  • Добавь офлайн-режим в экран заказа: локальное хранилище и очередь синхронизации
  • Почему конфликты синхронизации перезаписывают свежие данные? Разбери resolveConflict
  • Сделай баннер офлайн-режима через OfflineIndicator

Как установить mobile-offline-support

1Через Skills CLI (Vercel)

npx skills add secondsky/claude-skills --skill mobile-offline-support -a claude-code

2Вручную: положить файлы

~/.claude/skills/mobile-offline-support/SKILL.md

Папка скилла целиком; для одного проекта — .claude/skills/mobile-offline-support/

По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов

Из того же набора89

dependency-upgrade Помогает обновлять зависимости без риска: настраивает карантин для новых версий, блокирует postinstall-скрипты и ведёт обновления поэтапно. CX Codex +1 404установок nuxt-server Скилл для серверной разработки на Nuxt 4 с Nitro: API-роуты, middleware, базы данных и WebSocket. Пригодится, когда бэкенд живёт внутри Nuxt-проекта. CX Codex +1 401установок bun-http-server Скилл подсказывает агенту, как поднять HTTP-сервер через Bun.serve(): маршруты, разбор тела запроса, ответы, CORS. CX Codex +1 400установок bun-cloudflare-workers Скилл для сборки и деплоя Cloudflare Workers на Bun: подсказывает структуру проекта, биндинги KV, D1, R2 и Durable Objects. CX Codex +1 402установок api-versioning-strategy Помогает выбрать способ версионирования API и провести старую версию до отключения без сюрпризов для клиентов. CX Codex +1 399установок bun-hot-reloading Скилл подсказывает агенту, как настроить горячую перезагрузку в Bun: режимы --watch и --hot, HMR и перезапуск HTTP-сервера. CX Codex +1 395установок claude-hook-writer Скилл-наставник по хукам Claude: проверяет дизайн, подсказывает безопасные паттерны и разбирает частые промахи. CX Codex +1 397установок logging-best-practices Скилл задаёт агенту правила структурного логирования: уровни, контекст запроса, маскировка персональных данных. Пригодится, когда логи пухнут или в них утекают пароли. CX Codex +1 396установок

Похожие

mobile-developer VoltAgent Community Субагент помогает собирать кроссплатформенные мобильные приложения на React Native и Flutter с учётом нативных функций и офлайн-режима. 7 777установок ui-mobile alinaqi Задаёт агенту правила мобильного интерфейса: минимальный размер нажатия 44×44, контраст по WCAG 2.1 AA, видимые границы кнопок. CX Codex +1 1 200установок Mobile App Design Standards awesome-skills Скилл подсказывает агенту правила вёрстки мобильных экранов: нативные паттерны iOS и Android, доступность, размеры тач-зон. CX Codex +1 906установок mobile-platform-offline-validate forcedotcom Проверяет компоненты LWC на совместимость с офлайн-режимом Komaci в Salesforce Mobile App Plus. Находит ошибки прайминга и формирует исправления кода. CX Codex +1 4 700установок frontend-mobile-development-mobile-developer Seth Hobson Субагент для React Native, Flutter и нативных приложений iOS/Android: архитектура, офлайн-синхронизация, оптимизация сборки и публикация в сторах. CX Codex ★ 41 729звёзд репо senior-mobile borghei Скилл для мобильной разработки: скаффолдинг проектов на React Native, Flutter, SwiftUI и Jetpack Compose, разбор производительности и подготовка к публикации в сторах. CX Codex +1 310установок

Рядом в теме «Мобильная разработка»

Всё по теме «Мобильная разработка» →

Вопросы о mobile-offline-support

Как установить mobile-offline-support в Claude?

Выполните npx skills add secondsky/claude-skills --skill mobile-offline-support -a claude-code. Скилл окажется в ~/.claude/skills/mobile-offline-support/SKILL.md.

Что делает mobile-offline-support?

Даёт агенту шаблоны для офлайн-первых мобильных приложений: кеш в локальном хранилище, очередь отложенной синхронизации, разрешение конфликтов и индикатор отсутствия сети.

На чём сломается этот скилл?

Методы fetchFromServer и syncToServer — заглушки с TODO. Без своих эндпоинтов и API_BASE_URL синхронизация не заработает.

Исходный текст

SKILL.md · MIT
---
name: mobile-offline-support
description: Offline-first mobile apps with local storage, sync queues, conflict resolution. Use for offline functionality, data sync, connectivity handling, or encountering sync conflicts, queue management, storage limits, network transition errors.
license: MIT
---

# Mobile Offline Support

Build offline-first mobile applications with local storage and synchronization.

## React Native Implementation

```javascript
import AsyncStorage from '@react-native-async-storage/async-storage';
import NetInfo from '@react-native-community/netinfo';

class OfflineManager {
  constructor() {
    this.syncQueue = [];
    this.isOnline = true;
    // Maximum items in sync queue before discarding oldest
    this.MAX_SYNC_QUEUE_LENGTH = 1000;

    NetInfo.addEventListener(state => {
      this.isOnline = state.isConnected;
      if (this.isOnline) this.processQueue();
    });
  }

  /**
   * Fetch data from server.
   * TODO: Replace with actual API endpoint implementation.
   */
  async fetchFromServer(key) {
    try {
      // Example implementation - replace with your API
      const response = await fetch(`${API_BASE_URL}/data/${key}`);
      if (!response.ok) {
        throw new Error(`Server returned ${response.status}`);
      }
      return await response.json();
    } catch (error) {
      console.error('fetchFromServer failed:', error);
      throw new Error(`Failed to fetch ${key}: ${error.message}`);
    }
  }

  /**
   * Sync data to server.
   * TODO: Replace with actual API endpoint implementation.
   */
  async syncToServer(key, data) {
    try {
      // Example implementation - replace with your API
      const response = await fetch(`${API_BASE_URL}/data/${key}`, {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify(data)
      });
      if (!response.ok) {
        throw new Error(`Server returned ${response.status}`);
      }
      return await response.json();
    } catch (error) {
      console.error('syncToServer failed:', error);
      throw new Error(`Failed to sync ${key}: ${error.message}`);
    }
  }

  async getData(key) {
    const cached = await AsyncStorage.getItem(key);
    if (cached) return JSON.parse(cached);

    if (this.isOnline) {
      const data = await this.fetchFromServer(key);
      await AsyncStorage.setItem(key, JSON.stringify(data));
      return data;
    }

    return null;
  }

  async saveData(key, data) {
    await AsyncStorage.setItem(key, JSON.stringify(data));

    if (this.isOnline) {
      await this.syncToServer(key, data);
    } else {
      // Add to queue
      this.syncQueue.push({ key, data, timestamp: Date.now() });

      // Enforce queue bounds - discard oldest if exceeded
      while (this.syncQueue.length > this.MAX_SYNC_QUEUE_LENGTH) {
        const discarded = this.syncQueue.shift();
        console.warn(`Sync queue full - discarded oldest item: ${discarded.key}`);
      }

      // Persist trimmed queue
      await AsyncStorage.setItem('syncQueue', JSON.stringify(this.syncQueue));
    }
  }

  async processQueue() {
    const failedItems = [];
    for (const item of this.syncQueue) {
      try {
        await this.syncToServer(item.key, item.data);
      } catch (err) {
        console.error('Sync failed:', err);
        failedItems.push(item);
      }
    }
    this.syncQueue = failedItems;
    if (failedItems.length === 0) {
      await AsyncStorage.removeItem('syncQueue');
    } else {
      await AsyncStorage.setItem('syncQueue', JSON.stringify(failedItems));
    }
  }
}
```

## Conflict Resolution

```javascript
function resolveConflict(local, server) {
  // Last-write-wins
  if (local.updatedAt > server.updatedAt) return local;
  return server;

  // Or merge changes
  // return { ...server, ...local };
}
```

## UI Indicators

```jsx
function OfflineIndicator() {
  const [isOnline, setIsOnline] = useState(true);

  useEffect(() => {
    return NetInfo.addEventListener(state => {
      setIsOnline(state.isConnected);
    });
  }, []);

  if (isOnline) return null;

  return (
    <View style={styles.banner}>
      <Text>You're offline. Changes will sync when connected.</Text>
    </View>
  );
}
```

## Best Practices

- Cache frequently accessed data locally
- Queue actions for later sync
- Show clear offline indicators
- Handle sync conflicts gracefully
- Compress stored data
- Test offline scenarios thoroughly

## Native Implementations

See [references/native-implementations.md](references/native-implementations.md) for:
- iOS Core Data with sync manager
- Android Room database with WorkManager sync

## Avoid

- Assuming connectivity
- Losing data on sync failures
- Unbounded queue growth
- Syncing sensitive data insecurely

© secondsky · MIT · secondsky/claude-skills

Смотрите также

Спонсоры проекта

Компании, которые помогают держать аналитику открытой