@sleighmaster/bmad 1.1.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/bin/bmad.js +2 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +59 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/check.d.ts +5 -0
- package/dist/commands/check.d.ts.map +1 -0
- package/dist/commands/check.js +73 -0
- package/dist/commands/check.js.map +1 -0
- package/dist/commands/install.d.ts +8 -0
- package/dist/commands/install.d.ts.map +1 -0
- package/dist/commands/install.js +64 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/commands/update.d.ts +6 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +111 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/services/config-manager.d.ts +44 -0
- package/dist/services/config-manager.d.ts.map +1 -0
- package/dist/services/config-manager.js +113 -0
- package/dist/services/config-manager.js.map +1 -0
- package/dist/services/github.d.ts +25 -0
- package/dist/services/github.d.ts.map +1 -0
- package/dist/services/github.js +119 -0
- package/dist/services/github.js.map +1 -0
- package/dist/services/installer.d.ts +16 -0
- package/dist/services/installer.d.ts.map +1 -0
- package/dist/services/installer.js +165 -0
- package/dist/services/installer.js.map +1 -0
- package/dist/services/version-checker.d.ts +44 -0
- package/dist/services/version-checker.d.ts.map +1 -0
- package/dist/services/version-checker.js +116 -0
- package/dist/services/version-checker.js.map +1 -0
- package/dist/utils/fs-utils.d.ts +47 -0
- package/dist/utils/fs-utils.d.ts.map +1 -0
- package/dist/utils/fs-utils.js +98 -0
- package/dist/utils/fs-utils.js.map +1 -0
- package/dist/utils/logger.d.ts +13 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +38 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +63 -0
package/bin/bmad.js
ADDED
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { install } from './commands/install.js';
|
|
3
|
+
import { update } from './commands/update.js';
|
|
4
|
+
import { check } from './commands/check.js';
|
|
5
|
+
import { readFileSync } from 'fs';
|
|
6
|
+
import { fileURLToPath } from 'url';
|
|
7
|
+
import { dirname, join } from 'path';
|
|
8
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
9
|
+
const __dirname = dirname(__filename);
|
|
10
|
+
// package.json에서 버전 읽기
|
|
11
|
+
const packagePath = join(__dirname, '..', 'package.json');
|
|
12
|
+
let version = '1.0.0';
|
|
13
|
+
try {
|
|
14
|
+
const pkg = JSON.parse(readFileSync(packagePath, 'utf-8'));
|
|
15
|
+
version = pkg.version;
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
// dist에서 실행 시 경로가 다를 수 있음
|
|
19
|
+
try {
|
|
20
|
+
const altPath = join(__dirname, '..', '..', 'package.json');
|
|
21
|
+
const pkg = JSON.parse(readFileSync(altPath, 'utf-8'));
|
|
22
|
+
version = pkg.version;
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
// 기본값 사용
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
const program = new Command();
|
|
29
|
+
program
|
|
30
|
+
.name('bmad')
|
|
31
|
+
.description('BMad6GitHub CLI - BMAD + GitHub Integration installer')
|
|
32
|
+
.version(version);
|
|
33
|
+
program
|
|
34
|
+
.command('install')
|
|
35
|
+
.description('Install BMad6GitHub to your project')
|
|
36
|
+
.option('-v, --version <version>', 'Install specific version (e.g., v1.0.0)')
|
|
37
|
+
.option('-f, --force', 'Overwrite existing _bmad folder')
|
|
38
|
+
.option('--skip-github', 'Skip .github templates installation')
|
|
39
|
+
.option('--skip-hooks', 'Skip Git hooks installation')
|
|
40
|
+
.action(async (options) => {
|
|
41
|
+
await install(options);
|
|
42
|
+
});
|
|
43
|
+
program
|
|
44
|
+
.command('update')
|
|
45
|
+
.description('Update BMad6GitHub to the latest version')
|
|
46
|
+
.option('-v, --version <version>', 'Update to specific version')
|
|
47
|
+
.option('--dry-run', 'Show what would be updated without making changes')
|
|
48
|
+
.action(async (options) => {
|
|
49
|
+
await update(options);
|
|
50
|
+
});
|
|
51
|
+
program
|
|
52
|
+
.command('check')
|
|
53
|
+
.description('Check for available updates')
|
|
54
|
+
.option('--json', 'Output in JSON format')
|
|
55
|
+
.action(async (options) => {
|
|
56
|
+
await check(options);
|
|
57
|
+
});
|
|
58
|
+
program.parse();
|
|
59
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAsB,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CA+EhE"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import ora from 'ora';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import { isBmadInstalled } from '../utils/fs-utils.js';
|
|
4
|
+
import { logger } from '../utils/logger.js';
|
|
5
|
+
import { checkVersion, summarizeReleaseNotes } from '../services/version-checker.js';
|
|
6
|
+
export async function check(options) {
|
|
7
|
+
const projectRoot = process.cwd();
|
|
8
|
+
if (!options.json) {
|
|
9
|
+
logger.title('BMad6GitHub Version Check');
|
|
10
|
+
}
|
|
11
|
+
// 설치 확인
|
|
12
|
+
const installed = await isBmadInstalled(projectRoot);
|
|
13
|
+
if (!installed && !options.json) {
|
|
14
|
+
logger.warning('BMad6GitHub is not installed in this project.');
|
|
15
|
+
logger.plain('Run "npx @sleighmaster/bmad install" to install.');
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
// 버전 체크
|
|
19
|
+
const spinner = options.json ? null : ora('Checking version...').start();
|
|
20
|
+
try {
|
|
21
|
+
const result = await checkVersion(projectRoot);
|
|
22
|
+
if (spinner) {
|
|
23
|
+
spinner.stop();
|
|
24
|
+
}
|
|
25
|
+
if (options.json) {
|
|
26
|
+
console.log(JSON.stringify({
|
|
27
|
+
installed: result.installed,
|
|
28
|
+
currentVersion: result.currentVersion,
|
|
29
|
+
latestVersion: result.latestVersion,
|
|
30
|
+
updateAvailable: result.updateAvailable,
|
|
31
|
+
releaseUrl: result.releaseInfo?.htmlUrl,
|
|
32
|
+
}, null, 2));
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
// 현재 버전
|
|
36
|
+
logger.highlight('Current version', result.currentVersion || 'not installed');
|
|
37
|
+
logger.highlight('Latest version', result.latestVersion);
|
|
38
|
+
logger.newline();
|
|
39
|
+
if (result.updateAvailable) {
|
|
40
|
+
console.log(chalk.yellow.bold('⚡ Update available!'));
|
|
41
|
+
logger.newline();
|
|
42
|
+
if (result.releaseInfo?.body) {
|
|
43
|
+
logger.plain("What's new in " + result.latestVersion + ':');
|
|
44
|
+
const summary = summarizeReleaseNotes(result.releaseInfo.body, 300);
|
|
45
|
+
logger.dim(summary);
|
|
46
|
+
logger.newline();
|
|
47
|
+
}
|
|
48
|
+
logger.plain('Run to update:');
|
|
49
|
+
console.log(chalk.cyan(' npx @sleighmaster/bmad update'));
|
|
50
|
+
if (result.releaseInfo?.htmlUrl) {
|
|
51
|
+
logger.newline();
|
|
52
|
+
logger.dim(`Release notes: ${result.releaseInfo.htmlUrl}`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
logger.success('You are on the latest version!');
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
if (spinner) {
|
|
61
|
+
spinner.fail('Failed to check version');
|
|
62
|
+
}
|
|
63
|
+
if (options.json) {
|
|
64
|
+
console.log(JSON.stringify({
|
|
65
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
66
|
+
}, null, 2));
|
|
67
|
+
process.exit(1);
|
|
68
|
+
}
|
|
69
|
+
logger.error(error instanceof Error ? error.message : 'Unknown error');
|
|
70
|
+
process.exit(1);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAMA,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,CAmEpE"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import ora from 'ora';
|
|
2
|
+
import { isProjectRoot, isBmadInstalled } from '../utils/fs-utils.js';
|
|
3
|
+
import { logger } from '../utils/logger.js';
|
|
4
|
+
import { getLatestRelease, getReleaseByTag } from '../services/github.js';
|
|
5
|
+
import { performInstall } from '../services/installer.js';
|
|
6
|
+
export async function install(options) {
|
|
7
|
+
const projectRoot = process.cwd();
|
|
8
|
+
logger.title('BMad6GitHub Install');
|
|
9
|
+
// 1. 프로젝트 루트 확인
|
|
10
|
+
if (!(await isProjectRoot(projectRoot))) {
|
|
11
|
+
logger.error('This does not appear to be a project root directory.');
|
|
12
|
+
logger.plain('Please run this command from a directory containing package.json or .git');
|
|
13
|
+
process.exit(1);
|
|
14
|
+
}
|
|
15
|
+
// 2. 기존 설치 확인
|
|
16
|
+
if (await isBmadInstalled(projectRoot)) {
|
|
17
|
+
if (!options.force) {
|
|
18
|
+
logger.error('BMad6GitHub is already installed in this project.');
|
|
19
|
+
logger.plain('Use --force to overwrite, or use "npx @sleighmaster/bmad update" to update.');
|
|
20
|
+
process.exit(1);
|
|
21
|
+
}
|
|
22
|
+
logger.warning('Existing installation found. Will backup and overwrite.');
|
|
23
|
+
}
|
|
24
|
+
// 3. 릴리즈 정보 가져오기
|
|
25
|
+
const spinner = ora('Fetching release information...').start();
|
|
26
|
+
try {
|
|
27
|
+
const release = options.version
|
|
28
|
+
? await getReleaseByTag(options.version)
|
|
29
|
+
: await getLatestRelease();
|
|
30
|
+
spinner.succeed(`Found release: ${release.tagName}`);
|
|
31
|
+
// 4. 설치 수행
|
|
32
|
+
logger.newline();
|
|
33
|
+
const result = await performInstall(projectRoot, release, {
|
|
34
|
+
force: options.force,
|
|
35
|
+
skipGithub: options.skipGithub,
|
|
36
|
+
skipHooks: options.skipHooks,
|
|
37
|
+
});
|
|
38
|
+
if (!result.success) {
|
|
39
|
+
logger.error(`Installation failed: ${result.error}`);
|
|
40
|
+
if (result.backupPath) {
|
|
41
|
+
logger.plain(`Backup available at: ${result.backupPath}`);
|
|
42
|
+
}
|
|
43
|
+
process.exit(1);
|
|
44
|
+
}
|
|
45
|
+
// 5. 완료 메시지
|
|
46
|
+
logger.newline();
|
|
47
|
+
logger.success('BMad6GitHub installed successfully!');
|
|
48
|
+
logger.highlight('Version', result.version);
|
|
49
|
+
if (result.backupPath) {
|
|
50
|
+
logger.dim(`Previous installation backed up to: ${result.backupPath}`);
|
|
51
|
+
}
|
|
52
|
+
logger.newline();
|
|
53
|
+
logger.plain('Next steps:');
|
|
54
|
+
logger.plain(' 1. Review config: _bmad/bmm/config.yaml');
|
|
55
|
+
logger.plain(' 2. Start SM agent: /bmad-agent-bmm-sm');
|
|
56
|
+
logger.plain(' 3. Run GitHub setup: [GS] in SM menu');
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
spinner.fail('Failed to fetch release information');
|
|
60
|
+
logger.error(error instanceof Error ? error.message : 'Unknown error');
|
|
61
|
+
process.exit(1);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=install.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAUA,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,CAuHlE"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import ora from 'ora';
|
|
2
|
+
import fs from 'fs-extra';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
import { isBmadInstalled, getCurrentVersion, createBackupDir } from '../utils/fs-utils.js';
|
|
5
|
+
import { logger } from '../utils/logger.js';
|
|
6
|
+
import { getLatestRelease, getReleaseByTag, downloadRelease, cleanupDownload } from '../services/github.js';
|
|
7
|
+
import { backupConfig, restoreConfig } from '../services/config-manager.js';
|
|
8
|
+
import { compareVersions } from '../services/version-checker.js';
|
|
9
|
+
import { writeText } from '../utils/fs-utils.js';
|
|
10
|
+
export async function update(options) {
|
|
11
|
+
const projectRoot = process.cwd();
|
|
12
|
+
logger.title('BMad6GitHub Update');
|
|
13
|
+
// 1. 설치 확인
|
|
14
|
+
if (!(await isBmadInstalled(projectRoot))) {
|
|
15
|
+
logger.error('BMad6GitHub is not installed in this project.');
|
|
16
|
+
logger.plain('Run "npx @sleighmaster/bmad install" first.');
|
|
17
|
+
process.exit(1);
|
|
18
|
+
}
|
|
19
|
+
// 2. 현재 버전 확인
|
|
20
|
+
const currentVersion = await getCurrentVersion(projectRoot);
|
|
21
|
+
if (!currentVersion) {
|
|
22
|
+
logger.warning('Could not determine current version. Proceeding anyway...');
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
logger.highlight('Current version', currentVersion);
|
|
26
|
+
}
|
|
27
|
+
// 3. 릴리즈 정보 가져오기
|
|
28
|
+
const spinner = ora('Checking for updates...').start();
|
|
29
|
+
try {
|
|
30
|
+
const release = options.version
|
|
31
|
+
? await getReleaseByTag(options.version)
|
|
32
|
+
: await getLatestRelease();
|
|
33
|
+
spinner.succeed(`Latest version: ${release.tagName}`);
|
|
34
|
+
// 4. 버전 비교
|
|
35
|
+
if (currentVersion && !compareVersions(currentVersion, release.tagName)) {
|
|
36
|
+
logger.newline();
|
|
37
|
+
logger.success('You are already on the latest version!');
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
logger.newline();
|
|
41
|
+
if (options.dryRun) {
|
|
42
|
+
logger.plain('Dry run mode - showing what would be updated:');
|
|
43
|
+
logger.highlight('From', currentVersion || 'unknown');
|
|
44
|
+
logger.highlight('To', release.tagName);
|
|
45
|
+
if (release.body) {
|
|
46
|
+
logger.newline();
|
|
47
|
+
logger.plain('Release notes:');
|
|
48
|
+
logger.dim(release.body.substring(0, 500));
|
|
49
|
+
}
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
// 5. 설정 백업
|
|
53
|
+
logger.step(1, 5, 'Backing up configuration...');
|
|
54
|
+
const configBackup = await backupConfig(projectRoot);
|
|
55
|
+
// 6. 기존 _bmad 백업
|
|
56
|
+
logger.step(2, 5, 'Backing up current installation...');
|
|
57
|
+
const bmadPath = path.join(projectRoot, '_bmad');
|
|
58
|
+
const backupPath = await createBackupDir(projectRoot, '_bmad');
|
|
59
|
+
await fs.copy(bmadPath, path.join(backupPath, '_bmad'));
|
|
60
|
+
// 7. 새 버전 다운로드
|
|
61
|
+
logger.step(3, 5, 'Downloading new version...');
|
|
62
|
+
const downloadDir = await downloadRelease(release);
|
|
63
|
+
try {
|
|
64
|
+
// 8. 새 버전 설치
|
|
65
|
+
logger.step(4, 5, 'Installing new version...');
|
|
66
|
+
// _bmad 교체
|
|
67
|
+
await fs.remove(bmadPath);
|
|
68
|
+
const srcBmad = path.join(downloadDir, '_bmad');
|
|
69
|
+
await fs.copy(srcBmad, bmadPath);
|
|
70
|
+
// .claude/commands 업데이트
|
|
71
|
+
const srcClaude = path.join(downloadDir, '.claude', 'commands');
|
|
72
|
+
const destClaude = path.join(projectRoot, '.claude', 'commands');
|
|
73
|
+
if (await fs.pathExists(srcClaude)) {
|
|
74
|
+
await fs.copy(srcClaude, destClaude, { overwrite: true });
|
|
75
|
+
}
|
|
76
|
+
// 버전 파일 업데이트
|
|
77
|
+
await writeText(path.join(bmadPath, '.version'), release.tagName);
|
|
78
|
+
// 9. 설정 복원
|
|
79
|
+
logger.step(5, 5, 'Restoring configuration...');
|
|
80
|
+
if (configBackup) {
|
|
81
|
+
await restoreConfig(projectRoot, configBackup);
|
|
82
|
+
}
|
|
83
|
+
// 정리
|
|
84
|
+
await cleanupDownload(downloadDir);
|
|
85
|
+
// 완료 메시지
|
|
86
|
+
logger.newline();
|
|
87
|
+
logger.success('BMad6GitHub updated successfully!');
|
|
88
|
+
logger.highlight('Version', release.tagName);
|
|
89
|
+
logger.dim(`Previous version backed up to: ${backupPath}`);
|
|
90
|
+
if (release.body) {
|
|
91
|
+
logger.newline();
|
|
92
|
+
logger.plain("What's new:");
|
|
93
|
+
logger.dim(release.body.substring(0, 300) + (release.body.length > 300 ? '...' : ''));
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
// 롤백
|
|
98
|
+
logger.error('Update failed. Rolling back...');
|
|
99
|
+
await fs.remove(bmadPath).catch(() => { });
|
|
100
|
+
await fs.copy(path.join(backupPath, '_bmad'), bmadPath);
|
|
101
|
+
await cleanupDownload(downloadDir).catch(() => { });
|
|
102
|
+
throw error;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
spinner.fail('Update failed');
|
|
107
|
+
logger.error(error instanceof Error ? error.message : 'Unknown error');
|
|
108
|
+
process.exit(1);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
export interface BmadConfig {
|
|
2
|
+
project_name?: string;
|
|
3
|
+
user_name?: string;
|
|
4
|
+
communication_language?: string;
|
|
5
|
+
document_output_language?: string;
|
|
6
|
+
user_skill_level?: string;
|
|
7
|
+
planning_artifacts?: string;
|
|
8
|
+
epics_artifacts?: string;
|
|
9
|
+
implementation_artifacts?: string;
|
|
10
|
+
project_knowledge?: string;
|
|
11
|
+
output_folder?: string;
|
|
12
|
+
[key: string]: unknown;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* config.yaml 파일 읽기
|
|
16
|
+
*/
|
|
17
|
+
export declare function readConfig(projectRoot: string): Promise<BmadConfig | null>;
|
|
18
|
+
/**
|
|
19
|
+
* config.yaml 파일 쓰기
|
|
20
|
+
*/
|
|
21
|
+
export declare function writeConfig(projectRoot: string, config: BmadConfig): Promise<void>;
|
|
22
|
+
/**
|
|
23
|
+
* core config.yaml 파일 쓰기
|
|
24
|
+
*/
|
|
25
|
+
export declare function writeCoreConfig(projectRoot: string, config: BmadConfig): Promise<void>;
|
|
26
|
+
/**
|
|
27
|
+
* 설정 백업
|
|
28
|
+
*/
|
|
29
|
+
export declare function backupConfig(projectRoot: string): Promise<BmadConfig | null>;
|
|
30
|
+
/**
|
|
31
|
+
* 이전 설정과 새 설정 병합
|
|
32
|
+
* - 보존 필드는 이전 값 유지
|
|
33
|
+
* - 새로운 필드는 새 값 사용
|
|
34
|
+
*/
|
|
35
|
+
export declare function mergeConfigs(oldConfig: BmadConfig, newConfig: BmadConfig): BmadConfig;
|
|
36
|
+
/**
|
|
37
|
+
* 설정 복원 (업데이트 후)
|
|
38
|
+
*/
|
|
39
|
+
export declare function restoreConfig(projectRoot: string, backupConfig: BmadConfig): Promise<void>;
|
|
40
|
+
/**
|
|
41
|
+
* 프로젝트 이름으로 config 초기화
|
|
42
|
+
*/
|
|
43
|
+
export declare function initializeConfig(projectRoot: string, projectName: string): Promise<void>;
|
|
44
|
+
//# sourceMappingURL=config-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-manager.d.ts","sourceRoot":"","sources":["../../src/services/config-manager.ts"],"names":[],"mappings":"AAmBA,MAAM,WAAW,UAAU;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAahF;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBxF;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAa5F;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAElF;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,GAAG,UAAU,CAUrF;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,UAAU,GACvB,OAAO,CAAC,IAAI,CAAC,CAef;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC,CAQf"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import path from 'path';
|
|
2
|
+
import { parse as parseYaml, stringify as stringifyYaml } from 'yaml';
|
|
3
|
+
import { readText, writeText } from '../utils/fs-utils.js';
|
|
4
|
+
// 업데이트 시 반드시 보존해야 할 필드들
|
|
5
|
+
const PRESERVED_FIELDS = [
|
|
6
|
+
'project_name',
|
|
7
|
+
'user_name',
|
|
8
|
+
'communication_language',
|
|
9
|
+
'document_output_language',
|
|
10
|
+
'user_skill_level',
|
|
11
|
+
'planning_artifacts',
|
|
12
|
+
'epics_artifacts',
|
|
13
|
+
'implementation_artifacts',
|
|
14
|
+
'project_knowledge',
|
|
15
|
+
'output_folder',
|
|
16
|
+
];
|
|
17
|
+
/**
|
|
18
|
+
* config.yaml 파일 읽기
|
|
19
|
+
*/
|
|
20
|
+
export async function readConfig(projectRoot) {
|
|
21
|
+
const configPath = path.join(projectRoot, '_bmad', 'bmm', 'config.yaml');
|
|
22
|
+
const content = await readText(configPath);
|
|
23
|
+
if (!content) {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
try {
|
|
27
|
+
return parseYaml(content);
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* config.yaml 파일 쓰기
|
|
35
|
+
*/
|
|
36
|
+
export async function writeConfig(projectRoot, config) {
|
|
37
|
+
const configPath = path.join(projectRoot, '_bmad', 'bmm', 'config.yaml');
|
|
38
|
+
// 헤더 주석 추가
|
|
39
|
+
const header = `# BMM Module Configuration
|
|
40
|
+
# Generated by BMAD installer
|
|
41
|
+
# Version: ${config._version || '6.0.0'}
|
|
42
|
+
# Date: ${new Date().toISOString()}
|
|
43
|
+
|
|
44
|
+
`;
|
|
45
|
+
// _version 필드는 주석으로만 사용하고 실제 config에서 제거
|
|
46
|
+
const configToWrite = { ...config };
|
|
47
|
+
delete configToWrite._version;
|
|
48
|
+
const content = header + stringifyYaml(configToWrite);
|
|
49
|
+
await writeText(configPath, content);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* core config.yaml 파일 쓰기
|
|
53
|
+
*/
|
|
54
|
+
export async function writeCoreConfig(projectRoot, config) {
|
|
55
|
+
const configPath = path.join(projectRoot, '_bmad', 'core', 'config.yaml');
|
|
56
|
+
// core config는 일부 필드만 포함
|
|
57
|
+
const coreConfig = {
|
|
58
|
+
user_name: config.user_name,
|
|
59
|
+
communication_language: config.communication_language,
|
|
60
|
+
document_output_language: config.document_output_language,
|
|
61
|
+
output_folder: config.output_folder,
|
|
62
|
+
};
|
|
63
|
+
const content = stringifyYaml(coreConfig);
|
|
64
|
+
await writeText(configPath, content);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* 설정 백업
|
|
68
|
+
*/
|
|
69
|
+
export async function backupConfig(projectRoot) {
|
|
70
|
+
return readConfig(projectRoot);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* 이전 설정과 새 설정 병합
|
|
74
|
+
* - 보존 필드는 이전 값 유지
|
|
75
|
+
* - 새로운 필드는 새 값 사용
|
|
76
|
+
*/
|
|
77
|
+
export function mergeConfigs(oldConfig, newConfig) {
|
|
78
|
+
const merged = { ...newConfig };
|
|
79
|
+
for (const field of PRESERVED_FIELDS) {
|
|
80
|
+
if (field in oldConfig && oldConfig[field] !== undefined) {
|
|
81
|
+
merged[field] = oldConfig[field];
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return merged;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* 설정 복원 (업데이트 후)
|
|
88
|
+
*/
|
|
89
|
+
export async function restoreConfig(projectRoot, backupConfig) {
|
|
90
|
+
const newConfig = await readConfig(projectRoot);
|
|
91
|
+
if (!newConfig) {
|
|
92
|
+
// 새 설정이 없으면 백업 설정 그대로 저장
|
|
93
|
+
await writeConfig(projectRoot, backupConfig);
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
// 병합된 설정 저장
|
|
97
|
+
const mergedConfig = mergeConfigs(backupConfig, newConfig);
|
|
98
|
+
await writeConfig(projectRoot, mergedConfig);
|
|
99
|
+
// core config도 업데이트
|
|
100
|
+
await writeCoreConfig(projectRoot, mergedConfig);
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* 프로젝트 이름으로 config 초기화
|
|
104
|
+
*/
|
|
105
|
+
export async function initializeConfig(projectRoot, projectName) {
|
|
106
|
+
const config = await readConfig(projectRoot);
|
|
107
|
+
if (config) {
|
|
108
|
+
config.project_name = projectName;
|
|
109
|
+
await writeConfig(projectRoot, config);
|
|
110
|
+
await writeCoreConfig(projectRoot, config);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=config-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-manager.js","sourceRoot":"","sources":["../../src/services/config-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export interface ReleaseInfo {
|
|
2
|
+
tagName: string;
|
|
3
|
+
name: string;
|
|
4
|
+
publishedAt: string;
|
|
5
|
+
body: string;
|
|
6
|
+
zipballUrl: string;
|
|
7
|
+
htmlUrl: string;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* 최신 릴리즈 정보 가져오기
|
|
11
|
+
*/
|
|
12
|
+
export declare function getLatestRelease(): Promise<ReleaseInfo>;
|
|
13
|
+
/**
|
|
14
|
+
* 특정 버전의 릴리즈 정보 가져오기
|
|
15
|
+
*/
|
|
16
|
+
export declare function getReleaseByTag(tag: string): Promise<ReleaseInfo>;
|
|
17
|
+
/**
|
|
18
|
+
* 릴리즈 다운로드 및 압축 해제
|
|
19
|
+
*/
|
|
20
|
+
export declare function downloadRelease(release: ReleaseInfo): Promise<string>;
|
|
21
|
+
/**
|
|
22
|
+
* 임시 다운로드 디렉토리 정리
|
|
23
|
+
*/
|
|
24
|
+
export declare function cleanupDownload(downloadDir: string): Promise<void>;
|
|
25
|
+
//# sourceMappingURL=github.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github.d.ts","sourceRoot":"","sources":["../../src/services/github.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAWD;;GAEG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,WAAW,CAAC,CA8B7D;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAgCvE;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAmC3E;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAIxE"}
|