@team-semicolon/semo-cli 2.0.5 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/index.js +45 -28
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -470,25 +470,17 @@ const BASE_MCP_SERVERS = [
470
470
  // === Claude MCP 등록 함수 ===
471
471
  function registerMCPServer(server) {
472
472
  try {
473
- // 환경변수가 있는 경우 --env 옵션 추가
474
- const envArgs = [];
473
+ // claude mcp add 명령어 구성
474
+ // 형식: claude mcp add <name> [-e KEY=value...] -- <command> [args...]
475
+ const args = ["mcp", "add", server.name];
476
+ // 환경변수가 있는 경우 -e 옵션 추가
475
477
  if (server.env) {
476
478
  for (const [key, value] of Object.entries(server.env)) {
477
- envArgs.push("-e", `${key}=${value}`);
479
+ args.push("-e", `${key}=${value}`);
478
480
  }
479
481
  }
480
- // claude mcp add 명령어 실행
481
- const args = [
482
- "mcp", "add",
483
- server.name,
484
- "--",
485
- server.command,
486
- ...server.args,
487
- ];
488
- // 환경변수가 있으면 명령어 앞에 추가
489
- if (envArgs.length > 0) {
490
- args.splice(2, 0, ...envArgs);
491
- }
482
+ // -- 구분자 명령어와 인자 추가
483
+ args.push("--", server.command, ...server.args);
492
484
  (0, child_process_1.execSync)(`claude ${args.join(" ")}`, { stdio: "pipe" });
493
485
  return { success: true };
494
486
  }
@@ -978,11 +970,19 @@ program
978
970
  console.log(chalk_1.default.red("\nSEMO가 설치되어 있지 않습니다. 'semo init'을 먼저 실행하세요.\n"));
979
971
  process.exit(1);
980
972
  }
981
- if (!(packageName in EXTENSION_PACKAGES)) {
973
+ // 레거시 패키지 이름 → 새 이름 변환
974
+ let resolvedPackage = packageName;
975
+ if (packageName in LEGACY_MAPPING) {
976
+ resolvedPackage = LEGACY_MAPPING[packageName];
977
+ console.log(chalk_1.default.yellow(`\n💡 '${packageName}' → '${resolvedPackage}' (v3.0 구조)`));
978
+ }
979
+ if (!(resolvedPackage in EXTENSION_PACKAGES)) {
982
980
  console.log(chalk_1.default.red(`\n알 수 없는 패키지: ${packageName}`));
983
- console.log(chalk_1.default.gray(`사용 가능한 패키지: ${Object.keys(EXTENSION_PACKAGES).join(", ")}\n`));
981
+ console.log(chalk_1.default.gray(`사용 가능한 패키지: ${Object.keys(EXTENSION_PACKAGES).join(", ")}`));
982
+ console.log(chalk_1.default.gray(`레거시 별칭: ${Object.keys(LEGACY_MAPPING).join(", ")}\n`));
984
983
  process.exit(1);
985
984
  }
985
+ packageName = resolvedPackage;
986
986
  const pkgPath = path.join(semoSystemDir, packageName);
987
987
  if (fs.existsSync(pkgPath) && !options.force) {
988
988
  console.log(chalk_1.default.yellow(`\n${EXTENSION_PACKAGES[packageName].name} 패키지가 이미 설치되어 있습니다.`));
@@ -1006,24 +1006,41 @@ program
1006
1006
  .action(() => {
1007
1007
  const cwd = process.cwd();
1008
1008
  const semoSystemDir = path.join(cwd, "semo-system");
1009
- console.log(chalk_1.default.cyan.bold("\n📦 SEMO 패키지 목록\n"));
1009
+ console.log(chalk_1.default.cyan.bold("\n📦 SEMO 패키지 목록 (v3.0)\n"));
1010
1010
  // Standard
1011
1011
  console.log(chalk_1.default.white.bold("Standard (필수)"));
1012
1012
  const coreInstalled = fs.existsSync(path.join(semoSystemDir, "semo-core"));
1013
1013
  const skillsInstalled = fs.existsSync(path.join(semoSystemDir, "semo-skills"));
1014
1014
  console.log(` ${coreInstalled ? chalk_1.default.green("✓") : chalk_1.default.gray("○")} semo-core - 원칙, 오케스트레이터`);
1015
- console.log(` ${skillsInstalled ? chalk_1.default.green("✓") : chalk_1.default.gray("○")} semo-skills - 13개 통합 스킬`);
1015
+ console.log(` ${skillsInstalled ? chalk_1.default.green("✓") : chalk_1.default.gray("○")} semo-skills - 통합 스킬`);
1016
1016
  console.log();
1017
- // Extensions
1018
- console.log(chalk_1.default.white.bold("Extensions (선택)"));
1019
- for (const [key, pkg] of Object.entries(EXTENSION_PACKAGES)) {
1020
- const isInstalled = fs.existsSync(path.join(semoSystemDir, key));
1021
- const status = isInstalled ? chalk_1.default.green("✓") : chalk_1.default.gray("");
1022
- console.log(` ${status} ${key} - ${pkg.desc}`);
1017
+ // Extensions - 레이어별 그룹화
1018
+ const layers = {
1019
+ biz: { title: "Business Layer", emoji: "💼" },
1020
+ eng: { title: "Engineering Layer", emoji: "⚙️" },
1021
+ ops: { title: "Operations Layer", emoji: "📊" },
1022
+ meta: { title: "Meta", emoji: "🔧" },
1023
+ };
1024
+ for (const [layerKey, layerInfo] of Object.entries(layers)) {
1025
+ const layerPackages = Object.entries(EXTENSION_PACKAGES).filter(([, pkg]) => pkg.layer === layerKey);
1026
+ if (layerPackages.length === 0)
1027
+ continue;
1028
+ console.log(chalk_1.default.white.bold(`${layerInfo.emoji} ${layerInfo.title}`));
1029
+ for (const [key, pkg] of layerPackages) {
1030
+ const isInstalled = fs.existsSync(path.join(semoSystemDir, key));
1031
+ const status = isInstalled ? chalk_1.default.green("✓") : chalk_1.default.gray("○");
1032
+ const displayKey = key.includes("/") ? key.split("/")[1] : key;
1033
+ console.log(` ${status} ${chalk_1.default.cyan(displayKey)} - ${pkg.desc}`);
1034
+ console.log(chalk_1.default.gray(` semo add ${key}`));
1035
+ }
1036
+ console.log();
1023
1037
  }
1024
- console.log();
1025
- console.log(chalk_1.default.gray("설치: semo add <package>"));
1026
- console.log(chalk_1.default.gray("예시: semo add next\n"));
1038
+ // 레거시 호환성 안내
1039
+ console.log(chalk_1.default.gray("".repeat(50)));
1040
+ console.log(chalk_1.default.gray("레거시 명령어도 지원됩니다:"));
1041
+ console.log(chalk_1.default.gray(" semo add next → eng/nextjs"));
1042
+ console.log(chalk_1.default.gray(" semo add backend → eng/spring"));
1043
+ console.log(chalk_1.default.gray(" semo add mvp → biz/poc\n"));
1027
1044
  });
1028
1045
  // === status 명령어 ===
1029
1046
  program
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@team-semicolon/semo-cli",
3
- "version": "2.0.5",
3
+ "version": "3.0.0",
4
4
  "description": "SEMO CLI - AI Agent Orchestration Framework Installer",
5
5
  "main": "dist/index.js",
6
6
  "bin": {