frontend-development — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited frontend-development (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Next.js 16 (App Router, Turbopack), React 19, Tailwind CSS v4, Zustand 5, TanStack Query v5, react-hook-form + Zod 4, TypeScript strict mode.
Use @/ path alias for src/: @/lib/supabase, @/components/Button.
Mark interactive/stateful components with 'use client'. Default is server component.
Tailwind CSS v4 with @theme tokens in src/app/globals.css:
@import 'tailwindcss';
@theme {
--color-cream: #FCFAF7;
--color-slate-deep: #1B2030;
--color-emerald-glow: #10B981;
}Add new design tokens in @theme, not in config files.
Three clients for different contexts:
| Import | Use for | Context |
|---|---|---|
@/lib/supabase | General public queries | Client, graceful fallback if env missing |
@/lib/supabase-browser | Auth flows (login, signup) | Client ('use client') |
@/lib/supabase-admin | Admin operations | Server-only, createAdminClient() |
// Client component — auth flow
import { supabaseBrowser } from '@/lib/supabase-browser';
// Server component / action — admin
import { createAdminClient } from '@/lib/supabase-admin';
const supabase = createAdminClient();Zustand with persist middleware. Use partialize to persist only selected fields:
import { create } from 'zustand';
import { persist } from 'zustand/middleware';
export const useMyStore = create(
persist(
(set) => ({
value: '',
setValue: (v: string) => set({ value: v }),
}),
{ name: 'my-store', partialize: (s) => ({ value: s.value }) }
)
);Composed in src/app/layout.tsx. Order: QueryProvider → PostHogProvider → children. Add new providers inside QueryProvider.
Use react-hook-form + @hookform/resolvers + Zod for validation:
import { useForm } from 'react-hook-form';
import { zodResolver } from '@hookform/resolvers/zod';
import { z } from 'zod';
const schema = z.object({ email: z.string().email() });
const { register, handleSubmit } = useForm({
resolver: zodResolver(schema),
});Public: NEXT_PUBLIC_*. Server-only: no prefix (e.g. SUPABASE_SERVICE_ROLE_KEY).
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.