aiwf 0.1.0 → 0.3.1
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.
- package/CHANGELOG.md +46 -0
- package/CLAUDE.md +19 -0
- package/LICENSE +1 -1
- package/README.ko.md +90 -62
- package/README.md +109 -62
- package/claude-code/{simone/.simone → aiwf/en/.aiwf}/01_PROJECT_DOCS/ARCHITECTURE.md +1 -1
- package/claude-code/{simone/.simone → aiwf/en/.aiwf}/02_REQUIREMENTS/M01_Backend_Setup/M01_milestone_meta.md +5 -1
- package/claude-code/{simone/.simone → aiwf/en/.aiwf}/02_REQUIREMENTS/M01_Backend_Setup/PRD_AMEND_01_Auth_Flow_Update.md +5 -1
- package/claude-code/{simone/.simone/03_SPRINTS/CLAUDE.MD → aiwf/en/.aiwf/03_SPRINTS/CLAUDE.md} +28 -7
- package/claude-code/{simone/.simone → aiwf/en/.aiwf}/03_SPRINTS/S01_M01_Initial_API/S01_sprint_meta.md +8 -1
- package/claude-code/{simone/.simone → aiwf/en/.aiwf}/03_SPRINTS/S01_M01_Initial_API/T01_S01_Setup_Project_Structure.md +5 -1
- package/claude-code/aiwf/en/.aiwf/04_GENERAL_TASKS/CLAUDE.md +96 -0
- package/claude-code/{simone/.simone → aiwf/en/.aiwf}/04_GENERAL_TASKS/T002_API_Rate_Limiting.md +7 -2
- package/claude-code/{simone/.simone → aiwf/en/.aiwf}/04_GENERAL_TASKS/TX001_Refactor_Logging_Module.md +7 -2
- package/claude-code/{simone/.simone → aiwf/en/.aiwf}/05_ARCHITECTURAL_DECISIONS/ADR001_Chosen_Database_System.md +7 -1
- package/claude-code/{simone/.simone → aiwf/en/.aiwf}/05_ARCHITECTURAL_DECISIONS/ADR002_API_Authentication_Method.md +7 -1
- package/claude-code/aiwf/en/.aiwf/10_STATE_OF_PROJECT/2025-06-12-12-00-needs-focus.md +139 -0
- package/claude-code/aiwf/en/.aiwf/10_STATE_OF_PROJECT/2025-06-12-12-00-test-alignment.md +155 -0
- package/claude-code/aiwf/en/.aiwf/10_STATE_OF_PROJECT/2025-06-13-00-50-solid-progress.md +122 -0
- package/claude-code/aiwf/en/.aiwf/10_STATE_OF_PROJECT/2025-06-14-08-30-infrastructure-challenges.md +141 -0
- package/claude-code/aiwf/en/.aiwf/10_STATE_OF_PROJECT/2025-06-16-21-48-critical-foundation-issues.md +177 -0
- package/claude-code/aiwf/en/.aiwf/10_STATE_OF_PROJECT/2025-06-17-15-08-solid-progress.md +149 -0
- package/claude-code/aiwf/en/.aiwf/10_STATE_OF_PROJECT/index.json +5 -0
- package/claude-code/aiwf/en/.aiwf/10_STATE_OF_PROJECT/sync-index.js +78 -0
- package/claude-code/aiwf/en/.aiwf/98_PROMPTS/github_integration.md +130 -0
- package/claude-code/aiwf/en/.aiwf/98_PROMPTS/useful-prompts.md +31 -0
- package/claude-code/aiwf/en/.aiwf/98_PROMPTS/vibe-front-prompts.md +89 -0
- package/claude-code/{simone/.simone → aiwf/en/.aiwf}/99_TEMPLATES/task_template.md +1 -0
- package/claude-code/{simone/.simone/CLAUDE.MD → aiwf/en/.aiwf/CLAUDE.md} +13 -4
- package/claude-code/{simone/.simone → aiwf/en/.aiwf}/README.md +6 -6
- package/claude-code/aiwf/en/.claude/CLAUDE_BE.md +276 -0
- package/claude-code/aiwf/en/.claude/commands/aiwf/aiwf_changelog.md +82 -0
- package/claude-code/aiwf/en/.claude/commands/aiwf/aiwf_code_review.md +88 -0
- package/claude-code/aiwf/en/.claude/commands/aiwf/aiwf_commit.md +160 -0
- package/claude-code/aiwf/en/.claude/commands/aiwf/aiwf_create_general_task.md +147 -0
- package/claude-code/aiwf/en/.claude/commands/aiwf/aiwf_create_milestone_plan.md +194 -0
- package/claude-code/aiwf/en/.claude/commands/aiwf/aiwf_create_prd.md +272 -0
- package/claude-code/aiwf/en/.claude/commands/aiwf/aiwf_create_sprint_tasks.md +189 -0
- package/claude-code/aiwf/en/.claude/commands/aiwf/aiwf_create_sprints_from_milestone.md +121 -0
- package/claude-code/aiwf/en/.claude/commands/aiwf/aiwf_discuss_review.md +29 -0
- package/claude-code/aiwf/en/.claude/commands/aiwf/aiwf_do_task.md +109 -0
- package/claude-code/aiwf/en/.claude/commands/aiwf/aiwf_docs.md +225 -0
- package/claude-code/aiwf/en/.claude/commands/aiwf/aiwf_infinite.md +202 -0
- package/claude-code/aiwf/en/.claude/commands/aiwf/aiwf_initialize.md +134 -0
- package/claude-code/aiwf/en/.claude/commands/aiwf/aiwf_issue_create.md +65 -0
- package/claude-code/aiwf/en/.claude/commands/aiwf/aiwf_language_manager.md +287 -0
- package/claude-code/aiwf/en/.claude/commands/aiwf/aiwf_language_status.md +246 -0
- package/claude-code/aiwf/en/.claude/commands/aiwf/aiwf_mermaid.md +272 -0
- package/claude-code/aiwf/en/.claude/commands/aiwf/aiwf_pr_create.md +76 -0
- package/claude-code/aiwf/en/.claude/commands/aiwf/aiwf_prime.md +9 -0
- package/claude-code/aiwf/en/.claude/commands/aiwf/aiwf_project_review.md +261 -0
- package/claude-code/aiwf/en/.claude/commands/aiwf/aiwf_switch_language.md +160 -0
- package/claude-code/aiwf/en/.claude/commands/aiwf/aiwf_test.md +125 -0
- package/claude-code/aiwf/en/.claude/commands/aiwf/aiwf_testing_review.md +198 -0
- package/claude-code/aiwf/en/.claude/commands/aiwf/aiwf_tm-run-all-subtask.md +206 -0
- package/claude-code/aiwf/en/.claude/commands/aiwf/aiwf_ultrathink_code_advanced.md +460 -0
- package/claude-code/aiwf/en/.claude/commands/aiwf/aiwf_ultrathink_code_basic.md +165 -0
- package/claude-code/aiwf/en/.claude/commands/aiwf/aiwf_ultrathink_general.md +362 -0
- package/claude-code/aiwf/en/.claude/commands/aiwf/aiwf_yolo.md +300 -0
- package/claude-code/aiwf/en/.claude/mcp.json +31 -0
- package/claude-code/aiwf/en/.claude/settings.json +102 -0
- package/claude-code/aiwf/ko/.aiwf/00_PROJECT_MANIFEST.md +49 -0
- package/claude-code/aiwf/ko/.aiwf/01_PROJECT_DOCS/ARCHITECTURE.md +55 -0
- package/claude-code/aiwf/ko/.aiwf/02_REQUIREMENTS/CLAUDE.md +78 -0
- package/claude-code/aiwf/ko/.aiwf/02_REQUIREMENTS/M01_Backend_Setup/M01_milestone_meta.md +42 -0
- package/claude-code/aiwf/ko/.aiwf/02_REQUIREMENTS/M01_Backend_Setup/PRD_AMEND_01_Auth_Flow_Update.md +73 -0
- package/claude-code/aiwf/ko/.aiwf/02_REQUIREMENTS/M01_Backend_Setup/PRD_Backend_Setup.md +98 -0
- package/claude-code/aiwf/ko/.aiwf/02_REQUIREMENTS/M01_Backend_Setup/SPECS_API_V1.md +232 -0
- package/claude-code/aiwf/ko/.aiwf/03_SPRINTS/CLAUDE.md +83 -0
- package/claude-code/aiwf/ko/.aiwf/03_SPRINTS/S01_M01_Initial_API/S01_sprint_meta.md +49 -0
- package/claude-code/aiwf/ko/.aiwf/03_SPRINTS/S01_M01_Initial_API/T01_S01_Setup_Project_Structure.md +60 -0
- package/claude-code/aiwf/ko/.aiwf/04_GENERAL_TASKS/CLAUDE.md +96 -0
- package/claude-code/aiwf/ko/.aiwf/04_GENERAL_TASKS/T002_API_Rate_Limiting.md +54 -0
- package/claude-code/aiwf/ko/.aiwf/04_GENERAL_TASKS/TX001_Refactor_Logging_Module.md +58 -0
- package/claude-code/aiwf/ko/.aiwf/05_ARCHITECTURAL_DECISIONS/ADR001_Chosen_Database_System.md +119 -0
- package/claude-code/aiwf/ko/.aiwf/05_ARCHITECTURAL_DECISIONS/ADR002_API_Authentication_Method.md +124 -0
- package/claude-code/aiwf/ko/.aiwf/10_STATE_OF_PROJECT/2025-06-12-12-00-needs-focus.md +139 -0
- package/claude-code/aiwf/ko/.aiwf/10_STATE_OF_PROJECT/2025-06-12-12-00-test-alignment.md +155 -0
- package/claude-code/aiwf/ko/.aiwf/10_STATE_OF_PROJECT/2025-06-13-00-50-solid-progress.md +122 -0
- package/claude-code/aiwf/ko/.aiwf/10_STATE_OF_PROJECT/2025-06-14-08-30-infrastructure-challenges.md +141 -0
- package/claude-code/aiwf/ko/.aiwf/10_STATE_OF_PROJECT/2025-06-16-21-48-critical-foundation-issues.md +177 -0
- package/claude-code/aiwf/ko/.aiwf/10_STATE_OF_PROJECT/2025-06-17-15-08-solid-progress.md +149 -0
- package/claude-code/aiwf/ko/.aiwf/10_STATE_OF_PROJECT/index.json +5 -0
- package/claude-code/aiwf/ko/.aiwf/10_STATE_OF_PROJECT/sync-index.js +78 -0
- package/claude-code/aiwf/ko/.aiwf/98_PROMPTS/github_integration.md +130 -0
- package/claude-code/aiwf/ko/.aiwf/98_PROMPTS/useful-prompts.md +31 -0
- package/claude-code/aiwf/ko/.aiwf/98_PROMPTS/vibe-front-prompts.md +89 -0
- package/claude-code/aiwf/ko/.aiwf/99_TEMPLATES/adr_template.md +49 -0
- package/claude-code/aiwf/ko/.aiwf/99_TEMPLATES/milestone_meta_template.md +25 -0
- package/claude-code/aiwf/ko/.aiwf/99_TEMPLATES/project_manifest_template.md +39 -0
- package/claude-code/aiwf/ko/.aiwf/99_TEMPLATES/sprint_meta_template.md +23 -0
- package/claude-code/aiwf/ko/.aiwf/99_TEMPLATES/task_template.md +36 -0
- package/claude-code/aiwf/ko/.aiwf/CLAUDE.md +76 -0
- package/claude-code/aiwf/ko/.aiwf/README.md +97 -0
- package/claude-code/aiwf/ko/.claude/CLAUDE_BE.md +276 -0
- package/claude-code/aiwf/ko/.claude/commands/aiwf/aiwf_changelog.md +82 -0
- package/claude-code/aiwf/ko/.claude/commands/aiwf/aiwf_code_review.md +88 -0
- package/claude-code/aiwf/ko/.claude/commands/aiwf/aiwf_commit.md +160 -0
- package/claude-code/aiwf/ko/.claude/commands/aiwf/aiwf_create_general_task.md +147 -0
- package/claude-code/aiwf/ko/.claude/commands/aiwf/aiwf_create_milestone_plan.md +194 -0
- package/claude-code/aiwf/ko/.claude/commands/aiwf/aiwf_create_prd.md +280 -0
- package/claude-code/aiwf/ko/.claude/commands/aiwf/aiwf_create_sprint_tasks.md +189 -0
- package/claude-code/aiwf/ko/.claude/commands/aiwf/aiwf_create_sprints_from_milestone.md +121 -0
- package/claude-code/aiwf/ko/.claude/commands/aiwf/aiwf_discuss_review.md +29 -0
- package/claude-code/aiwf/ko/.claude/commands/aiwf/aiwf_do_task.md +109 -0
- package/claude-code/aiwf/ko/.claude/commands/aiwf/aiwf_docs.md +225 -0
- package/claude-code/aiwf/ko/.claude/commands/aiwf/aiwf_infinite.md +202 -0
- package/claude-code/aiwf/ko/.claude/commands/aiwf/aiwf_initialize.md +134 -0
- package/claude-code/aiwf/ko/.claude/commands/aiwf/aiwf_issue_create.md +65 -0
- package/claude-code/aiwf/ko/.claude/commands/aiwf/aiwf_language_manager.md +287 -0
- package/claude-code/aiwf/ko/.claude/commands/aiwf/aiwf_language_status.md +246 -0
- package/claude-code/aiwf/ko/.claude/commands/aiwf/aiwf_mermaid.md +272 -0
- package/claude-code/aiwf/ko/.claude/commands/aiwf/aiwf_pr_create.md +76 -0
- package/claude-code/aiwf/ko/.claude/commands/aiwf/aiwf_prime.md +9 -0
- package/claude-code/aiwf/ko/.claude/commands/aiwf/aiwf_project_review.md +261 -0
- package/claude-code/aiwf/ko/.claude/commands/aiwf/aiwf_switch_language.md +160 -0
- package/claude-code/aiwf/ko/.claude/commands/aiwf/aiwf_test.md +124 -0
- package/claude-code/aiwf/ko/.claude/commands/aiwf/aiwf_testing_review.md +198 -0
- package/claude-code/aiwf/ko/.claude/commands/aiwf/aiwf_tm-run-all-subtask.md +210 -0
- package/claude-code/aiwf/ko/.claude/commands/aiwf/aiwf_ultrathink_code_advanced.md +460 -0
- package/claude-code/aiwf/ko/.claude/commands/aiwf/aiwf_ultrathink_code_basic.md +165 -0
- package/claude-code/aiwf/ko/.claude/commands/aiwf/aiwf_ultrathink_general.md +305 -0
- package/claude-code/aiwf/ko/.claude/commands/aiwf/aiwf_yolo.md +300 -0
- package/claude-code/aiwf/ko/.claude/mcp.json +31 -0
- package/claude-code/aiwf/ko/.claude/settings.json +102 -0
- package/{AI-WORKFLOW.md → docs/AI-WORKFLOW.ko.md} +38 -24
- package/docs/AI-WORKFLOW.md +299 -0
- package/docs/COMMANDS_GUIDE.ko.md +727 -0
- package/docs/COMMANDS_GUIDE.md +726 -0
- package/docs/CONTRIBUTING.md +406 -0
- package/docs/DEVELOPMENT_GUIDE.md +727 -0
- package/docs/Enhanced_Installation_Flow_Design.md +498 -0
- package/docs/PRD.ko.md +148 -0
- package/docs/PRD.md +150 -0
- package/docs/moonklabs-metadata-system-prd.md +127 -0
- package/index.js +1493 -122
- package/jest.config.js +4 -0
- package/language-cli.js +279 -0
- package/language-utils.js +330 -0
- package/package.json +23 -10
- package/scripts/validate-commands.cjs +338 -0
- package/scripts/validate-commands.js +254 -0
- package/tests/basic.test.js +62 -0
- package/tests/commands.test.js +127 -0
- package/tests/installer.test.js +129 -0
- package/tests/language-utils.test.js +271 -0
- package/COMMANDS_GUIDE.md +0 -462
- package/PRD.ko.md +0 -96
- package/PRD.md +0 -98
- package/claude-code/simone/.simone/04_GENERAL_TASKS/CLAUDE.MD +0 -51
- package/claude-code/simone/CHANGELOG.md +0 -71
- package/claude-code/simone/LICENSE +0 -21
- package/claude-code/simone/README.md +0 -219
- package/claude-code/simone/SYNC_GUIDE.md +0 -172
- package/claude-code/simone/sync-simone.sh +0 -138
- /package/claude-code/{simone/.simone → aiwf/en/.aiwf}/00_PROJECT_MANIFEST.md +0 -0
- /package/claude-code/{simone/.simone → aiwf/en/.aiwf}/02_REQUIREMENTS/CLAUDE.md +0 -0
- /package/claude-code/{simone/.simone → aiwf/en/.aiwf}/02_REQUIREMENTS/M01_Backend_Setup/PRD_Backend_Setup.md +0 -0
- /package/claude-code/{simone/.simone → aiwf/en/.aiwf}/02_REQUIREMENTS/M01_Backend_Setup/SPECS_API_V1.md +0 -0
- /package/claude-code/{simone/.simone → aiwf/en/.aiwf}/99_TEMPLATES/adr_template.md +0 -0
- /package/claude-code/{simone/.simone → aiwf/en/.aiwf}/99_TEMPLATES/milestone_meta_template.md +0 -0
- /package/claude-code/{simone/.simone → aiwf/en/.aiwf}/99_TEMPLATES/project_manifest_template.md +0 -0
- /package/claude-code/{simone/.simone → aiwf/en/.aiwf}/99_TEMPLATES/sprint_meta_template.md +0 -0
|
@@ -0,0 +1,406 @@
|
|
|
1
|
+
# aiwf 프로젝트 기여 가이드
|
|
2
|
+
|
|
3
|
+
aiwf (AI Workflow Framework) 프로젝트에 기여해 주셔서 감사합니다! 이 문서는 프로젝트에 효과적으로 기여하는 방법을 안내합니다.
|
|
4
|
+
|
|
5
|
+
## 목차
|
|
6
|
+
|
|
7
|
+
1. [기여하기 전에](#기여하기-전에)
|
|
8
|
+
2. [개발 환경 설정](#개발-환경-설정)
|
|
9
|
+
3. [기여 방법](#기여-방법)
|
|
10
|
+
4. [코드 스타일 가이드](#코드-스타일-가이드)
|
|
11
|
+
5. [테스트 작성](#테스트-작성)
|
|
12
|
+
6. [Pull Request 가이드](#pull-request-가이드)
|
|
13
|
+
7. [이슈 리포팅](#이슈-리포팅)
|
|
14
|
+
8. [커뮤니티 가이드라인](#커뮤니티-가이드라인)
|
|
15
|
+
|
|
16
|
+
## 기여하기 전에
|
|
17
|
+
|
|
18
|
+
### 프로젝트 이해
|
|
19
|
+
|
|
20
|
+
aiwf는 Claude Code와 통합된 AIWF 프로젝트 관리 프레임워크를 설치하는 NPM CLI 패키지입니다. 기여하기 전에 다음을 이해해 주세요:
|
|
21
|
+
|
|
22
|
+
- **목적**: AI 기반 개발 워크플로우 프레임워크 배포
|
|
23
|
+
- **대상 사용자**: Claude Code, Cursor, Windsurf 사용자
|
|
24
|
+
- **핵심 기능**: GitHub에서 프레임워크 다운로드 및 설치
|
|
25
|
+
|
|
26
|
+
### 행동강령
|
|
27
|
+
|
|
28
|
+
우리는 모든 기여자가 존중받고 포용적인 환경을 만들기 위해 다음 원칙을 따릅니다:
|
|
29
|
+
|
|
30
|
+
- **존중**: 모든 의견과 기여를 존중합니다
|
|
31
|
+
- **포용성**: 다양한 배경과 경험을 가진 기여자를 환영합니다
|
|
32
|
+
- **건설적 피드백**: 비판적 피드백도 건설적이고 도움이 되는 방향으로 제공합니다
|
|
33
|
+
- **협력**: 문제 해결을 위해 함께 협력합니다
|
|
34
|
+
|
|
35
|
+
## 개발 환경 설정
|
|
36
|
+
|
|
37
|
+
### 필수 요구사항
|
|
38
|
+
|
|
39
|
+
- **Node.js**: 14.0.0 이상
|
|
40
|
+
- **npm**: Node.js와 함께 설치됨
|
|
41
|
+
- **Git**: 최신 버전
|
|
42
|
+
|
|
43
|
+
### 초기 설정
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
# 1. 리포지토리 포크
|
|
47
|
+
# GitHub에서 https://github.com/aiwf/aiwf를 개인 계정으로 포크
|
|
48
|
+
|
|
49
|
+
# 2. 로컬에 클론
|
|
50
|
+
git clone https://github.com/YOUR_USERNAME/aiwf.git
|
|
51
|
+
cd aiwf
|
|
52
|
+
|
|
53
|
+
# 3. 원본 리포지토리를 upstream으로 추가
|
|
54
|
+
git remote add upstream https://github.com/aiwf/aiwf.git
|
|
55
|
+
|
|
56
|
+
# 4. 의존성 설치
|
|
57
|
+
npm install
|
|
58
|
+
|
|
59
|
+
# 5. 개발 환경 검증
|
|
60
|
+
node index.js --force # 로컬 테스트 실행
|
|
61
|
+
npm test # 테스트 실행 (설정 후)
|
|
62
|
+
npm run lint # 코드 스타일 검사 (설정 후)
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## 기여 방법
|
|
66
|
+
|
|
67
|
+
### 1. 이슈 기반 기여
|
|
68
|
+
|
|
69
|
+
가장 권장하는 기여 방법입니다:
|
|
70
|
+
|
|
71
|
+
1. **이슈 찾기**: [GitHub Issues](https://github.com/aiwf/aiwf/issues)에서 작업할 이슈 선택
|
|
72
|
+
2. **이슈 할당**: 댓글로 작업 의사 표현
|
|
73
|
+
3. **브랜치 생성**: `feature/issue-번호-간단한-설명` 형식
|
|
74
|
+
|
|
75
|
+
### 2. 새로운 기능 제안
|
|
76
|
+
|
|
77
|
+
새로운 기능을 제안하고 싶다면:
|
|
78
|
+
|
|
79
|
+
1. **이슈 생성**: Feature Request 템플릿 사용
|
|
80
|
+
2. **토론 참여**: 커뮤니티와 기능에 대해 논의
|
|
81
|
+
3. **승인 후 개발**: 승인된 후 개발 시작
|
|
82
|
+
|
|
83
|
+
### 3. 버그 수정
|
|
84
|
+
|
|
85
|
+
버그를 발견했다면:
|
|
86
|
+
|
|
87
|
+
1. **이슈 확인**: 이미 리포트된 버그인지 확인
|
|
88
|
+
2. **새 이슈 생성**: Bug Report 템플릿 사용
|
|
89
|
+
3. **재현 가능한 예제**: 최소한의 재현 가능한 예제 포함
|
|
90
|
+
|
|
91
|
+
## 코드 스타일 가이드
|
|
92
|
+
|
|
93
|
+
### JavaScript 스타일
|
|
94
|
+
|
|
95
|
+
```javascript
|
|
96
|
+
// 좋음: ES6+ 문법 사용
|
|
97
|
+
const apiUrl = "https://api.github.com";
|
|
98
|
+
const fetchData = async (url) => {
|
|
99
|
+
try {
|
|
100
|
+
const response = await fetch(url);
|
|
101
|
+
return await response.json();
|
|
102
|
+
} catch (error) {
|
|
103
|
+
console.error("API 호출 실패:", error);
|
|
104
|
+
throw error;
|
|
105
|
+
}
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
// 피하기: var 사용, 콜백 헬
|
|
109
|
+
var oldUrl = "https://api.github.com";
|
|
110
|
+
function fetchDataOld(url, callback) {
|
|
111
|
+
// 구식 패턴
|
|
112
|
+
}
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### 명명 규칙
|
|
116
|
+
|
|
117
|
+
- **변수/함수**: camelCase (`fetchGitHubContent`)
|
|
118
|
+
- **상수**: UPPER_SNAKE_CASE (`API_BASE_URL`)
|
|
119
|
+
- **파일명**: kebab-case (`github-api.js`)
|
|
120
|
+
- **클래스**: PascalCase (`GitHubClient`)
|
|
121
|
+
|
|
122
|
+
### 주석 가이드
|
|
123
|
+
|
|
124
|
+
```javascript
|
|
125
|
+
/**
|
|
126
|
+
* GitHub API에서 리포지토리 내용을 가져옵니다.
|
|
127
|
+
* @param {string} repoUrl - 리포지토리 URL
|
|
128
|
+
* @param {string} path - 가져올 파일/디렉토리 경로
|
|
129
|
+
* @returns {Promise<Object>} API 응답 데이터
|
|
130
|
+
* @throws {Error} 네트워크 오류 또는 API 제한 시 발생
|
|
131
|
+
*/
|
|
132
|
+
async function fetchRepositoryContent(repoUrl, path) {
|
|
133
|
+
// 입력 검증
|
|
134
|
+
if (!repoUrl || !path) {
|
|
135
|
+
throw new Error("리포지토리 URL과 경로는 필수입니다");
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// API 호출 구현...
|
|
139
|
+
}
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
### ESLint 및 Prettier
|
|
143
|
+
|
|
144
|
+
프로젝트는 ESLint와 Prettier를 사용합니다:
|
|
145
|
+
|
|
146
|
+
```bash
|
|
147
|
+
# 코드 스타일 검사
|
|
148
|
+
npm run lint
|
|
149
|
+
|
|
150
|
+
# 자동 수정
|
|
151
|
+
npm run lint:fix
|
|
152
|
+
|
|
153
|
+
# 코드 포맷팅
|
|
154
|
+
npm run format
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
## 테스트 작성
|
|
158
|
+
|
|
159
|
+
### 테스트 철학
|
|
160
|
+
|
|
161
|
+
- **모든 새로운 기능**에는 테스트가 필요합니다
|
|
162
|
+
- **버그 수정** 시 해당 버그를 확인하는 테스트를 추가합니다
|
|
163
|
+
- **기존 테스트를 깨뜨리지** 않도록 합니다
|
|
164
|
+
|
|
165
|
+
### 테스트 구조
|
|
166
|
+
|
|
167
|
+
```javascript
|
|
168
|
+
// tests/unit/github-api.test.js
|
|
169
|
+
import { jest } from "@jest/globals";
|
|
170
|
+
import { fetchGitHubContent } from "../../index.js";
|
|
171
|
+
|
|
172
|
+
describe("GitHub API 함수들", () => {
|
|
173
|
+
beforeEach(() => {
|
|
174
|
+
jest.clearAllMocks();
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
describe("fetchGitHubContent", () => {
|
|
178
|
+
test("성공적으로 데이터를 가져와야 함", async () => {
|
|
179
|
+
// Given (준비)
|
|
180
|
+
const mockUrl = "https://api.github.com/repos/test/repo";
|
|
181
|
+
const expectedData = { name: "test-repo" };
|
|
182
|
+
|
|
183
|
+
// When (실행)
|
|
184
|
+
const result = await fetchGitHubContent(mockUrl);
|
|
185
|
+
|
|
186
|
+
// Then (검증)
|
|
187
|
+
expect(result).toEqual(expectedData);
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
test("잘못된 URL에 대해 에러를 발생시켜야 함", async () => {
|
|
191
|
+
// Given & When & Then
|
|
192
|
+
await expect(fetchGitHubContent("invalid-url")).rejects.toThrow(
|
|
193
|
+
"올바르지 않은 URL입니다"
|
|
194
|
+
);
|
|
195
|
+
});
|
|
196
|
+
});
|
|
197
|
+
});
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
### 테스트 실행
|
|
201
|
+
|
|
202
|
+
```bash
|
|
203
|
+
# 모든 테스트 실행
|
|
204
|
+
npm test
|
|
205
|
+
|
|
206
|
+
# 감시 모드로 실행
|
|
207
|
+
npm run test:watch
|
|
208
|
+
|
|
209
|
+
# 커버리지 포함
|
|
210
|
+
npm run test:coverage
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
## Pull Request 가이드
|
|
214
|
+
|
|
215
|
+
### PR 생성 전 체크리스트
|
|
216
|
+
|
|
217
|
+
- [ ] 최신 `develop` 브랜치로부터 생성된 브랜치
|
|
218
|
+
- [ ] 모든 테스트 통과 (`npm test`)
|
|
219
|
+
- [ ] 린팅 검사 통과 (`npm run lint`)
|
|
220
|
+
- [ ] 관련된 기존 이슈가 있다면 링크 포함
|
|
221
|
+
- [ ] 변경사항에 대한 테스트 추가
|
|
222
|
+
|
|
223
|
+
### PR 제목 형식
|
|
224
|
+
|
|
225
|
+
```
|
|
226
|
+
<type>(<scope>): <description>
|
|
227
|
+
|
|
228
|
+
예시:
|
|
229
|
+
feat(cli): GitHub API 재시도 로직 추가
|
|
230
|
+
fix(installer): 백업 파일 타임스탬프 오류 수정
|
|
231
|
+
docs(readme): 설치 가이드 업데이트
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
### PR 설명 템플릿
|
|
235
|
+
|
|
236
|
+
```markdown
|
|
237
|
+
## 변경사항 요약
|
|
238
|
+
|
|
239
|
+
<!-- 이 PR에서 무엇을 변경했는지 간단히 설명 -->
|
|
240
|
+
|
|
241
|
+
## 관련 이슈
|
|
242
|
+
|
|
243
|
+
<!-- 관련된 이슈가 있다면 링크 -->
|
|
244
|
+
|
|
245
|
+
Closes #123
|
|
246
|
+
|
|
247
|
+
## 변경 유형
|
|
248
|
+
|
|
249
|
+
- [ ] 버그 수정 (기존 기능을 깨뜨리지 않는 변경사항)
|
|
250
|
+
- [ ] 새로운 기능 (기존 기능을 깨뜨리지 않는 새로운 기능)
|
|
251
|
+
- [ ] Breaking change (기존 기능에 영향을 주는 변경사항)
|
|
252
|
+
- [ ] 문서 업데이트
|
|
253
|
+
|
|
254
|
+
## 테스트 방법
|
|
255
|
+
|
|
256
|
+
<!-- 이 변경사항을 어떻게 테스트했는지 설명 -->
|
|
257
|
+
|
|
258
|
+
1. 단계 1
|
|
259
|
+
2. 단계 2
|
|
260
|
+
3. 예상 결과
|
|
261
|
+
|
|
262
|
+
## 스크린샷 (해당하는 경우)
|
|
263
|
+
|
|
264
|
+
<!-- 시각적 변경사항이 있다면 스크린샷 포함 -->
|
|
265
|
+
|
|
266
|
+
## 추가 참고사항
|
|
267
|
+
|
|
268
|
+
<!-- 리뷰어가 알아야 할 추가 정보 -->
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
### 코드 리뷰 과정
|
|
272
|
+
|
|
273
|
+
1. **자동 검사**: GitHub Actions가 자동으로 테스트 실행
|
|
274
|
+
2. **코드 리뷰**: 프로젝트 유지보수자가 코드 검토
|
|
275
|
+
3. **피드백 대응**: 리뷰 댓글에 적극적으로 응답
|
|
276
|
+
4. **승인 및 머지**: 승인 후 squash merge로 병합
|
|
277
|
+
|
|
278
|
+
## 이슈 리포팅
|
|
279
|
+
|
|
280
|
+
### 버그 리포트
|
|
281
|
+
|
|
282
|
+
다음 정보를 포함해 주세요:
|
|
283
|
+
|
|
284
|
+
```markdown
|
|
285
|
+
## 버그 설명
|
|
286
|
+
|
|
287
|
+
<!-- 버그에 대한 명확하고 간단한 설명 -->
|
|
288
|
+
|
|
289
|
+
## 재현 단계
|
|
290
|
+
|
|
291
|
+
1. '...'로 이동
|
|
292
|
+
2. '...'를 클릭
|
|
293
|
+
3. 아래로 스크롤하여 '...'를 확인
|
|
294
|
+
4. 오류 발생
|
|
295
|
+
|
|
296
|
+
## 예상 동작
|
|
297
|
+
|
|
298
|
+
<!-- 예상했던 동작에 대한 설명 -->
|
|
299
|
+
|
|
300
|
+
## 실제 동작
|
|
301
|
+
|
|
302
|
+
<!-- 실제로 일어난 일에 대한 설명 -->
|
|
303
|
+
|
|
304
|
+
## 환경
|
|
305
|
+
|
|
306
|
+
- OS: [예: macOS 12.0]
|
|
307
|
+
- Node.js 버전: [예: 18.0.0]
|
|
308
|
+
- aiwf 버전: [예: 1.0.0]
|
|
309
|
+
|
|
310
|
+
## 추가 컨텍스트
|
|
311
|
+
|
|
312
|
+
<!-- 문제에 대한 추가 정보나 스크린샷 -->
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
### 기능 요청
|
|
316
|
+
|
|
317
|
+
```markdown
|
|
318
|
+
## 기능 설명
|
|
319
|
+
|
|
320
|
+
<!-- 원하는 기능에 대한 설명 -->
|
|
321
|
+
|
|
322
|
+
## 문제점
|
|
323
|
+
|
|
324
|
+
<!-- 이 기능이 해결할 문제에 대한 설명 -->
|
|
325
|
+
|
|
326
|
+
## 제안하는 해결책
|
|
327
|
+
|
|
328
|
+
<!-- 어떻게 구현되었으면 하는지에 대한 설명 -->
|
|
329
|
+
|
|
330
|
+
## 대안
|
|
331
|
+
|
|
332
|
+
<!-- 고려한 다른 해결책들 -->
|
|
333
|
+
|
|
334
|
+
## 추가 컨텍스트
|
|
335
|
+
|
|
336
|
+
<!-- 기능 요청에 대한 추가 정보나 스크린샷 -->
|
|
337
|
+
```
|
|
338
|
+
|
|
339
|
+
## 커뮤니티 가이드라인
|
|
340
|
+
|
|
341
|
+
### 소통 채널
|
|
342
|
+
|
|
343
|
+
- **GitHub Issues**: 버그 리포트, 기능 요청
|
|
344
|
+
- **GitHub Discussions**: 일반적인 질문, 아이디어 논의
|
|
345
|
+
- **Pull Request**: 코드 리뷰, 기술적 논의
|
|
346
|
+
|
|
347
|
+
### 질문하기
|
|
348
|
+
|
|
349
|
+
좋은 질문을 위한 가이드:
|
|
350
|
+
|
|
351
|
+
1. **검색 먼저**: 이미 답변된 질문인지 확인
|
|
352
|
+
2. **구체적으로**: 애매한 질문보다는 구체적인 상황 설명
|
|
353
|
+
3. **재현 가능한 예제**: 문제를 재현할 수 있는 최소한의 예제 제공
|
|
354
|
+
4. **환경 정보**: OS, Node.js 버전, aiwf 버전 등
|
|
355
|
+
|
|
356
|
+
### 답변하기
|
|
357
|
+
|
|
358
|
+
다른 기여자의 질문에 답변할 때:
|
|
359
|
+
|
|
360
|
+
1. **친절하게**: 초보자도 이해하기 쉽게 설명
|
|
361
|
+
2. **정확하게**: 확실하지 않다면 "잘 모르겠다"고 솔직히 말하기
|
|
362
|
+
3. **완전하게**: 부분적인 답변보다는 완전한 해결책 제시
|
|
363
|
+
|
|
364
|
+
## 릴리스 과정
|
|
365
|
+
|
|
366
|
+
### 버전 관리
|
|
367
|
+
|
|
368
|
+
aiwf는 [Semantic Versioning](https://semver.org/)을 따릅니다:
|
|
369
|
+
|
|
370
|
+
- **MAJOR**: 호환되지 않는 API 변경
|
|
371
|
+
- **MINOR**: 기존 기능과 호환되는 새로운 기능
|
|
372
|
+
- **PATCH**: 기존 기능과 호환되는 버그 수정
|
|
373
|
+
|
|
374
|
+
### 릴리스 일정
|
|
375
|
+
|
|
376
|
+
- **메이저 릴리스**: 필요에 따라 (Breaking changes)
|
|
377
|
+
- **마이너 릴리스**: 월 1회 또는 주요 기능 완성 시
|
|
378
|
+
- **패치 릴리스**: 중요한 버그 수정 시 수시로
|
|
379
|
+
|
|
380
|
+
## 도구 및 리소스
|
|
381
|
+
|
|
382
|
+
### 개발 도구
|
|
383
|
+
|
|
384
|
+
- **IDE**: VS Code, Cursor, Windsurf (Claude Code 지원)
|
|
385
|
+
- **터미널**: 현대적인 터미널 (zsh, fish 등)
|
|
386
|
+
- **Git GUI**: SourceTree, GitHub Desktop 등 (선택사항)
|
|
387
|
+
|
|
388
|
+
### 학습 리소스
|
|
389
|
+
|
|
390
|
+
- [Node.js 공식 문서](https://nodejs.org/docs/)
|
|
391
|
+
- [Jest 테스팅 가이드](https://jestjs.io/docs/getting-started)
|
|
392
|
+
- [Conventional Commits](https://www.conventionalcommits.org/)
|
|
393
|
+
- [GitHub Flow](https://guides.github.com/introduction/flow/)
|
|
394
|
+
|
|
395
|
+
## 인정과 감사
|
|
396
|
+
|
|
397
|
+
기여해 주신 모든 분들께 감사드립니다! 주요 기여자들은 다음에서 확인할 수 있습니다:
|
|
398
|
+
|
|
399
|
+
- [Contributors 페이지](https://github.com/aiwf/aiwf/graphs/contributors)
|
|
400
|
+
- [릴리스 노트](https://github.com/aiwf/aiwf/releases)에서 각 릴리스별 기여자 언급
|
|
401
|
+
|
|
402
|
+
---
|
|
403
|
+
|
|
404
|
+
궁금한 점이 있으시면 언제든지 [이슈를 생성](https://github.com/aiwf/aiwf/issues/new)하거나 [토론](https://github.com/aiwf/aiwf/discussions)에 참여해 주세요!
|
|
405
|
+
|
|
406
|
+
함께 더 나은 aiwf를 만들어 나가요! 🚀
|