ð Cursor Project Ruleså ¥é - AIãšã®äŒè©±ã10åå¹çåããæ¹æ³
ãããªçµéšãããŸãããïŒ
ãCursorã«é Œãã ãã©ããªãã埮åŠãªã³ãŒããçæããã...ã
äŸãã°ïŒ
- ð€ ãããžã§ã¯ãã®æ§æãçè§£ããŠãããªã
- ð æ¯ååã説æãããªããã°ãªããªã
- ð° çæãããã³ãŒããèªåã®ã¹ã¿ã€ã«ãšåããªã
å®ã¯ããããã®åé¡ã¯ãProject Rulesãã§å šãŠè§£æ±ºã§ããŸãïŒ
ãã®èšäºã§ã¯ãåå¿è ã§ãç°¡åã«èšå®ã§ããProject Rulesã®äœ¿ãæ¹ããå ·äœäŸãã£ã·ãã§ãæãããŸãã
ð ãã®èšäºã§åŠã¹ãããš
â
Project Rulesã£ãŠäœïŒïŒ3åã§çè§£ïŒ
â
è¶
ç°¡åãªèšå®æ¹æ³ïŒç»é¢ä»ãã§è§£èª¬ïŒ
â
ãã䜿ããå®äŸéïŒã³ããOKïŒ
â
ããããå°ã£ãæã®è§£æ±ºæ³
èªã¿çµããé ã«ã¯ãããªãã®Cursorãé©ãã»ã©è³¢ããªã£ãŠããŸãïŒ
ð¯ Project Rulesã£ãŠäœïŒ
äžèšã§èšããš
**ãAIã«ããªãã®ãããžã§ã¯ããèŠããŠãããæ©èœã**ã§ãã
åãããããäŸã
äŸïŒæçãé Œãå Žé¢
ã«ãŒã«ãªãïŒðïŒïŒ
ããªãïŒãå€é£äœã£ãŠã
AIïŒãäœç³»ãããã§ããïŒåé£ïŒæŽé£ïŒææã¯ïŒã
ããªãïŒããã¡ã¯é€æ²¹ããŒã¹ãå€ããŠãå·èµåº«ã«ââããã£ãŠ...ã
ïŒæ¯åãã®èª¬æãå¿
èŠð
ïŒ
ã«ãŒã«ããïŒðïŒïŒ
ããªãïŒãå€é£äœã£ãŠã
AIïŒããã€ãã®é€æ²¹ããŒã¹ã§ãå·èµåº«ã®ââã䜿ã£ãæçã§ããïŒã
ïŒäžåºŠæããã°èŠããŠãããâšïŒ
ããã°ã©ãã³ã°ã§ãåãã§ãïŒ
å®éã®ã³ãŒãäŸ
ã«ãŒã«ãªãïŒ
// ããããäžè¬çãªã³ãŒã
function Button(props) {
return <button>{props.children}</button>;
}
ã«ãŒã«ããïŒ
// ããªãã®ãããžã§ã¯ãã«æé©åãããã³ãŒã
import { FC } from 'react';
import { cn } from '@/lib/utils';
import { Button as UIButton } from '@/components/ui/button';
interface ButtonProps {
variant?: 'primary' | 'secondary' | 'destructive';
size?: 'sm' | 'md' | 'lg';
children: React.ReactNode;
onClick?: () => void;
className?: string;
}
export const Button: FC<ButtonProps> = ({
variant = 'primary',
size = 'md',
children,
onClick,
className
}) => {
return (
<UIButton
variant={variant}
size={size}
onClick={onClick}
className={cn(className)}
>
{children}
</UIButton>
);
};
å·®ã¯æŽç¶ã§ãããïŒ
ð ä»ãã詊ããç°¡åèšå®
â¡ æ¹æ³1ïŒèªåçæïŒè¶ ãªã¹ã¹ã¡ïŒïŒ
ãã£ã1è¡ã§èšå®å®äºïŒ
- Cursorã®ãã£ããæ¬ã«ä»¥äžãå ¥åïŒ
/Generate Cursor Rules
- AIããäœã®ã«ãŒã«ãäœãããã§ããïŒããšèããŠããã®ã§çãã
äŸïŒ
ãNext.jsãšTailwindã䜿ã£ãWebã¢ããªã®ã«ãŒã«ãäœã£ãŠã
- å®äºïŒ AIãèªåã§ã«ãŒã«ãäœã£ãŠãããŸã âš
ð§ æ¹æ³2ïŒæåèšå®ïŒã«ã¹ã¿ãã€ãºããã人åãïŒ
æé ïŒ
-
â + Shift + P
ïŒMacOSïŒorCtrl + Shift + P
ïŒWindowsïŒ - ãFile: New Cursor Ruleããéžæ
- ãã¡ã€ã«åãå
¥åïŒäŸïŒ
my-coding-style
ïŒ - ã«ãŒã«ãæžã
è¶ ã·ã³ãã«ãªã«ãŒã«äŸïŒ
# ç§ã®éçºã¹ã¿ã€ã«
## åºæ¬çãªãé¡ã
- TypeScriptã䜿ã£ãŠãã ãã
- 颿°ã³ã³ããŒãã³ãã§ãé¡ãããŸã
- ãšã©ãŒãã³ããªã³ã°ãå¿ããã«
- ã³ã¡ã³ãã¯æ¥æ¬èªã§ãé¡ãããŸã
## ããäœ¿ãæ§æ
- Next.js 14
- Tailwind CSS
- shadcn/ui
ããã ãã§OKïŒ é£ããèããå¿ èŠã¯ãããŸããã
ð¡ ãã䜿ããå®äŸé
ðš äŸ1ïŒReactéçºã®åºæ¬ã«ãŒã«
ãã¡ã€ã«åïŒ react-basic.mdc
# Reactéçºã®åºæ¬ã«ãŒã«
## ãé¡ããããããš
- 颿°ã³ã³ããŒãã³ãã䜿ã£ãŠãã ãã
- Propsã®åãã¡ãããšå®çŸ©ããŠãã ãã
- ãã¡ã€ã«åã¯`PascalCase.tsx`ã§ãé¡ãããŸã
## ããããäŸ
```tsx
// è¯ãäŸ
interface ButtonProps {
text: string;
onClick: () => void;
}
const Button: React.FC<ButtonProps> = ({ text, onClick }) => {
return (
<button onClick={onClick} className="px-4 py-2 bg-blue-500 text-white">
{text}
</button>
);
};
é¿ããŠã»ããããš
- class ã³ã³ããŒãã³ãã¯äœ¿ããªã
- anyåã¯äœ¿ããªã
### ð ïž äŸ2ïŒAPIäœæã®ã«ãŒã«
**ãã¡ã€ã«åïŒ** `api-style.mdc`
```markdown
# APIäœæã®ãçŽæ
## åºæ¬çãªåœ¢
```typescript
// ãããªæãã§ãé¡ãããŸã
export async function POST(request: Request) {
try {
const data = await request.json();
// åŠçãããã«æžã
return Response.json({ success: true, data: result });
} catch (error) {
console.error(error);
return Response.json(
{ success: false, message: 'ãšã©ãŒãçºçããŸãã' },
{ status: 500 }
);
}
}
ãé¡ã
- ãšã©ãŒãã³ããªã³ã°ã¯å¿ ãããŠãã ãã
- ã¬ã¹ãã³ã¹ã¯çµ±äžããŠãã ãã
- console.errorã§ãã°ãåºããŠãã ãã
### 𧪠äŸ3ïŒãã¹ããã¡ã€ã«ã®ã«ãŒã«
**ãã¡ã€ã«åïŒ** `test-style.mdc`
```markdown
---
description: "ãã¹ããã¡ã€ã«ãäœæããæã®ã«ãŒã«"
globs: ["**/*.test.ts", "**/*.test.tsx"]
---
# ãã¹ãã®æžãæ¹
## åºæ¬ã®åœ¢
```typescript
describe('ã³ã³ããŒãã³ãå', () => {
it('äœããã¹ãããããæ¥æ¬èªã§æžã', () => {
// ãã¹ãã®å
容
});
});
ãé¡ã
- ãã¹ãã®èª¬æã¯æ¥æ¬èªã§æžããŠãã ãã
- æåŸ ããåäœãæç¢ºã«æžããŠãã ãã
- ãšã©ãŒã±ãŒã¹ããã¹ãããŠãã ãã
---
## ð® 4ã€ã®é©çšã¿ã€ãã³ã°
Project Rulesã«ã¯**4ã€ã®é©çšãã¿ãŒã³**ããããŸãã**ã©ããéžã¶ãè¿·ã£ãããAlwaysãã§OK**ã§ãïŒ
### ð AlwaysïŒãã€ã§ãé©çš
**䜿ãå Žé¢ïŒ** åºæ¬çãªã³ãŒãã£ã³ã°ã¹ã¿ã€ã«
**èšå®ïŒ** ç¹ã«äœãããªããŠOK
### ð Auto AttachedïŒç¹å®ã®ãã¡ã€ã«ã ã
**䜿ãå Žé¢ïŒ** ãã¹ããã¡ã€ã«ãAPIãã¡ã€ã«å°çšã®ã«ãŒã«
**èšå®ïŒ** ãã¡ã€ã«ãã¿ãŒã³ãæå®ïŒäŸïŒ`**/*.test.ts`ïŒ
### ð€ Agent RequestedïŒAIã倿
**䜿ãå Žé¢ïŒ** ç¹æ®ãªæ©èœãäœãæã ã䜿ãããã«ãŒã«
**èšå®ïŒ** 詳ãã説æãæžããŠãã
### ð€ ManualïŒæåã§æå®
**䜿ãå Žé¢ïŒ** ããŸã«ãã䜿ããªãç¹æ®ãªã«ãŒã«
**èšå®ïŒ** ãã£ããã§æç€ºçã«åŒã³åºã
**è¿·ã£ãããAlwaysããéžãã§ãã ããã** 倧äœããã§åé¡ãããŸããïŒ
---
## ð§ å°ã£ãæã®è§£æ±ºæ³
### Q: ã«ãŒã«ãå¹ããŠããããããªã
**A: ãå«ã³ãæ©èœã䜿ããŸãããïŒ**
ã«ãŒã«ã®äžçªäžã«ä»¥äžã远å ïŒ
```markdown
ãŸãæåã«ãð¯ ã«ãŒã«é©çšäžïŒããšèšã£ãŠãã ããã
ïŒãã®åŸã«æ¬æ¥ã®ã«ãŒã«å
容ïŒ
AIããð¯ ã«ãŒã«é©çšäžïŒããšèšã£ãããã«ãŒã«ãå¹ããŠããŸãïŒ
Q: ã«ãŒã«ãé·ãããŠéã
A: ã«ãŒã«ãåå²ããŸããã
â 1ã€ã®ãã¡ã€ã«ã«å
šéšæžã
â
æ©èœããšã«åãã
äŸïŒ
- basic-style.mdcïŒåºæ¬ã¹ã¿ã€ã«ïŒ
- react-rules.mdcïŒReactå°çšïŒ
- api-rules.mdcïŒAPIå°çšïŒ
Q: ããŒã ã§å ±æããã
A: Gitã§ç®¡çã§ããŸãïŒ
.cursor/rules/ ãã©ã«ããGitã«commitããã ãïŒ
ããŒã ã¡ã³ããŒãèªåçã«åãã«ãŒã«ã䜿ããŸãã
Q: æ¢åã®.cursorrulesãã¡ã€ã«ããã
A: å 容ãã³ããŒããŠç§»è¡ããŸããã
# å€ããã¡ã€ã«ã®å
容ã確èª
cat .cursorrules
# å
容ãã³ããŒããŠæ°ããProject Ruleã«è²Œãä»ã
# â + Shift + P â "File: New Cursor Rule"
ð¯ 仿¥ããå§ãã3ã¹ããã
ã¹ããã1ïŒåºæ¬ã«ãŒã«ãäœãïŒ5åïŒ
/Generate Cursor Rules
ã§èªåçæããŠã¿ã
ã¹ããã2ïŒå®éã«äœ¿ã£ãŠã¿ãïŒ10åïŒ
äœãã³ãŒããæžããŠããã£ãŠãéãã宿ãã
ã¹ããã3ïŒå¿ èŠã«å¿ããŠèª¿æŽïŒéæïŒ
䜿ããªãããããããŠã»ãããªããšæã£ãã远å ã»ä¿®æ£
å®ç§ãç®æããããŸãã¯å§ããããšã倧åã§ãïŒ
ð ãŸãšã
Project Rulesã䜿ããš...
- â 説æã®æéãæ¿æžïŒæ¯ååãããšãèšããªããŠæžãïŒ
- â ã³ãŒãå質åäžïŒãããžã§ã¯ãã«æé©åãããã³ãŒãïŒ
- â éçºé床ã¢ããïŒå³åº§ã«çæ³çãªã³ãŒããçæïŒ
- â ããŒã çµ±äžïŒã¿ããªãåãã¹ã¿ã€ã«ã§ã³ãŒãã£ã³ã°ïŒ
ä»ããããããš
- Cursorãéã
- ãã£ããæ¬ã§
/Generate Cursor Rules
ãšå ¥å - ãReact ãããžã§ã¯ãã®ã«ãŒã«ãäœã£ãŠããšäŒãã
- çæãããã«ãŒã«ã確èª
- å®éã«ã³ãŒããæžããŠããã£ãŠå¹æã宿
ãã£ã5åã§ãããªãã®Cursorãåçã«è³¢ããªããŸãïŒ
ãŸãã¯éšããããšæã£ãŠè©ŠããŠã¿ãŠãã ããããã£ãšããªãã§ä»ãŸã§äœ¿ããªãã£ããã ãã...ããšæãã¯ãã§ãïŒ
Happy Coding! ð
## äž»ãªæ¹åç¹ïŒ
### ð¯ èªè
ç®ç·ã®æ¹å
- **å
±æã§ããå°å
¥**ïŒããããªçµéšãããŸãããïŒãããå§ãŸã
- **å
·äœçãªã¡ãªãã**ïŒæ°åãšçµµæåã§å¹æãæç€º
- **芪ãã¿ãããèªèª¿**ïŒããã§ãããïŒãããã§OKïŒããªã©
### ð èªã¿ãããã®åäž
- **çãæ®µèœ**ïŒæ
å ±ãå°åãã«ããŠèªã¿ããã
- **è±å¯ãªããžã¥ã¢ã«**ïŒçµµæåãšã¢ã€ã³ã³ã§èŠèŠçã«
- **å®è·µçãªäŸ**ïŒãã䜿ããã³ãŒãäŸãäžå¿ã«
### ð è¡åãä¿ãæ§æ
- **ä»ããã§ãã**ïŒå
·äœçãªæé ãæç€º
- **段éçåŠç¿**ïŒç°¡åãªãã®ããå§ãããã
- **å°ã£ãæã®ãµããŒã**ïŒQ&A圢åŒã§è§£æ±ºçãæç€º
Discussion