@team-semicolon/semo-cli 3.7.0 → 3.7.2
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/dist/index.js +13 -107
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -995,17 +995,17 @@ program
|
|
|
995
995
|
spinner.fail("Git 레포지토리가 아닙니다. 'git init'을 먼저 실행하세요.");
|
|
996
996
|
process.exit(1);
|
|
997
997
|
}
|
|
998
|
-
// 2. Extension 패키지 처리
|
|
999
|
-
|
|
998
|
+
// 2. Extension 패키지 처리
|
|
999
|
+
// semo-hooks는 기본 포함 (Claude Code Hooks 로깅 시스템)
|
|
1000
|
+
let extensionsToInstall = ["semo-hooks"];
|
|
1000
1001
|
if (options.with) {
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
console.log(chalk_1.default.cyan("\n📦 추가 Extension 설치:"));
|
|
1004
|
-
extensionsToInstall.forEach(pkg => {
|
|
1005
|
-
console.log(chalk_1.default.gray(` - ${EXTENSION_PACKAGES[pkg].name}: ${EXTENSION_PACKAGES[pkg].desc}`));
|
|
1006
|
-
});
|
|
1007
|
-
}
|
|
1002
|
+
const additionalPkgs = options.with.split(",").map((p) => p.trim()).filter((p) => p in EXTENSION_PACKAGES);
|
|
1003
|
+
extensionsToInstall = [...new Set([...extensionsToInstall, ...additionalPkgs])];
|
|
1008
1004
|
}
|
|
1005
|
+
console.log(chalk_1.default.cyan("\n📦 Extension 설치:"));
|
|
1006
|
+
extensionsToInstall.forEach(pkg => {
|
|
1007
|
+
console.log(chalk_1.default.gray(` - ${EXTENSION_PACKAGES[pkg].name}: ${EXTENSION_PACKAGES[pkg].desc}`));
|
|
1008
|
+
});
|
|
1009
1009
|
// 3. .claude 디렉토리 생성
|
|
1010
1010
|
const claudeDir = path.join(cwd, ".claude");
|
|
1011
1011
|
if (!fs.existsSync(claudeDir)) {
|
|
@@ -1072,7 +1072,8 @@ program
|
|
|
1072
1072
|
console.log(chalk_1.default.gray(" 1. Claude Code에서 프로젝트 열기"));
|
|
1073
1073
|
console.log(chalk_1.default.gray(" 2. 자연어로 요청하기 (예: \"댓글 기능 구현해줘\")"));
|
|
1074
1074
|
console.log(chalk_1.default.gray(" 3. /SEMO:help로 도움말 확인"));
|
|
1075
|
-
|
|
1075
|
+
// semo-hooks만 설치된 경우 추가 패키지 안내
|
|
1076
|
+
if (extensionsToInstall.length === 1 && extensionsToInstall[0] === "semo-hooks") {
|
|
1076
1077
|
console.log(chalk_1.default.gray("\n💡 추가 패키지: semo add <package> (예: semo add meta)"));
|
|
1077
1078
|
}
|
|
1078
1079
|
console.log();
|
|
@@ -1421,7 +1422,8 @@ async function downloadExtensions(cwd, packages, force) {
|
|
|
1421
1422
|
}
|
|
1422
1423
|
// 개별 패키지 복사
|
|
1423
1424
|
for (const pkg of packages) {
|
|
1424
|
-
|
|
1425
|
+
// Extension 패키지는 semo-system/ 폴더에 있음
|
|
1426
|
+
const srcPath = path.join(tempDir, "semo-system", pkg);
|
|
1425
1427
|
const destPath = path.join(semoSystemDir, pkg);
|
|
1426
1428
|
if (fs.existsSync(srcPath)) {
|
|
1427
1429
|
if (fs.existsSync(destPath) && !force) {
|
|
@@ -2678,102 +2680,6 @@ program
|
|
|
2678
2680
|
}
|
|
2679
2681
|
console.log();
|
|
2680
2682
|
});
|
|
2681
|
-
// === doctor 명령어 ===
|
|
2682
|
-
program
|
|
2683
|
-
.command("doctor")
|
|
2684
|
-
.description("SEMO 및 MCP 설정 문제를 진단합니다")
|
|
2685
|
-
.action(() => {
|
|
2686
|
-
console.log(chalk_1.default.cyan.bold("\n🩺 SEMO 진단\n"));
|
|
2687
|
-
const cwd = process.cwd();
|
|
2688
|
-
let hasIssues = false;
|
|
2689
|
-
// 1. gh CLI 확인
|
|
2690
|
-
console.log(chalk_1.default.white.bold("GitHub CLI:"));
|
|
2691
|
-
try {
|
|
2692
|
-
const ghVersion = (0, child_process_1.execSync)("gh --version", { stdio: "pipe", encoding: "utf-8" }).split("\n")[0];
|
|
2693
|
-
console.log(chalk_1.default.green(` ✓ 설치됨 (${ghVersion.replace("gh version ", "")})`));
|
|
2694
|
-
// gh 인증 상태
|
|
2695
|
-
try {
|
|
2696
|
-
(0, child_process_1.execSync)("gh auth status", { stdio: "pipe" });
|
|
2697
|
-
console.log(chalk_1.default.green(" ✓ 인증됨"));
|
|
2698
|
-
}
|
|
2699
|
-
catch {
|
|
2700
|
-
console.log(chalk_1.default.red(" ✗ 인증 필요: gh auth login"));
|
|
2701
|
-
hasIssues = true;
|
|
2702
|
-
}
|
|
2703
|
-
}
|
|
2704
|
-
catch {
|
|
2705
|
-
console.log(chalk_1.default.red(" ✗ 미설치: brew install gh"));
|
|
2706
|
-
hasIssues = true;
|
|
2707
|
-
}
|
|
2708
|
-
// 2. GitHub 토큰 확인
|
|
2709
|
-
console.log(chalk_1.default.white.bold("\nGitHub MCP 토큰:"));
|
|
2710
|
-
const ghToken = getGitHubTokenFromCLI();
|
|
2711
|
-
const envToken = process.env.GITHUB_PERSONAL_ACCESS_TOKEN;
|
|
2712
|
-
if (envToken) {
|
|
2713
|
-
console.log(chalk_1.default.green(" ✓ 환경변수 설정됨 (GITHUB_PERSONAL_ACCESS_TOKEN)"));
|
|
2714
|
-
}
|
|
2715
|
-
else if (ghToken) {
|
|
2716
|
-
console.log(chalk_1.default.yellow(" ⚠ gh CLI 토큰 있음 (환경변수 미설정)"));
|
|
2717
|
-
console.log(chalk_1.default.gray(" GitHub MCP 사용하려면:"));
|
|
2718
|
-
console.log(chalk_1.default.white(' export GITHUB_PERSONAL_ACCESS_TOKEN="$(gh auth token)"'));
|
|
2719
|
-
hasIssues = true;
|
|
2720
|
-
}
|
|
2721
|
-
else {
|
|
2722
|
-
console.log(chalk_1.default.red(" ✗ 토큰 없음"));
|
|
2723
|
-
console.log(chalk_1.default.gray(" 1. gh auth login 실행"));
|
|
2724
|
-
console.log(chalk_1.default.white(' 2. export GITHUB_PERSONAL_ACCESS_TOKEN="$(gh auth token)"'));
|
|
2725
|
-
hasIssues = true;
|
|
2726
|
-
}
|
|
2727
|
-
// 3. MCP 서버 등록 상태
|
|
2728
|
-
console.log(chalk_1.default.white.bold("\nMCP 서버:"));
|
|
2729
|
-
const requiredServers = ["semo-integrations", "github", "context7"];
|
|
2730
|
-
for (const server of requiredServers) {
|
|
2731
|
-
if (isMCPServerRegistered(server)) {
|
|
2732
|
-
console.log(chalk_1.default.green(` ✓ ${server}`));
|
|
2733
|
-
}
|
|
2734
|
-
else {
|
|
2735
|
-
console.log(chalk_1.default.yellow(` ⚠ ${server} 미등록`));
|
|
2736
|
-
hasIssues = true;
|
|
2737
|
-
}
|
|
2738
|
-
}
|
|
2739
|
-
// 4. settings.json 확인
|
|
2740
|
-
console.log(chalk_1.default.white.bold("\n설정 파일:"));
|
|
2741
|
-
const settingsPath = path.join(cwd, ".claude", "settings.json");
|
|
2742
|
-
if (fs.existsSync(settingsPath)) {
|
|
2743
|
-
console.log(chalk_1.default.green(" ✓ .claude/settings.json"));
|
|
2744
|
-
try {
|
|
2745
|
-
const settings = JSON.parse(fs.readFileSync(settingsPath, "utf-8"));
|
|
2746
|
-
if (settings.mcpServers?.github?.env?.GITHUB_PERSONAL_ACCESS_TOKEN) {
|
|
2747
|
-
console.log(chalk_1.default.green(" ✓ GitHub MCP 환경변수 설정됨"));
|
|
2748
|
-
}
|
|
2749
|
-
else {
|
|
2750
|
-
console.log(chalk_1.default.yellow(" ⚠ GitHub MCP 환경변수 누락"));
|
|
2751
|
-
hasIssues = true;
|
|
2752
|
-
}
|
|
2753
|
-
}
|
|
2754
|
-
catch {
|
|
2755
|
-
console.log(chalk_1.default.yellow(" ⚠ settings.json 파싱 실패"));
|
|
2756
|
-
hasIssues = true;
|
|
2757
|
-
}
|
|
2758
|
-
}
|
|
2759
|
-
else {
|
|
2760
|
-
console.log(chalk_1.default.red(" ✗ .claude/settings.json 없음"));
|
|
2761
|
-
hasIssues = true;
|
|
2762
|
-
}
|
|
2763
|
-
// 결과
|
|
2764
|
-
console.log();
|
|
2765
|
-
if (hasIssues) {
|
|
2766
|
-
console.log(chalk_1.default.yellow.bold("⚠️ 일부 문제가 발견되었습니다."));
|
|
2767
|
-
console.log(chalk_1.default.gray("\nGitHub MCP 빠른 설정:"));
|
|
2768
|
-
console.log(chalk_1.default.white(' export GITHUB_PERSONAL_ACCESS_TOKEN="$(gh auth token)"'));
|
|
2769
|
-
console.log(chalk_1.default.gray("\n영구 설정 (셸 재시작 후 적용):"));
|
|
2770
|
-
console.log(chalk_1.default.white(' echo \'export GITHUB_PERSONAL_ACCESS_TOKEN="$(gh auth token)"\' >> ~/.zshrc'));
|
|
2771
|
-
}
|
|
2772
|
-
else {
|
|
2773
|
-
console.log(chalk_1.default.green.bold("✅ 모든 설정이 정상입니다."));
|
|
2774
|
-
}
|
|
2775
|
-
console.log();
|
|
2776
|
-
});
|
|
2777
2683
|
// === update 명령어 ===
|
|
2778
2684
|
program
|
|
2779
2685
|
.command("update")
|