@skillsmith/mcp-server 0.1.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/dist/.tsbuildinfo +1 -0
- package/dist/src/__tests__/get-skill.test.d.ts +6 -0
- package/dist/src/__tests__/get-skill.test.d.ts.map +1 -0
- package/dist/src/__tests__/get-skill.test.js +88 -0
- package/dist/src/__tests__/get-skill.test.js.map +1 -0
- package/dist/src/__tests__/middleware/errorFormatter.test.d.ts +7 -0
- package/dist/src/__tests__/middleware/errorFormatter.test.d.ts.map +1 -0
- package/dist/src/__tests__/middleware/errorFormatter.test.js +304 -0
- package/dist/src/__tests__/middleware/errorFormatter.test.js.map +1 -0
- package/dist/src/__tests__/middleware/license.test.d.ts +7 -0
- package/dist/src/__tests__/middleware/license.test.d.ts.map +1 -0
- package/dist/src/__tests__/middleware/license.test.js +500 -0
- package/dist/src/__tests__/middleware/license.test.js.map +1 -0
- package/dist/src/__tests__/search.test.d.ts +6 -0
- package/dist/src/__tests__/search.test.d.ts.map +1 -0
- package/dist/src/__tests__/search.test.js +86 -0
- package/dist/src/__tests__/search.test.js.map +1 -0
- package/dist/src/__tests__/test-utils.d.ts +19 -0
- package/dist/src/__tests__/test-utils.d.ts.map +1 -0
- package/dist/src/__tests__/test-utils.js +87 -0
- package/dist/src/__tests__/test-utils.js.map +1 -0
- package/dist/src/context/index.d.ts +19 -0
- package/dist/src/context/index.d.ts.map +1 -0
- package/dist/src/context/index.js +25 -0
- package/dist/src/context/index.js.map +1 -0
- package/dist/src/context/project-detector.d.ts +145 -0
- package/dist/src/context/project-detector.d.ts.map +1 -0
- package/dist/src/context/project-detector.js +321 -0
- package/dist/src/context/project-detector.js.map +1 -0
- package/dist/src/context.d.ts +100 -0
- package/dist/src/context.d.ts.map +1 -0
- package/dist/src/context.js +157 -0
- package/dist/src/context.js.map +1 -0
- package/dist/src/core-shim.d.ts +7 -0
- package/dist/src/core-shim.d.ts.map +1 -0
- package/dist/src/core-shim.js +9 -0
- package/dist/src/core-shim.js.map +1 -0
- package/dist/src/health/healthCheck.d.ts +88 -0
- package/dist/src/health/healthCheck.d.ts.map +1 -0
- package/dist/src/health/healthCheck.js +117 -0
- package/dist/src/health/healthCheck.js.map +1 -0
- package/dist/src/health/index.d.ts +21 -0
- package/dist/src/health/index.d.ts.map +1 -0
- package/dist/src/health/index.js +21 -0
- package/dist/src/health/index.js.map +1 -0
- package/dist/src/health/readinessCheck.d.ts +139 -0
- package/dist/src/health/readinessCheck.d.ts.map +1 -0
- package/dist/src/health/readinessCheck.js +266 -0
- package/dist/src/health/readinessCheck.js.map +1 -0
- package/dist/src/index.d.ts +8 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +178 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/index.test.d.ts +2 -0
- package/dist/src/index.test.d.ts.map +1 -0
- package/dist/src/index.test.js +43 -0
- package/dist/src/index.test.js.map +1 -0
- package/dist/src/logger.d.ts +26 -0
- package/dist/src/logger.d.ts.map +1 -0
- package/dist/src/logger.js +179 -0
- package/dist/src/logger.js.map +1 -0
- package/dist/src/middleware/__tests__/csp.test.d.ts +2 -0
- package/dist/src/middleware/__tests__/csp.test.d.ts.map +1 -0
- package/dist/src/middleware/__tests__/csp.test.js +389 -0
- package/dist/src/middleware/__tests__/csp.test.js.map +1 -0
- package/dist/src/middleware/csp.d.ts +87 -0
- package/dist/src/middleware/csp.d.ts.map +1 -0
- package/dist/src/middleware/csp.js +273 -0
- package/dist/src/middleware/csp.js.map +1 -0
- package/dist/src/middleware/degradation.d.ts +99 -0
- package/dist/src/middleware/degradation.d.ts.map +1 -0
- package/dist/src/middleware/degradation.js +315 -0
- package/dist/src/middleware/degradation.js.map +1 -0
- package/dist/src/middleware/errorFormatter.d.ts +119 -0
- package/dist/src/middleware/errorFormatter.d.ts.map +1 -0
- package/dist/src/middleware/errorFormatter.js +294 -0
- package/dist/src/middleware/errorFormatter.js.map +1 -0
- package/dist/src/middleware/index.d.ts +10 -0
- package/dist/src/middleware/index.d.ts.map +1 -0
- package/dist/src/middleware/index.js +14 -0
- package/dist/src/middleware/index.js.map +1 -0
- package/dist/src/middleware/license.d.ts +161 -0
- package/dist/src/middleware/license.d.ts.map +1 -0
- package/dist/src/middleware/license.js +281 -0
- package/dist/src/middleware/license.js.map +1 -0
- package/dist/src/middleware/toolFeatureMapping.d.ts +36 -0
- package/dist/src/middleware/toolFeatureMapping.d.ts.map +1 -0
- package/dist/src/middleware/toolFeatureMapping.js +90 -0
- package/dist/src/middleware/toolFeatureMapping.js.map +1 -0
- package/dist/src/onboarding/first-run.d.ts +64 -0
- package/dist/src/onboarding/first-run.d.ts.map +1 -0
- package/dist/src/onboarding/first-run.js +77 -0
- package/dist/src/onboarding/first-run.js.map +1 -0
- package/dist/src/onboarding/index.d.ts +7 -0
- package/dist/src/onboarding/index.d.ts.map +1 -0
- package/dist/src/onboarding/index.js +7 -0
- package/dist/src/onboarding/index.js.map +1 -0
- package/dist/src/suggestions/index.d.ts +21 -0
- package/dist/src/suggestions/index.d.ts.map +1 -0
- package/dist/src/suggestions/index.js +20 -0
- package/dist/src/suggestions/index.js.map +1 -0
- package/dist/src/suggestions/suggestion-engine.d.ts +185 -0
- package/dist/src/suggestions/suggestion-engine.d.ts.map +1 -0
- package/dist/src/suggestions/suggestion-engine.js +352 -0
- package/dist/src/suggestions/suggestion-engine.js.map +1 -0
- package/dist/src/suggestions/types.d.ts +88 -0
- package/dist/src/suggestions/types.d.ts.map +1 -0
- package/dist/src/suggestions/types.js +21 -0
- package/dist/src/suggestions/types.js.map +1 -0
- package/dist/src/tools/analyze.d.ts +151 -0
- package/dist/src/tools/analyze.d.ts.map +1 -0
- package/dist/src/tools/analyze.js +205 -0
- package/dist/src/tools/analyze.js.map +1 -0
- package/dist/src/tools/compare.d.ts +149 -0
- package/dist/src/tools/compare.d.ts.map +1 -0
- package/dist/src/tools/compare.js +464 -0
- package/dist/src/tools/compare.js.map +1 -0
- package/dist/src/tools/get-skill.d.ts +116 -0
- package/dist/src/tools/get-skill.d.ts.map +1 -0
- package/dist/src/tools/get-skill.js +224 -0
- package/dist/src/tools/get-skill.js.map +1 -0
- package/dist/src/tools/index.d.ts +20 -0
- package/dist/src/tools/index.d.ts.map +1 -0
- package/dist/src/tools/index.js +20 -0
- package/dist/src/tools/index.js.map +1 -0
- package/dist/src/tools/install.d.ts +122 -0
- package/dist/src/tools/install.d.ts.map +1 -0
- package/dist/src/tools/install.js +314 -0
- package/dist/src/tools/install.js.map +1 -0
- package/dist/src/tools/recommend.d.ts +171 -0
- package/dist/src/tools/recommend.d.ts.map +1 -0
- package/dist/src/tools/recommend.js +325 -0
- package/dist/src/tools/recommend.js.map +1 -0
- package/dist/src/tools/search.d.ts +121 -0
- package/dist/src/tools/search.d.ts.map +1 -0
- package/dist/src/tools/search.js +249 -0
- package/dist/src/tools/search.js.map +1 -0
- package/dist/src/tools/suggest.d.ts +181 -0
- package/dist/src/tools/suggest.d.ts.map +1 -0
- package/dist/src/tools/suggest.js +342 -0
- package/dist/src/tools/suggest.js.map +1 -0
- package/dist/src/tools/uninstall.d.ts +123 -0
- package/dist/src/tools/uninstall.d.ts.map +1 -0
- package/dist/src/tools/uninstall.js +250 -0
- package/dist/src/tools/uninstall.js.map +1 -0
- package/dist/src/tools/validate.d.ts +122 -0
- package/dist/src/tools/validate.d.ts.map +1 -0
- package/dist/src/tools/validate.js +497 -0
- package/dist/src/tools/validate.js.map +1 -0
- package/dist/src/utils/installed-skills.d.ts +101 -0
- package/dist/src/utils/installed-skills.d.ts.map +1 -0
- package/dist/src/utils/installed-skills.js +220 -0
- package/dist/src/utils/installed-skills.js.map +1 -0
- package/dist/src/utils/validation.d.ts +76 -0
- package/dist/src/utils/validation.d.ts.map +1 -0
- package/dist/src/utils/validation.js +153 -0
- package/dist/src/utils/validation.js.map +1 -0
- package/dist/src/webhooks/index.d.ts +8 -0
- package/dist/src/webhooks/index.d.ts.map +1 -0
- package/dist/src/webhooks/index.js +9 -0
- package/dist/src/webhooks/index.js.map +1 -0
- package/dist/src/webhooks/webhook-endpoint.d.ts +149 -0
- package/dist/src/webhooks/webhook-endpoint.d.ts.map +1 -0
- package/dist/src/webhooks/webhook-endpoint.js +339 -0
- package/dist/src/webhooks/webhook-endpoint.js.map +1 -0
- package/dist/tests/compare.test.d.ts +6 -0
- package/dist/tests/compare.test.d.ts.map +1 -0
- package/dist/tests/compare.test.js +225 -0
- package/dist/tests/compare.test.js.map +1 -0
- package/dist/tests/context/project-detector.test.d.ts +6 -0
- package/dist/tests/context/project-detector.test.d.ts.map +1 -0
- package/dist/tests/context/project-detector.test.js +719 -0
- package/dist/tests/context/project-detector.test.js.map +1 -0
- package/dist/tests/e2e/compare.e2e.test.d.ts +10 -0
- package/dist/tests/e2e/compare.e2e.test.d.ts.map +1 -0
- package/dist/tests/e2e/compare.e2e.test.js +286 -0
- package/dist/tests/e2e/compare.e2e.test.js.map +1 -0
- package/dist/tests/e2e/install-flow.e2e.test.d.ts +10 -0
- package/dist/tests/e2e/install-flow.e2e.test.d.ts.map +1 -0
- package/dist/tests/e2e/install-flow.e2e.test.js +209 -0
- package/dist/tests/e2e/install-flow.e2e.test.js.map +1 -0
- package/dist/tests/e2e/recommend.e2e.test.d.ts +12 -0
- package/dist/tests/e2e/recommend.e2e.test.d.ts.map +1 -0
- package/dist/tests/e2e/recommend.e2e.test.js +347 -0
- package/dist/tests/e2e/recommend.e2e.test.js.map +1 -0
- package/dist/tests/e2e/skill-flow.e2e.test.d.ts +10 -0
- package/dist/tests/e2e/skill-flow.e2e.test.d.ts.map +1 -0
- package/dist/tests/e2e/skill-flow.e2e.test.js +280 -0
- package/dist/tests/e2e/skill-flow.e2e.test.js.map +1 -0
- package/dist/tests/e2e/suggest.e2e.test.d.ts +13 -0
- package/dist/tests/e2e/suggest.e2e.test.d.ts.map +1 -0
- package/dist/tests/e2e/suggest.e2e.test.js +347 -0
- package/dist/tests/e2e/suggest.e2e.test.js.map +1 -0
- package/dist/tests/e2e/utils/baseline-collector.d.ts +107 -0
- package/dist/tests/e2e/utils/baseline-collector.d.ts.map +1 -0
- package/dist/tests/e2e/utils/baseline-collector.js +211 -0
- package/dist/tests/e2e/utils/baseline-collector.js.map +1 -0
- package/dist/tests/e2e/utils/hardcoded-detector.d.ts +46 -0
- package/dist/tests/e2e/utils/hardcoded-detector.d.ts.map +1 -0
- package/dist/tests/e2e/utils/hardcoded-detector.js +255 -0
- package/dist/tests/e2e/utils/hardcoded-detector.js.map +1 -0
- package/dist/tests/e2e/utils/index.d.ts +7 -0
- package/dist/tests/e2e/utils/index.d.ts.map +1 -0
- package/dist/tests/e2e/utils/index.js +7 -0
- package/dist/tests/e2e/utils/index.js.map +1 -0
- package/dist/tests/e2e/utils/linear-reporter.d.ts +60 -0
- package/dist/tests/e2e/utils/linear-reporter.d.ts.map +1 -0
- package/dist/tests/e2e/utils/linear-reporter.js +232 -0
- package/dist/tests/e2e/utils/linear-reporter.js.map +1 -0
- package/dist/tests/health.test.d.ts +9 -0
- package/dist/tests/health.test.d.ts.map +1 -0
- package/dist/tests/health.test.js +308 -0
- package/dist/tests/health.test.js.map +1 -0
- package/dist/tests/integration/analyze.integration.test.d.ts +2 -0
- package/dist/tests/integration/analyze.integration.test.d.ts.map +1 -0
- package/dist/tests/integration/analyze.integration.test.js +244 -0
- package/dist/tests/integration/analyze.integration.test.js.map +1 -0
- package/dist/tests/integration/compare.integration.test.d.ts +2 -0
- package/dist/tests/integration/compare.integration.test.d.ts.map +1 -0
- package/dist/tests/integration/compare.integration.test.js +120 -0
- package/dist/tests/integration/compare.integration.test.js.map +1 -0
- package/dist/tests/integration/fixtures/test-skills.d.ts +62 -0
- package/dist/tests/integration/fixtures/test-skills.d.ts.map +1 -0
- package/dist/tests/integration/fixtures/test-skills.js +644 -0
- package/dist/tests/integration/fixtures/test-skills.js.map +1 -0
- package/dist/tests/integration/get-skill.integration.test.d.ts +6 -0
- package/dist/tests/integration/get-skill.integration.test.d.ts.map +1 -0
- package/dist/tests/integration/get-skill.integration.test.js +203 -0
- package/dist/tests/integration/get-skill.integration.test.js.map +1 -0
- package/dist/tests/integration/github-api.integration.test.d.ts +14 -0
- package/dist/tests/integration/github-api.integration.test.d.ts.map +1 -0
- package/dist/tests/integration/github-api.integration.test.js +190 -0
- package/dist/tests/integration/github-api.integration.test.js.map +1 -0
- package/dist/tests/integration/install.integration.test.d.ts +6 -0
- package/dist/tests/integration/install.integration.test.d.ts.map +1 -0
- package/dist/tests/integration/install.integration.test.js +282 -0
- package/dist/tests/integration/install.integration.test.js.map +1 -0
- package/dist/tests/integration/recommend.integration.test.d.ts +2 -0
- package/dist/tests/integration/recommend.integration.test.d.ts.map +1 -0
- package/dist/tests/integration/recommend.integration.test.js +215 -0
- package/dist/tests/integration/recommend.integration.test.js.map +1 -0
- package/dist/tests/integration/search.integration.test.d.ts +6 -0
- package/dist/tests/integration/search.integration.test.d.ts.map +1 -0
- package/dist/tests/integration/search.integration.test.js +229 -0
- package/dist/tests/integration/search.integration.test.js.map +1 -0
- package/dist/tests/integration/setup.d.ts +71 -0
- package/dist/tests/integration/setup.d.ts.map +1 -0
- package/dist/tests/integration/setup.js +124 -0
- package/dist/tests/integration/setup.js.map +1 -0
- package/dist/tests/integration/uninstall.integration.test.d.ts +6 -0
- package/dist/tests/integration/uninstall.integration.test.d.ts.map +1 -0
- package/dist/tests/integration/uninstall.integration.test.js +296 -0
- package/dist/tests/integration/uninstall.integration.test.js.map +1 -0
- package/dist/tests/integration/validate.integration.test.d.ts +2 -0
- package/dist/tests/integration/validate.integration.test.d.ts.map +1 -0
- package/dist/tests/integration/validate.integration.test.js +181 -0
- package/dist/tests/integration/validate.integration.test.js.map +1 -0
- package/dist/tests/onboarding/first-run.test.d.ts +7 -0
- package/dist/tests/onboarding/first-run.test.d.ts.map +1 -0
- package/dist/tests/onboarding/first-run.test.js +258 -0
- package/dist/tests/onboarding/first-run.test.js.map +1 -0
- package/dist/tests/performance/search-performance.test.d.ts +10 -0
- package/dist/tests/performance/search-performance.test.d.ts.map +1 -0
- package/dist/tests/performance/search-performance.test.js +218 -0
- package/dist/tests/performance/search-performance.test.js.map +1 -0
- package/dist/tests/recommend.test.d.ts +6 -0
- package/dist/tests/recommend.test.d.ts.map +1 -0
- package/dist/tests/recommend.test.js +208 -0
- package/dist/tests/recommend.test.js.map +1 -0
- package/dist/tests/suggestions/suggestion-engine.test.d.ts +6 -0
- package/dist/tests/suggestions/suggestion-engine.test.d.ts.map +1 -0
- package/dist/tests/suggestions/suggestion-engine.test.js +448 -0
- package/dist/tests/suggestions/suggestion-engine.test.js.map +1 -0
- package/dist/tests/test-utils.d.ts +74 -0
- package/dist/tests/test-utils.d.ts.map +1 -0
- package/dist/tests/test-utils.js +98 -0
- package/dist/tests/test-utils.js.map +1 -0
- package/dist/tests/tools.test.d.ts +5 -0
- package/dist/tests/tools.test.d.ts.map +1 -0
- package/dist/tests/tools.test.js +138 -0
- package/dist/tests/tools.test.js.map +1 -0
- package/dist/tests/unit/installed-skills.test.d.ts +6 -0
- package/dist/tests/unit/installed-skills.test.d.ts.map +1 -0
- package/dist/tests/unit/installed-skills.test.js +285 -0
- package/dist/tests/unit/installed-skills.test.js.map +1 -0
- package/dist/tests/unit/logger.test.d.ts +6 -0
- package/dist/tests/unit/logger.test.d.ts.map +1 -0
- package/dist/tests/unit/logger.test.js +281 -0
- package/dist/tests/unit/logger.test.js.map +1 -0
- package/dist/tests/validate.test.d.ts +5 -0
- package/dist/tests/validate.test.d.ts.map +1 -0
- package/dist/tests/validate.test.js +303 -0
- package/dist/tests/validate.test.js.map +1 -0
- package/dist/tests/webhooks/proxy-trust.security.test.d.ts +8 -0
- package/dist/tests/webhooks/proxy-trust.security.test.d.ts.map +1 -0
- package/dist/tests/webhooks/proxy-trust.security.test.js +145 -0
- package/dist/tests/webhooks/proxy-trust.security.test.js.map +1 -0
- package/dist/tests/webhooks/rate-limiter.security.test.d.ts +8 -0
- package/dist/tests/webhooks/rate-limiter.security.test.d.ts.map +1 -0
- package/dist/tests/webhooks/rate-limiter.security.test.js +122 -0
- package/dist/tests/webhooks/rate-limiter.security.test.js.map +1 -0
- package/dist/vitest.config.d.ts +6 -0
- package/dist/vitest.config.d.ts.map +1 -0
- package/dist/vitest.config.js +13 -0
- package/dist/vitest.config.js.map +1 -0
- package/package.json +63 -0
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview MCP analyze_codebase Tool
|
|
3
|
+
* @module @skillsmith/mcp-server/tools/analyze
|
|
4
|
+
* @see SMI-600: Implement analyze_codebase MCP tool
|
|
5
|
+
*
|
|
6
|
+
* Analyzes a codebase to extract context for skill recommendations.
|
|
7
|
+
* Uses TypeScript/JavaScript analysis per ADR-010.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* // Analyze current directory
|
|
11
|
+
* const result = await executeAnalyze({ path: '.' });
|
|
12
|
+
* console.log(result.frameworks);
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* // Analyze with options
|
|
16
|
+
* const result = await executeAnalyze({
|
|
17
|
+
* path: '/path/to/project',
|
|
18
|
+
* max_files: 500,
|
|
19
|
+
* include_dev_deps: false
|
|
20
|
+
* });
|
|
21
|
+
*/
|
|
22
|
+
import { z } from 'zod';
|
|
23
|
+
/**
|
|
24
|
+
* Zod schema for analyze tool input validation
|
|
25
|
+
*/
|
|
26
|
+
export declare const analyzeInputSchema: z.ZodObject<{
|
|
27
|
+
/** Path to analyze (default: current directory) */
|
|
28
|
+
path: z.ZodDefault<z.ZodString>;
|
|
29
|
+
/** Maximum files to analyze (default: 1000) */
|
|
30
|
+
max_files: z.ZodDefault<z.ZodNumber>;
|
|
31
|
+
/** Directories to exclude */
|
|
32
|
+
exclude_dirs: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
33
|
+
/** Include dev dependencies in analysis */
|
|
34
|
+
include_dev_deps: z.ZodDefault<z.ZodBoolean>;
|
|
35
|
+
}, "strip", z.ZodTypeAny, {
|
|
36
|
+
path: string;
|
|
37
|
+
max_files: number;
|
|
38
|
+
include_dev_deps: boolean;
|
|
39
|
+
exclude_dirs?: string[] | undefined;
|
|
40
|
+
}, {
|
|
41
|
+
path?: string | undefined;
|
|
42
|
+
max_files?: number | undefined;
|
|
43
|
+
exclude_dirs?: string[] | undefined;
|
|
44
|
+
include_dev_deps?: boolean | undefined;
|
|
45
|
+
}>;
|
|
46
|
+
/**
|
|
47
|
+
* Input type for analyze tool
|
|
48
|
+
*/
|
|
49
|
+
export type AnalyzeInput = z.input<typeof analyzeInputSchema>;
|
|
50
|
+
/**
|
|
51
|
+
* Simplified framework info for response
|
|
52
|
+
*/
|
|
53
|
+
export interface AnalyzeFramework {
|
|
54
|
+
/** Framework name */
|
|
55
|
+
name: string;
|
|
56
|
+
/** Confidence level (0-100) */
|
|
57
|
+
confidence: number;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Simplified dependency info for response
|
|
61
|
+
*/
|
|
62
|
+
export interface AnalyzeDependency {
|
|
63
|
+
/** Package name */
|
|
64
|
+
name: string;
|
|
65
|
+
/** Whether this is a dev dependency */
|
|
66
|
+
is_dev: boolean;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Analysis response with codebase context
|
|
70
|
+
*/
|
|
71
|
+
export interface AnalyzeResponse {
|
|
72
|
+
/** Detected frameworks */
|
|
73
|
+
frameworks: AnalyzeFramework[];
|
|
74
|
+
/** Top dependencies */
|
|
75
|
+
dependencies: AnalyzeDependency[];
|
|
76
|
+
/** Unique import modules */
|
|
77
|
+
imports: string[];
|
|
78
|
+
/** File statistics */
|
|
79
|
+
stats: {
|
|
80
|
+
total_files: number;
|
|
81
|
+
total_lines: number;
|
|
82
|
+
file_types: Record<string, number>;
|
|
83
|
+
};
|
|
84
|
+
/** Summary for skill matching */
|
|
85
|
+
summary: string;
|
|
86
|
+
/** Analysis timing */
|
|
87
|
+
timing: {
|
|
88
|
+
duration_ms: number;
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* MCP tool schema definition for analyze_codebase
|
|
93
|
+
*/
|
|
94
|
+
export declare const analyzeToolSchema: {
|
|
95
|
+
name: string;
|
|
96
|
+
description: string;
|
|
97
|
+
inputSchema: {
|
|
98
|
+
type: "object";
|
|
99
|
+
properties: {
|
|
100
|
+
path: {
|
|
101
|
+
type: string;
|
|
102
|
+
description: string;
|
|
103
|
+
default: string;
|
|
104
|
+
};
|
|
105
|
+
max_files: {
|
|
106
|
+
type: string;
|
|
107
|
+
description: string;
|
|
108
|
+
minimum: number;
|
|
109
|
+
maximum: number;
|
|
110
|
+
default: number;
|
|
111
|
+
};
|
|
112
|
+
exclude_dirs: {
|
|
113
|
+
type: string;
|
|
114
|
+
items: {
|
|
115
|
+
type: string;
|
|
116
|
+
};
|
|
117
|
+
description: string;
|
|
118
|
+
};
|
|
119
|
+
include_dev_deps: {
|
|
120
|
+
type: string;
|
|
121
|
+
description: string;
|
|
122
|
+
default: boolean;
|
|
123
|
+
};
|
|
124
|
+
};
|
|
125
|
+
required: never[];
|
|
126
|
+
};
|
|
127
|
+
};
|
|
128
|
+
/**
|
|
129
|
+
* Execute codebase analysis.
|
|
130
|
+
*
|
|
131
|
+
* Scans the specified directory for TypeScript/JavaScript files,
|
|
132
|
+
* extracts imports, detects frameworks, and returns context
|
|
133
|
+
* suitable for skill recommendations.
|
|
134
|
+
*
|
|
135
|
+
* @param input - Analysis parameters
|
|
136
|
+
* @returns Promise resolving to analysis response
|
|
137
|
+
* @throws {Error} When path doesn't exist or analysis fails
|
|
138
|
+
*
|
|
139
|
+
* @example
|
|
140
|
+
* const response = await executeAnalyze({
|
|
141
|
+
* path: './my-project',
|
|
142
|
+
* max_files: 500
|
|
143
|
+
* });
|
|
144
|
+
* console.log('Detected:', response.frameworks.map(f => f.name).join(', '));
|
|
145
|
+
*/
|
|
146
|
+
export declare function executeAnalyze(input: AnalyzeInput): Promise<AnalyzeResponse>;
|
|
147
|
+
/**
|
|
148
|
+
* Format analysis results for terminal display
|
|
149
|
+
*/
|
|
150
|
+
export declare function formatAnalysisResults(response: AnalyzeResponse): string;
|
|
151
|
+
//# sourceMappingURL=analyze.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../../../src/tools/analyze.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB;;GAEG;AACH,eAAO,MAAM,kBAAkB;IAC7B,mDAAmD;;IAEnD,+CAA+C;;IAE/C,6BAA6B;;IAE7B,2CAA2C;;;;;;;;;;;;EAE3C,CAAA;AAEF;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAA;AAE7D;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,qBAAqB;IACrB,IAAI,EAAE,MAAM,CAAA;IACZ,+BAA+B;IAC/B,UAAU,EAAE,MAAM,CAAA;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,mBAAmB;IACnB,IAAI,EAAE,MAAM,CAAA;IACZ,uCAAuC;IACvC,MAAM,EAAE,OAAO,CAAA;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,0BAA0B;IAC1B,UAAU,EAAE,gBAAgB,EAAE,CAAA;IAC9B,uBAAuB;IACvB,YAAY,EAAE,iBAAiB,EAAE,CAAA;IACjC,4BAA4B;IAC5B,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,sBAAsB;IACtB,KAAK,EAAE;QACL,WAAW,EAAE,MAAM,CAAA;QACnB,WAAW,EAAE,MAAM,CAAA;QACnB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KACnC,CAAA;IACD,iCAAiC;IACjC,OAAO,EAAE,MAAM,CAAA;IACf,sBAAsB;IACtB,MAAM,EAAE;QACN,WAAW,EAAE,MAAM,CAAA;KACpB,CAAA;CACF;AAED;;GAEG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkC7B,CAAA;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,eAAe,CAAC,CAclF;AAsDD;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,eAAe,GAAG,MAAM,CAoEvE"}
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview MCP analyze_codebase Tool
|
|
3
|
+
* @module @skillsmith/mcp-server/tools/analyze
|
|
4
|
+
* @see SMI-600: Implement analyze_codebase MCP tool
|
|
5
|
+
*
|
|
6
|
+
* Analyzes a codebase to extract context for skill recommendations.
|
|
7
|
+
* Uses TypeScript/JavaScript analysis per ADR-010.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* // Analyze current directory
|
|
11
|
+
* const result = await executeAnalyze({ path: '.' });
|
|
12
|
+
* console.log(result.frameworks);
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* // Analyze with options
|
|
16
|
+
* const result = await executeAnalyze({
|
|
17
|
+
* path: '/path/to/project',
|
|
18
|
+
* max_files: 500,
|
|
19
|
+
* include_dev_deps: false
|
|
20
|
+
* });
|
|
21
|
+
*/
|
|
22
|
+
import { z } from 'zod';
|
|
23
|
+
import { CodebaseAnalyzer } from '@skillsmith/core';
|
|
24
|
+
/**
|
|
25
|
+
* Zod schema for analyze tool input validation
|
|
26
|
+
*/
|
|
27
|
+
export const analyzeInputSchema = z.object({
|
|
28
|
+
/** Path to analyze (default: current directory) */
|
|
29
|
+
path: z.string().default('.'),
|
|
30
|
+
/** Maximum files to analyze (default: 1000) */
|
|
31
|
+
max_files: z.number().min(1).max(10000).default(1000),
|
|
32
|
+
/** Directories to exclude */
|
|
33
|
+
exclude_dirs: z.array(z.string()).optional(),
|
|
34
|
+
/** Include dev dependencies in analysis */
|
|
35
|
+
include_dev_deps: z.boolean().default(true),
|
|
36
|
+
});
|
|
37
|
+
/**
|
|
38
|
+
* MCP tool schema definition for analyze_codebase
|
|
39
|
+
*/
|
|
40
|
+
export const analyzeToolSchema = {
|
|
41
|
+
name: 'analyze_codebase',
|
|
42
|
+
description: 'Analyze a codebase to understand its structure, frameworks, and dependencies. ' +
|
|
43
|
+
'Returns context useful for skill recommendations. ' +
|
|
44
|
+
'Supports TypeScript, JavaScript, TSX, and JSX files.',
|
|
45
|
+
inputSchema: {
|
|
46
|
+
type: 'object',
|
|
47
|
+
properties: {
|
|
48
|
+
path: {
|
|
49
|
+
type: 'string',
|
|
50
|
+
description: 'Path to the codebase to analyze (default: current directory)',
|
|
51
|
+
default: '.',
|
|
52
|
+
},
|
|
53
|
+
max_files: {
|
|
54
|
+
type: 'number',
|
|
55
|
+
description: 'Maximum files to analyze (default: 1000, max: 10000)',
|
|
56
|
+
minimum: 1,
|
|
57
|
+
maximum: 10000,
|
|
58
|
+
default: 1000,
|
|
59
|
+
},
|
|
60
|
+
exclude_dirs: {
|
|
61
|
+
type: 'array',
|
|
62
|
+
items: { type: 'string' },
|
|
63
|
+
description: 'Directories to exclude (default: node_modules, dist, .git, coverage)',
|
|
64
|
+
},
|
|
65
|
+
include_dev_deps: {
|
|
66
|
+
type: 'boolean',
|
|
67
|
+
description: 'Include dev dependencies in analysis (default: true)',
|
|
68
|
+
default: true,
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
required: [],
|
|
72
|
+
},
|
|
73
|
+
};
|
|
74
|
+
/**
|
|
75
|
+
* Execute codebase analysis.
|
|
76
|
+
*
|
|
77
|
+
* Scans the specified directory for TypeScript/JavaScript files,
|
|
78
|
+
* extracts imports, detects frameworks, and returns context
|
|
79
|
+
* suitable for skill recommendations.
|
|
80
|
+
*
|
|
81
|
+
* @param input - Analysis parameters
|
|
82
|
+
* @returns Promise resolving to analysis response
|
|
83
|
+
* @throws {Error} When path doesn't exist or analysis fails
|
|
84
|
+
*
|
|
85
|
+
* @example
|
|
86
|
+
* const response = await executeAnalyze({
|
|
87
|
+
* path: './my-project',
|
|
88
|
+
* max_files: 500
|
|
89
|
+
* });
|
|
90
|
+
* console.log('Detected:', response.frameworks.map(f => f.name).join(', '));
|
|
91
|
+
*/
|
|
92
|
+
export async function executeAnalyze(input) {
|
|
93
|
+
// Validate input
|
|
94
|
+
const validated = analyzeInputSchema.parse(input);
|
|
95
|
+
const analyzer = new CodebaseAnalyzer();
|
|
96
|
+
const context = await analyzer.analyze(validated.path, {
|
|
97
|
+
maxFiles: validated.max_files,
|
|
98
|
+
excludeDirs: validated.exclude_dirs,
|
|
99
|
+
includeDevDeps: validated.include_dev_deps,
|
|
100
|
+
});
|
|
101
|
+
// Transform to response format
|
|
102
|
+
return transformContextToResponse(context, analyzer);
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Transform CodebaseContext to AnalyzeResponse
|
|
106
|
+
*/
|
|
107
|
+
function transformContextToResponse(context, analyzer) {
|
|
108
|
+
// Get unique import modules (external only)
|
|
109
|
+
const uniqueImports = new Set();
|
|
110
|
+
for (const imp of context.imports) {
|
|
111
|
+
// Skip relative imports
|
|
112
|
+
if (!imp.module.startsWith('.') && !imp.module.startsWith('/')) {
|
|
113
|
+
// Get base package name (e.g., '@scope/pkg' or 'pkg')
|
|
114
|
+
const parts = imp.module.split('/');
|
|
115
|
+
const basePkg = imp.module.startsWith('@') ? `${parts[0]}/${parts[1]}` : parts[0];
|
|
116
|
+
uniqueImports.add(basePkg);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
// Transform frameworks
|
|
120
|
+
const frameworks = context.frameworks
|
|
121
|
+
.slice(0, 10)
|
|
122
|
+
.map((f) => ({
|
|
123
|
+
name: f.name,
|
|
124
|
+
confidence: Math.round(f.confidence * 100),
|
|
125
|
+
}));
|
|
126
|
+
// Transform dependencies (top 20)
|
|
127
|
+
const dependencies = context.dependencies.slice(0, 20).map((d) => ({
|
|
128
|
+
name: d.name,
|
|
129
|
+
is_dev: d.isDev,
|
|
130
|
+
}));
|
|
131
|
+
// Get summary
|
|
132
|
+
const summary = analyzer.getSummary(context);
|
|
133
|
+
return {
|
|
134
|
+
frameworks,
|
|
135
|
+
dependencies,
|
|
136
|
+
imports: Array.from(uniqueImports).slice(0, 50),
|
|
137
|
+
stats: {
|
|
138
|
+
total_files: context.stats.totalFiles,
|
|
139
|
+
total_lines: context.stats.totalLines,
|
|
140
|
+
file_types: context.stats.filesByExtension,
|
|
141
|
+
},
|
|
142
|
+
summary,
|
|
143
|
+
timing: {
|
|
144
|
+
duration_ms: context.metadata.durationMs,
|
|
145
|
+
},
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Format analysis results for terminal display
|
|
150
|
+
*/
|
|
151
|
+
export function formatAnalysisResults(response) {
|
|
152
|
+
const lines = [];
|
|
153
|
+
lines.push('\n=== Codebase Analysis ===\n');
|
|
154
|
+
// Stats
|
|
155
|
+
lines.push(`Files: ${response.stats.total_files} | Lines: ${response.stats.total_lines.toLocaleString()}`);
|
|
156
|
+
lines.push(`Duration: ${response.timing.duration_ms}ms`);
|
|
157
|
+
lines.push('');
|
|
158
|
+
// File types
|
|
159
|
+
const fileTypes = Object.entries(response.stats.file_types)
|
|
160
|
+
.sort((a, b) => b[1] - a[1])
|
|
161
|
+
.map(([ext, count]) => `${ext}: ${count}`)
|
|
162
|
+
.join(', ');
|
|
163
|
+
lines.push(`File types: ${fileTypes}`);
|
|
164
|
+
lines.push('');
|
|
165
|
+
// Frameworks
|
|
166
|
+
if (response.frameworks.length > 0) {
|
|
167
|
+
lines.push('Frameworks detected:');
|
|
168
|
+
for (const fw of response.frameworks.slice(0, 5)) {
|
|
169
|
+
lines.push(` • ${fw.name} (${fw.confidence}% confidence)`);
|
|
170
|
+
}
|
|
171
|
+
lines.push('');
|
|
172
|
+
}
|
|
173
|
+
// Dependencies
|
|
174
|
+
if (response.dependencies.length > 0) {
|
|
175
|
+
const prodDeps = response.dependencies.filter((d) => !d.is_dev);
|
|
176
|
+
const devDeps = response.dependencies.filter((d) => d.is_dev);
|
|
177
|
+
if (prodDeps.length > 0) {
|
|
178
|
+
lines.push(`Dependencies (${prodDeps.length}):`);
|
|
179
|
+
lines.push(` ${prodDeps
|
|
180
|
+
.slice(0, 10)
|
|
181
|
+
.map((d) => d.name)
|
|
182
|
+
.join(', ')}`);
|
|
183
|
+
if (prodDeps.length > 10) {
|
|
184
|
+
lines.push(` ... and ${prodDeps.length - 10} more`);
|
|
185
|
+
}
|
|
186
|
+
lines.push('');
|
|
187
|
+
}
|
|
188
|
+
if (devDeps.length > 0) {
|
|
189
|
+
lines.push(`Dev dependencies (${devDeps.length}):`);
|
|
190
|
+
lines.push(` ${devDeps
|
|
191
|
+
.slice(0, 10)
|
|
192
|
+
.map((d) => d.name)
|
|
193
|
+
.join(', ')}`);
|
|
194
|
+
if (devDeps.length > 10) {
|
|
195
|
+
lines.push(` ... and ${devDeps.length - 10} more`);
|
|
196
|
+
}
|
|
197
|
+
lines.push('');
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
// Summary
|
|
201
|
+
lines.push('---');
|
|
202
|
+
lines.push(`Summary: ${response.summary}`);
|
|
203
|
+
return lines.join('\n');
|
|
204
|
+
}
|
|
205
|
+
//# sourceMappingURL=analyze.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyze.js","sourceRoot":"","sources":["../../../src/tools/analyze.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview MCP Skill Compare Tool for comparing two skills
|
|
3
|
+
* @module @skillsmith/mcp-server/tools/compare
|
|
4
|
+
* @see SMI-743: Add MCP Tool skill_compare
|
|
5
|
+
* @see SMI-791: Wire compare tool to SkillRepository
|
|
6
|
+
*
|
|
7
|
+
* Compares two skills across multiple dimensions:
|
|
8
|
+
* - Quality scores
|
|
9
|
+
* - Trust tiers
|
|
10
|
+
* - Features and capabilities
|
|
11
|
+
* - Dependencies
|
|
12
|
+
* - Size and complexity
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* // Compare two skills with context
|
|
16
|
+
* const result = await executeCompare({
|
|
17
|
+
* skill_a: 'community/jest-helper',
|
|
18
|
+
* skill_b: 'community/vitest-helper'
|
|
19
|
+
* }, context);
|
|
20
|
+
* console.log(result.recommendation);
|
|
21
|
+
*/
|
|
22
|
+
import { z } from 'zod';
|
|
23
|
+
import { type MCPTrustTier as TrustTier, type ScoreBreakdown } from '@skillsmith/core';
|
|
24
|
+
import type { ToolContext } from '../context.js';
|
|
25
|
+
/**
|
|
26
|
+
* Zod schema for compare tool input validation
|
|
27
|
+
*/
|
|
28
|
+
export declare const compareInputSchema: z.ZodObject<{
|
|
29
|
+
/** First skill ID to compare */
|
|
30
|
+
skill_a: z.ZodString;
|
|
31
|
+
/** Second skill ID to compare */
|
|
32
|
+
skill_b: z.ZodString;
|
|
33
|
+
}, "strip", z.ZodTypeAny, {
|
|
34
|
+
skill_a: string;
|
|
35
|
+
skill_b: string;
|
|
36
|
+
}, {
|
|
37
|
+
skill_a: string;
|
|
38
|
+
skill_b: string;
|
|
39
|
+
}>;
|
|
40
|
+
/**
|
|
41
|
+
* Input type derived from Zod schema
|
|
42
|
+
*/
|
|
43
|
+
export type CompareInput = z.infer<typeof compareInputSchema>;
|
|
44
|
+
/**
|
|
45
|
+
* Summary of a skill for comparison
|
|
46
|
+
*/
|
|
47
|
+
export interface SkillSummary {
|
|
48
|
+
/** Skill identifier */
|
|
49
|
+
id: string;
|
|
50
|
+
/** Skill name */
|
|
51
|
+
name: string;
|
|
52
|
+
/** Brief description */
|
|
53
|
+
description: string;
|
|
54
|
+
/** Author */
|
|
55
|
+
author: string;
|
|
56
|
+
/** Quality score (0-100) */
|
|
57
|
+
quality_score: number;
|
|
58
|
+
/** Score breakdown by category */
|
|
59
|
+
score_breakdown: ScoreBreakdown | null;
|
|
60
|
+
/** Trust tier */
|
|
61
|
+
trust_tier: TrustTier;
|
|
62
|
+
/** Category */
|
|
63
|
+
category: string;
|
|
64
|
+
/** Tags */
|
|
65
|
+
tags: string[];
|
|
66
|
+
/** Version if available */
|
|
67
|
+
version: string | null;
|
|
68
|
+
/** Dependencies */
|
|
69
|
+
dependencies: string[];
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Difference between skills
|
|
73
|
+
*/
|
|
74
|
+
export interface SkillDifference {
|
|
75
|
+
/** Field being compared */
|
|
76
|
+
field: string;
|
|
77
|
+
/** Value from skill A */
|
|
78
|
+
a_value: unknown;
|
|
79
|
+
/** Value from skill B */
|
|
80
|
+
b_value: unknown;
|
|
81
|
+
/** Winner if applicable */
|
|
82
|
+
winner?: 'a' | 'b' | 'tie';
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Comparison response
|
|
86
|
+
*/
|
|
87
|
+
export interface CompareResponse {
|
|
88
|
+
/** Summaries of both skills */
|
|
89
|
+
comparison: {
|
|
90
|
+
a: SkillSummary;
|
|
91
|
+
b: SkillSummary;
|
|
92
|
+
};
|
|
93
|
+
/** List of differences between skills */
|
|
94
|
+
differences: SkillDifference[];
|
|
95
|
+
/** Recommendation text */
|
|
96
|
+
recommendation: string;
|
|
97
|
+
/** Overall winner if determinable */
|
|
98
|
+
winner: 'a' | 'b' | 'tie';
|
|
99
|
+
/** Performance timing */
|
|
100
|
+
timing: {
|
|
101
|
+
totalMs: number;
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* MCP tool schema definition for skill_compare
|
|
106
|
+
*/
|
|
107
|
+
export declare const compareToolSchema: {
|
|
108
|
+
name: string;
|
|
109
|
+
description: string;
|
|
110
|
+
inputSchema: {
|
|
111
|
+
type: "object";
|
|
112
|
+
properties: {
|
|
113
|
+
skill_a: {
|
|
114
|
+
type: string;
|
|
115
|
+
description: string;
|
|
116
|
+
};
|
|
117
|
+
skill_b: {
|
|
118
|
+
type: string;
|
|
119
|
+
description: string;
|
|
120
|
+
};
|
|
121
|
+
};
|
|
122
|
+
required: string[];
|
|
123
|
+
};
|
|
124
|
+
};
|
|
125
|
+
/**
|
|
126
|
+
* Execute skill comparison.
|
|
127
|
+
*
|
|
128
|
+
* Uses SkillRepository to fetch skills from the database and compares them
|
|
129
|
+
* across multiple dimensions including quality scores, trust tiers, features,
|
|
130
|
+
* and dependencies.
|
|
131
|
+
*
|
|
132
|
+
* @param input - Comparison parameters with two skill IDs
|
|
133
|
+
* @param context - Tool context with database and services
|
|
134
|
+
* @returns Promise resolving to comparison response
|
|
135
|
+
* @throws {SkillsmithError} When skill IDs are invalid or not found
|
|
136
|
+
*
|
|
137
|
+
* @example
|
|
138
|
+
* const response = await executeCompare({
|
|
139
|
+
* skill_a: 'community/jest-helper',
|
|
140
|
+
* skill_b: 'community/vitest-helper'
|
|
141
|
+
* }, context);
|
|
142
|
+
* console.log(response.recommendation);
|
|
143
|
+
*/
|
|
144
|
+
export declare function executeCompare(input: CompareInput, context: ToolContext): Promise<CompareResponse>;
|
|
145
|
+
/**
|
|
146
|
+
* Format comparison results for terminal display
|
|
147
|
+
*/
|
|
148
|
+
export declare function formatComparisonResults(response: CompareResponse): string;
|
|
149
|
+
//# sourceMappingURL=compare.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compare.d.ts","sourceRoot":"","sources":["../../../src/tools/compare.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAEL,KAAK,YAAY,IAAI,SAAS,EAC9B,KAAK,cAAc,EAGpB,MAAM,kBAAkB,CAAA;AACzB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAGhD;;GAEG;AACH,eAAO,MAAM,kBAAkB;IAC7B,gCAAgC;;IAEhC,iCAAiC;;;;;;;;EAEjC,CAAA;AAEF;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAA;AAE7D;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,uBAAuB;IACvB,EAAE,EAAE,MAAM,CAAA;IACV,iBAAiB;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,wBAAwB;IACxB,WAAW,EAAE,MAAM,CAAA;IACnB,aAAa;IACb,MAAM,EAAE,MAAM,CAAA;IACd,4BAA4B;IAC5B,aAAa,EAAE,MAAM,CAAA;IACrB,kCAAkC;IAClC,eAAe,EAAE,cAAc,GAAG,IAAI,CAAA;IACtC,iBAAiB;IACjB,UAAU,EAAE,SAAS,CAAA;IACrB,eAAe;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW;IACX,IAAI,EAAE,MAAM,EAAE,CAAA;IACd,2BAA2B;IAC3B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,mBAAmB;IACnB,YAAY,EAAE,MAAM,EAAE,CAAA;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,2BAA2B;IAC3B,KAAK,EAAE,MAAM,CAAA;IACb,yBAAyB;IACzB,OAAO,EAAE,OAAO,CAAA;IAChB,yBAAyB;IACzB,OAAO,EAAE,OAAO,CAAA;IAChB,2BAA2B;IAC3B,MAAM,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,KAAK,CAAA;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,+BAA+B;IAC/B,UAAU,EAAE;QACV,CAAC,EAAE,YAAY,CAAA;QACf,CAAC,EAAE,YAAY,CAAA;KAChB,CAAA;IACD,yCAAyC;IACzC,WAAW,EAAE,eAAe,EAAE,CAAA;IAC9B,0BAA0B;IAC1B,cAAc,EAAE,MAAM,CAAA;IACtB,qCAAqC;IACrC,MAAM,EAAE,GAAG,GAAG,GAAG,GAAG,KAAK,CAAA;IACzB,yBAAyB;IACzB,MAAM,EAAE;QACN,OAAO,EAAE,MAAM,CAAA;KAChB,CAAA;CACF;AAED;;GAEG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;CAkB7B,CAAA;AAgSD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,cAAc,CAClC,KAAK,EAAE,YAAY,EACnB,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,eAAe,CAAC,CAiF1B;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,eAAe,GAAG,MAAM,CAoGzE"}
|