Skip to content

Commit b84a080

Browse files
committed
docs: add Gemini-specific TypeScript enforcement guidelines
Created .gemini directory with: - TYPESCRIPT_RULES.md - Mandatory type safety rules (Korean) - README.md - Quick start guide for Gemini (Korean) Both Claude and Gemini now follow the same strict rules: - No any, {}, Function types - Mandatory type-check + lint before commit - Zero tolerance for type/lint errors Ensures consistent code quality across all AI assistants.
1 parent ac4ed86 commit b84a080

2 files changed

Lines changed: 253 additions & 0 deletions

File tree

β€Ž.gemini/README.mdβ€Ž

Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
# Gemini AI 개발 κ°€μ΄λ“œ
2+
3+
> **ν”„λ‘œμ νŠΈ:** AI Workflow Manager
4+
> **기술 μŠ€νƒ:** Electron + Vue 3 + TypeScript + Drizzle ORM + SQLite
5+
6+
## 🚨 ν•„μˆ˜ 읽기
7+
8+
**1μˆœμœ„:** `.gemini/TYPESCRIPT_RULES.md` - **MANDATORY νƒ€μž… μ•ˆμ „μ„± κ·œμΉ™**
9+
**2μˆœμœ„:** `.claude/CLAUDE_CODE_INSTRUCTIONS.md` - 상세 개발 κ°€μ΄λ“œ
10+
**3μˆœμœ„:** `.claude/DEVELOPMENT_GUIDELINES.md` - μ•„ν‚€ν…μ²˜ 원칙
11+
12+
## ⚑ λΉ λ₯Έ μ‹œμž‘
13+
14+
### μ½”λ“œ λ³€κ²½ μ „ ν•„μˆ˜ 확인
15+
16+
```bash
17+
# 1. νƒ€μž… 체크
18+
pnpm type-check
19+
20+
# 2. 린트 체크
21+
pnpm lint
22+
23+
# 3. λ‘˜ λ‹€ 톡과해야 컀밋 κ°€λŠ₯
24+
git add -A && git commit -m "..."
25+
```
26+
27+
## 🎯 핡심 κ·œμΉ™
28+
29+
### ❌ μ ˆλŒ€ κΈˆμ§€
30+
31+
- `any`, `{}`, `Function`, `Object` νƒ€μž… μ‚¬μš©
32+
- `@ts-ignore` μ‚¬μš©
33+
- Type/Lint μ—λŸ¬κ°€ μžˆλŠ” 컀밋
34+
- μƒλŒ€ 경둜 import (`../../../`)
35+
- console.log (νŠΉμ • 파일 μ œμ™Έ)
36+
37+
### βœ… ν•„μˆ˜ 사항
38+
39+
- λͺ¨λ“  ν•¨μˆ˜μ— νƒ€μž… μ •μ˜
40+
- Path alias μ‚¬μš© (`@/`, `@core/`, `@modules/`)
41+
- μ—λŸ¬ 핸듀링 μΆ”κ°€
42+
- JSDoc 주석 (public API)
43+
- 컀밋 μ „ type-check + lint μ‹€ν–‰
44+
45+
## πŸ“ ν”„λ‘œμ νŠΈ ꡬ쑰
46+
47+
```
48+
src/
49+
β”œβ”€β”€ renderer/ # Vue 3 ν”„λ‘ νŠΈμ—”λ“œ
50+
β”‚ β”œβ”€β”€ modules/ # κΈ°λŠ₯별 λͺ¨λ“ˆ
51+
β”‚ β”œβ”€β”€ stores/ # Pinia μŠ€ν† μ–΄
52+
β”‚ └── components/ # Vue μ»΄ν¬λ„ŒνŠΈ
53+
β”œβ”€β”€ core/ # 곡유 νƒ€μž… 및 μœ ν‹Έ
54+
└── services/ # λΉ„μ¦ˆλ‹ˆμŠ€ 둜직
55+
56+
electron/
57+
β”œβ”€β”€ main/ # Electron 메인 ν”„λ‘œμ„ΈμŠ€
58+
β”‚ β”œβ”€β”€ ipc/ # IPC ν•Έλ“€λŸ¬
59+
β”‚ └── database/ # Drizzle ORM
60+
└── preload/ # Preload 슀크립트
61+
```
62+
63+
## πŸ”§ 일반적인 μž‘μ—…
64+
65+
### μƒˆ κΈ°λŠ₯ μΆ”κ°€
66+
67+
1. **νƒ€μž… μ •μ˜** (`src/core/types/`)
68+
2. **λ°μ΄ν„°λ² μ΄μŠ€ μŠ€ν‚€λ§ˆ** (`electron/main/database/schema.ts`)
69+
3. **Repository** (`electron/main/database/repositories/`)
70+
4. **IPC ν•Έλ“€λŸ¬** (`electron/main/ipc/`)
71+
5. **Preload API** (`electron/preload/api/`)
72+
6. **Pinia Store** (`src/renderer/stores/`)
73+
7. **Vue μ»΄ν¬λ„ŒνŠΈ** (`src/renderer/modules/`)
74+
75+
### Vue μ»΄ν¬λ„ŒνŠΈ ν…œν”Œλ¦Ώ
76+
77+
```vue
78+
<script setup lang="ts">
79+
import { ref, computed } from 'vue';
80+
81+
interface Props {
82+
item: ItemType;
83+
}
84+
const props = defineProps<Props>();
85+
86+
const emit = defineEmits<{
87+
update: [value: Type];
88+
}>();
89+
90+
const state = ref<Type>(initialValue);
91+
</script>
92+
93+
<template>
94+
<!-- μ»΄ν¬λ„ŒνŠΈ λ‚΄μš© -->
95+
</template>
96+
```
97+
98+
## πŸ§ͺ ν…ŒμŠ€νŠΈ
99+
100+
```bash
101+
pnpm test # λͺ¨λ“  ν…ŒμŠ€νŠΈ
102+
pnpm test:unit # μœ λ‹› ν…ŒμŠ€νŠΈ
103+
pnpm test:integration # 톡합 ν…ŒμŠ€νŠΈ
104+
```
105+
106+
## πŸ› 디버깅
107+
108+
```bash
109+
# TypeScript μ—λŸ¬ 확인
110+
pnpm type-check
111+
112+
# Lint μ—λŸ¬ 확인
113+
pnpm lint
114+
115+
# 개발 μ„œλ²„ μ‹€ν–‰
116+
pnpm dev
117+
```
118+
119+
## πŸ“š μΆ”κ°€ λ¬Έμ„œ
120+
121+
- **상세 κ°€μ΄λ“œ:** `.claude/CLAUDE_CODE_INSTRUCTIONS.md`
122+
- **μ•„ν‚€ν…μ²˜:** `ARCHITECTURE.md`
123+
- **ν”„λ‘œμ νŠΈ ꡬ쑰:** `PROJECT_STRUCTURE.md`
124+
- **μ½”λ“œ ν…œν”Œλ¦Ώ:** `.claude/CODE_TEMPLATES.md`
125+
126+
---
127+
128+
**μ€‘μš”:** λͺ¨λ“  변경사항은 λ°˜λ“œμ‹œ `pnpm type-check` + `pnpm lint` 톡과 ν›„ 컀밋!

