@sleighmaster/bmad 1.4.1 → 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.
@@ -109,54 +109,44 @@
109
109
  </check>
110
110
  </step>
111
111
 
112
- <step n="3" goal="태그 생성 및 Push">
113
- <critical>🏷️ TAG CREATION - Git 태그 생성 원격 저장소 Push</critical>
112
+ <step n="3" goal="릴리즈 워크플로우 트리거">
113
+ <critical>🚀 RELEASE TRIGGER - GitHub Actions 릴리즈 워크플로우 실행</critical>
114
114
 
115
- <output>⚠️ **태그 생성 확인**
115
+ <output>⚠️ **릴리즈 확인**
116
116
 
117
117
  **버전:** {{new_version}}
118
- **대상 커밋:** {{target_commit}}
118
+ **대상 브랜치:** master (최신 커밋)
119
119
  **릴리즈 노트:** (위 내용 참조)
120
120
 
121
- 태그가 생성되면 GitHub Actions가 자동으로 릴리즈를 생성합니다.
121
+ GitHub Actions가 다음을 자동으로 수행합니다:
122
+ 1. CHANGELOG.md 생성 및 커밋
123
+ 2. CHANGELOG 커밋에 태그 생성
124
+ 3. GitHub Release 생성
125
+ 4. npm 패키지 배포
122
126
  </output>
123
127
 
124
- <ask>태그를 생성하시겠습니까? [y/n]</ask>
128
+ <ask>릴리즈 워크플로우를 실행하시겠습니까? [y/n]</ask>
125
129
 
126
130
  <check if="user confirms">
127
- <action>Annotated 태그 생성:
128
- git tag -a {{new_version}} -m "Release {{new_version}}
129
-
130
- {{release_notes}}"
131
+ <action>GitHub Actions 워크플로우 트리거:
132
+ gh workflow run release-on-tag.yml -f version={{new_version}}
131
133
  </action>
132
134
 
133
- <check if="태그 생성 성공">
134
- <output>✅ 태그 생성됨: {{new_version}}</output>
135
- </check>
136
-
137
- <check if="태그 생성 실패">
138
- <output>🚫 태그 생성 실패: {{error_message}}</output>
139
- <action>HALT</action>
140
- </check>
135
+ <check if="트리거 성공">
136
+ <output>✅ 릴리즈 워크플로우가 트리거되었습니다.
141
137
 
142
- <action>태그 Push:
143
- git push origin {{new_version}}
144
- </action>
145
-
146
- <check if="push 성공">
147
- <output>✅ 태그 Push 완료: {{new_version}}
148
-
149
- GitHub Actions가 릴리즈를 자동으로 생성합니다.
150
- 릴리즈 페이지: https://github.com/{{owner}}/{{repo}}/releases/tag/{{new_version}}
138
+ 워크플로우 실행 상태 확인:
139
+ gh run list --workflow=release-on-tag.yml --limit=1
151
140
  </output>
152
141
  </check>
153
142
 
154
- <check if="push 실패">
155
- <output>⚠️ 태그 Push 실패: {{error_message}}
143
+ <check if="트리거 실패">
144
+ <output>🚫 워크플로우 트리거 실패: {{error_message}}
156
145
 
157
- 로컬 태그는 생성되었습니다. 수동으로 push해주세요:
158
- git push origin {{new_version}}
146
+ 수동으로 실행해주세요:
147
+ GitHub Actions → Release → Run workflow → version: {{new_version}}
159
148
  </output>
149
+ <action>HALT</action>
160
150
  </check>
161
151
  </check>
162
152
 
@@ -166,17 +156,16 @@
166
156
  </check>
167
157
  </step>
168
158
 
169
- <step n="4" goal="릴리즈 완료 및 정리">
170
- <output>🎉 **릴리즈 완료!**
159
+ <step n="4" goal="릴리즈 완료 확인">
160
+ <output>🎉 **릴리즈 워크플로우 실행됨!**
171
161
 
172
162
  **버전:** {{new_version}}
173
- **태그:** {{new_version}}
174
163
  **릴리즈 URL:** https://github.com/{{owner}}/{{repo}}/releases/tag/{{new_version}}
175
164
 
176
- **다음 단계:**
177
- 1. GitHub에서 릴리즈 페이지 확인
178
- 2. 필요시 릴리즈 노트 추가 편집
179
- 3. 릴리즈 자산(assets) 업로드 (필요한 경우)
165
+ **확인 사항:**
166
+ 1. GitHub Actions 실행 완료 확인: gh run list --workflow=release-on-tag.yml --limit=1
167
+ 2. 릴리즈 페이지에서 CHANGELOG 및 릴리즈 노트 확인
168
+ 3. npm 패키지 배포 확인 (해당하는 경우)
180
169
  </output>
181
170
  </step>
182
171
 
