К основному содержанию
правило

vue-pinia-cursorrules-prompt-file — правило для Cursor

Задаёт стандарты работы с Pinia и TypeScript во Vue 3: разделение состояния, синтаксис setup-хранилищ, типизацию, SSR и правила персистентности.

Установить в Cursor · Вручную: положить файлы Все способы и платформы ↓
.cursor/rules/vue-pinia-cursorrules-prompt-file.mdc
Открыть на GitHub

Что делает vue-pinia-cursorrules-prompt-file

Правило активируется для файлов **/*.ts и **/*.vue, направляя Cursor на генерацию хранилищ по паттернам Composition API. Оно требует оформлять хранилища через defineStore в формате setup-функций, размещать их по доменам в директории stores/ и возвращать все свойства состояния наружу для работы devtools и SSR.

В компонентах предписано использовать storeToRefs() при деструктуризации состояния и геттеров. Без storeToRefs() реактивность при распаковке потеряется. Серверные данные правило рекомендует отдавать TanStack Query или Nuxt useFetch, не дублируя их в Pinia без необходимости.

Для тестирования компонентов предписано использовать библиотеку @pinia/testing со сбросом экземпляра Pinia между прогонами. Хранилищам запрещено сохранять секреты и токены в браузере, а в SSR-окружении доступ к состоянию вне setup требует явной передачи активного инстанса.

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

  • Вынести общее клиентское состояние из компонентов в модульные setup-хранилища
  • Настроить деструктуризацию стейта через storeToRefs() без потери реактивности
  • Изолировать серверные данные от Pinia с помощью TanStack Query или useFetch
  • Предотвратить утечки синглтонов между запросами в SSR и Nuxt

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

  • Создай хранилище корзины в stores/cart.ts на setup-синтаксисе Pinia с типизацией строк заказа
  • Напиши компонент с вызовом useCartStore, деструктуризацией через storeToRefs и кнопкой очистки
  • Добавь юнит-тест экшена для хранилища с использованием @pinia/testing

Как установить vue-pinia-cursorrules-prompt-file

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

.cursor/rules/vue-pinia-cursorrules-prompt-file.mdc

Во frontmatter: description, globs, alwaysApply

По шагам, с командами для каждой платформы: Cursor rules: файлы .mdc, четыре режима и замена .cursorrules

Вопросы о vue-pinia-cursorrules-prompt-file

Как установить vue-pinia-cursorrules-prompt-file в Cursor?

Создайте файл .cursor/rules/vue-pinia-cursorrules-prompt-file.mdc в корне проекта и скопируйте в него содержимое правила. Cursor применит его к коду в файлах .ts и .vue.

Что делает vue-pinia-cursorrules-prompt-file?

Правило инструктирует ассистента в Cursor писать предсказуемый код на Vue 3 с Pinia. Оно задаёт правила типизации, чистых геттеров, безопасной работы в SSR и ограничения на хранение чувствительных данных.

Почему правило запрещает прямо деструктурировать стейт хранилища?

Прямая распаковка свойств ломает реактивные связи ref. Инструкция требует оборачивать стейт и геттеры в storeToRefs(), сохраняя прямую деструктуризацию только для экшенов.

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

vue-pinia-cursorrules-prompt-file.mdc · CC0-1.0
---
description: "Vue 3 and TypeScript state management guidance for Pinia stores, Composition API usage, SSR, persistence, and testing."
globs: **/*.ts, **/*.vue
alwaysApply: false
---
You are an expert in Vue 3, TypeScript, and Pinia state management.

# Vue + Pinia Guidelines

## State Ownership
- Keep component-only state in the component with `ref`, `reactive`, or `computed`.
- Use Pinia for shared client state that spans routes, layouts, or unrelated component trees.
- Use route params and query strings for shareable navigation state.
- Use Nuxt `useFetch` / `useAsyncData`, TanStack Query for Vue, or the existing API layer for server state.
- Do not copy server cache data into Pinia unless it is an intentional editable draft, offline cache, or workflow snapshot.

