skillspp 0.2.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../packages/core/src/runtime/background-tasks.ts", "../../../packages/core/src/runtime/agents.ts", "../../../packages/core/src/runtime/check-analysis.ts", "../../../packages/core/src/sources/skills.ts", "../../../packages/core/src/sources/source-parser.ts", "../../../packages/core/src/sources/git.ts", "../../../packages/core/src/providers/registry.ts", "../../../packages/core/src/providers/wellknown.ts", "../../../packages/core/src/providers/catalog.ts", "../../../packages/core/src/providers/index.ts", "../../../packages/core/src/application/experimental.ts", "../../../packages/core/src/sources/source-resolution.ts", "../../../packages/core/src/runtime/hash.ts", "../../../packages/core/src/runtime/lockfile.ts", "../../../packages/core/src/runtime/plugin-check-analysis.ts", "../../../packages/core/src/sources/plugins.ts", "../../../packages/core/src/runtime/validate-analysis.ts", "../../../packages/core/src/runtime/skill-installer.ts", "../../../packages/core/src/runtime/installer-security.ts", "../../../packages/core/src/runtime/policy.ts", "../../../packages/core/src/contracts/errors/core-error.ts", "../../../packages/core/src/runtime/installer.ts", "../../../packages/core/src/sources/scanner.ts", "../../../packages/core/src/runtime/installer-scaffold.ts"],
4
+ "sourcesContent": ["import fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport {\n AGENTS,\n detectInstalledAgents,\n filterInstalledAgents,\n getAgentPluginsDir,\n getAgentSkillsDir,\n resolveAgents,\n} from \"./agents\";\nimport { assessLockEntries, type CheckOptions, type SkillAssessment } from \"./check-analysis\";\nimport { assessPluginLockEntries, type PluginAssessment } from \"./plugin-check-analysis\";\nimport { runValidateAnalysis } from \"./validate-analysis\";\nimport type {\n AddOptions,\n AgentType,\n InstallMode,\n ParsedSource,\n Plugin,\n Skill,\n} from \"../contracts/runtime-types\";\nimport { installSkill, installPlugin } from \"./installer\";\nimport {\n applyInstallerArtifacts,\n cleanupPreparedInstallerArtifacts,\n prepareInstallerArtifacts,\n} from \"./skill-installer\";\nimport { hashDirectory, hashDirectoryAsync } from \"./hash\";\nimport {\n readLockfile,\n readResourceLockfile,\n upsertLockEntry,\n upsertResourceLockEntry,\n writeLockfile,\n writeResourceLockfile,\n type LockEntry,\n type LockfileFormat,\n type ResourceKind,\n} from \"./lockfile\";\nimport {\n detectLocalGlobalConflicts,\n detectTransitiveSkillConflicts,\n discoverTransitiveSkillCandidates,\n} from \"../sources/scanner\";\nimport { parseSource } from \"../sources/source-parser\";\nimport { prepareSourceDirAsync, resolveGitHeadRefAsync } from \"../sources/git\";\nimport {\n discoverSkillsAsync,\n resolveSourceLabel,\n stageRemoteSkillFilesToTempDir,\n} from \"../sources/skills\";\nimport { discoverPluginsAsync, stageRemotePluginFilesToTempDir } from \"../sources/plugins\";\nimport {\n resolveCatalogPlugins,\n resolveCatalogSkills,\n resolveWellKnownPlugins,\n resolveWellKnownSkills,\n} from \"../sources/source-resolution\";\nimport {\n listSkillsMissingInstallerConfig,\n scaffoldInstallerConfigForSkills,\n type InstallerScaffoldFormat,\n} from \"./installer-scaffold\";\nimport { assertExperimentalFeatureEnabled } from \"../application/experimental\";\nimport type {\n AddFetchOrDiscoverTaskResult,\n AddInstallTaskResult,\n BackgroundTaskRequest,\n BackgroundTaskResult,\n CheckScanTaskResult,\n FindInventoryTaskResult,\n ListDetectAgentsTaskResult,\n ListInventoryRow,\n ListScanInventoryTaskResult,\n PluginAddFetchOrDiscoverTaskResult,\n PluginAddInstallTaskResult,\n PluginUpdateApplyTaskResult,\n PluginUpdateAssessTaskResult,\n PluginUpdateMigrateTaskResult,\n UpdateApplyTaskResult,\n UpdateAssessTaskResult,\n UpdateMigrateTaskResult,\n ValidateRunTaskResult,\n} from \"./background-task-contracts\";\n\ntype ProgressReporter = (label: string) => Promise<void> | void;\n\nfunction serializeAssessments(\n assessments: Array<Pick<SkillAssessment | PluginAssessment, \"entry\" | \"drift\">>,\n): UpdateAssessTaskResult[\"assessments\"] {\n return assessments.map((assessment) => ({\n entry: assessment.entry,\n drift: assessment.drift,\n }));\n}\n\nfunction resolveAddGlobalInstall(options: AddOptions): boolean {\n if (options.globalFlagProvided) {\n return Boolean(options.global);\n }\n return false;\n}\n\nfunction resolveAddInstallMode(options: AddOptions): InstallMode {\n if (options.symlinkFlagProvided) {\n return \"symlink\";\n }\n return \"copy\";\n}\n\nfunction resolveAddInstallerScaffoldFormat(\n options: AddOptions,\n missingCount: number,\n): InstallerScaffoldFormat | undefined {\n if (missingCount === 0) {\n return undefined;\n }\n return options.yaml ? \"yaml\" : \"json\";\n}\n\nfunction sourceHashForInstalledSkill(options: {\n parsedSource: ParsedSource;\n skillPath: string;\n beforeHash?: string;\n}): string {\n if (options.parsedSource.type === \"local\") {\n return hashDirectory(options.skillPath);\n }\n return options.beforeHash || hashDirectory(options.skillPath);\n}\n\nfunction canonicalSourceIdentity(options: {\n parsedSource: ParsedSource;\n wellKnownSourceUrl?: string;\n}): string {\n if (options.parsedSource.type === \"local\") {\n return options.parsedSource.localPath;\n }\n if (options.parsedSource.type === \"well-known\") {\n return options.wellKnownSourceUrl || options.parsedSource.url;\n }\n if (options.parsedSource.type === \"catalog\") {\n return options.wellKnownSourceUrl || options.parsedSource.url;\n }\n if (options.parsedSource.type === \"github\") {\n const suffix = options.parsedSource.subpath ? `#${options.parsedSource.subpath}` : \"\";\n return `${options.parsedSource.repoUrl}${suffix}`;\n }\n return options.parsedSource.repoUrl;\n}\n\nfunction resolveSafeRealPath(inputPath: string): string {\n try {\n return fs.realpathSync(inputPath);\n } catch {\n return path.resolve(inputPath);\n }\n}\n\nfunction isLocalSymlinkSource(localPath: string): boolean {\n try {\n if (!fs.existsSync(localPath)) {\n return false;\n }\n return fs.lstatSync(localPath).isSymbolicLink();\n } catch {\n return false;\n }\n}\n\nfunction lockfileNameForFormat(format: LockfileFormat): string {\n return format === \"yaml\" ? \"skillspp-lock.yaml\" : \"skillspp-lock.json\";\n}\n\nfunction staleLockfileNameForFormat(format: LockfileFormat): string {\n return format === \"yaml\" ? \"skillspp-lock.json\" : \"skillspp-lock.yaml\";\n}\n\nfunction propagateLockfileVisibility(options: {\n canonicalDir: string;\n targetDirs: string[];\n lockFormat: LockfileFormat;\n}): void {\n const lockName = lockfileNameForFormat(options.lockFormat);\n const staleLockName = staleLockfileNameForFormat(options.lockFormat);\n const canonicalLockPath = path.join(options.canonicalDir, lockName);\n const canonicalRealPath = fs.existsSync(options.canonicalDir)\n ? fs.realpathSync(options.canonicalDir)\n : path.resolve(options.canonicalDir);\n\n for (const targetDir of options.targetDirs) {\n const targetRealPath = fs.existsSync(targetDir)\n ? fs.realpathSync(targetDir)\n : path.resolve(targetDir);\n if (targetRealPath === canonicalRealPath) {\n continue;\n }\n\n const targetLockPath = path.join(targetDir, lockName);\n const staleTargetPath = path.join(targetDir, staleLockName);\n fs.copyFileSync(canonicalLockPath, targetLockPath);\n if (fs.existsSync(staleTargetPath)) {\n fs.rmSync(staleTargetPath, { force: true });\n }\n }\n}\n\nfunction writeLockEntryAfterInstall(options: {\n resourceKind?: ResourceKind;\n globalInstall: boolean;\n cwd: string;\n sourceInput: string;\n sourceType: ParsedSource[\"type\"];\n sourceCanonical?: string;\n sourcePinnedRef?: string;\n sourceResolvedPath?: string;\n sourceIsSymlink?: boolean;\n sourceSkillName: string;\n sourceSkillPath?: string;\n wellKnownSourceUrl?: string;\n sourceHash: string;\n outcome: {\n skillName: string;\n canonicalDir: string;\n installedTo: Array<{\n agent: AgentType;\n path: string;\n mode: InstallMode;\n }>;\n };\n mode: InstallMode;\n lockFormat?: LockfileFormat;\n}): void {\n const installedHash = hashDirectory(options.outcome.canonicalDir);\n const resourceKind = options.resourceKind || \"skill\";\n const lock = readResourceLockfile(resourceKind, options.globalInstall, options.cwd);\n const entry = {\n skillName: options.outcome.skillName,\n global: options.globalInstall,\n installMode: options.mode,\n agents: options.outcome.installedTo.map((row) => row.agent),\n canonicalDir: options.outcome.canonicalDir,\n source: {\n input: options.sourceInput,\n type: options.sourceType,\n canonical: options.sourceCanonical,\n pinnedRef: options.sourcePinnedRef,\n resolvedPath: options.sourceResolvedPath,\n isSymlinkSource: options.sourceIsSymlink,\n selector: {\n skillName: options.sourceSkillName,\n relativePath: options.sourceSkillPath,\n wellKnownSourceUrl: options.wellKnownSourceUrl,\n },\n },\n sourceHash: options.sourceHash,\n installedHash,\n updatedAt: new Date().toISOString(),\n };\n\n const next = upsertResourceLockEntry(lock, entry);\n writeResourceLockfile(\n resourceKind,\n options.globalInstall,\n options.cwd,\n next,\n options.lockFormat || \"json\",\n );\n\n const selectedFormat = options.lockFormat || \"json\";\n propagateLockfileVisibility({\n canonicalDir: options.outcome.canonicalDir,\n targetDirs: options.outcome.installedTo.map((destination) => destination.path),\n lockFormat: selectedFormat,\n });\n\n const staleLockPath = path.join(\n options.outcome.canonicalDir,\n staleLockfileNameForFormat(selectedFormat),\n );\n if (fs.existsSync(staleLockPath)) {\n fs.rmSync(staleLockPath, { force: true });\n }\n}\n\ntype StagedRemoteSkill = {\n skill: Skill;\n cleanup: () => void;\n};\n\ntype StagedRemotePlugin = {\n plugin: Plugin;\n cleanup: () => void;\n};\n\nfunction buildRemoteSkill(remote: {\n installName: string;\n description: string;\n files: Map<string, string>;\n}): StagedRemoteSkill {\n const staged = stageRemoteSkillFilesToTempDir(remote.files);\n return {\n skill: {\n name: remote.installName,\n description: remote.description,\n path: staged.path,\n },\n cleanup: staged.cleanup,\n };\n}\n\nasync function buildRemotePlugin(remote: {\n installName: string;\n files: Map<string, string>;\n}): Promise<StagedRemotePlugin> {\n const staged = stageRemotePluginFilesToTempDir(remote.installName, remote.files);\n\n try {\n const plugins = await discoverPluginsAsync(staged.path, [remote.installName]);\n const plugin = plugins[0];\n if (!plugin) {\n throw new Error(`Plugin '${remote.installName}' is missing plugin.json`);\n }\n\n return {\n plugin,\n cleanup: staged.cleanup,\n };\n } catch (error) {\n staged.cleanup();\n throw error;\n }\n}\n\nasync function runCheckScanTask(\n cwd: string,\n options: CheckOptions,\n emitProgress: ProgressReporter,\n): Promise<CheckScanTaskResult> {\n await emitProgress(\"checking drift\");\n const assessed = await assessLockEntries(options, cwd, {\n keepResolved: false,\n });\n\n await emitProgress(\"checking local/global conflicts\");\n const conflicts = detectLocalGlobalConflicts(cwd);\n\n await emitProgress(\"checking transitive conflicts\");\n const transitiveCandidates = discoverTransitiveSkillCandidates(cwd);\n const transitiveConflicts = detectTransitiveSkillConflicts(transitiveCandidates);\n\n return {\n drift: assessed.drift,\n checked: assessed.checked,\n conflicts,\n transitiveConflicts,\n };\n}\n\nasync function runUpdateAssessTask(\n cwd: string,\n options: CheckOptions,\n emitProgress: ProgressReporter,\n): Promise<UpdateAssessTaskResult> {\n await emitProgress(\"assessing drift\");\n const assessed = await assessLockEntries(options, cwd, {\n keepResolved: false,\n });\n return {\n assessments: serializeAssessments(assessed.assessments),\n };\n}\n\nasync function runPluginUpdateAssessTask(\n cwd: string,\n options: BackgroundTaskRequest<\"plugin.update.assess\">[\"payload\"][\"options\"],\n emitProgress: ProgressReporter,\n): Promise<PluginUpdateAssessTaskResult> {\n await emitProgress(\"assessing drift\");\n const assessed = await assessPluginLockEntries(options, cwd, {\n keepResolved: false,\n });\n return {\n assessments: serializeAssessments(assessed.assessments),\n };\n}\n\nfunction createBackupDir(skillName: string, sourceDir: string): string {\n const backupRoot = fs.mkdtempSync(path.join(os.tmpdir(), \"skillspp-update-backup-\"));\n const backupDir = path.join(backupRoot, skillName);\n fs.mkdirSync(backupDir, { recursive: true });\n fs.cpSync(sourceDir, backupDir, { recursive: true, force: true });\n return backupDir;\n}\n\nasync function applyEntryUpdate(\n assessment: SkillAssessment,\n options: BackgroundTaskRequest<\"update.apply\">[\"payload\"][\"options\"],\n cwd: string,\n): Promise<LockEntry> {\n const { entry } = assessment;\n if (!assessment.resolved || !assessment.sourceHash) {\n throw new Error(`No resolved source available for ${entry.skillName}`);\n }\n\n const resolved = assessment.resolved;\n const sourceHash = assessment.sourceHash;\n const backupDir = createBackupDir(entry.skillName, entry.canonicalDir);\n\n try {\n const preparedInstaller = await prepareInstallerArtifacts(resolved.skill.path, cwd, {\n sourceType: entry.source.type,\n policyMode: options.policyMode || \"enforce\",\n trustWellKnown: Boolean(options.trustWellKnown),\n });\n\n const outcome = installSkill(resolved.skill, entry.agents as AgentType[], {\n mode: entry.installMode,\n globalInstall: entry.global,\n cwd,\n });\n\n try {\n await applyInstallerArtifacts(outcome.canonicalDir, preparedInstaller);\n } finally {\n cleanupPreparedInstallerArtifacts(preparedInstaller);\n }\n\n const installedHash = await hashDirectoryAsync(outcome.canonicalDir);\n\n return {\n ...entry,\n source: {\n ...entry.source,\n canonical: assessment.refreshedSource?.canonical ?? entry.source.canonical,\n pinnedRef: assessment.refreshedSource?.pinnedRef ?? entry.source.pinnedRef,\n resolvedPath: assessment.refreshedSource?.resolvedPath ?? entry.source.resolvedPath,\n isSymlinkSource:\n assessment.refreshedSource?.isSymlinkSource ?? entry.source.isSymlinkSource,\n selector: {\n ...entry.source.selector,\n relativePath:\n assessment.refreshedSource?.sourceSkillPath ?? entry.source.selector.relativePath,\n wellKnownSourceUrl:\n assessment.refreshedSource?.wellKnownSourceUrl ??\n entry.source.selector.wellKnownSourceUrl,\n },\n },\n sourceHash,\n installedHash,\n canonicalDir: outcome.canonicalDir,\n updatedAt: new Date().toISOString(),\n };\n } catch (error) {\n const rollbackSkill = {\n name: entry.skillName,\n description: `Rollback for ${entry.skillName}`,\n path: backupDir,\n };\n\n installSkill(rollbackSkill, entry.agents as AgentType[], {\n mode: entry.installMode,\n globalInstall: entry.global,\n cwd,\n });\n\n throw error;\n } finally {\n fs.rmSync(path.dirname(backupDir), { recursive: true, force: true });\n if (resolved.cleanup) {\n resolved.cleanup();\n }\n }\n}\n\nasync function applyPluginEntryUpdate(\n assessment: PluginAssessment,\n options: BackgroundTaskRequest<\"plugin.update.apply\">[\"payload\"][\"options\"],\n cwd: string,\n): Promise<LockEntry> {\n const { entry } = assessment;\n if (!assessment.resolved || !assessment.sourceHash) {\n throw new Error(`No resolved source available for ${entry.skillName}`);\n }\n\n const resolved = assessment.resolved;\n const sourceHash = assessment.sourceHash;\n const backupDir = createBackupDir(entry.skillName, entry.canonicalDir);\n\n try {\n const preparedInstaller = await prepareInstallerArtifacts(resolved.plugin.path, cwd, {\n sourceType: entry.source.type,\n policyMode: options.policyMode || \"enforce\",\n trustWellKnown: Boolean(options.trustWellKnown),\n });\n\n const outcome = installPlugin(resolved.plugin, entry.agents as AgentType[], {\n mode: entry.installMode,\n globalInstall: entry.global,\n cwd,\n });\n\n try {\n await applyInstallerArtifacts(outcome.canonicalDir, preparedInstaller);\n } finally {\n cleanupPreparedInstallerArtifacts(preparedInstaller);\n }\n\n const installedHash = await hashDirectoryAsync(outcome.canonicalDir);\n\n return {\n ...entry,\n source: {\n ...entry.source,\n canonical: assessment.refreshedSource?.canonical ?? entry.source.canonical,\n pinnedRef: assessment.refreshedSource?.pinnedRef ?? entry.source.pinnedRef,\n resolvedPath: assessment.refreshedSource?.resolvedPath ?? entry.source.resolvedPath,\n isSymlinkSource:\n assessment.refreshedSource?.isSymlinkSource ?? entry.source.isSymlinkSource,\n selector: {\n ...entry.source.selector,\n relativePath:\n assessment.refreshedSource?.sourcePluginPath ?? entry.source.selector.relativePath,\n wellKnownSourceUrl:\n assessment.refreshedSource?.wellKnownSourceUrl ??\n entry.source.selector.wellKnownSourceUrl,\n },\n },\n sourceHash,\n installedHash,\n canonicalDir: outcome.canonicalDir,\n updatedAt: new Date().toISOString(),\n };\n } catch (error) {\n const rollbackPlugin = {\n name: entry.skillName,\n description: `Rollback for ${entry.skillName}`,\n path: backupDir,\n };\n\n installPlugin(rollbackPlugin, entry.agents as AgentType[], {\n mode: entry.installMode,\n globalInstall: entry.global,\n cwd,\n });\n\n throw error;\n } finally {\n fs.rmSync(path.dirname(backupDir), { recursive: true, force: true });\n if (resolved.cleanup) {\n resolved.cleanup();\n }\n }\n}\n\nasync function runUpdateApplyTask(\n payload: BackgroundTaskRequest<\"update.apply\">[\"payload\"],\n emitProgress: ProgressReporter,\n): Promise<UpdateApplyTaskResult> {\n const selectedOptions = {\n ...payload.options,\n skill: payload.selectedSkillNames,\n };\n\n await emitProgress(\"assessing selected skills\");\n const assessed = await assessLockEntries(selectedOptions, payload.cwd, {\n keepResolved: true,\n });\n\n const candidateAssessments = assessed.assessments.filter(\n (assessment) =>\n !assessment.drift.some((item) => item.kind === \"migrate-required\") &&\n assessment.drift.some(\n (item) => item.kind === \"changed-source\" || item.kind === \"local-modified\",\n ),\n );\n\n let nextLock = readLockfile(Boolean(payload.options.global), payload.cwd);\n const updatedEntries: LockEntry[] = [];\n const ordered = [...candidateAssessments].sort((a, b) =>\n a.entry.skillName.localeCompare(b.entry.skillName),\n );\n\n try {\n for (const assessment of ordered) {\n await emitProgress(`updating ${assessment.entry.skillName}`);\n const updated = await applyEntryUpdate(assessment, payload.options, payload.cwd);\n updatedEntries.push(updated);\n nextLock = upsertLockEntry(nextLock, updated);\n }\n\n await emitProgress(\"writing lockfile\");\n writeLockfile(Boolean(payload.options.global), payload.cwd, nextLock, payload.lockFormat);\n for (const updated of updatedEntries) {\n const targetDirs = Array.from(\n new Set(\n updated.agents.map((agent) =>\n path.join(getAgentSkillsDir(agent, updated.global, payload.cwd), updated.skillName),\n ),\n ),\n );\n propagateLockfileVisibility({\n canonicalDir: updated.canonicalDir,\n targetDirs,\n lockFormat: payload.lockFormat,\n });\n }\n\n return {\n updatedSkillNames: ordered.map((assessment) => assessment.entry.skillName),\n };\n } finally {\n for (const assessment of assessed.assessments) {\n if (assessment.resolved?.cleanup) {\n assessment.resolved.cleanup();\n }\n }\n }\n}\n\nasync function runPluginUpdateApplyTask(\n payload: BackgroundTaskRequest<\"plugin.update.apply\">[\"payload\"],\n emitProgress: ProgressReporter,\n): Promise<PluginUpdateApplyTaskResult> {\n const selectedOptions = {\n ...payload.options,\n skill: payload.selectedPluginNames,\n };\n\n await emitProgress(\"assessing selected plugins\");\n const assessed = await assessPluginLockEntries(selectedOptions, payload.cwd, {\n keepResolved: true,\n });\n\n const candidateAssessments = assessed.assessments.filter(\n (assessment) =>\n !assessment.drift.some((item) => item.kind === \"migrate-required\") &&\n assessment.drift.some(\n (item) => item.kind === \"changed-source\" || item.kind === \"local-modified\",\n ),\n );\n\n let nextLock = readResourceLockfile(\"plugin\", Boolean(payload.options.global), payload.cwd);\n const updatedEntries: LockEntry[] = [];\n const ordered = [...candidateAssessments].sort((a, b) =>\n a.entry.skillName.localeCompare(b.entry.skillName),\n );\n\n try {\n for (const assessment of ordered) {\n await emitProgress(`updating ${assessment.entry.skillName}`);\n const updated = await applyPluginEntryUpdate(assessment, payload.options, payload.cwd);\n updatedEntries.push(updated);\n nextLock = upsertResourceLockEntry(nextLock, updated);\n }\n\n await emitProgress(\"writing lockfile\");\n writeResourceLockfile(\n \"plugin\",\n Boolean(payload.options.global),\n payload.cwd,\n nextLock,\n payload.lockFormat,\n );\n for (const updated of updatedEntries) {\n const targetDirs = Array.from(\n new Set(\n updated.agents.map((agent) =>\n path.join(getAgentPluginsDir(agent, updated.global, payload.cwd), updated.skillName),\n ),\n ),\n );\n propagateLockfileVisibility({\n canonicalDir: updated.canonicalDir,\n targetDirs,\n lockFormat: payload.lockFormat,\n });\n }\n\n return {\n updatedPluginNames: ordered.map((assessment) => assessment.entry.skillName),\n };\n } finally {\n for (const assessment of assessed.assessments) {\n if (assessment.resolved?.cleanup) {\n assessment.resolved.cleanup();\n }\n }\n }\n}\n\ntype ResolvedMigrationSource = {\n parsedSource: ParsedSource;\n skill: Skill;\n sourceSkillPath?: string;\n wellKnownSourceUrl?: string;\n sourceHash: string;\n sourceCanonical: string;\n sourcePinnedRef?: string;\n sourceResolvedPath?: string;\n sourceIsSymlink?: boolean;\n cleanup?: () => void;\n};\n\ntype ResolvedPluginMigrationSource = {\n parsedSource: ParsedSource;\n plugin: Plugin;\n sourcePluginPath?: string;\n wellKnownSourceUrl?: string;\n sourceHash: string;\n sourceCanonical: string;\n sourcePinnedRef?: string;\n sourceResolvedPath?: string;\n sourceIsSymlink?: boolean;\n cleanup?: () => void;\n};\n\nasync function resolveMigrationSource(options: {\n sourceInput: string;\n skillName: string;\n addOptions: AddOptions;\n}): Promise<ResolvedMigrationSource> {\n const parsedSource = parseSource(options.sourceInput);\n\n if (parsedSource.type === \"well-known\" || parsedSource.type === \"catalog\") {\n const remoteSkills =\n parsedSource.type === \"well-known\"\n ? await resolveWellKnownSkills(parsedSource.url, options.addOptions)\n : await resolveCatalogSkills(parsedSource.url, options.addOptions);\n const remote = remoteSkills.find((item) => item.installName === options.skillName);\n if (!remote) {\n throw new Error(`Skill '${options.skillName}' not found in migration source`);\n }\n const staged = buildRemoteSkill(remote);\n const sourceHash = hashDirectory(staged.skill.path);\n return {\n parsedSource,\n skill: staged.skill,\n sourceHash,\n sourceCanonical: canonicalSourceIdentity({\n parsedSource,\n wellKnownSourceUrl: remote.sourceUrl,\n }),\n sourcePinnedRef: sourceHash,\n wellKnownSourceUrl: remote.sourceUrl,\n cleanup: staged.cleanup,\n };\n }\n\n const prepared = await prepareSourceDirAsync(\n parsedSource as Exclude<ParsedSource, { type: \"well-known\" | \"catalog\" }>,\n );\n try {\n const skills = await discoverSkillsAsync(prepared.basePath);\n const skill = skills.find((item) => item.name === options.skillName);\n if (!skill) {\n throw new Error(`Skill '${options.skillName}' not found in migration source`);\n }\n const sourceHash = sourceHashForInstalledSkill({\n parsedSource,\n skillPath: skill.path,\n });\n const sourcePinnedRef =\n parsedSource.type === \"github\" || parsedSource.type === \"git\"\n ? await resolveGitHeadRefAsync(prepared.basePath)\n : undefined;\n return {\n parsedSource,\n skill,\n sourceSkillPath: path.relative(prepared.basePath, skill.path) || \".\",\n sourceHash,\n sourceCanonical: canonicalSourceIdentity({ parsedSource }),\n sourcePinnedRef,\n sourceResolvedPath:\n parsedSource.type === \"local\" ? resolveSafeRealPath(skill.path) : undefined,\n sourceIsSymlink:\n parsedSource.type === \"local\" ? isLocalSymlinkSource(parsedSource.localPath) : undefined,\n cleanup: prepared.cleanup,\n };\n } catch (error) {\n if (prepared.cleanup) {\n prepared.cleanup();\n }\n throw error;\n }\n}\n\nasync function resolvePluginMigrationSource(options: {\n sourceInput: string;\n pluginName: string;\n addOptions: AddOptions;\n}): Promise<ResolvedPluginMigrationSource> {\n const parsedSource = parseSource(options.sourceInput);\n\n if (parsedSource.type === \"well-known\" || parsedSource.type === \"catalog\") {\n const remotePlugins =\n parsedSource.type === \"well-known\"\n ? await resolveWellKnownPlugins(parsedSource.url, options.addOptions)\n : await resolveCatalogPlugins(parsedSource.url, options.addOptions);\n const remote = remotePlugins.find((item) => item.installName === options.pluginName);\n if (!remote) {\n throw new Error(`Plugin '${options.pluginName}' not found in migration source`);\n }\n const staged = await buildRemotePlugin(remote);\n const sourceHash = hashDirectory(staged.plugin.path);\n return {\n parsedSource,\n plugin: staged.plugin,\n sourceHash,\n sourceCanonical: canonicalSourceIdentity({\n parsedSource,\n wellKnownSourceUrl: remote.sourceUrl,\n }),\n sourcePinnedRef: sourceHash,\n wellKnownSourceUrl: remote.sourceUrl,\n cleanup: staged.cleanup,\n };\n }\n\n const prepared = await prepareSourceDirAsync(\n parsedSource as Exclude<ParsedSource, { type: \"well-known\" | \"catalog\" }>,\n );\n try {\n const plugins = await discoverPluginsAsync(prepared.basePath, [options.pluginName]);\n const plugin = plugins.find((item) => item.name === options.pluginName);\n if (!plugin) {\n throw new Error(`Plugin '${options.pluginName}' not found in migration source`);\n }\n const sourceHash = sourceHashForInstalledSkill({\n parsedSource,\n skillPath: plugin.path,\n });\n const sourcePinnedRef =\n parsedSource.type === \"github\" || parsedSource.type === \"git\"\n ? await resolveGitHeadRefAsync(prepared.basePath)\n : undefined;\n return {\n parsedSource,\n plugin,\n sourcePluginPath: path.relative(prepared.basePath, plugin.path) || \".\",\n sourceHash,\n sourceCanonical: canonicalSourceIdentity({ parsedSource }),\n sourcePinnedRef,\n sourceResolvedPath:\n parsedSource.type === \"local\" ? resolveSafeRealPath(plugin.path) : undefined,\n sourceIsSymlink:\n parsedSource.type === \"local\" ? isLocalSymlinkSource(parsedSource.localPath) : undefined,\n cleanup: prepared.cleanup,\n };\n } catch (error) {\n if (prepared.cleanup) {\n prepared.cleanup();\n }\n throw error;\n }\n}\n\nasync function runUpdateMigrateTask(\n payload: BackgroundTaskRequest<\"update.migrate\">[\"payload\"],\n emitProgress: ProgressReporter,\n): Promise<UpdateMigrateTaskResult> {\n await emitProgress(\"resolving migration source\");\n const lock = readLockfile(Boolean(payload.options.global), payload.cwd);\n const entry = lock.entries.find((item) => item.skillName === payload.skillName);\n if (!entry) {\n throw new Error(`Unknown skill for migration: ${payload.skillName}`);\n }\n\n const source = await resolveMigrationSource({\n sourceInput: payload.sourceInput,\n skillName: payload.skillName,\n addOptions: payload.options,\n });\n const backupDir = createBackupDir(entry.skillName, entry.canonicalDir);\n\n try {\n await emitProgress(`migrating ${entry.skillName}`);\n const preparedInstaller = await prepareInstallerArtifacts(source.skill.path, payload.cwd, {\n sourceType: source.parsedSource.type,\n policyMode: payload.options.policyMode || \"enforce\",\n trustWellKnown: Boolean(payload.options.trustWellKnown),\n });\n const outcome = installSkill(source.skill, entry.agents as AgentType[], {\n mode: entry.installMode,\n globalInstall: entry.global,\n cwd: payload.cwd,\n });\n\n try {\n await applyInstallerArtifacts(outcome.canonicalDir, preparedInstaller);\n await emitProgress(\"writing lockfile\");\n writeLockEntryAfterInstall({\n globalInstall: entry.global,\n cwd: payload.cwd,\n sourceInput: payload.sourceInput,\n sourceType: source.parsedSource.type,\n sourceCanonical: source.sourceCanonical,\n sourcePinnedRef: source.sourcePinnedRef,\n sourceResolvedPath: source.sourceResolvedPath,\n sourceIsSymlink: source.sourceIsSymlink,\n sourceSkillName: source.skill.name,\n sourceSkillPath: source.sourceSkillPath,\n wellKnownSourceUrl: source.wellKnownSourceUrl,\n sourceHash: source.sourceHash,\n outcome,\n mode: entry.installMode,\n lockFormat: payload.lockFormat,\n });\n } finally {\n cleanupPreparedInstallerArtifacts(preparedInstaller);\n }\n } catch (error) {\n const rollbackSkill = {\n name: entry.skillName,\n description: `Rollback for ${entry.skillName}`,\n path: backupDir,\n };\n\n installSkill(rollbackSkill, entry.agents as AgentType[], {\n mode: entry.installMode,\n globalInstall: entry.global,\n cwd: payload.cwd,\n });\n throw error;\n } finally {\n fs.rmSync(path.dirname(backupDir), { recursive: true, force: true });\n if (source.cleanup) {\n source.cleanup();\n }\n }\n\n return { skillName: entry.skillName };\n}\n\nasync function runPluginUpdateMigrateTask(\n payload: BackgroundTaskRequest<\"plugin.update.migrate\">[\"payload\"],\n emitProgress: ProgressReporter,\n): Promise<PluginUpdateMigrateTaskResult> {\n await emitProgress(\"resolving migration source\");\n const lock = readResourceLockfile(\"plugin\", Boolean(payload.options.global), payload.cwd);\n const entry = lock.entries.find((item) => item.skillName === payload.pluginName);\n if (!entry) {\n throw new Error(`Unknown plugin for migration: ${payload.pluginName}`);\n }\n\n const source = await resolvePluginMigrationSource({\n sourceInput: payload.sourceInput,\n pluginName: payload.pluginName,\n addOptions: payload.options,\n });\n const backupDir = createBackupDir(entry.skillName, entry.canonicalDir);\n\n try {\n await emitProgress(`migrating ${entry.skillName}`);\n const preparedInstaller = await prepareInstallerArtifacts(source.plugin.path, payload.cwd, {\n sourceType: source.parsedSource.type,\n policyMode: payload.options.policyMode || \"enforce\",\n trustWellKnown: Boolean(payload.options.trustWellKnown),\n });\n const outcome = installPlugin(source.plugin, entry.agents as AgentType[], {\n mode: entry.installMode,\n globalInstall: entry.global,\n cwd: payload.cwd,\n });\n\n try {\n await applyInstallerArtifacts(outcome.canonicalDir, preparedInstaller);\n await emitProgress(\"writing lockfile\");\n writeLockEntryAfterInstall({\n resourceKind: \"plugin\",\n globalInstall: entry.global,\n cwd: payload.cwd,\n sourceInput: payload.sourceInput,\n sourceType: source.parsedSource.type,\n sourceCanonical: source.sourceCanonical,\n sourcePinnedRef: source.sourcePinnedRef,\n sourceResolvedPath: source.sourceResolvedPath,\n sourceIsSymlink: source.sourceIsSymlink,\n sourceSkillName: source.plugin.name,\n sourceSkillPath: source.sourcePluginPath,\n wellKnownSourceUrl: source.wellKnownSourceUrl,\n sourceHash: source.sourceHash,\n outcome,\n mode: entry.installMode,\n lockFormat: payload.lockFormat,\n });\n } finally {\n cleanupPreparedInstallerArtifacts(preparedInstaller);\n }\n } catch (error) {\n const rollbackPlugin = {\n name: entry.skillName,\n description: `Rollback for ${entry.skillName}`,\n path: backupDir,\n };\n\n installPlugin(rollbackPlugin, entry.agents as AgentType[], {\n mode: entry.installMode,\n globalInstall: entry.global,\n cwd: payload.cwd,\n });\n throw error;\n } finally {\n fs.rmSync(path.dirname(backupDir), { recursive: true, force: true });\n if (source.cleanup) {\n source.cleanup();\n }\n }\n\n return { pluginName: entry.skillName };\n}\n\nasync function runListDetectAgentsTask(\n cwd: string,\n options: BackgroundTaskRequest<\"list.detectAgents\">[\"payload\"][\"options\"],\n emitProgress: ProgressReporter,\n): Promise<ListDetectAgentsTaskResult> {\n await emitProgress(\"detecting installed agents\");\n const agents = options.agent\n ? filterInstalledAgents(resolveAgents(options.agent), cwd)\n : detectInstalledAgents(cwd);\n return { agents };\n}\n\nasync function runListScanInventoryTask(\n payload: BackgroundTaskRequest<\"list.scanInventory\">[\"payload\"],\n emitProgress: ProgressReporter,\n): Promise<ListScanInventoryTaskResult> {\n const grouped = new Map<string, { name: string; resolvedPath: string; agents: Set<string> }>();\n\n for (const agent of payload.agents) {\n await emitProgress(`scanning installed skills (${AGENTS[agent].displayName})`);\n const dir = getAgentSkillsDir(agent, payload.globalInstall, payload.cwd);\n if (!fs.existsSync(dir) || !fs.statSync(dir).isDirectory()) {\n continue;\n }\n\n for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {\n if (!entry.isDirectory() && !entry.isSymbolicLink()) {\n continue;\n }\n const fullPath = path.join(dir, entry.name);\n let resolvedPath = fullPath;\n try {\n resolvedPath = fs.realpathSync(fullPath);\n } catch {\n resolvedPath = fullPath;\n }\n\n const key = `${entry.name}:${resolvedPath}`;\n const existing = grouped.get(key);\n if (existing) {\n existing.agents.add(AGENTS[agent].displayName);\n } else {\n grouped.set(key, {\n name: entry.name,\n resolvedPath,\n agents: new Set([AGENTS[agent].displayName]),\n });\n }\n }\n }\n\n const rows: ListInventoryRow[] = Array.from(grouped.values())\n .map((row) => ({\n name: row.name,\n resolvedPath: row.resolvedPath,\n agents: Array.from(row.agents).sort((a, b) => a.localeCompare(b)),\n }))\n .sort((a, b) => a.name.localeCompare(b.name));\n\n return { rows };\n}\n\nasync function resolveAddSourceSkills(\n sourceInput: string,\n options: AddOptions,\n emitProgress: ProgressReporter,\n): Promise<AddFetchOrDiscoverTaskResult> {\n const parsed = parseSource(sourceInput);\n\n if (parsed.type === \"well-known\" || parsed.type === \"catalog\") {\n await emitProgress(\"fetching skill index\");\n const remoteSkills =\n parsed.type === \"well-known\"\n ? await resolveWellKnownSkills(parsed.url, options)\n : await resolveCatalogSkills(parsed.url, options);\n if (remoteSkills.length === 0) {\n throw new Error(\"No skills found at remote endpoint\");\n }\n return {\n skills: remoteSkills.map((skill) => ({\n name: skill.installName,\n description: skill.description,\n })),\n };\n }\n\n await emitProgress(\"loading source\");\n const prepared = await prepareSourceDirAsync(\n parsed as Exclude<ParsedSource, { type: \"well-known\" | \"catalog\" }>,\n );\n try {\n const skills = await discoverSkillsAsync(prepared.basePath);\n return {\n skills: skills.map((skill) => ({\n name: skill.name,\n description: skill.description,\n })),\n };\n } finally {\n if (prepared.cleanup) {\n prepared.cleanup();\n }\n }\n}\n\nasync function resolveAddSourcePlugins(\n sourceInput: string,\n options: AddOptions,\n emitProgress: ProgressReporter,\n): Promise<PluginAddFetchOrDiscoverTaskResult> {\n const parsed = parseSource(sourceInput);\n const requestedPlugins = options.skill;\n\n if (parsed.type === \"well-known\" || parsed.type === \"catalog\") {\n await emitProgress(\"fetching plugin index\");\n const remotePlugins =\n parsed.type === \"well-known\"\n ? await resolveWellKnownPlugins(parsed.url, options)\n : await resolveCatalogPlugins(parsed.url, options);\n if (remotePlugins.length === 0) {\n throw new Error(\"No plugins found at remote endpoint\");\n }\n\n const selectedRemotePlugins =\n requestedPlugins && !requestedPlugins.includes(\"*\")\n ? remotePlugins.filter((remote) => requestedPlugins.includes(remote.installName))\n : remotePlugins;\n\n const discoveredPlugins: Plugin[] = [];\n for (const remote of selectedRemotePlugins) {\n const staged = await buildRemotePlugin(remote);\n try {\n discoveredPlugins.push(staged.plugin);\n } finally {\n staged.cleanup();\n }\n }\n\n if (discoveredPlugins.length === 0) {\n throw new Error(\"No plugins found in source\");\n }\n return {\n plugins: discoveredPlugins.map((plugin) => ({\n name: plugin.name,\n description: plugin.description,\n })),\n };\n }\n\n await emitProgress(\"loading source\");\n const prepared = await prepareSourceDirAsync(\n parsed as Exclude<ParsedSource, { type: \"well-known\" | \"catalog\" }>,\n );\n try {\n const plugins = await discoverPluginsAsync(prepared.basePath, requestedPlugins);\n if (plugins.length === 0) {\n throw new Error(\"No plugins found in source\");\n }\n return {\n plugins: plugins.map((plugin) => ({\n name: plugin.name,\n description: plugin.description,\n })),\n };\n } finally {\n if (prepared.cleanup) {\n prepared.cleanup();\n }\n }\n}\n\nasync function installSelectedAddSkills(\n payload: BackgroundTaskRequest<\"add.install\">[\"payload\"],\n emitProgress: ProgressReporter,\n): Promise<AddInstallTaskResult> {\n const parsedSource = parseSource(payload.sourceInput);\n const globalInstall = resolveAddGlobalInstall(payload.options);\n const mode = resolveAddInstallMode(payload.options);\n\n if (parsedSource.type === \"well-known\" || parsedSource.type === \"catalog\") {\n await emitProgress(\"fetching selected skills\");\n const remoteSkills =\n parsedSource.type === \"well-known\"\n ? await resolveWellKnownSkills(parsedSource.url, payload.options)\n : await resolveCatalogSkills(parsedSource.url, payload.options);\n const remoteByName = new Map(remoteSkills.map((remote) => [remote.installName, remote]));\n\n const tempCleanups: Array<() => void> = [];\n const stagedSelected: Skill[] = [];\n const sourceHashesBefore = new Map<string, string>();\n\n try {\n for (const skillName of payload.selectedSkillNames) {\n const remote = remoteByName.get(skillName);\n if (!remote) {\n throw new Error(`No matching well-known skills found in source`);\n }\n const staged = buildRemoteSkill(remote);\n tempCleanups.push(staged.cleanup);\n stagedSelected.push(staged.skill);\n sourceHashesBefore.set(staged.skill.path, hashDirectory(staged.skill.path));\n }\n\n const missingInstallerSkillDirs = listSkillsMissingInstallerConfig(\n stagedSelected.map((item) => item.path),\n );\n const scaffoldFormat = resolveAddInstallerScaffoldFormat(\n payload.options,\n missingInstallerSkillDirs.length,\n );\n if (scaffoldFormat) {\n scaffoldInstallerConfigForSkills(missingInstallerSkillDirs, scaffoldFormat);\n }\n\n for (const localSkill of stagedSelected) {\n const remote = remoteByName.get(localSkill.name);\n if (!remote) {\n throw new Error(\n `Could not resolve remote metadata for selected skill '${localSkill.name}'`,\n );\n }\n\n const sourceHash =\n sourceHashesBefore.get(localSkill.path) || hashDirectory(localSkill.path);\n const sourceCanonical = canonicalSourceIdentity({\n parsedSource,\n wellKnownSourceUrl: remote.sourceUrl,\n });\n\n await emitProgress(`installing ${localSkill.name}`);\n const preparedInstaller = await prepareInstallerArtifacts(localSkill.path, payload.cwd, {\n sourceType: parsedSource.type,\n policyMode: payload.options.policyMode || \"enforce\",\n trustWellKnown: Boolean(payload.options.trustWellKnown),\n });\n const outcome = installSkill(localSkill, payload.agents as AgentType[], {\n mode,\n globalInstall,\n cwd: payload.cwd,\n });\n\n try {\n await applyInstallerArtifacts(outcome.canonicalDir, preparedInstaller);\n writeLockEntryAfterInstall({\n resourceKind: \"plugin\",\n globalInstall,\n cwd: payload.cwd,\n sourceInput: payload.sourceInput,\n sourceType: parsedSource.type,\n sourceCanonical,\n sourcePinnedRef: sourceHash,\n sourceSkillName: remote.installName,\n sourceHash,\n wellKnownSourceUrl: remote.sourceUrl,\n outcome,\n mode,\n lockFormat: payload.options.lockFormat,\n });\n } finally {\n cleanupPreparedInstallerArtifacts(preparedInstaller);\n }\n }\n } finally {\n for (const cleanup of tempCleanups) {\n cleanup();\n }\n }\n\n return {\n installedSkillNames: [...payload.selectedSkillNames],\n agentCount: payload.agents.length,\n };\n }\n\n await emitProgress(\"loading source\");\n const prepared = await prepareSourceDirAsync(\n parsedSource as Exclude<ParsedSource, { type: \"well-known\" | \"catalog\" }>,\n );\n\n try {\n const sourceCanonical = canonicalSourceIdentity({ parsedSource });\n const sourcePinnedRef =\n parsedSource.type === \"github\" || parsedSource.type === \"git\"\n ? await resolveGitHeadRefAsync(prepared.basePath)\n : undefined;\n const sourceIsSymlink =\n parsedSource.type === \"local\" ? isLocalSymlinkSource(parsedSource.localPath) : undefined;\n const skills = await discoverSkillsAsync(prepared.basePath);\n const selected = skills.filter((skill) => payload.selectedSkillNames.includes(skill.name));\n if (selected.length === 0) {\n throw new Error(\"No matching skills found in source\");\n }\n\n const sourceHashesBefore = new Map(\n selected.map((skill) => [skill.path, hashDirectory(skill.path)]),\n );\n const missingInstallerSkillDirs = listSkillsMissingInstallerConfig(\n selected.map((skill) => skill.path),\n );\n const scaffoldFormat = resolveAddInstallerScaffoldFormat(\n payload.options,\n missingInstallerSkillDirs.length,\n );\n if (scaffoldFormat) {\n scaffoldInstallerConfigForSkills(missingInstallerSkillDirs, scaffoldFormat);\n }\n\n for (const skill of selected) {\n const sourceResolvedPath =\n parsedSource.type === \"local\" ? resolveSafeRealPath(skill.path) : undefined;\n\n await emitProgress(`installing ${skill.name}`);\n const sourceSkillPath = path.relative(prepared.basePath, skill.path) || \".\";\n const preparedInstaller = await prepareInstallerArtifacts(skill.path, payload.cwd, {\n sourceType: parsedSource.type,\n policyMode: payload.options.policyMode || \"enforce\",\n trustWellKnown: Boolean(payload.options.trustWellKnown),\n });\n const outcome = installSkill(skill, payload.agents as AgentType[], {\n mode,\n globalInstall,\n cwd: payload.cwd,\n });\n\n try {\n await applyInstallerArtifacts(outcome.canonicalDir, preparedInstaller);\n writeLockEntryAfterInstall({\n resourceKind: \"plugin\",\n globalInstall,\n cwd: payload.cwd,\n sourceInput: payload.sourceInput,\n sourceType: parsedSource.type,\n sourceCanonical,\n sourcePinnedRef,\n sourceResolvedPath,\n sourceIsSymlink,\n sourceSkillName: skill.name,\n sourceSkillPath,\n sourceHash: sourceHashForInstalledSkill({\n parsedSource,\n skillPath: skill.path,\n beforeHash: sourceHashesBefore.get(skill.path),\n }),\n outcome,\n mode,\n lockFormat: payload.options.lockFormat,\n });\n } finally {\n cleanupPreparedInstallerArtifacts(preparedInstaller);\n }\n }\n\n return {\n installedSkillNames: selected.map((skill) => skill.name),\n agentCount: payload.agents.length,\n };\n } finally {\n if (prepared.cleanup) {\n prepared.cleanup();\n }\n }\n}\n\nasync function installSelectedAddPlugins(\n payload: BackgroundTaskRequest<\"plugin.add.install\">[\"payload\"],\n emitProgress: ProgressReporter,\n): Promise<PluginAddInstallTaskResult> {\n const parsedSource = parseSource(payload.sourceInput);\n const globalInstall = resolveAddGlobalInstall(payload.options);\n const mode = resolveAddInstallMode(payload.options);\n\n if (parsedSource.type === \"well-known\" || parsedSource.type === \"catalog\") {\n await emitProgress(\"fetching selected plugins\");\n const remotePlugins =\n parsedSource.type === \"well-known\"\n ? await resolveWellKnownPlugins(parsedSource.url, payload.options)\n : await resolveCatalogPlugins(parsedSource.url, payload.options);\n const remoteByName = new Map(remotePlugins.map((remote) => [remote.installName, remote]));\n\n const tempCleanups: Array<() => void> = [];\n const stagedSelected: Plugin[] = [];\n const sourceHashesBefore = new Map<string, string>();\n\n try {\n for (const pluginName of payload.selectedPluginNames) {\n const remote = remoteByName.get(pluginName);\n if (!remote) {\n throw new Error(\"No matching plugins found in source\");\n }\n const staged = await buildRemotePlugin(remote);\n tempCleanups.push(staged.cleanup);\n stagedSelected.push(staged.plugin);\n sourceHashesBefore.set(staged.plugin.path, hashDirectory(staged.plugin.path));\n }\n\n const missingInstallerPluginDirs = listSkillsMissingInstallerConfig(\n stagedSelected.map((item) => item.path),\n );\n const scaffoldFormat = resolveAddInstallerScaffoldFormat(\n payload.options,\n missingInstallerPluginDirs.length,\n );\n if (scaffoldFormat) {\n scaffoldInstallerConfigForSkills(missingInstallerPluginDirs, scaffoldFormat);\n }\n\n for (const localPlugin of stagedSelected) {\n const remote = remoteByName.get(localPlugin.name);\n if (!remote) {\n throw new Error(\n `Could not resolve remote metadata for selected plugin '${localPlugin.name}'`,\n );\n }\n\n const sourceHash =\n sourceHashesBefore.get(localPlugin.path) || hashDirectory(localPlugin.path);\n const sourceCanonical = canonicalSourceIdentity({\n parsedSource,\n wellKnownSourceUrl: remote.sourceUrl,\n });\n\n await emitProgress(`installing ${localPlugin.name}`);\n const preparedInstaller = await prepareInstallerArtifacts(localPlugin.path, payload.cwd, {\n sourceType: parsedSource.type,\n policyMode: payload.options.policyMode || \"enforce\",\n trustWellKnown: Boolean(payload.options.trustWellKnown),\n });\n const outcome = installPlugin(localPlugin, payload.agents as AgentType[], {\n mode,\n globalInstall,\n cwd: payload.cwd,\n });\n\n try {\n await applyInstallerArtifacts(outcome.canonicalDir, preparedInstaller);\n writeLockEntryAfterInstall({\n globalInstall,\n cwd: payload.cwd,\n sourceInput: payload.sourceInput,\n sourceType: parsedSource.type,\n sourceCanonical,\n sourcePinnedRef: sourceHash,\n sourceSkillName: remote.installName,\n sourceHash,\n wellKnownSourceUrl: remote.sourceUrl,\n outcome,\n mode,\n lockFormat: payload.options.lockFormat,\n });\n } finally {\n cleanupPreparedInstallerArtifacts(preparedInstaller);\n }\n }\n } finally {\n for (const cleanup of tempCleanups) {\n cleanup();\n }\n }\n\n return {\n installedPluginNames: [...payload.selectedPluginNames],\n agentCount: payload.agents.length,\n };\n }\n\n await emitProgress(\"loading source\");\n const prepared = await prepareSourceDirAsync(\n parsedSource as Exclude<ParsedSource, { type: \"well-known\" | \"catalog\" }>,\n );\n\n try {\n const sourceCanonical = canonicalSourceIdentity({ parsedSource });\n const sourcePinnedRef =\n parsedSource.type === \"github\" || parsedSource.type === \"git\"\n ? await resolveGitHeadRefAsync(prepared.basePath)\n : undefined;\n const sourceIsSymlink =\n parsedSource.type === \"local\" ? isLocalSymlinkSource(parsedSource.localPath) : undefined;\n const selected = await discoverPluginsAsync(prepared.basePath, payload.selectedPluginNames);\n if (selected.length === 0) {\n throw new Error(\"No matching plugins found in source\");\n }\n\n const sourceHashesBefore = new Map(\n selected.map((plugin) => [plugin.path, hashDirectory(plugin.path)]),\n );\n const missingInstallerPluginDirs = listSkillsMissingInstallerConfig(\n selected.map((plugin) => plugin.path),\n );\n const scaffoldFormat = resolveAddInstallerScaffoldFormat(\n payload.options,\n missingInstallerPluginDirs.length,\n );\n if (scaffoldFormat) {\n scaffoldInstallerConfigForSkills(missingInstallerPluginDirs, scaffoldFormat);\n }\n\n for (const plugin of selected) {\n const sourceResolvedPath =\n parsedSource.type === \"local\" ? resolveSafeRealPath(plugin.path) : undefined;\n\n await emitProgress(`installing ${plugin.name}`);\n const sourceSkillPath = path.relative(prepared.basePath, plugin.path) || \".\";\n const preparedInstaller = await prepareInstallerArtifacts(plugin.path, payload.cwd, {\n sourceType: parsedSource.type,\n policyMode: payload.options.policyMode || \"enforce\",\n trustWellKnown: Boolean(payload.options.trustWellKnown),\n });\n const outcome = installPlugin(plugin, payload.agents as AgentType[], {\n mode,\n globalInstall,\n cwd: payload.cwd,\n });\n\n try {\n await applyInstallerArtifacts(outcome.canonicalDir, preparedInstaller);\n writeLockEntryAfterInstall({\n globalInstall,\n cwd: payload.cwd,\n sourceInput: payload.sourceInput,\n sourceType: parsedSource.type,\n sourceCanonical,\n sourcePinnedRef,\n sourceResolvedPath,\n sourceIsSymlink,\n sourceSkillName: plugin.name,\n sourceSkillPath,\n sourceHash: sourceHashForInstalledSkill({\n parsedSource,\n skillPath: plugin.path,\n beforeHash: sourceHashesBefore.get(plugin.path),\n }),\n outcome,\n mode,\n lockFormat: payload.options.lockFormat,\n });\n } finally {\n cleanupPreparedInstallerArtifacts(preparedInstaller);\n }\n }\n\n return {\n installedPluginNames: selected.map((plugin) => plugin.name),\n agentCount: payload.agents.length,\n };\n } finally {\n if (prepared.cleanup) {\n prepared.cleanup();\n }\n }\n}\n\nasync function runFindFetchInventoryTask(\n sourceInput: string,\n options: BackgroundTaskRequest<\"find.fetchInventory\">[\"payload\"][\"options\"],\n emitProgress: ProgressReporter,\n): Promise<FindInventoryTaskResult> {\n await emitProgress(\"parsing source\");\n const parsedSource = parseSource(sourceInput);\n const sourceLabel = resolveSourceLabel(parsedSource);\n\n await emitProgress(\"fetching skill inventory\");\n if (parsedSource.type === \"well-known\" || parsedSource.type === \"catalog\") {\n if (parsedSource.type === \"catalog\") {\n assertExperimentalFeatureEnabled(\"catalog\", Boolean(options.experimental));\n }\n\n const remoteSkills =\n parsedSource.type === \"well-known\"\n ? await resolveWellKnownSkills(parsedSource.url, {\n allowHost: options.allowHost,\n denyHost: options.denyHost,\n maxDownloadBytes: options.maxDownloadBytes,\n experimental: options.experimental,\n })\n : await resolveCatalogSkills(parsedSource.url, {\n allowHost: options.allowHost,\n denyHost: options.denyHost,\n maxDownloadBytes: options.maxDownloadBytes,\n experimental: options.experimental,\n });\n return {\n sourceType: parsedSource.type,\n sourceLabel,\n skills: remoteSkills.map((item) => ({\n name: item.installName,\n description: item.description,\n })),\n };\n }\n\n const prepared = await prepareSourceDirAsync(parsedSource);\n try {\n const discovered = await discoverSkillsAsync(prepared.basePath);\n return {\n sourceType: parsedSource.type,\n sourceLabel,\n skills: discovered.map((item) => ({\n name: item.name,\n description: item.description,\n })),\n };\n } finally {\n if (prepared.cleanup) {\n prepared.cleanup();\n }\n }\n}\n\nasync function runValidateRunTask(\n options: BackgroundTaskRequest<\"validate.run\">[\"payload\"][\"options\"],\n emitProgress: ProgressReporter,\n): Promise<ValidateRunTaskResult> {\n return await runValidateAnalysis(options, emitProgress);\n}\n\nfunction runBlockingTask(\n payload: BackgroundTaskRequest<\"test.blocking\">[\"payload\"],\n): BackgroundTaskResult<\"test.blocking\"> {\n const end = Date.now() + payload.durationMs;\n while (Date.now() < end) {\n Math.sqrt(Math.random() * Number.MAX_SAFE_INTEGER);\n }\n return { durationMs: payload.durationMs };\n}\n\nexport async function executeBackgroundTask(\n request: BackgroundTaskRequest,\n emitProgress: ProgressReporter,\n): Promise<BackgroundTaskResult> {\n switch (request.kind) {\n case \"check.scan\":\n return await runCheckScanTask(request.payload.cwd, request.payload.options, emitProgress);\n case \"update.assess\":\n return await runUpdateAssessTask(request.payload.cwd, request.payload.options, emitProgress);\n case \"plugin.update.assess\":\n return await runPluginUpdateAssessTask(\n request.payload.cwd,\n request.payload.options,\n emitProgress,\n );\n case \"update.apply\":\n return await runUpdateApplyTask(request.payload, emitProgress);\n case \"plugin.update.apply\":\n return await runPluginUpdateApplyTask(request.payload, emitProgress);\n case \"update.migrate\":\n return await runUpdateMigrateTask(request.payload, emitProgress);\n case \"plugin.update.migrate\":\n return await runPluginUpdateMigrateTask(request.payload, emitProgress);\n case \"list.detectAgents\":\n return await runListDetectAgentsTask(\n request.payload.cwd,\n request.payload.options,\n emitProgress,\n );\n case \"list.scanInventory\":\n return await runListScanInventoryTask(request.payload, emitProgress);\n case \"add.fetchOrDiscover\":\n return await resolveAddSourceSkills(\n request.payload.sourceInput,\n request.payload.options,\n emitProgress,\n );\n case \"add.install\":\n return await installSelectedAddSkills(request.payload, emitProgress);\n case \"plugin.add.fetchOrDiscover\":\n return await resolveAddSourcePlugins(\n request.payload.sourceInput,\n request.payload.options,\n emitProgress,\n );\n case \"plugin.add.install\":\n return await installSelectedAddPlugins(request.payload, emitProgress);\n case \"find.fetchInventory\":\n return await runFindFetchInventoryTask(\n request.payload.sourceInput,\n request.payload.options,\n emitProgress,\n );\n case \"validate.run\":\n return await runValidateRunTask(request.payload.options, emitProgress);\n case \"test.blocking\":\n if (request.payload.progressLabel) {\n await emitProgress(request.payload.progressLabel);\n }\n return runBlockingTask(request.payload);\n default:\n throw new Error(`Unsupported background task: ${String(request)}`);\n }\n}\n", "import fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport type { AgentInfo, AgentType } from \"../contracts/runtime-types\";\n\nexport type ScopeAgentSelectionEntry = {\n agent: AgentType;\n label: string;\n skillsDir: string;\n};\n\nexport type SelectionRow = {\n id: string;\n label: string;\n description?: string;\n};\n\nexport const STANDARD_AGENTS = {\n universal: {\n displayName: \"Universal\",\n projectSkillsDir: \".agents/skills\",\n globalSkillsDir: \".agents/skills\",\n projectPluginsDir: \".agents/plugins/cache\",\n globalPluginsDir: \".agents/plugins/cache\",\n installMarkers: [\".agents\"],\n },\n adal: {\n displayName: \"AdaL\",\n projectSkillsDir: \".adal/skills\",\n globalSkillsDir: \".adal/skills\",\n projectPluginsDir: \".adal/plugins/cache\",\n globalPluginsDir: \".adal/plugins/cache\",\n installMarkers: [\".adal\"],\n },\n antigravity: {\n displayName: \"Antigravity\",\n projectSkillsDir: \".agent/skills\",\n globalSkillsDir: \".gemini/antigravity/skills\",\n projectPluginsDir: \".agent/plugins/cache\",\n globalPluginsDir: \".gemini/antigravity/plugins/cache\",\n installMarkers: [\".gemini/antigravity\"],\n },\n augment: {\n displayName: \"Augment\",\n projectSkillsDir: \".augment/skills\",\n globalSkillsDir: \".augment/skills\",\n projectPluginsDir: \".augment/plugins/cache\",\n globalPluginsDir: \".augment/plugins/cache\",\n installMarkers: [\".augment\"],\n },\n \"claude-code\": {\n displayName: \"Claude Code\",\n projectSkillsDir: \".claude/skills\",\n globalSkillsDir: \".claude/skills\",\n projectPluginsDir: \".claude/plugins/cache\",\n globalPluginsDir: \".claude/plugins/cache\",\n installMarkers: [\".claude\"],\n },\n \"cortex-code\": {\n displayName: \"Cortex Code\",\n projectSkillsDir: \".cortex/skills\",\n globalSkillsDir: \".cortex/skills\",\n projectPluginsDir: \".cortex/plugins/cache\",\n globalPluginsDir: \".cortex/plugins/cache\",\n installMarkers: [\".cortex\"],\n },\n crush: {\n displayName: \"Crush\",\n projectSkillsDir: \".crush/skills\",\n globalSkillsDir: \".crush/skills\",\n projectPluginsDir: \".crush/plugins/cache\",\n globalPluginsDir: \".crush/plugins/cache\",\n installMarkers: [\".crush\"],\n },\n droid: {\n displayName: \"Droid\",\n projectSkillsDir: \".factory/skills\",\n globalSkillsDir: \".factory/skills\",\n projectPluginsDir: \".factory/plugins/cache\",\n globalPluginsDir: \".factory/plugins/cache\",\n installMarkers: [\".factory\"],\n },\n goose: {\n displayName: \"Goose\",\n projectSkillsDir: \".goose/skills\",\n globalSkillsDir: \".config/goose/skills\",\n projectPluginsDir: \".goose/plugins/cache\",\n globalPluginsDir: \".config/goose/plugins/cache\",\n installMarkers: [\".config/goose\"],\n },\n \"iflow-cli\": {\n displayName: \"iFlow CLI\",\n projectSkillsDir: \".iflow/skills\",\n globalSkillsDir: \".iflow/skills\",\n projectPluginsDir: \".iflow/plugins/cache\",\n globalPluginsDir: \".iflow/plugins/cache\",\n installMarkers: [\".iflow\"],\n },\n junie: {\n displayName: \"Junie\",\n projectSkillsDir: \".junie/skills\",\n globalSkillsDir: \".junie/skills\",\n projectPluginsDir: \".junie/plugins/cache\",\n globalPluginsDir: \".junie/plugins/cache\",\n installMarkers: [\".junie\"],\n },\n \"kiro-cli\": {\n displayName: \"Kiro CLI\",\n projectSkillsDir: \".kiro/skills\",\n globalSkillsDir: \".kiro/skills\",\n projectPluginsDir: \".kiro/plugins/cache\",\n globalPluginsDir: \".kiro/plugins/cache\",\n installMarkers: [\".kiro\"],\n },\n kode: {\n displayName: \"Kode\",\n projectSkillsDir: \".kode/skills\",\n globalSkillsDir: \".kode/skills\",\n projectPluginsDir: \".kode/plugins/cache\",\n globalPluginsDir: \".kode/plugins/cache\",\n installMarkers: [\".kode\"],\n },\n openclaw: {\n displayName: \"OpenClaw\",\n projectSkillsDir: \"skills\",\n globalSkillsDir: \".openclaw/skills\",\n projectPluginsDir: \"plugins/cache\",\n globalPluginsDir: \".openclaw/plugins/cache\",\n installMarkers: [\".openclaw\"],\n },\n openhands: {\n displayName: \"OpenHands\",\n projectSkillsDir: \".openhands/skills\",\n globalSkillsDir: \".openhands/skills\",\n projectPluginsDir: \".openhands/plugins/cache\",\n globalPluginsDir: \".openhands/plugins/cache\",\n installMarkers: [\".openhands\"],\n },\n \"mistral-vibe\": {\n displayName: \"Mistral Vibe\",\n projectSkillsDir: \".vibe/skills\",\n globalSkillsDir: \".vibe/skills\",\n projectPluginsDir: \".vibe/plugins/cache\",\n globalPluginsDir: \".vibe/plugins/cache\",\n installMarkers: [\".vibe\"],\n },\n neovate: {\n displayName: \"Neovate\",\n projectSkillsDir: \".neovate/skills\",\n globalSkillsDir: \".neovate/skills\",\n projectPluginsDir: \".neovate/plugins/cache\",\n globalPluginsDir: \".neovate/plugins/cache\",\n installMarkers: [\".neovate\"],\n },\n pochi: {\n displayName: \"Pochi\",\n projectSkillsDir: \".pochi/skills\",\n globalSkillsDir: \".pochi/skills\",\n projectPluginsDir: \".pochi/plugins/cache\",\n globalPluginsDir: \".pochi/plugins/cache\",\n installMarkers: [\".pochi\"],\n },\n qoder: {\n displayName: \"Qoder\",\n projectSkillsDir: \".qoder/skills\",\n globalSkillsDir: \".qoder/skills\",\n projectPluginsDir: \".qoder/plugins/cache\",\n globalPluginsDir: \".qoder/plugins/cache\",\n installMarkers: [\".qoder\"],\n },\n \"qwen-code\": {\n displayName: \"Qwen Code\",\n projectSkillsDir: \".qwen/skills\",\n globalSkillsDir: \".qwen/skills\",\n projectPluginsDir: \".qwen/plugins/cache\",\n globalPluginsDir: \".qwen/plugins/cache\",\n installMarkers: [\".qwen\"],\n },\n roo: {\n displayName: \"Roo Code\",\n projectSkillsDir: \".roo/skills\",\n globalSkillsDir: \".roo/skills\",\n projectPluginsDir: \".roo/plugins/cache\",\n globalPluginsDir: \".roo/plugins/cache\",\n installMarkers: [\".roo\"],\n },\n trae: {\n displayName: \"Trae\",\n projectSkillsDir: \".trae/skills\",\n globalSkillsDir: \".trae/skills\",\n projectPluginsDir: \".trae/plugins/cache\",\n globalPluginsDir: \".trae/plugins/cache\",\n installMarkers: [\".trae\"],\n },\n \"trae-cn\": {\n displayName: \"Trae CN\",\n projectSkillsDir: \".trae/skills\",\n globalSkillsDir: \".trae/skills\",\n projectPluginsDir: \".trae/plugins/cache\",\n globalPluginsDir: \".trae/plugins/cache\",\n installMarkers: [\".trae\"],\n },\n windsurf: {\n displayName: \"Windsurf\",\n projectSkillsDir: \".windsurf/skills\",\n globalSkillsDir: \".codeium/windsurf/skills\",\n projectPluginsDir: \".windsurf/plugins/cache\",\n globalPluginsDir: \".codeium/windsurf/plugins/cache\",\n installMarkers: [\".windsurf\", \".codeium/windsurf\"],\n },\n zencoder: {\n displayName: \"Zencoder\",\n projectSkillsDir: \".zencoder/skills\",\n globalSkillsDir: \".zencoder/skills\",\n projectPluginsDir: \".zencoder/plugins/cache\",\n globalPluginsDir: \".zencoder/plugins/cache\",\n installMarkers: [\".zencoder\"],\n },\n continue: {\n displayName: \"Continue\",\n projectSkillsDir: \".continue/skills\",\n globalSkillsDir: \".continue/skills\",\n projectPluginsDir: \".continue/plugins/cache\",\n globalPluginsDir: \".continue/plugins/cache\",\n installMarkers: [\".continue\"],\n },\n codebuddy: {\n displayName: \"CodeBuddy\",\n projectSkillsDir: \".codebuddy/skills\",\n globalSkillsDir: \".codebuddy/skills\",\n projectPluginsDir: \".codebuddy/plugins/cache\",\n globalPluginsDir: \".codebuddy/plugins/cache\",\n installMarkers: [\".codebuddy\"],\n },\n \"command-code\": {\n displayName: \"Command Code\",\n projectSkillsDir: \".commandcode/skills\",\n globalSkillsDir: \".commandcode/skills\",\n projectPluginsDir: \".commandcode/plugins/cache\",\n globalPluginsDir: \".commandcode/plugins/cache\",\n installMarkers: [\".commandcode\"],\n },\n kilo: {\n displayName: \"Kilo Code\",\n projectSkillsDir: \".kilocode/skills\",\n globalSkillsDir: \".kilocode/skills\",\n projectPluginsDir: \".kilocode/plugins/cache\",\n globalPluginsDir: \".kilocode/plugins/cache\",\n installMarkers: [\".kilocode\"],\n },\n mcpjam: {\n displayName: \"MCPJam\",\n projectSkillsDir: \".mcpjam/skills\",\n globalSkillsDir: \".mcpjam/skills\",\n projectPluginsDir: \".mcpjam/plugins/cache\",\n globalPluginsDir: \".mcpjam/plugins/cache\",\n installMarkers: [\".mcpjam\"],\n },\n mux: {\n displayName: \"Mux\",\n projectSkillsDir: \".mux/skills\",\n globalSkillsDir: \".mux/skills\",\n projectPluginsDir: \".mux/plugins/cache\",\n globalPluginsDir: \".mux/plugins/cache\",\n installMarkers: [\".mux\"],\n },\n pi: {\n displayName: \"Pi\",\n projectSkillsDir: \".pi/skills\",\n globalSkillsDir: \".pi/agent/skills\",\n projectPluginsDir: \".pi/plugins/cache\",\n globalPluginsDir: \".pi/agent/plugins/cache\",\n installMarkers: [\".pi\"],\n },\n replit: {\n displayName: \"Replit\",\n projectSkillsDir: \".agents/skills\",\n globalSkillsDir: \".config/agents/skills\",\n projectPluginsDir: \".agents/plugins/cache\",\n globalPluginsDir: \".config/agents/plugins/cache\",\n installMarkers: [\".config/agents\"],\n },\n};\n\nexport const AGENTS: Record<AgentType, AgentInfo> = {\n ...STANDARD_AGENTS,\n codex: {\n displayName: \"Codex\",\n projectSkillsDir: \".agents/skills\",\n globalSkillsDir: \".codex/skills\",\n projectPluginsDir: \".agents/plugins/cache\",\n globalPluginsDir: \".codex/plugins/cache\",\n installMarkers: [\".codex\"],\n },\n cursor: {\n displayName: \"Cursor\",\n projectSkillsDir: \".agents/skills\",\n globalSkillsDir: \".cursor/skills\",\n projectPluginsDir: \".agents/plugins/cache\",\n globalPluginsDir: \".cursor/plugins/cache\",\n installMarkers: [\".cursor\"],\n },\n \"gemini-cli\": {\n displayName: \"Gemini CLI\",\n projectSkillsDir: \".agents/skills\",\n globalSkillsDir: \".gemini/skills\",\n projectPluginsDir: \".agents/plugins/cache\",\n globalPluginsDir: \".gemini/plugins/cache\",\n installMarkers: [\".gemini\"],\n },\n \"github-copilot\": {\n displayName: \"GitHub Copilot\",\n projectSkillsDir: \".agents/skills\",\n globalSkillsDir: \".copilot/skills\",\n projectPluginsDir: \".agents/plugins/cache\",\n globalPluginsDir: \".copilot/plugins/cache\",\n installMarkers: [\".copilot\"],\n },\n amp: {\n displayName: \"Amp\",\n projectSkillsDir: \".agents/skills\",\n globalSkillsDir: \".config/agents/skills\",\n projectPluginsDir: \".agents/plugins/cache\",\n globalPluginsDir: \".config/agents/plugins/cache\",\n installMarkers: [\".config/agents\"],\n },\n opencode: {\n displayName: \"OpenCode\",\n projectSkillsDir: \".agents/skills\",\n globalSkillsDir: \".config/opencode/skills\",\n projectPluginsDir: \".agents/plugins/cache\",\n globalPluginsDir: \".config/opencode/plugins/cache\",\n installMarkers: [\".config/opencode\"],\n },\n windsurf: {\n displayName: \"Windsurf\",\n projectSkillsDir: \".windsurf/skills\",\n globalSkillsDir: \".codeium/windsurf/skills\",\n projectPluginsDir: \".windsurf/plugins/cache\",\n globalPluginsDir: \".codeium/windsurf/plugins/cache\",\n installMarkers: [\".windsurf\", \".codeium/windsurf\"],\n },\n cline: {\n displayName: \"Cline\",\n projectSkillsDir: \".cline/skills\",\n globalSkillsDir: \".cline/skills\",\n projectPluginsDir: \".cline/plugins/cache\",\n globalPluginsDir: \".cline/plugins/cache\",\n installMarkers: [\".cline\"],\n },\n};\n\nexport const ALL_AGENTS = Object.keys(AGENTS) as AgentType[];\n\nexport function isAgent(value: string): value is AgentType {\n return Object.prototype.hasOwnProperty.call(AGENTS, value);\n}\n\nexport function resolveAddAgentSelectionRows(scope: \"local\" | \"global\"): SelectionRow[] {\n const dataset =\n scope === \"global\"\n ? Object.entries(AGENTS).map(([agent, info]) => ({\n agent: agent as AgentType,\n label: `${info.displayName} (global)`,\n skillsDir: info.globalSkillsDir,\n }))\n : Object.entries(STANDARD_AGENTS).map(([agent, info]) => ({\n agent: agent as AgentType,\n label: info.displayName,\n skillsDir: info.projectSkillsDir,\n }));\n\n return dataset.map((entry) => ({\n id: entry.agent,\n label: entry.label,\n description: entry.skillsDir,\n }));\n}\n\nexport function resolveAgents(input: string[] | undefined): AgentType[] {\n if (!input || input.length === 0) {\n const detected = detectInstalledAgents();\n return detected.length > 0 ? detected : [\"opencode\", \"codex\"];\n }\n\n if (input.includes(\"*\")) {\n const detected = detectInstalledAgents();\n return detected.length > 0 ? detected : ALL_AGENTS;\n }\n\n const out: AgentType[] = [];\n for (const value of input) {\n if (!isAgent(value)) {\n throw new Error(`Unknown agent: ${value}`);\n }\n if (!out.includes(value)) {\n out.push(value);\n }\n }\n return out;\n}\n\nexport function normalizeAgentSelectionInput(\n values: string[] | undefined,\n cwd: string = process.cwd(),\n): string[] | undefined {\n if (!values || values.length === 0) {\n return values;\n }\n\n if (values.includes(\"*\")) {\n return [\"*\"];\n }\n\n const valid = values.filter((value) => isAgent(value));\n const unknown = values.filter((value) => !isAgent(value));\n if (unknown.length === 0) {\n return values;\n }\n\n // If all unknown values are filesystem entries, this is likely shell\n // expansion from an unquoted `*`.\n const expandedFromGlob = unknown.every((value) => fs.existsSync(path.resolve(cwd, value)));\n if (!expandedFromGlob) {\n return values;\n }\n\n if (valid.length > 0) {\n return valid;\n }\n return [\"*\"];\n}\n\nexport function getAgentSkillsDir(agent: AgentType, globalInstall: boolean, cwd: string): string {\n const relative = globalInstall ? AGENTS[agent].globalSkillsDir : AGENTS[agent].projectSkillsDir;\n const base = globalInstall ? os.homedir() : cwd;\n return path.join(base, relative);\n}\n\nexport function getAgentPluginsDir(agent: AgentType, globalInstall: boolean, cwd: string): string {\n const relative = globalInstall ? AGENTS[agent].globalPluginsDir : AGENTS[agent].projectPluginsDir;\n const base = globalInstall ? os.homedir() : cwd;\n return path.join(base, relative);\n}\n\nexport function resolveAddPluginAgentSelectionRows(scope: \"local\" | \"global\"): SelectionRow[] {\n const dataset =\n scope === \"global\"\n ? Object.entries(AGENTS).map(([agent, info]) => ({\n agent: agent as AgentType,\n label: `${info.displayName} (global)`,\n pluginsDir: info.globalPluginsDir,\n }))\n : Object.entries(AGENTS).map(([agent, info]) => ({\n agent: agent as AgentType,\n label: info.displayName,\n pluginsDir: info.projectPluginsDir,\n }));\n\n return dataset.map((entry) => ({\n id: entry.agent,\n label: entry.label,\n description: entry.pluginsDir,\n }));\n}\n\nexport function detectInstalledAgents(cwd: string = process.cwd()): AgentType[] {\n const found: AgentType[] = [];\n for (const agent of Object.keys(AGENTS) as AgentType[]) {\n if (isAgentInstalled(agent, cwd)) {\n found.push(agent);\n }\n }\n return found;\n}\n\nexport function filterInstalledAgents(\n agents: AgentType[],\n cwd: string = process.cwd(),\n): AgentType[] {\n return agents.filter((agent) => isAgentInstalled(agent, cwd));\n}\n\nfunction isAgentInstalled(agent: AgentType, cwd: string): boolean {\n const info = AGENTS[agent];\n const home = os.homedir();\n\n if (info.installMarkers) {\n for (const marker of info.installMarkers) {\n if (fs.existsSync(path.join(home, marker))) {\n return true;\n }\n }\n }\n\n const projectSkillsDir = getAgentSkillsDir(agent, false, cwd);\n if (info.projectSkillsDir !== \".agents/skills\" && fs.existsSync(projectSkillsDir)) {\n return true;\n }\n\n const globalSkillsDir = getAgentSkillsDir(agent, true, cwd);\n if (\n info.globalSkillsDir !== \".config/agents/skills\" &&\n info.globalSkillsDir !== \".agents/skills\" &&\n fs.existsSync(globalSkillsDir)\n ) {\n return true;\n }\n\n return false;\n}\n", "import fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { AddOptions, ParsedSource, Skill } from \"../contracts/runtime-types\";\nimport type { DriftRecord } from \"../contracts/results\";\nimport type { RemoteSkill } from \"../providers\";\nimport type { SourceCandidate } from \"../sources/source-resolution\";\nimport { discoverSkillsAsync, stageRemoteSkillFilesToTempDir } from \"../sources/skills\";\nimport { resolveCatalogSkills, resolveWellKnownSkills } from \"../sources/source-resolution\";\nimport { parseSource } from \"../sources/source-parser\";\nimport { prepareSourceDirAsync, resolveGitHeadRefAsync } from \"../sources/git\";\nimport { hashDirectoryAsync } from \"./hash\";\nimport {\n buildSourceLoadCacheKey,\n listCanonicalSkillDirs,\n readLockfile,\n resolveSourceLoadInput,\n type LockEntry,\n} from \"./lockfile\";\n\nexport type SkillAssessment = {\n entry: LockEntry;\n drift: DriftRecord[];\n sourceHash?: string;\n resolved?: SourceCandidate;\n refreshedSource?: {\n canonical?: string;\n pinnedRef?: string;\n resolvedPath?: string;\n isSymlinkSource?: boolean;\n sourceSkillPath?: string;\n wellKnownSourceUrl?: string;\n };\n};\n\nexport type CheckOptions = {\n global?: boolean;\n skill?: string[];\n allowHost?: string[];\n denyHost?: string[];\n maxDownloadBytes?: number;\n policyMode?: \"enforce\" | \"warn\";\n experimental?: boolean;\n};\n\nfunction includeBySkill(entry: LockEntry, selected?: string[]): boolean {\n if (!selected || selected.length === 0 || selected.includes(\"*\")) {\n return true;\n }\n return selected.includes(entry.skillName);\n}\n\ntype CachedPreparedSource = {\n kind: \"prepared\";\n basePath: string;\n skills: Skill[];\n cleanupNow: () => void;\n retainCleanup: () => () => void;\n};\n\ntype CachedRemoteSource = {\n kind: \"remote\";\n remoteSkills: RemoteSkill[];\n};\n\ntype CachedSource = CachedPreparedSource | CachedRemoteSource;\n\ntype AsyncResult<T> = { ok: true; value: T } | { ok: false; error: unknown };\n\nfunction migrateHint(skillName: string): string {\n return `skillspp update ${skillName} --migrate <new-skill-source>`;\n}\n\nfunction resolveSourceMetadataIssue(entry: LockEntry): string | null {\n if (!entry.source.canonical) {\n return `source canonical metadata missing; run ${migrateHint(entry.skillName)}`;\n }\n\n if (entry.source.type === \"local\") {\n if (!entry.source.resolvedPath) {\n return `local source metadata missing; run ${migrateHint(entry.skillName)}`;\n }\n if (!fs.existsSync(entry.source.canonical)) {\n return `local source path not found; run ${migrateHint(entry.skillName)}`;\n }\n return null;\n }\n\n if (!entry.source.pinnedRef) {\n return `remote pin metadata missing; run ${migrateHint(entry.skillName)}`;\n }\n return null;\n}\n\nfunction createRetainedCleanup(cleanup?: () => void): {\n cleanupNow: () => void;\n retainCleanup: () => () => void;\n} {\n let cleaned = false;\n let refCount = 0;\n\n const runCleanup = () => {\n if (cleaned) {\n return;\n }\n cleaned = true;\n cleanup?.();\n };\n\n const cleanupNow = () => {\n if (refCount === 0) {\n runCleanup();\n }\n };\n\n const retainCleanup = () => {\n refCount += 1;\n let released = false;\n return () => {\n if (released) {\n return;\n }\n released = true;\n refCount -= 1;\n if (refCount === 0) {\n runCleanup();\n }\n };\n };\n\n return {\n cleanupNow,\n retainCleanup,\n };\n}\n\nfunction toAsyncResult<T>(promise: Promise<T>): Promise<AsyncResult<T>> {\n return promise.then(\n (value) => ({ ok: true as const, value }),\n (error) => ({ ok: false as const, error }),\n );\n}\n\nfunction unwrapAsyncResult<T>(result: AsyncResult<T>): T {\n if (result.ok) {\n return result.value;\n }\n throw (result as { ok: false; error: unknown }).error;\n}\n\nasync function loadCachedSource(entry: LockEntry, options: AddOptions): Promise<CachedSource> {\n const sourceInput = resolveSourceLoadInput(entry.source);\n const parsed = parseSource(sourceInput);\n\n if (parsed.type === \"well-known\" || parsed.type === \"catalog\") {\n const remoteSkills =\n parsed.type === \"well-known\"\n ? await resolveWellKnownSkills(parsed.url, options)\n : await resolveCatalogSkills(parsed.url, options);\n return {\n kind: \"remote\",\n remoteSkills,\n };\n }\n\n const prepared = await prepareSourceDirAsync(\n parsed as Exclude<ParsedSource, { type: \"well-known\" | \"catalog\" }>,\n );\n const retainedCleanup = createRetainedCleanup(prepared.cleanup);\n try {\n const skills = await discoverSkillsAsync(prepared.basePath);\n return {\n kind: \"prepared\",\n basePath: prepared.basePath,\n skills,\n cleanupNow: retainedCleanup.cleanupNow,\n retainCleanup: retainedCleanup.retainCleanup,\n };\n } catch (error) {\n retainedCleanup.cleanupNow();\n throw error;\n }\n}\n\nfunction resolveSafeRealPath(inputPath: string): string {\n try {\n return fs.realpathSync(inputPath);\n } catch {\n return path.resolve(inputPath);\n }\n}\n\nfunction isLocalSymlinkSource(localPath: string): boolean {\n try {\n if (!fs.existsSync(localPath)) {\n return false;\n }\n return fs.lstatSync(localPath).isSymbolicLink();\n } catch {\n return false;\n }\n}\n\nasync function buildRefreshedSourceMetadata(\n entry: LockEntry,\n resolved: SourceCandidate,\n cachedSource: CachedSource,\n sourceHash: string,\n): Promise<NonNullable<SkillAssessment[\"refreshedSource\"]>> {\n if (entry.source.type === \"local\") {\n const canonical = entry.source.canonical || entry.source.input;\n return {\n canonical,\n resolvedPath: resolveSafeRealPath(resolved.skill.path),\n isSymlinkSource: isLocalSymlinkSource(canonical),\n sourceSkillPath: resolved.sourceSkillPath,\n };\n }\n\n if (entry.source.type === \"git\" || entry.source.type === \"github\") {\n const nextPinnedRef =\n cachedSource.kind === \"prepared\"\n ? await resolveGitHeadRefAsync(cachedSource.basePath)\n : entry.source.pinnedRef;\n return {\n canonical: entry.source.canonical,\n pinnedRef: nextPinnedRef,\n sourceSkillPath: resolved.sourceSkillPath,\n };\n }\n\n const canonical = resolved.wellKnownSourceUrl || entry.source.canonical;\n return {\n canonical,\n pinnedRef: sourceHash,\n wellKnownSourceUrl: resolved.wellKnownSourceUrl,\n };\n}\n\nfunction resolveCandidateFromCachedSource(\n entry: LockEntry,\n cachedSource: CachedSource,\n keepResolved: boolean,\n): SourceCandidate {\n if (cachedSource.kind === \"remote\") {\n const matched = cachedSource.remoteSkills.find(\n (item) => item.installName === entry.source.selector.skillName,\n );\n if (!matched) {\n throw new Error(`Skill '${entry.source.selector.skillName}' not found in well-known source`);\n }\n\n const staged = stageRemoteSkillFilesToTempDir(matched.files);\n return {\n skill: {\n name: matched.installName,\n description: matched.description,\n path: staged.path,\n },\n wellKnownSourceUrl: matched.sourceUrl,\n cleanup: staged.cleanup,\n };\n }\n\n const matched = entry.source.selector.relativePath\n ? cachedSource.skills.find(\n (item) =>\n path.resolve(item.path) ===\n path.resolve(path.join(cachedSource.basePath, entry.source.selector.relativePath!)),\n )\n : cachedSource.skills.find((item) => item.name === entry.source.selector.skillName);\n\n if (!matched) {\n throw new Error(`Skill '${entry.source.selector.skillName}' not found in source`);\n }\n\n return {\n skill: matched,\n sourceSkillPath: path.relative(cachedSource.basePath, matched.path) || \".\",\n cleanup: keepResolved ? cachedSource.retainCleanup() : undefined,\n };\n}\n\nexport async function assessLockEntries(\n options: CheckOptions,\n cwd: string,\n behavior: { keepResolved: boolean } = { keepResolved: false },\n): Promise<{\n drift: DriftRecord[];\n checked: number;\n assessments: SkillAssessment[];\n}> {\n const lock = readLockfile(Boolean(options.global), cwd);\n const entries = lock.entries.filter((entry) => includeBySkill(entry, options.skill));\n const drift: DriftRecord[] = [];\n const assessments: SkillAssessment[] = [];\n const sourceOptions: AddOptions = {\n global: options.global,\n allowHost: options.allowHost,\n denyHost: options.denyHost,\n maxDownloadBytes: options.maxDownloadBytes,\n policyMode: options.policyMode,\n experimental: options.experimental,\n };\n const sourceCache = new Map<string, Promise<CachedSource>>();\n\n const getCachedSource = (entry: LockEntry): Promise<CachedSource> => {\n const key = buildSourceLoadCacheKey(entry.source);\n const existing = sourceCache.get(key);\n if (existing) {\n return existing;\n }\n\n const created = loadCachedSource(entry, sourceOptions);\n sourceCache.set(key, created);\n return created;\n };\n\n try {\n for (const entry of entries) {\n const assessment: SkillAssessment = {\n entry,\n drift: [],\n };\n\n if (!fs.existsSync(entry.canonicalDir) || !fs.statSync(entry.canonicalDir).isDirectory()) {\n const row: DriftRecord = {\n skillName: entry.skillName,\n kind: \"local-modified\",\n detail: \"canonical directory is missing\",\n };\n drift.push(row);\n assessment.drift.push(row);\n assessments.push(assessment);\n continue;\n }\n\n const installedHash = unwrapAsyncResult(\n await toAsyncResult(hashDirectoryAsync(entry.canonicalDir)),\n );\n if (installedHash !== entry.installedHash) {\n const row: DriftRecord = {\n skillName: entry.skillName,\n kind: \"local-modified\",\n detail: \"installed content differs from lockfile hash\",\n };\n drift.push(row);\n assessment.drift.push(row);\n }\n\n const metadataIssue = resolveSourceMetadataIssue(entry);\n if (metadataIssue) {\n const row: DriftRecord = {\n skillName: entry.skillName,\n kind: \"migrate-required\",\n detail: metadataIssue,\n };\n drift.push(row);\n assessment.drift.push(row);\n assessments.push(assessment);\n continue;\n }\n\n let resolved: SourceCandidate | undefined;\n try {\n const cachedSource = unwrapAsyncResult(await toAsyncResult(getCachedSource(entry)));\n resolved = resolveCandidateFromCachedSource(entry, cachedSource, behavior.keepResolved);\n\n if (entry.source.type === \"local\") {\n const currentResolvedPath = fs.realpathSync(resolved.skill.path);\n if (currentResolvedPath !== path.resolve(entry.source.resolvedPath!)) {\n const row: DriftRecord = {\n skillName: entry.skillName,\n kind: \"migrate-required\",\n detail: `local source identity changed; run ${migrateHint(entry.skillName)}`,\n };\n drift.push(row);\n assessment.drift.push(row);\n if (resolved.cleanup && !behavior.keepResolved) {\n resolved.cleanup();\n resolved = undefined;\n }\n assessments.push(assessment);\n continue;\n }\n }\n\n const sourceHash = await hashDirectoryAsync(resolved.skill.path);\n assessment.sourceHash = sourceHash;\n assessment.refreshedSource = await buildRefreshedSourceMetadata(\n entry,\n resolved,\n cachedSource,\n sourceHash,\n );\n if (sourceHash !== entry.sourceHash) {\n const row: DriftRecord = {\n skillName: entry.skillName,\n kind: \"changed-source\",\n detail: \"source hash changed\",\n };\n drift.push(row);\n assessment.drift.push(row);\n }\n\n if (behavior.keepResolved) {\n assessment.resolved = resolved;\n }\n } catch (error) {\n const asText = error instanceof Error ? error.message : String(error);\n const migrateRequired =\n entry.source.type === \"local\" &&\n (asText.includes(\"Local source not found\") || asText.includes(\"not found in source\"));\n const row: DriftRecord = {\n skillName: entry.skillName,\n kind: migrateRequired ? \"migrate-required\" : \"missing-source\",\n detail: migrateRequired\n ? `local source identity changed; run ${migrateHint(entry.skillName)}`\n : asText,\n };\n drift.push(row);\n assessment.drift.push(row);\n } finally {\n if (resolved?.cleanup && !behavior.keepResolved) {\n resolved.cleanup();\n }\n }\n\n assessments.push(assessment);\n }\n\n const canonical = listCanonicalSkillDirs(Boolean(options.global), cwd);\n const lockNames = new Set(lock.entries.map((item) => item.skillName));\n for (const skillName of canonical) {\n if (!lockNames.has(skillName) && includeBySkill({ skillName } as LockEntry, options.skill)) {\n drift.push({\n skillName,\n kind: \"lock-missing\",\n detail: \"installed skill is not tracked in lockfile\",\n });\n }\n }\n\n return { drift, checked: entries.length, assessments };\n } finally {\n if (!behavior.keepResolved) {\n for (const cachedSourcePromise of sourceCache.values()) {\n const cachedSource = await cachedSourcePromise.catch(() => null);\n if (cachedSource?.kind === \"prepared\") {\n cachedSource.cleanupNow();\n }\n }\n }\n }\n}\n\nexport async function collectDrift(\n options: CheckOptions,\n cwd: string,\n): Promise<{ drift: DriftRecord[]; checked: number }> {\n const assessed = await assessLockEntries(options, cwd, {\n keepResolved: false,\n });\n return { drift: assessed.drift, checked: assessed.checked };\n}\n", "import fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport matter from \"gray-matter\";\nimport type { Skill, ParsedSource } from \"../contracts/runtime-types\";\n\nconst SKIP_DIRS = new Set([\".git\", \"node_modules\", \"dist\", \"build\", \"__pycache__\"]);\n\nexport function resolveSourceLabel(parsedSource: ParsedSource): string {\n switch (parsedSource.type) {\n case \"local\":\n return parsedSource.localPath;\n case \"github\":\n case \"git\":\n return parsedSource.repoUrl;\n case \"well-known\":\n case \"catalog\":\n return parsedSource.url;\n default:\n return \"\";\n }\n}\n\nexport type RemoteStagingResult = {\n path: string;\n cleanup: () => void;\n};\n\nexport function stageRemoteSkillFilesToTempDir(\n files: Map<string, string>,\n options?: { prefix?: string },\n): RemoteStagingResult {\n const tmp = fs.mkdtempSync(path.join(os.tmpdir(), options?.prefix || \"skillspp-remote-\"));\n\n try {\n for (const [relativePath, content] of files.entries()) {\n const resolved = path.resolve(tmp, relativePath);\n const rel = path.relative(tmp, resolved);\n if (!rel || rel.startsWith(\"..\") || path.isAbsolute(rel)) {\n throw new Error(`Unsafe remote skill file path: ${relativePath}`);\n }\n\n fs.mkdirSync(path.dirname(resolved), { recursive: true });\n fs.writeFileSync(resolved, content, \"utf8\");\n }\n } catch (error) {\n fs.rmSync(tmp, { recursive: true, force: true });\n throw error;\n }\n\n return {\n path: tmp,\n cleanup: () => fs.rmSync(tmp, { recursive: true, force: true }),\n };\n}\n\nfunction hasSkillMd(dir: string): boolean {\n const skillPath = path.join(dir, \"SKILL.md\");\n return fs.existsSync(skillPath) && fs.statSync(skillPath).isFile();\n}\n\nasync function hasSkillMdAsync(dir: string): Promise<boolean> {\n const skillPath = path.join(dir, \"SKILL.md\");\n try {\n const stat = await fs.promises.stat(skillPath);\n return stat.isFile();\n } catch {\n return false;\n }\n}\n\nfunction parseSkillMd(skillMdPath: string): Skill | null {\n try {\n const raw = fs.readFileSync(skillMdPath, \"utf8\");\n const { data } = matter(raw);\n if (typeof data.name !== \"string\" || typeof data.description !== \"string\") {\n return null;\n }\n return {\n name: data.name,\n description: data.description,\n path: path.dirname(skillMdPath),\n };\n } catch {\n return null;\n }\n}\n\nasync function parseSkillMdAsync(skillMdPath: string): Promise<Skill | null> {\n try {\n const raw = await fs.promises.readFile(skillMdPath, \"utf8\");\n const { data } = matter(raw);\n if (typeof data.name !== \"string\" || typeof data.description !== \"string\") {\n return null;\n }\n return {\n name: data.name,\n description: data.description,\n path: path.dirname(skillMdPath),\n };\n } catch {\n return null;\n }\n}\n\nfunction findSkillDirsRecursive(dir: string, depth: number, maxDepth: number, out: string[]): void {\n if (depth > maxDepth) {\n return;\n }\n\n if (!fs.existsSync(dir) || !fs.statSync(dir).isDirectory()) {\n return;\n }\n\n if (hasSkillMd(dir)) {\n out.push(dir);\n }\n\n for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {\n if (!entry.isDirectory() || SKIP_DIRS.has(entry.name)) {\n continue;\n }\n findSkillDirsRecursive(path.join(dir, entry.name), depth + 1, maxDepth, out);\n }\n}\n\nasync function findSkillDirsRecursiveAsync(\n dir: string,\n depth: number,\n maxDepth: number,\n out: string[],\n): Promise<void> {\n if (depth > maxDepth) {\n return;\n }\n\n try {\n const stat = await fs.promises.stat(dir);\n if (!stat.isDirectory()) {\n return;\n }\n } catch {\n return;\n }\n\n if (await hasSkillMdAsync(dir)) {\n out.push(dir);\n }\n\n let entries: fs.Dirent[] = [];\n try {\n entries = await fs.promises.readdir(dir, { withFileTypes: true });\n } catch {\n return;\n }\n\n for (const entry of entries) {\n if (!entry.isDirectory() || SKIP_DIRS.has(entry.name)) {\n continue;\n }\n await findSkillDirsRecursiveAsync(path.join(dir, entry.name), depth + 1, maxDepth, out);\n }\n}\n\nexport function discoverSkills(basePath: string): Skill[] {\n const dirsToSearch = [\n basePath,\n path.join(basePath, \"skills\"),\n path.join(basePath, \"skills\", \".curated\"),\n path.join(basePath, \"skills\", \".experimental\"),\n path.join(basePath, \"skills\", \".system\"),\n path.join(basePath, \".agents\", \"skills\"),\n path.join(basePath, \".agent\", \"skills\"),\n ];\n\n const skillDirs: string[] = [];\n for (const dir of dirsToSearch) {\n if (!fs.existsSync(dir) || !fs.statSync(dir).isDirectory()) {\n continue;\n }\n for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {\n if (!entry.isDirectory()) {\n continue;\n }\n const candidate = path.join(dir, entry.name);\n if (hasSkillMd(candidate)) {\n skillDirs.push(candidate);\n }\n }\n }\n\n if (hasSkillMd(basePath)) {\n skillDirs.unshift(basePath);\n }\n\n if (skillDirs.length === 0) {\n findSkillDirsRecursive(basePath, 0, 5, skillDirs);\n }\n\n const seen = new Set<string>();\n const skills: Skill[] = [];\n for (const dir of skillDirs) {\n const parsed = parseSkillMd(path.join(dir, \"SKILL.md\"));\n if (!parsed) {\n continue;\n }\n if (seen.has(parsed.name)) {\n continue;\n }\n seen.add(parsed.name);\n skills.push(parsed);\n }\n\n return skills;\n}\n\nexport async function discoverSkillsAsync(basePath: string): Promise<Skill[]> {\n const dirsToSearch = [\n basePath,\n path.join(basePath, \"skills\"),\n path.join(basePath, \"skills\", \".curated\"),\n path.join(basePath, \"skills\", \".experimental\"),\n path.join(basePath, \"skills\", \".system\"),\n path.join(basePath, \".agents\", \"skills\"),\n path.join(basePath, \".agent\", \"skills\"),\n ];\n\n const skillDirs: string[] = [];\n for (const dir of dirsToSearch) {\n let stat: fs.Stats | undefined;\n try {\n stat = await fs.promises.stat(dir);\n } catch {\n stat = undefined;\n }\n if (!stat || !stat.isDirectory()) {\n continue;\n }\n\n let entries: fs.Dirent[] = [];\n try {\n entries = await fs.promises.readdir(dir, { withFileTypes: true });\n } catch {\n entries = [];\n }\n\n for (const entry of entries) {\n if (!entry.isDirectory()) {\n continue;\n }\n const candidate = path.join(dir, entry.name);\n if (await hasSkillMdAsync(candidate)) {\n skillDirs.push(candidate);\n }\n }\n }\n\n if (await hasSkillMdAsync(basePath)) {\n skillDirs.unshift(basePath);\n }\n\n if (skillDirs.length === 0) {\n await findSkillDirsRecursiveAsync(basePath, 0, 5, skillDirs);\n }\n\n const seen = new Set<string>();\n const skills: Skill[] = [];\n for (const dir of skillDirs) {\n const parsed = await parseSkillMdAsync(path.join(dir, \"SKILL.md\"));\n if (!parsed) {\n continue;\n }\n if (seen.has(parsed.name)) {\n continue;\n }\n seen.add(parsed.name);\n skills.push(parsed);\n }\n\n return skills;\n}\n\nexport function filterSkillsByName(skills: Skill[], requested?: string[]): Skill[] {\n if (!requested || requested.length === 0) {\n return skills;\n }\n\n if (requested.includes(\"*\")) {\n return skills;\n }\n\n const wanted = new Set(requested.map((item) => item.toLowerCase()));\n return skills.filter((skill) => wanted.has(skill.name.toLowerCase()));\n}\n", "import path from \"node:path\";\nimport type { ParsedSource } from \"../contracts/runtime-types\";\n\nfunction isLocalPath(input: string): boolean {\n return (\n path.isAbsolute(input) ||\n input === \".\" ||\n input === \"..\" ||\n input.startsWith(\"./\") ||\n input.startsWith(\"../\") ||\n /^[a-zA-Z]:[\\\\/]/.test(input)\n );\n}\n\nexport function parseSource(input: string): ParsedSource {\n if (input.startsWith(\"catalog+https://\")) {\n return { type: \"catalog\", url: input.slice(\"catalog+\".length) };\n }\n\n if (isLocalPath(input)) {\n return { type: \"local\", localPath: path.resolve(input) };\n }\n\n const githubTreeWithPath = input.match(/github\\.com\\/([^/]+)\\/([^/]+)\\/tree\\/([^/]+)\\/(.+)/);\n if (githubTreeWithPath) {\n const [, owner, repo, ref, subpath] = githubTreeWithPath;\n return {\n type: \"github\",\n repoUrl: `https://github.com/${owner}/${repo.replace(/\\.git$/, \"\")}.git`,\n ref,\n subpath,\n };\n }\n\n const githubTree = input.match(/github\\.com\\/([^/]+)\\/([^/]+)\\/tree\\/([^/]+)$/);\n if (githubTree) {\n const [, owner, repo, ref] = githubTree;\n return {\n type: \"github\",\n repoUrl: `https://github.com/${owner}/${repo.replace(/\\.git$/, \"\")}.git`,\n ref,\n };\n }\n\n const githubRepo = input.match(/github\\.com\\/([^/]+)\\/([^/]+)/);\n if (githubRepo) {\n const [, owner, repo] = githubRepo;\n return {\n type: \"github\",\n repoUrl: `https://github.com/${owner}/${repo.replace(/\\.git$/, \"\")}.git`,\n };\n }\n\n const gitlabRepo = input.match(/gitlab\\.com\\/([^/]+)\\/([^/]+)/);\n if (gitlabRepo) {\n const [, owner, repo] = gitlabRepo;\n return {\n type: \"git\",\n repoUrl: `https://gitlab.com/${owner}/${repo.replace(/\\.git$/, \"\")}.git`,\n };\n }\n\n const shorthand = input.match(/^([^/]+)\\/([^/]+)(?:\\/(.+))?$/);\n if (shorthand && !input.includes(\":\") && !input.startsWith(\".\")) {\n const [, owner, repo, subpath] = shorthand;\n return {\n type: \"github\",\n repoUrl: `https://github.com/${owner}/${repo.replace(/\\.git$/, \"\")}.git`,\n subpath,\n };\n }\n\n if (input.startsWith(\"http://\") || input.startsWith(\"https://\")) {\n if (input.endsWith(\".git\")) {\n return { type: \"git\", repoUrl: input };\n }\n return { type: \"well-known\", url: input };\n }\n\n return { type: \"git\", repoUrl: input };\n}\n", "import fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { spawn, spawnSync } from \"node:child_process\";\nimport type { ParsedSource } from \"../contracts/runtime-types\";\ntype GitLikeSource = Exclude<ParsedSource, { type: \"well-known\" | \"catalog\" }>;\n\nfunction runGit(args: string[], cwd?: string): void {\n const result = spawnSync(\"git\", args, {\n cwd,\n encoding: \"utf8\",\n stdio: \"pipe\",\n });\n if (result.status !== 0) {\n const stderr = (result.stderr || \"\").trim();\n const stdout = (result.stdout || \"\").trim();\n const detail = stderr || stdout || \"git command failed\";\n throw new Error(`${detail}`);\n }\n}\n\nfunction runGitOutput(args: string[], cwd?: string): string {\n const result = spawnSync(\"git\", args, {\n cwd,\n encoding: \"utf8\",\n stdio: \"pipe\",\n });\n if (result.status !== 0) {\n const stderr = (result.stderr || \"\").trim();\n const stdout = (result.stdout || \"\").trim();\n const detail = stderr || stdout || \"git command failed\";\n throw new Error(`${detail}`);\n }\n return String(result.stdout || \"\").trim();\n}\n\nfunction runGitAsync(args: string[], cwd?: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const child = spawn(\"git\", args, {\n cwd,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n\n let stdout = \"\";\n let stderr = \"\";\n\n child.stdout.on(\"data\", (chunk: Buffer | string) => {\n stdout += chunk.toString();\n });\n child.stderr.on(\"data\", (chunk: Buffer | string) => {\n stderr += chunk.toString();\n });\n\n child.on(\"error\", (error) => {\n reject(error);\n });\n\n child.on(\"close\", (code) => {\n if (code === 0) {\n resolve();\n return;\n }\n const detail = stderr.trim() || stdout.trim() || \"git command failed\";\n reject(new Error(detail));\n });\n });\n}\n\nfunction runGitOutputAsync(args: string[], cwd?: string): Promise<string> {\n return new Promise((resolve, reject) => {\n const child = spawn(\"git\", args, {\n cwd,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n\n let stdout = \"\";\n let stderr = \"\";\n\n child.stdout.on(\"data\", (chunk: Buffer | string) => {\n stdout += chunk.toString();\n });\n child.stderr.on(\"data\", (chunk: Buffer | string) => {\n stderr += chunk.toString();\n });\n\n child.on(\"error\", (error) => {\n reject(error);\n });\n\n child.on(\"close\", (code) => {\n if (code === 0) {\n resolve(stdout.trim());\n return;\n }\n const detail = stderr.trim() || stdout.trim() || \"git command failed\";\n reject(new Error(detail));\n });\n });\n}\n\nfunction applyCheckoutRefSync(repoDir: string, ref?: string): void {\n if (!ref) {\n return;\n }\n runGit([\"fetch\", \"--depth\", \"1\", \"origin\", ref], repoDir);\n runGit([\"checkout\", ref], repoDir);\n}\n\nasync function applyCheckoutRefAsync(repoDir: string, ref?: string): Promise<void> {\n if (!ref) {\n return;\n }\n await runGitAsync([\"fetch\", \"--depth\", \"1\", \"origin\", ref], repoDir);\n await runGitAsync([\"checkout\", ref], repoDir);\n}\n\nexport function prepareSourceDir(parsed: GitLikeSource): {\n basePath: string;\n cleanup?: () => void;\n} {\n if (parsed.type === \"local\") {\n if (!fs.existsSync(parsed.localPath)) {\n throw new Error(`Local source not found: ${parsed.localPath}`);\n }\n return { basePath: parsed.localPath };\n }\n\n const tmp = fs.mkdtempSync(path.join(os.tmpdir(), \"skillspp-cli-\"));\n runGit([\"clone\", \"--depth\", \"1\", parsed.repoUrl, tmp]);\n\n const ref = parsed.type === \"github\" ? parsed.ref : undefined;\n applyCheckoutRefSync(tmp, ref);\n\n const basePath =\n parsed.type === \"github\" && parsed.subpath ? path.join(tmp, parsed.subpath) : tmp;\n return {\n basePath,\n cleanup: () => {\n fs.rmSync(tmp, { recursive: true, force: true });\n },\n };\n}\n\nexport async function prepareSourceDirAsync(parsed: GitLikeSource): Promise<{\n basePath: string;\n cleanup?: () => void;\n}> {\n if (parsed.type === \"local\") {\n if (!fs.existsSync(parsed.localPath)) {\n throw new Error(`Local source not found: ${parsed.localPath}`);\n }\n return { basePath: parsed.localPath };\n }\n\n const tmp = fs.mkdtempSync(path.join(os.tmpdir(), \"skillspp-cli-\"));\n await runGitAsync([\"clone\", \"--depth\", \"1\", parsed.repoUrl, tmp]);\n\n const ref = parsed.type === \"github\" ? parsed.ref : undefined;\n await applyCheckoutRefAsync(tmp, ref);\n\n const basePath =\n parsed.type === \"github\" && parsed.subpath ? path.join(tmp, parsed.subpath) : tmp;\n return {\n basePath,\n cleanup: () => {\n fs.rmSync(tmp, { recursive: true, force: true });\n },\n };\n}\n\nexport function prepareSourceDirWithRef(\n parsed: GitLikeSource,\n options: { overrideRef?: string } = {},\n): {\n basePath: string;\n cleanup?: () => void;\n} {\n if (parsed.type === \"local\") {\n return prepareSourceDir(parsed);\n }\n const effectiveParsed =\n parsed.type === \"github\" ? { ...parsed, ref: options.overrideRef || parsed.ref } : parsed;\n const prepared = prepareSourceDir(effectiveParsed);\n if (parsed.type === \"git\" && options.overrideRef) {\n applyCheckoutRefSync(prepared.basePath, options.overrideRef);\n }\n return prepared;\n}\n\nexport async function prepareSourceDirAsyncWithRef(\n parsed: GitLikeSource,\n options: { overrideRef?: string } = {},\n): Promise<{\n basePath: string;\n cleanup?: () => void;\n}> {\n if (parsed.type === \"local\") {\n return prepareSourceDirAsync(parsed);\n }\n const effectiveParsed =\n parsed.type === \"github\" ? { ...parsed, ref: options.overrideRef || parsed.ref } : parsed;\n const prepared = await prepareSourceDirAsync(effectiveParsed);\n if (parsed.type === \"git\" && options.overrideRef) {\n await applyCheckoutRefAsync(prepared.basePath, options.overrideRef);\n }\n return prepared;\n}\n\nexport function resolveGitHeadRef(repoDir: string): string {\n return runGitOutput([\"rev-parse\", \"HEAD\"], repoDir);\n}\n\nexport async function resolveGitHeadRefAsync(repoDir: string): Promise<string> {\n return runGitOutputAsync([\"rev-parse\", \"HEAD\"], repoDir);\n}\n", "import type { HostProvider } from \"./types\";\n\nclass ProviderRegistry {\n private providers: HostProvider[] = [];\n\n register(provider: HostProvider): void {\n if (this.providers.some((item) => item.id === provider.id)) {\n throw new Error(`Provider with id '${provider.id}' already registered`);\n }\n this.providers.push(provider);\n }\n\n findProvider(url: string): HostProvider | null {\n for (const provider of this.providers) {\n if (provider.match(url).matches) {\n return provider;\n }\n }\n return null;\n }\n\n getProviders(): HostProvider[] {\n return [...this.providers];\n }\n\n getProviderById(id: string): HostProvider | null {\n return this.providers.find((item) => item.id === id) || null;\n }\n}\n\nexport const registry = new ProviderRegistry();\n\nexport function registerProvider(provider: HostProvider): void {\n registry.register(provider);\n}\n\nexport function findProvider(url: string): HostProvider | null {\n return registry.findProvider(url);\n}\n\nexport function getProviders(): HostProvider[] {\n return registry.getProviders();\n}\n\nexport function getProviderById(id: string): HostProvider | null {\n return registry.getProviderById(id);\n}\n", "import dns from \"node:dns/promises\";\nimport net from \"node:net\";\nimport type {\n ProviderMatch,\n RemotePlugin,\n RemoteSkill,\n WellKnownFetchOptions,\n WellKnownProvider,\n} from \"./types\";\n\ntype WellKnownIndexEntry = {\n name: string;\n description?: string;\n files: string[];\n};\n\ntype DownloadBudget = {\n remaining: number;\n};\n\ntype NormalizedOptions = Required<Omit<WellKnownFetchOptions, \"allowHosts\" | \"denyHosts\">> & {\n allowHosts: string[];\n denyHosts: string[];\n};\n\ntype ResourceKind = \"skills\" | \"plugins\";\n\ntype ResourceConfig<TResult> = {\n kind: ResourceKind;\n displayLabel: string;\n indexPath: string;\n entryLabel: string;\n requireDescription: boolean;\n missingManifestMessage: (name: string) => string;\n validateName?: (name: string) => void;\n hasRequiredManifest: (filePath: string) => boolean;\n buildRemoteResult: (options: {\n entry: WellKnownIndexEntry;\n files: Map<string, string>;\n sourceUrl: string;\n }) => TResult;\n};\n\nconst DEFAULT_OPTIONS: Omit<NormalizedOptions, \"allowHosts\" | \"denyHosts\"> = {\n maxDownloadBytes: 5 * 1024 * 1024,\n timeoutMs: 10_000,\n maxRedirects: 3,\n maxFilesPerSkill: 128,\n maxSkillFileBytes: 512 * 1024,\n};\n\nconst EXCLUDED_HOSTS = new Set([\"github.com\", \"gitlab.com\", \"raw.githubusercontent.com\"]);\n\nconst SKILL_CONFIG: ResourceConfig<RemoteSkill> = {\n kind: \"skills\",\n displayLabel: \"well-known skills\",\n indexPath: \"/.well-known/skills/index.json\",\n entryLabel: \"skill\",\n requireDescription: true,\n missingManifestMessage: (name) => `Well-known skill '${name}' is missing SKILL.md`,\n validateName(name) {\n if (!/^[a-z0-9]([a-z0-9-]{0,62}[a-z0-9])?$/.test(name)) {\n throw new Error(`Invalid well-known skill name: ${name}`);\n }\n },\n hasRequiredManifest(filePath) {\n return filePath.toLowerCase() === \"skill.md\";\n },\n buildRemoteResult({ entry, files, sourceUrl }) {\n return {\n name: entry.name,\n description: entry.description || \"\",\n installName: entry.name,\n sourceUrl,\n sourceType: \"well-known\",\n files,\n };\n },\n};\n\nconst PLUGIN_CONFIG: ResourceConfig<RemotePlugin> = {\n kind: \"plugins\",\n displayLabel: \"well-known plugins\",\n indexPath: \"/.well-known/plugins/index.json\",\n entryLabel: \"plugin\",\n requireDescription: false,\n missingManifestMessage: (name) => `Well-known plugin '${name}' is missing plugin.json`,\n hasRequiredManifest(filePath) {\n return filePath.split(\"/\").at(-1)?.toLowerCase() === \"plugin.json\";\n },\n buildRemoteResult({ entry, files, sourceUrl }) {\n return {\n name: entry.name,\n description: entry.description || \"\",\n installName: entry.name,\n sourceUrl,\n sourceType: \"well-known\",\n files,\n };\n },\n};\n\nexport class SecureWellKnownProvider implements WellKnownProvider {\n readonly id = \"well-known\";\n readonly displayName = \"Secure Well-Known Skills\";\n\n match(url: string): ProviderMatch {\n if (!url.startsWith(\"http://\") && !url.startsWith(\"https://\")) {\n return { matches: false };\n }\n\n try {\n const parsed = new URL(url);\n if (EXCLUDED_HOSTS.has(parsed.hostname.toLowerCase())) {\n return { matches: false };\n }\n return { matches: true, sourceIdentifier: this.getSourceIdentifier(url) };\n } catch {\n return { matches: false };\n }\n }\n\n getSourceIdentifier(url: string): string {\n const parsed = new URL(url);\n const pathname = parsed.pathname.replace(/\\/$/, \"\");\n return pathname && pathname !== \"/\"\n ? `wellknown/${parsed.hostname}${pathname}`\n : `wellknown/${parsed.hostname}`;\n }\n\n async fetchAllSkills(url: string, options: WellKnownFetchOptions = {}): Promise<RemoteSkill[]> {\n return this.fetchAllResources(url, options, SKILL_CONFIG);\n }\n\n async fetchAllPlugins(url: string, options: WellKnownFetchOptions = {}): Promise<RemotePlugin[]> {\n return this.fetchAllResources(url, options, PLUGIN_CONFIG);\n }\n\n private async fetchAllResources<TResult>(\n url: string,\n options: WellKnownFetchOptions,\n config: ResourceConfig<TResult>,\n ): Promise<TResult[]> {\n const normalized = this.normalizeOptions(options);\n const budget: DownloadBudget = { remaining: normalized.maxDownloadBytes };\n const parsed = new URL(url);\n if (parsed.protocol !== \"https:\") {\n throw new Error(\"Well-known provider requires HTTPS URLs\");\n }\n\n await this.assertHostAllowed(parsed.hostname, normalized);\n\n const { index, resolvedBase } = await this.fetchIndex(parsed, normalized, budget, config);\n\n const resources: TResult[] = [];\n for (const entry of index) {\n resources.push(\n await this.fetchResourceByEntry(resolvedBase, entry, normalized, budget, config),\n );\n }\n\n return resources;\n }\n\n private normalizeOptions(options: WellKnownFetchOptions): NormalizedOptions {\n return {\n allowHosts: (options.allowHosts || [])\n .map((value) => value.trim().toLowerCase())\n .filter(Boolean),\n denyHosts: (options.denyHosts || [])\n .map((value) => value.trim().toLowerCase())\n .filter(Boolean),\n maxDownloadBytes: options.maxDownloadBytes ?? DEFAULT_OPTIONS.maxDownloadBytes,\n timeoutMs: options.timeoutMs ?? DEFAULT_OPTIONS.timeoutMs,\n maxRedirects: options.maxRedirects ?? DEFAULT_OPTIONS.maxRedirects,\n maxFilesPerSkill: options.maxFilesPerSkill ?? DEFAULT_OPTIONS.maxFilesPerSkill,\n maxSkillFileBytes: options.maxSkillFileBytes ?? DEFAULT_OPTIONS.maxSkillFileBytes,\n };\n }\n\n private async fetchIndex(\n parsedUrl: URL,\n options: NormalizedOptions,\n budget: DownloadBudget,\n config: ResourceConfig<unknown>,\n ): Promise<{ index: WellKnownIndexEntry[]; resolvedBase: string }> {\n const candidates = this.buildBaseCandidates(parsedUrl, config.indexPath);\n\n for (const base of candidates) {\n const indexUrl = `${base}${config.indexPath}`;\n try {\n const jsonText = await this.fetchTextWithLimit(\n indexUrl,\n options.maxDownloadBytes,\n options,\n budget,\n );\n const parsed = JSON.parse(jsonText) as unknown;\n const validated = this.validateIndex(parsed, options.maxFilesPerSkill, config);\n return { index: validated, resolvedBase: base };\n } catch {\n continue;\n }\n }\n\n throw new Error(`No valid ${config.displayLabel} index found at ${config.indexPath}`);\n }\n\n private buildBaseCandidates(parsed: URL, indexPath: string): string[] {\n const origin = parsed.origin;\n const pathname = parsed.pathname.replace(/\\/$/, \"\");\n const marker = indexPath.replace(/\\/index\\.json$/, \"\");\n\n const out: string[] = [];\n\n if (pathname.includes(marker)) {\n const prefix = pathname.slice(0, pathname.indexOf(marker));\n out.push(`${origin}${prefix}`.replace(/\\/$/, \"\"));\n if (prefix !== \"\") {\n out.push(origin);\n }\n } else {\n out.push(`${origin}${pathname}`.replace(/\\/$/, \"\"));\n if (pathname !== \"\") {\n out.push(origin);\n }\n }\n\n return [\n ...new Set(out.map((value) => (value.endsWith(\"/\") ? value.slice(0, -1) : value))),\n ].filter(Boolean);\n }\n\n private validateIndex(\n raw: unknown,\n maxFilesPerSkill: number,\n config: ResourceConfig<unknown>,\n ): WellKnownIndexEntry[] {\n if (!raw || typeof raw !== \"object\") {\n throw new Error(\"Invalid well-known index: expected object\");\n }\n\n const data = raw as Record<string, unknown>;\n const rows = data[config.kind];\n if (!Array.isArray(rows)) {\n throw new Error(`Invalid well-known index: '${config.kind}' must be an array`);\n }\n\n return rows.map((item, idx) => {\n if (!item || typeof item !== \"object\") {\n throw new Error(`Invalid well-known index entry[${idx}]`);\n }\n const row = item as Record<string, unknown>;\n const name = String(row.name || \"\").trim();\n const description = typeof row.description === \"string\" ? row.description.trim() : undefined;\n const files = Array.isArray(row.files) ? row.files.map((value) => String(value)) : [];\n\n if (!name || files.length === 0) {\n throw new Error(`Invalid well-known index entry[${idx}]: missing required fields`);\n }\n if (config.requireDescription && !description) {\n throw new Error(`Invalid well-known index entry[${idx}]: missing required fields`);\n }\n config.validateName?.(name);\n if (files.length > maxFilesPerSkill) {\n throw new Error(`Too many files in well-known ${config.entryLabel} '${name}'`);\n }\n if (!files.some((filePath) => config.hasRequiredManifest(filePath))) {\n throw new Error(config.missingManifestMessage(name));\n }\n\n for (const file of files) {\n this.assertSafeRelativePath(file);\n }\n\n return { name, description, files };\n });\n }\n\n private assertSafeRelativePath(filePath: string): void {\n if (\n !filePath ||\n filePath.startsWith(\"/\") ||\n filePath.startsWith(\"\\\\\") ||\n filePath.includes(\"..\") ||\n filePath.includes(\"\\\\\")\n ) {\n throw new Error(`Unsafe well-known file path: ${filePath}`);\n }\n }\n\n private async fetchResourceByEntry<TResult>(\n resolvedBase: string,\n entry: WellKnownIndexEntry,\n options: NormalizedOptions,\n budget: DownloadBudget,\n config: ResourceConfig<TResult>,\n ): Promise<TResult> {\n const baseUrl = `${resolvedBase}/.well-known/${config.kind}/${entry.name}`;\n const files = new Map<string, string>();\n\n for (const filePath of entry.files) {\n this.assertSafeRelativePath(filePath);\n const fileUrl = `${baseUrl}/${filePath}`;\n const text = await this.fetchTextWithLimit(\n fileUrl,\n options.maxSkillFileBytes,\n options,\n budget,\n );\n if (text.includes(\"\\u0000\")) {\n throw new Error(`Binary content is not allowed in well-known file: ${filePath}`);\n }\n files.set(filePath, text);\n }\n\n const manifestPath = this.pickPrimaryManifestPath(entry.files, config);\n return config.buildRemoteResult({\n entry,\n files,\n sourceUrl: `${baseUrl}/${manifestPath}`,\n });\n }\n\n private pickPrimaryManifestPath(filePaths: string[], config: ResourceConfig<unknown>): string {\n const manifests = filePaths\n .filter((filePath) => config.hasRequiredManifest(filePath))\n .sort((left, right) => {\n const leftDepth = left.split(\"/\").length;\n const rightDepth = right.split(\"/\").length;\n if (leftDepth !== rightDepth) {\n return leftDepth - rightDepth;\n }\n return left.localeCompare(right);\n });\n\n const manifestPath = manifests[0];\n if (!manifestPath) {\n throw new Error(\"Missing required manifest in well-known index entry\");\n }\n return manifestPath;\n }\n\n private async fetchTextWithLimit(\n url: string,\n maxPerRequestBytes: number,\n options: NormalizedOptions,\n budget: DownloadBudget,\n ): Promise<string> {\n let currentUrl = url;\n let redirects = 0;\n\n while (true) {\n const parsed = new URL(currentUrl);\n if (parsed.protocol !== \"https:\") {\n throw new Error(\"Well-known provider only allows HTTPS fetches\");\n }\n await this.assertHostAllowed(parsed.hostname, options);\n\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), options.timeoutMs);\n\n let response: Response;\n try {\n response = await fetch(currentUrl, {\n redirect: \"manual\",\n signal: controller.signal,\n });\n } finally {\n clearTimeout(timeout);\n }\n\n if (response.status >= 300 && response.status < 400) {\n const location = response.headers.get(\"location\");\n if (!location) {\n throw new Error(`Redirect without location for ${currentUrl}`);\n }\n redirects += 1;\n if (redirects > options.maxRedirects) {\n throw new Error(`Too many redirects for ${url}`);\n }\n currentUrl = new URL(location, currentUrl).toString();\n continue;\n }\n\n if (!response.ok) {\n throw new Error(`Failed to fetch ${currentUrl}: ${response.status} ${response.statusText}`);\n }\n\n const bytes = new Uint8Array(await response.arrayBuffer());\n if (bytes.byteLength > maxPerRequestBytes) {\n throw new Error(`Exceeded per-file download limit for ${currentUrl}`);\n }\n budget.remaining -= bytes.byteLength;\n if (budget.remaining < 0) {\n throw new Error(`Exceeded total download budget while fetching ${url}`);\n }\n\n return new TextDecoder(\"utf8\").decode(bytes);\n }\n }\n\n private async assertHostAllowed(hostname: string, options: NormalizedOptions): Promise<void> {\n const lowerHost = hostname.toLowerCase();\n\n if (options.denyHosts.includes(lowerHost)) {\n throw new Error(`Host '${hostname}' is explicitly denied`);\n }\n if (options.allowHosts.length > 0 && !options.allowHosts.includes(lowerHost)) {\n throw new Error(`Host '${hostname}' is not in allowed host list`);\n }\n if (isLocalHostname(lowerHost)) {\n throw new Error(`Local or loopback host '${hostname}' is not allowed`);\n }\n\n const ips = await resolveHostIps(hostname);\n if (ips.some((ip) => isPrivateOrLocalIp(ip))) {\n throw new Error(`Host '${hostname}' resolves to a private/local address`);\n }\n }\n}\n\nfunction isLocalHostname(hostname: string): boolean {\n return hostname === \"localhost\" || hostname.endsWith(\".localhost\") || hostname.endsWith(\".local\");\n}\n\nasync function resolveHostIps(hostname: string): Promise<string[]> {\n const out = new Set<string>();\n try {\n const entries = await dns.lookup(hostname, { all: true });\n for (const entry of entries) {\n out.add(entry.address);\n }\n } catch {\n // Ignore DNS lookup errors here and let fetch surface its own error.\n }\n return [...out];\n}\n\nfunction isPrivateOrLocalIp(ip: string): boolean {\n const family = net.isIP(ip);\n if (family === 4) {\n return (\n ip.startsWith(\"10.\") ||\n ip.startsWith(\"127.\") ||\n ip.startsWith(\"169.254.\") ||\n ip.startsWith(\"192.168.\") ||\n /^172\\.(1[6-9]|2\\d|3[0-1])\\./.test(ip)\n );\n }\n if (family === 6) {\n const normalized = ip.toLowerCase();\n return (\n normalized === \"::1\" ||\n normalized.startsWith(\"fc\") ||\n normalized.startsWith(\"fd\") ||\n normalized.startsWith(\"fe80:\")\n );\n }\n return false;\n}\n\nexport const wellKnownProvider = new SecureWellKnownProvider();\n", "import type {\n ProviderMatch,\n RemotePlugin,\n RemoteSkill,\n RemoteSkillsProvider,\n WellKnownFetchOptions,\n} from \"./types\";\n\ntype CatalogIndexEntry = {\n name: string;\n description?: string;\n files: string[];\n};\n\ntype ResourceKind = \"skills\" | \"plugins\";\n\ntype ResourceConfig<TResult> = {\n kind: ResourceKind;\n indexLabel: string;\n resolveIndexUrl: (parsed: URL) => string;\n requireDescription: boolean;\n missingManifestMessage: (name: string) => string;\n hasRequiredManifest: (filePath: string) => boolean;\n buildRemoteResult: (options: {\n entry: CatalogIndexEntry;\n files: Map<string, string>;\n sourceUrl: string;\n }) => TResult;\n};\n\nconst DEFAULT_OPTIONS = {\n maxDownloadBytes: 5 * 1024 * 1024,\n timeoutMs: 10_000,\n maxFilesPerSkill: 128,\n maxSkillFileBytes: 512 * 1024,\n};\n\nexport class HttpCatalogProvider implements RemoteSkillsProvider {\n readonly id = \"catalog\";\n readonly displayName = \"HTTP Catalog Skills\";\n\n match(url: string): ProviderMatch {\n try {\n const parsed = new URL(url);\n if (parsed.protocol !== \"https:\") {\n return { matches: false };\n }\n return { matches: true, sourceIdentifier: this.getSourceIdentifier(url) };\n } catch {\n return { matches: false };\n }\n }\n\n getSourceIdentifier(url: string): string {\n const parsed = new URL(url);\n return `catalog/${parsed.host}${parsed.pathname.replace(/\\/+$/, \"\")}`;\n }\n\n async fetchAllSkills(url: string, options: WellKnownFetchOptions = {}): Promise<RemoteSkill[]> {\n return this.fetchAllResources(url, options, {\n kind: \"skills\",\n indexLabel: \"catalog skills\",\n resolveIndexUrl(parsed) {\n return parsed.pathname.endsWith(\".json\")\n ? parsed.toString()\n : new URL(\n \"index.json\",\n parsed.toString().endsWith(\"/\") ? parsed.toString() : `${parsed.toString()}/`,\n ).toString();\n },\n requireDescription: true,\n missingManifestMessage: (name) => `Catalog skill '${name}' is missing SKILL.md`,\n hasRequiredManifest(filePath) {\n return filePath.toLowerCase() === \"skill.md\";\n },\n buildRemoteResult({ entry, files, sourceUrl }) {\n return {\n name: entry.name,\n description: entry.description || \"\",\n installName: entry.name,\n sourceUrl,\n sourceType: \"catalog\",\n files,\n };\n },\n });\n }\n\n async fetchAllPlugins(url: string, options: WellKnownFetchOptions = {}): Promise<RemotePlugin[]> {\n return this.fetchAllResources(url, options, {\n kind: \"plugins\",\n indexLabel: \"catalog plugins\",\n resolveIndexUrl(parsed) {\n return parsed.pathname.endsWith(\".json\")\n ? parsed.toString()\n : new URL(\n \"plugins/index.json\",\n parsed.toString().endsWith(\"/\") ? parsed.toString() : `${parsed.toString()}/`,\n ).toString();\n },\n requireDescription: false,\n missingManifestMessage: (name) => `Catalog plugin '${name}' is missing plugin.json`,\n hasRequiredManifest(filePath) {\n return filePath.split(\"/\").at(-1)?.toLowerCase() === \"plugin.json\";\n },\n buildRemoteResult({ entry, files, sourceUrl }) {\n return {\n name: entry.name,\n description: entry.description || \"\",\n installName: entry.name,\n sourceUrl,\n sourceType: \"catalog\",\n files,\n };\n },\n });\n }\n\n private async fetchAllResources<TResult>(\n url: string,\n options: WellKnownFetchOptions,\n config: ResourceConfig<TResult>,\n ): Promise<TResult[]> {\n const parsed = new URL(url);\n if (parsed.protocol !== \"https:\") {\n throw new Error(\"Catalog provider requires HTTPS URLs\");\n }\n\n const maxDownloadBytes = options.maxDownloadBytes ?? DEFAULT_OPTIONS.maxDownloadBytes;\n const timeoutMs = options.timeoutMs ?? DEFAULT_OPTIONS.timeoutMs;\n const maxFilesPerSkill = options.maxFilesPerSkill ?? DEFAULT_OPTIONS.maxFilesPerSkill;\n const maxSkillFileBytes = options.maxSkillFileBytes ?? DEFAULT_OPTIONS.maxSkillFileBytes;\n\n const indexUrl = config.resolveIndexUrl(parsed);\n const indexText = await this.fetchTextWithLimit(\n indexUrl,\n Math.min(maxDownloadBytes, maxSkillFileBytes),\n timeoutMs,\n );\n const index = this.validateIndex(JSON.parse(indexText) as unknown, maxFilesPerSkill, config);\n\n const out: TResult[] = [];\n let remaining = maxDownloadBytes - indexText.length;\n const indexBase = indexUrl.slice(0, indexUrl.lastIndexOf(\"/\") + 1);\n for (const row of index) {\n const files = new Map<string, string>();\n for (const rel of row.files) {\n this.assertSafeRelativePath(rel);\n const fileUrl = new URL(`${row.name}/${rel}`, indexBase).toString();\n if (remaining <= 0) {\n throw new Error(\"Catalog download budget exhausted\");\n }\n const text = await this.fetchTextWithLimit(\n fileUrl,\n Math.min(remaining, maxSkillFileBytes),\n timeoutMs,\n );\n remaining -= text.length;\n files.set(rel, text);\n }\n out.push(\n config.buildRemoteResult({\n entry: row,\n files,\n sourceUrl: new URL(\n `${row.name}/${this.pickPrimaryManifestPath(row.files, config)}`,\n indexBase,\n ).toString(),\n }),\n );\n }\n return out;\n }\n\n private async fetchTextWithLimit(\n url: string,\n maxBytes: number,\n timeoutMs: number,\n ): Promise<string> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), timeoutMs);\n try {\n const response = await fetch(url, { signal: controller.signal });\n if (!response.ok) {\n throw new Error(\n `Catalog fetch failed (${response.status} ${response.statusText}) for ${url}`,\n );\n }\n const bytes = new Uint8Array(await response.arrayBuffer());\n if (bytes.byteLength > maxBytes) {\n throw new Error(`Catalog file exceeds size limit for ${url}`);\n }\n return new TextDecoder(\"utf8\").decode(bytes);\n } finally {\n clearTimeout(timeout);\n }\n }\n\n private validateIndex(\n raw: unknown,\n maxFilesPerSkill: number,\n config: ResourceConfig<unknown>,\n ): CatalogIndexEntry[] {\n if (!raw || typeof raw !== \"object\") {\n throw new Error(\"Invalid catalog index: expected object\");\n }\n const data = raw as Record<string, unknown>;\n const rows = data[config.kind];\n if (!Array.isArray(rows)) {\n throw new Error(`Invalid catalog index: '${config.kind}' must be an array`);\n }\n return rows.map((item, idx) => {\n if (!item || typeof item !== \"object\") {\n throw new Error(`Invalid catalog index entry[${idx}]`);\n }\n const row = item as Record<string, unknown>;\n const name = String(row.name || \"\").trim();\n const description = typeof row.description === \"string\" ? row.description.trim() : undefined;\n const files = Array.isArray(row.files) ? row.files.map((x) => String(x)) : [];\n if (!name || files.length === 0) {\n throw new Error(`Invalid catalog index entry[${idx}]: missing required fields`);\n }\n if (config.requireDescription && !description) {\n throw new Error(`Invalid catalog index entry[${idx}]: missing required fields`);\n }\n if (files.length > maxFilesPerSkill) {\n throw new Error(`Too many files in catalog ${config.kind.slice(0, -1)} '${name}'`);\n }\n if (!files.some((filePath) => config.hasRequiredManifest(filePath))) {\n throw new Error(config.missingManifestMessage(name));\n }\n for (const file of files) {\n this.assertSafeRelativePath(file);\n }\n return { name, description, files };\n });\n }\n\n private pickPrimaryManifestPath(filePaths: string[], config: ResourceConfig<unknown>): string {\n const manifests = filePaths\n .filter((filePath) => config.hasRequiredManifest(filePath))\n .sort((left, right) => {\n const leftDepth = left.split(\"/\").length;\n const rightDepth = right.split(\"/\").length;\n if (leftDepth !== rightDepth) {\n return leftDepth - rightDepth;\n }\n return left.localeCompare(right);\n });\n\n const manifestPath = manifests[0];\n if (!manifestPath) {\n throw new Error(\"Catalog entry is missing required manifest\");\n }\n return manifestPath;\n }\n\n private assertSafeRelativePath(filePath: string): void {\n if (\n !filePath ||\n filePath.startsWith(\"/\") ||\n filePath.startsWith(\"\\\\\") ||\n filePath.includes(\"..\") ||\n filePath.includes(\"\\\\\")\n ) {\n throw new Error(`Unsafe catalog file path: ${filePath}`);\n }\n }\n}\n\nexport const catalogProvider = new HttpCatalogProvider();\n", "export type {\n HostProvider,\n ProviderMatch,\n RemotePlugin,\n RemoteSkill,\n WellKnownFetchOptions,\n WellKnownProvider,\n RemoteSkillsProvider,\n} from \"./types\";\nexport {\n registry,\n registerProvider,\n findProvider,\n getProviders,\n getProviderById,\n} from \"./registry\";\nexport { SecureWellKnownProvider, wellKnownProvider } from \"./wellknown\";\nexport { HttpCatalogProvider, catalogProvider } from \"./catalog\";\n\nimport { registerProvider } from \"./registry\";\nimport { wellKnownProvider } from \"./wellknown\";\nimport { catalogProvider } from \"./catalog\";\n\nlet initialized = false;\n\nexport function initializeProviders(): void {\n if (initialized) {\n return;\n }\n registerProvider(wellKnownProvider);\n registerProvider(catalogProvider);\n initialized = true;\n}\n", "export type ExperimentalFeature = \"catalog\";\n\nexport function assertExperimentalFeatureEnabled(\n feature: ExperimentalFeature,\n enabled: boolean,\n): void {\n if (enabled) {\n return;\n }\n\n if (feature === \"catalog\") {\n throw new Error(\"Catalog source is experimental and requires explicit experimental mode.\");\n }\n}\n", "import path from \"node:path\";\nimport type { ParsedSource, Skill, AddOptions } from \"../contracts/runtime-types\";\nimport { parseSource } from \"./source-parser\";\nimport { prepareSourceDir } from \"./git\";\nimport { discoverSkills, filterSkillsByName, stageRemoteSkillFilesToTempDir } from \"./skills\";\nimport { getProviderById, initializeProviders } from \"../providers\";\nimport type { RemotePlugin, RemoteSkill, RemoteSkillsProvider } from \"../providers\";\n\nimport type { LockEntry } from \"../runtime/lockfile\";\nimport { assertExperimentalFeatureEnabled } from \"../application/experimental\";\n\nexport type SourceCandidate = {\n skill: Skill;\n sourceSkillPath?: string;\n wellKnownSourceUrl?: string;\n cleanup?: () => void;\n};\n\nexport async function resolveWellKnownSkills(\n sourceUrl: string,\n options: AddOptions,\n): Promise<RemoteSkill[]> {\n initializeProviders();\n const provider = getProviderById(\"well-known\");\n if (!provider) {\n throw new Error(\"Well-known provider is not registered\");\n }\n\n const wellKnown = provider as RemoteSkillsProvider;\n return wellKnown.fetchAllSkills(sourceUrl, {\n allowHosts: options.allowHost,\n denyHosts: options.denyHost,\n maxDownloadBytes: options.maxDownloadBytes,\n });\n}\n\nexport async function resolveCatalogSkills(\n sourceUrl: string,\n options: AddOptions,\n): Promise<RemoteSkill[]> {\n assertExperimentalFeatureEnabled(\"catalog\", Boolean(options.experimental));\n initializeProviders();\n const provider = getProviderById(\"catalog\");\n if (!provider) {\n throw new Error(\"Catalog provider is not registered\");\n }\n const catalog = provider as RemoteSkillsProvider;\n return catalog.fetchAllSkills(sourceUrl, {\n allowHosts: options.allowHost,\n denyHosts: options.denyHost,\n maxDownloadBytes: options.maxDownloadBytes,\n });\n}\n\nexport async function resolveWellKnownPlugins(\n sourceUrl: string,\n options: AddOptions,\n): Promise<RemotePlugin[]> {\n initializeProviders();\n const provider = getProviderById(\"well-known\");\n if (!provider) {\n throw new Error(\"Well-known provider is not registered\");\n }\n\n const wellKnown = provider as RemoteSkillsProvider;\n return wellKnown.fetchAllPlugins(sourceUrl, {\n allowHosts: options.allowHost,\n denyHosts: options.denyHost,\n maxDownloadBytes: options.maxDownloadBytes,\n });\n}\n\nexport async function resolveCatalogPlugins(\n sourceUrl: string,\n options: AddOptions,\n): Promise<RemotePlugin[]> {\n assertExperimentalFeatureEnabled(\"catalog\", Boolean(options.experimental));\n initializeProviders();\n const provider = getProviderById(\"catalog\");\n if (!provider) {\n throw new Error(\"Catalog provider is not registered\");\n }\n const catalog = provider as RemoteSkillsProvider;\n return catalog.fetchAllPlugins(sourceUrl, {\n allowHosts: options.allowHost,\n denyHosts: options.denyHost,\n maxDownloadBytes: options.maxDownloadBytes,\n });\n}\n\nexport async function resolveSourceCandidates(\n sourceInput: string,\n options: AddOptions,\n requestedSkills?: string[],\n): Promise<SourceCandidate[]> {\n const parsed = parseSource(sourceInput);\n\n if (parsed.type === \"well-known\" || parsed.type === \"catalog\") {\n const remoteSkills =\n parsed.type === \"well-known\"\n ? await resolveWellKnownSkills(parsed.url, options)\n : await resolveCatalogSkills(parsed.url, options);\n const indexSkills: Skill[] = remoteSkills.map((remote) => ({\n name: remote.installName,\n description: remote.description,\n path: remote.sourceUrl,\n }));\n\n const selected = requestedSkills\n ? filterSkillsByName(indexSkills, requestedSkills)\n : indexSkills;\n const pickedNames = new Set(selected.map((item) => item.name));\n\n return remoteSkills\n .filter((remote) => pickedNames.has(remote.installName))\n .map((remote) => {\n const staged = stageRemoteSkillFilesToTempDir(remote.files);\n return {\n skill: {\n name: remote.installName,\n description: remote.description,\n path: staged.path,\n },\n wellKnownSourceUrl: remote.sourceUrl,\n cleanup: staged.cleanup,\n };\n });\n }\n\n const prepared = prepareSourceDir(\n parsed as Exclude<ParsedSource, { type: \"well-known\" | \"catalog\" }>,\n );\n try {\n const skills = discoverSkills(prepared.basePath);\n const selected = requestedSkills ? filterSkillsByName(skills, requestedSkills) : skills;\n\n return selected.map((skill) => ({\n skill,\n sourceSkillPath: path.relative(prepared.basePath, skill.path) || \".\",\n cleanup: prepared.cleanup,\n }));\n } catch (error) {\n if (prepared.cleanup) {\n prepared.cleanup();\n }\n throw error;\n }\n}\n\nexport async function resolveSkillFromLockEntry(\n entry: LockEntry,\n options: AddOptions,\n): Promise<SourceCandidate> {\n const parsed = parseSource(entry.source.input);\n\n if (parsed.type === \"well-known\" || parsed.type === \"catalog\") {\n const remoteSkills =\n parsed.type === \"well-known\"\n ? await resolveWellKnownSkills(parsed.url, options)\n : await resolveCatalogSkills(parsed.url, options);\n const matched = remoteSkills.find(\n (item) => item.installName === entry.source.selector.skillName,\n );\n if (!matched) {\n throw new Error(`Skill '${entry.source.selector.skillName}' not found in well-known source`);\n }\n\n const staged = stageRemoteSkillFilesToTempDir(matched.files);\n return {\n skill: {\n name: matched.installName,\n description: matched.description,\n path: staged.path,\n },\n wellKnownSourceUrl: matched.sourceUrl,\n cleanup: staged.cleanup,\n };\n }\n\n const prepared = prepareSourceDir(\n parsed as Exclude<ParsedSource, { type: \"well-known\" | \"catalog\" }>,\n );\n\n try {\n let targetPath = prepared.basePath;\n if (entry.source.selector.relativePath) {\n targetPath = path.join(prepared.basePath, entry.source.selector.relativePath);\n }\n\n const skills = discoverSkills(prepared.basePath);\n const byName = skills.find((item) => item.name === entry.source.selector.skillName);\n const byPath = skills.find((item) => path.resolve(item.path) === path.resolve(targetPath));\n const matched = byPath || byName;\n\n if (!matched) {\n throw new Error(`Skill '${entry.source.selector.skillName}' not found in source`);\n }\n\n return {\n skill: matched,\n sourceSkillPath: path.relative(prepared.basePath, matched.path) || \".\",\n cleanup: prepared.cleanup,\n };\n } catch (error) {\n if (prepared.cleanup) {\n prepared.cleanup();\n }\n throw error;\n }\n}\n", "import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { createHash } from \"node:crypto\";\n\nconst SKIP_DIRS = new Set([\".git\", \"node_modules\", \"dist\", \"build\", \"__pycache__\"]);\nconst SKIP_FILES = new Set([\"skillspp-lock.json\", \"skillspp-lock.yaml\"]);\n\nfunction walkDir(baseDir: string, dir: string, hash: ReturnType<typeof createHash>): void {\n const entries = fs\n .readdirSync(dir, { withFileTypes: true })\n .sort((a, b) => a.name.localeCompare(b.name));\n for (const entry of entries) {\n if (entry.isDirectory() && SKIP_DIRS.has(entry.name)) {\n continue;\n }\n\n const fullPath = path.join(dir, entry.name);\n const relativePath = path.relative(baseDir, fullPath).replace(/\\\\/g, \"/\");\n\n if (entry.isDirectory()) {\n hash.update(`dir:${relativePath}\\n`);\n walkDir(baseDir, fullPath, hash);\n continue;\n }\n\n if (entry.isFile()) {\n if (SKIP_FILES.has(entry.name)) {\n continue;\n }\n const content = fs.readFileSync(fullPath);\n hash.update(`file:${relativePath}\\n`);\n hash.update(content);\n hash.update(\"\\n\");\n }\n }\n}\n\nfunction waitForNextTurn(): Promise<void> {\n return new Promise((resolve) => {\n setImmediate(resolve);\n });\n}\n\nasync function walkDirAsync(\n baseDir: string,\n dir: string,\n hash: ReturnType<typeof createHash>,\n): Promise<void> {\n const entries = (await fs.promises.readdir(dir, { withFileTypes: true })).sort((a, b) =>\n a.name.localeCompare(b.name),\n );\n\n for (const entry of entries) {\n await waitForNextTurn();\n\n if (entry.isDirectory() && SKIP_DIRS.has(entry.name)) {\n continue;\n }\n\n const fullPath = path.join(dir, entry.name);\n const relativePath = path.relative(baseDir, fullPath).replace(/\\\\/g, \"/\");\n\n if (entry.isDirectory()) {\n hash.update(`dir:${relativePath}\\n`);\n await walkDirAsync(baseDir, fullPath, hash);\n continue;\n }\n\n if (entry.isFile()) {\n if (SKIP_FILES.has(entry.name)) {\n continue;\n }\n const content = await fs.promises.readFile(fullPath);\n hash.update(`file:${relativePath}\\n`);\n hash.update(content);\n hash.update(\"\\n\");\n }\n }\n}\n\nexport function hashDirectory(dirPath: string): string {\n const resolved = path.resolve(dirPath);\n if (!fs.existsSync(resolved) || !fs.statSync(resolved).isDirectory()) {\n throw new Error(`Directory not found for hashing: ${resolved}`);\n }\n\n const hash = createHash(\"sha256\");\n walkDir(resolved, resolved, hash);\n return hash.digest(\"hex\");\n}\n\nexport async function hashDirectoryAsync(dirPath: string): Promise<string> {\n const resolved = path.resolve(dirPath);\n const stats = await fs.promises.stat(resolved).catch(() => null);\n if (!stats || !stats.isDirectory()) {\n throw new Error(`Directory not found for hashing: ${resolved}`);\n }\n\n const hash = createHash(\"sha256\");\n await walkDirAsync(resolved, resolved, hash);\n return hash.digest(\"hex\");\n}\n", "import fs from \"node:fs\";\nimport path from \"node:path\";\nimport YAML from \"yaml\";\nimport type { AgentType, InstallMode, ParsedSource } from \"../contracts/runtime-types\";\nimport { parseSource } from \"../sources/source-parser\";\nimport { AGENTS, getAgentPluginsDir, getAgentSkillsDir } from \"./agents\";\n\nexport type ResourceKind = \"skill\" | \"plugin\";\n\nexport type LockedSource = {\n input: string;\n type: ParsedSource[\"type\"];\n canonical?: string;\n pinnedRef?: string;\n resolvedPath?: string;\n isSymlinkSource?: boolean;\n selector: {\n skillName: string;\n relativePath?: string;\n wellKnownSourceUrl?: string;\n };\n};\n\nexport type LockEntry = {\n skillName: string;\n global: boolean;\n installMode: InstallMode;\n agents: AgentType[];\n canonicalDir: string;\n source: LockedSource;\n sourceHash: string;\n installedHash: string;\n updatedAt: string;\n};\n\nexport type SkillsLockfile = {\n version: 1;\n entries: LockEntry[];\n};\n\nexport type ResourceLockEntry = LockEntry;\nexport type ResourceLockfile = SkillsLockfile;\n\nexport type LockfileFormat = \"json\" | \"yaml\";\n\ntype SourceLoadIdentity = Pick<LockedSource, \"type\" | \"input\" | \"canonical\">;\n\nexport function resolveSourceLoadInput(source: SourceLoadIdentity): string {\n return source.type === \"local\" && source.canonical ? source.canonical : source.input;\n}\n\nexport function buildSourceIdentityCacheKey(parsed: ParsedSource): string {\n if (parsed.type === \"local\") {\n return `local:${parsed.localPath}`;\n }\n\n if (parsed.type === \"well-known\") {\n return `well-known:${parsed.url}`;\n }\n\n if (parsed.type === \"catalog\") {\n return `catalog:${parsed.url}`;\n }\n\n if (parsed.type === \"github\") {\n return `github:${parsed.repoUrl}:${parsed.ref || \"\"}:${parsed.subpath || \"\"}`;\n }\n\n return `git:${parsed.repoUrl}`;\n}\n\nexport function buildSourceLoadCacheKey(source: SourceLoadIdentity): string {\n return buildSourceIdentityCacheKey(parseSource(resolveSourceLoadInput(source)));\n}\n\nfunction perSkillLockfilePath(canonicalDir: string, format: LockfileFormat = \"json\"): string {\n if (format === \"yaml\") {\n return path.join(canonicalDir, \"skillspp-lock.yaml\");\n }\n return path.join(canonicalDir, \"skillspp-lock.json\");\n}\n\nfunction parseLockPayload(\n text: string,\n format: \"json\" | \"yaml\",\n): { version: 1; entry?: LockEntry; entries?: LockEntry[] } | null {\n const raw = (format === \"json\" ? JSON.parse(text) : YAML.parse(text)) as\n | { version: 1; entry?: LockEntry; entries?: LockEntry[] }\n | undefined;\n if (!raw || raw.version !== 1) {\n return null;\n }\n return raw;\n}\n\nfunction readPerSkillLockfile(canonicalDir: string): LockEntry | null {\n const jsonPath = perSkillLockfilePath(canonicalDir, \"json\");\n const yamlPath = perSkillLockfilePath(canonicalDir, \"yaml\");\n\n const raw = fs.existsSync(jsonPath)\n ? parseLockPayload(fs.readFileSync(jsonPath, \"utf8\"), \"json\")\n : fs.existsSync(yamlPath)\n ? parseLockPayload(fs.readFileSync(yamlPath, \"utf8\"), \"yaml\")\n : null;\n\n if (!raw) {\n return null;\n }\n\n if (raw.entry && typeof raw.entry.skillName === \"string\") {\n return raw.entry;\n }\n\n if (\n Array.isArray(raw.entries) &&\n raw.entries[0] &&\n typeof raw.entries[0].skillName === \"string\"\n ) {\n return raw.entries[0];\n }\n\n return null;\n}\n\nfunction writePerSkillLockfile(\n canonicalDir: string,\n entry: LockEntry,\n format: LockfileFormat,\n): void {\n const jsonPath = perSkillLockfilePath(canonicalDir, \"json\");\n const yamlPath = perSkillLockfilePath(canonicalDir, \"yaml\");\n fs.mkdirSync(canonicalDir, { recursive: true });\n if (format === \"yaml\") {\n fs.writeFileSync(yamlPath, YAML.stringify({ version: 1, entry }), \"utf8\");\n if (fs.existsSync(jsonPath)) {\n fs.rmSync(jsonPath, { force: true });\n }\n return;\n }\n\n fs.writeFileSync(jsonPath, `${JSON.stringify({ version: 1, entry }, null, 2)}\\n`, \"utf8\");\n if (fs.existsSync(yamlPath)) {\n fs.rmSync(yamlPath, { force: true });\n }\n}\n\nfunction isSkillDirEntry(entry: fs.Dirent): boolean {\n return entry.isDirectory() || entry.isSymbolicLink();\n}\n\nfunction listInstalledResourceDirs(\n kind: ResourceKind,\n globalInstall: boolean,\n cwd: string,\n): string[] {\n const out = new Set<string>();\n for (const agent of Object.keys(AGENTS) as AgentType[]) {\n const resourceRoot =\n kind === \"plugin\"\n ? getAgentPluginsDir(agent, globalInstall, cwd)\n : getAgentSkillsDir(agent, globalInstall, cwd);\n if (!fs.existsSync(resourceRoot) || !fs.statSync(resourceRoot).isDirectory()) {\n continue;\n }\n for (const entry of fs.readdirSync(resourceRoot, { withFileTypes: true })) {\n if (!isSkillDirEntry(entry)) {\n continue;\n }\n out.add(path.join(resourceRoot, entry.name));\n }\n }\n\n return [...out];\n}\n\nfunction lockEntrySortTime(entry: LockEntry): number {\n const parsed = Date.parse(entry.updatedAt);\n return Number.isFinite(parsed) ? parsed : 0;\n}\n\nexport function readLockfile(globalInstall: boolean, cwd: string): SkillsLockfile {\n return readResourceLockfile(\"skill\", globalInstall, cwd);\n}\n\nexport function readResourceLockfile(\n kind: ResourceKind,\n globalInstall: boolean,\n cwd: string,\n): ResourceLockfile {\n const entriesBySkill = new Map<string, LockEntry>();\n for (const skillDir of listInstalledResourceDirs(kind, globalInstall, cwd)) {\n const entry = readPerSkillLockfile(skillDir);\n if (!entry || typeof entry.skillName !== \"string\") {\n continue;\n }\n\n const existing = entriesBySkill.get(entry.skillName);\n if (!existing || lockEntrySortTime(entry) > lockEntrySortTime(existing)) {\n entriesBySkill.set(entry.skillName, entry);\n }\n }\n\n return {\n version: 1,\n entries: [...entriesBySkill.values()].sort((a, b) => a.skillName.localeCompare(b.skillName)),\n };\n}\n\nexport function writeLockfile(\n globalInstall: boolean,\n cwd: string,\n lockfile: SkillsLockfile,\n format: LockfileFormat = \"json\",\n): void {\n writeResourceLockfile(\"skill\", globalInstall, cwd, lockfile, format);\n}\n\nexport function writeResourceLockfile(\n _kind: ResourceKind,\n _globalInstall: boolean,\n _cwd: string,\n lockfile: ResourceLockfile,\n format: LockfileFormat = \"json\",\n): void {\n const normalized = [...lockfile.entries].sort((a, b) => a.skillName.localeCompare(b.skillName));\n\n for (const entry of normalized) {\n writePerSkillLockfile(entry.canonicalDir, entry, format);\n }\n}\n\nexport function upsertLockEntry(lockfile: SkillsLockfile, entry: LockEntry): SkillsLockfile {\n return upsertResourceLockEntry(lockfile, entry);\n}\n\nexport function upsertResourceLockEntry(\n lockfile: ResourceLockfile,\n entry: ResourceLockEntry,\n): ResourceLockfile {\n const next = lockfile.entries.filter((item) => item.skillName !== entry.skillName);\n next.push(entry);\n return { version: 1, entries: next };\n}\n\nexport function removeLockEntry(lockfile: SkillsLockfile, skillName: string): SkillsLockfile {\n return removeResourceLockEntry(lockfile, skillName);\n}\n\nexport function removeResourceLockEntry(\n lockfile: ResourceLockfile,\n resourceName: string,\n): ResourceLockfile {\n return {\n version: 1,\n entries: lockfile.entries.filter((item) => item.skillName !== resourceName),\n };\n}\n\nexport function listCanonicalSkillDirs(globalInstall: boolean, cwd: string): string[] {\n return listCanonicalResourceDirs(\"skill\", globalInstall, cwd);\n}\n\nexport function listCanonicalResourceDirs(\n kind: ResourceKind,\n globalInstall: boolean,\n cwd: string,\n): string[] {\n return [\n ...new Set(\n listInstalledResourceDirs(kind, globalInstall, cwd).map((dir) => path.basename(dir)),\n ),\n ].sort((a, b) => a.localeCompare(b));\n}\n", "import fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { AddOptions, Plugin, ParsedSource } from \"../contracts/runtime-types\";\nimport type { DriftRecord } from \"../contracts/results\";\nimport type { RemotePlugin } from \"../providers\";\nimport { discoverPluginsAsync, stageRemotePluginFilesToTempDir } from \"../sources/plugins\";\nimport { resolveCatalogPlugins, resolveWellKnownPlugins } from \"../sources/source-resolution\";\nimport { parseSource } from \"../sources/source-parser\";\nimport { prepareSourceDirAsync, resolveGitHeadRefAsync } from \"../sources/git\";\nimport { hashDirectoryAsync } from \"./hash\";\nimport {\n buildSourceLoadCacheKey,\n listCanonicalResourceDirs,\n readResourceLockfile,\n resolveSourceLoadInput,\n type LockEntry,\n} from \"./lockfile\";\n\ntype PluginSourceCandidate = {\n plugin: Plugin;\n sourcePluginPath?: string;\n wellKnownSourceUrl?: string;\n cleanup?: () => void;\n};\n\nexport type PluginAssessment = {\n entry: LockEntry;\n drift: DriftRecord[];\n sourceHash?: string;\n resolved?: PluginSourceCandidate;\n refreshedSource?: {\n canonical?: string;\n pinnedRef?: string;\n resolvedPath?: string;\n isSymlinkSource?: boolean;\n sourcePluginPath?: string;\n wellKnownSourceUrl?: string;\n };\n};\n\nexport type PluginCheckOptions = {\n global?: boolean;\n plugin?: string[];\n allowHost?: string[];\n denyHost?: string[];\n maxDownloadBytes?: number;\n policyMode?: \"enforce\" | \"warn\";\n experimental?: boolean;\n};\n\nfunction includeByPlugin(entry: LockEntry, selected?: string[]): boolean {\n if (!selected || selected.length === 0 || selected.includes(\"*\")) {\n return true;\n }\n return selected.includes(entry.skillName);\n}\n\ntype CachedPreparedSource = {\n kind: \"prepared\";\n basePath: string;\n plugins: Plugin[];\n cleanupNow: () => void;\n retainCleanup: () => () => void;\n};\n\ntype CachedRemoteSource = {\n kind: \"remote\";\n remotePlugins: RemotePlugin[];\n};\n\ntype CachedSource = CachedPreparedSource | CachedRemoteSource;\n\ntype AsyncResult<T> = { ok: true; value: T } | { ok: false; error: unknown };\n\nfunction migrateHint(pluginName: string): string {\n return `pluginspp update ${pluginName} --migrate <new-plugin-source>`;\n}\n\nfunction resolveSourceMetadataIssue(entry: LockEntry): string | null {\n if (!entry.source.canonical) {\n return `source canonical metadata missing; run ${migrateHint(entry.skillName)}`;\n }\n\n if (entry.source.type === \"local\") {\n if (!entry.source.resolvedPath) {\n return `local source metadata missing; run ${migrateHint(entry.skillName)}`;\n }\n if (!fs.existsSync(entry.source.canonical)) {\n return `local source path not found; run ${migrateHint(entry.skillName)}`;\n }\n return null;\n }\n\n if (!entry.source.pinnedRef) {\n return `remote pin metadata missing; run ${migrateHint(entry.skillName)}`;\n }\n return null;\n}\n\nfunction createRetainedCleanup(cleanup?: () => void): {\n cleanupNow: () => void;\n retainCleanup: () => () => void;\n} {\n let cleaned = false;\n let refCount = 0;\n\n const runCleanup = () => {\n if (cleaned) {\n return;\n }\n cleaned = true;\n cleanup?.();\n };\n\n const cleanupNow = () => {\n if (refCount === 0) {\n runCleanup();\n }\n };\n\n const retainCleanup = () => {\n refCount += 1;\n let released = false;\n return () => {\n if (released) {\n return;\n }\n released = true;\n refCount -= 1;\n if (refCount === 0) {\n runCleanup();\n }\n };\n };\n\n return {\n cleanupNow,\n retainCleanup,\n };\n}\n\nfunction toAsyncResult<T>(promise: Promise<T>): Promise<AsyncResult<T>> {\n return promise.then(\n (value) => ({ ok: true as const, value }),\n (error) => ({ ok: false as const, error }),\n );\n}\n\nfunction unwrapAsyncResult<T>(result: AsyncResult<T>): T {\n if (result.ok) {\n return result.value;\n }\n throw (result as { ok: false; error: unknown }).error;\n}\n\nasync function loadCachedSource(entry: LockEntry, options: AddOptions): Promise<CachedSource> {\n const sourceInput = resolveSourceLoadInput(entry.source);\n const parsed = parseSource(sourceInput);\n\n if (parsed.type === \"well-known\" || parsed.type === \"catalog\") {\n const remotePlugins =\n parsed.type === \"well-known\"\n ? await resolveWellKnownPlugins(parsed.url, options)\n : await resolveCatalogPlugins(parsed.url, options);\n return {\n kind: \"remote\",\n remotePlugins,\n };\n }\n\n const prepared = await prepareSourceDirAsync(\n parsed as Exclude<ParsedSource, { type: \"well-known\" | \"catalog\" }>,\n );\n const retainedCleanup = createRetainedCleanup(prepared.cleanup);\n try {\n const plugins = await discoverPluginsAsync(prepared.basePath);\n return {\n kind: \"prepared\",\n basePath: prepared.basePath,\n plugins,\n cleanupNow: retainedCleanup.cleanupNow,\n retainCleanup: retainedCleanup.retainCleanup,\n };\n } catch (error) {\n retainedCleanup.cleanupNow();\n throw error;\n }\n}\n\nfunction resolveSafeRealPath(inputPath: string): string {\n try {\n return fs.realpathSync(inputPath);\n } catch {\n return path.resolve(inputPath);\n }\n}\n\nfunction isLocalSymlinkSource(localPath: string): boolean {\n try {\n if (!fs.existsSync(localPath)) {\n return false;\n }\n return fs.lstatSync(localPath).isSymbolicLink();\n } catch {\n return false;\n }\n}\n\nasync function buildRefreshedSourceMetadata(\n entry: LockEntry,\n resolved: PluginSourceCandidate,\n cachedSource: CachedSource,\n sourceHash: string,\n): Promise<NonNullable<PluginAssessment[\"refreshedSource\"]>> {\n if (entry.source.type === \"local\") {\n const canonical = entry.source.canonical || entry.source.input;\n return {\n canonical,\n resolvedPath: resolveSafeRealPath(resolved.plugin.path),\n isSymlinkSource: isLocalSymlinkSource(canonical),\n sourcePluginPath: resolved.sourcePluginPath,\n };\n }\n\n if (entry.source.type === \"git\" || entry.source.type === \"github\") {\n const nextPinnedRef =\n cachedSource.kind === \"prepared\"\n ? await resolveGitHeadRefAsync(cachedSource.basePath)\n : entry.source.pinnedRef;\n return {\n canonical: entry.source.canonical,\n pinnedRef: nextPinnedRef,\n sourcePluginPath: resolved.sourcePluginPath,\n };\n }\n\n const canonical = resolved.wellKnownSourceUrl || entry.source.canonical;\n return {\n canonical,\n pinnedRef: sourceHash,\n wellKnownSourceUrl: resolved.wellKnownSourceUrl,\n };\n}\n\nfunction resolveCandidateFromCachedSource(\n entry: LockEntry,\n cachedSource: CachedSource,\n keepResolved: boolean,\n): PluginSourceCandidate {\n if (cachedSource.kind === \"remote\") {\n const matched = cachedSource.remotePlugins.find(\n (item) => item.installName === entry.source.selector.skillName,\n );\n if (!matched) {\n throw new Error(`Plugin '${entry.source.selector.skillName}' not found in well-known source`);\n }\n\n const staged = stageRemotePluginFilesToTempDir(matched.installName, matched.files);\n return {\n plugin: {\n name: matched.installName,\n description: matched.description,\n path: path.join(staged.path, \"plugins\", matched.installName),\n },\n wellKnownSourceUrl: matched.sourceUrl,\n cleanup: staged.cleanup,\n };\n }\n\n const matched = entry.source.selector.relativePath\n ? cachedSource.plugins.find(\n (item) =>\n path.resolve(item.path) ===\n path.resolve(path.join(cachedSource.basePath, entry.source.selector.relativePath!)),\n )\n : cachedSource.plugins.find((item) => item.name === entry.source.selector.skillName);\n\n if (!matched) {\n throw new Error(`Plugin '${entry.source.selector.skillName}' not found in source`);\n }\n\n return {\n plugin: matched,\n sourcePluginPath: path.relative(cachedSource.basePath, matched.path) || \".\",\n cleanup: keepResolved ? cachedSource.retainCleanup() : undefined,\n };\n}\n\nexport async function assessPluginLockEntries(\n options: PluginCheckOptions,\n cwd: string,\n behavior: { keepResolved: boolean } = { keepResolved: false },\n): Promise<{\n drift: DriftRecord[];\n checked: number;\n assessments: PluginAssessment[];\n}> {\n const lock = readResourceLockfile(\"plugin\", Boolean(options.global), cwd);\n const entries = lock.entries.filter((entry) => includeByPlugin(entry, options.plugin));\n const drift: DriftRecord[] = [];\n const assessments: PluginAssessment[] = [];\n const sourceOptions: AddOptions = {\n global: options.global,\n allowHost: options.allowHost,\n denyHost: options.denyHost,\n maxDownloadBytes: options.maxDownloadBytes,\n policyMode: options.policyMode,\n experimental: options.experimental,\n };\n const sourceCache = new Map<string, Promise<CachedSource>>();\n\n const getCachedSource = (entry: LockEntry): Promise<CachedSource> => {\n const key = buildSourceLoadCacheKey(entry.source);\n const existing = sourceCache.get(key);\n if (existing) {\n return existing;\n }\n\n const created = loadCachedSource(entry, sourceOptions);\n sourceCache.set(key, created);\n return created;\n };\n\n try {\n for (const entry of entries) {\n const assessment: PluginAssessment = {\n entry,\n drift: [],\n };\n\n if (!fs.existsSync(entry.canonicalDir) || !fs.statSync(entry.canonicalDir).isDirectory()) {\n const row: DriftRecord = {\n skillName: entry.skillName,\n kind: \"local-modified\",\n detail: \"canonical directory is missing\",\n };\n drift.push(row);\n assessment.drift.push(row);\n assessments.push(assessment);\n continue;\n }\n\n const installedHash = unwrapAsyncResult(\n await toAsyncResult(hashDirectoryAsync(entry.canonicalDir)),\n );\n if (installedHash !== entry.installedHash) {\n const row: DriftRecord = {\n skillName: entry.skillName,\n kind: \"local-modified\",\n detail: \"installed content differs from lockfile hash\",\n };\n drift.push(row);\n assessment.drift.push(row);\n }\n\n const metadataIssue = resolveSourceMetadataIssue(entry);\n if (metadataIssue) {\n const row: DriftRecord = {\n skillName: entry.skillName,\n kind: \"migrate-required\",\n detail: metadataIssue,\n };\n drift.push(row);\n assessment.drift.push(row);\n assessments.push(assessment);\n continue;\n }\n\n let resolved: PluginSourceCandidate | undefined;\n try {\n const cachedSource = unwrapAsyncResult(await toAsyncResult(getCachedSource(entry)));\n resolved = resolveCandidateFromCachedSource(entry, cachedSource, behavior.keepResolved);\n\n if (entry.source.type === \"local\") {\n const currentResolvedPath = fs.realpathSync(resolved.plugin.path);\n if (currentResolvedPath !== path.resolve(entry.source.resolvedPath!)) {\n const row: DriftRecord = {\n skillName: entry.skillName,\n kind: \"migrate-required\",\n detail: `local source identity changed; run ${migrateHint(entry.skillName)}`,\n };\n drift.push(row);\n assessment.drift.push(row);\n if (resolved.cleanup && !behavior.keepResolved) {\n resolved.cleanup();\n resolved = undefined;\n }\n assessments.push(assessment);\n continue;\n }\n }\n\n const sourceHash = await hashDirectoryAsync(resolved.plugin.path);\n assessment.sourceHash = sourceHash;\n assessment.refreshedSource = await buildRefreshedSourceMetadata(\n entry,\n resolved,\n cachedSource,\n sourceHash,\n );\n if (sourceHash !== entry.sourceHash) {\n const row: DriftRecord = {\n skillName: entry.skillName,\n kind: \"changed-source\",\n detail: \"source hash changed\",\n };\n drift.push(row);\n assessment.drift.push(row);\n }\n\n if (behavior.keepResolved) {\n assessment.resolved = resolved;\n }\n } catch (error) {\n const asText = error instanceof Error ? error.message : String(error);\n const migrateRequired =\n entry.source.type === \"local\" &&\n (asText.includes(\"Local source not found\") || asText.includes(\"not found in source\"));\n const row: DriftRecord = {\n skillName: entry.skillName,\n kind: migrateRequired ? \"migrate-required\" : \"missing-source\",\n detail: migrateRequired\n ? `local source identity changed; run ${migrateHint(entry.skillName)}`\n : asText,\n };\n drift.push(row);\n assessment.drift.push(row);\n } finally {\n if (resolved?.cleanup && !behavior.keepResolved) {\n resolved.cleanup();\n }\n }\n\n assessments.push(assessment);\n }\n\n const canonical = listCanonicalResourceDirs(\"plugin\", Boolean(options.global), cwd);\n const lockNames = new Set(lock.entries.map((item) => item.skillName));\n for (const pluginName of canonical) {\n if (\n !lockNames.has(pluginName) &&\n includeByPlugin({ skillName: pluginName } as LockEntry, options.plugin)\n ) {\n drift.push({\n skillName: pluginName,\n kind: \"lock-missing\",\n detail: \"installed plugin is not tracked in lockfile\",\n });\n }\n }\n\n return { drift, checked: entries.length, assessments };\n } finally {\n if (!behavior.keepResolved) {\n for (const cachedSourcePromise of sourceCache.values()) {\n const cachedSource = await cachedSourcePromise.catch(() => null);\n if (cachedSource?.kind === \"prepared\") {\n cachedSource.cleanupNow();\n }\n }\n }\n }\n}\n\nexport async function collectPluginDrift(\n options: PluginCheckOptions,\n cwd: string,\n): Promise<{ drift: DriftRecord[]; checked: number }> {\n const assessed = await assessPluginLockEntries(options, cwd, {\n keepResolved: false,\n });\n return { drift: assessed.drift, checked: assessed.checked };\n}\n", "import fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { Plugin } from \"../contracts/runtime-types\";\nimport { stageRemoteSkillFilesToTempDir, type RemoteStagingResult } from \"./skills\";\n\nconst SKIP_DIRS = new Set([\".git\", \"node_modules\", \"dist\", \"build\", \"__pycache__\"]);\n\ntype PluginManifest = {\n name: string;\n description?: string;\n};\n\ntype PluginInspection = {\n pluginName: string;\n pluginDir: string;\n plugin?: Plugin;\n error?: Error;\n};\n\ntype ManifestCandidate = {\n description: string;\n relativePath: string;\n};\n\nfunction resolvePluginsRootFromStat(basePath: string, stat: fs.Stats): string {\n if (stat.isDirectory() && path.basename(basePath) === \"plugins\") {\n return basePath;\n }\n\n const pluginsDir = path.join(basePath, \"plugins\");\n if (fs.existsSync(pluginsDir) && fs.statSync(pluginsDir).isDirectory()) {\n return pluginsDir;\n }\n\n throw new Error(\"No plugins directory found in source\");\n}\n\nexport function resolvePluginsRoot(basePath: string): string {\n if (!fs.existsSync(basePath)) {\n throw new Error(`Local source not found: ${basePath}`);\n }\n return resolvePluginsRootFromStat(basePath, fs.statSync(basePath));\n}\n\nasync function resolvePluginsRootAsync(basePath: string): Promise<string> {\n let stat: fs.Stats;\n try {\n stat = await fs.promises.stat(basePath);\n } catch {\n throw new Error(`Local source not found: ${basePath}`);\n }\n\n if (stat.isDirectory() && path.basename(basePath) === \"plugins\") {\n return basePath;\n }\n\n const pluginsDir = path.join(basePath, \"plugins\");\n try {\n const pluginsStat = await fs.promises.stat(pluginsDir);\n if (pluginsStat.isDirectory()) {\n return pluginsDir;\n }\n } catch {\n // handled below\n }\n\n throw new Error(\"No plugins directory found in source\");\n}\n\nfunction collectPluginJsonFilesRecursive(dir: string, pluginRoot: string, out: string[]): void {\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n if (SKIP_DIRS.has(entry.name)) {\n continue;\n }\n\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n collectPluginJsonFilesRecursive(fullPath, pluginRoot, out);\n continue;\n }\n\n if (entry.isFile() && path.basename(fullPath).toLowerCase() === \"plugin.json\") {\n out.push(path.relative(pluginRoot, fullPath));\n }\n }\n}\n\nasync function collectPluginJsonFilesRecursiveAsync(\n dir: string,\n pluginRoot: string,\n out: string[],\n): Promise<void> {\n const entries = await fs.promises.readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n if (SKIP_DIRS.has(entry.name)) {\n continue;\n }\n\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n await collectPluginJsonFilesRecursiveAsync(fullPath, pluginRoot, out);\n continue;\n }\n\n if (entry.isFile() && path.basename(fullPath).toLowerCase() === \"plugin.json\") {\n out.push(path.relative(pluginRoot, fullPath));\n }\n }\n}\n\nfunction parsePluginManifest(manifestPath: string, pluginName: string): PluginManifest {\n let parsed: unknown;\n try {\n parsed = JSON.parse(fs.readFileSync(manifestPath, \"utf8\")) as unknown;\n } catch {\n throw new Error(`Plugin '${pluginName}' has invalid plugin.json`);\n }\n\n if (!parsed || typeof parsed !== \"object\") {\n throw new Error(`Plugin '${pluginName}' has invalid plugin.json`);\n }\n\n const data = parsed as Record<string, unknown>;\n if (typeof data.name !== \"string\" || data.name.trim().length === 0) {\n throw new Error(`Plugin '${pluginName}' plugin.json is missing name`);\n }\n\n if (data.name !== pluginName) {\n throw new Error(`Plugin '${pluginName}' plugin.json name must match plugin folder name`);\n }\n\n return {\n name: data.name,\n description: typeof data.description === \"string\" ? data.description : undefined,\n };\n}\n\nasync function parsePluginManifestAsync(\n manifestPath: string,\n pluginName: string,\n): Promise<PluginManifest> {\n let parsed: unknown;\n try {\n parsed = JSON.parse(await fs.promises.readFile(manifestPath, \"utf8\")) as unknown;\n } catch {\n throw new Error(`Plugin '${pluginName}' has invalid plugin.json`);\n }\n\n if (!parsed || typeof parsed !== \"object\") {\n throw new Error(`Plugin '${pluginName}' has invalid plugin.json`);\n }\n\n const data = parsed as Record<string, unknown>;\n if (typeof data.name !== \"string\" || data.name.trim().length === 0) {\n throw new Error(`Plugin '${pluginName}' plugin.json is missing name`);\n }\n\n if (data.name !== pluginName) {\n throw new Error(`Plugin '${pluginName}' plugin.json name must match plugin folder name`);\n }\n\n return {\n name: data.name,\n description: typeof data.description === \"string\" ? data.description : undefined,\n };\n}\n\nfunction sortManifestCandidates(a: string, b: string): number {\n const depthA = a.split(path.sep).length;\n const depthB = b.split(path.sep).length;\n if (depthA !== depthB) {\n return depthA - depthB;\n }\n return a.localeCompare(b);\n}\n\nfunction inspectPluginFolder(pluginDir: string): PluginInspection {\n const pluginName = path.basename(pluginDir);\n const pluginJsonRelativePaths: string[] = [];\n collectPluginJsonFilesRecursive(pluginDir, pluginDir, pluginJsonRelativePaths);\n pluginJsonRelativePaths.sort(sortManifestCandidates);\n\n if (pluginJsonRelativePaths.length === 0) {\n return {\n pluginName,\n pluginDir,\n error: new Error(`Plugin '${pluginName}' is missing plugin.json`),\n };\n }\n\n const manifests: ManifestCandidate[] = [];\n try {\n for (const relativePath of pluginJsonRelativePaths) {\n const manifest = parsePluginManifest(path.join(pluginDir, relativePath), pluginName);\n manifests.push({\n description: manifest.description || \"\",\n relativePath,\n });\n }\n } catch (error) {\n return {\n pluginName,\n pluginDir,\n error: error instanceof Error ? error : new Error(String(error)),\n };\n }\n\n const selectedManifest = manifests[0];\n return {\n pluginName,\n pluginDir,\n plugin: {\n name: pluginName,\n description: selectedManifest?.description || \"\",\n path: pluginDir,\n },\n };\n}\n\nasync function inspectPluginFolderAsync(pluginDir: string): Promise<PluginInspection> {\n const pluginName = path.basename(pluginDir);\n const pluginJsonRelativePaths: string[] = [];\n await collectPluginJsonFilesRecursiveAsync(pluginDir, pluginDir, pluginJsonRelativePaths);\n pluginJsonRelativePaths.sort(sortManifestCandidates);\n\n if (pluginJsonRelativePaths.length === 0) {\n return {\n pluginName,\n pluginDir,\n error: new Error(`Plugin '${pluginName}' is missing plugin.json`),\n };\n }\n\n const manifests: ManifestCandidate[] = [];\n try {\n for (const relativePath of pluginJsonRelativePaths) {\n const manifest = await parsePluginManifestAsync(\n path.join(pluginDir, relativePath),\n pluginName,\n );\n manifests.push({\n description: manifest.description || \"\",\n relativePath,\n });\n }\n } catch (error) {\n return {\n pluginName,\n pluginDir,\n error: error instanceof Error ? error : new Error(String(error)),\n };\n }\n\n const selectedManifest = manifests[0];\n return {\n pluginName,\n pluginDir,\n plugin: {\n name: pluginName,\n description: selectedManifest?.description || \"\",\n path: pluginDir,\n },\n };\n}\n\nfunction filterRequestedPluginErrors(\n requestedPlugins: string[] | undefined,\n inspections: PluginInspection[],\n): void {\n if (!requestedPlugins || requestedPlugins.length === 0) {\n return;\n }\n if (requestedPlugins.includes(\"*\")) {\n return;\n }\n\n const inspectionByName = new Map(\n inspections.map((inspection) => [inspection.pluginName, inspection]),\n );\n\n for (const requestedPlugin of requestedPlugins) {\n const inspection = inspectionByName.get(requestedPlugin);\n if (inspection?.error) {\n throw inspection.error;\n }\n }\n}\n\nexport function discoverPlugins(basePath: string, requestedPlugins?: string[]): Plugin[] {\n const pluginsRoot = resolvePluginsRoot(basePath);\n const entries = fs.readdirSync(pluginsRoot, { withFileTypes: true });\n const inspections = entries\n .filter((entry) => entry.isDirectory())\n .map((entry) => inspectPluginFolder(path.join(pluginsRoot, entry.name)));\n\n filterRequestedPluginErrors(requestedPlugins, inspections);\n\n return filterPluginsByName(\n inspections\n .map((inspection) => inspection.plugin)\n .filter((plugin): plugin is Plugin => Boolean(plugin)),\n requestedPlugins,\n );\n}\n\nexport async function discoverPluginsAsync(\n basePath: string,\n requestedPlugins?: string[],\n): Promise<Plugin[]> {\n const pluginsRoot = await resolvePluginsRootAsync(basePath);\n const entries = await fs.promises.readdir(pluginsRoot, {\n withFileTypes: true,\n });\n\n const inspections = await Promise.all(\n entries\n .filter((entry) => entry.isDirectory())\n .map((entry) => inspectPluginFolderAsync(path.join(pluginsRoot, entry.name))),\n );\n\n filterRequestedPluginErrors(requestedPlugins, inspections);\n\n return filterPluginsByName(\n inspections\n .map((inspection) => inspection.plugin)\n .filter((plugin): plugin is Plugin => Boolean(plugin)),\n requestedPlugins,\n );\n}\n\nexport function filterPluginsByName(plugins: Plugin[], requested?: string[]): Plugin[] {\n if (!requested || requested.length === 0) {\n return plugins;\n }\n\n if (requested.includes(\"*\")) {\n return plugins;\n }\n\n const wanted = new Set(requested.map((item) => item.toLowerCase()));\n return plugins.filter((plugin) => wanted.has(plugin.name.toLowerCase()));\n}\n\nexport function stageRemotePluginFilesToTempDir(\n pluginName: string,\n files: Map<string, string>,\n): RemoteStagingResult {\n const prefixed = new Map<string, string>();\n for (const [relativePath, content] of files.entries()) {\n prefixed.set(path.join(\"plugins\", pluginName, relativePath), content);\n }\n\n return stageRemoteSkillFilesToTempDir(prefixed, {\n prefix: \"skillspp-remote-plugin-\",\n });\n}\n", "import fs from \"node:fs\";\nimport path from \"node:path\";\nimport os from \"node:os\";\nimport matter from \"gray-matter\";\nimport { parseSource } from \"../sources/source-parser\";\nimport { prepareSourceDir } from \"../sources/git\";\nimport { discoverSkills, stageRemoteSkillFilesToTempDir } from \"../sources/skills\";\nimport {\n classifyDependencySource,\n cleanupPreparedInstallerArtifacts,\n isInstallerPolicyError,\n isInstallerSecurityError,\n loadInstallerConfig,\n prepareInstallerArtifacts,\n} from \"./skill-installer\";\nimport { evaluateInstallerLocalDependencyPolicy, type PolicyMode } from \"./policy\";\nimport { resolveCatalogSkills, resolveWellKnownSkills } from \"../sources/source-resolution\";\nimport type { AddOptions } from \"../contracts/runtime-types\";\nimport { CoreError } from \"../contracts/errors/core-error\";\n\ntype Severity = \"error\" | \"warning\";\n\nexport type ValidateDiagnostic = {\n severity: Severity;\n skill: string;\n file: string;\n rule: string;\n message: string;\n};\n\nexport type ValidateOptions = {\n source?: string;\n json?: boolean;\n strict?: boolean;\n ci?: boolean;\n roots?: string[];\n allowHost?: string[];\n denyHost?: string[];\n maxDownloadBytes?: number;\n maxLines?: number;\n maxDescriptionChars?: number;\n policyMode?: PolicyMode;\n experimental?: boolean;\n};\n\ntype ValidateThresholds = {\n maxLines: number;\n maxDescriptionChars: number;\n};\n\nexport type ValidateRunResult = {\n diagnostics: ValidateDiagnostic[];\n};\n\ntype TypeRule = {\n id: string;\n when: (frontmatter: Record<string, unknown>) => boolean;\n validate: (ctx: {\n skillDir: string;\n skillName: string;\n diagnostics: ValidateDiagnostic[];\n }) => void;\n};\n\nconst DEFAULT_MAX_LINES = 500;\nconst DEFAULT_MAX_DESCRIPTION = 1024;\n\nfunction resolveThresholds(options: ValidateOptions): ValidateThresholds {\n return {\n maxLines: options.maxLines || DEFAULT_MAX_LINES,\n maxDescriptionChars: options.maxDescriptionChars || DEFAULT_MAX_DESCRIPTION,\n };\n}\n\nfunction addDiagnostic(list: ValidateDiagnostic[], diagnostic: ValidateDiagnostic): void {\n list.push(diagnostic);\n}\n\nfunction discoverMarkdownReferences(content: string): string[] {\n const refs = new Set<string>();\n\n const markdownLinkPattern = /\\[[^\\]]+\\]\\(([^)]+)\\)/g;\n let match: RegExpExecArray | null;\n while ((match = markdownLinkPattern.exec(content)) !== null) {\n const value = match[1].trim();\n if (\n !value ||\n value.startsWith(\"http://\") ||\n value.startsWith(\"https://\") ||\n value.startsWith(\"#\")\n ) {\n continue;\n }\n refs.add(value);\n }\n\n return [...refs];\n}\n\nconst typeRules: TypeRule[] = [\n {\n id: \"framework-references-dir\",\n when: (frontmatter) => frontmatter.type === \"framework\",\n validate: ({ skillDir, skillName, diagnostics }) => {\n const referencesDir = path.join(skillDir, \"references\");\n if (!fs.existsSync(referencesDir) || !fs.statSync(referencesDir).isDirectory()) {\n addDiagnostic(diagnostics, {\n severity: \"error\",\n skill: skillName,\n file: referencesDir,\n rule: \"framework-references-required\",\n message: \"framework skills must contain a references directory\",\n });\n }\n },\n },\n];\n\nasync function validateInstallerDependencies(\n skillDir: string,\n sourceRoot: string,\n diagnostics: ValidateDiagnostic[],\n skillName: string,\n): Promise<void> {\n const installerConfigPath = fs.existsSync(path.join(skillDir, \"skill-installer.yaml\"))\n ? path.join(skillDir, \"skill-installer.yaml\")\n : path.join(skillDir, \"skill-installer.json\");\n\n try {\n const installer = loadInstallerConfig(skillDir);\n const fallbackRoots = Array.from(\n new Set([path.resolve(sourceRoot), path.resolve(process.cwd())]),\n );\n let hasSecurityViolation = false;\n\n for (const dep of installer.dependencies) {\n const source = typeof dep === \"string\" ? dep : dep.source;\n const kind = classifyDependencySource(source);\n if (kind !== \"local\") {\n continue;\n }\n\n let accepted = false;\n let securityViolation:\n | {\n rule: string;\n message: string;\n severity: \"error\" | \"warning\";\n blocking: boolean;\n }\n | undefined;\n for (const root of fallbackRoots) {\n const evaluated = evaluateInstallerLocalDependencyPolicy(\n {\n source,\n sourceRoot: root,\n },\n \"enforce\",\n );\n if (evaluated.ok) {\n accepted = true;\n break;\n } else {\n securityViolation = \"violation\" in evaluated ? evaluated.violation : undefined;\n }\n }\n\n if (!accepted && securityViolation) {\n hasSecurityViolation = true;\n addDiagnostic(diagnostics, {\n severity: securityViolation.severity,\n skill: skillName,\n file: installerConfigPath,\n rule: securityViolation.rule,\n message: securityViolation.message,\n });\n }\n }\n\n if (hasSecurityViolation) {\n return;\n }\n\n const tempSkillDir = fs.mkdtempSync(path.join(os.tmpdir(), \"skillspp-validate-installer-\"));\n try {\n const filesToCopy = [\"SKILL.md\", \"skill-installer.yaml\", \"skill-installer.json\"];\n for (const fileName of filesToCopy) {\n const src = path.join(skillDir, fileName);\n if (fs.existsSync(src) && fs.statSync(src).isFile()) {\n fs.copyFileSync(src, path.join(tempSkillDir, fileName));\n }\n }\n\n const agentsDir = path.join(skillDir, \"agents\");\n if (fs.existsSync(agentsDir) && fs.statSync(agentsDir).isDirectory()) {\n fs.cpSync(agentsDir, path.join(tempSkillDir, \"agents\"), {\n recursive: true,\n force: true,\n });\n }\n\n let preparedSuccess = false;\n let lastMissingSourceError: unknown;\n let securityError: unknown;\n\n for (const root of fallbackRoots) {\n try {\n const prepared = await prepareInstallerArtifacts(tempSkillDir, root, {\n sourceType: \"local\",\n allowHookCommands: false,\n policyMode: \"enforce\",\n });\n cleanupPreparedInstallerArtifacts(prepared);\n preparedSuccess = true;\n break;\n } catch (error) {\n if (isInstallerSecurityError(error)) {\n securityError = error;\n break;\n }\n if (isInstallerPolicyError(error)) {\n securityError = error;\n break;\n }\n const message = error instanceof Error ? error.message : String(error);\n if (message.includes(\"(local) source not found\")) {\n lastMissingSourceError = error;\n continue;\n }\n throw error;\n }\n }\n\n if (!preparedSuccess && securityError) {\n throw securityError;\n }\n if (!preparedSuccess && lastMissingSourceError) {\n throw lastMissingSourceError;\n }\n } finally {\n fs.rmSync(tempSkillDir, { recursive: true, force: true });\n }\n } catch (error) {\n if (isInstallerSecurityError(error)) {\n addDiagnostic(diagnostics, {\n severity: error.violation.severity,\n skill: skillName,\n file: installerConfigPath,\n rule: error.violation.rule,\n message: error.violation.message,\n });\n return;\n }\n if (isInstallerPolicyError(error)) {\n addDiagnostic(diagnostics, {\n severity: \"error\",\n skill: skillName,\n file: installerConfigPath,\n rule: error.violation.rule,\n message: error.violation.message,\n });\n return;\n }\n\n addDiagnostic(diagnostics, {\n severity: \"warning\",\n skill: skillName,\n file: installerConfigPath,\n rule: \"missing-installer-local-dependency\",\n message: error instanceof Error ? error.message : String(error),\n });\n }\n}\n\nasync function validateSkillDir(\n skillDir: string,\n sourceRoot: string,\n diagnostics: ValidateDiagnostic[],\n strict: boolean,\n thresholds: ValidateThresholds,\n): Promise<void> {\n const skillMd = path.join(skillDir, \"SKILL.md\");\n const skillName = path.basename(skillDir);\n\n if (!fs.existsSync(skillMd)) {\n addDiagnostic(diagnostics, {\n severity: \"error\",\n skill: skillName,\n file: skillMd,\n rule: \"missing-skill-md\",\n message: \"SKILL.md is required\",\n });\n return;\n }\n\n const content = fs.readFileSync(skillMd, \"utf8\");\n const lines = content.split(/\\r?\\n/);\n\n if (lines.length > thresholds.maxLines) {\n addDiagnostic(diagnostics, {\n severity: strict ? \"error\" : \"warning\",\n skill: skillName,\n file: skillMd,\n rule: \"line-budget\",\n message: `SKILL.md has ${lines.length} lines (limit ${thresholds.maxLines})`,\n });\n }\n\n let parsed;\n try {\n parsed = matter(content);\n } catch (error) {\n addDiagnostic(diagnostics, {\n severity: \"error\",\n skill: skillName,\n file: skillMd,\n rule: \"invalid-frontmatter\",\n message: error instanceof Error ? error.message : \"frontmatter parsing failed\",\n });\n return;\n }\n\n const data = (parsed.data || {}) as Record<string, unknown>;\n const name = data.name;\n const description = data.description;\n\n if (typeof name !== \"string\" || !name.trim()) {\n addDiagnostic(diagnostics, {\n severity: \"error\",\n skill: skillName,\n file: skillMd,\n rule: \"missing-name\",\n message: \"frontmatter field 'name' is required\",\n });\n }\n\n if (typeof description !== \"string\" || !description.trim()) {\n addDiagnostic(diagnostics, {\n severity: \"error\",\n skill: skillName,\n file: skillMd,\n rule: \"missing-description\",\n message: \"frontmatter field 'description' is required\",\n });\n } else if (description.length > thresholds.maxDescriptionChars) {\n addDiagnostic(diagnostics, {\n severity: strict ? \"error\" : \"warning\",\n skill: skillName,\n file: skillMd,\n rule: \"description-budget\",\n message: `description has ${description.length} chars (limit ${thresholds.maxDescriptionChars})`,\n });\n }\n\n if (typeof name === \"string\" && name.trim()) {\n const normalized = name\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9._-]+/g, \"-\")\n .replace(/^[.-]+|[.-]+$/g, \"\");\n if (normalized && normalized !== skillName.toLowerCase()) {\n addDiagnostic(diagnostics, {\n severity: \"error\",\n skill: skillName,\n file: skillMd,\n rule: \"name-path-mismatch\",\n message: `frontmatter name '${name}' does not match directory '${skillName}'`,\n });\n }\n }\n\n for (const ref of discoverMarkdownReferences(content)) {\n const resolved = path.resolve(skillDir, ref);\n const rel = path.relative(skillDir, resolved);\n if (!rel || rel.startsWith(\"..\") || path.isAbsolute(rel)) {\n continue;\n }\n if (!fs.existsSync(resolved)) {\n addDiagnostic(diagnostics, {\n severity: \"error\",\n skill: skillName,\n file: skillMd,\n rule: \"missing-reference\",\n message: `referenced path not found: ${ref}`,\n });\n }\n }\n\n for (const rule of typeRules) {\n if (rule.when(data)) {\n rule.validate({ skillDir, skillName, diagnostics });\n }\n }\n\n await validateInstallerDependencies(skillDir, sourceRoot, diagnostics, skillName);\n}\n\nasync function stageAndValidateLocalRoot(\n rootPath: string,\n dependencyRoot: string,\n seenSkillPaths: Set<string>,\n diagnostics: ValidateDiagnostic[],\n strict: boolean,\n thresholds: ValidateThresholds,\n emitProgress?: (label: string) => Promise<void> | void,\n): Promise<void> {\n const resolvedRoot = path.resolve(rootPath);\n if (!fs.existsSync(resolvedRoot) || !fs.statSync(resolvedRoot).isDirectory()) {\n addDiagnostic(diagnostics, {\n severity: \"error\",\n skill: path.basename(resolvedRoot),\n file: resolvedRoot,\n rule: \"missing-root\",\n message: \"validation root does not exist\",\n });\n return;\n }\n\n await emitProgress?.(\"discovering candidate skills\");\n const skills = discoverSkills(resolvedRoot);\n if (skills.length === 0) {\n addDiagnostic(diagnostics, {\n severity: \"error\",\n skill: path.basename(resolvedRoot),\n file: resolvedRoot,\n rule: \"no-skills-discovered\",\n message: \"no SKILL.md files discovered\",\n });\n return;\n }\n\n for (const skill of skills) {\n const resolvedSkillPath = path.resolve(skill.path);\n if (seenSkillPaths.has(resolvedSkillPath)) {\n continue;\n }\n seenSkillPaths.add(resolvedSkillPath);\n await emitProgress?.(`validating ${skill.name}`);\n await validateSkillDir(skill.path, dependencyRoot, diagnostics, strict, thresholds);\n }\n}\n\nasync function stageAndValidateSource(\n options: ValidateOptions,\n diagnostics: ValidateDiagnostic[],\n thresholds: ValidateThresholds,\n emitProgress?: (label: string) => Promise<void> | void,\n): Promise<void> {\n if (!options.source) {\n throw new CoreError({\n code: \"VALIDATION_MISSING_SOURCE\",\n message: \"validate requires a source unless CI mode is enabled\",\n });\n }\n\n await emitProgress?.(\"parsing source\");\n const parsed = parseSource(options.source);\n if (parsed.type === \"well-known\" || parsed.type === \"catalog\") {\n await emitProgress?.(\"discovering candidate skills\");\n const remote =\n parsed.type === \"well-known\"\n ? await resolveWellKnownSkills(parsed.url, {\n allowHost: options.allowHost,\n denyHost: options.denyHost,\n maxDownloadBytes: options.maxDownloadBytes,\n experimental: options.experimental,\n } as AddOptions)\n : await resolveCatalogSkills(parsed.url, {\n allowHost: options.allowHost,\n denyHost: options.denyHost,\n maxDownloadBytes: options.maxDownloadBytes,\n experimental: options.experimental,\n } as AddOptions);\n\n if (remote.length === 0) {\n addDiagnostic(diagnostics, {\n severity: \"error\",\n skill: parsed.url,\n file: parsed.url,\n rule: \"no-skills-discovered\",\n message: \"no SKILL.md files discovered\",\n });\n return;\n }\n\n const stagedRoots: Array<{ path: string; cleanup: () => void }> = [];\n try {\n for (const remoteSkill of remote) {\n const staged = stageRemoteSkillFilesToTempDir(remoteSkill.files, {\n prefix: \"skillspp-validate-\",\n });\n stagedRoots.push(staged);\n\n await emitProgress?.(`validating ${remoteSkill.installName}`);\n await validateSkillDir(\n staged.path,\n staged.path,\n diagnostics,\n Boolean(options.strict),\n thresholds,\n );\n }\n } finally {\n for (const staged of stagedRoots) {\n staged.cleanup();\n }\n }\n\n return;\n }\n\n const staged = prepareSourceDir(parsed);\n try {\n await emitProgress?.(\"staging source\");\n await stageAndValidateLocalRoot(\n staged.basePath,\n staged.basePath,\n new Set<string>(),\n diagnostics,\n Boolean(options.strict),\n thresholds,\n emitProgress,\n );\n } finally {\n if (staged.cleanup) {\n staged.cleanup();\n }\n }\n}\n\nexport async function runValidateAnalysis(\n options: ValidateOptions,\n emitProgress?: (label: string) => Promise<void> | void,\n): Promise<ValidateRunResult> {\n const diagnostics: ValidateDiagnostic[] = [];\n const thresholds = resolveThresholds(options);\n const seenSkillPaths = new Set<string>();\n\n if (options.ci) {\n await emitProgress?.(\"staging source\");\n const roots = options.roots && options.roots.length > 0 ? options.roots : [process.cwd()];\n if (roots.length === 0) {\n throw new Error(\"No CI roots found to validate\");\n }\n\n await emitProgress?.(\"discovering candidate skills\");\n for (const root of roots) {\n await stageAndValidateLocalRoot(\n root,\n process.cwd(),\n seenSkillPaths,\n diagnostics,\n Boolean(options.strict),\n thresholds,\n emitProgress,\n );\n }\n } else {\n await stageAndValidateSource(options, diagnostics, thresholds, emitProgress);\n }\n\n await emitProgress?.(\"collecting diagnostics\");\n\n return { diagnostics };\n}\n", "import { spawnSync } from \"node:child_process\";\nimport fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport YAML from \"yaml\";\nimport { z } from \"zod\";\nimport {\n type PolicyMode,\n evaluateHookTrustPolicy,\n evaluateInstallerLocalDependencyPolicy,\n} from \"./policy\";\nimport { type InstallerSecurityViolation } from \"./installer-security\";\n\ntype DependencyObject = {\n source: string;\n path: string;\n};\n\ntype Dependency = string | DependencyObject;\n\ntype InstallerConfig = {\n schemaVersion: 1;\n preInstall: string[];\n dependencies: Dependency[];\n postInstall: string[];\n};\n\nexport type InstallerRuntimeEvent = {\n level: \"info\" | \"warning\";\n message: string;\n};\n\ntype SkillInstallerRuntimeOptions = {\n sourceType?: \"local\" | \"github\" | \"git\" | \"well-known\" | \"catalog\";\n allowHookCommands?: boolean;\n policyMode?: PolicyMode;\n trustWellKnown?: boolean;\n};\n\ntype LocalPreparedDependency = {\n kind: \"local\";\n index: number;\n targetPath: string;\n sourcePath: string;\n sourceLabel: string;\n};\n\ntype RemotePreparedDependency = {\n kind: \"remote-bytes\";\n index: number;\n targetPath: string;\n remoteBufferPath: string;\n sourceLabel: string;\n};\n\ntype RepoPreparedDependency = {\n kind: \"repo-staged\";\n index: number;\n targetPath: string;\n repoStagePath: string;\n sourceLabel: string;\n};\n\ntype PreparedDependency =\n | LocalPreparedDependency\n | RemotePreparedDependency\n | RepoPreparedDependency;\n\nexport class InstallerSecurityError extends Error {\n violation: InstallerSecurityViolation;\n\n constructor(violation: InstallerSecurityViolation) {\n super(violation.message);\n this.name = \"InstallerSecurityError\";\n this.violation = violation;\n }\n}\n\nexport function isInstallerSecurityError(error: unknown): error is InstallerSecurityError {\n return error instanceof InstallerSecurityError;\n}\n\nexport class InstallerPolicyError extends Error {\n violation: {\n rule: string;\n message: string;\n severity: \"error\" | \"warning\";\n blocking: boolean;\n };\n\n constructor(violation: {\n rule: string;\n message: string;\n severity: \"error\" | \"warning\";\n blocking: boolean;\n }) {\n super(violation.message);\n this.name = \"InstallerPolicyError\";\n this.violation = violation;\n }\n}\n\nexport function isInstallerPolicyError(error: unknown): error is InstallerPolicyError {\n return error instanceof InstallerPolicyError;\n}\n\nexport type PreparedInstallerArtifacts = {\n preInstall: string[];\n postInstall: string[];\n preparedDependencies: PreparedDependency[];\n stagingDir: string;\n events: InstallerRuntimeEvent[];\n};\n\nconst dependencyObjectSchema = z\n .object({\n source: z.string().min(1),\n path: z.string().min(1),\n })\n .strict();\n\nconst installerConfigSchema = z\n .object({\n schemaVersion: z.literal(1),\n \"pre-install\": z.array(z.string().min(1)).optional().default([]),\n dependencies: z\n .array(z.union([z.string().min(1), dependencyObjectSchema]))\n .optional()\n .default([]),\n \"post-install\": z.array(z.string().min(1)).optional().default([]),\n })\n .strict();\n\nfunction ensureInsideRoot(rootDir: string, relativeTarget: string): string {\n const resolved = path.resolve(rootDir, relativeTarget);\n const relative = path.relative(rootDir, resolved);\n if (!relative || relative.startsWith(\"..\") || path.isAbsolute(relative)) {\n throw new Error(`Unsafe destination path: ${relativeTarget}`);\n }\n return resolved;\n}\n\nfunction sourceLooksLikeUrl(source: string): boolean {\n try {\n const parsed = new URL(source);\n return parsed.protocol === \"http:\" || parsed.protocol === \"https:\";\n } catch {\n return false;\n }\n}\n\nfunction sourceLooksLikeRepoShorthand(source: string): boolean {\n const trimmed = source.trim().replace(/^https?:\\/\\//, \"\");\n return /^(github\\.com|gitlab\\.com)\\/[^/]+\\/[^/]+(?:\\.git)?\\/?$/.test(trimmed);\n}\n\nfunction parseRepoSource(source: string): {\n repoUrl: string;\n repoName: string;\n} {\n const withoutProtocol = source\n .trim()\n .replace(/^https?:\\/\\//, \"\")\n .replace(/\\/+$/, \"\");\n const match = withoutProtocol.match(/^(github\\.com|gitlab\\.com)\\/([^/]+)\\/([^/]+?)(?:\\.git)?$/);\n if (!match) {\n throw new Error(`Unsupported repository dependency source: ${source}`);\n }\n\n const host = match[1];\n const owner = match[2];\n const repo = match[3];\n return {\n repoUrl: `https://${host}/${owner}/${repo}.git`,\n repoName: repo,\n };\n}\n\nfunction deriveDestinationNameFromSource(source: string): string {\n if (sourceLooksLikeUrl(source)) {\n const parsed = new URL(source);\n const parts = parsed.pathname.split(\"/\").filter(Boolean);\n const leaf = parts[parts.length - 1];\n if (!leaf) {\n throw new Error(`Cannot derive dependency name from URL source: ${source}`);\n }\n return leaf;\n }\n\n if (sourceLooksLikeRepoShorthand(source)) {\n return parseRepoSource(source).repoName;\n }\n\n const leaf = path.basename(source);\n if (!leaf || leaf === \".\" || leaf === path.sep) {\n throw new Error(`Cannot derive dependency name from source: ${source}`);\n }\n return leaf;\n}\n\nexport function classifyDependencySource(source: string): \"url\" | \"repo\" | \"local\" {\n if (sourceLooksLikeUrl(source)) {\n return \"url\";\n }\n if (sourceLooksLikeRepoShorthand(source)) {\n return \"repo\";\n }\n return \"local\";\n}\n\nfunction parseConfigObject(raw: unknown): InstallerConfig {\n if (!raw || typeof raw !== \"object\" || Array.isArray(raw)) {\n throw new Error(\"Invalid skill-installer config: expected an object with top-level keys\");\n }\n\n const parsed = raw as Record<string, unknown>;\n if (typeof parsed[\"skill-installer\"] !== \"undefined\") {\n throw new Error(\n \"Invalid skill-installer config: do not nest under 'skill-installer:'. Use top-level 'pre-install', 'dependencies', and 'post-install'.\",\n );\n }\n\n if (Array.isArray(parsed.dependencies)) {\n const hasLegacyDependency = parsed.dependencies.some((entry) => {\n if (!entry || typeof entry !== \"object\" || Array.isArray(entry)) {\n return false;\n }\n const row = entry as Record<string, unknown>;\n return (\n typeof row.type !== \"undefined\" ||\n typeof row.url !== \"undefined\" ||\n typeof row.name !== \"undefined\"\n );\n });\n\n if (hasLegacyDependency) {\n throw new Error(\n \"Invalid skill-installer config: legacy dependency format detected. Use schemaVersion: 1 and the lean dependencies format from docs/proposed-skill-format.md.\",\n );\n }\n }\n\n const validated = installerConfigSchema.safeParse(parsed);\n if (!validated.success) {\n const reason = validated.error.issues.map((issue) => issue.message).join(\"; \");\n throw new Error(\n `Invalid skill-installer config: ${reason}. Use docs/proposed-skill-format.md as the source-of-truth for schemaVersion, dependencies, pre-install, and post-install.`,\n );\n }\n\n const normalized = validated.data;\n return {\n schemaVersion: 1,\n preInstall: normalized[\"pre-install\"],\n dependencies: normalized.dependencies.map((dep) =>\n typeof dep === \"string\" ? dep : { source: dep.source, path: dep.path },\n ),\n postInstall: normalized[\"post-install\"],\n };\n}\n\nfunction assertNoLegacyInstallerBlock(skillDir: string): void {\n const openAiYamlPath = path.join(skillDir, \"agents\", \"openai.yaml\");\n if (!fs.existsSync(openAiYamlPath) || !fs.statSync(openAiYamlPath).isFile()) {\n return;\n }\n\n const parsed = YAML.parse(fs.readFileSync(openAiYamlPath, \"utf8\")) as Record<\n string,\n unknown\n > | null;\n if (parsed && typeof parsed === \"object\" && typeof parsed[\"skill-installer\"] !== \"undefined\") {\n throw new Error(\n \"Legacy skill-installer config detected in agents/openai.yaml. Move it to skill-installer.yaml or skill-installer.json.\",\n );\n }\n}\n\nexport function loadInstallerConfig(skillDir: string): InstallerConfig {\n assertNoLegacyInstallerBlock(skillDir);\n\n const yamlPath = path.join(skillDir, \"skill-installer.yaml\");\n const jsonPath = path.join(skillDir, \"skill-installer.json\");\n const hasYaml = fs.existsSync(yamlPath) && fs.statSync(yamlPath).isFile();\n const hasJson = fs.existsSync(jsonPath) && fs.statSync(jsonPath).isFile();\n\n if (hasYaml && hasJson) {\n throw new Error(\n \"Both skill-installer.yaml and skill-installer.json exist. Keep only one installer config file.\",\n );\n }\n\n if (!hasYaml && !hasJson) {\n return {\n schemaVersion: 1,\n preInstall: [],\n dependencies: [],\n postInstall: [],\n };\n }\n\n if (hasYaml) {\n const parsed = YAML.parse(fs.readFileSync(yamlPath, \"utf8\"));\n return parseConfigObject(parsed);\n }\n\n const raw = JSON.parse(fs.readFileSync(jsonPath, \"utf8\")) as unknown;\n return parseConfigObject(raw);\n}\n\nfunction runHookPhase(\n phase: \"pre-install\" | \"post-install\",\n commands: string[],\n cwd: string,\n events: InstallerRuntimeEvent[],\n): void {\n for (const command of commands) {\n events.push({\n level: \"info\",\n message: `[skills] ${phase}: ${command}`,\n });\n const result = spawnSync(\"sh\", [\"-c\", command], {\n cwd,\n encoding: \"utf8\",\n stdio: \"pipe\",\n });\n\n if (result.status !== 0) {\n const message =\n (result.stderr || result.stdout || \"command failed\").trim().split(/\\r?\\n/)[0] ||\n \"command failed\";\n throw new Error(`${phase} command failed: ${command} (${message})`);\n }\n }\n}\n\nfunction resolveDependencySourceAndTarget(dep: Dependency): {\n source: string;\n targetPath: string;\n} {\n if (typeof dep === \"string\") {\n return {\n source: dep,\n targetPath: deriveDestinationNameFromSource(dep),\n };\n }\n\n return {\n source: dep.source,\n targetPath: dep.path,\n };\n}\n\nfunction runGitClone(repoUrl: string, targetDir: string): void {\n const result = spawnSync(\"git\", [\"clone\", \"--depth\", \"1\", repoUrl, targetDir], {\n encoding: \"utf8\",\n stdio: \"pipe\",\n });\n if (result.status !== 0) {\n const message =\n (result.stderr || result.stdout || \"git clone failed\").trim().split(/\\r?\\n/)[0] ||\n \"git clone failed\";\n throw new Error(`Repository dependency clone failed: ${repoUrl} (${message})`);\n }\n}\n\nasync function prepareDependency(\n source: string,\n targetPath: string,\n index: number,\n sourceCwd: string,\n stagingDir: string,\n policyMode: PolicyMode,\n events: InstallerRuntimeEvent[],\n): Promise<PreparedDependency> {\n const sourceKind = classifyDependencySource(source);\n\n if (sourceKind === \"local\") {\n const evaluation = evaluateInstallerLocalDependencyPolicy(\n {\n source,\n sourceRoot: sourceCwd,\n },\n policyMode,\n );\n if (!evaluation.ok) {\n const violation = \"violation\" in evaluation ? evaluation.violation : undefined;\n if (!violation) {\n throw new Error(`Dependency[${index}] policy evaluation failed for source: ${source}`);\n }\n if (violation.blocking) {\n throw new InstallerSecurityError(violation);\n }\n events.push({\n level: \"warning\",\n message: `[skills] ${violation.message}`,\n });\n }\n const sourcePath = evaluation.ok ? evaluation.resolvedPath : path.resolve(sourceCwd, source);\n if (!fs.existsSync(sourcePath)) {\n throw new Error(`Dependency[${index}] (local) source not found: ${source}`);\n }\n // Read access preflight; actual copy happens once during apply.\n fs.accessSync(sourcePath, fs.constants.R_OK);\n events.push({\n level: \"info\",\n message: `[skills] dependency[${index}] preflight-validated: ${source}`,\n });\n return {\n kind: \"local\",\n index,\n targetPath,\n sourcePath,\n sourceLabel: source,\n };\n }\n\n if (sourceKind === \"repo\") {\n const stagePath = ensureInsideRoot(\n stagingDir,\n `repo-${index}-${path.basename(targetPath).replace(/[^a-zA-Z0-9._-]/g, \"_\")}`,\n );\n const { repoUrl } = parseRepoSource(source);\n runGitClone(repoUrl, stagePath);\n events.push({\n level: \"info\",\n message: `[skills] dependency[${index}] staged: ${source}`,\n });\n return {\n kind: \"repo-staged\",\n index,\n targetPath,\n repoStagePath: stagePath,\n sourceLabel: source,\n };\n }\n\n const target = new URL(source);\n if (target.protocol !== \"http:\" && target.protocol !== \"https:\") {\n throw new Error(`Dependency[${index}] (remote) unsupported protocol: ${target.protocol}`);\n }\n\n const response = await fetch(target.toString());\n if (!response.ok) {\n throw new Error(\n `Dependency[${index}] (remote) download failed: ${response.status} ${response.statusText}`,\n );\n }\n\n const stagedFilePath = ensureInsideRoot(\n stagingDir,\n `remote-${index}-${path.basename(targetPath)}`,\n );\n fs.mkdirSync(path.dirname(stagedFilePath), { recursive: true });\n fs.writeFileSync(stagedFilePath, Buffer.from(await response.arrayBuffer()));\n events.push({\n level: \"info\",\n message: `[skills] dependency[${index}] staged: ${source}`,\n });\n return {\n kind: \"remote-bytes\",\n index,\n targetPath,\n remoteBufferPath: stagedFilePath,\n sourceLabel: source,\n };\n}\n\nexport async function prepareInstallerArtifacts(\n skillDir: string,\n sourceCwd: string,\n options: SkillInstallerRuntimeOptions = {},\n): Promise<PreparedInstallerArtifacts> {\n const config = loadInstallerConfig(skillDir);\n const sourceType = options.sourceType ?? \"local\";\n const allowHookCommands = options.allowHookCommands;\n const policyMode = options.policyMode ?? \"enforce\";\n\n const events: InstallerRuntimeEvent[] = [];\n if (config.preInstall.length > 0 || config.postInstall.length > 0) {\n if (allowHookCommands === false) {\n throw new Error(\n \"Blocked skill-installer hook commands by caller policy for pre/post install commands.\",\n );\n }\n const trustDecision = evaluateHookTrustPolicy({\n sourceType,\n trustWellKnown: Boolean(options.trustWellKnown),\n mode: policyMode,\n });\n if (!trustDecision.allowed && trustDecision.violation) {\n throw new InstallerPolicyError(trustDecision.violation);\n }\n if (trustDecision.allowed && trustDecision.violation?.severity === \"warning\") {\n events.push({\n level: \"warning\",\n message: `[skills] ${trustDecision.violation.message}`,\n });\n }\n }\n\n if (\n config.preInstall.length === 0 &&\n config.dependencies.length === 0 &&\n config.postInstall.length === 0\n ) {\n return {\n preInstall: [],\n postInstall: [],\n preparedDependencies: [],\n stagingDir: \"\",\n events,\n };\n }\n\n const stagingDir = fs.mkdtempSync(path.join(os.tmpdir(), \"skillspp-installer-stage-\"));\n const preparedDependencies: PreparedDependency[] = [];\n const seenTargetPaths = new Set<string>();\n\n try {\n for (let i = 0; i < config.dependencies.length; i += 1) {\n const dep = config.dependencies[i];\n const { source, targetPath } = resolveDependencySourceAndTarget(dep);\n\n const normalizedTarget = targetPath.replace(/\\\\/g, \"/\");\n if (seenTargetPaths.has(normalizedTarget)) {\n throw new Error(`Dependency[${i}] duplicate target path: ${targetPath}`);\n }\n seenTargetPaths.add(normalizedTarget);\n\n const destinationInSkill = ensureInsideRoot(skillDir, targetPath);\n if (fs.existsSync(destinationInSkill)) {\n throw new Error(\n `Dependency[${i}] destination already exists: ${path.relative(\n skillDir,\n destinationInSkill,\n )}`,\n );\n }\n\n const preparedDep = await prepareDependency(\n source,\n targetPath,\n i,\n sourceCwd,\n stagingDir,\n policyMode,\n events,\n );\n preparedDependencies.push(preparedDep);\n }\n\n return {\n preInstall: config.preInstall,\n postInstall: config.postInstall,\n preparedDependencies,\n stagingDir,\n events,\n };\n } catch (error) {\n fs.rmSync(stagingDir, { recursive: true, force: true });\n throw error;\n }\n}\n\nexport function cleanupPreparedInstallerArtifacts(prepared: PreparedInstallerArtifacts): void {\n if (prepared.stagingDir) {\n fs.rmSync(prepared.stagingDir, { recursive: true, force: true });\n }\n}\n\nexport async function applyInstallerArtifacts(\n installedSkillDir: string,\n prepared: PreparedInstallerArtifacts,\n): Promise<void> {\n if (\n prepared.preInstall.length === 0 &&\n prepared.postInstall.length === 0 &&\n prepared.preparedDependencies.length === 0\n ) {\n return;\n }\n\n runHookPhase(\"pre-install\", prepared.preInstall, installedSkillDir, prepared.events);\n\n for (const dep of prepared.preparedDependencies) {\n const destinationPath = ensureInsideRoot(installedSkillDir, dep.targetPath);\n if (fs.existsSync(destinationPath)) {\n throw new Error(\n `Dependency[${dep.index}] destination already exists: ${path.relative(\n installedSkillDir,\n destinationPath,\n )}`,\n );\n }\n\n fs.mkdirSync(path.dirname(destinationPath), { recursive: true });\n if (dep.kind === \"local\") {\n const stat = fs.statSync(dep.sourcePath);\n if (stat.isDirectory()) {\n fs.cpSync(dep.sourcePath, destinationPath, {\n recursive: true,\n force: false,\n errorOnExist: true,\n });\n } else {\n fs.copyFileSync(dep.sourcePath, destinationPath);\n }\n } else if (dep.kind === \"remote-bytes\") {\n fs.copyFileSync(dep.remoteBufferPath, destinationPath);\n } else {\n try {\n fs.renameSync(dep.repoStagePath, destinationPath);\n } catch (error: unknown) {\n const code =\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n typeof (error as { code?: unknown }).code === \"string\"\n ? (error as { code: string }).code\n : \"\";\n if (code !== \"EXDEV\") {\n throw error;\n }\n fs.cpSync(dep.repoStagePath, destinationPath, {\n recursive: true,\n force: false,\n errorOnExist: true,\n });\n }\n }\n\n prepared.events.push({\n level: \"info\",\n message: `[skills] dependency[${dep.index}] installed: ${dep.targetPath}`,\n });\n }\n\n runHookPhase(\"post-install\", prepared.postInstall, installedSkillDir, prepared.events);\n}\n\nexport async function runSkillInstaller(\n skillDir: string,\n sourceCwd: string,\n options: SkillInstallerRuntimeOptions = {},\n): Promise<void> {\n const prepared = await prepareInstallerArtifacts(skillDir, sourceCwd, options);\n try {\n await applyInstallerArtifacts(skillDir, prepared);\n } finally {\n cleanupPreparedInstallerArtifacts(prepared);\n }\n}\n", "import fs from \"node:fs\";\nimport path from \"node:path\";\n\nexport type InstallerSecuritySeverity = \"error\" | \"warning\";\n\nexport type InstallerSecurityViolation = {\n rule: \"installer-local-dependency-absolute-path\" | \"installer-local-dependency-path-escape\";\n message: string;\n severity: InstallerSecuritySeverity;\n blocking: boolean;\n};\n\nexport type InstallerSecurityEvaluationInput = {\n source: string;\n sourceRoot: string;\n};\n\nexport type InstallerSecurityEvaluationOptions = {\n // Reserved for Phase 6 policy controls.\n readonly policyMode?: \"fixed\";\n};\n\nexport type InstallerSecurityEvaluationResult =\n | {\n ok: true;\n resolvedPath: string;\n }\n | {\n ok: false;\n violation: InstallerSecurityViolation;\n };\n\nfunction isInsideRoot(rootDir: string, candidatePath: string): boolean {\n const relative = path.relative(rootDir, candidatePath);\n return Boolean(relative) && !relative.startsWith(\"..\") && !path.isAbsolute(relative);\n}\n\nfunction toEscapeViolation(source: string): InstallerSecurityViolation {\n return {\n rule: \"installer-local-dependency-path-escape\",\n message: `local dependency escapes source root: ${source}`,\n severity: \"error\",\n blocking: true,\n };\n}\n\nexport function evaluateInstallerLocalDependency(\n input: InstallerSecurityEvaluationInput,\n _options: InstallerSecurityEvaluationOptions = {},\n): InstallerSecurityEvaluationResult {\n if (path.isAbsolute(input.source)) {\n return {\n ok: false,\n violation: {\n rule: \"installer-local-dependency-absolute-path\",\n message: `absolute local dependency paths are not allowed: ${input.source}`,\n severity: \"error\",\n blocking: true,\n },\n };\n }\n\n const resolvedRoot = path.resolve(input.sourceRoot);\n const resolvedSourcePath = path.resolve(resolvedRoot, input.source);\n\n if (!isInsideRoot(resolvedRoot, resolvedSourcePath)) {\n return {\n ok: false,\n violation: toEscapeViolation(input.source),\n };\n }\n\n if (fs.existsSync(resolvedSourcePath)) {\n const realRoot = fs.realpathSync.native\n ? fs.realpathSync.native(resolvedRoot)\n : fs.realpathSync(resolvedRoot);\n const realSource = fs.realpathSync.native\n ? fs.realpathSync.native(resolvedSourcePath)\n : fs.realpathSync(resolvedSourcePath);\n if (!isInsideRoot(realRoot, realSource)) {\n return {\n ok: false,\n violation: toEscapeViolation(input.source),\n };\n }\n }\n\n return {\n ok: true,\n resolvedPath: resolvedSourcePath,\n };\n}\n", "import type { ParsedSource } from \"../contracts/runtime-types\";\nimport {\n evaluateInstallerLocalDependency as evaluateLocalDependencySecurity,\n type InstallerSecurityEvaluationResult,\n type InstallerSecurityViolation,\n} from \"./installer-security\";\n\nexport type PolicyMode = \"enforce\" | \"warn\";\n\nexport type PolicyViolation =\n | InstallerSecurityViolation\n | {\n rule: \"hook-trust-required\";\n message: string;\n severity: \"error\" | \"warning\";\n blocking: boolean;\n };\n\nexport type PolicyDecision = {\n allowed: boolean;\n violation?: PolicyViolation;\n};\n\nfunction applyMode(\n result: InstallerSecurityEvaluationResult,\n mode: PolicyMode,\n): InstallerSecurityEvaluationResult {\n if (mode === \"enforce\" || result.ok) {\n return result;\n }\n const violation = \"violation\" in result ? result.violation : undefined;\n if (!violation) {\n return result;\n }\n return {\n ok: false,\n violation: {\n ...violation,\n severity: \"warning\",\n blocking: false,\n },\n };\n}\n\nexport function evaluateInstallerLocalDependencyPolicy(\n input: { source: string; sourceRoot: string },\n mode: PolicyMode,\n): InstallerSecurityEvaluationResult {\n return applyMode(evaluateLocalDependencySecurity(input, { policyMode: \"fixed\" }), mode);\n}\n\nexport function evaluateHookTrustPolicy(input: {\n sourceType: ParsedSource[\"type\"];\n trustWellKnown: boolean;\n mode: PolicyMode;\n}): PolicyDecision {\n if (input.sourceType !== \"well-known\") {\n return { allowed: true };\n }\n\n if (input.trustWellKnown) {\n return { allowed: true };\n }\n\n if (input.mode === \"warn\") {\n return {\n allowed: true,\n violation: {\n rule: \"hook-trust-required\",\n message: \"Well-known hook commands are untrusted. Proceeding due to warning policy mode.\",\n severity: \"warning\",\n blocking: false,\n },\n };\n }\n\n return {\n allowed: false,\n violation: {\n rule: \"hook-trust-required\",\n message:\n \"Blocked skill-installer hook commands for well-known source. Trust this source explicitly or use warning policy mode.\",\n severity: \"error\",\n blocking: true,\n },\n };\n}\n", "export type CoreErrorCode =\n | `VALIDATION_${string}`\n | `SOURCE_${string}`\n | `INSTALL_${string}`\n | `POLICY_${string}`\n | `INTERNAL_${string}`;\n\nexport class CoreError extends Error {\n readonly code: CoreErrorCode;\n readonly details?: Record<string, unknown>;\n readonly cause?: unknown;\n\n constructor(input: {\n code: CoreErrorCode;\n message: string;\n details?: Record<string, unknown>;\n cause?: unknown;\n }) {\n super(input.message);\n this.name = \"CoreError\";\n this.code = input.code;\n this.details = input.details;\n this.cause = input.cause;\n }\n}\n", "import fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport type { AgentType, InstallMode, Plugin, Skill } from \"../contracts/runtime-types\";\nimport { getAgentPluginsDir, getAgentSkillsDir } from \"./agents\";\n\nexport type InstallOutcome = {\n skillName: string;\n canonicalDir: string;\n installedTo: Array<{ agent: AgentType; path: string; mode: InstallMode }>;\n};\n\nexport function sanitizeSkillName(name: string): string {\n const sanitized = name\n .toLowerCase()\n .replace(/[^a-z0-9._-]+/g, \"-\")\n .replace(/^[.-]+|[.-]+$/g, \"\");\n return sanitized || \"unnamed-skill\";\n}\n\nfunction ensureSafeInside(baseDir: string, target: string): void {\n const resolvedBase = path.resolve(baseDir);\n const resolvedTarget = path.resolve(target);\n if (\n !(resolvedTarget === resolvedBase || resolvedTarget.startsWith(`${resolvedBase}${path.sep}`))\n ) {\n throw new Error(`Unsafe path detected: ${target}`);\n }\n}\n\nexport function getCanonicalSkillsBaseDir(globalInstall: boolean, cwd: string): string {\n return globalInstall\n ? path.join(os.homedir(), \".config\", \"agents\", \"skills\")\n : path.join(cwd, \".agents\", \"skills\");\n}\n\nexport function getCanonicalPluginsBaseDir(globalInstall: boolean, cwd: string): string {\n return globalInstall\n ? path.join(os.homedir(), \".config\", \"agents\", \"plugins\", \"cache\")\n : path.join(cwd, \".agents\", \"plugins\", \"cache\");\n}\n\nfunction symlinkRelative(target: string, linkPath: string): void {\n const parent = path.dirname(linkPath);\n const relative = path.relative(parent, target);\n const symlinkType: fs.symlink.Type | undefined =\n process.platform === \"win32\" ? \"junction\" : undefined;\n fs.symlinkSync(relative, linkPath, symlinkType);\n}\n\nfunction installToAgent(\n itemName: string,\n canonicalDir: string,\n agent: AgentType,\n mode: InstallMode,\n globalInstall: boolean,\n cwd: string,\n resolveAgentBaseDir: (agent: AgentType, globalInstall: boolean, cwd: string) => string,\n): { agent: AgentType; path: string; mode: InstallMode } {\n const agentBase = resolveAgentBaseDir(agent, globalInstall, cwd);\n const agentDir = path.join(agentBase, itemName);\n\n fs.mkdirSync(agentBase, { recursive: true });\n ensureSafeInside(agentBase, agentDir);\n\n if (path.resolve(agentDir) === path.resolve(canonicalDir)) {\n return { agent, path: canonicalDir, mode };\n }\n\n if (mode === \"copy\") {\n fs.rmSync(agentDir, { recursive: true, force: true });\n fs.cpSync(canonicalDir, agentDir, { recursive: true, force: true });\n return { agent, path: agentDir, mode };\n }\n\n try {\n fs.rmSync(agentDir, { recursive: true, force: true });\n symlinkRelative(canonicalDir, agentDir);\n return { agent, path: agentDir, mode: \"symlink\" };\n } catch {\n fs.rmSync(agentDir, { recursive: true, force: true });\n fs.cpSync(canonicalDir, agentDir, { recursive: true, force: true });\n return { agent, path: agentDir, mode: \"copy\" };\n }\n}\n\nfunction installSkillToAgent(\n skillName: string,\n canonicalDir: string,\n agent: AgentType,\n mode: InstallMode,\n globalInstall: boolean,\n cwd: string,\n): { agent: AgentType; path: string; mode: InstallMode } {\n return installToAgent(\n skillName,\n canonicalDir,\n agent,\n mode,\n globalInstall,\n cwd,\n getAgentSkillsDir,\n );\n}\n\nfunction installPluginToAgent(\n pluginName: string,\n canonicalDir: string,\n agent: AgentType,\n mode: InstallMode,\n globalInstall: boolean,\n cwd: string,\n): { agent: AgentType; path: string; mode: InstallMode } {\n return installToAgent(\n pluginName,\n canonicalDir,\n agent,\n mode,\n globalInstall,\n cwd,\n getAgentPluginsDir,\n );\n}\n\nfunction installToCanonicalDir(\n sourcePath: string,\n itemName: string,\n canonicalBase: string,\n): string {\n const canonicalDir = path.join(canonicalBase, itemName);\n fs.mkdirSync(canonicalBase, { recursive: true });\n ensureSafeInside(canonicalBase, canonicalDir);\n fs.rmSync(canonicalDir, { recursive: true, force: true });\n fs.cpSync(sourcePath, canonicalDir, { recursive: true, force: true });\n return canonicalDir;\n}\n\nexport function installSkill(\n skill: Skill,\n agents: AgentType[],\n options: { mode: InstallMode; globalInstall: boolean; cwd: string },\n): InstallOutcome {\n if (agents.length === 0) {\n throw new Error(\"At least one target agent is required for installation.\");\n }\n\n const uniqueAgents = Array.from(new Set(agents));\n const skillName = sanitizeSkillName(skill.name);\n const canonicalAgent = uniqueAgents[0];\n const canonicalBase = getAgentSkillsDir(canonicalAgent, options.globalInstall, options.cwd);\n const canonicalDir = installToCanonicalDir(skill.path, skillName, canonicalBase);\n\n const installedTo = [\n { agent: canonicalAgent, path: canonicalDir, mode: options.mode },\n ...uniqueAgents\n .slice(1)\n .map((agent) =>\n installSkillToAgent(\n skillName,\n canonicalDir,\n agent,\n options.mode,\n options.globalInstall,\n options.cwd,\n ),\n ),\n ];\n\n return {\n skillName,\n canonicalDir,\n installedTo,\n };\n}\n\nexport function installPlugin(\n plugin: Plugin,\n agents: AgentType[],\n options: { mode: InstallMode; globalInstall: boolean; cwd: string },\n): InstallOutcome {\n if (agents.length === 0) {\n throw new Error(\"At least one target agent is required for installation.\");\n }\n\n const uniqueAgents = Array.from(new Set(agents));\n const pluginName = sanitizeSkillName(plugin.name);\n const canonicalAgent = uniqueAgents[0];\n const canonicalBase = getAgentPluginsDir(canonicalAgent, options.globalInstall, options.cwd);\n const canonicalDir = installToCanonicalDir(plugin.path, pluginName, canonicalBase);\n\n const installedTo = [\n { agent: canonicalAgent, path: canonicalDir, mode: options.mode },\n ...uniqueAgents\n .slice(1)\n .map((agent) =>\n installPluginToAgent(\n pluginName,\n canonicalDir,\n agent,\n options.mode,\n options.globalInstall,\n options.cwd,\n ),\n ),\n ];\n\n return {\n skillName: pluginName,\n canonicalDir,\n installedTo,\n };\n}\n", "import fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\nexport type PackageManager = \"npm\" | \"pnpm\" | \"yarn\" | \"bun\" | \"unknown\";\n\nexport type ScannerConflict = {\n skillName: string;\n winner: \"local\" | \"global\";\n};\n\nexport type TransitiveSkillCandidate = {\n skillName: string;\n skillDir: string;\n packageName: string;\n packageVersion: string;\n depth: number;\n};\n\nexport type TransitiveSkillConflict = {\n skillName: string;\n winner: TransitiveSkillCandidate;\n losers: TransitiveSkillCandidate[];\n};\n\nfunction listDirs(dir: string): string[] {\n if (!fs.existsSync(dir) || !fs.statSync(dir).isDirectory()) {\n return [];\n }\n return fs\n .readdirSync(dir, { withFileTypes: true })\n .filter((entry) => entry.isDirectory())\n .map((entry) => entry.name);\n}\n\nexport function detectLocalGlobalConflicts(cwd: string): ScannerConflict[] {\n const localDir = path.join(cwd, \".agents\", \"skills\");\n const globalDir = path.join(os.homedir(), \".config\", \"agents\", \"skills\");\n\n const local = new Set(listDirs(localDir));\n const global = new Set(listDirs(globalDir));\n const overlap = [...local].filter((name) => global.has(name));\n\n return overlap\n .sort((a, b) => a.localeCompare(b))\n .map((skillName) => ({\n skillName,\n winner: \"local\",\n }));\n}\n\nfunction readPackageMeta(packageDir: string): {\n name: string;\n version: string;\n} {\n const packageJson = path.join(packageDir, \"package.json\");\n if (!fs.existsSync(packageJson) || !fs.statSync(packageJson).isFile()) {\n return {\n name: path.basename(packageDir),\n version: \"0.0.0\",\n };\n }\n\n const parsed = JSON.parse(fs.readFileSync(packageJson, \"utf8\")) as {\n name?: string;\n version?: string;\n };\n return {\n name: parsed.name || path.basename(packageDir),\n version: parsed.version || \"0.0.0\",\n };\n}\n\nfunction collectSkillsFromPackage(\n packageDir: string,\n depth: number,\n out: TransitiveSkillCandidate[],\n): void {\n const meta = readPackageMeta(packageDir);\n const skillsDir = path.join(packageDir, \"skills\");\n\n if (fs.existsSync(skillsDir) && fs.statSync(skillsDir).isDirectory()) {\n for (const entry of fs.readdirSync(skillsDir, { withFileTypes: true })) {\n if (!entry.isDirectory()) {\n continue;\n }\n const skillDir = path.join(skillsDir, entry.name);\n const skillMd = path.join(skillDir, \"SKILL.md\");\n if (!fs.existsSync(skillMd) || !fs.statSync(skillMd).isFile()) {\n continue;\n }\n\n out.push({\n skillName: entry.name,\n skillDir,\n packageName: meta.name,\n packageVersion: meta.version,\n depth,\n });\n }\n }\n}\n\nfunction walkNodeModules(\n nodeModulesDir: string,\n depth: number,\n maxDepth: number,\n seen: Set<string>,\n out: TransitiveSkillCandidate[],\n): void {\n const resolvedNodeModules = path.resolve(nodeModulesDir);\n if (seen.has(resolvedNodeModules) || depth > maxDepth) {\n return;\n }\n seen.add(resolvedNodeModules);\n\n if (!fs.existsSync(resolvedNodeModules) || !fs.statSync(resolvedNodeModules).isDirectory()) {\n return;\n }\n\n for (const entry of fs.readdirSync(resolvedNodeModules, {\n withFileTypes: true,\n })) {\n if (!entry.isDirectory()) {\n continue;\n }\n\n if (entry.name.startsWith(\"@\")) {\n const scopeDir = path.join(resolvedNodeModules, entry.name);\n for (const scoped of fs.readdirSync(scopeDir, { withFileTypes: true })) {\n if (!scoped.isDirectory()) {\n continue;\n }\n const packageDir = path.join(scopeDir, scoped.name);\n collectSkillsFromPackage(packageDir, depth, out);\n walkNodeModules(path.join(packageDir, \"node_modules\"), depth + 1, maxDepth, seen, out);\n }\n continue;\n }\n\n const packageDir = path.join(resolvedNodeModules, entry.name);\n collectSkillsFromPackage(packageDir, depth, out);\n walkNodeModules(path.join(packageDir, \"node_modules\"), depth + 1, maxDepth, seen, out);\n }\n}\n\nexport function discoverTransitiveSkillCandidates(\n cwd: string,\n options: { maxDepth?: number } = {},\n): TransitiveSkillCandidate[] {\n const maxDepth = options.maxDepth ?? 8;\n const out: TransitiveSkillCandidate[] = [];\n const seen = new Set<string>();\n\n walkNodeModules(path.join(cwd, \"node_modules\"), 0, maxDepth, seen, out);\n\n return out.sort((a, b) => {\n if (a.skillName !== b.skillName) {\n return a.skillName.localeCompare(b.skillName);\n }\n if (a.depth !== b.depth) {\n return a.depth - b.depth;\n }\n if (a.packageName !== b.packageName) {\n return a.packageName.localeCompare(b.packageName);\n }\n if (a.packageVersion !== b.packageVersion) {\n return b.packageVersion.localeCompare(a.packageVersion);\n }\n return a.skillDir.localeCompare(b.skillDir);\n });\n}\n\nexport function detectTransitiveSkillConflicts(\n candidates: TransitiveSkillCandidate[],\n): TransitiveSkillConflict[] {\n const grouped = new Map<string, TransitiveSkillCandidate[]>();\n for (const candidate of candidates) {\n const rows = grouped.get(candidate.skillName) || [];\n rows.push(candidate);\n grouped.set(candidate.skillName, rows);\n }\n\n const conflicts: TransitiveSkillConflict[] = [];\n for (const [skillName, rows] of grouped) {\n if (rows.length <= 1) {\n continue;\n }\n\n const sorted = [...rows].sort((a, b) => {\n if (a.depth !== b.depth) {\n return a.depth - b.depth;\n }\n if (a.packageName !== b.packageName) {\n return a.packageName.localeCompare(b.packageName);\n }\n if (a.packageVersion !== b.packageVersion) {\n return b.packageVersion.localeCompare(a.packageVersion);\n }\n return a.skillDir.localeCompare(b.skillDir);\n });\n\n conflicts.push({\n skillName,\n winner: sorted[0],\n losers: sorted.slice(1),\n });\n }\n\n return conflicts.sort((a, b) => a.skillName.localeCompare(b.skillName));\n}\n", "import fs from \"node:fs\";\nimport path from \"node:path\";\nimport YAML from \"yaml\";\n\nexport type InstallerScaffoldFormat = \"json\" | \"yaml\";\n\ntype InstallerConfigState = {\n yamlPath: string;\n jsonPath: string;\n hasYaml: boolean;\n hasJson: boolean;\n missing: boolean;\n};\n\nfunction installerConfigSkeleton(): {\n schemaVersion: 1;\n dependencies: unknown[];\n \"pre-install\": string[];\n \"post-install\": string[];\n} {\n return {\n schemaVersion: 1,\n dependencies: [],\n \"pre-install\": [],\n \"post-install\": [],\n };\n}\n\nfunction isFile(filePath: string): boolean {\n return fs.existsSync(filePath) && fs.statSync(filePath).isFile();\n}\n\nexport function getInstallerConfigState(skillDir: string): InstallerConfigState {\n const yamlPath = path.join(skillDir, \"skill-installer.yaml\");\n const jsonPath = path.join(skillDir, \"skill-installer.json\");\n const hasYaml = isFile(yamlPath);\n const hasJson = isFile(jsonPath);\n\n if (hasYaml && hasJson) {\n throw new Error(\n \"Both skill-installer.yaml and skill-installer.json exist. Keep only one installer config file.\",\n );\n }\n\n return {\n yamlPath,\n jsonPath,\n hasYaml,\n hasJson,\n missing: !hasYaml && !hasJson,\n };\n}\n\nexport function listSkillsMissingInstallerConfig(skillDirs: string[]): string[] {\n return skillDirs.filter((skillDir) => getInstallerConfigState(skillDir).missing);\n}\n\nexport function scaffoldInstallerConfigFile(\n skillDir: string,\n format: InstallerScaffoldFormat,\n): { created: boolean; filePath?: string } {\n const state = getInstallerConfigState(skillDir);\n if (!state.missing) {\n return { created: false };\n }\n\n const content =\n format === \"yaml\"\n ? YAML.stringify(installerConfigSkeleton())\n : JSON.stringify(installerConfigSkeleton(), null, 2);\n const destinationPath = format === \"yaml\" ? state.yamlPath : state.jsonPath;\n fs.writeFileSync(destinationPath, `${content}\\n`, \"utf8\");\n return { created: true, filePath: destinationPath };\n}\n\nexport function scaffoldInstallerConfigForSkills(\n skillDirs: string[],\n format: InstallerScaffoldFormat,\n): string[] {\n const created: string[] = [];\n for (const skillDir of skillDirs) {\n const result = scaffoldInstallerConfigFile(skillDir, format);\n if (result.created && result.filePath) {\n created.push(result.filePath);\n }\n }\n return created;\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["fs", "os", "path", "fs", "path", "fs", "os", "path", "path", "fs", "os", "path", "fs", "path", "os", "DEFAULT_OPTIONS", "fs", "path", "SKIP_DIRS", "fs", "path", "path", "fs", "path", "fs", "path", "canonical", "matched", "fs", "path", "fs", "path", "SKIP_DIRS", "fs", "path", "fs", "SKIP_DIRS", "path", "fs", "path", "path", "fs", "path", "migrateHint", "resolveSourceMetadataIssue", "fs", "createRetainedCleanup", "toAsyncResult", "unwrapAsyncResult", "loadCachedSource", "resolveSafeRealPath", "path", "isLocalSymlinkSource", "buildRefreshedSourceMetadata", "canonical", "resolveCandidateFromCachedSource", "matched", "fs", "path", "os", "matter", "spawnSync", "fs", "os", "path", "YAML", "fs", "path", "path", "leaf", "fs", "YAML", "spawnSync", "os", "path", "fs", "os", "matter", "staged", "fs", "path", "path", "path", "fs", "fs", "os", "path", "packageDir", "fs", "path", "YAML", "resolveSafeRealPath", "fs", "path", "isLocalSymlinkSource", "os"]
7
+ }