projectops 4.2.22 → 4.2.24

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/README.md CHANGED
@@ -7,7 +7,7 @@
7
7
  > 이슈 등록부터 커밋, 보고서, 배포까지. 개발자는 코드만 작성하세요.
8
8
 
9
9
  <!-- AUTO-VERSION-SECTION: DO NOT EDIT MANUALLY -->
10
- ## 최신 버전 : v4.2.21 (2026-07-20)
10
+ ## 최신 버전 : v4.2.23 (2026-07-20)
11
11
 
12
12
  [전체 버전 기록 보기](CHANGELOG.md)
13
13
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "projectops",
3
- "version": "4.2.22",
3
+ "version": "4.2.24",
4
4
  "description": "ProjectOps — 완전 자동화 GitHub 프로젝트 관리 템플릿 통합 CLI",
5
5
  "keywords": [
6
6
  "devops",
@@ -405,7 +405,14 @@ function summarize({ mode, types, version, branch, deployTarget, publishTargets,
405
405
  }
406
406
 
407
407
  function modeLabel(m) {
408
- return { full: "전체 설치", version: "버전 관리만", workflows: "워크플로우만", issues: "이슈·PR 템플릿만", skills: "AI 스킬만", update: "업데이트" }[m] || m;
408
+ return {
409
+ full: "전체 설치 (버전관리 + 워크플로우 + 템플릿)",
410
+ version: "버전 관리 전용 (자동화 시스템)",
411
+ workflows: "워크플로우 전용 (GitHub Actions 빌드, 배포)",
412
+ issues: "이슈/PR 템플릿 전용",
413
+ skills: "AI 스킬 전용 (Claude, Cursor, Gemini, Codex, PI)",
414
+ update: "업데이트"
415
+ }[m] || m;
409
416
  }
410
417
 
411
418
  function utcNow(date = new Date()) {
@@ -46,10 +46,10 @@ export async function runBreakingCheck({ cwd, tempDir, templateVersion, askYesNo
46
46
  // 긴 본문 래핑이 ║ 박스 경계를 붕괴시켰다. 버전·제목만 한 줄씩, 전문은 선택 열람.)
47
47
  const e = (s = "") => process.stderr.write(s + "\n");
48
48
  e("");
49
- e(`⚠️ BREAKING CHANGES (v${current} v${templateVersion}) CRITICAL ${critical.length} · WARNING ${warnings.length}건`);
49
+ e(`⚠️ BREAKING CHANGES (v${current} -> v${templateVersion}) - CRITICAL ${critical.length}건, WARNING ${warnings.length}건`);
50
50
  e("");
51
- for (const c of critical) e(` ❗ [CRITICAL] ${c.version} ${c.title || ""}`);
52
- for (const w of warnings) e(` ⚠️ [WARNING] ${w.version} ${w.title || ""}`);
51
+ for (const c of critical) e(` ❗ [CRITICAL] ${c.version} - ${c.title || ""}`);
52
+ for (const w of warnings) e(` ⚠️ [WARNING] ${w.version} - ${w.title || ""}`);
53
53
  e("");
54
54
 
55
55
  if (askYesNo) {
@@ -58,13 +58,13 @@ export async function runBreakingCheck({ cwd, tempDir, templateVersion, askYesNo
58
58
  if (detail === true) {
59
59
  for (const it of [...critical, ...warnings]) {
60
60
  e("");
61
- e(`■ ${it.version} ${it.title || ""}`);
61
+ e(`■ ${it.version} - ${it.title || ""}`);
62
62
  e(` ${it.message || ""}`);
63
63
  }
64
64
  e("");
65
65
  }
66
66
  } else {
67
- e(" 상세 내용·조치 방법: .github/config/breaking-changes.json 참고");
67
+ e(" 상세 내용, 조치 방법: .github/config/breaking-changes.json 참고");
68
68
  e(` (${BC_URL})`);
69
69
  e("");
70
70
  }
package/src/ui/prompts.js CHANGED
@@ -12,14 +12,14 @@ export async function selectMode({ update = null } = {}) {
12
12
  const options = [];
13
13
  if (update) {
14
14
  const range = update.from ? `v${update.from} → v${update.to}` : `v${update.to}`;
15
- options.push({ value: "update", label: `업데이트 — 저장된 설정 그대로 ${range} 반영 (추천)` });
15
+ options.push({ value: "update", label: `업데이트 (v${range})` });
16
16
  }
17
17
  options.push(
18
- { value: "full", label: `전체 설치 버전관리 + 자동화 워크플로우 + 이슈·PR 템플릿${update ? "" : " (처음이라면 추천)"}` },
19
- { value: "version", label: "버전 관리만 버전 자동 증가·동기화 시스템만 설치" },
20
- { value: "workflows", label: "워크플로우만 빌드·배포 GitHub Actions 설치" },
21
- { value: "issues", label: "이슈·PR 템플릿만 — GitHub 이슈/PR 양식만 설치" },
22
- { value: "skills", label: "AI 스킬만 Claude·Cursor·Gemini·Codex·PI용 스킬만 설치" },
18
+ { value: "full", label: "전체 설치 (버전관리 + 워크플로우 + 템플릿)" },
19
+ { value: "version", label: "버전 관리 전용 (자동화 시스템)" },
20
+ { value: "workflows", label: "워크플로우 전용 (GitHub Actions 빌드, 배포)" },
21
+ { value: "issues", label: "이슈/PR 템플릿 전용" },
22
+ { value: "skills", label: "AI 스킬 전용 (Claude, Cursor, Gemini, Codex, PI)" },
23
23
  );
24
24
  return engine.select({ message: "무엇을 설치할까요?", options });
25
25
  }
@@ -19,7 +19,7 @@ export function printDetectionLog({ types = [], version = "", branch = "" }, out
19
19
  } else {
20
20
  out(`${GUT} ${paint("─", A.dim)} 마커 파일 없음 → ${paint("basic", A.bold)} (직접 선택 가능)\n`);
21
21
  }
22
- out(`${GUT} ${OK} 버전: ${paint(`v${version}`, A.green)} · 브랜치: ${paint(branch, A.green)}\n`);
22
+ out(`${GUT} ${OK} 버전: ${paint(`v${version}`, A.green)} - 브랜치: ${paint(branch, A.green)}\n`);
23
23
  out(`${GUT}\n`);
24
24
  }
25
25
 
@@ -84,10 +84,10 @@ export function printIdeStatus(statuses, out = (s) => process.stdout.write(s)) {
84
84
  // 사용자가 "무슨 기준으로 신규/업데이트인지"를 바로 알도록 판정 근거를 화면에 밝힌다.
85
85
  export function printInstallKind({ currentTemplateVersion = "", templateVersion = "" }, out = (s) => process.stdout.write(s)) {
86
86
  if (currentTemplateVersion) {
87
- out(`${GUT} ♻️ ${paint("업데이트", A.bold)} 템플릿 ${paint(`v${currentTemplateVersion}`, A.dim)} → ${paint(`v${templateVersion}`, A.green)}\n`);
88
- out(`${GUT} ${paint("version.yml에 이전 통합 기록이 있습니다 메뉴 맨 위 '업데이트'가 저장된 설정 그대로 반영합니다", A.dim)}\n`);
87
+ out(`${GUT} ♻️ ${paint("업데이트", A.bold)} - 템플릿 ${paint(`v${currentTemplateVersion}`, A.dim)} → ${paint(`v${templateVersion}`, A.green)}\n`);
88
+ out(`${GUT} ${paint("version.yml에 이전 통합 기록이 있습니다 - 메뉴 맨 위 '업데이트'가 저장된 설정 그대로 반영합니다", A.dim)}\n`);
89
89
  } else {
90
- out(`${GUT} 🆕 ${paint("신규 통합", A.bold)} 이 프로젝트에 처음 설치합니다 (템플릿 ${paint(`v${templateVersion}`, A.green)})\n`);
90
+ out(`${GUT} 🆕 ${paint("신규 통합", A.bold)} - 이 프로젝트에 처음 설치합니다 (템플릿 ${paint(`v${templateVersion}`, A.green)})\n`);
91
91
  out(`${GUT} ${paint("version.yml에 이전 통합 기록이 없어 신규로 봅니다", A.dim)}\n`);
92
92
  }
93
93
  out(`${GUT}\n`);