Agent skill

Vue3 Architecture

by karlomikus in karlomikus/vue-salt-rim

Generate Vue 3 Composition API code following this project's functional-core/imperative-shell architecture.

MITAuto-check passedBackend & APIs

Install Vue3 Architecture

skills CLI
$ npx skills add karlomikus/vue-salt-rim --skill vue3-architecture -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install karlomikus/vue-salt-rim vue3-architecture --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/karlomikus/vue-salt-rim.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/vue3-architecture .claude/skills/vue3-architecture && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
vue3-architecture
GitHub stars
150
Token cost
~2.3k tokens
SKILL.md length
512 words
Files
1
Skills in repo
1
Repo updated
First seen
Licence
MIT

At a glance

Generate Vue 3 Composition API code following this project's functional-core/imperative-shell architecture.

  • Works in 6 steps: Identify Domain Placement → TypeScript Types → API Client (Imperative Shell) → …
  • Tasks that involve REST APIs
  • SKILL.md covers When to Use This Skill, Architecture Overview, Step-by-Step Workflow for New… and File Naming Conventions
  • Instructions only: no scripts, shell commands, URLs or credentials in SKILL.md

What it does

Vue3 Architecture is an agent skill from karlomikus/vue-salt-rim. Generate Vue 3 Composition API code following this project's functional-core/imperative-shell architecture. Use for new features, components, composables, or API endpoints.

Its SKILL.md is about 2.3k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Backend & APIs, covering REST APIs. It works with Vue.js. The repository describes itself as: Salt Rim is a Vue based web client used for connecting to Bar Assistant server instance. The licence is MIT.

When your agent uses it

  • Tasks that involve REST APIs

Example prompts

  • “/vue3-architecture”

Workflow steps

6 steps, taken from the step headings in SKILL.md.

  1. Identify Domain Placement
  2. TypeScript Types
  3. API Client (Imperative Shell)
  4. Composable (Functional Core)
  5. Smart Component (Orchestration)
  6. View Shell

What it can do on your machine

Read from SKILL.md and the folder at commit bcbb8d7. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    No scripts in the folder and no shell commands in SKILL.md (its code samples are typescript and vue).

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Vue3 Architecture loads about 2.3k tokens when it runs. Until then it costs about 48 tokens; SKILL.md has 512 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~48
When it runs · the whole SKILL.md, loaded when a task matches
~2.3k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from karlomikus/vue-salt-rim at commit bcbb8d7, republished under its MIT licence (© karlomikus). 512 words, ~2,283 tokens.

