extension-camera — скилл для Claude Code: что делает и как установить
Добавляет в агент правила работы с веб-камерой через React-хук useCamera. Пригодится для съёмки фото и видеопревью в браузере.
npx skills add caffeinelabs/skills --skill extension-camera -a claude-codeЧто делает extension-camera
Скилл учит агента внедрять готовый хук useCamera из пакета @caffeineai/camera. В коде ничего не придётся писать с нуля: хук уже содержит методы управления видеопотоком, проверку поддержки браузером и типизированные ошибки вроде отказа в доступе к устройству.
Внутри зашиты чёткие правила построения интерфейса. Агент привязывает videoRef к элементу <video>, скрывает служебный <canvas> и блокирует кнопки управления до завершения инициализации. Снимки сохраняются как объекты File с выбором формата (jpeg, png, webp) и качества сжатия от 0 до 1.
На десктопе переключение камеры работать не будет — активен только режим environment. Это ограничение заложено в логику хука, поэтому на обычных компьютерах кнопку смены камеры оставлять бессмысленно.
Какие задачи решает
- встроить видеопревью веб-камеры через хук
useCamera - настроить захват и сохранение снимков в
File - обработать ошибки разрешений и отсутствия веб-камеры
- заблокировать интерфейс на время инициализации камеры
Примеры запросов агенту
- Добавь компонент для съёмки фото с веб-камеры через хук useCamera
- Сделай превью камеры с кнопками старта, остановки и переключения на фронталку
- Настрой обработку ошибок доступа к веб-камере в интерфейсе
Как установить extension-camera
1Через Skills CLI (Vercel)
npx skills add caffeinelabs/skills --skill extension-camera -a claude-code2Вручную: положить файлы
~/.claude/skills/extension-camera/SKILL.mdПапка скилла целиком; для одного проекта — .claude/skills/extension-camera/
1Через Skills CLI (Vercel)
npx skills add caffeinelabs/skills --skill extension-camera -a codex2Вручную: положить файлы
.agents/skills/extension-camera/SKILL.mdДля всех проектов — ~/.agents/skills/
1Через Skills CLI (Vercel)
npx skills add caffeinelabs/skills --skill extension-camera -a cursor2Вручную: положить файлы
.cursor/skills/extension-camera/SKILL.mdCursor читает и .agents/skills/, и .claude/skills/
1GitHub CLI
gh skill install caffeinelabs/skills extension-camera2Вручную: положить файлы
.github/skills/extension-camera/SKILL.md1Через Skills CLI (Vercel)
npx skills add caffeinelabs/skills --skill extension-camera -a gemini-cli2Командой платформы
gemini skills install https://github.com/caffeinelabs/skills --path skills/extension-cameraВручную: положить файлы
.devin/skills/extension-camera/SKILL.mdСтарый путь .windsurf/skills/ тоже читается
Через Skills CLI (Vercel)
npx skills add caffeinelabs/skills --skill extension-camera -a opencodeClaude.ai
Упакуйте папку в zip и загрузите в Settings → Capabilities → Skills
По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов
Вопросы о extension-camera
Как установить extension-camera в Claude Code?
Выполните команду npx skills add caffeinelabs/skills --skill extension-camera -a claude-code. Файл навыка сохранится по пути ~/.claude/skills/extension-camera/SKILL.md.
Что делает скилл extension-camera?
Он даёт агенту инструкции и примеры для встраивания веб-камеры через React-хук useCamera. Включает методы запуска потока, съёмки фото и проверки поддержки в браузере.
Можно ли переключать камеру на обычном компьютере?
Нет, инструкция прямо указывает, что на десктопе переключение не работает и используется только режим environment. Смена камеры рассчитана на мобильные устройства.
Исходный текст
SKILL.md · Apache-2.0
---
name: extension-camera
description: Web-camera support.
version: 0.1.4
compatibility:
npm:
"@caffeineai/camera": "~0.1.1"
caffeineai-subscription: [none]
---
# Camera
Camera extension for [Caffeine AI](https://caffeine.ai?utm_source=caffeine-skill&utm_medium=referral).
## Overview
This skill adds web-camera access via a prefabricated React hook. Supports photo capture, camera switching, and error handling.
# Frontend
For camera support:
There is a prefabricated React hook `@caffeinelabs/camera/hooks/useCamera.ts` that cannot be modified.
```typescript filepath=@caffeinelabs/camera/hooks/useCamera.ts
import { RefObject } from 'react';
export interface CameraConfig {
// Camera facing mode - 'user' for front camera, 'environment' for back camera
facingMode?: 'user' | 'environment';
// Ideal video width and height in pixels
width?: number;
height?: number;
// Image quality for capture (0-1, where 1 is highest quality)
quality?: number;
format?: 'image/jpeg' | 'image/png' | 'image/webp';
}
export interface CameraError {
type: 'permission' | 'not-supported' | 'not-found' | 'unknown' | 'timeout';
message: string;
}
export interface UseCameraReturn {
// Whether camera is currently active and streaming
isActive: boolean;
// Whether camera is supported in current browser (null while checking)
isSupported: boolean | null;
// Current error state, if any
error: CameraError | null;
// Whether camera is initializing, starting, switching, or stopping
isLoading: boolean;
currentFacingMode: 'user' | 'environment';
// Returns true on success
startCamera: () => Promise<boolean>;
stopCamera: () => Promise<void>;
capturePhoto: () => Promise<File | null>;
// Returns true on success
switchCamera: () => (newFacingMode?: 'user' | 'environment') : Promise<boolean>;
// Returns true on success
retry: () => Promise<boolean>;
// Ref to attach to video element for camera preview
videoRef: RefObject<HTMLVideoElement>;
// Ref to canvas element used for photo capture (can be hidden)
canvasRef: RefObject<HTMLCanvasElement>;
}
export declare function useCamera(config?: CameraConfig): UseCameraReturn;
```
Usage example:
```
import { useCamera } from '@caffeineai/camera';
function CameraComponent() {
const {
isActive,
isSupported,
error,
isLoading,
startCamera,
stopCamera,
capturePhoto,
switchCamera,
videoRef,
canvasRef
} = useCamera({
autoStart: true,
facingMode: 'environment'
});
if (isSupported === false) {
return <div>Camera not supported</div>;
}
return (
<div>
<video
ref={videoRef}
style={{ width: '100%', height: 'auto' }}
playsInline
muted
/>
<canvas ref={canvasRef} style={{ display: 'none' }} />
{error && <div>Error: {error.message}</div>}
<div>
<button onClick={startCamera} disabled={isLoading || isActive}>
Start Camera
</button>
<button onClick={stopCamera} disabled={isLoading || !isActive}>
Stop Camera
</button>
<button onClick={switchCamera} disabled={isLoading || !isActive}>
Switch Camera
</button>
<button onClick={capturePhoto} disabled={!isActive}>
Take Photo
</button>
</div>
</div>
);
}
```
Always place a capture button on camera preview!
Always show a camera preview when the user opens the camera
On desktop, make sure that camera cannot be switched. Only 'environment' is working.
Properly display camera error messages in the app.
Do not make camera buttons clickable until the camera is fully initialized and ready.
Ensure the camera preview has explicit, non-zero dimensions (fixed height, min-height, or an aspect-ratio wrapper) so it never collapses due to layout.
Make the preview responsive across screen sizes (e.g., width: 100% with a stable aspect ratio).
© caffeinelabs · Apache-2.0 · caffeinelabs/skills