moai-adk 0.3.1__py3-none-any.whl → 0.3.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of moai-adk might be problematic. Click here for more details.
- moai_adk/__init__.py +1 -1
- {moai_adk-0.3.1.dist-info → moai_adk-0.3.2.dist-info}/METADATA +152 -147
- {moai_adk-0.3.1.dist-info → moai_adk-0.3.2.dist-info}/RECORD +6 -37
- moai_adk/templates/.claude/agents/alfred/cc-manager.md +0 -474
- moai_adk/templates/.claude/agents/alfred/code-builder.md +0 -534
- moai_adk/templates/.claude/agents/alfred/debug-helper.md +0 -302
- moai_adk/templates/.claude/agents/alfred/doc-syncer.md +0 -175
- moai_adk/templates/.claude/agents/alfred/git-manager.md +0 -200
- moai_adk/templates/.claude/agents/alfred/project-manager.md +0 -152
- moai_adk/templates/.claude/agents/alfred/spec-builder.md +0 -256
- moai_adk/templates/.claude/agents/alfred/tag-agent.md +0 -247
- moai_adk/templates/.claude/agents/alfred/trust-checker.md +0 -332
- moai_adk/templates/.claude/commands/alfred/0-project.md +0 -523
- moai_adk/templates/.claude/commands/alfred/1-spec.md +0 -531
- moai_adk/templates/.claude/commands/alfred/2-build.md +0 -413
- moai_adk/templates/.claude/commands/alfred/3-sync.md +0 -552
- moai_adk/templates/.claude/hooks/alfred/README.md +0 -238
- moai_adk/templates/.claude/hooks/alfred/alfred_hooks.py +0 -165
- moai_adk/templates/.claude/hooks/alfred/core/__init__.py +0 -79
- moai_adk/templates/.claude/hooks/alfred/core/checkpoint.py +0 -271
- moai_adk/templates/.claude/hooks/alfred/core/context.py +0 -110
- moai_adk/templates/.claude/hooks/alfred/core/project.py +0 -284
- moai_adk/templates/.claude/hooks/alfred/core/tags.py +0 -244
- moai_adk/templates/.claude/hooks/alfred/handlers/__init__.py +0 -23
- moai_adk/templates/.claude/hooks/alfred/handlers/compact.py +0 -51
- moai_adk/templates/.claude/hooks/alfred/handlers/notification.py +0 -25
- moai_adk/templates/.claude/hooks/alfred/handlers/session.py +0 -80
- moai_adk/templates/.claude/hooks/alfred/handlers/tool.py +0 -71
- moai_adk/templates/.claude/hooks/alfred/handlers/user.py +0 -41
- moai_adk/templates/.claude/output-styles/alfred/agentic-coding.md +0 -635
- moai_adk/templates/.claude/output-styles/alfred/moai-adk-learning.md +0 -691
- moai_adk/templates/.claude/output-styles/alfred/study-with-alfred.md +0 -469
- moai_adk/templates/.claude/settings.json +0 -135
- moai_adk/templates/CLAUDE.md +0 -733
- {moai_adk-0.3.1.dist-info → moai_adk-0.3.2.dist-info}/WHEEL +0 -0
- {moai_adk-0.3.1.dist-info → moai_adk-0.3.2.dist-info}/entry_points.txt +0 -0
- {moai_adk-0.3.1.dist-info → moai_adk-0.3.2.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,691 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: MoAI ADK Learning
|
|
3
|
-
description: MoAI-ADK의 개념과 워크플로우를 쉽게 배우는 학습 모드
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# MoAI ADK Learning
|
|
7
|
-
|
|
8
|
-
**대상**: MoAI-ADK를 처음 사용하는 개발자
|
|
9
|
-
|
|
10
|
-
MoAI-ADK의 핵심 개념과 3단계 워크플로우를 친절하게 설명하여 빠르게 익힐 수 있도록 돕는 학습 모드입니다.
|
|
11
|
-
|
|
12
|
-
## MoAI-ADK란?
|
|
13
|
-
|
|
14
|
-
**핵심 철학**: "명세 없으면 코드 없다, 테스트 없으면 구현 없다"
|
|
15
|
-
|
|
16
|
-
MoAI-ADK는 3가지 핵심 개념으로 구성됩니다:
|
|
17
|
-
1. **SPEC-First**: 코드 작성 전 명세를 먼저 작성
|
|
18
|
-
2. **@TAG 추적성**: 모든 코드를 SPEC과 연결
|
|
19
|
-
3. **TRUST 품질**: 5가지 원칙으로 코드 품질 보장
|
|
20
|
-
|
|
21
|
-
이 3가지 개념이 어떻게 작동하는지 하나씩 배워봅시다!
|
|
22
|
-
|
|
23
|
-
---
|
|
24
|
-
|
|
25
|
-
## 핵심 개념 1: SPEC-First
|
|
26
|
-
|
|
27
|
-
### SPEC이란?
|
|
28
|
-
|
|
29
|
-
**간단히 말하면**:
|
|
30
|
-
- 무엇을 만들지 미리 적어놓는 설계도
|
|
31
|
-
- 요리 레시피처럼 단계와 재료를 명확히 정의
|
|
32
|
-
|
|
33
|
-
**왜 필요한가요?**
|
|
34
|
-
- 개발 전 요구사항을 명확히 정리
|
|
35
|
-
- 팀원과 소통할 때 기준이 됨
|
|
36
|
-
- 나중에 변경 사항을 추적 가능
|
|
37
|
-
- "이 코드는 왜 만들었지?"라는 질문에 답할 수 있음
|
|
38
|
-
|
|
39
|
-
### EARS 구문: 요구사항 작성법
|
|
40
|
-
|
|
41
|
-
EARS는 요구사항을 5가지 패턴으로 작성하는 방법입니다:
|
|
42
|
-
|
|
43
|
-
#### 1. Ubiquitous (기본 기능)
|
|
44
|
-
```markdown
|
|
45
|
-
시스템은 [기능]을 제공해야 한다
|
|
46
|
-
|
|
47
|
-
예시:
|
|
48
|
-
- 시스템은 JWT 기반 인증을 제공해야 한다
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
#### 2. Event-driven (조건부 동작)
|
|
52
|
-
```markdown
|
|
53
|
-
WHEN [조건]이면, 시스템은 [동작]해야 한다
|
|
54
|
-
|
|
55
|
-
예시:
|
|
56
|
-
- WHEN 유효한 자격증명 제공 시, 시스템은 JWT 토큰을 발급해야 한다
|
|
57
|
-
- WHEN 토큰이 만료되면, 시스템은 401 에러를 반환해야 한다
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
#### 3. State-driven (상태 기반 동작)
|
|
61
|
-
```markdown
|
|
62
|
-
WHILE [상태]일 때, 시스템은 [동작]해야 한다
|
|
63
|
-
|
|
64
|
-
예시:
|
|
65
|
-
- WHILE 사용자가 인증된 상태일 때, 시스템은 보호된 리소스 접근을 허용해야 한다
|
|
66
|
-
```
|
|
67
|
-
|
|
68
|
-
#### 4. Optional (선택적 기능)
|
|
69
|
-
```markdown
|
|
70
|
-
WHERE [조건]이면, 시스템은 [동작]할 수 있다
|
|
71
|
-
|
|
72
|
-
예시:
|
|
73
|
-
- WHERE 리프레시 토큰이 제공되면, 시스템은 새 액세스 토큰을 발급할 수 있다
|
|
74
|
-
```
|
|
75
|
-
|
|
76
|
-
#### 5. Constraints (제약사항)
|
|
77
|
-
```markdown
|
|
78
|
-
IF [조건]이면, 시스템은 [제약]해야 한다
|
|
79
|
-
|
|
80
|
-
예시:
|
|
81
|
-
- 토큰 만료시간은 15분을 초과해서는 안 된다
|
|
82
|
-
- 비밀번호는 최소 8자 이상이어야 한다
|
|
83
|
-
```
|
|
84
|
-
|
|
85
|
-
### 실제 예시: 로그인 기능 SPEC
|
|
86
|
-
|
|
87
|
-
```markdown
|
|
88
|
-
# @SPEC:AUTH-001: JWT 인증 시스템
|
|
89
|
-
|
|
90
|
-
## Ubiquitous Requirements (기본 기능)
|
|
91
|
-
- 시스템은 JWT 기반 인증을 제공해야 한다
|
|
92
|
-
|
|
93
|
-
## Event-driven Requirements (조건부 동작)
|
|
94
|
-
- WHEN 유효한 자격증명 제공 시, 시스템은 JWT 토큰을 발급해야 한다
|
|
95
|
-
- WHEN 토큰이 만료되면, 시스템은 401 에러를 반환해야 한다
|
|
96
|
-
- WHEN 잘못된 토큰이 제공되면, 시스템은 접근을 거부해야 한다
|
|
97
|
-
|
|
98
|
-
## State-driven Requirements (상태 기반)
|
|
99
|
-
- WHILE 사용자가 인증된 상태일 때, 시스템은 보호된 리소스 접근을 허용해야 한다
|
|
100
|
-
|
|
101
|
-
## Optional Features (선택적 기능)
|
|
102
|
-
- WHERE 리프레시 토큰이 제공되면, 시스템은 새 액세스 토큰을 발급할 수 있다
|
|
103
|
-
|
|
104
|
-
## Constraints (제약사항)
|
|
105
|
-
- 액세스 토큰 만료시간은 15분을 초과해서는 안 된다
|
|
106
|
-
- 리프레시 토큰 만료시간은 7일을 초과해서는 안 된다
|
|
107
|
-
```
|
|
108
|
-
|
|
109
|
-
---
|
|
110
|
-
|
|
111
|
-
## 핵심 개념 2: @TAG 추적성
|
|
112
|
-
|
|
113
|
-
### TAG란?
|
|
114
|
-
|
|
115
|
-
**간단히 말하면**:
|
|
116
|
-
- 코드 조각마다 붙이는 이름표
|
|
117
|
-
- SPEC → TEST → CODE → DOC을 연결하는 끈
|
|
118
|
-
- 나중에 코드를 찾을 때 SPEC 번호로 검색 가능
|
|
119
|
-
|
|
120
|
-
**왜 TAG가 필요한가요?**
|
|
121
|
-
- 나중에 코드를 찾을 때 SPEC 번호로 검색 가능
|
|
122
|
-
- SPEC이 변경되면 어떤 코드를 수정할지 명확
|
|
123
|
-
- 코드 리뷰 시 "이 코드는 어떤 요구사항인가?" 즉시 파악
|
|
124
|
-
- 버그 발생 시 관련된 모든 파일을 빠르게 찾을 수 있음
|
|
125
|
-
|
|
126
|
-
### TAG 체계
|
|
127
|
-
|
|
128
|
-
MoAI-ADK는 4가지 TAG를 사용합니다:
|
|
129
|
-
|
|
130
|
-
```
|
|
131
|
-
@SPEC:ID → @TEST:ID → @CODE:ID → @DOC:ID
|
|
132
|
-
```
|
|
133
|
-
|
|
134
|
-
| TAG | 의미 | 위치 | 예시 |
|
|
135
|
-
|-----|------|------|------|
|
|
136
|
-
| `@SPEC:ID` | 요구사항 명세 | `.moai/specs/` | @SPEC:AUTH-001 |
|
|
137
|
-
| `@TEST:ID` | 테스트 코드 | `tests/` | @TEST:AUTH-001 |
|
|
138
|
-
| `@CODE:ID` | 구현 코드 | `src/` | @CODE:AUTH-001 |
|
|
139
|
-
| `@DOC:ID` | 문서 | `docs/` | @DOC:AUTH-001 |
|
|
140
|
-
|
|
141
|
-
### TAG ID 규칙
|
|
142
|
-
|
|
143
|
-
**형식**: `<도메인>-<3자리 숫자>`
|
|
144
|
-
|
|
145
|
-
**예시**:
|
|
146
|
-
- `AUTH-001`: 인증 관련 첫 번째 기능
|
|
147
|
-
- `USER-002`: 사용자 관련 두 번째 기능
|
|
148
|
-
- `PAYMENT-015`: 결제 관련 15번째 기능
|
|
149
|
-
|
|
150
|
-
**중요**: TAG ID는 한 번 할당되면 절대 변경하지 않습니다!
|
|
151
|
-
|
|
152
|
-
### 실제 예시: TAG 사용법
|
|
153
|
-
|
|
154
|
-
#### SPEC 파일 (`.moai/specs/SPEC-AUTH-001/spec.md`)
|
|
155
|
-
```yaml
|
|
156
|
-
---
|
|
157
|
-
id: AUTH-001
|
|
158
|
-
version: 0.0.1
|
|
159
|
-
status: draft
|
|
160
|
-
created: 2025-10-16
|
|
161
|
-
updated: 2025-10-16
|
|
162
|
-
author: @YourName
|
|
163
|
-
priority: high
|
|
164
|
-
---
|
|
165
|
-
|
|
166
|
-
# @SPEC:AUTH-001: JWT 인증 시스템
|
|
167
|
-
|
|
168
|
-
[요구사항 내용...]
|
|
169
|
-
```
|
|
170
|
-
|
|
171
|
-
#### 테스트 파일 (`tests/auth/service.test.ts`)
|
|
172
|
-
```typescript
|
|
173
|
-
// @TEST:AUTH-001 | SPEC: SPEC-AUTH-001.md
|
|
174
|
-
|
|
175
|
-
test('@TEST:AUTH-001: JWT 발급 on valid credentials', async () => {
|
|
176
|
-
const service = new AuthService();
|
|
177
|
-
const result = await service.authenticate('user', 'pass');
|
|
178
|
-
expect(result.token).toBeDefined();
|
|
179
|
-
});
|
|
180
|
-
```
|
|
181
|
-
|
|
182
|
-
#### 구현 파일 (`src/auth/service.ts`)
|
|
183
|
-
```typescript
|
|
184
|
-
// @CODE:AUTH-001 | SPEC: SPEC-AUTH-001.md | TEST: tests/auth/service.test.ts
|
|
185
|
-
|
|
186
|
-
export class AuthService {
|
|
187
|
-
async authenticate(username: string, password: string): Promise<AuthResult> {
|
|
188
|
-
// 구현
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
```
|
|
192
|
-
|
|
193
|
-
#### 문서 파일 (`docs/api/auth.md`)
|
|
194
|
-
```markdown
|
|
195
|
-
# @DOC:AUTH-001: 인증 API 문서
|
|
196
|
-
|
|
197
|
-
## POST /auth/login
|
|
198
|
-
[API 설명...]
|
|
199
|
-
```
|
|
200
|
-
|
|
201
|
-
### TAG 검색하기
|
|
202
|
-
|
|
203
|
-
**특정 TAG 찾기**:
|
|
204
|
-
```bash
|
|
205
|
-
# AUTH-001 관련 모든 파일 찾기
|
|
206
|
-
rg "AUTH-001" -n
|
|
207
|
-
```
|
|
208
|
-
|
|
209
|
-
**TAG 체인 검증**:
|
|
210
|
-
```bash
|
|
211
|
-
# 모든 TAG 확인
|
|
212
|
-
rg '@(SPEC|TEST|CODE|DOC):' -n .moai/specs/ tests/ src/ docs/
|
|
213
|
-
```
|
|
214
|
-
|
|
215
|
-
---
|
|
216
|
-
|
|
217
|
-
## 핵심 개념 3: TRUST 5원칙
|
|
218
|
-
|
|
219
|
-
좋은 코드를 만드는 5가지 원칙을 비유로 설명합니다:
|
|
220
|
-
|
|
221
|
-
### 1. 🧪 Test (테스트)
|
|
222
|
-
|
|
223
|
-
**비유**: 요리하기 전에 맛을 상상하는 것
|
|
224
|
-
|
|
225
|
-
**의미**:
|
|
226
|
-
- 코드 작성 전에 테스트를 먼저 작성
|
|
227
|
-
- 테스트가 통과하면 코드가 제대로 작동하는 것
|
|
228
|
-
|
|
229
|
-
**기준**:
|
|
230
|
-
- 테스트 커버리지 ≥85%
|
|
231
|
-
- SPEC → Test → Code 순서 엄수
|
|
232
|
-
|
|
233
|
-
**예시**:
|
|
234
|
-
```typescript
|
|
235
|
-
// 먼저 테스트 작성 (RED)
|
|
236
|
-
test('should add two numbers', () => {
|
|
237
|
-
expect(add(2, 3)).toBe(5); // 아직 add 함수가 없어서 실패
|
|
238
|
-
});
|
|
239
|
-
|
|
240
|
-
// 그 다음 코드 작성 (GREEN)
|
|
241
|
-
function add(a: number, b: number): number {
|
|
242
|
-
return a + b; // 테스트 통과!
|
|
243
|
-
}
|
|
244
|
-
```
|
|
245
|
-
|
|
246
|
-
### 2. 📖 Readable (읽기 쉬움)
|
|
247
|
-
|
|
248
|
-
**비유**: 깔끔한 글씨로 쓰기
|
|
249
|
-
|
|
250
|
-
**의미**:
|
|
251
|
-
- 다른 사람이 읽어도 이해할 수 있는 코드
|
|
252
|
-
- 나중에 다시 봐도 이해하기 쉬운 코드
|
|
253
|
-
|
|
254
|
-
**기준**:
|
|
255
|
-
- 함수 ≤50줄
|
|
256
|
-
- 파일 ≤300줄
|
|
257
|
-
- 복잡도 ≤10
|
|
258
|
-
- 매개변수 ≤5개
|
|
259
|
-
- 의미 있는 이름 사용
|
|
260
|
-
|
|
261
|
-
**예시**:
|
|
262
|
-
```typescript
|
|
263
|
-
// ❌ 나쁜 예: 이해하기 어려움
|
|
264
|
-
function f(x, y) {
|
|
265
|
-
return x + y;
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
// ✅ 좋은 예: 명확한 이름
|
|
269
|
-
function calculateTotal(price: number, tax: number): number {
|
|
270
|
-
return price + tax;
|
|
271
|
-
}
|
|
272
|
-
```
|
|
273
|
-
|
|
274
|
-
### 3. 🎯 Unified (통일성)
|
|
275
|
-
|
|
276
|
-
**비유**: 같은 방식 사용하기
|
|
277
|
-
|
|
278
|
-
**의미**:
|
|
279
|
-
- 같은 패턴을 일관되게 적용
|
|
280
|
-
- 한 가지 방법만 익히면 모든 곳에 적용 가능
|
|
281
|
-
|
|
282
|
-
**기준**:
|
|
283
|
-
- SPEC 기반 아키텍처
|
|
284
|
-
- 타입 안전성 또는 런타임 검증
|
|
285
|
-
- 일관된 코딩 스타일
|
|
286
|
-
|
|
287
|
-
**예시**:
|
|
288
|
-
```typescript
|
|
289
|
-
// ✅ 통일성: 모든 API가 같은 패턴
|
|
290
|
-
async function getUser(id: string): Promise<User> { ... }
|
|
291
|
-
async function getPost(id: string): Promise<Post> { ... }
|
|
292
|
-
async function getComment(id: string): Promise<Comment> { ... }
|
|
293
|
-
```
|
|
294
|
-
|
|
295
|
-
### 4. 🔒 Secured (보안)
|
|
296
|
-
|
|
297
|
-
**비유**: 집에 나갈 때 문 잠그기
|
|
298
|
-
|
|
299
|
-
**의미**:
|
|
300
|
-
- 해커나 나쁜 사람이 코드를 악용하지 못하게 보호
|
|
301
|
-
- 사용자 데이터를 안전하게 보호
|
|
302
|
-
|
|
303
|
-
**기준**:
|
|
304
|
-
- 입력 검증
|
|
305
|
-
- SQL Injection 방어
|
|
306
|
-
- XSS/CSRF 방어
|
|
307
|
-
- 비밀번호 해싱
|
|
308
|
-
- 민감 데이터 보호
|
|
309
|
-
|
|
310
|
-
**예시**:
|
|
311
|
-
```typescript
|
|
312
|
-
// ❌ 나쁜 예: SQL Injection 위험
|
|
313
|
-
const query = `SELECT * FROM users WHERE id = '${userId}'`;
|
|
314
|
-
|
|
315
|
-
// ✅ 좋은 예: Prepared Statement 사용
|
|
316
|
-
const query = 'SELECT * FROM users WHERE id = ?';
|
|
317
|
-
const user = await db.execute(query, [userId]);
|
|
318
|
-
|
|
319
|
-
// ❌ 나쁜 예: 비밀번호 평문 저장
|
|
320
|
-
user.password = password;
|
|
321
|
-
|
|
322
|
-
// ✅ 좋은 예: 비밀번호 해싱
|
|
323
|
-
user.password = await bcrypt.hash(password, 10);
|
|
324
|
-
```
|
|
325
|
-
|
|
326
|
-
### 5. 🔗 Trackable (추적 가능)
|
|
327
|
-
|
|
328
|
-
**비유**: 옷장 정리할 때 상자마다 이름표 붙이기
|
|
329
|
-
|
|
330
|
-
**의미**:
|
|
331
|
-
- 나중에 필요한 코드를 빠르게 찾을 수 있음
|
|
332
|
-
- 코드 변경 이력을 추적 가능
|
|
333
|
-
|
|
334
|
-
**기준**:
|
|
335
|
-
- @TAG 시스템 사용
|
|
336
|
-
- SPEC과 코드 연결
|
|
337
|
-
- Git 커밋 메시지에 TAG 포함
|
|
338
|
-
|
|
339
|
-
**예시**:
|
|
340
|
-
```typescript
|
|
341
|
-
// @CODE:AUTH-001 | SPEC: SPEC-AUTH-001.md | TEST: tests/auth/service.test.ts
|
|
342
|
-
export class AuthService {
|
|
343
|
-
// 구현
|
|
344
|
-
}
|
|
345
|
-
|
|
346
|
-
// Git 커밋 메시지
|
|
347
|
-
// 🟢 feat(AUTH-001): implement JWT authentication
|
|
348
|
-
```
|
|
349
|
-
|
|
350
|
-
---
|
|
351
|
-
|
|
352
|
-
## 핵심 개념 4: Alfred와 9개 에이전트
|
|
353
|
-
|
|
354
|
-
### Alfred란?
|
|
355
|
-
|
|
356
|
-
**간단히 말하면**:
|
|
357
|
-
- MoAI-ADK의 중앙 오케스트레이터 (지휘자)
|
|
358
|
-
- 9개 전문 에이전트를 조율하여 최적의 도움 제공
|
|
359
|
-
- 사용자 요청을 분석하고 적절한 에이전트에게 작업 위임
|
|
360
|
-
|
|
361
|
-
**비유**: 오케스트라 지휘자처럼 여러 전문가를 조율
|
|
362
|
-
|
|
363
|
-
### 주요 에이전트 (간단 소개)
|
|
364
|
-
|
|
365
|
-
| 에이전트 | 역할 | 언제 사용 |
|
|
366
|
-
|---------|------|----------|
|
|
367
|
-
| 🏗️ spec-builder | SPEC 작성 전문가 | `/alfred:1-spec` 명령어 |
|
|
368
|
-
| 💎 code-builder | TDD 구현 전문가 | `/alfred:2-build` 명령어 |
|
|
369
|
-
| 📖 doc-syncer | 문서 동기화 전문가 | `/alfred:3-sync` 명령어 |
|
|
370
|
-
| 🔬 debug-helper | 디버깅 전문가 | 에러 발생 시 자동 호출 |
|
|
371
|
-
| ✅ trust-checker | 품질 검증 전문가 | 코드 품질 확인 시 |
|
|
372
|
-
| 🏷️ tag-agent | TAG 관리 전문가 | TAG 검증 시 |
|
|
373
|
-
|
|
374
|
-
**전체 에이전트 목록**: `AGENTS.md` 파일을 참조하세요
|
|
375
|
-
|
|
376
|
-
### Alfred가 작동하는 방식
|
|
377
|
-
|
|
378
|
-
```
|
|
379
|
-
사용자 요청
|
|
380
|
-
↓
|
|
381
|
-
Alfred가 요청 분석
|
|
382
|
-
↓
|
|
383
|
-
적절한 전문 에이전트에게 위임
|
|
384
|
-
↓
|
|
385
|
-
에이전트가 작업 수행
|
|
386
|
-
↓
|
|
387
|
-
Alfred가 결과 통합하여 보고
|
|
388
|
-
```
|
|
389
|
-
|
|
390
|
-
---
|
|
391
|
-
|
|
392
|
-
## 3단계 워크플로우 익히기
|
|
393
|
-
|
|
394
|
-
MoAI-ADK의 핵심은 이 3단계 워크플로우입니다:
|
|
395
|
-
|
|
396
|
-
```
|
|
397
|
-
/alfred:1-spec → /alfred:2-build → /alfred:3-sync
|
|
398
|
-
```
|
|
399
|
-
|
|
400
|
-
### 1단계: SPEC 작성 (`/alfred:1-spec`)
|
|
401
|
-
|
|
402
|
-
**무엇을 하나요?**
|
|
403
|
-
- 요구사항을 EARS 구문으로 작성
|
|
404
|
-
- `.moai/specs/SPEC-{ID}/spec.md` 파일 생성
|
|
405
|
-
- @SPEC:ID TAG 자동 할당
|
|
406
|
-
- Git 브랜치 생성 (옵션)
|
|
407
|
-
|
|
408
|
-
**사용 예시**:
|
|
409
|
-
```bash
|
|
410
|
-
/alfred:1-spec "JWT 인증 시스템"
|
|
411
|
-
```
|
|
412
|
-
|
|
413
|
-
**Alfred가 자동으로 수행**:
|
|
414
|
-
1. 중복 확인: "AUTH-001이 이미 존재하나요?"
|
|
415
|
-
2. SPEC 파일 생성: `.moai/specs/SPEC-AUTH-001/spec.md`
|
|
416
|
-
3. YAML 메타데이터 추가:
|
|
417
|
-
```yaml
|
|
418
|
-
---
|
|
419
|
-
id: AUTH-001
|
|
420
|
-
version: 0.0.1
|
|
421
|
-
status: draft
|
|
422
|
-
created: 2025-10-16
|
|
423
|
-
updated: 2025-10-16
|
|
424
|
-
author: @YourName
|
|
425
|
-
priority: high
|
|
426
|
-
---
|
|
427
|
-
```
|
|
428
|
-
4. EARS 구문 템플릿 제공
|
|
429
|
-
5. @SPEC:AUTH-001 TAG 할당
|
|
430
|
-
|
|
431
|
-
**결과물 예시**:
|
|
432
|
-
```yaml
|
|
433
|
-
---
|
|
434
|
-
id: AUTH-001
|
|
435
|
-
version: 0.0.1
|
|
436
|
-
status: draft
|
|
437
|
-
created: 2025-10-16
|
|
438
|
-
updated: 2025-10-16
|
|
439
|
-
author: @YourName
|
|
440
|
-
priority: high
|
|
441
|
-
---
|
|
442
|
-
|
|
443
|
-
# @SPEC:AUTH-001: JWT 인증 시스템
|
|
444
|
-
|
|
445
|
-
## Ubiquitous Requirements
|
|
446
|
-
- 시스템은 JWT 기반 인증을 제공해야 한다
|
|
447
|
-
|
|
448
|
-
## Event-driven Requirements
|
|
449
|
-
- WHEN 유효한 자격증명 제공 시, 시스템은 JWT 토큰을 발급해야 한다
|
|
450
|
-
- WHEN 토큰이 만료되면, 시스템은 401 에러를 반환해야 한다
|
|
451
|
-
|
|
452
|
-
## Constraints
|
|
453
|
-
- 토큰 만료시간은 15분을 초과해서는 안 된다
|
|
454
|
-
```
|
|
455
|
-
|
|
456
|
-
### 2단계: TDD 구현 (`/alfred:2-build`)
|
|
457
|
-
|
|
458
|
-
**무엇을 하나요?**
|
|
459
|
-
- **RED**: 실패하는 테스트 작성 (`@TEST:ID`)
|
|
460
|
-
- **GREEN**: 최소 구현으로 테스트 통과 (`@CODE:ID`)
|
|
461
|
-
- **REFACTOR**: 코드 품질 개선 (TRUST 5원칙 적용)
|
|
462
|
-
|
|
463
|
-
**사용 예시**:
|
|
464
|
-
```bash
|
|
465
|
-
/alfred:2-build AUTH-001
|
|
466
|
-
```
|
|
467
|
-
|
|
468
|
-
**Alfred가 자동으로 수행**:
|
|
469
|
-
|
|
470
|
-
#### 🔴 RED: 실패하는 테스트 작성
|
|
471
|
-
```typescript
|
|
472
|
-
// tests/auth/service.test.ts
|
|
473
|
-
// @TEST:AUTH-001 | SPEC: SPEC-AUTH-001.md
|
|
474
|
-
|
|
475
|
-
test('@TEST:AUTH-001: JWT 발급 on valid credentials', async () => {
|
|
476
|
-
const service = new AuthService();
|
|
477
|
-
const result = await service.authenticate('user', 'pass');
|
|
478
|
-
expect(result.token).toBeDefined();
|
|
479
|
-
expect(result.expiresIn).toBeLessThanOrEqual(900); // 15분
|
|
480
|
-
});
|
|
481
|
-
```
|
|
482
|
-
|
|
483
|
-
**테스트 실행**: ❌ FAIL (AuthService가 아직 없음)
|
|
484
|
-
|
|
485
|
-
#### 🟢 GREEN: 최소 구현
|
|
486
|
-
```typescript
|
|
487
|
-
// src/auth/service.ts
|
|
488
|
-
// @CODE:AUTH-001 | SPEC: SPEC-AUTH-001.md | TEST: tests/auth/service.test.ts
|
|
489
|
-
|
|
490
|
-
export class AuthService {
|
|
491
|
-
async authenticate(username: string, password: string): Promise<AuthResult> {
|
|
492
|
-
return {
|
|
493
|
-
token: jwt.sign({ username }, SECRET, { expiresIn: '15m' }),
|
|
494
|
-
expiresIn: 900
|
|
495
|
-
};
|
|
496
|
-
}
|
|
497
|
-
}
|
|
498
|
-
```
|
|
499
|
-
|
|
500
|
-
**테스트 실행**: ✅ PASS
|
|
501
|
-
|
|
502
|
-
#### ♻️ REFACTOR: 품질 개선
|
|
503
|
-
```typescript
|
|
504
|
-
// 입력 검증 추가 (Secured)
|
|
505
|
-
if (!username || !password) {
|
|
506
|
-
throw new ValidationError('Username and password required');
|
|
507
|
-
}
|
|
508
|
-
|
|
509
|
-
// 함수 분리 (Readable)
|
|
510
|
-
private generateToken(username: string): string {
|
|
511
|
-
return jwt.sign({ username }, SECRET, { expiresIn: '15m' });
|
|
512
|
-
}
|
|
513
|
-
|
|
514
|
-
// 복잡도 감소 (Unified)
|
|
515
|
-
```
|
|
516
|
-
|
|
517
|
-
**테스트 실행**: ✅ PASS
|
|
518
|
-
**TRUST 검증**: ✅ 모두 통과
|
|
519
|
-
|
|
520
|
-
**Git 커밋**:
|
|
521
|
-
```bash
|
|
522
|
-
1. 🔴 RED: test(AUTH-001): add failing auth service test
|
|
523
|
-
2. 🟢 GREEN: feat(AUTH-001): implement minimal auth service
|
|
524
|
-
3. ♻️ REFACTOR: refactor(AUTH-001): improve code quality per TRUST
|
|
525
|
-
```
|
|
526
|
-
|
|
527
|
-
### 3단계: 문서 동기화 (`/alfred:3-sync`)
|
|
528
|
-
|
|
529
|
-
**무엇을 하나요?**
|
|
530
|
-
- TAG 체인 검증 (@SPEC → @TEST → @CODE → @DOC)
|
|
531
|
-
- 고아 TAG 탐지 (SPEC 없는 CODE 등)
|
|
532
|
-
- Living Document 자동 생성
|
|
533
|
-
- PR 상태 업데이트 (Draft → Ready)
|
|
534
|
-
|
|
535
|
-
**사용 예시**:
|
|
536
|
-
```bash
|
|
537
|
-
/alfred:3-sync
|
|
538
|
-
```
|
|
539
|
-
|
|
540
|
-
**Alfred가 자동으로 수행**:
|
|
541
|
-
|
|
542
|
-
1. **TAG 체인 검증**:
|
|
543
|
-
```bash
|
|
544
|
-
rg '@(SPEC|TEST|CODE|DOC):' -n .moai/specs/ tests/ src/ docs/
|
|
545
|
-
```
|
|
546
|
-
|
|
547
|
-
2. **검증 결과**:
|
|
548
|
-
```
|
|
549
|
-
✓ @SPEC:AUTH-001 → .moai/specs/SPEC-AUTH-001.md
|
|
550
|
-
✓ @TEST:AUTH-001 → tests/auth/service.test.ts
|
|
551
|
-
✓ @CODE:AUTH-001 → src/auth/service.ts
|
|
552
|
-
✓ @DOC:AUTH-001 → docs/api/auth.md
|
|
553
|
-
|
|
554
|
-
TAG 체인 완전성: 100%
|
|
555
|
-
고아 TAG: 없음
|
|
556
|
-
SPEC 버전 일치: v0.0.1
|
|
557
|
-
```
|
|
558
|
-
|
|
559
|
-
3. **Living Document 생성**:
|
|
560
|
-
```markdown
|
|
561
|
-
# @DOC:AUTH-001: 인증 API 문서
|
|
562
|
-
|
|
563
|
-
## POST /auth/login
|
|
564
|
-
|
|
565
|
-
**요구사항**: @SPEC:AUTH-001
|
|
566
|
-
**구현**: @CODE:AUTH-001
|
|
567
|
-
**테스트**: @TEST:AUTH-001
|
|
568
|
-
|
|
569
|
-
[자동 생성된 API 문서...]
|
|
570
|
-
```
|
|
571
|
-
|
|
572
|
-
4. **PR 상태 전환 제안**:
|
|
573
|
-
```
|
|
574
|
-
PR #123: feature/spec-auth-001
|
|
575
|
-
현재 상태: Draft
|
|
576
|
-
제안: Ready for Review
|
|
577
|
-
|
|
578
|
-
SPEC 요구사항: ✅ 모두 충족
|
|
579
|
-
TDD 이력: ✅ RED → GREEN → REFACTOR
|
|
580
|
-
TRUST 검증: ✅ 모두 통과
|
|
581
|
-
|
|
582
|
-
PR Ready 전환? (y/n)
|
|
583
|
-
```
|
|
584
|
-
|
|
585
|
-
---
|
|
586
|
-
|
|
587
|
-
## 실전 예시: 간단한 계산기 만들기
|
|
588
|
-
|
|
589
|
-
3단계 워크플로우를 실제로 사용해봅시다!
|
|
590
|
-
|
|
591
|
-
### 1️⃣ SPEC 작성
|
|
592
|
-
```bash
|
|
593
|
-
/alfred:1-spec "두 숫자를 더하는 계산기"
|
|
594
|
-
|
|
595
|
-
# Alfred가 생성: .moai/specs/SPEC-CALC-001/spec.md
|
|
596
|
-
```
|
|
597
|
-
|
|
598
|
-
**생성된 SPEC**:
|
|
599
|
-
```yaml
|
|
600
|
-
---
|
|
601
|
-
id: CALC-001
|
|
602
|
-
version: 0.0.1
|
|
603
|
-
status: draft
|
|
604
|
-
created: 2025-10-16
|
|
605
|
-
updated: 2025-10-16
|
|
606
|
-
author: @YourName
|
|
607
|
-
priority: medium
|
|
608
|
-
---
|
|
609
|
-
|
|
610
|
-
# @SPEC:CALC-001: 계산기 - 덧셈 기능
|
|
611
|
-
|
|
612
|
-
## Ubiquitous Requirements
|
|
613
|
-
- 시스템은 두 숫자의 덧셈을 제공해야 한다
|
|
614
|
-
|
|
615
|
-
## Event-driven Requirements
|
|
616
|
-
- WHEN 두 숫자가 입력되면, 시스템은 합계를 반환해야 한다
|
|
617
|
-
|
|
618
|
-
## Constraints
|
|
619
|
-
- 입력은 숫자여야 한다
|
|
620
|
-
- 결과는 정확해야 한다
|
|
621
|
-
```
|
|
622
|
-
|
|
623
|
-
### 2️⃣ TDD 구현
|
|
624
|
-
```bash
|
|
625
|
-
/alfred:2-build CALC-001
|
|
626
|
-
|
|
627
|
-
# Alfred가 Red-Green-Refactor 자동 수행
|
|
628
|
-
```
|
|
629
|
-
|
|
630
|
-
**생성된 코드**:
|
|
631
|
-
```typescript
|
|
632
|
-
// tests/calc.test.ts
|
|
633
|
-
// @TEST:CALC-001 | SPEC: SPEC-CALC-001.md
|
|
634
|
-
test('@TEST:CALC-001: should add two numbers', () => {
|
|
635
|
-
expect(add(2, 3)).toBe(5);
|
|
636
|
-
expect(add(10, 20)).toBe(30);
|
|
637
|
-
});
|
|
638
|
-
|
|
639
|
-
// src/calc.ts
|
|
640
|
-
// @CODE:CALC-001 | SPEC: SPEC-CALC-001.md | TEST: tests/calc.test.ts
|
|
641
|
-
export function add(a: number, b: number): number {
|
|
642
|
-
if (typeof a !== 'number' || typeof b !== 'number') {
|
|
643
|
-
throw new TypeError('Both arguments must be numbers');
|
|
644
|
-
}
|
|
645
|
-
return a + b;
|
|
646
|
-
}
|
|
647
|
-
```
|
|
648
|
-
|
|
649
|
-
### 3️⃣ 문서 동기화
|
|
650
|
-
```bash
|
|
651
|
-
/alfred:3-sync
|
|
652
|
-
|
|
653
|
-
# TAG 검증 및 문서 생성
|
|
654
|
-
```
|
|
655
|
-
|
|
656
|
-
**결과**:
|
|
657
|
-
```
|
|
658
|
-
✓ @SPEC:CALC-001
|
|
659
|
-
✓ @TEST:CALC-001
|
|
660
|
-
✓ @CODE:CALC-001
|
|
661
|
-
✓ @DOC:CALC-001
|
|
662
|
-
|
|
663
|
-
완성! 3개 명령어로 SPEC → TEST → CODE → DOC 완성!
|
|
664
|
-
```
|
|
665
|
-
|
|
666
|
-
---
|
|
667
|
-
|
|
668
|
-
## 다음 단계
|
|
669
|
-
|
|
670
|
-
### MoAI-ADK를 익혔다면
|
|
671
|
-
|
|
672
|
-
이제 다른 스타일로 전환하여 실무에 적용해봅시다:
|
|
673
|
-
|
|
674
|
-
| 다음 목표 | 권장 스타일 | 전환 명령어 |
|
|
675
|
-
|----------|------------|------------|
|
|
676
|
-
| 실무 프로젝트 개발 | **agentic-coding** | `/output-style agentic-coding` |
|
|
677
|
-
| 새로운 언어/프레임워크 학습 | **study-with-alfred** | `/output-style study-with-alfred` |
|
|
678
|
-
|
|
679
|
-
### 더 배우기
|
|
680
|
-
|
|
681
|
-
**상세 가이드**:
|
|
682
|
-
- `.moai/memory/development-guide.md` - 개발 상세 가이드
|
|
683
|
-
- `.moai/project/structure.md` - 프로젝트 구조
|
|
684
|
-
- `.moai/memory/spec-metadata.md` - SPEC 메타데이터 표준
|
|
685
|
-
|
|
686
|
-
**에이전트 문서**:
|
|
687
|
-
- `AGENTS.md` - 9개 전문 에이전트 상세 설명
|
|
688
|
-
|
|
689
|
-
---
|
|
690
|
-
|
|
691
|
-
**MoAI ADK Learning**: MoAI-ADK의 핵심 개념과 워크플로우를 쉽게 배워 빠르게 익힐 수 있도록 돕는 친절한 학습 모드입니다.
|