@skillsmith/core 0.11.4 → 0.11.5
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 +13 -0
- package/README.md +10 -7
- package/dist/.tsbuildinfo +1 -1
- package/dist/src/api/client.d.ts.map +1 -1
- package/dist/src/api/client.js +15 -5
- package/dist/src/api/client.js.map +1 -1
- package/dist/src/api/client.private-registry.d.ts +80 -0
- package/dist/src/api/client.private-registry.d.ts.map +1 -0
- package/dist/src/api/client.private-registry.js +97 -0
- package/dist/src/api/client.private-registry.js.map +1 -0
- package/dist/src/api/client.private-registry.test.d.ts +9 -0
- package/dist/src/api/client.private-registry.test.d.ts.map +1 -0
- package/dist/src/api/client.private-registry.test.js +127 -0
- package/dist/src/api/client.private-registry.test.js.map +1 -0
- package/dist/src/api/client.toSkill.test.d.ts +25 -0
- package/dist/src/api/client.toSkill.test.d.ts.map +1 -0
- package/dist/src/api/client.toSkill.test.js +97 -0
- package/dist/src/api/client.toSkill.test.js.map +1 -0
- package/dist/src/api/client.token-refresh.d.ts +8 -0
- package/dist/src/api/client.token-refresh.d.ts.map +1 -1
- package/dist/src/api/client.token-refresh.js +26 -0
- package/dist/src/api/client.token-refresh.js.map +1 -1
- package/dist/src/api/client.token-refresh.test.js +82 -0
- package/dist/src/api/client.token-refresh.test.js.map +1 -1
- package/dist/src/api/index.d.ts +2 -0
- package/dist/src/api/index.d.ts.map +1 -1
- package/dist/src/api/index.js +9 -0
- package/dist/src/api/index.js.map +1 -1
- package/dist/src/api/security-summary.d.ts +73 -0
- package/dist/src/api/security-summary.d.ts.map +1 -0
- package/dist/src/api/security-summary.js +88 -0
- package/dist/src/api/security-summary.js.map +1 -0
- package/dist/src/api/security-summary.test.d.ts +9 -0
- package/dist/src/api/security-summary.test.d.ts.map +1 -0
- package/dist/src/api/security-summary.test.js +94 -0
- package/dist/src/api/security-summary.test.js.map +1 -0
- package/dist/src/config/config-atomic-write.d.ts +30 -10
- package/dist/src/config/config-atomic-write.d.ts.map +1 -1
- package/dist/src/config/config-atomic-write.js +33 -80
- package/dist/src/config/config-atomic-write.js.map +1 -1
- package/dist/src/config/config-atomic-write.test.d.ts +8 -0
- package/dist/src/config/config-atomic-write.test.d.ts.map +1 -1
- package/dist/src/config/config-atomic-write.test.js +64 -12
- package/dist/src/config/config-atomic-write.test.js.map +1 -1
- package/dist/src/config/owned-lock.acquire.d.ts +53 -0
- package/dist/src/config/owned-lock.acquire.d.ts.map +1 -0
- package/dist/src/config/owned-lock.acquire.js +140 -0
- package/dist/src/config/owned-lock.acquire.js.map +1 -0
- package/dist/src/config/owned-lock.claim.d.ts +84 -0
- package/dist/src/config/owned-lock.claim.d.ts.map +1 -0
- package/dist/src/config/owned-lock.claim.js +310 -0
- package/dist/src/config/owned-lock.claim.js.map +1 -0
- package/dist/src/config/owned-lock.d.ts +113 -0
- package/dist/src/config/owned-lock.d.ts.map +1 -0
- package/dist/src/config/owned-lock.js +121 -0
- package/dist/src/config/owned-lock.js.map +1 -0
- package/dist/src/config/owned-lock.test.d.ts +12 -0
- package/dist/src/config/owned-lock.test.d.ts.map +1 -0
- package/dist/src/config/owned-lock.test.js +412 -0
- package/dist/src/config/owned-lock.test.js.map +1 -0
- package/dist/src/config/owned-lock.types.d.ts +78 -0
- package/dist/src/config/owned-lock.types.d.ts.map +1 -0
- package/dist/src/config/owned-lock.types.js +30 -0
- package/dist/src/config/owned-lock.types.js.map +1 -0
- package/dist/src/db/createDatabase.d.ts.map +1 -1
- package/dist/src/db/createDatabase.js +19 -7
- package/dist/src/db/createDatabase.js.map +1 -1
- package/dist/src/embeddings/hnsw-store.exports.d.ts +11 -0
- package/dist/src/embeddings/hnsw-store.exports.d.ts.map +1 -0
- package/dist/src/embeddings/hnsw-store.exports.js +10 -0
- package/dist/src/embeddings/hnsw-store.exports.js.map +1 -0
- package/dist/src/embeddings/index.d.ts +1 -2
- package/dist/src/embeddings/index.d.ts.map +1 -1
- package/dist/src/embeddings/index.js +17 -3
- package/dist/src/embeddings/index.js.map +1 -1
- package/dist/src/embeddings/probe.d.ts.map +1 -1
- package/dist/src/embeddings/probe.js +4 -8
- package/dist/src/embeddings/probe.js.map +1 -1
- package/dist/src/exports/services.d.ts +4 -1
- package/dist/src/exports/services.d.ts.map +1 -1
- package/dist/src/exports/services.js +22 -0
- package/dist/src/exports/services.js.map +1 -1
- package/dist/src/index.d.ts +3 -3
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +9 -3
- package/dist/src/index.js.map +1 -1
- package/dist/src/install/index.d.ts +1 -1
- package/dist/src/install/index.d.ts.map +1 -1
- package/dist/src/install/index.js +1 -1
- package/dist/src/install/index.js.map +1 -1
- package/dist/src/install/paths.d.ts +10 -0
- package/dist/src/install/paths.d.ts.map +1 -1
- package/dist/src/install/paths.js +19 -0
- package/dist/src/install/paths.js.map +1 -1
- package/dist/src/security/scanner/multiline-category-closure.test.d.ts +80 -0
- package/dist/src/security/scanner/multiline-category-closure.test.d.ts.map +1 -0
- package/dist/src/security/scanner/multiline-category-closure.test.js +287 -0
- package/dist/src/security/scanner/multiline-category-closure.test.js.map +1 -0
- package/dist/src/services/recommend-guard.d.ts +28 -0
- package/dist/src/services/recommend-guard.d.ts.map +1 -0
- package/dist/src/services/recommend-guard.js +34 -0
- package/dist/src/services/recommend-guard.js.map +1 -0
- package/dist/src/services/recommend-guard.test.d.ts +2 -0
- package/dist/src/services/recommend-guard.test.d.ts.map +1 -0
- package/dist/src/services/recommend-guard.test.js +28 -0
- package/dist/src/services/recommend-guard.test.js.map +1 -0
- package/dist/src/services/skill-installation.content.d.ts +88 -0
- package/dist/src/services/skill-installation.content.d.ts.map +1 -0
- package/dist/src/services/skill-installation.content.js +319 -0
- package/dist/src/services/skill-installation.content.js.map +1 -0
- package/dist/src/services/skill-installation.helpers.d.ts +32 -1
- package/dist/src/services/skill-installation.helpers.d.ts.map +1 -1
- package/dist/src/services/skill-installation.helpers.js +39 -6
- package/dist/src/services/skill-installation.helpers.js.map +1 -1
- package/dist/src/services/skill-installation.helpers.test.js +34 -2
- package/dist/src/services/skill-installation.helpers.test.js.map +1 -1
- package/dist/src/services/skill-installation.io.d.ts.map +1 -1
- package/dist/src/services/skill-installation.io.js +74 -1
- package/dist/src/services/skill-installation.io.js.map +1 -1
- package/dist/src/services/skill-installation.service.d.ts +20 -1
- package/dist/src/services/skill-installation.service.d.ts.map +1 -1
- package/dist/src/services/skill-installation.service.js +26 -4
- package/dist/src/services/skill-installation.service.js.map +1 -1
- package/dist/src/services/skill-installation.types.d.ts +42 -1
- package/dist/src/services/skill-installation.types.d.ts.map +1 -1
- package/dist/src/services/skill-installation.types.js.map +1 -1
- package/dist/src/services/skill-resolution.d.ts +67 -0
- package/dist/src/services/skill-resolution.d.ts.map +1 -0
- package/dist/src/services/skill-resolution.js +67 -0
- package/dist/src/services/skill-resolution.js.map +1 -0
- package/dist/src/services/skill-resolution.test.d.ts +2 -0
- package/dist/src/services/skill-resolution.test.d.ts.map +1 -0
- package/dist/src/services/skill-resolution.test.js +143 -0
- package/dist/src/services/skill-resolution.test.js.map +1 -0
- package/dist/src/utils/index.d.ts +1 -0
- package/dist/src/utils/index.d.ts.map +1 -1
- package/dist/src/utils/index.js +4 -0
- package/dist/src/utils/index.js.map +1 -1
- package/dist/src/utils/quiet-mode.d.ts +21 -0
- package/dist/src/utils/quiet-mode.d.ts.map +1 -0
- package/dist/src/utils/quiet-mode.js +26 -0
- package/dist/src/utils/quiet-mode.js.map +1 -0
- package/dist/tests/EmbeddingService.test.js +58 -1
- package/dist/tests/EmbeddingService.test.js.map +1 -1
- package/dist/tests/SecurityScanner.performance.test.js +5 -2
- package/dist/tests/SecurityScanner.performance.test.js.map +1 -1
- package/dist/tests/db/database-abstraction.test.js +45 -1
- package/dist/tests/db/database-abstraction.test.js.map +1 -1
- package/dist/tests/helpers/deterministic-dead-pid.d.ts +13 -0
- package/dist/tests/helpers/deterministic-dead-pid.d.ts.map +1 -0
- package/dist/tests/helpers/deterministic-dead-pid.js +31 -0
- package/dist/tests/helpers/deterministic-dead-pid.js.map +1 -0
- package/dist/tests/integration/owned-lock-lost-update.test.d.ts +12 -0
- package/dist/tests/integration/owned-lock-lost-update.test.d.ts.map +1 -0
- package/dist/tests/integration/owned-lock-lost-update.test.js +52 -0
- package/dist/tests/integration/owned-lock-lost-update.test.js.map +1 -0
- package/dist/tests/integration/owned-lock-reclaim-race.test.d.ts +19 -0
- package/dist/tests/integration/owned-lock-reclaim-race.test.d.ts.map +1 -0
- package/dist/tests/integration/owned-lock-reclaim-race.test.js +177 -0
- package/dist/tests/integration/owned-lock-reclaim-race.test.js.map +1 -0
- package/dist/tests/unit/services/skill-installation.content.test.d.ts +10 -0
- package/dist/tests/unit/services/skill-installation.content.test.d.ts.map +1 -0
- package/dist/tests/unit/services/skill-installation.content.test.js +290 -0
- package/dist/tests/unit/services/skill-installation.content.test.js.map +1 -0
- package/dist/tests/unit/services/skill-installation.io.symlink.test.d.ts +8 -0
- package/dist/tests/unit/services/skill-installation.io.symlink.test.d.ts.map +1 -0
- package/dist/tests/unit/services/skill-installation.io.symlink.test.js +72 -0
- package/dist/tests/unit/services/skill-installation.io.symlink.test.js.map +1 -0
- package/dist/tests/unit/services/skill-installation.service.error-codes.test.d.ts +15 -0
- package/dist/tests/unit/services/skill-installation.service.error-codes.test.d.ts.map +1 -0
- package/dist/tests/unit/services/skill-installation.service.error-codes.test.js +190 -0
- package/dist/tests/unit/services/skill-installation.service.error-codes.test.js.map +1 -0
- package/dist/tests/unit/services/skill-installation.service.multi-client.test.d.ts +17 -0
- package/dist/tests/unit/services/skill-installation.service.multi-client.test.d.ts.map +1 -0
- package/dist/tests/unit/services/skill-installation.service.multi-client.test.js +126 -0
- package/dist/tests/unit/services/skill-installation.service.multi-client.test.js.map +1 -0
- package/dist/tests/unit/services/skill-installation.service.test.js +7 -112
- package/dist/tests/unit/services/skill-installation.service.test.js.map +1 -1
- package/dist/tests/utils/quiet-mode.test.d.ts +12 -0
- package/dist/tests/utils/quiet-mode.test.d.ts.map +1 -0
- package/dist/tests/utils/quiet-mode.test.js +42 -0
- package/dist/tests/utils/quiet-mode.test.js.map +1 -0
- package/package.json +17 -5
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Content-based skill install path (private registry).
|
|
3
|
+
* @module @skillsmith/core/services/skill-installation.content
|
|
4
|
+
* @see SMI-5905 Wave 1: installFromContent() + resolveFreshAccessToken() extraction
|
|
5
|
+
* @see docs/internal/implementation/private-registry-skill-install.md
|
|
6
|
+
*
|
|
7
|
+
* `install()` (skill-installation.service.ts) only knows how to fetch a
|
|
8
|
+
* skill from GitHub. This module adds a second entry point,
|
|
9
|
+
* `installFromContent()`, for skills whose content has already been resolved
|
|
10
|
+
* elsewhere (a private-registry `content` JSONB column, read via a
|
|
11
|
+
* per-team-member Supabase session or the `private-registry-get` Edge
|
|
12
|
+
* Function — Waves 2/3 wire those transports; this module only needs the
|
|
13
|
+
* already-fetched `{skillId, version, content}` triple).
|
|
14
|
+
*
|
|
15
|
+
* SCOPE TRIM (Sol review #5 — read before extending this function):
|
|
16
|
+
* `installFromContent()` deliberately reuses only two things from the
|
|
17
|
+
* `install()` policy chain:
|
|
18
|
+
* 1. `writeInstallFiles()`'s disk-write + rollback-on-partial-write handling
|
|
19
|
+
* (skill-installation.io.ts), plus this module's own manifest-driven
|
|
20
|
+
* already-installed/force gate (mirrors `install()`'s ALREADY_INSTALLED
|
|
21
|
+
* check).
|
|
22
|
+
* 2. A security scan at the `community` trust tier, via the same
|
|
23
|
+
* `classifyBundledFile()`/`isRejectableScan()` policy `install()` uses
|
|
24
|
+
* for optional bundled files (skill-installation.policy.ts) — applied
|
|
25
|
+
* here to every content-map entry (including "SKILL.md" itself, which
|
|
26
|
+
* falls through to the conservative 'structured' default class since it
|
|
27
|
+
* has no BUNDLED_SCAN_FILES entry).
|
|
28
|
+
*
|
|
29
|
+
* It deliberately does NOT route through the rest of `install()`'s chain:
|
|
30
|
+
* - `skipScan` is NOT an accepted option here. Registry-content installs
|
|
31
|
+
* always scan — there is no opt-out, unlike `install()`'s tier-gated
|
|
32
|
+
* skipScan.
|
|
33
|
+
* - Dependency-intelligence extraction/persistence (extractDepIntel,
|
|
34
|
+
* persistDependencies, checkDepsAgainstQuarantine), risk-history
|
|
35
|
+
* recording, AI-defence feedback, and co-install-session recording are
|
|
36
|
+
* all OUT of v1 scope — a known, intentional gap, not a silent drop.
|
|
37
|
+
* Wave 3's MCP `install` action and Wave 4's CLI command do not get
|
|
38
|
+
* these signals for private-registry installs yet.
|
|
39
|
+
* - Frontmatter/manifest validation on `SKILL.md` itself DOES still run
|
|
40
|
+
* (`validateSkillMd()`), same as any other install.
|
|
41
|
+
*
|
|
42
|
+
* PATH VALIDATION (Sol review #2, critical, confirmed exploitable): every key
|
|
43
|
+
* in `content` is attacker-controlled — any team member with publish access
|
|
44
|
+
* chooses these filenames — and flows into `writeInstallFiles()`'s
|
|
45
|
+
* `path.join(installPath, subSkill.filename)` (skill-installation.io.ts:167)
|
|
46
|
+
* with NO containment check of its own. `path.join('/a/b', '../../etc/passwd')`
|
|
47
|
+
* escapes `installPath` after normalization, so every key is validated here,
|
|
48
|
+
* BEFORE any disk write — see `validateContentKeys()`.
|
|
49
|
+
*/
|
|
50
|
+
import * as path from 'path';
|
|
51
|
+
import { TRUST_TIER_SCANNER_OPTIONS } from './skill-installation.types.js';
|
|
52
|
+
import { SecurityScanner } from '../security/index.js';
|
|
53
|
+
import { classifyBundledFile, extractPackageJsonLifecycleScripts, isRejectableScan, } from './skill-installation.policy.js';
|
|
54
|
+
import { validateSkillMd } from './skill-installation.validate.js';
|
|
55
|
+
import { buildInstallFailure } from './skill-installation.errors.js';
|
|
56
|
+
import { writeInstallFiles } from './skill-installation.io.js';
|
|
57
|
+
import { applyOptimization, generateTips, hashContent, manifestKeyFor, sanitizeInstallError, } from './skill-installation.helpers.js';
|
|
58
|
+
/** SMI-5905: content-based installs always scan at this trust tier — no skipScan opt-out. */
|
|
59
|
+
const CONTENT_INSTALL_TRUST_TIER = 'community';
|
|
60
|
+
/** Byte used to detect NUL-byte injection in a content-map key. */
|
|
61
|
+
const NUL_BYTE = '\x00';
|
|
62
|
+
/**
|
|
63
|
+
* Classify why a single content-map key is unsafe to use as a relative
|
|
64
|
+
* install-path filename, or return null when it's safe.
|
|
65
|
+
*
|
|
66
|
+
* Each check below is independently sufficient to reject the key — order
|
|
67
|
+
* only affects which reason surfaces first in the error message.
|
|
68
|
+
*/
|
|
69
|
+
function unsafeContentKeyReason(key) {
|
|
70
|
+
if (key.length === 0 || key === '.')
|
|
71
|
+
return 'is empty or a bare "." path';
|
|
72
|
+
if (key.includes(NUL_BYTE))
|
|
73
|
+
return 'contains a NUL byte';
|
|
74
|
+
if (key.includes('\\'))
|
|
75
|
+
return 'contains a backslash';
|
|
76
|
+
// path.win32.isAbsolute() recognizes drive-letter ("C:\\foo") and UNC
|
|
77
|
+
// ("\\\\server\\share") forms regardless of the host platform; POSIX-style
|
|
78
|
+
// absolute paths are covered by path.posix.isAbsolute().
|
|
79
|
+
if (path.posix.isAbsolute(key) || path.win32.isAbsolute(key))
|
|
80
|
+
return 'is an absolute path';
|
|
81
|
+
const segments = key.split('/');
|
|
82
|
+
if (segments.some((seg) => seg === '..'))
|
|
83
|
+
return 'contains a ".." path segment';
|
|
84
|
+
if (segments[0] === '.git')
|
|
85
|
+
return 'targets the .git directory';
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Validate every key in a content map before any disk write.
|
|
90
|
+
*
|
|
91
|
+
* Rejects (as a single combined error, first offense wins):
|
|
92
|
+
* - path-traversal (`..` segment), absolute paths (posix or win32/UNC),
|
|
93
|
+
* NUL bytes, backslashes, empty/bare-"."/".git"-adjacent keys;
|
|
94
|
+
* - any key that, after `path.resolve()` against `installPath`, resolves
|
|
95
|
+
* outside `installPath` (a lexical backstop behind the checks above,
|
|
96
|
+
* matching `writeInstallFiles()`'s own lexical escape check);
|
|
97
|
+
* - two keys that `path.normalize()` to the same on-disk path (a
|
|
98
|
+
* collision — e.g. "SKILL.md" and "./SKILL.md").
|
|
99
|
+
*/
|
|
100
|
+
export function validateContentKeys(content, installPath) {
|
|
101
|
+
const resolvedInstall = path.resolve(installPath);
|
|
102
|
+
const seenByNormalizedPath = new Map();
|
|
103
|
+
for (const key of Object.keys(content)) {
|
|
104
|
+
const reason = unsafeContentKeyReason(key);
|
|
105
|
+
if (reason) {
|
|
106
|
+
return { valid: false, error: `Rejected content key "${key}": ${reason}.` };
|
|
107
|
+
}
|
|
108
|
+
const resolved = path.resolve(installPath, key);
|
|
109
|
+
if (resolved !== resolvedInstall && !resolved.startsWith(resolvedInstall + path.sep)) {
|
|
110
|
+
return {
|
|
111
|
+
valid: false,
|
|
112
|
+
error: `Rejected content key "${key}": resolves outside the install directory.`,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
const normalized = path.normalize(key);
|
|
116
|
+
const priorKey = seenByNormalizedPath.get(normalized);
|
|
117
|
+
if (priorKey !== undefined) {
|
|
118
|
+
return {
|
|
119
|
+
valid: false,
|
|
120
|
+
error: `Rejected content keys "${priorKey}" and "${key}": both normalize to the ` +
|
|
121
|
+
'same on-disk path.',
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
seenByNormalizedPath.set(normalized, key);
|
|
125
|
+
}
|
|
126
|
+
return { valid: true };
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Scan every content-map entry at the `community` trust tier, reusing the
|
|
130
|
+
* exact per-file classification/rejection policy `install()` applies to
|
|
131
|
+
* optional bundled files (skill-installation.policy.ts) — unchanged.
|
|
132
|
+
*
|
|
133
|
+
* "SKILL.md" has no BUNDLED_SCAN_FILES entry, so it falls through to the
|
|
134
|
+
* conservative 'structured' default class (hard-reject on failure), which is
|
|
135
|
+
* the correct posture for a team member's own untrusted main content.
|
|
136
|
+
*
|
|
137
|
+
* Returns the first rejecting file's report, or null if every file passed
|
|
138
|
+
* (or was a 'doc'-class file whose scan failure is a documented FP-control
|
|
139
|
+
* skip — see isRejectableScan()'s doc comment).
|
|
140
|
+
*/
|
|
141
|
+
function scanContentFiles(content, skillId) {
|
|
142
|
+
const scanner = new SecurityScanner(TRUST_TIER_SCANNER_OPTIONS[CONTENT_INSTALL_TRUST_TIER]);
|
|
143
|
+
for (const [filename, text] of Object.entries(content)) {
|
|
144
|
+
const fileClass = classifyBundledFile(filename);
|
|
145
|
+
let textToScan = text;
|
|
146
|
+
if (fileClass === 'package-json') {
|
|
147
|
+
const lifecycle = extractPackageJsonLifecycleScripts(text);
|
|
148
|
+
textToScan = lifecycle.length > 0 ? lifecycle : null;
|
|
149
|
+
}
|
|
150
|
+
if (textToScan === null)
|
|
151
|
+
continue;
|
|
152
|
+
const report = scanner.scan(skillId + '/' + filename, textToScan);
|
|
153
|
+
if (isRejectableScan(report)) {
|
|
154
|
+
if (fileClass === 'doc')
|
|
155
|
+
continue; // H6 FP control — same as fetchAndScanOptionalFiles
|
|
156
|
+
return { file: filename, report };
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return null;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Derive the on-disk skill name from an `author/name`-format skillId, or `null` if any
|
|
163
|
+
* `/`-separated segment is unsafe as a path component.
|
|
164
|
+
*
|
|
165
|
+
* Sol final-code-review finding #1 (confirmed exploitable): callers upstream (the MCP/CLI/Edge
|
|
166
|
+
* Function skillId validators, and the `private_registry_skills.skill_id` DB CHECK itself) all
|
|
167
|
+
* share the same permissive `/^[^/]+\/[^/]+$/` format check, which accepts "." and ".." as
|
|
168
|
+
* either segment — "myteam/.." passes it. Without this check, `path.join(skillsDir, '..')`
|
|
169
|
+
* collapses the install path to skillsDir's PARENT, and `writeInstallFiles()` would happily
|
|
170
|
+
* write "SKILL.md" there. This is the actual disk-write boundary and the last line of defense
|
|
171
|
+
* regardless of what any upstream schema/DB-constraint layer allows — a schema-only fix would
|
|
172
|
+
* not protect a stub/test call site (or a future caller) that bypasses Zod entirely.
|
|
173
|
+
*/
|
|
174
|
+
function skillNameFromSkillId(skillId) {
|
|
175
|
+
const parts = skillId.split('/');
|
|
176
|
+
const name = parts.length >= 2 ? parts[parts.length - 1] : skillId;
|
|
177
|
+
for (const part of parts) {
|
|
178
|
+
const trimmed = part.trim();
|
|
179
|
+
if (trimmed.length === 0 || trimmed === '.' || trimmed === '..')
|
|
180
|
+
return null;
|
|
181
|
+
}
|
|
182
|
+
return name;
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Install an already-resolved private-registry skill's content to disk.
|
|
186
|
+
*
|
|
187
|
+
* See this file's header doc comment for the full scope trim vs. `install()`.
|
|
188
|
+
*/
|
|
189
|
+
export async function installFromContent(params) {
|
|
190
|
+
const { db, skillsDir, manifest, client, onProgress, skillId, version, content, force = false, } = params;
|
|
191
|
+
const skillName = skillNameFromSkillId(skillId);
|
|
192
|
+
const trustTier = CONTENT_INSTALL_TRUST_TIER;
|
|
193
|
+
if (skillName === null) {
|
|
194
|
+
return buildInstallFailure('INVALID_CONTENT', {
|
|
195
|
+
skillId,
|
|
196
|
+
installPath: skillsDir,
|
|
197
|
+
trustTier,
|
|
198
|
+
error: `Rejected skillId "${skillId}": segments must not be empty, ".", or "..".`,
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
const installPath = path.join(skillsDir, skillName);
|
|
202
|
+
try {
|
|
203
|
+
onProgress('validate', 'Validating package content');
|
|
204
|
+
const skillMdContent = content['SKILL.md'];
|
|
205
|
+
if (typeof skillMdContent !== 'string' || skillMdContent.length === 0) {
|
|
206
|
+
return buildInstallFailure('INVALID_CONTENT', {
|
|
207
|
+
skillId,
|
|
208
|
+
installPath,
|
|
209
|
+
trustTier,
|
|
210
|
+
error: 'Package content must include a non-empty "SKILL.md" entry.',
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
// Critical (Sol review #2): every content-map key is attacker-controlled.
|
|
214
|
+
// Must run BEFORE any disk write.
|
|
215
|
+
const keyValidation = validateContentKeys(content, installPath);
|
|
216
|
+
if (!keyValidation.valid) {
|
|
217
|
+
return buildInstallFailure('INVALID_CONTENT', {
|
|
218
|
+
skillId,
|
|
219
|
+
installPath,
|
|
220
|
+
trustTier,
|
|
221
|
+
error: keyValidation.error,
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
const mdValidation = validateSkillMd(skillMdContent);
|
|
225
|
+
if (!mdValidation.valid) {
|
|
226
|
+
return buildInstallFailure('VALIDATION_FAILED', {
|
|
227
|
+
skillId,
|
|
228
|
+
installPath,
|
|
229
|
+
trustTier,
|
|
230
|
+
error: 'Invalid SKILL.md: ' + mdValidation.errors.join(', '),
|
|
231
|
+
tips: [
|
|
232
|
+
'SKILL.md must have YAML frontmatter with name and description fields',
|
|
233
|
+
'Content must be at least 100 characters',
|
|
234
|
+
],
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
onProgress('manifest', 'Checking manifest');
|
|
238
|
+
const manifestData = await manifest.load();
|
|
239
|
+
const manifestKey = manifestKeyFor(skillName, client);
|
|
240
|
+
if (manifestData.installedSkills[manifestKey] && !force) {
|
|
241
|
+
return buildInstallFailure('ALREADY_INSTALLED', {
|
|
242
|
+
skillId,
|
|
243
|
+
installPath,
|
|
244
|
+
trustTier,
|
|
245
|
+
error: 'Skill "' + skillName + '" is already installed. Use force=true to reinstall.',
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
onProgress('scan', 'Running security scan');
|
|
249
|
+
const rejected = scanContentFiles(content, skillId);
|
|
250
|
+
if (rejected) {
|
|
251
|
+
return buildInstallFailure('SCAN_REJECTED', {
|
|
252
|
+
skillId,
|
|
253
|
+
installPath,
|
|
254
|
+
trustTier,
|
|
255
|
+
securityReport: rejected.report,
|
|
256
|
+
error: 'File "' +
|
|
257
|
+
rejected.file +
|
|
258
|
+
'" failed the security scan (risk score ' +
|
|
259
|
+
rejected.report.riskScore +
|
|
260
|
+
'). See https://skillsmith.app/docs/security/scanner',
|
|
261
|
+
tips: [
|
|
262
|
+
'Rejected file: ' + rejected.file,
|
|
263
|
+
'Risk score: ' + rejected.report.riskScore,
|
|
264
|
+
'Security scanner docs: https://skillsmith.app/docs/security/scanner',
|
|
265
|
+
],
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
onProgress('optimize', 'Applying optimization');
|
|
269
|
+
const { finalSkillContent, subSkillFiles, subagentContent, optimizationInfo } = await applyOptimization(db, skillId, skillName, skillMdContent);
|
|
270
|
+
// Team-authored content wins any filename collision with a generated sub-skill.
|
|
271
|
+
const teamAuthoredSubFiles = Object.entries(content)
|
|
272
|
+
.filter(([filename]) => filename !== 'SKILL.md')
|
|
273
|
+
.map(([filename, fileContent]) => ({ filename, content: fileContent }));
|
|
274
|
+
const generatedNoCollision = subSkillFiles.filter((generated) => !teamAuthoredSubFiles.some((team) => team.filename === generated.filename));
|
|
275
|
+
onProgress('write', 'Writing skill files');
|
|
276
|
+
const writeResult = await writeInstallFiles(installPath, skillsDir, skillName, finalSkillContent, [...generatedNoCollision, ...teamAuthoredSubFiles], subagentContent);
|
|
277
|
+
if (writeResult.subagentPath) {
|
|
278
|
+
optimizationInfo.subagentPath = writeResult.subagentPath;
|
|
279
|
+
}
|
|
280
|
+
onProgress('manifest', 'Updating manifest');
|
|
281
|
+
await manifest.updateSafely((currentManifest) => ({
|
|
282
|
+
...currentManifest,
|
|
283
|
+
installedSkills: {
|
|
284
|
+
...currentManifest.installedSkills,
|
|
285
|
+
[manifestKey]: {
|
|
286
|
+
id: skillId,
|
|
287
|
+
name: skillName,
|
|
288
|
+
version,
|
|
289
|
+
// SMI-5905: provenance for content-sourced installs (never a github: URL).
|
|
290
|
+
source: 'private-registry:' + skillId,
|
|
291
|
+
installPath,
|
|
292
|
+
installedAt: new Date().toISOString(),
|
|
293
|
+
lastUpdated: new Date().toISOString(),
|
|
294
|
+
originalContentHash: hashContent(finalSkillContent),
|
|
295
|
+
client,
|
|
296
|
+
},
|
|
297
|
+
},
|
|
298
|
+
}));
|
|
299
|
+
onProgress('done', 'Installation complete');
|
|
300
|
+
const tips = generateTips(skillName, optimizationInfo, client, skillsDir);
|
|
301
|
+
return {
|
|
302
|
+
success: true,
|
|
303
|
+
skillId,
|
|
304
|
+
installPath,
|
|
305
|
+
trustTier,
|
|
306
|
+
optimization: optimizationInfo,
|
|
307
|
+
tips,
|
|
308
|
+
};
|
|
309
|
+
}
|
|
310
|
+
catch (error) {
|
|
311
|
+
return buildInstallFailure('UNKNOWN', {
|
|
312
|
+
skillId,
|
|
313
|
+
installPath,
|
|
314
|
+
trustTier,
|
|
315
|
+
error: sanitizeInstallError(error),
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
//# sourceMappingURL=skill-installation.content.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-installation.content.js","sourceRoot":"","sources":["../../../src/services/skill-installation.content.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,6 +13,7 @@ import type { ScanReport } from '../security/index.js';
|
|
|
13
13
|
import type { DepIntelResult, OptimizationInfo, ProgressCallback, UninstallResult } from './skill-installation.types.js';
|
|
14
14
|
export { fetchFromGitHub } from './skill-installation.io.js';
|
|
15
15
|
import type { ManifestManager } from './skill-manifest.js';
|
|
16
|
+
import { type ClientId } from '../install/paths.js';
|
|
16
17
|
/** Result of applying optimization to a skill's content. */
|
|
17
18
|
export interface OptimizationResult {
|
|
18
19
|
finalSkillContent: string;
|
|
@@ -25,7 +26,15 @@ export interface OptimizationResult {
|
|
|
25
26
|
optimizationInfo: OptimizationInfo;
|
|
26
27
|
}
|
|
27
28
|
export declare function hashContent(content: string): string;
|
|
28
|
-
|
|
29
|
+
/**
|
|
30
|
+
* SMI-5894 (Wave 1 Step 5): `client`/`skillsDir` default to the canonical
|
|
31
|
+
* (Claude Code) client so every existing caller that doesn't pass them
|
|
32
|
+
* (tests, and anywhere the service is constructed without `client`) keeps
|
|
33
|
+
* seeing exactly the previous "Claude Code" / `~/.claude/skills/` wording —
|
|
34
|
+
* only a caller that actually resolved a non-canonical client sees the tips
|
|
35
|
+
* name that client and its real install path.
|
|
36
|
+
*/
|
|
37
|
+
export declare function generateTips(skillName: string, optimizationInfo: OptimizationInfo, client?: ClientId, skillsDir?: string): string[];
|
|
29
38
|
/**
|
|
30
39
|
* Read the MCP server names registered in the consuming project's
|
|
31
40
|
* `.mcp.json` (SMI-5676). Used to cross-check `extractMcpReferences`
|
|
@@ -61,6 +70,25 @@ export declare function extractDepIntel(skillMdContent: string): DepIntelResult;
|
|
|
61
70
|
* value directly.
|
|
62
71
|
*/
|
|
63
72
|
export declare function persistDependencies(repo: SkillDependencyRepository, skillId: string, content: string, declared: DepIntelResult['dep_declared']): number;
|
|
73
|
+
/**
|
|
74
|
+
* SMI-5894 (Wave 1 Step 3): compute the `~/.skillsmith/manifest.json`
|
|
75
|
+
* `installedSkills` key for a given skill name + client.
|
|
76
|
+
*
|
|
77
|
+
* Canonical-client (`claude-code`) entries keep the legacy bare-name key —
|
|
78
|
+
* every manifest reader written before multi-client installs existed
|
|
79
|
+
* (`pin.ts`, `diff.ts`, MCP's `install.conflict.ts`, MCP's `uninstall_skill`
|
|
80
|
+
* `listInstalledSkills()`, none of which are in this wave's scope) indexes
|
|
81
|
+
* `installedSkills[name]` directly and must keep working unmodified for the
|
|
82
|
+
* single-client-install case, which remains the overwhelming majority.
|
|
83
|
+
* Only non-canonical clients get the composite `name::client` key, since
|
|
84
|
+
* those are the ONLY entries that could previously silently collide with
|
|
85
|
+
* (overwrite) a same-named install recorded under a different client —
|
|
86
|
+
* exactly the bug this function exists to close. See the plan doc
|
|
87
|
+
* (docs/internal/implementation/cursor-integration-readiness-cli-mcp-parity.md,
|
|
88
|
+
* Wave 1 Step 3) for the full rationale and the deliberately additive,
|
|
89
|
+
* backward-compatible shape of this fix.
|
|
90
|
+
*/
|
|
91
|
+
export declare function manifestKeyFor(name: string, client: ClientId): string;
|
|
64
92
|
/** Perform skill uninstall with manifest awareness and orphan fallback. */
|
|
65
93
|
export declare function performUninstall(params: {
|
|
66
94
|
skillName: string;
|
|
@@ -69,6 +97,9 @@ export declare function performUninstall(params: {
|
|
|
69
97
|
manifest: ManifestManager;
|
|
70
98
|
skillDependencyRepo: SkillDependencyRepository;
|
|
71
99
|
onProgress: ProgressCallback;
|
|
100
|
+
/** SMI-5894 Wave 1 Step 3: defaults to the canonical client for callers
|
|
101
|
+
* that don't yet resolve a client (preserves pre-existing behavior). */
|
|
102
|
+
client?: ClientId;
|
|
72
103
|
}): Promise<UninstallResult>;
|
|
73
104
|
/**
|
|
74
105
|
* Apply skill optimization via TransformationService.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill-installation.helpers.d.ts","sourceRoot":"","sources":["../../../src/services/skill-installation.helpers.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAUH,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,8CAA8C,CAAA;AAI7F,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAA;AAE3D,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,+CAA+C,CAAA;AAC/F,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,KAAK,EACV,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EAChB,MAAM,+BAA+B,CAAA;AAGtC,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAC5D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;
|
|
1
|
+
{"version":3,"file":"skill-installation.helpers.d.ts","sourceRoot":"","sources":["../../../src/services/skill-installation.helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,14 +16,25 @@ import { TransformationService } from '../services/TransformationService.js';
|
|
|
16
16
|
import { computeQualityScore } from '../scoring/quality-score.js';
|
|
17
17
|
import { checkForModifications } from './skill-installation.io.js';
|
|
18
18
|
export { fetchFromGitHub } from './skill-installation.io.js';
|
|
19
|
+
import { CANONICAL_CLIENT, CLIENT_DISPLAY_LABELS } from '../install/paths.js';
|
|
19
20
|
export function hashContent(content) {
|
|
20
21
|
return createHash('sha256').update(content).digest('hex');
|
|
21
22
|
}
|
|
22
|
-
|
|
23
|
+
/**
|
|
24
|
+
* SMI-5894 (Wave 1 Step 5): `client`/`skillsDir` default to the canonical
|
|
25
|
+
* (Claude Code) client so every existing caller that doesn't pass them
|
|
26
|
+
* (tests, and anywhere the service is constructed without `client`) keeps
|
|
27
|
+
* seeing exactly the previous "Claude Code" / `~/.claude/skills/` wording —
|
|
28
|
+
* only a caller that actually resolved a non-canonical client sees the tips
|
|
29
|
+
* name that client and its real install path.
|
|
30
|
+
*/
|
|
31
|
+
export function generateTips(skillName, optimizationInfo, client = CANONICAL_CLIENT, skillsDir) {
|
|
32
|
+
const clientLabel = CLIENT_DISPLAY_LABELS[client];
|
|
33
|
+
const dir = skillsDir ?? '~/.claude/skills';
|
|
23
34
|
const tips = [
|
|
24
35
|
'Skill "' + skillName + '" installed successfully!',
|
|
25
|
-
'To use this skill, mention it in
|
|
26
|
-
'View installed skills: ls
|
|
36
|
+
'To use this skill, mention it in ' + clientLabel + ': "Use the ' + skillName + ' skill to..."',
|
|
37
|
+
'View installed skills: ls ' + dir + '/',
|
|
27
38
|
];
|
|
28
39
|
if (optimizationInfo.optimized) {
|
|
29
40
|
tips.push('', '[Optimization] Skillsmith Optimization Applied:');
|
|
@@ -132,13 +143,35 @@ export function persistDependencies(repo, skillId, content, declared) {
|
|
|
132
143
|
}
|
|
133
144
|
return rows.length;
|
|
134
145
|
}
|
|
146
|
+
/**
|
|
147
|
+
* SMI-5894 (Wave 1 Step 3): compute the `~/.skillsmith/manifest.json`
|
|
148
|
+
* `installedSkills` key for a given skill name + client.
|
|
149
|
+
*
|
|
150
|
+
* Canonical-client (`claude-code`) entries keep the legacy bare-name key —
|
|
151
|
+
* every manifest reader written before multi-client installs existed
|
|
152
|
+
* (`pin.ts`, `diff.ts`, MCP's `install.conflict.ts`, MCP's `uninstall_skill`
|
|
153
|
+
* `listInstalledSkills()`, none of which are in this wave's scope) indexes
|
|
154
|
+
* `installedSkills[name]` directly and must keep working unmodified for the
|
|
155
|
+
* single-client-install case, which remains the overwhelming majority.
|
|
156
|
+
* Only non-canonical clients get the composite `name::client` key, since
|
|
157
|
+
* those are the ONLY entries that could previously silently collide with
|
|
158
|
+
* (overwrite) a same-named install recorded under a different client —
|
|
159
|
+
* exactly the bug this function exists to close. See the plan doc
|
|
160
|
+
* (docs/internal/implementation/cursor-integration-readiness-cli-mcp-parity.md,
|
|
161
|
+
* Wave 1 Step 3) for the full rationale and the deliberately additive,
|
|
162
|
+
* backward-compatible shape of this fix.
|
|
163
|
+
*/
|
|
164
|
+
export function manifestKeyFor(name, client) {
|
|
165
|
+
return client === CANONICAL_CLIENT ? name : `${name}::${client}`;
|
|
166
|
+
}
|
|
135
167
|
/** Perform skill uninstall with manifest awareness and orphan fallback. */
|
|
136
168
|
export async function performUninstall(params) {
|
|
137
|
-
const { skillName, force, skillsDir, manifest, skillDependencyRepo, onProgress } = params;
|
|
169
|
+
const { skillName, force, skillsDir, manifest, skillDependencyRepo, onProgress, client = CANONICAL_CLIENT, } = params;
|
|
170
|
+
const manifestKey = manifestKeyFor(skillName, client);
|
|
138
171
|
try {
|
|
139
172
|
onProgress('manifest', 'Loading manifest');
|
|
140
173
|
const manifestData = await manifest.load();
|
|
141
|
-
const skillEntry = manifestData.installedSkills[
|
|
174
|
+
const skillEntry = manifestData.installedSkills[manifestKey];
|
|
142
175
|
if (!skillEntry) {
|
|
143
176
|
const potentialPath = path.join(skillsDir, skillName);
|
|
144
177
|
try {
|
|
@@ -197,7 +230,7 @@ export async function performUninstall(params) {
|
|
|
197
230
|
// Table may not exist pre-migration
|
|
198
231
|
}
|
|
199
232
|
onProgress('manifest', 'Updating manifest');
|
|
200
|
-
delete manifestData.installedSkills[
|
|
233
|
+
delete manifestData.installedSkills[manifestKey];
|
|
201
234
|
await manifest.save(manifestData);
|
|
202
235
|
onProgress('done', 'Uninstall complete');
|
|
203
236
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill-installation.helpers.js","sourceRoot":"","sources":["../../../src/services/skill-installation.helpers.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,MAAM,aAAa,CAAA;AACjC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,IAAI,CAAA;AAC7C,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AAEnC,OAAO,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAA;AAC3E,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AAKnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAA;AAE5E,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAA;AAUjE,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAA;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;
|
|
1
|
+
{"version":3,"file":"skill-installation.helpers.js","sourceRoot":"","sources":["../../../src/services/skill-installation.helpers.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,MAAM,aAAa,CAAA;AACjC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,IAAI,CAAA;AAC7C,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AAEnC,OAAO,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAA;AAC3E,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AAKnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAA;AAE5E,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAA;AAUjE,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAA;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAE5D,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAiB,MAAM,qBAAqB,CAAA;AAW5F,MAAM,UAAU,WAAW,CAAC,OAAe;IACzC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;AAC3D,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAC1B,SAAiB,EACjB,gBAAkC,EAClC,SAAmB,gBAAgB,EACnC,SAAkB;IAElB,MAAM,WAAW,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAA;IACjD,MAAM,GAAG,GAAG,SAAS,IAAI,kBAAkB,CAAA;IAC3C,MAAM,IAAI,GAAG;QACX,SAAS,GAAG,SAAS,GAAG,2BAA2B;QACnD,mCAAmC,GAAG,WAAW,GAAG,aAAa,GAAG,SAAS,GAAG,eAAe;QAC/F,4BAA4B,GAAG,GAAG,GAAG,GAAG;KACzC,CAAA;IAED,IAAI,gBAAgB,CAAC,SAAS,EAAE,CAAC;QAC/B,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,iDAAiD,CAAC,CAAA;QAChE,IAAI,gBAAgB,CAAC,qBAAqB,IAAI,gBAAgB,CAAC,qBAAqB,GAAG,CAAC,EAAE,CAAC;YACzF,IAAI,CAAC,IAAI,CAAC,gBAAgB,GAAG,gBAAgB,CAAC,qBAAqB,GAAG,mBAAmB,CAAC,CAAA;QAC5F,CAAC;QACD,IAAI,gBAAgB,CAAC,SAAS,IAAI,gBAAgB,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxE,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,gBAAgB,CAAC,SAAS,CAAC,MAAM,GAAG,qBAAqB,CAAC,CAAA;QAC/E,CAAC;QACD,IAAI,gBAAgB,CAAC,iBAAiB,IAAI,gBAAgB,CAAC,YAAY,EAAE,CAAC;YACxE,IAAI,CAAC,IAAI,CAAC,oCAAoC,GAAG,gBAAgB,CAAC,YAAY,CAAC,CAAA;QACjF,CAAC;IACH,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,4CAA4C,CAAC,CAAA;IAC3D,OAAO,IAAI,CAAA;AACb,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,uBAAuB,CAAC,cAAsB,OAAO,CAAC,GAAG,EAAE;IACzE,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAA;IACvD,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,SAAS,CAAA;IAE9C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAA;QAC9C,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QACvC,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;YAAE,OAAO,SAAS,CAAA;QAE3D,MAAM,UAAU,GAAI,MAAmC,CAAC,UAAU,CAAA;QAClE,IAAI,CAAC,UAAU,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;YAC/E,OAAO,SAAS,CAAA;QAClB,CAAC;QAED,OAAO,MAAM,CAAC,IAAI,CAAC,UAAqC,CAAC,CAAA;IAC3D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAA;IAClB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,cAAsB;IACpD,MAAM,SAAS,GAAG,oBAAoB,CAAC,cAAc,EAAE,uBAAuB,EAAE,CAAC,CAAA;IACjF,MAAM,QAAQ,GAAa,EAAE,CAAA;IAC7B,KAAK,MAAM,MAAM,IAAI,SAAS,CAAC,qBAAqB,EAAE,CAAC;QACrD,oEAAoE;QACpE,gEAAgE;QAChE,IAAI,SAAS,CAAC,iBAAiB,EAAE,CAAC,MAAM,CAAC,KAAK,YAAY;YAAE,SAAQ;QACpE,QAAQ,CAAC,IAAI,CAAC,cAAc,GAAG,MAAM,GAAG,2CAA2C,CAAC,CAAA;IACtF,CAAC;IACD,OAAO;QACL,oBAAoB,EAAE,SAAS,CAAC,OAAO;QACvC,YAAY,EAAE,SAAS;QACvB,YAAY,EAAE,QAAQ;KACvB,CAAA;AACH,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,mBAAmB,CACjC,IAA+B,EAC/B,OAAe,EACf,OAAe,EACf,QAAwC;IAExC,MAAM,SAAS,GAAG,oBAAoB,CAAC,OAAO,EAAE,uBAAuB,EAAE,CAAC,CAAA;IAC1E,MAAM,MAAM,GAAG,iBAAiB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAA;IACrD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAA;IAEjC,MAAM,IAAI,GAAyB,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACtD,QAAQ,EAAE,OAAO;QACjB,QAAQ,EAAE,GAAG,CAAC,OAAO;QACrB,UAAU,EAAE,GAAG,CAAC,SAAS;QACzB,WAAW,EAAE,GAAG,CAAC,UAAU;QAC3B,UAAU,EAAE,GAAG,CAAC,SAAS;QACzB,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,QAAQ,EAAE,GAAG,CAAC,QAAQ;KACvB,CAAC,CAAC,CAAA;IAEH,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAgC,CAAA;IACxD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,CAAA;QACnD,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAClB,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAA;IACxC,CAAC;IAED,KAAK,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,IAAI,QAAQ,EAAE,CAAC;QAC5C,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,UAAU,EAAE,MAA0C,CAAC,CAAA;IACvF,CAAC;IAED,OAAO,IAAI,CAAC,MAAM,CAAA;AACpB,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,MAAgB;IAC3D,OAAO,MAAM,KAAK,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,KAAK,MAAM,EAAE,CAAA;AAClE,CAAC;AAED,2EAA2E;AAC3E,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,MAUtC;IACC,MAAM,EACJ,SAAS,EACT,KAAK,EACL,SAAS,EACT,QAAQ,EACR,mBAAmB,EACnB,UAAU,EACV,MAAM,GAAG,gBAAgB,GAC1B,GAAG,MAAM,CAAA;IACV,MAAM,WAAW,GAAG,cAAc,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;IAErD,IAAI,CAAC;QACH,UAAU,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAA;QAC1C,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;QAC1C,MAAM,UAAU,GAAG,YAAY,CAAC,eAAe,CAAC,WAAW,CAAC,CAAA;QAE5D,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;YACrD,IAAI,CAAC;gBACH,MAAM,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAA;gBAC9B,IAAI,CAAC,KAAK,EAAE,CAAC;oBACX,OAAO;wBACL,OAAO,EAAE,KAAK;wBACd,SAAS;wBACT,OAAO,EACL,SAAS;4BACT,SAAS;4BACT,iEAAiE;wBACnE,OAAO,EAAE,8CAA8C;qBACxD,CAAA;gBACH,CAAC;gBACD,UAAU,CAAC,QAAQ,EAAE,iCAAiC,CAAC,CAAA;gBACvD,MAAM,EAAE,CAAC,EAAE,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;gBAC5D,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,SAAS;oBACT,OAAO,EAAE,SAAS,GAAG,SAAS,GAAG,4CAA4C;oBAC7E,WAAW,EAAE,aAAa;oBAC1B,OAAO,EACL,sFAAsF;iBACzF,CAAA;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,GAAG,SAAS,GAAG,qBAAqB,EAAE,CAAA;YAC9F,CAAC;QACH,CAAC;QAED,MAAM,WAAW,GAAG,UAAU,CAAC,WAAW,CAAA;QAE1C,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,UAAU,CAAC,OAAO,EAAE,4BAA4B,CAAC,CAAA;YACjD,MAAM,QAAQ,GAAG,MAAM,qBAAqB,CAAC,WAAW,EAAE,UAAU,CAAC,WAAW,CAAC,CAAA;YACjF,IAAI,QAAQ,EAAE,CAAC;gBACb,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,SAAS;oBACT,OAAO,EACL,SAAS;wBACT,SAAS;wBACT,0EAA0E;oBAC5E,OAAO,EAAE,0DAA0D;iBACpE,CAAA;YACH,CAAC;QACH,CAAC;QAED,UAAU,CAAC,QAAQ,EAAE,0BAA0B,CAAC,CAAA;QAChD,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,EAAE,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;QAC5D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;gBAAE,MAAM,KAAK,CAAA;QACrE,CAAC;QAED,IAAI,CAAC;YACH,mBAAmB,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAA;QAC7C,CAAC;QAAC,MAAM,CAAC;YACP,oCAAoC;QACtC,CAAC;QAED,UAAU,CAAC,UAAU,EAAE,mBAAmB,CAAC,CAAA;QAC3C,OAAO,YAAY,CAAC,eAAe,CAAC,WAAW,CAAC,CAAA;QAChD,MAAM,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;QAEjC,UAAU,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAA;QACxC,OAAO;YACL,OAAO,EAAE,IAAI;YACb,SAAS;YACT,OAAO,EAAE,SAAS,GAAG,SAAS,GAAG,sCAAsC;YACvE,WAAW,EAAE,WAAW;SACzB,CAAA;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE,KAAK;YACd,SAAS;YACT,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,gCAAgC;SACnF,CAAA;IACH,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,EAAY,EACZ,OAAe,EACf,SAAiB,EACjB,cAAsB;IAEtB,IAAI,CAAC;QACH,MAAM,gBAAgB,GAAG,IAAI,qBAAqB,CAAC,EAAE,EAAE;YACrD,QAAQ,EAAE,IAAI;YACd,OAAO,EAAE,OAAO;SACjB,CAAC,CAAA;QAEF,MAAM,SAAS,GAAG,cAAc,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAA;QAC3D,MAAM,SAAS,GAAG,cAAc,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAA;QAClE,MAAM,aAAa,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAA;QACjE,MAAM,aAAa,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;QAE1D,MAAM,eAAe,GAAG,MAAM,gBAAgB,CAAC,SAAS,CACtD,OAAO,EACP,aAAa,EACb,aAAa,EACb,cAAc,CACf,CAAA;QAED,IAAI,eAAe,CAAC,WAAW,EAAE,CAAC;YAChC,OAAO;gBACL,iBAAiB,EAAE,eAAe,CAAC,gBAAgB;gBACnD,aAAa,EAAE,eAAe,CAAC,SAAS;gBACxC,eAAe,EAAE,eAAe,CAAC,QAAQ,EAAE,OAAO;gBAClD,eAAe,EAAE,eAAe,CAAC,eAAe;gBAChD,gBAAgB,EAAE;oBAChB,SAAS,EAAE,IAAI;oBACf,SAAS,EAAE,eAAe,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;oBAC3D,iBAAiB,EAAE,CAAC,CAAC,eAAe,CAAC,QAAQ,EAAE,OAAO;oBACtD,qBAAqB,EAAE,eAAe,CAAC,KAAK,CAAC,qBAAqB;oBAClE,aAAa,EAAE,eAAe,CAAC,KAAK,CAAC,aAAa;oBAClD,cAAc,EAAE,eAAe,CAAC,KAAK,CAAC,cAAc;iBACrD;aACF,CAAA;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,yDAAyD;IAC3D,CAAC;IAED,OAAO;QACL,iBAAiB,EAAE,cAAc;QACjC,aAAa,EAAE,EAAE;QACjB,eAAe,EAAE,SAAS;QAC1B,eAAe,EAAE,SAAS;QAC1B,gBAAgB,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE;KACvC,CAAA;AACH,CAAC;AAED,yEAAyE;AACzE,MAAM,oBAAoB,GAAG;IAC3B,mBAAmB;IACnB,yBAAyB;IACzB,6BAA6B;IAC7B,kBAAkB;IAClB,yBAAyB;IACzB,sBAAsB;IACtB,wBAAwB;IACxB,8BAA8B;IAC9B,sCAAsC;IACtC,uCAAuC;IACvC,2BAA2B;CAC5B,CAAA;AAED,MAAM,UAAU,oBAAoB,CAAC,KAAc;IACjD,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,IAAI,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAChE,OAAO,KAAK,CAAC,OAAO,CAAA;QACtB,CAAC;IACH,CAAC;IACD,OAAO,8CAA8C,CAAA;AACvD,CAAC;AACD,iDAAiD;AAEjD,uEAAuE;AACvE,MAAM,UAAU,4BAA4B,CAAC,MAQ5C;IACC,OAAO,mBAAmB,CAAC;QACzB,SAAS,EAAE,MAAM,CAAC,UAAU,EAAE,SAAS,IAAI,IAAI;QAC/C,qBAAqB,EAAE,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,MAAM,IAAI,CAAC;QAC9D,cAAc,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,IAAI,IAAI;QACjD,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,WAAW,EAAE,MAAM,CAAC,WAAW;KAChC,CAAC,CAAA;AACJ,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,iBAAiB,CAAC,MAMjC;IACC,IAAI,CAAC,MAAM,CAAC,WAAW;QAAE,OAAM;IAC/B,IAAI,CAAC;QACH,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC;YACxB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,SAAS,EAAE,MAAM,CAAC,UAAU,CAAC,SAAS;YACtC,aAAa,EAAE,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,MAAM;YAChD,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,SAAS,EAAE,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,WAAW,EAAE;YACpD,MAAM,EAAE,MAAM,CAAC,MAAM;SACtB,CAAC,CAAA;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,kEAAkE;IACpE,CAAC;AACH,CAAC"}
|
|
@@ -1,15 +1,18 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @fileoverview Tests for the SMI-5676 `.mcp.json` cross-check additions to
|
|
3
3
|
* skill-installation.helpers.ts (`getRegisteredMcpServers`, and the
|
|
4
|
-
* resolution-aware warning filtering in `extractDepIntel`)
|
|
4
|
+
* resolution-aware warning filtering in `extractDepIntel`), plus the
|
|
5
|
+
* SMI-5894 Wave 1 multi-client manifest-keying + tips additions
|
|
6
|
+
* (`manifestKeyFor`, `generateTips`).
|
|
5
7
|
* @module @skillsmith/core/services/skill-installation.helpers.test
|
|
6
8
|
* @see SMI-5676: Wave 1 Step 3b — harden extractMcpReferences
|
|
9
|
+
* @see SMI-5894: Wave 1 Steps 3/5 — multi-client manifest re-keying + tips
|
|
7
10
|
*/
|
|
8
11
|
import { describe, expect, it, beforeEach, afterEach } from 'vitest';
|
|
9
12
|
import * as fs from 'fs';
|
|
10
13
|
import * as os from 'os';
|
|
11
14
|
import * as path from 'path';
|
|
12
|
-
import { extractDepIntel, getRegisteredMcpServers } from './skill-installation.helpers.js';
|
|
15
|
+
import { extractDepIntel, getRegisteredMcpServers, generateTips, manifestKeyFor, } from './skill-installation.helpers.js';
|
|
13
16
|
describe('getRegisteredMcpServers (SMI-5676)', () => {
|
|
14
17
|
let tmpDir;
|
|
15
18
|
beforeEach(() => {
|
|
@@ -77,4 +80,33 @@ describe('extractDepIntel resolution-aware warnings (SMI-5676)', () => {
|
|
|
77
80
|
expect(result.dep_warnings.some((w) => w.includes('linear'))).toBe(true);
|
|
78
81
|
});
|
|
79
82
|
});
|
|
83
|
+
describe('manifestKeyFor (SMI-5894 Wave 1 Step 3)', () => {
|
|
84
|
+
it('keys the canonical client (claude-code) by bare name — backward compatible', () => {
|
|
85
|
+
expect(manifestKeyFor('my-skill', 'claude-code')).toBe('my-skill');
|
|
86
|
+
});
|
|
87
|
+
it('keys a non-canonical client with a composite name::client key', () => {
|
|
88
|
+
expect(manifestKeyFor('my-skill', 'cursor')).toBe('my-skill::cursor');
|
|
89
|
+
expect(manifestKeyFor('my-skill', 'windsurf')).toBe('my-skill::windsurf');
|
|
90
|
+
});
|
|
91
|
+
it('produces distinct keys for the same skill name under different clients', () => {
|
|
92
|
+
const claudeKey = manifestKeyFor('same-name', 'claude-code');
|
|
93
|
+
const cursorKey = manifestKeyFor('same-name', 'cursor');
|
|
94
|
+
expect(claudeKey).not.toBe(cursorKey);
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
describe('generateTips (SMI-5894 Wave 1 Step 5)', () => {
|
|
98
|
+
const optimizationInfo = { optimized: false };
|
|
99
|
+
it('defaults to Claude Code wording when client/skillsDir are omitted (backward compatible)', () => {
|
|
100
|
+
const tips = generateTips('my-skill', optimizationInfo);
|
|
101
|
+
expect(tips.join('\n')).toContain('mention it in Claude Code');
|
|
102
|
+
expect(tips.join('\n')).toContain('ls ~/.claude/skills/');
|
|
103
|
+
});
|
|
104
|
+
it('names the actual client and install path when a non-canonical client is resolved', () => {
|
|
105
|
+
const tips = generateTips('my-skill', optimizationInfo, 'cursor', '/home/user/.cursor/skills');
|
|
106
|
+
const joined = tips.join('\n');
|
|
107
|
+
expect(joined).toContain('mention it in Cursor');
|
|
108
|
+
expect(joined).toContain('ls /home/user/.cursor/skills/');
|
|
109
|
+
expect(joined).not.toContain('Claude Code');
|
|
110
|
+
});
|
|
111
|
+
});
|
|
80
112
|
//# sourceMappingURL=skill-installation.helpers.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill-installation.helpers.test.js","sourceRoot":"","sources":["../../../src/services/skill-installation.helpers.test.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"skill-installation.helpers.test.js","sourceRoot":"","sources":["../../../src/services/skill-installation.helpers.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill-installation.io.d.ts","sourceRoot":"","sources":["../../../src/services/skill-installation.io.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAStE,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAQ1E;AAkBD,wBAAsB,eAAe,CACnC,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,MAAM,GAAE,MAAe,GACtB,OAAO,CAAC,MAAM,CAAC,CAyBjB;AAcD,wBAAsB,qBAAqB,CACzC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,OAAO,CAAC,CAkBlB;AAED,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,MAAM,EAAE,CAAA;IACtB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;
|
|
1
|
+
{"version":3,"file":"skill-installation.io.d.ts","sourceRoot":"","sources":["../../../src/services/skill-installation.io.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAStE,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAQ1E;AAkBD,wBAAsB,eAAe,CACnC,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,MAAM,GAAE,MAAe,GACtB,OAAO,CAAC,MAAM,CAAC,CAyBjB;AAcD,wBAAsB,qBAAqB,CACzC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,OAAO,CAAC,CAkBlB;AAED,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,MAAM,EAAE,CAAA;IACtB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAmED,wBAAsB,iBAAiB,CACrC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,iBAAiB,EAAE,MAAM,EACzB,aAAa,EAAE,KAAK,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,EAC3D,eAAe,EAAE,MAAM,GAAG,SAAS,GAClC,OAAO,CAAC,kBAAkB,CAAC,CAiF7B;AAED,MAAM,WAAW,0BAA0B;IACzC,uEAAuE;IACvE,cAAc,EAAE,MAAM,EAAE,CAAA;IACxB;;;OAGG;IACH,WAAW,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,UAAU,CAAA;KAAE,CAAC,CAAA;IACxD,4EAA4E;IAC5E,YAAY,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAC3D;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,yBAAyB,CAC7C,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,cAAc,GAAG,IAAI,GACpC,OAAO,CAAC,0BAA0B,CAAC,CAgDrC"}
|