relayax-cli 0.2.29 → 0.2.30

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.
@@ -435,6 +435,30 @@ function registerPublish(program) {
435
435
  }));
436
436
  process.exit(1);
437
437
  }
438
+ // Version bump suggestion for republishing
439
+ if (isTTY) {
440
+ const { select: promptVersion } = await import('@inquirer/prompts');
441
+ const [major, minor, patch] = config.version.split('.').map(Number);
442
+ const bumpPatch = `${major}.${minor}.${patch + 1}`;
443
+ const bumpMinor = `${major}.${minor + 1}.0`;
444
+ const bumpMajor = `${major + 1}.0.0`;
445
+ const newVersion = await promptVersion({
446
+ message: `버전 (현재 v${config.version}):`,
447
+ choices: [
448
+ { name: `v${bumpPatch} — patch (버그 수정)`, value: bumpPatch },
449
+ { name: `v${bumpMinor} — minor (기능 추가)`, value: bumpMinor },
450
+ { name: `v${bumpMajor} — major (큰 변경)`, value: bumpMajor },
451
+ { name: `v${config.version} — 유지`, value: config.version },
452
+ ],
453
+ });
454
+ if (newVersion !== config.version) {
455
+ config.version = newVersion;
456
+ const yamlData = js_yaml_1.default.load(fs_1.default.readFileSync(relayYamlPath, 'utf-8'));
457
+ yamlData.version = newVersion;
458
+ fs_1.default.writeFileSync(relayYamlPath, js_yaml_1.default.dump(yamlData, { lineWidth: 120 }), 'utf-8');
459
+ console.error(` → relay.yaml에 version: ${newVersion} 저장됨\n`);
460
+ }
461
+ }
438
462
  // Visibility validation: must be explicitly set
