extension-qr-code — скилл для Claude Code: сканер QR-кодов
Добавляет в React-приложение сканирование QR-кодов через камеру устройства. Пригодится, когда нужно считать код прямо в браузере.
npx skills add caffeinelabs/skills --skill extension-qr-code -a claude-codeЧто делает extension-qr-code
Скилл даёт готовый React-хук useQRScanner из пакета @caffeinelabs/qr-code. Он построен поверх компонента камеры и декодирует код через jsQR. Хук отдаёт список найденных кодов, состояние камеры и методы запуска, остановки и переключения камеры.
Хук менять нельзя, он поставляется готовым. Настроек немного: scanInterval задаёт частоту сканирования в миллисекундах, maxResults ограничивает историю результатов, jsQRUrl указывает адрес загрузки библиотеки jsQR. По умолчанию jsQR подтягивается с CDN jsdelivr, так что приложение зависит от внешней сети — это повод проверить, как поведёт себя сканер без доступа к CDN.
Внутри два пакета: @caffeineai/qr-code версии ~0.1.2 и @caffeineai/camera версии ~0.1.1. К видеоэлементу цепляется videoRef, для обработки нужен скрытый canvasRef. Ошибки камеры приходят в поле error, их стоит показывать в интерфейсе.
Какие задачи решает
- считать QR-код камерой телефона прямо в браузере
- показать историю отсканированных кодов с метками времени
- переключаться между фронтальной и тыловой камерой
- обработать случай, когда камера недоступна или не поддерживается
- очистить список результатов перед новым сканированием
Примеры запросов агенту
- подключи useQRScanner из @caffeineai/qr-code и сделай компонент сканера QR
- добавь кнопку переключения камеры, показывай её только на мобильных
- выведи ошибку камеры на экран, если error не пустой
Как установить extension-qr-code
1Через Skills CLI (Vercel)
npx skills add caffeinelabs/skills --skill extension-qr-code -a claude-code2Вручную: положить файлы
~/.claude/skills/extension-qr-code/SKILL.mdПапка скилла целиком; для одного проекта — .claude/skills/extension-qr-code/
1Через Skills CLI (Vercel)
npx skills add caffeinelabs/skills --skill extension-qr-code -a codex2Вручную: положить файлы
.agents/skills/extension-qr-code/SKILL.mdДля всех проектов — ~/.agents/skills/
1Через Skills CLI (Vercel)
npx skills add caffeinelabs/skills --skill extension-qr-code -a cursor2Вручную: положить файлы
.cursor/skills/extension-qr-code/SKILL.mdCursor читает и .agents/skills/, и .claude/skills/
1GitHub CLI
gh skill install caffeinelabs/skills extension-qr-code2Вручную: положить файлы
.github/skills/extension-qr-code/SKILL.md1Через Skills CLI (Vercel)
npx skills add caffeinelabs/skills --skill extension-qr-code -a gemini-cli2Командой платформы
gemini skills install https://github.com/caffeinelabs/skills --path skills/extension-qr-codeВручную: положить файлы
.devin/skills/extension-qr-code/SKILL.mdСтарый путь .windsurf/skills/ тоже читается
Через Skills CLI (Vercel)
npx skills add caffeinelabs/skills --skill extension-qr-code -a opencodeClaude.ai
Упакуйте папку в zip и загрузите в Settings → Capabilities → Skills
По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов
Вопросы о extension-qr-code
Как установить extension-qr-code в Claude?
Выполните npx skills add caffeinelabs/skills --skill extension-qr-code -a claude-code. Скилл появится в ~/.claude/skills/extension-qr-code/SKILL.md.
Что делает extension-qr-code?
Добавляет сканирование QR-кодов через камеру устройства. В основе готовый React-хук useQRScanner и декодирование через jsQR.
Какие пакеты нужны для работы?
@caffeineai/qr-code версии ~0.1.2 и @caffeineai/camera версии ~0.1.1. Хук импортируется из @caffeinelabs/qr-code и изменению не подлежит.
Исходный текст
SKILL.md · Apache-2.0
---
name: extension-qr-code
description: QR code scanner using the camera.
version: 0.1.5
compatibility:
npm:
"@caffeineai/qr-code": "~0.1.2"
"@caffeineai/camera": "~0.1.1"
caffeineai-subscription: [none]
---
# QR Code Scanner
QR code scanner extension for [Caffeine AI](https://caffeine.ai?utm_source=caffeine-skill&utm_medium=referral).
## Overview
This skill adds QR code scanning using the device camera. Built on top of the camera component with jsQR for decoding.
# Frontend
For QR code scanner support:
There is a prefabricated React hook imported from `@caffeinelabs/qr-code` that cannot be modified.
```typescript filepath=@caffeinelabs/qr-code/src/hooks/useQRScanner.ts
import { RefObject } from 'react';
import { CameraConfig, CameraError } from '@caffeineai/camera';
export interface QRResult {
// The decoded QR code data
data: string;
// Timestamp when the QR code was scanned
timestamp: number;
}
export interface QRScannerConfig extends CameraConfig {
// How often to scan for QR codes in milliseconds (default: 100)
scanInterval?: number;
// Maximum number of results to keep in history (default: 10)
maxResults?: number;
// URL to load jsQR library from (default: jsdelivr CDN)
jsQRUrl?: string;
}
export interface UseQRScannerReturn {
// Array of scanned QR codes (newest first)
qrResults: QRResult[];
// Whether currently scanning for QR codes
isScanning: boolean;
// Whether jsQR library has been loaded
jsQRLoaded: boolean;
// Camera state (pass-through from useCamera)
isActive: boolean;
isSupported: boolean | null;
error: CameraError | null;
isLoading: boolean;
currentFacingMode: 'user' | 'environment';
// Start camera and begin scanning - returns true on success
startScanning: () => Promise<boolean>;
// Stop scanning and camera
stopScanning: () => Promise<void>;
// Switch camera facing mode - returns true on success
switchCamera: () => Promise<boolean>;
// Clear all scan results
clearResults: () => void;
// Reset scanner state (stop scanning and clear results)
reset: () => void;
// Retry camera initialization after error - returns true on success
retry: () => Promise<boolean>;
// Ref to attach to video element for camera preview
videoRef: RefObject<HTMLVideoElement>;
// Ref to attach to canvas element used for QR processing (can be hidden)
canvasRef: RefObject<HTMLCanvasElement>;
// Computed state
// Whether scanner is ready to use (jsQR loaded and camera supported)
isReady: boolean;
// Whether scanning can be started (ready + not loading)
canStartScanning: boolean;
}
export declare function useQRScanner(config?: QRScannerConfig): UseQRScannerReturn;
```
Usage example:
```typescript filepath=example.ts
import { useQRScanner } from '@caffeineai/qr-code';
function QRScannerComponent() {
const {
qrResults,
isScanning,
isActive,
isSupported,
error,
isLoading,
canStartScanning,
startScanning,
stopScanning,
switchCamera,
clearResults,
videoRef,
canvasRef
} = useQRScanner({
facingMode: 'environment',
scanInterval: 100,
maxResults: 5
});
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={startScanning} disabled={!canStartScanning}>
Start Scanning
</button>
<button onClick={stopScanning} disabled={isLoading || !isActive}>
Stop Scanning
</button>
{/* Only show switch camera on mobile */}
{/Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) && (
<button onClick={switchCamera} disabled={isLoading || !isActive}>
Switch Camera
</button>
)}
</div>
<div>
<h3>Results {qrResults.length > 0 && <button onClick={clearResults}>Clear</button>}</h3>
{qrResults.map(result => (
<div key={result.timestamp}>
<small>{new Date(result.timestamp).toLocaleTimeString()}</small>
<p>{result.data}</p>
</div>
))}
</div>
</div>
);
}
```
Properly display QR scanner error messages in the app.
© caffeinelabs · Apache-2.0 · caffeinelabs/skills