SYMBOL INDEX (280 symbols across 35 files) FILE: scripts/execute-tests.ts type RunOptions (line 9) | type RunOptions = { function parseArgs (line 16) | function parseArgs(argv: string[], rootDir: string): RunOptions { function findTestFiles (line 46) | async function findTestFiles(dir: string): Promise { function runOneTest (line 64) | async function runOneTest(rootDir: string, testFile: string): Promise { FILE: scripts/generate-licenses.ts constant BUNDLED_PACKAGES (line 12) | const BUNDLED_PACKAGES = [ type LicenseInfo (line 23) | interface LicenseInfo { function getLicenseText (line 30) | function getLicenseText(pkgPath: string): string { function main (line 41) | function main() { FILE: scripts/sync-agents.ts constant ROOT (line 8) | const ROOT = join(import.meta.dirname, '..'); constant README_PATH (line 9) | const README_PATH = join(ROOT, 'README.md'); constant PACKAGE_PATH (line 10) | const PACKAGE_PATH = join(ROOT, 'package.json'); function generateAgentList (line 12) | function generateAgentList(): string { function generateAgentNames (line 18) | function generateAgentNames(): string { function generateAvailableAgentsTable (line 22) | function generateAvailableAgentsTable(): string { function generateSkillDiscoveryPaths (line 64) | function generateSkillDiscoveryPaths(): string { function generateKeywords (line 80) | function generateKeywords(): string[] { function replaceSection (line 86) | function replaceSection( function main (line 99) | function main() { FILE: scripts/validate-agents.ts function error (line 8) | function error(message: string) { function checkDuplicateDisplayNames (line 23) | function checkDuplicateDisplayNames() { function checkDuplicateSkillsDirs (line 55) | function checkDuplicateSkillsDirs() { FILE: src/add.ts function isSourcePrivate (line 16) | async function isSourcePrivate(source: string): Promise { function initTelemetry (line 60) | function initTelemetry(version: string): void { function riskLabel (line 66) | function riskLabel(risk: string): string { function socketLabel (line 83) | function socketLabel(audit: PartnerAudit | undefined): string { function padEnd (line 90) | function padEnd(str: string, width: number): string { function buildSecurityLines (line 101) | function buildSecurityLines( function shortenPath (line 153) | function shortenPath(fullPath: string, cwd: string): string { function formatList (line 168) | function formatList(items: string[], maxShow: number = 5): string { function splitAgentsByType (line 181) | function splitAgentsByType(agentTypes: AgentType[]): { function buildAgentSummaryLines (line 202) | function buildAgentSummaryLines(targetAgents: AgentType[], installMode: ... function ensureUniversalAgents (line 226) | function ensureUniversalAgents(targetAgents: AgentType[]): AgentType[] { function buildResultLines (line 242) | function buildResultLines( function multiselect (line 277) | function multiselect(opts: { function promptForAgents (line 296) | async function promptForAgents( function selectAgentsInteractive (line 349) | async function selectAgentsInteractive(options: { type AddOptions (line 410) | interface AddOptions { function handleWellKnownSkills (line 425) | async function handleWellKnownSkills( function runAdd (line 884) | async function runAdd(args: string[], options: AddOptions = {}): Promise... function cleanup (line 1677) | async function cleanup(tempDir: string | null) { function promptForFindSkills (line 1690) | async function promptForFindSkills( function parseAddOptions (line 1763) | function parseAddOptions(args: string[]): { source: string[]; options: A... FILE: src/agents.ts function getOpenClawGlobalSkillsDir (line 13) | function getOpenClawGlobalSkillsDir( function detectInstalledAgents (line 423) | async function detectInstalledAgents(): Promise { function getAgentConfig (line 433) | function getAgentConfig(type: AgentType): AgentConfig { function getUniversalAgents (line 442) | function getUniversalAgents(): AgentType[] { function getNonUniversalAgents (line 454) | function getNonUniversalAgents(): AgentType[] { function isUniversalAgent (line 463) | function isUniversalAgent(type: AgentType): boolean { FILE: src/cli.ts function getVersion (line 19) | function getVersion(): string { constant VERSION (line 29) | const VERSION = getVersion(); constant RESET (line 32) | const RESET = '\x1b[0m'; constant BOLD (line 33) | const BOLD = '\x1b[1m'; constant DIM (line 35) | const DIM = '\x1b[38;5;102m'; constant TEXT (line 36) | const TEXT = '\x1b[38;5;145m'; constant LOGO_LINES (line 38) | const LOGO_LINES = [ constant GRAYS (line 48) | const GRAYS = [ function showLogo (line 57) | function showLogo(): void { function showBanner (line 64) | function showBanner(): void { function showHelp (line 105) | function showHelp(): void { function showRemoveHelp (line 181) | function showRemoveHelp(): void { function runInit (line 212) | function runInit(args: string[]): void { constant AGENTS_DIR (line 279) | const AGENTS_DIR = '.agents'; constant LOCK_FILE (line 280) | const LOCK_FILE = '.skill-lock.json'; constant CURRENT_LOCK_VERSION (line 281) | const CURRENT_LOCK_VERSION = 3; type SkillLockEntry (line 283) | interface SkillLockEntry { type SkillLockFile (line 294) | interface SkillLockFile { function getSkillLockPath (line 299) | function getSkillLockPath(): string { function readSkillLock (line 307) | function readSkillLock(): SkillLockFile { type SkippedSkill (line 326) | interface SkippedSkill { function getSkipReason (line 335) | function getSkipReason(entry: SkillLockEntry): string { function printSkippedSkills (line 355) | function printSkippedSkills(skipped: SkippedSkill[]): void { function runCheck (line 365) | async function runCheck(args: string[] = []): Promise { function runUpdate (line 475) | async function runUpdate(): Promise { function main (line 608) | async function main(): Promise { FILE: src/constants.ts constant AGENTS_DIR (line 1) | const AGENTS_DIR = '.agents'; constant SKILLS_SUBDIR (line 2) | const SKILLS_SUBDIR = 'skills'; constant UNIVERSAL_SKILLS_DIR (line 3) | const UNIVERSAL_SKILLS_DIR = '.agents/skills'; FILE: src/find.ts constant RESET (line 6) | const RESET = '\x1b[0m'; constant BOLD (line 7) | const BOLD = '\x1b[1m'; constant DIM (line 8) | const DIM = '\x1b[38;5;102m'; constant TEXT (line 9) | const TEXT = '\x1b[38;5;145m'; constant CYAN (line 10) | const CYAN = '\x1b[36m'; constant MAGENTA (line 11) | const MAGENTA = '\x1b[35m'; constant YELLOW (line 12) | const YELLOW = '\x1b[33m'; constant SEARCH_API_BASE (line 15) | const SEARCH_API_BASE = process.env.SKILLS_API_URL || 'https://skills.sh'; function formatInstalls (line 17) | function formatInstalls(count: number): string { type SearchSkill (line 24) | interface SearchSkill { function searchSkillsAPI (line 32) | async function searchSkillsAPI(query: string): Promise { constant HIDE_CURSOR (line 62) | const HIDE_CURSOR = '\x1b[?25l'; constant SHOW_CURSOR (line 63) | const SHOW_CURSOR = '\x1b[?25h'; constant CLEAR_DOWN (line 64) | const CLEAR_DOWN = '\x1b[J'; function runSearchPrompt (line 69) | async function runSearchPrompt(initialQuery = ''): Promise { FILE: src/git.ts constant CLONE_TIMEOUT_MS (line 6) | const CLONE_TIMEOUT_MS = 60000; class GitCloneError (line 8) | class GitCloneError extends Error { method constructor (line 13) | constructor(message: string, url: string, isTimeout = false, isAuthErr... function cloneRepo (line 22) | async function cloneRepo(url: string, ref?: string): Promise { function cleanupTempDir (line 73) | async function cleanupTempDir(dir: string): Promise { FILE: src/install.ts function runInstallFromLock (line 17) | async function runInstallFromLock(args: string[]): Promise { FILE: src/installer.ts type InstallMode (line 23) | type InstallMode = 'symlink' | 'copy'; type InstallResult (line 25) | interface InstallResult { function sanitizeName (line 40) | function sanitizeName(name: string): string { function isPathSafe (line 63) | function isPathSafe(basePath: string, targetPath: string): boolean { function getCanonicalSkillsDir (line 70) | function getCanonicalSkillsDir(global: boolean, cwd?: string): string { function getAgentBaseDir (line 80) | function getAgentBaseDir(agentType: AgentType, global: boolean, cwd?: st... function resolveSymlinkTarget (line 99) | function resolveSymlinkTarget(linkPath: string, linkTarget: string): str... function cleanAndCreateDirectory (line 111) | async function cleanAndCreateDirectory(path: string): Promise { function resolveParentSymlinks (line 129) | async function resolveParentSymlinks(path: string): Promise { function createSymlink (line 145) | async function createSymlink(target: string, linkPath: string): Promise<... function installSkillForAgent (line 212) | async function installSkillForAgent( constant EXCLUDE_FILES (line 325) | const EXCLUDE_FILES = new Set(['metadata.json']); constant EXCLUDE_DIRS (line 326) | const EXCLUDE_DIRS = new Set(['.git', '__pycache__', '__pypackages__']); function copyDirectory (line 335) | async function copyDirectory(src: string, dest: string): Promise { function isSkillInstalled (line 379) | async function isSkillInstalled( function getInstallPath (line 410) | function getInstallPath( function getCanonicalPath (line 432) | function getCanonicalPath( function installRemoteSkillForAgent (line 453) | async function installRemoteSkillForAgent( function installWellKnownSkillForAgent (line 572) | async function installWellKnownSkillForAgent( type InstalledSkill (line 702) | interface InstalledSkill { function listInstalledSkills (line 716) | async function listInstalledSkills( FILE: src/list.ts constant RESET (line 7) | const RESET = '\x1b[0m'; constant BOLD (line 8) | const BOLD = '\x1b[1m'; constant DIM (line 9) | const DIM = '\x1b[38;5;102m'; constant TEXT (line 10) | const TEXT = '\x1b[38;5;145m'; constant CYAN (line 11) | const CYAN = '\x1b[36m'; constant YELLOW (line 12) | const YELLOW = '\x1b[33m'; type ListOptions (line 14) | interface ListOptions { function shortenPath (line 23) | function shortenPath(fullPath: string, cwd: string): string { function formatList (line 37) | function formatList(items: string[], maxShow: number = 5): string { function parseListOptions (line 46) | function parseListOptions(args: string[]): ListOptions { function runList (line 67) | async function runList(args: string[]): Promise { FILE: src/local-lock.ts constant LOCAL_LOCK_FILE (line 5) | const LOCAL_LOCK_FILE = 'skills-lock.json'; constant CURRENT_VERSION (line 6) | const CURRENT_VERSION = 1; type LocalSkillLockEntry (line 15) | interface LocalSkillLockEntry { type LocalSkillLockFile (line 35) | interface LocalSkillLockFile { function getLocalLockPath (line 45) | function getLocalLockPath(cwd?: string): string { function readLocalLock (line 54) | async function readLocalLock(cwd?: string): Promise { function writeLocalLock (line 79) | async function writeLocalLock(lock: LocalSkillLockFile, cwd?: string): P... function computeSkillFolderHash (line 98) | async function computeSkillFolderHash(skillDir: string): Promise { function collectFiles (line 115) | async function collectFiles( function addSkillToLocalLock (line 142) | async function addSkillToLocalLock( function removeSkillFromLocalLock (line 155) | async function removeSkillFromLocalLock(skillName: string, cwd?: string)... function createEmptyLocalLock (line 167) | function createEmptyLocalLock(): LocalSkillLockFile { FILE: src/plugin-manifest.ts function isContainedIn (line 8) | function isContainedIn(targetPath: string, basePath: string): boolean { function isValidRelativePath (line 18) | function isValidRelativePath(path: string): boolean { type PluginManifestEntry (line 25) | interface PluginManifestEntry { type MarketplaceManifest (line 32) | interface MarketplaceManifest { type PluginManifest (line 37) | interface PluginManifest { function getPluginSkillPaths (line 51) | async function getPluginSkillPaths(basePath: string): Promise { function getPluginGroupings (line 120) | async function getPluginGroupings(basePath: string): Promise { type LockedSection (line 18) | interface LockedSection { type SearchMultiselectOptions (line 23) | interface SearchMultiselectOptions { constant S_STEP_ACTIVE (line 34) | const S_STEP_ACTIVE = pc.green('◆'); constant S_STEP_CANCEL (line 35) | const S_STEP_CANCEL = pc.red('■'); constant S_STEP_SUBMIT (line 36) | const S_STEP_SUBMIT = pc.green('◇'); constant S_RADIO_ACTIVE (line 37) | const S_RADIO_ACTIVE = pc.green('●'); constant S_RADIO_INACTIVE (line 38) | const S_RADIO_INACTIVE = pc.dim('○'); constant S_CHECKBOX_LOCKED (line 39) | const S_CHECKBOX_LOCKED = pc.green('✓'); constant S_BULLET (line 40) | const S_BULLET = pc.green('•'); constant S_BAR (line 41) | const S_BAR = pc.dim('│'); constant S_BAR_H (line 42) | const S_BAR_H = pc.dim('─'); function searchMultiselect (line 51) | async function searchMultiselect( FILE: src/providers/registry.ts class ProviderRegistryImpl (line 3) | class ProviderRegistryImpl implements ProviderRegistry { method register (line 6) | register(provider: HostProvider): void { method findProvider (line 14) | findProvider(url: string): HostProvider | null { method getProviders (line 24) | getProviders(): HostProvider[] { function registerProvider (line 35) | function registerProvider(provider: HostProvider): void { function findProvider (line 42) | function findProvider(url: string): HostProvider | null { function getProviders (line 49) | function getProviders(): HostProvider[] { FILE: src/providers/types.ts type RemoteSkill (line 5) | interface RemoteSkill { type ProviderMatch (line 23) | interface ProviderMatch { type HostProvider (line 38) | interface HostProvider { type ProviderRegistry (line 80) | interface ProviderRegistry { FILE: src/providers/wellknown.ts type WellKnownIndex (line 7) | interface WellKnownIndex { type WellKnownSkillEntry (line 14) | interface WellKnownSkillEntry { type WellKnownSkill (line 26) | interface WellKnownSkill extends RemoteSkill { class WellKnownProvider (line 47) | class WellKnownProvider implements HostProvider { method match (line 59) | match(url: string): ProviderMatch { method fetchIndex (line 88) | async fetchIndex( method isValidSkillEntry (line 155) | private isValidSkillEntry(entry: unknown): entry is WellKnownSkillEntry { method fetchSkill (line 191) | async fetchSkill(url: string): Promise { method fetchSkillByEntry (line 237) | async fetchSkillByEntry( method fetchAllSkills (line 306) | async fetchAllSkills(url: string): Promise { method toRawUrl (line 331) | toRawUrl(url: string): string { method getSourceIdentifier (line 362) | getSourceIdentifier(url: string): string { method hasSkillsIndex (line 375) | async hasSkillsIndex(url: string): Promise { FILE: src/remove.test.ts function createTestSkill (line 26) | function createTestSkill(name: string, description?: string) { function createAgentSkillsDir (line 43) | function createAgentSkillsDir(agentName: string) { function createSymlink (line 49) | function createSymlink(skillName: string, targetDir: string) { FILE: src/remove.ts type RemoveOptions (line 16) | interface RemoveOptions { function removeCommand (line 23) | async function removeCommand(skillNames: string[], options: RemoveOption... function parseRemoveOptions (line 282) | function parseRemoveOptions(args: string[]): { skills: string[]; options... FILE: src/skill-lock.ts constant AGENTS_DIR (line 7) | const AGENTS_DIR = '.agents'; constant LOCK_FILE (line 8) | const LOCK_FILE = '.skill-lock.json'; constant CURRENT_VERSION (line 9) | const CURRENT_VERSION = 3; type SkillLockEntry (line 14) | interface SkillLockEntry { type DismissedPrompts (line 40) | interface DismissedPrompts { type SkillLockFile (line 48) | interface SkillLockFile { function getSkillLockPath (line 64) | function getSkillLockPath(): string { function readSkillLock (line 77) | async function readSkillLock(): Promise { function writeSkillLock (line 106) | async function writeSkillLock(lock: SkillLockFile): Promise { function computeContentHash (line 120) | function computeContentHash(content: string): string { function getGitHubToken (line 133) | function getGitHubToken(): string | null { function fetchSkillFolderHash (line 168) | async function fetchSkillFolderHash( function addSkillToLock (line 234) | async function addSkillToLock( function removeSkillFromLock (line 255) | async function removeSkillFromLock(skillName: string): Promise { function getSkillFromLock (line 270) | async function getSkillFromLock(skillName: string): Promise { function saveSelectedAgents (line 346) | async function saveSelectedAgents(agents: string[]): Promise { FILE: src/skills.ts constant SKIP_DIRS (line 7) | const SKIP_DIRS = ['node_modules', '.git', 'dist', 'build', '__pycache__']; function shouldInstallInternalSkills (line 13) | function shouldInstallInternalSkills(): boolean { function hasSkillMd (line 18) | async function hasSkillMd(dir: string): Promise { function parseSkillMd (line 28) | async function parseSkillMd( function findSkillDirs (line 65) | async function findSkillDirs(dir: string, depth = 0, maxDepth = 5): Prom... type DiscoverSkillsOptions (line 89) | interface DiscoverSkillsOptions { function isSubpathSafe (line 101) | function isSubpathSafe(basePath: string, subpath: string): boolean { function discoverSkills (line 108) | async function discoverSkills( function getSkillDisplayName (line 227) | function getSkillDisplayName(skill: Skill): string { function filterSkills (line 235) | function filterSkills(skills: Skill[], inputNames: string[]): Skill[] { FILE: src/source-parser.ts function getOwnerRepo (line 10) | function getOwnerRepo(parsed: ParsedSource): string | null { function parseOwnerRepo (line 54) | function parseOwnerRepo(ownerRepo: string): { owner: string; repo: strin... function isRepoPrivate (line 67) | async function isRepoPrivate(owner: string, repo: string): Promise = { function parseSource (line 131) | function parseSource(input: string): ParsedSource { function isWellKnownUrl (line 286) | function isWellKnownUrl(input: string): boolean { FILE: src/sync.ts type SyncOptions (line 21) | interface SyncOptions { function shortenPath (line 30) | function shortenPath(fullPath: string, cwd: string): string { function discoverNodeModuleSkills (line 46) | async function discoverNodeModuleSkills( function runSync (line 132) | async function runSync(args: string[], options: SyncOptions = {}): Promi... function parseSyncOptions (line 423) | function parseSyncOptions(args: string[]): { options: SyncOptions } { FILE: src/telemetry.ts constant TELEMETRY_URL (line 1) | const TELEMETRY_URL = 'https://add-skill.vercel.sh/t'; constant AUDIT_URL (line 2) | const AUDIT_URL = 'https://add-skill.vercel.sh/audit'; type InstallTelemetryData (line 4) | interface InstallTelemetryData { type RemoveTelemetryData (line 20) | interface RemoveTelemetryData { type CheckTelemetryData (line 29) | interface CheckTelemetryData { type UpdateTelemetryData (line 35) | interface UpdateTelemetryData { type FindTelemetryData (line 42) | interface FindTelemetryData { type SyncTelemetryData (line 49) | interface SyncTelemetryData { type TelemetryData (line 56) | type TelemetryData = function isCI (line 66) | function isCI(): boolean { function isEnabled (line 79) | function isEnabled(): boolean { function setVersion (line 83) | function setVersion(version: string): void { type PartnerAudit (line 89) | interface PartnerAudit { type SkillAuditData (line 96) | type SkillAuditData = Record; type AuditResponse (line 97) | type AuditResponse = Record; function fetchAuditData (line 103) | async function fetchAuditData( function track (line 131) | function track(data: TelemetryData): void { FILE: src/test-utils.ts constant CLI_PATH (line 5) | const CLI_PATH = join(import.meta.dirname, 'cli.ts'); function stripAnsi (line 7) | function stripAnsi(str: string): string { function stripLogo (line 11) | function stripLogo(str: string): string { function hasLogo (line 19) | function hasLogo(str: string): boolean { function runCli (line 23) | function runCli( function runCliOutput (line 47) | function runCliOutput(args: string[], cwd?: string): string { function runCliWithInput (line 52) | function runCliWithInput( FILE: src/types.ts type AgentType (line 1) | type AgentType = type Skill (line 46) | interface Skill { type AgentConfig (line 57) | interface AgentConfig { type ParsedSource (line 68) | interface ParsedSource { type RemoteSkill (line 81) | interface RemoteSkill { FILE: tests/cross-platform-paths.test.ts function shortenPath (line 14) | function shortenPath(fullPath: string, cwd: string, home: string, pathSe... function isValidSkillFile (line 30) | function isValidSkillFile(file: string): boolean { function normalizeSkillPath (line 40) | function normalizeSkillPath(skillPath: string): string { FILE: tests/installer-symlink.test.ts function makeSkillSource (line 21) | async function makeSkillSource(root: string, name: string): Promise