## Store Structure
- Prefer setup stores with `defineStore('name', () => { ... })` for Vue 3 Composition API projects.
- Use one store file per domain under `stores/`, such as `stores/cart.ts` or `stores/session.ts`.
- Keep state, computed getters, and actions together when they represent one cohesive domain.
- Return every state property from setup stores so Pinia can track it for devtools, SSR, and plugins.
- Keep getters pure and side-effect free; put writes, I/O, and orchestration in actions.

```ts
import { computed, ref } from 'vue'
import { defineStore } from 'pinia'

interface CartLine {
  id: string
  name: string
  quantity: number
  unitPrice: number
}

export const useCartStore = defineStore('cart', () => {
  const lines = ref<CartLine[]>([])

  const itemCount = computed(() =>
    lines.value.reduce((total, line) => total + line.quantity, 0),
  )

  function addLine(line: CartLine) {
    const existing = lines.value.find((item) => item.id === line.id)
    if (existing) {
      existing.quantity += line.quantity
      return
    }
    lines.value.push(line)
  }

  function clearCart() {
    lines.value = []
  }

  return {
    lines,
    itemCount,
    addLine,
    clearCart,
  }
})
```

## Component Usage
- Call stores at the top of `<script setup>` or inside setup functions, getters, and actions.
- Use `storeToRefs()` when destructuring store state or getters in components.
- Destructure actions directly when useful; actions remain bound to the store.
- Avoid writing large business workflows in components; move them to store actions or composables.
- Prefer computed values over watchers when deriving state.

```vue
<script setup lang="ts">
import { storeToRefs } from 'pinia'
import { useCartStore } from '@/stores/cart'

const cart = useCartStore()
const { itemCount } = storeToRefs(cart)
const { clearCart } = cart
</script>

<template>
  <button type="button" :disabled="itemCount === 0" @click="clearCart">
    Clear cart
  </button>
</template>
```

## TypeScript
- Type store state, action payloads, and API responses explicitly.
- Avoid `any`; use `unknown` and narrow external inputs before committing them to state.
- Use interfaces for object state that is shared across components or API boundaries.
- Prefer discriminated unions for workflow status and error state.
- Keep store IDs stable and descriptive because they appear in devtools and persistence keys.

## Actions and Side Effects
- Actions may be sync or async; keep each action focused on one user or domain workflow.
- Validate action inputs at the boundary before mutating store state.
- Represent async workflows with explicit `status`, `error`, and `lastUpdatedAt` fields when the UI depends on them.
- Reset stale errors before retrying an async action.
- Keep subscriptions, intervals, sockets, and browser listeners outside stores unless the store owns their lifecycle and cleanup.

## SSR, Nuxt, and Router Guards
- In SSR contexts, use the store inside setup, getters, or actions so Pinia can resolve the active app instance.
- When using a store outside setup, such as in a router guard, pass the active Pinia instance if the framework requires it.
- Do not read browser-only storage during server rendering.
- In Nuxt, prefer the Nuxt Pinia integration and SSR-safe composables for data fetching.
- Avoid singleton state leaks across requests by relying on the framework-created Pinia instance.

## Persistence
- Persist only the fields that must survive reloads, such as preferences or incomplete local drafts.
- Never persist secrets, access tokens, refresh tokens, raw PII, or authorization decisions in browser storage.
- Use field allowlists and versioned migrations for persisted store schemas.
- Treat persisted state as untrusted input and validate it before using it for critical workflows.
- Account for hydration timing before rendering UI that depends on persisted values.

## Testing and Tooling
- Use `@pinia/testing` for component tests that need stores.
- Test store actions directly for domain behavior and edge cases.
- Reset Pinia between tests to avoid shared state leakage.
- Add HMR support with `acceptHMRUpdate()` in stores when the project uses Vite HMR patterns.
- Keep stores easy to inspect in Vue Devtools by using clear state names and focused stores.