@@ -32,7 +32,7 @@ if (-not $gitDir) {
32
32
  $hooksDir = Join-Path $gitDir "hooks"
33
33
  $sourceDir = Split-Path -Parent $MyInvocation.MyCommand.Path
34
34
 
35
- $hooks = @("pre-commit", "commit-msg")
35
+ $hooks = @("pre-commit", "commit-msg", "pre-push")
36
36
 
37
37
  if ($Uninstall) {
38
38
  Write-Info "Git Hooks 제거 중..."
@@ -81,5 +81,6 @@ Write-Host ""
81
81
  Write-Info "설치된 Hook:"
82
82
  Write-Host " - pre-commit: master 브랜치 직접 커밋 차단" -ForegroundColor White
83
83
  Write-Host " - commit-msg: Conventional Commits 형식 검증" -ForegroundColor White
84
+ Write-Host " - pre-push: master 브랜치 직접 푸시 차단" -ForegroundColor White
84
85
  Write-Host ""
85
86
  Write-Info "Hook 제거: .\install-hooks.ps1 -Uninstall"
@@ -0,0 +1,53 @@
1
+ #!/bin/bash
2
+ # BMad6GitHub - Pre-push Hook
3
+ # 1. master/main 브랜치로 직접 푸시 방지
4
+ # 2. 태그 푸시 시 CHANGELOG.md 업데이트 여부 검증
5
+
6
+ # 푸시 대상 분석
7
+ while read local_ref local_sha remote_ref remote_sha; do
8
+ # master/main 직접 푸시 차단
9
+ if echo "$remote_ref" | grep -qE "refs/heads/(master|main)$"; then
10
+ echo ""
11
+ echo "=========================================="
12
+ echo " ERROR: master/main 브랜치로 직접 푸시 불가!"
13
+ echo "=========================================="
14
+ echo ""
15
+ echo "BMad6GitHub 워크플로우를 따라주세요:"
16
+ echo ""
17
+ echo " 1. Feature 브랜치에서 작업"
18
+ echo " 2. PR 생성: gh pr create"
19
+ echo " 3. 리뷰 후 머지"
20
+ echo ""
21
+ exit 1
22
+ fi
23
+
24
+ # 태그 푸시 시 CHANGELOG.md 업데이트 검증
25
+ if echo "$remote_ref" | grep -qE "^refs/tags/"; then
26
+ tag_name=$(echo "$remote_ref" | sed 's|refs/tags/||')
27
+
28
+ # 이전 태그 찾기
29
+ prev_tag=$(git tag --sort=-version:refname | grep -v "^${tag_name}$" | head -1)
30
+
31
+ if [ -n "$prev_tag" ]; then
32
+ # 이전 태그 이후 CHANGELOG.md가 변경되었는지 확인
33
+ changelog_changed=$(git diff --name-only "$prev_tag"..HEAD -- CHANGELOG.md 2>/dev/null)
34
+
35
+ if [ -z "$changelog_changed" ]; then
36
+ echo ""
37
+ echo "=========================================="
38
+ echo " ERROR: CHANGELOG.md가 업데이트되지 않았습니다!"
39
+ echo "=========================================="
40
+ echo ""
41
+ echo "태그 '${tag_name}' 푸시 전에 CHANGELOG.md를 업데이트해 주세요."
42
+ echo ""
43
+ echo " 1. /bmad-os-draft-changelog 실행"
44
+ echo " 2. CHANGELOG.md 커밋"
45
+ echo " 3. 태그 재생성 후 푸시"
46
+ echo ""
47
+ exit 1
48
+ fi
49
+ fi
50
+ fi
51
+ done
52
+
53
+ exit 0
package/dist/cli.js CHANGED
@@ -37,6 +37,8 @@ program
37
37
  .option('-f, --force', 'Overwrite existing _bmad folder')
38
38
  .option('--skip-github', 'Skip .github templates installation')
39
39
  .option('--skip-hooks', 'Skip Git hooks installation')
40
+ .option('--skip-repo-setup', 'Skip GitHub repository settings')
41
+ .option('-y, --yes', 'Accept all defaults (non-interactive mode)')
40
42
  .action(async (options) => {
41
43
  await install(options);
42
44
  });
@@ -45,6 +47,10 @@ program
45
47
  .description('Update BMad6GitHub to the latest version')
46
48
  .option('-v, --version <version>', 'Update to specific version')
47
49
  .option('--dry-run', 'Show what would be updated without making changes')
50
+ .option('--skip-github', 'Skip .github templates update')
51
+ .option('--skip-hooks', 'Skip Git hooks update')
52
+ .option('--skip-repo-setup', 'Skip GitHub repository settings')
53
+ .option('-y, --yes', 'Accept all defaults (non-interactive mode)')
48
54
  .action(async (options) => {
49
55
  await update(options);
50
56
  });
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAkB,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,MAAM,EAAiB,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,KAAK,EAAgB,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAErC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC,uBAAuB;AACvB,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;AAC1D,IAAI,OAAO,GAAG,OAAO,CAAC;AACtB,IAAI,CAAC;IACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;IAC3D,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;AACxB,CAAC;AAAC,MAAM,CAAC;IACP,0BAA0B;IAC1B,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;QAC5D,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;QACvD,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,SAAS;IACX,CAAC;AACH,CAAC;AAED,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,MAAM,CAAC;KACZ,WAAW,CAAC,uDAAuD,CAAC;KACpE,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO;KACJ,OAAO,CAAC,SAAS,CAAC;KAClB,WAAW,CAAC,qCAAqC,CAAC;KAClD,MAAM,CAAC,yBAAyB,EAAE,yCAAyC,CAAC;KAC5E,MAAM,CAAC,aAAa,EAAE,iCAAiC,CAAC;KACxD,MAAM,CAAC,eAAe,EAAE,qCAAqC,CAAC;KAC9D,MAAM,CAAC,cAAc,EAAE,6BAA6B,CAAC;KACrD,MAAM,CAAC,KAAK,EAAE,OAAuB,EAAE,EAAE;IACxC,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;AACzB,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,0CAA0C,CAAC;KACvD,MAAM,CAAC,yBAAyB,EAAE,4BAA4B,CAAC;KAC/D,MAAM,CAAC,WAAW,EAAE,mDAAmD,CAAC;KACxE,MAAM,CAAC,KAAK,EAAE,OAAsB,EAAE,EAAE;IACvC,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;AACxB,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,6BAA6B,CAAC;KAC1C,MAAM,CAAC,QAAQ,EAAE,uBAAuB,CAAC;KACzC,MAAM,CAAC,KAAK,EAAE,OAAqB,EAAE,EAAE;IACtC,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC;AACvB,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,EAAE,CAAC"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,8 @@ export interface InstallOptions {
3
3
  force?: boolean;
4
4
  skipGithub?: boolean;
5
5
  skipHooks?: boolean;
6
+ skipRepoSetup?: boolean;
7
+ yes?: boolean;
6
8
  }
7
9
  export declare function install(options: InstallOptions): Promise<void>;
8
10
  //# sourceMappingURL=install.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAsBA,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,wBAAsB,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAiDpE"}
1
+ {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAwBA,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,wBAAsB,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAkLpE"}
@@ -1,10 +1,12 @@
1
1
  import ora from 'ora';
2
2
  import { readFileSync } from 'fs';
3
+ import { execSync } from 'child_process';
3
4
  import { fileURLToPath } from 'url';
4
- import { dirname, join } from 'path';
5
- import { isBmadInstalled } from '../utils/fs-utils.js';
5
+ import { dirname, join, basename } from 'path';
6
+ import { isBmadInstalled, isGitRepository } from '../utils/fs-utils.js';
6
7
  import { logger } from '../utils/logger.js';
7
- import { performInstall } from '../services/installer.js';
8
+ import { performInstall, setupGitHubRepo, createGitHubRepo } from '../services/installer.js';
9
+ import { askYesNo, isGhCliAvailable, hasRemoteRepository, askText, askChoice } from '../utils/prompt-utils.js';
8
10
  const __filename = fileURLToPath(import.meta.url);
9
11
  const __dirname = dirname(__filename);
10
12
  // 패키지 버전 읽기
@@ -22,41 +24,162 @@ export async function install(options) {
22
24
  const projectRoot = process.cwd();
23
25
  const version = `v${getPackageVersion()}`;
24
26
  logger.title('BMad6GitHub Install');
27
+ logger.highlight('Version', version);
28
+ logger.newline();
25
29
  // 기존 설치 확인
26
- if (await isBmadInstalled(projectRoot)) {
27
- if (!options.force) {
28
- logger.error('BMad6GitHub is already installed in this project.');
29
- logger.plain('Use --force to overwrite, or use "npx @sleighmaster/bmad update" to update.');
30
- process.exit(1);
30
+ const alreadyInstalled = await isBmadInstalled(projectRoot);
31
+ if (alreadyInstalled) {
32
+ if (options.force) {
33
+ logger.warning('기존 설치가 발견되었습니다. 백업 덮어씁니다.');
34
+ }
35
+ else {
36
+ const overwrite = await askYesNo('기존 설치가 발견되었습니다. 백업 후 덮어쓰시겠습니까?', false);
37
+ if (!overwrite) {
38
+ logger.plain('설치를 취소합니다. 업데이트하려면 "npx @sleighmaster/bmad update"를 사용하세요.');
39
+ process.exit(0);
40
+ }
41
+ options.force = true;
42
+ }
43
+ }
44
+ // 인터랙티브 설정 수집
45
+ logger.plain('설치 옵션을 선택해주세요:');
46
+ logger.newline();
47
+ // GitHub 템플릿 설치 여부
48
+ let installGithub = !options.skipGithub;
49
+ if (options.skipGithub === undefined && !options.yes) {
50
+ installGithub = await askYesNo('GitHub 템플릿을 설치하시겠습니까? (Actions, Issue/PR 템플릿)', true);
51
+ }
52
+ // Git 저장소 확인 및 초기화
53
+ let isGitRepo = await isGitRepository(projectRoot);
54
+ let gitInitialized = false;
55
+ if (!isGitRepo && !options.yes) {
56
+ const initGit = await askYesNo('Git 저장소가 아닙니다. git init을 실행하시겠습니까?', true);
57
+ if (initGit) {
58
+ try {
59
+ execSync('git init', { cwd: projectRoot, stdio: 'pipe' });
60
+ isGitRepo = true;
61
+ gitInitialized = true;
62
+ logger.success('Git 저장소가 초기화되었습니다.');
63
+ }
64
+ catch {
65
+ logger.warning('git init 실패. Git hooks와 저장소 설정을 건너뜁니다.');
66
+ }
67
+ }
68
+ }
69
+ // Git hooks 설치 여부
70
+ let installHooks = !options.skipHooks;
71
+ if (isGitRepo && options.skipHooks === undefined && !options.yes) {
72
+ installHooks = await askYesNo('Git hooks를 설치하시겠습니까? (커밋/푸시 규칙 적용)', true);
73
+ }
74
+ else if (!isGitRepo) {
75
+ installHooks = false;
76
+ logger.dim('Git 저장소가 아니므로 Git hooks 설치를 건너뜁니다.');
77
+ }
78
+ // GitHub 저장소 설정 여부
79
+ let setupRepo = !options.skipRepoSetup;
80
+ const ghAvailable = await isGhCliAvailable();
81
+ let hasRemote = await hasRemoteRepository();
82
+ let repoCreated = false;
83
+ if (ghAvailable && !hasRemote && isGitRepo && options.skipRepoSetup === undefined && !options.yes) {
84
+ // origin이 없을 때: 저장소 생성 제안
85
+ const createRepo = await askYesNo('원격 저장소(origin)가 없습니다. GitHub 저장소를 생성하시겠습니까?', true);
86
+ if (createRepo) {
87
+ const defaultName = basename(process.cwd());
88
+ const repoName = await askText('저장소 이름', defaultName);
89
+ const description = await askText('저장소 설명 (선택, Enter로 건너뛰기)');
90
+ const visibility = await askChoice('저장소 가시성:', [
91
+ { label: 'Private (비공개)', value: 'private' },
92
+ { label: 'Public (공개)', value: 'public' },
93
+ ], 0);
94
+ logger.newline();
95
+ logger.plain('GitHub 저장소 생성 중...');
96
+ const createResult = await createGitHubRepo({
97
+ name: repoName,
98
+ description: description || undefined,
99
+ visibility: visibility,
100
+ });
101
+ if (createResult.success) {
102
+ logger.success(createResult.message);
103
+ hasRemote = true;
104
+ repoCreated = true;
105
+ setupRepo = true;
106
+ }
107
+ else {
108
+ logger.error(createResult.message);
109
+ setupRepo = false;
110
+ }
31
111
  }
32
- logger.warning('Existing installation found. Will backup and overwrite.');
112
+ else {
113
+ setupRepo = false;
114
+ }
115
+ }
116
+ else if (ghAvailable && hasRemote && options.skipRepoSetup === undefined && !options.yes) {
117
+ setupRepo = await askYesNo('GitHub 저장소 설정을 적용하시겠습니까? (머지 규칙, 브랜치 자동 삭제)', true);
118
+ }
119
+ else if (!ghAvailable || !hasRemote) {
120
+ setupRepo = false;
33
121
  }
34
- const spinner = ora('Preparing installation...').start();
35
- spinner.succeed(`Installing version: ${version}`);
36
122
  logger.newline();
123
+ // 설치 실행
124
+ const spinner = ora('설치 중...').start();
37
125
  const result = await performInstall(projectRoot, version, {
38
126
  force: options.force,
39
- skipGithub: options.skipGithub,
40
- skipHooks: options.skipHooks,
127
+ skipGithub: !installGithub,
128
+ skipHooks: !installHooks,
41
129
  });
42
130
  if (!result.success) {
43
- logger.error(`Installation failed: ${result.error}`);
131
+ spinner.fail('설치 실패');
132
+ logger.error(result.error || 'Unknown error');
44
133
  if (result.backupPath) {
45
- logger.plain(`Backup available at: ${result.backupPath}`);
134
+ logger.plain(`백업 위치: ${result.backupPath}`);
46
135
  }
47
136
  process.exit(1);
48
137
  }
138
+ spinner.succeed('설치 완료');
49
139
  // 완료 메시지
50
140
  logger.newline();
51
- logger.success('BMad6GitHub installed successfully!');
52
- logger.highlight('Version', result.version);
141
+ logger.success('BMad6GitHub 성공적으로 설치되었습니다!');
53
142
  if (result.backupPath) {
54
- logger.dim(`Previous installation backed up to: ${result.backupPath}`);
143
+ logger.dim(`이전 버전 백업: ${result.backupPath}`);
144
+ }
145
+ // GitHub 저장소 설정 적용
146
+ if (setupRepo) {
147
+ logger.newline();
148
+ logger.plain('GitHub 저장소 설정 적용 중...');
149
+ const setupResult = await setupGitHubRepo();
150
+ if (setupResult.success) {
151
+ logger.success(setupResult.message);
152
+ }
153
+ else if (setupResult.skipped) {
154
+ logger.warning(setupResult.message);
155
+ }
156
+ else {
157
+ logger.error(setupResult.message);
158
+ }
159
+ }
160
+ else if (!ghAvailable) {
161
+ logger.newline();
162
+ logger.dim('GitHub CLI(gh)가 설치되지 않았거나 인증되지 않았습니다.');
163
+ logger.dim('저장소 설정을 위해 SM 에이전트에서 [GS] GitHub Setup을 실행해주세요.');
55
164
  }
165
+ else if (!hasRemote) {
166
+ logger.newline();
167
+ logger.dim('원격 저장소가 설정되지 않았습니다.');
168
+ logger.dim('저장소 설정을 위해 원격 저장소 추가 후 SM 에이전트에서 [GS] GitHub Setup을 실행해주세요.');
169
+ }
170
+ // 설치 요약
171
+ logger.newline();
172
+ logger.plain('설치 요약:');
173
+ logger.plain(` - _bmad 폴더: ${logger.formatCheck(true)}`);
174
+ logger.plain(` - Claude commands: ${logger.formatCheck(true)}`);
175
+ logger.plain(` - Git 초기화: ${logger.formatCheck(gitInitialized)}`);
176
+ logger.plain(` - GitHub 템플릿: ${logger.formatCheck(installGithub)}`);
177
+ logger.plain(` - Git hooks: ${logger.formatCheck(installHooks)}`);
178
+ logger.plain(` - 저장소 생성: ${logger.formatCheck(repoCreated)}`);
179
+ logger.plain(` - 저장소 설정: ${logger.formatCheck(setupRepo && ghAvailable && hasRemote)}`);
56
180
  logger.newline();
57
- logger.plain('Next steps:');
58
- logger.plain(' 1. Review config: _bmad/bmm/config.yaml');
59
- logger.plain(' 2. Start SM agent: /bmad-agent-bmm-sm');
60
- logger.plain(' 3. Run GitHub setup: [GS] in SM menu');
181
+ logger.plain('다음 단계:');
182
+ logger.plain(' 1. 설정 확인: _bmad/bmm/config.yaml');
183
+ logger.plain(' 2. SM 에이전트 시작: /bmad-agent-bmm-sm');
61
184
  }
62
185
  //# sourceMappingURL=install.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC7F,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAE/G,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC,YAAY;AACZ,SAAS,iBAAiB;IACxB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;QAC5D,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;QACvD,OAAO,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC;IACjB,CAAC;AACH,CAAC;AAWD,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,OAAuB;IACnD,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAClC,MAAM,OAAO,GAAG,IAAI,iBAAiB,EAAE,EAAE,CAAC;IAE1C,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;IACpC,MAAM,CAAC,SAAS,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACrC,MAAM,CAAC,OAAO,EAAE,CAAC;IAEjB,WAAW;IACX,MAAM,gBAAgB,GAAG,MAAM,eAAe,CAAC,WAAW,CAAC,CAAC;IAC5D,IAAI,gBAAgB,EAAE,CAAC;QACrB,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAClB,MAAM,CAAC,OAAO,CAAC,6BAA6B,CAAC,CAAC;QAChD,CAAC;aAAM,CAAC;YACN,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,gCAAgC,EAAE,KAAK,CAAC,CAAC;YAC1E,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,MAAM,CAAC,KAAK,CAAC,4DAA4D,CAAC,CAAC;gBAC3E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;QACvB,CAAC;IACH,CAAC;IAED,cAAc;IACd,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;IAC/B,MAAM,CAAC,OAAO,EAAE,CAAC;IAEjB,mBAAmB;IACnB,IAAI,aAAa,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC;IACxC,IAAI,OAAO,CAAC,UAAU,KAAK,SAAS,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;QACrD,aAAa,GAAG,MAAM,QAAQ,CAAC,+CAA+C,EAAE,IAAI,CAAC,CAAC;IACxF,CAAC;IAED,mBAAmB;IACnB,IAAI,SAAS,GAAG,MAAM,eAAe,CAAC,WAAW,CAAC,CAAC;IACnD,IAAI,cAAc,GAAG,KAAK,CAAC;IAC3B,IAAI,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,oCAAoC,EAAE,IAAI,CAAC,CAAC;QAC3E,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC;gBACH,QAAQ,CAAC,UAAU,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;gBAC1D,SAAS,GAAG,IAAI,CAAC;gBACjB,cAAc,GAAG,IAAI,CAAC;gBACtB,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;YACvC,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,CAAC,OAAO,CAAC,wCAAwC,CAAC,CAAC;YAC3D,CAAC;QACH,CAAC;IACH,CAAC;IAED,kBAAkB;IAClB,IAAI,YAAY,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC;IACtC,IAAI,SAAS,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;QACjE,YAAY,GAAG,MAAM,QAAQ,CAAC,oCAAoC,EAAE,IAAI,CAAC,CAAC;IAC5E,CAAC;SAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QACtB,YAAY,GAAG,KAAK,CAAC;QACrB,MAAM,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;IACnD,CAAC;IAED,mBAAmB;IACnB,IAAI,SAAS,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC;IACvC,MAAM,WAAW,GAAG,MAAM,gBAAgB,EAAE,CAAC;IAC7C,IAAI,SAAS,GAAG,MAAM,mBAAmB,EAAE,CAAC;IAC5C,IAAI,WAAW,GAAG,KAAK,CAAC;IAExB,IAAI,WAAW,IAAI,CAAC,SAAS,IAAI,SAAS,IAAI,OAAO,CAAC,aAAa,KAAK,SAAS,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;QAClG,0BAA0B;QAC1B,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,6CAA6C,EAAE,IAAI,CAAC,CAAC;QAEvF,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;YAC5C,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;YACtD,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,0BAA0B,CAAC,CAAC;YAC9D,MAAM,UAAU,GAAG,MAAM,SAAS,CAChC,UAAU,EACV;gBACE,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,SAAS,EAAE;gBAC5C,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,QAAQ,EAAE;aAC1C,EACD,CAAC,CACF,CAAC;YAEF,MAAM,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;YAEnC,MAAM,YAAY,GAAG,MAAM,gBAAgB,CAAC;gBAC1C,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,WAAW,IAAI,SAAS;gBACrC,UAAU,EAAE,UAAkC;aAC/C,CAAC,CAAC;YAEH,IAAI,YAAY,CAAC,OAAO,EAAE,CAAC;gBACzB,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;gBACrC,SAAS,GAAG,IAAI,CAAC;gBACjB,WAAW,GAAG,IAAI,CAAC;gBACnB,SAAS,GAAG,IAAI,CAAC;YACnB,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;gBACnC,SAAS,GAAG,KAAK,CAAC;YACpB,CAAC;QACH,CAAC;aAAM,CAAC;YACN,SAAS,GAAG,KAAK,CAAC;QACpB,CAAC;IACH,CAAC;SAAM,IAAI,WAAW,IAAI,SAAS,IAAI,OAAO,CAAC,aAAa,KAAK,SAAS,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;QAC3F,SAAS,GAAG,MAAM,QAAQ,CAAC,6CAA6C,EAAE,IAAI,CAAC,CAAC;IAClF,CAAC;SAAM,IAAI,CAAC,WAAW,IAAI,CAAC,SAAS,EAAE,CAAC;QACtC,SAAS,GAAG,KAAK,CAAC;IACpB,CAAC;IAED,MAAM,CAAC,OAAO,EAAE,CAAC;IAEjB,QAAQ;IACR,MAAM,OAAO,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,CAAC;IAEvC,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,WAAW,EAAE,OAAO,EAAE;QACxD,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,UAAU,EAAE,CAAC,aAAa;QAC1B,SAAS,EAAE,CAAC,YAAY;KACzB,CAAC,CAAC;IAEH,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACtB,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI,eAAe,CAAC,CAAC;QAC9C,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;YACtB,MAAM,CAAC,KAAK,CAAC,UAAU,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;QAC9C,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAEzB,SAAS;IACT,MAAM,CAAC,OAAO,EAAE,CAAC;IACjB,MAAM,CAAC,OAAO,CAAC,6BAA6B,CAAC,CAAC;IAE9C,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACtB,MAAM,CAAC,GAAG,CAAC,aAAa,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,mBAAmB;IACnB,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,CAAC,OAAO,EAAE,CAAC;QACjB,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAEtC,MAAM,WAAW,GAAG,MAAM,eAAe,EAAE,CAAC;QAE5C,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;YACxB,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QACtC,CAAC;aAAM,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;YAC/B,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QACtC,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;SAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACxB,MAAM,CAAC,OAAO,EAAE,CAAC;QACjB,MAAM,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;QACpD,MAAM,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;IAChE,CAAC;SAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QACtB,MAAM,CAAC,OAAO,EAAE,CAAC;QACjB,MAAM,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;QAClC,MAAM,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAC;IAC5E,CAAC;IAED,QAAQ;IACR,MAAM,CAAC,OAAO,EAAE,CAAC;IACjB,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACvB,MAAM,CAAC,KAAK,CAAC,iBAAiB,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1D,MAAM,CAAC,KAAK,CAAC,wBAAwB,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjE,MAAM,CAAC,KAAK,CAAC,gBAAgB,MAAM,CAAC,WAAW,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;IACnE,MAAM,CAAC,KAAK,CAAC,mBAAmB,MAAM,CAAC,WAAW,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;IACrE,MAAM,CAAC,KAAK,CAAC,kBAAkB,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;IACnE,MAAM,CAAC,KAAK,CAAC,eAAe,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;IAC/D,MAAM,CAAC,KAAK,CAAC,eAAe,MAAM,CAAC,WAAW,CAAC,SAAS,IAAI,WAAW,IAAI,SAAS,CAAC,EAAE,CAAC,CAAC;IAEzF,MAAM,CAAC,OAAO,EAAE,CAAC;IACjB,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACvB,MAAM,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;IAClD,MAAM,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;AACtD,CAAC"}
@@ -1,6 +1,10 @@
1
1
  export interface UpdateOptions {
2
2
  version?: string;
3
3
  dryRun?: boolean;
4
+ skipGithub?: boolean;
5
+ skipHooks?: boolean;
6
+ skipRepoSetup?: boolean;
7
+ yes?: boolean;
4
8
  }
5
9
  export declare function update(options: UpdateOptions): Promise<void>;
6
10
  //# sourceMappingURL=update.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAqBA,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,wBAAsB,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA4DlE"}
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAwBA,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,wBAAsB,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA2PlE"}
@@ -1,9 +1,12 @@
1
1
  import { readFileSync } from 'fs';
2
+ import { execSync } from 'child_process';
2
3
  import { fileURLToPath } from 'url';
3
- import { dirname, join } from 'path';
4
- import { isBmadInstalled, getCurrentVersion } from '../utils/fs-utils.js';
4
+ import { dirname, join, basename } from 'path';
5
+ import ora from 'ora';
6
+ import { isBmadInstalled, getCurrentVersion, isGitRepository } from '../utils/fs-utils.js';
5
7
  import { logger } from '../utils/logger.js';
6
- import { performInstall } from '../services/installer.js';
8
+ import { performInstall, setupGitHubRepo, createGitHubRepo } from '../services/installer.js';
9
+ import { askYesNo, isGhCliAvailable, hasRemoteRepository, askText, askChoice } from '../utils/prompt-utils.js';
7
10
  const __filename = fileURLToPath(import.meta.url);
8
11
  const __dirname = dirname(__filename);
9
12
  // 패키지 버전 읽기
@@ -23,49 +26,219 @@ export async function update(options) {
23
26
  logger.title('BMad6GitHub Update');
24
27
  // 설치 확인
25
28
  if (!(await isBmadInstalled(projectRoot))) {
26
- logger.error('BMad6GitHub is not installed in this project.');
27
- logger.plain('Run "npx @sleighmaster/bmad install" first.');
29
+ logger.error('BMad6GitHub 설치되지 않았습니다.');
30
+ logger.plain('"npx @sleighmaster/bmad install" 명령어로 먼저 설치해주세요.');
28
31
  process.exit(1);
29
32
  }
30
33
  // 현재 버전 확인
31
34
  const currentVersion = await getCurrentVersion(projectRoot);
32
- logger.highlight('Current version', currentVersion || 'unknown');
33
- logger.highlight('Package version', packageVersion);
35
+ logger.highlight('현재 버전', currentVersion || 'unknown');
36
+ logger.highlight('최신 버전', packageVersion);
34
37
  // 버전 비교
35
38
  if (currentVersion === packageVersion) {
36
39
  logger.newline();
37
- logger.success('You are already on the latest version!');
38
- logger.newline();
39
- logger.dim('To check for newer versions, run:');
40
- logger.plain(' npm info @sleighmaster/bmad version');
40
+ logger.success('이미 최신 버전입니다!');
41
+ // 최신 버전이어도 설정 재적용 옵션 제공
42
+ const ghAvailable = await isGhCliAvailable();
43
+ let hasRemote = await hasRemoteRepository();
44
+ let isGitRepo = await isGitRepository(projectRoot);
45
+ if (!isGitRepo && !options.yes) {
46
+ logger.newline();
47
+ const initGit = await askYesNo('Git 저장소가 아닙니다. git init을 실행하시겠습니까?', false);
48
+ if (initGit) {
49
+ try {
50
+ execSync('git init', { cwd: projectRoot, stdio: 'pipe' });
51
+ isGitRepo = true;
52
+ logger.success('Git 저장소가 초기화되었습니다.');
53
+ }
54
+ catch {
55
+ logger.warning('git init 실패.');
56
+ }
57
+ }
58
+ }
59
+ if (ghAvailable && !hasRemote && isGitRepo && !options.yes) {
60
+ logger.newline();
61
+ const createRepo = await askYesNo('원격 저장소(origin)가 없습니다. GitHub 저장소를 생성하시겠습니까?', false);
62
+ if (createRepo) {
63
+ const defaultName = basename(process.cwd());
64
+ const repoName = await askText('저장소 이름', defaultName);
65
+ const description = await askText('저장소 설명 (선택, Enter로 건너뛰기)');
66
+ const visibility = await askChoice('저장소 가시성:', [
67
+ { label: 'Private (비공개)', value: 'private' },
68
+ { label: 'Public (공개)', value: 'public' },
69
+ ], 0);
70
+ logger.newline();
71
+ logger.plain('GitHub 저장소 생성 중...');
72
+ const createResult = await createGitHubRepo({
73
+ name: repoName,
74
+ description: description || undefined,
75
+ visibility: visibility,
76
+ });
77
+ if (createResult.success) {
78
+ logger.success(createResult.message);
79
+ hasRemote = true;
80
+ // 생성 후 바로 설정 적용
81
+ logger.newline();
82
+ logger.plain('GitHub 저장소 설정 적용 중...');
83
+ const setupResult = await setupGitHubRepo();
84
+ if (setupResult.success) {
85
+ logger.success(setupResult.message);
86
+ }
87
+ else {
88
+ logger.warning(setupResult.message);
89
+ }
90
+ }
91
+ else {
92
+ logger.error(createResult.message);
93
+ }
94
+ }
95
+ }
96
+ else if (ghAvailable && hasRemote && !options.yes) {
97
+ logger.newline();
98
+ const reapplySettings = await askYesNo('GitHub 저장소 설정을 다시 적용하시겠습니까?', false);
99
+ if (reapplySettings) {
100
+ const setupResult = await setupGitHubRepo();
101
+ if (setupResult.success) {
102
+ logger.success(setupResult.message);
103
+ }
104
+ else {
105
+ logger.warning(setupResult.message);
106
+ }
107
+ }
108
+ }
41
109
  return;
42
110
  }
43
111
  if (options.dryRun) {
44
112
  logger.newline();
45
- logger.plain('Dry run mode - would update:');
113
+ logger.plain('Dry run 모드 - 실제 업데이트하지 않음:');
46
114
  logger.highlight('From', currentVersion || 'unknown');
47
115
  logger.highlight('To', packageVersion);
48
116
  return;
49
117
  }
50
118
  logger.newline();
51
- // 업데이트 실행 (force 모드로 설치)
119
+ // 인터랙티브 설정 수집
120
+ logger.plain('업데이트 옵션을 선택해주세요:');
121
+ logger.newline();
122
+ // GitHub 템플릿 업데이트 여부
123
+ let updateGithub = !options.skipGithub;
124
+ if (options.skipGithub === undefined && !options.yes) {
125
+ updateGithub = await askYesNo('GitHub 템플릿을 업데이트하시겠습니까?', true);
126
+ }
127
+ // Git 저장소 확인 및 초기화
128
+ let isGitRepo = await isGitRepository(projectRoot);
129
+ let gitInitialized = false;
130
+ if (!isGitRepo && !options.yes) {
131
+ const initGit = await askYesNo('Git 저장소가 아닙니다. git init을 실행하시겠습니까?', true);
132
+ if (initGit) {
133
+ try {
134
+ execSync('git init', { cwd: projectRoot, stdio: 'pipe' });
135
+ isGitRepo = true;
136
+ gitInitialized = true;
137
+ logger.success('Git 저장소가 초기화되었습니다.');
138
+ }
139
+ catch {
140
+ logger.warning('git init 실패. Git hooks와 저장소 설정을 건너뜁니다.');
141
+ }
142
+ }
143
+ }
144
+ // Git hooks 업데이트 여부
145
+ let updateHooks = !options.skipHooks;
146
+ if (isGitRepo && options.skipHooks === undefined && !options.yes) {
147
+ updateHooks = await askYesNo('Git hooks를 업데이트하시겠습니까?', true);
148
+ }
149
+ else if (!isGitRepo) {
150
+ updateHooks = false;
151
+ }
152
+ // GitHub 저장소 설정 여부
153
+ let setupRepo = !options.skipRepoSetup;
154
+ const ghAvailable = await isGhCliAvailable();
155
+ let hasRemote = await hasRemoteRepository();
156
+ let repoCreated = false;
157
+ if (ghAvailable && !hasRemote && isGitRepo && options.skipRepoSetup === undefined && !options.yes) {
158
+ const createRepo = await askYesNo('원격 저장소(origin)가 없습니다. GitHub 저장소를 생성하시겠습니까?', false);
159
+ if (createRepo) {
160
+ const defaultName = basename(process.cwd());
161
+ const repoName = await askText('저장소 이름', defaultName);
162
+ const description = await askText('저장소 설명 (선택, Enter로 건너뛰기)');
163
+ const visibility = await askChoice('저장소 가시성:', [
164
+ { label: 'Private (비공개)', value: 'private' },
165
+ { label: 'Public (공개)', value: 'public' },
166
+ ], 0);
167
+ logger.newline();
168
+ logger.plain('GitHub 저장소 생성 중...');
169
+ const createResult = await createGitHubRepo({
170
+ name: repoName,
171
+ description: description || undefined,
172
+ visibility: visibility,
173
+ });
174
+ if (createResult.success) {
175
+ logger.success(createResult.message);
176
+ hasRemote = true;
177
+ repoCreated = true;
178
+ setupRepo = true;
179
+ }
180
+ else {
181
+ logger.error(createResult.message);
182
+ setupRepo = false;
183
+ }
184
+ }
185
+ else {
186
+ setupRepo = false;
187
+ }
188
+ }
189
+ else if (ghAvailable && hasRemote && options.skipRepoSetup === undefined && !options.yes) {
190
+ setupRepo = await askYesNo('GitHub 저장소 설정을 확인/업데이트하시겠습니까?', false);
191
+ }
192
+ else if (!ghAvailable || !hasRemote) {
193
+ setupRepo = false;
194
+ }
195
+ logger.newline();
196
+ // 업데이트 실행
197
+ const spinner = ora('업데이트 중...').start();
52
198
  const result = await performInstall(projectRoot, packageVersion, {
53
199
  force: true,
54
- skipGithub: false,
55
- skipHooks: false,
200
+ skipGithub: !updateGithub,
201
+ skipHooks: !updateHooks,
56
202
  });
57
203
  if (!result.success) {
58
- logger.error(`Update failed: ${result.error}`);
204
+ spinner.fail('업데이트 실패');
205
+ logger.error(result.error || 'Unknown error');
59
206
  if (result.backupPath) {
60
- logger.plain(`Backup available at: ${result.backupPath}`);
207
+ logger.plain(`백업 위치: ${result.backupPath}`);
61
208
  }
62
209
  process.exit(1);
63
210
  }
211
+ spinner.succeed('업데이트 완료');
64
212
  logger.newline();
65
- logger.success('BMad6GitHub updated successfully!');
66
- logger.highlight('Version', result.version);
213
+ logger.success('BMad6GitHub 성공적으로 업데이트되었습니다!');
214
+ logger.highlight('버전', result.version);
67
215
  if (result.backupPath) {
68
- logger.dim(`Previous version backed up to: ${result.backupPath}`);
216
+ logger.dim(`이전 버전 백업: ${result.backupPath}`);
69
217
  }
218
+ // GitHub 저장소 설정 적용
219
+ if (setupRepo) {
220
+ logger.newline();
221
+ logger.plain('GitHub 저장소 설정 적용 중...');
222
+ const setupResult = await setupGitHubRepo();
223
+ if (setupResult.success) {
224
+ logger.success(setupResult.message);
225
+ }
226
+ else if (setupResult.skipped) {
227
+ logger.warning(setupResult.message);
228
+ }
229
+ else {
230
+ logger.error(setupResult.message);
231
+ }
232
+ }
233
+ // 업데이트 요약
234
+ logger.newline();
235
+ logger.plain('업데이트 요약:');
236
+ logger.plain(` - _bmad 폴더: ${logger.formatCheck(true)}`);
237
+ logger.plain(` - Claude commands: ${logger.formatCheck(true)}`);
238
+ logger.plain(` - Git 초기화: ${logger.formatCheck(gitInitialized)}`);
239
+ logger.plain(` - GitHub 템플릿: ${logger.formatCheck(updateGithub)}`);
240
+ logger.plain(` - Git hooks: ${logger.formatCheck(updateHooks)}`);
241
+ logger.plain(` - 저장소 생성: ${logger.formatCheck(repoCreated)}`);
242
+ logger.plain(` - 저장소 설정: ${logger.formatCheck(setupRepo && ghAvailable && hasRemote)}`);
70
243
  }
71
244
  //# sourceMappingURL=update.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"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"}
@@ -12,4 +12,27 @@ export declare function performInstall(projectRoot: string, version: string, opt
12
12
  skipGithub?: boolean;
13
13
  skipHooks?: boolean;
14
14
  }): Promise<InstallResult>;
15
+ export interface GitHubSetupResult {
16
+ success: boolean;
17
+ message: string;
18
+ skipped?: boolean;
19
+ }
20
+ export interface CreateRepoOptions {
21
+ name: string;
22
+ description?: string;
23
+ visibility: 'public' | 'private';
24
+ }
25
+ export interface CreateRepoResult {
26
+ success: boolean;
27
+ message: string;
28
+ repoUrl?: string;
29
+ }
30
+ /**
31
+ * GitHub 저장소 생성 (gh repo create 사용)
32
+ */
33
+ export declare function createGitHubRepo(options: CreateRepoOptions): Promise<CreateRepoResult>;
34
+ /**
35
+ * GitHub 저장소 설정 (머지 규칙, 브랜치 자동 삭제 등)
36
+ */
37
+ export declare function setupGitHubRepo(): Promise<GitHubSetupResult>;
15
38
  //# sourceMappingURL=installer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"installer.d.ts","sourceRoot":"","sources":["../../src/services/installer.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;IACP,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;CAChB,GACL,OAAO,CAAC,aAAa,CAAC,CAqFxB"}
1
+ {"version":3,"file":"installer.d.ts","sourceRoot":"","sources":["../../src/services/installer.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;IACP,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;CAChB,GACL,OAAO,CAAC,aAAa,CAAC,CAqFxB;AA8GD,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,QAAQ,GAAG,SAAS,CAAC;CAClC;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAiD5F;AAED;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,iBAAiB,CAAC,CA0DlE"}
@@ -96,7 +96,7 @@ export async function performInstall(projectRoot, version, options = {}) {
96
96
  }
97
97
  }
98
98
  /**
99
- * Git hooks 설치
99
+ * Git hooks 설치 (동적으로 _bmad/hooks/ 폴더의 모든 hook 설치)
100
100
  */
101
101
  async function installGitHooks(projectRoot, dataDir) {
102
102
  const gitDir = path.join(projectRoot, '.git');
@@ -106,35 +106,50 @@ async function installGitHooks(projectRoot, dataDir) {
106
106
  }
107
107
  const hooksDir = path.join(gitDir, 'hooks');
108
108
  await fs.ensureDir(hooksDir);
109
- // pre-commit hook
110
- const srcPreCommit = path.join(dataDir, '_bmad', 'bmm', 'data', 'git-hooks', 'pre-commit');
111
- if (await fs.pathExists(srcPreCommit)) {
112
- const destPreCommit = path.join(hooksDir, 'pre-commit');
113
- await fs.copy(srcPreCommit, destPreCommit);
114
- // 실행 권한 부여 (Unix)
115
- if (process.platform !== 'win32') {
116
- try {
117
- execSync(`chmod +x "${destPreCommit}"`);
118
- }
119
- catch {
120
- // 권한 설정 실패 무시
109
+ // _bmad/hooks/ 폴더에서 모든 hook 파일을 동적으로 설치
110
+ const hooksSourceDir = path.join(dataDir, '_bmad', 'hooks');
111
+ if (!(await fs.pathExists(hooksSourceDir))) {
112
+ logger.warning('No hooks source directory found.');
113
+ return;
114
+ }
115
+ const hookFiles = await fs.readdir(hooksSourceDir);
116
+ let installedCount = 0;
117
+ for (const hookFile of hookFiles) {
118
+ // 스크립트 파일(.ps1, .sh) 및 sample 파일 제외
119
+ if (hookFile.endsWith('.ps1') || hookFile.endsWith('.sh') || hookFile.endsWith('.sample')) {
120
+ continue;
121
+ }
122
+ const srcHook = path.join(hooksSourceDir, hookFile);
123
+ // 파일인지 확인 (디렉토리 제외)
124
+ const stat = await fs.stat(srcHook);
125
+ if (!stat.isFile()) {
126
+ continue;
127
+ }
128
+ const destHook = path.join(hooksDir, hookFile);
129
+ // 기존 hook 백업 (BMAD hook이 아닌 경우)
130
+ if (await fs.pathExists(destHook)) {
131
+ const content = await fs.readFile(destHook, 'utf-8');
132
+ if (!content.includes('BMad6GitHub')) {
133
+ const backup = `${destHook}.backup`;
134
+ await fs.copy(destHook, backup);
135
+ logger.dim(` Backed up existing ${hookFile} to ${hookFile}.backup`);
121
136
  }
122
137
  }
123
- }
124
- // commit-msg hook
125
- const srcCommitMsg = path.join(dataDir, '_bmad', 'bmm', 'data', 'git-hooks', 'commit-msg');
126
- if (await fs.pathExists(srcCommitMsg)) {
127
- const destCommitMsg = path.join(hooksDir, 'commit-msg');
128
- await fs.copy(srcCommitMsg, destCommitMsg);
138
+ await fs.copy(srcHook, destHook);
139
+ installedCount++;
140
+ // Unix 실행 권한 부여
129
141
  if (process.platform !== 'win32') {
130
142
  try {
131
- execSync(`chmod +x "${destCommitMsg}"`);
143
+ execSync(`chmod +x "${destHook}"`);
132
144
  }
133
145
  catch {
134
146
  // 권한 설정 실패 무시
135
147
  }
136
148
  }
137
149
  }
150
+ if (installedCount > 0) {
151
+ logger.dim(` Installed ${installedCount} Git hook(s)`);
152
+ }
138
153
  }
139
154
  /**
140
155
  * .gitignore 업데이트
@@ -169,4 +184,109 @@ async function updateGitignore(projectRoot) {
169
184
  content += missingEntries.join('\n') + '\n';
170
185
  await fs.writeFile(gitignorePath, content, 'utf-8');
171
186
  }
187
+ /**
188
+ * GitHub 저장소 생성 (gh repo create 사용)
189
+ */
190
+ export async function createGitHubRepo(options) {
191
+ try {
192
+ // gh CLI 인증 확인
193
+ try {
194
+ execSync('gh auth status', { stdio: 'ignore' });
195
+ }
196
+ catch {
197
+ return {
198
+ success: false,
199
+ message: 'GitHub CLI(gh)가 인증되지 않았습니다. `gh auth login`을 실행해주세요.',
200
+ };
201
+ }
202
+ // gh repo create 명령어 구성
203
+ const args = [
204
+ 'gh', 'repo', 'create', options.name,
205
+ `--${options.visibility}`,
206
+ '--source=.',
207
+ '--remote=origin',
208
+ ];
209
+ if (options.description) {
210
+ args.push('--description', JSON.stringify(options.description));
211
+ }
212
+ const command = args.join(' ');
213
+ const output = execSync(command, { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] });
214
+ const repoUrl = output.trim();
215
+ return {
216
+ success: true,
217
+ message: `GitHub 저장소가 생성되었습니다: ${repoUrl || options.name}`,
218
+ repoUrl: repoUrl || undefined,
219
+ };
220
+ }
221
+ catch (error) {
222
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error';
223
+ if (errorMessage.includes('already exists')) {
224
+ return {
225
+ success: false,
226
+ message: `저장소 '${options.name}'이(가) 이미 존재합니다. 다른 이름을 사용해주세요.`,
227
+ };
228
+ }
229
+ return {
230
+ success: false,
231
+ message: `저장소 생성 실패: ${errorMessage}`,
232
+ };
233
+ }
234
+ }
235
+ /**
236
+ * GitHub 저장소 설정 (머지 규칙, 브랜치 자동 삭제 등)
237
+ */
238
+ export async function setupGitHubRepo() {
239
+ try {
240
+ // gh CLI 인증 확인
241
+ try {
242
+ execSync('gh auth status', { stdio: 'ignore' });
243
+ }
244
+ catch {
245
+ return {
246
+ success: false,
247
+ message: 'GitHub CLI(gh)가 인증되지 않았습니다. `gh auth login`을 실행해주세요.',
248
+ skipped: true,
249
+ };
250
+ }
251
+ // 원격 저장소 확인
252
+ try {
253
+ const remote = execSync('git remote -v', { encoding: 'utf-8' });
254
+ if (!remote.includes('origin')) {
255
+ return {
256
+ success: false,
257
+ message: '원격 저장소(origin)가 설정되지 않았습니다.',
258
+ skipped: true,
259
+ };
260
+ }
261
+ }
262
+ catch {
263
+ return {
264
+ success: false,
265
+ message: 'Git 저장소가 아니거나 원격 저장소가 없습니다.',
266
+ skipped: true,
267
+ };
268
+ }
269
+ // GitHub 저장소 설정 적용
270
+ execSync('gh repo edit --enable-merge-commit --enable-squash-merge=false --enable-rebase-merge=false --delete-branch-on-merge', { stdio: 'inherit' });
271
+ return {
272
+ success: true,
273
+ message: '저장소 설정 완료: Merge Commit만 허용, 브랜치 자동 삭제 활성화',
274
+ };
275
+ }
276
+ catch (error) {
277
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error';
278
+ // GitHub Free + Private 저장소 제한 체크
279
+ if (errorMessage.includes('403') || errorMessage.includes('Upgrade')) {
280
+ return {
281
+ success: false,
282
+ message: 'GitHub Free 플랜의 Private 저장소에서는 일부 설정이 제한됩니다. GitHub 웹에서 수동으로 설정해주세요.',
283
+ skipped: true,
284
+ };
285
+ }
286
+ return {
287
+ success: false,
288
+ message: `저장소 설정 실패: ${errorMessage}`,
289
+ };
290
+ }
291
+ }
172
292
  //# sourceMappingURL=installer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"installer.js","sourceRoot":"","sources":["../../src/services/installer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"installer.js","sourceRoot":"","sources":["../../src/services/installer.ts"],"names":[],"mappings":"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"}
@@ -6,6 +6,10 @@ export declare function isProjectRoot(dir: string): Promise<boolean>;
6
6
  * _bmad 폴더가 설치되어 있는지 확인
7
7
  */
8
8
  export declare function isBmadInstalled(dir: string): Promise<boolean>;
9
+ /**
10
+ * Git 저장소인지 확인
11
+ */
12
+ export declare function isGitRepository(dir: string): Promise<boolean>;
9
13
  /**
10
14
  * 현재 설치된 버전 읽기
11
15
  */
@@ -1 +1 @@
1
- {"version":3,"file":"fs-utils.d.ts","sourceRoot":"","sources":["../../src/utils/fs-utils.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAIjE;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAEnE;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAQ3E;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,MAAM,GAAE,MAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAK7E;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAKhF;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAA;CAAO,GACpC,OAAO,CAAC,IAAI,CAAC,CAKf;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAEnE;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAMrE;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAE9E;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAMvE;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEhF"}
1
+ {"version":3,"file":"fs-utils.d.ts","sourceRoot":"","sources":["../../src/utils/fs-utils.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAIjE;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAEnE;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAEnE;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAQ3E;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,MAAM,GAAE,MAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAK7E;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAKhF;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAA;CAAO,GACpC,OAAO,CAAC,IAAI,CAAC,CAKf;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAEnE;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAMrE;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAE9E;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAMvE;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEhF"}
@@ -15,6 +15,12 @@ export async function isProjectRoot(dir) {
15
15
  export async function isBmadInstalled(dir) {
16
16
  return fs.pathExists(path.join(dir, '_bmad'));
17
17
  }
18
+ /**
19
+ * Git 저장소인지 확인
20
+ */
21
+ export async function isGitRepository(dir) {
22
+ return fs.pathExists(path.join(dir, '.git'));
23
+ }
18
24
  /**
19
25
  * 현재 설치된 버전 읽기
20
26
  */
@@ -1 +1 @@
1
- {"version":3,"file":"fs-utils.js","sourceRoot":"","sources":["../../src/utils/fs-utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fs-utils.js","sourceRoot":"","sources":["../../src/utils/fs-utils.ts"],"names":[],"mappings":"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"}
@@ -9,5 +9,6 @@ export declare const logger: {
9
9
  plain: (message: string) => void;
10
10
  dim: (message: string) => void;
11
11
  highlight: (label: string, value: string) => void;
12
+ formatCheck: (value: boolean) => string;
12
13
  };
13
14
  //# sourceMappingURL=logger.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,MAAM;oBACD,MAAM;uBAIH,MAAM;uBAIN,MAAM;qBAIR,MAAM;iBAIV,MAAM,SAAS,MAAM,WAAW,MAAM;qBAIlC,MAAM;;qBAYN,MAAM;mBAIR,MAAM;uBAIF,MAAM,SAAS,MAAM;CAGzC,CAAC"}
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,MAAM;oBACD,MAAM;uBAIH,MAAM;uBAIN,MAAM;qBAIR,MAAM;iBAIV,MAAM,SAAS,MAAM,WAAW,MAAM;qBAIlC,MAAM;;qBAYN,MAAM;mBAIR,MAAM;uBAIF,MAAM,SAAS,MAAM;yBAInB,OAAO,KAAG,MAAM;CAGtC,CAAC"}
@@ -34,5 +34,8 @@ export const logger = {
34
34
  highlight: (label, value) => {
35
35
  console.log(chalk.gray(label + ':'), chalk.cyan(value));
36
36
  },
37
+ formatCheck: (value) => {
38
+ return value ? chalk.green('✔') : chalk.dim('✗');
39
+ },
37
40
  };
38
41
  //# sourceMappingURL=logger.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,IAAI,EAAE,CAAC,OAAe,EAAE,EAAE;QACxB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC;IAED,OAAO,EAAE,CAAC,OAAe,EAAE,EAAE;QAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IACzC,CAAC;IAED,OAAO,EAAE,CAAC,OAAe,EAAE,EAAE;QAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IAC1C,CAAC;IAED,KAAK,EAAE,CAAC,OAAe,EAAE,EAAE;QACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IACvC,CAAC;IAED,IAAI,EAAE,CAAC,IAAY,EAAE,KAAa,EAAE,OAAe,EAAE,EAAE;QACrD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IACzD,CAAC;IAED,KAAK,EAAE,CAAC,OAAe,EAAE,EAAE;QACzB,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;QACzE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACvF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;QACzE,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;IAED,OAAO,EAAE,GAAG,EAAE;QACZ,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;IAED,KAAK,EAAE,CAAC,OAAe,EAAE,EAAE;QACzB,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACvB,CAAC;IAED,GAAG,EAAE,CAAC,OAAe,EAAE,EAAE;QACvB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;IAClC,CAAC;IAED,SAAS,EAAE,CAAC,KAAa,EAAE,KAAa,EAAE,EAAE;QAC1C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAC1D,CAAC;CACF,CAAC"}
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,IAAI,EAAE,CAAC,OAAe,EAAE,EAAE;QACxB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC;IAED,OAAO,EAAE,CAAC,OAAe,EAAE,EAAE;QAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IACzC,CAAC;IAED,OAAO,EAAE,CAAC,OAAe,EAAE,EAAE;QAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IAC1C,CAAC;IAED,KAAK,EAAE,CAAC,OAAe,EAAE,EAAE;QACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IACvC,CAAC;IAED,IAAI,EAAE,CAAC,IAAY,EAAE,KAAa,EAAE,OAAe,EAAE,EAAE;QACrD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IACzD,CAAC;IAED,KAAK,EAAE,CAAC,OAAe,EAAE,EAAE;QACzB,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;QACzE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACvF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;QACzE,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;IAED,OAAO,EAAE,GAAG,EAAE;QACZ,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;IAED,KAAK,EAAE,CAAC,OAAe,EAAE,EAAE;QACzB,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACvB,CAAC;IAED,GAAG,EAAE,CAAC,OAAe,EAAE,EAAE;QACvB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;IAClC,CAAC;IAED,SAAS,EAAE,CAAC,KAAa,EAAE,KAAa,EAAE,EAAE;QAC1C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAC1D,CAAC;IAED,WAAW,EAAE,CAAC,KAAc,EAAU,EAAE;QACtC,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACnD,CAAC;CACF,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * 사용자에게 y/n 질문을 하고 응답을 받음
3
+ */
4
+ export declare function askYesNo(question: string, defaultValue?: boolean): Promise<boolean>;
5
+ /**
6
+ * gh CLI가 설치되어 있고 인증되어 있는지 확인
7
+ */
8
+ export declare function isGhCliAvailable(): Promise<boolean>;
9
+ /**
10
+ * 원격 저장소가 설정되어 있는지 확인
11
+ */
12
+ export declare function hasRemoteRepository(): Promise<boolean>;
13
+ /**
14
+ * 사용자에게 텍스트 입력을 받음
15
+ */
16
+ export declare function askText(question: string, defaultValue?: string): Promise<string>;
17
+ /**
18
+ * 사용자에게 선택지를 제시하고 번호로 선택을 받음
19
+ */
20
+ export declare function askChoice(question: string, choices: {
21
+ label: string;
22
+ value: string;
23
+ }[], defaultIndex?: number): Promise<string>;
24
+ //# sourceMappingURL=prompt-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-utils.d.ts","sourceRoot":"","sources":["../../src/utils/prompt-utils.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,wBAAsB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,GAAE,OAAe,GAAG,OAAO,CAAC,OAAO,CAAC,CAuBhG;AAED;;GAEG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,OAAO,CAAC,CASzD;AAED;;GAEG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,OAAO,CAAC,CAS5D;AAED;;GAEG;AACH,wBAAsB,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,GAAE,MAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAe1F;AAED;;GAEG;AACH,wBAAsB,SAAS,CAC7B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,EAC3C,YAAY,GAAE,MAAU,GACvB,OAAO,CAAC,MAAM,CAAC,CA4BjB"}
@@ -0,0 +1,101 @@
1
+ import readline from 'readline';
2
+ /**
3
+ * 사용자에게 y/n 질문을 하고 응답을 받음
4
+ */
5
+ export async function askYesNo(question, defaultValue = false) {
6
+ const rl = readline.createInterface({
7
+ input: process.stdin,
8
+ output: process.stdout,
9
+ });
10
+ const hint = defaultValue ? '[Y/n]' : '[y/N]';
11
+ return new Promise((resolve) => {
12
+ rl.question(`${question} ${hint} `, (answer) => {
13
+ rl.close();
14
+ const normalizedAnswer = answer.trim().toLowerCase();
15
+ if (normalizedAnswer === '') {
16
+ resolve(defaultValue);
17
+ }
18
+ else if (normalizedAnswer === 'y' || normalizedAnswer === 'yes') {
19
+ resolve(true);
20
+ }
21
+ else {
22
+ resolve(false);
23
+ }
24
+ });
25
+ });
26
+ }
27
+ /**
28
+ * gh CLI가 설치되어 있고 인증되어 있는지 확인
29
+ */
30
+ export async function isGhCliAvailable() {
31
+ const { execSync } = await import('child_process');
32
+ try {
33
+ execSync('gh auth status', { stdio: 'ignore' });
34
+ return true;
35
+ }
36
+ catch {
37
+ return false;
38
+ }
39
+ }
40
+ /**
41
+ * 원격 저장소가 설정되어 있는지 확인
42
+ */
43
+ export async function hasRemoteRepository() {
44
+ const { execSync } = await import('child_process');
45
+ try {
46
+ const result = execSync('git remote -v', { encoding: 'utf-8' });
47
+ return result.includes('origin');
48
+ }
49
+ catch {
50
+ return false;
51
+ }
52
+ }
53
+ /**
54
+ * 사용자에게 텍스트 입력을 받음
55
+ */
56
+ export async function askText(question, defaultValue = '') {
57
+ const rl = readline.createInterface({
58
+ input: process.stdin,
59
+ output: process.stdout,
60
+ });
61
+ const hint = defaultValue ? ` [${defaultValue}]` : '';
62
+ return new Promise((resolve) => {
63
+ rl.question(`${question}${hint}: `, (answer) => {
64
+ rl.close();
65
+ const trimmed = answer.trim();
66
+ resolve(trimmed || defaultValue);
67
+ });
68
+ });
69
+ }
70
+ /**
71
+ * 사용자에게 선택지를 제시하고 번호로 선택을 받음
72
+ */
73
+ export async function askChoice(question, choices, defaultIndex = 0) {
74
+ const rl = readline.createInterface({
75
+ input: process.stdin,
76
+ output: process.stdout,
77
+ });
78
+ console.log(question);
79
+ choices.forEach((choice, index) => {
80
+ const marker = index === defaultIndex ? '>' : ' ';
81
+ console.log(` ${marker} ${index + 1}. ${choice.label}`);
82
+ });
83
+ return new Promise((resolve) => {
84
+ rl.question(`선택 [${defaultIndex + 1}]: `, (answer) => {
85
+ rl.close();
86
+ const trimmed = answer.trim();
87
+ if (trimmed === '') {
88
+ resolve(choices[defaultIndex].value);
89
+ return;
90
+ }
91
+ const num = parseInt(trimmed, 10);
92
+ if (num >= 1 && num <= choices.length) {
93
+ resolve(choices[num - 1].value);
94
+ }
95
+ else {
96
+ resolve(choices[defaultIndex].value);
97
+ }
98
+ });
99
+ });
100
+ }
101
+ //# sourceMappingURL=prompt-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-utils.js","sourceRoot":"","sources":["../../src/utils/prompt-utils.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sleighmaster/bmad",
3
- "version": "1.4.1",
3
+ "version": "1.5.1",
4
4
  "description": "BMad6GitHub CLI - BMAD + GitHub Integration installer",
5
5
  "type": "module",
6
6
  "bin": {