bmad-setup 1.4.0 → 1.5.0

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 +3 -2
  2. package/bin/cli.js +73 -16
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -1,6 +1,7 @@
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.4.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
7
  ![Claude Code](https://img.shields.io/badge/Claude%20Code-compatible-purple.svg)
@@ -11,7 +12,7 @@ BMAD-METHOD - 범용 AI 에이전트 프레임워크
11
12
 
12
13
  | 항목 | 버전 |
13
14
  | ------------------ | ----------------- |
14
- | Submodule Version | v1.3.1 |
15
+ | Submodule Version | v1.4.0 |
15
16
  | BMAD Framework | 6.0.0-beta.8 |
16
17
 
17
18
  > [Changelog](./CHANGELOG.md) 에서 변경 이력을 확인하세요.
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.0",
4
4
  "description": "BMAD Framework submodule installer - one command setup",
5
5
  "bin": {
6
6
  "bmad-setup": "bin/cli.js"