@skillsmith/core 0.8.0 → 0.8.2
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 +14 -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/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 +61 -0
- package/dist/src/provenance/SourceRecoveryService.d.ts.map +1 -0
- package/dist/src/provenance/SourceRecoveryService.js +209 -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 +13 -0
- package/dist/src/provenance/index.d.ts.map +1 -0
- package/dist/src/provenance/index.js +13 -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/name-variants.d.ts +32 -0
- package/dist/src/provenance/name-variants.d.ts.map +1 -0
- package/dist/src/provenance/name-variants.js +59 -0
- package/dist/src/provenance/name-variants.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 +98 -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/wrap.d.ts +1 -1
- package/dist/src/telemetry/wrap.d.ts.map +1 -1
- package/dist/src/telemetry/wrap.js.map +1 -1
- 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/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 +205 -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 +296 -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/name-variants.test.d.ts +2 -0
- package/dist/tests/provenance/name-variants.test.d.ts.map +1 -0
- package/dist/tests/provenance/name-variants.test.js +51 -0
- package/dist/tests/provenance/name-variants.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 +19 -8
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Validation and ID-parsing helpers for SkillInstallationService
|
|
3
|
+
* @module @skillsmith/core/services/skill-installation.validate
|
|
4
|
+
* @see SMI-4745: domain-driven split to stay under the 500-line CI gate
|
|
5
|
+
*/
|
|
6
|
+
import { parseRepoUrl } from '../utils/github-url.js';
|
|
7
|
+
import { validateSkillConfig } from './skill-config-schema.js';
|
|
8
|
+
import { buildInstallFailure } from './skill-installation.errors.js';
|
|
9
|
+
export function parseSkillIdInternal(input) {
|
|
10
|
+
if (input.startsWith('https://github.com/')) {
|
|
11
|
+
const url = new URL(input);
|
|
12
|
+
const parts = url.pathname.split('/').filter(Boolean);
|
|
13
|
+
return {
|
|
14
|
+
owner: parts[0],
|
|
15
|
+
repo: parts[1],
|
|
16
|
+
path: parts.slice(2).join('/') || '',
|
|
17
|
+
isRegistryId: false,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
if (input.includes('/')) {
|
|
21
|
+
const parts = input.split('/');
|
|
22
|
+
if (parts.length === 2) {
|
|
23
|
+
return { owner: parts[0], repo: parts[1], path: '', isRegistryId: true };
|
|
24
|
+
}
|
|
25
|
+
return {
|
|
26
|
+
owner: parts[0],
|
|
27
|
+
repo: parts[1],
|
|
28
|
+
path: parts.slice(2).join('/'),
|
|
29
|
+
isRegistryId: false,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
const UUID_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
33
|
+
if (UUID_REGEX.test(input)) {
|
|
34
|
+
return { owner: '', repo: '', path: '', isRegistryId: true };
|
|
35
|
+
}
|
|
36
|
+
throw new Error('Invalid skill ID format: ' + input + '. Use owner/repo or GitHub URL.');
|
|
37
|
+
}
|
|
38
|
+
export function validateSkillMd(content) {
|
|
39
|
+
const errors = [];
|
|
40
|
+
if (!content.includes('# ')) {
|
|
41
|
+
errors.push('Missing title (# heading)');
|
|
42
|
+
}
|
|
43
|
+
if (content.length < 100) {
|
|
44
|
+
errors.push('SKILL.md is too short (minimum 100 characters)');
|
|
45
|
+
}
|
|
46
|
+
return { valid: errors.length === 0, errors };
|
|
47
|
+
}
|
|
48
|
+
/** SMI-3870: Validate config.json content; returns validity and warnings. */
|
|
49
|
+
export function validateOptionalConfig(content) {
|
|
50
|
+
const result = validateSkillConfig(content);
|
|
51
|
+
if (!result.valid) {
|
|
52
|
+
return { valid: false, warnings: ['config.json rejected: ' + result.errors.join('; ')] };
|
|
53
|
+
}
|
|
54
|
+
return { valid: true, warnings: result.warnings };
|
|
55
|
+
}
|
|
56
|
+
/** SMI-3871: Cross-reference dependency targets against quarantine status. */
|
|
57
|
+
export function checkDepsAgainstQuarantine(depIntel, getStatus) {
|
|
58
|
+
const warnings = [];
|
|
59
|
+
const quarantinedDeps = [];
|
|
60
|
+
const checked = new Set();
|
|
61
|
+
const check = (target) => {
|
|
62
|
+
if (checked.has(target))
|
|
63
|
+
return;
|
|
64
|
+
checked.add(target);
|
|
65
|
+
const status = getStatus(target);
|
|
66
|
+
if (!status)
|
|
67
|
+
return;
|
|
68
|
+
quarantinedDeps.push(target);
|
|
69
|
+
const label = status === 'pending'
|
|
70
|
+
? 'under review for security concerns'
|
|
71
|
+
: 'quarantined (confirmed malicious)';
|
|
72
|
+
warnings.push('Dependency "' + target + '" is ' + label + '.');
|
|
73
|
+
};
|
|
74
|
+
for (const server of depIntel.dep_inferred_servers)
|
|
75
|
+
check(server);
|
|
76
|
+
if (depIntel.dep_declared?.platform?.mcp_servers) {
|
|
77
|
+
for (const srv of depIntel.dep_declared.platform.mcp_servers)
|
|
78
|
+
check(srv.name);
|
|
79
|
+
}
|
|
80
|
+
return { warnings, quarantinedDeps };
|
|
81
|
+
}
|
|
82
|
+
export async function resolveRegistryInstall(skillId, lookup) {
|
|
83
|
+
const registrySkill = await lookup.lookup(skillId);
|
|
84
|
+
if (!registrySkill) {
|
|
85
|
+
return {
|
|
86
|
+
resolved: false,
|
|
87
|
+
failure: buildInstallFailure('REGISTRY_SKILL_NOT_FOUND', {
|
|
88
|
+
skillId,
|
|
89
|
+
installPath: '',
|
|
90
|
+
error: 'Skill "' +
|
|
91
|
+
skillId +
|
|
92
|
+
'" is indexed for discovery only. ' +
|
|
93
|
+
'No installation source available (repo_url is missing). ' +
|
|
94
|
+
'This may be placeholder/seed data or a metadata-only entry.',
|
|
95
|
+
tips: [
|
|
96
|
+
'Use a full GitHub URL instead: install { skillId: "https://github.com/owner/repo" }',
|
|
97
|
+
'Search for installable skills using the search tool',
|
|
98
|
+
'Many indexed skills are metadata-only and cannot be installed directly',
|
|
99
|
+
],
|
|
100
|
+
}),
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
if (registrySkill.quarantined) {
|
|
104
|
+
return {
|
|
105
|
+
resolved: false,
|
|
106
|
+
failure: buildInstallFailure('QUARANTINED', {
|
|
107
|
+
skillId,
|
|
108
|
+
installPath: '',
|
|
109
|
+
trustTier: registrySkill.trustTier,
|
|
110
|
+
error: 'Skill "' +
|
|
111
|
+
skillId +
|
|
112
|
+
'" has been quarantined due to security concerns. ' +
|
|
113
|
+
'Installation is blocked to protect your environment.',
|
|
114
|
+
tips: [
|
|
115
|
+
'Visit https://skillsmith.app/docs/quarantine for details on quarantine policies',
|
|
116
|
+
'If you believe this is a false positive, contact support via https://skillsmith.app/contact?topic=security',
|
|
117
|
+
'Contact the skill author or visit the quarantine documentation for more information',
|
|
118
|
+
],
|
|
119
|
+
}),
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
const repoInfo = parseRepoUrl(registrySkill.repoUrl);
|
|
123
|
+
return {
|
|
124
|
+
resolved: true,
|
|
125
|
+
owner: repoInfo.owner,
|
|
126
|
+
repo: repoInfo.repo,
|
|
127
|
+
basePath: repoInfo.path ? repoInfo.path + '/' : '',
|
|
128
|
+
branch: repoInfo.branch,
|
|
129
|
+
skillName: registrySkill.name,
|
|
130
|
+
trustTier: registrySkill.trustTier,
|
|
131
|
+
indexedContentHash: registrySkill.contentHash,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=skill-installation.validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-installation.validate.js","sourceRoot":"","sources":["../../../src/services/skill-installation.validate.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAO9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAA;AASpE,MAAM,UAAU,oBAAoB,CAAC,KAAa;IAChD,IAAI,KAAK,CAAC,UAAU,CAAC,qBAAqB,CAAC,EAAE,CAAC;QAC5C,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAA;QAC1B,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QACrD,OAAO;YACL,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;YACf,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;YACd,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE;YACpC,YAAY,EAAE,KAAK;SACpB,CAAA;IACH,CAAC;IAED,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QAC9B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAA;QAC1E,CAAC;QACD,OAAO;YACL,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;YACf,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;YACd,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;YAC9B,YAAY,EAAE,KAAK;SACpB,CAAA;IACH,CAAC;IAED,MAAM,UAAU,GAAG,iEAAiE,CAAA;IACpF,IAAI,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAA;IAC9D,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,2BAA2B,GAAG,KAAK,GAAG,iCAAiC,CAAC,CAAA;AAC1F,CAAC;AAMD,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,MAAM,MAAM,GAAa,EAAE,CAAA;IAC3B,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5B,MAAM,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAA;IAC1C,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;QACzB,MAAM,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAA;IAC/D,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;AAC/C,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,sBAAsB,CAAC,OAAe;IAIpD,MAAM,MAAM,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAA;IAC3C,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAClB,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,wBAAwB,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAA;IAC1F,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAA;AACnD,CAAC;AACD,8EAA8E;AAC9E,MAAM,UAAU,0BAA0B,CACxC,QAAwB,EACxB,SAAuD;IAEvD,MAAM,QAAQ,GAAa,EAAE,CAAA;IAC7B,MAAM,eAAe,GAAa,EAAE,CAAA;IACpC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAA;IACjC,MAAM,KAAK,GAAG,CAAC,MAAc,EAAQ,EAAE;QACrC,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;YAAE,OAAM;QAC/B,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QACnB,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,CAAA;QAChC,IAAI,CAAC,MAAM;YAAE,OAAM;QACnB,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QAC5B,MAAM,KAAK,GACT,MAAM,KAAK,SAAS;YAClB,CAAC,CAAC,oCAAoC;YACtC,CAAC,CAAC,mCAAmC,CAAA;QACzC,QAAQ,CAAC,IAAI,CAAC,cAAc,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,GAAG,GAAG,CAAC,CAAA;IAChE,CAAC,CAAA;IACD,KAAK,MAAM,MAAM,IAAI,QAAQ,CAAC,oBAAoB;QAAE,KAAK,CAAC,MAAM,CAAC,CAAA;IACjE,IAAI,QAAQ,CAAC,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;QACjD,KAAK,MAAM,GAAG,IAAI,QAAQ,CAAC,YAAY,CAAC,QAAQ,CAAC,WAAW;YAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IAC/E,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,CAAA;AACtC,CAAC;AAeD,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,OAAe,EACf,MAAsB;IAEtB,MAAM,aAAa,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IAClD,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,OAAO;YACL,QAAQ,EAAE,KAAK;YACf,OAAO,EAAE,mBAAmB,CAAC,0BAA0B,EAAE;gBACvD,OAAO;gBACP,WAAW,EAAE,EAAE;gBACf,KAAK,EACH,SAAS;oBACT,OAAO;oBACP,mCAAmC;oBACnC,0DAA0D;oBAC1D,6DAA6D;gBAC/D,IAAI,EAAE;oBACJ,qFAAqF;oBACrF,qDAAqD;oBACrD,wEAAwE;iBACzE;aACF,CAAC;SACH,CAAA;IACH,CAAC;IACD,IAAI,aAAa,CAAC,WAAW,EAAE,CAAC;QAC9B,OAAO;YACL,QAAQ,EAAE,KAAK;YACf,OAAO,EAAE,mBAAmB,CAAC,aAAa,EAAE;gBAC1C,OAAO;gBACP,WAAW,EAAE,EAAE;gBACf,SAAS,EAAE,aAAa,CAAC,SAAS;gBAClC,KAAK,EACH,SAAS;oBACT,OAAO;oBACP,mDAAmD;oBACnD,sDAAsD;gBACxD,IAAI,EAAE;oBACJ,iFAAiF;oBACjF,4GAA4G;oBAC5G,qFAAqF;iBACtF;aACF,CAAC;SACH,CAAA;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,YAAY,CAAC,aAAa,CAAC,OAAO,CAAC,CAAA;IACpD,OAAO;QACL,QAAQ,EAAE,IAAI;QACd,KAAK,EAAE,QAAQ,CAAC,KAAK;QACrB,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE;QAClD,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,SAAS,EAAE,aAAa,CAAC,IAAI;QAC7B,SAAS,EAAE,aAAa,CAAC,SAAS;QAClC,kBAAkB,EAAE,aAAa,CAAC,WAAW;KAC9C,CAAA;AACH,CAAC"}
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* mutation) so arrow-const exports can be wrapped without mutation.
|
|
11
11
|
* Applied review change H4: `framework` is captured per-call, not memoised.
|
|
12
12
|
*/
|
|
13
|
-
type AnyFunction = (...args:
|
|
13
|
+
type AnyFunction = (...args: never[]) => unknown;
|
|
14
14
|
/**
|
|
15
15
|
* Install (or clear) the per-process emission gate.
|
|
16
16
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wrap.d.ts","sourceRoot":"","sources":["../../../src/telemetry/wrap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;
|
|
1
|
+
{"version":3,"file":"wrap.d.ts","sourceRoot":"","sources":["../../../src/telemetry/wrap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAWH,KAAK,WAAW,GAAG,CAAC,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,OAAO,CAAA;AAyBhD;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,CAAC,MAAM,OAAO,CAAC,GAAG,SAAS,GAAG,IAAI,CAEvE;AAMD;;;;;;GAMG;AAMH,MAAM,WAAW,iBAAiB,CAAC,KAAK,SAAS,SAAS,OAAO,EAAE;IACjE,8EAA8E;IAC9E,MAAM,EAAE,UAAU,GAAG,KAAK,GAAG,kBAAkB,CAAA;IAC/C,qEAAqE;IACrE,cAAc,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,MAAM,CAAA;IACvC;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,MAAM,CAAA;CAC3C;AAMD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,aAAa,CAAC,KAAK,SAAS,SAAS,OAAO,EAAE,EAAE,OAAO,EACrE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,EACvD,IAAI,EAAE,iBAAiB,CAAC,KAAK,CAAC,GAC7B,CAAC,GAAG,IAAI,EAAE,KAAK,KAAK,OAAO,CAAC,OAAO,CAAC,CAoCtC;AAMD;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,WAAW,GAAG,OAAO,CAEtD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wrap.js","sourceRoot":"","sources":["../../../src/telemetry/wrap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"wrap.js","sourceRoot":"","sources":["../../../src/telemetry/wrap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAW/C,MAAM,OAAO,GAAG,IAAI,GAAG,EAAe,CAAA;AAEtC,8EAA8E;AAC9E,mCAAmC;AACnC,8EAA8E;AAC9E,EAAE;AACF,+EAA+E;AAC/E,0EAA0E;AAC1E,4EAA4E;AAC5E,gEAAgE;AAChE,EAAE;AACF,yEAAyE;AACzE,yEAAyE;AACzE,2EAA2E;AAC3E,0EAA0E;AAC1E,oDAAoD;AACpD,EAAE;AACF,2EAA2E;AAC3E,uEAAuE;AACvE,0EAA0E;AAC1E,4CAA4C;AAC5C,IAAI,YAAyC,CAAA;AAE7C;;;;;;;;;;GAUG;AACH,MAAM,UAAU,eAAe,CAAC,IAAiC;IAC/D,YAAY,GAAG,IAAI,CAAA;AACrB,CAAC;AA+BD,8EAA8E;AAC9E,MAAM;AACN,8EAA8E;AAE9E;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,aAAa,CAC3B,OAAuD,EACvD,IAA8B;IAE9B,MAAM,SAAS,GAAG,KAAK,EAAE,GAAG,IAAW,EAAoB,EAAE;QAC3D,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QACxB,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAA;QACzC,2EAA2E;QAC3E,gEAAgE;QAChE,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC,IAAI,CAAC,IAAI,SAAS,CAAA;QAC5D,IAAI,OAAO,GAAG,IAAI,CAAA;QAClB,IAAI,CAAC;YACH,OAAO,MAAM,OAAO,CAAC,GAAG,IAAI,CAAC,CAAA;QAC/B,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,GAAG,KAAK,CAAA;YACf,MAAM,CAAC,CAAA;QACT,CAAC;gBAAS,CAAC;YACT,yEAAyE;YACzE,4DAA4D;YAC5D,IAAI,CAAC;gBACH,qEAAqE;gBACrE,qEAAqE;gBACrE,IAAI,YAAY,IAAI,YAAY,EAAE,EAAE,CAAC;oBACnC,gBAAgB,CAAC;wBACf,OAAO;wBACP,MAAM,EAAE,IAAI,CAAC,MAAM;wBACnB,SAAS;wBACT,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;wBAC9B,OAAO;qBACR,CAAC,CAAA;gBACJ,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,kEAAkE;YACpE,CAAC;QACH,CAAC;IACH,CAAC,CAAA;IAED,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;IACtB,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,8EAA8E;AAC9E,oBAAoB;AACpB,8EAA8E;AAE9E;;;;;;;;GAQG;AACH,MAAM,UAAU,aAAa,CAAC,EAAe;IAC3C,OAAO,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;AACxB,CAAC"}
|
|
@@ -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"}
|
|
@@ -0,0 +1,190 @@
|
|
|
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
|
+
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
10
|
+
import { GitHubIndexer } from '../src/indexer/GitHubIndexer.js';
|
|
11
|
+
import { IndexerRepository } from '../src/repositories/IndexerRepository.js';
|
|
12
|
+
import { createDatabase, closeDatabase } from '../src/db/schema.js';
|
|
13
|
+
// ============================================================
|
|
14
|
+
// IndexerRepository Tests
|
|
15
|
+
// ============================================================
|
|
16
|
+
describe('IndexerRepository', () => {
|
|
17
|
+
let db;
|
|
18
|
+
let repository;
|
|
19
|
+
beforeEach(() => {
|
|
20
|
+
db = createDatabase(':memory:');
|
|
21
|
+
repository = new IndexerRepository(db);
|
|
22
|
+
});
|
|
23
|
+
afterEach(() => {
|
|
24
|
+
closeDatabase(db);
|
|
25
|
+
});
|
|
26
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
27
|
+
const createTestMetadata = (overrides = {}) => ({
|
|
28
|
+
name: 'test-skill',
|
|
29
|
+
description: 'A test skill',
|
|
30
|
+
author: 'test-author',
|
|
31
|
+
version: '1.0.0',
|
|
32
|
+
tags: ['test', 'example'],
|
|
33
|
+
dependencies: undefined,
|
|
34
|
+
category: 'testing',
|
|
35
|
+
license: 'MIT',
|
|
36
|
+
repository: null,
|
|
37
|
+
rawContent: '---\nname: test-skill\n---\nTest content',
|
|
38
|
+
frontmatter: { name: 'test-skill' },
|
|
39
|
+
repoUrl: 'https://github.com/test/repo',
|
|
40
|
+
filePath: 'SKILL.md',
|
|
41
|
+
sha: 'abc123def456',
|
|
42
|
+
owner: 'test',
|
|
43
|
+
repo: 'repo',
|
|
44
|
+
discoveredAt: new Date().toISOString(),
|
|
45
|
+
...overrides,
|
|
46
|
+
});
|
|
47
|
+
describe('upsertFromMetadata', () => {
|
|
48
|
+
it('should insert a new skill', () => {
|
|
49
|
+
const metadata = createTestMetadata();
|
|
50
|
+
const result = repository.upsertFromMetadata(metadata);
|
|
51
|
+
expect(result.inserted).toBe(true);
|
|
52
|
+
expect(result.contentChanged).toBe(true);
|
|
53
|
+
expect(result.skill.name).toBe('test-skill');
|
|
54
|
+
expect(result.skill.repoUrl).toBe('https://github.com/test/repo');
|
|
55
|
+
expect(result.skill.sourceSha).toBe('abc123def456');
|
|
56
|
+
});
|
|
57
|
+
it('should update an existing skill with changed content', () => {
|
|
58
|
+
const metadata = createTestMetadata();
|
|
59
|
+
repository.upsertFromMetadata(metadata);
|
|
60
|
+
// Update with new SHA (content changed)
|
|
61
|
+
const updatedMetadata = createTestMetadata({
|
|
62
|
+
sha: 'newsha789',
|
|
63
|
+
description: 'Updated description',
|
|
64
|
+
});
|
|
65
|
+
const result = repository.upsertFromMetadata(updatedMetadata);
|
|
66
|
+
expect(result.inserted).toBe(false);
|
|
67
|
+
expect(result.contentChanged).toBe(true);
|
|
68
|
+
expect(result.skill.description).toBe('Updated description');
|
|
69
|
+
expect(result.skill.sourceSha).toBe('newsha789');
|
|
70
|
+
});
|
|
71
|
+
it('should mark unchanged when SHA matches', () => {
|
|
72
|
+
const metadata = createTestMetadata();
|
|
73
|
+
repository.upsertFromMetadata(metadata);
|
|
74
|
+
// Same SHA = no content change
|
|
75
|
+
const result = repository.upsertFromMetadata(metadata);
|
|
76
|
+
expect(result.inserted).toBe(false);
|
|
77
|
+
expect(result.contentChanged).toBe(false);
|
|
78
|
+
});
|
|
79
|
+
it('should apply custom trust tier', () => {
|
|
80
|
+
const metadata = createTestMetadata();
|
|
81
|
+
const result = repository.upsertFromMetadata(metadata, 'verified');
|
|
82
|
+
expect(result.skill.trustTier).toBe('verified');
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
describe('batchUpsertFromMetadata', () => {
|
|
86
|
+
it('should batch insert multiple skills', () => {
|
|
87
|
+
const metadataList = [
|
|
88
|
+
createTestMetadata({ repoUrl: 'https://github.com/a/repo1' }),
|
|
89
|
+
createTestMetadata({ repoUrl: 'https://github.com/b/repo2', name: 'skill-2' }),
|
|
90
|
+
createTestMetadata({ repoUrl: 'https://github.com/c/repo3', name: 'skill-3' }),
|
|
91
|
+
];
|
|
92
|
+
const result = repository.batchUpsertFromMetadata(metadataList);
|
|
93
|
+
expect(result.total).toBe(3);
|
|
94
|
+
expect(result.inserted).toBe(3);
|
|
95
|
+
expect(result.updated).toBe(0);
|
|
96
|
+
expect(result.unchanged).toBe(0);
|
|
97
|
+
expect(result.errors).toHaveLength(0);
|
|
98
|
+
});
|
|
99
|
+
it('should handle mixed insert/update/unchanged', () => {
|
|
100
|
+
// First, insert one skill
|
|
101
|
+
const initial = createTestMetadata({ repoUrl: 'https://github.com/existing/repo' });
|
|
102
|
+
repository.upsertFromMetadata(initial);
|
|
103
|
+
// Batch with: existing unchanged, existing updated, new
|
|
104
|
+
const _metadataList = [
|
|
105
|
+
createTestMetadata({ repoUrl: 'https://github.com/existing/repo' }), // unchanged
|
|
106
|
+
createTestMetadata({
|
|
107
|
+
repoUrl: 'https://github.com/existing/repo',
|
|
108
|
+
sha: 'newsha', // This will match repo_url but update
|
|
109
|
+
}),
|
|
110
|
+
createTestMetadata({ repoUrl: 'https://github.com/new/repo', name: 'new-skill' }), // new
|
|
111
|
+
];
|
|
112
|
+
// Note: Due to unique constraint on repo_url, only one entry per repo_url
|
|
113
|
+
// So we'll test with different repos
|
|
114
|
+
const properList = [
|
|
115
|
+
createTestMetadata({ repoUrl: 'https://github.com/existing/repo' }), // unchanged (same sha)
|
|
116
|
+
createTestMetadata({ repoUrl: 'https://github.com/new/repo', name: 'new-skill' }), // new
|
|
117
|
+
];
|
|
118
|
+
const result = repository.batchUpsertFromMetadata(properList);
|
|
119
|
+
expect(result.total).toBe(2);
|
|
120
|
+
expect(result.unchanged).toBe(1);
|
|
121
|
+
expect(result.inserted).toBe(1);
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
describe('findByRepoUrl', () => {
|
|
125
|
+
it('should find skill by repository URL', () => {
|
|
126
|
+
const metadata = createTestMetadata();
|
|
127
|
+
repository.upsertFromMetadata(metadata);
|
|
128
|
+
const found = repository.findByRepoUrl('https://github.com/test/repo');
|
|
129
|
+
expect(found).not.toBeNull();
|
|
130
|
+
expect(found?.name).toBe('test-skill');
|
|
131
|
+
});
|
|
132
|
+
it('should return null for non-existent URL', () => {
|
|
133
|
+
const found = repository.findByRepoUrl('https://github.com/nonexistent/repo');
|
|
134
|
+
expect(found).toBeNull();
|
|
135
|
+
});
|
|
136
|
+
});
|
|
137
|
+
describe('findBySha', () => {
|
|
138
|
+
it('should find skill by source SHA', () => {
|
|
139
|
+
const metadata = createTestMetadata({ sha: 'unique-sha-123' });
|
|
140
|
+
repository.upsertFromMetadata(metadata);
|
|
141
|
+
const found = repository.findBySha('unique-sha-123');
|
|
142
|
+
expect(found).not.toBeNull();
|
|
143
|
+
expect(found?.sourceSha).toBe('unique-sha-123');
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
describe('findAllIndexed', () => {
|
|
147
|
+
it('should return paginated indexed skills', () => {
|
|
148
|
+
// Insert multiple skills
|
|
149
|
+
for (let i = 0; i < 5; i++) {
|
|
150
|
+
repository.upsertFromMetadata(createTestMetadata({
|
|
151
|
+
repoUrl: `https://github.com/test/repo${i}`,
|
|
152
|
+
name: `skill-${i}`,
|
|
153
|
+
}));
|
|
154
|
+
}
|
|
155
|
+
const page1 = repository.findAllIndexed(2, 0);
|
|
156
|
+
expect(page1).toHaveLength(2);
|
|
157
|
+
const page2 = repository.findAllIndexed(2, 2);
|
|
158
|
+
expect(page2).toHaveLength(2);
|
|
159
|
+
const page3 = repository.findAllIndexed(2, 4);
|
|
160
|
+
expect(page3).toHaveLength(1);
|
|
161
|
+
});
|
|
162
|
+
});
|
|
163
|
+
describe('findNeedingReindex', () => {
|
|
164
|
+
it('should find skills needing reindex', () => {
|
|
165
|
+
// Insert a skill
|
|
166
|
+
repository.upsertFromMetadata(createTestMetadata());
|
|
167
|
+
// All recently indexed skills shouldn't need reindex
|
|
168
|
+
const needing = repository.findNeedingReindex('-1 day', 10);
|
|
169
|
+
// Since we just indexed, it shouldn't need reindex yet
|
|
170
|
+
expect(needing).toHaveLength(0);
|
|
171
|
+
});
|
|
172
|
+
});
|
|
173
|
+
});
|
|
174
|
+
// ============================================================
|
|
175
|
+
// Integration Tests (if GITHUB_TOKEN is available)
|
|
176
|
+
// ============================================================
|
|
177
|
+
describe('GitHubIndexer Integration', () => {
|
|
178
|
+
const hasToken = !!process.env.GITHUB_TOKEN;
|
|
179
|
+
it.skipIf(!hasToken)('should search for claude-code skills on GitHub', async () => {
|
|
180
|
+
const indexer = new GitHubIndexer({
|
|
181
|
+
token: process.env.GITHUB_TOKEN,
|
|
182
|
+
requestDelay: 150,
|
|
183
|
+
});
|
|
184
|
+
const result = await indexer.searchRepositories('topic:claude-code-skill');
|
|
185
|
+
expect(result.found).toBeGreaterThanOrEqual(0);
|
|
186
|
+
expect(result.errors).toHaveLength(0);
|
|
187
|
+
// Note: May or may not find repositories depending on GitHub state
|
|
188
|
+
}, 30000);
|
|
189
|
+
});
|
|
190
|
+
//# sourceMappingURL=GitHubIndexer.repository.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GitHubIndexer.repository.test.js","sourceRoot":"","sources":["../../tests/GitHubIndexer.repository.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,7 +4,8 @@
|
|
|
4
4
|
* Tests for:
|
|
5
5
|
* - SkillParser: YAML frontmatter parsing
|
|
6
6
|
* - GitHubIndexer: Repository skill discovery
|
|
7
|
-
*
|
|
7
|
+
*
|
|
8
|
+
* IndexerRepository and integration tests: GitHubIndexer.repository.test.ts
|
|
8
9
|
*/
|
|
9
10
|
export {};
|
|
10
11
|
//# sourceMappingURL=GitHubIndexer.test.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GitHubIndexer.test.d.ts","sourceRoot":"","sources":["../../tests/GitHubIndexer.test.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"GitHubIndexer.test.d.ts","sourceRoot":"","sources":["../../tests/GitHubIndexer.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
|