frontend

A set of rules for building and testing Vue frontend code with TypeScript, Tailwind, DaisyUI, Vitest, and a generated backend client.

In plain words
What is it for?
Use it when creating Vue components, connecting backend requests, adding modals or icons, writing tests, or running frontend checks.
Why use it?
It keeps components, API calls, styling, routing, dialogs, and tests consistent across the frontend.

Cursor rule for Cursor

Install

Getting it into your agent

One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.

agentmods
npx agentmods add rules/nerds-odd-e/doughnut/frontend
Clone the repo
git clone --depth 1 https://github.com/nerds-odd-e/doughnut

Made for: Cursor.

Per session 28 Only the description is in the session, so the agent can decide to use it. The body loads when it is invoked.
When invoked 635 The whole file, excluding the scripts and references it only reads on demand.
Security scan A 0 findings. Scan, not verified.
Origin original No closer match found in the catalogue.
Token cost

What it costs to keep this loaded

Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.

ModelPer sessionOnce invoked
Fable 5 $0.00028 $0.00635
Opus 5 $0.00014 $0.00318
Sonnet 5 $0.00006 $0.00127
Haiku 4.5 $0.00003 $0.00064

Measured 2d ago against content hash 2ae8fb0f18fe, method: parsed. Prices are Anthropic first-party input rates as of 2026-08-30, from the pricing page.

Security

Grade A, and why

frontend scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 2d ago.

A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.

Nothing flagged

None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.

.cursor/rules/frontend.mdc · 38 lines

How it starts

The opening of the file, as written. The whole thing — 38 lines — stays where its author put it; the contents beside it link to each section on GitHub.

Frontend

Vue 3 + TypeScript in frontend/src/. Tests in frontend/tests/. Import the backend client from @generated/donut-backend-api/sdk.gen.

Cursor auto-attaches frontend-component.mdc, frontend-testing.mdc, frontend-api.mdc, and frontend-storybook.mdc when matching files are in context — do not fetch them up front. Lint: linting_formating.mdc.

Commands

CURSOR_DEV=true nix develop -c pnpm frontend:test

Spec paths are relative to frontend/. Do not pass -- before the path (Vitest skips file filtering). Prefer the full frontend unit suite; a single file only while iterating on that file.

Components

  • <script setup lang="ts">. PascalCase .vue files; tests ComponentName.spec.ts.
  • DaisyUI uses the daisy- prefix (daisy-btn, daisy-card). Unprefixed Tailwind utilities. No Bootstrap. Scoped SCSS. Lucide via @lucide/vue (currentColor, :size or Tailwind size-*).
  • Derived state: computed, not a ref that mirrors props/store. ref only for owned mutable state (input, toggles).
  • Modals: Modal from @/components/commons/Modal.vue. In tests, query document.querySelector("dialog").
  • Routing: name and params (helpers such as noteShowLocation); href only via noteShowHref (compiled from the named location). ADR 0005.

API

User actions: apiCallWithLoading(() => Controller.method(...)) from @/managedApi/clientSetup. Wrapped { data, error, request, response }. Check !error before using data. Silent refresh: call the SDK directly (no loading bar or error toast).

{ blockUi: true } for a whole-UI blocker. { blockUi: true, cancelable: true } only for allowlisted read-only sites gated by frontend/tests/managedApi/cancelableAllowlist.spec.ts. Do not opt mutations into cancelable. Do not add component-local LoadingModal refs.

Loading UI that means unfinished work marks data-app-busy (LoadingThinBar, ContentLoader, LoadingModal). E2E: waitUntilAppIsNotBusy(). Validation 400: toOpenApiError(error).

Read the full file on GitHub · 38 lines

Changes

What this file has done since we first saw it

Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.

  1. 2d ago First seen · 38 lines · 28 tokens per session scan A 2ae8fb0f18fe

Subscribe to this mod's changes

frontend is a cursor rule published in the GitHub repository nerds-odd-e/doughnut (49 stars, last pushed 2d ago), licensed MIT. It adds 28 tokens to every session and 635 once invoked, about $0.0001 per session on Opus 5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-30.