NE

new-composable

Standardized generator for Vue 3 composables, enforcing file structure and state management conventions.

Install

mkdir -p .claude/skills/new-composable && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/16471" && unzip -o skill.zip -d .claude/skills/new-composable && rm skill.zip

Installs to .claude/skills/new-composable

Activation

This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.

Use this skill when the user asks to create a new composable (useX) for the TrackGrowth app — reusable reactive logic such as frequency evaluation, streak calculation, theme, or backup. Triggers on "criar composable", "novo composable", "new composable", "useX".
262 chars✓ has a “when” triggerlonger than Claude Code's old 250-char listing cap (fine on current versions)
Intermediate

Key capabilities

  • Create new composables for the TrackGrowth app
  • Decide between a composable and a Pinia store
  • Structure `index.ts` for a composable
  • Extract pure business logic to `src/utils/`
  • Create tests for composables

How it works

This skill guides the creation of new Vue composables by defining file location, structure, and testing requirements. It also helps in deciding whether a Pinia store is a more appropriate solution.

Inputs & outputs

You give it
A request to create reusable reactive logic for the TrackGrowth app
You get back
A new composable file structure including `index.ts` and `tests/useX.spec.ts`

When to use new-composable

  • Generate a new reactive composable
  • Standardize composable structure for TrackGrowth app
  • Decide between Pinia store and Vue composable

About this skill

Criar novo composable

Segue as convenções documentadas em docs/context/06-file-structure-conventions.md e docs/context/05-architecture.md (divisão Pinia vs useStorage).

Passos

  1. Local do arquivo: pasta própria src/composables/useX/, nome em camelCase prefixado com use (ex: composables/useHabitFrequency/, composables/useStreak/), contendo:

    composables/
      useX/
        index.ts
        tests/
          useX.spec.ts
        models/          # opcional, só se houver tipos locais ao composable
    
  2. Antes de criar, decida se é realmente um composable ou deveria ser um store Pinia (use a skill /new-store nesse caso):

    • Composable: lógica reativa reutilizável sem necessidade de estado compartilhado entre componentes distantes na árvore, ou wrapper fino sobre useStorage do VueUse para uma preferência simples de UI (tema, filtro selecionado).
    • Store Pinia: dados de domínio que precisam ser acessados/mutados por múltiplos componentes não relacionados (hábitos, check-ins, tags, gamificação).
  3. Estrutura do index.ts:

    import { computed, ref } from "vue";
    
    export function useX() {
      const state = ref();
    
      const derived = computed(() => {
        // lógica derivada
      });
    
      function action() {
        // lógica de ação
      }
    
      return { state, derived, action };
    }
    
    • Se o composable envolve lógica de negócio pura (cálculo de streak, avaliação de FrequencyRule), extraia a função pura para src/utils/ (ex: frequency-evaluator.ts) e deixe o composable como uma casca reativa fina em cima dela — facilita testar a lógica isoladamente sem montar um componente Vue.
    • Se o composable precisa de tipos próprios além dos já definidos em src/types/, adicione-os lá, não inline no composable.
  4. Composables de preferência de UI (ex: useTheme): usar useStorage do VueUse diretamente, com uma chave de localStorage clara e namespaced (ex: trackgrowth:theme), para não colidir com as chaves usadas pelo pinia-plugin-persistedstate dos stores de domínio.

  5. Após criar index.ts, criar tests/useX.spec.ts cobrindo o estado/derivações/ações expostos — não é opcional. Depois, rode yarn lint:fix.

O que não fazer

  • Não crie um composable que só reexporta um store Pinia sem adicionar lógica — importe o store diretamente no componente nesse caso.
  • Não guarde dados de domínio (hábitos, check-ins) dentro de um composable com useStorage — isso é responsabilidade dos stores Pinia persistidos, que oferecem getters/ações compartilhados.

When not to use it

  • Creating a composable that only re-exports a Pinia store
  • Storing domain data within a composable using `useStorage`
  • When the logic requires shared state between distant components

Limitations

  • Do not create a composable that only reexports a Pinia store without adding logic.
  • Do not store domain data (habits, check-ins) within a composable with `useStorage`.
  • If the composable needs its own types, add them to `src/types/`, not inline.

How it compares

This skill provides a structured approach to creating composables within the TrackGrowth app, ensuring adherence to architectural conventions and test coverage, unlike ad-hoc composable creation.

Compared to similar skills

new-composable side by side with the closest alternatives in the catalog.

SkillInstallsUpdatedSafetyDifficulty
new-composable (this skill)01moNo flagsIntermediate
vue-best-practices195moNo flagsIntermediate
vue-testing-best-practices56moNo flagsIntermediate
vue-debug-guides46moNo flagsIntermediate

Try saying

Example prompts that trigger this skill in your AI assistant.

Search skills

Search the agent skills registry