β€Ž.gemini/TYPESCRIPT_RULES.mdβ€Ž

Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
# 🚨 CRITICAL: TypeScript & Code Quality Rules for Gemini
2+
3+
> **이 κ·œμΉ™μ€ MANDATORYμž…λ‹ˆλ‹€. μ˜ˆμ™Έ 없이 λͺ¨λ“  μ½”λ“œ 변경에 μ μš©λ©λ‹ˆλ‹€.**
4+
5+
## ⚠️ μ ˆλŒ€ κ·œμΉ™ - μ ˆλŒ€ μœ„λ°˜ κΈˆμ§€
6+
7+
### 1. **κΈˆμ§€λœ νƒ€μž… - μ ˆλŒ€ μ‚¬μš© κΈˆμ§€**
8+
9+
```typescript
10+
// ❌ μ ˆλŒ€ μ‚¬μš© κΈˆμ§€:
11+
any; // β†’ unknown λ˜λŠ” ꡬ체적 νƒ€μž… μ‚¬μš©
12+
{
13+
} // β†’ Record<string, unknown> μ‚¬μš©
14+
Function; // β†’ (args: Type) => ReturnType μ‚¬μš©
15+
Object; // β†’ Record<string, unknown> λ˜λŠ” interface μ‚¬μš©
16+
```
17+
18+
### 2. **ν•„μˆ˜ 검증 - λͺ¨λ“  컀밋 μ „**
19+
20+
```bash
21+
# πŸ”΄ ν•„μˆ˜: 컀밋 μ „ λ°˜λ“œμ‹œ μ‹€ν–‰
22+
pnpm type-check # 0 errors ν•„μˆ˜
23+
pnpm lint # 0 errors ν•„μˆ˜ (warningsλŠ” ν—ˆμš©)
24+
25+
# βœ… λ‘˜ λ‹€ ν†΅κ³Όν•΄μ•Όλ§Œ 컀밋 κ°€λŠ₯
26+
git add -A && git commit -m "..."
27+
```
28+
29+
### 3. **μ˜¬λ°”λ₯Έ νƒ€μž… μ‚¬μš©λ²•**
30+
31+
```typescript
32+
// βœ… μ˜¬λ°”λ₯Έ μ‚¬μš©:
33+
unknown // νƒ€μž…μ„ λͺ¨λ₯Ό λ•Œ
34+
Record<string, unknown> // 객체 νƒ€μž…
35+
(param: Type) => ReturnType // ν•¨μˆ˜ νƒ€μž…
36+
interface MyType { ... } // κ΅¬μ‘°ν™”λœ 객체
37+
type MyUnion = 'a' | 'b' // μœ λ‹ˆμ˜¨ νƒ€μž…
38+
```
39+
40+
### 4. **ESLint κ·œμΉ™**
41+
42+
```typescript
43+
// ❌ κΈˆμ§€:
44+
// @ts-ignore
45+
someCode();
46+
47+
function foo(param: any) {}
48+
49+
const map: Map<string, {}> = new Map();
50+
51+
function bar(callback: Function) {}
52+
53+
console.log('debug'); // νŠΉμ • 파일 μ™Έμ—λŠ” κΈˆμ§€
54+
55+
// βœ… μ˜¬λ°”λ₯Έ μ‚¬μš©:
56+
/* eslint-disable @typescript-eslint/no-explicit-any */
57+
// 이유: μ„œλ“œνŒŒν‹° λΌμ΄λΈŒλŸ¬λ¦¬μ— νƒ€μž…μ΄ μ—†μŒ
58+
function foo(param: any) {}
59+
60+
const map: Map<string, Record<string, unknown>> = new Map();
61+
62+
function bar(callback: (data: string) => void) {}
63+
64+
/* eslint-disable no-console */
65+
console.log('이 νŒŒμΌμ—μ„œλŠ” ν—ˆμš©');
66+
```
67+
68+
## πŸ“‹ 컀밋 μ „ 체크리슀트
69+
70+
**λͺ¨λ“  컀밋 전에 확인:**
71+
72+
- [ ] `pnpm type-check` 톡과 (0 errors)
73+
- [ ] `pnpm lint` 톡과 (0 errors)
74+
- [ ] `any` νƒ€μž… μ‚¬μš© μ•ˆ 함 (λ˜λŠ” eslint-disable둜 λͺ…μ‹œ)
75+
- [ ] `{}` νƒ€μž… μ‚¬μš© μ•ˆ 함
76+
- [ ] `Function` νƒ€μž… μ‚¬μš© μ•ˆ 함
77+
- [ ] `@ts-ignore` μ‚¬μš© μ•ˆ 함 (`@ts-expect-error` μ‚¬μš©)
78+
- [ ] λͺ¨λ“  ν•¨μˆ˜μ— νƒ€μž… μ •μ˜
79+
- [ ] console.log 제거 (λ˜λŠ” eslint-disable)
80+
81+
## 🎯 νƒ€μž… λ³€ν™˜ κ°€μ΄λ“œ
82+
83+
| ❌ μ‚¬μš© κΈˆμ§€ | βœ… λŒ€μ‹  μ‚¬μš© |
84+
| ------------ | ---------------------------- |
85+
| `any` | `unknown` λ˜λŠ” ꡬ체적 νƒ€μž… |
86+
| `{}` | `Record<string, unknown>` |
87+
| `Function` | `(args: Type) => ReturnType` |
88+
| `Object` | `Record<string, unknown>` |
89+
| `@ts-ignore` | `@ts-expect-error` + 주석 |
90+
91+
## 🚫 CI μ‹€νŒ¨ 원인
92+
93+
λ‹€μŒμ˜ 경우 CIκ°€ μ‹€νŒ¨ν•©λ‹ˆλ‹€:
94+
95+
- Type check μ‹€νŒ¨
96+
- Lint check μ‹€νŒ¨ (errors만, warningsλŠ” ν—ˆμš©)
97+
- ν…ŒμŠ€νŠΈ μ‹€νŒ¨
98+
99+
## πŸ’‘ μ˜ˆμ™Έ ν—ˆμš© 파일
100+
101+
λ‹€μŒ νŒŒμΌλ“€λ§Œ μ™„ν™”λœ κ·œμΉ™ 적용:
102+
103+
- `tests/**/*.spec.ts` - ν…ŒμŠ€νŠΈ 파일
104+
- `tests/**/*.test.ts` - ν…ŒμŠ€νŠΈ 파일
105+
- `**/*.d.ts` - νƒ€μž… μ •μ˜ 파일
106+
- `**/mock*.ts` - Mock 파일
107+
108+
## 🎯 핡심 원칙
109+
110+
**μ ˆλŒ€ κΈˆμ§€:**
111+
112+
- νƒ€μž… μ—λŸ¬κ°€ μžˆλŠ” 컀밋
113+
- Lint μ—λŸ¬κ°€ μžˆλŠ” 컀밋
114+
- μ •λ‹Ήν•œ 이유 없이 `any` μ‚¬μš©
115+
- `{}` νƒ€μž… μ‚¬μš©
116+
- `Function` νƒ€μž… μ‚¬μš©
117+
- 검증 단계 μƒλž΅
118+
119+
**이것은 선택이 μ•„λ‹Œ ν•„μˆ˜μž…λ‹ˆλ‹€.**
120+
121+
μœ„λ°˜ μ‹œ CI μ‹€νŒ¨ 및 배포 μ°¨λ‹¨λ©λ‹ˆλ‹€.
122+
123+
---
124+
125+
**μžμ„Έν•œ λ‚΄μš©:** `.claude/TYPESCRIPT_ENFORCEMENT.md` μ°Έμ‘°

0 commit comments

Comments
Β (0)