@tekton-ui/mcp-server 0.3.0
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/LICENSE +21 -0
- package/README.md +980 -0
- package/dist/auth/cache.d.ts +28 -0
- package/dist/auth/cache.d.ts.map +1 -0
- package/dist/auth/cache.js +48 -0
- package/dist/auth/cache.js.map +1 -0
- package/dist/auth/guard.d.ts +13 -0
- package/dist/auth/guard.d.ts.map +1 -0
- package/dist/auth/guard.js +21 -0
- package/dist/auth/guard.js.map +1 -0
- package/dist/auth/state.d.ts +32 -0
- package/dist/auth/state.d.ts.map +1 -0
- package/dist/auth/state.js +72 -0
- package/dist/auth/state.js.map +1 -0
- package/dist/auth/theme-access.d.ts +10 -0
- package/dist/auth/theme-access.d.ts.map +1 -0
- package/dist/auth/theme-access.js +24 -0
- package/dist/auth/theme-access.js.map +1 -0
- package/dist/auth/verify.d.ts +44 -0
- package/dist/auth/verify.d.ts.map +1 -0
- package/dist/auth/verify.js +77 -0
- package/dist/auth/verify.js.map +1 -0
- package/dist/cli/credentials.d.ts +29 -0
- package/dist/cli/credentials.d.ts.map +1 -0
- package/dist/cli/credentials.js +66 -0
- package/dist/cli/credentials.js.map +1 -0
- package/dist/cli/index.d.ts +7 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +36 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/login.d.ts +9 -0
- package/dist/cli/login.d.ts.map +1 -0
- package/dist/cli/login.js +120 -0
- package/dist/cli/login.js.map +1 -0
- package/dist/cli/logout.d.ts +9 -0
- package/dist/cli/logout.d.ts.map +1 -0
- package/dist/cli/logout.js +18 -0
- package/dist/cli/logout.js.map +1 -0
- package/dist/cli/status.d.ts +9 -0
- package/dist/cli/status.d.ts.map +1 -0
- package/dist/cli/status.js +31 -0
- package/dist/cli/status.js.map +1 -0
- package/dist/data/component-registry.d.ts +30 -0
- package/dist/data/component-registry.d.ts.map +1 -0
- package/dist/data/component-registry.js +320 -0
- package/dist/data/component-registry.js.map +1 -0
- package/dist/data/examples/screen-examples.d.ts +38 -0
- package/dist/data/examples/screen-examples.d.ts.map +1 -0
- package/dist/data/examples/screen-examples.js +500 -0
- package/dist/data/examples/screen-examples.js.map +1 -0
- package/dist/data/hint-generator.d.ts +16 -0
- package/dist/data/hint-generator.d.ts.map +1 -0
- package/dist/data/hint-generator.js +298 -0
- package/dist/data/hint-generator.js.map +1 -0
- package/dist/data/recipe-resolver.d.ts +48 -0
- package/dist/data/recipe-resolver.d.ts.map +1 -0
- package/dist/data/recipe-resolver.js +226 -0
- package/dist/data/recipe-resolver.js.map +1 -0
- package/dist/data/template-matcher.d.ts +50 -0
- package/dist/data/template-matcher.d.ts.map +1 -0
- package/dist/data/template-matcher.js +240 -0
- package/dist/data/template-matcher.js.map +1 -0
- package/dist/generators/core-resolver.d.ts +56 -0
- package/dist/generators/core-resolver.d.ts.map +1 -0
- package/dist/generators/core-resolver.js +490 -0
- package/dist/generators/core-resolver.js.map +1 -0
- package/dist/generators/css-generator.d.ts +49 -0
- package/dist/generators/css-generator.d.ts.map +1 -0
- package/dist/generators/css-generator.js +294 -0
- package/dist/generators/css-generator.js.map +1 -0
- package/dist/generators/index.d.ts +13 -0
- package/dist/generators/index.d.ts.map +1 -0
- package/dist/generators/index.js +16 -0
- package/dist/generators/index.js.map +1 -0
- package/dist/generators/llm-generator.d.ts +96 -0
- package/dist/generators/llm-generator.d.ts.map +1 -0
- package/dist/generators/llm-generator.js +296 -0
- package/dist/generators/llm-generator.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +818 -0
- package/dist/index.js.map +1 -0
- package/dist/schemas/mcp-schemas.d.ts +4132 -0
- package/dist/schemas/mcp-schemas.d.ts.map +1 -0
- package/dist/schemas/mcp-schemas.js +946 -0
- package/dist/schemas/mcp-schemas.js.map +1 -0
- package/dist/storage/blueprint-storage.d.ts +68 -0
- package/dist/storage/blueprint-storage.d.ts.map +1 -0
- package/dist/storage/blueprint-storage.js +135 -0
- package/dist/storage/blueprint-storage.js.map +1 -0
- package/dist/storage/timestamp-manager.d.ts +32 -0
- package/dist/storage/timestamp-manager.d.ts.map +1 -0
- package/dist/storage/timestamp-manager.js +59 -0
- package/dist/storage/timestamp-manager.js.map +1 -0
- package/dist/tools/export-screen.d.ts +34 -0
- package/dist/tools/export-screen.d.ts.map +1 -0
- package/dist/tools/export-screen.js +344 -0
- package/dist/tools/export-screen.js.map +1 -0
- package/dist/tools/generate-blueprint.d.ts +15 -0
- package/dist/tools/generate-blueprint.d.ts.map +1 -0
- package/dist/tools/generate-blueprint.js +165 -0
- package/dist/tools/generate-blueprint.js.map +1 -0
- package/dist/tools/generate-screen.d.ts +13 -0
- package/dist/tools/generate-screen.d.ts.map +1 -0
- package/dist/tools/generate-screen.js +82 -0
- package/dist/tools/generate-screen.js.map +1 -0
- package/dist/tools/get-screen-generation-context.d.ts +11 -0
- package/dist/tools/get-screen-generation-context.d.ts.map +1 -0
- package/dist/tools/get-screen-generation-context.js +316 -0
- package/dist/tools/get-screen-generation-context.js.map +1 -0
- package/dist/tools/list-components.d.ts +15 -0
- package/dist/tools/list-components.d.ts.map +1 -0
- package/dist/tools/list-components.js +46 -0
- package/dist/tools/list-components.js.map +1 -0
- package/dist/tools/list-icon-libraries.d.ts +12 -0
- package/dist/tools/list-icon-libraries.d.ts.map +1 -0
- package/dist/tools/list-icon-libraries.js +48 -0
- package/dist/tools/list-icon-libraries.js.map +1 -0
- package/dist/tools/list-screen-templates.d.ts +15 -0
- package/dist/tools/list-screen-templates.d.ts.map +1 -0
- package/dist/tools/list-screen-templates.js +63 -0
- package/dist/tools/list-screen-templates.js.map +1 -0
- package/dist/tools/list-themes.d.ts +13 -0
- package/dist/tools/list-themes.d.ts.map +1 -0
- package/dist/tools/list-themes.js +42 -0
- package/dist/tools/list-themes.js.map +1 -0
- package/dist/tools/list-tokens.d.ts +13 -0
- package/dist/tools/list-tokens.d.ts.map +1 -0
- package/dist/tools/list-tokens.js +92 -0
- package/dist/tools/list-tokens.js.map +1 -0
- package/dist/tools/preview-component.d.ts +18 -0
- package/dist/tools/preview-component.d.ts.map +1 -0
- package/dist/tools/preview-component.js +178 -0
- package/dist/tools/preview-component.js.map +1 -0
- package/dist/tools/preview-icon-library.d.ts +13 -0
- package/dist/tools/preview-icon-library.d.ts.map +1 -0
- package/dist/tools/preview-icon-library.js +63 -0
- package/dist/tools/preview-icon-library.js.map +1 -0
- package/dist/tools/preview-screen-template.d.ts +18 -0
- package/dist/tools/preview-screen-template.d.ts.map +1 -0
- package/dist/tools/preview-screen-template.js +101 -0
- package/dist/tools/preview-screen-template.js.map +1 -0
- package/dist/tools/preview-theme.d.ts +15 -0
- package/dist/tools/preview-theme.d.ts.map +1 -0
- package/dist/tools/preview-theme.js +71 -0
- package/dist/tools/preview-theme.js.map +1 -0
- package/dist/tools/validate-environment.d.ts +37 -0
- package/dist/tools/validate-environment.d.ts.map +1 -0
- package/dist/tools/validate-environment.js +153 -0
- package/dist/tools/validate-environment.js.map +1 -0
- package/dist/tools/validate-screen-definition.d.ts +10 -0
- package/dist/tools/validate-screen-definition.d.ts.map +1 -0
- package/dist/tools/validate-screen-definition.js +463 -0
- package/dist/tools/validate-screen-definition.js.map +1 -0
- package/dist/tools/validate-screen.d.ts +13 -0
- package/dist/tools/validate-screen.d.ts.map +1 -0
- package/dist/tools/validate-screen.js +106 -0
- package/dist/tools/validate-screen.js.map +1 -0
- package/dist/utils/dependency-extractor.d.ts +13 -0
- package/dist/utils/dependency-extractor.d.ts.map +1 -0
- package/dist/utils/dependency-extractor.js +232 -0
- package/dist/utils/dependency-extractor.js.map +1 -0
- package/dist/utils/error-handler.d.ts +29 -0
- package/dist/utils/error-handler.d.ts.map +1 -0
- package/dist/utils/error-handler.js +48 -0
- package/dist/utils/error-handler.js.map +1 -0
- package/dist/utils/logger.d.ts +8 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +14 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/package-json-reader.d.ts +37 -0
- package/dist/utils/package-json-reader.d.ts.map +1 -0
- package/dist/utils/package-json-reader.js +108 -0
- package/dist/utils/package-json-reader.js.map +1 -0
- package/dist/utils/tailwind-config-reader.d.ts +23 -0
- package/dist/utils/tailwind-config-reader.d.ts.map +1 -0
- package/dist/utils/tailwind-config-reader.js +81 -0
- package/dist/utils/tailwind-config-reader.js.map +1 -0
- package/package.json +72 -0
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Simple in-memory cache with TTL support
|
|
3
|
+
* SPEC-DEPLOY-001 Phase 4.1: MCP Server Authentication Layer
|
|
4
|
+
*/
|
|
5
|
+
export declare class MemoryCache<T> {
|
|
6
|
+
private cache;
|
|
7
|
+
/**
|
|
8
|
+
* Set a cache entry with TTL in milliseconds
|
|
9
|
+
*/
|
|
10
|
+
set(key: string, value: T, ttlMs: number): void;
|
|
11
|
+
/**
|
|
12
|
+
* Get a cache entry if it exists and hasn't expired
|
|
13
|
+
*/
|
|
14
|
+
get(key: string): T | null;
|
|
15
|
+
/**
|
|
16
|
+
* Clear a specific cache entry
|
|
17
|
+
*/
|
|
18
|
+
delete(key: string): void;
|
|
19
|
+
/**
|
|
20
|
+
* Clear all cache entries
|
|
21
|
+
*/
|
|
22
|
+
clear(): void;
|
|
23
|
+
/**
|
|
24
|
+
* Get cache size
|
|
25
|
+
*/
|
|
26
|
+
size(): number;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/auth/cache.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,qBAAa,WAAW,CAAC,CAAC;IACxB,OAAO,CAAC,KAAK,CAAoC;IAEjD;;OAEG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAK/C;;OAEG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI;IAgB1B;;OAEG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAIzB;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,IAAI,IAAI,MAAM;CAGf"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Simple in-memory cache with TTL support
|
|
3
|
+
* SPEC-DEPLOY-001 Phase 4.1: MCP Server Authentication Layer
|
|
4
|
+
*/
|
|
5
|
+
export class MemoryCache {
|
|
6
|
+
cache = new Map();
|
|
7
|
+
/**
|
|
8
|
+
* Set a cache entry with TTL in milliseconds
|
|
9
|
+
*/
|
|
10
|
+
set(key, value, ttlMs) {
|
|
11
|
+
const expiresAt = Date.now() + ttlMs;
|
|
12
|
+
this.cache.set(key, { value, expiresAt });
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Get a cache entry if it exists and hasn't expired
|
|
16
|
+
*/
|
|
17
|
+
get(key) {
|
|
18
|
+
const entry = this.cache.get(key);
|
|
19
|
+
if (!entry) {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
// Check if expired
|
|
23
|
+
if (Date.now() > entry.expiresAt) {
|
|
24
|
+
this.cache.delete(key);
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
return entry.value;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Clear a specific cache entry
|
|
31
|
+
*/
|
|
32
|
+
delete(key) {
|
|
33
|
+
this.cache.delete(key);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Clear all cache entries
|
|
37
|
+
*/
|
|
38
|
+
clear() {
|
|
39
|
+
this.cache.clear();
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Get cache size
|
|
43
|
+
*/
|
|
44
|
+
size() {
|
|
45
|
+
return this.cache.size;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/auth/cache.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,MAAM,OAAO,WAAW;IACd,KAAK,GAAG,IAAI,GAAG,EAAyB,CAAC;IAEjD;;OAEG;IACH,GAAG,CAAC,GAAW,EAAE,KAAQ,EAAE,KAAa;QACtC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;QACrC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,GAAW;QACb,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAElC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,IAAI,CAAC;QACd,CAAC;QAED,mBAAmB;QACnB,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;YACjC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACvB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,KAAK,CAAC,KAAK,CAAC;IACrB,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,GAAW;QAChB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IAED;;OAEG;IACH,IAAI;QACF,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;IACzB,CAAC;CACF"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 인증 가드 - 모든 도구 호출 전 인증 상태 확인
|
|
3
|
+
* SPEC-DEPLOY-001: 모든 테마 유료화, 인증 필수
|
|
4
|
+
*/
|
|
5
|
+
export declare class AuthRequiredError extends Error {
|
|
6
|
+
constructor();
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* 인증 필수 가드
|
|
10
|
+
* 인증되지 않은 경우 AuthRequiredError를 throw
|
|
11
|
+
*/
|
|
12
|
+
export declare function requireAuth(): void;
|
|
13
|
+
//# sourceMappingURL=guard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guard.d.ts","sourceRoot":"","sources":["../../src/auth/guard.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,qBAAa,iBAAkB,SAAQ,KAAK;;CAK3C;AAED;;;GAGG;AACH,wBAAgB,WAAW,IAAI,IAAI,CAIlC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 인증 가드 - 모든 도구 호출 전 인증 상태 확인
|
|
3
|
+
* SPEC-DEPLOY-001: 모든 테마 유료화, 인증 필수
|
|
4
|
+
*/
|
|
5
|
+
import { isAuthenticated } from './state.js';
|
|
6
|
+
export class AuthRequiredError extends Error {
|
|
7
|
+
constructor() {
|
|
8
|
+
super('Authentication required. Run `tekton-mcp login` to authenticate, or set TEKTON_API_KEY environment variable.');
|
|
9
|
+
this.name = 'AuthRequiredError';
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* 인증 필수 가드
|
|
14
|
+
* 인증되지 않은 경우 AuthRequiredError를 throw
|
|
15
|
+
*/
|
|
16
|
+
export function requireAuth() {
|
|
17
|
+
if (!isAuthenticated()) {
|
|
18
|
+
throw new AuthRequiredError();
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guard.js","sourceRoot":"","sources":["../../src/auth/guard.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE7C,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IAC1C;QACE,KAAK,CAAC,8GAA8G,CAAC,CAAC;QACtH,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW;IACzB,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;QACvB,MAAM,IAAI,iBAAiB,EAAE,CAAC;IAChC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Global authentication state for MCP server
|
|
3
|
+
* SPEC-DEPLOY-001 Phase 4.1: MCP Server Authentication Layer
|
|
4
|
+
*/
|
|
5
|
+
import type { VerifyResponse } from './verify.js';
|
|
6
|
+
/**
|
|
7
|
+
* Set authentication data and cache it
|
|
8
|
+
* @param authData - Verification response from API
|
|
9
|
+
*/
|
|
10
|
+
export declare function setAuthData(authData: VerifyResponse | null): void;
|
|
11
|
+
/**
|
|
12
|
+
* Get current authentication data
|
|
13
|
+
* @returns Current authentication data or null if not authenticated
|
|
14
|
+
*/
|
|
15
|
+
export declare function getAuthData(): VerifyResponse | null;
|
|
16
|
+
/**
|
|
17
|
+
* Clear authentication data and cache
|
|
18
|
+
*/
|
|
19
|
+
export declare function clearAuthData(): void;
|
|
20
|
+
/**
|
|
21
|
+
* Check if user is authenticated
|
|
22
|
+
* @returns true if authenticated with valid data
|
|
23
|
+
*/
|
|
24
|
+
export declare function isAuthenticated(): boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Get accessible theme IDs based on current authentication
|
|
27
|
+
* 인증된 사용자의 라이선스 보유 테마만 반환
|
|
28
|
+
* @param allThemeIds - All available theme IDs
|
|
29
|
+
* @returns Array of accessible theme IDs (licensed only)
|
|
30
|
+
*/
|
|
31
|
+
export declare function getAccessibleThemes(allThemeIds: string[]): string[];
|
|
32
|
+
//# sourceMappingURL=state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/auth/state.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAalD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI,GAAG,IAAI,CAOjE;AAED;;;GAGG;AACH,wBAAgB,WAAW,IAAI,cAAc,GAAG,IAAI,CAWnD;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,IAAI,CAIpC;AAED;;;GAGG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAGzC;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAcnE"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Global authentication state for MCP server
|
|
3
|
+
* SPEC-DEPLOY-001 Phase 4.1: MCP Server Authentication Layer
|
|
4
|
+
*/
|
|
5
|
+
import { MemoryCache } from './cache.js';
|
|
6
|
+
import { info } from '../utils/logger.js';
|
|
7
|
+
// Cache TTL: 5 minutes (300,000 milliseconds)
|
|
8
|
+
const CACHE_TTL_MS = 5 * 60 * 1000;
|
|
9
|
+
// Global authentication data cache
|
|
10
|
+
const authCache = new MemoryCache();
|
|
11
|
+
// Current authentication state
|
|
12
|
+
let currentAuthData = null;
|
|
13
|
+
/**
|
|
14
|
+
* Set authentication data and cache it
|
|
15
|
+
* @param authData - Verification response from API
|
|
16
|
+
*/
|
|
17
|
+
export function setAuthData(authData) {
|
|
18
|
+
currentAuthData = authData;
|
|
19
|
+
if (authData && authData.valid) {
|
|
20
|
+
authCache.set('auth', authData, CACHE_TTL_MS);
|
|
21
|
+
info('Authentication data cached for 5 minutes');
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Get current authentication data
|
|
26
|
+
* @returns Current authentication data or null if not authenticated
|
|
27
|
+
*/
|
|
28
|
+
export function getAuthData() {
|
|
29
|
+
// Try to get from cache first
|
|
30
|
+
const cachedAuth = authCache.get('auth');
|
|
31
|
+
if (cachedAuth) {
|
|
32
|
+
info('Using cached authentication data');
|
|
33
|
+
return cachedAuth;
|
|
34
|
+
}
|
|
35
|
+
// Return current state
|
|
36
|
+
return currentAuthData;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Clear authentication data and cache
|
|
40
|
+
*/
|
|
41
|
+
export function clearAuthData() {
|
|
42
|
+
currentAuthData = null;
|
|
43
|
+
authCache.clear();
|
|
44
|
+
info('Authentication data cleared');
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Check if user is authenticated
|
|
48
|
+
* @returns true if authenticated with valid data
|
|
49
|
+
*/
|
|
50
|
+
export function isAuthenticated() {
|
|
51
|
+
const authData = getAuthData();
|
|
52
|
+
return authData !== null && authData.valid === true;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Get accessible theme IDs based on current authentication
|
|
56
|
+
* 인증된 사용자의 라이선스 보유 테마만 반환
|
|
57
|
+
* @param allThemeIds - All available theme IDs
|
|
58
|
+
* @returns Array of accessible theme IDs (licensed only)
|
|
59
|
+
*/
|
|
60
|
+
export function getAccessibleThemes(allThemeIds) {
|
|
61
|
+
const authData = getAuthData();
|
|
62
|
+
// 인증 없음: 접근 가능 테마 없음
|
|
63
|
+
if (!authData || !authData.valid) {
|
|
64
|
+
return [];
|
|
65
|
+
}
|
|
66
|
+
// 인증됨: 라이선스 보유 테마만
|
|
67
|
+
const licensedThemes = authData.themes?.licensed || [];
|
|
68
|
+
const accessibleThemes = new Set(licensedThemes);
|
|
69
|
+
// 실제 존재하는 테마만 필터링
|
|
70
|
+
return allThemeIds.filter(id => accessibleThemes.has(id));
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/auth/state.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAE1C,8CAA8C;AAC9C,MAAM,YAAY,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AAEnC,mCAAmC;AACnC,MAAM,SAAS,GAAG,IAAI,WAAW,EAAkB,CAAC;AAEpD,+BAA+B;AAC/B,IAAI,eAAe,GAA0B,IAAI,CAAC;AAElD;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,QAA+B;IACzD,eAAe,GAAG,QAAQ,CAAC;IAE3B,IAAI,QAAQ,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;QAC/B,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;QAC9C,IAAI,CAAC,0CAA0C,CAAC,CAAC;IACnD,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW;IACzB,8BAA8B;IAC9B,MAAM,UAAU,GAAG,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAEzC,IAAI,UAAU,EAAE,CAAC;QACf,IAAI,CAAC,kCAAkC,CAAC,CAAC;QACzC,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,uBAAuB;IACvB,OAAO,eAAe,CAAC;AACzB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa;IAC3B,eAAe,GAAG,IAAI,CAAC;IACvB,SAAS,CAAC,KAAK,EAAE,CAAC;IAClB,IAAI,CAAC,6BAA6B,CAAC,CAAC;AACtC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe;IAC7B,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,OAAO,QAAQ,KAAK,IAAI,IAAI,QAAQ,CAAC,KAAK,KAAK,IAAI,CAAC;AACtD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,WAAqB;IACvD,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAE/B,qBAAqB;IACrB,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QACjC,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,mBAAmB;IACnB,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,EAAE,QAAQ,IAAI,EAAE,CAAC;IACvD,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,CAAC;IAEjD,kBAAkB;IAClB,OAAO,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;AAC5D,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme-access.d.ts","sourceRoot":"","sources":["../../src/auth/theme-access.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;GAGG;AACH,eAAO,MAAM,cAAc,UAc1B,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Theme access configuration
|
|
3
|
+
* SPEC-DEPLOY-001: 모든 테마 유료 - 인증 필수
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* 모든 프리미엄 테마 목록
|
|
7
|
+
* 인증된 사용자만 라이선스 보유 테마에 접근 가능
|
|
8
|
+
*/
|
|
9
|
+
export const PREMIUM_THEMES = [
|
|
10
|
+
'calm-wellness',
|
|
11
|
+
'dynamic-fitness',
|
|
12
|
+
'korean-fintech',
|
|
13
|
+
'media-streaming',
|
|
14
|
+
'premium-editorial',
|
|
15
|
+
'saas-dashboard',
|
|
16
|
+
'warm-humanist',
|
|
17
|
+
'next-tailwind-shadcn',
|
|
18
|
+
'vite-tailwind-shadcn',
|
|
19
|
+
'next-styled-components',
|
|
20
|
+
'next-tailwind-radix',
|
|
21
|
+
'saas-modern',
|
|
22
|
+
'tech-startup',
|
|
23
|
+
];
|
|
24
|
+
//# sourceMappingURL=theme-access.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme-access.js","sourceRoot":"","sources":["../../src/auth/theme-access.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,eAAe;IACf,iBAAiB;IACjB,gBAAgB;IAChB,iBAAiB;IACjB,mBAAmB;IACnB,gBAAgB;IAChB,eAAe;IACf,sBAAsB;IACtB,sBAAsB;IACtB,wBAAwB;IACxB,qBAAqB;IACrB,aAAa;IACb,cAAc;CACf,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API Key verification for Tekton MCP Server
|
|
3
|
+
* SPEC-DEPLOY-001 Phase 4.1: MCP Server Authentication Layer
|
|
4
|
+
*/
|
|
5
|
+
export interface VerifyResponse {
|
|
6
|
+
valid: boolean;
|
|
7
|
+
user?: {
|
|
8
|
+
id: string;
|
|
9
|
+
email: string;
|
|
10
|
+
plan: string;
|
|
11
|
+
};
|
|
12
|
+
licenses?: Array<{
|
|
13
|
+
themeId: string;
|
|
14
|
+
tier: string;
|
|
15
|
+
isActive: boolean;
|
|
16
|
+
expiresAt: string | null;
|
|
17
|
+
}>;
|
|
18
|
+
themes?: {
|
|
19
|
+
licensed: string[];
|
|
20
|
+
/** @deprecated free 테마 개념 제거됨 - 하위 호환용 */
|
|
21
|
+
free?: string[];
|
|
22
|
+
};
|
|
23
|
+
error?: string;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Verify API key with Tekton backend
|
|
27
|
+
* @param apiKey - The API key to verify
|
|
28
|
+
* @returns VerifyResponse with user data and licenses
|
|
29
|
+
*/
|
|
30
|
+
export declare function verifyApiKey(apiKey: string): Promise<VerifyResponse>;
|
|
31
|
+
/**
|
|
32
|
+
* Extract licensed theme IDs from verification response
|
|
33
|
+
* @param verifyResponse - Verification response from verifyApiKey
|
|
34
|
+
* @returns Array of licensed theme IDs
|
|
35
|
+
*/
|
|
36
|
+
export declare function extractThemeAccess(verifyResponse: VerifyResponse): string[];
|
|
37
|
+
/**
|
|
38
|
+
* Check if a theme is accessible for the current authentication state
|
|
39
|
+
* @param themeId - Theme ID to check
|
|
40
|
+
* @param verifyResponse - Verification response (null for unauthenticated)
|
|
41
|
+
* @returns true if theme is in user's licenses
|
|
42
|
+
*/
|
|
43
|
+
export declare function isThemeAccessible(themeId: string, verifyResponse: VerifyResponse | null): boolean;
|
|
44
|
+
//# sourceMappingURL=verify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/auth/verify.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE;QACL,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,QAAQ,CAAC,EAAE,KAAK,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,OAAO,CAAC;QAClB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;KAC1B,CAAC,CAAC;IACH,MAAM,CAAC,EAAE;QACP,QAAQ,EAAE,MAAM,EAAE,CAAC;QACnB,0CAA0C;QAC1C,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;KACjB,CAAC;IACF,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAiD1E;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,cAAc,EAAE,cAAc,GAAG,MAAM,EAAE,CAM3E;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,cAAc,GAAG,IAAI,GACpC,OAAO,CAST"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API Key verification for Tekton MCP Server
|
|
3
|
+
* SPEC-DEPLOY-001 Phase 4.1: MCP Server Authentication Layer
|
|
4
|
+
*/
|
|
5
|
+
import { info, error as logError } from '../utils/logger.js';
|
|
6
|
+
/**
|
|
7
|
+
* Verify API key with Tekton backend
|
|
8
|
+
* @param apiKey - The API key to verify
|
|
9
|
+
* @returns VerifyResponse with user data and licenses
|
|
10
|
+
*/
|
|
11
|
+
export async function verifyApiKey(apiKey) {
|
|
12
|
+
const apiUrl = process.env.TEKTON_API_URL || 'https://tekton-ui.com';
|
|
13
|
+
const endpoint = `${apiUrl}/api/mcp/verify`;
|
|
14
|
+
try {
|
|
15
|
+
info(`Verifying API key with endpoint: ${endpoint}`);
|
|
16
|
+
const response = await fetch(endpoint, {
|
|
17
|
+
method: 'GET',
|
|
18
|
+
headers: {
|
|
19
|
+
Authorization: `Bearer ${apiKey}`,
|
|
20
|
+
'Content-Type': 'application/json',
|
|
21
|
+
},
|
|
22
|
+
});
|
|
23
|
+
if (!response.ok) {
|
|
24
|
+
const errorText = await response.text();
|
|
25
|
+
logError(`API key verification failed: ${response.status} ${response.statusText}`);
|
|
26
|
+
return {
|
|
27
|
+
valid: false,
|
|
28
|
+
error: `Verification failed: ${response.status} ${response.statusText} - ${errorText}`,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
const data = (await response.json());
|
|
32
|
+
if (!data.valid) {
|
|
33
|
+
logError(`API key is invalid: ${data.error || 'Unknown reason'}`);
|
|
34
|
+
return {
|
|
35
|
+
valid: false,
|
|
36
|
+
error: data.error || 'API key is invalid',
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
info(`API key verified successfully for user: ${data.user?.email || 'unknown'} (plan: ${data.user?.plan || 'unknown'})`);
|
|
40
|
+
return data;
|
|
41
|
+
}
|
|
42
|
+
catch (err) {
|
|
43
|
+
const errorMessage = err instanceof Error ? err.message : String(err);
|
|
44
|
+
logError(`API key verification error: ${errorMessage}`);
|
|
45
|
+
return {
|
|
46
|
+
valid: false,
|
|
47
|
+
error: `Network error: ${errorMessage}`,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Extract licensed theme IDs from verification response
|
|
53
|
+
* @param verifyResponse - Verification response from verifyApiKey
|
|
54
|
+
* @returns Array of licensed theme IDs
|
|
55
|
+
*/
|
|
56
|
+
export function extractThemeAccess(verifyResponse) {
|
|
57
|
+
if (!verifyResponse.valid || !verifyResponse.themes) {
|
|
58
|
+
return [];
|
|
59
|
+
}
|
|
60
|
+
return verifyResponse.themes.licensed || [];
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Check if a theme is accessible for the current authentication state
|
|
64
|
+
* @param themeId - Theme ID to check
|
|
65
|
+
* @param verifyResponse - Verification response (null for unauthenticated)
|
|
66
|
+
* @returns true if theme is in user's licenses
|
|
67
|
+
*/
|
|
68
|
+
export function isThemeAccessible(themeId, verifyResponse) {
|
|
69
|
+
// 인증 필수
|
|
70
|
+
if (!verifyResponse || !verifyResponse.valid) {
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
// 라이선스 보유 테마만 접근 가능
|
|
74
|
+
const licensed = extractThemeAccess(verifyResponse);
|
|
75
|
+
return licensed.includes(themeId);
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=verify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/auth/verify.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,EAAE,KAAK,IAAI,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAuB7D;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,MAAc;IAC/C,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,uBAAuB,CAAC;IACrE,MAAM,QAAQ,GAAG,GAAG,MAAM,iBAAiB,CAAC;IAE5C,IAAI,CAAC;QACH,IAAI,CAAC,oCAAoC,QAAQ,EAAE,CAAC,CAAC;QAErD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,QAAQ,EAAE;YACrC,MAAM,EAAE,KAAK;YACb,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,MAAM,EAAE;gBACjC,cAAc,EAAE,kBAAkB;aACnC;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACxC,QAAQ,CAAC,gCAAgC,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;YAEnF,OAAO;gBACL,KAAK,EAAE,KAAK;gBACZ,KAAK,EAAE,wBAAwB,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,MAAM,SAAS,EAAE;aACvF,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAmB,CAAC;QAEvD,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAChB,QAAQ,CAAC,uBAAuB,IAAI,CAAC,KAAK,IAAI,gBAAgB,EAAE,CAAC,CAAC;YAClE,OAAO;gBACL,KAAK,EAAE,KAAK;gBACZ,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,oBAAoB;aAC1C,CAAC;QACJ,CAAC;QAED,IAAI,CACF,2CAA2C,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,SAAS,WAAW,IAAI,CAAC,IAAI,EAAE,IAAI,IAAI,SAAS,GAAG,CACnH,CAAC;QAEF,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,YAAY,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACtE,QAAQ,CAAC,+BAA+B,YAAY,EAAE,CAAC,CAAC;QAExD,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,KAAK,EAAE,kBAAkB,YAAY,EAAE;SACxC,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,cAA8B;IAC/D,IAAI,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC;QACpD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,cAAc,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;AAC9C,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAC/B,OAAe,EACf,cAAqC;IAErC,QAAQ;IACR,IAAI,CAAC,cAAc,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;QAC7C,OAAO,KAAK,CAAC;IACf,CAAC;IAED,oBAAoB;IACpB,MAAM,QAAQ,GAAG,kBAAkB,CAAC,cAAc,CAAC,CAAC;IACpD,OAAO,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AACpC,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 크레덴셜 파일 관리
|
|
3
|
+
* ~/.tekton/credentials.json 읽기/쓰기/삭제
|
|
4
|
+
*/
|
|
5
|
+
export interface TektonCredentials {
|
|
6
|
+
api_key: string;
|
|
7
|
+
api_url: string;
|
|
8
|
+
created_at: string;
|
|
9
|
+
user_email: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* 크레덴셜 파일 경로 반환
|
|
13
|
+
*/
|
|
14
|
+
export declare function getCredentialsPath(): string;
|
|
15
|
+
/**
|
|
16
|
+
* 크레덴셜 파일 로드
|
|
17
|
+
* @returns 크레덴셜 객체 또는 null (파일 없거나 파싱 실패 시)
|
|
18
|
+
*/
|
|
19
|
+
export declare function loadCredentials(): TektonCredentials | null;
|
|
20
|
+
/**
|
|
21
|
+
* 크레덴셜 저장 (chmod 600)
|
|
22
|
+
*/
|
|
23
|
+
export declare function saveCredentials(creds: TektonCredentials): void;
|
|
24
|
+
/**
|
|
25
|
+
* 크레덴셜 파일 삭제
|
|
26
|
+
* @returns true면 삭제 성공, false면 파일 없음
|
|
27
|
+
*/
|
|
28
|
+
export declare function deleteCredentials(): boolean;
|
|
29
|
+
//# sourceMappingURL=credentials.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../src/cli/credentials.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED;;;GAGG;AACH,wBAAgB,eAAe,IAAI,iBAAiB,GAAG,IAAI,CAmB1D;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAW9D;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAY3C"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 크레덴셜 파일 관리
|
|
3
|
+
* ~/.tekton/credentials.json 읽기/쓰기/삭제
|
|
4
|
+
*/
|
|
5
|
+
import fs from 'node:fs';
|
|
6
|
+
import path from 'node:path';
|
|
7
|
+
import os from 'node:os';
|
|
8
|
+
/**
|
|
9
|
+
* 크레덴셜 파일 경로 반환
|
|
10
|
+
*/
|
|
11
|
+
export function getCredentialsPath() {
|
|
12
|
+
return path.join(os.homedir(), '.tekton', 'credentials.json');
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* 크레덴셜 파일 로드
|
|
16
|
+
* @returns 크레덴셜 객체 또는 null (파일 없거나 파싱 실패 시)
|
|
17
|
+
*/
|
|
18
|
+
export function loadCredentials() {
|
|
19
|
+
const credPath = getCredentialsPath();
|
|
20
|
+
try {
|
|
21
|
+
if (!fs.existsSync(credPath)) {
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
const raw = fs.readFileSync(credPath, 'utf-8');
|
|
25
|
+
const data = JSON.parse(raw);
|
|
26
|
+
// 필수 필드 검증
|
|
27
|
+
if (!data.api_key || !data.api_url) {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
return data;
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* 크레덴셜 저장 (chmod 600)
|
|
38
|
+
*/
|
|
39
|
+
export function saveCredentials(creds) {
|
|
40
|
+
const credPath = getCredentialsPath();
|
|
41
|
+
const dir = path.dirname(credPath);
|
|
42
|
+
// ~/.tekton 디렉토리 자동 생성
|
|
43
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
44
|
+
// 소유자만 읽기/쓰기 (0o600)
|
|
45
|
+
fs.writeFileSync(credPath, JSON.stringify(creds, null, 2) + '\n', {
|
|
46
|
+
mode: 0o600,
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* 크레덴셜 파일 삭제
|
|
51
|
+
* @returns true면 삭제 성공, false면 파일 없음
|
|
52
|
+
*/
|
|
53
|
+
export function deleteCredentials() {
|
|
54
|
+
const credPath = getCredentialsPath();
|
|
55
|
+
try {
|
|
56
|
+
if (!fs.existsSync(credPath)) {
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
fs.unlinkSync(credPath);
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=credentials.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/cli/credentials.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AASzB;;GAEG;AACH,MAAM,UAAU,kBAAkB;IAChC,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,kBAAkB,CAAC,CAAC;AAChE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe;IAC7B,MAAM,QAAQ,GAAG,kBAAkB,EAAE,CAAC;IAEtC,IAAI,CAAC;QACH,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAsB,CAAC;QAElD,WAAW;QACX,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YACnC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,KAAwB;IACtD,MAAM,QAAQ,GAAG,kBAAkB,EAAE,CAAC;IACtC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAEnC,uBAAuB;IACvB,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEvC,qBAAqB;IACrB,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE;QAChE,IAAI,EAAE,KAAK;KACZ,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB;IAC/B,MAAM,QAAQ,GAAG,kBAAkB,EAAE,CAAC;IAEtC,IAAI,CAAC;QACH,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7B,OAAO,KAAK,CAAC;QACf,CAAC;QACD,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA;;;GAGG;AAEH,OAAO,EAAE,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Tekton MCP CLI 라우터
|
|
4
|
+
* 서브커맨드: login, logout, status, (없으면 MCP 서버 시작)
|
|
5
|
+
*/
|
|
6
|
+
const command = process.argv[2];
|
|
7
|
+
switch (command) {
|
|
8
|
+
case 'login': {
|
|
9
|
+
const { loginCommand } = await import('./login.js');
|
|
10
|
+
try {
|
|
11
|
+
await loginCommand();
|
|
12
|
+
}
|
|
13
|
+
catch (err) {
|
|
14
|
+
console.error(err instanceof Error ? err.message : String(err));
|
|
15
|
+
process.exit(1);
|
|
16
|
+
}
|
|
17
|
+
break;
|
|
18
|
+
}
|
|
19
|
+
case 'logout': {
|
|
20
|
+
const { logoutCommand } = await import('./logout.js');
|
|
21
|
+
logoutCommand();
|
|
22
|
+
break;
|
|
23
|
+
}
|
|
24
|
+
case 'status': {
|
|
25
|
+
const { statusCommand } = await import('./status.js');
|
|
26
|
+
statusCommand();
|
|
27
|
+
break;
|
|
28
|
+
}
|
|
29
|
+
default: {
|
|
30
|
+
// 서브커맨드 없음 → MCP stdio 서버 시작 (기존 동작 유지)
|
|
31
|
+
await import('../index.js');
|
|
32
|
+
break;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
export {};
|
|
36
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA;;;GAGG;AAIH,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAEhC,QAAQ,OAAO,EAAE,CAAC;IAChB,KAAK,OAAO,CAAC,CAAC,CAAC;QACb,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;QACpD,IAAI,CAAC;YACH,MAAM,YAAY,EAAE,CAAC;QACvB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,MAAM;IACR,CAAC;IAED,KAAK,QAAQ,CAAC,CAAC,CAAC;QACd,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;QACtD,aAAa,EAAE,CAAC;QAChB,MAAM;IACR,CAAC;IAED,KAAK,QAAQ,CAAC,CAAC,CAAC;QACd,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;QACtD,aAAa,EAAE,CAAC;QAChB,MAAM;IACR,CAAC;IAED,OAAO,CAAC,CAAC,CAAC;QACR,wCAAwC;QACxC,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;QAC5B,MAAM;IACR,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/cli/login.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAiCH;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAkGlD"}
|