scaffolding-react-components — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited scaffolding-react-components (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.
Gather from user:
src/components/, app/components/, or feature folderDerive file paths:
src/components/Button/
├── Button.tsx
├── Button.module.css
├── Button.test.tsx
├── Button.stories.tsx
└── index.tsStyling approach:
ls src/**/*.module.css src/**/*.module.scss 2>/dev/null | head -1 && echo "CSS Modules"
ls src/**/*.styled.ts src/**/*.styles.ts 2>/dev/null | head -1 && echo "Styled Components"
npm ls tailwindcss 2>/dev/null && echo "Tailwind CSS"Test framework:
npm ls jest vitest @testing-library/react 2>/dev/nullStorybook:
ls .storybook/main.* 2>/dev/null && echo "Storybook configured"Barrel exports:
ls src/components/index.ts 2>/dev/null && echo "Uses barrel exports"Use the standard FC structure with TypeScript:
FC<Props> or forwardRef for DOM accessSee component-templates.md for full templates including:
Use design tokens for consistency:
.root {
padding: var(--spacing-md, 1rem);
border-radius: var(--radius-md, 0.5rem);
background-color: var(--color-primary, #3b82f6);
}
[data-disabled="true"] {
opacity: 0.5;
cursor: not-allowed;
}Use Testing Library with Vitest/Jest:
import { render, screen, fireEvent } from "@testing-library/react";
import { describe, it, expect, vi } from "vitest";
import { ComponentName } from "./ComponentName";
describe("ComponentName", () => {
it("renders children", () => {
render(<ComponentName>Hello</ComponentName>);
expect(screen.getByText("Hello")).toBeInTheDocument();
});
it("handles click when not disabled", () => {
const onClick = vi.fn();
render(<ComponentName onClick={onClick}>Click me</ComponentName>);
fireEvent.click(screen.getByText("Click me"));
expect(onClick).toHaveBeenCalledOnce();
});
});See testing.md for user events, async testing, context, and hooks testing.
Use CSF3 format for Storybook 7+:
import type { Meta, StoryObj } from "@storybook/react";
import { ComponentName } from "./ComponentName";
const meta: Meta<typeof ComponentName> = {
title: "Components/ComponentName",
component: ComponentName,
tags: ["autodocs"],
argTypes: {
variant: { control: "select", options: ["primary", "secondary"] },
},
};
export default meta;
type Story = StoryObj<typeof meta>;
export const Primary: Story = {
args: { children: "Primary Button", variant: "primary" },
};See storybook.md for decorators, play functions, and MDX docs.
index.ts:
export { ComponentName } from "./ComponentName";
export type { ComponentNameProps } from "./ComponentName";Update parent barrel (if exists):
// src/components/index.ts
export * from "./ComponentName";Compound components:
export const Card = Object.assign(CardRoot, {
Header: CardHeader,
Body: CardBody,
});Polymorphic component:
interface BoxProps<T extends React.ElementType = "div"> {
as?: T;
}Context provider:
const Context = createContext<Value | null>(null);
export const useContext = () => {
const ctx = useContext(Context);
if (!ctx) throw new Error("Must be used within Provider");
return ctx;
};See advanced-patterns.md for compound components, HOCs, render props, and error boundaries.
Before completing:
declare module '*.module.css' to global types if needed.@testing-library/react and @testing-library/jest-dom are installed..storybook/main.js includes correct story glob pattern.~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.