@team-semicolon/semo-cli 3.0.9 → 3.0.11
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 +81 -4
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -59,7 +59,7 @@ const child_process_1 = require("child_process");
|
|
|
59
59
|
const fs = __importStar(require("fs"));
|
|
60
60
|
const path = __importStar(require("path"));
|
|
61
61
|
const os = __importStar(require("os"));
|
|
62
|
-
const VERSION = "3.0.
|
|
62
|
+
const VERSION = "3.0.11";
|
|
63
63
|
const PACKAGE_NAME = "@team-semicolon/semo-cli";
|
|
64
64
|
// === 버전 비교 유틸리티 ===
|
|
65
65
|
/**
|
|
@@ -313,6 +313,18 @@ function detectProjectType(cwd) {
|
|
|
313
313
|
}
|
|
314
314
|
return detected;
|
|
315
315
|
}
|
|
316
|
+
// === 설치된 Extension 패키지 스캔 ===
|
|
317
|
+
function getInstalledExtensions(cwd) {
|
|
318
|
+
const semoSystemDir = path.join(cwd, "semo-system");
|
|
319
|
+
const installed = [];
|
|
320
|
+
for (const key of Object.keys(EXTENSION_PACKAGES)) {
|
|
321
|
+
const pkgPath = path.join(semoSystemDir, key);
|
|
322
|
+
if (fs.existsSync(pkgPath)) {
|
|
323
|
+
installed.push(key);
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
return installed;
|
|
327
|
+
}
|
|
316
328
|
function checkRequiredTools() {
|
|
317
329
|
const tools = [
|
|
318
330
|
{
|
|
@@ -1236,6 +1248,69 @@ _아직 기록된 결정이 없습니다._
|
|
|
1236
1248
|
fs.writeFileSync(decisionsPath, decisionsContent);
|
|
1237
1249
|
console.log(chalk_1.default.green("✓ .claude/memory/decisions.md 생성됨"));
|
|
1238
1250
|
}
|
|
1251
|
+
// projects.md
|
|
1252
|
+
const projectsPath = path.join(memoryDir, "projects.md");
|
|
1253
|
+
if (!fs.existsSync(projectsPath)) {
|
|
1254
|
+
const projectsContent = `# 프로젝트 별칭 매핑
|
|
1255
|
+
|
|
1256
|
+
> 외부 프로젝트 배포 및 GitHub Projects 상태 관리
|
|
1257
|
+
> SEMO의 deployer, project-status 스킬이 이 파일을 참조합니다.
|
|
1258
|
+
|
|
1259
|
+
---
|
|
1260
|
+
|
|
1261
|
+
## GitHub Projects 설정
|
|
1262
|
+
|
|
1263
|
+
> **⚠️ 프로젝트 상태 관리 시 이 설정을 참조합니다.**
|
|
1264
|
+
|
|
1265
|
+
### 기본 프로젝트
|
|
1266
|
+
|
|
1267
|
+
| 프로젝트 | 번호 | Project ID | 용도 |
|
|
1268
|
+
|---------|------|------------|------|
|
|
1269
|
+
| 이슈관리 | #1 | \`PVT_xxx\` | 메인 태스크 관리 (기본값) |
|
|
1270
|
+
|
|
1271
|
+
### Status 옵션
|
|
1272
|
+
|
|
1273
|
+
| Status | 설명 |
|
|
1274
|
+
|--------|------|
|
|
1275
|
+
| 백로그 | 초기 상태 |
|
|
1276
|
+
| 작업중 | 개발 진행 중 |
|
|
1277
|
+
| 리뷰요청 | 코드 리뷰 대기 |
|
|
1278
|
+
| 테스트중 | QA 테스트 단계 |
|
|
1279
|
+
| 완료 | 작업 완료 |
|
|
1280
|
+
|
|
1281
|
+
### 🔴 상태값 Alias (한글 ↔ 영문)
|
|
1282
|
+
|
|
1283
|
+
> **SEMO는 아래 키워드를 자동으로 Status 필드값으로 매핑합니다.**
|
|
1284
|
+
|
|
1285
|
+
| 사용자 입력 | → Status 값 | 비고 |
|
|
1286
|
+
|------------|-------------|------|
|
|
1287
|
+
| 리뷰요청, 리뷰 요청, review | 리뷰요청 | 코드 리뷰 대기 |
|
|
1288
|
+
| 테스트중, 테스트 중, testing, qa | 테스트중 | QA 단계 |
|
|
1289
|
+
| 작업중, 작업 중, 진행중, in progress, wip | 작업중 | 개발 중 |
|
|
1290
|
+
| 완료, done, closed | 완료 | 완료 처리 |
|
|
1291
|
+
| 백로그, 대기, pending, backlog | 백로그 | 초기 상태 |
|
|
1292
|
+
|
|
1293
|
+
**예시:**
|
|
1294
|
+
\`\`\`
|
|
1295
|
+
"리뷰요청 이슈들 테스트중으로 바꿔줘"
|
|
1296
|
+
→ Status == "리뷰요청" 인 항목들을 Status = "테스트중" 으로 변경
|
|
1297
|
+
\`\`\`
|
|
1298
|
+
|
|
1299
|
+
---
|
|
1300
|
+
|
|
1301
|
+
## 프로젝트 별칭
|
|
1302
|
+
|
|
1303
|
+
| 별칭 | 레포지토리 | 환경 | 배포 방법 |
|
|
1304
|
+
|------|-----------|------|----------|
|
|
1305
|
+
| 예시 | owner/repo | stg | Milestone close |
|
|
1306
|
+
|
|
1307
|
+
---
|
|
1308
|
+
|
|
1309
|
+
*마지막 업데이트: ${new Date().toISOString().split("T")[0]}*
|
|
1310
|
+
`;
|
|
1311
|
+
fs.writeFileSync(projectsPath, projectsContent);
|
|
1312
|
+
console.log(chalk_1.default.green("✓ .claude/memory/projects.md 생성됨"));
|
|
1313
|
+
}
|
|
1239
1314
|
// rules 디렉토리
|
|
1240
1315
|
const rulesDir = path.join(memoryDir, "rules");
|
|
1241
1316
|
fs.mkdirSync(rulesDir, { recursive: true });
|
|
@@ -1488,7 +1563,9 @@ program
|
|
|
1488
1563
|
}
|
|
1489
1564
|
console.log();
|
|
1490
1565
|
}
|
|
1491
|
-
//
|
|
1566
|
+
// 기존에 설치된 모든 Extension 패키지 스캔
|
|
1567
|
+
const previouslyInstalled = getInstalledExtensions(cwd);
|
|
1568
|
+
// 요청한 패키지 중 이미 설치된 것과 새로 설치할 것 분류
|
|
1492
1569
|
const alreadyInstalled = [];
|
|
1493
1570
|
const toInstall = [];
|
|
1494
1571
|
for (const pkg of packages) {
|
|
@@ -1515,8 +1592,8 @@ program
|
|
|
1515
1592
|
await downloadExtensions(cwd, toInstall, options.force);
|
|
1516
1593
|
// 2. settings.json 병합
|
|
1517
1594
|
await mergeExtensionSettings(cwd, toInstall);
|
|
1518
|
-
// 3. 심볼릭 링크 설정 (
|
|
1519
|
-
const allInstalledPackages = [...new Set([...
|
|
1595
|
+
// 3. 심볼릭 링크 설정 (기존 + 새로 설치한 모든 패키지 포함)
|
|
1596
|
+
const allInstalledPackages = [...new Set([...previouslyInstalled, ...toInstall])];
|
|
1520
1597
|
await setupExtensionSymlinks(cwd, allInstalledPackages);
|
|
1521
1598
|
// 4. CLAUDE.md 재생성 (모든 설치된 패키지 반영)
|
|
1522
1599
|
await setupClaudeMd(cwd, allInstalledPackages, options.force);
|