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.
- package/README.md +3 -2
- package/bin/cli.js +73 -16
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
# BMAD Framework Submodule
|
|
2
2
|
|
|
3
|
-

|
|
4
|
+

|
|
4
5
|

|
|
5
6
|

|
|
6
7
|

|
|
@@ -11,7 +12,7 @@ BMAD-METHOD - 범용 AI 에이전트 프레임워크
|
|
|
11
12
|
|
|
12
13
|
| 항목 | 버전 |
|
|
13
14
|
| ------------------ | ----------------- |
|
|
14
|
-
| Submodule Version | v1.
|
|
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}
|
|
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
|
}
|