@skillsmith/mcp-server 0.3.3 → 0.3.4
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/README.md +5 -3
- package/dist/.tsbuildinfo +1 -1
- package/dist/src/__tests__/context.test.d.ts +10 -0
- package/dist/src/__tests__/context.test.d.ts.map +1 -0
- package/dist/src/__tests__/context.test.js +345 -0
- package/dist/src/__tests__/context.test.js.map +1 -0
- package/dist/src/__tests__/get-skill.test.d.ts +1 -0
- package/dist/src/__tests__/get-skill.test.d.ts.map +1 -1
- package/dist/src/__tests__/get-skill.test.js +84 -0
- package/dist/src/__tests__/get-skill.test.js.map +1 -1
- package/dist/src/__tests__/middleware/license.test.js +180 -78
- package/dist/src/__tests__/middleware/license.test.js.map +1 -1
- package/dist/src/__tests__/search.test.js +2 -1
- package/dist/src/__tests__/search.test.js.map +1 -1
- package/dist/src/__tests__/utils/validation.test.d.ts +7 -0
- package/dist/src/__tests__/utils/validation.test.d.ts.map +1 -0
- package/dist/src/__tests__/utils/validation.test.js +82 -0
- package/dist/src/__tests__/utils/validation.test.js.map +1 -0
- package/dist/src/context.d.ts +16 -0
- package/dist/src/context.d.ts.map +1 -1
- package/dist/src/context.js +57 -9
- package/dist/src/context.js.map +1 -1
- package/dist/src/index.js +1 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/llm/failover.d.ts +200 -0
- package/dist/src/llm/failover.d.ts.map +1 -0
- package/dist/src/llm/failover.js +329 -0
- package/dist/src/llm/failover.js.map +1 -0
- package/dist/src/middleware/license.d.ts +5 -0
- package/dist/src/middleware/license.d.ts.map +1 -1
- package/dist/src/middleware/license.js +2 -1
- package/dist/src/middleware/license.js.map +1 -1
- package/dist/src/tools/compare.d.ts +3 -102
- package/dist/src/tools/compare.d.ts.map +1 -1
- package/dist/src/tools/compare.helpers.d.ts +36 -0
- package/dist/src/tools/compare.helpers.d.ts.map +1 -0
- package/dist/src/tools/compare.helpers.js +252 -0
- package/dist/src/tools/compare.helpers.js.map +1 -0
- package/dist/src/tools/compare.js +6 -288
- package/dist/src/tools/compare.js.map +1 -1
- package/dist/src/tools/compare.types.d.ts +133 -0
- package/dist/src/tools/compare.types.d.ts.map +1 -0
- package/dist/src/tools/compare.types.js +45 -0
- package/dist/src/tools/compare.types.js.map +1 -0
- package/dist/src/tools/get-skill.d.ts.map +1 -1
- package/dist/src/tools/get-skill.js +35 -2
- package/dist/src/tools/get-skill.js.map +1 -1
- package/dist/src/tools/install.d.ts +6 -60
- package/dist/src/tools/install.d.ts.map +1 -1
- package/dist/src/tools/install.helpers.d.ts +82 -0
- package/dist/src/tools/install.helpers.d.ts.map +1 -0
- package/dist/src/tools/install.helpers.js +324 -0
- package/dist/src/tools/install.helpers.js.map +1 -0
- package/dist/src/tools/install.js +117 -252
- package/dist/src/tools/install.js.map +1 -1
- package/dist/src/tools/install.types.d.ts +114 -0
- package/dist/src/tools/install.types.d.ts.map +1 -0
- package/dist/src/tools/install.types.js +91 -0
- package/dist/src/tools/install.types.js.map +1 -0
- package/dist/src/tools/recommend.d.ts +2 -148
- package/dist/src/tools/recommend.d.ts.map +1 -1
- package/dist/src/tools/recommend.helpers.d.ts +42 -0
- package/dist/src/tools/recommend.helpers.d.ts.map +1 -0
- package/dist/src/tools/recommend.helpers.js +155 -0
- package/dist/src/tools/recommend.helpers.js.map +1 -0
- package/dist/src/tools/recommend.js +75 -140
- package/dist/src/tools/recommend.js.map +1 -1
- package/dist/src/tools/recommend.types.d.ts +164 -0
- package/dist/src/tools/recommend.types.d.ts.map +1 -0
- package/dist/src/tools/recommend.types.js +87 -0
- package/dist/src/tools/recommend.types.js.map +1 -0
- package/dist/src/tools/search.d.ts +18 -4
- package/dist/src/tools/search.d.ts.map +1 -1
- package/dist/src/tools/search.js +60 -12
- package/dist/src/tools/search.js.map +1 -1
- package/dist/src/tools/validate.d.ts +3 -70
- package/dist/src/tools/validate.d.ts.map +1 -1
- package/dist/src/tools/validate.helpers.d.ts +22 -0
- package/dist/src/tools/validate.helpers.d.ts.map +1 -0
- package/dist/src/tools/validate.helpers.js +276 -0
- package/dist/src/tools/validate.helpers.js.map +1 -0
- package/dist/src/tools/validate.js +4 -337
- package/dist/src/tools/validate.js.map +1 -1
- package/dist/src/tools/validate.types.d.ts +96 -0
- package/dist/src/tools/validate.types.d.ts.map +1 -0
- package/dist/src/tools/validate.types.js +71 -0
- package/dist/src/tools/validate.types.js.map +1 -0
- package/dist/src/webhooks/index.d.ts +1 -0
- package/dist/src/webhooks/index.d.ts.map +1 -1
- package/dist/src/webhooks/index.js +2 -0
- package/dist/src/webhooks/index.js.map +1 -1
- package/dist/src/webhooks/stripe-webhook-endpoint.d.ts +68 -0
- package/dist/src/webhooks/stripe-webhook-endpoint.d.ts.map +1 -0
- package/dist/src/webhooks/stripe-webhook-endpoint.js +213 -0
- package/dist/src/webhooks/stripe-webhook-endpoint.js.map +1 -0
- package/dist/tests/integration/install.integration.test.js +148 -1
- package/dist/tests/integration/install.integration.test.js.map +1 -1
- package/dist/tests/integration/recommend.integration.test.js +2 -1
- package/dist/tests/integration/recommend.integration.test.js.map +1 -1
- package/dist/tests/llm/failover.test.d.ts +13 -0
- package/dist/tests/llm/failover.test.d.ts.map +1 -0
- package/dist/tests/llm/failover.test.js +250 -0
- package/dist/tests/llm/failover.test.js.map +1 -0
- package/dist/tests/recommend.test.js +133 -1
- package/dist/tests/recommend.test.js.map +1 -1
- package/dist/tests/tools.test.d.ts +1 -0
- package/dist/tests/tools.test.d.ts.map +1 -1
- package/dist/tests/tools.test.js +59 -1
- package/dist/tests/tools.test.js.map +1 -1
- package/dist/tests/unit/compare-helpers.test.d.ts +8 -0
- package/dist/tests/unit/compare-helpers.test.d.ts.map +1 -0
- package/dist/tests/unit/compare-helpers.test.js +224 -0
- package/dist/tests/unit/compare-helpers.test.js.map +1 -0
- package/dist/tests/unit/install-helpers.test.d.ts +8 -0
- package/dist/tests/unit/install-helpers.test.d.ts.map +1 -0
- package/dist/tests/unit/install-helpers.test.js +460 -0
- package/dist/tests/unit/install-helpers.test.js.map +1 -0
- package/dist/tests/unit/recommend-helpers.test.d.ts +8 -0
- package/dist/tests/unit/recommend-helpers.test.d.ts.map +1 -0
- package/dist/tests/unit/recommend-helpers.test.js +117 -0
- package/dist/tests/unit/recommend-helpers.test.js.map +1 -0
- package/dist/tests/unit/validate-helpers.test.d.ts +8 -0
- package/dist/tests/unit/validate-helpers.test.d.ts.map +1 -0
- package/dist/tests/unit/validate-helpers.test.js +243 -0
- package/dist/tests/unit/validate-helpers.test.js.map +1 -0
- package/package.json +1 -1
- package/src/assets/docs/USER_GUIDE.md +0 -220
- package/src/assets/skills/skillsmith/docs/QUOTAS.md +0 -182
- package/src/assets/skills/skillsmith/docs/SECURITY.md +0 -174
- package/src/assets/skills/skillsmith/docs/TRUST_TIERS.md +0 -142
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Install Tool Helper Functions
|
|
3
|
+
* @module @skillsmith/mcp-server/tools/install.helpers
|
|
4
|
+
*/
|
|
5
|
+
import * as fs from 'fs/promises';
|
|
6
|
+
import * as path from 'path';
|
|
7
|
+
import { MANIFEST_PATH, validateTrustTier, } from './install.types.js';
|
|
8
|
+
// ============================================================================
|
|
9
|
+
// Manifest Locking
|
|
10
|
+
// ============================================================================
|
|
11
|
+
/**
|
|
12
|
+
* SMI-1533: Lock file path for manifest operations
|
|
13
|
+
*/
|
|
14
|
+
const MANIFEST_LOCK_PATH = MANIFEST_PATH + '.lock';
|
|
15
|
+
const LOCK_TIMEOUT_MS = 30000; // 30 seconds max wait for lock
|
|
16
|
+
const LOCK_RETRY_INTERVAL_MS = 100;
|
|
17
|
+
/**
|
|
18
|
+
* Acquire a file lock for manifest operations
|
|
19
|
+
* SMI-1533: Prevents race conditions during concurrent installs
|
|
20
|
+
*/
|
|
21
|
+
export async function acquireManifestLock() {
|
|
22
|
+
const startTime = Date.now();
|
|
23
|
+
while (Date.now() - startTime < LOCK_TIMEOUT_MS) {
|
|
24
|
+
try {
|
|
25
|
+
// Try to create lock file exclusively
|
|
26
|
+
await fs.writeFile(MANIFEST_LOCK_PATH, String(process.pid), { flag: 'wx' });
|
|
27
|
+
return; // Lock acquired
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
if (error.code === 'EEXIST') {
|
|
31
|
+
// Lock exists, check if it's stale (older than timeout)
|
|
32
|
+
try {
|
|
33
|
+
const stats = await fs.stat(MANIFEST_LOCK_PATH);
|
|
34
|
+
const lockAge = Date.now() - stats.mtimeMs;
|
|
35
|
+
if (lockAge > LOCK_TIMEOUT_MS) {
|
|
36
|
+
// Stale lock, remove it and retry
|
|
37
|
+
await fs.unlink(MANIFEST_LOCK_PATH).catch(() => { });
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
// Lock file disappeared, retry
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
// Wait before retrying
|
|
46
|
+
await new Promise((resolve) => setTimeout(resolve, LOCK_RETRY_INTERVAL_MS));
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
throw error;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
throw new Error('Failed to acquire manifest lock after ' + LOCK_TIMEOUT_MS + 'ms');
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Release the manifest lock
|
|
57
|
+
*/
|
|
58
|
+
export async function releaseManifestLock() {
|
|
59
|
+
try {
|
|
60
|
+
await fs.unlink(MANIFEST_LOCK_PATH);
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
// Ignore errors - lock may already be released
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
// ============================================================================
|
|
67
|
+
// Manifest Operations
|
|
68
|
+
// ============================================================================
|
|
69
|
+
/**
|
|
70
|
+
* Load or create manifest
|
|
71
|
+
*/
|
|
72
|
+
export async function loadManifest() {
|
|
73
|
+
try {
|
|
74
|
+
const content = await fs.readFile(MANIFEST_PATH, 'utf-8');
|
|
75
|
+
return JSON.parse(content);
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
return {
|
|
79
|
+
version: '1.0.0',
|
|
80
|
+
installedSkills: {},
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Save manifest
|
|
86
|
+
* SMI-1533: Uses atomic write pattern with lock
|
|
87
|
+
*/
|
|
88
|
+
export async function saveManifest(manifest) {
|
|
89
|
+
await fs.mkdir(path.dirname(MANIFEST_PATH), { recursive: true });
|
|
90
|
+
// Write to temp file first, then rename for atomic operation
|
|
91
|
+
const tempPath = MANIFEST_PATH + '.tmp.' + process.pid;
|
|
92
|
+
await fs.writeFile(tempPath, JSON.stringify(manifest, null, 2));
|
|
93
|
+
await fs.rename(tempPath, MANIFEST_PATH);
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* SMI-1533: Safely update manifest with locking
|
|
97
|
+
* Prevents race conditions during concurrent install operations
|
|
98
|
+
*/
|
|
99
|
+
export async function updateManifestSafely(updateFn) {
|
|
100
|
+
await acquireManifestLock();
|
|
101
|
+
try {
|
|
102
|
+
const manifest = await loadManifest();
|
|
103
|
+
const updatedManifest = updateFn(manifest);
|
|
104
|
+
await saveManifest(updatedManifest);
|
|
105
|
+
}
|
|
106
|
+
finally {
|
|
107
|
+
await releaseManifestLock();
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// ============================================================================
|
|
111
|
+
// Parsing Functions
|
|
112
|
+
// ============================================================================
|
|
113
|
+
/**
|
|
114
|
+
* Parse skill ID or URL to get components
|
|
115
|
+
* SMI-1491: Added isRegistryId flag to detect registry skill IDs vs direct GitHub URLs
|
|
116
|
+
*/
|
|
117
|
+
export function parseSkillId(input) {
|
|
118
|
+
// Handle full GitHub URLs - not registry IDs
|
|
119
|
+
if (input.startsWith('https://github.com/')) {
|
|
120
|
+
const url = new URL(input);
|
|
121
|
+
const parts = url.pathname.split('/').filter(Boolean);
|
|
122
|
+
return {
|
|
123
|
+
owner: parts[0],
|
|
124
|
+
repo: parts[1],
|
|
125
|
+
path: parts.slice(2).join('/') || '',
|
|
126
|
+
isRegistryId: false,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
// Handle slash-separated IDs
|
|
130
|
+
if (input.includes('/')) {
|
|
131
|
+
const parts = input.split('/');
|
|
132
|
+
// 2-part format: Could be registry ID (author/skill-name) - needs lookup
|
|
133
|
+
if (parts.length === 2) {
|
|
134
|
+
return {
|
|
135
|
+
owner: parts[0],
|
|
136
|
+
repo: parts[1],
|
|
137
|
+
path: '',
|
|
138
|
+
isRegistryId: true, // Mark as potential registry ID for lookup
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
// 3+ parts: owner/repo/path format (direct GitHub reference)
|
|
142
|
+
return {
|
|
143
|
+
owner: parts[0],
|
|
144
|
+
repo: parts[1],
|
|
145
|
+
path: parts.slice(2).join('/'),
|
|
146
|
+
isRegistryId: false,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
// Handle skill ID from registry
|
|
150
|
+
throw new Error('Invalid skill ID format: ' + input + '. Use owner/repo or GitHub URL.');
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Allowed hostnames for skill installation
|
|
154
|
+
* SMI-1533: Restrict to trusted code hosting platforms
|
|
155
|
+
*/
|
|
156
|
+
const ALLOWED_HOSTS = ['github.com', 'www.github.com'];
|
|
157
|
+
/**
|
|
158
|
+
* Parse repo_url from registry to extract GitHub components
|
|
159
|
+
* SMI-1491: Handles various GitHub URL formats stored in registry
|
|
160
|
+
*/
|
|
161
|
+
export function parseRepoUrl(repoUrl) {
|
|
162
|
+
const url = new URL(repoUrl);
|
|
163
|
+
// SMI-1533: Validate hostname to prevent fetching from malicious sources
|
|
164
|
+
if (!ALLOWED_HOSTS.includes(url.hostname.toLowerCase())) {
|
|
165
|
+
throw new Error(`Invalid repository host: ${url.hostname}. ` +
|
|
166
|
+
`Only GitHub repositories are supported (${ALLOWED_HOSTS.join(', ')})`);
|
|
167
|
+
}
|
|
168
|
+
const parts = url.pathname.split('/').filter(Boolean);
|
|
169
|
+
const owner = parts[0];
|
|
170
|
+
const repo = parts[1];
|
|
171
|
+
// /owner/repo (skill at repo root)
|
|
172
|
+
if (parts.length === 2) {
|
|
173
|
+
return { owner, repo, path: '', branch: 'main' };
|
|
174
|
+
}
|
|
175
|
+
// /owner/repo/tree/branch/path... or /owner/repo/blob/branch/path...
|
|
176
|
+
if (parts[2] === 'tree' || parts[2] === 'blob') {
|
|
177
|
+
return {
|
|
178
|
+
owner,
|
|
179
|
+
repo,
|
|
180
|
+
branch: parts[3],
|
|
181
|
+
path: parts.slice(4).join('/'),
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
// Unknown format - assume path starts at index 2, default to main branch
|
|
185
|
+
return { owner, repo, path: parts.slice(2).join('/'), branch: 'main' };
|
|
186
|
+
}
|
|
187
|
+
// ============================================================================
|
|
188
|
+
// Registry Lookup
|
|
189
|
+
// ============================================================================
|
|
190
|
+
/**
|
|
191
|
+
* Look up skill in registry to get repo_url
|
|
192
|
+
* SMI-1491: Enables install to work with registry IDs like "author/skill-name"
|
|
193
|
+
*
|
|
194
|
+
* Follows API-first pattern: tries live API, falls back to local DB
|
|
195
|
+
*/
|
|
196
|
+
export async function lookupSkillFromRegistry(skillId, context) {
|
|
197
|
+
// Try API first (primary data source)
|
|
198
|
+
if (!context.apiClient.isOffline()) {
|
|
199
|
+
try {
|
|
200
|
+
const response = await context.apiClient.getSkill(skillId);
|
|
201
|
+
if (response.data.repo_url) {
|
|
202
|
+
return {
|
|
203
|
+
repoUrl: response.data.repo_url,
|
|
204
|
+
name: response.data.name,
|
|
205
|
+
// SMI-1533: Validate trust tier for security scan configuration
|
|
206
|
+
trustTier: validateTrustTier(response.data.trust_tier),
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
// API found skill but no repo_url - it's seed data
|
|
210
|
+
return null;
|
|
211
|
+
}
|
|
212
|
+
catch {
|
|
213
|
+
// API failed, fall through to local DB
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
// Fallback: Local database
|
|
217
|
+
const dbSkill = context.skillRepository.findById(skillId);
|
|
218
|
+
if (dbSkill?.repoUrl) {
|
|
219
|
+
return {
|
|
220
|
+
repoUrl: dbSkill.repoUrl,
|
|
221
|
+
name: dbSkill.name,
|
|
222
|
+
// SMI-1533: Validate trust tier for security scan configuration
|
|
223
|
+
trustTier: validateTrustTier(dbSkill.trustTier),
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
return null;
|
|
227
|
+
}
|
|
228
|
+
// ============================================================================
|
|
229
|
+
// GitHub Fetching
|
|
230
|
+
// ============================================================================
|
|
231
|
+
/**
|
|
232
|
+
* Fetch file from GitHub
|
|
233
|
+
* SMI-1491: Added optional branch parameter to use branch from repo_url
|
|
234
|
+
*/
|
|
235
|
+
export async function fetchFromGitHub(owner, repo, filePath, branch = 'main') {
|
|
236
|
+
const url = 'https://raw.githubusercontent.com/' + owner + '/' + repo + '/' + branch + '/' + filePath;
|
|
237
|
+
const response = await fetch(url);
|
|
238
|
+
if (!response.ok) {
|
|
239
|
+
// If specified branch fails and it was 'main', try 'master' as fallback
|
|
240
|
+
if (branch === 'main') {
|
|
241
|
+
const masterUrl = 'https://raw.githubusercontent.com/' + owner + '/' + repo + '/master/' + filePath;
|
|
242
|
+
const masterResponse = await fetch(masterUrl);
|
|
243
|
+
if (!masterResponse.ok) {
|
|
244
|
+
throw new Error('Failed to fetch ' + filePath + ': ' + response.status);
|
|
245
|
+
}
|
|
246
|
+
return masterResponse.text();
|
|
247
|
+
}
|
|
248
|
+
throw new Error('Failed to fetch ' + filePath + ': ' + response.status);
|
|
249
|
+
}
|
|
250
|
+
return response.text();
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Validate SKILL.md content
|
|
254
|
+
*/
|
|
255
|
+
export function validateSkillMd(content) {
|
|
256
|
+
const errors = [];
|
|
257
|
+
// Check for required sections
|
|
258
|
+
if (!content.includes('# ')) {
|
|
259
|
+
errors.push('Missing title (# heading)');
|
|
260
|
+
}
|
|
261
|
+
// Check minimum length
|
|
262
|
+
if (content.length < 100) {
|
|
263
|
+
errors.push('SKILL.md is too short (minimum 100 characters)');
|
|
264
|
+
}
|
|
265
|
+
return {
|
|
266
|
+
valid: errors.length === 0,
|
|
267
|
+
errors,
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Generate post-install tips
|
|
272
|
+
*/
|
|
273
|
+
export function generateTips(skillName) {
|
|
274
|
+
return [
|
|
275
|
+
'Skill "' + skillName + '" installed successfully!',
|
|
276
|
+
'To use this skill, mention it in Claude Code: "Use the ' + skillName + ' skill to..."',
|
|
277
|
+
'View installed skills: ls ~/.claude/skills/',
|
|
278
|
+
'To uninstall: use the uninstall_skill tool',
|
|
279
|
+
];
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* SMI-XXX: Generate post-install tips with optimization info
|
|
283
|
+
*/
|
|
284
|
+
export function generateOptimizedTips(skillName, optimizationInfo, claudeMdSnippet) {
|
|
285
|
+
const tips = [
|
|
286
|
+
'Skill "' + skillName + '" installed successfully!',
|
|
287
|
+
'To use this skill, mention it in Claude Code: "Use the ' + skillName + ' skill to..."',
|
|
288
|
+
'View installed skills: ls ~/.claude/skills/',
|
|
289
|
+
];
|
|
290
|
+
if (optimizationInfo.optimized) {
|
|
291
|
+
tips.push('');
|
|
292
|
+
tips.push('✨ Skillsmith Optimization Applied:');
|
|
293
|
+
if (optimizationInfo.tokenReductionPercent && optimizationInfo.tokenReductionPercent > 0) {
|
|
294
|
+
tips.push(` • Estimated ${optimizationInfo.tokenReductionPercent}% token reduction`);
|
|
295
|
+
}
|
|
296
|
+
if (optimizationInfo.originalLines && optimizationInfo.optimizedLines) {
|
|
297
|
+
tips.push(` • Optimized from ${optimizationInfo.originalLines} to ${optimizationInfo.optimizedLines} lines`);
|
|
298
|
+
}
|
|
299
|
+
if (optimizationInfo.subSkills && optimizationInfo.subSkills.length > 0) {
|
|
300
|
+
tips.push(` • ${optimizationInfo.subSkills.length} sub-skills created for on-demand loading`);
|
|
301
|
+
}
|
|
302
|
+
if (optimizationInfo.subagentGenerated && optimizationInfo.subagentPath) {
|
|
303
|
+
tips.push(` • Companion subagent generated: ${optimizationInfo.subagentPath}`);
|
|
304
|
+
tips.push('');
|
|
305
|
+
tips.push('💡 For parallel execution, delegate to the subagent instead of running directly.');
|
|
306
|
+
if (claudeMdSnippet) {
|
|
307
|
+
tips.push('');
|
|
308
|
+
tips.push('Add this to your CLAUDE.md for automatic delegation:');
|
|
309
|
+
tips.push('');
|
|
310
|
+
// Include a shortened version of the snippet
|
|
311
|
+
const shortSnippet = claudeMdSnippet
|
|
312
|
+
.split('\n')
|
|
313
|
+
.filter((line) => line.trim().length > 0)
|
|
314
|
+
.slice(0, 5)
|
|
315
|
+
.join('\n');
|
|
316
|
+
tips.push(shortSnippet + '\n...');
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
tips.push('');
|
|
321
|
+
tips.push('To uninstall: use the uninstall_skill tool');
|
|
322
|
+
return tips;
|
|
323
|
+
}
|
|
324
|
+
//# sourceMappingURL=install.helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.helpers.js","sourceRoot":"","sources":["../../../src/tools/install.helpers.ts"],"names":[],"mappings":"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"}
|