@tasszz2k/agentlens 0.3.0

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.
Files changed (79) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +402 -0
  3. package/dist/ai.d.ts +5 -0
  4. package/dist/ai.d.ts.map +1 -0
  5. package/dist/ai.js +56 -0
  6. package/dist/ai.js.map +1 -0
  7. package/dist/cli.d.ts +3 -0
  8. package/dist/cli.d.ts.map +1 -0
  9. package/dist/cli.js +313 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/config.d.ts +29 -0
  12. package/dist/config.d.ts.map +1 -0
  13. package/dist/config.js +193 -0
  14. package/dist/config.js.map +1 -0
  15. package/dist/cost.d.ts +5 -0
  16. package/dist/cost.d.ts.map +1 -0
  17. package/dist/cost.js +362 -0
  18. package/dist/cost.js.map +1 -0
  19. package/dist/parse.d.ts +26 -0
  20. package/dist/parse.d.ts.map +1 -0
  21. package/dist/parse.js +391 -0
  22. package/dist/parse.js.map +1 -0
  23. package/dist/render.d.ts +8 -0
  24. package/dist/render.d.ts.map +1 -0
  25. package/dist/render.js +346 -0
  26. package/dist/render.js.map +1 -0
  27. package/dist/scan.d.ts +23 -0
  28. package/dist/scan.d.ts.map +1 -0
  29. package/dist/scan.js +457 -0
  30. package/dist/scan.js.map +1 -0
  31. package/dist/symlink.d.ts +5 -0
  32. package/dist/symlink.d.ts.map +1 -0
  33. package/dist/symlink.js +56 -0
  34. package/dist/symlink.js.map +1 -0
  35. package/dist/troubleshoot.d.ts +4 -0
  36. package/dist/troubleshoot.d.ts.map +1 -0
  37. package/dist/troubleshoot.js +193 -0
  38. package/dist/troubleshoot.js.map +1 -0
  39. package/dist/types.d.ts +103 -0
  40. package/dist/types.d.ts.map +1 -0
  41. package/dist/types.js +2 -0
  42. package/dist/types.js.map +1 -0
  43. package/dist/ui/App.d.ts +16 -0
  44. package/dist/ui/App.d.ts.map +1 -0
  45. package/dist/ui/App.js +452 -0
  46. package/dist/ui/App.js.map +1 -0
  47. package/dist/ui/CommandBar.d.ts +8 -0
  48. package/dist/ui/CommandBar.d.ts.map +1 -0
  49. package/dist/ui/CommandBar.js +77 -0
  50. package/dist/ui/CommandBar.js.map +1 -0
  51. package/dist/ui/CostView.d.ts +14 -0
  52. package/dist/ui/CostView.d.ts.map +1 -0
  53. package/dist/ui/CostView.js +200 -0
  54. package/dist/ui/CostView.js.map +1 -0
  55. package/dist/ui/DetailPanel.d.ts +12 -0
  56. package/dist/ui/DetailPanel.d.ts.map +1 -0
  57. package/dist/ui/DetailPanel.js +224 -0
  58. package/dist/ui/DetailPanel.js.map +1 -0
  59. package/dist/ui/HelpBar.d.ts +7 -0
  60. package/dist/ui/HelpBar.d.ts.map +1 -0
  61. package/dist/ui/HelpBar.js +51 -0
  62. package/dist/ui/HelpBar.js.map +1 -0
  63. package/dist/ui/SearchBar.d.ts +9 -0
  64. package/dist/ui/SearchBar.d.ts.map +1 -0
  65. package/dist/ui/SearchBar.js +46 -0
  66. package/dist/ui/SearchBar.js.map +1 -0
  67. package/dist/ui/SettingsView.d.ts +16 -0
  68. package/dist/ui/SettingsView.d.ts.map +1 -0
  69. package/dist/ui/SettingsView.js +155 -0
  70. package/dist/ui/SettingsView.js.map +1 -0
  71. package/dist/ui/TreeView.d.ts +26 -0
  72. package/dist/ui/TreeView.d.ts.map +1 -0
  73. package/dist/ui/TreeView.js +240 -0
  74. package/dist/ui/TreeView.js.map +1 -0
  75. package/dist/ui/theme.d.ts +30 -0
  76. package/dist/ui/theme.d.ts.map +1 -0
  77. package/dist/ui/theme.js +31 -0
  78. package/dist/ui/theme.js.map +1 -0
  79. package/package.json +55 -0
