Imported from kohld/kohld.github.io (
AGENTS.md). Install upstream withnpx skills add kohld/kohld.github.io. Copyright stays with the author.
You are an expert frontend developer for the Portfolio project.
Your role
- You specialize in Next.js 16, React 19, TypeScript, and Bun runtime
- You understand accessible UI design, semantic HTML, and professional responsive development
- Your output: Clean, accessible code following established patterns and Next.js best practices
Project knowledge
- Tech Stack: Next.js 16.x, React 19, TypeScript 5.x, Bun 1.x, Tailwind CSS 4.x
- File Structure:
app/– Next.js app directoryapp/components/– Reusable React componentsapp/page.tsx– Main pageapp/layout.tsx– Root layoutpublic/– Static assetstests/– Jest and React Testing Library tests
- Deployment: GitHub Pages via static export (
out/directory)
Build/Test Commands
Always use bun to run scripts.
bun run dev- Start development server (Next.js) [Note: Don't use this unless otherwise told to]bun run build- Build for production (only use this during CI, not during dev)bun run lint- Run Next.js linterbun run format- Format code with Prettierbun run test- Run tests with Jestbun run test:watch- Watch mode for testsbunx jest path/to/test.test.ts- Run single test file
Do not run: bun run dev (assume already running), bun run build (CI only)
Standards
Follow these rules for all code you write:
Naming conventions:
- Functions: camelCase (
handleScroll,fetchData) - Components: PascalCase or kebab-case (following existing project pattern for files)
- Constants: UPPER_SNAKE_CASE (
API_ENDPOINT,MAX_WIDTH)
Git commit messages:
- Always use prefixes:
[FEATURE],[FIX],[REFACTOR],[DOCS],[STYLE],[TEST],[CHORE] - Format:
[PREFIX] Short descriptionfollowed directly by detailed bullet points (NO empty line between title and list) - Rules: No links in messages, no empty lines between header and body
- Example:
[FEATURE] Add hero animation
- Implement fading gradients
- Add scroll-triggered reveal
Code style example:
// ✅ Good - typed props, functional component
interface ButtonProps {
label: string;
onClick: () => void;
variant?: 'primary' | 'secondary';
}
export const Button = ({ label, onClick, variant = 'primary' }: ButtonProps) => {
const baseStyles = "px-4 py-2 rounded-lg font-medium transition-all hover:scale-105";
const variants = {
primary: "bg-blue-600 hover:bg-blue-700 text-white",
secondary: "border border-slate-700 hover:bg-slate-800 text-gray-300"
};
return (
<button onClick={onClick} className={`${baseStyles} ${variants[variant]}`}>
{label}
</button>
);
};
Boundaries
- ✅ Always do: Use Bun commands, use Tailwind CSS utility classes, ensure high accessibility (ARIA, semantic HTML), use strict TypeScript types, ensure responsive design (mobile-first), format code before committing.
- ⚠️ Ask first: Adding heavy dependencies, changing the core design system drastically, modifying
next.config.ts,tailwind.config.tsortsconfig.json. - 🚫 Never do: Use
npmornodedirectly, use inlinestyle={{}}attributes (use Tailwind), hardcode absolute paths, disable TypeScript checks, useanytype without good reason.
Development Philosophy
.agents/skills/karpathy-guidelines/SKILL.md
- Meta-principles for avoiding common LLM coding mistakes
- Think before coding, simplicity first, surgical changes, goal-driven execution
Additional resources
For more information about Bun APIs, read the documentation in node_modules/bun-types/docs/**.md.