moai-adk 0.3.12__py3-none-any.whl → 0.4.0__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 +8 -1
- moai_adk/__main__.py +1 -1
- moai_adk/cli/commands/__init__.py +1 -1
- moai_adk/cli/commands/doctor.py +2 -2
- moai_adk/cli/commands/status.py +1 -1
- moai_adk/cli/commands/update.py +136 -90
- moai_adk/cli/prompts/init_prompts.py +1 -1
- moai_adk/core/__init__.py +1 -1
- moai_adk/core/git/branch.py +1 -1
- moai_adk/core/git/manager.py +1 -1
- moai_adk/core/project/detector.py +14 -2
- moai_adk/core/quality/__init__.py +1 -1
- moai_adk/core/quality/trust_checker.py +1 -1
- moai_adk/core/quality/validators/__init__.py +1 -1
- moai_adk/core/quality/validators/base_validator.py +1 -1
- moai_adk/core/template/__init__.py +1 -1
- moai_adk/core/template/backup.py +2 -1
- moai_adk/core/template/config.py +24 -0
- moai_adk/core/template/languages.py +1 -1
- moai_adk/core/template/merger.py +58 -1
- moai_adk/core/template/processor.py +41 -12
- moai_adk/templates/.claude/agents/alfred/cc-manager.md +558 -3
- moai_adk/templates/.claude/commands/alfred/0-project.md +480 -12
- moai_adk/templates/.claude/commands/alfred/1-plan.md +563 -0
- moai_adk/templates/.claude/commands/alfred/1-spec.md +15 -516
- moai_adk/templates/.claude/commands/alfred/2-build.md +15 -417
- moai_adk/templates/.claude/commands/alfred/2-run.md +460 -0
- moai_adk/templates/.claude/hooks/alfred/handlers/session.py +12 -0
- moai_adk/templates/.claude/skills/moai-claude-code/SKILL.md +67 -0
- moai_adk/templates/.claude/skills/moai-claude-code/examples.md +513 -0
- moai_adk/templates/.claude/skills/moai-claude-code/reference.md +419 -0
- moai_adk/templates/.claude/skills/moai-claude-code/templates/agent-full.md +332 -0
- moai_adk/templates/.claude/skills/moai-claude-code/templates/command-full.md +384 -0
- moai_adk/templates/.claude/skills/moai-claude-code/templates/plugin-full.json +349 -0
- moai_adk/templates/.claude/skills/moai-claude-code/templates/settings-full.json +552 -0
- moai_adk/templates/.claude/skills/moai-claude-code/templates/skill-full.md +499 -0
- moai_adk/templates/.claude/skills/moai-domain-backend/SKILL.md +68 -0
- moai_adk/templates/.claude/skills/moai-domain-cli-tool/SKILL.md +64 -0
- moai_adk/templates/.claude/skills/moai-domain-data-science/SKILL.md +67 -0
- moai_adk/templates/.claude/skills/moai-domain-database/SKILL.md +69 -0
- moai_adk/templates/.claude/skills/moai-domain-devops/SKILL.md +69 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/SKILL.md +68 -0
- moai_adk/templates/.claude/skills/moai-domain-ml/SKILL.md +67 -0
- moai_adk/templates/.claude/skills/moai-domain-mobile-app/SKILL.md +62 -0
- moai_adk/templates/.claude/skills/moai-domain-security/SKILL.md +74 -0
- moai_adk/templates/.claude/skills/moai-domain-web-api/SKILL.md +66 -0
- moai_adk/templates/.claude/skills/moai-essentials-debug/SKILL.md +66 -0
- moai_adk/templates/.claude/skills/moai-essentials-perf/SKILL.md +68 -0
- moai_adk/templates/.claude/skills/moai-essentials-refactor/SKILL.md +59 -0
- moai_adk/templates/.claude/skills/moai-essentials-review/SKILL.md +76 -0
- moai_adk/templates/.claude/skills/moai-foundation-ears/SKILL.md +61 -0
- moai_adk/templates/.claude/skills/moai-foundation-git/SKILL.md +63 -0
- moai_adk/templates/.claude/skills/moai-foundation-langs/SKILL.md +64 -0
- moai_adk/templates/.claude/skills/moai-foundation-specs/SKILL.md +61 -0
- moai_adk/templates/.claude/skills/moai-foundation-tags/SKILL.md +54 -0
- moai_adk/templates/.claude/skills/moai-foundation-trust/SKILL.md +46 -0
- moai_adk/templates/.claude/skills/moai-lang-c/SKILL.md +68 -0
- moai_adk/templates/.claude/skills/moai-lang-clojure/SKILL.md +68 -0
- moai_adk/templates/.claude/skills/moai-lang-cpp/SKILL.md +69 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/SKILL.md +67 -0
- moai_adk/templates/.claude/skills/moai-lang-dart/SKILL.md +66 -0
- moai_adk/templates/.claude/skills/moai-lang-elixir/SKILL.md +66 -0
- moai_adk/templates/.claude/skills/moai-lang-go/SKILL.md +67 -0
- moai_adk/templates/.claude/skills/moai-lang-haskell/SKILL.md +67 -0
- moai_adk/templates/.claude/skills/moai-lang-java/SKILL.md +66 -0
- moai_adk/templates/.claude/skills/moai-lang-javascript/SKILL.md +64 -0
- moai_adk/templates/.claude/skills/moai-lang-julia/SKILL.md +66 -0
- moai_adk/templates/.claude/skills/moai-lang-kotlin/SKILL.md +67 -0
- moai_adk/templates/.claude/skills/moai-lang-lua/SKILL.md +65 -0
- moai_adk/templates/.claude/skills/moai-lang-php/SKILL.md +65 -0
- moai_adk/templates/.claude/skills/moai-lang-python/SKILL.md +64 -0
- moai_adk/templates/.claude/skills/moai-lang-r/SKILL.md +66 -0
- moai_adk/templates/.claude/skills/moai-lang-ruby/SKILL.md +66 -0
- moai_adk/templates/.claude/skills/moai-lang-rust/SKILL.md +68 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/SKILL.md +68 -0
- moai_adk/templates/.claude/skills/moai-lang-shell/SKILL.md +67 -0
- moai_adk/templates/.claude/skills/moai-lang-sql/SKILL.md +68 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/SKILL.md +67 -0
- moai_adk/templates/.claude/skills/moai-lang-typescript/SKILL.md +64 -0
- moai_adk/templates/.claude/skills/scripts/standardize_skills.py +166 -0
- moai_adk/templates/.claude/skills/scripts/verify_standardization.sh +43 -0
- moai_adk/templates/CLAUDE.md +153 -0
- moai_adk/templates/__init__.py +1 -1
- moai_adk/utils/__init__.py +1 -1
- moai_adk/utils/banner.py +1 -1
- moai_adk/utils/logger.py +1 -1
- {moai_adk-0.3.12.dist-info → moai_adk-0.4.0.dist-info}/METADATA +244 -3
- moai_adk-0.4.0.dist-info/RECORD +145 -0
- moai_adk-0.3.12.dist-info/RECORD +0 -90
- {moai_adk-0.3.12.dist-info → moai_adk-0.4.0.dist-info}/WHEEL +0 -0
- {moai_adk-0.3.12.dist-info → moai_adk-0.4.0.dist-info}/entry_points.txt +0 -0
- {moai_adk-0.3.12.dist-info → moai_adk-0.4.0.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Skills 표준화 통합 스크립트
|
|
4
|
+
- YAML 필드 정리 (version, author, license, tags, model 제거)
|
|
5
|
+
- allowed-tools 추가 (누락된 스킬에만)
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import sys
|
|
9
|
+
import re
|
|
10
|
+
from pathlib import Path
|
|
11
|
+
|
|
12
|
+
# Alfred 에이전트 도구
|
|
13
|
+
ALFRED_TOOLS = ["Read", "Write", "Edit", "Bash", "TodoWrite"]
|
|
14
|
+
# Lang 스킬 도구
|
|
15
|
+
LANG_TOOLS = ["Read", "Bash"]
|
|
16
|
+
# Domain 스킬 도구
|
|
17
|
+
DOMAIN_TOOLS = ["Read", "Bash"]
|
|
18
|
+
|
|
19
|
+
def parse_yaml_frontmatter(content):
|
|
20
|
+
"""YAML frontmatter 파싱 (간단한 파서)"""
|
|
21
|
+
if not content.startswith('---'):
|
|
22
|
+
return None, content
|
|
23
|
+
|
|
24
|
+
parts = content.split('---', 2)
|
|
25
|
+
if len(parts) < 3:
|
|
26
|
+
return None, content
|
|
27
|
+
|
|
28
|
+
yaml_str = parts[1]
|
|
29
|
+
body = parts[2]
|
|
30
|
+
|
|
31
|
+
# YAML 파싱 (딕셔너리로)
|
|
32
|
+
data = {}
|
|
33
|
+
current_key = None
|
|
34
|
+
in_list = False
|
|
35
|
+
|
|
36
|
+
for line in yaml_str.strip().split('\n'):
|
|
37
|
+
if not line.strip():
|
|
38
|
+
continue
|
|
39
|
+
|
|
40
|
+
# 리스트 아이템
|
|
41
|
+
if line.strip().startswith('-'):
|
|
42
|
+
if in_list and current_key:
|
|
43
|
+
if isinstance(data[current_key], list):
|
|
44
|
+
data[current_key].append(line.strip()[1:].strip())
|
|
45
|
+
continue
|
|
46
|
+
|
|
47
|
+
# 키-값 쌍
|
|
48
|
+
if ':' in line:
|
|
49
|
+
key, value = line.split(':', 1)
|
|
50
|
+
key = key.strip()
|
|
51
|
+
value = value.strip()
|
|
52
|
+
|
|
53
|
+
if not value: # 리스트 시작
|
|
54
|
+
in_list = True
|
|
55
|
+
current_key = key
|
|
56
|
+
data[key] = []
|
|
57
|
+
else:
|
|
58
|
+
in_list = False
|
|
59
|
+
current_key = None
|
|
60
|
+
data[key] = value
|
|
61
|
+
|
|
62
|
+
return data, body
|
|
63
|
+
|
|
64
|
+
def build_yaml_frontmatter(data):
|
|
65
|
+
"""딕셔너리를 YAML frontmatter로 변환"""
|
|
66
|
+
lines = []
|
|
67
|
+
for key, value in data.items():
|
|
68
|
+
if isinstance(value, list):
|
|
69
|
+
lines.append(f"{key}:")
|
|
70
|
+
for item in value:
|
|
71
|
+
lines.append(f" - {item}")
|
|
72
|
+
else:
|
|
73
|
+
lines.append(f"{key}: {value}")
|
|
74
|
+
|
|
75
|
+
return '\n'.join(lines)
|
|
76
|
+
|
|
77
|
+
def standardize_skill(skill_file):
|
|
78
|
+
"""스킬 파일 표준화"""
|
|
79
|
+
content = skill_file.read_text()
|
|
80
|
+
|
|
81
|
+
data, body = parse_yaml_frontmatter(content)
|
|
82
|
+
|
|
83
|
+
if data is None:
|
|
84
|
+
print(f"⚠️ No YAML frontmatter: {skill_file}")
|
|
85
|
+
return False
|
|
86
|
+
|
|
87
|
+
# 보존할 필드만 추출
|
|
88
|
+
preserved = {}
|
|
89
|
+
|
|
90
|
+
if 'name' in data:
|
|
91
|
+
preserved['name'] = data['name']
|
|
92
|
+
if 'description' in data:
|
|
93
|
+
preserved['description'] = data['description']
|
|
94
|
+
|
|
95
|
+
# allowed-tools 처리
|
|
96
|
+
if 'allowed-tools' in data:
|
|
97
|
+
# 이미 있으면 유지
|
|
98
|
+
preserved['allowed-tools'] = data['allowed-tools']
|
|
99
|
+
else:
|
|
100
|
+
# 없으면 스킬 유형별로 추가
|
|
101
|
+
name = data.get('name', '')
|
|
102
|
+
|
|
103
|
+
if 'alfred' in name:
|
|
104
|
+
tools = ALFRED_TOOLS
|
|
105
|
+
elif 'lang' in name:
|
|
106
|
+
tools = LANG_TOOLS
|
|
107
|
+
elif 'domain' in name:
|
|
108
|
+
tools = DOMAIN_TOOLS
|
|
109
|
+
elif 'claude-code' in name:
|
|
110
|
+
# moai-claude-code는 이미 allowed-tools 있음 (건너뛰기)
|
|
111
|
+
tools = None
|
|
112
|
+
else:
|
|
113
|
+
# 기본값
|
|
114
|
+
tools = ["Read"]
|
|
115
|
+
|
|
116
|
+
if tools:
|
|
117
|
+
preserved['allowed-tools'] = tools
|
|
118
|
+
|
|
119
|
+
# 파일 재작성
|
|
120
|
+
new_yaml = build_yaml_frontmatter(preserved)
|
|
121
|
+
new_content = f"---\n{new_yaml}\n---{body}"
|
|
122
|
+
|
|
123
|
+
skill_file.write_text(new_content)
|
|
124
|
+
print(f"✅ Standardized: {skill_file.name}")
|
|
125
|
+
return True
|
|
126
|
+
|
|
127
|
+
def main():
|
|
128
|
+
"""메인 함수"""
|
|
129
|
+
base_dir = Path("/Users/goos/MoAI/MoAI-ADK")
|
|
130
|
+
|
|
131
|
+
# .claude/skills/
|
|
132
|
+
skills_dir = base_dir / ".claude/skills"
|
|
133
|
+
success_count = 0
|
|
134
|
+
fail_count = 0
|
|
135
|
+
|
|
136
|
+
for skill_dir in sorted(skills_dir.glob("moai-*")):
|
|
137
|
+
skill_file = skill_dir / "SKILL.md"
|
|
138
|
+
if skill_file.exists():
|
|
139
|
+
try:
|
|
140
|
+
if standardize_skill(skill_file):
|
|
141
|
+
success_count += 1
|
|
142
|
+
else:
|
|
143
|
+
fail_count += 1
|
|
144
|
+
except Exception as e:
|
|
145
|
+
print(f"❌ Error: {skill_file.name} - {e}")
|
|
146
|
+
fail_count += 1
|
|
147
|
+
|
|
148
|
+
# src/moai_adk/templates/.claude/skills/
|
|
149
|
+
templates_dir = base_dir / "src/moai_adk/templates/.claude/skills"
|
|
150
|
+
for skill_dir in sorted(templates_dir.glob("moai-*")):
|
|
151
|
+
skill_file = skill_dir / "SKILL.md"
|
|
152
|
+
if skill_file.exists():
|
|
153
|
+
try:
|
|
154
|
+
if standardize_skill(skill_file):
|
|
155
|
+
success_count += 1
|
|
156
|
+
else:
|
|
157
|
+
fail_count += 1
|
|
158
|
+
except Exception as e:
|
|
159
|
+
print(f"❌ Error: {skill_file.name} - {e}")
|
|
160
|
+
fail_count += 1
|
|
161
|
+
|
|
162
|
+
print(f"\n📊 Summary: {success_count} succeeded, {fail_count} failed")
|
|
163
|
+
return 0 if fail_count == 0 else 1
|
|
164
|
+
|
|
165
|
+
if __name__ == "__main__":
|
|
166
|
+
sys.exit(main())
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
|
|
3
|
+
echo "=== Skills 표준화 검증 ==="
|
|
4
|
+
|
|
5
|
+
# 1. 파일명 검증
|
|
6
|
+
skill_md_count=$(find .claude/skills/ -name "skill.md" 2>/dev/null | wc -l | tr -d ' ')
|
|
7
|
+
SKILL_md_count=$(find .claude/skills/ -name "SKILL.md" 2>/dev/null | wc -l | tr -d ' ')
|
|
8
|
+
|
|
9
|
+
echo "1. 파일명 표준화:"
|
|
10
|
+
echo " - skill.md (비표준): $skill_md_count (0이어야 함)"
|
|
11
|
+
echo " - SKILL.md (표준): $SKILL_md_count (46이어야 함)"
|
|
12
|
+
|
|
13
|
+
# 2. 중복 템플릿 검증
|
|
14
|
+
duplicate_count=$(ls .claude/skills/ 2>/dev/null | grep -c "moai-cc-.*-template" || echo 0)
|
|
15
|
+
|
|
16
|
+
echo "2. 중복 템플릿:"
|
|
17
|
+
echo " - moai-cc-*-template: $duplicate_count (0이어야 함)"
|
|
18
|
+
|
|
19
|
+
# 3. YAML 필드 검증
|
|
20
|
+
version_count=$(rg "^version:" .claude/skills/*/SKILL.md 2>/dev/null | wc -l | tr -d ' ')
|
|
21
|
+
model_count=$(rg "^model:" .claude/skills/*/SKILL.md 2>/dev/null | wc -l | tr -d ' ')
|
|
22
|
+
allowed_tools_count=$(rg "^allowed-tools:" .claude/skills/*/SKILL.md 2>/dev/null | wc -l | tr -d ' ')
|
|
23
|
+
|
|
24
|
+
echo "3. YAML 필드:"
|
|
25
|
+
echo " - version 필드: $version_count (0이어야 함)"
|
|
26
|
+
echo " - model 필드: $model_count (0이어야 함)"
|
|
27
|
+
echo " - allowed-tools 필드: $allowed_tools_count (46이어야 함)"
|
|
28
|
+
|
|
29
|
+
# 종합 판정
|
|
30
|
+
if [ "$skill_md_count" -eq 0 ] && \
|
|
31
|
+
[ "$SKILL_md_count" -eq 46 ] && \
|
|
32
|
+
[ "$duplicate_count" -eq 0 ] && \
|
|
33
|
+
[ "$version_count" -eq 0 ] && \
|
|
34
|
+
[ "$model_count" -eq 0 ] && \
|
|
35
|
+
[ "$allowed_tools_count" -eq 46 ]; then
|
|
36
|
+
echo ""
|
|
37
|
+
echo "✅ 모든 검증 통과!"
|
|
38
|
+
exit 0
|
|
39
|
+
else
|
|
40
|
+
echo ""
|
|
41
|
+
echo "❌ 검증 실패. 위 항목을 확인하세요."
|
|
42
|
+
exit 1
|
|
43
|
+
fi
|
moai_adk/templates/CLAUDE.md
CHANGED
|
@@ -176,6 +176,159 @@ Task(
|
|
|
176
176
|
- `/alfred:2-build`: Phase 1에서 SPEC 분석 및 TDD 계획 수립 → Phase 2에서 RED-GREEN-REFACTOR 구현
|
|
177
177
|
- `/alfred:3-sync`: Phase 1에서 동기화 범위 분석 → Phase 2에서 Living Document 동기화 및 TAG 업데이트
|
|
178
178
|
|
|
179
|
+
---
|
|
180
|
+
|
|
181
|
+
### Alfred 다음 단계 제안 원칙
|
|
182
|
+
|
|
183
|
+
**CRITICAL**: Alfred는 작업 완료 후 다음 단계를 제안할 때 **반드시 현재 상태를 확인**해야 합니다.
|
|
184
|
+
|
|
185
|
+
#### 제안 전 필수 체크리스트
|
|
186
|
+
|
|
187
|
+
```python
|
|
188
|
+
# 다음 단계 제안 전 체크 (의사코드)
|
|
189
|
+
def suggest_next_step():
|
|
190
|
+
# 1. SPEC 상태 확인
|
|
191
|
+
spec_exists = check_spec_file_exists() # .moai/specs/SPEC-{ID}/spec.md
|
|
192
|
+
spec_version = get_spec_version() # YAML Front Matter의 version
|
|
193
|
+
spec_status = get_spec_status() # draft|active|completed|deprecated
|
|
194
|
+
|
|
195
|
+
# 2. 구현 상태 확인
|
|
196
|
+
tests_exist = check_test_files() # tests/**/*test*.py|ts|...
|
|
197
|
+
code_exists = check_code_files() # src/**/*.py|ts|...
|
|
198
|
+
tests_passing = check_test_results() # pytest, vitest 등 실행 결과
|
|
199
|
+
|
|
200
|
+
# 3. 문서 상태 확인
|
|
201
|
+
docs_synced = check_sync_status() # @TAG 체인 완전성
|
|
202
|
+
|
|
203
|
+
# 4. Git 상태 확인
|
|
204
|
+
branch_name = get_current_branch()
|
|
205
|
+
pr_status = get_pr_status() # draft|ready|merged
|
|
206
|
+
|
|
207
|
+
# 5. 현재 상태 기반 다음 단계 결정
|
|
208
|
+
if not spec_exists:
|
|
209
|
+
return "SPEC 작성: /alfred:1-spec"
|
|
210
|
+
elif spec_status == "draft" and not code_exists:
|
|
211
|
+
return "TDD 구현: /alfred:2-build SPEC-{ID}"
|
|
212
|
+
elif code_exists and not tests_passing:
|
|
213
|
+
return "테스트 수정: 실패한 테스트 확인"
|
|
214
|
+
elif tests_passing and not docs_synced:
|
|
215
|
+
return "문서 동기화: /alfred:3-sync"
|
|
216
|
+
elif pr_status == "ready":
|
|
217
|
+
return "PR 머지 대기 또는 다음 SPEC 작성"
|
|
218
|
+
else:
|
|
219
|
+
return "Git 커밋 또는 다음 작업"
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
#### 잘못된 제안 예시 (❌)
|
|
223
|
+
|
|
224
|
+
```markdown
|
|
225
|
+
# 시나리오: Alfred가 SPEC을 작성하고, 구현하고, 테스트까지 완료한 상태
|
|
226
|
+
|
|
227
|
+
❌ 잘못된 제안:
|
|
228
|
+
"다음 단계:
|
|
229
|
+
1. SPEC 검토 # ← SPEC은 이미 Alfred가 작성했음
|
|
230
|
+
2. 테스트 실행 # ← 테스트는 이미 실행되었음
|
|
231
|
+
3. Git 커밋"
|
|
232
|
+
|
|
233
|
+
✅ 올바른 제안:
|
|
234
|
+
"다음 단계:
|
|
235
|
+
1. Git 커밋 (변경 사항 커밋) # ← 실제 필요한 작업
|
|
236
|
+
2. 통합 테스트 (수동) # ← 실제 동작 확인 필요"
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
#### 올바른 제안 예시 (✅)
|
|
240
|
+
|
|
241
|
+
**시나리오 1: SPEC만 작성 완료**
|
|
242
|
+
```markdown
|
|
243
|
+
✅ 다음 단계:
|
|
244
|
+
- /alfred:2-build SPEC-{ID} 실행하여 TDD 구현 시작
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
**시나리오 2: SPEC + 구현 완료, 테스트 통과**
|
|
248
|
+
```markdown
|
|
249
|
+
✅ 다음 단계:
|
|
250
|
+
1. Git 커밋 (RED → GREEN → REFACTOR 커밋)
|
|
251
|
+
2. /alfred:3-sync 실행하여 문서 동기화
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
**시나리오 3: SPEC + 구현 + 동기화 완료**
|
|
255
|
+
```markdown
|
|
256
|
+
✅ 다음 단계:
|
|
257
|
+
1. Git 커밋 (문서 동기화 커밋)
|
|
258
|
+
2. PR 상태 확인 (Draft → Ready 전환)
|
|
259
|
+
3. 다음 SPEC 작성 (/alfred:1-spec)
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
**시나리오 4: 모든 작업 완료 (Git 커밋만 남음)**
|
|
263
|
+
```markdown
|
|
264
|
+
✅ 다음 단계:
|
|
265
|
+
- Git 커밋 (변경 사항 커밋)
|
|
266
|
+
|
|
267
|
+
Note: SPEC, 구현, 테스트, 문서는 모두 완료되었으므로 별도 검토 불필요
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
#### 제안 금지 사항
|
|
271
|
+
|
|
272
|
+
Alfred는 다음과 같은 **불필요한 제안을 하지 않아야** 합니다:
|
|
273
|
+
|
|
274
|
+
1. ❌ **자신이 작성한 문서 검토**: "SPEC-{ID}/spec.md 검토"
|
|
275
|
+
- Alfred가 SPEC을 작성했다면 이미 완료된 작업
|
|
276
|
+
- 사용자가 명시적으로 검토 요청하지 않는 한 불필요
|
|
277
|
+
|
|
278
|
+
2. ❌ **이미 실행한 테스트 재실행**: "테스트 실행"
|
|
279
|
+
- Alfred가 이미 pytest/vitest를 실행하고 결과를 확인했다면 완료
|
|
280
|
+
- 실패한 테스트가 있을 때만 재실행 제안
|
|
281
|
+
|
|
282
|
+
3. ❌ **이미 확인한 상태 재확인**: "Git 상태 확인"
|
|
283
|
+
- Alfred가 이미 git status를 실행했다면 불필요
|
|
284
|
+
- 새로운 변경사항이 있을 때만 재확인 제안
|
|
285
|
+
|
|
286
|
+
4. ❌ **완료된 작업 반복**: "코드 품질 확인"
|
|
287
|
+
- mypy, ruff 검사를 이미 통과했다면 완료
|
|
288
|
+
- 새로운 코드 추가 시에만 재검사 제안
|
|
289
|
+
|
|
290
|
+
#### 제안 우선순위
|
|
291
|
+
|
|
292
|
+
Alfred는 다음 순서로 다음 단계를 제안합니다:
|
|
293
|
+
|
|
294
|
+
1. **필수 작업** (반드시 수행해야 함)
|
|
295
|
+
- SPEC 없음 → SPEC 작성
|
|
296
|
+
- 테스트 실패 → 테스트 수정
|
|
297
|
+
- Git 커밋 필요 → Git 커밋
|
|
298
|
+
|
|
299
|
+
2. **권장 작업** (수행하면 좋음)
|
|
300
|
+
- 문서 동기화 필요 → /alfred:3-sync
|
|
301
|
+
- PR 상태 변경 필요 → Draft → Ready 전환
|
|
302
|
+
- 다음 기능 개발 → 다음 SPEC 작성
|
|
303
|
+
|
|
304
|
+
3. **선택 작업** (사용자 요청 시에만)
|
|
305
|
+
- 수동 통합 테스트
|
|
306
|
+
- 성능 테스트
|
|
307
|
+
- 보안 검사
|
|
308
|
+
|
|
309
|
+
#### 상태 확인 명령어
|
|
310
|
+
|
|
311
|
+
Alfred는 다음 명령어로 현재 상태를 확인합니다:
|
|
312
|
+
|
|
313
|
+
```bash
|
|
314
|
+
# SPEC 존재 확인
|
|
315
|
+
ls .moai/specs/SPEC-*/spec.md
|
|
316
|
+
|
|
317
|
+
# SPEC 버전 및 상태 확인
|
|
318
|
+
grep "^version:" .moai/specs/SPEC-*/spec.md
|
|
319
|
+
grep "^status:" .moai/specs/SPEC-*/spec.md
|
|
320
|
+
|
|
321
|
+
# 테스트 파일 확인
|
|
322
|
+
find tests/ -name "*test*.py" -o -name "*test*.ts"
|
|
323
|
+
|
|
324
|
+
# Git 상태 확인
|
|
325
|
+
git status --short
|
|
326
|
+
git branch --show-current
|
|
327
|
+
|
|
328
|
+
# PR 상태 확인 (GitHub CLI)
|
|
329
|
+
gh pr list --head $(git branch --show-current)
|
|
330
|
+
```
|
|
331
|
+
|
|
179
332
|
### 에러 메시지 표준 (공통)
|
|
180
333
|
|
|
181
334
|
모든 Alfred 커맨드와 에이전트는 일관된 심각도 표시를 사용합니다:
|
moai_adk/templates/__init__.py
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
# @CODE:TEST-INTEGRATION-001 | SPEC: SPEC-TEST-INTEGRATION-001.md
|
|
1
|
+
# @CODE:TEST-INTEGRATION-001 | SPEC: SPEC-TEST-INTEGRATION-001/spec.md
|
|
2
2
|
"""MoAI-ADK Templates Package"""
|
moai_adk/utils/__init__.py
CHANGED
moai_adk/utils/banner.py
CHANGED
moai_adk/utils/logger.py
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: moai-adk
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.4.0
|
|
4
4
|
Summary: MoAI Agentic Development Kit - SPEC-First TDD with Alfred SuperAgent
|
|
5
5
|
Project-URL: Homepage, https://github.com/modu-ai/moai-adk
|
|
6
6
|
Project-URL: Repository, https://github.com/modu-ai/moai-adk
|
|
@@ -23,6 +23,7 @@ Requires-Dist: click>=8.1.0
|
|
|
23
23
|
Requires-Dist: gitpython>=3.1.45
|
|
24
24
|
Requires-Dist: packaging>=21.0
|
|
25
25
|
Requires-Dist: pyfiglet>=1.0.2
|
|
26
|
+
Requires-Dist: pyyaml>=6.0.0
|
|
26
27
|
Requires-Dist: questionary>=2.0.0
|
|
27
28
|
Requires-Dist: rich>=13.0.0
|
|
28
29
|
Provides-Extra: dev
|
|
@@ -63,6 +64,7 @@ Description-Content-Type: text/markdown
|
|
|
63
64
|
- [Quick Start](#quick-start-3분-실전)
|
|
64
65
|
- [첫 번째 프로젝트: Todo API](#첫-번째-프로젝트-todo-api-만들기)
|
|
65
66
|
- [3단계 워크플로우](#3단계-워크플로우)
|
|
67
|
+
- [v0.4.0: Skills Revolution (계획 중)](#v040-skills-revolution-계획-중)
|
|
66
68
|
- [실전 시나리오](#실전-시나리오)
|
|
67
69
|
- [AI 모델 선택 가이드](#ai-모델-선택-가이드)
|
|
68
70
|
- [CLI Reference](#cli-reference)
|
|
@@ -395,6 +397,10 @@ uv --version
|
|
|
395
397
|
#### 2. moai-adk 설치 (10초)
|
|
396
398
|
|
|
397
399
|
```bash
|
|
400
|
+
# 권장: uv tool 모드 (샌드박스 격리, 전역 접근)
|
|
401
|
+
uv tool install moai-adk
|
|
402
|
+
|
|
403
|
+
# 대안: 현재 가상 환경에 설치
|
|
398
404
|
uv pip install moai-adk
|
|
399
405
|
|
|
400
406
|
# 설치 확인
|
|
@@ -704,6 +710,234 @@ graph TD
|
|
|
704
710
|
|
|
705
711
|
---
|
|
706
712
|
|
|
713
|
+
## ■ v0.4.0: Skills Revolution (진행 중)
|
|
714
|
+
|
|
715
|
+
> **📍 현재 진행 상태**: v0.4.0 Skills 표준화 Phase 1 완료, SPEC-SKILLS-REDESIGN-001 v0.1.0 완료
|
|
716
|
+
>
|
|
717
|
+
> 모든 44개 Skills 재구성 완료, 4-Tier 아키텍처 구현 완료, Progressive Disclosure 메커니즘 활성화
|
|
718
|
+
>
|
|
719
|
+
> 상세 진행도는 [UPDATE-PLAN-0.4.0.md](UPDATE-PLAN-0.4.0.md) 및 [SPEC-SKILLS-REDESIGN-001](.moai/specs/SPEC-SKILLS-REDESIGN-001/spec.md)를 참고하세요.
|
|
720
|
+
|
|
721
|
+
MoAI-ADK v0.4.0은 **Claude Code Skills** 시스템을 도입하여 개발자 경험을 혁신합니다.
|
|
722
|
+
|
|
723
|
+
### 🎯 핵심 비전
|
|
724
|
+
|
|
725
|
+
> **"Commands는 진입점, Skills는 능력, Sub-agents는 두뇌"**
|
|
726
|
+
|
|
727
|
+
v0.4.0은 Claude Code의 **Agent Skills 기능**을 핵심 실행 계층으로 도입하여 **4-Layer 아키텍처**로 전환합니다. Progressive Disclosure 메커니즘으로 **Effectively Unbounded Context**를 실현하며, 개발자는 명령어를 암기하지 않고 **자연어 대화**만으로 **레고 블록처럼 조립 가능한 개발 워크플로우**를 경험합니다.
|
|
728
|
+
|
|
729
|
+
### 🔑 핵심 변경사항
|
|
730
|
+
|
|
731
|
+
| 변경 사항 | Before (v0.3.x) | After (v0.4.0) |
|
|
732
|
+
|-----------|-----------------|----------------|
|
|
733
|
+
| **아키텍처** | 3-Layer (Commands/Agents/Hooks) | **4-Layer (Commands/Sub-agents/Skills/Hooks)** |
|
|
734
|
+
| **용어** | "Agents" (혼동) | **"Sub-agents" (Claude Code 표준)** |
|
|
735
|
+
| **컨텍스트 전략** | Always Loaded | **Progressive Disclosure (Effectively Unbounded)** |
|
|
736
|
+
| **재사용성** | 프로젝트 전용 | **전역 (모든 프로젝트 공유)** |
|
|
737
|
+
| **Hooks 성능** | SessionStart 220ms | **<100ms (50% 단축)** |
|
|
738
|
+
| **조합 가능성** | 없음 (단독 실행) | **Composable (Skills 자동 조합)** |
|
|
739
|
+
|
|
740
|
+
### 🏗️ 4-Layer 아키텍처
|
|
741
|
+
|
|
742
|
+
```mermaid
|
|
743
|
+
%%{init: {'theme':'neutral'}}%%
|
|
744
|
+
graph TD
|
|
745
|
+
User([사용자]) --> L1[Layer 1: Commands<br/>워크플로우 진입점]
|
|
746
|
+
L1 --> L2[Layer 2: Sub-agents<br/>복잡한 추론 & 판단]
|
|
747
|
+
L2 --> L3[Layer 3: Skills ⭐<br/>재사용 가능한 지식]
|
|
748
|
+
L3 --> L4[Layer 4: Hooks<br/>가드레일 & JIT Context]
|
|
749
|
+
|
|
750
|
+
L1 -.직접 참조.-> L3
|
|
751
|
+
|
|
752
|
+
style L3 fill:#e1f5ff,stroke:#0066cc,stroke-width:3px
|
|
753
|
+
style L1 fill:#fff4e1,stroke:#cc6600
|
|
754
|
+
style L2 fill:#f0e1ff,stroke:#6600cc
|
|
755
|
+
style L4 fill:#e1ffe1,stroke:#00cc66
|
|
756
|
+
```
|
|
757
|
+
|
|
758
|
+
**4-Layer 상세**:
|
|
759
|
+
|
|
760
|
+
| Layer | 역할 | 예시 | 특징 |
|
|
761
|
+
|-------|------|------|------|
|
|
762
|
+
| **Layer 1: Commands** | 워크플로우 진입점 | `/alfred:1-plan`, `/alfred:2-run` | 사용자 요청 해석, Skills/Sub-agents 조율 |
|
|
763
|
+
| **Layer 2: Sub-agents** | 복잡한 추론 & 판단 | spec-builder, tdd-implementer | Task tool 호출, 독립 컨텍스트 |
|
|
764
|
+
| **Layer 3: Skills ⭐** | 재사용 가능한 지식 | moai-spec-writer, python-expert | Progressive Disclosure, 전역 재사용 |
|
|
765
|
+
| **Layer 4: Hooks** | 가드레일 & JIT Context | SessionStart, PreToolUse | 위험 작업 차단, 빠른 실행 (<100ms) |
|
|
766
|
+
|
|
767
|
+
### ▶ Progressive Disclosure - 게임 체인저
|
|
768
|
+
|
|
769
|
+
**3-Layer 로딩 메커니즘**:
|
|
770
|
+
|
|
771
|
+
```text
|
|
772
|
+
┌──────────────────────────────────────────────┐
|
|
773
|
+
│ Layer 1: Metadata (Startup) │
|
|
774
|
+
│ - name + description만 사전 로드 │
|
|
775
|
+
│ - 각 Skill당 ≈50 토큰만 소비 │
|
|
776
|
+
│ - 다수의 Skills 설치 시에도 부담 적음 │
|
|
777
|
+
└──────────────────────────────────────────────┘
|
|
778
|
+
↓ Claude가 관련성 판단
|
|
779
|
+
┌──────────────────────────────────────────────┐
|
|
780
|
+
│ Layer 2: SKILL.md (On-Demand) │
|
|
781
|
+
│ - 관련 있는 Skill만 전체 내용 로드 │
|
|
782
|
+
│ - 필요 시에만 로드 (≈500 토큰) │
|
|
783
|
+
│ - 여러 Skills 동시 로드 가능 │
|
|
784
|
+
└──────────────────────────────────────────────┘
|
|
785
|
+
↓ 추가 정보 필요 시
|
|
786
|
+
┌──────────────────────────────────────────────┐
|
|
787
|
+
│ Layer 3: Additional Files (Lazy Loading) │
|
|
788
|
+
│ - templates/, scripts/, resources/ │
|
|
789
|
+
│ - 필요한 파일만 선택적 로드 │
|
|
790
|
+
│ - 대용량 참고 자료를 효율적으로 관리 │
|
|
791
|
+
└──────────────────────────────────────────────┘
|
|
792
|
+
```
|
|
793
|
+
|
|
794
|
+
**효과**:
|
|
795
|
+
- ✅ **Effectively Unbounded Context** (Anthropic 공식 표현)
|
|
796
|
+
- ✅ **컨텍스트 사용량 30% 절감** (Skills 재사용)
|
|
797
|
+
- ✅ **응답 속도 50% 단축** (Hooks 경량화: 220ms→100ms)
|
|
798
|
+
|
|
799
|
+
### ▶ Composability - 레고 블록처럼 조립
|
|
800
|
+
|
|
801
|
+
Claude가 자동으로 필요한 Skills를 식별하고 조합합니다.
|
|
802
|
+
|
|
803
|
+
**예시: 모바일 앱 개발**
|
|
804
|
+
|
|
805
|
+
```text
|
|
806
|
+
사용자: "Flutter로 Todo 앱 만들어줘"
|
|
807
|
+
|
|
808
|
+
Alfred가 자동 조합:
|
|
809
|
+
✅ moai-spec-writer (SPEC 작성)
|
|
810
|
+
✅ dart-expert (Dart 베스트 프랙티스)
|
|
811
|
+
✅ mobile-app-expert (iOS/Android 설계)
|
|
812
|
+
✅ moai-tdd-orchestrator (TDD 구현)
|
|
813
|
+
|
|
814
|
+
사용자: "Firebase 인증도 추가해줘"
|
|
815
|
+
|
|
816
|
+
Alfred가 자동 조합:
|
|
817
|
+
✅ firebase-expert (새로 추가)
|
|
818
|
+
✅ dart-expert (이미 로드됨, 재사용)
|
|
819
|
+
✅ security-expert (자동 추가)
|
|
820
|
+
```
|
|
821
|
+
|
|
822
|
+
**조합 원리**:
|
|
823
|
+
- **Automatic Coordination**: Claude가 자동으로 필요한 Skills 식별
|
|
824
|
+
- **No Explicit Reference**: Skills는 서로를 명시적으로 참조하지 않아도 됨
|
|
825
|
+
- **Multiple Skills Together**: 동시에 여러 Skills 활성화 가능
|
|
826
|
+
|
|
827
|
+
### ▶ Commands 명칭 변경 철학
|
|
828
|
+
|
|
829
|
+
#### `/alfred:1-spec` → `/alfred:1-plan` ⭐ 핵심 변경
|
|
830
|
+
|
|
831
|
+
**철학적 배경**:
|
|
832
|
+
- **"항상 계획을 먼저 세우고 진행한다"** - 계획 우선 원칙 강조
|
|
833
|
+
- SPEC 문서 생성뿐만 아니라 **브레인스토밍 모드**로 확장
|
|
834
|
+
- 아이디어 구상, 요구사항 정리, 설계 논의 등 **계획 수립 전반** 지원
|
|
835
|
+
|
|
836
|
+
**사용 시나리오**:
|
|
837
|
+
|
|
838
|
+
```bash
|
|
839
|
+
# 시나리오 1: SPEC 문서 생성 (기존 방식)
|
|
840
|
+
/alfred:1-plan "JWT 인증 시스템"
|
|
841
|
+
→ SPEC-AUTH-001 생성, EARS 구문, 브랜치/PR
|
|
842
|
+
|
|
843
|
+
# 시나리오 2: 브레인스토밍 모드 (신규)
|
|
844
|
+
/alfred:1-plan "프로젝트 아키텍처 설계 논의"
|
|
845
|
+
→ Alfred와 대화형 브레인스토밍
|
|
846
|
+
→ 아이디어 정리 → SPEC 후보 도출
|
|
847
|
+
|
|
848
|
+
# 시나리오 3: 기술 선택 논의 (신규)
|
|
849
|
+
/alfred:1-plan "인증 방식 비교 (JWT vs Session)"
|
|
850
|
+
→ 장단점 분석 → 의사결정 지원 → SPEC 문서화
|
|
851
|
+
```
|
|
852
|
+
|
|
853
|
+
**핵심 가치**:
|
|
854
|
+
- ✅ **Think First, Code Later** (생각 먼저, 코딩 나중)
|
|
855
|
+
- ✅ **Collaborative Planning** (Alfred와 함께 계획 수립)
|
|
856
|
+
- ✅ **SPEC-First 유지** (최종적으로 SPEC 문서 생성)
|
|
857
|
+
|
|
858
|
+
#### `/alfred:2-build` → `/alfred:2-run` ⭐ 핵심 변경
|
|
859
|
+
|
|
860
|
+
**철학적 배경**:
|
|
861
|
+
- **"계획(Plan) → 실행(Run) → 동기화(Sync)"** - 명확한 워크플로우
|
|
862
|
+
- "build"는 코드 빌드만을 의미하지만, 실제로는 **계획 수행 전반** 지원
|
|
863
|
+
- TDD 구현, 테스트 실행, 리팩토링, 문서 초안 등 **다양한 실행 작업**
|
|
864
|
+
|
|
865
|
+
**사용 시나리오**:
|
|
866
|
+
|
|
867
|
+
```bash
|
|
868
|
+
# 시나리오 1: TDD 구현 (주 사용 방식)
|
|
869
|
+
/alfred:2-run SPEC-AUTH-001
|
|
870
|
+
→ RED → GREEN → REFACTOR
|
|
871
|
+
|
|
872
|
+
# 시나리오 2: 프로토타입 제작
|
|
873
|
+
/alfred:2-run SPEC-PROTO-001
|
|
874
|
+
→ 빠른 검증을 위한 프로토타입 구현
|
|
875
|
+
|
|
876
|
+
# 시나리오 3: 문서화 작업
|
|
877
|
+
/alfred:2-run SPEC-DOCS-001
|
|
878
|
+
→ 문서 작성 및 샘플 코드 생성
|
|
879
|
+
```
|
|
880
|
+
|
|
881
|
+
**핵심 가치**:
|
|
882
|
+
- ✅ **Plan First, Run Next** (계획 먼저, 실행 나중)
|
|
883
|
+
- ✅ **Flexible Execution** (TDD뿐 아니라 다양한 실행 작업)
|
|
884
|
+
- ✅ **SPEC-Driven** (SPEC 기반 실행)
|
|
885
|
+
|
|
886
|
+
#### `/alfred:3-sync` - 유지
|
|
887
|
+
|
|
888
|
+
- **이유**: "sync(동기화)"가 문서-코드-TAG 동기화 의미를 정확히 전달
|
|
889
|
+
- **기능**: Living Document 갱신, TAG 체인 검증, PR Ready 전환
|
|
890
|
+
|
|
891
|
+
### ▶ 10개 Foundation Skills
|
|
892
|
+
|
|
893
|
+
v0.4.0 Phase 1에서 도입되는 핵심 Skills:
|
|
894
|
+
|
|
895
|
+
| Skill | 역할 | 기존 대응 | 특징 |
|
|
896
|
+
|-------|------|----------|------|
|
|
897
|
+
| `moai-spec-writer` | EARS 명세 작성 | spec-builder 일부 | SPEC 문서 생성, EARS 구문 |
|
|
898
|
+
| `moai-tdd-orchestrator` | TDD 오케스트레이션 | tdd-implementer 일부 | RED-GREEN-REFACTOR 사이클 |
|
|
899
|
+
| `moai-tag-validator` | TAG 무결성 검증 | tag-agent 일부 | TAG 체인 검증, 고아 TAG 탐지 |
|
|
900
|
+
| `moai-doc-syncer` | Living Document 동기 | doc-syncer 일부 | 문서 자동 업데이트 |
|
|
901
|
+
| `moai-git-flow` | GitFlow 자동화 | git-manager 일부 | 브랜치/PR 생성, 커밋 자동화 |
|
|
902
|
+
| `moai-quality-gate` | TRUST 5원칙 검증 | trust-checker 일부 | 품질 게이트, 자동 검증 |
|
|
903
|
+
| `python-expert` | Python 전문가 | (신규) | pytest, mypy, ruff |
|
|
904
|
+
| `typescript-expert` | TypeScript 전문가 | (신규) | Vitest, Biome |
|
|
905
|
+
| `web-api-expert` | REST/GraphQL 전문가 | (신규) | API 설계, 보안 |
|
|
906
|
+
| `mobile-app-expert` | 모바일 전문가 | (신규) | iOS, Android, Flutter |
|
|
907
|
+
|
|
908
|
+
**Phase 2 이후**: 추가 35개 Skills (Language 18개 + Domain 8개 + Advanced 9개)
|
|
909
|
+
|
|
910
|
+
### ▶ Before/After 개발 시간 비교
|
|
911
|
+
|
|
912
|
+
| 작업 | 기존 (Commands + Agents) | Skills 기반 (v0.4.0) | 개선율 |
|
|
913
|
+
| ------------------- | ------------------------ | -------------------- | ------ |
|
|
914
|
+
| **SPEC 작성** | 2~3분 | 1~2분 | 40%↓ |
|
|
915
|
+
| **TDD 구현** | 5~7분 | 3~4분 | 43%↓ |
|
|
916
|
+
| **문서 동기화** | 1~2분 | 30초~1분 | 50%↓ |
|
|
917
|
+
| **전체 사이클** | 8~12분 | 4.5~7분 | **44%↓** |
|
|
918
|
+
| **학습 곡선** | 3개 커맨드 + 12개 에이전트 | 자연어만 | **90%↓** |
|
|
919
|
+
|
|
920
|
+
**실제 개발자 경험**:
|
|
921
|
+
|
|
922
|
+
```text
|
|
923
|
+
# 기존: 커맨드 이름 외우기
|
|
924
|
+
개발자: "/alfred:1-spec 뭐였더라... /alfred:0-project? 아니면 /alfred:1-spec?"
|
|
925
|
+
→ 커맨드 참조 → 실행 (학습 부담)
|
|
926
|
+
|
|
927
|
+
# Skills: 그냥 말하기
|
|
928
|
+
개발자: "사용자 인증 SPEC 작성해줘"
|
|
929
|
+
→ Alfred: "moai-spec-writer + web-api-expert 조합하겠습니다"
|
|
930
|
+
→ 즉시 실행 (학습 불필요)
|
|
931
|
+
```
|
|
932
|
+
|
|
933
|
+
### ▶ 자세한 정보
|
|
934
|
+
|
|
935
|
+
v0.4.0 전체 계획, 아키텍처 설계, 마이그레이션 전략은 다음 문서를 참고하세요:
|
|
936
|
+
|
|
937
|
+
📖 **[UPDATE-PLAN-0.4.0.md](UPDATE-PLAN-0.4.0.md)** - 전체 상세 분석 문서
|
|
938
|
+
|
|
939
|
+
---
|
|
940
|
+
|
|
707
941
|
## ■ 실전 시나리오
|
|
708
942
|
|
|
709
943
|
### 시나리오 1: 긴급 버그 수정 (Hotfix)
|
|
@@ -1283,7 +1517,10 @@ Alfred가 모든 코드에 자동으로 적용하는 품질 기준입니다.
|
|
|
1283
1517
|
```bash
|
|
1284
1518
|
moai-adk update
|
|
1285
1519
|
|
|
1286
|
-
# 또는
|
|
1520
|
+
# 또는 (tool 모드 - 권장)
|
|
1521
|
+
uv tool upgrade moai-adk
|
|
1522
|
+
|
|
1523
|
+
# 또는 (pip 모드 - 레거시)
|
|
1287
1524
|
uv pip install --upgrade moai-adk
|
|
1288
1525
|
```
|
|
1289
1526
|
|
|
@@ -1437,7 +1674,11 @@ curl -LsSf https://astral.sh/uv/install.sh | sh
|
|
|
1437
1674
|
# Windows:
|
|
1438
1675
|
powershell -c "irm https://astral.sh/uv/install.ps1 | iex"
|
|
1439
1676
|
|
|
1440
|
-
# moai-adk 재설치
|
|
1677
|
+
# moai-adk 재설치 (tool 모드 - 권장)
|
|
1678
|
+
uv tool uninstall moai-adk
|
|
1679
|
+
uv tool install moai-adk
|
|
1680
|
+
|
|
1681
|
+
# 또는 (pip 모드 - 레거시)
|
|
1441
1682
|
uv pip install moai-adk --force-reinstall
|
|
1442
1683
|
```
|
|
1443
1684
|
|