package/dist/scan.js ADDED
@@ -0,0 +1,457 @@
1
+ import fs from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import os from 'node:os';
4
+ import { traceSymlink } from './symlink.js';
5
+ import { parseFrontmatter, parseSkillFile, parseMdcFile, parseCommandFile, getFileInfo, parseMcpJson, parseMcpToml, parseHooksFromSettings, parseCursorUserRules } from './parse.js';
6
+ function tildify(p) {
7
+ const home = os.homedir();
8
+ if (p === home || p.startsWith(home + path.sep)) {
9
+ return '~' + p.slice(home.length);
10
+ }
11
+ return p;
12
+ }
13
+ function matchesPattern(name, pattern) {
14
+ if (pattern === '*')
15
+ return true;
16
+ if (pattern.startsWith('*.')) {
17
+ return name.endsWith(pattern.slice(1));
18
+ }
19
+ return name === pattern;
20
+ }
21
+ function matchesPatterns(name, patterns) {
22
+ if (typeof patterns === 'string')
23
+ return matchesPattern(name, patterns);
24
+ return patterns.some((p) => matchesPattern(name, p));
25
+ }
26
+ export async function scanDirectory(dirPath, filePattern, parseMode = 'frontmatter', recursive = false) {
27
+ const entries = [];
28
+ async function walk(dir, prefix) {
29
+ let dirEntries;
30
+ try {
31
+ dirEntries = await fs.readdir(dir, { withFileTypes: true });
32
+ }
33
+ catch {
34
+ return;
35
+ }
36
+ for (const dirent of dirEntries) {
37
+ const fullPath = path.join(dir, dirent.name);
38
+ if (recursive && dirent.isDirectory()) {
39
+ await walk(fullPath, prefix ? `${prefix}/${dirent.name}` : dirent.name);
40
+ continue;
41
+ }
42
+ if (!matchesPatterns(dirent.name, filePattern))
43
+ continue;
44
+ let stat;
45
+ try {
46
+ stat = await fs.stat(fullPath);
47
+ }
48
+ catch {
49
+ continue;
50
+ }
51
+ if (!stat.isFile())
52
+ continue;
53
+ const symlink = await traceSymlink(fullPath);
54
+ let frontmatter;
55
+ let description;
56
+ if (parseMode === 'mdc') {
57
+ const parsed = await parseMdcFile(fullPath);
58
+ frontmatter = Object.keys(parsed.frontmatter).length > 0 ? parsed.frontmatter : undefined;
59
+ description = parsed.description;
60
+ }
61
+ else if (parseMode === 'command') {
62
+ const parsed = await parseCommandFile(fullPath);
63
+ frontmatter = Object.keys(parsed.frontmatter).length > 0 ? parsed.frontmatter : undefined;
64
+ description = parsed.description;
65
+ }
66
+ else {
67
+ const parsed = await parseFrontmatter(fullPath);
68
+ frontmatter = Object.keys(parsed.frontmatter).length > 0 ? parsed.frontmatter : undefined;
69
+ description = parsed.description;
70
+ }
71
+ const baseName = path.basename(dirent.name, path.extname(dirent.name));
72
+ entries.push({
73
+ name: prefix ? `${prefix}/${baseName}` : baseName,
74
+ path: fullPath,
75
+ exists: true,
76
+ symlink,
77
+ frontmatter,
78
+ description,
79
+ });
80
+ }
81
+ }
82
+ await walk(dirPath, '');
83
+ return entries;
84
+ }
85
+ export async function scanSkillsDir(dirPath, excludeDirs = []) {
86
+ const entries = [];
87
+ try {
88
+ const subdirs = await fs.readdir(dirPath, { withFileTypes: true });
89
+ for (const dirent of subdirs) {
90
+ if (excludeDirs.includes(dirent.name))
91
+ continue;
92
+ const isDir = dirent.isDirectory() || dirent.isSymbolicLink();
93
+ if (!isDir)
94
+ continue;
95
+ const subdirPath = path.join(dirPath, dirent.name);
96
+ try {
97
+ const realStat = await fs.stat(subdirPath);
98
+ if (!realStat.isDirectory())
99
+ continue;
100
+ }
101
+ catch {
102
+ continue;
103
+ }
104
+ const skillMdPath = path.join(subdirPath, 'SKILL.md');
105
+ let stat;
106
+ try {
107
+ stat = await fs.stat(skillMdPath);
108
+ }
109
+ catch {
110
+ continue;
111
+ }
112
+ if (!stat.isFile())
113
+ continue;
114
+ const dirSymlink = await traceSymlink(subdirPath);
115
+ const fileSymlink = await traceSymlink(skillMdPath);
116
+ const symlink = fileSymlink ?? dirSymlink;
117
+ const parsed = await parseSkillFile(skillMdPath);
118
+ entries.push({
119
+ name: dirent.name,
120
+ path: skillMdPath,
121
+ exists: true,
122
+ symlink,
123
+ frontmatter: Object.keys(parsed.frontmatter).length > 0 ? parsed.frontmatter : undefined,
124
+ description: parsed.description ?? parsed.name,
125
+ });
126
+ }
127
+ }
128
+ catch {
129
+ return [];
130
+ }
131
+ return entries;
132
+ }
133
+ export async function scanSingleFile(filePath) {
134
+ try {
135
+ const stat = await fs.stat(filePath);
136
+ if (!stat.isFile())
137
+ return null;
138
+ }
139
+ catch {
140
+ return null;
141
+ }
142
+ const symlink = await traceSymlink(filePath);
143
+ const info = await getFileInfo(filePath);
144
+ return {
145
+ name: path.basename(filePath),
146
+ path: filePath,
147
+ exists: info.exists,
148
+ symlink,
149
+ };
150
+ }
151
+ async function toolConfig(tool, category, basePath, label, entries) {
152
+ let exists = false;
153
+ try {
154
+ await fs.stat(basePath);
155
+ exists = true;
156
+ }
157
+ catch {
158
+ }
159
+ return {
160
+ tool,
161
+ category,
162
+ label,
163
+ basePath,
164
+ exists,
165
+ entries,
166
+ };
167
+ }
168
+ async function findPluginSkills(dir, results, depth = 0) {
169
+ if (depth > 4)
170
+ return;
171
+ try {
172
+ const entries = await fs.readdir(dir, { withFileTypes: true });
173
+ for (const dirent of entries) {
174
+ if (!dirent.isDirectory())
175
+ continue;
176
+ const full = path.join(dir, dirent.name);
177
+ if (dirent.name === 'skills') {
178
+ const segments = full.split(path.sep);
179
+ const cacheIdx = segments.indexOf('cache');
180
+ const pluginLabel = cacheIdx >= 0 && cacheIdx + 2 < segments.length
181
+ ? segments.slice(cacheIdx + 1, cacheIdx + 3).join('/')
182
+ : path.basename(path.dirname(full));
183
+ const skillEntries = await scanSkillsDir(full);
184
+ if (skillEntries.length > 0) {
185
+ results.push(await toolConfig('Cursor', 'Skills', full, `(plugin: ${pluginLabel})`, skillEntries));
186
+ }
187
+ }
188
+ else {
189
+ await findPluginSkills(full, results, depth + 1);
190
+ }
191
+ }
192
+ }
193
+ catch {
194
+ }
195
+ }
196
+ async function scanMcpFile(filePath, parseMode) {
197
+ let servers;
198
+ if (parseMode === 'toml') {
199
+ servers = await parseMcpToml(filePath);
200
+ }
201
+ else {
202
+ servers = await parseMcpJson(filePath);
203
+ }
204
+ return servers.map((s) => ({
205
+ name: s.name,
206
+ path: filePath,
207
+ exists: true,
208
+ description: formatMcpDescription(s),
209
+ frontmatter: {
210
+ type: s.type,
211
+ ...(s.url ? { url: s.url } : {}),
212
+ ...(s.command ? { command: s.command } : {}),
213
+ ...(s.args ? { args: s.args } : {}),
214
+ hasAuth: s.hasAuth,
215
+ },
216
+ }));
217
+ }
218
+ function formatMcpDescription(s) {
219
+ if (s.type === 'http') {
220
+ const auth = s.hasAuth ? ' [auth]' : '';
221
+ return `(http) ${s.url ?? 'unknown'}${auth}`;
222
+ }
223
+ const cmd = [s.command, ...(s.args ?? [])].join(' ');
224
+ const auth = s.hasAuth ? ' [auth]' : '';
225
+ return `(stdio) ${cmd}${auth}`;
226
+ }
227
+ function cursorUserDataPath() {
228
+ const platform = process.platform;
229
+ if (platform === 'darwin') {
230
+ return path.join(os.homedir(), 'Library', 'Application Support', 'Cursor', 'User', 'globalStorage', 'state.vscdb');
231
+ }
232
+ else if (platform === 'win32') {
233
+ return path.join(process.env.APPDATA ?? path.join(os.homedir(), 'AppData', 'Roaming'), 'Cursor', 'User', 'globalStorage', 'state.vscdb');
234
+ }
235
+ return path.join(os.homedir(), '.config', 'Cursor', 'User', 'globalStorage', 'state.vscdb');
236
+ }
237
+ export async function scanGlobal() {
238
+ const home = os.homedir();
239
+ const results = [];
240
+ const locations = [
241
+ { tool: 'Canonical', category: 'Skills', path: path.join(home, '.agents', 'skills'), type: 'skills' },
242
+ { tool: 'Claude Code', category: 'Skills', path: path.join(home, '.claude', 'skills'), type: 'skills' },
243
+ { tool: 'Claude Code', category: 'Commands', path: path.join(home, '.claude', 'commands'), type: 'commands' },
244
+ { tool: 'Claude Code', category: 'Context', path: path.join(home, '.claude', 'CLAUDE.md'), type: 'context' },
245
+ { tool: 'Cursor', category: 'Skills', path: path.join(home, '.cursor', 'skills'), label: '(user)', type: 'skills' },
246
+ { tool: 'Cursor', category: 'Skills', path: path.join(home, '.cursor', 'skills-cursor'), label: '(built-in)', type: 'skills' },
247
+ { tool: 'Cursor', category: 'Rules', path: path.join(home, '.cursor', 'rules'), type: 'rules' },
248
+ { tool: 'Cursor', category: 'Context', path: cursorUserDataPath(), label: '(user rules)', type: 'cursor-user-rules' },
249
+ { tool: 'Codex', category: 'Skills', path: path.join(home, '.codex', 'skills'), type: 'skills', excludeSystem: true },
250
+ { tool: 'Codex', category: 'Skills', path: path.join(home, '.codex', 'skills', '.system'), label: '(system)', type: 'skills' },
251
+ { tool: 'Codex', category: 'Rules', path: path.join(home, '.codex', 'rules'), type: 'codex-rules' },
252
+ { tool: 'Claude Code', category: 'Hooks', path: path.join(home, '.claude', 'settings.json'), type: 'hooks' },
253
+ { tool: 'Cursor', category: 'MCP Servers', path: path.join(home, '.cursor', 'mcp.json'), type: 'mcp' },
254
+ { tool: 'Claude Code', category: 'MCP Servers', path: path.join(home, '.claude.json'), type: 'mcp' },
255
+ { tool: 'Codex', category: 'MCP Servers', path: path.join(home, '.codex', 'config.toml'), type: 'mcp-toml' },
256
+ ];
257
+ for (const loc of locations) {
258
+ try {
259
+ if (loc.type === 'skills') {
260
+ const entries = await scanSkillsDir(loc.path, loc.excludeSystem ? ['.system'] : []);
261
+ results.push(await toolConfig(loc.tool, loc.category, loc.path, loc.label, entries));
262
+ }
263
+ else if (loc.type === 'commands') {
264
+ const entries = await scanDirectory(loc.path, '*.md', 'command');
265
+ results.push(await toolConfig(loc.tool, loc.category, loc.path, loc.label, entries));
266
+ }
267
+ else if (loc.type === 'context') {
268
+ const entry = await scanSingleFile(loc.path);
269
+ results.push(await toolConfig(loc.tool, loc.category, path.dirname(loc.path), loc.label, entry ? [entry] : []));
270
+ }
271
+ else if (loc.type === 'rules') {
272
+ const entries = await scanDirectory(loc.path, ['*.mdc', '*.md'], 'mdc', true);
273
+ results.push(await toolConfig(loc.tool, loc.category, loc.path, loc.label, entries));
274
+ }
275
+ else if (loc.type === 'cursor-user-rules') {
276
+ const entries = await parseCursorUserRules(loc.path);
277
+ results.push(await toolConfig(loc.tool, loc.category, loc.path, loc.label, entries));
278
+ }
279
+ else if (loc.type === 'codex-rules') {
280
+ const entries = await scanDirectory(loc.path, '*', 'frontmatter');
281
+ results.push(await toolConfig(loc.tool, loc.category, loc.path, loc.label, entries));
282
+ }
283
+ else if (loc.type === 'mcp') {
284
+ const entries = await scanMcpFile(loc.path, 'json');
285
+ results.push(await toolConfig(loc.tool, loc.category, loc.path, loc.label, entries));
286
+ }
287
+ else if (loc.type === 'mcp-toml') {
288
+ const entries = await scanMcpFile(loc.path, 'toml');
289
+ results.push(await toolConfig(loc.tool, loc.category, loc.path, loc.label, entries));
290
+ }
291
+ else if (loc.type === 'hooks') {
292
+ const entries = await parseHooksFromSettings(loc.path);
293
+ results.push(await toolConfig(loc.tool, loc.category, loc.path, loc.label, entries));
294
+ }
295
+ }
296
+ catch {
297
+ results.push(await toolConfig(loc.tool, loc.category, loc.path, loc.label, []));
298
+ }
299
+ }
300
+ try {
301
+ const pluginsPath = path.join(home, '.cursor', 'plugins', 'cache');
302
+ await findPluginSkills(pluginsPath, results);
303
+ }
304
+ catch {
305
+ }
306
+ return results;
307
+ }
308
+ export async function scanProject(projectPath) {
309
+ const results = [];
310
+ const projectLocations = [
311
+ { tool: 'Canonical', category: 'Skills', path: path.join(projectPath, '.agents', 'skills'), type: 'skills' },
312
+ { tool: 'Claude Code', category: 'Skills', path: path.join(projectPath, '.claude', 'skills'), type: 'skills' },
313
+ { tool: 'Claude Code', category: 'Commands', path: path.join(projectPath, '.claude', 'commands'), type: 'commands' },
314
+ { tool: 'Claude Code', category: 'Context', path: path.join(projectPath, 'CLAUDE.md'), type: 'context' },
315
+ { tool: 'Claude Code', category: 'Context', path: path.join(projectPath, '.claude', 'CLAUDE.md'), type: 'context' },
316
+ { tool: 'Cursor', category: 'Rules', path: path.join(projectPath, '.cursorrules'), type: 'rules' },
317
+ { tool: 'Cursor', category: 'Rules', path: path.join(projectPath, '.cursor', 'rules'), type: 'rules' },
318
+ { tool: 'Cursor', category: 'Skills', path: path.join(projectPath, '.cursor', 'skills'), type: 'skills' },
319
+ { tool: 'Multi-agent', category: 'Context', path: path.join(projectPath, 'AGENTS.md'), type: 'context' },
320
+ { tool: 'Copilot', category: 'Context', path: path.join(projectPath, '.github', 'copilot-instructions.md'), type: 'context' },
321
+ { tool: 'Claude Code', category: 'Hooks', path: path.join(projectPath, '.claude', 'settings.json'), type: 'hooks' },
322
+ { tool: 'Claude Code', category: 'Hooks', path: path.join(projectPath, '.claude', 'settings.local.json'), type: 'hooks' },
323
+ { tool: 'Claude Code', category: 'MCP Servers', path: path.join(projectPath, '.mcp.json'), type: 'mcp' },
324
+ { tool: 'Cursor', category: 'MCP Servers', path: path.join(projectPath, '.cursor', 'mcp.json'), type: 'mcp' },
325
+ { tool: 'Copilot', category: 'MCP Servers', path: path.join(projectPath, '.vscode', 'mcp.json'), type: 'mcp' },
326
+ ];
327
+ for (const loc of projectLocations) {
328
+ try {
329
+ const stat = await fs.stat(loc.path);
330
+ if (loc.type === 'skills' && stat.isDirectory()) {
331
+ const entries = await scanSkillsDir(loc.path);
332
+ results.push(await toolConfig(loc.tool, loc.category, loc.path, undefined, entries));
333
+ }
334
+ else if (loc.type === 'commands' && stat.isDirectory()) {
335
+ const entries = await scanDirectory(loc.path, '*.md', 'command');
336
+ results.push(await toolConfig(loc.tool, loc.category, loc.path, undefined, entries));
337
+ }
338
+ else if (loc.type === 'context' && stat.isFile()) {
339
+ const entry = await scanSingleFile(loc.path);
340
+ if (entry) {
341
+ results.push(await toolConfig(loc.tool, loc.category, path.dirname(loc.path), undefined, [entry]));
342
+ }
343
+ }
344
+ else if (loc.type === 'rules') {
345
+ if (stat.isFile()) {
346
+ const entry = await scanSingleFile(loc.path);
347
+ if (entry) {
348
+ results.push(await toolConfig(loc.tool, loc.category, projectPath, undefined, [entry]));
349
+ }
350
+ }
351
+ else if (stat.isDirectory()) {
352
+ const entries = await scanDirectory(loc.path, ['*.mdc', '*.md'], 'mdc', true);
353
+ results.push(await toolConfig(loc.tool, loc.category, loc.path, undefined, entries));
354
+ }
355
+ }
356
+ else if (loc.type === 'mcp' && stat.isFile()) {
357
+ const entries = await scanMcpFile(loc.path, 'json');
358
+ if (entries.length > 0) {
359
+ results.push(await toolConfig(loc.tool, loc.category, loc.path, undefined, entries));
360
+ }
361
+ }
362
+ else if (loc.type === 'hooks' && stat.isFile()) {
363
+ const entries = await parseHooksFromSettings(loc.path);
364
+ if (entries.length > 0) {
365
+ results.push(await toolConfig(loc.tool, loc.category, loc.path, undefined, entries));
366
+ }
367
+ }
368
+ }
369
+ catch {
370
+ }
371
+ }
372
+ return results;
373
+ }
374
+ export async function scanAll(projectPath, includeGlobal) {
375
+ const { loadConfig, discoverProjects } = await import('./config.js');
376
+ const config = await loadConfig();
377
+ const [global, project, discoveredPaths] = await Promise.all([
378
+ includeGlobal ? scanGlobal() : [],
379
+ scanProject(projectPath),
380
+ config.roots.length > 0 ? discoverProjects(config.roots) : Promise.resolve([]),
381
+ ]);
382
+ const normalizedCurrent = path.normalize(path.resolve(projectPath));
383
+ const otherPaths = discoveredPaths.filter((p) => path.normalize(p) !== normalizedCurrent);
384
+ let projects;
385
+ if (otherPaths.length > 0) {
386
+ const scans = await Promise.all(otherPaths.map(async (p) => ({
387
+ path: p,
388
+ configs: await scanProject(p),
389
+ })));
390
+ projects = scans.filter((s) => s.configs.length > 0);
391
+ if (projects.length === 0)
392
+ projects = undefined;
393
+ }
394
+ return {
395
+ global,
396
+ project,
397
+ projectPath,
398
+ projects,
399
+ };
400
+ }
401
+ function skillDirFromEntry(entry) {
402
+ return path.dirname(path.dirname(entry.path));
403
+ }
404
+ export async function scanForWhereCommand(skillName, projectPath = process.cwd()) {
405
+ const home = os.homedir();
406
+ const canonicalPath = path.join(home, '.agents', 'skills');
407
+ let canonicalSkills = [];
408
+ try {
409
+ canonicalSkills = await scanSkillsDir(canonicalPath);
410
+ if (skillName) {
411
+ canonicalSkills = canonicalSkills.filter((e) => e.name === skillName);
412
+ }
413
+ }
414
+ catch {
415
+ }
416
+ const installations = [];
417
+ const [globalConfigs, projectConfigs] = await Promise.all([
418
+ scanGlobal(),
419
+ scanProject(projectPath),
420
+ ]);
421
+ const globalSkills = globalConfigs.filter((c) => c.category === 'Skills');
422
+ const projectSkills = projectConfigs.filter((c) => c.category === 'Skills');
423
+ for (const canonical of canonicalSkills) {
424
+ const canonicalName = canonical.name;
425
+ for (const tc of globalSkills) {
426
+ for (const entry of tc.entries) {
427
+ if (entry.name !== canonicalName)
428
+ continue;
429
+ const location = skillDirFromEntry(entry);
430
+ installations.push({
431
+ skillName: canonicalName,
432
+ location: tildify(location),
433
+ tool: tc.tool,
434
+ scope: 'global',
435
+ entry,
436
+ });
437
+ }
438
+ }
439
+ for (const tc of projectSkills) {
440
+ for (const entry of tc.entries) {
441
+ if (entry.name !== canonicalName)
442
+ continue;
443
+ const location = skillDirFromEntry(entry);
444
+ installations.push({
445
+ skillName: canonicalName,
446
+ location: tildify(location),
447
+ tool: tc.tool,
448
+ scope: 'project',
449
+ projectPath,
450
+ entry,
451
+ });
452
+ }
453
+ }
454
+ }
455
+ return { canonicalSkills, installations };
456
+ }
457
+ //# sourceMappingURL=scan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan.js","sourceRoot":"","sources":["../src/scan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { SymlinkInfo } from './types.js';
2
+ export declare function traceSymlink(filePath: string): Promise<SymlinkInfo | undefined>;
3
+ export declare function isSymlink(filePath: string): Promise<boolean>;
4
+ export declare function resolveSymlinkChain(filePath: string): Promise<string[]>;
5
+ //# sourceMappingURL=symlink.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"symlink.d.ts","sourceRoot":"","sources":["../src/symlink.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAoBrF;AAED,wBAAsB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOlE;AAED,wBAAsB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAqB7E"}
@@ -0,0 +1,56 @@
1
+ import fs from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ export async function traceSymlink(filePath) {
4
+ try {
5
+ const stats = await fs.lstat(filePath);
6
+ if (!stats.isSymbolicLink()) {
7
+ return undefined;
8
+ }
9
+ const raw = await fs.readlink(filePath);
10
+ const chain = await resolveSymlinkChain(filePath);
11
+ if (chain.length < 2)
12
+ return undefined;
13
+ const resolved = chain[chain.length - 1];
14
+ const isRelative = !path.isAbsolute(raw);
15
+ return {
16
+ raw,
17
+ resolved,
18
+ isRelative,
19
+ chain: [path.resolve(filePath), ...chain],
20
+ };
21
+ }
22
+ catch {
23
+ return undefined;
24
+ }
25
+ }
26
+ export async function isSymlink(filePath) {
27
+ try {
28
+ const stats = await fs.lstat(filePath);
29
+ return stats.isSymbolicLink();
30
+ }
31
+ catch {
32
+ return false;
33
+ }
34
+ }
35
+ export async function resolveSymlinkChain(filePath) {
36
+ const chain = [];
37
+ let current = path.resolve(filePath);
38
+ try {
39
+ let stats = await fs.lstat(current);
40
+ if (!stats.isSymbolicLink()) {
41
+ return chain;
42
+ }
43
+ while (stats.isSymbolicLink()) {
44
+ const raw = await fs.readlink(current);
45
+ chain.push(raw);
46
+ current = path.isAbsolute(raw) ? raw : path.resolve(path.dirname(current), raw);
47
+ stats = await fs.lstat(current);
48
+ }
49
+ chain.push(current);
50
+ return chain;
51
+ }
52
+ catch {
53
+ return chain;
54
+ }
55
+ }
56
+ //# sourceMappingURL=symlink.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"symlink.js","sourceRoot":"","sources":["../src/symlink.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,QAAgB;IACjD,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACvC,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,EAAE,CAAC;YAC5B,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACxC,MAAM,KAAK,GAAG,MAAM,mBAAmB,CAAC,QAAQ,CAAC,CAAC;QAClD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,SAAS,CAAC;QACvC,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC;QAC1C,MAAM,UAAU,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QACzC,OAAO;YACL,GAAG;YACH,QAAQ;YACR,UAAU;YACV,KAAK,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,GAAG,KAAK,CAAC;SAC1C,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,QAAgB;IAC9C,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACvC,OAAO,KAAK,CAAC,cAAc,EAAE,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,QAAgB;IACxD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAErC,IAAI,CAAC;QACH,IAAI,KAAK,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACpC,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,EAAE,CAAC;YAC5B,OAAO,KAAK,CAAC;QACf,CAAC;QAED,OAAO,KAAK,CAAC,cAAc,EAAE,EAAE,CAAC;YAC9B,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YACvC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAChB,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,GAAG,CAAC,CAAC;YAChF,KAAK,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAClC,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACpB,OAAO,KAAK,CAAC;IACf,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { ScanResult, Diagnostic } from './types.js';
2
+ export declare function runChecks(result: ScanResult): Promise<Diagnostic[]>;
3
+ export declare function formatDiagnosticsForAI(diagnostics: Diagnostic[]): string;
4
+ //# sourceMappingURL=troubleshoot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"troubleshoot.d.ts","sourceRoot":"","sources":["../src/troubleshoot.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAA2B,UAAU,EAAE,MAAM,YAAY,CAAC;AAelF,wBAAsB,SAAS,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CA2KzE;AAED,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,UAAU,EAAE,GAAG,MAAM,CAUxE"}