frontend-builder — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited frontend-builder (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.
Use Vite+'s vp CLI with React and TypeScript as the standard frontend stack. Use TanStack Router for routing.
vp).vp migrate.pnpm as the package manager.playwright-cli when browser verification is useful.vp check --fix.vp dev, vp build, vp test, vp lint, vp fmt, and vp check.vite.config.ts, including lint/fmt/test/run/pack/staged blocks.vite.config.ts.web.log in the project root.vp.vp create vite -- --template react-tspnpm install @tanstack/react-router @tanstack/router-devtools lucide-reactsrc/index.css and component CSS. Do not add extra UI frameworks unless they materially help the task.In Vite+, consolidate all tool configuration in vite.config.ts.
import { defineConfig } from "vite-plus";
export default defineConfig({
server: {},
build: {},
preview: {},
test: {},
lint: {},
fmt: {},
run: {},
pack: {},
staged: {},
});Enable lint.options.typeAware and lint.options.typeCheck because type-aware linting is desired.
export default defineConfig({
lint: {
ignorePatterns: ["dist/**"],
options: {
typeAware: true,
typeCheck: true,
},
},
fmt: {
singleQuote: true,
},
});For an existing Vite project, inspect the current state first, then migrate to Vite+.
vp migrateAfter migration, review changes to vite.config.ts, package scripts, and the lockfile. If the project already has tests, linting, formatting, or build workflows, run vp check or the individual vp build, vp test, and vp lint commands.
vp dev: Start the Vite dev server with HMR.vp build: Run the production build through Rolldown. This runs the Vite build, not a custom package.json build script.vp preview: Serve the production build locally.vp test: Run Vitest once. Unlike standalone Vitest, this is not watch mode.vp test watch: Run tests in watch mode.vp test run --coverage: Run tests with coverage.vp lint: Run Oxlint.vp fmt: Run Oxfmt.vp check: Run format, lint, and typecheck in one pass.vp check --fix: Auto-fix formatting and lint issues.vp run build: Run the package.json build script.vp run build -r: Run the script across all workspace packages in dependency order.vp pack: Build a library through the tsdown integration.Implement these rules by priority.
from parameter for type narrowing, type the root context, and use queryOptions for loader type inference.Link, active states, useNavigate, relative paths, code splitting, and preloading when they fit the task.beforeLoad, and dependency injection when shared dependencies such as auth, API clients, or feature flags are needed.Create src/router.tsx and define a path-based route tree with createRootRouteWithContext, createRoute, and createRouter.
import {
Link,
Outlet,
createRootRouteWithContext,
createRoute,
createRouter,
} from "@tanstack/react-router";
import { TanStackRouterDevtools } from "@tanstack/router-devtools";
type RouterContext = {
queryClient?: unknown;
};
function RootLayout() {
return (
<>
<nav>
<Link to="/" activeOptions={{ exact: true }}>
Home
</Link>
<Link to="/settings">Settings</Link>
</nav>
<Outlet />
<TanStackRouterDevtools />
</>
);
}
const rootRoute = createRootRouteWithContext<RouterContext>()({
component: RootLayout,
notFoundComponent: NotFoundPage,
errorComponent: ErrorPage,
});
const indexRoute = createRoute({
getParentRoute: () => rootRoute,
path: "/",
component: HomePage,
});
const settingsRoute = createRoute({
getParentRoute: () => rootRoute,
path: "/settings",
validateSearch: (search) => ({
tab: typeof search.tab === "string" ? search.tab : "profile",
}),
component: SettingsPage,
});
const routeTree = rootRoute.addChildren([indexRoute, settingsRoute]);
export const router = createRouter({
routeTree,
defaultPreload: "intent",
defaultPreloadStaleTime: 30_000,
scrollRestoration: true,
context: {},
});
declare module "@tanstack/react-router" {
interface Register {
router: typeof router;
}
}Use RouterProvider in src/main.tsx.
import { StrictMode } from "react";
import { createRoot } from "react-dom/client";
import { RouterProvider } from "@tanstack/react-router";
import { router } from "./router";
import "./index.css";
createRoot(document.getElementById("root")!).render(
<StrictMode>
<RouterProvider router={router} />
</StrictMode>,
);loader functions for route data instead of component-level useEffect.loaderDeps when search params or route params affect the loader cache.queryOptions with queryClient.ensureQueryData.errorComponent and not-found states with notFoundComponent.validateSearch and treat them as typed URL state.Link for normal page navigation.useNavigate for programmatic navigation after form submits or command actions.validateSearch, and error boundaries in the main route file.defaultPreload: "intent" for primary navigation.src/App.tsx; create src/pages/ and src/components/.lucide-react for icon buttons when an icon is needed.Start the dev server from the project root and write logs to root-level web.log.
vp dev --host 0.0.0.0 > web.log 2>&1After startup, inspect web.log for the served URL, compile errors, and runtime errors. Fix issues and restart when needed.
vp build does not run the expected script: vp build is for the Vite build. Use vp run build to run the package.json script.vp migrate: run vp install, then vp check to find remaining issues.vp build and fix type errors and build errors.vp test, vp lint, vp fmt, and vp check.web.log.~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.