@skillsmith/mcp-server 0.3.0 → 0.3.1
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/package.json +1 -1
- package/dist/.tsbuildinfo +0 -1
- package/dist/src/__tests__/get-skill.test.d.ts +0 -6
- package/dist/src/__tests__/get-skill.test.d.ts.map +0 -1
- package/dist/src/__tests__/get-skill.test.js +0 -88
- package/dist/src/__tests__/get-skill.test.js.map +0 -1
- package/dist/src/__tests__/middleware/errorFormatter.test.d.ts +0 -7
- package/dist/src/__tests__/middleware/errorFormatter.test.d.ts.map +0 -1
- package/dist/src/__tests__/middleware/errorFormatter.test.js +0 -304
- package/dist/src/__tests__/middleware/errorFormatter.test.js.map +0 -1
- package/dist/src/__tests__/middleware/license.test.d.ts +0 -7
- package/dist/src/__tests__/middleware/license.test.d.ts.map +0 -1
- package/dist/src/__tests__/middleware/license.test.js +0 -500
- package/dist/src/__tests__/middleware/license.test.js.map +0 -1
- package/dist/src/__tests__/search.test.d.ts +0 -6
- package/dist/src/__tests__/search.test.d.ts.map +0 -1
- package/dist/src/__tests__/search.test.js +0 -86
- package/dist/src/__tests__/search.test.js.map +0 -1
- package/dist/src/__tests__/test-utils.d.ts +0 -20
- package/dist/src/__tests__/test-utils.d.ts.map +0 -1
- package/dist/src/__tests__/test-utils.js +0 -91
- package/dist/src/__tests__/test-utils.js.map +0 -1
- package/dist/src/context/index.d.ts +0 -19
- package/dist/src/context/index.d.ts.map +0 -1
- package/dist/src/context/index.js +0 -25
- package/dist/src/context/index.js.map +0 -1
- package/dist/src/context/project-detector.d.ts +0 -145
- package/dist/src/context/project-detector.d.ts.map +0 -1
- package/dist/src/context/project-detector.js +0 -321
- package/dist/src/context/project-detector.js.map +0 -1
- package/dist/src/context.d.ts +0 -157
- package/dist/src/context.d.ts.map +0 -1
- package/dist/src/context.js +0 -231
- package/dist/src/context.js.map +0 -1
- package/dist/src/core-shim.d.ts +0 -7
- package/dist/src/core-shim.d.ts.map +0 -1
- package/dist/src/core-shim.js +0 -9
- package/dist/src/core-shim.js.map +0 -1
- package/dist/src/health/healthCheck.d.ts +0 -88
- package/dist/src/health/healthCheck.d.ts.map +0 -1
- package/dist/src/health/healthCheck.js +0 -117
- package/dist/src/health/healthCheck.js.map +0 -1
- package/dist/src/health/index.d.ts +0 -21
- package/dist/src/health/index.d.ts.map +0 -1
- package/dist/src/health/index.js +0 -21
- package/dist/src/health/index.js.map +0 -1
- package/dist/src/health/readinessCheck.d.ts +0 -139
- package/dist/src/health/readinessCheck.d.ts.map +0 -1
- package/dist/src/health/readinessCheck.js +0 -266
- package/dist/src/health/readinessCheck.js.map +0 -1
- package/dist/src/index.d.ts +0 -9
- package/dist/src/index.d.ts.map +0 -1
- package/dist/src/index.js +0 -236
- package/dist/src/index.js.map +0 -1
- package/dist/src/index.test.d.ts +0 -2
- package/dist/src/index.test.d.ts.map +0 -1
- package/dist/src/index.test.js +0 -43
- package/dist/src/index.test.js.map +0 -1
- package/dist/src/logger.d.ts +0 -26
- package/dist/src/logger.d.ts.map +0 -1
- package/dist/src/logger.js +0 -179
- package/dist/src/logger.js.map +0 -1
- package/dist/src/middleware/__tests__/csp.test.d.ts +0 -2
- package/dist/src/middleware/__tests__/csp.test.d.ts.map +0 -1
- package/dist/src/middleware/__tests__/csp.test.js +0 -390
- package/dist/src/middleware/__tests__/csp.test.js.map +0 -1
- package/dist/src/middleware/csp.d.ts +0 -103
- package/dist/src/middleware/csp.d.ts.map +0 -1
- package/dist/src/middleware/csp.js +0 -273
- package/dist/src/middleware/csp.js.map +0 -1
- package/dist/src/middleware/degradation.d.ts +0 -105
- package/dist/src/middleware/degradation.d.ts.map +0 -1
- package/dist/src/middleware/degradation.js +0 -319
- package/dist/src/middleware/degradation.js.map +0 -1
- package/dist/src/middleware/errorFormatter.d.ts +0 -119
- package/dist/src/middleware/errorFormatter.d.ts.map +0 -1
- package/dist/src/middleware/errorFormatter.js +0 -294
- package/dist/src/middleware/errorFormatter.js.map +0 -1
- package/dist/src/middleware/index.d.ts +0 -11
- package/dist/src/middleware/index.d.ts.map +0 -1
- package/dist/src/middleware/index.js +0 -16
- package/dist/src/middleware/index.js.map +0 -1
- package/dist/src/middleware/license.d.ts +0 -169
- package/dist/src/middleware/license.d.ts.map +0 -1
- package/dist/src/middleware/license.js +0 -292
- package/dist/src/middleware/license.js.map +0 -1
- package/dist/src/middleware/quota.d.ts +0 -182
- package/dist/src/middleware/quota.d.ts.map +0 -1
- package/dist/src/middleware/quota.js +0 -309
- package/dist/src/middleware/quota.js.map +0 -1
- package/dist/src/middleware/toolFeatureMapping.d.ts +0 -36
- package/dist/src/middleware/toolFeatureMapping.d.ts.map +0 -1
- package/dist/src/middleware/toolFeatureMapping.js +0 -96
- package/dist/src/middleware/toolFeatureMapping.js.map +0 -1
- package/dist/src/onboarding/first-run.d.ts +0 -65
- package/dist/src/onboarding/first-run.d.ts.map +0 -1
- package/dist/src/onboarding/first-run.js +0 -79
- package/dist/src/onboarding/first-run.js.map +0 -1
- package/dist/src/onboarding/index.d.ts +0 -7
- package/dist/src/onboarding/index.d.ts.map +0 -1
- package/dist/src/onboarding/index.js +0 -7
- package/dist/src/onboarding/index.js.map +0 -1
- package/dist/src/onboarding/install-assets.d.ts +0 -27
- package/dist/src/onboarding/install-assets.d.ts.map +0 -1
- package/dist/src/onboarding/install-assets.js +0 -128
- package/dist/src/onboarding/install-assets.js.map +0 -1
- package/dist/src/suggestions/index.d.ts +0 -21
- package/dist/src/suggestions/index.d.ts.map +0 -1
- package/dist/src/suggestions/index.js +0 -20
- package/dist/src/suggestions/index.js.map +0 -1
- package/dist/src/suggestions/suggestion-engine.d.ts +0 -185
- package/dist/src/suggestions/suggestion-engine.d.ts.map +0 -1
- package/dist/src/suggestions/suggestion-engine.js +0 -352
- package/dist/src/suggestions/suggestion-engine.js.map +0 -1
- package/dist/src/suggestions/types.d.ts +0 -88
- package/dist/src/suggestions/types.d.ts.map +0 -1
- package/dist/src/suggestions/types.js +0 -21
- package/dist/src/suggestions/types.js.map +0 -1
- package/dist/src/tools/analyze.d.ts +0 -151
- package/dist/src/tools/analyze.d.ts.map +0 -1
- package/dist/src/tools/analyze.js +0 -205
- package/dist/src/tools/analyze.js.map +0 -1
- package/dist/src/tools/compare.d.ts +0 -149
- package/dist/src/tools/compare.d.ts.map +0 -1
- package/dist/src/tools/compare.js +0 -464
- package/dist/src/tools/compare.js.map +0 -1
- package/dist/src/tools/get-skill.d.ts +0 -107
- package/dist/src/tools/get-skill.d.ts.map +0 -1
- package/dist/src/tools/get-skill.js +0 -260
- package/dist/src/tools/get-skill.js.map +0 -1
- package/dist/src/tools/index.d.ts +0 -20
- package/dist/src/tools/index.d.ts.map +0 -1
- package/dist/src/tools/index.js +0 -20
- package/dist/src/tools/index.js.map +0 -1
- package/dist/src/tools/install.d.ts +0 -122
- package/dist/src/tools/install.d.ts.map +0 -1
- package/dist/src/tools/install.js +0 -326
- package/dist/src/tools/install.js.map +0 -1
- package/dist/src/tools/recommend.d.ts +0 -169
- package/dist/src/tools/recommend.d.ts.map +0 -1
- package/dist/src/tools/recommend.js +0 -357
- package/dist/src/tools/recommend.js.map +0 -1
- package/dist/src/tools/search.d.ts +0 -114
- package/dist/src/tools/search.d.ts.map +0 -1
- package/dist/src/tools/search.js +0 -247
- package/dist/src/tools/search.js.map +0 -1
- package/dist/src/tools/suggest.d.ts +0 -181
- package/dist/src/tools/suggest.d.ts.map +0 -1
- package/dist/src/tools/suggest.js +0 -310
- package/dist/src/tools/suggest.js.map +0 -1
- package/dist/src/tools/uninstall.d.ts +0 -123
- package/dist/src/tools/uninstall.d.ts.map +0 -1
- package/dist/src/tools/uninstall.js +0 -250
- package/dist/src/tools/uninstall.js.map +0 -1
- package/dist/src/tools/validate.d.ts +0 -122
- package/dist/src/tools/validate.d.ts.map +0 -1
- package/dist/src/tools/validate.js +0 -497
- package/dist/src/tools/validate.js.map +0 -1
- package/dist/src/utils/installed-skills.d.ts +0 -101
- package/dist/src/utils/installed-skills.d.ts.map +0 -1
- package/dist/src/utils/installed-skills.js +0 -220
- package/dist/src/utils/installed-skills.js.map +0 -1
- package/dist/src/utils/validation.d.ts +0 -95
- package/dist/src/utils/validation.d.ts.map +0 -1
- package/dist/src/utils/validation.js +0 -186
- package/dist/src/utils/validation.js.map +0 -1
- package/dist/src/webhooks/index.d.ts +0 -8
- package/dist/src/webhooks/index.d.ts.map +0 -1
- package/dist/src/webhooks/index.js +0 -9
- package/dist/src/webhooks/index.js.map +0 -1
- package/dist/src/webhooks/webhook-endpoint.d.ts +0 -149
- package/dist/src/webhooks/webhook-endpoint.d.ts.map +0 -1
- package/dist/src/webhooks/webhook-endpoint.js +0 -339
- package/dist/src/webhooks/webhook-endpoint.js.map +0 -1
- package/dist/tests/compare.test.d.ts +0 -6
- package/dist/tests/compare.test.d.ts.map +0 -1
- package/dist/tests/compare.test.js +0 -225
- package/dist/tests/compare.test.js.map +0 -1
- package/dist/tests/context/project-detector.test.d.ts +0 -6
- package/dist/tests/context/project-detector.test.d.ts.map +0 -1
- package/dist/tests/context/project-detector.test.js +0 -719
- package/dist/tests/context/project-detector.test.js.map +0 -1
- package/dist/tests/e2e/compare.e2e.test.d.ts +0 -10
- package/dist/tests/e2e/compare.e2e.test.d.ts.map +0 -1
- package/dist/tests/e2e/compare.e2e.test.js +0 -296
- package/dist/tests/e2e/compare.e2e.test.js.map +0 -1
- package/dist/tests/e2e/install-flow.e2e.test.d.ts +0 -10
- package/dist/tests/e2e/install-flow.e2e.test.d.ts.map +0 -1
- package/dist/tests/e2e/install-flow.e2e.test.js +0 -229
- package/dist/tests/e2e/install-flow.e2e.test.js.map +0 -1
- package/dist/tests/e2e/recommend.e2e.test.d.ts +0 -12
- package/dist/tests/e2e/recommend.e2e.test.d.ts.map +0 -1
- package/dist/tests/e2e/recommend.e2e.test.js +0 -357
- package/dist/tests/e2e/recommend.e2e.test.js.map +0 -1
- package/dist/tests/e2e/skill-flow.e2e.test.d.ts +0 -10
- package/dist/tests/e2e/skill-flow.e2e.test.d.ts.map +0 -1
- package/dist/tests/e2e/skill-flow.e2e.test.js +0 -311
- package/dist/tests/e2e/skill-flow.e2e.test.js.map +0 -1
- package/dist/tests/e2e/suggest.e2e.test.d.ts +0 -13
- package/dist/tests/e2e/suggest.e2e.test.d.ts.map +0 -1
- package/dist/tests/e2e/suggest.e2e.test.js +0 -367
- package/dist/tests/e2e/suggest.e2e.test.js.map +0 -1
- package/dist/tests/e2e/utils/baseline-collector.d.ts +0 -107
- package/dist/tests/e2e/utils/baseline-collector.d.ts.map +0 -1
- package/dist/tests/e2e/utils/baseline-collector.js +0 -211
- package/dist/tests/e2e/utils/baseline-collector.js.map +0 -1
- package/dist/tests/e2e/utils/hardcoded-detector.d.ts +0 -46
- package/dist/tests/e2e/utils/hardcoded-detector.d.ts.map +0 -1
- package/dist/tests/e2e/utils/hardcoded-detector.js +0 -255
- package/dist/tests/e2e/utils/hardcoded-detector.js.map +0 -1
- package/dist/tests/e2e/utils/index.d.ts +0 -7
- package/dist/tests/e2e/utils/index.d.ts.map +0 -1
- package/dist/tests/e2e/utils/index.js +0 -7
- package/dist/tests/e2e/utils/index.js.map +0 -1
- package/dist/tests/e2e/utils/linear-reporter.d.ts +0 -60
- package/dist/tests/e2e/utils/linear-reporter.d.ts.map +0 -1
- package/dist/tests/e2e/utils/linear-reporter.js +0 -232
- package/dist/tests/e2e/utils/linear-reporter.js.map +0 -1
- package/dist/tests/health.test.d.ts +0 -9
- package/dist/tests/health.test.d.ts.map +0 -1
- package/dist/tests/health.test.js +0 -308
- package/dist/tests/health.test.js.map +0 -1
- package/dist/tests/integration/analyze.integration.test.d.ts +0 -2
- package/dist/tests/integration/analyze.integration.test.d.ts.map +0 -1
- package/dist/tests/integration/analyze.integration.test.js +0 -244
- package/dist/tests/integration/analyze.integration.test.js.map +0 -1
- package/dist/tests/integration/compare.integration.test.d.ts +0 -2
- package/dist/tests/integration/compare.integration.test.d.ts.map +0 -1
- package/dist/tests/integration/compare.integration.test.js +0 -120
- package/dist/tests/integration/compare.integration.test.js.map +0 -1
- package/dist/tests/integration/fixtures/test-skills.d.ts +0 -62
- package/dist/tests/integration/fixtures/test-skills.d.ts.map +0 -1
- package/dist/tests/integration/fixtures/test-skills.js +0 -644
- package/dist/tests/integration/fixtures/test-skills.js.map +0 -1
- package/dist/tests/integration/get-skill.integration.test.d.ts +0 -6
- package/dist/tests/integration/get-skill.integration.test.d.ts.map +0 -1
- package/dist/tests/integration/get-skill.integration.test.js +0 -203
- package/dist/tests/integration/get-skill.integration.test.js.map +0 -1
- package/dist/tests/integration/github-api.integration.test.d.ts +0 -14
- package/dist/tests/integration/github-api.integration.test.d.ts.map +0 -1
- package/dist/tests/integration/github-api.integration.test.js +0 -190
- package/dist/tests/integration/github-api.integration.test.js.map +0 -1
- package/dist/tests/integration/install.integration.test.d.ts +0 -6
- package/dist/tests/integration/install.integration.test.d.ts.map +0 -1
- package/dist/tests/integration/install.integration.test.js +0 -282
- package/dist/tests/integration/install.integration.test.js.map +0 -1
- package/dist/tests/integration/recommend.integration.test.d.ts +0 -2
- package/dist/tests/integration/recommend.integration.test.d.ts.map +0 -1
- package/dist/tests/integration/recommend.integration.test.js +0 -217
- package/dist/tests/integration/recommend.integration.test.js.map +0 -1
- package/dist/tests/integration/search.integration.test.d.ts +0 -6
- package/dist/tests/integration/search.integration.test.d.ts.map +0 -1
- package/dist/tests/integration/search.integration.test.js +0 -229
- package/dist/tests/integration/search.integration.test.js.map +0 -1
- package/dist/tests/integration/setup.d.ts +0 -74
- package/dist/tests/integration/setup.d.ts.map +0 -1
- package/dist/tests/integration/setup.js +0 -131
- package/dist/tests/integration/setup.js.map +0 -1
- package/dist/tests/integration/uninstall.integration.test.d.ts +0 -6
- package/dist/tests/integration/uninstall.integration.test.d.ts.map +0 -1
- package/dist/tests/integration/uninstall.integration.test.js +0 -296
- package/dist/tests/integration/uninstall.integration.test.js.map +0 -1
- package/dist/tests/integration/validate.integration.test.d.ts +0 -2
- package/dist/tests/integration/validate.integration.test.d.ts.map +0 -1
- package/dist/tests/integration/validate.integration.test.js +0 -181
- package/dist/tests/integration/validate.integration.test.js.map +0 -1
- package/dist/tests/onboarding/first-run.test.d.ts +0 -7
- package/dist/tests/onboarding/first-run.test.d.ts.map +0 -1
- package/dist/tests/onboarding/first-run.test.js +0 -264
- package/dist/tests/onboarding/first-run.test.js.map +0 -1
- package/dist/tests/performance/search-performance.test.d.ts +0 -10
- package/dist/tests/performance/search-performance.test.d.ts.map +0 -1
- package/dist/tests/performance/search-performance.test.js +0 -222
- package/dist/tests/performance/search-performance.test.js.map +0 -1
- package/dist/tests/recommend.test.d.ts +0 -6
- package/dist/tests/recommend.test.d.ts.map +0 -1
- package/dist/tests/recommend.test.js +0 -210
- package/dist/tests/recommend.test.js.map +0 -1
- package/dist/tests/suggestions/suggestion-engine.test.d.ts +0 -6
- package/dist/tests/suggestions/suggestion-engine.test.d.ts.map +0 -1
- package/dist/tests/suggestions/suggestion-engine.test.js +0 -448
- package/dist/tests/suggestions/suggestion-engine.test.js.map +0 -1
- package/dist/tests/test-utils.d.ts +0 -74
- package/dist/tests/test-utils.d.ts.map +0 -1
- package/dist/tests/test-utils.js +0 -98
- package/dist/tests/test-utils.js.map +0 -1
- package/dist/tests/tools.test.d.ts +0 -5
- package/dist/tests/tools.test.d.ts.map +0 -1
- package/dist/tests/tools.test.js +0 -138
- package/dist/tests/tools.test.js.map +0 -1
- package/dist/tests/unit/installed-skills.test.d.ts +0 -6
- package/dist/tests/unit/installed-skills.test.d.ts.map +0 -1
- package/dist/tests/unit/installed-skills.test.js +0 -285
- package/dist/tests/unit/installed-skills.test.js.map +0 -1
- package/dist/tests/unit/logger.test.d.ts +0 -6
- package/dist/tests/unit/logger.test.d.ts.map +0 -1
- package/dist/tests/unit/logger.test.js +0 -281
- package/dist/tests/unit/logger.test.js.map +0 -1
- package/dist/tests/validate.test.d.ts +0 -5
- package/dist/tests/validate.test.d.ts.map +0 -1
- package/dist/tests/validate.test.js +0 -303
- package/dist/tests/validate.test.js.map +0 -1
- package/dist/tests/webhooks/proxy-trust.security.test.d.ts +0 -8
- package/dist/tests/webhooks/proxy-trust.security.test.d.ts.map +0 -1
- package/dist/tests/webhooks/proxy-trust.security.test.js +0 -145
- package/dist/tests/webhooks/proxy-trust.security.test.js.map +0 -1
- package/dist/tests/webhooks/rate-limiter.security.test.d.ts +0 -8
- package/dist/tests/webhooks/rate-limiter.security.test.d.ts.map +0 -1
- package/dist/tests/webhooks/rate-limiter.security.test.js +0 -122
- package/dist/tests/webhooks/rate-limiter.security.test.js.map +0 -1
- package/dist/vitest.config.d.ts +0 -6
- package/dist/vitest.config.d.ts.map +0 -1
- package/dist/vitest.config.js +0 -13
- package/dist/vitest.config.js.map +0 -1
|
@@ -1,309 +0,0 @@
|
|
|
1
|
-
// SPDX-License-Identifier: Elastic-2.0
|
|
2
|
-
// Copyright 2024-2025 Smith Horn Group Ltd
|
|
3
|
-
import { buildQuotaExceededResponse } from './errorFormatter.js';
|
|
4
|
-
// ============================================================================
|
|
5
|
-
// Configuration
|
|
6
|
-
// ============================================================================
|
|
7
|
-
/**
|
|
8
|
-
* Tier quota limits (API calls per month)
|
|
9
|
-
* -1 represents unlimited
|
|
10
|
-
*/
|
|
11
|
-
const TIER_QUOTAS = {
|
|
12
|
-
community: 1_000,
|
|
13
|
-
individual: 10_000,
|
|
14
|
-
team: 100_000,
|
|
15
|
-
enterprise: -1, // Unlimited
|
|
16
|
-
};
|
|
17
|
-
/**
|
|
18
|
-
* Configuration for the upgrade URL
|
|
19
|
-
*/
|
|
20
|
-
const UPGRADE_URL = 'https://skillsmith.app/upgrade';
|
|
21
|
-
// ============================================================================
|
|
22
|
-
// In-Memory Storage (Default)
|
|
23
|
-
// ============================================================================
|
|
24
|
-
/**
|
|
25
|
-
* Simple in-memory storage for quota tracking
|
|
26
|
-
* Note: This resets on server restart. Use a database-backed storage
|
|
27
|
-
* in production via the storage option.
|
|
28
|
-
*/
|
|
29
|
-
class InMemoryQuotaStorage {
|
|
30
|
-
usage = new Map();
|
|
31
|
-
async getUsage(customerId) {
|
|
32
|
-
const now = new Date();
|
|
33
|
-
const existing = this.usage.get(customerId);
|
|
34
|
-
// If we have existing data and it's still in the current period, return it
|
|
35
|
-
if (existing && existing.periodEnd > now) {
|
|
36
|
-
return existing;
|
|
37
|
-
}
|
|
38
|
-
// Otherwise, create a new period
|
|
39
|
-
const periodStart = this.getMonthStart(now);
|
|
40
|
-
const periodEnd = this.getMonthEnd(now);
|
|
41
|
-
const newUsage = { used: 0, periodStart, periodEnd };
|
|
42
|
-
this.usage.set(customerId, newUsage);
|
|
43
|
-
return newUsage;
|
|
44
|
-
}
|
|
45
|
-
async incrementUsage(customerId, cost) {
|
|
46
|
-
const usage = await this.getUsage(customerId);
|
|
47
|
-
usage.used += cost;
|
|
48
|
-
}
|
|
49
|
-
async initializePeriod(customerId, _limit) {
|
|
50
|
-
const now = new Date();
|
|
51
|
-
this.usage.set(customerId, {
|
|
52
|
-
used: 0,
|
|
53
|
-
periodStart: this.getMonthStart(now),
|
|
54
|
-
periodEnd: this.getMonthEnd(now),
|
|
55
|
-
});
|
|
56
|
-
}
|
|
57
|
-
getMonthStart(date) {
|
|
58
|
-
return new Date(date.getFullYear(), date.getMonth(), 1);
|
|
59
|
-
}
|
|
60
|
-
getMonthEnd(date) {
|
|
61
|
-
return new Date(date.getFullYear(), date.getMonth() + 1, 1);
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
// ============================================================================
|
|
65
|
-
// Helper Functions
|
|
66
|
-
// ============================================================================
|
|
67
|
-
/**
|
|
68
|
-
* Get the warning level based on percentage used
|
|
69
|
-
*/
|
|
70
|
-
function getWarningLevel(percentUsed) {
|
|
71
|
-
if (percentUsed >= 100)
|
|
72
|
-
return 100;
|
|
73
|
-
if (percentUsed >= 90)
|
|
74
|
-
return 90;
|
|
75
|
-
if (percentUsed >= 80)
|
|
76
|
-
return 80;
|
|
77
|
-
return 0;
|
|
78
|
-
}
|
|
79
|
-
/**
|
|
80
|
-
* Get warning message based on level and current usage
|
|
81
|
-
*/
|
|
82
|
-
function getWarningMessage(warningLevel, used, limit, _tier) {
|
|
83
|
-
if (warningLevel === 0)
|
|
84
|
-
return undefined;
|
|
85
|
-
const remaining = Math.max(0, limit - used);
|
|
86
|
-
switch (warningLevel) {
|
|
87
|
-
case 100:
|
|
88
|
-
return `API quota exceeded (${used.toLocaleString()}/${limit.toLocaleString()} calls). Upgrade to continue.`;
|
|
89
|
-
case 90:
|
|
90
|
-
return `Warning: 90% of API quota used (${remaining.toLocaleString()} calls remaining). Consider upgrading.`;
|
|
91
|
-
case 80:
|
|
92
|
-
return `Notice: 80% of API quota used (${remaining.toLocaleString()} calls remaining).`;
|
|
93
|
-
default:
|
|
94
|
-
return undefined;
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
/**
|
|
98
|
-
* Generate a customer ID from license info
|
|
99
|
-
* Falls back to 'anonymous' for community users without an organization ID
|
|
100
|
-
*/
|
|
101
|
-
function getCustomerId(licenseInfo, providedId) {
|
|
102
|
-
if (providedId)
|
|
103
|
-
return providedId;
|
|
104
|
-
if (licenseInfo?.organizationId)
|
|
105
|
-
return licenseInfo.organizationId;
|
|
106
|
-
return 'anonymous';
|
|
107
|
-
}
|
|
108
|
-
// ============================================================================
|
|
109
|
-
// Quota Middleware Factory
|
|
110
|
-
// ============================================================================
|
|
111
|
-
/**
|
|
112
|
-
* Create a quota enforcement middleware
|
|
113
|
-
*
|
|
114
|
-
* @param options - Configuration options
|
|
115
|
-
* @returns Quota middleware instance
|
|
116
|
-
*
|
|
117
|
-
* @example
|
|
118
|
-
* ```typescript
|
|
119
|
-
* import { createQuotaMiddleware } from './middleware/quota.js';
|
|
120
|
-
* import { createLicenseMiddleware } from './middleware/license.js';
|
|
121
|
-
*
|
|
122
|
-
* const licenseMiddleware = createLicenseMiddleware();
|
|
123
|
-
* const quotaMiddleware = createQuotaMiddleware();
|
|
124
|
-
*
|
|
125
|
-
* // In tool handler:
|
|
126
|
-
* async function handleTool(toolName: string, params: unknown) {
|
|
127
|
-
* const licenseInfo = await licenseMiddleware.getLicenseInfo();
|
|
128
|
-
* const quotaResult = await quotaMiddleware.checkAndTrack(toolName, licenseInfo);
|
|
129
|
-
*
|
|
130
|
-
* if (!quotaResult.allowed) {
|
|
131
|
-
* return quotaMiddleware.buildExceededResponse(quotaResult);
|
|
132
|
-
* }
|
|
133
|
-
*
|
|
134
|
-
* // Execute tool...
|
|
135
|
-
* const result = await executeTool(toolName, params);
|
|
136
|
-
*
|
|
137
|
-
* // Add quota metadata to response
|
|
138
|
-
* return {
|
|
139
|
-
* ...result,
|
|
140
|
-
* _meta: {
|
|
141
|
-
* ...result._meta,
|
|
142
|
-
* quota: quotaMiddleware.buildMetadata(quotaResult),
|
|
143
|
-
* },
|
|
144
|
-
* };
|
|
145
|
-
* }
|
|
146
|
-
* ```
|
|
147
|
-
*/
|
|
148
|
-
export function createQuotaMiddleware(options = {}) {
|
|
149
|
-
const { defaultCost = 1, trackUnlimited = false, storage = new InMemoryQuotaStorage() } = options;
|
|
150
|
-
async function checkAndTrack(toolName, licenseInfo, customerId) {
|
|
151
|
-
const tier = licenseInfo?.tier ?? 'community';
|
|
152
|
-
const limit = TIER_QUOTAS[tier];
|
|
153
|
-
const effectiveCustomerId = getCustomerId(licenseInfo, customerId);
|
|
154
|
-
// Enterprise tier has unlimited quota
|
|
155
|
-
if (limit === -1) {
|
|
156
|
-
if (trackUnlimited) {
|
|
157
|
-
await storage.incrementUsage(effectiveCustomerId, defaultCost);
|
|
158
|
-
}
|
|
159
|
-
return {
|
|
160
|
-
allowed: true,
|
|
161
|
-
remaining: -1,
|
|
162
|
-
limit: -1,
|
|
163
|
-
percentUsed: 0,
|
|
164
|
-
warningLevel: 0,
|
|
165
|
-
resetAt: new Date(Date.now() + 30 * 24 * 60 * 60 * 1000), // 30 days from now
|
|
166
|
-
};
|
|
167
|
-
}
|
|
168
|
-
// Get current usage
|
|
169
|
-
const usage = await storage.getUsage(effectiveCustomerId);
|
|
170
|
-
const currentUsed = usage.used;
|
|
171
|
-
const newUsed = currentUsed + defaultCost;
|
|
172
|
-
// Check if quota would be exceeded
|
|
173
|
-
if (newUsed > limit) {
|
|
174
|
-
const percentUsed = (currentUsed / limit) * 100;
|
|
175
|
-
return {
|
|
176
|
-
allowed: false,
|
|
177
|
-
remaining: Math.max(0, limit - currentUsed),
|
|
178
|
-
limit,
|
|
179
|
-
percentUsed,
|
|
180
|
-
warningLevel: 100,
|
|
181
|
-
resetAt: usage.periodEnd,
|
|
182
|
-
message: getWarningMessage(100, currentUsed, limit, tier),
|
|
183
|
-
upgradeUrl: `${UPGRADE_URL}?reason=quota_exceeded&tier=${tier}`,
|
|
184
|
-
};
|
|
185
|
-
}
|
|
186
|
-
// Increment usage
|
|
187
|
-
await storage.incrementUsage(effectiveCustomerId, defaultCost);
|
|
188
|
-
// Calculate warning level
|
|
189
|
-
const percentUsed = (newUsed / limit) * 100;
|
|
190
|
-
const warningLevel = getWarningLevel(percentUsed);
|
|
191
|
-
return {
|
|
192
|
-
allowed: true,
|
|
193
|
-
remaining: limit - newUsed,
|
|
194
|
-
limit,
|
|
195
|
-
percentUsed,
|
|
196
|
-
warningLevel,
|
|
197
|
-
resetAt: usage.periodEnd,
|
|
198
|
-
message: getWarningMessage(warningLevel, newUsed, limit, tier),
|
|
199
|
-
upgradeUrl: warningLevel >= 90 ? `${UPGRADE_URL}?reason=quota_warning&tier=${tier}` : undefined,
|
|
200
|
-
};
|
|
201
|
-
}
|
|
202
|
-
async function getStatus(licenseInfo, customerId) {
|
|
203
|
-
const tier = licenseInfo?.tier ?? 'community';
|
|
204
|
-
const limit = TIER_QUOTAS[tier];
|
|
205
|
-
const effectiveCustomerId = getCustomerId(licenseInfo, customerId);
|
|
206
|
-
// Enterprise tier has unlimited quota
|
|
207
|
-
if (limit === -1) {
|
|
208
|
-
return {
|
|
209
|
-
allowed: true,
|
|
210
|
-
remaining: -1,
|
|
211
|
-
limit: -1,
|
|
212
|
-
percentUsed: 0,
|
|
213
|
-
warningLevel: 0,
|
|
214
|
-
resetAt: new Date(Date.now() + 30 * 24 * 60 * 60 * 1000),
|
|
215
|
-
};
|
|
216
|
-
}
|
|
217
|
-
// Get current usage without incrementing
|
|
218
|
-
const usage = await storage.getUsage(effectiveCustomerId);
|
|
219
|
-
const percentUsed = (usage.used / limit) * 100;
|
|
220
|
-
const warningLevel = getWarningLevel(percentUsed);
|
|
221
|
-
return {
|
|
222
|
-
allowed: usage.used < limit,
|
|
223
|
-
remaining: Math.max(0, limit - usage.used),
|
|
224
|
-
limit,
|
|
225
|
-
percentUsed,
|
|
226
|
-
warningLevel,
|
|
227
|
-
resetAt: usage.periodEnd,
|
|
228
|
-
message: getWarningMessage(warningLevel, usage.used, limit, tier),
|
|
229
|
-
upgradeUrl: warningLevel >= 90 ? `${UPGRADE_URL}?reason=quota_warning&tier=${tier}` : undefined,
|
|
230
|
-
};
|
|
231
|
-
}
|
|
232
|
-
function buildMetadata(result) {
|
|
233
|
-
return {
|
|
234
|
-
remaining: result.remaining,
|
|
235
|
-
limit: result.limit,
|
|
236
|
-
resetAt: result.resetAt.toISOString(),
|
|
237
|
-
warning: result.message,
|
|
238
|
-
};
|
|
239
|
-
}
|
|
240
|
-
function buildExceededResponse(result) {
|
|
241
|
-
const used = result.limit - result.remaining;
|
|
242
|
-
return buildQuotaExceededResponse('API calls', used, result.limit);
|
|
243
|
-
}
|
|
244
|
-
return {
|
|
245
|
-
checkAndTrack,
|
|
246
|
-
getStatus,
|
|
247
|
-
buildMetadata,
|
|
248
|
-
buildExceededResponse,
|
|
249
|
-
};
|
|
250
|
-
}
|
|
251
|
-
// ============================================================================
|
|
252
|
-
// Higher-Order Function for Tool Wrapping
|
|
253
|
-
// ============================================================================
|
|
254
|
-
/**
|
|
255
|
-
* Wrap a tool handler with quota enforcement
|
|
256
|
-
*
|
|
257
|
-
* @param handler - The original tool handler
|
|
258
|
-
* @param licenseMiddleware - License middleware instance
|
|
259
|
-
* @param quotaMiddleware - Quota middleware instance
|
|
260
|
-
* @returns Wrapped handler with quota enforcement
|
|
261
|
-
*
|
|
262
|
-
* @example
|
|
263
|
-
* ```typescript
|
|
264
|
-
* const searchHandler = withQuotaEnforcement(
|
|
265
|
-
* originalSearchHandler,
|
|
266
|
-
* licenseMiddleware,
|
|
267
|
-
* quotaMiddleware
|
|
268
|
-
* );
|
|
269
|
-
* ```
|
|
270
|
-
*/
|
|
271
|
-
export function withQuotaEnforcement(handler, licenseMiddleware, quotaMiddleware) {
|
|
272
|
-
return async (toolName, params) => {
|
|
273
|
-
const licenseInfo = await licenseMiddleware.getLicenseInfo();
|
|
274
|
-
const quotaResult = await quotaMiddleware.checkAndTrack(toolName, licenseInfo);
|
|
275
|
-
if (!quotaResult.allowed) {
|
|
276
|
-
return quotaMiddleware.buildExceededResponse(quotaResult);
|
|
277
|
-
}
|
|
278
|
-
// Execute the original handler
|
|
279
|
-
const result = await handler(params);
|
|
280
|
-
// Note: In a real implementation, you would add quota metadata to the result
|
|
281
|
-
// This requires knowing the result structure, which varies by tool
|
|
282
|
-
return result;
|
|
283
|
-
};
|
|
284
|
-
}
|
|
285
|
-
// ============================================================================
|
|
286
|
-
// Utility Functions
|
|
287
|
-
// ============================================================================
|
|
288
|
-
/**
|
|
289
|
-
* Check if a tier has unlimited quota
|
|
290
|
-
*/
|
|
291
|
-
export function isUnlimitedTier(tier) {
|
|
292
|
-
return TIER_QUOTAS[tier] === -1;
|
|
293
|
-
}
|
|
294
|
-
/**
|
|
295
|
-
* Get the quota limit for a tier
|
|
296
|
-
*/
|
|
297
|
-
export function getQuotaLimit(tier) {
|
|
298
|
-
return TIER_QUOTAS[tier];
|
|
299
|
-
}
|
|
300
|
-
/**
|
|
301
|
-
* Format quota remaining for display
|
|
302
|
-
*/
|
|
303
|
-
export function formatQuotaRemaining(remaining, limit) {
|
|
304
|
-
if (limit === -1) {
|
|
305
|
-
return 'Unlimited';
|
|
306
|
-
}
|
|
307
|
-
return `${remaining.toLocaleString()} / ${limit.toLocaleString()}`;
|
|
308
|
-
}
|
|
309
|
-
//# sourceMappingURL=quota.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"quota.js","sourceRoot":"","sources":["../../../src/middleware/quota.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tool-to-Feature mapping for license validation
|
|
3
|
-
*
|
|
4
|
-
* Maps MCP tool names to their required feature flags.
|
|
5
|
-
* null = community feature (no license required)
|
|
6
|
-
* string = feature flag that must be enabled in the license
|
|
7
|
-
*
|
|
8
|
-
* @see SMI-1055: Add license middleware to MCP server
|
|
9
|
-
* @see SMI-1091: Unified tier feature definitions across packages
|
|
10
|
-
*/
|
|
11
|
-
/**
|
|
12
|
-
* Feature flags for enterprise licensing
|
|
13
|
-
*
|
|
14
|
-
* This type mirrors the canonical FeatureFlag from @skillsmith/enterprise.
|
|
15
|
-
* We define it locally because @skillsmith/enterprise is an optional peer
|
|
16
|
-
* dependency that may not be installed for community users.
|
|
17
|
-
*
|
|
18
|
-
* @see packages/enterprise/src/license/FeatureFlags.ts for canonical definition
|
|
19
|
-
*/
|
|
20
|
-
export type FeatureFlag = 'basic_analytics' | 'email_support' | 'private_skills' | 'team_workspaces' | 'usage_analytics' | 'priority_support' | 'sso_saml' | 'rbac' | 'audit_logging' | 'siem_export' | 'compliance_reports' | 'private_registry' | 'custom_integrations' | 'advanced_analytics';
|
|
21
|
-
/**
|
|
22
|
-
* Mapping of tool names to their required feature flags
|
|
23
|
-
*
|
|
24
|
-
* null = community tool (no license required)
|
|
25
|
-
* FeatureFlag = requires that feature to be enabled in license
|
|
26
|
-
*/
|
|
27
|
-
export declare const TOOL_FEATURES: Record<string, FeatureFlag | null>;
|
|
28
|
-
/**
|
|
29
|
-
* Human-readable names for feature flags
|
|
30
|
-
*/
|
|
31
|
-
export declare const FEATURE_DISPLAY_NAMES: Record<FeatureFlag, string>;
|
|
32
|
-
/**
|
|
33
|
-
* Tier information for upgrade messaging
|
|
34
|
-
*/
|
|
35
|
-
export declare const FEATURE_TIERS: Record<FeatureFlag, 'individual' | 'team' | 'enterprise'>;
|
|
36
|
-
//# sourceMappingURL=toolFeatureMapping.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"toolFeatureMapping.d.ts","sourceRoot":"","sources":["../../../src/middleware/toolFeatureMapping.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;;;;;;;GAQG;AACH,MAAM,MAAM,WAAW,GAEnB,iBAAiB,GACjB,eAAe,GAEf,gBAAgB,GAChB,iBAAiB,GACjB,iBAAiB,GACjB,kBAAkB,GAElB,UAAU,GACV,MAAM,GACN,eAAe,GACf,aAAa,GACb,oBAAoB,GACpB,kBAAkB,GAElB,qBAAqB,GACrB,oBAAoB,CAAA;AAExB;;;;;GAKG;AACH,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAoC5D,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAmB7D,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,WAAW,EAAE,YAAY,GAAG,MAAM,GAAG,YAAY,CAmBnF,CAAA"}
|
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tool-to-Feature mapping for license validation
|
|
3
|
-
*
|
|
4
|
-
* Maps MCP tool names to their required feature flags.
|
|
5
|
-
* null = community feature (no license required)
|
|
6
|
-
* string = feature flag that must be enabled in the license
|
|
7
|
-
*
|
|
8
|
-
* @see SMI-1055: Add license middleware to MCP server
|
|
9
|
-
* @see SMI-1091: Unified tier feature definitions across packages
|
|
10
|
-
*/
|
|
11
|
-
/**
|
|
12
|
-
* Mapping of tool names to their required feature flags
|
|
13
|
-
*
|
|
14
|
-
* null = community tool (no license required)
|
|
15
|
-
* FeatureFlag = requires that feature to be enabled in license
|
|
16
|
-
*/
|
|
17
|
-
export const TOOL_FEATURES = {
|
|
18
|
-
// Core tools - no feature required (null = community)
|
|
19
|
-
search: null,
|
|
20
|
-
get_skill: null,
|
|
21
|
-
install_skill: null,
|
|
22
|
-
uninstall_skill: null,
|
|
23
|
-
skill_recommend: null,
|
|
24
|
-
skill_validate: null,
|
|
25
|
-
skill_compare: null,
|
|
26
|
-
skill_suggest: null,
|
|
27
|
-
// Team tools - require team features
|
|
28
|
-
publish_private: 'private_skills',
|
|
29
|
-
team_workspace: 'team_workspaces',
|
|
30
|
-
share_skill: 'team_workspaces',
|
|
31
|
-
// Enterprise tools - require enterprise features
|
|
32
|
-
configure_sso: 'sso_saml',
|
|
33
|
-
sso_settings: 'sso_saml',
|
|
34
|
-
audit_export: 'audit_logging',
|
|
35
|
-
audit_query: 'audit_logging',
|
|
36
|
-
rbac_manage: 'rbac',
|
|
37
|
-
rbac_assign_role: 'rbac',
|
|
38
|
-
rbac_create_policy: 'rbac',
|
|
39
|
-
siem_export: 'siem_export',
|
|
40
|
-
compliance_report: 'compliance_reports',
|
|
41
|
-
private_registry_publish: 'private_registry',
|
|
42
|
-
private_registry_manage: 'private_registry',
|
|
43
|
-
// Analytics tools
|
|
44
|
-
analytics_dashboard: 'advanced_analytics',
|
|
45
|
-
usage_report: 'advanced_analytics',
|
|
46
|
-
// Integration tools
|
|
47
|
-
webhook_configure: 'custom_integrations',
|
|
48
|
-
api_key_manage: 'custom_integrations',
|
|
49
|
-
};
|
|
50
|
-
/**
|
|
51
|
-
* Human-readable names for feature flags
|
|
52
|
-
*/
|
|
53
|
-
export const FEATURE_DISPLAY_NAMES = {
|
|
54
|
-
// Individual tier features
|
|
55
|
-
basic_analytics: 'Basic Analytics',
|
|
56
|
-
email_support: 'Email Support',
|
|
57
|
-
// Team tier features
|
|
58
|
-
private_skills: 'Private Skills',
|
|
59
|
-
team_workspaces: 'Team Workspaces',
|
|
60
|
-
usage_analytics: 'Usage Analytics',
|
|
61
|
-
priority_support: 'Priority Support',
|
|
62
|
-
// Enterprise tier features
|
|
63
|
-
sso_saml: 'SSO/SAML Integration',
|
|
64
|
-
rbac: 'Role-Based Access Control',
|
|
65
|
-
audit_logging: 'Audit Logging',
|
|
66
|
-
siem_export: 'SIEM Export',
|
|
67
|
-
compliance_reports: 'Compliance Reports',
|
|
68
|
-
private_registry: 'Private Registry',
|
|
69
|
-
// Additional features
|
|
70
|
-
custom_integrations: 'Custom Integrations',
|
|
71
|
-
advanced_analytics: 'Advanced Analytics',
|
|
72
|
-
};
|
|
73
|
-
/**
|
|
74
|
-
* Tier information for upgrade messaging
|
|
75
|
-
*/
|
|
76
|
-
export const FEATURE_TIERS = {
|
|
77
|
-
// Individual tier features
|
|
78
|
-
basic_analytics: 'individual',
|
|
79
|
-
email_support: 'individual',
|
|
80
|
-
// Team tier features
|
|
81
|
-
private_skills: 'team',
|
|
82
|
-
team_workspaces: 'team',
|
|
83
|
-
usage_analytics: 'team',
|
|
84
|
-
priority_support: 'team',
|
|
85
|
-
// Enterprise tier features
|
|
86
|
-
sso_saml: 'enterprise',
|
|
87
|
-
rbac: 'enterprise',
|
|
88
|
-
audit_logging: 'enterprise',
|
|
89
|
-
siem_export: 'enterprise',
|
|
90
|
-
compliance_reports: 'enterprise',
|
|
91
|
-
private_registry: 'enterprise',
|
|
92
|
-
// Additional features
|
|
93
|
-
custom_integrations: 'enterprise',
|
|
94
|
-
advanced_analytics: 'enterprise',
|
|
95
|
-
};
|
|
96
|
-
//# sourceMappingURL=toolFeatureMapping.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"toolFeatureMapping.js","sourceRoot":"","sources":["../../../src/middleware/toolFeatureMapping.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AA+BH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,aAAa,GAAuC;IAC/D,sDAAsD;IACtD,MAAM,EAAE,IAAI;IACZ,SAAS,EAAE,IAAI;IACf,aAAa,EAAE,IAAI;IACnB,eAAe,EAAE,IAAI;IACrB,eAAe,EAAE,IAAI;IACrB,cAAc,EAAE,IAAI;IACpB,aAAa,EAAE,IAAI;IACnB,aAAa,EAAE,IAAI;IAEnB,qCAAqC;IACrC,eAAe,EAAE,gBAAgB;IACjC,cAAc,EAAE,iBAAiB;IACjC,WAAW,EAAE,iBAAiB;IAE9B,iDAAiD;IACjD,aAAa,EAAE,UAAU;IACzB,YAAY,EAAE,UAAU;IACxB,YAAY,EAAE,eAAe;IAC7B,WAAW,EAAE,eAAe;IAC5B,WAAW,EAAE,MAAM;IACnB,gBAAgB,EAAE,MAAM;IACxB,kBAAkB,EAAE,MAAM;IAC1B,WAAW,EAAE,aAAa;IAC1B,iBAAiB,EAAE,oBAAoB;IACvC,wBAAwB,EAAE,kBAAkB;IAC5C,uBAAuB,EAAE,kBAAkB;IAE3C,kBAAkB;IAClB,mBAAmB,EAAE,oBAAoB;IACzC,YAAY,EAAE,oBAAoB;IAElC,oBAAoB;IACpB,iBAAiB,EAAE,qBAAqB;IACxC,cAAc,EAAE,qBAAqB;CACtC,CAAA;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAgC;IAChE,2BAA2B;IAC3B,eAAe,EAAE,iBAAiB;IAClC,aAAa,EAAE,eAAe;IAC9B,qBAAqB;IACrB,cAAc,EAAE,gBAAgB;IAChC,eAAe,EAAE,iBAAiB;IAClC,eAAe,EAAE,iBAAiB;IAClC,gBAAgB,EAAE,kBAAkB;IACpC,2BAA2B;IAC3B,QAAQ,EAAE,sBAAsB;IAChC,IAAI,EAAE,2BAA2B;IACjC,aAAa,EAAE,eAAe;IAC9B,WAAW,EAAE,aAAa;IAC1B,kBAAkB,EAAE,oBAAoB;IACxC,gBAAgB,EAAE,kBAAkB;IACpC,sBAAsB;IACtB,mBAAmB,EAAE,qBAAqB;IAC1C,kBAAkB,EAAE,oBAAoB;CACzC,CAAA;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAA8D;IACtF,2BAA2B;IAC3B,eAAe,EAAE,YAAY;IAC7B,aAAa,EAAE,YAAY;IAC3B,qBAAqB;IACrB,cAAc,EAAE,MAAM;IACtB,eAAe,EAAE,MAAM;IACvB,eAAe,EAAE,MAAM;IACvB,gBAAgB,EAAE,MAAM;IACxB,2BAA2B;IAC3B,QAAQ,EAAE,YAAY;IACtB,IAAI,EAAE,YAAY;IAClB,aAAa,EAAE,YAAY;IAC3B,WAAW,EAAE,YAAY;IACzB,kBAAkB,EAAE,YAAY;IAChC,gBAAgB,EAAE,YAAY;IAC9B,sBAAsB;IACtB,mBAAmB,EAAE,YAAY;IACjC,kBAAkB,EAAE,YAAY;CACjC,CAAA"}
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* SMI-911: First Run Detection and Tier 1 Skill Auto-Installation
|
|
3
|
-
*
|
|
4
|
-
* Detects first run of Skillsmith MCP server and provides:
|
|
5
|
-
* - First run detection via marker file
|
|
6
|
-
* - Tier 1 skills list for auto-installation
|
|
7
|
-
* - Welcome message formatting
|
|
8
|
-
*
|
|
9
|
-
* Tier 1 skills (from research doc):
|
|
10
|
-
* - varlock (score: 95) - Security foundation
|
|
11
|
-
* - commit (score: 92) - Git workflow
|
|
12
|
-
* - governance (score: 88) - Code quality
|
|
13
|
-
* - skill-builder (score: 90) - Custom skill creation
|
|
14
|
-
*/
|
|
15
|
-
/**
|
|
16
|
-
* Skillsmith configuration directory
|
|
17
|
-
*/
|
|
18
|
-
export declare const SKILLSMITH_DIR: string;
|
|
19
|
-
/**
|
|
20
|
-
* Marker file indicating first run is complete
|
|
21
|
-
*/
|
|
22
|
-
export declare const FIRST_RUN_MARKER: string;
|
|
23
|
-
/**
|
|
24
|
-
* Tier 1 skill definition
|
|
25
|
-
*/
|
|
26
|
-
export interface Tier1Skill {
|
|
27
|
-
/** Full skill ID (e.g., 'anthropic/varlock') */
|
|
28
|
-
id: string;
|
|
29
|
-
/** Short name for display */
|
|
30
|
-
name: string;
|
|
31
|
-
/** Quality score from research (0-100) */
|
|
32
|
-
score: number;
|
|
33
|
-
}
|
|
34
|
-
/**
|
|
35
|
-
* Tier 1 skills to auto-install on first run
|
|
36
|
-
*
|
|
37
|
-
* These are the highest-value, lowest-friction skills identified
|
|
38
|
-
* in the skill prioritization research.
|
|
39
|
-
*/
|
|
40
|
-
export declare const TIER1_SKILLS: readonly Tier1Skill[];
|
|
41
|
-
/**
|
|
42
|
-
* Check if this is the first run of Skillsmith
|
|
43
|
-
*
|
|
44
|
-
* First run is detected by the absence of the marker file
|
|
45
|
-
* at ~/.skillsmith/.first-run-complete
|
|
46
|
-
*
|
|
47
|
-
* @returns true if this is the first run, false otherwise
|
|
48
|
-
*/
|
|
49
|
-
export declare function isFirstRun(): boolean;
|
|
50
|
-
/**
|
|
51
|
-
* Mark first run as complete
|
|
52
|
-
*
|
|
53
|
-
* Creates the marker file at ~/.skillsmith/.first-run-complete
|
|
54
|
-
* with the current timestamp. Also ensures the .skillsmith
|
|
55
|
-
* directory exists.
|
|
56
|
-
*/
|
|
57
|
-
export declare function markFirstRunComplete(): void;
|
|
58
|
-
/**
|
|
59
|
-
* Generate welcome message after first run setup
|
|
60
|
-
*
|
|
61
|
-
* @param installedSkills - List of skill names that were installed
|
|
62
|
-
* @returns Formatted welcome message
|
|
63
|
-
*/
|
|
64
|
-
export declare function getWelcomeMessage(installedSkills: string[]): string;
|
|
65
|
-
//# sourceMappingURL=first-run.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"first-run.d.ts","sourceRoot":"","sources":["../../../src/onboarding/first-run.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAMH;;GAEG;AACH,eAAO,MAAM,cAAc,QAAiC,CAAA;AAE5D;;GAEG;AACH,eAAO,MAAM,gBAAgB,QAA8C,CAAA;AAE3E;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,gDAAgD;IAChD,EAAE,EAAE,MAAM,CAAA;IACV,6BAA6B;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,0CAA0C;IAC1C,KAAK,EAAE,MAAM,CAAA;CACd;AAED;;;;;GAKG;AACH,eAAO,MAAM,YAAY,EAAE,SAAS,UAAU,EAKpC,CAAA;AAEV;;;;;;;GAOG;AACH,wBAAgB,UAAU,IAAI,OAAO,CAEpC;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAK3C;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,eAAe,EAAE,MAAM,EAAE,GAAG,MAAM,CAWnE"}
|
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* SMI-911: First Run Detection and Tier 1 Skill Auto-Installation
|
|
3
|
-
*
|
|
4
|
-
* Detects first run of Skillsmith MCP server and provides:
|
|
5
|
-
* - First run detection via marker file
|
|
6
|
-
* - Tier 1 skills list for auto-installation
|
|
7
|
-
* - Welcome message formatting
|
|
8
|
-
*
|
|
9
|
-
* Tier 1 skills (from research doc):
|
|
10
|
-
* - varlock (score: 95) - Security foundation
|
|
11
|
-
* - commit (score: 92) - Git workflow
|
|
12
|
-
* - governance (score: 88) - Code quality
|
|
13
|
-
* - skill-builder (score: 90) - Custom skill creation
|
|
14
|
-
*/
|
|
15
|
-
import { existsSync, mkdirSync, writeFileSync } from 'fs';
|
|
16
|
-
import { join } from 'path';
|
|
17
|
-
import { homedir } from 'os';
|
|
18
|
-
/**
|
|
19
|
-
* Skillsmith configuration directory
|
|
20
|
-
*/
|
|
21
|
-
export const SKILLSMITH_DIR = join(homedir(), '.skillsmith');
|
|
22
|
-
/**
|
|
23
|
-
* Marker file indicating first run is complete
|
|
24
|
-
*/
|
|
25
|
-
export const FIRST_RUN_MARKER = join(SKILLSMITH_DIR, '.first-run-complete');
|
|
26
|
-
/**
|
|
27
|
-
* Tier 1 skills to auto-install on first run
|
|
28
|
-
*
|
|
29
|
-
* These are the highest-value, lowest-friction skills identified
|
|
30
|
-
* in the skill prioritization research.
|
|
31
|
-
*/
|
|
32
|
-
export const TIER1_SKILLS = [
|
|
33
|
-
{ id: 'anthropic/varlock', name: 'varlock', score: 95 },
|
|
34
|
-
{ id: 'anthropic/commit', name: 'commit', score: 92 },
|
|
35
|
-
{ id: 'anthropic/skill-builder', name: 'skill-builder', score: 90 },
|
|
36
|
-
{ id: 'anthropic/governance', name: 'governance', score: 88 },
|
|
37
|
-
];
|
|
38
|
-
/**
|
|
39
|
-
* Check if this is the first run of Skillsmith
|
|
40
|
-
*
|
|
41
|
-
* First run is detected by the absence of the marker file
|
|
42
|
-
* at ~/.skillsmith/.first-run-complete
|
|
43
|
-
*
|
|
44
|
-
* @returns true if this is the first run, false otherwise
|
|
45
|
-
*/
|
|
46
|
-
export function isFirstRun() {
|
|
47
|
-
return !existsSync(FIRST_RUN_MARKER);
|
|
48
|
-
}
|
|
49
|
-
/**
|
|
50
|
-
* Mark first run as complete
|
|
51
|
-
*
|
|
52
|
-
* Creates the marker file at ~/.skillsmith/.first-run-complete
|
|
53
|
-
* with the current timestamp. Also ensures the .skillsmith
|
|
54
|
-
* directory exists.
|
|
55
|
-
*/
|
|
56
|
-
export function markFirstRunComplete() {
|
|
57
|
-
if (!existsSync(SKILLSMITH_DIR)) {
|
|
58
|
-
mkdirSync(SKILLSMITH_DIR, { recursive: true });
|
|
59
|
-
}
|
|
60
|
-
writeFileSync(FIRST_RUN_MARKER, new Date().toISOString());
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* Generate welcome message after first run setup
|
|
64
|
-
*
|
|
65
|
-
* @param installedSkills - List of skill names that were installed
|
|
66
|
-
* @returns Formatted welcome message
|
|
67
|
-
*/
|
|
68
|
-
export function getWelcomeMessage(installedSkills) {
|
|
69
|
-
const skillList = installedSkills.map((s) => ` - ${s}`).join('\n');
|
|
70
|
-
return `
|
|
71
|
-
Welcome to Skillsmith!
|
|
72
|
-
|
|
73
|
-
Essential skills installed:
|
|
74
|
-
${skillList}
|
|
75
|
-
|
|
76
|
-
Try: "Write a commit message" to see the commit skill in action.
|
|
77
|
-
`.trim();
|
|
78
|
-
}
|
|
79
|
-
//# sourceMappingURL=first-run.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"first-run.js","sourceRoot":"","sources":["../../../src/onboarding/first-run.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,IAAI,CAAA;AACzD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAC3B,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAA;AAE5B;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,aAAa,CAAC,CAAA;AAE5D;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,CAAC,cAAc,EAAE,qBAAqB,CAAC,CAAA;AAc3E;;;;;GAKG;AACH,MAAM,CAAC,MAAM,YAAY,GAA0B;IACjD,EAAE,EAAE,EAAE,mBAAmB,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE;IACvD,EAAE,EAAE,EAAE,kBAAkB,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE;IACrD,EAAE,EAAE,EAAE,yBAAyB,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,EAAE,EAAE;IACnE,EAAE,EAAE,EAAE,sBAAsB,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,EAAE,EAAE;CACrD,CAAA;AAEV;;;;;;;GAOG;AACH,MAAM,UAAU,UAAU;IACxB,OAAO,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAA;AACtC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB;IAClC,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QAChC,SAAS,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAChD,CAAC;IACD,aAAa,CAAC,gBAAgB,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAA;AAC3D,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,eAAyB;IACzD,MAAM,SAAS,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAEnE,OAAO;;;;EAIP,SAAS;;;CAGV,CAAC,IAAI,EAAE,CAAA;AACR,CAAC"}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* SMI-911: Onboarding Module
|
|
3
|
-
*
|
|
4
|
-
* Exports first-run detection and Tier 1 skill auto-installation functionality.
|
|
5
|
-
*/
|
|
6
|
-
export { SKILLSMITH_DIR, FIRST_RUN_MARKER, TIER1_SKILLS, isFirstRun, markFirstRunComplete, getWelcomeMessage, type Tier1Skill, } from './first-run.js';
|
|
7
|
-
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/onboarding/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,YAAY,EACZ,UAAU,EACV,oBAAoB,EACpB,iBAAiB,EACjB,KAAK,UAAU,GAChB,MAAM,gBAAgB,CAAA"}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* SMI-911: Onboarding Module
|
|
3
|
-
*
|
|
4
|
-
* Exports first-run detection and Tier 1 skill auto-installation functionality.
|
|
5
|
-
*/
|
|
6
|
-
export { SKILLSMITH_DIR, FIRST_RUN_MARKER, TIER1_SKILLS, isFirstRun, markFirstRunComplete, getWelcomeMessage, } from './first-run.js';
|
|
7
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/onboarding/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,YAAY,EACZ,UAAU,EACV,oBAAoB,EACpB,iBAAiB,GAElB,MAAM,gBAAgB,CAAA"}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* SMI-XXXX: Install Bundled Assets on First Run
|
|
3
|
-
*
|
|
4
|
-
* Installs the skillsmith skill and user documentation
|
|
5
|
-
* from the npm package's bundled assets.
|
|
6
|
-
*/
|
|
7
|
-
/**
|
|
8
|
-
* Install bundled skills from package assets
|
|
9
|
-
*
|
|
10
|
-
* Copies skills from src/assets/skills/ to ~/.claude/skills/
|
|
11
|
-
*
|
|
12
|
-
* @returns Array of installed skill names
|
|
13
|
-
*/
|
|
14
|
-
export declare function installBundledSkills(): string[];
|
|
15
|
-
/**
|
|
16
|
-
* Install user documentation to ~/.skillsmith/docs/
|
|
17
|
-
*
|
|
18
|
-
* @returns true if docs were installed, false otherwise
|
|
19
|
-
*/
|
|
20
|
-
export declare function installUserDocs(): boolean;
|
|
21
|
-
/**
|
|
22
|
-
* Get path to user guide for --docs flag
|
|
23
|
-
*
|
|
24
|
-
* @returns Path to USER_GUIDE.md if it exists, undefined otherwise
|
|
25
|
-
*/
|
|
26
|
-
export declare function getUserGuidePath(): string | undefined;
|
|
27
|
-
//# sourceMappingURL=install-assets.d.ts.map
|