relayax-cli 0.3.64 → 0.3.66
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/install.js +146 -41
- package/dist/commands/publish.js +59 -41
- package/dist/commands/uninstall.js +20 -4
- package/dist/commands/update.js +67 -31
- package/dist/lib/command-adapter.js +8 -9
- package/dist/lib/guide.d.ts +0 -1
- package/dist/lib/guide.js +27 -77
- package/dist/lib/installer.d.ts +32 -0
- package/dist/lib/installer.js +265 -0
- package/dist/mcp/server.js +23 -0
- package/dist/prompts/create.md +62 -0
- package/dist/prompts/explore.md +28 -0
- package/dist/prompts/index.d.ts +2 -7
- package/dist/prompts/index.js +4 -11
- package/dist/types.d.ts +3 -1
- package/package.json +1 -1
package/dist/mcp/server.js
CHANGED
|
@@ -677,6 +677,29 @@ function createMcpServer() {
|
|
|
677
677
|
return { content: [jsonText({ error: String(err) })], isError: true };
|
|
678
678
|
}
|
|
679
679
|
});
|
|
680
|
+
// ═══ relay_guide — 에이전트 설치 가이드 조회 ═══
|
|
681
|
+
server.tool('relay_guide', '에이전트 설치 가이드를 조회합니다. URL을 fetch할 수 없는 샌드박스 환경에서 사용하세요.', {
|
|
682
|
+
slug: zod_1.z.string().describe('에이전트 slug (예: @owner/name)'),
|
|
683
|
+
code: zod_1.z.string().optional().describe('접근 코드 (비공개 에이전트용)'),
|
|
684
|
+
}, async ({ slug: slugInput, code }) => {
|
|
685
|
+
try {
|
|
686
|
+
const parsed = await (0, slug_js_1.resolveSlug)(slugInput);
|
|
687
|
+
let url = `${config_js_1.API_URL}/api/registry/${parsed.owner}/${parsed.name}/guide.md`;
|
|
688
|
+
if (code)
|
|
689
|
+
url += `?code=${encodeURIComponent(code)}`;
|
|
690
|
+
const res = await fetch(url);
|
|
691
|
+
if (!res.ok) {
|
|
692
|
+
if (res.status === 404)
|
|
693
|
+
throw new Error('에이전트를 찾을 수 없습니다.');
|
|
694
|
+
throw new Error(`가이드를 가져올 수 없습니다 (${res.status})`);
|
|
695
|
+
}
|
|
696
|
+
const guide = await res.text();
|
|
697
|
+
return { content: [{ type: 'text', text: guide }] };
|
|
698
|
+
}
|
|
699
|
+
catch (err) {
|
|
700
|
+
return { content: [jsonText({ error: String(err) })], isError: true };
|
|
701
|
+
}
|
|
702
|
+
});
|
|
680
703
|
// ═══ relay_init — slash command 설치 ═══
|
|
681
704
|
server.tool('relay_init', 'relay slash command를 설치합니다 (/relay-install, /relay-publish 등)', {}, async () => {
|
|
682
705
|
try {
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
에이전트 패키지를 새로 만듭니다.
|
|
2
|
+
콘텐츠를 분석하고, 포지셔닝하고, relay.yaml을 작성한 뒤 배포합니다.
|
|
3
|
+
|
|
4
|
+
> 빌더는 터미널 환경에서 작업합니다. CLI 명령어를 직접 실행하세요.
|
|
5
|
+
|
|
6
|
+
## 1. 콘텐츠 파악
|
|
7
|
+
|
|
8
|
+
`relay package --init --json`으로 소스를 스캔합니다.
|
|
9
|
+
결과의 `sources[]`에서 사용자에게 어떤 콘텐츠를 포함할지 물어봅니다.
|
|
10
|
+
|
|
11
|
+
선택된 콘텐츠의 파일을 직접 읽어 기능을 파악합니다:
|
|
12
|
+
- SKILL.md, 에이전트 파일, 커맨드 파일의 내용
|
|
13
|
+
- 참조하는 스킬/에이전트 의존성
|
|
14
|
+
|
|
15
|
+
## 2. 포지셔닝
|
|
16
|
+
|
|
17
|
+
콘텐츠 분석을 기반으로 에이전트를 하나의 "제품"으로 포지셔닝합니다.
|
|
18
|
+
|
|
19
|
+
분석 관점:
|
|
20
|
+
- 이 에이전트가 **무엇을 하는** 에이전트인지
|
|
21
|
+
- 어떤 **기술 스택/도메인**에 특화되어 있는지
|
|
22
|
+
- 설치자에게 **어떤 가치**를 제공하는지
|
|
23
|
+
|
|
24
|
+
이름(name)은 한국어 가능. slug는 영문 소문자+하이픈.
|
|
25
|
+
설명은 설치자 관점으로 ("~를 자동화합니다").
|
|
26
|
+
|
|
27
|
+
## 3. requires 판단
|
|
28
|
+
|
|
29
|
+
콘텐츠 파일을 읽고 requires를 판단합니다:
|
|
30
|
+
|
|
31
|
+
- **env**: 환경변수 참조를 찾고 맥락에서 필수/선택 판단
|
|
32
|
+
- 핵심 로직에서 사용 → `required: true`
|
|
33
|
+
- 테스트/선택 기능에서 사용 → `required: false`
|
|
34
|
+
- **cli**: 외부 CLI 도구 참조 (playwright, ffmpeg 등)
|
|
35
|
+
- **npm**: import/require 패키지
|
|
36
|
+
- **mcp**: MCP 서버 참조 (supabase, github 등)
|
|
37
|
+
- **runtime**: Node.js/Python 최소 버전
|
|
38
|
+
- **agents**: 의존하는 다른 relay 에이전트
|
|
39
|
+
|
|
40
|
+
## 4. 보안 점검
|
|
41
|
+
|
|
42
|
+
콘텐츠 파일에서 시크릿/개인정보를 확인합니다:
|
|
43
|
+
- 하드코딩된 API 키, 토큰 (sk-*, ghp_*, AKIA* 등)
|
|
44
|
+
- 이메일, 전화번호 등 개인정보
|
|
45
|
+
- 발견 시 **반드시 경고**하고 환경변수 대체 안내
|
|
46
|
+
- 파일 컨텍스트를 읽어 실제 시크릿 vs 예시 코드를 구분
|
|
47
|
+
|
|
48
|
+
## 5. relay.yaml 작성 & 배포
|
|
49
|
+
|
|
50
|
+
판단 결과를 relay.yaml에 반영합니다:
|
|
51
|
+
- name, slug, description, version, tags
|
|
52
|
+
- requires (판단 결과)
|
|
53
|
+
- visibility, org (사용자에게 확인)
|
|
54
|
+
|
|
55
|
+
`relay publish --json`으로 배포합니다.
|
|
56
|
+
|
|
57
|
+
## 6. 공유 문구
|
|
58
|
+
|
|
59
|
+
배포 완료 후 `relay publish` 출력에 포함된 공유 문구를 보여줍니다.
|
|
60
|
+
CLI가 이미 설치된 사용자를 위한 짧은 버전도 함께 표시합니다.
|
|
61
|
+
|
|
62
|
+
{{ERROR_HANDLING_GUIDE}}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
프로젝트에 맞는 에이전트를 찾아 추천하고 설치합니다.
|
|
2
|
+
|
|
3
|
+
## 프로젝트 분석
|
|
4
|
+
|
|
5
|
+
현재 프로젝트의 기술 스택, 구조, 패턴을 파악합니다:
|
|
6
|
+
- 사용 중인 프레임워크/라이브러리 (package.json, import 패턴)
|
|
7
|
+
- 프로젝트 구조 (디렉토리 레이아웃, 주요 파일)
|
|
8
|
+
- 기존 설치된 에이전트 (`relay list --json`)
|
|
9
|
+
|
|
10
|
+
## 에이전트 검색
|
|
11
|
+
|
|
12
|
+
`relay search <keyword>` 명령어로 검색합니다.
|
|
13
|
+
프로젝트 컨텍스트에 맞는 키워드를 선택합니다 (기술 스택, 작업 유형 등).
|
|
14
|
+
여러 키워드로 반복 검색하여 폭넓게 탐색합니다.
|
|
15
|
+
|
|
16
|
+
## 추천
|
|
17
|
+
|
|
18
|
+
검색 결과 중 프로젝트에 가장 적합한 에이전트를 추천합니다:
|
|
19
|
+
- 추천 이유를 프로젝트 컨텍스트와 연결하여 설명
|
|
20
|
+
- 에이전트의 주요 커맨드/기능을 요약
|
|
21
|
+
|
|
22
|
+
## 설치
|
|
23
|
+
|
|
24
|
+
사용자가 선택하면 `relay install <slug>` 을 실행합니다.
|
|
25
|
+
|
|
26
|
+
scope 결정 기준:
|
|
27
|
+
- 범용 도구 (코드 리뷰, 문서 생성, 테스트) → `relay install <slug>` (글로벌 기본)
|
|
28
|
+
- 프로젝트 특화 (특정 프레임워크, 팀 컨벤션) → `relay install <slug> --local`
|
package/dist/prompts/index.d.ts
CHANGED
|
@@ -1,8 +1,3 @@
|
|
|
1
|
-
export declare const REQUIREMENTS_CHECK: string;
|
|
2
1
|
export declare const ERROR_HANDLING_GUIDE: string;
|
|
3
|
-
export declare const
|
|
4
|
-
export declare const
|
|
5
|
-
export declare const SETUP_LOGIN: string;
|
|
6
|
-
export declare const GUIDE_INSTRUCTION: string;
|
|
7
|
-
export declare const INSTALL_PROMPT: string;
|
|
8
|
-
export declare const PUBLISH_PROMPT: string;
|
|
2
|
+
export declare const EXPLORE_PROMPT: string;
|
|
3
|
+
export declare const CREATE_PROMPT: string;
|
package/dist/prompts/index.js
CHANGED
|
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.
|
|
6
|
+
exports.CREATE_PROMPT = exports.EXPLORE_PROMPT = exports.ERROR_HANDLING_GUIDE = void 0;
|
|
7
7
|
const fs_1 = __importDefault(require("fs"));
|
|
8
8
|
const path_1 = __importDefault(require("path"));
|
|
9
9
|
function readPrompt(filename) {
|
|
@@ -13,17 +13,10 @@ function interpolate(template, vars) {
|
|
|
13
13
|
return template.replace(/\{\{(\w+)\}\}/g, (_, key) => vars[key] ?? `{{${key}}}`);
|
|
14
14
|
}
|
|
15
15
|
// ─── 공유 조각 ───
|
|
16
|
-
exports.REQUIREMENTS_CHECK = readPrompt('_requirements-check.md');
|
|
17
16
|
exports.ERROR_HANDLING_GUIDE = readPrompt('_error-handling.md');
|
|
18
|
-
exports.SETUP_ENVIRONMENT = readPrompt('_setup-environment.md');
|
|
19
|
-
exports.SETUP_CLI = readPrompt('_setup-cli.md');
|
|
20
|
-
exports.SETUP_LOGIN = readPrompt('_setup-login.md');
|
|
21
|
-
exports.GUIDE_INSTRUCTION = readPrompt('_guide-instruction.md');
|
|
22
17
|
const fragments = {
|
|
23
|
-
REQUIREMENTS_CHECK: exports.REQUIREMENTS_CHECK,
|
|
24
18
|
ERROR_HANDLING_GUIDE: exports.ERROR_HANDLING_GUIDE,
|
|
25
|
-
GUIDE_INSTRUCTION: exports.GUIDE_INSTRUCTION,
|
|
26
19
|
};
|
|
27
|
-
// ───
|
|
28
|
-
exports.
|
|
29
|
-
exports.
|
|
20
|
+
// ─── 프롬프트 ───
|
|
21
|
+
exports.EXPLORE_PROMPT = interpolate(readPrompt('explore.md'), fragments);
|
|
22
|
+
exports.CREATE_PROMPT = interpolate(readPrompt('create.md'), fragments);
|
package/dist/types.d.ts
CHANGED
|
@@ -14,8 +14,10 @@ export interface InstalledAgent {
|
|
|
14
14
|
org_slug?: string;
|
|
15
15
|
/** 배치 범위 — 에이전트가 relay deploy-record로 기록 */
|
|
16
16
|
deploy_scope?: 'global' | 'local';
|
|
17
|
-
/** 배치된 파일 절대경로 목록 — 에이전트가 relay deploy-record로 기록 */
|
|
17
|
+
/** 배치된 파일 절대경로 목록 — 에이전트가 relay deploy-record로 기록 (legacy) */
|
|
18
18
|
deployed_files?: string[];
|
|
19
|
+
/** symlink 절대경로 목록 — relay install이 직접 기록 */
|
|
20
|
+
deployed_symlinks?: string[];
|
|
19
21
|
}
|
|
20
22
|
/** 키는 scoped slug 포맷: "@owner/name" */
|
|
21
23
|
export interface InstalledRegistry {
|