@skillsmith/core 0.5.0 → 0.5.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/CHANGELOG.md +11 -2
- package/dist/.tsbuildinfo +1 -1
- package/dist/src/api/client.cache.d.ts +34 -0
- package/dist/src/api/client.cache.d.ts.map +1 -0
- package/dist/src/api/client.cache.js +37 -0
- package/dist/src/api/client.cache.js.map +1 -0
- package/dist/src/api/client.d.ts +16 -86
- package/dist/src/api/client.d.ts.map +1 -1
- package/dist/src/api/client.js +27 -20
- package/dist/src/api/client.js.map +1 -1
- package/dist/src/api/client.types.d.ts +98 -0
- package/dist/src/api/client.types.d.ts.map +1 -0
- package/dist/src/api/client.types.js +22 -0
- package/dist/src/api/client.types.js.map +1 -0
- package/dist/src/api/schemas.d.ts +2 -2
- package/dist/src/audit/remote-audit.d.ts +28 -0
- package/dist/src/audit/remote-audit.d.ts.map +1 -0
- package/dist/src/audit/remote-audit.js +90 -0
- package/dist/src/audit/remote-audit.js.map +1 -0
- package/dist/src/audit/remote-audit.test.d.ts +2 -0
- package/dist/src/audit/remote-audit.test.d.ts.map +1 -0
- package/dist/src/audit/remote-audit.test.js +81 -0
- package/dist/src/audit/remote-audit.test.js.map +1 -0
- package/dist/src/data/generic-triggers.d.ts +24 -0
- package/dist/src/data/generic-triggers.d.ts.map +1 -0
- package/dist/src/data/generic-triggers.js +19 -0
- package/dist/src/data/generic-triggers.js.map +1 -0
- package/dist/src/data/generic-triggers.json +35 -0
- package/dist/src/index.d.ts +5 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +5 -1
- package/dist/src/index.js.map +1 -1
- package/dist/tests/api/client.cache.test.d.ts +8 -0
- package/dist/tests/api/client.cache.test.d.ts.map +1 -0
- package/dist/tests/api/client.cache.test.js +128 -0
- package/dist/tests/api/client.cache.test.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { createHmac } from 'node:crypto';
|
|
2
|
+
import { getApiKey } from '../config/index.js';
|
|
3
|
+
const DEFAULT_API_BASE = 'https://api.skillsmith.app';
|
|
4
|
+
const EVENT_ENDPOINT = '/functions/v1/events';
|
|
5
|
+
const REQUEST_TIMEOUT_MS = 2000;
|
|
6
|
+
/**
|
|
7
|
+
* HMAC key used to derive the telemetry actor ID from the caller's API key.
|
|
8
|
+
*
|
|
9
|
+
* This is NOT password storage — it is a keyed, deterministic, non-reversible
|
|
10
|
+
* correlation ID used to distinguish one caller from another in aggregate
|
|
11
|
+
* telemetry. HMAC-SHA-256 is the correct primitive for that use case:
|
|
12
|
+
* - Keyed construction cleanly signals "opaque identifier derivation", not
|
|
13
|
+
* password hashing.
|
|
14
|
+
* - Fast (no KDF latency on the hot install path).
|
|
15
|
+
* - Deterministic so the same API key always maps to the same actor ID,
|
|
16
|
+
* enabling per-caller aggregation server-side.
|
|
17
|
+
*
|
|
18
|
+
* A slow KDF (bcrypt/scrypt/Argon2) would be inappropriate here — it adds
|
|
19
|
+
* latency without changing any security property we need.
|
|
20
|
+
*/
|
|
21
|
+
const TELEMETRY_ACTOR_KEY = 'skillsmith-telemetry-actor:v1';
|
|
22
|
+
function hashForActor(apiKey) {
|
|
23
|
+
// lgtm[js/insufficient-password-hash] This is deterministic correlation-ID
|
|
24
|
+
// derivation via HMAC-SHA-256 — not password storage. See TELEMETRY_ACTOR_KEY
|
|
25
|
+
// doc-comment above for full rationale (false positive in CodeQL's taint
|
|
26
|
+
// tracking which flags any flow from an API-key-like source into a crypto
|
|
27
|
+
// function, regardless of construction).
|
|
28
|
+
return createHmac('sha256', TELEMETRY_ACTOR_KEY).update(apiKey).digest('hex');
|
|
29
|
+
}
|
|
30
|
+
function getApiBase() {
|
|
31
|
+
return process.env.SKILLSMITH_API_URL || DEFAULT_API_BASE;
|
|
32
|
+
}
|
|
33
|
+
function isDisabled() {
|
|
34
|
+
const flag = process.env.SKILLSMITH_TELEMETRY;
|
|
35
|
+
return flag === '0' || flag === 'false' || flag === 'off';
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Emit a skill-install event to Skillsmith's remote telemetry endpoint.
|
|
39
|
+
*
|
|
40
|
+
* Best-effort: never throws, never blocks the caller. Silently skips in these cases:
|
|
41
|
+
* - No API key available (CLI offline / unauthenticated)
|
|
42
|
+
* - SKILLSMITH_TELEMETRY=0 (opt-out)
|
|
43
|
+
* - Network / endpoint failure
|
|
44
|
+
*
|
|
45
|
+
* The API key is mapped to a namespaced, non-reversible telemetry actor ID
|
|
46
|
+
* (HMAC-SHA-256 keyed by `skillsmith-telemetry-actor:v1`) before transmission.
|
|
47
|
+
* The server stores that digest as `actor` — never the raw key, never an
|
|
48
|
+
* email, never a user ID.
|
|
49
|
+
*
|
|
50
|
+
* Event shape when emitted:
|
|
51
|
+
* event_type: "telemetry:skill_install"
|
|
52
|
+
* actor: hmac_sha256("skillsmith-telemetry-actor:v1", apiKey) hex
|
|
53
|
+
* metadata: { skill_id, source, success, duration_ms?, trust_tier?, error_code? }
|
|
54
|
+
*/
|
|
55
|
+
export async function emitInstallEvent(payload) {
|
|
56
|
+
if (isDisabled())
|
|
57
|
+
return;
|
|
58
|
+
const apiKey = getApiKey();
|
|
59
|
+
if (!apiKey)
|
|
60
|
+
return;
|
|
61
|
+
const controller = new AbortController();
|
|
62
|
+
const timer = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS);
|
|
63
|
+
try {
|
|
64
|
+
await fetch(`${getApiBase()}${EVENT_ENDPOINT}`, {
|
|
65
|
+
method: 'POST',
|
|
66
|
+
headers: { 'content-type': 'application/json' },
|
|
67
|
+
signal: controller.signal,
|
|
68
|
+
body: JSON.stringify({
|
|
69
|
+
event: 'skill_install',
|
|
70
|
+
anonymous_id: hashForActor(apiKey),
|
|
71
|
+
metadata: {
|
|
72
|
+
skill_id: payload.skillId,
|
|
73
|
+
source: payload.source,
|
|
74
|
+
success: payload.success,
|
|
75
|
+
...(payload.durationMs !== undefined && { duration_ms: payload.durationMs }),
|
|
76
|
+
...(payload.trustTier !== undefined && { trust_tier: payload.trustTier }),
|
|
77
|
+
...(payload.errorCode !== undefined && { error_code: payload.errorCode }),
|
|
78
|
+
},
|
|
79
|
+
}),
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
// Best-effort: swallow all errors (network, abort, endpoint down).
|
|
84
|
+
// Telemetry failures must never break the install flow.
|
|
85
|
+
}
|
|
86
|
+
finally {
|
|
87
|
+
clearTimeout(timer);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=remote-audit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote-audit.js","sourceRoot":"","sources":["../../../src/audit/remote-audit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAW9C,MAAM,gBAAgB,GAAG,4BAA4B,CAAA;AACrD,MAAM,cAAc,GAAG,sBAAsB,CAAA;AAC7C,MAAM,kBAAkB,GAAG,IAAI,CAAA;AAE/B;;;;;;;;;;;;;;GAcG;AACH,MAAM,mBAAmB,GAAG,+BAA+B,CAAA;AAE3D,SAAS,YAAY,CAAC,MAAc;IAClC,2EAA2E;IAC3E,8EAA8E;IAC9E,yEAAyE;IACzE,0EAA0E;IAC1E,yCAAyC;IACzC,OAAO,UAAU,CAAC,QAAQ,EAAE,mBAAmB,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;AAC/E,CAAC;AAED,SAAS,UAAU;IACjB,OAAO,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,gBAAgB,CAAA;AAC3D,CAAC;AAED,SAAS,UAAU;IACjB,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAA;IAC7C,OAAO,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,KAAK,CAAA;AAC3D,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,OAA4B;IACjE,IAAI,UAAU,EAAE;QAAE,OAAM;IACxB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAA;IAC1B,IAAI,CAAC,MAAM;QAAE,OAAM;IAEnB,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAA;IACxC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,kBAAkB,CAAC,CAAA;IAEtE,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,GAAG,UAAU,EAAE,GAAG,cAAc,EAAE,EAAE;YAC9C,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,MAAM,EAAE,UAAU,CAAC,MAAM;YACzB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,KAAK,EAAE,eAAe;gBACtB,YAAY,EAAE,YAAY,CAAC,MAAM,CAAC;gBAClC,QAAQ,EAAE;oBACR,QAAQ,EAAE,OAAO,CAAC,OAAO;oBACzB,MAAM,EAAE,OAAO,CAAC,MAAM;oBACtB,OAAO,EAAE,OAAO,CAAC,OAAO;oBACxB,GAAG,CAAC,OAAO,CAAC,UAAU,KAAK,SAAS,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC;oBAC5E,GAAG,CAAC,OAAO,CAAC,SAAS,KAAK,SAAS,IAAI,EAAE,UAAU,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC;oBACzE,GAAG,CAAC,OAAO,CAAC,SAAS,KAAK,SAAS,IAAI,EAAE,UAAU,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC;iBAC1E;aACF,CAAC;SACH,CAAC,CAAA;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,mEAAmE;QACnE,wDAAwD;IAC1D,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,KAAK,CAAC,CAAA;IACrB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote-audit.test.d.ts","sourceRoot":"","sources":["../../../src/audit/remote-audit.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
2
|
+
import { emitInstallEvent } from './remote-audit.js';
|
|
3
|
+
const fetchSpy = vi.fn();
|
|
4
|
+
beforeEach(() => {
|
|
5
|
+
vi.stubGlobal('fetch', fetchSpy);
|
|
6
|
+
fetchSpy.mockReset();
|
|
7
|
+
fetchSpy.mockResolvedValue(new Response(null, { status: 200 }));
|
|
8
|
+
delete process.env.SKILLSMITH_TELEMETRY;
|
|
9
|
+
delete process.env.SKILLSMITH_API_URL;
|
|
10
|
+
});
|
|
11
|
+
afterEach(() => {
|
|
12
|
+
vi.unstubAllGlobals();
|
|
13
|
+
delete process.env.SKILLSMITH_API_KEY;
|
|
14
|
+
});
|
|
15
|
+
function readBody() {
|
|
16
|
+
const body = fetchSpy.mock.calls[0]?.[1]?.body;
|
|
17
|
+
return JSON.parse(body);
|
|
18
|
+
}
|
|
19
|
+
describe('emitInstallEvent', () => {
|
|
20
|
+
it('skips when no API key is available', async () => {
|
|
21
|
+
delete process.env.SKILLSMITH_API_KEY;
|
|
22
|
+
await emitInstallEvent({ skillId: 'acme/foo', source: 'mcp', success: true });
|
|
23
|
+
expect(fetchSpy).not.toHaveBeenCalled();
|
|
24
|
+
});
|
|
25
|
+
it('skips when telemetry is disabled via env', async () => {
|
|
26
|
+
process.env.SKILLSMITH_API_KEY = 'sk_live_testtoken';
|
|
27
|
+
process.env.SKILLSMITH_TELEMETRY = '0';
|
|
28
|
+
await emitInstallEvent({ skillId: 'acme/foo', source: 'mcp', success: true });
|
|
29
|
+
expect(fetchSpy).not.toHaveBeenCalled();
|
|
30
|
+
});
|
|
31
|
+
it('hashes the API key (actor is sha256 hex, not raw key)', async () => {
|
|
32
|
+
process.env.SKILLSMITH_API_KEY = 'sk_live_testtoken';
|
|
33
|
+
await emitInstallEvent({ skillId: 'acme/foo', source: 'mcp', success: true });
|
|
34
|
+
const body = readBody();
|
|
35
|
+
expect(body.anonymous_id).toMatch(/^[0-9a-f]{64}$/);
|
|
36
|
+
expect(String(body.anonymous_id)).not.toContain('sk_live');
|
|
37
|
+
});
|
|
38
|
+
it('emits with event=skill_install and the expected metadata shape', async () => {
|
|
39
|
+
process.env.SKILLSMITH_API_KEY = 'sk_live_testtoken';
|
|
40
|
+
await emitInstallEvent({
|
|
41
|
+
skillId: 'acme/foo',
|
|
42
|
+
source: 'cli',
|
|
43
|
+
success: false,
|
|
44
|
+
durationMs: 123,
|
|
45
|
+
trustTier: 'community',
|
|
46
|
+
errorCode: 'NETWORK_ERROR',
|
|
47
|
+
});
|
|
48
|
+
const body = readBody();
|
|
49
|
+
expect(body.event).toBe('skill_install');
|
|
50
|
+
expect(body.metadata).toEqual({
|
|
51
|
+
skill_id: 'acme/foo',
|
|
52
|
+
source: 'cli',
|
|
53
|
+
success: false,
|
|
54
|
+
duration_ms: 123,
|
|
55
|
+
trust_tier: 'community',
|
|
56
|
+
error_code: 'NETWORK_ERROR',
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
it('omits undefined optional fields from metadata', async () => {
|
|
60
|
+
process.env.SKILLSMITH_API_KEY = 'sk_live_testtoken';
|
|
61
|
+
await emitInstallEvent({ skillId: 'acme/foo', source: 'vscode', success: true });
|
|
62
|
+
const body = readBody();
|
|
63
|
+
const meta = body.metadata;
|
|
64
|
+
expect(meta).toEqual({ skill_id: 'acme/foo', source: 'vscode', success: true });
|
|
65
|
+
expect(meta).not.toHaveProperty('duration_ms');
|
|
66
|
+
expect(meta).not.toHaveProperty('trust_tier');
|
|
67
|
+
expect(meta).not.toHaveProperty('error_code');
|
|
68
|
+
});
|
|
69
|
+
it('swallows fetch errors and does not throw', async () => {
|
|
70
|
+
process.env.SKILLSMITH_API_KEY = 'sk_live_testtoken';
|
|
71
|
+
fetchSpy.mockRejectedValueOnce(new Error('network down'));
|
|
72
|
+
await expect(emitInstallEvent({ skillId: 'acme/foo', source: 'mcp', success: true })).resolves.toBeUndefined();
|
|
73
|
+
});
|
|
74
|
+
it('respects SKILLSMITH_API_URL override', async () => {
|
|
75
|
+
process.env.SKILLSMITH_API_KEY = 'sk_live_testtoken';
|
|
76
|
+
process.env.SKILLSMITH_API_URL = 'https://staging.skillsmith.app';
|
|
77
|
+
await emitInstallEvent({ skillId: 'acme/foo', source: 'mcp', success: true });
|
|
78
|
+
expect(fetchSpy).toHaveBeenCalledWith('https://staging.skillsmith.app/functions/v1/events', expect.any(Object));
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
//# sourceMappingURL=remote-audit.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote-audit.test.js","sourceRoot":"","sources":["../../../src/audit/remote-audit.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Curated stoplist of generic trigger words and namespace tokens
|
|
3
|
+
* used by `skill_pack_audit` to flag false-trigger-prone skill names/descriptions
|
|
4
|
+
* and generic pack namespaces.
|
|
5
|
+
* @module @skillsmith/core/data/generic-triggers
|
|
6
|
+
* @see SMI-4124
|
|
7
|
+
*
|
|
8
|
+
* Edit `generic-triggers.json` (sibling file) to add entries — no code change
|
|
9
|
+
* required. i18n follow-up tracked in SMI-4125.
|
|
10
|
+
*/
|
|
11
|
+
/** Typed shape of the curated stoplist. */
|
|
12
|
+
export interface GenericTriggersStoplist {
|
|
13
|
+
/** Common English/dev verbs that misfire Claude's skill-trigger heuristic. */
|
|
14
|
+
readonly triggerWords: readonly string[];
|
|
15
|
+
/** Generic pack namespaces (directory names) that should be domain-qualified. */
|
|
16
|
+
readonly namespaces: readonly string[];
|
|
17
|
+
/** ISO 639-1 locale code for this stoplist (v1: "en" only). */
|
|
18
|
+
readonly locale: string;
|
|
19
|
+
/** Maintenance notes for editors. */
|
|
20
|
+
readonly notes: string;
|
|
21
|
+
}
|
|
22
|
+
/** Frozen default stoplist. Consumers should treat as read-only. */
|
|
23
|
+
export declare const GENERIC_TRIGGERS: GenericTriggersStoplist;
|
|
24
|
+
//# sourceMappingURL=generic-triggers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generic-triggers.d.ts","sourceRoot":"","sources":["../../../src/data/generic-triggers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,2CAA2C;AAC3C,MAAM,WAAW,uBAAuB;IACtC,8EAA8E;IAC9E,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAA;IACxC,iFAAiF;IACjF,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAA;IACtC,+DAA+D;IAC/D,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,qCAAqC;IACrC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CACvB;AAED,oEAAoE;AACpE,eAAO,MAAM,gBAAgB,EAAE,uBAKF,CAAA"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Curated stoplist of generic trigger words and namespace tokens
|
|
3
|
+
* used by `skill_pack_audit` to flag false-trigger-prone skill names/descriptions
|
|
4
|
+
* and generic pack namespaces.
|
|
5
|
+
* @module @skillsmith/core/data/generic-triggers
|
|
6
|
+
* @see SMI-4124
|
|
7
|
+
*
|
|
8
|
+
* Edit `generic-triggers.json` (sibling file) to add entries — no code change
|
|
9
|
+
* required. i18n follow-up tracked in SMI-4125.
|
|
10
|
+
*/
|
|
11
|
+
import data from './generic-triggers.json' with { type: 'json' };
|
|
12
|
+
/** Frozen default stoplist. Consumers should treat as read-only. */
|
|
13
|
+
export const GENERIC_TRIGGERS = Object.freeze({
|
|
14
|
+
triggerWords: Object.freeze([...data.triggerWords]),
|
|
15
|
+
namespaces: Object.freeze([...data.namespaces]),
|
|
16
|
+
locale: data.locale,
|
|
17
|
+
notes: data.notes,
|
|
18
|
+
});
|
|
19
|
+
//# sourceMappingURL=generic-triggers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generic-triggers.js","sourceRoot":"","sources":["../../../src/data/generic-triggers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,IAAI,MAAM,yBAAyB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAA;AAchE,oEAAoE;AACpE,MAAM,CAAC,MAAM,gBAAgB,GAA4B,MAAM,CAAC,MAAM,CAAC;IACrE,YAAY,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC;IACnD,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;IAC/C,MAAM,EAAE,IAAI,CAAC,MAAM;IACnB,KAAK,EAAE,IAAI,CAAC,KAAK;CAClB,CAA4B,CAAA"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"triggerWords": [
|
|
3
|
+
"spec",
|
|
4
|
+
"build",
|
|
5
|
+
"ship",
|
|
6
|
+
"test",
|
|
7
|
+
"deploy",
|
|
8
|
+
"plan",
|
|
9
|
+
"review",
|
|
10
|
+
"run",
|
|
11
|
+
"check",
|
|
12
|
+
"fix",
|
|
13
|
+
"update",
|
|
14
|
+
"create",
|
|
15
|
+
"add",
|
|
16
|
+
"remove",
|
|
17
|
+
"start",
|
|
18
|
+
"stop",
|
|
19
|
+
"send",
|
|
20
|
+
"get",
|
|
21
|
+
"list"
|
|
22
|
+
],
|
|
23
|
+
"namespaces": [
|
|
24
|
+
"agent-skills",
|
|
25
|
+
"skills",
|
|
26
|
+
"tools",
|
|
27
|
+
"utils",
|
|
28
|
+
"helpers",
|
|
29
|
+
"misc",
|
|
30
|
+
"common",
|
|
31
|
+
"general"
|
|
32
|
+
],
|
|
33
|
+
"locale": "en",
|
|
34
|
+
"notes": "English only in v1. Follow-up for i18n tracked in SMI-4125."
|
|
35
|
+
}
|
package/dist/src/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @skillsmith/core - Core functionality for skill discovery
|
|
3
3
|
*/
|
|
4
|
-
export declare const VERSION = "0.5.
|
|
4
|
+
export declare const VERSION = "0.5.1";
|
|
5
5
|
export * from './exports/services.js';
|
|
6
6
|
export * from './exports/repositories.js';
|
|
7
7
|
export { createDatabaseSync, createDatabaseAsync } from './db/createDatabase.js';
|
|
@@ -19,10 +19,14 @@ export { SkillsmithTracer, getTracer, initializeTracing, shutdownTracing, traced
|
|
|
19
19
|
export { UsageAnalyticsService, ExperimentService, ROIDashboardService, anonymizeUserId, hashProjectContext, AnalyticsStorage, UsageTracker, } from './analytics/index.js';
|
|
20
20
|
export { RateLimiter, InMemoryRateLimitStorage, createRateLimiterFromPreset, RATE_LIMIT_PRESETS, RateLimitQueueTimeoutError, RateLimitQueueFullError, } from './security/index.js';
|
|
21
21
|
export { AuditLogger, MIN_RETENTION_DAYS, MAX_RETENTION_DAYS } from './security/AuditLogger.js';
|
|
22
|
+
export { emitInstallEvent } from './audit/remote-audit.js';
|
|
23
|
+
export type { InstallEventPayload } from './audit/remote-audit.js';
|
|
22
24
|
export { BaseSourceAdapter, SourceAdapterRegistry, SourceIndexer, defaultRegistry, isSourceAdapter, } from './sources/index.js';
|
|
23
25
|
export type { ISourceAdapter, SourceType, SourceConfig, RateLimitConfig as SourceRateLimitConfig, SourceAuthConfig, SourceLocation, SourceRepository, SkillContent, SourceSearchOptions, SourceSearchResult, SkillIndexResult, BatchIndexResult, SourceHealth, SourceAdapterFactory, RegistryStats, ParsedSkillMetadata as SourceParsedSkillMetadata, ISkillParser, ISkillRepository, SourceIndexerOptions, } from './sources/index.js';
|
|
24
26
|
export { loadConfig, saveConfig, getApiKey, getApiBaseUrl, getConfigDir, getConfigPath, ensureConfigDir, isDebugEnabled, isTelemetryEnabled, isValidApiKeyFormat, storeApiKey, clearApiKey, getAuthStatus, type SkillsmithConfig, } from './config/index.js';
|
|
25
27
|
export { checkForUpdates, formatUpdateNotification, type VersionCheckResult, } from './utils/version-check.js';
|
|
26
28
|
export { parseRepoUrl, isGitHubUrl, type ParsedRepoUrl } from './utils/github-url.js';
|
|
27
29
|
export { safeWriteFile, SymlinkError, HardlinkError } from './utils/safe-fs.js';
|
|
30
|
+
export { GENERIC_TRIGGERS } from './data/generic-triggers.js';
|
|
31
|
+
export type { GenericTriggersStoplist } from './data/generic-triggers.js';
|
|
28
32
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/src/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/src/index.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* @skillsmith/core - Core functionality for skill discovery
|
|
3
3
|
*/
|
|
4
4
|
// Version
|
|
5
|
-
export const VERSION = '0.5.
|
|
5
|
+
export const VERSION = '0.5.1';
|
|
6
6
|
// ============================================================================
|
|
7
7
|
// Grouped Exports from Barrel Files
|
|
8
8
|
// ============================================================================
|
|
@@ -52,6 +52,8 @@ anonymizeUserId, hashProjectContext, AnalyticsStorage, UsageTracker, } from './a
|
|
|
52
52
|
export { RateLimiter, InMemoryRateLimitStorage, createRateLimiterFromPreset, RATE_LIMIT_PRESETS, RateLimitQueueTimeoutError, RateLimitQueueFullError, } from './security/index.js';
|
|
53
53
|
// Audit Logging (SMI-733)
|
|
54
54
|
export { AuditLogger, MIN_RETENTION_DAYS, MAX_RETENTION_DAYS } from './security/AuditLogger.js';
|
|
55
|
+
// Remote telemetry for install events (SMI-4182)
|
|
56
|
+
export { emitInstallEvent } from './audit/remote-audit.js';
|
|
55
57
|
// Source Adapters (SMI-589)
|
|
56
58
|
export { BaseSourceAdapter, SourceAdapterRegistry, SourceIndexer, defaultRegistry, isSourceAdapter, } from './sources/index.js';
|
|
57
59
|
// Configuration (SMI-1851, SMI-2714)
|
|
@@ -62,6 +64,8 @@ export { checkForUpdates, formatUpdateNotification, } from './utils/version-chec
|
|
|
62
64
|
export { parseRepoUrl, isGitHubUrl } from './utils/github-url.js';
|
|
63
65
|
// SMI-2274: Safe filesystem operations
|
|
64
66
|
export { safeWriteFile, SymlinkError, HardlinkError } from './utils/safe-fs.js';
|
|
67
|
+
// SMI-4124: Curated stoplists for skill_pack_audit trigger-quality checks
|
|
68
|
+
export { GENERIC_TRIGGERS } from './data/generic-triggers.js';
|
|
65
69
|
// ============================================================================
|
|
66
70
|
// LIVE SERVICES WORKTREE STUBS (Phase 0 - Conflict Prevention)
|
|
67
71
|
// ============================================================================
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-4120: Client LRU cache integration tests.
|
|
3
|
+
*
|
|
4
|
+
* Covers the wiring in client.ts + client.cache.ts — hits, misses, per-call
|
|
5
|
+
* no-store, env kill-switch, and stable cache key for getRecommendations.
|
|
6
|
+
*/
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=client.cache.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.cache.test.d.ts","sourceRoot":"","sources":["../../../tests/api/client.cache.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-4120: Client LRU cache integration tests.
|
|
3
|
+
*
|
|
4
|
+
* Covers the wiring in client.ts + client.cache.ts — hits, misses, per-call
|
|
5
|
+
* no-store, env kill-switch, and stable cache key for getRecommendations.
|
|
6
|
+
*/
|
|
7
|
+
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
|
|
8
|
+
import { SkillsmithApiClient } from '../../src/api/client.js';
|
|
9
|
+
import { ApiCache } from '../../src/api/cache.js';
|
|
10
|
+
const SAMPLE_SEARCH_RESPONSE = {
|
|
11
|
+
data: [
|
|
12
|
+
{
|
|
13
|
+
id: 'a/one',
|
|
14
|
+
name: 'one',
|
|
15
|
+
description: null,
|
|
16
|
+
author: 'a',
|
|
17
|
+
quality_score: 0.9,
|
|
18
|
+
trust_tier: 'verified',
|
|
19
|
+
tags: [],
|
|
20
|
+
},
|
|
21
|
+
],
|
|
22
|
+
meta: { total: 1, limit: 20, offset: 0, query: 'go' },
|
|
23
|
+
};
|
|
24
|
+
const SAMPLE_SKILL_RESPONSE = {
|
|
25
|
+
data: {
|
|
26
|
+
id: 'a/one',
|
|
27
|
+
name: 'one',
|
|
28
|
+
description: null,
|
|
29
|
+
author: 'a',
|
|
30
|
+
quality_score: 0.9,
|
|
31
|
+
trust_tier: 'verified',
|
|
32
|
+
tags: [],
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
function mockJsonResponse(body, status = 200) {
|
|
36
|
+
return new Response(JSON.stringify(body), {
|
|
37
|
+
status,
|
|
38
|
+
headers: { 'Content-Type': 'application/json' },
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
describe('SMI-4120: Client response cache', () => {
|
|
42
|
+
let fetchSpy;
|
|
43
|
+
beforeEach(() => {
|
|
44
|
+
fetchSpy = vi.spyOn(globalThis, 'fetch');
|
|
45
|
+
});
|
|
46
|
+
afterEach(() => {
|
|
47
|
+
fetchSpy.mockRestore();
|
|
48
|
+
delete process.env.SKILLSMITH_DISABLE_CLIENT_CACHE;
|
|
49
|
+
});
|
|
50
|
+
it('serves second identical search from cache', async () => {
|
|
51
|
+
fetchSpy.mockImplementation(async () => mockJsonResponse(SAMPLE_SEARCH_RESPONSE));
|
|
52
|
+
const client = new SkillsmithApiClient({ baseUrl: 'http://x' });
|
|
53
|
+
const first = await client.search({ query: 'go' });
|
|
54
|
+
const second = await client.search({ query: 'go' });
|
|
55
|
+
expect(first).toEqual(second);
|
|
56
|
+
expect(fetchSpy).toHaveBeenCalledTimes(1);
|
|
57
|
+
});
|
|
58
|
+
it('different queries miss cache independently', async () => {
|
|
59
|
+
fetchSpy.mockImplementation(async () => mockJsonResponse(SAMPLE_SEARCH_RESPONSE));
|
|
60
|
+
const client = new SkillsmithApiClient({ baseUrl: 'http://x' });
|
|
61
|
+
await client.search({ query: 'go' });
|
|
62
|
+
await client.search({ query: 'rust' });
|
|
63
|
+
expect(fetchSpy).toHaveBeenCalledTimes(2);
|
|
64
|
+
});
|
|
65
|
+
it('per-call { cache: "no-store" } bypasses both read and write', async () => {
|
|
66
|
+
fetchSpy.mockImplementation(async () => mockJsonResponse(SAMPLE_SEARCH_RESPONSE));
|
|
67
|
+
const client = new SkillsmithApiClient({ baseUrl: 'http://x' });
|
|
68
|
+
await client.search({ query: 'go' }, { cache: 'no-store' });
|
|
69
|
+
await client.search({ query: 'go' }, { cache: 'no-store' });
|
|
70
|
+
await client.search({ query: 'go' });
|
|
71
|
+
// Two no-store calls + one cacheable miss = 3 fetches
|
|
72
|
+
expect(fetchSpy).toHaveBeenCalledTimes(3);
|
|
73
|
+
// Cache should now hold the cacheable one
|
|
74
|
+
const cached = await client.search({ query: 'go' });
|
|
75
|
+
expect(cached).toEqual(SAMPLE_SEARCH_RESPONSE);
|
|
76
|
+
expect(fetchSpy).toHaveBeenCalledTimes(3);
|
|
77
|
+
});
|
|
78
|
+
it('SKILLSMITH_DISABLE_CLIENT_CACHE=1 disables cache entirely', async () => {
|
|
79
|
+
process.env.SKILLSMITH_DISABLE_CLIENT_CACHE = '1';
|
|
80
|
+
fetchSpy.mockImplementation(async () => mockJsonResponse(SAMPLE_SEARCH_RESPONSE));
|
|
81
|
+
const client = new SkillsmithApiClient({ baseUrl: 'http://x' });
|
|
82
|
+
expect(client.getResponseCache()).toBeNull();
|
|
83
|
+
await client.search({ query: 'go' });
|
|
84
|
+
await client.search({ query: 'go' });
|
|
85
|
+
expect(fetchSpy).toHaveBeenCalledTimes(2);
|
|
86
|
+
});
|
|
87
|
+
it('config.cache = false disables cache', async () => {
|
|
88
|
+
fetchSpy.mockImplementation(async () => mockJsonResponse(SAMPLE_SEARCH_RESPONSE));
|
|
89
|
+
const client = new SkillsmithApiClient({ baseUrl: 'http://x', cache: false });
|
|
90
|
+
expect(client.getResponseCache()).toBeNull();
|
|
91
|
+
await client.search({ query: 'go' });
|
|
92
|
+
await client.search({ query: 'go' });
|
|
93
|
+
expect(fetchSpy).toHaveBeenCalledTimes(2);
|
|
94
|
+
});
|
|
95
|
+
it('accepts an externally-provided ApiCache instance', async () => {
|
|
96
|
+
const external = new ApiCache({ enableStats: true });
|
|
97
|
+
fetchSpy.mockImplementation(async () => mockJsonResponse(SAMPLE_SEARCH_RESPONSE));
|
|
98
|
+
const client = new SkillsmithApiClient({ baseUrl: 'http://x', cache: external });
|
|
99
|
+
expect(client.getResponseCache()).toBe(external);
|
|
100
|
+
await client.search({ query: 'go' });
|
|
101
|
+
await client.search({ query: 'go' });
|
|
102
|
+
expect(fetchSpy).toHaveBeenCalledTimes(1);
|
|
103
|
+
expect(external.getStats().hits).toBe(1);
|
|
104
|
+
});
|
|
105
|
+
it('getSkill caches independently per id', async () => {
|
|
106
|
+
fetchSpy.mockImplementation(async () => mockJsonResponse(SAMPLE_SKILL_RESPONSE));
|
|
107
|
+
const client = new SkillsmithApiClient({ baseUrl: 'http://x' });
|
|
108
|
+
await client.getSkill('a/one');
|
|
109
|
+
await client.getSkill('a/one');
|
|
110
|
+
await client.getSkill('b/two');
|
|
111
|
+
expect(fetchSpy).toHaveBeenCalledTimes(2);
|
|
112
|
+
});
|
|
113
|
+
it('getRecommendations cache key is stable across stack order', async () => {
|
|
114
|
+
fetchSpy.mockImplementation(async () => mockJsonResponse(SAMPLE_SEARCH_RESPONSE));
|
|
115
|
+
const client = new SkillsmithApiClient({ baseUrl: 'http://x' });
|
|
116
|
+
await client.getRecommendations({ stack: ['go', 'rust'] });
|
|
117
|
+
await client.getRecommendations({ stack: ['rust', 'go'] });
|
|
118
|
+
expect(fetchSpy).toHaveBeenCalledTimes(1);
|
|
119
|
+
});
|
|
120
|
+
it('getSkill per-call no-store bypasses cache', async () => {
|
|
121
|
+
fetchSpy.mockImplementation(async () => mockJsonResponse(SAMPLE_SKILL_RESPONSE));
|
|
122
|
+
const client = new SkillsmithApiClient({ baseUrl: 'http://x' });
|
|
123
|
+
await client.getSkill('a/one');
|
|
124
|
+
await client.getSkill('a/one', { cache: 'no-store' });
|
|
125
|
+
expect(fetchSpy).toHaveBeenCalledTimes(2);
|
|
126
|
+
});
|
|
127
|
+
});
|
|
128
|
+
//# sourceMappingURL=client.cache.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.cache.test.js","sourceRoot":"","sources":["../../../tests/api/client.cache.test.ts"],"names":[],"mappings":"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"}
|