439
463
  if (!config.visibility) {
440
464
  if (isTTY) {
@@ -480,12 +504,27 @@ function registerPublish(program) {
480
504
  process.exit(1);
481
505
  }
482
506
  }
483
- // Confirm visibility before publish
507
+ // Confirm visibility before publish (재배포 시 변경 기회 제공)
484
508
  if (isTTY) {
509
+ const { select: promptConfirmVis } = await import('@inquirer/prompts');
485
510
  const visLabel = config.visibility === 'public'
486
511
  ? '\x1b[32m공개\x1b[0m (마켓플레이스에 누구나 검색·설치)'
487
512
  : '\x1b[33m비공개\x1b[0m (Space 멤버만 접근)';
488
- console.error(`공개 범위: ${visLabel}`);
513
+ const visAction = await promptConfirmVis({
514
+ message: `공개 범위: ${config.visibility === 'public' ? '공개' : '비공개'} — 유지할까요?`,
515
+ choices: [
516
+ { name: `유지 — ${visLabel}`, value: 'keep' },
517
+ { name: '변경', value: 'change' },
518
+ ],
519
+ });
520
+ if (visAction === 'change') {
521
+ config.visibility = config.visibility === 'public' ? 'private' : 'public';
522
+ const yamlData = js_yaml_1.default.load(fs_1.default.readFileSync(relayYamlPath, 'utf-8'));
523
+ yamlData.visibility = config.visibility;
524
+ fs_1.default.writeFileSync(relayYamlPath, js_yaml_1.default.dump(yamlData, { lineWidth: 120 }), 'utf-8');
525
+ const newLabel = config.visibility === 'public' ? '공개' : '비공개';
526
+ console.error(` → relay.yaml에 visibility: ${config.visibility} 저장됨 (${newLabel})\n`);
527
+ }
489
528
  }
490
529
  // Profile hint
491
530
  if (isTTY) {
@@ -183,11 +183,28 @@ slug가 직접 주어지면 (\`/relay-install @alice/doc-writer\`) 이 단계를
183
183
  - CLI가 init과 login을 자동으로 처리합니다 (사용자가 별도 실행할 필요 없음).
184
184
  - JSON 출력에서 \`install_path\` (패키지 경로)를 확인합니다.
185
185
 
186
- #### 2-2. 배치 범위 선택
186
+ #### 2-2. 배치 범위 선택 (추천 포함)
187
+
188
+ 팀의 성격을 분석하여 글로벌/로컬 중 적합한 쪽을 추천합니다.
189
+
190
+ **추천 로직:**
191
+ - **글로벌 추천** — 범용 유틸리티 팀: 코드 리뷰, 문서 생성, 테스트, 번역 등 프로젝트에 무관하게 사용하는 도구성 팀
192
+ - **로컬 추천** — 프로젝트 특화 팀: 특정 프레임워크/스택 전용, 프로젝트별 워크플로우, 팀 내부 컨벤션에 의존하는 팀
193
+
194
+ 판단 기준 (다운로드된 패키지의 relay.yaml과 콘텐츠를 분석):
195
+ 1. \`tags\`에 특정 프레임워크/스택 키워드가 있으면 (nextjs, supabase, react 등) → 로컬 추천
196
+ 2. \`requires\`에 프로젝트 종속 의존성이 있으면 (npm 패키지, 특정 파일 구조) → 로컬 추천
197
+ 3. rules/ 파일이 있으면 (프로젝트 컨벤션 주입) → 로컬 추천
198
+ 4. 범용 키워드 (utility, review, docs, testing 등) → 글로벌 추천
199
+ 5. 판단이 어려우면 → 글로벌 추천 (기본값)
187
200
 
188
201
  **AskUserQuestion 호출:**
189
- - question: "어디에 설치할까요?"
190
- - options: \`["글로벌 (모든 프로젝트)", "로컬 (이 프로젝트만)"]\`
202
+ - question: "{추천 이유}. {추천}에 설치할까요?"
203
+ - options: \`["글로벌 (모든 프로젝트) ✓ 추천", "로컬 (이 프로젝트만)"]\` 또는 \`["글로벌 (모든 프로젝트)", "로컬 (이 프로젝트만) ✓ 추천"]\`
204
+
205
+ 예시:
206
+ - "범용 코드 리뷰 도구입니다. 글로벌에 설치할까요?" → \`["글로벌 (모든 프로젝트) ✓ 추천", "로컬 (이 프로젝트만)"]\`
207
+ - "Next.js + Supabase 전용 팀입니다. 이 프로젝트에 설치할까요?" → \`["글로벌 (모든 프로젝트)", "로컬 (이 프로젝트만) ✓ 추천"]\`
191
208
 
192
209
  **응답 처리:**
193
210
  - "글로벌" → \`~/.claude/\`에 배치
@@ -401,7 +418,21 @@ ${LOGIN_JIT_GUIDE}
401
418
 
402
419
  ## 인터랙션 플로우
403
420
 
404
- 이 커맨드는 5단계 인터랙션으로 진행됩니다. 각 단계에서 반드시 AskUserQuestion 도구를 사용하세요.
421
+ 이 커맨드는 6단계 인터랙션으로 진행됩니다. 각 단계에서 반드시 AskUserQuestion 도구를 사용하세요.
422
+
423
+ ### Step 0. 버전 범프
424
+
425
+ relay.yaml의 현재 \`version\`을 읽고 semver 범프를 제안합니다.
426
+
427
+ **AskUserQuestion 호출:**
428
+ - question: "버전을 올릴까요? (현재 v{version})"
429
+ - options: \`["v{patch} — patch (버그 수정)", "v{minor} — minor (기능 추가)", "v{major} — major (큰 변경)", "v{version} — 유지"]\`
430
+
431
+ 예시: 현재 v1.0.0이면 → \`["v1.0.1 — patch", "v1.1.0 — minor", "v2.0.0 — major", "v1.0.0 — 유지"]\`
432
+
433
+ **응답 처리:**
434
+ - 유지 외 선택 → relay.yaml의 version을 선택된 값으로 업데이트
435
+ - 유지 → 그대로 진행
405
436
 
406
437
  ### Step 1. 공개 범위 선택
407
438
 
@@ -604,7 +635,7 @@ requires: env 2개, cli 1개
604
635
  - options: \`["배포", "취소"]\`
605
636
 
606
637
  **응답 처리:**
607
- - "배포" → \`relay publish\` 실행
638
+ - "배포" → \`relay publish --json\` 실행 (슬래시 커맨드에서 이미 버전/visibility를 relay.yaml에 저장했으므로 --json으로 인터랙티브 프롬프트 생략)
608
639
  - "취소" → 중단
609
640
 
610
641
  #### 5-3. 배포 완료 & 온보딩 가이드
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "relayax-cli",
3
- "version": "0.2.29",
3
+ "version": "0.2.30",
4
4
  "description": "RelayAX Agent Team Marketplace CLI - Install and manage agent teams",
5
5
  "main": "dist/index.js",
6
6
  "bin": {