relayax-cli 0.2.28 → 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.
- package/dist/commands/init.js +2 -1
- package/dist/commands/publish.js +41 -2
- package/dist/lib/command-adapter.js +45 -8
- package/package.json +1 -1
package/dist/commands/init.js
CHANGED
|
@@ -150,8 +150,9 @@ function registerInit(program) {
|
|
|
150
150
|
(0, config_js_1.saveInstalled)(installed);
|
|
151
151
|
}
|
|
152
152
|
// ── 2. 로컬 Builder 커맨드 (팀 프로젝트인 경우) ──
|
|
153
|
+
// relay-publish가 글로벌로 승격되어 BUILDER_COMMANDS가 비어있으면 스킵
|
|
153
154
|
const localResults = [];
|
|
154
|
-
if (isBuilder) {
|
|
155
|
+
if (isBuilder && command_adapter_js_1.BUILDER_COMMANDS.length > 0) {
|
|
155
156
|
// 도구 선택
|
|
156
157
|
let targetToolIds;
|
|
157
158
|
if (opts.update) {
|
package/dist/commands/publish.js
CHANGED
|
@@ -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
|
-
|
|
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/\`에 배치
|
|
@@ -377,14 +394,16 @@ ${LOGIN_JIT_GUIDE}
|
|
|
377
394
|
→ relay uninstall @alice/doc-writer --json 실행
|
|
378
395
|
→ "✓ @alice/doc-writer 삭제 완료 (12개 파일 제거)"`,
|
|
379
396
|
},
|
|
380
|
-
];
|
|
381
|
-
// ─── Builder Commands (로컬 설치) ───
|
|
382
|
-
exports.BUILDER_COMMANDS = [
|
|
383
397
|
{
|
|
384
398
|
id: 'relay-publish',
|
|
385
399
|
description: '현재 팀 패키지를 포트폴리오와 함께 relay 마켓플레이스에 배포합니다',
|
|
386
400
|
body: `현재 디렉토리의 에이전트 팀(.relay/)을 분석하고, 보안 점검 및 requirements를 구성한 뒤, 사용가이드와 포트폴리오를 생성하고 relay 마켓플레이스에 배포합니다.
|
|
387
401
|
|
|
402
|
+
## 사전 확인
|
|
403
|
+
|
|
404
|
+
이 커맨드는 빌더 프로젝트(.relay/ 디렉토리)에서만 실행할 수 있습니다.
|
|
405
|
+
.relay/ 디렉토리가 없으면: "이 프로젝트에는 .relay/ 디렉토리가 없습니다. \`relay create <name>\`으로 팀을 먼저 만들어주세요." 안내 후 종료합니다.
|
|
406
|
+
|
|
388
407
|
## 사전 준비 (자동)
|
|
389
408
|
|
|
390
409
|
### 0-1. 인증 확인
|
|
@@ -399,7 +418,21 @@ ${LOGIN_JIT_GUIDE}
|
|
|
399
418
|
|
|
400
419
|
## 인터랙션 플로우
|
|
401
420
|
|
|
402
|
-
이 커맨드는
|
|
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
|
+
- 유지 → 그대로 진행
|
|
403
436
|
|
|
404
437
|
### Step 1. 공개 범위 선택
|
|
405
438
|
|
|
@@ -602,7 +635,7 @@ requires: env 2개, cli 1개
|
|
|
602
635
|
- options: \`["배포", "취소"]\`
|
|
603
636
|
|
|
604
637
|
**응답 처리:**
|
|
605
|
-
- "배포" → \`relay publish\` 실행
|
|
638
|
+
- "배포" → \`relay publish --json\` 실행 (슬래시 커맨드에서 이미 버전/visibility를 relay.yaml에 저장했으므로 --json으로 인터랙티브 프롬프트 생략)
|
|
606
639
|
- "취소" → 중단
|
|
607
640
|
|
|
608
641
|
#### 5-3. 배포 완료 & 온보딩 가이드
|
|
@@ -643,3 +676,7 @@ ${BUSINESS_CARD_FORMAT}
|
|
|
643
676
|
→ 온보딩 가이드 코드블록 표시`,
|
|
644
677
|
},
|
|
645
678
|
];
|
|
679
|
+
// ─── Builder Commands (로컬 설치) ───
|
|
680
|
+
// relay-publish가 글로벌로 승격되어 현재 비어있음.
|
|
681
|
+
// relay init --update만 실행하면 모든 커맨드가 한번에 업데이트됨.
|
|
682
|
+
exports.BUILDER_COMMANDS = [];
|