trusttools 1.0.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -515,7 +515,6 @@ function createSymlink(target, linkPath, type = "dir") {
515
515
  }
516
516
  fs3.unlinkSync(linkPath);
517
517
  } else {
518
- console.warn(`Path exists but is not a symlink: ${linkPath}`);
519
518
  return false;
520
519
  }
521
520
  }
@@ -578,7 +577,7 @@ function getMachineId() {
578
577
  }
579
578
  function isAnalyticsEnabled() {
580
579
  try {
581
- if (process.env.SKILLSMAP_ANALYTICS === "false") {
580
+ if (process.env.TRUSTTOOLS_ANALYTICS === "false") {
582
581
  return false;
583
582
  }
584
583
  if (fs4.existsSync(ANALYTICS_ENABLED_FILE)) {
@@ -664,7 +663,7 @@ async function sendAnalytics(event, record) {
664
663
  version: record.version,
665
664
  cliVersion: getCliVersion()
666
665
  };
667
- const analyticsUrl = process.env.SKILLSMAP_ANALYTICS_URL || "http://localhost:8000/api/analytics/track";
666
+ const analyticsUrl = process.env.TRUSTTOOLS_ANALYTICS_URL || "https://skills.seebug.ai/api/analytics/track";
668
667
  const response = await fetch(analyticsUrl, {
669
668
  method: "POST",
670
669
  headers: {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../node_modules/tsup/assets/esm_shims.js","../src/index.ts","../src/commands/add.ts","../src/utils/logger.ts","../src/utils/source.ts","../src/utils/parser.ts","../src/utils/agents.ts","../src/utils/symlink.ts","../src/utils/analytics.ts","../src/commands/list.ts","../src/commands/find.ts","../src/ui/SkillSelector.tsx","../src/commands/manage.ts","../src/commands/update.ts","../src/commands/stats.ts","../src/commands/scan.ts","../src/ui/MainMenu.tsx"],"sourcesContent":["// Shim globals in esm bundle\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","#!/usr/bin/env node\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport { render } from 'ink';\nimport React from 'react';\nimport { addSkill } from './commands/add.js';\nimport { listSkills } from './commands/list.js';\nimport { findSkills } from './commands/find.js';\nimport { manageSkills } from './commands/manage.js';\nimport { updateSkills } from './commands/update.js';\nimport { showStats } from './commands/stats.js';\nimport { scanSkills } from './commands/scan.js';\nimport { detectAgents, getUniversalSkillsPath } from './utils/agents.js';\nimport { MainMenu } from './ui/MainMenu.js';\n\nconst program = new Command();\n\nprogram\n .name('trusttools')\n .description('Universal CLI tool for managing AI agent skills')\n .version('1.0.0');\n\n// Add skill command - supports both 'add skill <source>' and 'add <source>'\nprogram\n .command('add')\n .description('Add a skill from GitHub, local path, or URL')\n .argument('[type]', 'Optional: \"skill\" or \"docs\"')\n .argument('[source]', 'Skill source (user/repo, https://..., or local path)')\n .option('-s, --skill <name>', 'Specific skill name to install')\n .option('-g, --global', 'Install globally to home directory')\n .action(async (type: string | undefined, source: string | undefined, options: any) => {\n try {\n // Handle both formats:\n // 1. trusttools add skill openclaw/skills --skill gh-issues\n // 2. trusttools add openclaw/skills --skill gh-issues\n let actualSource: string;\n \n if (type === 'skill' || type === 'docs') {\n // Format: add skill <source>\n if (!source) {\n console.error(chalk.red('Error: source is required'));\n console.log(chalk.gray('Usage: trusttools add skill <source> [--skill <name>]'));\n process.exit(1);\n }\n actualSource = source;\n } else if (type) {\n // Format: add <source> (backward compatibility)\n actualSource = type;\n } else {\n console.error(chalk.red('Error: source is required'));\n console.log(chalk.gray('Usage: trusttools add [skill] <source> [--skill <name>]'));\n process.exit(1);\n }\n \n await addSkill(actualSource, options);\n } catch (error) {\n process.exit(1);\n }\n });\n\nprogram\n .command('find')\n .description('Find and interactively select skills from a source')\n .argument('<source>', 'Skill source (user/repo, https://..., or local path)')\n .action(async (source: string) => {\n try {\n await findSkills(source);\n } catch (error) {\n process.exit(1);\n }\n });\n\nprogram\n .command('list')\n .alias('ls')\n .description('List all installed skills')\n .action(() => {\n listSkills();\n });\n\nprogram\n .command('manage')\n .description('Manage installed skills (delete, view info)')\n .action(async () => {\n try {\n await manageSkills();\n } catch (error) {\n process.exit(1);\n }\n });\n\nprogram\n .command('update')\n .description('Update installed skills to latest version')\n .argument('[names...]', 'Specific skill names to update (updates all if not specified)')\n .action(async (names: string[]) => {\n try {\n await updateSkills(names);\n } catch (error) {\n process.exit(1);\n }\n });\n\nprogram\n .command('stats')\n .description('Show installation statistics')\n .action(() => {\n showStats();\n });\n\nprogram\n .command('scan')\n .description('Scan installed skills for security issues')\n .action(async () => {\n try {\n await scanSkills();\n } catch (error) {\n process.exit(1);\n }\n });\n\nprogram\n .command('info')\n .description('Show information about the current environment')\n .action(() => {\n const cwd = process.cwd();\n const agents = detectAgents(cwd);\n const universalPath = getUniversalSkillsPath(cwd);\n\n console.log(chalk.bold('\\nšŸ” Environment Information:\\n'));\n console.log(chalk.gray(`Current directory: ${cwd}`));\n console.log(chalk.gray(`Universal skills path: ${universalPath}\\n`));\n\n console.log(chalk.bold('Detected AI Agents:'));\n const detected = agents.filter(a => a.detected);\n if (detected.length > 0) {\n detected.forEach(agent => {\n console.log(chalk.green(` āœ“ ${agent.name} (${agent.type})`));\n console.log(chalk.gray(` Skills path: ${agent.skillsPath}`));\n });\n } else {\n console.log(chalk.yellow(' No agents detected'));\n console.log(chalk.gray(' Looking for: .cursor, .claude, .windsurf, etc.'));\n }\n console.log();\n });\n\n// If no command provided, show interactive menu\nif (!process.argv.slice(2).length) {\n const { waitUntilExit } = render(\n React.createElement(MainMenu, {\n onSelect: async (value: string) => {\n process.exit(0);\n },\n })\n );\n waitUntilExit().then(() => {});\n} else {\n program.parse();\n}\n","import fs from 'fs';\nimport path from 'path';\nimport simpleGit from 'simple-git';\nimport chalk from 'chalk';\nimport { createLogger } from '../utils/logger.js';\nimport { parseSource, getGitHubCloneUrl } from '../utils/source.js';\nimport { discoverSkills } from '../utils/parser.js';\nimport { detectAgents, ensureUniversalSkillsDir } from '../utils/agents.js';\nimport { linkSkillToAgents } from '../utils/symlink.js';\nimport { trackInstallation } from '../utils/analytics.js';\n\ninterface AddSkillOptions {\n skill?: string;\n global?: boolean;\n}\n\n/**\n * Add skill command handler\n */\nexport async function addSkill(source: string, options: AddSkillOptions = {}) {\n const cwd = process.cwd();\n const logger = createLogger();\n logger.start('Parsing source...');\n\n try {\n // Parse source\n const parsedSource = parseSource(source);\n logger.succeed('Source parsed: ' + parsedSource.type);\n\n let skillsDir: string;\n let tempDir: string | null = null;\n\n // Handle different source types\n if (parsedSource.type === 'github') {\n // Clone from GitHub\n logger.start('Cloning repository...');\n const cloneUrl = getGitHubCloneUrl(parsedSource);\n if (!cloneUrl) {\n throw new Error('Invalid GitHub URL');\n }\n\n tempDir = path.join(cwd, '.tmp', `${parsedSource.owner}-${parsedSource.repo}`);\n if (fs.existsSync(tempDir)) {\n fs.rmSync(tempDir, { recursive: true, force: true });\n }\n fs.mkdirSync(tempDir, { recursive: true });\n\n const git = simpleGit();\n await git.clone(cloneUrl, tempDir, ['--depth', '1']);\n \n skillsDir = parsedSource.path \n ? path.join(tempDir, parsedSource.path)\n : tempDir;\n \n logger.succeed('Repository cloned');\n } else if (parsedSource.type === 'local') {\n skillsDir = path.resolve(cwd, parsedSource.value);\n if (!fs.existsSync(skillsDir)) {\n throw new Error(`Local path not found: ${skillsDir}`);\n }\n logger.succeed('Local path found');\n } else {\n throw new Error(`Unsupported source type: ${parsedSource.type}`);\n }\n\n // Discover skills\n logger.start('Discovering skills...');\n let skills = discoverSkills(skillsDir, source);\n \n if (skills.length === 0) {\n logger.fail('No valid skills found');\n console.log(chalk.yellow('\\nA valid skill must have a SKILL.md file with:'));\n console.log(chalk.yellow(' - name: <skill name>'));\n console.log(chalk.yellow(' - description: <description>'));\n return;\n }\n\n // Filter by --skill option if provided\n if (options.skill) {\n const skillFilter = options.skill.toLowerCase();\n skills = skills.filter(s => \n s.metadata.name.toLowerCase().replace(/\\s+/g, '-') === skillFilter ||\n s.metadata.name.toLowerCase() === skillFilter\n );\n \n if (skills.length === 0) {\n logger.fail(`No skill found matching: ${options.skill}`);\n console.log(chalk.yellow('\\nAvailable skills:'));\n const allSkills = discoverSkills(skillsDir, source);\n allSkills.forEach(s => {\n console.log(chalk.gray(` - ${s.metadata.name.toLowerCase().replace(/\\s+/g, '-')}`));\n });\n return;\n }\n logger.succeed(`Found skill: ${skills[0].metadata.name}`);\n } else {\n logger.succeed(`Found ${skills.length} skill(s)`);\n }\n\n // Ensure universal skills directory\n const universalPath = ensureUniversalSkillsDir(cwd);\n\n // Detect agents\n const agents = detectAgents(cwd);\n const detectedAgents = agents.filter(a => a.detected);\n\n if (detectedAgents.length === 0) {\n console.log(chalk.yellow('\\nNo AI agents detected in current directory.'));\n console.log(chalk.yellow('Looking for: .cursor, .claude, .windsurf'));\n } else {\n console.log(chalk.green(`\\nDetected agents: ${detectedAgents.map(a => a.type).join(', ')}`));\n }\n\n // Install skills\n for (const skill of skills) {\n logger.start(`Installing ${skill.metadata.name}...`);\n\n // Copy skill to universal directory\n const skillName = skill.metadata.name.toLowerCase().replace(/\\s+/g, '-');\n const skillDestDir = path.join(universalPath, skillName);\n\n // Determine source directory (parent of SKILL.md)\n const skillSourceDir = path.dirname(skill.path);\n\n // Copy entire skill directory\n if (fs.existsSync(skillDestDir)) {\n fs.rmSync(skillDestDir, { recursive: true, force: true });\n }\n fs.mkdirSync(skillDestDir, { recursive: true });\n \n // Copy all files from skill directory\n copyDirectory(skillSourceDir, skillDestDir);\n\n // Save source information for updates\n const sourceFile = path.join(skillDestDir, '.source');\n fs.writeFileSync(sourceFile, source, 'utf-8');\n\n console.log(chalk.cyan(` Linking ${skill.metadata.name} to agents...`));\n\n // Create symlinks to detected agents\n const { success, linked } = linkSkillToAgents(skillName, universalPath, detectedAgents);\n\n if (success) {\n logger.succeed(\n `${skill.metadata.name} installed and linked to: ${linked.join(', ')}`\n );\n } else {\n logger.warn(\n `${skill.metadata.name} installed but not linked (no agents detected)`\n );\n }\n\n console.log(chalk.gray(` Location: ${skillDestDir}`));\n\n // Track installation analytics\n trackInstallation(\n skill.metadata.name,\n skillName,\n source,\n parsedSource.type,\n linked.map(a => a as any),\n options.global || false,\n skill.metadata.version\n );\n }\n\n // Cleanup temp directory\n if (tempDir && fs.existsSync(tempDir)) {\n fs.rmSync(tempDir, { recursive: true, force: true });\n }\n\n console.log(chalk.green('\\nāœ“ All skills installed successfully!'));\n } catch (error: any) {\n logger.fail('Installation failed');\n console.error(chalk.red(`\\nError: ${error.message}`));\n throw error;\n }\n}\n\n/**\n * Recursively copy directory\n */\nfunction copyDirectory(src: string, dest: string) {\n if (!fs.existsSync(dest)) {\n fs.mkdirSync(dest, { recursive: true });\n }\n\n const entries = fs.readdirSync(src, { withFileTypes: true });\n\n for (const entry of entries) {\n const srcPath = path.join(src, entry.name);\n const destPath = path.join(dest, entry.name);\n\n if (entry.isDirectory()) {\n copyDirectory(srcPath, destPath);\n } else {\n fs.copyFileSync(srcPath, destPath);\n }\n }\n}\n","import chalk from 'chalk';\n\nexport class Logger {\n private currentTask: string | null = null;\n\n start(message: string): void {\n this.currentTask = message;\n process.stdout.write(chalk.cyan(`ā³ ${message}\\n`));\n }\n\n succeed(message?: string): void {\n const msg = message || this.currentTask || 'Done';\n process.stdout.write(chalk.green(`āœ” ${msg}\\n`));\n this.currentTask = null;\n }\n\n fail(message?: string): void {\n const msg = message || this.currentTask || 'Failed';\n process.stdout.write(chalk.red(`āœ– ${msg}\\n`));\n this.currentTask = null;\n }\n\n info(message: string): void {\n console.log(chalk.blue(`ℹ ${message}`));\n }\n\n warn(message: string): void {\n console.log(chalk.yellow(`⚠ ${message}`));\n }\n\n error(message: string): void {\n console.log(chalk.red(`āœ– ${message}`));\n }\n}\n\nexport function createLogger(): Logger {\n return new Logger();\n}\n","import { SkillSource } from '../types.js';\n\n/**\n * Parse skill source string into structured format\n * Supports:\n * - \"keyword search\" (API search)\n * - user/repo (GitHub shorthand)\n * - https://github.com/user/repo (Full URL)\n * - org/repo/path/to/marketplace.json (Marketplace format)\n * - ./local/path or /absolute/path (Local path)\n */\nexport function parseSource(source: string): SkillSource {\n // Remove trailing slashes\n source = source.trim().replace(/\\/+$/, '');\n\n // Full URL\n if (source.startsWith('http://') || source.startsWith('https://')) {\n const url = new URL(source);\n \n if (url.hostname === 'github.com') {\n const parts = url.pathname.split('/').filter(Boolean);\n if (parts.length >= 2) {\n return {\n type: 'github',\n value: source,\n owner: parts[0],\n repo: parts[1].replace('.git', ''),\n path: parts.length > 2 ? parts.slice(2).join('/') : undefined,\n };\n }\n }\n \n return {\n type: 'url',\n value: source,\n };\n }\n\n // Local path\n if (source.startsWith('.') || source.startsWith('/')) {\n return {\n type: 'local',\n value: source,\n };\n }\n\n // GitHub shorthand: user/repo or user/repo/path\n const parts = source.split('/');\n if (parts.length >= 2) {\n return {\n type: 'github',\n value: source,\n owner: parts[0],\n repo: parts[1],\n path: parts.length > 2 ? parts.slice(2).join('/') : undefined,\n };\n }\n\n // Keyword search (no slashes, not a path)\n return {\n type: 'search',\n value: source,\n };\n}\n\n/**\n * Convert source to GitHub clone URL\n */\nexport function getGitHubCloneUrl(source: SkillSource): string | null {\n if (source.type !== 'github' || !source.owner || !source.repo) {\n return null;\n }\n return `https://github.com/${source.owner}/${source.repo}.git`;\n}\n","import fs from 'fs';\nimport path from 'path';\nimport matter from 'gray-matter';\nimport { Skill, SkillMetadata } from '../types.js';\n\n/**\n * Parse a SKILL.md file and extract metadata\n */\nexport function parseSkillFile(filePath: string, source: string): Skill | null {\n try {\n const content = fs.readFileSync(filePath, 'utf-8');\n const { data, content: markdownContent } = matter(content);\n\n // Validate required fields\n if (!data.name || !data.description) {\n console.warn(`Skipping ${filePath}: missing required fields (name, description)`);\n return null;\n }\n\n return {\n metadata: data as SkillMetadata,\n content: markdownContent,\n path: filePath,\n source,\n };\n } catch (error) {\n console.error(`Error parsing ${filePath}:`, error);\n return null;\n }\n}\n\n/**\n * Discover skills in a directory\n * Searches for SKILL.md files in:\n * 1. Root directory\n * 2. skills/ folder\n * 3. Recursive search in subdirectories\n */\nexport function discoverSkills(dir: string, source: string): Skill[] {\n const skills: Skill[] = [];\n\n // Check root SKILL.md\n const rootSkillPath = path.join(dir, 'SKILL.md');\n if (fs.existsSync(rootSkillPath)) {\n const skill = parseSkillFile(rootSkillPath, source);\n if (skill) skills.push(skill);\n }\n\n // Check skills/ folder\n const skillsDir = path.join(dir, 'skills');\n if (fs.existsSync(skillsDir) && fs.statSync(skillsDir).isDirectory()) {\n const entries = fs.readdirSync(skillsDir);\n for (const entry of entries) {\n const entryPath = path.join(skillsDir, entry);\n const stat = fs.statSync(entryPath);\n\n if (stat.isDirectory()) {\n // Check for SKILL.md in subdirectory\n const skillPath = path.join(entryPath, 'SKILL.md');\n if (fs.existsSync(skillPath)) {\n const skill = parseSkillFile(skillPath, source);\n if (skill) skills.push(skill);\n }\n } else if (entry === 'SKILL.md') {\n const skill = parseSkillFile(entryPath, source);\n if (skill) skills.push(skill);\n }\n }\n }\n\n // Recursive search (optional, can be limited by depth)\n const recursiveSearch = (currentDir: string, depth: number = 0, maxDepth: number = 2) => {\n if (depth > maxDepth) return;\n \n try {\n const entries = fs.readdirSync(currentDir);\n for (const entry of entries) {\n if (entry.startsWith('.') || entry === 'node_modules') continue;\n \n const entryPath = path.join(currentDir, entry);\n const stat = fs.statSync(entryPath);\n \n if (stat.isDirectory() && entryPath !== skillsDir) {\n const skillPath = path.join(entryPath, 'SKILL.md');\n if (fs.existsSync(skillPath)) {\n const skill = parseSkillFile(skillPath, source);\n if (skill) skills.push(skill);\n }\n recursiveSearch(entryPath, depth + 1, maxDepth);\n }\n }\n } catch (error) {\n // Ignore permission errors\n }\n };\n\n recursiveSearch(dir);\n\n return skills;\n}\n","import * as path from 'path';\nimport * as fs from 'fs';\nimport * as os from 'os';\nimport { AgentConfig, AgentType } from '../types.js';\n\n/**\n * Get all supported agents with their configurations\n */\nexport function getAllAgents(cwd: string = process.cwd()): AgentConfig[] {\n const homeDir = os.homedir();\n \n const agents: AgentConfig[] = [\n {\n type: 'adal',\n name: 'AdaL',\n detected: false,\n skillsPath: path.join(cwd, '.adal', 'skills'),\n globalPath: path.join(homeDir, '.adal', 'skills'),\n },\n {\n type: 'amp',\n name: 'Amp',\n detected: false,\n skillsPath: path.join(cwd, '.agents', 'skills'),\n globalPath: path.join(homeDir, '.agents', 'skills'),\n isUniversal: true,\n },\n {\n type: 'antigravity',\n name: 'Antigravity',\n detected: false,\n skillsPath: path.join(cwd, '.agent', 'skills'),\n globalPath: path.join(homeDir, '.gemini', 'antigravity', 'skills'),\n },\n {\n type: 'augment',\n name: 'Augment',\n detected: false,\n skillsPath: path.join(cwd, '.augment', 'rules'),\n globalPath: path.join(homeDir, '.augment', 'rules'),\n },\n {\n type: 'claude-code',\n name: 'Claude Code',\n detected: false,\n skillsPath: path.join(cwd, '.claude', 'skills'),\n globalPath: path.join(homeDir, '.claude', 'skills'),\n },\n {\n type: 'cline',\n name: 'Cline',\n detected: false,\n skillsPath: path.join(cwd, '.cline', 'skills'),\n globalPath: path.join(homeDir, '.cline', 'skills'),\n },\n {\n type: 'codebuddy',\n name: 'CodeBuddy',\n detected: false,\n skillsPath: path.join(cwd, '.codebuddy', 'skills'),\n globalPath: path.join(homeDir, '.codebuddy', 'skills'),\n },\n {\n type: 'codex',\n name: 'Codex',\n detected: false,\n skillsPath: path.join(cwd, '.agents', 'skills'),\n globalPath: path.join(homeDir, '.agents', 'skills'),\n isUniversal: true,\n },\n {\n type: 'command-code',\n name: 'Command Code',\n detected: false,\n skillsPath: path.join(cwd, '.commandcode', 'skills'),\n globalPath: path.join(homeDir, '.commandcode', 'skills'),\n },\n {\n type: 'continue',\n name: 'Continue',\n detected: false,\n skillsPath: path.join(cwd, '.continue', 'skills'),\n globalPath: path.join(homeDir, '.continue', 'skills'),\n },\n {\n type: 'cortex',\n name: 'Cortex Code',\n detected: false,\n skillsPath: path.join(cwd, '.cortex', 'skills'),\n globalPath: path.join(homeDir, '.snowflake', 'cortex', 'skills'),\n },\n {\n type: 'crush',\n name: 'Crush',\n detected: false,\n skillsPath: path.join(cwd, '.crush', 'skills'),\n globalPath: path.join(homeDir, '.config', 'crush', 'skills'),\n },\n {\n type: 'cursor',\n name: 'Cursor',\n detected: false,\n skillsPath: path.join(cwd, '.agents', 'skills'),\n globalPath: path.join(homeDir, '.cursor', 'skills'),\n isUniversal: true,\n },\n {\n type: 'droid',\n name: 'Droid',\n detected: false,\n skillsPath: path.join(cwd, '.agents', 'skills'),\n globalPath: path.join(homeDir, '.agents', 'skills'),\n isUniversal: true,\n },\n {\n type: 'gemini-cli',\n name: 'Gemini CLI',\n detected: false,\n skillsPath: path.join(cwd, '.agents', 'skills'),\n globalPath: path.join(homeDir, '.agents', 'skills'),\n isUniversal: true,\n },\n {\n type: 'github-copilot',\n name: 'GitHub Copilot',\n detected: false,\n skillsPath: path.join(cwd, '.agents', 'skills'),\n globalPath: path.join(homeDir, '.agents', 'skills'),\n isUniversal: true,\n },\n {\n type: 'goose',\n name: 'Goose',\n detected: false,\n skillsPath: path.join(cwd, '.goose', 'skills'),\n globalPath: path.join(homeDir, '.config', 'goose', 'skills'),\n },\n {\n type: 'iflow-cli',\n name: 'iFlow CLI',\n detected: false,\n skillsPath: path.join(cwd, '.iflow', 'skills'),\n globalPath: path.join(homeDir, '.iflow', 'skills'),\n },\n {\n type: 'junie',\n name: 'Junie',\n detected: false,\n skillsPath: path.join(cwd, '.junie', 'skills'),\n globalPath: path.join(homeDir, '.junie', 'skills'),\n },\n {\n type: 'kilo',\n name: 'Kilo Code',\n detected: false,\n skillsPath: path.join(cwd, '.kilocode', 'skills'),\n globalPath: path.join(homeDir, '.kilocode', 'skills'),\n },\n {\n type: 'kimi-cli',\n name: 'Kimi Code CLI',\n detected: false,\n skillsPath: path.join(cwd, '.agents', 'skills'),\n globalPath: path.join(homeDir, '.agents', 'skills'),\n isUniversal: true,\n },\n {\n type: 'kiro-cli',\n name: 'Kiro CLI',\n detected: false,\n skillsPath: path.join(cwd, '.kiro', 'skills'),\n globalPath: path.join(homeDir, '.kiro', 'skills'),\n },\n {\n type: 'kode',\n name: 'Kode',\n detected: false,\n skillsPath: path.join(cwd, '.kode', 'skills'),\n globalPath: path.join(homeDir, '.kode', 'skills'),\n },\n {\n type: 'mcpjam',\n name: 'MCPJam',\n detected: false,\n skillsPath: path.join(cwd, '.mcpjam', 'skills'),\n globalPath: path.join(homeDir, '.mcpjam', 'skills'),\n },\n {\n type: 'mistral-vibe',\n name: 'Mistral Vibe',\n detected: false,\n skillsPath: path.join(cwd, '.vibe', 'skills'),\n globalPath: path.join(homeDir, '.vibe', 'skills'),\n },\n {\n type: 'mux',\n name: 'Mux',\n detected: false,\n skillsPath: path.join(cwd, '.mux', 'skills'),\n globalPath: path.join(homeDir, '.mux', 'skills'),\n },\n {\n type: 'neovate',\n name: 'Neovate',\n detected: false,\n skillsPath: path.join(cwd, '.neovate', 'skills'),\n globalPath: path.join(homeDir, '.neovate', 'skills'),\n },\n {\n type: 'openclaw',\n name: 'OpenClaw',\n detected: false,\n skillsPath: path.join(cwd, 'skills'),\n globalPath: path.join(homeDir, '.openclaw', 'skills'),\n },\n {\n type: 'opencode',\n name: 'OpenCode',\n detected: false,\n skillsPath: path.join(cwd, '.agents', 'skills'),\n globalPath: path.join(homeDir, '.agents', 'skills'),\n isUniversal: true,\n },\n {\n type: 'openhands',\n name: 'OpenHands',\n detected: false,\n skillsPath: path.join(cwd, '.openhands', 'skills'),\n globalPath: path.join(homeDir, '.openhands', 'skills'),\n },\n {\n type: 'pi',\n name: 'Pi',\n detected: false,\n skillsPath: path.join(cwd, '.pi', 'skills'),\n globalPath: path.join(homeDir, '.pi', 'agent', 'skills'),\n },\n {\n type: 'pochi',\n name: 'Pochi',\n detected: false,\n skillsPath: path.join(cwd, '.pochi', 'skills'),\n globalPath: path.join(homeDir, '.pochi', 'skills'),\n },\n {\n type: 'qoder',\n name: 'Qoder',\n detected: false,\n skillsPath: path.join(cwd, '.qoder', 'skills'),\n globalPath: path.join(homeDir, '.qoder', 'skills'),\n },\n {\n type: 'qwen-code',\n name: 'Qwen Code',\n detected: false,\n skillsPath: path.join(cwd, '.qwen', 'skills'),\n globalPath: path.join(homeDir, '.qwen', 'skills'),\n },\n {\n type: 'replit',\n name: 'Replit',\n detected: false,\n skillsPath: path.join(cwd, '.agents', 'skills'),\n isUniversal: true,\n },\n {\n type: 'roo',\n name: 'Roo Code',\n detected: false,\n skillsPath: path.join(cwd, '.roo', 'skills'),\n globalPath: path.join(homeDir, '.roo', 'skills'),\n },\n {\n type: 'trae',\n name: 'Trae',\n detected: false,\n skillsPath: path.join(cwd, '.trae', 'skills'),\n globalPath: path.join(homeDir, '.trae', 'skills'),\n },\n {\n type: 'trae-cn',\n name: 'Trae CN',\n detected: false,\n skillsPath: path.join(cwd, '.trae', 'skills'),\n globalPath: path.join(homeDir, '.trae-cn', 'skills'),\n },\n {\n type: 'windsurf',\n name: 'Windsurf',\n detected: false,\n skillsPath: path.join(cwd, '.windsurf', 'skills'),\n globalPath: path.join(homeDir, '.codeium', 'windsurf', 'skills'),\n },\n {\n type: 'zencoder',\n name: 'Zencoder',\n detected: false,\n skillsPath: path.join(cwd, '.zencoder', 'skills'),\n globalPath: path.join(homeDir, '.zencoder', 'skills'),\n },\n {\n type: 'universal',\n name: 'Universal',\n detected: false,\n skillsPath: path.join(cwd, '.agents', 'skills'),\n globalPath: path.join(homeDir, '.agents', 'skills'),\n isUniversal: true,\n },\n ];\n\n return agents;\n}\n\n/**\n * Detect available AI agents in the current directory\n */\nexport function detectAgents(cwd: string = process.cwd()): AgentConfig[] {\n const agents = getAllAgents(cwd);\n\n // Check which agents are actually present\n for (const agent of agents) {\n const agentDir = path.dirname(agent.skillsPath);\n agent.detected = fs.existsSync(agentDir);\n }\n\n return agents;\n}\n\n/**\n * Get the universal skills directory path\n */\nexport function getUniversalSkillsPath(cwd: string = process.cwd()): string {\n return path.join(cwd, '.agents', 'skills');\n}\n\n/**\n * Ensure the universal skills directory exists\n */\nexport function ensureUniversalSkillsDir(cwd: string = process.cwd()): string {\n const skillsPath = getUniversalSkillsPath(cwd);\n if (!fs.existsSync(skillsPath)) {\n fs.mkdirSync(skillsPath, { recursive: true });\n }\n return skillsPath;\n}\n\n/**\n * Ensure agent skills directory exists\n */\nexport function ensureAgentSkillsDir(agent: AgentConfig): void {\n if (!fs.existsSync(agent.skillsPath)) {\n fs.mkdirSync(agent.skillsPath, { recursive: true });\n }\n}\n","import fs from 'fs';\nimport path from 'path';\nimport { AgentConfig } from '../types.js';\n\n/**\n * Create a symlink from agent skills directory to universal skills directory\n * Handles Windows permission issues\n */\nexport function createSymlink(\n target: string,\n linkPath: string,\n type: 'file' | 'dir' = 'dir'\n): boolean {\n try {\n // Check if symlink already exists\n if (fs.existsSync(linkPath)) {\n const stats = fs.lstatSync(linkPath);\n if (stats.isSymbolicLink()) {\n const existingTarget = fs.readlinkSync(linkPath);\n if (existingTarget === target) {\n return true; // Already linked correctly\n }\n // Remove old symlink\n fs.unlinkSync(linkPath);\n } else {\n console.warn(`Path exists but is not a symlink: ${linkPath}`);\n return false;\n }\n }\n\n // Ensure parent directory exists\n const parentDir = path.dirname(linkPath);\n if (!fs.existsSync(parentDir)) {\n fs.mkdirSync(parentDir, { recursive: true });\n }\n\n // Create symlink\n fs.symlinkSync(target, linkPath, type);\n return true;\n } catch (error: any) {\n if (error.code === 'EPERM' && process.platform === 'win32') {\n console.error(\n 'Permission denied. On Windows, you need to either:\\n' +\n '1. Run as Administrator, or\\n' +\n '2. Enable Developer Mode in Windows Settings'\n );\n } else {\n console.error(`Failed to create symlink: ${error.message}`);\n }\n return false;\n }\n}\n\n/**\n * Link a skill from universal directory to agent directories\n */\nexport function linkSkillToAgents(\n skillName: string,\n universalPath: string,\n agents: AgentConfig[]\n): { success: boolean; linked: string[] } {\n const linked: string[] = [];\n const skillSource = path.join(universalPath, skillName);\n\n for (const agent of agents) {\n const linkPath = path.join(agent.skillsPath, skillName);\n \n // Ensure agent skills directory exists\n if (!fs.existsSync(agent.skillsPath)) {\n fs.mkdirSync(agent.skillsPath, { recursive: true });\n }\n\n if (createSymlink(skillSource, linkPath, 'dir')) {\n linked.push(agent.type);\n }\n }\n\n return {\n success: linked.length > 0,\n linked,\n };\n}\n\n/**\n * Check if a path is a symlink\n */\nexport function isSymlink(filePath: string): boolean {\n try {\n const stats = fs.lstatSync(filePath);\n return stats.isSymbolicLink();\n } catch {\n return false;\n }\n}\n\n/**\n * Get symlink target\n */\nexport function getSymlinkTarget(linkPath: string): string | null {\n try {\n if (isSymlink(linkPath)) {\n return fs.readlinkSync(linkPath);\n }\n return null;\n } catch {\n return null;\n }\n}\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport * as os from 'os';\nimport * as crypto from 'crypto';\nimport { InstallationRecord, AnalyticsPayload, AgentType } from '../types.js';\n\nconst ANALYTICS_DIR = path.join(os.homedir(), '.trusttools');\nconst ANALYTICS_FILE = path.join(ANALYTICS_DIR, 'analytics.json');\nconst MACHINE_ID_FILE = path.join(ANALYTICS_DIR, 'machine-id');\nconst ANALYTICS_ENABLED_FILE = path.join(ANALYTICS_DIR, 'analytics-enabled');\n\n/**\n * Get or create machine ID for anonymous tracking\n */\nexport function getMachineId(): string {\n try {\n if (fs.existsSync(MACHINE_ID_FILE)) {\n return fs.readFileSync(MACHINE_ID_FILE, 'utf-8').trim();\n }\n\n const machineId = crypto.randomUUID();\n ensureAnalyticsDir();\n fs.writeFileSync(MACHINE_ID_FILE, machineId, 'utf-8');\n return machineId;\n } catch (error) {\n return 'unknown';\n }\n}\n\n/**\n * Check if analytics is enabled\n */\nexport function isAnalyticsEnabled(): boolean {\n try {\n // Check environment variable first\n if (process.env.SKILLSMAP_ANALYTICS === 'false') {\n return false;\n }\n\n // Check if user has explicitly disabled\n if (fs.existsSync(ANALYTICS_ENABLED_FILE)) {\n const enabled = fs.readFileSync(ANALYTICS_ENABLED_FILE, 'utf-8').trim();\n return enabled === 'true';\n }\n\n // Default: enabled\n return true;\n } catch (error) {\n return true;\n }\n}\n\n/**\n * Enable or disable analytics\n */\nexport function setAnalyticsEnabled(enabled: boolean): void {\n ensureAnalyticsDir();\n fs.writeFileSync(ANALYTICS_ENABLED_FILE, enabled ? 'true' : 'false', 'utf-8');\n}\n\n/**\n * Ensure analytics directory exists\n */\nfunction ensureAnalyticsDir(): void {\n if (!fs.existsSync(ANALYTICS_DIR)) {\n fs.mkdirSync(ANALYTICS_DIR, { recursive: true });\n }\n}\n\n/**\n * Load installation records from local storage\n */\nexport function loadInstallationRecords(): InstallationRecord[] {\n try {\n if (!fs.existsSync(ANALYTICS_FILE)) {\n return [];\n }\n\n const data = fs.readFileSync(ANALYTICS_FILE, 'utf-8');\n return JSON.parse(data);\n } catch (error) {\n return [];\n }\n}\n\n/**\n * Save installation records to local storage\n */\nexport function saveInstallationRecords(records: InstallationRecord[]): void {\n ensureAnalyticsDir();\n fs.writeFileSync(ANALYTICS_FILE, JSON.stringify(records, null, 2), 'utf-8');\n}\n\n/**\n * Track skill installation\n */\nexport function trackInstallation(\n skillName: string,\n skillSlug: string,\n source: string,\n sourceType: 'github' | 'local' | 'url',\n agents: AgentType[],\n isGlobal: boolean,\n version?: string\n): InstallationRecord {\n const record: InstallationRecord = {\n id: crypto.randomUUID(),\n skillName,\n skillSlug,\n source,\n sourceType,\n agents,\n timestamp: new Date().toISOString(),\n isGlobal,\n machineId: getMachineId(),\n version,\n };\n\n // Save locally\n const records = loadInstallationRecords();\n records.push(record);\n saveInstallationRecords(records);\n\n // Send to analytics server if enabled\n if (isAnalyticsEnabled()) {\n sendAnalytics('install', record).catch(() => {\n // Silently fail - analytics should not block installation\n });\n }\n\n return record;\n}\n\n/**\n * Track skill update\n */\nexport function trackUpdate(\n skillName: string,\n skillSlug: string,\n source: string,\n sourceType: 'github' | 'local' | 'url',\n agents: AgentType[],\n isGlobal: boolean,\n version?: string\n): void {\n const record: InstallationRecord = {\n id: crypto.randomUUID(),\n skillName,\n skillSlug,\n source,\n sourceType,\n agents,\n timestamp: new Date().toISOString(),\n isGlobal,\n machineId: getMachineId(),\n version,\n };\n\n if (isAnalyticsEnabled()) {\n sendAnalytics('update', record).catch(() => {});\n }\n}\n\n/**\n * Track skill removal\n */\nexport function trackRemoval(\n skillName: string,\n skillSlug: string,\n agents: AgentType[]\n): void {\n const record: InstallationRecord = {\n id: crypto.randomUUID(),\n skillName,\n skillSlug,\n source: '',\n sourceType: 'local',\n agents,\n timestamp: new Date().toISOString(),\n isGlobal: false,\n machineId: getMachineId(),\n };\n\n if (isAnalyticsEnabled()) {\n sendAnalytics('remove', record).catch(() => {});\n }\n}\n\n/**\n * Send analytics to server\n */\nasync function sendAnalytics(\n event: 'install' | 'update' | 'remove',\n record: InstallationRecord\n): Promise<void> {\n try {\n const payload: AnalyticsPayload = {\n event,\n skillName: record.skillName,\n skillSlug: record.skillSlug,\n source: record.source,\n sourceType: record.sourceType,\n agents: record.agents,\n timestamp: record.timestamp,\n isGlobal: record.isGlobal,\n machineId: record.machineId,\n version: record.version,\n cliVersion: getCliVersion(),\n };\n\n // TODO: Replace with your actual analytics endpoint\n const analyticsUrl = process.env.SKILLSMAP_ANALYTICS_URL || 'http://localhost:8000/api/analytics/track';\n\n const response = await fetch(analyticsUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n throw new Error(`Analytics request failed: ${response.status}`);\n }\n } catch (error) {\n // Silently fail - analytics should not block operations\n console.debug('Analytics error:', error);\n }\n}\n\n/**\n * Get CLI version from package.json\n */\nfunction getCliVersion(): string {\n try {\n const packageJsonPath = path.join(__dirname, '../../package.json');\n const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));\n return packageJson.version || '1.0.0';\n } catch (error) {\n return '1.0.0';\n }\n}\n\n/**\n * Get installation statistics\n */\nexport function getInstallationStats(): {\n totalInstalls: number;\n skillsByAgent: Record<string, number>;\n topSkills: Array<{ name: string; count: number }>;\n recentInstalls: InstallationRecord[];\n} {\n const records = loadInstallationRecords();\n\n const skillsByAgent: Record<string, number> = {};\n const skillCounts: Record<string, number> = {};\n\n records.forEach((record) => {\n record.agents.forEach((agent) => {\n skillsByAgent[agent] = (skillsByAgent[agent] || 0) + 1;\n });\n\n skillCounts[record.skillSlug] = (skillCounts[record.skillSlug] || 0) + 1;\n });\n\n const topSkills = Object.entries(skillCounts)\n .map(([name, count]) => ({ name, count }))\n .sort((a, b) => b.count - a.count)\n .slice(0, 10);\n\n const recentInstalls = records\n .sort((a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime())\n .slice(0, 20);\n\n return {\n totalInstalls: records.length,\n skillsByAgent,\n topSkills,\n recentInstalls,\n };\n}\n","import fs from 'fs';\nimport path from 'path';\nimport chalk from 'chalk';\nimport { getUniversalSkillsPath } from '../utils/agents.js';\nimport { parseSkillFile } from '../utils/parser.js';\nimport { isSymlink, getSymlinkTarget } from '../utils/symlink.js';\n\n/**\n * List installed skills\n */\nexport function listSkills() {\n const cwd = process.cwd();\n const universalPath = getUniversalSkillsPath(cwd);\n\n if (!fs.existsSync(universalPath)) {\n console.log(chalk.yellow('No skills installed yet.'));\n console.log(chalk.gray(`Run 'trusttools add <source>' to install skills.`));\n return;\n }\n\n const entries = fs.readdirSync(universalPath);\n const skills = entries.filter(entry => {\n const entryPath = path.join(universalPath, entry);\n return fs.statSync(entryPath).isDirectory();\n });\n\n if (skills.length === 0) {\n console.log(chalk.yellow('No skills installed yet.'));\n return;\n }\n\n console.log(chalk.bold(`\\nšŸ“¦ Installed Skills (${skills.length}):\\n`));\n\n for (const skillDir of skills) {\n const skillPath = path.join(universalPath, skillDir);\n const skillMdPath = path.join(skillPath, 'SKILL.md');\n\n if (fs.existsSync(skillMdPath)) {\n const skill = parseSkillFile(skillMdPath, 'local');\n if (skill) {\n console.log(chalk.green(` āœ“ ${skill.metadata.name}`));\n console.log(chalk.gray(` ${skill.metadata.description}`));\n \n if (skill.metadata.version) {\n console.log(chalk.gray(` Version: ${skill.metadata.version}`));\n }\n \n if (skill.metadata.tags && skill.metadata.tags.length > 0) {\n console.log(chalk.gray(` Tags: ${skill.metadata.tags.join(', ')}`));\n }\n \n console.log(chalk.gray(` Path: ${skillPath}`));\n console.log();\n }\n } else {\n console.log(chalk.yellow(` ⚠ ${skillDir} (no SKILL.md found)`));\n console.log();\n }\n }\n}\n","import fs from 'fs';\nimport path from 'path';\nimport simpleGit from 'simple-git';\nimport chalk from 'chalk';\nimport { createLogger } from '../utils/logger.js';\nimport { render } from 'ink';\nimport React from 'react';\nimport { parseSource, getGitHubCloneUrl } from '../utils/source.js';\nimport { discoverSkills } from '../utils/parser.js';\nimport { SkillSelector } from '../ui/SkillSelector.js';\nimport { Skill } from '../types.js';\nimport dotenv from 'dotenv';\n\ndotenv.config();\n\ninterface APISkill {\n id: number;\n name: string;\n description: string;\n version?: string;\n author?: string;\n tags?: string[];\n repo_owner: string;\n repo_name: string;\n repo_path: string;\n security_score?: number;\n security_level?: string;\n install_count?: number;\n}\n\ninterface APIResponse {\n success: boolean;\n data: APISkill[];\n}\n\n/**\n * Search skills from API\n */\nasync function findFromAPI(query: string) {\n const logger = createLogger();\n logger.start(`Searching for \"${query}\"...`);\n\n try {\n const apiUrl = process.env.TRUSTTOOLS_API_URL || 'https://skills.seebug.ai';\n const response = await fetch(`${apiUrl}/api/skills?search=${encodeURIComponent(query)}&limit=20`);\n \n if (!response.ok) {\n throw new Error(`API request failed: ${response.statusText}`);\n }\n\n const data = await response.json() as APIResponse;\n \n if (!data.success || !data.data || data.data.length === 0) {\n logger.fail('No skills found');\n console.log(chalk.yellow(`\\nNo skills found for \"${query}\"`));\n console.log(chalk.gray('\\nTry different keywords or browse skills at:'));\n console.log(chalk.cyan(` ${apiUrl}`));\n return;\n }\n\n logger.succeed(`Found ${data.data.length} skill(s)`);\n\n // Convert API response to Skill format\n const skills: Skill[] = data.data.map((skill: any) => {\n // Remove /SKILL.md from repo_path to get the skill directory\n let skillPath = skill.repo_path || '';\n if (skillPath.endsWith('/SKILL.md')) {\n skillPath = skillPath.slice(0, -9); // Remove '/SKILL.md'\n } else if (skillPath.endsWith('SKILL.md')) {\n skillPath = skillPath.slice(0, -8); // Remove 'SKILL.md'\n }\n \n return {\n metadata: {\n name: skill.name,\n description: skill.description,\n version: skill.version,\n author: skill.author,\n tags: skill.tags || [],\n security_score: skill.security_score,\n security_level: skill.security_level,\n install_count: skill.install_count,\n },\n content: '',\n path: skillPath,\n source: `${skill.repo_owner}/${skill.repo_name}${skillPath ? '/' + skillPath : ''}`,\n };\n });\n\n // Show interactive selector\n const { waitUntilExit } = render(\n React.createElement(SkillSelector, {\n skills,\n onSelect: (skill: Skill) => {\n console.log(chalk.green(`\\nāœ“ Selected: ${skill.metadata.name}`));\n console.log(chalk.gray(`\\nTo install this skill, run:`));\n console.log(chalk.cyan(` trusttools add ${skill.source}`));\n process.exit(0);\n },\n onCancel: () => {\n console.log(chalk.yellow('\\nCancelled'));\n process.exit(0);\n },\n })\n );\n\n await waitUntilExit();\n } catch (error: any) {\n logger.fail('Search failed');\n console.error(chalk.red(`\\nError: ${error.message}`));\n throw error;\n }\n}\n\n/**\n * Find skills from GitHub repository or local path\n */\nasync function findFromRepository(source: string, parsedSource: any) {\n const cwd = process.cwd();\n const logger = createLogger();\n \n let skillsDir: string;\n let tempDir: string | null = null;\n\n try {\n // Handle different source types\n if (parsedSource.type === 'github') {\n logger.start('Cloning repository...');\n const cloneUrl = getGitHubCloneUrl(parsedSource);\n if (!cloneUrl) {\n throw new Error('Invalid GitHub URL');\n }\n\n tempDir = path.join(cwd, '.tmp', `${parsedSource.owner}-${parsedSource.repo}`);\n if (fs.existsSync(tempDir)) {\n fs.rmSync(tempDir, { recursive: true, force: true });\n }\n fs.mkdirSync(tempDir, { recursive: true });\n\n const git = simpleGit();\n await git.clone(cloneUrl, tempDir, ['--depth', '1']);\n \n skillsDir = parsedSource.path \n ? path.join(tempDir, parsedSource.path)\n : tempDir;\n \n logger.succeed('Repository cloned');\n } else if (parsedSource.type === 'local') {\n skillsDir = path.resolve(cwd, parsedSource.value);\n if (!fs.existsSync(skillsDir)) {\n throw new Error(`Local path not found: ${skillsDir}`);\n }\n logger.succeed('Local path found');\n } else {\n throw new Error(`Unsupported source type: ${parsedSource.type}`);\n }\n\n // Discover skills\n logger.start('Discovering skills...');\n const skills = discoverSkills(skillsDir, source);\n \n if (skills.length === 0) {\n logger.fail('No valid skills found');\n console.log(chalk.yellow('\\nA valid skill must have a SKILL.md file with:'));\n console.log(chalk.yellow(' - name: <skill name>'));\n console.log(chalk.yellow(' - description: <description>'));\n \n // Cleanup\n if (tempDir && fs.existsSync(tempDir)) {\n fs.rmSync(tempDir, { recursive: true, force: true });\n }\n return;\n }\n\n logger.succeed(`Found ${skills.length} skill(s)`);\n\n // Show interactive selector\n const { waitUntilExit } = render(\n React.createElement(SkillSelector, {\n skills,\n onSelect: (skill: Skill) => {\n console.log(chalk.green(`\\nāœ“ Selected: ${skill.metadata.name}`));\n console.log(chalk.gray(`\\nTo install this skill, run:`));\n console.log(chalk.cyan(` trusttools add ${source} --skill ${skill.metadata.name.toLowerCase().replace(/\\s+/g, '-')}`));\n process.exit(0);\n },\n onCancel: () => {\n console.log(chalk.yellow('\\nCancelled'));\n process.exit(0);\n },\n })\n );\n\n await waitUntilExit();\n\n // Cleanup temp directory\n if (tempDir && fs.existsSync(tempDir)) {\n fs.rmSync(tempDir, { recursive: true, force: true });\n }\n } catch (error: any) {\n logger.fail('Failed to find skills');\n console.error(chalk.red(`\\nError: ${error.message}`));\n throw error;\n }\n}\n\n/**\n * Find and interactively select skills from a source\n * Supports both API search and repository scanning\n */\nexport async function findSkills(source: string) {\n const logger = createLogger();\n logger.start('Parsing source...');\n\n try {\n const parsedSource = parseSource(source);\n logger.succeed(`Source parsed: ${parsedSource.type}`);\n\n // Route to appropriate handler\n if (parsedSource.type === 'search') {\n await findFromAPI(parsedSource.value);\n } else {\n await findFromRepository(source, parsedSource);\n }\n } catch (error: any) {\n console.error(chalk.red(`\\nError: ${error.message}`));\n throw error;\n }\n}\n","import React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport { Skill } from '../types.js';\n\ninterface SkillSelectorProps {\n skills: Skill[];\n onSelect: (skill: Skill) => void;\n onCancel: () => void;\n}\n\nexport const SkillSelector: React.FC<SkillSelectorProps> = ({ skills, onSelect, onCancel }) => {\n const [selectedIndex, setSelectedIndex] = useState(0);\n\n useInput((input, key) => {\n if (key.upArrow) {\n setSelectedIndex(prev => Math.max(0, prev - 1));\n } else if (key.downArrow) {\n setSelectedIndex(prev => Math.min(skills.length - 1, prev + 1));\n } else if (key.return) {\n onSelect(skills[selectedIndex]);\n } else if (key.escape || input === 'q') {\n onCancel();\n }\n });\n\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n šŸ“¦ Found {skills.length} skill(s). Use ↑↓ to navigate, Enter to select, Esc to cancel:\n </Text>\n </Box>\n\n {skills.map((skill, index) => {\n const getSecurityColor = (score?: number) => {\n if (!score) return 'gray';\n if (score >= 81) return 'green';\n if (score >= 61) return 'yellow';\n if (score >= 41) return 'yellow';\n if (score >= 21) return 'red';\n return 'red';\n };\n \n const getSecurityLabel = (score?: number) => {\n if (!score) return '?';\n if (score >= 81) return 'āœ“';\n if (score >= 61) return '⚠';\n if (score >= 41) return '⚠';\n if (score >= 21) return 'āœ—';\n return 'āœ—';\n };\n\n return (\n <Box key={index} marginLeft={2} flexDirection=\"column\">\n <Box>\n <Text color={index === selectedIndex ? 'green' : 'white'}>\n {index === selectedIndex ? 'ā–¶ ' : ' '}\n <Text bold>{skill.metadata.name}</Text>\n {skill.metadata.security_score !== undefined && (\n <Text color={getSecurityColor(skill.metadata.security_score)}>\n {' ['}{getSecurityLabel(skill.metadata.security_score)} {skill.metadata.security_score}]\n </Text>\n )}\n {skill.metadata.install_count !== undefined && (\n <Text dimColor> (↓{skill.metadata.install_count})</Text>\n )}\n </Text>\n </Box>\n <Box marginLeft={4}>\n <Text dimColor>{skill.metadata.description}</Text>\n </Box>\n </Box>\n );\n })}\n\n <Box marginTop={1}>\n <Text dimColor>\n {skills[selectedIndex]?.metadata.tags && (\n `Tags: ${skills[selectedIndex].metadata.tags.join(', ')}`\n )}\n </Text>\n </Box>\n </Box>\n );\n};\n","import fs from 'fs';\nimport path from 'path';\nimport chalk from 'chalk';\nimport { render } from 'ink';\nimport React from 'react';\nimport SelectInput from 'ink-select-input';\nimport { Box, Text } from 'ink';\nimport { getUniversalSkillsPath } from '../utils/agents.js';\nimport { parseSkillFile } from '../utils/parser.js';\nimport { trackRemoval } from '../utils/analytics.js';\nimport { createLogger } from '../utils/logger.js';\n\ninterface SkillItem {\n label: string;\n value: string;\n}\n\n/**\n * Manage installed skills\n */\nexport async function manageSkills() {\n const cwd = process.cwd();\n const universalPath = getUniversalSkillsPath(cwd);\n\n if (!fs.existsSync(universalPath)) {\n console.log(chalk.yellow('No skills installed yet.'));\n return;\n }\n\n const skillDirs = fs.readdirSync(universalPath).filter((item) => {\n const itemPath = path.join(universalPath, item);\n return fs.statSync(itemPath).isDirectory();\n });\n\n if (skillDirs.length === 0) {\n console.log(chalk.yellow('No skills installed yet.'));\n return;\n }\n\n // Build skill list\n const skills: SkillItem[] = skillDirs.map((dir) => {\n const skillPath = path.join(universalPath, dir);\n const skillMdPath = path.join(skillPath, 'SKILL.md');\n\n let label = dir;\n if (fs.existsSync(skillMdPath)) {\n try {\n const skill = parseSkillFile(skillMdPath, dir);\n if (skill) {\n label = `${skill.metadata.name} (${dir})`;\n }\n } catch (error) {\n // Use directory name if parsing fails\n }\n }\n\n return { label, value: dir };\n });\n\n skills.push({ label: chalk.gray('← Back'), value: '__back__' });\n\n console.log(chalk.cyan('\\nšŸ“‹ Installed Skills:\\n'));\n\n // Show interactive selector\n const { waitUntilExit } = render(\n React.createElement(\n Box,\n { flexDirection: 'column', padding: 1 },\n React.createElement(Text, { dimColor: true }, 'Select a skill to manage:'),\n React.createElement(SelectInput, {\n items: skills,\n onSelect: (item: any) => {\n if (item.value === '__back__') {\n process.exit(0);\n }\n\n // Show action menu\n showActionMenu(item.value, universalPath, cwd).then(() => {});\n },\n })\n )\n );\n\n await waitUntilExit();\n}\n\n/**\n * Show action menu for a skill\n */\nasync function showActionMenu(skillSlug: string, universalPath: string, cwd: string) {\n const actions = [\n { label: 'šŸ—‘ļø Delete', value: 'delete' },\n { label: 'ā„¹ļø Show Info', value: 'info' },\n { label: '← Back', value: 'back' },\n ];\n\n const { waitUntilExit, clear } = render(\n React.createElement(\n Box,\n { flexDirection: 'column', padding: 1 },\n React.createElement(Text, { bold: true }, `Manage: ${skillSlug}`),\n React.createElement(Text, { dimColor: true }, '\\nSelect an action:'),\n React.createElement(SelectInput, {\n items: actions,\n onSelect: (item: any) => {\n clear();\n\n if (item.value === 'back') {\n process.exit(0);\n } else if (item.value === 'delete') {\n deleteSkill(skillSlug, universalPath, cwd).then(() => process.exit(0));\n } else if (item.value === 'info') {\n showSkillInfo(skillSlug, universalPath).then(() => process.exit(0));\n }\n },\n })\n )\n );\n\n await waitUntilExit();\n}\n\n/**\n * Delete a skill\n */\nasync function deleteSkill(skillSlug: string, universalPath: string, cwd: string) {\n const logger = createLogger();\n const skillPath = path.join(universalPath, skillSlug);\n\n logger.start(`Deleting ${skillSlug}...`);\n\n try {\n // Find and remove symlinks\n const agentDirs = ['.cursor', '.claude', '.windsurf', '.cline', '.continue', '.goose'];\n const removedLinks: string[] = [];\n\n for (const agentDir of agentDirs) {\n const agentSkillsPath = path.join(cwd, agentDir, 'skills');\n const linkPath = path.join(agentSkillsPath, skillSlug);\n\n if (fs.existsSync(linkPath)) {\n const stats = fs.lstatSync(linkPath);\n if (stats.isSymbolicLink()) {\n fs.unlinkSync(linkPath);\n removedLinks.push(agentDir.replace('.', ''));\n }\n }\n }\n\n // Remove skill directory\n fs.rmSync(skillPath, { recursive: true, force: true });\n\n // Track removal\n trackRemoval(skillSlug, skillSlug, removedLinks as any);\n\n logger.succeed(`${skillSlug} deleted successfully`);\n if (removedLinks.length > 0) {\n console.log(chalk.gray(` Removed from: ${removedLinks.join(', ')}`));\n }\n } catch (error: any) {\n logger.fail(`Failed to delete ${skillSlug}`);\n console.error(chalk.red(`Error: ${error.message}`));\n }\n}\n\n/**\n * Show skill information\n */\nasync function showSkillInfo(skillSlug: string, universalPath: string) {\n const skillPath = path.join(universalPath, skillSlug);\n const skillMdPath = path.join(skillPath, 'SKILL.md');\n\n console.log(chalk.cyan(`\\nšŸ“„ Skill: ${skillSlug}\\n`));\n console.log(chalk.gray(`Location: ${skillPath}\\n`));\n\n if (fs.existsSync(skillMdPath)) {\n try {\n const skill = parseSkillFile(skillMdPath, skillSlug);\n if (!skill) {\n console.log(chalk.yellow('Could not parse SKILL.md'));\n return;\n }\n const { metadata, content } = skill;\n\n console.log(chalk.bold('Metadata:'));\n console.log(` Name: ${metadata.name}`);\n console.log(` Description: ${metadata.description}`);\n if (metadata.version) console.log(` Version: ${metadata.version}`);\n if (metadata.author) console.log(` Author: ${metadata.author}`);\n if (metadata.tags) console.log(` Tags: ${metadata.tags.join(', ')}`);\n\n console.log(chalk.bold('\\nContent Preview:'));\n const preview = content.split('\\n').slice(0, 10).join('\\n');\n console.log(chalk.gray(preview));\n if (content.split('\\n').length > 10) {\n console.log(chalk.gray('...'));\n }\n } catch (error) {\n console.log(chalk.yellow('Could not parse SKILL.md'));\n }\n } else {\n console.log(chalk.yellow('No SKILL.md found'));\n }\n}\n","import fs from 'fs';\nimport path from 'path';\nimport chalk from 'chalk';\nimport { getUniversalSkillsPath } from '../utils/agents.js';\nimport { parseSkillFile } from '../utils/parser.js';\nimport { addSkill } from './add.js';\nimport { createLogger } from '../utils/logger.js';\n\n/**\n * Update installed skills\n */\nexport async function updateSkills(skillNames?: string[]) {\n const cwd = process.cwd();\n const universalPath = getUniversalSkillsPath(cwd);\n const logger = createLogger();\n\n if (!fs.existsSync(universalPath)) {\n console.log(chalk.yellow('No skills installed yet.'));\n return;\n }\n\n const skillDirs = fs.readdirSync(universalPath).filter((item) => {\n const itemPath = path.join(universalPath, item);\n return fs.statSync(itemPath).isDirectory();\n });\n\n if (skillDirs.length === 0) {\n console.log(chalk.yellow('No skills installed yet.'));\n return;\n }\n\n // Filter skills if specific names provided\n let skillsToUpdate = skillDirs;\n if (skillNames && skillNames.length > 0) {\n skillsToUpdate = skillDirs.filter((dir) => skillNames.includes(dir));\n \n if (skillsToUpdate.length === 0) {\n console.log(chalk.yellow('No matching skills found.'));\n console.log(chalk.gray('\\nInstalled skills:'));\n skillDirs.forEach((dir) => console.log(chalk.gray(` - ${dir}`)));\n return;\n }\n }\n\n console.log(chalk.cyan(`\\nšŸ”„ Updating ${skillsToUpdate.length} skill(s)...\\n`));\n\n let updated = 0;\n let failed = 0;\n let skipped = 0;\n\n for (const skillSlug of skillsToUpdate) {\n const skillPath = path.join(universalPath, skillSlug);\n const skillMdPath = path.join(skillPath, 'SKILL.md');\n const sourceFile = path.join(skillPath, '.source');\n\n // Check if we have source information\n if (!fs.existsSync(sourceFile)) {\n logger.warn(`${skillSlug}: No source information, skipping`);\n skipped++;\n continue;\n }\n\n try {\n const source = fs.readFileSync(sourceFile, 'utf-8').trim();\n \n // Parse current version\n let currentVersion = 'unknown';\n if (fs.existsSync(skillMdPath)) {\n const skill = parseSkillFile(skillMdPath, skillSlug);\n if (skill && skill.metadata.version) {\n currentVersion = skill.metadata.version;\n }\n }\n\n logger.start(`Updating ${skillSlug} (current: ${currentVersion})...`);\n\n // Re-install the skill (this will fetch latest version)\n await addSkill(source, { skill: skillSlug });\n\n logger.succeed(`${skillSlug} updated successfully`);\n updated++;\n } catch (error: any) {\n logger.fail(`${skillSlug}: Update failed`);\n console.error(chalk.red(` Error: ${error.message}`));\n failed++;\n }\n }\n\n // Summary\n console.log(chalk.cyan('\\nšŸ“Š Update Summary:'));\n console.log(chalk.green(` āœ“ Updated: ${updated}`));\n if (skipped > 0) console.log(chalk.yellow(` ⊘ Skipped: ${skipped}`));\n if (failed > 0) console.log(chalk.red(` āœ– Failed: ${failed}`));\n}\n","import chalk from 'chalk';\nimport { getInstallationStats } from '../utils/analytics.js';\n\n/**\n * Show installation statistics\n */\nexport function showStats() {\n const stats = getInstallationStats();\n\n console.log(chalk.cyan('\\nšŸ“Š Installation Statistics\\n'));\n\n // Total installs\n console.log(chalk.bold('Total Installations:'), stats.totalInstalls);\n\n // Skills by agent\n if (Object.keys(stats.skillsByAgent).length > 0) {\n console.log(chalk.bold('\\nInstallations by Agent:'));\n const sortedAgents = Object.entries(stats.skillsByAgent)\n .sort(([, a], [, b]) => b - a);\n \n sortedAgents.forEach(([agent, count]) => {\n const bar = 'ā–ˆ'.repeat(Math.min(count, 20));\n console.log(` ${agent.padEnd(20)} ${bar} ${count}`);\n });\n }\n\n // Top skills\n if (stats.topSkills.length > 0) {\n console.log(chalk.bold('\\nTop Installed Skills:'));\n stats.topSkills.forEach((skill, index) => {\n console.log(` ${index + 1}. ${skill.name.padEnd(30)} (${skill.count} installs)`);\n });\n }\n\n // Recent installs\n if (stats.recentInstalls.length > 0) {\n console.log(chalk.bold('\\nRecent Installations:'));\n stats.recentInstalls.slice(0, 5).forEach((record) => {\n const date = new Date(record.timestamp).toLocaleString();\n const agents = record.agents.join(', ');\n console.log(chalk.gray(` ${date}`));\n console.log(` ${record.skillName} → ${agents}`);\n });\n }\n\n if (stats.totalInstalls === 0) {\n console.log(chalk.yellow('No installation data yet. Install some skills to see statistics!'));\n }\n}\n","import fs from 'fs';\nimport path from 'path';\nimport chalk from 'chalk';\nimport { createLogger } from '../utils/logger.js';\nimport { detectAgents } from '../utils/agents.js';\n\ninterface APISkillResponse {\n success: boolean;\n data: Array<{\n name: string;\n repo_owner: string;\n repo_name: string;\n security_score?: number;\n security_level?: string;\n }>;\n}\n\ninterface SecurityCheckResult {\n skillName: string;\n skillPath: string;\n source?: string;\n security_score?: number;\n security_level?: string;\n status: 'safe' | 'warning' | 'danger' | 'unknown';\n}\n\n/**\n * Get security level label and color\n */\nfunction getSecurityDisplay(score?: number): { label: string; color: string; icon: string } {\n if (!score) {\n return { label: 'UNKNOWN', color: 'gray', icon: '?' };\n }\n if (score >= 81) {\n return { label: 'SAFE', color: 'green', icon: 'āœ“' };\n }\n if (score >= 61) {\n return { label: 'LOW RISK', color: 'yellow', icon: '⚠' };\n }\n if (score >= 41) {\n return { label: 'MEDIUM RISK', color: 'yellow', icon: '⚠' };\n }\n if (score >= 21) {\n return { label: 'HIGH RISK', color: 'red', icon: 'āœ—' };\n }\n return { label: 'CRITICAL', color: 'red', icon: 'āœ—' };\n}\n\n/**\n * Check skill security via API\n */\nasync function checkSkillSecurity(skillName: string, source?: string): Promise<SecurityCheckResult> {\n try {\n const apiUrl = process.env.TRUSTTOOLS_API_URL || 'https://skills.seebug.ai';\n \n // Try to search by name first\n const response = await fetch(`${apiUrl}/api/skills?search=${encodeURIComponent(skillName)}&limit=5`);\n \n if (!response.ok) {\n return {\n skillName,\n skillPath: '',\n source,\n status: 'unknown',\n };\n }\n\n const data = await response.json() as APISkillResponse;\n \n if (data.success && data.data && data.data.length > 0) {\n // Find exact match or best match\n const match = data.data.find((s) => \n s.name.toLowerCase() === skillName.toLowerCase()\n ) || data.data[0];\n \n const score = match.security_score;\n let status: 'safe' | 'warning' | 'danger' | 'unknown' = 'unknown';\n \n if (score !== undefined) {\n if (score >= 61) status = 'safe';\n else if (score >= 41) status = 'warning';\n else status = 'danger';\n }\n \n return {\n skillName,\n skillPath: '',\n source: `${match.repo_owner}/${match.repo_name}`,\n security_score: match.security_score,\n security_level: match.security_level,\n status,\n };\n }\n \n return {\n skillName,\n skillPath: '',\n source,\n status: 'unknown',\n };\n } catch (error) {\n return {\n skillName,\n skillPath: '',\n source,\n status: 'unknown',\n };\n }\n}\n\n/**\n * Scan installed skills for security issues\n */\nexport async function scanSkills() {\n const cwd = process.cwd();\n const logger = createLogger();\n \n logger.start('Detecting installed agents...');\n const agents = detectAgents(cwd);\n const detectedAgents = agents.filter(a => a.detected);\n \n if (detectedAgents.length === 0) {\n logger.fail('No agents detected');\n console.log(chalk.yellow('\\nNo AI agents found in current directory.'));\n console.log(chalk.gray('Run this command in a project with .cursor/, .claude/, or .windsurf/ directories.'));\n return;\n }\n \n logger.succeed(`Found ${detectedAgents.length} agent(s)`);\n \n // Collect all skills\n const allSkills: Array<{ name: string; path: string; agent: string }> = [];\n \n for (const agent of detectedAgents) {\n if (fs.existsSync(agent.skillsPath)) {\n const skillDirs = fs.readdirSync(agent.skillsPath, { withFileTypes: true })\n .filter(dirent => dirent.isDirectory())\n .map(dirent => dirent.name);\n \n for (const skillName of skillDirs) {\n const skillPath = path.join(agent.skillsPath, skillName);\n const skillMdPath = path.join(skillPath, 'SKILL.md');\n \n if (fs.existsSync(skillMdPath)) {\n allSkills.push({\n name: skillName,\n path: skillPath,\n agent: agent.name,\n });\n }\n }\n }\n }\n \n if (allSkills.length === 0) {\n logger.info('No skills installed');\n console.log(chalk.yellow('\\nNo skills found in detected agents.'));\n return;\n }\n \n console.log(chalk.cyan(`\\nšŸ” Scanning ${allSkills.length} skill(s) for security issues...\\n`));\n \n // Check security for each skill\n const results: SecurityCheckResult[] = [];\n \n for (const skill of allSkills) {\n const result = await checkSkillSecurity(skill.name);\n result.skillPath = skill.path;\n results.push(result);\n }\n \n // Categorize results\n const safe = results.filter(r => r.status === 'safe');\n const warning = results.filter(r => r.status === 'warning');\n const danger = results.filter(r => r.status === 'danger');\n const unknown = results.filter(r => r.status === 'unknown');\n \n // Display results\n console.log(chalk.bold('šŸ“Š Security Scan Results:\\n'));\n \n // Summary\n console.log(chalk.bold('Summary:'));\n console.log(chalk.green(` āœ“ Safe: ${safe.length}`));\n console.log(chalk.yellow(` ⚠ Warning: ${warning.length}`));\n console.log(chalk.red(` āœ— Danger: ${danger.length}`));\n console.log(chalk.gray(` ? Unknown: ${unknown.length}`));\n console.log();\n \n // Dangerous skills\n if (danger.length > 0) {\n console.log(chalk.bold.red('🚨 High Risk Skills:\\n'));\n for (const skill of danger) {\n const display = getSecurityDisplay(skill.security_score);\n console.log(chalk.red(` ${display.icon} ${skill.skillName}`));\n console.log(chalk.gray(` Score: ${skill.security_score || 'N/A'}`));\n console.log(chalk.gray(` Level: ${display.label}`));\n if (skill.source) {\n console.log(chalk.gray(` Source: ${skill.source}`));\n }\n console.log();\n }\n }\n \n // Warning skills\n if (warning.length > 0) {\n console.log(chalk.bold.yellow('āš ļø Medium Risk Skills:\\n'));\n for (const skill of warning) {\n const display = getSecurityDisplay(skill.security_score);\n console.log(chalk.yellow(` ${display.icon} ${skill.skillName}`));\n console.log(chalk.gray(` Score: ${skill.security_score || 'N/A'}`));\n console.log(chalk.gray(` Level: ${display.label}`));\n if (skill.source) {\n console.log(chalk.gray(` Source: ${skill.source}`));\n }\n console.log();\n }\n }\n \n // Safe skills (only show count)\n if (safe.length > 0) {\n console.log(chalk.bold.green(`āœ“ ${safe.length} skill(s) are safe\\n`));\n }\n \n // Unknown skills\n if (unknown.length > 0) {\n console.log(chalk.bold.gray(`? ${unknown.length} skill(s) could not be verified\\n`));\n }\n \n // Recommendations\n if (danger.length > 0 || warning.length > 0) {\n console.log(chalk.bold('\\nšŸ’” Recommendations:\\n'));\n if (danger.length > 0) {\n console.log(chalk.red(' • Consider removing high-risk skills immediately'));\n }\n if (warning.length > 0) {\n console.log(chalk.yellow(' • Review medium-risk skills and update if possible'));\n }\n console.log(chalk.gray(' • Check skill sources and verify they are from trusted repositories'));\n console.log(chalk.gray(' • Keep skills updated to the latest versions'));\n }\n}\n","import React, { useState } from 'react';\nimport { Box, Text } from 'ink';\nimport SelectInput from 'ink-select-input';\n\ninterface MenuItem {\n label: string;\n value: string;\n}\n\ninterface MainMenuProps {\n onSelect: (value: string) => void;\n}\n\nexport const MainMenu: React.FC<MainMenuProps> = ({ onSelect }) => {\n const items: MenuItem[] = [\n { label: 'šŸ” Find Skills', value: 'find' },\n { label: 'āž• Add Skill', value: 'add' },\n { label: 'šŸ“‹ List Installed Skills', value: 'list' },\n { label: 'šŸ”„ Update Skills', value: 'update' },\n { label: 'āš™ļø Manage Skills', value: 'manage' },\n { label: 'ā„¹ļø Environment Info', value: 'info' },\n { label: 'šŸ“Š Installation Stats', value: 'stats' },\n { label: 'āŒ Exit', value: 'exit' },\n ];\n\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n TrustTools - Universal AI Agent Skills Manager\n </Text>\n </Box>\n <Box marginBottom={1}>\n <Text dimColor>Select an action:</Text>\n </Box>\n <SelectInput items={items} onSelect={(item) => onSelect(item.value)} />\n </Box>\n );\n};\n"],"mappings":"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","names":["chalk","render","React","fs","path","chalk","parts","path","path","fs","fs","path","fs","path","os","path","fs","chalk","fs","path","chalk","fs","chalk","path","fs","path","simpleGit","chalk","React","chalk","React","path","fs","simpleGit","fs","path","chalk","render","React","Box","Text","fs","chalk","path","render","React","Box","Text","fs","path","chalk","fs","chalk","path","chalk","chalk","fs","path","chalk","chalk","fs","path","React","Box","Text","SelectInput","chalk","render","React"]}
1
+ {"version":3,"sources":["../node_modules/tsup/assets/esm_shims.js","../src/index.ts","../src/commands/add.ts","../src/utils/logger.ts","../src/utils/source.ts","../src/utils/parser.ts","../src/utils/agents.ts","../src/utils/symlink.ts","../src/utils/analytics.ts","../src/commands/list.ts","../src/commands/find.ts","../src/ui/SkillSelector.tsx","../src/commands/manage.ts","../src/commands/update.ts","../src/commands/stats.ts","../src/commands/scan.ts","../src/ui/MainMenu.tsx"],"sourcesContent":["// Shim globals in esm bundle\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","#!/usr/bin/env node\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport { render } from 'ink';\nimport React from 'react';\nimport { addSkill } from './commands/add.js';\nimport { listSkills } from './commands/list.js';\nimport { findSkills } from './commands/find.js';\nimport { manageSkills } from './commands/manage.js';\nimport { updateSkills } from './commands/update.js';\nimport { showStats } from './commands/stats.js';\nimport { scanSkills } from './commands/scan.js';\nimport { detectAgents, getUniversalSkillsPath } from './utils/agents.js';\nimport { MainMenu } from './ui/MainMenu.js';\n\nconst program = new Command();\n\nprogram\n .name('trusttools')\n .description('Universal CLI tool for managing AI agent skills')\n .version('1.0.0');\n\n// Add skill command - supports both 'add skill <source>' and 'add <source>'\nprogram\n .command('add')\n .description('Add a skill from GitHub, local path, or URL')\n .argument('[type]', 'Optional: \"skill\" or \"docs\"')\n .argument('[source]', 'Skill source (user/repo, https://..., or local path)')\n .option('-s, --skill <name>', 'Specific skill name to install')\n .option('-g, --global', 'Install globally to home directory')\n .action(async (type: string | undefined, source: string | undefined, options: any) => {\n try {\n // Handle both formats:\n // 1. trusttools add skill openclaw/skills --skill gh-issues\n // 2. trusttools add openclaw/skills --skill gh-issues\n let actualSource: string;\n \n if (type === 'skill' || type === 'docs') {\n // Format: add skill <source>\n if (!source) {\n console.error(chalk.red('Error: source is required'));\n console.log(chalk.gray('Usage: trusttools add skill <source> [--skill <name>]'));\n process.exit(1);\n }\n actualSource = source;\n } else if (type) {\n // Format: add <source> (backward compatibility)\n actualSource = type;\n } else {\n console.error(chalk.red('Error: source is required'));\n console.log(chalk.gray('Usage: trusttools add [skill] <source> [--skill <name>]'));\n process.exit(1);\n }\n \n await addSkill(actualSource, options);\n } catch (error) {\n process.exit(1);\n }\n });\n\nprogram\n .command('find')\n .description('Find and interactively select skills from a source')\n .argument('<source>', 'Skill source (user/repo, https://..., or local path)')\n .action(async (source: string) => {\n try {\n await findSkills(source);\n } catch (error) {\n process.exit(1);\n }\n });\n\nprogram\n .command('list')\n .alias('ls')\n .description('List all installed skills')\n .action(() => {\n listSkills();\n });\n\nprogram\n .command('manage')\n .description('Manage installed skills (delete, view info)')\n .action(async () => {\n try {\n await manageSkills();\n } catch (error) {\n process.exit(1);\n }\n });\n\nprogram\n .command('update')\n .description('Update installed skills to latest version')\n .argument('[names...]', 'Specific skill names to update (updates all if not specified)')\n .action(async (names: string[]) => {\n try {\n await updateSkills(names);\n } catch (error) {\n process.exit(1);\n }\n });\n\nprogram\n .command('stats')\n .description('Show installation statistics')\n .action(() => {\n showStats();\n });\n\nprogram\n .command('scan')\n .description('Scan installed skills for security issues')\n .action(async () => {\n try {\n await scanSkills();\n } catch (error) {\n process.exit(1);\n }\n });\n\nprogram\n .command('info')\n .description('Show information about the current environment')\n .action(() => {\n const cwd = process.cwd();\n const agents = detectAgents(cwd);\n const universalPath = getUniversalSkillsPath(cwd);\n\n console.log(chalk.bold('\\nšŸ” Environment Information:\\n'));\n console.log(chalk.gray(`Current directory: ${cwd}`));\n console.log(chalk.gray(`Universal skills path: ${universalPath}\\n`));\n\n console.log(chalk.bold('Detected AI Agents:'));\n const detected = agents.filter(a => a.detected);\n if (detected.length > 0) {\n detected.forEach(agent => {\n console.log(chalk.green(` āœ“ ${agent.name} (${agent.type})`));\n console.log(chalk.gray(` Skills path: ${agent.skillsPath}`));\n });\n } else {\n console.log(chalk.yellow(' No agents detected'));\n console.log(chalk.gray(' Looking for: .cursor, .claude, .windsurf, etc.'));\n }\n console.log();\n });\n\n// If no command provided, show interactive menu\nif (!process.argv.slice(2).length) {\n const { waitUntilExit } = render(\n React.createElement(MainMenu, {\n onSelect: async (value: string) => {\n process.exit(0);\n },\n })\n );\n waitUntilExit().then(() => {});\n} else {\n program.parse();\n}\n","import fs from 'fs';\nimport path from 'path';\nimport simpleGit from 'simple-git';\nimport chalk from 'chalk';\nimport { createLogger } from '../utils/logger.js';\nimport { parseSource, getGitHubCloneUrl } from '../utils/source.js';\nimport { discoverSkills } from '../utils/parser.js';\nimport { detectAgents, ensureUniversalSkillsDir } from '../utils/agents.js';\nimport { linkSkillToAgents } from '../utils/symlink.js';\nimport { trackInstallation } from '../utils/analytics.js';\n\ninterface AddSkillOptions {\n skill?: string;\n global?: boolean;\n}\n\n/**\n * Add skill command handler\n */\nexport async function addSkill(source: string, options: AddSkillOptions = {}) {\n const cwd = process.cwd();\n const logger = createLogger();\n logger.start('Parsing source...');\n\n try {\n // Parse source\n const parsedSource = parseSource(source);\n logger.succeed('Source parsed: ' + parsedSource.type);\n\n let skillsDir: string;\n let tempDir: string | null = null;\n\n // Handle different source types\n if (parsedSource.type === 'github') {\n // Clone from GitHub\n logger.start('Cloning repository...');\n const cloneUrl = getGitHubCloneUrl(parsedSource);\n if (!cloneUrl) {\n throw new Error('Invalid GitHub URL');\n }\n\n tempDir = path.join(cwd, '.tmp', `${parsedSource.owner}-${parsedSource.repo}`);\n if (fs.existsSync(tempDir)) {\n fs.rmSync(tempDir, { recursive: true, force: true });\n }\n fs.mkdirSync(tempDir, { recursive: true });\n\n const git = simpleGit();\n await git.clone(cloneUrl, tempDir, ['--depth', '1']);\n \n skillsDir = parsedSource.path \n ? path.join(tempDir, parsedSource.path)\n : tempDir;\n \n logger.succeed('Repository cloned');\n } else if (parsedSource.type === 'local') {\n skillsDir = path.resolve(cwd, parsedSource.value);\n if (!fs.existsSync(skillsDir)) {\n throw new Error(`Local path not found: ${skillsDir}`);\n }\n logger.succeed('Local path found');\n } else {\n throw new Error(`Unsupported source type: ${parsedSource.type}`);\n }\n\n // Discover skills\n logger.start('Discovering skills...');\n let skills = discoverSkills(skillsDir, source);\n \n if (skills.length === 0) {\n logger.fail('No valid skills found');\n console.log(chalk.yellow('\\nA valid skill must have a SKILL.md file with:'));\n console.log(chalk.yellow(' - name: <skill name>'));\n console.log(chalk.yellow(' - description: <description>'));\n return;\n }\n\n // Filter by --skill option if provided\n if (options.skill) {\n const skillFilter = options.skill.toLowerCase();\n skills = skills.filter(s => \n s.metadata.name.toLowerCase().replace(/\\s+/g, '-') === skillFilter ||\n s.metadata.name.toLowerCase() === skillFilter\n );\n \n if (skills.length === 0) {\n logger.fail(`No skill found matching: ${options.skill}`);\n console.log(chalk.yellow('\\nAvailable skills:'));\n const allSkills = discoverSkills(skillsDir, source);\n allSkills.forEach(s => {\n console.log(chalk.gray(` - ${s.metadata.name.toLowerCase().replace(/\\s+/g, '-')}`));\n });\n return;\n }\n logger.succeed(`Found skill: ${skills[0].metadata.name}`);\n } else {\n logger.succeed(`Found ${skills.length} skill(s)`);\n }\n\n // Ensure universal skills directory\n const universalPath = ensureUniversalSkillsDir(cwd);\n\n // Detect agents\n const agents = detectAgents(cwd);\n const detectedAgents = agents.filter(a => a.detected);\n\n if (detectedAgents.length === 0) {\n console.log(chalk.yellow('\\nNo AI agents detected in current directory.'));\n console.log(chalk.yellow('Looking for: .cursor, .claude, .windsurf'));\n } else {\n console.log(chalk.green(`\\nDetected agents: ${detectedAgents.map(a => a.type).join(', ')}`));\n }\n\n // Install skills\n for (const skill of skills) {\n logger.start(`Installing ${skill.metadata.name}...`);\n\n // Copy skill to universal directory\n const skillName = skill.metadata.name.toLowerCase().replace(/\\s+/g, '-');\n const skillDestDir = path.join(universalPath, skillName);\n\n // Determine source directory (parent of SKILL.md)\n const skillSourceDir = path.dirname(skill.path);\n\n // Copy entire skill directory\n if (fs.existsSync(skillDestDir)) {\n fs.rmSync(skillDestDir, { recursive: true, force: true });\n }\n fs.mkdirSync(skillDestDir, { recursive: true });\n \n // Copy all files from skill directory\n copyDirectory(skillSourceDir, skillDestDir);\n\n // Save source information for updates\n const sourceFile = path.join(skillDestDir, '.source');\n fs.writeFileSync(sourceFile, source, 'utf-8');\n\n console.log(chalk.cyan(` Linking ${skill.metadata.name} to agents...`));\n\n // Create symlinks to detected agents\n const { success, linked } = linkSkillToAgents(skillName, universalPath, detectedAgents);\n\n if (success) {\n logger.succeed(\n `${skill.metadata.name} installed and linked to: ${linked.join(', ')}`\n );\n } else {\n logger.warn(\n `${skill.metadata.name} installed but not linked (no agents detected)`\n );\n }\n\n console.log(chalk.gray(` Location: ${skillDestDir}`));\n\n // Track installation analytics\n trackInstallation(\n skill.metadata.name,\n skillName,\n source,\n parsedSource.type,\n linked.map(a => a as any),\n options.global || false,\n skill.metadata.version\n );\n }\n\n // Cleanup temp directory\n if (tempDir && fs.existsSync(tempDir)) {\n fs.rmSync(tempDir, { recursive: true, force: true });\n }\n\n console.log(chalk.green('\\nāœ“ All skills installed successfully!'));\n } catch (error: any) {\n logger.fail('Installation failed');\n console.error(chalk.red(`\\nError: ${error.message}`));\n throw error;\n }\n}\n\n/**\n * Recursively copy directory\n */\nfunction copyDirectory(src: string, dest: string) {\n if (!fs.existsSync(dest)) {\n fs.mkdirSync(dest, { recursive: true });\n }\n\n const entries = fs.readdirSync(src, { withFileTypes: true });\n\n for (const entry of entries) {\n const srcPath = path.join(src, entry.name);\n const destPath = path.join(dest, entry.name);\n\n if (entry.isDirectory()) {\n copyDirectory(srcPath, destPath);\n } else {\n fs.copyFileSync(srcPath, destPath);\n }\n }\n}\n","import chalk from 'chalk';\n\nexport class Logger {\n private currentTask: string | null = null;\n\n start(message: string): void {\n this.currentTask = message;\n process.stdout.write(chalk.cyan(`ā³ ${message}\\n`));\n }\n\n succeed(message?: string): void {\n const msg = message || this.currentTask || 'Done';\n process.stdout.write(chalk.green(`āœ” ${msg}\\n`));\n this.currentTask = null;\n }\n\n fail(message?: string): void {\n const msg = message || this.currentTask || 'Failed';\n process.stdout.write(chalk.red(`āœ– ${msg}\\n`));\n this.currentTask = null;\n }\n\n info(message: string): void {\n console.log(chalk.blue(`ℹ ${message}`));\n }\n\n warn(message: string): void {\n console.log(chalk.yellow(`⚠ ${message}`));\n }\n\n error(message: string): void {\n console.log(chalk.red(`āœ– ${message}`));\n }\n}\n\nexport function createLogger(): Logger {\n return new Logger();\n}\n","import { SkillSource } from '../types.js';\n\n/**\n * Parse skill source string into structured format\n * Supports:\n * - \"keyword search\" (API search)\n * - user/repo (GitHub shorthand)\n * - https://github.com/user/repo (Full URL)\n * - org/repo/path/to/marketplace.json (Marketplace format)\n * - ./local/path or /absolute/path (Local path)\n */\nexport function parseSource(source: string): SkillSource {\n // Remove trailing slashes\n source = source.trim().replace(/\\/+$/, '');\n\n // Full URL\n if (source.startsWith('http://') || source.startsWith('https://')) {\n const url = new URL(source);\n \n if (url.hostname === 'github.com') {\n const parts = url.pathname.split('/').filter(Boolean);\n if (parts.length >= 2) {\n return {\n type: 'github',\n value: source,\n owner: parts[0],\n repo: parts[1].replace('.git', ''),\n path: parts.length > 2 ? parts.slice(2).join('/') : undefined,\n };\n }\n }\n \n return {\n type: 'url',\n value: source,\n };\n }\n\n // Local path\n if (source.startsWith('.') || source.startsWith('/')) {\n return {\n type: 'local',\n value: source,\n };\n }\n\n // GitHub shorthand: user/repo or user/repo/path\n const parts = source.split('/');\n if (parts.length >= 2) {\n return {\n type: 'github',\n value: source,\n owner: parts[0],\n repo: parts[1],\n path: parts.length > 2 ? parts.slice(2).join('/') : undefined,\n };\n }\n\n // Keyword search (no slashes, not a path)\n return {\n type: 'search',\n value: source,\n };\n}\n\n/**\n * Convert source to GitHub clone URL\n */\nexport function getGitHubCloneUrl(source: SkillSource): string | null {\n if (source.type !== 'github' || !source.owner || !source.repo) {\n return null;\n }\n return `https://github.com/${source.owner}/${source.repo}.git`;\n}\n","import fs from 'fs';\nimport path from 'path';\nimport matter from 'gray-matter';\nimport { Skill, SkillMetadata } from '../types.js';\n\n/**\n * Parse a SKILL.md file and extract metadata\n */\nexport function parseSkillFile(filePath: string, source: string): Skill | null {\n try {\n const content = fs.readFileSync(filePath, 'utf-8');\n const { data, content: markdownContent } = matter(content);\n\n // Validate required fields\n if (!data.name || !data.description) {\n console.warn(`Skipping ${filePath}: missing required fields (name, description)`);\n return null;\n }\n\n return {\n metadata: data as SkillMetadata,\n content: markdownContent,\n path: filePath,\n source,\n };\n } catch (error) {\n console.error(`Error parsing ${filePath}:`, error);\n return null;\n }\n}\n\n/**\n * Discover skills in a directory\n * Searches for SKILL.md files in:\n * 1. Root directory\n * 2. skills/ folder\n * 3. Recursive search in subdirectories\n */\nexport function discoverSkills(dir: string, source: string): Skill[] {\n const skills: Skill[] = [];\n\n // Check root SKILL.md\n const rootSkillPath = path.join(dir, 'SKILL.md');\n if (fs.existsSync(rootSkillPath)) {\n const skill = parseSkillFile(rootSkillPath, source);\n if (skill) skills.push(skill);\n }\n\n // Check skills/ folder\n const skillsDir = path.join(dir, 'skills');\n if (fs.existsSync(skillsDir) && fs.statSync(skillsDir).isDirectory()) {\n const entries = fs.readdirSync(skillsDir);\n for (const entry of entries) {\n const entryPath = path.join(skillsDir, entry);\n const stat = fs.statSync(entryPath);\n\n if (stat.isDirectory()) {\n // Check for SKILL.md in subdirectory\n const skillPath = path.join(entryPath, 'SKILL.md');\n if (fs.existsSync(skillPath)) {\n const skill = parseSkillFile(skillPath, source);\n if (skill) skills.push(skill);\n }\n } else if (entry === 'SKILL.md') {\n const skill = parseSkillFile(entryPath, source);\n if (skill) skills.push(skill);\n }\n }\n }\n\n // Recursive search (optional, can be limited by depth)\n const recursiveSearch = (currentDir: string, depth: number = 0, maxDepth: number = 2) => {\n if (depth > maxDepth) return;\n \n try {\n const entries = fs.readdirSync(currentDir);\n for (const entry of entries) {\n if (entry.startsWith('.') || entry === 'node_modules') continue;\n \n const entryPath = path.join(currentDir, entry);\n const stat = fs.statSync(entryPath);\n \n if (stat.isDirectory() && entryPath !== skillsDir) {\n const skillPath = path.join(entryPath, 'SKILL.md');\n if (fs.existsSync(skillPath)) {\n const skill = parseSkillFile(skillPath, source);\n if (skill) skills.push(skill);\n }\n recursiveSearch(entryPath, depth + 1, maxDepth);\n }\n }\n } catch (error) {\n // Ignore permission errors\n }\n };\n\n recursiveSearch(dir);\n\n return skills;\n}\n","import * as path from 'path';\nimport * as fs from 'fs';\nimport * as os from 'os';\nimport { AgentConfig, AgentType } from '../types.js';\n\n/**\n * Get all supported agents with their configurations\n */\nexport function getAllAgents(cwd: string = process.cwd()): AgentConfig[] {\n const homeDir = os.homedir();\n \n const agents: AgentConfig[] = [\n {\n type: 'adal',\n name: 'AdaL',\n detected: false,\n skillsPath: path.join(cwd, '.adal', 'skills'),\n globalPath: path.join(homeDir, '.adal', 'skills'),\n },\n {\n type: 'amp',\n name: 'Amp',\n detected: false,\n skillsPath: path.join(cwd, '.agents', 'skills'),\n globalPath: path.join(homeDir, '.agents', 'skills'),\n isUniversal: true,\n },\n {\n type: 'antigravity',\n name: 'Antigravity',\n detected: false,\n skillsPath: path.join(cwd, '.agent', 'skills'),\n globalPath: path.join(homeDir, '.gemini', 'antigravity', 'skills'),\n },\n {\n type: 'augment',\n name: 'Augment',\n detected: false,\n skillsPath: path.join(cwd, '.augment', 'rules'),\n globalPath: path.join(homeDir, '.augment', 'rules'),\n },\n {\n type: 'claude-code',\n name: 'Claude Code',\n detected: false,\n skillsPath: path.join(cwd, '.claude', 'skills'),\n globalPath: path.join(homeDir, '.claude', 'skills'),\n },\n {\n type: 'cline',\n name: 'Cline',\n detected: false,\n skillsPath: path.join(cwd, '.cline', 'skills'),\n globalPath: path.join(homeDir, '.cline', 'skills'),\n },\n {\n type: 'codebuddy',\n name: 'CodeBuddy',\n detected: false,\n skillsPath: path.join(cwd, '.codebuddy', 'skills'),\n globalPath: path.join(homeDir, '.codebuddy', 'skills'),\n },\n {\n type: 'codex',\n name: 'Codex',\n detected: false,\n skillsPath: path.join(cwd, '.agents', 'skills'),\n globalPath: path.join(homeDir, '.agents', 'skills'),\n isUniversal: true,\n },\n {\n type: 'command-code',\n name: 'Command Code',\n detected: false,\n skillsPath: path.join(cwd, '.commandcode', 'skills'),\n globalPath: path.join(homeDir, '.commandcode', 'skills'),\n },\n {\n type: 'continue',\n name: 'Continue',\n detected: false,\n skillsPath: path.join(cwd, '.continue', 'skills'),\n globalPath: path.join(homeDir, '.continue', 'skills'),\n },\n {\n type: 'cortex',\n name: 'Cortex Code',\n detected: false,\n skillsPath: path.join(cwd, '.cortex', 'skills'),\n globalPath: path.join(homeDir, '.snowflake', 'cortex', 'skills'),\n },\n {\n type: 'crush',\n name: 'Crush',\n detected: false,\n skillsPath: path.join(cwd, '.crush', 'skills'),\n globalPath: path.join(homeDir, '.config', 'crush', 'skills'),\n },\n {\n type: 'cursor',\n name: 'Cursor',\n detected: false,\n skillsPath: path.join(cwd, '.agents', 'skills'),\n globalPath: path.join(homeDir, '.cursor', 'skills'),\n isUniversal: true,\n },\n {\n type: 'droid',\n name: 'Droid',\n detected: false,\n skillsPath: path.join(cwd, '.agents', 'skills'),\n globalPath: path.join(homeDir, '.agents', 'skills'),\n isUniversal: true,\n },\n {\n type: 'gemini-cli',\n name: 'Gemini CLI',\n detected: false,\n skillsPath: path.join(cwd, '.agents', 'skills'),\n globalPath: path.join(homeDir, '.agents', 'skills'),\n isUniversal: true,\n },\n {\n type: 'github-copilot',\n name: 'GitHub Copilot',\n detected: false,\n skillsPath: path.join(cwd, '.agents', 'skills'),\n globalPath: path.join(homeDir, '.agents', 'skills'),\n isUniversal: true,\n },\n {\n type: 'goose',\n name: 'Goose',\n detected: false,\n skillsPath: path.join(cwd, '.goose', 'skills'),\n globalPath: path.join(homeDir, '.config', 'goose', 'skills'),\n },\n {\n type: 'iflow-cli',\n name: 'iFlow CLI',\n detected: false,\n skillsPath: path.join(cwd, '.iflow', 'skills'),\n globalPath: path.join(homeDir, '.iflow', 'skills'),\n },\n {\n type: 'junie',\n name: 'Junie',\n detected: false,\n skillsPath: path.join(cwd, '.junie', 'skills'),\n globalPath: path.join(homeDir, '.junie', 'skills'),\n },\n {\n type: 'kilo',\n name: 'Kilo Code',\n detected: false,\n skillsPath: path.join(cwd, '.kilocode', 'skills'),\n globalPath: path.join(homeDir, '.kilocode', 'skills'),\n },\n {\n type: 'kimi-cli',\n name: 'Kimi Code CLI',\n detected: false,\n skillsPath: path.join(cwd, '.agents', 'skills'),\n globalPath: path.join(homeDir, '.agents', 'skills'),\n isUniversal: true,\n },\n {\n type: 'kiro-cli',\n name: 'Kiro CLI',\n detected: false,\n skillsPath: path.join(cwd, '.kiro', 'skills'),\n globalPath: path.join(homeDir, '.kiro', 'skills'),\n },\n {\n type: 'kode',\n name: 'Kode',\n detected: false,\n skillsPath: path.join(cwd, '.kode', 'skills'),\n globalPath: path.join(homeDir, '.kode', 'skills'),\n },\n {\n type: 'mcpjam',\n name: 'MCPJam',\n detected: false,\n skillsPath: path.join(cwd, '.mcpjam', 'skills'),\n globalPath: path.join(homeDir, '.mcpjam', 'skills'),\n },\n {\n type: 'mistral-vibe',\n name: 'Mistral Vibe',\n detected: false,\n skillsPath: path.join(cwd, '.vibe', 'skills'),\n globalPath: path.join(homeDir, '.vibe', 'skills'),\n },\n {\n type: 'mux',\n name: 'Mux',\n detected: false,\n skillsPath: path.join(cwd, '.mux', 'skills'),\n globalPath: path.join(homeDir, '.mux', 'skills'),\n },\n {\n type: 'neovate',\n name: 'Neovate',\n detected: false,\n skillsPath: path.join(cwd, '.neovate', 'skills'),\n globalPath: path.join(homeDir, '.neovate', 'skills'),\n },\n {\n type: 'openclaw',\n name: 'OpenClaw',\n detected: false,\n skillsPath: path.join(cwd, 'skills'),\n globalPath: path.join(homeDir, '.openclaw', 'skills'),\n },\n {\n type: 'opencode',\n name: 'OpenCode',\n detected: false,\n skillsPath: path.join(cwd, '.agents', 'skills'),\n globalPath: path.join(homeDir, '.agents', 'skills'),\n isUniversal: true,\n },\n {\n type: 'openhands',\n name: 'OpenHands',\n detected: false,\n skillsPath: path.join(cwd, '.openhands', 'skills'),\n globalPath: path.join(homeDir, '.openhands', 'skills'),\n },\n {\n type: 'pi',\n name: 'Pi',\n detected: false,\n skillsPath: path.join(cwd, '.pi', 'skills'),\n globalPath: path.join(homeDir, '.pi', 'agent', 'skills'),\n },\n {\n type: 'pochi',\n name: 'Pochi',\n detected: false,\n skillsPath: path.join(cwd, '.pochi', 'skills'),\n globalPath: path.join(homeDir, '.pochi', 'skills'),\n },\n {\n type: 'qoder',\n name: 'Qoder',\n detected: false,\n skillsPath: path.join(cwd, '.qoder', 'skills'),\n globalPath: path.join(homeDir, '.qoder', 'skills'),\n },\n {\n type: 'qwen-code',\n name: 'Qwen Code',\n detected: false,\n skillsPath: path.join(cwd, '.qwen', 'skills'),\n globalPath: path.join(homeDir, '.qwen', 'skills'),\n },\n {\n type: 'replit',\n name: 'Replit',\n detected: false,\n skillsPath: path.join(cwd, '.agents', 'skills'),\n isUniversal: true,\n },\n {\n type: 'roo',\n name: 'Roo Code',\n detected: false,\n skillsPath: path.join(cwd, '.roo', 'skills'),\n globalPath: path.join(homeDir, '.roo', 'skills'),\n },\n {\n type: 'trae',\n name: 'Trae',\n detected: false,\n skillsPath: path.join(cwd, '.trae', 'skills'),\n globalPath: path.join(homeDir, '.trae', 'skills'),\n },\n {\n type: 'trae-cn',\n name: 'Trae CN',\n detected: false,\n skillsPath: path.join(cwd, '.trae', 'skills'),\n globalPath: path.join(homeDir, '.trae-cn', 'skills'),\n },\n {\n type: 'windsurf',\n name: 'Windsurf',\n detected: false,\n skillsPath: path.join(cwd, '.windsurf', 'skills'),\n globalPath: path.join(homeDir, '.codeium', 'windsurf', 'skills'),\n },\n {\n type: 'zencoder',\n name: 'Zencoder',\n detected: false,\n skillsPath: path.join(cwd, '.zencoder', 'skills'),\n globalPath: path.join(homeDir, '.zencoder', 'skills'),\n },\n {\n type: 'universal',\n name: 'Universal',\n detected: false,\n skillsPath: path.join(cwd, '.agents', 'skills'),\n globalPath: path.join(homeDir, '.agents', 'skills'),\n isUniversal: true,\n },\n ];\n\n return agents;\n}\n\n/**\n * Detect available AI agents in the current directory\n */\nexport function detectAgents(cwd: string = process.cwd()): AgentConfig[] {\n const agents = getAllAgents(cwd);\n\n // Check which agents are actually present\n for (const agent of agents) {\n const agentDir = path.dirname(agent.skillsPath);\n agent.detected = fs.existsSync(agentDir);\n }\n\n return agents;\n}\n\n/**\n * Get the universal skills directory path\n */\nexport function getUniversalSkillsPath(cwd: string = process.cwd()): string {\n return path.join(cwd, '.agents', 'skills');\n}\n\n/**\n * Ensure the universal skills directory exists\n */\nexport function ensureUniversalSkillsDir(cwd: string = process.cwd()): string {\n const skillsPath = getUniversalSkillsPath(cwd);\n if (!fs.existsSync(skillsPath)) {\n fs.mkdirSync(skillsPath, { recursive: true });\n }\n return skillsPath;\n}\n\n/**\n * Ensure agent skills directory exists\n */\nexport function ensureAgentSkillsDir(agent: AgentConfig): void {\n if (!fs.existsSync(agent.skillsPath)) {\n fs.mkdirSync(agent.skillsPath, { recursive: true });\n }\n}\n","import fs from 'fs';\nimport path from 'path';\nimport { AgentConfig } from '../types.js';\n\n/**\n * Create a symlink from agent skills directory to universal skills directory\n * Handles Windows permission issues\n */\nexport function createSymlink(\n target: string,\n linkPath: string,\n type: 'file' | 'dir' = 'dir'\n): boolean {\n try {\n // Check if symlink already exists\n if (fs.existsSync(linkPath)) {\n const stats = fs.lstatSync(linkPath);\n if (stats.isSymbolicLink()) {\n const existingTarget = fs.readlinkSync(linkPath);\n if (existingTarget === target) {\n return true; // Already linked correctly\n }\n // Remove old symlink\n fs.unlinkSync(linkPath);\n } else {\n // Path exists but is not a symlink - skip silently\n // This can happen when multiple agents share the same path\n return false;\n }\n }\n\n // Ensure parent directory exists\n const parentDir = path.dirname(linkPath);\n if (!fs.existsSync(parentDir)) {\n fs.mkdirSync(parentDir, { recursive: true });\n }\n\n // Create symlink\n fs.symlinkSync(target, linkPath, type);\n return true;\n } catch (error: any) {\n if (error.code === 'EPERM' && process.platform === 'win32') {\n console.error(\n 'Permission denied. On Windows, you need to either:\\n' +\n '1. Run as Administrator, or\\n' +\n '2. Enable Developer Mode in Windows Settings'\n );\n } else {\n console.error(`Failed to create symlink: ${error.message}`);\n }\n return false;\n }\n}\n\n/**\n * Link a skill from universal directory to agent directories\n */\nexport function linkSkillToAgents(\n skillName: string,\n universalPath: string,\n agents: AgentConfig[]\n): { success: boolean; linked: string[] } {\n const linked: string[] = [];\n const skillSource = path.join(universalPath, skillName);\n\n for (const agent of agents) {\n const linkPath = path.join(agent.skillsPath, skillName);\n \n // Ensure agent skills directory exists\n if (!fs.existsSync(agent.skillsPath)) {\n fs.mkdirSync(agent.skillsPath, { recursive: true });\n }\n\n if (createSymlink(skillSource, linkPath, 'dir')) {\n linked.push(agent.type);\n }\n }\n\n return {\n success: linked.length > 0,\n linked,\n };\n}\n\n/**\n * Check if a path is a symlink\n */\nexport function isSymlink(filePath: string): boolean {\n try {\n const stats = fs.lstatSync(filePath);\n return stats.isSymbolicLink();\n } catch {\n return false;\n }\n}\n\n/**\n * Get symlink target\n */\nexport function getSymlinkTarget(linkPath: string): string | null {\n try {\n if (isSymlink(linkPath)) {\n return fs.readlinkSync(linkPath);\n }\n return null;\n } catch {\n return null;\n }\n}\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport * as os from 'os';\nimport * as crypto from 'crypto';\nimport { InstallationRecord, AnalyticsPayload, AgentType } from '../types.js';\n\nconst ANALYTICS_DIR = path.join(os.homedir(), '.trusttools');\nconst ANALYTICS_FILE = path.join(ANALYTICS_DIR, 'analytics.json');\nconst MACHINE_ID_FILE = path.join(ANALYTICS_DIR, 'machine-id');\nconst ANALYTICS_ENABLED_FILE = path.join(ANALYTICS_DIR, 'analytics-enabled');\n\n/**\n * Get or create machine ID for anonymous tracking\n */\nexport function getMachineId(): string {\n try {\n if (fs.existsSync(MACHINE_ID_FILE)) {\n return fs.readFileSync(MACHINE_ID_FILE, 'utf-8').trim();\n }\n\n const machineId = crypto.randomUUID();\n ensureAnalyticsDir();\n fs.writeFileSync(MACHINE_ID_FILE, machineId, 'utf-8');\n return machineId;\n } catch (error) {\n return 'unknown';\n }\n}\n\n/**\n * Check if analytics is enabled\n */\nexport function isAnalyticsEnabled(): boolean {\n try {\n // Check environment variable first\n if (process.env.TRUSTTOOLS_ANALYTICS === 'false') {\n return false;\n }\n\n // Check if user has explicitly disabled\n if (fs.existsSync(ANALYTICS_ENABLED_FILE)) {\n const enabled = fs.readFileSync(ANALYTICS_ENABLED_FILE, 'utf-8').trim();\n return enabled === 'true';\n }\n\n // Default: enabled\n return true;\n } catch (error) {\n return true;\n }\n}\n\n/**\n * Enable or disable analytics\n */\nexport function setAnalyticsEnabled(enabled: boolean): void {\n ensureAnalyticsDir();\n fs.writeFileSync(ANALYTICS_ENABLED_FILE, enabled ? 'true' : 'false', 'utf-8');\n}\n\n/**\n * Ensure analytics directory exists\n */\nfunction ensureAnalyticsDir(): void {\n if (!fs.existsSync(ANALYTICS_DIR)) {\n fs.mkdirSync(ANALYTICS_DIR, { recursive: true });\n }\n}\n\n/**\n * Load installation records from local storage\n */\nexport function loadInstallationRecords(): InstallationRecord[] {\n try {\n if (!fs.existsSync(ANALYTICS_FILE)) {\n return [];\n }\n\n const data = fs.readFileSync(ANALYTICS_FILE, 'utf-8');\n return JSON.parse(data);\n } catch (error) {\n return [];\n }\n}\n\n/**\n * Save installation records to local storage\n */\nexport function saveInstallationRecords(records: InstallationRecord[]): void {\n ensureAnalyticsDir();\n fs.writeFileSync(ANALYTICS_FILE, JSON.stringify(records, null, 2), 'utf-8');\n}\n\n/**\n * Track skill installation\n */\nexport function trackInstallation(\n skillName: string,\n skillSlug: string,\n source: string,\n sourceType: 'github' | 'local' | 'url',\n agents: AgentType[],\n isGlobal: boolean,\n version?: string\n): InstallationRecord {\n const record: InstallationRecord = {\n id: crypto.randomUUID(),\n skillName,\n skillSlug,\n source,\n sourceType,\n agents,\n timestamp: new Date().toISOString(),\n isGlobal,\n machineId: getMachineId(),\n version,\n };\n\n // Save locally\n const records = loadInstallationRecords();\n records.push(record);\n saveInstallationRecords(records);\n\n // Send to analytics server if enabled\n if (isAnalyticsEnabled()) {\n sendAnalytics('install', record).catch(() => {\n // Silently fail - analytics should not block installation\n });\n }\n\n return record;\n}\n\n/**\n * Track skill update\n */\nexport function trackUpdate(\n skillName: string,\n skillSlug: string,\n source: string,\n sourceType: 'github' | 'local' | 'url',\n agents: AgentType[],\n isGlobal: boolean,\n version?: string\n): void {\n const record: InstallationRecord = {\n id: crypto.randomUUID(),\n skillName,\n skillSlug,\n source,\n sourceType,\n agents,\n timestamp: new Date().toISOString(),\n isGlobal,\n machineId: getMachineId(),\n version,\n };\n\n if (isAnalyticsEnabled()) {\n sendAnalytics('update', record).catch(() => {});\n }\n}\n\n/**\n * Track skill removal\n */\nexport function trackRemoval(\n skillName: string,\n skillSlug: string,\n agents: AgentType[]\n): void {\n const record: InstallationRecord = {\n id: crypto.randomUUID(),\n skillName,\n skillSlug,\n source: '',\n sourceType: 'local',\n agents,\n timestamp: new Date().toISOString(),\n isGlobal: false,\n machineId: getMachineId(),\n };\n\n if (isAnalyticsEnabled()) {\n sendAnalytics('remove', record).catch(() => {});\n }\n}\n\n/**\n * Send analytics to server\n */\nasync function sendAnalytics(\n event: 'install' | 'update' | 'remove',\n record: InstallationRecord\n): Promise<void> {\n try {\n const payload: AnalyticsPayload = {\n event,\n skillName: record.skillName,\n skillSlug: record.skillSlug,\n source: record.source,\n sourceType: record.sourceType,\n agents: record.agents,\n timestamp: record.timestamp,\n isGlobal: record.isGlobal,\n machineId: record.machineId,\n version: record.version,\n cliVersion: getCliVersion(),\n };\n\n const analyticsUrl = process.env.TRUSTTOOLS_ANALYTICS_URL || 'https://skills.seebug.ai/api/analytics/track';\n\n const response = await fetch(analyticsUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n throw new Error(`Analytics request failed: ${response.status}`);\n }\n } catch (error) {\n // Silently fail - analytics should not block operations\n console.debug('Analytics error:', error);\n }\n}\n\n/**\n * Get CLI version from package.json\n */\nfunction getCliVersion(): string {\n try {\n const packageJsonPath = path.join(__dirname, '../../package.json');\n const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));\n return packageJson.version || '1.0.0';\n } catch (error) {\n return '1.0.0';\n }\n}\n\n/**\n * Get installation statistics\n */\nexport function getInstallationStats(): {\n totalInstalls: number;\n skillsByAgent: Record<string, number>;\n topSkills: Array<{ name: string; count: number }>;\n recentInstalls: InstallationRecord[];\n} {\n const records = loadInstallationRecords();\n\n const skillsByAgent: Record<string, number> = {};\n const skillCounts: Record<string, number> = {};\n\n records.forEach((record) => {\n record.agents.forEach((agent) => {\n skillsByAgent[agent] = (skillsByAgent[agent] || 0) + 1;\n });\n\n skillCounts[record.skillSlug] = (skillCounts[record.skillSlug] || 0) + 1;\n });\n\n const topSkills = Object.entries(skillCounts)\n .map(([name, count]) => ({ name, count }))\n .sort((a, b) => b.count - a.count)\n .slice(0, 10);\n\n const recentInstalls = records\n .sort((a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime())\n .slice(0, 20);\n\n return {\n totalInstalls: records.length,\n skillsByAgent,\n topSkills,\n recentInstalls,\n };\n}\n","import fs from 'fs';\nimport path from 'path';\nimport chalk from 'chalk';\nimport { getUniversalSkillsPath } from '../utils/agents.js';\nimport { parseSkillFile } from '../utils/parser.js';\nimport { isSymlink, getSymlinkTarget } from '../utils/symlink.js';\n\n/**\n * List installed skills\n */\nexport function listSkills() {\n const cwd = process.cwd();\n const universalPath = getUniversalSkillsPath(cwd);\n\n if (!fs.existsSync(universalPath)) {\n console.log(chalk.yellow('No skills installed yet.'));\n console.log(chalk.gray(`Run 'trusttools add <source>' to install skills.`));\n return;\n }\n\n const entries = fs.readdirSync(universalPath);\n const skills = entries.filter(entry => {\n const entryPath = path.join(universalPath, entry);\n return fs.statSync(entryPath).isDirectory();\n });\n\n if (skills.length === 0) {\n console.log(chalk.yellow('No skills installed yet.'));\n return;\n }\n\n console.log(chalk.bold(`\\nšŸ“¦ Installed Skills (${skills.length}):\\n`));\n\n for (const skillDir of skills) {\n const skillPath = path.join(universalPath, skillDir);\n const skillMdPath = path.join(skillPath, 'SKILL.md');\n\n if (fs.existsSync(skillMdPath)) {\n const skill = parseSkillFile(skillMdPath, 'local');\n if (skill) {\n console.log(chalk.green(` āœ“ ${skill.metadata.name}`));\n console.log(chalk.gray(` ${skill.metadata.description}`));\n \n if (skill.metadata.version) {\n console.log(chalk.gray(` Version: ${skill.metadata.version}`));\n }\n \n if (skill.metadata.tags && skill.metadata.tags.length > 0) {\n console.log(chalk.gray(` Tags: ${skill.metadata.tags.join(', ')}`));\n }\n \n console.log(chalk.gray(` Path: ${skillPath}`));\n console.log();\n }\n } else {\n console.log(chalk.yellow(` ⚠ ${skillDir} (no SKILL.md found)`));\n console.log();\n }\n }\n}\n","import fs from 'fs';\nimport path from 'path';\nimport simpleGit from 'simple-git';\nimport chalk from 'chalk';\nimport { createLogger } from '../utils/logger.js';\nimport { render } from 'ink';\nimport React from 'react';\nimport { parseSource, getGitHubCloneUrl } from '../utils/source.js';\nimport { discoverSkills } from '../utils/parser.js';\nimport { SkillSelector } from '../ui/SkillSelector.js';\nimport { Skill } from '../types.js';\nimport dotenv from 'dotenv';\n\ndotenv.config();\n\ninterface APISkill {\n id: number;\n name: string;\n description: string;\n version?: string;\n author?: string;\n tags?: string[];\n repo_owner: string;\n repo_name: string;\n repo_path: string;\n security_score?: number;\n security_level?: string;\n install_count?: number;\n}\n\ninterface APIResponse {\n success: boolean;\n data: APISkill[];\n}\n\n/**\n * Search skills from API\n */\nasync function findFromAPI(query: string) {\n const logger = createLogger();\n logger.start(`Searching for \"${query}\"...`);\n\n try {\n const apiUrl = process.env.TRUSTTOOLS_API_URL || 'https://skills.seebug.ai';\n const response = await fetch(`${apiUrl}/api/skills?search=${encodeURIComponent(query)}&limit=20`);\n \n if (!response.ok) {\n throw new Error(`API request failed: ${response.statusText}`);\n }\n\n const data = await response.json() as APIResponse;\n \n if (!data.success || !data.data || data.data.length === 0) {\n logger.fail('No skills found');\n console.log(chalk.yellow(`\\nNo skills found for \"${query}\"`));\n console.log(chalk.gray('\\nTry different keywords or browse skills at:'));\n console.log(chalk.cyan(` ${apiUrl}`));\n return;\n }\n\n logger.succeed(`Found ${data.data.length} skill(s)`);\n\n // Convert API response to Skill format\n const skills: Skill[] = data.data.map((skill: any) => {\n // Remove /SKILL.md from repo_path to get the skill directory\n let skillPath = skill.repo_path || '';\n if (skillPath.endsWith('/SKILL.md')) {\n skillPath = skillPath.slice(0, -9); // Remove '/SKILL.md'\n } else if (skillPath.endsWith('SKILL.md')) {\n skillPath = skillPath.slice(0, -8); // Remove 'SKILL.md'\n }\n \n return {\n metadata: {\n name: skill.name,\n description: skill.description,\n version: skill.version,\n author: skill.author,\n tags: skill.tags || [],\n security_score: skill.security_score,\n security_level: skill.security_level,\n install_count: skill.install_count,\n },\n content: '',\n path: skillPath,\n source: `${skill.repo_owner}/${skill.repo_name}${skillPath ? '/' + skillPath : ''}`,\n };\n });\n\n // Show interactive selector\n const { waitUntilExit } = render(\n React.createElement(SkillSelector, {\n skills,\n onSelect: (skill: Skill) => {\n console.log(chalk.green(`\\nāœ“ Selected: ${skill.metadata.name}`));\n console.log(chalk.gray(`\\nTo install this skill, run:`));\n console.log(chalk.cyan(` trusttools add ${skill.source}`));\n process.exit(0);\n },\n onCancel: () => {\n console.log(chalk.yellow('\\nCancelled'));\n process.exit(0);\n },\n })\n );\n\n await waitUntilExit();\n } catch (error: any) {\n logger.fail('Search failed');\n console.error(chalk.red(`\\nError: ${error.message}`));\n throw error;\n }\n}\n\n/**\n * Find skills from GitHub repository or local path\n */\nasync function findFromRepository(source: string, parsedSource: any) {\n const cwd = process.cwd();\n const logger = createLogger();\n \n let skillsDir: string;\n let tempDir: string | null = null;\n\n try {\n // Handle different source types\n if (parsedSource.type === 'github') {\n logger.start('Cloning repository...');\n const cloneUrl = getGitHubCloneUrl(parsedSource);\n if (!cloneUrl) {\n throw new Error('Invalid GitHub URL');\n }\n\n tempDir = path.join(cwd, '.tmp', `${parsedSource.owner}-${parsedSource.repo}`);\n if (fs.existsSync(tempDir)) {\n fs.rmSync(tempDir, { recursive: true, force: true });\n }\n fs.mkdirSync(tempDir, { recursive: true });\n\n const git = simpleGit();\n await git.clone(cloneUrl, tempDir, ['--depth', '1']);\n \n skillsDir = parsedSource.path \n ? path.join(tempDir, parsedSource.path)\n : tempDir;\n \n logger.succeed('Repository cloned');\n } else if (parsedSource.type === 'local') {\n skillsDir = path.resolve(cwd, parsedSource.value);\n if (!fs.existsSync(skillsDir)) {\n throw new Error(`Local path not found: ${skillsDir}`);\n }\n logger.succeed('Local path found');\n } else {\n throw new Error(`Unsupported source type: ${parsedSource.type}`);\n }\n\n // Discover skills\n logger.start('Discovering skills...');\n const skills = discoverSkills(skillsDir, source);\n \n if (skills.length === 0) {\n logger.fail('No valid skills found');\n console.log(chalk.yellow('\\nA valid skill must have a SKILL.md file with:'));\n console.log(chalk.yellow(' - name: <skill name>'));\n console.log(chalk.yellow(' - description: <description>'));\n \n // Cleanup\n if (tempDir && fs.existsSync(tempDir)) {\n fs.rmSync(tempDir, { recursive: true, force: true });\n }\n return;\n }\n\n logger.succeed(`Found ${skills.length} skill(s)`);\n\n // Show interactive selector\n const { waitUntilExit } = render(\n React.createElement(SkillSelector, {\n skills,\n onSelect: (skill: Skill) => {\n console.log(chalk.green(`\\nāœ“ Selected: ${skill.metadata.name}`));\n console.log(chalk.gray(`\\nTo install this skill, run:`));\n console.log(chalk.cyan(` trusttools add ${source} --skill ${skill.metadata.name.toLowerCase().replace(/\\s+/g, '-')}`));\n process.exit(0);\n },\n onCancel: () => {\n console.log(chalk.yellow('\\nCancelled'));\n process.exit(0);\n },\n })\n );\n\n await waitUntilExit();\n\n // Cleanup temp directory\n if (tempDir && fs.existsSync(tempDir)) {\n fs.rmSync(tempDir, { recursive: true, force: true });\n }\n } catch (error: any) {\n logger.fail('Failed to find skills');\n console.error(chalk.red(`\\nError: ${error.message}`));\n throw error;\n }\n}\n\n/**\n * Find and interactively select skills from a source\n * Supports both API search and repository scanning\n */\nexport async function findSkills(source: string) {\n const logger = createLogger();\n logger.start('Parsing source...');\n\n try {\n const parsedSource = parseSource(source);\n logger.succeed(`Source parsed: ${parsedSource.type}`);\n\n // Route to appropriate handler\n if (parsedSource.type === 'search') {\n await findFromAPI(parsedSource.value);\n } else {\n await findFromRepository(source, parsedSource);\n }\n } catch (error: any) {\n console.error(chalk.red(`\\nError: ${error.message}`));\n throw error;\n }\n}\n","import React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport { Skill } from '../types.js';\n\ninterface SkillSelectorProps {\n skills: Skill[];\n onSelect: (skill: Skill) => void;\n onCancel: () => void;\n}\n\nexport const SkillSelector: React.FC<SkillSelectorProps> = ({ skills, onSelect, onCancel }) => {\n const [selectedIndex, setSelectedIndex] = useState(0);\n\n useInput((input, key) => {\n if (key.upArrow) {\n setSelectedIndex(prev => Math.max(0, prev - 1));\n } else if (key.downArrow) {\n setSelectedIndex(prev => Math.min(skills.length - 1, prev + 1));\n } else if (key.return) {\n onSelect(skills[selectedIndex]);\n } else if (key.escape || input === 'q') {\n onCancel();\n }\n });\n\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n šŸ“¦ Found {skills.length} skill(s). Use ↑↓ to navigate, Enter to select, Esc to cancel:\n </Text>\n </Box>\n\n {skills.map((skill, index) => {\n const getSecurityColor = (score?: number) => {\n if (!score) return 'gray';\n if (score >= 81) return 'green';\n if (score >= 61) return 'yellow';\n if (score >= 41) return 'yellow';\n if (score >= 21) return 'red';\n return 'red';\n };\n \n const getSecurityLabel = (score?: number) => {\n if (!score) return '?';\n if (score >= 81) return 'āœ“';\n if (score >= 61) return '⚠';\n if (score >= 41) return '⚠';\n if (score >= 21) return 'āœ—';\n return 'āœ—';\n };\n\n return (\n <Box key={index} marginLeft={2} flexDirection=\"column\">\n <Box>\n <Text color={index === selectedIndex ? 'green' : 'white'}>\n {index === selectedIndex ? 'ā–¶ ' : ' '}\n <Text bold>{skill.metadata.name}</Text>\n {skill.metadata.security_score !== undefined && (\n <Text color={getSecurityColor(skill.metadata.security_score)}>\n {' ['}{getSecurityLabel(skill.metadata.security_score)} {skill.metadata.security_score}]\n </Text>\n )}\n {skill.metadata.install_count !== undefined && (\n <Text dimColor> (↓{skill.metadata.install_count})</Text>\n )}\n </Text>\n </Box>\n <Box marginLeft={4}>\n <Text dimColor>{skill.metadata.description}</Text>\n </Box>\n </Box>\n );\n })}\n\n <Box marginTop={1}>\n <Text dimColor>\n {skills[selectedIndex]?.metadata.tags && (\n `Tags: ${skills[selectedIndex].metadata.tags.join(', ')}`\n )}\n </Text>\n </Box>\n </Box>\n );\n};\n","import fs from 'fs';\nimport path from 'path';\nimport chalk from 'chalk';\nimport { render } from 'ink';\nimport React from 'react';\nimport SelectInput from 'ink-select-input';\nimport { Box, Text } from 'ink';\nimport { getUniversalSkillsPath } from '../utils/agents.js';\nimport { parseSkillFile } from '../utils/parser.js';\nimport { trackRemoval } from '../utils/analytics.js';\nimport { createLogger } from '../utils/logger.js';\n\ninterface SkillItem {\n label: string;\n value: string;\n}\n\n/**\n * Manage installed skills\n */\nexport async function manageSkills() {\n const cwd = process.cwd();\n const universalPath = getUniversalSkillsPath(cwd);\n\n if (!fs.existsSync(universalPath)) {\n console.log(chalk.yellow('No skills installed yet.'));\n return;\n }\n\n const skillDirs = fs.readdirSync(universalPath).filter((item) => {\n const itemPath = path.join(universalPath, item);\n return fs.statSync(itemPath).isDirectory();\n });\n\n if (skillDirs.length === 0) {\n console.log(chalk.yellow('No skills installed yet.'));\n return;\n }\n\n // Build skill list\n const skills: SkillItem[] = skillDirs.map((dir) => {\n const skillPath = path.join(universalPath, dir);\n const skillMdPath = path.join(skillPath, 'SKILL.md');\n\n let label = dir;\n if (fs.existsSync(skillMdPath)) {\n try {\n const skill = parseSkillFile(skillMdPath, dir);\n if (skill) {\n label = `${skill.metadata.name} (${dir})`;\n }\n } catch (error) {\n // Use directory name if parsing fails\n }\n }\n\n return { label, value: dir };\n });\n\n skills.push({ label: chalk.gray('← Back'), value: '__back__' });\n\n console.log(chalk.cyan('\\nšŸ“‹ Installed Skills:\\n'));\n\n // Show interactive selector\n const { waitUntilExit } = render(\n React.createElement(\n Box,\n { flexDirection: 'column', padding: 1 },\n React.createElement(Text, { dimColor: true }, 'Select a skill to manage:'),\n React.createElement(SelectInput, {\n items: skills,\n onSelect: (item: any) => {\n if (item.value === '__back__') {\n process.exit(0);\n }\n\n // Show action menu\n showActionMenu(item.value, universalPath, cwd).then(() => {});\n },\n })\n )\n );\n\n await waitUntilExit();\n}\n\n/**\n * Show action menu for a skill\n */\nasync function showActionMenu(skillSlug: string, universalPath: string, cwd: string) {\n const actions = [\n { label: 'šŸ—‘ļø Delete', value: 'delete' },\n { label: 'ā„¹ļø Show Info', value: 'info' },\n { label: '← Back', value: 'back' },\n ];\n\n const { waitUntilExit, clear } = render(\n React.createElement(\n Box,\n { flexDirection: 'column', padding: 1 },\n React.createElement(Text, { bold: true }, `Manage: ${skillSlug}`),\n React.createElement(Text, { dimColor: true }, '\\nSelect an action:'),\n React.createElement(SelectInput, {\n items: actions,\n onSelect: (item: any) => {\n clear();\n\n if (item.value === 'back') {\n process.exit(0);\n } else if (item.value === 'delete') {\n deleteSkill(skillSlug, universalPath, cwd).then(() => process.exit(0));\n } else if (item.value === 'info') {\n showSkillInfo(skillSlug, universalPath).then(() => process.exit(0));\n }\n },\n })\n )\n );\n\n await waitUntilExit();\n}\n\n/**\n * Delete a skill\n */\nasync function deleteSkill(skillSlug: string, universalPath: string, cwd: string) {\n const logger = createLogger();\n const skillPath = path.join(universalPath, skillSlug);\n\n logger.start(`Deleting ${skillSlug}...`);\n\n try {\n // Find and remove symlinks\n const agentDirs = ['.cursor', '.claude', '.windsurf', '.cline', '.continue', '.goose'];\n const removedLinks: string[] = [];\n\n for (const agentDir of agentDirs) {\n const agentSkillsPath = path.join(cwd, agentDir, 'skills');\n const linkPath = path.join(agentSkillsPath, skillSlug);\n\n if (fs.existsSync(linkPath)) {\n const stats = fs.lstatSync(linkPath);\n if (stats.isSymbolicLink()) {\n fs.unlinkSync(linkPath);\n removedLinks.push(agentDir.replace('.', ''));\n }\n }\n }\n\n // Remove skill directory\n fs.rmSync(skillPath, { recursive: true, force: true });\n\n // Track removal\n trackRemoval(skillSlug, skillSlug, removedLinks as any);\n\n logger.succeed(`${skillSlug} deleted successfully`);\n if (removedLinks.length > 0) {\n console.log(chalk.gray(` Removed from: ${removedLinks.join(', ')}`));\n }\n } catch (error: any) {\n logger.fail(`Failed to delete ${skillSlug}`);\n console.error(chalk.red(`Error: ${error.message}`));\n }\n}\n\n/**\n * Show skill information\n */\nasync function showSkillInfo(skillSlug: string, universalPath: string) {\n const skillPath = path.join(universalPath, skillSlug);\n const skillMdPath = path.join(skillPath, 'SKILL.md');\n\n console.log(chalk.cyan(`\\nšŸ“„ Skill: ${skillSlug}\\n`));\n console.log(chalk.gray(`Location: ${skillPath}\\n`));\n\n if (fs.existsSync(skillMdPath)) {\n try {\n const skill = parseSkillFile(skillMdPath, skillSlug);\n if (!skill) {\n console.log(chalk.yellow('Could not parse SKILL.md'));\n return;\n }\n const { metadata, content } = skill;\n\n console.log(chalk.bold('Metadata:'));\n console.log(` Name: ${metadata.name}`);\n console.log(` Description: ${metadata.description}`);\n if (metadata.version) console.log(` Version: ${metadata.version}`);\n if (metadata.author) console.log(` Author: ${metadata.author}`);\n if (metadata.tags) console.log(` Tags: ${metadata.tags.join(', ')}`);\n\n console.log(chalk.bold('\\nContent Preview:'));\n const preview = content.split('\\n').slice(0, 10).join('\\n');\n console.log(chalk.gray(preview));\n if (content.split('\\n').length > 10) {\n console.log(chalk.gray('...'));\n }\n } catch (error) {\n console.log(chalk.yellow('Could not parse SKILL.md'));\n }\n } else {\n console.log(chalk.yellow('No SKILL.md found'));\n }\n}\n","import fs from 'fs';\nimport path from 'path';\nimport chalk from 'chalk';\nimport { getUniversalSkillsPath } from '../utils/agents.js';\nimport { parseSkillFile } from '../utils/parser.js';\nimport { addSkill } from './add.js';\nimport { createLogger } from '../utils/logger.js';\n\n/**\n * Update installed skills\n */\nexport async function updateSkills(skillNames?: string[]) {\n const cwd = process.cwd();\n const universalPath = getUniversalSkillsPath(cwd);\n const logger = createLogger();\n\n if (!fs.existsSync(universalPath)) {\n console.log(chalk.yellow('No skills installed yet.'));\n return;\n }\n\n const skillDirs = fs.readdirSync(universalPath).filter((item) => {\n const itemPath = path.join(universalPath, item);\n return fs.statSync(itemPath).isDirectory();\n });\n\n if (skillDirs.length === 0) {\n console.log(chalk.yellow('No skills installed yet.'));\n return;\n }\n\n // Filter skills if specific names provided\n let skillsToUpdate = skillDirs;\n if (skillNames && skillNames.length > 0) {\n skillsToUpdate = skillDirs.filter((dir) => skillNames.includes(dir));\n \n if (skillsToUpdate.length === 0) {\n console.log(chalk.yellow('No matching skills found.'));\n console.log(chalk.gray('\\nInstalled skills:'));\n skillDirs.forEach((dir) => console.log(chalk.gray(` - ${dir}`)));\n return;\n }\n }\n\n console.log(chalk.cyan(`\\nšŸ”„ Updating ${skillsToUpdate.length} skill(s)...\\n`));\n\n let updated = 0;\n let failed = 0;\n let skipped = 0;\n\n for (const skillSlug of skillsToUpdate) {\n const skillPath = path.join(universalPath, skillSlug);\n const skillMdPath = path.join(skillPath, 'SKILL.md');\n const sourceFile = path.join(skillPath, '.source');\n\n // Check if we have source information\n if (!fs.existsSync(sourceFile)) {\n logger.warn(`${skillSlug}: No source information, skipping`);\n skipped++;\n continue;\n }\n\n try {\n const source = fs.readFileSync(sourceFile, 'utf-8').trim();\n \n // Parse current version\n let currentVersion = 'unknown';\n if (fs.existsSync(skillMdPath)) {\n const skill = parseSkillFile(skillMdPath, skillSlug);\n if (skill && skill.metadata.version) {\n currentVersion = skill.metadata.version;\n }\n }\n\n logger.start(`Updating ${skillSlug} (current: ${currentVersion})...`);\n\n // Re-install the skill (this will fetch latest version)\n await addSkill(source, { skill: skillSlug });\n\n logger.succeed(`${skillSlug} updated successfully`);\n updated++;\n } catch (error: any) {\n logger.fail(`${skillSlug}: Update failed`);\n console.error(chalk.red(` Error: ${error.message}`));\n failed++;\n }\n }\n\n // Summary\n console.log(chalk.cyan('\\nšŸ“Š Update Summary:'));\n console.log(chalk.green(` āœ“ Updated: ${updated}`));\n if (skipped > 0) console.log(chalk.yellow(` ⊘ Skipped: ${skipped}`));\n if (failed > 0) console.log(chalk.red(` āœ– Failed: ${failed}`));\n}\n","import chalk from 'chalk';\nimport { getInstallationStats } from '../utils/analytics.js';\n\n/**\n * Show installation statistics\n */\nexport function showStats() {\n const stats = getInstallationStats();\n\n console.log(chalk.cyan('\\nšŸ“Š Installation Statistics\\n'));\n\n // Total installs\n console.log(chalk.bold('Total Installations:'), stats.totalInstalls);\n\n // Skills by agent\n if (Object.keys(stats.skillsByAgent).length > 0) {\n console.log(chalk.bold('\\nInstallations by Agent:'));\n const sortedAgents = Object.entries(stats.skillsByAgent)\n .sort(([, a], [, b]) => b - a);\n \n sortedAgents.forEach(([agent, count]) => {\n const bar = 'ā–ˆ'.repeat(Math.min(count, 20));\n console.log(` ${agent.padEnd(20)} ${bar} ${count}`);\n });\n }\n\n // Top skills\n if (stats.topSkills.length > 0) {\n console.log(chalk.bold('\\nTop Installed Skills:'));\n stats.topSkills.forEach((skill, index) => {\n console.log(` ${index + 1}. ${skill.name.padEnd(30)} (${skill.count} installs)`);\n });\n }\n\n // Recent installs\n if (stats.recentInstalls.length > 0) {\n console.log(chalk.bold('\\nRecent Installations:'));\n stats.recentInstalls.slice(0, 5).forEach((record) => {\n const date = new Date(record.timestamp).toLocaleString();\n const agents = record.agents.join(', ');\n console.log(chalk.gray(` ${date}`));\n console.log(` ${record.skillName} → ${agents}`);\n });\n }\n\n if (stats.totalInstalls === 0) {\n console.log(chalk.yellow('No installation data yet. Install some skills to see statistics!'));\n }\n}\n","import fs from 'fs';\nimport path from 'path';\nimport chalk from 'chalk';\nimport { createLogger } from '../utils/logger.js';\nimport { detectAgents } from '../utils/agents.js';\n\ninterface APISkillResponse {\n success: boolean;\n data: Array<{\n name: string;\n repo_owner: string;\n repo_name: string;\n security_score?: number;\n security_level?: string;\n }>;\n}\n\ninterface SecurityCheckResult {\n skillName: string;\n skillPath: string;\n source?: string;\n security_score?: number;\n security_level?: string;\n status: 'safe' | 'warning' | 'danger' | 'unknown';\n}\n\n/**\n * Get security level label and color\n */\nfunction getSecurityDisplay(score?: number): { label: string; color: string; icon: string } {\n if (!score) {\n return { label: 'UNKNOWN', color: 'gray', icon: '?' };\n }\n if (score >= 81) {\n return { label: 'SAFE', color: 'green', icon: 'āœ“' };\n }\n if (score >= 61) {\n return { label: 'LOW RISK', color: 'yellow', icon: '⚠' };\n }\n if (score >= 41) {\n return { label: 'MEDIUM RISK', color: 'yellow', icon: '⚠' };\n }\n if (score >= 21) {\n return { label: 'HIGH RISK', color: 'red', icon: 'āœ—' };\n }\n return { label: 'CRITICAL', color: 'red', icon: 'āœ—' };\n}\n\n/**\n * Check skill security via API\n */\nasync function checkSkillSecurity(skillName: string, source?: string): Promise<SecurityCheckResult> {\n try {\n const apiUrl = process.env.TRUSTTOOLS_API_URL || 'https://skills.seebug.ai';\n \n // Try to search by name first\n const response = await fetch(`${apiUrl}/api/skills?search=${encodeURIComponent(skillName)}&limit=5`);\n \n if (!response.ok) {\n return {\n skillName,\n skillPath: '',\n source,\n status: 'unknown',\n };\n }\n\n const data = await response.json() as APISkillResponse;\n \n if (data.success && data.data && data.data.length > 0) {\n // Find exact match or best match\n const match = data.data.find((s) => \n s.name.toLowerCase() === skillName.toLowerCase()\n ) || data.data[0];\n \n const score = match.security_score;\n let status: 'safe' | 'warning' | 'danger' | 'unknown' = 'unknown';\n \n if (score !== undefined) {\n if (score >= 61) status = 'safe';\n else if (score >= 41) status = 'warning';\n else status = 'danger';\n }\n \n return {\n skillName,\n skillPath: '',\n source: `${match.repo_owner}/${match.repo_name}`,\n security_score: match.security_score,\n security_level: match.security_level,\n status,\n };\n }\n \n return {\n skillName,\n skillPath: '',\n source,\n status: 'unknown',\n };\n } catch (error) {\n return {\n skillName,\n skillPath: '',\n source,\n status: 'unknown',\n };\n }\n}\n\n/**\n * Scan installed skills for security issues\n */\nexport async function scanSkills() {\n const cwd = process.cwd();\n const logger = createLogger();\n \n logger.start('Detecting installed agents...');\n const agents = detectAgents(cwd);\n const detectedAgents = agents.filter(a => a.detected);\n \n if (detectedAgents.length === 0) {\n logger.fail('No agents detected');\n console.log(chalk.yellow('\\nNo AI agents found in current directory.'));\n console.log(chalk.gray('Run this command in a project with .cursor/, .claude/, or .windsurf/ directories.'));\n return;\n }\n \n logger.succeed(`Found ${detectedAgents.length} agent(s)`);\n \n // Collect all skills\n const allSkills: Array<{ name: string; path: string; agent: string }> = [];\n \n for (const agent of detectedAgents) {\n if (fs.existsSync(agent.skillsPath)) {\n const skillDirs = fs.readdirSync(agent.skillsPath, { withFileTypes: true })\n .filter(dirent => dirent.isDirectory())\n .map(dirent => dirent.name);\n \n for (const skillName of skillDirs) {\n const skillPath = path.join(agent.skillsPath, skillName);\n const skillMdPath = path.join(skillPath, 'SKILL.md');\n \n if (fs.existsSync(skillMdPath)) {\n allSkills.push({\n name: skillName,\n path: skillPath,\n agent: agent.name,\n });\n }\n }\n }\n }\n \n if (allSkills.length === 0) {\n logger.info('No skills installed');\n console.log(chalk.yellow('\\nNo skills found in detected agents.'));\n return;\n }\n \n console.log(chalk.cyan(`\\nšŸ” Scanning ${allSkills.length} skill(s) for security issues...\\n`));\n \n // Check security for each skill\n const results: SecurityCheckResult[] = [];\n \n for (const skill of allSkills) {\n const result = await checkSkillSecurity(skill.name);\n result.skillPath = skill.path;\n results.push(result);\n }\n \n // Categorize results\n const safe = results.filter(r => r.status === 'safe');\n const warning = results.filter(r => r.status === 'warning');\n const danger = results.filter(r => r.status === 'danger');\n const unknown = results.filter(r => r.status === 'unknown');\n \n // Display results\n console.log(chalk.bold('šŸ“Š Security Scan Results:\\n'));\n \n // Summary\n console.log(chalk.bold('Summary:'));\n console.log(chalk.green(` āœ“ Safe: ${safe.length}`));\n console.log(chalk.yellow(` ⚠ Warning: ${warning.length}`));\n console.log(chalk.red(` āœ— Danger: ${danger.length}`));\n console.log(chalk.gray(` ? Unknown: ${unknown.length}`));\n console.log();\n \n // Dangerous skills\n if (danger.length > 0) {\n console.log(chalk.bold.red('🚨 High Risk Skills:\\n'));\n for (const skill of danger) {\n const display = getSecurityDisplay(skill.security_score);\n console.log(chalk.red(` ${display.icon} ${skill.skillName}`));\n console.log(chalk.gray(` Score: ${skill.security_score || 'N/A'}`));\n console.log(chalk.gray(` Level: ${display.label}`));\n if (skill.source) {\n console.log(chalk.gray(` Source: ${skill.source}`));\n }\n console.log();\n }\n }\n \n // Warning skills\n if (warning.length > 0) {\n console.log(chalk.bold.yellow('āš ļø Medium Risk Skills:\\n'));\n for (const skill of warning) {\n const display = getSecurityDisplay(skill.security_score);\n console.log(chalk.yellow(` ${display.icon} ${skill.skillName}`));\n console.log(chalk.gray(` Score: ${skill.security_score || 'N/A'}`));\n console.log(chalk.gray(` Level: ${display.label}`));\n if (skill.source) {\n console.log(chalk.gray(` Source: ${skill.source}`));\n }\n console.log();\n }\n }\n \n // Safe skills (only show count)\n if (safe.length > 0) {\n console.log(chalk.bold.green(`āœ“ ${safe.length} skill(s) are safe\\n`));\n }\n \n // Unknown skills\n if (unknown.length > 0) {\n console.log(chalk.bold.gray(`? ${unknown.length} skill(s) could not be verified\\n`));\n }\n \n // Recommendations\n if (danger.length > 0 || warning.length > 0) {\n console.log(chalk.bold('\\nšŸ’” Recommendations:\\n'));\n if (danger.length > 0) {\n console.log(chalk.red(' • Consider removing high-risk skills immediately'));\n }\n if (warning.length > 0) {\n console.log(chalk.yellow(' • Review medium-risk skills and update if possible'));\n }\n console.log(chalk.gray(' • Check skill sources and verify they are from trusted repositories'));\n console.log(chalk.gray(' • Keep skills updated to the latest versions'));\n }\n}\n","import React, { useState } from 'react';\nimport { Box, Text } from 'ink';\nimport SelectInput from 'ink-select-input';\n\ninterface MenuItem {\n label: string;\n value: string;\n}\n\ninterface MainMenuProps {\n onSelect: (value: string) => void;\n}\n\nexport const MainMenu: React.FC<MainMenuProps> = ({ onSelect }) => {\n const items: MenuItem[] = [\n { label: 'šŸ” Find Skills', value: 'find' },\n { label: 'āž• Add Skill', value: 'add' },\n { label: 'šŸ“‹ List Installed Skills', value: 'list' },\n { label: 'šŸ”„ Update Skills', value: 'update' },\n { label: 'āš™ļø Manage Skills', value: 'manage' },\n { label: 'ā„¹ļø Environment Info', value: 'info' },\n { label: 'šŸ“Š Installation Stats', value: 'stats' },\n { label: 'āŒ Exit', value: 'exit' },\n ];\n\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n TrustTools - Universal AI Agent Skills Manager\n </Text>\n </Box>\n <Box marginBottom={1}>\n <Text dimColor>Select an action:</Text>\n </Box>\n <SelectInput items={items} onSelect={(item) => onSelect(item.value)} />\n </Box>\n );\n};\n"],"mappings":";;;AACA,OAAO,UAAU;AACjB,SAAS,qBAAqB;AAE9B,IAAM,cAAc,MAAM,cAAc,YAAY,GAAG;AACvD,IAAM,aAAa,MAAM,KAAK,QAAQ,YAAY,CAAC;AAE5C,IAAM,YAA4B,2BAAW;;;ACNpD,SAAS,eAAe;AACxB,OAAOA,YAAW;AAClB,SAAS,UAAAC,eAAc;AACvB,OAAOC,YAAW;;;ACJlB,OAAOC,SAAQ;AACf,OAAOC,WAAU;AACjB,OAAO,eAAe;AACtB,OAAOC,YAAW;;;ACHlB,OAAO,WAAW;AAEX,IAAM,SAAN,MAAa;AAAA,EACV,cAA6B;AAAA,EAErC,MAAM,SAAuB;AAC3B,SAAK,cAAc;AACnB,YAAQ,OAAO,MAAM,MAAM,KAAK,UAAK,OAAO;AAAA,CAAI,CAAC;AAAA,EACnD;AAAA,EAEA,QAAQ,SAAwB;AAC9B,UAAM,MAAM,WAAW,KAAK,eAAe;AAC3C,YAAQ,OAAO,MAAM,MAAM,MAAM,UAAK,GAAG;AAAA,CAAI,CAAC;AAC9C,SAAK,cAAc;AAAA,EACrB;AAAA,EAEA,KAAK,SAAwB;AAC3B,UAAM,MAAM,WAAW,KAAK,eAAe;AAC3C,YAAQ,OAAO,MAAM,MAAM,IAAI,UAAK,GAAG;AAAA,CAAI,CAAC;AAC5C,SAAK,cAAc;AAAA,EACrB;AAAA,EAEA,KAAK,SAAuB;AAC1B,YAAQ,IAAI,MAAM,KAAK,UAAK,OAAO,EAAE,CAAC;AAAA,EACxC;AAAA,EAEA,KAAK,SAAuB;AAC1B,YAAQ,IAAI,MAAM,OAAO,UAAK,OAAO,EAAE,CAAC;AAAA,EAC1C;AAAA,EAEA,MAAM,SAAuB;AAC3B,YAAQ,IAAI,MAAM,IAAI,UAAK,OAAO,EAAE,CAAC;AAAA,EACvC;AACF;AAEO,SAAS,eAAuB;AACrC,SAAO,IAAI,OAAO;AACpB;;;AC1BO,SAAS,YAAY,QAA6B;AAEvD,WAAS,OAAO,KAAK,EAAE,QAAQ,QAAQ,EAAE;AAGzC,MAAI,OAAO,WAAW,SAAS,KAAK,OAAO,WAAW,UAAU,GAAG;AACjE,UAAM,MAAM,IAAI,IAAI,MAAM;AAE1B,QAAI,IAAI,aAAa,cAAc;AACjC,YAAMC,SAAQ,IAAI,SAAS,MAAM,GAAG,EAAE,OAAO,OAAO;AACpD,UAAIA,OAAM,UAAU,GAAG;AACrB,eAAO;AAAA,UACL,MAAM;AAAA,UACN,OAAO;AAAA,UACP,OAAOA,OAAM,CAAC;AAAA,UACd,MAAMA,OAAM,CAAC,EAAE,QAAQ,QAAQ,EAAE;AAAA,UACjC,MAAMA,OAAM,SAAS,IAAIA,OAAM,MAAM,CAAC,EAAE,KAAK,GAAG,IAAI;AAAA,QACtD;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,MACL,MAAM;AAAA,MACN,OAAO;AAAA,IACT;AAAA,EACF;AAGA,MAAI,OAAO,WAAW,GAAG,KAAK,OAAO,WAAW,GAAG,GAAG;AACpD,WAAO;AAAA,MACL,MAAM;AAAA,MACN,OAAO;AAAA,IACT;AAAA,EACF;AAGA,QAAM,QAAQ,OAAO,MAAM,GAAG;AAC9B,MAAI,MAAM,UAAU,GAAG;AACrB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO,MAAM,CAAC;AAAA,MACd,MAAM,MAAM,CAAC;AAAA,MACb,MAAM,MAAM,SAAS,IAAI,MAAM,MAAM,CAAC,EAAE,KAAK,GAAG,IAAI;AAAA,IACtD;AAAA,EACF;AAGA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AACF;AAKO,SAAS,kBAAkB,QAAoC;AACpE,MAAI,OAAO,SAAS,YAAY,CAAC,OAAO,SAAS,CAAC,OAAO,MAAM;AAC7D,WAAO;AAAA,EACT;AACA,SAAO,sBAAsB,OAAO,KAAK,IAAI,OAAO,IAAI;AAC1D;;;ACzEA,OAAO,QAAQ;AACf,OAAOC,WAAU;AACjB,OAAO,YAAY;AAMZ,SAAS,eAAe,UAAkB,QAA8B;AAC7E,MAAI;AACF,UAAM,UAAU,GAAG,aAAa,UAAU,OAAO;AACjD,UAAM,EAAE,MAAM,SAAS,gBAAgB,IAAI,OAAO,OAAO;AAGzD,QAAI,CAAC,KAAK,QAAQ,CAAC,KAAK,aAAa;AACnC,cAAQ,KAAK,YAAY,QAAQ,+CAA+C;AAChF,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,MACL,UAAU;AAAA,MACV,SAAS;AAAA,MACT,MAAM;AAAA,MACN;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,YAAQ,MAAM,iBAAiB,QAAQ,KAAK,KAAK;AACjD,WAAO;AAAA,EACT;AACF;AASO,SAAS,eAAe,KAAa,QAAyB;AACnE,QAAM,SAAkB,CAAC;AAGzB,QAAM,gBAAgBA,MAAK,KAAK,KAAK,UAAU;AAC/C,MAAI,GAAG,WAAW,aAAa,GAAG;AAChC,UAAM,QAAQ,eAAe,eAAe,MAAM;AAClD,QAAI,MAAO,QAAO,KAAK,KAAK;AAAA,EAC9B;AAGA,QAAM,YAAYA,MAAK,KAAK,KAAK,QAAQ;AACzC,MAAI,GAAG,WAAW,SAAS,KAAK,GAAG,SAAS,SAAS,EAAE,YAAY,GAAG;AACpE,UAAM,UAAU,GAAG,YAAY,SAAS;AACxC,eAAW,SAAS,SAAS;AAC3B,YAAM,YAAYA,MAAK,KAAK,WAAW,KAAK;AAC5C,YAAM,OAAO,GAAG,SAAS,SAAS;AAElC,UAAI,KAAK,YAAY,GAAG;AAEtB,cAAM,YAAYA,MAAK,KAAK,WAAW,UAAU;AACjD,YAAI,GAAG,WAAW,SAAS,GAAG;AAC5B,gBAAM,QAAQ,eAAe,WAAW,MAAM;AAC9C,cAAI,MAAO,QAAO,KAAK,KAAK;AAAA,QAC9B;AAAA,MACF,WAAW,UAAU,YAAY;AAC/B,cAAM,QAAQ,eAAe,WAAW,MAAM;AAC9C,YAAI,MAAO,QAAO,KAAK,KAAK;AAAA,MAC9B;AAAA,IACF;AAAA,EACF;AAGA,QAAM,kBAAkB,CAAC,YAAoB,QAAgB,GAAG,WAAmB,MAAM;AACvF,QAAI,QAAQ,SAAU;AAEtB,QAAI;AACF,YAAM,UAAU,GAAG,YAAY,UAAU;AACzC,iBAAW,SAAS,SAAS;AAC3B,YAAI,MAAM,WAAW,GAAG,KAAK,UAAU,eAAgB;AAEvD,cAAM,YAAYA,MAAK,KAAK,YAAY,KAAK;AAC7C,cAAM,OAAO,GAAG,SAAS,SAAS;AAElC,YAAI,KAAK,YAAY,KAAK,cAAc,WAAW;AACjD,gBAAM,YAAYA,MAAK,KAAK,WAAW,UAAU;AACjD,cAAI,GAAG,WAAW,SAAS,GAAG;AAC5B,kBAAM,QAAQ,eAAe,WAAW,MAAM;AAC9C,gBAAI,MAAO,QAAO,KAAK,KAAK;AAAA,UAC9B;AACA,0BAAgB,WAAW,QAAQ,GAAG,QAAQ;AAAA,QAChD;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AAAA,IAEhB;AAAA,EACF;AAEA,kBAAgB,GAAG;AAEnB,SAAO;AACT;;;ACnGA,YAAYC,WAAU;AACtB,YAAYC,SAAQ;AACpB,YAAY,QAAQ;AAMb,SAAS,aAAa,MAAc,QAAQ,IAAI,GAAkB;AACvE,QAAM,UAAa,WAAQ;AAE3B,QAAM,SAAwB;AAAA,IAC5B;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,MACV,YAAiB,WAAK,KAAK,SAAS,QAAQ;AAAA,MAC5C,YAAiB,WAAK,SAAS,SAAS,QAAQ;AAAA,IAClD;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,MACV,YAAiB,WAAK,KAAK,WAAW,QAAQ;AAAA,MAC9C,YAAiB,WAAK,SAAS,WAAW,QAAQ;AAAA,MAClD,aAAa;AAAA,IACf;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,MACV,YAAiB,WAAK,KAAK,UAAU,QAAQ;AAAA,MAC7C,YAAiB,WAAK,SAAS,WAAW,eAAe,QAAQ;AAAA,IACnE;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,MACV,YAAiB,WAAK,KAAK,YAAY,OAAO;AAAA,MAC9C,YAAiB,WAAK,SAAS,YAAY,OAAO;AAAA,IACpD;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,MACV,YAAiB,WAAK,KAAK,WAAW,QAAQ;AAAA,MAC9C,YAAiB,WAAK,SAAS,WAAW,QAAQ;AAAA,IACpD;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,MACV,YAAiB,WAAK,KAAK,UAAU,QAAQ;AAAA,MAC7C,YAAiB,WAAK,SAAS,UAAU,QAAQ;AAAA,IACnD;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,MACV,YAAiB,WAAK,KAAK,cAAc,QAAQ;AAAA,MACjD,YAAiB,WAAK,SAAS,cAAc,QAAQ;AAAA,IACvD;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,MACV,YAAiB,WAAK,KAAK,WAAW,QAAQ;AAAA,MAC9C,YAAiB,WAAK,SAAS,WAAW,QAAQ;AAAA,MAClD,aAAa;AAAA,IACf;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,MACV,YAAiB,WAAK,KAAK,gBAAgB,QAAQ;AAAA,MACnD,YAAiB,WAAK,SAAS,gBAAgB,QAAQ;AAAA,IACzD;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,MACV,YAAiB,WAAK,KAAK,aAAa,QAAQ;AAAA,MAChD,YAAiB,WAAK,SAAS,aAAa,QAAQ;AAAA,IACtD;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,MACV,YAAiB,WAAK,KAAK,WAAW,QAAQ;AAAA,MAC9C,YAAiB,WAAK,SAAS,cAAc,UAAU,QAAQ;AAAA,IACjE;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,MACV,YAAiB,WAAK,KAAK,UAAU,QAAQ;AAAA,MAC7C,YAAiB,WAAK,SAAS,WAAW,SAAS,QAAQ;AAAA,IAC7D;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,MACV,YAAiB,WAAK,KAAK,WAAW,QAAQ;AAAA,MAC9C,YAAiB,WAAK,SAAS,WAAW,QAAQ;AAAA,MAClD,aAAa;AAAA,IACf;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,MACV,YAAiB,WAAK,KAAK,WAAW,QAAQ;AAAA,MAC9C,YAAiB,WAAK,SAAS,WAAW,QAAQ;AAAA,MAClD,aAAa;AAAA,IACf;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,MACV,YAAiB,WAAK,KAAK,WAAW,QAAQ;AAAA,MAC9C,YAAiB,WAAK,SAAS,WAAW,QAAQ;AAAA,MAClD,aAAa;AAAA,IACf;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,MACV,YAAiB,WAAK,KAAK,WAAW,QAAQ;AAAA,MAC9C,YAAiB,WAAK,SAAS,WAAW,QAAQ;AAAA,MAClD,aAAa;AAAA,IACf;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,MACV,YAAiB,WAAK,KAAK,UAAU,QAAQ;AAAA,MAC7C,YAAiB,WAAK,SAAS,WAAW,SAAS,QAAQ;AAAA,IAC7D;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,MACV,YAAiB,WAAK,KAAK,UAAU,QAAQ;AAAA,MAC7C,YAAiB,WAAK,SAAS,UAAU,QAAQ;AAAA,IACnD;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,MACV,YAAiB,WAAK,KAAK,UAAU,QAAQ;AAAA,MAC7C,YAAiB,WAAK,SAAS,UAAU,QAAQ;AAAA,IACnD;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,MACV,YAAiB,WAAK,KAAK,aAAa,QAAQ;AAAA,MAChD,YAAiB,WAAK,SAAS,aAAa,QAAQ;AAAA,IACtD;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,MACV,YAAiB,WAAK,KAAK,WAAW,QAAQ;AAAA,MAC9C,YAAiB,WAAK,SAAS,WAAW,QAAQ;AAAA,MAClD,aAAa;AAAA,IACf;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,MACV,YAAiB,WAAK,KAAK,SAAS,QAAQ;AAAA,MAC5C,YAAiB,WAAK,SAAS,SAAS,QAAQ;AAAA,IAClD;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,MACV,YAAiB,WAAK,KAAK,SAAS,QAAQ;AAAA,MAC5C,YAAiB,WAAK,SAAS,SAAS,QAAQ;AAAA,IAClD;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,MACV,YAAiB,WAAK,KAAK,WAAW,QAAQ;AAAA,MAC9C,YAAiB,WAAK,SAAS,WAAW,QAAQ;AAAA,IACpD;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,MACV,YAAiB,WAAK,KAAK,SAAS,QAAQ;AAAA,MAC5C,YAAiB,WAAK,SAAS,SAAS,QAAQ;AAAA,IAClD;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,MACV,YAAiB,WAAK,KAAK,QAAQ,QAAQ;AAAA,MAC3C,YAAiB,WAAK,SAAS,QAAQ,QAAQ;AAAA,IACjD;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,MACV,YAAiB,WAAK,KAAK,YAAY,QAAQ;AAAA,MAC/C,YAAiB,WAAK,SAAS,YAAY,QAAQ;AAAA,IACrD;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,MACV,YAAiB,WAAK,KAAK,QAAQ;AAAA,MACnC,YAAiB,WAAK,SAAS,aAAa,QAAQ;AAAA,IACtD;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,MACV,YAAiB,WAAK,KAAK,WAAW,QAAQ;AAAA,MAC9C,YAAiB,WAAK,SAAS,WAAW,QAAQ;AAAA,MAClD,aAAa;AAAA,IACf;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,MACV,YAAiB,WAAK,KAAK,cAAc,QAAQ;AAAA,MACjD,YAAiB,WAAK,SAAS,cAAc,QAAQ;AAAA,IACvD;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,MACV,YAAiB,WAAK,KAAK,OAAO,QAAQ;AAAA,MAC1C,YAAiB,WAAK,SAAS,OAAO,SAAS,QAAQ;AAAA,IACzD;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,MACV,YAAiB,WAAK,KAAK,UAAU,QAAQ;AAAA,MAC7C,YAAiB,WAAK,SAAS,UAAU,QAAQ;AAAA,IACnD;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,MACV,YAAiB,WAAK,KAAK,UAAU,QAAQ;AAAA,MAC7C,YAAiB,WAAK,SAAS,UAAU,QAAQ;AAAA,IACnD;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,MACV,YAAiB,WAAK,KAAK,SAAS,QAAQ;AAAA,MAC5C,YAAiB,WAAK,SAAS,SAAS,QAAQ;AAAA,IAClD;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,MACV,YAAiB,WAAK,KAAK,WAAW,QAAQ;AAAA,MAC9C,aAAa;AAAA,IACf;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,MACV,YAAiB,WAAK,KAAK,QAAQ,QAAQ;AAAA,MAC3C,YAAiB,WAAK,SAAS,QAAQ,QAAQ;AAAA,IACjD;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,MACV,YAAiB,WAAK,KAAK,SAAS,QAAQ;AAAA,MAC5C,YAAiB,WAAK,SAAS,SAAS,QAAQ;AAAA,IAClD;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,MACV,YAAiB,WAAK,KAAK,SAAS,QAAQ;AAAA,MAC5C,YAAiB,WAAK,SAAS,YAAY,QAAQ;AAAA,IACrD;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,MACV,YAAiB,WAAK,KAAK,aAAa,QAAQ;AAAA,MAChD,YAAiB,WAAK,SAAS,YAAY,YAAY,QAAQ;AAAA,IACjE;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,MACV,YAAiB,WAAK,KAAK,aAAa,QAAQ;AAAA,MAChD,YAAiB,WAAK,SAAS,aAAa,QAAQ;AAAA,IACtD;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,MACV,YAAiB,WAAK,KAAK,WAAW,QAAQ;AAAA,MAC9C,YAAiB,WAAK,SAAS,WAAW,QAAQ;AAAA,MAClD,aAAa;AAAA,IACf;AAAA,EACF;AAEA,SAAO;AACT;AAKO,SAAS,aAAa,MAAc,QAAQ,IAAI,GAAkB;AACvE,QAAM,SAAS,aAAa,GAAG;AAG/B,aAAW,SAAS,QAAQ;AAC1B,UAAM,WAAgB,cAAQ,MAAM,UAAU;AAC9C,UAAM,WAAc,eAAW,QAAQ;AAAA,EACzC;AAEA,SAAO;AACT;AAKO,SAAS,uBAAuB,MAAc,QAAQ,IAAI,GAAW;AAC1E,SAAY,WAAK,KAAK,WAAW,QAAQ;AAC3C;AAKO,SAAS,yBAAyB,MAAc,QAAQ,IAAI,GAAW;AAC5E,QAAM,aAAa,uBAAuB,GAAG;AAC7C,MAAI,CAAI,eAAW,UAAU,GAAG;AAC9B,IAAG,cAAU,YAAY,EAAE,WAAW,KAAK,CAAC;AAAA,EAC9C;AACA,SAAO;AACT;;;ACxVA,OAAOC,SAAQ;AACf,OAAOC,WAAU;AAOV,SAAS,cACd,QACA,UACA,OAAuB,OACd;AACT,MAAI;AAEF,QAAID,IAAG,WAAW,QAAQ,GAAG;AAC3B,YAAM,QAAQA,IAAG,UAAU,QAAQ;AACnC,UAAI,MAAM,eAAe,GAAG;AAC1B,cAAM,iBAAiBA,IAAG,aAAa,QAAQ;AAC/C,YAAI,mBAAmB,QAAQ;AAC7B,iBAAO;AAAA,QACT;AAEA,QAAAA,IAAG,WAAW,QAAQ;AAAA,MACxB,OAAO;AAGL,eAAO;AAAA,MACT;AAAA,IACF;AAGA,UAAM,YAAYC,MAAK,QAAQ,QAAQ;AACvC,QAAI,CAACD,IAAG,WAAW,SAAS,GAAG;AAC7B,MAAAA,IAAG,UAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AAAA,IAC7C;AAGA,IAAAA,IAAG,YAAY,QAAQ,UAAU,IAAI;AACrC,WAAO;AAAA,EACT,SAAS,OAAY;AACnB,QAAI,MAAM,SAAS,WAAW,QAAQ,aAAa,SAAS;AAC1D,cAAQ;AAAA,QACN;AAAA,MAGF;AAAA,IACF,OAAO;AACL,cAAQ,MAAM,6BAA6B,MAAM,OAAO,EAAE;AAAA,IAC5D;AACA,WAAO;AAAA,EACT;AACF;AAKO,SAAS,kBACd,WACA,eACA,QACwC;AACxC,QAAM,SAAmB,CAAC;AAC1B,QAAM,cAAcC,MAAK,KAAK,eAAe,SAAS;AAEtD,aAAW,SAAS,QAAQ;AAC1B,UAAM,WAAWA,MAAK,KAAK,MAAM,YAAY,SAAS;AAGtD,QAAI,CAACD,IAAG,WAAW,MAAM,UAAU,GAAG;AACpC,MAAAA,IAAG,UAAU,MAAM,YAAY,EAAE,WAAW,KAAK,CAAC;AAAA,IACpD;AAEA,QAAI,cAAc,aAAa,UAAU,KAAK,GAAG;AAC/C,aAAO,KAAK,MAAM,IAAI;AAAA,IACxB;AAAA,EACF;AAEA,SAAO;AAAA,IACL,SAAS,OAAO,SAAS;AAAA,IACzB;AAAA,EACF;AACF;;;AClFA,YAAYE,SAAQ;AACpB,YAAYC,WAAU;AACtB,YAAYC,SAAQ;AACpB,YAAY,YAAY;AAGxB,IAAM,gBAAqB,WAAQ,YAAQ,GAAG,aAAa;AAC3D,IAAM,iBAAsB,WAAK,eAAe,gBAAgB;AAChE,IAAM,kBAAuB,WAAK,eAAe,YAAY;AAC7D,IAAM,yBAA8B,WAAK,eAAe,mBAAmB;AAKpE,SAAS,eAAuB;AACrC,MAAI;AACF,QAAO,eAAW,eAAe,GAAG;AAClC,aAAU,iBAAa,iBAAiB,OAAO,EAAE,KAAK;AAAA,IACxD;AAEA,UAAM,YAAmB,kBAAW;AACpC,uBAAmB;AACnB,IAAG,kBAAc,iBAAiB,WAAW,OAAO;AACpD,WAAO;AAAA,EACT,SAAS,OAAO;AACd,WAAO;AAAA,EACT;AACF;AAKO,SAAS,qBAA8B;AAC5C,MAAI;AAEF,QAAI,QAAQ,IAAI,yBAAyB,SAAS;AAChD,aAAO;AAAA,IACT;AAGA,QAAO,eAAW,sBAAsB,GAAG;AACzC,YAAM,UAAa,iBAAa,wBAAwB,OAAO,EAAE,KAAK;AACtE,aAAO,YAAY;AAAA,IACrB;AAGA,WAAO;AAAA,EACT,SAAS,OAAO;AACd,WAAO;AAAA,EACT;AACF;AAaA,SAAS,qBAA2B;AAClC,MAAI,CAAI,eAAW,aAAa,GAAG;AACjC,IAAG,cAAU,eAAe,EAAE,WAAW,KAAK,CAAC;AAAA,EACjD;AACF;AAKO,SAAS,0BAAgD;AAC9D,MAAI;AACF,QAAI,CAAI,eAAW,cAAc,GAAG;AAClC,aAAO,CAAC;AAAA,IACV;AAEA,UAAM,OAAU,iBAAa,gBAAgB,OAAO;AACpD,WAAO,KAAK,MAAM,IAAI;AAAA,EACxB,SAAS,OAAO;AACd,WAAO,CAAC;AAAA,EACV;AACF;AAKO,SAAS,wBAAwB,SAAqC;AAC3E,qBAAmB;AACnB,EAAG,kBAAc,gBAAgB,KAAK,UAAU,SAAS,MAAM,CAAC,GAAG,OAAO;AAC5E;AAKO,SAAS,kBACd,WACA,WACA,QACA,YACA,QACA,UACA,SACoB;AACpB,QAAM,SAA6B;AAAA,IACjC,IAAW,kBAAW;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IAClC;AAAA,IACA,WAAW,aAAa;AAAA,IACxB;AAAA,EACF;AAGA,QAAM,UAAU,wBAAwB;AACxC,UAAQ,KAAK,MAAM;AACnB,0BAAwB,OAAO;AAG/B,MAAI,mBAAmB,GAAG;AACxB,kBAAc,WAAW,MAAM,EAAE,MAAM,MAAM;AAAA,IAE7C,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAmCO,SAAS,aACd,WACA,WACA,QACM;AACN,QAAM,SAA6B;AAAA,IACjC,IAAW,kBAAW;AAAA,IACtB;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ;AAAA,IACA,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IAClC,UAAU;AAAA,IACV,WAAW,aAAa;AAAA,EAC1B;AAEA,MAAI,mBAAmB,GAAG;AACxB,kBAAc,UAAU,MAAM,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EAChD;AACF;AAKA,eAAe,cACb,OACA,QACe;AACf,MAAI;AACF,UAAM,UAA4B;AAAA,MAChC;AAAA,MACA,WAAW,OAAO;AAAA,MAClB,WAAW,OAAO;AAAA,MAClB,QAAQ,OAAO;AAAA,MACf,YAAY,OAAO;AAAA,MACnB,QAAQ,OAAO;AAAA,MACf,WAAW,OAAO;AAAA,MAClB,UAAU,OAAO;AAAA,MACjB,WAAW,OAAO;AAAA,MAClB,SAAS,OAAO;AAAA,MAChB,YAAY,cAAc;AAAA,IAC5B;AAEA,UAAM,eAAe,QAAQ,IAAI,4BAA4B;AAE7D,UAAM,WAAW,MAAM,MAAM,cAAc;AAAA,MACzC,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,MAClB;AAAA,MACA,MAAM,KAAK,UAAU,OAAO;AAAA,IAC9B,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI,MAAM,6BAA6B,SAAS,MAAM,EAAE;AAAA,IAChE;AAAA,EACF,SAAS,OAAO;AAEd,YAAQ,MAAM,oBAAoB,KAAK;AAAA,EACzC;AACF;AAKA,SAAS,gBAAwB;AAC/B,MAAI;AACF,UAAM,kBAAuB,WAAK,WAAW,oBAAoB;AACjE,UAAM,cAAc,KAAK,MAAS,iBAAa,iBAAiB,OAAO,CAAC;AACxE,WAAO,YAAY,WAAW;AAAA,EAChC,SAAS,OAAO;AACd,WAAO;AAAA,EACT;AACF;AAKO,SAAS,uBAKd;AACA,QAAM,UAAU,wBAAwB;AAExC,QAAM,gBAAwC,CAAC;AAC/C,QAAM,cAAsC,CAAC;AAE7C,UAAQ,QAAQ,CAAC,WAAW;AAC1B,WAAO,OAAO,QAAQ,CAAC,UAAU;AAC/B,oBAAc,KAAK,KAAK,cAAc,KAAK,KAAK,KAAK;AAAA,IACvD,CAAC;AAED,gBAAY,OAAO,SAAS,KAAK,YAAY,OAAO,SAAS,KAAK,KAAK;AAAA,EACzE,CAAC;AAED,QAAM,YAAY,OAAO,QAAQ,WAAW,EACzC,IAAI,CAAC,CAAC,MAAM,KAAK,OAAO,EAAE,MAAM,MAAM,EAAE,EACxC,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK,EAChC,MAAM,GAAG,EAAE;AAEd,QAAM,iBAAiB,QACpB,KAAK,CAAC,GAAG,MAAM,IAAI,KAAK,EAAE,SAAS,EAAE,QAAQ,IAAI,IAAI,KAAK,EAAE,SAAS,EAAE,QAAQ,CAAC,EAChF,MAAM,GAAG,EAAE;AAEd,SAAO;AAAA,IACL,eAAe,QAAQ;AAAA,IACvB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;ANpQA,eAAsB,SAAS,QAAgB,UAA2B,CAAC,GAAG;AAC5E,QAAM,MAAM,QAAQ,IAAI;AACxB,QAAM,SAAS,aAAa;AAC5B,SAAO,MAAM,mBAAmB;AAEhC,MAAI;AAEF,UAAM,eAAe,YAAY,MAAM;AACvC,WAAO,QAAQ,oBAAoB,aAAa,IAAI;AAEpD,QAAI;AACJ,QAAI,UAAyB;AAG7B,QAAI,aAAa,SAAS,UAAU;AAElC,aAAO,MAAM,uBAAuB;AACpC,YAAM,WAAW,kBAAkB,YAAY;AAC/C,UAAI,CAAC,UAAU;AACb,cAAM,IAAI,MAAM,oBAAoB;AAAA,MACtC;AAEA,gBAAUC,MAAK,KAAK,KAAK,QAAQ,GAAG,aAAa,KAAK,IAAI,aAAa,IAAI,EAAE;AAC7E,UAAIC,IAAG,WAAW,OAAO,GAAG;AAC1B,QAAAA,IAAG,OAAO,SAAS,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,MACrD;AACA,MAAAA,IAAG,UAAU,SAAS,EAAE,WAAW,KAAK,CAAC;AAEzC,YAAM,MAAM,UAAU;AACtB,YAAM,IAAI,MAAM,UAAU,SAAS,CAAC,WAAW,GAAG,CAAC;AAEnD,kBAAY,aAAa,OACrBD,MAAK,KAAK,SAAS,aAAa,IAAI,IACpC;AAEJ,aAAO,QAAQ,mBAAmB;AAAA,IACpC,WAAW,aAAa,SAAS,SAAS;AACxC,kBAAYA,MAAK,QAAQ,KAAK,aAAa,KAAK;AAChD,UAAI,CAACC,IAAG,WAAW,SAAS,GAAG;AAC7B,cAAM,IAAI,MAAM,yBAAyB,SAAS,EAAE;AAAA,MACtD;AACA,aAAO,QAAQ,kBAAkB;AAAA,IACnC,OAAO;AACL,YAAM,IAAI,MAAM,4BAA4B,aAAa,IAAI,EAAE;AAAA,IACjE;AAGA,WAAO,MAAM,uBAAuB;AACpC,QAAI,SAAS,eAAe,WAAW,MAAM;AAE7C,QAAI,OAAO,WAAW,GAAG;AACvB,aAAO,KAAK,uBAAuB;AACnC,cAAQ,IAAIC,OAAM,OAAO,iDAAiD,CAAC;AAC3E,cAAQ,IAAIA,OAAM,OAAO,wBAAwB,CAAC;AAClD,cAAQ,IAAIA,OAAM,OAAO,gCAAgC,CAAC;AAC1D;AAAA,IACF;AAGA,QAAI,QAAQ,OAAO;AACjB,YAAM,cAAc,QAAQ,MAAM,YAAY;AAC9C,eAAS,OAAO;AAAA,QAAO,OACrB,EAAE,SAAS,KAAK,YAAY,EAAE,QAAQ,QAAQ,GAAG,MAAM,eACvD,EAAE,SAAS,KAAK,YAAY,MAAM;AAAA,MACpC;AAEA,UAAI,OAAO,WAAW,GAAG;AACvB,eAAO,KAAK,4BAA4B,QAAQ,KAAK,EAAE;AACvD,gBAAQ,IAAIA,OAAM,OAAO,qBAAqB,CAAC;AAC/C,cAAM,YAAY,eAAe,WAAW,MAAM;AAClD,kBAAU,QAAQ,OAAK;AACrB,kBAAQ,IAAIA,OAAM,KAAK,OAAO,EAAE,SAAS,KAAK,YAAY,EAAE,QAAQ,QAAQ,GAAG,CAAC,EAAE,CAAC;AAAA,QACrF,CAAC;AACD;AAAA,MACF;AACA,aAAO,QAAQ,gBAAgB,OAAO,CAAC,EAAE,SAAS,IAAI,EAAE;AAAA,IAC1D,OAAO;AACL,aAAO,QAAQ,SAAS,OAAO,MAAM,WAAW;AAAA,IAClD;AAGA,UAAM,gBAAgB,yBAAyB,GAAG;AAGlD,UAAM,SAAS,aAAa,GAAG;AAC/B,UAAM,iBAAiB,OAAO,OAAO,OAAK,EAAE,QAAQ;AAEpD,QAAI,eAAe,WAAW,GAAG;AAC/B,cAAQ,IAAIA,OAAM,OAAO,+CAA+C,CAAC;AACzE,cAAQ,IAAIA,OAAM,OAAO,0CAA0C,CAAC;AAAA,IACtE,OAAO;AACL,cAAQ,IAAIA,OAAM,MAAM;AAAA,mBAAsB,eAAe,IAAI,OAAK,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;AAAA,IAC7F;AAGA,eAAW,SAAS,QAAQ;AAC1B,aAAO,MAAM,cAAc,MAAM,SAAS,IAAI,KAAK;AAGnD,YAAM,YAAY,MAAM,SAAS,KAAK,YAAY,EAAE,QAAQ,QAAQ,GAAG;AACvE,YAAM,eAAeF,MAAK,KAAK,eAAe,SAAS;AAGvD,YAAM,iBAAiBA,MAAK,QAAQ,MAAM,IAAI;AAG9C,UAAIC,IAAG,WAAW,YAAY,GAAG;AAC/B,QAAAA,IAAG,OAAO,cAAc,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,MAC1D;AACA,MAAAA,IAAG,UAAU,cAAc,EAAE,WAAW,KAAK,CAAC;AAG9C,oBAAc,gBAAgB,YAAY;AAG1C,YAAM,aAAaD,MAAK,KAAK,cAAc,SAAS;AACpD,MAAAC,IAAG,cAAc,YAAY,QAAQ,OAAO;AAE5C,cAAQ,IAAIC,OAAM,KAAK,aAAa,MAAM,SAAS,IAAI,eAAe,CAAC;AAGvE,YAAM,EAAE,SAAS,OAAO,IAAI,kBAAkB,WAAW,eAAe,cAAc;AAEtF,UAAI,SAAS;AACX,eAAO;AAAA,UACL,GAAG,MAAM,SAAS,IAAI,6BAA6B,OAAO,KAAK,IAAI,CAAC;AAAA,QACtE;AAAA,MACF,OAAO;AACL,eAAO;AAAA,UACL,GAAG,MAAM,SAAS,IAAI;AAAA,QACxB;AAAA,MACF;AAEA,cAAQ,IAAIA,OAAM,KAAK,eAAe,YAAY,EAAE,CAAC;AAGrD;AAAA,QACE,MAAM,SAAS;AAAA,QACf;AAAA,QACA;AAAA,QACA,aAAa;AAAA,QACb,OAAO,IAAI,OAAK,CAAQ;AAAA,QACxB,QAAQ,UAAU;AAAA,QAClB,MAAM,SAAS;AAAA,MACjB;AAAA,IACF;AAGA,QAAI,WAAWD,IAAG,WAAW,OAAO,GAAG;AACrC,MAAAA,IAAG,OAAO,SAAS,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,IACrD;AAEA,YAAQ,IAAIC,OAAM,MAAM,6CAAwC,CAAC;AAAA,EACnE,SAAS,OAAY;AACnB,WAAO,KAAK,qBAAqB;AACjC,YAAQ,MAAMA,OAAM,IAAI;AAAA,SAAY,MAAM,OAAO,EAAE,CAAC;AACpD,UAAM;AAAA,EACR;AACF;AAKA,SAAS,cAAc,KAAa,MAAc;AAChD,MAAI,CAACD,IAAG,WAAW,IAAI,GAAG;AACxB,IAAAA,IAAG,UAAU,MAAM,EAAE,WAAW,KAAK,CAAC;AAAA,EACxC;AAEA,QAAM,UAAUA,IAAG,YAAY,KAAK,EAAE,eAAe,KAAK,CAAC;AAE3D,aAAW,SAAS,SAAS;AAC3B,UAAM,UAAUD,MAAK,KAAK,KAAK,MAAM,IAAI;AACzC,UAAM,WAAWA,MAAK,KAAK,MAAM,MAAM,IAAI;AAE3C,QAAI,MAAM,YAAY,GAAG;AACvB,oBAAc,SAAS,QAAQ;AAAA,IACjC,OAAO;AACL,MAAAC,IAAG,aAAa,SAAS,QAAQ;AAAA,IACnC;AAAA,EACF;AACF;;;AOvMA,OAAOE,SAAQ;AACf,OAAOC,WAAU;AACjB,OAAOC,YAAW;AAQX,SAAS,aAAa;AAC3B,QAAM,MAAM,QAAQ,IAAI;AACxB,QAAM,gBAAgB,uBAAuB,GAAG;AAEhD,MAAI,CAACC,IAAG,WAAW,aAAa,GAAG;AACjC,YAAQ,IAAIC,OAAM,OAAO,0BAA0B,CAAC;AACpD,YAAQ,IAAIA,OAAM,KAAK,kDAAkD,CAAC;AAC1E;AAAA,EACF;AAEA,QAAM,UAAUD,IAAG,YAAY,aAAa;AAC5C,QAAM,SAAS,QAAQ,OAAO,WAAS;AACrC,UAAM,YAAYE,MAAK,KAAK,eAAe,KAAK;AAChD,WAAOF,IAAG,SAAS,SAAS,EAAE,YAAY;AAAA,EAC5C,CAAC;AAED,MAAI,OAAO,WAAW,GAAG;AACvB,YAAQ,IAAIC,OAAM,OAAO,0BAA0B,CAAC;AACpD;AAAA,EACF;AAEA,UAAQ,IAAIA,OAAM,KAAK;AAAA,8BAA0B,OAAO,MAAM;AAAA,CAAM,CAAC;AAErE,aAAW,YAAY,QAAQ;AAC7B,UAAM,YAAYC,MAAK,KAAK,eAAe,QAAQ;AACnD,UAAM,cAAcA,MAAK,KAAK,WAAW,UAAU;AAEnD,QAAIF,IAAG,WAAW,WAAW,GAAG;AAC9B,YAAM,QAAQ,eAAe,aAAa,OAAO;AACjD,UAAI,OAAO;AACT,gBAAQ,IAAIC,OAAM,MAAM,YAAO,MAAM,SAAS,IAAI,EAAE,CAAC;AACrD,gBAAQ,IAAIA,OAAM,KAAK,OAAO,MAAM,SAAS,WAAW,EAAE,CAAC;AAE3D,YAAI,MAAM,SAAS,SAAS;AAC1B,kBAAQ,IAAIA,OAAM,KAAK,gBAAgB,MAAM,SAAS,OAAO,EAAE,CAAC;AAAA,QAClE;AAEA,YAAI,MAAM,SAAS,QAAQ,MAAM,SAAS,KAAK,SAAS,GAAG;AACzD,kBAAQ,IAAIA,OAAM,KAAK,aAAa,MAAM,SAAS,KAAK,KAAK,IAAI,CAAC,EAAE,CAAC;AAAA,QACvE;AAEA,gBAAQ,IAAIA,OAAM,KAAK,aAAa,SAAS,EAAE,CAAC;AAChD,gBAAQ,IAAI;AAAA,MACd;AAAA,IACF,OAAO;AACL,cAAQ,IAAIA,OAAM,OAAO,YAAO,QAAQ,sBAAsB,CAAC;AAC/D,cAAQ,IAAI;AAAA,IACd;AAAA,EACF;AACF;;;AC3DA,OAAOE,SAAQ;AACf,OAAOC,WAAU;AACjB,OAAOC,gBAAe;AACtB,OAAOC,YAAW;AAElB,SAAS,cAAc;AACvB,OAAOC,YAAW;;;ACNlB,OAAO,SAAS,gBAAgB;AAChC,SAAS,KAAK,MAAM,gBAAgB;AAS7B,IAAM,gBAA8C,CAAC,EAAE,QAAQ,UAAU,SAAS,MAAM;AAC7F,QAAM,CAAC,eAAe,gBAAgB,IAAI,SAAS,CAAC;AAEpD,WAAS,CAAC,OAAO,QAAQ;AACvB,QAAI,IAAI,SAAS;AACf,uBAAiB,UAAQ,KAAK,IAAI,GAAG,OAAO,CAAC,CAAC;AAAA,IAChD,WAAW,IAAI,WAAW;AACxB,uBAAiB,UAAQ,KAAK,IAAI,OAAO,SAAS,GAAG,OAAO,CAAC,CAAC;AAAA,IAChE,WAAW,IAAI,QAAQ;AACrB,eAAS,OAAO,aAAa,CAAC;AAAA,IAChC,WAAW,IAAI,UAAU,UAAU,KAAK;AACtC,eAAS;AAAA,IACX;AAAA,EACF,CAAC;AAED,SACE,oCAAC,OAAI,eAAc,YACjB,oCAAC,OAAI,cAAc,KACjB,oCAAC,QAAK,MAAI,MAAC,OAAM,UAAO,oBACZ,OAAO,QAAO,0EAC1B,CACF,GAEC,OAAO,IAAI,CAAC,OAAO,UAAU;AAC5B,UAAM,mBAAmB,CAAC,UAAmB;AAC3C,UAAI,CAAC,MAAO,QAAO;AACnB,UAAI,SAAS,GAAI,QAAO;AACxB,UAAI,SAAS,GAAI,QAAO;AACxB,UAAI,SAAS,GAAI,QAAO;AACxB,UAAI,SAAS,GAAI,QAAO;AACxB,aAAO;AAAA,IACT;AAEA,UAAM,mBAAmB,CAAC,UAAmB;AAC3C,UAAI,CAAC,MAAO,QAAO;AACnB,UAAI,SAAS,GAAI,QAAO;AACxB,UAAI,SAAS,GAAI,QAAO;AACxB,UAAI,SAAS,GAAI,QAAO;AACxB,UAAI,SAAS,GAAI,QAAO;AACxB,aAAO;AAAA,IACT;AAEA,WACE,oCAAC,OAAI,KAAK,OAAO,YAAY,GAAG,eAAc,YAC5C,oCAAC,WACC,oCAAC,QAAK,OAAO,UAAU,gBAAgB,UAAU,WAC9C,UAAU,gBAAgB,YAAO,MAClC,oCAAC,QAAK,MAAI,QAAE,MAAM,SAAS,IAAK,GAC/B,MAAM,SAAS,mBAAmB,UACjC,oCAAC,QAAK,OAAO,iBAAiB,MAAM,SAAS,cAAc,KACxD,MAAM,iBAAiB,MAAM,SAAS,cAAc,GAAE,KAAE,MAAM,SAAS,gBAAe,GACzF,GAED,MAAM,SAAS,kBAAkB,UAChC,oCAAC,QAAK,UAAQ,QAAC,YAAI,MAAM,SAAS,eAAc,GAAC,CAErD,CACF,GACA,oCAAC,OAAI,YAAY,KACf,oCAAC,QAAK,UAAQ,QAAE,MAAM,SAAS,WAAY,CAC7C,CACF;AAAA,EAEJ,CAAC,GAED,oCAAC,OAAI,WAAW,KACd,oCAAC,QAAK,UAAQ,QACX,OAAO,aAAa,GAAG,SAAS,QAC/B,SAAS,OAAO,aAAa,EAAE,SAAS,KAAK,KAAK,IAAI,CAAC,EAE3D,CACF,CACF;AAEJ;;;ADzEA,OAAO,YAAY;AAEnB,OAAO,OAAO;AAyBd,eAAe,YAAY,OAAe;AACxC,QAAM,SAAS,aAAa;AAC5B,SAAO,MAAM,kBAAkB,KAAK,MAAM;AAE1C,MAAI;AACF,UAAM,SAAS,QAAQ,IAAI,sBAAsB;AACjD,UAAM,WAAW,MAAM,MAAM,GAAG,MAAM,sBAAsB,mBAAmB,KAAK,CAAC,WAAW;AAEhG,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI,MAAM,uBAAuB,SAAS,UAAU,EAAE;AAAA,IAC9D;AAEA,UAAM,OAAO,MAAM,SAAS,KAAK;AAEjC,QAAI,CAAC,KAAK,WAAW,CAAC,KAAK,QAAQ,KAAK,KAAK,WAAW,GAAG;AACzD,aAAO,KAAK,iBAAiB;AAC7B,cAAQ,IAAIC,OAAM,OAAO;AAAA,uBAA0B,KAAK,GAAG,CAAC;AAC5D,cAAQ,IAAIA,OAAM,KAAK,+CAA+C,CAAC;AACvE,cAAQ,IAAIA,OAAM,KAAK,KAAK,MAAM,EAAE,CAAC;AACrC;AAAA,IACF;AAEA,WAAO,QAAQ,SAAS,KAAK,KAAK,MAAM,WAAW;AAGnD,UAAM,SAAkB,KAAK,KAAK,IAAI,CAAC,UAAe;AAEpD,UAAI,YAAY,MAAM,aAAa;AACnC,UAAI,UAAU,SAAS,WAAW,GAAG;AACnC,oBAAY,UAAU,MAAM,GAAG,EAAE;AAAA,MACnC,WAAW,UAAU,SAAS,UAAU,GAAG;AACzC,oBAAY,UAAU,MAAM,GAAG,EAAE;AAAA,MACnC;AAEA,aAAO;AAAA,QACL,UAAU;AAAA,UACR,MAAM,MAAM;AAAA,UACZ,aAAa,MAAM;AAAA,UACnB,SAAS,MAAM;AAAA,UACf,QAAQ,MAAM;AAAA,UACd,MAAM,MAAM,QAAQ,CAAC;AAAA,UACrB,gBAAgB,MAAM;AAAA,UACtB,gBAAgB,MAAM;AAAA,UACtB,eAAe,MAAM;AAAA,QACvB;AAAA,QACA,SAAS;AAAA,QACT,MAAM;AAAA,QACN,QAAQ,GAAG,MAAM,UAAU,IAAI,MAAM,SAAS,GAAG,YAAY,MAAM,YAAY,EAAE;AAAA,MACnF;AAAA,IACF,CAAC;AAGD,UAAM,EAAE,cAAc,IAAI;AAAA,MACxBC,OAAM,cAAc,eAAe;AAAA,QACjC;AAAA,QACA,UAAU,CAAC,UAAiB;AAC1B,kBAAQ,IAAID,OAAM,MAAM;AAAA,mBAAiB,MAAM,SAAS,IAAI,EAAE,CAAC;AAC/D,kBAAQ,IAAIA,OAAM,KAAK;AAAA,4BAA+B,CAAC;AACvD,kBAAQ,IAAIA,OAAM,KAAK,oBAAoB,MAAM,MAAM,EAAE,CAAC;AAC1D,kBAAQ,KAAK,CAAC;AAAA,QAChB;AAAA,QACA,UAAU,MAAM;AACd,kBAAQ,IAAIA,OAAM,OAAO,aAAa,CAAC;AACvC,kBAAQ,KAAK,CAAC;AAAA,QAChB;AAAA,MACF,CAAC;AAAA,IACH;AAEA,UAAM,cAAc;AAAA,EACtB,SAAS,OAAY;AACnB,WAAO,KAAK,eAAe;AAC3B,YAAQ,MAAMA,OAAM,IAAI;AAAA,SAAY,MAAM,OAAO,EAAE,CAAC;AACpD,UAAM;AAAA,EACR;AACF;AAKA,eAAe,mBAAmB,QAAgB,cAAmB;AACnE,QAAM,MAAM,QAAQ,IAAI;AACxB,QAAM,SAAS,aAAa;AAE5B,MAAI;AACJ,MAAI,UAAyB;AAE7B,MAAI;AAEF,QAAI,aAAa,SAAS,UAAU;AAClC,aAAO,MAAM,uBAAuB;AACpC,YAAM,WAAW,kBAAkB,YAAY;AAC/C,UAAI,CAAC,UAAU;AACb,cAAM,IAAI,MAAM,oBAAoB;AAAA,MACtC;AAEA,gBAAUE,MAAK,KAAK,KAAK,QAAQ,GAAG,aAAa,KAAK,IAAI,aAAa,IAAI,EAAE;AAC7E,UAAIC,IAAG,WAAW,OAAO,GAAG;AAC1B,QAAAA,IAAG,OAAO,SAAS,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,MACrD;AACA,MAAAA,IAAG,UAAU,SAAS,EAAE,WAAW,KAAK,CAAC;AAEzC,YAAM,MAAMC,WAAU;AACtB,YAAM,IAAI,MAAM,UAAU,SAAS,CAAC,WAAW,GAAG,CAAC;AAEnD,kBAAY,aAAa,OACrBF,MAAK,KAAK,SAAS,aAAa,IAAI,IACpC;AAEJ,aAAO,QAAQ,mBAAmB;AAAA,IACpC,WAAW,aAAa,SAAS,SAAS;AACxC,kBAAYA,MAAK,QAAQ,KAAK,aAAa,KAAK;AAChD,UAAI,CAACC,IAAG,WAAW,SAAS,GAAG;AAC7B,cAAM,IAAI,MAAM,yBAAyB,SAAS,EAAE;AAAA,MACtD;AACA,aAAO,QAAQ,kBAAkB;AAAA,IACnC,OAAO;AACL,YAAM,IAAI,MAAM,4BAA4B,aAAa,IAAI,EAAE;AAAA,IACjE;AAGA,WAAO,MAAM,uBAAuB;AACpC,UAAM,SAAS,eAAe,WAAW,MAAM;AAE/C,QAAI,OAAO,WAAW,GAAG;AACvB,aAAO,KAAK,uBAAuB;AACnC,cAAQ,IAAIH,OAAM,OAAO,iDAAiD,CAAC;AAC3E,cAAQ,IAAIA,OAAM,OAAO,wBAAwB,CAAC;AAClD,cAAQ,IAAIA,OAAM,OAAO,gCAAgC,CAAC;AAG1D,UAAI,WAAWG,IAAG,WAAW,OAAO,GAAG;AACrC,QAAAA,IAAG,OAAO,SAAS,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,MACrD;AACA;AAAA,IACF;AAEA,WAAO,QAAQ,SAAS,OAAO,MAAM,WAAW;AAGhD,UAAM,EAAE,cAAc,IAAI;AAAA,MACxBF,OAAM,cAAc,eAAe;AAAA,QACjC;AAAA,QACA,UAAU,CAAC,UAAiB;AAC1B,kBAAQ,IAAID,OAAM,MAAM;AAAA,mBAAiB,MAAM,SAAS,IAAI,EAAE,CAAC;AAC/D,kBAAQ,IAAIA,OAAM,KAAK;AAAA,4BAA+B,CAAC;AACvD,kBAAQ,IAAIA,OAAM,KAAK,oBAAoB,MAAM,YAAY,MAAM,SAAS,KAAK,YAAY,EAAE,QAAQ,QAAQ,GAAG,CAAC,EAAE,CAAC;AACtH,kBAAQ,KAAK,CAAC;AAAA,QAChB;AAAA,QACA,UAAU,MAAM;AACd,kBAAQ,IAAIA,OAAM,OAAO,aAAa,CAAC;AACvC,kBAAQ,KAAK,CAAC;AAAA,QAChB;AAAA,MACF,CAAC;AAAA,IACH;AAEA,UAAM,cAAc;AAGpB,QAAI,WAAWG,IAAG,WAAW,OAAO,GAAG;AACrC,MAAAA,IAAG,OAAO,SAAS,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,IACrD;AAAA,EACF,SAAS,OAAY;AACnB,WAAO,KAAK,uBAAuB;AACnC,YAAQ,MAAMH,OAAM,IAAI;AAAA,SAAY,MAAM,OAAO,EAAE,CAAC;AACpD,UAAM;AAAA,EACR;AACF;AAMA,eAAsB,WAAW,QAAgB;AAC/C,QAAM,SAAS,aAAa;AAC5B,SAAO,MAAM,mBAAmB;AAEhC,MAAI;AACF,UAAM,eAAe,YAAY,MAAM;AACvC,WAAO,QAAQ,kBAAkB,aAAa,IAAI,EAAE;AAGpD,QAAI,aAAa,SAAS,UAAU;AAClC,YAAM,YAAY,aAAa,KAAK;AAAA,IACtC,OAAO;AACL,YAAM,mBAAmB,QAAQ,YAAY;AAAA,IAC/C;AAAA,EACF,SAAS,OAAY;AACnB,YAAQ,MAAMA,OAAM,IAAI;AAAA,SAAY,MAAM,OAAO,EAAE,CAAC;AACpD,UAAM;AAAA,EACR;AACF;;;AEpOA,OAAOK,SAAQ;AACf,OAAOC,WAAU;AACjB,OAAOC,YAAW;AAClB,SAAS,UAAAC,eAAc;AACvB,OAAOC,YAAW;AAClB,OAAO,iBAAiB;AACxB,SAAS,OAAAC,MAAK,QAAAC,aAAY;AAc1B,eAAsB,eAAe;AACnC,QAAM,MAAM,QAAQ,IAAI;AACxB,QAAM,gBAAgB,uBAAuB,GAAG;AAEhD,MAAI,CAACC,IAAG,WAAW,aAAa,GAAG;AACjC,YAAQ,IAAIC,OAAM,OAAO,0BAA0B,CAAC;AACpD;AAAA,EACF;AAEA,QAAM,YAAYD,IAAG,YAAY,aAAa,EAAE,OAAO,CAAC,SAAS;AAC/D,UAAM,WAAWE,MAAK,KAAK,eAAe,IAAI;AAC9C,WAAOF,IAAG,SAAS,QAAQ,EAAE,YAAY;AAAA,EAC3C,CAAC;AAED,MAAI,UAAU,WAAW,GAAG;AAC1B,YAAQ,IAAIC,OAAM,OAAO,0BAA0B,CAAC;AACpD;AAAA,EACF;AAGA,QAAM,SAAsB,UAAU,IAAI,CAAC,QAAQ;AACjD,UAAM,YAAYC,MAAK,KAAK,eAAe,GAAG;AAC9C,UAAM,cAAcA,MAAK,KAAK,WAAW,UAAU;AAEnD,QAAI,QAAQ;AACZ,QAAIF,IAAG,WAAW,WAAW,GAAG;AAC9B,UAAI;AACF,cAAM,QAAQ,eAAe,aAAa,GAAG;AAC7C,YAAI,OAAO;AACT,kBAAQ,GAAG,MAAM,SAAS,IAAI,KAAK,GAAG;AAAA,QACxC;AAAA,MACF,SAAS,OAAO;AAAA,MAEhB;AAAA,IACF;AAEA,WAAO,EAAE,OAAO,OAAO,IAAI;AAAA,EAC7B,CAAC;AAED,SAAO,KAAK,EAAE,OAAOC,OAAM,KAAK,aAAQ,GAAG,OAAO,WAAW,CAAC;AAE9D,UAAQ,IAAIA,OAAM,KAAK,iCAA0B,CAAC;AAGlD,QAAM,EAAE,cAAc,IAAIE;AAAA,IACxBC,OAAM;AAAA,MACJC;AAAA,MACA,EAAE,eAAe,UAAU,SAAS,EAAE;AAAA,MACtCD,OAAM,cAAcE,OAAM,EAAE,UAAU,KAAK,GAAG,2BAA2B;AAAA,MACzEF,OAAM,cAAc,aAAa;AAAA,QAC/B,OAAO;AAAA,QACP,UAAU,CAAC,SAAc;AACvB,cAAI,KAAK,UAAU,YAAY;AAC7B,oBAAQ,KAAK,CAAC;AAAA,UAChB;AAGA,yBAAe,KAAK,OAAO,eAAe,GAAG,EAAE,KAAK,MAAM;AAAA,UAAC,CAAC;AAAA,QAC9D;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,cAAc;AACtB;AAKA,eAAe,eAAe,WAAmB,eAAuB,KAAa;AACnF,QAAM,UAAU;AAAA,IACd,EAAE,OAAO,2BAAe,OAAO,SAAS;AAAA,IACxC,EAAE,OAAO,2BAAiB,OAAO,OAAO;AAAA,IACxC,EAAE,OAAO,eAAU,OAAO,OAAO;AAAA,EACnC;AAEA,QAAM,EAAE,eAAe,MAAM,IAAID;AAAA,IAC/BC,OAAM;AAAA,MACJC;AAAA,MACA,EAAE,eAAe,UAAU,SAAS,EAAE;AAAA,MACtCD,OAAM,cAAcE,OAAM,EAAE,MAAM,KAAK,GAAG,WAAW,SAAS,EAAE;AAAA,MAChEF,OAAM,cAAcE,OAAM,EAAE,UAAU,KAAK,GAAG,qBAAqB;AAAA,MACnEF,OAAM,cAAc,aAAa;AAAA,QAC/B,OAAO;AAAA,QACP,UAAU,CAAC,SAAc;AACvB,gBAAM;AAEN,cAAI,KAAK,UAAU,QAAQ;AACzB,oBAAQ,KAAK,CAAC;AAAA,UAChB,WAAW,KAAK,UAAU,UAAU;AAClC,wBAAY,WAAW,eAAe,GAAG,EAAE,KAAK,MAAM,QAAQ,KAAK,CAAC,CAAC;AAAA,UACvE,WAAW,KAAK,UAAU,QAAQ;AAChC,0BAAc,WAAW,aAAa,EAAE,KAAK,MAAM,QAAQ,KAAK,CAAC,CAAC;AAAA,UACpE;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,cAAc;AACtB;AAKA,eAAe,YAAY,WAAmB,eAAuB,KAAa;AAChF,QAAM,SAAS,aAAa;AAC5B,QAAM,YAAYF,MAAK,KAAK,eAAe,SAAS;AAEpD,SAAO,MAAM,YAAY,SAAS,KAAK;AAEvC,MAAI;AAEF,UAAM,YAAY,CAAC,WAAW,WAAW,aAAa,UAAU,aAAa,QAAQ;AACrF,UAAM,eAAyB,CAAC;AAEhC,eAAW,YAAY,WAAW;AAChC,YAAM,kBAAkBA,MAAK,KAAK,KAAK,UAAU,QAAQ;AACzD,YAAM,WAAWA,MAAK,KAAK,iBAAiB,SAAS;AAErD,UAAIF,IAAG,WAAW,QAAQ,GAAG;AAC3B,cAAM,QAAQA,IAAG,UAAU,QAAQ;AACnC,YAAI,MAAM,eAAe,GAAG;AAC1B,UAAAA,IAAG,WAAW,QAAQ;AACtB,uBAAa,KAAK,SAAS,QAAQ,KAAK,EAAE,CAAC;AAAA,QAC7C;AAAA,MACF;AAAA,IACF;AAGA,IAAAA,IAAG,OAAO,WAAW,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAGrD,iBAAa,WAAW,WAAW,YAAmB;AAEtD,WAAO,QAAQ,GAAG,SAAS,uBAAuB;AAClD,QAAI,aAAa,SAAS,GAAG;AAC3B,cAAQ,IAAIC,OAAM,KAAK,mBAAmB,aAAa,KAAK,IAAI,CAAC,EAAE,CAAC;AAAA,IACtE;AAAA,EACF,SAAS,OAAY;AACnB,WAAO,KAAK,oBAAoB,SAAS,EAAE;AAC3C,YAAQ,MAAMA,OAAM,IAAI,UAAU,MAAM,OAAO,EAAE,CAAC;AAAA,EACpD;AACF;AAKA,eAAe,cAAc,WAAmB,eAAuB;AACrE,QAAM,YAAYC,MAAK,KAAK,eAAe,SAAS;AACpD,QAAM,cAAcA,MAAK,KAAK,WAAW,UAAU;AAEnD,UAAQ,IAAID,OAAM,KAAK;AAAA,mBAAe,SAAS;AAAA,CAAI,CAAC;AACpD,UAAQ,IAAIA,OAAM,KAAK,aAAa,SAAS;AAAA,CAAI,CAAC;AAElD,MAAID,IAAG,WAAW,WAAW,GAAG;AAC9B,QAAI;AACF,YAAM,QAAQ,eAAe,aAAa,SAAS;AACnD,UAAI,CAAC,OAAO;AACV,gBAAQ,IAAIC,OAAM,OAAO,0BAA0B,CAAC;AACpD;AAAA,MACF;AACA,YAAM,EAAE,UAAU,QAAQ,IAAI;AAE9B,cAAQ,IAAIA,OAAM,KAAK,WAAW,CAAC;AACnC,cAAQ,IAAI,WAAW,SAAS,IAAI,EAAE;AACtC,cAAQ,IAAI,kBAAkB,SAAS,WAAW,EAAE;AACpD,UAAI,SAAS,QAAS,SAAQ,IAAI,cAAc,SAAS,OAAO,EAAE;AAClE,UAAI,SAAS,OAAQ,SAAQ,IAAI,aAAa,SAAS,MAAM,EAAE;AAC/D,UAAI,SAAS,KAAM,SAAQ,IAAI,WAAW,SAAS,KAAK,KAAK,IAAI,CAAC,EAAE;AAEpE,cAAQ,IAAIA,OAAM,KAAK,oBAAoB,CAAC;AAC5C,YAAM,UAAU,QAAQ,MAAM,IAAI,EAAE,MAAM,GAAG,EAAE,EAAE,KAAK,IAAI;AAC1D,cAAQ,IAAIA,OAAM,KAAK,OAAO,CAAC;AAC/B,UAAI,QAAQ,MAAM,IAAI,EAAE,SAAS,IAAI;AACnC,gBAAQ,IAAIA,OAAM,KAAK,KAAK,CAAC;AAAA,MAC/B;AAAA,IACF,SAAS,OAAO;AACd,cAAQ,IAAIA,OAAM,OAAO,0BAA0B,CAAC;AAAA,IACtD;AAAA,EACF,OAAO;AACL,YAAQ,IAAIA,OAAM,OAAO,mBAAmB,CAAC;AAAA,EAC/C;AACF;;;AC3MA,OAAOM,SAAQ;AACf,OAAOC,YAAU;AACjB,OAAOC,YAAW;AASlB,eAAsB,aAAa,YAAuB;AACxD,QAAM,MAAM,QAAQ,IAAI;AACxB,QAAM,gBAAgB,uBAAuB,GAAG;AAChD,QAAM,SAAS,aAAa;AAE5B,MAAI,CAACC,IAAG,WAAW,aAAa,GAAG;AACjC,YAAQ,IAAIC,OAAM,OAAO,0BAA0B,CAAC;AACpD;AAAA,EACF;AAEA,QAAM,YAAYD,IAAG,YAAY,aAAa,EAAE,OAAO,CAAC,SAAS;AAC/D,UAAM,WAAWE,OAAK,KAAK,eAAe,IAAI;AAC9C,WAAOF,IAAG,SAAS,QAAQ,EAAE,YAAY;AAAA,EAC3C,CAAC;AAED,MAAI,UAAU,WAAW,GAAG;AAC1B,YAAQ,IAAIC,OAAM,OAAO,0BAA0B,CAAC;AACpD;AAAA,EACF;AAGA,MAAI,iBAAiB;AACrB,MAAI,cAAc,WAAW,SAAS,GAAG;AACvC,qBAAiB,UAAU,OAAO,CAAC,QAAQ,WAAW,SAAS,GAAG,CAAC;AAEnE,QAAI,eAAe,WAAW,GAAG;AAC/B,cAAQ,IAAIA,OAAM,OAAO,2BAA2B,CAAC;AACrD,cAAQ,IAAIA,OAAM,KAAK,qBAAqB,CAAC;AAC7C,gBAAU,QAAQ,CAAC,QAAQ,QAAQ,IAAIA,OAAM,KAAK,OAAO,GAAG,EAAE,CAAC,CAAC;AAChE;AAAA,IACF;AAAA,EACF;AAEA,UAAQ,IAAIA,OAAM,KAAK;AAAA,qBAAiB,eAAe,MAAM;AAAA,CAAgB,CAAC;AAE9E,MAAI,UAAU;AACd,MAAI,SAAS;AACb,MAAI,UAAU;AAEd,aAAW,aAAa,gBAAgB;AACtC,UAAM,YAAYC,OAAK,KAAK,eAAe,SAAS;AACpD,UAAM,cAAcA,OAAK,KAAK,WAAW,UAAU;AACnD,UAAM,aAAaA,OAAK,KAAK,WAAW,SAAS;AAGjD,QAAI,CAACF,IAAG,WAAW,UAAU,GAAG;AAC9B,aAAO,KAAK,GAAG,SAAS,mCAAmC;AAC3D;AACA;AAAA,IACF;AAEA,QAAI;AACF,YAAM,SAASA,IAAG,aAAa,YAAY,OAAO,EAAE,KAAK;AAGzD,UAAI,iBAAiB;AACrB,UAAIA,IAAG,WAAW,WAAW,GAAG;AAC9B,cAAM,QAAQ,eAAe,aAAa,SAAS;AACnD,YAAI,SAAS,MAAM,SAAS,SAAS;AACnC,2BAAiB,MAAM,SAAS;AAAA,QAClC;AAAA,MACF;AAEA,aAAO,MAAM,YAAY,SAAS,cAAc,cAAc,MAAM;AAGpE,YAAM,SAAS,QAAQ,EAAE,OAAO,UAAU,CAAC;AAE3C,aAAO,QAAQ,GAAG,SAAS,uBAAuB;AAClD;AAAA,IACF,SAAS,OAAY;AACnB,aAAO,KAAK,GAAG,SAAS,iBAAiB;AACzC,cAAQ,MAAMC,OAAM,IAAI,YAAY,MAAM,OAAO,EAAE,CAAC;AACpD;AAAA,IACF;AAAA,EACF;AAGA,UAAQ,IAAIA,OAAM,KAAK,6BAAsB,CAAC;AAC9C,UAAQ,IAAIA,OAAM,MAAM,qBAAgB,OAAO,EAAE,CAAC;AAClD,MAAI,UAAU,EAAG,SAAQ,IAAIA,OAAM,OAAO,qBAAgB,OAAO,EAAE,CAAC;AACpE,MAAI,SAAS,EAAG,SAAQ,IAAIA,OAAM,IAAI,oBAAe,MAAM,EAAE,CAAC;AAChE;;;AC7FA,OAAOE,YAAW;AAMX,SAAS,YAAY;AAC1B,QAAM,QAAQ,qBAAqB;AAEnC,UAAQ,IAAIC,OAAM,KAAK,uCAAgC,CAAC;AAGxD,UAAQ,IAAIA,OAAM,KAAK,sBAAsB,GAAG,MAAM,aAAa;AAGnE,MAAI,OAAO,KAAK,MAAM,aAAa,EAAE,SAAS,GAAG;AAC/C,YAAQ,IAAIA,OAAM,KAAK,2BAA2B,CAAC;AACnD,UAAM,eAAe,OAAO,QAAQ,MAAM,aAAa,EACpD,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC;AAE/B,iBAAa,QAAQ,CAAC,CAAC,OAAO,KAAK,MAAM;AACvC,YAAM,MAAM,SAAI,OAAO,KAAK,IAAI,OAAO,EAAE,CAAC;AAC1C,cAAQ,IAAI,KAAK,MAAM,OAAO,EAAE,CAAC,IAAI,GAAG,IAAI,KAAK,EAAE;AAAA,IACrD,CAAC;AAAA,EACH;AAGA,MAAI,MAAM,UAAU,SAAS,GAAG;AAC9B,YAAQ,IAAIA,OAAM,KAAK,yBAAyB,CAAC;AACjD,UAAM,UAAU,QAAQ,CAAC,OAAO,UAAU;AACxC,cAAQ,IAAI,KAAK,QAAQ,CAAC,KAAK,MAAM,KAAK,OAAO,EAAE,CAAC,KAAK,MAAM,KAAK,YAAY;AAAA,IAClF,CAAC;AAAA,EACH;AAGA,MAAI,MAAM,eAAe,SAAS,GAAG;AACnC,YAAQ,IAAIA,OAAM,KAAK,yBAAyB,CAAC;AACjD,UAAM,eAAe,MAAM,GAAG,CAAC,EAAE,QAAQ,CAAC,WAAW;AACnD,YAAM,OAAO,IAAI,KAAK,OAAO,SAAS,EAAE,eAAe;AACvD,YAAM,SAAS,OAAO,OAAO,KAAK,IAAI;AACtC,cAAQ,IAAIA,OAAM,KAAK,KAAK,IAAI,EAAE,CAAC;AACnC,cAAQ,IAAI,OAAO,OAAO,SAAS,WAAM,MAAM,EAAE;AAAA,IACnD,CAAC;AAAA,EACH;AAEA,MAAI,MAAM,kBAAkB,GAAG;AAC7B,YAAQ,IAAIA,OAAM,OAAO,kEAAkE,CAAC;AAAA,EAC9F;AACF;;;AChDA,OAAOC,UAAQ;AACf,OAAOC,YAAU;AACjB,OAAOC,YAAW;AA2BlB,SAAS,mBAAmB,OAAgE;AAC1F,MAAI,CAAC,OAAO;AACV,WAAO,EAAE,OAAO,WAAW,OAAO,QAAQ,MAAM,IAAI;AAAA,EACtD;AACA,MAAI,SAAS,IAAI;AACf,WAAO,EAAE,OAAO,QAAQ,OAAO,SAAS,MAAM,SAAI;AAAA,EACpD;AACA,MAAI,SAAS,IAAI;AACf,WAAO,EAAE,OAAO,YAAY,OAAO,UAAU,MAAM,SAAI;AAAA,EACzD;AACA,MAAI,SAAS,IAAI;AACf,WAAO,EAAE,OAAO,eAAe,OAAO,UAAU,MAAM,SAAI;AAAA,EAC5D;AACA,MAAI,SAAS,IAAI;AACf,WAAO,EAAE,OAAO,aAAa,OAAO,OAAO,MAAM,SAAI;AAAA,EACvD;AACA,SAAO,EAAE,OAAO,YAAY,OAAO,OAAO,MAAM,SAAI;AACtD;AAKA,eAAe,mBAAmB,WAAmB,QAA+C;AAClG,MAAI;AACF,UAAM,SAAS,QAAQ,IAAI,sBAAsB;AAGjD,UAAM,WAAW,MAAM,MAAM,GAAG,MAAM,sBAAsB,mBAAmB,SAAS,CAAC,UAAU;AAEnG,QAAI,CAAC,SAAS,IAAI;AAChB,aAAO;AAAA,QACL;AAAA,QACA,WAAW;AAAA,QACX;AAAA,QACA,QAAQ;AAAA,MACV;AAAA,IACF;AAEA,UAAM,OAAO,MAAM,SAAS,KAAK;AAEjC,QAAI,KAAK,WAAW,KAAK,QAAQ,KAAK,KAAK,SAAS,GAAG;AAErD,YAAM,QAAQ,KAAK,KAAK;AAAA,QAAK,CAAC,MAC5B,EAAE,KAAK,YAAY,MAAM,UAAU,YAAY;AAAA,MACjD,KAAK,KAAK,KAAK,CAAC;AAEhB,YAAM,QAAQ,MAAM;AACpB,UAAI,SAAoD;AAExD,UAAI,UAAU,QAAW;AACvB,YAAI,SAAS,GAAI,UAAS;AAAA,iBACjB,SAAS,GAAI,UAAS;AAAA,YAC1B,UAAS;AAAA,MAChB;AAEA,aAAO;AAAA,QACL;AAAA,QACA,WAAW;AAAA,QACX,QAAQ,GAAG,MAAM,UAAU,IAAI,MAAM,SAAS;AAAA,QAC9C,gBAAgB,MAAM;AAAA,QACtB,gBAAgB,MAAM;AAAA,QACtB;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,MACL;AAAA,MACA,WAAW;AAAA,MACX;AAAA,MACA,QAAQ;AAAA,IACV;AAAA,EACF,SAAS,OAAO;AACd,WAAO;AAAA,MACL;AAAA,MACA,WAAW;AAAA,MACX;AAAA,MACA,QAAQ;AAAA,IACV;AAAA,EACF;AACF;AAKA,eAAsB,aAAa;AACjC,QAAM,MAAM,QAAQ,IAAI;AACxB,QAAM,SAAS,aAAa;AAE5B,SAAO,MAAM,+BAA+B;AAC5C,QAAM,SAAS,aAAa,GAAG;AAC/B,QAAM,iBAAiB,OAAO,OAAO,OAAK,EAAE,QAAQ;AAEpD,MAAI,eAAe,WAAW,GAAG;AAC/B,WAAO,KAAK,oBAAoB;AAChC,YAAQ,IAAIC,OAAM,OAAO,4CAA4C,CAAC;AACtE,YAAQ,IAAIA,OAAM,KAAK,mFAAmF,CAAC;AAC3G;AAAA,EACF;AAEA,SAAO,QAAQ,SAAS,eAAe,MAAM,WAAW;AAGxD,QAAM,YAAkE,CAAC;AAEzE,aAAW,SAAS,gBAAgB;AAClC,QAAIC,KAAG,WAAW,MAAM,UAAU,GAAG;AACnC,YAAM,YAAYA,KAAG,YAAY,MAAM,YAAY,EAAE,eAAe,KAAK,CAAC,EACvE,OAAO,YAAU,OAAO,YAAY,CAAC,EACrC,IAAI,YAAU,OAAO,IAAI;AAE5B,iBAAW,aAAa,WAAW;AACjC,cAAM,YAAYC,OAAK,KAAK,MAAM,YAAY,SAAS;AACvD,cAAM,cAAcA,OAAK,KAAK,WAAW,UAAU;AAEnD,YAAID,KAAG,WAAW,WAAW,GAAG;AAC9B,oBAAU,KAAK;AAAA,YACb,MAAM;AAAA,YACN,MAAM;AAAA,YACN,OAAO,MAAM;AAAA,UACf,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,UAAU,WAAW,GAAG;AAC1B,WAAO,KAAK,qBAAqB;AACjC,YAAQ,IAAID,OAAM,OAAO,uCAAuC,CAAC;AACjE;AAAA,EACF;AAEA,UAAQ,IAAIA,OAAM,KAAK;AAAA,qBAAiB,UAAU,MAAM;AAAA,CAAoC,CAAC;AAG7F,QAAM,UAAiC,CAAC;AAExC,aAAW,SAAS,WAAW;AAC7B,UAAM,SAAS,MAAM,mBAAmB,MAAM,IAAI;AAClD,WAAO,YAAY,MAAM;AACzB,YAAQ,KAAK,MAAM;AAAA,EACrB;AAGA,QAAM,OAAO,QAAQ,OAAO,OAAK,EAAE,WAAW,MAAM;AACpD,QAAM,UAAU,QAAQ,OAAO,OAAK,EAAE,WAAW,SAAS;AAC1D,QAAM,SAAS,QAAQ,OAAO,OAAK,EAAE,WAAW,QAAQ;AACxD,QAAM,UAAU,QAAQ,OAAO,OAAK,EAAE,WAAW,SAAS;AAG1D,UAAQ,IAAIA,OAAM,KAAK,oCAA6B,CAAC;AAGrD,UAAQ,IAAIA,OAAM,KAAK,UAAU,CAAC;AAClC,UAAQ,IAAIA,OAAM,MAAM,kBAAa,KAAK,MAAM,EAAE,CAAC;AACnD,UAAQ,IAAIA,OAAM,OAAO,qBAAgB,QAAQ,MAAM,EAAE,CAAC;AAC1D,UAAQ,IAAIA,OAAM,IAAI,oBAAe,OAAO,MAAM,EAAE,CAAC;AACrD,UAAQ,IAAIA,OAAM,KAAK,gBAAgB,QAAQ,MAAM,EAAE,CAAC;AACxD,UAAQ,IAAI;AAGZ,MAAI,OAAO,SAAS,GAAG;AACrB,YAAQ,IAAIA,OAAM,KAAK,IAAI,+BAAwB,CAAC;AACpD,eAAW,SAAS,QAAQ;AAC1B,YAAM,UAAU,mBAAmB,MAAM,cAAc;AACvD,cAAQ,IAAIA,OAAM,IAAI,KAAK,QAAQ,IAAI,IAAI,MAAM,SAAS,EAAE,CAAC;AAC7D,cAAQ,IAAIA,OAAM,KAAK,eAAe,MAAM,kBAAkB,KAAK,EAAE,CAAC;AACtE,cAAQ,IAAIA,OAAM,KAAK,eAAe,QAAQ,KAAK,EAAE,CAAC;AACtD,UAAI,MAAM,QAAQ;AAChB,gBAAQ,IAAIA,OAAM,KAAK,gBAAgB,MAAM,MAAM,EAAE,CAAC;AAAA,MACxD;AACA,cAAQ,IAAI;AAAA,IACd;AAAA,EACF;AAGA,MAAI,QAAQ,SAAS,GAAG;AACtB,YAAQ,IAAIA,OAAM,KAAK,OAAO,qCAA2B,CAAC;AAC1D,eAAW,SAAS,SAAS;AAC3B,YAAM,UAAU,mBAAmB,MAAM,cAAc;AACvD,cAAQ,IAAIA,OAAM,OAAO,KAAK,QAAQ,IAAI,IAAI,MAAM,SAAS,EAAE,CAAC;AAChE,cAAQ,IAAIA,OAAM,KAAK,eAAe,MAAM,kBAAkB,KAAK,EAAE,CAAC;AACtE,cAAQ,IAAIA,OAAM,KAAK,eAAe,QAAQ,KAAK,EAAE,CAAC;AACtD,UAAI,MAAM,QAAQ;AAChB,gBAAQ,IAAIA,OAAM,KAAK,gBAAgB,MAAM,MAAM,EAAE,CAAC;AAAA,MACxD;AACA,cAAQ,IAAI;AAAA,IACd;AAAA,EACF;AAGA,MAAI,KAAK,SAAS,GAAG;AACnB,YAAQ,IAAIA,OAAM,KAAK,MAAM,UAAK,KAAK,MAAM;AAAA,CAAsB,CAAC;AAAA,EACtE;AAGA,MAAI,QAAQ,SAAS,GAAG;AACtB,YAAQ,IAAIA,OAAM,KAAK,KAAK,KAAK,QAAQ,MAAM;AAAA,CAAmC,CAAC;AAAA,EACrF;AAGA,MAAI,OAAO,SAAS,KAAK,QAAQ,SAAS,GAAG;AAC3C,YAAQ,IAAIA,OAAM,KAAK,gCAAyB,CAAC;AACjD,QAAI,OAAO,SAAS,GAAG;AACrB,cAAQ,IAAIA,OAAM,IAAI,yDAAoD,CAAC;AAAA,IAC7E;AACA,QAAI,QAAQ,SAAS,GAAG;AACtB,cAAQ,IAAIA,OAAM,OAAO,2DAAsD,CAAC;AAAA,IAClF;AACA,YAAQ,IAAIA,OAAM,KAAK,4EAAuE,CAAC;AAC/F,YAAQ,IAAIA,OAAM,KAAK,qDAAgD,CAAC;AAAA,EAC1E;AACF;;;AChPA,OAAOG,YAAyB;AAChC,SAAS,OAAAC,MAAK,QAAAC,aAAY;AAC1B,OAAOC,kBAAiB;AAWjB,IAAM,WAAoC,CAAC,EAAE,SAAS,MAAM;AACjE,QAAM,QAAoB;AAAA,IACxB,EAAE,OAAO,yBAAkB,OAAO,OAAO;AAAA,IACzC,EAAE,OAAO,oBAAe,OAAO,MAAM;AAAA,IACrC,EAAE,OAAO,mCAA4B,OAAO,OAAO;AAAA,IACnD,EAAE,OAAO,2BAAoB,OAAO,SAAS;AAAA,IAC7C,EAAE,OAAO,+BAAqB,OAAO,SAAS;AAAA,IAC9C,EAAE,OAAO,kCAAwB,OAAO,OAAO;AAAA,IAC/C,EAAE,OAAO,gCAAyB,OAAO,QAAQ;AAAA,IACjD,EAAE,OAAO,eAAU,OAAO,OAAO;AAAA,EACnC;AAEA,SACE,gBAAAH,OAAA,cAACC,MAAA,EAAI,eAAc,UAAS,SAAS,KACnC,gBAAAD,OAAA,cAACC,MAAA,EAAI,cAAc,KACjB,gBAAAD,OAAA,cAACE,OAAA,EAAK,MAAI,MAAC,OAAM,UAAO,gDAExB,CACF,GACA,gBAAAF,OAAA,cAACC,MAAA,EAAI,cAAc,KACjB,gBAAAD,OAAA,cAACE,OAAA,EAAK,UAAQ,QAAC,mBAAiB,CAClC,GACA,gBAAAF,OAAA,cAACG,cAAA,EAAY,OAAc,UAAU,CAAC,SAAS,SAAS,KAAK,KAAK,GAAG,CACvE;AAEJ;;;AfvBA,IAAM,UAAU,IAAI,QAAQ;AAE5B,QACG,KAAK,YAAY,EACjB,YAAY,iDAAiD,EAC7D,QAAQ,OAAO;AAGlB,QACG,QAAQ,KAAK,EACb,YAAY,6CAA6C,EACzD,SAAS,UAAU,6BAA6B,EAChD,SAAS,YAAY,sDAAsD,EAC3E,OAAO,sBAAsB,gCAAgC,EAC7D,OAAO,gBAAgB,oCAAoC,EAC3D,OAAO,OAAO,MAA0B,QAA4B,YAAiB;AACpF,MAAI;AAIF,QAAI;AAEJ,QAAI,SAAS,WAAW,SAAS,QAAQ;AAEvC,UAAI,CAAC,QAAQ;AACX,gBAAQ,MAAMC,OAAM,IAAI,2BAA2B,CAAC;AACpD,gBAAQ,IAAIA,OAAM,KAAK,uDAAuD,CAAC;AAC/E,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,qBAAe;AAAA,IACjB,WAAW,MAAM;AAEf,qBAAe;AAAA,IACjB,OAAO;AACL,cAAQ,MAAMA,OAAM,IAAI,2BAA2B,CAAC;AACpD,cAAQ,IAAIA,OAAM,KAAK,yDAAyD,CAAC;AACjF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,SAAS,cAAc,OAAO;AAAA,EACtC,SAAS,OAAO;AACd,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QACG,QAAQ,MAAM,EACd,YAAY,oDAAoD,EAChE,SAAS,YAAY,sDAAsD,EAC3E,OAAO,OAAO,WAAmB;AAChC,MAAI;AACF,UAAM,WAAW,MAAM;AAAA,EACzB,SAAS,OAAO;AACd,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QACG,QAAQ,MAAM,EACd,MAAM,IAAI,EACV,YAAY,2BAA2B,EACvC,OAAO,MAAM;AACZ,aAAW;AACb,CAAC;AAEH,QACG,QAAQ,QAAQ,EAChB,YAAY,6CAA6C,EACzD,OAAO,YAAY;AAClB,MAAI;AACF,UAAM,aAAa;AAAA,EACrB,SAAS,OAAO;AACd,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QACG,QAAQ,QAAQ,EAChB,YAAY,2CAA2C,EACvD,SAAS,cAAc,+DAA+D,EACtF,OAAO,OAAO,UAAoB;AACjC,MAAI;AACF,UAAM,aAAa,KAAK;AAAA,EAC1B,SAAS,OAAO;AACd,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QACG,QAAQ,OAAO,EACf,YAAY,8BAA8B,EAC1C,OAAO,MAAM;AACZ,YAAU;AACZ,CAAC;AAEH,QACG,QAAQ,MAAM,EACd,YAAY,2CAA2C,EACvD,OAAO,YAAY;AAClB,MAAI;AACF,UAAM,WAAW;AAAA,EACnB,SAAS,OAAO;AACd,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QACG,QAAQ,MAAM,EACd,YAAY,gDAAgD,EAC5D,OAAO,MAAM;AACZ,QAAM,MAAM,QAAQ,IAAI;AACxB,QAAM,SAAS,aAAa,GAAG;AAC/B,QAAM,gBAAgB,uBAAuB,GAAG;AAEhD,UAAQ,IAAIA,OAAM,KAAK,wCAAiC,CAAC;AACzD,UAAQ,IAAIA,OAAM,KAAK,sBAAsB,GAAG,EAAE,CAAC;AACnD,UAAQ,IAAIA,OAAM,KAAK,0BAA0B,aAAa;AAAA,CAAI,CAAC;AAEnE,UAAQ,IAAIA,OAAM,KAAK,qBAAqB,CAAC;AAC7C,QAAM,WAAW,OAAO,OAAO,OAAK,EAAE,QAAQ;AAC9C,MAAI,SAAS,SAAS,GAAG;AACvB,aAAS,QAAQ,WAAS;AACxB,cAAQ,IAAIA,OAAM,MAAM,YAAO,MAAM,IAAI,KAAK,MAAM,IAAI,GAAG,CAAC;AAC5D,cAAQ,IAAIA,OAAM,KAAK,oBAAoB,MAAM,UAAU,EAAE,CAAC;AAAA,IAChE,CAAC;AAAA,EACH,OAAO;AACL,YAAQ,IAAIA,OAAM,OAAO,sBAAsB,CAAC;AAChD,YAAQ,IAAIA,OAAM,KAAK,kDAAkD,CAAC;AAAA,EAC5E;AACA,UAAQ,IAAI;AACd,CAAC;AAGH,IAAI,CAAC,QAAQ,KAAK,MAAM,CAAC,EAAE,QAAQ;AACjC,QAAM,EAAE,cAAc,IAAIC;AAAA,IACxBC,OAAM,cAAc,UAAU;AAAA,MAC5B,UAAU,OAAO,UAAkB;AACjC,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF,CAAC;AAAA,EACH;AACA,gBAAc,EAAE,KAAK,MAAM;AAAA,EAAC,CAAC;AAC/B,OAAO;AACL,UAAQ,MAAM;AAChB;","names":["chalk","render","React","fs","path","chalk","parts","path","path","fs","fs","path","fs","path","os","path","fs","chalk","fs","path","chalk","fs","chalk","path","fs","path","simpleGit","chalk","React","chalk","React","path","fs","simpleGit","fs","path","chalk","render","React","Box","Text","fs","chalk","path","render","React","Box","Text","fs","path","chalk","fs","chalk","path","chalk","chalk","fs","path","chalk","chalk","fs","path","React","Box","Text","SelectInput","chalk","render","React"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "trusttools",
3
- "version": "1.0.0",
3
+ "version": "1.0.1",
4
4
  "description": "Universal CLI tool for managing AI agent skills across Cursor, Claude, Windsurf and 40+ AI agents",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",