Download SKILL.mdSave it as .claude/skills/vue3-architecture/SKILL.md (or your agent's skills folder).
name
vue3-architecture
description
Generate Vue 3 Composition API code following this project's functional-core/imperative-shell architecture. Use for new features, components, composables, or API endpoints.

Vue 3 Architecture — Functional Core, Imperative Shell

When to Use This Skill

Use this skill whenever the user asks you to:

  • Create a new feature, component, view, or composable
  • Add a new API endpoint integration
  • Refactor existing code to match the project's architecture
  • Wire up a new data flow (API → state → UI)

Architecture Overview

This project follows a functional core, imperative shell pattern with four layers:

┌─────────────────────────────────────────┐
│  Views (src/views/)                     │  Ultra-thin: imports a component,
│  Route orchestration only               │  wraps in <main>, nothing more
├─────────────────────────────────────────┤
│  Smart Components (src/components/)     │  Imports composables, wires state
│  Orchestration + lifecycle + handlers   │  to templates via event handlers
├─────────────────────────────────────────┤
│  Composables (src/composables/)         │  Functional core: ref/reactive/
│  Reactive state, readonly exposure,     │  computed with explicit mutation
│  error handling, loading state          │  methods. NO raw DOM access.
├─────────────────────────────────────────┤
│  API Client (src/api/)                  │  Imperative shell: raw HTTP via
│  + AppState (src/AppState.ts)           │  openapi-fetch. Type-safe, has
│  Side effects: network, localStorage    │  middleware (auth, error, bar-id)
└─────────────────────────────────────────┘
Key Principles
  1. Readonly exposure: Composables expose state as readonly(ref) — mutations only happen through explicit method calls, never by direct assignment from consumers.
  2. Smart components orchestrate: Components import composables and AppState, handle onMounted, wire event handlers to composable methods. They never call BarAssistantClient directly.
  3. Views are shells: Views only import a smart component and render it. No data fetching, no composables, no lifecycle hooks.
  4. API client is imperative shell: BarAssistantClient has zero reactive state. It's a static class of pure async functions that do I/O.
  5. AppState is plain class (not Pinia): AppState extends class with localStorage persistence, accessed via useAppState() singleton composable.

Step-by-Step Workflow for New Features

When building a new feature, execute in this exact order:

Step 1: Identify Domain Placement

Determine where the files live:

  • API methods → src/api/BarAssistantClient.ts (add static methods)
  • Reactive logic → src/composables/<domain>/use<Feature>.ts (new composable)
  • Orchestration → src/components/<Domain>/<Feature>.vue (smart component)
  • View shell → src/views/<Feature>View.vue (if it's a new route)
Step 2: TypeScript Types

Types come from the generated API schema (src/api/api.d.ts). Import with:

typescript
import type { components } from '@/api/api';
export type SomeType = components['schemas']['SomeType'];

If new types are needed beyond the API schema, define them in the composable file alongside the imported types.

Step 3: API Client (Imperative Shell)

Add static methods to BarAssistantClient. Each method:

  • Uses client.VERB() from openapi-fetch (already configured)
  • Returns raw data from the response
  • Has zero reactive state
  • For POST that creates: extract ID from Location header via extractIdFromLocationHeader
typescript
static async getSomething(query = {}) {
    return (await client.GET('/something', { params: { query } })).data;
}

static async saveSomething(body: components['schemas']['SomethingRequest']) {
    const { response } = await client.POST('/something', { body, parseAs: 'stream' });
    return extractIdFromLocationHeader(response);
}

static async deleteSomething(id: number) {
    return (await client.DELETE('/something/{id}', { params: { path: { id } } })).data;
}
Show full SKILL.md (219 more words)Show less
Step 4: Composable (Functional Core)

Create src/composables/<domain>/use<Feature>.ts. Every composable follows this template:

typescript
import { ref, readonly, computed } from 'vue';
import BarAssistantClient from '@/api/BarAssistantClient';
import type { components } from '@/api/api';
import { useSaltRimToast } from '@/composables/toast';
import { useI18n } from 'vue-i18n';

export type SomeType = components['schemas']['SomeType'];

export function useSomeFeature() {
    // Reactive state
    const items = ref<SomeType[]>([]);
    const isLoading = ref(false);
    
    // Dependencies
    const toast = useSaltRimToast();
    const { t } = useI18n();

    // Mutations (the ONLY way state changes)
    async function fetchItems() {
        isLoading.value = true;
        try {
            items.value = (await BarAssistantClient.getSomething())?.data || [];
        } finally {
            isLoading.value = false;
        }
    }

    async function deleteItem(id: number) {
        isLoading.value = true;
        try {
            await BarAssistantClient.deleteSomething(id);
            items.value = items.value.filter(item => item.id !== id);
            toast.default(t('domain.delete-success'));
        } catch (e: any) {
            toast.error(e.message);
        } finally {
            isLoading.value = false;
        }
    }

    // Derived state
    const activeItems = computed(() => items.value.filter(i => i.status === 'active'));

    // Return: readonly state + mutation methods
    return {
        items: readonly(items),
        isLoading: readonly(isLoading),
        activeItems,
        fetchItems,
        deleteItem,
    };
}

Critical rules for composables:

  • Expose state as readonly(ref) — consumers cannot mutate directly
  • All mutations happen through named async functions
  • Use try/catch with toast for error feedback
  • Import useI18n for translatable strings via t()
  • Put composable in a subdirectory matching the domain (e.g., composables/bar/useBars.ts)
  • The only time it is perfectly acceptable to expose a fully mutable ref from a composable is when writing a utility specifically designed to manage ephemeral, isolated form state (e.g., a useForm validation utility).
Step 5: Smart Component (Orchestration)

Create src/components/<Domain>/<Feature>.vue. This is the orchestration layer:

vue
<script setup lang="ts">
import { ref, computed, onMounted } from 'vue';
import { useI18n } from 'vue-i18n';
import { useSomeFeature } from '@/composables/domain/useSomeFeature';
import { useAppState } from '@/composables/useAppState';
import { useConfirm } from '@/composables/confirm';
import { useSaltRimToast } from '@/composables/toast';
import ChildPresentationalComponent from '@/components/Domain/ChildPresentational.vue';

// Composables
const { t } = useI18n();
const appState = useAppState();
const toast = useSaltRimToast();
const confirm = useConfirm();
const { items, isLoading, fetchItems, deleteItem } = useSomeFeature();

// Local refs
const showDialog = ref(false);

// Lifecycle
onMounted(() => {
    fetchItems();
});

// Event handlers — these call composable methods, never BarAssistantClient directly
function handleDelete(id: number) {
    confirm.show(t('domain.confirm-delete'), {
        onResolved: async (dialog: { close: () => void }) => {
            await deleteItem(id);
            dialog.close();
        },
    });
}
</script>

<template>
    <PageHeader>{{ t('domain.title') }}</PageHeader>
    <div>
        <OverlayLoader v-if="isLoading" />
        <ChildPresentational 
            v-for="item in items" 
            :key="item.id" 
            :item="item"
            @delete="handleDelete(item.id)" 
        />
    </div>
</template>

Critical rules for smart components:

  • Import composables and AppState — never call BarAssistantClient directly
  • Handle onMounted to trigger initial data fetch
  • Wire event handlers to composable methods
  • Use useConfirm() for destructive actions
  • Use useSaltRimToast() only via composable methods (already handled inside composable)
  • Form submission handlers: optimistic updates are OK, but revert on API failure
Step 6: View Shell

Create src/views/<Feature>View.vue. This is always ultra-thin:

vue
<script setup lang="ts">
import FeatureComponent from '@/components/Domain/Feature.vue';
</script>

<template>
    <main>
        <FeatureComponent />
    </main>
</template>

Views must:

  • Only import and render one smart component
  • Never import composables, AppState, or API client
  • Never have onMounted or lifecycle hooks
  • Never fetch data

File Naming Conventions

LayerPatternExample
API client methodscamelCase verbsgetBars(), saveBar(), deleteBar()
Composablesuse<Feature>.tsuseBars.ts, useAuth.ts
Smart componentsPascalCase .vueBarIndex.vue, CocktailRecipeCard.vue
ViewsPascalCase + View suffixBarsView.vue, CocktailsFormView.vue

© karlomikus, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in .agents/skills/vue3-architecture of karlomikus/vue-salt-rim.

Open the folder on GitHubat commit bcbb8d7

Compare with similar skills

Vue3 Architecture next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Vue3 Architecture compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Vue3 Architecture this skillkarlomikus/vue-salt-rim150—~2.3kAutomated safety check: PassMIT
Databuddydatabuddy-analytics/Databuddy1.2k—~2.1kAutomated safety check: PassAGPL-3.0
Projectlin-97/gi-demo188—~1.4kAutomated safety check: NotesApache-2.0
Workflow AI Codingw8123/EnterpriseAgentFramework865—~3.7kAutomated safety check: PassMIT
Store Submitzhitongblog/solomd1.2k—~1.7kAutomated safety check: NotesMIT
Project GeneratorLeoYeAI/openclaw-master-skills2.2k—~4.5kAutomated safety check: PassMIT

Similar skills

  • Databuddy

    databuddy-analytics/Databuddy

    Integrate Databuddy analytics using the SDK, REST API, or MCP.

    1.2k GitHub stars~2.1k tokensUpdated today
    Backend & APIsAuto-check passed
  • Project

    lin-97/gi-demo

    后台管理模板的项目总览与前端强制规范。涵盖 Vue 3 + Arco Design + Gi 组件库、目录结构、自动导入、CRUD/API 约定与代码风格。在当前仓库内开发、新增页面、查阅架构或不确定项目规范时使用。

    188 GitHub stars~1.4k tokensUpdated 4 mo ago
    Backend & APIsAuto-check: notes
  • Workflow AI Coding

    w8123/EnterpriseAgentFramework

    Edit, validate, debug, publish, and inspect ReachAI Workflow drafts through the Workflow AI Coding REST API.

    865 GitHub stars~3.7k tokensUpdated 4 days ago
    AI & LLM EngineeringAuto-check passed
  • Store Submit

    zhitongblog/solomd

    Publish a SoloMD release to the stores that have no usable submission API — Google Play Console and Microsoft Partner Center — by driving them through the local Unzoo Browser REST API.

    1.2k GitHub stars~1.7k tokensUpdated yesterday
    DevelopmentAuto-check: notes
  • Project Generator

    LeoYeAI/openclaw-master-skills

    Automatically transform requirement documents or natural language descriptions into complete full-stack projects (Java backend + Vue frontend) with MANDATORY interactive tech stack selection.

    2.2k GitHub stars~4.5k tokensUpdated 2 mo ago
    DevelopmentAuto-check passed
  • Figma To Static

    LeoYeAI/openclaw-master-skills

    Convert Figma design files to pixel-level mobile-first static HTML/CSS pages.

    2.2k GitHub stars~7.1k tokensUpdated 2 mo ago
    Frontend & DesignAuto-check passed

Works with

Categories

Questions about Vue3 Architecture

What does Vue3 Architecture do?

Generate Vue 3 Composition API code following this project's functional-core/imperative-shell architecture. Vue3 Architecture is an agent skill from karlomikus/vue-salt-rim. Generate Vue 3 Composition API code following this project's functional-core/imperative-shell architecture.

When should I use Vue3 Architecture?

Vue3 Architecture fits situations like: tasks that involve REST APIs.

How do I install Vue3 Architecture in Claude Code?

Run `npx skills add karlomikus/vue-salt-rim --skill vue3-architecture -a claude-code`. Or copy the skill folder (.agents/skills/vue3-architecture in karlomikus/vue-salt-rim) into .claude/skills/vue3-architecture in your project. Claude Code loads it when a task matches its description.

How do I install Vue3 Architecture in Codex?

Run `npx skills add karlomikus/vue-salt-rim --skill vue3-architecture -a codex`. Or copy the skill folder (.agents/skills/vue3-architecture in karlomikus/vue-salt-rim) into .agents/skills/vue3-architecture in your project. Codex loads it when a task matches its description.

Can I use Vue3 Architecture in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add karlomikus/vue-salt-rim --skill vue3-architecture -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/vue3-architecture, .gemini/skills/vue3-architecture, .github/skills/vue3-architecture and .opencode/skills/vue3-architecture in your project.

What does Vue3 Architecture need to run?

SKILL.md names no scripts, command-line tools or credentials: Vue3 Architecture is instructions for the agent only.

Does Vue3 Architecture access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is Vue3 Architecture safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Vue3 Architecture use?

Vue3 Architecture is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Vue3 Architecture use?

About 2.3k tokens (SKILL.md is roughly 9.1k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Vue3 Architecture?

Skills that share tags, products or a category with Vue3 Architecture: Databuddy (databuddy-analytics/Databuddy, 1.2k stars), Project (lin-97/gi-demo, 188 stars), Workflow AI Coding (w8123/EnterpriseAgentFramework, 865 stars) and Store Submit (zhitongblog/solomd, 1.2k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Vue3 Architecture?

karlomikus (a GitHub user) maintains it in karlomikus/vue-salt-rim, which has 150 GitHub stars. The repository was last updated on October 3, 2026.

Source: karlomikus/vue-salt-rim on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.