bmad-setup 1.4.0 → 1.5.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/README.md +125 -335
- package/bin/cli.js +73 -16
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,90 +1,119 @@
|
|
|
1
1
|
# BMAD Framework Submodule
|
|
2
2
|
|
|
3
|
-

|
|
4
|
+

|
|
4
5
|

|
|
5
6
|

|
|
6
|
-

|
|
7
8
|
|
|
8
|
-
BMAD
|
|
9
|
+
BMAD 프레임워크를 Git Submodule로 관리하여 **팀별, 프로젝트별로 간편하게 커스터마이징**할 수 있는 세팅 도구입니다.
|
|
9
10
|
|
|
10
|
-
|
|
11
|
+
한 줄 설치(`npx bmad-setup`)로 에이전트, 워크플로우, 지식 베이스를 프로젝트에 즉시 적용하고, 필요한 모듈만 골라 사용할 수 있습니다.
|
|
11
12
|
|
|
12
|
-
|
|
13
|
-
| ------------------ | ----------------- |
|
|
14
|
-
| Submodule Version | v1.3.1 |
|
|
15
|
-
| BMAD Framework | 6.0.0-beta.8 |
|
|
13
|
+
> **Claude Code 전용** — 슬래시 커맨드 및 에이전트 시스템이 Claude Code의 커맨드 구조에 맞춰 설계되어 있습니다.
|
|
16
14
|
|
|
17
|
-
|
|
15
|
+
| 항목 | 버전 |
|
|
16
|
+
| ----------------- | ------------ |
|
|
17
|
+
| Submodule Version | v1.5.0 |
|
|
18
|
+
| BMAD Framework | 6.0.0-beta.8 |
|
|
19
|
+
|
|
20
|
+
> [Changelog](./CHANGELOG.md)에서 변경 이력을 확인하세요.
|
|
18
21
|
|
|
19
22
|
---
|
|
20
23
|
|
|
21
|
-
##
|
|
24
|
+
## BMAD Method란?
|
|
22
25
|
|
|
23
|
-
|
|
26
|
+
**BMAD(Breakthrough Method of Agile AI-Driven Development)** 는 AI 기반 소프트웨어 개발을 위한 오픈소스 프레임워크입니다.
|
|
24
27
|
|
|
25
|
-
|
|
28
|
+
아이디어 기획부터 구현까지 전체 개발 과정을 **전문화된 AI 에이전트**와 **가이드 워크플로우**로 지원하며, 프로젝트 복잡도에 맞춘 적응형 접근 방식을 제공합니다.
|
|
26
29
|
|
|
27
|
-
|
|
30
|
+
- **전문 에이전트** — Analyst, PM, Architect, Dev, Test Architect 등 역할별 AI 에이전트
|
|
31
|
+
- **가이드 워크플로우** — 단계별 개발 프로세스로 일관된 품질 확보
|
|
32
|
+
- **적응형 계획** — 버그 수정부터 엔터프라이즈 플랫폼까지 프로젝트 규모에 맞게 동적 조정
|
|
28
33
|
|
|
29
|
-
|
|
34
|
+
> 공식 문서: [https://docs.bmad-method.org](https://docs.bmad-method.org/)
|
|
30
35
|
|
|
31
|
-
|
|
32
|
-
- `.gitmodules` 파일에 원격 저장소 URL이 기록됩니다
|
|
33
|
-
- 특정 커밋(SHA)을 가리키므로 버전 고정이 가능합니다
|
|
36
|
+
---
|
|
34
37
|
|
|
35
|
-
|
|
38
|
+
## 왜 이 서브모듈을 사용하나요?
|
|
36
39
|
|
|
37
|
-
|
|
38
|
-
**Submodule** = 도서관 책의 위치(서가 번호)만 메모해둠
|
|
40
|
+
BMAD 프레임워크 원본은 범용으로 설계되어 있습니다. 이 서브모듈은 그것을 **우리 팀의 실정에 맞게 가져다 쓰는 방법**을 제공합니다.
|
|
39
41
|
|
|
40
|
-
|
|
42
|
+
### 팀/프로젝트별 커스터마이징
|
|
41
43
|
|
|
42
|
-
-
|
|
43
|
-
-
|
|
44
|
-
-
|
|
44
|
+
- **모듈 선택** — 필요한 모듈(소프트웨어 개발, 테스트, 데이터 분석 등)만 골라 사용
|
|
45
|
+
- **에이전트 커스텀** — 팀 컨벤션, 기술 스택, 도메인 용어를 에이전트에 반영
|
|
46
|
+
- **워크플로우 조정** — 팀의 개발 프로세스에 맞게 워크플로우를 추가/수정
|
|
47
|
+
- **메모리 템플릿** — 프로젝트별 컨텍스트(서비스 정보, 퍼널, 지표 등)를 사전 설정
|
|
45
48
|
|
|
46
|
-
|
|
49
|
+
### Submodule 방식의 이점
|
|
47
50
|
|
|
48
|
-
|
|
51
|
+
| 구분 | 직접 복사 | Submodule 사용 |
|
|
52
|
+
| --------- | ------------------------- | ------------------------- |
|
|
53
|
+
| PR 크기 | 300개 이상 파일 변경 | 2개 파일만 변경 |
|
|
54
|
+
| 업데이트 | 각 프로젝트마다 수동 복사 | `git pull` 한 번으로 해결 |
|
|
55
|
+
| 버전 관리 | 어떤 버전인지 추적 어려움 | 커밋 SHA로 정확한 버전 추적 |
|
|
56
|
+
| 설치 | 수동 복사 | `npx bmad-setup` 한 줄 |
|
|
49
57
|
|
|
50
|
-
|
|
58
|
+
프레임워크 원본이 업데이트되더라도, 커스터마이징한 설정은 프로젝트에 그대로 유지됩니다.
|
|
51
59
|
|
|
52
|
-
|
|
53
|
-
| ----------- | --------------------------- | --------------------------- |
|
|
54
|
-
| PR 크기 | 300개 이상 파일 변경 | 2개 파일만 변경 |
|
|
55
|
-
| 업데이트 | 각 프로젝트마다 수동 복사 | `git pull` 한 번으로 해결 |
|
|
56
|
-
| 버전 관리 | 어떤 버전인지 추적 어려움 | 커밋 SHA로 정확한 버전 추적 |
|
|
57
|
-
| 디스크 용량 | 프로젝트마다 전체 파일 중복 | 참조만 저장 |
|
|
58
|
-
| 설치 자동화 | 불가능 | `npm install`로 자동 초기화 |
|
|
60
|
+
---
|
|
59
61
|
|
|
60
|
-
|
|
62
|
+
## 제공 모듈
|
|
61
63
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
64
|
+
| 모듈 | 설명 | 주요 에이전트/워크플로우 |
|
|
65
|
+
| ------ | ------------------------ | ---------------------------------------- |
|
|
66
|
+
| `core` | 핵심 기능 | bmad-master, brainstorming, party-mode |
|
|
67
|
+
| `bmm` | 소프트웨어 개발 | analyst, architect, dev, pm, sm, ux |
|
|
68
|
+
| `bmb` | 모듈 빌더 | agent-builder, workflow-builder |
|
|
69
|
+
| `gds` | 게임 개발 | game-designer, game-dev, game-qa |
|
|
70
|
+
| `tea` | 테스트 아키텍처 | test-engineer-architect |
|
|
71
|
+
| `cis` | 크리에이티브 & 혁신 전략 | design-thinking, innovation, storytelling |
|
|
72
|
+
| `dae` | 데이터 분석 (커스텀) | data-analyst, Amplitude 연동 |
|
|
65
73
|
|
|
66
74
|
---
|
|
67
75
|
|
|
68
|
-
##
|
|
76
|
+
## 빠른 시작
|
|
77
|
+
|
|
78
|
+
### 설치
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
npx bmad-setup
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
자동으로 수행되는 작업:
|
|
69
85
|
|
|
70
|
-
|
|
86
|
+
1. `bmad-submodule` Git Submodule 추가 및 초기화
|
|
87
|
+
2. `.gitmodules`에 `ignore = dirty` 설정
|
|
88
|
+
3. `install.sh` 실행 (심볼릭 링크 생성)
|
|
89
|
+
4. `.gitignore`에 BMAD 항목 추가
|
|
90
|
+
5. `package.json`에 postinstall / bmad:install / bmad:uninstall 스크립트 추가
|
|
71
91
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
92
|
+
> 이미 설치된 항목은 자동으로 스킵됩니다 (멱등성 보장).
|
|
93
|
+
|
|
94
|
+
### 업데이트
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
npx bmad-setup --update
|
|
98
|
+
```
|
|
76
99
|
|
|
77
|
-
|
|
100
|
+
Submodule을 최신 버전으로 pull하고 심볼릭 링크를 갱신합니다.
|
|
78
101
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
102
|
+
### 동작 확인
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
claude
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
Claude Code 실행 후 `/bmad-`를 입력하면 사용 가능한 커맨드 목록이 자동완성됩니다.
|
|
109
|
+
|
|
110
|
+
```bash
|
|
111
|
+
# 예시: 에이전트 실행
|
|
112
|
+
/bmad-agent-bmm-dev # 개발자 에이전트
|
|
113
|
+
/bmad-agent-bmm-architect # 아키텍트 에이전트
|
|
114
|
+
/bmad-agent-bmad-master # 마스터 에이전트
|
|
115
|
+
/bmad-agent-dae-data-analyst # 데이터 분석가
|
|
116
|
+
```
|
|
88
117
|
|
|
89
118
|
---
|
|
90
119
|
|
|
@@ -94,7 +123,7 @@ Git을 처음 접하시거나 Submodule이 생소하신 분들을 위한 설명
|
|
|
94
123
|
bmad-submodule/
|
|
95
124
|
├── .claude/
|
|
96
125
|
│ └── commands/
|
|
97
|
-
│ ├── bmad-agent-*.md # 에이전트 슬래시 커맨드
|
|
126
|
+
│ ├── bmad-agent-*.md # 에이전트 슬래시 커맨드
|
|
98
127
|
│ ├── bmad-bmm-*.md # BMM 워크플로우 커맨드
|
|
99
128
|
│ ├── bmad-bmb-*.md # BMB 빌더 커맨드
|
|
100
129
|
│ ├── bmad-gds-*.md # GDS 게임 개발 커맨드
|
|
@@ -119,61 +148,32 @@ bmad-submodule/
|
|
|
119
148
|
|
|
120
149
|
---
|
|
121
150
|
|
|
122
|
-
## 설치
|
|
151
|
+
## 수동 설치
|
|
123
152
|
|
|
124
|
-
|
|
153
|
+
`npx bmad-setup` 대신 직접 설치하려면 아래 단계를 따르세요.
|
|
125
154
|
|
|
126
|
-
|
|
155
|
+
### 1단계: Submodule 추가
|
|
127
156
|
|
|
128
157
|
```bash
|
|
129
|
-
npx bmad-setup
|
|
130
|
-
```
|
|
131
|
-
|
|
132
|
-
이 명령어는 다음을 자동으로 수행합니다:
|
|
133
|
-
|
|
134
|
-
1. `bmad-submodule` Git Submodule 추가 및 초기화
|
|
135
|
-
2. `.gitmodules`에 `ignore = dirty` 설정
|
|
136
|
-
3. `install.sh` 실행 (심볼릭 링크 생성)
|
|
137
|
-
4. `.gitignore`에 BMAD 항목 추가
|
|
138
|
-
5. `package.json`에 postinstall / bmad:install / bmad:uninstall 스크립트 추가
|
|
139
|
-
|
|
140
|
-
> 이미 설치된 항목은 자동으로 스킵됩니다 (멱등성 보장).
|
|
141
|
-
|
|
142
|
-
---
|
|
143
|
-
|
|
144
|
-
### 수동 설치
|
|
145
|
-
|
|
146
|
-
아래는 수동으로 단계별 설치하는 방법입니다.
|
|
147
|
-
|
|
148
|
-
#### 1단계: Submodule 추가
|
|
149
|
-
|
|
150
|
-
프로젝트 루트 디렉토리에서 실행:
|
|
151
|
-
|
|
152
|
-
```bash
|
|
153
|
-
# Submodule 추가
|
|
154
158
|
git submodule add https://github.com/OhSeungWan/bmad-submodule.git bmad-submodule
|
|
155
|
-
|
|
156
|
-
# Submodule 초기화 및 파일 다운로드
|
|
157
159
|
git submodule init
|
|
158
160
|
git submodule update
|
|
159
|
-
|
|
160
|
-
# dirty 상태 무시 설정 (아래 '설정 파일 설명' 참조)
|
|
161
161
|
git config -f .gitmodules submodule.bmad-submodule.ignore dirty
|
|
162
162
|
```
|
|
163
163
|
|
|
164
|
-
|
|
164
|
+
### 2단계: 심볼릭 링크 생성
|
|
165
165
|
|
|
166
166
|
```bash
|
|
167
167
|
./bmad-submodule/install.sh
|
|
168
168
|
```
|
|
169
169
|
|
|
170
|
-
|
|
170
|
+
생성되는 링크:
|
|
171
171
|
|
|
172
|
-
-
|
|
173
|
-
-
|
|
174
|
-
-
|
|
172
|
+
- `.claude/commands/bmad-*.md` → `bmad-submodule/.claude/commands/bmad-*.md`
|
|
173
|
+
- `.claude/commands/commit.md` → `bmad-submodule/.claude/commands/commit.md`
|
|
174
|
+
- `_bmad` → `bmad-submodule/_bmad`
|
|
175
175
|
|
|
176
|
-
|
|
176
|
+
### 3단계: package.json 설정 (권장)
|
|
177
177
|
|
|
178
178
|
팀원들의 자동 설치를 위해 추가:
|
|
179
179
|
|
|
@@ -187,27 +187,13 @@ git config -f .gitmodules submodule.bmad-submodule.ignore dirty
|
|
|
187
187
|
}
|
|
188
188
|
```
|
|
189
189
|
|
|
190
|
-
**각 스크립트 설명:**
|
|
191
|
-
|
|
192
190
|
| 스크립트 | 실행 시점 | 동작 |
|
|
193
191
|
| ---------------- | ---------------- | ------------------------------------- |
|
|
194
192
|
| `postinstall` | `npm install` 후 | Submodule 초기화 + 최신화 + 링크 생성 |
|
|
195
193
|
| `bmad:install` | 수동 실행 | 심볼릭 링크만 생성 |
|
|
196
194
|
| `bmad:uninstall` | 수동 실행 | 심볼릭 링크 제거 |
|
|
197
195
|
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
```bash
|
|
201
|
-
[ -z "$CI" ] # CI 환경이 아닐 때만 실행
|
|
202
|
-
&& git submodule update --init --recursive # Submodule 초기화 및 업데이트
|
|
203
|
-
&& git -C bmad-submodule pull origin master # 최신 버전으로 업데이트
|
|
204
|
-
&& ./bmad-submodule/install.sh # 심볼릭 링크 생성
|
|
205
|
-
|| true # 실패해도 npm install은 계속 진행
|
|
206
|
-
```
|
|
207
|
-
|
|
208
|
-
#### 4단계: .gitignore 추가
|
|
209
|
-
|
|
210
|
-
루트 프로젝트의 `.gitignore`에 추가:
|
|
196
|
+
### 4단계: .gitignore 추가
|
|
211
197
|
|
|
212
198
|
```
|
|
213
199
|
# BMAD 심볼릭 링크 (실제 파일은 submodule에 있음)
|
|
@@ -217,52 +203,9 @@ _bmad
|
|
|
217
203
|
|
|
218
204
|
---
|
|
219
205
|
|
|
220
|
-
##
|
|
221
|
-
|
|
222
|
-
### .gitmodules
|
|
223
|
-
|
|
224
|
-
Submodule 정보가 저장되는 파일입니다. `git submodule add` 실행 시 자동 생성됩니다.
|
|
225
|
-
|
|
226
|
-
```ini
|
|
227
|
-
[submodule "bmad-submodule"]
|
|
228
|
-
path = bmad-submodule
|
|
229
|
-
url = https://github.com/OhSeungWan/bmad-submodule.git
|
|
230
|
-
ignore = dirty
|
|
231
|
-
```
|
|
232
|
-
|
|
233
|
-
| 항목 | 설명 |
|
|
234
|
-
| -------- | --------------------------------------------- |
|
|
235
|
-
| `path` | Submodule이 위치할 로컬 경로 |
|
|
236
|
-
| `url` | Submodule의 원격 저장소 URL |
|
|
237
|
-
| `ignore` | `dirty` = 내부 변경사항을 git status에서 무시 |
|
|
238
|
-
|
|
239
|
-
### ignore = dirty 설정
|
|
240
|
-
|
|
241
|
-
**왜 필요한가요?**
|
|
242
|
-
|
|
243
|
-
VSCode 등 에디터가 파일을 열면 자동으로:
|
|
244
|
-
|
|
245
|
-
- 줄 끝 공백 제거
|
|
246
|
-
- 파일 끝 빈 줄 추가
|
|
247
|
-
- 탭→스페이스 변환
|
|
248
|
-
|
|
249
|
-
이런 자동 변경으로 인해 `git status`에서 `bmad-submodule (modified content)`가 표시됩니다.
|
|
250
|
-
|
|
251
|
-
**해결 방법:**
|
|
252
|
-
|
|
253
|
-
```bash
|
|
254
|
-
# dirty 상태 무시 설정
|
|
255
|
-
git config -f .gitmodules submodule.bmad-submodule.ignore dirty
|
|
256
|
-
|
|
257
|
-
# 이미 발생한 변경사항 되돌리기
|
|
258
|
-
git submodule foreach --recursive git checkout .
|
|
259
|
-
```
|
|
260
|
-
|
|
261
|
-
---
|
|
262
|
-
|
|
263
|
-
## Submodule과 함께 Clone
|
|
206
|
+
## 팀원 온보딩
|
|
264
207
|
|
|
265
|
-
|
|
208
|
+
새 팀원이 프로젝트를 받을 때:
|
|
266
209
|
|
|
267
210
|
```bash
|
|
268
211
|
# 방법 1: 한 번에 (권장)
|
|
@@ -274,167 +217,16 @@ cd <your-repo>
|
|
|
274
217
|
git submodule update --init --recursive
|
|
275
218
|
```
|
|
276
219
|
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
---
|
|
280
|
-
|
|
281
|
-
## Submodule 업데이트
|
|
282
|
-
|
|
283
|
-
BMAD에 새 기능이 추가되었을 때:
|
|
284
|
-
|
|
285
|
-
```bash
|
|
286
|
-
# 1. Submodule 디렉토리로 이동
|
|
287
|
-
cd bmad-submodule
|
|
288
|
-
|
|
289
|
-
# 2. 최신 버전 가져오기
|
|
290
|
-
git pull origin master
|
|
291
|
-
|
|
292
|
-
# 3. 심볼릭 링크 재생성 (새 파일이 추가된 경우)
|
|
293
|
-
./install.sh
|
|
220
|
+
> `--recurse-submodules` 없이 clone하면 `bmad-submodule` 폴더가 비어있습니다.
|
|
294
221
|
|
|
295
|
-
|
|
296
|
-
cd ..
|
|
297
|
-
git add bmad-submodule
|
|
298
|
-
git commit -m "chore: update bmad-submodule"
|
|
299
|
-
git push
|
|
300
|
-
```
|
|
301
|
-
|
|
302
|
-
---
|
|
303
|
-
|
|
304
|
-
## 스크립트 상세 설명
|
|
305
|
-
|
|
306
|
-
### install.sh
|
|
307
|
-
|
|
308
|
-
```bash
|
|
309
|
-
./bmad-submodule/install.sh
|
|
310
|
-
```
|
|
311
|
-
|
|
312
|
-
**동작:**
|
|
313
|
-
|
|
314
|
-
1. 기존 심볼릭 링크/폴더가 있으면 삭제
|
|
315
|
-
2. 루트 프로젝트에 `.claude/commands` 디렉토리 생성
|
|
316
|
-
3. 심볼릭 링크 생성:
|
|
317
|
-
- `.claude/commands/bmad` → submodule의 `.claude/commands/bmad`
|
|
318
|
-
- `_bmad` → submodule의 `_bmad`
|
|
319
|
-
|
|
320
|
-
**언제 실행하나요?**
|
|
321
|
-
|
|
322
|
-
- 최초 설치 시
|
|
323
|
-
- Submodule 업데이트 후 (새 파일이 추가된 경우)
|
|
324
|
-
- 심볼릭 링크가 깨진 경우
|
|
325
|
-
|
|
326
|
-
### uninstall.sh
|
|
327
|
-
|
|
328
|
-
```bash
|
|
329
|
-
./bmad-submodule/uninstall.sh
|
|
330
|
-
```
|
|
331
|
-
|
|
332
|
-
**동작:**
|
|
333
|
-
|
|
334
|
-
1. 심볼릭 링크인 경우: 바로 삭제
|
|
335
|
-
2. 일반 디렉토리인 경우: 확인 후 삭제
|
|
336
|
-
|
|
337
|
-
**언제 실행하나요?**
|
|
338
|
-
|
|
339
|
-
- BMAD 사용을 중단할 때
|
|
340
|
-
- 심볼릭 링크 대신 직접 파일을 관리하고 싶을 때
|
|
341
|
-
|
|
342
|
-
---
|
|
343
|
-
|
|
344
|
-
## 동작 확인
|
|
345
|
-
|
|
346
|
-
설치가 완료되면 BMAD 에이전트가 정상적으로 작동하는지 확인합니다.
|
|
347
|
-
|
|
348
|
-
### 1. Claude Code 실행
|
|
349
|
-
|
|
350
|
-
프로젝트 루트 디렉토리에서 Claude Code를 실행합니다:
|
|
351
|
-
|
|
352
|
-
```bash
|
|
353
|
-
claude
|
|
354
|
-
```
|
|
355
|
-
|
|
356
|
-
### 2. 슬래시 커맨드 확인
|
|
357
|
-
|
|
358
|
-
Claude Code 내에서 `/bmad-`를 입력하면 사용 가능한 커맨드 목록이 자동완성됩니다.
|
|
359
|
-
|
|
360
|
-
### 3. 에이전트 실행 테스트
|
|
361
|
-
|
|
362
|
-
예시로 Data Analyst 에이전트를 실행해봅니다:
|
|
363
|
-
|
|
364
|
-
```
|
|
365
|
-
/bmad-agent-dae-data-analyst
|
|
366
|
-
```
|
|
367
|
-
|
|
368
|
-
**정상 실행 시 출력 예시:**
|
|
369
|
-
|
|
370
|
-
```
|
|
371
|
-
안녕하세요, 렌트리 개발팀님! 📊
|
|
372
|
-
|
|
373
|
-
저는 재만이에요 - 여러분의 데이터 분석 파트너입니다.
|
|
374
|
-
|
|
375
|
-
----
|
|
376
|
-
현재 서비스 컨텍스트
|
|
377
|
-
|
|
378
|
-
아직 서비스 정보가 설정되지 않았어요. [SC] 서비스 컨텍스트 설정을 통해
|
|
379
|
-
렌트리 서비스의 퍼널과 핵심 지표를 학습하면 더 정확한 분석을 도와드릴 수 있어요!
|
|
380
|
-
|
|
381
|
-
----
|
|
382
|
-
메뉴
|
|
383
|
-
|
|
384
|
-
| # | 명령어 | 설명 |
|
|
385
|
-
| --- | ------ | -------------------------------------- |
|
|
386
|
-
| 1 | [MH] | 메뉴 도움말 다시 표시 |
|
|
387
|
-
| 2 | [CH] | 에이전트와 자유롭게 대화하기 |
|
|
388
|
-
| 3 | [QA] | 빠른 데이터 분석 - 질문에 답하기 |
|
|
389
|
-
| 4 | [FA] | 퍼널 분석 - 전환율, 병목, 이탈 분석 |
|
|
390
|
-
| 5 | [ED] | 실험 설계 - A/B 테스트 계획 수립 |
|
|
391
|
-
| 6 | [ER] | 실험 결과 분석 - 테스트 결과 해석 |
|
|
392
|
-
| 7 | [IA] | 영향도 분석 - 기능 변경 영향 예측 |
|
|
393
|
-
| 8 | [RM] | 위험 모니터링 - 이상 징후 감지 |
|
|
394
|
-
| 9 | [SC] | 서비스 컨텍스트 설정 - 퍼널, 지표 학습 |
|
|
395
|
-
| 10 | [GR] | 리포트 생성 - 분석 결과 문서화 |
|
|
396
|
-
| 11 | [DA] | 에이전트 종료 |
|
|
397
|
-
|
|
398
|
-
----
|
|
399
|
-
번호나 명령어를 입력해주세요. 무엇을 도와드릴까요?
|
|
400
|
-
```
|
|
401
|
-
|
|
402
|
-
위와 같이 에이전트 메뉴가 표시되면 설치가 정상적으로 완료된 것입니다.
|
|
403
|
-
|
|
404
|
-
### 4. 다른 에이전트/워크플로우 테스트
|
|
405
|
-
|
|
406
|
-
모듈별로 다양한 에이전트와 워크플로우를 테스트해볼 수 있습니다:
|
|
407
|
-
|
|
408
|
-
```bash
|
|
409
|
-
# BMM (소프트웨어 개발)
|
|
410
|
-
/bmad-agent-bmm-dev # 개발자 에이전트
|
|
411
|
-
/bmad-agent-bmm-architect # 아키텍트 에이전트
|
|
412
|
-
|
|
413
|
-
# Core (핵심)
|
|
414
|
-
/bmad-agent-bmad-master # 마스터 에이전트
|
|
415
|
-
/bmad-brainstorming # 브레인스토밍
|
|
416
|
-
|
|
417
|
-
# DAE (데이터 분석)
|
|
418
|
-
/bmad-agent-dae-data-analyst # 데이터 분석가
|
|
419
|
-
/bmad-dae-data-analysis # 데이터 분석 워크플로우
|
|
420
|
-
```
|
|
421
|
-
|
|
422
|
-
### 5. 설치 실패 시 체크리스트
|
|
423
|
-
|
|
424
|
-
에이전트가 실행되지 않으면 다음을 확인하세요:
|
|
425
|
-
|
|
426
|
-
| 확인 항목 | 명령어 |
|
|
427
|
-
| --------------------------- | ------------------------------ |
|
|
428
|
-
| Submodule이 초기화되었는가? | `ls bmad-submodule/` |
|
|
429
|
-
| 심볼릭 링크가 생성되었는가? | `ls -la .claude/commands/bmad` |
|
|
430
|
-
| _bmad 링크가 생성되었는가? | `ls -la _bmad` |
|
|
431
|
-
| install.sh를 실행했는가? | `./bmad-submodule/install.sh` |
|
|
222
|
+
`package.json`에 postinstall이 설정되어 있다면, `npm install`만으로 자동 초기화됩니다.
|
|
432
223
|
|
|
433
224
|
---
|
|
434
225
|
|
|
435
226
|
## 문제 해결
|
|
436
227
|
|
|
437
|
-
|
|
228
|
+
<details>
|
|
229
|
+
<summary><b>bmad-submodule 폴더가 비어있어요</b></summary>
|
|
438
230
|
|
|
439
231
|
Submodule이 초기화되지 않은 상태입니다.
|
|
440
232
|
|
|
@@ -442,41 +234,44 @@ Submodule이 초기화되지 않은 상태입니다.
|
|
|
442
234
|
git submodule update --init --recursive
|
|
443
235
|
```
|
|
444
236
|
|
|
445
|
-
|
|
237
|
+
</details>
|
|
238
|
+
|
|
239
|
+
<details>
|
|
240
|
+
<summary><b>git status에서 bmad-submodule (modified content)가 보여요</b></summary>
|
|
446
241
|
|
|
447
|
-
에디터 자동 포맷팅 때문입니다.
|
|
242
|
+
에디터 자동 포맷팅(줄 끝 공백 제거, 탭→스페이스 등) 때문입니다.
|
|
448
243
|
|
|
449
244
|
```bash
|
|
450
|
-
# 설정으로 방지
|
|
451
245
|
git config -f .gitmodules submodule.bmad-submodule.ignore dirty
|
|
452
|
-
|
|
453
|
-
# 현재 변경사항 되돌리기
|
|
454
246
|
git submodule foreach --recursive git checkout .
|
|
455
247
|
```
|
|
456
248
|
|
|
457
|
-
|
|
249
|
+
</details>
|
|
250
|
+
|
|
251
|
+
<details>
|
|
252
|
+
<summary><b>심볼릭 링크가 작동하지 않아요</b></summary>
|
|
458
253
|
|
|
459
254
|
Windows에서는 관리자 권한이 필요할 수 있습니다.
|
|
460
255
|
|
|
461
256
|
```bash
|
|
462
|
-
# 심볼릭 링크 재생성
|
|
463
257
|
./bmad-submodule/install.sh
|
|
464
|
-
|
|
465
|
-
# 링크 확인
|
|
466
258
|
ls -la .claude/commands/bmad
|
|
467
259
|
ls -la _bmad
|
|
468
260
|
```
|
|
469
261
|
|
|
470
|
-
|
|
262
|
+
</details>
|
|
263
|
+
|
|
264
|
+
<details>
|
|
265
|
+
<summary><b>완전 재설치</b></summary>
|
|
471
266
|
|
|
472
267
|
문제가 지속되면 깨끗하게 다시 시작:
|
|
473
268
|
|
|
474
269
|
```bash
|
|
475
|
-
# 1.
|
|
270
|
+
# 1. 리셋
|
|
476
271
|
git reset HEAD -- .gitmodules bmad-submodule 2>/dev/null || true
|
|
477
272
|
git checkout HEAD -- .gitmodules 2>/dev/null || true
|
|
478
273
|
|
|
479
|
-
# 2.
|
|
274
|
+
# 2. 제거
|
|
480
275
|
git submodule deinit -f bmad-submodule 2>/dev/null || true
|
|
481
276
|
git rm -f bmad-submodule 2>/dev/null || true
|
|
482
277
|
rm -rf bmad-submodule
|
|
@@ -489,29 +284,24 @@ git add .gitmodules
|
|
|
489
284
|
# 4. 다시 추가
|
|
490
285
|
git submodule add https://github.com/OhSeungWan/bmad-submodule.git bmad-submodule
|
|
491
286
|
git config -f .gitmodules submodule.bmad-submodule.ignore dirty
|
|
492
|
-
|
|
493
|
-
# 5. 확인
|
|
494
|
-
ls -la bmad-submodule/
|
|
495
|
-
git submodule status
|
|
496
287
|
```
|
|
497
288
|
|
|
498
|
-
gitignore
|
|
289
|
+
> .gitignore에서 관련 폴더를 제거했는지도 확인하세요. 특정 Claude 버전에서 .gitignore에 추가된 파일을 인식하지 못할 수 있습니다.
|
|
499
290
|
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
## 자주 묻는 질문
|
|
291
|
+
</details>
|
|
503
292
|
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
A: 가능하지만 권장하지 않습니다. 수정사항은 bmad-submodule 저장소에 별도로 커밋/푸시해야 합니다. 팀 프로젝트라면 원본 저장소에 PR을 보내세요.
|
|
293
|
+
---
|
|
507
294
|
|
|
508
|
-
|
|
295
|
+
## FAQ
|
|
509
296
|
|
|
510
|
-
|
|
297
|
+
**Q: Submodule 내부에서 직접 수정해도 되나요?**
|
|
298
|
+
가능하지만 권장하지 않습니다. 수정사항은 bmad-submodule 저장소에 별도로 커밋/푸시해야 합니다. 팀 프로젝트라면 원본 저장소에 PR을 보내세요.
|
|
511
299
|
|
|
512
|
-
|
|
300
|
+
**Q: 특정 버전의 BMAD를 고정하고 싶어요**
|
|
301
|
+
Submodule은 특정 커밋을 가리키므로 기본적으로 버전이 고정됩니다. `git pull`을 하지 않으면 해당 버전이 유지됩니다.
|
|
513
302
|
|
|
514
|
-
|
|
303
|
+
**Q: CI/CD에서는 어떻게 하나요?**
|
|
304
|
+
postinstall 스크립트에 `[ -z "$CI" ]` 조건이 있어 CI 환경에서는 스킵됩니다. CI에서 BMAD가 필요하다면 이 조건을 제거하세요.
|
|
515
305
|
|
|
516
306
|
---
|
|
517
307
|
|
package/bin/cli.js
CHANGED
|
@@ -10,8 +10,11 @@ const VERSION = require('../package.json').version;
|
|
|
10
10
|
const REPO_URL = 'https://github.com/OhSeungWan/bmad-submodule.git';
|
|
11
11
|
const SUBMODULE_DIR = 'bmad-submodule';
|
|
12
12
|
|
|
13
|
+
const args = process.argv.slice(2);
|
|
14
|
+
const isUpdate = args.includes('--update') || args.includes('-u');
|
|
15
|
+
|
|
13
16
|
const log = (icon, msg) => console.log(`${icon} ${msg}`);
|
|
14
|
-
const logStep = (n, msg) => log(`[${n}
|
|
17
|
+
const logStep = (n, total, msg) => log(`[${n}/${total}]`, msg);
|
|
15
18
|
|
|
16
19
|
function run(cmd, opts = {}) {
|
|
17
20
|
return execSync(cmd, { stdio: 'inherit', ...opts });
|
|
@@ -31,7 +34,6 @@ function runSafe(cmd, stepName) {
|
|
|
31
34
|
|
|
32
35
|
// --- --help / --version ---
|
|
33
36
|
function handleFlags() {
|
|
34
|
-
const args = process.argv.slice(2);
|
|
35
37
|
if (args.includes('--version') || args.includes('-v')) {
|
|
36
38
|
console.log(VERSION);
|
|
37
39
|
process.exit(0);
|
|
@@ -43,17 +45,23 @@ bmad-setup v${VERSION}
|
|
|
43
45
|
BMAD Framework 서브모듈을 한 줄로 설치합니다.
|
|
44
46
|
|
|
45
47
|
Usage:
|
|
46
|
-
npx bmad-setup
|
|
47
|
-
npx bmad-setup --
|
|
48
|
-
npx bmad-setup --
|
|
48
|
+
npx bmad-setup 전체 설치 실행
|
|
49
|
+
npx bmad-setup --update 서브모듈 최신화 + 심링크 재생성
|
|
50
|
+
npx bmad-setup --help 도움말 표시
|
|
51
|
+
npx bmad-setup --version 버전 표시
|
|
49
52
|
|
|
50
|
-
|
|
53
|
+
Install steps:
|
|
51
54
|
1. git submodule add (bmad-submodule)
|
|
52
55
|
2. git submodule init & update
|
|
53
56
|
3. .gitmodules ignore=dirty 설정
|
|
54
57
|
4. install.sh 실행 (심볼릭 링크)
|
|
55
58
|
5. .gitignore 패치
|
|
56
59
|
6. package.json 스크립트 패치
|
|
60
|
+
|
|
61
|
+
Update steps (--update):
|
|
62
|
+
1. git submodule update --init --recursive
|
|
63
|
+
2. git -C bmad-submodule pull origin master
|
|
64
|
+
3. install.sh 재실행 (심링크 갱신)
|
|
57
65
|
`);
|
|
58
66
|
process.exit(0);
|
|
59
67
|
}
|
|
@@ -79,9 +87,40 @@ function validateGitRepo() {
|
|
|
79
87
|
}
|
|
80
88
|
}
|
|
81
89
|
|
|
90
|
+
// --- Update mode ---
|
|
91
|
+
function updateSubmodule() {
|
|
92
|
+
logStep(1, 3, 'Submodule 동기화');
|
|
93
|
+
if (!fs.existsSync(SUBMODULE_DIR)) {
|
|
94
|
+
log(' \u274c', `${SUBMODULE_DIR}/ 디렉토리가 없습니다. 먼저 \`npx bmad-setup\`으로 설치하세요.`);
|
|
95
|
+
process.exit(1);
|
|
96
|
+
}
|
|
97
|
+
runSafe('git submodule update --init --recursive', 'Submodule 동기화');
|
|
98
|
+
log(' \u2714', 'Submodule 동기화 완료');
|
|
99
|
+
return 'done';
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function pullLatest() {
|
|
103
|
+
logStep(2, 3, 'Submodule 최신화 (pull origin master)');
|
|
104
|
+
runSafe(`git -C ${SUBMODULE_DIR} pull origin master`, 'Submodule pull');
|
|
105
|
+
log(' \u2714', '최신 버전으로 업데이트 완료');
|
|
106
|
+
return 'done';
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
function reinstallSymlinks() {
|
|
110
|
+
logStep(3, 3, 'install.sh 재실행 (심링크 갱신)');
|
|
111
|
+
const scriptPath = `./${SUBMODULE_DIR}/install.sh`;
|
|
112
|
+
if (!fs.existsSync(scriptPath)) {
|
|
113
|
+
log(' \u26a0', `${scriptPath} 파일을 찾을 수 없습니다. 스킵합니다.`);
|
|
114
|
+
return 'skipped';
|
|
115
|
+
}
|
|
116
|
+
runSafe(`bash ${scriptPath}`, 'install.sh 실행');
|
|
117
|
+
log(' \u2714', '심링크 갱신 완료');
|
|
118
|
+
return 'done';
|
|
119
|
+
}
|
|
120
|
+
|
|
82
121
|
// --- Step 1: Submodule 추가 ---
|
|
83
122
|
function addSubmodule() {
|
|
84
|
-
logStep(1, 'Submodule 추가');
|
|
123
|
+
logStep(1, 6, 'Submodule 추가');
|
|
85
124
|
if (fs.existsSync(SUBMODULE_DIR)) {
|
|
86
125
|
log(' \u2714', `${SUBMODULE_DIR}/ 이미 존재합니다. 스킵합니다.`);
|
|
87
126
|
return 'skipped';
|
|
@@ -93,7 +132,7 @@ function addSubmodule() {
|
|
|
93
132
|
|
|
94
133
|
// --- Step 2: Submodule 초기화 ---
|
|
95
134
|
function initSubmodule() {
|
|
96
|
-
logStep(2, 'Submodule 초기화');
|
|
135
|
+
logStep(2, 6, 'Submodule 초기화');
|
|
97
136
|
runSafe('git submodule init && git submodule update', 'Submodule 초기화');
|
|
98
137
|
log(' \u2714', '초기화 완료');
|
|
99
138
|
return 'done';
|
|
@@ -101,7 +140,7 @@ function initSubmodule() {
|
|
|
101
140
|
|
|
102
141
|
// --- Step 3: dirty ignore 설정 ---
|
|
103
142
|
function configureDirtyIgnore() {
|
|
104
|
-
logStep(3, 'dirty ignore 설정');
|
|
143
|
+
logStep(3, 6, 'dirty ignore 설정');
|
|
105
144
|
runSafe(
|
|
106
145
|
`git config -f .gitmodules submodule.${SUBMODULE_DIR}.ignore dirty`,
|
|
107
146
|
'dirty ignore 설정',
|
|
@@ -112,7 +151,7 @@ function configureDirtyIgnore() {
|
|
|
112
151
|
|
|
113
152
|
// --- Step 4: install.sh 실행 ---
|
|
114
153
|
function runInstallScript() {
|
|
115
|
-
logStep(4, 'install.sh 실행 (심볼릭 링크 생성)');
|
|
154
|
+
logStep(4, 6, 'install.sh 실행 (심볼릭 링크 생성)');
|
|
116
155
|
const scriptPath = `./${SUBMODULE_DIR}/install.sh`;
|
|
117
156
|
if (!fs.existsSync(scriptPath)) {
|
|
118
157
|
log(' \u26a0', `${scriptPath} 파일을 찾을 수 없습니다. 스킵합니다.`);
|
|
@@ -125,7 +164,7 @@ function runInstallScript() {
|
|
|
125
164
|
|
|
126
165
|
// --- Step 5: .gitignore 패치 ---
|
|
127
166
|
function patchGitignore() {
|
|
128
|
-
logStep(5, '.gitignore 패치');
|
|
167
|
+
logStep(5, 6, '.gitignore 패치');
|
|
129
168
|
|
|
130
169
|
const MARKER_START = '# BMAD symlinks (auto-generated)';
|
|
131
170
|
const MARKER_END = '# End BMAD';
|
|
@@ -159,7 +198,7 @@ function patchGitignore() {
|
|
|
159
198
|
|
|
160
199
|
// --- Step 6: package.json 패치 ---
|
|
161
200
|
function patchPackageJson() {
|
|
162
|
-
logStep(6, 'package.json 패치');
|
|
201
|
+
logStep(6, 6, 'package.json 패치');
|
|
163
202
|
|
|
164
203
|
const pkgPath = 'package.json';
|
|
165
204
|
if (!fs.existsSync(pkgPath)) {
|
|
@@ -221,12 +260,26 @@ function patchPackageJson() {
|
|
|
221
260
|
function main() {
|
|
222
261
|
handleFlags();
|
|
223
262
|
|
|
263
|
+
validateGitRepo();
|
|
264
|
+
|
|
265
|
+
if (isUpdate) {
|
|
266
|
+
console.log('');
|
|
267
|
+
console.log('=== BMAD Submodule Update ===');
|
|
268
|
+
console.log('');
|
|
269
|
+
|
|
270
|
+
const steps = [
|
|
271
|
+
{ key: 'sync', label: 'Submodule 동기화', fn: updateSubmodule },
|
|
272
|
+
{ key: 'pull', label: 'Submodule 최신화', fn: pullLatest },
|
|
273
|
+
{ key: 'reinstall', label: '심링크 갱신', fn: reinstallSymlinks },
|
|
274
|
+
];
|
|
275
|
+
|
|
276
|
+
return runSteps(steps, 'BMAD 업데이트가 완료되었습니다!');
|
|
277
|
+
}
|
|
278
|
+
|
|
224
279
|
console.log('');
|
|
225
280
|
console.log('=== BMAD Submodule Setup ===');
|
|
226
281
|
console.log('');
|
|
227
282
|
|
|
228
|
-
validateGitRepo();
|
|
229
|
-
|
|
230
283
|
const steps = [
|
|
231
284
|
{ key: 'submodule', label: 'Submodule 추가', fn: addSubmodule },
|
|
232
285
|
{ key: 'init', label: 'Submodule 초기화', fn: initSubmodule },
|
|
@@ -236,6 +289,10 @@ function main() {
|
|
|
236
289
|
{ key: 'packageJson', label: 'package.json 패치', fn: patchPackageJson },
|
|
237
290
|
];
|
|
238
291
|
|
|
292
|
+
runSteps(steps, 'BMAD 설치가 완료되었습니다!');
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
function runSteps(steps, doneMessage) {
|
|
239
296
|
const results = {};
|
|
240
297
|
for (const step of steps) {
|
|
241
298
|
try {
|
|
@@ -247,7 +304,7 @@ function main() {
|
|
|
247
304
|
}
|
|
248
305
|
|
|
249
306
|
console.log('');
|
|
250
|
-
console.log('===
|
|
307
|
+
console.log('=== Summary ===');
|
|
251
308
|
console.log('');
|
|
252
309
|
|
|
253
310
|
for (const step of steps) {
|
|
@@ -262,7 +319,7 @@ function main() {
|
|
|
262
319
|
log('\u26a0', '일부 단계가 실패했습니다. 위 로그를 확인하세요.');
|
|
263
320
|
process.exit(1);
|
|
264
321
|
} else {
|
|
265
|
-
log('\ud83d\ude80',
|
|
322
|
+
log('\ud83d\ude80', doneMessage);
|
|
266
323
|
}
|
|
267
324
|
console.log('');
|
|
268
325
|
}
|