@skillsmith/core 0.7.2 → 0.8.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 +19 -0
- package/dist/.tsbuildinfo +1 -1
- package/dist/src/analytics/ROIDashboardService.compute.d.ts +17 -0
- package/dist/src/analytics/ROIDashboardService.compute.d.ts.map +1 -0
- package/dist/src/analytics/ROIDashboardService.compute.js +134 -0
- package/dist/src/analytics/ROIDashboardService.compute.js.map +1 -0
- package/dist/src/analytics/ROIDashboardService.d.ts +0 -8
- package/dist/src/analytics/ROIDashboardService.d.ts.map +1 -1
- package/dist/src/analytics/ROIDashboardService.js +9 -138
- package/dist/src/analytics/ROIDashboardService.js.map +1 -1
- package/dist/src/api/client.types.d.ts +5 -0
- package/dist/src/api/client.types.d.ts.map +1 -1
- package/dist/src/api/index.d.ts +1 -0
- package/dist/src/api/index.d.ts.map +1 -1
- package/dist/src/api/index.js +4 -0
- package/dist/src/api/index.js.map +1 -1
- package/dist/src/api/schemas.compatibility.test.d.ts +11 -0
- package/dist/src/api/schemas.compatibility.test.d.ts.map +1 -0
- package/dist/src/api/schemas.compatibility.test.js +38 -0
- package/dist/src/api/schemas.compatibility.test.js.map +1 -0
- package/dist/src/api/schemas.d.ts +16 -9
- package/dist/src/api/schemas.d.ts.map +1 -1
- package/dist/src/api/schemas.js +13 -4
- package/dist/src/api/schemas.js.map +1 -1
- package/dist/src/api/schemas.license.test.d.ts +11 -0
- package/dist/src/api/schemas.license.test.d.ts.map +1 -0
- package/dist/src/api/schemas.license.test.js +51 -0
- package/dist/src/api/schemas.license.test.js.map +1 -0
- package/dist/src/api/types.d.ts +18 -3
- package/dist/src/api/types.d.ts.map +1 -1
- package/dist/src/api/types.js +29 -2
- package/dist/src/api/types.js.map +1 -1
- package/dist/src/audit/remote-audit.d.ts +41 -0
- package/dist/src/audit/remote-audit.d.ts.map +1 -1
- package/dist/src/audit/remote-audit.js +71 -28
- package/dist/src/audit/remote-audit.js.map +1 -1
- package/dist/src/audit/remote-audit.test.js +89 -1
- package/dist/src/audit/remote-audit.test.js.map +1 -1
- package/dist/src/compatibility/slugs.d.ts +34 -0
- package/dist/src/compatibility/slugs.d.ts.map +1 -0
- package/dist/src/compatibility/slugs.js +57 -0
- package/dist/src/compatibility/slugs.js.map +1 -0
- package/dist/src/db/schema-sql.d.ts +1 -1
- package/dist/src/db/schema-sql.d.ts.map +1 -1
- package/dist/src/db/schema-sql.js +1 -1
- package/dist/src/embeddings/probe.d.ts +62 -0
- package/dist/src/embeddings/probe.d.ts.map +1 -0
- package/dist/src/embeddings/probe.js +89 -0
- package/dist/src/embeddings/probe.js.map +1 -0
- package/dist/src/exports/types.d.ts +1 -0
- package/dist/src/exports/types.d.ts.map +1 -1
- package/dist/src/exports/types.js +4 -0
- package/dist/src/exports/types.js.map +1 -1
- package/dist/src/index.d.ts +6 -3
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +7 -3
- package/dist/src/index.js.map +1 -1
- package/dist/src/indexer/GitHubIndexer.d.ts.map +1 -1
- package/dist/src/indexer/GitHubIndexer.js +1 -1
- package/dist/src/indexer/GitHubIndexer.js.map +1 -1
- package/dist/src/provenance/SourceRecoveryService.d.ts +48 -0
- package/dist/src/provenance/SourceRecoveryService.d.ts.map +1 -0
- package/dist/src/provenance/SourceRecoveryService.js +182 -0
- package/dist/src/provenance/SourceRecoveryService.js.map +1 -0
- package/dist/src/provenance/backfill.d.ts +47 -0
- package/dist/src/provenance/backfill.d.ts.map +1 -0
- package/dist/src/provenance/backfill.js +206 -0
- package/dist/src/provenance/backfill.js.map +1 -0
- package/dist/src/provenance/git-config.d.ts +22 -0
- package/dist/src/provenance/git-config.d.ts.map +1 -0
- package/dist/src/provenance/git-config.js +117 -0
- package/dist/src/provenance/git-config.js.map +1 -0
- package/dist/src/provenance/index.d.ts +12 -0
- package/dist/src/provenance/index.d.ts.map +1 -0
- package/dist/src/provenance/index.js +12 -0
- package/dist/src/provenance/index.js.map +1 -0
- package/dist/src/provenance/local-skill-scan.d.ts +35 -0
- package/dist/src/provenance/local-skill-scan.d.ts.map +1 -0
- package/dist/src/provenance/local-skill-scan.js +79 -0
- package/dist/src/provenance/local-skill-scan.js.map +1 -0
- package/dist/src/provenance/plugin-manifest.d.ts +16 -0
- package/dist/src/provenance/plugin-manifest.d.ts.map +1 -0
- package/dist/src/provenance/plugin-manifest.js +52 -0
- package/dist/src/provenance/plugin-manifest.js.map +1 -0
- package/dist/src/provenance/types.d.ts +86 -0
- package/dist/src/provenance/types.d.ts.map +1 -0
- package/dist/src/provenance/types.js +21 -0
- package/dist/src/provenance/types.js.map +1 -0
- package/dist/src/repositories/SkillRepository.d.ts.map +1 -1
- package/dist/src/repositories/SkillRepository.js +3 -1
- package/dist/src/repositories/SkillRepository.js.map +1 -1
- package/dist/src/scripts/__tests__/scan-imported-skills.test.js +10 -0
- package/dist/src/scripts/__tests__/scan-imported-skills.test.js.map +1 -1
- package/dist/src/scripts/validation/normalizers.d.ts.map +1 -1
- package/dist/src/scripts/validation/normalizers.js +9 -7
- package/dist/src/scripts/validation/normalizers.js.map +1 -1
- package/dist/src/scripts/validation/types.d.ts +8 -2
- package/dist/src/scripts/validation/types.d.ts.map +1 -1
- package/dist/src/scripts/validation/types.js +10 -2
- package/dist/src/scripts/validation/types.js.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.d.ts +0 -7
- package/dist/src/security/scanner/SecurityScanner.d.ts.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.exec.d.ts +56 -0
- package/dist/src/security/scanner/SecurityScanner.exec.d.ts.map +1 -0
- package/dist/src/security/scanner/SecurityScanner.exec.js +255 -0
- package/dist/src/security/scanner/SecurityScanner.exec.js.map +1 -0
- package/dist/src/security/scanner/SecurityScanner.helpers.d.ts.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.helpers.js +17 -1
- package/dist/src/security/scanner/SecurityScanner.helpers.js.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.js +34 -199
- package/dist/src/security/scanner/SecurityScanner.js.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.scanners.d.ts +22 -0
- package/dist/src/security/scanner/SecurityScanner.scanners.d.ts.map +1 -0
- package/dist/src/security/scanner/SecurityScanner.scanners.js +213 -0
- package/dist/src/security/scanner/SecurityScanner.scanners.js.map +1 -0
- package/dist/src/security/scanner/index.d.ts +1 -1
- package/dist/src/security/scanner/index.d.ts.map +1 -1
- package/dist/src/security/scanner/index.js +1 -1
- package/dist/src/security/scanner/index.js.map +1 -1
- package/dist/src/security/scanner/patterns.d.ts +21 -0
- package/dist/src/security/scanner/patterns.d.ts.map +1 -1
- package/dist/src/security/scanner/patterns.js +34 -0
- package/dist/src/security/scanner/patterns.js.map +1 -1
- package/dist/src/security/scanner/types.d.ts +3 -1
- package/dist/src/security/scanner/types.d.ts.map +1 -1
- package/dist/src/security/scanner/weights.d.ts.map +1 -1
- package/dist/src/security/scanner/weights.js +6 -0
- package/dist/src/security/scanner/weights.js.map +1 -1
- package/dist/src/services/SearchService.helpers.d.ts.map +1 -1
- package/dist/src/services/SearchService.helpers.js +2 -0
- package/dist/src/services/SearchService.helpers.js.map +1 -1
- package/dist/src/services/SearchService.types.d.ts +1 -0
- package/dist/src/services/SearchService.types.d.ts.map +1 -1
- package/dist/src/services/skill-installation.helpers.d.ts +2 -26
- package/dist/src/services/skill-installation.helpers.d.ts.map +1 -1
- package/dist/src/services/skill-installation.helpers.js +2 -120
- package/dist/src/services/skill-installation.helpers.js.map +1 -1
- package/dist/src/services/skill-installation.io.d.ts +43 -0
- package/dist/src/services/skill-installation.io.d.ts.map +1 -0
- package/dist/src/services/skill-installation.io.js +176 -0
- package/dist/src/services/skill-installation.io.js.map +1 -0
- package/dist/src/services/skill-installation.service.d.ts.map +1 -1
- package/dist/src/services/skill-installation.service.js +51 -113
- package/dist/src/services/skill-installation.service.js.map +1 -1
- package/dist/src/services/skill-installation.types.d.ts.map +1 -1
- package/dist/src/services/skill-installation.types.js +9 -0
- package/dist/src/services/skill-installation.types.js.map +1 -1
- package/dist/src/services/skill-installation.validate.d.ts +44 -0
- package/dist/src/services/skill-installation.validate.d.ts.map +1 -0
- package/dist/src/services/skill-installation.validate.js +134 -0
- package/dist/src/services/skill-installation.validate.js.map +1 -0
- package/dist/src/telemetry/index.d.ts +2 -1
- package/dist/src/telemetry/index.d.ts.map +1 -1
- package/dist/src/telemetry/index.js +4 -1
- package/dist/src/telemetry/index.js.map +1 -1
- package/dist/src/telemetry/posthog.d.ts +19 -1
- package/dist/src/telemetry/posthog.d.ts.map +1 -1
- package/dist/src/telemetry/posthog.js +14 -0
- package/dist/src/telemetry/posthog.js.map +1 -1
- package/dist/src/telemetry/wrap.bench.d.ts +13 -0
- package/dist/src/telemetry/wrap.bench.d.ts.map +1 -0
- package/dist/src/telemetry/wrap.bench.js +41 -0
- package/dist/src/telemetry/wrap.bench.js.map +1 -0
- package/dist/src/telemetry/wrap.d.ts +75 -0
- package/dist/src/telemetry/wrap.d.ts.map +1 -0
- package/dist/src/telemetry/wrap.js +124 -0
- package/dist/src/telemetry/wrap.js.map +1 -0
- package/dist/src/telemetry/wrap.test.d.ts +14 -0
- package/dist/src/telemetry/wrap.test.d.ts.map +1 -0
- package/dist/src/telemetry/wrap.test.js +283 -0
- package/dist/src/telemetry/wrap.test.js.map +1 -0
- package/dist/src/types/skill.d.ts +6 -1
- package/dist/src/types/skill.d.ts.map +1 -1
- package/dist/src/types/skill.js.map +1 -1
- package/dist/src/types.d.ts +25 -1
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/types.js +3 -1
- package/dist/src/types.js.map +1 -1
- package/dist/tests/GitHubIndexer.edge-cases.test.js +2 -2
- package/dist/tests/GitHubIndexer.repository.test.d.ts +10 -0
- package/dist/tests/GitHubIndexer.repository.test.d.ts.map +1 -0
- package/dist/tests/GitHubIndexer.repository.test.js +190 -0
- package/dist/tests/GitHubIndexer.repository.test.js.map +1 -0
- package/dist/tests/GitHubIndexer.test.d.ts +2 -1
- package/dist/tests/GitHubIndexer.test.d.ts.map +1 -1
- package/dist/tests/GitHubIndexer.test.js +5 -183
- package/dist/tests/GitHubIndexer.test.js.map +1 -1
- package/dist/tests/QuarantineRepository.review-state-machine.test.d.ts +14 -0
- package/dist/tests/QuarantineRepository.review-state-machine.test.d.ts.map +1 -0
- package/dist/tests/QuarantineRepository.review-state-machine.test.js +296 -0
- package/dist/tests/QuarantineRepository.review-state-machine.test.js.map +1 -0
- package/dist/tests/RawUrlSourceAdapter.security.test.js +3 -2
- package/dist/tests/RawUrlSourceAdapter.security.test.js.map +1 -1
- package/dist/tests/SecurityScanner.exec.test.d.ts +11 -0
- package/dist/tests/SecurityScanner.exec.test.d.ts.map +1 -0
- package/dist/tests/SecurityScanner.exec.test.js +190 -0
- package/dist/tests/SecurityScanner.exec.test.js.map +1 -0
- package/dist/tests/SwarmIndexer.test.js +2 -2
- package/dist/tests/api/client.validation.test.js +7 -4
- package/dist/tests/api/client.validation.test.js.map +1 -1
- package/dist/tests/embeddings/probe.test.d.ts +13 -0
- package/dist/tests/embeddings/probe.test.d.ts.map +1 -0
- package/dist/tests/embeddings/probe.test.js +154 -0
- package/dist/tests/embeddings/probe.test.js.map +1 -0
- package/dist/tests/fixtures/api-responses/index.js +1 -1
- package/dist/tests/fixtures/api-responses/index.js.map +1 -1
- package/dist/tests/integration/QuarantineService.concurrency.test.d.ts +34 -0
- package/dist/tests/integration/QuarantineService.concurrency.test.d.ts.map +1 -0
- package/dist/tests/integration/QuarantineService.concurrency.test.js +280 -0
- package/dist/tests/integration/QuarantineService.concurrency.test.js.map +1 -0
- package/dist/tests/integration/openapi-contract.test.d.ts +16 -0
- package/dist/tests/integration/openapi-contract.test.d.ts.map +1 -0
- package/dist/tests/integration/openapi-contract.test.js +231 -0
- package/dist/tests/integration/openapi-contract.test.js.map +1 -0
- package/dist/tests/provenance/SourceRecoveryService.test.d.ts +2 -0
- package/dist/tests/provenance/SourceRecoveryService.test.d.ts.map +1 -0
- package/dist/tests/provenance/SourceRecoveryService.test.js +132 -0
- package/dist/tests/provenance/SourceRecoveryService.test.js.map +1 -0
- package/dist/tests/provenance/backfill.test.d.ts +2 -0
- package/dist/tests/provenance/backfill.test.d.ts.map +1 -0
- package/dist/tests/provenance/backfill.test.js +278 -0
- package/dist/tests/provenance/backfill.test.js.map +1 -0
- package/dist/tests/provenance/git-config.test.d.ts +2 -0
- package/dist/tests/provenance/git-config.test.d.ts.map +1 -0
- package/dist/tests/provenance/git-config.test.js +73 -0
- package/dist/tests/provenance/git-config.test.js.map +1 -0
- package/dist/tests/provenance/local-skill-scan.test.d.ts +2 -0
- package/dist/tests/provenance/local-skill-scan.test.d.ts.map +1 -0
- package/dist/tests/provenance/local-skill-scan.test.js +51 -0
- package/dist/tests/provenance/local-skill-scan.test.js.map +1 -0
- package/dist/tests/provenance/plugin-manifest.test.d.ts +2 -0
- package/dist/tests/provenance/plugin-manifest.test.d.ts.map +1 -0
- package/dist/tests/provenance/plugin-manifest.test.js +49 -0
- package/dist/tests/provenance/plugin-manifest.test.js.map +1 -0
- package/dist/tests/scripts/import-to-database.test.js +7 -1
- package/dist/tests/scripts/import-to-database.test.js.map +1 -1
- package/dist/tests/security/scanner-regression-guard.test.js +5 -1
- package/dist/tests/security/scanner-regression-guard.test.js.map +1 -1
- package/dist/tests/security.test.js +45 -0
- package/dist/tests/security.test.js.map +1 -1
- package/dist/tests/services/aidefence-feedback.test.js +2 -0
- package/dist/tests/services/aidefence-feedback.test.js.map +1 -1
- package/dist/tests/services/dep-quarantine-check.test.js +1 -1
- package/dist/tests/services/dep-quarantine-check.test.js.map +1 -1
- package/dist/tests/skill-scanner/allowlist.test.js +8 -1
- package/dist/tests/skill-scanner/allowlist.test.js.map +1 -1
- package/dist/tests/unit/services/skill-installation.gap1.test.d.ts +12 -0
- package/dist/tests/unit/services/skill-installation.gap1.test.d.ts.map +1 -0
- package/dist/tests/unit/services/skill-installation.gap1.test.js +96 -0
- package/dist/tests/unit/services/skill-installation.gap1.test.js.map +1 -0
- package/dist/tests/unit/services/skill-installation.io.test.d.ts +11 -0
- package/dist/tests/unit/services/skill-installation.io.test.d.ts.map +1 -0
- package/dist/tests/unit/services/skill-installation.io.test.js +130 -0
- package/dist/tests/unit/services/skill-installation.io.test.js.map +1 -0
- package/dist/tests/validate-skills.dedup.test.d.ts +5 -0
- package/dist/tests/validate-skills.dedup.test.d.ts.map +1 -0
- package/dist/tests/validate-skills.dedup.test.js +241 -0
- package/dist/tests/validate-skills.dedup.test.js.map +1 -0
- package/dist/tests/validate-skills.normalizers.test.d.ts +5 -0
- package/dist/tests/validate-skills.normalizers.test.d.ts.map +1 -0
- package/dist/tests/validate-skills.normalizers.test.js +109 -0
- package/dist/tests/validate-skills.normalizers.test.js.map +1 -0
- package/dist/tests/validate-skills.test.d.ts +1 -1
- package/dist/tests/validate-skills.test.js +7 -345
- package/dist/tests/validate-skills.test.js.map +1 -1
- package/package.json +29 -8
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-5016: Unit tests for withTelemetry HOF + isTelemetered registry.
|
|
3
|
+
*
|
|
4
|
+
* Covers the shared-state matrix invariants from plan line 720:
|
|
5
|
+
* - function-decl wrap
|
|
6
|
+
* - arrow-const export wrap (H3 critical case)
|
|
7
|
+
* - double-register idempotency (Set dedupes by reference)
|
|
8
|
+
* - isTelemetered true/false
|
|
9
|
+
* - emit-on-throw (success:false, then re-throw)
|
|
10
|
+
* - telemetry emit failure does NOT affect wrapped fn
|
|
11
|
+
* - per-request framework (H4 — not memoised)
|
|
12
|
+
*/
|
|
13
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
14
|
+
import { withTelemetry, isTelemetered, setEmissionGate } from './wrap.js';
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
// Mock trackSkillInvoke so tests run without a live PostHog instance
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
vi.mock('./posthog.js', () => ({
|
|
19
|
+
trackSkillInvoke: vi.fn(),
|
|
20
|
+
}));
|
|
21
|
+
import { trackSkillInvoke } from './posthog.js';
|
|
22
|
+
const mockTrack = vi.mocked(trackSkillInvoke);
|
|
23
|
+
beforeEach(() => {
|
|
24
|
+
mockTrack.mockReset();
|
|
25
|
+
// SMI-5019 wire-in: default is now suppress-when-no-gate. Install a permissive
|
|
26
|
+
// gate so the legacy SMI-5016 tests below (which predate the consent gate)
|
|
27
|
+
// continue to assert against emit behaviour. The new emission-gate describe
|
|
28
|
+
// block at the bottom overrides this per-case.
|
|
29
|
+
setEmissionGate(() => true);
|
|
30
|
+
});
|
|
31
|
+
afterEach(() => {
|
|
32
|
+
// Reset to default-suppress so a leaked gate from one test does not flow
|
|
33
|
+
// into the next file's tests or pollute the per-process module state.
|
|
34
|
+
setEmissionGate(undefined);
|
|
35
|
+
});
|
|
36
|
+
// ---------------------------------------------------------------------------
|
|
37
|
+
// Helpers
|
|
38
|
+
// ---------------------------------------------------------------------------
|
|
39
|
+
const BASE_OPTS = {
|
|
40
|
+
source: 'mcp-tool',
|
|
41
|
+
extractSkillId: () => 'test/skill',
|
|
42
|
+
};
|
|
43
|
+
// ---------------------------------------------------------------------------
|
|
44
|
+
// 1. Function-declaration wrap
|
|
45
|
+
// ---------------------------------------------------------------------------
|
|
46
|
+
describe('function-declaration wrap', () => {
|
|
47
|
+
it('wraps a named function declaration and registers it', async () => {
|
|
48
|
+
function myHandler(x) {
|
|
49
|
+
return x * 2;
|
|
50
|
+
}
|
|
51
|
+
const wrapped = withTelemetry(myHandler, BASE_OPTS);
|
|
52
|
+
expect(isTelemetered(wrapped)).toBe(true);
|
|
53
|
+
expect(isTelemetered(myHandler)).toBe(false);
|
|
54
|
+
const result = await wrapped(3);
|
|
55
|
+
expect(result).toBe(6);
|
|
56
|
+
expect(mockTrack).toHaveBeenCalledOnce();
|
|
57
|
+
expect(mockTrack).toHaveBeenCalledWith(expect.objectContaining({ skillId: 'test/skill', success: true }));
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
// ---------------------------------------------------------------------------
|
|
61
|
+
// 2. Arrow-const export wrap (H3 critical case)
|
|
62
|
+
// ---------------------------------------------------------------------------
|
|
63
|
+
describe('arrow-const export wrap', () => {
|
|
64
|
+
it('wraps an arrow-const and registers the returned function (not the original)', async () => {
|
|
65
|
+
// This is the exact pattern that plan review change H3 was about:
|
|
66
|
+
// arrow-const exports cannot be mutated, so the registry MUST track the
|
|
67
|
+
// returned wrappedFn, not mutate the original.
|
|
68
|
+
const originalFn = (v) => v.toUpperCase();
|
|
69
|
+
const wrappedExport = withTelemetry(originalFn, BASE_OPTS);
|
|
70
|
+
// The returned function is telemetered; the original is not.
|
|
71
|
+
expect(isTelemetered(wrappedExport)).toBe(true);
|
|
72
|
+
expect(isTelemetered(originalFn)).toBe(false);
|
|
73
|
+
const result = await wrappedExport('hello');
|
|
74
|
+
expect(result).toBe('HELLO');
|
|
75
|
+
expect(mockTrack).toHaveBeenCalledOnce();
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
// ---------------------------------------------------------------------------
|
|
79
|
+
// 3. Double-register idempotency
|
|
80
|
+
// ---------------------------------------------------------------------------
|
|
81
|
+
describe('double-register', () => {
|
|
82
|
+
it('re-wrapping the same RETURNED function adds no new entries (Set dedupes by ref)', () => {
|
|
83
|
+
const original = () => 'value';
|
|
84
|
+
const w1 = withTelemetry(original, BASE_OPTS);
|
|
85
|
+
// Capture Set size after first wrap
|
|
86
|
+
expect(isTelemetered(w1)).toBe(true);
|
|
87
|
+
// Now attempt to re-wrap the *returned* function.
|
|
88
|
+
// The Set already contains w1, so adding it again is a no-op by Set semantics.
|
|
89
|
+
const w2 = withTelemetry(w1, BASE_OPTS);
|
|
90
|
+
// w2 is a NEW wrapper around w1 — both are in the Set, but w1 wasn't
|
|
91
|
+
// added a second time. isTelemetered(w1) is still true, and w2 is also true.
|
|
92
|
+
expect(isTelemetered(w1)).toBe(true);
|
|
93
|
+
expect(isTelemetered(w2)).toBe(true);
|
|
94
|
+
});
|
|
95
|
+
it('wrapping the same original fn twice produces two distinct wrapped fns, both registered', () => {
|
|
96
|
+
const original = () => 'x';
|
|
97
|
+
const wa = withTelemetry(original, BASE_OPTS);
|
|
98
|
+
const wb = withTelemetry(original, BASE_OPTS);
|
|
99
|
+
// Different wrapper references
|
|
100
|
+
expect(wa).not.toBe(wb);
|
|
101
|
+
expect(isTelemetered(wa)).toBe(true);
|
|
102
|
+
expect(isTelemetered(wb)).toBe(true);
|
|
103
|
+
// Original still not in registry
|
|
104
|
+
expect(isTelemetered(original)).toBe(false);
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
// ---------------------------------------------------------------------------
|
|
108
|
+
// 4. isTelemetered true/false
|
|
109
|
+
// ---------------------------------------------------------------------------
|
|
110
|
+
describe('isTelemetered', () => {
|
|
111
|
+
it('returns false for an arbitrary unwrapped function', () => {
|
|
112
|
+
const plain = () => { };
|
|
113
|
+
expect(isTelemetered(plain)).toBe(false);
|
|
114
|
+
});
|
|
115
|
+
it('returns true only for the wrapped return value', () => {
|
|
116
|
+
const original = () => 42;
|
|
117
|
+
const result = withTelemetry(original, BASE_OPTS);
|
|
118
|
+
expect(isTelemetered(result)).toBe(true);
|
|
119
|
+
expect(isTelemetered(original)).toBe(false);
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
// ---------------------------------------------------------------------------
|
|
123
|
+
// 5. Emit happens even on thrown errors
|
|
124
|
+
// ---------------------------------------------------------------------------
|
|
125
|
+
describe('emit-on-throw', () => {
|
|
126
|
+
it('emits with success:false and re-throws when handler throws', async () => {
|
|
127
|
+
const boom = () => {
|
|
128
|
+
throw new Error('handler exploded');
|
|
129
|
+
};
|
|
130
|
+
const wrappedBoom = withTelemetry(boom, BASE_OPTS);
|
|
131
|
+
await expect(wrappedBoom()).rejects.toThrow('handler exploded');
|
|
132
|
+
expect(mockTrack).toHaveBeenCalledOnce();
|
|
133
|
+
expect(mockTrack).toHaveBeenCalledWith(expect.objectContaining({ success: false, skillId: 'test/skill' }));
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
// ---------------------------------------------------------------------------
|
|
137
|
+
// 6. Telemetry emission failure does NOT affect wrapped fn
|
|
138
|
+
// ---------------------------------------------------------------------------
|
|
139
|
+
describe('emit-failure survival', () => {
|
|
140
|
+
it('returns the handler result even when trackSkillInvoke throws', async () => {
|
|
141
|
+
mockTrack.mockImplementation(() => {
|
|
142
|
+
throw new Error('PostHog is down');
|
|
143
|
+
});
|
|
144
|
+
const stable = () => 'still works';
|
|
145
|
+
const wrappedStable = withTelemetry(stable, BASE_OPTS);
|
|
146
|
+
const result = await wrappedStable();
|
|
147
|
+
expect(result).toBe('still works');
|
|
148
|
+
// trackSkillInvoke was called (and threw), but the wrapper swallowed it.
|
|
149
|
+
expect(mockTrack).toHaveBeenCalledOnce();
|
|
150
|
+
});
|
|
151
|
+
});
|
|
152
|
+
// ---------------------------------------------------------------------------
|
|
153
|
+
// 7. Per-request framework value (H4 — not memoised)
|
|
154
|
+
// ---------------------------------------------------------------------------
|
|
155
|
+
describe('per-request framework', () => {
|
|
156
|
+
it('reflects opts.extractFramework return value at each call independently', async () => {
|
|
157
|
+
let frameValue = 'cursor';
|
|
158
|
+
const handler = () => 'ok';
|
|
159
|
+
const wrappedWithFramework = withTelemetry(handler, {
|
|
160
|
+
...BASE_OPTS,
|
|
161
|
+
extractFramework: () => frameValue,
|
|
162
|
+
});
|
|
163
|
+
await wrappedWithFramework();
|
|
164
|
+
expect(mockTrack).toHaveBeenLastCalledWith(expect.objectContaining({ framework: 'cursor' }));
|
|
165
|
+
// Mutate the frame value — simulates a different client on the same server
|
|
166
|
+
frameValue = 'copilot';
|
|
167
|
+
mockTrack.mockReset();
|
|
168
|
+
await wrappedWithFramework();
|
|
169
|
+
expect(mockTrack).toHaveBeenLastCalledWith(expect.objectContaining({ framework: 'copilot' }));
|
|
170
|
+
});
|
|
171
|
+
it('defaults framework to "unknown" when extractFramework is not provided', async () => {
|
|
172
|
+
const handler = () => 'ok';
|
|
173
|
+
const wrappedNoFrame = withTelemetry(handler, BASE_OPTS // no extractFramework
|
|
174
|
+
);
|
|
175
|
+
await wrappedNoFrame();
|
|
176
|
+
expect(mockTrack).toHaveBeenCalledWith(expect.objectContaining({ framework: 'unknown' }));
|
|
177
|
+
});
|
|
178
|
+
});
|
|
179
|
+
// ---------------------------------------------------------------------------
|
|
180
|
+
// 8. Overhead gate (Risk #7 — p99 < 1ms per wrapped call)
|
|
181
|
+
// ---------------------------------------------------------------------------
|
|
182
|
+
describe('overhead gate (risk #7)', () => {
|
|
183
|
+
it('p99 per-call overhead is < 1ms over 10 000 iterations', async () => {
|
|
184
|
+
const ITERATIONS = 10_000;
|
|
185
|
+
const noopHandler = async () => 42;
|
|
186
|
+
const wrappedNoop = withTelemetry(noopHandler, {
|
|
187
|
+
source: 'mcp-tool',
|
|
188
|
+
extractSkillId: () => 'bench/skill',
|
|
189
|
+
});
|
|
190
|
+
// JIT warm-up — stabilise before measuring
|
|
191
|
+
for (let i = 0; i < 100; i++) {
|
|
192
|
+
await wrappedNoop();
|
|
193
|
+
}
|
|
194
|
+
mockTrack.mockReset();
|
|
195
|
+
const elapsed = [];
|
|
196
|
+
for (let i = 0; i < ITERATIONS; i++) {
|
|
197
|
+
const t0 = performance.now();
|
|
198
|
+
await wrappedNoop();
|
|
199
|
+
elapsed.push(performance.now() - t0);
|
|
200
|
+
}
|
|
201
|
+
elapsed.sort((a, b) => a - b);
|
|
202
|
+
const p99 = elapsed[Math.ceil(ITERATIONS * 0.99) - 1];
|
|
203
|
+
const mean = elapsed.reduce((s, v) => s + v, 0) / ITERATIONS;
|
|
204
|
+
// Risk #7 gate: p99 must be below 1ms
|
|
205
|
+
expect(p99).toBeLessThan(1);
|
|
206
|
+
// Sanity gate: mean overhead should be well below 0.5ms
|
|
207
|
+
expect(mean).toBeLessThan(0.5);
|
|
208
|
+
expect(mockTrack).toHaveBeenCalledTimes(ITERATIONS);
|
|
209
|
+
});
|
|
210
|
+
});
|
|
211
|
+
// ---------------------------------------------------------------------------
|
|
212
|
+
// 9. Emission gate (SMI-5019 wire-in)
|
|
213
|
+
// ---------------------------------------------------------------------------
|
|
214
|
+
//
|
|
215
|
+
// These tests verify the privacy-safe default-suppress contract:
|
|
216
|
+
//
|
|
217
|
+
// - No gate installed → withTelemetry must NOT call trackSkillInvoke
|
|
218
|
+
// - Gate returns true → emit
|
|
219
|
+
// - Gate returns false → suppress
|
|
220
|
+
// - Gate is evaluated per-call (not memoised), so a toggling predicate
|
|
221
|
+
// produces different outcomes on consecutive calls
|
|
222
|
+
//
|
|
223
|
+
// The outer `beforeEach` installs a permissive gate for the legacy tests;
|
|
224
|
+
// these cases override that gate explicitly per-case.
|
|
225
|
+
describe('emission gate (SMI-5019 wire-in)', () => {
|
|
226
|
+
beforeEach(() => {
|
|
227
|
+
// Override the outer permissive gate — start each case with no gate
|
|
228
|
+
// installed, so the default-suppress behaviour is the natural baseline.
|
|
229
|
+
setEmissionGate(undefined);
|
|
230
|
+
});
|
|
231
|
+
it('default-suppress: no gate installed → no emit', async () => {
|
|
232
|
+
const handler = () => 'ok';
|
|
233
|
+
const wrappedFn = withTelemetry(handler, BASE_OPTS);
|
|
234
|
+
const result = await wrappedFn();
|
|
235
|
+
expect(result).toBe('ok');
|
|
236
|
+
expect(mockTrack).not.toHaveBeenCalled();
|
|
237
|
+
});
|
|
238
|
+
it('gate returns true → emit', async () => {
|
|
239
|
+
setEmissionGate(() => true);
|
|
240
|
+
const handler = () => 'ok';
|
|
241
|
+
const wrappedFn = withTelemetry(handler, BASE_OPTS);
|
|
242
|
+
await wrappedFn();
|
|
243
|
+
expect(mockTrack).toHaveBeenCalledOnce();
|
|
244
|
+
expect(mockTrack).toHaveBeenCalledWith(expect.objectContaining({ skillId: 'test/skill', success: true }));
|
|
245
|
+
});
|
|
246
|
+
it('gate returns false → no emit', async () => {
|
|
247
|
+
setEmissionGate(() => false);
|
|
248
|
+
const handler = () => 'ok';
|
|
249
|
+
const wrappedFn = withTelemetry(handler, BASE_OPTS);
|
|
250
|
+
await wrappedFn();
|
|
251
|
+
expect(mockTrack).not.toHaveBeenCalled();
|
|
252
|
+
});
|
|
253
|
+
it('gate is evaluated per-call (toggling predicate produces emit then no-emit)', async () => {
|
|
254
|
+
// Toggle true → false across the two invocations. Verifies the gate is
|
|
255
|
+
// NOT memoised at install time — each call queries it fresh, matching
|
|
256
|
+
// the per-call extractFramework contract (H4).
|
|
257
|
+
let nextReturn = true;
|
|
258
|
+
setEmissionGate(() => {
|
|
259
|
+
const value = nextReturn;
|
|
260
|
+
nextReturn = !nextReturn;
|
|
261
|
+
return value;
|
|
262
|
+
});
|
|
263
|
+
const handler = () => 'ok';
|
|
264
|
+
const wrappedFn = withTelemetry(handler, BASE_OPTS);
|
|
265
|
+
await wrappedFn();
|
|
266
|
+
expect(mockTrack).toHaveBeenCalledOnce();
|
|
267
|
+
mockTrack.mockReset();
|
|
268
|
+
await wrappedFn();
|
|
269
|
+
expect(mockTrack).not.toHaveBeenCalled();
|
|
270
|
+
});
|
|
271
|
+
it('gate is also consulted on throw — no emit when suppressed even if handler fails', async () => {
|
|
272
|
+
// Reinforces the privacy-safe invariant: a throwing handler must not
|
|
273
|
+
// smuggle telemetry past a suppressing gate via the finally block.
|
|
274
|
+
setEmissionGate(() => false);
|
|
275
|
+
const boom = () => {
|
|
276
|
+
throw new Error('handler exploded');
|
|
277
|
+
};
|
|
278
|
+
const wrappedBoom = withTelemetry(boom, BASE_OPTS);
|
|
279
|
+
await expect(wrappedBoom()).rejects.toThrow('handler exploded');
|
|
280
|
+
expect(mockTrack).not.toHaveBeenCalled();
|
|
281
|
+
});
|
|
282
|
+
});
|
|
283
|
+
//# sourceMappingURL=wrap.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wrap.test.js","sourceRoot":"","sources":["../../../src/telemetry/wrap.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AACxE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAEzE,8EAA8E;AAC9E,qEAAqE;AACrE,8EAA8E;AAE9E,EAAE,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,EAAE,CAAC,CAAC;IAC7B,gBAAgB,EAAE,EAAE,CAAC,EAAE,EAAE;CAC1B,CAAC,CAAC,CAAA;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAC/C,MAAM,SAAS,GAAG,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAA;AAE7C,UAAU,CAAC,GAAG,EAAE;IACd,SAAS,CAAC,SAAS,EAAE,CAAA;IACrB,+EAA+E;IAC/E,2EAA2E;IAC3E,4EAA4E;IAC5E,+CAA+C;IAC/C,eAAe,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAA;AAC7B,CAAC,CAAC,CAAA;AAEF,SAAS,CAAC,GAAG,EAAE;IACb,yEAAyE;IACzE,sEAAsE;IACtE,eAAe,CAAC,SAAS,CAAC,CAAA;AAC5B,CAAC,CAAC,CAAA;AAEF,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E,MAAM,SAAS,GAAG;IAChB,MAAM,EAAE,UAAmB;IAC3B,cAAc,EAAE,GAAG,EAAE,CAAC,YAAY;CACnC,CAAA;AAED,8EAA8E;AAC9E,+BAA+B;AAC/B,8EAA8E;AAE9E,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;IACzC,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACnE,SAAS,SAAS,CAAC,CAAS;YAC1B,OAAO,CAAC,GAAG,CAAC,CAAA;QACd,CAAC;QAED,MAAM,OAAO,GAAG,aAAa,CAAC,SAAoD,EAAE,SAAS,CAAC,CAAA;QAE9F,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACzC,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAE5C,MAAM,MAAM,GAAG,MAAO,OAAqD,CAAC,CAAC,CAAC,CAAA;QAC9E,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACtB,MAAM,CAAC,SAAS,CAAC,CAAC,oBAAoB,EAAE,CAAA;QACxC,MAAM,CAAC,SAAS,CAAC,CAAC,oBAAoB,CACpC,MAAM,CAAC,gBAAgB,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAClE,CAAA;IACH,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,8EAA8E;AAC9E,gDAAgD;AAChD,8EAA8E;AAE9E,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACvC,EAAE,CAAC,6EAA6E,EAAE,KAAK,IAAI,EAAE;QAC3F,kEAAkE;QAClE,wEAAwE;QACxE,+CAA+C;QAC/C,MAAM,UAAU,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAA;QAEzD,MAAM,aAAa,GAAG,aAAa,CACjC,UAAqD,EACrD,SAAS,CACV,CAAA;QAED,6DAA6D;QAC7D,MAAM,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC/C,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAE7C,MAAM,MAAM,GAAG,MAAO,aAA2D,CAAC,OAAO,CAAC,CAAA;QAC1F,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAC5B,MAAM,CAAC,SAAS,CAAC,CAAC,oBAAoB,EAAE,CAAA;IAC1C,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,8EAA8E;AAC9E,iCAAiC;AACjC,8EAA8E;AAE9E,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,EAAE,CAAC,iFAAiF,EAAE,GAAG,EAAE;QACzF,MAAM,QAAQ,GAAG,GAAG,EAAE,CAAC,OAAO,CAAA;QAE9B,MAAM,EAAE,GAAG,aAAa,CAAC,QAAmD,EAAE,SAAS,CAAC,CAAA;QAExF,oCAAoC;QACpC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAEpC,kDAAkD;QAClD,+EAA+E;QAC/E,MAAM,EAAE,GAAG,aAAa,CAAC,EAAE,EAAE,SAAS,CAAC,CAAA;QAEvC,qEAAqE;QACrE,8EAA8E;QAC9E,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACpC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACtC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,wFAAwF,EAAE,GAAG,EAAE;QAChG,MAAM,QAAQ,GAAG,GAAG,EAAE,CAAC,GAAG,CAAA;QAE1B,MAAM,EAAE,GAAG,aAAa,CAAC,QAAmD,EAAE,SAAS,CAAC,CAAA;QACxF,MAAM,EAAE,GAAG,aAAa,CAAC,QAAmD,EAAE,SAAS,CAAC,CAAA;QAExF,+BAA+B;QAC/B,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACvB,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACpC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACpC,iCAAiC;QACjC,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAC7C,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,8EAA8E;AAC9E,8BAA8B;AAC9B,8EAA8E;AAE9E,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,KAAK,GAAG,GAAG,EAAE,GAAE,CAAC,CAAA;QACtB,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAC1C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,QAAQ,GAAG,GAAG,EAAE,CAAC,EAAE,CAAA;QACzB,MAAM,MAAM,GAAG,aAAa,CAAC,QAAmD,EAAE,SAAS,CAAC,CAAA;QAC5F,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACxC,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAC7C,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,8EAA8E;AAC9E,wCAAwC;AACxC,8EAA8E;AAE9E,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;QAC1E,MAAM,IAAI,GAAG,GAAU,EAAE;YACvB,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAA;QACrC,CAAC,CAAA;QAED,MAAM,WAAW,GAAG,aAAa,CAAC,IAA+C,EAAE,SAAS,CAAC,CAAA;QAE7F,MAAM,MAAM,CAAE,WAA+C,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAC9E,kBAAkB,CACnB,CAAA;QAED,MAAM,CAAC,SAAS,CAAC,CAAC,oBAAoB,EAAE,CAAA;QACxC,MAAM,CAAC,SAAS,CAAC,CAAC,oBAAoB,CACpC,MAAM,CAAC,gBAAgB,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,CACnE,CAAA;IACH,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,8EAA8E;AAC9E,2DAA2D;AAC3D,8EAA8E;AAE9E,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,EAAE,CAAC,8DAA8D,EAAE,KAAK,IAAI,EAAE;QAC5E,SAAS,CAAC,kBAAkB,CAAC,GAAG,EAAE;YAChC,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAA;QACpC,CAAC,CAAC,CAAA;QAEF,MAAM,MAAM,GAAG,GAAG,EAAE,CAAC,aAAa,CAAA;QAClC,MAAM,aAAa,GAAG,aAAa,CACjC,MAAiD,EACjD,SAAS,CACV,CAAA;QAED,MAAM,MAAM,GAAG,MAAO,aAAkD,EAAE,CAAA;QAC1E,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;QAClC,yEAAyE;QACzE,MAAM,CAAC,SAAS,CAAC,CAAC,oBAAoB,EAAE,CAAA;IAC1C,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,8EAA8E;AAC9E,qDAAqD;AACrD,8EAA8E;AAE9E,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,EAAE,CAAC,wEAAwE,EAAE,KAAK,IAAI,EAAE;QACtF,IAAI,UAAU,GAAG,QAAQ,CAAA;QAEzB,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,IAAI,CAAA;QAC1B,MAAM,oBAAoB,GAAG,aAAa,CAAC,OAAkD,EAAE;YAC7F,GAAG,SAAS;YACZ,gBAAgB,EAAE,GAAG,EAAE,CAAC,UAAU;SACnC,CAAC,CAAA;QAEF,MAAO,oBAA0D,EAAE,CAAA;QACnE,MAAM,CAAC,SAAS,CAAC,CAAC,wBAAwB,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAA;QAE5F,2EAA2E;QAC3E,UAAU,GAAG,SAAS,CAAA;QACtB,SAAS,CAAC,SAAS,EAAE,CAAA;QAErB,MAAO,oBAA0D,EAAE,CAAA;QACnE,MAAM,CAAC,SAAS,CAAC,CAAC,wBAAwB,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC,CAAA;IAC/F,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uEAAuE,EAAE,KAAK,IAAI,EAAE;QACrF,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,IAAI,CAAA;QAC1B,MAAM,cAAc,GAAG,aAAa,CAClC,OAAkD,EAClD,SAAS,CAAC,sBAAsB;SACjC,CAAA;QAED,MAAO,cAAoD,EAAE,CAAA;QAC7D,MAAM,CAAC,SAAS,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC,CAAA;IAC3F,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,8EAA8E;AAC9E,0DAA0D;AAC1D,8EAA8E;AAE9E,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACvC,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;QACrE,MAAM,UAAU,GAAG,MAAM,CAAA;QACzB,MAAM,WAAW,GAAG,KAAK,IAAqB,EAAE,CAAC,EAAE,CAAA;QAEnD,MAAM,WAAW,GAAG,aAAa,CAAC,WAAW,EAAE;YAC7C,MAAM,EAAE,UAAU;YAClB,cAAc,EAAE,GAAG,EAAE,CAAC,aAAa;SACpC,CAAC,CAAA;QAEF,2CAA2C;QAC3C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7B,MAAO,WAAiD,EAAE,CAAA;QAC5D,CAAC;QACD,SAAS,CAAC,SAAS,EAAE,CAAA;QAErB,MAAM,OAAO,GAAa,EAAE,CAAA;QAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;YACpC,MAAM,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE,CAAA;YAC5B,MAAO,WAAiD,EAAE,CAAA;YAC1D,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAA;QACtC,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;QAC7B,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;QACrD,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,UAAU,CAAA;QAE5D,sCAAsC;QACtC,MAAM,CAAC,GAAG,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QAC3B,wDAAwD;QACxD,MAAM,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAA;QAE9B,MAAM,CAAC,SAAS,CAAC,CAAC,qBAAqB,CAAC,UAAU,CAAC,CAAA;IACrD,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,8EAA8E;AAC9E,sCAAsC;AACtC,8EAA8E;AAC9E,EAAE;AACF,iEAAiE;AACjE,EAAE;AACF,uEAAuE;AACvE,+BAA+B;AAC/B,oCAAoC;AACpC,yEAAyE;AACzE,uDAAuD;AACvD,EAAE;AACF,0EAA0E;AAC1E,sDAAsD;AACtD,QAAQ,CAAC,kCAAkC,EAAE,GAAG,EAAE;IAChD,UAAU,CAAC,GAAG,EAAE;QACd,oEAAoE;QACpE,wEAAwE;QACxE,eAAe,CAAC,SAAS,CAAC,CAAA;IAC5B,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC7D,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,IAAI,CAAA;QAC1B,MAAM,SAAS,GAAG,aAAa,CAAC,OAAkD,EAAE,SAAS,CAAC,CAAA;QAE9F,MAAM,MAAM,GAAG,MAAO,SAA8C,EAAE,CAAA;QAEtE,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACzB,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAA;IAC1C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,0BAA0B,EAAE,KAAK,IAAI,EAAE;QACxC,eAAe,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAA;QAE3B,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,IAAI,CAAA;QAC1B,MAAM,SAAS,GAAG,aAAa,CAAC,OAAkD,EAAE,SAAS,CAAC,CAAA;QAE9F,MAAO,SAA8C,EAAE,CAAA;QAEvD,MAAM,CAAC,SAAS,CAAC,CAAC,oBAAoB,EAAE,CAAA;QACxC,MAAM,CAAC,SAAS,CAAC,CAAC,oBAAoB,CACpC,MAAM,CAAC,gBAAgB,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAClE,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;QAC5C,eAAe,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAA;QAE5B,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,IAAI,CAAA;QAC1B,MAAM,SAAS,GAAG,aAAa,CAAC,OAAkD,EAAE,SAAS,CAAC,CAAA;QAE9F,MAAO,SAA8C,EAAE,CAAA;QAEvD,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAA;IAC1C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,4EAA4E,EAAE,KAAK,IAAI,EAAE;QAC1F,uEAAuE;QACvE,sEAAsE;QACtE,+CAA+C;QAC/C,IAAI,UAAU,GAAG,IAAI,CAAA;QACrB,eAAe,CAAC,GAAG,EAAE;YACnB,MAAM,KAAK,GAAG,UAAU,CAAA;YACxB,UAAU,GAAG,CAAC,UAAU,CAAA;YACxB,OAAO,KAAK,CAAA;QACd,CAAC,CAAC,CAAA;QAEF,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,IAAI,CAAA;QAC1B,MAAM,SAAS,GAAG,aAAa,CAAC,OAAkD,EAAE,SAAS,CAAC,CAAA;QAE9F,MAAO,SAA8C,EAAE,CAAA;QACvD,MAAM,CAAC,SAAS,CAAC,CAAC,oBAAoB,EAAE,CAAA;QAExC,SAAS,CAAC,SAAS,EAAE,CAAA;QAErB,MAAO,SAA8C,EAAE,CAAA;QACvD,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAA;IAC1C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,iFAAiF,EAAE,KAAK,IAAI,EAAE;QAC/F,qEAAqE;QACrE,mEAAmE;QACnE,eAAe,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAA;QAE5B,MAAM,IAAI,GAAG,GAAU,EAAE;YACvB,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAA;QACrC,CAAC,CAAA;QACD,MAAM,WAAW,GAAG,aAAa,CAAC,IAA+C,EAAE,SAAS,CAAC,CAAA;QAE7F,MAAM,MAAM,CAAE,WAA+C,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAC9E,kBAAkB,CACnB,CAAA;QAED,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAA;IAC1C,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -11,7 +11,7 @@ import type { DependencyDeclaration } from './dependencies.js';
|
|
|
11
11
|
* registry) is a first-class DB-backed tier — the skills.trust_tier CHECK
|
|
12
12
|
* constraint allows 'curated' (migration v17).
|
|
13
13
|
*/
|
|
14
|
-
export type TrustTier = 'verified' | 'curated' | 'community' | 'experimental' | 'unknown' | 'local';
|
|
14
|
+
export type TrustTier = 'official' | 'verified' | 'curated' | 'community' | 'experimental' | 'unknown' | 'unverified' | 'local';
|
|
15
15
|
/**
|
|
16
16
|
* SMI-1631: Skill roles for role-based recommendations
|
|
17
17
|
* Used to filter and prioritize skills based on their primary purpose
|
|
@@ -53,6 +53,11 @@ export interface Skill {
|
|
|
53
53
|
* `SkillRepository.rowToSkill()` always populates it from the DB.
|
|
54
54
|
*/
|
|
55
55
|
source?: SkillSource;
|
|
56
|
+
/**
|
|
57
|
+
* SMI-5327: SPDX license identifier (e.g. "MIT", "Apache-2.0"). Null means
|
|
58
|
+
* "unknown / not detected" — NOT "no restrictions" or "freely usable".
|
|
59
|
+
*/
|
|
60
|
+
license?: string | null;
|
|
56
61
|
createdAt: string;
|
|
57
62
|
updatedAt: string;
|
|
58
63
|
/** SHA-256 hex of the most recently recorded content proxy (optional, populated by SkillVersionRepository) */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill.d.ts","sourceRoot":"","sources":["../../../src/types/skill.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAA;AAE9D;;;;;;;;GAQG;
|
|
1
|
+
{"version":3,"file":"skill.d.ts","sourceRoot":"","sources":["../../../src/types/skill.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill.js","sourceRoot":"","sources":["../../../src/types/skill.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"skill.js","sourceRoot":"","sources":["../../../src/types/skill.ts"],"names":[],"mappings":"AAAA;;GAEG;AAoCH;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAyB;IAC/C,cAAc;IACd,SAAS;IACT,eAAe;IACf,UAAU;IACV,UAAU;IACV,qBAAqB;CACb,CAAA"}
|
package/dist/src/types.d.ts
CHANGED
|
@@ -6,8 +6,9 @@
|
|
|
6
6
|
* NOTE: Database tiers must match database schema (packages/core/src/database/schema.ts)
|
|
7
7
|
* SMI-1809: Added 'local' for local skills from ~/.claude/skills/
|
|
8
8
|
* SMI-2381: Added 'curated' for third-party publishers opted into the registry
|
|
9
|
+
* SMI-5205: Added 'official' and 'unverified' to align API wire format with public 5-tier model
|
|
9
10
|
*/
|
|
10
|
-
export type TrustTier = 'verified' | 'community' | 'experimental' | '
|
|
11
|
+
export type TrustTier = 'official' | 'verified' | 'curated' | 'community' | 'experimental' | 'unknown' | 'unverified' | 'local';
|
|
11
12
|
/**
|
|
12
13
|
* Trust tier descriptions for user display
|
|
13
14
|
*/
|
|
@@ -65,6 +66,11 @@ export interface Skill {
|
|
|
65
66
|
security?: SecuritySummary;
|
|
66
67
|
createdAt: string;
|
|
67
68
|
updatedAt: string;
|
|
69
|
+
/**
|
|
70
|
+
* SMI-5327: SPDX license identifier (e.g. "MIT", "Apache-2.0"). Null means
|
|
71
|
+
* "unknown / not detected" — NOT "no restrictions" or "freely usable".
|
|
72
|
+
*/
|
|
73
|
+
license?: string | null;
|
|
68
74
|
}
|
|
69
75
|
/**
|
|
70
76
|
* Skill search result (subset of full skill)
|
|
@@ -98,6 +104,11 @@ export interface SkillSearchResult {
|
|
|
98
104
|
installHint?: string;
|
|
99
105
|
/** SMI-2760: Flat array of compatible IDE/LLM/platform slugs (e.g. ["claude-code", "cursor", "claude"]) */
|
|
100
106
|
compatibility?: string[];
|
|
107
|
+
/**
|
|
108
|
+
* SMI-5327: SPDX license identifier (e.g. "MIT", "Apache-2.0"). Null means
|
|
109
|
+
* "unknown / not detected" — NOT "no restrictions" or "freely usable".
|
|
110
|
+
*/
|
|
111
|
+
license?: string | null;
|
|
101
112
|
}
|
|
102
113
|
/**
|
|
103
114
|
* SMI-2760: Compatibility filter for search
|
|
@@ -130,6 +141,19 @@ export interface SearchResponse {
|
|
|
130
141
|
total: number;
|
|
131
142
|
query: string;
|
|
132
143
|
filters: SearchFilters;
|
|
144
|
+
/**
|
|
145
|
+
* SMI-5178: results on this page hidden by the compatibility filter — the
|
|
146
|
+
* restrictive cross-tool default (explicit SKILLSMITH_CLIENT) or an explicit
|
|
147
|
+
* `compatible_with`. 0 / absent when no compat filter applied. `[]`/unknown
|
|
148
|
+
* rows are never hidden (they always surface).
|
|
149
|
+
*/
|
|
150
|
+
compatibilityHidden?: number;
|
|
151
|
+
/**
|
|
152
|
+
* SMI-5178: results on this page hidden by the default-ON installable filter.
|
|
153
|
+
* Present when discovery-only entries were filtered out. Pass
|
|
154
|
+
* `installable_only: false` to include them.
|
|
155
|
+
*/
|
|
156
|
+
discoveryOnlyHidden?: number;
|
|
133
157
|
timing: {
|
|
134
158
|
searchMs: number;
|
|
135
159
|
totalMs: number;
|
package/dist/src/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/src/types.js
CHANGED
|
@@ -5,11 +5,13 @@
|
|
|
5
5
|
* Trust tier descriptions for user display
|
|
6
6
|
*/
|
|
7
7
|
export const TrustTierDescriptions = {
|
|
8
|
+
official: 'Official or partner skill with full security review. Maintained by Skillsmith or verified partners.',
|
|
8
9
|
verified: 'Manually reviewed by the Skillsmith team. High quality and safe to use.',
|
|
10
|
+
curated: 'Third-party publisher. Manually opted into the registry.',
|
|
9
11
|
community: 'Highly rated by the community. Generally reliable.',
|
|
10
12
|
experimental: 'New or beta skill. Use with caution.',
|
|
11
|
-
curated: 'Third-party publisher. Manually opted into the registry.',
|
|
12
13
|
unknown: 'Not yet assessed. Review carefully before using.',
|
|
14
|
+
unverified: 'No verification performed. Review carefully before installing.',
|
|
13
15
|
local: 'Local skill from your ~/.claude/skills/ directory. You control this skill.',
|
|
14
16
|
};
|
|
15
17
|
//# sourceMappingURL=types.js.map
|
package/dist/src/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAmBH;;GAEG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAA8B;IAC9D,QAAQ,EACN,qGAAqG;IACvG,QAAQ,EAAE,yEAAyE;IACnF,OAAO,EAAE,0DAA0D;IACnE,SAAS,EAAE,oDAAoD;IAC/D,YAAY,EAAE,sCAAsC;IACpD,OAAO,EAAE,kDAAkD;IAC3D,UAAU,EAAE,gEAAgE;IAC5E,KAAK,EAAE,4EAA4E;CACpF,CAAA"}
|
|
@@ -125,7 +125,7 @@ describe('GitHubIndexer — edge cases', () => {
|
|
|
125
125
|
// repositoryToSkill — trust tier assignment
|
|
126
126
|
// -------------------------------------------------------------------------
|
|
127
127
|
describe('repositoryToSkill', () => {
|
|
128
|
-
it('assigns
|
|
128
|
+
it('assigns official tier when claude-code-official topic present', () => {
|
|
129
129
|
const indexer = new GitHubIndexer({ requestDelay: 0 });
|
|
130
130
|
const repo = {
|
|
131
131
|
owner: 'anthropic',
|
|
@@ -140,7 +140,7 @@ describe('GitHubIndexer — edge cases', () => {
|
|
|
140
140
|
defaultBranch: 'main',
|
|
141
141
|
};
|
|
142
142
|
const skill = indexer.repositoryToSkill(repo);
|
|
143
|
-
expect(skill.trustTier).toBe('
|
|
143
|
+
expect(skill.trustTier).toBe('official');
|
|
144
144
|
});
|
|
145
145
|
it('assigns community tier for repos with >= 50 stars', () => {
|
|
146
146
|
const indexer = new GitHubIndexer({ requestDelay: 0 });
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-628 / SMI-5205: IndexerRepository and GitHubIndexer Integration Tests
|
|
3
|
+
*
|
|
4
|
+
* Split from GitHubIndexer.test.ts to satisfy 500-line gate.
|
|
5
|
+
* Tests for:
|
|
6
|
+
* - IndexerRepository: Database operations
|
|
7
|
+
* - GitHubIndexer Integration: live search (requires GITHUB_TOKEN)
|
|
8
|
+
*/
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=GitHubIndexer.repository.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GitHubIndexer.repository.test.d.ts","sourceRoot":"","sources":["../../tests/GitHubIndexer.repository.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
|