## Anti-Patterns
- Do not use Pinia as a dumping ground for every reactive value.
- Do not destructure state directly from a store without `storeToRefs()`.
- Do not mutate props or route objects through store actions.
- Do not put server-only objects, request instances, DOM nodes, or timers in store state.
- Do not create circular reads between stores in setup functions; compose stores through actions or computed values instead.

© PatrickJS · CC0-1.0 · PatrickJS/awesome-cursorrules

Похожие правила IDE

Все правила IDE по теме «Фронтенд и UI» →
winui3 официальный github Правило задаёт рекомендации для WinUI 3 и Windows App SDK: от XAML и потоков до окон и MVVM. Пригодится, чтобы Copilot учитывал особенности настольных приложений Windows. ★ 40 451звёзд репо vue официальный github Правило задаёт Copilot стандарты Vue 3: Composition API, <script setup>, реактивность, Pinia и Vue Router. Пригодится, когда агент пишет компоненты в вашем стиле. ★ 40 451звёзд репо tanstack-start-shadcn-tailwind официальный github Правило задаёт Copilot стек TanStack Start, Shadcn/ui и Tailwind CSS и требует валидировать внешние данные через Zod. ★ 40 451звёзд репо tailwind-v4-vite официальный github Правило помогает подключить Tailwind CSS v4 к проекту на Vite через официальный плагин. Пригодится и для новой установки, и при переходе с v3. ★ 40 451звёзд репо svelte официальный github Направляет GitHub Copilot на стандарты Svelte 5 и SvelteKit 2: руны вместо старых сторов, типизация компонентов и безопасная работа с SSR. ★ 40 451звёзд репо power-bi-custom-visuals-development официальный github Правило для GitHub Copilot, которое подсказывает агенту, как писать кастомные визуалы Power BI на React, D3.js и TypeScript. ★ 40 451звёзд репо

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

Весь набор →
webassembly-z80-cellular-automata-cursorrules-prom Правило для Cursor, которое ведёт агента при добавлении сетки регионов в симуляцию клеточных автоматов на Z80 и WebAssembly. ★ 41 024звёзд репо web-app-optimization-cursorrules-prompt-file Набор инструкций для Cursor по разработке веб-приложений на Svelte 5 и SvelteKit с акцентом на производительность и руны. ★ 41 024звёзд репо vue3-composition-api-cursorrules-prompt-file Правило задаёт рекомендации для разработки на Vue 3 с Composition API: от реактивного состояния до структуры проекта. Пригодится, чтобы Cursor учитывал эти практики при работе с файлами. ★ 41 024звёзд репо vue Правило для Cursor задаёт агенту стиль работы с Vue: Composition API, Pinia, типизация и маршрутизация. Пригодится, когда в проекте уже есть .vue и .ts. ★ 41 024звёзд репо vue-claude-stack Правило задаёт стиль генерации кода для Vue 3 и Nuxt 3: Composition API, TypeScript и Pinia. Пригодится, чтобы направлять агента по единым правилам проекта. ★ 41 024звёзд репо vue-3-nuxt-3-typescript-cursorrules-prompt-file Правило для Cursor задаёт агенту стиль кода на Vue 3 и Nuxt 3: Composition API, TypeScript-интерфейсы, конвенции Nuxt. Пригодится, когда проект уже на этом стеке и не хочется каждый раз объяснять структуру. ★ 41 024звёзд репо vue-3-nuxt-3-development-cursorrules-prompt-file Правило задаёт стандарты для фронтенда на Vue 3 и Nuxt 3 в Cursor. Ассистент составляет псевдокод до написания кода, использует Composition API и оформляет разметку только через Tailwind. ★ 41 024звёзд репо vscode-extension-dev-typescript-cursorrules-prompt-file Задаёт рекомендации для разработки расширений VS Code на TypeScript: от структуры проекта и манифеста до тестов и обработки ошибок. ★ 41 024звёзд репо

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

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