create-adaptable-composable — скилл для Claude Code: Vue composable
Скилл для создания переиспользуемых Vue composable, которые принимают значения, рефы или геттеры и работают одинаково во всех случаях. Пригодится, когда нужна библиотечная composable, адаптивная к разным типам входов.
npx skills add vuejs-ai/skills --skill create-adaptable-composable -a claude-codeЧто делает create-adaptable-composable
Скилл учит создавать composable, которые принимают MaybeRef или MaybeRefOrGetter — типы, позволяющие пользователю передать обычное значение, ref, computed или функцию-геттер. Внутри composable используются toValue() для получения значения и toRef() для создания реактивного источника, чтобы логика работала предсказуемо в watch или watchEffect.
Скилл предлагает четыре шага: уточнить назначение и API composable, выбрать, какие параметры должны быть реактивными, нормализовать входы с помощью toValue()/toRef() внутри эффектов, реализовать ядро composable. Есть разница: для read-only параметров берёшь MaybeRefOrGetter, для двусторонних — MaybeRef. Для колбэков и функций-предикатов MaybeRefOrGetter не подходит.
Требует Vue 3 или Nuxt 3. В репозитории примеры useDocumentTitle и useCounter — одна читает title с watch, вторая модифицирует count через toRef.
Какие задачи решает
- написать composable, которая принимает значение, ref или геттер без проверок
- сделать реактивный параметр, который не ломается при изменении типа входа
- выбрать между MaybeRef и MaybeRefOrGetter в зависимости от использования
- нормализовать входы в watch и watchEffect без потери реактивности
- создать переиспользуемую composable для библиотеки
Примеры запросов агенту
- Помоги написать composable useCounter, которая принимает MaybeRef для count и возвращает функцию add
- Создай adaptable composable для отслеживания ширины экрана, принимающую MaybeRefOrGetter для selector
- Нужна composable с двусторонним параметром формы — используй MaybeRef и toRef внутри watch
Как установить create-adaptable-composable
1Через Skills CLI (Vercel)
npx skills add vuejs-ai/skills --skill create-adaptable-composable -a claude-code2Вручную: положить файлы
~/.claude/skills/create-adaptable-composable/SKILL.mdПапка скилла целиком; для одного проекта — .claude/skills/create-adaptable-composable/
1Через Skills CLI (Vercel)
npx skills add vuejs-ai/skills --skill create-adaptable-composable -a codex2Вручную: положить файлы
.agents/skills/create-adaptable-composable/SKILL.mdДля всех проектов — ~/.agents/skills/
1Через Skills CLI (Vercel)
npx skills add vuejs-ai/skills --skill create-adaptable-composable -a cursor2Вручную: положить файлы
.cursor/skills/create-adaptable-composable/SKILL.mdCursor читает и .agents/skills/, и .claude/skills/
1GitHub CLI
gh skill install vuejs-ai/skills create-adaptable-composable2Вручную: положить файлы
.github/skills/create-adaptable-composable/SKILL.md1Через Skills CLI (Vercel)
npx skills add vuejs-ai/skills --skill create-adaptable-composable -a gemini-cli2Командой платформы
gemini skills install https://github.com/vuejs-ai/skills --path skills/create-adaptable-composableВручную: положить файлы
.devin/skills/create-adaptable-composable/SKILL.mdСтарый путь .windsurf/skills/ тоже читается
Через Skills CLI (Vercel)
npx skills add vuejs-ai/skills --skill create-adaptable-composable -a opencodeClaude.ai
Упакуйте папку в zip и загрузите в Settings → Capabilities → Skills
Из того же набора7
Весь набор →Похожие
Вопросы о create-adaptable-composable
Как установить create-adaptable-composable в Claude Code?
Выполни npx skills add vuejs-ai/skills --skill create-adaptable-composable -a claude-code, затем открой ~/.claude/skills/create-adaptable-composable/SKILL.md.
В чём разница между MaybeRef и MaybeRefOrGetter?
MaybeRef — для параметров, которые нужно менять (ref, computed, значение). MaybeRefOrGetter добавляет геттер (функцию), подходит для read-only источников вроде селекторов. Если параметр — колбэк, MaybeRefOrGetter использовать нельзя, чтобы не вызвать функцию случайно.
Когда применять этот скилл?
Когда пишешь composable для библиотеки или компонента, которые разные разработчики будут использовать с разными типами входов — значениями, рефами, computed или геттерами. Скилл гарантирует, что composable будет работать во всех случаях.
Исходный текст
SKILL.md · MIT
---
name: create-adaptable-composable
description: Create a library-grade Vue composable that accepts maybe-reactive inputs (MaybeRef / MaybeRefOrGetter) so callers can pass a plain value, ref, or getter. Normalize inputs with toValue()/toRef() inside reactive effects (watch/watchEffect) to keep behavior predictable and reactive. Use this skill when user asks for creating adaptable or reusable composables.
license: MIT
metadata:
author: github.com/vuejs-ai
version: "17.0.0"
compatibility: Requires Vue 3 (or above) or Nuxt 3 (or above) project
---
# Create Adaptable Composable
Adaptable composables are reusable functions that can accept both reactive and non-reactive inputs. This allows developers to use the composable in a variety of contexts without worrying about the reactivity of the inputs.
Steps to design an adaptable composable in Vue.js:
1. Confirm the composable's purpose and API design and expected inputs/outputs.
2. Identify inputs params that should be reactive (MaybeRef / MaybeRefOrGetter).
3. Use `toValue()` or `toRef()` to normalize inputs inside reactive effects.
4. Implement the core logic of the composable using Vue's reactivity APIs.
## Core Type Concepts
### Type Utilities
```ts
/**
* value or writable ref (value/ref/shallowRef/writable computed)
*/
export type MaybeRef<T = any> = T | Ref<T> | ShallowRef<T> | WritableComputedRef<T>;
/**
* MaybeRef<T> + ComputedRef<T> + () => T
*/
export type MaybeRefOrGetter<T = any> = MaybeRef<T> | ComputedRef<T> | (() => T);
```
### Policy and Rules
- Read-only, computed-friendly input: use `MaybeRefOrGetter`
- Needs to be writable / two-way input: use `MaybeRef`
- Parameter might be a function value (callback/predicate/comparator): do not use `MaybeRefOrGetter`, or you may accidentally invoke it as a getter.
- DOM/Element targets: if you want computed/derived targets, use `MaybeRefOrGetter`.
When `MaybeRefOrGetter` or `MaybeRef` is used:
- resolve reactive value using `toRef()` (e.g. watcher source)
- resolve non-reactive value using `toValue()`
### Examples
Adaptable `useDocumentTitle` Composable: read-only title parameter
```ts
import { watch, toRef } from 'vue'
import type { MaybeRefOrGetter } from 'vue'
export function useDocumentTitle(title: MaybeRefOrGetter<string>) {
watch(toRef(title), (t) => {
document.title = t
}, { immediate: true })
}
```
Adaptable `useCounter` Composable: two-way writable count parameter
```ts
import { watch, toRef } from 'vue'
import type { MaybeRef } from 'vue'
function useCounter(count: MaybeRef<number>) {
const countRef = toRef(count)
function add() {
countRef.value++
}
return { add }
}
```
© github.com/vuejs-ai · MIT · vuejs-ai/skills