@framingui/mcp-server 0.5.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/README.md +1027 -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 +22 -0
- package/dist/auth/guard.d.ts.map +1 -0
- package/dist/auth/guard.js +37 -0
- package/dist/auth/guard.js.map +1 -0
- package/dist/auth/state.d.ts +42 -0
- package/dist/auth/state.d.ts.map +1 -0
- package/dist/auth/state.js +96 -0
- package/dist/auth/state.js.map +1 -0
- package/dist/auth/theme-access.d.ts +21 -0
- package/dist/auth/theme-access.d.ts.map +1 -0
- package/dist/auth/theme-access.js +30 -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/agent-md-templates.d.ts +16 -0
- package/dist/cli/agent-md-templates.d.ts.map +1 -0
- package/dist/cli/agent-md-templates.js +311 -0
- package/dist/cli/agent-md-templates.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/guide-template.d.ts +10 -0
- package/dist/cli/guide-template.d.ts.map +1 -0
- package/dist/cli/guide-template.js +195 -0
- package/dist/cli/guide-template.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 +41 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/init.d.ts +6 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +319 -0
- package/dist/cli/init.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 +121 -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-props.d.ts +30 -0
- package/dist/data/component-props.d.ts.map +1 -0
- package/dist/data/component-props.js +537 -0
- package/dist/data/component-props.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 +965 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts/getting-started.d.ts +18 -0
- package/dist/prompts/getting-started.d.ts.map +1 -0
- package/dist/prompts/getting-started.js +112 -0
- package/dist/prompts/getting-started.js.map +1 -0
- package/dist/prompts/screen-workflow.d.ts +17 -0
- package/dist/prompts/screen-workflow.d.ts.map +1 -0
- package/dist/prompts/screen-workflow.js +246 -0
- package/dist/prompts/screen-workflow.js.map +1 -0
- package/dist/schemas/mcp-schemas.d.ts +4342 -0
- package/dist/schemas/mcp-schemas.d.ts.map +1 -0
- package/dist/schemas/mcp-schemas.js +989 -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 +325 -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 +61 -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 +63 -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 +99 -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 +172 -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 +559 -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/tools/whoami.d.ts +17 -0
- package/dist/tools/whoami.d.ts.map +1 -0
- package/dist/tools/whoami.js +65 -0
- package/dist/tools/whoami.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 +103 -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,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 인증 가드 - 모든 도구 호출 전 인증 상태 확인
|
|
3
|
+
* SPEC-DEPLOY-001: 모든 테마 유료화, 인증 필수
|
|
4
|
+
*/
|
|
5
|
+
export declare class AuthRequiredError extends Error {
|
|
6
|
+
constructor();
|
|
7
|
+
}
|
|
8
|
+
export declare class WhoamiRequiredError extends Error {
|
|
9
|
+
constructor();
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* 인증 필수 가드
|
|
13
|
+
* 인증되지 않은 경우 AuthRequiredError를 throw
|
|
14
|
+
*/
|
|
15
|
+
export declare function requireAuth(): void;
|
|
16
|
+
/**
|
|
17
|
+
* whoami 필수 가드 (서버 사이드 강제)
|
|
18
|
+
* whoami 미호출 시 WhoamiRequiredError를 throw
|
|
19
|
+
* 프롬프트 인젝션으로 우회 불가
|
|
20
|
+
*/
|
|
21
|
+
export declare function requireWhoami(): void;
|
|
22
|
+
//# 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;;CAO3C;AAED,qBAAa,mBAAoB,SAAQ,KAAK;;CAO7C;AAED;;;GAGG;AACH,wBAAgB,WAAW,IAAI,IAAI,CAIlC;AAED;;;;GAIG;AACH,wBAAgB,aAAa,IAAI,IAAI,CAIpC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 인증 가드 - 모든 도구 호출 전 인증 상태 확인
|
|
3
|
+
* SPEC-DEPLOY-001: 모든 테마 유료화, 인증 필수
|
|
4
|
+
*/
|
|
5
|
+
import { isAuthenticated, isWhoamiCompleted } 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
|
+
export class WhoamiRequiredError extends Error {
|
|
13
|
+
constructor() {
|
|
14
|
+
super('Please call the "whoami" tool first to verify your account and license status before using other tools.');
|
|
15
|
+
this.name = 'WhoamiRequiredError';
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* 인증 필수 가드
|
|
20
|
+
* 인증되지 않은 경우 AuthRequiredError를 throw
|
|
21
|
+
*/
|
|
22
|
+
export function requireAuth() {
|
|
23
|
+
if (!isAuthenticated()) {
|
|
24
|
+
throw new AuthRequiredError();
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* whoami 필수 가드 (서버 사이드 강제)
|
|
29
|
+
* whoami 미호출 시 WhoamiRequiredError를 throw
|
|
30
|
+
* 프롬프트 인젝션으로 우회 불가
|
|
31
|
+
*/
|
|
32
|
+
export function requireWhoami() {
|
|
33
|
+
if (!isWhoamiCompleted()) {
|
|
34
|
+
throw new WhoamiRequiredError();
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
//# 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,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEhE,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IAC1C;QACE,KAAK,CACH,8GAA8G,CAC/G,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF;AAED,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IAC5C;QACE,KAAK,CACH,yGAAyG,CAC1G,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,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;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa;IAC3B,IAAI,CAAC,iBAAiB,EAAE,EAAE,CAAC;QACzB,MAAM,IAAI,mBAAmB,EAAE,CAAC;IAClC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
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
|
+
* whoami 도구 호출 완료 표시
|
|
22
|
+
*/
|
|
23
|
+
export declare function setWhoamiCompleted(): void;
|
|
24
|
+
/**
|
|
25
|
+
* whoami 도구 호출 여부 확인
|
|
26
|
+
* @returns whoami가 호출되었으면 true
|
|
27
|
+
*/
|
|
28
|
+
export declare function isWhoamiCompleted(): boolean;
|
|
29
|
+
/**
|
|
30
|
+
* Check if user is authenticated
|
|
31
|
+
* @returns true if authenticated with valid data
|
|
32
|
+
*/
|
|
33
|
+
export declare function isAuthenticated(): boolean;
|
|
34
|
+
/**
|
|
35
|
+
* Get accessible theme IDs based on current authentication
|
|
36
|
+
* 마스터 계정: 모든 테마 접근 가능
|
|
37
|
+
* 일반 사용자: 라이선스 보유 테마만 반환
|
|
38
|
+
* @param allThemeIds - All available theme IDs
|
|
39
|
+
* @returns Array of accessible theme IDs
|
|
40
|
+
*/
|
|
41
|
+
export declare function getAccessibleThemes(allThemeIds: string[]): string[];
|
|
42
|
+
//# 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;AAiBlD;;;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,CAKpC;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CAGzC;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAE3C;AAED;;;GAGG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAGzC;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAoBnE"}
|
|
@@ -0,0 +1,96 @@
|
|
|
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
|
+
import { isMasterAccount } from './theme-access.js';
|
|
8
|
+
// Cache TTL: 5 minutes (300,000 milliseconds)
|
|
9
|
+
const CACHE_TTL_MS = 5 * 60 * 1000;
|
|
10
|
+
// Global authentication data cache
|
|
11
|
+
const authCache = new MemoryCache();
|
|
12
|
+
// Current authentication state
|
|
13
|
+
let currentAuthData = null;
|
|
14
|
+
// whoami 도구 호출 완료 여부 (서버 사이드 게이트)
|
|
15
|
+
let whoamiCompleted = false;
|
|
16
|
+
/**
|
|
17
|
+
* Set authentication data and cache it
|
|
18
|
+
* @param authData - Verification response from API
|
|
19
|
+
*/
|
|
20
|
+
export function setAuthData(authData) {
|
|
21
|
+
currentAuthData = authData;
|
|
22
|
+
if (authData && authData.valid) {
|
|
23
|
+
authCache.set('auth', authData, CACHE_TTL_MS);
|
|
24
|
+
info('Authentication data cached for 5 minutes');
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Get current authentication data
|
|
29
|
+
* @returns Current authentication data or null if not authenticated
|
|
30
|
+
*/
|
|
31
|
+
export function getAuthData() {
|
|
32
|
+
// Try to get from cache first
|
|
33
|
+
const cachedAuth = authCache.get('auth');
|
|
34
|
+
if (cachedAuth) {
|
|
35
|
+
info('Using cached authentication data');
|
|
36
|
+
return cachedAuth;
|
|
37
|
+
}
|
|
38
|
+
// Return current state
|
|
39
|
+
return currentAuthData;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Clear authentication data and cache
|
|
43
|
+
*/
|
|
44
|
+
export function clearAuthData() {
|
|
45
|
+
currentAuthData = null;
|
|
46
|
+
whoamiCompleted = false;
|
|
47
|
+
authCache.clear();
|
|
48
|
+
info('Authentication data cleared');
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* whoami 도구 호출 완료 표시
|
|
52
|
+
*/
|
|
53
|
+
export function setWhoamiCompleted() {
|
|
54
|
+
whoamiCompleted = true;
|
|
55
|
+
info('whoami completed - all tools unlocked');
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* whoami 도구 호출 여부 확인
|
|
59
|
+
* @returns whoami가 호출되었으면 true
|
|
60
|
+
*/
|
|
61
|
+
export function isWhoamiCompleted() {
|
|
62
|
+
return whoamiCompleted;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Check if user is authenticated
|
|
66
|
+
* @returns true if authenticated with valid data
|
|
67
|
+
*/
|
|
68
|
+
export function isAuthenticated() {
|
|
69
|
+
const authData = getAuthData();
|
|
70
|
+
return authData !== null && authData.valid === true;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Get accessible theme IDs based on current authentication
|
|
74
|
+
* 마스터 계정: 모든 테마 접근 가능
|
|
75
|
+
* 일반 사용자: 라이선스 보유 테마만 반환
|
|
76
|
+
* @param allThemeIds - All available theme IDs
|
|
77
|
+
* @returns Array of accessible theme IDs
|
|
78
|
+
*/
|
|
79
|
+
export function getAccessibleThemes(allThemeIds) {
|
|
80
|
+
const authData = getAuthData();
|
|
81
|
+
// 인증 없음: 접근 가능 테마 없음
|
|
82
|
+
if (!authData || !authData.valid) {
|
|
83
|
+
return [];
|
|
84
|
+
}
|
|
85
|
+
// 마스터 계정: 모든 테마 접근 가능
|
|
86
|
+
const email = authData.user?.email;
|
|
87
|
+
if (email && isMasterAccount(email)) {
|
|
88
|
+
return [...allThemeIds];
|
|
89
|
+
}
|
|
90
|
+
// 일반 사용자: 라이선스 보유 테마만
|
|
91
|
+
const licensedThemes = authData.themes?.licensed || [];
|
|
92
|
+
const accessibleThemes = new Set(licensedThemes);
|
|
93
|
+
// 실제 존재하는 테마만 필터링
|
|
94
|
+
return allThemeIds.filter(id => accessibleThemes.has(id));
|
|
95
|
+
}
|
|
96
|
+
//# 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;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,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,kCAAkC;AAClC,IAAI,eAAe,GAAG,KAAK,CAAC;AAE5B;;;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,eAAe,GAAG,KAAK,CAAC;IACxB,SAAS,CAAC,KAAK,EAAE,CAAC;IAClB,IAAI,CAAC,6BAA6B,CAAC,CAAC;AACtC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB;IAChC,eAAe,GAAG,IAAI,CAAC;IACvB,IAAI,CAAC,uCAAuC,CAAC,CAAC;AAChD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB;IAC/B,OAAO,eAAe,CAAC;AACzB,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;;;;;;GAMG;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,sBAAsB;IACtB,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IACnC,IAAI,KAAK,IAAI,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC;QACpC,OAAO,CAAC,GAAG,WAAW,CAAC,CAAC;IAC1B,CAAC;IAED,sBAAsB;IACtB,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,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Theme access configuration
|
|
3
|
+
* SPEC-DEPLOY-001: 모든 테마 유료 - 인증 필수
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* 모든 프리미엄 테마 목록 (실제 존재하는 6개 테마만)
|
|
7
|
+
* 인증된 사용자만 라이선스 보유 테마에 접근 가능
|
|
8
|
+
*/
|
|
9
|
+
export declare const PREMIUM_THEMES: string[];
|
|
10
|
+
/**
|
|
11
|
+
* 마스터 계정 이메일 목록
|
|
12
|
+
* 마스터 계정은 모든 테마에 무제한 접근 가능
|
|
13
|
+
*/
|
|
14
|
+
export declare const MASTER_EMAILS: string[];
|
|
15
|
+
/**
|
|
16
|
+
* 마스터 계정 여부 확인
|
|
17
|
+
* @param email - 사용자 이메일
|
|
18
|
+
* @returns 마스터 계정이면 true
|
|
19
|
+
*/
|
|
20
|
+
export declare function isMasterAccount(email: string): boolean;
|
|
21
|
+
//# sourceMappingURL=theme-access.d.ts.map
|
|
@@ -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,UAO1B,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,aAAa,UAA8B,CAAC;AAEzD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEtD"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Theme access configuration
|
|
3
|
+
* SPEC-DEPLOY-001: 모든 테마 유료 - 인증 필수
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* 모든 프리미엄 테마 목록 (실제 존재하는 6개 테마만)
|
|
7
|
+
* 인증된 사용자만 라이선스 보유 테마에 접근 가능
|
|
8
|
+
*/
|
|
9
|
+
export const PREMIUM_THEMES = [
|
|
10
|
+
'classic-magazine',
|
|
11
|
+
'dark-boldness',
|
|
12
|
+
'minimal-workspace',
|
|
13
|
+
'neutral-workspace',
|
|
14
|
+
'pebble',
|
|
15
|
+
'square-minimalism',
|
|
16
|
+
];
|
|
17
|
+
/**
|
|
18
|
+
* 마스터 계정 이메일 목록
|
|
19
|
+
* 마스터 계정은 모든 테마에 무제한 접근 가능
|
|
20
|
+
*/
|
|
21
|
+
export const MASTER_EMAILS = ['soo.kate.yeon@gmail.com'];
|
|
22
|
+
/**
|
|
23
|
+
* 마스터 계정 여부 확인
|
|
24
|
+
* @param email - 사용자 이메일
|
|
25
|
+
* @returns 마스터 계정이면 true
|
|
26
|
+
*/
|
|
27
|
+
export function isMasterAccount(email) {
|
|
28
|
+
return MASTER_EMAILS.includes(email.toLowerCase());
|
|
29
|
+
}
|
|
30
|
+
//# 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,kBAAkB;IAClB,eAAe;IACf,mBAAmB;IACnB,mBAAmB;IACnB,QAAQ;IACR,mBAAmB;CACpB,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,yBAAyB,CAAC,CAAC;AAEzD;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,KAAa;IAC3C,OAAO,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;AACrD,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,CAAC,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,cAAc,GAAG,IAAI,GAAG,OAAO,CASjG"}
|
|
@@ -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://framingui.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,CAAC,OAAe,EAAE,cAAqC;IACtF,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,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent guidance templates for CLAUDE.md and AGENTS.md
|
|
3
|
+
* Provides framework-specific Tekton workflow instructions
|
|
4
|
+
*/
|
|
5
|
+
export type Framework = 'nextjs' | 'vite';
|
|
6
|
+
/**
|
|
7
|
+
* Generate CLAUDE.md section for Claude Code
|
|
8
|
+
* (Claude Code-specific patterns and MCP integration)
|
|
9
|
+
*/
|
|
10
|
+
export declare function generateClaudeMdSection(framework: Framework): string;
|
|
11
|
+
/**
|
|
12
|
+
* Generate AGENTS.md section for generic AI agents
|
|
13
|
+
* (Platform-agnostic guidance for OpenAI Codex, Cursor, Windsurf, etc.)
|
|
14
|
+
*/
|
|
15
|
+
export declare function generateAgentsMdSection(framework: Framework): string;
|
|
16
|
+
//# sourceMappingURL=agent-md-templates.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-md-templates.d.ts","sourceRoot":"","sources":["../../src/cli/agent-md-templates.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC;AAE1C;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,SAAS,GAAG,MAAM,CAsHpE;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,SAAS,GAAG,MAAM,CAoLpE"}
|