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.
Files changed (3) hide show
  1. package/README.md +125 -335
  2. package/bin/cli.js +73 -16
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -1,90 +1,119 @@
1
1
  # BMAD Framework Submodule
2
2
 
3
- ![Version](https://img.shields.io/badge/version-1.3.1-blue.svg)
3
+ ![Version](https://img.shields.io/badge/version-1.5.0-blue.svg)
4
+ ![npm](https://img.shields.io/npm/v/bmad-setup.svg)
4
5
  ![BMAD](https://img.shields.io/badge/BMAD-6.0.0--beta.8-orange.svg)
5
6
  ![License](https://img.shields.io/badge/license-MIT-green.svg)
6
- ![Claude Code](https://img.shields.io/badge/Claude%20Code-compatible-purple.svg)
7
+ ![Claude Code](https://img.shields.io/badge/Claude%20Code-only-purple.svg)
7
8
 
8
- BMAD-METHOD - 범용 AI 에이전트 프레임워크
9
+ BMAD 프레임워크를 Git Submodule로 관리하여 **팀별, 프로젝트별로 간편하게 커스터마이징**할 수 있는 세팅 도구입니다.
9
10
 
10
- 소프트웨어 개발 전체 라이프사이클을 위한 프롬프트 & 컨텍스트 엔지니어링 프레임워크입니다. 전문화된 에이전트(Analyst, PM, Architect, Dev, Test Architect)와 워크플로우, 지식 베이스를 제공합니다.
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
- > [Changelog](./CHANGELOG.md) 에서 변경 이력을 확인하세요.
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
- ## Git Submodule이란?
24
+ ## BMAD Method란?
22
25
 
23
- Git을 처음 접하시거나 Submodule이 생소하신 분들을 위한 설명입니다.
26
+ **BMAD(Breakthrough Method of Agile AI-Driven Development)** 는 AI 기반 소프트웨어 개발을 위한 오픈소스 프레임워크입니다.
24
27
 
25
- ### 기본 개념
28
+ 아이디어 기획부터 구현까지 전체 개발 과정을 **전문화된 AI 에이전트**와 **가이드 워크플로우**로 지원하며, 프로젝트 복잡도에 맞춘 적응형 접근 방식을 제공합니다.
26
29
 
27
- **Submodule**은 하나의 Git 저장소 안에 다른 Git 저장소를 포함시키는 기능입니다.
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
- - BMAD 업데이트는 원본 저장소에서 번만 하면 됩니다
44
- - 여러 프로젝트에서 동일한 BMAD를 공유할 있습니다
44
+ - **모듈 선택** 필요한 모듈(소프트웨어 개발, 테스트, 데이터 분석 등)만 골라 사용
45
+ - **에이전트 커스텀** 컨벤션, 기술 스택, 도메인 용어를 에이전트에 반영
46
+ - **워크플로우 조정** 팀의 개발 프로세스에 맞게 워크플로우를 추가/수정
47
+ - **메모리 템플릿** — 프로젝트별 컨텍스트(서비스 정보, 퍼널, 지표 등)를 사전 설정
45
48
 
46
- ---
49
+ ### Submodule 방식의 이점
47
50
 
48
- ## Submodule 사용하나요?
51
+ | 구분 | 직접 복사 | Submodule 사용 |
52
+ | --------- | ------------------------- | ------------------------- |
53
+ | PR 크기 | 300개 이상 파일 변경 | 2개 파일만 변경 |
54
+ | 업데이트 | 각 프로젝트마다 수동 복사 | `git pull` 한 번으로 해결 |
55
+ | 버전 관리 | 어떤 버전인지 추적 어려움 | 커밋 SHA로 정확한 버전 추적 |
56
+ | 설치 | 수동 복사 | `npx bmad-setup` 한 줄 |
49
57
 
50
- ### 장점
58
+ 프레임워크 원본이 업데이트되더라도, 커스터마이징한 설정은 프로젝트에 그대로 유지됩니다.
51
59
 
52
- | 구분 | 직접 복사 | Submodule 사용 |
53
- | ----------- | --------------------------- | --------------------------- |
54
- | PR 크기 | 300개 이상 파일 변경 | 2개 파일만 변경 |
55
- | 업데이트 | 각 프로젝트마다 수동 복사 | `git pull` 한 번으로 해결 |
56
- | 버전 관리 | 어떤 버전인지 추적 어려움 | 커밋 SHA로 정확한 버전 추적 |
57
- | 디스크 용량 | 프로젝트마다 전체 파일 중복 | 참조만 저장 |
58
- | 설치 자동화 | 불가능 | `npm install`로 자동 초기화 |
60
+ ---
59
61
 
60
- ### 단점 및 주의사항
62
+ ## 제공 모듈
61
63
 
62
- - 초기 학습 곡선이 있습니다
63
- - `git clone` `--recurse-submodules` 옵션을 잊으면 빈 폴더가 됩니다
64
- - Submodule 내부 변경사항은 별도로 커밋/푸시해야 합니다
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
- - **AI 기반 개발 워크플로우**를 구축하려는
73
- - **Claude Code** 또는 **Cursor** 등 AI 도구를 활용하는 프로젝트
74
- - 여러 프로젝트에서 **일관된 AI 프롬프트/에이전트**를 사용하고 싶을 때
75
- - **소프트웨어 개발 전체 과정**(기획 → 설계 → 개발 → 테스트)에 AI를 적용하려는 경우
92
+ > 이미 설치된 항목은 자동으로 스킵됩니다 (멱등성 보장).
93
+
94
+ ### 업데이트
95
+
96
+ ```bash
97
+ npx bmad-setup --update
98
+ ```
76
99
 
77
- ### 제공하는 모듈
100
+ Submodule을 최신 버전으로 pull하고 심볼릭 링크를 갱신합니다.
78
101
 
79
- | 모듈 | 설명 | 주요 에이전트/워크플로우 |
80
- | ------ | ------------------------- | ------------------------------------------- |
81
- | `core` | 핵심 기능 | bmad-master, brainstorming, party-mode |
82
- | `bmm` | 소프트웨어 개발 | analyst, architect, dev, pm, sm, ux |
83
- | `bmb` | 모듈 빌더 | agent-builder, workflow-builder |
84
- | `gds` | 게임 개발 (구 bmgd) | game-designer, game-dev, game-qa |
85
- | `tea` | 테스트 아키텍처 | test-engineer-architect |
86
- | `cis` | 크리에이티브 & 혁신 전략 | design-thinking, innovation, storytelling |
87
- | `dae` | 데이터 분석 (커스텀) | data-analyst, Amplitude 연동 |
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
- #### 2단계: 심볼릭 링크 생성
164
+ ### 2단계: 심볼릭 링크 생성
165
165
 
166
166
  ```bash
167
167
  ./bmad-submodule/install.sh
168
168
  ```
169
169
 
170
- 스크립트는 다음 심볼릭 링크를 생성합니다:
170
+ 생성되는 링크:
171
171
 
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`
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
- #### 3단계: package.json 설정 (권장)
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
- **postinstall 명령어 분석:**
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
- **주의:** `--recurse-submodules` 없이 clone하면 `bmad-submodule` 폴더가 비어있습니다!
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
- # 4. 루트로 돌아가서 변경사항 커밋
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
- ### "bmad-submodule 폴더가 비어있어요"
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
- ### "git status에서 bmad-submodule (modified content)가 보여요"
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
- ### Submodule 완전 재설치
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. Submodule 완전 제거
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 에서 관련 폴더 제거 (특정 클로드 버전에서 gitignore 에 추가된 파일을 클로드가 인식 못할 수도 있음)
289
+ > .gitignore에서 관련 폴더를 제거했는지도 확인하세요. 특정 Claude 버전에서 .gitignore에 추가된 파일을 인식하지 못할 있습니다.
499
290
 
500
- ---
501
-
502
- ## 자주 묻는 질문
291
+ </details>
503
292
 
504
- ### Q: Submodule 내부에서 직접 수정해도 되나요?
505
-
506
- A: 가능하지만 권장하지 않습니다. 수정사항은 bmad-submodule 저장소에 별도로 커밋/푸시해야 합니다. 팀 프로젝트라면 원본 저장소에 PR을 보내세요.
293
+ ---
507
294
 
508
- ### Q: 특정 버전의 BMAD를 고정하고 싶어요
295
+ ## FAQ
509
296
 
510
- A: Submodule 특정 커밋을 가리키므로 기본적으로 버전이 고정됩니다. `git pull`을 하지 않으면 해당 버전이 유지됩니다.
297
+ **Q: Submodule 내부에서 직접 수정해도 되나요?**
298
+ 가능하지만 권장하지 않습니다. 수정사항은 bmad-submodule 저장소에 별도로 커밋/푸시해야 합니다. 팀 프로젝트라면 원본 저장소에 PR을 보내세요.
511
299
 
512
- ### Q: CI/CD에서는 어떻게 하나요?
300
+ **Q: 특정 버전의 BMAD를 고정하고 싶어요**
301
+ Submodule은 특정 커밋을 가리키므로 기본적으로 버전이 고정됩니다. `git pull`을 하지 않으면 해당 버전이 유지됩니다.
513
302
 
514
- A: postinstall 스크립트에 `[ -z "$CI" ]` 조건이 있어 CI 환경에서는 스킵됩니다. CI에서 BMAD가 필요하다면 이 조건을 제거하세요.
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}/6]`, msg);
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 --help 도움말 표시
48
- npx bmad-setup --version 버전 표시
48
+ npx bmad-setup 전체 설치 실행
49
+ npx bmad-setup --update 서브모듈 최신화 + 심링크 재생성
50
+ npx bmad-setup --help 도움말 표시
51
+ npx bmad-setup --version 버전 표시
49
52
 
50
- Steps:
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('=== Setup Summary ===');
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', 'BMAD 설치가 완료되었습니다!');
322
+ log('\ud83d\ude80', doneMessage);
266
323
  }
267
324
  console.log('');
268
325
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bmad-setup",
3
- "version": "1.4.0",
3
+ "version": "1.5.1",
4
4
  "description": "BMAD Framework submodule installer - one command setup",
5
5
  "bin": {
6
6
  "bmad-setup": "bin/cli.js"