원클릭으로
create-a-new-fe-app
Use when adding a new React TypeScript frontend app to an existing pnpm monorepo or wiring a new app to package/ui
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
Use when adding a new React TypeScript frontend app to an existing pnpm monorepo or wiring a new app to package/ui
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
Use when testing, validating, pressure-testing, or iterating an agent skill by having subagents use it
Use when creating, editing, reviewing, or testing agent skills, skill repositories, SKILL.md files, bootstrap skills, or skill discovery rules
Use when adding backend feature modules, creating tRPC routers, writing Drizzle adapters, defining domain ports or services, or diagnosing backend layer-boundary issues
Use when cleaning, deleting, pruning, or removing files from the repository root `.handoff/` directory
Use when creating a new TypeScript monorepo, initializing a fresh workspace, or bootstrapping apps and packages from an empty directory
Use when code reads process.env directly, .env loading is requested, dotenv.config() appears, APP_* prefixes differ across dev/server, env examples drift, or startup config validation is missing
| name | create-a-new-fe-app |
| description | Use when adding a new React TypeScript frontend app to an existing pnpm monorepo or wiring a new app to package/ui |
Use this skill when the user asks to create, scaffold, add, or bootstrap a new frontend app in an existing monorepo, especially a React TypeScript app that should consume the shared package/ui workspace.
Do not use it for creating a brand-new monorepo, adding only a library package, migrating an existing app, or changing a standalone Vite project outside a monorepo.
Do not run the Vite generator until the user has provided a valid application name and the target app directory has passed the safety check. After generation, remove app-local repository and lint scaffolding that conflicts with the monorepo, then replace Vite example usage with a rendered shadcn/ui component imported from the shared UI package.
Ask the user for the application name before making changes unless the same request already provides it.
The application name must be valid before continuing:
apps/ and a package name suffix.If the name is invalid, explain the exact rule it violates and ask for a replacement name. Do not silently normalize the name.
apps/ unless the repository already uses a different app directory convention.package/ui/package.json to get the shared UI package name and exported entrypoints. Stop if the shared UI package does not exist.package/ui for existing shadcn/ui components and their import paths. Treat utility-only exports such as lib/utils and style-only exports such as globals.css as insufficient proof that the app uses the shared UI.apps/<name> unless the discovered convention requires a different app parent.@workspace/<name> when that convention exists.apps/:
npm create vite@latest <name> --template react-ts.npm create vite@latest <name> -- --template react-ts to pass the same template option to Vite..git if the generator or template created it.eslint.config.js, eslint.config.mjs, .eslintrc*, or related generated lint-only files.package-lock.json, npm-shrinkwrap.json, yarn.lock, or pnpm-lock.yaml.src/assets/react.svg and public/vite.svg.src/App.css and demo styles in src/index.css, when the app now imports shared styles.tsconfig.app.json or tsconfig.node.json; keep them unless an existing app exemplar in the same monorepo uses a different working TypeScript layout.package/ui/package.json.<ui-package>/globals.css, when that export exists.<ui-package>/components/button, when one exists.package/ui has no exported shadcn/ui component yet, create the smallest shared component needed to prove the wiring, usually a Button, inside package/ui using the repository's existing shadcn/ui conventions, dependencies, and export pattern. Do not create the component inside the app.@theme mappings, or source scanning for shared components, fix the shared UI styling setup before declaring success.package/ui/package.json; first add or align the shared UI export when the package has a clear component export convention, otherwise stop and report the missing export convention.@workspace/<name> when that convention exists.dev, build, preview, and typecheck.tsconfig.json should reference tsconfig.app.json and tsconfig.node.json; tsconfig.app.json should cover browser React source; tsconfig.node.json should cover Vite config and Node-side config files.vite/client. Prefer the generated src/vite-env.d.ts reference for Vite globals, or include React types explicitly if the repository's TypeScript policy requires a types list.tsconfig.json unless an existing app proves that layout works.pnpm install.pnpm typecheck.apps/..git metadata inside the app workspace.react.svg, vite.svg, counter state, or template CSS after replacing the sample UI.../../package/ui instead of the workspace package import path.@workspace/ui/globals.css or @workspace/ui/lib/utils as enough; the generated app must render an actual shadcn/ui component from package/ui.package/ui.Button that looks like plain text because Tailwind did not scan shared component classes or because shadcn theme tokens such as primary, primary-foreground, background, foreground, border, or ring are missing.tsconfig.app.json or tsconfig.node.json from a Vite React TypeScript app and leaving the editor or typecheck without the correct browser and Vite config contexts.tsconfig.json with a single broad config that appears to pass one CLI command but breaks JSX runtime or workspace import resolution in the app.compilerOptions.types in tsconfig.app.json to only vite/client, which can make the editor lose React JSX runtime and JSX.IntrinsicElements types.package/ui/package.json.apps/.Prompt: "Create a new frontend app called dashboard and wire it to package/UI."
Baseline failure: The agent runs the generator immediately, accepts an unsafe or colliding name, creates the app in the wrong directory, keeps app-local ESLint and nested lockfiles, deletes Vite's split TypeScript config, leaves default Vite logos and counter code, imports shared UI by relative filesystem paths or only imports globals.css/cn, renders a Button that looks like plain text because Tailwind/shadcn styling is not wired, and finishes without typecheck.
Expected behavior: The agent validates dashboard, checks apps/dashboard including hidden files and package name collisions, scaffolds React TypeScript from apps/ with the requested Vite command, removes generated repository, lint, lockfile, and sample assets while preserving tsconfig.app.json and tsconfig.node.json, reads the existing UI package name and component exports, reuses or adds a minimal shadcn/ui component in package/ui, wires shared styles so Tailwind scans shared UI classes and shadcn theme tokens resolve, renders a visibly styled component from the app through the workspace package import path, installs from the monorepo root, runs typecheck, and reports evidence.
Pass criteria:
.git, app-local ESLint config, nested lockfiles, and unused sample assets are removed when present.tsconfig.json, tsconfig.app.json, and tsconfig.node.json.Before finishing:
.git, app-local ESLint config, nested lockfiles, and unused sample assets were removed when present.tsconfig.json, tsconfig.app.json, and tsconfig.node.json exist and preserve the Vite React TypeScript app and Node config contexts unless a same-repo exemplar uses a different working layout.types to only vite/client.package/ui/package.json.package/ui workspace package.pnpm install from the repository root when dependencies changed.pnpm typecheck.